From a18de7083f19373000f7463bb6e195e7f5032b1f Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 29 Jan 2020 16:47:24 -0700 Subject: [PATCH 001/136] DirtDyn: initial commit with rough skeleton code --- CMakeLists.txt | 3 +- modules/dirtdyn/CMakeLists.txt | 38 + modules/dirtdyn/README.md | 3 + modules/dirtdyn/src/DirtDyn.f90 | 848 ++++++ modules/dirtdyn/src/DirtDyn_Registry.txt | 106 + modules/dirtdyn/src/DirtDyn_Types.f90 | 2580 +++++++++++++++++ modules/dirtdyn/src/REDWINinterface.f90 | 281 ++ .../src/driver/.DirtDyn_Driver.f90.swp | Bin 0 -> 20480 bytes modules/dirtdyn/src/driver/DirtDyn_Driver.f90 | 127 + 9 files changed, 3985 insertions(+), 1 deletion(-) create mode 100644 modules/dirtdyn/CMakeLists.txt create mode 100644 modules/dirtdyn/README.md create mode 100644 modules/dirtdyn/src/DirtDyn.f90 create mode 100644 modules/dirtdyn/src/DirtDyn_Registry.txt create mode 100644 modules/dirtdyn/src/DirtDyn_Types.f90 create mode 100644 modules/dirtdyn/src/REDWINinterface.f90 create mode 100644 modules/dirtdyn/src/driver/.DirtDyn_Driver.f90.swp create mode 100644 modules/dirtdyn/src/driver/DirtDyn_Driver.f90 diff --git a/CMakeLists.txt b/CMakeLists.txt index 9ca797381..645a81fac 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -88,6 +88,7 @@ set(OPENFAST_MODULES aerodyn aerodyn14 servodyn + dirtdyn elastodyn beamdyn subdyn @@ -169,4 +170,4 @@ endif() option(BUILD_DOCUMENTATION "Build documentation." OFF) if(BUILD_DOCUMENTATION) add_subdirectory(docs) -endif() \ No newline at end of file +endif() diff --git a/modules/dirtdyn/CMakeLists.txt b/modules/dirtdyn/CMakeLists.txt new file mode 100644 index 000000000..b3a548807 --- /dev/null +++ b/modules/dirtdyn/CMakeLists.txt @@ -0,0 +1,38 @@ +# +# Copyright 2016 National Renewable Energy Laboratory +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +if (GENERATE_TYPES) + generate_f90_types(src/DirtDyn_Registry.txt ${CMAKE_CURRENT_LIST_DIR}/src/DirtDyn_Types.f90) +endif() + +set(DD_SOURCES + src/REDWINinterface.f90 + src/DirtDyn.f90 + src/DirtDyn_Types.f90 +) + +add_library(dirtdynlib ${DD_SOURCES}) +target_link_libraries(dirtdynlib nwtclibs) + +add_executable(dirtdyn_driver src/driver/DirtDyn_Driver.f90) +target_link_libraries(dirtdyn_driver dirtdynlib nwtclibs ${CMAKE_DL_LIBS}) + + +install(TARGETS dirtdynlib dirtdyn_driver + EXPORT "${CMAKE_PROJECT_NAME}Libraries" + RUNTIME DESTINATION bin + LIBRARY DESTINATION lib + ARCHIVE DESTINATION lib) diff --git a/modules/dirtdyn/README.md b/modules/dirtdyn/README.md new file mode 100644 index 000000000..10950cb33 --- /dev/null +++ b/modules/dirtdyn/README.md @@ -0,0 +1,3 @@ +# OpenFAST DirtDyn Module + +This directory contains the module DirtDyn. This module models the soil structure interface, and can be coupled to external DLL such as RedWin. diff --git a/modules/dirtdyn/src/DirtDyn.f90 b/modules/dirtdyn/src/DirtDyn.f90 new file mode 100644 index 000000000..d858d980b --- /dev/null +++ b/modules/dirtdyn/src/DirtDyn.f90 @@ -0,0 +1,848 @@ +!********************************************************************************************************************************** +!> ## DirtDyn +!! The DirtDyn and DirtDyn_Types modules make up a template for creating user-defined calculations in the FAST Modularization +!! Framework. DirtDyn_Types will be auto-generated by the FAST registry program, based on the variables specified in the +!! DirtDyn_Registry.txt file. +!! +!! This template file contains comments in the style required for Doxygen, and it contains methods for handling errors. +!! +!! "DirtDyn" should be replaced with the name of your module. Example: ElastoDyn \n +!! "DirtDyn" (in DirtDyn_*) should be replaced with the module name or an abbreviation of it. Example: ED +! .................................................................................................................................. +!! ## LICENSING +!! Copyright (C) 2012-2013, 2015-2016 National Renewable Energy Laboratory +!! +!! This file is part of DirtDyn. +!! +!! Licensed under the Apache License, Version 2.0 (the "License"); +!! you may not use this file except in compliance with the License. +!! You may obtain a copy of the License at +!! +!! http://www.apache.org/licenses/LICENSE-2.0 +!! +!! Unless required by applicable law or agreed to in writing, software +!! distributed under the License is distributed on an "AS IS" BASIS, +!! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +!! See the License for the specific language governing permissions and +!! limitations under the License. +!********************************************************************************************************************************** +MODULE DirtDyn + + USE DirtDyn_Types + USE NWTC_Library + + IMPLICIT NONE + + PRIVATE + + TYPE(ProgDesc), PARAMETER :: DirtDyn_Ver = ProgDesc( 'DirtDyn', 'v0.01.00', '99-Feb-2020' ) !< module date/version information + + + ! ..... Public Subroutines ................................................................................................... + + PUBLIC :: DirtDyn_Init ! Initialization routine + PUBLIC :: DirtDyn_End ! Ending routine (includes clean up) + + PUBLIC :: DirtDyn_UpdateStates ! Loose coupling routine for solving for constraint states, integrating + ! continuous states, and updating discrete states + PUBLIC :: DirtDyn_CalcOutput ! Routine for computing outputs + +!!! PUBLIC :: DirtDyn_CalcConstrStateResidual ! Tight coupling routine for returning the constraint state residual +!!! PUBLIC :: DirtDyn_CalcContStateDeriv ! Tight coupling routine for computing derivatives of continuous states +!!! PUBLIC :: DirtDyn_UpdateDiscState ! Tight coupling routine for updating discrete states +!!! +!!! PUBLIC :: DirtDyn_JacobianPInput ! Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- +!!! ! (Xd), and constraint-state (Z) functions all with respect to the inputs (u) +!!! PUBLIC :: DirtDyn_JacobianPContState ! Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- +!!! ! (Xd), and constraint-state (Z) functions all with respect to the continuous +!!! ! states (x) +!!! PUBLIC :: DirtDyn_JacobianPDiscState ! Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- +!!! ! (Xd), and constraint-state (Z) functions all with respect to the discrete +!!! ! states (xd) +!!! PUBLIC :: DirtDyn_JacobianPConstrState ! Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- +!!! ! (Xd), and constraint-state (Z) functions all with respect to the constraint +!!! ! states (z) +!!! +!!! PUBLIC :: DirtDyn_GetOP ! Routine to get the operating-point values for linearization (from data structures to arrays) + +contains + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +!> This routine is called at the start of the simulation to perform initialization steps. +!! The parameters are set here and not changed during the simulation. +!! The initial states and initial guess for the input are defined. +subroutine DirtDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOut, ErrStat, ErrMsg ) +!.................................................................................................................................. + + type(DirtD_InitInputType), intent(in ) :: InitInp !< Input data for initialization routine + type(DirtD_InputType), intent( out) :: u !< An initial guess for the input; input mesh must be defined + type(DirtD_ParameterType), intent( out) :: p !< Parameters + type(DirtD_ContinuousStateType), intent( out) :: x !< Initial continuous states + type(DirtD_DiscreteStateType), intent( out) :: xd !< Initial discrete states + type(DirtD_ConstraintStateType), intent( out) :: z !< Initial guess of the constraint states + type(DirtD_OtherStateType), intent( out) :: OtherState !< Initial other states (logical, etc) + type(DirtD_OutputType), intent( out) :: y !< Initial system outputs (outputs are not calculated; + !! only the output mesh is initialized) + type(DirtD_MiscVarType), intent( out) :: m !< Misc variables for optimization (not copied in glue code) + real(DbKi), intent(inout) :: Interval !< Coupling interval in seconds: the rate that + !! (1) DirtDyn_UpdateStates() is called in loose coupling & + !! (2) DirtDyn_UpdateDiscState() is called in tight coupling. + !! Input is the suggested time from the glue code; + !! Output is the actual coupling interval that will be used + !! by the glue code. + type(DirtD_InitOutputType), intent( out) :: InitOut !< Output for initialization routine + integer(IntKi), intent( out) :: ErrStat !< Error status of the operation + character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + ! local variables + integer(IntKi) :: NumOuts ! number of outputs; would probably be in the parameter type + integer(IntKi) :: ErrStat2 ! local error status + character(ErrMsgLen) :: ErrMsg2 ! local error message + character(*), parameter :: RoutineName = 'DirtDyn_Init' + + ! Initialize variables + ErrStat = ErrID_None + ErrMsg = "" + NumOuts = 2 + + + ! Initialize the NWTC Subroutine Library + call NWTC_Init( ) + + ! Display the module information + call DispNVD( DirtDyn_Ver ) + + + ! Define parameters here: + p%DT = Interval + + + ! Define initial system states here: + x%DummyContState = 0.0_ReKi + xd%DummyDiscState = 0.0_ReKi + z%DummyConstrState = 0.0_ReKi + OtherState%DummyOtherState = 0.0_ReKi + + + ! Define optimization variables here: +! m%DummyMiscVar = 0.0_ReKi + + + ! Define initial guess for the system inputs here: + u%DummyInput = 0.0_ReKi + + + ! Define system output initializations (set up mesh) here: + call AllocAry( y%WriteOutput, NumOuts, 'WriteOutput', ErrStat2, ErrMsg2 ) + call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) ! set return error status based on local (concatenate errors) + if (ErrStat >= AbortErrLev) return ! if there are local variables that need to be deallocated, do so before early return + + y%DummyOutput = 0 + y%WriteOutput = 0 + + + ! Define initialization-routine output here: + call AllocAry(InitOut%WriteOutputHdr,NumOuts,'WriteOutputHdr',ErrStat2,ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + call AllocAry(InitOut%WriteOutputUnt,NumOuts,'WriteOutputUnt',ErrStat2,ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + if (ErrStat >= AbortErrLev) return ! if there are local variables that need to be deallocated, do so before early return + + InitOut%WriteOutputHdr = (/ 'Time ', 'Column2' /) + InitOut%WriteOutputUnt = (/ '(s)', '(-)' /) + + + ! If you want to choose your own rate instead of using what the glue code suggests, tell the glue code the rate at which + ! this module must be called here: + + !Interval = p%DT + + + if (InitInp%Linearize) then + + ! If the module does not implement the four Jacobian routines at the end of this template, or the module cannot + ! linearize with the features that are enabled, stop the simulation if InitInp%Linearize is true. + + CALL SetErrStat( ErrID_Fatal, 'DirtDyn cannot perform linearization analysis.', ErrStat, ErrMsg, RoutineName) + + ! Otherwise, if the module does allow linearization, return the appropriate Jacobian row/column names and rotating-frame flags here: + ! Allocate and set these variables: InitOut%LinNames_y, InitOut%LinNames_x, InitOut%LinNames_xd, InitOut%LinNames_z, InitOut%LinNames_u + ! Allocate and set these variables: InitOut%RotFrame_y, InitOut%RotFrame_x, InitOut%RotFrame_xd, InitOut%RotFrame_z, InitOut%RotFrame_u + + end if + + +end subroutine DirtDyn_Init +!---------------------------------------------------------------------------------------------------------------------------------- +!> This routine is called at the end of the simulation. +subroutine DirtDyn_End( u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) +!.................................................................................................................................. + + type(DirtD_InputType), intent(inout) :: u !< System inputs + type(DirtD_ParameterType), intent(inout) :: p !< Parameters + type(DirtD_ContinuousStateType), intent(inout) :: x !< Continuous states + type(DirtD_DiscreteStateType), intent(inout) :: xd !< Discrete states + type(DirtD_ConstraintStateType), intent(inout) :: z !< Constraint states + type(DirtD_OtherStateType), intent(inout) :: OtherState !< Other states + type(DirtD_OutputType), intent(inout) :: y !< System outputs + type(DirtD_MiscVarType), intent(inout) :: m !< Misc variables for optimization (not copied in glue code) + integer(IntKi), intent( out) :: ErrStat !< Error status of the operation + character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + ! local variables + integer(IntKi) :: ErrStat2 ! local error status + character(ErrMsgLen) :: ErrMsg2 ! local error message + character(*), parameter :: RoutineName = 'DirtDyn_End' + + ! Initialize ErrStat + + ErrStat = ErrID_None + ErrMsg = "" + + + !! Place any last minute operations or calculations here: + + + !! Close files here (but because of checkpoint-restart capability, it is not recommended to have files open during the simulation): + + + !! Destroy the input data: + + call DirtD_DestroyInput( u, ErrStat2, ErrMsg2 ) + call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + + + !! Destroy the parameter data: + + call DirtD_DestroyParam( p, ErrStat2, ErrMsg2 ) + call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + + !! Destroy the state data: + + call DirtD_DestroyContState( x, ErrStat2,ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + call DirtD_DestroyDiscState( xd, ErrStat2,ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + call DirtD_DestroyConstrState( z, ErrStat2,ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + call DirtD_DestroyOtherState( OtherState, ErrStat2,ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + + + !! Destroy the output data: + + call DirtD_DestroyOutput( y, ErrStat2, ErrMsg2 ); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + + + !! Destroy the misc data: + + call DirtD_DestroyMisc( m, ErrStat2, ErrMsg2 ); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + + +end subroutine DirtDyn_End +!---------------------------------------------------------------------------------------------------------------------------------- +!> This is a loose coupling routine for solving constraint states, integrating continuous states, and updating discrete and other +!! states. Continuous, constraint, discrete, and other states are updated to values at t + Interval. +subroutine DirtDyn_UpdateStates( t, n, Inputs, InputTimes, p, x, xd, z, OtherState, m, ErrStat, ErrMsg ) +!.................................................................................................................................. + + real(DbKi), intent(in ) :: t !< Current simulation time in seconds + integer(IntKi), intent(in ) :: n !< Current step of the simulation: t = n*Interval + type(DirtD_InputType), intent(inout) :: Inputs(:) !< Inputs at InputTimes (output from this routine only + !! because of record keeping in routines that copy meshes) + real(DbKi), intent(in ) :: InputTimes(:) !< Times in seconds associated with Inputs + type(DirtD_ParameterType), intent(in ) :: p !< Parameters + type(DirtD_ContinuousStateType), intent(inout) :: x !< Input: Continuous states at t; + !! Output: Continuous states at t + Interval + type(DirtD_DiscreteStateType), intent(inout) :: xd !< Input: Discrete states at t; + !! Output: Discrete states at t + Interval + type(DirtD_ConstraintStateType), intent(inout) :: z !< Input: Constraint states at t; + !! Output: Constraint states at t + Interval + type(DirtD_OtherStateType), intent(inout) :: OtherState !< Other states: Other states at t; + !! Output: Other states at t + Interval + type(DirtD_MiscVarType), intent(inout) :: m !< Misc variables for optimization (not copied in glue code) + integer(IntKi), intent( out) :: ErrStat !< Error status of the operation + character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + ! Local variables + type(DirtD_ContinuousStateType) :: dxdt ! Continuous state derivatives at t + type(DirtD_DiscreteStateType) :: xd_t ! Discrete states at t (copy) + type(DirtD_ConstraintStateType) :: z_Residual ! Residual of the constraint state functions (Z) + type(DirtD_InputType) :: u ! Instantaneous inputs + + integer(IntKi) :: ErrStat2 ! local error status + character(ErrMsgLen) :: ErrMsg2 ! local error message + character(*), parameter :: RoutineName = 'DirtDyn_UpdateStates' + + + ! Initialize variables + ErrStat = ErrID_None ! no error has occurred + ErrMsg = "" + + + ! This subroutine contains an example of how the states could be updated. Developers will + ! want to adjust the logic as necessary for their own situations. + + + + ! Get the inputs at time t, based on the array of values sent by the glue code: + + ! before calling ExtrapInterp routine, memory in u must be allocated; we can do that with a copy: + call DirtD_CopyInput( Inputs(1), u, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) + call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + if ( ErrStat >= AbortErrLev ) then + call cleanup() ! to avoid memory leaks, we have to destroy the local variables that may have allocatable arrays or meshes + return + end if + + call DirtD_Input_ExtrapInterp( Inputs, InputTimes, u, t, ErrStat2, ErrMsg2 ) + call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + if ( ErrStat >= AbortErrLev ) then + call cleanup() + return + end if + + + +! ! Get first time derivatives of continuous states (dxdt): +! +! call DirtDyn_CalcContStateDeriv( t, u, p, x, xd, z, OtherState, m, dxdt, ErrStat2, ErrMsg2 ) +! call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) +! if ( ErrStat >= AbortErrLev ) then +! call cleanup() +! return +! end if +! +! +! ! Update discrete states: +! ! Note that xd [discrete state] is changed in DirtDyn_UpdateDiscState() so xd will now contain values at t+Interval +! ! We'll first make a copy that contains xd at time t, which will be used in computing the constraint states +! call DirtDyn_CopyDiscState( xd, xd_t, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) +! call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) +! if ( ErrStat >= AbortErrLev ) then +! call cleanup() +! return +! end if +! +! call DirtDyn_UpdateDiscState( t, n, u, p, x, xd, z, OtherState, m, ErrStat2, ErrMsg2 ) +! call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) +! if ( ErrStat >= AbortErrLev ) then +! call cleanup() +! return +! end if +! +! +! ! Solve for the constraint states (z) here: +! +! ! Iterate until the value is within a given tolerance. +! +! ! DO +! +! call DirtDyn_CalcConstrStateResidual( t, u, p, x, xd_t, z, OtherState, m, Z_Residual, ErrStat2, ErrMsg2 ) +! call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) +! if ( ErrStat >= AbortErrLev ) then +! call cleanup() +! return +! end if +! +! ! z = +! +! ! END DO + + + + ! Integrate (update) continuous states (x) here: + + !x = function of dxdt and x + + + ! Destroy local variables before returning + call cleanup() + + +contains + subroutine cleanup() + ! note that this routine inherits all of the data in DirtDyn_UpdateStates + + + call DirtD_DestroyInput( u, ErrStat2, ErrMsg2) + call DirtD_DestroyConstrState( Z_Residual, ErrStat2, ErrMsg2) + call DirtD_DestroyContState( dxdt, ErrStat2, ErrMsg2) + call DirtD_DestroyDiscState( xd_t, ErrStat2, ErrMsg2) + + end subroutine cleanup +end subroutine DirtDyn_UpdateStates +!---------------------------------------------------------------------------------------------------------------------------------- +!> This is a routine for computing outputs, used in both loose and tight coupling. +subroutine DirtDyn_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) +!.................................................................................................................................. + + real(DbKi), intent(in ) :: t !< Current simulation time in seconds + type(DirtD_InputType), intent(in ) :: u !< Inputs at t + type(DirtD_ParameterType), intent(in ) :: p !< Parameters + type(DirtD_ContinuousStateType), intent(in ) :: x !< Continuous states at t + type(DirtD_DiscreteStateType), intent(in ) :: xd !< Discrete states at t + type(DirtD_ConstraintStateType), intent(in ) :: z !< Constraint states at t + type(DirtD_OtherStateType), intent(in ) :: OtherState !< Other states at t + type(DirtD_MiscVarType), intent(inout) :: m !< Misc variables for optimization (not copied in glue code) + type(DirtD_OutputType), intent(inout) :: y !< Outputs computed at t (Input only so that mesh con- + !! nectivity information does not have to be recalculated) + integer(IntKi), intent( out) :: ErrStat !< Error status of the operation + character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + + ! Initialize ErrStat + + ErrStat = ErrID_None + ErrMsg = "" + + + ! Compute outputs here: + y%DummyOutput = 2.0_ReKi + + y%WriteOutput(1) = REAL(t,ReKi) + y%WriteOutput(2) = 1.0_ReKi + + +end subroutine DirtDyn_CalcOutput +!---------------------------------------------------------------------------------------------------------------------------------- + + +!!!!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +!!!!> This is a tight coupling routine for computing derivatives of continuous states. +!!!SUBROUTINE DirtDyn_CalcContStateDeriv( t, u, p, x, xd, z, OtherState, m, dxdt, ErrStat, ErrMsg ) +!!!!.................................................................................................................................. +!!! +!!! REAL(DbKi), INTENT(IN ) :: t !< Current simulation time in seconds +!!! TYPE(DirtD_InputType), INTENT(IN ) :: u !< Inputs at t +!!! TYPE(DirtD_ParameterType), INTENT(IN ) :: p !< Parameters +!!! TYPE(DirtD_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at t +!!! TYPE(DirtD_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at t +!!! TYPE(DirtD_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at t +!!! TYPE(DirtD_OtherStateType), INTENT(IN ) :: OtherState !< Other states at t +!!! TYPE(DirtD_MiscVarType), INTENT(INOUT) :: m !< Misc variables for optimization (not copied in glue code) +!!! TYPE(DirtD_ContinuousStateType), INTENT( OUT) :: dxdt !< Continuous state derivatives at t +!!! INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation +!!! CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None +!!! +!!! +!!! ! Initialize ErrStat +!!! +!!! ErrStat = ErrID_None +!!! ErrMsg = "" +!!! +!!! +!!! ! Compute the first time derivatives of the continuous states here: +!!! +!!! dxdt%DummyContState = 0.0_ReKi +!!! +!!!END SUBROUTINE DirtDyn_CalcContStateDeriv +!!!!---------------------------------------------------------------------------------------------------------------------------------- +!!!!> This is a tight coupling routine for updating discrete states. +!!!SUBROUTINE DirtDyn_UpdateDiscState( t, n, u, p, x, xd, z, OtherState, m, ErrStat, ErrMsg ) +!!!!.................................................................................................................................. +!!! +!!! REAL(DbKi), INTENT(IN ) :: t !< Current simulation time in seconds +!!! INTEGER(IntKi), INTENT(IN ) :: n !< Current step of the simulation: t = n*Interval +!!! TYPE(DirtD_InputType), INTENT(IN ) :: u !< Inputs at t +!!! TYPE(DirtD_ParameterType), INTENT(IN ) :: p !< Parameters +!!! TYPE(DirtD_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at t +!!! TYPE(DirtD_DiscreteStateType), INTENT(INOUT) :: xd !< Input: Discrete states at t; +!!! !! Output: Discrete states at t + Interval +!!! TYPE(DirtD_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at t +!!! TYPE(DirtD_OtherStateType), INTENT(IN ) :: OtherState !< Other states at t +!!! TYPE(DirtD_MiscVarType), INTENT(INOUT) :: m !< Misc variables for optimization (not copied in glue code) +!!! INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation +!!! CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None +!!! +!!! +!!! ! Initialize ErrStat +!!! +!!! ErrStat = ErrID_None +!!! ErrMsg = "" +!!! +!!! +!!! ! Update discrete states here: +!!! +!!! xd%DummyDiscState = 0.0_Reki +!!! +!!!END SUBROUTINE DirtDyn_UpdateDiscState +!!!!---------------------------------------------------------------------------------------------------------------------------------- +!!!!> This is a tight coupling routine for solving for the residual of the constraint state functions. +!!!SUBROUTINE DirtDyn_CalcConstrStateResidual( t, u, p, x, xd, z, OtherState, m, Z_residual, ErrStat, ErrMsg ) +!!!!.................................................................................................................................. +!!! +!!! REAL(DbKi), INTENT(IN ) :: t !< Current simulation time in seconds +!!! TYPE(DirtD_InputType), INTENT(IN ) :: u !< Inputs at t +!!! TYPE(DirtD_ParameterType), INTENT(IN ) :: p !< Parameters +!!! TYPE(DirtD_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at t +!!! TYPE(DirtD_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at t +!!! TYPE(DirtD_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at t (possibly a guess) +!!! TYPE(DirtD_OtherStateType), INTENT(IN ) :: OtherState !< Other states at t +!!! TYPE(DirtD_MiscVarType), INTENT(INOUT) :: m !< Misc variables for optimization (not copied in glue code) +!!! TYPE(DirtD_ConstraintStateType), INTENT( OUT) :: Z_residual !< Residual of the constraint state functions using +!!! !! the input values described above +!!! INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation +!!! CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None +!!! +!!! +!!! ! Initialize ErrStat +!!! +!!! ErrStat = ErrID_None +!!! ErrMsg = "" +!!! +!!! +!!! ! Solve for the residual of the constraint state functions here: +!!! +!!! Z_residual%DummyConstrState = 0.0_ReKi +!!! +!!!END SUBROUTINE DirtDyn_CalcConstrStateResidual +!!!!---------------------------------------------------------------------------------------------------------------------------------- +!!! +!!! +!!!!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +!!!! ###### The following four routines are Jacobian routines for linearization capabilities ####### +!!!! If the module does not implement them, set ErrStat = ErrID_Fatal in DirtDyn_Init() when InitInp%Linearize is .true. +!!!!---------------------------------------------------------------------------------------------------------------------------------- +!!!!> Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions +!!!!! with respect to the inputs (u). The partial derivatives dY/du, dX/du, dXd/du, and DZ/du are returned. +!!!SUBROUTINE DirtDyn_JacobianPInput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdu, dXdu, dXddu, dZdu) +!!!!.................................................................................................................................. +!!! +!!! REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point +!!! TYPE(DirtD_InputType), INTENT(IN ) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) +!!! TYPE(DirtD_ParameterType), INTENT(IN ) :: p !< Parameters +!!! TYPE(DirtD_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at operating point +!!! TYPE(DirtD_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at operating point +!!! TYPE(DirtD_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at operating point +!!! TYPE(DirtD_OtherStateType), INTENT(IN ) :: OtherState !< Other states at operating point +!!! TYPE(DirtD_OutputType), INTENT(IN ) :: y !< Output (change to inout if a mesh copy is required); +!!! !! Output fields are not used by this routine, but type is +!!! !! available here so that mesh parameter information (i.e., +!!! !! connectivity) does not have to be recalculated for dYdu. +!!! TYPE(DirtD_MiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables +!!! INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation +!!! CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None +!!! REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dYdu(:,:) !< Partial derivatives of output functions (Y) with respect +!!! !! to the inputs (u) [intent in to avoid deallocation] +!!! REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXdu(:,:) !< Partial derivatives of continuous state functions (X) with +!!! !! respect to the inputs (u) [intent in to avoid deallocation] +!!! REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXddu(:,:) !< Partial derivatives of discrete state functions (Xd) with +!!! !! respect to the inputs (u) [intent in to avoid deallocation] +!!! REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dZdu(:,:) !< Partial derivatives of constraint state functions (Z) with +!!! !! respect to the inputs (u) [intent in to avoid deallocation] +!!! +!!! +!!! ! Initialize ErrStat +!!! +!!! ErrStat = ErrID_None +!!! ErrMsg = '' +!!! +!!! +!!! IF ( PRESENT( dYdu ) ) THEN +!!! +!!! ! Calculate the partial derivative of the output functions (Y) with respect to the inputs (u) here: +!!! +!!! ! allocate and set dYdu +!!! +!!! END IF +!!! +!!! IF ( PRESENT( dXdu ) ) THEN +!!! +!!! ! Calculate the partial derivative of the continuous state functions (X) with respect to the inputs (u) here: +!!! +!!! ! allocate and set dXdu +!!! +!!! END IF +!!! +!!! IF ( PRESENT( dXddu ) ) THEN +!!! +!!! ! Calculate the partial derivative of the discrete state functions (Xd) with respect to the inputs (u) here: +!!! +!!! ! allocate and set dXddu +!!! +!!! END IF +!!! +!!! IF ( PRESENT( dZdu ) ) THEN +!!! +!!! ! Calculate the partial derivative of the constraint state functions (Z) with respect to the inputs (u) here: +!!! +!!! ! allocate and set dZdu +!!! +!!! END IF +!!! +!!! +!!!END SUBROUTINE DirtDyn_JacobianPInput +!!!!---------------------------------------------------------------------------------------------------------------------------------- +!!!!> Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions +!!!!! with respect to the continuous states (x). The partial derivatives dY/dx, dX/dx, dXd/dx, and DZ/dx are returned. +!!!SUBROUTINE DirtDyn_JacobianPContState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdx, dXdx, dXddx, dZdx ) +!!!!.................................................................................................................................. +!!! +!!! REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point +!!! TYPE(DirtD_InputType), INTENT(IN ) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) +!!! TYPE(DirtD_ParameterType), INTENT(IN ) :: p !< Parameters +!!! TYPE(DirtD_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at operating point +!!! TYPE(DirtD_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at operating point +!!! TYPE(DirtD_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at operating point +!!! TYPE(DirtD_OtherStateType), INTENT(IN ) :: OtherState !< Other states at operating point +!!! TYPE(DirtD_OutputType), INTENT(IN ) :: y !< Output (change to inout if a mesh copy is required); +!!! !! Output fields are not used by this routine, but type is +!!! !! available here so that mesh parameter information (i.e., +!!! !! connectivity) does not have to be recalculated for dYdx. +!!! TYPE(DirtD_MiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables +!!! INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation +!!! CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None +!!! REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dYdx(:,:) !< Partial derivatives of output functions +!!! !! (Y) with respect to the continuous +!!! !! states (x) [intent in to avoid deallocation] +!!! REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXdx(:,:) !< Partial derivatives of continuous state +!!! !! functions (X) with respect to +!!! !! the continuous states (x) [intent in to avoid deallocation] +!!! REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXddx(:,:) !< Partial derivatives of discrete state +!!! !! functions (Xd) with respect to +!!! !! the continuous states (x) [intent in to avoid deallocation] +!!! REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dZdx(:,:) !< Partial derivatives of constraint state +!!! !! functions (Z) with respect to +!!! !! the continuous states (x) [intent in to avoid deallocation] +!!! +!!! +!!! ! Initialize ErrStat +!!! +!!! ErrStat = ErrID_None +!!! ErrMsg = '' +!!! +!!! +!!! +!!! IF ( PRESENT( dYdx ) ) THEN +!!! +!!! ! Calculate the partial derivative of the output functions (Y) with respect to the continuous states (x) here: +!!! +!!! ! allocate and set dYdx +!!! +!!! END IF +!!! +!!! IF ( PRESENT( dXdx ) ) THEN +!!! +!!! ! Calculate the partial derivative of the continuous state functions (X) with respect to the continuous states (x) here: +!!! +!!! ! allocate and set dXdx +!!! +!!! END IF +!!! +!!! IF ( PRESENT( dXddx ) ) THEN +!!! +!!! ! Calculate the partial derivative of the discrete state functions (Xd) with respect to the continuous states (x) here: +!!! +!!! ! allocate and set dXddx +!!! +!!! END IF +!!! +!!! IF ( PRESENT( dZdx ) ) THEN +!!! +!!! +!!! ! Calculate the partial derivative of the constraint state functions (Z) with respect to the continuous states (x) here: +!!! +!!! ! allocate and set dZdx +!!! +!!! END IF +!!! +!!! +!!!END SUBROUTINE DirtDyn_JacobianPContState +!!!!---------------------------------------------------------------------------------------------------------------------------------- +!!!!> Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions +!!!!! with respect to the discrete states (xd). The partial derivatives dY/dxd, dX/dxd, dXd/dxd, and DZ/dxd are returned. +!!!SUBROUTINE DirtDyn_JacobianPDiscState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdxd, dXdxd, dXddxd, dZdxd ) +!!!!.................................................................................................................................. +!!! +!!! REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point +!!! TYPE(DirtD_InputType), INTENT(IN ) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) +!!! TYPE(DirtD_ParameterType), INTENT(IN ) :: p !< Parameters +!!! TYPE(DirtD_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at operating point +!!! TYPE(DirtD_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at operating point +!!! TYPE(DirtD_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at operating point +!!! TYPE(DirtD_OtherStateType), INTENT(IN ) :: OtherState !< Other states at operating point +!!! TYPE(DirtD_OutputType), INTENT(IN ) :: y !< Output (change to inout if a mesh copy is required); +!!! !! Output fields are not used by this routine, but type is +!!! !! available here so that mesh parameter information (i.e., +!!! !! connectivity) does not have to be recalculated for dYdxd. +!!! TYPE(DirtD_MiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables +!!! INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation +!!! CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None +!!! REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dYdxd(:,:) !< Partial derivatives of output functions +!!! !! (Y) with respect to the discrete +!!! !! states (xd) [intent in to avoid deallocation] +!!! REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXdxd(:,:) !< Partial derivatives of continuous state +!!! !! functions (X) with respect to the +!!! !! discrete states (xd) [intent in to avoid deallocation] +!!! REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXddxd(:,:)!< Partial derivatives of discrete state +!!! !! functions (Xd) with respect to the +!!! !! discrete states (xd) [intent in to avoid deallocation] +!!! REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dZdxd(:,:) !< Partial derivatives of constraint state +!!! !! functions (Z) with respect to the +!!! !! discrete states (xd) [intent in to avoid deallocation] +!!! +!!! +!!! ! Initialize ErrStat +!!! +!!! ErrStat = ErrID_None +!!! ErrMsg = '' +!!! +!!! +!!! IF ( PRESENT( dYdxd ) ) THEN +!!! +!!! ! Calculate the partial derivative of the output functions (Y) with respect to the discrete states (xd) here: +!!! +!!! ! allocate and set dYdxd +!!! +!!! END IF +!!! +!!! IF ( PRESENT( dXdxd ) ) THEN +!!! +!!! ! Calculate the partial derivative of the continuous state functions (X) with respect to the discrete states (xd) here: +!!! +!!! ! allocate and set dXdxd +!!! +!!! END IF +!!! +!!! IF ( PRESENT( dXddxd ) ) THEN +!!! +!!! ! Calculate the partial derivative of the discrete state functions (Xd) with respect to the discrete states (xd) here: +!!! +!!! ! allocate and set dXddxd +!!! +!!! END IF +!!! +!!! IF ( PRESENT( dZdxd ) ) THEN +!!! +!!! ! Calculate the partial derivative of the constraint state functions (Z) with respect to the discrete states (xd) here: +!!! +!!! ! allocate and set dZdxd +!!! +!!! END IF +!!! +!!! +!!!END SUBROUTINE DirtDyn_JacobianPDiscState +!!!!---------------------------------------------------------------------------------------------------------------------------------- +!!!!> Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions +!!!!! with respect to the constraint states (z). The partial derivatives dY/dz, dX/dz, dXd/dz, and DZ/dz are returned. +!!!SUBROUTINE DirtDyn_JacobianPConstrState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdz, dXdz, dXddz, dZdz ) +!!!!.................................................................................................................................. +!!! +!!! REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point +!!! TYPE(DirtD_InputType), INTENT(IN ) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) +!!! TYPE(DirtD_ParameterType), INTENT(IN ) :: p !< Parameters +!!! TYPE(DirtD_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at operating point +!!! TYPE(DirtD_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at operating point +!!! TYPE(DirtD_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at operating point +!!! TYPE(DirtD_OtherStateType), INTENT(IN ) :: OtherState !< Other states at operating point +!!! TYPE(DirtD_OutputType), INTENT(IN ) :: y !< Output (change to inout if a mesh copy is required); +!!! !! Output fields are not used by this routine, but type is +!!! !! available here so that mesh parameter information (i.e., +!!! !! connectivity) does not have to be recalculated for dYdz. +!!! TYPE(DirtD_MiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables +!!! INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation +!!! CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None +!!! REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dYdz(:,:) !< Partial derivatives of output +!!! !! functions (Y) with respect to the +!!! !! constraint states (z) [intent in to avoid deallocation] +!!! REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXdz(:,:) !< Partial derivatives of continuous +!!! !! state functions (X) with respect to +!!! !! the constraint states (z) [intent in to avoid deallocation] +!!! REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXddz(:,:) !< Partial derivatives of discrete state +!!! !! functions (Xd) with respect to the +!!! !! constraint states (z) [intent in to avoid deallocation] +!!! REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dZdz(:,:) !< Partial derivatives of constraint +!!! !! state functions (Z) with respect to +!!! !! the constraint states (z) [intent in to avoid deallocation] +!!! +!!! +!!! ! Initialize ErrStat +!!! +!!! ErrStat = ErrID_None +!!! ErrMsg = '' +!!! +!!! IF ( PRESENT( dYdz ) ) THEN +!!! +!!! ! Calculate the partial derivative of the output functions (Y) with respect to the constraint states (z) here: +!!! +!!! ! allocate and set dYdz +!!! +!!! END IF +!!! +!!! IF ( PRESENT( dXdz ) ) THEN +!!! +!!! ! Calculate the partial derivative of the continuous state functions (X) with respect to the constraint states (z) here: +!!! +!!! ! allocate and set dXdz +!!! +!!! END IF +!!! +!!! IF ( PRESENT( dXddz ) ) THEN +!!! +!!! ! Calculate the partial derivative of the discrete state functions (Xd) with respect to the constraint states (z) here: +!!! +!!! ! allocate and set dXddz +!!! +!!! END IF +!!! +!!! IF ( PRESENT( dZdz ) ) THEN +!!! +!!! ! Calculate the partial derivative of the constraint state functions (Z) with respect to the constraint states (z) here: +!!! +!!! ! allocate and set dZdz +!!! +!!! END IF +!!! +!!! +!!!END SUBROUTINE DirtDyn_JacobianPConstrState +!!!!---------------------------------------------------------------------------------------------------------------------------------- +!!!!> Routine to pack the data structures representing the operating points into arrays for linearization. +!!!SUBROUTINE DirtDyn_GetOP( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, u_op, y_op, x_op, dx_op, xd_op, z_op ) +!!! +!!! REAL(DbKi), intent(in ) :: t !< Time in seconds at operating point +!!! TYPE(DirtD_InputType), intent(in ) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) +!!! TYPE(DirtD_ParameterType), intent(in ) :: p !< Parameters +!!! TYPE(DirtD_ContinuousStateType), intent(in ) :: x !< Continuous states at operating point +!!! TYPE(DirtD_DiscreteStateType), intent(in ) :: xd !< Discrete states at operating point +!!! TYPE(DirtD_ConstraintStateType), intent(in ) :: z !< Constraint states at operating point +!!! TYPE(DirtD_OtherStateType), intent(in ) :: OtherState !< Other states at operating point +!!! TYPE(DirtD_OutputType), intent(in ) :: y !< Output at operating point +!!! TYPE(DirtD_MiscVarType), intent(inout) :: m !< Misc/optimization variables +!!! INTEGER(IntKi), intent( out) :: ErrStat !< Error status of the operation +!!! CHARACTER(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None +!!! REAL(ReKi), ALLOCATABLE, OPTIONAL, intent(inout) :: u_op(:) !< values of linearized inputs +!!! REAL(ReKi), ALLOCATABLE, OPTIONAL, intent(inout) :: y_op(:) !< values of linearized outputs +!!! REAL(ReKi), ALLOCATABLE, OPTIONAL, intent(inout) :: x_op(:) !< values of linearized continuous states +!!! REAL(ReKi), ALLOCATABLE, OPTIONAL, intent(inout) :: dx_op(:) !< values of first time derivatives of linearized continuous states +!!! REAL(ReKi), ALLOCATABLE, OPTIONAL, intent(inout) :: xd_op(:) !< values of linearized discrete states +!!! REAL(ReKi), ALLOCATABLE, OPTIONAL, intent(inout) :: z_op(:) !< values of linearized constraint states +!!! +!!! +!!! ! Initialize ErrStat +!!! +!!! ErrStat = ErrID_None +!!! ErrMsg = '' +!!! +!!! IF ( PRESENT( u_op ) ) THEN +!!! +!!! END IF +!!! +!!! IF ( PRESENT( y_op ) ) THEN +!!! END IF +!!! +!!! IF ( PRESENT( x_op ) ) THEN +!!! +!!! END IF +!!! +!!! IF ( PRESENT( dx_op ) ) THEN +!!! +!!! END IF +!!! +!!! IF ( PRESENT( xd_op ) ) THEN +!!! +!!! END IF +!!! +!!! IF ( PRESENT( z_op ) ) THEN +!!! +!!! END IF +!!! +!!!END SUBROUTINE DirtDyn_GetOP +!!!!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +END MODULE DirtDyn +!********************************************************************************************************************************** diff --git a/modules/dirtdyn/src/DirtDyn_Registry.txt b/modules/dirtdyn/src/DirtDyn_Registry.txt new file mode 100644 index 000000000..98d296670 --- /dev/null +++ b/modules/dirtdyn/src/DirtDyn_Registry.txt @@ -0,0 +1,106 @@ +################################################################################################################################### +# Registry for DirtDyn in the FAST Modularization Framework +# This Registry file is used to create MODULE DirtDyn_Types, which contains all of the user-defined types needed in DirtDyn. +# It also contains copy, destroy, pack, and unpack routines associated with each defined data types. +# +# Entries are of the form +# keyword +# +# Use ^ as a shortcut for the value from the previous line. +# See NWTC Programmer's Handbook for further information on the format/contents of this file. +################################################################################################################################### + +# ...... Include files (definitions from NWTC Library) ............................................................................ +include Registry_NWTC_Library.txt + + +# REDWIN interface DLL type +# ..... Data for using REDWIN DLLs ....................................................................................................... +# Values set to type R8Ki are defined in the REDWIN fortran code as kind=selected_real_kind(p=15) +typedef DirtDyn/DirtD REDWINdllType character(45) PROPSFILE - - - "" - +typedef DirtDyn/DirtD REDWINdllType character(45) LDISPFILE - - - "" - +typedef DirtDyn/DirtD REDWINdllType IntKi IDtask - - - "Task identifier for what DLL should do: IDTask = 1: Read input properties, initialize and calibrate model IDTask = 2: Calculate forces based on displacement at end of step IDTask = 3: Calculate elastic macro-element stiffness matrix" - +typedef ^ REDWINdllType IntKi nErrorCode - - - "number of returned error codes" - +typedef ^ REDWINdllType IntKi ErrorCode 100 - - "Array containing one or more error codes. These are specific to each model." - +typedef ^ REDWINdllType R8Ki Props {100}{200} - - "Array containing foundation model properties (used internally by the REDWIN models). Specific to each model." - +typedef ^ REDWINdllType R8Ki StVar {12}{100} - - "Array containing the state variables at the end of the step (used internally by the REDWIN models). Specific to each model." - +typedef ^ REDWINdllType IntKi StVarPrint {12}{100} - - "Array indicating which state variables should be printed to the screen. This feature is currently not supported." - +typedef ^ REDWINdllType R8Ki Disp 6 - - "Displacements. Follows convention of REDWIN orientation." - +typedef ^ REDWINdllType R8Ki Force 6 - - "Forces. Follows convention of REDWIN orientations." - +typedef ^ REDWINdllType R8Ki D {6}{6} - - "The 6 x 6 elastic macro-element stiffness matrix at the SFI." - + + + +# DirtDyn input file +typedef ^ DirtD_InputFile CHARACTER(1024) DLL_FileName - - - "Name of the DLL file including the full path" - +typedef ^ DirtD_InputFile CHARACTER(1024) DLL_ProcName - - - "Name of the procedure in the DLL that will be called" - +typedef ^ DirtD_InputFile CHARACTER(1024) DLL_InFile - - - "Name of input file used in DLL" - + + +# ..... Initialization data ....................................................................................................... +# Define inputs that the initialization routine may need here: +# e.g., the name of the input file, the file root name, etc. +typedef DirtDyn/DirtD InitInputType CHARACTER(1024) InputFile - - - "Name of the input file; remove if there is no file" - +typedef ^ ^ LOGICAL Linearize - .FALSE. - "Flag that tells this module if the glue code wants to linearize." - + +# Define outputs from the initialization routine here: +typedef ^ InitOutputType CHARACTER(ChanLen) WriteOutputHdr {:} - - "Names of the output-to-file channels" - +typedef ^ InitOutputType CHARACTER(ChanLen) WriteOutputUnt {:} - - "Units of the output-to-file channels" - +# if this module has implemented linearization, return the names of the rows/columns of the Jacobian matrices: +#typedef ^ InitOutputType CHARACTER(LinChanLen) LinNames_y {:} - - "Names of the outputs used in linearization" - +#typedef ^ InitOutputType CHARACTER(LinChanLen) LinNames_x {:} - - "Names of the continuous states used in linearization" - +#typedef ^ InitOutputType CHARACTER(LinChanLen) LinNames_xd {:} - - "Names of the discrete states used in linearization" - +#typedef ^ InitOutputType CHARACTER(LinChanLen) LinNames_z {:} - - "Names of the constraint states used in linearization" - +#typedef ^ InitOutputType CHARACTER(LinChanLen) LinNames_u {:} - - "Names of the inputs used in linearization" - +#typedef ^ InitOutputType LOGICAL RotFrame_y {:} - - "Flag that tells FAST/MBC3 if the outputs used in linearization are in the rotating frame" - +#typedef ^ InitOutputType LOGICAL RotFrame_x {:} - - "Flag that tells FAST/MBC3 if the continuous states used in linearization are in the rotating frame" - +#typedef ^ InitOutputType LOGICAL RotFrame_xd {:} - - "Flag that tells FAST if the discrete states used in linearization are in the rotating frame" - +#typedef ^ InitOutputType LOGICAL RotFrame_z {:} - - "Flag that tells FAST if the constraint states used in linearization are in the rotating frame" - +#typedef ^ InitOutputType LOGICAL RotFrame_u {:} - - "Flag that tells FAST/MBC3 if the inputs used in linearization are in the rotating frame" - + + +# ..... States .................................................................................................................... +# Define continuous (differentiable) states here: +typedef ^ ContinuousStateType ReKi DummyContState - - - "Remove this variable if you have continuous states" - + +# Define discrete (nondifferentiable) states here: +typedef ^ DiscreteStateType ReKi DummyDiscState - - - "Remove this variable if you have discrete states" - + +# Define constraint states here: +typedef ^ ConstraintStateType ReKi DummyConstrState - - - "Remove this variable if you have constraint states" - + +# Define any other states, including integer or logical states here: +typedef ^ OtherStateType IntKi DummyOtherState - - - "Remove this variable if you have other states" - + + +# ..... Misc/Optimization variables................................................................................................. +# Define any data that are used only for efficiency purposes (these variables are not associated with time): +# e.g. indices for searching in an array, large arrays that are local variables in any routine called multiple times, etc. +typedef ^ MiscVarType REDWINdllType dll_data - - - "data used for REDWIN DLL" - + + +# ..... Parameters ................................................................................................................ +# Define parameters here: +# Time step for integration of continuous states (if a fixed-step integrator is used) and update of discrete states: +typedef ^ ParameterType DbKi DT - - - "Time step for cont. state integration & disc. state update" seconds +typedef ^ ParameterType CHARACTER(1024) DLL_InFile - - - "Name of input file used in DLL" - +typedef ^ ParameterType DLL_Type DLL_Trgt - - - "The addresses and names of the Bladed DLL and its procedure" - +typedef ^ ParameterType DbKi DLL_DT - - - "Time step for DLL" seconds +typedef ^ ParameterType CHARACTER(1024) RootName - - - "RootName for writing output files" - +typedef ^ ParameterType LOGICAL UseREDWINinterface - - - "True if interface successfully initialized" - + + +# ..... Inputs .................................................................................................................... +# Define inputs that are contained on the mesh here: +#typedef ^ InputType MeshType MeshedInput - - - "Meshed data" - +# Define inputs that are not on this mesh here: +typedef ^ InputType ReKi DummyInput - - - "Remove this variable if you have input data" - + + +# ..... Outputs ................................................................................................................... +# Define outputs that are contained on the mesh here: +#typedef DirtDyn DirtD_OutputType MeshType MeshedOutput - - - "Meshed data" - +# Define outputs that are not on this mesh here: +typedef ^ OutputType ReKi DummyOutput - - - "Remove this variable if you have output data" - +typedef ^ ^ ReKi WriteOutput {:} - - "Example of data to be written to an output file" "s,-" + diff --git a/modules/dirtdyn/src/DirtDyn_Types.f90 b/modules/dirtdyn/src/DirtDyn_Types.f90 new file mode 100644 index 000000000..009a4b6f6 --- /dev/null +++ b/modules/dirtdyn/src/DirtDyn_Types.f90 @@ -0,0 +1,2580 @@ +!STARTOFREGISTRYGENERATEDFILE 'DirtDyn_Types.f90' +! +! WARNING This file is generated automatically by the FAST registry. +! Do not edit. Your changes to this file will be lost. +! +! FAST Registry +!********************************************************************************************************************************* +! DirtDyn_Types +!................................................................................................................................. +! This file is part of DirtDyn. +! +! Copyright (C) 2012-2016 National Renewable Energy Laboratory +! +! Licensed under the Apache License, Version 2.0 (the "License"); +! you may not use this file except in compliance with the License. +! You may obtain a copy of the License at +! +! http://www.apache.org/licenses/LICENSE-2.0 +! +! Unless required by applicable law or agreed to in writing, software +! distributed under the License is distributed on an "AS IS" BASIS, +! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +! See the License for the specific language governing permissions and +! limitations under the License. +! +! +! W A R N I N G : This file was automatically generated from the FAST registry. Changes made to this file may be lost. +! +!********************************************************************************************************************************* +!> This module contains the user-defined types needed in DirtDyn. It also contains copy, destroy, pack, and +!! unpack routines associated with each defined data type. This code is automatically generated by the FAST Registry. +MODULE DirtDyn_Types +!--------------------------------------------------------------------------------------------------------------------------------- +USE NWTC_Library +IMPLICIT NONE +! ========= REDWINdllType ======= + TYPE, PUBLIC :: REDWINdllType + character(45) :: PROPSFILE !< [-] + character(45) :: LDISPFILE !< [-] + INTEGER(IntKi) :: IDtask !< Task identifier for what DLL should do: IDTask = 1: Read input properties, initialize and calibrate model IDTask = 2: Calculate forces based on displacement at end of step IDTask = 3: Calculate elastic macro-element stiffness matrix [-] + INTEGER(IntKi) :: nErrorCode !< number of returned error codes [-] + INTEGER(IntKi) , DIMENSION(1:1,1:0,1:0) :: ErrorCode !< Array containing one or more error codes. These are specific to each model. [-] + REAL(R8Ki) , DIMENSION(1:100,1:200) :: Props !< Array containing foundation model properties (used internally by the REDWIN models). Specific to each model. [-] + REAL(R8Ki) , DIMENSION(1:12,1:100) :: StVar !< Array containing the state variables at the end of the step (used internally by the REDWIN models). Specific to each model. [-] + INTEGER(IntKi) , DIMENSION(1:12,1:100) :: StVarPrint !< Array indicating which state variables should be printed to the screen. This feature is currently not supported. [-] + REAL(R8Ki) , DIMENSION(1:6) :: Disp !< Displacements. Follows convention of REDWIN orientation. [-] + REAL(R8Ki) , DIMENSION(1:6) :: Force !< Forces. Follows convention of REDWIN orientations. [-] + REAL(R8Ki) , DIMENSION(1:6,1:6) :: D !< The 6 x 6 elastic macro-element stiffness matrix at the SFI. [-] + END TYPE REDWINdllType +! ======================= +! ========= DirtD_InputFile ======= + TYPE, PUBLIC :: DirtD_InputFile + CHARACTER(1024) :: DLL_FileName !< Name of the DLL file including the full path [-] + CHARACTER(1024) :: DLL_ProcName !< Name of the procedure in the DLL that will be called [-] + CHARACTER(1024) :: DLL_InFile !< Name of input file used in DLL [-] + END TYPE DirtD_InputFile +! ======================= +! ========= DirtD_InitInputType ======= + TYPE, PUBLIC :: DirtD_InitInputType + CHARACTER(1024) :: InputFile !< Name of the input file; remove if there is no file [-] + LOGICAL :: Linearize = .FALSE. !< Flag that tells this module if the glue code wants to linearize. [-] + END TYPE DirtD_InitInputType +! ======================= +! ========= DirtD_InitOutputType ======= + TYPE, PUBLIC :: DirtD_InitOutputType + CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: WriteOutputHdr !< Names of the output-to-file channels [-] + CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: WriteOutputUnt !< Units of the output-to-file channels [-] + END TYPE DirtD_InitOutputType +! ======================= +! ========= DirtD_ContinuousStateType ======= + TYPE, PUBLIC :: DirtD_ContinuousStateType + REAL(ReKi) :: DummyContState !< Remove this variable if you have continuous states [-] + END TYPE DirtD_ContinuousStateType +! ======================= +! ========= DirtD_DiscreteStateType ======= + TYPE, PUBLIC :: DirtD_DiscreteStateType + REAL(ReKi) :: DummyDiscState !< Remove this variable if you have discrete states [-] + END TYPE DirtD_DiscreteStateType +! ======================= +! ========= DirtD_ConstraintStateType ======= + TYPE, PUBLIC :: DirtD_ConstraintStateType + REAL(ReKi) :: DummyConstrState !< Remove this variable if you have constraint states [-] + END TYPE DirtD_ConstraintStateType +! ======================= +! ========= DirtD_OtherStateType ======= + TYPE, PUBLIC :: DirtD_OtherStateType + INTEGER(IntKi) :: DummyOtherState !< Remove this variable if you have other states [-] + END TYPE DirtD_OtherStateType +! ======================= +! ========= DirtD_MiscVarType ======= + TYPE, PUBLIC :: DirtD_MiscVarType + TYPE(REDWINdllType) :: dll_data !< data used for REDWIN DLL [-] + END TYPE DirtD_MiscVarType +! ======================= +! ========= DirtD_ParameterType ======= + TYPE, PUBLIC :: DirtD_ParameterType + REAL(DbKi) :: DT !< Time step for cont. state integration & disc. state update [seconds] + CHARACTER(1024) :: DLL_InFile !< Name of input file used in DLL [-] + TYPE(DLL_Type) :: DLL_Trgt !< The addresses and names of the Bladed DLL and its procedure [-] + REAL(DbKi) :: DLL_DT !< Time step for DLL [seconds] + CHARACTER(1024) :: RootName !< RootName for writing output files [-] + LOGICAL :: UseREDWINinterface !< True if interface successfully initialized [-] + END TYPE DirtD_ParameterType +! ======================= +! ========= DirtD_InputType ======= + TYPE, PUBLIC :: DirtD_InputType + REAL(ReKi) :: DummyInput !< Remove this variable if you have input data [-] + END TYPE DirtD_InputType +! ======================= +! ========= DirtD_OutputType ======= + TYPE, PUBLIC :: DirtD_OutputType + REAL(ReKi) :: DummyOutput !< Remove this variable if you have output data [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: WriteOutput !< Example of data to be written to an output file [s,-] + END TYPE DirtD_OutputType +! ======================= +CONTAINS + SUBROUTINE DirtD_CopyREDWINdllType( SrcREDWINdllTypeData, DstREDWINdllTypeData, CtrlCode, ErrStat, ErrMsg ) + TYPE(REDWINdllType), INTENT(IN) :: SrcREDWINdllTypeData + TYPE(REDWINdllType), INTENT(INOUT) :: DstREDWINdllTypeData + 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) :: i2, i2_l, i2_u ! bounds (upper/lower) for an array dimension 2 + INTEGER(IntKi) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_CopyREDWINdllType' +! + ErrStat = ErrID_None + ErrMsg = "" + DstREDWINdllTypeData%PROPSFILE = SrcREDWINdllTypeData%PROPSFILE + DstREDWINdllTypeData%LDISPFILE = SrcREDWINdllTypeData%LDISPFILE + DstREDWINdllTypeData%IDtask = SrcREDWINdllTypeData%IDtask + DstREDWINdllTypeData%nErrorCode = SrcREDWINdllTypeData%nErrorCode + DstREDWINdllTypeData%ErrorCode = SrcREDWINdllTypeData%ErrorCode + DstREDWINdllTypeData%Props = SrcREDWINdllTypeData%Props + DstREDWINdllTypeData%StVar = SrcREDWINdllTypeData%StVar + DstREDWINdllTypeData%StVarPrint = SrcREDWINdllTypeData%StVarPrint + DstREDWINdllTypeData%Disp = SrcREDWINdllTypeData%Disp + DstREDWINdllTypeData%Force = SrcREDWINdllTypeData%Force + DstREDWINdllTypeData%D = SrcREDWINdllTypeData%D + END SUBROUTINE DirtD_CopyREDWINdllType + + SUBROUTINE DirtD_DestroyREDWINdllType( REDWINdllTypeData, ErrStat, ErrMsg ) + TYPE(REDWINdllType), INTENT(INOUT) :: REDWINdllTypeData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_DestroyREDWINdllType' + INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 +! + ErrStat = ErrID_None + ErrMsg = "" + END SUBROUTINE DirtD_DestroyREDWINdllType + + SUBROUTINE DirtD_PackREDWINdllType( 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(REDWINdllType), 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 = 'DirtD_PackREDWINdllType' + ! 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*LEN(InData%PROPSFILE) ! PROPSFILE + Int_BufSz = Int_BufSz + 1*LEN(InData%LDISPFILE) ! LDISPFILE + Int_BufSz = Int_BufSz + 1 ! IDtask + Int_BufSz = Int_BufSz + 1 ! nErrorCode + Int_BufSz = Int_BufSz + SIZE(InData%ErrorCode) ! ErrorCode + Db_BufSz = Db_BufSz + SIZE(InData%Props) ! Props + Db_BufSz = Db_BufSz + SIZE(InData%StVar) ! StVar + Int_BufSz = Int_BufSz + SIZE(InData%StVarPrint) ! StVarPrint + Db_BufSz = Db_BufSz + SIZE(InData%Disp) ! Disp + Db_BufSz = Db_BufSz + SIZE(InData%Force) ! Force + Db_BufSz = Db_BufSz + SIZE(InData%D) ! D + 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) + + Re_Xferred = 1 + Db_Xferred = 1 + Int_Xferred = 1 + + DO I = 1, LEN(InData%PROPSFILE) + IntKiBuf(Int_Xferred) = ICHAR(InData%PROPSFILE(I:I), IntKi) + Int_Xferred = Int_Xferred + 1 + END DO ! I + DO I = 1, LEN(InData%LDISPFILE) + IntKiBuf(Int_Xferred) = ICHAR(InData%LDISPFILE(I:I), IntKi) + Int_Xferred = Int_Xferred + 1 + END DO ! I + IntKiBuf ( Int_Xferred:Int_Xferred+(1)-1 ) = InData%IDtask + Int_Xferred = Int_Xferred + 1 + IntKiBuf ( Int_Xferred:Int_Xferred+(1)-1 ) = InData%nErrorCode + Int_Xferred = Int_Xferred + 1 + IntKiBuf ( Int_Xferred:Int_Xferred+(SIZE(InData%ErrorCode))-1 ) = PACK(InData%ErrorCode,.TRUE.) + Int_Xferred = Int_Xferred + SIZE(InData%ErrorCode) + DbKiBuf ( Db_Xferred:Db_Xferred+(SIZE(InData%Props))-1 ) = PACK(InData%Props,.TRUE.) + Db_Xferred = Db_Xferred + SIZE(InData%Props) + DbKiBuf ( Db_Xferred:Db_Xferred+(SIZE(InData%StVar))-1 ) = PACK(InData%StVar,.TRUE.) + Db_Xferred = Db_Xferred + SIZE(InData%StVar) + IntKiBuf ( Int_Xferred:Int_Xferred+(SIZE(InData%StVarPrint))-1 ) = PACK(InData%StVarPrint,.TRUE.) + Int_Xferred = Int_Xferred + SIZE(InData%StVarPrint) + DbKiBuf ( Db_Xferred:Db_Xferred+(SIZE(InData%Disp))-1 ) = PACK(InData%Disp,.TRUE.) + Db_Xferred = Db_Xferred + SIZE(InData%Disp) + DbKiBuf ( Db_Xferred:Db_Xferred+(SIZE(InData%Force))-1 ) = PACK(InData%Force,.TRUE.) + Db_Xferred = Db_Xferred + SIZE(InData%Force) + DbKiBuf ( Db_Xferred:Db_Xferred+(SIZE(InData%D))-1 ) = PACK(InData%D,.TRUE.) + Db_Xferred = Db_Xferred + SIZE(InData%D) + END SUBROUTINE DirtD_PackREDWINdllType + + SUBROUTINE DirtD_UnPackREDWINdllType( 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(REDWINdllType), 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 + LOGICAL :: mask0 + LOGICAL, ALLOCATABLE :: mask1(:) + LOGICAL, ALLOCATABLE :: mask2(:,:) + LOGICAL, ALLOCATABLE :: mask3(:,:,:) + LOGICAL, ALLOCATABLE :: mask4(:,:,:,:) + LOGICAL, ALLOCATABLE :: mask5(:,:,:,:,:) + INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 + INTEGER(IntKi) :: i2, i2_l, i2_u ! bounds (upper/lower) for an array dimension 2 + INTEGER(IntKi) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_UnPackREDWINdllType' + ! 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 + DO I = 1, LEN(OutData%PROPSFILE) + OutData%PROPSFILE(I:I) = CHAR(IntKiBuf(Int_Xferred)) + Int_Xferred = Int_Xferred + 1 + END DO ! I + DO I = 1, LEN(OutData%LDISPFILE) + OutData%LDISPFILE(I:I) = CHAR(IntKiBuf(Int_Xferred)) + Int_Xferred = Int_Xferred + 1 + END DO ! I + OutData%IDtask = IntKiBuf( Int_Xferred ) + Int_Xferred = Int_Xferred + 1 + OutData%nErrorCode = IntKiBuf( Int_Xferred ) + Int_Xferred = Int_Xferred + 1 + i1_l = LBOUND(OutData%ErrorCode,1) + i1_u = UBOUND(OutData%ErrorCode,1) + i2_l = LBOUND(OutData%ErrorCode,2) + i2_u = UBOUND(OutData%ErrorCode,2) + i3_l = LBOUND(OutData%ErrorCode,3) + i3_u = UBOUND(OutData%ErrorCode,3) + ALLOCATE(mask3(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating mask3.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + mask3 = .TRUE. + OutData%ErrorCode = UNPACK( IntKiBuf ( Int_Xferred:Int_Xferred+(SIZE(OutData%ErrorCode))-1 ), mask3, 0_IntKi ) + Int_Xferred = Int_Xferred + SIZE(OutData%ErrorCode) + DEALLOCATE(mask3) + i1_l = LBOUND(OutData%Props,1) + i1_u = UBOUND(OutData%Props,1) + i2_l = LBOUND(OutData%Props,2) + i2_u = UBOUND(OutData%Props,2) + ALLOCATE(mask2(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating mask2.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + mask2 = .TRUE. + OutData%Props = REAL( UNPACK(DbKiBuf( Db_Xferred:Db_Xferred+(SIZE(OutData%Props))-1 ), mask2, 0.0_DbKi ), R8Ki) + Db_Xferred = Db_Xferred + SIZE(OutData%Props) + DEALLOCATE(mask2) + i1_l = LBOUND(OutData%StVar,1) + i1_u = UBOUND(OutData%StVar,1) + i2_l = LBOUND(OutData%StVar,2) + i2_u = UBOUND(OutData%StVar,2) + ALLOCATE(mask2(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating mask2.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + mask2 = .TRUE. + OutData%StVar = REAL( UNPACK(DbKiBuf( Db_Xferred:Db_Xferred+(SIZE(OutData%StVar))-1 ), mask2, 0.0_DbKi ), R8Ki) + Db_Xferred = Db_Xferred + SIZE(OutData%StVar) + DEALLOCATE(mask2) + i1_l = LBOUND(OutData%StVarPrint,1) + i1_u = UBOUND(OutData%StVarPrint,1) + i2_l = LBOUND(OutData%StVarPrint,2) + i2_u = UBOUND(OutData%StVarPrint,2) + ALLOCATE(mask2(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating mask2.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + mask2 = .TRUE. + OutData%StVarPrint = UNPACK( IntKiBuf ( Int_Xferred:Int_Xferred+(SIZE(OutData%StVarPrint))-1 ), mask2, 0_IntKi ) + Int_Xferred = Int_Xferred + SIZE(OutData%StVarPrint) + DEALLOCATE(mask2) + i1_l = LBOUND(OutData%Disp,1) + i1_u = UBOUND(OutData%Disp,1) + ALLOCATE(mask1(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating mask1.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + mask1 = .TRUE. + OutData%Disp = REAL( UNPACK(DbKiBuf( Db_Xferred:Db_Xferred+(SIZE(OutData%Disp))-1 ), mask1, 0.0_DbKi ), R8Ki) + Db_Xferred = Db_Xferred + SIZE(OutData%Disp) + DEALLOCATE(mask1) + i1_l = LBOUND(OutData%Force,1) + i1_u = UBOUND(OutData%Force,1) + ALLOCATE(mask1(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating mask1.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + mask1 = .TRUE. + OutData%Force = REAL( UNPACK(DbKiBuf( Db_Xferred:Db_Xferred+(SIZE(OutData%Force))-1 ), mask1, 0.0_DbKi ), R8Ki) + Db_Xferred = Db_Xferred + SIZE(OutData%Force) + DEALLOCATE(mask1) + i1_l = LBOUND(OutData%D,1) + i1_u = UBOUND(OutData%D,1) + i2_l = LBOUND(OutData%D,2) + i2_u = UBOUND(OutData%D,2) + ALLOCATE(mask2(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating mask2.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + mask2 = .TRUE. + OutData%D = REAL( UNPACK(DbKiBuf( Db_Xferred:Db_Xferred+(SIZE(OutData%D))-1 ), mask2, 0.0_DbKi ), R8Ki) + Db_Xferred = Db_Xferred + SIZE(OutData%D) + DEALLOCATE(mask2) + END SUBROUTINE DirtD_UnPackREDWINdllType + + SUBROUTINE DirtD_CopyInputFile( SrcInputFileData, DstInputFileData, CtrlCode, ErrStat, ErrMsg ) + TYPE(DirtD_InputFile), INTENT(IN) :: SrcInputFileData + TYPE(DirtD_InputFile), INTENT(INOUT) :: DstInputFileData + INTEGER(IntKi), INTENT(IN ) :: CtrlCode + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg +! Local + INTEGER(IntKi) :: i,j,k + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_CopyInputFile' +! + ErrStat = ErrID_None + ErrMsg = "" + DstInputFileData%DLL_FileName = SrcInputFileData%DLL_FileName + DstInputFileData%DLL_ProcName = SrcInputFileData%DLL_ProcName + DstInputFileData%DLL_InFile = SrcInputFileData%DLL_InFile + END SUBROUTINE DirtD_CopyInputFile + + SUBROUTINE DirtD_DestroyInputFile( InputFileData, ErrStat, ErrMsg ) + TYPE(DirtD_InputFile), INTENT(INOUT) :: InputFileData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_DestroyInputFile' + INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 +! + ErrStat = ErrID_None + ErrMsg = "" + END SUBROUTINE DirtD_DestroyInputFile + + SUBROUTINE DirtD_PackInputFile( 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(DirtD_InputFile), 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 = 'DirtD_PackInputFile' + ! 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*LEN(InData%DLL_FileName) ! DLL_FileName + Int_BufSz = Int_BufSz + 1*LEN(InData%DLL_ProcName) ! DLL_ProcName + Int_BufSz = Int_BufSz + 1*LEN(InData%DLL_InFile) ! DLL_InFile + 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) + + Re_Xferred = 1 + Db_Xferred = 1 + Int_Xferred = 1 + + DO I = 1, LEN(InData%DLL_FileName) + IntKiBuf(Int_Xferred) = ICHAR(InData%DLL_FileName(I:I), IntKi) + Int_Xferred = Int_Xferred + 1 + END DO ! I + DO I = 1, LEN(InData%DLL_ProcName) + IntKiBuf(Int_Xferred) = ICHAR(InData%DLL_ProcName(I:I), IntKi) + Int_Xferred = Int_Xferred + 1 + END DO ! I + DO I = 1, LEN(InData%DLL_InFile) + IntKiBuf(Int_Xferred) = ICHAR(InData%DLL_InFile(I:I), IntKi) + Int_Xferred = Int_Xferred + 1 + END DO ! I + END SUBROUTINE DirtD_PackInputFile + + SUBROUTINE DirtD_UnPackInputFile( 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(DirtD_InputFile), 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 + LOGICAL :: mask0 + LOGICAL, ALLOCATABLE :: mask1(:) + LOGICAL, ALLOCATABLE :: mask2(:,:) + LOGICAL, ALLOCATABLE :: mask3(:,:,:) + LOGICAL, ALLOCATABLE :: mask4(:,:,:,:) + LOGICAL, ALLOCATABLE :: mask5(:,:,:,:,:) + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_UnPackInputFile' + ! 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 + DO I = 1, LEN(OutData%DLL_FileName) + OutData%DLL_FileName(I:I) = CHAR(IntKiBuf(Int_Xferred)) + Int_Xferred = Int_Xferred + 1 + END DO ! I + DO I = 1, LEN(OutData%DLL_ProcName) + OutData%DLL_ProcName(I:I) = CHAR(IntKiBuf(Int_Xferred)) + Int_Xferred = Int_Xferred + 1 + END DO ! I + DO I = 1, LEN(OutData%DLL_InFile) + OutData%DLL_InFile(I:I) = CHAR(IntKiBuf(Int_Xferred)) + Int_Xferred = Int_Xferred + 1 + END DO ! I + END SUBROUTINE DirtD_UnPackInputFile + + SUBROUTINE DirtD_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, ErrStat, ErrMsg ) + TYPE(DirtD_InitInputType), INTENT(IN) :: SrcInitInputData + TYPE(DirtD_InitInputType), INTENT(INOUT) :: DstInitInputData + INTEGER(IntKi), INTENT(IN ) :: CtrlCode + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg +! Local + INTEGER(IntKi) :: i,j,k + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_CopyInitInput' +! + ErrStat = ErrID_None + ErrMsg = "" + DstInitInputData%InputFile = SrcInitInputData%InputFile + DstInitInputData%Linearize = SrcInitInputData%Linearize + END SUBROUTINE DirtD_CopyInitInput + + SUBROUTINE DirtD_DestroyInitInput( InitInputData, ErrStat, ErrMsg ) + TYPE(DirtD_InitInputType), INTENT(INOUT) :: InitInputData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_DestroyInitInput' + INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 +! + ErrStat = ErrID_None + ErrMsg = "" + END SUBROUTINE DirtD_DestroyInitInput + + SUBROUTINE DirtD_PackInitInput( 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(DirtD_InitInputType), 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 = 'DirtD_PackInitInput' + ! 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*LEN(InData%InputFile) ! InputFile + Int_BufSz = Int_BufSz + 1 ! Linearize + 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) + + Re_Xferred = 1 + Db_Xferred = 1 + Int_Xferred = 1 + + DO I = 1, LEN(InData%InputFile) + IntKiBuf(Int_Xferred) = ICHAR(InData%InputFile(I:I), IntKi) + Int_Xferred = Int_Xferred + 1 + END DO ! I + IntKiBuf ( Int_Xferred:Int_Xferred+1-1 ) = TRANSFER( InData%Linearize , IntKiBuf(1), 1) + Int_Xferred = Int_Xferred + 1 + END SUBROUTINE DirtD_PackInitInput + + SUBROUTINE DirtD_UnPackInitInput( 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(DirtD_InitInputType), 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 + LOGICAL :: mask0 + LOGICAL, ALLOCATABLE :: mask1(:) + LOGICAL, ALLOCATABLE :: mask2(:,:) + LOGICAL, ALLOCATABLE :: mask3(:,:,:) + LOGICAL, ALLOCATABLE :: mask4(:,:,:,:) + LOGICAL, ALLOCATABLE :: mask5(:,:,:,:,:) + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_UnPackInitInput' + ! 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 + DO I = 1, LEN(OutData%InputFile) + OutData%InputFile(I:I) = CHAR(IntKiBuf(Int_Xferred)) + Int_Xferred = Int_Xferred + 1 + END DO ! I + OutData%Linearize = TRANSFER( IntKiBuf( Int_Xferred ), mask0 ) + Int_Xferred = Int_Xferred + 1 + END SUBROUTINE DirtD_UnPackInitInput + + SUBROUTINE DirtD_CopyInitOutput( SrcInitOutputData, DstInitOutputData, CtrlCode, ErrStat, ErrMsg ) + TYPE(DirtD_InitOutputType), INTENT(IN) :: SrcInitOutputData + TYPE(DirtD_InitOutputType), INTENT(INOUT) :: DstInitOutputData + 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 = 'DirtD_CopyInitOutput' +! + ErrStat = ErrID_None + ErrMsg = "" +IF (ALLOCATED(SrcInitOutputData%WriteOutputHdr)) THEN + i1_l = LBOUND(SrcInitOutputData%WriteOutputHdr,1) + i1_u = UBOUND(SrcInitOutputData%WriteOutputHdr,1) + IF (.NOT. ALLOCATED(DstInitOutputData%WriteOutputHdr)) THEN + ALLOCATE(DstInitOutputData%WriteOutputHdr(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%WriteOutputHdr.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInitOutputData%WriteOutputHdr = SrcInitOutputData%WriteOutputHdr +ENDIF +IF (ALLOCATED(SrcInitOutputData%WriteOutputUnt)) THEN + i1_l = LBOUND(SrcInitOutputData%WriteOutputUnt,1) + i1_u = UBOUND(SrcInitOutputData%WriteOutputUnt,1) + IF (.NOT. ALLOCATED(DstInitOutputData%WriteOutputUnt)) THEN + ALLOCATE(DstInitOutputData%WriteOutputUnt(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%WriteOutputUnt.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInitOutputData%WriteOutputUnt = SrcInitOutputData%WriteOutputUnt +ENDIF + END SUBROUTINE DirtD_CopyInitOutput + + SUBROUTINE DirtD_DestroyInitOutput( InitOutputData, ErrStat, ErrMsg ) + TYPE(DirtD_InitOutputType), INTENT(INOUT) :: InitOutputData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_DestroyInitOutput' + INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 +! + ErrStat = ErrID_None + ErrMsg = "" +IF (ALLOCATED(InitOutputData%WriteOutputHdr)) THEN + DEALLOCATE(InitOutputData%WriteOutputHdr) +ENDIF +IF (ALLOCATED(InitOutputData%WriteOutputUnt)) THEN + DEALLOCATE(InitOutputData%WriteOutputUnt) +ENDIF + END SUBROUTINE DirtD_DestroyInitOutput + + SUBROUTINE DirtD_PackInitOutput( 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(DirtD_InitOutputType), 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 = 'DirtD_PackInitOutput' + ! 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 ! WriteOutputHdr allocated yes/no + IF ( ALLOCATED(InData%WriteOutputHdr) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! WriteOutputHdr upper/lower bounds for each dimension + Int_BufSz = Int_BufSz + SIZE(InData%WriteOutputHdr)*LEN(InData%WriteOutputHdr) ! WriteOutputHdr + END IF + Int_BufSz = Int_BufSz + 1 ! WriteOutputUnt allocated yes/no + IF ( ALLOCATED(InData%WriteOutputUnt) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! WriteOutputUnt upper/lower bounds for each dimension + Int_BufSz = Int_BufSz + SIZE(InData%WriteOutputUnt)*LEN(InData%WriteOutputUnt) ! WriteOutputUnt + 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) + + Re_Xferred = 1 + Db_Xferred = 1 + Int_Xferred = 1 + + IF ( .NOT. ALLOCATED(InData%WriteOutputHdr) ) 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%WriteOutputHdr,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WriteOutputHdr,1) + Int_Xferred = Int_Xferred + 2 + + DO i1 = LBOUND(InData%WriteOutputHdr,1), UBOUND(InData%WriteOutputHdr,1) + DO I = 1, LEN(InData%WriteOutputHdr) + IntKiBuf(Int_Xferred) = ICHAR(InData%WriteOutputHdr(i1)(I:I), IntKi) + Int_Xferred = Int_Xferred + 1 + END DO ! I + END DO !i1 + END IF + IF ( .NOT. ALLOCATED(InData%WriteOutputUnt) ) 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%WriteOutputUnt,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WriteOutputUnt,1) + Int_Xferred = Int_Xferred + 2 + + DO i1 = LBOUND(InData%WriteOutputUnt,1), UBOUND(InData%WriteOutputUnt,1) + DO I = 1, LEN(InData%WriteOutputUnt) + IntKiBuf(Int_Xferred) = ICHAR(InData%WriteOutputUnt(i1)(I:I), IntKi) + Int_Xferred = Int_Xferred + 1 + END DO ! I + END DO !i1 + END IF + END SUBROUTINE DirtD_PackInitOutput + + SUBROUTINE DirtD_UnPackInitOutput( 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(DirtD_InitOutputType), 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 + LOGICAL :: mask0 + LOGICAL, ALLOCATABLE :: mask1(:) + LOGICAL, ALLOCATABLE :: mask2(:,:) + LOGICAL, ALLOCATABLE :: mask3(:,:,:) + LOGICAL, ALLOCATABLE :: mask4(:,:,:,:) + LOGICAL, ALLOCATABLE :: mask5(:,:,:,:,:) + INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_UnPackInitOutput' + ! 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 ! WriteOutputHdr 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 (ALLOCATED(OutData%WriteOutputHdr)) DEALLOCATE(OutData%WriteOutputHdr) + ALLOCATE(OutData%WriteOutputHdr(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WriteOutputHdr.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + ALLOCATE(mask1(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating mask1.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + mask1 = .TRUE. + DO i1 = LBOUND(OutData%WriteOutputHdr,1), UBOUND(OutData%WriteOutputHdr,1) + DO I = 1, LEN(OutData%WriteOutputHdr) + OutData%WriteOutputHdr(i1)(I:I) = CHAR(IntKiBuf(Int_Xferred)) + Int_Xferred = Int_Xferred + 1 + END DO ! I + END DO !i1 + DEALLOCATE(mask1) + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WriteOutputUnt 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 (ALLOCATED(OutData%WriteOutputUnt)) DEALLOCATE(OutData%WriteOutputUnt) + ALLOCATE(OutData%WriteOutputUnt(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WriteOutputUnt.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + ALLOCATE(mask1(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating mask1.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + mask1 = .TRUE. + DO i1 = LBOUND(OutData%WriteOutputUnt,1), UBOUND(OutData%WriteOutputUnt,1) + DO I = 1, LEN(OutData%WriteOutputUnt) + OutData%WriteOutputUnt(i1)(I:I) = CHAR(IntKiBuf(Int_Xferred)) + Int_Xferred = Int_Xferred + 1 + END DO ! I + END DO !i1 + DEALLOCATE(mask1) + END IF + END SUBROUTINE DirtD_UnPackInitOutput + + SUBROUTINE DirtD_CopyContState( SrcContStateData, DstContStateData, CtrlCode, ErrStat, ErrMsg ) + TYPE(DirtD_ContinuousStateType), INTENT(IN) :: SrcContStateData + TYPE(DirtD_ContinuousStateType), INTENT(INOUT) :: DstContStateData + INTEGER(IntKi), INTENT(IN ) :: CtrlCode + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg +! Local + INTEGER(IntKi) :: i,j,k + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_CopyContState' +! + ErrStat = ErrID_None + ErrMsg = "" + DstContStateData%DummyContState = SrcContStateData%DummyContState + END SUBROUTINE DirtD_CopyContState + + SUBROUTINE DirtD_DestroyContState( ContStateData, ErrStat, ErrMsg ) + TYPE(DirtD_ContinuousStateType), INTENT(INOUT) :: ContStateData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_DestroyContState' + INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 +! + ErrStat = ErrID_None + ErrMsg = "" + END SUBROUTINE DirtD_DestroyContState + + SUBROUTINE DirtD_PackContState( 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(DirtD_ContinuousStateType), 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 = 'DirtD_PackContState' + ! 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 + Re_BufSz = Re_BufSz + 1 ! DummyContState + 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) + + Re_Xferred = 1 + Db_Xferred = 1 + Int_Xferred = 1 + + ReKiBuf ( Re_Xferred:Re_Xferred+(1)-1 ) = InData%DummyContState + Re_Xferred = Re_Xferred + 1 + END SUBROUTINE DirtD_PackContState + + SUBROUTINE DirtD_UnPackContState( 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(DirtD_ContinuousStateType), 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 + LOGICAL :: mask0 + LOGICAL, ALLOCATABLE :: mask1(:) + LOGICAL, ALLOCATABLE :: mask2(:,:) + LOGICAL, ALLOCATABLE :: mask3(:,:,:) + LOGICAL, ALLOCATABLE :: mask4(:,:,:,:) + LOGICAL, ALLOCATABLE :: mask5(:,:,:,:,:) + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_UnPackContState' + ! 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 + OutData%DummyContState = ReKiBuf( Re_Xferred ) + Re_Xferred = Re_Xferred + 1 + END SUBROUTINE DirtD_UnPackContState + + SUBROUTINE DirtD_CopyDiscState( SrcDiscStateData, DstDiscStateData, CtrlCode, ErrStat, ErrMsg ) + TYPE(DirtD_DiscreteStateType), INTENT(IN) :: SrcDiscStateData + TYPE(DirtD_DiscreteStateType), INTENT(INOUT) :: DstDiscStateData + INTEGER(IntKi), INTENT(IN ) :: CtrlCode + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg +! Local + INTEGER(IntKi) :: i,j,k + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_CopyDiscState' +! + ErrStat = ErrID_None + ErrMsg = "" + DstDiscStateData%DummyDiscState = SrcDiscStateData%DummyDiscState + END SUBROUTINE DirtD_CopyDiscState + + SUBROUTINE DirtD_DestroyDiscState( DiscStateData, ErrStat, ErrMsg ) + TYPE(DirtD_DiscreteStateType), INTENT(INOUT) :: DiscStateData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_DestroyDiscState' + INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 +! + ErrStat = ErrID_None + ErrMsg = "" + END SUBROUTINE DirtD_DestroyDiscState + + SUBROUTINE DirtD_PackDiscState( 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(DirtD_DiscreteStateType), 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 = 'DirtD_PackDiscState' + ! 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 + Re_BufSz = Re_BufSz + 1 ! DummyDiscState + 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) + + Re_Xferred = 1 + Db_Xferred = 1 + Int_Xferred = 1 + + ReKiBuf ( Re_Xferred:Re_Xferred+(1)-1 ) = InData%DummyDiscState + Re_Xferred = Re_Xferred + 1 + END SUBROUTINE DirtD_PackDiscState + + SUBROUTINE DirtD_UnPackDiscState( 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(DirtD_DiscreteStateType), 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 + LOGICAL :: mask0 + LOGICAL, ALLOCATABLE :: mask1(:) + LOGICAL, ALLOCATABLE :: mask2(:,:) + LOGICAL, ALLOCATABLE :: mask3(:,:,:) + LOGICAL, ALLOCATABLE :: mask4(:,:,:,:) + LOGICAL, ALLOCATABLE :: mask5(:,:,:,:,:) + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_UnPackDiscState' + ! 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 + OutData%DummyDiscState = ReKiBuf( Re_Xferred ) + Re_Xferred = Re_Xferred + 1 + END SUBROUTINE DirtD_UnPackDiscState + + SUBROUTINE DirtD_CopyConstrState( SrcConstrStateData, DstConstrStateData, CtrlCode, ErrStat, ErrMsg ) + TYPE(DirtD_ConstraintStateType), INTENT(IN) :: SrcConstrStateData + TYPE(DirtD_ConstraintStateType), INTENT(INOUT) :: DstConstrStateData + INTEGER(IntKi), INTENT(IN ) :: CtrlCode + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg +! Local + INTEGER(IntKi) :: i,j,k + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_CopyConstrState' +! + ErrStat = ErrID_None + ErrMsg = "" + DstConstrStateData%DummyConstrState = SrcConstrStateData%DummyConstrState + END SUBROUTINE DirtD_CopyConstrState + + SUBROUTINE DirtD_DestroyConstrState( ConstrStateData, ErrStat, ErrMsg ) + TYPE(DirtD_ConstraintStateType), INTENT(INOUT) :: ConstrStateData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_DestroyConstrState' + INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 +! + ErrStat = ErrID_None + ErrMsg = "" + END SUBROUTINE DirtD_DestroyConstrState + + SUBROUTINE DirtD_PackConstrState( 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(DirtD_ConstraintStateType), 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 = 'DirtD_PackConstrState' + ! 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 + Re_BufSz = Re_BufSz + 1 ! DummyConstrState + 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) + + Re_Xferred = 1 + Db_Xferred = 1 + Int_Xferred = 1 + + ReKiBuf ( Re_Xferred:Re_Xferred+(1)-1 ) = InData%DummyConstrState + Re_Xferred = Re_Xferred + 1 + END SUBROUTINE DirtD_PackConstrState + + SUBROUTINE DirtD_UnPackConstrState( 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(DirtD_ConstraintStateType), 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 + LOGICAL :: mask0 + LOGICAL, ALLOCATABLE :: mask1(:) + LOGICAL, ALLOCATABLE :: mask2(:,:) + LOGICAL, ALLOCATABLE :: mask3(:,:,:) + LOGICAL, ALLOCATABLE :: mask4(:,:,:,:) + LOGICAL, ALLOCATABLE :: mask5(:,:,:,:,:) + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_UnPackConstrState' + ! 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 + OutData%DummyConstrState = ReKiBuf( Re_Xferred ) + Re_Xferred = Re_Xferred + 1 + END SUBROUTINE DirtD_UnPackConstrState + + SUBROUTINE DirtD_CopyOtherState( SrcOtherStateData, DstOtherStateData, CtrlCode, ErrStat, ErrMsg ) + TYPE(DirtD_OtherStateType), INTENT(IN) :: SrcOtherStateData + TYPE(DirtD_OtherStateType), INTENT(INOUT) :: DstOtherStateData + INTEGER(IntKi), INTENT(IN ) :: CtrlCode + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg +! Local + INTEGER(IntKi) :: i,j,k + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_CopyOtherState' +! + ErrStat = ErrID_None + ErrMsg = "" + DstOtherStateData%DummyOtherState = SrcOtherStateData%DummyOtherState + END SUBROUTINE DirtD_CopyOtherState + + SUBROUTINE DirtD_DestroyOtherState( OtherStateData, ErrStat, ErrMsg ) + TYPE(DirtD_OtherStateType), INTENT(INOUT) :: OtherStateData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_DestroyOtherState' + INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 +! + ErrStat = ErrID_None + ErrMsg = "" + END SUBROUTINE DirtD_DestroyOtherState + + SUBROUTINE DirtD_PackOtherState( 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(DirtD_OtherStateType), 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 = 'DirtD_PackOtherState' + ! 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 ! DummyOtherState + 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) + + Re_Xferred = 1 + Db_Xferred = 1 + Int_Xferred = 1 + + IntKiBuf ( Int_Xferred:Int_Xferred+(1)-1 ) = InData%DummyOtherState + Int_Xferred = Int_Xferred + 1 + END SUBROUTINE DirtD_PackOtherState + + SUBROUTINE DirtD_UnPackOtherState( 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(DirtD_OtherStateType), 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 + LOGICAL :: mask0 + LOGICAL, ALLOCATABLE :: mask1(:) + LOGICAL, ALLOCATABLE :: mask2(:,:) + LOGICAL, ALLOCATABLE :: mask3(:,:,:) + LOGICAL, ALLOCATABLE :: mask4(:,:,:,:) + LOGICAL, ALLOCATABLE :: mask5(:,:,:,:,:) + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_UnPackOtherState' + ! 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 + OutData%DummyOtherState = IntKiBuf( Int_Xferred ) + Int_Xferred = Int_Xferred + 1 + END SUBROUTINE DirtD_UnPackOtherState + + SUBROUTINE DirtD_CopyMisc( SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg ) + TYPE(DirtD_MiscVarType), INTENT(IN) :: SrcMiscData + TYPE(DirtD_MiscVarType), INTENT(INOUT) :: DstMiscData + INTEGER(IntKi), INTENT(IN ) :: CtrlCode + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg +! Local + INTEGER(IntKi) :: i,j,k + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_CopyMisc' +! + ErrStat = ErrID_None + ErrMsg = "" + CALL DirtD_Copyredwindlltype( SrcMiscData%dll_data, DstMiscData%dll_data, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN + END SUBROUTINE DirtD_CopyMisc + + SUBROUTINE DirtD_DestroyMisc( MiscData, ErrStat, ErrMsg ) + TYPE(DirtD_MiscVarType), INTENT(INOUT) :: MiscData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_DestroyMisc' + INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 +! + ErrStat = ErrID_None + ErrMsg = "" + CALL DirtD_Destroyredwindlltype( MiscData%dll_data, ErrStat, ErrMsg ) + END SUBROUTINE DirtD_DestroyMisc + + SUBROUTINE DirtD_PackMisc( 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(DirtD_MiscVarType), 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 = 'DirtD_PackMisc' + ! 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 + ! Allocate buffers for subtypes, if any (we'll get sizes from these) + Int_BufSz = Int_BufSz + 3 ! dll_data: size of buffers for each call to pack subtype + CALL DirtD_Packredwindlltype( Re_Buf, Db_Buf, Int_Buf, InData%dll_data, ErrStat2, ErrMsg2, .TRUE. ) ! dll_data + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! dll_data + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! dll_data + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! dll_data + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + 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) + + Re_Xferred = 1 + Db_Xferred = 1 + Int_Xferred = 1 + + CALL DirtD_Packredwindlltype( Re_Buf, Db_Buf, Int_Buf, InData%dll_data, ErrStat2, ErrMsg2, OnlySize ) ! dll_data + 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 + END SUBROUTINE DirtD_PackMisc + + SUBROUTINE DirtD_UnPackMisc( 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(DirtD_MiscVarType), 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 + LOGICAL :: mask0 + LOGICAL, ALLOCATABLE :: mask1(:) + LOGICAL, ALLOCATABLE :: mask2(:,:) + LOGICAL, ALLOCATABLE :: mask3(:,:,:) + LOGICAL, ALLOCATABLE :: mask4(:,:,:,:) + LOGICAL, ALLOCATABLE :: mask5(:,:,:,:,:) + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_UnPackMisc' + ! 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 + 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 DirtD_Unpackredwindlltype( Re_Buf, Db_Buf, Int_Buf, OutData%dll_data, ErrStat2, ErrMsg2 ) ! dll_data + 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) + END SUBROUTINE DirtD_UnPackMisc + + SUBROUTINE DirtD_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg ) + TYPE(DirtD_ParameterType), INTENT(IN) :: SrcParamData + TYPE(DirtD_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) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_CopyParam' +! + ErrStat = ErrID_None + ErrMsg = "" + DstParamData%DT = SrcParamData%DT + DstParamData%DLL_InFile = SrcParamData%DLL_InFile + DstParamData%DLL_Trgt = SrcParamData%DLL_Trgt + DstParamData%DLL_DT = SrcParamData%DLL_DT + DstParamData%RootName = SrcParamData%RootName + DstParamData%UseREDWINinterface = SrcParamData%UseREDWINinterface + END SUBROUTINE DirtD_CopyParam + + SUBROUTINE DirtD_DestroyParam( ParamData, ErrStat, ErrMsg ) + TYPE(DirtD_ParameterType), INTENT(INOUT) :: ParamData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_DestroyParam' + INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 +! + ErrStat = ErrID_None + ErrMsg = "" + CALL FreeDynamicLib( ParamData%DLL_Trgt, ErrStat, ErrMsg ) + END SUBROUTINE DirtD_DestroyParam + + SUBROUTINE DirtD_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(DirtD_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 = 'DirtD_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 + Db_BufSz = Db_BufSz + 1 ! DT + Int_BufSz = Int_BufSz + 1*LEN(InData%DLL_InFile) ! DLL_InFile + ! Allocate buffers for subtypes, if any (we'll get sizes from these) + Int_BufSz = Int_BufSz + 3 ! DLL_Trgt: size of buffers for each call to pack subtype + CALL DLLTypePack( InData%DLL_Trgt, Re_Buf, Db_Buf, Int_Buf, ErrStat2, ErrMsg2, .TRUE. ) ! DLL_Trgt + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! DLL_Trgt + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! DLL_Trgt + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! DLL_Trgt + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF + Db_BufSz = Db_BufSz + 1 ! DLL_DT + Int_BufSz = Int_BufSz + 1*LEN(InData%RootName) ! RootName + Int_BufSz = Int_BufSz + 1 ! UseREDWINinterface + 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) + + Re_Xferred = 1 + Db_Xferred = 1 + Int_Xferred = 1 + + DbKiBuf ( Db_Xferred:Db_Xferred+(1)-1 ) = InData%DT + Db_Xferred = Db_Xferred + 1 + DO I = 1, LEN(InData%DLL_InFile) + IntKiBuf(Int_Xferred) = ICHAR(InData%DLL_InFile(I:I), IntKi) + Int_Xferred = Int_Xferred + 1 + END DO ! I + CALL DLLTypePack( InData%DLL_Trgt, Re_Buf, Db_Buf, Int_Buf, ErrStat2, ErrMsg2, OnlySize ) ! DLL_Trgt + 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 + DbKiBuf ( Db_Xferred:Db_Xferred+(1)-1 ) = InData%DLL_DT + Db_Xferred = Db_Xferred + 1 + DO I = 1, LEN(InData%RootName) + IntKiBuf(Int_Xferred) = ICHAR(InData%RootName(I:I), IntKi) + Int_Xferred = Int_Xferred + 1 + END DO ! I + IntKiBuf ( Int_Xferred:Int_Xferred+1-1 ) = TRANSFER( InData%UseREDWINinterface , IntKiBuf(1), 1) + Int_Xferred = Int_Xferred + 1 + END SUBROUTINE DirtD_PackParam + + SUBROUTINE DirtD_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(DirtD_ParameterType), 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 + LOGICAL :: mask0 + LOGICAL, ALLOCATABLE :: mask1(:) + LOGICAL, ALLOCATABLE :: mask2(:,:) + LOGICAL, ALLOCATABLE :: mask3(:,:,:) + LOGICAL, ALLOCATABLE :: mask4(:,:,:,:) + LOGICAL, ALLOCATABLE :: mask5(:,:,:,:,:) + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_UnPackParam' + ! 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 + OutData%DT = DbKiBuf( Db_Xferred ) + Db_Xferred = Db_Xferred + 1 + DO I = 1, LEN(OutData%DLL_InFile) + OutData%DLL_InFile(I:I) = CHAR(IntKiBuf(Int_Xferred)) + Int_Xferred = Int_Xferred + 1 + END DO ! I + 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 DLLTypeUnpack( OutData%DLL_Trgt, Re_Buf, Db_Buf, Int_Buf, ErrStat2, ErrMsg2 ) ! DLL_Trgt + 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%DLL_DT = DbKiBuf( Db_Xferred ) + Db_Xferred = Db_Xferred + 1 + DO I = 1, LEN(OutData%RootName) + OutData%RootName(I:I) = CHAR(IntKiBuf(Int_Xferred)) + Int_Xferred = Int_Xferred + 1 + END DO ! I + OutData%UseREDWINinterface = TRANSFER( IntKiBuf( Int_Xferred ), mask0 ) + Int_Xferred = Int_Xferred + 1 + END SUBROUTINE DirtD_UnPackParam + + SUBROUTINE DirtD_CopyInput( SrcInputData, DstInputData, CtrlCode, ErrStat, ErrMsg ) + TYPE(DirtD_InputType), INTENT(IN) :: SrcInputData + TYPE(DirtD_InputType), INTENT(INOUT) :: DstInputData + INTEGER(IntKi), INTENT(IN ) :: CtrlCode + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg +! Local + INTEGER(IntKi) :: i,j,k + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_CopyInput' +! + ErrStat = ErrID_None + ErrMsg = "" + DstInputData%DummyInput = SrcInputData%DummyInput + END SUBROUTINE DirtD_CopyInput + + SUBROUTINE DirtD_DestroyInput( InputData, ErrStat, ErrMsg ) + TYPE(DirtD_InputType), INTENT(INOUT) :: InputData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_DestroyInput' + INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 +! + ErrStat = ErrID_None + ErrMsg = "" + END SUBROUTINE DirtD_DestroyInput + + SUBROUTINE DirtD_PackInput( 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(DirtD_InputType), 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 = 'DirtD_PackInput' + ! 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 + Re_BufSz = Re_BufSz + 1 ! DummyInput + 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) + + Re_Xferred = 1 + Db_Xferred = 1 + Int_Xferred = 1 + + ReKiBuf ( Re_Xferred:Re_Xferred+(1)-1 ) = InData%DummyInput + Re_Xferred = Re_Xferred + 1 + END SUBROUTINE DirtD_PackInput + + SUBROUTINE DirtD_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(DirtD_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 + LOGICAL :: mask0 + LOGICAL, ALLOCATABLE :: mask1(:) + LOGICAL, ALLOCATABLE :: mask2(:,:) + LOGICAL, ALLOCATABLE :: mask3(:,:,:) + LOGICAL, ALLOCATABLE :: mask4(:,:,:,:) + LOGICAL, ALLOCATABLE :: mask5(:,:,:,:,:) + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_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 + OutData%DummyInput = ReKiBuf( Re_Xferred ) + Re_Xferred = Re_Xferred + 1 + END SUBROUTINE DirtD_UnPackInput + + SUBROUTINE DirtD_CopyOutput( SrcOutputData, DstOutputData, CtrlCode, ErrStat, ErrMsg ) + TYPE(DirtD_OutputType), INTENT(IN) :: SrcOutputData + TYPE(DirtD_OutputType), INTENT(INOUT) :: DstOutputData + 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 = 'DirtD_CopyOutput' +! + ErrStat = ErrID_None + ErrMsg = "" + DstOutputData%DummyOutput = SrcOutputData%DummyOutput +IF (ALLOCATED(SrcOutputData%WriteOutput)) THEN + i1_l = LBOUND(SrcOutputData%WriteOutput,1) + i1_u = UBOUND(SrcOutputData%WriteOutput,1) + IF (.NOT. ALLOCATED(DstOutputData%WriteOutput)) THEN + ALLOCATE(DstOutputData%WriteOutput(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%WriteOutput.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstOutputData%WriteOutput = SrcOutputData%WriteOutput +ENDIF + END SUBROUTINE DirtD_CopyOutput + + SUBROUTINE DirtD_DestroyOutput( OutputData, ErrStat, ErrMsg ) + TYPE(DirtD_OutputType), INTENT(INOUT) :: OutputData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_DestroyOutput' + INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 +! + ErrStat = ErrID_None + ErrMsg = "" +IF (ALLOCATED(OutputData%WriteOutput)) THEN + DEALLOCATE(OutputData%WriteOutput) +ENDIF + END SUBROUTINE DirtD_DestroyOutput + + SUBROUTINE DirtD_PackOutput( 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(DirtD_OutputType), 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 = 'DirtD_PackOutput' + ! 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 + Re_BufSz = Re_BufSz + 1 ! DummyOutput + Int_BufSz = Int_BufSz + 1 ! WriteOutput allocated yes/no + IF ( ALLOCATED(InData%WriteOutput) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! WriteOutput upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%WriteOutput) ! WriteOutput + 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) + + Re_Xferred = 1 + Db_Xferred = 1 + Int_Xferred = 1 + + ReKiBuf ( Re_Xferred:Re_Xferred+(1)-1 ) = InData%DummyOutput + Re_Xferred = Re_Xferred + 1 + IF ( .NOT. ALLOCATED(InData%WriteOutput) ) 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%WriteOutput,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%WriteOutput,1) + Int_Xferred = Int_Xferred + 2 + + IF (SIZE(InData%WriteOutput)>0) ReKiBuf ( Re_Xferred:Re_Xferred+(SIZE(InData%WriteOutput))-1 ) = PACK(InData%WriteOutput,.TRUE.) + Re_Xferred = Re_Xferred + SIZE(InData%WriteOutput) + END IF + END SUBROUTINE DirtD_PackOutput + + SUBROUTINE DirtD_UnPackOutput( 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(DirtD_OutputType), 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 + LOGICAL :: mask0 + LOGICAL, ALLOCATABLE :: mask1(:) + LOGICAL, ALLOCATABLE :: mask2(:,:) + LOGICAL, ALLOCATABLE :: mask3(:,:,:) + LOGICAL, ALLOCATABLE :: mask4(:,:,:,:) + LOGICAL, ALLOCATABLE :: mask5(:,:,:,:,:) + INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_UnPackOutput' + ! 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 + OutData%DummyOutput = ReKiBuf( Re_Xferred ) + Re_Xferred = Re_Xferred + 1 + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! WriteOutput 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 (ALLOCATED(OutData%WriteOutput)) DEALLOCATE(OutData%WriteOutput) + ALLOCATE(OutData%WriteOutput(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%WriteOutput.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + ALLOCATE(mask1(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating mask1.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + mask1 = .TRUE. + IF (SIZE(OutData%WriteOutput)>0) OutData%WriteOutput = UNPACK(ReKiBuf( Re_Xferred:Re_Xferred+(SIZE(OutData%WriteOutput))-1 ), mask1, 0.0_ReKi ) + Re_Xferred = Re_Xferred + SIZE(OutData%WriteOutput) + DEALLOCATE(mask1) + END IF + END SUBROUTINE DirtD_UnPackOutput + + + SUBROUTINE DirtD_Input_ExtrapInterp(u, t, u_out, t_out, ErrStat, ErrMsg ) +! +! This subroutine calculates a extrapolated (or interpolated) Input u_out at time t_out, from previous/future time +! values of u (which has values associated with times in t). Order of the interpolation is given by the size of u +! +! expressions below based on either +! +! f(t) = a +! f(t) = a + b * t, or +! f(t) = a + b * t + c * t**2 +! +! where a, b and c are determined as the solution to +! f(t1) = u1, f(t2) = u2, f(t3) = u3 (as appropriate) +! +!.................................................................................................................................. + + TYPE(DirtD_InputType), INTENT(IN) :: u(:) ! Input at t1 > t2 > t3 + REAL(DbKi), INTENT(IN ) :: t(:) ! Times associated with the Inputs + TYPE(DirtD_InputType), INTENT(INOUT) :: u_out ! Input at tin_out + REAL(DbKi), INTENT(IN ) :: t_out ! time to be extrap/interp'd to + INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None + ! local variables + INTEGER(IntKi) :: order ! order of polynomial fit (max 2) + INTEGER(IntKi) :: ErrStat2 ! local errors + CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors + CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_Input_ExtrapInterp' + ! Initialize ErrStat + ErrStat = ErrID_None + ErrMsg = "" + if ( size(t) .ne. size(u)) then + CALL SetErrStat(ErrID_Fatal,'size(t) must equal size(u)',ErrStat,ErrMsg,RoutineName) + RETURN + endif + order = SIZE(u) - 1 + IF ( order .eq. 0 ) THEN + CALL DirtD_CopyInput(u(1), u_out, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + ELSE IF ( order .eq. 1 ) THEN + CALL DirtD_Input_ExtrapInterp1(u(1), u(2), t, u_out, t_out, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + ELSE IF ( order .eq. 2 ) THEN + CALL DirtD_Input_ExtrapInterp2(u(1), u(2), u(3), t, u_out, t_out, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + ELSE + CALL SetErrStat(ErrID_Fatal,'size(u) must be less than 4 (order must be less than 3).',ErrStat,ErrMsg,RoutineName) + RETURN + ENDIF + END SUBROUTINE DirtD_Input_ExtrapInterp + + + SUBROUTINE DirtD_Input_ExtrapInterp1(u1, u2, tin, u_out, tin_out, ErrStat, ErrMsg ) +! +! This subroutine calculates a extrapolated (or interpolated) Input u_out at time t_out, from previous/future time +! values of u (which has values associated with times in t). Order of the interpolation is 1. +! +! f(t) = a + b * t, or +! +! where a and b are determined as the solution to +! f(t1) = u1, f(t2) = u2 +! +!.................................................................................................................................. + + TYPE(DirtD_InputType), INTENT(IN) :: u1 ! Input at t1 > t2 + TYPE(DirtD_InputType), INTENT(IN) :: u2 ! Input at t2 + REAL(DbKi), INTENT(IN ) :: tin(2) ! Times associated with the Inputs + TYPE(DirtD_InputType), INTENT(INOUT) :: u_out ! Input at tin_out + REAL(DbKi), INTENT(IN ) :: tin_out ! time to be extrap/interp'd to + INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None + ! local variables + REAL(DbKi) :: t(2) ! Times associated with the Inputs + REAL(DbKi) :: t_out ! Time to which to be extrap/interpd + CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_Input_ExtrapInterp1' + REAL(DbKi) :: b0 ! temporary for extrapolation/interpolation + REAL(DbKi) :: c0 ! temporary for extrapolation/interpolation + INTEGER(IntKi) :: ErrStat2 ! local errors + CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors + ! Initialize ErrStat + ErrStat = ErrID_None + ErrMsg = "" + ! we'll subtract a constant from the times to resolve some + ! numerical issues when t gets large (and to simplify the equations) + t = tin - tin(1) + t_out = tin_out - tin(1) + + IF ( EqualRealNos( t(1), t(2) ) ) THEN + CALL SetErrStat(ErrID_Fatal, 't(1) must not equal t(2) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + b0 = -(u1%DummyInput - u2%DummyInput)/t(2) + u_out%DummyInput = u1%DummyInput + b0 * t_out + END SUBROUTINE DirtD_Input_ExtrapInterp1 + + + SUBROUTINE DirtD_Input_ExtrapInterp2(u1, u2, u3, tin, u_out, tin_out, ErrStat, ErrMsg ) +! +! This subroutine calculates a extrapolated (or interpolated) Input u_out at time t_out, from previous/future time +! values of u (which has values associated with times in t). Order of the interpolation is 2. +! +! expressions below based on either +! +! f(t) = a + b * t + c * t**2 +! +! where a, b and c are determined as the solution to +! f(t1) = u1, f(t2) = u2, f(t3) = u3 +! +!.................................................................................................................................. + + TYPE(DirtD_InputType), INTENT(IN) :: u1 ! Input at t1 > t2 > t3 + TYPE(DirtD_InputType), INTENT(IN) :: u2 ! Input at t2 > t3 + TYPE(DirtD_InputType), INTENT(IN) :: u3 ! Input at t3 + REAL(DbKi), INTENT(IN ) :: tin(3) ! Times associated with the Inputs + TYPE(DirtD_InputType), INTENT(INOUT) :: u_out ! Input at tin_out + REAL(DbKi), INTENT(IN ) :: tin_out ! time to be extrap/interp'd to + INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None + ! local variables + REAL(DbKi) :: t(3) ! Times associated with the Inputs + REAL(DbKi) :: t_out ! Time to which to be extrap/interpd + INTEGER(IntKi) :: order ! order of polynomial fit (max 2) + REAL(DbKi) :: b0 ! temporary for extrapolation/interpolation + REAL(DbKi) :: c0 ! temporary for extrapolation/interpolation + INTEGER(IntKi) :: ErrStat2 ! local errors + CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors + CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_Input_ExtrapInterp2' + ! Initialize ErrStat + ErrStat = ErrID_None + ErrMsg = "" + ! we'll subtract a constant from the times to resolve some + ! numerical issues when t gets large (and to simplify the equations) + t = tin - tin(1) + t_out = tin_out - tin(1) + + IF ( EqualRealNos( t(1), t(2) ) ) THEN + CALL SetErrStat(ErrID_Fatal, 't(1) must not equal t(2) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) + RETURN + ELSE IF ( EqualRealNos( t(2), t(3) ) ) THEN + CALL SetErrStat(ErrID_Fatal, 't(2) must not equal t(3) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) + RETURN + ELSE IF ( EqualRealNos( t(1), t(3) ) ) THEN + CALL SetErrStat(ErrID_Fatal, 't(1) must not equal t(3) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + b0 = (t(3)**2*(u1%DummyInput - u2%DummyInput) + t(2)**2*(-u1%DummyInput + u3%DummyInput))/(t(2)*t(3)*(t(2) - t(3))) + c0 = ( (t(2)-t(3))*u1%DummyInput + t(3)*u2%DummyInput - t(2)*u3%DummyInput ) / (t(2)*t(3)*(t(2) - t(3))) + u_out%DummyInput = u1%DummyInput + b0 * t_out + c0 * t_out**2 + END SUBROUTINE DirtD_Input_ExtrapInterp2 + + + SUBROUTINE DirtD_Output_ExtrapInterp(y, t, y_out, t_out, ErrStat, ErrMsg ) +! +! This subroutine calculates a extrapolated (or interpolated) Output y_out at time t_out, from previous/future time +! values of y (which has values associated with times in t). Order of the interpolation is given by the size of y +! +! expressions below based on either +! +! f(t) = a +! f(t) = a + b * t, or +! f(t) = a + b * t + c * t**2 +! +! where a, b and c are determined as the solution to +! f(t1) = y1, f(t2) = y2, f(t3) = y3 (as appropriate) +! +!.................................................................................................................................. + + TYPE(DirtD_OutputType), INTENT(IN) :: y(:) ! Output at t1 > t2 > t3 + REAL(DbKi), INTENT(IN ) :: t(:) ! Times associated with the Outputs + TYPE(DirtD_OutputType), INTENT(INOUT) :: y_out ! Output at tin_out + REAL(DbKi), INTENT(IN ) :: t_out ! time to be extrap/interp'd to + INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None + ! local variables + INTEGER(IntKi) :: order ! order of polynomial fit (max 2) + INTEGER(IntKi) :: ErrStat2 ! local errors + CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors + CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_Output_ExtrapInterp' + ! Initialize ErrStat + ErrStat = ErrID_None + ErrMsg = "" + if ( size(t) .ne. size(y)) then + CALL SetErrStat(ErrID_Fatal,'size(t) must equal size(y)',ErrStat,ErrMsg,RoutineName) + RETURN + endif + order = SIZE(y) - 1 + IF ( order .eq. 0 ) THEN + CALL DirtD_CopyOutput(y(1), y_out, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + ELSE IF ( order .eq. 1 ) THEN + CALL DirtD_Output_ExtrapInterp1(y(1), y(2), t, y_out, t_out, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + ELSE IF ( order .eq. 2 ) THEN + CALL DirtD_Output_ExtrapInterp2(y(1), y(2), y(3), t, y_out, t_out, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + ELSE + CALL SetErrStat(ErrID_Fatal,'size(y) must be less than 4 (order must be less than 3).',ErrStat,ErrMsg,RoutineName) + RETURN + ENDIF + END SUBROUTINE DirtD_Output_ExtrapInterp + + + SUBROUTINE DirtD_Output_ExtrapInterp1(y1, y2, tin, y_out, tin_out, ErrStat, ErrMsg ) +! +! This subroutine calculates a extrapolated (or interpolated) Output y_out at time t_out, from previous/future time +! values of y (which has values associated with times in t). Order of the interpolation is 1. +! +! f(t) = a + b * t, or +! +! where a and b are determined as the solution to +! f(t1) = y1, f(t2) = y2 +! +!.................................................................................................................................. + + TYPE(DirtD_OutputType), INTENT(IN) :: y1 ! Output at t1 > t2 + TYPE(DirtD_OutputType), INTENT(IN) :: y2 ! Output at t2 + REAL(DbKi), INTENT(IN ) :: tin(2) ! Times associated with the Outputs + TYPE(DirtD_OutputType), INTENT(INOUT) :: y_out ! Output at tin_out + REAL(DbKi), INTENT(IN ) :: tin_out ! time to be extrap/interp'd to + INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None + ! local variables + REAL(DbKi) :: t(2) ! Times associated with the Outputs + REAL(DbKi) :: t_out ! Time to which to be extrap/interpd + CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_Output_ExtrapInterp1' + REAL(DbKi) :: b0 ! temporary for extrapolation/interpolation + REAL(DbKi) :: c0 ! temporary for extrapolation/interpolation + REAL(DbKi),ALLOCATABLE,DIMENSION(:) :: b1 ! temporary for extrapolation/interpolation + REAL(DbKi),ALLOCATABLE,DIMENSION(:) :: c1 ! temporary for extrapolation/interpolation + INTEGER(IntKi) :: ErrStat2 ! local errors + CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors + ! Initialize ErrStat + ErrStat = ErrID_None + ErrMsg = "" + ! we'll subtract a constant from the times to resolve some + ! numerical issues when t gets large (and to simplify the equations) + t = tin - tin(1) + t_out = tin_out - tin(1) + + IF ( EqualRealNos( t(1), t(2) ) ) THEN + CALL SetErrStat(ErrID_Fatal, 't(1) must not equal t(2) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + b0 = -(y1%DummyOutput - y2%DummyOutput)/t(2) + y_out%DummyOutput = y1%DummyOutput + b0 * t_out +IF (ALLOCATED(y_out%WriteOutput) .AND. ALLOCATED(y1%WriteOutput)) THEN + ALLOCATE(b1(SIZE(y_out%WriteOutput,1))) + ALLOCATE(c1(SIZE(y_out%WriteOutput,1))) + b1 = -(y1%WriteOutput - y2%WriteOutput)/t(2) + y_out%WriteOutput = y1%WriteOutput + b1 * t_out + DEALLOCATE(b1) + DEALLOCATE(c1) +END IF ! check if allocated + END SUBROUTINE DirtD_Output_ExtrapInterp1 + + + SUBROUTINE DirtD_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat, ErrMsg ) +! +! This subroutine calculates a extrapolated (or interpolated) Output y_out at time t_out, from previous/future time +! values of y (which has values associated with times in t). Order of the interpolation is 2. +! +! expressions below based on either +! +! f(t) = a + b * t + c * t**2 +! +! where a, b and c are determined as the solution to +! f(t1) = y1, f(t2) = y2, f(t3) = y3 +! +!.................................................................................................................................. + + TYPE(DirtD_OutputType), INTENT(IN) :: y1 ! Output at t1 > t2 > t3 + TYPE(DirtD_OutputType), INTENT(IN) :: y2 ! Output at t2 > t3 + TYPE(DirtD_OutputType), INTENT(IN) :: y3 ! Output at t3 + REAL(DbKi), INTENT(IN ) :: tin(3) ! Times associated with the Outputs + TYPE(DirtD_OutputType), INTENT(INOUT) :: y_out ! Output at tin_out + REAL(DbKi), INTENT(IN ) :: tin_out ! time to be extrap/interp'd to + INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None + ! local variables + REAL(DbKi) :: t(3) ! Times associated with the Outputs + REAL(DbKi) :: t_out ! Time to which to be extrap/interpd + INTEGER(IntKi) :: order ! order of polynomial fit (max 2) + REAL(DbKi) :: b0 ! temporary for extrapolation/interpolation + REAL(DbKi) :: c0 ! temporary for extrapolation/interpolation + REAL(DbKi),ALLOCATABLE,DIMENSION(:) :: b1 ! temporary for extrapolation/interpolation + REAL(DbKi),ALLOCATABLE,DIMENSION(:) :: c1 ! temporary for extrapolation/interpolation + INTEGER(IntKi) :: ErrStat2 ! local errors + CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors + CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_Output_ExtrapInterp2' + ! Initialize ErrStat + ErrStat = ErrID_None + ErrMsg = "" + ! we'll subtract a constant from the times to resolve some + ! numerical issues when t gets large (and to simplify the equations) + t = tin - tin(1) + t_out = tin_out - tin(1) + + IF ( EqualRealNos( t(1), t(2) ) ) THEN + CALL SetErrStat(ErrID_Fatal, 't(1) must not equal t(2) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) + RETURN + ELSE IF ( EqualRealNos( t(2), t(3) ) ) THEN + CALL SetErrStat(ErrID_Fatal, 't(2) must not equal t(3) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) + RETURN + ELSE IF ( EqualRealNos( t(1), t(3) ) ) THEN + CALL SetErrStat(ErrID_Fatal, 't(1) must not equal t(3) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + b0 = (t(3)**2*(y1%DummyOutput - y2%DummyOutput) + t(2)**2*(-y1%DummyOutput + y3%DummyOutput))/(t(2)*t(3)*(t(2) - t(3))) + c0 = ( (t(2)-t(3))*y1%DummyOutput + t(3)*y2%DummyOutput - t(2)*y3%DummyOutput ) / (t(2)*t(3)*(t(2) - t(3))) + y_out%DummyOutput = y1%DummyOutput + b0 * t_out + c0 * t_out**2 +IF (ALLOCATED(y_out%WriteOutput) .AND. ALLOCATED(y1%WriteOutput)) THEN + ALLOCATE(b1(SIZE(y_out%WriteOutput,1))) + ALLOCATE(c1(SIZE(y_out%WriteOutput,1))) + b1 = (t(3)**2*(y1%WriteOutput - y2%WriteOutput) + t(2)**2*(-y1%WriteOutput + y3%WriteOutput))/(t(2)*t(3)*(t(2) - t(3))) + c1 = ( (t(2)-t(3))*y1%WriteOutput + t(3)*y2%WriteOutput - t(2)*y3%WriteOutput ) / (t(2)*t(3)*(t(2) - t(3))) + y_out%WriteOutput = y1%WriteOutput + b1 * t_out + c1 * t_out**2 + DEALLOCATE(b1) + DEALLOCATE(c1) +END IF ! check if allocated + END SUBROUTINE DirtD_Output_ExtrapInterp2 + +END MODULE DirtDyn_Types +!ENDOFREGISTRYGENERATEDFILE diff --git a/modules/dirtdyn/src/REDWINinterface.f90 b/modules/dirtdyn/src/REDWINinterface.f90 new file mode 100644 index 000000000..5285e65ca --- /dev/null +++ b/modules/dirtdyn/src/REDWINinterface.f90 @@ -0,0 +1,281 @@ +!********************************************************************************************************************************** +! LICENSING +! Copyright (C) 2013-2016 National Renewable Energy Laboratory +! +! This file is part of FAST's Controls and Electrical Drive Module, "ServoDyn". +! +! Licensed under the Apache License, Version 2.0 (the "License"); +! you may not use this file except in compliance with the License. +! You may obtain a copy of the License at +! +! http://www.apache.org/licenses/LICENSE-2.0 +! +! Unless required by applicable law or agreed to in writing, software +! distributed under the License is distributed on an "AS IS" BASIS, +! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +! See the License for the specific language governing permissions and +! limitations under the License. +! +!********************************************************************************************************************************** +MODULE REDWINinterface + + USE NWTC_Library + USE DirtDyn_Types + USE, INTRINSIC :: ISO_C_Binding + + IMPLICIT NONE + + type(ProgDesc), parameter :: REDWINinterface_Ver = ProgDesc( 'DirtDyn Interface for REDWIN soil interaction DLLs', 'using '//TRIM(OS_Desc), '99-Feb-2020' ) + + !> Definition of the DLL Interface (from REDWIN): + !! Note that aviFAIL and avcMSG should be used as INTENT(OUT), but I'm defining them INTENT(INOUT) just in case the compiler decides to reinitialize something that's INTENT(OUT) + abstract interface + subroutine REDWINdll_interface(PROPSFILE, LDISPFILE, IDTask, nErrorCode, ErrorCode, Props, StVar, StVarPrint, Disp, Force, D) + USE, INTRINSIC :: ISO_C_Binding + ! Define standard arguments for 'InterfaceFoundation' + character(kind=c_char), intent(in ) :: PROPSFILE(45) + character(kind=c_char), intent(in ) :: LDISPFILE(45) + integer(c_int), intent(in ) :: IDTask + integer(c_int), intent( out) :: nErrorCode + real(c_double), intent(inout) :: Props(1:100, 1:200) + real(c_double), intent(inout) :: StVar(1:12, 1:100) + integer(c_int), intent(inout) :: StVarPrint(1:12, 1:100) + real(c_double), intent(inout) :: Disp(6) + real(c_double), intent(inout) :: Force(6) + real(c_double), intent(inout) :: D(6,6) + integer(c_int), intent(inout) :: ErrorCode(100) + end subroutine REDWINdll_interface + end interface + +#ifdef STATIC_DLL_LOAD + interface + subroutine INTERFACEFOUNDATION ( PROPSFILE, LDISPFILE, IDTask, nErrorCode, ErrorCode, Props, StVar, StVarPrint, Disp, Force, D ) BIND(C, NAME='INTERFACEFOUNDATION') + USE, INTRINSIC :: ISO_C_Binding + character(kind=c_char), intent(in ) :: PROPSFILE(45) + character(kind=c_char), intent(in ) :: LDISPFILE(45) + integer(c_int), intent(in ) :: IDTask + integer(c_int), intent( out) :: nErrorCode + real(c_double), intent(inout) :: Props(1:100, 1:200) + real(c_double), intent(inout) :: StVar(1:12, 1:100) + integer(c_int), intent(inout) :: StVarPrint(1:12, 1:100) + real(c_double), intent(inout) :: Disp(6) + real(c_double), intent(inout) :: Force(6) + real(c_double), intent(inout) :: D(6,6) + integer(c_int), intent(inout) :: ErrorCode(100) + end subroutine INTERFACEFOUNDATION + end interface +#endif + + + ! Some constants for the Interface: +! INTEGER(IntKi), PARAMETER :: R_v36 = 85 !< Start of below-rated torque-speed look-up table (record no.) for REDWIN version 3.6 +! INTEGER(IntKi), PARAMETER :: R_v4 = 145 !< Start of below-rated torque-speed look-up table (record no.) for REDWIN version 3.8 and later +! +! INTEGER(IntKi), PARAMETER :: R = R_v4 !< start of the generator speed look-up table + + +CONTAINS +!================================================================================================================================== +!> This SUBROUTINE is used to call the REDWIN-style DLL. +subroutine CallREDWINdll ( u, DLL, dll_data, p, ErrStat, ErrMsg ) + + ! Passed Variables: + type(DirtD_InputType), intent(in ) :: u ! System inputs + type(DLL_Type), intent(in ) :: DLL ! The DLL to be called. + type(REDWINdllType), intent(inout) :: dll_data ! data type containing the avrSWAP, accINFILE, and avcOUTNAME arrays + type(DirtD_ParameterType), intent(in ) :: p ! Parameters + + integer(IntKi), intent( out) :: ErrStat ! Error status of the operation + character(*), intent( out) :: ErrMsg ! Error message if ErrStat /= ErrID_None + +!FIXME: update these + ! Local Variables: + character(kind=c_char) :: accINFILE(LEN_TRIM(p%DLL_InFile)+1) ! INFILE + character(kind=c_char) :: avcOUTNAME(LEN_TRIM(p%RootName)+1) ! OUTNAME (Simulation RootName) + + PROCEDURE(REDWINdll_interface), POINTER :: REDWIN_Subroutine ! The address of the procedure in the RedWin DLL + +!FIXME: not sure if this step is needed for the REDWIN DLLs + !Convert to C-type characters: the "C_NULL_CHAR" converts the Fortran string to a C-type string (i.e., adds //CHAR(0) to the end) + accINFILE = TRANSFER( TRIM(p%DLL_InFile)//C_NULL_CHAR, accINFILE ) + avcOUTNAME = TRANSFER( TRIM(p%RootName)//C_NULL_CHAR, avcOUTNAME ) + +#ifdef STATIC_DLL_LOAD + ! if we're statically loading the library (i.e., OpenFOAM), we can just call INTERFACEFOUNDATION(); + CALL INTERFACEFOUNDATION( accINFILE, avcOUTNAME, & !PROPSFILE, LDISPFILE, & + dll_data%IDTask, dll_data%nErrorCode, dll_data%ErrorCode, & + dll_data%Props, dll_data%StVar, dll_data%StVarPrint, & + dll_data%Disp, dll_data%Force, dll_data%D ) +#else + ! Call the DLL (first associate the address from the procedure in the DLL with the subroutine): + CALL C_F_PROCPOINTER( DLL%ProcAddr(1), REDWIN_Subroutine) + CALL REDWIN_Subroutine ( accINFILE, avcOUTNAME, & !PROPSFILE, LDISPFILE, & + dll_data%IDTask, dll_data%nErrorCode, dll_data%ErrorCode, & + dll_data%Props, dll_data%StVar, dll_data%StVarPrint, & + dll_data%Disp, dll_data%Force, dll_data%D ) +#endif + + +!FIXME: add error trapping routine that parses the ErrorCodes. + + + return +end subroutine CallREDWINdll +!================================================================================================================================== +!> This routine initializes variables used in the REDWIN DLL interface. +subroutine REDWINinterface_Init(u,p,m,y,InputFileData, ErrStat, ErrMsg) + + type(DirtD_InputType), intent(inout) :: u !< An initial guess for the input; input mesh must be defined + type(DirtD_ParameterType), intent(inout) :: p !< Parameters + type(DirtD_MiscVarType), intent(inout) :: m !< Initial misc (optimization) variables + type(DirtD_OutputType), intent(inout) :: y !< Initial system outputs (outputs are not calculated; + !! only the output mesh is initialized) + type(DirtD_InputFile), intent(inout) :: InputFileData !< Data stored in the module's input file + integer(IntKi), intent( out) :: ErrStat !< Error status of the operation + character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + ! local variables + integer(IntKi) :: ErrStat2 ! The error status code + character(ErrMsgLen) :: ErrMsg2 ! The error message, if an error occurred + + + ! Define all the parameters for the REDWIN Interface + InputFileData%DLL_ProcName = 'INTERFACEFOUNDATION'//C_NULL_CHAR ! The name of the procedure in the DLL that will be called. + + ErrStat = ErrID_None + ErrMsg= '' + + CALL DispNVD( REDWINinterface_Ver ) ! Display the version of this interface + +! p%Ptch_Cntrl = InputFileData%Ptch_Cntrl + p%DLL_InFile = InputFileData%DLL_InFile + +!FIXME: do we need to set one? +! p%DLL_DT = InputFileData%DLL_DT +! IF ( .NOT. EqualRealNos( NINT( p%DLL_DT / p%DT ) * p%DT, p%DLL_DT ) ) THEN +! CALL CheckError( ErrID_Fatal, 'DLL_DT must be an integer multiple of DT.' ) +! END IF +! IF ( p%DLL_DT < EPSILON( p%DLL_DT ) ) THEN +! CALL CheckError( ErrID_Fatal, 'DLL_DT must be larger than zero.' ) +! END IF +! IF ( ErrStat >= AbortErrLev ) RETURN + +!FIXME: initialize whatever here (mesh mappings etc) + +#ifdef STATIC_DLL_LOAD + ! because OpenFOAM needs the MPI task to copy the library, we're not going to dynamically load it; it needs to be loaded at runtime. + p%DLL_Trgt%FileName = '' + p%DLL_Trgt%ProcName = '' +#else + ! Define and load the DLL: + p%DLL_Trgt%FileName = InputFileData%DLL_FileName + p%DLL_Trgt%ProcName = "" ! initialize all procedures to empty so we try to load only one + p%DLL_Trgt%ProcName(1) = InputFileData%DLL_ProcName + CALL LoadDynamicLib ( p%DLL_Trgt, ErrStat2, ErrMsg2 ) + CALL CheckError(ErrStat2,ErrMsg2) + IF ( ErrStat >= AbortErrLev ) RETURN +#endif + + ! Set status flag: + + !CALL CallREDWINdll(p%DLL_Trgt, m%dll_data, ErrStat2, ErrMsg2) + ! CALL CheckError(ErrStat2,ErrMsg2) + ! IF ( ErrStat >= AbortErrLev ) RETURN +CONTAINS + !............................................................................................................................... + subroutine CheckError(ErrID,Msg) + ! This subroutine sets the error message and level and cleans up if the error is >= AbortErrLev + !............................................................................................................................... + + ! Passed arguments + INTEGER(IntKi), INTENT(IN) :: ErrID ! The error identifier (ErrStat) + CHARACTER(*), INTENT(IN) :: Msg ! The error message (ErrMsg) + + + !............................................................................................................................ + ! Set error status/message; + !............................................................................................................................ + + IF ( ErrID /= ErrID_None ) THEN + + IF ( ErrStat /= ErrID_None ) ErrMsg = TRIM(ErrMsg)//NewLine + ErrMsg = TRIM(ErrMsg)//'REDWINinterface_Init:'//TRIM(Msg) + ErrStat = MAX(ErrStat, ErrID) + + !......................................................................................................................... + ! Clean up if we're going to return on error: close files, deallocate local arrays + !......................................................................................................................... + IF ( ErrStat >= AbortErrLev ) THEN + p%UseREDWINinterface = .FALSE. + END IF + + END IF + + + end subroutine CheckError +end subroutine REDWINinterface_Init +!================================================================================================================================== +!> This routine calls the DLL for the final time (if it was previously called), and frees the dynamic library. +subroutine REDWINinterface_End(u, p, m, ErrStat, ErrMsg) + + TYPE(DirtD_InputType), INTENT(IN ) :: u !< System inputs + TYPE(DirtD_ParameterType), INTENT(INOUT) :: p !< Parameters + TYPE(DirtD_MiscVarType), INTENT(INOUT) :: m !< misc (optimization) variables + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + ! local variables: + INTEGER(IntKi) :: ErrStat2 ! The error status code + CHARACTER(ErrMsgLen) :: ErrMsg2 ! The error message, if an error occurred + + ! call DLL final time, but skip if we've never called it +!FIXME: is there an end routine for the REDWIN DLLs???? +! CALL CallREDWINdll(u, p%DLL_Trgt, m%dll_data, p, ErrStat, ErrMsg) + + CALL FreeDynamicLib( p%DLL_Trgt, ErrStat2, ErrMsg2 ) ! this doesn't do anything #ifdef STATIC_DLL_LOAD because p%DLL_Trgt is 0 (NULL) + IF (ErrStat2 /= ErrID_None) THEN + ErrStat = MAX(ErrStat, ErrStat2) + ErrMsg = TRIM(ErrMsg)//NewLine//TRIM(ErrMsg2) + END IF + +end subroutine REDWINinterface_End +!================================================================================================================================== +!> This routine sets the AVRswap array, calls the routine from the REDWIN DLL, and sets the outputs from the call to be used as +!! necessary in the main ServoDyn CalcOutput routine. +subroutine REDWINinterface_CalcOutput(t, u, p, m, ErrStat, ErrMsg) + + real(DbKi), intent(in ) :: t !< Current simulation time in seconds + type(DirtD_InputType), intent(in ) :: u !< Inputs at t + type(DirtD_ParameterType), intent(in ) :: p !< Parameters + type(DirtD_MiscVarType), intent(inout) :: m !< misc (optimization) variables + integer(IntKi), intent( out) :: ErrStat !< Error status of the operation + character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + ! local variables: + integer(IntKi) :: ErrStat2 ! The error status code + character(ErrMsgLen) :: ErrMsg2 ! The error message, if an error occurred + + + ! Initialize error values: + ErrStat = ErrID_None + ErrMsg= '' + + +#ifdef DEBUG_REDWIN_INTERFACE +!CALL WrNumAryFileNR ( 58, m%dll_data%avrSWAP,'1x,ES15.6E2', ErrStat, ErrMsg ) +!write(58,'()') +#endif + + ! Call the REDWIN-style DLL: + CALL CallREDWINdll(u, p%DLL_Trgt, m%dll_data, p, ErrStat, ErrMsg) + IF ( ErrStat >= AbortErrLev ) RETURN + +#ifdef DEBUG_REDWIN_INTERFACE +!CALL WrNumAryFileNR ( 59, m%dll_data%avrSWAP,'1x,ES15.6E2', ErrStat, ErrMsg ) +!write(59,'()') +#endif + + + +end subroutine REDWINinterface_CalcOutput +end module REDWINinterface diff --git a/modules/dirtdyn/src/driver/.DirtDyn_Driver.f90.swp b/modules/dirtdyn/src/driver/.DirtDyn_Driver.f90.swp new file mode 100644 index 0000000000000000000000000000000000000000..b41b621d79ab72e2c12b0aebda9f227410e37bc1 GIT binary patch literal 20480 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 afM!55pc&u*l>=z~_4LhtJ^kio*#8SrvOnYi literal 0 HcmV?d00001 diff --git a/modules/dirtdyn/src/driver/DirtDyn_Driver.f90 b/modules/dirtdyn/src/driver/DirtDyn_Driver.f90 new file mode 100644 index 000000000..5ad53c413 --- /dev/null +++ b/modules/dirtdyn/src/driver/DirtDyn_Driver.f90 @@ -0,0 +1,127 @@ +!********************************************************************************************************************************** +!> ## DirtDyn_DriverCode: This code tests the DirtDyn module +!!.................................................................................................................................. +!! LICENSING +!! Copyright (C) 2012, 2015 National Renewable Energy Laboratory +!! +!! This file is part of DirtDyn. +!! +!! Licensed under the Apache License, Version 2.0 (the "License"); +!! you may not use this file except in compliance with the License. +!! You may obtain a copy of the License at +!! +!! http://www.apache.org/licenses/LICENSE-2.0 +!! +!! Unless required by applicable law or agreed to in writing, software +!! distributed under the License is distributed on an "AS IS" BASIS, +!! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +!! See the License for the specific language governing permissions and +!! limitations under the License. +!********************************************************************************************************************************** +PROGRAM DirtDyn_Driver + + USE NWTC_Library + USE DirtDyn + USE DirtDyn_Types + + IMPLICIT NONE + + integer(IntKi), parameter :: NumInp = 1 !< Number of inputs sent to DirtDyn_UpdateStates + + ! Program variables + real(DbKi) :: Time !< Variable for storing time, in seconds + real(DbKi) :: TimeInterval !< Interval between time steps, in seconds + real(DbKi) :: InputTime(NumInp) !< Variable for storing time associated with inputs, in seconds + + type(DirtD_InitInputType) :: InitInData !< Input data for initialization + type(DirtD_InitOutputType) :: InitOutData !< Output data from initialization + + type(DirtD_ContinuousStateType) :: x !< Continuous states + type(DirtD_DiscreteStateType) :: xd !< Discrete states + type(DirtD_ConstraintStateType) :: z !< Constraint states + type(DirtD_ConstraintStateType) :: Z_residual !< Residual of the constraint state functions (Z) + type(DirtD_OtherStateType) :: OtherState !< Other states + type(DirtD_MiscVarType) :: misc !< Optimization variables + + type(DirtD_ParameterType) :: p !< Parameters + type(DirtD_InputType) :: u(NumInp) !< System inputs + type(DirtD_OutputType) :: y !< System outputs + + + + INTEGER(IntKi) :: n !< Loop counter (for time step) + INTEGER(IntKi) :: ErrStat !< Status of error message + CHARACTER(ErrMsgLen) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + + + !............................................................................................................................... + ! Routines called in initialization + !............................................................................................................................... + + ! Populate the InitInData data structure here: + + InitInData%InputFile = 'MyInputFileName.inp' + + ! Set the driver's request for time interval here: + + TimeInterval = 0.25 ! Glue code's request for delta time (likely based on information from other modules) + + + ! Initialize the module + + CALL DirtDyn_Init( InitInData, u(1), p, x, xd, z, OtherState, y, misc, TimeInterval, InitOutData, ErrStat, ErrMsg ) + IF ( ErrStat /= ErrID_None ) THEN ! Check if there was an error and do something about it if necessary + CALL WrScr( ErrMsg ) + END IF + + + ! Destroy initialization data + + CALL DirtD_DestroyInitInput( InitInData, ErrStat, ErrMsg ) + CALL DirtD_DestroyInitOutput( InitOutData, ErrStat, ErrMsg ) + + + !............................................................................................................................... + ! Routines called in loose coupling -- the glue code may implement this in various ways + !............................................................................................................................... + + + DO n = 0,2 + + Time = n*TimeInterval + InputTime(1) = Time + + ! Modify u (likely from the outputs of another module or a set of test conditions) here: + + + ! Calculate outputs at n + + CALL DirtDyn_CalcOutput( Time, u(1), p, x, xd, z, OtherState, y, misc, ErrStat, ErrMsg ) + IF ( ErrStat /= ErrID_None ) THEN ! Check if there was an error and do something about it if necessary + CALL WrScr( ErrMsg ) + END IF + + + ! Get state variables at next step: INPUT at step n, OUTPUT at step n + 1 + + CALL DirtDyn_UpdateStates( Time, n, u, InputTime, p, x, xd, z, OtherState, misc, ErrStat, ErrMsg ) + IF ( ErrStat /= ErrID_None ) THEN ! Check if there was an error and do something about it if necessary + CALL WrScr( ErrMsg ) + END IF + + + END DO + + + !............................................................................................................................... + ! Routine to terminate program execution + !............................................................................................................................... + CALL DirtDyn_End( u(1), p, x, xd, z, OtherState, y, misc, ErrStat, ErrMsg ) + + IF ( ErrStat /= ErrID_None ) THEN + CALL WrScr( ErrMsg ) + END IF + + +END PROGRAM DirtDyn_Driver From 311a253a8cb5cc4ec180b0a99ae0a33110f55fdc Mon Sep 17 00:00:00 2001 From: Platt Date: Thu, 30 Jan 2020 14:25:24 -0700 Subject: [PATCH 002/136] DirtDyn: minor fixes for compiling with ifort --- modules/dirtdyn/src/DirtDyn_Registry.txt | 6 +++--- modules/dirtdyn/src/DirtDyn_Types.f90 | 18 ++++++------------ modules/dirtdyn/src/REDWINinterface.f90 | 16 ++++++++-------- 3 files changed, 17 insertions(+), 23 deletions(-) diff --git a/modules/dirtdyn/src/DirtDyn_Registry.txt b/modules/dirtdyn/src/DirtDyn_Registry.txt index 98d296670..c69735137 100644 --- a/modules/dirtdyn/src/DirtDyn_Registry.txt +++ b/modules/dirtdyn/src/DirtDyn_Registry.txt @@ -21,12 +21,12 @@ typedef DirtDyn/DirtD REDWINdllType character(45) PROPSFILE - typedef DirtDyn/DirtD REDWINdllType character(45) LDISPFILE - - - "" - typedef DirtDyn/DirtD REDWINdllType IntKi IDtask - - - "Task identifier for what DLL should do: IDTask = 1: Read input properties, initialize and calibrate model IDTask = 2: Calculate forces based on displacement at end of step IDTask = 3: Calculate elastic macro-element stiffness matrix" - typedef ^ REDWINdllType IntKi nErrorCode - - - "number of returned error codes" - -typedef ^ REDWINdllType IntKi ErrorCode 100 - - "Array containing one or more error codes. These are specific to each model." - +typedef ^ REDWINdllType IntKi ErrorCode {100} - - "Array containing one or more error codes. These are specific to each model." - typedef ^ REDWINdllType R8Ki Props {100}{200} - - "Array containing foundation model properties (used internally by the REDWIN models). Specific to each model." - typedef ^ REDWINdllType R8Ki StVar {12}{100} - - "Array containing the state variables at the end of the step (used internally by the REDWIN models). Specific to each model." - typedef ^ REDWINdllType IntKi StVarPrint {12}{100} - - "Array indicating which state variables should be printed to the screen. This feature is currently not supported." - -typedef ^ REDWINdllType R8Ki Disp 6 - - "Displacements. Follows convention of REDWIN orientation." - -typedef ^ REDWINdllType R8Ki Force 6 - - "Forces. Follows convention of REDWIN orientations." - +typedef ^ REDWINdllType R8Ki Disp {6} - - "Displacements. Follows convention of REDWIN orientation." - +typedef ^ REDWINdllType R8Ki Force {6} - - "Forces. Follows convention of REDWIN orientations." - typedef ^ REDWINdllType R8Ki D {6}{6} - - "The 6 x 6 elastic macro-element stiffness matrix at the SFI." - diff --git a/modules/dirtdyn/src/DirtDyn_Types.f90 b/modules/dirtdyn/src/DirtDyn_Types.f90 index 009a4b6f6..edeb7a4d5 100644 --- a/modules/dirtdyn/src/DirtDyn_Types.f90 +++ b/modules/dirtdyn/src/DirtDyn_Types.f90 @@ -39,7 +39,7 @@ MODULE DirtDyn_Types character(45) :: LDISPFILE !< [-] INTEGER(IntKi) :: IDtask !< Task identifier for what DLL should do: IDTask = 1: Read input properties, initialize and calibrate model IDTask = 2: Calculate forces based on displacement at end of step IDTask = 3: Calculate elastic macro-element stiffness matrix [-] INTEGER(IntKi) :: nErrorCode !< number of returned error codes [-] - INTEGER(IntKi) , DIMENSION(1:1,1:0,1:0) :: ErrorCode !< Array containing one or more error codes. These are specific to each model. [-] + INTEGER(IntKi) , DIMENSION(1:100) :: ErrorCode !< Array containing one or more error codes. These are specific to each model. [-] REAL(R8Ki) , DIMENSION(1:100,1:200) :: Props !< Array containing foundation model properties (used internally by the REDWIN models). Specific to each model. [-] REAL(R8Ki) , DIMENSION(1:12,1:100) :: StVar !< Array containing the state variables at the end of the step (used internally by the REDWIN models). Specific to each model. [-] INTEGER(IntKi) , DIMENSION(1:12,1:100) :: StVarPrint !< Array indicating which state variables should be printed to the screen. This feature is currently not supported. [-] @@ -124,7 +124,6 @@ SUBROUTINE DirtD_CopyREDWINdllType( SrcREDWINdllTypeData, DstREDWINdllTypeData, INTEGER(IntKi) :: i,j,k INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 INTEGER(IntKi) :: i2, i2_l, i2_u ! bounds (upper/lower) for an array dimension 2 - INTEGER(IntKi) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_CopyREDWINdllType' @@ -277,7 +276,6 @@ SUBROUTINE DirtD_UnPackREDWINdllType( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrSt LOGICAL, ALLOCATABLE :: mask5(:,:,:,:,:) INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 INTEGER(IntKi) :: i2, i2_l, i2_u ! bounds (upper/lower) for an array dimension 2 - INTEGER(IntKi) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_UnPackREDWINdllType' @@ -305,19 +303,15 @@ SUBROUTINE DirtD_UnPackREDWINdllType( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrSt Int_Xferred = Int_Xferred + 1 i1_l = LBOUND(OutData%ErrorCode,1) i1_u = UBOUND(OutData%ErrorCode,1) - i2_l = LBOUND(OutData%ErrorCode,2) - i2_u = UBOUND(OutData%ErrorCode,2) - i3_l = LBOUND(OutData%ErrorCode,3) - i3_u = UBOUND(OutData%ErrorCode,3) - ALLOCATE(mask3(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + ALLOCATE(mask1(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating mask3.', ErrStat, ErrMsg,RoutineName) + CALL SetErrStat(ErrID_Fatal, 'Error allocating mask1.', ErrStat, ErrMsg,RoutineName) RETURN END IF - mask3 = .TRUE. - OutData%ErrorCode = UNPACK( IntKiBuf ( Int_Xferred:Int_Xferred+(SIZE(OutData%ErrorCode))-1 ), mask3, 0_IntKi ) + mask1 = .TRUE. + OutData%ErrorCode = UNPACK( IntKiBuf ( Int_Xferred:Int_Xferred+(SIZE(OutData%ErrorCode))-1 ), mask1, 0_IntKi ) Int_Xferred = Int_Xferred + SIZE(OutData%ErrorCode) - DEALLOCATE(mask3) + DEALLOCATE(mask1) i1_l = LBOUND(OutData%Props,1) i1_u = UBOUND(OutData%Props,1) i2_l = LBOUND(OutData%Props,2) diff --git a/modules/dirtdyn/src/REDWINinterface.f90 b/modules/dirtdyn/src/REDWINinterface.f90 index 5285e65ca..2e2622dbc 100644 --- a/modules/dirtdyn/src/REDWINinterface.f90 +++ b/modules/dirtdyn/src/REDWINinterface.f90 @@ -40,10 +40,10 @@ subroutine REDWINdll_interface(PROPSFILE, LDISPFILE, IDTask, nErrorCode, ErrorCo real(c_double), intent(inout) :: Props(1:100, 1:200) real(c_double), intent(inout) :: StVar(1:12, 1:100) integer(c_int), intent(inout) :: StVarPrint(1:12, 1:100) - real(c_double), intent(inout) :: Disp(6) - real(c_double), intent(inout) :: Force(6) - real(c_double), intent(inout) :: D(6,6) - integer(c_int), intent(inout) :: ErrorCode(100) + real(c_double), intent(inout) :: Disp(1:6) + real(c_double), intent(inout) :: Force(1:6) + real(c_double), intent(inout) :: D(1:6,1:6) + integer(c_int), intent(inout) :: ErrorCode(1:100) end subroutine REDWINdll_interface end interface @@ -58,10 +58,10 @@ subroutine INTERFACEFOUNDATION ( PROPSFILE, LDISPFILE, IDTask, nErrorCode, Error real(c_double), intent(inout) :: Props(1:100, 1:200) real(c_double), intent(inout) :: StVar(1:12, 1:100) integer(c_int), intent(inout) :: StVarPrint(1:12, 1:100) - real(c_double), intent(inout) :: Disp(6) - real(c_double), intent(inout) :: Force(6) - real(c_double), intent(inout) :: D(6,6) - integer(c_int), intent(inout) :: ErrorCode(100) + real(c_double), intent(inout) :: Disp(1:6) + real(c_double), intent(inout) :: Force(1:6) + real(c_double), intent(inout) :: D(1:6,1:6) + integer(c_int), intent(inout) :: ErrorCode(1:100) end subroutine INTERFACEFOUNDATION end interface #endif From a4e774e5f3dd76e231a9269487f3bd62e26cdad3 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Thu, 30 Jan 2020 14:31:40 -0700 Subject: [PATCH 003/136] DirtDyn: add VS project --- vs-build/DirtDyn/DirtDyn-w-registry.sln | 64 ++++++ vs-build/DirtDyn/DirtDyn.vfproj | 292 ++++++++++++++++++++++++ vs-build/RunRegistry.bat | 11 +- 3 files changed, 365 insertions(+), 2 deletions(-) create mode 100644 vs-build/DirtDyn/DirtDyn-w-registry.sln create mode 100644 vs-build/DirtDyn/DirtDyn.vfproj diff --git a/vs-build/DirtDyn/DirtDyn-w-registry.sln b/vs-build/DirtDyn/DirtDyn-w-registry.sln new file mode 100644 index 000000000..3ebc50a0a --- /dev/null +++ b/vs-build/DirtDyn/DirtDyn-w-registry.sln @@ -0,0 +1,64 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.28307.1000 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "DirtDyn", "DirtDyn.vfproj", "{815C302F-A93D-4C22-9329-7112345113C0}" + ProjectSection(ProjectDependencies) = postProject + {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16} = {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FAST_Registry", "..\Registry\FAST_Registry.vcxproj", "{DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug_Double|Win32 = Debug_Double|Win32 + Debug_Double|x64 = Debug_Double|x64 + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release_Double|Win32 = Release_Double|Win32 + Release_Double|x64 = Release_Double|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {815C302F-A93D-4C22-9329-7112345113C0}.Debug_Double|Win32.ActiveCfg = Debug_Double|Win32 + {815C302F-A93D-4C22-9329-7112345113C0}.Debug_Double|Win32.Build.0 = Debug_Double|Win32 + {815C302F-A93D-4C22-9329-7112345113C0}.Debug_Double|x64.ActiveCfg = Debug_Double|x64 + {815C302F-A93D-4C22-9329-7112345113C0}.Debug_Double|x64.Build.0 = Debug_Double|x64 + {815C302F-A93D-4C22-9329-7112345113C0}.Debug|Win32.ActiveCfg = Debug|Win32 + {815C302F-A93D-4C22-9329-7112345113C0}.Debug|Win32.Build.0 = Debug|Win32 + {815C302F-A93D-4C22-9329-7112345113C0}.Debug|x64.ActiveCfg = Debug|x64 + {815C302F-A93D-4C22-9329-7112345113C0}.Debug|x64.Build.0 = Debug|x64 + {815C302F-A93D-4C22-9329-7112345113C0}.Release_Double|Win32.ActiveCfg = Release_Double|Win32 + {815C302F-A93D-4C22-9329-7112345113C0}.Release_Double|Win32.Build.0 = Release_Double|Win32 + {815C302F-A93D-4C22-9329-7112345113C0}.Release_Double|x64.ActiveCfg = Release_Double|x64 + {815C302F-A93D-4C22-9329-7112345113C0}.Release_Double|x64.Build.0 = Release_Double|x64 + {815C302F-A93D-4C22-9329-7112345113C0}.Release|Win32.ActiveCfg = Release|Win32 + {815C302F-A93D-4C22-9329-7112345113C0}.Release|Win32.Build.0 = Release|Win32 + {815C302F-A93D-4C22-9329-7112345113C0}.Release|x64.ActiveCfg = Release|x64 + {815C302F-A93D-4C22-9329-7112345113C0}.Release|x64.Build.0 = Release|x64 + {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|Win32.ActiveCfg = Debug|Win32 + {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|Win32.Build.0 = Debug|Win32 + {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|x64.ActiveCfg = Debug|x64 + {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|x64.Build.0 = Debug|x64 + {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|Win32.ActiveCfg = Debug|Win32 + {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|Win32.Build.0 = Debug|Win32 + {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|x64.ActiveCfg = Debug|x64 + {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|x64.Build.0 = Debug|x64 + {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|Win32.ActiveCfg = Release|Win32 + {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|Win32.Build.0 = Release|Win32 + {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|x64.ActiveCfg = Release|x64 + {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|x64.Build.0 = Release|x64 + {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|Win32.ActiveCfg = Release|Win32 + {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|Win32.Build.0 = Release|Win32 + {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|x64.ActiveCfg = Release|x64 + {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {A0376D01-250D-4BCF-8D81-F82B933958E7} + EndGlobalSection +EndGlobal diff --git a/vs-build/DirtDyn/DirtDyn.vfproj b/vs-build/DirtDyn/DirtDyn.vfproj new file mode 100644 index 000000000..ca77dd4b6 --- /dev/null +++ b/vs-build/DirtDyn/DirtDyn.vfproj @@ -0,0 +1,292 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/RunRegistry.bat b/vs-build/RunRegistry.bat index 442198392..c9090c415 100644 --- a/vs-build/RunRegistry.bat +++ b/vs-build/RunRegistry.bat @@ -41,10 +41,11 @@ SET ExtPtfm_Loc=%Modules_Loc%\extptfm\src SET AD_Loc=%Modules_Loc%\aerodyn\src SET SrvD_Loc=%Modules_Loc%\servodyn\src SET BD_Loc=%Modules_Loc%\beamdyn\src +SET DirtD_Loc=%Modules_Loc%\dirtdyn\src SET SC_Loc=%Modules_Loc%\supercontroller\src SET ALL_FAST_Includes=-I "%FAST_Loc%" -I "%NWTC_Lib_Loc%" -I "%ED_Loc%" -I "%SrvD_Loc%" -I "%AD14_Loc%" -I^ - "%AD_Loc%" -I "%BD_Loc%" -I "%SC_Loc%" -I^ + "%AD_Loc%" -I "%BD_Loc%" -I "%DirtD_Loc%" -I "%SC_Loc%" -I^ "%IfW_Loc%" -I "%SD_Loc%" -I "%HD_Loc%" -I "%MAP_Loc%" -I "%FEAM_Loc%" -I^ "%IceF_Loc%" -I "%IceD_Loc%" -I "%MD_Loc%" -I "%OpFM_Loc%" -I "%Orca_Loc%" -I "%ExtPtfm_Loc%" @@ -74,6 +75,12 @@ SET Output_Loc=%CURR_LOC% %REGISTRY% "%CURR_LOC%\Registry_BeamDyn.txt" -I "%NWTC_Lib_Loc%" -O "%Output_Loc%" GOTO checkError +:DirtDyn +SET CURR_LOC=%DirtD_Loc% +SET Output_Loc=%CURR_LOC% +%REGISTRY% "%CURR_LOC%\DirtDyn_Registry.txt" -I "%NWTC_Lib_Loc%" -O "%Output_Loc%" +GOTO checkError + :SuperController SET CURR_LOC=%SC_Loc% SET Output_Loc=%CURR_LOC% @@ -301,4 +308,4 @@ SET ALL_FAST_Includes= echo %lines% set lines= -:PathsOnly \ No newline at end of file +:PathsOnly From b3f8c07d97d02442c61898155a8383f58a6ccd80 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Thu, 30 Jan 2020 14:51:42 -0700 Subject: [PATCH 004/136] DirtDyn: fix version info on solution file --- vs-build/DirtDyn/DirtDyn-w-registry.sln | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vs-build/DirtDyn/DirtDyn-w-registry.sln b/vs-build/DirtDyn/DirtDyn-w-registry.sln index 3ebc50a0a..a596a4399 100644 --- a/vs-build/DirtDyn/DirtDyn-w-registry.sln +++ b/vs-build/DirtDyn/DirtDyn-w-registry.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.28307.1000 +# Visual Studio 2013 +VisualStudioVersion = 12.0.40629.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "DirtDyn", "DirtDyn.vfproj", "{815C302F-A93D-4C22-9329-7112345113C0}" ProjectSection(ProjectDependencies) = postProject From 3d2b9deb36ed07ae6d3de6bba2e72b59d7ec3de1 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Fri, 31 Jan 2020 09:37:02 -0700 Subject: [PATCH 005/136] DirtDyn: DLL loading/unloading working --- modules/dirtdyn/src/DirtDyn.f90 | 26 ++++++++++++++++++++++++- modules/dirtdyn/src/REDWINinterface.f90 | 15 ++++++++------ 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/modules/dirtdyn/src/DirtDyn.f90 b/modules/dirtdyn/src/DirtDyn.f90 index d858d980b..2783e02c5 100644 --- a/modules/dirtdyn/src/DirtDyn.f90 +++ b/modules/dirtdyn/src/DirtDyn.f90 @@ -30,6 +30,7 @@ MODULE DirtDyn USE DirtDyn_Types USE NWTC_Library + USE REDWINinterface IMPLICIT NONE @@ -73,6 +74,8 @@ MODULE DirtDyn !! The initial states and initial guess for the input are defined. subroutine DirtDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOut, ErrStat, ErrMsg ) !.................................................................................................................................. +!FIXME: do I really want this here? Compare to ServoDyn. + USE, INTRINSIC :: ISO_C_Binding type(DirtD_InitInputType), intent(in ) :: InitInp !< Input data for initialization routine type(DirtD_InputType), intent( out) :: u !< An initial guess for the input; input mesh must be defined @@ -99,6 +102,7 @@ subroutine DirtDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In integer(IntKi) :: ErrStat2 ! local error status character(ErrMsgLen) :: ErrMsg2 ! local error message character(*), parameter :: RoutineName = 'DirtDyn_Init' + type(DirtD_InputFile) :: InputFileData !< Data stored in the module's input file ! Initialize variables ErrStat = ErrID_None @@ -116,6 +120,11 @@ subroutine DirtDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In ! Define parameters here: p%DT = Interval +!FIXME: add input file parsing + InputFileData%DLL_ProcName = 'INTERFACEFOUNDATION'//C_NULL_CHAR ! The name of the procedure in the DLL that will be called. + InputFileData%DLL_FileName = './REDWINmodel1-2.0_x86.dll'//C_NULL_CHAR ! 32 bit version for model 1 + !InputFileData%DLL_inFile = './REDWINmodel1-2.0_x86.dll'//C_NULL_CHAR ! 32 bit version for model 1 + ! Define initial system states here: x%DummyContState = 0.0_ReKi @@ -169,6 +178,18 @@ subroutine DirtDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In end if + + + ! Initialize the DLL + call REDWINinterface_Init(u,p,m,y,InputFileData, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + + +!FIXME: quick hack for setup call +!m%dll_data + !CALL CallREDWINdll(p%DLL_Trgt, m%dll_data, ErrStat2, ErrMsg2) + ! CALL CheckError(ErrStat2,ErrMsg2) + ! IF ( ErrStat >= AbortErrLev ) RETURN end subroutine DirtDyn_Init !---------------------------------------------------------------------------------------------------------------------------------- @@ -199,7 +220,10 @@ subroutine DirtDyn_End( u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) !! Place any last minute operations or calculations here: - + if (p%UseREDWINinterface) then +print*,'Closing the REDWIN interface' + call REDWINinterface_End( u, p, m, ErrStat, ErrMsg ) + endif !! Close files here (but because of checkpoint-restart capability, it is not recommended to have files open during the simulation): diff --git a/modules/dirtdyn/src/REDWINinterface.f90 b/modules/dirtdyn/src/REDWINinterface.f90 index 2e2622dbc..6ad991387 100644 --- a/modules/dirtdyn/src/REDWINinterface.f90 +++ b/modules/dirtdyn/src/REDWINinterface.f90 @@ -139,8 +139,6 @@ subroutine REDWINinterface_Init(u,p,m,y,InputFileData, ErrStat, ErrMsg) character(ErrMsgLen) :: ErrMsg2 ! The error message, if an error occurred - ! Define all the parameters for the REDWIN Interface - InputFileData%DLL_ProcName = 'INTERFACEFOUNDATION'//C_NULL_CHAR ! The name of the procedure in the DLL that will be called. ErrStat = ErrID_None ErrMsg= '' @@ -149,6 +147,9 @@ subroutine REDWINinterface_Init(u,p,m,y,InputFileData, ErrStat, ErrMsg) ! p%Ptch_Cntrl = InputFileData%Ptch_Cntrl p%DLL_InFile = InputFileData%DLL_InFile + + + !FIXME: do we need to set one? ! p%DLL_DT = InputFileData%DLL_DT @@ -176,8 +177,10 @@ subroutine REDWINinterface_Init(u,p,m,y,InputFileData, ErrStat, ErrMsg) IF ( ErrStat >= AbortErrLev ) RETURN #endif - ! Set status flag: - + ! Set status flag: + p%UseREDWINinterface = .TRUE. + +!FIXME: do I need to call it once to get it to actually initialize? And when? !CALL CallREDWINdll(p%DLL_Trgt, m%dll_data, ErrStat2, ErrMsg2) ! CALL CheckError(ErrStat2,ErrMsg2) ! IF ( ErrStat >= AbortErrLev ) RETURN @@ -221,8 +224,8 @@ subroutine REDWINinterface_End(u, p, m, ErrStat, ErrMsg) TYPE(DirtD_InputType), INTENT(IN ) :: u !< System inputs TYPE(DirtD_ParameterType), INTENT(INOUT) :: p !< Parameters TYPE(DirtD_MiscVarType), INTENT(INOUT) :: m !< misc (optimization) variables - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None ! local variables: INTEGER(IntKi) :: ErrStat2 ! The error status code From d7fa8f3965390d09578f718e23bc5361b4b67aed Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Mon, 3 Feb 2020 17:00:18 -0700 Subject: [PATCH 006/136] DirtDyn: input files in registry --- modules/dirtdyn/src/DirtDyn_Registry.txt | 5 ++++- modules/dirtdyn/src/DirtDyn_Types.f90 | 25 +++++++++++++++++------- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/modules/dirtdyn/src/DirtDyn_Registry.txt b/modules/dirtdyn/src/DirtDyn_Registry.txt index c69735137..155babccc 100644 --- a/modules/dirtdyn/src/DirtDyn_Registry.txt +++ b/modules/dirtdyn/src/DirtDyn_Registry.txt @@ -34,7 +34,8 @@ typedef ^ REDWINdllType R8Ki D {6}{6} # DirtDyn input file typedef ^ DirtD_InputFile CHARACTER(1024) DLL_FileName - - - "Name of the DLL file including the full path" - typedef ^ DirtD_InputFile CHARACTER(1024) DLL_ProcName - - - "Name of the procedure in the DLL that will be called" - -typedef ^ DirtD_InputFile CHARACTER(1024) DLL_InFile - - - "Name of input file used in DLL" - +typedef ^ DirtD_InputFile CHARACTER(1024) DLL_PROPSFILE - - - "Name of PROPSFILE input file used in DLL" - +typedef ^ DirtD_InputFile CHARACTER(1024) DLL_LDISPFILE - - - "Name of LDISPFILE input file used in DLL" - # ..... Initialization data ....................................................................................................... @@ -88,6 +89,8 @@ typedef ^ ParameterType DLL_Type DLL_Trgt typedef ^ ParameterType DbKi DLL_DT - - - "Time step for DLL" seconds typedef ^ ParameterType CHARACTER(1024) RootName - - - "RootName for writing output files" - typedef ^ ParameterType LOGICAL UseREDWINinterface - - - "True if interface successfully initialized" - +#typedef ^ ParameterType character(45) PROPSFILE - - - "" - +#typedef ^ ParameterType character(45) LDISPFILE - - - "" - # ..... Inputs .................................................................................................................... diff --git a/modules/dirtdyn/src/DirtDyn_Types.f90 b/modules/dirtdyn/src/DirtDyn_Types.f90 index edeb7a4d5..76b38bb02 100644 --- a/modules/dirtdyn/src/DirtDyn_Types.f90 +++ b/modules/dirtdyn/src/DirtDyn_Types.f90 @@ -52,7 +52,8 @@ MODULE DirtDyn_Types TYPE, PUBLIC :: DirtD_InputFile CHARACTER(1024) :: DLL_FileName !< Name of the DLL file including the full path [-] CHARACTER(1024) :: DLL_ProcName !< Name of the procedure in the DLL that will be called [-] - CHARACTER(1024) :: DLL_InFile !< Name of input file used in DLL [-] + CHARACTER(1024) :: DLL_PROPSFILE !< Name of PROPSFILE input file used in DLL [-] + CHARACTER(1024) :: DLL_LDISPFILE !< Name of LDISPFILE input file used in DLL [-] END TYPE DirtD_InputFile ! ======================= ! ========= DirtD_InitInputType ======= @@ -404,7 +405,8 @@ SUBROUTINE DirtD_CopyInputFile( SrcInputFileData, DstInputFileData, CtrlCode, Er ErrMsg = "" DstInputFileData%DLL_FileName = SrcInputFileData%DLL_FileName DstInputFileData%DLL_ProcName = SrcInputFileData%DLL_ProcName - DstInputFileData%DLL_InFile = SrcInputFileData%DLL_InFile + DstInputFileData%DLL_PROPSFILE = SrcInputFileData%DLL_PROPSFILE + DstInputFileData%DLL_LDISPFILE = SrcInputFileData%DLL_LDISPFILE END SUBROUTINE DirtD_CopyInputFile SUBROUTINE DirtD_DestroyInputFile( InputFileData, ErrStat, ErrMsg ) @@ -455,7 +457,8 @@ SUBROUTINE DirtD_PackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Err Int_BufSz = 0 Int_BufSz = Int_BufSz + 1*LEN(InData%DLL_FileName) ! DLL_FileName Int_BufSz = Int_BufSz + 1*LEN(InData%DLL_ProcName) ! DLL_ProcName - Int_BufSz = Int_BufSz + 1*LEN(InData%DLL_InFile) ! DLL_InFile + Int_BufSz = Int_BufSz + 1*LEN(InData%DLL_PROPSFILE) ! DLL_PROPSFILE + Int_BufSz = Int_BufSz + 1*LEN(InData%DLL_LDISPFILE) ! DLL_LDISPFILE IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) THEN @@ -491,8 +494,12 @@ SUBROUTINE DirtD_PackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Err IntKiBuf(Int_Xferred) = ICHAR(InData%DLL_ProcName(I:I), IntKi) Int_Xferred = Int_Xferred + 1 END DO ! I - DO I = 1, LEN(InData%DLL_InFile) - IntKiBuf(Int_Xferred) = ICHAR(InData%DLL_InFile(I:I), IntKi) + DO I = 1, LEN(InData%DLL_PROPSFILE) + IntKiBuf(Int_Xferred) = ICHAR(InData%DLL_PROPSFILE(I:I), IntKi) + Int_Xferred = Int_Xferred + 1 + END DO ! I + DO I = 1, LEN(InData%DLL_LDISPFILE) + IntKiBuf(Int_Xferred) = ICHAR(InData%DLL_LDISPFILE(I:I), IntKi) Int_Xferred = Int_Xferred + 1 END DO ! I END SUBROUTINE DirtD_PackInputFile @@ -537,8 +544,12 @@ SUBROUTINE DirtD_UnPackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, OutData%DLL_ProcName(I:I) = CHAR(IntKiBuf(Int_Xferred)) Int_Xferred = Int_Xferred + 1 END DO ! I - DO I = 1, LEN(OutData%DLL_InFile) - OutData%DLL_InFile(I:I) = CHAR(IntKiBuf(Int_Xferred)) + DO I = 1, LEN(OutData%DLL_PROPSFILE) + OutData%DLL_PROPSFILE(I:I) = CHAR(IntKiBuf(Int_Xferred)) + Int_Xferred = Int_Xferred + 1 + END DO ! I + DO I = 1, LEN(OutData%DLL_LDISPFILE) + OutData%DLL_LDISPFILE(I:I) = CHAR(IntKiBuf(Int_Xferred)) Int_Xferred = Int_Xferred + 1 END DO ! I END SUBROUTINE DirtD_UnPackInputFile From 62c9503ad1cb347bdfc72e6b351a3f08936163cc Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 4 Feb 2020 11:03:10 -0700 Subject: [PATCH 007/136] DirtDyn: successful initializing of DLL --- modules/dirtdyn/src/DirtDyn.f90 | 649 ++---------------- modules/dirtdyn/src/REDWINinterface.f90 | 124 ++-- modules/dirtdyn/src/driver/DirtDyn_Driver.f90 | 24 +- 3 files changed, 104 insertions(+), 693 deletions(-) diff --git a/modules/dirtdyn/src/DirtDyn.f90 b/modules/dirtdyn/src/DirtDyn.f90 index 2783e02c5..f61b5a882 100644 --- a/modules/dirtdyn/src/DirtDyn.f90 +++ b/modules/dirtdyn/src/DirtDyn.f90 @@ -38,44 +38,29 @@ MODULE DirtDyn TYPE(ProgDesc), PARAMETER :: DirtDyn_Ver = ProgDesc( 'DirtDyn', 'v0.01.00', '99-Feb-2020' ) !< module date/version information - ! ..... Public Subroutines ................................................................................................... - PUBLIC :: DirtDyn_Init ! Initialization routine PUBLIC :: DirtDyn_End ! Ending routine (includes clean up) - PUBLIC :: DirtDyn_UpdateStates ! Loose coupling routine for solving for constraint states, integrating - ! continuous states, and updating discrete states PUBLIC :: DirtDyn_CalcOutput ! Routine for computing outputs +!NOTE: these are placeholders for now. !!! PUBLIC :: DirtDyn_CalcConstrStateResidual ! Tight coupling routine for returning the constraint state residual !!! PUBLIC :: DirtDyn_CalcContStateDeriv ! Tight coupling routine for computing derivatives of continuous states !!! PUBLIC :: DirtDyn_UpdateDiscState ! Tight coupling routine for updating discrete states -!!! -!!! PUBLIC :: DirtDyn_JacobianPInput ! Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- -!!! ! (Xd), and constraint-state (Z) functions all with respect to the inputs (u) -!!! PUBLIC :: DirtDyn_JacobianPContState ! Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- -!!! ! (Xd), and constraint-state (Z) functions all with respect to the continuous -!!! ! states (x) -!!! PUBLIC :: DirtDyn_JacobianPDiscState ! Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- -!!! ! (Xd), and constraint-state (Z) functions all with respect to the discrete -!!! ! states (xd) -!!! PUBLIC :: DirtDyn_JacobianPConstrState ! Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- -!!! ! (Xd), and constraint-state (Z) functions all with respect to the constraint -!!! ! states (z) -!!! +!!! PUBLIC :: DirtDyn_JacobianPInput ! Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions all with respect to the inputs (u) +!!! PUBLIC :: DirtDyn_JacobianPContState ! Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions all with respect to the continuous states (x) +!!! PUBLIC :: DirtDyn_JacobianPDiscState ! Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions all with respect to the discrete states (xd) +!!! PUBLIC :: DirtDyn_JacobianPConstrState ! Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions all with respect to the constraint states (z) !!! PUBLIC :: DirtDyn_GetOP ! Routine to get the operating-point values for linearization (from data structures to arrays) contains - + !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ !> This routine is called at the start of the simulation to perform initialization steps. !! The parameters are set here and not changed during the simulation. !! The initial states and initial guess for the input are defined. subroutine DirtDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOut, ErrStat, ErrMsg ) -!.................................................................................................................................. -!FIXME: do I really want this here? Compare to ServoDyn. - USE, INTRINSIC :: ISO_C_Binding type(DirtD_InitInputType), intent(in ) :: InitInp !< Input data for initialization routine type(DirtD_InputType), intent( out) :: u !< An initial guess for the input; input mesh must be defined @@ -84,15 +69,9 @@ subroutine DirtDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In type(DirtD_DiscreteStateType), intent( out) :: xd !< Initial discrete states type(DirtD_ConstraintStateType), intent( out) :: z !< Initial guess of the constraint states type(DirtD_OtherStateType), intent( out) :: OtherState !< Initial other states (logical, etc) - type(DirtD_OutputType), intent( out) :: y !< Initial system outputs (outputs are not calculated; - !! only the output mesh is initialized) + type(DirtD_OutputType), intent( out) :: y !< Initial system outputs type(DirtD_MiscVarType), intent( out) :: m !< Misc variables for optimization (not copied in glue code) - real(DbKi), intent(inout) :: Interval !< Coupling interval in seconds: the rate that - !! (1) DirtDyn_UpdateStates() is called in loose coupling & - !! (2) DirtDyn_UpdateDiscState() is called in tight coupling. - !! Input is the suggested time from the glue code; - !! Output is the actual coupling interval that will be used - !! by the glue code. + real(DbKi), intent(inout) :: Interval !< Coupling interval in seconds type(DirtD_InitOutputType), intent( out) :: InitOut !< Output for initialization routine integer(IntKi), intent( out) :: ErrStat !< Error status of the operation character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None @@ -109,7 +88,6 @@ subroutine DirtDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In ErrMsg = "" NumOuts = 2 - ! Initialize the NWTC Subroutine Library call NWTC_Init( ) @@ -120,27 +98,16 @@ subroutine DirtDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In ! Define parameters here: p%DT = Interval -!FIXME: add input file parsing - InputFileData%DLL_ProcName = 'INTERFACEFOUNDATION'//C_NULL_CHAR ! The name of the procedure in the DLL that will be called. - InputFileData%DLL_FileName = './REDWINmodel1-2.0_x86.dll'//C_NULL_CHAR ! 32 bit version for model 1 - !InputFileData%DLL_inFile = './REDWINmodel1-2.0_x86.dll'//C_NULL_CHAR ! 32 bit version for model 1 - - ! Define initial system states here: x%DummyContState = 0.0_ReKi xd%DummyDiscState = 0.0_ReKi z%DummyConstrState = 0.0_ReKi OtherState%DummyOtherState = 0.0_ReKi - - ! Define optimization variables here: -! m%DummyMiscVar = 0.0_ReKi - - ! Define initial guess for the system inputs here: u%DummyInput = 0.0_ReKi - +!FIXME: Develop a list of outputs, and set that up somewhere. ! Define system output initializations (set up mesh) here: call AllocAry( y%WriteOutput, NumOuts, 'WriteOutput', ErrStat2, ErrMsg2 ) call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) ! set return error status based on local (concatenate errors) @@ -149,7 +116,6 @@ subroutine DirtDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In y%DummyOutput = 0 y%WriteOutput = 0 - ! Define initialization-routine output here: call AllocAry(InitOut%WriteOutputHdr,NumOuts,'WriteOutputHdr',ErrStat2,ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) call AllocAry(InitOut%WriteOutputUnt,NumOuts,'WriteOutputUnt',ErrStat2,ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) @@ -159,43 +125,37 @@ subroutine DirtDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In InitOut%WriteOutputUnt = (/ '(s)', '(-)' /) - ! If you want to choose your own rate instead of using what the glue code suggests, tell the glue code the rate at which - ! this module must be called here: - - !Interval = p%DT - - if (InitInp%Linearize) then - + ! If the module does not implement the four Jacobian routines at the end of this template, or the module cannot ! linearize with the features that are enabled, stop the simulation if InitInp%Linearize is true. - + CALL SetErrStat( ErrID_Fatal, 'DirtDyn cannot perform linearization analysis.', ErrStat, ErrMsg, RoutineName) - - ! Otherwise, if the module does allow linearization, return the appropriate Jacobian row/column names and rotating-frame flags here: - ! Allocate and set these variables: InitOut%LinNames_y, InitOut%LinNames_x, InitOut%LinNames_xd, InitOut%LinNames_z, InitOut%LinNames_u - ! Allocate and set these variables: InitOut%RotFrame_y, InitOut%RotFrame_x, InitOut%RotFrame_xd, InitOut%RotFrame_z, InitOut%RotFrame_u - + + ! Otherwise, if the module does allow linearization, return the appropriate Jacobian row/column names and rotating-frame flags here: + ! Allocate and set these variables: InitOut%LinNames_y, InitOut%LinNames_x, InitOut%LinNames_xd, InitOut%LinNames_z, InitOut%LinNames_u + ! Allocate and set these variables: InitOut%RotFrame_y, InitOut%RotFrame_x, InitOut%RotFrame_xd, InitOut%RotFrame_z, InitOut%RotFrame_u + end if - - + +!FIXME: quick hack for setup call +!FIXME: add input file parsing +InputFileData%DLL_ProcName = 'INTERFACEFOUNDATION' ! The name of the procedure in the DLL that will be called. +InputFileData%DLL_FileName = 'REDWINmodel1-2.0_x86.dll' ! 32 bit version for model 1 +m%dll_data%PROPSfile = 'Props.txt' +m%dll_data%LDISPfile = 'LoadDisplacement.txt' +m%dll_data%IDtask = 1 ! Initialize the DLL call REDWINinterface_Init(u,p,m,y,InputFileData, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - -!FIXME: quick hack for setup call -!m%dll_data - !CALL CallREDWINdll(p%DLL_Trgt, m%dll_data, ErrStat2, ErrMsg2) - ! CALL CheckError(ErrStat2,ErrMsg2) - ! IF ( ErrStat >= AbortErrLev ) RETURN - end subroutine DirtDyn_Init + + !---------------------------------------------------------------------------------------------------------------------------------- !> This routine is called at the end of the simulation. subroutine DirtDyn_End( u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) -!.................................................................................................................................. type(DirtD_InputType), intent(inout) :: u !< System inputs type(DirtD_ParameterType), intent(inout) :: p !< Parameters @@ -214,56 +174,41 @@ subroutine DirtDyn_End( u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) character(*), parameter :: RoutineName = 'DirtDyn_End' ! Initialize ErrStat - ErrStat = ErrID_None ErrMsg = "" - !! Place any last minute operations or calculations here: if (p%UseREDWINinterface) then -print*,'Closing the REDWIN interface' call REDWINinterface_End( u, p, m, ErrStat, ErrMsg ) endif !! Close files here (but because of checkpoint-restart capability, it is not recommended to have files open during the simulation): - !! Destroy the input data: - - call DirtD_DestroyInput( u, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - + call DirtD_DestroyInput( u, ErrStat2,ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) !! Destroy the parameter data: - - call DirtD_DestroyParam( p, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + call DirtD_DestroyParam( p, ErrStat2,ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) !! Destroy the state data: - - call DirtD_DestroyContState( x, ErrStat2,ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - call DirtD_DestroyDiscState( xd, ErrStat2,ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - call DirtD_DestroyConstrState( z, ErrStat2,ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - call DirtD_DestroyOtherState( OtherState, ErrStat2,ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - + call DirtD_DestroyContState( x, ErrStat2,ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + call DirtD_DestroyDiscState( xd, ErrStat2,ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + call DirtD_DestroyConstrState(z, ErrStat2,ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + call DirtD_DestroyOtherState( OtherState, ErrStat2,ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) !! Destroy the output data: - call DirtD_DestroyOutput( y, ErrStat2, ErrMsg2 ); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - !! Destroy the misc data: - call DirtD_DestroyMisc( m, ErrStat2, ErrMsg2 ); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - end subroutine DirtDyn_End + + !---------------------------------------------------------------------------------------------------------------------------------- !> This is a loose coupling routine for solving constraint states, integrating continuous states, and updating discrete and other !! states. Continuous, constraint, discrete, and other states are updated to values at t + Interval. subroutine DirtDyn_UpdateStates( t, n, Inputs, InputTimes, p, x, xd, z, OtherState, m, ErrStat, ErrMsg ) -!.................................................................................................................................. - real(DbKi), intent(in ) :: t !< Current simulation time in seconds integer(IntKi), intent(in ) :: n !< Current step of the simulation: t = n*Interval type(DirtD_InputType), intent(inout) :: Inputs(:) !< Inputs at InputTimes (output from this routine only @@ -287,24 +232,18 @@ subroutine DirtDyn_UpdateStates( t, n, Inputs, InputTimes, p, x, xd, z, OtherSta type(DirtD_DiscreteStateType) :: xd_t ! Discrete states at t (copy) type(DirtD_ConstraintStateType) :: z_Residual ! Residual of the constraint state functions (Z) type(DirtD_InputType) :: u ! Instantaneous inputs - integer(IntKi) :: ErrStat2 ! local error status character(ErrMsgLen) :: ErrMsg2 ! local error message character(*), parameter :: RoutineName = 'DirtDyn_UpdateStates' - ! Initialize variables ErrStat = ErrID_None ! no error has occurred ErrMsg = "" - ! This subroutine contains an example of how the states could be updated. Developers will ! want to adjust the logic as necessary for their own situations. - - ! Get the inputs at time t, based on the array of values sent by the glue code: - ! before calling ExtrapInterp routine, memory in u must be allocated; we can do that with a copy: call DirtD_CopyInput( Inputs(1), u, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) @@ -320,80 +259,22 @@ subroutine DirtDyn_UpdateStates( t, n, Inputs, InputTimes, p, x, xd, z, OtherSta return end if - - -! ! Get first time derivatives of continuous states (dxdt): -! -! call DirtDyn_CalcContStateDeriv( t, u, p, x, xd, z, OtherState, m, dxdt, ErrStat2, ErrMsg2 ) -! call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) -! if ( ErrStat >= AbortErrLev ) then -! call cleanup() -! return -! end if -! -! -! ! Update discrete states: -! ! Note that xd [discrete state] is changed in DirtDyn_UpdateDiscState() so xd will now contain values at t+Interval -! ! We'll first make a copy that contains xd at time t, which will be used in computing the constraint states -! call DirtDyn_CopyDiscState( xd, xd_t, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) -! call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) -! if ( ErrStat >= AbortErrLev ) then -! call cleanup() -! return -! end if -! -! call DirtDyn_UpdateDiscState( t, n, u, p, x, xd, z, OtherState, m, ErrStat2, ErrMsg2 ) -! call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) -! if ( ErrStat >= AbortErrLev ) then -! call cleanup() -! return -! end if -! -! -! ! Solve for the constraint states (z) here: -! -! ! Iterate until the value is within a given tolerance. -! -! ! DO -! -! call DirtDyn_CalcConstrStateResidual( t, u, p, x, xd_t, z, OtherState, m, Z_Residual, ErrStat2, ErrMsg2 ) -! call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) -! if ( ErrStat >= AbortErrLev ) then -! call cleanup() -! return -! end if -! -! ! z = -! -! ! END DO - - - - ! Integrate (update) continuous states (x) here: - - !x = function of dxdt and x - - ! Destroy local variables before returning call cleanup() - contains subroutine cleanup() - ! note that this routine inherits all of the data in DirtDyn_UpdateStates - - call DirtD_DestroyInput( u, ErrStat2, ErrMsg2) call DirtD_DestroyConstrState( Z_Residual, ErrStat2, ErrMsg2) call DirtD_DestroyContState( dxdt, ErrStat2, ErrMsg2) call DirtD_DestroyDiscState( xd_t, ErrStat2, ErrMsg2) - end subroutine cleanup end subroutine DirtDyn_UpdateStates + + !---------------------------------------------------------------------------------------------------------------------------------- !> This is a routine for computing outputs, used in both loose and tight coupling. subroutine DirtDyn_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) -!.................................................................................................................................. real(DbKi), intent(in ) :: t !< Current simulation time in seconds type(DirtD_InputType), intent(in ) :: u !< Inputs at t @@ -410,463 +291,27 @@ subroutine DirtDyn_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, Err ! Initialize ErrStat - ErrStat = ErrID_None ErrMsg = "" - ! Compute outputs here: y%DummyOutput = 2.0_ReKi - y%WriteOutput(1) = REAL(t,ReKi) y%WriteOutput(2) = 1.0_ReKi - end subroutine DirtDyn_CalcOutput -!---------------------------------------------------------------------------------------------------------------------------------- -!!!!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -!!!!> This is a tight coupling routine for computing derivatives of continuous states. -!!!SUBROUTINE DirtDyn_CalcContStateDeriv( t, u, p, x, xd, z, OtherState, m, dxdt, ErrStat, ErrMsg ) -!!!!.................................................................................................................................. -!!! -!!! REAL(DbKi), INTENT(IN ) :: t !< Current simulation time in seconds -!!! TYPE(DirtD_InputType), INTENT(IN ) :: u !< Inputs at t -!!! TYPE(DirtD_ParameterType), INTENT(IN ) :: p !< Parameters -!!! TYPE(DirtD_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at t -!!! TYPE(DirtD_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at t -!!! TYPE(DirtD_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at t -!!! TYPE(DirtD_OtherStateType), INTENT(IN ) :: OtherState !< Other states at t -!!! TYPE(DirtD_MiscVarType), INTENT(INOUT) :: m !< Misc variables for optimization (not copied in glue code) -!!! TYPE(DirtD_ContinuousStateType), INTENT( OUT) :: dxdt !< Continuous state derivatives at t -!!! INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation -!!! CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None -!!! -!!! -!!! ! Initialize ErrStat -!!! -!!! ErrStat = ErrID_None -!!! ErrMsg = "" -!!! -!!! -!!! ! Compute the first time derivatives of the continuous states here: -!!! -!!! dxdt%DummyContState = 0.0_ReKi -!!! -!!!END SUBROUTINE DirtDyn_CalcContStateDeriv -!!!!---------------------------------------------------------------------------------------------------------------------------------- -!!!!> This is a tight coupling routine for updating discrete states. -!!!SUBROUTINE DirtDyn_UpdateDiscState( t, n, u, p, x, xd, z, OtherState, m, ErrStat, ErrMsg ) -!!!!.................................................................................................................................. -!!! -!!! REAL(DbKi), INTENT(IN ) :: t !< Current simulation time in seconds -!!! INTEGER(IntKi), INTENT(IN ) :: n !< Current step of the simulation: t = n*Interval -!!! TYPE(DirtD_InputType), INTENT(IN ) :: u !< Inputs at t -!!! TYPE(DirtD_ParameterType), INTENT(IN ) :: p !< Parameters -!!! TYPE(DirtD_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at t -!!! TYPE(DirtD_DiscreteStateType), INTENT(INOUT) :: xd !< Input: Discrete states at t; -!!! !! Output: Discrete states at t + Interval -!!! TYPE(DirtD_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at t -!!! TYPE(DirtD_OtherStateType), INTENT(IN ) :: OtherState !< Other states at t -!!! TYPE(DirtD_MiscVarType), INTENT(INOUT) :: m !< Misc variables for optimization (not copied in glue code) -!!! INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation -!!! CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None -!!! -!!! -!!! ! Initialize ErrStat -!!! -!!! ErrStat = ErrID_None -!!! ErrMsg = "" -!!! -!!! -!!! ! Update discrete states here: -!!! -!!! xd%DummyDiscState = 0.0_Reki -!!! -!!!END SUBROUTINE DirtDyn_UpdateDiscState -!!!!---------------------------------------------------------------------------------------------------------------------------------- -!!!!> This is a tight coupling routine for solving for the residual of the constraint state functions. -!!!SUBROUTINE DirtDyn_CalcConstrStateResidual( t, u, p, x, xd, z, OtherState, m, Z_residual, ErrStat, ErrMsg ) -!!!!.................................................................................................................................. -!!! -!!! REAL(DbKi), INTENT(IN ) :: t !< Current simulation time in seconds -!!! TYPE(DirtD_InputType), INTENT(IN ) :: u !< Inputs at t -!!! TYPE(DirtD_ParameterType), INTENT(IN ) :: p !< Parameters -!!! TYPE(DirtD_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at t -!!! TYPE(DirtD_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at t -!!! TYPE(DirtD_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at t (possibly a guess) -!!! TYPE(DirtD_OtherStateType), INTENT(IN ) :: OtherState !< Other states at t -!!! TYPE(DirtD_MiscVarType), INTENT(INOUT) :: m !< Misc variables for optimization (not copied in glue code) -!!! TYPE(DirtD_ConstraintStateType), INTENT( OUT) :: Z_residual !< Residual of the constraint state functions using -!!! !! the input values described above -!!! INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation -!!! CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None -!!! -!!! -!!! ! Initialize ErrStat -!!! -!!! ErrStat = ErrID_None -!!! ErrMsg = "" -!!! -!!! -!!! ! Solve for the residual of the constraint state functions here: -!!! -!!! Z_residual%DummyConstrState = 0.0_ReKi -!!! -!!!END SUBROUTINE DirtDyn_CalcConstrStateResidual -!!!!---------------------------------------------------------------------------------------------------------------------------------- -!!! -!!! -!!!!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -!!!! ###### The following four routines are Jacobian routines for linearization capabilities ####### -!!!! If the module does not implement them, set ErrStat = ErrID_Fatal in DirtDyn_Init() when InitInp%Linearize is .true. -!!!!---------------------------------------------------------------------------------------------------------------------------------- -!!!!> Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions -!!!!! with respect to the inputs (u). The partial derivatives dY/du, dX/du, dXd/du, and DZ/du are returned. -!!!SUBROUTINE DirtDyn_JacobianPInput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdu, dXdu, dXddu, dZdu) -!!!!.................................................................................................................................. -!!! -!!! REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point -!!! TYPE(DirtD_InputType), INTENT(IN ) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) -!!! TYPE(DirtD_ParameterType), INTENT(IN ) :: p !< Parameters -!!! TYPE(DirtD_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at operating point -!!! TYPE(DirtD_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at operating point -!!! TYPE(DirtD_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at operating point -!!! TYPE(DirtD_OtherStateType), INTENT(IN ) :: OtherState !< Other states at operating point -!!! TYPE(DirtD_OutputType), INTENT(IN ) :: y !< Output (change to inout if a mesh copy is required); -!!! !! Output fields are not used by this routine, but type is -!!! !! available here so that mesh parameter information (i.e., -!!! !! connectivity) does not have to be recalculated for dYdu. -!!! TYPE(DirtD_MiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables -!!! INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation -!!! CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None -!!! REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dYdu(:,:) !< Partial derivatives of output functions (Y) with respect -!!! !! to the inputs (u) [intent in to avoid deallocation] -!!! REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXdu(:,:) !< Partial derivatives of continuous state functions (X) with -!!! !! respect to the inputs (u) [intent in to avoid deallocation] -!!! REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXddu(:,:) !< Partial derivatives of discrete state functions (Xd) with -!!! !! respect to the inputs (u) [intent in to avoid deallocation] -!!! REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dZdu(:,:) !< Partial derivatives of constraint state functions (Z) with -!!! !! respect to the inputs (u) [intent in to avoid deallocation] -!!! -!!! -!!! ! Initialize ErrStat -!!! -!!! ErrStat = ErrID_None -!!! ErrMsg = '' -!!! -!!! -!!! IF ( PRESENT( dYdu ) ) THEN -!!! -!!! ! Calculate the partial derivative of the output functions (Y) with respect to the inputs (u) here: -!!! -!!! ! allocate and set dYdu -!!! -!!! END IF -!!! -!!! IF ( PRESENT( dXdu ) ) THEN -!!! -!!! ! Calculate the partial derivative of the continuous state functions (X) with respect to the inputs (u) here: -!!! -!!! ! allocate and set dXdu -!!! -!!! END IF -!!! -!!! IF ( PRESENT( dXddu ) ) THEN -!!! -!!! ! Calculate the partial derivative of the discrete state functions (Xd) with respect to the inputs (u) here: -!!! -!!! ! allocate and set dXddu -!!! -!!! END IF -!!! -!!! IF ( PRESENT( dZdu ) ) THEN -!!! -!!! ! Calculate the partial derivative of the constraint state functions (Z) with respect to the inputs (u) here: -!!! -!!! ! allocate and set dZdu -!!! -!!! END IF -!!! -!!! -!!!END SUBROUTINE DirtDyn_JacobianPInput -!!!!---------------------------------------------------------------------------------------------------------------------------------- -!!!!> Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions -!!!!! with respect to the continuous states (x). The partial derivatives dY/dx, dX/dx, dXd/dx, and DZ/dx are returned. -!!!SUBROUTINE DirtDyn_JacobianPContState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdx, dXdx, dXddx, dZdx ) -!!!!.................................................................................................................................. -!!! -!!! REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point -!!! TYPE(DirtD_InputType), INTENT(IN ) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) -!!! TYPE(DirtD_ParameterType), INTENT(IN ) :: p !< Parameters -!!! TYPE(DirtD_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at operating point -!!! TYPE(DirtD_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at operating point -!!! TYPE(DirtD_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at operating point -!!! TYPE(DirtD_OtherStateType), INTENT(IN ) :: OtherState !< Other states at operating point -!!! TYPE(DirtD_OutputType), INTENT(IN ) :: y !< Output (change to inout if a mesh copy is required); -!!! !! Output fields are not used by this routine, but type is -!!! !! available here so that mesh parameter information (i.e., -!!! !! connectivity) does not have to be recalculated for dYdx. -!!! TYPE(DirtD_MiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables -!!! INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation -!!! CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None -!!! REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dYdx(:,:) !< Partial derivatives of output functions -!!! !! (Y) with respect to the continuous -!!! !! states (x) [intent in to avoid deallocation] -!!! REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXdx(:,:) !< Partial derivatives of continuous state -!!! !! functions (X) with respect to -!!! !! the continuous states (x) [intent in to avoid deallocation] -!!! REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXddx(:,:) !< Partial derivatives of discrete state -!!! !! functions (Xd) with respect to -!!! !! the continuous states (x) [intent in to avoid deallocation] -!!! REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dZdx(:,:) !< Partial derivatives of constraint state -!!! !! functions (Z) with respect to -!!! !! the continuous states (x) [intent in to avoid deallocation] -!!! -!!! -!!! ! Initialize ErrStat -!!! -!!! ErrStat = ErrID_None -!!! ErrMsg = '' -!!! -!!! -!!! -!!! IF ( PRESENT( dYdx ) ) THEN -!!! -!!! ! Calculate the partial derivative of the output functions (Y) with respect to the continuous states (x) here: -!!! -!!! ! allocate and set dYdx -!!! -!!! END IF -!!! -!!! IF ( PRESENT( dXdx ) ) THEN -!!! -!!! ! Calculate the partial derivative of the continuous state functions (X) with respect to the continuous states (x) here: -!!! -!!! ! allocate and set dXdx -!!! -!!! END IF -!!! -!!! IF ( PRESENT( dXddx ) ) THEN -!!! -!!! ! Calculate the partial derivative of the discrete state functions (Xd) with respect to the continuous states (x) here: -!!! -!!! ! allocate and set dXddx -!!! -!!! END IF -!!! -!!! IF ( PRESENT( dZdx ) ) THEN -!!! -!!! -!!! ! Calculate the partial derivative of the constraint state functions (Z) with respect to the continuous states (x) here: -!!! -!!! ! allocate and set dZdx -!!! -!!! END IF -!!! -!!! -!!!END SUBROUTINE DirtDyn_JacobianPContState -!!!!---------------------------------------------------------------------------------------------------------------------------------- -!!!!> Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions -!!!!! with respect to the discrete states (xd). The partial derivatives dY/dxd, dX/dxd, dXd/dxd, and DZ/dxd are returned. -!!!SUBROUTINE DirtDyn_JacobianPDiscState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdxd, dXdxd, dXddxd, dZdxd ) -!!!!.................................................................................................................................. -!!! -!!! REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point -!!! TYPE(DirtD_InputType), INTENT(IN ) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) -!!! TYPE(DirtD_ParameterType), INTENT(IN ) :: p !< Parameters -!!! TYPE(DirtD_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at operating point -!!! TYPE(DirtD_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at operating point -!!! TYPE(DirtD_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at operating point -!!! TYPE(DirtD_OtherStateType), INTENT(IN ) :: OtherState !< Other states at operating point -!!! TYPE(DirtD_OutputType), INTENT(IN ) :: y !< Output (change to inout if a mesh copy is required); -!!! !! Output fields are not used by this routine, but type is -!!! !! available here so that mesh parameter information (i.e., -!!! !! connectivity) does not have to be recalculated for dYdxd. -!!! TYPE(DirtD_MiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables -!!! INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation -!!! CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None -!!! REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dYdxd(:,:) !< Partial derivatives of output functions -!!! !! (Y) with respect to the discrete -!!! !! states (xd) [intent in to avoid deallocation] -!!! REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXdxd(:,:) !< Partial derivatives of continuous state -!!! !! functions (X) with respect to the -!!! !! discrete states (xd) [intent in to avoid deallocation] -!!! REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXddxd(:,:)!< Partial derivatives of discrete state -!!! !! functions (Xd) with respect to the -!!! !! discrete states (xd) [intent in to avoid deallocation] -!!! REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dZdxd(:,:) !< Partial derivatives of constraint state -!!! !! functions (Z) with respect to the -!!! !! discrete states (xd) [intent in to avoid deallocation] -!!! -!!! -!!! ! Initialize ErrStat -!!! -!!! ErrStat = ErrID_None -!!! ErrMsg = '' -!!! -!!! -!!! IF ( PRESENT( dYdxd ) ) THEN -!!! -!!! ! Calculate the partial derivative of the output functions (Y) with respect to the discrete states (xd) here: -!!! -!!! ! allocate and set dYdxd -!!! -!!! END IF -!!! -!!! IF ( PRESENT( dXdxd ) ) THEN -!!! -!!! ! Calculate the partial derivative of the continuous state functions (X) with respect to the discrete states (xd) here: -!!! -!!! ! allocate and set dXdxd -!!! -!!! END IF -!!! -!!! IF ( PRESENT( dXddxd ) ) THEN -!!! -!!! ! Calculate the partial derivative of the discrete state functions (Xd) with respect to the discrete states (xd) here: -!!! -!!! ! allocate and set dXddxd -!!! -!!! END IF -!!! -!!! IF ( PRESENT( dZdxd ) ) THEN -!!! -!!! ! Calculate the partial derivative of the constraint state functions (Z) with respect to the discrete states (xd) here: -!!! -!!! ! allocate and set dZdxd -!!! -!!! END IF -!!! -!!! -!!!END SUBROUTINE DirtDyn_JacobianPDiscState -!!!!---------------------------------------------------------------------------------------------------------------------------------- -!!!!> Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions -!!!!! with respect to the constraint states (z). The partial derivatives dY/dz, dX/dz, dXd/dz, and DZ/dz are returned. -!!!SUBROUTINE DirtDyn_JacobianPConstrState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdz, dXdz, dXddz, dZdz ) -!!!!.................................................................................................................................. -!!! -!!! REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point -!!! TYPE(DirtD_InputType), INTENT(IN ) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) -!!! TYPE(DirtD_ParameterType), INTENT(IN ) :: p !< Parameters -!!! TYPE(DirtD_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at operating point -!!! TYPE(DirtD_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at operating point -!!! TYPE(DirtD_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at operating point -!!! TYPE(DirtD_OtherStateType), INTENT(IN ) :: OtherState !< Other states at operating point -!!! TYPE(DirtD_OutputType), INTENT(IN ) :: y !< Output (change to inout if a mesh copy is required); -!!! !! Output fields are not used by this routine, but type is -!!! !! available here so that mesh parameter information (i.e., -!!! !! connectivity) does not have to be recalculated for dYdz. -!!! TYPE(DirtD_MiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables -!!! INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation -!!! CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None -!!! REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dYdz(:,:) !< Partial derivatives of output -!!! !! functions (Y) with respect to the -!!! !! constraint states (z) [intent in to avoid deallocation] -!!! REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXdz(:,:) !< Partial derivatives of continuous -!!! !! state functions (X) with respect to -!!! !! the constraint states (z) [intent in to avoid deallocation] -!!! REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXddz(:,:) !< Partial derivatives of discrete state -!!! !! functions (Xd) with respect to the -!!! !! constraint states (z) [intent in to avoid deallocation] -!!! REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dZdz(:,:) !< Partial derivatives of constraint -!!! !! state functions (Z) with respect to -!!! !! the constraint states (z) [intent in to avoid deallocation] -!!! -!!! -!!! ! Initialize ErrStat -!!! -!!! ErrStat = ErrID_None -!!! ErrMsg = '' -!!! -!!! IF ( PRESENT( dYdz ) ) THEN -!!! -!!! ! Calculate the partial derivative of the output functions (Y) with respect to the constraint states (z) here: -!!! -!!! ! allocate and set dYdz -!!! -!!! END IF -!!! -!!! IF ( PRESENT( dXdz ) ) THEN -!!! -!!! ! Calculate the partial derivative of the continuous state functions (X) with respect to the constraint states (z) here: -!!! -!!! ! allocate and set dXdz -!!! -!!! END IF -!!! -!!! IF ( PRESENT( dXddz ) ) THEN -!!! -!!! ! Calculate the partial derivative of the discrete state functions (Xd) with respect to the constraint states (z) here: -!!! -!!! ! allocate and set dXddz -!!! -!!! END IF -!!! -!!! IF ( PRESENT( dZdz ) ) THEN -!!! -!!! ! Calculate the partial derivative of the constraint state functions (Z) with respect to the constraint states (z) here: -!!! -!!! ! allocate and set dZdz -!!! -!!! END IF -!!! -!!! -!!!END SUBROUTINE DirtDyn_JacobianPConstrState -!!!!---------------------------------------------------------------------------------------------------------------------------------- -!!!!> Routine to pack the data structures representing the operating points into arrays for linearization. -!!!SUBROUTINE DirtDyn_GetOP( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, u_op, y_op, x_op, dx_op, xd_op, z_op ) -!!! -!!! REAL(DbKi), intent(in ) :: t !< Time in seconds at operating point -!!! TYPE(DirtD_InputType), intent(in ) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) -!!! TYPE(DirtD_ParameterType), intent(in ) :: p !< Parameters -!!! TYPE(DirtD_ContinuousStateType), intent(in ) :: x !< Continuous states at operating point -!!! TYPE(DirtD_DiscreteStateType), intent(in ) :: xd !< Discrete states at operating point -!!! TYPE(DirtD_ConstraintStateType), intent(in ) :: z !< Constraint states at operating point -!!! TYPE(DirtD_OtherStateType), intent(in ) :: OtherState !< Other states at operating point -!!! TYPE(DirtD_OutputType), intent(in ) :: y !< Output at operating point -!!! TYPE(DirtD_MiscVarType), intent(inout) :: m !< Misc/optimization variables -!!! INTEGER(IntKi), intent( out) :: ErrStat !< Error status of the operation -!!! CHARACTER(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None -!!! REAL(ReKi), ALLOCATABLE, OPTIONAL, intent(inout) :: u_op(:) !< values of linearized inputs -!!! REAL(ReKi), ALLOCATABLE, OPTIONAL, intent(inout) :: y_op(:) !< values of linearized outputs -!!! REAL(ReKi), ALLOCATABLE, OPTIONAL, intent(inout) :: x_op(:) !< values of linearized continuous states -!!! REAL(ReKi), ALLOCATABLE, OPTIONAL, intent(inout) :: dx_op(:) !< values of first time derivatives of linearized continuous states -!!! REAL(ReKi), ALLOCATABLE, OPTIONAL, intent(inout) :: xd_op(:) !< values of linearized discrete states -!!! REAL(ReKi), ALLOCATABLE, OPTIONAL, intent(inout) :: z_op(:) !< values of linearized constraint states -!!! -!!! -!!! ! Initialize ErrStat -!!! -!!! ErrStat = ErrID_None -!!! ErrMsg = '' -!!! -!!! IF ( PRESENT( u_op ) ) THEN -!!! -!!! END IF -!!! -!!! IF ( PRESENT( y_op ) ) THEN -!!! END IF -!!! -!!! IF ( PRESENT( x_op ) ) THEN -!!! -!!! END IF -!!! -!!! IF ( PRESENT( dx_op ) ) THEN -!!! -!!! END IF -!!! -!!! IF ( PRESENT( xd_op ) ) THEN -!!! -!!! END IF -!!! -!!! IF ( PRESENT( z_op ) ) THEN -!!! -!!! END IF -!!! -!!!END SUBROUTINE DirtDyn_GetOP -!!!!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - END MODULE DirtDyn + !********************************************************************************************************************************** +!NOTE: the following have been omitted. When we add the other methods for calculating (6x6 Stiffness/Damping) and the P-Y curve, then +! some of these will need to be added. Leaving this as a placeholder for the moment. +!SUBROUTINE DirtDyn_CalcContStateDeriv( t, u, p, x, xd, z, OtherState, m, dxdt, ErrStat, ErrMsg ) +!SUBROUTINE DirtDyn_UpdateDiscState( t, n, u, p, x, xd, z, OtherState, m, ErrStat, ErrMsg ) +!SUBROUTINE DirtDyn_CalcConstrStateResidual( t, u, p, x, xd, z, OtherState, m, Z_residual, ErrStat, ErrMsg ) +!SUBROUTINE DirtDyn_JacobianPInput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdu, dXdu, dXddu, dZdu) +!SUBROUTINE DirtDyn_JacobianPContState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdx, dXdx, dXddx, dZdx ) +!SUBROUTINE DirtDyn_JacobianPDiscState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdxd, dXdxd, dXddxd, dZdxd ) +!SUBROUTINE DirtDyn_JacobianPConstrState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdz, dXdz, dXddz, dZdz ) +!SUBROUTINE DirtDyn_GetOP( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, u_op, y_op, x_op, dx_op, xd_op, z_op ) diff --git a/modules/dirtdyn/src/REDWINinterface.f90 b/modules/dirtdyn/src/REDWINinterface.f90 index 6ad991387..1c334f593 100644 --- a/modules/dirtdyn/src/REDWINinterface.f90 +++ b/modules/dirtdyn/src/REDWINinterface.f90 @@ -21,18 +21,13 @@ MODULE REDWINinterface USE NWTC_Library USE DirtDyn_Types - USE, INTRINSIC :: ISO_C_Binding IMPLICIT NONE - type(ProgDesc), parameter :: REDWINinterface_Ver = ProgDesc( 'DirtDyn Interface for REDWIN soil interaction DLLs', 'using '//TRIM(OS_Desc), '99-Feb-2020' ) - !> Definition of the DLL Interface (from REDWIN): - !! Note that aviFAIL and avcMSG should be used as INTENT(OUT), but I'm defining them INTENT(INOUT) just in case the compiler decides to reinitialize something that's INTENT(OUT) abstract interface - subroutine REDWINdll_interface(PROPSFILE, LDISPFILE, IDTask, nErrorCode, ErrorCode, Props, StVar, StVarPrint, Disp, Force, D) - USE, INTRINSIC :: ISO_C_Binding - ! Define standard arguments for 'InterfaceFoundation' + subroutine REDWINdll_interface_v00(PROPSFILE, LDISPFILE, IDTask, nErrorCode, ErrorCode, Props, StVar, StVarPrint, Disp, Force, D) + USE, INTRINSIC :: ISO_C_Binding, only : C_INT, C_CHAR, C_DOUBLE character(kind=c_char), intent(in ) :: PROPSFILE(45) character(kind=c_char), intent(in ) :: LDISPFILE(45) integer(c_int), intent(in ) :: IDTask @@ -40,17 +35,17 @@ subroutine REDWINdll_interface(PROPSFILE, LDISPFILE, IDTask, nErrorCode, ErrorCo real(c_double), intent(inout) :: Props(1:100, 1:200) real(c_double), intent(inout) :: StVar(1:12, 1:100) integer(c_int), intent(inout) :: StVarPrint(1:12, 1:100) - real(c_double), intent(inout) :: Disp(1:6) - real(c_double), intent(inout) :: Force(1:6) - real(c_double), intent(inout) :: D(1:6,1:6) - integer(c_int), intent(inout) :: ErrorCode(1:100) - end subroutine REDWINdll_interface + real(c_double), intent(in ) :: Disp(1:6) + real(c_double), intent( out) :: Force(1:6) + real(c_double), intent( out) :: D(1:6,1:6) + integer(c_int), intent( out) :: ErrorCode(1:100) + end subroutine REDWINdll_interface_v00 end interface #ifdef STATIC_DLL_LOAD interface subroutine INTERFACEFOUNDATION ( PROPSFILE, LDISPFILE, IDTask, nErrorCode, ErrorCode, Props, StVar, StVarPrint, Disp, Force, D ) BIND(C, NAME='INTERFACEFOUNDATION') - USE, INTRINSIC :: ISO_C_Binding + USE, INTRINSIC :: ISO_C_Binding, only : C_INT, C_CHAR, C_DOUBLE character(kind=c_char), intent(in ) :: PROPSFILE(45) character(kind=c_char), intent(in ) :: LDISPFILE(45) integer(c_int), intent(in ) :: IDTask @@ -66,12 +61,11 @@ end subroutine INTERFACEFOUNDATION end interface #endif - - ! Some constants for the Interface: -! INTEGER(IntKi), PARAMETER :: R_v36 = 85 !< Start of below-rated torque-speed look-up table (record no.) for REDWIN version 3.6 -! INTEGER(IntKi), PARAMETER :: R_v4 = 145 !< Start of below-rated torque-speed look-up table (record no.) for REDWIN version 3.8 and later -! -! INTEGER(IntKi), PARAMETER :: R = R_v4 !< start of the generator speed look-up table + type(ProgDesc), parameter :: REDWINinterface_Ver = ProgDesc( 'DirtDyn Interface for REDWIN soil interaction DLLs', 'using '//TRIM(OS_Desc), '99-Feb-2020' ) + + ! Interface version (in case we end up with multiple different versions supported at some later date) + INTEGER(IntKi), PARAMETER :: RW_v00 = 0 ! Version number + INTEGER(IntKi), PARAMETER :: RW_ver = RW_v00 ! Current version number (read from DLL file) CONTAINS @@ -88,39 +82,42 @@ subroutine CallREDWINdll ( u, DLL, dll_data, p, ErrStat, ErrMsg ) integer(IntKi), intent( out) :: ErrStat ! Error status of the operation character(*), intent( out) :: ErrMsg ! Error message if ErrStat /= ErrID_None -!FIXME: update these ! Local Variables: - character(kind=c_char) :: accINFILE(LEN_TRIM(p%DLL_InFile)+1) ! INFILE - character(kind=c_char) :: avcOUTNAME(LEN_TRIM(p%RootName)+1) ! OUTNAME (Simulation RootName) + character(len=45) :: PROPSFILE ! properties input file + character(len=45) :: LDISPFILE ! displacement input file - PROCEDURE(REDWINdll_interface), POINTER :: REDWIN_Subroutine ! The address of the procedure in the RedWin DLL + PROCEDURE(REDWINdll_interface_V00),POINTER:: REDWIN_Subroutine_v00 ! The address of the procedure in the RedWin DLL -!FIXME: not sure if this step is needed for the REDWIN DLLs - !Convert to C-type characters: the "C_NULL_CHAR" converts the Fortran string to a C-type string (i.e., adds //CHAR(0) to the end) - accINFILE = TRANSFER( TRIM(p%DLL_InFile)//C_NULL_CHAR, accINFILE ) - avcOUTNAME = TRANSFER( TRIM(p%RootName)//C_NULL_CHAR, avcOUTNAME ) + ! Set names of DLL input files to pass + PROPSFILE = TRIM(dll_data%PROPSfile) + LDISPFILE = TRIM(dll_data%LDISPfile) + ! Check existance of DLL input files. The DLL does not check this, and will + ! catastrophically fail if they are not found. + #ifdef STATIC_DLL_LOAD ! if we're statically loading the library (i.e., OpenFOAM), we can just call INTERFACEFOUNDATION(); - CALL INTERFACEFOUNDATION( accINFILE, avcOUTNAME, & !PROPSFILE, LDISPFILE, & + CALL INTERFACEFOUNDATION( PROPSFILE, LDISPFILE, & dll_data%IDTask, dll_data%nErrorCode, dll_data%ErrorCode, & dll_data%Props, dll_data%StVar, dll_data%StVarPrint, & dll_data%Disp, dll_data%Force, dll_data%D ) #else ! Call the DLL (first associate the address from the procedure in the DLL with the subroutine): - CALL C_F_PROCPOINTER( DLL%ProcAddr(1), REDWIN_Subroutine) - CALL REDWIN_Subroutine ( accINFILE, avcOUTNAME, & !PROPSFILE, LDISPFILE, & - dll_data%IDTask, dll_data%nErrorCode, dll_data%ErrorCode, & - dll_data%Props, dll_data%StVar, dll_data%StVarPrint, & - dll_data%Disp, dll_data%Force, dll_data%D ) + if (RW_Ver == RW_v00) then + CALL C_F_PROCPOINTER( transfer(DLL%ProcAddr(1),C_NULL_FUNPTR), REDWIN_Subroutine_v00) + CALL REDWIN_Subroutine_v00 ( PROPSFILE, LDISPFILE, & + dll_data%IDTask, dll_data%nErrorCode, dll_data%ErrorCode, & + dll_data%Props, dll_data%StVar, dll_data%StVarPrint, & + dll_data%Disp, dll_data%Force, dll_data%D ) + endif #endif - -!FIXME: add error trapping routine that parses the ErrorCodes. - + ! Call routine for error trapping the returned ErrorCodes return end subroutine CallREDWINdll + + !================================================================================================================================== !> This routine initializes variables used in the REDWIN DLL interface. subroutine REDWINinterface_Init(u,p,m,y,InputFileData, ErrStat, ErrMsg) @@ -138,31 +135,12 @@ subroutine REDWINinterface_Init(u,p,m,y,InputFileData, ErrStat, ErrMsg) integer(IntKi) :: ErrStat2 ! The error status code character(ErrMsgLen) :: ErrMsg2 ! The error message, if an error occurred - ErrStat = ErrID_None ErrMsg= '' CALL DispNVD( REDWINinterface_Ver ) ! Display the version of this interface -! p%Ptch_Cntrl = InputFileData%Ptch_Cntrl - p%DLL_InFile = InputFileData%DLL_InFile - - - - -!FIXME: do we need to set one? -! p%DLL_DT = InputFileData%DLL_DT -! IF ( .NOT. EqualRealNos( NINT( p%DLL_DT / p%DT ) * p%DT, p%DLL_DT ) ) THEN -! CALL CheckError( ErrID_Fatal, 'DLL_DT must be an integer multiple of DT.' ) -! END IF -! IF ( p%DLL_DT < EPSILON( p%DLL_DT ) ) THEN -! CALL CheckError( ErrID_Fatal, 'DLL_DT must be larger than zero.' ) -! END IF -! IF ( ErrStat >= AbortErrLev ) RETURN - -!FIXME: initialize whatever here (mesh mappings etc) - #ifdef STATIC_DLL_LOAD ! because OpenFOAM needs the MPI task to copy the library, we're not going to dynamically load it; it needs to be loaded at runtime. p%DLL_Trgt%FileName = '' @@ -181,26 +159,23 @@ subroutine REDWINinterface_Init(u,p,m,y,InputFileData, ErrStat, ErrMsg) p%UseREDWINinterface = .TRUE. !FIXME: do I need to call it once to get it to actually initialize? And when? - !CALL CallREDWINdll(p%DLL_Trgt, m%dll_data, ErrStat2, ErrMsg2) - ! CALL CheckError(ErrStat2,ErrMsg2) - ! IF ( ErrStat >= AbortErrLev ) RETURN + CALL CallREDWINdll(u, p%DLL_Trgt, m%dll_data, p, ErrStat2, ErrMsg2) + CALL CheckError(ErrStat2,ErrMsg2) + IF ( ErrStat >= AbortErrLev ) RETURN + CONTAINS - !............................................................................................................................... + ! Sets the error message and level and cleans up if the error is >= AbortErrLev subroutine CheckError(ErrID,Msg) - ! This subroutine sets the error message and level and cleans up if the error is >= AbortErrLev - !............................................................................................................................... ! Passed arguments INTEGER(IntKi), INTENT(IN) :: ErrID ! The error identifier (ErrStat) CHARACTER(*), INTENT(IN) :: Msg ! The error message (ErrMsg) - !............................................................................................................................ ! Set error status/message; !............................................................................................................................ IF ( ErrID /= ErrID_None ) THEN - IF ( ErrStat /= ErrID_None ) ErrMsg = TRIM(ErrMsg)//NewLine ErrMsg = TRIM(ErrMsg)//'REDWINinterface_Init:'//TRIM(Msg) ErrStat = MAX(ErrStat, ErrID) @@ -211,14 +186,17 @@ subroutine CheckError(ErrID,Msg) IF ( ErrStat >= AbortErrLev ) THEN p%UseREDWINinterface = .FALSE. END IF - END IF end subroutine CheckError end subroutine REDWINinterface_Init + + !================================================================================================================================== -!> This routine calls the DLL for the final time (if it was previously called), and frees the dynamic library. +!> This routine would call the DLL a final time, but there appears to be no end routine for the DLL, +!! so we don't need to make a last call. It also frees the dynamic library (doesn't do anything on +!! static linked). subroutine REDWINinterface_End(u, p, m, ErrStat, ErrMsg) TYPE(DirtD_InputType), INTENT(IN ) :: u !< System inputs @@ -231,17 +209,16 @@ subroutine REDWINinterface_End(u, p, m, ErrStat, ErrMsg) INTEGER(IntKi) :: ErrStat2 ! The error status code CHARACTER(ErrMsgLen) :: ErrMsg2 ! The error message, if an error occurred - ! call DLL final time, but skip if we've never called it -!FIXME: is there an end routine for the REDWIN DLLs???? -! CALL CallREDWINdll(u, p%DLL_Trgt, m%dll_data, p, ErrStat, ErrMsg) - - CALL FreeDynamicLib( p%DLL_Trgt, ErrStat2, ErrMsg2 ) ! this doesn't do anything #ifdef STATIC_DLL_LOAD because p%DLL_Trgt is 0 (NULL) + ! Free the library (note: this doesn't do anything #ifdef STATIC_DLL_LOAD because p%DLL_Trgt is 0 (NULL)) + CALL FreeDynamicLib( p%DLL_Trgt, ErrStat2, ErrMsg2 ) IF (ErrStat2 /= ErrID_None) THEN ErrStat = MAX(ErrStat, ErrStat2) ErrMsg = TRIM(ErrMsg)//NewLine//TRIM(ErrMsg2) END IF end subroutine REDWINinterface_End + + !================================================================================================================================== !> This routine sets the AVRswap array, calls the routine from the REDWIN DLL, and sets the outputs from the call to be used as !! necessary in the main ServoDyn CalcOutput routine. @@ -258,12 +235,11 @@ subroutine REDWINinterface_CalcOutput(t, u, p, m, ErrStat, ErrMsg) integer(IntKi) :: ErrStat2 ! The error status code character(ErrMsgLen) :: ErrMsg2 ! The error message, if an error occurred - ! Initialize error values: ErrStat = ErrID_None ErrMsg= '' - - + +!FIXME: add some debugging options #ifdef DEBUG_REDWIN_INTERFACE !CALL WrNumAryFileNR ( 58, m%dll_data%avrSWAP,'1x,ES15.6E2', ErrStat, ErrMsg ) !write(58,'()') @@ -278,7 +254,5 @@ subroutine REDWINinterface_CalcOutput(t, u, p, m, ErrStat, ErrMsg) !write(59,'()') #endif - - end subroutine REDWINinterface_CalcOutput end module REDWINinterface diff --git a/modules/dirtdyn/src/driver/DirtDyn_Driver.f90 b/modules/dirtdyn/src/driver/DirtDyn_Driver.f90 index 5ad53c413..753b8cd73 100644 --- a/modules/dirtdyn/src/driver/DirtDyn_Driver.f90 +++ b/modules/dirtdyn/src/driver/DirtDyn_Driver.f90 @@ -27,22 +27,22 @@ PROGRAM DirtDyn_Driver IMPLICIT NONE integer(IntKi), parameter :: NumInp = 1 !< Number of inputs sent to DirtDyn_UpdateStates - + ! Program variables real(DbKi) :: Time !< Variable for storing time, in seconds real(DbKi) :: TimeInterval !< Interval between time steps, in seconds real(DbKi) :: InputTime(NumInp) !< Variable for storing time associated with inputs, in seconds - + type(DirtD_InitInputType) :: InitInData !< Input data for initialization type(DirtD_InitOutputType) :: InitOutData !< Output data from initialization - + type(DirtD_ContinuousStateType) :: x !< Continuous states type(DirtD_DiscreteStateType) :: xd !< Discrete states type(DirtD_ConstraintStateType) :: z !< Constraint states type(DirtD_ConstraintStateType) :: Z_residual !< Residual of the constraint state functions (Z) type(DirtD_OtherStateType) :: OtherState !< Other states type(DirtD_MiscVarType) :: misc !< Optimization variables - + type(DirtD_ParameterType) :: p !< Parameters type(DirtD_InputType) :: u(NumInp) !< System inputs type(DirtD_OutputType) :: y !< System outputs @@ -69,7 +69,6 @@ PROGRAM DirtDyn_Driver ! Initialize the module - CALL DirtDyn_Init( InitInData, u(1), p, x, xd, z, OtherState, y, misc, TimeInterval, InitOutData, ErrStat, ErrMsg ) IF ( ErrStat /= ErrID_None ) THEN ! Check if there was an error and do something about it if necessary CALL WrScr( ErrMsg ) @@ -77,7 +76,6 @@ PROGRAM DirtDyn_Driver ! Destroy initialization data - CALL DirtD_DestroyInitInput( InitInData, ErrStat, ErrMsg ) CALL DirtD_DestroyInitOutput( InitOutData, ErrStat, ErrMsg ) @@ -88,29 +86,24 @@ PROGRAM DirtDyn_Driver DO n = 0,2 - Time = n*TimeInterval InputTime(1) = Time ! Modify u (likely from the outputs of another module or a set of test conditions) here: - - ! Calculate outputs at n + ! Calculate outputs at n CALL DirtDyn_CalcOutput( Time, u(1), p, x, xd, z, OtherState, y, misc, ErrStat, ErrMsg ) IF ( ErrStat /= ErrID_None ) THEN ! Check if there was an error and do something about it if necessary CALL WrScr( ErrMsg ) END IF - - ! Get state variables at next step: INPUT at step n, OUTPUT at step n + 1 + ! Get state variables at next step: INPUT at step n, OUTPUT at step n + 1 CALL DirtDyn_UpdateStates( Time, n, u, InputTime, p, x, xd, z, OtherState, misc, ErrStat, ErrMsg ) IF ( ErrStat /= ErrID_None ) THEN ! Check if there was an error and do something about it if necessary CALL WrScr( ErrMsg ) - END IF - - + END IF END DO @@ -118,10 +111,9 @@ PROGRAM DirtDyn_Driver ! Routine to terminate program execution !............................................................................................................................... CALL DirtDyn_End( u(1), p, x, xd, z, OtherState, y, misc, ErrStat, ErrMsg ) - + IF ( ErrStat /= ErrID_None ) THEN CALL WrScr( ErrMsg ) END IF - END PROGRAM DirtDyn_Driver From b4cf83e246e9c479e243411442e00f7fdf3d51db Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 4 Feb 2020 15:24:27 -0700 Subject: [PATCH 008/136] DirtDyn: update so static linking is possible --- modules/dirtdyn/src/REDWINinterface.f90 | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/modules/dirtdyn/src/REDWINinterface.f90 b/modules/dirtdyn/src/REDWINinterface.f90 index 1c334f593..a48022650 100644 --- a/modules/dirtdyn/src/REDWINinterface.f90 +++ b/modules/dirtdyn/src/REDWINinterface.f90 @@ -44,7 +44,12 @@ end subroutine REDWINdll_interface_v00 #ifdef STATIC_DLL_LOAD interface - subroutine INTERFACEFOUNDATION ( PROPSFILE, LDISPFILE, IDTask, nErrorCode, ErrorCode, Props, StVar, StVarPrint, Disp, Force, D ) BIND(C, NAME='INTERFACEFOUNDATION') + ! DO NOT REMOVE or MODIFY LINES starting with "!DEC$" or "!GCC$" + ! !DEC$ specifies attributes for IVF and !GCC$ specifies attributes for gfortran + ! NOTE: BIND(C... does not appear to be built into the DLL from REDWIN. + subroutine INTERFACEFOUNDATION ( PROPSFILE, LDISPFILE, IDTask, nErrorCode, ErrorCode, Props, StVar, StVarPrint, Disp, Force, D ) !BIND(C, NAME='INTERFACEFOUNDATION') + !DEC$ ATTRIBUTES DLLIMPORT :: INTERFACEFOUNDATION + !GCC$ ATTRIBUTES DLLIMPORT :: INTERFACEFOUNDATION USE, INTRINSIC :: ISO_C_Binding, only : C_INT, C_CHAR, C_DOUBLE character(kind=c_char), intent(in ) :: PROPSFILE(45) character(kind=c_char), intent(in ) :: LDISPFILE(45) From e74522c837bc224ed3fa18fe0c1d6d6113aac5f5 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 4 Feb 2020 17:30:28 -0700 Subject: [PATCH 009/136] DirtDyn: remove unused file --- .../dirtdyn/src/driver/.DirtDyn_Driver.f90.swp | Bin 20480 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 modules/dirtdyn/src/driver/.DirtDyn_Driver.f90.swp diff --git a/modules/dirtdyn/src/driver/.DirtDyn_Driver.f90.swp b/modules/dirtdyn/src/driver/.DirtDyn_Driver.f90.swp deleted file mode 100644 index b41b621d79ab72e2c12b0aebda9f227410e37bc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20480 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 afM!55pc&u*l>=z~_4LhtJ^kio*#8SrvOnYi From 7000de611e87f5437a2b4253572cfc77b64924fb Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 5 Feb 2020 14:31:04 -0700 Subject: [PATCH 010/136] DirtDyn: add preproc command for quicker development work. --- modules/dirtdyn/src/REDWINinterface.f90 | 26 +++++++++++++++++-- modules/dirtdyn/src/driver/DirtDyn_Driver.f90 | 14 +++++++--- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/modules/dirtdyn/src/REDWINinterface.f90 b/modules/dirtdyn/src/REDWINinterface.f90 index a48022650..353f410b9 100644 --- a/modules/dirtdyn/src/REDWINinterface.f90 +++ b/modules/dirtdyn/src/REDWINinterface.f90 @@ -137,8 +137,9 @@ subroutine REDWINinterface_Init(u,p,m,y,InputFileData, ErrStat, ErrMsg) character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None ! local variables - integer(IntKi) :: ErrStat2 ! The error status code - character(ErrMsgLen) :: ErrMsg2 ! The error message, if an error occurred + integer(IntKi) :: ErrStat2 ! The error status code + character(ErrMsgLen) :: ErrMsg2 ! The error message, if an error occurred + character(*), parameter :: RoutineName = 'REDWINinterface_Init' ErrStat = ErrID_None @@ -155,18 +156,27 @@ subroutine REDWINinterface_Init(u,p,m,y,InputFileData, ErrStat, ErrMsg) p%DLL_Trgt%FileName = InputFileData%DLL_FileName p%DLL_Trgt%ProcName = "" ! initialize all procedures to empty so we try to load only one p%DLL_Trgt%ProcName(1) = InputFileData%DLL_ProcName +#ifdef NO_LibLoad + CALL SetErrStat( ErrID_Warn,' --> Skipping LoadDynamicLib call for '//TRIM(InputFileData%DLL_FileName),ErrStat,ErrMsg,RoutineName ) +#else CALL LoadDynamicLib ( p%DLL_Trgt, ErrStat2, ErrMsg2 ) CALL CheckError(ErrStat2,ErrMsg2) IF ( ErrStat >= AbortErrLev ) RETURN +#endif #endif ! Set status flag: p%UseREDWINinterface = .TRUE. !FIXME: do I need to call it once to get it to actually initialize? And when? +#ifdef NO_LibLoad + CALL SetErrStat( ErrID_Warn,' --> Skipping DynamicLib call for '//TRIM(p%DLL_Trgt%FileName),ErrStat,ErrMsg,RoutineName ) +#else + ! Initialize DLL CALL CallREDWINdll(u, p%DLL_Trgt, m%dll_data, p, ErrStat2, ErrMsg2) CALL CheckError(ErrStat2,ErrMsg2) IF ( ErrStat >= AbortErrLev ) RETURN +#endif CONTAINS ! Sets the error message and level and cleans up if the error is >= AbortErrLev @@ -213,13 +223,20 @@ subroutine REDWINinterface_End(u, p, m, ErrStat, ErrMsg) ! local variables: INTEGER(IntKi) :: ErrStat2 ! The error status code CHARACTER(ErrMsgLen) :: ErrMsg2 ! The error message, if an error occurred + character(*), parameter :: RoutineName = 'REDWINinterface_End' +#ifdef NO_LibLoad + ErrStat = ErrID_None + ErrMsg= '' + CALL SetErrStat( ErrID_Warn,' --> Skipping DynamicLib call for '//TRIM(p%DLL_Trgt%FileName),ErrStat,ErrMsg,RoutineName ) +#else ! Free the library (note: this doesn't do anything #ifdef STATIC_DLL_LOAD because p%DLL_Trgt is 0 (NULL)) CALL FreeDynamicLib( p%DLL_Trgt, ErrStat2, ErrMsg2 ) IF (ErrStat2 /= ErrID_None) THEN ErrStat = MAX(ErrStat, ErrStat2) ErrMsg = TRIM(ErrMsg)//NewLine//TRIM(ErrMsg2) END IF +#endif end subroutine REDWINinterface_End @@ -239,6 +256,7 @@ subroutine REDWINinterface_CalcOutput(t, u, p, m, ErrStat, ErrMsg) ! local variables: integer(IntKi) :: ErrStat2 ! The error status code character(ErrMsgLen) :: ErrMsg2 ! The error message, if an error occurred + character(*), parameter :: RoutineName = 'REDWINinterface_CalcOutput' ! Initialize error values: ErrStat = ErrID_None @@ -250,9 +268,13 @@ subroutine REDWINinterface_CalcOutput(t, u, p, m, ErrStat, ErrMsg) !write(58,'()') #endif +#ifdef NO_LibLoad + CALL SetErrStat( ErrID_Warn,' --> Skipping DynamicLib call for '//TRIM(p%DLL_Trgt%FileName),ErrStat,ErrMsg,RoutineName ) +#else ! Call the REDWIN-style DLL: CALL CallREDWINdll(u, p%DLL_Trgt, m%dll_data, p, ErrStat, ErrMsg) IF ( ErrStat >= AbortErrLev ) RETURN +#endif #ifdef DEBUG_REDWIN_INTERFACE !CALL WrNumAryFileNR ( 59, m%dll_data%avrSWAP,'1x,ES15.6E2', ErrStat, ErrMsg ) diff --git a/modules/dirtdyn/src/driver/DirtDyn_Driver.f90 b/modules/dirtdyn/src/driver/DirtDyn_Driver.f90 index 753b8cd73..dea2c0043 100644 --- a/modules/dirtdyn/src/driver/DirtDyn_Driver.f90 +++ b/modules/dirtdyn/src/driver/DirtDyn_Driver.f90 @@ -71,7 +71,8 @@ PROGRAM DirtDyn_Driver ! Initialize the module CALL DirtDyn_Init( InitInData, u(1), p, x, xd, z, OtherState, y, misc, TimeInterval, InitOutData, ErrStat, ErrMsg ) IF ( ErrStat /= ErrID_None ) THEN ! Check if there was an error and do something about it if necessary - CALL WrScr( ErrMsg ) + CALL WrScr( 'After Init: '//ErrMsg ) + if ( ErrStat >= AbortErrLev ) call ProgEnd() END IF @@ -95,7 +96,8 @@ PROGRAM DirtDyn_Driver ! Calculate outputs at n CALL DirtDyn_CalcOutput( Time, u(1), p, x, xd, z, OtherState, y, misc, ErrStat, ErrMsg ) IF ( ErrStat /= ErrID_None ) THEN ! Check if there was an error and do something about it if necessary - CALL WrScr( ErrMsg ) + CALL WrScr( 'After CalcOutput: '//ErrMsg ) + if ( ErrStat >= AbortErrLev ) call ProgEnd() END IF @@ -103,6 +105,7 @@ PROGRAM DirtDyn_Driver CALL DirtDyn_UpdateStates( Time, n, u, InputTime, p, x, xd, z, OtherState, misc, ErrStat, ErrMsg ) IF ( ErrStat /= ErrID_None ) THEN ! Check if there was an error and do something about it if necessary CALL WrScr( ErrMsg ) + if ( ErrStat >= AbortErrLev ) call ProgEnd() END IF END DO @@ -113,7 +116,12 @@ PROGRAM DirtDyn_Driver CALL DirtDyn_End( u(1), p, x, xd, z, OtherState, y, misc, ErrStat, ErrMsg ) IF ( ErrStat /= ErrID_None ) THEN - CALL WrScr( ErrMsg ) + CALL WrScr( 'After End: '//ErrMsg ) END IF +CONTAINS + subroutine ProgEnd() + ! Placeholder for moment + Call ProgAbort('Fatal error encountered. Ending.') + end subroutine ProgEnd END PROGRAM DirtDyn_Driver From 037092eaf5cf034814f1009dab768198bb934fb2 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 5 Feb 2020 14:47:22 -0700 Subject: [PATCH 011/136] SoilDyn: name change --- CMakeLists.txt | 2 +- modules/{dirtdyn => soildyn}/CMakeLists.txt | 18 +- modules/{dirtdyn => soildyn}/README.md | 0 .../src/REDWINinterface.f90 | 32 +- .../DirtDyn.f90 => soildyn/src/SoilDyn.f90} | 196 +++--- .../src/SoilDyn_Registry.txt} | 26 +- .../src/SoilDyn_Types.f90} | 570 +++++++++--------- .../src/driver/SoilDyn_Driver.f90} | 52 +- .../SoilDyn-w-registry.sln} | 2 +- .../DirtDyn.vfproj => SoilDyn/SoilDyn.vfproj} | 28 +- 10 files changed, 463 insertions(+), 463 deletions(-) rename modules/{dirtdyn => soildyn}/CMakeLists.txt (66%) rename modules/{dirtdyn => soildyn}/README.md (100%) rename modules/{dirtdyn => soildyn}/src/REDWINinterface.f90 (93%) rename modules/{dirtdyn/src/DirtDyn.f90 => soildyn/src/SoilDyn.f90} (70%) rename modules/{dirtdyn/src/DirtDyn_Registry.txt => soildyn/src/SoilDyn_Registry.txt} (87%) rename modules/{dirtdyn/src/DirtDyn_Types.f90 => soildyn/src/SoilDyn_Types.f90} (84%) rename modules/{dirtdyn/src/driver/DirtDyn_Driver.f90 => soildyn/src/driver/SoilDyn_Driver.f90} (77%) rename vs-build/{DirtDyn/DirtDyn-w-registry.sln => SoilDyn/SoilDyn-w-registry.sln} (96%) rename vs-build/{DirtDyn/DirtDyn.vfproj => SoilDyn/SoilDyn.vfproj} (94%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 645a81fac..f73a82db2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -88,7 +88,7 @@ set(OPENFAST_MODULES aerodyn aerodyn14 servodyn - dirtdyn + soildyn elastodyn beamdyn subdyn diff --git a/modules/dirtdyn/CMakeLists.txt b/modules/soildyn/CMakeLists.txt similarity index 66% rename from modules/dirtdyn/CMakeLists.txt rename to modules/soildyn/CMakeLists.txt index b3a548807..149040f04 100644 --- a/modules/dirtdyn/CMakeLists.txt +++ b/modules/soildyn/CMakeLists.txt @@ -15,23 +15,23 @@ # if (GENERATE_TYPES) - generate_f90_types(src/DirtDyn_Registry.txt ${CMAKE_CURRENT_LIST_DIR}/src/DirtDyn_Types.f90) + generate_f90_types(src/SoilDyn_Registry.txt ${CMAKE_CURRENT_LIST_DIR}/src/SoilDyn_Types.f90) endif() -set(DD_SOURCES +set(SlD_SOURCES src/REDWINinterface.f90 - src/DirtDyn.f90 - src/DirtDyn_Types.f90 + src/SoilDyn.f90 + src/SoilDyn_Types.f90 ) -add_library(dirtdynlib ${DD_SOURCES}) -target_link_libraries(dirtdynlib nwtclibs) +add_library(soildynlib ${SlD_SOURCES}) +target_link_libraries(soildynlib nwtclibs) -add_executable(dirtdyn_driver src/driver/DirtDyn_Driver.f90) -target_link_libraries(dirtdyn_driver dirtdynlib nwtclibs ${CMAKE_DL_LIBS}) +add_executable(soildyn_driver src/driver/SoilDyn_Driver.f90) +target_link_libraries(soildyn_driver soildynlib nwtclibs ${CMAKE_DL_LIBS}) -install(TARGETS dirtdynlib dirtdyn_driver +install(TARGETS soildynlib soildyn_driver EXPORT "${CMAKE_PROJECT_NAME}Libraries" RUNTIME DESTINATION bin LIBRARY DESTINATION lib diff --git a/modules/dirtdyn/README.md b/modules/soildyn/README.md similarity index 100% rename from modules/dirtdyn/README.md rename to modules/soildyn/README.md diff --git a/modules/dirtdyn/src/REDWINinterface.f90 b/modules/soildyn/src/REDWINinterface.f90 similarity index 93% rename from modules/dirtdyn/src/REDWINinterface.f90 rename to modules/soildyn/src/REDWINinterface.f90 index 353f410b9..4ec8d154e 100644 --- a/modules/dirtdyn/src/REDWINinterface.f90 +++ b/modules/soildyn/src/REDWINinterface.f90 @@ -20,7 +20,7 @@ MODULE REDWINinterface USE NWTC_Library - USE DirtDyn_Types + USE SoilDyn_Types IMPLICIT NONE @@ -66,7 +66,7 @@ end subroutine INTERFACEFOUNDATION end interface #endif - type(ProgDesc), parameter :: REDWINinterface_Ver = ProgDesc( 'DirtDyn Interface for REDWIN soil interaction DLLs', 'using '//TRIM(OS_Desc), '99-Feb-2020' ) + type(ProgDesc), parameter :: REDWINinterface_Ver = ProgDesc( 'SoilDyn Interface for REDWIN soil interaction DLLs', 'using '//TRIM(OS_Desc), '99-Feb-2020' ) ! Interface version (in case we end up with multiple different versions supported at some later date) INTEGER(IntKi), PARAMETER :: RW_v00 = 0 ! Version number @@ -79,10 +79,10 @@ end subroutine INTERFACEFOUNDATION subroutine CallREDWINdll ( u, DLL, dll_data, p, ErrStat, ErrMsg ) ! Passed Variables: - type(DirtD_InputType), intent(in ) :: u ! System inputs + type(SlD_InputType), intent(in ) :: u ! System inputs type(DLL_Type), intent(in ) :: DLL ! The DLL to be called. type(REDWINdllType), intent(inout) :: dll_data ! data type containing the avrSWAP, accINFILE, and avcOUTNAME arrays - type(DirtD_ParameterType), intent(in ) :: p ! Parameters + type(SlD_ParameterType), intent(in ) :: p ! Parameters integer(IntKi), intent( out) :: ErrStat ! Error status of the operation character(*), intent( out) :: ErrMsg ! Error message if ErrStat /= ErrID_None @@ -127,12 +127,12 @@ end subroutine CallREDWINdll !> This routine initializes variables used in the REDWIN DLL interface. subroutine REDWINinterface_Init(u,p,m,y,InputFileData, ErrStat, ErrMsg) - type(DirtD_InputType), intent(inout) :: u !< An initial guess for the input; input mesh must be defined - type(DirtD_ParameterType), intent(inout) :: p !< Parameters - type(DirtD_MiscVarType), intent(inout) :: m !< Initial misc (optimization) variables - type(DirtD_OutputType), intent(inout) :: y !< Initial system outputs (outputs are not calculated; - !! only the output mesh is initialized) - type(DirtD_InputFile), intent(inout) :: InputFileData !< Data stored in the module's input file + type(SlD_InputType), intent(inout) :: u !< An initial guess for the input; input mesh must be defined + type(SlD_ParameterType), intent(inout) :: p !< Parameters + type(SlD_MiscVarType), intent(inout) :: m !< Initial misc (optimization) variables + type(SlD_OutputType), intent(inout) :: y !< Initial system outputs (outputs are not calculated; + !! only the output mesh is initialized) + type(SlD_InputFile), intent(inout) :: InputFileData !< Data stored in the module's input file integer(IntKi), intent( out) :: ErrStat !< Error status of the operation character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None @@ -214,9 +214,9 @@ end subroutine REDWINinterface_Init !! static linked). subroutine REDWINinterface_End(u, p, m, ErrStat, ErrMsg) - TYPE(DirtD_InputType), INTENT(IN ) :: u !< System inputs - TYPE(DirtD_ParameterType), INTENT(INOUT) :: p !< Parameters - TYPE(DirtD_MiscVarType), INTENT(INOUT) :: m !< misc (optimization) variables + TYPE(SlD_InputType), INTENT(IN ) :: u !< System inputs + TYPE(SlD_ParameterType), INTENT(INOUT) :: p !< Parameters + TYPE(SlD_MiscVarType), INTENT(INOUT) :: m !< misc (optimization) variables INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None @@ -247,9 +247,9 @@ end subroutine REDWINinterface_End subroutine REDWINinterface_CalcOutput(t, u, p, m, ErrStat, ErrMsg) real(DbKi), intent(in ) :: t !< Current simulation time in seconds - type(DirtD_InputType), intent(in ) :: u !< Inputs at t - type(DirtD_ParameterType), intent(in ) :: p !< Parameters - type(DirtD_MiscVarType), intent(inout) :: m !< misc (optimization) variables + type(SlD_InputType), intent(in ) :: u !< Inputs at t + type(SlD_ParameterType), intent(in ) :: p !< Parameters + type(SlD_MiscVarType), intent(inout) :: m !< misc (optimization) variables integer(IntKi), intent( out) :: ErrStat !< Error status of the operation character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None diff --git a/modules/dirtdyn/src/DirtDyn.f90 b/modules/soildyn/src/SoilDyn.f90 similarity index 70% rename from modules/dirtdyn/src/DirtDyn.f90 rename to modules/soildyn/src/SoilDyn.f90 index f61b5a882..16e5f938b 100644 --- a/modules/dirtdyn/src/DirtDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -1,18 +1,18 @@ !********************************************************************************************************************************** -!> ## DirtDyn -!! The DirtDyn and DirtDyn_Types modules make up a template for creating user-defined calculations in the FAST Modularization -!! Framework. DirtDyn_Types will be auto-generated by the FAST registry program, based on the variables specified in the -!! DirtDyn_Registry.txt file. +!> ## SoilDyn +!! The SoilDyn and SoilDyn_Types modules make up a template for creating user-defined calculations in the FAST Modularization +!! Framework. SoilDyn_Types will be auto-generated by the FAST registry program, based on the variables specified in the +!! SoilDyn_Registry.txt file. !! !! This template file contains comments in the style required for Doxygen, and it contains methods for handling errors. !! -!! "DirtDyn" should be replaced with the name of your module. Example: ElastoDyn \n -!! "DirtDyn" (in DirtDyn_*) should be replaced with the module name or an abbreviation of it. Example: ED +!! "SoilDyn" should be replaced with the name of your module. Example: ElastoDyn \n +!! "SoilDyn" (in SoilDyn_*) should be replaced with the module name or an abbreviation of it. Example: ED ! .................................................................................................................................. !! ## LICENSING !! Copyright (C) 2012-2013, 2015-2016 National Renewable Energy Laboratory !! -!! This file is part of DirtDyn. +!! This file is part of SoilDyn. !! !! Licensed under the Apache License, Version 2.0 (the "License"); !! you may not use this file except in compliance with the License. @@ -26,9 +26,9 @@ !! See the License for the specific language governing permissions and !! limitations under the License. !********************************************************************************************************************************** -MODULE DirtDyn +MODULE SoilDyn - USE DirtDyn_Types + USE SoilDyn_Types USE NWTC_Library USE REDWINinterface @@ -36,23 +36,23 @@ MODULE DirtDyn PRIVATE - TYPE(ProgDesc), PARAMETER :: DirtDyn_Ver = ProgDesc( 'DirtDyn', 'v0.01.00', '99-Feb-2020' ) !< module date/version information + TYPE(ProgDesc), PARAMETER :: SoilDyn_Ver = ProgDesc( 'SoilDyn', 'v0.01.00', '99-Feb-2020' ) !< module date/version information ! ..... Public Subroutines ................................................................................................... - PUBLIC :: DirtDyn_Init ! Initialization routine - PUBLIC :: DirtDyn_End ! Ending routine (includes clean up) - PUBLIC :: DirtDyn_UpdateStates ! Loose coupling routine for solving for constraint states, integrating - PUBLIC :: DirtDyn_CalcOutput ! Routine for computing outputs + PUBLIC :: SoilDyn_Init ! Initialization routine + PUBLIC :: SoilDyn_End ! Ending routine (includes clean up) + PUBLIC :: SoilDyn_UpdateStates ! Loose coupling routine for solving for constraint states, integrating + PUBLIC :: SoilDyn_CalcOutput ! Routine for computing outputs !NOTE: these are placeholders for now. -!!! PUBLIC :: DirtDyn_CalcConstrStateResidual ! Tight coupling routine for returning the constraint state residual -!!! PUBLIC :: DirtDyn_CalcContStateDeriv ! Tight coupling routine for computing derivatives of continuous states -!!! PUBLIC :: DirtDyn_UpdateDiscState ! Tight coupling routine for updating discrete states -!!! PUBLIC :: DirtDyn_JacobianPInput ! Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions all with respect to the inputs (u) -!!! PUBLIC :: DirtDyn_JacobianPContState ! Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions all with respect to the continuous states (x) -!!! PUBLIC :: DirtDyn_JacobianPDiscState ! Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions all with respect to the discrete states (xd) -!!! PUBLIC :: DirtDyn_JacobianPConstrState ! Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions all with respect to the constraint states (z) -!!! PUBLIC :: DirtDyn_GetOP ! Routine to get the operating-point values for linearization (from data structures to arrays) +!!! PUBLIC :: SoilDyn_CalcConstrStateResidual ! Tight coupling routine for returning the constraint state residual +!!! PUBLIC :: SoilDyn_CalcContStateDeriv ! Tight coupling routine for computing derivatives of continuous states +!!! PUBLIC :: SoilDyn_UpdateDiscState ! Tight coupling routine for updating discrete states +!!! PUBLIC :: SoilDyn_JacobianPInput ! Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions all with respect to the inputs (u) +!!! PUBLIC :: SoilDyn_JacobianPContState ! Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions all with respect to the continuous states (x) +!!! PUBLIC :: SoilDyn_JacobianPDiscState ! Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions all with respect to the discrete states (xd) +!!! PUBLIC :: SoilDyn_JacobianPConstrState ! Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions all with respect to the constraint states (z) +!!! PUBLIC :: SoilDyn_GetOP ! Routine to get the operating-point values for linearization (from data structures to arrays) contains @@ -60,19 +60,19 @@ MODULE DirtDyn !> This routine is called at the start of the simulation to perform initialization steps. !! The parameters are set here and not changed during the simulation. !! The initial states and initial guess for the input are defined. -subroutine DirtDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOut, ErrStat, ErrMsg ) - - type(DirtD_InitInputType), intent(in ) :: InitInp !< Input data for initialization routine - type(DirtD_InputType), intent( out) :: u !< An initial guess for the input; input mesh must be defined - type(DirtD_ParameterType), intent( out) :: p !< Parameters - type(DirtD_ContinuousStateType), intent( out) :: x !< Initial continuous states - type(DirtD_DiscreteStateType), intent( out) :: xd !< Initial discrete states - type(DirtD_ConstraintStateType), intent( out) :: z !< Initial guess of the constraint states - type(DirtD_OtherStateType), intent( out) :: OtherState !< Initial other states (logical, etc) - type(DirtD_OutputType), intent( out) :: y !< Initial system outputs - type(DirtD_MiscVarType), intent( out) :: m !< Misc variables for optimization (not copied in glue code) +subroutine SoilDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOut, ErrStat, ErrMsg ) + + type(SlD_InitInputType), intent(in ) :: InitInp !< Input data for initialization routine + type(SlD_InputType), intent( out) :: u !< An initial guess for the input; input mesh must be defined + type(SlD_ParameterType), intent( out) :: p !< Parameters + type(SlD_ContinuousStateType), intent( out) :: x !< Initial continuous states + type(SlD_DiscreteStateType), intent( out) :: xd !< Initial discrete states + type(SlD_ConstraintStateType), intent( out) :: z !< Initial guess of the constraint states + type(SlD_OtherStateType), intent( out) :: OtherState !< Initial other states (logical, etc) + type(SlD_OutputType), intent( out) :: y !< Initial system outputs + type(SlD_MiscVarType), intent( out) :: m !< Misc variables for optimization (not copied in glue code) real(DbKi), intent(inout) :: Interval !< Coupling interval in seconds - type(DirtD_InitOutputType), intent( out) :: InitOut !< Output for initialization routine + type(SlD_InitOutputType), intent( out) :: InitOut !< Output for initialization routine integer(IntKi), intent( out) :: ErrStat !< Error status of the operation character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None @@ -80,8 +80,8 @@ subroutine DirtDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In integer(IntKi) :: NumOuts ! number of outputs; would probably be in the parameter type integer(IntKi) :: ErrStat2 ! local error status character(ErrMsgLen) :: ErrMsg2 ! local error message - character(*), parameter :: RoutineName = 'DirtDyn_Init' - type(DirtD_InputFile) :: InputFileData !< Data stored in the module's input file + character(*), parameter :: RoutineName = 'SoilDyn_Init' + type(SlD_InputFile) :: InputFileData !< Data stored in the module's input file ! Initialize variables ErrStat = ErrID_None @@ -92,7 +92,7 @@ subroutine DirtDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In call NWTC_Init( ) ! Display the module information - call DispNVD( DirtDyn_Ver ) + call DispNVD( SoilDyn_Ver ) ! Define parameters here: @@ -130,7 +130,7 @@ subroutine DirtDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In ! If the module does not implement the four Jacobian routines at the end of this template, or the module cannot ! linearize with the features that are enabled, stop the simulation if InitInp%Linearize is true. - CALL SetErrStat( ErrID_Fatal, 'DirtDyn cannot perform linearization analysis.', ErrStat, ErrMsg, RoutineName) + CALL SetErrStat( ErrID_Fatal, 'SoilDyn cannot perform linearization analysis.', ErrStat, ErrMsg, RoutineName) ! Otherwise, if the module does allow linearization, return the appropriate Jacobian row/column names and rotating-frame flags here: ! Allocate and set these variables: InitOut%LinNames_y, InitOut%LinNames_x, InitOut%LinNames_xd, InitOut%LinNames_z, InitOut%LinNames_u @@ -150,28 +150,28 @@ subroutine DirtDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In call REDWINinterface_Init(u,p,m,y,InputFileData, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) -end subroutine DirtDyn_Init +end subroutine SoilDyn_Init !---------------------------------------------------------------------------------------------------------------------------------- !> This routine is called at the end of the simulation. -subroutine DirtDyn_End( u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) - - type(DirtD_InputType), intent(inout) :: u !< System inputs - type(DirtD_ParameterType), intent(inout) :: p !< Parameters - type(DirtD_ContinuousStateType), intent(inout) :: x !< Continuous states - type(DirtD_DiscreteStateType), intent(inout) :: xd !< Discrete states - type(DirtD_ConstraintStateType), intent(inout) :: z !< Constraint states - type(DirtD_OtherStateType), intent(inout) :: OtherState !< Other states - type(DirtD_OutputType), intent(inout) :: y !< System outputs - type(DirtD_MiscVarType), intent(inout) :: m !< Misc variables for optimization (not copied in glue code) +subroutine SoilDyn_End( u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) + + type(SlD_InputType), intent(inout) :: u !< System inputs + type(SlD_ParameterType), intent(inout) :: p !< Parameters + type(SlD_ContinuousStateType), intent(inout) :: x !< Continuous states + type(SlD_DiscreteStateType), intent(inout) :: xd !< Discrete states + type(SlD_ConstraintStateType), intent(inout) :: z !< Constraint states + type(SlD_OtherStateType), intent(inout) :: OtherState !< Other states + type(SlD_OutputType), intent(inout) :: y !< System outputs + type(SlD_MiscVarType), intent(inout) :: m !< Misc variables for optimization (not copied in glue code) integer(IntKi), intent( out) :: ErrStat !< Error status of the operation character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None ! local variables integer(IntKi) :: ErrStat2 ! local error status character(ErrMsgLen) :: ErrMsg2 ! local error message - character(*), parameter :: RoutineName = 'DirtDyn_End' + character(*), parameter :: RoutineName = 'SoilDyn_End' ! Initialize ErrStat ErrStat = ErrID_None @@ -185,56 +185,56 @@ subroutine DirtDyn_End( u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) !! Close files here (but because of checkpoint-restart capability, it is not recommended to have files open during the simulation): !! Destroy the input data: - call DirtD_DestroyInput( u, ErrStat2,ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + call SlD_DestroyInput( u, ErrStat2,ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) !! Destroy the parameter data: - call DirtD_DestroyParam( p, ErrStat2,ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + call SlD_DestroyParam( p, ErrStat2,ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) !! Destroy the state data: - call DirtD_DestroyContState( x, ErrStat2,ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - call DirtD_DestroyDiscState( xd, ErrStat2,ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - call DirtD_DestroyConstrState(z, ErrStat2,ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - call DirtD_DestroyOtherState( OtherState, ErrStat2,ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + call SlD_DestroyContState( x, ErrStat2,ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + call SlD_DestroyDiscState( xd, ErrStat2,ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + call SlD_DestroyConstrState( z, ErrStat2,ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + call SlD_DestroyOtherState( OtherState, ErrStat2,ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) !! Destroy the output data: - call DirtD_DestroyOutput( y, ErrStat2, ErrMsg2 ); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + call SlD_DestroyOutput( y, ErrStat2,ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) !! Destroy the misc data: - call DirtD_DestroyMisc( m, ErrStat2, ErrMsg2 ); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + call SlD_DestroyMisc( m, ErrStat2,ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) -end subroutine DirtDyn_End +end subroutine SoilDyn_End !---------------------------------------------------------------------------------------------------------------------------------- !> This is a loose coupling routine for solving constraint states, integrating continuous states, and updating discrete and other !! states. Continuous, constraint, discrete, and other states are updated to values at t + Interval. -subroutine DirtDyn_UpdateStates( t, n, Inputs, InputTimes, p, x, xd, z, OtherState, m, ErrStat, ErrMsg ) +subroutine SoilDyn_UpdateStates( t, n, Inputs, InputTimes, p, x, xd, z, OtherState, m, ErrStat, ErrMsg ) real(DbKi), intent(in ) :: t !< Current simulation time in seconds integer(IntKi), intent(in ) :: n !< Current step of the simulation: t = n*Interval - type(DirtD_InputType), intent(inout) :: Inputs(:) !< Inputs at InputTimes (output from this routine only + type(SlD_InputType), intent(inout) :: Inputs(:) !< Inputs at InputTimes (output from this routine only !! because of record keeping in routines that copy meshes) real(DbKi), intent(in ) :: InputTimes(:) !< Times in seconds associated with Inputs - type(DirtD_ParameterType), intent(in ) :: p !< Parameters - type(DirtD_ContinuousStateType), intent(inout) :: x !< Input: Continuous states at t; + type(SlD_ParameterType), intent(in ) :: p !< Parameters + type(SlD_ContinuousStateType), intent(inout) :: x !< Input: Continuous states at t; !! Output: Continuous states at t + Interval - type(DirtD_DiscreteStateType), intent(inout) :: xd !< Input: Discrete states at t; + type(SlD_DiscreteStateType), intent(inout) :: xd !< Input: Discrete states at t; !! Output: Discrete states at t + Interval - type(DirtD_ConstraintStateType), intent(inout) :: z !< Input: Constraint states at t; + type(SlD_ConstraintStateType), intent(inout) :: z !< Input: Constraint states at t; !! Output: Constraint states at t + Interval - type(DirtD_OtherStateType), intent(inout) :: OtherState !< Other states: Other states at t; + type(SlD_OtherStateType), intent(inout) :: OtherState !< Other states: Other states at t; !! Output: Other states at t + Interval - type(DirtD_MiscVarType), intent(inout) :: m !< Misc variables for optimization (not copied in glue code) + type(SlD_MiscVarType), intent(inout) :: m !< Misc variables for optimization (not copied in glue code) integer(IntKi), intent( out) :: ErrStat !< Error status of the operation character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None ! Local variables - type(DirtD_ContinuousStateType) :: dxdt ! Continuous state derivatives at t - type(DirtD_DiscreteStateType) :: xd_t ! Discrete states at t (copy) - type(DirtD_ConstraintStateType) :: z_Residual ! Residual of the constraint state functions (Z) - type(DirtD_InputType) :: u ! Instantaneous inputs + type(SlD_ContinuousStateType) :: dxdt ! Continuous state derivatives at t + type(SlD_DiscreteStateType) :: xd_t ! Discrete states at t (copy) + type(SlD_ConstraintStateType) :: z_Residual ! Residual of the constraint state functions (Z) + type(SlD_InputType) :: u ! Instantaneous inputs integer(IntKi) :: ErrStat2 ! local error status character(ErrMsgLen) :: ErrMsg2 ! local error message - character(*), parameter :: RoutineName = 'DirtDyn_UpdateStates' + character(*), parameter :: RoutineName = 'SoilDyn_UpdateStates' ! Initialize variables ErrStat = ErrID_None ! no error has occurred @@ -245,14 +245,14 @@ subroutine DirtDyn_UpdateStates( t, n, Inputs, InputTimes, p, x, xd, z, OtherSta ! Get the inputs at time t, based on the array of values sent by the glue code: ! before calling ExtrapInterp routine, memory in u must be allocated; we can do that with a copy: - call DirtD_CopyInput( Inputs(1), u, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) + call SlD_CopyInput( Inputs(1), u, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) if ( ErrStat >= AbortErrLev ) then call cleanup() ! to avoid memory leaks, we have to destroy the local variables that may have allocatable arrays or meshes return end if - call DirtD_Input_ExtrapInterp( Inputs, InputTimes, u, t, ErrStat2, ErrMsg2 ) + call SlD_Input_ExtrapInterp( Inputs, InputTimes, u, t, ErrStat2, ErrMsg2 ) call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) if ( ErrStat >= AbortErrLev ) then call cleanup() @@ -264,27 +264,27 @@ subroutine DirtDyn_UpdateStates( t, n, Inputs, InputTimes, p, x, xd, z, OtherSta contains subroutine cleanup() - call DirtD_DestroyInput( u, ErrStat2, ErrMsg2) - call DirtD_DestroyConstrState( Z_Residual, ErrStat2, ErrMsg2) - call DirtD_DestroyContState( dxdt, ErrStat2, ErrMsg2) - call DirtD_DestroyDiscState( xd_t, ErrStat2, ErrMsg2) + call SlD_DestroyInput( u, ErrStat2, ErrMsg2) + call SlD_DestroyConstrState( Z_Residual, ErrStat2, ErrMsg2) + call SlD_DestroyContState( dxdt, ErrStat2, ErrMsg2) + call SlD_DestroyDiscState( xd_t, ErrStat2, ErrMsg2) end subroutine cleanup -end subroutine DirtDyn_UpdateStates +end subroutine SoilDyn_UpdateStates !---------------------------------------------------------------------------------------------------------------------------------- !> This is a routine for computing outputs, used in both loose and tight coupling. -subroutine DirtDyn_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) +subroutine SoilDyn_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) real(DbKi), intent(in ) :: t !< Current simulation time in seconds - type(DirtD_InputType), intent(in ) :: u !< Inputs at t - type(DirtD_ParameterType), intent(in ) :: p !< Parameters - type(DirtD_ContinuousStateType), intent(in ) :: x !< Continuous states at t - type(DirtD_DiscreteStateType), intent(in ) :: xd !< Discrete states at t - type(DirtD_ConstraintStateType), intent(in ) :: z !< Constraint states at t - type(DirtD_OtherStateType), intent(in ) :: OtherState !< Other states at t - type(DirtD_MiscVarType), intent(inout) :: m !< Misc variables for optimization (not copied in glue code) - type(DirtD_OutputType), intent(inout) :: y !< Outputs computed at t (Input only so that mesh con- + type(SlD_InputType), intent(in ) :: u !< Inputs at t + type(SlD_ParameterType), intent(in ) :: p !< Parameters + type(SlD_ContinuousStateType), intent(in ) :: x !< Continuous states at t + type(SlD_DiscreteStateType), intent(in ) :: xd !< Discrete states at t + type(SlD_ConstraintStateType), intent(in ) :: z !< Constraint states at t + type(SlD_OtherStateType), intent(in ) :: OtherState !< Other states at t + type(SlD_MiscVarType), intent(inout) :: m !< Misc variables for optimization (not copied in glue code) + type(SlD_OutputType), intent(inout) :: y !< Outputs computed at t (Input only so that mesh con- !! nectivity information does not have to be recalculated) integer(IntKi), intent( out) :: ErrStat !< Error status of the operation character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None @@ -299,19 +299,19 @@ subroutine DirtDyn_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, Err y%WriteOutput(1) = REAL(t,ReKi) y%WriteOutput(2) = 1.0_ReKi -end subroutine DirtDyn_CalcOutput +end subroutine SoilDyn_CalcOutput -END MODULE DirtDyn +END MODULE SoilDyn !********************************************************************************************************************************** !NOTE: the following have been omitted. When we add the other methods for calculating (6x6 Stiffness/Damping) and the P-Y curve, then ! some of these will need to be added. Leaving this as a placeholder for the moment. -!SUBROUTINE DirtDyn_CalcContStateDeriv( t, u, p, x, xd, z, OtherState, m, dxdt, ErrStat, ErrMsg ) -!SUBROUTINE DirtDyn_UpdateDiscState( t, n, u, p, x, xd, z, OtherState, m, ErrStat, ErrMsg ) -!SUBROUTINE DirtDyn_CalcConstrStateResidual( t, u, p, x, xd, z, OtherState, m, Z_residual, ErrStat, ErrMsg ) -!SUBROUTINE DirtDyn_JacobianPInput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdu, dXdu, dXddu, dZdu) -!SUBROUTINE DirtDyn_JacobianPContState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdx, dXdx, dXddx, dZdx ) -!SUBROUTINE DirtDyn_JacobianPDiscState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdxd, dXdxd, dXddxd, dZdxd ) -!SUBROUTINE DirtDyn_JacobianPConstrState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdz, dXdz, dXddz, dZdz ) -!SUBROUTINE DirtDyn_GetOP( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, u_op, y_op, x_op, dx_op, xd_op, z_op ) +!SUBROUTINE SoilDyn_CalcContStateDeriv( t, u, p, x, xd, z, OtherState, m, dxdt, ErrStat, ErrMsg ) +!SUBROUTINE SoilDyn_UpdateDiscState( t, n, u, p, x, xd, z, OtherState, m, ErrStat, ErrMsg ) +!SUBROUTINE SoilDyn_CalcConstrStateResidual( t, u, p, x, xd, z, OtherState, m, Z_residual, ErrStat, ErrMsg ) +!SUBROUTINE SoilDyn_JacobianPInput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdu, dXdu, dXddu, dZdu) +!SUBROUTINE SoilDyn_JacobianPContState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdx, dXdx, dXddx, dZdx ) +!SUBROUTINE SoilDyn_JacobianPDiscState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdxd, dXdxd, dXddxd, dZdxd ) +!SUBROUTINE SoilDyn_JacobianPConstrState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdz, dXdz, dXddz, dZdz ) +!SUBROUTINE SoilDyn_GetOP( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, u_op, y_op, x_op, dx_op, xd_op, z_op ) diff --git a/modules/dirtdyn/src/DirtDyn_Registry.txt b/modules/soildyn/src/SoilDyn_Registry.txt similarity index 87% rename from modules/dirtdyn/src/DirtDyn_Registry.txt rename to modules/soildyn/src/SoilDyn_Registry.txt index 155babccc..e3821016b 100644 --- a/modules/dirtdyn/src/DirtDyn_Registry.txt +++ b/modules/soildyn/src/SoilDyn_Registry.txt @@ -1,10 +1,10 @@ ################################################################################################################################### -# Registry for DirtDyn in the FAST Modularization Framework -# This Registry file is used to create MODULE DirtDyn_Types, which contains all of the user-defined types needed in DirtDyn. +# Registry for SoilDyn in the FAST Modularization Framework +# This Registry file is used to create MODULE SoilDyn_Types, which contains all of the user-defined types needed in SoilDyn. # It also contains copy, destroy, pack, and unpack routines associated with each defined data types. # # Entries are of the form -# keyword +# keyword # # Use ^ as a shortcut for the value from the previous line. # See NWTC Programmer's Handbook for further information on the format/contents of this file. @@ -17,9 +17,9 @@ include Registry_NWTC_Library.txt # REDWIN interface DLL type # ..... Data for using REDWIN DLLs ....................................................................................................... # Values set to type R8Ki are defined in the REDWIN fortran code as kind=selected_real_kind(p=15) -typedef DirtDyn/DirtD REDWINdllType character(45) PROPSFILE - - - "" - -typedef DirtDyn/DirtD REDWINdllType character(45) LDISPFILE - - - "" - -typedef DirtDyn/DirtD REDWINdllType IntKi IDtask - - - "Task identifier for what DLL should do: IDTask = 1: Read input properties, initialize and calibrate model IDTask = 2: Calculate forces based on displacement at end of step IDTask = 3: Calculate elastic macro-element stiffness matrix" - +typedef SoilDyn/SlD REDWINdllType character(45) PROPSFILE - - - "" - +typedef SoilDyn/SlD REDWINdllType character(45) LDISPFILE - - - "" - +typedef SoilDyn/SlD REDWINdllType IntKi IDtask - - - "Task identifier for what DLL should do: IDTask = 1: Read input properties, initialize and calibrate model IDTask = 2: Calculate forces based on displacement at end of step IDTask = 3: Calculate elastic macro-element stiffness matrix" - typedef ^ REDWINdllType IntKi nErrorCode - - - "number of returned error codes" - typedef ^ REDWINdllType IntKi ErrorCode {100} - - "Array containing one or more error codes. These are specific to each model." - typedef ^ REDWINdllType R8Ki Props {100}{200} - - "Array containing foundation model properties (used internally by the REDWIN models). Specific to each model." - @@ -31,17 +31,17 @@ typedef ^ REDWINdllType R8Ki D {6}{6} -# DirtDyn input file -typedef ^ DirtD_InputFile CHARACTER(1024) DLL_FileName - - - "Name of the DLL file including the full path" - -typedef ^ DirtD_InputFile CHARACTER(1024) DLL_ProcName - - - "Name of the procedure in the DLL that will be called" - -typedef ^ DirtD_InputFile CHARACTER(1024) DLL_PROPSFILE - - - "Name of PROPSFILE input file used in DLL" - -typedef ^ DirtD_InputFile CHARACTER(1024) DLL_LDISPFILE - - - "Name of LDISPFILE input file used in DLL" - +# SoilDyn input file +typedef ^ SlD_InputFile CHARACTER(1024) DLL_FileName - - - "Name of the DLL file including the full path" - +typedef ^ SlD_InputFile CHARACTER(1024) DLL_ProcName - - - "Name of the procedure in the DLL that will be called" - +typedef ^ SlD_InputFile CHARACTER(1024) DLL_PROPSFILE - - - "Name of PROPSFILE input file used in DLL" - +typedef ^ SlD_InputFile CHARACTER(1024) DLL_LDISPFILE - - - "Name of LDISPFILE input file used in DLL" - # ..... Initialization data ....................................................................................................... # Define inputs that the initialization routine may need here: # e.g., the name of the input file, the file root name, etc. -typedef DirtDyn/DirtD InitInputType CHARACTER(1024) InputFile - - - "Name of the input file; remove if there is no file" - +typedef SoilDyn/SlD InitInputType CHARACTER(1024) InputFile - - - "Name of the input file; remove if there is no file" - typedef ^ ^ LOGICAL Linearize - .FALSE. - "Flag that tells this module if the glue code wants to linearize." - # Define outputs from the initialization routine here: @@ -102,7 +102,7 @@ typedef ^ InputType ReKi DummyInput - - - "Re # ..... Outputs ................................................................................................................... # Define outputs that are contained on the mesh here: -#typedef DirtDyn DirtD_OutputType MeshType MeshedOutput - - - "Meshed data" - +#typedef SoilDyn SlD_OutputType MeshType MeshedOutput - - - "Meshed data" - # Define outputs that are not on this mesh here: typedef ^ OutputType ReKi DummyOutput - - - "Remove this variable if you have output data" - typedef ^ ^ ReKi WriteOutput {:} - - "Example of data to be written to an output file" "s,-" diff --git a/modules/dirtdyn/src/DirtDyn_Types.f90 b/modules/soildyn/src/SoilDyn_Types.f90 similarity index 84% rename from modules/dirtdyn/src/DirtDyn_Types.f90 rename to modules/soildyn/src/SoilDyn_Types.f90 index 76b38bb02..d505c6603 100644 --- a/modules/dirtdyn/src/DirtDyn_Types.f90 +++ b/modules/soildyn/src/SoilDyn_Types.f90 @@ -1,13 +1,13 @@ -!STARTOFREGISTRYGENERATEDFILE 'DirtDyn_Types.f90' +!STARTOFREGISTRYGENERATEDFILE 'SoilDyn_Types.f90' ! ! WARNING This file is generated automatically by the FAST registry. ! Do not edit. Your changes to this file will be lost. ! ! FAST Registry !********************************************************************************************************************************* -! DirtDyn_Types +! SoilDyn_Types !................................................................................................................................. -! This file is part of DirtDyn. +! This file is part of SoilDyn. ! ! Copyright (C) 2012-2016 National Renewable Energy Laboratory ! @@ -27,9 +27,9 @@ ! W A R N I N G : This file was automatically generated from the FAST registry. Changes made to this file may be lost. ! !********************************************************************************************************************************* -!> This module contains the user-defined types needed in DirtDyn. It also contains copy, destroy, pack, and +!> This module contains the user-defined types needed in SoilDyn. It also contains copy, destroy, pack, and !! unpack routines associated with each defined data type. This code is automatically generated by the FAST Registry. -MODULE DirtDyn_Types +MODULE SoilDyn_Types !--------------------------------------------------------------------------------------------------------------------------------- USE NWTC_Library IMPLICIT NONE @@ -48,74 +48,74 @@ MODULE DirtDyn_Types REAL(R8Ki) , DIMENSION(1:6,1:6) :: D !< The 6 x 6 elastic macro-element stiffness matrix at the SFI. [-] END TYPE REDWINdllType ! ======================= -! ========= DirtD_InputFile ======= - TYPE, PUBLIC :: DirtD_InputFile +! ========= SlD_InputFile ======= + TYPE, PUBLIC :: SlD_InputFile CHARACTER(1024) :: DLL_FileName !< Name of the DLL file including the full path [-] CHARACTER(1024) :: DLL_ProcName !< Name of the procedure in the DLL that will be called [-] CHARACTER(1024) :: DLL_PROPSFILE !< Name of PROPSFILE input file used in DLL [-] CHARACTER(1024) :: DLL_LDISPFILE !< Name of LDISPFILE input file used in DLL [-] - END TYPE DirtD_InputFile + END TYPE SlD_InputFile ! ======================= -! ========= DirtD_InitInputType ======= - TYPE, PUBLIC :: DirtD_InitInputType +! ========= SlD_InitInputType ======= + TYPE, PUBLIC :: SlD_InitInputType CHARACTER(1024) :: InputFile !< Name of the input file; remove if there is no file [-] LOGICAL :: Linearize = .FALSE. !< Flag that tells this module if the glue code wants to linearize. [-] - END TYPE DirtD_InitInputType + END TYPE SlD_InitInputType ! ======================= -! ========= DirtD_InitOutputType ======= - TYPE, PUBLIC :: DirtD_InitOutputType +! ========= SlD_InitOutputType ======= + TYPE, PUBLIC :: SlD_InitOutputType CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: WriteOutputHdr !< Names of the output-to-file channels [-] CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: WriteOutputUnt !< Units of the output-to-file channels [-] - END TYPE DirtD_InitOutputType + END TYPE SlD_InitOutputType ! ======================= -! ========= DirtD_ContinuousStateType ======= - TYPE, PUBLIC :: DirtD_ContinuousStateType +! ========= SlD_ContinuousStateType ======= + TYPE, PUBLIC :: SlD_ContinuousStateType REAL(ReKi) :: DummyContState !< Remove this variable if you have continuous states [-] - END TYPE DirtD_ContinuousStateType + END TYPE SlD_ContinuousStateType ! ======================= -! ========= DirtD_DiscreteStateType ======= - TYPE, PUBLIC :: DirtD_DiscreteStateType +! ========= SlD_DiscreteStateType ======= + TYPE, PUBLIC :: SlD_DiscreteStateType REAL(ReKi) :: DummyDiscState !< Remove this variable if you have discrete states [-] - END TYPE DirtD_DiscreteStateType + END TYPE SlD_DiscreteStateType ! ======================= -! ========= DirtD_ConstraintStateType ======= - TYPE, PUBLIC :: DirtD_ConstraintStateType +! ========= SlD_ConstraintStateType ======= + TYPE, PUBLIC :: SlD_ConstraintStateType REAL(ReKi) :: DummyConstrState !< Remove this variable if you have constraint states [-] - END TYPE DirtD_ConstraintStateType + END TYPE SlD_ConstraintStateType ! ======================= -! ========= DirtD_OtherStateType ======= - TYPE, PUBLIC :: DirtD_OtherStateType +! ========= SlD_OtherStateType ======= + TYPE, PUBLIC :: SlD_OtherStateType INTEGER(IntKi) :: DummyOtherState !< Remove this variable if you have other states [-] - END TYPE DirtD_OtherStateType + END TYPE SlD_OtherStateType ! ======================= -! ========= DirtD_MiscVarType ======= - TYPE, PUBLIC :: DirtD_MiscVarType +! ========= SlD_MiscVarType ======= + TYPE, PUBLIC :: SlD_MiscVarType TYPE(REDWINdllType) :: dll_data !< data used for REDWIN DLL [-] - END TYPE DirtD_MiscVarType + END TYPE SlD_MiscVarType ! ======================= -! ========= DirtD_ParameterType ======= - TYPE, PUBLIC :: DirtD_ParameterType +! ========= SlD_ParameterType ======= + TYPE, PUBLIC :: SlD_ParameterType REAL(DbKi) :: DT !< Time step for cont. state integration & disc. state update [seconds] CHARACTER(1024) :: DLL_InFile !< Name of input file used in DLL [-] TYPE(DLL_Type) :: DLL_Trgt !< The addresses and names of the Bladed DLL and its procedure [-] REAL(DbKi) :: DLL_DT !< Time step for DLL [seconds] CHARACTER(1024) :: RootName !< RootName for writing output files [-] LOGICAL :: UseREDWINinterface !< True if interface successfully initialized [-] - END TYPE DirtD_ParameterType + END TYPE SlD_ParameterType ! ======================= -! ========= DirtD_InputType ======= - TYPE, PUBLIC :: DirtD_InputType +! ========= SlD_InputType ======= + TYPE, PUBLIC :: SlD_InputType REAL(ReKi) :: DummyInput !< Remove this variable if you have input data [-] - END TYPE DirtD_InputType + END TYPE SlD_InputType ! ======================= -! ========= DirtD_OutputType ======= - TYPE, PUBLIC :: DirtD_OutputType +! ========= SlD_OutputType ======= + TYPE, PUBLIC :: SlD_OutputType REAL(ReKi) :: DummyOutput !< Remove this variable if you have output data [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: WriteOutput !< Example of data to be written to an output file [s,-] - END TYPE DirtD_OutputType + END TYPE SlD_OutputType ! ======================= CONTAINS - SUBROUTINE DirtD_CopyREDWINdllType( SrcREDWINdllTypeData, DstREDWINdllTypeData, CtrlCode, ErrStat, ErrMsg ) + SUBROUTINE SlD_CopyREDWINdllType( SrcREDWINdllTypeData, DstREDWINdllTypeData, CtrlCode, ErrStat, ErrMsg ) TYPE(REDWINdllType), INTENT(IN) :: SrcREDWINdllTypeData TYPE(REDWINdllType), INTENT(INOUT) :: DstREDWINdllTypeData INTEGER(IntKi), INTENT(IN ) :: CtrlCode @@ -127,7 +127,7 @@ SUBROUTINE DirtD_CopyREDWINdllType( SrcREDWINdllTypeData, DstREDWINdllTypeData, INTEGER(IntKi) :: i2, i2_l, i2_u ! bounds (upper/lower) for an array dimension 2 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_CopyREDWINdllType' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_CopyREDWINdllType' ! ErrStat = ErrID_None ErrMsg = "" @@ -142,20 +142,20 @@ SUBROUTINE DirtD_CopyREDWINdllType( SrcREDWINdllTypeData, DstREDWINdllTypeData, DstREDWINdllTypeData%Disp = SrcREDWINdllTypeData%Disp DstREDWINdllTypeData%Force = SrcREDWINdllTypeData%Force DstREDWINdllTypeData%D = SrcREDWINdllTypeData%D - END SUBROUTINE DirtD_CopyREDWINdllType + END SUBROUTINE SlD_CopyREDWINdllType - SUBROUTINE DirtD_DestroyREDWINdllType( REDWINdllTypeData, ErrStat, ErrMsg ) + SUBROUTINE SlD_DestroyREDWINdllType( REDWINdllTypeData, ErrStat, ErrMsg ) TYPE(REDWINdllType), INTENT(INOUT) :: REDWINdllTypeData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_DestroyREDWINdllType' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_DestroyREDWINdllType' INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 ! ErrStat = ErrID_None ErrMsg = "" - END SUBROUTINE DirtD_DestroyREDWINdllType + END SUBROUTINE SlD_DestroyREDWINdllType - SUBROUTINE DirtD_PackREDWINdllType( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) + SUBROUTINE SlD_PackREDWINdllType( 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(:) @@ -174,7 +174,7 @@ SUBROUTINE DirtD_PackREDWINdllType( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, LOGICAL :: OnlySize ! if present and true, do not pack, just allocate buffers INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_PackREDWINdllType' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_PackREDWINdllType' ! buffers to store subtypes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -254,9 +254,9 @@ SUBROUTINE DirtD_PackREDWINdllType( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Db_Xferred = Db_Xferred + SIZE(InData%Force) DbKiBuf ( Db_Xferred:Db_Xferred+(SIZE(InData%D))-1 ) = PACK(InData%D,.TRUE.) Db_Xferred = Db_Xferred + SIZE(InData%D) - END SUBROUTINE DirtD_PackREDWINdllType + END SUBROUTINE SlD_PackREDWINdllType - SUBROUTINE DirtD_UnPackREDWINdllType( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) + SUBROUTINE SlD_UnPackREDWINdllType( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) REAL(ReKi), ALLOCATABLE, INTENT(IN ) :: ReKiBuf(:) REAL(DbKi), ALLOCATABLE, INTENT(IN ) :: DbKiBuf(:) INTEGER(IntKi), ALLOCATABLE, INTENT(IN ) :: IntKiBuf(:) @@ -279,7 +279,7 @@ SUBROUTINE DirtD_UnPackREDWINdllType( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrSt INTEGER(IntKi) :: i2, i2_l, i2_u ! bounds (upper/lower) for an array dimension 2 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_UnPackREDWINdllType' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_UnPackREDWINdllType' ! buffers to store meshes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -387,11 +387,11 @@ SUBROUTINE DirtD_UnPackREDWINdllType( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrSt OutData%D = REAL( UNPACK(DbKiBuf( Db_Xferred:Db_Xferred+(SIZE(OutData%D))-1 ), mask2, 0.0_DbKi ), R8Ki) Db_Xferred = Db_Xferred + SIZE(OutData%D) DEALLOCATE(mask2) - END SUBROUTINE DirtD_UnPackREDWINdllType + END SUBROUTINE SlD_UnPackREDWINdllType - SUBROUTINE DirtD_CopyInputFile( SrcInputFileData, DstInputFileData, CtrlCode, ErrStat, ErrMsg ) - TYPE(DirtD_InputFile), INTENT(IN) :: SrcInputFileData - TYPE(DirtD_InputFile), INTENT(INOUT) :: DstInputFileData + SUBROUTINE SlD_CopyInputFile( SrcInputFileData, DstInputFileData, CtrlCode, ErrStat, ErrMsg ) + TYPE(SlD_InputFile), INTENT(IN) :: SrcInputFileData + TYPE(SlD_InputFile), INTENT(INOUT) :: DstInputFileData INTEGER(IntKi), INTENT(IN ) :: CtrlCode INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg @@ -399,7 +399,7 @@ SUBROUTINE DirtD_CopyInputFile( SrcInputFileData, DstInputFileData, CtrlCode, Er INTEGER(IntKi) :: i,j,k INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_CopyInputFile' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_CopyInputFile' ! ErrStat = ErrID_None ErrMsg = "" @@ -407,24 +407,24 @@ SUBROUTINE DirtD_CopyInputFile( SrcInputFileData, DstInputFileData, CtrlCode, Er DstInputFileData%DLL_ProcName = SrcInputFileData%DLL_ProcName DstInputFileData%DLL_PROPSFILE = SrcInputFileData%DLL_PROPSFILE DstInputFileData%DLL_LDISPFILE = SrcInputFileData%DLL_LDISPFILE - END SUBROUTINE DirtD_CopyInputFile + END SUBROUTINE SlD_CopyInputFile - SUBROUTINE DirtD_DestroyInputFile( InputFileData, ErrStat, ErrMsg ) - TYPE(DirtD_InputFile), INTENT(INOUT) :: InputFileData + SUBROUTINE SlD_DestroyInputFile( InputFileData, ErrStat, ErrMsg ) + TYPE(SlD_InputFile), INTENT(INOUT) :: InputFileData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_DestroyInputFile' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_DestroyInputFile' INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 ! ErrStat = ErrID_None ErrMsg = "" - END SUBROUTINE DirtD_DestroyInputFile + END SUBROUTINE SlD_DestroyInputFile - SUBROUTINE DirtD_PackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) + SUBROUTINE SlD_PackInputFile( 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(DirtD_InputFile), INTENT(IN) :: InData + TYPE(SlD_InputFile), INTENT(IN) :: InData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg LOGICAL,OPTIONAL, INTENT(IN ) :: SizeOnly @@ -439,7 +439,7 @@ SUBROUTINE DirtD_PackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Err LOGICAL :: OnlySize ! if present and true, do not pack, just allocate buffers INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_PackInputFile' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_PackInputFile' ! buffers to store subtypes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -502,13 +502,13 @@ SUBROUTINE DirtD_PackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Err IntKiBuf(Int_Xferred) = ICHAR(InData%DLL_LDISPFILE(I:I), IntKi) Int_Xferred = Int_Xferred + 1 END DO ! I - END SUBROUTINE DirtD_PackInputFile + END SUBROUTINE SlD_PackInputFile - SUBROUTINE DirtD_UnPackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) + SUBROUTINE SlD_UnPackInputFile( 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(DirtD_InputFile), INTENT(INOUT) :: OutData + TYPE(SlD_InputFile), INTENT(INOUT) :: OutData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg ! Local variables @@ -525,7 +525,7 @@ SUBROUTINE DirtD_UnPackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, LOGICAL, ALLOCATABLE :: mask5(:,:,:,:,:) INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_UnPackInputFile' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_UnPackInputFile' ! buffers to store meshes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -552,11 +552,11 @@ SUBROUTINE DirtD_UnPackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, OutData%DLL_LDISPFILE(I:I) = CHAR(IntKiBuf(Int_Xferred)) Int_Xferred = Int_Xferred + 1 END DO ! I - END SUBROUTINE DirtD_UnPackInputFile + END SUBROUTINE SlD_UnPackInputFile - SUBROUTINE DirtD_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, ErrStat, ErrMsg ) - TYPE(DirtD_InitInputType), INTENT(IN) :: SrcInitInputData - TYPE(DirtD_InitInputType), INTENT(INOUT) :: DstInitInputData + SUBROUTINE SlD_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, ErrStat, ErrMsg ) + TYPE(SlD_InitInputType), INTENT(IN) :: SrcInitInputData + TYPE(SlD_InitInputType), INTENT(INOUT) :: DstInitInputData INTEGER(IntKi), INTENT(IN ) :: CtrlCode INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg @@ -564,30 +564,30 @@ SUBROUTINE DirtD_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, Er INTEGER(IntKi) :: i,j,k INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_CopyInitInput' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_CopyInitInput' ! ErrStat = ErrID_None ErrMsg = "" DstInitInputData%InputFile = SrcInitInputData%InputFile DstInitInputData%Linearize = SrcInitInputData%Linearize - END SUBROUTINE DirtD_CopyInitInput + END SUBROUTINE SlD_CopyInitInput - SUBROUTINE DirtD_DestroyInitInput( InitInputData, ErrStat, ErrMsg ) - TYPE(DirtD_InitInputType), INTENT(INOUT) :: InitInputData + SUBROUTINE SlD_DestroyInitInput( InitInputData, ErrStat, ErrMsg ) + TYPE(SlD_InitInputType), INTENT(INOUT) :: InitInputData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_DestroyInitInput' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_DestroyInitInput' INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 ! ErrStat = ErrID_None ErrMsg = "" - END SUBROUTINE DirtD_DestroyInitInput + END SUBROUTINE SlD_DestroyInitInput - SUBROUTINE DirtD_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) + SUBROUTINE SlD_PackInitInput( 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(DirtD_InitInputType), INTENT(IN) :: InData + TYPE(SlD_InitInputType), INTENT(IN) :: InData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg LOGICAL,OPTIONAL, INTENT(IN ) :: SizeOnly @@ -602,7 +602,7 @@ SUBROUTINE DirtD_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Err LOGICAL :: OnlySize ! if present and true, do not pack, just allocate buffers INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_PackInitInput' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_PackInitInput' ! buffers to store subtypes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -653,13 +653,13 @@ SUBROUTINE DirtD_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Err END DO ! I IntKiBuf ( Int_Xferred:Int_Xferred+1-1 ) = TRANSFER( InData%Linearize , IntKiBuf(1), 1) Int_Xferred = Int_Xferred + 1 - END SUBROUTINE DirtD_PackInitInput + END SUBROUTINE SlD_PackInitInput - SUBROUTINE DirtD_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) + SUBROUTINE SlD_UnPackInitInput( 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(DirtD_InitInputType), INTENT(INOUT) :: OutData + TYPE(SlD_InitInputType), INTENT(INOUT) :: OutData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg ! Local variables @@ -676,7 +676,7 @@ SUBROUTINE DirtD_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, LOGICAL, ALLOCATABLE :: mask5(:,:,:,:,:) INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_UnPackInitInput' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_UnPackInitInput' ! buffers to store meshes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -693,11 +693,11 @@ SUBROUTINE DirtD_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, END DO ! I OutData%Linearize = TRANSFER( IntKiBuf( Int_Xferred ), mask0 ) Int_Xferred = Int_Xferred + 1 - END SUBROUTINE DirtD_UnPackInitInput + END SUBROUTINE SlD_UnPackInitInput - SUBROUTINE DirtD_CopyInitOutput( SrcInitOutputData, DstInitOutputData, CtrlCode, ErrStat, ErrMsg ) - TYPE(DirtD_InitOutputType), INTENT(IN) :: SrcInitOutputData - TYPE(DirtD_InitOutputType), INTENT(INOUT) :: DstInitOutputData + SUBROUTINE SlD_CopyInitOutput( SrcInitOutputData, DstInitOutputData, CtrlCode, ErrStat, ErrMsg ) + TYPE(SlD_InitOutputType), INTENT(IN) :: SrcInitOutputData + TYPE(SlD_InitOutputType), INTENT(INOUT) :: DstInitOutputData INTEGER(IntKi), INTENT(IN ) :: CtrlCode INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg @@ -706,7 +706,7 @@ SUBROUTINE DirtD_CopyInitOutput( SrcInitOutputData, DstInitOutputData, CtrlCode, INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_CopyInitOutput' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_CopyInitOutput' ! ErrStat = ErrID_None ErrMsg = "" @@ -734,13 +734,13 @@ SUBROUTINE DirtD_CopyInitOutput( SrcInitOutputData, DstInitOutputData, CtrlCode, END IF DstInitOutputData%WriteOutputUnt = SrcInitOutputData%WriteOutputUnt ENDIF - END SUBROUTINE DirtD_CopyInitOutput + END SUBROUTINE SlD_CopyInitOutput - SUBROUTINE DirtD_DestroyInitOutput( InitOutputData, ErrStat, ErrMsg ) - TYPE(DirtD_InitOutputType), INTENT(INOUT) :: InitOutputData + SUBROUTINE SlD_DestroyInitOutput( InitOutputData, ErrStat, ErrMsg ) + TYPE(SlD_InitOutputType), INTENT(INOUT) :: InitOutputData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_DestroyInitOutput' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_DestroyInitOutput' INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 ! ErrStat = ErrID_None @@ -751,13 +751,13 @@ SUBROUTINE DirtD_DestroyInitOutput( InitOutputData, ErrStat, ErrMsg ) IF (ALLOCATED(InitOutputData%WriteOutputUnt)) THEN DEALLOCATE(InitOutputData%WriteOutputUnt) ENDIF - END SUBROUTINE DirtD_DestroyInitOutput + END SUBROUTINE SlD_DestroyInitOutput - SUBROUTINE DirtD_PackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) + SUBROUTINE SlD_PackInitOutput( 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(DirtD_InitOutputType), INTENT(IN) :: InData + TYPE(SlD_InitOutputType), INTENT(IN) :: InData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg LOGICAL,OPTIONAL, INTENT(IN ) :: SizeOnly @@ -772,7 +772,7 @@ SUBROUTINE DirtD_PackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er LOGICAL :: OnlySize ! if present and true, do not pack, just allocate buffers INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_PackInitOutput' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_PackInitOutput' ! buffers to store subtypes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -859,13 +859,13 @@ SUBROUTINE DirtD_PackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er END DO ! I END DO !i1 END IF - END SUBROUTINE DirtD_PackInitOutput + END SUBROUTINE SlD_PackInitOutput - SUBROUTINE DirtD_UnPackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) + SUBROUTINE SlD_UnPackInitOutput( 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(DirtD_InitOutputType), INTENT(INOUT) :: OutData + TYPE(SlD_InitOutputType), INTENT(INOUT) :: OutData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg ! Local variables @@ -883,7 +883,7 @@ SUBROUTINE DirtD_UnPackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_UnPackInitOutput' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_UnPackInitOutput' ! buffers to store meshes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -948,11 +948,11 @@ SUBROUTINE DirtD_UnPackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, END DO !i1 DEALLOCATE(mask1) END IF - END SUBROUTINE DirtD_UnPackInitOutput + END SUBROUTINE SlD_UnPackInitOutput - SUBROUTINE DirtD_CopyContState( SrcContStateData, DstContStateData, CtrlCode, ErrStat, ErrMsg ) - TYPE(DirtD_ContinuousStateType), INTENT(IN) :: SrcContStateData - TYPE(DirtD_ContinuousStateType), INTENT(INOUT) :: DstContStateData + SUBROUTINE SlD_CopyContState( SrcContStateData, DstContStateData, CtrlCode, ErrStat, ErrMsg ) + TYPE(SlD_ContinuousStateType), INTENT(IN) :: SrcContStateData + TYPE(SlD_ContinuousStateType), INTENT(INOUT) :: DstContStateData INTEGER(IntKi), INTENT(IN ) :: CtrlCode INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg @@ -960,29 +960,29 @@ SUBROUTINE DirtD_CopyContState( SrcContStateData, DstContStateData, CtrlCode, Er INTEGER(IntKi) :: i,j,k INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_CopyContState' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_CopyContState' ! ErrStat = ErrID_None ErrMsg = "" DstContStateData%DummyContState = SrcContStateData%DummyContState - END SUBROUTINE DirtD_CopyContState + END SUBROUTINE SlD_CopyContState - SUBROUTINE DirtD_DestroyContState( ContStateData, ErrStat, ErrMsg ) - TYPE(DirtD_ContinuousStateType), INTENT(INOUT) :: ContStateData + SUBROUTINE SlD_DestroyContState( ContStateData, ErrStat, ErrMsg ) + TYPE(SlD_ContinuousStateType), INTENT(INOUT) :: ContStateData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_DestroyContState' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_DestroyContState' INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 ! ErrStat = ErrID_None ErrMsg = "" - END SUBROUTINE DirtD_DestroyContState + END SUBROUTINE SlD_DestroyContState - SUBROUTINE DirtD_PackContState( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) + SUBROUTINE SlD_PackContState( 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(DirtD_ContinuousStateType), INTENT(IN) :: InData + TYPE(SlD_ContinuousStateType), INTENT(IN) :: InData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg LOGICAL,OPTIONAL, INTENT(IN ) :: SizeOnly @@ -997,7 +997,7 @@ SUBROUTINE DirtD_PackContState( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Err LOGICAL :: OnlySize ! if present and true, do not pack, just allocate buffers INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_PackContState' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_PackContState' ! buffers to store subtypes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -1043,13 +1043,13 @@ SUBROUTINE DirtD_PackContState( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Err ReKiBuf ( Re_Xferred:Re_Xferred+(1)-1 ) = InData%DummyContState Re_Xferred = Re_Xferred + 1 - END SUBROUTINE DirtD_PackContState + END SUBROUTINE SlD_PackContState - SUBROUTINE DirtD_UnPackContState( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) + SUBROUTINE SlD_UnPackContState( 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(DirtD_ContinuousStateType), INTENT(INOUT) :: OutData + TYPE(SlD_ContinuousStateType), INTENT(INOUT) :: OutData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg ! Local variables @@ -1066,7 +1066,7 @@ SUBROUTINE DirtD_UnPackContState( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, LOGICAL, ALLOCATABLE :: mask5(:,:,:,:,:) INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_UnPackContState' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_UnPackContState' ! buffers to store meshes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -1079,11 +1079,11 @@ SUBROUTINE DirtD_UnPackContState( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Int_Xferred = 1 OutData%DummyContState = ReKiBuf( Re_Xferred ) Re_Xferred = Re_Xferred + 1 - END SUBROUTINE DirtD_UnPackContState + END SUBROUTINE SlD_UnPackContState - SUBROUTINE DirtD_CopyDiscState( SrcDiscStateData, DstDiscStateData, CtrlCode, ErrStat, ErrMsg ) - TYPE(DirtD_DiscreteStateType), INTENT(IN) :: SrcDiscStateData - TYPE(DirtD_DiscreteStateType), INTENT(INOUT) :: DstDiscStateData + SUBROUTINE SlD_CopyDiscState( SrcDiscStateData, DstDiscStateData, CtrlCode, ErrStat, ErrMsg ) + TYPE(SlD_DiscreteStateType), INTENT(IN) :: SrcDiscStateData + TYPE(SlD_DiscreteStateType), INTENT(INOUT) :: DstDiscStateData INTEGER(IntKi), INTENT(IN ) :: CtrlCode INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg @@ -1091,29 +1091,29 @@ SUBROUTINE DirtD_CopyDiscState( SrcDiscStateData, DstDiscStateData, CtrlCode, Er INTEGER(IntKi) :: i,j,k INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_CopyDiscState' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_CopyDiscState' ! ErrStat = ErrID_None ErrMsg = "" DstDiscStateData%DummyDiscState = SrcDiscStateData%DummyDiscState - END SUBROUTINE DirtD_CopyDiscState + END SUBROUTINE SlD_CopyDiscState - SUBROUTINE DirtD_DestroyDiscState( DiscStateData, ErrStat, ErrMsg ) - TYPE(DirtD_DiscreteStateType), INTENT(INOUT) :: DiscStateData + SUBROUTINE SlD_DestroyDiscState( DiscStateData, ErrStat, ErrMsg ) + TYPE(SlD_DiscreteStateType), INTENT(INOUT) :: DiscStateData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_DestroyDiscState' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_DestroyDiscState' INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 ! ErrStat = ErrID_None ErrMsg = "" - END SUBROUTINE DirtD_DestroyDiscState + END SUBROUTINE SlD_DestroyDiscState - SUBROUTINE DirtD_PackDiscState( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) + SUBROUTINE SlD_PackDiscState( 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(DirtD_DiscreteStateType), INTENT(IN) :: InData + TYPE(SlD_DiscreteStateType), INTENT(IN) :: InData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg LOGICAL,OPTIONAL, INTENT(IN ) :: SizeOnly @@ -1128,7 +1128,7 @@ SUBROUTINE DirtD_PackDiscState( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Err LOGICAL :: OnlySize ! if present and true, do not pack, just allocate buffers INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_PackDiscState' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_PackDiscState' ! buffers to store subtypes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -1174,13 +1174,13 @@ SUBROUTINE DirtD_PackDiscState( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Err ReKiBuf ( Re_Xferred:Re_Xferred+(1)-1 ) = InData%DummyDiscState Re_Xferred = Re_Xferred + 1 - END SUBROUTINE DirtD_PackDiscState + END SUBROUTINE SlD_PackDiscState - SUBROUTINE DirtD_UnPackDiscState( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) + SUBROUTINE SlD_UnPackDiscState( 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(DirtD_DiscreteStateType), INTENT(INOUT) :: OutData + TYPE(SlD_DiscreteStateType), INTENT(INOUT) :: OutData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg ! Local variables @@ -1197,7 +1197,7 @@ SUBROUTINE DirtD_UnPackDiscState( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, LOGICAL, ALLOCATABLE :: mask5(:,:,:,:,:) INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_UnPackDiscState' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_UnPackDiscState' ! buffers to store meshes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -1210,11 +1210,11 @@ SUBROUTINE DirtD_UnPackDiscState( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Int_Xferred = 1 OutData%DummyDiscState = ReKiBuf( Re_Xferred ) Re_Xferred = Re_Xferred + 1 - END SUBROUTINE DirtD_UnPackDiscState + END SUBROUTINE SlD_UnPackDiscState - SUBROUTINE DirtD_CopyConstrState( SrcConstrStateData, DstConstrStateData, CtrlCode, ErrStat, ErrMsg ) - TYPE(DirtD_ConstraintStateType), INTENT(IN) :: SrcConstrStateData - TYPE(DirtD_ConstraintStateType), INTENT(INOUT) :: DstConstrStateData + SUBROUTINE SlD_CopyConstrState( SrcConstrStateData, DstConstrStateData, CtrlCode, ErrStat, ErrMsg ) + TYPE(SlD_ConstraintStateType), INTENT(IN) :: SrcConstrStateData + TYPE(SlD_ConstraintStateType), INTENT(INOUT) :: DstConstrStateData INTEGER(IntKi), INTENT(IN ) :: CtrlCode INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg @@ -1222,29 +1222,29 @@ SUBROUTINE DirtD_CopyConstrState( SrcConstrStateData, DstConstrStateData, CtrlCo INTEGER(IntKi) :: i,j,k INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_CopyConstrState' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_CopyConstrState' ! ErrStat = ErrID_None ErrMsg = "" DstConstrStateData%DummyConstrState = SrcConstrStateData%DummyConstrState - END SUBROUTINE DirtD_CopyConstrState + END SUBROUTINE SlD_CopyConstrState - SUBROUTINE DirtD_DestroyConstrState( ConstrStateData, ErrStat, ErrMsg ) - TYPE(DirtD_ConstraintStateType), INTENT(INOUT) :: ConstrStateData + SUBROUTINE SlD_DestroyConstrState( ConstrStateData, ErrStat, ErrMsg ) + TYPE(SlD_ConstraintStateType), INTENT(INOUT) :: ConstrStateData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_DestroyConstrState' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_DestroyConstrState' INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 ! ErrStat = ErrID_None ErrMsg = "" - END SUBROUTINE DirtD_DestroyConstrState + END SUBROUTINE SlD_DestroyConstrState - SUBROUTINE DirtD_PackConstrState( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) + SUBROUTINE SlD_PackConstrState( 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(DirtD_ConstraintStateType), INTENT(IN) :: InData + TYPE(SlD_ConstraintStateType), INTENT(IN) :: InData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg LOGICAL,OPTIONAL, INTENT(IN ) :: SizeOnly @@ -1259,7 +1259,7 @@ SUBROUTINE DirtD_PackConstrState( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E LOGICAL :: OnlySize ! if present and true, do not pack, just allocate buffers INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_PackConstrState' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_PackConstrState' ! buffers to store subtypes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -1305,13 +1305,13 @@ SUBROUTINE DirtD_PackConstrState( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E ReKiBuf ( Re_Xferred:Re_Xferred+(1)-1 ) = InData%DummyConstrState Re_Xferred = Re_Xferred + 1 - END SUBROUTINE DirtD_PackConstrState + END SUBROUTINE SlD_PackConstrState - SUBROUTINE DirtD_UnPackConstrState( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) + SUBROUTINE SlD_UnPackConstrState( 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(DirtD_ConstraintStateType), INTENT(INOUT) :: OutData + TYPE(SlD_ConstraintStateType), INTENT(INOUT) :: OutData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg ! Local variables @@ -1328,7 +1328,7 @@ SUBROUTINE DirtD_UnPackConstrState( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat LOGICAL, ALLOCATABLE :: mask5(:,:,:,:,:) INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_UnPackConstrState' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_UnPackConstrState' ! buffers to store meshes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -1341,11 +1341,11 @@ SUBROUTINE DirtD_UnPackConstrState( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat Int_Xferred = 1 OutData%DummyConstrState = ReKiBuf( Re_Xferred ) Re_Xferred = Re_Xferred + 1 - END SUBROUTINE DirtD_UnPackConstrState + END SUBROUTINE SlD_UnPackConstrState - SUBROUTINE DirtD_CopyOtherState( SrcOtherStateData, DstOtherStateData, CtrlCode, ErrStat, ErrMsg ) - TYPE(DirtD_OtherStateType), INTENT(IN) :: SrcOtherStateData - TYPE(DirtD_OtherStateType), INTENT(INOUT) :: DstOtherStateData + SUBROUTINE SlD_CopyOtherState( SrcOtherStateData, DstOtherStateData, CtrlCode, ErrStat, ErrMsg ) + TYPE(SlD_OtherStateType), INTENT(IN) :: SrcOtherStateData + TYPE(SlD_OtherStateType), INTENT(INOUT) :: DstOtherStateData INTEGER(IntKi), INTENT(IN ) :: CtrlCode INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg @@ -1353,29 +1353,29 @@ SUBROUTINE DirtD_CopyOtherState( SrcOtherStateData, DstOtherStateData, CtrlCode, INTEGER(IntKi) :: i,j,k INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_CopyOtherState' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_CopyOtherState' ! ErrStat = ErrID_None ErrMsg = "" DstOtherStateData%DummyOtherState = SrcOtherStateData%DummyOtherState - END SUBROUTINE DirtD_CopyOtherState + END SUBROUTINE SlD_CopyOtherState - SUBROUTINE DirtD_DestroyOtherState( OtherStateData, ErrStat, ErrMsg ) - TYPE(DirtD_OtherStateType), INTENT(INOUT) :: OtherStateData + SUBROUTINE SlD_DestroyOtherState( OtherStateData, ErrStat, ErrMsg ) + TYPE(SlD_OtherStateType), INTENT(INOUT) :: OtherStateData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_DestroyOtherState' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_DestroyOtherState' INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 ! ErrStat = ErrID_None ErrMsg = "" - END SUBROUTINE DirtD_DestroyOtherState + END SUBROUTINE SlD_DestroyOtherState - SUBROUTINE DirtD_PackOtherState( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) + SUBROUTINE SlD_PackOtherState( 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(DirtD_OtherStateType), INTENT(IN) :: InData + TYPE(SlD_OtherStateType), INTENT(IN) :: InData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg LOGICAL,OPTIONAL, INTENT(IN ) :: SizeOnly @@ -1390,7 +1390,7 @@ SUBROUTINE DirtD_PackOtherState( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er LOGICAL :: OnlySize ! if present and true, do not pack, just allocate buffers INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_PackOtherState' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_PackOtherState' ! buffers to store subtypes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -1436,13 +1436,13 @@ SUBROUTINE DirtD_PackOtherState( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er IntKiBuf ( Int_Xferred:Int_Xferred+(1)-1 ) = InData%DummyOtherState Int_Xferred = Int_Xferred + 1 - END SUBROUTINE DirtD_PackOtherState + END SUBROUTINE SlD_PackOtherState - SUBROUTINE DirtD_UnPackOtherState( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) + SUBROUTINE SlD_UnPackOtherState( 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(DirtD_OtherStateType), INTENT(INOUT) :: OutData + TYPE(SlD_OtherStateType), INTENT(INOUT) :: OutData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg ! Local variables @@ -1459,7 +1459,7 @@ SUBROUTINE DirtD_UnPackOtherState( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, LOGICAL, ALLOCATABLE :: mask5(:,:,:,:,:) INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_UnPackOtherState' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_UnPackOtherState' ! buffers to store meshes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -1472,11 +1472,11 @@ SUBROUTINE DirtD_UnPackOtherState( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Int_Xferred = 1 OutData%DummyOtherState = IntKiBuf( Int_Xferred ) Int_Xferred = Int_Xferred + 1 - END SUBROUTINE DirtD_UnPackOtherState + END SUBROUTINE SlD_UnPackOtherState - SUBROUTINE DirtD_CopyMisc( SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg ) - TYPE(DirtD_MiscVarType), INTENT(IN) :: SrcMiscData - TYPE(DirtD_MiscVarType), INTENT(INOUT) :: DstMiscData + SUBROUTINE SlD_CopyMisc( SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg ) + TYPE(SlD_MiscVarType), INTENT(IN) :: SrcMiscData + TYPE(SlD_MiscVarType), INTENT(INOUT) :: DstMiscData INTEGER(IntKi), INTENT(IN ) :: CtrlCode INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg @@ -1484,32 +1484,32 @@ SUBROUTINE DirtD_CopyMisc( SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg ) INTEGER(IntKi) :: i,j,k INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_CopyMisc' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_CopyMisc' ! ErrStat = ErrID_None ErrMsg = "" - CALL DirtD_Copyredwindlltype( SrcMiscData%dll_data, DstMiscData%dll_data, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SlD_Copyredwindlltype( SrcMiscData%dll_data, DstMiscData%dll_data, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN - END SUBROUTINE DirtD_CopyMisc + END SUBROUTINE SlD_CopyMisc - SUBROUTINE DirtD_DestroyMisc( MiscData, ErrStat, ErrMsg ) - TYPE(DirtD_MiscVarType), INTENT(INOUT) :: MiscData + SUBROUTINE SlD_DestroyMisc( MiscData, ErrStat, ErrMsg ) + TYPE(SlD_MiscVarType), INTENT(INOUT) :: MiscData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_DestroyMisc' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_DestroyMisc' INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 ! ErrStat = ErrID_None ErrMsg = "" - CALL DirtD_Destroyredwindlltype( MiscData%dll_data, ErrStat, ErrMsg ) - END SUBROUTINE DirtD_DestroyMisc + CALL SlD_Destroyredwindlltype( MiscData%dll_data, ErrStat, ErrMsg ) + END SUBROUTINE SlD_DestroyMisc - SUBROUTINE DirtD_PackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) + SUBROUTINE SlD_PackMisc( 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(DirtD_MiscVarType), INTENT(IN) :: InData + TYPE(SlD_MiscVarType), INTENT(IN) :: InData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg LOGICAL,OPTIONAL, INTENT(IN ) :: SizeOnly @@ -1524,7 +1524,7 @@ SUBROUTINE DirtD_PackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, LOGICAL :: OnlySize ! if present and true, do not pack, just allocate buffers INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_PackMisc' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_PackMisc' ! buffers to store subtypes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -1542,7 +1542,7 @@ SUBROUTINE DirtD_PackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, Int_BufSz = 0 ! Allocate buffers for subtypes, if any (we'll get sizes from these) Int_BufSz = Int_BufSz + 3 ! dll_data: size of buffers for each call to pack subtype - CALL DirtD_Packredwindlltype( Re_Buf, Db_Buf, Int_Buf, InData%dll_data, ErrStat2, ErrMsg2, .TRUE. ) ! dll_data + CALL SlD_Packredwindlltype( Re_Buf, Db_Buf, Int_Buf, InData%dll_data, ErrStat2, ErrMsg2, .TRUE. ) ! dll_data CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -1585,7 +1585,7 @@ SUBROUTINE DirtD_PackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, Db_Xferred = 1 Int_Xferred = 1 - CALL DirtD_Packredwindlltype( Re_Buf, Db_Buf, Int_Buf, InData%dll_data, ErrStat2, ErrMsg2, OnlySize ) ! dll_data + CALL SlD_Packredwindlltype( Re_Buf, Db_Buf, Int_Buf, InData%dll_data, ErrStat2, ErrMsg2, OnlySize ) ! dll_data CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -1613,13 +1613,13 @@ SUBROUTINE DirtD_PackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, ELSE IntKiBuf( Int_Xferred ) = 0; Int_Xferred = Int_Xferred + 1 ENDIF - END SUBROUTINE DirtD_PackMisc + END SUBROUTINE SlD_PackMisc - SUBROUTINE DirtD_UnPackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) + SUBROUTINE SlD_UnPackMisc( 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(DirtD_MiscVarType), INTENT(INOUT) :: OutData + TYPE(SlD_MiscVarType), INTENT(INOUT) :: OutData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg ! Local variables @@ -1636,7 +1636,7 @@ SUBROUTINE DirtD_UnPackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMs LOGICAL, ALLOCATABLE :: mask5(:,:,:,:,:) INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_UnPackMisc' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_UnPackMisc' ! buffers to store meshes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -1680,18 +1680,18 @@ SUBROUTINE DirtD_UnPackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMs Int_Buf = IntKiBuf( Int_Xferred:Int_Xferred+Buf_size-1 ) Int_Xferred = Int_Xferred + Buf_size END IF - CALL DirtD_Unpackredwindlltype( Re_Buf, Db_Buf, Int_Buf, OutData%dll_data, ErrStat2, ErrMsg2 ) ! dll_data + CALL SlD_Unpackredwindlltype( Re_Buf, Db_Buf, Int_Buf, OutData%dll_data, ErrStat2, ErrMsg2 ) ! dll_data 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) - END SUBROUTINE DirtD_UnPackMisc + END SUBROUTINE SlD_UnPackMisc - SUBROUTINE DirtD_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg ) - TYPE(DirtD_ParameterType), INTENT(IN) :: SrcParamData - TYPE(DirtD_ParameterType), INTENT(INOUT) :: DstParamData + SUBROUTINE SlD_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg ) + TYPE(SlD_ParameterType), INTENT(IN) :: SrcParamData + TYPE(SlD_ParameterType), INTENT(INOUT) :: DstParamData INTEGER(IntKi), INTENT(IN ) :: CtrlCode INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg @@ -1699,7 +1699,7 @@ SUBROUTINE DirtD_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMs INTEGER(IntKi) :: i,j,k INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_CopyParam' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_CopyParam' ! ErrStat = ErrID_None ErrMsg = "" @@ -1709,25 +1709,25 @@ SUBROUTINE DirtD_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMs DstParamData%DLL_DT = SrcParamData%DLL_DT DstParamData%RootName = SrcParamData%RootName DstParamData%UseREDWINinterface = SrcParamData%UseREDWINinterface - END SUBROUTINE DirtD_CopyParam + END SUBROUTINE SlD_CopyParam - SUBROUTINE DirtD_DestroyParam( ParamData, ErrStat, ErrMsg ) - TYPE(DirtD_ParameterType), INTENT(INOUT) :: ParamData + SUBROUTINE SlD_DestroyParam( ParamData, ErrStat, ErrMsg ) + TYPE(SlD_ParameterType), INTENT(INOUT) :: ParamData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_DestroyParam' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_DestroyParam' INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 ! ErrStat = ErrID_None ErrMsg = "" CALL FreeDynamicLib( ParamData%DLL_Trgt, ErrStat, ErrMsg ) - END SUBROUTINE DirtD_DestroyParam + END SUBROUTINE SlD_DestroyParam - SUBROUTINE DirtD_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) + SUBROUTINE SlD_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(DirtD_ParameterType), INTENT(IN) :: InData + TYPE(SlD_ParameterType), INTENT(IN) :: InData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg LOGICAL,OPTIONAL, INTENT(IN ) :: SizeOnly @@ -1742,7 +1742,7 @@ SUBROUTINE DirtD_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, LOGICAL :: OnlySize ! if present and true, do not pack, just allocate buffers INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_PackParam' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_PackParam' ! buffers to store subtypes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -1850,13 +1850,13 @@ SUBROUTINE DirtD_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, END DO ! I IntKiBuf ( Int_Xferred:Int_Xferred+1-1 ) = TRANSFER( InData%UseREDWINinterface , IntKiBuf(1), 1) Int_Xferred = Int_Xferred + 1 - END SUBROUTINE DirtD_PackParam + END SUBROUTINE SlD_PackParam - SUBROUTINE DirtD_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) + SUBROUTINE SlD_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(DirtD_ParameterType), INTENT(INOUT) :: OutData + TYPE(SlD_ParameterType), INTENT(INOUT) :: OutData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg ! Local variables @@ -1873,7 +1873,7 @@ SUBROUTINE DirtD_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrM LOGICAL, ALLOCATABLE :: mask5(:,:,:,:,:) INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_UnPackParam' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_UnPackParam' ! buffers to store meshes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -1938,11 +1938,11 @@ SUBROUTINE DirtD_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrM END DO ! I OutData%UseREDWINinterface = TRANSFER( IntKiBuf( Int_Xferred ), mask0 ) Int_Xferred = Int_Xferred + 1 - END SUBROUTINE DirtD_UnPackParam + END SUBROUTINE SlD_UnPackParam - SUBROUTINE DirtD_CopyInput( SrcInputData, DstInputData, CtrlCode, ErrStat, ErrMsg ) - TYPE(DirtD_InputType), INTENT(IN) :: SrcInputData - TYPE(DirtD_InputType), INTENT(INOUT) :: DstInputData + SUBROUTINE SlD_CopyInput( SrcInputData, DstInputData, CtrlCode, ErrStat, ErrMsg ) + TYPE(SlD_InputType), INTENT(IN) :: SrcInputData + TYPE(SlD_InputType), INTENT(INOUT) :: DstInputData INTEGER(IntKi), INTENT(IN ) :: CtrlCode INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg @@ -1950,29 +1950,29 @@ SUBROUTINE DirtD_CopyInput( SrcInputData, DstInputData, CtrlCode, ErrStat, ErrMs INTEGER(IntKi) :: i,j,k INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_CopyInput' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_CopyInput' ! ErrStat = ErrID_None ErrMsg = "" DstInputData%DummyInput = SrcInputData%DummyInput - END SUBROUTINE DirtD_CopyInput + END SUBROUTINE SlD_CopyInput - SUBROUTINE DirtD_DestroyInput( InputData, ErrStat, ErrMsg ) - TYPE(DirtD_InputType), INTENT(INOUT) :: InputData + SUBROUTINE SlD_DestroyInput( InputData, ErrStat, ErrMsg ) + TYPE(SlD_InputType), INTENT(INOUT) :: InputData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_DestroyInput' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_DestroyInput' INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 ! ErrStat = ErrID_None ErrMsg = "" - END SUBROUTINE DirtD_DestroyInput + END SUBROUTINE SlD_DestroyInput - SUBROUTINE DirtD_PackInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) + SUBROUTINE SlD_PackInput( 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(DirtD_InputType), INTENT(IN) :: InData + TYPE(SlD_InputType), INTENT(IN) :: InData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg LOGICAL,OPTIONAL, INTENT(IN ) :: SizeOnly @@ -1987,7 +1987,7 @@ SUBROUTINE DirtD_PackInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, LOGICAL :: OnlySize ! if present and true, do not pack, just allocate buffers INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_PackInput' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_PackInput' ! buffers to store subtypes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -2033,13 +2033,13 @@ SUBROUTINE DirtD_PackInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, ReKiBuf ( Re_Xferred:Re_Xferred+(1)-1 ) = InData%DummyInput Re_Xferred = Re_Xferred + 1 - END SUBROUTINE DirtD_PackInput + END SUBROUTINE SlD_PackInput - SUBROUTINE DirtD_UnPackInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) + SUBROUTINE SlD_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(DirtD_InputType), INTENT(INOUT) :: OutData + TYPE(SlD_InputType), INTENT(INOUT) :: OutData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg ! Local variables @@ -2056,7 +2056,7 @@ SUBROUTINE DirtD_UnPackInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrM LOGICAL, ALLOCATABLE :: mask5(:,:,:,:,:) INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_UnPackInput' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_UnPackInput' ! buffers to store meshes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -2069,11 +2069,11 @@ SUBROUTINE DirtD_UnPackInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrM Int_Xferred = 1 OutData%DummyInput = ReKiBuf( Re_Xferred ) Re_Xferred = Re_Xferred + 1 - END SUBROUTINE DirtD_UnPackInput + END SUBROUTINE SlD_UnPackInput - SUBROUTINE DirtD_CopyOutput( SrcOutputData, DstOutputData, CtrlCode, ErrStat, ErrMsg ) - TYPE(DirtD_OutputType), INTENT(IN) :: SrcOutputData - TYPE(DirtD_OutputType), INTENT(INOUT) :: DstOutputData + SUBROUTINE SlD_CopyOutput( SrcOutputData, DstOutputData, CtrlCode, ErrStat, ErrMsg ) + TYPE(SlD_OutputType), INTENT(IN) :: SrcOutputData + TYPE(SlD_OutputType), INTENT(INOUT) :: DstOutputData INTEGER(IntKi), INTENT(IN ) :: CtrlCode INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg @@ -2082,7 +2082,7 @@ SUBROUTINE DirtD_CopyOutput( SrcOutputData, DstOutputData, CtrlCode, 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 = 'DirtD_CopyOutput' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_CopyOutput' ! ErrStat = ErrID_None ErrMsg = "" @@ -2099,13 +2099,13 @@ SUBROUTINE DirtD_CopyOutput( SrcOutputData, DstOutputData, CtrlCode, ErrStat, Er END IF DstOutputData%WriteOutput = SrcOutputData%WriteOutput ENDIF - END SUBROUTINE DirtD_CopyOutput + END SUBROUTINE SlD_CopyOutput - SUBROUTINE DirtD_DestroyOutput( OutputData, ErrStat, ErrMsg ) - TYPE(DirtD_OutputType), INTENT(INOUT) :: OutputData + SUBROUTINE SlD_DestroyOutput( OutputData, ErrStat, ErrMsg ) + TYPE(SlD_OutputType), INTENT(INOUT) :: OutputData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_DestroyOutput' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_DestroyOutput' INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 ! ErrStat = ErrID_None @@ -2113,13 +2113,13 @@ SUBROUTINE DirtD_DestroyOutput( OutputData, ErrStat, ErrMsg ) IF (ALLOCATED(OutputData%WriteOutput)) THEN DEALLOCATE(OutputData%WriteOutput) ENDIF - END SUBROUTINE DirtD_DestroyOutput + END SUBROUTINE SlD_DestroyOutput - SUBROUTINE DirtD_PackOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) + SUBROUTINE SlD_PackOutput( 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(DirtD_OutputType), INTENT(IN) :: InData + TYPE(SlD_OutputType), INTENT(IN) :: InData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg LOGICAL,OPTIONAL, INTENT(IN ) :: SizeOnly @@ -2134,7 +2134,7 @@ SUBROUTINE DirtD_PackOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg LOGICAL :: OnlySize ! if present and true, do not pack, just allocate buffers INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_PackOutput' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_PackOutput' ! buffers to store subtypes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -2198,13 +2198,13 @@ SUBROUTINE DirtD_PackOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg IF (SIZE(InData%WriteOutput)>0) ReKiBuf ( Re_Xferred:Re_Xferred+(SIZE(InData%WriteOutput))-1 ) = PACK(InData%WriteOutput,.TRUE.) Re_Xferred = Re_Xferred + SIZE(InData%WriteOutput) END IF - END SUBROUTINE DirtD_PackOutput + END SUBROUTINE SlD_PackOutput - SUBROUTINE DirtD_UnPackOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) + SUBROUTINE SlD_UnPackOutput( 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(DirtD_OutputType), INTENT(INOUT) :: OutData + TYPE(SlD_OutputType), INTENT(INOUT) :: OutData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg ! Local variables @@ -2222,7 +2222,7 @@ SUBROUTINE DirtD_UnPackOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Err INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_UnPackOutput' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_UnPackOutput' ! buffers to store meshes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -2258,10 +2258,10 @@ SUBROUTINE DirtD_UnPackOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Err Re_Xferred = Re_Xferred + SIZE(OutData%WriteOutput) DEALLOCATE(mask1) END IF - END SUBROUTINE DirtD_UnPackOutput + END SUBROUTINE SlD_UnPackOutput - SUBROUTINE DirtD_Input_ExtrapInterp(u, t, u_out, t_out, ErrStat, ErrMsg ) + SUBROUTINE SlD_Input_ExtrapInterp(u, t, u_out, t_out, ErrStat, ErrMsg ) ! ! This subroutine calculates a extrapolated (or interpolated) Input u_out at time t_out, from previous/future time ! values of u (which has values associated with times in t). Order of the interpolation is given by the size of u @@ -2277,9 +2277,9 @@ SUBROUTINE DirtD_Input_ExtrapInterp(u, t, u_out, t_out, ErrStat, ErrMsg ) ! !.................................................................................................................................. - TYPE(DirtD_InputType), INTENT(IN) :: u(:) ! Input at t1 > t2 > t3 + TYPE(SlD_InputType), INTENT(IN) :: u(:) ! Input at t1 > t2 > t3 REAL(DbKi), INTENT(IN ) :: t(:) ! Times associated with the Inputs - TYPE(DirtD_InputType), INTENT(INOUT) :: u_out ! Input at tin_out + TYPE(SlD_InputType), INTENT(INOUT) :: u_out ! Input at tin_out REAL(DbKi), INTENT(IN ) :: t_out ! time to be extrap/interp'd to INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None @@ -2287,7 +2287,7 @@ SUBROUTINE DirtD_Input_ExtrapInterp(u, t, u_out, t_out, ErrStat, ErrMsg ) INTEGER(IntKi) :: order ! order of polynomial fit (max 2) INTEGER(IntKi) :: ErrStat2 ! local errors CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_Input_ExtrapInterp' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_Input_ExtrapInterp' ! Initialize ErrStat ErrStat = ErrID_None ErrMsg = "" @@ -2297,22 +2297,22 @@ SUBROUTINE DirtD_Input_ExtrapInterp(u, t, u_out, t_out, ErrStat, ErrMsg ) endif order = SIZE(u) - 1 IF ( order .eq. 0 ) THEN - CALL DirtD_CopyInput(u(1), u_out, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) + CALL SlD_CopyInput(u(1), u_out, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) ELSE IF ( order .eq. 1 ) THEN - CALL DirtD_Input_ExtrapInterp1(u(1), u(2), t, u_out, t_out, ErrStat2, ErrMsg2 ) + CALL SlD_Input_ExtrapInterp1(u(1), u(2), t, u_out, t_out, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) ELSE IF ( order .eq. 2 ) THEN - CALL DirtD_Input_ExtrapInterp2(u(1), u(2), u(3), t, u_out, t_out, ErrStat2, ErrMsg2 ) + CALL SlD_Input_ExtrapInterp2(u(1), u(2), u(3), t, u_out, t_out, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) ELSE CALL SetErrStat(ErrID_Fatal,'size(u) must be less than 4 (order must be less than 3).',ErrStat,ErrMsg,RoutineName) RETURN ENDIF - END SUBROUTINE DirtD_Input_ExtrapInterp + END SUBROUTINE SlD_Input_ExtrapInterp - SUBROUTINE DirtD_Input_ExtrapInterp1(u1, u2, tin, u_out, tin_out, ErrStat, ErrMsg ) + SUBROUTINE SlD_Input_ExtrapInterp1(u1, u2, tin, u_out, tin_out, ErrStat, ErrMsg ) ! ! This subroutine calculates a extrapolated (or interpolated) Input u_out at time t_out, from previous/future time ! values of u (which has values associated with times in t). Order of the interpolation is 1. @@ -2324,17 +2324,17 @@ SUBROUTINE DirtD_Input_ExtrapInterp1(u1, u2, tin, u_out, tin_out, ErrStat, ErrMs ! !.................................................................................................................................. - TYPE(DirtD_InputType), INTENT(IN) :: u1 ! Input at t1 > t2 - TYPE(DirtD_InputType), INTENT(IN) :: u2 ! Input at t2 + TYPE(SlD_InputType), INTENT(IN) :: u1 ! Input at t1 > t2 + TYPE(SlD_InputType), INTENT(IN) :: u2 ! Input at t2 REAL(DbKi), INTENT(IN ) :: tin(2) ! Times associated with the Inputs - TYPE(DirtD_InputType), INTENT(INOUT) :: u_out ! Input at tin_out + TYPE(SlD_InputType), INTENT(INOUT) :: u_out ! Input at tin_out REAL(DbKi), INTENT(IN ) :: tin_out ! time to be extrap/interp'd to INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None ! local variables REAL(DbKi) :: t(2) ! Times associated with the Inputs REAL(DbKi) :: t_out ! Time to which to be extrap/interpd - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_Input_ExtrapInterp1' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_Input_ExtrapInterp1' REAL(DbKi) :: b0 ! temporary for extrapolation/interpolation REAL(DbKi) :: c0 ! temporary for extrapolation/interpolation INTEGER(IntKi) :: ErrStat2 ! local errors @@ -2353,10 +2353,10 @@ SUBROUTINE DirtD_Input_ExtrapInterp1(u1, u2, tin, u_out, tin_out, ErrStat, ErrMs END IF b0 = -(u1%DummyInput - u2%DummyInput)/t(2) u_out%DummyInput = u1%DummyInput + b0 * t_out - END SUBROUTINE DirtD_Input_ExtrapInterp1 + END SUBROUTINE SlD_Input_ExtrapInterp1 - SUBROUTINE DirtD_Input_ExtrapInterp2(u1, u2, u3, tin, u_out, tin_out, ErrStat, ErrMsg ) + SUBROUTINE SlD_Input_ExtrapInterp2(u1, u2, u3, tin, u_out, tin_out, ErrStat, ErrMsg ) ! ! This subroutine calculates a extrapolated (or interpolated) Input u_out at time t_out, from previous/future time ! values of u (which has values associated with times in t). Order of the interpolation is 2. @@ -2370,11 +2370,11 @@ SUBROUTINE DirtD_Input_ExtrapInterp2(u1, u2, u3, tin, u_out, tin_out, ErrStat, E ! !.................................................................................................................................. - TYPE(DirtD_InputType), INTENT(IN) :: u1 ! Input at t1 > t2 > t3 - TYPE(DirtD_InputType), INTENT(IN) :: u2 ! Input at t2 > t3 - TYPE(DirtD_InputType), INTENT(IN) :: u3 ! Input at t3 + TYPE(SlD_InputType), INTENT(IN) :: u1 ! Input at t1 > t2 > t3 + TYPE(SlD_InputType), INTENT(IN) :: u2 ! Input at t2 > t3 + TYPE(SlD_InputType), INTENT(IN) :: u3 ! Input at t3 REAL(DbKi), INTENT(IN ) :: tin(3) ! Times associated with the Inputs - TYPE(DirtD_InputType), INTENT(INOUT) :: u_out ! Input at tin_out + TYPE(SlD_InputType), INTENT(INOUT) :: u_out ! Input at tin_out REAL(DbKi), INTENT(IN ) :: tin_out ! time to be extrap/interp'd to INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None @@ -2386,7 +2386,7 @@ SUBROUTINE DirtD_Input_ExtrapInterp2(u1, u2, u3, tin, u_out, tin_out, ErrStat, E REAL(DbKi) :: c0 ! temporary for extrapolation/interpolation INTEGER(IntKi) :: ErrStat2 ! local errors CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_Input_ExtrapInterp2' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_Input_ExtrapInterp2' ! Initialize ErrStat ErrStat = ErrID_None ErrMsg = "" @@ -2408,10 +2408,10 @@ SUBROUTINE DirtD_Input_ExtrapInterp2(u1, u2, u3, tin, u_out, tin_out, ErrStat, E b0 = (t(3)**2*(u1%DummyInput - u2%DummyInput) + t(2)**2*(-u1%DummyInput + u3%DummyInput))/(t(2)*t(3)*(t(2) - t(3))) c0 = ( (t(2)-t(3))*u1%DummyInput + t(3)*u2%DummyInput - t(2)*u3%DummyInput ) / (t(2)*t(3)*(t(2) - t(3))) u_out%DummyInput = u1%DummyInput + b0 * t_out + c0 * t_out**2 - END SUBROUTINE DirtD_Input_ExtrapInterp2 + END SUBROUTINE SlD_Input_ExtrapInterp2 - SUBROUTINE DirtD_Output_ExtrapInterp(y, t, y_out, t_out, ErrStat, ErrMsg ) + SUBROUTINE SlD_Output_ExtrapInterp(y, t, y_out, t_out, ErrStat, ErrMsg ) ! ! This subroutine calculates a extrapolated (or interpolated) Output y_out at time t_out, from previous/future time ! values of y (which has values associated with times in t). Order of the interpolation is given by the size of y @@ -2427,9 +2427,9 @@ SUBROUTINE DirtD_Output_ExtrapInterp(y, t, y_out, t_out, ErrStat, ErrMsg ) ! !.................................................................................................................................. - TYPE(DirtD_OutputType), INTENT(IN) :: y(:) ! Output at t1 > t2 > t3 + TYPE(SlD_OutputType), INTENT(IN) :: y(:) ! Output at t1 > t2 > t3 REAL(DbKi), INTENT(IN ) :: t(:) ! Times associated with the Outputs - TYPE(DirtD_OutputType), INTENT(INOUT) :: y_out ! Output at tin_out + TYPE(SlD_OutputType), INTENT(INOUT) :: y_out ! Output at tin_out REAL(DbKi), INTENT(IN ) :: t_out ! time to be extrap/interp'd to INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None @@ -2437,7 +2437,7 @@ SUBROUTINE DirtD_Output_ExtrapInterp(y, t, y_out, t_out, ErrStat, ErrMsg ) INTEGER(IntKi) :: order ! order of polynomial fit (max 2) INTEGER(IntKi) :: ErrStat2 ! local errors CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_Output_ExtrapInterp' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_Output_ExtrapInterp' ! Initialize ErrStat ErrStat = ErrID_None ErrMsg = "" @@ -2447,22 +2447,22 @@ SUBROUTINE DirtD_Output_ExtrapInterp(y, t, y_out, t_out, ErrStat, ErrMsg ) endif order = SIZE(y) - 1 IF ( order .eq. 0 ) THEN - CALL DirtD_CopyOutput(y(1), y_out, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) + CALL SlD_CopyOutput(y(1), y_out, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) ELSE IF ( order .eq. 1 ) THEN - CALL DirtD_Output_ExtrapInterp1(y(1), y(2), t, y_out, t_out, ErrStat2, ErrMsg2 ) + CALL SlD_Output_ExtrapInterp1(y(1), y(2), t, y_out, t_out, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) ELSE IF ( order .eq. 2 ) THEN - CALL DirtD_Output_ExtrapInterp2(y(1), y(2), y(3), t, y_out, t_out, ErrStat2, ErrMsg2 ) + CALL SlD_Output_ExtrapInterp2(y(1), y(2), y(3), t, y_out, t_out, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) ELSE CALL SetErrStat(ErrID_Fatal,'size(y) must be less than 4 (order must be less than 3).',ErrStat,ErrMsg,RoutineName) RETURN ENDIF - END SUBROUTINE DirtD_Output_ExtrapInterp + END SUBROUTINE SlD_Output_ExtrapInterp - SUBROUTINE DirtD_Output_ExtrapInterp1(y1, y2, tin, y_out, tin_out, ErrStat, ErrMsg ) + SUBROUTINE SlD_Output_ExtrapInterp1(y1, y2, tin, y_out, tin_out, ErrStat, ErrMsg ) ! ! This subroutine calculates a extrapolated (or interpolated) Output y_out at time t_out, from previous/future time ! values of y (which has values associated with times in t). Order of the interpolation is 1. @@ -2474,17 +2474,17 @@ SUBROUTINE DirtD_Output_ExtrapInterp1(y1, y2, tin, y_out, tin_out, ErrStat, ErrM ! !.................................................................................................................................. - TYPE(DirtD_OutputType), INTENT(IN) :: y1 ! Output at t1 > t2 - TYPE(DirtD_OutputType), INTENT(IN) :: y2 ! Output at t2 + TYPE(SlD_OutputType), INTENT(IN) :: y1 ! Output at t1 > t2 + TYPE(SlD_OutputType), INTENT(IN) :: y2 ! Output at t2 REAL(DbKi), INTENT(IN ) :: tin(2) ! Times associated with the Outputs - TYPE(DirtD_OutputType), INTENT(INOUT) :: y_out ! Output at tin_out + TYPE(SlD_OutputType), INTENT(INOUT) :: y_out ! Output at tin_out REAL(DbKi), INTENT(IN ) :: tin_out ! time to be extrap/interp'd to INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None ! local variables REAL(DbKi) :: t(2) ! Times associated with the Outputs REAL(DbKi) :: t_out ! Time to which to be extrap/interpd - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_Output_ExtrapInterp1' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_Output_ExtrapInterp1' REAL(DbKi) :: b0 ! temporary for extrapolation/interpolation REAL(DbKi) :: c0 ! temporary for extrapolation/interpolation REAL(DbKi),ALLOCATABLE,DIMENSION(:) :: b1 ! temporary for extrapolation/interpolation @@ -2513,10 +2513,10 @@ SUBROUTINE DirtD_Output_ExtrapInterp1(y1, y2, tin, y_out, tin_out, ErrStat, ErrM DEALLOCATE(b1) DEALLOCATE(c1) END IF ! check if allocated - END SUBROUTINE DirtD_Output_ExtrapInterp1 + END SUBROUTINE SlD_Output_ExtrapInterp1 - SUBROUTINE DirtD_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat, ErrMsg ) + SUBROUTINE SlD_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat, ErrMsg ) ! ! This subroutine calculates a extrapolated (or interpolated) Output y_out at time t_out, from previous/future time ! values of y (which has values associated with times in t). Order of the interpolation is 2. @@ -2530,11 +2530,11 @@ SUBROUTINE DirtD_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat, ! !.................................................................................................................................. - TYPE(DirtD_OutputType), INTENT(IN) :: y1 ! Output at t1 > t2 > t3 - TYPE(DirtD_OutputType), INTENT(IN) :: y2 ! Output at t2 > t3 - TYPE(DirtD_OutputType), INTENT(IN) :: y3 ! Output at t3 + TYPE(SlD_OutputType), INTENT(IN) :: y1 ! Output at t1 > t2 > t3 + TYPE(SlD_OutputType), INTENT(IN) :: y2 ! Output at t2 > t3 + TYPE(SlD_OutputType), INTENT(IN) :: y3 ! Output at t3 REAL(DbKi), INTENT(IN ) :: tin(3) ! Times associated with the Outputs - TYPE(DirtD_OutputType), INTENT(INOUT) :: y_out ! Output at tin_out + TYPE(SlD_OutputType), INTENT(INOUT) :: y_out ! Output at tin_out REAL(DbKi), INTENT(IN ) :: tin_out ! time to be extrap/interp'd to INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None @@ -2548,7 +2548,7 @@ SUBROUTINE DirtD_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat, REAL(DbKi),ALLOCATABLE,DIMENSION(:) :: c1 ! temporary for extrapolation/interpolation INTEGER(IntKi) :: ErrStat2 ! local errors CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors - CHARACTER(*), PARAMETER :: RoutineName = 'DirtD_Output_ExtrapInterp2' + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_Output_ExtrapInterp2' ! Initialize ErrStat ErrStat = ErrID_None ErrMsg = "" @@ -2579,7 +2579,7 @@ SUBROUTINE DirtD_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat, DEALLOCATE(b1) DEALLOCATE(c1) END IF ! check if allocated - END SUBROUTINE DirtD_Output_ExtrapInterp2 + END SUBROUTINE SlD_Output_ExtrapInterp2 -END MODULE DirtDyn_Types +END MODULE SoilDyn_Types !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/dirtdyn/src/driver/DirtDyn_Driver.f90 b/modules/soildyn/src/driver/SoilDyn_Driver.f90 similarity index 77% rename from modules/dirtdyn/src/driver/DirtDyn_Driver.f90 rename to modules/soildyn/src/driver/SoilDyn_Driver.f90 index dea2c0043..977ad7188 100644 --- a/modules/dirtdyn/src/driver/DirtDyn_Driver.f90 +++ b/modules/soildyn/src/driver/SoilDyn_Driver.f90 @@ -1,10 +1,10 @@ !********************************************************************************************************************************** -!> ## DirtDyn_DriverCode: This code tests the DirtDyn module +!> ## SoilDyn_DriverCode: This code tests the SoilDyn module !!.................................................................................................................................. !! LICENSING !! Copyright (C) 2012, 2015 National Renewable Energy Laboratory !! -!! This file is part of DirtDyn. +!! This file is part of SoilDyn. !! !! Licensed under the Apache License, Version 2.0 (the "License"); !! you may not use this file except in compliance with the License. @@ -18,34 +18,34 @@ !! See the License for the specific language governing permissions and !! limitations under the License. !********************************************************************************************************************************** -PROGRAM DirtDyn_Driver +PROGRAM SoilDyn_Driver USE NWTC_Library - USE DirtDyn - USE DirtDyn_Types + USE SoilDyn + USE SoilDyn_Types IMPLICIT NONE - integer(IntKi), parameter :: NumInp = 1 !< Number of inputs sent to DirtDyn_UpdateStates + integer(IntKi), parameter :: NumInp = 1 !< Number of inputs sent to SoilDyn_UpdateStates ! Program variables real(DbKi) :: Time !< Variable for storing time, in seconds real(DbKi) :: TimeInterval !< Interval between time steps, in seconds real(DbKi) :: InputTime(NumInp) !< Variable for storing time associated with inputs, in seconds - type(DirtD_InitInputType) :: InitInData !< Input data for initialization - type(DirtD_InitOutputType) :: InitOutData !< Output data from initialization - - type(DirtD_ContinuousStateType) :: x !< Continuous states - type(DirtD_DiscreteStateType) :: xd !< Discrete states - type(DirtD_ConstraintStateType) :: z !< Constraint states - type(DirtD_ConstraintStateType) :: Z_residual !< Residual of the constraint state functions (Z) - type(DirtD_OtherStateType) :: OtherState !< Other states - type(DirtD_MiscVarType) :: misc !< Optimization variables - - type(DirtD_ParameterType) :: p !< Parameters - type(DirtD_InputType) :: u(NumInp) !< System inputs - type(DirtD_OutputType) :: y !< System outputs + type(SlD_InitInputType) :: InitInData !< Input data for initialization + type(SlD_InitOutputType) :: InitOutData !< Output data from initialization + + type(SlD_ContinuousStateType) :: x !< Continuous states + type(SlD_DiscreteStateType) :: xd !< Discrete states + type(SlD_ConstraintStateType) :: z !< Constraint states + type(SlD_ConstraintStateType) :: Z_residual !< Residual of the constraint state functions (Z) + type(SlD_OtherStateType) :: OtherState !< Other states + type(SlD_MiscVarType) :: misc !< Optimization variables + + type(SlD_ParameterType) :: p !< Parameters + type(SlD_InputType) :: u(NumInp) !< System inputs + type(SlD_OutputType) :: y !< System outputs @@ -69,7 +69,7 @@ PROGRAM DirtDyn_Driver ! Initialize the module - CALL DirtDyn_Init( InitInData, u(1), p, x, xd, z, OtherState, y, misc, TimeInterval, InitOutData, ErrStat, ErrMsg ) + CALL SoilDyn_Init( InitInData, u(1), p, x, xd, z, OtherState, y, misc, TimeInterval, InitOutData, ErrStat, ErrMsg ) IF ( ErrStat /= ErrID_None ) THEN ! Check if there was an error and do something about it if necessary CALL WrScr( 'After Init: '//ErrMsg ) if ( ErrStat >= AbortErrLev ) call ProgEnd() @@ -77,8 +77,8 @@ PROGRAM DirtDyn_Driver ! Destroy initialization data - CALL DirtD_DestroyInitInput( InitInData, ErrStat, ErrMsg ) - CALL DirtD_DestroyInitOutput( InitOutData, ErrStat, ErrMsg ) + CALL SlD_DestroyInitInput( InitInData, ErrStat, ErrMsg ) + CALL SlD_DestroyInitOutput( InitOutData, ErrStat, ErrMsg ) !............................................................................................................................... @@ -94,7 +94,7 @@ PROGRAM DirtDyn_Driver ! Calculate outputs at n - CALL DirtDyn_CalcOutput( Time, u(1), p, x, xd, z, OtherState, y, misc, ErrStat, ErrMsg ) + CALL SoilDyn_CalcOutput( Time, u(1), p, x, xd, z, OtherState, y, misc, ErrStat, ErrMsg ) IF ( ErrStat /= ErrID_None ) THEN ! Check if there was an error and do something about it if necessary CALL WrScr( 'After CalcOutput: '//ErrMsg ) if ( ErrStat >= AbortErrLev ) call ProgEnd() @@ -102,7 +102,7 @@ PROGRAM DirtDyn_Driver ! Get state variables at next step: INPUT at step n, OUTPUT at step n + 1 - CALL DirtDyn_UpdateStates( Time, n, u, InputTime, p, x, xd, z, OtherState, misc, ErrStat, ErrMsg ) + CALL SoilDyn_UpdateStates( Time, n, u, InputTime, p, x, xd, z, OtherState, misc, ErrStat, ErrMsg ) IF ( ErrStat /= ErrID_None ) THEN ! Check if there was an error and do something about it if necessary CALL WrScr( ErrMsg ) if ( ErrStat >= AbortErrLev ) call ProgEnd() @@ -113,7 +113,7 @@ PROGRAM DirtDyn_Driver !............................................................................................................................... ! Routine to terminate program execution !............................................................................................................................... - CALL DirtDyn_End( u(1), p, x, xd, z, OtherState, y, misc, ErrStat, ErrMsg ) + CALL SoilDyn_End( u(1), p, x, xd, z, OtherState, y, misc, ErrStat, ErrMsg ) IF ( ErrStat /= ErrID_None ) THEN CALL WrScr( 'After End: '//ErrMsg ) @@ -124,4 +124,4 @@ subroutine ProgEnd() ! Placeholder for moment Call ProgAbort('Fatal error encountered. Ending.') end subroutine ProgEnd -END PROGRAM DirtDyn_Driver +END PROGRAM SoilDyn_Driver diff --git a/vs-build/DirtDyn/DirtDyn-w-registry.sln b/vs-build/SoilDyn/SoilDyn-w-registry.sln similarity index 96% rename from vs-build/DirtDyn/DirtDyn-w-registry.sln rename to vs-build/SoilDyn/SoilDyn-w-registry.sln index a596a4399..5c250ba83 100644 --- a/vs-build/DirtDyn/DirtDyn-w-registry.sln +++ b/vs-build/SoilDyn/SoilDyn-w-registry.sln @@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2013 VisualStudioVersion = 12.0.40629.0 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "DirtDyn", "DirtDyn.vfproj", "{815C302F-A93D-4C22-9329-7112345113C0}" +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "SoilDyn", "SoilDyn.vfproj", "{815C302F-A93D-4C22-9329-7112345113C0}" ProjectSection(ProjectDependencies) = postProject {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16} = {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16} EndProjectSection diff --git a/vs-build/DirtDyn/DirtDyn.vfproj b/vs-build/SoilDyn/SoilDyn.vfproj similarity index 94% rename from vs-build/DirtDyn/DirtDyn.vfproj rename to vs-build/SoilDyn/SoilDyn.vfproj index ca77dd4b6..194a804eb 100644 --- a/vs-build/DirtDyn/DirtDyn.vfproj +++ b/vs-build/SoilDyn/SoilDyn.vfproj @@ -88,33 +88,33 @@ - + - + - + - + - + - + - + - + - + - + - - - - + + + + From e5b1ea6d5777c8862d7d44e669476969e1d710ec Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 5 Feb 2020 16:15:17 -0700 Subject: [PATCH 012/136] SoilDyn: add skeleton IO module --- modules/soildyn/CMakeLists.txt | 1 + modules/soildyn/src/SoilDyn.f90 | 1 + modules/soildyn/src/SoilDyn_IO.f90 | 1102 ++++++++++++++++++++++ modules/soildyn/src/SoilDyn_Registry.txt | 11 +- modules/soildyn/src/SoilDyn_Types.f90 | 74 ++ 5 files changed, 1185 insertions(+), 4 deletions(-) create mode 100644 modules/soildyn/src/SoilDyn_IO.f90 diff --git a/modules/soildyn/CMakeLists.txt b/modules/soildyn/CMakeLists.txt index 149040f04..97a94f693 100644 --- a/modules/soildyn/CMakeLists.txt +++ b/modules/soildyn/CMakeLists.txt @@ -21,6 +21,7 @@ endif() set(SlD_SOURCES src/REDWINinterface.f90 src/SoilDyn.f90 + src/SoilDyn_IO.f90 src/SoilDyn_Types.f90 ) diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index 16e5f938b..f3a81c770 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -29,6 +29,7 @@ MODULE SoilDyn USE SoilDyn_Types + USE SoilDyn_IO USE NWTC_Library USE REDWINinterface diff --git a/modules/soildyn/src/SoilDyn_IO.f90 b/modules/soildyn/src/SoilDyn_IO.f90 new file mode 100644 index 000000000..b955c2bfb --- /dev/null +++ b/modules/soildyn/src/SoilDyn_IO.f90 @@ -0,0 +1,1102 @@ +!********************************************************************************************************************************** +! LICENSING +! Copyright (C) 2020 National Renewable Energy Laboratory +! +! This file is part of SoilDyn. +! +! Licensed under the Apache License, Version 2.0 (the "License"); +! you may not use this file except in compliance with the License. +! You may obtain a copy of the License at +! +! http://www.apache.org/licenses/LICENSE-2.0 +! +! Unless required by applicable law or agreed to in writing, software +! distributed under the License is distributed on an "AS IS" BASIS, +! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +! See the License for the specific language governing permissions and +! limitations under the License. +! +!********************************************************************************************************************************** +MODULE SoilDyn_IO + + USE SoilDyn_Types + USE NWTC_Library + + IMPLICIT NONE + + +!FIXME: add the matlab generated output stuff here. +! =================================================================================================== +! NOTE: The following lines of code were generated by a Matlab script called "Write_ChckOutLst.m" +! using the parameters listed in the "OutListParameters.xlsx" Excel file. Any changes to these +! lines should be modified in the Matlab script and/or Excel worksheet as necessary. +! =================================================================================================== +! This code was generated by Write_ChckOutLst.m at 23-Apr-2015 13:13:13. + + + ! Parameters related to output length (number of characters allowed in the output data headers): + + INTEGER(IntKi), PARAMETER :: OutStrLenM1 = ChanLen - 1 + + + ! Indices for computing output channels: + ! NOTES: + ! (1) These parameters are in the order stored in "OutListParameters.xlsx" + ! (2) Array y%AllOuts() must be dimensioned to the value of the largest output parameter + + ! Time: + + INTEGER(IntKi), PARAMETER :: Time = 0 + + ! The maximum number of output channels which can be output by the code. + INTEGER(IntKi), PARAMETER :: MaxOutPts = 1 + + + +! INTEGER(IntKi), PARAMETER :: WindMeas(5) = (/ WindMeas1, WindMeas2, WindMeas3, WindMeas4, WindMeas5 /) ! Array of output constants +! INTEGER(IntKi), PARAMETER :: WindVelX(9) = (/ Wind1VelX, Wind2VelX, Wind3VelX, Wind4VelX, Wind5VelX, Wind6VelX, Wind7VelX, Wind8VelX, Wind9VelX /) ! Array of output constants +! INTEGER(IntKi), PARAMETER :: WindVelY(9) = (/ Wind1VelY, Wind2VelY, Wind3VelY, Wind4VelY, Wind5VelY, Wind6VelY, Wind7VelY, Wind8VelY, Wind9VelY /) ! Array of output constants +! INTEGER(IntKi), PARAMETER :: WindVelZ(9) = (/ Wind1VelZ, Wind2VelZ, Wind3VelZ, Wind4VelZ, Wind5VelZ, Wind6VelZ, Wind7VelZ, Wind8VelZ, Wind9VelZ /) ! Array of output constants + + +! =================================================================================================== + +CONTAINS + + +!==================================================================================================== +!> This public subroutine reads the input required for SoilDyn from the file whose name is an +!! input parameter. +SUBROUTINE SoilDyn_ReadInput( InputFileName, EchoFileName, InputFileData, ErrStat, ErrMsg ) +!---------------------------------------------------------------------------------------------------- + + IMPLICIT NONE + + CHARACTER(*), PARAMETER :: RoutineName="SoilDyn_ReadInput" + + + ! Passed variables + CHARACTER(*), INTENT(IN ) :: InputFileName !< name of the input file + CHARACTER(*), INTENT(IN ) :: EchoFileName !< name of the echo file + TYPE(SlD_InputFile), INTENT(INOUT) :: InputFileData !< The data for initialization + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Returned error status from this subroutine + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Returned error message from this subroutine + + + ! Local variables + INTEGER(IntKi) :: UnitInput !< Unit number for the input file + INTEGER(IntKi) :: UnitEcho !< The local unit number for this module's echo file + CHARACTER(1024) :: TmpPath !< Temporary storage for relative path name + CHARACTER(1024) :: TmpFmt !< Temporary storage for format statement + CHARACTER(35) :: Frmt !< Output format for logical parameters. (matches NWTC Subroutine Library format) + + + ! Temoporary messages + INTEGER(IntKi) :: TmpErrStat + CHARACTER(ErrMsgLen) :: TmpErrMsg + CHARACTER(1024) :: PriPath ! Path name of the primary file + + + ! Initialize local data + + UnitEcho = -1 + Frmt = "( 2X, L11, 2X, A, T30, ' - ', A )" + ErrStat = ErrID_None + ErrMsg = "" + InputFileData%EchoFlag = .FALSE. ! initialize for error handling (cleanup() routine) + CALL GetPath( InputFileName, PriPath ) ! Input files will be relative to the path where the primary input file is located. + + + ! allocate the array for the OutList + CALL AllocAry( InputFileData%OutList, MaxOutPts, "SoilDyn Input File's OutList", TmpErrStat, TmpErrMsg ) + CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) + IF (ErrStat >= AbortErrLev) THEN + CALL Cleanup() + RETURN + END IF + + + !------------------------------------------------------------------------------------------------- + ! Open the file + !------------------------------------------------------------------------------------------------- + + CALL GetNewUnit( UnitInput, TmpErrStat, TmpErrMsg ) + CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) + + CALL OpenFInpFile( UnitInput, TRIM(InputFileName), TmpErrStat, TmpErrMsg ) + CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) + IF (ErrStat >= AbortErrLev) THEN + CALL Cleanup() + RETURN + END IF + + + + !------------------------------------------------------------------------------------------------- + ! File header + !------------------------------------------------------------------------------------------------- + + CALL ReadCom( UnitInput, InputFileName, 'SoilDyn input file header line 1', TmpErrStat, TmpErrMsg ) + CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) + IF (ErrStat >= AbortErrLev) THEN + CALL Cleanup() + RETURN + END IF + + CALL ReadCom( UnitInput, InputFileName, 'SoilDyn input file header line 2', TmpErrStat, TmpErrMsg ) + CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) + IF (ErrStat >= AbortErrLev) THEN + CALL Cleanup() + RETURN + END IF + + CALL ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line', TmpErrStat, TmpErrMsg ) + CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) + IF (ErrStat >= AbortErrLev) THEN + CALL Cleanup() + RETURN + END IF + + + ! Echo Input Files. + + CALL ReadVar ( UnitInput, InputFileName, InputFileData%EchoFlag, 'Echo', 'Echo Input', TmpErrStat, TmpErrMsg ) + CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) + IF (ErrStat >= AbortErrLev) THEN + CALL Cleanup() + RETURN + END IF + + ! If we are Echoing the input then we should re-read the first three lines so that we can echo them + ! using the NWTC_Library routines. The echoing is done inside those routines via a global variable + ! which we must store, set, and then replace on error or completion. + + IF ( InputFileData%EchoFlag ) THEN + + CALL OpenEcho ( UnitEcho, TRIM(EchoFileName), TmpErrStat, TmpErrMsg ) + CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) + IF (ErrStat >= AbortErrLev) THEN + CALL CleanUp() + RETURN + END IF + + REWIND(UnitInput) + + + ! The input file was already successfully read through up to this point, so we shouldn't have any read + ! errors in the first four lines. So, we won't worry about checking the error status here. + + CALL ReadCom( UnitInput, InputFileName, 'SoilDyn input file header line 1', TmpErrStat, TmpErrMsg, UnitEcho ) + CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) + + CALL ReadCom( UnitInput, InputFileName, 'SoilDyn input file header line 2', TmpErrStat, TmpErrMsg, UnitEcho ) + CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) + + CALL ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line', TmpErrStat, TmpErrMsg, UnitEcho ) + CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) + + ! Echo Input Files. + + CALL ReadVar ( UnitInput, InputFileName, InputFileData%EchoFlag, 'Echo', 'Echo the input file data', TmpErrStat, TmpErrMsg, UnitEcho ) + CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) + + END IF + + + +!!! !------------------------------------------------------------------------------------------------- +!!! !> Read general section with wind type, direction, and output point list (applies to all wind types) +!!! !------------------------------------------------------------------------------------------------- +!!! +!!! +!!! ! Read WindType +!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%WindType, 'WindType', & +!!! 'switch for wind file type (1=steady; 2=uniform; 3=binary TurbSim FF; '//& +!!! '4=binary Bladed-style FF; 5=HAWC format; 6=User defined)', & +!!! TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL CleanUp() +!!! RETURN +!!! ENDIF +!!! +!!! +!!! ! Read PropagationDir +!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%PropagationDir, 'PropagationDir', & +!!! 'Direction of wind propagation (meteoroligical direction)', TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL CleanUp() +!!! RETURN +!!! ENDIF +!!! +!!! +!!! ! Read the number of points for the wind velocity output +!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%NWindVel, 'NWindVel', & +!!! 'Number of points to output the wind velocity (0 to 9)', & +!!! TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL CleanUp() +!!! RETURN +!!! ENDIF +!!! +!!! ! Before proceeding, make sure that NWindVel makes sense +!!! IF ( InputFileData%NWindVel < 0 .OR. InputFileData%NwindVel > 9 ) THEN +!!! CALL SetErrStat( ErrID_Fatal, 'NWindVel must be greater than or equal to zero and less than 10.', & +!!! ErrStat, ErrMsg, RoutineName ) +!!! CALL CleanUp() +!!! RETURN +!!! ELSE +!!! +!!! ! Allocate space for the output location arrays: +!!! CALL AllocAry( InputFileData%WindVxiList, InputFileData%NWindVel, 'WindVxiList', TmpErrStat, TmpErrMsg ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) +!!! CALL AllocAry( InputFileData%WindVyiList, InputFileData%NWindVel, 'WindVyiList', TmpErrStat, TmpErrMsg ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) +!!! CALL AllocAry( InputFileData%WindVziList, InputFileData%NWindVel, 'WindVziList', TmpErrStat, TmpErrMsg ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL CleanUp() +!!! RETURN +!!! ENDIF +!!! ENDIF +!!! +!!! ! Read in the values of WindVxiList +!!! CALL ReadAry( UnitInput, InputFileName, InputFileData%WindVxiList, InputFileData%NWindVel, 'WindVxiList', & +!!! 'List of coordinates in the inertial X direction (m)', TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL CleanUp() +!!! RETURN +!!! ENDIF +!!! +!!! ! Read in the values of WindVxiList +!!! CALL ReadAry( UnitInput, InputFileName, InputFileData%WindVyiList, InputFileData%NWindVel, 'WindVyiList', & +!!! 'List of coordinates in the inertial Y direction (m)', TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL CleanUp() +!!! RETURN +!!! ENDIF +!!! +!!! ! Read in the values of WindVziList +!!! CALL ReadAry( UnitInput, InputFileName, InputFileData%WindVziList, InputFileData%NWindVel, 'WindVziList', & +!!! 'List of coordinates in the inertial Z direction (m)', TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL CleanUp() +!!! RETURN +!!! ENDIF +!!! +!!! +!!! !------------------------------------------------------------------------------------------------- +!!! !> Read the _Parameters for Steady Wind Conditions [used only for WindType = 1]_ section +!!! !------------------------------------------------------------------------------------------------- +!!! +!!! ! Section separator line +!!! CALL ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line', TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL Cleanup() +!!! RETURN +!!! END IF +!!! +!!! +!!! ! Read HWindSpeed +!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%Steady_HWindSpeed, 'HWindSpeed', & +!!! 'Horizontal windspeed for steady wind', TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL CleanUp() +!!! RETURN +!!! ENDIF +!!! +!!! ! Read RefHt +!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%Steady_RefHt, 'RefHt', & +!!! 'Reference height for horizontal wind speed for steady wind', TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL CleanUp() +!!! RETURN +!!! ENDIF +!!! +!!! ! Read PLexp +!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%Steady_PLexp, 'PLexp', & +!!! 'Power law exponent for steady wind', TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL CleanUp() +!!! RETURN +!!! ENDIF +!!! +!!! +!!! !------------------------------------------------------------------------------------------------- +!!! !> Read the _Parameters for Uniform wind file [used only for WindType = 2]_ section +!!! !------------------------------------------------------------------------------------------------- +!!! +!!! ! Section separator line +!!! CALL ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line', TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL Cleanup() +!!! RETURN +!!! END IF +!!! +!!! ! Read UniformWindFile +!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%Uniform_FileName, 'WindFileName', & +!!! 'Filename of time series data for uniform wind field', TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL CleanUp() +!!! RETURN +!!! ENDIF +!!! IF ( PathIsRelative( InputFileData%Uniform_FileName ) ) InputFileData%Uniform_FileName = TRIM(PriPath)//TRIM(InputFileData%Uniform_FileName) +!!! +!!! ! Read RefHt +!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%Uniform_RefHt, 'RefHt', & +!!! 'Reference height for uniform wind file', TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL CleanUp() +!!! RETURN +!!! ENDIF +!!! +!!! ! Read RefLength +!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%Uniform_RefLength, 'RefLength', & +!!! 'Reference length for uniform wind file', TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL CleanUp() +!!! RETURN +!!! ENDIF +!!! +!!! +!!! !------------------------------------------------------------------------------------------------- +!!! !> Read the _Parameters for Binary TurbSim Full-Field files [used only for WindType = 3]_ section +!!! !------------------------------------------------------------------------------------------------- +!!! +!!! ! Section separator line +!!! CALL ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line', TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL Cleanup() +!!! RETURN +!!! END IF +!!! +!!! ! Read TSFFWind info +!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%TSFF_FileName, 'FileName', & +!!! 'Name of the TurbSim full field wind file to use (.bts)', TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL CleanUp() +!!! RETURN +!!! ENDIF +!!! IF ( PathIsRelative( InputFileData%TSFF_FileName ) ) InputFileData%TSFF_FileName = TRIM(PriPath)//TRIM(InputFileData%TSFF_FileName) +!!! +!!! +!!! !------------------------------------------------------------------------------------------------- +!!! !> Read the _Parameters for Binary Bladed-style Full-Field files [used only for WindType = 4]_ section +!!! !------------------------------------------------------------------------------------------------- +!!! +!!! ! Section separator line +!!! CALL ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line', TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL Cleanup() +!!! RETURN +!!! END IF +!!! +!!! ! Read BladedStyle%WindFileName +!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%BladedFF_FileName, 'FileName', & +!!! 'Rootname of the full-field wind file to use (.wnd, .sum)', TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL CleanUp() +!!! RETURN +!!! ENDIF +!!! IF ( PathIsRelative( InputFileData%BladedFF_FileName ) ) InputFileData%BladedFF_FileName = TRIM(PriPath)//TRIM(InputFileData%BladedFF_FileName) +!!! InputFileData%BladedFF_FileName = TRIM(InputFileData%BladedFF_FileName)//'.wnd' +!!! +!!! ! Read TowerFileFlag +!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%BladedFF_TowerFile, 'TowerFileFlag', & +!!! 'Have tower file (.twr) [flag]', TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL CleanUp() +!!! RETURN +!!! ENDIF +!!! +!!!#ifdef UNUSED_INPUTFILE_LINES +!!! +!!! !------------------------------------------------------------------------------------------------- +!!! !> Read the _Parameters for coherent turbulence [used only for WindType = 3 or 4]_ section +!!! !------------------------------------------------------------------------------------------------- +!!! +!!! ! Section separator line +!!! CALL ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line', TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL Cleanup() +!!! RETURN +!!! END IF +!!! +!!! ! Read CTTS_Flag +!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%CTTS_CoherentTurb, 'CTTS_CoherentTurbFlag', & +!!! 'Flag to coherent turbulence', TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL CleanUp() +!!! RETURN +!!! ENDIF +!!! +!!! ! Read CTWind%WindFileName +!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%CTTS_FileName, 'CTTS_FileName', & +!!! 'Name of coherent turbulence file', TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL CleanUp() +!!! RETURN +!!! ENDIF +!!! IF ( PathIsRelative( InputFileData%CTTS_FileName ) ) InputFileData%CTTS_FileName = TRIM(PriPath)//TRIM(InputFileData%CTTS_FileName) +!!! +!!! ! Read CTWind%PathName +!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%CTTS_Path, 'CTTS_Path', & +!!! 'Path to coherent turbulence binary files', TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL CleanUp() +!!! RETURN +!!! ENDIF +!!! IF ( PathIsRelative( InputFileData%CTTS_Path ) ) InputFileData%CTTS_Path = TRIM(PriPath)//TRIM(InputFileData%CTTS_Path) +!!! +!!!#else +!!! InputFileData%CTTS_CoherentTurb = .FALSE. +!!!#endif +!!! +!!! !------------------------------------------------------------------------------------------------- +!!! !> Read the _Parameters for HAWC-formatted binary files [used only for WindType = 5]_ section +!!! !------------------------------------------------------------------------------------------------- +!!! +!!! ! Section separator line +!!! CALL ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line', TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL Cleanup() +!!! RETURN +!!! END IF +!!! +!!! ! Read HAWC_FileName_u +!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%HAWC_FileName_u, 'HAWC_FileName_u', & +!!! 'Name of the file containing the u-component fluctuating wind', TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL Cleanup() +!!! RETURN +!!! END IF +!!! IF ( PathIsRelative( InputFileData%HAWC_FileName_u ) ) InputFileData%HAWC_FileName_u = TRIM(PriPath)//TRIM(InputFileData%HAWC_FileName_u) +!!! +!!! ! Read HAWC_FileName_v +!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%HAWC_FileName_v, 'HAWC_FileName_v', & +!!! 'Name of the file containing the v-component fluctuating wind', TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL Cleanup() +!!! RETURN +!!! END IF +!!! IF ( PathIsRelative( InputFileData%HAWC_FileName_v ) ) InputFileData%HAWC_FileName_v = TRIM(PriPath)//TRIM(InputFileData%HAWC_FileName_v) +!!! +!!! ! Read HAWC_FileName_w +!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%HAWC_FileName_w, 'HAWC_FileName_w', & +!!! 'Name of the file containing the w-component fluctuating wind', TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL Cleanup() +!!! RETURN +!!! END IF +!!! IF ( PathIsRelative( InputFileData%HAWC_FileName_w ) ) InputFileData%HAWC_FileName_w = TRIM(PriPath)//TRIM(InputFileData%HAWC_FileName_w) +!!! +!!! ! Read HAWC_nx +!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%HAWC_nx, 'HAWC_nx', & +!!! 'Number of grids in the x direction (in the 3 files above)', TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL Cleanup() +!!! RETURN +!!! END IF +!!! +!!! ! Read HAWC_ny +!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%HAWC_ny, 'HAWC_ny', & +!!! 'Number of grids in the y direction (in the 3 files above)', TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL Cleanup() +!!! RETURN +!!! END IF +!!! +!!! ! Read HAWC_nz +!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%HAWC_nz, 'HAWC_nz', & +!!! 'Number of grids in the z direction (in the 3 files above)', TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL Cleanup() +!!! RETURN +!!! END IF +!!! +!!! ! Read HAWC_dx +!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%HAWC_dx, 'HAWC_dx', & +!!! 'Number of grids in the x direction (in the 3 files above)', TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL Cleanup() +!!! RETURN +!!! END IF +!!! +!!! ! Read HAWC_dy +!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%HAWC_dy, 'HAWC_dy', & +!!! 'Number of grids in the y direction (in the 3 files above)', TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL Cleanup() +!!! RETURN +!!! END IF +!!! +!!! ! Read HAWC_dz +!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%HAWC_dz, 'HAWC_dz', & +!!! 'Number of grids in the z direction (in the 3 files above)', TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL Cleanup() +!!! RETURN +!!! END IF +!!! +!!! ! Read HAWC_RefHt +!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%HAWC_RefHt, 'HAWC_RefHt', & +!!! 'Reference (hub) height of the grid', TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL Cleanup() +!!! RETURN +!!! END IF +!!! +!!! +!!! +!!! !---------------------------------------------------------------------------------------------- +!!! !> Read the _Scaling parameters for turbulence (HAWC-format files) [used only for WindType = 5]_ subsection +!!! !---------------------------------------------------------------------------------------------- +!!! +!!! ! Section separator line +!!! CALL ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line', TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL Cleanup() +!!! RETURN +!!! END IF +!!! +!!! ! Read HAWC_ScaleMethod +!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%HAWC_ScaleMethod, 'HAWC_ScaleMethod', & +!!! 'Turbulence scaling method [0=none, 1=direct scaling, 2= calculate scaling '// & +!!! 'factor based on a desired standard deviation]', TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL Cleanup() +!!! RETURN +!!! END IF +!!! +!!! ! Read HAWC_SFx +!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%HAWC_SFx, 'HAWC_SFx', & +!!! 'Turbulence scaling factor for the x direction [ScaleMethod=1]', TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL Cleanup() +!!! RETURN +!!! END IF +!!! +!!! ! Read HAWC_SFy +!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%HAWC_SFy, 'HAWC_SFy', & +!!! 'Turbulence scaling factor for the y direction [ScaleMethod=1]', TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL Cleanup() +!!! RETURN +!!! END IF +!!! +!!! ! Read HAWC_SFz +!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%HAWC_SFz, 'HAWC_SFz', & +!!! 'Turbulence scaling factor for the z direction [ScaleMethod=1]', TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL Cleanup() +!!! RETURN +!!! END IF +!!! +!!! ! Read HAWC_SigmaFx +!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%HAWC_SigmaFx, 'HAWC_SigmaFx', & +!!! 'Turbulence standard deviation to calculate scaling from in x direction [ScaleMethod=2]', TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL Cleanup() +!!! RETURN +!!! END IF +!!! +!!! ! Read HAWC_SigmaFy +!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%HAWC_SigmaFy, 'HAWC_SigmaFy', & +!!! 'Turbulence standard deviation to calculate scaling from in y direction [ScaleMethod=2]', TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL Cleanup() +!!! RETURN +!!! END IF +!!! +!!! ! Read HAWC_SigmaFz +!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%HAWC_SigmaFz, 'HAWC_SigmaFz', & +!!! 'Turbulence standard deviation to calculate scaling from in z direction [ScaleMethod=2]', TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL Cleanup() +!!! RETURN +!!! END IF +!!! +!!!#ifdef UNUSED_INPUTFILE_LINES +!!! +!!!!FIXME: TStart has no comment +!!! ! Read HAWC_TStart +!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%HAWC_TStart, 'HAWC_TStart', & +!!! '', TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL Cleanup() +!!! RETURN +!!! END IF +!!! +!!!!FIXME: TEnd has no comment +!!! ! Read HAWC_TEnd +!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%HAWC_TEnd, 'HAWC_TEnd', & +!!! '', TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL Cleanup() +!!! RETURN +!!! END IF +!!! +!!!#endif +!!! +!!! !---------------------------------------------------------------------------------------------- +!!! !> Read the _Mean wind profile paramters (added to HAWC-format files) [used only for WindType = 5]_ subsection +!!! !---------------------------------------------------------------------------------------------- +!!! +!!! ! Section separator line +!!! CALL ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line', TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL Cleanup() +!!! RETURN +!!! END IF +!!! +!!! ! Read HAWC_URef +!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%HAWC_URef, 'HAWC_URef', & +!!! 'Mean u-component wind speed at the reference height', TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL Cleanup() +!!! RETURN +!!! END IF +!!! +!!! ! Read HAWC_ProfileType +!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%HAWC_ProfileType, 'HAWC_ProfileType', & +!!! 'Wind profile type (0=constant;1=logarithmic;2=power law)', TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL Cleanup() +!!! RETURN +!!! END IF +!!! +!!! ! Read HAWC_PLExp +!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%HAWC_PLExp, 'HAWC_PLExp', & +!!! 'Power law exponent (used for PL wind profile type only)', TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL Cleanup() +!!! RETURN +!!! END IF +!!! +!!! ! Read HAWC_Z0 +!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%HAWC_Z0, 'HAWC_Z0', & +!!! 'Surface roughness length (used for LOG wind profile type only)', TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL Cleanup() +!!! RETURN +!!! END IF +!!! +!!! +!!! !---------------------- OUTPUT -------------------------------------------------- +!!! CALL ReadCom( UnitInput, InputFileName, 'Section Header: Output', TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL Cleanup() +!!! RETURN +!!! END IF +!!! +!!! ! SumPrint - Print summary data to .IfW.sum (flag): +!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%SumPrint, "SumPrint", "Print summary data to .IfW.sum (flag)", TmpErrStat, TmpErrMsg, UnitEcho) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL Cleanup() +!!! RETURN +!!! END IF +!!! +!!! +!!! !---------------------- OUTLIST -------------------------------------------- +!!! CALL ReadCom( UnitInput, InputFileName, 'Section Header: OutList', TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL Cleanup() +!!! RETURN +!!! END IF +!!! +!!! ! OutList - List of user-requested output channels (-): -- uses routine from the NWTC_Library +!!! CALL ReadOutputList ( UnitInput, InputFileName, InputFileData%OutList, InputFileData%NumOuts, 'OutList', & +!!! "List of user-requested output channels", TmpErrStat, TmpErrMsg, UnitEcho ) +!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) +!!! IF (ErrStat >= AbortErrLev) THEN +!!! CALL Cleanup() +!!! RETURN +!!! END IF +!!! + + + + !------------------------------------------------------------------------------------------------- + ! This is the end of the input file + !------------------------------------------------------------------------------------------------- + + CALL Cleanup() + RETURN + + CONTAINS + !.............................. + SUBROUTINE Cleanup() + ! Close input file + CLOSE ( UnitInput ) + ! Cleanup the Echo file and global variables + IF ( InputFileData%EchoFlag ) THEN + CLOSE(UnitEcho) + END IF + END SUBROUTINE Cleanup + +END SUBROUTINE SoilDyn_ReadInput + + +!==================================================================================================== +!> This private subroutine verifies the input required for SoilDyn is correctly specified. This +!! routine checkes all the parameters that are common with all the wind types, then calls subroutines +!! that check the parameters specific to each wind type. Only the parameters corresponding to the +!! desired wind type are evaluated; the rest are ignored. Additional checks will be performed after +!! the respective wind file has been read in, but these checks will be performed within the respective +!! wind module. +! +! The reason for structuring it this way is to allow for relocating the validation routines for the +! wind type into their respective modules. It might also prove useful later if we change languages +! but retain the fortran wind modules. +SUBROUTINE SoilDyn_ValidateInput( InitInp, InputFileData, ErrStat, ErrMsg ) + TYPE(SlD_InitInputType), INTENT(IN ) :: InitInp !< Input data for initialization + TYPE(SlD_InputFile), INTENT(INOUT) :: InputFileData !< The data for initialization + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status from this subroutine + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message from this subroutine + INTEGER(IntKi) :: TmpErrStat !< Temporary error status for subroutine and function calls + CHARACTER(ErrMsgLen) :: TmpErrMsg !< Temporary error message for subroutine and function calls + INTEGER(IntKi) :: I !< Generic counter + CHARACTER(*), PARAMETER :: RoutineName="SoilDyn_ValidateInput" + + ! Initialize ErrStat + ErrStat = ErrID_None + ErrMsg = "" + +CONTAINS + subroutine ValidateStiffnessMatrix() + ! Placeholder + end subroutine ValidateStiffnessMatrix + + subroutine ValidatePYcurves() + ! Placeholder + end subroutine ValidatePYcurves + + subroutine ValidateDLL() + ! Placeholder + end subroutine ValidateDLL + +END SUBROUTINE SoilDyn_ValidateInput + + +!==================================================================================================== +!> This private subroutine copies the info from the input file over to the parameters for SoilDyn. +SUBROUTINE SoilDyn_SetParameters( InitInp, InputFileData, p, m, ErrStat, ErrMsg ) + TYPE(Sld_InitInputType), INTENT(IN ) :: InitInp !< Input data for initialization + TYPE(Sld_InputFile), INTENT(INOUT) :: InputFileData !< The data for initialization + TYPE(Sld_ParameterType), INTENT(INOUT) :: p !< The parameters for SoilDyn + TYPE(Sld_MiscVarType), INTENT(INOUT) :: m !< The misc/optimization variables for SoilDyn + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status from this subroutine + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message from this subroutine + INTEGER(IntKi) :: TmpErrStat !< Temporary error status for subroutine and function calls + CHARACTER(ErrMsgLen) :: TmpErrMsg !< Temporary error message for subroutine and function calls + INTEGER(IntKi) :: I !< Generic counter + CHARACTER(*), PARAMETER :: RoutineName="SoilDyn_SetParameters" + + ! Initialize ErrStat + ErrStat = ErrID_None + ErrMsg = "" + +END SUBROUTINE SoilDyn_SetParameters + + + +!********************************************************************************************************************************** +! NOTE: The following lines of code were generated by a Matlab script called "Write_ChckOutLst.m" +! using the parameters listed in the "OutListParameters.xlsx" Excel file. Any changes to these +! lines should be modified in the Matlab script and/or Excel worksheet as necessary. +! This code was generated by Write_ChckOutLst.m at 23-Apr-2015 13:13:13. +!---------------------------------------------------------------------------------------------------------------------------------- +SUBROUTINE SetOutParam(OutList, p, ErrStat, ErrMsg ) +! This routine checks to see if any requested output channel names (stored in the OutList(:)) are invalid. It returns a +! warning if any of the channels are not available outputs from the module. +! It assigns the settings for OutParam(:) (i.e, the index, name, and units of the output channels, WriteOutput(:)). +! the sign is set to 0 if the channel is invalid. +! It sets assumes the value p%NumOuts has been set before this routine has been called, and it sets the values of p%OutParam here. +!.................................................................................................................................. + + IMPLICIT NONE + + ! Passed variables + + CHARACTER(ChanLen), INTENT(IN) :: OutList(:) !< The list out user-requested outputs + TYPE(Sld_ParameterType), INTENT(INOUT) :: p !< The module parameters + INTEGER(IntKi), INTENT(OUT) :: ErrStat !< The error status code + CHARACTER(*), INTENT(OUT) :: ErrMsg !< The error message, if an error occurred + + ! Local variables + + INTEGER :: ErrStat2 ! temporary (local) error status + INTEGER :: I ! Generic loop-counting index + INTEGER :: J ! Generic loop-counting index + INTEGER :: INDX ! Index for valid arrays + + LOGICAL :: CheckOutListAgain ! Flag used to determine if output parameter starting with "M" is valid (or the negative of another parameter) + LOGICAL :: InvalidOutput(0:MaxOutPts) ! This array determines if the output channel is valid for this configuration + CHARACTER(ChanLen) :: OutListTmp ! A string to temporarily hold OutList(I) + CHARACTER(*), PARAMETER :: RoutineName = "SetOutParam" + +!!! CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry(32) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically +!!! "WIND1VELX","WIND1VELY","WIND1VELZ","WIND2VELX","WIND2VELY","WIND2VELZ","WIND3VELX", & +!!! "WIND3VELY","WIND3VELZ","WIND4VELX","WIND4VELY","WIND4VELZ","WIND5VELX","WIND5VELY", & +!!! "WIND5VELZ","WIND6VELX","WIND6VELY","WIND6VELZ","WIND7VELX","WIND7VELY","WIND7VELZ", & +!!! "WIND8VELX","WIND8VELY","WIND8VELZ","WIND9VELX","WIND9VELY","WIND9VELZ","WINDMEAS1", & +!!! "WINDMEAS2","WINDMEAS3","WINDMEAS4","WINDMEAS5"/) +!!! INTEGER(IntKi), PARAMETER :: ParamIndxAry(32) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) +!!! Wind1VelX , Wind1VelY , Wind1VelZ , Wind2VelX , Wind2VelY , Wind2VelZ , Wind3VelX , & +!!! Wind3VelY , Wind3VelZ , Wind4VelX , Wind4VelY , Wind4VelZ , Wind5VelX , Wind5VelY , & +!!! Wind5VelZ , Wind6VelX , Wind6VelY , Wind6VelZ , Wind7VelX , Wind7VelY , Wind7VelZ , & +!!! Wind8VelX , Wind8VelY , Wind8VelZ , Wind9VelX , Wind9VelY , Wind9VelZ , WindMeas1 , & +!!! WindMeas2 , WindMeas3 , WindMeas4 , WindMeas5 /) +!!! CHARACTER(ChanLen), PARAMETER :: ParamUnitsAry(32) = (/ & ! This lists the units corresponding to the allowed parameters +!!! "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & +!!! "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & +!!! "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & +!!! "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & +!!! "(m/s) ","(m/s) ","(m/s) ","(m/s) "/) +!!! +!!! +!!! ! Initialize values +!!! ErrStat = ErrID_None +!!! ErrMsg = "" +!!! InvalidOutput = .FALSE. +!!! +!!! +!!!! ..... Developer must add checking for invalid inputs here: ..... +!!! ! NOTE: we are not checking that the coordinates input for the WindVxi, WindVyi, and WindVzi are valid here. We are +!!! ! checking that at the input file validation (they simply get zeroed with a warning if there is an issue). +!!! +!!! ! make sure we don't ask for outputs that don't exist: +!!! DO I = p%NWindVel+1, 9 +!!! InvalidOutput( WindVelX(I) ) = .TRUE. +!!! InvalidOutput( WindVelY(I) ) = .TRUE. +!!! InvalidOutput( WindVelZ(I) ) = .TRUE. +!!! END DO +!!! +!!! DO I=p%lidar%NumPulseGate+1,5 +!!! InvalidOutput( WindMeas(I) ) = .TRUE. +!!! END DO +!!! +!!!! ................. End of validity checking ................. +!!! +!!! +!!! !------------------------------------------------------------------------------------------------- +!!! ! Allocate and set index, name, and units for the output channels +!!! ! If a selected output channel is not available in this module, set error flag. +!!! !------------------------------------------------------------------------------------------------- +!!! +!!! ALLOCATE ( p%OutParam(0:p%NumOuts) , STAT=ErrStat2 ) +!!! IF ( ErrStat2 /= 0_IntKi ) THEN +!!! CALL SetErrStat( ErrID_Fatal,"Error allocating memory for the SoilDyn OutParam array.", ErrStat, ErrMsg, RoutineName ) +!!! RETURN +!!! ENDIF +!!! +!!! ! Set index, name, and units for the time output channel: +!!! +!!! p%OutParam(0)%Indx = Time +!!! p%OutParam(0)%Name = "Time" ! OutParam(0) is the time channel by default. +!!! p%OutParam(0)%Units = "(s)" +!!! p%OutParam(0)%SignM = 1 +!!! +!!! +!!! ! Set index, name, and units for all of the output channels. +!!! ! If a selected output channel is not available by this module set ErrStat = ErrID_Warn. +!!! +!!! DO I = 1,p%NumOuts +!!! +!!! p%OutParam(I)%Name = OutList(I) +!!! OutListTmp = OutList(I) +!!! +!!! ! Reverse the sign (+/-) of the output channel if the user prefixed the +!!! ! channel name with a "-", "_", "m", or "M" character indicating "minus". +!!! +!!! +!!! CheckOutListAgain = .FALSE. +!!! +!!! IF ( INDEX( "-_", OutListTmp(1:1) ) > 0 ) THEN +!!! p%OutParam(I)%SignM = -1 ! ex, "-TipDxc1" causes the sign of TipDxc1 to be switched. +!!! OutListTmp = OutListTmp(2:) +!!! ELSE IF ( INDEX( "mM", OutListTmp(1:1) ) > 0 ) THEN ! We'll assume this is a variable name for now, (if not, we will check later if OutListTmp(2:) is also a variable name) +!!! CheckOutListAgain = .TRUE. +!!! p%OutParam(I)%SignM = 1 +!!! ELSE +!!! p%OutParam(I)%SignM = 1 +!!! END IF +!!! +!!! CALL Conv2UC( OutListTmp ) ! Convert OutListTmp to upper case +!!! +!!! +!!! Indx = IndexCharAry( OutListTmp(1:OutStrLenM1), ValidParamAry ) +!!! +!!! +!!! ! If it started with an "M" (CheckOutListAgain) we didn't find the value in our list (Indx < 1) +!!! +!!! IF ( CheckOutListAgain .AND. Indx < 1 ) THEN ! Let's assume that "M" really meant "minus" and then test again +!!! p%OutParam(I)%SignM = -1 ! ex, "MTipDxc1" causes the sign of TipDxc1 to be switched. +!!! OutListTmp = OutListTmp(2:) +!!! +!!! Indx = IndexCharAry( OutListTmp(1:OutStrLenM1), ValidParamAry ) +!!! END IF +!!! +!!! +!!! IF ( Indx > 0 ) THEN ! we found the channel name +!!! p%OutParam(I)%Indx = ParamIndxAry(Indx) +!!! IF ( InvalidOutput( ParamIndxAry(Indx) ) ) THEN ! but, it isn't valid for these settings +!!! p%OutParam(I)%Units = "INVALID" +!!! p%OutParam(I)%SignM = 0 +!!! ELSE +!!! p%OutParam(I)%Units = ParamUnitsAry(Indx) ! it's a valid output +!!! END IF +!!! ELSE ! this channel isn't valid +!!! p%OutParam(I)%Indx = Time ! pick any valid channel (I just picked "Time" here because it's universal) +!!! p%OutParam(I)%Units = "INVALID" +!!! p%OutParam(I)%SignM = 0 ! multiply all results by zero +!!! +!!! CALL SetErrStat(ErrID_Warn, TRIM(p%OutParam(I)%Name)//" is not an available output channel.",ErrStat,ErrMsg,RoutineName) +!!! END IF +!!! +!!! END DO +!!! + RETURN +END SUBROUTINE SetOutParam +!---------------------------------------------------------------------------------------------------------------------------------- +!End of code generated by Matlab script +!********************************************************************************************************************************** + +!==================================================================================================== +SUBROUTINE SetAllOuts( p, y, m, ErrStat, ErrMsg ) + TYPE(Sld_ParameterType), INTENT(IN ) :: p !< The parameters for SoilDyn + TYPE(Sld_OutputType), INTENT(IN ) :: y !< Outputs + TYPE(Sld_MiscVarType), INTENT(INOUT) :: m !< Misc variables for optimization (not copied in glue code) + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status from this subroutine + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message from this subroutine + INTEGER(IntKi) :: I ! Generic counter + CHARACTER(*), PARAMETER :: RoutineName="SetAllOuts" + + ! Initialization + ErrStat = ErrID_None + ErrMsg = '' + +! ! We set the unused values to 0 at init, so we don't need to set them again here: +! DO I = 1,p%NWindVel +! +! m%AllOuts( WindVelX(I) ) = m%WindViUVW(1,I) +! m%AllOuts( WindVelY(I) ) = m%WindViUVW(2,I) +! m%AllOuts( WindVelZ(I) ) = m%WindViUVW(3,I) +! +! END DO +! +! !FIXME: Add in Wind1Dir, Wind1Mag etc. -- allthough those can be derived outside of FAST. +! +! DO I = 1,MIN(5, p%lidar%NumPulseGate ) +! m%AllOuts( WindMeas(I) ) = y%lidar%lidSpeed(I) +! END DO +END SUBROUTINE SetAllOuts + +!==================================================================================================== +SUBROUTINE SoilDyn_OpenSumFile( SumFileUnit, SummaryName, IfW_Prog, WindType, ErrStat, ErrMsg ) + INTEGER(IntKi), INTENT( OUT) :: SumFileUnit !< the unit number for the SoilDynsummary file + CHARACTER(*), INTENT(IN ) :: SummaryName !< the name of the SoilDyn summary file + TYPE(ProgDesc), INTENT(IN ) :: IfW_Prog !< the name/version/date of the SoilDyn program + INTEGER(IntKi), INTENT(IN ) :: WindType !< type identifying what wind we are using + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< returns a non-zero value when an error occurs + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + INTEGER(IntKi) :: TmpErrStat !< Temporary error status for checking how the WRITE worked + + ! Initialize ErrStat + ErrStat = ErrID_None + ErrMsg = "" + + SumFileUnit = -1 + CALL GetNewUnit( SumFileUnit ) + CALL OpenFOutFile ( SumFileUnit, SummaryName, ErrStat, ErrMsg ) + IF (ErrStat >=AbortErrLev) RETURN + + ! Write the summary file header + WRITE(SumFileUnit,'(/,A/)',IOSTAT=TmpErrStat) 'This summary file was generated by '//TRIM( IfW_Prog%Name )//& + ' '//TRIM( IfW_Prog%Ver )//' on '//CurDate()//' at '//CurTime()//'.' + WRITE(SumFileUnit,'(A14,I1)',IOSTAT=TmpErrStat) ' WindType: ',WindType + IF ( TmpErrStat /= 0 ) THEN + CALL SetErrStat(ErrID_Fatal,'Error writing to summary file.',ErrStat,ErrMsg,'') + RETURN + END IF +END SUBROUTINE SoilDyn_OpenSumFile +!==================================================================================================== +SUBROUTINE SoilDyn_CloseSumFile( SumFileUnit, ErrStat, ErrMsg ) + INTEGER(IntKi), INTENT(INOUT) :: SumFileUnit !< the unit number for the SoilDynsummary file + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< returns a non-zero value when an error occurs + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + INTEGER(IntKi) :: TmpErrStat + CHARACTER(1024) :: TmpErrMsg + + ! Initialize ErrStat + ErrStat = ErrID_None + ErrMsg = '' + TmpErrStat = ErrID_None + TmpErrMsg = '' + + ! Write any closing information in the summary file + IF ( SumFileUnit > 0_IntKi ) THEN + WRITE (SumFileUnit,'(/,A/)', IOSTAT=TmpErrStat) 'This summary file was closed on '//CurDate()//' at '//CurTime()//'.' + IF (TmpErrStat /= 0_IntKi) CALL SetErrStat( ErrID_Fatal, 'Problem writing to the SoilDyn summary file.', ErrStat, ErrMsg, '' ) + + ! Close the file + CLOSE( SumFileUnit, IOSTAT=TmpErrStat ) + IF (TmpErrStat /= 0_IntKi) CALL SetErrStat( ErrID_Fatal, 'Problem closing the SoilDyn summary file.', ErrStat, ErrMsg, '' ) + END IF +END SUBROUTINE SoilDyn_CloseSumFile +!==================================================================================================== + + +!********************************************************************************************************************************** +END MODULE SoilDyn_IO diff --git a/modules/soildyn/src/SoilDyn_Registry.txt b/modules/soildyn/src/SoilDyn_Registry.txt index e3821016b..c865c9fa7 100644 --- a/modules/soildyn/src/SoilDyn_Registry.txt +++ b/modules/soildyn/src/SoilDyn_Registry.txt @@ -32,10 +32,13 @@ typedef ^ REDWINdllType R8Ki D {6}{6} # SoilDyn input file -typedef ^ SlD_InputFile CHARACTER(1024) DLL_FileName - - - "Name of the DLL file including the full path" - -typedef ^ SlD_InputFile CHARACTER(1024) DLL_ProcName - - - "Name of the procedure in the DLL that will be called" - -typedef ^ SlD_InputFile CHARACTER(1024) DLL_PROPSFILE - - - "Name of PROPSFILE input file used in DLL" - -typedef ^ SlD_InputFile CHARACTER(1024) DLL_LDISPFILE - - - "Name of LDISPFILE input file used in DLL" - +typedef ^ SlD_InputFile LOGICAL EchoFlag - - - "Echo the input file" - +typedef ^ SlD_InputFile CHARACTER(1024) DLL_FileName - - - "Name of the DLL file including the full path" - +typedef ^ SlD_InputFile CHARACTER(1024) DLL_ProcName - - - "Name of the procedure in the DLL that will be called" - +typedef ^ SlD_InputFile CHARACTER(1024) DLL_PROPSFILE - - - "Name of PROPSFILE input file used in DLL" - +typedef ^ SlD_InputFile CHARACTER(1024) DLL_LDISPFILE - - - "Name of LDISPFILE input file used in DLL" - +typedef ^ ^ CHARACTER(ChanLen) OutList : - - "List of user-requested output channels" - + # ..... Initialization data ....................................................................................................... diff --git a/modules/soildyn/src/SoilDyn_Types.f90 b/modules/soildyn/src/SoilDyn_Types.f90 index d505c6603..9833d00a0 100644 --- a/modules/soildyn/src/SoilDyn_Types.f90 +++ b/modules/soildyn/src/SoilDyn_Types.f90 @@ -50,10 +50,12 @@ MODULE SoilDyn_Types ! ======================= ! ========= SlD_InputFile ======= TYPE, PUBLIC :: SlD_InputFile + LOGICAL :: EchoFlag !< Echo the input file [-] CHARACTER(1024) :: DLL_FileName !< Name of the DLL file including the full path [-] CHARACTER(1024) :: DLL_ProcName !< Name of the procedure in the DLL that will be called [-] CHARACTER(1024) :: DLL_PROPSFILE !< Name of PROPSFILE input file used in DLL [-] CHARACTER(1024) :: DLL_LDISPFILE !< Name of LDISPFILE input file used in DLL [-] + CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: OutList !< List of user-requested output channels [-] END TYPE SlD_InputFile ! ======================= ! ========= SlD_InitInputType ======= @@ -397,16 +399,30 @@ SUBROUTINE SlD_CopyInputFile( SrcInputFileData, DstInputFileData, CtrlCode, ErrS 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 = 'SlD_CopyInputFile' ! ErrStat = ErrID_None ErrMsg = "" + DstInputFileData%EchoFlag = SrcInputFileData%EchoFlag DstInputFileData%DLL_FileName = SrcInputFileData%DLL_FileName DstInputFileData%DLL_ProcName = SrcInputFileData%DLL_ProcName DstInputFileData%DLL_PROPSFILE = SrcInputFileData%DLL_PROPSFILE DstInputFileData%DLL_LDISPFILE = SrcInputFileData%DLL_LDISPFILE +IF (ALLOCATED(SrcInputFileData%OutList)) THEN + i1_l = LBOUND(SrcInputFileData%OutList,1) + i1_u = UBOUND(SrcInputFileData%OutList,1) + IF (.NOT. ALLOCATED(DstInputFileData%OutList)) THEN + ALLOCATE(DstInputFileData%OutList(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInputFileData%OutList.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInputFileData%OutList = SrcInputFileData%OutList +ENDIF END SUBROUTINE SlD_CopyInputFile SUBROUTINE SlD_DestroyInputFile( InputFileData, ErrStat, ErrMsg ) @@ -418,6 +434,9 @@ SUBROUTINE SlD_DestroyInputFile( InputFileData, ErrStat, ErrMsg ) ! ErrStat = ErrID_None ErrMsg = "" +IF (ALLOCATED(InputFileData%OutList)) THEN + DEALLOCATE(InputFileData%OutList) +ENDIF END SUBROUTINE SlD_DestroyInputFile SUBROUTINE SlD_PackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) @@ -455,10 +474,16 @@ SUBROUTINE SlD_PackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs Re_BufSz = 0 Db_BufSz = 0 Int_BufSz = 0 + Int_BufSz = Int_BufSz + 1 ! EchoFlag Int_BufSz = Int_BufSz + 1*LEN(InData%DLL_FileName) ! DLL_FileName Int_BufSz = Int_BufSz + 1*LEN(InData%DLL_ProcName) ! DLL_ProcName Int_BufSz = Int_BufSz + 1*LEN(InData%DLL_PROPSFILE) ! DLL_PROPSFILE Int_BufSz = Int_BufSz + 1*LEN(InData%DLL_LDISPFILE) ! DLL_LDISPFILE + Int_BufSz = Int_BufSz + 1 ! OutList allocated yes/no + IF ( ALLOCATED(InData%OutList) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! OutList upper/lower bounds for each dimension + Int_BufSz = Int_BufSz + SIZE(InData%OutList)*LEN(InData%OutList) ! OutList + END IF IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) THEN @@ -486,6 +511,8 @@ SUBROUTINE SlD_PackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs Db_Xferred = 1 Int_Xferred = 1 + IntKiBuf ( Int_Xferred:Int_Xferred+1-1 ) = TRANSFER( InData%EchoFlag , IntKiBuf(1), 1) + Int_Xferred = Int_Xferred + 1 DO I = 1, LEN(InData%DLL_FileName) IntKiBuf(Int_Xferred) = ICHAR(InData%DLL_FileName(I:I), IntKi) Int_Xferred = Int_Xferred + 1 @@ -502,6 +529,23 @@ SUBROUTINE SlD_PackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs IntKiBuf(Int_Xferred) = ICHAR(InData%DLL_LDISPFILE(I:I), IntKi) Int_Xferred = Int_Xferred + 1 END DO ! I + IF ( .NOT. ALLOCATED(InData%OutList) ) 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%OutList,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%OutList,1) + Int_Xferred = Int_Xferred + 2 + + DO i1 = LBOUND(InData%OutList,1), UBOUND(InData%OutList,1) + DO I = 1, LEN(InData%OutList) + IntKiBuf(Int_Xferred) = ICHAR(InData%OutList(i1)(I:I), IntKi) + Int_Xferred = Int_Xferred + 1 + END DO ! I + END DO !i1 + END IF END SUBROUTINE SlD_PackInputFile SUBROUTINE SlD_UnPackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) @@ -523,6 +567,7 @@ SUBROUTINE SlD_UnPackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er LOGICAL, ALLOCATABLE :: mask3(:,:,:) LOGICAL, ALLOCATABLE :: mask4(:,:,:,:) LOGICAL, ALLOCATABLE :: mask5(:,:,:,:,:) + INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'SlD_UnPackInputFile' @@ -536,6 +581,8 @@ SUBROUTINE SlD_UnPackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er Re_Xferred = 1 Db_Xferred = 1 Int_Xferred = 1 + OutData%EchoFlag = TRANSFER( IntKiBuf( Int_Xferred ), mask0 ) + Int_Xferred = Int_Xferred + 1 DO I = 1, LEN(OutData%DLL_FileName) OutData%DLL_FileName(I:I) = CHAR(IntKiBuf(Int_Xferred)) Int_Xferred = Int_Xferred + 1 @@ -552,6 +599,33 @@ SUBROUTINE SlD_UnPackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er OutData%DLL_LDISPFILE(I:I) = CHAR(IntKiBuf(Int_Xferred)) Int_Xferred = Int_Xferred + 1 END DO ! I + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! OutList 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 (ALLOCATED(OutData%OutList)) DEALLOCATE(OutData%OutList) + ALLOCATE(OutData%OutList(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%OutList.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + ALLOCATE(mask1(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating mask1.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + mask1 = .TRUE. + DO i1 = LBOUND(OutData%OutList,1), UBOUND(OutData%OutList,1) + DO I = 1, LEN(OutData%OutList) + OutData%OutList(i1)(I:I) = CHAR(IntKiBuf(Int_Xferred)) + Int_Xferred = Int_Xferred + 1 + END DO ! I + END DO !i1 + DEALLOCATE(mask1) + END IF END SUBROUTINE SlD_UnPackInputFile SUBROUTINE SlD_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, ErrStat, ErrMsg ) From 81eca80462b924cf50550ee9e5777230427bcdc2 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Fri, 7 Feb 2020 10:20:15 -0700 Subject: [PATCH 013/136] SoilDyn: allow multiple DLL calls --- modules/soildyn/src/REDWINinterface.f90 | 15 +++--- modules/soildyn/src/SoilDyn.f90 | 14 +++-- modules/soildyn/src/SoilDyn_Registry.txt | 2 +- modules/soildyn/src/SoilDyn_Types.f90 | 66 +++++++++++++++++++++--- 4 files changed, 79 insertions(+), 18 deletions(-) diff --git a/modules/soildyn/src/REDWINinterface.f90 b/modules/soildyn/src/REDWINinterface.f90 index 4ec8d154e..2a4f1aa36 100644 --- a/modules/soildyn/src/REDWINinterface.f90 +++ b/modules/soildyn/src/REDWINinterface.f90 @@ -125,11 +125,11 @@ end subroutine CallREDWINdll !================================================================================================================================== !> This routine initializes variables used in the REDWIN DLL interface. -subroutine REDWINinterface_Init(u,p,m,y,InputFileData, ErrStat, ErrMsg) +subroutine REDWINinterface_Init(u,p,dll_data,y,InputFileData, ErrStat, ErrMsg) type(SlD_InputType), intent(inout) :: u !< An initial guess for the input; input mesh must be defined type(SlD_ParameterType), intent(inout) :: p !< Parameters - type(SlD_MiscVarType), intent(inout) :: m !< Initial misc (optimization) variables + type(REDWINdllType), intent(inout) :: dll_data type(SlD_OutputType), intent(inout) :: y !< Initial system outputs (outputs are not calculated; !! only the output mesh is initialized) type(SlD_InputFile), intent(inout) :: InputFileData !< Data stored in the module's input file @@ -173,7 +173,7 @@ subroutine REDWINinterface_Init(u,p,m,y,InputFileData, ErrStat, ErrMsg) CALL SetErrStat( ErrID_Warn,' --> Skipping DynamicLib call for '//TRIM(p%DLL_Trgt%FileName),ErrStat,ErrMsg,RoutineName ) #else ! Initialize DLL - CALL CallREDWINdll(u, p%DLL_Trgt, m%dll_data, p, ErrStat2, ErrMsg2) + CALL CallREDWINdll(u, p%DLL_Trgt, dll_data, p, ErrStat2, ErrMsg2) CALL CheckError(ErrStat2,ErrMsg2) IF ( ErrStat >= AbortErrLev ) RETURN #endif @@ -212,11 +212,10 @@ end subroutine REDWINinterface_Init !> This routine would call the DLL a final time, but there appears to be no end routine for the DLL, !! so we don't need to make a last call. It also frees the dynamic library (doesn't do anything on !! static linked). -subroutine REDWINinterface_End(u, p, m, ErrStat, ErrMsg) +subroutine REDWINinterface_End(u, p, ErrStat, ErrMsg) TYPE(SlD_InputType), INTENT(IN ) :: u !< System inputs TYPE(SlD_ParameterType), INTENT(INOUT) :: p !< Parameters - TYPE(SlD_MiscVarType), INTENT(INOUT) :: m !< misc (optimization) variables INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None @@ -244,12 +243,12 @@ end subroutine REDWINinterface_End !================================================================================================================================== !> This routine sets the AVRswap array, calls the routine from the REDWIN DLL, and sets the outputs from the call to be used as !! necessary in the main ServoDyn CalcOutput routine. -subroutine REDWINinterface_CalcOutput(t, u, p, m, ErrStat, ErrMsg) +subroutine REDWINinterface_CalcOutput(t, u, p, dll_data, ErrStat, ErrMsg) real(DbKi), intent(in ) :: t !< Current simulation time in seconds type(SlD_InputType), intent(in ) :: u !< Inputs at t type(SlD_ParameterType), intent(in ) :: p !< Parameters - type(SlD_MiscVarType), intent(inout) :: m !< misc (optimization) variables + type(REDWINdllType), intent(inout) :: dll_data integer(IntKi), intent( out) :: ErrStat !< Error status of the operation character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None @@ -272,7 +271,7 @@ subroutine REDWINinterface_CalcOutput(t, u, p, m, ErrStat, ErrMsg) CALL SetErrStat( ErrID_Warn,' --> Skipping DynamicLib call for '//TRIM(p%DLL_Trgt%FileName),ErrStat,ErrMsg,RoutineName ) #else ! Call the REDWIN-style DLL: - CALL CallREDWINdll(u, p%DLL_Trgt, m%dll_data, p, ErrStat, ErrMsg) + CALL CallREDWINdll(u, p%DLL_Trgt, dll_data, p, ErrStat, ErrMsg) IF ( ErrStat >= AbortErrLev ) RETURN #endif diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index f3a81c770..aef50763a 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -147,9 +147,17 @@ subroutine SoilDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In m%dll_data%LDISPfile = 'LoadDisplacement.txt' m%dll_data%IDtask = 1 - ! Initialize the DLL - call REDWINinterface_Init(u,p,m,y,InputFileData, ErrStat2, ErrMsg2) + ! Initialize the DLL for each interface point + allocate( m%dll_data(1), STAT=ErrStat2 ) + + call REDWINinterface_Init(u,p,m%dll_data(1),y,InputFileData, ErrStat2, ErrMsg2); if (Failed()) return; + +contains + logical function Failed() call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + Failed = ErrStat >= AbortErrLev + end function Failed + end subroutine SoilDyn_Init @@ -180,7 +188,7 @@ subroutine SoilDyn_End( u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) !! Place any last minute operations or calculations here: if (p%UseREDWINinterface) then - call REDWINinterface_End( u, p, m, ErrStat, ErrMsg ) + call REDWINinterface_End( u, p, ErrStat, ErrMsg ) endif !! Close files here (but because of checkpoint-restart capability, it is not recommended to have files open during the simulation): diff --git a/modules/soildyn/src/SoilDyn_Registry.txt b/modules/soildyn/src/SoilDyn_Registry.txt index c865c9fa7..4d41dbae7 100644 --- a/modules/soildyn/src/SoilDyn_Registry.txt +++ b/modules/soildyn/src/SoilDyn_Registry.txt @@ -80,7 +80,7 @@ typedef ^ OtherStateType IntKi DummyOtherState - - - "Re # ..... Misc/Optimization variables................................................................................................. # Define any data that are used only for efficiency purposes (these variables are not associated with time): # e.g. indices for searching in an array, large arrays that are local variables in any routine called multiple times, etc. -typedef ^ MiscVarType REDWINdllType dll_data - - - "data used for REDWIN DLL" - +typedef ^ MiscVarType REDWINdllType dll_data : - - "data used for REDWIN DLL" - # ..... Parameters ................................................................................................................ diff --git a/modules/soildyn/src/SoilDyn_Types.f90 b/modules/soildyn/src/SoilDyn_Types.f90 index 9833d00a0..6d0f70369 100644 --- a/modules/soildyn/src/SoilDyn_Types.f90 +++ b/modules/soildyn/src/SoilDyn_Types.f90 @@ -92,7 +92,7 @@ MODULE SoilDyn_Types ! ======================= ! ========= SlD_MiscVarType ======= TYPE, PUBLIC :: SlD_MiscVarType - TYPE(REDWINdllType) :: dll_data !< data used for REDWIN DLL [-] + TYPE(REDWINdllType) , DIMENSION(:), ALLOCATABLE :: dll_data !< data used for REDWIN DLL [-] END TYPE SlD_MiscVarType ! ======================= ! ========= SlD_ParameterType ======= @@ -1562,9 +1562,22 @@ SUBROUTINE SlD_CopyMisc( SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg ) ! ErrStat = ErrID_None ErrMsg = "" - CALL SlD_Copyredwindlltype( SrcMiscData%dll_data, DstMiscData%dll_data, CtrlCode, ErrStat2, ErrMsg2 ) +IF (ALLOCATED(SrcMiscData%dll_data)) THEN + i1_l = LBOUND(SrcMiscData%dll_data,1) + i1_u = UBOUND(SrcMiscData%dll_data,1) + IF (.NOT. ALLOCATED(DstMiscData%dll_data)) THEN + ALLOCATE(DstMiscData%dll_data(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%dll_data.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DO i1 = LBOUND(SrcMiscData%dll_data,1), UBOUND(SrcMiscData%dll_data,1) + CALL SlD_Copyredwindlltype( SrcMiscData%dll_data(i1), DstMiscData%dll_data(i1), CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN + ENDDO +ENDIF END SUBROUTINE SlD_CopyMisc SUBROUTINE SlD_DestroyMisc( MiscData, ErrStat, ErrMsg ) @@ -1576,7 +1589,12 @@ SUBROUTINE SlD_DestroyMisc( MiscData, ErrStat, ErrMsg ) ! ErrStat = ErrID_None ErrMsg = "" - CALL SlD_Destroyredwindlltype( MiscData%dll_data, ErrStat, ErrMsg ) +IF (ALLOCATED(MiscData%dll_data)) THEN +DO i1 = LBOUND(MiscData%dll_data,1), UBOUND(MiscData%dll_data,1) + CALL SlD_Destroyredwindlltype( MiscData%dll_data(i1), ErrStat, ErrMsg ) +ENDDO + DEALLOCATE(MiscData%dll_data) +ENDIF END SUBROUTINE SlD_DestroyMisc SUBROUTINE SlD_PackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) @@ -1614,9 +1632,13 @@ SUBROUTINE SlD_PackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, Si Re_BufSz = 0 Db_BufSz = 0 Int_BufSz = 0 + Int_BufSz = Int_BufSz + 1 ! dll_data allocated yes/no + IF ( ALLOCATED(InData%dll_data) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! dll_data upper/lower bounds for each dimension ! Allocate buffers for subtypes, if any (we'll get sizes from these) + DO i1 = LBOUND(InData%dll_data,1), UBOUND(InData%dll_data,1) Int_BufSz = Int_BufSz + 3 ! dll_data: size of buffers for each call to pack subtype - CALL SlD_Packredwindlltype( Re_Buf, Db_Buf, Int_Buf, InData%dll_data, ErrStat2, ErrMsg2, .TRUE. ) ! dll_data + CALL SlD_Packredwindlltype( Re_Buf, Db_Buf, Int_Buf, InData%dll_data(i1), ErrStat2, ErrMsg2, .TRUE. ) ! dll_data CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -1632,6 +1654,8 @@ SUBROUTINE SlD_PackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, Si Int_BufSz = Int_BufSz + SIZE( Int_Buf ) DEALLOCATE(Int_Buf) END IF + END DO + END IF IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) THEN @@ -1659,7 +1683,18 @@ SUBROUTINE SlD_PackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, Si Db_Xferred = 1 Int_Xferred = 1 - CALL SlD_Packredwindlltype( Re_Buf, Db_Buf, Int_Buf, InData%dll_data, ErrStat2, ErrMsg2, OnlySize ) ! dll_data + IF ( .NOT. ALLOCATED(InData%dll_data) ) 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%dll_data,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%dll_data,1) + Int_Xferred = Int_Xferred + 2 + + DO i1 = LBOUND(InData%dll_data,1), UBOUND(InData%dll_data,1) + CALL SlD_Packredwindlltype( Re_Buf, Db_Buf, Int_Buf, InData%dll_data(i1), ErrStat2, ErrMsg2, OnlySize ) ! dll_data CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -1687,6 +1722,8 @@ SUBROUTINE SlD_PackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, Si ELSE IntKiBuf( Int_Xferred ) = 0; Int_Xferred = Int_Xferred + 1 ENDIF + END DO + END IF END SUBROUTINE SlD_PackMisc SUBROUTINE SlD_UnPackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) @@ -1708,6 +1745,7 @@ SUBROUTINE SlD_UnPackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg LOGICAL, ALLOCATABLE :: mask3(:,:,:) LOGICAL, ALLOCATABLE :: mask4(:,:,:,:) LOGICAL, ALLOCATABLE :: mask5(:,:,:,:,:) + INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'SlD_UnPackMisc' @@ -1721,6 +1759,20 @@ SUBROUTINE SlD_UnPackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg Re_Xferred = 1 Db_Xferred = 1 Int_Xferred = 1 + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! dll_data 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 (ALLOCATED(OutData%dll_data)) DEALLOCATE(OutData%dll_data) + ALLOCATE(OutData%dll_data(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%dll_data.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i1 = LBOUND(OutData%dll_data,1), UBOUND(OutData%dll_data,1) Buf_size=IntKiBuf( Int_Xferred ) Int_Xferred = Int_Xferred + 1 IF(Buf_size > 0) THEN @@ -1754,13 +1806,15 @@ SUBROUTINE SlD_UnPackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg Int_Buf = IntKiBuf( Int_Xferred:Int_Xferred+Buf_size-1 ) Int_Xferred = Int_Xferred + Buf_size END IF - CALL SlD_Unpackredwindlltype( Re_Buf, Db_Buf, Int_Buf, OutData%dll_data, ErrStat2, ErrMsg2 ) ! dll_data + CALL SlD_Unpackredwindlltype( Re_Buf, Db_Buf, Int_Buf, OutData%dll_data(i1), ErrStat2, ErrMsg2 ) ! dll_data 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) + END DO + END IF END SUBROUTINE SlD_UnPackMisc SUBROUTINE SlD_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg ) From e922d285a445cd53fb9dc471f1695e3928f222f4 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Fri, 7 Feb 2020 10:21:19 -0700 Subject: [PATCH 014/136] SoilDyn: more input file reading --- modules/soildyn/src/SoilDyn.f90 | 51 ++-- modules/soildyn/src/SoilDyn_IO.f90 | 220 ++++++++---------- modules/soildyn/src/SoilDyn_Registry.txt | 25 +- modules/soildyn/src/SoilDyn_Types.f90 | 138 ++++++++++- modules/soildyn/src/driver/SoilDyn_Driver.f90 | 2 +- 5 files changed, 279 insertions(+), 157 deletions(-) diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index aef50763a..d930259da 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -63,26 +63,27 @@ MODULE SoilDyn !! The initial states and initial guess for the input are defined. subroutine SoilDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOut, ErrStat, ErrMsg ) - type(SlD_InitInputType), intent(in ) :: InitInp !< Input data for initialization routine - type(SlD_InputType), intent( out) :: u !< An initial guess for the input; input mesh must be defined - type(SlD_ParameterType), intent( out) :: p !< Parameters - type(SlD_ContinuousStateType), intent( out) :: x !< Initial continuous states - type(SlD_DiscreteStateType), intent( out) :: xd !< Initial discrete states - type(SlD_ConstraintStateType), intent( out) :: z !< Initial guess of the constraint states - type(SlD_OtherStateType), intent( out) :: OtherState !< Initial other states (logical, etc) - type(SlD_OutputType), intent( out) :: y !< Initial system outputs - type(SlD_MiscVarType), intent( out) :: m !< Misc variables for optimization (not copied in glue code) - real(DbKi), intent(inout) :: Interval !< Coupling interval in seconds - type(SlD_InitOutputType), intent( out) :: InitOut !< Output for initialization routine - integer(IntKi), intent( out) :: ErrStat !< Error status of the operation - character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + type(SlD_InitInputType), intent(in ) :: InitInp !< Input data for initialization routine + type(SlD_InputType), intent( out) :: u !< An initial guess for the input; input mesh must be defined + type(SlD_ParameterType), intent( out) :: p !< Parameters + type(SlD_ContinuousStateType), intent( out) :: x !< Initial continuous states + type(SlD_DiscreteStateType), intent( out) :: xd !< Initial discrete states + type(SlD_ConstraintStateType), intent( out) :: z !< Initial guess of the constraint states + type(SlD_OtherStateType), intent( out) :: OtherState !< Initial other states (logical, etc) + type(SlD_OutputType), intent( out) :: y !< Initial system outputs + type(SlD_MiscVarType), intent( out) :: m !< Misc variables for optimization (not copied in glue code) + real(DbKi), intent(inout) :: Interval !< Coupling interval in seconds + type(SlD_InitOutputType), intent( out) :: InitOut !< Output for initialization routine + integer(IntKi), intent( out) :: ErrStat !< Error status of the operation + character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None ! local variables - integer(IntKi) :: NumOuts ! number of outputs; would probably be in the parameter type - integer(IntKi) :: ErrStat2 ! local error status - character(ErrMsgLen) :: ErrMsg2 ! local error message - character(*), parameter :: RoutineName = 'SoilDyn_Init' - type(SlD_InputFile) :: InputFileData !< Data stored in the module's input file + integer(IntKi) :: NumOuts ! number of outputs; would probably be in the parameter type + integer(IntKi) :: ErrStat2 ! local error status + character(ErrMsgLen) :: ErrMsg2 ! local error message + character(*), parameter :: RoutineName = 'SoilDyn_Init' + type(SlD_InputFile) :: InputFileData !< Data stored in the module's input file + character(1024) :: EchoFileName ! Initialize variables ErrStat = ErrID_None @@ -95,7 +96,9 @@ subroutine SoilDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In ! Display the module information call DispNVD( SoilDyn_Ver ) - +!FIXME: #EchoFileName +EchoFileName='TempFile.ech' + call SoilDyn_ReadInput( InitInp%InputFile, EchoFileName, InputFileData, ErrStat2, ErrMsg2 ); if (Failed()) return; ! Define parameters here: p%DT = Interval @@ -110,17 +113,14 @@ subroutine SoilDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In !FIXME: Develop a list of outputs, and set that up somewhere. ! Define system output initializations (set up mesh) here: - call AllocAry( y%WriteOutput, NumOuts, 'WriteOutput', ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) ! set return error status based on local (concatenate errors) - if (ErrStat >= AbortErrLev) return ! if there are local variables that need to be deallocated, do so before early return + call AllocAry( y%WriteOutput, NumOuts, 'WriteOutput', ErrStat2, ErrMsg2 ); if (Failed()) return; y%DummyOutput = 0 y%WriteOutput = 0 ! Define initialization-routine output here: - call AllocAry(InitOut%WriteOutputHdr,NumOuts,'WriteOutputHdr',ErrStat2,ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - call AllocAry(InitOut%WriteOutputUnt,NumOuts,'WriteOutputUnt',ErrStat2,ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat >= AbortErrLev) return ! if there are local variables that need to be deallocated, do so before early return + call AllocAry(InitOut%WriteOutputHdr,NumOuts,'WriteOutputHdr',ErrStat2,ErrMsg2); if (Failed()) return; + call AllocAry(InitOut%WriteOutputUnt,NumOuts,'WriteOutputUnt',ErrStat2,ErrMsg2); if (Failed()) return; InitOut%WriteOutputHdr = (/ 'Time ', 'Column2' /) InitOut%WriteOutputUnt = (/ '(s)', '(-)' /) @@ -132,6 +132,7 @@ subroutine SoilDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In ! linearize with the features that are enabled, stop the simulation if InitInp%Linearize is true. CALL SetErrStat( ErrID_Fatal, 'SoilDyn cannot perform linearization analysis.', ErrStat, ErrMsg, RoutineName) + return ! Otherwise, if the module does allow linearization, return the appropriate Jacobian row/column names and rotating-frame flags here: ! Allocate and set these variables: InitOut%LinNames_y, InitOut%LinNames_x, InitOut%LinNames_xd, InitOut%LinNames_z, InitOut%LinNames_u diff --git a/modules/soildyn/src/SoilDyn_IO.f90 b/modules/soildyn/src/SoilDyn_IO.f90 index b955c2bfb..fb81d7e87 100644 --- a/modules/soildyn/src/SoilDyn_IO.f90 +++ b/modules/soildyn/src/SoilDyn_IO.f90 @@ -19,8 +19,8 @@ !********************************************************************************************************************************** MODULE SoilDyn_IO - USE SoilDyn_Types - USE NWTC_Library + USE SoilDyn_Types + USE NWTC_Library IMPLICIT NONE @@ -35,10 +35,8 @@ MODULE SoilDyn_IO ! Parameters related to output length (number of characters allowed in the output data headers): - INTEGER(IntKi), PARAMETER :: OutStrLenM1 = ChanLen - 1 - ! Indices for computing output channels: ! NOTES: ! (1) These parameters are in the order stored in "OutListParameters.xlsx" @@ -50,8 +48,6 @@ MODULE SoilDyn_IO ! The maximum number of output channels which can be output by the code. INTEGER(IntKi), PARAMETER :: MaxOutPts = 1 - - ! INTEGER(IntKi), PARAMETER :: WindMeas(5) = (/ WindMeas1, WindMeas2, WindMeas3, WindMeas4, WindMeas5 /) ! Array of output constants ! INTEGER(IntKi), PARAMETER :: WindVelX(9) = (/ Wind1VelX, Wind2VelX, Wind3VelX, Wind4VelX, Wind5VelX, Wind6VelX, Wind7VelX, Wind8VelX, Wind9VelX /) ! Array of output constants @@ -67,34 +63,26 @@ MODULE SoilDyn_IO !==================================================================================================== !> This public subroutine reads the input required for SoilDyn from the file whose name is an !! input parameter. -SUBROUTINE SoilDyn_ReadInput( InputFileName, EchoFileName, InputFileData, ErrStat, ErrMsg ) -!---------------------------------------------------------------------------------------------------- - - IMPLICIT NONE - - CHARACTER(*), PARAMETER :: RoutineName="SoilDyn_ReadInput" - +subroutine SoilDyn_ReadInput( InputFileName, EchoFileName, InputFileData, ErrStat, ErrMsg ) - ! Passed variables CHARACTER(*), INTENT(IN ) :: InputFileName !< name of the input file CHARACTER(*), INTENT(IN ) :: EchoFileName !< name of the echo file TYPE(SlD_InputFile), INTENT(INOUT) :: InputFileData !< The data for initialization INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Returned error status from this subroutine CHARACTER(*), INTENT( OUT) :: ErrMsg !< Returned error message from this subroutine - - ! Local variables INTEGER(IntKi) :: UnitInput !< Unit number for the input file INTEGER(IntKi) :: UnitEcho !< The local unit number for this module's echo file CHARACTER(1024) :: TmpPath !< Temporary storage for relative path name CHARACTER(1024) :: TmpFmt !< Temporary storage for format statement CHARACTER(35) :: Frmt !< Output format for logical parameters. (matches NWTC Subroutine Library format) - - - ! Temoporary messages - INTEGER(IntKi) :: TmpErrStat - CHARACTER(ErrMsgLen) :: TmpErrMsg - CHARACTER(1024) :: PriPath ! Path name of the primary file + character(200) :: Line !< Temporary storage of a line from the input file (to compare with "default") + + INTEGER(IntKi) :: TmpErrStat !< Temporary error status + INTEGER(IntKi) :: IOS !< Temporary error status + CHARACTER(ErrMsgLen) :: TmpErrMsg !< Temporary error message + CHARACTER(1024) :: PriPath !< Path name of the primary file + CHARACTER(*), PARAMETER :: RoutineName="SoilDyn_ReadInput" ! Initialize local data @@ -108,107 +96,101 @@ SUBROUTINE SoilDyn_ReadInput( InputFileName, EchoFileName, InputFileData, ErrSta ! allocate the array for the OutList - CALL AllocAry( InputFileData%OutList, MaxOutPts, "SoilDyn Input File's OutList", TmpErrStat, TmpErrMsg ) - CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) - IF (ErrStat >= AbortErrLev) THEN - CALL Cleanup() - RETURN - END IF - + CALL AllocAry( InputFileData%OutList, MaxOutPts, "SoilDyn Input File's OutList", TmpErrStat, TmpErrMsg ); if (Failed()) return; !------------------------------------------------------------------------------------------------- ! Open the file !------------------------------------------------------------------------------------------------- - CALL GetNewUnit( UnitInput, TmpErrStat, TmpErrMsg ) - CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) - - CALL OpenFInpFile( UnitInput, TRIM(InputFileName), TmpErrStat, TmpErrMsg ) - CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) - IF (ErrStat >= AbortErrLev) THEN - CALL Cleanup() - RETURN - END IF - + CALL GetNewUnit( UnitInput, TmpErrStat, TmpErrMsg ); if (Failed()) return; + CALL OpenFInpFile( UnitInput, TRIM(InputFileName), TmpErrStat, TmpErrMsg ); if (Failed()) return; !------------------------------------------------------------------------------------------------- ! File header !------------------------------------------------------------------------------------------------- - CALL ReadCom( UnitInput, InputFileName, 'SoilDyn input file header line 1', TmpErrStat, TmpErrMsg ) - CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) - IF (ErrStat >= AbortErrLev) THEN - CALL Cleanup() - RETURN - END IF - - CALL ReadCom( UnitInput, InputFileName, 'SoilDyn input file header line 2', TmpErrStat, TmpErrMsg ) - CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) - IF (ErrStat >= AbortErrLev) THEN - CALL Cleanup() - RETURN - END IF - - CALL ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line', TmpErrStat, TmpErrMsg ) - CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) - IF (ErrStat >= AbortErrLev) THEN - CALL Cleanup() - RETURN - END IF - + call ReadCom( UnitInput, InputFileName, 'SoilDyn input file header line 1', TmpErrStat, TmpErrMsg ); if (Failed()) return; + call ReadCom( UnitInput, InputFileName, 'SoilDyn input file header line 2', TmpErrStat, TmpErrMsg ); if (Failed()) return; + call ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line', TmpErrStat, TmpErrMsg ); if (Failed()) return; ! Echo Input Files. - - CALL ReadVar ( UnitInput, InputFileName, InputFileData%EchoFlag, 'Echo', 'Echo Input', TmpErrStat, TmpErrMsg ) - CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) - IF (ErrStat >= AbortErrLev) THEN - CALL Cleanup() - RETURN - END IF + call ReadVar ( UnitInput, InputFileName, InputFileData%EchoFlag, 'Echo', 'Echo Input', TmpErrStat, TmpErrMsg ); if (Failed()) return; ! If we are Echoing the input then we should re-read the first three lines so that we can echo them ! using the NWTC_Library routines. The echoing is done inside those routines via a global variable ! which we must store, set, and then replace on error or completion. - IF ( InputFileData%EchoFlag ) THEN + call OpenEcho ( UnitEcho, TRIM(EchoFileName), TmpErrStat, TmpErrMsg ); if (Failed()) return; + rewind(UnitInput) - CALL OpenEcho ( UnitEcho, TRIM(EchoFileName), TmpErrStat, TmpErrMsg ) - CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF + call ReadCom( UnitInput, InputFileName, 'SoilDyn input file header line 1', TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; + call ReadCom( UnitInput, InputFileName, 'SoilDyn input file header line 2', TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; + call ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line', TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; - REWIND(UnitInput) + ! Echo Input Files. + call ReadVar ( UnitInput, InputFileName, InputFileData%EchoFlag, 'Echo', 'Echo the input file data', TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; + end if + + ! DT - Time interval for aerodynamic calculations {or default} (s): + Line = "" + CALL ReadVar( UnitInput, InputFileName, Line, "DT", "Time interval for soil calculations {or default} (s)", TmpErrStat, TmpErrMsg, UnitEcho); if (Failed()) return; + CALL Conv2UC( Line ) + IF ( INDEX(Line, "DEFAULT" ) /= 1 ) THEN ! If it's not "default", read this variable; otherwise use the value already stored in InputFileData%DTAero + READ( Line, *, IOSTAT=IOS) InputFileData%DT + CALL CheckIOS ( IOS, InputFileName, 'DT', NumType, TmpErrStat, TmpErrMsg ); if (Failed()) return; + END IF + + ! CalcOption -- option on which calculation methodology to use {1: Stiffness / Damping matrices [unavailable], 2: P-Y curves [unavailable], 3: coupled REDWIN DLL} + call ReadVar( UnitInput, InputFileName, InputFileData%CalcOption, "CalcOption", "Calculation methodology to use", TmpErrStat, TmpErrMsg, UnitEcho); if (Failed()) return; + + !------------------------------------------------------------------------------------------------- + !> Read Stiffness / Damping section [ CalcOption == 1 only ] + !------------------------------------------------------------------------------------------------- - ! The input file was already successfully read through up to this point, so we shouldn't have any read - ! errors in the first four lines. So, we won't worry about checking the error status here. + call ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line', TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; - CALL ReadCom( UnitInput, InputFileName, 'SoilDyn input file header line 1', TmpErrStat, TmpErrMsg, UnitEcho ) - CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) + ! Stiffness + call ReadVar( UnitInput, InputFileName, InputFileData%Stiffness(1,1), 'K11 = K22', 'Elastic horizontal stiffness at seabed (N/m)', TmpErrStat, TmpErrMsg, UnitEcho); if (Failed()) return; + InputFileData%Stiffness(2,2) = InputFileData%Stiffness(1,1) - CALL ReadCom( UnitInput, InputFileName, 'SoilDyn input file header line 2', TmpErrStat, TmpErrMsg, UnitEcho ) - CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) + call ReadVar( UnitInput, InputFileName, InputFileData%Stiffness(1,5), 'K15 = -K24', 'Elastic horizontal-rotational cross stiffness at seabed (N/m)', TmpErrStat, TmpErrMsg, UnitEcho); if (Failed()) return; + InputFileData%Stiffness(2,4) =-InputFileData%Stiffness(1,5) - CALL ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line', TmpErrStat, TmpErrMsg, UnitEcho ) - CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) + call ReadVar( UnitInput, InputFileName, InputFileData%Stiffness(5,1), 'K51 = -K42', 'Elastic rotational-horizontal cross stiffness at seabed (N/m)', TmpErrStat, TmpErrMsg, UnitEcho); if (Failed()) return; + InputFileData%Stiffness(4,2) =-InputFileData%Stiffness(5,1) - ! Echo Input Files. + call ReadVar( UnitInput, InputFileName, InputFileData%Stiffness(5,5), 'K55 = K44', 'Elastic rotational stiffness at seabed (N-m/m)', TmpErrStat, TmpErrMsg, UnitEcho); if (Failed()) return; + InputFileData%Stiffness(4,4) = InputFileData%Stiffness(5,5) - CALL ReadVar ( UnitInput, InputFileName, InputFileData%EchoFlag, 'Echo', 'Echo the input file data', TmpErrStat, TmpErrMsg, UnitEcho ) - CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) + call ReadVar( UnitInput, InputFileName, InputFileData%Stiffness(3,3), 'K33' , 'Elastic vertical stiffness at seabed (N-m/m)', TmpErrStat, TmpErrMsg, UnitEcho); if (Failed()) return; + call ReadVar( UnitInput, InputFileName, InputFileData%Stiffness(6,6), 'K66' , 'Elastic torsional stiffness at seabed (N-m/m)', TmpErrStat, TmpErrMsg, UnitEcho); if (Failed()) return; - END IF + ! Damping + call ReadVar( UnitInput, InputFileName, InputFileData%Damping(1,1), 'D11 = D22', 'Elastic horizontal damping ratio at seabed (-)', TmpErrStat, TmpErrMsg, UnitEcho); if (Failed()) return; + InputFileData%Damping(2,2) = InputFileData%Damping(1,1) + call ReadVar( UnitInput, InputFileName, InputFileData%Damping(1,5), 'D15 = -D24', 'Elastic horizontal-rotational cross damping ratio at seabed (-)', TmpErrStat, TmpErrMsg, UnitEcho); if (Failed()) return; + InputFileData%Damping(2,4) = -InputFileData%Damping(1,5) + call ReadVar( UnitInput, InputFileName, InputFileData%Damping(5,1), 'D51 = -D42', 'Elastic rotational-horizontal cross damping ratio at seabed (-)', TmpErrStat, TmpErrMsg, UnitEcho); if (Failed()) return; + InputFileData%Damping(4,2) = -InputFileData%Damping(5,1) + + call ReadVar( UnitInput, InputFileName, InputFileData%Damping(5,5), 'D55 = D44', 'Elastic rotational damping ratio at seabed (-)', TmpErrStat, TmpErrMsg, UnitEcho); if (Failed()) return; + InputFileData%Damping(4,4) = InputFileData%Damping(5,5) + + call ReadVar( UnitInput, InputFileName, InputFileData%Damping(3,3), 'D33' , 'Elastic vertical damping ratio at seabed (-)', TmpErrStat, TmpErrMsg, UnitEcho); if (Failed()) return; + call ReadVar( UnitInput, InputFileName, InputFileData%Damping(6,6), 'D66' , 'Elastic torsional damping ratio at seabed (-)', TmpErrStat, TmpErrMsg, UnitEcho); if (Failed()) return; + + + !------------------------------------------------------------------------------------------------- + !> Read P-Y curve section [ CalcOption == 2 only ] + !------------------------------------------------------------------------------------------------- + + call ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line', TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; + -!!! !------------------------------------------------------------------------------------------------- -!!! !> Read general section with wind type, direction, and output point list (applies to all wind types) -!!! !------------------------------------------------------------------------------------------------- -!!! -!!! !!! ! Read WindType !!! CALL ReadVar( UnitInput, InputFileName, InputFileData%WindType, 'WindType', & !!! 'switch for wind file type (1=steady; 2=uniform; 3=binary TurbSim FF; '//& @@ -771,19 +753,23 @@ SUBROUTINE SoilDyn_ReadInput( InputFileName, EchoFileName, InputFileData, ErrSta ! This is the end of the input file !------------------------------------------------------------------------------------------------- - CALL Cleanup() - RETURN + call Cleanup() + return CONTAINS - !.............................. - SUBROUTINE Cleanup() + logical function Failed() + call SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) + Failed = ErrStat >= AbortErrLev + if (Failed) call CleanUp() + end function Failed + subroutine Cleanup() ! Close input file - CLOSE ( UnitInput ) + close ( UnitInput ) ! Cleanup the Echo file and global variables - IF ( InputFileData%EchoFlag ) THEN - CLOSE(UnitEcho) - END IF - END SUBROUTINE Cleanup + if ( InputFileData%EchoFlag ) then + close(UnitEcho) + end if + end subroutine Cleanup END SUBROUTINE SoilDyn_ReadInput @@ -867,24 +853,20 @@ SUBROUTINE SetOutParam(OutList, p, ErrStat, ErrMsg ) IMPLICIT NONE - ! Passed variables - - CHARACTER(ChanLen), INTENT(IN) :: OutList(:) !< The list out user-requested outputs - TYPE(Sld_ParameterType), INTENT(INOUT) :: p !< The module parameters - INTEGER(IntKi), INTENT(OUT) :: ErrStat !< The error status code - CHARACTER(*), INTENT(OUT) :: ErrMsg !< The error message, if an error occurred - - ! Local variables - - INTEGER :: ErrStat2 ! temporary (local) error status - INTEGER :: I ! Generic loop-counting index - INTEGER :: J ! Generic loop-counting index - INTEGER :: INDX ! Index for valid arrays - - LOGICAL :: CheckOutListAgain ! Flag used to determine if output parameter starting with "M" is valid (or the negative of another parameter) - LOGICAL :: InvalidOutput(0:MaxOutPts) ! This array determines if the output channel is valid for this configuration - CHARACTER(ChanLen) :: OutListTmp ! A string to temporarily hold OutList(I) - CHARACTER(*), PARAMETER :: RoutineName = "SetOutParam" + CHARACTER(ChanLen), INTENT(IN) :: OutList(:) !< The list out user-requested outputs + TYPE(Sld_ParameterType), INTENT(INOUT) :: p !< The module parameters + INTEGER(IntKi), INTENT(OUT) :: ErrStat !< The error status code + CHARACTER(*), INTENT(OUT) :: ErrMsg !< The error message, if an error occurred + + INTEGER :: ErrStat2 ! temporary (local) error status + INTEGER :: I ! Generic loop-counting index + INTEGER :: J ! Generic loop-counting index + INTEGER :: INDX ! Index for valid arrays + + LOGICAL :: CheckOutListAgain ! Flag used to determine if output parameter starting with "M" is valid (or the negative of another parameter) + LOGICAL :: InvalidOutput(0:MaxOutPts) ! This array determines if the output channel is valid for this configuration + CHARACTER(ChanLen) :: OutListTmp ! A string to temporarily hold OutList(I) + CHARACTER(*), PARAMETER :: RoutineName = "SetOutParam" !!! CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry(32) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically !!! "WIND1VELX","WIND1VELY","WIND1VELZ","WIND2VELX","WIND2VELY","WIND2VELZ","WIND3VELX", & diff --git a/modules/soildyn/src/SoilDyn_Registry.txt b/modules/soildyn/src/SoilDyn_Registry.txt index 4d41dbae7..1a2451f53 100644 --- a/modules/soildyn/src/SoilDyn_Registry.txt +++ b/modules/soildyn/src/SoilDyn_Registry.txt @@ -26,20 +26,23 @@ typedef ^ REDWINdllType R8Ki Props {100}{200} typedef ^ REDWINdllType R8Ki StVar {12}{100} - - "Array containing the state variables at the end of the step (used internally by the REDWIN models). Specific to each model." - typedef ^ REDWINdllType IntKi StVarPrint {12}{100} - - "Array indicating which state variables should be printed to the screen. This feature is currently not supported." - typedef ^ REDWINdllType R8Ki Disp {6} - - "Displacements. Follows convention of REDWIN orientation." - -typedef ^ REDWINdllType R8Ki Force {6} - - "Forces. Follows convention of REDWIN orientations." - +typedef ^ REDWINdllType R8Ki Force {6} - - "Forces. Follows convention of REDWIN orientations." '(N)' typedef ^ REDWINdllType R8Ki D {6}{6} - - "The 6 x 6 elastic macro-element stiffness matrix at the SFI." - - - # SoilDyn input file -typedef ^ SlD_InputFile LOGICAL EchoFlag - - - "Echo the input file" - -typedef ^ SlD_InputFile CHARACTER(1024) DLL_FileName - - - "Name of the DLL file including the full path" - -typedef ^ SlD_InputFile CHARACTER(1024) DLL_ProcName - - - "Name of the procedure in the DLL that will be called" - -typedef ^ SlD_InputFile CHARACTER(1024) DLL_PROPSFILE - - - "Name of PROPSFILE input file used in DLL" - -typedef ^ SlD_InputFile CHARACTER(1024) DLL_LDISPFILE - - - "Name of LDISPFILE input file used in DLL" - -typedef ^ ^ CHARACTER(ChanLen) OutList : - - "List of user-requested output channels" - - - +typedef ^ SlD_InputFile LOGICAL EchoFlag - - - "Echo the input file" - +typedef ^ SlD_InputFile CHARACTER(1024) DLL_FileName - - - "Name of the DLL file including the full path" - +typedef ^ SlD_InputFile CHARACTER(1024) DLL_ProcName - - - "Name of the procedure in the DLL that will be called" - +typedef ^ SlD_InputFile CHARACTER(1024) DLL_PROPSFILE - - - "Name of PROPSFILE input file used in DLL" - +typedef ^ SlD_InputFile CHARACTER(1024) DLL_LDISPFILE - - - "Name of LDISPFILE input file used in DLL" - +typedef ^ ^ CHARACTER(ChanLen) OutList : - - "List of user-requested output channels" - +typedef ^ ^ R8Ki DT - - - "Timestep requested" '(s)' +typedef ^ ^ IntKi CalcOption - - - "Calculation methodology to use" - +typedef ^ ^ ReKi Stiffness {6}{6} - - "Stiffness matrix 6x6" '(N/m, N-m/m)' +typedef ^ ^ ReKi Damping {6}{6} - - "Damping ratio matrix 6x6" - +typedef ^ ^ character(1024) PY_inputFile - - - "Input file with P-Y curve data" - +typedef ^ ^ IntKi PY_numpoints - - - "Number of P-Y curve mesh points" - +typedef ^ ^ ReKi PY_locations :: - - "P-Y curve location points for mesh" '(m)' # ..... Initialization data ....................................................................................................... # Define inputs that the initialization routine may need here: diff --git a/modules/soildyn/src/SoilDyn_Types.f90 b/modules/soildyn/src/SoilDyn_Types.f90 index 6d0f70369..a9d7f5f56 100644 --- a/modules/soildyn/src/SoilDyn_Types.f90 +++ b/modules/soildyn/src/SoilDyn_Types.f90 @@ -44,7 +44,7 @@ MODULE SoilDyn_Types REAL(R8Ki) , DIMENSION(1:12,1:100) :: StVar !< Array containing the state variables at the end of the step (used internally by the REDWIN models). Specific to each model. [-] INTEGER(IntKi) , DIMENSION(1:12,1:100) :: StVarPrint !< Array indicating which state variables should be printed to the screen. This feature is currently not supported. [-] REAL(R8Ki) , DIMENSION(1:6) :: Disp !< Displacements. Follows convention of REDWIN orientation. [-] - REAL(R8Ki) , DIMENSION(1:6) :: Force !< Forces. Follows convention of REDWIN orientations. [-] + REAL(R8Ki) , DIMENSION(1:6) :: Force !< Forces. Follows convention of REDWIN orientations. ['(N)'] REAL(R8Ki) , DIMENSION(1:6,1:6) :: D !< The 6 x 6 elastic macro-element stiffness matrix at the SFI. [-] END TYPE REDWINdllType ! ======================= @@ -56,6 +56,13 @@ MODULE SoilDyn_Types CHARACTER(1024) :: DLL_PROPSFILE !< Name of PROPSFILE input file used in DLL [-] CHARACTER(1024) :: DLL_LDISPFILE !< Name of LDISPFILE input file used in DLL [-] CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: OutList !< List of user-requested output channels [-] + REAL(R8Ki) :: DT !< Timestep requested ['(s)'] + INTEGER(IntKi) :: CalcOption !< Calculation methodology to use [-] + REAL(ReKi) , DIMENSION(1:6,1:6) :: Stiffness !< Stiffness matrix 6x6 ['(N/m,] + REAL(ReKi) , DIMENSION(1:6,1:6) :: Damping !< Damping ratio matrix 6x6 [-] + character(1024) :: PY_inputFile !< Input file with P-Y curve data [-] + INTEGER(IntKi) :: PY_numpoints !< Number of P-Y curve mesh points [-] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: PY_locations !< P-Y curve location points for mesh ['(m)'] END TYPE SlD_InputFile ! ======================= ! ========= SlD_InitInputType ======= @@ -400,6 +407,7 @@ SUBROUTINE SlD_CopyInputFile( SrcInputFileData, DstInputFileData, CtrlCode, ErrS ! Local INTEGER(IntKi) :: i,j,k INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 + INTEGER(IntKi) :: i2, i2_l, i2_u ! bounds (upper/lower) for an array dimension 2 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'SlD_CopyInputFile' @@ -422,6 +430,26 @@ SUBROUTINE SlD_CopyInputFile( SrcInputFileData, DstInputFileData, CtrlCode, ErrS END IF END IF DstInputFileData%OutList = SrcInputFileData%OutList +ENDIF + DstInputFileData%DT = SrcInputFileData%DT + DstInputFileData%CalcOption = SrcInputFileData%CalcOption + DstInputFileData%Stiffness = SrcInputFileData%Stiffness + DstInputFileData%Damping = SrcInputFileData%Damping + DstInputFileData%PY_inputFile = SrcInputFileData%PY_inputFile + DstInputFileData%PY_numpoints = SrcInputFileData%PY_numpoints +IF (ALLOCATED(SrcInputFileData%PY_locations)) THEN + i1_l = LBOUND(SrcInputFileData%PY_locations,1) + i1_u = UBOUND(SrcInputFileData%PY_locations,1) + i2_l = LBOUND(SrcInputFileData%PY_locations,2) + i2_u = UBOUND(SrcInputFileData%PY_locations,2) + IF (.NOT. ALLOCATED(DstInputFileData%PY_locations)) THEN + ALLOCATE(DstInputFileData%PY_locations(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInputFileData%PY_locations.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInputFileData%PY_locations = SrcInputFileData%PY_locations ENDIF END SUBROUTINE SlD_CopyInputFile @@ -436,6 +464,9 @@ SUBROUTINE SlD_DestroyInputFile( InputFileData, ErrStat, ErrMsg ) ErrMsg = "" IF (ALLOCATED(InputFileData%OutList)) THEN DEALLOCATE(InputFileData%OutList) +ENDIF +IF (ALLOCATED(InputFileData%PY_locations)) THEN + DEALLOCATE(InputFileData%PY_locations) ENDIF END SUBROUTINE SlD_DestroyInputFile @@ -483,6 +514,17 @@ SUBROUTINE SlD_PackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs IF ( ALLOCATED(InData%OutList) ) THEN Int_BufSz = Int_BufSz + 2*1 ! OutList upper/lower bounds for each dimension Int_BufSz = Int_BufSz + SIZE(InData%OutList)*LEN(InData%OutList) ! OutList + END IF + Db_BufSz = Db_BufSz + 1 ! DT + Int_BufSz = Int_BufSz + 1 ! CalcOption + Re_BufSz = Re_BufSz + SIZE(InData%Stiffness) ! Stiffness + Re_BufSz = Re_BufSz + SIZE(InData%Damping) ! Damping + Int_BufSz = Int_BufSz + 1*LEN(InData%PY_inputFile) ! PY_inputFile + Int_BufSz = Int_BufSz + 1 ! PY_numpoints + Int_BufSz = Int_BufSz + 1 ! PY_locations allocated yes/no + IF ( ALLOCATED(InData%PY_locations) ) THEN + Int_BufSz = Int_BufSz + 2*2 ! PY_locations upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%PY_locations) ! PY_locations END IF IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) @@ -545,6 +587,36 @@ SUBROUTINE SlD_PackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs Int_Xferred = Int_Xferred + 1 END DO ! I END DO !i1 + END IF + DbKiBuf ( Db_Xferred:Db_Xferred+(1)-1 ) = InData%DT + Db_Xferred = Db_Xferred + 1 + IntKiBuf ( Int_Xferred:Int_Xferred+(1)-1 ) = InData%CalcOption + Int_Xferred = Int_Xferred + 1 + ReKiBuf ( Re_Xferred:Re_Xferred+(SIZE(InData%Stiffness))-1 ) = PACK(InData%Stiffness,.TRUE.) + Re_Xferred = Re_Xferred + SIZE(InData%Stiffness) + ReKiBuf ( Re_Xferred:Re_Xferred+(SIZE(InData%Damping))-1 ) = PACK(InData%Damping,.TRUE.) + Re_Xferred = Re_Xferred + SIZE(InData%Damping) + DO I = 1, LEN(InData%PY_inputFile) + IntKiBuf(Int_Xferred) = ICHAR(InData%PY_inputFile(I:I), IntKi) + Int_Xferred = Int_Xferred + 1 + END DO ! I + IntKiBuf ( Int_Xferred:Int_Xferred+(1)-1 ) = InData%PY_numpoints + Int_Xferred = Int_Xferred + 1 + IF ( .NOT. ALLOCATED(InData%PY_locations) ) 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%PY_locations,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%PY_locations,1) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%PY_locations,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%PY_locations,2) + Int_Xferred = Int_Xferred + 2 + + IF (SIZE(InData%PY_locations)>0) ReKiBuf ( Re_Xferred:Re_Xferred+(SIZE(InData%PY_locations))-1 ) = PACK(InData%PY_locations,.TRUE.) + Re_Xferred = Re_Xferred + SIZE(InData%PY_locations) END IF END SUBROUTINE SlD_PackInputFile @@ -568,6 +640,7 @@ SUBROUTINE SlD_UnPackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er LOGICAL, ALLOCATABLE :: mask4(:,:,:,:) LOGICAL, ALLOCATABLE :: mask5(:,:,:,:,:) INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 + INTEGER(IntKi) :: i2, i2_l, i2_u ! bounds (upper/lower) for an array dimension 2 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'SlD_UnPackInputFile' @@ -625,6 +698,68 @@ SUBROUTINE SlD_UnPackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er END DO ! I END DO !i1 DEALLOCATE(mask1) + END IF + OutData%DT = REAL( DbKiBuf( Db_Xferred ), R8Ki) + Db_Xferred = Db_Xferred + 1 + OutData%CalcOption = IntKiBuf( Int_Xferred ) + Int_Xferred = Int_Xferred + 1 + i1_l = LBOUND(OutData%Stiffness,1) + i1_u = UBOUND(OutData%Stiffness,1) + i2_l = LBOUND(OutData%Stiffness,2) + i2_u = UBOUND(OutData%Stiffness,2) + ALLOCATE(mask2(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating mask2.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + mask2 = .TRUE. + OutData%Stiffness = UNPACK(ReKiBuf( Re_Xferred:Re_Xferred+(SIZE(OutData%Stiffness))-1 ), mask2, 0.0_ReKi ) + Re_Xferred = Re_Xferred + SIZE(OutData%Stiffness) + DEALLOCATE(mask2) + i1_l = LBOUND(OutData%Damping,1) + i1_u = UBOUND(OutData%Damping,1) + i2_l = LBOUND(OutData%Damping,2) + i2_u = UBOUND(OutData%Damping,2) + ALLOCATE(mask2(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating mask2.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + mask2 = .TRUE. + OutData%Damping = UNPACK(ReKiBuf( Re_Xferred:Re_Xferred+(SIZE(OutData%Damping))-1 ), mask2, 0.0_ReKi ) + Re_Xferred = Re_Xferred + SIZE(OutData%Damping) + DEALLOCATE(mask2) + DO I = 1, LEN(OutData%PY_inputFile) + OutData%PY_inputFile(I:I) = CHAR(IntKiBuf(Int_Xferred)) + Int_Xferred = Int_Xferred + 1 + END DO ! I + OutData%PY_numpoints = IntKiBuf( Int_Xferred ) + Int_Xferred = Int_Xferred + 1 + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! PY_locations 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 + i2_l = IntKiBuf( Int_Xferred ) + i2_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ALLOCATED(OutData%PY_locations)) DEALLOCATE(OutData%PY_locations) + ALLOCATE(OutData%PY_locations(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%PY_locations.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + ALLOCATE(mask2(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating mask2.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + mask2 = .TRUE. + IF (SIZE(OutData%PY_locations)>0) OutData%PY_locations = UNPACK(ReKiBuf( Re_Xferred:Re_Xferred+(SIZE(OutData%PY_locations))-1 ), mask2, 0.0_ReKi ) + Re_Xferred = Re_Xferred + SIZE(OutData%PY_locations) + DEALLOCATE(mask2) END IF END SUBROUTINE SlD_UnPackInputFile @@ -1556,6 +1691,7 @@ SUBROUTINE SlD_CopyMisc( SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg ) 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 = 'SlD_CopyMisc' diff --git a/modules/soildyn/src/driver/SoilDyn_Driver.f90 b/modules/soildyn/src/driver/SoilDyn_Driver.f90 index 977ad7188..6bfb64724 100644 --- a/modules/soildyn/src/driver/SoilDyn_Driver.f90 +++ b/modules/soildyn/src/driver/SoilDyn_Driver.f90 @@ -61,7 +61,7 @@ PROGRAM SoilDyn_Driver ! Populate the InitInData data structure here: - InitInData%InputFile = 'MyInputFileName.inp' + InitInData%InputFile = 'RedWin1_Win32.ipt' ! Set the driver's request for time interval here: From b38dd98ca698ce2aceae3149bf43b22d7776fe4b Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Fri, 7 Feb 2020 12:58:36 -0700 Subject: [PATCH 015/136] SoilDyn: add SoilDyn_IO.f90 to VS project --- vs-build/SoilDyn/SoilDyn.vfproj | 135 ++++++++++++++++---------------- 1 file changed, 68 insertions(+), 67 deletions(-) diff --git a/vs-build/SoilDyn/SoilDyn.vfproj b/vs-build/SoilDyn/SoilDyn.vfproj index 194a804eb..4714c0da9 100644 --- a/vs-build/SoilDyn/SoilDyn.vfproj +++ b/vs-build/SoilDyn/SoilDyn.vfproj @@ -88,205 +88,206 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 6f5f728e2c4aa078b3bdb0fca373b5b7336fe6f9 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Fri, 7 Feb 2020 13:21:35 -0700 Subject: [PATCH 016/136] SoilDyn: convert to 6x6 matrix reads --- modules/soildyn/src/SoilDyn_IO.f90 | 76 ++++++++++++------------------ 1 file changed, 31 insertions(+), 45 deletions(-) diff --git a/modules/soildyn/src/SoilDyn_IO.f90 b/modules/soildyn/src/SoilDyn_IO.f90 index fb81d7e87..538d241d7 100644 --- a/modules/soildyn/src/SoilDyn_IO.f90 +++ b/modules/soildyn/src/SoilDyn_IO.f90 @@ -65,24 +65,25 @@ MODULE SoilDyn_IO !! input parameter. subroutine SoilDyn_ReadInput( InputFileName, EchoFileName, InputFileData, ErrStat, ErrMsg ) - CHARACTER(*), INTENT(IN ) :: InputFileName !< name of the input file - CHARACTER(*), INTENT(IN ) :: EchoFileName !< name of the echo file - TYPE(SlD_InputFile), INTENT(INOUT) :: InputFileData !< The data for initialization - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Returned error status from this subroutine - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Returned error message from this subroutine - - INTEGER(IntKi) :: UnitInput !< Unit number for the input file - INTEGER(IntKi) :: UnitEcho !< The local unit number for this module's echo file - CHARACTER(1024) :: TmpPath !< Temporary storage for relative path name - CHARACTER(1024) :: TmpFmt !< Temporary storage for format statement - CHARACTER(35) :: Frmt !< Output format for logical parameters. (matches NWTC Subroutine Library format) + character(*), intent(in ) :: InputFileName !< name of the input file + character(*), intent(in ) :: EchoFileName !< name of the echo file + type(SlD_InputFile), intent(inout) :: InputFileData !< The data for initialization + integer(IntKi), intent( out) :: ErrStat !< Returned error status from this subroutine + character(*), intent( out) :: ErrMsg !< Returned error message from this subroutine + + integer(IntKi) :: UnitInput !< Unit number for the input file + integer(IntKi) :: UnitEcho !< The local unit number for this module's echo file + character(1024) :: TmpPath !< Temporary storage for relative path name + character(1024) :: TmpFmt !< Temporary storage for format statement + character(35) :: Frmt !< Output format for logical parameters. (matches NWTC Subroutine Library format) character(200) :: Line !< Temporary storage of a line from the input file (to compare with "default") + integer(IntKi) :: i !< Generic counter - INTEGER(IntKi) :: TmpErrStat !< Temporary error status - INTEGER(IntKi) :: IOS !< Temporary error status - CHARACTER(ErrMsgLen) :: TmpErrMsg !< Temporary error message - CHARACTER(1024) :: PriPath !< Path name of the primary file - CHARACTER(*), PARAMETER :: RoutineName="SoilDyn_ReadInput" + integer(IntKi) :: TmpErrStat !< Temporary error status + integer(IntKi) :: IOS !< Temporary error status + character(ErrMsgLen) :: TmpErrMsg !< Temporary error message + character(1024) :: PriPath !< Path name of the primary file + character(*), PARAMETER :: RoutineName="SoilDyn_ReadInput" ! Initialize local data @@ -151,38 +152,23 @@ subroutine SoilDyn_ReadInput( InputFileName, EchoFileName, InputFileData, ErrSta call ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line', TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; - ! Stiffness - call ReadVar( UnitInput, InputFileName, InputFileData%Stiffness(1,1), 'K11 = K22', 'Elastic horizontal stiffness at seabed (N/m)', TmpErrStat, TmpErrMsg, UnitEcho); if (Failed()) return; - InputFileData%Stiffness(2,2) = InputFileData%Stiffness(1,1) - - call ReadVar( UnitInput, InputFileName, InputFileData%Stiffness(1,5), 'K15 = -K24', 'Elastic horizontal-rotational cross stiffness at seabed (N/m)', TmpErrStat, TmpErrMsg, UnitEcho); if (Failed()) return; - InputFileData%Stiffness(2,4) =-InputFileData%Stiffness(1,5) - - call ReadVar( UnitInput, InputFileName, InputFileData%Stiffness(5,1), 'K51 = -K42', 'Elastic rotational-horizontal cross stiffness at seabed (N/m)', TmpErrStat, TmpErrMsg, UnitEcho); if (Failed()) return; - InputFileData%Stiffness(4,2) =-InputFileData%Stiffness(5,1) + ! In general, the stiffness and damping matrices will have the following symetries: + ! K11 = K22 + ! K15 = -K24 + ! K51 = -K42 + ! K55 = K44 - call ReadVar( UnitInput, InputFileName, InputFileData%Stiffness(5,5), 'K55 = K44', 'Elastic rotational stiffness at seabed (N-m/m)', TmpErrStat, TmpErrMsg, UnitEcho); if (Failed()) return; - InputFileData%Stiffness(4,4) = InputFileData%Stiffness(5,5) - - call ReadVar( UnitInput, InputFileName, InputFileData%Stiffness(3,3), 'K33' , 'Elastic vertical stiffness at seabed (N-m/m)', TmpErrStat, TmpErrMsg, UnitEcho); if (Failed()) return; - call ReadVar( UnitInput, InputFileName, InputFileData%Stiffness(6,6), 'K66' , 'Elastic torsional stiffness at seabed (N-m/m)', TmpErrStat, TmpErrMsg, UnitEcho); if (Failed()) return; + ! Stiffness + call ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line', TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; + do i=1,6 + call ReadAry( UnitInput, InputFileName, InputFileData%Stiffness(i,:), 6, 'Stiffness', 'Elastic stiffness matrix', TmpErrStat, TmpErrMsg, UnitEcho); if (Failed()) return; + enddo ! Damping - call ReadVar( UnitInput, InputFileName, InputFileData%Damping(1,1), 'D11 = D22', 'Elastic horizontal damping ratio at seabed (-)', TmpErrStat, TmpErrMsg, UnitEcho); if (Failed()) return; - InputFileData%Damping(2,2) = InputFileData%Damping(1,1) - - call ReadVar( UnitInput, InputFileName, InputFileData%Damping(1,5), 'D15 = -D24', 'Elastic horizontal-rotational cross damping ratio at seabed (-)', TmpErrStat, TmpErrMsg, UnitEcho); if (Failed()) return; - InputFileData%Damping(2,4) = -InputFileData%Damping(1,5) - - call ReadVar( UnitInput, InputFileName, InputFileData%Damping(5,1), 'D51 = -D42', 'Elastic rotational-horizontal cross damping ratio at seabed (-)', TmpErrStat, TmpErrMsg, UnitEcho); if (Failed()) return; - InputFileData%Damping(4,2) = -InputFileData%Damping(5,1) - - call ReadVar( UnitInput, InputFileName, InputFileData%Damping(5,5), 'D55 = D44', 'Elastic rotational damping ratio at seabed (-)', TmpErrStat, TmpErrMsg, UnitEcho); if (Failed()) return; - InputFileData%Damping(4,4) = InputFileData%Damping(5,5) - - call ReadVar( UnitInput, InputFileName, InputFileData%Damping(3,3), 'D33' , 'Elastic vertical damping ratio at seabed (-)', TmpErrStat, TmpErrMsg, UnitEcho); if (Failed()) return; - call ReadVar( UnitInput, InputFileName, InputFileData%Damping(6,6), 'D66' , 'Elastic torsional damping ratio at seabed (-)', TmpErrStat, TmpErrMsg, UnitEcho); if (Failed()) return; - + call ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line', TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; + do i=1,6 + call ReadAry( UnitInput, InputFileName, InputFileData%Damping(i,:), 6, 'Damping', 'Elastic damping ratio (-)', TmpErrStat, TmpErrMsg, UnitEcho); if (Failed()) return; + enddo !------------------------------------------------------------------------------------------------- !> Read P-Y curve section [ CalcOption == 2 only ] From 4ebf105f3d65e211244e9e2738173b148cb1aa4c Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Fri, 7 Feb 2020 16:29:11 -0700 Subject: [PATCH 017/136] SoilDyn: Input file parsing complete (I think) --- modules/soildyn/src/SoilDyn.f90 | 12 +- modules/soildyn/src/SoilDyn_IO.f90 | 739 +++++------------------ modules/soildyn/src/SoilDyn_Registry.txt | 25 +- modules/soildyn/src/SoilDyn_Types.f90 | 365 +++++++++-- 4 files changed, 486 insertions(+), 655 deletions(-) diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index d930259da..5b742aebe 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -99,6 +99,7 @@ subroutine SoilDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In !FIXME: #EchoFileName EchoFileName='TempFile.ech' call SoilDyn_ReadInput( InitInp%InputFile, EchoFileName, InputFileData, ErrStat2, ErrMsg2 ); if (Failed()) return; + ! Define parameters here: p%DT = Interval @@ -144,12 +145,17 @@ subroutine SoilDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In !FIXME: add input file parsing InputFileData%DLL_ProcName = 'INTERFACEFOUNDATION' ! The name of the procedure in the DLL that will be called. InputFileData%DLL_FileName = 'REDWINmodel1-2.0_x86.dll' ! 32 bit version for model 1 -m%dll_data%PROPSfile = 'Props.txt' -m%dll_data%LDISPfile = 'LoadDisplacement.txt' -m%dll_data%IDtask = 1 ! Initialize the DLL for each interface point allocate( m%dll_data(1), STAT=ErrStat2 ) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Could not allocate m%dll_data', ErrStat, ErrMsg, RoutineName) + return + endif + +m%dll_data(1)%PROPSfile = 'Props.txt' +m%dll_data(1)%LDISPfile = 'LoadDisplacement.txt' +m%dll_data(1)%IDtask = 1 call REDWINinterface_Init(u,p,m%dll_data(1),y,InputFileData, ErrStat2, ErrMsg2); if (Failed()) return; diff --git a/modules/soildyn/src/SoilDyn_IO.f90 b/modules/soildyn/src/SoilDyn_IO.f90 index 538d241d7..a0ab8f02b 100644 --- a/modules/soildyn/src/SoilDyn_IO.f90 +++ b/modules/soildyn/src/SoilDyn_IO.f90 @@ -28,8 +28,8 @@ MODULE SoilDyn_IO !FIXME: add the matlab generated output stuff here. ! =================================================================================================== ! NOTE: The following lines of code were generated by a Matlab script called "Write_ChckOutLst.m" -! using the parameters listed in the "OutListParameters.xlsx" Excel file. Any changes to these -! lines should be modified in the Matlab script and/or Excel worksheet as necessary. +! using the parameters listed in the "OutListParameters.xlsx" Excel file. Any changes to these +! lines should be modified in the Matlab script and/or Excel worksheet as necessary. ! =================================================================================================== ! This code was generated by Write_ChckOutLst.m at 23-Apr-2015 13:13:13. @@ -38,23 +38,23 @@ MODULE SoilDyn_IO INTEGER(IntKi), PARAMETER :: OutStrLenM1 = ChanLen - 1 ! Indices for computing output channels: - ! NOTES: + ! NOTES: ! (1) These parameters are in the order stored in "OutListParameters.xlsx" ! (2) Array y%AllOuts() must be dimensioned to the value of the largest output parameter - ! Time: + ! Time: INTEGER(IntKi), PARAMETER :: Time = 0 ! The maximum number of output channels which can be output by the code. INTEGER(IntKi), PARAMETER :: MaxOutPts = 1 - + ! INTEGER(IntKi), PARAMETER :: WindMeas(5) = (/ WindMeas1, WindMeas2, WindMeas3, WindMeas4, WindMeas5 /) ! Array of output constants ! INTEGER(IntKi), PARAMETER :: WindVelX(9) = (/ Wind1VelX, Wind2VelX, Wind3VelX, Wind4VelX, Wind5VelX, Wind6VelX, Wind7VelX, Wind8VelX, Wind9VelX /) ! Array of output constants ! INTEGER(IntKi), PARAMETER :: WindVelY(9) = (/ Wind1VelY, Wind2VelY, Wind3VelY, Wind4VelY, Wind5VelY, Wind6VelY, Wind7VelY, Wind8VelY, Wind9VelY /) ! Array of output constants ! INTEGER(IntKi), PARAMETER :: WindVelZ(9) = (/ Wind1VelZ, Wind2VelZ, Wind3VelZ, Wind4VelZ, Wind5VelZ, Wind6VelZ, Wind7VelZ, Wind8VelZ, Wind9VelZ /) ! Array of output constants - - + + ! =================================================================================================== CONTAINS @@ -66,7 +66,7 @@ MODULE SoilDyn_IO subroutine SoilDyn_ReadInput( InputFileName, EchoFileName, InputFileData, ErrStat, ErrMsg ) character(*), intent(in ) :: InputFileName !< name of the input file - character(*), intent(in ) :: EchoFileName !< name of the echo file + character(*), intent(in ) :: EchoFileName !< name of the echo file type(SlD_InputFile), intent(inout) :: InputFileData !< The data for initialization integer(IntKi), intent( out) :: ErrStat !< Returned error status from this subroutine character(*), intent( out) :: ErrMsg !< Returned error message from this subroutine @@ -77,8 +77,9 @@ subroutine SoilDyn_ReadInput( InputFileName, EchoFileName, InputFileData, ErrSta character(1024) :: TmpFmt !< Temporary storage for format statement character(35) :: Frmt !< Output format for logical parameters. (matches NWTC Subroutine Library format) character(200) :: Line !< Temporary storage of a line from the input file (to compare with "default") + integer(IntKi) :: LineLen !< Length of the line read integer(IntKi) :: i !< Generic counter - + integer(IntKi) :: TmpErrStat !< Temporary error status integer(IntKi) :: IOS !< Temporary error status character(ErrMsgLen) :: TmpErrMsg !< Temporary error message @@ -140,11 +141,11 @@ subroutine SoilDyn_ReadInput( InputFileName, EchoFileName, InputFileData, ErrSta IF ( INDEX(Line, "DEFAULT" ) /= 1 ) THEN ! If it's not "default", read this variable; otherwise use the value already stored in InputFileData%DTAero READ( Line, *, IOSTAT=IOS) InputFileData%DT CALL CheckIOS ( IOS, InputFileName, 'DT', NumType, TmpErrStat, TmpErrMsg ); if (Failed()) return; - END IF + END IF ! CalcOption -- option on which calculation methodology to use {1: Stiffness / Damping matrices [unavailable], 2: P-Y curves [unavailable], 3: coupled REDWIN DLL} call ReadVar( UnitInput, InputFileName, InputFileData%CalcOption, "CalcOption", "Calculation methodology to use", TmpErrStat, TmpErrMsg, UnitEcho); if (Failed()) return; - + !------------------------------------------------------------------------------------------------- !> Read Stiffness / Damping section [ CalcOption == 1 only ] @@ -153,10 +154,10 @@ subroutine SoilDyn_ReadInput( InputFileName, EchoFileName, InputFileData, ErrSta call ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line', TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; ! In general, the stiffness and damping matrices will have the following symetries: - ! K11 = K22 - ! K15 = -K24 - ! K51 = -K42 - ! K55 = K44 + ! K11 = K22 + ! K15 = -K24 + ! K51 = -K42 + ! K55 = K44 ! Stiffness call ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line', TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; @@ -175,563 +176,127 @@ subroutine SoilDyn_ReadInput( InputFileName, EchoFileName, InputFileData, ErrSta !------------------------------------------------------------------------------------------------- call ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line', TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; - - -!!! ! Read WindType -!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%WindType, 'WindType', & -!!! 'switch for wind file type (1=steady; 2=uniform; 3=binary TurbSim FF; '//& -!!! '4=binary Bladed-style FF; 5=HAWC format; 6=User defined)', & -!!! TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL CleanUp() -!!! RETURN -!!! ENDIF -!!! -!!! -!!! ! Read PropagationDir -!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%PropagationDir, 'PropagationDir', & -!!! 'Direction of wind propagation (meteoroligical direction)', TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL CleanUp() -!!! RETURN -!!! ENDIF -!!! -!!! -!!! ! Read the number of points for the wind velocity output -!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%NWindVel, 'NWindVel', & -!!! 'Number of points to output the wind velocity (0 to 9)', & -!!! TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL CleanUp() -!!! RETURN -!!! ENDIF -!!! -!!! ! Before proceeding, make sure that NWindVel makes sense -!!! IF ( InputFileData%NWindVel < 0 .OR. InputFileData%NwindVel > 9 ) THEN -!!! CALL SetErrStat( ErrID_Fatal, 'NWindVel must be greater than or equal to zero and less than 10.', & -!!! ErrStat, ErrMsg, RoutineName ) -!!! CALL CleanUp() -!!! RETURN -!!! ELSE -!!! -!!! ! Allocate space for the output location arrays: -!!! CALL AllocAry( InputFileData%WindVxiList, InputFileData%NWindVel, 'WindVxiList', TmpErrStat, TmpErrMsg ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) -!!! CALL AllocAry( InputFileData%WindVyiList, InputFileData%NWindVel, 'WindVyiList', TmpErrStat, TmpErrMsg ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) -!!! CALL AllocAry( InputFileData%WindVziList, InputFileData%NWindVel, 'WindVziList', TmpErrStat, TmpErrMsg ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL CleanUp() -!!! RETURN -!!! ENDIF -!!! ENDIF -!!! -!!! ! Read in the values of WindVxiList -!!! CALL ReadAry( UnitInput, InputFileName, InputFileData%WindVxiList, InputFileData%NWindVel, 'WindVxiList', & -!!! 'List of coordinates in the inertial X direction (m)', TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL CleanUp() -!!! RETURN -!!! ENDIF -!!! -!!! ! Read in the values of WindVxiList -!!! CALL ReadAry( UnitInput, InputFileName, InputFileData%WindVyiList, InputFileData%NWindVel, 'WindVyiList', & -!!! 'List of coordinates in the inertial Y direction (m)', TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL CleanUp() -!!! RETURN -!!! ENDIF -!!! -!!! ! Read in the values of WindVziList -!!! CALL ReadAry( UnitInput, InputFileName, InputFileData%WindVziList, InputFileData%NWindVel, 'WindVziList', & -!!! 'List of coordinates in the inertial Z direction (m)', TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL CleanUp() -!!! RETURN -!!! ENDIF -!!! -!!! -!!! !------------------------------------------------------------------------------------------------- -!!! !> Read the _Parameters for Steady Wind Conditions [used only for WindType = 1]_ section -!!! !------------------------------------------------------------------------------------------------- -!!! -!!! ! Section separator line -!!! CALL ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line', TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL Cleanup() -!!! RETURN -!!! END IF -!!! -!!! -!!! ! Read HWindSpeed -!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%Steady_HWindSpeed, 'HWindSpeed', & -!!! 'Horizontal windspeed for steady wind', TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL CleanUp() -!!! RETURN -!!! ENDIF -!!! -!!! ! Read RefHt -!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%Steady_RefHt, 'RefHt', & -!!! 'Reference height for horizontal wind speed for steady wind', TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL CleanUp() -!!! RETURN -!!! ENDIF -!!! -!!! ! Read PLexp -!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%Steady_PLexp, 'PLexp', & -!!! 'Power law exponent for steady wind', TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL CleanUp() -!!! RETURN -!!! ENDIF -!!! -!!! -!!! !------------------------------------------------------------------------------------------------- -!!! !> Read the _Parameters for Uniform wind file [used only for WindType = 2]_ section -!!! !------------------------------------------------------------------------------------------------- -!!! -!!! ! Section separator line -!!! CALL ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line', TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL Cleanup() -!!! RETURN -!!! END IF -!!! -!!! ! Read UniformWindFile -!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%Uniform_FileName, 'WindFileName', & -!!! 'Filename of time series data for uniform wind field', TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL CleanUp() -!!! RETURN -!!! ENDIF -!!! IF ( PathIsRelative( InputFileData%Uniform_FileName ) ) InputFileData%Uniform_FileName = TRIM(PriPath)//TRIM(InputFileData%Uniform_FileName) -!!! -!!! ! Read RefHt -!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%Uniform_RefHt, 'RefHt', & -!!! 'Reference height for uniform wind file', TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL CleanUp() -!!! RETURN -!!! ENDIF -!!! -!!! ! Read RefLength -!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%Uniform_RefLength, 'RefLength', & -!!! 'Reference length for uniform wind file', TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL CleanUp() -!!! RETURN -!!! ENDIF -!!! -!!! -!!! !------------------------------------------------------------------------------------------------- -!!! !> Read the _Parameters for Binary TurbSim Full-Field files [used only for WindType = 3]_ section -!!! !------------------------------------------------------------------------------------------------- -!!! -!!! ! Section separator line -!!! CALL ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line', TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL Cleanup() -!!! RETURN -!!! END IF -!!! -!!! ! Read TSFFWind info -!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%TSFF_FileName, 'FileName', & -!!! 'Name of the TurbSim full field wind file to use (.bts)', TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL CleanUp() -!!! RETURN -!!! ENDIF -!!! IF ( PathIsRelative( InputFileData%TSFF_FileName ) ) InputFileData%TSFF_FileName = TRIM(PriPath)//TRIM(InputFileData%TSFF_FileName) -!!! -!!! -!!! !------------------------------------------------------------------------------------------------- -!!! !> Read the _Parameters for Binary Bladed-style Full-Field files [used only for WindType = 4]_ section -!!! !------------------------------------------------------------------------------------------------- -!!! -!!! ! Section separator line -!!! CALL ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line', TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL Cleanup() -!!! RETURN -!!! END IF -!!! -!!! ! Read BladedStyle%WindFileName -!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%BladedFF_FileName, 'FileName', & -!!! 'Rootname of the full-field wind file to use (.wnd, .sum)', TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL CleanUp() -!!! RETURN -!!! ENDIF -!!! IF ( PathIsRelative( InputFileData%BladedFF_FileName ) ) InputFileData%BladedFF_FileName = TRIM(PriPath)//TRIM(InputFileData%BladedFF_FileName) -!!! InputFileData%BladedFF_FileName = TRIM(InputFileData%BladedFF_FileName)//'.wnd' -!!! -!!! ! Read TowerFileFlag -!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%BladedFF_TowerFile, 'TowerFileFlag', & -!!! 'Have tower file (.twr) [flag]', TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL CleanUp() -!!! RETURN -!!! ENDIF -!!! -!!!#ifdef UNUSED_INPUTFILE_LINES -!!! -!!! !------------------------------------------------------------------------------------------------- -!!! !> Read the _Parameters for coherent turbulence [used only for WindType = 3 or 4]_ section -!!! !------------------------------------------------------------------------------------------------- -!!! -!!! ! Section separator line -!!! CALL ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line', TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL Cleanup() -!!! RETURN -!!! END IF -!!! -!!! ! Read CTTS_Flag -!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%CTTS_CoherentTurb, 'CTTS_CoherentTurbFlag', & -!!! 'Flag to coherent turbulence', TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL CleanUp() -!!! RETURN -!!! ENDIF -!!! -!!! ! Read CTWind%WindFileName -!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%CTTS_FileName, 'CTTS_FileName', & -!!! 'Name of coherent turbulence file', TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL CleanUp() -!!! RETURN -!!! ENDIF -!!! IF ( PathIsRelative( InputFileData%CTTS_FileName ) ) InputFileData%CTTS_FileName = TRIM(PriPath)//TRIM(InputFileData%CTTS_FileName) -!!! -!!! ! Read CTWind%PathName -!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%CTTS_Path, 'CTTS_Path', & -!!! 'Path to coherent turbulence binary files', TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL CleanUp() -!!! RETURN -!!! ENDIF -!!! IF ( PathIsRelative( InputFileData%CTTS_Path ) ) InputFileData%CTTS_Path = TRIM(PriPath)//TRIM(InputFileData%CTTS_Path) -!!! -!!!#else -!!! InputFileData%CTTS_CoherentTurb = .FALSE. -!!!#endif -!!! -!!! !------------------------------------------------------------------------------------------------- -!!! !> Read the _Parameters for HAWC-formatted binary files [used only for WindType = 5]_ section -!!! !------------------------------------------------------------------------------------------------- -!!! -!!! ! Section separator line -!!! CALL ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line', TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL Cleanup() -!!! RETURN -!!! END IF -!!! -!!! ! Read HAWC_FileName_u -!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%HAWC_FileName_u, 'HAWC_FileName_u', & -!!! 'Name of the file containing the u-component fluctuating wind', TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL Cleanup() -!!! RETURN -!!! END IF -!!! IF ( PathIsRelative( InputFileData%HAWC_FileName_u ) ) InputFileData%HAWC_FileName_u = TRIM(PriPath)//TRIM(InputFileData%HAWC_FileName_u) -!!! -!!! ! Read HAWC_FileName_v -!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%HAWC_FileName_v, 'HAWC_FileName_v', & -!!! 'Name of the file containing the v-component fluctuating wind', TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL Cleanup() -!!! RETURN -!!! END IF -!!! IF ( PathIsRelative( InputFileData%HAWC_FileName_v ) ) InputFileData%HAWC_FileName_v = TRIM(PriPath)//TRIM(InputFileData%HAWC_FileName_v) -!!! -!!! ! Read HAWC_FileName_w -!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%HAWC_FileName_w, 'HAWC_FileName_w', & -!!! 'Name of the file containing the w-component fluctuating wind', TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL Cleanup() -!!! RETURN -!!! END IF -!!! IF ( PathIsRelative( InputFileData%HAWC_FileName_w ) ) InputFileData%HAWC_FileName_w = TRIM(PriPath)//TRIM(InputFileData%HAWC_FileName_w) -!!! -!!! ! Read HAWC_nx -!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%HAWC_nx, 'HAWC_nx', & -!!! 'Number of grids in the x direction (in the 3 files above)', TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL Cleanup() -!!! RETURN -!!! END IF -!!! -!!! ! Read HAWC_ny -!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%HAWC_ny, 'HAWC_ny', & -!!! 'Number of grids in the y direction (in the 3 files above)', TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL Cleanup() -!!! RETURN -!!! END IF -!!! -!!! ! Read HAWC_nz -!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%HAWC_nz, 'HAWC_nz', & -!!! 'Number of grids in the z direction (in the 3 files above)', TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL Cleanup() -!!! RETURN -!!! END IF -!!! -!!! ! Read HAWC_dx -!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%HAWC_dx, 'HAWC_dx', & -!!! 'Number of grids in the x direction (in the 3 files above)', TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL Cleanup() -!!! RETURN -!!! END IF -!!! -!!! ! Read HAWC_dy -!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%HAWC_dy, 'HAWC_dy', & -!!! 'Number of grids in the y direction (in the 3 files above)', TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL Cleanup() -!!! RETURN -!!! END IF -!!! -!!! ! Read HAWC_dz -!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%HAWC_dz, 'HAWC_dz', & -!!! 'Number of grids in the z direction (in the 3 files above)', TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL Cleanup() -!!! RETURN -!!! END IF -!!! -!!! ! Read HAWC_RefHt -!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%HAWC_RefHt, 'HAWC_RefHt', & -!!! 'Reference (hub) height of the grid', TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL Cleanup() -!!! RETURN -!!! END IF -!!! -!!! -!!! -!!! !---------------------------------------------------------------------------------------------- -!!! !> Read the _Scaling parameters for turbulence (HAWC-format files) [used only for WindType = 5]_ subsection -!!! !---------------------------------------------------------------------------------------------- -!!! -!!! ! Section separator line -!!! CALL ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line', TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL Cleanup() -!!! RETURN -!!! END IF -!!! -!!! ! Read HAWC_ScaleMethod -!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%HAWC_ScaleMethod, 'HAWC_ScaleMethod', & -!!! 'Turbulence scaling method [0=none, 1=direct scaling, 2= calculate scaling '// & -!!! 'factor based on a desired standard deviation]', TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL Cleanup() -!!! RETURN -!!! END IF -!!! -!!! ! Read HAWC_SFx -!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%HAWC_SFx, 'HAWC_SFx', & -!!! 'Turbulence scaling factor for the x direction [ScaleMethod=1]', TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL Cleanup() -!!! RETURN -!!! END IF -!!! -!!! ! Read HAWC_SFy -!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%HAWC_SFy, 'HAWC_SFy', & -!!! 'Turbulence scaling factor for the y direction [ScaleMethod=1]', TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL Cleanup() -!!! RETURN -!!! END IF -!!! -!!! ! Read HAWC_SFz -!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%HAWC_SFz, 'HAWC_SFz', & -!!! 'Turbulence scaling factor for the z direction [ScaleMethod=1]', TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL Cleanup() -!!! RETURN -!!! END IF -!!! -!!! ! Read HAWC_SigmaFx -!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%HAWC_SigmaFx, 'HAWC_SigmaFx', & -!!! 'Turbulence standard deviation to calculate scaling from in x direction [ScaleMethod=2]', TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL Cleanup() -!!! RETURN -!!! END IF -!!! -!!! ! Read HAWC_SigmaFy -!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%HAWC_SigmaFy, 'HAWC_SigmaFy', & -!!! 'Turbulence standard deviation to calculate scaling from in y direction [ScaleMethod=2]', TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL Cleanup() -!!! RETURN -!!! END IF -!!! -!!! ! Read HAWC_SigmaFz -!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%HAWC_SigmaFz, 'HAWC_SigmaFz', & -!!! 'Turbulence standard deviation to calculate scaling from in z direction [ScaleMethod=2]', TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL Cleanup() -!!! RETURN -!!! END IF -!!! -!!!#ifdef UNUSED_INPUTFILE_LINES -!!! -!!!!FIXME: TStart has no comment -!!! ! Read HAWC_TStart -!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%HAWC_TStart, 'HAWC_TStart', & -!!! '', TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL Cleanup() -!!! RETURN -!!! END IF -!!! -!!!!FIXME: TEnd has no comment -!!! ! Read HAWC_TEnd -!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%HAWC_TEnd, 'HAWC_TEnd', & -!!! '', TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL Cleanup() -!!! RETURN -!!! END IF -!!! -!!!#endif -!!! -!!! !---------------------------------------------------------------------------------------------- -!!! !> Read the _Mean wind profile paramters (added to HAWC-format files) [used only for WindType = 5]_ subsection -!!! !---------------------------------------------------------------------------------------------- -!!! -!!! ! Section separator line -!!! CALL ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line', TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL Cleanup() -!!! RETURN -!!! END IF -!!! -!!! ! Read HAWC_URef -!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%HAWC_URef, 'HAWC_URef', & -!!! 'Mean u-component wind speed at the reference height', TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL Cleanup() -!!! RETURN -!!! END IF -!!! -!!! ! Read HAWC_ProfileType -!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%HAWC_ProfileType, 'HAWC_ProfileType', & -!!! 'Wind profile type (0=constant;1=logarithmic;2=power law)', TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL Cleanup() -!!! RETURN -!!! END IF -!!! -!!! ! Read HAWC_PLExp -!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%HAWC_PLExp, 'HAWC_PLExp', & -!!! 'Power law exponent (used for PL wind profile type only)', TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL Cleanup() -!!! RETURN -!!! END IF -!!! -!!! ! Read HAWC_Z0 -!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%HAWC_Z0, 'HAWC_Z0', & -!!! 'Surface roughness length (used for LOG wind profile type only)', TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL Cleanup() -!!! RETURN -!!! END IF -!!! -!!! -!!! !---------------------- OUTPUT -------------------------------------------------- -!!! CALL ReadCom( UnitInput, InputFileName, 'Section Header: Output', TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL Cleanup() -!!! RETURN -!!! END IF -!!! -!!! ! SumPrint - Print summary data to .IfW.sum (flag): -!!! CALL ReadVar( UnitInput, InputFileName, InputFileData%SumPrint, "SumPrint", "Print summary data to .IfW.sum (flag)", TmpErrStat, TmpErrMsg, UnitEcho) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL Cleanup() -!!! RETURN -!!! END IF -!!! -!!! -!!! !---------------------- OUTLIST -------------------------------------------- -!!! CALL ReadCom( UnitInput, InputFileName, 'Section Header: OutList', TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL Cleanup() -!!! RETURN -!!! END IF -!!! -!!! ! OutList - List of user-requested output channels (-): -- uses routine from the NWTC_Library -!!! CALL ReadOutputList ( UnitInput, InputFileName, InputFileData%OutList, InputFileData%NumOuts, 'OutList', & -!!! "List of user-requested output channels", TmpErrStat, TmpErrMsg, UnitEcho ) -!!! CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) -!!! IF (ErrStat >= AbortErrLev) THEN -!!! CALL Cleanup() -!!! RETURN -!!! END IF -!!! + + call ReadVar( UnitInput, InputFileName, InputFileData%PY_NumPoints, "PY_NumPoints", "Number of PY curve points", TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; + + ! Allocate arrays to hold the information that will be read in next + allocate( InputFileData%PY_locations(InputFileData%PY_NumPoints,3), STAT=TmpErrStat ) + if (TmpErrStat /= 0) then + call SetErrStat(ErrID_Fatal, 'Could not allocate PY_locations', ErrStat, ErrMsg, RoutineName) + return + endif + allocate( InputFileData%PY_inputFile(InputFileData%PY_NumPoints), STAT=TmpErrStat ) + if (TmpErrStat /= 0) then + call SetErrStat(ErrID_Fatal, 'Could not allocate PY_inputFile', ErrStat, ErrMsg, RoutineName) + return + endif + + ! Now read in the set of PY curves + call ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line in PY curve data', TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; + + ! Read in each line of location and input file ( ---- Location (x,y,z) ------- Point InputFile ------------- ) + do i=1,InputFileData%PY_NumPoints + Line = "" + call ReadLine( UnitInput, '', Line, LineLen, TmpErrStat ) + if (TmpErrStat /= 0) then + call SetErrStat( ErrID_Fatal, 'Error reading PY_curve line '//trim(Num2LStr(i))//' from '//InputFileName//'.', ErrStat, ErrMsg, RoutineName) + return + endif + READ( Line, *, IOSTAT=IOS) InputFileData%PY_locations(i,1:3), InputFileData%PY_inputFile(i) + CALL CheckIOS ( IOS, InputFileName, 'DT', NumType, TmpErrStat, TmpErrMsg ); if (Failed()) return; ! NOTE: unclear if the message returned will match what was misread. + + ! Check for relative paths in the file names + if ( PathIsRelative( InputFileData%PY_inputFile(i) ) ) InputFileData%PY_inputFile(i) = TRIM(PriPath)//TRIM(InputFileData%PY_inputFile(i)) + enddo + + + !------------------------------------------------------------------------------------------------- + !> Read REDWIN interface for DLL section [ CalcOption == 3 only ] + !------------------------------------------------------------------------------------------------- + + call ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line', TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; + + call ReadVar( UnitInput, InputFileName, InputFileData%DLL_model, "DLL_model", "REDWIN DLL model used", TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; + + ! DLL_FileName - Name of the Bladed DLL [used only with DLL Interface] (-): + call ReadVar( UnitInput, InputFileName, InputFileData%DLL_FileName, "DLL_FileName", "Name/location of the external library {.dll [Windows]} in the REDWIN-DLL format [used only with CalcOption==3] (-)", TmpErrStat, TmpErrMsg, UnitEcho ) + if ( PathIsRelative( InputFileData%DLL_FileName ) ) InputFileData%DLL_FileName = TRIM(PriPath)//TRIM(InputFileData%DLL_FileName) + + ! DLL_ProcName - Name of procedure to be called in DLL [used only with DLL Interface] (-): + call ReadVar( UnitInput, InputFileName, InputFileData%DLL_ProcName, "DLL_ProcName", "Name of procedure to be called in DLL [used only with DLL Interface] (-)", TmpErrStat, TmpErrMsg, UnitEcho) + + call ReadVar( UnitInput, InputFileName, InputFileData%DLL_NumPoints, "DLL_NumPoints", "Number of DLL interfaces", TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; + + ! Allocate arrays to hold the information that will be read in next + allocate( InputFileData%DLL_locations(InputFileData%DLL_NumPoints,3), STAT=TmpErrStat ) + if (TmpErrStat /= 0) then + call SetErrStat(ErrID_Fatal, 'Could not allocate DLL_locations', ErrStat, ErrMsg, RoutineName) + return + endif + allocate( InputFileData%DLL_PropsFile(InputFileData%DLL_NumPoints), STAT=TmpErrStat ) + if (TmpErrStat /= 0) then + call SetErrStat(ErrID_Fatal, 'Could not allocate DLL_PropsFile', ErrStat, ErrMsg, RoutineName) + return + endif + allocate( InputFileData%DLL_LDispFile(InputFileData%DLL_NumPoints), STAT=TmpErrStat ) + if (TmpErrStat /= 0) then + call SetErrStat(ErrID_Fatal, 'Could not allocate DLL_LDispFile', ErrStat, ErrMsg, RoutineName) + return + endif + + ! Now read in the set of DLL connections + call ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line in DLL data', TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; + + ! Read in each line of location and input file ( ---- Location (x,y,z) ------- Point InputFile ------------- ) + do i=1,InputFileData%DLL_NumPoints + Line = "" + call ReadLine( UnitInput, '', Line, LineLen, TmpErrStat ) + if (TmpErrStat /= 0) then + call SetErrStat( ErrID_Fatal, 'Error reading DLL_curve line '//trim(Num2LStr(i))//' from '//InputFileName//'.', ErrStat, ErrMsg, RoutineName) + return + endif + READ( Line, *, IOSTAT=IOS) InputFileData%DLL_locations(i,1:3), InputFileData%DLL_PropsFile(i), InputFileData%DLL_LDispFile(i) + CALL CheckIOS ( IOS, InputFileName, 'DLL info', NumType, TmpErrStat, TmpErrMsg ); if (Failed()) return; ! NOTE: unclear if the message returned will match what was misread. + + ! Check for relative paths in the file names + if ( PathIsRelative( InputFileData%DLL_PropsFile(i) ) ) InputFileData%DLL_PropsFile(i) = TRIM(PriPath)//TRIM(InputFileData%DLL_PropsFile(i)) + if ( PathIsRelative( InputFileData%DLL_LDispFile(i) ) ) InputFileData%DLL_LDispFile(i) = TRIM(PriPath)//TRIM(InputFileData%DLL_LDispFile(i)) + enddo + + !---------------------- OUTPUT -------------------------------------------------- + CALL ReadCom( UnitInput, InputFileName, 'Section Header: Output', TmpErrStat, TmpErrMsg, UnitEcho ) + CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) + IF (ErrStat >= AbortErrLev) THEN + CALL Cleanup() + RETURN + END IF + + ! SumPrint - Print summary data to .IfW.sum (flag): + CALL ReadVar( UnitInput, InputFileName, InputFileData%SumPrint, "SumPrint", "Print summary data to .SlD.sum (flag)", TmpErrStat, TmpErrMsg, UnitEcho ) + CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) + IF (ErrStat >= AbortErrLev) THEN + CALL Cleanup() + RETURN + END IF + + + !---------------------- OUTLIST -------------------------------------------- + CALL ReadCom( UnitInput, InputFileName, 'Section Header: OutList', TmpErrStat, TmpErrMsg, UnitEcho ) + CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) + IF (ErrStat >= AbortErrLev) THEN + CALL Cleanup() + RETURN + END IF + + ! OutList - List of user-requested output channels (-): -- uses routine from the NWTC_Library + CALL ReadOutputList ( UnitInput, InputFileName, InputFileData%OutList, InputFileData%NumOuts, 'OutList', & + "List of user-requested output channels", TmpErrStat, TmpErrMsg, UnitEcho ) + CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) + IF (ErrStat >= AbortErrLev) THEN + CALL Cleanup() + RETURN + END IF + @@ -825,12 +390,12 @@ END SUBROUTINE SoilDyn_SetParameters !********************************************************************************************************************************** ! NOTE: The following lines of code were generated by a Matlab script called "Write_ChckOutLst.m" -! using the parameters listed in the "OutListParameters.xlsx" Excel file. Any changes to these -! lines should be modified in the Matlab script and/or Excel worksheet as necessary. +! using the parameters listed in the "OutListParameters.xlsx" Excel file. Any changes to these +! lines should be modified in the Matlab script and/or Excel worksheet as necessary. ! This code was generated by Write_ChckOutLst.m at 23-Apr-2015 13:13:13. !---------------------------------------------------------------------------------------------------------------------------------- SUBROUTINE SetOutParam(OutList, p, ErrStat, ErrMsg ) -! This routine checks to see if any requested output channel names (stored in the OutList(:)) are invalid. It returns a +! This routine checks to see if any requested output channel names (stored in the OutList(:)) are invalid. It returns a ! warning if any of the channels are not available outputs from the module. ! It assigns the settings for OutParam(:) (i.e, the index, name, and units of the output channels, WriteOutput(:)). ! the sign is set to 0 if the channel is invalid. @@ -848,7 +413,7 @@ SUBROUTINE SetOutParam(OutList, p, ErrStat, ErrMsg ) INTEGER :: I ! Generic loop-counting index INTEGER :: J ! Generic loop-counting index INTEGER :: INDX ! Index for valid arrays - + LOGICAL :: CheckOutListAgain ! Flag used to determine if output parameter starting with "M" is valid (or the negative of another parameter) LOGICAL :: InvalidOutput(0:MaxOutPts) ! This array determines if the output channel is valid for this configuration CHARACTER(ChanLen) :: OutListTmp ! A string to temporarily hold OutList(I) @@ -883,14 +448,14 @@ SUBROUTINE SetOutParam(OutList, p, ErrStat, ErrMsg ) !!!! ..... Developer must add checking for invalid inputs here: ..... !!! ! NOTE: we are not checking that the coordinates input for the WindVxi, WindVyi, and WindVzi are valid here. We are !!! ! checking that at the input file validation (they simply get zeroed with a warning if there is an issue). -!!! +!!! !!! ! make sure we don't ask for outputs that don't exist: -!!! DO I = p%NWindVel+1, 9 +!!! DO I = p%NWindVel+1, 9 !!! InvalidOutput( WindVelX(I) ) = .TRUE. !!! InvalidOutput( WindVelY(I) ) = .TRUE. -!!! InvalidOutput( WindVelZ(I) ) = .TRUE. -!!! END DO -!!! +!!! InvalidOutput( WindVelZ(I) ) = .TRUE. +!!! END DO +!!! !!! DO I=p%lidar%NumPulseGate+1,5 !!! InvalidOutput( WindMeas(I) ) = .TRUE. !!! END DO @@ -997,18 +562,18 @@ SUBROUTINE SetAllOuts( p, y, m, ErrStat, ErrMsg ) ! ! We set the unused values to 0 at init, so we don't need to set them again here: ! DO I = 1,p%NWindVel -! +! ! m%AllOuts( WindVelX(I) ) = m%WindViUVW(1,I) ! m%AllOuts( WindVelY(I) ) = m%WindViUVW(2,I) -! m%AllOuts( WindVelZ(I) ) = m%WindViUVW(3,I) -! +! m%AllOuts( WindVelZ(I) ) = m%WindViUVW(3,I) +! ! END DO -! +! ! !FIXME: Add in Wind1Dir, Wind1Mag etc. -- allthough those can be derived outside of FAST. ! ! DO I = 1,MIN(5, p%lidar%NumPulseGate ) ! m%AllOuts( WindMeas(I) ) = y%lidar%lidSpeed(I) -! END DO +! END DO END SUBROUTINE SetAllOuts !==================================================================================================== @@ -1065,6 +630,6 @@ SUBROUTINE SoilDyn_CloseSumFile( SumFileUnit, ErrStat, ErrMsg ) END SUBROUTINE SoilDyn_CloseSumFile !==================================================================================================== - + !********************************************************************************************************************************** END MODULE SoilDyn_IO diff --git a/modules/soildyn/src/SoilDyn_Registry.txt b/modules/soildyn/src/SoilDyn_Registry.txt index 1a2451f53..8f703181a 100644 --- a/modules/soildyn/src/SoilDyn_Registry.txt +++ b/modules/soildyn/src/SoilDyn_Registry.txt @@ -31,18 +31,23 @@ typedef ^ REDWINdllType R8Ki D {6}{6} # SoilDyn input file typedef ^ SlD_InputFile LOGICAL EchoFlag - - - "Echo the input file" - +typedef ^ SlD_InputFile CHARACTER(ChanLen) OutList : - - "List of user-requested output channels" - +typedef ^ SlD_InputFile R8Ki DT - - - "Timestep requested" '(s)' +typedef ^ SlD_InputFile IntKi CalcOption - - - "Calculation methodology to use" - +typedef ^ SlD_InputFile ReKi Stiffness {6}{6} - - "Stiffness matrix 6x6" '(N/m, N-m/m)' +typedef ^ SlD_InputFile ReKi Damping {6}{6} - - "Damping ratio matrix 6x6" - +typedef ^ SlD_InputFile IntKi PY_numpoints - - - "Number of P-Y curve mesh points" - +typedef ^ SlD_InputFile ReKi PY_locations :: - - "P-Y curve location points for mesh" '(m)' +typedef ^ SlD_InputFile character(1024) PY_inputFile : - - "Input file with P-Y curve data" - +typedef ^ SlD_InputFile IntKi DLL_model - - - "REDWIN DLL model type to use" - typedef ^ SlD_InputFile CHARACTER(1024) DLL_FileName - - - "Name of the DLL file including the full path" - typedef ^ SlD_InputFile CHARACTER(1024) DLL_ProcName - - - "Name of the procedure in the DLL that will be called" - -typedef ^ SlD_InputFile CHARACTER(1024) DLL_PROPSFILE - - - "Name of PROPSFILE input file used in DLL" - -typedef ^ SlD_InputFile CHARACTER(1024) DLL_LDISPFILE - - - "Name of LDISPFILE input file used in DLL" - -typedef ^ ^ CHARACTER(ChanLen) OutList : - - "List of user-requested output channels" - -typedef ^ ^ R8Ki DT - - - "Timestep requested" '(s)' -typedef ^ ^ IntKi CalcOption - - - "Calculation methodology to use" - -typedef ^ ^ ReKi Stiffness {6}{6} - - "Stiffness matrix 6x6" '(N/m, N-m/m)' -typedef ^ ^ ReKi Damping {6}{6} - - "Damping ratio matrix 6x6" - -typedef ^ ^ character(1024) PY_inputFile - - - "Input file with P-Y curve data" - -typedef ^ ^ IntKi PY_numpoints - - - "Number of P-Y curve mesh points" - -typedef ^ ^ ReKi PY_locations :: - - "P-Y curve location points for mesh" '(m)' +typedef ^ SlD_InputFile IntKi DLL_numpoints - - - "Number of points to interface to DLL" - +typedef ^ SlD_InputFile ReKi DLL_locations :: - - "DLL location points for mesh" '(m)' +typedef ^ SlD_InputFile CHARACTER(1024) DLL_PROPSFILE : - - "Name of PROPSFILE input file used in DLL" - +typedef ^ SlD_InputFile CHARACTER(1024) DLL_LDISPFILE : - - "Name of LDISPFILE input file used in DLL" - +typedef ^ SlD_InputFile LOGICAL SumPrint - - - "Print summary information to file (.SlD.sum)" - +typedef ^ SlD_InputFile IntKi NumOuts - - - "Number of outputs requested" - # ..... Initialization data ....................................................................................................... # Define inputs that the initialization routine may need here: diff --git a/modules/soildyn/src/SoilDyn_Types.f90 b/modules/soildyn/src/SoilDyn_Types.f90 index a9d7f5f56..f247e49ce 100644 --- a/modules/soildyn/src/SoilDyn_Types.f90 +++ b/modules/soildyn/src/SoilDyn_Types.f90 @@ -51,18 +51,23 @@ MODULE SoilDyn_Types ! ========= SlD_InputFile ======= TYPE, PUBLIC :: SlD_InputFile LOGICAL :: EchoFlag !< Echo the input file [-] - CHARACTER(1024) :: DLL_FileName !< Name of the DLL file including the full path [-] - CHARACTER(1024) :: DLL_ProcName !< Name of the procedure in the DLL that will be called [-] - CHARACTER(1024) :: DLL_PROPSFILE !< Name of PROPSFILE input file used in DLL [-] - CHARACTER(1024) :: DLL_LDISPFILE !< Name of LDISPFILE input file used in DLL [-] CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: OutList !< List of user-requested output channels [-] REAL(R8Ki) :: DT !< Timestep requested ['(s)'] INTEGER(IntKi) :: CalcOption !< Calculation methodology to use [-] REAL(ReKi) , DIMENSION(1:6,1:6) :: Stiffness !< Stiffness matrix 6x6 ['(N/m,] REAL(ReKi) , DIMENSION(1:6,1:6) :: Damping !< Damping ratio matrix 6x6 [-] - character(1024) :: PY_inputFile !< Input file with P-Y curve data [-] INTEGER(IntKi) :: PY_numpoints !< Number of P-Y curve mesh points [-] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: PY_locations !< P-Y curve location points for mesh ['(m)'] + character(1024) , DIMENSION(:), ALLOCATABLE :: PY_inputFile !< Input file with P-Y curve data [-] + INTEGER(IntKi) :: DLL_model !< REDWIN DLL model type to use [-] + CHARACTER(1024) :: DLL_FileName !< Name of the DLL file including the full path [-] + CHARACTER(1024) :: DLL_ProcName !< Name of the procedure in the DLL that will be called [-] + INTEGER(IntKi) :: DLL_numpoints !< Number of points to interface to DLL [-] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: DLL_locations !< DLL location points for mesh ['(m)'] + CHARACTER(1024) , DIMENSION(:), ALLOCATABLE :: DLL_PROPSFILE !< Name of PROPSFILE input file used in DLL [-] + CHARACTER(1024) , DIMENSION(:), ALLOCATABLE :: DLL_LDISPFILE !< Name of LDISPFILE input file used in DLL [-] + LOGICAL :: SumPrint !< Print summary information to file (.SlD.sum) [-] + INTEGER(IntKi) :: NumOuts !< Number of outputs requested [-] END TYPE SlD_InputFile ! ======================= ! ========= SlD_InitInputType ======= @@ -415,10 +420,6 @@ SUBROUTINE SlD_CopyInputFile( SrcInputFileData, DstInputFileData, CtrlCode, ErrS ErrStat = ErrID_None ErrMsg = "" DstInputFileData%EchoFlag = SrcInputFileData%EchoFlag - DstInputFileData%DLL_FileName = SrcInputFileData%DLL_FileName - DstInputFileData%DLL_ProcName = SrcInputFileData%DLL_ProcName - DstInputFileData%DLL_PROPSFILE = SrcInputFileData%DLL_PROPSFILE - DstInputFileData%DLL_LDISPFILE = SrcInputFileData%DLL_LDISPFILE IF (ALLOCATED(SrcInputFileData%OutList)) THEN i1_l = LBOUND(SrcInputFileData%OutList,1) i1_u = UBOUND(SrcInputFileData%OutList,1) @@ -435,7 +436,6 @@ SUBROUTINE SlD_CopyInputFile( SrcInputFileData, DstInputFileData, CtrlCode, ErrS DstInputFileData%CalcOption = SrcInputFileData%CalcOption DstInputFileData%Stiffness = SrcInputFileData%Stiffness DstInputFileData%Damping = SrcInputFileData%Damping - DstInputFileData%PY_inputFile = SrcInputFileData%PY_inputFile DstInputFileData%PY_numpoints = SrcInputFileData%PY_numpoints IF (ALLOCATED(SrcInputFileData%PY_locations)) THEN i1_l = LBOUND(SrcInputFileData%PY_locations,1) @@ -451,6 +451,62 @@ SUBROUTINE SlD_CopyInputFile( SrcInputFileData, DstInputFileData, CtrlCode, ErrS END IF DstInputFileData%PY_locations = SrcInputFileData%PY_locations ENDIF +IF (ALLOCATED(SrcInputFileData%PY_inputFile)) THEN + i1_l = LBOUND(SrcInputFileData%PY_inputFile,1) + i1_u = UBOUND(SrcInputFileData%PY_inputFile,1) + IF (.NOT. ALLOCATED(DstInputFileData%PY_inputFile)) THEN + ALLOCATE(DstInputFileData%PY_inputFile(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInputFileData%PY_inputFile.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInputFileData%PY_inputFile = SrcInputFileData%PY_inputFile +ENDIF + DstInputFileData%DLL_model = SrcInputFileData%DLL_model + DstInputFileData%DLL_FileName = SrcInputFileData%DLL_FileName + DstInputFileData%DLL_ProcName = SrcInputFileData%DLL_ProcName + DstInputFileData%DLL_numpoints = SrcInputFileData%DLL_numpoints +IF (ALLOCATED(SrcInputFileData%DLL_locations)) THEN + i1_l = LBOUND(SrcInputFileData%DLL_locations,1) + i1_u = UBOUND(SrcInputFileData%DLL_locations,1) + i2_l = LBOUND(SrcInputFileData%DLL_locations,2) + i2_u = UBOUND(SrcInputFileData%DLL_locations,2) + IF (.NOT. ALLOCATED(DstInputFileData%DLL_locations)) THEN + ALLOCATE(DstInputFileData%DLL_locations(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInputFileData%DLL_locations.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInputFileData%DLL_locations = SrcInputFileData%DLL_locations +ENDIF +IF (ALLOCATED(SrcInputFileData%DLL_PROPSFILE)) THEN + i1_l = LBOUND(SrcInputFileData%DLL_PROPSFILE,1) + i1_u = UBOUND(SrcInputFileData%DLL_PROPSFILE,1) + IF (.NOT. ALLOCATED(DstInputFileData%DLL_PROPSFILE)) THEN + ALLOCATE(DstInputFileData%DLL_PROPSFILE(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInputFileData%DLL_PROPSFILE.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInputFileData%DLL_PROPSFILE = SrcInputFileData%DLL_PROPSFILE +ENDIF +IF (ALLOCATED(SrcInputFileData%DLL_LDISPFILE)) THEN + i1_l = LBOUND(SrcInputFileData%DLL_LDISPFILE,1) + i1_u = UBOUND(SrcInputFileData%DLL_LDISPFILE,1) + IF (.NOT. ALLOCATED(DstInputFileData%DLL_LDISPFILE)) THEN + ALLOCATE(DstInputFileData%DLL_LDISPFILE(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInputFileData%DLL_LDISPFILE.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInputFileData%DLL_LDISPFILE = SrcInputFileData%DLL_LDISPFILE +ENDIF + DstInputFileData%SumPrint = SrcInputFileData%SumPrint + DstInputFileData%NumOuts = SrcInputFileData%NumOuts END SUBROUTINE SlD_CopyInputFile SUBROUTINE SlD_DestroyInputFile( InputFileData, ErrStat, ErrMsg ) @@ -467,6 +523,18 @@ SUBROUTINE SlD_DestroyInputFile( InputFileData, ErrStat, ErrMsg ) ENDIF IF (ALLOCATED(InputFileData%PY_locations)) THEN DEALLOCATE(InputFileData%PY_locations) +ENDIF +IF (ALLOCATED(InputFileData%PY_inputFile)) THEN + DEALLOCATE(InputFileData%PY_inputFile) +ENDIF +IF (ALLOCATED(InputFileData%DLL_locations)) THEN + DEALLOCATE(InputFileData%DLL_locations) +ENDIF +IF (ALLOCATED(InputFileData%DLL_PROPSFILE)) THEN + DEALLOCATE(InputFileData%DLL_PROPSFILE) +ENDIF +IF (ALLOCATED(InputFileData%DLL_LDISPFILE)) THEN + DEALLOCATE(InputFileData%DLL_LDISPFILE) ENDIF END SUBROUTINE SlD_DestroyInputFile @@ -506,10 +574,6 @@ SUBROUTINE SlD_PackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs Db_BufSz = 0 Int_BufSz = 0 Int_BufSz = Int_BufSz + 1 ! EchoFlag - Int_BufSz = Int_BufSz + 1*LEN(InData%DLL_FileName) ! DLL_FileName - Int_BufSz = Int_BufSz + 1*LEN(InData%DLL_ProcName) ! DLL_ProcName - Int_BufSz = Int_BufSz + 1*LEN(InData%DLL_PROPSFILE) ! DLL_PROPSFILE - Int_BufSz = Int_BufSz + 1*LEN(InData%DLL_LDISPFILE) ! DLL_LDISPFILE Int_BufSz = Int_BufSz + 1 ! OutList allocated yes/no IF ( ALLOCATED(InData%OutList) ) THEN Int_BufSz = Int_BufSz + 2*1 ! OutList upper/lower bounds for each dimension @@ -519,13 +583,38 @@ SUBROUTINE SlD_PackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs Int_BufSz = Int_BufSz + 1 ! CalcOption Re_BufSz = Re_BufSz + SIZE(InData%Stiffness) ! Stiffness Re_BufSz = Re_BufSz + SIZE(InData%Damping) ! Damping - Int_BufSz = Int_BufSz + 1*LEN(InData%PY_inputFile) ! PY_inputFile Int_BufSz = Int_BufSz + 1 ! PY_numpoints Int_BufSz = Int_BufSz + 1 ! PY_locations allocated yes/no IF ( ALLOCATED(InData%PY_locations) ) THEN Int_BufSz = Int_BufSz + 2*2 ! PY_locations upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%PY_locations) ! PY_locations END IF + Int_BufSz = Int_BufSz + 1 ! PY_inputFile allocated yes/no + IF ( ALLOCATED(InData%PY_inputFile) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! PY_inputFile upper/lower bounds for each dimension + Int_BufSz = Int_BufSz + SIZE(InData%PY_inputFile)*LEN(InData%PY_inputFile) ! PY_inputFile + END IF + Int_BufSz = Int_BufSz + 1 ! DLL_model + Int_BufSz = Int_BufSz + 1*LEN(InData%DLL_FileName) ! DLL_FileName + Int_BufSz = Int_BufSz + 1*LEN(InData%DLL_ProcName) ! DLL_ProcName + Int_BufSz = Int_BufSz + 1 ! DLL_numpoints + Int_BufSz = Int_BufSz + 1 ! DLL_locations allocated yes/no + IF ( ALLOCATED(InData%DLL_locations) ) THEN + Int_BufSz = Int_BufSz + 2*2 ! DLL_locations upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%DLL_locations) ! DLL_locations + END IF + Int_BufSz = Int_BufSz + 1 ! DLL_PROPSFILE allocated yes/no + IF ( ALLOCATED(InData%DLL_PROPSFILE) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! DLL_PROPSFILE upper/lower bounds for each dimension + Int_BufSz = Int_BufSz + SIZE(InData%DLL_PROPSFILE)*LEN(InData%DLL_PROPSFILE) ! DLL_PROPSFILE + END IF + Int_BufSz = Int_BufSz + 1 ! DLL_LDISPFILE allocated yes/no + IF ( ALLOCATED(InData%DLL_LDISPFILE) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! DLL_LDISPFILE upper/lower bounds for each dimension + Int_BufSz = Int_BufSz + SIZE(InData%DLL_LDISPFILE)*LEN(InData%DLL_LDISPFILE) ! DLL_LDISPFILE + END IF + Int_BufSz = Int_BufSz + 1 ! SumPrint + Int_BufSz = Int_BufSz + 1 ! NumOuts IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) THEN @@ -555,22 +644,6 @@ SUBROUTINE SlD_PackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs IntKiBuf ( Int_Xferred:Int_Xferred+1-1 ) = TRANSFER( InData%EchoFlag , IntKiBuf(1), 1) Int_Xferred = Int_Xferred + 1 - DO I = 1, LEN(InData%DLL_FileName) - IntKiBuf(Int_Xferred) = ICHAR(InData%DLL_FileName(I:I), IntKi) - Int_Xferred = Int_Xferred + 1 - END DO ! I - DO I = 1, LEN(InData%DLL_ProcName) - IntKiBuf(Int_Xferred) = ICHAR(InData%DLL_ProcName(I:I), IntKi) - Int_Xferred = Int_Xferred + 1 - END DO ! I - DO I = 1, LEN(InData%DLL_PROPSFILE) - IntKiBuf(Int_Xferred) = ICHAR(InData%DLL_PROPSFILE(I:I), IntKi) - Int_Xferred = Int_Xferred + 1 - END DO ! I - DO I = 1, LEN(InData%DLL_LDISPFILE) - IntKiBuf(Int_Xferred) = ICHAR(InData%DLL_LDISPFILE(I:I), IntKi) - Int_Xferred = Int_Xferred + 1 - END DO ! I IF ( .NOT. ALLOCATED(InData%OutList) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 @@ -596,10 +669,6 @@ SUBROUTINE SlD_PackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs Re_Xferred = Re_Xferred + SIZE(InData%Stiffness) ReKiBuf ( Re_Xferred:Re_Xferred+(SIZE(InData%Damping))-1 ) = PACK(InData%Damping,.TRUE.) Re_Xferred = Re_Xferred + SIZE(InData%Damping) - DO I = 1, LEN(InData%PY_inputFile) - IntKiBuf(Int_Xferred) = ICHAR(InData%PY_inputFile(I:I), IntKi) - Int_Xferred = Int_Xferred + 1 - END DO ! I IntKiBuf ( Int_Xferred:Int_Xferred+(1)-1 ) = InData%PY_numpoints Int_Xferred = Int_Xferred + 1 IF ( .NOT. ALLOCATED(InData%PY_locations) ) THEN @@ -618,6 +687,89 @@ SUBROUTINE SlD_PackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs IF (SIZE(InData%PY_locations)>0) ReKiBuf ( Re_Xferred:Re_Xferred+(SIZE(InData%PY_locations))-1 ) = PACK(InData%PY_locations,.TRUE.) Re_Xferred = Re_Xferred + SIZE(InData%PY_locations) END IF + IF ( .NOT. ALLOCATED(InData%PY_inputFile) ) 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%PY_inputFile,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%PY_inputFile,1) + Int_Xferred = Int_Xferred + 2 + + DO i1 = LBOUND(InData%PY_inputFile,1), UBOUND(InData%PY_inputFile,1) + DO I = 1, LEN(InData%PY_inputFile) + IntKiBuf(Int_Xferred) = ICHAR(InData%PY_inputFile(i1)(I:I), IntKi) + Int_Xferred = Int_Xferred + 1 + END DO ! I + END DO !i1 + END IF + IntKiBuf ( Int_Xferred:Int_Xferred+(1)-1 ) = InData%DLL_model + Int_Xferred = Int_Xferred + 1 + DO I = 1, LEN(InData%DLL_FileName) + IntKiBuf(Int_Xferred) = ICHAR(InData%DLL_FileName(I:I), IntKi) + Int_Xferred = Int_Xferred + 1 + END DO ! I + DO I = 1, LEN(InData%DLL_ProcName) + IntKiBuf(Int_Xferred) = ICHAR(InData%DLL_ProcName(I:I), IntKi) + Int_Xferred = Int_Xferred + 1 + END DO ! I + IntKiBuf ( Int_Xferred:Int_Xferred+(1)-1 ) = InData%DLL_numpoints + Int_Xferred = Int_Xferred + 1 + IF ( .NOT. ALLOCATED(InData%DLL_locations) ) 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%DLL_locations,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%DLL_locations,1) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%DLL_locations,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%DLL_locations,2) + Int_Xferred = Int_Xferred + 2 + + IF (SIZE(InData%DLL_locations)>0) ReKiBuf ( Re_Xferred:Re_Xferred+(SIZE(InData%DLL_locations))-1 ) = PACK(InData%DLL_locations,.TRUE.) + Re_Xferred = Re_Xferred + SIZE(InData%DLL_locations) + END IF + IF ( .NOT. ALLOCATED(InData%DLL_PROPSFILE) ) 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%DLL_PROPSFILE,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%DLL_PROPSFILE,1) + Int_Xferred = Int_Xferred + 2 + + DO i1 = LBOUND(InData%DLL_PROPSFILE,1), UBOUND(InData%DLL_PROPSFILE,1) + DO I = 1, LEN(InData%DLL_PROPSFILE) + IntKiBuf(Int_Xferred) = ICHAR(InData%DLL_PROPSFILE(i1)(I:I), IntKi) + Int_Xferred = Int_Xferred + 1 + END DO ! I + END DO !i1 + END IF + IF ( .NOT. ALLOCATED(InData%DLL_LDISPFILE) ) 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%DLL_LDISPFILE,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%DLL_LDISPFILE,1) + Int_Xferred = Int_Xferred + 2 + + DO i1 = LBOUND(InData%DLL_LDISPFILE,1), UBOUND(InData%DLL_LDISPFILE,1) + DO I = 1, LEN(InData%DLL_LDISPFILE) + IntKiBuf(Int_Xferred) = ICHAR(InData%DLL_LDISPFILE(i1)(I:I), IntKi) + Int_Xferred = Int_Xferred + 1 + END DO ! I + END DO !i1 + END IF + IntKiBuf ( Int_Xferred:Int_Xferred+1-1 ) = TRANSFER( InData%SumPrint , IntKiBuf(1), 1) + Int_Xferred = Int_Xferred + 1 + IntKiBuf ( Int_Xferred:Int_Xferred+(1)-1 ) = InData%NumOuts + Int_Xferred = Int_Xferred + 1 END SUBROUTINE SlD_PackInputFile SUBROUTINE SlD_UnPackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) @@ -656,22 +808,6 @@ SUBROUTINE SlD_UnPackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er Int_Xferred = 1 OutData%EchoFlag = TRANSFER( IntKiBuf( Int_Xferred ), mask0 ) Int_Xferred = Int_Xferred + 1 - DO I = 1, LEN(OutData%DLL_FileName) - OutData%DLL_FileName(I:I) = CHAR(IntKiBuf(Int_Xferred)) - Int_Xferred = Int_Xferred + 1 - END DO ! I - DO I = 1, LEN(OutData%DLL_ProcName) - OutData%DLL_ProcName(I:I) = CHAR(IntKiBuf(Int_Xferred)) - Int_Xferred = Int_Xferred + 1 - END DO ! I - DO I = 1, LEN(OutData%DLL_PROPSFILE) - OutData%DLL_PROPSFILE(I:I) = CHAR(IntKiBuf(Int_Xferred)) - Int_Xferred = Int_Xferred + 1 - END DO ! I - DO I = 1, LEN(OutData%DLL_LDISPFILE) - OutData%DLL_LDISPFILE(I:I) = CHAR(IntKiBuf(Int_Xferred)) - Int_Xferred = Int_Xferred + 1 - END DO ! I IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! OutList not allocated Int_Xferred = Int_Xferred + 1 ELSE @@ -729,10 +865,6 @@ SUBROUTINE SlD_UnPackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er OutData%Damping = UNPACK(ReKiBuf( Re_Xferred:Re_Xferred+(SIZE(OutData%Damping))-1 ), mask2, 0.0_ReKi ) Re_Xferred = Re_Xferred + SIZE(OutData%Damping) DEALLOCATE(mask2) - DO I = 1, LEN(OutData%PY_inputFile) - OutData%PY_inputFile(I:I) = CHAR(IntKiBuf(Int_Xferred)) - Int_Xferred = Int_Xferred + 1 - END DO ! I OutData%PY_numpoints = IntKiBuf( Int_Xferred ) Int_Xferred = Int_Xferred + 1 IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! PY_locations not allocated @@ -761,6 +893,129 @@ SUBROUTINE SlD_UnPackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er Re_Xferred = Re_Xferred + SIZE(OutData%PY_locations) DEALLOCATE(mask2) END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! PY_inputFile 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 (ALLOCATED(OutData%PY_inputFile)) DEALLOCATE(OutData%PY_inputFile) + ALLOCATE(OutData%PY_inputFile(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%PY_inputFile.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + ALLOCATE(mask1(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating mask1.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + mask1 = .TRUE. + DO i1 = LBOUND(OutData%PY_inputFile,1), UBOUND(OutData%PY_inputFile,1) + DO I = 1, LEN(OutData%PY_inputFile) + OutData%PY_inputFile(i1)(I:I) = CHAR(IntKiBuf(Int_Xferred)) + Int_Xferred = Int_Xferred + 1 + END DO ! I + END DO !i1 + DEALLOCATE(mask1) + END IF + OutData%DLL_model = IntKiBuf( Int_Xferred ) + Int_Xferred = Int_Xferred + 1 + DO I = 1, LEN(OutData%DLL_FileName) + OutData%DLL_FileName(I:I) = CHAR(IntKiBuf(Int_Xferred)) + Int_Xferred = Int_Xferred + 1 + END DO ! I + DO I = 1, LEN(OutData%DLL_ProcName) + OutData%DLL_ProcName(I:I) = CHAR(IntKiBuf(Int_Xferred)) + Int_Xferred = Int_Xferred + 1 + END DO ! I + OutData%DLL_numpoints = IntKiBuf( Int_Xferred ) + Int_Xferred = Int_Xferred + 1 + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! DLL_locations 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 + i2_l = IntKiBuf( Int_Xferred ) + i2_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ALLOCATED(OutData%DLL_locations)) DEALLOCATE(OutData%DLL_locations) + ALLOCATE(OutData%DLL_locations(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%DLL_locations.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + ALLOCATE(mask2(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating mask2.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + mask2 = .TRUE. + IF (SIZE(OutData%DLL_locations)>0) OutData%DLL_locations = UNPACK(ReKiBuf( Re_Xferred:Re_Xferred+(SIZE(OutData%DLL_locations))-1 ), mask2, 0.0_ReKi ) + Re_Xferred = Re_Xferred + SIZE(OutData%DLL_locations) + DEALLOCATE(mask2) + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! DLL_PROPSFILE 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 (ALLOCATED(OutData%DLL_PROPSFILE)) DEALLOCATE(OutData%DLL_PROPSFILE) + ALLOCATE(OutData%DLL_PROPSFILE(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%DLL_PROPSFILE.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + ALLOCATE(mask1(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating mask1.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + mask1 = .TRUE. + DO i1 = LBOUND(OutData%DLL_PROPSFILE,1), UBOUND(OutData%DLL_PROPSFILE,1) + DO I = 1, LEN(OutData%DLL_PROPSFILE) + OutData%DLL_PROPSFILE(i1)(I:I) = CHAR(IntKiBuf(Int_Xferred)) + Int_Xferred = Int_Xferred + 1 + END DO ! I + END DO !i1 + DEALLOCATE(mask1) + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! DLL_LDISPFILE 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 (ALLOCATED(OutData%DLL_LDISPFILE)) DEALLOCATE(OutData%DLL_LDISPFILE) + ALLOCATE(OutData%DLL_LDISPFILE(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%DLL_LDISPFILE.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + ALLOCATE(mask1(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating mask1.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + mask1 = .TRUE. + DO i1 = LBOUND(OutData%DLL_LDISPFILE,1), UBOUND(OutData%DLL_LDISPFILE,1) + DO I = 1, LEN(OutData%DLL_LDISPFILE) + OutData%DLL_LDISPFILE(i1)(I:I) = CHAR(IntKiBuf(Int_Xferred)) + Int_Xferred = Int_Xferred + 1 + END DO ! I + END DO !i1 + DEALLOCATE(mask1) + END IF + OutData%SumPrint = TRANSFER( IntKiBuf( Int_Xferred ), mask0 ) + Int_Xferred = Int_Xferred + 1 + OutData%NumOuts = IntKiBuf( Int_Xferred ) + Int_Xferred = Int_Xferred + 1 END SUBROUTINE SlD_UnPackInputFile SUBROUTINE SlD_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, ErrStat, ErrMsg ) From 4be8c0b7a9b2900d4031961c795a5b073bb3bf14 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Fri, 7 Feb 2020 16:38:49 -0700 Subject: [PATCH 018/136] SoilDyn: add some echo file info on points used --- modules/soildyn/src/SoilDyn_IO.f90 | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/modules/soildyn/src/SoilDyn_IO.f90 b/modules/soildyn/src/SoilDyn_IO.f90 index a0ab8f02b..7f5b61275 100644 --- a/modules/soildyn/src/SoilDyn_IO.f90 +++ b/modules/soildyn/src/SoilDyn_IO.f90 @@ -207,6 +207,12 @@ subroutine SoilDyn_ReadInput( InputFileName, EchoFileName, InputFileData, ErrSta ! Check for relative paths in the file names if ( PathIsRelative( InputFileData%PY_inputFile(i) ) ) InputFileData%PY_inputFile(i) = TRIM(PriPath)//TRIM(InputFileData%PY_inputFile(i)) + + ! Add stuff to echo file if it is used + if ( InputFileData%EchoFlag ) then + write(UnitEcho,*) ' Location ('//trim(Num2LStr(i))//')' + write(UnitEcho,*) InputFileData%PY_locations(i,1:3), trim(InputFileData%PY_inputFile(i)) + endif enddo @@ -261,6 +267,12 @@ subroutine SoilDyn_ReadInput( InputFileName, EchoFileName, InputFileData, ErrSta ! Check for relative paths in the file names if ( PathIsRelative( InputFileData%DLL_PropsFile(i) ) ) InputFileData%DLL_PropsFile(i) = TRIM(PriPath)//TRIM(InputFileData%DLL_PropsFile(i)) if ( PathIsRelative( InputFileData%DLL_LDispFile(i) ) ) InputFileData%DLL_LDispFile(i) = TRIM(PriPath)//TRIM(InputFileData%DLL_LDispFile(i)) + + ! Add stuff to echo file if it is used + if ( InputFileData%EchoFlag ) then + write(UnitEcho,*) ' Location ('//trim(Num2LStr(i))//')' + write(UnitEcho,*) InputFileData%DLL_locations(i,1:3), trim(InputFileData%DLL_PropsFile(i)), ' ',trim(InputFileData%DLL_LDispFile(i)) + endif enddo !---------------------- OUTPUT -------------------------------------------------- From af220929dae2b3bdbc4943bcc0a3cb86cb12e86d Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Mon, 10 Feb 2020 09:09:46 -0700 Subject: [PATCH 019/136] SoilDyn: DLL input file handling --- modules/soildyn/src/REDWINinterface.f90 | 8 +++++- modules/soildyn/src/SoilDyn.f90 | 36 ++++++++++++++++--------- 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/modules/soildyn/src/REDWINinterface.f90 b/modules/soildyn/src/REDWINinterface.f90 index 2a4f1aa36..7adea9114 100644 --- a/modules/soildyn/src/REDWINinterface.f90 +++ b/modules/soildyn/src/REDWINinterface.f90 @@ -24,6 +24,11 @@ MODULE REDWINinterface IMPLICIT NONE + INTEGER(IntKi), PARAMETER :: IDtask_unkown = 0_IntKi ! Unknown task (placeholder for error checking) + INTEGER(IntKi), PARAMETER :: IDtask_init = 1_IntKi ! Initialize DLL + INTEGER(IntKi), PARAMETER :: IDtask_calc = 2_IntKi ! Calculate resultant force + INTEGER(IntKi), PARAMETER :: IDtask_stiff = 3_IntKi ! Return stiffness 6x6 + !> Definition of the DLL Interface (from REDWIN): abstract interface subroutine REDWINdll_interface_v00(PROPSFILE, LDISPFILE, IDTask, nErrorCode, ErrorCode, Props, StVar, StVarPrint, Disp, Force, D) @@ -172,7 +177,8 @@ subroutine REDWINinterface_Init(u,p,dll_data,y,InputFileData, ErrStat, ErrMsg) #ifdef NO_LibLoad CALL SetErrStat( ErrID_Warn,' --> Skipping DynamicLib call for '//TRIM(p%DLL_Trgt%FileName),ErrStat,ErrMsg,RoutineName ) #else - ! Initialize DLL + ! Initialize DLL + dll_data%IDtask = IDtask_init CALL CallREDWINdll(u, p%DLL_Trgt, dll_data, p, ErrStat2, ErrMsg2) CALL CheckError(ErrStat2,ErrMsg2) IF ( ErrStat >= AbortErrLev ) RETURN diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index 5b742aebe..244552bae 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -78,9 +78,10 @@ subroutine SoilDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None ! local variables - integer(IntKi) :: NumOuts ! number of outputs; would probably be in the parameter type - integer(IntKi) :: ErrStat2 ! local error status - character(ErrMsgLen) :: ErrMsg2 ! local error message + integer(IntKi) :: i !< generic counter + integer(IntKi) :: NumOuts !< number of outputs; would probably be in the parameter type + integer(IntKi) :: ErrStat2 !< local error status + character(ErrMsgLen) :: ErrMsg2 !< local error message character(*), parameter :: RoutineName = 'SoilDyn_Init' type(SlD_InputFile) :: InputFileData !< Data stored in the module's input file character(1024) :: EchoFileName @@ -141,22 +142,31 @@ subroutine SoilDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In end if -!FIXME: quick hack for setup call -!FIXME: add input file parsing -InputFileData%DLL_ProcName = 'INTERFACEFOUNDATION' ! The name of the procedure in the DLL that will be called. -InputFileData%DLL_FileName = 'REDWINmodel1-2.0_x86.dll' ! 32 bit version for model 1 - ! Initialize the DLL for each interface point - allocate( m%dll_data(1), STAT=ErrStat2 ) + ! Set DLL parameters + + ! Initialize the DLL for each interface point + allocate( m%dll_data(InputFileData%DLL_NumPoints), STAT=ErrStat2 ) if (ErrStat2 /= 0) then call SetErrStat(ErrID_Fatal, 'Could not allocate m%dll_data', ErrStat, ErrMsg, RoutineName) return endif -m%dll_data(1)%PROPSfile = 'Props.txt' -m%dll_data(1)%LDISPfile = 'LoadDisplacement.txt' -m%dll_data(1)%IDtask = 1 - + do i=1,InputFileData%DLL_NumPoints + m%dll_data(i)%PROPSfile = trim(InputFileData%DLL_PropsFile(i)) + if ( len(m%dll_data(i)%PROPSfile) < len_trim(InputFileData%DLL_PropsFile(i)) ) then + call SetErrStat(ErrID_Fatal, 'PropsFile #'//trim(Num2LStr(i))//' name is longer than '//trim(Num2LStr(len(m%dll_data(i)%PROPSfile)))// & + ' characters (DLL limititation)', ErrStat, ErrMsg, RoutineName) + endif + m%dll_data(i)%LDISPfile = trim(InputFileData%DLL_LDispFile(i)) + if ( len(m%dll_data(i)%LDISPfile) < len_trim(InputFileData%DLL_LDispFile(i)) ) then + call SetErrStat(ErrID_Fatal, 'LDispFile #'//trim(Num2LStr(i))//' name is longer than '//trim(Num2LStr(len(m%dll_data(i)%LDISPfile)))// & + ' characters (DLL limititation)', ErrStat, ErrMsg, RoutineName) + endif + enddo + if (ErrStat >= AbortErrLev) return; + + ! Initialize the dll call REDWINinterface_Init(u,p,m%dll_data(1),y,InputFileData, ErrStat2, ErrMsg2); if (Failed()) return; contains From 393f1d784402c0a07c2fae703b3bf20868c2281c Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Mon, 10 Feb 2020 10:50:47 -0700 Subject: [PATCH 020/136] SoilDyn: error handling on the DLL and its input files --- modules/soildyn/src/SoilDyn.f90 | 77 +++++++++++++++++++++++---------- 1 file changed, 53 insertions(+), 24 deletions(-) diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index 244552bae..36c6491da 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -78,7 +78,7 @@ subroutine SoilDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None ! local variables - integer(IntKi) :: i !< generic counter + integer(IntKi) :: j !< generic counter integer(IntKi) :: NumOuts !< number of outputs; would probably be in the parameter type integer(IntKi) :: ErrStat2 !< local error status character(ErrMsgLen) :: ErrMsg2 !< local error message @@ -89,7 +89,7 @@ subroutine SoilDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In ! Initialize variables ErrStat = ErrID_None ErrMsg = "" - NumOuts = 2 +NumOuts = 2 ! Initialize the NWTC Subroutine Library call NWTC_Init( ) @@ -142,32 +142,14 @@ subroutine SoilDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In end if + call SoilDyn_InitMisc( InputFileData, m, ErrStat2,ErrMsg2) ! Set DLL parameters - ! Initialize the DLL for each interface point - allocate( m%dll_data(InputFileData%DLL_NumPoints), STAT=ErrStat2 ) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Could not allocate m%dll_data', ErrStat, ErrMsg, RoutineName) - return - endif - - do i=1,InputFileData%DLL_NumPoints - m%dll_data(i)%PROPSfile = trim(InputFileData%DLL_PropsFile(i)) - if ( len(m%dll_data(i)%PROPSfile) < len_trim(InputFileData%DLL_PropsFile(i)) ) then - call SetErrStat(ErrID_Fatal, 'PropsFile #'//trim(Num2LStr(i))//' name is longer than '//trim(Num2LStr(len(m%dll_data(i)%PROPSfile)))// & - ' characters (DLL limititation)', ErrStat, ErrMsg, RoutineName) - endif - m%dll_data(i)%LDISPfile = trim(InputFileData%DLL_LDispFile(i)) - if ( len(m%dll_data(i)%LDISPfile) < len_trim(InputFileData%DLL_LDispFile(i)) ) then - call SetErrStat(ErrID_Fatal, 'LDispFile #'//trim(Num2LStr(i))//' name is longer than '//trim(Num2LStr(len(m%dll_data(i)%LDISPfile)))// & - ' characters (DLL limititation)', ErrStat, ErrMsg, RoutineName) - endif - enddo - if (ErrStat >= AbortErrLev) return; - ! Initialize the dll - call REDWINinterface_Init(u,p,m%dll_data(1),y,InputFileData, ErrStat2, ErrMsg2); if (Failed()) return; + do j=1,size(m%dll_data) + call REDWINinterface_Init(u,p,m%dll_data(j),y,InputFileData, ErrStat2, ErrMsg2); if (Failed()) return; + enddo contains logical function Failed() @@ -175,6 +157,53 @@ logical function Failed() Failed = ErrStat >= AbortErrLev end function Failed + subroutine SoilDyn_InitMisc( InputFileData, m, ErrStat, ErrMsg ) + type(SlD_InputFile), intent(in ) :: InputFileData !< Data stored in the module's input file + type(SlD_MiscVarType), intent(inout) :: m !< Misc variables for optimization (not copied in glue code) + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(IntKi) :: i ! Generic counter + integer(IntKi) :: ErrStat2 !< local error status + character(ErrMsgLen) :: ErrMsg2 !< local error message + logical :: FileExist + character(1024) :: PriPath !< Path name of the primary file + character(1024) :: PropsLoc !< Full path to PropsFile location + character(1024) :: LDispLoc !< Full path to LDispFile location + + ErrStat = ErrID_None + ErrMsg = '' + + ! Get path to DLL (this is already set as absolute path) + call GetPath( InputFileData%DLL_FileName, PriPath) + + ! Set DLL data + allocate( m%dll_data(InputFileData%DLL_NumPoints), STAT=ErrStat2 ) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Could not allocate m%dll_data', ErrStat, ErrMsg, RoutineName) + return + endif + + do i=1,InputFileData%DLL_NumPoints + m%dll_data(i)%PROPSfile = trim(InputFileData%DLL_PropsFile(i)) + if ( len(m%dll_data(i)%PROPSfile) < len_trim(InputFileData%DLL_PropsFile(i)) ) then + call SetErrStat(ErrID_Fatal, 'PropsFile #'//trim(Num2LStr(i))//' name is longer than '//trim(Num2LStr(len(m%dll_data(i)%PROPSfile)))// & + ' characters (DLL limititation)', ErrStat, ErrMsg, '') + endif + m%dll_data(i)%LDISPfile = trim(InputFileData%DLL_LDispFile(i)) + if ( len(m%dll_data(i)%LDISPfile) < len_trim(InputFileData%DLL_LDispFile(i)) ) then + call SetErrStat(ErrID_Fatal, 'LDispFile #'//trim(Num2LStr(i))//' name is longer than '//trim(Num2LStr(len(m%dll_data(i)%LDISPfile)))// & + ' characters (DLL limititation)', ErrStat, ErrMsg, '') + endif + + ! Check the file exists relative to the DLL location (DLL location is absolute) + if ( PathIsRelative( m%dll_data(i)%PROPSfile ) ) PropsLoc = trim(PriPath)//trim(m%dll_data(i)%PROPSfile) + if ( PathIsRelative( m%dll_data(i)%LDISPfile ) ) LDispLoc = trim(PriPath)//trim(m%dll_data(i)%LDISPfile) + inquire( file=trim(PropsLoc), exist=FileExist ) + if ( .not. FileExist ) call SetErrStat(ErrID_Fatal, 'PropsFile #'//trim(Num2LStr(i))//' not found (path must be relative to DLL location, or absolute)', ErrStat, ErrMsg, '') + inquire( file=trim(LDispLoc), exist=FileExist ) + if ( .not. FileExist ) call SetErrStat(ErrID_Fatal, 'LDispFile #'//trim(Num2LStr(i))//' not found (path must be relative to DLL location, or absolute)', ErrStat, ErrMsg, '') + enddo + end subroutine SoilDyn_InitMisc end subroutine SoilDyn_Init From 7d7f4c3bcc6ebd2b13bf3faa795ac32694a6cae4 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Mon, 10 Feb 2020 10:50:47 -0700 Subject: [PATCH 021/136] SoilDyn: error handling on the DLL and its input files --- modules/soildyn/src/SoilDyn.f90 | 87 ++++++++++++++++-------- modules/soildyn/src/SoilDyn_Registry.txt | 6 +- modules/soildyn/src/SoilDyn_Types.f90 | 33 +++++++++ 3 files changed, 96 insertions(+), 30 deletions(-) diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index 244552bae..9f03f3ecf 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -78,7 +78,7 @@ subroutine SoilDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None ! local variables - integer(IntKi) :: i !< generic counter + integer(IntKi) :: j !< generic counter integer(IntKi) :: NumOuts !< number of outputs; would probably be in the parameter type integer(IntKi) :: ErrStat2 !< local error status character(ErrMsgLen) :: ErrMsg2 !< local error message @@ -89,7 +89,7 @@ subroutine SoilDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In ! Initialize variables ErrStat = ErrID_None ErrMsg = "" - NumOuts = 2 +NumOuts = 2 ! Initialize the NWTC Subroutine Library call NWTC_Init( ) @@ -97,9 +97,13 @@ subroutine SoilDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In ! Display the module information call DispNVD( SoilDyn_Ver ) -!FIXME: #EchoFileName -EchoFileName='TempFile.ech' - call SoilDyn_ReadInput( InitInp%InputFile, EchoFileName, InputFileData, ErrStat2, ErrMsg2 ); if (Failed()) return; + ! Set some names + call GetRoot( InitInp%InputFile, p%RootFileName ) + p%EchoFileName = TRIM(p%RootFileName)//".ech" + p%SumFileName = TRIM(p%RootFileName)//"SlD.sum" + + + call SoilDyn_ReadInput( InitInp%InputFile, p%EchoFileName, InputFileData, ErrStat2, ErrMsg2 ); if (Failed()) return; ! Define parameters here: p%DT = Interval @@ -142,32 +146,14 @@ subroutine SoilDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In end if + call SoilDyn_InitMisc( InputFileData, m, ErrStat2,ErrMsg2) ! Set DLL parameters - ! Initialize the DLL for each interface point - allocate( m%dll_data(InputFileData%DLL_NumPoints), STAT=ErrStat2 ) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Could not allocate m%dll_data', ErrStat, ErrMsg, RoutineName) - return - endif - - do i=1,InputFileData%DLL_NumPoints - m%dll_data(i)%PROPSfile = trim(InputFileData%DLL_PropsFile(i)) - if ( len(m%dll_data(i)%PROPSfile) < len_trim(InputFileData%DLL_PropsFile(i)) ) then - call SetErrStat(ErrID_Fatal, 'PropsFile #'//trim(Num2LStr(i))//' name is longer than '//trim(Num2LStr(len(m%dll_data(i)%PROPSfile)))// & - ' characters (DLL limititation)', ErrStat, ErrMsg, RoutineName) - endif - m%dll_data(i)%LDISPfile = trim(InputFileData%DLL_LDispFile(i)) - if ( len(m%dll_data(i)%LDISPfile) < len_trim(InputFileData%DLL_LDispFile(i)) ) then - call SetErrStat(ErrID_Fatal, 'LDispFile #'//trim(Num2LStr(i))//' name is longer than '//trim(Num2LStr(len(m%dll_data(i)%LDISPfile)))// & - ' characters (DLL limititation)', ErrStat, ErrMsg, RoutineName) - endif - enddo - if (ErrStat >= AbortErrLev) return; - ! Initialize the dll - call REDWINinterface_Init(u,p,m%dll_data(1),y,InputFileData, ErrStat2, ErrMsg2); if (Failed()) return; + do j=1,size(m%dll_data) + call REDWINinterface_Init(u,p,m%dll_data(j),y,InputFileData, ErrStat2, ErrMsg2); if (Failed()) return; + enddo contains logical function Failed() @@ -175,6 +161,53 @@ logical function Failed() Failed = ErrStat >= AbortErrLev end function Failed + subroutine SoilDyn_InitMisc( InputFileData, m, ErrStat, ErrMsg ) + type(SlD_InputFile), intent(in ) :: InputFileData !< Data stored in the module's input file + type(SlD_MiscVarType), intent(inout) :: m !< Misc variables for optimization (not copied in glue code) + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(IntKi) :: i ! Generic counter + integer(IntKi) :: ErrStat2 !< local error status + character(ErrMsgLen) :: ErrMsg2 !< local error message + logical :: FileExist + character(1024) :: PriPath !< Path name of the primary file + character(1024) :: PropsLoc !< Full path to PropsFile location + character(1024) :: LDispLoc !< Full path to LDispFile location + + ErrStat = ErrID_None + ErrMsg = '' + + ! Get path to DLL (this is already set as absolute path) + call GetPath( InputFileData%DLL_FileName, PriPath) + + ! Set DLL data + allocate( m%dll_data(InputFileData%DLL_NumPoints), STAT=ErrStat2 ) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Could not allocate m%dll_data', ErrStat, ErrMsg, RoutineName) + return + endif + + do i=1,InputFileData%DLL_NumPoints + m%dll_data(i)%PROPSfile = trim(InputFileData%DLL_PropsFile(i)) + if ( len(m%dll_data(i)%PROPSfile) < len_trim(InputFileData%DLL_PropsFile(i)) ) then + call SetErrStat(ErrID_Fatal, 'PropsFile #'//trim(Num2LStr(i))//' name is longer than '//trim(Num2LStr(len(m%dll_data(i)%PROPSfile)))// & + ' characters (DLL limititation)', ErrStat, ErrMsg, '') + endif + m%dll_data(i)%LDISPfile = trim(InputFileData%DLL_LDispFile(i)) + if ( len(m%dll_data(i)%LDISPfile) < len_trim(InputFileData%DLL_LDispFile(i)) ) then + call SetErrStat(ErrID_Fatal, 'LDispFile #'//trim(Num2LStr(i))//' name is longer than '//trim(Num2LStr(len(m%dll_data(i)%LDISPfile)))// & + ' characters (DLL limititation)', ErrStat, ErrMsg, '') + endif + + ! Check the file exists relative to the DLL location (DLL location is absolute) + if ( PathIsRelative( m%dll_data(i)%PROPSfile ) ) PropsLoc = trim(PriPath)//trim(m%dll_data(i)%PROPSfile) + if ( PathIsRelative( m%dll_data(i)%LDISPfile ) ) LDispLoc = trim(PriPath)//trim(m%dll_data(i)%LDISPfile) + inquire( file=trim(PropsLoc), exist=FileExist ) + if ( .not. FileExist ) call SetErrStat(ErrID_Fatal, 'PropsFile #'//trim(Num2LStr(i))//' not found (path must be relative to DLL location, or absolute)', ErrStat, ErrMsg, '') + inquire( file=trim(LDispLoc), exist=FileExist ) + if ( .not. FileExist ) call SetErrStat(ErrID_Fatal, 'LDispFile #'//trim(Num2LStr(i))//' not found (path must be relative to DLL location, or absolute)', ErrStat, ErrMsg, '') + enddo + end subroutine SoilDyn_InitMisc end subroutine SoilDyn_Init diff --git a/modules/soildyn/src/SoilDyn_Registry.txt b/modules/soildyn/src/SoilDyn_Registry.txt index 8f703181a..ae3dad0b5 100644 --- a/modules/soildyn/src/SoilDyn_Registry.txt +++ b/modules/soildyn/src/SoilDyn_Registry.txt @@ -100,9 +100,9 @@ typedef ^ ParameterType DLL_Type DLL_Trgt typedef ^ ParameterType DbKi DLL_DT - - - "Time step for DLL" seconds typedef ^ ParameterType CHARACTER(1024) RootName - - - "RootName for writing output files" - typedef ^ ParameterType LOGICAL UseREDWINinterface - - - "True if interface successfully initialized" - -#typedef ^ ParameterType character(45) PROPSFILE - - - "" - -#typedef ^ ParameterType character(45) LDISPFILE - - - "" - - +typedef ^ ParameterType CHARACTER(1024) RootFileName - - - "Root file name" - +typedef ^ ParameterType CHARACTER(1024) EchoFileName - - - "Name of echo file" - +typedef ^ ParameterType CHARACTER(1024) SumFileName - - - "Name of summary file" - # ..... Inputs .................................................................................................................... # Define inputs that are contained on the mesh here: diff --git a/modules/soildyn/src/SoilDyn_Types.f90 b/modules/soildyn/src/SoilDyn_Types.f90 index f247e49ce..69e2a7b3f 100644 --- a/modules/soildyn/src/SoilDyn_Types.f90 +++ b/modules/soildyn/src/SoilDyn_Types.f90 @@ -115,6 +115,9 @@ MODULE SoilDyn_Types REAL(DbKi) :: DLL_DT !< Time step for DLL [seconds] CHARACTER(1024) :: RootName !< RootName for writing output files [-] LOGICAL :: UseREDWINinterface !< True if interface successfully initialized [-] + CHARACTER(1024) :: RootFileName !< Root file name [-] + CHARACTER(1024) :: EchoFileName !< Name of echo file [-] + CHARACTER(1024) :: SumFileName !< Name of summary file [-] END TYPE SlD_ParameterType ! ======================= ! ========= SlD_InputType ======= @@ -2228,6 +2231,9 @@ SUBROUTINE SlD_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg DstParamData%DLL_DT = SrcParamData%DLL_DT DstParamData%RootName = SrcParamData%RootName DstParamData%UseREDWINinterface = SrcParamData%UseREDWINinterface + DstParamData%RootFileName = SrcParamData%RootFileName + DstParamData%EchoFileName = SrcParamData%EchoFileName + DstParamData%SumFileName = SrcParamData%SumFileName END SUBROUTINE SlD_CopyParam SUBROUTINE SlD_DestroyParam( ParamData, ErrStat, ErrMsg ) @@ -2300,6 +2306,9 @@ SUBROUTINE SlD_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, S Db_BufSz = Db_BufSz + 1 ! DLL_DT Int_BufSz = Int_BufSz + 1*LEN(InData%RootName) ! RootName Int_BufSz = Int_BufSz + 1 ! UseREDWINinterface + Int_BufSz = Int_BufSz + 1*LEN(InData%RootFileName) ! RootFileName + Int_BufSz = Int_BufSz + 1*LEN(InData%EchoFileName) ! EchoFileName + Int_BufSz = Int_BufSz + 1*LEN(InData%SumFileName) ! SumFileName IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) THEN @@ -2369,6 +2378,18 @@ SUBROUTINE SlD_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, S END DO ! I IntKiBuf ( Int_Xferred:Int_Xferred+1-1 ) = TRANSFER( InData%UseREDWINinterface , IntKiBuf(1), 1) Int_Xferred = Int_Xferred + 1 + DO I = 1, LEN(InData%RootFileName) + IntKiBuf(Int_Xferred) = ICHAR(InData%RootFileName(I:I), IntKi) + Int_Xferred = Int_Xferred + 1 + END DO ! I + DO I = 1, LEN(InData%EchoFileName) + IntKiBuf(Int_Xferred) = ICHAR(InData%EchoFileName(I:I), IntKi) + Int_Xferred = Int_Xferred + 1 + END DO ! I + DO I = 1, LEN(InData%SumFileName) + IntKiBuf(Int_Xferred) = ICHAR(InData%SumFileName(I:I), IntKi) + Int_Xferred = Int_Xferred + 1 + END DO ! I END SUBROUTINE SlD_PackParam SUBROUTINE SlD_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) @@ -2457,6 +2478,18 @@ SUBROUTINE SlD_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg END DO ! I OutData%UseREDWINinterface = TRANSFER( IntKiBuf( Int_Xferred ), mask0 ) Int_Xferred = Int_Xferred + 1 + DO I = 1, LEN(OutData%RootFileName) + OutData%RootFileName(I:I) = CHAR(IntKiBuf(Int_Xferred)) + Int_Xferred = Int_Xferred + 1 + END DO ! I + DO I = 1, LEN(OutData%EchoFileName) + OutData%EchoFileName(I:I) = CHAR(IntKiBuf(Int_Xferred)) + Int_Xferred = Int_Xferred + 1 + END DO ! I + DO I = 1, LEN(OutData%SumFileName) + OutData%SumFileName(I:I) = CHAR(IntKiBuf(Int_Xferred)) + Int_Xferred = Int_Xferred + 1 + END DO ! I END SUBROUTINE SlD_UnPackParam SUBROUTINE SlD_CopyInput( SrcInputData, DstInputData, CtrlCode, ErrStat, ErrMsg ) From f41dcfe484ac4a7c0a25f90839f8e353cb3d1008 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Mon, 10 Feb 2020 11:14:37 -0700 Subject: [PATCH 022/136] SoilDyn: more input file location checking for DLL's --- modules/soildyn/src/SoilDyn.f90 | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index 9f03f3ecf..4c825d850 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -146,9 +146,8 @@ subroutine SoilDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In end if - call SoilDyn_InitMisc( InputFileData, m, ErrStat2,ErrMsg2) - - ! Set DLL parameters + ! Set miscvars: including dll_data arrays and checking for input files. + call SoilDyn_InitMisc( InputFileData, m, ErrStat2,ErrMsg2); if (Failed()) return; ! Initialize the dll do j=1,size(m%dll_data) @@ -161,18 +160,20 @@ logical function Failed() Failed = ErrStat >= AbortErrLev end function Failed + !> Allocate arrays for storing the DLL input file names, and check that they exist. The DLL has no error checking (as of 2020.02.10) + !! and will create empty input files before segfaulting. subroutine SoilDyn_InitMisc( InputFileData, m, ErrStat, ErrMsg ) - type(SlD_InputFile), intent(in ) :: InputFileData !< Data stored in the module's input file - type(SlD_MiscVarType), intent(inout) :: m !< Misc variables for optimization (not copied in glue code) + type(SlD_InputFile), intent(in ) :: InputFileData !< Data stored in the module's input file + type(SlD_MiscVarType), intent(inout) :: m !< Misc variables for optimization (not copied in glue code) integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(IntKi) :: i ! Generic counter - integer(IntKi) :: ErrStat2 !< local error status - character(ErrMsgLen) :: ErrMsg2 !< local error message + integer(IntKi) :: i ! Generic counter + integer(IntKi) :: ErrStat2 !< local error status + character(ErrMsgLen) :: ErrMsg2 !< local error message logical :: FileExist - character(1024) :: PriPath !< Path name of the primary file - character(1024) :: PropsLoc !< Full path to PropsFile location - character(1024) :: LDispLoc !< Full path to LDispFile location + character(1024) :: PriPath !< Path name of the primary file + character(1024) :: PropsLoc !< Full path to PropsFile location + character(1024) :: LDispLoc !< Full path to LDispFile location ErrStat = ErrID_None ErrMsg = '' From 2bf2dcc7e0ccca37da5fcb9d56ef0ccc7fac45a4 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Mon, 10 Feb 2020 14:15:09 -0700 Subject: [PATCH 023/136] SoilDyn: error handling on DLL input files --- modules/soildyn/src/SoilDyn.f90 | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index 9f03f3ecf..0da280b81 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -146,7 +146,7 @@ subroutine SoilDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In end if - call SoilDyn_InitMisc( InputFileData, m, ErrStat2,ErrMsg2) + call SoilDyn_InitMisc( InputFileData, m, ErrStat2,ErrMsg2); if (Failed()) return; ! Set DLL parameters @@ -198,10 +198,21 @@ subroutine SoilDyn_InitMisc( InputFileData, m, ErrStat, ErrMsg ) call SetErrStat(ErrID_Fatal, 'LDispFile #'//trim(Num2LStr(i))//' name is longer than '//trim(Num2LStr(len(m%dll_data(i)%LDISPfile)))// & ' characters (DLL limititation)', ErrStat, ErrMsg, '') endif + ! Check if errors above + if (ErrStat >= AbortErrLev) return + ! Check the file exists relative to the DLL location (DLL location is absolute) - if ( PathIsRelative( m%dll_data(i)%PROPSfile ) ) PropsLoc = trim(PriPath)//trim(m%dll_data(i)%PROPSfile) - if ( PathIsRelative( m%dll_data(i)%LDISPfile ) ) LDispLoc = trim(PriPath)//trim(m%dll_data(i)%LDISPfile) + if ( PathIsRelative( m%dll_data(i)%PROPSfile ) ) then + PropsLoc = trim(PriPath)//trim(m%dll_data(i)%PROPSfile) + else + PropsLoc = trim(m%dll_data(i)%PROPSfile) + endif + if ( PathIsRelative( m%dll_data(i)%LDISPfile ) ) then + LDispLoc = trim(PriPath)//trim(m%dll_data(i)%LDISPfile) + else + LDispLoc = trim(m%dll_data(i)%LDISPfile) + endif inquire( file=trim(PropsLoc), exist=FileExist ) if ( .not. FileExist ) call SetErrStat(ErrID_Fatal, 'PropsFile #'//trim(Num2LStr(i))//' not found (path must be relative to DLL location, or absolute)', ErrStat, ErrMsg, '') inquire( file=trim(LDispLoc), exist=FileExist ) From bcd73abe598c6f79494646a854c395bd854b7443 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Mon, 10 Feb 2020 15:54:06 -0700 Subject: [PATCH 024/136] SoilDyn: add input file and parsing to driver --- modules/soildyn/CMakeLists.txt | 7 +- modules/soildyn/src/driver/SoilDyn_Driver.f90 | 2 + .../src/driver/SoilDyn_Driver_Subs.f90 | 1351 +++++++++++++++++ .../src/driver/SoilDyn_Driver_Types.f90 | 107 ++ 4 files changed, 1466 insertions(+), 1 deletion(-) create mode 100644 modules/soildyn/src/driver/SoilDyn_Driver_Subs.f90 create mode 100644 modules/soildyn/src/driver/SoilDyn_Driver_Types.f90 diff --git a/modules/soildyn/CMakeLists.txt b/modules/soildyn/CMakeLists.txt index 97a94f693..4cad9feb5 100644 --- a/modules/soildyn/CMakeLists.txt +++ b/modules/soildyn/CMakeLists.txt @@ -28,7 +28,12 @@ set(SlD_SOURCES add_library(soildynlib ${SlD_SOURCES}) target_link_libraries(soildynlib nwtclibs) -add_executable(soildyn_driver src/driver/SoilDyn_Driver.f90) +set(SOILDYN_DRIVER_SOURCES + src/driver/SoilDyn_Driver_Types.f90 + src/driver/SoilDyn_Driver_Subs.f90 + src/driver/SoilDyn_Driver.f90 +) +add_executable(soildyn_driver ${SOILDYN_DRIVER_SOURCES}) target_link_libraries(soildyn_driver soildynlib nwtclibs ${CMAKE_DL_LIBS}) diff --git a/modules/soildyn/src/driver/SoilDyn_Driver.f90 b/modules/soildyn/src/driver/SoilDyn_Driver.f90 index 6bfb64724..da27ffc09 100644 --- a/modules/soildyn/src/driver/SoilDyn_Driver.f90 +++ b/modules/soildyn/src/driver/SoilDyn_Driver.f90 @@ -23,6 +23,8 @@ PROGRAM SoilDyn_Driver USE NWTC_Library USE SoilDyn USE SoilDyn_Types + USE SoilDyn_Driver_Subs + USE SoilDyn_Driver_Types IMPLICIT NONE diff --git a/modules/soildyn/src/driver/SoilDyn_Driver_Subs.f90 b/modules/soildyn/src/driver/SoilDyn_Driver_Subs.f90 new file mode 100644 index 000000000..023dea93d --- /dev/null +++ b/modules/soildyn/src/driver/SoilDyn_Driver_Subs.f90 @@ -0,0 +1,1351 @@ +!********************************************************************************************************************************** +! +! MODULE: SoilDyn_Driver_Subs - This module contains subroutines used by the SoilDyn Driver program +! +!********************************************************************************************************************************** +!********************************************************************************************************************************** +! LICENSING +! Copyright (C) 2020 National Renewable Energy Laboratory +! +! This file is part of SoilDyn. +! +! Licensed under the Apache License, Version 2.0 (the "License"); +! you may not use this file except in compliance with the License. +! You may obtain a copy of the License at +! +! http://www.apache.org/licenses/LICENSE-2.0 +! +! Unless required by applicable law or agreed to in writing, software +! distributed under the License is distributed on an "AS IS" BASIS, +! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +! See the License for the specific language governing permissions and +! limitations under the License. +! +!********************************************************************************************************************************** +MODULE SoilDyn_Driver_Subs + + USE NWTC_Library + USE SoilDyn_Driver_Types + IMPLICIT NONE + +! NOTE: This is loosely based on the InflowWind driver code. + +CONTAINS +!-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +!> Print out help information +SUBROUTINE DispHelpText( ErrStat, ErrMsg ) + + USE NWTC_Library + + IMPLICIT NONE + + ! Error Handling + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + + ErrStat = ErrID_None + ErrMsg = '' + + + ! Statement about usage + CALL WrScr("") + CALL WrScr(" Syntax: SoilDyn_Driver [options]") + CALL WrScr("") + CALL WrScr(" where: -- Name of driver input file to use") + CALL WrScr(" options: "//SWChar//"sld -- treat as name of SoilDyn input file") + CALL WrScr(" (no driver input file)") + CALL WrScr("") + CALL WrScr(" The following options will overwrite values in the driver input file:") + CALL WrScr(" "//SwChar//"DT[#] -- timestep ") + CALL WrScr(" "//SwChar//"TStart[#] -- start time ") + CALL WrScr(" "//SwChar//"TSteps[#] -- number of timesteps ") + CALL WrScr(" "//SwChar//"v -- verbose output ") + CALL WrScr(" "//SwChar//"vv -- very verbose output ") + CALL WrScr(" "//SwChar//"help -- print this help menu and exit") + CALL WrScr("") + CALL WrScr(" Notes:") + CALL WrScr(" -- Options are not case sensitive.") + CALL WrScr("") + + +END SUBROUTINE DispHelpText + + +!-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +!> This subroutine retrieves the command line arguments and passes them to the +!! SoilDyn_driver_subs::parsearg routine for processing. +SUBROUTINE RetrieveArgs( CLSettings, CLFlags, ErrStat, ErrMsg ) + + USE NWTC_Library + USE SoilDyn_Driver_Types + + IMPLICIT NONE + + ! Storing the arguments + TYPE( SlDDriver_Flags ), INTENT( OUT) :: CLFlags !< Flags indicating which command line arguments were specified + TYPE( SlDDriver_Settings ), INTENT( OUT) :: CLSettings !< Command line arguments passed in + + ! Error Handling + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + + ! Local variable IF ( CLFlags%Summarys + INTEGER(IntKi) :: i !< Generic counter + CHARACTER(1024) :: Arg !< argument given + CHARACTER(1024) :: ArgUC !< Upper case argument to check + INTEGER(IntKi) :: NumInputArgs !< Number of argements passed in from command line + LOGICAL :: sldFlag !< The -sld flag was set + CHARACTER(1024) :: FileName !< Filename from the command line. + LOGICAL :: FileNameGiven !< Flag indicating if a filename was given. + + INTEGER(IntKi) :: ErrStatTmp !< Temporary error status (for calls) + CHARACTER(1024) :: ErrMsgTmp !< Temporary error message (for calls) + + + ! initialize some things + CLFlags%DvrIptFile = .FALSE. + ErrStat = ErrID_None + ErrStatTmp = ErrID_None + ErrMsg = '' + ErrMsgTmp = '' + sldFlag = .FALSE. + FileNameGiven = .FALSE. + FileName = '' + + + ! Check how many arguments are passed in + NumInputArgs = COMMAND_ARGUMENT_COUNT() + + ! exit if we don't have enough + IF (NumInputArgs == 0) THEN + CALL SetErrStat(ErrID_Fatal," Insufficient Arguments. Use option "//SwChar//"help for help menu.", & + ErrStat,ErrMsg,'RetrieveArgs') + RETURN + ENDIF + + + ! Loop through all the arguments, and store them + DO i=1,NumInputArgs + ! get the ith argument + CALL get_command_argument(i, Arg) + ArgUC = Arg + + ! convert to uppercase + CALL Conv2UC( ArgUC ) + + + ! Check to see if it is a control parameter or the filename + IF ( INDEX( SwChar, ArgUC(1:1) ) > 0 ) THEN + + ! check to see if we asked for help + IF ( ArgUC(2:5) == "HELP" ) THEN + CALL DispHelpText( ErrStat, ErrMsg ) + CALL ProgExit(0) + ENDIF + + + ! Check the argument and put it where it belongs + ! chop the SwChar off before passing the argument + CALL ParseArg( CLSettings, CLFlags, ArgUC(2:), Arg(2:), sldFlag, ErrStatTmp, ErrMsgTmp ) + CALL SetErrStat(ErrStatTmp,ErrMsgTmp,ErrStat,ErrMsg,'RetrieveArgs') + IF (ErrStat>AbortErrLev) RETURN + + ELSE + + ! since there is no switch character, assume it is the filename, unless we already set one + IF ( FileNameGiven ) THEN + CALL SetErrStat(ErrID_Fatal," Multiple driver input filenames given: "//TRIM(FileName)//", "//TRIM(Arg), & + ErrStat,ErrMsg,'RetrieveArgs') + RETURN + ELSE + FileName = TRIM(Arg) + FileNameGiven = .TRUE. + ENDIF + + ENDIF + END DO + + + ! Was a filename given? + IF ( .NOT. FileNameGiven ) THEN + CALL SetErrStat( ErrID_Fatal, " No filename given.", ErrStat, ErrMsg, 'RetrieveArgs' ) + RETURN + ENDIF + + ! Was the -sld flag set? If so, the filename is the SoilDyn input file. Otherwise + ! it is the driver input file. + IF ( sldFlag ) THEN + CLSettings%SlDIptFileName = TRIM(FileName) + CLFlags%SlDIptFile = .TRUE. + ELSE + CLSettings%DvrIptFileName = TRIM(FileName) + CLFlags%DvrIptFile = .TRUE. + ENDIF + + + + !------------------------------------------------------------------------------- + !------------------------------------------------------------------------------- + CONTAINS + + + !------------------------------------------------------------------------------- + FUNCTION StringToReal( StringIn, ErrStat ) + !-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-! + ! Convert a string to a real number ! + !-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-! + + IMPLICIT NONE + + ! Error Handling + INTEGER(IntKi), INTENT( OUT) :: ErrStat + + ! Input + CHARACTER(*), INTENT(IN ) :: StringIn + + ! Returned value + REAL(ReKi) :: StringToReal + + ! Local Variables + INTEGER(IntKi) :: ErrStatTmp ! Temporary variable to hold the error status + + read( StringIn, *, iostat=ErrStatTmp) StringToReal + + ! If that isn't a number, only warn since we can continue by skipping this value + IF ( ErrStatTmp .ne. 0 ) ErrStat = ErrID_Warn + + END FUNCTION StringToReal + + + + !------------------------------------------------------------------------------- + SUBROUTINE ParseArg( CLSettings, CLFlags, ThisArgUC, ThisArg, sldFlagSet, ErrStat, ErrMsg ) + !-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-! + ! Parse and store the input argument ! + !-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-! + + USE NWTC_Library + USE SoilDyn_Driver_Types + USE SoilDyn_Types + + IMPLICIT NONE + + ! Storing the arguments + TYPE( SlDDriver_Flags ), INTENT(INOUT) :: CLFlags ! Flags indicating which arguments were specified + TYPE( SlDDriver_Settings ), INTENT(INOUT) :: CLSettings ! Arguments passed in + + CHARACTER(*), INTENT(IN ) :: ThisArgUC ! The current argument (upper case for testing) + CHARACTER(*), INTENT(IN ) :: ThisArg ! The current argument (as passed in for error messages) + LOGICAL, INTENT(INOUT) :: sldFlagSet ! Was the -sld flag given? + + ! Error Handling + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + + + ! local variables + INTEGER(IntKi) :: Delim1 ! where the [ is + INTEGER(IntKi) :: Delim2 ! where the ] is + INTEGER(IntKi) :: DelimSep ! where the : is + INTEGER(IntKi) :: DelimSep2 ! where the : is + INTEGER(IntKi) :: DelimSep3 ! where the : is + REAL(ReKi) :: TempReal ! temp variable to hold a real + + INTEGER(IntKi) :: ErrStatTmp ! Temporary error status for calls + + + + ! Initialize some things + ErrStat = ErrID_None + ErrStatTmp = ErrID_None + ErrMsg = '' + + ! Get the delimiters -- returns 0 if there isn't one + Delim1 = INDEX(ThisArgUC,'[') + Delim2 = INDEX(ThisArgUC,']') + DelimSep = INDEX(ThisArgUC,':') + + + ! check that if there is an opening bracket, then there is a closing one + IF ( (Delim1 > 0_IntKi ) .and. (Delim2 < Delim1) ) THEN + CALL SetErrStat(ErrID_Warn," Syntax error in option: '"//SwChar//TRIM(ThisArg)//"'. Ignoring.", & + ErrStat,ErrMsg,'ParseArg') + RETURN + ENDIF + + ! check that if there is a colon, then there are brackets + IF ( (DelimSep > 0_IntKi) .and. (Delim1 == 0_IntKi) ) THEN + CALL SetErrStat(ErrID_Warn," Syntax error in option: '"//SwChar//TRIM(ThisArg)//"'. Ignoring.", & + ErrStat,ErrMsg,'ParseArg') + RETURN + ENDIF + + + ! If no delimeters were given, than this option is simply a flag + IF ( Delim1 == 0_IntKi ) THEN + ! check to see if the filename is the name of the SlD input file + IF ( ThisArgUC(1:3) == "IFW" ) THEN + sldFlagSet = .TRUE. ! More logic in the routine that calls this one to set things. + RETURN + ELSEIF ( ThisArgUC(1:2) == "VV" ) THEN + CLFlags%VVerbose = .TRUE. + RETURN + ELSEIF ( ThisArgUC(1:1) == "V" ) THEN + CLFlags%Verbose = .TRUE. + RETURN + ELSE + CALL SetErrStat( ErrID_Warn," Unrecognized option '"//SwChar//TRIM(ThisArg)//"'. Ignoring. Use option "//SwChar//"help for list of options.", & + ErrStat,ErrMsg,'ParseArg') + ENDIF + + ENDIF + + + ! "DT[#]" + IF( ThisArgUC(1:Delim1) == "DT[" ) THEN + TempReal = StringToReal( ThisArgUC(Delim1+1:Delim2-1), ErrStat ) + IF ( ErrStat == ErrID_None ) THEN + CLFlags%Dt = .TRUE. + CLSettings%DT = abs(TempReal) + ELSE + CLFlags%Dt = .FALSE. + IF ( ErrStat == ErrID_Warn ) THEN + CALL SetErrStat(ErrStatTmp," Invalid number in option '"//SwChar//TRIM(ThisArg)//"'. Ignoring.", & + ErrStat,ErrMsg,'ParseArgs') + ELSE + CALL SetErrStat( ErrID_Fatal," Something failed in parsing option '"//SwChar//TRIM(ThisArg)//"'.", & + ErrStat, ErrMsg, 'ParseArg') + ENDIF + RETURN + ENDIF + + + ! "TSTEPS[#]" + ELSEIF( ThisArgUC(1:Delim1) == "TSTEPS[" ) THEN + TempReal = StringToReal( ThisArgUC(Delim1+1:Delim2-1), ErrStat ) + IF ( ErrStat == ErrID_None ) THEN + CLFlags%NumTimeSteps = .TRUE. + CLSettings%NumTimeSteps = nint(abs(TempReal)) + ELSE + CLFlags%NumTimeSteps = .FALSE. + CLSettings%NumTimeSteps = 1_IntKi + IF ( ErrStat == ErrID_Warn ) THEN + CALL SetErrStat(ErrStatTmp," Invalid number in option '"//SwChar//TRIM(ThisArg)//"'. Ignoring.", & + ErrStat,ErrMsg,'ParseArgs') + ELSE + CALL SetErrStat( ErrID_Fatal," Something failed in parsing option '"//SwChar//TRIM(ThisArg)//"'.", & + ErrStat, ErrMsg, 'ParseArg') + ENDIF + RETURN + ENDIF + + + + ! "TSTART[#]" + ELSEIF( ThisArgUC(1:Delim1) == "TSTART[" ) THEN + TempReal = StringToReal( ThisArgUC(Delim1+1:Delim2-1), ErrStat ) + IF ( ErrStat == ErrID_None ) THEN + CLFlags%TStart = .TRUE. + CLSettings%TStart = abs(TempReal) + ELSE + CLFlags%TStart = .FALSE. + IF ( ErrStat == ErrID_Warn ) THEN + CALL SetErrStat(ErrStatTmp," Invalid number in option '"//SwChar//TRIM(ThisArg)//"'. Ignoring.", & + ErrStat,ErrMsg,'ParseArgs') + ELSE + CALL SetErrStat( ErrID_Fatal," Something failed in parsing option '"//SwChar//TRIM(ThisArg)//"'.", & + ErrStat, ErrMsg, 'ParseArg') + ENDIF + RETURN + ENDIF + + + ELSE + ErrMsg = " Unrecognized option: '"//SwChar//TRIM(ThisArg)//"'. Ignoring. Use option "//SwChar//"help for list of options." + ErrStat = ErrID_Warn + ENDIF + + END SUBROUTINE ParseArg + !------------------------------------------------------------------------------- + +END SUBROUTINE RetrieveArgs + + +!-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +!-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +!> This subroutine reads the driver input file and sets up the flags and settings +!! for the driver code. Any settings from the command line options will override +!! this. +SUBROUTINE ReadDvrIptFile( DvrFileName, DvrFlags, DvrSettings, ProgInfo, ErrStat, ErrMsg ) + + CHARACTER(1024), INTENT(IN ) :: DvrFileName + TYPE(SlDDriver_Flags), INTENT(INOUT) :: DvrFlags + TYPE(SlDDriver_Settings), INTENT(INOUT) :: DvrSettings + TYPE(ProgDesc), INTENT(IN ) :: ProgInfo + INTEGER(IntKi), INTENT( OUT) :: ErrStat ! returns a non-zero value when an error occurs + CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None + + ! Local variables + INTEGER(IntKi) :: UnIn ! Unit number for the driver input file + CHARACTER(1024) :: FileName ! Name of SoilDyn driver input file + + ! Input file echoing + LOGICAL :: EchoFileContents ! Do we echo the driver file out or not? + INTEGER(IntKi) :: UnEchoLocal ! The local unit number for this module's echo file + CHARACTER(1024) :: EchoFileName ! Name of SoilDyn driver echo file + + ! Time steps + CHARACTER(1024) :: NumTimeStepsChr ! Character string for number of timesteps (to handle DEFAULT value) + CHARACTER(1024) :: DTChr ! Character string for timesteps size (to handle DEFAULT value) + + ! Gridded data + INTEGER(IntKi) :: TmpIntAr3(3) ! Temporary array for reading in a pair of integer values from the input file + REAL(ReKi) :: TmpRealAr3(3) ! Temporary array for reading in a pair of real values from the input file + REAL(ReKi) :: GridCtrCoord(3) ! Center coordinate of the grid read in + + + ! Local error handling + INTEGER(IntKi) :: ios !< I/O status + INTEGER(IntKi) :: ErrStatTmp !< Temporary error status for calls + CHARACTER(1024) :: ErrMsgTmp !< Temporary error messages for calls + + + ! Initialize the echo file unit to -1 which is the default to prevent echoing, we will alter this based on user input + UnEchoLocal = -1 + + FileName = TRIM(DvrFileName) + + CALL GetNewUnit( UnIn ) + CALL OpenFInpFile( UnIn, FileName, ErrStatTmp, ErrMsgTmp ) + IF ( ErrStatTmp /= ErrID_None ) THEN + CALL SetErrStat(ErrID_Fatal,' Failed to open SoilDyn Driver input file: '//FileName, & + ErrStat,ErrMsg,'ReadDvrIptFile') + CLOSE( UnIn ) + RETURN + ENDIF + + + CALL WrScr( 'Opening SoilDyn Driver input file: '//FileName ) + + + !------------------------------------------------------------------------------------------------- + ! File header + !------------------------------------------------------------------------------------------------- + + CALL ReadCom( UnIn, FileName,' SoilDyn Driver input file header line 1', ErrStatTmp, ErrMsgTmp ) + if (Failed()) return + + CALL ReadCom( UnIn, FileName, 'SoilDyn Driver input file header line 2', ErrStatTmp, ErrMsgTmp ) + if (Failed()) return + + ! Echo Input Files. + CALL ReadVar ( UnIn, FileName, EchoFileContents, 'Echo', 'Echo Input', ErrStatTmp, ErrMsgTmp ) + if (Failed()) return + + + ! If we are Echoing the input then we should re-read the first three lines so that we can echo them + ! using the NWTC_Library routines. The echoing is done inside those routines via a global variable + ! which we must store, set, and then replace on error or completion. + + IF ( EchoFileContents ) THEN + + EchoFileName = TRIM(FileName)//'.ech' + CALL GetNewUnit( UnEchoLocal ) + CALL OpenEcho ( UnEchoLocal, EchoFileName, ErrStatTmp, ErrMsgTmp, ProgInfo ) + if (Failed()) return + + REWIND(UnIn) + + ! Reread and echo + CALL ReadCom( UnIn, FileName,' SoilDyn Driver input file header line 1', ErrStatTmp, ErrMsgTmp, UnEchoLocal ) + if (Failed()) return + + CALL ReadCom( UnIn, FileName, 'SoilDyn Driver input file header line 2', ErrStatTmp, ErrMsgTmp, UnEchoLocal ) + if (Failed()) return + + ! Echo Input Files. + CALL ReadVar ( UnIn, FileName, EchoFileContents, 'Echo', 'Echo Input', ErrStatTmp, ErrMsgTmp, UnEchoLocal ) + if (Failed()) return + + ENDIF + + + !------------------------------------------------------------------------------------------------- + ! Driver setup section + !------------------------------------------------------------------------------------------------- + + ! Header + CALL ReadCom( UnIn, FileName,' Driver setup section, comment line', ErrStatTmp, ErrMsgTmp, UnEchoLocal ) + if (Failed()) return + + ! SoilDyn input file + CALL ReadVar( UnIn, FileName,DvrSettings%SlDIptFileName,'SlDIptFileName',' SoilDyn input filename', & + ErrStatTmp,ErrMsgTmp, UnEchoLocal ) + if (Failed()) then + return + else + DvrFlags%SlDIptFile = .TRUE. + endif + + ! Number of timesteps + CALL ReadVar( UnIn, FileName,NumTimeStepsChr,'NumTimeStepsChr',' Character string for number of timesteps to read.', & + ErrStatTmp,ErrMsgTmp, UnEchoLocal ) + if (Failed()) return + + ! Check if we asked for the DEFAULT (use what is in the file) + CALL Conv2UC( NumTimeStepsChr ) + IF ( TRIM(NumTimeStepsChr) == 'DEFAULT' ) THEN ! we asked for the default value + DvrFlags%NumTimeSteps = .TRUE. + DvrFlags%NumTimeStepsDefault = .TRUE. ! This flag tells us to use the inflow wind file values + ELSE + ! We probably have a number if it isn't 'DEFAULT', so do an internal read and check to + ! make sure that it was appropriately interpretted. + READ (NumTimeStepsChr,*,IOSTAT=IOS) DvrSettings%NumTimeSteps + IF ( IOS /= 0 ) THEN ! problem in the read, so parse the error. + CALL CheckIOS ( IOS, '', 'NumTimeSteps',NumType, ErrStatTmp, ErrMsgTmp ) + if (Failed()) return + ELSE ! Was ok, so set the flags + DvrFlags%NumTimeSteps = .TRUE. + DvrFlags%NumTimeStepsDefault = .FALSE. + ENDIF + ENDIF + + + ! TStart -- start time + CALL ReadVar( UnIn, FileName,DvrSettings%TStart,'TStart',' Time in wind file to start parsing.', & + ErrStatTmp,ErrMsgTmp, UnEchoLocal ) + if (Failed()) then + return + else + DvrFlags%TStart = .TRUE. + endif + + + !------------------------------------------------------------------------------------------------- + ! SoilDyn setup section + !------------------------------------------------------------------------------------------------- + + ! Header + CALL ReadCom( UnIn, FileName,' SoilDyn setup section, comment line', ErrStatTmp, ErrMsgTmp, UnEchoLocal ) + if (Failed()) return + + + ! DT -- Timestep size for the driver to take (or DEFAULT for what the file contains) + CALL ReadVar( UnIn, FileName,DTChr,'DTChr',' Character string for Timestep size for the driver to take (or DEFAULT for what the file contains).', & + ErrStatTmp,ErrMsgTmp, UnEchoLocal ) + if (Failed()) return + + ! Check if we asked for the DEFAULT (use what is in the file) + CALL Conv2UC( DTChr ) + IF ( TRIM(DTChr) == 'DEFAULT' ) THEN ! we asked for the default value + DvrFlags%DT = .TRUE. + DvrFlags%DTDefault = .TRUE. ! This flag tells us to use the inflow wind file values + ELSE + ! We probably have a number if it isn't 'DEFAULT', so do an internal read and check to + ! make sure that it was appropriately interpretted. + READ (DTChr,*,IOSTAT=IOS) DvrSettings%DT + IF ( IOS /= 0 ) THEN ! problem in the read, so parse the error. + CALL CheckIOS ( IOS, '', 'DT',NumType, ErrStatTmp, ErrMsgTmp ) + if (Failed()) return + ELSE ! Was ok, so set the flags + DvrFlags%DT = .TRUE. + DvrFlags%DTDefault = .FALSE. + ENDIF + ENDIF + + + ! Close the echo and input file + CALL CleanupEchoFile( EchoFileContents, UnEchoLocal ) + CLOSE( UnIn ) + + +CONTAINS + + !> Set error status, close stuff, and return + logical function Failed() + CALL SetErrStat(ErrID_Fatal,ErrMsgTmp,ErrStat,ErrMsg,'ReadDvrIptFile') + if (ErrStat >= AbortErrLev) then + CALL CleanupEchoFile( EchoFileContents, UnEchoLocal ) + CLOSE( UnIn ) + endif + Failed = ErrStat >= AbortErrLev + end function Failed + + !> Clean up the module echo file + subroutine CleanupEchoFile( EchoFlag, UnEcho) + logical, intent(in ) :: EchoFlag ! local version of echo flag + integer(IntKi), intent(in ) :: UnEcho ! echo unit number + + ! Close this module's echo file + if ( EchoFlag ) then + close(UnEcho) + endif + END SUBROUTINE CleanupEchoFile + +END SUBROUTINE ReadDvrIptFile + + +!> This subroutine copies an command line (CL) settings over to the program settings. Warnings are +!! issued if anything is changed from what the driver input file requested. +SUBROUTINE UpdateSettingsWithCL( DvrFlags, DvrSettings, CLFlags, CLSettings, DVRIPT, ErrStat, ErrMsg ) + + TYPE(SlDDriver_Flags), INTENT(INOUT) :: DvrFlags + TYPE(SlDDriver_Settings), INTENT(INOUT) :: DvrSettings + TYPE(SlDDriver_Flags), INTENT(IN ) :: CLFlags + TYPE(SlDDriver_Settings), INTENT(IN ) :: CLSettings + LOGICAL, INTENT(IN ) :: DVRIPT + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + + + ! Local variables + INTEGER(IntKi) :: ErrStatTmp !< Temporary error status for calls + CHARACTER(1024) :: ErrMsgTmp !< Temporary error status for calls + LOGICAL :: WindGridModify !< Did we modify any of the WindGrid related settings? + + ! Initialization + WindGridModify = .FALSE. + + ! Initialize the error handling + ErrStat = ErrID_None + ErrMsg = '' + ErrStatTmp = ErrID_None + ErrMsgTmp = '' + + + !-------------------------------------------- + ! Did we change any time information? + !-------------------------------------------- + + ! Check TStart + IF ( CLFlags%TStart ) THEN + IF ( DvrFlags%TStart .AND. ( .NOT. EqualRealNos(DvrSettings%TStart, CLSettings%TStart) ) ) THEN + CALL SetErrStat( ErrID_Warn, ' Overriding driver input value for TStart with '//TRIM(Num2LStr(CLSettings%TStart))//'.', & + ErrStat,ErrMsg,'UpdateSettingsWithCL') + ELSE + DvrFlags%TStart = .TRUE. + ENDIF + DvrSettings%TStart = CLSettings%TStart + ENDIF + + ! Check DT + IF ( CLFlags%DT ) THEN + IF ( DvrFlags%DT .AND. ( .NOT. EqualRealNos(DvrSettings%DT, CLSettings%DT) ) ) THEN + CALL SetErrStat( ErrID_Warn, ' Overriding driver input value for DT with '//TRIM(Num2LStr(CLSettings%DT))//'.', & + ErrStat,ErrMsg,'UpdateSettingsWithCL') + ELSE + DvrFlags%DT = .TRUE. + ENDIF + DvrSettings%DT = CLSettings%DT + DvrFlags%DTDefault = .FALSE. + ENDIF + + ! Check NumTimeSteps + IF ( CLFlags%NumTimeSteps ) THEN + IF ( DvrFlags%NumTimeSteps .AND. ( DvrSettings%NumTimeSteps /= CLSettings%NumTimeSteps ) ) THEN + CALL SetErrStat( ErrID_Warn, ' Overriding driver input value for NumTimeSteps with '// & + TRIM(Num2LStr(CLSettings%NumTimeSteps))//'.',& + ErrStat,ErrMsg,'UpdateSettingsWithCL') + ELSE + DvrFlags%NumTimeSteps = .TRUE. + ENDIF + DvrSettings%NumTimeSteps = CLSettings%NumTimeSteps + DvrFlags%NumTimeStepsDefault = .FALSE. + ENDIF + + ! Make sure there is at least one timestep + DvrSettings%NumTimeSteps = MAX(DvrSettings%NumTimeSteps,1_IntKi) + + + + !-------------------------------------------- + ! If there was no driver input file, we need to set a few things. + !-------------------------------------------- + + IF ( .NOT. DVRIPT ) THEN + + ! Do we need to set the NumTimeStepsDefault flag? + IF ( .NOT. DvrFlags%NumTimeSteps ) THEN + DvrFlags%NumTimeStepsDefault = .TRUE. + CALL SetErrStat( ErrID_Info,' The number of timesteps is not specified. Defaulting to what is in the wind file.', & + ErrStat,ErrMsg,'UpdateSettingsWithCL') + ENDIF + ENDIF + + + ! If no DT value has been set (DEFAULT requested), we need to set a default to pass into SlD + IF ( .NOT. DvrFlags%DT ) THEN + DvrSettings%DT = 0.025_DbKi ! This value gets passed into the SlD_Init routine, so something must be set. + ENDIF + + +END SUBROUTINE UpdateSettingsWithCL + + +!!!SUBROUTINE ReadPointsFile( PointsFileName, CoordList, ErrStat, ErrMsg ) +!!! +!!! CHARACTER(1024), INTENT(IN ) :: PointsFileName !< Name of the points file to read +!!! REAL(ReKi), ALLOCATABLE, INTENT( OUT) :: CoordList(:,:) !< The coordinates we read in +!!! INTEGER(IntKi), INTENT( OUT) :: ErrStat !< The error status +!!! CHARACTER(*), INTENT( OUT) :: ErrMsg !< The message for the status +!!! +!!! ! Local variables +!!! CHARACTER(1024) :: ErrMsgTmp !< Temporary error message for calls +!!! INTEGER(IntKi) :: ErrStatTmp !< Temporary error status for calls +!!! INTEGER(IntKi) :: FiUnitPoints !< Unit number for points file to open +!!! +!!! INTEGER(IntKi) :: NumDataColumns !< Number of data columns +!!! INTEGER(IntKi) :: NumDataPoints !< Number of lines of data (one point per line) +!!! INTEGER(IntKi) :: NumHeaderLines !< Number of header lines to ignore +!!! +!!! INTEGER(IntKi) :: I !< Generic counter +!!! +!!! ! Initialization of subroutine +!!! ErrMsg = '' +!!! ErrMsgTmp = '' +!!! ErrStat = ErrID_None +!!! ErrStatTmp = ErrID_None +!!! +!!! +!!! ! Now open file +!!! CALL GetNewUnit( FiUnitPoints ) +!!! CALL OpenFInpFile( FiUnitPoints, TRIM(PointsFileName), ErrStatTmp, ErrMsgTmp ) ! Unformatted input file +!!! IF ( ErrStatTmp >= AbortErrLev ) THEN +!!! CALL SetErrStat( ErrStatTmp, ErrMsgTmp, ErrStat, ErrMsg, 'ReadPointsFile') +!!! CLOSE( FiUnitPoints ) +!!! RETURN +!!! ENDIF +!!! +!!! ! Find out how long the file is +!!! CALL GetFileLength( FiUnitPoints, PointsFileName, NumDataColumns, NumDataPoints, NumHeaderLines, ErrMsgTmp, ErrStatTmp ) +!!! IF ( ErrStatTmp >= AbortErrLev ) THEN +!!! CALL SetErrStat( ErrStatTmp, ErrMsgTmp, ErrStat, ErrMsg, 'ReadPointsFile') +!!! CLOSE( FiUnitPoints ) +!!! RETURN +!!! ENDIF +!!! IF ( NumDataColumns /= 3 ) THEN +!!! CALL SetErrStat( ErrID_Fatal,' Expecting three columns in '//TRIM(PointsFileName)//' corresponding to '// & +!!! 'X, Y, and Z coordinates. Instead found '//TRIM(Num2LStr(NumDataColumns))//'.', & +!!! ErrStat, ErrMsg, 'ReadPointsFile') +!!! CLOSE( FiUnitPoints ) +!!! RETURN +!!! ENDIF +!!! +!!! +!!! ! Allocate the storage for the data +!!! CALL AllocAry( CoordList, 3, NumDataPoints, "Array of Points data", ErrStatTmp, ErrMsgTmp ) +!!! IF ( ErrStatTmp >= AbortErrLev ) THEN +!!! CALL SetErrStat( ErrStatTmp, ErrMsgTmp, ErrStat, ErrMsg, 'ReadPointsFile') +!!! CLOSE( FiUnitPoints ) +!!! RETURN +!!! ENDIF +!!! +!!! +!!! ! Read in the headers and throw them away +!!! DO I=1,NumHeaderLines +!!! CALL ReadCom( FiUnitPoints, PointsFileName,' Points file header line', ErrStatTmp, ErrMsgTmp ) +!!! IF ( ErrStatTmp /= ErrID_None ) THEN +!!! CALL SetErrStat(ErrID_Fatal,ErrMsgTmp,ErrStat,ErrMsg,'ReadPointsFile') +!!! CLOSE( FiUnitPoints ) +!!! RETURN +!!! ENDIF +!!! ENDDO +!!! +!!! ! Read in the datapoints +!!! DO I=1,NumDataPoints +!!! CALL ReadAry ( FiUnitPoints, PointsFileName, CoordList(:,I), 3, 'CoordList', & +!!! 'Coordinate point from Points file', ErrStatTmp, ErrMsgTmp) +!!! IF ( ErrStat /= ErrID_None ) THEN +!!! CALL SetErrStat( ErrID_Fatal,ErrMsgTmp,ErrStat,ErrMsg,'ReadPointsFile') +!!! CLOSE( FiUnitPoints ) +!!! RETURN +!!! ENDIF +!!! ENDDO +!!! +!!! CLOSE( FiUnitPoints ) +!!! +!!!CONTAINS +!!! +!!! !------------------------------------------------------------------------------------------------------------------------------- +!!! !> This subroutine looks at a file that has been opened and finds out how many header lines there are, how many columns there +!!! !! are, and how many lines of data there are in the file. +!!! !! +!!! !! A few things are assumed about the file: +!!! !! 1. Any header lines are the first thing in the file. +!!! !! 2. No text appears anyplace other than in first part of the file +!!! !! 3. The datalines only contain numbers that can be read in as reals. +!!! !! +!!! !! Limitations: +!!! !! 1. only handles up to 20 words (columns) on a line +!!! !! 2. empty lines are considered text lines +!!! !! 3. All data rows must contain the same number of columns +!!! !! +!!! !! +!!! SUBROUTINE GetFileLength(UnitDataFile, DataFileName, NumDataColumns, NumDataLines, NumHeaderLines, ErrMsg, ErrStat) +!!! +!!! IMPLICIT NONE +!!! +!!! ! Passed variables +!!! INTEGER(IntKi), INTENT(IN ) :: UnitDataFile !< Unit number of the file we are looking at. +!!! CHARACTER(*), INTENT(IN ) :: DataFileName !< The name of the file we are looking at. +!!! INTEGER(IntKi), INTENT( OUT) :: NumDataColumns !< The number of columns in the data file. +!!! INTEGER(IntKi), INTENT( OUT) :: NumDataLines !< Number of lines containing data +!!! INTEGER(IntKi), INTENT( OUT) :: NumHeaderLines !< Number of header lines at the start of the file +!!! CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error Message to return (empty if all good) +!!! INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Status flag if there were any problems (ErrID_None if all good) +!!! +!!! ! Local Variables +!!! CHARACTER(2048) :: ErrMsgTmp !< Temporary message variable. Used in calls. +!!! INTEGER(IntKi) :: ErrStatTmp !< Temporary error status. Used in calls. +!!! INTEGER(IntKi) :: LclErrStat !< Temporary error status. Used locally to indicate when we have reached the end of the file. +!!! INTEGER(IntKi) :: TmpIOErrStat !< Temporary error status for the internal read of the first word to a real number +!!! LOGICAL :: IsRealNum !< Flag indicating if the first word on the line was a real number +!!! +!!! CHARACTER(1024) :: TextLine !< One line of text read from the file +!!! INTEGER(IntKi) :: LineLen !< The length of the line read in +!!! CHARACTER(1024) :: StrRead !< String containing the first word read in +!!! REAL(ReKi) :: RealRead !< Returns value of the number (if there was one), or NaN (as set by NWTC_Num) if there wasn't +!!! CHARACTER(1024) :: VarName !< Name of the variable we are trying to read from the file +!!! CHARACTER(24) :: Words(20) !< Array of words we extract from a line. We shouldn't have more than 20. +!!! INTEGER(IntKi) :: i,j,k !< simple integer counters +!!! INTEGER(IntKi) :: LineNumber !< the line I am on +!!! LOGICAL :: LineHasText !< Flag indicating if the line I just read has text. If so, it is a header line. +!!! LOGICAL :: HaveReadData !< Flag indicating if I have started reading data. +!!! INTEGER(IntKi) :: NumWords !< Number of words on a line +!!! INTEGER(IntKi) :: FirstDataLineNum !< Line number of the first row of data in the file +!!! +!!! +!!! ! Initialize the error handling +!!! ErrStat = ErrID_None +!!! ErrStatTmp = ErrID_None +!!! LclErrStat = ErrID_None +!!! ErrMsg = '' +!!! ErrMsgTmp = '' +!!! +!!! +!!! ! Set some of the flags and counters +!!! HaveReadData = .FALSE. +!!! NumDataColumns = 0 +!!! NumHeaderLines = 0 +!!! NumDataLines = 0 +!!! LineNumber = 0 +!!! +!!! +!!! ! Just in case we were handed a file that we are part way through reading (should never be true), rewind to the start +!!! +!!! REWIND( UnitDataFile ) +!!! +!!! +!!! !------------------------------------ +!!! !> The variable LclErrStat is used to indicate when we have reached the end of the file or had an error from +!!! !! ReadLine. Until that occurs, we read each line, and decide if it contained any non-numeric data. The +!!! !! first group of lines containing non-numeric data is considered the header. The first line of all numeric +!!! !! data is considered the start of the data section. Any non-numeric containing found within the data section +!!! !! will be considered as an invalid file format at which point we will return a fatal error from this routine. +!!! +!!! DO WHILE ( LclErrStat == ErrID_None ) +!!! +!!! !> Reset the indicator flag for the non-numeric content +!!! LineHasText = .FALSE. +!!! +!!! !> Read in a single line from the file +!!! CALL ReadLine( UnitDataFile, '', TextLine, LineLen, LclErrStat ) +!!! +!!! !> If there was an error in reading the file, then exit. +!!! !! Possible causes: reading beyond end of file in which case we are done so don't process it. +!!! IF ( LclErrStat /= ErrID_None ) EXIT +!!! +!!! !> Increment the line counter. +!!! LineNumber = LineNumber + 1 +!!! +!!! !> Read all the words on the line into the array called 'Words'. Only the first words will be encountered +!!! !! will be stored. The others are empty (i.e. only three words on the line, so the remaining 17 are empty). +!!! CALL GetWords( TextLine, Words, 20 ) +!!! +!!! !> Cycle through and count how many are not empty. Once an empty value is encountered, all the rest should +!!! !! be empty if GetWords worked correctly. The index of the last non-empty value is stored. +!!! DO i=1,20 +!!! IF (TRIM(Words(i)) .ne. '') NumWords=i +!!! ENDDO +!!! +!!! +!!! !> Now cycle through the first 'NumWords' of non-empty values stored in 'Words'. Words should contain +!!! !! everything that is one the line. The subroutine ReadRealNumberFromString will set a flag 'IsRealNum' +!!! !! when the value in Words(i) can be read as a real(ReKi). 'StrRead' will contain the string equivalent. +!!! DO i=1,NumWords +!!! CALL ReadRealNumberFromString( Words(i), RealRead, StrRead, IsRealNum, ErrStatTmp, ErrMsgTmp, TmpIOErrStat ) +!!! IF ( .NOT. IsRealNum) THEN +!!! LineHasText = .TRUE. +!!! ENDIF +!!! ENDDO +!!! +!!! !> If all the words on that line had no text in them, then it must have been a line of data. +!!! !! If not, then we have either a header line, which is ok, or a line containing text in the middle of the +!!! !! the data section, which is not good (the flag HaveReadData tells us which case this is). +!!! IF ( LineHasText ) THEN +!!! IF ( HaveReadData ) THEN ! Uh oh, we have already read a line of data before now, so there is a problem +!!! CALL SetErrStat( ErrID_Fatal, ' Found text on line '//TRIM(Num2LStr(LineNumber))//' of '//TRIM(DataFileName)// & +!!! ' when real numbers were expected. There may be a problem with format of the file: '// & +!!! TRIM(DataFileName)//'.', ErrStat, ErrMsg, 'GetFileLength') +!!! IF ( ErrStat >= AbortErrLev ) THEN +!!! RETURN +!!! ENDIF +!!! ELSE +!!! NumHeaderLines = NumHeaderLines + 1 +!!! ENDIF +!!! ELSE ! No text, must be data line +!!! NumDataLines = NumDataLines + 1 +!!! ! If this is the first row of data, then store the number of words that were on the line +!!! IF ( .NOT. HaveReadData ) THEN +!!! ! If this is the first line of data, keep some relevant info about it and the number of columns in it +!!! HaveReadData = .TRUE. +!!! FirstDataLineNum = LineNumber ! Keep the line number of the first row of data (for error reporting) +!!! NumDataColumns = NumWords +!!! ELSE +!!! ! Make sure that the number columns on the row matches the number of columnns on the first row of data. +!!! IF ( NumWords /= NumDataColumns ) THEN +!!! CALL SetErrStat( ErrID_Fatal, ' Error in file: '//TRIM(DataFileName)//'.'// & +!!! ' The number of data columns on line '//TRIM(Num2LStr(LineNumber))// & +!!! '('//TRIM(Num2LStr(NumWords))//' columns) is different than the number of columns on first row of data '// & +!!! ' (line: '//TRIM(Num2LStr(FirstDataLineNum))//', '//TRIM(Num2LStr(NumDataColumns))//' columns).', & +!!! ErrStat, ErrMsg, 'GetFileLength') +!!! IF ( ErrStat >= AbortErrLev ) THEN +!!! RETURN +!!! ENDIF +!!! ENDIF +!!! ENDIF +!!! ENDIF +!!! +!!! ENDDO +!!! +!!! +!!! REWIND( UnitDataFile ) +!!! +!!! END SUBROUTINE GetFileLength +!!! +!!! !------------------------------------------------------------------------------- +!!! !> This subroutine takes a line of text that is passed in and reads the first +!!! !! word to see if it is a number. An internal read is used to do this. If +!!! !! it is a number, it is started in ValueRead and returned. The flag IsRealNum +!!! !! is set to true. Otherwise, ValueRead is set to NaN (value from the NWTC_Num) +!!! !! and the flag is set to false. +!!! !! +!!! !! The IsRealNum flag is set to indicate if we actually have a real number or +!!! !! not. After calling this routine, a simple if statement can be used: +!!! !! +!!! !! @code +!!! !! IF (IsRealNum) THEN +!!! !! ! do something +!!! !! ELSE +!!! !! ! do something else +!!! !! ENDIF +!!! !! @endcode +!!! !! +!!! !------------------------------------------------------------------------------- +!!! SUBROUTINE ReadRealNumberFromString(StringToParse, ValueRead, StrRead, IsRealNum, ErrStat, ErrMsg, IOErrStat) +!!! +!!! CHARACTER(*), INTENT(IN ) :: StringToParse !< The string we were handed. +!!! REAL(ReKi), INTENT( OUT) :: ValueRead !< The variable being read. Returns as NaN (library defined) if not a Real. +!!! CHARACTER(*), INTENT( OUT) :: StrRead !< A string containing what was read from the ReadNum routine. +!!! LOGICAL, INTENT( OUT) :: IsRealNum !< Flag indicating if we successfully read a Real +!!! INTEGER(IntKi), INTENT( OUT) :: ErrStat !< ErrID level returned from ReadNum +!!! CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message including message from ReadNum +!!! INTEGER(IntKi), INTENT( OUT) :: IOErrStat !< Error status from the internal read. Useful for diagnostics. +!!! +!!! +!!! +!!! ! Initialize some things +!!! ErrStat = ErrID_None +!!! ErrMsg = '' +!!! +!!! +!!! ! ReadNum returns a string contained in StrRead. So, we now try to do an internal read to VarRead and then trap errors. +!!! read(StringToParse,*,IOSTAT=IOErrStat) StrRead +!!! read(StringToParse,*,IOSTAT=IOErrStat) ValueRead +!!! +!!! +!!! ! If IOErrStat==0, then we have a real number, anything else is a problem. +!!! if (IOErrStat==0) then +!!! IsRealNum = .TRUE. +!!! else +!!! IsRealNum = .FALSE. +!!! ValueRead = NaN ! This is NaN as defined in the NWTC_Num. +!!! ErrMsg = 'Not a real number. '//TRIM(ErrMsgTmp)//NewLine +!!! ErrSTat = ErrID_Severe +!!! endif +!!! +!!! +!!! +!!! RETURN +!!! END SUBROUTINE ReadRealNumberFromString +!!! +!!! +!!! !------------------------------------------------------------------------------------------------------------------------------- +!!! !------------------------------------------------------------------------------- +!!! !> This subroutine works with the ReadNum routine from the library. ReadNum is +!!! !! called to read a word from the input file. An internal read is then done to +!!! !! convert the string to a number that is stored in VarRead and returned. +!!! !! +!!! !! The IsRealNum flag is set to indicate if we actually have a real number or +!!! !! not. After calling this routine, a simple if statement can be used: +!!! !! +!!! !! @code +!!! !! IF (ISRealNum) THEN +!!! !! ! do something +!!! !! ELSE +!!! !! ! do something else +!!! !! ENDIF +!!! !! @endcode +!!! !! +!!! !------------------------------------------------------------------------------- +!!! SUBROUTINE ReadRealNumber(UnitNum, FileName, VarName, VarRead, StrRead, IsRealNum, ErrStat, ErrMsg, IOErrStat) +!!! +!!! INTEGER(IntKi), INTENT(IN ) :: UnitNum !< The unit number of the file being read +!!! CHARACTER(*), INTENT(IN ) :: FileName !< The name of the file being read. Used in the ErrMsg from ReadNum (Library routine). +!!! CHARACTER(*), INTENT(IN ) :: VarName !< The variable we are reading. Used in the ErrMsg from ReadNum (Library routine)'. +!!! REAL(ReKi), INTENT( OUT) :: VarRead !< The variable being read. Returns as NaN (library defined) if not a Real. +!!! CHARACTER(*), INTENT( OUT) :: StrRead !< A string containing what was read from the ReadNum routine. +!!! LOGICAL, INTENT( OUT) :: IsRealNum !< Flag indicating if we successfully read a Real +!!! INTEGER(IntKi), INTENT( OUT) :: ErrStat !< ErrID level returned from ReadNum +!!! CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message including message from ReadNum +!!! INTEGER(IntKi), INTENT( OUT) :: IOErrStat !< Error status from the internal read. Useful for diagnostics. +!!! +!!! ! Local vars +!!! INTEGER(IntKi) :: ErrStatTmp +!!! CHARACTER(2048) :: ErrMsgTmp +!!! +!!! +!!! +!!! ! Initialize some things +!!! ErrStat = ErrID_None +!!! ErrMsg = '' +!!! +!!! +!!! ! Now call the ReadNum routine to get the number +!!! ! If it is a word that does not start with T or F, then ReadNum won't give any errors. +!!! CALL ReadNum( UnitNum, FileName, StrRead, VarName, ErrStatTmp, ErrMsgTmp) +!!! +!!! +!!! ! ReadNum returns a string contained in StrRead. So, we now try to do an internal read to VarRead and then trap errors. +!!! read(StrRead,*,IOSTAT=IOErrStat) VarRead +!!! +!!! +!!! ! If IOErrStat==0, then we have a real number, anything else is a problem. +!!! if (IOErrStat==0) then +!!! IsRealNum = .TRUE. +!!! else +!!! IsRealNum = .FALSE. +!!! VarRead = NaN ! This is NaN as defined in the NWTC_Num. +!!! ErrMsg = 'Not a real number. '//TRIM(ErrMsgTmp)//NewLine +!!! ErrStat = ErrStatTmp ! The ErrStatTmp returned by the ReadNum routine is an ErrID level. +!!! endif +!!! +!!! +!!! +!!! RETURN +!!! END SUBROUTINE ReadRealNumber +!!! +!!! +!!!END SUBROUTINE ReadPointsFile + + + +!!!SUBROUTINE WindGridMessage( Settings, ToFile, Msg, MsgLen ) +!!! +!!! TYPE(SlDDriver_Settings), INTENT(IN ) :: Settings +!!! LOGICAL, INTENT(IN ) :: ToFile !< Prepend comment character +!!! CHARACTER(2048), INTENT( OUT) :: Msg +!!! INTEGER(IntKi), INTENT( OUT) :: MsgLen +!!! +!!! ! Local Variables +!!! CHARACTER(11) :: TmpNumString +!!! INTEGER(IntKi) :: ErrStatTmp +!!! +!!! Msg = '' +!!! +!!! IF ( ToFile ) THEN +!!! Msg='# ' +!!! ELSE +!!! Msg="Requested wind grid data will be written to "//TRIM(Settings%WindGridOutputName)//'.' +!!! ENDIF +!!! Msg = TRIM(Msg)//" Requested data:"//NewLine +!!! +!!! ! Header info: +!!! Msg = TRIM(Msg) +!!! IF ( ToFile ) Msg=TRIM(Msg)//'#' +!!! Msg = TRIM(Msg)//" Dimension Range Stepsize Num. points"//NewLine +!!! IF ( ToFile ) Msg=TRIM(Msg)//'#' +!!! Msg = TRIM(Msg)//" -------------------------------------------------------------------"//NewLine +!!! ! X direction +!!! WRITE(TmpNumString,'(f7.2)',IOSTAT=ErrStatTmp) Settings%XRange(1) +!!! IF ( ToFile ) THEN +!!! Msg= TRIM(Msg)//"# X" +!!! ELSE +!!! Msg= TRIM(Msg)//" X" +!!! ENDIF +!!! MsgLen= LEN_TRIM(Msg) +!!! Msg = Msg(1:MsgLen)//" "//TmpNumString(1:10) +!!! MsgLen= MsgLen+7+10 +!!! +!!! WRITE(TmpNumString,'(f7.2)',IOSTAT=ErrStatTmp) Settings%XRange(2) +!!! Msg = Msg(1:MsgLen)//" -> "//TmpNumString(1:10) +!!! MsgLen= MsgLen+4+10 +!!! +!!! WRITE(TmpNumString,'(f7.2)',IOSTAT=ErrStatTmp) Settings%GridDelta(1) +!!! Msg = Msg(1:MsgLen)//" "//TmpNumString(1:10) +!!! MsgLen= MsgLen+4+10 +!!! +!!! WRITE(TmpNumString,'(i6)',IOSTAT=ErrStatTmp) Settings%GridN(1) +!!! Msg = Msg(1:MsgLen)//" "//TmpNumString(1:6)//NewLine +!!! MsgLen= MsgLen+6+6 +!!! +!!! +!!! ! Y direction +!!! WRITE(TmpNumString,'(f7.2)',IOSTAT=ErrStatTmp) Settings%YRange(1) +!!! IF ( ToFile ) THEN +!!! Msg= TRIM(Msg)//"# Y" +!!! ELSE +!!! Msg= TRIM(Msg)//" Y" +!!! ENDIF +!!! MsgLen= LEN_TRIM(Msg) +!!! Msg = Msg(1:MsgLen)//" "//TmpNumString(1:10) +!!! MsgLen= MsgLen+7+10 +!!! +!!! WRITE(TmpNumString,'(f7.2)',IOSTAT=ErrStatTmp) Settings%YRange(2) +!!! Msg = Msg(1:MsgLen)//" -> "//TmpNumString(1:10) +!!! MsgLen= MsgLen+4+10 +!!! +!!! WRITE(TmpNumString,'(f7.2)',IOSTAT=ErrStatTmp) Settings%GridDelta(2) +!!! Msg = Msg(1:MsgLen)//" "//TmpNumString(1:10) +!!! MsgLen= MsgLen+4+10 +!!! +!!! WRITE(TmpNumString,'(i6)',IOSTAT=ErrStatTmp) Settings%GridN(2) +!!! Msg = Msg(1:MsgLen)//" "//TmpNumString(1:6)//NewLine +!!! MsgLen= MsgLen+6+6 +!!! +!!! +!!! ! Z direction +!!! WRITE(TmpNumString,'(f7.2)',IOSTAT=ErrStatTmp) Settings%ZRange(1) +!!! IF ( ToFile ) THEN +!!! Msg= TRIM(Msg)//"# Z" +!!! ELSE +!!! Msg= TRIM(Msg)//" Z" +!!! ENDIF +!!! MsgLen= LEN_TRIM(Msg) +!!! Msg = Msg(1:MsgLen)//" "//TmpNumString(1:10) +!!! MsgLen= MsgLen+7+10 +!!! +!!! WRITE(TmpNumString,'(f7.2)',IOSTAT=ErrStatTmp) Settings%ZRange(2) +!!! Msg = Msg(1:MsgLen)//" -> "//TmpNumString(1:10) +!!! MsgLen= MsgLen+4+10 +!!! +!!! WRITE(TmpNumString,'(f7.2)',IOSTAT=ErrStatTmp) Settings%GridDelta(3) +!!! Msg = Msg(1:MsgLen)//" "//TmpNumString(1:10) +!!! MsgLen= MsgLen+4+10 +!!! +!!! WRITE(TmpNumString,'(i6)',IOSTAT=ErrStatTmp) Settings%GridN(3) +!!! Msg = Msg(1:MsgLen)//" "//TmpNumString(1:6)//NewLine +!!! MsgLen= MsgLen+6+6 +!!! +!!! +!!! ! T direction +!!! WRITE(TmpNumString,'(f10.4)',IOSTAT=ErrStatTmp) Settings%TStart +!!! IF ( ToFile ) THEN +!!! Msg= TRIM(Msg)//"# T" +!!! ELSE +!!! Msg= TRIM(Msg)//" T" +!!! ENDIF +!!! MsgLen= LEN_TRIM(Msg) +!!! Msg = Msg(1:MsgLen)//" "//TmpNumString(1:11) +!!! MsgLen= MsgLen+7+11 +!!! +!!! WRITE(TmpNumString,'(f10.4)',IOSTAT=ErrStatTmp) Settings%TStart+Settings%DT*Settings%NumTimeSteps +!!! Msg = Msg(1:MsgLen)//"->"//TmpNumString(1:11) +!!! MsgLen= MsgLen+4+11 +!!! +!!! WRITE(TmpNumString,'(f10.4)',IOSTAT=ErrStatTmp) Settings%DT +!!! Msg = Msg(1:MsgLen)//" "//TmpNumString(1:11) +!!! MsgLen= MsgLen+4+11 +!!! +!!! WRITE(TmpNumString,'(i8)',IOSTAT=ErrStatTmp) Settings%NumTimeSteps +!!! Msg = Msg(1:MsgLen)//" "//TmpNumString(1:8) !//NewLine +!!! MsgLen= MsgLen+6+8 +!!! +!!!END SUBROUTINE + + +!!!!> This subroutine outputs the results of the WindGrid calculations information at each timestep. +!!!SUBROUTINE WindGridVel_OutputWrite (FileUnit, FileName, Initialized, Settings, GridXYZ, GridVel, TIME, ErrStat, ErrMsg) +!!! +!!! INTEGER(IntKi), INTENT(INOUT) :: FileUnit !< Unit number for the output file +!!! CHARACTER(*), INTENT(IN ) :: FileName !< Name of the current unit number +!!! LOGICAL, INTENT(INOUT) :: Initialized !< Was this file started before? +!!! TYPE(SlDDriver_Settings), INTENT(IN ) :: Settings !< Settings for SlD driver +!!! REAL(ReKi), ALLOCATABLE, INTENT(IN ) :: GridXYZ(:,:) !< The position grid passed in +!!! REAL(ReKi), ALLOCATABLE, INTENT(IN ) :: GridVel(:,:) !< The velocity grid passed in +!!! REAL(DbKi), INTENT(IN ) :: TIME !< The current time +!!! INTEGER(IntKi), INTENT( OUT) :: ErrStat !< returns a non-zero value when an error occurs +!!! CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None +!!! +!!! ! Temporary local variables +!!! INTEGER(IntKi) :: ErrStatTmp !< Temporary variable for the status of error message +!!! CHARACTER(2048) :: ErrMsgTmp !< Temporary variable for the error message +!!! INTEGER(IntKi) :: LenErrMsgTmp !< Length of ErrMsgTmp (for getting WindGrid info) +!!! +!!! CHARACTER(52) :: WindVelFmt !< Format specifier for the output file for wave elevation series +!!! INTEGER(IntKi) :: I !< generic counter +!!! +!!! +!!! WindVelFmt = "(F14.7,3x,F14.7,3x,F14.7,3x,F14.7,3x,F14.7,3x,F14.7)" +!!! +!!! ErrMsg = '' +!!! ErrStat = ErrID_None +!!! ErrMsgTmp = '' +!!! ErrStatTmp = ErrID_None +!!! +!!! +!!! ! If it hasn't been initially written to, do this then exit. Otherwise set a few things and continue. +!!! IF ( .NOT. Initialized ) THEN +!!! +!!! CALL GetNewUnit( FileUnit ) +!!! CALL OpenFOutFile( FileUnit, TRIM(FileName), ErrStatTmp, ErrMsgTmp ) +!!! CALL SetErrStat( ErrStatTmp, ErrMsgTmp, ErrStat, ErrMsg, 'WindGridVel_OutputWrite' ) +!!! IF ( ErrStat >= AbortErrLev ) RETURN +!!! +!!! Initialized = .TRUE. +!!! +!!! ! Write header section +!!! WRITE( FileUnit,'(A)', IOSTAT=ErrStatTmp ) '## This file was generated by '//TRIM(GetNVD(Settings%ProgInfo))// & +!!! ' on '//CurDate()//' at '//CurTime()//'.' +!!! WRITE( FileUnit,'(A)', IOSTAT=ErrStatTmp ) '## This file contains the wind velocity at a grid of points at each '// & +!!! 'requested timestep' +!!! WRITE (FileUnit,'(A)', IOSTAT=ErrStatTmp ) '## It is arranged as blocks of X,Y,Z,U,V,W at each timestep' +!!! WRITE (FileUnit,'(A)', IOSTAT=ErrStatTmp ) '## Each block is separated by two blank lines for use in gnuplot' +!!! WRITE (FileUnit,'(A)', IOSTAT=ErrStatTmp ) '# ' +!!! CALL WindGridMessage( Settings, .TRUE., ErrMsgTmp, LenErrMsgTmp ) +!!! WRITE (FileUnit,'(A)', IOSTAT=ErrStatTmp ) ErrMsgTmp(1:LenErrMsgTmp) +!!! WRITE (FileUnit,'(A)', IOSTAT=ErrStatTmp ) '# ' +!!! WRITE (FileUnit,'(A)', IOSTAT=ErrStatTmp ) '# ' +!!! WRITE (FileUnit,'(A)', IOSTAT=ErrStatTmp ) '# X Y Z '// & +!!! ' U V W' +!!! WRITE (FileUnit,'(A)', IOSTAT=ErrStatTmp ) '# (m) (m) (m) '// & +!!! ' (m/s) (m/s) (m/s)' +!!! ELSE +!!! +!!! WRITE (FileUnit,'(A)', IOSTAT=ErrStatTmp ) NewLine//NewLine +!!! WRITE (FileUnit,'(A)', IOSTAT=ErrStatTmp ) '# Time: '//TRIM(Num2LStr(TIME)) +!!! +!!! DO I = 1,SIZE(GridXYZ,DIM=2) +!!! +!!! WRITE (FileUnit,WindVelFmt, IOSTAT=ErrStatTmp ) GridXYZ(1,I),GridXYZ(2,I),GridXYZ(3,I),GridVel(1,I),GridVel(2,I),GridVel(3,I) +!!! +!!! ENDDO +!!! +!!! ENDIF +!!! +!!!END SUBROUTINE WindGridVel_OutputWrite +!!! +!!! +!!!SUBROUTINE PointsVel_OutputWrite (FileUnit, FileName, Initialized, Settings, GridXYZ, GridVel, TIME, ErrStat, ErrMsg) +!!! +!!! INTEGER(IntKi), INTENT(INOUT) :: FileUnit !< Unit number for the output file +!!! CHARACTER(*), INTENT(IN ) :: FileName !< Name of the current unit number +!!! LOGICAL, INTENT(INOUT) :: Initialized !< Was this file started before? +!!! TYPE(SlDDriver_Settings), INTENT(IN ) :: Settings !< Settings for SlD driver +!!! REAL(ReKi), ALLOCATABLE, INTENT(IN ) :: GridXYZ(:,:) !< The position grid passed in +!!! REAL(ReKi), ALLOCATABLE, INTENT(IN ) :: GridVel(:,:) !< The velocity grid passed in +!!! REAL(DbKi), INTENT(IN ) :: TIME !< The current time +!!! INTEGER(IntKi), INTENT( OUT) :: ErrStat !< returns a non-zero value when an error occurs +!!! CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None +!!! +!!! ! Temporary local variables +!!! INTEGER(IntKi) :: ErrStatTmp !< Temporary variable for the status of error message +!!! CHARACTER(2048) :: ErrMsgTmp !< Temporary variable for the error message +!!! INTEGER(IntKi) :: LenErrMsgTmp !< Length of ErrMsgTmp (for getting WindGrid info) +!!! INTEGER(IntKi) :: I !< Generic counter +!!! +!!! CHARACTER(61) :: PointsVelFmt !< Format specifier for the output file for wave elevation series +!!! +!!! +!!! PointsVelFmt = "(F14.7,3x,F14.7,3x,F14.7,3x,F14.7,3x,F14.7,3x,F14.7,3x,F14.7)" +!!! +!!! ErrMsg = '' +!!! ErrStat = ErrID_None +!!! ErrMsgTmp = '' +!!! ErrStatTmp = ErrID_None +!!! +!!! +!!! ! If it hasn't been initially written to, do this then exit. Otherwise set a few things and continue. +!!! IF ( .NOT. Initialized ) THEN +!!! +!!! CALL GetNewUnit( FileUnit ) +!!! CALL OpenFOutFile( FileUnit, TRIM(FileName), ErrStatTmp, ErrMsgTmp ) +!!! CALL SetErrStat( ErrStatTmp, ErrMsgTmp, ErrStat, ErrMsg, 'PointsVel_OutputWrite' ) +!!! IF ( ErrStat >= AbortErrLev ) RETURN +!!! +!!! Initialized = .TRUE. +!!! +!!! ! Write header section +!!! WRITE( FileUnit,'(A)', IOSTAT=ErrStatTmp ) '## This file was generated by '//TRIM(GetNVD(Settings%ProgInfo))// & +!!! ' on '//CurDate()//' at '//CurTime()//'.' +!!! WRITE( FileUnit,'(A)', IOSTAT=ErrStatTmp ) '## This file contains the wind velocity at the '// & +!!! TRIM(Num2LStr(SIZE(GridXYZ,DIM=2)))//' points specified in the '// & +!!! 'file '//TRIM(Settings%PointsFileName)//'.' +!!! WRITE (FileUnit,'(A)', IOSTAT=ErrStatTmp ) '# ' +!!! WRITE (FileUnit,'(A)', IOSTAT=ErrStatTmp ) '# T X Y Z '// & +!!! ' U V W' +!!! WRITE (FileUnit,'(A)', IOSTAT=ErrStatTmp ) '# (s) (m) (m) (m) '// & +!!! ' (m/s) (m/s) (m/s)' +!!! ELSE +!!! +!!! DO I = 1,SIZE(GridXYZ,DIM=2) +!!! +!!! WRITE (FileUnit,PointsVelFmt, IOSTAT=ErrStatTmp ) TIME,GridXYZ(1,I),GridXYZ(2,I),GridXYZ(3,I),GridVel(1,I),GridVel(2,I),GridVel(3,I) +!!! +!!! ENDDO +!!! +!!! ENDIF +!!! +!!!END SUBROUTINE PointsVel_OutputWrite + + + + +!> This routine exists only to support the development of the module. It will not be needed after the module is complete. +SUBROUTINE printSettings( DvrFlags, DvrSettings ) + ! The arguments + TYPE( SlDDriver_Flags ), INTENT(IN ) :: DvrFlags !< Flags indicating which settings were set + TYPE( SlDDriver_Settings ), INTENT(IN ) :: DvrSettings !< Stored settings + + CALL WrsCr(TRIM(GetNVD(DvrSettings%ProgInfo))) + CALL WrScr(' DvrIptFile: '//FLAG(DvrFlags%DvrIptFile)// ' '//TRIM(DvrSettings%DvrIptFileName)) + CALL WrScr(' SlDIptFile: '//FLAG(DvrFlags%SlDIptFile)// ' '//TRIM(DvrSettings%SlDIptFileName)) + CALL WrScr(' TStart: '//FLAG(DvrFlags%TStart)// ' '//TRIM(Num2LStr(DvrSettings%TStart))) + IF ( DvrFlags%DTDefault) THEN + CALL WrScr(' DT: '//FLAG(DvrFlags%DT)// ' DEFAULT') + ELSE + CALL WrScr(' DT: '//FLAG(DvrFlags%DT)// ' '//TRIM(Num2LStr(DvrSettings%DT))) + ENDIF + IF ( DvrFlags%NumTimeStepsDefault) THEN + CALL WrScr(' NumTimeSteps: '//FLAG(DvrFlags%NumTimeSteps)// ' DEFAULT') + ELSE + CALL WrScr(' NumTimeSteps: '//FLAG(DvrFlags%NumTimeSteps)// ' '//TRIM(Num2LStr(DvrSettings%NumTimeSteps))) + ENDIF + RETURN +END SUBROUTINE printSettings + + +!> This routine exists only to support the development of the module. It will not be kept after the module is complete. +!! This routine takes a flag setting (LOGICAL) and exports either 'T' or '-' for T/F (respectively) +FUNCTION FLAG(flagval) + LOGICAL, INTENT(IN ) :: flagval !< Value of the flag + CHARACTER(1) :: FLAG !< character interpretation (for prettiness when printing) + IF ( flagval ) THEN + FLAG = 'T' + ELSE + FLAG = '-' + ENDIF + RETURN +END FUNCTION FLAG + +END MODULE SoilDyn_Driver_Subs diff --git a/modules/soildyn/src/driver/SoilDyn_Driver_Types.f90 b/modules/soildyn/src/driver/SoilDyn_Driver_Types.f90 new file mode 100644 index 000000000..fbe863a58 --- /dev/null +++ b/modules/soildyn/src/driver/SoilDyn_Driver_Types.f90 @@ -0,0 +1,107 @@ +!********************************************************************************************************************************** +! +! MODULE: SlD_Driver_Types - This module contains types used by the SoilDyn Driver program to store arguments passed in +! +! The types listed here are used within the SoilDyn Driver program to store the settings. These settings are read in as +! command line arguments, then stored within these types. +! +!********************************************************************************************************************************** +! +!.................................................................................................................................. +! LICENSING +! Copyright (C) 2015 National Renewable Energy Laboratory +! +! This file is part of SoilDyn. +! +! SoilDyn is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as +! published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. +! +! This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty +! of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +! +! You should have received a copy of the GNU General Public License along with SoilDyn. +! If not, see . +! +!********************************************************************************************************************************** + +MODULE SoilDyn_Driver_Types + + USE NWTC_Library + USE SoilDyn_Types + + IMPLICIT NONE + + !> This contains flags to note if the settings were made. This same data structure is + !! used both during the driver input file and the command line options. + !! + !! NOTE: The WindFileType is only set if it is given as a command line option. Otherwise + !! it is handled internally by InflowWInd. + !! + !! NOTE: The wind direction is specified by the SoilDyn input file. + TYPE :: SlDDriver_Flags + LOGICAL :: DvrIptFile = .FALSE. !< Was an input file name given on the command line? + LOGICAL :: SlDIptFile = .FALSE. !< Was an SoilDyn input file requested? +! LOGICAL :: Summary = .FALSE. !< create a summary at command line? (data extents in the wind file) +! LOGICAL :: SummaryFile = .FALSE. !< create a summary file of the output? + LOGICAL :: TStart = .FALSE. !< specified a start time + LOGICAL :: NumTimeSteps = .FALSE. !< specified a number of timesteps to process + LOGICAL :: NumTimeStepsDefault = .FALSE. !< specified a 'DEFAULT' for number of timesteps to process + LOGICAL :: DT = .FALSE. !< specified a resolution in time + LOGICAL :: DTDefault = .FALSE. !< specified a 'DEFAULT' for the time resolution + +! LOGICAL :: FFTcalc = .FALSE. !< do an FFT + +! LOGICAL :: WindGrid = .FALSE. !< Requested output of wind data on a grid -- input file option only +! LOGICAL :: XRange = .FALSE. !< specified a range of x -- command line option only -- stored as GridCtrCoord and GridDelta +! LOGICAL :: YRange = .FALSE. !< specified a range of y -- command line option only -- stored as GridCtrCoord and GridDelta +! LOGICAL :: ZRange = .FALSE. !< specified a range of z -- command line option only -- stored as GridCtrCoord and GridDelta +! LOGICAL :: Dx = .FALSE. !< specified a resolution in x -- command line option only, 0.0 otherwise +! LOGICAL :: Dy = .FALSE. !< speficied a resolution in y +! LOGICAL :: Dz = .FALSE. !< specified a resolution in z + +! LOGICAL :: PointsFile = .FALSE. !< points filename to read in -- command line option only + +! LOGICAL :: WindGridOutputInit = .FALSE. !< Is the WindGridOut file initialized +! LOGICAL :: PointsOutputInit = .FALSE. !< Is the Points output file initialized +! LOGICAL :: FFTOutputInit = .FALSE. !< Is the FFT output file initialized + LOGICAL :: Verbose = .FALSE. !< Verbose error reporting + LOGICAL :: VVerbose = .FALSE. !< Very Verbose error reporting + END TYPE SlDDriver_Flags + + + ! This contains all the settings (possible passed in arguments). + TYPE :: SlDDriver_Settings + CHARACTER(1024) :: DvrIptFileName !< Driver input file name + CHARACTER(1024) :: SlDIptFileName !< Filename of SoilDyn input file to read (if no driver input file) + CHARACTER(1024) :: SummaryFileName !< Filename for the summary information output + +! CHARACTER(1024) :: PointsFileName !< Filename of points file to read in +! CHARACTER(1024) :: PointsOutputName !< Filename for output from points read in from points file +! CHARACTER(1024) :: FFTOutputName !< Filename for output from points read in from points file +! CHARACTER(1024) :: WindGridOutputName !< Filename for output from points read in from points file + +! INTEGER(IntKi) :: WindGridOutputUnit !< Unit number for the output file for the wind grid data +! INTEGER(IntKi) :: PointsOutputUnit !< Unit number for the output file for the Points file output +! INTEGER(IntKi) :: FFTOutputUnit !< Unit number for the output file for the FFT results + + INTEGER(IntKi) :: NumTimeSteps !< Number of timesteps + REAL(DbKi) :: DT !< resolution of time + REAL(DbKi) :: TStart !< range of time -- end time converted from TRange (command line option only) + + +! REAL(ReKi) :: FFTcoord(1:3) !< (x,y,z) coordinate to do an FFT at +! +! REAL(ReKi) :: GridDelta(1:3) !< (GridDx,GridDy,GridDz) -- grid point spacing +! INTEGER(IntKi) :: GridN(1:3) !< (GridNx,GridNy,GridNz) -- number of grid points +! +! REAL(ReKi) :: XRange(1:2) !< Range in the x-direction for the gridded data +! REAL(ReKi) :: YRange(1:2) !< Range in the y-direction for the gridded data +! REAL(ReKi) :: ZRange(1:2) !< Range in the z-direction for the gridded data + + TYPE(ProgDesc) :: ProgInfo !< Program info + TYPE(ProgDesc) :: SlDProgInfo !< Program info for SoilDyn + + END TYPE SlDDriver_Settings + + +END MODULE SoilDyn_Driver_Types From c5975956cf13390839b7df1b3d0731b45bc5d9b7 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 18 Feb 2020 13:38:29 -0700 Subject: [PATCH 025/136] SlD: minor cleanup --- modules/soildyn/src/REDWINinterface.f90 | 93 +++++++++++++----------- modules/soildyn/src/SoilDyn.f90 | 8 +- modules/soildyn/src/SoilDyn_IO.f90 | 65 +++++------------ modules/soildyn/src/SoilDyn_Registry.txt | 1 + modules/soildyn/src/SoilDyn_Types.f90 | 7 ++ 5 files changed, 83 insertions(+), 91 deletions(-) diff --git a/modules/soildyn/src/REDWINinterface.f90 b/modules/soildyn/src/REDWINinterface.f90 index 7adea9114..976fb7a89 100644 --- a/modules/soildyn/src/REDWINinterface.f90 +++ b/modules/soildyn/src/REDWINinterface.f90 @@ -19,7 +19,7 @@ !********************************************************************************************************************************** MODULE REDWINinterface - USE NWTC_Library + USE NWTC_Library USE SoilDyn_Types IMPLICIT NONE @@ -72,11 +72,11 @@ end subroutine INTERFACEFOUNDATION #endif type(ProgDesc), parameter :: REDWINinterface_Ver = ProgDesc( 'SoilDyn Interface for REDWIN soil interaction DLLs', 'using '//TRIM(OS_Desc), '99-Feb-2020' ) - + ! Interface version (in case we end up with multiple different versions supported at some later date) INTEGER(IntKi), PARAMETER :: RW_v00 = 0 ! Version number INTEGER(IntKi), PARAMETER :: RW_ver = RW_v00 ! Current version number (read from DLL file) - + CONTAINS !================================================================================================================================== @@ -86,27 +86,27 @@ subroutine CallREDWINdll ( u, DLL, dll_data, p, ErrStat, ErrMsg ) ! Passed Variables: type(SlD_InputType), intent(in ) :: u ! System inputs type(DLL_Type), intent(in ) :: DLL ! The DLL to be called. - type(REDWINdllType), intent(inout) :: dll_data ! data type containing the avrSWAP, accINFILE, and avcOUTNAME arrays + type(REDWINdllType), intent(inout) :: dll_data ! data type containing the avrSWAP, accINFILE, and avcOUTNAME arrays type(SlD_ParameterType), intent(in ) :: p ! Parameters integer(IntKi), intent( out) :: ErrStat ! Error status of the operation character(*), intent( out) :: ErrMsg ! Error message if ErrStat /= ErrID_None - + ! Local Variables: character(len=45) :: PROPSFILE ! properties input file character(len=45) :: LDISPFILE ! displacement input file - + PROCEDURE(REDWINdll_interface_V00),POINTER:: REDWIN_Subroutine_v00 ! The address of the procedure in the RedWin DLL ! Set names of DLL input files to pass PROPSFILE = TRIM(dll_data%PROPSfile) LDISPFILE = TRIM(dll_data%LDISPfile) - + ! Check existance of DLL input files. The DLL does not check this, and will ! catastrophically fail if they are not found. #ifdef STATIC_DLL_LOAD - ! if we're statically loading the library (i.e., OpenFOAM), we can just call INTERFACEFOUNDATION(); + ! if we're statically loading the library (i.e., OpenFOAM), we can just call INTERFACEFOUNDATION(); CALL INTERFACEFOUNDATION( PROPSFILE, LDISPFILE, & dll_data%IDTask, dll_data%nErrorCode, dll_data%ErrorCode, & dll_data%Props, dll_data%StVar, dll_data%StVarPrint, & @@ -114,7 +114,7 @@ subroutine CallREDWINdll ( u, DLL, dll_data, p, ErrStat, ErrMsg ) #else ! Call the DLL (first associate the address from the procedure in the DLL with the subroutine): if (RW_Ver == RW_v00) then - CALL C_F_PROCPOINTER( transfer(DLL%ProcAddr(1),C_NULL_FUNPTR), REDWIN_Subroutine_v00) + CALL C_F_PROCPOINTER( transfer(DLL%ProcAddr(1),C_NULL_FUNPTR), REDWIN_Subroutine_v00) CALL REDWIN_Subroutine_v00 ( PROPSFILE, LDISPFILE, & dll_data%IDTask, dll_data%nErrorCode, dll_data%ErrorCode, & dll_data%Props, dll_data%StVar, dll_data%StVarPrint, & @@ -123,15 +123,25 @@ subroutine CallREDWINdll ( u, DLL, dll_data, p, ErrStat, ErrMsg ) #endif ! Call routine for error trapping the returned ErrorCodes - +!TODO: add call to error checking from DLL return end subroutine CallREDWINdll +!================================================================================================================================== +!> Check errors from REDWIN +subroutine CheckREDWINerrors( dll_data, p, ErrStat, ErrMsg ) + type(REDWINdllType), intent(inout) :: dll_data ! data type containing the avrSWAP, accINFILE, and avcOUTNAME arrays + type(SlD_ParameterType), intent(in ) :: p ! Parameters + integer(IntKi), intent( out) :: ErrStat ! Error status of the operation + character(*), intent( out) :: ErrMsg ! Error message if ErrStat /= ErrID_None +end subroutine CheckREDWINerrors + + !================================================================================================================================== !> This routine initializes variables used in the REDWIN DLL interface. subroutine REDWINinterface_Init(u,p,dll_data,y,InputFileData, ErrStat, ErrMsg) - + type(SlD_InputType), intent(inout) :: u !< An initial guess for the input; input mesh must be defined type(SlD_ParameterType), intent(inout) :: p !< Parameters type(REDWINdllType), intent(inout) :: dll_data @@ -145,13 +155,18 @@ subroutine REDWINinterface_Init(u,p,dll_data,y,InputFileData, ErrStat, ErrMsg) integer(IntKi) :: ErrStat2 ! The error status code character(ErrMsgLen) :: ErrMsg2 ! The error message, if an error occurred character(*), parameter :: RoutineName = 'REDWINinterface_Init' - - + + ErrStat = ErrID_None ErrMsg= '' - + CALL DispNVD( REDWINinterface_Ver ) ! Display the version of this interface - +#ifdef NO_Libload + CALL SetErrStat( ErrID_Warn,' --> Skipping LoadDynamicLib call for '//TRIM(InputFileData%DLL_FileName),ErrStat,ErrMsg,RoutineName ) +#endif + + + ! Load the DLL #ifdef STATIC_DLL_LOAD ! because OpenFOAM needs the MPI task to copy the library, we're not going to dynamically load it; it needs to be loaded at runtime. p%DLL_Trgt%FileName = '' @@ -161,30 +176,27 @@ subroutine REDWINinterface_Init(u,p,dll_data,y,InputFileData, ErrStat, ErrMsg) p%DLL_Trgt%FileName = InputFileData%DLL_FileName p%DLL_Trgt%ProcName = "" ! initialize all procedures to empty so we try to load only one p%DLL_Trgt%ProcName(1) = InputFileData%DLL_ProcName -#ifdef NO_LibLoad - CALL SetErrStat( ErrID_Warn,' --> Skipping LoadDynamicLib call for '//TRIM(InputFileData%DLL_FileName),ErrStat,ErrMsg,RoutineName ) -#else +#ifndef NO_LibLoad CALL LoadDynamicLib ( p%DLL_Trgt, ErrStat2, ErrMsg2 ) CALL CheckError(ErrStat2,ErrMsg2) IF ( ErrStat >= AbortErrLev ) RETURN #endif #endif - - ! Set status flag: - p%UseREDWINinterface = .TRUE. -!FIXME: do I need to call it once to get it to actually initialize? And when? -#ifdef NO_LibLoad - CALL SetErrStat( ErrID_Warn,' --> Skipping DynamicLib call for '//TRIM(p%DLL_Trgt%FileName),ErrStat,ErrMsg,RoutineName ) -#else ! Initialize DLL dll_data%IDtask = IDtask_init +#ifndef NO_LibLoad CALL CallREDWINdll(u, p%DLL_Trgt, dll_data, p, ErrStat2, ErrMsg2) CALL CheckError(ErrStat2,ErrMsg2) IF ( ErrStat >= AbortErrLev ) RETURN #endif -CONTAINS + +!TODO: can we add a check on which type of library we actually loaded and compare to the model we set???? + ! Set status flag: + p%UseREDWINinterface = .TRUE. + +CONTAINS ! Sets the error message and level and cleans up if the error is >= AbortErrLev subroutine CheckError(ErrID,Msg) @@ -192,15 +204,12 @@ subroutine CheckError(ErrID,Msg) INTEGER(IntKi), INTENT(IN) :: ErrID ! The error identifier (ErrStat) CHARACTER(*), INTENT(IN) :: Msg ! The error message (ErrMsg) - !............................................................................................................................ - ! Set error status/message; - !............................................................................................................................ - IF ( ErrID /= ErrID_None ) THEN IF ( ErrStat /= ErrID_None ) ErrMsg = TRIM(ErrMsg)//NewLine ErrMsg = TRIM(ErrMsg)//'REDWINinterface_Init:'//TRIM(Msg) ErrStat = MAX(ErrStat, ErrID) +!TODO: check the errors stored in DLL_data !......................................................................................................................... ! Clean up if we're going to return on error: close files, deallocate local arrays !......................................................................................................................... @@ -210,7 +219,7 @@ subroutine CheckError(ErrID,Msg) END IF - end subroutine CheckError + end subroutine CheckError end subroutine REDWINinterface_Init @@ -219,7 +228,7 @@ end subroutine REDWINinterface_Init !! so we don't need to make a last call. It also frees the dynamic library (doesn't do anything on !! static linked). subroutine REDWINinterface_End(u, p, ErrStat, ErrMsg) - + TYPE(SlD_InputType), INTENT(IN ) :: u !< System inputs TYPE(SlD_ParameterType), INTENT(INOUT) :: p !< Parameters INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation @@ -229,7 +238,7 @@ subroutine REDWINinterface_End(u, p, ErrStat, ErrMsg) INTEGER(IntKi) :: ErrStat2 ! The error status code CHARACTER(ErrMsgLen) :: ErrMsg2 ! The error message, if an error occurred character(*), parameter :: RoutineName = 'REDWINinterface_End' - + #ifdef NO_LibLoad ErrStat = ErrID_None ErrMsg= '' @@ -237,12 +246,12 @@ subroutine REDWINinterface_End(u, p, ErrStat, ErrMsg) #else ! Free the library (note: this doesn't do anything #ifdef STATIC_DLL_LOAD because p%DLL_Trgt is 0 (NULL)) CALL FreeDynamicLib( p%DLL_Trgt, ErrStat2, ErrMsg2 ) - IF (ErrStat2 /= ErrID_None) THEN - ErrStat = MAX(ErrStat, ErrStat2) + IF (ErrStat2 /= ErrID_None) THEN + ErrStat = MAX(ErrStat, ErrStat2) ErrMsg = TRIM(ErrMsg)//NewLine//TRIM(ErrMsg2) END IF #endif - + end subroutine REDWINinterface_End @@ -257,22 +266,22 @@ subroutine REDWINinterface_CalcOutput(t, u, p, dll_data, ErrStat, ErrMsg) type(REDWINdllType), intent(inout) :: dll_data integer(IntKi), intent( out) :: ErrStat !< Error status of the operation character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None - + ! local variables: integer(IntKi) :: ErrStat2 ! The error status code character(ErrMsgLen) :: ErrMsg2 ! The error message, if an error occurred character(*), parameter :: RoutineName = 'REDWINinterface_CalcOutput' - - ! Initialize error values: + + ! Initialize error values: ErrStat = ErrID_None ErrMsg= '' -!FIXME: add some debugging options +!FIXME: add some debugging options #ifdef DEBUG_REDWIN_INTERFACE !CALL WrNumAryFileNR ( 58, m%dll_data%avrSWAP,'1x,ES15.6E2', ErrStat, ErrMsg ) !write(58,'()') #endif - + #ifdef NO_LibLoad CALL SetErrStat( ErrID_Warn,' --> Skipping DynamicLib call for '//TRIM(p%DLL_Trgt%FileName),ErrStat,ErrMsg,RoutineName ) #else @@ -286,5 +295,5 @@ subroutine REDWINinterface_CalcOutput(t, u, p, dll_data, ErrStat, ErrMsg) !write(59,'()') #endif -end subroutine REDWINinterface_CalcOutput +end subroutine REDWINinterface_CalcOutput end module REDWINinterface diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index 5df00ee26..cc8a628be 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -28,6 +28,11 @@ !********************************************************************************************************************************** MODULE SoilDyn +!FIXME: stuff we need to do +! - cannot allow checkpoints. The DLL starts at T=0 always, and builds the history for histerysis loops +! - Is the stiffness matrix returned about a given operating point, or is it just what is read in? Can it be used in linearization? +! - + USE SoilDyn_Types USE SoilDyn_IO USE NWTC_Library @@ -106,7 +111,8 @@ subroutine SoilDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In call SoilDyn_ReadInput( InitInp%InputFile, p%EchoFileName, InputFileData, ErrStat2, ErrMsg2 ); if (Failed()) return; ! Define parameters here: - p%DT = Interval + p%DT = Interval + p%DLL_Model = InputFileData%DLL_Model ! Define initial system states here: x%DummyContState = 0.0_ReKi diff --git a/modules/soildyn/src/SoilDyn_IO.f90 b/modules/soildyn/src/SoilDyn_IO.f90 index 7f5b61275..3f196fd55 100644 --- a/modules/soildyn/src/SoilDyn_IO.f90 +++ b/modules/soildyn/src/SoilDyn_IO.f90 @@ -134,8 +134,7 @@ subroutine SoilDyn_ReadInput( InputFileName, EchoFileName, InputFileData, ErrSta call ReadVar ( UnitInput, InputFileName, InputFileData%EchoFlag, 'Echo', 'Echo the input file data', TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; end if - ! DT - Time interval for aerodynamic calculations {or default} (s): - Line = "" + ! DT - Time interval for SoilDyn calculations {or default} (s): CALL ReadVar( UnitInput, InputFileName, Line, "DT", "Time interval for soil calculations {or default} (s)", TmpErrStat, TmpErrMsg, UnitEcho); if (Failed()) return; CALL Conv2UC( Line ) IF ( INDEX(Line, "DEFAULT" ) /= 1 ) THEN ! If it's not "default", read this variable; otherwise use the value already stored in InputFileData%DTAero @@ -176,18 +175,15 @@ subroutine SoilDyn_ReadInput( InputFileName, EchoFileName, InputFileData, ErrSta !------------------------------------------------------------------------------------------------- call ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line', TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; - call ReadVar( UnitInput, InputFileName, InputFileData%PY_NumPoints, "PY_NumPoints", "Number of PY curve points", TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; ! Allocate arrays to hold the information that will be read in next allocate( InputFileData%PY_locations(InputFileData%PY_NumPoints,3), STAT=TmpErrStat ) - if (TmpErrStat /= 0) then - call SetErrStat(ErrID_Fatal, 'Could not allocate PY_locations', ErrStat, ErrMsg, RoutineName) - return - endif + if (TmpErrStat /= 0) call SetErrStat(ErrID_Fatal, 'Could not allocate PY_locations', ErrStat, ErrMsg, RoutineName) allocate( InputFileData%PY_inputFile(InputFileData%PY_NumPoints), STAT=TmpErrStat ) - if (TmpErrStat /= 0) then - call SetErrStat(ErrID_Fatal, 'Could not allocate PY_inputFile', ErrStat, ErrMsg, RoutineName) + if (TmpErrStat /= 0) call SetErrStat(ErrID_Fatal, 'Could not allocate PY_inputFile', ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) then + call CleanUp() return endif @@ -196,7 +192,6 @@ subroutine SoilDyn_ReadInput( InputFileName, EchoFileName, InputFileData, ErrSta ! Read in each line of location and input file ( ---- Location (x,y,z) ------- Point InputFile ------------- ) do i=1,InputFileData%PY_NumPoints - Line = "" call ReadLine( UnitInput, '', Line, LineLen, TmpErrStat ) if (TmpErrStat /= 0) then call SetErrStat( ErrID_Fatal, 'Error reading PY_curve line '//trim(Num2LStr(i))//' from '//InputFileName//'.', ErrStat, ErrMsg, RoutineName) @@ -221,32 +216,25 @@ subroutine SoilDyn_ReadInput( InputFileName, EchoFileName, InputFileData, ErrSta !------------------------------------------------------------------------------------------------- call ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line', TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; - call ReadVar( UnitInput, InputFileName, InputFileData%DLL_model, "DLL_model", "REDWIN DLL model used", TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; ! DLL_FileName - Name of the Bladed DLL [used only with DLL Interface] (-): - call ReadVar( UnitInput, InputFileName, InputFileData%DLL_FileName, "DLL_FileName", "Name/location of the external library {.dll [Windows]} in the REDWIN-DLL format [used only with CalcOption==3] (-)", TmpErrStat, TmpErrMsg, UnitEcho ) + call ReadVar( UnitInput, InputFileName, InputFileData%DLL_FileName, "DLL_FileName", "Name/location of the external library {.dll [Windows]} in the REDWIN-DLL format [used only with CalcOption==3] (-)", TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; if ( PathIsRelative( InputFileData%DLL_FileName ) ) InputFileData%DLL_FileName = TRIM(PriPath)//TRIM(InputFileData%DLL_FileName) ! DLL_ProcName - Name of procedure to be called in DLL [used only with DLL Interface] (-): - call ReadVar( UnitInput, InputFileName, InputFileData%DLL_ProcName, "DLL_ProcName", "Name of procedure to be called in DLL [used only with DLL Interface] (-)", TmpErrStat, TmpErrMsg, UnitEcho) - + call ReadVar( UnitInput, InputFileName, InputFileData%DLL_ProcName, "DLL_ProcName", "Name of procedure to be called in DLL [used only with DLL Interface] (-)", TmpErrStat, TmpErrMsg, UnitEcho); if (Failed()) return; call ReadVar( UnitInput, InputFileName, InputFileData%DLL_NumPoints, "DLL_NumPoints", "Number of DLL interfaces", TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; ! Allocate arrays to hold the information that will be read in next allocate( InputFileData%DLL_locations(InputFileData%DLL_NumPoints,3), STAT=TmpErrStat ) - if (TmpErrStat /= 0) then - call SetErrStat(ErrID_Fatal, 'Could not allocate DLL_locations', ErrStat, ErrMsg, RoutineName) - return - endif + if (TmpErrStat /= 0) call SetErrStat(ErrID_Fatal, 'Could not allocate DLL_locations', ErrStat, ErrMsg, RoutineName) allocate( InputFileData%DLL_PropsFile(InputFileData%DLL_NumPoints), STAT=TmpErrStat ) - if (TmpErrStat /= 0) then - call SetErrStat(ErrID_Fatal, 'Could not allocate DLL_PropsFile', ErrStat, ErrMsg, RoutineName) - return - endif + if (TmpErrStat /= 0) call SetErrStat(ErrID_Fatal, 'Could not allocate DLL_PropsFile', ErrStat, ErrMsg, RoutineName) allocate( InputFileData%DLL_LDispFile(InputFileData%DLL_NumPoints), STAT=TmpErrStat ) - if (TmpErrStat /= 0) then - call SetErrStat(ErrID_Fatal, 'Could not allocate DLL_LDispFile', ErrStat, ErrMsg, RoutineName) + if (TmpErrStat /= 0) call SetErrStat(ErrID_Fatal, 'Could not allocate DLL_LDispFile', ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) then + call CleanUp() return endif @@ -255,7 +243,6 @@ subroutine SoilDyn_ReadInput( InputFileName, EchoFileName, InputFileData, ErrSta ! Read in each line of location and input file ( ---- Location (x,y,z) ------- Point InputFile ------------- ) do i=1,InputFileData%DLL_NumPoints - Line = "" call ReadLine( UnitInput, '', Line, LineLen, TmpErrStat ) if (TmpErrStat /= 0) then call SetErrStat( ErrID_Fatal, 'Error reading DLL_curve line '//trim(Num2LStr(i))//' from '//InputFileName//'.', ErrStat, ErrMsg, RoutineName) @@ -276,39 +263,21 @@ subroutine SoilDyn_ReadInput( InputFileName, EchoFileName, InputFileData, ErrSta enddo !---------------------- OUTPUT -------------------------------------------------- - CALL ReadCom( UnitInput, InputFileName, 'Section Header: Output', TmpErrStat, TmpErrMsg, UnitEcho ) + CALL ReadCom( UnitInput, InputFileName, 'Section Header: Output', TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) - IF (ErrStat >= AbortErrLev) THEN - CALL Cleanup() - RETURN - END IF ! SumPrint - Print summary data to .IfW.sum (flag): - CALL ReadVar( UnitInput, InputFileName, InputFileData%SumPrint, "SumPrint", "Print summary data to .SlD.sum (flag)", TmpErrStat, TmpErrMsg, UnitEcho ) + CALL ReadVar( UnitInput, InputFileName, InputFileData%SumPrint, "SumPrint", "Print summary data to .SlD.sum (flag)", TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) - IF (ErrStat >= AbortErrLev) THEN - CALL Cleanup() - RETURN - END IF !---------------------- OUTLIST -------------------------------------------- - CALL ReadCom( UnitInput, InputFileName, 'Section Header: OutList', TmpErrStat, TmpErrMsg, UnitEcho ) + CALL ReadCom( UnitInput, InputFileName, 'Section Header: OutList', TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) - IF (ErrStat >= AbortErrLev) THEN - CALL Cleanup() - RETURN - END IF ! OutList - List of user-requested output channels (-): -- uses routine from the NWTC_Library CALL ReadOutputList ( UnitInput, InputFileName, InputFileData%OutList, InputFileData%NumOuts, 'OutList', & - "List of user-requested output channels", TmpErrStat, TmpErrMsg, UnitEcho ) - CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) - IF (ErrStat >= AbortErrLev) THEN - CALL Cleanup() - RETURN - END IF - + "List of user-requested output channels", TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; @@ -323,7 +292,7 @@ subroutine SoilDyn_ReadInput( InputFileName, EchoFileName, InputFileData, ErrSta logical function Failed() call SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) Failed = ErrStat >= AbortErrLev - if (Failed) call CleanUp() + if (ErrStat >= AbortErrLev) call CleanUp() end function Failed subroutine Cleanup() ! Close input file diff --git a/modules/soildyn/src/SoilDyn_Registry.txt b/modules/soildyn/src/SoilDyn_Registry.txt index ae3dad0b5..45228c2c7 100644 --- a/modules/soildyn/src/SoilDyn_Registry.txt +++ b/modules/soildyn/src/SoilDyn_Registry.txt @@ -103,6 +103,7 @@ typedef ^ ParameterType LOGICAL UseREDWINinterface typedef ^ ParameterType CHARACTER(1024) RootFileName - - - "Root file name" - typedef ^ ParameterType CHARACTER(1024) EchoFileName - - - "Name of echo file" - typedef ^ ParameterType CHARACTER(1024) SumFileName - - - "Name of summary file" - +typedef ^ ParameterType IntKi DLL_model - - - "REDWIN DLL model type to use" - # ..... Inputs .................................................................................................................... # Define inputs that are contained on the mesh here: diff --git a/modules/soildyn/src/SoilDyn_Types.f90 b/modules/soildyn/src/SoilDyn_Types.f90 index 69e2a7b3f..c850963d9 100644 --- a/modules/soildyn/src/SoilDyn_Types.f90 +++ b/modules/soildyn/src/SoilDyn_Types.f90 @@ -118,6 +118,7 @@ MODULE SoilDyn_Types CHARACTER(1024) :: RootFileName !< Root file name [-] CHARACTER(1024) :: EchoFileName !< Name of echo file [-] CHARACTER(1024) :: SumFileName !< Name of summary file [-] + INTEGER(IntKi) :: DLL_model !< REDWIN DLL model type to use [-] END TYPE SlD_ParameterType ! ======================= ! ========= SlD_InputType ======= @@ -2234,6 +2235,7 @@ SUBROUTINE SlD_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg DstParamData%RootFileName = SrcParamData%RootFileName DstParamData%EchoFileName = SrcParamData%EchoFileName DstParamData%SumFileName = SrcParamData%SumFileName + DstParamData%DLL_model = SrcParamData%DLL_model END SUBROUTINE SlD_CopyParam SUBROUTINE SlD_DestroyParam( ParamData, ErrStat, ErrMsg ) @@ -2309,6 +2311,7 @@ SUBROUTINE SlD_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, S Int_BufSz = Int_BufSz + 1*LEN(InData%RootFileName) ! RootFileName Int_BufSz = Int_BufSz + 1*LEN(InData%EchoFileName) ! EchoFileName Int_BufSz = Int_BufSz + 1*LEN(InData%SumFileName) ! SumFileName + Int_BufSz = Int_BufSz + 1 ! DLL_model IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) THEN @@ -2390,6 +2393,8 @@ SUBROUTINE SlD_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, S IntKiBuf(Int_Xferred) = ICHAR(InData%SumFileName(I:I), IntKi) Int_Xferred = Int_Xferred + 1 END DO ! I + IntKiBuf ( Int_Xferred:Int_Xferred+(1)-1 ) = InData%DLL_model + Int_Xferred = Int_Xferred + 1 END SUBROUTINE SlD_PackParam SUBROUTINE SlD_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) @@ -2490,6 +2495,8 @@ SUBROUTINE SlD_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg OutData%SumFileName(I:I) = CHAR(IntKiBuf(Int_Xferred)) Int_Xferred = Int_Xferred + 1 END DO ! I + OutData%DLL_model = IntKiBuf( Int_Xferred ) + Int_Xferred = Int_Xferred + 1 END SUBROUTINE SlD_UnPackParam SUBROUTINE SlD_CopyInput( SrcInputData, DstInputData, CtrlCode, ErrStat, ErrMsg ) From 0ea575a588ab8a33e7ad792654abe1ac48e0273b Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 18 Feb 2020 16:41:45 -0700 Subject: [PATCH 026/136] SlD: add error trapping to REDWIN interface --- modules/soildyn/src/REDWINinterface.f90 | 186 ++++++++++++++++++++++- modules/soildyn/src/SoilDyn_Registry.txt | 23 +-- modules/soildyn/src/SoilDyn_Types.f90 | 7 + 3 files changed, 201 insertions(+), 15 deletions(-) diff --git a/modules/soildyn/src/REDWINinterface.f90 b/modules/soildyn/src/REDWINinterface.f90 index 976fb7a89..3fa8d0fb8 100644 --- a/modules/soildyn/src/REDWINinterface.f90 +++ b/modules/soildyn/src/REDWINinterface.f90 @@ -19,6 +19,7 @@ !********************************************************************************************************************************** MODULE REDWINinterface +!FIXME: when done, remove the ifdef NO_LibLoad checks. USE NWTC_Library USE SoilDyn_Types @@ -123,18 +124,195 @@ subroutine CallREDWINdll ( u, DLL, dll_data, p, ErrStat, ErrMsg ) #endif ! Call routine for error trapping the returned ErrorCodes -!TODO: add call to error checking from DLL + call CheckREDWINerrors( dll_data, p%DLL_Model, dll_data%SuppressWarn, ErrStat, ErrMsg ) return end subroutine CallREDWINdll !================================================================================================================================== !> Check errors from REDWIN -subroutine CheckREDWINerrors( dll_data, p, ErrStat, ErrMsg ) - type(REDWINdllType), intent(inout) :: dll_data ! data type containing the avrSWAP, accINFILE, and avcOUTNAME arrays - type(SlD_ParameterType), intent(in ) :: p ! Parameters +!! Error values taken from "20150014-11-R_Rev0_3D_Foundation Model Library.pdf" +subroutine CheckREDWINerrors( dll_data, DLL_Model, SuppressWarn, ErrStat, ErrMsg ) + type(REDWINdllType), intent(in ) :: dll_data ! data type + integer(IntKi), intent(in ) :: DLL_Model ! Model type of the DLL + logical, intent(inout) :: SuppressWarn ! from dll_data%SupressWarn integer(IntKi), intent( out) :: ErrStat ! Error status of the operation character(*), intent( out) :: ErrMsg ! Error message if ErrStat /= ErrID_None + integer(IntKi) :: i + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + ErrStat = ErrID_none + ErrMsg = '' + + select case (DLL_Model) + case(1) + do i=1,dll_data%nErrorCode + call CheckErrorsModel1(dll_data%ErrorCode(i),ErrStat2,ErrMsg2) + call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,'REDWIN DLL error') + enddo + case(2) + do i=1,dll_data%nErrorCode + call CheckErrorsModel2(dll_data%ErrorCode(i),ErrStat2,ErrMsg2) + call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,'REDWIN DLL error') + enddo + case(3) + do i=1,dll_data%nErrorCode + call CheckErrorsModel3(dll_data%ErrorCode(i),ErrStat2,ErrMsg2) + call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,'REDWIN DLL error') + enddo + case default + end select + + ! Check if this is only a warning, and if we should supress further warnings (only one warning exists in each DLL model, rest are errors + if (ErrStat == ErrID_Warn) then + if ( SuppressWarn ) then + ErrStat = ErrID_None + ErrMsg = '' + else + SuppressWarn = .TRUE. + endif + endif + +CONTAINS + + !> Check error codes from DLL model 1 + subroutine CheckErrorsModel1(ErrVal,ErrStat,ErrMsg) + ! 1 Warning: The number of rows in LDISDPFILE exceed the maximum number supported (200). The calibration will proceed using the first 200 values. + ! Reduce the number of data points in the input file. + ! 2 Error in the interpolation tool used in the model calibration. The value you are trying to interpolate is outside the interpolation curve. + ! Please inspect LDISPFILE to make sure that it covers a wide enough range and that all values are positive. + ! Try to extend the input load-displacement curves in LDISPFILE. + integer(IntKi), intent(in ) :: ErrVal + integer(IntKi), intent( out) :: ErrStat + character(ErrMsgLen), intent( out) :: ErrMSg + integer(IntKi), parameter :: MaxErr=2 + + if ( (ErrVal > MaxErr) .or. (ErrVal < 0) ) then + ErrStat = ErrID_Fatal + ErrMSg = 'Unknown error from REDWIN DLL: '//trim(num2lstr(ErrVal))//'. Only '//trim(num2lstr(MaxErr))//' values are known.' & + //NewLine//' --> Check that the correct REDWIN DLL model is specified and used.' + return + endif + + select case(ErrVal) + case(0) + ErrStat = ErrID_None + ErrMsg = '' + case(1) + ErrStat = ErrID_Warn + ErrMsg = 'The number of rows in LDISDPFILE exceed the maximum number supported (200). The calibration will proceed using the first 200 values.' & + //NewLine//' --> Reduce the number of data points in the input file.' + case(2) + ErrStat = ErrID_Fatal + ErrMsg = 'Error in the interpolation tool used in the model calibration. The value you are trying to interpolate is outside the interpolation curve.' & + //NewLine//' --> Please inspect LDISPFILE to make sure that it covers a wide enough range and that all values are positive. ' & + //'Try to extend the input load-displacement curves in LDISPFILE.' + end select + end subroutine CheckErrorsModel1 + + !> Check error codes from DLL model 2 + subroutine CheckErrorsModel2(ErrVal,ErrStat,ErrMsg) + ! 1 Warning: The plastic force- displacement calibration curve has several zero-rows. The solution does not stop, but the results may be inaccurate or erroneous. + ! Check that the provided coefficients of the elastic stiffness matrix are consistent with the load-displacement input curves. + ! 2 Error. The iteration to find the plastic rotation increment and the plastic displacement increment did not converge. + ! The force you are trying to apply might be outside the calibrated range. Please extend the input load-displacement curves in LDISPFILE. + ! Alternatively, increase the number of iterations in PROPSFILE. + ! 3 Error in the interpolation tool used in the model calibration. The value you are trying to interpolate is outside the interpolation curve. + ! Please inspect LDISPFILE to make sure that it covers a wide enough range and that all values are positive. Try to extend the input load-displacement curves in LDISPFILE. + ! 4 Error in the calibration tool. The contours of plastic horizontal displacement and the contours of plastic rotation are parallel. + ! The input might be non-physical. Please check that LDISPFILE is in the correct format and that the units are consistent. + ! 5 Error in the calibration tool. The calculation of the orientation of the yield surfaces might be wrong. + ! The input might be non-physical. Please check that LDISPFILE is in the correct format and that the units are consistent. + ! 6 Error in the calibration tool. The contours of plastic horizontal displacement are steeper than the contours of plastic rotation. + ! The input might be non-physical. Please check that LDISPFILE is in the correct format and that the units are consistent. + integer(IntKi), intent(in ) :: ErrVal + integer(IntKi), intent( out) :: ErrStat + character(ErrMsgLen), intent( out) :: ErrMSg + integer(IntKi), parameter :: MaxErr=6 + + if ( (ErrVal > MaxErr) .or. (ErrVal < 0) ) then + ErrStat = ErrID_Fatal + ErrMSg = 'Unknown error from REDWIN DLL: '//trim(num2lstr(ErrVal))//'. Only '//trim(num2lstr(MaxErr))//' values are known.' + return + endif + + select case(ErrVal) + case(0) + ErrStat = ErrID_None + ErrMsg = '' + case(1) + ErrStat = ErrID_Warn + ErrMsg = 'The plastic force- displacement calibration curve has several zero-rows. The solution does not stop, but the results may be inaccurate or erroneous.' & + //NewLine//' --> Check that the provided coefficients of the elastic stiffness matrix are consistent with the load-displacement input curves.' + case(2) + ErrStat = ErrID_Fatal + ErrMsg = 'The iteration to find the plastic rotation increment and the plastic displacement increment did not converge.' & + //NewLine//' --> The force you are trying to apply might be outside the calibrated range. Please extend the input load-displacement curves ' & + //'in LDISPFILE. Alternatively, increase the number of iterations in PROPSFILE.' + case(3) + ErrStat = ErrID_Fatal + ErrMsg = 'Error in the interpolation tool used in the model calibration. The value you are trying to interpolate is outside the interpolation curve.' & + //NewLine//' --> Please inspect LDISPFILE to make sure that it covers a wide enough range and that all values are positive. ' & + //'Try to extend the input load-displacement curves in LDISPFILE.' + case(4) + ErrStat = ErrID_Fatal + ErrMsg = 'Error in the calibration tool. The contours of plastic horizontal displacement and the contours of plastic rotation are parallel. ' & + //NewLine//' --> The input might be non-physical. Please check that LDISPFILE is in the correct format and that the units are consistent.' + case(5) + ErrStat = ErrID_Fatal + ErrMsg = 'Error in the calibration tool. The calculation of the orientation of the yield surfaces might be wrong.' & + //NewLine//' --> The input might be non-physical. Please check that LDISPFILE is in the correct format and that the units are consistent.' + case(6) + ErrStat = ErrID_Fatal + ErrMsg = 'Error in the calibration tool. The contours of plastic horizontal displacement are steeper than the contours of plastic rotation.' & + //NewLine//' --> The input might be non-physical. Please check that LDISPFILE is in the correct format and that the units are consistent.' + end select + end subroutine CheckErrorsModel2 + + !> Check error codes from DLL model 3 + subroutine CheckErrorsModel3(ErrVal,ErrStat,ErrMsg) + ! 1 Warning. The solution in the current sub-step seems to be diverging. Will attempt to reduce the step size. + ! The step size may be too large for convergence to be reached. The model will attempt to try again with a smaller step size. + ! 2 Error. The sub-stepping algorithm in the multi-surface plasticity model did not converge. + ! The cause of divergence is usually that the applied loads exceed the calibration range, or that there are several identical spring stiffness for low load levels. + ! Possible solutions are: reduce the number of yield surfaces (Ns), increase the number of substeps (nsub), increase the range of the input load-displacement files. + ! 3 Error in the calibration tool. The input file cannot be found. + ! Check that the file name and path of the input files PROPSFILE and LDISPFILE are correctly specified. + ! 4 Error in the calibration tool during read of PROPSFILE or LDISPFILE. + ! Check that the format of the input files are correct. + integer(IntKi), intent(in ) :: ErrVal + integer(IntKi), intent( out) :: ErrStat + character(ErrMsgLen), intent( out) :: ErrMSg + integer(IntKi), parameter :: MaxErr=4 + + if ( (ErrVal > MaxErr) .or. (ErrVal < 0) ) then + ErrStat = ErrID_Fatal + ErrMSg = 'Unknown error from REDWIN DLL: '//trim(num2lstr(ErrVal))//'. Only '//trim(num2lstr(MaxErr))//' values are known.' + return + endif + + select case(ErrVal) + case(0) + ErrStat = ErrID_None + ErrMsg = '' + case(1) + ErrStat = ErrID_Warn + ErrMsg = 'The solution in the current sub-step seems to be diverging. Will attempt to reduce the step size.' & + //NewLine//' --> The step size may be too large for convergence to be reached.' & + //' The model will attempt to try again with a smaller step size.' + case(2) + ErrMsg = 'The sub-stepping algorithm in the multi-surface plasticity model did not converge.' & + //NewLine//' --> The cause of divergence is usually that the applied loads exceed the calibration range, or that there' & + //' are several identical spring stiffness for low load levels. Possible solutions are: reduce the number of yield surfaces' & + //'(Ns), increase the number of substeps (nsub), increase the range of the input load-displacement files.' + case(3) + ErrMsg = 'Error in the calibration tool. The input file cannot be found.' & + //NewLine//' --> Check that the file name and path of the input files PROPSFILE and LDISPFILE are correctly specified.' + case(4) + ErrMsg = 'Error in the calibration tool during read of PROPSFILE or LDISPFILE.' & + //NewLine//' --> Check that the format of the input files are correct.' + end select + end subroutine CheckErrorsModel3 end subroutine CheckREDWINerrors diff --git a/modules/soildyn/src/SoilDyn_Registry.txt b/modules/soildyn/src/SoilDyn_Registry.txt index 45228c2c7..9728a4b4f 100644 --- a/modules/soildyn/src/SoilDyn_Registry.txt +++ b/modules/soildyn/src/SoilDyn_Registry.txt @@ -17,17 +17,18 @@ include Registry_NWTC_Library.txt # REDWIN interface DLL type # ..... Data for using REDWIN DLLs ....................................................................................................... # Values set to type R8Ki are defined in the REDWIN fortran code as kind=selected_real_kind(p=15) -typedef SoilDyn/SlD REDWINdllType character(45) PROPSFILE - - - "" - -typedef SoilDyn/SlD REDWINdllType character(45) LDISPFILE - - - "" - -typedef SoilDyn/SlD REDWINdllType IntKi IDtask - - - "Task identifier for what DLL should do: IDTask = 1: Read input properties, initialize and calibrate model IDTask = 2: Calculate forces based on displacement at end of step IDTask = 3: Calculate elastic macro-element stiffness matrix" - -typedef ^ REDWINdllType IntKi nErrorCode - - - "number of returned error codes" - -typedef ^ REDWINdllType IntKi ErrorCode {100} - - "Array containing one or more error codes. These are specific to each model." - -typedef ^ REDWINdllType R8Ki Props {100}{200} - - "Array containing foundation model properties (used internally by the REDWIN models). Specific to each model." - -typedef ^ REDWINdllType R8Ki StVar {12}{100} - - "Array containing the state variables at the end of the step (used internally by the REDWIN models). Specific to each model." - -typedef ^ REDWINdllType IntKi StVarPrint {12}{100} - - "Array indicating which state variables should be printed to the screen. This feature is currently not supported." - -typedef ^ REDWINdllType R8Ki Disp {6} - - "Displacements. Follows convention of REDWIN orientation." - -typedef ^ REDWINdllType R8Ki Force {6} - - "Forces. Follows convention of REDWIN orientations." '(N)' -typedef ^ REDWINdllType R8Ki D {6}{6} - - "The 6 x 6 elastic macro-element stiffness matrix at the SFI." - +typedef SoilDyn/SlD REDWINdllType character(45) PROPSFILE - - - "" - +typedef SoilDyn/SlD REDWINdllType character(45) LDISPFILE - - - "" - +typedef SoilDyn/SlD REDWINdllType IntKi IDtask - - - "Task identifier for what DLL should do: IDTask = 1: Read input properties, initialize and calibrate model IDTask = 2: Calculate forces based on displacement at end of step IDTask = 3: Calculate elastic macro-element stiffness matrix" - +typedef ^ REDWINdllType IntKi nErrorCode - - - "number of returned error codes" - +typedef ^ REDWINdllType IntKi ErrorCode {100} - - "Array containing one or more error codes. These are specific to each model." - +typedef ^ REDWINdllType R8Ki Props {100}{200} - - "Array containing foundation model properties (used internally by the REDWIN models). Specific to each model." - +typedef ^ REDWINdllType R8Ki StVar {12}{100} - - "Array containing the state variables at the end of the step (used internally by the REDWIN models). Specific to each model." - +typedef ^ REDWINdllType IntKi StVarPrint {12}{100} - - "Array indicating which state variables should be printed to the screen. This feature is currently not supported." - +typedef ^ REDWINdllType R8Ki Disp {6} - - "Displacements. Follows convention of REDWIN orientation." - +typedef ^ REDWINdllType R8Ki Force {6} - - "Forces. Follows convention of REDWIN orientations." '(N)' +typedef ^ REDWINdllType R8Ki D {6}{6} - - "The 6 x 6 elastic macro-element stiffness matrix at the SFI." - +typedef ^ REDWINdllType LOGICAL SuppressWarn - .FALSE. - "Supress further warnings." - # SoilDyn input file typedef ^ SlD_InputFile LOGICAL EchoFlag - - - "Echo the input file" - diff --git a/modules/soildyn/src/SoilDyn_Types.f90 b/modules/soildyn/src/SoilDyn_Types.f90 index c850963d9..ecc002c9c 100644 --- a/modules/soildyn/src/SoilDyn_Types.f90 +++ b/modules/soildyn/src/SoilDyn_Types.f90 @@ -46,6 +46,7 @@ MODULE SoilDyn_Types REAL(R8Ki) , DIMENSION(1:6) :: Disp !< Displacements. Follows convention of REDWIN orientation. [-] REAL(R8Ki) , DIMENSION(1:6) :: Force !< Forces. Follows convention of REDWIN orientations. ['(N)'] REAL(R8Ki) , DIMENSION(1:6,1:6) :: D !< The 6 x 6 elastic macro-element stiffness matrix at the SFI. [-] + LOGICAL :: SuppressWarn = .FALSE. !< Supress further warnings. [-] END TYPE REDWINdllType ! ======================= ! ========= SlD_InputFile ======= @@ -160,6 +161,7 @@ SUBROUTINE SlD_CopyREDWINdllType( SrcREDWINdllTypeData, DstREDWINdllTypeData, Ct DstREDWINdllTypeData%Disp = SrcREDWINdllTypeData%Disp DstREDWINdllTypeData%Force = SrcREDWINdllTypeData%Force DstREDWINdllTypeData%D = SrcREDWINdllTypeData%D + DstREDWINdllTypeData%SuppressWarn = SrcREDWINdllTypeData%SuppressWarn END SUBROUTINE SlD_CopyREDWINdllType SUBROUTINE SlD_DestroyREDWINdllType( REDWINdllTypeData, ErrStat, ErrMsg ) @@ -219,6 +221,7 @@ SUBROUTINE SlD_PackREDWINdllType( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E Db_BufSz = Db_BufSz + SIZE(InData%Disp) ! Disp Db_BufSz = Db_BufSz + SIZE(InData%Force) ! Force Db_BufSz = Db_BufSz + SIZE(InData%D) ! D + Int_BufSz = Int_BufSz + 1 ! SuppressWarn IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) THEN @@ -272,6 +275,8 @@ SUBROUTINE SlD_PackREDWINdllType( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E Db_Xferred = Db_Xferred + SIZE(InData%Force) DbKiBuf ( Db_Xferred:Db_Xferred+(SIZE(InData%D))-1 ) = PACK(InData%D,.TRUE.) Db_Xferred = Db_Xferred + SIZE(InData%D) + IntKiBuf ( Int_Xferred:Int_Xferred+1-1 ) = TRANSFER( InData%SuppressWarn , IntKiBuf(1), 1) + Int_Xferred = Int_Xferred + 1 END SUBROUTINE SlD_PackREDWINdllType SUBROUTINE SlD_UnPackREDWINdllType( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) @@ -405,6 +410,8 @@ SUBROUTINE SlD_UnPackREDWINdllType( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat OutData%D = REAL( UNPACK(DbKiBuf( Db_Xferred:Db_Xferred+(SIZE(OutData%D))-1 ), mask2, 0.0_DbKi ), R8Ki) Db_Xferred = Db_Xferred + SIZE(OutData%D) DEALLOCATE(mask2) + OutData%SuppressWarn = TRANSFER( IntKiBuf( Int_Xferred ), mask0 ) + Int_Xferred = Int_Xferred + 1 END SUBROUTINE SlD_UnPackREDWINdllType SUBROUTINE SlD_CopyInputFile( SrcInputFileData, DstInputFileData, CtrlCode, ErrStat, ErrMsg ) From 0d9399c3235e55c34ae31636a9e59430e12206a2 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 18 Feb 2020 17:07:53 -0700 Subject: [PATCH 027/136] SlD: move error checking routines to end of file -- update calcoutput and add a routine to get the stiffness matrix --- modules/soildyn/src/REDWINinterface.f90 | 344 +++++++++++++----------- 1 file changed, 193 insertions(+), 151 deletions(-) diff --git a/modules/soildyn/src/REDWINinterface.f90 b/modules/soildyn/src/REDWINinterface.f90 index 3fa8d0fb8..feeb0db7e 100644 --- a/modules/soildyn/src/REDWINinterface.f90 +++ b/modules/soildyn/src/REDWINinterface.f90 @@ -129,6 +129,199 @@ subroutine CallREDWINdll ( u, DLL, dll_data, p, ErrStat, ErrMsg ) end subroutine CallREDWINdll +!================================================================================================================================== +!> This routine initializes variables used in the REDWIN DLL interface. +subroutine REDWINinterface_Init(u,p,dll_data,y,InputFileData, ErrStat, ErrMsg) + + type(SlD_InputType), intent(inout) :: u !< An initial guess for the input; input mesh must be defined + type(SlD_ParameterType), intent(inout) :: p !< Parameters + type(REDWINdllType), intent(inout) :: dll_data + type(SlD_OutputType), intent(inout) :: y !< Initial system outputs (outputs are not calculated; + !! only the output mesh is initialized) + type(SlD_InputFile), intent(inout) :: InputFileData !< Data stored in the module's input file + integer(IntKi), intent( out) :: ErrStat !< Error status of the operation + character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + ! local variables + integer(IntKi) :: ErrStat2 ! The error status code + character(ErrMsgLen) :: ErrMsg2 ! The error message, if an error occurred + character(*), parameter :: RoutineName = 'REDWINinterface_Init' + + + ErrStat = ErrID_None + ErrMsg= '' + + CALL DispNVD( REDWINinterface_Ver ) ! Display the version of this interface +#ifdef NO_Libload + CALL SetErrStat( ErrID_Warn,' --> Skipping LoadDynamicLib call for '//TRIM(InputFileData%DLL_FileName),ErrStat,ErrMsg,RoutineName ) +#endif + + + ! Load the DLL +#ifdef STATIC_DLL_LOAD + ! because OpenFOAM needs the MPI task to copy the library, we're not going to dynamically load it; it needs to be loaded at runtime. + p%DLL_Trgt%FileName = '' + p%DLL_Trgt%ProcName = '' +#else + ! Define and load the DLL: + p%DLL_Trgt%FileName = InputFileData%DLL_FileName + p%DLL_Trgt%ProcName = "" ! initialize all procedures to empty so we try to load only one + p%DLL_Trgt%ProcName(1) = InputFileData%DLL_ProcName +#ifndef NO_LibLoad + CALL LoadDynamicLib ( p%DLL_Trgt, ErrStat2, ErrMsg2 ); if(Failed()) return; +#endif +#endif + + ! Initialize DLL + dll_data%IDtask = IDtask_init +#ifndef NO_LibLoad + CALL CallREDWINdll(u, p%DLL_Trgt, dll_data, p, ErrStat2, ErrMsg2); if(Failed()) return; +#endif + + +!TODO: can we add a check on which type of library we actually loaded and compare to the model we set???? + ! Set status flag: + p%UseREDWINinterface = .TRUE. + +CONTAINS + logical function Failed() + call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + Failed = ErrStat >= AbortErrLev + if ( ErrStat >= AbortErrLev ) p%UseREDWINinterface = .FALSE. + end function Failed +end subroutine REDWINinterface_Init + + +!================================================================================================================================== +!> This routine would call the DLL a final time, but there appears to be no end routine for the DLL, +!! so we don't need to make a last call. It also frees the dynamic library (doesn't do anything on +!! static linked). +subroutine REDWINinterface_End(u, p, ErrStat, ErrMsg) + + TYPE(SlD_InputType), INTENT(IN ) :: u !< System inputs + TYPE(SlD_ParameterType), INTENT(INOUT) :: p !< Parameters + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + ! local variables: + INTEGER(IntKi) :: ErrStat2 ! The error status code + CHARACTER(ErrMsgLen) :: ErrMsg2 ! The error message, if an error occurred + character(*), parameter :: RoutineName = 'REDWINinterface_End' + +#ifdef NO_LibLoad + ErrStat = ErrID_None + ErrMsg= '' + CALL SetErrStat( ErrID_Warn,' --> Skipping DynamicLib call for '//TRIM(p%DLL_Trgt%FileName),ErrStat,ErrMsg,RoutineName ) +#else + ! Free the library (note: this doesn't do anything #ifdef STATIC_DLL_LOAD because p%DLL_Trgt is 0 (NULL)) + CALL FreeDynamicLib( p%DLL_Trgt, ErrStat, ErrMsg ) +#endif +end subroutine REDWINinterface_End + + +!================================================================================================================================== +!> This routine sets the AVRswap array, calls the routine from the REDWIN DLL, and sets the outputs from the call to be used as +!! necessary in the main ServoDyn CalcOutput routine. +subroutine REDWINinterface_CalcOutput(t, u, p, dll_data, ErrStat, ErrMsg) + + real(DbKi), intent(in ) :: t !< Current simulation time in seconds + type(SlD_InputType), intent(in ) :: u !< Inputs at t + type(SlD_ParameterType), intent(in ) :: p !< Parameters + type(REDWINdllType), intent(inout) :: dll_data + integer(IntKi), intent( out) :: ErrStat !< Error status of the operation + character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + ! local variables: + integer(IntKi) :: ErrStat2 ! The error status code + character(ErrMsgLen) :: ErrMsg2 ! The error message, if an error occurred + character(*), parameter :: RoutineName = 'REDWINinterface_CalcOutput' + + ! Initialize error values: + ErrStat = ErrID_None + ErrMsg= '' + +!FIXME: coordinate transform and copy over u information here! + + +!FIXME: add some debugging options +#ifdef DEBUG_REDWIN_INTERFACE +!CALL WrNumAryFileNR ( 58, m%dll_data%avrSWAP,'1x,ES15.6E2', ErrStat, ErrMsg ) +!write(58,'()') +#endif + +#ifdef NO_LibLoad + CALL SetErrStat( ErrID_Warn,' --> Skipping DynamicLib call for '//TRIM(p%DLL_Trgt%FileName),ErrStat,ErrMsg,RoutineName ) +#else + ! Call the REDWIN-style DLL: + dll_data%IDtask = IDtask_calc + CALL CallREDWINdll(u, p%DLL_Trgt, dll_data, p, ErrStat, ErrMsg); if(Failed()) return; +#endif + + +!FIXME: coordinate transform here!!!! + +#ifdef DEBUG_REDWIN_INTERFACE +!CALL WrNumAryFileNR ( 59, m%dll_data%avrSWAP,'1x,ES15.6E2', ErrStat, ErrMsg ) +!write(59,'()') +#endif + +contains + logical function Failed() + call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + Failed = ErrStat >= AbortErrLev + end function Failed +end subroutine REDWINinterface_CalcOutput + + +!================================================================================================================================== +!> This routine sets the AVRswap array, calls the routine from the REDWIN DLL, and sets the outputs from the call to be used as +!! necessary in the main ServoDyn CalcOutput routine. +subroutine REDWINinterface_GetStiffMatrix(t, u, p, dll_data, StiffMatrix, ErrStat, ErrMsg) + + real(DbKi), intent(in ) :: t !< Current simulation time in seconds + type(SlD_InputType), intent(in ) :: u !< Inputs at t + type(SlD_ParameterType), intent(in ) :: p !< Parameters + type(REDWINdllType), intent(inout) :: dll_data + real(ReKi), intent( out) :: StiffMatrix(6,6) + integer(IntKi), intent( out) :: ErrStat !< Error status of the operation + character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + ! local variables: + integer(IntKi) :: ErrStat2 ! The error status code + character(ErrMsgLen) :: ErrMsg2 ! The error message, if an error occurred + character(*), parameter :: RoutineName = 'REDWINinterface_CalcOutput' + + ! Initialize error values: + ErrStat = ErrID_None + ErrMsg= '' + +!FIXME: coordinate transform and copy over u information here! + +#ifdef NO_LibLoad + CALL SetErrStat( ErrID_Warn,' --> Skipping DynamicLib call for '//TRIM(p%DLL_Trgt%FileName),ErrStat,ErrMsg,RoutineName ) + StiffMatrix = 0.0_ReKi +#else + ! Call the REDWIN-style DLL: + dll_data%IDtask = IDtask_stiff + CALL CallREDWINdll(u, p%DLL_Trgt, dll_data, p, ErrStat, ErrMsg); if(Failed()) return; + StiffMatrix = real(dll_data%D,ReKi) ! NOTE: converting types here +#endif + +!FIXME: coordinate transform here!!!! + +#ifdef DEBUG_REDWIN_INTERFACE +!CALL WrNumAryFileNR ( 59, m%dll_data%avrSWAP,'1x,ES15.6E2', ErrStat, ErrMsg ) +!write(59,'()') +#endif + +contains + logical function Failed() + call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + Failed = ErrStat >= AbortErrLev + end function Failed +end subroutine REDWINinterface_GetStiffMatrix + + !================================================================================================================================== !> Check errors from REDWIN !! Error values taken from "20150014-11-R_Rev0_3D_Foundation Model Library.pdf" @@ -316,162 +509,11 @@ end subroutine CheckErrorsModel3 end subroutine CheckREDWINerrors -!================================================================================================================================== -!> This routine initializes variables used in the REDWIN DLL interface. -subroutine REDWINinterface_Init(u,p,dll_data,y,InputFileData, ErrStat, ErrMsg) - - type(SlD_InputType), intent(inout) :: u !< An initial guess for the input; input mesh must be defined - type(SlD_ParameterType), intent(inout) :: p !< Parameters - type(REDWINdllType), intent(inout) :: dll_data - type(SlD_OutputType), intent(inout) :: y !< Initial system outputs (outputs are not calculated; - !! only the output mesh is initialized) - type(SlD_InputFile), intent(inout) :: InputFileData !< Data stored in the module's input file - integer(IntKi), intent( out) :: ErrStat !< Error status of the operation - character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - ! local variables - integer(IntKi) :: ErrStat2 ! The error status code - character(ErrMsgLen) :: ErrMsg2 ! The error message, if an error occurred - character(*), parameter :: RoutineName = 'REDWINinterface_Init' - - - ErrStat = ErrID_None - ErrMsg= '' - - CALL DispNVD( REDWINinterface_Ver ) ! Display the version of this interface -#ifdef NO_Libload - CALL SetErrStat( ErrID_Warn,' --> Skipping LoadDynamicLib call for '//TRIM(InputFileData%DLL_FileName),ErrStat,ErrMsg,RoutineName ) -#endif - - - ! Load the DLL -#ifdef STATIC_DLL_LOAD - ! because OpenFOAM needs the MPI task to copy the library, we're not going to dynamically load it; it needs to be loaded at runtime. - p%DLL_Trgt%FileName = '' - p%DLL_Trgt%ProcName = '' -#else - ! Define and load the DLL: - p%DLL_Trgt%FileName = InputFileData%DLL_FileName - p%DLL_Trgt%ProcName = "" ! initialize all procedures to empty so we try to load only one - p%DLL_Trgt%ProcName(1) = InputFileData%DLL_ProcName -#ifndef NO_LibLoad - CALL LoadDynamicLib ( p%DLL_Trgt, ErrStat2, ErrMsg2 ) - CALL CheckError(ErrStat2,ErrMsg2) - IF ( ErrStat >= AbortErrLev ) RETURN -#endif -#endif - - ! Initialize DLL - dll_data%IDtask = IDtask_init -#ifndef NO_LibLoad - CALL CallREDWINdll(u, p%DLL_Trgt, dll_data, p, ErrStat2, ErrMsg2) - CALL CheckError(ErrStat2,ErrMsg2) - IF ( ErrStat >= AbortErrLev ) RETURN -#endif - - -!TODO: can we add a check on which type of library we actually loaded and compare to the model we set???? - ! Set status flag: - p%UseREDWINinterface = .TRUE. - -CONTAINS - ! Sets the error message and level and cleans up if the error is >= AbortErrLev - subroutine CheckError(ErrID,Msg) - - ! Passed arguments - INTEGER(IntKi), INTENT(IN) :: ErrID ! The error identifier (ErrStat) - CHARACTER(*), INTENT(IN) :: Msg ! The error message (ErrMsg) - - IF ( ErrID /= ErrID_None ) THEN - IF ( ErrStat /= ErrID_None ) ErrMsg = TRIM(ErrMsg)//NewLine - ErrMsg = TRIM(ErrMsg)//'REDWINinterface_Init:'//TRIM(Msg) - ErrStat = MAX(ErrStat, ErrID) - -!TODO: check the errors stored in DLL_data - !......................................................................................................................... - ! Clean up if we're going to return on error: close files, deallocate local arrays - !......................................................................................................................... - IF ( ErrStat >= AbortErrLev ) THEN - p%UseREDWINinterface = .FALSE. - END IF - END IF - - - end subroutine CheckError -end subroutine REDWINinterface_Init - - -!================================================================================================================================== -!> This routine would call the DLL a final time, but there appears to be no end routine for the DLL, -!! so we don't need to make a last call. It also frees the dynamic library (doesn't do anything on -!! static linked). -subroutine REDWINinterface_End(u, p, ErrStat, ErrMsg) - - TYPE(SlD_InputType), INTENT(IN ) :: u !< System inputs - TYPE(SlD_ParameterType), INTENT(INOUT) :: p !< Parameters - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - ! local variables: - INTEGER(IntKi) :: ErrStat2 ! The error status code - CHARACTER(ErrMsgLen) :: ErrMsg2 ! The error message, if an error occurred - character(*), parameter :: RoutineName = 'REDWINinterface_End' - -#ifdef NO_LibLoad - ErrStat = ErrID_None - ErrMsg= '' - CALL SetErrStat( ErrID_Warn,' --> Skipping DynamicLib call for '//TRIM(p%DLL_Trgt%FileName),ErrStat,ErrMsg,RoutineName ) -#else - ! Free the library (note: this doesn't do anything #ifdef STATIC_DLL_LOAD because p%DLL_Trgt is 0 (NULL)) - CALL FreeDynamicLib( p%DLL_Trgt, ErrStat2, ErrMsg2 ) - IF (ErrStat2 /= ErrID_None) THEN - ErrStat = MAX(ErrStat, ErrStat2) - ErrMsg = TRIM(ErrMsg)//NewLine//TRIM(ErrMsg2) - END IF -#endif - -end subroutine REDWINinterface_End - -!================================================================================================================================== -!> This routine sets the AVRswap array, calls the routine from the REDWIN DLL, and sets the outputs from the call to be used as -!! necessary in the main ServoDyn CalcOutput routine. -subroutine REDWINinterface_CalcOutput(t, u, p, dll_data, ErrStat, ErrMsg) - real(DbKi), intent(in ) :: t !< Current simulation time in seconds - type(SlD_InputType), intent(in ) :: u !< Inputs at t - type(SlD_ParameterType), intent(in ) :: p !< Parameters - type(REDWINdllType), intent(inout) :: dll_data - integer(IntKi), intent( out) :: ErrStat !< Error status of the operation - character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - ! local variables: - integer(IntKi) :: ErrStat2 ! The error status code - character(ErrMsgLen) :: ErrMsg2 ! The error message, if an error occurred - character(*), parameter :: RoutineName = 'REDWINinterface_CalcOutput' - ! Initialize error values: - ErrStat = ErrID_None - ErrMsg= '' -!FIXME: add some debugging options -#ifdef DEBUG_REDWIN_INTERFACE -!CALL WrNumAryFileNR ( 58, m%dll_data%avrSWAP,'1x,ES15.6E2', ErrStat, ErrMsg ) -!write(58,'()') -#endif -#ifdef NO_LibLoad - CALL SetErrStat( ErrID_Warn,' --> Skipping DynamicLib call for '//TRIM(p%DLL_Trgt%FileName),ErrStat,ErrMsg,RoutineName ) -#else - ! Call the REDWIN-style DLL: - CALL CallREDWINdll(u, p%DLL_Trgt, dll_data, p, ErrStat, ErrMsg) - IF ( ErrStat >= AbortErrLev ) RETURN -#endif -#ifdef DEBUG_REDWIN_INTERFACE -!CALL WrNumAryFileNR ( 59, m%dll_data%avrSWAP,'1x,ES15.6E2', ErrStat, ErrMsg ) -!write(59,'()') -#endif -end subroutine REDWINinterface_CalcOutput end module REDWINinterface From b2274bb1ea3d9f42be459124357d84b8994453ed Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 18 Feb 2020 17:31:17 -0700 Subject: [PATCH 028/136] SlD: update vs build. --- vs-build/SoilDyn/SoilDyn.vfproj | 90 +++++++++++++++++---------------- 1 file changed, 46 insertions(+), 44 deletions(-) diff --git a/vs-build/SoilDyn/SoilDyn.vfproj b/vs-build/SoilDyn/SoilDyn.vfproj index 4714c0da9..357c887e1 100644 --- a/vs-build/SoilDyn/SoilDyn.vfproj +++ b/vs-build/SoilDyn/SoilDyn.vfproj @@ -94,191 +94,191 @@ - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + @@ -288,6 +288,8 @@ + + From 802e343c5246732da088d7ffce451982db151e00 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 19 Feb 2020 09:40:40 -0700 Subject: [PATCH 029/136] SlD: update registry bat file for VS builds --- vs-build/RunRegistry.bat | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/vs-build/RunRegistry.bat b/vs-build/RunRegistry.bat index c9090c415..409f22d74 100644 --- a/vs-build/RunRegistry.bat +++ b/vs-build/RunRegistry.bat @@ -41,11 +41,11 @@ SET ExtPtfm_Loc=%Modules_Loc%\extptfm\src SET AD_Loc=%Modules_Loc%\aerodyn\src SET SrvD_Loc=%Modules_Loc%\servodyn\src SET BD_Loc=%Modules_Loc%\beamdyn\src -SET DirtD_Loc=%Modules_Loc%\dirtdyn\src +SET SlD_Loc=%Modules_Loc%\soildyn\src SET SC_Loc=%Modules_Loc%\supercontroller\src SET ALL_FAST_Includes=-I "%FAST_Loc%" -I "%NWTC_Lib_Loc%" -I "%ED_Loc%" -I "%SrvD_Loc%" -I "%AD14_Loc%" -I^ - "%AD_Loc%" -I "%BD_Loc%" -I "%DirtD_Loc%" -I "%SC_Loc%" -I^ + "%AD_Loc%" -I "%BD_Loc%" -I "%SlD_Loc%" -I "%SC_Loc%" -I^ "%IfW_Loc%" -I "%SD_Loc%" -I "%HD_Loc%" -I "%MAP_Loc%" -I "%FEAM_Loc%" -I^ "%IceF_Loc%" -I "%IceD_Loc%" -I "%MD_Loc%" -I "%OpFM_Loc%" -I "%Orca_Loc%" -I "%ExtPtfm_Loc%" @@ -75,10 +75,10 @@ SET Output_Loc=%CURR_LOC% %REGISTRY% "%CURR_LOC%\Registry_BeamDyn.txt" -I "%NWTC_Lib_Loc%" -O "%Output_Loc%" GOTO checkError -:DirtDyn -SET CURR_LOC=%DirtD_Loc% +:SoilDyn +SET CURR_LOC=%SlD_Loc% SET Output_Loc=%CURR_LOC% -%REGISTRY% "%CURR_LOC%\DirtDyn_Registry.txt" -I "%NWTC_Lib_Loc%" -O "%Output_Loc%" +%REGISTRY% "%CURR_LOC%\SoilDyn_Registry.txt" -I "%NWTC_Lib_Loc%" -O "%Output_Loc%" GOTO checkError :SuperController From a4943128ec21c5c1e308d06e506fee4dfcfe571c Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 19 Feb 2020 10:16:47 -0700 Subject: [PATCH 030/136] SlD: move checks on DLL input files --- modules/soildyn/src/REDWINinterface.f90 | 34 ++++++++++++++++++++++--- modules/soildyn/src/SoilDyn.f90 | 21 ++------------- 2 files changed, 32 insertions(+), 23 deletions(-) diff --git a/modules/soildyn/src/REDWINinterface.f90 b/modules/soildyn/src/REDWINinterface.f90 index feeb0db7e..9f2eadaab 100644 --- a/modules/soildyn/src/REDWINinterface.f90 +++ b/modules/soildyn/src/REDWINinterface.f90 @@ -103,9 +103,6 @@ subroutine CallREDWINdll ( u, DLL, dll_data, p, ErrStat, ErrMsg ) PROPSFILE = TRIM(dll_data%PROPSfile) LDISPFILE = TRIM(dll_data%LDISPfile) - ! Check existance of DLL input files. The DLL does not check this, and will - ! catastrophically fail if they are not found. - #ifdef STATIC_DLL_LOAD ! if we're statically loading the library (i.e., OpenFOAM), we can just call INTERFACEFOUNDATION(); CALL INTERFACEFOUNDATION( PROPSFILE, LDISPFILE, & @@ -138,7 +135,7 @@ subroutine REDWINinterface_Init(u,p,dll_data,y,InputFileData, ErrStat, ErrMsg) type(REDWINdllType), intent(inout) :: dll_data type(SlD_OutputType), intent(inout) :: y !< Initial system outputs (outputs are not calculated; !! only the output mesh is initialized) - type(SlD_InputFile), intent(inout) :: InputFileData !< Data stored in the module's input file + type(SlD_InputFile), intent(in ) :: InputFileData !< Data stored in the module's input file integer(IntKi), intent( out) :: ErrStat !< Error status of the operation character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None @@ -146,6 +143,11 @@ subroutine REDWINinterface_Init(u,p,dll_data,y,InputFileData, ErrStat, ErrMsg) integer(IntKi) :: ErrStat2 ! The error status code character(ErrMsgLen) :: ErrMsg2 ! The error message, if an error occurred character(*), parameter :: RoutineName = 'REDWINinterface_Init' + logical :: FileExist + character(1024) :: PriPath !< Path name of the primary file + character(1024) :: PropsLoc !< Full path to PropsFile location + character(1024) :: LDispLoc !< Full path to LDispFile location + ErrStat = ErrID_None @@ -156,6 +158,9 @@ subroutine REDWINinterface_Init(u,p,dll_data,y,InputFileData, ErrStat, ErrMsg) CALL SetErrStat( ErrID_Warn,' --> Skipping LoadDynamicLib call for '//TRIM(InputFileData%DLL_FileName),ErrStat,ErrMsg,RoutineName ) #endif + call GetPath( InputFileData%DLL_FileName, PriPath ) + call CheckPaths() + if (ErrStat >= AbortErrLev) return ! Load the DLL #ifdef STATIC_DLL_LOAD @@ -184,6 +189,27 @@ subroutine REDWINinterface_Init(u,p,dll_data,y,InputFileData, ErrStat, ErrMsg) p%UseREDWINinterface = .TRUE. CONTAINS + subroutine CheckPaths() + ! Check existance of DLL input files. The DLL does not check this, and will + ! catastrophically fail if they are not found. + if ( PathIsRelative( dll_data%PROPSfile ) ) then + PropsLoc = trim(PriPath)//trim(dll_data%PROPSfile) + else + PropsLoc = trim(dll_data%PROPSfile) + endif + if ( PathIsRelative( dll_data%LDISPfile ) ) then + LDispLoc = trim(PriPath)//trim(dll_data%LDISPfile) + else + LDispLoc = trim(dll_data%LDISPfile) + endif + inquire( file=trim(PropsLoc), exist=FileExist ) + if ( .not. FileExist ) call SetErrStat(ErrID_Fatal, 'PropsFile '//trim(dll_data%PROPSfile)// & + ' not found (path must be relative to DLL location, or absolute)', ErrStat, ErrMsg, 'REDWINinterface_Init') + inquire( file=trim(LDispLoc), exist=FileExist ) + if ( .not. FileExist ) call SetErrStat(ErrID_Fatal, 'LDispFile '//trim(dll_data%LDISPFile)// & + ' not found (path must be relative to DLL location, or absolute)', ErrStat, ErrMsg, 'REDWINinterface_Init') + end subroutine CheckPaths + logical function Failed() call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) Failed = ErrStat >= AbortErrLev diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index cc8a628be..ba5815d66 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -194,6 +194,7 @@ subroutine SoilDyn_InitMisc( InputFileData, m, ErrStat, ErrMsg ) return endif + ! Set the input file names and check they are not too long. Existance checks done in the interface routine. do i=1,InputFileData%DLL_NumPoints m%dll_data(i)%PROPSfile = trim(InputFileData%DLL_PropsFile(i)) if ( len(m%dll_data(i)%PROPSfile) < len_trim(InputFileData%DLL_PropsFile(i)) ) then @@ -205,26 +206,8 @@ subroutine SoilDyn_InitMisc( InputFileData, m, ErrStat, ErrMsg ) call SetErrStat(ErrID_Fatal, 'LDispFile #'//trim(Num2LStr(i))//' name is longer than '//trim(Num2LStr(len(m%dll_data(i)%LDISPfile)))// & ' characters (DLL limititation)', ErrStat, ErrMsg, '') endif - ! Check if errors above - if (ErrStat >= AbortErrLev) return - - - ! Check the file exists relative to the DLL location (DLL location is absolute) - if ( PathIsRelative( m%dll_data(i)%PROPSfile ) ) then - PropsLoc = trim(PriPath)//trim(m%dll_data(i)%PROPSfile) - else - PropsLoc = trim(m%dll_data(i)%PROPSfile) - endif - if ( PathIsRelative( m%dll_data(i)%LDISPfile ) ) then - LDispLoc = trim(PriPath)//trim(m%dll_data(i)%LDISPfile) - else - LDispLoc = trim(m%dll_data(i)%LDISPfile) - endif - inquire( file=trim(PropsLoc), exist=FileExist ) - if ( .not. FileExist ) call SetErrStat(ErrID_Fatal, 'PropsFile #'//trim(Num2LStr(i))//' not found (path must be relative to DLL location, or absolute)', ErrStat, ErrMsg, '') - inquire( file=trim(LDispLoc), exist=FileExist ) - if ( .not. FileExist ) call SetErrStat(ErrID_Fatal, 'LDispFile #'//trim(Num2LStr(i))//' not found (path must be relative to DLL location, or absolute)', ErrStat, ErrMsg, '') enddo + if (ErrStat >= AbortErrLev) return end subroutine SoilDyn_InitMisc end subroutine SoilDyn_Init From 8b632259b91348dcc814bc0e2e47e2bc97ab3b33 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 19 Feb 2020 11:31:10 -0700 Subject: [PATCH 031/136] SlD: remove SlD types from REDWINinterface.f90 Also cleaned up the preprocessor directives a bit --- modules/soildyn/src/REDWINinterface.f90 | 150 +++++++++++------------- modules/soildyn/src/SoilDyn.f90 | 9 +- 2 files changed, 75 insertions(+), 84 deletions(-) diff --git a/modules/soildyn/src/REDWINinterface.f90 b/modules/soildyn/src/REDWINinterface.f90 index 9f2eadaab..b2beb3791 100644 --- a/modules/soildyn/src/REDWINinterface.f90 +++ b/modules/soildyn/src/REDWINinterface.f90 @@ -21,7 +21,7 @@ MODULE REDWINinterface !FIXME: when done, remove the ifdef NO_LibLoad checks. USE NWTC_Library - USE SoilDyn_Types + USE SoilDyn_Types, only: REDWINdllType IMPLICIT NONE @@ -82,13 +82,12 @@ end subroutine INTERFACEFOUNDATION CONTAINS !================================================================================================================================== !> This SUBROUTINE is used to call the REDWIN-style DLL. -subroutine CallREDWINdll ( u, DLL, dll_data, p, ErrStat, ErrMsg ) +subroutine CallREDWINdll ( DLL_Trgt, DLL_Model, dll_data, ErrStat, ErrMsg ) ! Passed Variables: - type(SlD_InputType), intent(in ) :: u ! System inputs - type(DLL_Type), intent(in ) :: DLL ! The DLL to be called. - type(REDWINdllType), intent(inout) :: dll_data ! data type containing the avrSWAP, accINFILE, and avcOUTNAME arrays - type(SlD_ParameterType), intent(in ) :: p ! Parameters + type(DLL_Type), intent(in ) :: DLL_Trgt ! The DLL to be called. + integer(IntKi), intent(in ) :: DLL_Model ! The DLL model type + type(REDWINdllType), intent(inout) :: dll_data ! data type containing the dll required arrays in DLL coordinate frame integer(IntKi), intent( out) :: ErrStat ! Error status of the operation character(*), intent( out) :: ErrMsg ! Error message if ErrStat /= ErrID_None @@ -103,6 +102,7 @@ subroutine CallREDWINdll ( u, DLL, dll_data, p, ErrStat, ErrMsg ) PROPSFILE = TRIM(dll_data%PROPSfile) LDISPFILE = TRIM(dll_data%LDISPfile) +#ifndef NO_LibLoad #ifdef STATIC_DLL_LOAD ! if we're statically loading the library (i.e., OpenFOAM), we can just call INTERFACEFOUNDATION(); CALL INTERFACEFOUNDATION( PROPSFILE, LDISPFILE, & @@ -112,41 +112,42 @@ subroutine CallREDWINdll ( u, DLL, dll_data, p, ErrStat, ErrMsg ) #else ! Call the DLL (first associate the address from the procedure in the DLL with the subroutine): if (RW_Ver == RW_v00) then - CALL C_F_PROCPOINTER( transfer(DLL%ProcAddr(1),C_NULL_FUNPTR), REDWIN_Subroutine_v00) + CALL C_F_PROCPOINTER( transfer(DLL_Trgt%ProcAddr(1),C_NULL_FUNPTR), REDWIN_Subroutine_v00) CALL REDWIN_Subroutine_v00 ( PROPSFILE, LDISPFILE, & dll_data%IDTask, dll_data%nErrorCode, dll_data%ErrorCode, & dll_data%Props, dll_data%StVar, dll_data%StVarPrint, & dll_data%Disp, dll_data%Force, dll_data%D ) endif +#endif #endif ! Call routine for error trapping the returned ErrorCodes - call CheckREDWINerrors( dll_data, p%DLL_Model, dll_data%SuppressWarn, ErrStat, ErrMsg ) + call CheckREDWINerrors( dll_data, DLL_Model, dll_data%SuppressWarn, ErrStat, ErrMsg ) return end subroutine CallREDWINdll !================================================================================================================================== !> This routine initializes variables used in the REDWIN DLL interface. -subroutine REDWINinterface_Init(u,p,dll_data,y,InputFileData, ErrStat, ErrMsg) +subroutine REDWINinterface_Init( DLL_FileName, DLL_ProcName, DLL_Trgt, DLL_Model, dll_data, UseREDWINinterface, ErrStat, ErrMsg ) - type(SlD_InputType), intent(inout) :: u !< An initial guess for the input; input mesh must be defined - type(SlD_ParameterType), intent(inout) :: p !< Parameters - type(REDWINdllType), intent(inout) :: dll_data - type(SlD_OutputType), intent(inout) :: y !< Initial system outputs (outputs are not calculated; - !! only the output mesh is initialized) - type(SlD_InputFile), intent(in ) :: InputFileData !< Data stored in the module's input file - integer(IntKi), intent( out) :: ErrStat !< Error status of the operation - character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + character(1024), intent(in ) :: DLL_FileName !< DLL filename from input file + character(1024), intent(in ) :: DLL_ProcName !< Procedure name from input file + type(DLL_Type), intent(inout) :: DLL_Trgt !< The DLL to be called. + integer(IntKi), intent(in ) :: DLL_Model !< Model type of the DLL + type(REDWINdllType), intent(inout) :: dll_data !< DLL coordinate frame arrays in here + logical, intent( out) :: UseREDWINinterface !< Can use the interface + integer(IntKi), intent( out) :: ErrStat !< Error status of the operation + character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None ! local variables - integer(IntKi) :: ErrStat2 ! The error status code - character(ErrMsgLen) :: ErrMsg2 ! The error message, if an error occurred - character(*), parameter :: RoutineName = 'REDWINinterface_Init' - logical :: FileExist - character(1024) :: PriPath !< Path name of the primary file - character(1024) :: PropsLoc !< Full path to PropsFile location - character(1024) :: LDispLoc !< Full path to LDispFile location + integer(IntKi) :: ErrStat2 ! The error status code + character(ErrMsgLen) :: ErrMsg2 ! The error message, if an error occurred + character(*), parameter :: RoutineName = 'REDWINinterface_Init' + logical :: FileExist + character(1024) :: PriPath !< Path name of the primary file + character(1024) :: PropsLoc !< Full path to PropsFile location + character(1024) :: LDispLoc !< Full path to LDispFile location @@ -154,39 +155,36 @@ subroutine REDWINinterface_Init(u,p,dll_data,y,InputFileData, ErrStat, ErrMsg) ErrMsg= '' CALL DispNVD( REDWINinterface_Ver ) ! Display the version of this interface -#ifdef NO_Libload - CALL SetErrStat( ErrID_Warn,' --> Skipping LoadDynamicLib call for '//TRIM(InputFileData%DLL_FileName),ErrStat,ErrMsg,RoutineName ) -#endif - call GetPath( InputFileData%DLL_FileName, PriPath ) + call GetPath( DLL_FileName, PriPath ) call CheckPaths() if (ErrStat >= AbortErrLev) return ! Load the DLL +#ifdef NO_LibLoad + CALL SetErrStat( ErrID_Warn,' --> Skipping LoadDynamicLib call for '//TRIM(DLL_FileName),ErrStat,ErrMsg,RoutineName ) +#else #ifdef STATIC_DLL_LOAD ! because OpenFOAM needs the MPI task to copy the library, we're not going to dynamically load it; it needs to be loaded at runtime. - p%DLL_Trgt%FileName = '' - p%DLL_Trgt%ProcName = '' + DLL_Trgt%FileName = '' + DLL_Trgt%ProcName = '' #else ! Define and load the DLL: - p%DLL_Trgt%FileName = InputFileData%DLL_FileName - p%DLL_Trgt%ProcName = "" ! initialize all procedures to empty so we try to load only one - p%DLL_Trgt%ProcName(1) = InputFileData%DLL_ProcName -#ifndef NO_LibLoad - CALL LoadDynamicLib ( p%DLL_Trgt, ErrStat2, ErrMsg2 ); if(Failed()) return; + DLL_Trgt%FileName = DLL_FileName + DLL_Trgt%ProcName = "" ! initialize all procedures to empty so we try to load only one + DLL_Trgt%ProcName(1) = DLL_ProcName + CALL LoadDynamicLib ( DLL_Trgt, ErrStat2, ErrMsg2 ); if(Failed()) return; #endif #endif ! Initialize DLL dll_data%IDtask = IDtask_init -#ifndef NO_LibLoad - CALL CallREDWINdll(u, p%DLL_Trgt, dll_data, p, ErrStat2, ErrMsg2); if(Failed()) return; -#endif + CALL CallREDWINdll(DLL_Trgt, DLL_Model, dll_data, ErrStat2, ErrMsg2); if(Failed()) return; !TODO: can we add a check on which type of library we actually loaded and compare to the model we set???? ! Set status flag: - p%UseREDWINinterface = .TRUE. + UseREDWINinterface = .TRUE. CONTAINS subroutine CheckPaths() @@ -204,16 +202,17 @@ subroutine CheckPaths() endif inquire( file=trim(PropsLoc), exist=FileExist ) if ( .not. FileExist ) call SetErrStat(ErrID_Fatal, 'PropsFile '//trim(dll_data%PROPSfile)// & - ' not found (path must be relative to DLL location, or absolute)', ErrStat, ErrMsg, 'REDWINinterface_Init') + ' not found (path must be relative to DLL location, or absolute)', ErrStat, ErrMsg, RoutineName) inquire( file=trim(LDispLoc), exist=FileExist ) if ( .not. FileExist ) call SetErrStat(ErrID_Fatal, 'LDispFile '//trim(dll_data%LDISPFile)// & - ' not found (path must be relative to DLL location, or absolute)', ErrStat, ErrMsg, 'REDWINinterface_Init') + ' not found (path must be relative to DLL location, or absolute)', ErrStat, ErrMsg, RoutineName) + if ( ErrStat >= AbortErrLev ) UseREDWINinterface = .FALSE. end subroutine CheckPaths logical function Failed() call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) Failed = ErrStat >= AbortErrLev - if ( ErrStat >= AbortErrLev ) p%UseREDWINinterface = .FALSE. + if ( ErrStat >= AbortErrLev ) UseREDWINinterface = .FALSE. end function Failed end subroutine REDWINinterface_Init @@ -222,25 +221,23 @@ end subroutine REDWINinterface_Init !> This routine would call the DLL a final time, but there appears to be no end routine for the DLL, !! so we don't need to make a last call. It also frees the dynamic library (doesn't do anything on !! static linked). -subroutine REDWINinterface_End(u, p, ErrStat, ErrMsg) +subroutine REDWINinterface_End( DLL_Trgt, ErrStat, ErrMsg ) - TYPE(SlD_InputType), INTENT(IN ) :: u !< System inputs - TYPE(SlD_ParameterType), INTENT(INOUT) :: p !< Parameters - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + type(DLL_Type), intent(inout) :: DLL_Trgt ! The DLL to be called. + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None ! local variables: - INTEGER(IntKi) :: ErrStat2 ! The error status code - CHARACTER(ErrMsgLen) :: ErrMsg2 ! The error message, if an error occurred + INTEGER(IntKi) :: ErrStat2 ! The error status code + CHARACTER(ErrMsgLen) :: ErrMsg2 ! The error message, if an error occurred character(*), parameter :: RoutineName = 'REDWINinterface_End' -#ifdef NO_LibLoad ErrStat = ErrID_None ErrMsg= '' - CALL SetErrStat( ErrID_Warn,' --> Skipping DynamicLib call for '//TRIM(p%DLL_Trgt%FileName),ErrStat,ErrMsg,RoutineName ) -#else - ! Free the library (note: this doesn't do anything #ifdef STATIC_DLL_LOAD because p%DLL_Trgt is 0 (NULL)) - CALL FreeDynamicLib( p%DLL_Trgt, ErrStat, ErrMsg ) + +#ifndef NO_LibLoad + ! Free the library (note: this doesn't do anything #ifdef STATIC_DLL_LOAD because DLL_Trgt is 0 (NULL)) + CALL FreeDynamicLib( DLL_Trgt, ErrStat, ErrMsg ) #endif end subroutine REDWINinterface_End @@ -248,14 +245,15 @@ end subroutine REDWINinterface_End !================================================================================================================================== !> This routine sets the AVRswap array, calls the routine from the REDWIN DLL, and sets the outputs from the call to be used as !! necessary in the main ServoDyn CalcOutput routine. -subroutine REDWINinterface_CalcOutput(t, u, p, dll_data, ErrStat, ErrMsg) +subroutine REDWINinterface_CalcOutput( DLL_Trgt, DLL_Model, Displacement, Force, dll_data, ErrStat, ErrMsg ) - real(DbKi), intent(in ) :: t !< Current simulation time in seconds - type(SlD_InputType), intent(in ) :: u !< Inputs at t - type(SlD_ParameterType), intent(in ) :: p !< Parameters - type(REDWINdllType), intent(inout) :: dll_data - integer(IntKi), intent( out) :: ErrStat !< Error status of the operation - character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + type(DLL_Type), intent(in ) :: DLL_Trgt !< The DLL to be called. + integer(IntKi), intent(in ) :: DLL_Model !< Model type of the DLL + real(ReKi), intent(in ) :: Displacement(6) !< OpenFAST global coordinate frame + real(ReKi), intent( out) :: Force(6) !< OpenFAST global coordinate frame + type(REDWINdllType), intent(inout) :: dll_data !< DLL coordinate frame arrays in here + integer(IntKi), intent( out) :: ErrStat !< Error status of the operation + character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None ! local variables: integer(IntKi) :: ErrStat2 ! The error status code @@ -266,7 +264,7 @@ subroutine REDWINinterface_CalcOutput(t, u, p, dll_data, ErrStat, ErrMsg) ErrStat = ErrID_None ErrMsg= '' -!FIXME: coordinate transform and copy over u information here! +!FIXME: coordinate transform and copy over Diplacement information here! !FIXME: add some debugging options @@ -275,13 +273,9 @@ subroutine REDWINinterface_CalcOutput(t, u, p, dll_data, ErrStat, ErrMsg) !write(58,'()') #endif -#ifdef NO_LibLoad - CALL SetErrStat( ErrID_Warn,' --> Skipping DynamicLib call for '//TRIM(p%DLL_Trgt%FileName),ErrStat,ErrMsg,RoutineName ) -#else ! Call the REDWIN-style DLL: dll_data%IDtask = IDtask_calc - CALL CallREDWINdll(u, p%DLL_Trgt, dll_data, p, ErrStat, ErrMsg); if(Failed()) return; -#endif + CALL CallREDWINdll( DLL_Trgt, DLL_Model, dll_data, ErrStat, ErrMsg); if(Failed()) return; !FIXME: coordinate transform here!!!! @@ -302,15 +296,16 @@ end subroutine REDWINinterface_CalcOutput !================================================================================================================================== !> This routine sets the AVRswap array, calls the routine from the REDWIN DLL, and sets the outputs from the call to be used as !! necessary in the main ServoDyn CalcOutput routine. -subroutine REDWINinterface_GetStiffMatrix(t, u, p, dll_data, StiffMatrix, ErrStat, ErrMsg) +subroutine REDWINinterface_GetStiffMatrix( DLL_Trgt, DLL_Model, Displacement, Force, StiffMatrix, dll_data, ErrStat, ErrMsg ) - real(DbKi), intent(in ) :: t !< Current simulation time in seconds - type(SlD_InputType), intent(in ) :: u !< Inputs at t - type(SlD_ParameterType), intent(in ) :: p !< Parameters + type(DLL_Type), intent(in ) :: DLL_Trgt !< The DLL to be called. + integer(IntKi), intent(in ) :: DLL_Model !< Model type of the DLL + real(ReKi), intent(in ) :: Displacement(6) !< Displacement (OpenFAST global coords) + real(ReKi), intent( out) :: Force(6) !< Resulting force (OpenFAST global coords) + real(ReKi), intent( out) :: StiffMatrix(6,6) !< Returned stiffness (OpenFAST global coords) type(REDWINdllType), intent(inout) :: dll_data - real(ReKi), intent( out) :: StiffMatrix(6,6) - integer(IntKi), intent( out) :: ErrStat !< Error status of the operation - character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + integer(IntKi), intent( out) :: ErrStat !< Error status of the operation + character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None ! local variables: integer(IntKi) :: ErrStat2 ! The error status code @@ -323,15 +318,10 @@ subroutine REDWINinterface_GetStiffMatrix(t, u, p, dll_data, StiffMatrix, ErrSta !FIXME: coordinate transform and copy over u information here! -#ifdef NO_LibLoad - CALL SetErrStat( ErrID_Warn,' --> Skipping DynamicLib call for '//TRIM(p%DLL_Trgt%FileName),ErrStat,ErrMsg,RoutineName ) - StiffMatrix = 0.0_ReKi -#else ! Call the REDWIN-style DLL: dll_data%IDtask = IDtask_stiff - CALL CallREDWINdll(u, p%DLL_Trgt, dll_data, p, ErrStat, ErrMsg); if(Failed()) return; + CALL CallREDWINdll( DLL_Trgt, DLL_Model, dll_data, ErrStat, ErrMsg); if(Failed()) return; StiffMatrix = real(dll_data%D,ReKi) ! NOTE: converting types here -#endif !FIXME: coordinate transform here!!!! diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index ba5815d66..8a1e82db0 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -157,7 +157,8 @@ subroutine SoilDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In ! Initialize the dll do j=1,size(m%dll_data) - call REDWINinterface_Init(u,p,m%dll_data(j),y,InputFileData, ErrStat2, ErrMsg2); if (Failed()) return; + call REDWINinterface_Init( InputFileData%DLL_FileName, InputFileData%DLL_ProcName, p%DLL_Trgt, p%DLL_Model, & + m%dll_data(j), p%UseREDWINinterface, ErrStat2, ErrMsg2); if (Failed()) return; enddo contains @@ -239,7 +240,7 @@ subroutine SoilDyn_End( u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) !! Place any last minute operations or calculations here: if (p%UseREDWINinterface) then - call REDWINinterface_End( u, p, ErrStat, ErrMsg ) + call REDWINinterface_End( p%DLL_Trgt, ErrStat, ErrMsg ) endif !! Close files here (but because of checkpoint-restart capability, it is not recommended to have files open during the simulation): @@ -247,8 +248,8 @@ subroutine SoilDyn_End( u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) !! Destroy the input data: call SlD_DestroyInput( u, ErrStat2,ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - !! Destroy the parameter data: - call SlD_DestroyParam( p, ErrStat2,ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + !! Destroy the parameter data: We won't keep warnings from p since it will complain about FreeDynamicLib when not compiled with it + call SlD_DestroyParam( p, ErrStat2,ErrMsg2) !; call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) !! Destroy the state data: call SlD_DestroyContState( x, ErrStat2,ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) From eb248830bf264a9ec2803564645b2237dd75e1eb Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 19 Feb 2020 11:41:16 -0700 Subject: [PATCH 032/136] SlD: simplify driver --- modules/soildyn/src/driver/SoilDyn_Driver.f90 | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/modules/soildyn/src/driver/SoilDyn_Driver.f90 b/modules/soildyn/src/driver/SoilDyn_Driver.f90 index da27ffc09..1545f129c 100644 --- a/modules/soildyn/src/driver/SoilDyn_Driver.f90 +++ b/modules/soildyn/src/driver/SoilDyn_Driver.f90 @@ -94,21 +94,13 @@ PROGRAM SoilDyn_Driver ! Modify u (likely from the outputs of another module or a set of test conditions) here: - ! Calculate outputs at n - CALL SoilDyn_CalcOutput( Time, u(1), p, x, xd, z, OtherState, y, misc, ErrStat, ErrMsg ) - IF ( ErrStat /= ErrID_None ) THEN ! Check if there was an error and do something about it if necessary - CALL WrScr( 'After CalcOutput: '//ErrMsg ) - if ( ErrStat >= AbortErrLev ) call ProgEnd() - END IF - + CALL SoilDyn_CalcOutput( Time, u(1), p, x, xd, z, OtherState, y, misc, ErrStat, ErrMsg ); + call CheckErr('After CalcOutput: '); ! Get state variables at next step: INPUT at step n, OUTPUT at step n + 1 - CALL SoilDyn_UpdateStates( Time, n, u, InputTime, p, x, xd, z, OtherState, misc, ErrStat, ErrMsg ) - IF ( ErrStat /= ErrID_None ) THEN ! Check if there was an error and do something about it if necessary - CALL WrScr( ErrMsg ) - if ( ErrStat >= AbortErrLev ) call ProgEnd() - END IF + CALL SoilDyn_UpdateStates( Time, n, u, InputTime, p, x, xd, z, OtherState, misc, ErrStat, ErrMsg ); + call CheckErr(''); END DO @@ -122,6 +114,13 @@ PROGRAM SoilDyn_Driver END IF CONTAINS + subroutine CheckErr(Text) + character(*), intent(in) :: Text + IF ( ErrStat /= ErrID_None ) THEN ! Check if there was an error and do something about it if necessary + CALL WrScr( Text//ErrMsg ) + if ( ErrStat >= AbortErrLev ) call ProgEnd() + END IF + end subroutine CheckErr subroutine ProgEnd() ! Placeholder for moment Call ProgAbort('Fatal error encountered. Ending.') From a624c2b3e2156728be22d61670de754d7066a8ca Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 19 Feb 2020 13:07:04 -0700 Subject: [PATCH 033/136] SlD: coordinate transforms between OpenFAST and REDWIN --- modules/soildyn/src/REDWINinterface.f90 | 111 ++++++++++++++++++++++-- 1 file changed, 103 insertions(+), 8 deletions(-) diff --git a/modules/soildyn/src/REDWINinterface.f90 b/modules/soildyn/src/REDWINinterface.f90 index b2beb3791..f34ac0bc8 100644 --- a/modules/soildyn/src/REDWINinterface.f90 +++ b/modules/soildyn/src/REDWINinterface.f90 @@ -79,6 +79,19 @@ end subroutine INTERFACEFOUNDATION INTEGER(IntKi), PARAMETER :: RW_ver = RW_v00 ! Current version number (read from DLL file) + ! Coordinate transforms + interface ToREDWINcoords + module procedure ToREDWINcoordsR4toR8 + module procedure ToREDWINcoordsR8toR8 + module procedure ToREDWINcoordsR4toR8Mat + module procedure ToREDWINcoordsR8toR8Mat + end interface + + interface FromREDWINcoords + module procedure FromREDWINcoordsR8toR8 + module procedure FromREDWINcoordsR8toR8Mat + end interface + CONTAINS !================================================================================================================================== !> This SUBROUTINE is used to call the REDWIN-style DLL. @@ -264,8 +277,8 @@ subroutine REDWINinterface_CalcOutput( DLL_Trgt, DLL_Model, Displacement, Force, ErrStat = ErrID_None ErrMsg= '' -!FIXME: coordinate transform and copy over Diplacement information here! - + ! Coordinate transform to REDWIN frame + dll_data%Disp = ToREDWINcoords( Displacement ) !FIXME: add some debugging options #ifdef DEBUG_REDWIN_INTERFACE @@ -277,8 +290,8 @@ subroutine REDWINinterface_CalcOutput( DLL_Trgt, DLL_Model, Displacement, Force, dll_data%IDtask = IDtask_calc CALL CallREDWINdll( DLL_Trgt, DLL_Model, dll_data, ErrStat, ErrMsg); if(Failed()) return; - -!FIXME: coordinate transform here!!!! + ! Coordinate transform from REDWIN frame + Force = real(FromREDWINcoords( dll_data%Force ), ReKi) #ifdef DEBUG_REDWIN_INTERFACE !CALL WrNumAryFileNR ( 59, m%dll_data%avrSWAP,'1x,ES15.6E2', ErrStat, ErrMsg ) @@ -316,14 +329,16 @@ subroutine REDWINinterface_GetStiffMatrix( DLL_Trgt, DLL_Model, Displacement, Fo ErrStat = ErrID_None ErrMsg= '' -!FIXME: coordinate transform and copy over u information here! + ! Coordinate transform to REDWIN frame + dll_data%Disp = ToREDWINcoords( Displacement ) ! Call the REDWIN-style DLL: dll_data%IDtask = IDtask_stiff CALL CallREDWINdll( DLL_Trgt, DLL_Model, dll_data, ErrStat, ErrMsg); if(Failed()) return; - StiffMatrix = real(dll_data%D,ReKi) ! NOTE: converting types here -!FIXME: coordinate transform here!!!! + ! Coordinate transformation + Force = real(FromREDWINcoords( dll_data%Force ), ReKi) + StiffMatrix = real(FromREDWINcoords( dll_data%D ), ReKi) #ifdef DEBUG_REDWIN_INTERFACE !CALL WrNumAryFileNR ( 59, m%dll_data%avrSWAP,'1x,ES15.6E2', ErrStat, ErrMsg ) @@ -525,7 +540,87 @@ end subroutine CheckErrorsModel3 end subroutine CheckREDWINerrors - +!> coordinate transform to REDWIN coordinates +!! -> signs flip on y,z +!! | 1 0 0 | +!! R = | 0 -1 0 | +!! | 0 0 -1 | +function ToREDWINcoordsR4toR8(InArray) result(REDWIN) + real(SiKi), intent(in) :: InArray(6) + real(R8Ki) :: REDWIN(6) + REDWIN(1) = real( InArray(1), R8Ki ) + REDWIN(2) = -real( InArray(2), R8Ki ) + REDWIN(3) = -real( InArray(3), R8Ki ) + REDWIN(4) = real( InArray(4), R8Ki ) + REDWIN(5) = -real( InArray(5), R8Ki ) + REDWIN(6) = -real( InArray(6), R8Ki ) +end function ToREDWINcoordsR4toR8 + +!> \copydoc redwininterface::ToREDWINcoordsR4toR8 +function ToREDWINcoordsR8toR8(InArray) result(REDWIN) + real(R8Ki), intent(in) :: InArray(6) + real(R8Ki) :: REDWIN(6) + REDWIN(1) = InArray(1) + REDWIN(2) = -InArray(2) + REDWIN(3) = -InArray(3) + REDWIN(4) = InArray(4) + REDWIN(5) = -InArray(5) + REDWIN(6) = -InArray(6) +end function ToREDWINcoordsR8toR8 + +!> \copydoc redwininterface::ToREDWINcoordsR4toR8 +function ToREDWINcoordsR4toR8Mat(InArray) result(REDWIN) + real(SiKi), intent(in) :: InArray(6,6) + real(R8Ki) :: REDWIN(6,6) + REDWIN(:,1) = real( InArray(:,1), R8Ki ) + REDWIN(:,2) = -real( InArray(:,2), R8Ki ) + REDWIN(:,3) = -real( InArray(:,3), R8Ki ) + REDWIN(:,4) = real( InArray(:,4), R8Ki ) + REDWIN(:,5) = -real( InArray(:,5), R8Ki ) + REDWIN(:,6) = -real( InArray(:,6), R8Ki ) +end function ToREDWINcoordsR4toR8Mat + +!> \copydoc redwininterface::ToREDWINcoordsR4toR8 +function ToREDWINcoordsR8toR8Mat(InArray) result(REDWIN) + real(R8Ki), intent(in) :: InArray(6,6) + real(R8Ki) :: REDWIN(6,6) + REDWIN(:,1) = InArray(:,1) + REDWIN(:,2) = -InArray(:,2) + REDWIN(:,3) = -InArray(:,3) + REDWIN(:,4) = InArray(:,4) + REDWIN(:,5) = -InArray(:,5) + REDWIN(:,6) = -InArray(:,6) +end function ToREDWINcoordsR8toR8Mat + + + +!> coordinate transform from REDWIN coordinates +!! -> signs flip on y,z +!! | 1 0 0 | +!! R = | 0 -1 0 | +!! | 0 0 -1 | +function FromREDWINcoordsR8toR8(InArray) result(FAST) + real(R8Ki), intent(in) :: InArray(6) + real(R8Ki) :: FAST(6) + FAST(1) = InArray(1) + FAST(2) = -InArray(2) + FAST(3) = -InArray(3) + FAST(4) = InArray(4) + FAST(5) = -InArray(5) + FAST(6) = -InArray(6) +end function FromREDWINcoordsR8toR8 + +!> \copydoc redwininterface::FromREDWINcoordsR8toR8 +function FromREDWINcoordsR8toR8Mat(InArray) result(FAST) + real(R8Ki), intent(in) :: InArray(6,6) + real(R8Ki) :: FAST(6,6) + FAST(:,1) = InArray(:,1) + FAST(:,2) = -InArray(:,2) + FAST(:,3) = -InArray(:,3) + FAST(:,4) = InArray(:,4) + FAST(:,5) = -InArray(:,5) + FAST(:,6) = -InArray(:,6) +end function FromREDWINcoordsR8toR8Mat From b40c967dc52c079555f3c0887ecc7476477b9615 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 25 Feb 2020 12:12:34 -0700 Subject: [PATCH 034/136] SlD: basic driver input file roughed in --- modules/soildyn/src/driver/SoilDyn_Driver.f90 | 140 +++ .../src/driver/SoilDyn_Driver_Subs.f90 | 829 +++--------------- .../src/driver/SoilDyn_Driver_Types.f90 | 38 +- 3 files changed, 243 insertions(+), 764 deletions(-) diff --git a/modules/soildyn/src/driver/SoilDyn_Driver.f90 b/modules/soildyn/src/driver/SoilDyn_Driver.f90 index 1545f129c..b68652ded 100644 --- a/modules/soildyn/src/driver/SoilDyn_Driver.f90 +++ b/modules/soildyn/src/driver/SoilDyn_Driver.f90 @@ -28,6 +28,11 @@ PROGRAM SoilDyn_Driver IMPLICIT NONE + TYPE( ProgDesc ), PARAMETER :: ProgInfo = ProgDesc("SoilDyn_Driver","","") + INTEGER(IntKi) :: SlDDriver_Verbose = 5 ! Verbose level. 0 = none, 5 = some, 10 = lots + + + integer(IntKi), parameter :: NumInp = 1 !< Number of inputs sent to SoilDyn_UpdateStates ! Program variables @@ -49,6 +54,14 @@ PROGRAM SoilDyn_Driver type(SlD_InputType) :: u(NumInp) !< System inputs type(SlD_OutputType) :: y !< System outputs + ! Local variables for this code + TYPE(SlDDriver_Flags) :: CLSettingsFlags ! Flags indicating which command line arguments were specified + TYPE(SlDDriver_Settings) :: CLSettings ! Command line arguments passed in + TYPE(SlDDriver_Flags) :: SettingsFlags ! Flags indicating which settings were specified (includes CL and ipt file) + TYPE(SlDDriver_Settings) :: Settings ! Driver settings + REAL(DbKi) :: Timer(1:2) ! Keep track of how long this takes to run + REAL(DbKi) :: TimeNow ! The current time + INTEGER(IntKi) :: n !< Loop counter (for time step) @@ -56,6 +69,133 @@ PROGRAM SoilDyn_Driver CHARACTER(ErrMsgLen) :: ErrMsg !< Error message if ErrStat /= ErrID_None + ! initialize library + call NWTC_Init + call DispNVD(ProgInfo) + + ! Start the timer + call CPU_TIME( Timer(1) ) + + ! Initialize the driver settings to their default values (same as the CL -- command line -- values) + call InitSettingsFlags( ProgInfo, CLSettings, CLSettingsFlags ) + Settings = CLSettings + SettingsFlags = CLSettingsFlags + + ! Parse the input line + call RetrieveArgs( CLSettings, CLSettingsFlags, ErrStat, ErrMsg ) + IF ( ErrStat >= AbortErrLev ) THEN + CALL ProgAbort( ErrMsg ) + ELSEIF ( ErrStat /= 0 ) THEN + CALL WrScr( NewLine//ErrMsg ) + ErrStat = ErrID_None + ENDIF + + ! Check if we are doing verbose error reporting + IF ( CLSettingsFlags%VVerbose ) SlDDriver_Verbose = 10_IntKi + IF ( CLSettingsFlags%Verbose ) SlDDriver_Verbose = 7_IntKi + + ! Verbose error reporting + IF ( SlDDriver_Verbose >= 10_IntKi ) THEN + CALL WrScr('--- Settings from the command line: ---') + CALL printSettings( CLSettingsFlags, CLSettings ) + CALL WrSCr(NewLine) + ENDIF + + ! Verbose error reporting + IF ( SlDDriver_Verbose >= 10_IntKi ) THEN + CALL WrScr('--- Driver settings (before reading driver ipt file): ---') + CALL printSettings( SettingsFlags, Settings ) + CALL WrScr(NewLine) + ENDIF + + + ! Copy the input file information from the CLSettings to the Settings. + ! At this point only one input file type can be set. + IF ( CLSettingsFlags%DvrIptFile ) THEN + SettingsFlags%DvrIptFile = CLSettingsFlags%DvrIptFile + Settings%DvrIptFileName = CLSettings%DvrIptFileName + ELSE + SettingsFlags%SlDIptFile = CLSettingsFlags%SlDIptFile + Settings%SlDIptFileName = CLSettings%SlDIptFileName + ENDIF + + + ! If the filename given was not the SlD input file (-ifw option), then it is treated + ! as the driver input file (flag should be set correctly by RetrieveArgs). So, we must + ! open this. + IF ( SettingsFlags%DvrIptFile ) THEN + + ! Read the driver input file + CALL ReadDvrIptFile( CLSettings%DvrIptFileName, SettingsFlags, Settings, ProgInfo, ErrStat, ErrMsg ) + IF ( ErrStat >= AbortErrLev ) THEN + CALL ProgAbort( ErrMsg ) + ELSEIF ( ErrStat /= 0 ) THEN + CALL WrScr( NewLine//ErrMsg ) + ErrStat = ErrID_None + ENDIF + + + ! VVerbose error reporting + IF ( SlDDriver_Verbose >= 10_IntKi ) THEN + CALL WrScr(NewLine//'--- Driver settings after reading the driver ipt file: ---') + CALL printSettings( SettingsFlags, Settings ) + CALL WrScr(NewLine) + ENDIF + + + ! VVerbose error reporting + IF ( SlDDriver_Verbose >= 10_IntKi ) CALL WrScr('Updating driver settings with command line arguments') + + + ! Now that we have read in the driver input settings, we need to override these with any + ! values from the command line arguments. The .TRUE. indicates that a driver input file + ! was read. + CALL UpdateSettingsWithCL( SettingsFlags, Settings, CLSettingsFlags, CLSettings, .TRUE., ErrStat, ErrMsg ) + IF ( ErrStat >= AbortErrLev ) THEN + CALL ProgAbort( ErrMsg ) + ELSEIF ( ErrStat /= ErrID_None ) THEN + CALL WrScr( NewLine//ErrMsg ) + ErrStat = ErrID_None + ENDIF + + ! Verbose error reporting + IF ( SlDDriver_Verbose >= 10_IntKi ) THEN + CALL WrSCr(NewLine//'--- Driver settings after copying over CL settings: ---') + CALL printSettings( SettingsFlags, Settings ) + CALL WrScr(NewLine) + ENDIF + + + ELSE + + + ! VVerbose error reporting + IF ( SlDDriver_Verbose >= 10_IntKi ) CALL WrScr('No driver input file used. Updating driver settings with command line arguments') + + + ! Since there were no settings picked up from the driver input file, we need to copy over all + ! the CLSettings into the regular Settings. The .FALSE. is a flag indicating that the driver + ! input file was not read. + CALL UpdateSettingsWithCL( SettingsFlags, Settings, CLSettingsFlags, CLSettings, .FALSE., ErrStat, ErrMsg ) + IF ( ErrStat >= AbortErrLev ) THEN + CALL ProgAbort( ErrMsg ) + ELSEIF ( ErrStat /= ErrID_None ) THEN + CALL WrScr( NewLine//ErrMsg ) + ErrStat = ErrID_None + ENDIF + + ! Verbose error reporting + IF ( SlDDriver_Verbose >= 10_IntKi ) THEN + CALL WrScr(NewLine//'--- Driver settings after copying over CL settings: ---') + CALL printSettings( SettingsFlags, Settings ) + CALL WrScr(NewLine) + ENDIF + + ENDIF + + + + !............................................................................................................................... ! Routines called in initialization diff --git a/modules/soildyn/src/driver/SoilDyn_Driver_Subs.f90 b/modules/soildyn/src/driver/SoilDyn_Driver_Subs.f90 index 023dea93d..166d2929d 100644 --- a/modules/soildyn/src/driver/SoilDyn_Driver_Subs.f90 +++ b/modules/soildyn/src/driver/SoilDyn_Driver_Subs.f90 @@ -33,20 +33,7 @@ MODULE SoilDyn_Driver_Subs CONTAINS !-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- !> Print out help information -SUBROUTINE DispHelpText( ErrStat, ErrMsg ) - - USE NWTC_Library - - IMPLICIT NONE - - ! Error Handling - INTEGER(IntKi), INTENT( OUT) :: ErrStat - CHARACTER(*), INTENT( OUT) :: ErrMsg - - ErrStat = ErrID_None - ErrMsg = '' - - +SUBROUTINE DispHelpText() ! Statement about usage CALL WrScr("") CALL WrScr(" Syntax: SoilDyn_Driver [options]") @@ -66,52 +53,69 @@ SUBROUTINE DispHelpText( ErrStat, ErrMsg ) CALL WrScr(" Notes:") CALL WrScr(" -- Options are not case sensitive.") CALL WrScr("") - - END SUBROUTINE DispHelpText +subroutine InitSettingsFlags( ProgInfo, CLSettings, CLFlags ) + implicit none + ! Storing the arguments + type( ProgDesc ), intent(in ) :: ProgInfo + type( SlDDriver_Settings ), intent( out) :: CLSettings !< Command line arguments passed in + type( SlDDriver_Flags ), intent( out) :: CLFlags !< Flags indicating which command line arguments were specified + + ! Set some CLSettings to null/default values + CLSettings%DvrIptFileName = "" ! No input name name until set + CLSettings%SlDIptFileName = "" ! No SlD input file name until set + CLSettings%SummaryFileName = "" ! No summary file name until set + CLSettings%NumTimeSteps = 0_IntKi + CLSettings%DT = 0.0_DbKi + CLSettings%TStart = 0.0_ReKi + CLSettings%ProgInfo = ProgInfo ! Driver info + + ! Set some CLFlags to null/default values + CLFlags%DvrIptFile = .FALSE. ! Driver input filename given as command line argument + CLFlags%SlDIptFile = .FALSE. ! InflowWind input filename given as command line argument + CLFlags%TStart = .FALSE. ! specified time to start at + CLFlags%StiffMatOut = .FALSE. ! stiffness matrix output at start and end + CLFlags%NumTimeSteps = .FALSE. ! specified a number of timesteps + CLFlags%NumTimeStepsDefault = .FALSE. ! specified 'DEFAULT' for number of timesteps + CLFlags%DT = .FALSE. ! specified a resolution in time + CLFlags%DTDefault = .FALSE. ! specified 'DEFAULT' for resolution in time + CLFlags%Verbose = .FALSE. ! Turn on verbose error reporting? + CLFlags%VVerbose = .FALSE. ! Turn on very verbose error reporting? + +end subroutine InitSettingsFlags + !-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- !> This subroutine retrieves the command line arguments and passes them to the !! SoilDyn_driver_subs::parsearg routine for processing. SUBROUTINE RetrieveArgs( CLSettings, CLFlags, ErrStat, ErrMsg ) - - USE NWTC_Library - USE SoilDyn_Driver_Types - - IMPLICIT NONE - ! Storing the arguments - TYPE( SlDDriver_Flags ), INTENT( OUT) :: CLFlags !< Flags indicating which command line arguments were specified - TYPE( SlDDriver_Settings ), INTENT( OUT) :: CLSettings !< Command line arguments passed in - - ! Error Handling - INTEGER(IntKi), INTENT( OUT) :: ErrStat - CHARACTER(*), INTENT( OUT) :: ErrMsg - - ! Local variable IF ( CLFlags%Summarys - INTEGER(IntKi) :: i !< Generic counter - CHARACTER(1024) :: Arg !< argument given - CHARACTER(1024) :: ArgUC !< Upper case argument to check - INTEGER(IntKi) :: NumInputArgs !< Number of argements passed in from command line - LOGICAL :: sldFlag !< The -sld flag was set - CHARACTER(1024) :: FileName !< Filename from the command line. - LOGICAL :: FileNameGiven !< Flag indicating if a filename was given. - - INTEGER(IntKi) :: ErrStatTmp !< Temporary error status (for calls) - CHARACTER(1024) :: ErrMsgTmp !< Temporary error message (for calls) - + type( SlDDriver_Flags ), intent( out) :: CLFlags !< Flags indicating which command line arguments were specified + type( SlDDriver_Settings ), intent( out) :: CLSettings !< Command line arguments passed in + integer(IntKi), intent( out) :: ErrStat + CHARACTER(*), intent( out) :: ErrMsg + + ! Local variable + integer(IntKi) :: i !< Generic counter + character(1024) :: Arg !< argument given + character(1024) :: ArgUC !< Upper case argument to check + integer(IntKi) :: NumInputArgs !< Number of argements passed in from command line + logical :: sldFlag !< The -sld flag was set + character(1024) :: FileName !< Filename from the command line. + logical :: FileNameGiven !< Flag indicating if a filename was given. + integer(IntKi) :: ErrStatTmp !< Temporary error status (for calls) + character(1024) :: ErrMsgTmp !< Temporary error message (for calls) ! initialize some things CLFlags%DvrIptFile = .FALSE. - ErrStat = ErrID_None - ErrStatTmp = ErrID_None - ErrMsg = '' - ErrMsgTmp = '' - sldFlag = .FALSE. - FileNameGiven = .FALSE. - FileName = '' - + ErrStat = ErrID_None + ErrStatTmp = ErrID_None + ErrMsg = '' + ErrMsgTmp = '' + sldFlag = .FALSE. + FileNameGiven = .FALSE. + FileName = '' ! Check how many arguments are passed in NumInputArgs = COMMAND_ARGUMENT_COUNT() @@ -133,13 +137,12 @@ SUBROUTINE RetrieveArgs( CLSettings, CLFlags, ErrStat, ErrMsg ) ! convert to uppercase CALL Conv2UC( ArgUC ) - ! Check to see if it is a control parameter or the filename IF ( INDEX( SwChar, ArgUC(1:1) ) > 0 ) THEN ! check to see if we asked for help IF ( ArgUC(2:5) == "HELP" ) THEN - CALL DispHelpText( ErrStat, ErrMsg ) + CALL DispHelpText() CALL ProgExit(0) ENDIF @@ -190,23 +193,12 @@ SUBROUTINE RetrieveArgs( CLSettings, CLFlags, ErrStat, ErrMsg ) !------------------------------------------------------------------------------- + !> Convert a string to a real number FUNCTION StringToReal( StringIn, ErrStat ) - !-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-! - ! Convert a string to a real number ! - !-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-! - - IMPLICIT NONE - - ! Error Handling INTEGER(IntKi), INTENT( OUT) :: ErrStat - - ! Input CHARACTER(*), INTENT(IN ) :: StringIn - ! Returned value REAL(ReKi) :: StringToReal - - ! Local Variables INTEGER(IntKi) :: ErrStatTmp ! Temporary variable to hold the error status read( StringIn, *, iostat=ErrStatTmp) StringToReal @@ -284,7 +276,7 @@ SUBROUTINE ParseArg( CLSettings, CLFlags, ThisArgUC, ThisArg, sldFlagSet, ErrSta ! If no delimeters were given, than this option is simply a flag IF ( Delim1 == 0_IntKi ) THEN ! check to see if the filename is the name of the SlD input file - IF ( ThisArgUC(1:3) == "IFW" ) THEN + IF ( ThisArgUC(1:3) == "SLD" ) THEN sldFlagSet = .TRUE. ! More logic in the routine that calls this one to set things. RETURN ELSEIF ( ThisArgUC(1:2) == "VV" ) THEN @@ -403,7 +395,6 @@ SUBROUTINE ReadDvrIptFile( DvrFileName, DvrFlags, DvrSettings, ProgInfo, ErrStat REAL(ReKi) :: TmpRealAr3(3) ! Temporary array for reading in a pair of real values from the input file REAL(ReKi) :: GridCtrCoord(3) ! Center coordinate of the grid read in - ! Local error handling INTEGER(IntKi) :: ios !< I/O status INTEGER(IntKi) :: ErrStatTmp !< Temporary error status for calls @@ -425,7 +416,7 @@ SUBROUTINE ReadDvrIptFile( DvrFileName, DvrFlags, DvrSettings, ProgInfo, ErrStat ENDIF - CALL WrScr( 'Opening SoilDyn Driver input file: '//FileName ) + CALL WrScr( 'Opening SoilDyn Driver input file: '//trim(FileName) ) !------------------------------------------------------------------------------------------------- @@ -436,6 +427,9 @@ SUBROUTINE ReadDvrIptFile( DvrFileName, DvrFlags, DvrSettings, ProgInfo, ErrStat if (Failed()) return CALL ReadCom( UnIn, FileName, 'SoilDyn Driver input file header line 2', ErrStatTmp, ErrMsgTmp ) + if (Failed()) return + + CALL ReadCom( UnIn, FileName, 'SoilDyn Driver input file seperator line', ErrStatTmp, ErrMsgTmp ) if (Failed()) return ! Echo Input Files. @@ -461,6 +455,9 @@ SUBROUTINE ReadDvrIptFile( DvrFileName, DvrFlags, DvrSettings, ProgInfo, ErrStat if (Failed()) return CALL ReadCom( UnIn, FileName, 'SoilDyn Driver input file header line 2', ErrStatTmp, ErrMsgTmp, UnEchoLocal ) + if (Failed()) return + + CALL ReadCom( UnIn, FileName, 'SoilDyn Driver input file seperator line', ErrStatTmp, ErrMsgTmp, UnEchoLocal ) if (Failed()) return ! Echo Input Files. @@ -487,29 +484,6 @@ SUBROUTINE ReadDvrIptFile( DvrFileName, DvrFlags, DvrSettings, ProgInfo, ErrStat DvrFlags%SlDIptFile = .TRUE. endif - ! Number of timesteps - CALL ReadVar( UnIn, FileName,NumTimeStepsChr,'NumTimeStepsChr',' Character string for number of timesteps to read.', & - ErrStatTmp,ErrMsgTmp, UnEchoLocal ) - if (Failed()) return - - ! Check if we asked for the DEFAULT (use what is in the file) - CALL Conv2UC( NumTimeStepsChr ) - IF ( TRIM(NumTimeStepsChr) == 'DEFAULT' ) THEN ! we asked for the default value - DvrFlags%NumTimeSteps = .TRUE. - DvrFlags%NumTimeStepsDefault = .TRUE. ! This flag tells us to use the inflow wind file values - ELSE - ! We probably have a number if it isn't 'DEFAULT', so do an internal read and check to - ! make sure that it was appropriately interpretted. - READ (NumTimeStepsChr,*,IOSTAT=IOS) DvrSettings%NumTimeSteps - IF ( IOS /= 0 ) THEN ! problem in the read, so parse the error. - CALL CheckIOS ( IOS, '', 'NumTimeSteps',NumType, ErrStatTmp, ErrMsgTmp ) - if (Failed()) return - ELSE ! Was ok, so set the flags - DvrFlags%NumTimeSteps = .TRUE. - DvrFlags%NumTimeStepsDefault = .FALSE. - ENDIF - ENDIF - ! TStart -- start time CALL ReadVar( UnIn, FileName,DvrSettings%TStart,'TStart',' Time in wind file to start parsing.', & @@ -521,15 +495,6 @@ SUBROUTINE ReadDvrIptFile( DvrFileName, DvrFlags, DvrSettings, ProgInfo, ErrStat endif - !------------------------------------------------------------------------------------------------- - ! SoilDyn setup section - !------------------------------------------------------------------------------------------------- - - ! Header - CALL ReadCom( UnIn, FileName,' SoilDyn setup section, comment line', ErrStatTmp, ErrMsgTmp, UnEchoLocal ) - if (Failed()) return - - ! DT -- Timestep size for the driver to take (or DEFAULT for what the file contains) CALL ReadVar( UnIn, FileName,DTChr,'DTChr',' Character string for Timestep size for the driver to take (or DEFAULT for what the file contains).', & ErrStatTmp,ErrMsgTmp, UnEchoLocal ) @@ -554,6 +519,40 @@ SUBROUTINE ReadDvrIptFile( DvrFileName, DvrFlags, DvrSettings, ProgInfo, ErrStat ENDIF + ! Number of timesteps + CALL ReadVar( UnIn, FileName,NumTimeStepsChr,'NumTimeStepsChr',' Character string for number of timesteps to read.', & + ErrStatTmp,ErrMsgTmp, UnEchoLocal ) + if (Failed()) return + + ! Check if we asked for the DEFAULT (use what is in the file) + CALL Conv2UC( NumTimeStepsChr ) + IF ( TRIM(NumTimeStepsChr) == 'DEFAULT' ) THEN ! we asked for the default value + DvrFlags%NumTimeSteps = .TRUE. + DvrFlags%NumTimeStepsDefault = .TRUE. ! This flag tells us to use the inflow wind file values + ELSE + ! We probably have a number if it isn't 'DEFAULT', so do an internal read and check to + ! make sure that it was appropriately interpretted. + READ (NumTimeStepsChr,*,IOSTAT=IOS) DvrSettings%NumTimeSteps + IF ( IOS /= 0 ) THEN ! problem in the read, so parse the error. + CALL CheckIOS ( IOS, '', 'NumTimeSteps',NumType, ErrStatTmp, ErrMsgTmp ) + if (Failed()) return + ELSE ! Was ok, so set the flags + DvrFlags%NumTimeSteps = .TRUE. + DvrFlags%NumTimeStepsDefault = .FALSE. + ENDIF + ENDIF + + + ! Stiffness matrix + CALL ReadVar( UnIn, FileName,DvrFlags%StiffMatOut,'StiffMatOut',' Output stiffness matrices at start and end', & + ErrStatTmp,ErrMsgTmp, UnEchoLocal ) + if (Failed()) return + + + !------------------------------------------------------------------------------------------------- + ! SoilDyn time series input + !------------------------------------------------------------------------------------------------- +!FIXME: add these ! Close the echo and input file CALL CleanupEchoFile( EchoFileContents, UnEchoLocal ) CLOSE( UnIn ) @@ -563,7 +562,7 @@ SUBROUTINE ReadDvrIptFile( DvrFileName, DvrFlags, DvrSettings, ProgInfo, ErrStat !> Set error status, close stuff, and return logical function Failed() - CALL SetErrStat(ErrID_Fatal,ErrMsgTmp,ErrStat,ErrMsg,'ReadDvrIptFile') + CALL SetErrStat(ErrStatTmp,ErrMsgTmp,ErrStat,ErrMsg,'ReadDvrIptFile') if (ErrStat >= AbortErrLev) then CALL CleanupEchoFile( EchoFileContents, UnEchoLocal ) CLOSE( UnIn ) @@ -673,6 +672,7 @@ SUBROUTINE UpdateSettingsWithCL( DvrFlags, DvrSettings, CLFlags, CLSettings, DVR ENDIF +!FIXME: remove this after parsing rest of input file. ! If no DT value has been set (DEFAULT requested), we need to set a default to pass into SlD IF ( .NOT. DvrFlags%DT ) THEN DvrSettings%DT = 0.025_DbKi ! This value gets passed into the SlD_Init routine, so something must be set. @@ -682,634 +682,6 @@ SUBROUTINE UpdateSettingsWithCL( DvrFlags, DvrSettings, CLFlags, CLSettings, DVR END SUBROUTINE UpdateSettingsWithCL -!!!SUBROUTINE ReadPointsFile( PointsFileName, CoordList, ErrStat, ErrMsg ) -!!! -!!! CHARACTER(1024), INTENT(IN ) :: PointsFileName !< Name of the points file to read -!!! REAL(ReKi), ALLOCATABLE, INTENT( OUT) :: CoordList(:,:) !< The coordinates we read in -!!! INTEGER(IntKi), INTENT( OUT) :: ErrStat !< The error status -!!! CHARACTER(*), INTENT( OUT) :: ErrMsg !< The message for the status -!!! -!!! ! Local variables -!!! CHARACTER(1024) :: ErrMsgTmp !< Temporary error message for calls -!!! INTEGER(IntKi) :: ErrStatTmp !< Temporary error status for calls -!!! INTEGER(IntKi) :: FiUnitPoints !< Unit number for points file to open -!!! -!!! INTEGER(IntKi) :: NumDataColumns !< Number of data columns -!!! INTEGER(IntKi) :: NumDataPoints !< Number of lines of data (one point per line) -!!! INTEGER(IntKi) :: NumHeaderLines !< Number of header lines to ignore -!!! -!!! INTEGER(IntKi) :: I !< Generic counter -!!! -!!! ! Initialization of subroutine -!!! ErrMsg = '' -!!! ErrMsgTmp = '' -!!! ErrStat = ErrID_None -!!! ErrStatTmp = ErrID_None -!!! -!!! -!!! ! Now open file -!!! CALL GetNewUnit( FiUnitPoints ) -!!! CALL OpenFInpFile( FiUnitPoints, TRIM(PointsFileName), ErrStatTmp, ErrMsgTmp ) ! Unformatted input file -!!! IF ( ErrStatTmp >= AbortErrLev ) THEN -!!! CALL SetErrStat( ErrStatTmp, ErrMsgTmp, ErrStat, ErrMsg, 'ReadPointsFile') -!!! CLOSE( FiUnitPoints ) -!!! RETURN -!!! ENDIF -!!! -!!! ! Find out how long the file is -!!! CALL GetFileLength( FiUnitPoints, PointsFileName, NumDataColumns, NumDataPoints, NumHeaderLines, ErrMsgTmp, ErrStatTmp ) -!!! IF ( ErrStatTmp >= AbortErrLev ) THEN -!!! CALL SetErrStat( ErrStatTmp, ErrMsgTmp, ErrStat, ErrMsg, 'ReadPointsFile') -!!! CLOSE( FiUnitPoints ) -!!! RETURN -!!! ENDIF -!!! IF ( NumDataColumns /= 3 ) THEN -!!! CALL SetErrStat( ErrID_Fatal,' Expecting three columns in '//TRIM(PointsFileName)//' corresponding to '// & -!!! 'X, Y, and Z coordinates. Instead found '//TRIM(Num2LStr(NumDataColumns))//'.', & -!!! ErrStat, ErrMsg, 'ReadPointsFile') -!!! CLOSE( FiUnitPoints ) -!!! RETURN -!!! ENDIF -!!! -!!! -!!! ! Allocate the storage for the data -!!! CALL AllocAry( CoordList, 3, NumDataPoints, "Array of Points data", ErrStatTmp, ErrMsgTmp ) -!!! IF ( ErrStatTmp >= AbortErrLev ) THEN -!!! CALL SetErrStat( ErrStatTmp, ErrMsgTmp, ErrStat, ErrMsg, 'ReadPointsFile') -!!! CLOSE( FiUnitPoints ) -!!! RETURN -!!! ENDIF -!!! -!!! -!!! ! Read in the headers and throw them away -!!! DO I=1,NumHeaderLines -!!! CALL ReadCom( FiUnitPoints, PointsFileName,' Points file header line', ErrStatTmp, ErrMsgTmp ) -!!! IF ( ErrStatTmp /= ErrID_None ) THEN -!!! CALL SetErrStat(ErrID_Fatal,ErrMsgTmp,ErrStat,ErrMsg,'ReadPointsFile') -!!! CLOSE( FiUnitPoints ) -!!! RETURN -!!! ENDIF -!!! ENDDO -!!! -!!! ! Read in the datapoints -!!! DO I=1,NumDataPoints -!!! CALL ReadAry ( FiUnitPoints, PointsFileName, CoordList(:,I), 3, 'CoordList', & -!!! 'Coordinate point from Points file', ErrStatTmp, ErrMsgTmp) -!!! IF ( ErrStat /= ErrID_None ) THEN -!!! CALL SetErrStat( ErrID_Fatal,ErrMsgTmp,ErrStat,ErrMsg,'ReadPointsFile') -!!! CLOSE( FiUnitPoints ) -!!! RETURN -!!! ENDIF -!!! ENDDO -!!! -!!! CLOSE( FiUnitPoints ) -!!! -!!!CONTAINS -!!! -!!! !------------------------------------------------------------------------------------------------------------------------------- -!!! !> This subroutine looks at a file that has been opened and finds out how many header lines there are, how many columns there -!!! !! are, and how many lines of data there are in the file. -!!! !! -!!! !! A few things are assumed about the file: -!!! !! 1. Any header lines are the first thing in the file. -!!! !! 2. No text appears anyplace other than in first part of the file -!!! !! 3. The datalines only contain numbers that can be read in as reals. -!!! !! -!!! !! Limitations: -!!! !! 1. only handles up to 20 words (columns) on a line -!!! !! 2. empty lines are considered text lines -!!! !! 3. All data rows must contain the same number of columns -!!! !! -!!! !! -!!! SUBROUTINE GetFileLength(UnitDataFile, DataFileName, NumDataColumns, NumDataLines, NumHeaderLines, ErrMsg, ErrStat) -!!! -!!! IMPLICIT NONE -!!! -!!! ! Passed variables -!!! INTEGER(IntKi), INTENT(IN ) :: UnitDataFile !< Unit number of the file we are looking at. -!!! CHARACTER(*), INTENT(IN ) :: DataFileName !< The name of the file we are looking at. -!!! INTEGER(IntKi), INTENT( OUT) :: NumDataColumns !< The number of columns in the data file. -!!! INTEGER(IntKi), INTENT( OUT) :: NumDataLines !< Number of lines containing data -!!! INTEGER(IntKi), INTENT( OUT) :: NumHeaderLines !< Number of header lines at the start of the file -!!! CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error Message to return (empty if all good) -!!! INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Status flag if there were any problems (ErrID_None if all good) -!!! -!!! ! Local Variables -!!! CHARACTER(2048) :: ErrMsgTmp !< Temporary message variable. Used in calls. -!!! INTEGER(IntKi) :: ErrStatTmp !< Temporary error status. Used in calls. -!!! INTEGER(IntKi) :: LclErrStat !< Temporary error status. Used locally to indicate when we have reached the end of the file. -!!! INTEGER(IntKi) :: TmpIOErrStat !< Temporary error status for the internal read of the first word to a real number -!!! LOGICAL :: IsRealNum !< Flag indicating if the first word on the line was a real number -!!! -!!! CHARACTER(1024) :: TextLine !< One line of text read from the file -!!! INTEGER(IntKi) :: LineLen !< The length of the line read in -!!! CHARACTER(1024) :: StrRead !< String containing the first word read in -!!! REAL(ReKi) :: RealRead !< Returns value of the number (if there was one), or NaN (as set by NWTC_Num) if there wasn't -!!! CHARACTER(1024) :: VarName !< Name of the variable we are trying to read from the file -!!! CHARACTER(24) :: Words(20) !< Array of words we extract from a line. We shouldn't have more than 20. -!!! INTEGER(IntKi) :: i,j,k !< simple integer counters -!!! INTEGER(IntKi) :: LineNumber !< the line I am on -!!! LOGICAL :: LineHasText !< Flag indicating if the line I just read has text. If so, it is a header line. -!!! LOGICAL :: HaveReadData !< Flag indicating if I have started reading data. -!!! INTEGER(IntKi) :: NumWords !< Number of words on a line -!!! INTEGER(IntKi) :: FirstDataLineNum !< Line number of the first row of data in the file -!!! -!!! -!!! ! Initialize the error handling -!!! ErrStat = ErrID_None -!!! ErrStatTmp = ErrID_None -!!! LclErrStat = ErrID_None -!!! ErrMsg = '' -!!! ErrMsgTmp = '' -!!! -!!! -!!! ! Set some of the flags and counters -!!! HaveReadData = .FALSE. -!!! NumDataColumns = 0 -!!! NumHeaderLines = 0 -!!! NumDataLines = 0 -!!! LineNumber = 0 -!!! -!!! -!!! ! Just in case we were handed a file that we are part way through reading (should never be true), rewind to the start -!!! -!!! REWIND( UnitDataFile ) -!!! -!!! -!!! !------------------------------------ -!!! !> The variable LclErrStat is used to indicate when we have reached the end of the file or had an error from -!!! !! ReadLine. Until that occurs, we read each line, and decide if it contained any non-numeric data. The -!!! !! first group of lines containing non-numeric data is considered the header. The first line of all numeric -!!! !! data is considered the start of the data section. Any non-numeric containing found within the data section -!!! !! will be considered as an invalid file format at which point we will return a fatal error from this routine. -!!! -!!! DO WHILE ( LclErrStat == ErrID_None ) -!!! -!!! !> Reset the indicator flag for the non-numeric content -!!! LineHasText = .FALSE. -!!! -!!! !> Read in a single line from the file -!!! CALL ReadLine( UnitDataFile, '', TextLine, LineLen, LclErrStat ) -!!! -!!! !> If there was an error in reading the file, then exit. -!!! !! Possible causes: reading beyond end of file in which case we are done so don't process it. -!!! IF ( LclErrStat /= ErrID_None ) EXIT -!!! -!!! !> Increment the line counter. -!!! LineNumber = LineNumber + 1 -!!! -!!! !> Read all the words on the line into the array called 'Words'. Only the first words will be encountered -!!! !! will be stored. The others are empty (i.e. only three words on the line, so the remaining 17 are empty). -!!! CALL GetWords( TextLine, Words, 20 ) -!!! -!!! !> Cycle through and count how many are not empty. Once an empty value is encountered, all the rest should -!!! !! be empty if GetWords worked correctly. The index of the last non-empty value is stored. -!!! DO i=1,20 -!!! IF (TRIM(Words(i)) .ne. '') NumWords=i -!!! ENDDO -!!! -!!! -!!! !> Now cycle through the first 'NumWords' of non-empty values stored in 'Words'. Words should contain -!!! !! everything that is one the line. The subroutine ReadRealNumberFromString will set a flag 'IsRealNum' -!!! !! when the value in Words(i) can be read as a real(ReKi). 'StrRead' will contain the string equivalent. -!!! DO i=1,NumWords -!!! CALL ReadRealNumberFromString( Words(i), RealRead, StrRead, IsRealNum, ErrStatTmp, ErrMsgTmp, TmpIOErrStat ) -!!! IF ( .NOT. IsRealNum) THEN -!!! LineHasText = .TRUE. -!!! ENDIF -!!! ENDDO -!!! -!!! !> If all the words on that line had no text in them, then it must have been a line of data. -!!! !! If not, then we have either a header line, which is ok, or a line containing text in the middle of the -!!! !! the data section, which is not good (the flag HaveReadData tells us which case this is). -!!! IF ( LineHasText ) THEN -!!! IF ( HaveReadData ) THEN ! Uh oh, we have already read a line of data before now, so there is a problem -!!! CALL SetErrStat( ErrID_Fatal, ' Found text on line '//TRIM(Num2LStr(LineNumber))//' of '//TRIM(DataFileName)// & -!!! ' when real numbers were expected. There may be a problem with format of the file: '// & -!!! TRIM(DataFileName)//'.', ErrStat, ErrMsg, 'GetFileLength') -!!! IF ( ErrStat >= AbortErrLev ) THEN -!!! RETURN -!!! ENDIF -!!! ELSE -!!! NumHeaderLines = NumHeaderLines + 1 -!!! ENDIF -!!! ELSE ! No text, must be data line -!!! NumDataLines = NumDataLines + 1 -!!! ! If this is the first row of data, then store the number of words that were on the line -!!! IF ( .NOT. HaveReadData ) THEN -!!! ! If this is the first line of data, keep some relevant info about it and the number of columns in it -!!! HaveReadData = .TRUE. -!!! FirstDataLineNum = LineNumber ! Keep the line number of the first row of data (for error reporting) -!!! NumDataColumns = NumWords -!!! ELSE -!!! ! Make sure that the number columns on the row matches the number of columnns on the first row of data. -!!! IF ( NumWords /= NumDataColumns ) THEN -!!! CALL SetErrStat( ErrID_Fatal, ' Error in file: '//TRIM(DataFileName)//'.'// & -!!! ' The number of data columns on line '//TRIM(Num2LStr(LineNumber))// & -!!! '('//TRIM(Num2LStr(NumWords))//' columns) is different than the number of columns on first row of data '// & -!!! ' (line: '//TRIM(Num2LStr(FirstDataLineNum))//', '//TRIM(Num2LStr(NumDataColumns))//' columns).', & -!!! ErrStat, ErrMsg, 'GetFileLength') -!!! IF ( ErrStat >= AbortErrLev ) THEN -!!! RETURN -!!! ENDIF -!!! ENDIF -!!! ENDIF -!!! ENDIF -!!! -!!! ENDDO -!!! -!!! -!!! REWIND( UnitDataFile ) -!!! -!!! END SUBROUTINE GetFileLength -!!! -!!! !------------------------------------------------------------------------------- -!!! !> This subroutine takes a line of text that is passed in and reads the first -!!! !! word to see if it is a number. An internal read is used to do this. If -!!! !! it is a number, it is started in ValueRead and returned. The flag IsRealNum -!!! !! is set to true. Otherwise, ValueRead is set to NaN (value from the NWTC_Num) -!!! !! and the flag is set to false. -!!! !! -!!! !! The IsRealNum flag is set to indicate if we actually have a real number or -!!! !! not. After calling this routine, a simple if statement can be used: -!!! !! -!!! !! @code -!!! !! IF (IsRealNum) THEN -!!! !! ! do something -!!! !! ELSE -!!! !! ! do something else -!!! !! ENDIF -!!! !! @endcode -!!! !! -!!! !------------------------------------------------------------------------------- -!!! SUBROUTINE ReadRealNumberFromString(StringToParse, ValueRead, StrRead, IsRealNum, ErrStat, ErrMsg, IOErrStat) -!!! -!!! CHARACTER(*), INTENT(IN ) :: StringToParse !< The string we were handed. -!!! REAL(ReKi), INTENT( OUT) :: ValueRead !< The variable being read. Returns as NaN (library defined) if not a Real. -!!! CHARACTER(*), INTENT( OUT) :: StrRead !< A string containing what was read from the ReadNum routine. -!!! LOGICAL, INTENT( OUT) :: IsRealNum !< Flag indicating if we successfully read a Real -!!! INTEGER(IntKi), INTENT( OUT) :: ErrStat !< ErrID level returned from ReadNum -!!! CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message including message from ReadNum -!!! INTEGER(IntKi), INTENT( OUT) :: IOErrStat !< Error status from the internal read. Useful for diagnostics. -!!! -!!! -!!! -!!! ! Initialize some things -!!! ErrStat = ErrID_None -!!! ErrMsg = '' -!!! -!!! -!!! ! ReadNum returns a string contained in StrRead. So, we now try to do an internal read to VarRead and then trap errors. -!!! read(StringToParse,*,IOSTAT=IOErrStat) StrRead -!!! read(StringToParse,*,IOSTAT=IOErrStat) ValueRead -!!! -!!! -!!! ! If IOErrStat==0, then we have a real number, anything else is a problem. -!!! if (IOErrStat==0) then -!!! IsRealNum = .TRUE. -!!! else -!!! IsRealNum = .FALSE. -!!! ValueRead = NaN ! This is NaN as defined in the NWTC_Num. -!!! ErrMsg = 'Not a real number. '//TRIM(ErrMsgTmp)//NewLine -!!! ErrSTat = ErrID_Severe -!!! endif -!!! -!!! -!!! -!!! RETURN -!!! END SUBROUTINE ReadRealNumberFromString -!!! -!!! -!!! !------------------------------------------------------------------------------------------------------------------------------- -!!! !------------------------------------------------------------------------------- -!!! !> This subroutine works with the ReadNum routine from the library. ReadNum is -!!! !! called to read a word from the input file. An internal read is then done to -!!! !! convert the string to a number that is stored in VarRead and returned. -!!! !! -!!! !! The IsRealNum flag is set to indicate if we actually have a real number or -!!! !! not. After calling this routine, a simple if statement can be used: -!!! !! -!!! !! @code -!!! !! IF (ISRealNum) THEN -!!! !! ! do something -!!! !! ELSE -!!! !! ! do something else -!!! !! ENDIF -!!! !! @endcode -!!! !! -!!! !------------------------------------------------------------------------------- -!!! SUBROUTINE ReadRealNumber(UnitNum, FileName, VarName, VarRead, StrRead, IsRealNum, ErrStat, ErrMsg, IOErrStat) -!!! -!!! INTEGER(IntKi), INTENT(IN ) :: UnitNum !< The unit number of the file being read -!!! CHARACTER(*), INTENT(IN ) :: FileName !< The name of the file being read. Used in the ErrMsg from ReadNum (Library routine). -!!! CHARACTER(*), INTENT(IN ) :: VarName !< The variable we are reading. Used in the ErrMsg from ReadNum (Library routine)'. -!!! REAL(ReKi), INTENT( OUT) :: VarRead !< The variable being read. Returns as NaN (library defined) if not a Real. -!!! CHARACTER(*), INTENT( OUT) :: StrRead !< A string containing what was read from the ReadNum routine. -!!! LOGICAL, INTENT( OUT) :: IsRealNum !< Flag indicating if we successfully read a Real -!!! INTEGER(IntKi), INTENT( OUT) :: ErrStat !< ErrID level returned from ReadNum -!!! CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message including message from ReadNum -!!! INTEGER(IntKi), INTENT( OUT) :: IOErrStat !< Error status from the internal read. Useful for diagnostics. -!!! -!!! ! Local vars -!!! INTEGER(IntKi) :: ErrStatTmp -!!! CHARACTER(2048) :: ErrMsgTmp -!!! -!!! -!!! -!!! ! Initialize some things -!!! ErrStat = ErrID_None -!!! ErrMsg = '' -!!! -!!! -!!! ! Now call the ReadNum routine to get the number -!!! ! If it is a word that does not start with T or F, then ReadNum won't give any errors. -!!! CALL ReadNum( UnitNum, FileName, StrRead, VarName, ErrStatTmp, ErrMsgTmp) -!!! -!!! -!!! ! ReadNum returns a string contained in StrRead. So, we now try to do an internal read to VarRead and then trap errors. -!!! read(StrRead,*,IOSTAT=IOErrStat) VarRead -!!! -!!! -!!! ! If IOErrStat==0, then we have a real number, anything else is a problem. -!!! if (IOErrStat==0) then -!!! IsRealNum = .TRUE. -!!! else -!!! IsRealNum = .FALSE. -!!! VarRead = NaN ! This is NaN as defined in the NWTC_Num. -!!! ErrMsg = 'Not a real number. '//TRIM(ErrMsgTmp)//NewLine -!!! ErrStat = ErrStatTmp ! The ErrStatTmp returned by the ReadNum routine is an ErrID level. -!!! endif -!!! -!!! -!!! -!!! RETURN -!!! END SUBROUTINE ReadRealNumber -!!! -!!! -!!!END SUBROUTINE ReadPointsFile - - - -!!!SUBROUTINE WindGridMessage( Settings, ToFile, Msg, MsgLen ) -!!! -!!! TYPE(SlDDriver_Settings), INTENT(IN ) :: Settings -!!! LOGICAL, INTENT(IN ) :: ToFile !< Prepend comment character -!!! CHARACTER(2048), INTENT( OUT) :: Msg -!!! INTEGER(IntKi), INTENT( OUT) :: MsgLen -!!! -!!! ! Local Variables -!!! CHARACTER(11) :: TmpNumString -!!! INTEGER(IntKi) :: ErrStatTmp -!!! -!!! Msg = '' -!!! -!!! IF ( ToFile ) THEN -!!! Msg='# ' -!!! ELSE -!!! Msg="Requested wind grid data will be written to "//TRIM(Settings%WindGridOutputName)//'.' -!!! ENDIF -!!! Msg = TRIM(Msg)//" Requested data:"//NewLine -!!! -!!! ! Header info: -!!! Msg = TRIM(Msg) -!!! IF ( ToFile ) Msg=TRIM(Msg)//'#' -!!! Msg = TRIM(Msg)//" Dimension Range Stepsize Num. points"//NewLine -!!! IF ( ToFile ) Msg=TRIM(Msg)//'#' -!!! Msg = TRIM(Msg)//" -------------------------------------------------------------------"//NewLine -!!! ! X direction -!!! WRITE(TmpNumString,'(f7.2)',IOSTAT=ErrStatTmp) Settings%XRange(1) -!!! IF ( ToFile ) THEN -!!! Msg= TRIM(Msg)//"# X" -!!! ELSE -!!! Msg= TRIM(Msg)//" X" -!!! ENDIF -!!! MsgLen= LEN_TRIM(Msg) -!!! Msg = Msg(1:MsgLen)//" "//TmpNumString(1:10) -!!! MsgLen= MsgLen+7+10 -!!! -!!! WRITE(TmpNumString,'(f7.2)',IOSTAT=ErrStatTmp) Settings%XRange(2) -!!! Msg = Msg(1:MsgLen)//" -> "//TmpNumString(1:10) -!!! MsgLen= MsgLen+4+10 -!!! -!!! WRITE(TmpNumString,'(f7.2)',IOSTAT=ErrStatTmp) Settings%GridDelta(1) -!!! Msg = Msg(1:MsgLen)//" "//TmpNumString(1:10) -!!! MsgLen= MsgLen+4+10 -!!! -!!! WRITE(TmpNumString,'(i6)',IOSTAT=ErrStatTmp) Settings%GridN(1) -!!! Msg = Msg(1:MsgLen)//" "//TmpNumString(1:6)//NewLine -!!! MsgLen= MsgLen+6+6 -!!! -!!! -!!! ! Y direction -!!! WRITE(TmpNumString,'(f7.2)',IOSTAT=ErrStatTmp) Settings%YRange(1) -!!! IF ( ToFile ) THEN -!!! Msg= TRIM(Msg)//"# Y" -!!! ELSE -!!! Msg= TRIM(Msg)//" Y" -!!! ENDIF -!!! MsgLen= LEN_TRIM(Msg) -!!! Msg = Msg(1:MsgLen)//" "//TmpNumString(1:10) -!!! MsgLen= MsgLen+7+10 -!!! -!!! WRITE(TmpNumString,'(f7.2)',IOSTAT=ErrStatTmp) Settings%YRange(2) -!!! Msg = Msg(1:MsgLen)//" -> "//TmpNumString(1:10) -!!! MsgLen= MsgLen+4+10 -!!! -!!! WRITE(TmpNumString,'(f7.2)',IOSTAT=ErrStatTmp) Settings%GridDelta(2) -!!! Msg = Msg(1:MsgLen)//" "//TmpNumString(1:10) -!!! MsgLen= MsgLen+4+10 -!!! -!!! WRITE(TmpNumString,'(i6)',IOSTAT=ErrStatTmp) Settings%GridN(2) -!!! Msg = Msg(1:MsgLen)//" "//TmpNumString(1:6)//NewLine -!!! MsgLen= MsgLen+6+6 -!!! -!!! -!!! ! Z direction -!!! WRITE(TmpNumString,'(f7.2)',IOSTAT=ErrStatTmp) Settings%ZRange(1) -!!! IF ( ToFile ) THEN -!!! Msg= TRIM(Msg)//"# Z" -!!! ELSE -!!! Msg= TRIM(Msg)//" Z" -!!! ENDIF -!!! MsgLen= LEN_TRIM(Msg) -!!! Msg = Msg(1:MsgLen)//" "//TmpNumString(1:10) -!!! MsgLen= MsgLen+7+10 -!!! -!!! WRITE(TmpNumString,'(f7.2)',IOSTAT=ErrStatTmp) Settings%ZRange(2) -!!! Msg = Msg(1:MsgLen)//" -> "//TmpNumString(1:10) -!!! MsgLen= MsgLen+4+10 -!!! -!!! WRITE(TmpNumString,'(f7.2)',IOSTAT=ErrStatTmp) Settings%GridDelta(3) -!!! Msg = Msg(1:MsgLen)//" "//TmpNumString(1:10) -!!! MsgLen= MsgLen+4+10 -!!! -!!! WRITE(TmpNumString,'(i6)',IOSTAT=ErrStatTmp) Settings%GridN(3) -!!! Msg = Msg(1:MsgLen)//" "//TmpNumString(1:6)//NewLine -!!! MsgLen= MsgLen+6+6 -!!! -!!! -!!! ! T direction -!!! WRITE(TmpNumString,'(f10.4)',IOSTAT=ErrStatTmp) Settings%TStart -!!! IF ( ToFile ) THEN -!!! Msg= TRIM(Msg)//"# T" -!!! ELSE -!!! Msg= TRIM(Msg)//" T" -!!! ENDIF -!!! MsgLen= LEN_TRIM(Msg) -!!! Msg = Msg(1:MsgLen)//" "//TmpNumString(1:11) -!!! MsgLen= MsgLen+7+11 -!!! -!!! WRITE(TmpNumString,'(f10.4)',IOSTAT=ErrStatTmp) Settings%TStart+Settings%DT*Settings%NumTimeSteps -!!! Msg = Msg(1:MsgLen)//"->"//TmpNumString(1:11) -!!! MsgLen= MsgLen+4+11 -!!! -!!! WRITE(TmpNumString,'(f10.4)',IOSTAT=ErrStatTmp) Settings%DT -!!! Msg = Msg(1:MsgLen)//" "//TmpNumString(1:11) -!!! MsgLen= MsgLen+4+11 -!!! -!!! WRITE(TmpNumString,'(i8)',IOSTAT=ErrStatTmp) Settings%NumTimeSteps -!!! Msg = Msg(1:MsgLen)//" "//TmpNumString(1:8) !//NewLine -!!! MsgLen= MsgLen+6+8 -!!! -!!!END SUBROUTINE - - -!!!!> This subroutine outputs the results of the WindGrid calculations information at each timestep. -!!!SUBROUTINE WindGridVel_OutputWrite (FileUnit, FileName, Initialized, Settings, GridXYZ, GridVel, TIME, ErrStat, ErrMsg) -!!! -!!! INTEGER(IntKi), INTENT(INOUT) :: FileUnit !< Unit number for the output file -!!! CHARACTER(*), INTENT(IN ) :: FileName !< Name of the current unit number -!!! LOGICAL, INTENT(INOUT) :: Initialized !< Was this file started before? -!!! TYPE(SlDDriver_Settings), INTENT(IN ) :: Settings !< Settings for SlD driver -!!! REAL(ReKi), ALLOCATABLE, INTENT(IN ) :: GridXYZ(:,:) !< The position grid passed in -!!! REAL(ReKi), ALLOCATABLE, INTENT(IN ) :: GridVel(:,:) !< The velocity grid passed in -!!! REAL(DbKi), INTENT(IN ) :: TIME !< The current time -!!! INTEGER(IntKi), INTENT( OUT) :: ErrStat !< returns a non-zero value when an error occurs -!!! CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None -!!! -!!! ! Temporary local variables -!!! INTEGER(IntKi) :: ErrStatTmp !< Temporary variable for the status of error message -!!! CHARACTER(2048) :: ErrMsgTmp !< Temporary variable for the error message -!!! INTEGER(IntKi) :: LenErrMsgTmp !< Length of ErrMsgTmp (for getting WindGrid info) -!!! -!!! CHARACTER(52) :: WindVelFmt !< Format specifier for the output file for wave elevation series -!!! INTEGER(IntKi) :: I !< generic counter -!!! -!!! -!!! WindVelFmt = "(F14.7,3x,F14.7,3x,F14.7,3x,F14.7,3x,F14.7,3x,F14.7)" -!!! -!!! ErrMsg = '' -!!! ErrStat = ErrID_None -!!! ErrMsgTmp = '' -!!! ErrStatTmp = ErrID_None -!!! -!!! -!!! ! If it hasn't been initially written to, do this then exit. Otherwise set a few things and continue. -!!! IF ( .NOT. Initialized ) THEN -!!! -!!! CALL GetNewUnit( FileUnit ) -!!! CALL OpenFOutFile( FileUnit, TRIM(FileName), ErrStatTmp, ErrMsgTmp ) -!!! CALL SetErrStat( ErrStatTmp, ErrMsgTmp, ErrStat, ErrMsg, 'WindGridVel_OutputWrite' ) -!!! IF ( ErrStat >= AbortErrLev ) RETURN -!!! -!!! Initialized = .TRUE. -!!! -!!! ! Write header section -!!! WRITE( FileUnit,'(A)', IOSTAT=ErrStatTmp ) '## This file was generated by '//TRIM(GetNVD(Settings%ProgInfo))// & -!!! ' on '//CurDate()//' at '//CurTime()//'.' -!!! WRITE( FileUnit,'(A)', IOSTAT=ErrStatTmp ) '## This file contains the wind velocity at a grid of points at each '// & -!!! 'requested timestep' -!!! WRITE (FileUnit,'(A)', IOSTAT=ErrStatTmp ) '## It is arranged as blocks of X,Y,Z,U,V,W at each timestep' -!!! WRITE (FileUnit,'(A)', IOSTAT=ErrStatTmp ) '## Each block is separated by two blank lines for use in gnuplot' -!!! WRITE (FileUnit,'(A)', IOSTAT=ErrStatTmp ) '# ' -!!! CALL WindGridMessage( Settings, .TRUE., ErrMsgTmp, LenErrMsgTmp ) -!!! WRITE (FileUnit,'(A)', IOSTAT=ErrStatTmp ) ErrMsgTmp(1:LenErrMsgTmp) -!!! WRITE (FileUnit,'(A)', IOSTAT=ErrStatTmp ) '# ' -!!! WRITE (FileUnit,'(A)', IOSTAT=ErrStatTmp ) '# ' -!!! WRITE (FileUnit,'(A)', IOSTAT=ErrStatTmp ) '# X Y Z '// & -!!! ' U V W' -!!! WRITE (FileUnit,'(A)', IOSTAT=ErrStatTmp ) '# (m) (m) (m) '// & -!!! ' (m/s) (m/s) (m/s)' -!!! ELSE -!!! -!!! WRITE (FileUnit,'(A)', IOSTAT=ErrStatTmp ) NewLine//NewLine -!!! WRITE (FileUnit,'(A)', IOSTAT=ErrStatTmp ) '# Time: '//TRIM(Num2LStr(TIME)) -!!! -!!! DO I = 1,SIZE(GridXYZ,DIM=2) -!!! -!!! WRITE (FileUnit,WindVelFmt, IOSTAT=ErrStatTmp ) GridXYZ(1,I),GridXYZ(2,I),GridXYZ(3,I),GridVel(1,I),GridVel(2,I),GridVel(3,I) -!!! -!!! ENDDO -!!! -!!! ENDIF -!!! -!!!END SUBROUTINE WindGridVel_OutputWrite -!!! -!!! -!!!SUBROUTINE PointsVel_OutputWrite (FileUnit, FileName, Initialized, Settings, GridXYZ, GridVel, TIME, ErrStat, ErrMsg) -!!! -!!! INTEGER(IntKi), INTENT(INOUT) :: FileUnit !< Unit number for the output file -!!! CHARACTER(*), INTENT(IN ) :: FileName !< Name of the current unit number -!!! LOGICAL, INTENT(INOUT) :: Initialized !< Was this file started before? -!!! TYPE(SlDDriver_Settings), INTENT(IN ) :: Settings !< Settings for SlD driver -!!! REAL(ReKi), ALLOCATABLE, INTENT(IN ) :: GridXYZ(:,:) !< The position grid passed in -!!! REAL(ReKi), ALLOCATABLE, INTENT(IN ) :: GridVel(:,:) !< The velocity grid passed in -!!! REAL(DbKi), INTENT(IN ) :: TIME !< The current time -!!! INTEGER(IntKi), INTENT( OUT) :: ErrStat !< returns a non-zero value when an error occurs -!!! CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None -!!! -!!! ! Temporary local variables -!!! INTEGER(IntKi) :: ErrStatTmp !< Temporary variable for the status of error message -!!! CHARACTER(2048) :: ErrMsgTmp !< Temporary variable for the error message -!!! INTEGER(IntKi) :: LenErrMsgTmp !< Length of ErrMsgTmp (for getting WindGrid info) -!!! INTEGER(IntKi) :: I !< Generic counter -!!! -!!! CHARACTER(61) :: PointsVelFmt !< Format specifier for the output file for wave elevation series -!!! -!!! -!!! PointsVelFmt = "(F14.7,3x,F14.7,3x,F14.7,3x,F14.7,3x,F14.7,3x,F14.7,3x,F14.7)" -!!! -!!! ErrMsg = '' -!!! ErrStat = ErrID_None -!!! ErrMsgTmp = '' -!!! ErrStatTmp = ErrID_None -!!! -!!! -!!! ! If it hasn't been initially written to, do this then exit. Otherwise set a few things and continue. -!!! IF ( .NOT. Initialized ) THEN -!!! -!!! CALL GetNewUnit( FileUnit ) -!!! CALL OpenFOutFile( FileUnit, TRIM(FileName), ErrStatTmp, ErrMsgTmp ) -!!! CALL SetErrStat( ErrStatTmp, ErrMsgTmp, ErrStat, ErrMsg, 'PointsVel_OutputWrite' ) -!!! IF ( ErrStat >= AbortErrLev ) RETURN -!!! -!!! Initialized = .TRUE. -!!! -!!! ! Write header section -!!! WRITE( FileUnit,'(A)', IOSTAT=ErrStatTmp ) '## This file was generated by '//TRIM(GetNVD(Settings%ProgInfo))// & -!!! ' on '//CurDate()//' at '//CurTime()//'.' -!!! WRITE( FileUnit,'(A)', IOSTAT=ErrStatTmp ) '## This file contains the wind velocity at the '// & -!!! TRIM(Num2LStr(SIZE(GridXYZ,DIM=2)))//' points specified in the '// & -!!! 'file '//TRIM(Settings%PointsFileName)//'.' -!!! WRITE (FileUnit,'(A)', IOSTAT=ErrStatTmp ) '# ' -!!! WRITE (FileUnit,'(A)', IOSTAT=ErrStatTmp ) '# T X Y Z '// & -!!! ' U V W' -!!! WRITE (FileUnit,'(A)', IOSTAT=ErrStatTmp ) '# (s) (m) (m) (m) '// & -!!! ' (m/s) (m/s) (m/s)' -!!! ELSE -!!! -!!! DO I = 1,SIZE(GridXYZ,DIM=2) -!!! -!!! WRITE (FileUnit,PointsVelFmt, IOSTAT=ErrStatTmp ) TIME,GridXYZ(1,I),GridXYZ(2,I),GridXYZ(3,I),GridVel(1,I),GridVel(2,I),GridVel(3,I) -!!! -!!! ENDDO -!!! -!!! ENDIF -!!! -!!!END SUBROUTINE PointsVel_OutputWrite - - - !> This routine exists only to support the development of the module. It will not be needed after the module is complete. SUBROUTINE printSettings( DvrFlags, DvrSettings ) @@ -1331,6 +703,9 @@ SUBROUTINE printSettings( DvrFlags, DvrSettings ) ELSE CALL WrScr(' NumTimeSteps: '//FLAG(DvrFlags%NumTimeSteps)// ' '//TRIM(Num2LStr(DvrSettings%NumTimeSteps))) ENDIF + CALL WrScr(' StiffMatOut: '//FLAG(DvrFlags%StiffMatOut)) + CALL WrScr(' Verbose: '//FLAG(DvrFlags%Verbose)) + CALL WrScr(' VVerbose: '//FLAG(DvrFlags%VVerbose)) RETURN END SUBROUTINE printSettings diff --git a/modules/soildyn/src/driver/SoilDyn_Driver_Types.f90 b/modules/soildyn/src/driver/SoilDyn_Driver_Types.f90 index fbe863a58..cff6d44f4 100644 --- a/modules/soildyn/src/driver/SoilDyn_Driver_Types.f90 +++ b/modules/soildyn/src/driver/SoilDyn_Driver_Types.f90 @@ -41,29 +41,12 @@ MODULE SoilDyn_Driver_Types TYPE :: SlDDriver_Flags LOGICAL :: DvrIptFile = .FALSE. !< Was an input file name given on the command line? LOGICAL :: SlDIptFile = .FALSE. !< Was an SoilDyn input file requested? -! LOGICAL :: Summary = .FALSE. !< create a summary at command line? (data extents in the wind file) -! LOGICAL :: SummaryFile = .FALSE. !< create a summary file of the output? LOGICAL :: TStart = .FALSE. !< specified a start time + LOGICAL :: StiffMatOut = .FALSE. !< output stiffness matrices at start and finish LOGICAL :: NumTimeSteps = .FALSE. !< specified a number of timesteps to process LOGICAL :: NumTimeStepsDefault = .FALSE. !< specified a 'DEFAULT' for number of timesteps to process LOGICAL :: DT = .FALSE. !< specified a resolution in time LOGICAL :: DTDefault = .FALSE. !< specified a 'DEFAULT' for the time resolution - -! LOGICAL :: FFTcalc = .FALSE. !< do an FFT - -! LOGICAL :: WindGrid = .FALSE. !< Requested output of wind data on a grid -- input file option only -! LOGICAL :: XRange = .FALSE. !< specified a range of x -- command line option only -- stored as GridCtrCoord and GridDelta -! LOGICAL :: YRange = .FALSE. !< specified a range of y -- command line option only -- stored as GridCtrCoord and GridDelta -! LOGICAL :: ZRange = .FALSE. !< specified a range of z -- command line option only -- stored as GridCtrCoord and GridDelta -! LOGICAL :: Dx = .FALSE. !< specified a resolution in x -- command line option only, 0.0 otherwise -! LOGICAL :: Dy = .FALSE. !< speficied a resolution in y -! LOGICAL :: Dz = .FALSE. !< specified a resolution in z - -! LOGICAL :: PointsFile = .FALSE. !< points filename to read in -- command line option only - -! LOGICAL :: WindGridOutputInit = .FALSE. !< Is the WindGridOut file initialized -! LOGICAL :: PointsOutputInit = .FALSE. !< Is the Points output file initialized -! LOGICAL :: FFTOutputInit = .FALSE. !< Is the FFT output file initialized LOGICAL :: Verbose = .FALSE. !< Verbose error reporting LOGICAL :: VVerbose = .FALSE. !< Very Verbose error reporting END TYPE SlDDriver_Flags @@ -75,29 +58,10 @@ MODULE SoilDyn_Driver_Types CHARACTER(1024) :: SlDIptFileName !< Filename of SoilDyn input file to read (if no driver input file) CHARACTER(1024) :: SummaryFileName !< Filename for the summary information output -! CHARACTER(1024) :: PointsFileName !< Filename of points file to read in -! CHARACTER(1024) :: PointsOutputName !< Filename for output from points read in from points file -! CHARACTER(1024) :: FFTOutputName !< Filename for output from points read in from points file -! CHARACTER(1024) :: WindGridOutputName !< Filename for output from points read in from points file - -! INTEGER(IntKi) :: WindGridOutputUnit !< Unit number for the output file for the wind grid data -! INTEGER(IntKi) :: PointsOutputUnit !< Unit number for the output file for the Points file output -! INTEGER(IntKi) :: FFTOutputUnit !< Unit number for the output file for the FFT results - INTEGER(IntKi) :: NumTimeSteps !< Number of timesteps REAL(DbKi) :: DT !< resolution of time REAL(DbKi) :: TStart !< range of time -- end time converted from TRange (command line option only) - -! REAL(ReKi) :: FFTcoord(1:3) !< (x,y,z) coordinate to do an FFT at -! -! REAL(ReKi) :: GridDelta(1:3) !< (GridDx,GridDy,GridDz) -- grid point spacing -! INTEGER(IntKi) :: GridN(1:3) !< (GridNx,GridNy,GridNz) -- number of grid points -! -! REAL(ReKi) :: XRange(1:2) !< Range in the x-direction for the gridded data -! REAL(ReKi) :: YRange(1:2) !< Range in the y-direction for the gridded data -! REAL(ReKi) :: ZRange(1:2) !< Range in the z-direction for the gridded data - TYPE(ProgDesc) :: ProgInfo !< Program info TYPE(ProgDesc) :: SlDProgInfo !< Program info for SoilDyn From f37ca3997e0f5c4a1907d08b15a02bd027f36952 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 25 Feb 2020 16:01:55 -0700 Subject: [PATCH 035/136] SlD: notes on runmode for REDWIN DLL --- modules/soildyn/src/REDWINinterface.f90 | 6 ++++++ modules/soildyn/src/SoilDyn_Registry.txt | 1 + modules/soildyn/src/SoilDyn_Types.f90 | 7 +++++++ 3 files changed, 14 insertions(+) diff --git a/modules/soildyn/src/REDWINinterface.f90 b/modules/soildyn/src/REDWINinterface.f90 index f34ac0bc8..95af41dbe 100644 --- a/modules/soildyn/src/REDWINinterface.f90 +++ b/modules/soildyn/src/REDWINinterface.f90 @@ -194,6 +194,8 @@ subroutine REDWINinterface_Init( DLL_FileName, DLL_ProcName, DLL_Trgt, DLL_Model dll_data%IDtask = IDtask_init CALL CallREDWINdll(DLL_Trgt, DLL_Model, dll_data, ErrStat2, ErrMsg2); if(Failed()) return; +!FIXME: For Model 1, the Props(1,1) will indicate which runmode we are using. Test that here + !TODO: can we add a check on which type of library we actually loaded and compare to the model we set???? ! Set status flag: @@ -277,6 +279,8 @@ subroutine REDWINinterface_CalcOutput( DLL_Trgt, DLL_Model, Displacement, Force, ErrStat = ErrID_None ErrMsg= '' +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!FIXME: should this be split out into multiple, one for each model? ! Coordinate transform to REDWIN frame dll_data%Disp = ToREDWINcoords( Displacement ) @@ -292,6 +296,8 @@ subroutine REDWINinterface_CalcOutput( DLL_Trgt, DLL_Model, Displacement, Force, ! Coordinate transform from REDWIN frame Force = real(FromREDWINcoords( dll_data%Force ), ReKi) +!FIXME: check the runmode info for model 1. Not sure it applies to the other models. +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! #ifdef DEBUG_REDWIN_INTERFACE !CALL WrNumAryFileNR ( 59, m%dll_data%avrSWAP,'1x,ES15.6E2', ErrStat, ErrMsg ) diff --git a/modules/soildyn/src/SoilDyn_Registry.txt b/modules/soildyn/src/SoilDyn_Registry.txt index 9728a4b4f..5e1176720 100644 --- a/modules/soildyn/src/SoilDyn_Registry.txt +++ b/modules/soildyn/src/SoilDyn_Registry.txt @@ -29,6 +29,7 @@ typedef ^ REDWINdllType R8Ki Disp {6} typedef ^ REDWINdllType R8Ki Force {6} - - "Forces. Follows convention of REDWIN orientations." '(N)' typedef ^ REDWINdllType R8Ki D {6}{6} - - "The 6 x 6 elastic macro-element stiffness matrix at the SFI." - typedef ^ REDWINdllType LOGICAL SuppressWarn - .FALSE. - "Supress further warnings." - +typedef ^ REDWINdllType IntKi RunMode - 0 - "RunMode of DLL (read from Props(1,1) in Model 1 during initialization" - # SoilDyn input file typedef ^ SlD_InputFile LOGICAL EchoFlag - - - "Echo the input file" - diff --git a/modules/soildyn/src/SoilDyn_Types.f90 b/modules/soildyn/src/SoilDyn_Types.f90 index ecc002c9c..7b1b04f30 100644 --- a/modules/soildyn/src/SoilDyn_Types.f90 +++ b/modules/soildyn/src/SoilDyn_Types.f90 @@ -47,6 +47,7 @@ MODULE SoilDyn_Types REAL(R8Ki) , DIMENSION(1:6) :: Force !< Forces. Follows convention of REDWIN orientations. ['(N)'] REAL(R8Ki) , DIMENSION(1:6,1:6) :: D !< The 6 x 6 elastic macro-element stiffness matrix at the SFI. [-] LOGICAL :: SuppressWarn = .FALSE. !< Supress further warnings. [-] + INTEGER(IntKi) :: RunMode = 0 !< RunMode of DLL (read from Props(1,1) in Model 1 during initialization [-] END TYPE REDWINdllType ! ======================= ! ========= SlD_InputFile ======= @@ -162,6 +163,7 @@ SUBROUTINE SlD_CopyREDWINdllType( SrcREDWINdllTypeData, DstREDWINdllTypeData, Ct DstREDWINdllTypeData%Force = SrcREDWINdllTypeData%Force DstREDWINdllTypeData%D = SrcREDWINdllTypeData%D DstREDWINdllTypeData%SuppressWarn = SrcREDWINdllTypeData%SuppressWarn + DstREDWINdllTypeData%RunMode = SrcREDWINdllTypeData%RunMode END SUBROUTINE SlD_CopyREDWINdllType SUBROUTINE SlD_DestroyREDWINdllType( REDWINdllTypeData, ErrStat, ErrMsg ) @@ -222,6 +224,7 @@ SUBROUTINE SlD_PackREDWINdllType( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E Db_BufSz = Db_BufSz + SIZE(InData%Force) ! Force Db_BufSz = Db_BufSz + SIZE(InData%D) ! D Int_BufSz = Int_BufSz + 1 ! SuppressWarn + Int_BufSz = Int_BufSz + 1 ! RunMode IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) THEN @@ -277,6 +280,8 @@ SUBROUTINE SlD_PackREDWINdllType( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E Db_Xferred = Db_Xferred + SIZE(InData%D) IntKiBuf ( Int_Xferred:Int_Xferred+1-1 ) = TRANSFER( InData%SuppressWarn , IntKiBuf(1), 1) Int_Xferred = Int_Xferred + 1 + IntKiBuf ( Int_Xferred:Int_Xferred+(1)-1 ) = InData%RunMode + Int_Xferred = Int_Xferred + 1 END SUBROUTINE SlD_PackREDWINdllType SUBROUTINE SlD_UnPackREDWINdllType( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) @@ -412,6 +417,8 @@ SUBROUTINE SlD_UnPackREDWINdllType( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat DEALLOCATE(mask2) OutData%SuppressWarn = TRANSFER( IntKiBuf( Int_Xferred ), mask0 ) Int_Xferred = Int_Xferred + 1 + OutData%RunMode = IntKiBuf( Int_Xferred ) + Int_Xferred = Int_Xferred + 1 END SUBROUTINE SlD_UnPackREDWINdllType SUBROUTINE SlD_CopyInputFile( SrcInputFileData, DstInputFileData, CtrlCode, ErrStat, ErrMsg ) From 1eb0c838b6ef7c23f4c9bbfcbff4a0031400d9cf Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 25 Feb 2020 16:03:54 -0700 Subject: [PATCH 036/136] SlD: add parsing of time series input displacements --- modules/soildyn/src/driver/SoilDyn_Driver.f90 | 73 ++-- .../src/driver/SoilDyn_Driver_Subs.f90 | 379 +++++++++++++++++- .../src/driver/SoilDyn_Driver_Types.f90 | 3 +- 3 files changed, 384 insertions(+), 71 deletions(-) diff --git a/modules/soildyn/src/driver/SoilDyn_Driver.f90 b/modules/soildyn/src/driver/SoilDyn_Driver.f90 index b68652ded..b7215e3ac 100644 --- a/modules/soildyn/src/driver/SoilDyn_Driver.f90 +++ b/modules/soildyn/src/driver/SoilDyn_Driver.f90 @@ -39,17 +39,18 @@ PROGRAM SoilDyn_Driver real(DbKi) :: Time !< Variable for storing time, in seconds real(DbKi) :: TimeInterval !< Interval between time steps, in seconds real(DbKi) :: InputTime(NumInp) !< Variable for storing time associated with inputs, in seconds + real(ReKi), allocatable :: DisplacementList(:,:) !< List of displacements and times to apply type(SlD_InitInputType) :: InitInData !< Input data for initialization type(SlD_InitOutputType) :: InitOutData !< Output data from initialization - + type(SlD_ContinuousStateType) :: x !< Continuous states type(SlD_DiscreteStateType) :: xd !< Discrete states type(SlD_ConstraintStateType) :: z !< Constraint states type(SlD_ConstraintStateType) :: Z_residual !< Residual of the constraint state functions (Z) type(SlD_OtherStateType) :: OtherState !< Other states type(SlD_MiscVarType) :: misc !< Optimization variables - + type(SlD_ParameterType) :: p !< Parameters type(SlD_InputType) :: u(NumInp) !< System inputs type(SlD_OutputType) :: y !< System outputs @@ -127,13 +128,7 @@ PROGRAM SoilDyn_Driver ! Read the driver input file CALL ReadDvrIptFile( CLSettings%DvrIptFileName, SettingsFlags, Settings, ProgInfo, ErrStat, ErrMsg ) - IF ( ErrStat >= AbortErrLev ) THEN - CALL ProgAbort( ErrMsg ) - ELSEIF ( ErrStat /= 0 ) THEN - CALL WrScr( NewLine//ErrMsg ) - ErrStat = ErrID_None - ENDIF - + call CheckErr('') ! VVerbose error reporting IF ( SlDDriver_Verbose >= 10_IntKi ) THEN @@ -142,59 +137,41 @@ PROGRAM SoilDyn_Driver CALL WrScr(NewLine) ENDIF - ! VVerbose error reporting IF ( SlDDriver_Verbose >= 10_IntKi ) CALL WrScr('Updating driver settings with command line arguments') - - ! Now that we have read in the driver input settings, we need to override these with any - ! values from the command line arguments. The .TRUE. indicates that a driver input file - ! was read. - CALL UpdateSettingsWithCL( SettingsFlags, Settings, CLSettingsFlags, CLSettings, .TRUE., ErrStat, ErrMsg ) - IF ( ErrStat >= AbortErrLev ) THEN - CALL ProgAbort( ErrMsg ) - ELSEIF ( ErrStat /= ErrID_None ) THEN - CALL WrScr( NewLine//ErrMsg ) - ErrStat = ErrID_None - ENDIF - - ! Verbose error reporting - IF ( SlDDriver_Verbose >= 10_IntKi ) THEN - CALL WrSCr(NewLine//'--- Driver settings after copying over CL settings: ---') - CALL printSettings( SettingsFlags, Settings ) - CALL WrScr(NewLine) - ENDIF - - ELSE - ! VVerbose error reporting IF ( SlDDriver_Verbose >= 10_IntKi ) CALL WrScr('No driver input file used. Updating driver settings with command line arguments') + ENDIF - ! Since there were no settings picked up from the driver input file, we need to copy over all - ! the CLSettings into the regular Settings. The .FALSE. is a flag indicating that the driver - ! input file was not read. - CALL UpdateSettingsWithCL( SettingsFlags, Settings, CLSettingsFlags, CLSettings, .FALSE., ErrStat, ErrMsg ) - IF ( ErrStat >= AbortErrLev ) THEN - CALL ProgAbort( ErrMsg ) - ELSEIF ( ErrStat /= ErrID_None ) THEN - CALL WrScr( NewLine//ErrMsg ) - ErrStat = ErrID_None - ENDIF - - ! Verbose error reporting - IF ( SlDDriver_Verbose >= 10_IntKi ) THEN - CALL WrScr(NewLine//'--- Driver settings after copying over CL settings: ---') - CALL printSettings( SettingsFlags, Settings ) - CALL WrScr(NewLine) - ENDIF + ! Since there were no settings picked up from the driver input file, we need to copy over all + ! the CLSettings into the regular Settings. The SettingsFlags%DvrIptFile is a flag indicating + ! if the driver input file read. + CALL UpdateSettingsWithCL( SettingsFlags, Settings, CLSettingsFlags, CLSettings, SettingsFlags%DvrIptFile, ErrStat, ErrMsg ) + call CheckErr('') + ! Verbose error reporting + IF ( SlDDriver_Verbose >= 10_IntKi ) THEN + CALL WrScr(NewLine//'--- Driver settings after copying over CL settings: ---') + CALL printSettings( SettingsFlags, Settings ) + CALL WrScr(NewLine) ENDIF + !------------------------------------------ + ! Read DisplacementList from InputDispFile + !------------------------------------------ + if ( SettingsFlags%InputDispFile ) then + call ReadInputDispFile( Settings%InputDispFile, DisplacementList, ErrStat, ErrMsg ) + call CheckErr('') +!FIXME: check default timestep based on DisplacementList + if ( SlDDriver_Verbose >= 10_IntKi ) call WrScr('Input Displacements given for '//trim(Num2LStr(size(DisplacementList,2)))// & + ' from T = '//trim(Num2LStr(DisplacementList(1,1)))//' to '//trim(Num2LStr(DisplacementList(1,size(DisplacementList,2))))//' seconds.') + endif !............................................................................................................................... diff --git a/modules/soildyn/src/driver/SoilDyn_Driver_Subs.f90 b/modules/soildyn/src/driver/SoilDyn_Driver_Subs.f90 index 166d2929d..b607239c9 100644 --- a/modules/soildyn/src/driver/SoilDyn_Driver_Subs.f90 +++ b/modules/soildyn/src/driver/SoilDyn_Driver_Subs.f90 @@ -53,6 +53,7 @@ SUBROUTINE DispHelpText() CALL WrScr(" Notes:") CALL WrScr(" -- Options are not case sensitive.") CALL WrScr("") +!FIXME: update this END SUBROUTINE DispHelpText @@ -66,7 +67,7 @@ subroutine InitSettingsFlags( ProgInfo, CLSettings, CLFlags ) ! Set some CLSettings to null/default values CLSettings%DvrIptFileName = "" ! No input name name until set CLSettings%SlDIptFileName = "" ! No SlD input file name until set - CLSettings%SummaryFileName = "" ! No summary file name until set + CLSettings%InputDispFile = "" ! No SlD input displacement timeseries file name until set CLSettings%NumTimeSteps = 0_IntKi CLSettings%DT = 0.0_DbKi CLSettings%TStart = 0.0_ReKi @@ -74,7 +75,8 @@ subroutine InitSettingsFlags( ProgInfo, CLSettings, CLFlags ) ! Set some CLFlags to null/default values CLFlags%DvrIptFile = .FALSE. ! Driver input filename given as command line argument - CLFlags%SlDIptFile = .FALSE. ! InflowWind input filename given as command line argument + CLFlags%SlDIptFile = .FALSE. ! SoilDyn input filename given as command line argument + CLFlags%InputDispFile = .FALSE. ! No SlD input displacement timeseries file name until set CLFlags%TStart = .FALSE. ! specified time to start at CLFlags%StiffMatOut = .FALSE. ! stiffness matrix output at start and end CLFlags%NumTimeSteps = .FALSE. ! specified a number of timesteps @@ -350,7 +352,7 @@ SUBROUTINE ParseArg( CLSettings, CLFlags, ThisArgUC, ThisArg, sldFlagSet, ErrSta ENDIF RETURN ENDIF - +!FIXME: add in the other inputs here. ELSE ErrMsg = " Unrecognized option: '"//SwChar//TRIM(ThisArg)//"'. Ignoring. Use option "//SwChar//"help for list of options." @@ -387,8 +389,7 @@ SUBROUTINE ReadDvrIptFile( DvrFileName, DvrFlags, DvrSettings, ProgInfo, ErrStat CHARACTER(1024) :: EchoFileName ! Name of SoilDyn driver echo file ! Time steps - CHARACTER(1024) :: NumTimeStepsChr ! Character string for number of timesteps (to handle DEFAULT value) - CHARACTER(1024) :: DTChr ! Character string for timesteps size (to handle DEFAULT value) + CHARACTER(1024) :: InputChr ! Character string for timesteps and input file names (to handle DEFAULT or NONE value) ! Gridded data INTEGER(IntKi) :: TmpIntAr3(3) ! Temporary array for reading in a pair of integer values from the input file @@ -496,19 +497,19 @@ SUBROUTINE ReadDvrIptFile( DvrFileName, DvrFlags, DvrSettings, ProgInfo, ErrStat ! DT -- Timestep size for the driver to take (or DEFAULT for what the file contains) - CALL ReadVar( UnIn, FileName,DTChr,'DTChr',' Character string for Timestep size for the driver to take (or DEFAULT for what the file contains).', & + CALL ReadVar( UnIn, FileName,InputChr,'InputChr',' Character string for Timestep size for the driver to take (or DEFAULT for what the file contains).', & ErrStatTmp,ErrMsgTmp, UnEchoLocal ) if (Failed()) return ! Check if we asked for the DEFAULT (use what is in the file) - CALL Conv2UC( DTChr ) - IF ( TRIM(DTChr) == 'DEFAULT' ) THEN ! we asked for the default value + CALL Conv2UC( InputChr ) + IF ( TRIM(InputChr) == 'DEFAULT' ) THEN ! we asked for the default value DvrFlags%DT = .TRUE. DvrFlags%DTDefault = .TRUE. ! This flag tells us to use the inflow wind file values ELSE ! We probably have a number if it isn't 'DEFAULT', so do an internal read and check to ! make sure that it was appropriately interpretted. - READ (DTChr,*,IOSTAT=IOS) DvrSettings%DT + READ (InputChr,*,IOSTAT=IOS) DvrSettings%DT IF ( IOS /= 0 ) THEN ! problem in the read, so parse the error. CALL CheckIOS ( IOS, '', 'DT',NumType, ErrStatTmp, ErrMsgTmp ) if (Failed()) return @@ -520,19 +521,19 @@ SUBROUTINE ReadDvrIptFile( DvrFileName, DvrFlags, DvrSettings, ProgInfo, ErrStat ! Number of timesteps - CALL ReadVar( UnIn, FileName,NumTimeStepsChr,'NumTimeStepsChr',' Character string for number of timesteps to read.', & + CALL ReadVar( UnIn, FileName,InputChr,'InputChr',' Character string for number of timesteps to read.', & ErrStatTmp,ErrMsgTmp, UnEchoLocal ) if (Failed()) return ! Check if we asked for the DEFAULT (use what is in the file) - CALL Conv2UC( NumTimeStepsChr ) - IF ( TRIM(NumTimeStepsChr) == 'DEFAULT' ) THEN ! we asked for the default value + CALL Conv2UC( InputChr ) + IF ( TRIM(InputChr) == 'DEFAULT' ) THEN ! we asked for the default value DvrFlags%NumTimeSteps = .TRUE. DvrFlags%NumTimeStepsDefault = .TRUE. ! This flag tells us to use the inflow wind file values ELSE ! We probably have a number if it isn't 'DEFAULT', so do an internal read and check to ! make sure that it was appropriately interpretted. - READ (NumTimeStepsChr,*,IOSTAT=IOS) DvrSettings%NumTimeSteps + READ (InputChr,*,IOSTAT=IOS) DvrSettings%NumTimeSteps IF ( IOS /= 0 ) THEN ! problem in the read, so parse the error. CALL CheckIOS ( IOS, '', 'NumTimeSteps',NumType, ErrStatTmp, ErrMsgTmp ) if (Failed()) return @@ -550,9 +551,24 @@ SUBROUTINE ReadDvrIptFile( DvrFileName, DvrFlags, DvrSettings, ProgInfo, ErrStat !------------------------------------------------------------------------------------------------- - ! SoilDyn time series input + ! SoilDyn time series input -- this is read from a file of 7 columns (time and 6 dof) !------------------------------------------------------------------------------------------------- -!FIXME: add these + + ! InputDispFile input file + CALL ReadVar( UnIn, FileName,InputChr,'InputDispFile',' SoilDyn input displacements filename', & + ErrStatTmp,ErrMsgTmp, UnEchoLocal ) + if (Failed()) return + + DvrSettings%InputDispFile = InputChr + call Conv2UC( InputChr ) + if (trim(InputChr) == 'NONE') then + DvrSettings%InputDispFile = '' + DvrFlags%InputDispFile = .FALSE. + else + DvrFlags%InputDispFile = .TRUE. + endif + + ! Close the echo and input file CALL CleanupEchoFile( EchoFileContents, UnEchoLocal ) CLOSE( UnIn ) @@ -601,7 +617,8 @@ SUBROUTINE UpdateSettingsWithCL( DvrFlags, DvrSettings, CLFlags, CLSettings, DVR INTEGER(IntKi) :: ErrStatTmp !< Temporary error status for calls CHARACTER(1024) :: ErrMsgTmp !< Temporary error status for calls LOGICAL :: WindGridModify !< Did we modify any of the WindGrid related settings? - + character(*), parameter :: RoutineName = 'UpdateSettingsWithCL' + ! Initialization WindGridModify = .FALSE. @@ -620,7 +637,7 @@ SUBROUTINE UpdateSettingsWithCL( DvrFlags, DvrSettings, CLFlags, CLSettings, DVR IF ( CLFlags%TStart ) THEN IF ( DvrFlags%TStart .AND. ( .NOT. EqualRealNos(DvrSettings%TStart, CLSettings%TStart) ) ) THEN CALL SetErrStat( ErrID_Warn, ' Overriding driver input value for TStart with '//TRIM(Num2LStr(CLSettings%TStart))//'.', & - ErrStat,ErrMsg,'UpdateSettingsWithCL') + ErrStat,ErrMsg,RoutineName) ELSE DvrFlags%TStart = .TRUE. ENDIF @@ -631,7 +648,7 @@ SUBROUTINE UpdateSettingsWithCL( DvrFlags, DvrSettings, CLFlags, CLSettings, DVR IF ( CLFlags%DT ) THEN IF ( DvrFlags%DT .AND. ( .NOT. EqualRealNos(DvrSettings%DT, CLSettings%DT) ) ) THEN CALL SetErrStat( ErrID_Warn, ' Overriding driver input value for DT with '//TRIM(Num2LStr(CLSettings%DT))//'.', & - ErrStat,ErrMsg,'UpdateSettingsWithCL') + ErrStat,ErrMsg,RoutineName) ELSE DvrFlags%DT = .TRUE. ENDIF @@ -644,7 +661,7 @@ SUBROUTINE UpdateSettingsWithCL( DvrFlags, DvrSettings, CLFlags, CLSettings, DVR IF ( DvrFlags%NumTimeSteps .AND. ( DvrSettings%NumTimeSteps /= CLSettings%NumTimeSteps ) ) THEN CALL SetErrStat( ErrID_Warn, ' Overriding driver input value for NumTimeSteps with '// & TRIM(Num2LStr(CLSettings%NumTimeSteps))//'.',& - ErrStat,ErrMsg,'UpdateSettingsWithCL') + ErrStat,ErrMsg,RoutineName) ELSE DvrFlags%NumTimeSteps = .TRUE. ENDIF @@ -656,7 +673,6 @@ SUBROUTINE UpdateSettingsWithCL( DvrFlags, DvrSettings, CLFlags, CLSettings, DVR DvrSettings%NumTimeSteps = MAX(DvrSettings%NumTimeSteps,1_IntKi) - !-------------------------------------------- ! If there was no driver input file, we need to set a few things. !-------------------------------------------- @@ -666,8 +682,8 @@ SUBROUTINE UpdateSettingsWithCL( DvrFlags, DvrSettings, CLFlags, CLSettings, DVR ! Do we need to set the NumTimeStepsDefault flag? IF ( .NOT. DvrFlags%NumTimeSteps ) THEN DvrFlags%NumTimeStepsDefault = .TRUE. - CALL SetErrStat( ErrID_Info,' The number of timesteps is not specified. Defaulting to what is in the wind file.', & - ErrStat,ErrMsg,'UpdateSettingsWithCL') + CALL SetErrStat( ErrID_Info,' The number of timesteps is not specified. Defaulting to what is in the input series file.', & + ErrStat,ErrMsg,RoutineName) ENDIF ENDIF @@ -683,6 +699,325 @@ END SUBROUTINE UpdateSettingsWithCL +SUBROUTINE ReadInputDispFile( InputDispFile, DisplacementList, ErrStat, ErrMsg ) + CHARACTER(1024), INTENT(IN ) :: InputDispFile !< Name of the points file to read + REAL(ReKi), ALLOCATABLE, INTENT( OUT) :: DisplacementList(:,:) !< The coordinates we read in + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< The error status + CHARACTER(*), INTENT( OUT) :: ErrMsg !< The message for the status + + ! Local variables + CHARACTER(1024) :: ErrMsgTmp !< Temporary error message for calls + INTEGER(IntKi) :: ErrStatTmp !< Temporary error status for calls + INTEGER(IntKi) :: FiUnitPoints !< Unit number for points file to open + + INTEGER(IntKi) :: NumDataColumns !< Number of data columns + INTEGER(IntKi) :: NumDataPoints !< Number of lines of data (one point per line) + INTEGER(IntKi) :: NumHeaderLines !< Number of header lines to ignore + + INTEGER(IntKi) :: I !< Generic counter + character(*), parameter :: RoutineName = 'ReadInputDispFile' + + ! Initialization of subroutine + ErrMsg = '' + ErrMsgTmp = '' + ErrStat = ErrID_None + ErrStatTmp = ErrID_None + + + ! Now open file + CALL GetNewUnit( FiUnitPoints, ErrStatTmp, ErrMsgTmp ); if (Failed()) return + CALL OpenFInpFile( FiUnitPoints, TRIM(InputDispFile), ErrStatTmp, ErrMsgTmp ) ! Unformatted input file + if (Failed()) return + + ! Find out how long the file is + CALL GetFileLength( FiUnitPoints, InputDispFile, NumDataColumns, NumDataPoints, NumHeaderLines, ErrMsgTmp, ErrStatTmp ) + if (Failed()) return + IF ( NumDataColumns /= 7 ) THEN + ErrStatTmp = ErrID_Fatal + ErrMsgTmp = ' Expecting seven columns in '//TRIM(InputDispFile)//' corresponding to '// & + 'time, X, Y, Z, Rx, Ry, Rz coordinates. Instead found '//TRIM(Num2LStr(NumDataColumns))//'.' + if (Failed()) return + ENDIF + + + ! Allocate the storage for the data + CALL AllocAry( DisplacementList, 7, NumDataPoints, "Array of Points data", ErrStatTmp, ErrMsgTmp ) + if (Failed()) return + + + ! Read in the headers and throw them away + DO I=1,NumHeaderLines + CALL ReadCom( FiUnitPoints, InputDispFile,' Points file header line', ErrStatTmp, ErrMsgTmp ) + if (Failed()) return + ENDDO + + ! Read in the datapoints + DO I=1,NumDataPoints + CALL ReadAry ( FiUnitPoints, InputDispFile, DisplacementList(:,I), 3, 'DisplacementList', & + 'Coordinate point from Points file', ErrStatTmp, ErrMsgTmp) + if (Failed()) return + ENDDO + + CLOSE( FiUnitPoints ) + +CONTAINS + !> Set error status, close stuff, and return + logical function Failed() + CALL SetErrStat(ErrStatTmp,ErrMsgTmp,ErrStat,ErrMsg,RoutineName) + if (ErrStat >= AbortErrLev .and. FiUnitPoints >0) close( FiUnitPoints ) + Failed = ErrStat >= AbortErrLev + end function Failed + + + !------------------------------------------------------------------------------------------------------------------------------- + !> This subroutine looks at a file that has been opened and finds out how many header lines there are, how many columns there + !! are, and how many lines of data there are in the file. + !! + !! A few things are assumed about the file: + !! 1. Any header lines are the first thing in the file. + !! 2. No text appears anyplace other than in first part of the file + !! 3. The datalines only contain numbers that can be read in as reals. + !! + !! Limitations: + !! 1. only handles up to 20 words (columns) on a line + !! 2. empty lines are considered text lines + !! 3. All data rows must contain the same number of columns + !! + !! + SUBROUTINE GetFileLength(UnitDataFile, DataFileName, NumDataColumns, NumDataLines, NumHeaderLines, ErrMsg, ErrStat) + + INTEGER(IntKi), INTENT(IN ) :: UnitDataFile !< Unit number of the file we are looking at. + CHARACTER(*), INTENT(IN ) :: DataFileName !< The name of the file we are looking at. + INTEGER(IntKi), INTENT( OUT) :: NumDataColumns !< The number of columns in the data file. + INTEGER(IntKi), INTENT( OUT) :: NumDataLines !< Number of lines containing data + INTEGER(IntKi), INTENT( OUT) :: NumHeaderLines !< Number of header lines at the start of the file + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error Message to return (empty if all good) + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Status flag if there were any problems (ErrID_None if all good) + + ! Local Variables + CHARACTER(2048) :: ErrMsgTmp !< Temporary message variable. Used in calls. + INTEGER(IntKi) :: ErrStatTmp !< Temporary error status. Used in calls. + INTEGER(IntKi) :: LclErrStat !< Temporary error status. Used locally to indicate when we have reached the end of the file. + INTEGER(IntKi) :: TmpIOErrStat !< Temporary error status for the internal read of the first word to a real number + LOGICAL :: IsRealNum !< Flag indicating if the first word on the line was a real number + + CHARACTER(1024) :: TextLine !< One line of text read from the file + INTEGER(IntKi) :: LineLen !< The length of the line read in + CHARACTER(1024) :: StrRead !< String containing the first word read in + REAL(ReKi) :: RealRead !< Returns value of the number (if there was one), or NaN (as set by NWTC_Num) if there wasn't + CHARACTER(1024) :: VarName !< Name of the variable we are trying to read from the file + CHARACTER(24) :: Words(20) !< Array of words we extract from a line. We shouldn't have more than 20. + INTEGER(IntKi) :: i,j,k !< simple integer counters + INTEGER(IntKi) :: LineNumber !< the line I am on + LOGICAL :: LineHasText !< Flag indicating if the line I just read has text. If so, it is a header line. + LOGICAL :: HaveReadData !< Flag indicating if I have started reading data. + INTEGER(IntKi) :: NumWords !< Number of words on a line + INTEGER(IntKi) :: FirstDataLineNum !< Line number of the first row of data in the file + + ! Initialize the error handling + ErrStat = ErrID_None + ErrStatTmp = ErrID_None + LclErrStat = ErrID_None + ErrMsg = '' + ErrMsgTmp = '' + + ! Set some of the flags and counters + HaveReadData = .FALSE. + NumDataColumns = 0 + NumHeaderLines = 0 + NumDataLines = 0 + LineNumber = 0 + + ! Just in case we were handed a file that we are part way through reading (should never be true), rewind to the start + + REWIND( UnitDataFile ) + + !------------------------------------ + !> The variable LclErrStat is used to indicate when we have reached the end of the file or had an error from + !! ReadLine. Until that occurs, we read each line, and decide if it contained any non-numeric data. The + !! first group of lines containing non-numeric data is considered the header. The first line of all numeric + !! data is considered the start of the data section. Any non-numeric containing found within the data section + !! will be considered as an invalid file format at which point we will return a fatal error from this routine. + + DO WHILE ( LclErrStat == ErrID_None ) + + !> Reset the indicator flag for the non-numeric content + LineHasText = .FALSE. + + !> Read in a single line from the file + CALL ReadLine( UnitDataFile, '', TextLine, LineLen, LclErrStat ) + + !> If there was an error in reading the file, then exit. + !! Possible causes: reading beyond end of file in which case we are done so don't process it. + IF ( LclErrStat /= ErrID_None ) EXIT + + !> Increment the line counter. + LineNumber = LineNumber + 1 + + !> Read all the words on the line into the array called 'Words'. Only the first words will be encountered + !! will be stored. The others are empty (i.e. only three words on the line, so the remaining 17 are empty). + CALL GetWords( TextLine, Words, 20 ) + + !> Cycle through and count how many are not empty. Once an empty value is encountered, all the rest should + !! be empty if GetWords worked correctly. The index of the last non-empty value is stored. + DO i=1,20 + IF (TRIM(Words(i)) .ne. '') NumWords=i + ENDDO + + + !> Now cycle through the first 'NumWords' of non-empty values stored in 'Words'. Words should contain + !! everything that is one the line. The subroutine ReadRealNumberFromString will set a flag 'IsRealNum' + !! when the value in Words(i) can be read as a real(ReKi). 'StrRead' will contain the string equivalent. + DO i=1,NumWords + CALL ReadRealNumberFromString( Words(i), RealRead, StrRead, IsRealNum, ErrStatTmp, ErrMsgTmp, TmpIOErrStat ) + IF ( .NOT. IsRealNum) LineHasText = .TRUE. + ENDDO + + !> If all the words on that line had no text in them, then it must have been a line of data. + !! If not, then we have either a header line, which is ok, or a line containing text in the middle of the + !! the data section, which is not good (the flag HaveReadData tells us which case this is). + IF ( LineHasText ) THEN + IF ( HaveReadData ) THEN ! Uh oh, we have already read a line of data before now, so there is a problem + CALL SetErrStat( ErrID_Fatal, ' Found text on line '//TRIM(Num2LStr(LineNumber))//' of '//TRIM(DataFileName)// & + ' when real numbers were expected. There may be a problem with format of the file: '// & + TRIM(DataFileName)//'.', ErrStat, ErrMsg, RoutineName) + IF ( ErrStat >= AbortErrLev ) RETURN + ELSE + NumHeaderLines = NumHeaderLines + 1 + ENDIF + ELSE ! No text, must be data line + NumDataLines = NumDataLines + 1 + ! If this is the first row of data, then store the number of words that were on the line + IF ( .NOT. HaveReadData ) THEN + ! If this is the first line of data, keep some relevant info about it and the number of columns in it + HaveReadData = .TRUE. + FirstDataLineNum = LineNumber ! Keep the line number of the first row of data (for error reporting) + NumDataColumns = NumWords + ELSE + ! Make sure that the number columns on the row matches the number of columnns on the first row of data. + IF ( NumWords /= NumDataColumns ) THEN + CALL SetErrStat( ErrID_Fatal, ' Error in file: '//TRIM(DataFileName)//'.'// & + ' The number of data columns on line '//TRIM(Num2LStr(LineNumber))// & + '('//TRIM(Num2LStr(NumWords))//' columns) is different than the number of columns on first row of data '// & + ' (line: '//TRIM(Num2LStr(FirstDataLineNum))//', '//TRIM(Num2LStr(NumDataColumns))//' columns).', & + ErrStat, ErrMsg, RoutineName) + IF ( ErrStat >= AbortErrLev ) RETURN + ENDIF + ENDIF + ENDIF + + ENDDO + + REWIND( UnitDataFile ) + + END SUBROUTINE GetFileLength + + !------------------------------------------------------------------------------- + !> This subroutine takes a line of text that is passed in and reads the first + !! word to see if it is a number. An internal read is used to do this. If + !! it is a number, it is started in ValueRead and returned. The flag IsRealNum + !! is set to true. Otherwise, ValueRead is set to NaN (value from the NWTC_Num) + !! and the flag is set to false. + !! + !! The IsRealNum flag is set to indicate if we actually have a real number or + !! not. After calling this routine, a simple if statement can be used: + !! + !! @code + !! IF (IsRealNum) THEN + !! ! do something + !! ELSE + !! ! do something else + !! ENDIF + !! @endcode + !! + !------------------------------------------------------------------------------- + SUBROUTINE ReadRealNumberFromString(StringToParse, ValueRead, StrRead, IsRealNum, ErrStat, ErrMsg, IOErrStat) + CHARACTER(*), INTENT(IN ) :: StringToParse !< The string we were handed. + REAL(ReKi), INTENT( OUT) :: ValueRead !< The variable being read. Returns as NaN (library defined) if not a Real. + CHARACTER(*), INTENT( OUT) :: StrRead !< A string containing what was read from the ReadNum routine. + LOGICAL, INTENT( OUT) :: IsRealNum !< Flag indicating if we successfully read a Real + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< ErrID level returned from ReadNum + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message including message from ReadNum + INTEGER(IntKi), INTENT( OUT) :: IOErrStat !< Error status from the internal read. Useful for diagnostics. + + ErrStat = ErrID_None + ErrMsg = '' + + ! ReadNum returns a string contained in StrRead. So, we now try to do an internal read to VarRead and then trap errors. + read(StringToParse,*,IOSTAT=IOErrStat) StrRead + read(StringToParse,*,IOSTAT=IOErrStat) ValueRead + + ! If IOErrStat==0, then we have a real number, anything else is a problem. + if (IOErrStat==0) then + IsRealNum = .TRUE. + else + IsRealNum = .FALSE. + ValueRead = NaN ! This is NaN as defined in the NWTC_Num. + ErrMsg = 'Not a real number. '//TRIM(ErrMsgTmp)//NewLine + ErrSTat = ErrID_Severe + endif + + RETURN + END SUBROUTINE ReadRealNumberFromString + + !------------------------------------------------------------------------------- + !> This subroutine works with the ReadNum routine from the library. ReadNum is + !! called to read a word from the input file. An internal read is then done to + !! convert the string to a number that is stored in VarRead and returned. + !! + !! The IsRealNum flag is set to indicate if we actually have a real number or + !! not. After calling this routine, a simple if statement can be used: + !! + !! @code + !! IF (ISRealNum) THEN + !! ! do something + !! ELSE + !! ! do something else + !! ENDIF + !! @endcode + !! + !------------------------------------------------------------------------------- + SUBROUTINE ReadRealNumber(UnitNum, FileName, VarName, VarRead, StrRead, IsRealNum, ErrStat, ErrMsg, IOErrStat) + INTEGER(IntKi), INTENT(IN ) :: UnitNum !< The unit number of the file being read + CHARACTER(*), INTENT(IN ) :: FileName !< The name of the file being read. Used in the ErrMsg from ReadNum (Library routine). + CHARACTER(*), INTENT(IN ) :: VarName !< The variable we are reading. Used in the ErrMsg from ReadNum (Library routine)'. + REAL(ReKi), INTENT( OUT) :: VarRead !< The variable being read. Returns as NaN (library defined) if not a Real. + CHARACTER(*), INTENT( OUT) :: StrRead !< A string containing what was read from the ReadNum routine. + LOGICAL, INTENT( OUT) :: IsRealNum !< Flag indicating if we successfully read a Real + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< ErrID level returned from ReadNum + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message including message from ReadNum + INTEGER(IntKi), INTENT( OUT) :: IOErrStat !< Error status from the internal read. Useful for diagnostics. + + INTEGER(IntKi) :: ErrStatTmp + CHARACTER(2048) :: ErrMsgTmp + + ErrStat = ErrID_None + ErrMsg = '' + + ! Now call the ReadNum routine to get the number + ! If it is a word that does not start with T or F, then ReadNum won't give any errors. + CALL ReadNum( UnitNum, FileName, StrRead, VarName, ErrStatTmp, ErrMsgTmp) + + ! ReadNum returns a string contained in StrRead. So, we now try to do an internal read to VarRead and then trap errors. + read(StrRead,*,IOSTAT=IOErrStat) VarRead + + ! If IOErrStat==0, then we have a real number, anything else is a problem. + if (IOErrStat==0) then + IsRealNum = .TRUE. + else + IsRealNum = .FALSE. + VarRead = NaN ! This is NaN as defined in the NWTC_Num. + ErrMsg = 'Not a real number. '//TRIM(ErrMsgTmp)//NewLine + ErrStat = ErrStatTmp ! The ErrStatTmp returned by the ReadNum routine is an ErrID level. + endif + RETURN + END SUBROUTINE ReadRealNumber + +END SUBROUTINE ReadInputDispFile + + + + !> This routine exists only to support the development of the module. It will not be needed after the module is complete. SUBROUTINE printSettings( DvrFlags, DvrSettings ) ! The arguments diff --git a/modules/soildyn/src/driver/SoilDyn_Driver_Types.f90 b/modules/soildyn/src/driver/SoilDyn_Driver_Types.f90 index cff6d44f4..578df40be 100644 --- a/modules/soildyn/src/driver/SoilDyn_Driver_Types.f90 +++ b/modules/soildyn/src/driver/SoilDyn_Driver_Types.f90 @@ -41,6 +41,7 @@ MODULE SoilDyn_Driver_Types TYPE :: SlDDriver_Flags LOGICAL :: DvrIptFile = .FALSE. !< Was an input file name given on the command line? LOGICAL :: SlDIptFile = .FALSE. !< Was an SoilDyn input file requested? + LOGICAL :: InputDispFile = .FALSE. !< Input displacement time series LOGICAL :: TStart = .FALSE. !< specified a start time LOGICAL :: StiffMatOut = .FALSE. !< output stiffness matrices at start and finish LOGICAL :: NumTimeSteps = .FALSE. !< specified a number of timesteps to process @@ -56,7 +57,7 @@ MODULE SoilDyn_Driver_Types TYPE :: SlDDriver_Settings CHARACTER(1024) :: DvrIptFileName !< Driver input file name CHARACTER(1024) :: SlDIptFileName !< Filename of SoilDyn input file to read (if no driver input file) - CHARACTER(1024) :: SummaryFileName !< Filename for the summary information output + CHARACTER(1024) :: InputDispFile !< Filename of SoilDyn time series displacements INTEGER(IntKi) :: NumTimeSteps !< Number of timesteps REAL(DbKi) :: DT !< resolution of time From 668b17141dc775032ab94fe668741e00e6432e5f Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Mon, 2 Mar 2020 15:13:03 -0700 Subject: [PATCH 037/136] SoilDyn: change precision in the REDWIN interface for displacement --- modules/soildyn/src/REDWINinterface.f90 | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/soildyn/src/REDWINinterface.f90 b/modules/soildyn/src/REDWINinterface.f90 index 95af41dbe..8e1609b17 100644 --- a/modules/soildyn/src/REDWINinterface.f90 +++ b/modules/soildyn/src/REDWINinterface.f90 @@ -264,7 +264,7 @@ subroutine REDWINinterface_CalcOutput( DLL_Trgt, DLL_Model, Displacement, Force, type(DLL_Type), intent(in ) :: DLL_Trgt !< The DLL to be called. integer(IntKi), intent(in ) :: DLL_Model !< Model type of the DLL - real(ReKi), intent(in ) :: Displacement(6) !< OpenFAST global coordinate frame + real(R8Ki), intent(in ) :: Displacement(6) !< OpenFAST global coordinate frame real(ReKi), intent( out) :: Force(6) !< OpenFAST global coordinate frame type(REDWINdllType), intent(inout) :: dll_data !< DLL coordinate frame arrays in here integer(IntKi), intent( out) :: ErrStat !< Error status of the operation @@ -292,7 +292,7 @@ subroutine REDWINinterface_CalcOutput( DLL_Trgt, DLL_Model, Displacement, Force, ! Call the REDWIN-style DLL: dll_data%IDtask = IDtask_calc - CALL CallREDWINdll( DLL_Trgt, DLL_Model, dll_data, ErrStat, ErrMsg); if(Failed()) return; + CALL CallREDWINdll( DLL_Trgt, DLL_Model, dll_data, ErrStat2, ErrMsg2); if(Failed()) return; ! Coordinate transform from REDWIN frame Force = real(FromREDWINcoords( dll_data%Force ), ReKi) @@ -319,7 +319,7 @@ subroutine REDWINinterface_GetStiffMatrix( DLL_Trgt, DLL_Model, Displacement, Fo type(DLL_Type), intent(in ) :: DLL_Trgt !< The DLL to be called. integer(IntKi), intent(in ) :: DLL_Model !< Model type of the DLL - real(ReKi), intent(in ) :: Displacement(6) !< Displacement (OpenFAST global coords) + real(R8Ki), intent(in ) :: Displacement(6) !< Displacement (OpenFAST global coords) real(ReKi), intent( out) :: Force(6) !< Resulting force (OpenFAST global coords) real(ReKi), intent( out) :: StiffMatrix(6,6) !< Returned stiffness (OpenFAST global coords) type(REDWINdllType), intent(inout) :: dll_data @@ -329,7 +329,7 @@ subroutine REDWINinterface_GetStiffMatrix( DLL_Trgt, DLL_Model, Displacement, Fo ! local variables: integer(IntKi) :: ErrStat2 ! The error status code character(ErrMsgLen) :: ErrMsg2 ! The error message, if an error occurred - character(*), parameter :: RoutineName = 'REDWINinterface_CalcOutput' + character(*), parameter :: RoutineName = 'REDWINinterface_GetStiffMatrix' ! Initialize error values: ErrStat = ErrID_None @@ -340,7 +340,7 @@ subroutine REDWINinterface_GetStiffMatrix( DLL_Trgt, DLL_Model, Displacement, Fo ! Call the REDWIN-style DLL: dll_data%IDtask = IDtask_stiff - CALL CallREDWINdll( DLL_Trgt, DLL_Model, dll_data, ErrStat, ErrMsg); if(Failed()) return; + CALL CallREDWINdll( DLL_Trgt, DLL_Model, dll_data, ErrStat2, ErrMsg2); if(Failed()) return; ! Coordinate transformation Force = real(FromREDWINcoords( dll_data%Force ), ReKi) From 68db17f4f9f18f9489dfcd8a4ed33d1c0d7ad3e9 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Mon, 2 Mar 2020 15:15:11 -0700 Subject: [PATCH 038/136] SlD: Add meshes for input / output Setup calls to REDWIN dll --- modules/soildyn/src/SoilDyn.f90 | 168 ++++++++++++++-- modules/soildyn/src/SoilDyn_IO.f90 | 20 +- modules/soildyn/src/SoilDyn_Registry.txt | 28 +-- modules/soildyn/src/SoilDyn_Types.f90 | 244 +++++++++++++++++++---- 4 files changed, 386 insertions(+), 74 deletions(-) diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index 8a1e82db0..e985b3fbb 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -120,14 +120,13 @@ subroutine SoilDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In z%DummyConstrState = 0.0_ReKi OtherState%DummyOtherState = 0.0_ReKi - ! Define initial guess for the system inputs here: - u%DummyInput = 0.0_ReKi + +!FIXME: set some initial values of y and u here) !FIXME: Develop a list of outputs, and set that up somewhere. ! Define system output initializations (set up mesh) here: call AllocAry( y%WriteOutput, NumOuts, 'WriteOutput', ErrStat2, ErrMsg2 ); if (Failed()) return; - y%DummyOutput = 0 y%WriteOutput = 0 ! Define initialization-routine output here: @@ -155,12 +154,22 @@ subroutine SoilDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In ! Set miscvars: including dll_data arrays and checking for input files. call SoilDyn_InitMisc( InputFileData, m, ErrStat2,ErrMsg2); if (Failed()) return; + + call SoilDyn_InitMeshes( InputFileData, InitInp, u, y, p, m, ErrStat2,ErrMsg2); if (Failed()) return; + + +!FIXME: wrap logic around this for option 3 only. ! Initialize the dll do j=1,size(m%dll_data) call REDWINinterface_Init( InputFileData%DLL_FileName, InputFileData%DLL_ProcName, p%DLL_Trgt, p%DLL_Model, & m%dll_data(j), p%UseREDWINinterface, ErrStat2, ErrMsg2); if (Failed()) return; enddo + +!FIXME: create all the meshes that are needed and check against points handed in + + + contains logical function Failed() call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) @@ -211,6 +220,108 @@ subroutine SoilDyn_InitMisc( InputFileData, m, ErrStat, ErrMsg ) if (ErrStat >= AbortErrLev) return end subroutine SoilDyn_InitMisc + subroutine SoilDyn_InitMeshes( InputFileData, InitInp, u, y, p, m, ErrStat, ErrMsg ) + type(SlD_InputFile), intent(in ) :: InputFileData !< Data stored in the module's input file + type(SlD_InitInputType), intent(in ) :: InitInp !< Input data for initialization routine + type(SlD_InputType), intent(inout) :: u !< An initial guess for the input; input mesh must be defined + type(SlD_OutputType), intent(inout) :: y !< Initial system outputs + type(SlD_ParameterType), intent(inout) :: p !< Parameters + type(SlD_MiscVarType), intent(inout) :: m !< Misc variables for optimization (not copied in glue code) + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(IntKi) :: i ! Generic counter + integer(IntKi) :: ErrStat2 !< local error status + character(ErrMsgLen) :: ErrMsg2 !< local error message + + real(R8Ki) :: DCM(3,3) + real(ReKi) :: Pos(3) + integer(IntKi) :: NumPoints ! Number of points from input file + real(ReKi), allocatable :: MeshLocations(:,:) + + select case(InputFileData%CalcOption) + case (Calc_StiffDamp) + NumPoints = 1_IntKi +!FIXME: update to allow more than one set of points +! NumPoints = InputFileData%StiffDamp_NumPoints +! call AllocAry(MeshLocations,3,NumPoints,'Mesh locations',ErrStat2,ErrMsg2); +! do i=1,size(MeshLocations,2) +! MeshLocations(1:3,i) = InputFileData%StiffDamp_locations(1:3,i) +! enddo + case (Calc_PYcurve) + NumPoints = InputFileData%PY_NumPoints + call AllocAry(MeshLocations,3,NumPoints,'Mesh locations',ErrStat2,ErrMsg2); + do i=1,size(MeshLocations,2) + MeshLocations(1:3,i) = InputFileData%PY_locations(1:3,i) + enddo + case (Calc_REDWIN) + NumPoints = InputFileData%DLL_NumPoints + call AllocAry(MeshLocations,3,NumPoints,'Mesh locations',ErrStat2,ErrMsg2); + do i=1,size(MeshLocations,2) + MeshLocations(1:3,i) = InputFileData%DLL_locations(1:3,i) + enddo + end select + + !................................. + ! u%SoilMotion (for coupling with external codes) + !................................. + + CALL MeshCreate( BlankMesh = u%SoilMotion & + , IOS = COMPONENT_INPUT & + , NNodes = NumPoints & + , TranslationDisp = .TRUE. & + , TranslationVel = .TRUE. & + , TranslationAcc = .TRUE. & + , Orientation = .TRUE. & + , RotationVel = .TRUE. & + , RotationAcc = .TRUE. & + , ErrStat = ErrStat2 & + , ErrMess = ErrMsg2 ) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + if (ErrStat>=AbortErrLev) return + + ! Assuming zero orientation displacement for start + DCM = 0.0_DbKi + + do i=1,NumPoints + CALL MeshPositionNode( Mesh = u%SoilMotion & + , INode = i & + , Pos = MeshLocations(1:3,i) & + , ErrStat = ErrStat2 & + , ErrMess = ErrMsg2 & + , Orient = DCM ) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + + CALL MeshConstructElement ( Mesh = u%SoilMotion & + , Xelement = ELEMENT_POINT & + , P1 = i & + , ErrStat = ErrStat2 & + , ErrMess = ErrMsg2 ) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + enddo + + CALL MeshCommit ( Mesh = u%SoilMotion, ErrStat = ErrStat2, ErrMess = ErrMsg2 ) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + if (ErrStat>=AbortErrLev) return + + + !................................. + ! y%ReactionForce (for coupling with external codes) + !................................. + + CALL MeshCopy( SrcMesh = u%SoilMotion & + , DestMesh = y%ReactionForce & + , CtrlCode = MESH_SIBLING & + , IOS = COMPONENT_OUTPUT & + , Force = .TRUE. & + , Moment = .TRUE. & + , ErrStat = ErrStat2 & + , ErrMess = ErrMsg2 ) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + if (ErrStat>=AbortErrLev) RETURN + + + + end subroutine SoilDyn_InitMeshes end subroutine SoilDyn_Init @@ -301,6 +412,7 @@ subroutine SoilDyn_UpdateStates( t, n, Inputs, InputTimes, p, x, xd, z, OtherSta ErrStat = ErrID_None ! no error has occurred ErrMsg = "" +!FIXME: is this even needed? We don't have states that we have access to when using the REDWIN dll ! This subroutine contains an example of how the states could be updated. Developers will ! want to adjust the logic as necessary for their own situations. @@ -337,29 +449,55 @@ end subroutine SoilDyn_UpdateStates !> This is a routine for computing outputs, used in both loose and tight coupling. subroutine SoilDyn_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) - real(DbKi), intent(in ) :: t !< Current simulation time in seconds - type(SlD_InputType), intent(in ) :: u !< Inputs at t - type(SlD_ParameterType), intent(in ) :: p !< Parameters - type(SlD_ContinuousStateType), intent(in ) :: x !< Continuous states at t - type(SlD_DiscreteStateType), intent(in ) :: xd !< Discrete states at t - type(SlD_ConstraintStateType), intent(in ) :: z !< Constraint states at t - type(SlD_OtherStateType), intent(in ) :: OtherState !< Other states at t - type(SlD_MiscVarType), intent(inout) :: m !< Misc variables for optimization (not copied in glue code) - type(SlD_OutputType), intent(inout) :: y !< Outputs computed at t (Input only so that mesh con- + real(DbKi), intent(in ) :: t !< Current simulation time in seconds + type(SlD_InputType), intent(in ) :: u !< Inputs at t + type(SlD_ParameterType), intent(in ) :: p !< Parameters + type(SlD_ContinuousStateType), intent(in ) :: x !< Continuous states at t + type(SlD_DiscreteStateType), intent(in ) :: xd !< Discrete states at t + type(SlD_ConstraintStateType), intent(in ) :: z !< Constraint states at t + type(SlD_OtherStateType), intent(in ) :: OtherState !< Other states at t + type(SlD_MiscVarType), intent(inout) :: m !< Misc variables for optimization (not copied in glue code) + type(SlD_OutputType), intent(inout) :: y !< Outputs computed at t (Input only so that mesh con- !! nectivity information does not have to be recalculated) - integer(IntKi), intent( out) :: ErrStat !< Error status of the operation - character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + integer(IntKi), intent( out) :: ErrStat !< Error status of the operation + character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + integer(IntKi) :: ErrStat2 ! local error status + character(ErrMsgLen) :: ErrMsg2 ! local error message + character(*), parameter :: RoutineName = 'SoilDyn_CalcOutput' + real(R8Ki) :: Displacement(6) + real(ReKi) :: Force(6) + integer(IntKi) :: i !< generic counter ! Initialize ErrStat ErrStat = ErrID_None ErrMsg = "" +!FIXME: wrap logic around this for option 3 only + ! Initialize the dll + do i=1,size(m%dll_data) + + ! Copy displacement from point mesh + Displacement(1:3) = u%SoilMotion%TranslationDisp(1:3,i) ! Translations -- This is R8Ki in the mesh + Displacement(4:6) = EulerExtract(u%SoilMotion%Orientation(1:3,1:3,i)) ! Small angle assumption should be valid here -- Note we are assuming reforientation is 0 + call REDWINinterface_CalcOutput( p%DLL_Trgt, p%DLL_Model, Displacement, Force, m%dll_data(i), ErrStat2, ErrMsg2 ); if (Failed()) return; + + ! Return force onto the resulting point mesh + y%ReactionForce%Force (1:3,i) = Force(1:3) + y%ReactionForce%Moment(1:3,i) = Force(4:6) +write(*,'(f12.5,6(2x,ES12.5E2))') t,Force(1:6) + enddo + ! Compute outputs here: - y%DummyOutput = 2.0_ReKi y%WriteOutput(1) = REAL(t,ReKi) y%WriteOutput(2) = 1.0_ReKi +contains + logical function Failed() + call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + Failed = ErrStat >= AbortErrLev + end function Failed end subroutine SoilDyn_CalcOutput diff --git a/modules/soildyn/src/SoilDyn_IO.f90 b/modules/soildyn/src/SoilDyn_IO.f90 index 3f196fd55..10fb5a2e7 100644 --- a/modules/soildyn/src/SoilDyn_IO.f90 +++ b/modules/soildyn/src/SoilDyn_IO.f90 @@ -147,7 +147,7 @@ subroutine SoilDyn_ReadInput( InputFileName, EchoFileName, InputFileData, ErrSta !------------------------------------------------------------------------------------------------- - !> Read Stiffness / Damping section [ CalcOption == 1 only ] + !> Read Stiffness / Damping section [ CalcOption == 1 only ] Calc_StiffDamp !------------------------------------------------------------------------------------------------- call ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line', TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; @@ -171,14 +171,14 @@ subroutine SoilDyn_ReadInput( InputFileName, EchoFileName, InputFileData, ErrSta enddo !------------------------------------------------------------------------------------------------- - !> Read P-Y curve section [ CalcOption == 2 only ] + !> Read P-Y curve section [ CalcOption == 2 only ] Calc_PYcurve !------------------------------------------------------------------------------------------------- call ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line', TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; call ReadVar( UnitInput, InputFileName, InputFileData%PY_NumPoints, "PY_NumPoints", "Number of PY curve points", TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; ! Allocate arrays to hold the information that will be read in next - allocate( InputFileData%PY_locations(InputFileData%PY_NumPoints,3), STAT=TmpErrStat ) + allocate( InputFileData%PY_locations(3,InputFileData%PY_NumPoints), STAT=TmpErrStat ) if (TmpErrStat /= 0) call SetErrStat(ErrID_Fatal, 'Could not allocate PY_locations', ErrStat, ErrMsg, RoutineName) allocate( InputFileData%PY_inputFile(InputFileData%PY_NumPoints), STAT=TmpErrStat ) if (TmpErrStat /= 0) call SetErrStat(ErrID_Fatal, 'Could not allocate PY_inputFile', ErrStat, ErrMsg, RoutineName) @@ -197,7 +197,7 @@ subroutine SoilDyn_ReadInput( InputFileName, EchoFileName, InputFileData, ErrSta call SetErrStat( ErrID_Fatal, 'Error reading PY_curve line '//trim(Num2LStr(i))//' from '//InputFileName//'.', ErrStat, ErrMsg, RoutineName) return endif - READ( Line, *, IOSTAT=IOS) InputFileData%PY_locations(i,1:3), InputFileData%PY_inputFile(i) + READ( Line, *, IOSTAT=IOS) InputFileData%PY_locations(1:3,i), InputFileData%PY_inputFile(i) CALL CheckIOS ( IOS, InputFileName, 'DT', NumType, TmpErrStat, TmpErrMsg ); if (Failed()) return; ! NOTE: unclear if the message returned will match what was misread. ! Check for relative paths in the file names @@ -206,15 +206,16 @@ subroutine SoilDyn_ReadInput( InputFileName, EchoFileName, InputFileData, ErrSta ! Add stuff to echo file if it is used if ( InputFileData%EchoFlag ) then write(UnitEcho,*) ' Location ('//trim(Num2LStr(i))//')' - write(UnitEcho,*) InputFileData%PY_locations(i,1:3), trim(InputFileData%PY_inputFile(i)) + write(UnitEcho,*) InputFileData%PY_locations(1:3,i), trim(InputFileData%PY_inputFile(i)) endif enddo !------------------------------------------------------------------------------------------------- - !> Read REDWIN interface for DLL section [ CalcOption == 3 only ] + !> Read REDWIN interface for DLL section [ CalcOption == 3 only ] Calc_REDWIN !------------------------------------------------------------------------------------------------- + call ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line', TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; call ReadVar( UnitInput, InputFileName, InputFileData%DLL_model, "DLL_model", "REDWIN DLL model used", TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; @@ -227,7 +228,7 @@ subroutine SoilDyn_ReadInput( InputFileName, EchoFileName, InputFileData, ErrSta call ReadVar( UnitInput, InputFileName, InputFileData%DLL_NumPoints, "DLL_NumPoints", "Number of DLL interfaces", TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; ! Allocate arrays to hold the information that will be read in next - allocate( InputFileData%DLL_locations(InputFileData%DLL_NumPoints,3), STAT=TmpErrStat ) + allocate( InputFileData%DLL_locations(3,InputFileData%DLL_NumPoints), STAT=TmpErrStat ) if (TmpErrStat /= 0) call SetErrStat(ErrID_Fatal, 'Could not allocate DLL_locations', ErrStat, ErrMsg, RoutineName) allocate( InputFileData%DLL_PropsFile(InputFileData%DLL_NumPoints), STAT=TmpErrStat ) if (TmpErrStat /= 0) call SetErrStat(ErrID_Fatal, 'Could not allocate DLL_PropsFile', ErrStat, ErrMsg, RoutineName) @@ -248,7 +249,7 @@ subroutine SoilDyn_ReadInput( InputFileName, EchoFileName, InputFileData, ErrSta call SetErrStat( ErrID_Fatal, 'Error reading DLL_curve line '//trim(Num2LStr(i))//' from '//InputFileName//'.', ErrStat, ErrMsg, RoutineName) return endif - READ( Line, *, IOSTAT=IOS) InputFileData%DLL_locations(i,1:3), InputFileData%DLL_PropsFile(i), InputFileData%DLL_LDispFile(i) + READ( Line, *, IOSTAT=IOS) InputFileData%DLL_locations(1:3,i), InputFileData%DLL_PropsFile(i), InputFileData%DLL_LDispFile(i) CALL CheckIOS ( IOS, InputFileName, 'DLL info', NumType, TmpErrStat, TmpErrMsg ); if (Failed()) return; ! NOTE: unclear if the message returned will match what was misread. ! Check for relative paths in the file names @@ -258,7 +259,7 @@ subroutine SoilDyn_ReadInput( InputFileName, EchoFileName, InputFileData, ErrSta ! Add stuff to echo file if it is used if ( InputFileData%EchoFlag ) then write(UnitEcho,*) ' Location ('//trim(Num2LStr(i))//')' - write(UnitEcho,*) InputFileData%DLL_locations(i,1:3), trim(InputFileData%DLL_PropsFile(i)), ' ',trim(InputFileData%DLL_LDispFile(i)) + write(UnitEcho,*) InputFileData%DLL_locations(1:3,i), trim(InputFileData%DLL_PropsFile(i)), ' ',trim(InputFileData%DLL_LDispFile(i)) endif enddo @@ -331,6 +332,7 @@ SUBROUTINE SoilDyn_ValidateInput( InitInp, InputFileData, ErrStat, ErrMsg ) ErrStat = ErrID_None ErrMsg = "" +!FIXME: add validation routines CONTAINS subroutine ValidateStiffnessMatrix() ! Placeholder diff --git a/modules/soildyn/src/SoilDyn_Registry.txt b/modules/soildyn/src/SoilDyn_Registry.txt index 5e1176720..8d68a34ae 100644 --- a/modules/soildyn/src/SoilDyn_Registry.txt +++ b/modules/soildyn/src/SoilDyn_Registry.txt @@ -13,6 +13,12 @@ # ...... Include files (definitions from NWTC Library) ............................................................................ include Registry_NWTC_Library.txt +#Parameters CalcOptions: {1: Stiffness / Damping matrices [unavailable], 2: P-Y curves [unavailable], 3: coupled REDWIN DLL} +param SoilDyn/SlD - IntKi Calc_StiffDamp - 1 - "Stiffness / Damping calculations (currently unavailable)" - +param SoilDyn/SlD - IntKi Calc_PYcurve - 2 - "P-Y curve calculations (currently unavailable)" - +param SoilDyn/SlD - IntKi Calc_REDWIN - 3 - "Coupled to REDWIN dll for soil reaction forces" - + + # REDWIN interface DLL type # ..... Data for using REDWIN DLLs ....................................................................................................... @@ -54,8 +60,10 @@ typedef ^ SlD_InputFile IntKi NumOuts - - - "N # ..... Initialization data ....................................................................................................... # Define inputs that the initialization routine may need here: # e.g., the name of the input file, the file root name, etc. -typedef SoilDyn/SlD InitInputType CHARACTER(1024) InputFile - - - "Name of the input file; remove if there is no file" - -typedef ^ ^ LOGICAL Linearize - .FALSE. - "Flag that tells this module if the glue code wants to linearize." - +typedef ^ InitInputType CHARACTER(1024) InputFile - - - "Name of the input file; remove if there is no file" - +typedef ^ InitInputType LOGICAL Linearize - .FALSE. - "Flag that tells this module if the glue code wants to linearize." - +#FIXME: does the glue code need to inform us of the number of points? or do we do that in SoilDyn? +#typedef ^ InitInputType IntKi NumNodes - - - "Number of nodes we are using" - # Define outputs from the initialization routine here: typedef ^ InitOutputType CHARACTER(ChanLen) WriteOutputHdr {:} - - "Names of the output-to-file channels" - @@ -97,7 +105,7 @@ typedef ^ MiscVarType REDWINdllType dll_data # Define parameters here: # Time step for integration of continuous states (if a fixed-step integrator is used) and update of discrete states: typedef ^ ParameterType DbKi DT - - - "Time step for cont. state integration & disc. state update" seconds -typedef ^ ParameterType CHARACTER(1024) DLL_InFile - - - "Name of input file used in DLL" - +#typedef ^ ParameterType CHARACTER(1024) DLL_InFile - - - "Name of input file used in DLL" - typedef ^ ParameterType DLL_Type DLL_Trgt - - - "The addresses and names of the Bladed DLL and its procedure" - typedef ^ ParameterType DbKi DLL_DT - - - "Time step for DLL" seconds typedef ^ ParameterType CHARACTER(1024) RootName - - - "RootName for writing output files" - @@ -108,16 +116,10 @@ typedef ^ ParameterType CHARACTER(1024) SumFileName typedef ^ ParameterType IntKi DLL_model - - - "REDWIN DLL model type to use" - # ..... Inputs .................................................................................................................... -# Define inputs that are contained on the mesh here: -#typedef ^ InputType MeshType MeshedInput - - - "Meshed data" - -# Define inputs that are not on this mesh here: -typedef ^ InputType ReKi DummyInput - - - "Remove this variable if you have input data" - - +typedef ^ InputType MeshType SoilMotion - - - "Mesh of soil contact points" - # ..... Outputs ................................................................................................................... -# Define outputs that are contained on the mesh here: -#typedef SoilDyn SlD_OutputType MeshType MeshedOutput - - - "Meshed data" - -# Define outputs that are not on this mesh here: -typedef ^ OutputType ReKi DummyOutput - - - "Remove this variable if you have output data" - -typedef ^ ^ ReKi WriteOutput {:} - - "Example of data to be written to an output file" "s,-" +typedef ^ OutputType ReKi DummyOutput - - - "Remove this variable if you have output data" - +typedef ^ OutputType ReKi WriteOutput {:} - - "Example of data to be written to an output file" "s,-" +typedef ^ OutputType MeshType ReactionForce - - - "reaction forces and moments point mesh (may be multiple points)" - diff --git a/modules/soildyn/src/SoilDyn_Types.f90 b/modules/soildyn/src/SoilDyn_Types.f90 index 7b1b04f30..7a88eb881 100644 --- a/modules/soildyn/src/SoilDyn_Types.f90 +++ b/modules/soildyn/src/SoilDyn_Types.f90 @@ -33,6 +33,9 @@ MODULE SoilDyn_Types !--------------------------------------------------------------------------------------------------------------------------------- USE NWTC_Library IMPLICIT NONE + INTEGER(IntKi), PUBLIC, PARAMETER :: Calc_StiffDamp = 1 ! Stiffness / Damping calculations (currently unavailable) [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Calc_PYcurve = 2 ! P-Y curve calculations (currently unavailable) [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Calc_REDWIN = 3 ! Coupled to REDWIN dll for soil reaction forces [-] ! ========= REDWINdllType ======= TYPE, PUBLIC :: REDWINdllType character(45) :: PROPSFILE !< [-] @@ -112,7 +115,6 @@ MODULE SoilDyn_Types ! ========= SlD_ParameterType ======= TYPE, PUBLIC :: SlD_ParameterType REAL(DbKi) :: DT !< Time step for cont. state integration & disc. state update [seconds] - CHARACTER(1024) :: DLL_InFile !< Name of input file used in DLL [-] TYPE(DLL_Type) :: DLL_Trgt !< The addresses and names of the Bladed DLL and its procedure [-] REAL(DbKi) :: DLL_DT !< Time step for DLL [seconds] CHARACTER(1024) :: RootName !< RootName for writing output files [-] @@ -125,13 +127,14 @@ MODULE SoilDyn_Types ! ======================= ! ========= SlD_InputType ======= TYPE, PUBLIC :: SlD_InputType - REAL(ReKi) :: DummyInput !< Remove this variable if you have input data [-] + TYPE(MeshType) :: SoilMotion !< Mesh of soil contact points [-] END TYPE SlD_InputType ! ======================= ! ========= SlD_OutputType ======= TYPE, PUBLIC :: SlD_OutputType REAL(ReKi) :: DummyOutput !< Remove this variable if you have output data [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: WriteOutput !< Example of data to be written to an output file [s,-] + TYPE(MeshType) :: ReactionForce !< reaction forces and moments point mesh (may be multiple points) [-] END TYPE SlD_OutputType ! ======================= CONTAINS @@ -2241,7 +2244,6 @@ SUBROUTINE SlD_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg ErrStat = ErrID_None ErrMsg = "" DstParamData%DT = SrcParamData%DT - DstParamData%DLL_InFile = SrcParamData%DLL_InFile DstParamData%DLL_Trgt = SrcParamData%DLL_Trgt DstParamData%DLL_DT = SrcParamData%DLL_DT DstParamData%RootName = SrcParamData%RootName @@ -2300,7 +2302,6 @@ SUBROUTINE SlD_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, S Db_BufSz = 0 Int_BufSz = 0 Db_BufSz = Db_BufSz + 1 ! DT - Int_BufSz = Int_BufSz + 1*LEN(InData%DLL_InFile) ! DLL_InFile ! Allocate buffers for subtypes, if any (we'll get sizes from these) Int_BufSz = Int_BufSz + 3 ! DLL_Trgt: size of buffers for each call to pack subtype CALL DLLTypePack( InData%DLL_Trgt, Re_Buf, Db_Buf, Int_Buf, ErrStat2, ErrMsg2, .TRUE. ) ! DLL_Trgt @@ -2355,10 +2356,6 @@ SUBROUTINE SlD_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, S DbKiBuf ( Db_Xferred:Db_Xferred+(1)-1 ) = InData%DT Db_Xferred = Db_Xferred + 1 - DO I = 1, LEN(InData%DLL_InFile) - IntKiBuf(Int_Xferred) = ICHAR(InData%DLL_InFile(I:I), IntKi) - Int_Xferred = Int_Xferred + 1 - END DO ! I CALL DLLTypePack( InData%DLL_Trgt, Re_Buf, Db_Buf, Int_Buf, ErrStat2, ErrMsg2, OnlySize ) ! DLL_Trgt CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -2445,10 +2442,6 @@ SUBROUTINE SlD_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg Int_Xferred = 1 OutData%DT = DbKiBuf( Db_Xferred ) Db_Xferred = Db_Xferred + 1 - DO I = 1, LEN(OutData%DLL_InFile) - OutData%DLL_InFile(I:I) = CHAR(IntKiBuf(Int_Xferred)) - Int_Xferred = Int_Xferred + 1 - END DO ! I Buf_size=IntKiBuf( Int_Xferred ) Int_Xferred = Int_Xferred + 1 IF(Buf_size > 0) THEN @@ -2514,7 +2507,7 @@ SUBROUTINE SlD_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg END SUBROUTINE SlD_UnPackParam SUBROUTINE SlD_CopyInput( SrcInputData, DstInputData, CtrlCode, ErrStat, ErrMsg ) - TYPE(SlD_InputType), INTENT(IN) :: SrcInputData + TYPE(SlD_InputType), INTENT(INOUT) :: SrcInputData TYPE(SlD_InputType), INTENT(INOUT) :: DstInputData INTEGER(IntKi), INTENT(IN ) :: CtrlCode INTEGER(IntKi), INTENT( OUT) :: ErrStat @@ -2527,7 +2520,9 @@ SUBROUTINE SlD_CopyInput( SrcInputData, DstInputData, CtrlCode, ErrStat, ErrMsg ! ErrStat = ErrID_None ErrMsg = "" - DstInputData%DummyInput = SrcInputData%DummyInput + CALL MeshCopy( SrcInputData%SoilMotion, DstInputData%SoilMotion, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat>=AbortErrLev) RETURN END SUBROUTINE SlD_CopyInput SUBROUTINE SlD_DestroyInput( InputData, ErrStat, ErrMsg ) @@ -2539,6 +2534,7 @@ SUBROUTINE SlD_DestroyInput( InputData, ErrStat, ErrMsg ) ! ErrStat = ErrID_None ErrMsg = "" + CALL MeshDestroy( InputData%SoilMotion, ErrStat, ErrMsg ) END SUBROUTINE SlD_DestroyInput SUBROUTINE SlD_PackInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) @@ -2576,7 +2572,24 @@ SUBROUTINE SlD_PackInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, S Re_BufSz = 0 Db_BufSz = 0 Int_BufSz = 0 - Re_BufSz = Re_BufSz + 1 ! DummyInput + ! Allocate buffers for subtypes, if any (we'll get sizes from these) + Int_BufSz = Int_BufSz + 3 ! SoilMotion: size of buffers for each call to pack subtype + CALL MeshPack( InData%SoilMotion, Re_Buf, Db_Buf, Int_Buf, ErrStat2, ErrMsg2, .TRUE. ) ! SoilMotion + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! SoilMotion + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! SoilMotion + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! SoilMotion + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) THEN @@ -2604,8 +2617,34 @@ SUBROUTINE SlD_PackInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, S Db_Xferred = 1 Int_Xferred = 1 - ReKiBuf ( Re_Xferred:Re_Xferred+(1)-1 ) = InData%DummyInput - Re_Xferred = Re_Xferred + 1 + CALL MeshPack( InData%SoilMotion, Re_Buf, Db_Buf, Int_Buf, ErrStat2, ErrMsg2, OnlySize ) ! SoilMotion + 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 END SUBROUTINE SlD_PackInput SUBROUTINE SlD_UnPackInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) @@ -2640,12 +2679,50 @@ SUBROUTINE SlD_UnPackInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg Re_Xferred = 1 Db_Xferred = 1 Int_Xferred = 1 - OutData%DummyInput = ReKiBuf( Re_Xferred ) - Re_Xferred = Re_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 MeshUnpack( OutData%SoilMotion, Re_Buf, Db_Buf, Int_Buf, ErrStat2, ErrMsg2 ) ! SoilMotion + 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) END SUBROUTINE SlD_UnPackInput SUBROUTINE SlD_CopyOutput( SrcOutputData, DstOutputData, CtrlCode, ErrStat, ErrMsg ) - TYPE(SlD_OutputType), INTENT(IN) :: SrcOutputData + TYPE(SlD_OutputType), INTENT(INOUT) :: SrcOutputData TYPE(SlD_OutputType), INTENT(INOUT) :: DstOutputData INTEGER(IntKi), INTENT(IN ) :: CtrlCode INTEGER(IntKi), INTENT( OUT) :: ErrStat @@ -2672,6 +2749,9 @@ SUBROUTINE SlD_CopyOutput( SrcOutputData, DstOutputData, CtrlCode, ErrStat, ErrM END IF DstOutputData%WriteOutput = SrcOutputData%WriteOutput ENDIF + CALL MeshCopy( SrcOutputData%ReactionForce, DstOutputData%ReactionForce, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat>=AbortErrLev) RETURN END SUBROUTINE SlD_CopyOutput SUBROUTINE SlD_DestroyOutput( OutputData, ErrStat, ErrMsg ) @@ -2686,6 +2766,7 @@ SUBROUTINE SlD_DestroyOutput( OutputData, ErrStat, ErrMsg ) IF (ALLOCATED(OutputData%WriteOutput)) THEN DEALLOCATE(OutputData%WriteOutput) ENDIF + CALL MeshDestroy( OutputData%ReactionForce, ErrStat, ErrMsg ) END SUBROUTINE SlD_DestroyOutput SUBROUTINE SlD_PackOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) @@ -2729,6 +2810,24 @@ SUBROUTINE SlD_PackOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, Int_BufSz = Int_BufSz + 2*1 ! WriteOutput upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%WriteOutput) ! WriteOutput END IF + ! Allocate buffers for subtypes, if any (we'll get sizes from these) + Int_BufSz = Int_BufSz + 3 ! ReactionForce: size of buffers for each call to pack subtype + CALL MeshPack( InData%ReactionForce, Re_Buf, Db_Buf, Int_Buf, ErrStat2, ErrMsg2, .TRUE. ) ! ReactionForce + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! ReactionForce + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! ReactionForce + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! ReactionForce + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) THEN @@ -2771,6 +2870,34 @@ SUBROUTINE SlD_PackOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, IF (SIZE(InData%WriteOutput)>0) ReKiBuf ( Re_Xferred:Re_Xferred+(SIZE(InData%WriteOutput))-1 ) = PACK(InData%WriteOutput,.TRUE.) Re_Xferred = Re_Xferred + SIZE(InData%WriteOutput) END IF + CALL MeshPack( InData%ReactionForce, Re_Buf, Db_Buf, Int_Buf, ErrStat2, ErrMsg2, OnlySize ) ! ReactionForce + 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 END SUBROUTINE SlD_PackOutput SUBROUTINE SlD_UnPackOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) @@ -2831,6 +2958,46 @@ SUBROUTINE SlD_UnPackOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMs Re_Xferred = Re_Xferred + SIZE(OutData%WriteOutput) DEALLOCATE(mask1) END IF + 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 MeshUnpack( OutData%ReactionForce, Re_Buf, Db_Buf, Int_Buf, ErrStat2, ErrMsg2 ) ! ReactionForce + 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) END SUBROUTINE SlD_UnPackOutput @@ -2850,7 +3017,7 @@ SUBROUTINE SlD_Input_ExtrapInterp(u, t, u_out, t_out, ErrStat, ErrMsg ) ! !.................................................................................................................................. - TYPE(SlD_InputType), INTENT(IN) :: u(:) ! Input at t1 > t2 > t3 + TYPE(SlD_InputType), INTENT(INOUT) :: u(:) ! Input at t1 > t2 > t3 REAL(DbKi), INTENT(IN ) :: t(:) ! Times associated with the Inputs TYPE(SlD_InputType), INTENT(INOUT) :: u_out ! Input at tin_out REAL(DbKi), INTENT(IN ) :: t_out ! time to be extrap/interp'd to @@ -2897,8 +3064,8 @@ SUBROUTINE SlD_Input_ExtrapInterp1(u1, u2, tin, u_out, tin_out, ErrStat, ErrMsg ! !.................................................................................................................................. - TYPE(SlD_InputType), INTENT(IN) :: u1 ! Input at t1 > t2 - TYPE(SlD_InputType), INTENT(IN) :: u2 ! Input at t2 + TYPE(SlD_InputType), INTENT(INOUT) :: u1 ! Input at t1 > t2 + TYPE(SlD_InputType), INTENT(INOUT) :: u2 ! Input at t2 REAL(DbKi), INTENT(IN ) :: tin(2) ! Times associated with the Inputs TYPE(SlD_InputType), INTENT(INOUT) :: u_out ! Input at tin_out REAL(DbKi), INTENT(IN ) :: tin_out ! time to be extrap/interp'd to @@ -2924,8 +3091,8 @@ SUBROUTINE SlD_Input_ExtrapInterp1(u1, u2, tin, u_out, tin_out, ErrStat, ErrMsg CALL SetErrStat(ErrID_Fatal, 't(1) must not equal t(2) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) RETURN END IF - b0 = -(u1%DummyInput - u2%DummyInput)/t(2) - u_out%DummyInput = u1%DummyInput + b0 * t_out + CALL MeshExtrapInterp1(u1%SoilMotion, u2%SoilMotion, tin, u_out%SoilMotion, tin_out, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) END SUBROUTINE SlD_Input_ExtrapInterp1 @@ -2943,9 +3110,9 @@ SUBROUTINE SlD_Input_ExtrapInterp2(u1, u2, u3, tin, u_out, tin_out, ErrStat, Err ! !.................................................................................................................................. - TYPE(SlD_InputType), INTENT(IN) :: u1 ! Input at t1 > t2 > t3 - TYPE(SlD_InputType), INTENT(IN) :: u2 ! Input at t2 > t3 - TYPE(SlD_InputType), INTENT(IN) :: u3 ! Input at t3 + TYPE(SlD_InputType), INTENT(INOUT) :: u1 ! Input at t1 > t2 > t3 + TYPE(SlD_InputType), INTENT(INOUT) :: u2 ! Input at t2 > t3 + TYPE(SlD_InputType), INTENT(INOUT) :: u3 ! Input at t3 REAL(DbKi), INTENT(IN ) :: tin(3) ! Times associated with the Inputs TYPE(SlD_InputType), INTENT(INOUT) :: u_out ! Input at tin_out REAL(DbKi), INTENT(IN ) :: tin_out ! time to be extrap/interp'd to @@ -2978,9 +3145,8 @@ SUBROUTINE SlD_Input_ExtrapInterp2(u1, u2, u3, tin, u_out, tin_out, ErrStat, Err CALL SetErrStat(ErrID_Fatal, 't(1) must not equal t(3) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) RETURN END IF - b0 = (t(3)**2*(u1%DummyInput - u2%DummyInput) + t(2)**2*(-u1%DummyInput + u3%DummyInput))/(t(2)*t(3)*(t(2) - t(3))) - c0 = ( (t(2)-t(3))*u1%DummyInput + t(3)*u2%DummyInput - t(2)*u3%DummyInput ) / (t(2)*t(3)*(t(2) - t(3))) - u_out%DummyInput = u1%DummyInput + b0 * t_out + c0 * t_out**2 + CALL MeshExtrapInterp2(u1%SoilMotion, u2%SoilMotion, u3%SoilMotion, tin, u_out%SoilMotion, tin_out, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) END SUBROUTINE SlD_Input_ExtrapInterp2 @@ -3000,7 +3166,7 @@ SUBROUTINE SlD_Output_ExtrapInterp(y, t, y_out, t_out, ErrStat, ErrMsg ) ! !.................................................................................................................................. - TYPE(SlD_OutputType), INTENT(IN) :: y(:) ! Output at t1 > t2 > t3 + TYPE(SlD_OutputType), INTENT(INOUT) :: y(:) ! Output at t1 > t2 > t3 REAL(DbKi), INTENT(IN ) :: t(:) ! Times associated with the Outputs TYPE(SlD_OutputType), INTENT(INOUT) :: y_out ! Output at tin_out REAL(DbKi), INTENT(IN ) :: t_out ! time to be extrap/interp'd to @@ -3047,8 +3213,8 @@ SUBROUTINE SlD_Output_ExtrapInterp1(y1, y2, tin, y_out, tin_out, ErrStat, ErrMsg ! !.................................................................................................................................. - TYPE(SlD_OutputType), INTENT(IN) :: y1 ! Output at t1 > t2 - TYPE(SlD_OutputType), INTENT(IN) :: y2 ! Output at t2 + TYPE(SlD_OutputType), INTENT(INOUT) :: y1 ! Output at t1 > t2 + TYPE(SlD_OutputType), INTENT(INOUT) :: y2 ! Output at t2 REAL(DbKi), INTENT(IN ) :: tin(2) ! Times associated with the Outputs TYPE(SlD_OutputType), INTENT(INOUT) :: y_out ! Output at tin_out REAL(DbKi), INTENT(IN ) :: tin_out ! time to be extrap/interp'd to @@ -3086,6 +3252,8 @@ SUBROUTINE SlD_Output_ExtrapInterp1(y1, y2, tin, y_out, tin_out, ErrStat, ErrMsg DEALLOCATE(b1) DEALLOCATE(c1) END IF ! check if allocated + CALL MeshExtrapInterp1(y1%ReactionForce, y2%ReactionForce, tin, y_out%ReactionForce, tin_out, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) END SUBROUTINE SlD_Output_ExtrapInterp1 @@ -3103,9 +3271,9 @@ SUBROUTINE SlD_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat, Er ! !.................................................................................................................................. - TYPE(SlD_OutputType), INTENT(IN) :: y1 ! Output at t1 > t2 > t3 - TYPE(SlD_OutputType), INTENT(IN) :: y2 ! Output at t2 > t3 - TYPE(SlD_OutputType), INTENT(IN) :: y3 ! Output at t3 + TYPE(SlD_OutputType), INTENT(INOUT) :: y1 ! Output at t1 > t2 > t3 + TYPE(SlD_OutputType), INTENT(INOUT) :: y2 ! Output at t2 > t3 + TYPE(SlD_OutputType), INTENT(INOUT) :: y3 ! Output at t3 REAL(DbKi), INTENT(IN ) :: tin(3) ! Times associated with the Outputs TYPE(SlD_OutputType), INTENT(INOUT) :: y_out ! Output at tin_out REAL(DbKi), INTENT(IN ) :: tin_out ! time to be extrap/interp'd to @@ -3152,6 +3320,8 @@ SUBROUTINE SlD_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat, Er DEALLOCATE(b1) DEALLOCATE(c1) END IF ! check if allocated + CALL MeshExtrapInterp2(y1%ReactionForce, y2%ReactionForce, y3%ReactionForce, tin, y_out%ReactionForce, tin_out, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) END SUBROUTINE SlD_Output_ExtrapInterp2 END MODULE SoilDyn_Types From 84b3c0c6a4f1efa0e9f0d5ad60277b3f8a4d8002 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Mon, 2 Mar 2020 15:16:44 -0700 Subject: [PATCH 039/136] SlD: update driver to loop through displacements from input file --- modules/soildyn/src/driver/SoilDyn_Driver.f90 | 104 +++++++++++++++--- .../src/driver/SoilDyn_Driver_Subs.f90 | 8 +- .../src/driver/SoilDyn_Driver_Types.f90 | 2 +- 3 files changed, 94 insertions(+), 20 deletions(-) diff --git a/modules/soildyn/src/driver/SoilDyn_Driver.f90 b/modules/soildyn/src/driver/SoilDyn_Driver.f90 index b7215e3ac..1d51fb5b4 100644 --- a/modules/soildyn/src/driver/SoilDyn_Driver.f90 +++ b/modules/soildyn/src/driver/SoilDyn_Driver.f90 @@ -25,6 +25,7 @@ PROGRAM SoilDyn_Driver USE SoilDyn_Types USE SoilDyn_Driver_Subs USE SoilDyn_Driver_Types + USE REDWINinterface, only: REDWINinterface_GetStiffMatrix IMPLICIT NONE @@ -38,6 +39,10 @@ PROGRAM SoilDyn_Driver ! Program variables real(DbKi) :: Time !< Variable for storing time, in seconds real(DbKi) :: TimeInterval !< Interval between time steps, in seconds + real(DbKi) :: TStart !< Time to start + real(DbKi) :: TMax !< Maximum time if found by default + integer(IntKi) :: NumTSteps !< number of timesteps + logical :: TimeIntervalFound !< Interval between time steps, in seconds real(DbKi) :: InputTime(NumInp) !< Variable for storing time associated with inputs, in seconds real(ReKi), allocatable :: DisplacementList(:,:) !< List of displacements and times to apply @@ -63,9 +68,14 @@ PROGRAM SoilDyn_Driver REAL(DbKi) :: Timer(1:2) ! Keep track of how long this takes to run REAL(DbKi) :: TimeNow ! The current time + ! Data transfer + real(ReKi) :: Force(6) + real(ReKi) :: Displacement(6) + real(ReKi) :: StiffMatrix(6,6) INTEGER(IntKi) :: n !< Loop counter (for time step) + integer(IntKi) :: i !< generic loop counter INTEGER(IntKi) :: ErrStat !< Status of error message CHARACTER(ErrMsgLen) :: ErrMsg !< Error message if ErrStat /= ErrID_None @@ -163,53 +173,117 @@ PROGRAM SoilDyn_Driver !------------------------------------------ ! Read DisplacementList from InputDispFile + ! NOTE: DiplacementList + ! -- index 1 = [T, dX, dY, dZ, dTheta_X, dTheta_Y, dTheta_Z] + ! -- index 2 = time step !------------------------------------------ if ( SettingsFlags%InputDispFile ) then call ReadInputDispFile( Settings%InputDispFile, DisplacementList, ErrStat, ErrMsg ) call CheckErr('') -!FIXME: check default timestep based on DisplacementList if ( SlDDriver_Verbose >= 10_IntKi ) call WrScr('Input Displacements given for '//trim(Num2LStr(size(DisplacementList,2)))// & - ' from T = '//trim(Num2LStr(DisplacementList(1,1)))//' to '//trim(Num2LStr(DisplacementList(1,size(DisplacementList,2))))//' seconds.') + ' time steps from T = '//trim(Num2LStr(DisplacementList(1,1)))//' to '//trim(Num2LStr(DisplacementList(1,size(DisplacementList,2))))//' seconds.') endif - !............................................................................................................................... - ! Routines called in initialization - !............................................................................................................................... + !------------------------------------------ + ! Logic for timestep and total time for sim. + !------------------------------------------ + if ( SettingsFlags%TStart ) then + TStart = Settings%TStart + else + TStart = 0.0_DbKi + ! TODO: if using the input file, could start at the initial time given there (set the TStart with a "default" input option) + endif - ! Populate the InitInData data structure here: - InitInData%InputFile = 'RedWin1_Win32.ipt' - ! Set the driver's request for time interval here: + TimeIntervalFound=.true. ! If specified or default value set + ! DT - timestep. If default was specified, then calculate default level. + if ( SettingsFlags%DTdefault ) then + if ( SettingsFlags%InputDispFile ) then + ! Set a value to start with (something larger than any expected DT). + TimeIntervalFound=.false. + TimeInterval=1000.0_DbKi + ! Step through all lines to get smallest DT + do n=min(2,size(DisplacementList,2)),size(DisplacementList,2) ! Start at 2nd point (min to avoid stepping over end for single line files) + TimeInterval=min(TimeInterval, real(DisplacementList(1,n)-DisplacementList(1,n-1), DbKi)) + TimeIntervalFound=.true. + enddo + if (TimeIntervalFound) then + call WrScr('Using smallest DT from data file: '//trim(Num2LStr(TimeInterval))//' seconds.') + else + call WrScr('No time timesteps found in input displacement file. Using only one timestep.') + endif + else + ! set default level. NOTE: the REDWIN dll does not use any form of timestep, so this is merely for bookkeeping. + TimeInterval = 0.01_DbKi + call WrScr('Setting default timestep to '//trim(Num2LStr(TimeInterval))//' seconds.') + endif + endif + - TimeInterval = 0.25 ! Glue code's request for delta time (likely based on information from other modules) + ! TMax and NumTSteps from input file or from the value specified (specified overrides) + if ( SettingsFlags%NumTimeStepsDefault ) then + if ( SettingsFlags%InputDispFile ) then + TMax = real(DisplacementList(1,size(DisplacementList,2)), DbKi) + NumTSteps = ceiling( TMax / TimeInterval ) + else ! Do one timestep + NumTSteps = 1_IntKi + TMax = TimeInterval * NumTSteps + endif + elseif ( SettingsFlags%NumTimeSteps ) then ! Override with number of timesteps + TMax = TimeInterval * Settings%NumTimeSteps + TStart + NumTSteps = Settings%NumTimeSteps + else + NumTSteps = 1_IntKi + TMax = TimeInterval * NumTSteps + endif - ! Initialize the module + + ! Routines called in initialization + !............................................................................................................................... + + InitInData%InputFile = Settings%SldIptFileName + + ! Initialize the module CALL SoilDyn_Init( InitInData, u(1), p, x, xd, z, OtherState, y, misc, TimeInterval, InitOutData, ErrStat, ErrMsg ) IF ( ErrStat /= ErrID_None ) THEN ! Check if there was an error and do something about it if necessary CALL WrScr( 'After Init: '//ErrMsg ) if ( ErrStat >= AbortErrLev ) call ProgEnd() END IF - - ! Destroy initialization data + ! Destroy initialization data CALL SlD_DestroyInitInput( InitInData, ErrStat, ErrMsg ) CALL SlD_DestroyInitOutput( InitOutData, ErrStat, ErrMsg ) - !............................................................................................................................... + ! If requested, get the stiffness matrix + if ( SettingsFlags%StiffMatOut ) then + do i=1,size(misc%dll_data) + Displacement = 0.0_ReKi + call REDWINinterface_GetStiffMatrix( p%DLL_Trgt, p%DLL_Model, Displacement, Force, StiffMatrix, misc%dll_data(i), ErrStat, ErrMsg ) + IF ( ErrStat /= ErrID_None ) THEN ! Check if there was an error and do something about it if necessary + CALL WrScr( 'Get stiffness: '//ErrMsg ) + if ( ErrStat >= AbortErrLev ) call ProgEnd() + END IF + + call WrScr('Stiffness matrix for point '//trim(Num2LStr(i))//' at T=0:') + call WrMatrix( StiffMatrix, CU, '(ES12.4)', 'StiffMatrix' ) + enddo + endif + + ! Routines called in loose coupling -- the glue code may implement this in various ways !............................................................................................................................... - DO n = 0,2 + DO n = 0,NumTSteps Time = n*TimeInterval InputTime(1) = Time - ! Modify u (likely from the outputs of another module or a set of test conditions) here: + ! Calculate outputs at n CALL SoilDyn_CalcOutput( Time, u(1), p, x, xd, z, OtherState, y, misc, ErrStat, ErrMsg ); diff --git a/modules/soildyn/src/driver/SoilDyn_Driver_Subs.f90 b/modules/soildyn/src/driver/SoilDyn_Driver_Subs.f90 index b607239c9..20585005e 100644 --- a/modules/soildyn/src/driver/SoilDyn_Driver_Subs.f90 +++ b/modules/soildyn/src/driver/SoilDyn_Driver_Subs.f90 @@ -528,7 +528,7 @@ SUBROUTINE ReadDvrIptFile( DvrFileName, DvrFlags, DvrSettings, ProgInfo, ErrStat ! Check if we asked for the DEFAULT (use what is in the file) CALL Conv2UC( InputChr ) IF ( TRIM(InputChr) == 'DEFAULT' ) THEN ! we asked for the default value - DvrFlags%NumTimeSteps = .TRUE. + DvrFlags%NumTimeSteps = .FALSE. DvrFlags%NumTimeStepsDefault = .TRUE. ! This flag tells us to use the inflow wind file values ELSE ! We probably have a number if it isn't 'DEFAULT', so do an internal read and check to @@ -701,7 +701,7 @@ END SUBROUTINE UpdateSettingsWithCL SUBROUTINE ReadInputDispFile( InputDispFile, DisplacementList, ErrStat, ErrMsg ) CHARACTER(1024), INTENT(IN ) :: InputDispFile !< Name of the points file to read - REAL(ReKi), ALLOCATABLE, INTENT( OUT) :: DisplacementList(:,:) !< The coordinates we read in + REAL(ReKi), ALLOCATABLE, INTENT( OUT) :: DisplacementList(:,:) !< The coordinates we read in: idx 1 = values, idx 2 = timestep INTEGER(IntKi), INTENT( OUT) :: ErrStat !< The error status CHARACTER(*), INTENT( OUT) :: ErrMsg !< The message for the status @@ -735,7 +735,7 @@ SUBROUTINE ReadInputDispFile( InputDispFile, DisplacementList, ErrStat, ErrMsg ) IF ( NumDataColumns /= 7 ) THEN ErrStatTmp = ErrID_Fatal ErrMsgTmp = ' Expecting seven columns in '//TRIM(InputDispFile)//' corresponding to '// & - 'time, X, Y, Z, Rx, Ry, Rz coordinates. Instead found '//TRIM(Num2LStr(NumDataColumns))//'.' + 'time, dX, dY, dZ, dTheta_X, dTheta_Y, dTheta_Z coordinates. Instead found '//TRIM(Num2LStr(NumDataColumns))//' columns.' if (Failed()) return ENDIF @@ -753,7 +753,7 @@ SUBROUTINE ReadInputDispFile( InputDispFile, DisplacementList, ErrStat, ErrMsg ) ! Read in the datapoints DO I=1,NumDataPoints - CALL ReadAry ( FiUnitPoints, InputDispFile, DisplacementList(:,I), 3, 'DisplacementList', & + CALL ReadAry ( FiUnitPoints, InputDispFile, DisplacementList(:,I), 7, 'DisplacementList', & 'Coordinate point from Points file', ErrStatTmp, ErrMsgTmp) if (Failed()) return ENDDO diff --git a/modules/soildyn/src/driver/SoilDyn_Driver_Types.f90 b/modules/soildyn/src/driver/SoilDyn_Driver_Types.f90 index 578df40be..ac608b3c6 100644 --- a/modules/soildyn/src/driver/SoilDyn_Driver_Types.f90 +++ b/modules/soildyn/src/driver/SoilDyn_Driver_Types.f90 @@ -61,7 +61,7 @@ MODULE SoilDyn_Driver_Types INTEGER(IntKi) :: NumTimeSteps !< Number of timesteps REAL(DbKi) :: DT !< resolution of time - REAL(DbKi) :: TStart !< range of time -- end time converted from TRange (command line option only) + REAL(DbKi) :: TStart !< Start time TYPE(ProgDesc) :: ProgInfo !< Program info TYPE(ProgDesc) :: SlDProgInfo !< Program info for SoilDyn From 98363bde78e15d1e901de3aba10b5d362c2696b6 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Mon, 2 Mar 2020 15:23:16 -0700 Subject: [PATCH 040/136] SlD: update VS project --- vs-build/SoilDyn/SoilDyn.vfproj | 95 +++++++++++++++++---------------- 1 file changed, 48 insertions(+), 47 deletions(-) diff --git a/vs-build/SoilDyn/SoilDyn.vfproj b/vs-build/SoilDyn/SoilDyn.vfproj index 357c887e1..f2b87f8cf 100644 --- a/vs-build/SoilDyn/SoilDyn.vfproj +++ b/vs-build/SoilDyn/SoilDyn.vfproj @@ -94,191 +94,195 @@ - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + + + + + - - + + - - + + @@ -287,9 +291,6 @@ - - - From 8671cdd24430e381fa628f5338260cd63790d5c8 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Mon, 2 Mar 2020 16:13:47 -0700 Subject: [PATCH 041/136] SlD: add interpolation of input displacement file to driver --- modules/soildyn/src/SoilDyn.f90 | 7 +-- modules/soildyn/src/SoilDyn_Registry.txt | 1 + modules/soildyn/src/SoilDyn_Types.f90 | 7 +++ modules/soildyn/src/driver/SoilDyn_Driver.f90 | 46 +++++++++++++------ .../src/driver/SoilDyn_Driver_Subs.f90 | 16 +++---- 5 files changed, 51 insertions(+), 26 deletions(-) diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index e985b3fbb..d1269e321 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -111,8 +111,9 @@ subroutine SoilDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In call SoilDyn_ReadInput( InitInp%InputFile, p%EchoFileName, InputFileData, ErrStat2, ErrMsg2 ); if (Failed()) return; ! Define parameters here: - p%DT = Interval - p%DLL_Model = InputFileData%DLL_Model + p%DT = Interval + p%DLL_Model = InputFileData%DLL_Model + p%CalcOption = InputFileData%CalcOption ! Define initial system states here: x%DummyContState = 0.0_ReKi @@ -238,7 +239,7 @@ subroutine SoilDyn_InitMeshes( InputFileData, InitInp, u, y, p, m, ErrStat, ErrM integer(IntKi) :: NumPoints ! Number of points from input file real(ReKi), allocatable :: MeshLocations(:,:) - select case(InputFileData%CalcOption) + select case(p%CalcOption) case (Calc_StiffDamp) NumPoints = 1_IntKi !FIXME: update to allow more than one set of points diff --git a/modules/soildyn/src/SoilDyn_Registry.txt b/modules/soildyn/src/SoilDyn_Registry.txt index 8d68a34ae..f33d883a6 100644 --- a/modules/soildyn/src/SoilDyn_Registry.txt +++ b/modules/soildyn/src/SoilDyn_Registry.txt @@ -114,6 +114,7 @@ typedef ^ ParameterType CHARACTER(1024) RootFileName typedef ^ ParameterType CHARACTER(1024) EchoFileName - - - "Name of echo file" - typedef ^ ParameterType CHARACTER(1024) SumFileName - - - "Name of summary file" - typedef ^ ParameterType IntKi DLL_model - - - "REDWIN DLL model type to use" - +typedef ^ ParameterType IntKi CalcOption - - - "Calculation methodology to use" - # ..... Inputs .................................................................................................................... typedef ^ InputType MeshType SoilMotion - - - "Mesh of soil contact points" - diff --git a/modules/soildyn/src/SoilDyn_Types.f90 b/modules/soildyn/src/SoilDyn_Types.f90 index 7a88eb881..f4766ed63 100644 --- a/modules/soildyn/src/SoilDyn_Types.f90 +++ b/modules/soildyn/src/SoilDyn_Types.f90 @@ -123,6 +123,7 @@ MODULE SoilDyn_Types CHARACTER(1024) :: EchoFileName !< Name of echo file [-] CHARACTER(1024) :: SumFileName !< Name of summary file [-] INTEGER(IntKi) :: DLL_model !< REDWIN DLL model type to use [-] + INTEGER(IntKi) :: CalcOption !< Calculation methodology to use [-] END TYPE SlD_ParameterType ! ======================= ! ========= SlD_InputType ======= @@ -2252,6 +2253,7 @@ SUBROUTINE SlD_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg DstParamData%EchoFileName = SrcParamData%EchoFileName DstParamData%SumFileName = SrcParamData%SumFileName DstParamData%DLL_model = SrcParamData%DLL_model + DstParamData%CalcOption = SrcParamData%CalcOption END SUBROUTINE SlD_CopyParam SUBROUTINE SlD_DestroyParam( ParamData, ErrStat, ErrMsg ) @@ -2327,6 +2329,7 @@ SUBROUTINE SlD_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, S Int_BufSz = Int_BufSz + 1*LEN(InData%EchoFileName) ! EchoFileName Int_BufSz = Int_BufSz + 1*LEN(InData%SumFileName) ! SumFileName Int_BufSz = Int_BufSz + 1 ! DLL_model + Int_BufSz = Int_BufSz + 1 ! CalcOption IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) THEN @@ -2406,6 +2409,8 @@ SUBROUTINE SlD_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, S END DO ! I IntKiBuf ( Int_Xferred:Int_Xferred+(1)-1 ) = InData%DLL_model Int_Xferred = Int_Xferred + 1 + IntKiBuf ( Int_Xferred:Int_Xferred+(1)-1 ) = InData%CalcOption + Int_Xferred = Int_Xferred + 1 END SUBROUTINE SlD_PackParam SUBROUTINE SlD_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) @@ -2504,6 +2509,8 @@ SUBROUTINE SlD_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg END DO ! I OutData%DLL_model = IntKiBuf( Int_Xferred ) Int_Xferred = Int_Xferred + 1 + OutData%CalcOption = IntKiBuf( Int_Xferred ) + Int_Xferred = Int_Xferred + 1 END SUBROUTINE SlD_UnPackParam SUBROUTINE SlD_CopyInput( SrcInputData, DstInputData, CtrlCode, ErrStat, ErrMsg ) diff --git a/modules/soildyn/src/driver/SoilDyn_Driver.f90 b/modules/soildyn/src/driver/SoilDyn_Driver.f90 index 1d51fb5b4..e23032e98 100644 --- a/modules/soildyn/src/driver/SoilDyn_Driver.f90 +++ b/modules/soildyn/src/driver/SoilDyn_Driver.f90 @@ -44,7 +44,7 @@ PROGRAM SoilDyn_Driver integer(IntKi) :: NumTSteps !< number of timesteps logical :: TimeIntervalFound !< Interval between time steps, in seconds real(DbKi) :: InputTime(NumInp) !< Variable for storing time associated with inputs, in seconds - real(ReKi), allocatable :: DisplacementList(:,:) !< List of displacements and times to apply + real(R8Ki), allocatable :: DisplacementList(:,:) !< List of displacements and times to apply {idx 1 = time step, idx 2 = [T, dX, dY, dZ, dTheta_X, dTheta_Y, dTheta_Z]} type(SlD_InitInputType) :: InitInData !< Input data for initialization type(SlD_InitOutputType) :: InitOutData !< Output data from initialization @@ -70,12 +70,14 @@ PROGRAM SoilDyn_Driver ! Data transfer real(ReKi) :: Force(6) - real(ReKi) :: Displacement(6) + real(R8Ki) :: Displacement(6) real(ReKi) :: StiffMatrix(6,6) - + real(R8Ki) :: Theta(3) INTEGER(IntKi) :: n !< Loop counter (for time step) integer(IntKi) :: i !< generic loop counter + integer(IntKi) :: DimIdx !< Index of current dimension + integer(IntKi) :: TmpIdx(6) !< Index of last point accessed by dimension INTEGER(IntKi) :: ErrStat !< Status of error message CHARACTER(ErrMsgLen) :: ErrMsg !< Error message if ErrStat /= ErrID_None @@ -173,16 +175,16 @@ PROGRAM SoilDyn_Driver !------------------------------------------ ! Read DisplacementList from InputDispFile - ! NOTE: DiplacementList - ! -- index 1 = [T, dX, dY, dZ, dTheta_X, dTheta_Y, dTheta_Z] - ! -- index 2 = time step + ! NOTE: DiplacementList is arranged for speed in interpolation + ! -- index 1 = time step + ! -- index 2 = [T, dX, dY, dZ, dTheta_X, dTheta_Y, dTheta_Z] !------------------------------------------ if ( SettingsFlags%InputDispFile ) then call ReadInputDispFile( Settings%InputDispFile, DisplacementList, ErrStat, ErrMsg ) call CheckErr('') - if ( SlDDriver_Verbose >= 10_IntKi ) call WrScr('Input Displacements given for '//trim(Num2LStr(size(DisplacementList,2)))// & - ' time steps from T = '//trim(Num2LStr(DisplacementList(1,1)))//' to '//trim(Num2LStr(DisplacementList(1,size(DisplacementList,2))))//' seconds.') + if ( SlDDriver_Verbose >= 10_IntKi ) call WrScr('Input Displacements given for '//trim(Num2LStr(size(DisplacementList,1)))// & + ' time steps from T = '//trim(Num2LStr(DisplacementList(1,1)))//' to '//trim(Num2LStr(DisplacementList(size(DisplacementList,1),1)))//' seconds.') endif @@ -206,8 +208,8 @@ PROGRAM SoilDyn_Driver TimeIntervalFound=.false. TimeInterval=1000.0_DbKi ! Step through all lines to get smallest DT - do n=min(2,size(DisplacementList,2)),size(DisplacementList,2) ! Start at 2nd point (min to avoid stepping over end for single line files) - TimeInterval=min(TimeInterval, real(DisplacementList(1,n)-DisplacementList(1,n-1), DbKi)) + do n=min(2,size(DisplacementList,1)),size(DisplacementList,1) ! Start at 2nd point (min to avoid stepping over end for single line files) + TimeInterval=min(TimeInterval, real(DisplacementList(n,1)-DisplacementList(n-1,1), DbKi)) TimeIntervalFound=.true. enddo if (TimeIntervalFound) then @@ -226,7 +228,7 @@ PROGRAM SoilDyn_Driver ! TMax and NumTSteps from input file or from the value specified (specified overrides) if ( SettingsFlags%NumTimeStepsDefault ) then if ( SettingsFlags%InputDispFile ) then - TMax = real(DisplacementList(1,size(DisplacementList,2)), DbKi) + TMax = real(DisplacementList(size(DisplacementList,1),1), DbKi) NumTSteps = ceiling( TMax / TimeInterval ) else ! Do one timestep NumTSteps = 1_IntKi @@ -260,9 +262,9 @@ PROGRAM SoilDyn_Driver ! If requested, get the stiffness matrix - if ( SettingsFlags%StiffMatOut ) then + if ( SettingsFlags%StiffMatOut .and. p%CalcOption==Calc_REDWIN ) then do i=1,size(misc%dll_data) - Displacement = 0.0_ReKi + Displacement = 0.0_R8Ki call REDWINinterface_GetStiffMatrix( p%DLL_Trgt, p%DLL_Model, Displacement, Force, StiffMatrix, misc%dll_data(i), ErrStat, ErrMsg ) IF ( ErrStat /= ErrID_None ) THEN ! Check if there was an error and do something about it if necessary CALL WrScr( 'Get stiffness: '//ErrMsg ) @@ -279,11 +281,25 @@ PROGRAM SoilDyn_Driver !............................................................................................................................... + TmpIdx(1:6) = 0_IntKi + DO n = 0,NumTSteps - Time = n*TimeInterval + Time = n*TimeInterval+TStart InputTime(1) = Time - + ! interpolate into the input data to get the displacement. Set this as u then run + if ( SettingsFlags%InputDispFile ) then + do i=1,u(1)%SoilMotion%NNodes + ! InterpStpReal( X, Xary, Yary, indx, size) + do DimIdx=1,3 + u(1)%SoilMotion%TranslationDisp(DimIdx,i) = InterpStpReal8( real(Time,R8Ki), DisplacementList(:,1), DisplacementList(:,DimIdx+1), TmpIdx(DimIdx), size(DisplacementList,1) ) + enddo + do DimIdx=1,3 + Theta(DimIdx) = InterpStpReal8( real(Time,R8Ki), DisplacementList(:,1), DisplacementList(:,DimIdx+4), TmpIdx(DimIdx), size(DisplacementList,1) ) + enddo + u(1)%SoilMotion%Orientation(1:3,1:3,i) = EulerConstruct(Theta) + enddo + endif ! Calculate outputs at n CALL SoilDyn_CalcOutput( Time, u(1), p, x, xd, z, OtherState, y, misc, ErrStat, ErrMsg ); diff --git a/modules/soildyn/src/driver/SoilDyn_Driver_Subs.f90 b/modules/soildyn/src/driver/SoilDyn_Driver_Subs.f90 index 20585005e..27cc00e51 100644 --- a/modules/soildyn/src/driver/SoilDyn_Driver_Subs.f90 +++ b/modules/soildyn/src/driver/SoilDyn_Driver_Subs.f90 @@ -701,7 +701,7 @@ END SUBROUTINE UpdateSettingsWithCL SUBROUTINE ReadInputDispFile( InputDispFile, DisplacementList, ErrStat, ErrMsg ) CHARACTER(1024), INTENT(IN ) :: InputDispFile !< Name of the points file to read - REAL(ReKi), ALLOCATABLE, INTENT( OUT) :: DisplacementList(:,:) !< The coordinates we read in: idx 1 = values, idx 2 = timestep + REAL(R8Ki), ALLOCATABLE, INTENT( OUT) :: DisplacementList(:,:) !< The coordinates we read in: idx 1 = timestep, idx 2 = values INTEGER(IntKi), INTENT( OUT) :: ErrStat !< The error status CHARACTER(*), INTENT( OUT) :: ErrMsg !< The message for the status @@ -741,7 +741,7 @@ SUBROUTINE ReadInputDispFile( InputDispFile, DisplacementList, ErrStat, ErrMsg ) ! Allocate the storage for the data - CALL AllocAry( DisplacementList, 7, NumDataPoints, "Array of Points data", ErrStatTmp, ErrMsgTmp ) + CALL AllocAry( DisplacementList, NumDataPoints, 7, "Array of Points data", ErrStatTmp, ErrMsgTmp ) if (Failed()) return @@ -751,9 +751,9 @@ SUBROUTINE ReadInputDispFile( InputDispFile, DisplacementList, ErrStat, ErrMsg ) if (Failed()) return ENDDO - ! Read in the datapoints + ! Read in the datapoints -- This is arranged with time in first index for speed in later interpolation operations DO I=1,NumDataPoints - CALL ReadAry ( FiUnitPoints, InputDispFile, DisplacementList(:,I), 7, 'DisplacementList', & + CALL ReadAry ( FiUnitPoints, InputDispFile, DisplacementList(I,:), 7, 'DisplacementList', & 'Coordinate point from Points file', ErrStatTmp, ErrMsgTmp) if (Failed()) return ENDDO @@ -804,7 +804,7 @@ SUBROUTINE GetFileLength(UnitDataFile, DataFileName, NumDataColumns, NumDataLine CHARACTER(1024) :: TextLine !< One line of text read from the file INTEGER(IntKi) :: LineLen !< The length of the line read in CHARACTER(1024) :: StrRead !< String containing the first word read in - REAL(ReKi) :: RealRead !< Returns value of the number (if there was one), or NaN (as set by NWTC_Num) if there wasn't + REAL(R8Ki) :: RealRead !< Returns value of the number (if there was one), or NaN (as set by NWTC_Num) if there wasn't CHARACTER(1024) :: VarName !< Name of the variable we are trying to read from the file CHARACTER(24) :: Words(20) !< Array of words we extract from a line. We shouldn't have more than 20. INTEGER(IntKi) :: i,j,k !< simple integer counters @@ -867,7 +867,7 @@ SUBROUTINE GetFileLength(UnitDataFile, DataFileName, NumDataColumns, NumDataLine !> Now cycle through the first 'NumWords' of non-empty values stored in 'Words'. Words should contain !! everything that is one the line. The subroutine ReadRealNumberFromString will set a flag 'IsRealNum' - !! when the value in Words(i) can be read as a real(ReKi). 'StrRead' will contain the string equivalent. + !! when the value in Words(i) can be read as a real(R8Ki). 'StrRead' will contain the string equivalent. DO i=1,NumWords CALL ReadRealNumberFromString( Words(i), RealRead, StrRead, IsRealNum, ErrStatTmp, ErrMsgTmp, TmpIOErrStat ) IF ( .NOT. IsRealNum) LineHasText = .TRUE. @@ -933,7 +933,7 @@ END SUBROUTINE GetFileLength !------------------------------------------------------------------------------- SUBROUTINE ReadRealNumberFromString(StringToParse, ValueRead, StrRead, IsRealNum, ErrStat, ErrMsg, IOErrStat) CHARACTER(*), INTENT(IN ) :: StringToParse !< The string we were handed. - REAL(ReKi), INTENT( OUT) :: ValueRead !< The variable being read. Returns as NaN (library defined) if not a Real. + REAL(R8Ki), INTENT( OUT) :: ValueRead !< The variable being read. Returns as NaN (library defined) if not a Real. CHARACTER(*), INTENT( OUT) :: StrRead !< A string containing what was read from the ReadNum routine. LOGICAL, INTENT( OUT) :: IsRealNum !< Flag indicating if we successfully read a Real INTEGER(IntKi), INTENT( OUT) :: ErrStat !< ErrID level returned from ReadNum @@ -981,7 +981,7 @@ SUBROUTINE ReadRealNumber(UnitNum, FileName, VarName, VarRead, StrRead, IsRealNu INTEGER(IntKi), INTENT(IN ) :: UnitNum !< The unit number of the file being read CHARACTER(*), INTENT(IN ) :: FileName !< The name of the file being read. Used in the ErrMsg from ReadNum (Library routine). CHARACTER(*), INTENT(IN ) :: VarName !< The variable we are reading. Used in the ErrMsg from ReadNum (Library routine)'. - REAL(ReKi), INTENT( OUT) :: VarRead !< The variable being read. Returns as NaN (library defined) if not a Real. + REAL(R8Ki), INTENT( OUT) :: VarRead !< The variable being read. Returns as NaN (library defined) if not a Real. CHARACTER(*), INTENT( OUT) :: StrRead !< A string containing what was read from the ReadNum routine. LOGICAL, INTENT( OUT) :: IsRealNum !< Flag indicating if we successfully read a Real INTEGER(IntKi), INTENT( OUT) :: ErrStat !< ErrID level returned from ReadNum From 7e52b0a9d1e99ea39c6ce000cc8befa00b3ccbcf Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Mon, 2 Mar 2020 16:38:37 -0700 Subject: [PATCH 042/136] SlD: add error checking on Calc routine --- modules/soildyn/src/REDWINinterface.f90 | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/soildyn/src/REDWINinterface.f90 b/modules/soildyn/src/REDWINinterface.f90 index 8e1609b17..1fa493b57 100644 --- a/modules/soildyn/src/REDWINinterface.f90 +++ b/modules/soildyn/src/REDWINinterface.f90 @@ -296,7 +296,13 @@ subroutine REDWINinterface_CalcOutput( DLL_Trgt, DLL_Model, Displacement, Force, ! Coordinate transform from REDWIN frame Force = real(FromREDWINcoords( dll_data%Force ), ReKi) + !FIXME: check the runmode info for model 1. Not sure it applies to the other models. + + ! Call routine for error trapping the returned ErrorCodes + call CheckREDWINerrors( dll_data, DLL_Model, dll_data%SuppressWarn, ErrStat2, ErrMsg2 ); if(Failed()) return; + + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! #ifdef DEBUG_REDWIN_INTERFACE From 06ca67a03e49ea4243f2fc432fc590d9b46ee393 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 3 Mar 2020 04:15:23 -0700 Subject: [PATCH 043/136] SlD: change angles to degrees in REDWIN and add the output of stiffness matrix at end --- modules/soildyn/src/REDWINinterface.f90 | 38 ++++++++++--------- modules/soildyn/src/SoilDyn.f90 | 6 +-- modules/soildyn/src/driver/SoilDyn_Driver.f90 | 22 ++++++++++- 3 files changed, 44 insertions(+), 22 deletions(-) diff --git a/modules/soildyn/src/REDWINinterface.f90 b/modules/soildyn/src/REDWINinterface.f90 index 1fa493b57..34a84e036 100644 --- a/modules/soildyn/src/REDWINinterface.f90 +++ b/modules/soildyn/src/REDWINinterface.f90 @@ -552,6 +552,8 @@ end subroutine CheckErrorsModel3 end subroutine CheckREDWINerrors + +!FIXME: check if we input Radians or Degrees in the angular displacements !> coordinate transform to REDWIN coordinates !! -> signs flip on y,z !! | 1 0 0 | @@ -563,9 +565,9 @@ function ToREDWINcoordsR4toR8(InArray) result(REDWIN) REDWIN(1) = real( InArray(1), R8Ki ) REDWIN(2) = -real( InArray(2), R8Ki ) REDWIN(3) = -real( InArray(3), R8Ki ) - REDWIN(4) = real( InArray(4), R8Ki ) - REDWIN(5) = -real( InArray(5), R8Ki ) - REDWIN(6) = -real( InArray(6), R8Ki ) + REDWIN(4) = real( InArray(4), R8Ki ) * real(R2D_D, R8Ki) + REDWIN(5) = -real( InArray(5), R8Ki ) * real(R2D_D, R8Ki) + REDWIN(6) = -real( InArray(6), R8Ki ) * real(R2D_D, R8Ki) end function ToREDWINcoordsR4toR8 !> \copydoc redwininterface::ToREDWINcoordsR4toR8 @@ -575,9 +577,9 @@ function ToREDWINcoordsR8toR8(InArray) result(REDWIN) REDWIN(1) = InArray(1) REDWIN(2) = -InArray(2) REDWIN(3) = -InArray(3) - REDWIN(4) = InArray(4) - REDWIN(5) = -InArray(5) - REDWIN(6) = -InArray(6) + REDWIN(4) = InArray(4) * real(R2D_D, R8Ki) + REDWIN(5) = -InArray(5) * real(R2D_D, R8Ki) + REDWIN(6) = -InArray(6) * real(R2D_D, R8Ki) end function ToREDWINcoordsR8toR8 !> \copydoc redwininterface::ToREDWINcoordsR4toR8 @@ -587,9 +589,9 @@ function ToREDWINcoordsR4toR8Mat(InArray) result(REDWIN) REDWIN(:,1) = real( InArray(:,1), R8Ki ) REDWIN(:,2) = -real( InArray(:,2), R8Ki ) REDWIN(:,3) = -real( InArray(:,3), R8Ki ) - REDWIN(:,4) = real( InArray(:,4), R8Ki ) - REDWIN(:,5) = -real( InArray(:,5), R8Ki ) - REDWIN(:,6) = -real( InArray(:,6), R8Ki ) + REDWIN(:,4) = real( InArray(:,4), R8Ki ) * real(R2D_D, R8Ki) + REDWIN(:,5) = -real( InArray(:,5), R8Ki ) * real(R2D_D, R8Ki) + REDWIN(:,6) = -real( InArray(:,6), R8Ki ) * real(R2D_D, R8Ki) end function ToREDWINcoordsR4toR8Mat !> \copydoc redwininterface::ToREDWINcoordsR4toR8 @@ -599,9 +601,9 @@ function ToREDWINcoordsR8toR8Mat(InArray) result(REDWIN) REDWIN(:,1) = InArray(:,1) REDWIN(:,2) = -InArray(:,2) REDWIN(:,3) = -InArray(:,3) - REDWIN(:,4) = InArray(:,4) - REDWIN(:,5) = -InArray(:,5) - REDWIN(:,6) = -InArray(:,6) + REDWIN(:,4) = InArray(:,4) * real(R2D_D, R8Ki) + REDWIN(:,5) = -InArray(:,5) * real(R2D_D, R8Ki) + REDWIN(:,6) = -InArray(:,6) * real(R2D_D, R8Ki) end function ToREDWINcoordsR8toR8Mat @@ -617,9 +619,9 @@ function FromREDWINcoordsR8toR8(InArray) result(FAST) FAST(1) = InArray(1) FAST(2) = -InArray(2) FAST(3) = -InArray(3) - FAST(4) = InArray(4) - FAST(5) = -InArray(5) - FAST(6) = -InArray(6) + FAST(4) = InArray(4) * real(D2R_D, R8Ki) + FAST(5) = -InArray(5) * real(D2R_D, R8Ki) + FAST(6) = -InArray(6) * real(D2R_D, R8Ki) end function FromREDWINcoordsR8toR8 !> \copydoc redwininterface::FromREDWINcoordsR8toR8 @@ -629,9 +631,9 @@ function FromREDWINcoordsR8toR8Mat(InArray) result(FAST) FAST(:,1) = InArray(:,1) FAST(:,2) = -InArray(:,2) FAST(:,3) = -InArray(:,3) - FAST(:,4) = InArray(:,4) - FAST(:,5) = -InArray(:,5) - FAST(:,6) = -InArray(:,6) + FAST(:,4) = InArray(:,4) * real(D2R_D, R8Ki) + FAST(:,5) = -InArray(:,5) * real(D2R_D, R8Ki) + FAST(:,6) = -InArray(:,6) * real(D2R_D, R8Ki) end function FromREDWINcoordsR8toR8Mat diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index d1269e321..7ca7ab849 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -479,9 +479,9 @@ subroutine SoilDyn_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, Err ! Initialize the dll do i=1,size(m%dll_data) - ! Copy displacement from point mesh - Displacement(1:3) = u%SoilMotion%TranslationDisp(1:3,i) ! Translations -- This is R8Ki in the mesh - Displacement(4:6) = EulerExtract(u%SoilMotion%Orientation(1:3,1:3,i)) ! Small angle assumption should be valid here -- Note we are assuming reforientation is 0 + ! Copy displacement from point mesh (angles in radians -- converted in REDWIN interface) + Displacement(1:3) = u%SoilMotion%TranslationDisp(1:3,i) ! Translations -- This is R8Ki in the mesh + Displacement(4:6) = EulerExtract(u%SoilMotion%Orientation(1:3,1:3,i)) ! Small angle assumption should be valid here -- Note we are assuming reforientation is 0 call REDWINinterface_CalcOutput( p%DLL_Trgt, p%DLL_Model, Displacement, Force, m%dll_data(i), ErrStat2, ErrMsg2 ); if (Failed()) return; ! Return force onto the resulting point mesh diff --git a/modules/soildyn/src/driver/SoilDyn_Driver.f90 b/modules/soildyn/src/driver/SoilDyn_Driver.f90 index e23032e98..8adf506fb 100644 --- a/modules/soildyn/src/driver/SoilDyn_Driver.f90 +++ b/modules/soildyn/src/driver/SoilDyn_Driver.f90 @@ -271,7 +271,7 @@ PROGRAM SoilDyn_Driver if ( ErrStat >= AbortErrLev ) call ProgEnd() END IF - call WrScr('Stiffness matrix for point '//trim(Num2LStr(i))//' at T=0:') + call WrScr('Stiffness matrix for point '//trim(Num2LStr(i))//' at T = 0') call WrMatrix( StiffMatrix, CU, '(ES12.4)', 'StiffMatrix' ) enddo endif @@ -305,12 +305,32 @@ PROGRAM SoilDyn_Driver CALL SoilDyn_CalcOutput( Time, u(1), p, x, xd, z, OtherState, y, misc, ErrStat, ErrMsg ); call CheckErr('After CalcOutput: '); + ! There are no states to update in SoilDyn, but for completeness we add this. ! Get state variables at next step: INPUT at step n, OUTPUT at step n + 1 CALL SoilDyn_UpdateStates( Time, n, u, InputTime, p, x, xd, z, OtherState, misc, ErrStat, ErrMsg ); call CheckErr(''); END DO + + ! If requested, get the stiffness matrix using whatever the last value of displacement was + if ( SettingsFlags%StiffMatOut .and. p%CalcOption==Calc_REDWIN ) then + do i=1,size(misc%dll_data) + ! Copy displacement from point mesh + Displacement(1:3) = u(1)%SoilMotion%TranslationDisp(1:3,i) ! Translations -- This is R8Ki in the mesh + Displacement(4:6) = EulerExtract(u(1)%SoilMotion%Orientation(1:3,1:3,i)) ! Small angle assumption should be valid here -- Note we are assuming reforientation is 0 + call REDWINinterface_GetStiffMatrix( p%DLL_Trgt, p%DLL_Model, Displacement, Force, StiffMatrix, misc%dll_data(i), ErrStat, ErrMsg ) + IF ( ErrStat /= ErrID_None ) THEN ! Check if there was an error and do something about it if necessary + CALL WrScr( 'Get stiffness: '//ErrMsg ) + if ( ErrStat >= AbortErrLev ) call ProgEnd() + END IF + + call WrScr('Stiffness matrix for point '//trim(Num2LStr(i))//' at T = '//trim(Num2LStr(TMax))) + call WrMatrix( StiffMatrix, CU, '(ES12.4)', 'StiffMatrix' ) + enddo + endif + + !............................................................................................................................... ! Routine to terminate program execution !............................................................................................................................... From bcd04eef899af2c4c17afee5ecc11e7fb8743ecb Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 3 Mar 2020 05:05:16 -0700 Subject: [PATCH 044/136] SlD: multiple instances use different DLL's --- modules/soildyn/src/SoilDyn.f90 | 10 ++-- modules/soildyn/src/SoilDyn_IO.f90 | 16 +++--- modules/soildyn/src/SoilDyn_Registry.txt | 2 +- modules/soildyn/src/SoilDyn_Types.f90 | 68 +++++++++++++++++++++--- 4 files changed, 74 insertions(+), 22 deletions(-) diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index 7ca7ab849..376f9de0e 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -162,7 +162,7 @@ subroutine SoilDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In !FIXME: wrap logic around this for option 3 only. ! Initialize the dll do j=1,size(m%dll_data) - call REDWINinterface_Init( InputFileData%DLL_FileName, InputFileData%DLL_ProcName, p%DLL_Trgt, p%DLL_Model, & + call REDWINinterface_Init( InputFileData%DLL_FileName(j), InputFileData%DLL_ProcName, p%DLL_Trgt, p%DLL_Model, & m%dll_data(j), p%UseREDWINinterface, ErrStat2, ErrMsg2); if (Failed()) return; enddo @@ -188,16 +188,13 @@ subroutine SoilDyn_InitMisc( InputFileData, m, ErrStat, ErrMsg ) integer(IntKi) :: ErrStat2 !< local error status character(ErrMsgLen) :: ErrMsg2 !< local error message logical :: FileExist - character(1024) :: PriPath !< Path name of the primary file +! character(1024) :: PriPath !< Path name of the primary file character(1024) :: PropsLoc !< Full path to PropsFile location character(1024) :: LDispLoc !< Full path to LDispFile location ErrStat = ErrID_None ErrMsg = '' - ! Get path to DLL (this is already set as absolute path) - call GetPath( InputFileData%DLL_FileName, PriPath) - ! Set DLL data allocate( m%dll_data(InputFileData%DLL_NumPoints), STAT=ErrStat2 ) if (ErrStat2 /= 0) then @@ -207,6 +204,9 @@ subroutine SoilDyn_InitMisc( InputFileData, m, ErrStat, ErrMsg ) ! Set the input file names and check they are not too long. Existance checks done in the interface routine. do i=1,InputFileData%DLL_NumPoints +! ! Get path to DLL (this is already set as absolute path) +! call GetPath( InputFileData%DLL_FileName(i), PriPath) + m%dll_data(i)%PROPSfile = trim(InputFileData%DLL_PropsFile(i)) if ( len(m%dll_data(i)%PROPSfile) < len_trim(InputFileData%DLL_PropsFile(i)) ) then call SetErrStat(ErrID_Fatal, 'PropsFile #'//trim(Num2LStr(i))//' name is longer than '//trim(Num2LStr(len(m%dll_data(i)%PROPSfile)))// & diff --git a/modules/soildyn/src/SoilDyn_IO.f90 b/modules/soildyn/src/SoilDyn_IO.f90 index 10fb5a2e7..781eb0a0e 100644 --- a/modules/soildyn/src/SoilDyn_IO.f90 +++ b/modules/soildyn/src/SoilDyn_IO.f90 @@ -218,16 +218,11 @@ subroutine SoilDyn_ReadInput( InputFileName, EchoFileName, InputFileData, ErrSta call ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line', TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; call ReadVar( UnitInput, InputFileName, InputFileData%DLL_model, "DLL_model", "REDWIN DLL model used", TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; - - ! DLL_FileName - Name of the Bladed DLL [used only with DLL Interface] (-): - call ReadVar( UnitInput, InputFileName, InputFileData%DLL_FileName, "DLL_FileName", "Name/location of the external library {.dll [Windows]} in the REDWIN-DLL format [used only with CalcOption==3] (-)", TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; - if ( PathIsRelative( InputFileData%DLL_FileName ) ) InputFileData%DLL_FileName = TRIM(PriPath)//TRIM(InputFileData%DLL_FileName) - - ! DLL_ProcName - Name of procedure to be called in DLL [used only with DLL Interface] (-): - call ReadVar( UnitInput, InputFileName, InputFileData%DLL_ProcName, "DLL_ProcName", "Name of procedure to be called in DLL [used only with DLL Interface] (-)", TmpErrStat, TmpErrMsg, UnitEcho); if (Failed()) return; call ReadVar( UnitInput, InputFileName, InputFileData%DLL_NumPoints, "DLL_NumPoints", "Number of DLL interfaces", TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; ! Allocate arrays to hold the information that will be read in next + allocate( InputFileData%DLL_FileName(InputFileData%DLL_NumPoints), STAT=TmpErrStat ) + if (TmpErrStat /= 0) call SetErrStat(ErrID_Fatal, 'Could not allocate DLL_FileName', ErrStat, ErrMsg, RoutineName) allocate( InputFileData%DLL_locations(3,InputFileData%DLL_NumPoints), STAT=TmpErrStat ) if (TmpErrStat /= 0) call SetErrStat(ErrID_Fatal, 'Could not allocate DLL_locations', ErrStat, ErrMsg, RoutineName) allocate( InputFileData%DLL_PropsFile(InputFileData%DLL_NumPoints), STAT=TmpErrStat ) @@ -249,20 +244,23 @@ subroutine SoilDyn_ReadInput( InputFileName, EchoFileName, InputFileData, ErrSta call SetErrStat( ErrID_Fatal, 'Error reading DLL_curve line '//trim(Num2LStr(i))//' from '//InputFileName//'.', ErrStat, ErrMsg, RoutineName) return endif - READ( Line, *, IOSTAT=IOS) InputFileData%DLL_locations(1:3,i), InputFileData%DLL_PropsFile(i), InputFileData%DLL_LDispFile(i) + READ( Line, *, IOSTAT=IOS) InputFileData%DLL_locations(1:3,i), InputFileData%DLL_PropsFile(i), InputFileData%DLL_LDispFile(i), InputFileData%DLL_FileName(i) CALL CheckIOS ( IOS, InputFileName, 'DLL info', NumType, TmpErrStat, TmpErrMsg ); if (Failed()) return; ! NOTE: unclear if the message returned will match what was misread. ! Check for relative paths in the file names + if ( PathIsRelative( InputFileData%DLL_FileName(i) ) ) InputFileData%DLL_FileName(i) = TRIM(PriPath)//TRIM(InputFileData%DLL_FileName(i)) if ( PathIsRelative( InputFileData%DLL_PropsFile(i) ) ) InputFileData%DLL_PropsFile(i) = TRIM(PriPath)//TRIM(InputFileData%DLL_PropsFile(i)) if ( PathIsRelative( InputFileData%DLL_LDispFile(i) ) ) InputFileData%DLL_LDispFile(i) = TRIM(PriPath)//TRIM(InputFileData%DLL_LDispFile(i)) ! Add stuff to echo file if it is used if ( InputFileData%EchoFlag ) then write(UnitEcho,*) ' Location ('//trim(Num2LStr(i))//')' - write(UnitEcho,*) InputFileData%DLL_locations(1:3,i), trim(InputFileData%DLL_PropsFile(i)), ' ',trim(InputFileData%DLL_LDispFile(i)) + write(UnitEcho,*) InputFileData%DLL_locations(1:3,i), trim(InputFileData%DLL_PropsFile(i)), ' ',trim(InputFileData%DLL_LDispFile(i)), ' ',trim(InputFileData%DLL_FileName(i)) endif enddo + InputFileData%DLL_ProcName = 'INTERFACEFOUNDATION' ! This is hard coded for now + !---------------------- OUTPUT -------------------------------------------------- CALL ReadCom( UnitInput, InputFileName, 'Section Header: Output', TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) diff --git a/modules/soildyn/src/SoilDyn_Registry.txt b/modules/soildyn/src/SoilDyn_Registry.txt index f33d883a6..d83621a46 100644 --- a/modules/soildyn/src/SoilDyn_Registry.txt +++ b/modules/soildyn/src/SoilDyn_Registry.txt @@ -48,7 +48,7 @@ typedef ^ SlD_InputFile IntKi PY_numpoints - - - "N typedef ^ SlD_InputFile ReKi PY_locations :: - - "P-Y curve location points for mesh" '(m)' typedef ^ SlD_InputFile character(1024) PY_inputFile : - - "Input file with P-Y curve data" - typedef ^ SlD_InputFile IntKi DLL_model - - - "REDWIN DLL model type to use" - -typedef ^ SlD_InputFile CHARACTER(1024) DLL_FileName - - - "Name of the DLL file including the full path" - +typedef ^ SlD_InputFile CHARACTER(1024) DLL_FileName : - - "Name of the DLL file including the full path" - typedef ^ SlD_InputFile CHARACTER(1024) DLL_ProcName - - - "Name of the procedure in the DLL that will be called" - typedef ^ SlD_InputFile IntKi DLL_numpoints - - - "Number of points to interface to DLL" - typedef ^ SlD_InputFile ReKi DLL_locations :: - - "DLL location points for mesh" '(m)' diff --git a/modules/soildyn/src/SoilDyn_Types.f90 b/modules/soildyn/src/SoilDyn_Types.f90 index f4766ed63..75d83c084 100644 --- a/modules/soildyn/src/SoilDyn_Types.f90 +++ b/modules/soildyn/src/SoilDyn_Types.f90 @@ -65,7 +65,7 @@ MODULE SoilDyn_Types REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: PY_locations !< P-Y curve location points for mesh ['(m)'] character(1024) , DIMENSION(:), ALLOCATABLE :: PY_inputFile !< Input file with P-Y curve data [-] INTEGER(IntKi) :: DLL_model !< REDWIN DLL model type to use [-] - CHARACTER(1024) :: DLL_FileName !< Name of the DLL file including the full path [-] + CHARACTER(1024) , DIMENSION(:), ALLOCATABLE :: DLL_FileName !< Name of the DLL file including the full path [-] CHARACTER(1024) :: DLL_ProcName !< Name of the procedure in the DLL that will be called [-] INTEGER(IntKi) :: DLL_numpoints !< Number of points to interface to DLL [-] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: DLL_locations !< DLL location points for mesh ['(m)'] @@ -486,7 +486,18 @@ SUBROUTINE SlD_CopyInputFile( SrcInputFileData, DstInputFileData, CtrlCode, ErrS DstInputFileData%PY_inputFile = SrcInputFileData%PY_inputFile ENDIF DstInputFileData%DLL_model = SrcInputFileData%DLL_model +IF (ALLOCATED(SrcInputFileData%DLL_FileName)) THEN + i1_l = LBOUND(SrcInputFileData%DLL_FileName,1) + i1_u = UBOUND(SrcInputFileData%DLL_FileName,1) + IF (.NOT. ALLOCATED(DstInputFileData%DLL_FileName)) THEN + ALLOCATE(DstInputFileData%DLL_FileName(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInputFileData%DLL_FileName.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF DstInputFileData%DLL_FileName = SrcInputFileData%DLL_FileName +ENDIF DstInputFileData%DLL_ProcName = SrcInputFileData%DLL_ProcName DstInputFileData%DLL_numpoints = SrcInputFileData%DLL_numpoints IF (ALLOCATED(SrcInputFileData%DLL_locations)) THEN @@ -549,6 +560,9 @@ SUBROUTINE SlD_DestroyInputFile( InputFileData, ErrStat, ErrMsg ) IF (ALLOCATED(InputFileData%PY_inputFile)) THEN DEALLOCATE(InputFileData%PY_inputFile) ENDIF +IF (ALLOCATED(InputFileData%DLL_FileName)) THEN + DEALLOCATE(InputFileData%DLL_FileName) +ENDIF IF (ALLOCATED(InputFileData%DLL_locations)) THEN DEALLOCATE(InputFileData%DLL_locations) ENDIF @@ -617,7 +631,11 @@ SUBROUTINE SlD_PackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs Int_BufSz = Int_BufSz + SIZE(InData%PY_inputFile)*LEN(InData%PY_inputFile) ! PY_inputFile END IF Int_BufSz = Int_BufSz + 1 ! DLL_model - Int_BufSz = Int_BufSz + 1*LEN(InData%DLL_FileName) ! DLL_FileName + Int_BufSz = Int_BufSz + 1 ! DLL_FileName allocated yes/no + IF ( ALLOCATED(InData%DLL_FileName) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! DLL_FileName upper/lower bounds for each dimension + Int_BufSz = Int_BufSz + SIZE(InData%DLL_FileName)*LEN(InData%DLL_FileName) ! DLL_FileName + END IF Int_BufSz = Int_BufSz + 1*LEN(InData%DLL_ProcName) ! DLL_ProcName Int_BufSz = Int_BufSz + 1 ! DLL_numpoints Int_BufSz = Int_BufSz + 1 ! DLL_locations allocated yes/no @@ -728,10 +746,23 @@ SUBROUTINE SlD_PackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs END IF IntKiBuf ( Int_Xferred:Int_Xferred+(1)-1 ) = InData%DLL_model Int_Xferred = Int_Xferred + 1 + IF ( .NOT. ALLOCATED(InData%DLL_FileName) ) 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%DLL_FileName,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%DLL_FileName,1) + Int_Xferred = Int_Xferred + 2 + + DO i1 = LBOUND(InData%DLL_FileName,1), UBOUND(InData%DLL_FileName,1) DO I = 1, LEN(InData%DLL_FileName) - IntKiBuf(Int_Xferred) = ICHAR(InData%DLL_FileName(I:I), IntKi) + IntKiBuf(Int_Xferred) = ICHAR(InData%DLL_FileName(i1)(I:I), IntKi) Int_Xferred = Int_Xferred + 1 END DO ! I + END DO !i1 + END IF DO I = 1, LEN(InData%DLL_ProcName) IntKiBuf(Int_Xferred) = ICHAR(InData%DLL_ProcName(I:I), IntKi) Int_Xferred = Int_Xferred + 1 @@ -944,10 +975,33 @@ SUBROUTINE SlD_UnPackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er END IF OutData%DLL_model = IntKiBuf( Int_Xferred ) Int_Xferred = Int_Xferred + 1 - DO I = 1, LEN(OutData%DLL_FileName) - OutData%DLL_FileName(I:I) = CHAR(IntKiBuf(Int_Xferred)) - Int_Xferred = Int_Xferred + 1 - END DO ! I + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! DLL_FileName 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 (ALLOCATED(OutData%DLL_FileName)) DEALLOCATE(OutData%DLL_FileName) + ALLOCATE(OutData%DLL_FileName(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%DLL_FileName.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + ALLOCATE(mask1(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating mask1.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + mask1 = .TRUE. + DO i1 = LBOUND(OutData%DLL_FileName,1), UBOUND(OutData%DLL_FileName,1) + DO I = 1, LEN(OutData%DLL_FileName) + OutData%DLL_FileName(i1)(I:I) = CHAR(IntKiBuf(Int_Xferred)) + Int_Xferred = Int_Xferred + 1 + END DO ! I + END DO !i1 + DEALLOCATE(mask1) + END IF DO I = 1, LEN(OutData%DLL_ProcName) OutData%DLL_ProcName(I:I) = CHAR(IntKiBuf(Int_Xferred)) Int_Xferred = Int_Xferred + 1 From deaa67919c82df867cebabe94d3efc0dcff93cf2 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 3 Mar 2020 07:45:18 -0700 Subject: [PATCH 045/136] SlD: fix units. Radians for anges to REDWIN dll --- modules/soildyn/src/REDWINinterface.f90 | 40 ++++++++++++------------ modules/soildyn/src/SoilDyn.f90 | 2 +- modules/soildyn/src/SoilDyn_Registry.txt | 4 +-- 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/modules/soildyn/src/REDWINinterface.f90 b/modules/soildyn/src/REDWINinterface.f90 index 34a84e036..0c629cff9 100644 --- a/modules/soildyn/src/REDWINinterface.f90 +++ b/modules/soildyn/src/REDWINinterface.f90 @@ -41,7 +41,7 @@ subroutine REDWINdll_interface_v00(PROPSFILE, LDISPFILE, IDTask, nErrorCode, Err real(c_double), intent(inout) :: Props(1:100, 1:200) real(c_double), intent(inout) :: StVar(1:12, 1:100) integer(c_int), intent(inout) :: StVarPrint(1:12, 1:100) - real(c_double), intent(in ) :: Disp(1:6) + real(c_double), intent(in ) :: Disp(1:6) ! meters and radians real(c_double), intent( out) :: Force(1:6) real(c_double), intent( out) :: D(1:6,1:6) integer(c_int), intent( out) :: ErrorCode(1:100) @@ -64,7 +64,7 @@ subroutine INTERFACEFOUNDATION ( PROPSFILE, LDISPFILE, IDTask, nErrorCode, Error real(c_double), intent(inout) :: Props(1:100, 1:200) real(c_double), intent(inout) :: StVar(1:12, 1:100) integer(c_int), intent(inout) :: StVarPrint(1:12, 1:100) - real(c_double), intent(inout) :: Disp(1:6) + real(c_double), intent(inout) :: Disp(1:6) ! meters and radians real(c_double), intent(inout) :: Force(1:6) real(c_double), intent(inout) :: D(1:6,1:6) integer(c_int), intent(inout) :: ErrorCode(1:100) @@ -565,9 +565,9 @@ function ToREDWINcoordsR4toR8(InArray) result(REDWIN) REDWIN(1) = real( InArray(1), R8Ki ) REDWIN(2) = -real( InArray(2), R8Ki ) REDWIN(3) = -real( InArray(3), R8Ki ) - REDWIN(4) = real( InArray(4), R8Ki ) * real(R2D_D, R8Ki) - REDWIN(5) = -real( InArray(5), R8Ki ) * real(R2D_D, R8Ki) - REDWIN(6) = -real( InArray(6), R8Ki ) * real(R2D_D, R8Ki) + REDWIN(4) = real( InArray(4), R8Ki ) + REDWIN(5) = -real( InArray(5), R8Ki ) + REDWIN(6) = -real( InArray(6), R8Ki ) end function ToREDWINcoordsR4toR8 !> \copydoc redwininterface::ToREDWINcoordsR4toR8 @@ -577,9 +577,9 @@ function ToREDWINcoordsR8toR8(InArray) result(REDWIN) REDWIN(1) = InArray(1) REDWIN(2) = -InArray(2) REDWIN(3) = -InArray(3) - REDWIN(4) = InArray(4) * real(R2D_D, R8Ki) - REDWIN(5) = -InArray(5) * real(R2D_D, R8Ki) - REDWIN(6) = -InArray(6) * real(R2D_D, R8Ki) + REDWIN(4) = InArray(4) + REDWIN(5) = -InArray(5) + REDWIN(6) = -InArray(6) end function ToREDWINcoordsR8toR8 !> \copydoc redwininterface::ToREDWINcoordsR4toR8 @@ -589,9 +589,9 @@ function ToREDWINcoordsR4toR8Mat(InArray) result(REDWIN) REDWIN(:,1) = real( InArray(:,1), R8Ki ) REDWIN(:,2) = -real( InArray(:,2), R8Ki ) REDWIN(:,3) = -real( InArray(:,3), R8Ki ) - REDWIN(:,4) = real( InArray(:,4), R8Ki ) * real(R2D_D, R8Ki) - REDWIN(:,5) = -real( InArray(:,5), R8Ki ) * real(R2D_D, R8Ki) - REDWIN(:,6) = -real( InArray(:,6), R8Ki ) * real(R2D_D, R8Ki) + REDWIN(:,4) = real( InArray(:,4), R8Ki ) + REDWIN(:,5) = -real( InArray(:,5), R8Ki ) + REDWIN(:,6) = -real( InArray(:,6), R8Ki ) end function ToREDWINcoordsR4toR8Mat !> \copydoc redwininterface::ToREDWINcoordsR4toR8 @@ -601,9 +601,9 @@ function ToREDWINcoordsR8toR8Mat(InArray) result(REDWIN) REDWIN(:,1) = InArray(:,1) REDWIN(:,2) = -InArray(:,2) REDWIN(:,3) = -InArray(:,3) - REDWIN(:,4) = InArray(:,4) * real(R2D_D, R8Ki) - REDWIN(:,5) = -InArray(:,5) * real(R2D_D, R8Ki) - REDWIN(:,6) = -InArray(:,6) * real(R2D_D, R8Ki) + REDWIN(:,4) = InArray(:,4) + REDWIN(:,5) = -InArray(:,5) + REDWIN(:,6) = -InArray(:,6) end function ToREDWINcoordsR8toR8Mat @@ -619,9 +619,9 @@ function FromREDWINcoordsR8toR8(InArray) result(FAST) FAST(1) = InArray(1) FAST(2) = -InArray(2) FAST(3) = -InArray(3) - FAST(4) = InArray(4) * real(D2R_D, R8Ki) - FAST(5) = -InArray(5) * real(D2R_D, R8Ki) - FAST(6) = -InArray(6) * real(D2R_D, R8Ki) + FAST(4) = InArray(4) + FAST(5) = -InArray(5) + FAST(6) = -InArray(6) end function FromREDWINcoordsR8toR8 !> \copydoc redwininterface::FromREDWINcoordsR8toR8 @@ -631,9 +631,9 @@ function FromREDWINcoordsR8toR8Mat(InArray) result(FAST) FAST(:,1) = InArray(:,1) FAST(:,2) = -InArray(:,2) FAST(:,3) = -InArray(:,3) - FAST(:,4) = InArray(:,4) * real(D2R_D, R8Ki) - FAST(:,5) = -InArray(:,5) * real(D2R_D, R8Ki) - FAST(:,6) = -InArray(:,6) * real(D2R_D, R8Ki) + FAST(:,4) = InArray(:,4) + FAST(:,5) = -InArray(:,5) + FAST(:,6) = -InArray(:,6) end function FromREDWINcoordsR8toR8Mat diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index 376f9de0e..ec53f2d56 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -479,7 +479,7 @@ subroutine SoilDyn_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, Err ! Initialize the dll do i=1,size(m%dll_data) - ! Copy displacement from point mesh (angles in radians -- converted in REDWIN interface) + ! Copy displacement from point mesh (angles in radians -- REDWIN dll also uses rad) Displacement(1:3) = u%SoilMotion%TranslationDisp(1:3,i) ! Translations -- This is R8Ki in the mesh Displacement(4:6) = EulerExtract(u%SoilMotion%Orientation(1:3,1:3,i)) ! Small angle assumption should be valid here -- Note we are assuming reforientation is 0 call REDWINinterface_CalcOutput( p%DLL_Trgt, p%DLL_Model, Displacement, Force, m%dll_data(i), ErrStat2, ErrMsg2 ); if (Failed()) return; diff --git a/modules/soildyn/src/SoilDyn_Registry.txt b/modules/soildyn/src/SoilDyn_Registry.txt index d83621a46..7463e66f6 100644 --- a/modules/soildyn/src/SoilDyn_Registry.txt +++ b/modules/soildyn/src/SoilDyn_Registry.txt @@ -31,7 +31,7 @@ typedef ^ REDWINdllType IntKi ErrorCode {100} typedef ^ REDWINdllType R8Ki Props {100}{200} - - "Array containing foundation model properties (used internally by the REDWIN models). Specific to each model." - typedef ^ REDWINdllType R8Ki StVar {12}{100} - - "Array containing the state variables at the end of the step (used internally by the REDWIN models). Specific to each model." - typedef ^ REDWINdllType IntKi StVarPrint {12}{100} - - "Array indicating which state variables should be printed to the screen. This feature is currently not supported." - -typedef ^ REDWINdllType R8Ki Disp {6} - - "Displacements. Follows convention of REDWIN orientation." - +typedef ^ REDWINdllType R8Ki Disp {6} - - "Displacements. Follows convention of REDWIN orientation." '(m, rad)' typedef ^ REDWINdllType R8Ki Force {6} - - "Forces. Follows convention of REDWIN orientations." '(N)' typedef ^ REDWINdllType R8Ki D {6}{6} - - "The 6 x 6 elastic macro-element stiffness matrix at the SFI." - typedef ^ REDWINdllType LOGICAL SuppressWarn - .FALSE. - "Supress further warnings." - @@ -42,7 +42,7 @@ typedef ^ SlD_InputFile LOGICAL EchoFlag - - - "E typedef ^ SlD_InputFile CHARACTER(ChanLen) OutList : - - "List of user-requested output channels" - typedef ^ SlD_InputFile R8Ki DT - - - "Timestep requested" '(s)' typedef ^ SlD_InputFile IntKi CalcOption - - - "Calculation methodology to use" - -typedef ^ SlD_InputFile ReKi Stiffness {6}{6} - - "Stiffness matrix 6x6" '(N/m, N-m/m)' +typedef ^ SlD_InputFile ReKi Stiffness {6}{6} - - "Stiffness matrix 6x6" '(N/m, N-m/rad)' typedef ^ SlD_InputFile ReKi Damping {6}{6} - - "Damping ratio matrix 6x6" - typedef ^ SlD_InputFile IntKi PY_numpoints - - - "Number of P-Y curve mesh points" - typedef ^ SlD_InputFile ReKi PY_locations :: - - "P-Y curve location points for mesh" '(m)' From cf5b2f826126e8e4f7f844f5358d7f596927ee8a Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 4 Mar 2020 15:19:51 -0700 Subject: [PATCH 046/136] SlD: update for one DLL and paths Only one DLL is needed: it is setup so that it does not keep anything in memory (all passed in) All input files for the DLL must be in the local working directory --- modules/soildyn/src/REDWINinterface.f90 | 19 +++++-- modules/soildyn/src/SoilDyn.f90 | 6 +- modules/soildyn/src/SoilDyn_IO.f90 | 10 ++-- modules/soildyn/src/SoilDyn_Registry.txt | 2 +- modules/soildyn/src/SoilDyn_Types.f90 | 70 +++--------------------- 5 files changed, 27 insertions(+), 80 deletions(-) diff --git a/modules/soildyn/src/REDWINinterface.f90 b/modules/soildyn/src/REDWINinterface.f90 index 0c629cff9..250af4eae 100644 --- a/modules/soildyn/src/REDWINinterface.f90 +++ b/modules/soildyn/src/REDWINinterface.f90 @@ -158,7 +158,7 @@ subroutine REDWINinterface_Init( DLL_FileName, DLL_ProcName, DLL_Trgt, DLL_Model character(ErrMsgLen) :: ErrMsg2 ! The error message, if an error occurred character(*), parameter :: RoutineName = 'REDWINinterface_Init' logical :: FileExist - character(1024) :: PriPath !< Path name of the primary file + character(1024) :: CwdPath !< Path of current working directory character(1024) :: PropsLoc !< Full path to PropsFile location character(1024) :: LDispLoc !< Full path to LDispFile location @@ -169,7 +169,14 @@ subroutine REDWINinterface_Init( DLL_FileName, DLL_ProcName, DLL_Trgt, DLL_Model CALL DispNVD( REDWINinterface_Ver ) ! Display the version of this interface - call GetPath( DLL_FileName, PriPath ) + ! Get current working directory for checking DLL input files. + call getcwd( CwdPath, ErrStat2 ) + if (ErrStat2 /= 0) then + call SetErrStat( ErrID_Fatal,' Cannot get current working directory to check DLL input files.',ErrStat,ErrMsg,RoutineName ) + return + endif + CwdPath=trim(CwdPath)//PathSep + call CheckPaths() if (ErrStat >= AbortErrLev) return @@ -206,21 +213,21 @@ subroutine CheckPaths() ! Check existance of DLL input files. The DLL does not check this, and will ! catastrophically fail if they are not found. if ( PathIsRelative( dll_data%PROPSfile ) ) then - PropsLoc = trim(PriPath)//trim(dll_data%PROPSfile) + PropsLoc = trim(CwdPath)//trim(dll_data%PROPSfile(3:len_trim(dll_data%PROPSfile))) ! remove the leading ./ else PropsLoc = trim(dll_data%PROPSfile) endif if ( PathIsRelative( dll_data%LDISPfile ) ) then - LDispLoc = trim(PriPath)//trim(dll_data%LDISPfile) + LDispLoc = trim(CwdPath)//trim(dll_data%LDISPfile(3:len_trim(dll_data%LDISPfile))) ! remove the leading ./ else LDispLoc = trim(dll_data%LDISPfile) endif inquire( file=trim(PropsLoc), exist=FileExist ) if ( .not. FileExist ) call SetErrStat(ErrID_Fatal, 'PropsFile '//trim(dll_data%PROPSfile)// & - ' not found (path must be relative to DLL location, or absolute)', ErrStat, ErrMsg, RoutineName) + ' not found (path must be relative to the working directory, or absolute)', ErrStat, ErrMsg, RoutineName) inquire( file=trim(LDispLoc), exist=FileExist ) if ( .not. FileExist ) call SetErrStat(ErrID_Fatal, 'LDispFile '//trim(dll_data%LDISPFile)// & - ' not found (path must be relative to DLL location, or absolute)', ErrStat, ErrMsg, RoutineName) + ' not found (path must be relative to the working direcotry, or absolute)', ErrStat, ErrMsg, RoutineName) if ( ErrStat >= AbortErrLev ) UseREDWINinterface = .FALSE. end subroutine CheckPaths diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index ec53f2d56..ea752b769 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -162,7 +162,7 @@ subroutine SoilDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In !FIXME: wrap logic around this for option 3 only. ! Initialize the dll do j=1,size(m%dll_data) - call REDWINinterface_Init( InputFileData%DLL_FileName(j), InputFileData%DLL_ProcName, p%DLL_Trgt, p%DLL_Model, & + call REDWINinterface_Init( InputFileData%DLL_FileName, InputFileData%DLL_ProcName, p%DLL_Trgt, p%DLL_Model, & m%dll_data(j), p%UseREDWINinterface, ErrStat2, ErrMsg2); if (Failed()) return; enddo @@ -188,7 +188,6 @@ subroutine SoilDyn_InitMisc( InputFileData, m, ErrStat, ErrMsg ) integer(IntKi) :: ErrStat2 !< local error status character(ErrMsgLen) :: ErrMsg2 !< local error message logical :: FileExist -! character(1024) :: PriPath !< Path name of the primary file character(1024) :: PropsLoc !< Full path to PropsFile location character(1024) :: LDispLoc !< Full path to LDispFile location @@ -204,9 +203,6 @@ subroutine SoilDyn_InitMisc( InputFileData, m, ErrStat, ErrMsg ) ! Set the input file names and check they are not too long. Existance checks done in the interface routine. do i=1,InputFileData%DLL_NumPoints -! ! Get path to DLL (this is already set as absolute path) -! call GetPath( InputFileData%DLL_FileName(i), PriPath) - m%dll_data(i)%PROPSfile = trim(InputFileData%DLL_PropsFile(i)) if ( len(m%dll_data(i)%PROPSfile) < len_trim(InputFileData%DLL_PropsFile(i)) ) then call SetErrStat(ErrID_Fatal, 'PropsFile #'//trim(Num2LStr(i))//' name is longer than '//trim(Num2LStr(len(m%dll_data(i)%PROPSfile)))// & diff --git a/modules/soildyn/src/SoilDyn_IO.f90 b/modules/soildyn/src/SoilDyn_IO.f90 index 781eb0a0e..84b2ab63f 100644 --- a/modules/soildyn/src/SoilDyn_IO.f90 +++ b/modules/soildyn/src/SoilDyn_IO.f90 @@ -217,12 +217,11 @@ subroutine SoilDyn_ReadInput( InputFileName, EchoFileName, InputFileData, ErrSta call ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line', TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; - call ReadVar( UnitInput, InputFileName, InputFileData%DLL_model, "DLL_model", "REDWIN DLL model used", TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; + call ReadVar( UnitInput, InputFileName, InputFileData%DLL_model, "DLL_model", "REDWIN DLL to use", TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; + call ReadVar( UnitInput, InputFileName, InputFileData%DLL_FileName, "DLL_FileName", "REDWIN DLL model used", TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; call ReadVar( UnitInput, InputFileName, InputFileData%DLL_NumPoints, "DLL_NumPoints", "Number of DLL interfaces", TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; ! Allocate arrays to hold the information that will be read in next - allocate( InputFileData%DLL_FileName(InputFileData%DLL_NumPoints), STAT=TmpErrStat ) - if (TmpErrStat /= 0) call SetErrStat(ErrID_Fatal, 'Could not allocate DLL_FileName', ErrStat, ErrMsg, RoutineName) allocate( InputFileData%DLL_locations(3,InputFileData%DLL_NumPoints), STAT=TmpErrStat ) if (TmpErrStat /= 0) call SetErrStat(ErrID_Fatal, 'Could not allocate DLL_locations', ErrStat, ErrMsg, RoutineName) allocate( InputFileData%DLL_PropsFile(InputFileData%DLL_NumPoints), STAT=TmpErrStat ) @@ -244,18 +243,17 @@ subroutine SoilDyn_ReadInput( InputFileName, EchoFileName, InputFileData, ErrSta call SetErrStat( ErrID_Fatal, 'Error reading DLL_curve line '//trim(Num2LStr(i))//' from '//InputFileName//'.', ErrStat, ErrMsg, RoutineName) return endif - READ( Line, *, IOSTAT=IOS) InputFileData%DLL_locations(1:3,i), InputFileData%DLL_PropsFile(i), InputFileData%DLL_LDispFile(i), InputFileData%DLL_FileName(i) + READ( Line, *, IOSTAT=IOS) InputFileData%DLL_locations(1:3,i), InputFileData%DLL_PropsFile(i), InputFileData%DLL_LDispFile(i) CALL CheckIOS ( IOS, InputFileName, 'DLL info', NumType, TmpErrStat, TmpErrMsg ); if (Failed()) return; ! NOTE: unclear if the message returned will match what was misread. ! Check for relative paths in the file names - if ( PathIsRelative( InputFileData%DLL_FileName(i) ) ) InputFileData%DLL_FileName(i) = TRIM(PriPath)//TRIM(InputFileData%DLL_FileName(i)) if ( PathIsRelative( InputFileData%DLL_PropsFile(i) ) ) InputFileData%DLL_PropsFile(i) = TRIM(PriPath)//TRIM(InputFileData%DLL_PropsFile(i)) if ( PathIsRelative( InputFileData%DLL_LDispFile(i) ) ) InputFileData%DLL_LDispFile(i) = TRIM(PriPath)//TRIM(InputFileData%DLL_LDispFile(i)) ! Add stuff to echo file if it is used if ( InputFileData%EchoFlag ) then write(UnitEcho,*) ' Location ('//trim(Num2LStr(i))//')' - write(UnitEcho,*) InputFileData%DLL_locations(1:3,i), trim(InputFileData%DLL_PropsFile(i)), ' ',trim(InputFileData%DLL_LDispFile(i)), ' ',trim(InputFileData%DLL_FileName(i)) + write(UnitEcho,*) InputFileData%DLL_locations(1:3,i), trim(InputFileData%DLL_PropsFile(i)), ' ',trim(InputFileData%DLL_LDispFile(i)), ' ',trim(InputFileData%DLL_FileName) endif enddo diff --git a/modules/soildyn/src/SoilDyn_Registry.txt b/modules/soildyn/src/SoilDyn_Registry.txt index 7463e66f6..82fafa2b3 100644 --- a/modules/soildyn/src/SoilDyn_Registry.txt +++ b/modules/soildyn/src/SoilDyn_Registry.txt @@ -48,7 +48,7 @@ typedef ^ SlD_InputFile IntKi PY_numpoints - - - "N typedef ^ SlD_InputFile ReKi PY_locations :: - - "P-Y curve location points for mesh" '(m)' typedef ^ SlD_InputFile character(1024) PY_inputFile : - - "Input file with P-Y curve data" - typedef ^ SlD_InputFile IntKi DLL_model - - - "REDWIN DLL model type to use" - -typedef ^ SlD_InputFile CHARACTER(1024) DLL_FileName : - - "Name of the DLL file including the full path" - +typedef ^ SlD_InputFile CHARACTER(1024) DLL_FileName - - - "Name of the DLL file including the full path" - typedef ^ SlD_InputFile CHARACTER(1024) DLL_ProcName - - - "Name of the procedure in the DLL that will be called" - typedef ^ SlD_InputFile IntKi DLL_numpoints - - - "Number of points to interface to DLL" - typedef ^ SlD_InputFile ReKi DLL_locations :: - - "DLL location points for mesh" '(m)' diff --git a/modules/soildyn/src/SoilDyn_Types.f90 b/modules/soildyn/src/SoilDyn_Types.f90 index 75d83c084..a5791c794 100644 --- a/modules/soildyn/src/SoilDyn_Types.f90 +++ b/modules/soildyn/src/SoilDyn_Types.f90 @@ -46,7 +46,7 @@ MODULE SoilDyn_Types REAL(R8Ki) , DIMENSION(1:100,1:200) :: Props !< Array containing foundation model properties (used internally by the REDWIN models). Specific to each model. [-] REAL(R8Ki) , DIMENSION(1:12,1:100) :: StVar !< Array containing the state variables at the end of the step (used internally by the REDWIN models). Specific to each model. [-] INTEGER(IntKi) , DIMENSION(1:12,1:100) :: StVarPrint !< Array indicating which state variables should be printed to the screen. This feature is currently not supported. [-] - REAL(R8Ki) , DIMENSION(1:6) :: Disp !< Displacements. Follows convention of REDWIN orientation. [-] + REAL(R8Ki) , DIMENSION(1:6) :: Disp !< Displacements. Follows convention of REDWIN orientation. ['(m,] REAL(R8Ki) , DIMENSION(1:6) :: Force !< Forces. Follows convention of REDWIN orientations. ['(N)'] REAL(R8Ki) , DIMENSION(1:6,1:6) :: D !< The 6 x 6 elastic macro-element stiffness matrix at the SFI. [-] LOGICAL :: SuppressWarn = .FALSE. !< Supress further warnings. [-] @@ -65,7 +65,7 @@ MODULE SoilDyn_Types REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: PY_locations !< P-Y curve location points for mesh ['(m)'] character(1024) , DIMENSION(:), ALLOCATABLE :: PY_inputFile !< Input file with P-Y curve data [-] INTEGER(IntKi) :: DLL_model !< REDWIN DLL model type to use [-] - CHARACTER(1024) , DIMENSION(:), ALLOCATABLE :: DLL_FileName !< Name of the DLL file including the full path [-] + CHARACTER(1024) :: DLL_FileName !< Name of the DLL file including the full path [-] CHARACTER(1024) :: DLL_ProcName !< Name of the procedure in the DLL that will be called [-] INTEGER(IntKi) :: DLL_numpoints !< Number of points to interface to DLL [-] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: DLL_locations !< DLL location points for mesh ['(m)'] @@ -486,18 +486,7 @@ SUBROUTINE SlD_CopyInputFile( SrcInputFileData, DstInputFileData, CtrlCode, ErrS DstInputFileData%PY_inputFile = SrcInputFileData%PY_inputFile ENDIF DstInputFileData%DLL_model = SrcInputFileData%DLL_model -IF (ALLOCATED(SrcInputFileData%DLL_FileName)) THEN - i1_l = LBOUND(SrcInputFileData%DLL_FileName,1) - i1_u = UBOUND(SrcInputFileData%DLL_FileName,1) - IF (.NOT. ALLOCATED(DstInputFileData%DLL_FileName)) THEN - ALLOCATE(DstInputFileData%DLL_FileName(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInputFileData%DLL_FileName.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - END IF DstInputFileData%DLL_FileName = SrcInputFileData%DLL_FileName -ENDIF DstInputFileData%DLL_ProcName = SrcInputFileData%DLL_ProcName DstInputFileData%DLL_numpoints = SrcInputFileData%DLL_numpoints IF (ALLOCATED(SrcInputFileData%DLL_locations)) THEN @@ -560,9 +549,6 @@ SUBROUTINE SlD_DestroyInputFile( InputFileData, ErrStat, ErrMsg ) IF (ALLOCATED(InputFileData%PY_inputFile)) THEN DEALLOCATE(InputFileData%PY_inputFile) ENDIF -IF (ALLOCATED(InputFileData%DLL_FileName)) THEN - DEALLOCATE(InputFileData%DLL_FileName) -ENDIF IF (ALLOCATED(InputFileData%DLL_locations)) THEN DEALLOCATE(InputFileData%DLL_locations) ENDIF @@ -631,11 +617,7 @@ SUBROUTINE SlD_PackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs Int_BufSz = Int_BufSz + SIZE(InData%PY_inputFile)*LEN(InData%PY_inputFile) ! PY_inputFile END IF Int_BufSz = Int_BufSz + 1 ! DLL_model - Int_BufSz = Int_BufSz + 1 ! DLL_FileName allocated yes/no - IF ( ALLOCATED(InData%DLL_FileName) ) THEN - Int_BufSz = Int_BufSz + 2*1 ! DLL_FileName upper/lower bounds for each dimension - Int_BufSz = Int_BufSz + SIZE(InData%DLL_FileName)*LEN(InData%DLL_FileName) ! DLL_FileName - END IF + Int_BufSz = Int_BufSz + 1*LEN(InData%DLL_FileName) ! DLL_FileName Int_BufSz = Int_BufSz + 1*LEN(InData%DLL_ProcName) ! DLL_ProcName Int_BufSz = Int_BufSz + 1 ! DLL_numpoints Int_BufSz = Int_BufSz + 1 ! DLL_locations allocated yes/no @@ -746,23 +728,10 @@ SUBROUTINE SlD_PackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs END IF IntKiBuf ( Int_Xferred:Int_Xferred+(1)-1 ) = InData%DLL_model Int_Xferred = Int_Xferred + 1 - IF ( .NOT. ALLOCATED(InData%DLL_FileName) ) 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%DLL_FileName,1) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%DLL_FileName,1) - Int_Xferred = Int_Xferred + 2 - - DO i1 = LBOUND(InData%DLL_FileName,1), UBOUND(InData%DLL_FileName,1) DO I = 1, LEN(InData%DLL_FileName) - IntKiBuf(Int_Xferred) = ICHAR(InData%DLL_FileName(i1)(I:I), IntKi) + IntKiBuf(Int_Xferred) = ICHAR(InData%DLL_FileName(I:I), IntKi) Int_Xferred = Int_Xferred + 1 END DO ! I - END DO !i1 - END IF DO I = 1, LEN(InData%DLL_ProcName) IntKiBuf(Int_Xferred) = ICHAR(InData%DLL_ProcName(I:I), IntKi) Int_Xferred = Int_Xferred + 1 @@ -975,33 +944,10 @@ SUBROUTINE SlD_UnPackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er END IF OutData%DLL_model = IntKiBuf( Int_Xferred ) Int_Xferred = Int_Xferred + 1 - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! DLL_FileName 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 (ALLOCATED(OutData%DLL_FileName)) DEALLOCATE(OutData%DLL_FileName) - ALLOCATE(OutData%DLL_FileName(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%DLL_FileName.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - ALLOCATE(mask1(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating mask1.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - mask1 = .TRUE. - DO i1 = LBOUND(OutData%DLL_FileName,1), UBOUND(OutData%DLL_FileName,1) - DO I = 1, LEN(OutData%DLL_FileName) - OutData%DLL_FileName(i1)(I:I) = CHAR(IntKiBuf(Int_Xferred)) - Int_Xferred = Int_Xferred + 1 - END DO ! I - END DO !i1 - DEALLOCATE(mask1) - END IF + DO I = 1, LEN(OutData%DLL_FileName) + OutData%DLL_FileName(I:I) = CHAR(IntKiBuf(Int_Xferred)) + Int_Xferred = Int_Xferred + 1 + END DO ! I DO I = 1, LEN(OutData%DLL_ProcName) OutData%DLL_ProcName(I:I) = CHAR(IntKiBuf(Int_Xferred)) Int_Xferred = Int_Xferred + 1 From e4596c6616fd0330c220f42e461996f9f2522b25 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 4 Mar 2020 17:13:26 -0700 Subject: [PATCH 047/136] SlD: fix for Get_CWD for platform specific --- modules/soildyn/src/REDWINinterface.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/soildyn/src/REDWINinterface.f90 b/modules/soildyn/src/REDWINinterface.f90 index 250af4eae..ef190bb03 100644 --- a/modules/soildyn/src/REDWINinterface.f90 +++ b/modules/soildyn/src/REDWINinterface.f90 @@ -170,7 +170,7 @@ subroutine REDWINinterface_Init( DLL_FileName, DLL_ProcName, DLL_Trgt, DLL_Model CALL DispNVD( REDWINinterface_Ver ) ! Display the version of this interface ! Get current working directory for checking DLL input files. - call getcwd( CwdPath, ErrStat2 ) + call Get_CWD( CwdPath, ErrStat2 ) if (ErrStat2 /= 0) then call SetErrStat( ErrID_Fatal,' Cannot get current working directory to check DLL input files.',ErrStat,ErrMsg,RoutineName ) return From a6accb3232bfd98354daa4df9ebb049d5d2ebce7 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 11 Mar 2020 10:48:06 -0600 Subject: [PATCH 048/136] SlD: minor updates to get it running on windows again --- modules/soildyn/src/REDWINinterface.f90 | 42 +++++------- vs-build/SoilDyn/SoilDyn-w-registry.sln | 8 +-- vs-build/SoilDyn/SoilDyn.vfproj | 90 ++++++++++++------------- 3 files changed, 67 insertions(+), 73 deletions(-) diff --git a/modules/soildyn/src/REDWINinterface.f90 b/modules/soildyn/src/REDWINinterface.f90 index ef190bb03..0de001cf8 100644 --- a/modules/soildyn/src/REDWINinterface.f90 +++ b/modules/soildyn/src/REDWINinterface.f90 @@ -20,7 +20,9 @@ MODULE REDWINinterface !FIXME: when done, remove the ifdef NO_LibLoad checks. - USE NWTC_Library + USE NWTC_Library, only: IntKi, ReKi, SiKi, DbKi, R8Ki, ProgDesc, DLL_Type, ErrMsgLen, PathIsRelative, & + OS_DESC, ErrID_None, ErrID_Info, ErrID_Warn, ErrID_Fatal, AbortErrLev, PathSep, & + NewLine, Num2LStr, Get_CWD, LoadDynamicLib, FreeDynamicLib, SetErrStat, DispNVD USE SoilDyn_Types, only: REDWINdllType IMPLICIT NONE @@ -34,17 +36,17 @@ MODULE REDWINinterface abstract interface subroutine REDWINdll_interface_v00(PROPSFILE, LDISPFILE, IDTask, nErrorCode, ErrorCode, Props, StVar, StVarPrint, Disp, Force, D) USE, INTRINSIC :: ISO_C_Binding, only : C_INT, C_CHAR, C_DOUBLE - character(kind=c_char), intent(in ) :: PROPSFILE(45) - character(kind=c_char), intent(in ) :: LDISPFILE(45) - integer(c_int), intent(in ) :: IDTask - integer(c_int), intent( out) :: nErrorCode + character(kind=c_char), intent(inout) :: PROPSFILE(45) + character(kind=c_char), intent(inout) :: LDISPFILE(45) + integer(c_int), intent(inout) :: IDTask + integer(c_int), intent(inout) :: nErrorCode real(c_double), intent(inout) :: Props(1:100, 1:200) real(c_double), intent(inout) :: StVar(1:12, 1:100) integer(c_int), intent(inout) :: StVarPrint(1:12, 1:100) - real(c_double), intent(in ) :: Disp(1:6) ! meters and radians - real(c_double), intent( out) :: Force(1:6) - real(c_double), intent( out) :: D(1:6,1:6) - integer(c_int), intent( out) :: ErrorCode(1:100) + real(c_double), intent(inout) :: Disp(1:6) ! meters and radians + real(c_double), intent(inout) :: Force(1:6) + real(c_double), intent(inout) :: D(1:6,1:6) + integer(c_int), intent(inout) :: ErrorCode(1:100) end subroutine REDWINdll_interface_v00 end interface @@ -57,10 +59,10 @@ subroutine INTERFACEFOUNDATION ( PROPSFILE, LDISPFILE, IDTask, nErrorCode, Error !DEC$ ATTRIBUTES DLLIMPORT :: INTERFACEFOUNDATION !GCC$ ATTRIBUTES DLLIMPORT :: INTERFACEFOUNDATION USE, INTRINSIC :: ISO_C_Binding, only : C_INT, C_CHAR, C_DOUBLE - character(kind=c_char), intent(in ) :: PROPSFILE(45) - character(kind=c_char), intent(in ) :: LDISPFILE(45) - integer(c_int), intent(in ) :: IDTask - integer(c_int), intent( out) :: nErrorCode + character(kind=c_char), intent(inout) :: PROPSFILE(45) + character(kind=c_char), intent(inout) :: LDISPFILE(45) + integer(c_int), intent(inout) :: IDTask + integer(c_int), intent(inout) :: nErrorCode real(c_double), intent(inout) :: Props(1:100, 1:200) real(c_double), intent(inout) :: StVar(1:12, 1:100) integer(c_int), intent(inout) :: StVarPrint(1:12, 1:100) @@ -96,7 +98,7 @@ end subroutine INTERFACEFOUNDATION !================================================================================================================================== !> This SUBROUTINE is used to call the REDWIN-style DLL. subroutine CallREDWINdll ( DLL_Trgt, DLL_Model, dll_data, ErrStat, ErrMsg ) - + USE, INTRINSIC :: ISO_C_Binding, only : C_F_PROCPOINTER ! Passed Variables: type(DLL_Type), intent(in ) :: DLL_Trgt ! The DLL to be called. integer(IntKi), intent(in ) :: DLL_Model ! The DLL model type @@ -105,16 +107,8 @@ subroutine CallREDWINdll ( DLL_Trgt, DLL_Model, dll_data, ErrStat, ErrMsg ) integer(IntKi), intent( out) :: ErrStat ! Error status of the operation character(*), intent( out) :: ErrMsg ! Error message if ErrStat /= ErrID_None - ! Local Variables: - character(len=45) :: PROPSFILE ! properties input file - character(len=45) :: LDISPFILE ! displacement input file - PROCEDURE(REDWINdll_interface_V00),POINTER:: REDWIN_Subroutine_v00 ! The address of the procedure in the RedWin DLL - ! Set names of DLL input files to pass - PROPSFILE = TRIM(dll_data%PROPSfile) - LDISPFILE = TRIM(dll_data%LDISPfile) - #ifndef NO_LibLoad #ifdef STATIC_DLL_LOAD ! if we're statically loading the library (i.e., OpenFOAM), we can just call INTERFACEFOUNDATION(); @@ -125,8 +119,8 @@ subroutine CallREDWINdll ( DLL_Trgt, DLL_Model, dll_data, ErrStat, ErrMsg ) #else ! Call the DLL (first associate the address from the procedure in the DLL with the subroutine): if (RW_Ver == RW_v00) then - CALL C_F_PROCPOINTER( transfer(DLL_Trgt%ProcAddr(1),C_NULL_FUNPTR), REDWIN_Subroutine_v00) - CALL REDWIN_Subroutine_v00 ( PROPSFILE, LDISPFILE, & + CALL C_F_PROCPOINTER( DLL_Trgt%ProcAddr(1), REDWIN_Subroutine_v00) + CALL REDWIN_Subroutine_v00 ( dll_data%PROPSfile, dll_data%LDISPfile, & dll_data%IDTask, dll_data%nErrorCode, dll_data%ErrorCode, & dll_data%Props, dll_data%StVar, dll_data%StVarPrint, & dll_data%Disp, dll_data%Force, dll_data%D ) diff --git a/vs-build/SoilDyn/SoilDyn-w-registry.sln b/vs-build/SoilDyn/SoilDyn-w-registry.sln index 5c250ba83..7b448a55d 100644 --- a/vs-build/SoilDyn/SoilDyn-w-registry.sln +++ b/vs-build/SoilDyn/SoilDyn-w-registry.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.40629.0 +# Visual Studio 15 +VisualStudioVersion = 15.0.28307.1022 MinimumVisualStudioVersion = 10.0.40219.1 Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "SoilDyn", "SoilDyn.vfproj", "{815C302F-A93D-4C22-9329-7112345113C0}" ProjectSection(ProjectDependencies) = postProject @@ -42,8 +42,8 @@ Global {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|Win32.Build.0 = Debug|Win32 {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|x64.ActiveCfg = Debug|x64 {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|x64.Build.0 = Debug|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|Win32.ActiveCfg = Debug|Win32 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|Win32.Build.0 = Debug|Win32 + {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|Win32.ActiveCfg = Release|Win32 + {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|Win32.Build.0 = Release|Win32 {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|x64.ActiveCfg = Debug|x64 {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|x64.Build.0 = Debug|x64 {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|Win32.ActiveCfg = Release|Win32 diff --git a/vs-build/SoilDyn/SoilDyn.vfproj b/vs-build/SoilDyn/SoilDyn.vfproj index f2b87f8cf..53fa2e93e 100644 --- a/vs-build/SoilDyn/SoilDyn.vfproj +++ b/vs-build/SoilDyn/SoilDyn.vfproj @@ -5,7 +5,7 @@ - + @@ -94,172 +94,172 @@ - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + @@ -270,19 +270,19 @@ - - + + - - + + From 37837f01f960cd2c941a0ddd8a46c930b9f2d260 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 11 Mar 2020 14:50:41 -0600 Subject: [PATCH 049/136] SlD: change all force and stiffness in REDWIN module to R8Ki --- modules/soildyn/src/REDWINinterface.f90 | 40 ++--------- modules/soildyn/src/SoilDyn.f90 | 6 +- modules/soildyn/src/TODO.txt | 66 +++++++++++++++++++ modules/soildyn/src/driver/SoilDyn_Driver.f90 | 8 +-- 4 files changed, 80 insertions(+), 40 deletions(-) create mode 100644 modules/soildyn/src/TODO.txt diff --git a/modules/soildyn/src/REDWINinterface.f90 b/modules/soildyn/src/REDWINinterface.f90 index 0de001cf8..6c886e47b 100644 --- a/modules/soildyn/src/REDWINinterface.f90 +++ b/modules/soildyn/src/REDWINinterface.f90 @@ -83,9 +83,7 @@ end subroutine INTERFACEFOUNDATION ! Coordinate transforms interface ToREDWINcoords - module procedure ToREDWINcoordsR4toR8 module procedure ToREDWINcoordsR8toR8 - module procedure ToREDWINcoordsR4toR8Mat module procedure ToREDWINcoordsR8toR8Mat end interface @@ -266,7 +264,7 @@ subroutine REDWINinterface_CalcOutput( DLL_Trgt, DLL_Model, Displacement, Force, type(DLL_Type), intent(in ) :: DLL_Trgt !< The DLL to be called. integer(IntKi), intent(in ) :: DLL_Model !< Model type of the DLL real(R8Ki), intent(in ) :: Displacement(6) !< OpenFAST global coordinate frame - real(ReKi), intent( out) :: Force(6) !< OpenFAST global coordinate frame + real(R8Ki), intent( out) :: Force(6) !< OpenFAST global coordinate frame type(REDWINdllType), intent(inout) :: dll_data !< DLL coordinate frame arrays in here integer(IntKi), intent( out) :: ErrStat !< Error status of the operation character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None @@ -296,7 +294,7 @@ subroutine REDWINinterface_CalcOutput( DLL_Trgt, DLL_Model, Displacement, Force, CALL CallREDWINdll( DLL_Trgt, DLL_Model, dll_data, ErrStat2, ErrMsg2); if(Failed()) return; ! Coordinate transform from REDWIN frame - Force = real(FromREDWINcoords( dll_data%Force ), ReKi) + Force = FromREDWINcoords( dll_data%Force ) !FIXME: check the runmode info for model 1. Not sure it applies to the other models. @@ -327,8 +325,8 @@ subroutine REDWINinterface_GetStiffMatrix( DLL_Trgt, DLL_Model, Displacement, Fo type(DLL_Type), intent(in ) :: DLL_Trgt !< The DLL to be called. integer(IntKi), intent(in ) :: DLL_Model !< Model type of the DLL real(R8Ki), intent(in ) :: Displacement(6) !< Displacement (OpenFAST global coords) - real(ReKi), intent( out) :: Force(6) !< Resulting force (OpenFAST global coords) - real(ReKi), intent( out) :: StiffMatrix(6,6) !< Returned stiffness (OpenFAST global coords) + real(R8Ki), intent( out) :: Force(6) !< Resulting force (OpenFAST global coords) + real(R8Ki), intent( out) :: StiffMatrix(6,6) !< Returned stiffness (OpenFAST global coords) type(REDWINdllType), intent(inout) :: dll_data integer(IntKi), intent( out) :: ErrStat !< Error status of the operation character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None @@ -350,8 +348,8 @@ subroutine REDWINinterface_GetStiffMatrix( DLL_Trgt, DLL_Model, Displacement, Fo CALL CallREDWINdll( DLL_Trgt, DLL_Model, dll_data, ErrStat2, ErrMsg2); if(Failed()) return; ! Coordinate transformation - Force = real(FromREDWINcoords( dll_data%Force ), ReKi) - StiffMatrix = real(FromREDWINcoords( dll_data%D ), ReKi) + Force = FromREDWINcoords( dll_data%Force ) + StiffMatrix = FromREDWINcoords( dll_data%D ) #ifdef DEBUG_REDWIN_INTERFACE !CALL WrNumAryFileNR ( 59, m%dll_data%avrSWAP,'1x,ES15.6E2', ErrStat, ErrMsg ) @@ -560,18 +558,6 @@ end subroutine CheckREDWINerrors !! | 1 0 0 | !! R = | 0 -1 0 | !! | 0 0 -1 | -function ToREDWINcoordsR4toR8(InArray) result(REDWIN) - real(SiKi), intent(in) :: InArray(6) - real(R8Ki) :: REDWIN(6) - REDWIN(1) = real( InArray(1), R8Ki ) - REDWIN(2) = -real( InArray(2), R8Ki ) - REDWIN(3) = -real( InArray(3), R8Ki ) - REDWIN(4) = real( InArray(4), R8Ki ) - REDWIN(5) = -real( InArray(5), R8Ki ) - REDWIN(6) = -real( InArray(6), R8Ki ) -end function ToREDWINcoordsR4toR8 - -!> \copydoc redwininterface::ToREDWINcoordsR4toR8 function ToREDWINcoordsR8toR8(InArray) result(REDWIN) real(R8Ki), intent(in) :: InArray(6) real(R8Ki) :: REDWIN(6) @@ -583,19 +569,7 @@ function ToREDWINcoordsR8toR8(InArray) result(REDWIN) REDWIN(6) = -InArray(6) end function ToREDWINcoordsR8toR8 -!> \copydoc redwininterface::ToREDWINcoordsR4toR8 -function ToREDWINcoordsR4toR8Mat(InArray) result(REDWIN) - real(SiKi), intent(in) :: InArray(6,6) - real(R8Ki) :: REDWIN(6,6) - REDWIN(:,1) = real( InArray(:,1), R8Ki ) - REDWIN(:,2) = -real( InArray(:,2), R8Ki ) - REDWIN(:,3) = -real( InArray(:,3), R8Ki ) - REDWIN(:,4) = real( InArray(:,4), R8Ki ) - REDWIN(:,5) = -real( InArray(:,5), R8Ki ) - REDWIN(:,6) = -real( InArray(:,6), R8Ki ) -end function ToREDWINcoordsR4toR8Mat - -!> \copydoc redwininterface::ToREDWINcoordsR4toR8 +!> \copydoc redwininterface::ToREDWINcoordsR8toR8 function ToREDWINcoordsR8toR8Mat(InArray) result(REDWIN) real(R8Ki), intent(in) :: InArray(6,6) real(R8Ki) :: REDWIN(6,6) diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index ea752b769..5b17c504c 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -464,7 +464,7 @@ subroutine SoilDyn_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, Err character(*), parameter :: RoutineName = 'SoilDyn_CalcOutput' real(R8Ki) :: Displacement(6) - real(ReKi) :: Force(6) + real(R8Ki) :: Force(6) integer(IntKi) :: i !< generic counter ! Initialize ErrStat @@ -481,8 +481,8 @@ subroutine SoilDyn_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, Err call REDWINinterface_CalcOutput( p%DLL_Trgt, p%DLL_Model, Displacement, Force, m%dll_data(i), ErrStat2, ErrMsg2 ); if (Failed()) return; ! Return force onto the resulting point mesh - y%ReactionForce%Force (1:3,i) = Force(1:3) - y%ReactionForce%Moment(1:3,i) = Force(4:6) + y%ReactionForce%Force (1:3,i) = real(Force(1:3),ReKi) + y%ReactionForce%Moment(1:3,i) = real(Force(4:6),ReKi) write(*,'(f12.5,6(2x,ES12.5E2))') t,Force(1:6) enddo diff --git a/modules/soildyn/src/TODO.txt b/modules/soildyn/src/TODO.txt new file mode 100644 index 000000000..56d88ce21 --- /dev/null +++ b/modules/soildyn/src/TODO.txt @@ -0,0 +1,66 @@ +2020.02.25 + +To Do +===== + +DRIVER +------ + +Output file + + +MODULE +------ + +Outputs + +Change over all use of Force to R8Ki from REDWIN dll. Convert at final output from module only. + +Input file changes +handling of the runmode (RW Model 1) + +Mesh nodes connection to the glue code / SubDyn +Stiffness matrix to summary file (and notes) + +pass in mudline depth + + +OUTSTANDING QUESTIONS +--------------------- +Since we have StVar, can we do correction steps by saving the old copy, and replacing it on corrections? + + +GLUE CODE +--------- + +everything + + + + +NOTES: +-------- +- confirmed that stiffmatrix does not take into account the displacement +- confirmed we need different copies of dll's if multiple used + + + +========================================================================== +FROM the Email/meetings + +- Input file + - Remove “DLL_ProcName” line + - Reference system – define relative to global – but do some error checking on this + - Should pass in water depth – to create warning if the points are not defined below the mudline (-z value) + - Change to capital (X,Y,Z) + - Include DLL name for each point, and ensure they are unique. + - Comments on “Model used in DLL” + - Include units of stiffness and damping matrix. + - Include ability to enter multiple stiffness/damping matrices for a jacket. +- Error handling for the input files vs model being used. +- Is there cross-talk between DLL calls at multiple points? Need to create a different DLL for each call. +- Verification approach – ideas? + - Connect with Erin to do some spot checking. +- Implement the ability to input a time-varying force at the tower top + + diff --git a/modules/soildyn/src/driver/SoilDyn_Driver.f90 b/modules/soildyn/src/driver/SoilDyn_Driver.f90 index 8adf506fb..9bea481ab 100644 --- a/modules/soildyn/src/driver/SoilDyn_Driver.f90 +++ b/modules/soildyn/src/driver/SoilDyn_Driver.f90 @@ -69,9 +69,9 @@ PROGRAM SoilDyn_Driver REAL(DbKi) :: TimeNow ! The current time ! Data transfer - real(ReKi) :: Force(6) + real(R8Ki) :: Force(6) real(R8Ki) :: Displacement(6) - real(ReKi) :: StiffMatrix(6,6) + real(R8Ki) :: StiffMatrix(6,6) real(R8Ki) :: Theta(3) INTEGER(IntKi) :: n !< Loop counter (for time step) @@ -272,7 +272,7 @@ PROGRAM SoilDyn_Driver END IF call WrScr('Stiffness matrix for point '//trim(Num2LStr(i))//' at T = 0') - call WrMatrix( StiffMatrix, CU, '(ES12.4)', 'StiffMatrix' ) + call WrMatrix( StiffMatrix, CU, '(ES12.4)', ' StiffMatrix' ) enddo endif @@ -326,7 +326,7 @@ PROGRAM SoilDyn_Driver END IF call WrScr('Stiffness matrix for point '//trim(Num2LStr(i))//' at T = '//trim(Num2LStr(TMax))) - call WrMatrix( StiffMatrix, CU, '(ES12.4)', 'StiffMatrix' ) + call WrMatrix( StiffMatrix, CU, '(ES12.4)', ' StiffMatrix' ) enddo endif From 7d6378031a9c7ba0317400d08599473ea4245238 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Thu, 12 Mar 2020 18:02:44 -0600 Subject: [PATCH 050/136] SlD: add output channels and output file to driver --- .../src/OutListParameters.xlsx | Bin 107107 -> 113521 bytes modules/soildyn/CMakeLists.txt | 2 +- modules/soildyn/src/SoilDyn.f90 | 47 +- modules/soildyn/src/SoilDyn_IO.f90 | 470 ++++++++++++------ modules/soildyn/src/SoilDyn_Registry.txt | 7 +- modules/soildyn/src/SoilDyn_Types.f90 | 263 +++++++++- modules/soildyn/src/TODO.txt | 22 +- modules/soildyn/src/driver/SoilDyn_Driver.f90 | 24 +- .../src/driver/SoilDyn_Driver_Subs.f90 | 81 ++- 9 files changed, 720 insertions(+), 196 deletions(-) diff --git a/modules/openfast-library/src/OutListParameters.xlsx b/modules/openfast-library/src/OutListParameters.xlsx index 915bc3af5b1d5d28ed572b7f0751471fad04ede2..67ae92b56c445545de1d938feb1c3718e3e020d2 100644 GIT binary patch literal 113521 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ÛIAKcwK7>bB{*`8J5u4NQtdVFund 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

)F~%MRXeur|9L=LG`8lO?1d z*99&M`AF~@x)nu&;0c#Z*AseGfR!Z_B?Cyj2FA7x@pYY9g=H=NZ7;;V`n!pR&%nyO z$TKDG=K(FLbv*0Ve+tY`R^sU{;sv2fUh5+SC z+7O-^o{AvjoeD~SU=RPajs%~CcIDI^H>m>^D+axGD9c8A51BUBcI$0gDR39e4tfka z&Vj&82Rbzdvta$sQrXpMjv{uJ_zH{QrYS*YKQ;_!usjYR75fXgag2SyorM&Lm$ILP z0n+`1|KRJ&M+9RptMp)tqf+QrgB}cnbg3cCPAVA$y(crnwM$f3a~5Qy z2_I{XA(0?;&yym>wJV5lXI$VaPU2@$51dt_60E|n_F5=8O3~iN;wAasS=gKukHX zb60#|;||m}Pkf0bI$;BS!6d(o{BUvAgv{yZ?|rxg6}*20~n0jXX+rg#K8*JMdkBYqjq+RDOj zjPZdjC61b9rV+gHfs`|=T9YrlB>-Hz{3IaAN>L*`tCgRz4y{)Fl64nKM7z7RR*t4SOi z9__LK!hE}t1ng?WgrQS_w|?bk_qSfm(TG-vv72MSRZnpRf4lrSmCCNaVHrmXe7!p% zJuiV+EZv!+IWu035K;;RTe4TcMHv;N7R^SLv|4rpfu%QPl>B5TS>GFoF&ZmD0BE7v z`<--Z-4>Alf3>!sW*NUy5mk0fbXdeQDWVFDCHQU2ru3;)v=ikHCCZ|gU5a4)uCkad z*o!F-4xVbQc0iK#-*LcsKQ}c()=btwAaURs&_;$Ci!Uu#_rJ={!tq5B3r1w$bduT+1HZlJ~zR%5Tb~)^2nNN)gXu;7(izFS?S_dtcWf*A-xSgo_W1 z9XtA#nO@Gi{k$HNL=^cVZ{eX6N+fX)fB=Z2fJh8*TfzTD z{K&9k2qt;rBXIX85J_eM9)rk+h=UjMFvI2hwGc;@&cy@3*xgbxCI&_%ERAKEL*}S~ zwcQ{{jnGU@TNyGnZSGu)8P;ae!yOOHqnh^UycstHbMrHNXDL(kfIpIFz(D6+JCC4d(fqPAN+X_HL1pH7 zL?^hhaz#WWQJ-cdtNa@*<%fmBe9n|dl5Ie&Ek&sWb_UpRAXHG%_Wc$AIFIX404_~1 zE1EkIjZE5yg_||*#17Qu%*t}{a$s3h)!u49$TY*wwj0{Xti)z(9sx5u1^_YJ!vunK zsOD9Ut_!DC3)|urus>DLpE~!`e!jEaiiwJiiux*_IXnf&#$18n)&U@ zRUb!)X{^WS@Nm7iD=&(hqH;8eA>jQWh^AF*5RWG)V$-DT&?Rf1%RJ?MfmZlrUt?~V z{hsCXJ!YQ(n|1=otHmJo^3Ou&TfyBf=*#7sZ3DrxWpPe9DH?;zZ|+`?u3UPhdZ@h| z!h+1?3viyeSr@5nw!9kgTto~@@H!ntBW;*3r$-4qLg?py)l4lcUc*TQB(a%yWSXh0 z6v`G=dT(w)QAKST(P-Fc76Pg9delo;aYH2U$hB9mv%a3tCkSsqkw#yi-kNk`Qiy<% znNw>VuhwIVk5Fn!he@@2uDPEhha(upn^d2F#T?^uzSHp$kAycExqkcHO(Q7CO+53? zP|wCB5ZX(I7Q^BpJ~HBbjzm~rapz5G-e|Bqa*RL70+{(vvV;EwCOx z!xog*d+YOrxvEJg(!r|K-G-lu(3r)eROzv^ z_=@d4jB5zAQ(>ddJaZ)8NMdQ)qge>U@A+v=Mw1lRC_Sabtfc4 z)R3TpY3orQYI`pF-3L|aa`c0b|0K{2jQJS5awfAEDCuiE?|H z7dh4Fg3oD-?@;_To}`0bRIXrWz&nH~7F<6u*w3%D?D1^WB{-Jz`EVI`ORrBMug)Om zcXLVx_`9Fsig3H1&4?lpcxHS+UG+QQ0BL|nt5D!>zQ4CtA!0_7OE@FW5g}$q1gHh0 zZ`CkW7#T;Sp`h`*So2N^dc&!dnKCpjgrcknT(Plz<6T?e<*z1hU{iLaRap*iK4k-M zg0H79@{HTfcf&h3!N}?1J-SbSie)~3)X=G=G~Q&w+%7<^Y|Lg0)K5f;Vqhbx90)8b(RVIbztF3%xs zC#Z;!DR9RDHJ@|Kw$9yg0YnRjRQjUU0=b!S=?=GfAhe^GLHp;*l=lb0w@4|V*SwuT zzaC9|sj9?~@r4yWra&w9HynYj&ial@4}f%h`+MC(+`gQQF}^&Xr0y+nZUh z?l6?J9?@Lf2XY6mTqu_iL_sp*ExE{%T2ZGWF?$!SraxA5bCQjc%#uHT;*5(JcV+&Q z1ihES1wpt9)`}~Ipe1NiQP#*1ydttvwRvg1GAX{p;&rhvYqZ*w=IE!b?5SPf#qud1 zH`5rY6$^%sdPV=rGVSKb6Ny2-jF{tl4osB{`)8qQZS5Q` zOg?fzUdkP1ExrVuejE>2V(PS9DZWjS>IFAaH^sJLN471&BhTFG*-m}FtXqVjJcn2G zeX)3&wM!BWohSGixOG=U{zQ+-a|32sE%d4Lz4nqMtT(a;%;J5288cpNTS8axj_>G+ zzd~4}G3Ny{DcS|nV%*0k$)SbX)p zkRgm4qIiH-{3wY!0{%wXo&D_z(Z>k?j}8>9(UojRy3@3JOl$_LDWgOuJ3!{=1fltg zsSQKI^L|e3a1q>Y0XT ziWkMO!aZ5PhB~Cpp5MZf9o)8=c$QdB$`Q0{UNE-aBNRUZJS8pW5U*vD*Hv19m56d^hPpks9unW?u3z^#)<0s8l_~KZ^=Stne|Ox6v)txW9n%Q{ zloN3M0I~y!5{<*_^zA^XgMd4aoIFoNCUjec16a zQR!f_8^bT3FGBe67AWxq0b;K$VF`Pr?R1~}@W>6c)EqsX<~hXhyq_$)>X`WYd0A{G z)Z;#fq<0?n=^Z!3C6EwEoRD4I0q%%I?GuP}1E3?WKMN5;Zt`R0RDe{vr*u5oNs;#z z576iIL3cNMFFUsFV4x0<^aMN6R<46bG~Dxs!6PJ;z*@Z#;vv3YmAr$w*$FoG0=4>} zUIfVt{;pj`T-+(8XTi1t616V21J#99T3CQ*AQt+?v$*9~?gSwzCq_BBU&RC9^qo?y zpBo|22WA}>v0fQZmh@o(&N+|>dC)~5_t;)UHJEyM1&a2mx3j?f@1_XqX`0siYXcPU zTE9wVlXmEaLQKq%=*nSIWoNA7>5%PW;8g*lIlw> zB7V^eK{SCV31ICSjxuVh{~O>@>jFg&I$qR^O$$5wFX$JjWG9W>=jTnBeGn6K?DMa~ z;F2Qh|7spPjc#lJtD=G~qV(l6z!TbuJ@MZ{xqkmOMWN!-~dLR4Hl)EGEek1>%dJqs;ujkYx-9neAyNfcGzb3!boGZV-;kx#s zeRE%bAE!^?eRHy67xvW#O<~0I=4VRXz3riDsIK7n&Ax4F!CCkrj|Ttqp0queMLP}r z3G*M#37n#UdQA$YNs*UAQ;o_GkxVzR;D)FAr7jT9q&`?|3tMum&yDdZR5aa{|m?x|py zOZ0vCyGCmG>z1}I2`+b)qwTHo<+ov&Y}Y4t)3dA5(lzlRlS(o)^(k^ITc&TV!eM&_ z_XFBVSbTKw?i=7Eay0~8hLmk_?{#RnRHoFNxmn;LzJ|`e_u|M^)Pe@~hy;mtcZg7a zH^6&Q_q2(DBt}~(v?RwmcN)`Ow7P@wgZ*~JPs9+Eo8r3iHHt1xpO#*de%D^i7xc?a zxjhXfPmjH(cfQ#-Y0nR|;uyOsiP9cCVG(z9o`vQqnz!VTQ=D~02?xzRFS`~|@W?-c zJ`J{nPD-_Hap}D&`g|IG+1S?Q{N89X%KGzEf~C2KIgd4ZXqJBTY+YKKF@xD&72#A5 znKx8AY5y^DX!KfSd}58#*Dn<*1oju7U1vUbspaX4e4m>wxR&;J5i#!6@`JcHTEOT! zCzi^qi-=awF-SoiX*76x6P?TF^s9H-g%@h(Y}vK6k%KS!VI_Pj9;!~$|IFq!_~&6ok}b%Y{~?I2f{Tm-oMCxejg**gllRh zIw3}Z__H(?$FVq+w^8py&1ZBl{f+k@YTIRw={UDJ8OqNx+s1ra_aHuoFbWH`>dL`|df^;30b0{B6lQAjd_CB5! zBywQrea!sj2Wklgd$crFsDvOnMXf$EaYS~PV=9h4u^j}mc~xhjj+L4CkBw3Hw*j@1 ziK~J|aX6WcscDCjVP6_Cicx-lkB4TDG8DFKrf62VHOr__LUH28tdADfh(l1@1{-MK zY<&GA=eLHz64;&0e)IPA5OlX8W3O=;UC*LOaI*tmaJfIWz>!k5SZXI098mZSuUDQfhh}zLL#XyaS0_d*aNxd>YE> zs$ImHw)8hrcqK$u%(&ZRXg{} z`ZUmuj&2Xi{X=uaWycm_dUC76)qPA-|jTgNv5klnSrV-oM%;3pOWf84@QG&qny5y z)h?1;NMv`NWj$BR_)yV?vG|xO7~(o3lQk!fS8+WpK>)+V$zGws%*=I#87f zwq2%&$Qiut0~A!+AVvZnAYN{5S0?$bRwqG+b!-(%8oXj;2FCXel8Pg9*6zOEj>0>N z^@*FKI{TUpNcMamZ^iP&W`PEN9(NlLE@d&qp?3=8+lQl!=&2uYL~2ps=8R8f1&plr zGJB=Bb*L4>D0RI_W{I+UYui+;kpKlW^y}by&?jX!nMm7!+-ZmyCGAr^zjOy-4@D&& zHrLsYUd{mX@m|?T3rw#S@_}~@VvoZ;U*Q*PS0*l-J$q@fm)Ui>G`D0_ur1^PNQMeX z2BjZphnN{CBi6bmp1myFhWXaMRlb+@^h6Wt(8>lJd?KXy)*KW@W{SQ?`-M^*hr{42&h*#+r zH(@y|{M9X|&-Kan;9e8w^6j?4{pF&8_-zK%`)(%^*prge=lRy@L~{ zk%Pm-KH1ct;bE9FLBP(h|KI+ksx8}p=fd{RsJ`zQ6nSi;UPH592$!c}B?4dVl`6U^ zRV?gcl7fCU1C5Ep*4V0US&STU%@AKs(zkI`ly`Wo&HDlI_A#wtj$)j4_~+}NbxWHe z7t{*0)%;u^YFDz+?(Qg3gmit;P(?d%f%gTozkl=m%O{c_o#))PT(LTzKKhpGzDmiH z@9Z7`V=|6LzV&=*gx5|Vb@HLsa8ivtVb$j&qlU)KO_!rCwb8dnAEnq>V3%T+S+|Sp zEUD|HSn-NS`kd(`dA|p8|7ZX;xUky18?u-&MPuO$t3Xf+JZs;2(q1Z|b~OCnF};ch z{Y6xV@Y)n`Zx&&6MyK>M8~pfA79&{PV#9FN`No5eL)o2lPeg3dY-9`nnzyg<$VQ%sa3v?_leOYX-@pVwv=2t23?%henLrmYT*HXIs#_{Q5vGu;^v)9&1oDu&UFYH#eGv=}*W zR*;#d-*{D2<2Co#ZD0l1M57>~l*%>X+4}0Q)&q|vlbBCcGl&fBJgq6h8V>G8+Pu9` z4I7*ZhWo3{O zHa5kB;uuu8jC`90Ov>!zm)J`2JddhG4EsxTFLmuvqXcbTN=(U$U+nAo`xN!If5-ps zH)Nr(#+4rIoUYorMv{GEIz*w^D${l~ieR$hTHXc8KH_U=8T@3iGAt$KD6hRhBL-z( z-V+8*jb0njo?sZq~F0_-6tw4R; zENx+AY4@O-HW3}Dom|*Yq5k*SXLb|r*ztK{%-(+963=HCqio~_Lhf2VW->+c9w#Pw zd*&5TYCSgL8Rh3-rvH>LQRO#(S~(Z6W@TB)jYsN6)AhJmv!!Y*tr;UH$8XlR3@l_d z{LQ#>;Rk|TjK`yXjcC*9X8dYAkM88pOSOA1nOJg;T3XYR!L$NzaBy|J|WU=(7+ zY{+cJ1wZ~0T?Rc*BH;;k3a=K|7Ee77Ge{00$S~+>5KoXokSO(hQb%G3D2&9{H#$&q z6%#HJ`~Du$Oa@UVNK@~UoJArzjmAGT+7IP9k6+vvJQu7YLJB6mgpISI#R@LpbVKxk7nJ=Gng4GSrJne0vU3f6Cc^%bV6RsyAxxLDS=~ya-4Ru$l z#hZ(_@?%yQautFbPEfXU%hC*d``F{XAx6YkBPsW2(oL<)uA`})afe$Y9b)#R=HO4K z=i)oj4O93@w?z`~vNUECH>dKO$xCcmsG&g$4UWYDIUlk50N zb}>EqUWUn=;@jQb>iYWg8&3~RsqH7R0V17@ zLw2?B^mlB#Q=6*WQlve4xmX6yp1dLjvFV%TKYAN|cQ7YLh{<1Sd43Dr>+Vc5twcpS zN2Dy+T+*|mcJi7jiT^S-CZax_dd>B7^9aRG+{JXb^__x@)t*(=RuLNSPjfJzcexn% zj{N1$@geMIm>r9RAQ=ow48JjK;y=DTX+T!<2JpB9PF75*8^R{kD>~4|FE&OomrZoL z;Xk(@!qG`Hj*x`&*>&@6d!7-j8g@2A3G!^!2Cj)7RMZ z!Kl_3En4D&PS+Pu=w(JTn@Zj_$#oBl>(BVRZ$y-ehS@Y+q_DrfoH2fRegE6|rP#b9 z_6FJ}0iW^zHYK?qrew8h(@WS_*kb1}O>^%1~3` zi&<%$M~~i0KbhHj7lTnf#`}sI8RPatmP+<>WMuTz(K9(63wabd`)3*?P2|mQkO!D7 z_o6zlL?NHz5usCTvcdU1aAnxeu(d63I*#-FH}~9gHAx$tj4BRr&m zvSi@RxwU)bwPA=tkNe>BPLnWmkT=W{wZpGTV&x|m6D541{TUTD<&V19s?x&v8b0+5nMEnsNJYBe0t5BGhwxK5>46Xe2oy#8e;q=ehaue6 z?r@wJz}C-Cdc4Q5%@IsFnLaMf`*OFQx5e2arZVvZEv<^}cwV;OGc74a7;;c$N&1n{ zt*^JQc#grSZlqW)nzEWDlZ%L43b~XOvoD&V>*bkI4XwGd6q2K1<|?vx=k&^{^lTu< zjkEHA1dQuCMLn7r^-9O4G8Is`{c3-(lYjSdGiAmQ&inrP(ojVUf>P<+4x|ZsLYi;g za#ABgRun%|USp1gzy<>&_j=hk6m-oNj%*%AvhN<_SU z5(clSF#kFdyGK;=W9|lNWA!Nd+KH)lWVas6myos2;*Hagwo#dHs&~A{KRsVQ!<=)# zhs|P8)j+-F8tkOeA*obhjeWG~WQL#7t)|#efN>V0dGJLGrAeg+#>A>4)zt!PQD|e= z#8yB^<}~;7U=E)i>H*;v0>7s}+O)BQk2PA^dCou*gtw$$fwW=zux_Dr|LCKjdN@&i zsSATPaW`)TBnVwhA}2LAbWMSnFETx66Pv9VZh`67&0T`?TGEb_kX1vW{JBb#q&Jwr_JPl|uSr9*?M*A(auZI8(Q}d~ zKFbK|Z10uMrY~Sin^~*SkU48u0e-wgs zHLc$6qHuF3@FBhX_7NwsRCHId=z`GW?~nG=zNHDOkZEv-f7}*+^CQ&_0ZUGWp7^_+ zR_znfS--F}QY9#Xv!fbb(^vH7R|(y(2`{-!Nc|i;<`=&Yyofl*i$bQ&!r(wX!JG?4 zM6^0Y?G71{*wn2t^uHcyV&*eMbldPq+t;Ar zi}4W+X;98P5c)1huo5jgUcd_(DS|2o}>!B&iVeexS8xH#j!L+#s z6vL4-3!L9SZX(FDI+J;JYfBK6^IA^VTjO(=QaE1E&aAW>Y!6i7aty2$&@#+-!2tZ_ zfH>Q79e5r1B_Y_ehA$-z&f2Mcv5RRQyK&n2ko&ZIbB~JF>wNbz#2sNhSAD8hfAa$h zGXlT+NQP9yZ|{Q4Q4r4dP9N>Iiw();yVdqy`?nha9_#Pb7Y3FCgbzXlAp=KfK=LsR zNg2S(+>HVP;Q>ef{n3@S2OL~GX9Kl&4yI1}4^F%Ci+=;usB_Vs08|P<0E+f6>RG^9 zHgGhxapHXR@ckzt6}rN$6maDtBoK)7Uxc@azhZ^ow66A!)^F_Xtsk!aSDevIqCsT9 z0YE?nfw2CC;{(V9#2o)b_>+kMkgiEMV1Am3K_KAIKR(qM|4r;& zZzwI9Z7nYVC7}R%;omBX7WWIq*}~M;l=Ig&_ul|IZ!=wwfR6ou0|Eh~`j1a=$}a#X z=XW-yPJbg^O7lBT1YFB10hm7|$jSJt1iXJk;mbk+ZVCW_9@L%gAD0J#9DDyn`K|T8 zl;s!JUv<7mBE_2VH3;PF0}ssQe}2Gyza_FTax^tjbp`@d^S=s)*UgUicb0}3Vg69I zf3U>!Al_eD60zlZ(eYOqN16U#0DleGUjboIKNv~?%A*EMtbZ%dIP;%?zq;$MV}H;M z!w~`ofesDf{y=%o@mG{z68^bN{5v`Q&;CZth5`MVs{WJu-#NN}Qj6vNgZjTRc7Kxp znMU~^fVqNSBK#|<@+bA5X^a1%&j0d@`j4c=Uy~Srg8mtJ{ST;c$^QlPR~Ysu=%1m$ i|A5|>{$D_U1qRA55CH1|0+9eeE5N@zs)0EN`hNgbu~-!V literal 107107 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 z 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 E0X<~j`Tzg` diff --git a/modules/soildyn/CMakeLists.txt b/modules/soildyn/CMakeLists.txt index 4cad9feb5..e853e42a9 100644 --- a/modules/soildyn/CMakeLists.txt +++ b/modules/soildyn/CMakeLists.txt @@ -34,7 +34,7 @@ set(SOILDYN_DRIVER_SOURCES src/driver/SoilDyn_Driver.f90 ) add_executable(soildyn_driver ${SOILDYN_DRIVER_SOURCES}) -target_link_libraries(soildyn_driver soildynlib nwtclibs ${CMAKE_DL_LIBS}) +target_link_libraries(soildyn_driver soildynlib nwtclibs versioninfolib ${CMAKE_DL_LIBS}) install(TARGETS soildynlib soildyn_driver diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index 5b17c504c..36f37439a 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -84,7 +84,6 @@ subroutine SoilDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In ! local variables integer(IntKi) :: j !< generic counter - integer(IntKi) :: NumOuts !< number of outputs; would probably be in the parameter type integer(IntKi) :: ErrStat2 !< local error status character(ErrMsgLen) :: ErrMsg2 !< local error message character(*), parameter :: RoutineName = 'SoilDyn_Init' @@ -94,7 +93,6 @@ subroutine SoilDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In ! Initialize variables ErrStat = ErrID_None ErrMsg = "" -NumOuts = 2 ! Initialize the NWTC Subroutine Library call NWTC_Init( ) @@ -124,20 +122,6 @@ subroutine SoilDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In !FIXME: set some initial values of y and u here) -!FIXME: Develop a list of outputs, and set that up somewhere. - ! Define system output initializations (set up mesh) here: - call AllocAry( y%WriteOutput, NumOuts, 'WriteOutput', ErrStat2, ErrMsg2 ); if (Failed()) return; - - y%WriteOutput = 0 - - ! Define initialization-routine output here: - call AllocAry(InitOut%WriteOutputHdr,NumOuts,'WriteOutputHdr',ErrStat2,ErrMsg2); if (Failed()) return; - call AllocAry(InitOut%WriteOutputUnt,NumOuts,'WriteOutputUnt',ErrStat2,ErrMsg2); if (Failed()) return; - - InitOut%WriteOutputHdr = (/ 'Time ', 'Column2' /) - InitOut%WriteOutputUnt = (/ '(s)', '(-)' /) - - if (InitInp%Linearize) then ! If the module does not implement the four Jacobian routines at the end of this template, or the module cannot @@ -167,9 +151,19 @@ subroutine SoilDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In enddo -!FIXME: create all the meshes that are needed and check against points handed in - + ! set paramaters for I/O data + InitOut%Ver = SoilDyn_Ver + p%NumOuts = InputFileData%NumOuts + call AllocAry( InitOut%WriteOutputHdr, p%NumOuts, 'WriteOutputHdr', errStat2, errMsg2 ); if (Failed()) return; + call AllocAry( InitOut%WriteOutputUnt, p%NumOuts, 'WriteOutputUnt', errStat2, errMsg2 ); if (Failed()) return; + call AllocAry( y%WriteOutput, p%NumOuts, 'WriteOutput', ErrStat2, ErrMsg2 ); if (Failed()) return; + y%WriteOutput = 0 + call SetOutParam(InputFileData%OutList, p, ErrStat2, ErrMsg2); if (Failed()) return; + do j=1,p%NumOuts + InitOut%WriteOutputHdr(j) = p%OutParam(j)%Name + InitOut%WriteOutputUnt(j) = p%OutParam(j)%Units + end do contains logical function Failed() @@ -232,27 +226,26 @@ subroutine SoilDyn_InitMeshes( InputFileData, InitInp, u, y, p, m, ErrStat, ErrM real(R8Ki) :: DCM(3,3) real(ReKi) :: Pos(3) - integer(IntKi) :: NumPoints ! Number of points from input file real(ReKi), allocatable :: MeshLocations(:,:) select case(p%CalcOption) case (Calc_StiffDamp) - NumPoints = 1_IntKi + p%NumPoints = 1_IntKi !FIXME: update to allow more than one set of points ! NumPoints = InputFileData%StiffDamp_NumPoints -! call AllocAry(MeshLocations,3,NumPoints,'Mesh locations',ErrStat2,ErrMsg2); +! call AllocAry(MeshLocations,3,p%NumPoints,'Mesh locations',ErrStat2,ErrMsg2); ! do i=1,size(MeshLocations,2) ! MeshLocations(1:3,i) = InputFileData%StiffDamp_locations(1:3,i) ! enddo case (Calc_PYcurve) - NumPoints = InputFileData%PY_NumPoints - call AllocAry(MeshLocations,3,NumPoints,'Mesh locations',ErrStat2,ErrMsg2); + p%NumPoints = InputFileData%PY_NumPoints + call AllocAry(MeshLocations,3,p%NumPoints,'Mesh locations',ErrStat2,ErrMsg2); do i=1,size(MeshLocations,2) MeshLocations(1:3,i) = InputFileData%PY_locations(1:3,i) enddo case (Calc_REDWIN) - NumPoints = InputFileData%DLL_NumPoints - call AllocAry(MeshLocations,3,NumPoints,'Mesh locations',ErrStat2,ErrMsg2); + p%NumPoints = InputFileData%DLL_NumPoints + call AllocAry(MeshLocations,3,p%NumPoints,'Mesh locations',ErrStat2,ErrMsg2); do i=1,size(MeshLocations,2) MeshLocations(1:3,i) = InputFileData%DLL_locations(1:3,i) enddo @@ -264,7 +257,7 @@ subroutine SoilDyn_InitMeshes( InputFileData, InitInp, u, y, p, m, ErrStat, ErrM CALL MeshCreate( BlankMesh = u%SoilMotion & , IOS = COMPONENT_INPUT & - , NNodes = NumPoints & + , NNodes = p%NumPoints & , TranslationDisp = .TRUE. & , TranslationVel = .TRUE. & , TranslationAcc = .TRUE. & @@ -279,7 +272,7 @@ subroutine SoilDyn_InitMeshes( InputFileData, InitInp, u, y, p, m, ErrStat, ErrM ! Assuming zero orientation displacement for start DCM = 0.0_DbKi - do i=1,NumPoints + do i=1,p%NumPoints CALL MeshPositionNode( Mesh = u%SoilMotion & , INode = i & , Pos = MeshLocations(1:3,i) & diff --git a/modules/soildyn/src/SoilDyn_IO.f90 b/modules/soildyn/src/SoilDyn_IO.f90 index 84b2ab63f..1a0d1b91c 100644 --- a/modules/soildyn/src/SoilDyn_IO.f90 +++ b/modules/soildyn/src/SoilDyn_IO.f90 @@ -25,35 +25,152 @@ MODULE SoilDyn_IO IMPLICIT NONE -!FIXME: add the matlab generated output stuff here. + ! =================================================================================================== ! NOTE: The following lines of code were generated by a Matlab script called "Write_ChckOutLst.m" -! using the parameters listed in the "OutListParameters.xlsx" Excel file. Any changes to these -! lines should be modified in the Matlab script and/or Excel worksheet as necessary. +! using the parameters listed in the "OutListParameters.xlsx" Excel file. Any changes to these +! lines should be modified in the Matlab script and/or Excel worksheet as necessary. ! =================================================================================================== -! This code was generated by Write_ChckOutLst.m at 23-Apr-2015 13:13:13. +! This code was generated by Write_ChckOutLst.m at 12-Mar-2020 13:30:14. ! Parameters related to output length (number of characters allowed in the output data headers): + INTEGER(IntKi), PARAMETER :: OutStrLenM1 = ChanLen - 1 + ! Indices for computing output channels: - ! NOTES: + ! NOTES: ! (1) These parameters are in the order stored in "OutListParameters.xlsx" - ! (2) Array y%AllOuts() must be dimensioned to the value of the largest output parameter + ! (2) Array AllOuts() must be dimensioned to the value of the largest output parameter + + ! Time: + + INTEGER(IntKi), PARAMETER :: Time = 0 + + + ! Forces: + + INTEGER(IntKi), PARAMETER :: Sld1Fxg = 1 + INTEGER(IntKi), PARAMETER :: Sld1Fyg = 2 + INTEGER(IntKi), PARAMETER :: Sld1Fzg = 3 + INTEGER(IntKi), PARAMETER :: Sld1Mxg = 4 + INTEGER(IntKi), PARAMETER :: Sld1Myg = 5 + INTEGER(IntKi), PARAMETER :: Sld1Mzg = 6 + INTEGER(IntKi), PARAMETER :: Sld2Fxg = 7 + INTEGER(IntKi), PARAMETER :: Sld2Fyg = 8 + INTEGER(IntKi), PARAMETER :: Sld2Fzg = 9 + INTEGER(IntKi), PARAMETER :: Sld2Mxg = 10 + INTEGER(IntKi), PARAMETER :: Sld2Myg = 11 + INTEGER(IntKi), PARAMETER :: Sld2Mzg = 12 + INTEGER(IntKi), PARAMETER :: Sld3Fxg = 13 + INTEGER(IntKi), PARAMETER :: Sld3Fyg = 14 + INTEGER(IntKi), PARAMETER :: Sld3Fzg = 15 + INTEGER(IntKi), PARAMETER :: Sld3Mxg = 16 + INTEGER(IntKi), PARAMETER :: Sld3Myg = 17 + INTEGER(IntKi), PARAMETER :: Sld3Mzg = 18 + INTEGER(IntKi), PARAMETER :: Sld4Fxg = 19 + INTEGER(IntKi), PARAMETER :: Sld4Fyg = 20 + INTEGER(IntKi), PARAMETER :: Sld4Fzg = 21 + INTEGER(IntKi), PARAMETER :: Sld4Mxg = 22 + INTEGER(IntKi), PARAMETER :: Sld4Myg = 23 + INTEGER(IntKi), PARAMETER :: Sld4Mzg = 24 + INTEGER(IntKi), PARAMETER :: Sld5Fxg = 25 + INTEGER(IntKi), PARAMETER :: Sld5Fyg = 26 + INTEGER(IntKi), PARAMETER :: Sld5Fzg = 27 + INTEGER(IntKi), PARAMETER :: Sld5Mxg = 28 + INTEGER(IntKi), PARAMETER :: Sld5Myg = 29 + INTEGER(IntKi), PARAMETER :: Sld5Mzg = 30 + INTEGER(IntKi), PARAMETER :: Sld6Fxg = 31 + INTEGER(IntKi), PARAMETER :: Sld6Fyg = 32 + INTEGER(IntKi), PARAMETER :: Sld6Fzg = 33 + INTEGER(IntKi), PARAMETER :: Sld6Mxg = 34 + INTEGER(IntKi), PARAMETER :: Sld6Myg = 35 + INTEGER(IntKi), PARAMETER :: Sld6Mzg = 36 + INTEGER(IntKi), PARAMETER :: Sld7Fxg = 37 + INTEGER(IntKi), PARAMETER :: Sld7Fyg = 38 + INTEGER(IntKi), PARAMETER :: Sld7Fzg = 39 + INTEGER(IntKi), PARAMETER :: Sld7Mxg = 40 + INTEGER(IntKi), PARAMETER :: Sld7Myg = 41 + INTEGER(IntKi), PARAMETER :: Sld7Mzg = 42 + INTEGER(IntKi), PARAMETER :: Sld8Fxg = 43 + INTEGER(IntKi), PARAMETER :: Sld8Fyg = 44 + INTEGER(IntKi), PARAMETER :: Sld8Fzg = 45 + INTEGER(IntKi), PARAMETER :: Sld8Mxg = 46 + INTEGER(IntKi), PARAMETER :: Sld8Myg = 47 + INTEGER(IntKi), PARAMETER :: Sld8Mzg = 48 + INTEGER(IntKi), PARAMETER :: Sld9Fxg = 49 + INTEGER(IntKi), PARAMETER :: Sld9Fyg = 50 + INTEGER(IntKi), PARAMETER :: Sld9Fzg = 51 + INTEGER(IntKi), PARAMETER :: Sld9Mxg = 52 + INTEGER(IntKi), PARAMETER :: Sld9Myg = 53 + INTEGER(IntKi), PARAMETER :: Sld9Mzg = 54 + + + ! Displacements: + + INTEGER(IntKi), PARAMETER :: Sld1TDxg = 55 + INTEGER(IntKi), PARAMETER :: Sld1TDyg = 56 + INTEGER(IntKi), PARAMETER :: Sld1TDzg = 57 + INTEGER(IntKi), PARAMETER :: Sld1RDxg = 58 + INTEGER(IntKi), PARAMETER :: Sld1RDyg = 59 + INTEGER(IntKi), PARAMETER :: Sld1RDzg = 60 + INTEGER(IntKi), PARAMETER :: Sld2TDxg = 61 + INTEGER(IntKi), PARAMETER :: Sld2TDyg = 62 + INTEGER(IntKi), PARAMETER :: Sld2TDzg = 63 + INTEGER(IntKi), PARAMETER :: Sld2RDxg = 64 + INTEGER(IntKi), PARAMETER :: Sld2RDyg = 65 + INTEGER(IntKi), PARAMETER :: Sld2RDzg = 66 + INTEGER(IntKi), PARAMETER :: Sld3TDxg = 67 + INTEGER(IntKi), PARAMETER :: Sld3TDyg = 68 + INTEGER(IntKi), PARAMETER :: Sld3TDzg = 69 + INTEGER(IntKi), PARAMETER :: Sld3RDxg = 70 + INTEGER(IntKi), PARAMETER :: Sld3RDyg = 71 + INTEGER(IntKi), PARAMETER :: Sld3RDzg = 72 + INTEGER(IntKi), PARAMETER :: Sld4TDxg = 73 + INTEGER(IntKi), PARAMETER :: Sld4TDyg = 74 + INTEGER(IntKi), PARAMETER :: Sld4TDzg = 75 + INTEGER(IntKi), PARAMETER :: Sld4RDxg = 76 + INTEGER(IntKi), PARAMETER :: Sld4RDyg = 77 + INTEGER(IntKi), PARAMETER :: Sld4RDzg = 78 + INTEGER(IntKi), PARAMETER :: Sld5TDxg = 79 + INTEGER(IntKi), PARAMETER :: Sld5TDyg = 80 + INTEGER(IntKi), PARAMETER :: Sld5TDzg = 81 + INTEGER(IntKi), PARAMETER :: Sld5RDxg = 82 + INTEGER(IntKi), PARAMETER :: Sld5RDyg = 83 + INTEGER(IntKi), PARAMETER :: Sld5RDzg = 84 + INTEGER(IntKi), PARAMETER :: Sld6TDxg = 85 + INTEGER(IntKi), PARAMETER :: Sld6TDyg = 86 + INTEGER(IntKi), PARAMETER :: Sld6TDzg = 87 + INTEGER(IntKi), PARAMETER :: Sld6RDxg = 88 + INTEGER(IntKi), PARAMETER :: Sld6RDyg = 89 + INTEGER(IntKi), PARAMETER :: Sld6RDzg = 90 + INTEGER(IntKi), PARAMETER :: Sld7TDxg = 91 + INTEGER(IntKi), PARAMETER :: Sld7TDyg = 92 + INTEGER(IntKi), PARAMETER :: Sld7TDzg = 93 + INTEGER(IntKi), PARAMETER :: Sld7RDxg = 94 + INTEGER(IntKi), PARAMETER :: Sld7RDyg = 95 + INTEGER(IntKi), PARAMETER :: Sld7RDzg = 96 + INTEGER(IntKi), PARAMETER :: Sld8TDxg = 97 + INTEGER(IntKi), PARAMETER :: Sld8TDyg = 98 + INTEGER(IntKi), PARAMETER :: Sld8TDzg = 99 + INTEGER(IntKi), PARAMETER :: Sld8RDxg = 100 + INTEGER(IntKi), PARAMETER :: Sld8RDyg = 101 + INTEGER(IntKi), PARAMETER :: Sld8RDzg = 102 + INTEGER(IntKi), PARAMETER :: Sld9TDxg = 103 + INTEGER(IntKi), PARAMETER :: Sld9TDyg = 104 + INTEGER(IntKi), PARAMETER :: Sld9TDzg = 105 + INTEGER(IntKi), PARAMETER :: Sld9RDxg = 106 + INTEGER(IntKi), PARAMETER :: Sld9RDyg = 107 + INTEGER(IntKi), PARAMETER :: Sld9RDzg = 108 - ! Time: - - INTEGER(IntKi), PARAMETER :: Time = 0 ! The maximum number of output channels which can be output by the code. - INTEGER(IntKi), PARAMETER :: MaxOutPts = 1 - -! INTEGER(IntKi), PARAMETER :: WindMeas(5) = (/ WindMeas1, WindMeas2, WindMeas3, WindMeas4, WindMeas5 /) ! Array of output constants -! INTEGER(IntKi), PARAMETER :: WindVelX(9) = (/ Wind1VelX, Wind2VelX, Wind3VelX, Wind4VelX, Wind5VelX, Wind6VelX, Wind7VelX, Wind8VelX, Wind9VelX /) ! Array of output constants -! INTEGER(IntKi), PARAMETER :: WindVelY(9) = (/ Wind1VelY, Wind2VelY, Wind3VelY, Wind4VelY, Wind5VelY, Wind6VelY, Wind7VelY, Wind8VelY, Wind9VelY /) ! Array of output constants -! INTEGER(IntKi), PARAMETER :: WindVelZ(9) = (/ Wind1VelZ, Wind2VelZ, Wind3VelZ, Wind4VelZ, Wind5VelZ, Wind6VelZ, Wind7VelZ, Wind8VelZ, Wind9VelZ /) ! Array of output constants + INTEGER(IntKi), PARAMETER :: MaxOutPts = 108 +!End of code generated by Matlab script +! =================================================================================================== + INTEGER(IntKi), PARAMETER :: MaxNumberOfOutputLocations = 9 ! This is based on our coding of 1 digit on output point number ! =================================================================================================== @@ -367,158 +484,193 @@ END SUBROUTINE SoilDyn_SetParameters + !********************************************************************************************************************************** ! NOTE: The following lines of code were generated by a Matlab script called "Write_ChckOutLst.m" -! using the parameters listed in the "OutListParameters.xlsx" Excel file. Any changes to these -! lines should be modified in the Matlab script and/or Excel worksheet as necessary. -! This code was generated by Write_ChckOutLst.m at 23-Apr-2015 13:13:13. +! using the parameters listed in the "OutListParameters.xlsx" Excel file. Any changes to these +! lines should be modified in the Matlab script and/or Excel worksheet as necessary. !---------------------------------------------------------------------------------------------------------------------------------- +!> This routine checks to see if any requested output channel names (stored in the OutList(:)) are invalid. It returns a +!! warning if any of the channels are not available outputs from the module. +!! It assigns the settings for OutParam(:) (i.e, the index, name, and units of the output channels, WriteOutput(:)). +!! the sign is set to 0 if the channel is invalid. +!! It sets assumes the value p%NumOuts has been set before this routine has been called, and it sets the values of p%OutParam here. +!! +!! This routine was generated by Write_ChckOutLst.m using the parameters listed in OutListParameters.xlsx at 12-Mar-2020 13:30:14. SUBROUTINE SetOutParam(OutList, p, ErrStat, ErrMsg ) -! This routine checks to see if any requested output channel names (stored in the OutList(:)) are invalid. It returns a -! warning if any of the channels are not available outputs from the module. -! It assigns the settings for OutParam(:) (i.e, the index, name, and units of the output channels, WriteOutput(:)). -! the sign is set to 0 if the channel is invalid. -! It sets assumes the value p%NumOuts has been set before this routine has been called, and it sets the values of p%OutParam here. !.................................................................................................................................. IMPLICIT NONE - CHARACTER(ChanLen), INTENT(IN) :: OutList(:) !< The list out user-requested outputs - TYPE(Sld_ParameterType), INTENT(INOUT) :: p !< The module parameters - INTEGER(IntKi), INTENT(OUT) :: ErrStat !< The error status code - CHARACTER(*), INTENT(OUT) :: ErrMsg !< The error message, if an error occurred - - INTEGER :: ErrStat2 ! temporary (local) error status - INTEGER :: I ! Generic loop-counting index - INTEGER :: J ! Generic loop-counting index - INTEGER :: INDX ! Index for valid arrays - - LOGICAL :: CheckOutListAgain ! Flag used to determine if output parameter starting with "M" is valid (or the negative of another parameter) - LOGICAL :: InvalidOutput(0:MaxOutPts) ! This array determines if the output channel is valid for this configuration - CHARACTER(ChanLen) :: OutListTmp ! A string to temporarily hold OutList(I) - CHARACTER(*), PARAMETER :: RoutineName = "SetOutParam" - -!!! CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry(32) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically -!!! "WIND1VELX","WIND1VELY","WIND1VELZ","WIND2VELX","WIND2VELY","WIND2VELZ","WIND3VELX", & -!!! "WIND3VELY","WIND3VELZ","WIND4VELX","WIND4VELY","WIND4VELZ","WIND5VELX","WIND5VELY", & -!!! "WIND5VELZ","WIND6VELX","WIND6VELY","WIND6VELZ","WIND7VELX","WIND7VELY","WIND7VELZ", & -!!! "WIND8VELX","WIND8VELY","WIND8VELZ","WIND9VELX","WIND9VELY","WIND9VELZ","WINDMEAS1", & -!!! "WINDMEAS2","WINDMEAS3","WINDMEAS4","WINDMEAS5"/) -!!! INTEGER(IntKi), PARAMETER :: ParamIndxAry(32) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) -!!! Wind1VelX , Wind1VelY , Wind1VelZ , Wind2VelX , Wind2VelY , Wind2VelZ , Wind3VelX , & -!!! Wind3VelY , Wind3VelZ , Wind4VelX , Wind4VelY , Wind4VelZ , Wind5VelX , Wind5VelY , & -!!! Wind5VelZ , Wind6VelX , Wind6VelY , Wind6VelZ , Wind7VelX , Wind7VelY , Wind7VelZ , & -!!! Wind8VelX , Wind8VelY , Wind8VelZ , Wind9VelX , Wind9VelY , Wind9VelZ , WindMeas1 , & -!!! WindMeas2 , WindMeas3 , WindMeas4 , WindMeas5 /) -!!! CHARACTER(ChanLen), PARAMETER :: ParamUnitsAry(32) = (/ & ! This lists the units corresponding to the allowed parameters -!!! "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & -!!! "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & -!!! "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & -!!! "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & -!!! "(m/s) ","(m/s) ","(m/s) ","(m/s) "/) -!!! -!!! -!!! ! Initialize values -!!! ErrStat = ErrID_None -!!! ErrMsg = "" -!!! InvalidOutput = .FALSE. -!!! -!!! -!!!! ..... Developer must add checking for invalid inputs here: ..... -!!! ! NOTE: we are not checking that the coordinates input for the WindVxi, WindVyi, and WindVzi are valid here. We are -!!! ! checking that at the input file validation (they simply get zeroed with a warning if there is an issue). -!!! -!!! ! make sure we don't ask for outputs that don't exist: -!!! DO I = p%NWindVel+1, 9 -!!! InvalidOutput( WindVelX(I) ) = .TRUE. -!!! InvalidOutput( WindVelY(I) ) = .TRUE. -!!! InvalidOutput( WindVelZ(I) ) = .TRUE. -!!! END DO -!!! -!!! DO I=p%lidar%NumPulseGate+1,5 -!!! InvalidOutput( WindMeas(I) ) = .TRUE. -!!! END DO -!!! -!!!! ................. End of validity checking ................. -!!! -!!! -!!! !------------------------------------------------------------------------------------------------- -!!! ! Allocate and set index, name, and units for the output channels -!!! ! If a selected output channel is not available in this module, set error flag. -!!! !------------------------------------------------------------------------------------------------- -!!! -!!! ALLOCATE ( p%OutParam(0:p%NumOuts) , STAT=ErrStat2 ) -!!! IF ( ErrStat2 /= 0_IntKi ) THEN -!!! CALL SetErrStat( ErrID_Fatal,"Error allocating memory for the SoilDyn OutParam array.", ErrStat, ErrMsg, RoutineName ) -!!! RETURN -!!! ENDIF -!!! -!!! ! Set index, name, and units for the time output channel: -!!! -!!! p%OutParam(0)%Indx = Time -!!! p%OutParam(0)%Name = "Time" ! OutParam(0) is the time channel by default. -!!! p%OutParam(0)%Units = "(s)" -!!! p%OutParam(0)%SignM = 1 -!!! -!!! -!!! ! Set index, name, and units for all of the output channels. -!!! ! If a selected output channel is not available by this module set ErrStat = ErrID_Warn. -!!! -!!! DO I = 1,p%NumOuts -!!! -!!! p%OutParam(I)%Name = OutList(I) -!!! OutListTmp = OutList(I) -!!! -!!! ! Reverse the sign (+/-) of the output channel if the user prefixed the -!!! ! channel name with a "-", "_", "m", or "M" character indicating "minus". -!!! -!!! -!!! CheckOutListAgain = .FALSE. -!!! -!!! IF ( INDEX( "-_", OutListTmp(1:1) ) > 0 ) THEN -!!! p%OutParam(I)%SignM = -1 ! ex, "-TipDxc1" causes the sign of TipDxc1 to be switched. -!!! OutListTmp = OutListTmp(2:) -!!! ELSE IF ( INDEX( "mM", OutListTmp(1:1) ) > 0 ) THEN ! We'll assume this is a variable name for now, (if not, we will check later if OutListTmp(2:) is also a variable name) -!!! CheckOutListAgain = .TRUE. -!!! p%OutParam(I)%SignM = 1 -!!! ELSE -!!! p%OutParam(I)%SignM = 1 -!!! END IF -!!! -!!! CALL Conv2UC( OutListTmp ) ! Convert OutListTmp to upper case -!!! -!!! -!!! Indx = IndexCharAry( OutListTmp(1:OutStrLenM1), ValidParamAry ) -!!! -!!! -!!! ! If it started with an "M" (CheckOutListAgain) we didn't find the value in our list (Indx < 1) -!!! -!!! IF ( CheckOutListAgain .AND. Indx < 1 ) THEN ! Let's assume that "M" really meant "minus" and then test again -!!! p%OutParam(I)%SignM = -1 ! ex, "MTipDxc1" causes the sign of TipDxc1 to be switched. -!!! OutListTmp = OutListTmp(2:) -!!! -!!! Indx = IndexCharAry( OutListTmp(1:OutStrLenM1), ValidParamAry ) -!!! END IF -!!! -!!! -!!! IF ( Indx > 0 ) THEN ! we found the channel name -!!! p%OutParam(I)%Indx = ParamIndxAry(Indx) -!!! IF ( InvalidOutput( ParamIndxAry(Indx) ) ) THEN ! but, it isn't valid for these settings -!!! p%OutParam(I)%Units = "INVALID" -!!! p%OutParam(I)%SignM = 0 -!!! ELSE -!!! p%OutParam(I)%Units = ParamUnitsAry(Indx) ! it's a valid output -!!! END IF -!!! ELSE ! this channel isn't valid -!!! p%OutParam(I)%Indx = Time ! pick any valid channel (I just picked "Time" here because it's universal) -!!! p%OutParam(I)%Units = "INVALID" -!!! p%OutParam(I)%SignM = 0 ! multiply all results by zero -!!! -!!! CALL SetErrStat(ErrID_Warn, TRIM(p%OutParam(I)%Name)//" is not an available output channel.",ErrStat,ErrMsg,RoutineName) -!!! END IF -!!! -!!! END DO -!!! + ! Passed variables + + CHARACTER(ChanLen), INTENT(IN ) :: OutList(:) !< The list out user-requested outputs + TYPE(SlD_ParameterType), INTENT(INOUT) :: p !< The module parameters + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< The error status code + CHARACTER(*), INTENT( OUT) :: ErrMsg !< The error message, if an error occurred + + ! Local variables + + INTEGER :: ErrStat2 ! temporary (local) error status + INTEGER :: I ! Generic loop-counting index + INTEGER :: J ! Generic loop-counting index + INTEGER :: INDX ! Index for valid arrays + + LOGICAL :: CheckOutListAgain ! Flag used to determine if output parameter starting with "M" is valid (or the negative of another parameter) + LOGICAL :: InvalidOutput(0:MaxOutPts) ! This array determines if the output channel is valid for this configuration + CHARACTER(ChanLen) :: OutListTmp ! A string to temporarily hold OutList(I) + CHARACTER(*), PARAMETER :: RoutineName = "SetOutParam" + + CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry(108) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically + "SLD1FXG ","SLD1FYG ","SLD1FZG ","SLD1MXG ","SLD1MYG ","SLD1MZG ","SLD1RDXG ", & + "SLD1RDYG ","SLD1RDZG ","SLD1TDXG ","SLD1TDYG ","SLD1TDZG ","SLD2FXG ","SLD2FYG ", & + "SLD2FZG ","SLD2MXG ","SLD2MYG ","SLD2MZG ","SLD2RDXG ","SLD2RDYG ","SLD2RDZG ", & + "SLD2TDXG ","SLD2TDYG ","SLD2TDZG ","SLD3FXG ","SLD3FYG ","SLD3FZG ","SLD3MXG ", & + "SLD3MYG ","SLD3MZG ","SLD3RDXG ","SLD3RDYG ","SLD3RDZG ","SLD3TDXG ","SLD3TDYG ", & + "SLD3TDZG ","SLD4FXG ","SLD4FYG ","SLD4FZG ","SLD4MXG ","SLD4MYG ","SLD4MZG ", & + "SLD4RDXG ","SLD4RDYG ","SLD4RDZG ","SLD4TDXG ","SLD4TDYG ","SLD4TDZG ","SLD5FXG ", & + "SLD5FYG ","SLD5FZG ","SLD5MXG ","SLD5MYG ","SLD5MZG ","SLD5RDXG ","SLD5RDYG ", & + "SLD5RDZG ","SLD5TDXG ","SLD5TDYG ","SLD5TDZG ","SLD6FXG ","SLD6FYG ","SLD6FZG ", & + "SLD6MXG ","SLD6MYG ","SLD6MZG ","SLD6RDXG ","SLD6RDYG ","SLD6RDZG ","SLD6TDXG ", & + "SLD6TDYG ","SLD6TDZG ","SLD7FXG ","SLD7FYG ","SLD7FZG ","SLD7MXG ","SLD7MYG ", & + "SLD7MZG ","SLD7RDXG ","SLD7RDYG ","SLD7RDZG ","SLD7TDXG ","SLD7TDYG ","SLD7TDZG ", & + "SLD8FXG ","SLD8FYG ","SLD8FZG ","SLD8MXG ","SLD8MYG ","SLD8MZG ","SLD8RDXG ", & + "SLD8RDYG ","SLD8RDZG ","SLD8TDXG ","SLD8TDYG ","SLD8TDZG ","SLD9FXG ","SLD9FYG ", & + "SLD9FZG ","SLD9MXG ","SLD9MYG ","SLD9MZG ","SLD9RDXG ","SLD9RDYG ","SLD9RDZG ", & + "SLD9TDXG ","SLD9TDYG ","SLD9TDZG "/) + INTEGER(IntKi), PARAMETER :: ParamIndxAry(108) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) + Sld1Fxg , Sld1Fyg , Sld1Fzg , Sld1Mxg , Sld1Myg , Sld1Mzg , Sld1RDxg , & + Sld1RDyg , Sld1RDzg , Sld1TDxg , Sld1TDyg , Sld1TDzg , Sld2Fxg , Sld2Fyg , & + Sld2Fzg , Sld2Mxg , Sld2Myg , Sld2Mzg , Sld2RDxg , Sld2RDyg , Sld2RDzg , & + Sld2TDxg , Sld2TDyg , Sld2TDzg , Sld3Fxg , Sld3Fyg , Sld3Fzg , Sld3Mxg , & + Sld3Myg , Sld3Mzg , Sld3RDxg , Sld3RDyg , Sld3RDzg , Sld3TDxg , Sld3TDyg , & + Sld3TDzg , Sld4Fxg , Sld4Fyg , Sld4Fzg , Sld4Mxg , Sld4Myg , Sld4Mzg , & + Sld4RDxg , Sld4RDyg , Sld4RDzg , Sld4TDxg , Sld4TDyg , Sld4TDzg , Sld5Fxg , & + Sld5Fyg , Sld5Fzg , Sld5Mxg , Sld5Myg , Sld5Mzg , Sld5RDxg , Sld5RDyg , & + Sld5RDzg , Sld5TDxg , Sld5TDyg , Sld5TDzg , Sld6Fxg , Sld6Fyg , Sld6Fzg , & + Sld6Mxg , Sld6Myg , Sld6Mzg , Sld6RDxg , Sld6RDyg , Sld6RDzg , Sld6TDxg , & + Sld6TDyg , Sld6TDzg , Sld7Fxg , Sld7Fyg , Sld7Fzg , Sld7Mxg , Sld7Myg , & + Sld7Mzg , Sld7RDxg , Sld7RDyg , Sld7RDzg , Sld7TDxg , Sld7TDyg , Sld7TDzg , & + Sld8Fxg , Sld8Fyg , Sld8Fzg , Sld8Mxg , Sld8Myg , Sld8Mzg , Sld8RDxg , & + Sld8RDyg , Sld8RDzg , Sld8TDxg , Sld8TDyg , Sld8TDzg , Sld9Fxg , Sld9Fyg , & + Sld9Fzg , Sld9Mxg , Sld9Myg , Sld9Mzg , Sld9RDxg , Sld9RDyg , Sld9RDzg , & + Sld9TDxg , Sld9TDyg , Sld9TDzg /) + CHARACTER(ChanLen), PARAMETER :: ParamUnitsAry(108) = (/ & ! This lists the units corresponding to the allowed parameters + "(kN) ","(kN) ","(kN) ","(kN-m) ","(kN-m) ","(kN-m) ","(deg) ", & + "(deg) ","(deg) ","(m) ","(m) ","(m) ","(kN) ","(kN) ", & + "(kN) ","(kN-m) ","(kN-m) ","(kN-m) ","(deg) ","(deg) ","(deg) ", & + "(m) ","(m) ","(m) ","(kN) ","(kN) ","(kN) ","(kN-m) ", & + "(kN-m) ","(kN-m) ","(deg) ","(deg) ","(deg) ","(m) ","(m) ", & + "(m) ","(kN) ","(kN) ","(kN) ","(kN-m) ","(kN-m) ","(kN-m) ", & + "(deg) ","(deg) ","(deg) ","(m) ","(m) ","(m) ","(kN) ", & + "(kN) ","(kN) ","(kN-m) ","(kN-m) ","(kN-m) ","(deg) ","(deg) ", & + "(deg) ","(m) ","(m) ","(m) ","(kN) ","(kN) ","(kN) ", & + "(kN-m) ","(kN-m) ","(kN-m) ","(deg) ","(deg) ","(deg) ","(m) ", & + "(m) ","(m) ","(kN) ","(kN) ","(kN) ","(kN-m) ","(kN-m) ", & + "(kN-m) ","(deg) ","(deg) ","(deg) ","(m) ","(m) ","(m) ", & + "(kN) ","(kN) ","(kN) ","(kN-m) ","(kN-m) ","(kN-m) ","(deg) ", & + "(deg) ","(deg) ","(m) ","(m) ","(m) ","(kN) ","(kN) ", & + "(kN) ","(kN-m) ","(kN-m) ","(kN-m) ","(deg) ","(deg) ","(deg) ", & + "(m) ","(m) ","(m) "/) + + character(4) :: TmpPrefix + + ! Initialize values + ErrStat = ErrID_None + ErrMsg = "" + InvalidOutput = .FALSE. + + +! ..... Developer must add checking for invalid inputs here: ..... + ! Check outputs based on how many points (p%NumPoints) we are interfacing with soil + ! --> Loop through possible output names and check leading prefix. + ! If it is above the number of points interfacing to soil, mark invalid. + do I=p%NumPoints+1,MaxNumberOfOutputLocations + TmpPrefix='SLD'//trim(Num2LStr(I)) + do J=1,MaxOutPts + if ( INDEX(TmpPrefix, ValidParamAry(J)(1:len(TmpPrefix))) == 1 ) InvalidOutput( ParamIndxAry(J) ) = .TRUE. + enddo + enddo +! ................. End of validity checking ................. + + + !------------------------------------------------------------------------------------------------- + ! Allocate and set index, name, and units for the output channels + ! If a selected output channel is not available in this module, set error flag. + !------------------------------------------------------------------------------------------------- + + ALLOCATE ( p%OutParam(0:p%NumOuts) , STAT=ErrStat2 ) + IF ( ErrStat2 /= 0_IntKi ) THEN + CALL SetErrStat( ErrID_Fatal,"Error allocating memory for the SoilDyn OutParam array.", ErrStat, ErrMsg, RoutineName ) + RETURN + ENDIF + + ! Set index, name, and units for the time output channel: + + p%OutParam(0)%Indx = Time + p%OutParam(0)%Name = "Time" ! OutParam(0) is the time channel by default. + p%OutParam(0)%Units = "(s)" + p%OutParam(0)%SignM = 1 + + + ! Set index, name, and units for all of the output channels. + ! If a selected output channel is not available by this module set ErrStat = ErrID_Warn. + + DO I = 1,p%NumOuts + + p%OutParam(I)%Name = OutList(I) + OutListTmp = OutList(I) + + ! Reverse the sign (+/-) of the output channel if the user prefixed the + ! channel name with a "-", "_", "m", or "M" character indicating "minus". + + + CheckOutListAgain = .FALSE. + + IF ( INDEX( "-_", OutListTmp(1:1) ) > 0 ) THEN + p%OutParam(I)%SignM = -1 ! ex, "-TipDxc1" causes the sign of TipDxc1 to be switched. + OutListTmp = OutListTmp(2:) + ELSE IF ( INDEX( "mM", OutListTmp(1:1) ) > 0 ) THEN ! We'll assume this is a variable name for now, (if not, we will check later if OutListTmp(2:) is also a variable name) + CheckOutListAgain = .TRUE. + p%OutParam(I)%SignM = 1 + ELSE + p%OutParam(I)%SignM = 1 + END IF + + CALL Conv2UC( OutListTmp ) ! Convert OutListTmp to upper case + + + Indx = IndexCharAry( OutListTmp(1:OutStrLenM1), ValidParamAry ) + + + ! If it started with an "M" (CheckOutListAgain) we didn't find the value in our list (Indx < 1) + + IF ( CheckOutListAgain .AND. Indx < 1 ) THEN ! Let's assume that "M" really meant "minus" and then test again + p%OutParam(I)%SignM = -1 ! ex, "MTipDxc1" causes the sign of TipDxc1 to be switched. + OutListTmp = OutListTmp(2:) + + Indx = IndexCharAry( OutListTmp(1:OutStrLenM1), ValidParamAry ) + END IF + + + IF ( Indx > 0 ) THEN ! we found the channel name + p%OutParam(I)%Indx = ParamIndxAry(Indx) + IF ( InvalidOutput( ParamIndxAry(Indx) ) ) THEN ! but, it isn't valid for these settings + p%OutParam(I)%Units = "INVALID" + p%OutParam(I)%SignM = 0 + ELSE + p%OutParam(I)%Units = ParamUnitsAry(Indx) ! it's a valid output + END IF + ELSE ! this channel isn't valid + p%OutParam(I)%Indx = Time ! pick any valid channel (I just picked "Time" here because it's universal) + p%OutParam(I)%Units = "INVALID" + p%OutParam(I)%SignM = 0 ! multiply all results by zero + + CALL SetErrStat(ErrID_Fatal, TRIM(p%OutParam(I)%Name)//" is not an available output channel.",ErrStat,ErrMsg,RoutineName) + END IF + + END DO + RETURN END SUBROUTINE SetOutParam !---------------------------------------------------------------------------------------------------------------------------------- diff --git a/modules/soildyn/src/SoilDyn_Registry.txt b/modules/soildyn/src/SoilDyn_Registry.txt index 82fafa2b3..358936600 100644 --- a/modules/soildyn/src/SoilDyn_Registry.txt +++ b/modules/soildyn/src/SoilDyn_Registry.txt @@ -60,7 +60,8 @@ typedef ^ SlD_InputFile IntKi NumOuts - - - "N # ..... Initialization data ....................................................................................................... # Define inputs that the initialization routine may need here: # e.g., the name of the input file, the file root name, etc. -typedef ^ InitInputType CHARACTER(1024) InputFile - - - "Name of the input file; remove if there is no file" - +typedef ^ InitInputType CHARACTER(1024) InputFile - - - "Name of the input file" - +typedef ^ InitInputType CHARACTER(1024) RootName - - - "Root name of the input file" - typedef ^ InitInputType LOGICAL Linearize - .FALSE. - "Flag that tells this module if the glue code wants to linearize." - #FIXME: does the glue code need to inform us of the number of points? or do we do that in SoilDyn? #typedef ^ InitInputType IntKi NumNodes - - - "Number of nodes we are using" - @@ -68,6 +69,7 @@ typedef ^ InitInputType LOGICAL Linearize - .FALSE. - # Define outputs from the initialization routine here: typedef ^ InitOutputType CHARACTER(ChanLen) WriteOutputHdr {:} - - "Names of the output-to-file channels" - typedef ^ InitOutputType CHARACTER(ChanLen) WriteOutputUnt {:} - - "Units of the output-to-file channels" - +typedef ^ InitOutputType ProgDesc Ver - - - "This module's name, version, and date" - # if this module has implemented linearization, return the names of the rows/columns of the Jacobian matrices: #typedef ^ InitOutputType CHARACTER(LinChanLen) LinNames_y {:} - - "Names of the outputs used in linearization" - #typedef ^ InitOutputType CHARACTER(LinChanLen) LinNames_x {:} - - "Names of the continuous states used in linearization" - @@ -115,6 +117,9 @@ typedef ^ ParameterType CHARACTER(1024) EchoFileName typedef ^ ParameterType CHARACTER(1024) SumFileName - - - "Name of summary file" - typedef ^ ParameterType IntKi DLL_model - - - "REDWIN DLL model type to use" - typedef ^ ParameterType IntKi CalcOption - - - "Calculation methodology to use" - +typedef ^ ParameterType OutParmType OutParam {:} - - "Names and units (and other characteristics) of all requested output parameters" - +typedef ^ ParameterType IntKi NumOuts - - - "Number of parameters in the output list (number of outputs requested)" - +typedef ^ ParameterType IntKi NumPoints - - - "Number of points interfacing soil with" - # ..... Inputs .................................................................................................................... typedef ^ InputType MeshType SoilMotion - - - "Mesh of soil contact points" - diff --git a/modules/soildyn/src/SoilDyn_Types.f90 b/modules/soildyn/src/SoilDyn_Types.f90 index a5791c794..81456e41e 100644 --- a/modules/soildyn/src/SoilDyn_Types.f90 +++ b/modules/soildyn/src/SoilDyn_Types.f90 @@ -77,7 +77,8 @@ MODULE SoilDyn_Types ! ======================= ! ========= SlD_InitInputType ======= TYPE, PUBLIC :: SlD_InitInputType - CHARACTER(1024) :: InputFile !< Name of the input file; remove if there is no file [-] + CHARACTER(1024) :: InputFile !< Name of the input file [-] + CHARACTER(1024) :: RootName !< Root name of the input file [-] LOGICAL :: Linearize = .FALSE. !< Flag that tells this module if the glue code wants to linearize. [-] END TYPE SlD_InitInputType ! ======================= @@ -85,6 +86,7 @@ MODULE SoilDyn_Types TYPE, PUBLIC :: SlD_InitOutputType CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: WriteOutputHdr !< Names of the output-to-file channels [-] CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: WriteOutputUnt !< Units of the output-to-file channels [-] + TYPE(ProgDesc) :: Ver !< This module's name, version, and date [-] END TYPE SlD_InitOutputType ! ======================= ! ========= SlD_ContinuousStateType ======= @@ -124,6 +126,9 @@ MODULE SoilDyn_Types CHARACTER(1024) :: SumFileName !< Name of summary file [-] INTEGER(IntKi) :: DLL_model !< REDWIN DLL model type to use [-] INTEGER(IntKi) :: CalcOption !< Calculation methodology to use [-] + TYPE(OutParmType) , DIMENSION(:), ALLOCATABLE :: OutParam !< Names and units (and other characteristics) of all requested output parameters [-] + INTEGER(IntKi) :: NumOuts !< Number of parameters in the output list (number of outputs requested) [-] + INTEGER(IntKi) :: NumPoints !< Number of points interfacing soil with [-] END TYPE SlD_ParameterType ! ======================= ! ========= SlD_InputType ======= @@ -1055,6 +1060,7 @@ SUBROUTINE SlD_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, ErrS ErrStat = ErrID_None ErrMsg = "" DstInitInputData%InputFile = SrcInitInputData%InputFile + DstInitInputData%RootName = SrcInitInputData%RootName DstInitInputData%Linearize = SrcInitInputData%Linearize END SUBROUTINE SlD_CopyInitInput @@ -1105,6 +1111,7 @@ SUBROUTINE SlD_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs Db_BufSz = 0 Int_BufSz = 0 Int_BufSz = Int_BufSz + 1*LEN(InData%InputFile) ! InputFile + Int_BufSz = Int_BufSz + 1*LEN(InData%RootName) ! RootName Int_BufSz = Int_BufSz + 1 ! Linearize IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) @@ -1137,6 +1144,10 @@ SUBROUTINE SlD_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs IntKiBuf(Int_Xferred) = ICHAR(InData%InputFile(I:I), IntKi) Int_Xferred = Int_Xferred + 1 END DO ! I + DO I = 1, LEN(InData%RootName) + IntKiBuf(Int_Xferred) = ICHAR(InData%RootName(I:I), IntKi) + Int_Xferred = Int_Xferred + 1 + END DO ! I IntKiBuf ( Int_Xferred:Int_Xferred+1-1 ) = TRANSFER( InData%Linearize , IntKiBuf(1), 1) Int_Xferred = Int_Xferred + 1 END SUBROUTINE SlD_PackInitInput @@ -1177,6 +1188,10 @@ SUBROUTINE SlD_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er OutData%InputFile(I:I) = CHAR(IntKiBuf(Int_Xferred)) Int_Xferred = Int_Xferred + 1 END DO ! I + DO I = 1, LEN(OutData%RootName) + OutData%RootName(I:I) = CHAR(IntKiBuf(Int_Xferred)) + Int_Xferred = Int_Xferred + 1 + END DO ! I OutData%Linearize = TRANSFER( IntKiBuf( Int_Xferred ), mask0 ) Int_Xferred = Int_Xferred + 1 END SUBROUTINE SlD_UnPackInitInput @@ -1220,6 +1235,9 @@ SUBROUTINE SlD_CopyInitOutput( SrcInitOutputData, DstInitOutputData, CtrlCode, E END IF DstInitOutputData%WriteOutputUnt = SrcInitOutputData%WriteOutputUnt ENDIF + CALL NWTC_Library_Copyprogdesc( SrcInitOutputData%Ver, DstInitOutputData%Ver, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN END SUBROUTINE SlD_CopyInitOutput SUBROUTINE SlD_DestroyInitOutput( InitOutputData, ErrStat, ErrMsg ) @@ -1237,6 +1255,7 @@ SUBROUTINE SlD_DestroyInitOutput( InitOutputData, ErrStat, ErrMsg ) IF (ALLOCATED(InitOutputData%WriteOutputUnt)) THEN DEALLOCATE(InitOutputData%WriteOutputUnt) ENDIF + CALL NWTC_Library_Destroyprogdesc( InitOutputData%Ver, ErrStat, ErrMsg ) END SUBROUTINE SlD_DestroyInitOutput SUBROUTINE SlD_PackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) @@ -1284,6 +1303,24 @@ SUBROUTINE SlD_PackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrM Int_BufSz = Int_BufSz + 2*1 ! WriteOutputUnt upper/lower bounds for each dimension Int_BufSz = Int_BufSz + SIZE(InData%WriteOutputUnt)*LEN(InData%WriteOutputUnt) ! WriteOutputUnt END IF + ! Allocate buffers for subtypes, if any (we'll get sizes from these) + Int_BufSz = Int_BufSz + 3 ! Ver: size of buffers for each call to pack subtype + CALL NWTC_Library_Packprogdesc( Re_Buf, Db_Buf, Int_Buf, InData%Ver, ErrStat2, ErrMsg2, .TRUE. ) ! Ver + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! Ver + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! Ver + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! Ver + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) THEN @@ -1345,6 +1382,34 @@ SUBROUTINE SlD_PackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrM END DO ! I END DO !i1 END IF + CALL NWTC_Library_Packprogdesc( Re_Buf, Db_Buf, Int_Buf, InData%Ver, ErrStat2, ErrMsg2, OnlySize ) ! Ver + 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 END SUBROUTINE SlD_PackInitOutput SUBROUTINE SlD_UnPackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) @@ -1434,6 +1499,46 @@ SUBROUTINE SlD_UnPackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, E END DO !i1 DEALLOCATE(mask1) END IF + 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 NWTC_Library_Unpackprogdesc( Re_Buf, Db_Buf, Int_Buf, OutData%Ver, ErrStat2, ErrMsg2 ) ! Ver + 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) END SUBROUTINE SlD_UnPackInitOutput SUBROUTINE SlD_CopyContState( SrcContStateData, DstContStateData, CtrlCode, ErrStat, ErrMsg ) @@ -2238,6 +2343,7 @@ SUBROUTINE SlD_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg 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 = 'SlD_CopyParam' @@ -2254,6 +2360,24 @@ SUBROUTINE SlD_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg DstParamData%SumFileName = SrcParamData%SumFileName DstParamData%DLL_model = SrcParamData%DLL_model DstParamData%CalcOption = SrcParamData%CalcOption +IF (ALLOCATED(SrcParamData%OutParam)) THEN + i1_l = LBOUND(SrcParamData%OutParam,1) + i1_u = UBOUND(SrcParamData%OutParam,1) + IF (.NOT. ALLOCATED(DstParamData%OutParam)) THEN + ALLOCATE(DstParamData%OutParam(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%OutParam.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DO i1 = LBOUND(SrcParamData%OutParam,1), UBOUND(SrcParamData%OutParam,1) + CALL NWTC_Library_Copyoutparmtype( SrcParamData%OutParam(i1), DstParamData%OutParam(i1), CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN + ENDDO +ENDIF + DstParamData%NumOuts = SrcParamData%NumOuts + DstParamData%NumPoints = SrcParamData%NumPoints END SUBROUTINE SlD_CopyParam SUBROUTINE SlD_DestroyParam( ParamData, ErrStat, ErrMsg ) @@ -2266,6 +2390,12 @@ SUBROUTINE SlD_DestroyParam( ParamData, ErrStat, ErrMsg ) ErrStat = ErrID_None ErrMsg = "" CALL FreeDynamicLib( ParamData%DLL_Trgt, ErrStat, ErrMsg ) +IF (ALLOCATED(ParamData%OutParam)) THEN +DO i1 = LBOUND(ParamData%OutParam,1), UBOUND(ParamData%OutParam,1) + CALL NWTC_Library_Destroyoutparmtype( ParamData%OutParam(i1), ErrStat, ErrMsg ) +ENDDO + DEALLOCATE(ParamData%OutParam) +ENDIF END SUBROUTINE SlD_DestroyParam SUBROUTINE SlD_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) @@ -2330,6 +2460,31 @@ SUBROUTINE SlD_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, S Int_BufSz = Int_BufSz + 1*LEN(InData%SumFileName) ! SumFileName Int_BufSz = Int_BufSz + 1 ! DLL_model Int_BufSz = Int_BufSz + 1 ! CalcOption + Int_BufSz = Int_BufSz + 1 ! OutParam allocated yes/no + IF ( ALLOCATED(InData%OutParam) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! OutParam upper/lower bounds for each dimension + DO i1 = LBOUND(InData%OutParam,1), UBOUND(InData%OutParam,1) + Int_BufSz = Int_BufSz + 3 ! OutParam: size of buffers for each call to pack subtype + CALL NWTC_Library_Packoutparmtype( Re_Buf, Db_Buf, Int_Buf, InData%OutParam(i1), ErrStat2, ErrMsg2, .TRUE. ) ! OutParam + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! OutParam + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! OutParam + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! OutParam + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF + END DO + END IF + Int_BufSz = Int_BufSz + 1 ! NumOuts + Int_BufSz = Int_BufSz + 1 ! NumPoints IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) THEN @@ -2411,6 +2566,51 @@ SUBROUTINE SlD_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, S Int_Xferred = Int_Xferred + 1 IntKiBuf ( Int_Xferred:Int_Xferred+(1)-1 ) = InData%CalcOption Int_Xferred = Int_Xferred + 1 + IF ( .NOT. ALLOCATED(InData%OutParam) ) 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%OutParam,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%OutParam,1) + Int_Xferred = Int_Xferred + 2 + + DO i1 = LBOUND(InData%OutParam,1), UBOUND(InData%OutParam,1) + CALL NWTC_Library_Packoutparmtype( Re_Buf, Db_Buf, Int_Buf, InData%OutParam(i1), ErrStat2, ErrMsg2, OnlySize ) ! OutParam + 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 + END DO + END IF + IntKiBuf ( Int_Xferred:Int_Xferred+(1)-1 ) = InData%NumOuts + Int_Xferred = Int_Xferred + 1 + IntKiBuf ( Int_Xferred:Int_Xferred+(1)-1 ) = InData%NumPoints + Int_Xferred = Int_Xferred + 1 END SUBROUTINE SlD_PackParam SUBROUTINE SlD_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) @@ -2432,6 +2632,7 @@ SUBROUTINE SlD_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg LOGICAL, ALLOCATABLE :: mask3(:,:,:) LOGICAL, ALLOCATABLE :: mask4(:,:,:,:) LOGICAL, ALLOCATABLE :: mask5(:,:,:,:,:) + INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'SlD_UnPackParam' @@ -2511,6 +2712,66 @@ SUBROUTINE SlD_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg Int_Xferred = Int_Xferred + 1 OutData%CalcOption = IntKiBuf( Int_Xferred ) Int_Xferred = Int_Xferred + 1 + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! OutParam 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 (ALLOCATED(OutData%OutParam)) DEALLOCATE(OutData%OutParam) + ALLOCATE(OutData%OutParam(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%OutParam.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i1 = LBOUND(OutData%OutParam,1), UBOUND(OutData%OutParam,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 NWTC_Library_Unpackoutparmtype( Re_Buf, Db_Buf, Int_Buf, OutData%OutParam(i1), ErrStat2, ErrMsg2 ) ! OutParam + 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) + END DO + END IF + OutData%NumOuts = IntKiBuf( Int_Xferred ) + Int_Xferred = Int_Xferred + 1 + OutData%NumPoints = IntKiBuf( Int_Xferred ) + Int_Xferred = Int_Xferred + 1 END SUBROUTINE SlD_UnPackParam SUBROUTINE SlD_CopyInput( SrcInputData, DstInputData, CtrlCode, ErrStat, ErrMsg ) diff --git a/modules/soildyn/src/TODO.txt b/modules/soildyn/src/TODO.txt index 56d88ce21..43d79bcf6 100644 --- a/modules/soildyn/src/TODO.txt +++ b/modules/soildyn/src/TODO.txt @@ -12,12 +12,23 @@ Output file MODULE ------ -Outputs - -Change over all use of Force to R8Ki from REDWIN dll. Convert at final output from module only. +Outputs (number as standard 1-9 numbers for now...) -- should these be 'g' for global??? + - Sld#TD{xyz} (m) + - Sld#RD{xyz} (deg) + - Sld#F{xyz} (kN) + - Sld#M{xyz} (kN-m) + +summary file + - outputs, and what points they correspond to + - which mesh point the point links to + - stiffness matrix at each point + - mudline passed in (based on water depth from HD?) Input file changes -handling of the runmode (RW Model 1) +runmode + - model 1 includes this (given in Props(1,1) at init) + - model 2 does not include this???? + - model 3 does not include this???? Mesh nodes connection to the glue code / SubDyn Stiffness matrix to summary file (and notes) @@ -53,11 +64,12 @@ FROM the Email/meetings - Reference system – define relative to global – but do some error checking on this - Should pass in water depth – to create warning if the points are not defined below the mudline (-z value) - Change to capital (X,Y,Z) - - Include DLL name for each point, and ensure they are unique. + x Include DLL name for each point, and ensure they are unique. - Comments on “Model used in DLL” - Include units of stiffness and damping matrix. - Include ability to enter multiple stiffness/damping matrices for a jacket. - Error handling for the input files vs model being used. + --> no good method known as yet. - Is there cross-talk between DLL calls at multiple points? Need to create a different DLL for each call. - Verification approach – ideas? - Connect with Erin to do some spot checking. diff --git a/modules/soildyn/src/driver/SoilDyn_Driver.f90 b/modules/soildyn/src/driver/SoilDyn_Driver.f90 index 9bea481ab..7f8d1ce5e 100644 --- a/modules/soildyn/src/driver/SoilDyn_Driver.f90 +++ b/modules/soildyn/src/driver/SoilDyn_Driver.f90 @@ -21,6 +21,7 @@ PROGRAM SoilDyn_Driver USE NWTC_Library + USE VersionInfo USE SoilDyn USE SoilDyn_Types USE SoilDyn_Driver_Subs @@ -81,10 +82,23 @@ PROGRAM SoilDyn_Driver INTEGER(IntKi) :: ErrStat !< Status of error message CHARACTER(ErrMsgLen) :: ErrMsg !< Error message if ErrStat /= ErrID_None + CHARACTER(200) :: git_commit ! String containing the current git commit hash + TYPE(ProgDesc), PARAMETER :: version = ProgDesc( 'SoilDyn Driver', '', '' ) ! The version number of this program. + integer(IntKi) :: DvrOut + character(1024) :: OutputFileRootName + ! initialize library call NWTC_Init call DispNVD(ProgInfo) + DvrOut=-1 ! Set output unit to negative + + ! Display the copyright notice + CALL DispCopyrightLicense( version ) + ! Obtain OpenFAST git commit hash + git_commit = QueryGitVersion() + ! Tell our users what they're running + CALL WrScr( ' Running '//GetNVD( version )//' a part of OpenFAST - '//TRIM(git_Commit)//NewLine//' linked with '//TRIM( GetNVD( NWTC_Ver ))//NewLine ) ! Start the timer call CPU_TIME( Timer(1) ) @@ -132,7 +146,6 @@ PROGRAM SoilDyn_Driver Settings%SlDIptFileName = CLSettings%SlDIptFileName ENDIF - ! If the filename given was not the SlD input file (-ifw option), then it is treated ! as the driver input file (flag should be set correctly by RetrieveArgs). So, we must ! open this. @@ -256,6 +269,11 @@ PROGRAM SoilDyn_Driver if ( ErrStat >= AbortErrLev ) call ProgEnd() END IF + ! Set the output file + call GetRoot(Settings%SlDIptFileName,OutputFileRootName) + call Dvr_InitializeOutputFile(DvrOut, InitOutData, OutputFileRootName, ErrStat, ErrMsg) + call CheckErr('Setting output file'); + ! Destroy initialization data CALL SlD_DestroyInitInput( InitInData, ErrStat, ErrMsg ) CALL SlD_DestroyInitOutput( InitOutData, ErrStat, ErrMsg ) @@ -309,6 +327,9 @@ PROGRAM SoilDyn_Driver ! Get state variables at next step: INPUT at step n, OUTPUT at step n + 1 CALL SoilDyn_UpdateStates( Time, n, u, InputTime, p, x, xd, z, OtherState, misc, ErrStat, ErrMsg ); call CheckErr(''); + + !call Dvr_WriteOutputLine(Time,DvrOut,p%OutFmt,y) + call Dvr_WriteOutputLine(Time,DvrOut,"ES10.3E2",y) END DO @@ -334,6 +355,7 @@ PROGRAM SoilDyn_Driver !............................................................................................................................... ! Routine to terminate program execution !............................................................................................................................... + if (DvrOut>0) close(DvrOut) CALL SoilDyn_End( u(1), p, x, xd, z, OtherState, y, misc, ErrStat, ErrMsg ) IF ( ErrStat /= ErrID_None ) THEN diff --git a/modules/soildyn/src/driver/SoilDyn_Driver_Subs.f90 b/modules/soildyn/src/driver/SoilDyn_Driver_Subs.f90 index 27cc00e51..03c4f9b61 100644 --- a/modules/soildyn/src/driver/SoilDyn_Driver_Subs.f90 +++ b/modules/soildyn/src/driver/SoilDyn_Driver_Subs.f90 @@ -618,7 +618,7 @@ SUBROUTINE UpdateSettingsWithCL( DvrFlags, DvrSettings, CLFlags, CLSettings, DVR CHARACTER(1024) :: ErrMsgTmp !< Temporary error status for calls LOGICAL :: WindGridModify !< Did we modify any of the WindGrid related settings? character(*), parameter :: RoutineName = 'UpdateSettingsWithCL' - + ! Initialization WindGridModify = .FALSE. @@ -1058,4 +1058,83 @@ FUNCTION FLAG(flagval) RETURN END FUNCTION FLAG + +SUBROUTINE Dvr_InitializeOutputFile(OutUnit,IntOutput,RootName,ErrStat,ErrMsg) + integer(IntKi), intent( out):: OutUnit + type(SlD_InitOutputType), intent(in ):: IntOutput ! Output for initialization routine + integer(IntKi), intent( out):: ErrStat ! Error status of the operation + character(*), intent( out):: ErrMsg ! Error message if ErrStat /= ErrID_None + character(*), intent(in ):: RootName + integer(IntKi) :: i + integer(IntKi) :: numOuts + integer(IntKi) :: ErrStat2 ! Temporary Error status + character(ErrMsgLen) :: ErrMsg2 ! Temporary Error message + character(*), parameter :: RoutineName = 'Dvr_InitializeOutputFile' + + ErrStat = ErrID_none + ErrMsg = "" + + CALL GetNewUnit(OutUnit,ErrStat2,ErrMsg2) + CALL OpenFOutFile ( OutUnit, trim(RootName)//'.out', ErrStat2, ErrMsg2 ) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + if (ErrStat >= AbortErrLev) return + + write (OutUnit,'(/,A)') 'Predictions were generated on '//CurDate()//' at '//CurTime()//' using '//trim(GetNVD(IntOutput%Ver)) + write (OutUnit,'()' ) !print a blank line + + numOuts = size(IntOutput%WriteOutputHdr) + !...................................................... + ! Write the names of the output parameters on one line: + !...................................................... + + write (OutUnit,'()') + write (OutUnit,'()') + write (OutUnit,'()') + + call WrFileNR ( OutUnit, 'Time' ) + + do i=1,NumOuts + call WrFileNR ( OutUnit, tab//IntOutput%WriteOutputHdr(i) ) + end do ! i + + write (OutUnit,'()') + + !...................................................... + ! Write the units of the output parameters on one line: + !...................................................... + + call WrFileNR ( OutUnit, '(s)' ) + + do i=1,NumOuts + call WrFileNR ( Outunit, tab//trim(IntOutput%WriteOutputUnt(i)) ) + end do ! i + + write (OutUnit,'()') + + +END SUBROUTINE Dvr_InitializeOutputFile + +!---------------------------------------------------------------------------------------------------------------------------------- +SUBROUTINE Dvr_WriteOutputLine(t,OutUnit, OutFmt, Output) + real(DbKi) , intent(in ) :: t ! simulation time (s) + integer(IntKi) , intent(in ) :: OutUnit ! Status of error message + character(*) , intent(in ) :: OutFmt + type(SlD_OutputType), intent(in ) :: Output + integer(IntKi) :: errStat ! Status of error message (we're going to ignore errors in writing to the file) + character(ErrMsgLen) :: errMsg ! Error message if ErrStat /= ErrID_None + character(200) :: frmt ! A string to hold a format specifier + character(15) :: tmpStr ! temporary string to print the time output as text + + frmt = '"'//tab//'"'//trim(OutFmt) ! format for array elements from individual modules + + ! time + write( tmpStr, '(F15.6)' ) t + call WrFileNR( OutUnit, tmpStr ) + call WrNumAryFileNR ( OutUnit, Output%WriteOutput, frmt, errStat, errMsg ) + + ! write a new line (advance to the next line) + write (OutUnit,'()') +end subroutine Dvr_WriteOutputLine + + END MODULE SoilDyn_Driver_Subs From 5875122978ca135a14b4da9120a5f7d712629a79 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Fri, 13 Mar 2020 15:28:09 -0600 Subject: [PATCH 051/136] SlD: add WriteOutput routine --- modules/soildyn/src/SoilDyn.f90 | 11 +++-- modules/soildyn/src/SoilDyn_IO.f90 | 79 +++++++++++++++++++++++++++++- 2 files changed, 85 insertions(+), 5 deletions(-) diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index 36f37439a..eb41d40e7 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -456,6 +456,7 @@ subroutine SoilDyn_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, Err character(ErrMsgLen) :: ErrMsg2 ! local error message character(*), parameter :: RoutineName = 'SoilDyn_CalcOutput' + real(ReKi) :: AllOuts(0:MaxOutPts) real(R8Ki) :: Displacement(6) real(R8Ki) :: Force(6) integer(IntKi) :: i !< generic counter @@ -479,9 +480,13 @@ subroutine SoilDyn_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, Err write(*,'(f12.5,6(2x,ES12.5E2))') t,Force(1:6) enddo - ! Compute outputs here: - y%WriteOutput(1) = REAL(t,ReKi) - y%WriteOutput(2) = 1.0_ReKi + ! Outputs + call SlD_WriteOutput( p, AllOuts, u, y, m, ErrStat2, ErrMsg2 ); if (Failed()) return; + do i=1,p%NumOuts + y%WriteOutput(i) = p%OutParam(i)%SignM * Allouts( p%OutParam(i)%Indx ) + enddo + + return contains logical function Failed() diff --git a/modules/soildyn/src/SoilDyn_IO.f90 b/modules/soildyn/src/SoilDyn_IO.f90 index 1a0d1b91c..94f1c5fed 100644 --- a/modules/soildyn/src/SoilDyn_IO.f90 +++ b/modules/soildyn/src/SoilDyn_IO.f90 @@ -170,8 +170,30 @@ MODULE SoilDyn_IO !End of code generated by Matlab script ! =================================================================================================== - INTEGER(IntKi), PARAMETER :: MaxNumberOfOutputLocations = 9 ! This is based on our coding of 1 digit on output point number - + ! The following simplify my output assigning later in the WriteOutput routine + integer(IntKi), parameter :: MaxNumberOfOutputLocations = 9 ! This is based on our coding of 1 digit on output point number + integer(IntKi), parameter :: SoilPtF(6,MaxNumberOfOutputLocations) = reshape( (/ & ! Forces and moments indices + SlD1Fxg, SlD1Fyg, SlD1Fzg, SlD1Mxg, SlD1Myg, SlD1Mzg, & ! SoilPt 1 + SlD2Fxg, SlD2Fyg, SlD2Fzg, SlD2Mxg, SlD2Myg, SlD2Mzg, & ! SoilPt 2 + SlD3Fxg, SlD3Fyg, SlD3Fzg, SlD3Mxg, SlD3Myg, SlD3Mzg, & ! SoilPt 3 + SlD4Fxg, SlD4Fyg, SlD4Fzg, SlD4Mxg, SlD4Myg, SlD4Mzg, & ! SoilPt 4 + SlD5Fxg, SlD5Fyg, SlD5Fzg, SlD5Mxg, SlD5Myg, SlD5Mzg, & ! SoilPt 5 + SlD6Fxg, SlD6Fyg, SlD6Fzg, SlD6Mxg, SlD6Myg, SlD6Mzg, & ! SoilPt 6 + SlD7Fxg, SlD7Fyg, SlD7Fzg, SlD7Mxg, SlD7Myg, SlD7Mzg, & ! SoilPt 7 + SlD8Fxg, SlD8Fyg, SlD8Fzg, SlD8Mxg, SlD8Myg, SlD8Mzg, & ! SoilPt 8 + SlD9Fxg, SlD9Fyg, SlD9Fzg, SlD9Mxg, SlD9Myg, SlD9Mzg & ! SoilPt 9 + /), (/6,MaxNumberOfOutputLocations/) ) + integer(IntKi), parameter :: SoilPtD(6,MaxNumberOfOutputLocations) = reshape( (/ & ! Soil point displacements indices + SlD1TDxg,SlD1TDyg,SlD1TDzg,SlD1RDxg,SlD1RDyg,SlD1RDzg, & ! SoilPt 1 + SlD2TDxg,SlD2TDyg,SlD2TDzg,SlD2RDxg,SlD2RDyg,SlD2RDzg, & ! SoilPt 2 + SlD3TDxg,SlD3TDyg,SlD3TDzg,SlD3RDxg,SlD3RDyg,SlD3RDzg, & ! SoilPt 3 + SlD4TDxg,SlD4TDyg,SlD4TDzg,SlD4RDxg,SlD4RDyg,SlD4RDzg, & ! SoilPt 4 + SlD5TDxg,SlD5TDyg,SlD5TDzg,SlD5RDxg,SlD5RDyg,SlD5RDzg, & ! SoilPt 5 + SlD6TDxg,SlD6TDyg,SlD6TDzg,SlD6RDxg,SlD6RDyg,SlD6RDzg, & ! SoilPt 6 + SlD7TDxg,SlD7TDyg,SlD7TDzg,SlD7RDxg,SlD7RDyg,SlD7RDzg, & ! SoilPt 7 + SlD8TDxg,SlD8TDyg,SlD8TDzg,SlD8RDxg,SlD8RDyg,SlD8RDzg, & ! SoilPt 8 + SlD9TDxg,SlD9TDyg,SlD9TDzg,SlD9RDxg,SlD9RDyg,SlD9RDzg & ! SoilPt 9 + /), (/6,MaxNumberOfOutputLocations/) ) ! =================================================================================================== CONTAINS @@ -761,6 +783,59 @@ SUBROUTINE SoilDyn_CloseSumFile( SumFileUnit, ErrStat, ErrMsg ) END SUBROUTINE SoilDyn_CloseSumFile !==================================================================================================== +!> Set the output channels +!! Note: the algorithm here might be relatively slow. If profiling shows that to be true, rewrite it as needed. +!! Note2: if channel names change, update this routine +subroutine SlD_WriteOutput(p, AllOuts, u, y, m, ErrStat, ErrMsg ) + + type(SlD_ParameterType), intent(in ) :: p !< The module parameters + real(ReKi), intent(inout) :: AllOuts(0:) !< array of values to potentially write to file + type(SlD_InputType), intent(in ) :: u !< inputs + type(SlD_OutputType), intent(in ) :: y !< outputs + type(SlD_MiscVarType), intent(inout) :: m !< misc/optimization variables (for computing mesh transfers) + integer(IntKi), intent( out) :: ErrStat !< The error status code + character(*), intent( out) :: ErrMsg !< The error message, if an error occurred + + ! local variables + character(*), parameter :: RoutineName = 'SlD_WriteOutput' + integer(IntKi) :: i,j ! generic counters + real(ReKi) :: Theta(3) ! euler angle extraction (small angle assumption required for this module anyhow) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + + ErrStat = ErrID_None + ErrMsg = '' + AllOuts = 0.0_ReKi + if (p%NumOuts < 1) return + + ! Cycle through the soil interaction points only (all the others are marked invalid anyhow) + do i=1,p%NumPoints + ! Forces + do j=1,3 + AllOuts( SoilPtF(j ,i) ) = y%ReactionForce%Force(j,i) + enddo + + ! Moments + do j=1,3 + AllOuts( SoilPtF(j+3,i) ) = y%ReactionForce%Moment(j,i) + enddo + + ! Translation displacement + do j=1,3 + AllOuts( SoilPtD(j ,i) ) = u%SoilMotion%TranslationDisp(j,i) + enddo + + ! We have defined the referene orientatation aligned with XYZ, so we don't need as much math here. + ! Small angle assumption must be valid for this module, so Euler extract is sufficient + Theta = real( EulerExtract(u%SoilMotion%Orientation(1:3,1:3,i)), ReKi) ! orientations are double + do j=1,3 + AllOuts( SoilPtD(j+3,i) ) = Theta(j) + enddo + enddo + + + +end subroutine SlD_WriteOutput !********************************************************************************************************************************** END MODULE SoilDyn_IO From 7ddb24e53661299bf79177496d174ec7ec087de6 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 17 Mar 2020 13:41:16 -0600 Subject: [PATCH 052/136] SlD: remove unneeded. --- modules/soildyn/src/SoilDyn.f90 | 1 - modules/soildyn/src/SoilDyn_IO.f90 | 34 ++---------------------------- 2 files changed, 2 insertions(+), 33 deletions(-) diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index eb41d40e7..dabf93921 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -477,7 +477,6 @@ subroutine SoilDyn_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, Err ! Return force onto the resulting point mesh y%ReactionForce%Force (1:3,i) = real(Force(1:3),ReKi) y%ReactionForce%Moment(1:3,i) = real(Force(4:6),ReKi) -write(*,'(f12.5,6(2x,ES12.5E2))') t,Force(1:6) enddo ! Outputs diff --git a/modules/soildyn/src/SoilDyn_IO.f90 b/modules/soildyn/src/SoilDyn_IO.f90 index 94f1c5fed..4e5c4e657 100644 --- a/modules/soildyn/src/SoilDyn_IO.f90 +++ b/modules/soildyn/src/SoilDyn_IO.f90 @@ -699,35 +699,6 @@ END SUBROUTINE SetOutParam !End of code generated by Matlab script !********************************************************************************************************************************** -!==================================================================================================== -SUBROUTINE SetAllOuts( p, y, m, ErrStat, ErrMsg ) - TYPE(Sld_ParameterType), INTENT(IN ) :: p !< The parameters for SoilDyn - TYPE(Sld_OutputType), INTENT(IN ) :: y !< Outputs - TYPE(Sld_MiscVarType), INTENT(INOUT) :: m !< Misc variables for optimization (not copied in glue code) - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status from this subroutine - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message from this subroutine - INTEGER(IntKi) :: I ! Generic counter - CHARACTER(*), PARAMETER :: RoutineName="SetAllOuts" - - ! Initialization - ErrStat = ErrID_None - ErrMsg = '' - -! ! We set the unused values to 0 at init, so we don't need to set them again here: -! DO I = 1,p%NWindVel -! -! m%AllOuts( WindVelX(I) ) = m%WindViUVW(1,I) -! m%AllOuts( WindVelY(I) ) = m%WindViUVW(2,I) -! m%AllOuts( WindVelZ(I) ) = m%WindViUVW(3,I) -! -! END DO -! -! !FIXME: Add in Wind1Dir, Wind1Mag etc. -- allthough those can be derived outside of FAST. -! -! DO I = 1,MIN(5, p%lidar%NumPulseGate ) -! m%AllOuts( WindMeas(I) ) = y%lidar%lidSpeed(I) -! END DO -END SUBROUTINE SetAllOuts !==================================================================================================== SUBROUTINE SoilDyn_OpenSumFile( SumFileUnit, SummaryName, IfW_Prog, WindType, ErrStat, ErrMsg ) @@ -784,8 +755,7 @@ END SUBROUTINE SoilDyn_CloseSumFile !==================================================================================================== !> Set the output channels -!! Note: the algorithm here might be relatively slow. If profiling shows that to be true, rewrite it as needed. -!! Note2: if channel names change, update this routine +!! Note: there is an assumption here that only small angle deflections will occur subroutine SlD_WriteOutput(p, AllOuts, u, y, m, ErrStat, ErrMsg ) type(SlD_ParameterType), intent(in ) :: p !< The module parameters @@ -826,7 +796,7 @@ subroutine SlD_WriteOutput(p, AllOuts, u, y, m, ErrStat, ErrMsg ) enddo ! We have defined the referene orientatation aligned with XYZ, so we don't need as much math here. - ! Small angle assumption must be valid for this module, so Euler extract is sufficient + ! Small angle assumption must be valid for computations in this module, so Euler extract is sufficient Theta = real( EulerExtract(u%SoilMotion%Orientation(1:3,1:3,i)), ReKi) ! orientations are double do j=1,3 AllOuts( SoilPtD(j+3,i) ) = Theta(j) From 881bf545cccacc7d2c00fa44abb2b62ab8e1e565 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Thu, 19 Mar 2020 12:21:21 -0600 Subject: [PATCH 053/136] SlD: update the output format from driver --- modules/soildyn/src/driver/SoilDyn_Driver.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/soildyn/src/driver/SoilDyn_Driver.f90 b/modules/soildyn/src/driver/SoilDyn_Driver.f90 index 7f8d1ce5e..3e1c6b42d 100644 --- a/modules/soildyn/src/driver/SoilDyn_Driver.f90 +++ b/modules/soildyn/src/driver/SoilDyn_Driver.f90 @@ -329,7 +329,7 @@ PROGRAM SoilDyn_Driver call CheckErr(''); !call Dvr_WriteOutputLine(Time,DvrOut,p%OutFmt,y) - call Dvr_WriteOutputLine(Time,DvrOut,"ES10.3E2",y) + call Dvr_WriteOutputLine(Time,DvrOut,"ES20.12E2",y) END DO From de9b080ff60a358bc3e318f1412f53dda6f82402 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Thu, 19 Mar 2020 15:42:09 -0600 Subject: [PATCH 054/136] SlD: minor changes for integrating with FAST_Solver --- modules/openfast-library/CMakeLists.txt | 1 + modules/openfast-library/src/FAST_Solver.f90 | 1 + modules/soildyn/src/SoilDyn_Registry.txt | 1 + modules/soildyn/src/SoilDyn_Types.f90 | 7 +++++++ modules/soildyn/src/TODO.txt | 11 ++++------- 5 files changed, 14 insertions(+), 7 deletions(-) diff --git a/modules/openfast-library/CMakeLists.txt b/modules/openfast-library/CMakeLists.txt index 4cfe92432..39ffabf1e 100644 --- a/modules/openfast-library/CMakeLists.txt +++ b/modules/openfast-library/CMakeLists.txt @@ -32,6 +32,7 @@ target_link_libraries(openfast_prelib elastodynlib beamdynlib subdynlib + soildynlib hydrodynlib orcaflexlib extptfm_mckflib diff --git a/modules/openfast-library/src/FAST_Solver.f90 b/modules/openfast-library/src/FAST_Solver.f90 index 613da450a..3b75b568b 100644 --- a/modules/openfast-library/src/FAST_Solver.f90 +++ b/modules/openfast-library/src/FAST_Solver.f90 @@ -40,6 +40,7 @@ MODULE FAST_Solver USE IceDyn USE IceFloe USE ServoDyn + USE SoilDyn USE SubDyn USE OpenFOAM USE SuperController diff --git a/modules/soildyn/src/SoilDyn_Registry.txt b/modules/soildyn/src/SoilDyn_Registry.txt index 358936600..65ea8fc2b 100644 --- a/modules/soildyn/src/SoilDyn_Registry.txt +++ b/modules/soildyn/src/SoilDyn_Registry.txt @@ -65,6 +65,7 @@ typedef ^ InitInputType CHARACTER(1024) RootName - - - typedef ^ InitInputType LOGICAL Linearize - .FALSE. - "Flag that tells this module if the glue code wants to linearize." - #FIXME: does the glue code need to inform us of the number of points? or do we do that in SoilDyn? #typedef ^ InitInputType IntKi NumNodes - - - "Number of nodes we are using" - +typedef ^ InitInputType ReKi WtrDepth - - - "Water depth to mudline (global coordinates)" '(m)' # Define outputs from the initialization routine here: typedef ^ InitOutputType CHARACTER(ChanLen) WriteOutputHdr {:} - - "Names of the output-to-file channels" - diff --git a/modules/soildyn/src/SoilDyn_Types.f90 b/modules/soildyn/src/SoilDyn_Types.f90 index 81456e41e..8609c6cde 100644 --- a/modules/soildyn/src/SoilDyn_Types.f90 +++ b/modules/soildyn/src/SoilDyn_Types.f90 @@ -80,6 +80,7 @@ MODULE SoilDyn_Types CHARACTER(1024) :: InputFile !< Name of the input file [-] CHARACTER(1024) :: RootName !< Root name of the input file [-] LOGICAL :: Linearize = .FALSE. !< Flag that tells this module if the glue code wants to linearize. [-] + REAL(ReKi) :: WtrDepth !< Water depth to mudline (global coordinates) ['(m)'] END TYPE SlD_InitInputType ! ======================= ! ========= SlD_InitOutputType ======= @@ -1062,6 +1063,7 @@ SUBROUTINE SlD_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, ErrS DstInitInputData%InputFile = SrcInitInputData%InputFile DstInitInputData%RootName = SrcInitInputData%RootName DstInitInputData%Linearize = SrcInitInputData%Linearize + DstInitInputData%WtrDepth = SrcInitInputData%WtrDepth END SUBROUTINE SlD_CopyInitInput SUBROUTINE SlD_DestroyInitInput( InitInputData, ErrStat, ErrMsg ) @@ -1113,6 +1115,7 @@ SUBROUTINE SlD_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs Int_BufSz = Int_BufSz + 1*LEN(InData%InputFile) ! InputFile Int_BufSz = Int_BufSz + 1*LEN(InData%RootName) ! RootName Int_BufSz = Int_BufSz + 1 ! Linearize + Re_BufSz = Re_BufSz + 1 ! WtrDepth IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) THEN @@ -1150,6 +1153,8 @@ SUBROUTINE SlD_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs END DO ! I IntKiBuf ( Int_Xferred:Int_Xferred+1-1 ) = TRANSFER( InData%Linearize , IntKiBuf(1), 1) Int_Xferred = Int_Xferred + 1 + ReKiBuf ( Re_Xferred:Re_Xferred+(1)-1 ) = InData%WtrDepth + Re_Xferred = Re_Xferred + 1 END SUBROUTINE SlD_PackInitInput SUBROUTINE SlD_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) @@ -1194,6 +1199,8 @@ SUBROUTINE SlD_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er END DO ! I OutData%Linearize = TRANSFER( IntKiBuf( Int_Xferred ), mask0 ) Int_Xferred = Int_Xferred + 1 + OutData%WtrDepth = ReKiBuf( Re_Xferred ) + Re_Xferred = Re_Xferred + 1 END SUBROUTINE SlD_UnPackInitInput SUBROUTINE SlD_CopyInitOutput( SrcInitOutputData, DstInitOutputData, CtrlCode, ErrStat, ErrMsg ) diff --git a/modules/soildyn/src/TODO.txt b/modules/soildyn/src/TODO.txt index 43d79bcf6..e0d46a7c0 100644 --- a/modules/soildyn/src/TODO.txt +++ b/modules/soildyn/src/TODO.txt @@ -12,29 +12,26 @@ Output file MODULE ------ -Outputs (number as standard 1-9 numbers for now...) -- should these be 'g' for global??? - - Sld#TD{xyz} (m) - - Sld#RD{xyz} (deg) - - Sld#F{xyz} (kN) - - Sld#M{xyz} (kN-m) - summary file - outputs, and what points they correspond to - which mesh point the point links to - stiffness matrix at each point - mudline passed in (based on water depth from HD?) + - Stiffness matrix (and notes) Input file changes + runmode - model 1 includes this (given in Props(1,1) at init) - model 2 does not include this???? - model 3 does not include this???? Mesh nodes connection to the glue code / SubDyn -Stiffness matrix to summary file (and notes) pass in mudline depth +Check against the SubDyn mesh. Can I pass that in??? + OUTSTANDING QUESTIONS --------------------- From 447097d35e15c785cbc689877fa04698427b4b88 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 24 Mar 2020 14:23:54 -0600 Subject: [PATCH 055/136] SlD: hooks in glue code and input file changes. --- .../openfast-library/src/.FAST_Subs.f90.swp | Bin 0 -> 421888 bytes .../openfast-library/src/FAST_Registry.txt | 21 +- modules/openfast-library/src/FAST_Solver.f90 | 66 +- modules/openfast-library/src/FAST_Subs.f90 | 92 +- modules/openfast-library/src/FAST_Types.f90 | 1552 +++++++++++++++-- modules/soildyn/src/SoilDyn.f90 | 4 + modules/soildyn/src/SoilDyn_Registry.txt | 33 +- modules/soildyn/src/SoilDyn_Types.f90 | 233 ++- 8 files changed, 1784 insertions(+), 217 deletions(-) create mode 100644 modules/openfast-library/src/.FAST_Subs.f90.swp diff --git a/modules/openfast-library/src/.FAST_Subs.f90.swp b/modules/openfast-library/src/.FAST_Subs.f90.swp new file mode 100644 index 0000000000000000000000000000000000000000..e71bcf1512856a2a95468f25d005ad815f59f082 GIT binary patch literal 421888 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

83%6T1D4cHAdxc{T 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 y?p=EePp;i%PnkPwhv9?f% This routine transfers the SD outputs into inputs required for SlD (SoilDyn) +SUBROUTINE Transfer_SD_to_SlD( y_SD, u_SlD_SoilMotion, MeshMapData, ErrStat, ErrMsg ) +!.................................................................................................................................. + TYPE(SD_OutputType), INTENT(IN ) :: y_SD !< The outputs of the structural dynamics module + TYPE(MeshType), INTENT(INOUT) :: u_SlD_SoilMotion !< HydroDyn input mesh (separated here so that we can use temp meshes in ED_SD_HD_InputSolve) + TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< data for mapping meshes + + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + ! local variables + INTEGER(IntKi) :: ErrStat2 ! temporary Error status of the operation + CHARACTER(ErrMsgLen) :: ErrMsg2 ! temporary Error message if ErrStat /= ErrID_None + + + ErrStat = ErrID_None + ErrMsg = "" + + + ! Transfer point to point only for the SD%y2Mesh (p%Nodes_C ones) +! IF ( u_SlD_SoiMotion%Committed ) THEN +! +! ! These are the motions for the lumped point loads associated viscous drag on the WAMIT body and/or filled/flooded lumped forces of the WAMIT body +! CALL Transfer_Point_to_Point( y_SD%y2Mesh, u_HD_M_LumpedMesh, MeshMapData%SD_P_2_HD_M_P, ErrStat2, ErrMsg2 ) +! CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat, ErrMsg,'Transfer_SD_to_HD (u_HD%Morison%LumpedMesh)' ) +! +! END IF + +END SUBROUTINE Transfer_SD_to_SlD +!---------------------------------------------------------------------------------------------------------------------------------- !> This routine transfers the ED outputs into inputs required for HD SUBROUTINE Transfer_ED_to_HD( y_ED, u_HD, MeshMapData, ErrStat, ErrMsg ) !.................................................................................................................................. @@ -1776,11 +1807,13 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & , u_MD, y_MD & , u_IceF, y_IceF & , u_IceD, y_IceD & + , u_SlD, p_SlD, x_SlD, xd_SlD, z_SlD, OtherSt_SlD, y_SlD, m_SlD & , MeshMapData , ErrStat, ErrMsg ) !.................................................................................................................................. USE ElastoDyn USE SubDyn + USE SoilDyn USE HydroDyn USE BeamDyn USE OrcaFlexInterface @@ -1820,8 +1853,18 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & TYPE(SD_InputType) , INTENT(INOUT) :: u_SD !< System inputs TYPE(SD_OutputType) , INTENT(INOUT) :: y_SD !< System outputs TYPE(SD_MiscVarType) , INTENT(INOUT) :: m_SD !< misc/optimization variables - - !ExtPtfm: + + !SoilDyn: + TYPE(SlD_ContinuousStateType) , INTENT(IN ) :: x_SlD !< Continuous states + TYPE(SlD_DiscreteStateType) , INTENT(IN ) :: xd_SlD !< Discrete states + TYPE(SlD_ConstraintStateType) , INTENT(IN ) :: z_SlD !< Constraint states + TYPE(SlD_OtherStateType) , INTENT(IN ) :: OtherSt_SlD !< Other states + TYPE(SlD_ParameterType) , INTENT(IN ) :: p_SlD !< Parameters + TYPE(SlD_InputType) , INTENT(INOUT) :: u_SlD !< System inputs + TYPE(SlD_OutputType) , INTENT(INOUT) :: y_SlD !< System outputs + TYPE(SlD_MiscVarType) , INTENT(INOUT) :: m_SlD !< misc/optimization variables + + !ExtPtfm: TYPE(ExtPtfm_ContinuousStateType) , INTENT(IN ) :: x_ExtPtfm !< Continuous states TYPE(ExtPtfm_DiscreteStateType) , INTENT(IN ) :: xd_ExtPtfm !< Discrete states TYPE(ExtPtfm_ConstraintStateType) , INTENT(IN ) :: z_ExtPtfm !< Constraint states @@ -1885,6 +1928,7 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & TYPE(ED_OutputType) :: y_ED_perturb ! Perturbed system outputs TYPE(SD_InputType) :: u_SD_perturb ! Perturbed system inputs TYPE(SD_OutputType) :: y_SD_perturb ! Perturbed system outputs +!FIXME:SlD do we need to ad SlD here? TYPE(HydroDyn_InputType) :: u_HD_perturb ! Perturbed system inputs TYPE(HydroDyn_OutputType) :: y_HD_perturb ! Perturbed system outputs TYPE(BD_InputType) :: u_BD_perturb ! Perturbed system inputs @@ -3803,7 +3847,7 @@ SUBROUTINE ResetRemapFlags(p_FAST, ED, BD, AD14, AD, HD, SD, ExtPtfm, SrvD, MAPp END SUBROUTINE ResetRemapFlags !---------------------------------------------------------------------------------------------------------------------------------- !> This routine initializes all of the mapping data structures needed between the various modules. -SUBROUTINE InitModuleMappings(p_FAST, ED, BD, AD14, AD, HD, SD, ExtPtfm, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat, ErrMsg) +SUBROUTINE InitModuleMappings(p_FAST, ED, BD, AD14, AD, HD, SD, ExtPtfm, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD, SlD, MeshMapData, ErrStat, ErrMsg) !............................................................................................................................... TYPE(FAST_ParameterType), INTENT(INOUT) :: p_FAST !< Parameters for the glue code @@ -3822,6 +3866,7 @@ SUBROUTINE InitModuleMappings(p_FAST, ED, BD, AD14, AD, HD, SD, ExtPtfm, SrvD, M TYPE(OrcaFlex_Data), INTENT(INOUT) :: Orca !< OrcaFlex interface data TYPE(IceFloe_Data), INTENT(INOUT) :: IceF !< IceFloe data TYPE(IceDyn_Data), INTENT(INOUT) :: IceD !< All the IceDyn data used in time-step loop + TYPE(SoilDyn_Data), INTENT(INOUT) :: SlD !< SoilDyn data TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules @@ -4362,7 +4407,7 @@ END SUBROUTINE InitModuleMappings !! once at the start of the n_t_global loop and once in the j_pc loop, using different states. !! *** Note that modules that do not have direct feedthrough should be called first. *** SUBROUTINE CalcOutputs_And_SolveForInputs( n_t_global, this_time, this_state, calcJacobian, NextJacCalcTime, p_FAST, m_FAST, & - ED, BD, SrvD, AD14, AD, IfW, OpFM, HD, SD, ExtPtfm, MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat, ErrMsg ) + ED, BD, SrvD, AD14, AD, IfW, OpFM, HD, SD, ExtPtfm, MAPp, FEAM, MD, Orca, IceF, IceD, SlD, MeshMapData, ErrStat, ErrMsg ) REAL(DbKi) , intent(in ) :: this_time !< The current simulation time (actual or time of prediction) INTEGER(IntKi) , intent(in ) :: this_state !< Index into the state array (current or predicted states) INTEGER(IntKi) , intent(in ) :: n_t_global !< current time step (used only for SrvD hack) @@ -4388,6 +4433,7 @@ SUBROUTINE CalcOutputs_And_SolveForInputs( n_t_global, this_time, this_state, ca TYPE(OrcaFlex_Data), INTENT(INOUT) :: Orca !< OrcaFlex interface data TYPE(IceFloe_Data), INTENT(INOUT) :: IceF !< IceFloe data TYPE(IceDyn_Data), INTENT(INOUT) :: IceD !< All the IceDyn data used in time-step loop + TYPE(SoilDyn_Data), INTENT(INOUT) :: SlD !< SoilDyn data TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules @@ -4459,7 +4505,7 @@ SUBROUTINE CalcOutputs_And_SolveForInputs( n_t_global, this_time, this_state, ca CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) !> Solve option 1 (rigorous solve on loads/accelerations) - CALL SolveOption1(this_time, this_state, calcJacobian, p_FAST, ED, BD, HD, SD, ExtPtfm, MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat2, ErrMsg2) + CALL SolveOption1(this_time, this_state, calcJacobian, p_FAST, ED, BD, HD, SD, ExtPtfm, MAPp, FEAM, MD, Orca, IceF, IceD, SlD, MeshMapData, ErrStat2, ErrMsg2) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) @@ -4523,7 +4569,7 @@ END SUBROUTINE CalcOutputs_And_SolveForInputs !---------------------------------------------------------------------------------------------------------------------------------- !> This routine implements the "option 1" solve for all inputs with direct links to HD, SD, ExtPtfm, MAP, OrcaFlex interface, and the ED !! platform reference point. Also in solve option 1 are the BD-ED blade root coupling. -SUBROUTINE SolveOption1(this_time, this_state, calcJacobian, p_FAST, ED, BD, HD, SD, ExtPtfm, MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat, ErrMsg ) +SUBROUTINE SolveOption1(this_time, this_state, calcJacobian, p_FAST, ED, BD, HD, SD, ExtPtfm, MAPp, FEAM, MD, Orca, IceF, IceD, SlD, MeshMapData, ErrStat, ErrMsg ) !............................................................................................................................... REAL(DbKi) , intent(in ) :: this_time !< The current simulation time (actual or time of prediction) INTEGER(IntKi) , intent(in ) :: this_state !< Index into the state array (current or predicted states) @@ -4544,6 +4590,7 @@ SUBROUTINE SolveOption1(this_time, this_state, calcJacobian, p_FAST, ED, BD, HD, TYPE(OrcaFlex_Data), INTENT(INOUT) :: Orca !< OrcaFlex interface data TYPE(IceFloe_Data), INTENT(INOUT) :: IceF !< IceFloe data TYPE(IceDyn_Data), INTENT(INOUT) :: IceD !< All the IceDyn data used in time-step loop + TYPE(SoilDyn_Data), INTENT(INOUT) :: SlD !< SoilDyn data TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules @@ -4620,6 +4667,7 @@ SUBROUTINE SolveOption1(this_time, this_state, calcJacobian, p_FAST, ED, BD, HD, , MD%Input(1), MD%y & , IceF%Input(1), IceF%y & , IceD%Input(1,:), IceD%y & ! bjj: I don't really want to make temp copies of input types. perhaps we should pass the whole Input() structure? (likewise for BD)... + , SlD%Input(1), SlD%p, SlD%x( this_state), SlD%xd( this_state), SlD%z( this_state), SlD%OtherSt( this_state), SlD%y ,SlD%m & , MeshMapData , ErrStat2, ErrMsg2 ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) @@ -5004,7 +5052,7 @@ END SUBROUTINE SolveOption2 !---------------------------------------------------------------------------------------------------------------------------------- !> This routines advances the states of each module SUBROUTINE FAST_AdvanceStates( t_initial, n_t_global, p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD14, AD, IfW, OpFM, HD, SD, ExtPtfm, & - MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat, ErrMsg ) + MAPp, FEAM, MD, Orca, IceF, IceD, SlD, MeshMapData, ErrStat, ErrMsg ) REAL(DbKi), INTENT(IN ) :: t_initial !< initial simulation time (almost always 0) INTEGER(IntKi), INTENT(IN ) :: n_t_global !< integer time step @@ -5028,6 +5076,7 @@ SUBROUTINE FAST_AdvanceStates( t_initial, n_t_global, p_FAST, y_FAST, m_FAST, ED TYPE(OrcaFlex_Data), INTENT(INOUT) :: Orca !< OrcaFlex interface data TYPE(IceFloe_Data), INTENT(INOUT) :: IceF !< IceFloe data TYPE(IceDyn_Data), INTENT(INOUT) :: IceD !< All the IceDyn data used in time-step loop + TYPE(SoilDyn_Data), INTENT(INOUT) :: SlD !< SoilDyn data TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules (added to help BD get better root motion inputs) @@ -5395,7 +5444,7 @@ END SUBROUTINE FAST_AdvanceStates !---------------------------------------------------------------------------------------------------------------------------------- !> This routine extrapolates inputs to modules to give predicted values at t+dt. SUBROUTINE FAST_ExtrapInterpMods( t_global_next, p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD14, AD, IfW, HD, SD, ExtPtfm, MAPp, FEAM, MD, Orca, & - IceF, IceD, ErrStat, ErrMsg ) + IceF, IceD, SlD, ErrStat, ErrMsg ) REAL(DbKi), INTENT(IN ) :: t_global_next !< next global time step (t + dt), at which we're extrapolating inputs (and ED outputs) TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code @@ -5417,6 +5466,7 @@ SUBROUTINE FAST_ExtrapInterpMods( t_global_next, p_FAST, y_FAST, m_FAST, ED, BD, TYPE(OrcaFlex_Data), INTENT(INOUT) :: Orca !< OrcaFlex interface data TYPE(IceFloe_Data), INTENT(INOUT) :: IceF !< IceFloe data TYPE(IceDyn_Data), INTENT(INOUT) :: IceD !< All the IceDyn data used in time-step loop + TYPE(SoilDyn_Data), INTENT(INOUT) :: SlD !< SoilDyn data !TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData ! Data for mapping between modules diff --git a/modules/openfast-library/src/FAST_Subs.f90 b/modules/openfast-library/src/FAST_Subs.f90 index 338ada576..0b10d44df 100644 --- a/modules/openfast-library/src/FAST_Subs.f90 +++ b/modules/openfast-library/src/FAST_Subs.f90 @@ -50,18 +50,18 @@ SUBROUTINE FAST_InitializeAll_T( t_initial, TurbID, Turbine, ErrStat, ErrMsg, In CALL FAST_InitializeAll( t_initial, Turbine%p_FAST, Turbine%y_FAST, Turbine%m_FAST, & Turbine%ED, Turbine%BD, Turbine%SrvD, Turbine%AD14, Turbine%AD, Turbine%IfW, Turbine%OpFM, Turbine%SC,& Turbine%HD, Turbine%SD, Turbine%ExtPtfm, Turbine%MAP, Turbine%FEAM, Turbine%MD, Turbine%Orca, & - Turbine%IceF, Turbine%IceD, Turbine%MeshMapData, ErrStat, ErrMsg, InFile, ExternInitData ) + Turbine%IceF, Turbine%IceD, Turbine%SlD, Turbine%MeshMapData, ErrStat, ErrMsg, InFile, ExternInitData ) ELSE CALL FAST_InitializeAll( t_initial, Turbine%p_FAST, Turbine%y_FAST, Turbine%m_FAST, & Turbine%ED, Turbine%BD, Turbine%SrvD, Turbine%AD14, Turbine%AD, Turbine%IfW, Turbine%OpFM, Turbine%SC, & Turbine%HD, Turbine%SD, Turbine%ExtPtfm, Turbine%MAP, Turbine%FEAM, Turbine%MD, Turbine%Orca, & - Turbine%IceF, Turbine%IceD, Turbine%MeshMapData, ErrStat, ErrMsg, InFile ) + Turbine%IceF, Turbine%IceD, Turbine%SlD, Turbine%MeshMapData, ErrStat, ErrMsg, InFile ) END IF ELSE CALL FAST_InitializeAll( t_initial, Turbine%p_FAST, Turbine%y_FAST, Turbine%m_FAST, & Turbine%ED, Turbine%BD, Turbine%SrvD, Turbine%AD14, Turbine%AD, Turbine%IfW, Turbine%OpFM, Turbine%SC, & Turbine%HD, Turbine%SD, Turbine%ExtPtfm, Turbine%MAP, Turbine%FEAM, Turbine%MD, Turbine%Orca, & - Turbine%IceF, Turbine%IceD, Turbine%MeshMapData, ErrStat, ErrMsg ) + Turbine%IceF, Turbine%IceD, Turbine%SlD, Turbine%MeshMapData, ErrStat, ErrMsg ) END IF @@ -69,7 +69,7 @@ END SUBROUTINE FAST_InitializeAll_T !---------------------------------------------------------------------------------------------------------------------------------- !> Routine to call Init routine for each module. This routine sets all of the init input data for each module. SUBROUTINE FAST_InitializeAll( t_initial, p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD14, AD, IfW, OpFM, SC, HD, SD, ExtPtfm, & - MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat, ErrMsg, InFile, ExternInitData ) + MAPp, FEAM, MD, Orca, IceF, IceD, SlD, MeshMapData, ErrStat, ErrMsg, InFile, ExternInitData ) use ElastoDyn_Parameters, only: Method_RK4 @@ -88,6 +88,7 @@ SUBROUTINE FAST_InitializeAll( t_initial, p_FAST, y_FAST, m_FAST, ED, BD, SrvD, TYPE(SuperController_Data), INTENT(INOUT) :: SC !< SuperController data TYPE(HydroDyn_Data), INTENT(INOUT) :: HD !< HydroDyn data TYPE(SubDyn_Data), INTENT(INOUT) :: SD !< SubDyn data + TYPE(SoilDyn_Data), INTENT(INOUT) :: SlD !< SoilDyn data TYPE(ExtPtfm_Data), INTENT(INOUT) :: ExtPtfm !< ExtPtfm_MCKF data TYPE(MAP_Data), INTENT(INOUT) :: MAPp !< MAP data TYPE(FEAMooring_Data), INTENT(INOUT) :: FEAM !< FEAMooring data @@ -158,7 +159,10 @@ SUBROUTINE FAST_InitializeAll( t_initial, p_FAST, y_FAST, m_FAST, ED, BD, SrvD, TYPE(IceD_InitInputType) :: InitInData_IceD ! Initialization input data TYPE(IceD_InitOutputType) :: InitOutData_IceD ! Initialization output data (each instance will have the same output channels) - + + TYPE(SlD_InitInputType) :: InitInData_SlD ! Initialization input data + TYPE(SlD_InitOutputType) :: InitOutData_SlD ! Initialization output data + REAL(ReKi) :: AirDens ! air density for initialization/normalization of OpenFOAM data REAL(DbKi) :: dt_IceD ! tmp dt variable to ensure IceDyn doesn't specify different dt values for different legs (IceDyn instances) REAL(DbKi) :: dt_BD ! tmp dt variable to ensure BeamDyn doesn't specify different dt values for different instances @@ -891,6 +895,16 @@ SUBROUTINE FAST_InitializeAll( t_initial, p_FAST, y_FAST, m_FAST, ED, BD, SrvD, END IF + ! ........................ + ! initialize SoilDyn + ! ........................ + ALLOCATE( SlD%Input( p_FAST%InterpOrder+1 ), SlD%InputTimes( p_FAST%InterpOrder+1 ), STAT = ErrStat2 ) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal,"Error allocating SD%Input and SD%InputTimes.",ErrStat,ErrMsg,RoutineName) + CALL Cleanup() + RETURN + END IF + ! ------------------------------ ! initialize CompMooring modules ! ------------------------------ @@ -1151,7 +1165,7 @@ SUBROUTINE FAST_InitializeAll( t_initial, p_FAST, y_FAST, m_FAST, ED, BD, SrvD, CALL FAST_InitOutput( p_FAST, y_FAST, InitOutData_ED, InitOutData_BD, InitOutData_SrvD, InitOutData_AD14, InitOutData_AD, & InitOutData_IfW, InitOutData_OpFM, InitOutData_HD, InitOutData_SD, InitOutData_ExtPtfm, InitOutData_MAP, & - InitOutData_FEAM, InitOutData_MD, InitOutData_Orca, InitOutData_IceF, InitOutData_IceD, ErrStat2, ErrMsg2 ) + InitOutData_FEAM, InitOutData_MD, InitOutData_Orca, InitOutData_IceF, InitOutData_IceD, InitOutData_SlD, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) @@ -1159,7 +1173,7 @@ SUBROUTINE FAST_InitializeAll( t_initial, p_FAST, y_FAST, m_FAST, ED, BD, SrvD, ! Initialize mesh-mapping data ! ------------------------------------------------------------------------- - CALL InitModuleMappings(p_FAST, ED, BD, AD14, AD, HD, SD, ExtPtfm, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat2, ErrMsg2) + CALL InitModuleMappings(p_FAST, ED, BD, AD14, AD, HD, SD, ExtPtfm, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD, SlD, MeshMapData, ErrStat2, ErrMsg2) CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) IF (ErrStat >= AbortErrLev) THEN @@ -1316,7 +1330,12 @@ SUBROUTINE Cleanup() CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) CALL IceD_DestroyInitOutput( InitOutData_IceD, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - + + CALL SlD_DestroyInitInput( InitInData_SlD, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + CALL SlD_DestroyInitOutput( InitOutData_SlD, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + END SUBROUTINE Cleanup END SUBROUTINE FAST_InitializeAll @@ -1548,6 +1567,7 @@ SUBROUTINE FAST_Init( p, y_FAST, t_initial, InputFile, ErrStat, ErrMsg, TMax, Tu y_FAST%Module_Ver( Module_Orca )%Name = 'OrcaFlexInterface' y_FAST%Module_Ver( Module_IceF )%Name = 'IceFloe' y_FAST%Module_Ver( Module_IceD )%Name = 'IceDyn' + y_FAST%Module_Ver( Module_SlD )%Name = 'SoilDyn' y_FAST%Module_Abrev( Module_IfW ) = 'IfW' y_FAST%Module_Abrev( Module_OpFM ) = 'OpFM' @@ -1565,6 +1585,7 @@ SUBROUTINE FAST_Init( p, y_FAST, t_initial, InputFile, ErrStat, ErrMsg, TMax, Tu y_FAST%Module_Abrev( Module_Orca ) = 'Orca' y_FAST%Module_Abrev( Module_IceF ) = 'IceF' y_FAST%Module_Abrev( Module_IceD ) = 'IceD' + y_FAST%Module_Abrev( Module_SD ) = 'SlD' p%n_substeps = 1 ! number of substeps for between modules and global/FAST time p%BD_OutputSibling = .false. @@ -1788,7 +1809,8 @@ END SUBROUTINE ValidateInputData !> This routine initializes the output for the glue code, including writing the header for the primary output file. SUBROUTINE FAST_InitOutput( p_FAST, y_FAST, InitOutData_ED, InitOutData_BD, InitOutData_SrvD, InitOutData_AD14, InitOutData_AD, & InitOutData_IfW, InitOutData_OpFM, InitOutData_HD, InitOutData_SD, InitOutData_ExtPtfm, InitOutData_MAP, & - InitOutData_FEAM, InitOutData_MD, InitOutData_Orca, InitOutData_IceF, InitOutData_IceD, ErrStat, ErrMsg ) + InitOutData_FEAM, InitOutData_MD, InitOutData_Orca, InitOutData_IceF, InitOutData_IceD, InitOutData_SlD, & + ErrStat, ErrMsg ) IMPLICIT NONE @@ -1812,6 +1834,7 @@ SUBROUTINE FAST_InitOutput( p_FAST, y_FAST, InitOutData_ED, InitOutData_BD, Init TYPE(MD_InitOutputType), INTENT(IN) :: InitOutData_MD !< Initialization output for MoorDyn TYPE(IceFloe_InitOutputType), INTENT(IN) :: InitOutData_IceF !< Initialization output for IceFloe TYPE(IceD_InitOutputType), INTENT(IN) :: InitOutData_IceD !< Initialization output for IceDyn + TYPE(SlD_InitOutputType), INTENT(IN) :: InitOutData_SlD !< Initialization output for SoilDyn INTEGER(IntKi), INTENT(OUT) :: ErrStat !< Error status CHARACTER(*), INTENT(OUT) :: ErrMsg !< Error message corresponding to ErrStat @@ -2507,7 +2530,24 @@ SUBROUTINE FAST_ReadPrimaryFile( InputFile, p, OverrideAbortErrLev, ErrStat, Err ELSE p%CompIce = Module_Unknown END IF - + + ! CompSoil - Compute sub-structural dynamics (switch) {0=None; 1=SoilDyn; 2=ExtPtfm_MCKF}: + CALL ReadVar( UnIn, InputFile, p%CompSoil, "CompSoil", "Compute soil-structural dynamics (switch) {0=None; 1=SoilDyn}", ErrStat2, ErrMsg2, UnEc) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if ( ErrStat >= AbortErrLev ) then + call cleanup() + RETURN + end if + + ! immediately convert to values used inside the code: + IF ( p%CompSoil == 0 ) THEN + p%CompSoil = Module_NONE + ELSEIF ( p%CompSoil == 1 ) THEN + p%CompSoil = Module_SlD + ELSE + p%CompSoil = Module_Unknown + END IF + !---------------------- INPUT FILES --------------------------------------------- CALL ReadCom( UnIn, InputFile, 'Section Header: Input Files', ErrStat2, ErrMsg2, UnEc ) @@ -2599,8 +2639,18 @@ SUBROUTINE FAST_ReadPrimaryFile( InputFile, p, OverrideAbortErrLev, ErrStat, Err RETURN end if IF ( PathIsRelative( p%IceFile ) ) p%IceFile = TRIM(PriPath)//TRIM(p%IceFile) - - + + ! SoilFile - Name of file containing soil-structural input parameters (-): + CALL ReadVar( UnIn, InputFile, p%SoilFile, "SoilFile", "Name of file containing soil-structural input parameters (-)", ErrStat2, ErrMsg2, UnEc) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if ( ErrStat >= AbortErrLev ) then + call cleanup() + RETURN + end if + IF ( PathIsRelative( p%SoilFile ) ) p%SoilFile = TRIM(PriPath)//TRIM(p%SoilFile) + + + !---------------------- OUTPUT -------------------------------------------------- CALL ReadCom( UnIn, InputFile, 'Section Header: Output', ErrStat2, ErrMsg2, UnEc ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) @@ -3727,13 +3777,13 @@ SUBROUTINE FAST_Solution0_T(Turbine, ErrStat, ErrMsg) CALL FAST_Solution0(Turbine%p_FAST, Turbine%y_FAST, Turbine%m_FAST, & Turbine%ED, Turbine%BD, Turbine%SrvD, Turbine%AD14, Turbine%AD, Turbine%IfW, Turbine%OpFM, & Turbine%HD, Turbine%SD, Turbine%ExtPtfm, Turbine%MAP, Turbine%FEAM, Turbine%MD, Turbine%Orca, & - Turbine%IceF, Turbine%IceD, Turbine%MeshMapData, ErrStat, ErrMsg ) + Turbine%IceF, Turbine%IceD, Turbine%SlD, Turbine%MeshMapData, ErrStat, ErrMsg ) END SUBROUTINE FAST_Solution0_T !---------------------------------------------------------------------------------------------------------------------------------- !> Routine that calls CalcOutput for the first time of the simulation (at t=0). After the initial solve, data arrays are initialized. SUBROUTINE FAST_Solution0(p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD14, AD, IfW, OpFM, HD, SD, ExtPtfm, & - MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat, ErrMsg ) + MAPp, FEAM, MD, Orca, IceF, IceD, SlD, MeshMapData, ErrStat, ErrMsg ) TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< Output variables for the glue code @@ -3755,6 +3805,7 @@ SUBROUTINE FAST_Solution0(p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD14, AD, IfW, O TYPE(OrcaFlex_Data), INTENT(INOUT) :: Orca !< OrcaFlex interface data TYPE(IceFloe_Data), INTENT(INOUT) :: IceF !< IceFloe data TYPE(IceDyn_Data), INTENT(INOUT) :: IceD !< All the IceDyn data used in time-step loop + TYPE(SoilDyn_Data), INTENT(INOUT) :: SlD !< SoilDyn data TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules @@ -3788,7 +3839,7 @@ SUBROUTINE FAST_Solution0(p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD14, AD, IfW, O CALL CalcOutputs_And_SolveForInputs( n_t_global, m_FAST%t_global, STATE_CURR, m_FAST%calcJacobian, m_FAST%NextJacCalcTime, & p_FAST, m_FAST, ED, BD, SrvD, AD14, AD, IfW, OpFM, HD, SD, ExtPtfm, & - MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat2, ErrMsg2 ) + MAPp, FEAM, MD, Orca, IceF, IceD, SlD, MeshMapData, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) @@ -4312,13 +4363,13 @@ SUBROUTINE FAST_Solution_T(t_initial, n_t_global, Turbine, ErrStat, ErrMsg ) CALL FAST_Solution(t_initial, n_t_global, Turbine%p_FAST, Turbine%y_FAST, Turbine%m_FAST, & Turbine%ED, Turbine%BD, Turbine%SrvD, Turbine%AD14, Turbine%AD, Turbine%IfW, Turbine%OpFM, & Turbine%HD, Turbine%SD, Turbine%ExtPtfm, Turbine%MAP, Turbine%FEAM, Turbine%MD, Turbine%Orca, & - Turbine%IceF, Turbine%IceD, Turbine%MeshMapData, ErrStat, ErrMsg ) + Turbine%IceF, Turbine%IceD, Turbine%SlD, Turbine%MeshMapData, ErrStat, ErrMsg ) END SUBROUTINE FAST_Solution_T !---------------------------------------------------------------------------------------------------------------------------------- !> This routine takes data from n_t_global and gets values at n_t_global + 1 SUBROUTINE FAST_Solution(t_initial, n_t_global, p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD14, AD, IfW, OpFM, HD, SD, ExtPtfm, & - MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat, ErrMsg ) + MAPp, FEAM, MD, Orca, IceF, IceD, SlD, MeshMapData, ErrStat, ErrMsg ) REAL(DbKi), INTENT(IN ) :: t_initial !< initial time INTEGER(IntKi), INTENT(IN ) :: n_t_global !< loop counter @@ -4343,6 +4394,7 @@ SUBROUTINE FAST_Solution(t_initial, n_t_global, p_FAST, y_FAST, m_FAST, ED, BD, TYPE(OrcaFlex_Data), INTENT(INOUT) :: Orca !< OrcaFlex interface data TYPE(IceFloe_Data), INTENT(INOUT) :: IceF !< IceFloe data TYPE(IceDyn_Data), INTENT(INOUT) :: IceD !< All the IceDyn data used in time-step loop + TYPE(SoilDyn_Data), INTENT(INOUT) :: SlD !< SoilDyn data TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules @@ -4401,7 +4453,7 @@ SUBROUTINE FAST_Solution(t_initial, n_t_global, p_FAST, y_FAST, m_FAST, ED, BD, !! gives predicted values at t+dt !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CALL FAST_ExtrapInterpMods( t_global_next, p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD14, AD, IfW, HD, SD, ExtPtfm, & - MAPp, FEAM, MD, Orca, IceF, IceD, ErrStat2, ErrMsg2 ) + MAPp, FEAM, MD, Orca, IceF, IceD, SlD, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) @@ -4415,7 +4467,7 @@ SUBROUTINE FAST_Solution(t_initial, n_t_global, p_FAST, y_FAST, m_FAST, ED, BD, !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CALL FAST_AdvanceStates( t_initial, n_t_global, p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD14, AD, IfW, OpFM, HD, SD, ExtPtfm, & - MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat2, ErrMsg2 ) + MAPp, FEAM, MD, Orca, IceF, IceD, SlD, MeshMapData, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) IF (ErrStat >= AbortErrLev) RETURN @@ -4424,7 +4476,7 @@ SUBROUTINE FAST_Solution(t_initial, n_t_global, p_FAST, y_FAST, m_FAST, ED, BD, !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CALL CalcOutputs_And_SolveForInputs( n_t_global, t_global_next, STATE_PRED, m_FAST%calcJacobian, m_FAST%NextJacCalcTime, & - p_FAST, m_FAST, ED, BD, SrvD, AD14, AD, IfW, OpFM, HD, SD, ExtPtfm, MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat2, ErrMsg2 ) + p_FAST, m_FAST, ED, BD, SrvD, AD14, AD, IfW, OpFM, HD, SD, ExtPtfm, MAPp, FEAM, MD, Orca, IceF, IceD, SlD, MeshMapData, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) IF (ErrStat >= AbortErrLev) RETURN diff --git a/modules/openfast-library/src/FAST_Types.f90 b/modules/openfast-library/src/FAST_Types.f90 index 9a34e1139..ee801c426 100644 --- a/modules/openfast-library/src/FAST_Types.f90 +++ b/modules/openfast-library/src/FAST_Types.f90 @@ -51,6 +51,7 @@ MODULE FAST_Types USE BEMT_Types USE AeroDyn_Types USE SubDyn_Types +USE SoilDyn_Types USE Current_Types USE Waves_Types USE Waves2_Types @@ -89,7 +90,8 @@ MODULE FAST_Types INTEGER(IntKi), PUBLIC, PARAMETER :: Module_Orca = 14 ! OrcaFlex integration (HD/Mooring) [-] INTEGER(IntKi), PUBLIC, PARAMETER :: Module_IceF = 15 ! IceFloe [-] INTEGER(IntKi), PUBLIC, PARAMETER :: Module_IceD = 16 ! IceDyn [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: NumModules = 16 ! The number of modules available in FAST [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Module_SlD = 17 ! SoilDyn [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: NumModules = 17 ! The number of modules available in FAST [-] INTEGER(IntKi), PUBLIC, PARAMETER :: MaxNBlades = 3 ! Maximum number of blades allowed on a turbine [-] INTEGER(IntKi), PUBLIC, PARAMETER :: IceD_MaxLegs = 4 ! because I don't know how many legs there are before calling IceD_Init and I don't want to copy the data because of sibling mesh issues, I'm going to allocate IceD based on this number [-] ! ========= FAST_VTK_BLSurfaceType ======= @@ -133,9 +135,10 @@ MODULE FAST_Types INTEGER(IntKi) :: CompAero !< Compute aerodynamic loads (switch) {Module_None; Module_AD14; Module_AD} [-] INTEGER(IntKi) :: CompServo !< Compute control and electrical-drive dynamics (switch) {Module_None; Module_SrvD} [-] INTEGER(IntKi) :: CompHydro !< Compute hydrodynamic loads (switch) {Module_None; Module_HD} [-] - INTEGER(IntKi) :: CompSub !< Compute sub-structural dynamics (switch) {Module_None; Module_HD} [-] + INTEGER(IntKi) :: CompSub !< Compute sub-structural dynamics (switch) {Module_None; Module_SD} [-] INTEGER(IntKi) :: CompMooring !< Compute mooring system (switch) {Module_None; Module_MAP; Module_FEAM; Module_MD; Module_Orca} [-] INTEGER(IntKi) :: CompIce !< Compute ice loading (switch) {Module_None; Module_IceF, Module_IceD} [-] + INTEGER(IntKi) :: CompSoil !< Compute soil-structural dynamics (switch) {Module_None; Module_SlD} [-] LOGICAL :: UseDWM !< Use the DWM module in AeroDyn [-] LOGICAL :: Linearize !< Linearization analysis (flag) [-] CHARACTER(1024) :: EDFile !< The name of the ElastoDyn input file [-] @@ -147,6 +150,7 @@ MODULE FAST_Types CHARACTER(1024) :: SubFile !< Name of file containing sub-structural input parameters [-] CHARACTER(1024) :: MooringFile !< Name of file containing mooring system input parameters [-] CHARACTER(1024) :: IceFile !< Name of file containing ice loading input parameters [-] + CHARACTER(1024) :: SoilFile !< Name of file containing soil-structure input parameters [-] REAL(DbKi) :: TStart !< Time to begin tabular output [s] REAL(DbKi) :: DT_Out !< Time step for tabular output [s] LOGICAL :: WrSttsTime !< Whether we should write the status times to the screen [-] @@ -373,6 +377,20 @@ MODULE FAST_Types REAL(DbKi) , DIMENSION(:), ALLOCATABLE :: InputTimes !< Array of times associated with Input Array [-] END TYPE SubDyn_Data ! ======================= +! ========= SoilDyn_Data ======= + TYPE, PUBLIC :: SoilDyn_Data + TYPE(SlD_ContinuousStateType) , DIMENSION(1:2) :: x !< Continuous states [-] + TYPE(SlD_DiscreteStateType) , DIMENSION(1:2) :: xd !< Discrete states [-] + TYPE(SlD_ConstraintStateType) , DIMENSION(1:2) :: z !< Constraint states [-] + TYPE(SlD_OtherStateType) , DIMENSION(1:2) :: OtherSt !< Other states [-] + TYPE(SlD_ParameterType) :: p !< Parameters [-] + TYPE(SlD_InputType) :: u !< System inputs [-] + TYPE(SlD_OutputType) :: y !< System outputs [-] + TYPE(SlD_MiscVarType) :: m !< Misc/optimization variables [-] + TYPE(SlD_InputType) , DIMENSION(:), ALLOCATABLE :: Input !< Array of inputs associated with InputTimes [-] + REAL(DbKi) , DIMENSION(:), ALLOCATABLE :: InputTimes !< Array of times associated with Input Array [-] + END TYPE SoilDyn_Data +! ======================= ! ========= ExtPtfm_Data ======= TYPE, PUBLIC :: ExtPtfm_Data TYPE(ExtPtfm_ContinuousStateType) , DIMENSION(1:2) :: x !< Continuous states [-] @@ -585,6 +603,7 @@ MODULE FAST_Types TYPE(SuperController_Data) :: SC !< Data for SuperController integration module [-] TYPE(HydroDyn_Data) :: HD !< Data for the HydroDyn module [-] TYPE(SubDyn_Data) :: SD !< Data for the SubDyn module [-] + TYPE(SoilDyn_Data) :: SlD !< Data for the SoilDyn module [-] TYPE(MAP_Data) :: MAP !< Data for the MAP (Mooring Analysis Program) module [-] TYPE(FEAMooring_Data) :: FEAM !< Data for the FEAMooring module [-] TYPE(MoorDyn_Data) :: MD !< Data for the MoorDyn module [-] @@ -1398,6 +1417,7 @@ SUBROUTINE FAST_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg DstParamData%CompSub = SrcParamData%CompSub DstParamData%CompMooring = SrcParamData%CompMooring DstParamData%CompIce = SrcParamData%CompIce + DstParamData%CompSoil = SrcParamData%CompSoil DstParamData%UseDWM = SrcParamData%UseDWM DstParamData%Linearize = SrcParamData%Linearize DstParamData%EDFile = SrcParamData%EDFile @@ -1409,6 +1429,7 @@ SUBROUTINE FAST_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg DstParamData%SubFile = SrcParamData%SubFile DstParamData%MooringFile = SrcParamData%MooringFile DstParamData%IceFile = SrcParamData%IceFile + DstParamData%SoilFile = SrcParamData%SoilFile DstParamData%TStart = SrcParamData%TStart DstParamData%DT_Out = SrcParamData%DT_Out DstParamData%WrSttsTime = SrcParamData%WrSttsTime @@ -1528,6 +1549,7 @@ SUBROUTINE FAST_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, Int_BufSz = Int_BufSz + 1 ! CompSub Int_BufSz = Int_BufSz + 1 ! CompMooring Int_BufSz = Int_BufSz + 1 ! CompIce + Int_BufSz = Int_BufSz + 1 ! CompSoil Int_BufSz = Int_BufSz + 1 ! UseDWM Int_BufSz = Int_BufSz + 1 ! Linearize Int_BufSz = Int_BufSz + 1*LEN(InData%EDFile) ! EDFile @@ -1539,6 +1561,7 @@ SUBROUTINE FAST_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, Int_BufSz = Int_BufSz + 1*LEN(InData%SubFile) ! SubFile Int_BufSz = Int_BufSz + 1*LEN(InData%MooringFile) ! MooringFile Int_BufSz = Int_BufSz + 1*LEN(InData%IceFile) ! IceFile + Int_BufSz = Int_BufSz + 1*LEN(InData%SoilFile) ! SoilFile Db_BufSz = Db_BufSz + 1 ! TStart Db_BufSz = Db_BufSz + 1 ! DT_Out Int_BufSz = Int_BufSz + 1 ! WrSttsTime @@ -1664,6 +1687,8 @@ SUBROUTINE FAST_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, Int_Xferred = Int_Xferred + 1 IntKiBuf ( Int_Xferred:Int_Xferred+(1)-1 ) = InData%CompIce Int_Xferred = Int_Xferred + 1 + IntKiBuf ( Int_Xferred:Int_Xferred+(1)-1 ) = InData%CompSoil + Int_Xferred = Int_Xferred + 1 IntKiBuf ( Int_Xferred:Int_Xferred+1-1 ) = TRANSFER( InData%UseDWM , IntKiBuf(1), 1) Int_Xferred = Int_Xferred + 1 IntKiBuf ( Int_Xferred:Int_Xferred+1-1 ) = TRANSFER( InData%Linearize , IntKiBuf(1), 1) @@ -1706,6 +1731,10 @@ SUBROUTINE FAST_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, IntKiBuf(Int_Xferred) = ICHAR(InData%IceFile(I:I), IntKi) Int_Xferred = Int_Xferred + 1 END DO ! I + DO I = 1, LEN(InData%SoilFile) + IntKiBuf(Int_Xferred) = ICHAR(InData%SoilFile(I:I), IntKi) + Int_Xferred = Int_Xferred + 1 + END DO ! I DbKiBuf ( Db_Xferred:Db_Xferred+(1)-1 ) = InData%TStart Db_Xferred = Db_Xferred + 1 DbKiBuf ( Db_Xferred:Db_Xferred+(1)-1 ) = InData%DT_Out @@ -1934,6 +1963,8 @@ SUBROUTINE FAST_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMs Int_Xferred = Int_Xferred + 1 OutData%CompIce = IntKiBuf( Int_Xferred ) Int_Xferred = Int_Xferred + 1 + OutData%CompSoil = IntKiBuf( Int_Xferred ) + Int_Xferred = Int_Xferred + 1 OutData%UseDWM = TRANSFER( IntKiBuf( Int_Xferred ), mask0 ) Int_Xferred = Int_Xferred + 1 OutData%Linearize = TRANSFER( IntKiBuf( Int_Xferred ), mask0 ) @@ -1985,6 +2016,10 @@ SUBROUTINE FAST_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMs OutData%IceFile(I:I) = CHAR(IntKiBuf(Int_Xferred)) Int_Xferred = Int_Xferred + 1 END DO ! I + DO I = 1, LEN(OutData%SoilFile) + OutData%SoilFile(I:I) = CHAR(IntKiBuf(Int_Xferred)) + Int_Xferred = Int_Xferred + 1 + END DO ! I OutData%TStart = DbKiBuf( Db_Xferred ) Db_Xferred = Db_Xferred + 1 OutData%DT_Out = DbKiBuf( Db_Xferred ) @@ -15727,9 +15762,9 @@ SUBROUTINE FAST_UnPackSubDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, END IF END SUBROUTINE FAST_UnPackSubDyn_Data - SUBROUTINE FAST_CopyExtPtfm_Data( SrcExtPtfm_DataData, DstExtPtfm_DataData, CtrlCode, ErrStat, ErrMsg ) - TYPE(ExtPtfm_Data), INTENT(INOUT) :: SrcExtPtfm_DataData - TYPE(ExtPtfm_Data), INTENT(INOUT) :: DstExtPtfm_DataData + SUBROUTINE FAST_CopySoilDyn_Data( SrcSoilDyn_DataData, DstSoilDyn_DataData, CtrlCode, ErrStat, ErrMsg ) + TYPE(SoilDyn_Data), INTENT(INOUT) :: SrcSoilDyn_DataData + TYPE(SoilDyn_Data), INTENT(INOUT) :: DstSoilDyn_DataData INTEGER(IntKi), INTENT(IN ) :: CtrlCode INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg @@ -15738,113 +15773,113 @@ SUBROUTINE FAST_CopyExtPtfm_Data( SrcExtPtfm_DataData, DstExtPtfm_DataData, Ctrl INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'FAST_CopyExtPtfm_Data' + CHARACTER(*), PARAMETER :: RoutineName = 'FAST_CopySoilDyn_Data' ! ErrStat = ErrID_None ErrMsg = "" - DO i1 = LBOUND(SrcExtPtfm_DataData%x,1), UBOUND(SrcExtPtfm_DataData%x,1) - CALL ExtPtfm_CopyContState( SrcExtPtfm_DataData%x(i1), DstExtPtfm_DataData%x(i1), CtrlCode, ErrStat2, ErrMsg2 ) + DO i1 = LBOUND(SrcSoilDyn_DataData%x,1), UBOUND(SrcSoilDyn_DataData%x,1) + CALL SlD_CopyContState( SrcSoilDyn_DataData%x(i1), DstSoilDyn_DataData%x(i1), CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN ENDDO - DO i1 = LBOUND(SrcExtPtfm_DataData%xd,1), UBOUND(SrcExtPtfm_DataData%xd,1) - CALL ExtPtfm_CopyDiscState( SrcExtPtfm_DataData%xd(i1), DstExtPtfm_DataData%xd(i1), CtrlCode, ErrStat2, ErrMsg2 ) + DO i1 = LBOUND(SrcSoilDyn_DataData%xd,1), UBOUND(SrcSoilDyn_DataData%xd,1) + CALL SlD_CopyDiscState( SrcSoilDyn_DataData%xd(i1), DstSoilDyn_DataData%xd(i1), CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN ENDDO - DO i1 = LBOUND(SrcExtPtfm_DataData%z,1), UBOUND(SrcExtPtfm_DataData%z,1) - CALL ExtPtfm_CopyConstrState( SrcExtPtfm_DataData%z(i1), DstExtPtfm_DataData%z(i1), CtrlCode, ErrStat2, ErrMsg2 ) + DO i1 = LBOUND(SrcSoilDyn_DataData%z,1), UBOUND(SrcSoilDyn_DataData%z,1) + CALL SlD_CopyConstrState( SrcSoilDyn_DataData%z(i1), DstSoilDyn_DataData%z(i1), CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN ENDDO - DO i1 = LBOUND(SrcExtPtfm_DataData%OtherSt,1), UBOUND(SrcExtPtfm_DataData%OtherSt,1) - CALL ExtPtfm_CopyOtherState( SrcExtPtfm_DataData%OtherSt(i1), DstExtPtfm_DataData%OtherSt(i1), CtrlCode, ErrStat2, ErrMsg2 ) + DO i1 = LBOUND(SrcSoilDyn_DataData%OtherSt,1), UBOUND(SrcSoilDyn_DataData%OtherSt,1) + CALL SlD_CopyOtherState( SrcSoilDyn_DataData%OtherSt(i1), DstSoilDyn_DataData%OtherSt(i1), CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN ENDDO - CALL ExtPtfm_CopyParam( SrcExtPtfm_DataData%p, DstExtPtfm_DataData%p, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SlD_CopyParam( SrcSoilDyn_DataData%p, DstSoilDyn_DataData%p, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN - CALL ExtPtfm_CopyInput( SrcExtPtfm_DataData%u, DstExtPtfm_DataData%u, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SlD_CopyInput( SrcSoilDyn_DataData%u, DstSoilDyn_DataData%u, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN - CALL ExtPtfm_CopyOutput( SrcExtPtfm_DataData%y, DstExtPtfm_DataData%y, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SlD_CopyOutput( SrcSoilDyn_DataData%y, DstSoilDyn_DataData%y, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN - CALL ExtPtfm_CopyMisc( SrcExtPtfm_DataData%m, DstExtPtfm_DataData%m, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SlD_CopyMisc( SrcSoilDyn_DataData%m, DstSoilDyn_DataData%m, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN -IF (ALLOCATED(SrcExtPtfm_DataData%Input)) THEN - i1_l = LBOUND(SrcExtPtfm_DataData%Input,1) - i1_u = UBOUND(SrcExtPtfm_DataData%Input,1) - IF (.NOT. ALLOCATED(DstExtPtfm_DataData%Input)) THEN - ALLOCATE(DstExtPtfm_DataData%Input(i1_l:i1_u),STAT=ErrStat2) +IF (ALLOCATED(SrcSoilDyn_DataData%Input)) THEN + i1_l = LBOUND(SrcSoilDyn_DataData%Input,1) + i1_u = UBOUND(SrcSoilDyn_DataData%Input,1) + IF (.NOT. ALLOCATED(DstSoilDyn_DataData%Input)) THEN + ALLOCATE(DstSoilDyn_DataData%Input(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstExtPtfm_DataData%Input.', ErrStat, ErrMsg,RoutineName) + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstSoilDyn_DataData%Input.', ErrStat, ErrMsg,RoutineName) RETURN END IF END IF - DO i1 = LBOUND(SrcExtPtfm_DataData%Input,1), UBOUND(SrcExtPtfm_DataData%Input,1) - CALL ExtPtfm_CopyInput( SrcExtPtfm_DataData%Input(i1), DstExtPtfm_DataData%Input(i1), CtrlCode, ErrStat2, ErrMsg2 ) + DO i1 = LBOUND(SrcSoilDyn_DataData%Input,1), UBOUND(SrcSoilDyn_DataData%Input,1) + CALL SlD_CopyInput( SrcSoilDyn_DataData%Input(i1), DstSoilDyn_DataData%Input(i1), CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN ENDDO ENDIF -IF (ALLOCATED(SrcExtPtfm_DataData%InputTimes)) THEN - i1_l = LBOUND(SrcExtPtfm_DataData%InputTimes,1) - i1_u = UBOUND(SrcExtPtfm_DataData%InputTimes,1) - IF (.NOT. ALLOCATED(DstExtPtfm_DataData%InputTimes)) THEN - ALLOCATE(DstExtPtfm_DataData%InputTimes(i1_l:i1_u),STAT=ErrStat2) +IF (ALLOCATED(SrcSoilDyn_DataData%InputTimes)) THEN + i1_l = LBOUND(SrcSoilDyn_DataData%InputTimes,1) + i1_u = UBOUND(SrcSoilDyn_DataData%InputTimes,1) + IF (.NOT. ALLOCATED(DstSoilDyn_DataData%InputTimes)) THEN + ALLOCATE(DstSoilDyn_DataData%InputTimes(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstExtPtfm_DataData%InputTimes.', ErrStat, ErrMsg,RoutineName) + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstSoilDyn_DataData%InputTimes.', ErrStat, ErrMsg,RoutineName) RETURN END IF END IF - DstExtPtfm_DataData%InputTimes = SrcExtPtfm_DataData%InputTimes + DstSoilDyn_DataData%InputTimes = SrcSoilDyn_DataData%InputTimes ENDIF - END SUBROUTINE FAST_CopyExtPtfm_Data + END SUBROUTINE FAST_CopySoilDyn_Data - SUBROUTINE FAST_DestroyExtPtfm_Data( ExtPtfm_DataData, ErrStat, ErrMsg ) - TYPE(ExtPtfm_Data), INTENT(INOUT) :: ExtPtfm_DataData + SUBROUTINE FAST_DestroySoilDyn_Data( SoilDyn_DataData, ErrStat, ErrMsg ) + TYPE(SoilDyn_Data), INTENT(INOUT) :: SoilDyn_DataData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg - CHARACTER(*), PARAMETER :: RoutineName = 'FAST_DestroyExtPtfm_Data' + CHARACTER(*), PARAMETER :: RoutineName = 'FAST_DestroySoilDyn_Data' INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 ! ErrStat = ErrID_None ErrMsg = "" -DO i1 = LBOUND(ExtPtfm_DataData%x,1), UBOUND(ExtPtfm_DataData%x,1) - CALL ExtPtfm_DestroyContState( ExtPtfm_DataData%x(i1), ErrStat, ErrMsg ) +DO i1 = LBOUND(SoilDyn_DataData%x,1), UBOUND(SoilDyn_DataData%x,1) + CALL SlD_DestroyContState( SoilDyn_DataData%x(i1), ErrStat, ErrMsg ) ENDDO -DO i1 = LBOUND(ExtPtfm_DataData%xd,1), UBOUND(ExtPtfm_DataData%xd,1) - CALL ExtPtfm_DestroyDiscState( ExtPtfm_DataData%xd(i1), ErrStat, ErrMsg ) +DO i1 = LBOUND(SoilDyn_DataData%xd,1), UBOUND(SoilDyn_DataData%xd,1) + CALL SlD_DestroyDiscState( SoilDyn_DataData%xd(i1), ErrStat, ErrMsg ) ENDDO -DO i1 = LBOUND(ExtPtfm_DataData%z,1), UBOUND(ExtPtfm_DataData%z,1) - CALL ExtPtfm_DestroyConstrState( ExtPtfm_DataData%z(i1), ErrStat, ErrMsg ) +DO i1 = LBOUND(SoilDyn_DataData%z,1), UBOUND(SoilDyn_DataData%z,1) + CALL SlD_DestroyConstrState( SoilDyn_DataData%z(i1), ErrStat, ErrMsg ) ENDDO -DO i1 = LBOUND(ExtPtfm_DataData%OtherSt,1), UBOUND(ExtPtfm_DataData%OtherSt,1) - CALL ExtPtfm_DestroyOtherState( ExtPtfm_DataData%OtherSt(i1), ErrStat, ErrMsg ) +DO i1 = LBOUND(SoilDyn_DataData%OtherSt,1), UBOUND(SoilDyn_DataData%OtherSt,1) + CALL SlD_DestroyOtherState( SoilDyn_DataData%OtherSt(i1), ErrStat, ErrMsg ) ENDDO - CALL ExtPtfm_DestroyParam( ExtPtfm_DataData%p, ErrStat, ErrMsg ) - CALL ExtPtfm_DestroyInput( ExtPtfm_DataData%u, ErrStat, ErrMsg ) - CALL ExtPtfm_DestroyOutput( ExtPtfm_DataData%y, ErrStat, ErrMsg ) - CALL ExtPtfm_DestroyMisc( ExtPtfm_DataData%m, ErrStat, ErrMsg ) -IF (ALLOCATED(ExtPtfm_DataData%Input)) THEN -DO i1 = LBOUND(ExtPtfm_DataData%Input,1), UBOUND(ExtPtfm_DataData%Input,1) - CALL ExtPtfm_DestroyInput( ExtPtfm_DataData%Input(i1), ErrStat, ErrMsg ) + CALL SlD_DestroyParam( SoilDyn_DataData%p, ErrStat, ErrMsg ) + CALL SlD_DestroyInput( SoilDyn_DataData%u, ErrStat, ErrMsg ) + CALL SlD_DestroyOutput( SoilDyn_DataData%y, ErrStat, ErrMsg ) + CALL SlD_DestroyMisc( SoilDyn_DataData%m, ErrStat, ErrMsg ) +IF (ALLOCATED(SoilDyn_DataData%Input)) THEN +DO i1 = LBOUND(SoilDyn_DataData%Input,1), UBOUND(SoilDyn_DataData%Input,1) + CALL SlD_DestroyInput( SoilDyn_DataData%Input(i1), ErrStat, ErrMsg ) ENDDO - DEALLOCATE(ExtPtfm_DataData%Input) + DEALLOCATE(SoilDyn_DataData%Input) ENDIF -IF (ALLOCATED(ExtPtfm_DataData%InputTimes)) THEN - DEALLOCATE(ExtPtfm_DataData%InputTimes) +IF (ALLOCATED(SoilDyn_DataData%InputTimes)) THEN + DEALLOCATE(SoilDyn_DataData%InputTimes) ENDIF - END SUBROUTINE FAST_DestroyExtPtfm_Data + END SUBROUTINE FAST_DestroySoilDyn_Data - SUBROUTINE FAST_PackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) + SUBROUTINE FAST_PackSoilDyn_Data( 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(ExtPtfm_Data), INTENT(IN) :: InData + TYPE(SoilDyn_Data), INTENT(IN) :: InData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg LOGICAL,OPTIONAL, INTENT(IN ) :: SizeOnly @@ -15859,7 +15894,7 @@ SUBROUTINE FAST_PackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E LOGICAL :: OnlySize ! if present and true, do not pack, just allocate buffers INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'FAST_PackExtPtfm_Data' + CHARACTER(*), PARAMETER :: RoutineName = 'FAST_PackSoilDyn_Data' ! buffers to store subtypes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -15878,7 +15913,7 @@ SUBROUTINE FAST_PackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E ! Allocate buffers for subtypes, if any (we'll get sizes from these) DO i1 = LBOUND(InData%x,1), UBOUND(InData%x,1) Int_BufSz = Int_BufSz + 3 ! x: size of buffers for each call to pack subtype - CALL ExtPtfm_PackContState( Re_Buf, Db_Buf, Int_Buf, InData%x(i1), ErrStat2, ErrMsg2, .TRUE. ) ! x + CALL SlD_PackContState( Re_Buf, Db_Buf, Int_Buf, InData%x(i1), ErrStat2, ErrMsg2, .TRUE. ) ! x CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -15897,7 +15932,7 @@ SUBROUTINE FAST_PackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E END DO DO i1 = LBOUND(InData%xd,1), UBOUND(InData%xd,1) Int_BufSz = Int_BufSz + 3 ! xd: size of buffers for each call to pack subtype - CALL ExtPtfm_PackDiscState( Re_Buf, Db_Buf, Int_Buf, InData%xd(i1), ErrStat2, ErrMsg2, .TRUE. ) ! xd + CALL SlD_PackDiscState( Re_Buf, Db_Buf, Int_Buf, InData%xd(i1), ErrStat2, ErrMsg2, .TRUE. ) ! xd CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -15916,7 +15951,7 @@ SUBROUTINE FAST_PackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E END DO DO i1 = LBOUND(InData%z,1), UBOUND(InData%z,1) Int_BufSz = Int_BufSz + 3 ! z: size of buffers for each call to pack subtype - CALL ExtPtfm_PackConstrState( Re_Buf, Db_Buf, Int_Buf, InData%z(i1), ErrStat2, ErrMsg2, .TRUE. ) ! z + CALL SlD_PackConstrState( Re_Buf, Db_Buf, Int_Buf, InData%z(i1), ErrStat2, ErrMsg2, .TRUE. ) ! z CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -15935,7 +15970,7 @@ SUBROUTINE FAST_PackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E END DO DO i1 = LBOUND(InData%OtherSt,1), UBOUND(InData%OtherSt,1) Int_BufSz = Int_BufSz + 3 ! OtherSt: size of buffers for each call to pack subtype - CALL ExtPtfm_PackOtherState( Re_Buf, Db_Buf, Int_Buf, InData%OtherSt(i1), ErrStat2, ErrMsg2, .TRUE. ) ! OtherSt + CALL SlD_PackOtherState( Re_Buf, Db_Buf, Int_Buf, InData%OtherSt(i1), ErrStat2, ErrMsg2, .TRUE. ) ! OtherSt CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -15953,7 +15988,7 @@ SUBROUTINE FAST_PackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E END IF END DO Int_BufSz = Int_BufSz + 3 ! p: size of buffers for each call to pack subtype - CALL ExtPtfm_PackParam( Re_Buf, Db_Buf, Int_Buf, InData%p, ErrStat2, ErrMsg2, .TRUE. ) ! p + CALL SlD_PackParam( Re_Buf, Db_Buf, Int_Buf, InData%p, ErrStat2, ErrMsg2, .TRUE. ) ! p CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -15970,7 +16005,7 @@ SUBROUTINE FAST_PackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E DEALLOCATE(Int_Buf) END IF Int_BufSz = Int_BufSz + 3 ! u: size of buffers for each call to pack subtype - CALL ExtPtfm_PackInput( Re_Buf, Db_Buf, Int_Buf, InData%u, ErrStat2, ErrMsg2, .TRUE. ) ! u + CALL SlD_PackInput( Re_Buf, Db_Buf, Int_Buf, InData%u, ErrStat2, ErrMsg2, .TRUE. ) ! u CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -15987,7 +16022,7 @@ SUBROUTINE FAST_PackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E DEALLOCATE(Int_Buf) END IF Int_BufSz = Int_BufSz + 3 ! y: size of buffers for each call to pack subtype - CALL ExtPtfm_PackOutput( Re_Buf, Db_Buf, Int_Buf, InData%y, ErrStat2, ErrMsg2, .TRUE. ) ! y + CALL SlD_PackOutput( Re_Buf, Db_Buf, Int_Buf, InData%y, ErrStat2, ErrMsg2, .TRUE. ) ! y CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -16004,7 +16039,7 @@ SUBROUTINE FAST_PackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E DEALLOCATE(Int_Buf) END IF Int_BufSz = Int_BufSz + 3 ! m: size of buffers for each call to pack subtype - CALL ExtPtfm_PackMisc( Re_Buf, Db_Buf, Int_Buf, InData%m, ErrStat2, ErrMsg2, .TRUE. ) ! m + CALL SlD_PackMisc( Re_Buf, Db_Buf, Int_Buf, InData%m, ErrStat2, ErrMsg2, .TRUE. ) ! m CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -16025,7 +16060,7 @@ SUBROUTINE FAST_PackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E Int_BufSz = Int_BufSz + 2*1 ! Input upper/lower bounds for each dimension DO i1 = LBOUND(InData%Input,1), UBOUND(InData%Input,1) Int_BufSz = Int_BufSz + 3 ! Input: size of buffers for each call to pack subtype - CALL ExtPtfm_PackInput( Re_Buf, Db_Buf, Int_Buf, InData%Input(i1), ErrStat2, ErrMsg2, .TRUE. ) ! Input + CALL SlD_PackInput( Re_Buf, Db_Buf, Int_Buf, InData%Input(i1), ErrStat2, ErrMsg2, .TRUE. ) ! Input CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -16076,7 +16111,7 @@ SUBROUTINE FAST_PackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E Int_Xferred = 1 DO i1 = LBOUND(InData%x,1), UBOUND(InData%x,1) - CALL ExtPtfm_PackContState( Re_Buf, Db_Buf, Int_Buf, InData%x(i1), ErrStat2, ErrMsg2, OnlySize ) ! x + CALL SlD_PackContState( Re_Buf, Db_Buf, Int_Buf, InData%x(i1), ErrStat2, ErrMsg2, OnlySize ) ! x CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -16106,7 +16141,7 @@ SUBROUTINE FAST_PackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E ENDIF END DO DO i1 = LBOUND(InData%xd,1), UBOUND(InData%xd,1) - CALL ExtPtfm_PackDiscState( Re_Buf, Db_Buf, Int_Buf, InData%xd(i1), ErrStat2, ErrMsg2, OnlySize ) ! xd + CALL SlD_PackDiscState( Re_Buf, Db_Buf, Int_Buf, InData%xd(i1), ErrStat2, ErrMsg2, OnlySize ) ! xd CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -16136,7 +16171,7 @@ SUBROUTINE FAST_PackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E ENDIF END DO DO i1 = LBOUND(InData%z,1), UBOUND(InData%z,1) - CALL ExtPtfm_PackConstrState( Re_Buf, Db_Buf, Int_Buf, InData%z(i1), ErrStat2, ErrMsg2, OnlySize ) ! z + CALL SlD_PackConstrState( Re_Buf, Db_Buf, Int_Buf, InData%z(i1), ErrStat2, ErrMsg2, OnlySize ) ! z CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -16166,7 +16201,7 @@ SUBROUTINE FAST_PackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E ENDIF END DO DO i1 = LBOUND(InData%OtherSt,1), UBOUND(InData%OtherSt,1) - CALL ExtPtfm_PackOtherState( Re_Buf, Db_Buf, Int_Buf, InData%OtherSt(i1), ErrStat2, ErrMsg2, OnlySize ) ! OtherSt + CALL SlD_PackOtherState( Re_Buf, Db_Buf, Int_Buf, InData%OtherSt(i1), ErrStat2, ErrMsg2, OnlySize ) ! OtherSt CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -16195,7 +16230,7 @@ SUBROUTINE FAST_PackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E IntKiBuf( Int_Xferred ) = 0; Int_Xferred = Int_Xferred + 1 ENDIF END DO - CALL ExtPtfm_PackParam( Re_Buf, Db_Buf, Int_Buf, InData%p, ErrStat2, ErrMsg2, OnlySize ) ! p + CALL SlD_PackParam( Re_Buf, Db_Buf, Int_Buf, InData%p, ErrStat2, ErrMsg2, OnlySize ) ! p CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -16223,7 +16258,7 @@ SUBROUTINE FAST_PackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E ELSE IntKiBuf( Int_Xferred ) = 0; Int_Xferred = Int_Xferred + 1 ENDIF - CALL ExtPtfm_PackInput( Re_Buf, Db_Buf, Int_Buf, InData%u, ErrStat2, ErrMsg2, OnlySize ) ! u + CALL SlD_PackInput( Re_Buf, Db_Buf, Int_Buf, InData%u, ErrStat2, ErrMsg2, OnlySize ) ! u CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -16251,7 +16286,7 @@ SUBROUTINE FAST_PackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E ELSE IntKiBuf( Int_Xferred ) = 0; Int_Xferred = Int_Xferred + 1 ENDIF - CALL ExtPtfm_PackOutput( Re_Buf, Db_Buf, Int_Buf, InData%y, ErrStat2, ErrMsg2, OnlySize ) ! y + CALL SlD_PackOutput( Re_Buf, Db_Buf, Int_Buf, InData%y, ErrStat2, ErrMsg2, OnlySize ) ! y CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -16279,7 +16314,7 @@ SUBROUTINE FAST_PackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E ELSE IntKiBuf( Int_Xferred ) = 0; Int_Xferred = Int_Xferred + 1 ENDIF - CALL ExtPtfm_PackMisc( Re_Buf, Db_Buf, Int_Buf, InData%m, ErrStat2, ErrMsg2, OnlySize ) ! m + CALL SlD_PackMisc( Re_Buf, Db_Buf, Int_Buf, InData%m, ErrStat2, ErrMsg2, OnlySize ) ! m CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -16318,7 +16353,7 @@ SUBROUTINE FAST_PackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E Int_Xferred = Int_Xferred + 2 DO i1 = LBOUND(InData%Input,1), UBOUND(InData%Input,1) - CALL ExtPtfm_PackInput( Re_Buf, Db_Buf, Int_Buf, InData%Input(i1), ErrStat2, ErrMsg2, OnlySize ) ! Input + CALL SlD_PackInput( Re_Buf, Db_Buf, Int_Buf, InData%Input(i1), ErrStat2, ErrMsg2, OnlySize ) ! Input CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -16361,13 +16396,13 @@ SUBROUTINE FAST_PackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, E IF (SIZE(InData%InputTimes)>0) DbKiBuf ( Db_Xferred:Db_Xferred+(SIZE(InData%InputTimes))-1 ) = PACK(InData%InputTimes,.TRUE.) Db_Xferred = Db_Xferred + SIZE(InData%InputTimes) END IF - END SUBROUTINE FAST_PackExtPtfm_Data + END SUBROUTINE FAST_PackSoilDyn_Data - SUBROUTINE FAST_UnPackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) + SUBROUTINE FAST_UnPackSoilDyn_Data( 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(ExtPtfm_Data), INTENT(INOUT) :: OutData + TYPE(SoilDyn_Data), INTENT(INOUT) :: OutData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg ! Local variables @@ -16385,7 +16420,7 @@ SUBROUTINE FAST_UnPackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'FAST_UnPackExtPtfm_Data' + CHARACTER(*), PARAMETER :: RoutineName = 'FAST_UnPackSoilDyn_Data' ! buffers to store meshes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -16432,7 +16467,7 @@ SUBROUTINE FAST_UnPackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat Int_Buf = IntKiBuf( Int_Xferred:Int_Xferred+Buf_size-1 ) Int_Xferred = Int_Xferred + Buf_size END IF - CALL ExtPtfm_UnpackContState( Re_Buf, Db_Buf, Int_Buf, OutData%x(i1), ErrStat2, ErrMsg2 ) ! x + CALL SlD_UnpackContState( Re_Buf, Db_Buf, Int_Buf, OutData%x(i1), ErrStat2, ErrMsg2 ) ! x CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -16476,7 +16511,7 @@ SUBROUTINE FAST_UnPackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat Int_Buf = IntKiBuf( Int_Xferred:Int_Xferred+Buf_size-1 ) Int_Xferred = Int_Xferred + Buf_size END IF - CALL ExtPtfm_UnpackDiscState( Re_Buf, Db_Buf, Int_Buf, OutData%xd(i1), ErrStat2, ErrMsg2 ) ! xd + CALL SlD_UnpackDiscState( Re_Buf, Db_Buf, Int_Buf, OutData%xd(i1), ErrStat2, ErrMsg2 ) ! xd CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -16520,7 +16555,7 @@ SUBROUTINE FAST_UnPackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat Int_Buf = IntKiBuf( Int_Xferred:Int_Xferred+Buf_size-1 ) Int_Xferred = Int_Xferred + Buf_size END IF - CALL ExtPtfm_UnpackConstrState( Re_Buf, Db_Buf, Int_Buf, OutData%z(i1), ErrStat2, ErrMsg2 ) ! z + CALL SlD_UnpackConstrState( Re_Buf, Db_Buf, Int_Buf, OutData%z(i1), ErrStat2, ErrMsg2 ) ! z CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -16564,7 +16599,7 @@ SUBROUTINE FAST_UnPackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat Int_Buf = IntKiBuf( Int_Xferred:Int_Xferred+Buf_size-1 ) Int_Xferred = Int_Xferred + Buf_size END IF - CALL ExtPtfm_UnpackOtherState( Re_Buf, Db_Buf, Int_Buf, OutData%OtherSt(i1), ErrStat2, ErrMsg2 ) ! OtherSt + CALL SlD_UnpackOtherState( Re_Buf, Db_Buf, Int_Buf, OutData%OtherSt(i1), ErrStat2, ErrMsg2 ) ! OtherSt CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -16605,7 +16640,7 @@ SUBROUTINE FAST_UnPackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat Int_Buf = IntKiBuf( Int_Xferred:Int_Xferred+Buf_size-1 ) Int_Xferred = Int_Xferred + Buf_size END IF - CALL ExtPtfm_UnpackParam( Re_Buf, Db_Buf, Int_Buf, OutData%p, ErrStat2, ErrMsg2 ) ! p + CALL SlD_UnpackParam( Re_Buf, Db_Buf, Int_Buf, OutData%p, ErrStat2, ErrMsg2 ) ! p CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -16645,7 +16680,7 @@ SUBROUTINE FAST_UnPackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat Int_Buf = IntKiBuf( Int_Xferred:Int_Xferred+Buf_size-1 ) Int_Xferred = Int_Xferred + Buf_size END IF - CALL ExtPtfm_UnpackInput( Re_Buf, Db_Buf, Int_Buf, OutData%u, ErrStat2, ErrMsg2 ) ! u + CALL SlD_UnpackInput( Re_Buf, Db_Buf, Int_Buf, OutData%u, ErrStat2, ErrMsg2 ) ! u CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -16685,7 +16720,7 @@ SUBROUTINE FAST_UnPackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat Int_Buf = IntKiBuf( Int_Xferred:Int_Xferred+Buf_size-1 ) Int_Xferred = Int_Xferred + Buf_size END IF - CALL ExtPtfm_UnpackOutput( Re_Buf, Db_Buf, Int_Buf, OutData%y, ErrStat2, ErrMsg2 ) ! y + CALL SlD_UnpackOutput( Re_Buf, Db_Buf, Int_Buf, OutData%y, ErrStat2, ErrMsg2 ) ! y CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -16725,7 +16760,7 @@ SUBROUTINE FAST_UnPackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat Int_Buf = IntKiBuf( Int_Xferred:Int_Xferred+Buf_size-1 ) Int_Xferred = Int_Xferred + Buf_size END IF - CALL ExtPtfm_UnpackMisc( Re_Buf, Db_Buf, Int_Buf, OutData%m, ErrStat2, ErrMsg2 ) ! m + CALL SlD_UnpackMisc( Re_Buf, Db_Buf, Int_Buf, OutData%m, ErrStat2, ErrMsg2 ) ! m CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -16779,7 +16814,7 @@ SUBROUTINE FAST_UnPackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat Int_Buf = IntKiBuf( Int_Xferred:Int_Xferred+Buf_size-1 ) Int_Xferred = Int_Xferred + Buf_size END IF - CALL ExtPtfm_UnpackInput( Re_Buf, Db_Buf, Int_Buf, OutData%Input(i1), ErrStat2, ErrMsg2 ) ! Input + CALL SlD_UnpackInput( Re_Buf, Db_Buf, Int_Buf, OutData%Input(i1), ErrStat2, ErrMsg2 ) ! Input CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -16811,11 +16846,11 @@ SUBROUTINE FAST_UnPackExtPtfm_Data( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat Db_Xferred = Db_Xferred + SIZE(OutData%InputTimes) DEALLOCATE(mask1) END IF - END SUBROUTINE FAST_UnPackExtPtfm_Data + END SUBROUTINE FAST_UnPackSoilDyn_Data - SUBROUTINE FAST_CopyHydroDyn_Data( SrcHydroDyn_DataData, DstHydroDyn_DataData, CtrlCode, ErrStat, ErrMsg ) - TYPE(HydroDyn_Data), INTENT(INOUT) :: SrcHydroDyn_DataData - TYPE(HydroDyn_Data), INTENT(INOUT) :: DstHydroDyn_DataData + SUBROUTINE FAST_CopyExtPtfm_Data( SrcExtPtfm_DataData, DstExtPtfm_DataData, CtrlCode, ErrStat, ErrMsg ) + TYPE(ExtPtfm_Data), INTENT(INOUT) :: SrcExtPtfm_DataData + TYPE(ExtPtfm_Data), INTENT(INOUT) :: DstExtPtfm_DataData INTEGER(IntKi), INTENT(IN ) :: CtrlCode INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg @@ -16824,113 +16859,113 @@ SUBROUTINE FAST_CopyHydroDyn_Data( SrcHydroDyn_DataData, DstHydroDyn_DataData, C INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'FAST_CopyHydroDyn_Data' + CHARACTER(*), PARAMETER :: RoutineName = 'FAST_CopyExtPtfm_Data' ! ErrStat = ErrID_None ErrMsg = "" - DO i1 = LBOUND(SrcHydroDyn_DataData%x,1), UBOUND(SrcHydroDyn_DataData%x,1) - CALL HydroDyn_CopyContState( SrcHydroDyn_DataData%x(i1), DstHydroDyn_DataData%x(i1), CtrlCode, ErrStat2, ErrMsg2 ) + DO i1 = LBOUND(SrcExtPtfm_DataData%x,1), UBOUND(SrcExtPtfm_DataData%x,1) + CALL ExtPtfm_CopyContState( SrcExtPtfm_DataData%x(i1), DstExtPtfm_DataData%x(i1), CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN ENDDO - DO i1 = LBOUND(SrcHydroDyn_DataData%xd,1), UBOUND(SrcHydroDyn_DataData%xd,1) - CALL HydroDyn_CopyDiscState( SrcHydroDyn_DataData%xd(i1), DstHydroDyn_DataData%xd(i1), CtrlCode, ErrStat2, ErrMsg2 ) + DO i1 = LBOUND(SrcExtPtfm_DataData%xd,1), UBOUND(SrcExtPtfm_DataData%xd,1) + CALL ExtPtfm_CopyDiscState( SrcExtPtfm_DataData%xd(i1), DstExtPtfm_DataData%xd(i1), CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN ENDDO - DO i1 = LBOUND(SrcHydroDyn_DataData%z,1), UBOUND(SrcHydroDyn_DataData%z,1) - CALL HydroDyn_CopyConstrState( SrcHydroDyn_DataData%z(i1), DstHydroDyn_DataData%z(i1), CtrlCode, ErrStat2, ErrMsg2 ) + DO i1 = LBOUND(SrcExtPtfm_DataData%z,1), UBOUND(SrcExtPtfm_DataData%z,1) + CALL ExtPtfm_CopyConstrState( SrcExtPtfm_DataData%z(i1), DstExtPtfm_DataData%z(i1), CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN ENDDO - DO i1 = LBOUND(SrcHydroDyn_DataData%OtherSt,1), UBOUND(SrcHydroDyn_DataData%OtherSt,1) - CALL HydroDyn_CopyOtherState( SrcHydroDyn_DataData%OtherSt(i1), DstHydroDyn_DataData%OtherSt(i1), CtrlCode, ErrStat2, ErrMsg2 ) + DO i1 = LBOUND(SrcExtPtfm_DataData%OtherSt,1), UBOUND(SrcExtPtfm_DataData%OtherSt,1) + CALL ExtPtfm_CopyOtherState( SrcExtPtfm_DataData%OtherSt(i1), DstExtPtfm_DataData%OtherSt(i1), CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN ENDDO - CALL HydroDyn_CopyParam( SrcHydroDyn_DataData%p, DstHydroDyn_DataData%p, CtrlCode, ErrStat2, ErrMsg2 ) + CALL ExtPtfm_CopyParam( SrcExtPtfm_DataData%p, DstExtPtfm_DataData%p, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN - CALL HydroDyn_CopyInput( SrcHydroDyn_DataData%u, DstHydroDyn_DataData%u, CtrlCode, ErrStat2, ErrMsg2 ) + CALL ExtPtfm_CopyInput( SrcExtPtfm_DataData%u, DstExtPtfm_DataData%u, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN - CALL HydroDyn_CopyOutput( SrcHydroDyn_DataData%y, DstHydroDyn_DataData%y, CtrlCode, ErrStat2, ErrMsg2 ) + CALL ExtPtfm_CopyOutput( SrcExtPtfm_DataData%y, DstExtPtfm_DataData%y, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN - CALL HydroDyn_CopyMisc( SrcHydroDyn_DataData%m, DstHydroDyn_DataData%m, CtrlCode, ErrStat2, ErrMsg2 ) + CALL ExtPtfm_CopyMisc( SrcExtPtfm_DataData%m, DstExtPtfm_DataData%m, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN -IF (ALLOCATED(SrcHydroDyn_DataData%Input)) THEN - i1_l = LBOUND(SrcHydroDyn_DataData%Input,1) - i1_u = UBOUND(SrcHydroDyn_DataData%Input,1) - IF (.NOT. ALLOCATED(DstHydroDyn_DataData%Input)) THEN - ALLOCATE(DstHydroDyn_DataData%Input(i1_l:i1_u),STAT=ErrStat2) +IF (ALLOCATED(SrcExtPtfm_DataData%Input)) THEN + i1_l = LBOUND(SrcExtPtfm_DataData%Input,1) + i1_u = UBOUND(SrcExtPtfm_DataData%Input,1) + IF (.NOT. ALLOCATED(DstExtPtfm_DataData%Input)) THEN + ALLOCATE(DstExtPtfm_DataData%Input(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstHydroDyn_DataData%Input.', ErrStat, ErrMsg,RoutineName) + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstExtPtfm_DataData%Input.', ErrStat, ErrMsg,RoutineName) RETURN END IF END IF - DO i1 = LBOUND(SrcHydroDyn_DataData%Input,1), UBOUND(SrcHydroDyn_DataData%Input,1) - CALL HydroDyn_CopyInput( SrcHydroDyn_DataData%Input(i1), DstHydroDyn_DataData%Input(i1), CtrlCode, ErrStat2, ErrMsg2 ) + DO i1 = LBOUND(SrcExtPtfm_DataData%Input,1), UBOUND(SrcExtPtfm_DataData%Input,1) + CALL ExtPtfm_CopyInput( SrcExtPtfm_DataData%Input(i1), DstExtPtfm_DataData%Input(i1), CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN ENDDO ENDIF -IF (ALLOCATED(SrcHydroDyn_DataData%InputTimes)) THEN - i1_l = LBOUND(SrcHydroDyn_DataData%InputTimes,1) - i1_u = UBOUND(SrcHydroDyn_DataData%InputTimes,1) - IF (.NOT. ALLOCATED(DstHydroDyn_DataData%InputTimes)) THEN - ALLOCATE(DstHydroDyn_DataData%InputTimes(i1_l:i1_u),STAT=ErrStat2) +IF (ALLOCATED(SrcExtPtfm_DataData%InputTimes)) THEN + i1_l = LBOUND(SrcExtPtfm_DataData%InputTimes,1) + i1_u = UBOUND(SrcExtPtfm_DataData%InputTimes,1) + IF (.NOT. ALLOCATED(DstExtPtfm_DataData%InputTimes)) THEN + ALLOCATE(DstExtPtfm_DataData%InputTimes(i1_l:i1_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstHydroDyn_DataData%InputTimes.', ErrStat, ErrMsg,RoutineName) + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstExtPtfm_DataData%InputTimes.', ErrStat, ErrMsg,RoutineName) RETURN END IF END IF - DstHydroDyn_DataData%InputTimes = SrcHydroDyn_DataData%InputTimes + DstExtPtfm_DataData%InputTimes = SrcExtPtfm_DataData%InputTimes ENDIF - END SUBROUTINE FAST_CopyHydroDyn_Data + END SUBROUTINE FAST_CopyExtPtfm_Data - SUBROUTINE FAST_DestroyHydroDyn_Data( HydroDyn_DataData, ErrStat, ErrMsg ) - TYPE(HydroDyn_Data), INTENT(INOUT) :: HydroDyn_DataData + SUBROUTINE FAST_DestroyExtPtfm_Data( ExtPtfm_DataData, ErrStat, ErrMsg ) + TYPE(ExtPtfm_Data), INTENT(INOUT) :: ExtPtfm_DataData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg - CHARACTER(*), PARAMETER :: RoutineName = 'FAST_DestroyHydroDyn_Data' + CHARACTER(*), PARAMETER :: RoutineName = 'FAST_DestroyExtPtfm_Data' INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 ! ErrStat = ErrID_None ErrMsg = "" -DO i1 = LBOUND(HydroDyn_DataData%x,1), UBOUND(HydroDyn_DataData%x,1) - CALL HydroDyn_DestroyContState( HydroDyn_DataData%x(i1), ErrStat, ErrMsg ) +DO i1 = LBOUND(ExtPtfm_DataData%x,1), UBOUND(ExtPtfm_DataData%x,1) + CALL ExtPtfm_DestroyContState( ExtPtfm_DataData%x(i1), ErrStat, ErrMsg ) ENDDO -DO i1 = LBOUND(HydroDyn_DataData%xd,1), UBOUND(HydroDyn_DataData%xd,1) - CALL HydroDyn_DestroyDiscState( HydroDyn_DataData%xd(i1), ErrStat, ErrMsg ) +DO i1 = LBOUND(ExtPtfm_DataData%xd,1), UBOUND(ExtPtfm_DataData%xd,1) + CALL ExtPtfm_DestroyDiscState( ExtPtfm_DataData%xd(i1), ErrStat, ErrMsg ) ENDDO -DO i1 = LBOUND(HydroDyn_DataData%z,1), UBOUND(HydroDyn_DataData%z,1) - CALL HydroDyn_DestroyConstrState( HydroDyn_DataData%z(i1), ErrStat, ErrMsg ) +DO i1 = LBOUND(ExtPtfm_DataData%z,1), UBOUND(ExtPtfm_DataData%z,1) + CALL ExtPtfm_DestroyConstrState( ExtPtfm_DataData%z(i1), ErrStat, ErrMsg ) ENDDO -DO i1 = LBOUND(HydroDyn_DataData%OtherSt,1), UBOUND(HydroDyn_DataData%OtherSt,1) - CALL HydroDyn_DestroyOtherState( HydroDyn_DataData%OtherSt(i1), ErrStat, ErrMsg ) +DO i1 = LBOUND(ExtPtfm_DataData%OtherSt,1), UBOUND(ExtPtfm_DataData%OtherSt,1) + CALL ExtPtfm_DestroyOtherState( ExtPtfm_DataData%OtherSt(i1), ErrStat, ErrMsg ) ENDDO - CALL HydroDyn_DestroyParam( HydroDyn_DataData%p, ErrStat, ErrMsg ) - CALL HydroDyn_DestroyInput( HydroDyn_DataData%u, ErrStat, ErrMsg ) - CALL HydroDyn_DestroyOutput( HydroDyn_DataData%y, ErrStat, ErrMsg ) - CALL HydroDyn_DestroyMisc( HydroDyn_DataData%m, ErrStat, ErrMsg ) -IF (ALLOCATED(HydroDyn_DataData%Input)) THEN -DO i1 = LBOUND(HydroDyn_DataData%Input,1), UBOUND(HydroDyn_DataData%Input,1) - CALL HydroDyn_DestroyInput( HydroDyn_DataData%Input(i1), ErrStat, ErrMsg ) + CALL ExtPtfm_DestroyParam( ExtPtfm_DataData%p, ErrStat, ErrMsg ) + CALL ExtPtfm_DestroyInput( ExtPtfm_DataData%u, ErrStat, ErrMsg ) + CALL ExtPtfm_DestroyOutput( ExtPtfm_DataData%y, ErrStat, ErrMsg ) + CALL ExtPtfm_DestroyMisc( ExtPtfm_DataData%m, ErrStat, ErrMsg ) +IF (ALLOCATED(ExtPtfm_DataData%Input)) THEN +DO i1 = LBOUND(ExtPtfm_DataData%Input,1), UBOUND(ExtPtfm_DataData%Input,1) + CALL ExtPtfm_DestroyInput( ExtPtfm_DataData%Input(i1), ErrStat, ErrMsg ) ENDDO - DEALLOCATE(HydroDyn_DataData%Input) + DEALLOCATE(ExtPtfm_DataData%Input) ENDIF -IF (ALLOCATED(HydroDyn_DataData%InputTimes)) THEN - DEALLOCATE(HydroDyn_DataData%InputTimes) +IF (ALLOCATED(ExtPtfm_DataData%InputTimes)) THEN + DEALLOCATE(ExtPtfm_DataData%InputTimes) ENDIF - END SUBROUTINE FAST_DestroyHydroDyn_Data + END SUBROUTINE FAST_DestroyExtPtfm_Data - SUBROUTINE FAST_PackHydroDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) + SUBROUTINE FAST_PackExtPtfm_Data( 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(HydroDyn_Data), INTENT(IN) :: InData + TYPE(ExtPtfm_Data), INTENT(IN) :: InData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg LOGICAL,OPTIONAL, INTENT(IN ) :: SizeOnly @@ -16945,7 +16980,7 @@ SUBROUTINE FAST_PackHydroDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, LOGICAL :: OnlySize ! if present and true, do not pack, just allocate buffers INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'FAST_PackHydroDyn_Data' + CHARACTER(*), PARAMETER :: RoutineName = 'FAST_PackExtPtfm_Data' ! buffers to store subtypes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -16964,7 +16999,7 @@ SUBROUTINE FAST_PackHydroDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ! Allocate buffers for subtypes, if any (we'll get sizes from these) DO i1 = LBOUND(InData%x,1), UBOUND(InData%x,1) Int_BufSz = Int_BufSz + 3 ! x: size of buffers for each call to pack subtype - CALL HydroDyn_PackContState( Re_Buf, Db_Buf, Int_Buf, InData%x(i1), ErrStat2, ErrMsg2, .TRUE. ) ! x + CALL ExtPtfm_PackContState( Re_Buf, Db_Buf, Int_Buf, InData%x(i1), ErrStat2, ErrMsg2, .TRUE. ) ! x CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -16983,7 +17018,7 @@ SUBROUTINE FAST_PackHydroDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, END DO DO i1 = LBOUND(InData%xd,1), UBOUND(InData%xd,1) Int_BufSz = Int_BufSz + 3 ! xd: size of buffers for each call to pack subtype - CALL HydroDyn_PackDiscState( Re_Buf, Db_Buf, Int_Buf, InData%xd(i1), ErrStat2, ErrMsg2, .TRUE. ) ! xd + CALL ExtPtfm_PackDiscState( Re_Buf, Db_Buf, Int_Buf, InData%xd(i1), ErrStat2, ErrMsg2, .TRUE. ) ! xd CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -17002,7 +17037,7 @@ SUBROUTINE FAST_PackHydroDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, END DO DO i1 = LBOUND(InData%z,1), UBOUND(InData%z,1) Int_BufSz = Int_BufSz + 3 ! z: size of buffers for each call to pack subtype - CALL HydroDyn_PackConstrState( Re_Buf, Db_Buf, Int_Buf, InData%z(i1), ErrStat2, ErrMsg2, .TRUE. ) ! z + CALL ExtPtfm_PackConstrState( Re_Buf, Db_Buf, Int_Buf, InData%z(i1), ErrStat2, ErrMsg2, .TRUE. ) ! z CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -17021,7 +17056,7 @@ SUBROUTINE FAST_PackHydroDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, END DO DO i1 = LBOUND(InData%OtherSt,1), UBOUND(InData%OtherSt,1) Int_BufSz = Int_BufSz + 3 ! OtherSt: size of buffers for each call to pack subtype - CALL HydroDyn_PackOtherState( Re_Buf, Db_Buf, Int_Buf, InData%OtherSt(i1), ErrStat2, ErrMsg2, .TRUE. ) ! OtherSt + CALL ExtPtfm_PackOtherState( Re_Buf, Db_Buf, Int_Buf, InData%OtherSt(i1), ErrStat2, ErrMsg2, .TRUE. ) ! OtherSt CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -17039,7 +17074,7 @@ SUBROUTINE FAST_PackHydroDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, END IF END DO Int_BufSz = Int_BufSz + 3 ! p: size of buffers for each call to pack subtype - CALL HydroDyn_PackParam( Re_Buf, Db_Buf, Int_Buf, InData%p, ErrStat2, ErrMsg2, .TRUE. ) ! p + CALL ExtPtfm_PackParam( Re_Buf, Db_Buf, Int_Buf, InData%p, ErrStat2, ErrMsg2, .TRUE. ) ! p CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -17056,7 +17091,7 @@ SUBROUTINE FAST_PackHydroDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, DEALLOCATE(Int_Buf) END IF Int_BufSz = Int_BufSz + 3 ! u: size of buffers for each call to pack subtype - CALL HydroDyn_PackInput( Re_Buf, Db_Buf, Int_Buf, InData%u, ErrStat2, ErrMsg2, .TRUE. ) ! u + CALL ExtPtfm_PackInput( Re_Buf, Db_Buf, Int_Buf, InData%u, ErrStat2, ErrMsg2, .TRUE. ) ! u CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -17073,7 +17108,7 @@ SUBROUTINE FAST_PackHydroDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, DEALLOCATE(Int_Buf) END IF Int_BufSz = Int_BufSz + 3 ! y: size of buffers for each call to pack subtype - CALL HydroDyn_PackOutput( Re_Buf, Db_Buf, Int_Buf, InData%y, ErrStat2, ErrMsg2, .TRUE. ) ! y + CALL ExtPtfm_PackOutput( Re_Buf, Db_Buf, Int_Buf, InData%y, ErrStat2, ErrMsg2, .TRUE. ) ! y CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -17090,7 +17125,7 @@ SUBROUTINE FAST_PackHydroDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, DEALLOCATE(Int_Buf) END IF Int_BufSz = Int_BufSz + 3 ! m: size of buffers for each call to pack subtype - CALL HydroDyn_PackMisc( Re_Buf, Db_Buf, Int_Buf, InData%m, ErrStat2, ErrMsg2, .TRUE. ) ! m + CALL ExtPtfm_PackMisc( Re_Buf, Db_Buf, Int_Buf, InData%m, ErrStat2, ErrMsg2, .TRUE. ) ! m CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -17111,7 +17146,7 @@ SUBROUTINE FAST_PackHydroDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Int_BufSz = Int_BufSz + 2*1 ! Input upper/lower bounds for each dimension DO i1 = LBOUND(InData%Input,1), UBOUND(InData%Input,1) Int_BufSz = Int_BufSz + 3 ! Input: size of buffers for each call to pack subtype - CALL HydroDyn_PackInput( Re_Buf, Db_Buf, Int_Buf, InData%Input(i1), ErrStat2, ErrMsg2, .TRUE. ) ! Input + CALL ExtPtfm_PackInput( Re_Buf, Db_Buf, Int_Buf, InData%Input(i1), ErrStat2, ErrMsg2, .TRUE. ) ! Input CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -17162,7 +17197,7 @@ SUBROUTINE FAST_PackHydroDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Int_Xferred = 1 DO i1 = LBOUND(InData%x,1), UBOUND(InData%x,1) - CALL HydroDyn_PackContState( Re_Buf, Db_Buf, Int_Buf, InData%x(i1), ErrStat2, ErrMsg2, OnlySize ) ! x + CALL ExtPtfm_PackContState( Re_Buf, Db_Buf, Int_Buf, InData%x(i1), ErrStat2, ErrMsg2, OnlySize ) ! x CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -17192,7 +17227,7 @@ SUBROUTINE FAST_PackHydroDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ENDIF END DO DO i1 = LBOUND(InData%xd,1), UBOUND(InData%xd,1) - CALL HydroDyn_PackDiscState( Re_Buf, Db_Buf, Int_Buf, InData%xd(i1), ErrStat2, ErrMsg2, OnlySize ) ! xd + CALL ExtPtfm_PackDiscState( Re_Buf, Db_Buf, Int_Buf, InData%xd(i1), ErrStat2, ErrMsg2, OnlySize ) ! xd CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -17222,7 +17257,7 @@ SUBROUTINE FAST_PackHydroDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ENDIF END DO DO i1 = LBOUND(InData%z,1), UBOUND(InData%z,1) - CALL HydroDyn_PackConstrState( Re_Buf, Db_Buf, Int_Buf, InData%z(i1), ErrStat2, ErrMsg2, OnlySize ) ! z + CALL ExtPtfm_PackConstrState( Re_Buf, Db_Buf, Int_Buf, InData%z(i1), ErrStat2, ErrMsg2, OnlySize ) ! z CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -17252,7 +17287,7 @@ SUBROUTINE FAST_PackHydroDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ENDIF END DO DO i1 = LBOUND(InData%OtherSt,1), UBOUND(InData%OtherSt,1) - CALL HydroDyn_PackOtherState( Re_Buf, Db_Buf, Int_Buf, InData%OtherSt(i1), ErrStat2, ErrMsg2, OnlySize ) ! OtherSt + CALL ExtPtfm_PackOtherState( Re_Buf, Db_Buf, Int_Buf, InData%OtherSt(i1), ErrStat2, ErrMsg2, OnlySize ) ! OtherSt CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -17281,7 +17316,7 @@ SUBROUTINE FAST_PackHydroDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, IntKiBuf( Int_Xferred ) = 0; Int_Xferred = Int_Xferred + 1 ENDIF END DO - CALL HydroDyn_PackParam( Re_Buf, Db_Buf, Int_Buf, InData%p, ErrStat2, ErrMsg2, OnlySize ) ! p + CALL ExtPtfm_PackParam( Re_Buf, Db_Buf, Int_Buf, InData%p, ErrStat2, ErrMsg2, OnlySize ) ! p CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -17309,7 +17344,7 @@ SUBROUTINE FAST_PackHydroDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ELSE IntKiBuf( Int_Xferred ) = 0; Int_Xferred = Int_Xferred + 1 ENDIF - CALL HydroDyn_PackInput( Re_Buf, Db_Buf, Int_Buf, InData%u, ErrStat2, ErrMsg2, OnlySize ) ! u + CALL ExtPtfm_PackInput( Re_Buf, Db_Buf, Int_Buf, InData%u, ErrStat2, ErrMsg2, OnlySize ) ! u CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -17337,7 +17372,7 @@ SUBROUTINE FAST_PackHydroDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ELSE IntKiBuf( Int_Xferred ) = 0; Int_Xferred = Int_Xferred + 1 ENDIF - CALL HydroDyn_PackOutput( Re_Buf, Db_Buf, Int_Buf, InData%y, ErrStat2, ErrMsg2, OnlySize ) ! y + CALL ExtPtfm_PackOutput( Re_Buf, Db_Buf, Int_Buf, InData%y, ErrStat2, ErrMsg2, OnlySize ) ! y CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -17365,7 +17400,7 @@ SUBROUTINE FAST_PackHydroDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ELSE IntKiBuf( Int_Xferred ) = 0; Int_Xferred = Int_Xferred + 1 ENDIF - CALL HydroDyn_PackMisc( Re_Buf, Db_Buf, Int_Buf, InData%m, ErrStat2, ErrMsg2, OnlySize ) ! m + CALL ExtPtfm_PackMisc( Re_Buf, Db_Buf, Int_Buf, InData%m, ErrStat2, ErrMsg2, OnlySize ) ! m CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -17404,7 +17439,7 @@ SUBROUTINE FAST_PackHydroDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Int_Xferred = Int_Xferred + 2 DO i1 = LBOUND(InData%Input,1), UBOUND(InData%Input,1) - CALL HydroDyn_PackInput( Re_Buf, Db_Buf, Int_Buf, InData%Input(i1), ErrStat2, ErrMsg2, OnlySize ) ! Input + CALL ExtPtfm_PackInput( Re_Buf, Db_Buf, Int_Buf, InData%Input(i1), ErrStat2, ErrMsg2, OnlySize ) ! Input CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -17447,13 +17482,13 @@ SUBROUTINE FAST_PackHydroDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, IF (SIZE(InData%InputTimes)>0) DbKiBuf ( Db_Xferred:Db_Xferred+(SIZE(InData%InputTimes))-1 ) = PACK(InData%InputTimes,.TRUE.) Db_Xferred = Db_Xferred + SIZE(InData%InputTimes) END IF - END SUBROUTINE FAST_PackHydroDyn_Data + END SUBROUTINE FAST_PackExtPtfm_Data - SUBROUTINE FAST_UnPackHydroDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) + SUBROUTINE FAST_UnPackExtPtfm_Data( 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(HydroDyn_Data), INTENT(INOUT) :: OutData + TYPE(ExtPtfm_Data), INTENT(INOUT) :: OutData INTEGER(IntKi), INTENT( OUT) :: ErrStat CHARACTER(*), INTENT( OUT) :: ErrMsg ! Local variables @@ -17471,7 +17506,7 @@ SUBROUTINE FAST_UnPackHydroDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrSta INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'FAST_UnPackHydroDyn_Data' + CHARACTER(*), PARAMETER :: RoutineName = 'FAST_UnPackExtPtfm_Data' ! buffers to store meshes, if any REAL(ReKi), ALLOCATABLE :: Re_Buf(:) REAL(DbKi), ALLOCATABLE :: Db_Buf(:) @@ -17518,7 +17553,1093 @@ SUBROUTINE FAST_UnPackHydroDyn_Data( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrSta Int_Buf = IntKiBuf( Int_Xferred:Int_Xferred+Buf_size-1 ) Int_Xferred = Int_Xferred + Buf_size END IF - CALL HydroDyn_UnpackContState( Re_Buf, Db_Buf, Int_Buf, OutData%x(i1), ErrStat2, ErrMsg2 ) ! x + CALL ExtPtfm_UnpackContState( Re_Buf, Db_Buf, Int_Buf, OutData%x(i1), ErrStat2, ErrMsg2 ) ! x + 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) + END DO + i1_l = LBOUND(OutData%xd,1) + i1_u = UBOUND(OutData%xd,1) + DO i1 = LBOUND(OutData%xd,1), UBOUND(OutData%xd,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 ExtPtfm_UnpackDiscState( Re_Buf, Db_Buf, Int_Buf, OutData%xd(i1), ErrStat2, ErrMsg2 ) ! xd + 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) + END DO + i1_l = LBOUND(OutData%z,1) + i1_u = UBOUND(OutData%z,1) + DO i1 = LBOUND(OutData%z,1), UBOUND(OutData%z,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 ExtPtfm_UnpackConstrState( Re_Buf, Db_Buf, Int_Buf, OutData%z(i1), ErrStat2, ErrMsg2 ) ! z + 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) + END DO + i1_l = LBOUND(OutData%OtherSt,1) + i1_u = UBOUND(OutData%OtherSt,1) + DO i1 = LBOUND(OutData%OtherSt,1), UBOUND(OutData%OtherSt,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 ExtPtfm_UnpackOtherState( Re_Buf, Db_Buf, Int_Buf, OutData%OtherSt(i1), ErrStat2, ErrMsg2 ) ! OtherSt + 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) + END DO + 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 ExtPtfm_UnpackParam( Re_Buf, Db_Buf, Int_Buf, OutData%p, ErrStat2, ErrMsg2 ) ! 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) + 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 ExtPtfm_UnpackInput( Re_Buf, Db_Buf, Int_Buf, OutData%u, ErrStat2, ErrMsg2 ) ! u + 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) + 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 ExtPtfm_UnpackOutput( Re_Buf, Db_Buf, Int_Buf, OutData%y, ErrStat2, ErrMsg2 ) ! y + 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) + 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 ExtPtfm_UnpackMisc( Re_Buf, Db_Buf, Int_Buf, OutData%m, ErrStat2, ErrMsg2 ) ! m + 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) + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! Input 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 (ALLOCATED(OutData%Input)) DEALLOCATE(OutData%Input) + ALLOCATE(OutData%Input(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i1 = LBOUND(OutData%Input,1), UBOUND(OutData%Input,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 ExtPtfm_UnpackInput( Re_Buf, Db_Buf, Int_Buf, OutData%Input(i1), ErrStat2, ErrMsg2 ) ! Input + 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) + END DO + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! InputTimes 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 (ALLOCATED(OutData%InputTimes)) DEALLOCATE(OutData%InputTimes) + ALLOCATE(OutData%InputTimes(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%InputTimes.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + ALLOCATE(mask1(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating mask1.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + mask1 = .TRUE. + IF (SIZE(OutData%InputTimes)>0) OutData%InputTimes = UNPACK(DbKiBuf( Db_Xferred:Db_Xferred+(SIZE(OutData%InputTimes))-1 ), mask1, 0.0_DbKi ) + Db_Xferred = Db_Xferred + SIZE(OutData%InputTimes) + DEALLOCATE(mask1) + END IF + END SUBROUTINE FAST_UnPackExtPtfm_Data + + SUBROUTINE FAST_CopyHydroDyn_Data( SrcHydroDyn_DataData, DstHydroDyn_DataData, CtrlCode, ErrStat, ErrMsg ) + TYPE(HydroDyn_Data), INTENT(INOUT) :: SrcHydroDyn_DataData + TYPE(HydroDyn_Data), INTENT(INOUT) :: DstHydroDyn_DataData + 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 = 'FAST_CopyHydroDyn_Data' +! + ErrStat = ErrID_None + ErrMsg = "" + DO i1 = LBOUND(SrcHydroDyn_DataData%x,1), UBOUND(SrcHydroDyn_DataData%x,1) + CALL HydroDyn_CopyContState( SrcHydroDyn_DataData%x(i1), DstHydroDyn_DataData%x(i1), CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN + ENDDO + DO i1 = LBOUND(SrcHydroDyn_DataData%xd,1), UBOUND(SrcHydroDyn_DataData%xd,1) + CALL HydroDyn_CopyDiscState( SrcHydroDyn_DataData%xd(i1), DstHydroDyn_DataData%xd(i1), CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN + ENDDO + DO i1 = LBOUND(SrcHydroDyn_DataData%z,1), UBOUND(SrcHydroDyn_DataData%z,1) + CALL HydroDyn_CopyConstrState( SrcHydroDyn_DataData%z(i1), DstHydroDyn_DataData%z(i1), CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN + ENDDO + DO i1 = LBOUND(SrcHydroDyn_DataData%OtherSt,1), UBOUND(SrcHydroDyn_DataData%OtherSt,1) + CALL HydroDyn_CopyOtherState( SrcHydroDyn_DataData%OtherSt(i1), DstHydroDyn_DataData%OtherSt(i1), CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN + ENDDO + CALL HydroDyn_CopyParam( SrcHydroDyn_DataData%p, DstHydroDyn_DataData%p, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN + CALL HydroDyn_CopyInput( SrcHydroDyn_DataData%u, DstHydroDyn_DataData%u, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN + CALL HydroDyn_CopyOutput( SrcHydroDyn_DataData%y, DstHydroDyn_DataData%y, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN + CALL HydroDyn_CopyMisc( SrcHydroDyn_DataData%m, DstHydroDyn_DataData%m, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN +IF (ALLOCATED(SrcHydroDyn_DataData%Input)) THEN + i1_l = LBOUND(SrcHydroDyn_DataData%Input,1) + i1_u = UBOUND(SrcHydroDyn_DataData%Input,1) + IF (.NOT. ALLOCATED(DstHydroDyn_DataData%Input)) THEN + ALLOCATE(DstHydroDyn_DataData%Input(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstHydroDyn_DataData%Input.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DO i1 = LBOUND(SrcHydroDyn_DataData%Input,1), UBOUND(SrcHydroDyn_DataData%Input,1) + CALL HydroDyn_CopyInput( SrcHydroDyn_DataData%Input(i1), DstHydroDyn_DataData%Input(i1), CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN + ENDDO +ENDIF +IF (ALLOCATED(SrcHydroDyn_DataData%InputTimes)) THEN + i1_l = LBOUND(SrcHydroDyn_DataData%InputTimes,1) + i1_u = UBOUND(SrcHydroDyn_DataData%InputTimes,1) + IF (.NOT. ALLOCATED(DstHydroDyn_DataData%InputTimes)) THEN + ALLOCATE(DstHydroDyn_DataData%InputTimes(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstHydroDyn_DataData%InputTimes.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstHydroDyn_DataData%InputTimes = SrcHydroDyn_DataData%InputTimes +ENDIF + END SUBROUTINE FAST_CopyHydroDyn_Data + + SUBROUTINE FAST_DestroyHydroDyn_Data( HydroDyn_DataData, ErrStat, ErrMsg ) + TYPE(HydroDyn_Data), INTENT(INOUT) :: HydroDyn_DataData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + CHARACTER(*), PARAMETER :: RoutineName = 'FAST_DestroyHydroDyn_Data' + INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 +! + ErrStat = ErrID_None + ErrMsg = "" +DO i1 = LBOUND(HydroDyn_DataData%x,1), UBOUND(HydroDyn_DataData%x,1) + CALL HydroDyn_DestroyContState( HydroDyn_DataData%x(i1), ErrStat, ErrMsg ) +ENDDO +DO i1 = LBOUND(HydroDyn_DataData%xd,1), UBOUND(HydroDyn_DataData%xd,1) + CALL HydroDyn_DestroyDiscState( HydroDyn_DataData%xd(i1), ErrStat, ErrMsg ) +ENDDO +DO i1 = LBOUND(HydroDyn_DataData%z,1), UBOUND(HydroDyn_DataData%z,1) + CALL HydroDyn_DestroyConstrState( HydroDyn_DataData%z(i1), ErrStat, ErrMsg ) +ENDDO +DO i1 = LBOUND(HydroDyn_DataData%OtherSt,1), UBOUND(HydroDyn_DataData%OtherSt,1) + CALL HydroDyn_DestroyOtherState( HydroDyn_DataData%OtherSt(i1), ErrStat, ErrMsg ) +ENDDO + CALL HydroDyn_DestroyParam( HydroDyn_DataData%p, ErrStat, ErrMsg ) + CALL HydroDyn_DestroyInput( HydroDyn_DataData%u, ErrStat, ErrMsg ) + CALL HydroDyn_DestroyOutput( HydroDyn_DataData%y, ErrStat, ErrMsg ) + CALL HydroDyn_DestroyMisc( HydroDyn_DataData%m, ErrStat, ErrMsg ) +IF (ALLOCATED(HydroDyn_DataData%Input)) THEN +DO i1 = LBOUND(HydroDyn_DataData%Input,1), UBOUND(HydroDyn_DataData%Input,1) + CALL HydroDyn_DestroyInput( HydroDyn_DataData%Input(i1), ErrStat, ErrMsg ) +ENDDO + DEALLOCATE(HydroDyn_DataData%Input) +ENDIF +IF (ALLOCATED(HydroDyn_DataData%InputTimes)) THEN + DEALLOCATE(HydroDyn_DataData%InputTimes) +ENDIF + END SUBROUTINE FAST_DestroyHydroDyn_Data + + SUBROUTINE FAST_PackHydroDyn_Data( 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(HydroDyn_Data), 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 = 'FAST_PackHydroDyn_Data' + ! 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 + ! Allocate buffers for subtypes, if any (we'll get sizes from these) + DO i1 = LBOUND(InData%x,1), UBOUND(InData%x,1) + Int_BufSz = Int_BufSz + 3 ! x: size of buffers for each call to pack subtype + CALL HydroDyn_PackContState( Re_Buf, Db_Buf, Int_Buf, InData%x(i1), ErrStat2, ErrMsg2, .TRUE. ) ! x + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! x + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! x + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! x + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF + END DO + DO i1 = LBOUND(InData%xd,1), UBOUND(InData%xd,1) + Int_BufSz = Int_BufSz + 3 ! xd: size of buffers for each call to pack subtype + CALL HydroDyn_PackDiscState( Re_Buf, Db_Buf, Int_Buf, InData%xd(i1), ErrStat2, ErrMsg2, .TRUE. ) ! xd + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! xd + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! xd + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! xd + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF + END DO + DO i1 = LBOUND(InData%z,1), UBOUND(InData%z,1) + Int_BufSz = Int_BufSz + 3 ! z: size of buffers for each call to pack subtype + CALL HydroDyn_PackConstrState( Re_Buf, Db_Buf, Int_Buf, InData%z(i1), ErrStat2, ErrMsg2, .TRUE. ) ! z + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! z + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! z + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! z + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF + END DO + DO i1 = LBOUND(InData%OtherSt,1), UBOUND(InData%OtherSt,1) + Int_BufSz = Int_BufSz + 3 ! OtherSt: size of buffers for each call to pack subtype + CALL HydroDyn_PackOtherState( Re_Buf, Db_Buf, Int_Buf, InData%OtherSt(i1), ErrStat2, ErrMsg2, .TRUE. ) ! OtherSt + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! OtherSt + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! OtherSt + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! OtherSt + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF + END DO + Int_BufSz = Int_BufSz + 3 ! p: size of buffers for each call to pack subtype + CALL HydroDyn_PackParam( Re_Buf, Db_Buf, Int_Buf, InData%p, ErrStat2, ErrMsg2, .TRUE. ) ! p + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! p + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! p + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! p + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF + Int_BufSz = Int_BufSz + 3 ! u: size of buffers for each call to pack subtype + CALL HydroDyn_PackInput( Re_Buf, Db_Buf, Int_Buf, InData%u, ErrStat2, ErrMsg2, .TRUE. ) ! u + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! u + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! u + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! u + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF + Int_BufSz = Int_BufSz + 3 ! y: size of buffers for each call to pack subtype + CALL HydroDyn_PackOutput( Re_Buf, Db_Buf, Int_Buf, InData%y, ErrStat2, ErrMsg2, .TRUE. ) ! y + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! y + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! y + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! y + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF + Int_BufSz = Int_BufSz + 3 ! m: size of buffers for each call to pack subtype + CALL HydroDyn_PackMisc( Re_Buf, Db_Buf, Int_Buf, InData%m, ErrStat2, ErrMsg2, .TRUE. ) ! m + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! m + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! m + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! m + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF + Int_BufSz = Int_BufSz + 1 ! Input allocated yes/no + IF ( ALLOCATED(InData%Input) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! Input upper/lower bounds for each dimension + DO i1 = LBOUND(InData%Input,1), UBOUND(InData%Input,1) + Int_BufSz = Int_BufSz + 3 ! Input: size of buffers for each call to pack subtype + CALL HydroDyn_PackInput( Re_Buf, Db_Buf, Int_Buf, InData%Input(i1), ErrStat2, ErrMsg2, .TRUE. ) ! Input + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! Input + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! Input + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! Input + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF + END DO + END IF + Int_BufSz = Int_BufSz + 1 ! InputTimes allocated yes/no + IF ( ALLOCATED(InData%InputTimes) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! InputTimes upper/lower bounds for each dimension + Db_BufSz = Db_BufSz + SIZE(InData%InputTimes) ! InputTimes + 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) + + Re_Xferred = 1 + Db_Xferred = 1 + Int_Xferred = 1 + + DO i1 = LBOUND(InData%x,1), UBOUND(InData%x,1) + CALL HydroDyn_PackContState( Re_Buf, Db_Buf, Int_Buf, InData%x(i1), ErrStat2, ErrMsg2, OnlySize ) ! x + 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 + END DO + DO i1 = LBOUND(InData%xd,1), UBOUND(InData%xd,1) + CALL HydroDyn_PackDiscState( Re_Buf, Db_Buf, Int_Buf, InData%xd(i1), ErrStat2, ErrMsg2, OnlySize ) ! xd + 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 + END DO + DO i1 = LBOUND(InData%z,1), UBOUND(InData%z,1) + CALL HydroDyn_PackConstrState( Re_Buf, Db_Buf, Int_Buf, InData%z(i1), ErrStat2, ErrMsg2, OnlySize ) ! z + 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 + END DO + DO i1 = LBOUND(InData%OtherSt,1), UBOUND(InData%OtherSt,1) + CALL HydroDyn_PackOtherState( Re_Buf, Db_Buf, Int_Buf, InData%OtherSt(i1), ErrStat2, ErrMsg2, OnlySize ) ! OtherSt + 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 + END DO + CALL HydroDyn_PackParam( Re_Buf, Db_Buf, Int_Buf, InData%p, ErrStat2, ErrMsg2, OnlySize ) ! 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 + CALL HydroDyn_PackInput( Re_Buf, Db_Buf, Int_Buf, InData%u, ErrStat2, ErrMsg2, OnlySize ) ! u + 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 + CALL HydroDyn_PackOutput( Re_Buf, Db_Buf, Int_Buf, InData%y, ErrStat2, ErrMsg2, OnlySize ) ! y + 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 + CALL HydroDyn_PackMisc( Re_Buf, Db_Buf, Int_Buf, InData%m, ErrStat2, ErrMsg2, OnlySize ) ! m + 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 + IF ( .NOT. ALLOCATED(InData%Input) ) 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%Input,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%Input,1) + Int_Xferred = Int_Xferred + 2 + + DO i1 = LBOUND(InData%Input,1), UBOUND(InData%Input,1) + CALL HydroDyn_PackInput( Re_Buf, Db_Buf, Int_Buf, InData%Input(i1), ErrStat2, ErrMsg2, OnlySize ) ! Input + 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 + END DO + END IF + IF ( .NOT. ALLOCATED(InData%InputTimes) ) 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%InputTimes,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%InputTimes,1) + Int_Xferred = Int_Xferred + 2 + + IF (SIZE(InData%InputTimes)>0) DbKiBuf ( Db_Xferred:Db_Xferred+(SIZE(InData%InputTimes))-1 ) = PACK(InData%InputTimes,.TRUE.) + Db_Xferred = Db_Xferred + SIZE(InData%InputTimes) + END IF + END SUBROUTINE FAST_PackHydroDyn_Data + + SUBROUTINE FAST_UnPackHydroDyn_Data( 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(HydroDyn_Data), 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 + LOGICAL :: mask0 + LOGICAL, ALLOCATABLE :: mask1(:) + LOGICAL, ALLOCATABLE :: mask2(:,:) + LOGICAL, ALLOCATABLE :: mask3(:,:,:) + LOGICAL, ALLOCATABLE :: mask4(:,:,:,:) + LOGICAL, ALLOCATABLE :: mask5(:,:,:,:,:) + INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'FAST_UnPackHydroDyn_Data' + ! 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 + i1_l = LBOUND(OutData%x,1) + i1_u = UBOUND(OutData%x,1) + DO i1 = LBOUND(OutData%x,1), UBOUND(OutData%x,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 HydroDyn_UnpackContState( Re_Buf, Db_Buf, Int_Buf, OutData%x(i1), ErrStat2, ErrMsg2 ) ! x CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -29098,6 +30219,9 @@ SUBROUTINE FAST_CopyTurbineType( SrcTurbineTypeData, DstTurbineTypeData, CtrlCod CALL FAST_Copysubdyn_data( SrcTurbineTypeData%SD, DstTurbineTypeData%SD, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN + CALL FAST_Copysoildyn_data( SrcTurbineTypeData%SlD, DstTurbineTypeData%SlD, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN CALL FAST_Copymap_data( SrcTurbineTypeData%MAP, DstTurbineTypeData%MAP, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN @@ -29144,6 +30268,7 @@ SUBROUTINE FAST_DestroyTurbineType( TurbineTypeData, ErrStat, ErrMsg ) CALL FAST_Destroysupercontroller_data( TurbineTypeData%SC, ErrStat, ErrMsg ) CALL FAST_Destroyhydrodyn_data( TurbineTypeData%HD, ErrStat, ErrMsg ) CALL FAST_Destroysubdyn_data( TurbineTypeData%SD, ErrStat, ErrMsg ) + CALL FAST_Destroysoildyn_data( TurbineTypeData%SlD, ErrStat, ErrMsg ) CALL FAST_Destroymap_data( TurbineTypeData%MAP, ErrStat, ErrMsg ) CALL FAST_Destroyfeamooring_data( TurbineTypeData%FEAM, ErrStat, ErrMsg ) CALL FAST_Destroymoordyn_data( TurbineTypeData%MD, ErrStat, ErrMsg ) @@ -29428,6 +30553,23 @@ SUBROUTINE FAST_PackTurbineType( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er Int_BufSz = Int_BufSz + SIZE( Int_Buf ) DEALLOCATE(Int_Buf) END IF + Int_BufSz = Int_BufSz + 3 ! SlD: size of buffers for each call to pack subtype + CALL FAST_Packsoildyn_data( Re_Buf, Db_Buf, Int_Buf, InData%SlD, ErrStat2, ErrMsg2, .TRUE. ) ! SlD + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! SlD + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! SlD + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! SlD + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF Int_BufSz = Int_BufSz + 3 ! MAP: size of buffers for each call to pack subtype CALL FAST_Packmap_data( Re_Buf, Db_Buf, Int_Buf, InData%MAP, ErrStat2, ErrMsg2, .TRUE. ) ! MAP CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) @@ -29944,6 +31086,34 @@ SUBROUTINE FAST_PackTurbineType( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Er 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 + CALL FAST_Packsoildyn_data( Re_Buf, Db_Buf, Int_Buf, InData%SlD, ErrStat2, ErrMsg2, OnlySize ) ! SlD + 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 @@ -30757,6 +31927,46 @@ SUBROUTINE FAST_UnPackTurbineType( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, 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) + 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 FAST_Unpacksoildyn_data( Re_Buf, Db_Buf, Int_Buf, OutData%SlD, ErrStat2, ErrMsg2 ) ! SlD + 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) diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index dabf93921..5ce985fb1 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -228,6 +228,10 @@ subroutine SoilDyn_InitMeshes( InputFileData, InitInp, u, y, p, m, ErrStat, ErrM real(ReKi) :: Pos(3) real(ReKi), allocatable :: MeshLocations(:,:) +!FIXME: change u%SoilMotion to be a sibling of the passed in mesh. Not all points on passed in mesh will be used +! nNodes_C should match NumPoints read in +! step through to find all the points we are using and make sure they match something on the available reaction nodes. +! create mapping index of nodes (set order as needed) select case(p%CalcOption) case (Calc_StiffDamp) p%NumPoints = 1_IntKi diff --git a/modules/soildyn/src/SoilDyn_Registry.txt b/modules/soildyn/src/SoilDyn_Registry.txt index 65ea8fc2b..bd964af07 100644 --- a/modules/soildyn/src/SoilDyn_Registry.txt +++ b/modules/soildyn/src/SoilDyn_Registry.txt @@ -63,9 +63,11 @@ typedef ^ SlD_InputFile IntKi NumOuts - - - "N typedef ^ InitInputType CHARACTER(1024) InputFile - - - "Name of the input file" - typedef ^ InitInputType CHARACTER(1024) RootName - - - "Root name of the input file" - typedef ^ InitInputType LOGICAL Linearize - .FALSE. - "Flag that tells this module if the glue code wants to linearize." - -#FIXME: does the glue code need to inform us of the number of points? or do we do that in SoilDyn? -#typedef ^ InitInputType IntKi NumNodes - - - "Number of nodes we are using" - typedef ^ InitInputType ReKi WtrDepth - - - "Water depth to mudline (global coordinates)" '(m)' +#typedef ^ InitInputType ReKi SubRotateZ - - - "Substructure rotation angle, in case we change orientations" '(rad)' +typedef ^ InitInputType IntKi nNodes_R - - - "Number of nodes subdyn thinks are reaction nodes (from SubDyn nNodes_C)" - +typedef ^ InitInputType IntKi Nodes_R {:} - - "Nodes in input mesh that reaction force may be applied to (note: p%Nodes_C in SD has 2 dimensions in the old format, but only 1 in new)" '(-)' +typedef ^ InitInputType MeshType StructMesh - - - "Interior+Interface nodes outputs on a point mesh (from SD) -- only some are used!" '(-)' # Define outputs from the initialization routine here: typedef ^ InitOutputType CHARACTER(ChanLen) WriteOutputHdr {:} - - "Names of the output-to-file channels" - @@ -108,19 +110,20 @@ typedef ^ MiscVarType REDWINdllType dll_data # Define parameters here: # Time step for integration of continuous states (if a fixed-step integrator is used) and update of discrete states: typedef ^ ParameterType DbKi DT - - - "Time step for cont. state integration & disc. state update" seconds -#typedef ^ ParameterType CHARACTER(1024) DLL_InFile - - - "Name of input file used in DLL" - -typedef ^ ParameterType DLL_Type DLL_Trgt - - - "The addresses and names of the Bladed DLL and its procedure" - -typedef ^ ParameterType DbKi DLL_DT - - - "Time step for DLL" seconds -typedef ^ ParameterType CHARACTER(1024) RootName - - - "RootName for writing output files" - -typedef ^ ParameterType LOGICAL UseREDWINinterface - - - "True if interface successfully initialized" - -typedef ^ ParameterType CHARACTER(1024) RootFileName - - - "Root file name" - -typedef ^ ParameterType CHARACTER(1024) EchoFileName - - - "Name of echo file" - -typedef ^ ParameterType CHARACTER(1024) SumFileName - - - "Name of summary file" - -typedef ^ ParameterType IntKi DLL_model - - - "REDWIN DLL model type to use" - -typedef ^ ParameterType IntKi CalcOption - - - "Calculation methodology to use" - -typedef ^ ParameterType OutParmType OutParam {:} - - "Names and units (and other characteristics) of all requested output parameters" - -typedef ^ ParameterType IntKi NumOuts - - - "Number of parameters in the output list (number of outputs requested)" - -typedef ^ ParameterType IntKi NumPoints - - - "Number of points interfacing soil with" - +typedef ^ ParameterType DLL_Type DLL_Trgt - - - "The addresses and names of the Bladed DLL and its procedure" - +typedef ^ ParameterType DbKi DLL_DT - - - "Time step for DLL" seconds +typedef ^ ParameterType CHARACTER(1024) RootName - - - "RootName for writing output files" - +typedef ^ ParameterType LOGICAL UseREDWINinterface - - - "True if interface successfully initialized" - +typedef ^ ParameterType CHARACTER(1024) RootFileName - - - "Root file name" - +typedef ^ ParameterType CHARACTER(1024) EchoFileName - - - "Name of echo file" - +typedef ^ ParameterType CHARACTER(1024) SumFileName - - - "Name of summary file" - +typedef ^ ParameterType IntKi DLL_model - - - "REDWIN DLL model type to use" - +typedef ^ ParameterType IntKi CalcOption - - - "Calculation methodology to use" - +typedef ^ ParameterType OutParmType OutParam {:} - - "Names and units (and other characteristics) of all requested output parameters" - +typedef ^ ParameterType IntKi NumOuts - - - "Number of parameters in the output list (number of outputs requested)" - +typedef ^ ParameterType IntKi NumPoints - - - "Number of points interfacing soil with" - +typedef ^ ParameterType ReKi WtrDepth - - - "Water depth to mudline (global coordinates)" '(m)' +typedef ^ ParameterType IntKi Nodes_C {:}{:} - - "Nodes in input mesh that reaction force may be applied to" '(-)' # ..... Inputs .................................................................................................................... typedef ^ InputType MeshType SoilMotion - - - "Mesh of soil contact points" - diff --git a/modules/soildyn/src/SoilDyn_Types.f90 b/modules/soildyn/src/SoilDyn_Types.f90 index 8609c6cde..94a750001 100644 --- a/modules/soildyn/src/SoilDyn_Types.f90 +++ b/modules/soildyn/src/SoilDyn_Types.f90 @@ -81,6 +81,9 @@ MODULE SoilDyn_Types CHARACTER(1024) :: RootName !< Root name of the input file [-] LOGICAL :: Linearize = .FALSE. !< Flag that tells this module if the glue code wants to linearize. [-] REAL(ReKi) :: WtrDepth !< Water depth to mudline (global coordinates) ['(m)'] + INTEGER(IntKi) :: nNodes_R !< Number of nodes subdyn thinks are reaction nodes (from SubDyn nNodes_C) [-] + INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: Nodes_R !< Nodes in input mesh that reaction force may be applied to (note: p%Nodes_C in SD has 2 dimensions in the old format, but only 1 in new) ['(-)'] + TYPE(MeshType) :: StructMesh !< Interior+Interface nodes outputs on a point mesh (from SD) -- only some are used! ['(-)'] END TYPE SlD_InitInputType ! ======================= ! ========= SlD_InitOutputType ======= @@ -130,6 +133,8 @@ MODULE SoilDyn_Types TYPE(OutParmType) , DIMENSION(:), ALLOCATABLE :: OutParam !< Names and units (and other characteristics) of all requested output parameters [-] INTEGER(IntKi) :: NumOuts !< Number of parameters in the output list (number of outputs requested) [-] INTEGER(IntKi) :: NumPoints !< Number of points interfacing soil with [-] + REAL(ReKi) :: WtrDepth !< Water depth to mudline (global coordinates) ['(m)'] + INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: Nodes_C !< Nodes in input mesh that reaction force may be applied to ['(-)'] END TYPE SlD_ParameterType ! ======================= ! ========= SlD_InputType ======= @@ -1047,13 +1052,14 @@ SUBROUTINE SlD_UnPackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er END SUBROUTINE SlD_UnPackInputFile SUBROUTINE SlD_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, ErrStat, ErrMsg ) - TYPE(SlD_InitInputType), INTENT(IN) :: SrcInitInputData + TYPE(SlD_InitInputType), INTENT(INOUT) :: SrcInitInputData TYPE(SlD_InitInputType), INTENT(INOUT) :: DstInitInputData 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 = 'SlD_CopyInitInput' @@ -1064,6 +1070,22 @@ SUBROUTINE SlD_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, ErrS DstInitInputData%RootName = SrcInitInputData%RootName DstInitInputData%Linearize = SrcInitInputData%Linearize DstInitInputData%WtrDepth = SrcInitInputData%WtrDepth + DstInitInputData%nNodes_R = SrcInitInputData%nNodes_R +IF (ALLOCATED(SrcInitInputData%Nodes_R)) THEN + i1_l = LBOUND(SrcInitInputData%Nodes_R,1) + i1_u = UBOUND(SrcInitInputData%Nodes_R,1) + IF (.NOT. ALLOCATED(DstInitInputData%Nodes_R)) THEN + ALLOCATE(DstInitInputData%Nodes_R(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitInputData%Nodes_R.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInitInputData%Nodes_R = SrcInitInputData%Nodes_R +ENDIF + CALL MeshCopy( SrcInitInputData%StructMesh, DstInitInputData%StructMesh, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat>=AbortErrLev) RETURN END SUBROUTINE SlD_CopyInitInput SUBROUTINE SlD_DestroyInitInput( InitInputData, ErrStat, ErrMsg ) @@ -1075,6 +1097,10 @@ SUBROUTINE SlD_DestroyInitInput( InitInputData, ErrStat, ErrMsg ) ! ErrStat = ErrID_None ErrMsg = "" +IF (ALLOCATED(InitInputData%Nodes_R)) THEN + DEALLOCATE(InitInputData%Nodes_R) +ENDIF + CALL MeshDestroy( InitInputData%StructMesh, ErrStat, ErrMsg ) END SUBROUTINE SlD_DestroyInitInput SUBROUTINE SlD_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) @@ -1116,6 +1142,30 @@ SUBROUTINE SlD_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs Int_BufSz = Int_BufSz + 1*LEN(InData%RootName) ! RootName Int_BufSz = Int_BufSz + 1 ! Linearize Re_BufSz = Re_BufSz + 1 ! WtrDepth + Int_BufSz = Int_BufSz + 1 ! nNodes_R + Int_BufSz = Int_BufSz + 1 ! Nodes_R allocated yes/no + IF ( ALLOCATED(InData%Nodes_R) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! Nodes_R upper/lower bounds for each dimension + Int_BufSz = Int_BufSz + SIZE(InData%Nodes_R) ! Nodes_R + END IF + ! Allocate buffers for subtypes, if any (we'll get sizes from these) + Int_BufSz = Int_BufSz + 3 ! StructMesh: size of buffers for each call to pack subtype + CALL MeshPack( InData%StructMesh, Re_Buf, Db_Buf, Int_Buf, ErrStat2, ErrMsg2, .TRUE. ) ! StructMesh + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! StructMesh + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! StructMesh + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! StructMesh + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) THEN @@ -1155,6 +1205,49 @@ SUBROUTINE SlD_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs Int_Xferred = Int_Xferred + 1 ReKiBuf ( Re_Xferred:Re_Xferred+(1)-1 ) = InData%WtrDepth Re_Xferred = Re_Xferred + 1 + IntKiBuf ( Int_Xferred:Int_Xferred+(1)-1 ) = InData%nNodes_R + Int_Xferred = Int_Xferred + 1 + IF ( .NOT. ALLOCATED(InData%Nodes_R) ) 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%Nodes_R,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%Nodes_R,1) + Int_Xferred = Int_Xferred + 2 + + IF (SIZE(InData%Nodes_R)>0) IntKiBuf ( Int_Xferred:Int_Xferred+(SIZE(InData%Nodes_R))-1 ) = PACK(InData%Nodes_R,.TRUE.) + Int_Xferred = Int_Xferred + SIZE(InData%Nodes_R) + END IF + CALL MeshPack( InData%StructMesh, Re_Buf, Db_Buf, Int_Buf, ErrStat2, ErrMsg2, OnlySize ) ! StructMesh + 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 END SUBROUTINE SlD_PackInitInput SUBROUTINE SlD_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) @@ -1176,6 +1269,7 @@ SUBROUTINE SlD_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er LOGICAL, ALLOCATABLE :: mask3(:,:,:) LOGICAL, ALLOCATABLE :: mask4(:,:,:,:) LOGICAL, ALLOCATABLE :: mask5(:,:,:,:,:) + INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'SlD_UnPackInitInput' @@ -1201,6 +1295,71 @@ SUBROUTINE SlD_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er Int_Xferred = Int_Xferred + 1 OutData%WtrDepth = ReKiBuf( Re_Xferred ) Re_Xferred = Re_Xferred + 1 + OutData%nNodes_R = IntKiBuf( Int_Xferred ) + Int_Xferred = Int_Xferred + 1 + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! Nodes_R 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 (ALLOCATED(OutData%Nodes_R)) DEALLOCATE(OutData%Nodes_R) + ALLOCATE(OutData%Nodes_R(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%Nodes_R.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + ALLOCATE(mask1(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating mask1.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + mask1 = .TRUE. + IF (SIZE(OutData%Nodes_R)>0) OutData%Nodes_R = UNPACK( IntKiBuf ( Int_Xferred:Int_Xferred+(SIZE(OutData%Nodes_R))-1 ), mask1, 0_IntKi ) + Int_Xferred = Int_Xferred + SIZE(OutData%Nodes_R) + DEALLOCATE(mask1) + END IF + 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 MeshUnpack( OutData%StructMesh, Re_Buf, Db_Buf, Int_Buf, ErrStat2, ErrMsg2 ) ! StructMesh + 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) END SUBROUTINE SlD_UnPackInitInput SUBROUTINE SlD_CopyInitOutput( SrcInitOutputData, DstInitOutputData, CtrlCode, ErrStat, ErrMsg ) @@ -2351,6 +2510,7 @@ SUBROUTINE SlD_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg ! Local INTEGER(IntKi) :: i,j,k INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 + INTEGER(IntKi) :: i2, i2_l, i2_u ! bounds (upper/lower) for an array dimension 2 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'SlD_CopyParam' @@ -2385,6 +2545,21 @@ SUBROUTINE SlD_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg ENDIF DstParamData%NumOuts = SrcParamData%NumOuts DstParamData%NumPoints = SrcParamData%NumPoints + DstParamData%WtrDepth = SrcParamData%WtrDepth +IF (ALLOCATED(SrcParamData%Nodes_C)) THEN + i1_l = LBOUND(SrcParamData%Nodes_C,1) + i1_u = UBOUND(SrcParamData%Nodes_C,1) + i2_l = LBOUND(SrcParamData%Nodes_C,2) + i2_u = UBOUND(SrcParamData%Nodes_C,2) + IF (.NOT. ALLOCATED(DstParamData%Nodes_C)) THEN + ALLOCATE(DstParamData%Nodes_C(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%Nodes_C.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstParamData%Nodes_C = SrcParamData%Nodes_C +ENDIF END SUBROUTINE SlD_CopyParam SUBROUTINE SlD_DestroyParam( ParamData, ErrStat, ErrMsg ) @@ -2402,6 +2577,9 @@ SUBROUTINE SlD_DestroyParam( ParamData, ErrStat, ErrMsg ) CALL NWTC_Library_Destroyoutparmtype( ParamData%OutParam(i1), ErrStat, ErrMsg ) ENDDO DEALLOCATE(ParamData%OutParam) +ENDIF +IF (ALLOCATED(ParamData%Nodes_C)) THEN + DEALLOCATE(ParamData%Nodes_C) ENDIF END SUBROUTINE SlD_DestroyParam @@ -2492,6 +2670,12 @@ SUBROUTINE SlD_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, S END IF Int_BufSz = Int_BufSz + 1 ! NumOuts Int_BufSz = Int_BufSz + 1 ! NumPoints + Re_BufSz = Re_BufSz + 1 ! WtrDepth + Int_BufSz = Int_BufSz + 1 ! Nodes_C allocated yes/no + IF ( ALLOCATED(InData%Nodes_C) ) THEN + Int_BufSz = Int_BufSz + 2*2 ! Nodes_C upper/lower bounds for each dimension + Int_BufSz = Int_BufSz + SIZE(InData%Nodes_C) ! Nodes_C + END IF IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) THEN @@ -2618,6 +2802,24 @@ SUBROUTINE SlD_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, S Int_Xferred = Int_Xferred + 1 IntKiBuf ( Int_Xferred:Int_Xferred+(1)-1 ) = InData%NumPoints Int_Xferred = Int_Xferred + 1 + ReKiBuf ( Re_Xferred:Re_Xferred+(1)-1 ) = InData%WtrDepth + Re_Xferred = Re_Xferred + 1 + IF ( .NOT. ALLOCATED(InData%Nodes_C) ) 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%Nodes_C,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%Nodes_C,1) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%Nodes_C,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%Nodes_C,2) + Int_Xferred = Int_Xferred + 2 + + IF (SIZE(InData%Nodes_C)>0) IntKiBuf ( Int_Xferred:Int_Xferred+(SIZE(InData%Nodes_C))-1 ) = PACK(InData%Nodes_C,.TRUE.) + Int_Xferred = Int_Xferred + SIZE(InData%Nodes_C) + END IF END SUBROUTINE SlD_PackParam SUBROUTINE SlD_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) @@ -2640,6 +2842,7 @@ SUBROUTINE SlD_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg LOGICAL, ALLOCATABLE :: mask4(:,:,:,:) LOGICAL, ALLOCATABLE :: mask5(:,:,:,:,:) INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 + INTEGER(IntKi) :: i2, i2_l, i2_u ! bounds (upper/lower) for an array dimension 2 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'SlD_UnPackParam' @@ -2779,6 +2982,34 @@ SUBROUTINE SlD_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg Int_Xferred = Int_Xferred + 1 OutData%NumPoints = IntKiBuf( Int_Xferred ) Int_Xferred = Int_Xferred + 1 + OutData%WtrDepth = ReKiBuf( Re_Xferred ) + Re_Xferred = Re_Xferred + 1 + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! Nodes_C 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 + i2_l = IntKiBuf( Int_Xferred ) + i2_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ALLOCATED(OutData%Nodes_C)) DEALLOCATE(OutData%Nodes_C) + ALLOCATE(OutData%Nodes_C(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%Nodes_C.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + ALLOCATE(mask2(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating mask2.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + mask2 = .TRUE. + IF (SIZE(OutData%Nodes_C)>0) OutData%Nodes_C = UNPACK( IntKiBuf ( Int_Xferred:Int_Xferred+(SIZE(OutData%Nodes_C))-1 ), mask2, 0_IntKi ) + Int_Xferred = Int_Xferred + SIZE(OutData%Nodes_C) + DEALLOCATE(mask2) + END IF END SUBROUTINE SlD_UnPackParam SUBROUTINE SlD_CopyInput( SrcInputData, DstInputData, CtrlCode, ErrStat, ErrMsg ) From c4b8a63133f45ac3b33dc3affa0c5a7127c59c21 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 25 Mar 2020 11:00:20 -0600 Subject: [PATCH 056/136] SlD: renaming of routines to match OpenFAST glue-code better --- modules/soildyn/src/SoilDyn.f90 | 84 +++++++++---------- modules/soildyn/src/SoilDyn_IO.f90 | 26 +++--- modules/soildyn/src/SoilDyn_Registry.txt | 4 +- modules/soildyn/src/SoilDyn_Types.f90 | 17 ++-- modules/soildyn/src/driver/SoilDyn_Driver.f90 | 10 +-- 5 files changed, 74 insertions(+), 67 deletions(-) diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index 5ce985fb1..247182812 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -42,23 +42,23 @@ MODULE SoilDyn PRIVATE - TYPE(ProgDesc), PARAMETER :: SoilDyn_Ver = ProgDesc( 'SoilDyn', 'v0.01.00', '99-Feb-2020' ) !< module date/version information + TYPE(ProgDesc), PARAMETER :: SlD_Ver = ProgDesc( 'SoilDyn', 'v0.01.00', '99-Feb-2020' ) !< module date/version information ! ..... Public Subroutines ................................................................................................... - PUBLIC :: SoilDyn_Init ! Initialization routine - PUBLIC :: SoilDyn_End ! Ending routine (includes clean up) - PUBLIC :: SoilDyn_UpdateStates ! Loose coupling routine for solving for constraint states, integrating - PUBLIC :: SoilDyn_CalcOutput ! Routine for computing outputs + PUBLIC :: SlD_Init ! Initialization routine + PUBLIC :: SlD_End ! Ending routine (includes clean up) + PUBLIC :: SlD_UpdateStates ! Loose coupling routine for solving for constraint states, integrating + PUBLIC :: SlD_CalcOutput ! Routine for computing outputs !NOTE: these are placeholders for now. -!!! PUBLIC :: SoilDyn_CalcConstrStateResidual ! Tight coupling routine for returning the constraint state residual -!!! PUBLIC :: SoilDyn_CalcContStateDeriv ! Tight coupling routine for computing derivatives of continuous states -!!! PUBLIC :: SoilDyn_UpdateDiscState ! Tight coupling routine for updating discrete states -!!! PUBLIC :: SoilDyn_JacobianPInput ! Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions all with respect to the inputs (u) -!!! PUBLIC :: SoilDyn_JacobianPContState ! Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions all with respect to the continuous states (x) -!!! PUBLIC :: SoilDyn_JacobianPDiscState ! Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions all with respect to the discrete states (xd) -!!! PUBLIC :: SoilDyn_JacobianPConstrState ! Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions all with respect to the constraint states (z) -!!! PUBLIC :: SoilDyn_GetOP ! Routine to get the operating-point values for linearization (from data structures to arrays) +!!! PUBLIC :: SlD_CalcConstrStateResidual ! Tight coupling routine for returning the constraint state residual +!!! PUBLIC :: SlD_CalcContStateDeriv ! Tight coupling routine for computing derivatives of continuous states +!!! PUBLIC :: SlD_UpdateDiscState ! Tight coupling routine for updating discrete states +!!! PUBLIC :: SlD_JacobianPInput ! Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions all with respect to the inputs (u) +!!! PUBLIC :: SlD_JacobianPContState ! Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions all with respect to the continuous states (x) +!!! PUBLIC :: SlD_JacobianPDiscState ! Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions all with respect to the discrete states (xd) +!!! PUBLIC :: SlD_JacobianPConstrState ! Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions all with respect to the constraint states (z) +!!! PUBLIC :: SlD_GetOP ! Routine to get the operating-point values for linearization (from data structures to arrays) contains @@ -66,7 +66,7 @@ MODULE SoilDyn !> This routine is called at the start of the simulation to perform initialization steps. !! The parameters are set here and not changed during the simulation. !! The initial states and initial guess for the input are defined. -subroutine SoilDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOut, ErrStat, ErrMsg ) +subroutine SlD_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOut, ErrStat, ErrMsg ) type(SlD_InitInputType), intent(in ) :: InitInp !< Input data for initialization routine type(SlD_InputType), intent( out) :: u !< An initial guess for the input; input mesh must be defined @@ -86,7 +86,7 @@ subroutine SoilDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In integer(IntKi) :: j !< generic counter integer(IntKi) :: ErrStat2 !< local error status character(ErrMsgLen) :: ErrMsg2 !< local error message - character(*), parameter :: RoutineName = 'SoilDyn_Init' + character(*), parameter :: RoutineName = 'SlD_Init' type(SlD_InputFile) :: InputFileData !< Data stored in the module's input file character(1024) :: EchoFileName @@ -98,7 +98,7 @@ subroutine SoilDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In call NWTC_Init( ) ! Display the module information - call DispNVD( SoilDyn_Ver ) + call DispNVD( SlD_Ver ) ! Set some names call GetRoot( InitInp%InputFile, p%RootFileName ) @@ -106,7 +106,7 @@ subroutine SoilDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In p%SumFileName = TRIM(p%RootFileName)//"SlD.sum" - call SoilDyn_ReadInput( InitInp%InputFile, p%EchoFileName, InputFileData, ErrStat2, ErrMsg2 ); if (Failed()) return; + call SlD_ReadInput( InitInp%InputFile, p%EchoFileName, InputFileData, ErrStat2, ErrMsg2 ); if (Failed()) return; ! Define parameters here: p%DT = Interval @@ -137,10 +137,10 @@ subroutine SoilDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In end if ! Set miscvars: including dll_data arrays and checking for input files. - call SoilDyn_InitMisc( InputFileData, m, ErrStat2,ErrMsg2); if (Failed()) return; + call SlD_InitMisc( InputFileData, m, ErrStat2,ErrMsg2); if (Failed()) return; - call SoilDyn_InitMeshes( InputFileData, InitInp, u, y, p, m, ErrStat2,ErrMsg2); if (Failed()) return; + call SlD_InitMeshes( InputFileData, InitInp, u, y, p, m, ErrStat2,ErrMsg2); if (Failed()) return; !FIXME: wrap logic around this for option 3 only. @@ -152,7 +152,7 @@ subroutine SoilDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In ! set paramaters for I/O data - InitOut%Ver = SoilDyn_Ver + InitOut%Ver = SlD_Ver p%NumOuts = InputFileData%NumOuts call AllocAry( InitOut%WriteOutputHdr, p%NumOuts, 'WriteOutputHdr', errStat2, errMsg2 ); if (Failed()) return; call AllocAry( InitOut%WriteOutputUnt, p%NumOuts, 'WriteOutputUnt', errStat2, errMsg2 ); if (Failed()) return; @@ -173,7 +173,7 @@ end function Failed !> Allocate arrays for storing the DLL input file names, and check that they exist. The DLL has no error checking (as of 2020.02.10) !! and will create empty input files before segfaulting. - subroutine SoilDyn_InitMisc( InputFileData, m, ErrStat, ErrMsg ) + subroutine SlD_InitMisc( InputFileData, m, ErrStat, ErrMsg ) type(SlD_InputFile), intent(in ) :: InputFileData !< Data stored in the module's input file type(SlD_MiscVarType), intent(inout) :: m !< Misc variables for optimization (not copied in glue code) integer(IntKi), intent( out) :: ErrStat @@ -209,9 +209,9 @@ subroutine SoilDyn_InitMisc( InputFileData, m, ErrStat, ErrMsg ) endif enddo if (ErrStat >= AbortErrLev) return - end subroutine SoilDyn_InitMisc + end subroutine SlD_InitMisc - subroutine SoilDyn_InitMeshes( InputFileData, InitInp, u, y, p, m, ErrStat, ErrMsg ) + subroutine SlD_InitMeshes( InputFileData, InitInp, u, y, p, m, ErrStat, ErrMsg ) type(SlD_InputFile), intent(in ) :: InputFileData !< Data stored in the module's input file type(SlD_InitInputType), intent(in ) :: InitInp !< Input data for initialization routine type(SlD_InputType), intent(inout) :: u !< An initial guess for the input; input mesh must be defined @@ -315,13 +315,13 @@ subroutine SoilDyn_InitMeshes( InputFileData, InitInp, u, y, p, m, ErrStat, ErrM - end subroutine SoilDyn_InitMeshes -end subroutine SoilDyn_Init + end subroutine SlD_InitMeshes +end subroutine SlD_Init !---------------------------------------------------------------------------------------------------------------------------------- !> This routine is called at the end of the simulation. -subroutine SoilDyn_End( u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) +subroutine SlD_End( u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) type(SlD_InputType), intent(inout) :: u !< System inputs type(SlD_ParameterType), intent(inout) :: p !< Parameters @@ -337,7 +337,7 @@ subroutine SoilDyn_End( u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) ! local variables integer(IntKi) :: ErrStat2 ! local error status character(ErrMsgLen) :: ErrMsg2 ! local error message - character(*), parameter :: RoutineName = 'SoilDyn_End' + character(*), parameter :: RoutineName = 'SlD_End' ! Initialize ErrStat ErrStat = ErrID_None @@ -368,13 +368,13 @@ subroutine SoilDyn_End( u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) !! Destroy the misc data: call SlD_DestroyMisc( m, ErrStat2,ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) -end subroutine SoilDyn_End +end subroutine SlD_End !---------------------------------------------------------------------------------------------------------------------------------- !> This is a loose coupling routine for solving constraint states, integrating continuous states, and updating discrete and other !! states. Continuous, constraint, discrete, and other states are updated to values at t + Interval. -subroutine SoilDyn_UpdateStates( t, n, Inputs, InputTimes, p, x, xd, z, OtherState, m, ErrStat, ErrMsg ) +subroutine SlD_UpdateStates( t, n, Inputs, InputTimes, p, x, xd, z, OtherState, m, ErrStat, ErrMsg ) real(DbKi), intent(in ) :: t !< Current simulation time in seconds integer(IntKi), intent(in ) :: n !< Current step of the simulation: t = n*Interval type(SlD_InputType), intent(inout) :: Inputs(:) !< Inputs at InputTimes (output from this routine only @@ -400,7 +400,7 @@ subroutine SoilDyn_UpdateStates( t, n, Inputs, InputTimes, p, x, xd, z, OtherSta type(SlD_InputType) :: u ! Instantaneous inputs integer(IntKi) :: ErrStat2 ! local error status character(ErrMsgLen) :: ErrMsg2 ! local error message - character(*), parameter :: RoutineName = 'SoilDyn_UpdateStates' + character(*), parameter :: RoutineName = 'SlD_UpdateStates' ! Initialize variables ErrStat = ErrID_None ! no error has occurred @@ -436,12 +436,12 @@ subroutine cleanup() call SlD_DestroyContState( dxdt, ErrStat2, ErrMsg2) call SlD_DestroyDiscState( xd_t, ErrStat2, ErrMsg2) end subroutine cleanup -end subroutine SoilDyn_UpdateStates +end subroutine SlD_UpdateStates !---------------------------------------------------------------------------------------------------------------------------------- !> This is a routine for computing outputs, used in both loose and tight coupling. -subroutine SoilDyn_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) +subroutine SlD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) real(DbKi), intent(in ) :: t !< Current simulation time in seconds type(SlD_InputType), intent(in ) :: u !< Inputs at t @@ -458,7 +458,7 @@ subroutine SoilDyn_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, Err integer(IntKi) :: ErrStat2 ! local error status character(ErrMsgLen) :: ErrMsg2 ! local error message - character(*), parameter :: RoutineName = 'SoilDyn_CalcOutput' + character(*), parameter :: RoutineName = 'SlD_CalcOutput' real(ReKi) :: AllOuts(0:MaxOutPts) real(R8Ki) :: Displacement(6) @@ -496,7 +496,7 @@ logical function Failed() call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) Failed = ErrStat >= AbortErrLev end function Failed -end subroutine SoilDyn_CalcOutput +end subroutine SlD_CalcOutput END MODULE SoilDyn @@ -504,11 +504,11 @@ END MODULE SoilDyn !********************************************************************************************************************************** !NOTE: the following have been omitted. When we add the other methods for calculating (6x6 Stiffness/Damping) and the P-Y curve, then ! some of these will need to be added. Leaving this as a placeholder for the moment. -!SUBROUTINE SoilDyn_CalcContStateDeriv( t, u, p, x, xd, z, OtherState, m, dxdt, ErrStat, ErrMsg ) -!SUBROUTINE SoilDyn_UpdateDiscState( t, n, u, p, x, xd, z, OtherState, m, ErrStat, ErrMsg ) -!SUBROUTINE SoilDyn_CalcConstrStateResidual( t, u, p, x, xd, z, OtherState, m, Z_residual, ErrStat, ErrMsg ) -!SUBROUTINE SoilDyn_JacobianPInput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdu, dXdu, dXddu, dZdu) -!SUBROUTINE SoilDyn_JacobianPContState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdx, dXdx, dXddx, dZdx ) -!SUBROUTINE SoilDyn_JacobianPDiscState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdxd, dXdxd, dXddxd, dZdxd ) -!SUBROUTINE SoilDyn_JacobianPConstrState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdz, dXdz, dXddz, dZdz ) -!SUBROUTINE SoilDyn_GetOP( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, u_op, y_op, x_op, dx_op, xd_op, z_op ) +!SUBROUTINE SlD_CalcContStateDeriv( t, u, p, x, xd, z, OtherState, m, dxdt, ErrStat, ErrMsg ) +!SUBROUTINE SlD_UpdateDiscState( t, n, u, p, x, xd, z, OtherState, m, ErrStat, ErrMsg ) +!SUBROUTINE SlD_CalcConstrStateResidual( t, u, p, x, xd, z, OtherState, m, Z_residual, ErrStat, ErrMsg ) +!SUBROUTINE SlD_JacobianPInput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdu, dXdu, dXddu, dZdu) +!SUBROUTINE SlD_JacobianPContState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdx, dXdx, dXddx, dZdx ) +!SUBROUTINE SlD_JacobianPDiscState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdxd, dXdxd, dXddxd, dZdxd ) +!SUBROUTINE SlD_JacobianPConstrState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdz, dXdz, dXddz, dZdz ) +!SUBROUTINE SlD_GetOP( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, u_op, y_op, x_op, dx_op, xd_op, z_op ) diff --git a/modules/soildyn/src/SoilDyn_IO.f90 b/modules/soildyn/src/SoilDyn_IO.f90 index 4e5c4e657..201db02f7 100644 --- a/modules/soildyn/src/SoilDyn_IO.f90 +++ b/modules/soildyn/src/SoilDyn_IO.f90 @@ -202,7 +202,7 @@ MODULE SoilDyn_IO !==================================================================================================== !> This public subroutine reads the input required for SoilDyn from the file whose name is an !! input parameter. -subroutine SoilDyn_ReadInput( InputFileName, EchoFileName, InputFileData, ErrStat, ErrMsg ) +subroutine SlD_ReadInput( InputFileName, EchoFileName, InputFileData, ErrStat, ErrMsg ) character(*), intent(in ) :: InputFileName !< name of the input file character(*), intent(in ) :: EchoFileName !< name of the echo file @@ -223,7 +223,7 @@ subroutine SoilDyn_ReadInput( InputFileName, EchoFileName, InputFileData, ErrSta integer(IntKi) :: IOS !< Temporary error status character(ErrMsgLen) :: TmpErrMsg !< Temporary error message character(1024) :: PriPath !< Path name of the primary file - character(*), PARAMETER :: RoutineName="SoilDyn_ReadInput" + character(*), PARAMETER :: RoutineName="SlD_ReadInput" ! Initialize local data @@ -439,7 +439,7 @@ subroutine Cleanup() end if end subroutine Cleanup -END SUBROUTINE SoilDyn_ReadInput +END SUBROUTINE SlD_ReadInput !==================================================================================================== @@ -453,7 +453,7 @@ END SUBROUTINE SoilDyn_ReadInput ! The reason for structuring it this way is to allow for relocating the validation routines for the ! wind type into their respective modules. It might also prove useful later if we change languages ! but retain the fortran wind modules. -SUBROUTINE SoilDyn_ValidateInput( InitInp, InputFileData, ErrStat, ErrMsg ) +SUBROUTINE SlD_ValidateInput( InitInp, InputFileData, ErrStat, ErrMsg ) TYPE(SlD_InitInputType), INTENT(IN ) :: InitInp !< Input data for initialization TYPE(SlD_InputFile), INTENT(INOUT) :: InputFileData !< The data for initialization INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status from this subroutine @@ -461,7 +461,7 @@ SUBROUTINE SoilDyn_ValidateInput( InitInp, InputFileData, ErrStat, ErrMsg ) INTEGER(IntKi) :: TmpErrStat !< Temporary error status for subroutine and function calls CHARACTER(ErrMsgLen) :: TmpErrMsg !< Temporary error message for subroutine and function calls INTEGER(IntKi) :: I !< Generic counter - CHARACTER(*), PARAMETER :: RoutineName="SoilDyn_ValidateInput" + CHARACTER(*), PARAMETER :: RoutineName="SlD_ValidateInput" ! Initialize ErrStat ErrStat = ErrID_None @@ -481,12 +481,12 @@ subroutine ValidateDLL() ! Placeholder end subroutine ValidateDLL -END SUBROUTINE SoilDyn_ValidateInput +END SUBROUTINE SlD_ValidateInput !==================================================================================================== !> This private subroutine copies the info from the input file over to the parameters for SoilDyn. -SUBROUTINE SoilDyn_SetParameters( InitInp, InputFileData, p, m, ErrStat, ErrMsg ) +SUBROUTINE SlD_SetParameters( InitInp, InputFileData, p, m, ErrStat, ErrMsg ) TYPE(Sld_InitInputType), INTENT(IN ) :: InitInp !< Input data for initialization TYPE(Sld_InputFile), INTENT(INOUT) :: InputFileData !< The data for initialization TYPE(Sld_ParameterType), INTENT(INOUT) :: p !< The parameters for SoilDyn @@ -496,13 +496,13 @@ SUBROUTINE SoilDyn_SetParameters( InitInp, InputFileData, p, m, ErrStat, ErrMsg INTEGER(IntKi) :: TmpErrStat !< Temporary error status for subroutine and function calls CHARACTER(ErrMsgLen) :: TmpErrMsg !< Temporary error message for subroutine and function calls INTEGER(IntKi) :: I !< Generic counter - CHARACTER(*), PARAMETER :: RoutineName="SoilDyn_SetParameters" + CHARACTER(*), PARAMETER :: RoutineName="SlD_SetParameters" ! Initialize ErrStat ErrStat = ErrID_None ErrMsg = "" -END SUBROUTINE SoilDyn_SetParameters +END SUBROUTINE SlD_SetParameters @@ -701,7 +701,7 @@ END SUBROUTINE SetOutParam !==================================================================================================== -SUBROUTINE SoilDyn_OpenSumFile( SumFileUnit, SummaryName, IfW_Prog, WindType, ErrStat, ErrMsg ) +SUBROUTINE SlD_OpenSumFile( SumFileUnit, SummaryName, IfW_Prog, WindType, ErrStat, ErrMsg ) INTEGER(IntKi), INTENT( OUT) :: SumFileUnit !< the unit number for the SoilDynsummary file CHARACTER(*), INTENT(IN ) :: SummaryName !< the name of the SoilDyn summary file TYPE(ProgDesc), INTENT(IN ) :: IfW_Prog !< the name/version/date of the SoilDyn program @@ -727,9 +727,9 @@ SUBROUTINE SoilDyn_OpenSumFile( SumFileUnit, SummaryName, IfW_Prog, WindType, Er CALL SetErrStat(ErrID_Fatal,'Error writing to summary file.',ErrStat,ErrMsg,'') RETURN END IF -END SUBROUTINE SoilDyn_OpenSumFile +END SUBROUTINE SlD_OpenSumFile !==================================================================================================== -SUBROUTINE SoilDyn_CloseSumFile( SumFileUnit, ErrStat, ErrMsg ) +SUBROUTINE SlD_CloseSumFile( SumFileUnit, ErrStat, ErrMsg ) INTEGER(IntKi), INTENT(INOUT) :: SumFileUnit !< the unit number for the SoilDynsummary file INTEGER(IntKi), INTENT( OUT) :: ErrStat !< returns a non-zero value when an error occurs CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None @@ -751,7 +751,7 @@ SUBROUTINE SoilDyn_CloseSumFile( SumFileUnit, ErrStat, ErrMsg ) CLOSE( SumFileUnit, IOSTAT=TmpErrStat ) IF (TmpErrStat /= 0_IntKi) CALL SetErrStat( ErrID_Fatal, 'Problem closing the SoilDyn summary file.', ErrStat, ErrMsg, '' ) END IF -END SUBROUTINE SoilDyn_CloseSumFile +END SUBROUTINE SlD_CloseSumFile !==================================================================================================== !> Set the output channels diff --git a/modules/soildyn/src/SoilDyn_Registry.txt b/modules/soildyn/src/SoilDyn_Registry.txt index bd964af07..007fb3daa 100644 --- a/modules/soildyn/src/SoilDyn_Registry.txt +++ b/modules/soildyn/src/SoilDyn_Registry.txt @@ -63,8 +63,8 @@ typedef ^ SlD_InputFile IntKi NumOuts - - - "N typedef ^ InitInputType CHARACTER(1024) InputFile - - - "Name of the input file" - typedef ^ InitInputType CHARACTER(1024) RootName - - - "Root name of the input file" - typedef ^ InitInputType LOGICAL Linearize - .FALSE. - "Flag that tells this module if the glue code wants to linearize." - -typedef ^ InitInputType ReKi WtrDepth - - - "Water depth to mudline (global coordinates)" '(m)' -#typedef ^ InitInputType ReKi SubRotateZ - - - "Substructure rotation angle, in case we change orientations" '(rad)' +typedef ^ InitInputType ReKi WtrDpth - - - "Water depth to mudline (global coordinates)" '(m)' +typedef ^ InitInputType ReKi SubRotateZ - - - "Substructure rotation angle, in case we change orientations" '(rad)' typedef ^ InitInputType IntKi nNodes_R - - - "Number of nodes subdyn thinks are reaction nodes (from SubDyn nNodes_C)" - typedef ^ InitInputType IntKi Nodes_R {:} - - "Nodes in input mesh that reaction force may be applied to (note: p%Nodes_C in SD has 2 dimensions in the old format, but only 1 in new)" '(-)' typedef ^ InitInputType MeshType StructMesh - - - "Interior+Interface nodes outputs on a point mesh (from SD) -- only some are used!" '(-)' diff --git a/modules/soildyn/src/SoilDyn_Types.f90 b/modules/soildyn/src/SoilDyn_Types.f90 index 94a750001..1738078d7 100644 --- a/modules/soildyn/src/SoilDyn_Types.f90 +++ b/modules/soildyn/src/SoilDyn_Types.f90 @@ -80,7 +80,8 @@ MODULE SoilDyn_Types CHARACTER(1024) :: InputFile !< Name of the input file [-] CHARACTER(1024) :: RootName !< Root name of the input file [-] LOGICAL :: Linearize = .FALSE. !< Flag that tells this module if the glue code wants to linearize. [-] - REAL(ReKi) :: WtrDepth !< Water depth to mudline (global coordinates) ['(m)'] + REAL(ReKi) :: WtrDpth !< Water depth to mudline (global coordinates) ['(m)'] + REAL(ReKi) :: SubRotateZ !< Substructure rotation angle, in case we change orientations ['(rad)'] INTEGER(IntKi) :: nNodes_R !< Number of nodes subdyn thinks are reaction nodes (from SubDyn nNodes_C) [-] INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: Nodes_R !< Nodes in input mesh that reaction force may be applied to (note: p%Nodes_C in SD has 2 dimensions in the old format, but only 1 in new) ['(-)'] TYPE(MeshType) :: StructMesh !< Interior+Interface nodes outputs on a point mesh (from SD) -- only some are used! ['(-)'] @@ -1069,7 +1070,8 @@ SUBROUTINE SlD_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, ErrS DstInitInputData%InputFile = SrcInitInputData%InputFile DstInitInputData%RootName = SrcInitInputData%RootName DstInitInputData%Linearize = SrcInitInputData%Linearize - DstInitInputData%WtrDepth = SrcInitInputData%WtrDepth + DstInitInputData%WtrDpth = SrcInitInputData%WtrDpth + DstInitInputData%SubRotateZ = SrcInitInputData%SubRotateZ DstInitInputData%nNodes_R = SrcInitInputData%nNodes_R IF (ALLOCATED(SrcInitInputData%Nodes_R)) THEN i1_l = LBOUND(SrcInitInputData%Nodes_R,1) @@ -1141,7 +1143,8 @@ SUBROUTINE SlD_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs Int_BufSz = Int_BufSz + 1*LEN(InData%InputFile) ! InputFile Int_BufSz = Int_BufSz + 1*LEN(InData%RootName) ! RootName Int_BufSz = Int_BufSz + 1 ! Linearize - Re_BufSz = Re_BufSz + 1 ! WtrDepth + Re_BufSz = Re_BufSz + 1 ! WtrDpth + Re_BufSz = Re_BufSz + 1 ! SubRotateZ Int_BufSz = Int_BufSz + 1 ! nNodes_R Int_BufSz = Int_BufSz + 1 ! Nodes_R allocated yes/no IF ( ALLOCATED(InData%Nodes_R) ) THEN @@ -1203,7 +1206,9 @@ SUBROUTINE SlD_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs END DO ! I IntKiBuf ( Int_Xferred:Int_Xferred+1-1 ) = TRANSFER( InData%Linearize , IntKiBuf(1), 1) Int_Xferred = Int_Xferred + 1 - ReKiBuf ( Re_Xferred:Re_Xferred+(1)-1 ) = InData%WtrDepth + ReKiBuf ( Re_Xferred:Re_Xferred+(1)-1 ) = InData%WtrDpth + Re_Xferred = Re_Xferred + 1 + ReKiBuf ( Re_Xferred:Re_Xferred+(1)-1 ) = InData%SubRotateZ Re_Xferred = Re_Xferred + 1 IntKiBuf ( Int_Xferred:Int_Xferred+(1)-1 ) = InData%nNodes_R Int_Xferred = Int_Xferred + 1 @@ -1293,7 +1298,9 @@ SUBROUTINE SlD_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er END DO ! I OutData%Linearize = TRANSFER( IntKiBuf( Int_Xferred ), mask0 ) Int_Xferred = Int_Xferred + 1 - OutData%WtrDepth = ReKiBuf( Re_Xferred ) + OutData%WtrDpth = ReKiBuf( Re_Xferred ) + Re_Xferred = Re_Xferred + 1 + OutData%SubRotateZ = ReKiBuf( Re_Xferred ) Re_Xferred = Re_Xferred + 1 OutData%nNodes_R = IntKiBuf( Int_Xferred ) Int_Xferred = Int_Xferred + 1 diff --git a/modules/soildyn/src/driver/SoilDyn_Driver.f90 b/modules/soildyn/src/driver/SoilDyn_Driver.f90 index 3e1c6b42d..68d09ed8d 100644 --- a/modules/soildyn/src/driver/SoilDyn_Driver.f90 +++ b/modules/soildyn/src/driver/SoilDyn_Driver.f90 @@ -30,7 +30,7 @@ PROGRAM SoilDyn_Driver IMPLICIT NONE - TYPE( ProgDesc ), PARAMETER :: ProgInfo = ProgDesc("SoilDyn_Driver","","") + TYPE( ProgDesc ), PARAMETER :: ProgInfo = ProgDesc("SlD_Driver","","") INTEGER(IntKi) :: SlDDriver_Verbose = 5 ! Verbose level. 0 = none, 5 = some, 10 = lots @@ -263,7 +263,7 @@ PROGRAM SoilDyn_Driver InitInData%InputFile = Settings%SldIptFileName ! Initialize the module - CALL SoilDyn_Init( InitInData, u(1), p, x, xd, z, OtherState, y, misc, TimeInterval, InitOutData, ErrStat, ErrMsg ) + CALL SlD_Init( InitInData, u(1), p, x, xd, z, OtherState, y, misc, TimeInterval, InitOutData, ErrStat, ErrMsg ) IF ( ErrStat /= ErrID_None ) THEN ! Check if there was an error and do something about it if necessary CALL WrScr( 'After Init: '//ErrMsg ) if ( ErrStat >= AbortErrLev ) call ProgEnd() @@ -320,12 +320,12 @@ PROGRAM SoilDyn_Driver endif ! Calculate outputs at n - CALL SoilDyn_CalcOutput( Time, u(1), p, x, xd, z, OtherState, y, misc, ErrStat, ErrMsg ); + CALL SlD_CalcOutput( Time, u(1), p, x, xd, z, OtherState, y, misc, ErrStat, ErrMsg ); call CheckErr('After CalcOutput: '); ! There are no states to update in SoilDyn, but for completeness we add this. ! Get state variables at next step: INPUT at step n, OUTPUT at step n + 1 - CALL SoilDyn_UpdateStates( Time, n, u, InputTime, p, x, xd, z, OtherState, misc, ErrStat, ErrMsg ); + CALL SlD_UpdateStates( Time, n, u, InputTime, p, x, xd, z, OtherState, misc, ErrStat, ErrMsg ); call CheckErr(''); !call Dvr_WriteOutputLine(Time,DvrOut,p%OutFmt,y) @@ -356,7 +356,7 @@ PROGRAM SoilDyn_Driver ! Routine to terminate program execution !............................................................................................................................... if (DvrOut>0) close(DvrOut) - CALL SoilDyn_End( u(1), p, x, xd, z, OtherState, y, misc, ErrStat, ErrMsg ) + CALL SlD_End( u(1), p, x, xd, z, OtherState, y, misc, ErrStat, ErrMsg ) IF ( ErrStat /= ErrID_None ) THEN CALL WrScr( 'After End: '//ErrMsg ) From 13dd7d5c6693bf403aff6df5b3e48f4de50ecb9f Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 25 Mar 2020 11:09:54 -0600 Subject: [PATCH 057/136] SlD: minor updates to glue code. Remove swap file that somehow got added... something isn't working right in the gitignore. --- .gitignore | 1 + .../openfast-library/src/.FAST_Subs.f90.swp | Bin 421888 -> 0 bytes modules/openfast-library/src/FAST_Subs.f90 | 34 ++++++++++++++++-- 3 files changed, 33 insertions(+), 2 deletions(-) delete mode 100644 modules/openfast-library/src/.FAST_Subs.f90.swp diff --git a/.gitignore b/.gitignore index 8a3337ef1..3a05367cc 100644 --- a/.gitignore +++ b/.gitignore @@ -44,3 +44,4 @@ vs-build/ # backup files *.asv +.*swp diff --git a/modules/openfast-library/src/.FAST_Subs.f90.swp b/modules/openfast-library/src/.FAST_Subs.f90.swp deleted file mode 100644 index e71bcf1512856a2a95468f25d005ad815f59f082..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 421888 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

83%6T1D4cHAdxc{T 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 y?p=EePp;i%PnkPwhv9?f%= AbortErrLev) THEN + CALL Cleanup() + RETURN + END IF + ! Add interfaces as we develop them. + END IF + ! ------------------------------ ! initialize CompMooring modules ! ------------------------------ @@ -1715,6 +1743,7 @@ SUBROUTINE ValidateInputData(p, ErrStat, ErrMsg) IF (p%CompSub == Module_Unknown) CALL SetErrStat( ErrID_Fatal, 'CompSub must be 0 (None), 1 (SubDyn), or 2 (ExtPtfm_MCKF).', ErrStat, ErrMsg, RoutineName ) IF (p%CompMooring == Module_Unknown) CALL SetErrStat( ErrID_Fatal, 'CompMooring must be 0 (None), 1 (MAP), 2 (FEAMooring), 3 (MoorDyn), or 4 (OrcaFlex).', ErrStat, ErrMsg, RoutineName ) IF (p%CompIce == Module_Unknown) CALL SetErrStat( ErrID_Fatal, 'CompIce must be 0 (None) or 1 (IceFloe).', ErrStat, ErrMsg, RoutineName ) + IF (p%CompSoil == Module_Unknown) CALL SetErrStat( ErrID_Fatal, 'CompSoil must be 0 (None) or 1 (coupled to SubDyn).', ErrStat, ErrMsg, RoutineName ) IF (p%CompHydro /= Module_HD) THEN IF (p%CompMooring == Module_MAP) THEN CALL SetErrStat( ErrID_Fatal, 'HydroDyn must be used when MAP is used. Set CompHydro > 0 or CompMooring = 0 in the FAST input file.', ErrStat, ErrMsg, RoutineName ) @@ -1735,7 +1764,8 @@ SUBROUTINE ValidateInputData(p, ErrStat, ErrMsg) IF (p%CompHydro /= Module_HD) CALL SetErrStat( ErrID_Fatal, 'HydroDyn must be used when IceDyn is used. Set CompHydro > 0 or CompIce = 0 in the FAST input file.', ErrStat, ErrMsg, RoutineName ) END IF - IF (p%CompElast == Module_BD .and. p%CompAero == Module_AD14 ) CALL SetErrStat( ErrID_Fatal, 'AeroDyn14 cannot be used when BeamDyn is used. Change CompAero or CompElast in the FAST input file.', ErrStat, ErrMsg, RoutineName ) + IF (p%CompElast == Module_BD .and. p%CompAero == Module_AD14 ) CALL SetErrStat( ErrID_Fatal, 'AeroDyn14 cannot be used when BeamDyn is used. Change CompAero or CompElast in the FAST input file.', ErrStat, ErrMsg, RoutineName ) + IF (p%CompSoil == Module_SlD .and. .not. p%CompSub == Module_SD ) CALL SetErrStat( ErrID_Fatal, 'SoilDyn cannot be used without SubDyn. Change CompSub or CompSoil in the FAST input file.', ErrStat, ErrMsg, RoutineName ) ! IF ( p%InterpOrder < 0 .OR. p%InterpOrder > 2 ) THEN IF ( p%InterpOrder < 1 .OR. p%InterpOrder > 2 ) THEN From 35715f9dae69be3fa366abc2625c0cf69cf8d8aa Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Thu, 26 Mar 2020 13:10:12 -0600 Subject: [PATCH 058/136] SlD: rename meshes for consistency, add to glue code --- .../openfast-library/src/FAST_Registry.txt | 3 + modules/openfast-library/src/FAST_Solver.f90 | 21 +- modules/openfast-library/src/FAST_Types.f90 | 180 +++++++++++++++ modules/soildyn/src/SoilDyn.f90 | 28 +-- modules/soildyn/src/SoilDyn_IO.f90 | 10 +- modules/soildyn/src/SoilDyn_Registry.txt | 12 +- modules/soildyn/src/SoilDyn_Types.f90 | 207 +++--------------- modules/soildyn/src/driver/SoilDyn_Driver.f90 | 10 +- 8 files changed, 254 insertions(+), 217 deletions(-) diff --git a/modules/openfast-library/src/FAST_Registry.txt b/modules/openfast-library/src/FAST_Registry.txt index 4d85671ea..5a5e7c4a3 100644 --- a/modules/openfast-library/src/FAST_Registry.txt +++ b/modules/openfast-library/src/FAST_Registry.txt @@ -459,6 +459,9 @@ typedef ^ FAST_ModuleMapType MeshMapType SD_P_2_IceF_P - - - "Map SubDyn y2Mesh # IceD <-> SD typedef ^ FAST_ModuleMapType MeshMapType IceD_P_2_SD_P {:} - - "Map IceDyn point mesh to SubDyn y2Mesh point mesh" typedef ^ FAST_ModuleMapType MeshMapType SD_P_2_IceD_P {:} - - "Map SubDyn y2Mesh point mesh to IceDyn point mesh" +# SlD <-> SD +typedef ^ FAST_ModuleMapType MeshMapType SlD_P_2_SD_P - - - "Map SoilDyn point mesh to SubDyn y2Mesh point mesh" +typedef ^ FAST_ModuleMapType MeshMapType SD_P_2_SlD_P - - - "Map SubDyn y2Mesh point mesh to SoilDyn point mesh" # Stored Jacobians: typedef ^ FAST_ModuleMapType ReKi Jacobian_Opt1 {:}{:} - - "Stored Jacobian in ED_HD_InputOutputSolve or ED_SD_HD_BD_InputOutputSolve" typedef ^ FAST_ModuleMapType Integer Jacobian_pivot {:} - - "Pivot array used for LU decomposition of Jacobian_Opt1" diff --git a/modules/openfast-library/src/FAST_Solver.f90 b/modules/openfast-library/src/FAST_Solver.f90 index afae4c8cf..e2e25d79f 100644 --- a/modules/openfast-library/src/FAST_Solver.f90 +++ b/modules/openfast-library/src/FAST_Solver.f90 @@ -4302,9 +4302,24 @@ SUBROUTINE InitModuleMappings(p_FAST, ED, BD, AD14, AD, HD, SD, ExtPtfm, SrvD, M END DO END IF ! SubDyn-IceFloe - - IF (ErrStat >= AbortErrLev ) RETURN - + +!------------------------- +! SubDyn <-> SoilDyn +!------------------------- + + IF ( p_FAST%CompSoil == Module_SlD ) THEN + + ! SoilDyn output SoilMesh point mesh to SubDyn input LMesh point mesh + CALL MeshMapCreate( SlD%y%SoilMesh, SD%Input(1)%LMesh, MeshMapData%SlD_P_2_SD_P, ErrStat2, ErrMsg2 ) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':SlD_P_2_SD_P' ) + ! SubDyn output y2Mesh point mesh to SoilDyn input SoilMesh point mesh + CALL MeshMapCreate( SD%y%y2Mesh, SlD%Input(1)%SoilMesh, MeshMapData%SD_P_2_SlD_P, ErrStat2, ErrMsg2 ) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':SD_P_2_SlD_P' ) + + END IF ! SubDyn-SoilDyn + + IF (ErrStat >= AbortErrLev ) RETURN + !............................................................................................................................ ! Initialize the Jacobian structures: !............................................................................................................................ diff --git a/modules/openfast-library/src/FAST_Types.f90 b/modules/openfast-library/src/FAST_Types.f90 index ee801c426..260478702 100644 --- a/modules/openfast-library/src/FAST_Types.f90 +++ b/modules/openfast-library/src/FAST_Types.f90 @@ -523,6 +523,8 @@ MODULE FAST_Types TYPE(MeshMapType) :: SD_P_2_IceF_P !< Map SubDyn y2Mesh point mesh to IceFloe point mesh [-] TYPE(MeshMapType) , DIMENSION(:), ALLOCATABLE :: IceD_P_2_SD_P !< Map IceDyn point mesh to SubDyn y2Mesh point mesh [-] TYPE(MeshMapType) , DIMENSION(:), ALLOCATABLE :: SD_P_2_IceD_P !< Map SubDyn y2Mesh point mesh to IceDyn point mesh [-] + TYPE(MeshMapType) :: SlD_P_2_SD_P !< Map SoilDyn point mesh to SubDyn y2Mesh point mesh [-] + TYPE(MeshMapType) :: SD_P_2_SlD_P !< Map SubDyn y2Mesh point mesh to SoilDyn point mesh [-] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: Jacobian_Opt1 !< Stored Jacobian in ED_HD_InputOutputSolve or ED_SD_HD_BD_InputOutputSolve [-] INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: Jacobian_pivot !< Pivot array used for LU decomposition of Jacobian_Opt1 [-] INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: Jac_u_indx !< matrix to help fill/pack the u vector in computing the jacobian [-] @@ -24667,6 +24669,12 @@ SUBROUTINE FAST_CopyModuleMapType( SrcModuleMapTypeData, DstModuleMapTypeData, C IF (ErrStat>=AbortErrLev) RETURN ENDDO ENDIF + CALL NWTC_Library_Copymeshmaptype( SrcModuleMapTypeData%SlD_P_2_SD_P, DstModuleMapTypeData%SlD_P_2_SD_P, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN + CALL NWTC_Library_Copymeshmaptype( SrcModuleMapTypeData%SD_P_2_SlD_P, DstModuleMapTypeData%SD_P_2_SlD_P, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN IF (ALLOCATED(SrcModuleMapTypeData%Jacobian_Opt1)) THEN i1_l = LBOUND(SrcModuleMapTypeData%Jacobian_Opt1,1) i1_u = UBOUND(SrcModuleMapTypeData%Jacobian_Opt1,1) @@ -24863,6 +24871,8 @@ SUBROUTINE FAST_DestroyModuleMapType( ModuleMapTypeData, ErrStat, ErrMsg ) ENDDO DEALLOCATE(ModuleMapTypeData%SD_P_2_IceD_P) ENDIF + CALL NWTC_Library_Destroymeshmaptype( ModuleMapTypeData%SlD_P_2_SD_P, ErrStat, ErrMsg ) + CALL NWTC_Library_Destroymeshmaptype( ModuleMapTypeData%SD_P_2_SlD_P, ErrStat, ErrMsg ) IF (ALLOCATED(ModuleMapTypeData%Jacobian_Opt1)) THEN DEALLOCATE(ModuleMapTypeData%Jacobian_Opt1) ENDIF @@ -25532,6 +25542,40 @@ SUBROUTINE FAST_PackModuleMapType( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, END IF END DO END IF + Int_BufSz = Int_BufSz + 3 ! SlD_P_2_SD_P: size of buffers for each call to pack subtype + CALL NWTC_Library_Packmeshmaptype( Re_Buf, Db_Buf, Int_Buf, InData%SlD_P_2_SD_P, ErrStat2, ErrMsg2, .TRUE. ) ! SlD_P_2_SD_P + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! SlD_P_2_SD_P + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! SlD_P_2_SD_P + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! SlD_P_2_SD_P + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF + Int_BufSz = Int_BufSz + 3 ! SD_P_2_SlD_P: size of buffers for each call to pack subtype + CALL NWTC_Library_Packmeshmaptype( Re_Buf, Db_Buf, Int_Buf, InData%SD_P_2_SlD_P, ErrStat2, ErrMsg2, .TRUE. ) ! SD_P_2_SlD_P + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! SD_P_2_SlD_P + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! SD_P_2_SlD_P + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! SD_P_2_SlD_P + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF Int_BufSz = Int_BufSz + 1 ! Jacobian_Opt1 allocated yes/no IF ( ALLOCATED(InData%Jacobian_Opt1) ) THEN Int_BufSz = Int_BufSz + 2*2 ! Jacobian_Opt1 upper/lower bounds for each dimension @@ -26837,6 +26881,62 @@ SUBROUTINE FAST_PackModuleMapType( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ENDIF END DO END IF + CALL NWTC_Library_Packmeshmaptype( Re_Buf, Db_Buf, Int_Buf, InData%SlD_P_2_SD_P, ErrStat2, ErrMsg2, OnlySize ) ! SlD_P_2_SD_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 + CALL NWTC_Library_Packmeshmaptype( Re_Buf, Db_Buf, Int_Buf, InData%SD_P_2_SlD_P, ErrStat2, ErrMsg2, OnlySize ) ! SD_P_2_SlD_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 IF ( .NOT. ALLOCATED(InData%Jacobian_Opt1) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 @@ -28760,6 +28860,86 @@ SUBROUTINE FAST_UnPackModuleMapType( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrSta IF(ALLOCATED(Int_Buf)) DEALLOCATE(Int_Buf) END DO END IF + 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 NWTC_Library_Unpackmeshmaptype( Re_Buf, Db_Buf, Int_Buf, OutData%SlD_P_2_SD_P, ErrStat2, ErrMsg2 ) ! SlD_P_2_SD_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) + 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 NWTC_Library_Unpackmeshmaptype( Re_Buf, Db_Buf, Int_Buf, OutData%SD_P_2_SlD_P, ErrStat2, ErrMsg2 ) ! SD_P_2_SlD_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) IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! Jacobian_Opt1 not allocated Int_Xferred = Int_Xferred + 1 ELSE diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index 247182812..e01d696e7 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -228,10 +228,6 @@ subroutine SlD_InitMeshes( InputFileData, InitInp, u, y, p, m, ErrStat, ErrMsg ) real(ReKi) :: Pos(3) real(ReKi), allocatable :: MeshLocations(:,:) -!FIXME: change u%SoilMotion to be a sibling of the passed in mesh. Not all points on passed in mesh will be used -! nNodes_C should match NumPoints read in -! step through to find all the points we are using and make sure they match something on the available reaction nodes. -! create mapping index of nodes (set order as needed) select case(p%CalcOption) case (Calc_StiffDamp) p%NumPoints = 1_IntKi @@ -256,10 +252,10 @@ subroutine SlD_InitMeshes( InputFileData, InitInp, u, y, p, m, ErrStat, ErrMsg ) end select !................................. - ! u%SoilMotion (for coupling with external codes) + ! u%SoilMesh (for coupling with external codes) !................................. - CALL MeshCreate( BlankMesh = u%SoilMotion & + CALL MeshCreate( BlankMesh = u%SoilMesh & , IOS = COMPONENT_INPUT & , NNodes = p%NumPoints & , TranslationDisp = .TRUE. & @@ -277,7 +273,7 @@ subroutine SlD_InitMeshes( InputFileData, InitInp, u, y, p, m, ErrStat, ErrMsg ) DCM = 0.0_DbKi do i=1,p%NumPoints - CALL MeshPositionNode( Mesh = u%SoilMotion & + CALL MeshPositionNode( Mesh = u%SoilMesh & , INode = i & , Pos = MeshLocations(1:3,i) & , ErrStat = ErrStat2 & @@ -285,7 +281,7 @@ subroutine SlD_InitMeshes( InputFileData, InitInp, u, y, p, m, ErrStat, ErrMsg ) , Orient = DCM ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MeshConstructElement ( Mesh = u%SoilMotion & + CALL MeshConstructElement ( Mesh = u%SoilMesh & , Xelement = ELEMENT_POINT & , P1 = i & , ErrStat = ErrStat2 & @@ -293,17 +289,17 @@ subroutine SlD_InitMeshes( InputFileData, InitInp, u, y, p, m, ErrStat, ErrMsg ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) enddo - CALL MeshCommit ( Mesh = u%SoilMotion, ErrStat = ErrStat2, ErrMess = ErrMsg2 ) + CALL MeshCommit ( Mesh = u%SoilMesh, ErrStat = ErrStat2, ErrMess = ErrMsg2 ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) if (ErrStat>=AbortErrLev) return !................................. - ! y%ReactionForce (for coupling with external codes) + ! y%SoilMesh (for coupling with external codes) !................................. - CALL MeshCopy( SrcMesh = u%SoilMotion & - , DestMesh = y%ReactionForce & + CALL MeshCopy( SrcMesh = u%SoilMesh & + , DestMesh = y%SoilMesh & , CtrlCode = MESH_SIBLING & , IOS = COMPONENT_OUTPUT & , Force = .TRUE. & @@ -474,13 +470,13 @@ subroutine SlD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg do i=1,size(m%dll_data) ! Copy displacement from point mesh (angles in radians -- REDWIN dll also uses rad) - Displacement(1:3) = u%SoilMotion%TranslationDisp(1:3,i) ! Translations -- This is R8Ki in the mesh - Displacement(4:6) = EulerExtract(u%SoilMotion%Orientation(1:3,1:3,i)) ! Small angle assumption should be valid here -- Note we are assuming reforientation is 0 + Displacement(1:3) = u%SoilMesh%TranslationDisp(1:3,i) ! Translations -- This is R8Ki in the mesh + Displacement(4:6) = EulerExtract(u%SoilMesh%Orientation(1:3,1:3,i)) ! Small angle assumption should be valid here -- Note we are assuming reforientation is 0 call REDWINinterface_CalcOutput( p%DLL_Trgt, p%DLL_Model, Displacement, Force, m%dll_data(i), ErrStat2, ErrMsg2 ); if (Failed()) return; ! Return force onto the resulting point mesh - y%ReactionForce%Force (1:3,i) = real(Force(1:3),ReKi) - y%ReactionForce%Moment(1:3,i) = real(Force(4:6),ReKi) + y%SoilMesh%Force (1:3,i) = real(Force(1:3),ReKi) + y%SoilMesh%Moment(1:3,i) = real(Force(4:6),ReKi) enddo ! Outputs diff --git a/modules/soildyn/src/SoilDyn_IO.f90 b/modules/soildyn/src/SoilDyn_IO.f90 index 201db02f7..62c40355c 100644 --- a/modules/soildyn/src/SoilDyn_IO.f90 +++ b/modules/soildyn/src/SoilDyn_IO.f90 @@ -782,22 +782,22 @@ subroutine SlD_WriteOutput(p, AllOuts, u, y, m, ErrStat, ErrMsg ) do i=1,p%NumPoints ! Forces do j=1,3 - AllOuts( SoilPtF(j ,i) ) = y%ReactionForce%Force(j,i) + AllOuts( SoilPtF(j ,i) ) = y%SoilMesh%Force(j,i) enddo ! Moments do j=1,3 - AllOuts( SoilPtF(j+3,i) ) = y%ReactionForce%Moment(j,i) + AllOuts( SoilPtF(j+3,i) ) = y%SoilMesh%Moment(j,i) enddo ! Translation displacement do j=1,3 - AllOuts( SoilPtD(j ,i) ) = u%SoilMotion%TranslationDisp(j,i) + AllOuts( SoilPtD(j ,i) ) = u%SoilMesh%TranslationDisp(j,i) enddo ! We have defined the referene orientatation aligned with XYZ, so we don't need as much math here. - ! Small angle assumption must be valid for computations in this module, so Euler extract is sufficient - Theta = real( EulerExtract(u%SoilMotion%Orientation(1:3,1:3,i)), ReKi) ! orientations are double + ! Small angle assumption must be valid for computations in this module, so GetSmllRotAngs extract is sufficient + Theta = real( GetSmllRotAngs(u%SoilMesh%Orientation(1:3,1:3,i)), ReKi) ! orientations are double do j=1,3 AllOuts( SoilPtD(j+3,i) ) = Theta(j) enddo diff --git a/modules/soildyn/src/SoilDyn_Registry.txt b/modules/soildyn/src/SoilDyn_Registry.txt index 007fb3daa..879d4736f 100644 --- a/modules/soildyn/src/SoilDyn_Registry.txt +++ b/modules/soildyn/src/SoilDyn_Registry.txt @@ -65,9 +65,9 @@ typedef ^ InitInputType CHARACTER(1024) RootName - - - typedef ^ InitInputType LOGICAL Linearize - .FALSE. - "Flag that tells this module if the glue code wants to linearize." - typedef ^ InitInputType ReKi WtrDpth - - - "Water depth to mudline (global coordinates)" '(m)' typedef ^ InitInputType ReKi SubRotateZ - - - "Substructure rotation angle, in case we change orientations" '(rad)' -typedef ^ InitInputType IntKi nNodes_R - - - "Number of nodes subdyn thinks are reaction nodes (from SubDyn nNodes_C)" - -typedef ^ InitInputType IntKi Nodes_R {:} - - "Nodes in input mesh that reaction force may be applied to (note: p%Nodes_C in SD has 2 dimensions in the old format, but only 1 in new)" '(-)' -typedef ^ InitInputType MeshType StructMesh - - - "Interior+Interface nodes outputs on a point mesh (from SD) -- only some are used!" '(-)' +#typedef ^ InitInputType IntKi nNodes_R - - - "Number of nodes subdyn thinks are reaction nodes (from SubDyn nNodes_C)" - +#typedef ^ InitInputType IntKi Nodes_R {:} - - "Nodes in input mesh that reaction force may be applied to (note: p%Nodes_C in SD has 2 dimensions in the old format, but only 1 in new)" '(-)' +#typedef ^ InitInputType MeshType SoilMesh - - - "Interior+Interface nodes outputs on a point mesh (from SD) -- only some are used!" '(-)' # Define outputs from the initialization routine here: typedef ^ InitOutputType CHARACTER(ChanLen) WriteOutputHdr {:} - - "Names of the output-to-file channels" - @@ -126,10 +126,10 @@ typedef ^ ParameterType ReKi WtrDepth typedef ^ ParameterType IntKi Nodes_C {:}{:} - - "Nodes in input mesh that reaction force may be applied to" '(-)' # ..... Inputs .................................................................................................................... -typedef ^ InputType MeshType SoilMotion - - - "Mesh of soil contact points" - +typedef ^ InputType MeshType SoilMesh - - - "Mesh of soil contact points" - # ..... Outputs ................................................................................................................... typedef ^ OutputType ReKi DummyOutput - - - "Remove this variable if you have output data" - -typedef ^ OutputType ReKi WriteOutput {:} - - "Example of data to be written to an output file" "s,-" -typedef ^ OutputType MeshType ReactionForce - - - "reaction forces and moments point mesh (may be multiple points)" - +typedef ^ OutputType ReKi WriteOutput {:} - - "Example of data to be written to an output file" "s,-" +typedef ^ OutputType MeshType SoilMesh - - - "reaction forces and moments point mesh (may be multiple points)" - diff --git a/modules/soildyn/src/SoilDyn_Types.f90 b/modules/soildyn/src/SoilDyn_Types.f90 index 1738078d7..2144f97c0 100644 --- a/modules/soildyn/src/SoilDyn_Types.f90 +++ b/modules/soildyn/src/SoilDyn_Types.f90 @@ -82,9 +82,6 @@ MODULE SoilDyn_Types LOGICAL :: Linearize = .FALSE. !< Flag that tells this module if the glue code wants to linearize. [-] REAL(ReKi) :: WtrDpth !< Water depth to mudline (global coordinates) ['(m)'] REAL(ReKi) :: SubRotateZ !< Substructure rotation angle, in case we change orientations ['(rad)'] - INTEGER(IntKi) :: nNodes_R !< Number of nodes subdyn thinks are reaction nodes (from SubDyn nNodes_C) [-] - INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: Nodes_R !< Nodes in input mesh that reaction force may be applied to (note: p%Nodes_C in SD has 2 dimensions in the old format, but only 1 in new) ['(-)'] - TYPE(MeshType) :: StructMesh !< Interior+Interface nodes outputs on a point mesh (from SD) -- only some are used! ['(-)'] END TYPE SlD_InitInputType ! ======================= ! ========= SlD_InitOutputType ======= @@ -140,14 +137,14 @@ MODULE SoilDyn_Types ! ======================= ! ========= SlD_InputType ======= TYPE, PUBLIC :: SlD_InputType - TYPE(MeshType) :: SoilMotion !< Mesh of soil contact points [-] + TYPE(MeshType) :: SoilMesh !< Mesh of soil contact points [-] END TYPE SlD_InputType ! ======================= ! ========= SlD_OutputType ======= TYPE, PUBLIC :: SlD_OutputType REAL(ReKi) :: DummyOutput !< Remove this variable if you have output data [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: WriteOutput !< Example of data to be written to an output file [s,-] - TYPE(MeshType) :: ReactionForce !< reaction forces and moments point mesh (may be multiple points) [-] + TYPE(MeshType) :: SoilMesh !< reaction forces and moments point mesh (may be multiple points) [-] END TYPE SlD_OutputType ! ======================= CONTAINS @@ -1053,14 +1050,13 @@ SUBROUTINE SlD_UnPackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er END SUBROUTINE SlD_UnPackInputFile SUBROUTINE SlD_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, ErrStat, ErrMsg ) - TYPE(SlD_InitInputType), INTENT(INOUT) :: SrcInitInputData + TYPE(SlD_InitInputType), INTENT(IN) :: SrcInitInputData TYPE(SlD_InitInputType), INTENT(INOUT) :: DstInitInputData 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 = 'SlD_CopyInitInput' @@ -1072,22 +1068,6 @@ SUBROUTINE SlD_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, ErrS DstInitInputData%Linearize = SrcInitInputData%Linearize DstInitInputData%WtrDpth = SrcInitInputData%WtrDpth DstInitInputData%SubRotateZ = SrcInitInputData%SubRotateZ - DstInitInputData%nNodes_R = SrcInitInputData%nNodes_R -IF (ALLOCATED(SrcInitInputData%Nodes_R)) THEN - i1_l = LBOUND(SrcInitInputData%Nodes_R,1) - i1_u = UBOUND(SrcInitInputData%Nodes_R,1) - IF (.NOT. ALLOCATED(DstInitInputData%Nodes_R)) THEN - ALLOCATE(DstInitInputData%Nodes_R(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitInputData%Nodes_R.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - END IF - DstInitInputData%Nodes_R = SrcInitInputData%Nodes_R -ENDIF - CALL MeshCopy( SrcInitInputData%StructMesh, DstInitInputData%StructMesh, CtrlCode, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - IF (ErrStat>=AbortErrLev) RETURN END SUBROUTINE SlD_CopyInitInput SUBROUTINE SlD_DestroyInitInput( InitInputData, ErrStat, ErrMsg ) @@ -1099,10 +1079,6 @@ SUBROUTINE SlD_DestroyInitInput( InitInputData, ErrStat, ErrMsg ) ! ErrStat = ErrID_None ErrMsg = "" -IF (ALLOCATED(InitInputData%Nodes_R)) THEN - DEALLOCATE(InitInputData%Nodes_R) -ENDIF - CALL MeshDestroy( InitInputData%StructMesh, ErrStat, ErrMsg ) END SUBROUTINE SlD_DestroyInitInput SUBROUTINE SlD_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) @@ -1145,30 +1121,6 @@ SUBROUTINE SlD_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs Int_BufSz = Int_BufSz + 1 ! Linearize Re_BufSz = Re_BufSz + 1 ! WtrDpth Re_BufSz = Re_BufSz + 1 ! SubRotateZ - Int_BufSz = Int_BufSz + 1 ! nNodes_R - Int_BufSz = Int_BufSz + 1 ! Nodes_R allocated yes/no - IF ( ALLOCATED(InData%Nodes_R) ) THEN - Int_BufSz = Int_BufSz + 2*1 ! Nodes_R upper/lower bounds for each dimension - Int_BufSz = Int_BufSz + SIZE(InData%Nodes_R) ! Nodes_R - END IF - ! Allocate buffers for subtypes, if any (we'll get sizes from these) - Int_BufSz = Int_BufSz + 3 ! StructMesh: size of buffers for each call to pack subtype - CALL MeshPack( InData%StructMesh, Re_Buf, Db_Buf, Int_Buf, ErrStat2, ErrMsg2, .TRUE. ) ! StructMesh - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - IF (ErrStat >= AbortErrLev) RETURN - - IF(ALLOCATED(Re_Buf)) THEN ! StructMesh - Re_BufSz = Re_BufSz + SIZE( Re_Buf ) - DEALLOCATE(Re_Buf) - END IF - IF(ALLOCATED(Db_Buf)) THEN ! StructMesh - Db_BufSz = Db_BufSz + SIZE( Db_Buf ) - DEALLOCATE(Db_Buf) - END IF - IF(ALLOCATED(Int_Buf)) THEN ! StructMesh - Int_BufSz = Int_BufSz + SIZE( Int_Buf ) - DEALLOCATE(Int_Buf) - END IF IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) THEN @@ -1210,49 +1162,6 @@ SUBROUTINE SlD_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs Re_Xferred = Re_Xferred + 1 ReKiBuf ( Re_Xferred:Re_Xferred+(1)-1 ) = InData%SubRotateZ Re_Xferred = Re_Xferred + 1 - IntKiBuf ( Int_Xferred:Int_Xferred+(1)-1 ) = InData%nNodes_R - Int_Xferred = Int_Xferred + 1 - IF ( .NOT. ALLOCATED(InData%Nodes_R) ) 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%Nodes_R,1) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%Nodes_R,1) - Int_Xferred = Int_Xferred + 2 - - IF (SIZE(InData%Nodes_R)>0) IntKiBuf ( Int_Xferred:Int_Xferred+(SIZE(InData%Nodes_R))-1 ) = PACK(InData%Nodes_R,.TRUE.) - Int_Xferred = Int_Xferred + SIZE(InData%Nodes_R) - END IF - CALL MeshPack( InData%StructMesh, Re_Buf, Db_Buf, Int_Buf, ErrStat2, ErrMsg2, OnlySize ) ! StructMesh - 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 END SUBROUTINE SlD_PackInitInput SUBROUTINE SlD_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) @@ -1274,7 +1183,6 @@ SUBROUTINE SlD_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er LOGICAL, ALLOCATABLE :: mask3(:,:,:) LOGICAL, ALLOCATABLE :: mask4(:,:,:,:) LOGICAL, ALLOCATABLE :: mask5(:,:,:,:,:) - INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'SlD_UnPackInitInput' @@ -1302,71 +1210,6 @@ SUBROUTINE SlD_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er Re_Xferred = Re_Xferred + 1 OutData%SubRotateZ = ReKiBuf( Re_Xferred ) Re_Xferred = Re_Xferred + 1 - OutData%nNodes_R = IntKiBuf( Int_Xferred ) - Int_Xferred = Int_Xferred + 1 - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! Nodes_R 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 (ALLOCATED(OutData%Nodes_R)) DEALLOCATE(OutData%Nodes_R) - ALLOCATE(OutData%Nodes_R(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%Nodes_R.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - ALLOCATE(mask1(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating mask1.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - mask1 = .TRUE. - IF (SIZE(OutData%Nodes_R)>0) OutData%Nodes_R = UNPACK( IntKiBuf ( Int_Xferred:Int_Xferred+(SIZE(OutData%Nodes_R))-1 ), mask1, 0_IntKi ) - Int_Xferred = Int_Xferred + SIZE(OutData%Nodes_R) - DEALLOCATE(mask1) - END IF - 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 MeshUnpack( OutData%StructMesh, Re_Buf, Db_Buf, Int_Buf, ErrStat2, ErrMsg2 ) ! StructMesh - 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) END SUBROUTINE SlD_UnPackInitInput SUBROUTINE SlD_CopyInitOutput( SrcInitOutputData, DstInitOutputData, CtrlCode, ErrStat, ErrMsg ) @@ -3033,7 +2876,7 @@ SUBROUTINE SlD_CopyInput( SrcInputData, DstInputData, CtrlCode, ErrStat, ErrMsg ! ErrStat = ErrID_None ErrMsg = "" - CALL MeshCopy( SrcInputData%SoilMotion, DstInputData%SoilMotion, CtrlCode, ErrStat2, ErrMsg2 ) + CALL MeshCopy( SrcInputData%SoilMesh, DstInputData%SoilMesh, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat>=AbortErrLev) RETURN END SUBROUTINE SlD_CopyInput @@ -3047,7 +2890,7 @@ SUBROUTINE SlD_DestroyInput( InputData, ErrStat, ErrMsg ) ! ErrStat = ErrID_None ErrMsg = "" - CALL MeshDestroy( InputData%SoilMotion, ErrStat, ErrMsg ) + CALL MeshDestroy( InputData%SoilMesh, ErrStat, ErrMsg ) END SUBROUTINE SlD_DestroyInput SUBROUTINE SlD_PackInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) @@ -3086,20 +2929,20 @@ SUBROUTINE SlD_PackInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, S Db_BufSz = 0 Int_BufSz = 0 ! Allocate buffers for subtypes, if any (we'll get sizes from these) - Int_BufSz = Int_BufSz + 3 ! SoilMotion: size of buffers for each call to pack subtype - CALL MeshPack( InData%SoilMotion, Re_Buf, Db_Buf, Int_Buf, ErrStat2, ErrMsg2, .TRUE. ) ! SoilMotion + Int_BufSz = Int_BufSz + 3 ! SoilMesh: size of buffers for each call to pack subtype + CALL MeshPack( InData%SoilMesh, Re_Buf, Db_Buf, Int_Buf, ErrStat2, ErrMsg2, .TRUE. ) ! SoilMesh CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN - IF(ALLOCATED(Re_Buf)) THEN ! SoilMotion + IF(ALLOCATED(Re_Buf)) THEN ! SoilMesh Re_BufSz = Re_BufSz + SIZE( Re_Buf ) DEALLOCATE(Re_Buf) END IF - IF(ALLOCATED(Db_Buf)) THEN ! SoilMotion + IF(ALLOCATED(Db_Buf)) THEN ! SoilMesh Db_BufSz = Db_BufSz + SIZE( Db_Buf ) DEALLOCATE(Db_Buf) END IF - IF(ALLOCATED(Int_Buf)) THEN ! SoilMotion + IF(ALLOCATED(Int_Buf)) THEN ! SoilMesh Int_BufSz = Int_BufSz + SIZE( Int_Buf ) DEALLOCATE(Int_Buf) END IF @@ -3130,7 +2973,7 @@ SUBROUTINE SlD_PackInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, S Db_Xferred = 1 Int_Xferred = 1 - CALL MeshPack( InData%SoilMotion, Re_Buf, Db_Buf, Int_Buf, ErrStat2, ErrMsg2, OnlySize ) ! SoilMotion + CALL MeshPack( InData%SoilMesh, Re_Buf, Db_Buf, Int_Buf, ErrStat2, ErrMsg2, OnlySize ) ! SoilMesh CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -3225,7 +3068,7 @@ SUBROUTINE SlD_UnPackInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg Int_Buf = IntKiBuf( Int_Xferred:Int_Xferred+Buf_size-1 ) Int_Xferred = Int_Xferred + Buf_size END IF - CALL MeshUnpack( OutData%SoilMotion, Re_Buf, Db_Buf, Int_Buf, ErrStat2, ErrMsg2 ) ! SoilMotion + CALL MeshUnpack( OutData%SoilMesh, Re_Buf, Db_Buf, Int_Buf, ErrStat2, ErrMsg2 ) ! SoilMesh CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -3262,7 +3105,7 @@ SUBROUTINE SlD_CopyOutput( SrcOutputData, DstOutputData, CtrlCode, ErrStat, ErrM END IF DstOutputData%WriteOutput = SrcOutputData%WriteOutput ENDIF - CALL MeshCopy( SrcOutputData%ReactionForce, DstOutputData%ReactionForce, CtrlCode, ErrStat2, ErrMsg2 ) + CALL MeshCopy( SrcOutputData%SoilMesh, DstOutputData%SoilMesh, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat>=AbortErrLev) RETURN END SUBROUTINE SlD_CopyOutput @@ -3279,7 +3122,7 @@ SUBROUTINE SlD_DestroyOutput( OutputData, ErrStat, ErrMsg ) IF (ALLOCATED(OutputData%WriteOutput)) THEN DEALLOCATE(OutputData%WriteOutput) ENDIF - CALL MeshDestroy( OutputData%ReactionForce, ErrStat, ErrMsg ) + CALL MeshDestroy( OutputData%SoilMesh, ErrStat, ErrMsg ) END SUBROUTINE SlD_DestroyOutput SUBROUTINE SlD_PackOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) @@ -3324,20 +3167,20 @@ SUBROUTINE SlD_PackOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, Re_BufSz = Re_BufSz + SIZE(InData%WriteOutput) ! WriteOutput END IF ! Allocate buffers for subtypes, if any (we'll get sizes from these) - Int_BufSz = Int_BufSz + 3 ! ReactionForce: size of buffers for each call to pack subtype - CALL MeshPack( InData%ReactionForce, Re_Buf, Db_Buf, Int_Buf, ErrStat2, ErrMsg2, .TRUE. ) ! ReactionForce + Int_BufSz = Int_BufSz + 3 ! SoilMesh: size of buffers for each call to pack subtype + CALL MeshPack( InData%SoilMesh, Re_Buf, Db_Buf, Int_Buf, ErrStat2, ErrMsg2, .TRUE. ) ! SoilMesh CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN - IF(ALLOCATED(Re_Buf)) THEN ! ReactionForce + IF(ALLOCATED(Re_Buf)) THEN ! SoilMesh Re_BufSz = Re_BufSz + SIZE( Re_Buf ) DEALLOCATE(Re_Buf) END IF - IF(ALLOCATED(Db_Buf)) THEN ! ReactionForce + IF(ALLOCATED(Db_Buf)) THEN ! SoilMesh Db_BufSz = Db_BufSz + SIZE( Db_Buf ) DEALLOCATE(Db_Buf) END IF - IF(ALLOCATED(Int_Buf)) THEN ! ReactionForce + IF(ALLOCATED(Int_Buf)) THEN ! SoilMesh Int_BufSz = Int_BufSz + SIZE( Int_Buf ) DEALLOCATE(Int_Buf) END IF @@ -3383,7 +3226,7 @@ SUBROUTINE SlD_PackOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, IF (SIZE(InData%WriteOutput)>0) ReKiBuf ( Re_Xferred:Re_Xferred+(SIZE(InData%WriteOutput))-1 ) = PACK(InData%WriteOutput,.TRUE.) Re_Xferred = Re_Xferred + SIZE(InData%WriteOutput) END IF - CALL MeshPack( InData%ReactionForce, Re_Buf, Db_Buf, Int_Buf, ErrStat2, ErrMsg2, OnlySize ) ! ReactionForce + CALL MeshPack( InData%SoilMesh, Re_Buf, Db_Buf, Int_Buf, ErrStat2, ErrMsg2, OnlySize ) ! SoilMesh CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -3504,7 +3347,7 @@ SUBROUTINE SlD_UnPackOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMs Int_Buf = IntKiBuf( Int_Xferred:Int_Xferred+Buf_size-1 ) Int_Xferred = Int_Xferred + Buf_size END IF - CALL MeshUnpack( OutData%ReactionForce, Re_Buf, Db_Buf, Int_Buf, ErrStat2, ErrMsg2 ) ! ReactionForce + CALL MeshUnpack( OutData%SoilMesh, Re_Buf, Db_Buf, Int_Buf, ErrStat2, ErrMsg2 ) ! SoilMesh CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -3604,7 +3447,7 @@ SUBROUTINE SlD_Input_ExtrapInterp1(u1, u2, tin, u_out, tin_out, ErrStat, ErrMsg CALL SetErrStat(ErrID_Fatal, 't(1) must not equal t(2) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) RETURN END IF - CALL MeshExtrapInterp1(u1%SoilMotion, u2%SoilMotion, tin, u_out%SoilMotion, tin_out, ErrStat2, ErrMsg2 ) + CALL MeshExtrapInterp1(u1%SoilMesh, u2%SoilMesh, tin, u_out%SoilMesh, tin_out, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) END SUBROUTINE SlD_Input_ExtrapInterp1 @@ -3658,7 +3501,7 @@ SUBROUTINE SlD_Input_ExtrapInterp2(u1, u2, u3, tin, u_out, tin_out, ErrStat, Err CALL SetErrStat(ErrID_Fatal, 't(1) must not equal t(3) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) RETURN END IF - CALL MeshExtrapInterp2(u1%SoilMotion, u2%SoilMotion, u3%SoilMotion, tin, u_out%SoilMotion, tin_out, ErrStat2, ErrMsg2 ) + CALL MeshExtrapInterp2(u1%SoilMesh, u2%SoilMesh, u3%SoilMesh, tin, u_out%SoilMesh, tin_out, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) END SUBROUTINE SlD_Input_ExtrapInterp2 @@ -3765,7 +3608,7 @@ SUBROUTINE SlD_Output_ExtrapInterp1(y1, y2, tin, y_out, tin_out, ErrStat, ErrMsg DEALLOCATE(b1) DEALLOCATE(c1) END IF ! check if allocated - CALL MeshExtrapInterp1(y1%ReactionForce, y2%ReactionForce, tin, y_out%ReactionForce, tin_out, ErrStat2, ErrMsg2 ) + CALL MeshExtrapInterp1(y1%SoilMesh, y2%SoilMesh, tin, y_out%SoilMesh, tin_out, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) END SUBROUTINE SlD_Output_ExtrapInterp1 @@ -3833,7 +3676,7 @@ SUBROUTINE SlD_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat, Er DEALLOCATE(b1) DEALLOCATE(c1) END IF ! check if allocated - CALL MeshExtrapInterp2(y1%ReactionForce, y2%ReactionForce, y3%ReactionForce, tin, y_out%ReactionForce, tin_out, ErrStat2, ErrMsg2 ) + CALL MeshExtrapInterp2(y1%SoilMesh, y2%SoilMesh, y3%SoilMesh, tin, y_out%SoilMesh, tin_out, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) END SUBROUTINE SlD_Output_ExtrapInterp2 diff --git a/modules/soildyn/src/driver/SoilDyn_Driver.f90 b/modules/soildyn/src/driver/SoilDyn_Driver.f90 index 68d09ed8d..8bc7048c2 100644 --- a/modules/soildyn/src/driver/SoilDyn_Driver.f90 +++ b/modules/soildyn/src/driver/SoilDyn_Driver.f90 @@ -307,15 +307,15 @@ PROGRAM SoilDyn_Driver ! interpolate into the input data to get the displacement. Set this as u then run if ( SettingsFlags%InputDispFile ) then - do i=1,u(1)%SoilMotion%NNodes + do i=1,u(1)%SoilMesh%NNodes ! InterpStpReal( X, Xary, Yary, indx, size) do DimIdx=1,3 - u(1)%SoilMotion%TranslationDisp(DimIdx,i) = InterpStpReal8( real(Time,R8Ki), DisplacementList(:,1), DisplacementList(:,DimIdx+1), TmpIdx(DimIdx), size(DisplacementList,1) ) + u(1)%SoilMesh%TranslationDisp(DimIdx,i) = InterpStpReal8( real(Time,R8Ki), DisplacementList(:,1), DisplacementList(:,DimIdx+1), TmpIdx(DimIdx), size(DisplacementList,1) ) enddo do DimIdx=1,3 Theta(DimIdx) = InterpStpReal8( real(Time,R8Ki), DisplacementList(:,1), DisplacementList(:,DimIdx+4), TmpIdx(DimIdx), size(DisplacementList,1) ) enddo - u(1)%SoilMotion%Orientation(1:3,1:3,i) = EulerConstruct(Theta) + u(1)%SoilMesh%Orientation(1:3,1:3,i) = EulerConstruct(Theta) enddo endif @@ -338,8 +338,8 @@ PROGRAM SoilDyn_Driver if ( SettingsFlags%StiffMatOut .and. p%CalcOption==Calc_REDWIN ) then do i=1,size(misc%dll_data) ! Copy displacement from point mesh - Displacement(1:3) = u(1)%SoilMotion%TranslationDisp(1:3,i) ! Translations -- This is R8Ki in the mesh - Displacement(4:6) = EulerExtract(u(1)%SoilMotion%Orientation(1:3,1:3,i)) ! Small angle assumption should be valid here -- Note we are assuming reforientation is 0 + Displacement(1:3) = u(1)%SoilMesh%TranslationDisp(1:3,i) ! Translations -- This is R8Ki in the mesh + Displacement(4:6) = EulerExtract(u(1)%SoilMesh%Orientation(1:3,1:3,i)) ! Small angle assumption should be valid here -- Note we are assuming reforientation is 0 call REDWINinterface_GetStiffMatrix( p%DLL_Trgt, p%DLL_Model, Displacement, Force, StiffMatrix, misc%dll_data(i), ErrStat, ErrMsg ) IF ( ErrStat /= ErrID_None ) THEN ! Check if there was an error and do something about it if necessary CALL WrScr( 'Get stiffness: '//ErrMsg ) From 8493b544d022bbfb9326ce8e15910c3a0e580701 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Thu, 26 Mar 2020 14:12:49 -0600 Subject: [PATCH 059/136] SlD: update VS project --- vs-build/FASTlib/FASTlib.vfproj | 621 ++++++++++++++++---------------- 1 file changed, 317 insertions(+), 304 deletions(-) diff --git a/vs-build/FASTlib/FASTlib.vfproj b/vs-build/FASTlib/FASTlib.vfproj index dfc78ed54..129847201 100644 --- a/vs-build/FASTlib/FASTlib.vfproj +++ b/vs-build/FASTlib/FASTlib.vfproj @@ -117,16 +117,16 @@ - + - - - - + + + + @@ -135,25 +135,25 @@ - - + + - - - + - + - + + + @@ -165,25 +165,25 @@ - - + + - - - + - + - + + + @@ -199,25 +199,25 @@ - - + + - - - + - + - + + + @@ -233,25 +233,25 @@ - - + + - - - + - + - + + + @@ -267,25 +267,25 @@ - - + + - - - + - + - + + + @@ -321,25 +321,25 @@ - - + + - - - + - + - + + + @@ -358,25 +358,25 @@ - - + + - - - + - + - + + + @@ -397,25 +397,25 @@ - - + + - - - + - + - + + + @@ -427,25 +427,25 @@ - - + + - - - + - + - + + + @@ -466,25 +466,25 @@ - - + + - - - + - + - + + + @@ -503,25 +503,25 @@ - - + + - - - + - + - + + + @@ -543,25 +543,25 @@ - - + + - - - + - + - + + + @@ -577,25 +577,25 @@ - - + + - - - + - + - + + + @@ -611,25 +611,25 @@ - - + + - - - + - + - + + + @@ -645,25 +645,25 @@ - - + + - - - + - + - + + + @@ -679,25 +679,25 @@ - - + + - - - + - + - + + + @@ -713,50 +713,50 @@ - - + + - - - + - + - + + + - - + + - - - + - + - + + + @@ -781,50 +781,50 @@ - - + + - - - + - + - + + + - - + + - - - + - + - + + + @@ -878,25 +878,25 @@ - - + + - - - + - + - + + + @@ -906,25 +906,25 @@ - - + + - - - + - + - + + + @@ -955,25 +955,25 @@ - - + + - - - + - + - + + + @@ -989,25 +989,25 @@ - - + + - - - + - + - + + + @@ -1023,25 +1023,25 @@ - - + + - - - + - + - + + + @@ -1057,25 +1057,25 @@ - - + + - - - + - + - + + + @@ -1091,25 +1091,25 @@ - - + + - - - + - + - + + + @@ -1125,25 +1125,25 @@ - - + + - - - + - + - + + + @@ -1159,25 +1159,25 @@ - - + + - - - + - + - + + + @@ -1193,25 +1193,25 @@ - - + + - - - + - + - + + + @@ -1239,25 +1239,25 @@ - - + + - - - + - + - + + + @@ -1276,25 +1276,25 @@ - - + + - - - + - + - + + + @@ -1313,25 +1313,25 @@ - - + + - - - + - + - + + + @@ -1351,25 +1351,25 @@ - - + + - - - + - + - + + + @@ -1383,31 +1383,40 @@ + + + + + + + + + - - + + - - - + - + - + + + @@ -1415,50 +1424,50 @@ - - + + - - - + - + - + + + - - + + - - - + - + - + + + @@ -1488,42 +1497,42 @@ - + - + - - + + - - + + - - - + - + - + + + @@ -1542,25 +1551,25 @@ - - + + - - - + - + - + + + @@ -1576,25 +1585,25 @@ - - + + - - - + - + - + + + @@ -1618,25 +1627,25 @@ - - + + - - - + - + - + + + @@ -1649,34 +1658,38 @@ + + - + + + - - + + - - - + - + - + + + From 707b7676ec8d0f14d101d164a0617ed88e64ddd0 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Fri, 27 Mar 2020 15:27:27 -0600 Subject: [PATCH 060/136] SlD: change routine for small angles --- modules/soildyn/src/SoilDyn_IO.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/soildyn/src/SoilDyn_IO.f90 b/modules/soildyn/src/SoilDyn_IO.f90 index 62c40355c..c9224298b 100644 --- a/modules/soildyn/src/SoilDyn_IO.f90 +++ b/modules/soildyn/src/SoilDyn_IO.f90 @@ -797,7 +797,7 @@ subroutine SlD_WriteOutput(p, AllOuts, u, y, m, ErrStat, ErrMsg ) ! We have defined the referene orientatation aligned with XYZ, so we don't need as much math here. ! Small angle assumption must be valid for computations in this module, so GetSmllRotAngs extract is sufficient - Theta = real( GetSmllRotAngs(u%SoilMesh%Orientation(1:3,1:3,i)), ReKi) ! orientations are double + Theta = real( GetSmllRotAngs(u%SoilMesh%Orientation(1:3,1:3,i), ErrStat, ErrMsg), ReKi) ! orientations are double do j=1,3 AllOuts( SoilPtD(j+3,i) ) = Theta(j) enddo From e6d6468653bf3c8d19a493649ed15e6d2b846046 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Fri, 27 Mar 2020 15:31:10 -0600 Subject: [PATCH 061/136] SlD: add some more of the SlD mesh transfers --- modules/openfast-library/src/FAST_Solver.f90 | 76 ++++++++----------- modules/openfast-library/src/FAST_Subs.f90 | 77 ++++++++++++++------ 2 files changed, 84 insertions(+), 69 deletions(-) diff --git a/modules/openfast-library/src/FAST_Solver.f90 b/modules/openfast-library/src/FAST_Solver.f90 index e2e25d79f..794c62cf4 100644 --- a/modules/openfast-library/src/FAST_Solver.f90 +++ b/modules/openfast-library/src/FAST_Solver.f90 @@ -921,37 +921,6 @@ SUBROUTINE Transfer_SD_to_HD( y_SD, u_HD_M_LumpedMesh, u_HD_M_DistribMesh, MeshM END SUBROUTINE Transfer_SD_to_HD !---------------------------------------------------------------------------------------------------------------------------------- -!TODO:SlD check this routine -!> This routine transfers the SD outputs into inputs required for SlD (SoilDyn) -SUBROUTINE Transfer_SD_to_SlD( y_SD, u_SlD_SoilMotion, MeshMapData, ErrStat, ErrMsg ) -!.................................................................................................................................. - TYPE(SD_OutputType), INTENT(IN ) :: y_SD !< The outputs of the structural dynamics module - TYPE(MeshType), INTENT(INOUT) :: u_SlD_SoilMotion !< HydroDyn input mesh (separated here so that we can use temp meshes in ED_SD_HD_InputSolve) - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< data for mapping meshes - - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - ! local variables - INTEGER(IntKi) :: ErrStat2 ! temporary Error status of the operation - CHARACTER(ErrMsgLen) :: ErrMsg2 ! temporary Error message if ErrStat /= ErrID_None - - - ErrStat = ErrID_None - ErrMsg = "" - - - ! Transfer point to point only for the SD%y2Mesh (p%Nodes_C ones) -! IF ( u_SlD_SoiMotion%Committed ) THEN -! -! ! These are the motions for the lumped point loads associated viscous drag on the WAMIT body and/or filled/flooded lumped forces of the WAMIT body -! CALL Transfer_Point_to_Point( y_SD%y2Mesh, u_HD_M_LumpedMesh, MeshMapData%SD_P_2_HD_M_P, ErrStat2, ErrMsg2 ) -! CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat, ErrMsg,'Transfer_SD_to_HD (u_HD%Morison%LumpedMesh)' ) -! -! END IF - -END SUBROUTINE Transfer_SD_to_SlD -!---------------------------------------------------------------------------------------------------------------------------------- !> This routine transfers the ED outputs into inputs required for HD SUBROUTINE Transfer_ED_to_HD( y_ED, u_HD, MeshMapData, ErrStat, ErrMsg ) !.................................................................................................................................. @@ -1357,7 +1326,7 @@ END FUNCTION GetPerturb SUBROUTINE ED_HD_InputOutputSolve( this_time, p_FAST, calcJacobian & , u_ED, p_ED, x_ED, xd_ED, z_ED, OtherSt_ED, y_ED, m_ED & , u_HD, p_HD, x_HD, xd_HD, z_HD, OtherSt_HD, y_HD, m_HD & - , u_MAP, y_MAP, u_FEAM, y_FEAM, u_MD, y_MD & + , u_MAP, y_MAP, u_FEAM, y_FEAM, u_MD, y_MD, u_SlD, y_SlD & , MeshMapData , ErrStat, ErrMsg ) !.................................................................................................................................. @@ -1398,6 +1367,10 @@ SUBROUTINE ED_HD_InputOutputSolve( this_time, p_FAST, calcJacobian & TYPE(MD_OutputType), INTENT(IN ) :: y_MD !< MoorDyn outputs TYPE(MD_InputType), INTENT(INOUT) :: u_MD !< MoorDyn inputs (INOUT just because I don't want to use another tempoarary mesh and we'll overwrite this later) + !SoilDyn: + TYPE(SlD_InputType) , INTENT(INOUT) :: u_SlD !< System inputs + TYPE(SlD_OutputType) , INTENT(INOUT) :: y_SlD !< System outputs + TYPE(FAST_ModuleMapType) , INTENT(INOUT) :: MeshMapData !< data for mapping meshes between modules INTEGER(IntKi) , INTENT( OUT) :: ErrStat !< Error status of the operation CHARACTER(*) , INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None @@ -1825,7 +1798,7 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & , u_MD, y_MD & , u_IceF, y_IceF & , u_IceD, y_IceD & - , u_SlD, p_SlD, x_SlD, xd_SlD, z_SlD, OtherSt_SlD, y_SlD, m_SlD & + , u_SlD, y_SlD & , MeshMapData , ErrStat, ErrMsg ) !.................................................................................................................................. @@ -1872,16 +1845,6 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & TYPE(SD_OutputType) , INTENT(INOUT) :: y_SD !< System outputs TYPE(SD_MiscVarType) , INTENT(INOUT) :: m_SD !< misc/optimization variables - !SoilDyn: - TYPE(SlD_ContinuousStateType) , INTENT(IN ) :: x_SlD !< Continuous states - TYPE(SlD_DiscreteStateType) , INTENT(IN ) :: xd_SlD !< Discrete states - TYPE(SlD_ConstraintStateType) , INTENT(IN ) :: z_SlD !< Constraint states - TYPE(SlD_OtherStateType) , INTENT(IN ) :: OtherSt_SlD !< Other states - TYPE(SlD_ParameterType) , INTENT(IN ) :: p_SlD !< Parameters - TYPE(SlD_InputType) , INTENT(INOUT) :: u_SlD !< System inputs - TYPE(SlD_OutputType) , INTENT(INOUT) :: y_SlD !< System outputs - TYPE(SlD_MiscVarType) , INTENT(INOUT) :: m_SlD !< misc/optimization variables - !ExtPtfm: TYPE(ExtPtfm_ContinuousStateType) , INTENT(IN ) :: x_ExtPtfm !< Continuous states TYPE(ExtPtfm_DiscreteStateType) , INTENT(IN ) :: xd_ExtPtfm !< Discrete states @@ -1924,6 +1887,10 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & TYPE(IceFloe_InputType), INTENT(INOUT) :: u_IceF !< IceFloe inputs (INOUT just because I don't want to use another tempoarary mesh and we'll overwrite this later) TYPE(IceD_OutputType), INTENT(IN ) :: y_IceD(:) !< IceDyn outputs TYPE(IceD_InputType), INTENT(INOUT) :: u_IceD(:) !< IceDyn inputs (INOUT just because I don't want to use another tempoarary mesh and we'll overwrite this later) + + !SoilDyn: + TYPE(SlD_InputType) , INTENT(INOUT) :: u_SlD !< System inputs + TYPE(SlD_OutputType) , INTENT(INOUT) :: y_SlD !< System outputs TYPE(FAST_ModuleMapType) , INTENT(INOUT) :: MeshMapData !< data for mapping meshes between modules INTEGER(IntKi) , INTENT( OUT) :: ErrStat !< Error status of the operation @@ -2731,6 +2698,23 @@ SUBROUTINE U_FullOpt1_Residual( y_ED2, y_SD2, y_HD2, y_BD2, y_Orca2, y_ExtPtfm2, CALL SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) + !.................. + ! SoilDyn + !.................. + + if (p_FAST%CompSoil == Module_SlD .and. u_SlD%SoilMesh%Committed ) THEN + ! SD motions to SlD + CALL Transfer_Point_to_Point( y_SD%y2Mesh, u_SlD%SoilMesh, MeshMapData%SD_P_2_SlD_P, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat, ErrMsg,RoutineName//'Transfer_SD_to_SlD (y_SD%y2Mesh -> u_SlD%SoilMesh)' ) + ! SlD loads to SD + CALL Transfer_Point_to_Point( y_SlD%SoilMesh, MeshMapData%u_SD_LMesh_2, MeshMapData%SlD_P_2_SD_P, ErrStat2, ErrMsg2, u_SlD%SoilMesh, y_SD2%Y2Mesh ) + CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat, ErrMsg,RoutineName//'Transfer_SlD_to_SD (y_SlD%SoilMesh -> y_SD2%Y2Mesh)' ) + endif ! SoilDyn + + + !.................. + ! Ice + !.................. IF ( p_FAST%CompIce == Module_IceF ) THEN ! SD loads from IceFloe: @@ -4700,7 +4684,7 @@ SUBROUTINE SolveOption1(this_time, this_state, calcJacobian, p_FAST, ED, BD, HD, , MD%Input(1), MD%y & , IceF%Input(1), IceF%y & , IceD%Input(1,:), IceD%y & ! bjj: I don't really want to make temp copies of input types. perhaps we should pass the whole Input() structure? (likewise for BD)... - , SlD%Input(1), SlD%p, SlD%x( this_state), SlD%xd( this_state), SlD%z( this_state), SlD%OtherSt( this_state), SlD%y ,SlD%m & + , SlD%Input(1), SlD%y & , MeshMapData , ErrStat2, ErrMsg2 ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) @@ -4709,8 +4693,8 @@ SUBROUTINE SolveOption1(this_time, this_state, calcJacobian, p_FAST, ED, BD, HD, CALL ED_HD_InputOutputSolve( this_time, p_FAST, calcJacobian & , ED%Input(1), ED%p, ED%x(this_state), ED%xd(this_state), ED%z(this_state), ED%OtherSt(this_state), ED%Output(1), ED%m & - , HD%Input(1), HD%p, HD%x(this_state), HD%xd(this_state), HD%z(this_state), HD%OtherSt(this_state), HD%y, HD%m & - , MAPp%Input(1), MAPp%y, FEAM%Input(1), FEAM%y, MD%Input(1), MD%y & + , HD%Input(1), HD%p, HD%x(this_state), HD%xd(this_state), HD%z(this_state), HD%OtherSt(this_state), HD%y, HD%m & + , MAPp%Input(1), MAPp%y, FEAM%Input(1), FEAM%y, MD%Input(1), MD%y, SlD%Input(1), SlD%y & , MeshMapData , ErrStat2, ErrMsg2 ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) diff --git a/modules/openfast-library/src/FAST_Subs.f90 b/modules/openfast-library/src/FAST_Subs.f90 index 10cd39501..d94e38d6c 100644 --- a/modules/openfast-library/src/FAST_Subs.f90 +++ b/modules/openfast-library/src/FAST_Subs.f90 @@ -1956,6 +1956,11 @@ SUBROUTINE FAST_InitOutput( p_FAST, y_FAST, InitOutData_ED, InitOutData_BD, Init y_FAST%FileDescLines(2) = TRIM(y_FAST%FileDescLines(2) ) //'; '//TRIM(GetNVD(y_FAST%Module_Ver( Module_IceD ))) END IF + IF ( p_FAST%CompSoil == Module_SlD ) THEN + y_FAST%Module_Ver( Module_SlD ) = InitOutData_SlD%Ver + y_FAST%FileDescLines(2) = TRIM(y_FAST%FileDescLines(2) ) //'; '//TRIM(GetNVD(y_FAST%Module_Ver( Module_SlD ))) + END IF + !...................................................... ! Set the number of output columns from each module !...................................................... @@ -1983,6 +1988,7 @@ SUBROUTINE FAST_InitOutput( p_FAST, y_FAST, InitOutData_ED, InitOutData_BD, Init IF ( ALLOCATED( InitOutData_Orca%WriteOutputHdr ) ) y_FAST%numOuts(Module_Orca) = SIZE(InitOutData_Orca%WriteOutputHdr) IF ( ALLOCATED( InitOutData_IceF%WriteOutputHdr ) ) y_FAST%numOuts(Module_IceF) = SIZE(InitOutData_IceF%WriteOutputHdr) IF ( ALLOCATED( InitOutData_IceD%WriteOutputHdr ) ) y_FAST%numOuts(Module_IceD) = SIZE(InitOutData_IceD%WriteOutputHdr)*p_FAST%numIceLegs + IF ( ALLOCATED( InitOutData_SlD%WriteOutputHdr ) ) y_FAST%numOuts(Module_SlD) = SIZE(InitOutData_SlD%WriteOutputHdr) !...................................................... ! Initialize the output channel names and units @@ -2108,8 +2114,15 @@ SUBROUTINE FAST_InitOutput( p_FAST, y_FAST, InitOutData_ED, InitOutData_BD, Init END DO ! J END DO ! I END IF - - + + IF ( y_FAST%numOuts(Module_SlD) > 0_IntKi ) THEN !SoilDyn + indxLast = indxNext + y_FAST%numOuts(Module_SlD) - 1 + y_FAST%ChannelNames(indxNext:indxLast) = InitOutData_SlD%WriteOutputHdr + y_FAST%ChannelUnits(indxNext:indxLast) = InitOutData_SlD%WriteOutputUnt + indxNext = indxLast + 1 + END IF + + !...................................................... ! Open the text output file and print the headers !...................................................... @@ -3877,7 +3890,7 @@ SUBROUTINE FAST_Solution0(p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD14, AD, IfW, O ! Check to see if we should output data this time step: !---------------------------------------------------------------------------------------- - CALL WriteOutputToFile(0, m_FAST%t_global, p_FAST, y_FAST, ED, BD, AD14, AD, IfW, OpFM, HD, SD, ExtPtfm, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat2, ErrMsg2) + CALL WriteOutputToFile(0, m_FAST%t_global, p_FAST, y_FAST, ED, BD, AD14, AD, IfW, OpFM, HD, SD, ExtPtfm, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD, SlD, MeshMapData, ErrStat2, ErrMsg2) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) ! turn off VTK output when @@ -3885,11 +3898,11 @@ SUBROUTINE FAST_Solution0(p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD14, AD, IfW, O ! Write visualization data for initialization (and also note that we're ignoring any errors that occur doing so) IF ( p_FAST%VTK_Type == VTK_Surf ) THEN - CALL WrVTK_Surfaces(m_FAST%t_global, p_FAST, y_FAST, MeshMapData, ED, BD, AD14, AD, IfW, OpFM, HD, SD, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD) + CALL WrVTK_Surfaces(m_FAST%t_global, p_FAST, y_FAST, MeshMapData, ED, BD, AD14, AD, IfW, OpFM, HD, SD, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD, SlD) ELSE IF ( p_FAST%VTK_Type == VTK_Basic ) THEN - CALL WrVTK_BasicMeshes(p_FAST, y_FAST, MeshMapData, ED, BD, AD14, AD, IfW, OpFM, HD, SD, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD) + CALL WrVTK_BasicMeshes(p_FAST, y_FAST, MeshMapData, ED, BD, AD14, AD, IfW, OpFM, HD, SD, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD, SlD) ELSE IF ( p_FAST%VTK_Type == VTK_All ) THEN - CALL WrVTK_AllMeshes(p_FAST, y_FAST, MeshMapData, ED, BD, AD14, AD, IfW, OpFM, HD, SD, ExtPtfm, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD) + CALL WrVTK_AllMeshes(p_FAST, y_FAST, MeshMapData, ED, BD, AD14, AD, IfW, OpFM, HD, SD, ExtPtfm, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD, SlD) ELSE IF (p_FAST%VTK_Type==VTK_Old) THEN CALL WriteInputMeshesToFile( ED%Input(1), AD%Input(1), SD%Input(1), HD%Input(1), MAPp%Input(1), BD%Input(1,:), TRIM(p_FAST%OutFileRoot)//'.InputMeshes.bin', ErrStat2, ErrMsg2) !unOut = -1 @@ -4710,7 +4723,7 @@ SUBROUTINE FAST_Solution(t_initial, n_t_global, p_FAST, y_FAST, m_FAST, ED, BD, !---------------------------------------------------------------------------------------- CALL WriteOutputToFile(n_t_global+1, m_FAST%t_global, p_FAST, y_FAST, ED, BD, AD14, AD, IfW, OpFM, HD, SD, ExtPtfm, & - SrvD, MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat2, ErrMsg2) + SrvD, MAPp, FEAM, MD, Orca, IceF, IceD, SlD, MeshMapData, ErrStat2, ErrMsg2) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) !---------------------------------------------------------------------------------------- @@ -4730,7 +4743,7 @@ END SUBROUTINE FAST_Solution !> This routine determines if it's time to write to the output files, and calls the routine to write to the files !! with the output data. It should be called after all the output solves for a given time have been completed. SUBROUTINE WriteOutputToFile(n_t_global, t_global, p_FAST, y_FAST, ED, BD, AD14, AD, IfW, OpFM, HD, SD, ExtPtfm, & - SrvD, MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat, ErrMsg) + SrvD, MAPp, FEAM, MD, Orca, IceF, IceD, SlD, MeshMapData, ErrStat, ErrMsg) !............................................................................................................................... INTEGER(IntKi), INTENT(IN ) :: n_t_global !< Current global time step REAL(DbKi), INTENT(IN ) :: t_global !< Current global time @@ -4753,6 +4766,7 @@ SUBROUTINE WriteOutputToFile(n_t_global, t_global, p_FAST, y_FAST, ED, BD, AD14, TYPE(OrcaFlex_Data), INTENT(IN ) :: Orca !< OrcaFlex interface data TYPE(IceFloe_Data), INTENT(IN ) :: IceF !< IceFloe data TYPE(IceDyn_Data), INTENT(IN ) :: IceD !< All the IceDyn data used in time-step loop + TYPE(SoilDyn_Data), INTENT(IN ) :: SlD !< SoilDyn data TYPE(FAST_ModuleMapType), INTENT(IN ) :: MeshMapData !< Data for mapping between modules INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation @@ -4791,11 +4805,11 @@ SUBROUTINE WriteOutputToFile(n_t_global, t_global, p_FAST, y_FAST, ED, BD, AD14, IF ( MOD( n_t_global, p_FAST%n_VTKTime ) == 0 ) THEN IF ( p_FAST%VTK_Type == VTK_Surf ) THEN - CALL WrVTK_Surfaces(t_global, p_FAST, y_FAST, MeshMapData, ED, BD, AD14, AD, IfW, OpFM, HD, SD, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD) + CALL WrVTK_Surfaces(t_global, p_FAST, y_FAST, MeshMapData, ED, BD, AD14, AD, IfW, OpFM, HD, SD, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD, SlD) ELSE IF ( p_FAST%VTK_Type == VTK_Basic ) THEN - CALL WrVTK_BasicMeshes(p_FAST, y_FAST, MeshMapData, ED, BD, AD14, AD, IfW, OpFM, HD, SD, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD) + CALL WrVTK_BasicMeshes(p_FAST, y_FAST, MeshMapData, ED, BD, AD14, AD, IfW, OpFM, HD, SD, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD, SlD) ELSE IF ( p_FAST%VTK_Type == VTK_All ) THEN - CALL WrVTK_AllMeshes(p_FAST, y_FAST, MeshMapData, ED, BD, AD14, AD, IfW, OpFM, HD, SD, ExtPtfm, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD) + CALL WrVTK_AllMeshes(p_FAST, y_FAST, MeshMapData, ED, BD, AD14, AD, IfW, OpFM, HD, SD, ExtPtfm, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD, SlD) ELSE IF (p_FAST%VTK_Type==VTK_Old) THEN CALL WriteMotionMeshesToFile(t_global, ED%Output(1), SD%Input(1), SD%y, HD%Input(1), MAPp%Input(1), BD%y, BD%Input(1,:), y_FAST%UnGra, ErrStat2, ErrMsg2, TRIM(p_FAST%OutFileRoot)//'.gra') END IF @@ -5036,7 +5050,7 @@ SUBROUTINE FillOutputAry(p_FAST, y_FAST, IfWOutput, OpFMOutput, EDOutput, ADOutp END SUBROUTINE FillOutputAry !---------------------------------------------------------------------------------------------------------------------------------- !> This routine writes all the committed meshes to VTK-formatted files. It doesn't bother with returning an error code. -SUBROUTINE WrVTK_AllMeshes(p_FAST, y_FAST, MeshMapData, ED, BD, AD14, AD, IfW, OpFM, HD, SD, ExtPtfm, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD) +SUBROUTINE WrVTK_AllMeshes(p_FAST, y_FAST, MeshMapData, ED, BD, AD14, AD, IfW, OpFM, HD, SD, ExtPtfm, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD, SlD) TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code TYPE(FAST_OutputFileType),INTENT(IN ) :: y_FAST !< Output variables for the glue code @@ -5058,6 +5072,7 @@ SUBROUTINE WrVTK_AllMeshes(p_FAST, y_FAST, MeshMapData, ED, BD, AD14, AD, IfW, O TYPE(OrcaFlex_Data), INTENT(IN ) :: Orca !< OrcaFlex interface data TYPE(IceFloe_Data), INTENT(IN ) :: IceF !< IceFloe data TYPE(IceDyn_Data), INTENT(IN ) :: IceD !< All the IceDyn data used in time-step loop + TYPE(SoilDyn_Data), INTENT(IN ) :: SlD !< SoilDyn data logical :: outputFields ! flag to determine if we want to output the HD mesh fields @@ -5271,7 +5286,7 @@ END SUBROUTINE WrVTK_AllMeshes !---------------------------------------------------------------------------------------------------------------------------------- !> This routine writes a minimal subset of meshes (enough to visualize the turbine) to VTK-formatted files. It doesn't bother with !! returning an error code. -SUBROUTINE WrVTK_BasicMeshes(p_FAST, y_FAST, MeshMapData, ED, BD, AD14, AD, IfW, OpFM, HD, SD, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD) +SUBROUTINE WrVTK_BasicMeshes(p_FAST, y_FAST, MeshMapData, ED, BD, AD14, AD, IfW, OpFM, HD, SD, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD, SlD) TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code TYPE(FAST_OutputFileType),INTENT(IN ) :: y_FAST !< Output variables for the glue code @@ -5292,6 +5307,7 @@ SUBROUTINE WrVTK_BasicMeshes(p_FAST, y_FAST, MeshMapData, ED, BD, AD14, AD, IfW, TYPE(OrcaFlex_Data), INTENT(IN ) :: Orca !< OrcaFlex interface data TYPE(IceFloe_Data), INTENT(IN ) :: IceF !< IceFloe data TYPE(IceDyn_Data), INTENT(IN ) :: IceD !< All the IceDyn data used in time-step loop + TYPE(SoilDyn_Data), INTENT(IN ) :: SlD !< SoilDyn data logical :: OutputFields INTEGER(IntKi) :: NumBl, k, Twidth @@ -5382,7 +5398,7 @@ END SUBROUTINE WrVTK_BasicMeshes !---------------------------------------------------------------------------------------------------------------------------------- !> This routine writes a minimal subset of meshes with surfaces to VTK-formatted files. It doesn't bother with !! returning an error code. -SUBROUTINE WrVTK_Surfaces(t_global, p_FAST, y_FAST, MeshMapData, ED, BD, AD14, AD, IfW, OpFM, HD, SD, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD) +SUBROUTINE WrVTK_Surfaces(t_global, p_FAST, y_FAST, MeshMapData, ED, BD, AD14, AD, IfW, OpFM, HD, SD, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD, SlD) REAL(DbKi), INTENT(IN ) :: t_global !< Current global time TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code @@ -5404,6 +5420,7 @@ SUBROUTINE WrVTK_Surfaces(t_global, p_FAST, y_FAST, MeshMapData, ED, BD, AD14, A TYPE(OrcaFlex_Data), INTENT(IN ) :: Orca !< OrcaFlex interface data TYPE(IceFloe_Data), INTENT(IN ) :: IceF !< IceFloe data TYPE(IceDyn_Data), INTENT(IN ) :: IceD !< All the IceDyn data used in time-step loop + TYPE(SoilDyn_Data), INTENT(IN ) :: SlD !< SoilDyn data logical, parameter :: OutputFields = .FALSE. ! due to confusion about what fields mean on a surface, we are going to just output the basic meshes if people ask for fields @@ -5503,7 +5520,7 @@ SUBROUTINE WrVTK_Surfaces(t_global, p_FAST, y_FAST, MeshMapData, ED, BD, AD14, A if (p_FAST%VTK_fields) then - call WrVTK_BasicMeshes(p_FAST, y_FAST, MeshMapData, ED, BD, AD14, AD, IfW, OpFM, HD, SD, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD) + call WrVTK_BasicMeshes(p_FAST, y_FAST, MeshMapData, ED, BD, AD14, AD, IfW, OpFM, HD, SD, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD, SlD) end if @@ -5922,14 +5939,14 @@ SUBROUTINE ExitThisProgram_T( Turbine, ErrLevel_in, StopTheProgram, ErrLocMsg ) CALL ExitThisProgram( Turbine%p_FAST, Turbine%y_FAST, Turbine%m_FAST, & Turbine%ED, Turbine%BD, Turbine%SrvD, Turbine%AD14, Turbine%AD, Turbine%IfW, Turbine%OpFM, & Turbine%HD, Turbine%SD, Turbine%ExtPtfm, Turbine%MAP, Turbine%FEAM, Turbine%MD, Turbine%Orca, & - Turbine%IceF, Turbine%IceD, Turbine%MeshMapData, ErrLevel_in, StopTheProgram, ErrLocMsg ) + Turbine%IceF, Turbine%IceD, Turbine%SlD, Turbine%MeshMapData, ErrLevel_in, StopTheProgram, ErrLocMsg ) ELSE CALL ExitThisProgram( Turbine%p_FAST, Turbine%y_FAST, Turbine%m_FAST, & Turbine%ED, Turbine%BD, Turbine%SrvD, Turbine%AD14, Turbine%AD, Turbine%IfW, Turbine%OpFM, & Turbine%HD, Turbine%SD, Turbine%ExtPtfm, Turbine%MAP, Turbine%FEAM, Turbine%MD, Turbine%Orca, & - Turbine%IceF, Turbine%IceD, Turbine%MeshMapData, ErrLevel_in, StopTheProgram ) + Turbine%IceF, Turbine%IceD, Turbine%SlD, Turbine%MeshMapData, ErrLevel_in, StopTheProgram ) END IF @@ -5940,7 +5957,7 @@ END SUBROUTINE ExitThisProgram_T !! This routine should not be called from glue code (e.g., FAST_Prog.f90) or ExitThisProgram_T only. It should not be called in any !! of these driver routines. SUBROUTINE ExitThisProgram( p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD14, AD, IfW, OpFM, HD, SD, ExtPtfm, & - MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrLevel_in, StopTheProgram, ErrLocMsg ) + MAPp, FEAM, MD, Orca, IceF, IceD, SlD, MeshMapData, ErrLevel_in, StopTheProgram, ErrLocMsg ) !............................................................................................................................... ! Passed arguments @@ -5964,6 +5981,7 @@ SUBROUTINE ExitThisProgram( p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD14, AD, IfW, TYPE(OrcaFlex_Data), INTENT(INOUT) :: Orca !< OrcaFlex interface data TYPE(IceFloe_Data), INTENT(INOUT) :: IceF !< IceFloe data TYPE(IceDyn_Data), INTENT(INOUT) :: IceD !< All the IceDyn data used in time-step loop + TYPE(SoilDyn_Data), INTENT(INOUT) :: SlD !< SoilDyn data TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules @@ -5990,14 +6008,14 @@ SUBROUTINE ExitThisProgram( p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD14, AD, IfW, TmpOutFileRoot = p_FAST%OutFileRoot p_FAST%OutFileRoot = trim(p_FAST%OutFileRoot)//'.DebugError' p_FAST%VTK_fields = .true. - CALL WrVTK_AllMeshes(p_FAST, y_FAST, MeshMapData, ED, BD, AD14, AD, IfW, OpFM, HD, SD, ExtPtfm, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD) + CALL WrVTK_AllMeshes(p_FAST, y_FAST, MeshMapData, ED, BD, AD14, AD, IfW, OpFM, HD, SD, ExtPtfm, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD, SlD) p_FAST%OutFileRoot = TmpOutFileRoot end if ! End all modules - CALL FAST_EndMods( p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD14, AD, IfW, HD, SD, ExtPtfm, MAPp, FEAM, MD, Orca, IceF, IceD, ErrStat2, ErrMsg2 ) + CALL FAST_EndMods( p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD14, AD, IfW, HD, SD, ExtPtfm, MAPp, FEAM, MD, Orca, IceF, IceD, SlD, ErrStat2, ErrMsg2 ) IF (ErrStat2 /= ErrID_None) THEN CALL WrScr( NewLine//RoutineName//':'//TRIM(ErrMsg2)//NewLine ) ErrorLevel = MAX(ErrorLevel,ErrStat2) @@ -6005,7 +6023,7 @@ SUBROUTINE ExitThisProgram( p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD14, AD, IfW, ! Destroy all data associated with FAST variables: - CALL FAST_DestroyAll( p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD14, AD, IfW, OpFM, HD, SD, ExtPtfm, MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat2, ErrMsg2 ) + CALL FAST_DestroyAll( p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD14, AD, IfW, OpFM, HD, SD, ExtPtfm, MAPp, FEAM, MD, Orca, IceF, IceD, SlD, MeshMapData, ErrStat2, ErrMsg2 ) IF (ErrStat2 /= ErrID_None) THEN CALL WrScr( NewLine//RoutineName//':'//TRIM(ErrMsg2)//NewLine ) ErrorLevel = MAX(ErrorLevel,ErrStat2) @@ -6120,7 +6138,7 @@ SUBROUTINE FAST_EndOutput( p_FAST, y_FAST, ErrStat, ErrMsg ) END SUBROUTINE FAST_EndOutput !---------------------------------------------------------------------------------------------------------------------------------- !> This routine calls the end routines for each module that was previously initialized. -SUBROUTINE FAST_EndMods( p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD14, AD, IfW, HD, SD, ExtPtfm, MAPp, FEAM, MD, Orca, IceF, IceD, ErrStat, ErrMsg ) +SUBROUTINE FAST_EndMods( p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD14, AD, IfW, HD, SD, ExtPtfm, MAPp, FEAM, MD, Orca, IceF, IceD, SlD, ErrStat, ErrMsg ) TYPE(FAST_ParameterType), INTENT(INOUT) :: p_FAST !< Parameters for the glue code TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< Output variables for the glue code @@ -6141,6 +6159,8 @@ SUBROUTINE FAST_EndMods( p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD14, AD, IfW, HD TYPE(OrcaFlex_Data), INTENT(INOUT) :: Orca !< OrcaFlex interface data TYPE(IceFloe_Data), INTENT(INOUT) :: IceF !< IceFloe data TYPE(IceDyn_Data), INTENT(INOUT) :: IceD !< All the IceDyn data used in time-step loop + TYPE(SoilDyn_Data), INTENT(INOUT) :: SlD !< SoilDyn data + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None @@ -6249,12 +6269,18 @@ SUBROUTINE FAST_EndMods( p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD14, AD, IfW, HD END DO END IF + + IF ( p_FAST%ModuleInitialized(Module_SlD) ) THEN + CALL SlD_End( SlD%Input(1), SlD%p, SlD%x(STATE_CURR), SlD%xd(STATE_CURR), SlD%z(STATE_CURR), SlD%OtherSt(STATE_CURR), & + SlD%y, SlD%m, ErrStat2, ErrMsg2) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + END IF END SUBROUTINE FAST_EndMods !---------------------------------------------------------------------------------------------------------------------------------- !> This routine calls the destroy routines for each module. (It is basically a duplicate of FAST_DestroyTurbineType().) SUBROUTINE FAST_DestroyAll( p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD14, AD, IfW, OpFM, HD, SD, ExtPtfm, & - MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat, ErrMsg ) + MAPp, FEAM, MD, Orca, IceF, IceD, SlD, MeshMapData, ErrStat, ErrMsg ) TYPE(FAST_ParameterType), INTENT(INOUT) :: p_FAST !< Parameters for the glue code TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< Output variables for the glue code @@ -6276,6 +6302,7 @@ SUBROUTINE FAST_DestroyAll( p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD14, AD, IfW, TYPE(OrcaFlex_Data), INTENT(INOUT) :: Orca !< OrcaFlex interface data TYPE(IceFloe_Data), INTENT(INOUT) :: IceF !< IceFloe data TYPE(IceDyn_Data), INTENT(INOUT) :: IceD !< All the IceDyn data used in time-step loop + TYPE(SoilDyn_Data), INTENT(INOUT) :: SlD !< SoilDyn data TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules @@ -6373,6 +6400,10 @@ SUBROUTINE FAST_DestroyAll( p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD14, AD, IfW, CALL FAST_DestroyIceDyn_Data( IceD, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + ! SubDyn + CALL FAST_DestroySoilDyn_Data( SlD, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + ! Module (Mesh) Mapping data CALL FAST_DestroyModuleMapType( MeshMapData, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) From 8730da8762b120cdcdb6562367a828bb4ddf581a Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Mon, 30 Mar 2020 10:37:08 -0600 Subject: [PATCH 062/136] SlD: plumbing for outputs in glue code --- modules/openfast-library/src/FAST_Solver.f90 | 55 ++++++++++++++++---- modules/openfast-library/src/FAST_Subs.f90 | 48 +++++++++++++---- modules/soildyn/src/REDWINinterface.f90 | 3 ++ modules/soildyn/src/SoilDyn.f90 | 34 ++++++------ 4 files changed, 104 insertions(+), 36 deletions(-) diff --git a/modules/openfast-library/src/FAST_Solver.f90 b/modules/openfast-library/src/FAST_Solver.f90 index 794c62cf4..23f816bdb 100644 --- a/modules/openfast-library/src/FAST_Solver.f90 +++ b/modules/openfast-library/src/FAST_Solver.f90 @@ -2702,13 +2702,19 @@ SUBROUTINE U_FullOpt1_Residual( y_ED2, y_SD2, y_HD2, y_BD2, y_Orca2, y_ExtPtfm2, ! SoilDyn !.................. - if (p_FAST%CompSoil == Module_SlD .and. u_SlD%SoilMesh%Committed ) THEN - ! SD motions to SlD - CALL Transfer_Point_to_Point( y_SD%y2Mesh, u_SlD%SoilMesh, MeshMapData%SD_P_2_SlD_P, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat, ErrMsg,RoutineName//'Transfer_SD_to_SlD (y_SD%y2Mesh -> u_SlD%SoilMesh)' ) - ! SlD loads to SD - CALL Transfer_Point_to_Point( y_SlD%SoilMesh, MeshMapData%u_SD_LMesh_2, MeshMapData%SlD_P_2_SD_P, ErrStat2, ErrMsg2, u_SlD%SoilMesh, y_SD2%Y2Mesh ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat, ErrMsg,RoutineName//'Transfer_SlD_to_SD (y_SlD%SoilMesh -> y_SD2%Y2Mesh)' ) + if (p_FAST%CompSoil == Module_SlD) then + if ( u_SlD%SoilMesh%Committed ) THEN + ! SD motions to SlD + CALL Transfer_Point_to_Point( y_SD%y2Mesh, u_SlD%SoilMesh, MeshMapData%SD_P_2_SlD_P, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat, ErrMsg,RoutineName//'Transfer_SD_to_SlD (y_SD%y2Mesh -> u_SlD%SoilMesh)' ) + endif + if ( y_SlD%SoilMesh%Committed ) THEN + ! SlD loads to SD + CALL Transfer_Point_to_Point( y_SlD%SoilMesh, MeshMapData%u_SD_LMesh_2, MeshMapData%SlD_P_2_SD_P, ErrStat2, ErrMsg2, u_SlD%SoilMesh, y_SD2%Y2Mesh ) + CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat, ErrMsg,RoutineName//'Transfer_SlD_to_SD (y_SlD%SoilMesh -> y_SD2%Y2Mesh)' ) + MeshMapData%u_SD_LMesh%Force = MeshMapData%u_SD_LMesh%Force + MeshMapData%u_SD_LMesh_2%Force + MeshMapData%u_SD_LMesh%Moment = MeshMapData%u_SD_LMesh%Moment + MeshMapData%u_SD_LMesh_2%Moment + endif endif ! SoilDyn @@ -4667,7 +4673,16 @@ SUBROUTINE SolveOption1(this_time, this_state, calcJacobian, p_FAST, ED, BD, HD, END DO END IF - + + ! SoilDyn + IF ( p_FAST%CompSoil == Module_SlD ) THEN + + CALL SlD_CalcOutput( this_time, SlD%Input(1), SlD%p, SlD%x(this_state), SlD%xd(this_state), SlD%z(this_state), & + SlD%OtherSt(this_state), SlD%y, SlD%m, ErrStat2, ErrMsg2 ) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + + END IF + IF (ErrStat >= AbortErrLev) RETURN IF ( p_FAST%CompSub /= Module_None .OR. (p_FAST%CompElast == Module_BD .and. BD_Solve_Option1) .OR. p_FAST%CompMooring == Module_Orca ) THEN !.OR. p_FAST%CompHydro == Module_HD ) THEN @@ -5456,7 +5471,29 @@ SUBROUTINE FAST_AdvanceStates( t_initial, n_t_global, p_FAST, y_FAST, m_FAST, ED END DO END IF - + + ! SoilDyn: get predicted states + IF (p_FAST%CompSoil == Module_SlD) THEN + CALL SlD_CopyContState (SlD%x( STATE_CURR), SlD%x( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) + CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + CALL SlD_CopyDiscState (SlD%xd(STATE_CURR), SlD%xd(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) + CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + CALL SlD_CopyConstrState (SlD%z( STATE_CURR), SlD%z( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) + CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + CALL SlD_CopyOtherState( SlD%OtherSt(STATE_CURR), SlD%OtherSt(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) + CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + + DO j_ss = 1, p_FAST%n_substeps( Module_SlD ) + n_t_module = n_t_global*p_FAST%n_substeps( Module_SlD ) + j_ss - 1 + t_module = n_t_module*p_FAST%dt_module( Module_SlD ) + t_initial + + CALL SlD_UpdateStates( t_module, n_t_module, SlD%Input, SlD%InputTimes, SlD%p, SlD%x(STATE_PRED), SlD%xd(STATE_PRED), & + SlD%z(STATE_PRED), SlD%OtherSt(STATE_PRED), SlD%m, ErrStat2, ErrMsg2 ) + CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + END DO !j_ss + END IF + + END SUBROUTINE FAST_AdvanceStates !---------------------------------------------------------------------------------------------------------------------------------- !> This routine extrapolates inputs to modules to give predicted values at t+dt. diff --git a/modules/openfast-library/src/FAST_Subs.f90 b/modules/openfast-library/src/FAST_Subs.f90 index d94e38d6c..fe6594a45 100644 --- a/modules/openfast-library/src/FAST_Subs.f90 +++ b/modules/openfast-library/src/FAST_Subs.f90 @@ -4794,7 +4794,7 @@ SUBROUTINE WriteOutputToFile(n_t_global, t_global, p_FAST, y_FAST, ED, BD, AD14, CALL WrOutputLine( t_global, p_FAST, y_FAST, IfW%y%WriteOutput, OpFM%y%WriteOutput, ED%Output(1)%WriteOutput, & AD%y%WriteOutput, SrvD%y%WriteOutput, HD%y%WriteOutput, SD%y%WriteOutput, ExtPtfm%y%WriteOutput, MAPp%y%WriteOutput, & - FEAM%y%WriteOutput, MD%y%WriteOutput, Orca%y%WriteOutput, IceF%y%WriteOutput, IceD%y, BD%y, ErrStat, ErrMsg ) + FEAM%y%WriteOutput, MD%y%WriteOutput, Orca%y%WriteOutput, IceF%y%WriteOutput, SlD%y%WriteOutput, IceD%y, BD%y, ErrStat, ErrMsg ) END IF @@ -4823,7 +4823,7 @@ END SUBROUTINE WriteOutputToFile !---------------------------------------------------------------------------------------------------------------------------------- !> This routine writes the module output to the primary output file(s). SUBROUTINE WrOutputLine( t, p_FAST, y_FAST, IfWOutput, OpFMOutput, EDOutput, ADOutput, SrvDOutput, HDOutput, SDOutput, ExtPtfmOutput,& - MAPOutput, FEAMOutput, MDOutput, OrcaOutput, IceFOutput, y_IceD, y_BD, ErrStat, ErrMsg) + MAPOutput, FEAMOutput, MDOutput, OrcaOutput, IceFOutput, SlDOutput, y_IceD, y_BD, ErrStat, ErrMsg) IMPLICIT NONE @@ -4846,6 +4846,7 @@ SUBROUTINE WrOutputLine( t, p_FAST, y_FAST, IfWOutput, OpFMOutput, EDOutput, ADO REAL(ReKi), INTENT(IN) :: MDOutput (:) !< MoorDyn WriteOutput values REAL(ReKi), INTENT(IN) :: OrcaOutput (:) !< OrcaFlex interface WriteOutput values REAL(ReKi), INTENT(IN) :: IceFOutput (:) !< IceFloe WriteOutput values + REAL(ReKi), INTENT(IN) :: SlDOutput (:) !< SoilDyn WriteOutput values TYPE(IceD_OutputType), INTENT(IN) :: y_IceD (:) !< IceDyn outputs (WriteOutput values are subset) TYPE(BD_OutputType), INTENT(IN) :: y_BD (:) !< BeamDyn outputs (WriteOutput values are subset) @@ -4863,7 +4864,7 @@ SUBROUTINE WrOutputLine( t, p_FAST, y_FAST, IfWOutput, OpFMOutput, EDOutput, ADO ErrMsg = '' CALL FillOutputAry(p_FAST, y_FAST, IfWOutput, OpFMOutput, EDOutput, ADOutput, SrvDOutput, HDOutput, SDOutput, ExtPtfmOutput, & - MAPOutput, FEAMOutput, MDOutput, OrcaOutput, IceFOutput, y_IceD, y_BD, OutputAry) + MAPOutput, FEAMOutput, MDOutput, OrcaOutput, IceFOutput, SlDOutput, y_IceD, y_BD, OutputAry) IF (p_FAST%WrTxtOutFile) THEN @@ -4925,14 +4926,14 @@ SUBROUTINE FillOutputAry_T(Turbine, Outputs) Turbine%ED%Output(1)%WriteOutput, Turbine%AD%y%WriteOutput, Turbine%SrvD%y%WriteOutput, & Turbine%HD%y%WriteOutput, Turbine%SD%y%WriteOutput, Turbine%ExtPtfm%y%WriteOutput, Turbine%MAP%y%WriteOutput, & Turbine%FEAM%y%WriteOutput, Turbine%MD%y%WriteOutput, Turbine%Orca%y%WriteOutput, & - Turbine%IceF%y%WriteOutput, Turbine%IceD%y, Turbine%BD%y, Outputs) + Turbine%IceF%y%WriteOutput, Turbine%SlD%y%WriteOutput, Turbine%IceD%y, Turbine%BD%y, Outputs) END SUBROUTINE FillOutputAry_T !---------------------------------------------------------------------------------------------------------------------------------- !> This routine concatenates all of the WriteOutput values from the module Output into one array to be written to the FAST !! output file. SUBROUTINE FillOutputAry(p_FAST, y_FAST, IfWOutput, OpFMOutput, EDOutput, ADOutput, SrvDOutput, HDOutput, SDOutput, ExtPtfmOutput, & - MAPOutput, FEAMOutput, MDOutput, OrcaOutput, IceFOutput, y_IceD, y_BD, OutputAry) + MAPOutput, FEAMOutput, MDOutput, OrcaOutput, IceFOutput, SlDOutput, y_IceD, y_BD, OutputAry) TYPE(FAST_ParameterType), INTENT(IN) :: p_FAST !< Glue-code simulation parameters TYPE(FAST_OutputFileType),INTENT(IN) :: y_FAST !< Glue-code simulation outputs @@ -4950,6 +4951,7 @@ SUBROUTINE FillOutputAry(p_FAST, y_FAST, IfWOutput, OpFMOutput, EDOutput, ADOutp REAL(ReKi), INTENT(IN) :: MDOutput (:) !< MoorDyn WriteOutput values REAL(ReKi), INTENT(IN) :: OrcaOutput (:) !< OrcaFlex interface WriteOutput values REAL(ReKi), INTENT(IN) :: IceFOutput (:) !< IceFloe WriteOutput values + REAL(ReKi), INTENT(IN) :: SlDOutput (:) !< SoilDyn WriteOutput values TYPE(IceD_OutputType), INTENT(IN) :: y_IceD (:) !< IceDyn outputs (WriteOutput values are subset) TYPE(BD_OutputType), INTENT(IN) :: y_BD (:) !< BeamDyn outputs (WriteOutput values are subset) @@ -5046,7 +5048,13 @@ SUBROUTINE FillOutputAry(p_FAST, y_FAST, IfWOutput, OpFMOutput, EDOutput, ADOutp indxNext = IndxLast + 1 END DO END IF - + + IF ( y_FAST%numOuts(Module_SlD) > 0 ) THEN + indxLast = indxNext + SIZE(SlDOutput) - 1 + OutputAry(indxNext:indxLast) = SlDOutput + indxNext = IndxLast + 1 + END IF + END SUBROUTINE FillOutputAry !---------------------------------------------------------------------------------------------------------------------------------- !> This routine writes all the committed meshes to VTK-formatted files. It doesn't bother with returning an error code. @@ -5281,7 +5289,14 @@ SUBROUTINE WrVTK_AllMeshes(p_FAST, y_FAST, MeshMapData, ED, BD, AD14, AD, IfW, O END IF - +! SoilDyn + IF ( p_FAST%CompSoil == Module_SlD .and. allocated(SlD%Input)) THEN + call MeshWrVTK(p_FAST%TurbinePos, SlD%Input(1)%SoilMesh, trim(VTK_path)//'.SlD_u_SoilMesh', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, Twidth, SlD%y%SoilMesh ) + + call MeshWrVTK(p_FAST%TurbinePos, SlD%y%SoilMesh, trim(VTK_path)//'.SlD_y_SoilMesh', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, Twidth, SlD%Input(1)%SoilMesh ) + END IF + + END SUBROUTINE WrVTK_AllMeshes !---------------------------------------------------------------------------------------------------------------------------------- !> This routine writes a minimal subset of meshes (enough to visualize the turbine) to VTK-formatted files. It doesn't bother with @@ -5392,8 +5407,14 @@ SUBROUTINE WrVTK_BasicMeshes(p_FAST, y_FAST, MeshMapData, ED, BD, AD14, AD, IfW, ! ELSEIF ( p_FAST%CompMooring == Module_FEAM ) THEN ! call MeshWrVTK(p_FAST%TurbinePos, FEAM%Input(1)%PtFairleadDisplacement, trim(p_FAST%OutFileRoot)//'FEAM_PtFair_motion', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2 ) ! END IF - - + +! SoilDyn +! IF ( p_FAST%CompSub == Module_SlD ) THEN +! call MeshWrVTK(p_FAST%TurbinePos, SlD%Input(1)%SoilMesh, trim(p_FAST%OutFileRoot)//'.SlD_uSoilMesh_motion', y_FAST%VTK_count, OutputFields, ErrStat2, ErrMsg2 ) +! call MeshWrVTK(p_FAST%TurbinePos, SlD%y%SoilMesh, trim(p_FAST%OutFileRoot)//'.SlD_ySoilMesh_motion', y_FAST%VTK_count, OutputFields, ErrStat2, ErrMsg2 ) +! END IF + + END SUBROUTINE WrVTK_BasicMeshes !---------------------------------------------------------------------------------------------------------------------------------- !> This routine writes a minimal subset of meshes with surfaces to VTK-formatted files. It doesn't bother with @@ -5517,8 +5538,13 @@ SUBROUTINE WrVTK_Surfaces(t_global, p_FAST, y_FAST, MeshMapData, ED, BD, AD14, A ! ELSEIF ( p_FAST%CompMooring == Module_FEAM ) THEN ! call MeshWrVTK(p_FAST%TurbinePos, FEAM%Input(1)%PtFairleadDisplacement, trim(p_FAST%OutFileRoot)//'FEAM_PtFair_motion', y_FAST%VTK_count, OutputFields, ErrStat2, ErrMsg2 ) ! END IF - - + +! SoilDyn +! IF ( p_FAST%CompSub == Module_SlD ) THEN +! call MeshWrVTK(p_FAST%TurbinePos, SlD%Input(1)%SoilMesh, trim(p_FAST%OutFileRoot)//'.SlD_uSoilMesh_motion', y_FAST%VTK_count, OutputFields, ErrStat2, ErrMsg2 ) +! call MeshWrVTK(p_FAST%TurbinePos, SlD%y%SoilMesh, trim(p_FAST%OutFileRoot)//'.SlD_ySoilMesh_motion', y_FAST%VTK_count, OutputFields, ErrStat2, ErrMsg2 ) +! END IF + if (p_FAST%VTK_fields) then call WrVTK_BasicMeshes(p_FAST, y_FAST, MeshMapData, ED, BD, AD14, AD, IfW, OpFM, HD, SD, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD, SlD) end if diff --git a/modules/soildyn/src/REDWINinterface.f90 b/modules/soildyn/src/REDWINinterface.f90 index 6c886e47b..1f453f62d 100644 --- a/modules/soildyn/src/REDWINinterface.f90 +++ b/modules/soildyn/src/REDWINinterface.f90 @@ -124,6 +124,9 @@ subroutine CallREDWINdll ( DLL_Trgt, DLL_Model, dll_data, ErrStat, ErrMsg ) dll_data%Disp, dll_data%Force, dll_data%D ) endif #endif +#else +dll_data%Force(:)=0.0_ReKi +dll_data%Force(3)=-9.0e6_R8Ki #endif ! Call routine for error trapping the returned ErrorCodes diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index e01d696e7..c3006c703 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -367,7 +367,9 @@ subroutine SlD_End( u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) end subroutine SlD_End -!---------------------------------------------------------------------------------------------------------------------------------- +!==================================================================================================== +! The following routines were added to satisfy the framework, but do nothing useful. +!==================================================================================================== !> This is a loose coupling routine for solving constraint states, integrating continuous states, and updating discrete and other !! states. Continuous, constraint, discrete, and other states are updated to values at t + Interval. subroutine SlD_UpdateStates( t, n, Inputs, InputTimes, p, x, xd, z, OtherState, m, ErrStat, ErrMsg ) @@ -406,21 +408,21 @@ subroutine SlD_UpdateStates( t, n, Inputs, InputTimes, p, x, xd, z, OtherState, ! This subroutine contains an example of how the states could be updated. Developers will ! want to adjust the logic as necessary for their own situations. - ! Get the inputs at time t, based on the array of values sent by the glue code: - ! before calling ExtrapInterp routine, memory in u must be allocated; we can do that with a copy: - call SlD_CopyInput( Inputs(1), u, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() ! to avoid memory leaks, we have to destroy the local variables that may have allocatable arrays or meshes - return - end if - - call SlD_Input_ExtrapInterp( Inputs, InputTimes, u, t, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - return - end if +! ! Get the inputs at time t, based on the array of values sent by the glue code: +! ! before calling ExtrapInterp routine, memory in u must be allocated; we can do that with a copy: +! call SlD_CopyInput( Inputs(1), u, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) +! call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) +! if ( ErrStat >= AbortErrLev ) then +! call cleanup() ! to avoid memory leaks, we have to destroy the local variables that may have allocatable arrays or meshes +! return +! end if +! +! call SlD_Input_ExtrapInterp( Inputs, InputTimes, u, t, ErrStat2, ErrMsg2 ) +! call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) +! if ( ErrStat >= AbortErrLev ) then +! call cleanup() +! return +! end if ! Destroy local variables before returning call cleanup() From 251358eaa6a555110869dd390fbe8123605ebd51 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Mon, 30 Mar 2020 15:15:40 -0600 Subject: [PATCH 063/136] SD: Comment out unused routine --- modules/subdyn/src/SubDyn.f90 | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/subdyn/src/SubDyn.f90 b/modules/subdyn/src/SubDyn.f90 index 080df070f..835cc1081 100644 --- a/modules/subdyn/src/SubDyn.f90 +++ b/modules/subdyn/src/SubDyn.f90 @@ -1535,11 +1535,11 @@ SUBROUTINE Craig_Bampton(Init, p, m, CBparams, ErrStat, ErrMsg) contains - SUBROUTINE Fatal(ErrMsg_in) - character(len=*), intent(in) :: ErrMsg_in - CALL SetErrStat(ErrID_Fatal, ErrMsg_in, ErrStat, ErrMsg, 'Craig_Bampton'); - CALL CleanUp() - END SUBROUTINE Fatal + !SUBROUTINE Fatal(ErrMsg_in) + ! character(len=*), intent(in) :: ErrMsg_in + ! CALL SetErrStat(ErrID_Fatal, ErrMsg_in, ErrStat, ErrMsg, 'Craig_Bampton'); + ! CALL CleanUp() + !END SUBROUTINE Fatal logical function Failed() call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'Craig_Bampton') From a003e284b7b91425efd935a6d5be478fe5ba25aa Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Mon, 30 Mar 2020 16:57:48 -0600 Subject: [PATCH 064/136] SlD: case select around DLL bits, fix errors in last commit --- modules/soildyn/src/SoilDyn.f90 | 66 +++++++++++++++++------------- modules/soildyn/src/SoilDyn_IO.f90 | 2 +- 2 files changed, 39 insertions(+), 29 deletions(-) diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index c3006c703..6b58d1fd7 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -143,13 +143,16 @@ subroutine SlD_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOu call SlD_InitMeshes( InputFileData, InitInp, u, y, p, m, ErrStat2,ErrMsg2); if (Failed()) return; -!FIXME: wrap logic around this for option 3 only. - ! Initialize the dll - do j=1,size(m%dll_data) - call REDWINinterface_Init( InputFileData%DLL_FileName, InputFileData%DLL_ProcName, p%DLL_Trgt, p%DLL_Model, & - m%dll_data(j), p%UseREDWINinterface, ErrStat2, ErrMsg2); if (Failed()) return; - enddo - + select case(p%CalcOption) + case (Calc_StiffDamp) + case (Calc_PYcurve) + case (Calc_REDWIN) + ! Initialize the dll + do j=1,size(m%dll_data) + call REDWINinterface_Init( InputFileData%DLL_FileName, InputFileData%DLL_ProcName, p%DLL_Trgt, p%DLL_Model, & + m%dll_data(j), p%UseREDWINinterface, ErrStat2, ErrMsg2); if (Failed()) return; + enddo + end select ! set paramaters for I/O data InitOut%Ver = SlD_Ver @@ -188,26 +191,32 @@ subroutine SlD_InitMisc( InputFileData, m, ErrStat, ErrMsg ) ErrStat = ErrID_None ErrMsg = '' - ! Set DLL data - allocate( m%dll_data(InputFileData%DLL_NumPoints), STAT=ErrStat2 ) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Could not allocate m%dll_data', ErrStat, ErrMsg, RoutineName) - return - endif - - ! Set the input file names and check they are not too long. Existance checks done in the interface routine. - do i=1,InputFileData%DLL_NumPoints - m%dll_data(i)%PROPSfile = trim(InputFileData%DLL_PropsFile(i)) - if ( len(m%dll_data(i)%PROPSfile) < len_trim(InputFileData%DLL_PropsFile(i)) ) then - call SetErrStat(ErrID_Fatal, 'PropsFile #'//trim(Num2LStr(i))//' name is longer than '//trim(Num2LStr(len(m%dll_data(i)%PROPSfile)))// & - ' characters (DLL limititation)', ErrStat, ErrMsg, '') - endif - m%dll_data(i)%LDISPfile = trim(InputFileData%DLL_LDispFile(i)) - if ( len(m%dll_data(i)%LDISPfile) < len_trim(InputFileData%DLL_LDispFile(i)) ) then - call SetErrStat(ErrID_Fatal, 'LDispFile #'//trim(Num2LStr(i))//' name is longer than '//trim(Num2LStr(len(m%dll_data(i)%LDISPfile)))// & - ' characters (DLL limititation)', ErrStat, ErrMsg, '') - endif - enddo + select case(p%CalcOption) + case (Calc_StiffDamp) + case (Calc_PYcurve) + case (Calc_REDWIN) + !------------------- + ! Set DLL data + allocate( m%dll_data(InputFileData%DLL_NumPoints), STAT=ErrStat2 ) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Could not allocate m%dll_data', ErrStat, ErrMsg, RoutineName) + return + endif + + ! Set the input file names and check they are not too long. Existance checks done in the interface routine. + do i=1,InputFileData%DLL_NumPoints + m%dll_data(i)%PROPSfile = trim(InputFileData%DLL_PropsFile(i)) + if ( len(m%dll_data(i)%PROPSfile) < len_trim(InputFileData%DLL_PropsFile(i)) ) then + call SetErrStat(ErrID_Fatal, 'PropsFile #'//trim(Num2LStr(i))//' name is longer than '//trim(Num2LStr(len(m%dll_data(i)%PROPSfile)))// & + ' characters (DLL limititation)', ErrStat, ErrMsg, '') + endif + m%dll_data(i)%LDISPfile = trim(InputFileData%DLL_LDispFile(i)) + if ( len(m%dll_data(i)%LDISPfile) < len_trim(InputFileData%DLL_LDispFile(i)) ) then + call SetErrStat(ErrID_Fatal, 'LDispFile #'//trim(Num2LStr(i))//' name is longer than '//trim(Num2LStr(len(m%dll_data(i)%LDISPfile)))// & + ' characters (DLL limititation)', ErrStat, ErrMsg, '') + endif + enddo + end select if (ErrStat >= AbortErrLev) return end subroutine SlD_InitMisc @@ -473,7 +482,8 @@ subroutine SlD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ! Copy displacement from point mesh (angles in radians -- REDWIN dll also uses rad) Displacement(1:3) = u%SoilMesh%TranslationDisp(1:3,i) ! Translations -- This is R8Ki in the mesh - Displacement(4:6) = EulerExtract(u%SoilMesh%Orientation(1:3,1:3,i)) ! Small angle assumption should be valid here -- Note we are assuming reforientation is 0 + Displacement(4:6) = GetSmllRotAngs(u%SoilMesh%Orientation(1:3,1:3,i), ErrStat, ErrMsg) ! Small angle assumption should be valid here -- Note we are assuming reforientation is 0 + call REDWINinterface_CalcOutput( p%DLL_Trgt, p%DLL_Model, Displacement, Force, m%dll_data(i), ErrStat2, ErrMsg2 ); if (Failed()) return; ! Return force onto the resulting point mesh diff --git a/modules/soildyn/src/SoilDyn_IO.f90 b/modules/soildyn/src/SoilDyn_IO.f90 index c9224298b..82d774abf 100644 --- a/modules/soildyn/src/SoilDyn_IO.f90 +++ b/modules/soildyn/src/SoilDyn_IO.f90 @@ -799,7 +799,7 @@ subroutine SlD_WriteOutput(p, AllOuts, u, y, m, ErrStat, ErrMsg ) ! Small angle assumption must be valid for computations in this module, so GetSmllRotAngs extract is sufficient Theta = real( GetSmllRotAngs(u%SoilMesh%Orientation(1:3,1:3,i), ErrStat, ErrMsg), ReKi) ! orientations are double do j=1,3 - AllOuts( SoilPtD(j+3,i) ) = Theta(j) + AllOuts( SoilPtD(j+3,i) ) = Theta(j)*R2D enddo enddo From bf7510384c5944a722a66d4f1b14e75e17cdb180 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 7 Apr 2020 12:19:27 -0600 Subject: [PATCH 065/136] SlD: update units, fix reaction signs --- modules/soildyn/src/SoilDyn.f90 | 10 +++++++--- modules/soildyn/src/SoilDyn_IO.f90 | 4 ++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index 6b58d1fd7..937bd7bbe 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -486,9 +486,13 @@ subroutine SlD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg call REDWINinterface_CalcOutput( p%DLL_Trgt, p%DLL_Model, Displacement, Force, m%dll_data(i), ErrStat2, ErrMsg2 ); if (Failed()) return; - ! Return force onto the resulting point mesh - y%SoilMesh%Force (1:3,i) = real(Force(1:3),ReKi) - y%SoilMesh%Moment(1:3,i) = real(Force(4:6),ReKi) + ! Return reaction force onto the resulting point mesh + y%SoilMesh%Force (1,i) = -real(Force(1),ReKi) + y%SoilMesh%Force (2,i) = -real(Force(2),ReKi) + y%SoilMesh%Force (3,i) = -real(Force(3),ReKi) + y%SoilMesh%Moment(1,i) = -real(Force(4),ReKi) + y%SoilMesh%Moment(2,i) = -real(Force(5),ReKi) + y%SoilMesh%Moment(3,i) = -real(Force(6),ReKi) enddo ! Outputs diff --git a/modules/soildyn/src/SoilDyn_IO.f90 b/modules/soildyn/src/SoilDyn_IO.f90 index 82d774abf..f3398e788 100644 --- a/modules/soildyn/src/SoilDyn_IO.f90 +++ b/modules/soildyn/src/SoilDyn_IO.f90 @@ -782,12 +782,12 @@ subroutine SlD_WriteOutput(p, AllOuts, u, y, m, ErrStat, ErrMsg ) do i=1,p%NumPoints ! Forces do j=1,3 - AllOuts( SoilPtF(j ,i) ) = y%SoilMesh%Force(j,i) + AllOuts( SoilPtF(j ,i) ) = y%SoilMesh%Force(j,i) / 1000.0_ReKi enddo ! Moments do j=1,3 - AllOuts( SoilPtF(j+3,i) ) = y%SoilMesh%Moment(j,i) + AllOuts( SoilPtF(j+3,i) ) = y%SoilMesh%Moment(j,i) / 1000.0_ReKi enddo ! Translation displacement From 2e061a371af0f40a9e6ea6f58619dbd9bd057bd6 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 7 Apr 2020 15:51:54 -0600 Subject: [PATCH 066/136] SlD: initial orientaion incorrect --- modules/soildyn/src/SoilDyn.f90 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index 937bd7bbe..9e0caee49 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -280,6 +280,9 @@ subroutine SlD_InitMeshes( InputFileData, InitInp, u, y, p, m, ErrStat, ErrMsg ) ! Assuming zero orientation displacement for start DCM = 0.0_DbKi + DCM(1,1) = 1.0_DbKi + DCM(2,2) = 1.0_DbKi + DCM(3,3) = 1.0_DbKi do i=1,p%NumPoints CALL MeshPositionNode( Mesh = u%SoilMesh & From 33b9fc596cc8b91ed7459f432670049b2dbd0252 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Thu, 9 Apr 2020 11:08:36 -0600 Subject: [PATCH 067/136] SlD: move soildyn call --- modules/openfast-library/src/FAST_Solver.f90 | 41 ++++++++++---------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/modules/openfast-library/src/FAST_Solver.f90 b/modules/openfast-library/src/FAST_Solver.f90 index 23f816bdb..d36155d40 100644 --- a/modules/openfast-library/src/FAST_Solver.f90 +++ b/modules/openfast-library/src/FAST_Solver.f90 @@ -2698,26 +2698,6 @@ SUBROUTINE U_FullOpt1_Residual( y_ED2, y_SD2, y_HD2, y_BD2, y_Orca2, y_ExtPtfm2, CALL SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) - !.................. - ! SoilDyn - !.................. - - if (p_FAST%CompSoil == Module_SlD) then - if ( u_SlD%SoilMesh%Committed ) THEN - ! SD motions to SlD - CALL Transfer_Point_to_Point( y_SD%y2Mesh, u_SlD%SoilMesh, MeshMapData%SD_P_2_SlD_P, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat, ErrMsg,RoutineName//'Transfer_SD_to_SlD (y_SD%y2Mesh -> u_SlD%SoilMesh)' ) - endif - if ( y_SlD%SoilMesh%Committed ) THEN - ! SlD loads to SD - CALL Transfer_Point_to_Point( y_SlD%SoilMesh, MeshMapData%u_SD_LMesh_2, MeshMapData%SlD_P_2_SD_P, ErrStat2, ErrMsg2, u_SlD%SoilMesh, y_SD2%Y2Mesh ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat, ErrMsg,RoutineName//'Transfer_SlD_to_SD (y_SlD%SoilMesh -> y_SD2%Y2Mesh)' ) - MeshMapData%u_SD_LMesh%Force = MeshMapData%u_SD_LMesh%Force + MeshMapData%u_SD_LMesh_2%Force - MeshMapData%u_SD_LMesh%Moment = MeshMapData%u_SD_LMesh%Moment + MeshMapData%u_SD_LMesh_2%Moment - endif - endif ! SoilDyn - - !.................. ! Ice !.................. @@ -2770,7 +2750,26 @@ SUBROUTINE U_FullOpt1_Residual( y_ED2, y_SD2, y_HD2, y_BD2, y_Orca2, y_ExtPtfm2, END IF ! HD is used (IceFloe/IceDyn can't be used unless HydroDyn is used) - + !.................. + ! SoilDyn + !.................. + + if (p_FAST%CompSoil == Module_SlD) then + if ( u_SlD%SoilMesh%Committed ) THEN + ! SD motions to SlD + CALL Transfer_Point_to_Point( y_SD%y2Mesh, u_SlD%SoilMesh, MeshMapData%SD_P_2_SlD_P, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat, ErrMsg,RoutineName//'Transfer_SD_to_SlD (y_SD%y2Mesh -> u_SlD%SoilMesh)' ) + endif + if ( y_SlD%SoilMesh%Committed ) THEN + ! SlD loads to SD + CALL Transfer_Point_to_Point( y_SlD%SoilMesh, MeshMapData%u_SD_LMesh_2, MeshMapData%SlD_P_2_SD_P, ErrStat2, ErrMsg2, u_SlD%SoilMesh, y_SD2%Y2Mesh ) + CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat, ErrMsg,RoutineName//'Transfer_SlD_to_SD (y_SlD%SoilMesh -> y_SD2%Y2Mesh)' ) + MeshMapData%u_SD_LMesh%Force = MeshMapData%u_SD_LMesh%Force + MeshMapData%u_SD_LMesh_2%Force + MeshMapData%u_SD_LMesh%Moment = MeshMapData%u_SD_LMesh%Moment + MeshMapData%u_SD_LMesh_2%Moment + endif + endif ! SoilDyn + + !.................. ! Get SD motions input !.................. From c64bbc6992c01654a0dc876339d76cb0c2e25448 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Thu, 9 Apr 2020 12:41:09 -0600 Subject: [PATCH 068/136] SlD: modify solver with soildyn --- modules/openfast-library/src/FAST_Solver.f90 | 57 ++++++++++++++------ 1 file changed, 42 insertions(+), 15 deletions(-) diff --git a/modules/openfast-library/src/FAST_Solver.f90 b/modules/openfast-library/src/FAST_Solver.f90 index d36155d40..e0f176370 100644 --- a/modules/openfast-library/src/FAST_Solver.f90 +++ b/modules/openfast-library/src/FAST_Solver.f90 @@ -1162,6 +1162,27 @@ SUBROUTINE IceD_InputSolve( u_IceD, y_SD, MeshMapData, legNum, ErrStat, ErrMsg ) END SUBROUTINE IceD_InputSolve !---------------------------------------------------------------------------------------------------------------------------------- !> This routine sets the inputs required for IceFloe. +SUBROUTINE SlD_InputSolve( u_SlD, y_SD, MeshMapData, ErrStat, ErrMsg ) +!.................................................................................................................................. + + ! Passed variables + TYPE(SlD_InputType), INTENT(INOUT) :: u_SlD !< SoilDyn input + TYPE(SD_OutputType), INTENT(IN ) :: y_SD !< SubDyn outputs + TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< data for mapping meshes between modules + + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation + CHARACTER(*) , INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + + !---------------------------------------------------------------------------------------------------- + ! Map SD outputs to SoilDyn inputs + !---------------------------------------------------------------------------------------------------- + ! motions: + CALL Transfer_Point_to_Point( y_SD%y2Mesh, u_SlD%SoilMesh, MeshMapData%SD_P_2_SlD_P, ErrStat, ErrMsg ) + +END SUBROUTINE SlD_InputSolve +!---------------------------------------------------------------------------------------------------------------------------------- +!> This routine sets the inputs required for BeamDyn. SUBROUTINE Transfer_ED_to_BD( y_ED, u_BD, MeshMapData, ErrStat, ErrMsg ) !.................................................................................................................................. @@ -1326,7 +1347,7 @@ END FUNCTION GetPerturb SUBROUTINE ED_HD_InputOutputSolve( this_time, p_FAST, calcJacobian & , u_ED, p_ED, x_ED, xd_ED, z_ED, OtherSt_ED, y_ED, m_ED & , u_HD, p_HD, x_HD, xd_HD, z_HD, OtherSt_HD, y_HD, m_HD & - , u_MAP, y_MAP, u_FEAM, y_FEAM, u_MD, y_MD, u_SlD, y_SlD & + , u_MAP, y_MAP, u_FEAM, y_FEAM, u_MD, y_MD & , MeshMapData , ErrStat, ErrMsg ) !.................................................................................................................................. @@ -1367,10 +1388,6 @@ SUBROUTINE ED_HD_InputOutputSolve( this_time, p_FAST, calcJacobian & TYPE(MD_OutputType), INTENT(IN ) :: y_MD !< MoorDyn outputs TYPE(MD_InputType), INTENT(INOUT) :: u_MD !< MoorDyn inputs (INOUT just because I don't want to use another tempoarary mesh and we'll overwrite this later) - !SoilDyn: - TYPE(SlD_InputType) , INTENT(INOUT) :: u_SlD !< System inputs - TYPE(SlD_OutputType) , INTENT(INOUT) :: y_SlD !< System outputs - TYPE(FAST_ModuleMapType) , INTENT(INOUT) :: MeshMapData !< data for mapping meshes between modules INTEGER(IntKi) , INTENT( OUT) :: ErrStat !< Error status of the operation CHARACTER(*) , INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None @@ -1913,7 +1930,6 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & TYPE(ED_OutputType) :: y_ED_perturb ! Perturbed system outputs TYPE(SD_InputType) :: u_SD_perturb ! Perturbed system inputs TYPE(SD_OutputType) :: y_SD_perturb ! Perturbed system outputs -!FIXME:SlD do we need to ad SlD here? TYPE(HydroDyn_InputType) :: u_HD_perturb ! Perturbed system inputs TYPE(HydroDyn_OutputType) :: y_HD_perturb ! Perturbed system outputs TYPE(BD_InputType) :: u_BD_perturb ! Perturbed system inputs @@ -2321,6 +2337,7 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & CALL WrFileNR(UnJac, ' SD_TPMesh_RotationAcc_Z_'//TRIM(Num2LStr(TmpIndx))) END DO + IF ( p_FAST%CompHydro == Module_HD ) THEN ! this SD mesh linked only when HD is enabled DO TmpIndx=1,u_SD%LMesh%NNodes CALL WrFileNR(UnJac, ' SD_LMesh_Force_X_'//TRIM(Num2LStr(TmpIndx))) @@ -2526,6 +2543,7 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & END IF + IF ( p_FAST%CompSub == Module_SD ) THEN !............... ! SD motion inputs: (from ED) @@ -2645,7 +2663,15 @@ SUBROUTINE U_FullOpt1_Residual( y_ED2, y_SD2, y_HD2, y_BD2, y_Orca2, y_ExtPtfm2, END DO END IF - + + + IF (p_FAST%CompSoil == Module_SlD) THEN + ! Map Subdyn motion to SoilDyn + CALL SlD_InputSolve( u_SlD, y_SD2, MeshMapData, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) + END IF + + IF ( p_FAST%CompElast == Module_BD .and. BD_Solve_Option1) THEN ! Transfer ED motions to BD inputs: @@ -2755,11 +2781,6 @@ SUBROUTINE U_FullOpt1_Residual( y_ED2, y_SD2, y_HD2, y_BD2, y_Orca2, y_ExtPtfm2, !.................. if (p_FAST%CompSoil == Module_SlD) then - if ( u_SlD%SoilMesh%Committed ) THEN - ! SD motions to SlD - CALL Transfer_Point_to_Point( y_SD%y2Mesh, u_SlD%SoilMesh, MeshMapData%SD_P_2_SlD_P, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat, ErrMsg,RoutineName//'Transfer_SD_to_SlD (y_SD%y2Mesh -> u_SlD%SoilMesh)' ) - endif if ( y_SlD%SoilMesh%Committed ) THEN ! SlD loads to SD CALL Transfer_Point_to_Point( y_SlD%SoilMesh, MeshMapData%u_SD_LMesh_2, MeshMapData%SlD_P_2_SD_P, ErrStat2, ErrMsg2, u_SlD%SoilMesh, y_SD2%Y2Mesh ) @@ -4697,8 +4718,8 @@ SUBROUTINE SolveOption1(this_time, this_state, calcJacobian, p_FAST, ED, BD, HD, , FEAM%Input(1), FEAM%y & , MD%Input(1), MD%y & , IceF%Input(1), IceF%y & - , IceD%Input(1,:), IceD%y & ! bjj: I don't really want to make temp copies of input types. perhaps we should pass the whole Input() structure? (likewise for BD)... - , SlD%Input(1), SlD%y & + , IceD%Input(1,:), IceD%y & ! bjj: I don't really want to make temp copies of input types. perhaps we should pass the whole Input() structure? (likewise for BD)... + , SlD%Input(1), SlD%y & ! adp: this is only coupled to SD at present , MeshMapData , ErrStat2, ErrMsg2 ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) @@ -4708,7 +4729,7 @@ SUBROUTINE SolveOption1(this_time, this_state, calcJacobian, p_FAST, ED, BD, HD, CALL ED_HD_InputOutputSolve( this_time, p_FAST, calcJacobian & , ED%Input(1), ED%p, ED%x(this_state), ED%xd(this_state), ED%z(this_state), ED%OtherSt(this_state), ED%Output(1), ED%m & , HD%Input(1), HD%p, HD%x(this_state), HD%xd(this_state), HD%z(this_state), HD%OtherSt(this_state), HD%y, HD%m & - , MAPp%Input(1), MAPp%y, FEAM%Input(1), FEAM%y, MD%Input(1), MD%y, SlD%Input(1), SlD%y & + , MAPp%Input(1), MAPp%y, FEAM%Input(1), FEAM%y, MD%Input(1), MD%y & , MeshMapData , ErrStat2, ErrMsg2 ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) @@ -4754,6 +4775,12 @@ SUBROUTINE SolveOption1(this_time, this_state, calcJacobian, p_FAST, ED, BD, HD, END IF + IF (p_FAST%CompSoil == Module_SlD) THEN + ! Map Subdyn motion to SoilDyn + CALL SlD_InputSolve( SlD%Input(1), SD%y, MeshMapData, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) + END IF + #ifdef DEBUG_MESH_TRANSFER_ICE CALL WrScr('********************************************************') CALL WrScr('**** IceF to SD point-to-point *****') From 15d6348afc34a52ed80483645e929a67c4a67530 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Thu, 9 Apr 2020 15:08:16 -0600 Subject: [PATCH 069/136] SlD: update types file for ED (from merge) --- modules/elastodyn/src/ElastoDyn_Types.f90 | 27 +++++++++-------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/modules/elastodyn/src/ElastoDyn_Types.f90 b/modules/elastodyn/src/ElastoDyn_Types.f90 index ba6ff761e..8e96a90a8 100644 --- a/modules/elastodyn/src/ElastoDyn_Types.f90 +++ b/modules/elastodyn/src/ElastoDyn_Types.f90 @@ -11168,14 +11168,8 @@ SUBROUTINE ED_PackRtHndSide( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg IntKiBuf( Int_Xferred + 1) = UBOUND(InData%AngVelEM,3) Int_Xferred = Int_Xferred + 2 - DO i3 = LBOUND(InData%AngVelEM,3), UBOUND(InData%AngVelEM,3) - DO i2 = LBOUND(InData%AngVelEM,2), UBOUND(InData%AngVelEM,2) - DO i1 = LBOUND(InData%AngVelEM,1), UBOUND(InData%AngVelEM,1) - ReKiBuf(Re_Xferred) = InData%AngVelEM(i1,i2,i3) - Re_Xferred = Re_Xferred + 1 - END DO - END DO - END DO + IF (SIZE(InData%AngVelEM)>0) ReKiBuf ( Re_Xferred:Re_Xferred+(SIZE(InData%AngVelEM))-1 ) = PACK(InData%AngVelEM,.TRUE.) + Re_Xferred = Re_Xferred + SIZE(InData%AngVelEM) END IF IF ( .NOT. ALLOCATED(InData%PAngVelEN) ) THEN IntKiBuf( Int_Xferred ) = 0 @@ -12952,14 +12946,15 @@ SUBROUTINE ED_UnPackRtHndSide( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Err CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%AngVelEM.', ErrStat, ErrMsg,RoutineName) RETURN END IF - DO i3 = LBOUND(OutData%AngVelEM,3), UBOUND(OutData%AngVelEM,3) - DO i2 = LBOUND(OutData%AngVelEM,2), UBOUND(OutData%AngVelEM,2) - DO i1 = LBOUND(OutData%AngVelEM,1), UBOUND(OutData%AngVelEM,1) - OutData%AngVelEM(i1,i2,i3) = ReKiBuf(Re_Xferred) - Re_Xferred = Re_Xferred + 1 - END DO - END DO - END DO + ALLOCATE(mask3(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating mask3.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + mask3 = .TRUE. + IF (SIZE(OutData%AngVelEM)>0) OutData%AngVelEM = UNPACK(ReKiBuf( Re_Xferred:Re_Xferred+(SIZE(OutData%AngVelEM))-1 ), mask3, 0.0_ReKi ) + Re_Xferred = Re_Xferred + SIZE(OutData%AngVelEM) + DEALLOCATE(mask3) END IF IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! PAngVelEN not allocated Int_Xferred = Int_Xferred + 1 From 012ca2626d8dd0a3025f0a33e030a272fe270da3 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Mon, 13 Apr 2020 09:45:44 -0600 Subject: [PATCH 070/136] SlD: add stiffness matrix option --- modules/openfast-library/src/FAST_Library.f90 | 2 +- modules/soildyn/src/SoilDyn.f90 | 64 +++++++++++++------ modules/soildyn/src/SoilDyn_IO.f90 | 3 + modules/soildyn/src/SoilDyn_Registry.txt | 7 +- modules/soildyn/src/SoilDyn_Types.f90 | 58 +++++++++++++---- 5 files changed, 98 insertions(+), 36 deletions(-) diff --git a/modules/openfast-library/src/FAST_Library.f90 b/modules/openfast-library/src/FAST_Library.f90 index c1d1aa099..b71ab2841 100644 --- a/modules/openfast-library/src/FAST_Library.f90 +++ b/modules/openfast-library/src/FAST_Library.f90 @@ -207,7 +207,7 @@ subroutine FAST_Start(iTurb, NumInputs_c, NumOutputs_c, InputAry, OutputAry, Err OutputAry(1) = Turbine(iTurb)%m_FAST%t_global OutputAry(2:NumOutputs_c) = Outputs - CALL FAST_Linearize_T(t_initial, 0, Turbine(iTurb), ErrStat, ErrMsg) + CALL FAST_Linearize_T(t_initial, 0, Turbine(iTurb), ErrStat2, ErrMsg2) if (ErrStat2 /= ErrID_None) then ErrStat = max(ErrStat,ErrStat2) ErrMsg = TRIM(ErrMsg)//NewLine//TRIM(ErrMsg2) diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index 9e0caee49..0d743fe0e 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -112,6 +112,8 @@ subroutine SlD_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOu p%DT = Interval p%DLL_Model = InputFileData%DLL_Model p%CalcOption = InputFileData%CalcOption + p%Stiffness = InputFileData%Stiffness +! p%Damping = InputFileData%Damping ! Define initial system states here: x%DummyContState = 0.0_ReKi @@ -242,10 +244,10 @@ subroutine SlD_InitMeshes( InputFileData, InitInp, u, y, p, m, ErrStat, ErrMsg ) p%NumPoints = 1_IntKi !FIXME: update to allow more than one set of points ! NumPoints = InputFileData%StiffDamp_NumPoints -! call AllocAry(MeshLocations,3,p%NumPoints,'Mesh locations',ErrStat2,ErrMsg2); -! do i=1,size(MeshLocations,2) -! MeshLocations(1:3,i) = InputFileData%StiffDamp_locations(1:3,i) -! enddo + call AllocAry(MeshLocations,3,1,'Mesh locations',ErrStat2,ErrMsg2); + do i=1,size(MeshLocations,2) + MeshLocations(1:3,i) = InputFileData%SD_locations(1:3) + enddo case (Calc_PYcurve) p%NumPoints = InputFileData%PY_NumPoints call AllocAry(MeshLocations,3,p%NumPoints,'Mesh locations',ErrStat2,ErrMsg2); @@ -479,24 +481,44 @@ subroutine SlD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ErrStat = ErrID_None ErrMsg = "" -!FIXME: wrap logic around this for option 3 only - ! Initialize the dll - do i=1,size(m%dll_data) - - ! Copy displacement from point mesh (angles in radians -- REDWIN dll also uses rad) - Displacement(1:3) = u%SoilMesh%TranslationDisp(1:3,i) ! Translations -- This is R8Ki in the mesh - Displacement(4:6) = GetSmllRotAngs(u%SoilMesh%Orientation(1:3,1:3,i), ErrStat, ErrMsg) ! Small angle assumption should be valid here -- Note we are assuming reforientation is 0 - - call REDWINinterface_CalcOutput( p%DLL_Trgt, p%DLL_Model, Displacement, Force, m%dll_data(i), ErrStat2, ErrMsg2 ); if (Failed()) return; + select case(p%CalcOption) + case (Calc_StiffDamp) + + ! Copy displacement from point mesh (angles in radians -- REDWIN dll also uses rad) + Displacement(1:3) = u%SoilMesh%TranslationDisp(1:3,1) ! Translations -- This is R8Ki in the mesh + Displacement(4:6) = GetSmllRotAngs(u%SoilMesh%Orientation(1:3,1:3,1), ErrStat, ErrMsg) ! Small angle assumption should be valid here -- Note we are assuming reforientation is 0 + + ! Calculate reaction with F = k*dX + Force = matmul(p%Stiffness, Displacement) + + ! Return reaction force onto the resulting point mesh + y%SoilMesh%Force (1,1) = -real(Force(1),ReKi) + y%SoilMesh%Force (2,1) = -real(Force(2),ReKi) + y%SoilMesh%Force (3,1) = -real(Force(3),ReKi) + y%SoilMesh%Moment(1,1) = -real(Force(4),ReKi) + y%SoilMesh%Moment(2,1) = -real(Force(5),ReKi) + y%SoilMesh%Moment(3,1) = -real(Force(6),ReKi) - ! Return reaction force onto the resulting point mesh - y%SoilMesh%Force (1,i) = -real(Force(1),ReKi) - y%SoilMesh%Force (2,i) = -real(Force(2),ReKi) - y%SoilMesh%Force (3,i) = -real(Force(3),ReKi) - y%SoilMesh%Moment(1,i) = -real(Force(4),ReKi) - y%SoilMesh%Moment(2,i) = -real(Force(5),ReKi) - y%SoilMesh%Moment(3,i) = -real(Force(6),ReKi) - enddo + case (Calc_PYcurve) + case (Calc_REDWIN) + ! call the dll + do i=1,size(m%dll_data) + + ! Copy displacement from point mesh (angles in radians -- REDWIN dll also uses rad) + Displacement(1:3) = u%SoilMesh%TranslationDisp(1:3,i) ! Translations -- This is R8Ki in the mesh + Displacement(4:6) = GetSmllRotAngs(u%SoilMesh%Orientation(1:3,1:3,i), ErrStat, ErrMsg) ! Small angle assumption should be valid here -- Note we are assuming reforientation is 0 + + call REDWINinterface_CalcOutput( p%DLL_Trgt, p%DLL_Model, Displacement, Force, m%dll_data(i), ErrStat2, ErrMsg2 ); if (Failed()) return; + + ! Return reaction force onto the resulting point mesh + y%SoilMesh%Force (1,i) = -real(Force(1),ReKi) + y%SoilMesh%Force (2,i) = -real(Force(2),ReKi) + y%SoilMesh%Force (3,i) = -real(Force(3),ReKi) + y%SoilMesh%Moment(1,i) = -real(Force(4),ReKi) + y%SoilMesh%Moment(2,i) = -real(Force(5),ReKi) + y%SoilMesh%Moment(3,i) = -real(Force(6),ReKi) + enddo + end select ! Outputs call SlD_WriteOutput( p, AllOuts, u, y, m, ErrStat2, ErrMsg2 ); if (Failed()) return; diff --git a/modules/soildyn/src/SoilDyn_IO.f90 b/modules/soildyn/src/SoilDyn_IO.f90 index f3398e788..e728ec4b8 100644 --- a/modules/soildyn/src/SoilDyn_IO.f90 +++ b/modules/soildyn/src/SoilDyn_IO.f90 @@ -297,6 +297,9 @@ subroutine SlD_ReadInput( InputFileName, EchoFileName, InputFileData, ErrStat, E ! K51 = -K42 ! K55 = K44 + ! Location + call ReadAry( UnitInput, InputFileName, InputFileData%SD_locations(1:3), 3, 'SD_locations', 'Stiffness Damping location', TmpErrStat, TmpErrMsg, UnitEcho); if (Failed()) return; + ! Stiffness call ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line', TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; do i=1,6 diff --git a/modules/soildyn/src/SoilDyn_Registry.txt b/modules/soildyn/src/SoilDyn_Registry.txt index 879d4736f..3d8176264 100644 --- a/modules/soildyn/src/SoilDyn_Registry.txt +++ b/modules/soildyn/src/SoilDyn_Registry.txt @@ -42,8 +42,9 @@ typedef ^ SlD_InputFile LOGICAL EchoFlag - - - "E typedef ^ SlD_InputFile CHARACTER(ChanLen) OutList : - - "List of user-requested output channels" - typedef ^ SlD_InputFile R8Ki DT - - - "Timestep requested" '(s)' typedef ^ SlD_InputFile IntKi CalcOption - - - "Calculation methodology to use" - -typedef ^ SlD_InputFile ReKi Stiffness {6}{6} - - "Stiffness matrix 6x6" '(N/m, N-m/rad)' -typedef ^ SlD_InputFile ReKi Damping {6}{6} - - "Damping ratio matrix 6x6" - +typedef ^ SlD_InputFile ReKi SD_locations 3 - - "Location of the Stiffness damping point" '(m)' +typedef ^ SlD_InputFile R8Ki Stiffness {6}{6} - - "Stiffness matrix 6x6" '(N/m, N-m/rad)' +typedef ^ SlD_InputFile R8Ki Damping {6}{6} - - "Damping ratio matrix 6x6" - typedef ^ SlD_InputFile IntKi PY_numpoints - - - "Number of P-Y curve mesh points" - typedef ^ SlD_InputFile ReKi PY_locations :: - - "P-Y curve location points for mesh" '(m)' typedef ^ SlD_InputFile character(1024) PY_inputFile : - - "Input file with P-Y curve data" - @@ -124,6 +125,8 @@ typedef ^ ParameterType IntKi NumOuts typedef ^ ParameterType IntKi NumPoints - - - "Number of points interfacing soil with" - typedef ^ ParameterType ReKi WtrDepth - - - "Water depth to mudline (global coordinates)" '(m)' typedef ^ ParameterType IntKi Nodes_C {:}{:} - - "Nodes in input mesh that reaction force may be applied to" '(-)' +typedef ^ ParameterType R8Ki Stiffness {6}{6} - - "Stiffness matrix" '(N/m, N-m/rad)' +#typedef ^ ParameterType R8Ki Damping {6}{6} - - "Damping matrix" '(N/m, N-m/rad)' # ..... Inputs .................................................................................................................... typedef ^ InputType MeshType SoilMesh - - - "Mesh of soil contact points" - diff --git a/modules/soildyn/src/SoilDyn_Types.f90 b/modules/soildyn/src/SoilDyn_Types.f90 index 2144f97c0..dbf73fd03 100644 --- a/modules/soildyn/src/SoilDyn_Types.f90 +++ b/modules/soildyn/src/SoilDyn_Types.f90 @@ -59,8 +59,9 @@ MODULE SoilDyn_Types CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: OutList !< List of user-requested output channels [-] REAL(R8Ki) :: DT !< Timestep requested ['(s)'] INTEGER(IntKi) :: CalcOption !< Calculation methodology to use [-] - REAL(ReKi) , DIMENSION(1:6,1:6) :: Stiffness !< Stiffness matrix 6x6 ['(N/m,] - REAL(ReKi) , DIMENSION(1:6,1:6) :: Damping !< Damping ratio matrix 6x6 [-] + REAL(ReKi) , DIMENSION(1:3) :: SD_locations !< Location of the Stiffness damping point ['(m)'] + REAL(R8Ki) , DIMENSION(1:6,1:6) :: Stiffness !< Stiffness matrix 6x6 ['(N/m,] + REAL(R8Ki) , DIMENSION(1:6,1:6) :: Damping !< Damping ratio matrix 6x6 [-] INTEGER(IntKi) :: PY_numpoints !< Number of P-Y curve mesh points [-] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: PY_locations !< P-Y curve location points for mesh ['(m)'] character(1024) , DIMENSION(:), ALLOCATABLE :: PY_inputFile !< Input file with P-Y curve data [-] @@ -133,6 +134,7 @@ MODULE SoilDyn_Types INTEGER(IntKi) :: NumPoints !< Number of points interfacing soil with [-] REAL(ReKi) :: WtrDepth !< Water depth to mudline (global coordinates) ['(m)'] INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: Nodes_C !< Nodes in input mesh that reaction force may be applied to ['(-)'] + REAL(R8Ki) , DIMENSION(1:6,1:6) :: Stiffness !< Stiffness matrix ['(N/m,] END TYPE SlD_ParameterType ! ======================= ! ========= SlD_InputType ======= @@ -465,6 +467,7 @@ SUBROUTINE SlD_CopyInputFile( SrcInputFileData, DstInputFileData, CtrlCode, ErrS ENDIF DstInputFileData%DT = SrcInputFileData%DT DstInputFileData%CalcOption = SrcInputFileData%CalcOption + DstInputFileData%SD_locations = SrcInputFileData%SD_locations DstInputFileData%Stiffness = SrcInputFileData%Stiffness DstInputFileData%Damping = SrcInputFileData%Damping DstInputFileData%PY_numpoints = SrcInputFileData%PY_numpoints @@ -612,8 +615,9 @@ SUBROUTINE SlD_PackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs END IF Db_BufSz = Db_BufSz + 1 ! DT Int_BufSz = Int_BufSz + 1 ! CalcOption - Re_BufSz = Re_BufSz + SIZE(InData%Stiffness) ! Stiffness - Re_BufSz = Re_BufSz + SIZE(InData%Damping) ! Damping + Re_BufSz = Re_BufSz + SIZE(InData%SD_locations) ! SD_locations + Db_BufSz = Db_BufSz + SIZE(InData%Stiffness) ! Stiffness + Db_BufSz = Db_BufSz + SIZE(InData%Damping) ! Damping Int_BufSz = Int_BufSz + 1 ! PY_numpoints Int_BufSz = Int_BufSz + 1 ! PY_locations allocated yes/no IF ( ALLOCATED(InData%PY_locations) ) THEN @@ -696,10 +700,12 @@ SUBROUTINE SlD_PackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs Db_Xferred = Db_Xferred + 1 IntKiBuf ( Int_Xferred:Int_Xferred+(1)-1 ) = InData%CalcOption Int_Xferred = Int_Xferred + 1 - ReKiBuf ( Re_Xferred:Re_Xferred+(SIZE(InData%Stiffness))-1 ) = PACK(InData%Stiffness,.TRUE.) - Re_Xferred = Re_Xferred + SIZE(InData%Stiffness) - ReKiBuf ( Re_Xferred:Re_Xferred+(SIZE(InData%Damping))-1 ) = PACK(InData%Damping,.TRUE.) - Re_Xferred = Re_Xferred + SIZE(InData%Damping) + ReKiBuf ( Re_Xferred:Re_Xferred+(SIZE(InData%SD_locations))-1 ) = PACK(InData%SD_locations,.TRUE.) + Re_Xferred = Re_Xferred + SIZE(InData%SD_locations) + DbKiBuf ( Db_Xferred:Db_Xferred+(SIZE(InData%Stiffness))-1 ) = PACK(InData%Stiffness,.TRUE.) + Db_Xferred = Db_Xferred + SIZE(InData%Stiffness) + DbKiBuf ( Db_Xferred:Db_Xferred+(SIZE(InData%Damping))-1 ) = PACK(InData%Damping,.TRUE.) + Db_Xferred = Db_Xferred + SIZE(InData%Damping) IntKiBuf ( Int_Xferred:Int_Xferred+(1)-1 ) = InData%PY_numpoints Int_Xferred = Int_Xferred + 1 IF ( .NOT. ALLOCATED(InData%PY_locations) ) THEN @@ -870,6 +876,17 @@ SUBROUTINE SlD_UnPackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er Db_Xferred = Db_Xferred + 1 OutData%CalcOption = IntKiBuf( Int_Xferred ) Int_Xferred = Int_Xferred + 1 + i1_l = LBOUND(OutData%SD_locations,1) + i1_u = UBOUND(OutData%SD_locations,1) + ALLOCATE(mask1(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating mask1.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + mask1 = .TRUE. + OutData%SD_locations = UNPACK(ReKiBuf( Re_Xferred:Re_Xferred+(SIZE(OutData%SD_locations))-1 ), mask1, 0.0_ReKi ) + Re_Xferred = Re_Xferred + SIZE(OutData%SD_locations) + DEALLOCATE(mask1) i1_l = LBOUND(OutData%Stiffness,1) i1_u = UBOUND(OutData%Stiffness,1) i2_l = LBOUND(OutData%Stiffness,2) @@ -880,8 +897,8 @@ SUBROUTINE SlD_UnPackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er RETURN END IF mask2 = .TRUE. - OutData%Stiffness = UNPACK(ReKiBuf( Re_Xferred:Re_Xferred+(SIZE(OutData%Stiffness))-1 ), mask2, 0.0_ReKi ) - Re_Xferred = Re_Xferred + SIZE(OutData%Stiffness) + OutData%Stiffness = REAL( UNPACK(DbKiBuf( Db_Xferred:Db_Xferred+(SIZE(OutData%Stiffness))-1 ), mask2, 0.0_DbKi ), R8Ki) + Db_Xferred = Db_Xferred + SIZE(OutData%Stiffness) DEALLOCATE(mask2) i1_l = LBOUND(OutData%Damping,1) i1_u = UBOUND(OutData%Damping,1) @@ -893,8 +910,8 @@ SUBROUTINE SlD_UnPackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er RETURN END IF mask2 = .TRUE. - OutData%Damping = UNPACK(ReKiBuf( Re_Xferred:Re_Xferred+(SIZE(OutData%Damping))-1 ), mask2, 0.0_ReKi ) - Re_Xferred = Re_Xferred + SIZE(OutData%Damping) + OutData%Damping = REAL( UNPACK(DbKiBuf( Db_Xferred:Db_Xferred+(SIZE(OutData%Damping))-1 ), mask2, 0.0_DbKi ), R8Ki) + Db_Xferred = Db_Xferred + SIZE(OutData%Damping) DEALLOCATE(mask2) OutData%PY_numpoints = IntKiBuf( Int_Xferred ) Int_Xferred = Int_Xferred + 1 @@ -2410,6 +2427,7 @@ SUBROUTINE SlD_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg END IF DstParamData%Nodes_C = SrcParamData%Nodes_C ENDIF + DstParamData%Stiffness = SrcParamData%Stiffness END SUBROUTINE SlD_CopyParam SUBROUTINE SlD_DestroyParam( ParamData, ErrStat, ErrMsg ) @@ -2526,6 +2544,7 @@ SUBROUTINE SlD_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, S Int_BufSz = Int_BufSz + 2*2 ! Nodes_C upper/lower bounds for each dimension Int_BufSz = Int_BufSz + SIZE(InData%Nodes_C) ! Nodes_C END IF + Db_BufSz = Db_BufSz + SIZE(InData%Stiffness) ! Stiffness IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) THEN @@ -2670,6 +2689,8 @@ SUBROUTINE SlD_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, S IF (SIZE(InData%Nodes_C)>0) IntKiBuf ( Int_Xferred:Int_Xferred+(SIZE(InData%Nodes_C))-1 ) = PACK(InData%Nodes_C,.TRUE.) Int_Xferred = Int_Xferred + SIZE(InData%Nodes_C) END IF + DbKiBuf ( Db_Xferred:Db_Xferred+(SIZE(InData%Stiffness))-1 ) = PACK(InData%Stiffness,.TRUE.) + Db_Xferred = Db_Xferred + SIZE(InData%Stiffness) END SUBROUTINE SlD_PackParam SUBROUTINE SlD_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) @@ -2860,6 +2881,19 @@ SUBROUTINE SlD_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg Int_Xferred = Int_Xferred + SIZE(OutData%Nodes_C) DEALLOCATE(mask2) END IF + i1_l = LBOUND(OutData%Stiffness,1) + i1_u = UBOUND(OutData%Stiffness,1) + i2_l = LBOUND(OutData%Stiffness,2) + i2_u = UBOUND(OutData%Stiffness,2) + ALLOCATE(mask2(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating mask2.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + mask2 = .TRUE. + OutData%Stiffness = REAL( UNPACK(DbKiBuf( Db_Xferred:Db_Xferred+(SIZE(OutData%Stiffness))-1 ), mask2, 0.0_DbKi ), R8Ki) + Db_Xferred = Db_Xferred + SIZE(OutData%Stiffness) + DEALLOCATE(mask2) END SUBROUTINE SlD_UnPackParam SUBROUTINE SlD_CopyInput( SrcInputData, DstInputData, CtrlCode, ErrStat, ErrMsg ) From 83139cdd681008de140b09056341759e4d4b0ca5 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Mon, 13 Apr 2020 19:56:51 -0600 Subject: [PATCH 071/136] SlD: add soilDyn to jacobian This stabilizes things, but still requires 2 correction steps and tiny timesteps --- .../openfast-library/src/FAST_Registry.txt | 3 +- modules/openfast-library/src/FAST_Solver.f90 | 240 +++++++++++++++--- modules/openfast-library/src/FAST_Subs.f90 | 36 ++- modules/openfast-library/src/FAST_Types.f90 | 92 ++++++- modules/soildyn/src/SoilDyn.f90 | 43 +--- 5 files changed, 332 insertions(+), 82 deletions(-) diff --git a/modules/openfast-library/src/FAST_Registry.txt b/modules/openfast-library/src/FAST_Registry.txt index 5a5e7c4a3..b8470c0bc 100644 --- a/modules/openfast-library/src/FAST_Registry.txt +++ b/modules/openfast-library/src/FAST_Registry.txt @@ -89,7 +89,7 @@ typedef ^ FAST_ParameterType LOGICAL ModuleInitialized {NumModules} - - "An arra # Data for Jacobians: typedef ^ FAST_ParameterType DbKi DT_Ujac - - - "Time between when we need to re-calculate these Jacobians" s typedef ^ FAST_ParameterType Reki UJacSclFact - - - "Scaling factor used to get similar magnitudes between accelerations, forces, and moments in Jacobians" - -typedef ^ FAST_ParameterType IntKi SizeJac_Opt1 {9} - - "(1)=size of matrix; (2)=size of ED portion; (3)=size of SD portion [2 meshes]; (4)=size of HD portion; (5)=size of BD portion blade 1; (6)=size of BD portion blade 2; (7)=size of BD portion blade 3; (8)=size of Orca portion; (9)=size of ExtPtfm portion;" - +typedef ^ FAST_ParameterType IntKi SizeJac_Opt1 {10} - - "(1)=size of matrix; (2)=size of ED portion; (3)=size of SD portion [2 meshes]; (4)=size of HD portion; (5)=size of BD portion blade 1; (6)=size of BD portion blade 2; (7)=size of BD portion blade 3; (8)=size of Orca portion; (9)=size of ExtPtfm portion; (10)=size of SoilDyn portion;" - # Feature switches and flags: typedef ^ FAST_ParameterType IntKi CompElast - - - "Compute blade loads (switch) {Module_ED; Module_BD}" - typedef ^ FAST_ParameterType IntKi CompInflow - - - "Compute inflow wind conditions (switch) {Module_None; Module_IfW; Module_OpFM}" - @@ -481,6 +481,7 @@ typedef ^ FAST_ModuleMapType MeshType u_BD_RootMotion {:} - - "copy of BD input typedef ^ FAST_ModuleMapType MeshType y_BD_BldMotion_4Loads {:} - - "BD blade motion output at locations on DistrLoad input meshes" typedef ^ FAST_ModuleMapType MeshType u_Orca_PtfmMesh - - - "copy of Orca PtfmMesh input mesh" typedef ^ FAST_ModuleMapType MeshType u_ExtPtfm_PtfmMesh - - - "copy of ExtPtfm_MCKF PtfmMesh input mesh" +typedef ^ FAST_ModuleMapType MeshType u_SlD_SoilMesh - - - "copy of SlD input mesh" # ..... FAST_ExternalInput data ....................................................................................................... typedef FAST FAST_ExternInputType ReKi GenTrq - - - "generator torque input from Simulink/Labview" typedef ^ FAST_ExternInputType ReKi ElecPwr - - - "electric power input from Simulink/Labview" diff --git a/modules/openfast-library/src/FAST_Solver.f90 b/modules/openfast-library/src/FAST_Solver.f90 index e0f176370..b9d899c87 100644 --- a/modules/openfast-library/src/FAST_Solver.f90 +++ b/modules/openfast-library/src/FAST_Solver.f90 @@ -1161,7 +1161,7 @@ SUBROUTINE IceD_InputSolve( u_IceD, y_SD, MeshMapData, legNum, ErrStat, ErrMsg ) END SUBROUTINE IceD_InputSolve !---------------------------------------------------------------------------------------------------------------------------------- -!> This routine sets the inputs required for IceFloe. +!> This routine sets the inputs required for SoilDyn. SUBROUTINE SlD_InputSolve( u_SlD, y_SD, MeshMapData, ErrStat, ErrMsg ) !.................................................................................................................................. @@ -1815,7 +1815,7 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & , u_MD, y_MD & , u_IceF, y_IceF & , u_IceD, y_IceD & - , u_SlD, y_SlD & + , u_SlD, p_SlD, x_SlD, xd_SlD, z_SlD, OtherSt_SlD, y_SlD, m_SlD & , MeshMapData , ErrStat, ErrMsg ) !.................................................................................................................................. @@ -1891,6 +1891,16 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & TYPE(Orca_InputType) , INTENT(INOUT) :: u_Orca !< System inputs TYPE(Orca_OutputType) , INTENT(INOUT) :: y_Orca !< System outputs TYPE(Orca_MiscVarType) , INTENT(INOUT) :: m_Orca !< misc/optimization variables + + !SoilDyn: + TYPE(SlD_ContinuousStateType), INTENT(IN ) :: x_SlD !< Continuous states + TYPE(SlD_DiscreteStateType), INTENT(IN ) :: xd_SlD !< Discrete states + TYPE(SlD_ConstraintStateType), INTENT(IN ) :: z_SlD !< Constraint states + TYPE(SlD_OtherStateType), INTENT(IN ) :: OtherSt_SlD !< Other states + TYPE(SlD_ParameterType), INTENT(IN ) :: p_SlD !< Parameters + TYPE(SlD_InputType), INTENT(INOUT) :: u_SlD !< System inputs + TYPE(SlD_OutputType), INTENT(INOUT) :: y_SlD !< System outputs + TYPE(SlD_MiscVarType), INTENT(INOUT) :: m_SlD !< misc/optimization variables ! MAP/FEAM/MoorDyn/IceFloe/IceDyn: @@ -1905,9 +1915,7 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & TYPE(IceD_OutputType), INTENT(IN ) :: y_IceD(:) !< IceDyn outputs TYPE(IceD_InputType), INTENT(INOUT) :: u_IceD(:) !< IceDyn inputs (INOUT just because I don't want to use another tempoarary mesh and we'll overwrite this later) - !SoilDyn: - TYPE(SlD_InputType) , INTENT(INOUT) :: u_SlD !< System inputs - TYPE(SlD_OutputType) , INTENT(INOUT) :: y_SlD !< System outputs + TYPE(FAST_ModuleMapType) , INTENT(INOUT) :: MeshMapData !< data for mapping meshes between modules INTEGER(IntKi) , INTENT( OUT) :: ErrStat !< Error status of the operation @@ -1938,6 +1946,8 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & TYPE(Orca_OutputType) :: y_Orca_perturb ! Perturbed system outputs TYPE(ExtPtfm_InputType) :: u_ExtPtfm_perturb ! Perturbed system inputs TYPE(ExtPtfm_OutputType) :: y_ExtPtfm_perturb ! Perturbed system outputs + TYPE(SlD_InputType) :: u_SlD_perturb ! Perturbed system inputs + TYPE(SlD_OutputType) :: y_SlD_perturb ! Perturbed system outputs INTEGER(IntKi) :: i,j ! loop counters (jacobian column number) @@ -2020,6 +2030,13 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & CALL SetErrStat( ErrStat2, 'y_Orca_perturb:'//ErrMsg2, ErrStat, ErrMsg, RoutineName ) END IF + IF ( p_FAST%CompSoil == Module_SlD ) THEN + CALL SlD_CopyInput( u_SlD, u_SlD_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) + CALL SetErrStat( ErrStat2, 'u_SlD_perturb:'//ErrMsg2, ErrStat, ErrMsg, RoutineName ) + CALL SlD_CopyOutput( y_SlD, y_SlD_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) + CALL SetErrStat( ErrStat2, 'y_SlD_perturb:'//ErrMsg2, ErrStat, ErrMsg, RoutineName ) + END IF + IF (ErrStat >= AbortErrLev) THEN CALL CleanUp() RETURN @@ -2039,7 +2056,7 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & CALL Create_FullOpt1_UVector(u, u_ED%PlatformPtMesh, u_SD%TPMesh, u_SD%LMesh, u_HD%Morison%LumpedMesh, & u_HD%Morison%DistribMesh, u_HD%Mesh, u_ED%HubPtLoad, MeshMapData%u_BD_RootMotion, u_Orca%PtfmMesh, & - u_ExtPtfm%PtfmMesh, p_FAST ) + u_ExtPtfm%PtfmMesh, u_SlD%SoilMesh, p_FAST ) K = 0 @@ -2078,7 +2095,11 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) END IF - + IF ( p_FAST%CompSoil == Module_SlD ) THEN + CALL SlD_CalcOutput( this_time, u_SlD, p_SlD, x_SlD, xd_SlD, z_SlD, OtherSt_SlD, y_SlD, m_SlD, ErrStat2, ErrMsg2 ) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + END IF + IF ( ErrStat >= AbortErrLev ) THEN CALL CleanUp() RETURN @@ -2093,7 +2114,7 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & ! (note that we don't want to change u_ED, u_SD, u_HD, u_BD, u_ExtPtfm, or u_Orca, here) !------------------------------------------------------------------------------------------------- - CALL U_FullOpt1_Residual(y_ED, y_SD, y_HD, y_BD, y_Orca, y_ExtPtfm, u, Fn_U_Resid) !May set errors here... + CALL U_FullOpt1_Residual(y_ED, y_SD, y_HD, y_BD, y_Orca, y_ExtPtfm, y_SlD, u, Fn_U_Resid) !May set errors here... IF ( ErrStat >= AbortErrLev ) THEN CALL CleanUp() RETURN @@ -2117,7 +2138,7 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL U_FullOpt1_Residual(y_ED_perturb, y_SD, y_HD, y_BD, y_Orca, y_ExtPtfm, u_perturb, Fn_U_perturb) ! get this perturbation, U_perturb + CALL U_FullOpt1_Residual(y_ED_perturb, y_SD, y_HD, y_BD, y_Orca, y_ExtPtfm, y_SlD, u_perturb, Fn_U_perturb) ! get this perturbation, U_perturb IF ( ErrStat >= AbortErrLev ) THEN @@ -2147,7 +2168,7 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL U_FullOpt1_Residual(y_ED, y_SD_perturb, y_HD, y_BD, y_Orca, y_ExtPtfm, u_perturb, Fn_U_perturb) ! get this perturbation + CALL U_FullOpt1_Residual(y_ED, y_SD_perturb, y_HD, y_BD, y_Orca, y_ExtPtfm, y_SlD, u_perturb, Fn_U_perturb) ! get this perturbation IF ( ErrStat >= AbortErrLev ) THEN CALL CleanUp() @@ -2175,7 +2196,7 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & CALL HydroDyn_CalcOutput( this_time, u_HD_perturb, p_HD, x_HD, xd_HD, z_HD, OtherSt_HD, y_HD_perturb, m_HD, ErrStat2, ErrMsg2 ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL U_FullOpt1_Residual(y_ED, y_SD, y_HD_perturb, y_BD, y_Orca, y_ExtPtfm, u_perturb, Fn_U_perturb) ! get this perturbation + CALL U_FullOpt1_Residual(y_ED, y_SD, y_HD_perturb, y_BD, y_Orca, y_ExtPtfm, y_SlD, u_perturb, Fn_U_perturb) ! get this perturbation IF ( ErrStat >= AbortErrLev ) THEN CALL CleanUp() @@ -2214,7 +2235,7 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & ! calculate outputs with perturbed inputs: CALL BD_CalcOutput( this_time, u_BD_perturb, p_BD(nb), x_BD(nb), xd_BD(nb), z_BD(nb), OtherSt_BD(nb), y_BD_perturb(nb), m_BD(nb), ErrStat2, ErrMsg2 ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL U_FullOpt1_Residual(y_ED, y_SD, y_HD, y_BD_perturb, y_Orca, y_ExtPtfm, u_perturb, Fn_U_perturb) ! get this perturbation + CALL U_FullOpt1_Residual(y_ED, y_SD, y_HD, y_BD_perturb, y_Orca, y_ExtPtfm, y_SlD, u_perturb, Fn_U_perturb) ! get this perturbation IF ( ErrStat >= AbortErrLev ) THEN CALL CleanUp() @@ -2244,7 +2265,7 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & CALL Orca_CalcOutput( this_time, u_Orca_perturb, p_Orca, x_Orca, xd_Orca, z_Orca, OtherSt_Orca, y_Orca_perturb, m_Orca, ErrStat2, ErrMsg2 ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL U_FullOpt1_Residual(y_ED, y_SD, y_HD, y_BD, y_Orca_perturb, y_ExtPtfm, u_perturb, Fn_U_perturb) ! get this perturbation + CALL U_FullOpt1_Residual(y_ED, y_SD, y_HD, y_BD, y_Orca_perturb, y_ExtPtfm, y_SlD, u_perturb, Fn_U_perturb) ! get this perturbation IF ( ErrStat >= AbortErrLev ) THEN CALL CleanUp() @@ -2273,7 +2294,7 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & OtherSt_ExtPtfm, y_ExtPtfm_perturb, m_ExtPtfm, ErrStat2, ErrMsg2 ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL U_FullOpt1_Residual(y_ED, y_SD, y_HD, y_BD, y_Orca, y_ExtPtfm_perturb, u_perturb, Fn_U_perturb) ! get this perturbation + CALL U_FullOpt1_Residual(y_ED, y_SD, y_HD, y_BD, y_Orca, y_ExtPtfm_perturb, y_SlD, u_perturb, Fn_U_perturb) ! get this perturbation IF ( ErrStat >= AbortErrLev ) THEN CALL CleanUp() @@ -2284,6 +2305,36 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & END DO !ExtPtfm contribution + !............................... + ! Get SoilDyn's contribution: (note if p_FAST%CompSoil /= Module_SlD, SizeJac_Opt1(10) = 0) + !............................... + DO j=1,p_FAST%SizeJac_Opt1(10) !call SlD_CalcOutput + i = i + 1 ! i = j + p_FAST%SizeJac_Opt1(2) + + ! perturb u_SlD: + CALL SlD_CopyInput( u_SlD, u_SlD_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + u_perturb = u + CALL Perturb_u_FullOpt1( p_FAST, MeshMapData%Jac_u_indx, i, u_perturb, u_SlD_perturb=u_SlD_perturb, perturb=ThisPerturb ) ! perturb u and u_SlD by ThisPerturb [routine sets ThisPerturb] + + ! calculate outputs with perturbed inputs: + CALL SlD_CalcOutput( this_time, u_SlD_perturb, p_SlD, x_SlD, xd_SlD, z_SlD, OtherSt_SlD, y_SlD_perturb, m_SlD, ErrStat2, ErrMsg2 ) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + + CALL U_FullOpt1_Residual(y_ED, y_SD, y_HD, y_BD, y_Orca, y_ExtPtfm, y_SlD_perturb, u_perturb, Fn_U_perturb) ! get this perturbation +!print*,'y_SlD_perturb: ',y_SlD_perturb%SoilMesh%Force(1:3,1) +!print*,'u_perturb: ',u_perturb +!print*,'Fn_U_perturb: ',Fn_U_perturb +!print*,'Fn_U_perturb - Fn_U_Resid: ',Fn_U_perturb - Fn_U_Resid + IF ( ErrStat >= AbortErrLev ) THEN + CALL CleanUp() + RETURN + END IF + + MeshMapData%Jacobian_Opt1(:,i) = (Fn_U_perturb - Fn_U_Resid) / ThisPerturb + + END DO ! SubDyn contribution + #ifdef OUTPUT_ADDEDMASS IF (p_FAST%CompHydro == Module_HD ) THEN UnAM = -1 @@ -2337,8 +2388,7 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & CALL WrFileNR(UnJac, ' SD_TPMesh_RotationAcc_Z_'//TRIM(Num2LStr(TmpIndx))) END DO - - IF ( p_FAST%CompHydro == Module_HD ) THEN ! this SD mesh linked only when HD is enabled + IF ( p_FAST%CompHydro == Module_HD .or. p_FAST%CompSoil == Module_SlD ) THEN ! this SD mesh linked only when HD or SlD is enabled DO TmpIndx=1,u_SD%LMesh%NNodes CALL WrFileNR(UnJac, ' SD_LMesh_Force_X_'//TRIM(Num2LStr(TmpIndx))) CALL WrFileNR(UnJac, ' SD_LMesh_Force_Y_'//TRIM(Num2LStr(TmpIndx))) @@ -2411,7 +2461,12 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & CALL WrFileNR(UnJac, ' ExtPtfm_PtfmMesh_RotationAcc_Z_'//TRIM(Num2LStr(TmpIndx))) END DO - + DO TmpIndx=1,u_SlD%SoilMesh%NNodes + CALL WrFileNR(UnJac, ' SlD_SoilMesh_TranslationDisp_X_'//TRIM(Num2LStr(TmpIndx))) + CALL WrFileNR(UnJac, ' SlD_SoilMesh_TranslationDisp_Y_'//TRIM(Num2LStr(TmpIndx))) + CALL WrFileNR(UnJac, ' SlD_SoilMesh_TranslationDisp_Z_'//TRIM(Num2LStr(TmpIndx))) + END DO + WRITE(UnJac,'()') CALL WrMatrix(MeshMapData%Jacobian_Opt1,UnJac, p_FAST%OutFmt) @@ -2455,7 +2510,7 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & ! IF ( DOT_PRODUCT(u_delta, u_delta) <= TOL_Squared ) EXIT u = u + u_delta - CALL Add_FullOpt1_u_delta( p_FAST, MeshMapData%Jac_u_indx, u_delta, u_ED, u_SD, u_HD, u_BD, u_Orca, u_ExtPtfm ) + CALL Add_FullOpt1_u_delta( p_FAST, MeshMapData%Jac_u_indx, u_delta, u_ED, u_SD, u_HD, u_BD, u_Orca, u_ExtPtfm, u_SlD ) K = K + 1 @@ -2525,7 +2580,7 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & END IF - ! put the acceleration data (calucluted in this routine) back + ! put the acceleration data (calculated in this routine) back IF (MeshMapData%u_HD_M_LumpedMesh%Committed) THEN u_HD%Morison%LumpedMesh%RotationAcc = MeshMapData%u_HD_M_LumpedMesh%RotationAcc u_HD%Morison%LumpedMesh%TranslationAcc = MeshMapData%u_HD_M_LumpedMesh%TranslationAcc @@ -2592,6 +2647,24 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & u_Orca%PtfmMesh%RotationAcc = MeshMapData%u_Orca_PtfmMesh%RotationAcc u_Orca%PtfmMesh%TranslationAcc = MeshMapData%u_Orca_PtfmMesh%TranslationAcc END IF + + + IF ( p_FAST%CompSoil == Module_SlD ) THEN + !............... + ! SlD motion inputs: (from SD) + + ! Map SD outputs to SlD inputs (keeping the translations we just calculated): + + MeshMapData%u_SlD_SoilMesh%TranslationDisp = u_SlD%SoilMesh%TranslationDisp + MeshMapData%u_SlD_SoilMesh%Orientation = u_SlD%SoilMesh%Orientation + + CALL Transfer_Point_to_Point( y_SD%y2Mesh, u_SlD%SoilMesh, MeshMapData%SD_P_2_SlD_P, ErrStat2, ErrMsg2 ) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + + u_SlD%SoilMesh%TranslationDisp = MeshMapData%u_SlD_SoilMesh%TranslationDisp + u_SlD%SoilMesh%Orientation = MeshMapData%u_SlD_SoilMesh%Orientation + + END IF !............................................... ! We're finished @@ -2600,7 +2673,7 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & CONTAINS !............................................................................................................................... - SUBROUTINE U_FullOpt1_Residual( y_ED2, y_SD2, y_HD2, y_BD2, y_Orca2, y_ExtPtfm2, u_IN, U_Resid) + SUBROUTINE U_FullOpt1_Residual( y_ED2, y_SD2, y_HD2, y_BD2, y_Orca2, y_ExtPtfm2, y_SlD2, u_IN, U_Resid) ! transfer outputs of ED, HD, SD, BD, and OrcaFlex (and any additional loads that get summed with them) into inputs for ED, HD, SD, BD, and OrcaFlex !............................................................................................................................... @@ -2610,6 +2683,7 @@ SUBROUTINE U_FullOpt1_Residual( y_ED2, y_SD2, y_HD2, y_BD2, y_Orca2, y_ExtPtfm2, TYPE(BD_OutputType) , INTENT(IN ) :: y_BD2(:) ! System outputs TYPE(Orca_OutputType) , INTENT(IN ) :: y_Orca2 ! System outputs TYPE(ExtPtfm_OutputType) , INTENT(IN ) :: y_ExtPtfm2 ! System outputs + TYPE(SlD_OutputType) , INTENT(IN ) :: y_SlD2 ! System outputs REAL(ReKi) , INTENT(IN ) :: u_in(:) REAL(ReKi) , INTENT( OUT) :: U_Resid(:) @@ -2781,10 +2855,13 @@ SUBROUTINE U_FullOpt1_Residual( y_ED2, y_SD2, y_HD2, y_BD2, y_Orca2, y_ExtPtfm2, !.................. if (p_FAST%CompSoil == Module_SlD) then - if ( y_SlD%SoilMesh%Committed ) THEN + if ( y_SlD2%SoilMesh%Committed ) THEN ! SlD loads to SD - CALL Transfer_Point_to_Point( y_SlD%SoilMesh, MeshMapData%u_SD_LMesh_2, MeshMapData%SlD_P_2_SD_P, ErrStat2, ErrMsg2, u_SlD%SoilMesh, y_SD2%Y2Mesh ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat, ErrMsg,RoutineName//'Transfer_SlD_to_SD (y_SlD%SoilMesh -> y_SD2%Y2Mesh)' ) + CALL Transfer_Point_to_Point( y_SlD2%SoilMesh, MeshMapData%u_SD_LMesh_2, MeshMapData%SlD_P_2_SD_P, ErrStat2, ErrMsg2, u_SlD%SoilMesh, y_SD2%Y2Mesh ) + CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat, ErrMsg,RoutineName//'Transfer_SlD_to_SD (y_SlD2%SoilMesh -> y_SD2%Y2Mesh)' ) +!print*,'y_SlD%SoilMesh%Force(1:3,1): ',y_SlD2%SoilMesh%Force(1:3,1) +!print*,'SlD load on SD: ',MeshMapData%u_SD_LMesh_2%Force +!print*,'^^^^^^^^^^^^^^^^^^^^^ WHY IS THIS EMPTY ON THE perturb steps?????????' MeshMapData%u_SD_LMesh%Force = MeshMapData%u_SD_LMesh%Force + MeshMapData%u_SD_LMesh_2%Force MeshMapData%u_SD_LMesh%Moment = MeshMapData%u_SD_LMesh%Moment + MeshMapData%u_SD_LMesh_2%Moment endif @@ -2926,7 +3003,7 @@ SUBROUTINE U_FullOpt1_Residual( y_ED2, y_SD2, y_HD2, y_BD2, y_Orca2, y_ExtPtfm2, CALL Create_FullOpt1_UVector(U_Resid, MeshMapData%u_ED_PlatformPtMesh, MeshMapData%u_SD_TPMesh, MeshMapData%u_SD_LMesh, & MeshMapData%u_HD_M_LumpedMesh, MeshMapData%u_HD_M_DistribMesh, MeshMapData%u_HD_Mesh, & MeshMapData%u_ED_HubPtLoad, MeshMapData%u_BD_RootMotion, MeshMapData%u_Orca_PtfmMesh, & - MeshMapData%u_ExtPtfm_PtfmMesh, p_FAST ) + MeshMapData%u_ExtPtfm_PtfmMesh, MeshMapData%u_SlD_SoilMesh, p_FAST ) U_Resid = u_in - U_Resid @@ -2973,6 +3050,11 @@ SUBROUTINE CleanUp() CALL ExtPtfm_DestroyOutput(y_ExtPtfm_perturb, ErrStat3, ErrMsg3 ) IF (ErrStat3 /= ErrID_None) CALL WrScr(' '//RoutineName//TRIM(ErrMsg3) ) + CALL SlD_DestroyInput( u_SlD_perturb, ErrStat3, ErrMsg3 ) + IF (ErrStat3 /= ErrID_None) CALL WrScr(' '//RoutineName//TRIM(ErrMsg3) ) + CALL SlD_DestroyOutput(y_SlD_perturb, ErrStat3, ErrMsg3 ) + IF (ErrStat3 /= ErrID_None) CALL WrScr(' '//RoutineName//TRIM(ErrMsg3) ) + END IF @@ -2983,7 +3065,7 @@ END SUBROUTINE FullOpt1_InputOutputSolve !> This routine initializes the array that maps rows/columns of the Jacobian to specific mesh fields. !! Do not change the order of this packing without changing subroutine Create_FullOpt1_UVector()! SUBROUTINE Init_FullOpt1_Jacobian( p_FAST, MeshMapData, ED_PlatformPtMesh, SD_TPMesh, SD_LMesh, HD_M_LumpedMesh, HD_M_DistribMesh, & - HD_WAMIT_Mesh, ED_HubPtLoad, u_BD, Orca_PtfmMesh, ExtPtfm_PtfmMesh, ErrStat, ErrMsg) + HD_WAMIT_Mesh, ED_HubPtLoad, u_BD, Orca_PtfmMesh, ExtPtfm_PtfmMesh, SlD_SoilMesh, ErrStat, ErrMsg) TYPE(FAST_ParameterType) , INTENT(INOUT) :: p_FAST !< FAST parameters TYPE(FAST_ModuleMapType) , INTENT(INOUT) :: MeshMapData !< data that maps meshes together @@ -2999,6 +3081,7 @@ SUBROUTINE Init_FullOpt1_Jacobian( p_FAST, MeshMapData, ED_PlatformPtMesh, SD_TP TYPE(BD_InputType) , INTENT(IN ) :: u_BD(:) !< inputs for each instance of the BeamDyn module (for the RootMotion meshes) TYPE(MeshType) , INTENT(IN ) :: Orca_PtfmMesh !< OrcaFlex interface PtfmMesh TYPE(MeshType) , INTENT(IN ) :: ExtPtfm_PtfmMesh !< ExtPtfm_MCKF interface PtfmMesh + TYPE(MeshType) , INTENT(IN ) :: SlD_SoilMesh !< SoilDyn's SoilMesh INTEGER(IntKi) , INTENT( OUT) :: ErrStat !< Error status of the operation CHARACTER(*) , INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None @@ -3011,7 +3094,7 @@ SUBROUTINE Init_FullOpt1_Jacobian( p_FAST, MeshMapData, ED_PlatformPtMesh, SD_TP ErrStat = ErrID_None ErrMsg = "" - ! determine how many inputs there are between the 6 modules (ED, SD, HD, BD, Orca, ExtPtfm) + ! determine how many inputs there are between the 7 modules (ED, SD, HD, BD, Orca, ExtPtfm) if (p_FAST%CompHydro == Module_HD .or. p_FAST%CompSub /= Module_None .or. p_FAST%CompMooring == Module_Orca) then p_FAST%SizeJac_Opt1(2) = ED_PlatformPtMesh%NNodes*6 ! ED inputs: 3 forces and 3 moments per node (only 1 node) @@ -3053,6 +3136,9 @@ SUBROUTINE Init_FullOpt1_Jacobian( p_FAST, MeshMapData, ED_PlatformPtMesh, SD_TP p_FAST%SizeJac_Opt1(9) = 0 end if + if ( p_FAST%CompSoil == Module_SlD ) then + p_FAST%SizeJac_Opt1(10) = SlD_SoilMesh%NNodes*3 ! Only translation displacements considered + end if p_FAST%SizeJac_Opt1(1) = sum( p_FAST%SizeJac_Opt1 ) ! all the inputs from these modules @@ -3151,7 +3237,7 @@ SUBROUTINE Init_FullOpt1_Jacobian( p_FAST, MeshMapData, ED_PlatformPtMesh, SD_TP end do !j end do !i - IF ( p_FAST%CompHydro == Module_HD ) THEN ! this SD mesh linked only when HD is enabled + IF ( p_FAST%CompHydro == Module_HD .or. p_FAST%CompSoil == Module_SlD ) THEN ! this SD mesh linked only when HD is enabled ! SD_LMesh do i=1,SD_LMesh%NNodes @@ -3312,13 +3398,27 @@ SUBROUTINE Init_FullOpt1_Jacobian( p_FAST, MeshMapData, ED_PlatformPtMesh, SD_TP end do !j end do !i + !............... + ! SoilDyn inputs: + !............... + + ! SlD_SoilMesh + do i=1,SlD_SoilMesh%NNodes + do j=1,3 + MeshMapData%Jac_u_indx(index,1) = 25 !Module/Mesh/Field: u_SlD%SoilMesh%TranslationDisp = 25 + MeshMapData%Jac_u_indx(index,2) = j !index: j + MeshMapData%Jac_u_indx(index,3) = i !Node: i + index = index + 1 + end do !j + end do !i + END SUBROUTINE Init_FullOpt1_Jacobian !---------------------------------------------------------------------------------------------------------------------------------- !> This routine basically packs the relevant parts of the modules' input meshes for use in this InputOutput solve. !! Do not change the order of this packing without changing subroutine Init_FullOpt1_Jacobian()! SUBROUTINE Create_FullOpt1_UVector(u, ED_PlatformPtMesh, SD_TPMesh, SD_LMesh, HD_M_LumpedMesh, HD_M_DistribMesh, HD_WAMIT_Mesh, & - ED_HubPtLoad, BD_RootMotion, Orca_PtfmMesh, ExtPtfm_PtfmMesh, p_FAST ) + ED_HubPtLoad, BD_RootMotion, Orca_PtfmMesh, ExtPtfm_PtfmMesh, SlD_SoilMesh, p_FAST ) !.................................................................................................................................. REAL(ReKi) , INTENT(INOUT) :: u(:) !< output u vector @@ -3334,6 +3434,7 @@ SUBROUTINE Create_FullOpt1_UVector(u, ED_PlatformPtMesh, SD_TPMesh, SD_LMesh, HD TYPE(MeshType) , INTENT(IN ) :: BD_RootMotion(:) !< BeamDyn RootMotion meshes TYPE(MeshType) , INTENT(IN ) :: Orca_PtfmMesh !< OrcaFlex interface PtfmMesh TYPE(MeshType) , INTENT(IN ) :: ExtPtfm_PtfmMesh !< ExtPtfm interface PtfmMesh + TYPE(MeshType) , INTENT(IN ) :: SlD_SoilMesh !< SoilDyn SoilMesh TYPE(FAST_ParameterType) , INTENT(IN ) :: p_FAST !< FAST parameters @@ -3385,7 +3486,7 @@ SUBROUTINE Create_FullOpt1_UVector(u, ED_PlatformPtMesh, SD_TPMesh, SD_LMesh, HD indx_first = indx_last + 1 end do - if ( p_FAST%CompHydro == Module_HD ) then ! this SD mesh linked only when HD is enabled + if ( p_FAST%CompHydro == Module_HD .or. p_FAST%CompSoil == Module_SlD ) then ! this SD mesh linked only when HD is enabled ! SD inputs (SD_LMesh): do i=1,SD_LMesh%NNodes indx_last = indx_first + 2 @@ -3494,11 +3595,19 @@ SUBROUTINE Create_FullOpt1_UVector(u, ED_PlatformPtMesh, SD_TPMesh, SD_LMesh, HD indx_first = indx_last + 1 end do + !............... + ! SlD inputs (SlD_SoilMesh): + !............... + do i=1,SlD_SoilMesh%NNodes + indx_last = indx_first + 2 + u(indx_first:indx_last) = SlD_SoilMesh%TranslationDisp(:,i) + indx_first = indx_last + 1 + end do END SUBROUTINE Create_FullOpt1_UVector !---------------------------------------------------------------------------------------------------------------------------------- !> This routine adds u_delta to the corresponding mesh field and scales it as appropriate -SUBROUTINE Add_FullOpt1_u_delta( p_FAST, Jac_u_indx, u_delta, u_ED, u_SD, u_HD, u_BD, u_Orca, u_ExtPtfm ) +SUBROUTINE Add_FullOpt1_u_delta( p_FAST, Jac_u_indx, u_delta, u_ED, u_SD, u_HD, u_BD, u_Orca, u_ExtPtfm, u_SlD ) !.................................................................................................................................. TYPE(FAST_ParameterType) , INTENT(IN ) :: p_FAST !< Glue-code simulation parameters INTEGER( IntKi ) , INTENT(IN ) :: Jac_u_indx(:,:) !< Index to map Jacobian u-vector into mesh fields @@ -3509,6 +3618,7 @@ SUBROUTINE Add_FullOpt1_u_delta( p_FAST, Jac_u_indx, u_delta, u_ED, u_SD, u_HD, TYPE(BD_InputType) , INTENT(INOUT) :: u_BD(:) !< BD System inputs TYPE(Orca_InputType) , INTENT(INOUT) :: u_Orca !< Orca System inputs TYPE(ExtPtfm_InputType) , INTENT(INOUT) :: u_ExtPtfm !< ExtPtfm System inputs + TYPE(SlD_InputType) , INTENT(INOUT) :: u_SlD !< SlD System inputs ! local variables INTEGER :: n @@ -3578,6 +3688,9 @@ SUBROUTINE Add_FullOpt1_u_delta( p_FAST, Jac_u_indx, u_delta, u_ED, u_SD, u_HD, CASE (24) !Module/Mesh/Field: u_ExtPtfm%PtfmMesh%RotationAcc = 24 u_ExtPtfm%PtfmMesh%RotationAcc( fieldIndx,node) = u_ExtPtfm%PtfmMesh%RotationAcc( fieldIndx,node) + u_delta(n) + CASE (25) !Module/Mesh/Field: u_SlD%SoilMesh%TranslationDisp = 25 + u_SlD%SoilMesh%TranslationDisp( fieldIndx,node) = u_SlD%SoilMesh%TranslationDisp( fieldIndx,node) + real(u_delta(n), R8Ki) + END SELECT END DO @@ -3586,7 +3699,7 @@ END SUBROUTINE Add_FullOpt1_u_delta !---------------------------------------------------------------------------------------------------------------------------------- !> This routine perturbs the nth element of the u array (and mesh/field it corresponds to) SUBROUTINE Perturb_u_FullOpt1( p_FAST, Jac_u_indx, n, u_perturb, u_ED_perturb, u_SD_perturb, u_HD_perturb, u_BD_perturb, & - u_Orca_perturb, u_ExtPtfm_perturb, perturb ) + u_Orca_perturb, u_ExtPtfm_perturb, u_SlD_perturb, perturb ) !............................................................................................................................... TYPE(FAST_ParameterType) , INTENT(IN ) :: p_FAST !< Glue-code simulation parameters INTEGER( IntKi ) , INTENT(IN ) :: Jac_u_indx(:,:) !< Index to map Jacobian u-vector into mesh fields @@ -3598,6 +3711,7 @@ SUBROUTINE Perturb_u_FullOpt1( p_FAST, Jac_u_indx, n, u_perturb, u_ED_perturb, u TYPE(BD_InputType), OPTIONAL , INTENT(INOUT) :: u_BD_perturb !< BD System inputs (needed only when NumEDNodes+NumSDNodes+NumHDNodes+1 <= n <= inf) [if BD is used] TYPE(Orca_InputType), OPTIONAL , INTENT(INOUT) :: u_Orca_perturb !< Orca System inputs (needed only when NumEDNodes+NumSDNodes+NumHDNodes+NumBDNodes+1 <= n <= inf) [if Orca is used] TYPE(ExtPtfm_InputType), OPTIONAL , INTENT(INOUT) :: u_ExtPtfm_perturb !< ExtPtfm System inputs (needed only when NumEDNodes+NumSDNodes+NumHDNodes+NumBDNodes+NumOcraNodes+1 <= n <= inf) [if ExtPtfm is used] + TYPE(SlD_InputType), OPTIONAL , INTENT(INOUT) :: u_SlD_perturb !< SlD System inputs (needed only when NumEDNodes +1 <= n <= NumEDNodes+NumSDNodes) [if SlD is used] REAL( ReKi ) , INTENT( OUT) :: perturb !< amount that u_perturb(n) was perturbed ! local variables @@ -3682,13 +3796,18 @@ SUBROUTINE Perturb_u_FullOpt1( p_FAST, Jac_u_indx, n, u_perturb, u_ED_perturb, u perturb = GetPerturb( u_Orca_perturb%PtfmMesh%RotationAcc(fieldIndx , node) ) u_Orca_perturb%PtfmMesh%RotationAcc( fieldIndx,node) = u_Orca_perturb%PtfmMesh%RotationAcc( fieldIndx,node) + perturb - CASE (23) !Module/Mesh/Field: u_ExtPtfm%PtfmMesh%TranslationAcc = 21 + CASE (23) !Module/Mesh/Field: u_ExtPtfm%PtfmMesh%TranslationAcc = 23 perturb = GetPerturb( u_ExtPtfm_perturb%PtfmMesh%TranslationAcc(fieldIndx , node) ) u_ExtPtfm_perturb%PtfmMesh%TranslationAcc(fieldIndx,node) = u_ExtPtfm_perturb%PtfmMesh%TranslationAcc(fieldIndx,node) + perturb - CASE (24) !Module/Mesh/Field: u_ExtPtfm%PtfmMesh%RotationAcc = 22 + CASE (24) !Module/Mesh/Field: u_ExtPtfm%PtfmMesh%RotationAcc = 24 perturb = GetPerturb( u_ExtPtfm_perturb%PtfmMesh%RotationAcc(fieldIndx , node) ) u_ExtPtfm_perturb%PtfmMesh%RotationAcc( fieldIndx,node) = u_ExtPtfm_perturb%PtfmMesh%RotationAcc( fieldIndx,node) + perturb + CASE (25) !Module/Mesh/Field: u_SlD%SoilMesh%TranslationDisp = 25 +! perturb = GetPerturb( u_SlD_perturb%SoilMesh%TranslationDisp(fieldIndx , node) ) + perturb = 1.0_ReKi + u_SlD_perturb%SoilMesh%TranslationDisp( fieldIndx,node) = u_SlD_perturb%SoilMesh%TranslationDisp( fieldIndx,node) + real(perturb,R8Ki) + END SELECT u_perturb(n) = u_perturb(n) + perturb @@ -3697,7 +3816,7 @@ SUBROUTINE Perturb_u_FullOpt1( p_FAST, Jac_u_indx, n, u_perturb, u_ED_perturb, u END SUBROUTINE Perturb_u_FullOpt1 !---------------------------------------------------------------------------------------------------------------------------------- !> This routine resets the remap flags on all of the meshes -SUBROUTINE ResetRemapFlags(p_FAST, ED, BD, AD14, AD, HD, SD, ExtPtfm, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD ) +SUBROUTINE ResetRemapFlags(p_FAST, ED, BD, AD14, AD, HD, SD, ExtPtfm, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD, SlD ) !............................................................................................................................... TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code @@ -3716,6 +3835,7 @@ SUBROUTINE ResetRemapFlags(p_FAST, ED, BD, AD14, AD, HD, SD, ExtPtfm, SrvD, MAPp TYPE(OrcaFlex_Data), INTENT(INOUT) :: Orca !< OrcaFlex interface data TYPE(IceFloe_Data), INTENT(INOUT) :: IceF !< IceFloe data TYPE(IceDyn_Data), INTENT(INOUT) :: IceD !< All the IceDyn data used in time-step loop + TYPE(SoilDyn_Data), INTENT(INOUT) :: SlD !< SoilDyn data !local variable(s) @@ -3872,6 +3992,14 @@ SUBROUTINE ResetRemapFlags(p_FAST, ED, BD, AD14, AD, HD, SD, ExtPtfm, SrvD, MAPp END DO END IF + ! SoilDyn + IF ( p_FAST%CompSoil == Module_SlD ) THEN + IF (SlD%Input(1)%SoilMesh%Committed) THEN + SlD%Input(1)%SoilMesh%RemapFlag = .FALSE. + SlD%y%SoilMesh%RemapFlag = .FALSE. + END IF + END IF + END SUBROUTINE ResetRemapFlags !---------------------------------------------------------------------------------------------------------------------------------- !> This routine initializes all of the mapping data structures needed between the various modules. @@ -4337,7 +4465,7 @@ SUBROUTINE InitModuleMappings(p_FAST, ED, BD, AD14, AD, HD, SD, ExtPtfm, SrvD, M IF ( p_FAST%CompSub /= Module_None .OR. (p_FAST%CompElast == Module_BD .and. BD_Solve_Option1) .or. p_FAST%CompMooring == Module_Orca) THEN !.OR. p_FAST%CompHydro == Module_HD ) THEN CALL Init_FullOpt1_Jacobian( p_FAST, MeshMapData, ED%Input(1)%PlatformPtMesh, SD%Input(1)%TPMesh, SD%Input(1)%LMesh, & HD%Input(1)%Morison%LumpedMesh, HD%Input(1)%Morison%DistribMesh, HD%Input(1)%Mesh, & - ED%Input(1)%HubPtLoad, BD%Input(1,:), Orca%Input(1)%PtfmMesh, ExtPtfm%Input(1)%PtfmMesh, ErrStat2, ErrMsg2) + ED%Input(1)%HubPtLoad, BD%Input(1,:), Orca%Input(1)%PtfmMesh, ExtPtfm%Input(1)%PtfmMesh, SlD%Input(1)%SoilMesh, ErrStat2, ErrMsg2) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) ELSEIF ( p_FAST%CompHydro == Module_HD ) THEN CALL AllocAry( MeshMapData%Jacobian_Opt1, SizeJac_ED_HD, SizeJac_ED_HD, 'Jacobian for ED-HD coupling', ErrStat2, ErrMsg2 ) @@ -4354,7 +4482,7 @@ SUBROUTINE InitModuleMappings(p_FAST, ED, BD, AD14, AD, HD, SD, ExtPtfm, SrvD, M !............................................................................................................................ ! reset the remap flags (do this before making the copies else the copies will always have remap = true) !............................................................................................................................ - CALL ResetRemapFlags(p_FAST, ED, BD, AD14, AD, HD, SD, ExtPtfm, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD ) + CALL ResetRemapFlags(p_FAST, ED, BD, AD14, AD, HD, SD, ExtPtfm, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD, SlD ) !............................................................................................................................ ! initialize the temporary input meshes (for input-output solves): @@ -4436,6 +4564,13 @@ SUBROUTINE InitModuleMappings(p_FAST, ED, BD, AD14, AD, HD, SD, ExtPtfm, SrvD, M END IF + IF ( p_FAST%CompSoil == Module_SlD ) THEN + + CALL MeshCopy ( SlD%Input(1)%SoilMesh, MeshMapData%u_SlD_SoilMesh, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':u_SlD_SoilMesh' ) + + END IF + END IF @@ -4605,7 +4740,7 @@ SUBROUTINE CalcOutputs_And_SolveForInputs( n_t_global, this_time, this_state, ca ! Reset each mesh's RemapFlag (after calling all InputSolve routines): !..................................................................... - CALL ResetRemapFlags(p_FAST, ED, BD, AD14, AD, HD, SD, ExtPtfm, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD) + CALL ResetRemapFlags(p_FAST, ED, BD, AD14, AD, HD, SD, ExtPtfm, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD, SlD) END SUBROUTINE CalcOutputs_And_SolveForInputs @@ -4719,7 +4854,7 @@ SUBROUTINE SolveOption1(this_time, this_state, calcJacobian, p_FAST, ED, BD, HD, , MD%Input(1), MD%y & , IceF%Input(1), IceF%y & , IceD%Input(1,:), IceD%y & ! bjj: I don't really want to make temp copies of input types. perhaps we should pass the whole Input() structure? (likewise for BD)... - , SlD%Input(1), SlD%y & ! adp: this is only coupled to SD at present + , SlD%Input(1), SlD%p, SlD%x( this_state), SlD%xd( this_state), SlD%z( this_state), SlD%OtherSt( this_state), SlD%y, SlD%m & ! only couples to SD at present , MeshMapData , ErrStat2, ErrMsg2 ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) @@ -5965,6 +6100,35 @@ SUBROUTINE FAST_ExtrapInterpMods( t_global_next, p_FAST, y_FAST, m_FAST, ED, BD, END IF ! IceFloe/IceDyn + ! SoilDyn + IF ( p_FAST%CompSoil == Module_SlD ) THEN + + CALL SlD_Input_ExtrapInterp(SlD%Input, SlD%InputTimes, SlD%u, t_global_next, ErrStat2, ErrMsg2) + CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) + + !CALL SlD_Output_ExtrapInterp(SlD_Output, SlD_OutputTimes, SlD%y, t_global_next, ErrStat2, ErrMsg2) + ! CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) + + + ! Shift "window" of SlD%Input and SlD_Output + + DO j = p_FAST%InterpOrder, 1, -1 + CALL SlD_CopyInput (SlD%Input(j), SlD%Input(j+1), MESH_UPDATECOPY, Errstat2, ErrMsg2) + CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) + !CALL SlD_CopyOutput(SlD_Output(j), SlD_Output(j+1), MESH_UPDATECOPY, Errstat2, ErrMsg2) + SlD%InputTimes(j+1) = SlD%InputTimes(j) + !SlD_OutputTimes(j+1) = SlD_OutputTimes(j) + END DO + + CALL SlD_CopyInput (SlD%u, SlD%Input(1), MESH_UPDATECOPY, Errstat2, ErrMsg2) + CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) + !CALL SlD_CopyOutput(SlD%y, SlD_Output(1), MESH_UPDATECOPY, Errstat2, ErrMsg2) + SlD%InputTimes(1) = t_global_next + !SlD_OutputTimes(1) = t_global_next + + END IF ! SoilDyn + + END SUBROUTINE FAST_ExtrapInterpMods !---------------------------------------------------------------------------------------------------------------------------------- diff --git a/modules/openfast-library/src/FAST_Subs.f90 b/modules/openfast-library/src/FAST_Subs.f90 index fe6594a45..74a932bc1 100644 --- a/modules/openfast-library/src/FAST_Subs.f90 +++ b/modules/openfast-library/src/FAST_Subs.f90 @@ -3925,7 +3925,7 @@ SUBROUTINE FAST_Solution0(p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD14, AD, IfW, O ! Initialize Input-Output arrays for interpolation/extrapolation: CALL FAST_InitIOarrays( m_FAST%t_global, p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD14, AD, IfW, HD, SD, ExtPtfm, & - MAPp, FEAM, MD, Orca, IceF, IceD, ErrStat2, ErrMsg2 ) + MAPp, FEAM, MD, Orca, IceF, IceD, SlD, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) @@ -3935,7 +3935,7 @@ END SUBROUTINE FAST_Solution0 !! extrapolations are used with values from the solution, not just initial guesses. It also creates new copies of the state variables, which need to !! be stored for the predictor-corrector loop. SUBROUTINE FAST_InitIOarrays( t_initial, p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD14, AD, IfW, HD, SD, ExtPtfm, & - MAPp, FEAM, MD, Orca, IceF, IceD, ErrStat, ErrMsg ) + MAPp, FEAM, MD, Orca, IceF, IceD, SlD, ErrStat, ErrMsg ) REAL(DbKi), INTENT(IN ) :: t_initial !< start time of the simulation TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code @@ -3957,6 +3957,7 @@ SUBROUTINE FAST_InitIOarrays( t_initial, p_FAST, y_FAST, m_FAST, ED, BD, SrvD, A TYPE(OrcaFlex_Data), INTENT(INOUT) :: Orca !< OrcaFlex interface data TYPE(IceFloe_Data), INTENT(INOUT) :: IceF !< IceFloe data TYPE(IceDyn_Data), INTENT(INOUT) :: IceD !< All the IceDyn data used in time-step loop + TYPE(SoilDyn_Data), INTENT(INOUT) :: SlD !< SoilDyn data INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None @@ -4389,7 +4390,36 @@ SUBROUTINE FAST_InitIOarrays( t_initial, p_FAST, y_FAST, m_FAST, ED, BD, SrvD, A END DO ! numIceLegs END IF ! CompIce - + + + ! SoilDyn + IF (p_FAST%CompSoil == Module_SlD ) THEN + + ! Copy values for interpolation/extrapolation: + DO j = 1, p_FAST%InterpOrder + 1 + SlD%InputTimes(j) = t_initial - (j - 1) * p_FAST%dt + !SlD_OutputTimes(i) = t_initial - (j - 1) * dt + END DO + + DO j = 2, p_FAST%InterpOrder + 1 + CALL SlD_CopyInput (SlD%Input(1), SlD%Input(j), MESH_NEWCOPY, Errstat2, ErrMsg2) + CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + END DO + CALL SlD_CopyInput (SlD%Input(1), SlD%u, MESH_NEWCOPY, Errstat2, ErrMsg2) ! do this to initialize meshes/allocatable arrays for output of ExtrapInterp routine + CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + + + ! Initialize predicted states for j_pc loop: + CALL SlD_CopyContState (SlD%x( STATE_CURR), SlD%x( STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) + CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + CALL SlD_CopyDiscState (SlD%xd(STATE_CURR), SlD%xd(STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) + CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + CALL SlD_CopyConstrState (SlD%z( STATE_CURR), SlD%z( STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) + CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + CALL SlD_CopyOtherState( SlD%OtherSt(STATE_CURR), SlD%OtherSt(STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) + CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + + END IF ! SoilDyn END SUBROUTINE FAST_InitIOarrays !---------------------------------------------------------------------------------------------------------------------------------- diff --git a/modules/openfast-library/src/FAST_Types.f90 b/modules/openfast-library/src/FAST_Types.f90 index 260478702..b29004206 100644 --- a/modules/openfast-library/src/FAST_Types.f90 +++ b/modules/openfast-library/src/FAST_Types.f90 @@ -129,7 +129,7 @@ MODULE FAST_Types LOGICAL , DIMENSION(NumModules) :: ModuleInitialized !< An array determining if the module has been initialized [-] REAL(DbKi) :: DT_Ujac !< Time between when we need to re-calculate these Jacobians [s] REAL(ReKi) :: UJacSclFact !< Scaling factor used to get similar magnitudes between accelerations, forces, and moments in Jacobians [-] - INTEGER(IntKi) , DIMENSION(1:9) :: SizeJac_Opt1 !< (1)=size of matrix; (2)=size of ED portion; (3)=size of SD portion [2 meshes]; (4)=size of HD portion; (5)=size of BD portion blade 1; (6)=size of BD portion blade 2; (7)=size of BD portion blade 3; (8)=size of Orca portion; (9)=size of ExtPtfm portion; [-] + INTEGER(IntKi) , DIMENSION(1:10) :: SizeJac_Opt1 !< (1)=size of matrix; (2)=size of ED portion; (3)=size of SD portion [2 meshes]; (4)=size of HD portion; (5)=size of BD portion blade 1; (6)=size of BD portion blade 2; (7)=size of BD portion blade 3; (8)=size of Orca portion; (9)=size of ExtPtfm portion; (10)=size of SoilDyn portion; [-] INTEGER(IntKi) :: CompElast !< Compute blade loads (switch) {Module_ED; Module_BD} [-] INTEGER(IntKi) :: CompInflow !< Compute inflow wind conditions (switch) {Module_None; Module_IfW; Module_OpFM} [-] INTEGER(IntKi) :: CompAero !< Compute aerodynamic loads (switch) {Module_None; Module_AD14; Module_AD} [-] @@ -542,6 +542,7 @@ MODULE FAST_Types TYPE(MeshType) , DIMENSION(:), ALLOCATABLE :: y_BD_BldMotion_4Loads !< BD blade motion output at locations on DistrLoad input meshes [-] TYPE(MeshType) :: u_Orca_PtfmMesh !< copy of Orca PtfmMesh input mesh [-] TYPE(MeshType) :: u_ExtPtfm_PtfmMesh !< copy of ExtPtfm_MCKF PtfmMesh input mesh [-] + TYPE(MeshType) :: u_SlD_SoilMesh !< copy of SlD input mesh [-] END TYPE FAST_ModuleMapType ! ======================= ! ========= FAST_ExternInputType ======= @@ -24783,6 +24784,9 @@ SUBROUTINE FAST_CopyModuleMapType( SrcModuleMapTypeData, DstModuleMapTypeData, C CALL MeshCopy( SrcModuleMapTypeData%u_ExtPtfm_PtfmMesh, DstModuleMapTypeData%u_ExtPtfm_PtfmMesh, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat>=AbortErrLev) RETURN + CALL MeshCopy( SrcModuleMapTypeData%u_SlD_SoilMesh, DstModuleMapTypeData%u_SlD_SoilMesh, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat>=AbortErrLev) RETURN END SUBROUTINE FAST_CopyModuleMapType SUBROUTINE FAST_DestroyModuleMapType( ModuleMapTypeData, ErrStat, ErrMsg ) @@ -24906,6 +24910,7 @@ SUBROUTINE FAST_DestroyModuleMapType( ModuleMapTypeData, ErrStat, ErrMsg ) ENDIF CALL MeshDestroy( ModuleMapTypeData%u_Orca_PtfmMesh, ErrStat, ErrMsg ) CALL MeshDestroy( ModuleMapTypeData%u_ExtPtfm_PtfmMesh, ErrStat, ErrMsg ) + CALL MeshDestroy( ModuleMapTypeData%u_SlD_SoilMesh, ErrStat, ErrMsg ) END SUBROUTINE FAST_DestroyModuleMapType SUBROUTINE FAST_PackModuleMapType( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) @@ -25841,6 +25846,23 @@ SUBROUTINE FAST_PackModuleMapType( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Int_BufSz = Int_BufSz + SIZE( Int_Buf ) DEALLOCATE(Int_Buf) END IF + Int_BufSz = Int_BufSz + 3 ! u_SlD_SoilMesh: size of buffers for each call to pack subtype + CALL MeshPack( InData%u_SlD_SoilMesh, Re_Buf, Db_Buf, Int_Buf, ErrStat2, ErrMsg2, .TRUE. ) ! u_SlD_SoilMesh + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! u_SlD_SoilMesh + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! u_SlD_SoilMesh + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! u_SlD_SoilMesh + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) THEN @@ -27400,6 +27422,34 @@ SUBROUTINE FAST_PackModuleMapType( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ELSE IntKiBuf( Int_Xferred ) = 0; Int_Xferred = Int_Xferred + 1 ENDIF + CALL MeshPack( InData%u_SlD_SoilMesh, Re_Buf, Db_Buf, Int_Buf, ErrStat2, ErrMsg2, OnlySize ) ! u_SlD_SoilMesh + 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 END SUBROUTINE FAST_PackModuleMapType SUBROUTINE FAST_UnPackModuleMapType( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) @@ -29607,6 +29657,46 @@ SUBROUTINE FAST_UnPackModuleMapType( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrSta IF(ALLOCATED(Re_Buf )) DEALLOCATE(Re_Buf ) IF(ALLOCATED(Db_Buf )) DEALLOCATE(Db_Buf ) IF(ALLOCATED(Int_Buf)) DEALLOCATE(Int_Buf) + 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 MeshUnpack( OutData%u_SlD_SoilMesh, Re_Buf, Db_Buf, Int_Buf, ErrStat2, ErrMsg2 ) ! u_SlD_SoilMesh + 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) END SUBROUTINE FAST_UnPackModuleMapType SUBROUTINE FAST_CopyExternInputType( SrcExternInputTypeData, DstExternInputTypeData, CtrlCode, ErrStat, ErrMsg ) diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index 0d743fe0e..fbe43a812 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -405,49 +405,14 @@ subroutine SlD_UpdateStates( t, n, Inputs, InputTimes, p, x, xd, z, OtherState, integer(IntKi), intent( out) :: ErrStat !< Error status of the operation character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None - ! Local variables - type(SlD_ContinuousStateType) :: dxdt ! Continuous state derivatives at t - type(SlD_DiscreteStateType) :: xd_t ! Discrete states at t (copy) - type(SlD_ConstraintStateType) :: z_Residual ! Residual of the constraint state functions (Z) - type(SlD_InputType) :: u ! Instantaneous inputs - integer(IntKi) :: ErrStat2 ! local error status - character(ErrMsgLen) :: ErrMsg2 ! local error message - character(*), parameter :: RoutineName = 'SlD_UpdateStates' - ! Initialize variables ErrStat = ErrID_None ! no error has occurred ErrMsg = "" -!FIXME: is this even needed? We don't have states that we have access to when using the REDWIN dll - ! This subroutine contains an example of how the states could be updated. Developers will - ! want to adjust the logic as necessary for their own situations. - -! ! Get the inputs at time t, based on the array of values sent by the glue code: -! ! before calling ExtrapInterp routine, memory in u must be allocated; we can do that with a copy: -! call SlD_CopyInput( Inputs(1), u, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) -! call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) -! if ( ErrStat >= AbortErrLev ) then -! call cleanup() ! to avoid memory leaks, we have to destroy the local variables that may have allocatable arrays or meshes -! return -! end if -! -! call SlD_Input_ExtrapInterp( Inputs, InputTimes, u, t, ErrStat2, ErrMsg2 ) -! call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) -! if ( ErrStat >= AbortErrLev ) then -! call cleanup() -! return -! end if - - ! Destroy local variables before returning - call cleanup() - -contains - subroutine cleanup() - call SlD_DestroyInput( u, ErrStat2, ErrMsg2) - call SlD_DestroyConstrState( Z_Residual, ErrStat2, ErrMsg2) - call SlD_DestroyContState( dxdt, ErrStat2, ErrMsg2) - call SlD_DestroyDiscState( xd_t, ErrStat2, ErrMsg2) - end subroutine cleanup + x%DummyContState = 0.0_ReKi + xd%DummyDiscState = 0.0_ReKi + z%DummyConstrState = 0.0_ReKi + end subroutine SlD_UpdateStates From 70b60c7044154ecaaf7df1cda0fedf72b11c003c Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 14 Apr 2020 06:31:50 -0600 Subject: [PATCH 072/136] SlD: modify glue code solver logic so don't need correction steps --- modules/openfast-library/src/FAST_Solver.f90 | 41 ++++++++++---------- modules/openfast-library/src/FAST_Subs.f90 | 8 +++- 2 files changed, 27 insertions(+), 22 deletions(-) diff --git a/modules/openfast-library/src/FAST_Solver.f90 b/modules/openfast-library/src/FAST_Solver.f90 index b9d899c87..e694f5200 100644 --- a/modules/openfast-library/src/FAST_Solver.f90 +++ b/modules/openfast-library/src/FAST_Solver.f90 @@ -2095,7 +2095,10 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) END IF - IF ( p_FAST%CompSoil == Module_SlD ) THEN + IF ( p_FAST%CompSoil == Module_SlD ) THEN + ! Overwrite the SlD inputs with the newly calculated values from SD (we don't need a correction step this way) + CALL SlD_InputSolve( u_SlD, y_SD, MeshMapData, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) CALL SlD_CalcOutput( this_time, u_SlD, p_SlD, x_SlD, xd_SlD, z_SlD, OtherSt_SlD, y_SlD, m_SlD, ErrStat2, ErrMsg2 ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) END IF @@ -2322,10 +2325,7 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) CALL U_FullOpt1_Residual(y_ED, y_SD, y_HD, y_BD, y_Orca, y_ExtPtfm, y_SlD_perturb, u_perturb, Fn_U_perturb) ! get this perturbation -!print*,'y_SlD_perturb: ',y_SlD_perturb%SoilMesh%Force(1:3,1) -!print*,'u_perturb: ',u_perturb -!print*,'Fn_U_perturb: ',Fn_U_perturb -!print*,'Fn_U_perturb - Fn_U_Resid: ',Fn_U_perturb - Fn_U_Resid + IF ( ErrStat >= AbortErrLev ) THEN CALL CleanUp() RETURN @@ -2649,7 +2649,7 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & END IF - IF ( p_FAST%CompSoil == Module_SlD ) THEN + IF ( p_FAST%CompSoil == Module_SlD ) THEN ! Only true if p_FAST%CompSub == Module_SD !............... ! SlD motion inputs: (from SD) @@ -2768,12 +2768,14 @@ SUBROUTINE U_FullOpt1_Residual( y_ED2, y_SD2, y_HD2, y_BD2, y_Orca2, y_ExtPtfm2, IF ( p_FAST%CompSub == Module_SD ) THEN - IF ( p_FAST%CompHydro == Module_HD ) THEN - - ! initialize these SD loads inputs here in case HD is used (note from initialiazation that these meshes don't exist if HD isn't used) + IF ( p_FAST%CompHydro == Module_HD .or. p_FAST%CompSoil == Module_SlD ) THEN + ! initialize these SD loads inputs here in case HD is used (note from initialiazation that these meshes don't exist if HD or SlD aren't used) MeshMapData%u_SD_LMesh%Force = 0.0_ReKi MeshMapData%u_SD_LMesh%Moment = 0.0_ReKi + END IF + + IF ( p_FAST%CompHydro == Module_HD ) THEN !.................. ! Get HD inputs on Morison%LumpedMesh and Morison%DistribMesh @@ -2851,7 +2853,7 @@ SUBROUTINE U_FullOpt1_Residual( y_ED2, y_SD2, y_HD2, y_BD2, y_Orca2, y_ExtPtfm2, !.................. - ! SoilDyn + ! SoilDyn force to SD !.................. if (p_FAST%CompSoil == Module_SlD) then @@ -2859,9 +2861,6 @@ SUBROUTINE U_FullOpt1_Residual( y_ED2, y_SD2, y_HD2, y_BD2, y_Orca2, y_ExtPtfm2, ! SlD loads to SD CALL Transfer_Point_to_Point( y_SlD2%SoilMesh, MeshMapData%u_SD_LMesh_2, MeshMapData%SlD_P_2_SD_P, ErrStat2, ErrMsg2, u_SlD%SoilMesh, y_SD2%Y2Mesh ) CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat, ErrMsg,RoutineName//'Transfer_SlD_to_SD (y_SlD2%SoilMesh -> y_SD2%Y2Mesh)' ) -!print*,'y_SlD%SoilMesh%Force(1:3,1): ',y_SlD2%SoilMesh%Force(1:3,1) -!print*,'SlD load on SD: ',MeshMapData%u_SD_LMesh_2%Force -!print*,'^^^^^^^^^^^^^^^^^^^^^ WHY IS THIS EMPTY ON THE perturb steps?????????' MeshMapData%u_SD_LMesh%Force = MeshMapData%u_SD_LMesh%Force + MeshMapData%u_SD_LMesh_2%Force MeshMapData%u_SD_LMesh%Moment = MeshMapData%u_SD_LMesh%Moment + MeshMapData%u_SD_LMesh_2%Moment endif @@ -3104,9 +3103,9 @@ SUBROUTINE Init_FullOpt1_Jacobian( p_FAST, MeshMapData, ED_PlatformPtMesh, SD_TP p_FAST%SizeJac_Opt1(3) = SD_TPMesh%NNodes*6 ! SD inputs: 6 accelerations per node (size of SD input from ED) - IF ( p_FAST%CompHydro == Module_HD ) THEN + IF ( p_FAST%CompHydro == Module_HD .or. p_FAST%CompSoil == Module_SlD ) THEN p_FAST%SizeJac_Opt1(3) = p_FAST%SizeJac_Opt1(3) & - + SD_LMesh%NNodes *6 ! SD inputs: 6 loads per node (size of SD input from HD) + + SD_LMesh%NNodes *6 ! SD inputs: 6 loads per node (size of SD input from HD or SlD) END IF p_FAST%SizeJac_Opt1(4) = HD_M_LumpedMesh%NNodes *6 & ! HD inputs: 6 accelerations per node (on each Morison mesh) @@ -3486,7 +3485,7 @@ SUBROUTINE Create_FullOpt1_UVector(u, ED_PlatformPtMesh, SD_TPMesh, SD_LMesh, HD indx_first = indx_last + 1 end do - if ( p_FAST%CompHydro == Module_HD .or. p_FAST%CompSoil == Module_SlD ) then ! this SD mesh linked only when HD is enabled + if ( p_FAST%CompHydro == Module_HD .or. p_FAST%CompSoil == Module_SlD ) then ! this SD mesh linked only when HD or SlD are enabled ! SD inputs (SD_LMesh): do i=1,SD_LMesh%NNodes indx_last = indx_first + 2 @@ -4527,7 +4526,7 @@ SUBROUTINE InitModuleMappings(p_FAST, ED, BD, AD14, AD, HD, SD, ExtPtfm, SrvD, M CALL MeshCopy ( SD%Input(1)%TPMesh, MeshMapData%u_SD_TPMesh, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':u_SD_TPMesh' ) - IF ( p_FAST%CompHydro == Module_HD ) THEN + IF ( p_FAST%CompHydro == Module_HD .or. p_FAST%CompSoil == Module_SlD ) THEN CALL MeshCopy ( SD%Input(1)%LMesh, MeshMapData%u_SD_LMesh, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':u_SD_LMesh' ) @@ -4831,17 +4830,19 @@ SUBROUTINE SolveOption1(this_time, this_state, calcJacobian, p_FAST, ED, BD, HD, ! SoilDyn IF ( p_FAST%CompSoil == Module_SlD ) THEN - + ! Overwrite the SlD inputs with the newly calculated values from SD (we don't need correction steps this way) + CALL SlD_InputSolve( SlD%Input(1), SD%y, MeshMapData, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) CALL SlD_CalcOutput( this_time, SlD%Input(1), SlD%p, SlD%x(this_state), SlD%xd(this_state), SlD%z(this_state), & SlD%OtherSt(this_state), SlD%y, SlD%m, ErrStat2, ErrMsg2 ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END IF IF (ErrStat >= AbortErrLev) RETURN IF ( p_FAST%CompSub /= Module_None .OR. (p_FAST%CompElast == Module_BD .and. BD_Solve_Option1) .OR. p_FAST%CompMooring == Module_Orca ) THEN !.OR. p_FAST%CompHydro == Module_HD ) THEN - + ! .or. p_FAST%CompSoil == Module_SlD NOTE: this is only if CompSub /= Module_None + CALL FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & , ED%Input(1), ED%p, ED%x( this_state), ED%xd( this_state), ED%z( this_state), ED%OtherSt( this_state), ED%Output(1), ED%m & , SD%Input(1), SD%p, SD%x( this_state), SD%xd( this_state), SD%z( this_state), SD%OtherSt( this_state), SD%y , SD%m & diff --git a/modules/openfast-library/src/FAST_Subs.f90 b/modules/openfast-library/src/FAST_Subs.f90 index 74a932bc1..5a553895a 100644 --- a/modules/openfast-library/src/FAST_Subs.f90 +++ b/modules/openfast-library/src/FAST_Subs.f90 @@ -1955,7 +1955,7 @@ SUBROUTINE FAST_InitOutput( p_FAST, y_FAST, InitOutData_ED, InitOutData_BD, Init y_FAST%Module_Ver( Module_IceD ) = InitOutData_IceD%Ver y_FAST%FileDescLines(2) = TRIM(y_FAST%FileDescLines(2) ) //'; '//TRIM(GetNVD(y_FAST%Module_Ver( Module_IceD ))) END IF - + IF ( p_FAST%CompSoil == Module_SlD ) THEN y_FAST%Module_Ver( Module_SlD ) = InitOutData_SlD%Ver y_FAST%FileDescLines(2) = TRIM(y_FAST%FileDescLines(2) ) //'; '//TRIM(GetNVD(y_FAST%Module_Ver( Module_SlD ))) @@ -3671,7 +3671,11 @@ SUBROUTINE FAST_WrSum( p_FAST, y_FAST, MeshMapData, ErrStat, ErrMsg ) DescStr = GetNVD( y_FAST%Module_Ver( Module_IceD ) ) IF ( p_FAST%CompIce /= Module_IceD ) DescStr = TRIM(DescStr)//NotUsedTxt WRITE (y_FAST%UnSum,Fmt) TRIM( DescStr ) - + + DescStr = GetNVD( y_FAST%Module_Ver( Module_SlD ) ) + IF ( p_FAST%CompSoil /= Module_SlD ) DescStr = TRIM(DescStr)//NotUsedTxt + WRITE (y_FAST%UnSum,Fmt) TRIM( DescStr ) + !.......................... Information from FAST input File ...................................... ! OTHER information we could print here: From 87f6bb4dc8e146d99b75ba88b0af1d049c64c9b7 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 14 Apr 2020 06:33:04 -0600 Subject: [PATCH 073/136] SlD: add optional flag on SlD_CalcOutput for perturb calcs --- modules/openfast-library/src/FAST_Solver.f90 | 2 +- modules/soildyn/src/REDWINinterface.f90 | 1 + modules/soildyn/src/SoilDyn.f90 | 9 ++++++--- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/modules/openfast-library/src/FAST_Solver.f90 b/modules/openfast-library/src/FAST_Solver.f90 index e694f5200..912f63f36 100644 --- a/modules/openfast-library/src/FAST_Solver.f90 +++ b/modules/openfast-library/src/FAST_Solver.f90 @@ -2321,7 +2321,7 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & CALL Perturb_u_FullOpt1( p_FAST, MeshMapData%Jac_u_indx, i, u_perturb, u_SlD_perturb=u_SlD_perturb, perturb=ThisPerturb ) ! perturb u and u_SlD by ThisPerturb [routine sets ThisPerturb] ! calculate outputs with perturbed inputs: - CALL SlD_CalcOutput( this_time, u_SlD_perturb, p_SlD, x_SlD, xd_SlD, z_SlD, OtherSt_SlD, y_SlD_perturb, m_SlD, ErrStat2, ErrMsg2 ) + CALL SlD_CalcOutput( this_time, u_SlD_perturb, p_SlD, x_SlD, xd_SlD, z_SlD, OtherSt_SlD, y_SlD_perturb, m_SlD, ErrStat2, ErrMsg2, PerturbLoads=.TRUE.) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) CALL U_FullOpt1_Residual(y_ED, y_SD, y_HD, y_BD, y_Orca, y_ExtPtfm, y_SlD_perturb, u_perturb, Fn_U_perturb) ! get this perturbation diff --git a/modules/soildyn/src/REDWINinterface.f90 b/modules/soildyn/src/REDWINinterface.f90 index 1f453f62d..a51a66215 100644 --- a/modules/soildyn/src/REDWINinterface.f90 +++ b/modules/soildyn/src/REDWINinterface.f90 @@ -197,6 +197,7 @@ subroutine REDWINinterface_Init( DLL_FileName, DLL_ProcName, DLL_Trgt, DLL_Model CALL CallREDWINdll(DLL_Trgt, DLL_Model, dll_data, ErrStat2, ErrMsg2); if(Failed()) return; !FIXME: For Model 1, the Props(1,1) will indicate which runmode we are using. Test that here +!!!!!! IDEA: check the stiffness matrix returned!!!! !TODO: can we add a check on which type of library we actually loaded and compare to the model we set???? diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index fbe43a812..10432f71b 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -154,6 +154,7 @@ subroutine SlD_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOu call REDWINinterface_Init( InputFileData%DLL_FileName, InputFileData%DLL_ProcName, p%DLL_Trgt, p%DLL_Model, & m%dll_data(j), p%UseREDWINinterface, ErrStat2, ErrMsg2); if (Failed()) return; enddo +!FIXME: add a call here to get the stiffness matrix from REDWIN!!!! end select ! set paramaters for I/O data @@ -418,7 +419,7 @@ end subroutine SlD_UpdateStates !---------------------------------------------------------------------------------------------------------------------------------- !> This is a routine for computing outputs, used in both loose and tight coupling. -subroutine SlD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) +subroutine SlD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, PerturbLoads ) real(DbKi), intent(in ) :: t !< Current simulation time in seconds type(SlD_InputType), intent(in ) :: u !< Inputs at t @@ -430,6 +431,7 @@ subroutine SlD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg type(SlD_MiscVarType), intent(inout) :: m !< Misc variables for optimization (not copied in glue code) type(SlD_OutputType), intent(inout) :: y !< Outputs computed at t (Input only so that mesh con- !! nectivity information does not have to be recalculated) + logical, optional, intent(in ) :: PerturbLoads !< is this call for a jacobian? If so may have huge inputs integer(IntKi), intent( out) :: ErrStat !< Error status of the operation character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None @@ -452,7 +454,7 @@ subroutine SlD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ! Copy displacement from point mesh (angles in radians -- REDWIN dll also uses rad) Displacement(1:3) = u%SoilMesh%TranslationDisp(1:3,1) ! Translations -- This is R8Ki in the mesh Displacement(4:6) = GetSmllRotAngs(u%SoilMesh%Orientation(1:3,1:3,1), ErrStat, ErrMsg) ! Small angle assumption should be valid here -- Note we are assuming reforientation is 0 - +!print*,'SlD disp: ',t,u%SoilMesh%TranslationDisp(1:3,1) ! Calculate reaction with F = k*dX Force = matmul(p%Stiffness, Displacement) @@ -472,7 +474,8 @@ subroutine SlD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ! Copy displacement from point mesh (angles in radians -- REDWIN dll also uses rad) Displacement(1:3) = u%SoilMesh%TranslationDisp(1:3,i) ! Translations -- This is R8Ki in the mesh Displacement(4:6) = GetSmllRotAngs(u%SoilMesh%Orientation(1:3,1:3,i), ErrStat, ErrMsg) ! Small angle assumption should be valid here -- Note we are assuming reforientation is 0 - + +!FIXME: if perturbation loads, we need to use the stiffness matrix instead!!!! call REDWINinterface_CalcOutput( p%DLL_Trgt, p%DLL_Model, Displacement, Force, m%dll_data(i), ErrStat2, ErrMsg2 ); if (Failed()) return; ! Return reaction force onto the resulting point mesh From 25d313ac20a3ab2213704b98147b0be6a5f82673 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 14 Apr 2020 11:24:47 -0600 Subject: [PATCH 074/136] SlD: updates to solver -- currently stable --- modules/openfast-library/src/FAST_Solver.f90 | 138 ++++++++++++++----- 1 file changed, 102 insertions(+), 36 deletions(-) diff --git a/modules/openfast-library/src/FAST_Solver.f90 b/modules/openfast-library/src/FAST_Solver.f90 index 912f63f36..fb059e44b 100644 --- a/modules/openfast-library/src/FAST_Solver.f90 +++ b/modules/openfast-library/src/FAST_Solver.f90 @@ -2096,9 +2096,9 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & END IF IF ( p_FAST%CompSoil == Module_SlD ) THEN - ! Overwrite the SlD inputs with the newly calculated values from SD (we don't need a correction step this way) - CALL SlD_InputSolve( u_SlD, y_SD, MeshMapData, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) +! ! Overwrite the SlD inputs with the newly calculated values from SD (we don't need a correction step this way) +! CALL SlD_InputSolve( u_SlD, y_SD, MeshMapData, ErrStat2, ErrMsg2 ) +! CALL SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) CALL SlD_CalcOutput( this_time, u_SlD, p_SlD, x_SlD, xd_SlD, z_SlD, OtherSt_SlD, y_SlD, m_SlD, ErrStat2, ErrMsg2 ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) END IF @@ -2460,13 +2460,20 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & CALL WrFileNR(UnJac, ' ExtPtfm_PtfmMesh_RotationAcc_Y_'//TRIM(Num2LStr(TmpIndx))) CALL WrFileNR(UnJac, ' ExtPtfm_PtfmMesh_RotationAcc_Z_'//TRIM(Num2LStr(TmpIndx))) END DO - + + DO TmpIndx=1,u_SlD%SoilMesh%NNodes + CALL WrFileNR(UnJac, ' SlD_SoilMesh_TranslationDisp_X_'//TRIM(Num2LStr(TmpIndx))) + CALL WrFileNR(UnJac, ' SlD_SoilMesh_TranslationDisp_Y_'//TRIM(Num2LStr(TmpIndx))) + CALL WrFileNR(UnJac, ' SlD_SoilMesh_TranslationDisp_Z_'//TRIM(Num2LStr(TmpIndx))) + END DO + DO TmpIndx=1,u_SlD%SoilMesh%NNodes - CALL WrFileNR(UnJac, ' SlD_SoilMesh_TranslationDisp_X_'//TRIM(Num2LStr(TmpIndx))) - CALL WrFileNR(UnJac, ' SlD_SoilMesh_TranslationDisp_Y_'//TRIM(Num2LStr(TmpIndx))) - CALL WrFileNR(UnJac, ' SlD_SoilMesh_TranslationDisp_Z_'//TRIM(Num2LStr(TmpIndx))) + CALL WrFileNR(UnJac, ' SlD_SoilMesh_Orientation_X_'//TRIM(Num2LStr(TmpIndx))) + CALL WrFileNR(UnJac, ' SlD_SoilMesh_Orientation_Y_'//TRIM(Num2LStr(TmpIndx))) + CALL WrFileNR(UnJac, ' SlD_SoilMesh_Orientation_Z_'//TRIM(Num2LStr(TmpIndx))) END DO + WRITE(UnJac,'()') CALL WrMatrix(MeshMapData%Jacobian_Opt1,UnJac, p_FAST%OutFmt) @@ -2743,6 +2750,10 @@ SUBROUTINE U_FullOpt1_Residual( y_ED2, y_SD2, y_HD2, y_BD2, y_Orca2, y_ExtPtfm2, ! Map Subdyn motion to SoilDyn CALL SlD_InputSolve( u_SlD, y_SD2, MeshMapData, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) +!FIXME: should I have this here???? + ! Because SD directly affects the outputs of SlD, we calculate here + CALL SlD_CalcOutput( this_time, u_SlD, p_SlD, x_SlD, xd_SlD, z_SlD, OtherSt_SlD, y_SlD, m_SlD, ErrStat2, ErrMsg2 ) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) END IF @@ -2857,13 +2868,11 @@ SUBROUTINE U_FullOpt1_Residual( y_ED2, y_SD2, y_HD2, y_BD2, y_Orca2, y_ExtPtfm2, !.................. if (p_FAST%CompSoil == Module_SlD) then - if ( y_SlD2%SoilMesh%Committed ) THEN - ! SlD loads to SD - CALL Transfer_Point_to_Point( y_SlD2%SoilMesh, MeshMapData%u_SD_LMesh_2, MeshMapData%SlD_P_2_SD_P, ErrStat2, ErrMsg2, u_SlD%SoilMesh, y_SD2%Y2Mesh ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat, ErrMsg,RoutineName//'Transfer_SlD_to_SD (y_SlD2%SoilMesh -> y_SD2%Y2Mesh)' ) - MeshMapData%u_SD_LMesh%Force = MeshMapData%u_SD_LMesh%Force + MeshMapData%u_SD_LMesh_2%Force - MeshMapData%u_SD_LMesh%Moment = MeshMapData%u_SD_LMesh%Moment + MeshMapData%u_SD_LMesh_2%Moment - endif + ! SlD loads to SD + CALL Transfer_Point_to_Point( y_SlD2%SoilMesh, MeshMapData%u_SD_LMesh_2, MeshMapData%SlD_P_2_SD_P, ErrStat2, ErrMsg2, u_SlD%SoilMesh, y_SD2%Y2Mesh ) + CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat, ErrMsg,RoutineName//'Transfer_SlD_to_SD (y_SlD2%SoilMesh -> y_SD2%Y2Mesh)' ) + MeshMapData%u_SD_LMesh%Force = MeshMapData%u_SD_LMesh%Force + MeshMapData%u_SD_LMesh_2%Force + MeshMapData%u_SD_LMesh%Moment = MeshMapData%u_SD_LMesh%Moment + MeshMapData%u_SD_LMesh_2%Moment endif ! SoilDyn @@ -3136,7 +3145,7 @@ SUBROUTINE Init_FullOpt1_Jacobian( p_FAST, MeshMapData, ED_PlatformPtMesh, SD_TP end if if ( p_FAST%CompSoil == Module_SlD ) then - p_FAST%SizeJac_Opt1(10) = SlD_SoilMesh%NNodes*3 ! Only translation displacements considered + p_FAST%SizeJac_Opt1(10) = SlD_SoilMesh%NNodes*6 ! Only translation displacements and small angle changes end if @@ -3398,20 +3407,29 @@ SUBROUTINE Init_FullOpt1_Jacobian( p_FAST, MeshMapData, ED_PlatformPtMesh, SD_TP end do !i !............... - ! SoilDyn inputs: + ! SoilDyn inputs: !............... - ! SlD_SoilMesh - do i=1,SlD_SoilMesh%NNodes - do j=1,3 - MeshMapData%Jac_u_indx(index,1) = 25 !Module/Mesh/Field: u_SlD%SoilMesh%TranslationDisp = 25 - MeshMapData%Jac_u_indx(index,2) = j !index: j - MeshMapData%Jac_u_indx(index,3) = i !Node: i - index = index + 1 - end do !j - end do !i + ! SlD_SoilMesh + do i=1,SlD_SoilMesh%NNodes + do j=1,3 + MeshMapData%Jac_u_indx(index,1) = 25 !Module/Mesh/Field: u_SlD%SoilMesh%TranslationDisp = 25 + MeshMapData%Jac_u_indx(index,2) = j !index: j + MeshMapData%Jac_u_indx(index,3) = i !Node: i + index = index + 1 + end do !j + end do !i + ! Small angle perturbations only. By defenition, SoilMesh Orientation is very close to the identity + do i=1,SlD_SoilMesh%NNodes + do j=1,3 + MeshMapData%Jac_u_indx(index,1) = 26 !Module/Mesh/Field: u_SlD%SoilMesh%Orientation = 26 + MeshMapData%Jac_u_indx(index,2) = j !index: j + MeshMapData%Jac_u_indx(index,3) = i !Node: i + index = index + 1 + end do !j + end do !i - + END SUBROUTINE Init_FullOpt1_Jacobian !---------------------------------------------------------------------------------------------------------------------------------- !> This routine basically packs the relevant parts of the modules' input meshes for use in this InputOutput solve. @@ -3440,6 +3458,8 @@ SUBROUTINE Create_FullOpt1_UVector(u, ED_PlatformPtMesh, SD_TPMesh, SD_LMesh, HD ! local variables: INTEGER(IntKi) :: i, k, indx_first, indx_last + integer(IntKi) :: ErrStat2 ! error status from get small rot angles (we are completely ignoring it) + character(ErrMsgLen) :: ErrMsg2 ! error message from get small rot angles (we are completely ignoring it) !............... ! ED inputs: @@ -3602,6 +3622,15 @@ SUBROUTINE Create_FullOpt1_UVector(u, ED_PlatformPtMesh, SD_TPMesh, SD_LMesh, HD u(indx_first:indx_last) = SlD_SoilMesh%TranslationDisp(:,i) indx_first = indx_last + 1 end do + ! Small angle changes only!!!! + ! We use the EulerExtract instead of GetSmllRotAngs since we expect the angles to be on the order of 1e-5, where the order is unimportant + ! However, during the initial Jacobian calculation, we may use a large angle to set it, in which ase GetSmllRotAngs fails, and our Jacobian + ! ends up wrong. + do i=1,SlD_SoilMesh%NNodes + indx_last = indx_first + 2 + u(indx_first:indx_last) = real(EulerExtract(SlD_SoilMesh%Orientation(1:3,1:3,i)), ReKi) ! We are ignoring any errors here... + indx_first = indx_last + 1 + end do END SUBROUTINE Create_FullOpt1_UVector !---------------------------------------------------------------------------------------------------------------------------------- @@ -3689,11 +3718,30 @@ SUBROUTINE Add_FullOpt1_u_delta( p_FAST, Jac_u_indx, u_delta, u_ED, u_SD, u_HD, CASE (25) !Module/Mesh/Field: u_SlD%SoilMesh%TranslationDisp = 25 u_SlD%SoilMesh%TranslationDisp( fieldIndx,node) = u_SlD%SoilMesh%TranslationDisp( fieldIndx,node) + real(u_delta(n), R8Ki) + CASE (26) !Module/Mesh/Field: u_SlD%SoilMesh%Orientation = 26 + ! NOTE: the SoilMesh must be close to the identity at all times + !FIXME: This is not very rigorous since we are just sequentially applying them....!!!!! + u_SlD%SoilMesh%Orientation(1:3,1:3,node) = PerturbOrient(u_SlD%SoilMesh%Orientation(1:3,1:3,node),fieldIndx,u_delta(n)) END SELECT END DO - + +CONTAINS + function PerturbOrient(Orientation,Indx,perturb) + real(R8Ki) :: PerturbOrient(3,3) + real(R8Ki), intent(in) :: Orientation(3,3) + integer, intent(in) :: Indx + real(ReKi), intent(in) :: perturb + real(R8Ki) :: Tmp3(3) + real(R8Ki) :: Tmp33(3,3) + character(ErrMsgLen) :: ErrMsg2 ! we will ignore + integer :: ErrStat2 ! we will ignore + Tmp3 = 0.0_R8Ki + Tmp3(Indx) = real(perturb,R8Ki) + call SmllRotTrans( 'Perturb Orientation',Tmp3(1), Tmp3(2), Tmp3(3), Tmp33, '', ErrStat2, ErrMsg2 ) + PerturbOrient = Orientation*Tmp33 + end function PerturbOrient END SUBROUTINE Add_FullOpt1_u_delta !---------------------------------------------------------------------------------------------------------------------------------- !> This routine perturbs the nth element of the u array (and mesh/field it corresponds to) @@ -3716,7 +3764,9 @@ SUBROUTINE Perturb_u_FullOpt1( p_FAST, Jac_u_indx, n, u_perturb, u_ED_perturb, u ! local variables INTEGER :: fieldIndx INTEGER :: node - + REAL( R8Ki ) :: Diag(3,3) = reshape( (/ 1.0_R8Ki, 0.0_R8Ki, 0.0_R8Ki, & + 0.0_R8Ki, 1.0_R8Ki, 0.0_R8Ki, & + 0.0_R8Ki, 0.0_R8Ki, 1.0_R8Ki /),(/3,3/)) fieldIndx = Jac_u_indx(n,2) node = Jac_u_indx(n,3) @@ -3803,15 +3853,31 @@ SUBROUTINE Perturb_u_FullOpt1( p_FAST, Jac_u_indx, n, u_perturb, u_ED_perturb, u u_ExtPtfm_perturb%PtfmMesh%RotationAcc( fieldIndx,node) = u_ExtPtfm_perturb%PtfmMesh%RotationAcc( fieldIndx,node) + perturb CASE (25) !Module/Mesh/Field: u_SlD%SoilMesh%TranslationDisp = 25 -! perturb = GetPerturb( u_SlD_perturb%SoilMesh%TranslationDisp(fieldIndx , node) ) - perturb = 1.0_ReKi + perturb = GetPerturb( real(u_SlD_perturb%SoilMesh%TranslationDisp(fieldIndx , node),ReKi) ) u_SlD_perturb%SoilMesh%TranslationDisp( fieldIndx,node) = u_SlD_perturb%SoilMesh%TranslationDisp( fieldIndx,node) + real(perturb,R8Ki) + CASE (26) !Module/Mesh/Field: u_SlD%SoilMesh%Orientation = 26 + perturb = GetPerturb( real(u_SlD_perturb%SoilMesh%TranslationDisp(fieldIndx , node),ReKi) ) + u_SlD_perturb%SoilMesh%Orientation(1:3,1:3,node) = PerturbOrient(u_SlD_perturb%SoilMesh%Orientation(1:3,1:3,node),fieldIndx,perturb) END SELECT u_perturb(n) = u_perturb(n) + perturb - +CONTAINS + function PerturbOrient(Orientation,Indx,perturb) + real(R8Ki) :: PerturbOrient(3,3) + real(R8Ki), intent(in) :: Orientation(3,3) + integer, intent(in) :: Indx + real(ReKi), intent(in) :: perturb + real(R8Ki) :: Tmp3(3) + real(R8Ki) :: Tmp33(3,3) + character(ErrMsgLen) :: ErrMsg2 ! we will ignore + integer :: ErrStat2 ! we will ignore + Tmp3 = 0.0_R8Ki + Tmp3(Indx) = real(perturb,R8Ki) !/ p_FAST%UJacSclFact + call SmllRotTrans( 'Perturb Orientation',Tmp3(1), Tmp3(2), Tmp3(3), Tmp33, '', ErrStat2, ErrMsg2 ) + PerturbOrient = Tmp33 + end function PerturbOrient END SUBROUTINE Perturb_u_FullOpt1 !---------------------------------------------------------------------------------------------------------------------------------- !> This routine resets the remap flags on all of the meshes @@ -4911,11 +4977,11 @@ SUBROUTINE SolveOption1(this_time, this_state, calcJacobian, p_FAST, ED, BD, HD, END IF - IF (p_FAST%CompSoil == Module_SlD) THEN - ! Map Subdyn motion to SoilDyn - CALL SlD_InputSolve( SlD%Input(1), SD%y, MeshMapData, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) - END IF +! IF (p_FAST%CompSoil == Module_SlD) THEN +! ! Map Subdyn motion to SoilDyn +! CALL SlD_InputSolve( SlD%Input(1), SD%y, MeshMapData, ErrStat2, ErrMsg2 ) +! CALL SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) +! END IF #ifdef DEBUG_MESH_TRANSFER_ICE CALL WrScr('********************************************************') From fd4f45f187f25d8f64a06b431fcc74d52e6480b5 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 14 Apr 2020 11:28:59 -0600 Subject: [PATCH 075/136] SlD: add ability to handle large angle calculations at start --- modules/soildyn/src/SoilDyn.f90 | 44 +++++++++++++++++++++++++++------ 1 file changed, 36 insertions(+), 8 deletions(-) diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index 10432f71b..db401a020 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -442,19 +442,33 @@ subroutine SlD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, real(ReKi) :: AllOuts(0:MaxOutPts) real(R8Ki) :: Displacement(6) real(R8Ki) :: Force(6) + real(R8Ki) :: StiffMatrix(6,6) integer(IntKi) :: i !< generic counter + logical :: LargeAnglePossible ! Initialize ErrStat ErrStat = ErrID_None ErrMsg = "" + if (present(PerturbLoads)) then + LargeAnglePossible = .true. + else + LargeAnglePossible = .false. + endif + select case(p%CalcOption) case (Calc_StiffDamp) ! Copy displacement from point mesh (angles in radians -- REDWIN dll also uses rad) Displacement(1:3) = u%SoilMesh%TranslationDisp(1:3,1) ! Translations -- This is R8Ki in the mesh - Displacement(4:6) = GetSmllRotAngs(u%SoilMesh%Orientation(1:3,1:3,1), ErrStat, ErrMsg) ! Small angle assumption should be valid here -- Note we are assuming reforientation is 0 -!print*,'SlD disp: ',t,u%SoilMesh%TranslationDisp(1:3,1) + + ! If we are doing a perturbation, we will only be doing one angle at a time, and the angle may be large. + if (LargeAnglePossible) then + Displacement(4:6) = EulerExtract(u%SoilMesh%Orientation(1:3,1:3,1)) ! Perturbations only use one angle at a time. + else + Displacement(4:6) = GetSmllRotAngs(u%SoilMesh%Orientation(1:3,1:3,1), ErrStat2, ErrMsg2); if (Failed()) return; + endif + ! Calculate reaction with F = k*dX Force = matmul(p%Stiffness, Displacement) @@ -473,10 +487,21 @@ subroutine SlD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, ! Copy displacement from point mesh (angles in radians -- REDWIN dll also uses rad) Displacement(1:3) = u%SoilMesh%TranslationDisp(1:3,i) ! Translations -- This is R8Ki in the mesh - Displacement(4:6) = GetSmllRotAngs(u%SoilMesh%Orientation(1:3,1:3,i), ErrStat, ErrMsg) ! Small angle assumption should be valid here -- Note we are assuming reforientation is 0 + + ! If we are doing a perturbation, we will only be doing one angle at a time, and the angle may be large. + ! If the angle is too large, the REDWIN DLL will fail, so we will instead calculate using the stored stiffness matrix. + if (LargeAnglePossible) then + Displacement(4:6) = EulerExtract(u%SoilMesh%Orientation(1:3,1:3,i)) ! Perturbations only use one angle at a time. + + call REDWINinterface_GetStiffMatrix( p%DLL_Trgt, p%DLL_Model, Displacement, Force, StiffMatrix, m%dll_data(i), ErrStat2, ErrMsg2 ); if (Failed()) return; + ! Calculate reaction with F = k*dX for large displacements. + Force = matmul(StiffMatrix, Displacement) + else +! Displacement(4:6) = EulerExtract(u%SoilMesh%Orientation(1:3,1:3,i)) ! Perturbations only use one angle at a time. + Displacement(4:6) = GetSmllRotAngs(u%SoilMesh%Orientation(1:3,1:3,i), ErrStat, ErrMsg) ! Small angle assumption should be valid here -- Note we are assuming reforientation is identity -!FIXME: if perturbation loads, we need to use the stiffness matrix instead!!!! - call REDWINinterface_CalcOutput( p%DLL_Trgt, p%DLL_Model, Displacement, Force, m%dll_data(i), ErrStat2, ErrMsg2 ); if (Failed()) return; + call REDWINinterface_CalcOutput( p%DLL_Trgt, p%DLL_Model, Displacement, Force, m%dll_data(i), ErrStat2, ErrMsg2 ); if (Failed()) return; + endif ! Return reaction force onto the resulting point mesh y%SoilMesh%Force (1,i) = -real(Force(1),ReKi) @@ -489,7 +514,8 @@ subroutine SlD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, end select ! Outputs - call SlD_WriteOutput( p, AllOuts, u, y, m, ErrStat2, ErrMsg2 ); if (Failed()) return; + call SlD_WriteOutput( p, AllOuts, u, y, m, ErrStat2, ErrMsg2 ); if (Failed()) return; + do i=1,p%NumOuts y%WriteOutput(i) = p%OutParam(i)%SignM * Allouts( p%OutParam(i)%Indx ) enddo @@ -498,8 +524,10 @@ subroutine SlD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, contains logical function Failed() - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - Failed = ErrStat >= AbortErrLev + if (.not. LargeAnglePossible ) then + call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + Failed = ErrStat >= AbortErrLev + endif end function Failed end subroutine SlD_CalcOutput From 36b28af5b8459276ac354912edb56affb01ebd9b Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 14 Apr 2020 14:46:51 -0600 Subject: [PATCH 076/136] SlD: cleanup the option1 solve slightly (commented out test stuff removed) --- modules/openfast-library/src/FAST_Solver.f90 | 8 -------- 1 file changed, 8 deletions(-) diff --git a/modules/openfast-library/src/FAST_Solver.f90 b/modules/openfast-library/src/FAST_Solver.f90 index fb059e44b..726e49a09 100644 --- a/modules/openfast-library/src/FAST_Solver.f90 +++ b/modules/openfast-library/src/FAST_Solver.f90 @@ -2096,9 +2096,6 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & END IF IF ( p_FAST%CompSoil == Module_SlD ) THEN -! ! Overwrite the SlD inputs with the newly calculated values from SD (we don't need a correction step this way) -! CALL SlD_InputSolve( u_SlD, y_SD, MeshMapData, ErrStat2, ErrMsg2 ) -! CALL SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) CALL SlD_CalcOutput( this_time, u_SlD, p_SlD, x_SlD, xd_SlD, z_SlD, OtherSt_SlD, y_SlD, m_SlD, ErrStat2, ErrMsg2 ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) END IF @@ -4977,11 +4974,6 @@ SUBROUTINE SolveOption1(this_time, this_state, calcJacobian, p_FAST, ED, BD, HD, END IF -! IF (p_FAST%CompSoil == Module_SlD) THEN -! ! Map Subdyn motion to SoilDyn -! CALL SlD_InputSolve( SlD%Input(1), SD%y, MeshMapData, ErrStat2, ErrMsg2 ) -! CALL SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) -! END IF #ifdef DEBUG_MESH_TRANSFER_ICE CALL WrScr('********************************************************') From a57755c93087a87c8dd00f31eeb1119a4ea815cb Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 14 Apr 2020 14:53:05 -0600 Subject: [PATCH 077/136] WIN_DLL_LOAD option (renamed from ORCA_DLL_LOAD) --- CMakeLists.txt | 2 +- modules/orcaflex-interface/CMakeLists.txt | 6 +++--- modules/soildyn/CMakeLists.txt | 6 ++++++ 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f73a82db2..f288d7bf5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -33,7 +33,7 @@ option(BUILD_SHARED_LIBS "Enable building shared libraries" off) option(DOUBLE_PRECISION "Treat REAL as double precision" on) option(USE_DLL_INTERFACE "Enable runtime loading of dynamic libraries" on) option(FPE_TRAP_ENABLED "Enable FPE trap in compiler options" off) -option(ORCA_DLL_LOAD "Enable OrcaFlex Library Load" off) +option(WIN_DLL_LOAD "Enable loading of Windows only DLL's (OrcaFlex, SoilDyn)" on) # This is mostly for testing purposes option(BUILD_OPENFAST_CPP_API "Enable building OpenFAST - C++ API" off) # Precompiler/preprocessor flag configuration diff --git a/modules/orcaflex-interface/CMakeLists.txt b/modules/orcaflex-interface/CMakeLists.txt index fb6da14c5..0d8a20510 100644 --- a/modules/orcaflex-interface/CMakeLists.txt +++ b/modules/orcaflex-interface/CMakeLists.txt @@ -18,11 +18,11 @@ if (GENERATE_TYPES) generate_f90_types(src/OrcaFlexInterface.txt ${CMAKE_CURRENT_LIST_DIR}/src/OrcaFlexInterface_Types.f90) endif() -if (ORCA_DLL_LOAD) +if (WIN_DLL_LOAD) add_definitions(-DLibLoad) -else (ORCA_DLL_LOAD) +else (WIN_DLL_LOAD) add_definitions(-DNO_LibLoad) -endif (ORCA_DLL_LOAD) +endif (WIN_DLL_LOAD) add_library(orcaflexlib src/OrcaFlexInterface.f90 diff --git a/modules/soildyn/CMakeLists.txt b/modules/soildyn/CMakeLists.txt index e853e42a9..71109fd4e 100644 --- a/modules/soildyn/CMakeLists.txt +++ b/modules/soildyn/CMakeLists.txt @@ -18,6 +18,12 @@ if (GENERATE_TYPES) generate_f90_types(src/SoilDyn_Registry.txt ${CMAKE_CURRENT_LIST_DIR}/src/SoilDyn_Types.f90) endif() +if (WIN_DLL_LOAD) + add_definitions(-DLibLoad) +else (WIN_DLL_LOAD) + add_definitions(-DNO_LibLoad) +endif (WIN_DLL_LOAD) + set(SlD_SOURCES src/REDWINinterface.f90 src/SoilDyn.f90 From 8482212e5572b0cde4c88e4f5904fbb95974412b Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 15 Apr 2020 14:20:00 -0600 Subject: [PATCH 078/136] SlD: fix coorinate transform issue in REDWINinterface Coordinate transforms not needed (seem to cause some issues in the results, maybe indicating that an ABS function is used internally). Needs cleanup --- modules/soildyn/src/REDWINinterface.f90 | 32 ++--- modules/soildyn/src/SoilDyn_Registry.txt | 2 + modules/soildyn/src/SoilDyn_Types.f90 | 150 +++++++++++++++++++++++ 3 files changed, 168 insertions(+), 16 deletions(-) diff --git a/modules/soildyn/src/REDWINinterface.f90 b/modules/soildyn/src/REDWINinterface.f90 index a51a66215..89aed2337 100644 --- a/modules/soildyn/src/REDWINinterface.f90 +++ b/modules/soildyn/src/REDWINinterface.f90 @@ -566,11 +566,11 @@ function ToREDWINcoordsR8toR8(InArray) result(REDWIN) real(R8Ki), intent(in) :: InArray(6) real(R8Ki) :: REDWIN(6) REDWIN(1) = InArray(1) - REDWIN(2) = -InArray(2) - REDWIN(3) = -InArray(3) + REDWIN(2) = InArray(2) + REDWIN(3) = InArray(3) REDWIN(4) = InArray(4) - REDWIN(5) = -InArray(5) - REDWIN(6) = -InArray(6) + REDWIN(5) = InArray(5) + REDWIN(6) = InArray(6) end function ToREDWINcoordsR8toR8 !> \copydoc redwininterface::ToREDWINcoordsR8toR8 @@ -578,11 +578,11 @@ function ToREDWINcoordsR8toR8Mat(InArray) result(REDWIN) real(R8Ki), intent(in) :: InArray(6,6) real(R8Ki) :: REDWIN(6,6) REDWIN(:,1) = InArray(:,1) - REDWIN(:,2) = -InArray(:,2) - REDWIN(:,3) = -InArray(:,3) + REDWIN(:,2) = InArray(:,2) + REDWIN(:,3) = InArray(:,3) REDWIN(:,4) = InArray(:,4) - REDWIN(:,5) = -InArray(:,5) - REDWIN(:,6) = -InArray(:,6) + REDWIN(:,5) = InArray(:,5) + REDWIN(:,6) = InArray(:,6) end function ToREDWINcoordsR8toR8Mat @@ -596,11 +596,11 @@ function FromREDWINcoordsR8toR8(InArray) result(FAST) real(R8Ki), intent(in) :: InArray(6) real(R8Ki) :: FAST(6) FAST(1) = InArray(1) - FAST(2) = -InArray(2) - FAST(3) = -InArray(3) + FAST(2) = InArray(2) + FAST(3) = InArray(3) FAST(4) = InArray(4) - FAST(5) = -InArray(5) - FAST(6) = -InArray(6) + FAST(5) = InArray(5) + FAST(6) = InArray(6) end function FromREDWINcoordsR8toR8 !> \copydoc redwininterface::FromREDWINcoordsR8toR8 @@ -608,11 +608,11 @@ function FromREDWINcoordsR8toR8Mat(InArray) result(FAST) real(R8Ki), intent(in) :: InArray(6,6) real(R8Ki) :: FAST(6,6) FAST(:,1) = InArray(:,1) - FAST(:,2) = -InArray(:,2) - FAST(:,3) = -InArray(:,3) + FAST(:,2) = InArray(:,2) + FAST(:,3) = InArray(:,3) FAST(:,4) = InArray(:,4) - FAST(:,5) = -InArray(:,5) - FAST(:,6) = -InArray(:,6) + FAST(:,5) = InArray(:,5) + FAST(:,6) = InArray(:,6) end function FromREDWINcoordsR8toR8Mat diff --git a/modules/soildyn/src/SoilDyn_Registry.txt b/modules/soildyn/src/SoilDyn_Registry.txt index 3d8176264..3c8794814 100644 --- a/modules/soildyn/src/SoilDyn_Registry.txt +++ b/modules/soildyn/src/SoilDyn_Registry.txt @@ -105,6 +105,8 @@ typedef ^ OtherStateType IntKi DummyOtherState - - - "Re # Define any data that are used only for efficiency purposes (these variables are not associated with time): # e.g. indices for searching in an array, large arrays that are local variables in any routine called multiple times, etc. typedef ^ MiscVarType REDWINdllType dll_data : - - "data used for REDWIN DLL" - +typedef ^ MiscVarType REDWINdllType dll_dataPREV : - - "data used for REDWIN DLL -- previous call" - +typedef ^ MiscVarType DbKi PrevTime - - - "previous call time" - # ..... Parameters ................................................................................................................ diff --git a/modules/soildyn/src/SoilDyn_Types.f90 b/modules/soildyn/src/SoilDyn_Types.f90 index dbf73fd03..9dce293e7 100644 --- a/modules/soildyn/src/SoilDyn_Types.f90 +++ b/modules/soildyn/src/SoilDyn_Types.f90 @@ -115,6 +115,8 @@ MODULE SoilDyn_Types ! ========= SlD_MiscVarType ======= TYPE, PUBLIC :: SlD_MiscVarType TYPE(REDWINdllType) , DIMENSION(:), ALLOCATABLE :: dll_data !< data used for REDWIN DLL [-] + TYPE(REDWINdllType) , DIMENSION(:), ALLOCATABLE :: dll_dataPREV !< data used for REDWIN DLL -- previous call [-] + REAL(DbKi) :: PrevTime !< previous call time [-] END TYPE SlD_MiscVarType ! ======================= ! ========= SlD_ParameterType ======= @@ -2129,6 +2131,23 @@ SUBROUTINE SlD_CopyMisc( SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg ) IF (ErrStat>=AbortErrLev) RETURN ENDDO ENDIF +IF (ALLOCATED(SrcMiscData%dll_dataPREV)) THEN + i1_l = LBOUND(SrcMiscData%dll_dataPREV,1) + i1_u = UBOUND(SrcMiscData%dll_dataPREV,1) + IF (.NOT. ALLOCATED(DstMiscData%dll_dataPREV)) THEN + ALLOCATE(DstMiscData%dll_dataPREV(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%dll_dataPREV.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DO i1 = LBOUND(SrcMiscData%dll_dataPREV,1), UBOUND(SrcMiscData%dll_dataPREV,1) + CALL SlD_Copyredwindlltype( SrcMiscData%dll_dataPREV(i1), DstMiscData%dll_dataPREV(i1), CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN + ENDDO +ENDIF + DstMiscData%PrevTime = SrcMiscData%PrevTime END SUBROUTINE SlD_CopyMisc SUBROUTINE SlD_DestroyMisc( MiscData, ErrStat, ErrMsg ) @@ -2145,6 +2164,12 @@ SUBROUTINE SlD_DestroyMisc( MiscData, ErrStat, ErrMsg ) CALL SlD_Destroyredwindlltype( MiscData%dll_data(i1), ErrStat, ErrMsg ) ENDDO DEALLOCATE(MiscData%dll_data) +ENDIF +IF (ALLOCATED(MiscData%dll_dataPREV)) THEN +DO i1 = LBOUND(MiscData%dll_dataPREV,1), UBOUND(MiscData%dll_dataPREV,1) + CALL SlD_Destroyredwindlltype( MiscData%dll_dataPREV(i1), ErrStat, ErrMsg ) +ENDDO + DEALLOCATE(MiscData%dll_dataPREV) ENDIF END SUBROUTINE SlD_DestroyMisc @@ -2207,6 +2232,30 @@ SUBROUTINE SlD_PackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, Si END IF END DO END IF + Int_BufSz = Int_BufSz + 1 ! dll_dataPREV allocated yes/no + IF ( ALLOCATED(InData%dll_dataPREV) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! dll_dataPREV upper/lower bounds for each dimension + DO i1 = LBOUND(InData%dll_dataPREV,1), UBOUND(InData%dll_dataPREV,1) + Int_BufSz = Int_BufSz + 3 ! dll_dataPREV: size of buffers for each call to pack subtype + CALL SlD_Packredwindlltype( Re_Buf, Db_Buf, Int_Buf, InData%dll_dataPREV(i1), ErrStat2, ErrMsg2, .TRUE. ) ! dll_dataPREV + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! dll_dataPREV + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! dll_dataPREV + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! dll_dataPREV + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF + END DO + END IF + Db_BufSz = Db_BufSz + 1 ! PrevTime IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) THEN @@ -2275,6 +2324,49 @@ SUBROUTINE SlD_PackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, Si ENDIF END DO END IF + IF ( .NOT. ALLOCATED(InData%dll_dataPREV) ) 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%dll_dataPREV,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%dll_dataPREV,1) + Int_Xferred = Int_Xferred + 2 + + DO i1 = LBOUND(InData%dll_dataPREV,1), UBOUND(InData%dll_dataPREV,1) + CALL SlD_Packredwindlltype( Re_Buf, Db_Buf, Int_Buf, InData%dll_dataPREV(i1), ErrStat2, ErrMsg2, OnlySize ) ! dll_dataPREV + 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 + END DO + END IF + DbKiBuf ( Db_Xferred:Db_Xferred+(1)-1 ) = InData%PrevTime + Db_Xferred = Db_Xferred + 1 END SUBROUTINE SlD_PackMisc SUBROUTINE SlD_UnPackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) @@ -2366,6 +2458,64 @@ SUBROUTINE SlD_UnPackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg IF(ALLOCATED(Int_Buf)) DEALLOCATE(Int_Buf) END DO END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! dll_dataPREV 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 (ALLOCATED(OutData%dll_dataPREV)) DEALLOCATE(OutData%dll_dataPREV) + ALLOCATE(OutData%dll_dataPREV(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%dll_dataPREV.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i1 = LBOUND(OutData%dll_dataPREV,1), UBOUND(OutData%dll_dataPREV,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 SlD_Unpackredwindlltype( Re_Buf, Db_Buf, Int_Buf, OutData%dll_dataPREV(i1), ErrStat2, ErrMsg2 ) ! dll_dataPREV + 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) + END DO + END IF + OutData%PrevTime = DbKiBuf( Db_Xferred ) + Db_Xferred = Db_Xferred + 1 END SUBROUTINE SlD_UnPackMisc SUBROUTINE SlD_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg ) From 718e0e8094098cb3f45267523860bf89b47f0916 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 15 Apr 2020 14:23:52 -0600 Subject: [PATCH 079/136] SlD: some updates in the call to redwin. Work in progress --- modules/soildyn/src/SoilDyn.f90 | 49 +++++++++++++++++++++++++++++---- 1 file changed, 44 insertions(+), 5 deletions(-) diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index db401a020..a224b8471 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -206,6 +206,12 @@ subroutine SlD_InitMisc( InputFileData, m, ErrStat, ErrMsg ) return endif + allocate( m%dll_dataPREV(InputFileData%DLL_NumPoints), STAT=ErrStat2 ) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Could not allocate m%dll_data', ErrStat, ErrMsg, RoutineName) + return + endif + ! Set the input file names and check they are not too long. Existance checks done in the interface routine. do i=1,InputFileData%DLL_NumPoints m%dll_data(i)%PROPSfile = trim(InputFileData%DLL_PropsFile(i)) @@ -219,6 +225,9 @@ subroutine SlD_InitMisc( InputFileData, m, ErrStat, ErrMsg ) ' characters (DLL limititation)', ErrStat, ErrMsg, '') endif enddo + + m%dll_dataPrev = m%dll_data + m%PrevTime = -1.0_DbKi end select if (ErrStat >= AbortErrLev) return end subroutine SlD_InitMisc @@ -445,6 +454,8 @@ subroutine SlD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, real(R8Ki) :: StiffMatrix(6,6) integer(IntKi) :: i !< generic counter logical :: LargeAnglePossible + logical :: TimeStepRecalc + logical :: firstcall ! Initialize ErrStat ErrStat = ErrID_None @@ -456,6 +467,15 @@ subroutine SlD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, LargeAnglePossible = .false. endif +firstcall=.false. +if(m%PrevTime < 0.0_DbKi) firstcall=.true. + ! Are we recalculating a previous timestep (like correction step?) + if (T > m%PrevTime) then + TimeStepRecalc = .FALSE. + else + TimeStepRecalc = .TRUE. + endif + select case(p%CalcOption) case (Calc_StiffDamp) @@ -484,23 +504,42 @@ subroutine SlD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, case (Calc_REDWIN) ! call the dll do i=1,size(m%dll_data) +if(firstcall) m%dll_dataPREV(i) = m%dll_data(i) + ! reset old states if recalc + if (TimeStepRecalc) then + m%dll_data(i) = m%dll_dataPREV(i) + endif +Displacement = 0.0_R8Ki + call REDWINinterface_GetStiffMatrix( p%DLL_Trgt, p%DLL_Model, Displacement, Force, StiffMatrix, m%dll_data(i), ErrStat2, ErrMsg2 ); if (Failed()) return; ! Copy displacement from point mesh (angles in radians -- REDWIN dll also uses rad) Displacement(1:3) = u%SoilMesh%TranslationDisp(1:3,i) ! Translations -- This is R8Ki in the mesh + if (p%DLL_Model == 2) Displacement(3) = 0.0_R8Ki - ! If we are doing a perturbation, we will only be doing one angle at a time, and the angle may be large. - ! If the angle is too large, the REDWIN DLL will fail, so we will instead calculate using the stored stiffness matrix. if (LargeAnglePossible) then + Displacement(4:6) = EulerExtract(u%SoilMesh%Orientation(1:3,1:3,i)) ! Perturbations only use one angle at a time. + if (p%DLL_Model == 2) Displacement(6) = 0.0_R8Ki - call REDWINinterface_GetStiffMatrix( p%DLL_Trgt, p%DLL_Model, Displacement, Force, StiffMatrix, m%dll_data(i), ErrStat2, ErrMsg2 ); if (Failed()) return; ! Calculate reaction with F = k*dX for large displacements. Force = matmul(StiffMatrix, Displacement) else -! Displacement(4:6) = EulerExtract(u%SoilMesh%Orientation(1:3,1:3,i)) ! Perturbations only use one angle at a time. - Displacement(4:6) = GetSmllRotAngs(u%SoilMesh%Orientation(1:3,1:3,i), ErrStat, ErrMsg) ! Small angle assumption should be valid here -- Note we are assuming reforientation is identity + Displacement(4:6) = GetSmllRotAngs(u%SoilMesh%Orientation(1:3,1:3,i), ErrStat2, ErrMsg2); if (Failed()) return; ! Small angle assumption should be valid here -- Note we are assuming reforientation is identity + + if (p%DLL_Model == 2) Displacement(6) = 0.0_R8Ki call REDWINinterface_CalcOutput( p%DLL_Trgt, p%DLL_Model, Displacement, Force, m%dll_data(i), ErrStat2, ErrMsg2 ); if (Failed()) return; + + ! store new states if not recalc + if (.not. TimeStepRecalc) then + m%dll_dataPREV(i) = m%dll_data(i) + endif + + endif + + if (p%DLL_Model == 2) then + Force(3) = 0.0_R8Ki + Force(6) = 0.0_R8Ki endif ! Return reaction force onto the resulting point mesh From 1fcab72fd5cd11e15732c998c31d1b1a1072e2a5 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Thu, 16 Apr 2020 16:24:15 -0600 Subject: [PATCH 080/136] SlD: allow for using only DLL stiffness matrices in the response calcs --- modules/soildyn/src/SoilDyn.f90 | 51 +++++++----- modules/soildyn/src/SoilDyn_IO.f90 | 37 ++++++-- modules/soildyn/src/SoilDyn_Registry.txt | 4 + modules/soildyn/src/SoilDyn_Types.f90 | 102 +++++++++++++++++++++++ 4 files changed, 169 insertions(+), 25 deletions(-) diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index a224b8471..acea3a316 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -145,16 +145,12 @@ subroutine SlD_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOu call SlD_InitMeshes( InputFileData, InitInp, u, y, p, m, ErrStat2,ErrMsg2); if (Failed()) return; + ! Setup and initialize the Calc Options select case(p%CalcOption) case (Calc_StiffDamp) case (Calc_PYcurve) case (Calc_REDWIN) - ! Initialize the dll - do j=1,size(m%dll_data) - call REDWINinterface_Init( InputFileData%DLL_FileName, InputFileData%DLL_ProcName, p%DLL_Trgt, p%DLL_Model, & - m%dll_data(j), p%UseREDWINinterface, ErrStat2, ErrMsg2); if (Failed()) return; - enddo -!FIXME: add a call here to get the stiffness matrix from REDWIN!!!! + call SlD_REDWINsetup( InputFileData,p, m, ErrStat, ErrMsg ) end select ! set paramaters for I/O data @@ -177,6 +173,31 @@ logical function Failed() Failed = ErrStat >= AbortErrLev end function Failed + subroutine SlD_REDWINsetup( InputFileData,p, m, ErrStat, ErrMsg ) + type(SlD_InputFile), intent(in ) :: InputFileData !< Data stored in the module's input file + type(SlD_ParameterType),intent(inout) :: p !< Parameters + type(SlD_MiscVarType), intent(inout) :: m !< Misc variables for optimization (not copied in glue code) + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(IntKi) :: i ! Generic counter + integer(IntKi) :: ErrStat2 !< local error status + character(ErrMsgLen) :: ErrMsg2 !< local error message + real(R8Ki) :: NullDispl(6) !< ignored + real(R8Ki) :: NullForce(6) !< ignored + + ! set placeholder for DLL stifness matrices + call AllocAry( p%DLL_Stiffness, 6, 6, size(m%dll_data), 'DLL stiffness matrices', ErrStat2, ErrMsg2 ); if (Failed()) return; + + ! Initialize the dll + do i=1,size(m%dll_data) + call REDWINinterface_Init( InputFileData%DLL_FileName, InputFileData%DLL_ProcName, p%DLL_Trgt, p%DLL_Model, & + m%dll_data(i), p%UseREDWINinterface, ErrStat2, ErrMsg2); if (Failed()) return; + NullDispl = 0.0_R8Ki + NullForce = 0.0_ReKi + call REDWINinterface_GetStiffMatrix( p%DLL_Trgt, p%DLL_Model, NullDispl, NullForce, p%DLL_StiffNess(1:6,1:6,i), m%dll_data(i), ErrStat2, ErrMsg2 ); if (Failed()) return; + enddo + end subroutine SlD_REDWINsetup + !> Allocate arrays for storing the DLL input file names, and check that they exist. The DLL has no error checking (as of 2020.02.10) !! and will create empty input files before segfaulting. subroutine SlD_InitMisc( InputFileData, m, ErrStat, ErrMsg ) @@ -455,7 +476,6 @@ subroutine SlD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, integer(IntKi) :: i !< generic counter logical :: LargeAnglePossible logical :: TimeStepRecalc - logical :: firstcall ! Initialize ErrStat ErrStat = ErrID_None @@ -467,8 +487,7 @@ subroutine SlD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, LargeAnglePossible = .false. endif -firstcall=.false. -if(m%PrevTime < 0.0_DbKi) firstcall=.true. + ! Are we recalculating a previous timestep (like correction step?) if (T > m%PrevTime) then TimeStepRecalc = .FALSE. @@ -504,19 +523,17 @@ subroutine SlD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, case (Calc_REDWIN) ! call the dll do i=1,size(m%dll_data) -if(firstcall) m%dll_dataPREV(i) = m%dll_data(i) ! reset old states if recalc if (TimeStepRecalc) then m%dll_data(i) = m%dll_dataPREV(i) endif -Displacement = 0.0_R8Ki - call REDWINinterface_GetStiffMatrix( p%DLL_Trgt, p%DLL_Model, Displacement, Force, StiffMatrix, m%dll_data(i), ErrStat2, ErrMsg2 ); if (Failed()) return; ! Copy displacement from point mesh (angles in radians -- REDWIN dll also uses rad) Displacement(1:3) = u%SoilMesh%TranslationDisp(1:3,i) ! Translations -- This is R8Ki in the mesh if (p%DLL_Model == 2) Displacement(3) = 0.0_R8Ki - if (LargeAnglePossible) then + ! If we are have a large input angle, or requested only using stiffness matrices in the calculation + if (LargeAnglePossible .or. p%DLL_OnlyStiff) then Displacement(4:6) = EulerExtract(u%SoilMesh%Orientation(1:3,1:3,i)) ! Perturbations only use one angle at a time. if (p%DLL_Model == 2) Displacement(6) = 0.0_R8Ki @@ -543,12 +560,8 @@ subroutine SlD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, endif ! Return reaction force onto the resulting point mesh - y%SoilMesh%Force (1,i) = -real(Force(1),ReKi) - y%SoilMesh%Force (2,i) = -real(Force(2),ReKi) - y%SoilMesh%Force (3,i) = -real(Force(3),ReKi) - y%SoilMesh%Moment(1,i) = -real(Force(4),ReKi) - y%SoilMesh%Moment(2,i) = -real(Force(5),ReKi) - y%SoilMesh%Moment(3,i) = -real(Force(6),ReKi) + y%SoilMesh%Force (1:3,i) = -real(Force(1:3),ReKi) + y%SoilMesh%Moment(1:3,i) = -real(Force(4:6),ReKi) enddo end select diff --git a/modules/soildyn/src/SoilDyn_IO.f90 b/modules/soildyn/src/SoilDyn_IO.f90 index e728ec4b8..f27ffab60 100644 --- a/modules/soildyn/src/SoilDyn_IO.f90 +++ b/modules/soildyn/src/SoilDyn_IO.f90 @@ -224,6 +224,7 @@ subroutine SlD_ReadInput( InputFileName, EchoFileName, InputFileData, ErrStat, E character(ErrMsgLen) :: TmpErrMsg !< Temporary error message character(1024) :: PriPath !< Path name of the primary file character(*), PARAMETER :: RoutineName="SlD_ReadInput" + character(2) :: TmpChar2 !< temporary character string length 2 ! Initialize local data @@ -359,9 +360,14 @@ subroutine SlD_ReadInput( InputFileName, EchoFileName, InputFileData, ErrStat, E call ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line', TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; - call ReadVar( UnitInput, InputFileName, InputFileData%DLL_model, "DLL_model", "REDWIN DLL to use", TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; - call ReadVar( UnitInput, InputFileName, InputFileData%DLL_FileName, "DLL_FileName", "REDWIN DLL model used", TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; - call ReadVar( UnitInput, InputFileName, InputFileData%DLL_NumPoints, "DLL_NumPoints", "Number of DLL interfaces", TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; + +!FIXME: parse out the 's' option. + ! DLL model, and optionally only use stiffness matrix in response calcs + call ReadVar( UnitInput, InputFileName, InputFileData%DLL_modelChr, "DLL_Model", "REDWIN DLL model to use", TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; + call Conv2UC( TmpChar2 ) ! Convert Line to upper case. + + call ReadVar( UnitInput, InputFileName, InputFileData%DLL_FileName, "DLL_FileName", "REDWIN DLL model used", TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; + call ReadVar( UnitInput, InputFileName, InputFileData%DLL_NumPoints, "DLL_NumPoints", "Number of DLL interfaces", TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; ! Allocate arrays to hold the information that will be read in next allocate( InputFileData%DLL_locations(3,InputFileData%DLL_NumPoints), STAT=TmpErrStat ) @@ -461,10 +467,11 @@ SUBROUTINE SlD_ValidateInput( InitInp, InputFileData, ErrStat, ErrMsg ) TYPE(SlD_InputFile), INTENT(INOUT) :: InputFileData !< The data for initialization INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status from this subroutine CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message from this subroutine - INTEGER(IntKi) :: TmpErrStat !< Temporary error status for subroutine and function calls - CHARACTER(ErrMsgLen) :: TmpErrMsg !< Temporary error message for subroutine and function calls + INTEGER(IntKi) :: ErrStat2 !< Temporary error status for subroutine and function calls + CHARACTER(ErrMsgLen) :: ErrMsg2 !< Temporary error message for subroutine and function calls INTEGER(IntKi) :: I !< Generic counter CHARACTER(*), PARAMETER :: RoutineName="SlD_ValidateInput" + integer(IntKi) :: IOS !< Temporary error status ! Initialize ErrStat ErrStat = ErrID_None @@ -481,7 +488,25 @@ subroutine ValidatePYcurves() end subroutine ValidatePYcurves subroutine ValidateDLL() - ! Placeholder + ! Check the model + read( InputFileData%DLL_modelChr(1:1), *, IOSTAT=IOS ) InputFileData%DLL_model + call CheckIOS ( IOS, "", 'DLL_model', NumType, ErrStat2, ErrMsg2 ) + call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + if ( ErrStat >= AbortErrLev ) return + if ( InputFileData%DLL_model > 3 .or. InputFileData%DLL_model < 1 ) then + call SetErrStat( ErrID_Fatal,' DLL_Model must be 1, 2, or 3', ErrStat,ErrMsg,RoutineName) + if ( ErrStat >= AbortErrLev ) return + endif + InputFileData%DLL_OnlyStiff = .false. + if (LEN_TRIM(InputFileData%DLL_modelChr) > 1 ) then + if ( InputFileData%DLL_modelChr(2:2) == 'S' ) then + InputFileData%DLL_OnlyStiff = .true. + call SetErrStat( ErrID_Info, ' Using only the stiffness matrices from the REDWIN DLL', ErrStat,ErrMsg,RoutineName ) + else + call SetErrStat( ErrID_Fatal, ' Unknown option '''//InputFileData%DLL_modelChr(2:2)//''' on the DLL_model', ErrStat,ErrMsg,RoutineName) + endif + endif + end subroutine ValidateDLL END SUBROUTINE SlD_ValidateInput diff --git a/modules/soildyn/src/SoilDyn_Registry.txt b/modules/soildyn/src/SoilDyn_Registry.txt index 3c8794814..97236d101 100644 --- a/modules/soildyn/src/SoilDyn_Registry.txt +++ b/modules/soildyn/src/SoilDyn_Registry.txt @@ -49,6 +49,7 @@ typedef ^ SlD_InputFile IntKi PY_numpoints - - - "N typedef ^ SlD_InputFile ReKi PY_locations :: - - "P-Y curve location points for mesh" '(m)' typedef ^ SlD_InputFile character(1024) PY_inputFile : - - "Input file with P-Y curve data" - typedef ^ SlD_InputFile IntKi DLL_model - - - "REDWIN DLL model type to use" - +typedef ^ SlD_InputFile CHARACTER(2) DLL_modelChr - - - "REDWIN DLL model type to use - character string" - typedef ^ SlD_InputFile CHARACTER(1024) DLL_FileName - - - "Name of the DLL file including the full path" - typedef ^ SlD_InputFile CHARACTER(1024) DLL_ProcName - - - "Name of the procedure in the DLL that will be called" - typedef ^ SlD_InputFile IntKi DLL_numpoints - - - "Number of points to interface to DLL" - @@ -57,6 +58,7 @@ typedef ^ SlD_InputFile CHARACTER(1024) DLL_PROPSFILE : - - "N typedef ^ SlD_InputFile CHARACTER(1024) DLL_LDISPFILE : - - "Name of LDISPFILE input file used in DLL" - typedef ^ SlD_InputFile LOGICAL SumPrint - - - "Print summary information to file (.SlD.sum)" - typedef ^ SlD_InputFile IntKi NumOuts - - - "Number of outputs requested" - +typedef ^ SlD_InputFile logical DLL_OnlyStiff - - - "use only the DLL stiffness matrices in calculating response" - # ..... Initialization data ....................................................................................................... # Define inputs that the initialization routine may need here: @@ -129,6 +131,8 @@ typedef ^ ParameterType ReKi WtrDepth typedef ^ ParameterType IntKi Nodes_C {:}{:} - - "Nodes in input mesh that reaction force may be applied to" '(-)' typedef ^ ParameterType R8Ki Stiffness {6}{6} - - "Stiffness matrix" '(N/m, N-m/rad)' #typedef ^ ParameterType R8Ki Damping {6}{6} - - "Damping matrix" '(N/m, N-m/rad)' +typedef ^ ParameterType R8Ki DLL_Stiffness {:}{:}{:} - - "Stiffness matrices from REDWIN DLL" '(N/m, N-m/rad)' +typedef ^ ParameterType logical DLL_OnlyStiff - - - "Use only the stiffness matrix in calculating the restoring forces" - # ..... Inputs .................................................................................................................... typedef ^ InputType MeshType SoilMesh - - - "Mesh of soil contact points" - diff --git a/modules/soildyn/src/SoilDyn_Types.f90 b/modules/soildyn/src/SoilDyn_Types.f90 index 9dce293e7..37ef635ae 100644 --- a/modules/soildyn/src/SoilDyn_Types.f90 +++ b/modules/soildyn/src/SoilDyn_Types.f90 @@ -66,6 +66,7 @@ MODULE SoilDyn_Types REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: PY_locations !< P-Y curve location points for mesh ['(m)'] character(1024) , DIMENSION(:), ALLOCATABLE :: PY_inputFile !< Input file with P-Y curve data [-] INTEGER(IntKi) :: DLL_model !< REDWIN DLL model type to use [-] + CHARACTER(2) :: DLL_modelChr !< REDWIN DLL model type to use - character string [-] CHARACTER(1024) :: DLL_FileName !< Name of the DLL file including the full path [-] CHARACTER(1024) :: DLL_ProcName !< Name of the procedure in the DLL that will be called [-] INTEGER(IntKi) :: DLL_numpoints !< Number of points to interface to DLL [-] @@ -74,6 +75,7 @@ MODULE SoilDyn_Types CHARACTER(1024) , DIMENSION(:), ALLOCATABLE :: DLL_LDISPFILE !< Name of LDISPFILE input file used in DLL [-] LOGICAL :: SumPrint !< Print summary information to file (.SlD.sum) [-] INTEGER(IntKi) :: NumOuts !< Number of outputs requested [-] + LOGICAL :: DLL_OnlyStiff !< use only the DLL stiffness matrices in calculating response [-] END TYPE SlD_InputFile ! ======================= ! ========= SlD_InitInputType ======= @@ -137,6 +139,8 @@ MODULE SoilDyn_Types REAL(ReKi) :: WtrDepth !< Water depth to mudline (global coordinates) ['(m)'] INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: Nodes_C !< Nodes in input mesh that reaction force may be applied to ['(-)'] REAL(R8Ki) , DIMENSION(1:6,1:6) :: Stiffness !< Stiffness matrix ['(N/m,] + REAL(R8Ki) , DIMENSION(:,:,:), ALLOCATABLE :: DLL_Stiffness !< Stiffness matrices from REDWIN DLL ['(N/m,] + LOGICAL :: DLL_OnlyStiff !< Use only the stiffness matrix in calculating the restoring forces [-] END TYPE SlD_ParameterType ! ======================= ! ========= SlD_InputType ======= @@ -162,6 +166,7 @@ SUBROUTINE SlD_CopyREDWINdllType( SrcREDWINdllTypeData, DstREDWINdllTypeData, Ct INTEGER(IntKi) :: i,j,k INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 INTEGER(IntKi) :: i2, i2_l, i2_u ! bounds (upper/lower) for an array dimension 2 + INTEGER(IntKi) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'SlD_CopyREDWINdllType' @@ -322,6 +327,7 @@ SUBROUTINE SlD_UnPackREDWINdllType( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat LOGICAL, ALLOCATABLE :: mask5(:,:,:,:,:) INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 INTEGER(IntKi) :: i2, i2_l, i2_u ! bounds (upper/lower) for an array dimension 2 + INTEGER(IntKi) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'SlD_UnPackREDWINdllType' @@ -500,6 +506,7 @@ SUBROUTINE SlD_CopyInputFile( SrcInputFileData, DstInputFileData, CtrlCode, ErrS DstInputFileData%PY_inputFile = SrcInputFileData%PY_inputFile ENDIF DstInputFileData%DLL_model = SrcInputFileData%DLL_model + DstInputFileData%DLL_modelChr = SrcInputFileData%DLL_modelChr DstInputFileData%DLL_FileName = SrcInputFileData%DLL_FileName DstInputFileData%DLL_ProcName = SrcInputFileData%DLL_ProcName DstInputFileData%DLL_numpoints = SrcInputFileData%DLL_numpoints @@ -543,6 +550,7 @@ SUBROUTINE SlD_CopyInputFile( SrcInputFileData, DstInputFileData, CtrlCode, ErrS ENDIF DstInputFileData%SumPrint = SrcInputFileData%SumPrint DstInputFileData%NumOuts = SrcInputFileData%NumOuts + DstInputFileData%DLL_OnlyStiff = SrcInputFileData%DLL_OnlyStiff END SUBROUTINE SlD_CopyInputFile SUBROUTINE SlD_DestroyInputFile( InputFileData, ErrStat, ErrMsg ) @@ -632,6 +640,7 @@ SUBROUTINE SlD_PackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs Int_BufSz = Int_BufSz + SIZE(InData%PY_inputFile)*LEN(InData%PY_inputFile) ! PY_inputFile END IF Int_BufSz = Int_BufSz + 1 ! DLL_model + Int_BufSz = Int_BufSz + 1*LEN(InData%DLL_modelChr) ! DLL_modelChr Int_BufSz = Int_BufSz + 1*LEN(InData%DLL_FileName) ! DLL_FileName Int_BufSz = Int_BufSz + 1*LEN(InData%DLL_ProcName) ! DLL_ProcName Int_BufSz = Int_BufSz + 1 ! DLL_numpoints @@ -652,6 +661,7 @@ SUBROUTINE SlD_PackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs END IF Int_BufSz = Int_BufSz + 1 ! SumPrint Int_BufSz = Int_BufSz + 1 ! NumOuts + Int_BufSz = Int_BufSz + 1 ! DLL_OnlyStiff IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) THEN @@ -745,6 +755,10 @@ SUBROUTINE SlD_PackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs END IF IntKiBuf ( Int_Xferred:Int_Xferred+(1)-1 ) = InData%DLL_model Int_Xferred = Int_Xferred + 1 + DO I = 1, LEN(InData%DLL_modelChr) + IntKiBuf(Int_Xferred) = ICHAR(InData%DLL_modelChr(I:I), IntKi) + Int_Xferred = Int_Xferred + 1 + END DO ! I DO I = 1, LEN(InData%DLL_FileName) IntKiBuf(Int_Xferred) = ICHAR(InData%DLL_FileName(I:I), IntKi) Int_Xferred = Int_Xferred + 1 @@ -809,6 +823,8 @@ SUBROUTINE SlD_PackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs Int_Xferred = Int_Xferred + 1 IntKiBuf ( Int_Xferred:Int_Xferred+(1)-1 ) = InData%NumOuts Int_Xferred = Int_Xferred + 1 + IntKiBuf ( Int_Xferred:Int_Xferred+1-1 ) = TRANSFER( InData%DLL_OnlyStiff , IntKiBuf(1), 1) + Int_Xferred = Int_Xferred + 1 END SUBROUTINE SlD_PackInputFile SUBROUTINE SlD_UnPackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) @@ -972,6 +988,10 @@ SUBROUTINE SlD_UnPackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er END IF OutData%DLL_model = IntKiBuf( Int_Xferred ) Int_Xferred = Int_Xferred + 1 + DO I = 1, LEN(OutData%DLL_modelChr) + OutData%DLL_modelChr(I:I) = CHAR(IntKiBuf(Int_Xferred)) + Int_Xferred = Int_Xferred + 1 + END DO ! I DO I = 1, LEN(OutData%DLL_FileName) OutData%DLL_FileName(I:I) = CHAR(IntKiBuf(Int_Xferred)) Int_Xferred = Int_Xferred + 1 @@ -1066,6 +1086,8 @@ SUBROUTINE SlD_UnPackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er Int_Xferred = Int_Xferred + 1 OutData%NumOuts = IntKiBuf( Int_Xferred ) Int_Xferred = Int_Xferred + 1 + OutData%DLL_OnlyStiff = TRANSFER( IntKiBuf( Int_Xferred ), mask0 ) + Int_Xferred = Int_Xferred + 1 END SUBROUTINE SlD_UnPackInputFile SUBROUTINE SlD_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, ErrStat, ErrMsg ) @@ -2528,6 +2550,7 @@ SUBROUTINE SlD_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg INTEGER(IntKi) :: i,j,k INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 INTEGER(IntKi) :: i2, i2_l, i2_u ! bounds (upper/lower) for an array dimension 2 + INTEGER(IntKi) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'SlD_CopyParam' @@ -2578,6 +2601,23 @@ SUBROUTINE SlD_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg DstParamData%Nodes_C = SrcParamData%Nodes_C ENDIF DstParamData%Stiffness = SrcParamData%Stiffness +IF (ALLOCATED(SrcParamData%DLL_Stiffness)) THEN + i1_l = LBOUND(SrcParamData%DLL_Stiffness,1) + i1_u = UBOUND(SrcParamData%DLL_Stiffness,1) + i2_l = LBOUND(SrcParamData%DLL_Stiffness,2) + i2_u = UBOUND(SrcParamData%DLL_Stiffness,2) + i3_l = LBOUND(SrcParamData%DLL_Stiffness,3) + i3_u = UBOUND(SrcParamData%DLL_Stiffness,3) + IF (.NOT. ALLOCATED(DstParamData%DLL_Stiffness)) THEN + ALLOCATE(DstParamData%DLL_Stiffness(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%DLL_Stiffness.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstParamData%DLL_Stiffness = SrcParamData%DLL_Stiffness +ENDIF + DstParamData%DLL_OnlyStiff = SrcParamData%DLL_OnlyStiff END SUBROUTINE SlD_CopyParam SUBROUTINE SlD_DestroyParam( ParamData, ErrStat, ErrMsg ) @@ -2598,6 +2638,9 @@ SUBROUTINE SlD_DestroyParam( ParamData, ErrStat, ErrMsg ) ENDIF IF (ALLOCATED(ParamData%Nodes_C)) THEN DEALLOCATE(ParamData%Nodes_C) +ENDIF +IF (ALLOCATED(ParamData%DLL_Stiffness)) THEN + DEALLOCATE(ParamData%DLL_Stiffness) ENDIF END SUBROUTINE SlD_DestroyParam @@ -2695,6 +2738,12 @@ SUBROUTINE SlD_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, S Int_BufSz = Int_BufSz + SIZE(InData%Nodes_C) ! Nodes_C END IF Db_BufSz = Db_BufSz + SIZE(InData%Stiffness) ! Stiffness + Int_BufSz = Int_BufSz + 1 ! DLL_Stiffness allocated yes/no + IF ( ALLOCATED(InData%DLL_Stiffness) ) THEN + Int_BufSz = Int_BufSz + 2*3 ! DLL_Stiffness upper/lower bounds for each dimension + Db_BufSz = Db_BufSz + SIZE(InData%DLL_Stiffness) ! DLL_Stiffness + END IF + Int_BufSz = Int_BufSz + 1 ! DLL_OnlyStiff IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) THEN @@ -2841,6 +2890,27 @@ SUBROUTINE SlD_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, S END IF DbKiBuf ( Db_Xferred:Db_Xferred+(SIZE(InData%Stiffness))-1 ) = PACK(InData%Stiffness,.TRUE.) Db_Xferred = Db_Xferred + SIZE(InData%Stiffness) + IF ( .NOT. ALLOCATED(InData%DLL_Stiffness) ) 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%DLL_Stiffness,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%DLL_Stiffness,1) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%DLL_Stiffness,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%DLL_Stiffness,2) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%DLL_Stiffness,3) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%DLL_Stiffness,3) + Int_Xferred = Int_Xferred + 2 + + IF (SIZE(InData%DLL_Stiffness)>0) DbKiBuf ( Db_Xferred:Db_Xferred+(SIZE(InData%DLL_Stiffness))-1 ) = PACK(InData%DLL_Stiffness,.TRUE.) + Db_Xferred = Db_Xferred + SIZE(InData%DLL_Stiffness) + END IF + IntKiBuf ( Int_Xferred:Int_Xferred+1-1 ) = TRANSFER( InData%DLL_OnlyStiff , IntKiBuf(1), 1) + Int_Xferred = Int_Xferred + 1 END SUBROUTINE SlD_PackParam SUBROUTINE SlD_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) @@ -2864,6 +2934,7 @@ SUBROUTINE SlD_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg LOGICAL, ALLOCATABLE :: mask5(:,:,:,:,:) INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 INTEGER(IntKi) :: i2, i2_l, i2_u ! bounds (upper/lower) for an array dimension 2 + INTEGER(IntKi) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'SlD_UnPackParam' @@ -3044,6 +3115,37 @@ SUBROUTINE SlD_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg OutData%Stiffness = REAL( UNPACK(DbKiBuf( Db_Xferred:Db_Xferred+(SIZE(OutData%Stiffness))-1 ), mask2, 0.0_DbKi ), R8Ki) Db_Xferred = Db_Xferred + SIZE(OutData%Stiffness) DEALLOCATE(mask2) + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! DLL_Stiffness 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 + i2_l = IntKiBuf( Int_Xferred ) + i2_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + i3_l = IntKiBuf( Int_Xferred ) + i3_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ALLOCATED(OutData%DLL_Stiffness)) DEALLOCATE(OutData%DLL_Stiffness) + ALLOCATE(OutData%DLL_Stiffness(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%DLL_Stiffness.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + ALLOCATE(mask3(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating mask3.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + mask3 = .TRUE. + IF (SIZE(OutData%DLL_Stiffness)>0) OutData%DLL_Stiffness = REAL( UNPACK(DbKiBuf( Db_Xferred:Db_Xferred+(SIZE(OutData%DLL_Stiffness))-1 ), mask3, 0.0_DbKi ), R8Ki) + Db_Xferred = Db_Xferred + SIZE(OutData%DLL_Stiffness) + DEALLOCATE(mask3) + END IF + OutData%DLL_OnlyStiff = TRANSFER( IntKiBuf( Int_Xferred ), mask0 ) + Int_Xferred = Int_Xferred + 1 END SUBROUTINE SlD_UnPackParam SUBROUTINE SlD_CopyInput( SrcInputData, DstInputData, CtrlCode, ErrStat, ErrMsg ) From 9eff353c3983796c47e5d65e6b178a2aac11d344 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Thu, 16 Apr 2020 17:19:39 -0600 Subject: [PATCH 081/136] SlD: update on the stiff only DLL calcs --- modules/soildyn/src/SoilDyn.f90 | 12 +++++++----- modules/soildyn/src/SoilDyn_IO.f90 | 9 ++++++++- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index acea3a316..7cc62264c 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -107,13 +107,15 @@ subroutine SlD_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOu call SlD_ReadInput( InitInp%InputFile, p%EchoFileName, InputFileData, ErrStat2, ErrMsg2 ); if (Failed()) return; + call SlD_ValidateInput( InitInp, InputFileData, ErrStat2, ErrMsg2 ); if (Failed()) return; ! Define parameters here: - p%DT = Interval - p%DLL_Model = InputFileData%DLL_Model - p%CalcOption = InputFileData%CalcOption - p%Stiffness = InputFileData%Stiffness -! p%Damping = InputFileData%Damping + p%DT = Interval + p%DLL_Model = InputFileData%DLL_Model + p%DLL_OnlyStiff = InputFileData%DLL_OnlyStiff + p%CalcOption = InputFileData%CalcOption + p%Stiffness = InputFileData%Stiffness +! p%Damping = InputFileData%Damping ! Define initial system states here: x%DummyContState = 0.0_ReKi diff --git a/modules/soildyn/src/SoilDyn_IO.f90 b/modules/soildyn/src/SoilDyn_IO.f90 index f27ffab60..ceaaf1b43 100644 --- a/modules/soildyn/src/SoilDyn_IO.f90 +++ b/modules/soildyn/src/SoilDyn_IO.f90 @@ -477,7 +477,14 @@ SUBROUTINE SlD_ValidateInput( InitInp, InputFileData, ErrStat, ErrMsg ) ErrStat = ErrID_None ErrMsg = "" -!FIXME: add validation routines + select case(InputFileData%CalcOption) + case (Calc_StiffDamp) + case (Calc_PYcurve) + case (Calc_REDWIN) + call ValidateDLL() + end select + + CONTAINS subroutine ValidateStiffnessMatrix() ! Placeholder From 7ea2d5216302f8a1c7cff6b6ba3b1f9fdd7504fe Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Thu, 16 Apr 2020 17:35:23 -0600 Subject: [PATCH 082/136] SlD: fix typos in previous commit --- modules/soildyn/src/SoilDyn.f90 | 3 +-- modules/soildyn/src/SoilDyn_IO.f90 | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index 7cc62264c..239b07eea 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -474,7 +474,6 @@ subroutine SlD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, real(ReKi) :: AllOuts(0:MaxOutPts) real(R8Ki) :: Displacement(6) real(R8Ki) :: Force(6) - real(R8Ki) :: StiffMatrix(6,6) integer(IntKi) :: i !< generic counter logical :: LargeAnglePossible logical :: TimeStepRecalc @@ -541,7 +540,7 @@ subroutine SlD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, if (p%DLL_Model == 2) Displacement(6) = 0.0_R8Ki ! Calculate reaction with F = k*dX for large displacements. - Force = matmul(StiffMatrix, Displacement) + Force = matmul(p%DLL_StiffNess(1:6,1:6,i), Displacement) else Displacement(4:6) = GetSmllRotAngs(u%SoilMesh%Orientation(1:3,1:3,i), ErrStat2, ErrMsg2); if (Failed()) return; ! Small angle assumption should be valid here -- Note we are assuming reforientation is identity diff --git a/modules/soildyn/src/SoilDyn_IO.f90 b/modules/soildyn/src/SoilDyn_IO.f90 index ceaaf1b43..74de51acc 100644 --- a/modules/soildyn/src/SoilDyn_IO.f90 +++ b/modules/soildyn/src/SoilDyn_IO.f90 @@ -224,7 +224,6 @@ subroutine SlD_ReadInput( InputFileName, EchoFileName, InputFileData, ErrStat, E character(ErrMsgLen) :: TmpErrMsg !< Temporary error message character(1024) :: PriPath !< Path name of the primary file character(*), PARAMETER :: RoutineName="SlD_ReadInput" - character(2) :: TmpChar2 !< temporary character string length 2 ! Initialize local data @@ -364,7 +363,7 @@ subroutine SlD_ReadInput( InputFileName, EchoFileName, InputFileData, ErrStat, E !FIXME: parse out the 's' option. ! DLL model, and optionally only use stiffness matrix in response calcs call ReadVar( UnitInput, InputFileName, InputFileData%DLL_modelChr, "DLL_Model", "REDWIN DLL model to use", TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; - call Conv2UC( TmpChar2 ) ! Convert Line to upper case. + call Conv2UC( InputFileData%DLL_modelChr ) ! Convert Line to upper case. call ReadVar( UnitInput, InputFileName, InputFileData%DLL_FileName, "DLL_FileName", "REDWIN DLL model used", TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; call ReadVar( UnitInput, InputFileName, InputFileData%DLL_NumPoints, "DLL_NumPoints", "Number of DLL interfaces", TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; From bdc09a5c163fb7da248e59248e018e95a129053b Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Fri, 17 Apr 2020 14:39:52 -0600 Subject: [PATCH 083/136] Docs: update OpenFAST solve documentation --- .../OpenFAST_Algorithms.pdf | Bin 223893 -> 224751 bytes .../OpenFAST_Algorithms.tex | 640 +++++++++--------- 2 files changed, 334 insertions(+), 306 deletions(-) diff --git a/docs/OtherSupporting/OpenFAST_Algorithms/OpenFAST_Algorithms.pdf b/docs/OtherSupporting/OpenFAST_Algorithms/OpenFAST_Algorithms.pdf index 7f2f80bfb8e83ac26681f4b048399d8441572f9e..637b1614b28664de7942ed19079f705cf13e006e 100644 GIT binary patch delta 45332 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 E3Un@rMF0Q* diff --git a/docs/OtherSupporting/OpenFAST_Algorithms/OpenFAST_Algorithms.tex b/docs/OtherSupporting/OpenFAST_Algorithms/OpenFAST_Algorithms.tex index 8894cd103..6ede18bde 100644 --- a/docs/OtherSupporting/OpenFAST_Algorithms/OpenFAST_Algorithms.tex +++ b/docs/OtherSupporting/OpenFAST_Algorithms/OpenFAST_Algorithms.tex @@ -33,28 +33,29 @@ \section{Definitions and Nomenclature} \begin{table}[h] - \centering - \begin{tabular}{c|c|c} - \textbf{Module} & \textbf{Abbreviation} & \textbf{Abbreviation}\\ - \textbf{Name} & \textbf{in Module} & \textbf{in this Document}\\ - \hline - ElastoDyn & ED & ED \\ - BeamDyn & BD & BD \\ - AeroDyn14 & AD14 & AD14 \\ - AeroDyn & AD & AD \\ - ServoDyn & SrvD & SrvD \\ - SubDyn & SD & SD \\ - HydroDyn & HydroDyn & HD \\ - MAP++ & MAPp & MAP \\ - FEAMooring & FEAM & FEAM \\ - MoorDyn & MD & MD \\ - OrcaFlexInterface & Orca & Orca \\ - InflowWind & IfW & IfW \\ - IceFloe & IceFloe & IceF \\ - IceDyn & IceD & IceD \\ - \end{tabular} - \caption{Abbreviations for modules in FAST v8} - \label{tab:Abbrev} + \centering + \begin{tabular}{c|c|c} + \textbf{Module} & \textbf{Abbreviation} & \textbf{Abbreviation}\\ + \textbf{Name} & \textbf{in Module} & \textbf{in this Document}\\ + \hline + ElastoDyn & ED & ED \\ + BeamDyn & BD & BD \\ + AeroDyn14 & AD14 & AD14 \\ + AeroDyn & AD & AD \\ + ServoDyn & SrvD & SrvD \\ + SubDyn & SD & SD \\ + HydroDyn & HydroDyn & HD \\ + MAP++ & MAPp & MAP \\ + FEAMooring & FEAM & FEAM \\ + MoorDyn & MD & MD \\ + OrcaFlexInterface & Orca & Orca \\ + InflowWind & IfW & IfW \\ + IceFloe & IceFloe & IceF \\ + IceDyn & IceD & IceD \\ + SoilDyn & SlD & SlD \\ + \end{tabular} + \caption{Abbreviations for modules in FAST v8} + \label{tab:Abbrev} \end{table} @@ -78,38 +79,60 @@ \section{Input-Output Relationships} %\label{IOSolves21} \begin{algorithmic}[1] \Procedure{CalcOutputs\_And\_SolveForInputs}{\null} -\State $\mathit{y\_ED} \gets \Call{ED\_CalcOutput}{\mathit{p\_ED},\mathit{u\_ED},\mathit{x\_ED},\mathit{xd\_ED},\mathit{z\_ED}}$ +%%%% +% \start SolveOption2 \State - \State $\mathit{u\_AD}($not InflowWind$) \gets \Call{TransferOutputsToInputs}{\mathit{y\_ED}}$ - - \State $\mathit{u\_IfW} \gets \Call{TransferOutputsToInputs}{\mathit{y\_ED} at \mathit{u\_AD} nodes}$ - \State $\mathit{y\_IfW} \gets \Call{IfW\_CalcOutput}{\mathit{u\_IfW} and other \mathit{IfW} data structures}$ - - \State $\mathit{u\_AD}($InflowWind only$) \gets \Call{TransferOutputsToInputs}{\mathit{y\_IfW}}$ - \State $\mathit{y\_AD} \gets \Call{AD\_CalcOutput}{\mathit{p\_AD},\mathit{u\_AD},\mathit{x\_AD},\mathit{xd\_AD},\mathit{z\_AD}}$ +% SolveOption2a_Inp2BD + \State $\mathit{y\_ED} \gets \Call{ED\_CalcOutput}{\mathit{p\_ED},\mathit{u\_ED},\mathit{x\_ED},\mathit{xd\_ED},\mathit{z\_ED}}$ + \State $\mathit{u\_BD} \gets \Call{TransferOutputsToInputs}{\mathit{y\_ED}}$ + \State $\mathit{y\_BD} \gets \Call{BD\_CalcOutput}{\mathit{p\_BD},\mathit{u\_BD},\mathit{x\_BD},\mathit{xd\_BD},\mathit{z\_BD}}$ \State - \State $\mathit{u\_SrvD} \gets \Call{TransferOutputsToInputs}{\mathit{y\_ED},\mathit{y\_IfW}}$ - \State $\mathit{y\_SrvD} \gets \Call{SrvD\_CalcOutput}{}( \! - \begin{aligned}[t] - & \mathit{p\_SrvD},\mathit{u\_SrvD}, \\ - & \mathit{x\_SrvD},\mathit{xd\_SrvD},\mathit{z\_SrvD}) \\ - \end{aligned}$ +% SolveOption2b_Inp2IfW + \State $\mathit{u\_AD}($no IfW$) \gets \Call{TransferOutputsToInputs}{\mathit{y\_ED}}$ + \State $\mathit{u\_IfW} \gets \Call{TransferOutputsToInputs}{\mathit{y\_ED} at \mathit{u\_AD} nodes}$ \State - \State $\mathit{u\_ED}($not platform reference point$) \gets \Call{TransferOutputsToInputs}{y\_SrvD,y\_AD}$ %\Comment{sets all but platform reference point inputs} +% SolveOption2c_Inp2AD_SrvD + \State $\mathit{y\_IfW} \gets \Call{IfW\_CalcOutput}{\mathit{u\_IfW} and other \mathit{IfW} data structures}$ + \State $\mathit{u\_AD}($InflowWind only$) \gets \Call{TransferOutputsToInputs}{\mathit{y\_IfW}}$ + \State $\mathit{u\_SrvD} \gets \Call{TransferOutputsToInputs}{\mathit{y\_ED},\mathit{y\_IfW}}$ - \State $\mathit{u\_HD} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ - \State $\mathit{u\_SD} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ - \State $\mathit{u\_MAP} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ - \State $\mathit{u\_FEAM} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ +\State +% main + \State $\mathit{y\_AD} \gets \Call{AD\_CalcOutput}{\mathit{p\_AD},\mathit{u\_AD},\mathit{x\_AD},\mathit{xd\_AD},\mathit{z\_AD}}$ + \State $\mathit{y\_SrvD} \gets \Call{SrvD\_CalcOutput}{}( \! + \begin{aligned}[t] + & \mathit{p\_SrvD},\mathit{u\_SrvD}, \\ + & \mathit{x\_SrvD},\mathit{xd\_SrvD},\mathit{z\_SrvD}) \\ + \end{aligned}$ + \State $\mathit{u\_ED} \gets \Call{TransferOutputsToInputs}{\mathit{y\_AD},\mathit{y\_SrvD}}$ + \State $\mathit{u\_BD} \gets \Call{TransferOutputsToInputs}{\mathit{y\_AD}}$ +% \end SolveOption2 +%%%% + +%%%% +% \begin Transfer_ED_to_HD_SD_BD_Mooring +\State +% \State $\mathit{u\_ED}($not platform reference point$) \gets \Call{TransferOutputsToInputs}{y\_SrvD,y\_AD}$ %\Comment{sets all but platform reference point inputs} + +% \State $\mathit{u\_BD} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ % only if not BD_Solve_Option1 + \State $\mathit{u\_HD} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ + \State $\mathit{u\_SD} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ + \State $\mathit{u\_MAP} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ + \State $\mathit{u\_FEAM} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ + \State $\mathit{u\_MD} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ + \State $\mathit{u\_Orca} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ +% \end Transfer_ED_to_HD_SD_BD_Mooring +%%%% \State -\State \Call{ED\_HD\_SD\_Mooring\_Ice\_InputOutputSolve}{\null} +\State \Call{SolveOption1}{\null} \State -\State $\mathit{u\_AD} \gets \Call{TransferOutputsToInputs}{\mathit{y\_ED}}$ -\State $\mathit{u\_SrvD} \gets \Call{TransferOutputsToInputs}{\mathit{y\_ED},\mathit{y\_AD}}$ + \State $\mathit{u\_IfW} \gets \Call{TransferOutputsToInputs}{\mathit{u\_AD},\mathit{y\_ED}}$ + \State $\mathit{u\_AD} \gets \Call{TransferOutputsToInputs}{\mathit{y\_ED}}$ + \State $\mathit{u\_SrvD} \gets \Call{TransferOutputsToInputs}{\mathit{y\_ED},\mathit{y\_AD}}$ \EndProcedure \end{algorithmic} @@ -118,10 +141,10 @@ \section{Input-Output Relationships} Note that inputs to $ElastoDyn$ before calling CalcOutput() in the first step are not set in CalcOutputs\_And\_SolveForInputs(). Instead, the $ElastoDyn$ inputs are set depending on where CalcOutputs\_And\_SolveForInputs() is called: \begin{itemize}[noitemsep] %i don't like the double spaces between bulleted items. - \item At time 0, the inputs are the initial guess from $ElastoDyn$; - \item On the prediction step, the inputs are extrapolated values from the time history of ElastoDyn inputs; - \item On the first correction step, the inputs are the values calculated in the prediction step; - \item On subsequent correction steps, the inputs are the values calculated in the previous correction step. + \item At time 0, the inputs are the initial guess from $ElastoDyn$; + \item On the prediction step, the inputs are extrapolated values from the time history of ElastoDyn inputs; + \item On the first correction step, the inputs are the values calculated in the prediction step; + \item On subsequent correction steps, the inputs are the values calculated in the previous correction step. \end{itemize} @@ -140,90 +163,95 @@ \section{Input-Output Relationships} %\label{IOSolves_PlatformRef} \begin{algorithmic}[1] -\Procedure{ED\_HD\_SD\_Mooring\_Ice\_InputOutputSolve}{\null} - \State - \State $\mathit{y\_MAP} \gets \Call{CalcOutput}{\mathit{p\_MAP},\mathit{u\_MAP},\mathit{x\_MAP},\mathit{xd\_MAP},\mathit{z\_MAP}}$ - \State $\mathit{y\_FEAM} \gets \Call{CalcOutput}{\mathit{p\_FEAM},\mathit{u\_FEAM},\mathit{x\_FEAM},\mathit{xd\_FEAM},\mathit{z\_FEAM}}$ - \State $\mathit{y\_IceF} \gets \Call{CalcOutput}{\mathit{p\_IceF},\mathit{u\_IceF},\mathit{x\_IceF},\mathit{xd\_IceF},\mathit{z\_IceF}}$ - \State $\mathit{y\_IceD(:)} \gets \Call{CalcOutput}{\mathit{p\_IceD(:)},\mathit{u\_IceD(:)},\mathit{x\_IceD(:)},\mathit{xd\_IceD(:)},\mathit{z\_IceD(:)}}$ - \State - \State\Comment{Form $u$ vector using loads and accelerations from $\mathit{u\_HD}$, $\mathit{u\_SD}$, and platform reference input from $\mathit{u\_ED}$} - \State - \State $u \gets \Call{u\_vec}{\mathit{u\_HD},\mathit{u\_SD},\mathit{u\_ED}}$ - \State $k \gets 0$ - \Loop\Comment{Solve for loads and accelerations (direct feed-through terms)} - \State $y\_ED \gets \Call{ED\_CalcOutput}{\mathit{p\_ED},\mathit{u\_ED},\mathit{x\_ED},\mathit{xd\_ED},\mathit{z\_ED}}$ - \State $y\_SD \gets \Call{SD\_CalcOutput}{\mathit{p\_SD},\mathit{u\_SD},\mathit{x\_SD},\mathit{xd\_SD},\mathit{z\_SD}}$ - \State $y\_HD \gets \Call{HD\_CalcOutput}{\mathit{p\_HD},\mathit{u\_HD},\mathit{x\_HD},\mathit{xd\_HD},\mathit{z\_HD}}$ - - \If{ $k \geq k\_max$} - \State exit loop - \EndIf - - \State$\mathit{u\_MAP\_tmp} \gets \Call{TransferMeshMotions}{y\_ED}$ - \State$\mathit{u\_FEAM\_tmp} \gets \Call{TransferMeshMotions}{y\_ED}$ - \State$\mathit{u\_IceF\_tmp} \gets \Call{TransferMeshMotions}{y\_SD}$ - \State$\mathit{u\_IceD\_tmp(:)} \gets \Call{TransferMeshMotions}{y\_SD}$ - \State$\mathit{u\_HD\_tmp} \gets \Call{TransferMeshMotions}{y\_ED,y\_SD}$ - \State$\mathit{u\_SD\_tmp} \gets \! - \begin{aligned}[t] +\Procedure{SolveOption1}{\null} + \State + \State $\mathit{y\_MAP} \gets \Call{CalcOutput}{\mathit{p\_MAP},\mathit{u\_MAP},\mathit{x\_MAP},\mathit{xd\_MAP},\mathit{z\_MAP}}$ + \State $\mathit{y\_MD} \gets \Call{CalcOutput}{\mathit{p\_MD},\mathit{u\_MD},\mathit{x\_MD},\mathit{xd\_MD},\mathit{z\_MD}}$ + \State $\mathit{y\_FEAM} \gets \Call{CalcOutput}{\mathit{p\_FEAM},\mathit{u\_FEAM},\mathit{x\_FEAM},\mathit{xd\_FEAM},\mathit{z\_FEAM}}$ + \State $\mathit{y\_IceF} \gets \Call{CalcOutput}{\mathit{p\_IceF},\mathit{u\_IceF},\mathit{x\_IceF},\mathit{xd\_IceF},\mathit{z\_IceF}}$ + \State $\mathit{y\_IceD(:)} \gets \Call{CalcOutput}{\mathit{p\_IceD(:)},\mathit{u\_IceD(:)},\mathit{x\_IceD(:)},\mathit{xd\_IceD(:)},\mathit{z\_IceD(:)}}$ + \State + \State\Comment{Form $u$ vector using loads and accelerations from $\mathit{u\_HD}$, $\mathit{u\_BD}$ $\mathit{u\_SD}$, and platform reference input from $\mathit{u\_ED}$} + \State + \State $u \gets \Call{u\_vec}{\mathit{u\_HD},\mathit{u\_SD},\mathit{u\_ED}}$ + \State $k \gets 0$ + \Loop\Comment{Solve for loads and accelerations (direct feed-through terms)} + \State $y\_ED \gets \Call{ED\_CalcOutput}{\mathit{p\_ED},\mathit{u\_ED},\mathit{x\_ED},\mathit{xd\_ED},\mathit{z\_ED}}$ + \State $y\_SD \gets \Call{SD\_CalcOutput}{\mathit{p\_SD},\mathit{u\_SD},\mathit{x\_SD},\mathit{xd\_SD},\mathit{z\_SD}}$ + \State $y\_HD \gets \Call{HD\_CalcOutput}{\mathit{p\_HD},\mathit{u\_HD},\mathit{x\_HD},\mathit{xd\_HD},\mathit{z\_HD}}$ + \State $y\_BD \gets \Call{BD\_CalcOutput}{\mathit{p\_BD},\mathit{u\_BD},\mathit{x\_BD},\mathit{xd\_BD},\mathit{z\_BD}}$ + \State $y\_Orca \gets \Call{Orca\_CalcOutput}{\mathit{p\_Orca},\mathit{u\_Orca},\mathit{x\_Orca},\mathit{xd\_Orca},\mathit{z\_Orca}}$ + + \If{ $k \geq k\_max$} + \State exit loop + \EndIf + + \State$\mathit{u\_BD\_tmp} \gets \Call{TransferMeshMotions}{y\_ED}$ + \State$\mathit{u\_MAP\_tmp} \gets \Call{TransferMeshMotions}{y\_ED}$ + \State$\mathit{u\_FEAM\_tmp} \gets \Call{TransferMeshMotions}{y\_ED}$ + \State$\mathit{u\_IceF\_tmp} \gets \Call{TransferMeshMotions}{y\_SD}$ + \State$\mathit{u\_IceD\_tmp(:)} \gets \Call{TransferMeshMotions}{y\_SD}$ + \State$\mathit{u\_HD\_tmp} \gets \Call{TransferMeshMotions}{y\_ED,y\_SD}$ + \State$\mathit{u\_SD\_tmp} \gets \! + \begin{aligned}[t] & \Call{TransferMeshMotions}{\mathit{y\_ED}} \\ - & \cup \Call{TransferMeshLoads}{}(\! - \begin{aligned}[t] - & \mathit{y\_SD}, \\ - & \mathit{y\_HD},\mathit{u\_HD\_tmp}, \\ - & \mathit{y\_IceF},\mathit{u\_IceF\_tmp}) \\ - & \mathit{y\_IceD(:)},\mathit{u\_IceD\_tmp(:)}) \\ - \end{aligned} - \end{aligned}$ - \State$\mathit{u\_ED\_tmp} \gets \Call{TransferMeshLoads}{}( \! - \begin{aligned}[t] & \mathit{y\_ED}, \\ - & \mathit{y\_HD}, \mathit{u\_HD\_tmp}, \\ - & \mathit{y\_SD}, \mathit{u\_SD\_tmp}, \\ - & \mathit{y\_MAP}, \mathit{u\_MAP\_tmp}, \\ - & \mathit{y\_FEAM},\mathit{u\_FEAM\_tmp} ) - \end{aligned}$ - - \State - \State$\mathit{U\_Residual} \gets u - \Call{u\_vec}{\mathit{u\_HD\_tmp},\mathit{u\_SD\_tmp},\mathit{u\_ED\_tmp}}$ - \State - - \If{ last Jacobian was calculated at least $\mathit{DT\_UJac}$ seconds ago } - \State Calculate $\frac{\partial U}{\partial u}$ - \EndIf - - %\textit{ - %\State Perturb each input in $u$ - %\State Call $\Call{CalcOutput}{p,u,x,xd,z}$ for each module - %\State Transfer perturbed outputs to inputs - %\State Form new $u$ - %\State Compare new $u$ with $U\_Residual$ - %\State} - - \State Solve $\frac{\partial U}{\partial u} \Delta u = - \mathit{U\_Residual}$ for $\Delta u$ - - \State - \If{$\lVert \Delta u \rVert_2 < $ tolerance } \Comment{To be implemented later} - \State exit loop - \EndIf - \State - \State $u \gets u + \Delta u$ - \State Transfer $u$ to $\mathit{u\_HD}$, $\mathit{u\_SD}$, and $\mathit{u\_ED}$\Comment{loads and accelerations only} - \State $k=k+1$ - - \EndLoop - - \State\Comment{Transfer non-acceleration fields to motion input meshes} - \State - - \State$\mathit{u\_HD}($not accelerations$) \gets \Call{TransferMeshMotions}{\mathit{y\_ED},\mathit{y\_SD}}$ - \State$\mathit{u\_SD}($not accelerations$) \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ + & \cup \Call{TransferMeshLoads}{}(\! + \begin{aligned}[t] + & \mathit{y\_SD}, \\ + & \mathit{y\_HD},\mathit{u\_HD\_tmp}, \\ + & \mathit{y\_IceF},\mathit{u\_IceF\_tmp}) \\ + & \mathit{y\_IceD(:)},\mathit{u\_IceD\_tmp(:)}) \\ + \end{aligned} + \end{aligned}$ + \State$\mathit{u\_ED\_tmp} \gets \Call{TransferMeshLoads}{}( \! + \begin{aligned}[t] & \mathit{y\_ED}, \\ + & \mathit{y\_HD}, \mathit{u\_HD\_tmp}, \\ + & \mathit{y\_SD}, \mathit{u\_SD\_tmp}, \\ + & \mathit{y\_MAP}, \mathit{u\_MAP\_tmp}, \\ + & \mathit{y\_FEAM},\mathit{u\_FEAM\_tmp} ) + \end{aligned}$ + + \State + \State$\mathit{U\_Residual} \gets u - \Call{u\_vec}{\mathit{u\_HD\_tmp},\mathit{u\_SD\_tmp},\mathit{u\_ED\_tmp}}$ + \State + + \If{ last Jacobian was calculated at least $\mathit{DT\_UJac}$ seconds ago } + \State Calculate $\frac{\partial U}{\partial u}$ + \EndIf + + %\textit{ + %\State Perturb each input in $u$ + %\State Call $\Call{CalcOutput}{p,u,x,xd,z}$ for each module + %\State Transfer perturbed outputs to inputs + %\State Form new $u$ + %\State Compare new $u$ with $U\_Residual$ + %\State} + + \State Solve $\frac{\partial U}{\partial u} \Delta u = - \mathit{U\_Residual}$ for $\Delta u$ + + \State + \If{$\lVert \Delta u \rVert_2 < $ tolerance } \Comment{To be implemented later} + \State exit loop + \EndIf + \State + \State $u \gets u + \Delta u$ + \State Transfer $u$ to $\mathit{u\_HD}$, $\mathit{u\_SD}$, and $\mathit{u\_ED}$\Comment{loads and accelerations only} + \State $k=k+1$ + + \EndLoop + + \State\Comment{Transfer non-acceleration fields to motion input meshes} + \State + + \State$\mathit{u\_HD}($not accelerations$) \gets \Call{TransferMeshMotions}{\mathit{y\_ED},\mathit{y\_SD}}$ + \State$\mathit{u\_SD}($not accelerations$) \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ \State - \State $\mathit{u\_MAP} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ - \State $\mathit{u\_FEAM} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ - \State $\mathit{u\_IceF} \gets \Call{TransferMeshMotions}{\mathit{y\_SD}}$ - \State $\mathit{u\_IceD(:)} \gets \Call{TransferMeshMotions}{\mathit{y\_SD}}$ - + \State $\mathit{u\_MAP} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ + \State $\mathit{u\_MD} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ + \State $\mathit{u\_FEAM} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ + \State $\mathit{u\_IceF} \gets \Call{TransferMeshMotions}{\mathit{y\_SD}}$ + \State $\mathit{u\_IceD(:)} \gets \Call{TransferMeshMotions}{\mathit{y\_SD}}$ + \EndProcedure \end{algorithmic} @@ -235,46 +263,46 @@ \section{Input-Output Relationships} \begin{equation} \label{EqLump} - \begin{bmatrix} - F^{DL} \\ - M^{DL} \\ - \end{bmatrix} + \begin{bmatrix} + F^{DL} \\ + M^{DL} \\ + \end{bmatrix} = - \begin{bmatrix} - A & 0 \\ - B & A \\ - \end{bmatrix} - \begin{bmatrix} - F^{D} \\ - M^{D} \\ - \end{bmatrix} + \begin{bmatrix} + A & 0 \\ + B & A \\ + \end{bmatrix} + \begin{bmatrix} + F^{D} \\ + M^{D} \\ + \end{bmatrix} \end{equation} Because the forces do not depend on the moments, we first solve for the distributed forces, $F^D$: \begin{equation} \label{EqLumpF} - \begin{bmatrix} F^{DL} \\ \end{bmatrix} + \begin{bmatrix} F^{DL} \\ \end{bmatrix} = - \left[ A \right] - \left[ F^{D} \right] + \left[ A \right] + \left[ F^{D} \right] \end{equation} We then use the known values to solve for the distributed moments, $M^D$: \begin{equation} \label{EqLumpM1} - \left[ M^{DL} \right] + \left[ M^{DL} \right] = - \begin{bmatrix} B & A \\ \end{bmatrix} - \begin{bmatrix} - F^{D} \\ - M^{D} \\ - \end{bmatrix} -= \left[ B \right] \left[ F^D \right] + \left[ A \right] \left[ M^D \right] + \begin{bmatrix} B & A \\ \end{bmatrix} + \begin{bmatrix} + F^{D} \\ + M^{D} \\ + \end{bmatrix} += \left[ B \right] \left[ F^D \right] + \left[ A \right] \left[ M^D \right] \end{equation} or \begin{equation} \label{EqLumpM2} -\left[ M^{DL} \right] - \left[ B \right] \left[ F^D \right] = \left[ A \right] \left[ M^D \right] +\left[ M^{DL} \right] - \left[ B \right] \left[ F^D \right] = \left[ A \right] \left[ M^D \right] \end{equation} Rather than store the matrix $B$, we directly perform the cross products that the matrix $B$ represents. This makes the left-hand side of Equation \ref{EqLumpM2} known, leaving us with one matrix solve. This @@ -329,7 +357,7 @@ \subsection{Loads Transfer} \item Augment the source mesh with additional nodes. \item Lump the distributed loads on the augmented Line2 source mesh to a Point mesh. \item Perform Point-to-Point loads transfer. - \item Distribute (or "unlump") the point loads. + \item Distribute (or "unlump") the point loads. \end{enumerate} The other loads transfers are just subsets of the Line2-to-Line2 transfer: \begin{itemize} @@ -348,15 +376,15 @@ \subsubsection{Step 1: Augment the source mesh} The equation that linearizes mesh augmentation is \begin{equation} \label{Augment} - \left\{ \begin{matrix} \vec{u}^D \\ \vec{u}^{SA} \\ \vec{f}^{SA} \\ \vec{m}^{SA} \end{matrix} \right\} + \left\{ \begin{matrix} \vec{u}^D \\ \vec{u}^{SA} \\ \vec{f}^{SA} \\ \vec{m}^{SA} \end{matrix} \right\} = - \begin{bmatrix} - I_{\mathit{N_D}} & 0 & 0 & 0 \\ - 0 & M^A & 0 & 0 \\ - 0 & 0 & M^A & 0 \\ - 0 & 0 & 0 & M^A \\ - \end{bmatrix} - \left\{ \begin{matrix} \vec{u}^D \\ \vec{u}^S \\ \vec{f}^S \\ \vec{m}^S \end{matrix} \right\} + \begin{bmatrix} + I_{\mathit{N_D}} & 0 & 0 & 0 \\ + 0 & M^A & 0 & 0 \\ + 0 & 0 & M^A & 0 \\ + 0 & 0 & 0 & M^A \\ + \end{bmatrix} + \left\{ \begin{matrix} \vec{u}^D \\ \vec{u}^S \\ \vec{f}^S \\ \vec{m}^S \end{matrix} \right\} \end{equation} where $M^A \in \mathbb{R}^{ \mathit{N_{SA}},\mathit{N_{S}}}$ indicates the mapping of nodes from the source mesh (with $N_S$ nodes) to the augmented source mesh (with $N_{SA}$ nodes). The destination mesh (with $N_D$ nodes) is unchanged, as is indicated by matrix $I_{\mathit{N_D}}$. @@ -367,14 +395,14 @@ \subsubsection{Step 2: Lump loads on a Line2 mesh to a Point mesh} The equation that linearizes the lumping of loads is \begin{equation} \label{Lump} - \left\{ \begin{matrix} \vec{u}^{SA} \\ \vec{F}^{SAL} \\ \vec{M}^{SAL} \end{matrix} \right\} + \left\{ \begin{matrix} \vec{u}^{SA} \\ \vec{F}^{SAL} \\ \vec{M}^{SAL} \end{matrix} \right\} = - \begin{bmatrix} - I_{\mathit{N_{SA}}} & 0 & 0 \\ - 0 & M_{li}^{SL} & 0 \\ - M_{uS}^{SL} & M_{f}^{SL} & M_{li}^{SL} \\ - \end{bmatrix} - \left\{ \begin{matrix} \vec{u}^{SA} \\ \vec{f}^{SA} \\ \vec{m}^{SA} \end{matrix} \right\} + \begin{bmatrix} + I_{\mathit{N_{SA}}} & 0 \ & 0 \\ + 0 & M_{li}^{SL} & 0 \\ + M_{uS}^{SL} & M_{f}^{SL} & M_{li}^{SL} \\ + \end{bmatrix} + \left\{ \begin{matrix} \vec{u}^{SA} \\ \vec{f}^{SA} \\ \vec{m}^{SA} \end{matrix} \right\} \end{equation} where $M_{li}^{SL}, M_{uS}^{SL}, M_{f}^{SL} \in \mathbb{R}^{ \mathit{N_{SA}},\mathit{N_{SA}}}$ are block matrices that indicate the mapping of the lumped values to distributed values. $M_{li}^{SL}$ is matrix $A$ in Equation \ref{EqLumpF}, which depends only on element reference positions and connectivity. Matrices $M_{uS}^{SL}$and $M_{f}^{SL}$ also depend on values at their operating point. @@ -383,15 +411,15 @@ \subsubsection{Step 3: Perform Point-to-Point loads transfer} The equation that performs Point-to-Point load transfer can be written as \begin{equation} \label{P2P} - \left\{ \begin{matrix} \vec{u}^D \\ \vec{u}^{S} \\ \vec{F}^{D} \\ \vec{M}^{D} \end{matrix} \right\} + \left\{ \begin{matrix} \vec{u}^D \\ \vec{u}^{S} \\ \vec{F}^{D} \\ \vec{M}^{D} \end{matrix} \right\} = - \begin{bmatrix} - I_{\mathit{N_D}} & 0 & 0 & 0 \\ - 0 & I_{\mathit{N_{S}}} & 0 & 0 \\ - 0 & 0 & M_{li}^{D} & 0 \\ - M_{uD}^{D} & M_{uS}^{D} & M_{f}^{D} & M_{li}^{D} \\ - \end{bmatrix} - \left\{ \begin{matrix} \vec{u}^D \\ \vec{u}^{S} \\ \vec{F}^{S} \\ \vec{D}^{S} \end{matrix} \right\} + \begin{bmatrix} + I_{\mathit{N_D}} & 0 & 0 & 0 \\ + 0 & I_{\mathit{N_{S}}} & 0 & 0 \\ + 0 & 0 & M_{li}^{D} & 0 \\ + M_{uD}^{D} & M_{uS}^{D} & M_{f}^{D} & M_{li}^{D} \\ + \end{bmatrix} + \left\{ \begin{matrix} \vec{u}^D \\ \vec{u}^{S} \\ \vec{F}^{S} \\ \vec{D}^{S} \end{matrix} \right\} \end{equation} where $M_{li}^{D}, M_{uS}^{D}, M_{f}^{D} \in \mathbb{R}^{ \mathit{N_{D}},\mathit{N_{S}}}$ are block matrices that indicate the transfer of loads from one source node to a node on the destination mesh. $M_{uD}^{D} \in \mathbb{R}^{ \mathit{N_{D}},\mathit{N_{D}}}$ is a diagonal matrix that indicates how the destination mesh's displaced position effects the transfer. @@ -403,28 +431,28 @@ \subsubsection{Step 4: Distribute Point loads to a Line2 mesh} From Equation \ref{Lump} the equation that linearizes the lumping of loads on a destination mesh is \begin{equation} \label{LumpD} - \left\{ \begin{matrix} \vec{u}^D \\ \vec{F}^{D} \\ \vec{M}^{D} \end{matrix} \right\} + \left\{ \begin{matrix} \vec{u}^D \\ \vec{F}^{D} \\ \vec{M}^{D} \end{matrix} \right\} = - \begin{bmatrix} - I_{\mathit{N_D}} & 0 & 0 \\ - 0 & M_{li}^{DL} & 0 \\ - M_{uD}^{DL} & M_{f}^{DL} & M_{li}^{DL} \\ - \end{bmatrix} - \left\{ \begin{matrix} \vec{u}^D \\ \vec{f}^{D} \\ \vec{m}^{D} \end{matrix} \right\} + \begin{bmatrix} + I_{\mathit{N_D}} & 0 & 0 \\ + 0 & M_{li}^{DL} & 0 \\ + M_{uD}^{DL} & M_{f}^{DL} & M_{li}^{DL} \\ + \end{bmatrix} + \left\{ \begin{matrix} \vec{u}^D \\ \vec{f}^{D} \\ \vec{m}^{D} \end{matrix} \right\} \end{equation} where $M_{li}^{DL}, M_{uD}^{DL}, M_{f}^{DL} \in \mathbb{R}^{ \mathit{N_{D}},\mathit{N_{D}}}$ are block matrices that indicate the mapping of the lumped values to distributed values. It follows that the inverse of this equation is \begin{equation} \label{InvLumpD} - \left\{ \begin{matrix} \vec{u}^D \\ \vec{f}^{D} \\ \vec{m}^{D} \end{matrix} \right\} + \left\{ \begin{matrix} \vec{u}^D \\ \vec{f}^{D} \\ \vec{m}^{D} \end{matrix} \right\} = - \begin{bmatrix} - I_{\mathit{N_D}} & 0 & 0 \\ - 0 & \left[ M_{li}^{DL} \right]^{-1} & 0 \\ - -\left[ M_{li}^{DL} \right]^{-1} M_{uD}^{DL} & - -\left[ M_{li}^{DL} \right]^{-1} M_{f}^{DL} \left[ M_{li}^{DL} \right]^{-1} & - \left[ M_{li}^{DL} \right]^{-1} \\ - \end{bmatrix} - \left\{ \begin{matrix} \vec{u}^D \\ \vec{F}^{D} \\ \vec{M}^{D} \end{matrix} \right\} + \begin{bmatrix} + I_{\mathit{N_D}} & 0 & 0 \\ + 0 & \left[ M_{li}^{DL} \right]^{-1} & 0 \\ + -\left[ M_{li}^{DL} \right]^{-1} M_{uD}^{DL} & + -\left[ M_{li}^{DL} \right]^{-1} M_{f}^{DL} \left[ M_{li}^{DL} \right]^{-1} & + \left[ M_{li}^{DL} \right]^{-1} \\ + \end{bmatrix} + \left\{ \begin{matrix} \vec{u}^D \\ \vec{F}^{D} \\ \vec{M}^{D} \end{matrix} \right\} \end{equation} The only inverse we need is already formed (stored as an LU decomposition) from the loads transfer, so we need not form it again. @@ -434,13 +462,13 @@ \subsubsection{Putting it together} matrix that converts loads from the source mesh to loads on the line mesh: \begin{equation} \label{LinearEqn} - \left\{ \begin{matrix} \vec{f}^{D} \\ \vec{m}^{D} \end{matrix} \right\} + \left\{ \begin{matrix} \vec{f}^{D} \\ \vec{m}^{D} \end{matrix} \right\} = - \begin{bmatrix} - 0 & 0 & M_{li} & 0 \\ - M_{uD} & M_{uS} & M_f & M_{li} - \end{bmatrix} - \left\{ \begin{matrix} \vec{u}^D \\ \vec{u}^S \\ \vec{f}^{D} \\ \vec{m}^{D} \end{matrix} \right\} + \begin{bmatrix} + 0 & 0 & M_{li} & 0 \\ + M_{uD} & M_{uS} & M_f & M_{li} + \end{bmatrix} + \left\{ \begin{matrix} \vec{u}^D \\ \vec{u}^S \\ \vec{f}^{D} \\ \vec{m}^{D} \end{matrix} \right\} \end{equation} @@ -448,117 +476,117 @@ \subsubsection{Putting it together} \begin{itemize} \item Line2-to-Line2: Perform steps 1, 2, 3, and 4. - \begin{multline} - \left\{ \begin{matrix} \vec{f}^{D} \\ \vec{m}^{D} \end{matrix} \right\} - = - \begin{bmatrix} - 0 & \left[ M_{li}^{DL} \right]^{-1} & 0 \\ - -\left[ M_{li}^{DL} \right]^{-1} M_{uD}^{DL} & - -\left[ M_{li}^{DL} \right]^{-1} M_{f}^{DL} \left[ M_{li}^{DL} \right]^{-1} & - \left[ M_{li}^{DL} \right]^{-1} \\ - \end{bmatrix} - \\ - \begin{bmatrix} - I_{N_D} & 0 & 0 & 0 \\ - 0 & 0 & M_{li}^{D} & 0 \\ - M_{uD}^{D} & M_{uS}^{D} & M_{f}^{D} & M_{li}^{D} \\ - \end{bmatrix} - \begin{bmatrix} - I_{N_D} & 0 & 0 & 0 \\ - 0 & I_{\mathit{N_{SA}}} & 0 & 0 \\ - 0 & 0 & M_{li}^{SL} & 0 \\ - 0 & M_{uS}^{SL} & M_{f}^{SL} & M_{li}^{SL} \\ - \end{bmatrix} - \\ - \begin{bmatrix} - I_{\mathit{N_D}} & 0 & 0 & 0 \\ - 0 & M^A & 0 & 0 \\ - 0 & 0 & M^A & 0 \\ - 0 & 0 & 0 & M^A \\ - \end{bmatrix} - \left\{ \begin{matrix} \vec{u}^D \\ \vec{u}^{S} \\ \vec{f}^{S} \\ \vec{m}^{S} \end{matrix} \right\} - \end{multline} - \begin{align} + \begin{multline} + \left\{ \begin{matrix} \vec{f}^{D} \\ \vec{m}^{D} \end{matrix} \right\} + = + \begin{bmatrix} + 0 & \left[ M_{li}^{DL} \right]^{-1} & 0 \\ + -\left[ M_{li}^{DL} \right]^{-1} M_{uD}^{DL} & + -\left[ M_{li}^{DL} \right]^{-1} M_{f}^{DL} \left[ M_{li}^{DL} \right]^{-1} & + \left[ M_{li}^{DL} \right]^{-1} \\ + \end{bmatrix} + \\ + \begin{bmatrix} + I_{N_D} & 0 & 0 & 0 \\ + 0 & 0 & M_{li}^{D} & 0 \\ + M_{uD}^{D} & M_{uS}^{D} & M_{f}^{D} & M_{li}^{D} \\ + \end{bmatrix} + \begin{bmatrix} + I_{N_D} & 0 & 0 & 0 \\ + 0 & I_{\mathit{N_{SA}}} & 0 & 0 \\ + 0 & 0 & M_{li}^{SL} & 0 \\ + 0 & M_{uS}^{SL} & M_{f}^{SL} & M_{li}^{SL} \\ + \end{bmatrix} + \\ + \begin{bmatrix} + I_{\mathit{N_D}} & 0 & 0 & 0 \\ + 0 & M^A & 0 & 0 \\ + 0 & 0 & M^A & 0 \\ + 0 & 0 & 0 & M^A \\ + \end{bmatrix} + \left\{ \begin{matrix} \vec{u}^D \\ \vec{u}^{S} \\ \vec{f}^{S} \\ \vec{m}^{S} \end{matrix} \right\} + \end{multline} + \begin{align} M_{li} &= \left(M_{li}^{DL}\right)^{-1}M_{li}^D M_{li}^{SL} M_A \\ - M_{uD} &= \left(M_{li}^{DL}\right)^{-1}\left[M_{uD}^D - M_{uD}^{DL}\right] \\ - M_{uS} &= \left(M_{li}^{DL}\right)^{-1} \left[ M_{uS}^D + M_{li}^D M_{uS}^{SL}\right] M_A \\ - M_{f} &= \left(M_{li}^{DL}\right)^{-1}\left( \left[M_{f}^D - M_{f}^{DL}\left(M_{li}^{DL}\right)^{-1}M_{li}^D\right] M_{li}^{SL} + - M_{li}^D M_{f}^{SL} \right)M_A \end{align} - - + M_{uD} &= \left(M_{li}^{DL}\right)^{-1}\left[M_{uD}^D - M_{uD}^{DL}\right] \\ + M_{uS} &= \left(M_{li}^{DL}\right)^{-1} \left[ M_{uS}^D + M_{li}^D M_{uS}^{SL}\right] M_A \\ + M_{f} &= \left(M_{li}^{DL}\right)^{-1}\left( \left[M_{f}^D - M_{f}^{DL}\left(M_{li}^{DL}\right)^{-1}M_{li}^D\right] M_{li}^{SL} + + M_{li}^D M_{f}^{SL} \right)M_A \end{align} + + \item Line2-to-Point: Perform steps 1, 2, and 3. - \begin{multline} - \left\{ \begin{matrix} \vec{F}^{D} \\ \vec{M}^{D} \end{matrix} \right\} - = - \begin{bmatrix} - 0 & 0 & M_{li}^{D} & 0 \\ - M_{uD}^{D} & M_{uS}^{D} & M_{f}^{D} & M_{li}^{D} \\ - \end{bmatrix} - \begin{bmatrix} - I_{N_D} & 0 & 0 & 0 \\ - 0 & I_{\mathit{N_{SA}}} & 0 & 0 \\ - 0 & 0 & M_{li}^{SL} & 0 \\ - 0 & M_{uS}^{SL} & M_{f}^{SL} & M_{li}^{SL} \\ - \end{bmatrix} - \\ - \begin{bmatrix} - I_{\mathit{N_D}} & 0 & 0 & 0 \\ - 0 & M^A & 0 & 0 \\ - 0 & 0 & M^A & 0 \\ - 0 & 0 & 0 & M^A \\ - \end{bmatrix} - \left\{ \begin{matrix} \vec{u}^D \\ \vec{u}^{S} \\ \vec{f}^{S} \\ \vec{m}^{S} \end{matrix} \right\} - \end{multline} - The linearization routine returns these four matrices: - \begin{align} - M_{li} &= M_{li}^D M_{li}^{SL} M_{A} \\ - M_{uD} &= M_{uD}^D \\ - M_{uS} &= \left[ M_{uS}^D + M_{li}^{D} M_{uS}^{SL}\right]M_{A} \\ - M_{f} &= \left[ M_{f}^D M_{li}^{SL} + M_{li}^{D} M_{f}^{SL} \right]M_{A} \end{align} - - + \begin{multline} + \left\{ \begin{matrix} \vec{F}^{D} \\ \vec{M}^{D} \end{matrix} \right\} + = + \begin{bmatrix} + 0 & 0 & M_{li}^{D} & 0 \\ + M_{uD}^{D} & M_{uS}^{D} & M_{f}^{D} & M_{li}^{D} \\ + \end{bmatrix} + \begin{bmatrix} + I_{N_D} & 0 & 0 & 0 \\ + 0 & I_{\mathit{N_{SA}}} & 0 & 0 \\ + 0 & 0 & M_{li}^{SL} & 0 \\ + 0 & M_{uS}^{SL} & M_{f}^{SL} & M_{li}^{SL} \\ + \end{bmatrix} + \\ + \begin{bmatrix} + I_{\mathit{N_D}} & 0 & 0 & 0 \\ + 0 & M^A & 0 & 0 \\ + 0 & 0 & M^A & 0 \\ + 0 & 0 & 0 & M^A \\ + \end{bmatrix} + \left\{ \begin{matrix} \vec{u}^D \\ \vec{u}^{S} \\ \vec{f}^{S} \\ \vec{m}^{S} \end{matrix} \right\} + \end{multline} + The linearization routine returns these four matrices: + \begin{align} + M_{li} &= M_{li}^D M_{li}^{SL} M_{A} \\ + M_{uD} &= M_{uD}^D \\ + M_{uS} &= \left[ M_{uS}^D + M_{li}^{D} M_{uS}^{SL}\right]M_{A} \\ + M_{f} &= \left[ M_{f}^D M_{li}^{SL} + M_{li}^{D} M_{f}^{SL} \right]M_{A} \end{align} + + \item Point-to-Line2: Perform steps 3 and 4. - %\begin{equation} - \begin{multline} - \left\{ \begin{matrix} \vec{f}^{D} \\ \vec{m}^{D} \end{matrix} \right\} - = - \begin{bmatrix} - 0 & \left[ M_{li}^{DL} \right]^{-1} & 0 \\ - -\left[ M_{li}^{DL} \right]^{-1} M_{uD}^{DL} & - -\left[ M_{li}^{DL} \right]^{-1} M_{f}^{DL} \left[ M_{li}^{DL} \right]^{-1} & - \left[ M_{li}^{DL} \right]^{-1} \\ - \end{bmatrix} \\ - \begin{bmatrix} - I_{N_D} & 0 & 0 & 0 \\ - 0 & 0 & M_{li}^{D} & 0 \\ - M_{uD}^{D} & M_{uS}^{D} & M_{f}^{D} & M_{li}^{D} \\ - \end{bmatrix} - \left\{ \begin{matrix} \vec{u}^D \\ \vec{u}^{S} \\ \vec{F}^{S} \\ \vec{M}^{S} \end{matrix} \right\} - \end{multline} - %\end{equation} - The linearization routine returns these four matrices: - \begin{align} M_{li} &= \left(M_{li}^{DL}\right)^{-1}M_{li}^D \\ - M_{uD} &= \left(M_{li}^{DL}\right)^{-1}\left[M_{uD}^D - M_{uD}^{DL}\right] \\ - M_{uS} &= \left(M_{li}^{DL}\right)^{-1}M_{uS}^D \\ - M_{f} &= \left(M_{li}^{DL}\right)^{-1}\left[M_{f}^D - M_{f}^{DL} M_{li} \right] \end{align} - - + %\begin{equation} + \begin{multline} + \left\{ \begin{matrix} \vec{f}^{D} \\ \vec{m}^{D} \end{matrix} \right\} + = + \begin{bmatrix} + 0 & \left[ M_{li}^{DL} \right]^{-1} & 0 \\ + -\left[ M_{li}^{DL} \right]^{-1} M_{uD}^{DL} & + -\left[ M_{li}^{DL} \right]^{-1} M_{f}^{DL} \left[ M_{li}^{DL} \right]^{-1} & + \left[ M_{li}^{DL} \right]^{-1} \\ + \end{bmatrix} \\ + \begin{bmatrix} + I_{N_D} & 0 & 0 & 0 \\ + 0 & 0 & M_{li}^{D} & 0 \\ + M_{uD}^{D} & M_{uS}^{D} & M_{f}^{D} & M_{li}^{D} \\ + \end{bmatrix} + \left\{ \begin{matrix} \vec{u}^D \\ \vec{u}^{S} \\ \vec{F}^{S} \\ \vec{M}^{S} \end{matrix} \right\} + \end{multline} + %\end{equation} + The linearization routine returns these four matrices: + \begin{align} M_{li} &= \left(M_{li}^{DL}\right)^{-1}M_{li}^D \\ + M_{uD} &= \left(M_{li}^{DL}\right)^{-1}\left[M_{uD}^D - M_{uD}^{DL}\right] \\ + M_{uS} &= \left(M_{li}^{DL}\right)^{-1}M_{uS}^D \\ + M_{f} &= \left(M_{li}^{DL}\right)^{-1}\left[M_{f}^D - M_{f}^{DL} M_{li} \right] \end{align} + + \item Point-to-Point: Perform step 3. - \begin{equation} - \left\{ \begin{matrix} \vec{F}^{D} \\ \vec{M}^{D} \end{matrix} \right\} - = - \begin{bmatrix} - 0 & 0 & M_{li}^{D} & 0 \\ - M_{uD}^{D} & M_{uS}^{D} & M_{f}^{D} & M_{li}^{D} \\ - \end{bmatrix} - \left\{ \begin{matrix} \vec{u}^D \\ \vec{u}^{S} \\ \vec{F}^{S} \\ \vec{M}^{S} \end{matrix} \right\} - \end{equation} - The linearization routine returns these four matrices: - \begin{align} M_{li} &= M_{li}^D \\ - M_{uD} &= M_{uD}^D \\ - M_{uS} &= M_{uS}^D \\ - M_{f} &= M_{f}^D \end{align} - + \begin{equation} + \left\{ \begin{matrix} \vec{F}^{D} \\ \vec{M}^{D} \end{matrix} \right\} + = + \begin{bmatrix} + 0 & 0 & M_{li}^{D} & 0 \\ + M_{uD}^{D} & M_{uS}^{D} & M_{f}^{D} & M_{li}^{D} \\ + \end{bmatrix} + \left\{ \begin{matrix} \vec{u}^D \\ \vec{u}^{S} \\ \vec{F}^{S} \\ \vec{M}^{S} \end{matrix} \right\} + \end{equation} + The linearization routine returns these four matrices: + \begin{align} M_{li} &= M_{li}^D \\ + M_{uD} &= M_{uD}^D \\ + M_{uS} &= M_{uS}^D \\ + M_{f} &= M_{f}^D \end{align} + \end{itemize} \end{document} From 26e5e9043080a16f9fa5837396750643f9b246d5 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Fri, 17 Apr 2020 16:25:20 -0600 Subject: [PATCH 084/136] SlD: update the OpenFAST Algorithms doc for SlD --- .../OpenFAST_Algorithms.pdf | Bin 224751 -> 229132 bytes .../OpenFAST_Algorithms.tex | 37 ++++++++++++------ 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/docs/OtherSupporting/OpenFAST_Algorithms/OpenFAST_Algorithms.pdf b/docs/OtherSupporting/OpenFAST_Algorithms/OpenFAST_Algorithms.pdf index 637b1614b28664de7942ed19079f705cf13e006e..ae7054d1862fe0fe6a0826245b3d1d6fc0625c0e 100644 GIT binary patch delta 116343 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∋hrSuD>$h0XD@7DG4U1# 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

s{oELTamMzDt1n$vug2qCD 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 diff --git a/docs/OtherSupporting/OpenFAST_Algorithms/OpenFAST_Algorithms.tex b/docs/OtherSupporting/OpenFAST_Algorithms/OpenFAST_Algorithms.tex index 6ede18bde..509ed3985 100644 --- a/docs/OtherSupporting/OpenFAST_Algorithms/OpenFAST_Algorithms.tex +++ b/docs/OtherSupporting/OpenFAST_Algorithms/OpenFAST_Algorithms.tex @@ -124,6 +124,8 @@ \section{Input-Output Relationships} \State $\mathit{u\_FEAM} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ \State $\mathit{u\_MD} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ \State $\mathit{u\_Orca} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ +\State + \State $\mathit{u\_SlD} \gets \Call{TransferMeshPosition}{\mathit{y\_SD}}$ % \end Transfer_ED_to_HD_SD_BD_Mooring %%%% @@ -138,10 +140,10 @@ \section{Input-Output Relationships} \end{algorithmic} %\end{algorithm} -Note that inputs to $ElastoDyn$ before calling CalcOutput() in the first step are not set in CalcOutputs\_And\_SolveForInputs(). -Instead, the $ElastoDyn$ inputs are set depending on where CalcOutputs\_And\_SolveForInputs() is called: +Note that inputs to \emph{ElastoDyn} before calling CalcOutput() in the first step are not set in CalcOutputs\_And\_SolveForInputs(). +Instead, the \emph{ElastoDyn} inputs are set depending on where CalcOutputs\_And\_SolveForInputs() is called: \begin{itemize}[noitemsep] %i don't like the double spaces between bulleted items. - \item At time 0, the inputs are the initial guess from $ElastoDyn$; + \item At time 0, the inputs are the initial guess from \emph{ElastoDyn}; \item On the prediction step, the inputs are extrapolated values from the time history of ElastoDyn inputs; \item On the first correction step, the inputs are the values calculated in the prediction step; \item On subsequent correction steps, the inputs are the values calculated in the previous correction step. @@ -149,13 +151,11 @@ \section{Input-Output Relationships} %\pagebreak %break here for now so that it doesn't look so strange -%\subsection {Input-Output Solve for $HydroDyn$, $SubDyn$, $MAP$, \\ -% $FEAMooring$, $IceFloe$, and the Platform Reference Point Mesh in $ElastoDyn$} \subsection {Input-Output Solve for \textit{HydroDyn}, \textit{SubDyn}, \textit{MAP}, \textit{FEAMooring}, \textit{IceFloe}, and the Platform Reference Point Mesh in \textit{ElastoDyn}} This procedure implements Solve Option 1 for the accelerations and loads in -$HydroDyn$, $SubDyn$, $MAP$, $FEAMooring$, and $ElastoDyn$ (at its platform reference point mesh). +\emph{HydroDyn},\emph{SubDyn},\emph{MAP},\emph{FEAMooring},\emph{OrcaFlexInterface},\emph{MoorDyn},\emph{SoilDyn}, and\emph{ElastoDyn} (at its platform reference point mesh). The other input-output relationships for these modules are solved using Solve Option 2. %\begin{algorithm}[ht] @@ -170,6 +170,7 @@ \section{Input-Output Relationships} \State $\mathit{y\_FEAM} \gets \Call{CalcOutput}{\mathit{p\_FEAM},\mathit{u\_FEAM},\mathit{x\_FEAM},\mathit{xd\_FEAM},\mathit{z\_FEAM}}$ \State $\mathit{y\_IceF} \gets \Call{CalcOutput}{\mathit{p\_IceF},\mathit{u\_IceF},\mathit{x\_IceF},\mathit{xd\_IceF},\mathit{z\_IceF}}$ \State $\mathit{y\_IceD(:)} \gets \Call{CalcOutput}{\mathit{p\_IceD(:)},\mathit{u\_IceD(:)},\mathit{x\_IceD(:)},\mathit{xd\_IceD(:)},\mathit{z\_IceD(:)}}$ + \State $\mathit{y\_SlD} \gets \Call{CalcOutput}{\mathit{p\_SlD},\mathit{u\_SlD},\mathit{x\_SlD},\mathit{xd\_SlD},\mathit{z\_SlD}}$ \State \State\Comment{Form $u$ vector using loads and accelerations from $\mathit{u\_HD}$, $\mathit{u\_BD}$ $\mathit{u\_SD}$, and platform reference input from $\mathit{u\_ED}$} \State @@ -181,6 +182,7 @@ \section{Input-Output Relationships} \State $y\_HD \gets \Call{HD\_CalcOutput}{\mathit{p\_HD},\mathit{u\_HD},\mathit{x\_HD},\mathit{xd\_HD},\mathit{z\_HD}}$ \State $y\_BD \gets \Call{BD\_CalcOutput}{\mathit{p\_BD},\mathit{u\_BD},\mathit{x\_BD},\mathit{xd\_BD},\mathit{z\_BD}}$ \State $y\_Orca \gets \Call{Orca\_CalcOutput}{\mathit{p\_Orca},\mathit{u\_Orca},\mathit{x\_Orca},\mathit{xd\_Orca},\mathit{z\_Orca}}$ + \State $y\_SlD \gets \Call{SlD\_CalcOutput}{\mathit{p\_SlD},\mathit{u\_SlD},\mathit{x\_SlD},\mathit{xd\_SlD},\mathit{z\_SlD}}$ \If{ $k \geq k\_max$} \State exit loop @@ -191,16 +193,18 @@ \section{Input-Output Relationships} \State$\mathit{u\_FEAM\_tmp} \gets \Call{TransferMeshMotions}{y\_ED}$ \State$\mathit{u\_IceF\_tmp} \gets \Call{TransferMeshMotions}{y\_SD}$ \State$\mathit{u\_IceD\_tmp(:)} \gets \Call{TransferMeshMotions}{y\_SD}$ + \State$\mathit{u\_SlD\_tmp} \gets \Call{TransferMeshMotions}{y\_SD}$ \State$\mathit{u\_HD\_tmp} \gets \Call{TransferMeshMotions}{y\_ED,y\_SD}$ \State$\mathit{u\_SD\_tmp} \gets \! \begin{aligned}[t] & \Call{TransferMeshMotions}{\mathit{y\_ED}} \\ & \cup \Call{TransferMeshLoads}{}(\! \begin{aligned}[t] - & \mathit{y\_SD}, \\ - & \mathit{y\_HD},\mathit{u\_HD\_tmp}, \\ - & \mathit{y\_IceF},\mathit{u\_IceF\_tmp}) \\ - & \mathit{y\_IceD(:)},\mathit{u\_IceD\_tmp(:)}) \\ + & \mathit{y\_SD}, \\ + & \mathit{y\_HD}, \mathit{u\_HD\_tmp}, \\ + & \mathit{y\_IceF}, \mathit{u\_IceF\_tmp}, \\ + & \mathit{y\_IceD(:)}, \mathit{u\_IceD\_tmp(:)}, \\ + & \mathit{y\_SlD}, \mathit{u\_SlD\_tmp}) \\ \end{aligned} \end{aligned}$ \State$\mathit{u\_ED\_tmp} \gets \Call{TransferMeshLoads}{}( \! @@ -212,7 +216,7 @@ \section{Input-Output Relationships} \end{aligned}$ \State - \State$\mathit{U\_Residual} \gets u - \Call{u\_vec}{\mathit{u\_HD\_tmp},\mathit{u\_SD\_tmp},\mathit{u\_ED\_tmp}}$ + \State$\mathit{U\_Residual} \gets u - \Call{u\_vec}{\mathit{u\_HD\_tmp},\mathit{u\_SD\_tmp},\mathit{u\_ED\_tmp},\mathit{u\_SlD\_tmp}}$ \State \If{ last Jacobian was calculated at least $\mathit{DT\_UJac}$ seconds ago } @@ -251,11 +255,18 @@ \section{Input-Output Relationships} \State $\mathit{u\_FEAM} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ \State $\mathit{u\_IceF} \gets \Call{TransferMeshMotions}{\mathit{y\_SD}}$ \State $\mathit{u\_IceD(:)} \gets \Call{TransferMeshMotions}{\mathit{y\_SD}}$ + \State $\mathit{u\_SlD} \gets \Call{TransferMeshPosition}{\mathit{y\_SD}}$ \EndProcedure - \end{algorithmic} -%\end{algorithm} + +\paragraph{SoilDyn} +The motion inputs to \emph{SoilDyn} are the position and orientation of the mesh points. The \emph{SoilDyn} module expects changes in position to be in the order of $10^{-3}$~m, or angular changes of $10^{-4}$~radians or less throughout the duration of the simulation with response terms on the order of $10^{12}$~N/m (or N-m/radians). +To simplify the mathematics in the Jacobian, an Euler angle extraction is performed to get rotations about the $x$, $y$, and $z$ axis (the angles are small enough that order does not matter in this context). So the $u$ input vector for \emph{SoilDyn} is a 6-vector for each mesh point. +The resulting reaction forces from \emph{SoilDyn} are roughly characterized as $F_{\mathrm{react}} \approx k x$ where $k$ is a stiffness matrix and $x$ is the 6-vector of translational and rotational displacements (note that there may be some damping or drift terms, but of much lower magnitude). +This creates a situation where $\mathit{u_SD} \gets \mathit{y_SlD} \gets \mathit{y_SD}$ is a feed back loop of \emph{SubDyn} node displacements (stored in states) of a given mesh point directly through \emph{SoilDyn} to the input force on that node point. Without including this calculation in the Jacobian, the accelerations of the \emph{SubDyn} nodes will be missing the reaction force and likely cause non-convergence or large oscillations. For this reason we include the \emph{SoilDyn} input / output into the Jacobian. However this does cause some of the Jacobian to differ by as many as six orders of magnitude, which is numerically non-ideal for the solve. + + \subsection {Implementation of line2-to-line2 loads mapping} The inverse-lumping of loads is computed by a block matrix solve for the distributed forces and moments, From 0a441464684c3a0a03f5ced5b95fde0a421cd194 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Fri, 17 Apr 2020 16:40:32 -0600 Subject: [PATCH 085/136] SlD: move SlD input setting to more logical location --- modules/openfast-library/src/FAST_Solver.f90 | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/modules/openfast-library/src/FAST_Solver.f90 b/modules/openfast-library/src/FAST_Solver.f90 index 726e49a09..c22358cdc 100644 --- a/modules/openfast-library/src/FAST_Solver.f90 +++ b/modules/openfast-library/src/FAST_Solver.f90 @@ -4743,7 +4743,14 @@ SUBROUTINE CalcOutputs_And_SolveForInputs( n_t_global, this_time, this_state, ca MAPp%Input(1), FEAM%Input(1), MD%Input(1), & Orca%Input(1), BD%Input(1,:), MeshMapData, ErrStat2, ErrMsg2 ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - + + + ! Transfer SubDyn outputs to SoilDyn -- adp: maybe this should be included above, or when the TCF branch is merged in, put it into that part of SD transfer + IF ( p_FAST%CompSoil == Module_SlD ) THEN + CALL SlD_InputSolve( SlD%Input(1), SD%y, MeshMapData, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) + END IF + !> Solve option 1 (rigorous solve on loads/accelerations) CALL SolveOption1(this_time, this_state, calcJacobian, p_FAST, ED, BD, HD, SD, ExtPtfm, MAPp, FEAM, MD, Orca, IceF, IceD, SlD, MeshMapData, ErrStat2, ErrMsg2) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) @@ -4893,9 +4900,6 @@ SUBROUTINE SolveOption1(this_time, this_state, calcJacobian, p_FAST, ED, BD, HD, ! SoilDyn IF ( p_FAST%CompSoil == Module_SlD ) THEN - ! Overwrite the SlD inputs with the newly calculated values from SD (we don't need correction steps this way) - CALL SlD_InputSolve( SlD%Input(1), SD%y, MeshMapData, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) CALL SlD_CalcOutput( this_time, SlD%Input(1), SlD%p, SlD%x(this_state), SlD%xd(this_state), SlD%z(this_state), & SlD%OtherSt(this_state), SlD%y, SlD%m, ErrStat2, ErrMsg2 ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) From 8d0ece389811a55353b917e5d4af98c5bfeefb96 Mon Sep 17 00:00:00 2001 From: Jason Jonkman Date: Fri, 17 Apr 2020 23:08:58 -0600 Subject: [PATCH 086/136] Fixed How SoilDyn is Called in the Glue Code Fixed how SoilDyn is called in the glue code to improve numerical stability Also, added a call to BeamDyn CalcOutput in AdvanceStates to improve the DBEMT solution in the BD-AD coupling. Thanks Bonnie Jonkman for the help! --- .../OpenFAST_Algorithms.tex | 55 +++++++++++++------ modules/openfast-library/src/FAST_Solver.f90 | 2 +- 2 files changed, 40 insertions(+), 17 deletions(-) diff --git a/docs/OtherSupporting/OpenFAST_Algorithms/OpenFAST_Algorithms.tex b/docs/OtherSupporting/OpenFAST_Algorithms/OpenFAST_Algorithms.tex index 509ed3985..b06c84e7b 100644 --- a/docs/OtherSupporting/OpenFAST_Algorithms/OpenFAST_Algorithms.tex +++ b/docs/OtherSupporting/OpenFAST_Algorithms/OpenFAST_Algorithms.tex @@ -44,6 +44,7 @@ \section{Definitions and Nomenclature} AeroDyn & AD & AD \\ ServoDyn & SrvD & SrvD \\ SubDyn & SD & SD \\ + ExtPtfm & ExtPtfm & ExtPtfm \\ HydroDyn & HydroDyn & HD \\ MAP++ & MAPp & MAP \\ FEAMooring & FEAM & FEAM \\ @@ -86,10 +87,10 @@ \section{Input-Output Relationships} % SolveOption2a_Inp2BD \State $\mathit{y\_ED} \gets \Call{ED\_CalcOutput}{\mathit{p\_ED},\mathit{u\_ED},\mathit{x\_ED},\mathit{xd\_ED},\mathit{z\_ED}}$ \State $\mathit{u\_BD} \gets \Call{TransferOutputsToInputs}{\mathit{y\_ED}}$ - \State $\mathit{y\_BD} \gets \Call{BD\_CalcOutput}{\mathit{p\_BD},\mathit{u\_BD},\mathit{x\_BD},\mathit{xd\_BD},\mathit{z\_BD}}$ \State % SolveOption2b_Inp2IfW + \State $\mathit{y\_BD} \gets \Call{BD\_CalcOutput}{\mathit{p\_BD},\mathit{u\_BD},\mathit{x\_BD},\mathit{xd\_BD},\mathit{z\_BD}}$ \State $\mathit{u\_AD}($no IfW$) \gets \Call{TransferOutputsToInputs}{\mathit{y\_ED}}$ \State $\mathit{u\_IfW} \gets \Call{TransferOutputsToInputs}{\mathit{y\_ED} at \mathit{u\_AD} nodes}$ @@ -120,11 +121,14 @@ \section{Input-Output Relationships} % \State $\mathit{u\_BD} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ % only if not BD_Solve_Option1 \State $\mathit{u\_HD} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ \State $\mathit{u\_SD} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ + \State $\mathit{u\_ExtPtfm} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ \State $\mathit{u\_MAP} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ \State $\mathit{u\_FEAM} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ \State $\mathit{u\_MD} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ \State $\mathit{u\_Orca} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ + \State + \State $\mathit{y\_SD} \gets \Call{SD\_CalcOutput}{\mathit{p\_SD},\mathit{u\_SD},\mathit{x\_SD},\mathit{xd\_SD},\mathit{z\_SD}}$ \State $\mathit{u\_SlD} \gets \Call{TransferMeshPosition}{\mathit{y\_SD}}$ % \end Transfer_ED_to_HD_SD_BD_Mooring %%%% @@ -151,11 +155,11 @@ \section{Input-Output Relationships} %\pagebreak %break here for now so that it doesn't look so strange -\subsection {Input-Output Solve for \textit{HydroDyn}, \textit{SubDyn}, \textit{MAP}, - \textit{FEAMooring}, \textit{IceFloe}, and the Platform Reference Point Mesh in \textit{ElastoDyn}} +\subsection {Input-Output Solve for \textit{HydroDyn}, \textit{SubDyn}, \textit{OrcaFlexInterface}, \textit{BeamDyn}, \textit{SoilDyn}, \textit{ExtPtfm}, \textit{MAP}, \textit{FEAMooring}, \textit{MoorDyn}, + \textit{FEAMooring}, \textit{IceFloe}, \textit{IceDyn}, and the Platform Reference Point Mesh in \textit{ElastoDyn}} This procedure implements Solve Option 1 for the accelerations and loads in -\emph{HydroDyn},\emph{SubDyn},\emph{MAP},\emph{FEAMooring},\emph{OrcaFlexInterface},\emph{MoorDyn},\emph{SoilDyn}, and\emph{ElastoDyn} (at its platform reference point mesh). +\emph{HydroDyn},\emph{SubDyn},\emph{MAP},\emph{FEAMooring},\emph{OrcaFlexInterface},\emph{MoorDyn},\emph{SoilDyn}, \emph{BeamDyn}, \emph{ExtPtfm}, \emph{IceFloe}, \emph{IceDyn}, and \emph{ElastoDyn} (at its platform reference point mesh). The other input-output relationships for these modules are solved using Solve Option 2. %\begin{algorithm}[ht] @@ -172,9 +176,9 @@ \section{Input-Output Relationships} \State $\mathit{y\_IceD(:)} \gets \Call{CalcOutput}{\mathit{p\_IceD(:)},\mathit{u\_IceD(:)},\mathit{x\_IceD(:)},\mathit{xd\_IceD(:)},\mathit{z\_IceD(:)}}$ \State $\mathit{y\_SlD} \gets \Call{CalcOutput}{\mathit{p\_SlD},\mathit{u\_SlD},\mathit{x\_SlD},\mathit{xd\_SlD},\mathit{z\_SlD}}$ \State - \State\Comment{Form $u$ vector using loads and accelerations from $\mathit{u\_HD}$, $\mathit{u\_BD}$ $\mathit{u\_SD}$, and platform reference input from $\mathit{u\_ED}$} + \State\Comment{Form $u$ vector using loads and accelerations from $\mathit{u\_HD}$, $\mathit{u\_BD}$, $\mathit{u\_SD}$, \mathit{u\_Orca}, \mathit{u\_ExtPtfm}, and platform reference input from $\mathit{u\_ED}$} \State - \State $u \gets \Call{u\_vec}{\mathit{u\_HD},\mathit{u\_SD},\mathit{u\_ED}}$ + \State $u \gets \Call{u\_vec}{\mathit{u\_HD},\mathit{u\_SD},\mathit{u\_ED},\mathit{u\_BD},\mathit{u\_Orca},\mathit{u\_ExtPtfm}}$ \State $k \gets 0$ \Loop\Comment{Solve for loads and accelerations (direct feed-through terms)} \State $y\_ED \gets \Call{ED\_CalcOutput}{\mathit{p\_ED},\mathit{u\_ED},\mathit{x\_ED},\mathit{xd\_ED},\mathit{z\_ED}}$ @@ -182,7 +186,7 @@ \section{Input-Output Relationships} \State $y\_HD \gets \Call{HD\_CalcOutput}{\mathit{p\_HD},\mathit{u\_HD},\mathit{x\_HD},\mathit{xd\_HD},\mathit{z\_HD}}$ \State $y\_BD \gets \Call{BD\_CalcOutput}{\mathit{p\_BD},\mathit{u\_BD},\mathit{x\_BD},\mathit{xd\_BD},\mathit{z\_BD}}$ \State $y\_Orca \gets \Call{Orca\_CalcOutput}{\mathit{p\_Orca},\mathit{u\_Orca},\mathit{x\_Orca},\mathit{xd\_Orca},\mathit{z\_Orca}}$ - \State $y\_SlD \gets \Call{SlD\_CalcOutput}{\mathit{p\_SlD},\mathit{u\_SlD},\mathit{x\_SlD},\mathit{xd\_SlD},\mathit{z\_SlD}}$ + \State $\mathit{y\_ExtPtfm} \gets \Call{CalcOutput}{\mathit{p\_ExtPtfm},\mathit{u\_ExtPtfm},\mathit{x\_ExtPtfm},\mathit{xd\_ExtPtfm},\mathit{z\_ExtPtfm}}$ \If{ $k \geq k\_max$} \State exit loop @@ -191,6 +195,8 @@ \section{Input-Output Relationships} \State$\mathit{u\_BD\_tmp} \gets \Call{TransferMeshMotions}{y\_ED}$ \State$\mathit{u\_MAP\_tmp} \gets \Call{TransferMeshMotions}{y\_ED}$ \State$\mathit{u\_FEAM\_tmp} \gets \Call{TransferMeshMotions}{y\_ED}$ + \State$\mathit{u\_Orca\_tmp} \gets \Call{TransferMeshMotions}{y\_ED}$ + \State$\mathit{u\_MD\_tmp} \gets \Call{TransferMeshMotions}{y\_ED}$ \State$\mathit{u\_IceF\_tmp} \gets \Call{TransferMeshMotions}{y\_SD}$ \State$\mathit{u\_IceD\_tmp(:)} \gets \Call{TransferMeshMotions}{y\_SD}$ \State$\mathit{u\_SlD\_tmp} \gets \Call{TransferMeshMotions}{y\_SD}$ @@ -216,7 +222,7 @@ \section{Input-Output Relationships} \end{aligned}$ \State - \State$\mathit{U\_Residual} \gets u - \Call{u\_vec}{\mathit{u\_HD\_tmp},\mathit{u\_SD\_tmp},\mathit{u\_ED\_tmp},\mathit{u\_SlD\_tmp}}$ + \State$\mathit{U\_Residual} \gets u - \Call{u\_vec}{\mathit{u\_HD\_tmp},\mathit{u\_SD\_tmp},\mathit{u\_ED\_tmp},\mathit{u\_BD\_tmp},\mathit{u\_Orca\_tmp},\mathit{u\_ExtPtfm\_tmp}}$ \State \If{ last Jacobian was calculated at least $\mathit{DT\_UJac}$ seconds ago } @@ -239,7 +245,7 @@ \section{Input-Output Relationships} \EndIf \State \State $u \gets u + \Delta u$ - \State Transfer $u$ to $\mathit{u\_HD}$, $\mathit{u\_SD}$, and $\mathit{u\_ED}$\Comment{loads and accelerations only} + \State Transfer $u$ to $\mathit{u\_HD}$, $\mathit{u\_SD}$, $\mathit{u\_BD}$, $\mathit{u\_Orca}$, $\mathit{u\_ExtPtfm}$, and $\mathit{u\_ED}$\Comment{loads and accelerations only} \State $k=k+1$ \EndLoop @@ -247,8 +253,10 @@ \section{Input-Output Relationships} \State\Comment{Transfer non-acceleration fields to motion input meshes} \State + \State$\mathit{u\_BD}($not accelerations$) \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ \State$\mathit{u\_HD}($not accelerations$) \gets \Call{TransferMeshMotions}{\mathit{y\_ED},\mathit{y\_SD}}$ \State$\mathit{u\_SD}($not accelerations$) \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ + \State$\mathit{u\_Orca}($not accelerations$) \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ \State$\mathit{u\_ExtPtfm}($not accelerations$) \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ \State \State $\mathit{u\_MAP} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ \State $\mathit{u\_MD} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ @@ -260,13 +268,6 @@ \section{Input-Output Relationships} \EndProcedure \end{algorithmic} -\paragraph{SoilDyn} -The motion inputs to \emph{SoilDyn} are the position and orientation of the mesh points. The \emph{SoilDyn} module expects changes in position to be in the order of $10^{-3}$~m, or angular changes of $10^{-4}$~radians or less throughout the duration of the simulation with response terms on the order of $10^{12}$~N/m (or N-m/radians). -To simplify the mathematics in the Jacobian, an Euler angle extraction is performed to get rotations about the $x$, $y$, and $z$ axis (the angles are small enough that order does not matter in this context). So the $u$ input vector for \emph{SoilDyn} is a 6-vector for each mesh point. -The resulting reaction forces from \emph{SoilDyn} are roughly characterized as $F_{\mathrm{react}} \approx k x$ where $k$ is a stiffness matrix and $x$ is the 6-vector of translational and rotational displacements (note that there may be some damping or drift terms, but of much lower magnitude). -This creates a situation where $\mathit{u_SD} \gets \mathit{y_SlD} \gets \mathit{y_SD}$ is a feed back loop of \emph{SubDyn} node displacements (stored in states) of a given mesh point directly through \emph{SoilDyn} to the input force on that node point. Without including this calculation in the Jacobian, the accelerations of the \emph{SubDyn} nodes will be missing the reaction force and likely cause non-convergence or large oscillations. For this reason we include the \emph{SoilDyn} input / output into the Jacobian. However this does cause some of the Jacobian to differ by as many as six orders of magnitude, which is numerically non-ideal for the solve. - - \subsection {Implementation of line2-to-line2 loads mapping} The inverse-lumping of loads is computed by a block matrix solve for the distributed forces and moments, @@ -351,6 +352,28 @@ \section{Solve Option 2 Improvements} \State $\Call{AD\_UpdateStates}{\mathit{p\_AD},\mathit{u\_AD},\mathit{x\_AD},\mathit{xd\_AD},\mathit{z\_AD}}$ \State $\Call{SrvD\_UpdateStates}{\mathit{p\_SrvD},\mathit{u\_SrvD},\mathit{x\_SrvD},\mathit{xd\_SrvD},\mathit{z\_SrvD}}$ \State +% \begin Transfer_ED_to_HD_SD_BD_Mooring +% \State $\mathit{u\_ED}($not platform reference point$) \gets \Call{TransferOutputsToInputs}{y\_SrvD,y\_AD}$ %\Comment{sets all but platform reference point inputs} + +% \State $\mathit{u\_BD} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ % only if not BD_Solve_Option1 + \State $\mathit{u\_HD} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ + \State $\mathit{u\_SD} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ + \State $\mathit{u\_ExtPtfm} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ + \State $\mathit{u\_MAP} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ + \State $\mathit{u\_FEAM} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ + \State $\mathit{u\_MD} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ + \State $\mathit{u\_Orca} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ +% \end Transfer_ED_to_HD_SD_BD_Mooring +\State + \State $\Call{SD\_UpdateStates}{\mathit{p\_SD},\mathit{u\_SD},\mathit{x\_SD},\mathit{xd\_SD},\mathit{z\_SD}}$ + \State $\mathit{y\_SD} \gets \Call{SD\_CalcOutput}{\mathit{p\_SD},\mathit{u\_SD},\mathit{x\_SD},\mathit{xd\_SD},\mathit{z\_SD}}$ + \State $\mathit{u\_SlD} \gets \Call{TransferMeshPosition}{\mathit{y\_SD}}$ + \State $\Call{SlD\_UpdateStates}{\mathit{p\_SlD},\mathit{u\_SlD},\mathit{x\_SlD},\mathit{xd\_SlD},\mathit{z\_SlD}}$ + +%%%% + +\State + \State All other modules (used in Solve Option 1) advance their states \EndProcedure \end{algorithmic} diff --git a/modules/openfast-library/src/FAST_Solver.f90 b/modules/openfast-library/src/FAST_Solver.f90 index c22358cdc..4e476f021 100644 --- a/modules/openfast-library/src/FAST_Solver.f90 +++ b/modules/openfast-library/src/FAST_Solver.f90 @@ -5088,7 +5088,7 @@ SUBROUTINE SolveOption2b_Inp2IfW(this_time, this_state, p_FAST, m_FAST, ED, BD, ErrMsg = "" - IF ( p_FAST%CompElast == Module_BD .AND. .NOT. BD_Solve_Option1 ) THEN + IF ( p_FAST%CompElast == Module_BD ) THEN DO k=1,p_FAST%nBeams CALL BD_CalcOutput( this_time, BD%Input(1,k), BD%p(k), BD%x(k,this_state), BD%xd(k,this_state),& BD%z(k,this_state), BD%OtherSt(k,this_state), BD%y(k), BD%m(k), ErrStat2, ErrMsg2 ) From 88989bf53db5b12b9b5ccaa2783431cb05d6b70e Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Mon, 20 Apr 2020 10:34:23 -0600 Subject: [PATCH 087/136] SlD: minor typo in Alogorithms.tex --- .../OpenFAST_Algorithms.pdf | Bin 229132 -> 228169 bytes .../OpenFAST_Algorithms.tex | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/OtherSupporting/OpenFAST_Algorithms/OpenFAST_Algorithms.pdf b/docs/OtherSupporting/OpenFAST_Algorithms/OpenFAST_Algorithms.pdf index ae7054d1862fe0fe6a0826245b3d1d6fc0625c0e..6ab08da7277c1d439e423f835739c881d690bfac 100644 GIT binary patch delta 119094 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ȥhu7XFt##+w148hzHAF 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 diff --git a/docs/OtherSupporting/OpenFAST_Algorithms/OpenFAST_Algorithms.tex b/docs/OtherSupporting/OpenFAST_Algorithms/OpenFAST_Algorithms.tex index b06c84e7b..2322b7081 100644 --- a/docs/OtherSupporting/OpenFAST_Algorithms/OpenFAST_Algorithms.tex +++ b/docs/OtherSupporting/OpenFAST_Algorithms/OpenFAST_Algorithms.tex @@ -176,7 +176,7 @@ \section{Input-Output Relationships} \State $\mathit{y\_IceD(:)} \gets \Call{CalcOutput}{\mathit{p\_IceD(:)},\mathit{u\_IceD(:)},\mathit{x\_IceD(:)},\mathit{xd\_IceD(:)},\mathit{z\_IceD(:)}}$ \State $\mathit{y\_SlD} \gets \Call{CalcOutput}{\mathit{p\_SlD},\mathit{u\_SlD},\mathit{x\_SlD},\mathit{xd\_SlD},\mathit{z\_SlD}}$ \State - \State\Comment{Form $u$ vector using loads and accelerations from $\mathit{u\_HD}$, $\mathit{u\_BD}$, $\mathit{u\_SD}$, \mathit{u\_Orca}, \mathit{u\_ExtPtfm}, and platform reference input from $\mathit{u\_ED}$} + \State\Comment{Form $u$ vector using loads and accelerations from $\mathit{u\_HD}$, $\mathit{u\_BD}$, $\mathit{u\_SD}$, $\mathit{u\_Orca}$, $\mathit{u\_ExtPtfm}$, and platform reference input from $\mathit{u\_ED}$} \State \State $u \gets \Call{u\_vec}{\mathit{u\_HD},\mathit{u\_SD},\mathit{u\_ED},\mathit{u\_BD},\mathit{u\_Orca},\mathit{u\_ExtPtfm}}$ \State $k \gets 0$ From 1a15eb641856bfbf59e0d82196b0cc95adfb2550 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Mon, 20 Apr 2020 13:00:50 -0600 Subject: [PATCH 088/136] SlD: remove SlD from Jacobian in FAST_Solver --- .../openfast-library/src/FAST_Registry.txt | 2 +- modules/openfast-library/src/FAST_Solver.f90 | 220 +++--------------- modules/openfast-library/src/FAST_Types.f90 | 2 +- 3 files changed, 40 insertions(+), 184 deletions(-) diff --git a/modules/openfast-library/src/FAST_Registry.txt b/modules/openfast-library/src/FAST_Registry.txt index b8470c0bc..8c31e8fb6 100644 --- a/modules/openfast-library/src/FAST_Registry.txt +++ b/modules/openfast-library/src/FAST_Registry.txt @@ -89,7 +89,7 @@ typedef ^ FAST_ParameterType LOGICAL ModuleInitialized {NumModules} - - "An arra # Data for Jacobians: typedef ^ FAST_ParameterType DbKi DT_Ujac - - - "Time between when we need to re-calculate these Jacobians" s typedef ^ FAST_ParameterType Reki UJacSclFact - - - "Scaling factor used to get similar magnitudes between accelerations, forces, and moments in Jacobians" - -typedef ^ FAST_ParameterType IntKi SizeJac_Opt1 {10} - - "(1)=size of matrix; (2)=size of ED portion; (3)=size of SD portion [2 meshes]; (4)=size of HD portion; (5)=size of BD portion blade 1; (6)=size of BD portion blade 2; (7)=size of BD portion blade 3; (8)=size of Orca portion; (9)=size of ExtPtfm portion; (10)=size of SoilDyn portion;" - +typedef ^ FAST_ParameterType IntKi SizeJac_Opt1 {9} - - "(1)=size of matrix; (2)=size of ED portion; (3)=size of SD portion [2 meshes]; (4)=size of HD portion; (5)=size of BD portion blade 1; (6)=size of BD portion blade 2; (7)=size of BD portion blade 3; (8)=size of Orca portion; (9)=size of ExtPtfm portion;" - # Feature switches and flags: typedef ^ FAST_ParameterType IntKi CompElast - - - "Compute blade loads (switch) {Module_ED; Module_BD}" - typedef ^ FAST_ParameterType IntKi CompInflow - - - "Compute inflow wind conditions (switch) {Module_None; Module_IfW; Module_OpFM}" - diff --git a/modules/openfast-library/src/FAST_Solver.f90 b/modules/openfast-library/src/FAST_Solver.f90 index 4e476f021..2d75021ec 100644 --- a/modules/openfast-library/src/FAST_Solver.f90 +++ b/modules/openfast-library/src/FAST_Solver.f90 @@ -1815,7 +1815,7 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & , u_MD, y_MD & , u_IceF, y_IceF & , u_IceD, y_IceD & - , u_SlD, p_SlD, x_SlD, xd_SlD, z_SlD, OtherSt_SlD, y_SlD, m_SlD & + , u_SlD, y_SlD & , MeshMapData , ErrStat, ErrMsg ) !.................................................................................................................................. @@ -1893,14 +1893,8 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & TYPE(Orca_MiscVarType) , INTENT(INOUT) :: m_Orca !< misc/optimization variables !SoilDyn: - TYPE(SlD_ContinuousStateType), INTENT(IN ) :: x_SlD !< Continuous states - TYPE(SlD_DiscreteStateType), INTENT(IN ) :: xd_SlD !< Discrete states - TYPE(SlD_ConstraintStateType), INTENT(IN ) :: z_SlD !< Constraint states - TYPE(SlD_OtherStateType), INTENT(IN ) :: OtherSt_SlD !< Other states - TYPE(SlD_ParameterType), INTENT(IN ) :: p_SlD !< Parameters - TYPE(SlD_InputType), INTENT(INOUT) :: u_SlD !< System inputs + TYPE(SlD_InputType), INTENT(IN ) :: u_SlD !< System inputs TYPE(SlD_OutputType), INTENT(INOUT) :: y_SlD !< System outputs - TYPE(SlD_MiscVarType), INTENT(INOUT) :: m_SlD !< misc/optimization variables ! MAP/FEAM/MoorDyn/IceFloe/IceDyn: @@ -1946,8 +1940,6 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & TYPE(Orca_OutputType) :: y_Orca_perturb ! Perturbed system outputs TYPE(ExtPtfm_InputType) :: u_ExtPtfm_perturb ! Perturbed system inputs TYPE(ExtPtfm_OutputType) :: y_ExtPtfm_perturb ! Perturbed system outputs - TYPE(SlD_InputType) :: u_SlD_perturb ! Perturbed system inputs - TYPE(SlD_OutputType) :: y_SlD_perturb ! Perturbed system outputs INTEGER(IntKi) :: i,j ! loop counters (jacobian column number) @@ -2030,13 +2022,6 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & CALL SetErrStat( ErrStat2, 'y_Orca_perturb:'//ErrMsg2, ErrStat, ErrMsg, RoutineName ) END IF - IF ( p_FAST%CompSoil == Module_SlD ) THEN - CALL SlD_CopyInput( u_SlD, u_SlD_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, 'u_SlD_perturb:'//ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SlD_CopyOutput( y_SlD, y_SlD_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, 'y_SlD_perturb:'//ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END IF - IF (ErrStat >= AbortErrLev) THEN CALL CleanUp() RETURN @@ -2056,7 +2041,7 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & CALL Create_FullOpt1_UVector(u, u_ED%PlatformPtMesh, u_SD%TPMesh, u_SD%LMesh, u_HD%Morison%LumpedMesh, & u_HD%Morison%DistribMesh, u_HD%Mesh, u_ED%HubPtLoad, MeshMapData%u_BD_RootMotion, u_Orca%PtfmMesh, & - u_ExtPtfm%PtfmMesh, u_SlD%SoilMesh, p_FAST ) + u_ExtPtfm%PtfmMesh, p_FAST ) K = 0 @@ -2095,11 +2080,6 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) END IF - IF ( p_FAST%CompSoil == Module_SlD ) THEN - CALL SlD_CalcOutput( this_time, u_SlD, p_SlD, x_SlD, xd_SlD, z_SlD, OtherSt_SlD, y_SlD, m_SlD, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END IF - IF ( ErrStat >= AbortErrLev ) THEN CALL CleanUp() RETURN @@ -2114,7 +2094,7 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & ! (note that we don't want to change u_ED, u_SD, u_HD, u_BD, u_ExtPtfm, or u_Orca, here) !------------------------------------------------------------------------------------------------- - CALL U_FullOpt1_Residual(y_ED, y_SD, y_HD, y_BD, y_Orca, y_ExtPtfm, y_SlD, u, Fn_U_Resid) !May set errors here... + CALL U_FullOpt1_Residual(y_ED, y_SD, y_HD, y_BD, y_Orca, y_ExtPtfm, u, Fn_U_Resid) !May set errors here... IF ( ErrStat >= AbortErrLev ) THEN CALL CleanUp() RETURN @@ -2138,7 +2118,7 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL U_FullOpt1_Residual(y_ED_perturb, y_SD, y_HD, y_BD, y_Orca, y_ExtPtfm, y_SlD, u_perturb, Fn_U_perturb) ! get this perturbation, U_perturb + CALL U_FullOpt1_Residual(y_ED_perturb, y_SD, y_HD, y_BD, y_Orca, y_ExtPtfm, u_perturb, Fn_U_perturb) ! get this perturbation, U_perturb IF ( ErrStat >= AbortErrLev ) THEN @@ -2168,7 +2148,7 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL U_FullOpt1_Residual(y_ED, y_SD_perturb, y_HD, y_BD, y_Orca, y_ExtPtfm, y_SlD, u_perturb, Fn_U_perturb) ! get this perturbation + CALL U_FullOpt1_Residual(y_ED, y_SD_perturb, y_HD, y_BD, y_Orca, y_ExtPtfm, u_perturb, Fn_U_perturb) ! get this perturbation IF ( ErrStat >= AbortErrLev ) THEN CALL CleanUp() @@ -2196,7 +2176,7 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & CALL HydroDyn_CalcOutput( this_time, u_HD_perturb, p_HD, x_HD, xd_HD, z_HD, OtherSt_HD, y_HD_perturb, m_HD, ErrStat2, ErrMsg2 ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL U_FullOpt1_Residual(y_ED, y_SD, y_HD_perturb, y_BD, y_Orca, y_ExtPtfm, y_SlD, u_perturb, Fn_U_perturb) ! get this perturbation + CALL U_FullOpt1_Residual(y_ED, y_SD, y_HD_perturb, y_BD, y_Orca, y_ExtPtfm, u_perturb, Fn_U_perturb) ! get this perturbation IF ( ErrStat >= AbortErrLev ) THEN CALL CleanUp() @@ -2235,7 +2215,7 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & ! calculate outputs with perturbed inputs: CALL BD_CalcOutput( this_time, u_BD_perturb, p_BD(nb), x_BD(nb), xd_BD(nb), z_BD(nb), OtherSt_BD(nb), y_BD_perturb(nb), m_BD(nb), ErrStat2, ErrMsg2 ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL U_FullOpt1_Residual(y_ED, y_SD, y_HD, y_BD_perturb, y_Orca, y_ExtPtfm, y_SlD, u_perturb, Fn_U_perturb) ! get this perturbation + CALL U_FullOpt1_Residual(y_ED, y_SD, y_HD, y_BD_perturb, y_Orca, y_ExtPtfm, u_perturb, Fn_U_perturb) ! get this perturbation IF ( ErrStat >= AbortErrLev ) THEN CALL CleanUp() @@ -2265,7 +2245,7 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & CALL Orca_CalcOutput( this_time, u_Orca_perturb, p_Orca, x_Orca, xd_Orca, z_Orca, OtherSt_Orca, y_Orca_perturb, m_Orca, ErrStat2, ErrMsg2 ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL U_FullOpt1_Residual(y_ED, y_SD, y_HD, y_BD, y_Orca_perturb, y_ExtPtfm, y_SlD, u_perturb, Fn_U_perturb) ! get this perturbation + CALL U_FullOpt1_Residual(y_ED, y_SD, y_HD, y_BD, y_Orca_perturb, y_ExtPtfm, u_perturb, Fn_U_perturb) ! get this perturbation IF ( ErrStat >= AbortErrLev ) THEN CALL CleanUp() @@ -2294,7 +2274,7 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & OtherSt_ExtPtfm, y_ExtPtfm_perturb, m_ExtPtfm, ErrStat2, ErrMsg2 ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL U_FullOpt1_Residual(y_ED, y_SD, y_HD, y_BD, y_Orca, y_ExtPtfm_perturb, y_SlD, u_perturb, Fn_U_perturb) ! get this perturbation + CALL U_FullOpt1_Residual(y_ED, y_SD, y_HD, y_BD, y_Orca, y_ExtPtfm_perturb, u_perturb, Fn_U_perturb) ! get this perturbation IF ( ErrStat >= AbortErrLev ) THEN CALL CleanUp() @@ -2305,32 +2285,6 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & END DO !ExtPtfm contribution - !............................... - ! Get SoilDyn's contribution: (note if p_FAST%CompSoil /= Module_SlD, SizeJac_Opt1(10) = 0) - !............................... - DO j=1,p_FAST%SizeJac_Opt1(10) !call SlD_CalcOutput - i = i + 1 ! i = j + p_FAST%SizeJac_Opt1(2) - - ! perturb u_SlD: - CALL SlD_CopyInput( u_SlD, u_SlD_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - u_perturb = u - CALL Perturb_u_FullOpt1( p_FAST, MeshMapData%Jac_u_indx, i, u_perturb, u_SlD_perturb=u_SlD_perturb, perturb=ThisPerturb ) ! perturb u and u_SlD by ThisPerturb [routine sets ThisPerturb] - - ! calculate outputs with perturbed inputs: - CALL SlD_CalcOutput( this_time, u_SlD_perturb, p_SlD, x_SlD, xd_SlD, z_SlD, OtherSt_SlD, y_SlD_perturb, m_SlD, ErrStat2, ErrMsg2, PerturbLoads=.TRUE.) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL U_FullOpt1_Residual(y_ED, y_SD, y_HD, y_BD, y_Orca, y_ExtPtfm, y_SlD_perturb, u_perturb, Fn_U_perturb) ! get this perturbation - - IF ( ErrStat >= AbortErrLev ) THEN - CALL CleanUp() - RETURN - END IF - - MeshMapData%Jacobian_Opt1(:,i) = (Fn_U_perturb - Fn_U_Resid) / ThisPerturb - - END DO ! SubDyn contribution #ifdef OUTPUT_ADDEDMASS IF (p_FAST%CompHydro == Module_HD ) THEN @@ -2385,7 +2339,7 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & CALL WrFileNR(UnJac, ' SD_TPMesh_RotationAcc_Z_'//TRIM(Num2LStr(TmpIndx))) END DO - IF ( p_FAST%CompHydro == Module_HD .or. p_FAST%CompSoil == Module_SlD ) THEN ! this SD mesh linked only when HD or SlD is enabled + IF ( p_FAST%CompHydro == Module_HD ) THEN ! this SD mesh linked only when HD DO TmpIndx=1,u_SD%LMesh%NNodes CALL WrFileNR(UnJac, ' SD_LMesh_Force_X_'//TRIM(Num2LStr(TmpIndx))) CALL WrFileNR(UnJac, ' SD_LMesh_Force_Y_'//TRIM(Num2LStr(TmpIndx))) @@ -2458,18 +2412,6 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & CALL WrFileNR(UnJac, ' ExtPtfm_PtfmMesh_RotationAcc_Z_'//TRIM(Num2LStr(TmpIndx))) END DO - DO TmpIndx=1,u_SlD%SoilMesh%NNodes - CALL WrFileNR(UnJac, ' SlD_SoilMesh_TranslationDisp_X_'//TRIM(Num2LStr(TmpIndx))) - CALL WrFileNR(UnJac, ' SlD_SoilMesh_TranslationDisp_Y_'//TRIM(Num2LStr(TmpIndx))) - CALL WrFileNR(UnJac, ' SlD_SoilMesh_TranslationDisp_Z_'//TRIM(Num2LStr(TmpIndx))) - END DO - - DO TmpIndx=1,u_SlD%SoilMesh%NNodes - CALL WrFileNR(UnJac, ' SlD_SoilMesh_Orientation_X_'//TRIM(Num2LStr(TmpIndx))) - CALL WrFileNR(UnJac, ' SlD_SoilMesh_Orientation_Y_'//TRIM(Num2LStr(TmpIndx))) - CALL WrFileNR(UnJac, ' SlD_SoilMesh_Orientation_Z_'//TRIM(Num2LStr(TmpIndx))) - END DO - WRITE(UnJac,'()') @@ -2514,7 +2456,7 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & ! IF ( DOT_PRODUCT(u_delta, u_delta) <= TOL_Squared ) EXIT u = u + u_delta - CALL Add_FullOpt1_u_delta( p_FAST, MeshMapData%Jac_u_indx, u_delta, u_ED, u_SD, u_HD, u_BD, u_Orca, u_ExtPtfm, u_SlD ) + CALL Add_FullOpt1_u_delta( p_FAST, MeshMapData%Jac_u_indx, u_delta, u_ED, u_SD, u_HD, u_BD, u_Orca, u_ExtPtfm ) K = K + 1 @@ -2653,23 +2595,6 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & END IF - IF ( p_FAST%CompSoil == Module_SlD ) THEN ! Only true if p_FAST%CompSub == Module_SD - !............... - ! SlD motion inputs: (from SD) - - ! Map SD outputs to SlD inputs (keeping the translations we just calculated): - - MeshMapData%u_SlD_SoilMesh%TranslationDisp = u_SlD%SoilMesh%TranslationDisp - MeshMapData%u_SlD_SoilMesh%Orientation = u_SlD%SoilMesh%Orientation - - CALL Transfer_Point_to_Point( y_SD%y2Mesh, u_SlD%SoilMesh, MeshMapData%SD_P_2_SlD_P, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - u_SlD%SoilMesh%TranslationDisp = MeshMapData%u_SlD_SoilMesh%TranslationDisp - u_SlD%SoilMesh%Orientation = MeshMapData%u_SlD_SoilMesh%Orientation - - END IF - !............................................... ! We're finished !............................................... @@ -2677,7 +2602,7 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & CONTAINS !............................................................................................................................... - SUBROUTINE U_FullOpt1_Residual( y_ED2, y_SD2, y_HD2, y_BD2, y_Orca2, y_ExtPtfm2, y_SlD2, u_IN, U_Resid) + SUBROUTINE U_FullOpt1_Residual( y_ED2, y_SD2, y_HD2, y_BD2, y_Orca2, y_ExtPtfm2, u_IN, U_Resid) ! transfer outputs of ED, HD, SD, BD, and OrcaFlex (and any additional loads that get summed with them) into inputs for ED, HD, SD, BD, and OrcaFlex !............................................................................................................................... @@ -2687,7 +2612,6 @@ SUBROUTINE U_FullOpt1_Residual( y_ED2, y_SD2, y_HD2, y_BD2, y_Orca2, y_ExtPtfm2, TYPE(BD_OutputType) , INTENT(IN ) :: y_BD2(:) ! System outputs TYPE(Orca_OutputType) , INTENT(IN ) :: y_Orca2 ! System outputs TYPE(ExtPtfm_OutputType) , INTENT(IN ) :: y_ExtPtfm2 ! System outputs - TYPE(SlD_OutputType) , INTENT(IN ) :: y_SlD2 ! System outputs REAL(ReKi) , INTENT(IN ) :: u_in(:) REAL(ReKi) , INTENT( OUT) :: U_Resid(:) @@ -2743,17 +2667,6 @@ SUBROUTINE U_FullOpt1_Residual( y_ED2, y_SD2, y_HD2, y_BD2, y_Orca2, y_ExtPtfm2, END IF - IF (p_FAST%CompSoil == Module_SlD) THEN - ! Map Subdyn motion to SoilDyn - CALL SlD_InputSolve( u_SlD, y_SD2, MeshMapData, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) -!FIXME: should I have this here???? - ! Because SD directly affects the outputs of SlD, we calculate here - CALL SlD_CalcOutput( this_time, u_SlD, p_SlD, x_SlD, xd_SlD, z_SlD, OtherSt_SlD, y_SlD, m_SlD, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END IF - - IF ( p_FAST%CompElast == Module_BD .and. BD_Solve_Option1) THEN ! Transfer ED motions to BD inputs: @@ -2777,7 +2690,7 @@ SUBROUTINE U_FullOpt1_Residual( y_ED2, y_SD2, y_HD2, y_BD2, y_Orca2, y_ExtPtfm2, IF ( p_FAST%CompSub == Module_SD ) THEN IF ( p_FAST%CompHydro == Module_HD .or. p_FAST%CompSoil == Module_SlD ) THEN - ! initialize these SD loads inputs here in case HD is used (note from initialiazation that these meshes don't exist if HD or SlD aren't used) + ! initialize these SD loads inputs here in case HD is used (note from initialiazation that these meshes don't exist if HD or SlD aren't used) MeshMapData%u_SD_LMesh%Force = 0.0_ReKi MeshMapData%u_SD_LMesh%Moment = 0.0_ReKi END IF @@ -2866,7 +2779,7 @@ SUBROUTINE U_FullOpt1_Residual( y_ED2, y_SD2, y_HD2, y_BD2, y_Orca2, y_ExtPtfm2, if (p_FAST%CompSoil == Module_SlD) then ! SlD loads to SD - CALL Transfer_Point_to_Point( y_SlD2%SoilMesh, MeshMapData%u_SD_LMesh_2, MeshMapData%SlD_P_2_SD_P, ErrStat2, ErrMsg2, u_SlD%SoilMesh, y_SD2%Y2Mesh ) + CALL Transfer_Point_to_Point( y_SlD%SoilMesh, MeshMapData%u_SD_LMesh_2, MeshMapData%SlD_P_2_SD_P, ErrStat2, ErrMsg2, u_SlD%SoilMesh, y_SD2%Y2Mesh ) CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat, ErrMsg,RoutineName//'Transfer_SlD_to_SD (y_SlD2%SoilMesh -> y_SD2%Y2Mesh)' ) MeshMapData%u_SD_LMesh%Force = MeshMapData%u_SD_LMesh%Force + MeshMapData%u_SD_LMesh_2%Force MeshMapData%u_SD_LMesh%Moment = MeshMapData%u_SD_LMesh%Moment + MeshMapData%u_SD_LMesh_2%Moment @@ -3008,7 +2921,7 @@ SUBROUTINE U_FullOpt1_Residual( y_ED2, y_SD2, y_HD2, y_BD2, y_Orca2, y_ExtPtfm2, CALL Create_FullOpt1_UVector(U_Resid, MeshMapData%u_ED_PlatformPtMesh, MeshMapData%u_SD_TPMesh, MeshMapData%u_SD_LMesh, & MeshMapData%u_HD_M_LumpedMesh, MeshMapData%u_HD_M_DistribMesh, MeshMapData%u_HD_Mesh, & MeshMapData%u_ED_HubPtLoad, MeshMapData%u_BD_RootMotion, MeshMapData%u_Orca_PtfmMesh, & - MeshMapData%u_ExtPtfm_PtfmMesh, MeshMapData%u_SlD_SoilMesh, p_FAST ) + MeshMapData%u_ExtPtfm_PtfmMesh, p_FAST ) U_Resid = u_in - U_Resid @@ -3055,11 +2968,6 @@ SUBROUTINE CleanUp() CALL ExtPtfm_DestroyOutput(y_ExtPtfm_perturb, ErrStat3, ErrMsg3 ) IF (ErrStat3 /= ErrID_None) CALL WrScr(' '//RoutineName//TRIM(ErrMsg3) ) - CALL SlD_DestroyInput( u_SlD_perturb, ErrStat3, ErrMsg3 ) - IF (ErrStat3 /= ErrID_None) CALL WrScr(' '//RoutineName//TRIM(ErrMsg3) ) - CALL SlD_DestroyOutput(y_SlD_perturb, ErrStat3, ErrMsg3 ) - IF (ErrStat3 /= ErrID_None) CALL WrScr(' '//RoutineName//TRIM(ErrMsg3) ) - END IF @@ -3070,7 +2978,7 @@ END SUBROUTINE FullOpt1_InputOutputSolve !> This routine initializes the array that maps rows/columns of the Jacobian to specific mesh fields. !! Do not change the order of this packing without changing subroutine Create_FullOpt1_UVector()! SUBROUTINE Init_FullOpt1_Jacobian( p_FAST, MeshMapData, ED_PlatformPtMesh, SD_TPMesh, SD_LMesh, HD_M_LumpedMesh, HD_M_DistribMesh, & - HD_WAMIT_Mesh, ED_HubPtLoad, u_BD, Orca_PtfmMesh, ExtPtfm_PtfmMesh, SlD_SoilMesh, ErrStat, ErrMsg) + HD_WAMIT_Mesh, ED_HubPtLoad, u_BD, Orca_PtfmMesh, ExtPtfm_PtfmMesh, ErrStat, ErrMsg) TYPE(FAST_ParameterType) , INTENT(INOUT) :: p_FAST !< FAST parameters TYPE(FAST_ModuleMapType) , INTENT(INOUT) :: MeshMapData !< data that maps meshes together @@ -3086,7 +2994,6 @@ SUBROUTINE Init_FullOpt1_Jacobian( p_FAST, MeshMapData, ED_PlatformPtMesh, SD_TP TYPE(BD_InputType) , INTENT(IN ) :: u_BD(:) !< inputs for each instance of the BeamDyn module (for the RootMotion meshes) TYPE(MeshType) , INTENT(IN ) :: Orca_PtfmMesh !< OrcaFlex interface PtfmMesh TYPE(MeshType) , INTENT(IN ) :: ExtPtfm_PtfmMesh !< ExtPtfm_MCKF interface PtfmMesh - TYPE(MeshType) , INTENT(IN ) :: SlD_SoilMesh !< SoilDyn's SoilMesh INTEGER(IntKi) , INTENT( OUT) :: ErrStat !< Error status of the operation CHARACTER(*) , INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None @@ -3141,10 +3048,6 @@ SUBROUTINE Init_FullOpt1_Jacobian( p_FAST, MeshMapData, ED_PlatformPtMesh, SD_TP p_FAST%SizeJac_Opt1(9) = 0 end if - if ( p_FAST%CompSoil == Module_SlD ) then - p_FAST%SizeJac_Opt1(10) = SlD_SoilMesh%NNodes*6 ! Only translation displacements and small angle changes - end if - p_FAST%SizeJac_Opt1(1) = sum( p_FAST%SizeJac_Opt1 ) ! all the inputs from these modules @@ -3242,7 +3145,7 @@ SUBROUTINE Init_FullOpt1_Jacobian( p_FAST, MeshMapData, ED_PlatformPtMesh, SD_TP end do !j end do !i - IF ( p_FAST%CompHydro == Module_HD .or. p_FAST%CompSoil == Module_SlD ) THEN ! this SD mesh linked only when HD is enabled + IF ( p_FAST%CompHydro == Module_HD .or. p_FAST%CompSoil == Module_SlD ) THEN ! this SD mesh linked only when HD or SlD are enabled ! SD_LMesh do i=1,SD_LMesh%NNodes @@ -3403,36 +3306,13 @@ SUBROUTINE Init_FullOpt1_Jacobian( p_FAST, MeshMapData, ED_PlatformPtMesh, SD_TP end do !j end do !i - !............... - ! SoilDyn inputs: - !............... - - ! SlD_SoilMesh - do i=1,SlD_SoilMesh%NNodes - do j=1,3 - MeshMapData%Jac_u_indx(index,1) = 25 !Module/Mesh/Field: u_SlD%SoilMesh%TranslationDisp = 25 - MeshMapData%Jac_u_indx(index,2) = j !index: j - MeshMapData%Jac_u_indx(index,3) = i !Node: i - index = index + 1 - end do !j - end do !i - ! Small angle perturbations only. By defenition, SoilMesh Orientation is very close to the identity - do i=1,SlD_SoilMesh%NNodes - do j=1,3 - MeshMapData%Jac_u_indx(index,1) = 26 !Module/Mesh/Field: u_SlD%SoilMesh%Orientation = 26 - MeshMapData%Jac_u_indx(index,2) = j !index: j - MeshMapData%Jac_u_indx(index,3) = i !Node: i - index = index + 1 - end do !j - end do !i - END SUBROUTINE Init_FullOpt1_Jacobian !---------------------------------------------------------------------------------------------------------------------------------- !> This routine basically packs the relevant parts of the modules' input meshes for use in this InputOutput solve. !! Do not change the order of this packing without changing subroutine Init_FullOpt1_Jacobian()! SUBROUTINE Create_FullOpt1_UVector(u, ED_PlatformPtMesh, SD_TPMesh, SD_LMesh, HD_M_LumpedMesh, HD_M_DistribMesh, HD_WAMIT_Mesh, & - ED_HubPtLoad, BD_RootMotion, Orca_PtfmMesh, ExtPtfm_PtfmMesh, SlD_SoilMesh, p_FAST ) + ED_HubPtLoad, BD_RootMotion, Orca_PtfmMesh, ExtPtfm_PtfmMesh, p_FAST ) !.................................................................................................................................. REAL(ReKi) , INTENT(INOUT) :: u(:) !< output u vector @@ -3448,7 +3328,6 @@ SUBROUTINE Create_FullOpt1_UVector(u, ED_PlatformPtMesh, SD_TPMesh, SD_LMesh, HD TYPE(MeshType) , INTENT(IN ) :: BD_RootMotion(:) !< BeamDyn RootMotion meshes TYPE(MeshType) , INTENT(IN ) :: Orca_PtfmMesh !< OrcaFlex interface PtfmMesh TYPE(MeshType) , INTENT(IN ) :: ExtPtfm_PtfmMesh !< ExtPtfm interface PtfmMesh - TYPE(MeshType) , INTENT(IN ) :: SlD_SoilMesh !< SoilDyn SoilMesh TYPE(FAST_ParameterType) , INTENT(IN ) :: p_FAST !< FAST parameters @@ -3502,7 +3381,7 @@ SUBROUTINE Create_FullOpt1_UVector(u, ED_PlatformPtMesh, SD_TPMesh, SD_LMesh, HD indx_first = indx_last + 1 end do - if ( p_FAST%CompHydro == Module_HD .or. p_FAST%CompSoil == Module_SlD ) then ! this SD mesh linked only when HD or SlD are enabled + if ( p_FAST%CompHydro == Module_HD ) then ! this SD mesh linked only when HD is enabled ! SD inputs (SD_LMesh): do i=1,SD_LMesh%NNodes indx_last = indx_first + 2 @@ -3611,28 +3490,11 @@ SUBROUTINE Create_FullOpt1_UVector(u, ED_PlatformPtMesh, SD_TPMesh, SD_LMesh, HD indx_first = indx_last + 1 end do - !............... - ! SlD inputs (SlD_SoilMesh): - !............... - do i=1,SlD_SoilMesh%NNodes - indx_last = indx_first + 2 - u(indx_first:indx_last) = SlD_SoilMesh%TranslationDisp(:,i) - indx_first = indx_last + 1 - end do - ! Small angle changes only!!!! - ! We use the EulerExtract instead of GetSmllRotAngs since we expect the angles to be on the order of 1e-5, where the order is unimportant - ! However, during the initial Jacobian calculation, we may use a large angle to set it, in which ase GetSmllRotAngs fails, and our Jacobian - ! ends up wrong. - do i=1,SlD_SoilMesh%NNodes - indx_last = indx_first + 2 - u(indx_first:indx_last) = real(EulerExtract(SlD_SoilMesh%Orientation(1:3,1:3,i)), ReKi) ! We are ignoring any errors here... - indx_first = indx_last + 1 - end do - + END SUBROUTINE Create_FullOpt1_UVector !---------------------------------------------------------------------------------------------------------------------------------- !> This routine adds u_delta to the corresponding mesh field and scales it as appropriate -SUBROUTINE Add_FullOpt1_u_delta( p_FAST, Jac_u_indx, u_delta, u_ED, u_SD, u_HD, u_BD, u_Orca, u_ExtPtfm, u_SlD ) +SUBROUTINE Add_FullOpt1_u_delta( p_FAST, Jac_u_indx, u_delta, u_ED, u_SD, u_HD, u_BD, u_Orca, u_ExtPtfm ) !.................................................................................................................................. TYPE(FAST_ParameterType) , INTENT(IN ) :: p_FAST !< Glue-code simulation parameters INTEGER( IntKi ) , INTENT(IN ) :: Jac_u_indx(:,:) !< Index to map Jacobian u-vector into mesh fields @@ -3643,7 +3505,6 @@ SUBROUTINE Add_FullOpt1_u_delta( p_FAST, Jac_u_indx, u_delta, u_ED, u_SD, u_HD, TYPE(BD_InputType) , INTENT(INOUT) :: u_BD(:) !< BD System inputs TYPE(Orca_InputType) , INTENT(INOUT) :: u_Orca !< Orca System inputs TYPE(ExtPtfm_InputType) , INTENT(INOUT) :: u_ExtPtfm !< ExtPtfm System inputs - TYPE(SlD_InputType) , INTENT(INOUT) :: u_SlD !< SlD System inputs ! local variables INTEGER :: n @@ -3713,13 +3574,6 @@ SUBROUTINE Add_FullOpt1_u_delta( p_FAST, Jac_u_indx, u_delta, u_ED, u_SD, u_HD, CASE (24) !Module/Mesh/Field: u_ExtPtfm%PtfmMesh%RotationAcc = 24 u_ExtPtfm%PtfmMesh%RotationAcc( fieldIndx,node) = u_ExtPtfm%PtfmMesh%RotationAcc( fieldIndx,node) + u_delta(n) - CASE (25) !Module/Mesh/Field: u_SlD%SoilMesh%TranslationDisp = 25 - u_SlD%SoilMesh%TranslationDisp( fieldIndx,node) = u_SlD%SoilMesh%TranslationDisp( fieldIndx,node) + real(u_delta(n), R8Ki) - CASE (26) !Module/Mesh/Field: u_SlD%SoilMesh%Orientation = 26 - ! NOTE: the SoilMesh must be close to the identity at all times - !FIXME: This is not very rigorous since we are just sequentially applying them....!!!!! - u_SlD%SoilMesh%Orientation(1:3,1:3,node) = PerturbOrient(u_SlD%SoilMesh%Orientation(1:3,1:3,node),fieldIndx,u_delta(n)) - END SELECT END DO @@ -3743,7 +3597,7 @@ END SUBROUTINE Add_FullOpt1_u_delta !---------------------------------------------------------------------------------------------------------------------------------- !> This routine perturbs the nth element of the u array (and mesh/field it corresponds to) SUBROUTINE Perturb_u_FullOpt1( p_FAST, Jac_u_indx, n, u_perturb, u_ED_perturb, u_SD_perturb, u_HD_perturb, u_BD_perturb, & - u_Orca_perturb, u_ExtPtfm_perturb, u_SlD_perturb, perturb ) + u_Orca_perturb, u_ExtPtfm_perturb, perturb ) !............................................................................................................................... TYPE(FAST_ParameterType) , INTENT(IN ) :: p_FAST !< Glue-code simulation parameters INTEGER( IntKi ) , INTENT(IN ) :: Jac_u_indx(:,:) !< Index to map Jacobian u-vector into mesh fields @@ -3755,7 +3609,6 @@ SUBROUTINE Perturb_u_FullOpt1( p_FAST, Jac_u_indx, n, u_perturb, u_ED_perturb, u TYPE(BD_InputType), OPTIONAL , INTENT(INOUT) :: u_BD_perturb !< BD System inputs (needed only when NumEDNodes+NumSDNodes+NumHDNodes+1 <= n <= inf) [if BD is used] TYPE(Orca_InputType), OPTIONAL , INTENT(INOUT) :: u_Orca_perturb !< Orca System inputs (needed only when NumEDNodes+NumSDNodes+NumHDNodes+NumBDNodes+1 <= n <= inf) [if Orca is used] TYPE(ExtPtfm_InputType), OPTIONAL , INTENT(INOUT) :: u_ExtPtfm_perturb !< ExtPtfm System inputs (needed only when NumEDNodes+NumSDNodes+NumHDNodes+NumBDNodes+NumOcraNodes+1 <= n <= inf) [if ExtPtfm is used] - TYPE(SlD_InputType), OPTIONAL , INTENT(INOUT) :: u_SlD_perturb !< SlD System inputs (needed only when NumEDNodes +1 <= n <= NumEDNodes+NumSDNodes) [if SlD is used] REAL( ReKi ) , INTENT( OUT) :: perturb !< amount that u_perturb(n) was perturbed ! local variables @@ -3849,13 +3702,6 @@ SUBROUTINE Perturb_u_FullOpt1( p_FAST, Jac_u_indx, n, u_perturb, u_ED_perturb, u perturb = GetPerturb( u_ExtPtfm_perturb%PtfmMesh%RotationAcc(fieldIndx , node) ) u_ExtPtfm_perturb%PtfmMesh%RotationAcc( fieldIndx,node) = u_ExtPtfm_perturb%PtfmMesh%RotationAcc( fieldIndx,node) + perturb - CASE (25) !Module/Mesh/Field: u_SlD%SoilMesh%TranslationDisp = 25 - perturb = GetPerturb( real(u_SlD_perturb%SoilMesh%TranslationDisp(fieldIndx , node),ReKi) ) - u_SlD_perturb%SoilMesh%TranslationDisp( fieldIndx,node) = u_SlD_perturb%SoilMesh%TranslationDisp( fieldIndx,node) + real(perturb,R8Ki) - CASE (26) !Module/Mesh/Field: u_SlD%SoilMesh%Orientation = 26 - perturb = GetPerturb( real(u_SlD_perturb%SoilMesh%TranslationDisp(fieldIndx , node),ReKi) ) - u_SlD_perturb%SoilMesh%Orientation(1:3,1:3,node) = PerturbOrient(u_SlD_perturb%SoilMesh%Orientation(1:3,1:3,node),fieldIndx,perturb) - END SELECT u_perturb(n) = u_perturb(n) + perturb @@ -4527,7 +4373,7 @@ SUBROUTINE InitModuleMappings(p_FAST, ED, BD, AD14, AD, HD, SD, ExtPtfm, SrvD, M IF ( p_FAST%CompSub /= Module_None .OR. (p_FAST%CompElast == Module_BD .and. BD_Solve_Option1) .or. p_FAST%CompMooring == Module_Orca) THEN !.OR. p_FAST%CompHydro == Module_HD ) THEN CALL Init_FullOpt1_Jacobian( p_FAST, MeshMapData, ED%Input(1)%PlatformPtMesh, SD%Input(1)%TPMesh, SD%Input(1)%LMesh, & HD%Input(1)%Morison%LumpedMesh, HD%Input(1)%Morison%DistribMesh, HD%Input(1)%Mesh, & - ED%Input(1)%HubPtLoad, BD%Input(1,:), Orca%Input(1)%PtfmMesh, ExtPtfm%Input(1)%PtfmMesh, SlD%Input(1)%SoilMesh, ErrStat2, ErrMsg2) + ED%Input(1)%HubPtLoad, BD%Input(1,:), Orca%Input(1)%PtfmMesh, ExtPtfm%Input(1)%PtfmMesh, ErrStat2, ErrMsg2) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) ELSEIF ( p_FAST%CompHydro == Module_HD ) THEN CALL AllocAry( MeshMapData%Jacobian_Opt1, SizeJac_ED_HD, SizeJac_ED_HD, 'Jacobian for ED-HD coupling', ErrStat2, ErrMsg2 ) @@ -4745,8 +4591,10 @@ SUBROUTINE CalcOutputs_And_SolveForInputs( n_t_global, this_time, this_state, ca CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - ! Transfer SubDyn outputs to SoilDyn -- adp: maybe this should be included above, or when the TCF branch is merged in, put it into that part of SD transfer - IF ( p_FAST%CompSoil == Module_SlD ) THEN + ! Calculate SubDyn and transfer outputs to SoilDyn + IF ( p_FAST%CompSub == Module_SD .and. p_FAST%CompSoil == Module_SlD ) THEN + CALL SD_CalcOutput( this_time, SD%Input(1), SD%p, SD%x(this_state), SD%xd(this_state), SD%z(this_state), SD%OtherSt(this_state), SD%y, SD%m, ErrStat2, ErrMsg2 ) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) CALL SlD_InputSolve( SlD%Input(1), SD%y, MeshMapData, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) END IF @@ -4922,7 +4770,7 @@ SUBROUTINE SolveOption1(this_time, this_state, calcJacobian, p_FAST, ED, BD, HD, , MD%Input(1), MD%y & , IceF%Input(1), IceF%y & , IceD%Input(1,:), IceD%y & ! bjj: I don't really want to make temp copies of input types. perhaps we should pass the whole Input() structure? (likewise for BD)... - , SlD%Input(1), SlD%p, SlD%x( this_state), SlD%xd( this_state), SlD%z( this_state), SlD%OtherSt( this_state), SlD%y, SlD%m & ! only couples to SD at present + , SlD%Input(1), SlD%y & ! only couples to SD at present , MeshMapData , ErrStat2, ErrMsg2 ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) @@ -4978,7 +4826,6 @@ SUBROUTINE SolveOption1(this_time, this_state, calcJacobian, p_FAST, ED, BD, HD, END IF - #ifdef DEBUG_MESH_TRANSFER_ICE CALL WrScr('********************************************************') CALL WrScr('**** IceF to SD point-to-point *****') @@ -5000,6 +4847,15 @@ SUBROUTINE SolveOption1(this_time, this_state, calcJacobian, p_FAST, ED, BD, HD, !print * !pause #endif + +!.................. +! Set SoilDyn inputs (which don't have acceleration fields) +!.................. + IF (p_FAST%CompSoil == Module_SlD) THEN + ! Map Subdyn motion to SoilDyn + CALL SlD_InputSolve( SlD%Input(1), SD%y, MeshMapData, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) + END IF END SUBROUTINE SolveOption1 !---------------------------------------------------------------------------------------------------------------------------------- diff --git a/modules/openfast-library/src/FAST_Types.f90 b/modules/openfast-library/src/FAST_Types.f90 index b29004206..c26d7f1dc 100644 --- a/modules/openfast-library/src/FAST_Types.f90 +++ b/modules/openfast-library/src/FAST_Types.f90 @@ -129,7 +129,7 @@ MODULE FAST_Types LOGICAL , DIMENSION(NumModules) :: ModuleInitialized !< An array determining if the module has been initialized [-] REAL(DbKi) :: DT_Ujac !< Time between when we need to re-calculate these Jacobians [s] REAL(ReKi) :: UJacSclFact !< Scaling factor used to get similar magnitudes between accelerations, forces, and moments in Jacobians [-] - INTEGER(IntKi) , DIMENSION(1:10) :: SizeJac_Opt1 !< (1)=size of matrix; (2)=size of ED portion; (3)=size of SD portion [2 meshes]; (4)=size of HD portion; (5)=size of BD portion blade 1; (6)=size of BD portion blade 2; (7)=size of BD portion blade 3; (8)=size of Orca portion; (9)=size of ExtPtfm portion; (10)=size of SoilDyn portion; [-] + INTEGER(IntKi) , DIMENSION(1:9) :: SizeJac_Opt1 !< (1)=size of matrix; (2)=size of ED portion; (3)=size of SD portion [2 meshes]; (4)=size of HD portion; (5)=size of BD portion blade 1; (6)=size of BD portion blade 2; (7)=size of BD portion blade 3; (8)=size of Orca portion; (9)=size of ExtPtfm portion; [-] INTEGER(IntKi) :: CompElast !< Compute blade loads (switch) {Module_ED; Module_BD} [-] INTEGER(IntKi) :: CompInflow !< Compute inflow wind conditions (switch) {Module_None; Module_IfW; Module_OpFM} [-] INTEGER(IntKi) :: CompAero !< Compute aerodynamic loads (switch) {Module_None; Module_AD14; Module_AD} [-] From a895b84e6d65e4911735fce54850c8e0569ebd5b Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 22 Apr 2020 09:39:06 -0600 Subject: [PATCH 089/136] SlD: update glue code for Jacobian if no HD --- modules/openfast-library/src/FAST_Solver.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/openfast-library/src/FAST_Solver.f90 b/modules/openfast-library/src/FAST_Solver.f90 index 2d75021ec..e6d92d351 100644 --- a/modules/openfast-library/src/FAST_Solver.f90 +++ b/modules/openfast-library/src/FAST_Solver.f90 @@ -3381,7 +3381,7 @@ SUBROUTINE Create_FullOpt1_UVector(u, ED_PlatformPtMesh, SD_TPMesh, SD_LMesh, HD indx_first = indx_last + 1 end do - if ( p_FAST%CompHydro == Module_HD ) then ! this SD mesh linked only when HD is enabled + if ( p_FAST%CompHydro == Module_HD .or. p_FAST%CompSoil == Module_SlD ) then ! this SD mesh linked only when HD or SoilDyn is enabled ! SD inputs (SD_LMesh): do i=1,SD_LMesh%NNodes indx_last = indx_first + 2 From c77c90a7b03ac89a00ecfc652e8af3cc3c1adef1 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 22 Apr 2020 10:01:31 -0600 Subject: [PATCH 090/136] SlD: remove extra mesh from the registry --- .../openfast-library/src/FAST_Registry.txt | 1 - modules/openfast-library/src/FAST_Types.f90 | 90 ------------------- 2 files changed, 91 deletions(-) diff --git a/modules/openfast-library/src/FAST_Registry.txt b/modules/openfast-library/src/FAST_Registry.txt index 8c31e8fb6..5a5e7c4a3 100644 --- a/modules/openfast-library/src/FAST_Registry.txt +++ b/modules/openfast-library/src/FAST_Registry.txt @@ -481,7 +481,6 @@ typedef ^ FAST_ModuleMapType MeshType u_BD_RootMotion {:} - - "copy of BD input typedef ^ FAST_ModuleMapType MeshType y_BD_BldMotion_4Loads {:} - - "BD blade motion output at locations on DistrLoad input meshes" typedef ^ FAST_ModuleMapType MeshType u_Orca_PtfmMesh - - - "copy of Orca PtfmMesh input mesh" typedef ^ FAST_ModuleMapType MeshType u_ExtPtfm_PtfmMesh - - - "copy of ExtPtfm_MCKF PtfmMesh input mesh" -typedef ^ FAST_ModuleMapType MeshType u_SlD_SoilMesh - - - "copy of SlD input mesh" # ..... FAST_ExternalInput data ....................................................................................................... typedef FAST FAST_ExternInputType ReKi GenTrq - - - "generator torque input from Simulink/Labview" typedef ^ FAST_ExternInputType ReKi ElecPwr - - - "electric power input from Simulink/Labview" diff --git a/modules/openfast-library/src/FAST_Types.f90 b/modules/openfast-library/src/FAST_Types.f90 index c26d7f1dc..260478702 100644 --- a/modules/openfast-library/src/FAST_Types.f90 +++ b/modules/openfast-library/src/FAST_Types.f90 @@ -542,7 +542,6 @@ MODULE FAST_Types TYPE(MeshType) , DIMENSION(:), ALLOCATABLE :: y_BD_BldMotion_4Loads !< BD blade motion output at locations on DistrLoad input meshes [-] TYPE(MeshType) :: u_Orca_PtfmMesh !< copy of Orca PtfmMesh input mesh [-] TYPE(MeshType) :: u_ExtPtfm_PtfmMesh !< copy of ExtPtfm_MCKF PtfmMesh input mesh [-] - TYPE(MeshType) :: u_SlD_SoilMesh !< copy of SlD input mesh [-] END TYPE FAST_ModuleMapType ! ======================= ! ========= FAST_ExternInputType ======= @@ -24784,9 +24783,6 @@ SUBROUTINE FAST_CopyModuleMapType( SrcModuleMapTypeData, DstModuleMapTypeData, C CALL MeshCopy( SrcModuleMapTypeData%u_ExtPtfm_PtfmMesh, DstModuleMapTypeData%u_ExtPtfm_PtfmMesh, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat>=AbortErrLev) RETURN - CALL MeshCopy( SrcModuleMapTypeData%u_SlD_SoilMesh, DstModuleMapTypeData%u_SlD_SoilMesh, CtrlCode, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - IF (ErrStat>=AbortErrLev) RETURN END SUBROUTINE FAST_CopyModuleMapType SUBROUTINE FAST_DestroyModuleMapType( ModuleMapTypeData, ErrStat, ErrMsg ) @@ -24910,7 +24906,6 @@ SUBROUTINE FAST_DestroyModuleMapType( ModuleMapTypeData, ErrStat, ErrMsg ) ENDIF CALL MeshDestroy( ModuleMapTypeData%u_Orca_PtfmMesh, ErrStat, ErrMsg ) CALL MeshDestroy( ModuleMapTypeData%u_ExtPtfm_PtfmMesh, ErrStat, ErrMsg ) - CALL MeshDestroy( ModuleMapTypeData%u_SlD_SoilMesh, ErrStat, ErrMsg ) END SUBROUTINE FAST_DestroyModuleMapType SUBROUTINE FAST_PackModuleMapType( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) @@ -25846,23 +25841,6 @@ SUBROUTINE FAST_PackModuleMapType( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Int_BufSz = Int_BufSz + SIZE( Int_Buf ) DEALLOCATE(Int_Buf) END IF - Int_BufSz = Int_BufSz + 3 ! u_SlD_SoilMesh: size of buffers for each call to pack subtype - CALL MeshPack( InData%u_SlD_SoilMesh, Re_Buf, Db_Buf, Int_Buf, ErrStat2, ErrMsg2, .TRUE. ) ! u_SlD_SoilMesh - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - IF (ErrStat >= AbortErrLev) RETURN - - IF(ALLOCATED(Re_Buf)) THEN ! u_SlD_SoilMesh - Re_BufSz = Re_BufSz + SIZE( Re_Buf ) - DEALLOCATE(Re_Buf) - END IF - IF(ALLOCATED(Db_Buf)) THEN ! u_SlD_SoilMesh - Db_BufSz = Db_BufSz + SIZE( Db_Buf ) - DEALLOCATE(Db_Buf) - END IF - IF(ALLOCATED(Int_Buf)) THEN ! u_SlD_SoilMesh - Int_BufSz = Int_BufSz + SIZE( Int_Buf ) - DEALLOCATE(Int_Buf) - END IF IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) THEN @@ -27422,34 +27400,6 @@ SUBROUTINE FAST_PackModuleMapType( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ELSE IntKiBuf( Int_Xferred ) = 0; Int_Xferred = Int_Xferred + 1 ENDIF - CALL MeshPack( InData%u_SlD_SoilMesh, Re_Buf, Db_Buf, Int_Buf, ErrStat2, ErrMsg2, OnlySize ) ! u_SlD_SoilMesh - 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 END SUBROUTINE FAST_PackModuleMapType SUBROUTINE FAST_UnPackModuleMapType( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) @@ -29657,46 +29607,6 @@ SUBROUTINE FAST_UnPackModuleMapType( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrSta IF(ALLOCATED(Re_Buf )) DEALLOCATE(Re_Buf ) IF(ALLOCATED(Db_Buf )) DEALLOCATE(Db_Buf ) IF(ALLOCATED(Int_Buf)) DEALLOCATE(Int_Buf) - 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 MeshUnpack( OutData%u_SlD_SoilMesh, Re_Buf, Db_Buf, Int_Buf, ErrStat2, ErrMsg2 ) ! u_SlD_SoilMesh - 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) END SUBROUTINE FAST_UnPackModuleMapType SUBROUTINE FAST_CopyExternInputType( SrcExternInputTypeData, DstExternInputTypeData, CtrlCode, ErrStat, ErrMsg ) From a76c0e30b7060e756d1cf92ad5eea4d81a4c68f0 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 22 Apr 2020 10:07:11 -0600 Subject: [PATCH 091/136] SlD: remove extra logic from the SlD_CalcOutput --- modules/soildyn/src/SoilDyn.f90 | 55 +++++++++------------------------ 1 file changed, 15 insertions(+), 40 deletions(-) diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index 239b07eea..c7e9676b2 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -303,11 +303,11 @@ subroutine SlD_InitMeshes( InputFileData, InitInp, u, y, p, m, ErrStat, ErrMsg ) , IOS = COMPONENT_INPUT & , NNodes = p%NumPoints & , TranslationDisp = .TRUE. & - , TranslationVel = .TRUE. & - , TranslationAcc = .TRUE. & + , TranslationVel = .FALSE. & + , TranslationAcc = .FALSE. & , Orientation = .TRUE. & - , RotationVel = .TRUE. & - , RotationAcc = .TRUE. & + , RotationVel = .FALSE. & + , RotationAcc = .FALSE. & , ErrStat = ErrStat2 & , ErrMess = ErrMsg2 ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) @@ -451,7 +451,7 @@ end subroutine SlD_UpdateStates !---------------------------------------------------------------------------------------------------------------------------------- !> This is a routine for computing outputs, used in both loose and tight coupling. -subroutine SlD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, PerturbLoads ) +subroutine SlD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) real(DbKi), intent(in ) :: t !< Current simulation time in seconds type(SlD_InputType), intent(in ) :: u !< Inputs at t @@ -463,7 +463,6 @@ subroutine SlD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, type(SlD_MiscVarType), intent(inout) :: m !< Misc variables for optimization (not copied in glue code) type(SlD_OutputType), intent(inout) :: y !< Outputs computed at t (Input only so that mesh con- !! nectivity information does not have to be recalculated) - logical, optional, intent(in ) :: PerturbLoads !< is this call for a jacobian? If so may have huge inputs integer(IntKi), intent( out) :: ErrStat !< Error status of the operation character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None @@ -475,20 +474,12 @@ subroutine SlD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, real(R8Ki) :: Displacement(6) real(R8Ki) :: Force(6) integer(IntKi) :: i !< generic counter - logical :: LargeAnglePossible logical :: TimeStepRecalc ! Initialize ErrStat ErrStat = ErrID_None ErrMsg = "" - if (present(PerturbLoads)) then - LargeAnglePossible = .true. - else - LargeAnglePossible = .false. - endif - - ! Are we recalculating a previous timestep (like correction step?) if (T > m%PrevTime) then TimeStepRecalc = .FALSE. @@ -501,13 +492,7 @@ subroutine SlD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, ! Copy displacement from point mesh (angles in radians -- REDWIN dll also uses rad) Displacement(1:3) = u%SoilMesh%TranslationDisp(1:3,1) ! Translations -- This is R8Ki in the mesh - - ! If we are doing a perturbation, we will only be doing one angle at a time, and the angle may be large. - if (LargeAnglePossible) then - Displacement(4:6) = EulerExtract(u%SoilMesh%Orientation(1:3,1:3,1)) ! Perturbations only use one angle at a time. - else - Displacement(4:6) = GetSmllRotAngs(u%SoilMesh%Orientation(1:3,1:3,1), ErrStat2, ErrMsg2); if (Failed()) return; - endif + Displacement(4:6) = GetSmllRotAngs(u%SoilMesh%Orientation(1:3,1:3,1), ErrStat2, ErrMsg2); if (Failed()) return; ! Calculate reaction with F = k*dX Force = matmul(p%Stiffness, Displacement) @@ -531,28 +516,18 @@ subroutine SlD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, ! Copy displacement from point mesh (angles in radians -- REDWIN dll also uses rad) Displacement(1:3) = u%SoilMesh%TranslationDisp(1:3,i) ! Translations -- This is R8Ki in the mesh - if (p%DLL_Model == 2) Displacement(3) = 0.0_R8Ki - - ! If we are have a large input angle, or requested only using stiffness matrices in the calculation - if (LargeAnglePossible .or. p%DLL_OnlyStiff) then + Displacement(4:6) = GetSmllRotAngs(u%SoilMesh%Orientation(1:3,1:3,i), ErrStat2, ErrMsg2); if (Failed()) return; ! Small angle assumption should be valid here -- Note we are assuming reforientation is identity - Displacement(4:6) = EulerExtract(u%SoilMesh%Orientation(1:3,1:3,i)) ! Perturbations only use one angle at a time. - if (p%DLL_Model == 2) Displacement(6) = 0.0_R8Ki - - ! Calculate reaction with F = k*dX for large displacements. - Force = matmul(p%DLL_StiffNess(1:6,1:6,i), Displacement) - else - Displacement(4:6) = GetSmllRotAngs(u%SoilMesh%Orientation(1:3,1:3,i), ErrStat2, ErrMsg2); if (Failed()) return; ! Small angle assumption should be valid here -- Note we are assuming reforientation is identity - - if (p%DLL_Model == 2) Displacement(6) = 0.0_R8Ki + if (p%DLL_Model == 2) then + Displacement(3) = 0.0_R8Ki + Displacement(6) = 0.0_R8Ki + end if - call REDWINinterface_CalcOutput( p%DLL_Trgt, p%DLL_Model, Displacement, Force, m%dll_data(i), ErrStat2, ErrMsg2 ); if (Failed()) return; - - ! store new states if not recalc - if (.not. TimeStepRecalc) then - m%dll_dataPREV(i) = m%dll_data(i) - endif + call REDWINinterface_CalcOutput( p%DLL_Trgt, p%DLL_Model, Displacement, Force, m%dll_data(i), ErrStat2, ErrMsg2 ); if (Failed()) return; + ! store new states if not recalc + if (.not. TimeStepRecalc) then + m%dll_dataPREV(i) = m%dll_data(i) endif if (p%DLL_Model == 2) then From 4218d8ceb1910bd9e44845bd65eb12803ba0186b Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 22 Apr 2020 10:27:37 -0600 Subject: [PATCH 092/136] SlD: update of algorithm to match documentation better --- modules/openfast-library/src/FAST_Solver.f90 | 82 ++++++++++++-------- 1 file changed, 50 insertions(+), 32 deletions(-) diff --git a/modules/openfast-library/src/FAST_Solver.f90 b/modules/openfast-library/src/FAST_Solver.f90 index e6d92d351..8f8265750 100644 --- a/modules/openfast-library/src/FAST_Solver.f90 +++ b/modules/openfast-library/src/FAST_Solver.f90 @@ -1893,8 +1893,8 @@ SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & TYPE(Orca_MiscVarType) , INTENT(INOUT) :: m_Orca !< misc/optimization variables !SoilDyn: - TYPE(SlD_InputType), INTENT(IN ) :: u_SlD !< System inputs - TYPE(SlD_OutputType), INTENT(INOUT) :: y_SlD !< System outputs + TYPE(SlD_InputType), INTENT(INOUT) :: u_SlD !< System inputs + TYPE(SlD_OutputType), INTENT(IN ) :: y_SlD !< System outputs ! MAP/FEAM/MoorDyn/IceFloe/IceDyn: @@ -2666,6 +2666,11 @@ SUBROUTINE U_FullOpt1_Residual( y_ED2, y_SD2, y_HD2, y_BD2, y_Orca2, y_ExtPtfm2, END IF + IF ( p_FAST%CompSoil == Module_SlD ) THEN + CALL SlD_InputSolve( u_SlD, y_SD2, MeshMapData, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) + END IF + IF ( p_FAST%CompElast == Module_BD .and. BD_Solve_Option1) THEN @@ -4354,14 +4359,12 @@ SUBROUTINE InitModuleMappings(p_FAST, ED, BD, AD14, AD, HD, SD, ExtPtfm, SrvD, M !------------------------- IF ( p_FAST%CompSoil == Module_SlD ) THEN - ! SoilDyn output SoilMesh point mesh to SubDyn input LMesh point mesh CALL MeshMapCreate( SlD%y%SoilMesh, SD%Input(1)%LMesh, MeshMapData%SlD_P_2_SD_P, ErrStat2, ErrMsg2 ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':SlD_P_2_SD_P' ) ! SubDyn output y2Mesh point mesh to SoilDyn input SoilMesh point mesh CALL MeshMapCreate( SD%y%y2Mesh, SlD%Input(1)%SoilMesh, MeshMapData%SD_P_2_SlD_P, ErrStat2, ErrMsg2 ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':SD_P_2_SlD_P' ) - END IF ! SubDyn-SoilDyn IF (ErrStat >= AbortErrLev ) RETURN @@ -4472,13 +4475,6 @@ SUBROUTINE InitModuleMappings(p_FAST, ED, BD, AD14, AD, HD, SD, ExtPtfm, SrvD, M END IF - IF ( p_FAST%CompSoil == Module_SlD ) THEN - - CALL MeshCopy ( SlD%Input(1)%SoilMesh, MeshMapData%u_SlD_SoilMesh, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':u_SlD_SoilMesh' ) - - END IF - END IF @@ -5363,6 +5359,18 @@ SUBROUTINE FAST_AdvanceStates( t_initial, n_t_global, p_FAST, y_FAST, m_FAST, ED END IF +! FIXME: the copy to BD is redundant with above. + ! Transfer the outputs of ED to other modules. +! CALL Transfer_ED_to_HD_SD_BD_Mooring( p_FAST, ED%Output(1), HD%Input(STATE_PRED), SD%Input(1), ExtPtfm%Input(STATE_PRED), & +! MAPp%Input(STATE_PRED), FEAM%Input(STATE_PRED), MD%Input(STATE_PRED), & +! Orca%Input(STATE_PRED), BD%Input(STATE_PRED,:), MeshMapData, ErrStat2, ErrMsg2 ) + IF ( p_FAST%CompSub == Module_SD ) THEN + ! Map ED (motion) outputs to SD inputs: + CALL Transfer_Point_to_Point( ED%Output(1)%PlatformPtMesh, SD%Input(1)%TPMesh, MeshMapData%ED_P_2_SD_TP, ErrStat2, ErrMsg2 ) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + END IF + + ! HydroDyn: get predicted states IF ( p_FAST%CompHydro == Module_HD ) THEN CALL HydroDyn_CopyContState (HD%x( STATE_CURR), HD%x( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) @@ -5427,6 +5435,37 @@ SUBROUTINE FAST_AdvanceStates( t_initial, n_t_global, p_FAST, y_FAST, m_FAST, ED END IF + ! SoilDyn: get predicted states + IF (p_FAST%CompSoil == Module_SlD) THEN + ! Get SD output + CALL SD_CalcOutput( t_global_next, SD%Input(1), SD%p, SD%x(STATE_PRED), SD%xd(STATE_PRED), SD%z(STATE_PRED), SD%OtherSt(STATE_PRED), SD%y, SD%m, ErrStat2, ErrMsg2 ) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + + ! Copy over SD outputs + CALL SlD_InputSolve( SlD%Input(1), SD%y, MeshMapData, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) + + + CALL SlD_CopyContState (SlD%x( STATE_CURR), SlD%x( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) + CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + CALL SlD_CopyDiscState (SlD%xd(STATE_CURR), SlD%xd(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) + CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + CALL SlD_CopyConstrState (SlD%z( STATE_CURR), SlD%z( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) + CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + CALL SlD_CopyOtherState( SlD%OtherSt(STATE_CURR), SlD%OtherSt(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) + CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + + DO j_ss = 1, p_FAST%n_substeps( Module_SlD ) + n_t_module = n_t_global*p_FAST%n_substeps( Module_SlD ) + j_ss - 1 + t_module = n_t_module*p_FAST%dt_module( Module_SlD ) + t_initial + + CALL SlD_UpdateStates( t_module, n_t_module, SlD%Input, SlD%InputTimes, SlD%p, SlD%x(STATE_PRED), SlD%xd(STATE_PRED), & + SlD%z(STATE_PRED), SlD%OtherSt(STATE_PRED), SlD%m, ErrStat2, ErrMsg2 ) + CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + END DO !j_ss + END IF + + ! Mooring: MAP/FEAM/MD/Orca: get predicted states IF (p_FAST%CompMooring == Module_MAP) THEN CALL MAP_CopyContState (MAPp%x( STATE_CURR), MAPp%x( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) @@ -5552,27 +5591,6 @@ SUBROUTINE FAST_AdvanceStates( t_initial, n_t_global, p_FAST, y_FAST, m_FAST, ED END IF - ! SoilDyn: get predicted states - IF (p_FAST%CompSoil == Module_SlD) THEN - CALL SlD_CopyContState (SlD%x( STATE_CURR), SlD%x( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SlD_CopyDiscState (SlD%xd(STATE_CURR), SlD%xd(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SlD_CopyConstrState (SlD%z( STATE_CURR), SlD%z( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SlD_CopyOtherState( SlD%OtherSt(STATE_CURR), SlD%OtherSt(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - DO j_ss = 1, p_FAST%n_substeps( Module_SlD ) - n_t_module = n_t_global*p_FAST%n_substeps( Module_SlD ) + j_ss - 1 - t_module = n_t_module*p_FAST%dt_module( Module_SlD ) + t_initial - - CALL SlD_UpdateStates( t_module, n_t_module, SlD%Input, SlD%InputTimes, SlD%p, SlD%x(STATE_PRED), SlD%xd(STATE_PRED), & - SlD%z(STATE_PRED), SlD%OtherSt(STATE_PRED), SlD%m, ErrStat2, ErrMsg2 ) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO !j_ss - END IF - END SUBROUTINE FAST_AdvanceStates !---------------------------------------------------------------------------------------------------------------------------------- From e28b64400ad80b38bab9815974e7ab9714d6e4c4 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 22 Apr 2020 10:32:06 -0600 Subject: [PATCH 093/136] SlD: missed a bit of logic in a76c0e30 --- modules/soildyn/src/SoilDyn.f90 | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index c7e9676b2..76d3b3284 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -552,10 +552,8 @@ subroutine SlD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg contains logical function Failed() - if (.not. LargeAnglePossible ) then - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - Failed = ErrStat >= AbortErrLev - endif + call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + Failed = ErrStat >= AbortErrLev end function Failed end subroutine SlD_CalcOutput From f5bf3e731a24f50afe80e0c054fd4ef7fff88775 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 5 May 2020 09:56:16 -0600 Subject: [PATCH 094/136] SlD: allow heave/yaw in the reaction on Model 2 and update on the iterations in FAST_Solver at start --- modules/openfast-library/src/FAST_Subs.f90 | 2 +- modules/soildyn/src/SoilDyn.f90 | 10 ---------- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/modules/openfast-library/src/FAST_Subs.f90 b/modules/openfast-library/src/FAST_Subs.f90 index 5a553895a..e499e8d5d 100644 --- a/modules/openfast-library/src/FAST_Subs.f90 +++ b/modules/openfast-library/src/FAST_Subs.f90 @@ -4508,7 +4508,7 @@ SUBROUTINE FAST_Solution(t_initial, n_t_global, p_FAST, y_FAST, m_FAST, ED, BD, END IF ! set number of corrections to be used for this time step: - IF ( p_FAST%CompElast == Module_BD ) THEN ! BD accelerations have fewer spikes with these corrections on the first several time steps + IF ( p_FAST%CompElast == Module_BD .or. p_FAST%CompSoil == Module_SlD ) THEN ! BD accelerations have fewer spikes with these corrections on the first several time steps, and SoilDyn works better with HydroDyn. if (n_t_global > 2) then ! this 2 should probably be related to p_FAST%InterpOrder NumCorrections = p_FAST%NumCrctn elseif (n_t_global == 0) then diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index 76d3b3284..c326e4db7 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -518,11 +518,6 @@ subroutine SlD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg Displacement(1:3) = u%SoilMesh%TranslationDisp(1:3,i) ! Translations -- This is R8Ki in the mesh Displacement(4:6) = GetSmllRotAngs(u%SoilMesh%Orientation(1:3,1:3,i), ErrStat2, ErrMsg2); if (Failed()) return; ! Small angle assumption should be valid here -- Note we are assuming reforientation is identity - if (p%DLL_Model == 2) then - Displacement(3) = 0.0_R8Ki - Displacement(6) = 0.0_R8Ki - end if - call REDWINinterface_CalcOutput( p%DLL_Trgt, p%DLL_Model, Displacement, Force, m%dll_data(i), ErrStat2, ErrMsg2 ); if (Failed()) return; ! store new states if not recalc @@ -530,11 +525,6 @@ subroutine SlD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg m%dll_dataPREV(i) = m%dll_data(i) endif - if (p%DLL_Model == 2) then - Force(3) = 0.0_R8Ki - Force(6) = 0.0_R8Ki - endif - ! Return reaction force onto the resulting point mesh y%SoilMesh%Force (1:3,i) = -real(Force(1:3),ReKi) y%SoilMesh%Moment(1:3,i) = -real(Force(4:6),ReKi) From feeceab4e3134e95b3a11e84823d3b89f775f48a Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 5 May 2020 17:28:33 -0600 Subject: [PATCH 095/136] TMD: add tower top time-series force input file --- modules/servodyn/src/TMD.f90 | 302 +++++++++++++++++++++++++- modules/servodyn/src/TMD_Registry.txt | 3 + modules/servodyn/src/TMD_Types.f90 | 83 +++++++ 3 files changed, 384 insertions(+), 4 deletions(-) diff --git a/modules/servodyn/src/TMD.f90 b/modules/servodyn/src/TMD.f90 index 0481f691f..4e68f0ac3 100644 --- a/modules/servodyn/src/TMD.f90 +++ b/modules/servodyn/src/TMD.f90 @@ -48,6 +48,7 @@ MODULE TMD INTEGER(IntKi), PRIVATE, PARAMETER :: DOFMode_Indept = 1 !< independent DOFs INTEGER(IntKi), PRIVATE, PARAMETER :: DOFMode_Omni = 2 !< omni-directional + INTEGER(IntKi), PRIVATE, PARAMETER :: DOFMode_Prescribed = 3 !< prescribed force series INTEGER(IntKi), PRIVATE, PARAMETER :: CMODE_Semi = 1 !< semi-active control INTEGER(IntKi), PRIVATE, PARAMETER :: CMODE_Active = 2 !< active control @@ -128,8 +129,8 @@ SUBROUTINE TMD_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOu ! CALL CheckError( ErrStat2, ErrMsg2 ) ! IF (ErrStat >= AbortErrLev) RETURN - IF ( InputFileData%TMD_DOF_MODE /= ControlMode_None .and. InputFileData%TMD_DOF_MODE /= DOFMode_Indept .and. InputFileData%TMD_DOF_MODE /= DOFMode_Omni ) & - CALL SetErrStat( ErrID_Fatal, 'DOF mode (TMD_DOF_MODE) must be 0 (no DOF), 1 (two independent DOFs), or 2 (omni-directional).', ErrStat, ErrMsg, RoutineName ) + IF ( InputFileData%TMD_DOF_MODE /= ControlMode_None .and. InputFileData%TMD_DOF_MODE /= DOFMode_Indept .and. InputFileData%TMD_DOF_MODE /= DOFMode_Omni .and. InputFileData%TMD_DOF_MODE /= DOFMode_Prescribed ) & + CALL SetErrStat( ErrID_Fatal, 'DOF mode (TMD_DOF_MODE) must be 0 (no DOF), 1 (two independent DOFs), 2 (omni-directional), or 3 (prescribed force time-series).', ErrStat, ErrMsg, RoutineName ) IF ( InputFileData%TMD_CMODE /= ControlMode_None .and. InputFileData%TMD_CMODE /= CMODE_Semi ) & CALL SetErrStat( ErrID_Fatal, 'Control mode (TMD_CMode) must be 0 (none) or 1 (semi-active) in this version of TMD.', ErrStat, ErrMsg, RoutineName ) @@ -177,6 +178,7 @@ SUBROUTINE TMD_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOu m%C_ctrl = 0.0_ReKi ! whole array initialization m%C_Brake = 0.0_ReKi ! whole array initialization m%F_table = 0.0_ReKi ! whole array initialization + m%PrescribedInterpIdx = 0_IntKi ! index tracker for PrescribedForce option ! Define initial guess for the system inputs here: x%tmd_x(1) = p%X_DSP @@ -645,6 +647,7 @@ SUBROUTINE TMD_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrM TYPE(TMD_ContinuousStateType) :: dxdt ! first time derivative of continuous states + INTEGER(IntKi) :: I !< generic counter ErrStat = ErrID_None ErrMsg = "" @@ -714,6 +717,14 @@ SUBROUTINE TMD_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrM ! moments in global coordinates y%Mesh%Moment(:,1) = matmul(transpose(u%Mesh%Orientation(:,:,1)),M_P_N) + ELSE IF ( p%TMD_DOF_MODE == DOFMode_Prescribed ) THEN + ! For prescribed forces, we are simply going to interpolate the input file + do i=1,3 ! Forces linear interpolation, hold end values + y%Mesh%Force(:,i) =InterpStp( real(Time,ReKi), p%TMD_PrescribedForce(1,:),p%TMD_PrescribedForce(i+1,:),m%PrescribedInterpIdx, size(p%TMD_PrescribedForce,2)) + enddo + do i=1,3 ! Moments linear interpolation, hold end values + y%Mesh%Moment(:,i) =InterpStp( real(Time,ReKi), p%TMD_PrescribedForce(1,:),p%TMD_PrescribedForce(i+4,:),m%PrescribedInterpIdx, size(p%TMD_PrescribedForce,2)) + enddo END IF END SUBROUTINE TMD_CalcOutput @@ -1547,6 +1558,15 @@ SUBROUTINE ReadPrimaryFile( InputFile, InputFileData, OutFileRoot, UnEc, ErrStat IF ( ErrStat >= AbortErrLev ) RETURN + !------------------ TMD Prescribed Forces ------------------- + CALL ReadCom( UnIn, InputFile, 'Section Header: TMD CONTROL', ErrStat2, ErrMsg2, UnEc ) + CALL CheckError( ErrStat2, ErrMsg2 ) + + CALL ReadVar( UnIn, InputFile, InputFileData%TMD_PrescribedFile, "TMD_PrescribedFile","Prescribed input time series", ErrStat2, ErrMsg2, UnEc) + CALL CheckError( ErrStat2, ErrMsg2 ) + IF ( ErrStat >= AbortErrLev ) RETURN + + !!---------------------- OUTPUT -------------------------------------------------- !CALL ReadCom( UnIn, InputFile, 'Section Header: Output', ErrStat2, ErrMsg2, UnEc ) ! CALL CheckError( ErrStat2, ErrMsg2 ) @@ -1620,7 +1640,7 @@ SUBROUTINE TMD_SetParameters( InputFileData, p, ErrStat, ErrMsg ) ! Local variables INTEGER(IntKi) :: ErrStat2 ! Temporary error ID - !CHARACTER(ErrMsgLen) :: ErrMsg2 ! Temporary message describing error + CHARACTER(ErrMsgLen) :: ErrMsg2 ! Temporary message describing error CHARACTER(*), PARAMETER :: RoutineName = 'TMD_SetParameters' @@ -1686,7 +1706,281 @@ SUBROUTINE TMD_SetParameters( InputFileData, p, ErrStat, ErrMsg ) p%F_TBL = InputFileData%F_TBL; + if ( p%TMD_DOF_MODE == DOFMode_Prescribed ) then + call Read_ForceTimeSeriesFile(InputFileData%TMD_PrescribedFile,p%TMD_PrescribedForce,ErrStat2,ErrMsg2) + call SetErrStat(ErrStat2,ErrMsg2, ErrStat,ErrMsg, RoutineName) + endif + + END SUBROUTINE TMD_SetParameters + + + + +subroutine Read_ForceTimeSeriesFile(ForceFilename,ForceArray,ErrStat,ErrMsg) + character(*), intent(in ) :: ForceFileName + real(ReKi), allocatable, intent( out) :: ForceArray(:,:) + integer(IntKi), intent( out) :: ErrStat + character(ErrMsgLen), intent( out) :: ErrMsg + + character(1024) :: ErrMsgTmp !< Temporary error message for calls + integer(IntKi) :: ErrStatTmp !< Temporary error status for calls + integer(IntKi) :: FiD !< Unit number for points file to open + integer(IntKi) :: NumDataColumns !< Number of data columns + integer(IntKi) :: NumDataPoints !< Number of lines of data (one point per line) + integer(IntKi) :: NumHeaderLines !< Number of header lines to ignore + integer(IntKi) :: I !< Generic counter + character(*), parameter :: RoutineName='Read_ForceTimeSeriesFile' + + ! Initialization of subroutine + ErrMsg = '' + ErrMsgTmp = '' + ErrStat = ErrID_None + ErrStatTmp = ErrID_None + + ! Now open file + call GetNewUnit( FiD ) + call OpenFInpFile( FiD, trim(ForceFileName), ErrStatTmp, ErrMsgTmp ) ! Unformatted input file + if ( ErrStatTmp >= AbortErrLev ) then + call SetErrStat( ErrStatTmp, ErrMsgTmp, ErrStat, ErrMsg, RoutineName) + close( FiD ) + return + endif + + ! Find out how long the file is + call GetFileLength( FiD, ForceFileName, NumDataColumns, NumDataPoints, NumHeaderLines, ErrMsgTmp, ErrStatTmp ) + if ( ErrStatTmp >= AbortErrLev ) then + call SetErrStat( ErrStatTmp, ErrMsgTmp, ErrStat, ErrMsg, RoutineName) + close( FiD ) + return + endif + if ( NumDataColumns /= 7 ) then + CALL SetErrStat( ErrID_Fatal,' Expecting 7 columns in '//TRIM(ForceFileName)//' corresponding to '// & + 'X, Y, and Z coordinates. Instead found '//TRIM(Num2LStr(NumDataColumns))//'.', & + ErrStat, ErrMsg, RoutineName) + close( FiD ) + return + endif + + ! Allocate the storage for the data + call AllocAry( ForceArray, 7, NumDataPoints, "Array of Points data", ErrStatTmp, ErrMsgTmp ) + if ( ErrStatTmp >= AbortErrLev ) then + call SetErrStat( ErrStatTmp, ErrMsgTmp, ErrStat, ErrMsg, RoutineName) + close( FiD ) + return + endif + + ! Read in the headers and throw them away + do I=1,NumHeaderLines + call ReadCom( FiD, ForceFileName,' Points file header line', ErrStatTmp, ErrMsgTmp ) + if ( ErrStatTmp /= ErrID_None ) then + call SetErrStat(ErrID_Fatal,ErrMsgTmp,ErrStat,ErrMsg,RoutineName) + close( FiD ) + return + endif + enddo + + ! Read in the datapoints + do I=1,NumDataPoints + call ReadAry ( FiD, ForceFileName, ForceArray(:,I), 7, 'ForceArray', & + 'Coordinate point from Points file', ErrStatTmp, ErrMsgTmp) + if ( ErrStat /= ErrID_None ) THEN + call SetErrStat( ErrID_Fatal,ErrMsgTmp,ErrStat,ErrMsg,RoutineName) + close( FiD ) + return + endif + enddo + + close( FiD ) + +contains + + !------------------------------------------------------------------------------------------------------------------------------- + !> This subroutine looks at a file that has been opened and finds out how many header lines there are, how many columns there + !! are, and how many lines of data there are in the file. + !! + !! A few things are assumed about the file: + !! 1. Any header lines are the first thing in the file. + !! 2. No text appears anyplace other than in first part of the file + !! 3. The datalines only contain numbers that can be read in as reals. + !! + !! Limitations: + !! 1. only handles up to 20 words (columns) on a line + !! 2. empty lines are considered text lines + !! 3. All data rows must contain the same number of columns + !! + !! + subroutine GetFileLength(UnitDataFile, DataFileName, NumDataColumns, NumDataLines, NumHeaderLines, ErrMsg, ErrStat) + integer(IntKi), intent(in ) :: UnitDataFile !< Unit number of the file we are looking at. + character(*), intent(in ) :: DataFileName !< The name of the file we are looking at. + integer(IntKi), intent( out) :: NumDataColumns !< The number of columns in the data file. + integer(IntKi), intent( out) :: NumDataLines !< Number of lines containing data + integer(IntKi), intent( out) :: NumHeaderLines !< Number of header lines at the start of the file + character(*), intent( out) :: ErrMsg !< Error Message to return (empty if all good) + integer(IntKi), intent( out) :: ErrStat !< Status flag if there were any problems (ErrID_None if all good) + + ! Local Variables + character(2048) :: ErrMsgTmp !< Temporary message variable. Used in calls. + integer(IntKi) :: ErrStatTmp !< Temporary error status. Used in calls. + integer(IntKi) :: LclErrStat !< Temporary error status. Used locally to indicate when we have reached the end of the file. + integer(IntKi) :: TmpIOErrStat !< Temporary error status for the internal read of the first word to a real number + logical :: IsRealNum !< Flag indicating if the first word on the line was a real number + + character(1024) :: TextLine !< One line of text read from the file + integer(IntKi) :: LineLen !< The length of the line read in + character(1024) :: StrRead !< String containing the first word read in + real(ReKi) :: RealRead !< Returns value of the number (if there was one), or NaN (as set by NWTC_Num) if there wasn't + character(1024) :: VarName !< Name of the variable we are trying to read from the file + character(24) :: Words(20) !< Array of words we extract from a line. We shouldn't have more than 20. + integer(IntKi) :: i,j,k !< simple integer counters + integer(IntKi) :: LineNumber !< the line I am on + logical :: LineHasText !< Flag indicating if the line I just read has text. If so, it is a header line. + logical :: HaveReadData !< Flag indicating if I have started reading data. + integer(IntKi) :: NumWords !< Number of words on a line + integer(IntKi) :: FirstDataLineNum !< Line number of the first row of data in the file + + ! Initialize the error handling + ErrStat = ErrID_None + ErrStatTmp = ErrID_None + LclErrStat = ErrID_None + ErrMsg = '' + ErrMsgTmp = '' + + ! Set some of the flags and counters + HaveReadData = .FALSE. + NumDataColumns = 0 + NumHeaderLines = 0 + NumDataLines = 0 + LineNumber = 0 + + ! Just in case we were handed a file that we are part way through reading (should never be true), rewind to the start + rewind( UnitDataFile ) + + !------------------------------------ + !> The variable LclErrStat is used to indicate when we have reached the end of the file or had an error from + !! ReadLine. Until that occurs, we read each line, and decide if it contained any non-numeric data. The + !! first group of lines containing non-numeric data is considered the header. The first line of all numeric + !! data is considered the start of the data section. Any non-numeric containing found within the data section + !! will be considered as an invalid file format at which point we will return a fatal error from this routine. + do while ( LclErrStat == ErrID_None ) + + !> Reset the indicator flag for the non-numeric content + LineHasText = .FALSE. + + !> Read in a single line from the file + call ReadLine( UnitDataFile, '', TextLine, LineLen, LclErrStat ) + + !> If there was an error in reading the file, then exit. + !! Possible causes: reading beyond end of file in which case we are done so don't process it. + if ( LclErrStat /= ErrID_None ) exit + + !> Increment the line counter. + LineNumber = LineNumber + 1 + + !> Read all the words on the line into the array called 'Words'. Only the first words will be encountered + !! will be stored. The others are empty (i.e. only three words on the line, so the remaining 17 are empty). + call GetWords( TextLine, Words, 20 ) + + !> Cycle through and count how many are not empty. Once an empty value is encountered, all the rest should + !! be empty if GetWords worked correctly. The index of the last non-empty value is stored. + do i=1,20 + if (TRIM(Words(i)) .ne. '') NumWords=i + enddo + + + !> Now cycle through the first 'NumWords' of non-empty values stored in 'Words'. Words should contain + !! everything that is one the line. The subroutine ReadRealNumberFromString will set a flag 'IsRealNum' + !! when the value in Words(i) can be read as a real(ReKi). 'StrRead' will contain the string equivalent. + do i=1,NumWords + CALL ReadRealNumberFromString( Words(i), RealRead, StrRead, IsRealNum, ErrStatTmp, ErrMsgTmp, TmpIOErrStat ) + if ( .not. IsRealNum) LineHasText = .TRUE. + enddo + + !> If all the words on that line had no text in them, then it must have been a line of data. + !! If not, then we have either a header line, which is ok, or a line containing text in the middle of the + !! the data section, which is not good (the flag HaveReadData tells us which case this is). + if ( LineHasText ) then + if ( HaveReadData ) then ! Uh oh, we have already read a line of data before now, so there is a problem + call SetErrStat( ErrID_Fatal, ' Found text on line '//TRIM(Num2LStr(LineNumber))//' of '//TRIM(DataFileName)// & + ' when real numbers were expected. There may be a problem with format of the file: '// & + TRIM(DataFileName)//'.', ErrStat, ErrMsg, 'GetFileLength') + if ( ErrStat >= AbortErrLev ) return + else + NumHeaderLines = NumHeaderLines + 1 + endif + else ! No text, must be data line + NumDataLines = NumDataLines + 1 + ! If this is the first row of data, then store the number of words that were on the line + if ( .not. HaveReadData ) then + ! If this is the first line of data, keep some relevant info about it and the number of columns in it + HaveReadData = .TRUE. + FirstDataLineNum = LineNumber ! Keep the line number of the first row of data (for error reporting) + NumDataColumns = NumWords + else + ! Make sure that the number columns on the row matches the number of columnns on the first row of data. + if ( NumWords /= NumDataColumns ) then + call SetErrStat( ErrID_Fatal, ' Error in file: '//TRIM(DataFileName)//'.'// & + ' The number of data columns on line '//TRIM(Num2LStr(LineNumber))// & + '('//TRIM(Num2LStr(NumWords))//' columns) is different than the number of columns on first row of data '// & + ' (line: '//TRIM(Num2LStr(FirstDataLineNum))//', '//TRIM(Num2LStr(NumDataColumns))//' columns).', & + ErrStat, ErrMsg, 'GetFileLength') + if ( ErrStat >= AbortErrLev ) return + endif + endif + endif + enddo + rewind( UnitDataFile ) + end subroutine GetFileLength + + !------------------------------------------------------------------------------- + !> This subroutine takes a line of text that is passed in and reads the first + !! word to see if it is a number. An internal read is used to do this. If + !! it is a number, it is started in ValueRead and returned. The flag IsRealNum + !! is set to true. Otherwise, ValueRead is set to NaN (value from the NWTC_Num) + !! and the flag is set to false. + !! + !! The IsRealNum flag is set to indicate if we actually have a real number or + !! not. After calling this routine, a simple if statement can be used: + !! + !! @code + !! IF (IsRealNum) THEN + !! ! do something + !! ELSE + !! ! do something else + !! ENDIF + !! @endcode + !! + !------------------------------------------------------------------------------- + subroutine ReadRealNumberFromString(StringToParse, ValueRead, StrRead, IsRealNum, ErrStat, ErrMsg, IOErrStat) + character(*), intent(in ) :: StringToParse !< The string we were handed. + real(ReKi), intent( out) :: ValueRead !< The variable being read. Returns as NaN (library defined) if not a Real. + character(*), intent( out) :: StrRead !< A string containing what was read from the ReadNum routine. + logical, intent( out) :: IsRealNum !< Flag indicating if we successfully read a Real + integer(IntKi), intent( out) :: ErrStat !< ErrID level returned from ReadNum + character(*), intent( out) :: ErrMsg !< Error message including message from ReadNum + integer(IntKi), intent( out) :: IOErrStat !< Error status from the internal read. Useful for diagnostics. + + ! Initialize some things + ErrStat = ErrID_None + ErrMsg = '' + + ! ReadNum returns a string contained in StrRead. So, we now try to do an internal read to VarRead and then trap errors. + read(StringToParse,*,IOSTAT=IOErrStat) StrRead + read(StringToParse,*,IOSTAT=IOErrStat) ValueRead + + ! If IOErrStat==0, then we have a real number, anything else is a problem. + if (IOErrStat==0) then + IsRealNum = .TRUE. + else + IsRealNum = .FALSE. + ValueRead = NaN ! This is NaN as defined in the NWTC_Num. + ErrMsg = 'Not a real number. '//TRIM(ErrMsgTmp)//NewLine + ErrSTat = ErrID_Severe + endif + return + end subroutine ReadRealNumberFromString +end subroutine Read_ForceTimeSeriesFile + !---------------------------------------------------------------------------------------------------------------------------------- END MODULE TMD -!********************************************************************************************************************************** \ No newline at end of file +!********************************************************************************************************************************** diff --git a/modules/servodyn/src/TMD_Registry.txt b/modules/servodyn/src/TMD_Registry.txt index 105c5a0e9..2ed7bb4ac 100644 --- a/modules/servodyn/src/TMD_Registry.txt +++ b/modules/servodyn/src/TMD_Registry.txt @@ -44,6 +44,7 @@ typedef ^ ^ ReKi TMD_Y_C_BRAKE - - - "TMD X high damping for braking the T typedef ^ ^ LOGICAL USE_F_TBL - - - "use spring force from user-defined table (flag)" - typedef ^ ^ CHARACTER(1024) TMD_F_TBL_FILE - - - "user-defined spring table filename" - typedef ^ ^ ReKi F_TBL {:}{:} - - "user-defined spring force" "N" +typedef ^ ^ CHARACTER(1024) TMD_PrescribedFile - - - "Prescribed force time-series filename" - # ..... Initialization data ....................................................................................................... # Define inputs that the initialization routine may need here: # e.g., the name of the input file, the file root name, etc. @@ -77,6 +78,7 @@ typedef ^ MiscVarType ReKi C_Brake {2} - - "Braking Damping" - typedef ^ MiscVarType ReKi F_table {2} - - "Tabled Stiffness" - typedef ^ MiscVarType ReKi F_k_x - - - "Factor for x-component stiffness force" - typedef ^ MiscVarType ReKi F_k_y - - - "Factor for y-component stiffness force" - +typedef ^ MiscVarType IntKi PrescribedInterpIdx - - - "Index for interpolation of Prescribed force array" - # ..... Parameters ................................................................................................................ @@ -112,6 +114,7 @@ typedef ^ ^ ReKi TMD_X_C_BRAKE - - - "TMD X high damping for braking the T typedef ^ ^ ReKi TMD_Y_C_BRAKE - - - "TMD X high damping for braking the TMD" "N/(m/s)" typedef ^ ^ LOGICAL Use_F_TBL - - - "use spring force from user-defined table (flag)" - typedef ^ ^ ReKi F_TBL {:}{:} - - "user-defined spring force" "N" +typedef ^ ^ ReKi TMD_PrescribedForce {:}{:} - - "TMD prescribed force time-series info" "(s,N,N-m)" # ..... Inputs .................................................................................................................... # Define inputs that are contained on the mesh here: typedef ^ InputType MeshType Mesh - - - "Displacements at the TMD reference point P in the inertial frame" - diff --git a/modules/servodyn/src/TMD_Types.f90 b/modules/servodyn/src/TMD_Types.f90 index a76b12542..f1b970287 100644 --- a/modules/servodyn/src/TMD_Types.f90 +++ b/modules/servodyn/src/TMD_Types.f90 @@ -70,6 +70,7 @@ MODULE TMD_Types LOGICAL :: USE_F_TBL !< use spring force from user-defined table (flag) [-] CHARACTER(1024) :: TMD_F_TBL_FILE !< user-defined spring table filename [-] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: F_TBL !< user-defined spring force [N] + CHARACTER(1024) :: TMD_PrescribedFile !< Prescribed force time-series filename [-] END TYPE TMD_InputFile ! ======================= ! ========= TMD_InitInputType ======= @@ -116,6 +117,7 @@ MODULE TMD_Types REAL(ReKi) , DIMENSION(1:2) :: F_table !< Tabled Stiffness [-] REAL(ReKi) :: F_k_x !< Factor for x-component stiffness force [-] REAL(ReKi) :: F_k_y !< Factor for y-component stiffness force [-] + INTEGER(IntKi) :: PrescribedInterpIdx !< Index for interpolation of Prescribed force array [-] END TYPE TMD_MiscVarType ! ======================= ! ========= TMD_ParameterType ======= @@ -150,6 +152,7 @@ MODULE TMD_Types REAL(ReKi) :: TMD_Y_C_BRAKE !< TMD X high damping for braking the TMD [N/(m/s)] LOGICAL :: Use_F_TBL !< use spring force from user-defined table (flag) [-] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: F_TBL !< user-defined spring force [N] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: TMD_PrescribedForce !< TMD prescribed force time-series info [(s,N,N-m)] END TYPE TMD_ParameterType ! ======================= ! ========= TMD_InputType ======= @@ -227,6 +230,7 @@ SUBROUTINE TMD_CopyInputFile( SrcInputFileData, DstInputFileData, CtrlCode, ErrS END IF DstInputFileData%F_TBL = SrcInputFileData%F_TBL ENDIF + DstInputFileData%TMD_PrescribedFile = SrcInputFileData%TMD_PrescribedFile END SUBROUTINE TMD_CopyInputFile SUBROUTINE TMD_DestroyInputFile( InputFileData, ErrStat, ErrMsg ) @@ -317,6 +321,7 @@ SUBROUTINE TMD_PackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs Int_BufSz = Int_BufSz + 2*2 ! F_TBL upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%F_TBL) ! F_TBL END IF + Int_BufSz = Int_BufSz + 1*LEN(InData%TMD_PrescribedFile) ! TMD_PrescribedFile IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) THEN @@ -432,6 +437,10 @@ SUBROUTINE TMD_PackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs IF (SIZE(InData%F_TBL)>0) ReKiBuf ( Re_Xferred:Re_Xferred+(SIZE(InData%F_TBL))-1 ) = PACK(InData%F_TBL,.TRUE.) Re_Xferred = Re_Xferred + SIZE(InData%F_TBL) END IF + DO I = 1, LEN(InData%TMD_PrescribedFile) + IntKiBuf(Int_Xferred) = ICHAR(InData%TMD_PrescribedFile(I:I), IntKi) + Int_Xferred = Int_Xferred + 1 + END DO ! I END SUBROUTINE TMD_PackInputFile SUBROUTINE TMD_UnPackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) @@ -566,6 +575,10 @@ SUBROUTINE TMD_UnPackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er Re_Xferred = Re_Xferred + SIZE(OutData%F_TBL) DEALLOCATE(mask2) END IF + DO I = 1, LEN(OutData%TMD_PrescribedFile) + OutData%TMD_PrescribedFile(I:I) = CHAR(IntKiBuf(Int_Xferred)) + Int_Xferred = Int_Xferred + 1 + END DO ! I END SUBROUTINE TMD_UnPackInputFile SUBROUTINE TMD_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, ErrStat, ErrMsg ) @@ -1431,6 +1444,7 @@ SUBROUTINE TMD_CopyMisc( SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg ) DstMiscData%F_table = SrcMiscData%F_table DstMiscData%F_k_x = SrcMiscData%F_k_x DstMiscData%F_k_y = SrcMiscData%F_k_y + DstMiscData%PrescribedInterpIdx = SrcMiscData%PrescribedInterpIdx END SUBROUTINE TMD_CopyMisc SUBROUTINE TMD_DestroyMisc( MiscData, ErrStat, ErrMsg ) @@ -1487,6 +1501,7 @@ SUBROUTINE TMD_PackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, Si Re_BufSz = Re_BufSz + SIZE(InData%F_table) ! F_table Re_BufSz = Re_BufSz + 1 ! F_k_x Re_BufSz = Re_BufSz + 1 ! F_k_y + Int_BufSz = Int_BufSz + 1 ! PrescribedInterpIdx IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) THEN @@ -1530,6 +1545,8 @@ SUBROUTINE TMD_PackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, Si Re_Xferred = Re_Xferred + 1 ReKiBuf ( Re_Xferred:Re_Xferred+(1)-1 ) = InData%F_k_y Re_Xferred = Re_Xferred + 1 + IntKiBuf ( Int_Xferred:Int_Xferred+(1)-1 ) = InData%PrescribedInterpIdx + Int_Xferred = Int_Xferred + 1 END SUBROUTINE TMD_PackMisc SUBROUTINE TMD_UnPackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) @@ -1635,6 +1652,8 @@ SUBROUTINE TMD_UnPackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg Re_Xferred = Re_Xferred + 1 OutData%F_k_y = ReKiBuf( Re_Xferred ) Re_Xferred = Re_Xferred + 1 + OutData%PrescribedInterpIdx = IntKiBuf( Int_Xferred ) + Int_Xferred = Int_Xferred + 1 END SUBROUTINE TMD_UnPackMisc SUBROUTINE TMD_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg ) @@ -1695,6 +1714,20 @@ SUBROUTINE TMD_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg END IF END IF DstParamData%F_TBL = SrcParamData%F_TBL +ENDIF +IF (ALLOCATED(SrcParamData%TMD_PrescribedForce)) THEN + i1_l = LBOUND(SrcParamData%TMD_PrescribedForce,1) + i1_u = UBOUND(SrcParamData%TMD_PrescribedForce,1) + i2_l = LBOUND(SrcParamData%TMD_PrescribedForce,2) + i2_u = UBOUND(SrcParamData%TMD_PrescribedForce,2) + IF (.NOT. ALLOCATED(DstParamData%TMD_PrescribedForce)) THEN + ALLOCATE(DstParamData%TMD_PrescribedForce(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%TMD_PrescribedForce.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstParamData%TMD_PrescribedForce = SrcParamData%TMD_PrescribedForce ENDIF END SUBROUTINE TMD_CopyParam @@ -1709,6 +1742,9 @@ SUBROUTINE TMD_DestroyParam( ParamData, ErrStat, ErrMsg ) ErrMsg = "" IF (ALLOCATED(ParamData%F_TBL)) THEN DEALLOCATE(ParamData%F_TBL) +ENDIF +IF (ALLOCATED(ParamData%TMD_PrescribedForce)) THEN + DEALLOCATE(ParamData%TMD_PrescribedForce) ENDIF END SUBROUTINE TMD_DestroyParam @@ -1781,6 +1817,11 @@ SUBROUTINE TMD_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, S Int_BufSz = Int_BufSz + 2*2 ! F_TBL upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%F_TBL) ! F_TBL END IF + Int_BufSz = Int_BufSz + 1 ! TMD_PrescribedForce allocated yes/no + IF ( ALLOCATED(InData%TMD_PrescribedForce) ) THEN + Int_BufSz = Int_BufSz + 2*2 ! TMD_PrescribedForce upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%TMD_PrescribedForce) ! TMD_PrescribedForce + END IF IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) THEN @@ -1884,6 +1925,22 @@ SUBROUTINE TMD_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, S IF (SIZE(InData%F_TBL)>0) ReKiBuf ( Re_Xferred:Re_Xferred+(SIZE(InData%F_TBL))-1 ) = PACK(InData%F_TBL,.TRUE.) Re_Xferred = Re_Xferred + SIZE(InData%F_TBL) END IF + IF ( .NOT. ALLOCATED(InData%TMD_PrescribedForce) ) 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%TMD_PrescribedForce,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%TMD_PrescribedForce,1) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%TMD_PrescribedForce,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%TMD_PrescribedForce,2) + Int_Xferred = Int_Xferred + 2 + + IF (SIZE(InData%TMD_PrescribedForce)>0) ReKiBuf ( Re_Xferred:Re_Xferred+(SIZE(InData%TMD_PrescribedForce))-1 ) = PACK(InData%TMD_PrescribedForce,.TRUE.) + Re_Xferred = Re_Xferred + SIZE(InData%TMD_PrescribedForce) + END IF END SUBROUTINE TMD_PackParam SUBROUTINE TMD_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) @@ -2051,6 +2108,32 @@ SUBROUTINE TMD_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg Re_Xferred = Re_Xferred + SIZE(OutData%F_TBL) DEALLOCATE(mask2) END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! TMD_PrescribedForce 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 + i2_l = IntKiBuf( Int_Xferred ) + i2_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ALLOCATED(OutData%TMD_PrescribedForce)) DEALLOCATE(OutData%TMD_PrescribedForce) + ALLOCATE(OutData%TMD_PrescribedForce(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%TMD_PrescribedForce.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + ALLOCATE(mask2(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating mask2.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + mask2 = .TRUE. + IF (SIZE(OutData%TMD_PrescribedForce)>0) OutData%TMD_PrescribedForce = UNPACK(ReKiBuf( Re_Xferred:Re_Xferred+(SIZE(OutData%TMD_PrescribedForce))-1 ), mask2, 0.0_ReKi ) + Re_Xferred = Re_Xferred + SIZE(OutData%TMD_PrescribedForce) + DEALLOCATE(mask2) + END IF END SUBROUTINE TMD_UnPackParam SUBROUTINE TMD_CopyInput( SrcInputData, DstInputData, CtrlCode, ErrStat, ErrMsg ) From 612bb7a8a2ec93e317552a27e8892544633a825b Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 6 May 2020 08:57:34 -0600 Subject: [PATCH 096/136] TMD: fix error in force --- modules/servodyn/src/TMD.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/servodyn/src/TMD.f90 b/modules/servodyn/src/TMD.f90 index 4e68f0ac3..516d9cc7a 100644 --- a/modules/servodyn/src/TMD.f90 +++ b/modules/servodyn/src/TMD.f90 @@ -720,10 +720,10 @@ SUBROUTINE TMD_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrM ELSE IF ( p%TMD_DOF_MODE == DOFMode_Prescribed ) THEN ! For prescribed forces, we are simply going to interpolate the input file do i=1,3 ! Forces linear interpolation, hold end values - y%Mesh%Force(:,i) =InterpStp( real(Time,ReKi), p%TMD_PrescribedForce(1,:),p%TMD_PrescribedForce(i+1,:),m%PrescribedInterpIdx, size(p%TMD_PrescribedForce,2)) + y%Mesh%Force(i,1) =InterpStp( real(Time,ReKi), p%TMD_PrescribedForce(1,:),p%TMD_PrescribedForce(i+1,:),m%PrescribedInterpIdx, size(p%TMD_PrescribedForce,2)) enddo do i=1,3 ! Moments linear interpolation, hold end values - y%Mesh%Moment(:,i) =InterpStp( real(Time,ReKi), p%TMD_PrescribedForce(1,:),p%TMD_PrescribedForce(i+4,:),m%PrescribedInterpIdx, size(p%TMD_PrescribedForce,2)) + y%Mesh%Moment(i,1) =InterpStp( real(Time,ReKi), p%TMD_PrescribedForce(1,:),p%TMD_PrescribedForce(i+4,:),m%PrescribedInterpIdx, size(p%TMD_PrescribedForce,2)) enddo END IF From 5167a7c6bd05c6c9b742675075aae524d00cb5e9 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Thu, 7 May 2020 09:05:00 -0600 Subject: [PATCH 097/136] SlD: fix an issue with error handling --- modules/soildyn/src/SoilDyn.f90 | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index c326e4db7..999ae6ec8 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -187,16 +187,22 @@ subroutine SlD_REDWINsetup( InputFileData,p, m, ErrStat, ErrMsg ) real(R8Ki) :: NullDispl(6) !< ignored real(R8Ki) :: NullForce(6) !< ignored + ErrStat = ErrID_None + ErrMsg = "" + ! set placeholder for DLL stifness matrices - call AllocAry( p%DLL_Stiffness, 6, 6, size(m%dll_data), 'DLL stiffness matrices', ErrStat2, ErrMsg2 ); if (Failed()) return; + call AllocAry( p%DLL_Stiffness, 6, 6, size(m%dll_data), 'DLL stiffness matrices', ErrStat2, ErrMsg2 ) + call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) ! Initialize the dll do i=1,size(m%dll_data) call REDWINinterface_Init( InputFileData%DLL_FileName, InputFileData%DLL_ProcName, p%DLL_Trgt, p%DLL_Model, & - m%dll_data(i), p%UseREDWINinterface, ErrStat2, ErrMsg2); if (Failed()) return; + m%dll_data(i), p%UseREDWINinterface, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) NullDispl = 0.0_R8Ki NullForce = 0.0_ReKi - call REDWINinterface_GetStiffMatrix( p%DLL_Trgt, p%DLL_Model, NullDispl, NullForce, p%DLL_StiffNess(1:6,1:6,i), m%dll_data(i), ErrStat2, ErrMsg2 ); if (Failed()) return; + call REDWINinterface_GetStiffMatrix( p%DLL_Trgt, p%DLL_Model, NullDispl, NullForce, p%DLL_StiffNess(1:6,1:6,i), m%dll_data(i), ErrStat2, ErrMsg2 ) + call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) enddo end subroutine SlD_REDWINsetup From d13a6e469958a392504685d27fa60ed439bd6203 Mon Sep 17 00:00:00 2001 From: Platt Date: Wed, 20 May 2020 17:41:15 -0600 Subject: [PATCH 098/136] SlD: bugfix -- DLL input file checking incorrect --- modules/soildyn/src/SoilDyn.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index 999ae6ec8..73a943c49 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -198,7 +198,7 @@ subroutine SlD_REDWINsetup( InputFileData,p, m, ErrStat, ErrMsg ) do i=1,size(m%dll_data) call REDWINinterface_Init( InputFileData%DLL_FileName, InputFileData%DLL_ProcName, p%DLL_Trgt, p%DLL_Model, & m%dll_data(i), p%UseREDWINinterface, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName); if (ErrStat >= AbortErrLev) return NullDispl = 0.0_R8Ki NullForce = 0.0_ReKi call REDWINinterface_GetStiffMatrix( p%DLL_Trgt, p%DLL_Model, NullDispl, NullForce, p%DLL_StiffNess(1:6,1:6,i), m%dll_data(i), ErrStat2, ErrMsg2 ) From ede2f2ab82458f4603c1e2b19c4d23b01ab45d5f Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 20 May 2020 13:44:28 -0600 Subject: [PATCH 099/136] SlD: move DLL state info to xd, cleanup of REDWIN interface --- modules/soildyn/src/REDWINinterface.f90 | 129 ++---- modules/soildyn/src/SoilDyn.f90 | 130 +++--- modules/soildyn/src/SoilDyn_Registry.txt | 10 +- modules/soildyn/src/SoilDyn_Types.f90 | 490 +++++++++++++++-------- 4 files changed, 442 insertions(+), 317 deletions(-) diff --git a/modules/soildyn/src/REDWINinterface.f90 b/modules/soildyn/src/REDWINinterface.f90 index 89aed2337..e3bd4fc68 100644 --- a/modules/soildyn/src/REDWINinterface.f90 +++ b/modules/soildyn/src/REDWINinterface.f90 @@ -19,7 +19,12 @@ !********************************************************************************************************************************** MODULE REDWINinterface -!FIXME: when done, remove the ifdef NO_LibLoad checks. +!> NOTE: The REDWIN coordinate system is not the same as the OpenFAST global coordinate frame. The Y axis +!! is flipped, and the Z axis is flipped. However, because REDWIN does not have a preferred +!! directionality (it is the same response amplitude for the negative direction time series of +!! displacements), this does not matter. So we simply ignore the fact that the coordinate frames +!! are flipped on Y and Z. + USE NWTC_Library, only: IntKi, ReKi, SiKi, DbKi, R8Ki, ProgDesc, DLL_Type, ErrMsgLen, PathIsRelative, & OS_DESC, ErrID_None, ErrID_Info, ErrID_Warn, ErrID_Fatal, AbortErrLev, PathSep, & NewLine, Num2LStr, Get_CWD, LoadDynamicLib, FreeDynamicLib, SetErrStat, DispNVD @@ -80,18 +85,6 @@ end subroutine INTERFACEFOUNDATION INTEGER(IntKi), PARAMETER :: RW_v00 = 0 ! Version number INTEGER(IntKi), PARAMETER :: RW_ver = RW_v00 ! Current version number (read from DLL file) - - ! Coordinate transforms - interface ToREDWINcoords - module procedure ToREDWINcoordsR8toR8 - module procedure ToREDWINcoordsR8toR8Mat - end interface - - interface FromREDWINcoords - module procedure FromREDWINcoordsR8toR8 - module procedure FromREDWINcoordsR8toR8Mat - end interface - CONTAINS !================================================================================================================================== !> This SUBROUTINE is used to call the REDWIN-style DLL. @@ -107,7 +100,6 @@ subroutine CallREDWINdll ( DLL_Trgt, DLL_Model, dll_data, ErrStat, ErrMsg ) PROCEDURE(REDWINdll_interface_V00),POINTER:: REDWIN_Subroutine_v00 ! The address of the procedure in the RedWin DLL -#ifndef NO_LibLoad #ifdef STATIC_DLL_LOAD ! if we're statically loading the library (i.e., OpenFOAM), we can just call INTERFACEFOUNDATION(); CALL INTERFACEFOUNDATION( PROPSFILE, LDISPFILE, & @@ -123,10 +115,6 @@ subroutine CallREDWINdll ( DLL_Trgt, DLL_Model, dll_data, ErrStat, ErrMsg ) dll_data%Props, dll_data%StVar, dll_data%StVarPrint, & dll_data%Disp, dll_data%Force, dll_data%D ) endif -#endif -#else -dll_data%Force(:)=0.0_ReKi -dll_data%Force(3)=-9.0e6_R8Ki #endif ! Call routine for error trapping the returned ErrorCodes @@ -176,9 +164,6 @@ subroutine REDWINinterface_Init( DLL_FileName, DLL_ProcName, DLL_Trgt, DLL_Model if (ErrStat >= AbortErrLev) return ! Load the DLL -#ifdef NO_LibLoad - CALL SetErrStat( ErrID_Warn,' --> Skipping LoadDynamicLib call for '//TRIM(DLL_FileName),ErrStat,ErrMsg,RoutineName ) -#else #ifdef STATIC_DLL_LOAD ! because OpenFOAM needs the MPI task to copy the library, we're not going to dynamically load it; it needs to be loaded at runtime. DLL_Trgt%FileName = '' @@ -189,18 +174,18 @@ subroutine REDWINinterface_Init( DLL_FileName, DLL_ProcName, DLL_Trgt, DLL_Model DLL_Trgt%ProcName = "" ! initialize all procedures to empty so we try to load only one DLL_Trgt%ProcName(1) = DLL_ProcName CALL LoadDynamicLib ( DLL_Trgt, ErrStat2, ErrMsg2 ); if(Failed()) return; -#endif #endif - ! Initialize DLL + ! Initialize DLL dll_data%IDtask = IDtask_init CALL CallREDWINdll(DLL_Trgt, DLL_Model, dll_data, ErrStat2, ErrMsg2); if(Failed()) return; -!FIXME: For Model 1, the Props(1,1) will indicate which runmode we are using. Test that here -!!!!!! IDEA: check the stiffness matrix returned!!!! - + ! Checks on model version + ! NOTE: there is not a good way to tell exactly which DLL model is in use. The DLL does not return + ! much info that would identify it. Ideally we would add some checks here to figure out if + ! the model number we read from the input file matches the actual DLL model. + ! For Model 1, the Props(1,1) will indicate which runmode we are using. Test that here -!TODO: can we add a check on which type of library we actually loaded and compare to the model we set???? ! Set status flag: UseREDWINinterface = .TRUE. @@ -253,10 +238,9 @@ subroutine REDWINinterface_End( DLL_Trgt, ErrStat, ErrMsg ) ErrStat = ErrID_None ErrMsg= '' -#ifndef NO_LibLoad ! Free the library (note: this doesn't do anything #ifdef STATIC_DLL_LOAD because DLL_Trgt is 0 (NULL)) CALL FreeDynamicLib( DLL_Trgt, ErrStat, ErrMsg ) -#endif + end subroutine REDWINinterface_End @@ -282,12 +266,10 @@ subroutine REDWINinterface_CalcOutput( DLL_Trgt, DLL_Model, Displacement, Force, ErrStat = ErrID_None ErrMsg= '' -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!FIXME: should this be split out into multiple, one for each model? - ! Coordinate transform to REDWIN frame - dll_data%Disp = ToREDWINcoords( Displacement ) -!FIXME: add some debugging options + ! Copy data over + dll_data%Disp = Displacement + #ifdef DEBUG_REDWIN_INTERFACE !CALL WrNumAryFileNR ( 58, m%dll_data%avrSWAP,'1x,ES15.6E2', ErrStat, ErrMsg ) !write(58,'()') @@ -298,16 +280,12 @@ subroutine REDWINinterface_CalcOutput( DLL_Trgt, DLL_Model, Displacement, Force, CALL CallREDWINdll( DLL_Trgt, DLL_Model, dll_data, ErrStat2, ErrMsg2); if(Failed()) return; ! Coordinate transform from REDWIN frame - Force = FromREDWINcoords( dll_data%Force ) - -!FIXME: check the runmode info for model 1. Not sure it applies to the other models. + Force = dll_data%Force ! Call routine for error trapping the returned ErrorCodes call CheckREDWINerrors( dll_data, DLL_Model, dll_data%SuppressWarn, ErrStat2, ErrMsg2 ); if(Failed()) return; -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - #ifdef DEBUG_REDWIN_INTERFACE !CALL WrNumAryFileNR ( 59, m%dll_data%avrSWAP,'1x,ES15.6E2', ErrStat, ErrMsg ) !write(59,'()') @@ -345,15 +323,15 @@ subroutine REDWINinterface_GetStiffMatrix( DLL_Trgt, DLL_Model, Displacement, Fo ErrMsg= '' ! Coordinate transform to REDWIN frame - dll_data%Disp = ToREDWINcoords( Displacement ) + dll_data%Disp = Displacement ! Call the REDWIN-style DLL: dll_data%IDtask = IDtask_stiff CALL CallREDWINdll( DLL_Trgt, DLL_Model, dll_data, ErrStat2, ErrMsg2); if(Failed()) return; ! Coordinate transformation - Force = FromREDWINcoords( dll_data%Force ) - StiffMatrix = FromREDWINcoords( dll_data%D ) + Force = dll_data%Force + StiffMatrix = dll_data%D #ifdef DEBUG_REDWIN_INTERFACE !CALL WrNumAryFileNR ( 59, m%dll_data%avrSWAP,'1x,ES15.6E2', ErrStat, ErrMsg ) @@ -371,6 +349,10 @@ end subroutine REDWINinterface_GetStiffMatrix !================================================================================================================================== !> Check errors from REDWIN !! Error values taken from "20150014-11-R_Rev0_3D_Foundation Model Library.pdf" +!! +!! NOTE: the DLL does not at present return any error codes. Instead when it hits an error +!! it simply aborts the whole program without returning. So this routine will never +!! actually catch any errors... :( subroutine CheckREDWINerrors( dll_data, DLL_Model, SuppressWarn, ErrStat, ErrMsg ) type(REDWINdllType), intent(in ) :: dll_data ! data type integer(IntKi), intent(in ) :: DLL_Model ! Model type of the DLL @@ -556,68 +538,5 @@ end subroutine CheckREDWINerrors -!FIXME: check if we input Radians or Degrees in the angular displacements -!> coordinate transform to REDWIN coordinates -!! -> signs flip on y,z -!! | 1 0 0 | -!! R = | 0 -1 0 | -!! | 0 0 -1 | -function ToREDWINcoordsR8toR8(InArray) result(REDWIN) - real(R8Ki), intent(in) :: InArray(6) - real(R8Ki) :: REDWIN(6) - REDWIN(1) = InArray(1) - REDWIN(2) = InArray(2) - REDWIN(3) = InArray(3) - REDWIN(4) = InArray(4) - REDWIN(5) = InArray(5) - REDWIN(6) = InArray(6) -end function ToREDWINcoordsR8toR8 - -!> \copydoc redwininterface::ToREDWINcoordsR8toR8 -function ToREDWINcoordsR8toR8Mat(InArray) result(REDWIN) - real(R8Ki), intent(in) :: InArray(6,6) - real(R8Ki) :: REDWIN(6,6) - REDWIN(:,1) = InArray(:,1) - REDWIN(:,2) = InArray(:,2) - REDWIN(:,3) = InArray(:,3) - REDWIN(:,4) = InArray(:,4) - REDWIN(:,5) = InArray(:,5) - REDWIN(:,6) = InArray(:,6) -end function ToREDWINcoordsR8toR8Mat - - - -!> coordinate transform from REDWIN coordinates -!! -> signs flip on y,z -!! | 1 0 0 | -!! R = | 0 -1 0 | -!! | 0 0 -1 | -function FromREDWINcoordsR8toR8(InArray) result(FAST) - real(R8Ki), intent(in) :: InArray(6) - real(R8Ki) :: FAST(6) - FAST(1) = InArray(1) - FAST(2) = InArray(2) - FAST(3) = InArray(3) - FAST(4) = InArray(4) - FAST(5) = InArray(5) - FAST(6) = InArray(6) -end function FromREDWINcoordsR8toR8 - -!> \copydoc redwininterface::FromREDWINcoordsR8toR8 -function FromREDWINcoordsR8toR8Mat(InArray) result(FAST) - real(R8Ki), intent(in) :: InArray(6,6) - real(R8Ki) :: FAST(6,6) - FAST(:,1) = InArray(:,1) - FAST(:,2) = InArray(:,2) - FAST(:,3) = InArray(:,3) - FAST(:,4) = InArray(:,4) - FAST(:,5) = InArray(:,5) - FAST(:,6) = InArray(:,6) -end function FromREDWINcoordsR8toR8Mat - - - - - end module REDWINinterface diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index 73a943c49..adba25628 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -119,7 +119,6 @@ subroutine SlD_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOu ! Define initial system states here: x%DummyContState = 0.0_ReKi - xd%DummyDiscState = 0.0_ReKi z%DummyConstrState = 0.0_ReKi OtherState%DummyOtherState = 0.0_ReKi @@ -141,7 +140,7 @@ subroutine SlD_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOu end if ! Set miscvars: including dll_data arrays and checking for input files. - call SlD_InitMisc( InputFileData, m, ErrStat2,ErrMsg2); if (Failed()) return; + call SlD_InitStatesMisc( InputFileData, m, xd, ErrStat2,ErrMsg2); if (Failed()) return; call SlD_InitMeshes( InputFileData, InitInp, u, y, p, m, ErrStat2,ErrMsg2); if (Failed()) return; @@ -152,7 +151,7 @@ subroutine SlD_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOu case (Calc_StiffDamp) case (Calc_PYcurve) case (Calc_REDWIN) - call SlD_REDWINsetup( InputFileData,p, m, ErrStat, ErrMsg ) + call SlD_REDWINsetup( InputFileData,p, m, xd, ErrStat, ErrMsg ) end select ! set paramaters for I/O data @@ -175,17 +174,18 @@ logical function Failed() Failed = ErrStat >= AbortErrLev end function Failed - subroutine SlD_REDWINsetup( InputFileData,p, m, ErrStat, ErrMsg ) - type(SlD_InputFile), intent(in ) :: InputFileData !< Data stored in the module's input file - type(SlD_ParameterType),intent(inout) :: p !< Parameters - type(SlD_MiscVarType), intent(inout) :: m !< Misc variables for optimization (not copied in glue code) - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - integer(IntKi) :: i ! Generic counter - integer(IntKi) :: ErrStat2 !< local error status - character(ErrMsgLen) :: ErrMsg2 !< local error message - real(R8Ki) :: NullDispl(6) !< ignored - real(R8Ki) :: NullForce(6) !< ignored + subroutine SlD_REDWINsetup( InputFileData,p, m, xd, ErrStat, ErrMsg ) + type(SlD_InputFile), intent(in ) :: InputFileData !< Data stored in the module's input file + type(SlD_ParameterType), intent(inout) :: p !< Parameters + type(SlD_MiscVarType), intent(inout) :: m !< Misc variables for optimization (not copied in glue code) + type(SlD_DiscreteStateType), intent(inout) :: xd !< Initial discrete states + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(IntKi) :: i ! Generic counter + integer(IntKi) :: ErrStat2 !< local error status + character(ErrMsgLen) :: ErrMsg2 !< local error message + real(R8Ki) :: NullDispl(6) !< ignored + real(R8Ki) :: NullForce(6) !< ignored ErrStat = ErrID_None ErrMsg = "" @@ -203,29 +203,47 @@ subroutine SlD_REDWINsetup( InputFileData,p, m, ErrStat, ErrMsg ) NullForce = 0.0_ReKi call REDWINinterface_GetStiffMatrix( p%DLL_Trgt, p%DLL_Model, NullDispl, NullForce, p%DLL_StiffNess(1:6,1:6,i), m%dll_data(i), ErrStat2, ErrMsg2 ) call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + + ! now initialize the states info from the miscvar + xd%dll_states(i)%Props = m%dll_data(i)%Props + xd%dll_states(i)%StVar = m%dll_data(i)%StVar + xd%dll_states(i)%StVarPrint = m%dll_data(i)%StVarPrint enddo end subroutine SlD_REDWINsetup !> Allocate arrays for storing the DLL input file names, and check that they exist. The DLL has no error checking (as of 2020.02.10) !! and will create empty input files before segfaulting. - subroutine SlD_InitMisc( InputFileData, m, ErrStat, ErrMsg ) - type(SlD_InputFile), intent(in ) :: InputFileData !< Data stored in the module's input file - type(SlD_MiscVarType), intent(inout) :: m !< Misc variables for optimization (not copied in glue code) - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - integer(IntKi) :: i ! Generic counter - integer(IntKi) :: ErrStat2 !< local error status - character(ErrMsgLen) :: ErrMsg2 !< local error message - logical :: FileExist - character(1024) :: PropsLoc !< Full path to PropsFile location - character(1024) :: LDispLoc !< Full path to LDispFile location + subroutine SlD_InitStatesMisc( InputFileData, m, xd, ErrStat, ErrMsg ) + type(SlD_InputFile), intent(in ) :: InputFileData !< Data stored in the module's input file + type(SlD_MiscVarType), intent(inout) :: m !< Misc variables for optimization (not copied in glue code) + type(SlD_DiscreteStateType), intent( out) :: xd !< Initial discrete states + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(IntKi) :: i ! Generic counter + integer(IntKi) :: ErrStat2 !< local error status + character(ErrMsgLen) :: ErrMsg2 !< local error message + logical :: FileExist + character(1024) :: PropsLoc !< Full path to PropsFile location + character(1024) :: LDispLoc !< Full path to LDispFile location ErrStat = ErrID_None ErrMsg = '' select case(p%CalcOption) case (Calc_StiffDamp) + allocate( xd%dll_states(1), STAT=ErrStat2 ) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Could not allocate xd%dll_states', ErrStat, ErrMsg, RoutineName) + return + endif + case (Calc_PYcurve) + allocate( xd%dll_states(1), STAT=ErrStat2 ) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Could not allocate xd%dll_states', ErrStat, ErrMsg, RoutineName) + return + endif + case (Calc_REDWIN) !------------------- ! Set DLL data @@ -235,9 +253,9 @@ subroutine SlD_InitMisc( InputFileData, m, ErrStat, ErrMsg ) return endif - allocate( m%dll_dataPREV(InputFileData%DLL_NumPoints), STAT=ErrStat2 ) + allocate( xd%dll_states(InputFileData%DLL_NumPoints), STAT=ErrStat2 ) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Could not allocate m%dll_data', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Could not allocate xd%dll_states', ErrStat, ErrMsg, RoutineName) return endif @@ -255,11 +273,9 @@ subroutine SlD_InitMisc( InputFileData, m, ErrStat, ErrMsg ) endif enddo - m%dll_dataPrev = m%dll_data - m%PrevTime = -1.0_DbKi end select if (ErrStat >= AbortErrLev) return - end subroutine SlD_InitMisc + end subroutine SlD_InitStatesMisc subroutine SlD_InitMeshes( InputFileData, InitInp, u, y, p, m, ErrStat, ErrMsg ) type(SlD_InputFile), intent(in ) :: InputFileData !< Data stored in the module's input file @@ -283,22 +299,26 @@ subroutine SlD_InitMeshes( InputFileData, InitInp, u, y, p, m, ErrStat, ErrMsg ) p%NumPoints = 1_IntKi !FIXME: update to allow more than one set of points ! NumPoints = InputFileData%StiffDamp_NumPoints - call AllocAry(MeshLocations,3,1,'Mesh locations',ErrStat2,ErrMsg2); + call AllocAry(MeshLocations,3,1,'Mesh locations',ErrStat,ErrMsg); do i=1,size(MeshLocations,2) MeshLocations(1:3,i) = InputFileData%SD_locations(1:3) enddo case (Calc_PYcurve) p%NumPoints = InputFileData%PY_NumPoints - call AllocAry(MeshLocations,3,p%NumPoints,'Mesh locations',ErrStat2,ErrMsg2); + call AllocAry(MeshLocations,3,p%NumPoints,'Mesh locations',ErrStat,ErrMsg); do i=1,size(MeshLocations,2) MeshLocations(1:3,i) = InputFileData%PY_locations(1:3,i) enddo case (Calc_REDWIN) p%NumPoints = InputFileData%DLL_NumPoints - call AllocAry(MeshLocations,3,p%NumPoints,'Mesh locations',ErrStat2,ErrMsg2); + call AllocAry(MeshLocations,3,p%NumPoints,'Mesh locations',ErrStat,ErrMsg); do i=1,size(MeshLocations,2) MeshLocations(1:3,i) = InputFileData%DLL_locations(1:3,i) enddo + case default + ErrStat = ErrID_Fatal + ErrMsg = ' Programming error. Unknown calculation type '//trim(Num2LStr(p%CalcOption))//' detected.' + return end select !................................. @@ -363,7 +383,6 @@ subroutine SlD_InitMeshes( InputFileData, InitInp, u, y, p, m, ErrStat, ErrMsg ) if (ErrStat>=AbortErrLev) RETURN - end subroutine SlD_InitMeshes end subroutine SlD_Init @@ -444,13 +463,30 @@ subroutine SlD_UpdateStates( t, n, Inputs, InputTimes, p, x, xd, z, OtherState, integer(IntKi), intent( out) :: ErrStat !< Error status of the operation character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + integer(IntKi) :: i !< Generic counter + ! Initialize variables ErrStat = ErrID_None ! no error has occurred ErrMsg = "" x%DummyContState = 0.0_ReKi - xd%DummyDiscState = 0.0_ReKi z%DummyConstrState = 0.0_ReKi + + ! The DLL states are copied over from misc var (ideally the DLL would have an update states + ! routine, but it doesn't so we have to work around that to satisfy the framework requirements) + if (p%CalcOption == Calc_REDWIN) then + do i=1,size(xd%dll_states) + xd%dll_states(i)%Props = m%dll_data(i)%Props + xd%dll_states(i)%StVar = m%dll_data(i)%StVar + xd%dll_states(i)%StVarPrint = m%dll_data(i)%StVarPrint + enddo + else + do i=1,size(xd%dll_states) + xd%dll_states(i)%Props = 0.0_R8Ki + xd%dll_states(i)%StVar = 0.0_R8Ki + xd%dll_states(i)%StVarPrint = 0.0_IntKi + enddo + endif end subroutine SlD_UpdateStates @@ -480,19 +516,11 @@ subroutine SlD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg real(R8Ki) :: Displacement(6) real(R8Ki) :: Force(6) integer(IntKi) :: i !< generic counter - logical :: TimeStepRecalc ! Initialize ErrStat ErrStat = ErrID_None ErrMsg = "" - ! Are we recalculating a previous timestep (like correction step?) - if (T > m%PrevTime) then - TimeStepRecalc = .FALSE. - else - TimeStepRecalc = .TRUE. - endif - select case(p%CalcOption) case (Calc_StiffDamp) @@ -512,25 +540,23 @@ subroutine SlD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg y%SoilMesh%Moment(3,1) = -real(Force(6),ReKi) case (Calc_PYcurve) + call SetErrStat(ErrID_Fatal,' SoilDyn does not support P-Y curve calculations yet.',ErrStat,ErrMsg,RoutineName) + case (Calc_REDWIN) ! call the dll do i=1,size(m%dll_data) - ! reset old states if recalc - if (TimeStepRecalc) then - m%dll_data(i) = m%dll_dataPREV(i) - endif + ! copy the state info over to miscvar for passing to dll (we are separating states out to better match the framework) + m%dll_data(i)%Props = xd%dll_states(i)%Props + m%dll_data(i)%StVar = xd%dll_states(i)%StVar + m%dll_data(i)%StVarPrint = xd%dll_states(i)%StVarPrint + ! Copy displacement from point mesh (angles in radians -- REDWIN dll also uses rad) Displacement(1:3) = u%SoilMesh%TranslationDisp(1:3,i) ! Translations -- This is R8Ki in the mesh Displacement(4:6) = GetSmllRotAngs(u%SoilMesh%Orientation(1:3,1:3,i), ErrStat2, ErrMsg2); if (Failed()) return; ! Small angle assumption should be valid here -- Note we are assuming reforientation is identity call REDWINinterface_CalcOutput( p%DLL_Trgt, p%DLL_Model, Displacement, Force, m%dll_data(i), ErrStat2, ErrMsg2 ); if (Failed()) return; - ! store new states if not recalc - if (.not. TimeStepRecalc) then - m%dll_dataPREV(i) = m%dll_data(i) - endif - ! Return reaction force onto the resulting point mesh y%SoilMesh%Force (1:3,i) = -real(Force(1:3),ReKi) y%SoilMesh%Moment(1:3,i) = -real(Force(4:6),ReKi) diff --git a/modules/soildyn/src/SoilDyn_Registry.txt b/modules/soildyn/src/SoilDyn_Registry.txt index 97236d101..7147c1fa3 100644 --- a/modules/soildyn/src/SoilDyn_Registry.txt +++ b/modules/soildyn/src/SoilDyn_Registry.txt @@ -37,6 +37,12 @@ typedef ^ REDWINdllType R8Ki D {6}{6} typedef ^ REDWINdllType LOGICAL SuppressWarn - .FALSE. - "Supress further warnings." - typedef ^ REDWINdllType IntKi RunMode - 0 - "RunMode of DLL (read from Props(1,1) in Model 1 during initialization" - + +typedef SoilDyn/SlD REDWINdllStates R8Ki Props {100}{200} - - "Array containing foundation model properties (used internally by the REDWIN models). Specific to each model." - +typedef ^ REDWINdllStates R8Ki StVar {12}{100} - - "Array containing the state variables at the end of the step (used internally by the REDWIN models). Specific to each model." - +typedef ^ REDWINdllStates IntKi StVarPrint {12}{100} - - "Array indicating which state variables should be printed to the screen. This feature is currently not supported." - + + # SoilDyn input file typedef ^ SlD_InputFile LOGICAL EchoFlag - - - "Echo the input file" - typedef ^ SlD_InputFile CHARACTER(ChanLen) OutList : - - "List of user-requested output channels" - @@ -94,7 +100,7 @@ typedef ^ InitOutputType ProgDesc Ver - typedef ^ ContinuousStateType ReKi DummyContState - - - "Remove this variable if you have continuous states" - # Define discrete (nondifferentiable) states here: -typedef ^ DiscreteStateType ReKi DummyDiscState - - - "Remove this variable if you have discrete states" - +typedef ^ DiscreteStateType REDWINdllStates dll_states : - - "state data used for REDWIN DLL (we think)" - # Define constraint states here: typedef ^ ConstraintStateType ReKi DummyConstrState - - - "Remove this variable if you have constraint states" - @@ -107,8 +113,6 @@ typedef ^ OtherStateType IntKi DummyOtherState - - - "Re # Define any data that are used only for efficiency purposes (these variables are not associated with time): # e.g. indices for searching in an array, large arrays that are local variables in any routine called multiple times, etc. typedef ^ MiscVarType REDWINdllType dll_data : - - "data used for REDWIN DLL" - -typedef ^ MiscVarType REDWINdllType dll_dataPREV : - - "data used for REDWIN DLL -- previous call" - -typedef ^ MiscVarType DbKi PrevTime - - - "previous call time" - # ..... Parameters ................................................................................................................ diff --git a/modules/soildyn/src/SoilDyn_Types.f90 b/modules/soildyn/src/SoilDyn_Types.f90 index 37ef635ae..7e5c9264f 100644 --- a/modules/soildyn/src/SoilDyn_Types.f90 +++ b/modules/soildyn/src/SoilDyn_Types.f90 @@ -53,6 +53,13 @@ MODULE SoilDyn_Types INTEGER(IntKi) :: RunMode = 0 !< RunMode of DLL (read from Props(1,1) in Model 1 during initialization [-] END TYPE REDWINdllType ! ======================= +! ========= REDWINdllStates ======= + TYPE, PUBLIC :: REDWINdllStates + REAL(R8Ki) , DIMENSION(1:100,1:200) :: Props !< Array containing foundation model properties (used internally by the REDWIN models). Specific to each model. [-] + REAL(R8Ki) , DIMENSION(1:12,1:100) :: StVar !< Array containing the state variables at the end of the step (used internally by the REDWIN models). Specific to each model. [-] + INTEGER(IntKi) , DIMENSION(1:12,1:100) :: StVarPrint !< Array indicating which state variables should be printed to the screen. This feature is currently not supported. [-] + END TYPE REDWINdllStates +! ======================= ! ========= SlD_InputFile ======= TYPE, PUBLIC :: SlD_InputFile LOGICAL :: EchoFlag !< Echo the input file [-] @@ -101,7 +108,7 @@ MODULE SoilDyn_Types ! ======================= ! ========= SlD_DiscreteStateType ======= TYPE, PUBLIC :: SlD_DiscreteStateType - REAL(ReKi) :: DummyDiscState !< Remove this variable if you have discrete states [-] + TYPE(REDWINdllStates) , DIMENSION(:), ALLOCATABLE :: dll_states !< state data used for REDWIN DLL (we think) [-] END TYPE SlD_DiscreteStateType ! ======================= ! ========= SlD_ConstraintStateType ======= @@ -117,8 +124,6 @@ MODULE SoilDyn_Types ! ========= SlD_MiscVarType ======= TYPE, PUBLIC :: SlD_MiscVarType TYPE(REDWINdllType) , DIMENSION(:), ALLOCATABLE :: dll_data !< data used for REDWIN DLL [-] - TYPE(REDWINdllType) , DIMENSION(:), ALLOCATABLE :: dll_dataPREV !< data used for REDWIN DLL -- previous call [-] - REAL(DbKi) :: PrevTime !< previous call time [-] END TYPE SlD_MiscVarType ! ======================= ! ========= SlD_ParameterType ======= @@ -444,6 +449,186 @@ SUBROUTINE SlD_UnPackREDWINdllType( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat Int_Xferred = Int_Xferred + 1 END SUBROUTINE SlD_UnPackREDWINdllType + SUBROUTINE SlD_CopyREDWINdllStates( SrcREDWINdllStatesData, DstREDWINdllStatesData, CtrlCode, ErrStat, ErrMsg ) + TYPE(REDWINdllStates), INTENT(IN) :: SrcREDWINdllStatesData + TYPE(REDWINdllStates), INTENT(INOUT) :: DstREDWINdllStatesData + 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) :: i2, i2_l, i2_u ! bounds (upper/lower) for an array dimension 2 + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_CopyREDWINdllStates' +! + ErrStat = ErrID_None + ErrMsg = "" + DstREDWINdllStatesData%Props = SrcREDWINdllStatesData%Props + DstREDWINdllStatesData%StVar = SrcREDWINdllStatesData%StVar + DstREDWINdllStatesData%StVarPrint = SrcREDWINdllStatesData%StVarPrint + END SUBROUTINE SlD_CopyREDWINdllStates + + SUBROUTINE SlD_DestroyREDWINdllStates( REDWINdllStatesData, ErrStat, ErrMsg ) + TYPE(REDWINdllStates), INTENT(INOUT) :: REDWINdllStatesData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_DestroyREDWINdllStates' + INTEGER(IntKi) :: i, i1, i2, i3, i4, i5 +! + ErrStat = ErrID_None + ErrMsg = "" + END SUBROUTINE SlD_DestroyREDWINdllStates + + SUBROUTINE SlD_PackREDWINdllStates( 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(REDWINdllStates), 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 = 'SlD_PackREDWINdllStates' + ! 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 + Db_BufSz = Db_BufSz + SIZE(InData%Props) ! Props + Db_BufSz = Db_BufSz + SIZE(InData%StVar) ! StVar + Int_BufSz = Int_BufSz + SIZE(InData%StVarPrint) ! StVarPrint + 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) + + Re_Xferred = 1 + Db_Xferred = 1 + Int_Xferred = 1 + + DbKiBuf ( Db_Xferred:Db_Xferred+(SIZE(InData%Props))-1 ) = PACK(InData%Props,.TRUE.) + Db_Xferred = Db_Xferred + SIZE(InData%Props) + DbKiBuf ( Db_Xferred:Db_Xferred+(SIZE(InData%StVar))-1 ) = PACK(InData%StVar,.TRUE.) + Db_Xferred = Db_Xferred + SIZE(InData%StVar) + IntKiBuf ( Int_Xferred:Int_Xferred+(SIZE(InData%StVarPrint))-1 ) = PACK(InData%StVarPrint,.TRUE.) + Int_Xferred = Int_Xferred + SIZE(InData%StVarPrint) + END SUBROUTINE SlD_PackREDWINdllStates + + SUBROUTINE SlD_UnPackREDWINdllStates( 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(REDWINdllStates), 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 + LOGICAL :: mask0 + LOGICAL, ALLOCATABLE :: mask1(:) + LOGICAL, ALLOCATABLE :: mask2(:,:) + LOGICAL, ALLOCATABLE :: mask3(:,:,:) + LOGICAL, ALLOCATABLE :: mask4(:,:,:,:) + LOGICAL, ALLOCATABLE :: mask5(:,:,:,:,:) + INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 + INTEGER(IntKi) :: i2, i2_l, i2_u ! bounds (upper/lower) for an array dimension 2 + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_UnPackREDWINdllStates' + ! 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 + i1_l = LBOUND(OutData%Props,1) + i1_u = UBOUND(OutData%Props,1) + i2_l = LBOUND(OutData%Props,2) + i2_u = UBOUND(OutData%Props,2) + ALLOCATE(mask2(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating mask2.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + mask2 = .TRUE. + OutData%Props = REAL( UNPACK(DbKiBuf( Db_Xferred:Db_Xferred+(SIZE(OutData%Props))-1 ), mask2, 0.0_DbKi ), R8Ki) + Db_Xferred = Db_Xferred + SIZE(OutData%Props) + DEALLOCATE(mask2) + i1_l = LBOUND(OutData%StVar,1) + i1_u = UBOUND(OutData%StVar,1) + i2_l = LBOUND(OutData%StVar,2) + i2_u = UBOUND(OutData%StVar,2) + ALLOCATE(mask2(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating mask2.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + mask2 = .TRUE. + OutData%StVar = REAL( UNPACK(DbKiBuf( Db_Xferred:Db_Xferred+(SIZE(OutData%StVar))-1 ), mask2, 0.0_DbKi ), R8Ki) + Db_Xferred = Db_Xferred + SIZE(OutData%StVar) + DEALLOCATE(mask2) + i1_l = LBOUND(OutData%StVarPrint,1) + i1_u = UBOUND(OutData%StVarPrint,1) + i2_l = LBOUND(OutData%StVarPrint,2) + i2_u = UBOUND(OutData%StVarPrint,2) + ALLOCATE(mask2(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating mask2.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + mask2 = .TRUE. + OutData%StVarPrint = UNPACK( IntKiBuf ( Int_Xferred:Int_Xferred+(SIZE(OutData%StVarPrint))-1 ), mask2, 0_IntKi ) + Int_Xferred = Int_Xferred + SIZE(OutData%StVarPrint) + DEALLOCATE(mask2) + END SUBROUTINE SlD_UnPackREDWINdllStates + SUBROUTINE SlD_CopyInputFile( SrcInputFileData, DstInputFileData, CtrlCode, ErrStat, ErrMsg ) TYPE(SlD_InputFile), INTENT(IN) :: SrcInputFileData TYPE(SlD_InputFile), INTENT(INOUT) :: DstInputFileData @@ -1737,13 +1922,29 @@ SUBROUTINE SlD_CopyDiscState( SrcDiscStateData, DstDiscStateData, CtrlCode, ErrS 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 = 'SlD_CopyDiscState' ! ErrStat = ErrID_None ErrMsg = "" - DstDiscStateData%DummyDiscState = SrcDiscStateData%DummyDiscState +IF (ALLOCATED(SrcDiscStateData%dll_states)) THEN + i1_l = LBOUND(SrcDiscStateData%dll_states,1) + i1_u = UBOUND(SrcDiscStateData%dll_states,1) + IF (.NOT. ALLOCATED(DstDiscStateData%dll_states)) THEN + ALLOCATE(DstDiscStateData%dll_states(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstDiscStateData%dll_states.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DO i1 = LBOUND(SrcDiscStateData%dll_states,1), UBOUND(SrcDiscStateData%dll_states,1) + CALL SlD_Copyredwindllstates( SrcDiscStateData%dll_states(i1), DstDiscStateData%dll_states(i1), CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ErrStat>=AbortErrLev) RETURN + ENDDO +ENDIF END SUBROUTINE SlD_CopyDiscState SUBROUTINE SlD_DestroyDiscState( DiscStateData, ErrStat, ErrMsg ) @@ -1755,6 +1956,12 @@ SUBROUTINE SlD_DestroyDiscState( DiscStateData, ErrStat, ErrMsg ) ! ErrStat = ErrID_None ErrMsg = "" +IF (ALLOCATED(DiscStateData%dll_states)) THEN +DO i1 = LBOUND(DiscStateData%dll_states,1), UBOUND(DiscStateData%dll_states,1) + CALL SlD_Destroyredwindllstates( DiscStateData%dll_states(i1), ErrStat, ErrMsg ) +ENDDO + DEALLOCATE(DiscStateData%dll_states) +ENDIF END SUBROUTINE SlD_DestroyDiscState SUBROUTINE SlD_PackDiscState( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) @@ -1792,7 +1999,30 @@ SUBROUTINE SlD_PackDiscState( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs Re_BufSz = 0 Db_BufSz = 0 Int_BufSz = 0 - Re_BufSz = Re_BufSz + 1 ! DummyDiscState + Int_BufSz = Int_BufSz + 1 ! dll_states allocated yes/no + IF ( ALLOCATED(InData%dll_states) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! dll_states upper/lower bounds for each dimension + ! Allocate buffers for subtypes, if any (we'll get sizes from these) + DO i1 = LBOUND(InData%dll_states,1), UBOUND(InData%dll_states,1) + Int_BufSz = Int_BufSz + 3 ! dll_states: size of buffers for each call to pack subtype + CALL SlD_Packredwindllstates( Re_Buf, Db_Buf, Int_Buf, InData%dll_states(i1), ErrStat2, ErrMsg2, .TRUE. ) ! dll_states + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! dll_states + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! dll_states + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! dll_states + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF + END DO + END IF IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) THEN @@ -1820,8 +2050,47 @@ SUBROUTINE SlD_PackDiscState( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs Db_Xferred = 1 Int_Xferred = 1 - ReKiBuf ( Re_Xferred:Re_Xferred+(1)-1 ) = InData%DummyDiscState - Re_Xferred = Re_Xferred + 1 + IF ( .NOT. ALLOCATED(InData%dll_states) ) 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%dll_states,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%dll_states,1) + Int_Xferred = Int_Xferred + 2 + + DO i1 = LBOUND(InData%dll_states,1), UBOUND(InData%dll_states,1) + CALL SlD_Packredwindllstates( Re_Buf, Db_Buf, Int_Buf, InData%dll_states(i1), ErrStat2, ErrMsg2, OnlySize ) ! dll_states + 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 + END DO + END IF END SUBROUTINE SlD_PackDiscState SUBROUTINE SlD_UnPackDiscState( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) @@ -1843,6 +2112,7 @@ SUBROUTINE SlD_UnPackDiscState( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er LOGICAL, ALLOCATABLE :: mask3(:,:,:) LOGICAL, ALLOCATABLE :: mask4(:,:,:,:) LOGICAL, ALLOCATABLE :: mask5(:,:,:,:,:) + INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'SlD_UnPackDiscState' @@ -1856,8 +2126,62 @@ SUBROUTINE SlD_UnPackDiscState( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er Re_Xferred = 1 Db_Xferred = 1 Int_Xferred = 1 - OutData%DummyDiscState = ReKiBuf( Re_Xferred ) - Re_Xferred = Re_Xferred + 1 + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! dll_states 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 (ALLOCATED(OutData%dll_states)) DEALLOCATE(OutData%dll_states) + ALLOCATE(OutData%dll_states(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%dll_states.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + DO i1 = LBOUND(OutData%dll_states,1), UBOUND(OutData%dll_states,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 SlD_Unpackredwindllstates( Re_Buf, Db_Buf, Int_Buf, OutData%dll_states(i1), ErrStat2, ErrMsg2 ) ! dll_states + 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) + END DO + END IF END SUBROUTINE SlD_UnPackDiscState SUBROUTINE SlD_CopyConstrState( SrcConstrStateData, DstConstrStateData, CtrlCode, ErrStat, ErrMsg ) @@ -2153,23 +2477,6 @@ SUBROUTINE SlD_CopyMisc( SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg ) IF (ErrStat>=AbortErrLev) RETURN ENDDO ENDIF -IF (ALLOCATED(SrcMiscData%dll_dataPREV)) THEN - i1_l = LBOUND(SrcMiscData%dll_dataPREV,1) - i1_u = UBOUND(SrcMiscData%dll_dataPREV,1) - IF (.NOT. ALLOCATED(DstMiscData%dll_dataPREV)) THEN - ALLOCATE(DstMiscData%dll_dataPREV(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%dll_dataPREV.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - END IF - DO i1 = LBOUND(SrcMiscData%dll_dataPREV,1), UBOUND(SrcMiscData%dll_dataPREV,1) - CALL SlD_Copyredwindlltype( SrcMiscData%dll_dataPREV(i1), DstMiscData%dll_dataPREV(i1), CtrlCode, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) - IF (ErrStat>=AbortErrLev) RETURN - ENDDO -ENDIF - DstMiscData%PrevTime = SrcMiscData%PrevTime END SUBROUTINE SlD_CopyMisc SUBROUTINE SlD_DestroyMisc( MiscData, ErrStat, ErrMsg ) @@ -2186,12 +2493,6 @@ SUBROUTINE SlD_DestroyMisc( MiscData, ErrStat, ErrMsg ) CALL SlD_Destroyredwindlltype( MiscData%dll_data(i1), ErrStat, ErrMsg ) ENDDO DEALLOCATE(MiscData%dll_data) -ENDIF -IF (ALLOCATED(MiscData%dll_dataPREV)) THEN -DO i1 = LBOUND(MiscData%dll_dataPREV,1), UBOUND(MiscData%dll_dataPREV,1) - CALL SlD_Destroyredwindlltype( MiscData%dll_dataPREV(i1), ErrStat, ErrMsg ) -ENDDO - DEALLOCATE(MiscData%dll_dataPREV) ENDIF END SUBROUTINE SlD_DestroyMisc @@ -2254,30 +2555,6 @@ SUBROUTINE SlD_PackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, Si END IF END DO END IF - Int_BufSz = Int_BufSz + 1 ! dll_dataPREV allocated yes/no - IF ( ALLOCATED(InData%dll_dataPREV) ) THEN - Int_BufSz = Int_BufSz + 2*1 ! dll_dataPREV upper/lower bounds for each dimension - DO i1 = LBOUND(InData%dll_dataPREV,1), UBOUND(InData%dll_dataPREV,1) - Int_BufSz = Int_BufSz + 3 ! dll_dataPREV: size of buffers for each call to pack subtype - CALL SlD_Packredwindlltype( Re_Buf, Db_Buf, Int_Buf, InData%dll_dataPREV(i1), ErrStat2, ErrMsg2, .TRUE. ) ! dll_dataPREV - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - IF (ErrStat >= AbortErrLev) RETURN - - IF(ALLOCATED(Re_Buf)) THEN ! dll_dataPREV - Re_BufSz = Re_BufSz + SIZE( Re_Buf ) - DEALLOCATE(Re_Buf) - END IF - IF(ALLOCATED(Db_Buf)) THEN ! dll_dataPREV - Db_BufSz = Db_BufSz + SIZE( Db_Buf ) - DEALLOCATE(Db_Buf) - END IF - IF(ALLOCATED(Int_Buf)) THEN ! dll_dataPREV - Int_BufSz = Int_BufSz + SIZE( Int_Buf ) - DEALLOCATE(Int_Buf) - END IF - END DO - END IF - Db_BufSz = Db_BufSz + 1 ! PrevTime IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) THEN @@ -2346,49 +2623,6 @@ SUBROUTINE SlD_PackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, Si ENDIF END DO END IF - IF ( .NOT. ALLOCATED(InData%dll_dataPREV) ) 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%dll_dataPREV,1) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%dll_dataPREV,1) - Int_Xferred = Int_Xferred + 2 - - DO i1 = LBOUND(InData%dll_dataPREV,1), UBOUND(InData%dll_dataPREV,1) - CALL SlD_Packredwindlltype( Re_Buf, Db_Buf, Int_Buf, InData%dll_dataPREV(i1), ErrStat2, ErrMsg2, OnlySize ) ! dll_dataPREV - 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 - END DO - END IF - DbKiBuf ( Db_Xferred:Db_Xferred+(1)-1 ) = InData%PrevTime - Db_Xferred = Db_Xferred + 1 END SUBROUTINE SlD_PackMisc SUBROUTINE SlD_UnPackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) @@ -2480,64 +2714,6 @@ SUBROUTINE SlD_UnPackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg IF(ALLOCATED(Int_Buf)) DEALLOCATE(Int_Buf) END DO END IF - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! dll_dataPREV 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 (ALLOCATED(OutData%dll_dataPREV)) DEALLOCATE(OutData%dll_dataPREV) - ALLOCATE(OutData%dll_dataPREV(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%dll_dataPREV.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - DO i1 = LBOUND(OutData%dll_dataPREV,1), UBOUND(OutData%dll_dataPREV,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 SlD_Unpackredwindlltype( Re_Buf, Db_Buf, Int_Buf, OutData%dll_dataPREV(i1), ErrStat2, ErrMsg2 ) ! dll_dataPREV - 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) - END DO - END IF - OutData%PrevTime = DbKiBuf( Db_Xferred ) - Db_Xferred = Db_Xferred + 1 END SUBROUTINE SlD_UnPackMisc SUBROUTINE SlD_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg ) From 09858887d6918c4047005f3796c70f54d2f5d837 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 27 May 2020 13:11:47 -0600 Subject: [PATCH 100/136] SlD: attempt to fix fortlll crash at end without SlD. Also fix the SlD driver code that wasn't compiling after the update to the version info hanlding. --- modules/openfast-library/src/FAST_Subs.f90 | 4 ++-- modules/soildyn/src/SoilDyn.f90 | 2 ++ modules/soildyn/src/SoilDyn_Registry.txt | 2 +- modules/soildyn/src/SoilDyn_Types.f90 | 2 +- modules/soildyn/src/driver/SoilDyn_Driver.f90 | 2 +- 5 files changed, 7 insertions(+), 5 deletions(-) diff --git a/modules/openfast-library/src/FAST_Subs.f90 b/modules/openfast-library/src/FAST_Subs.f90 index d3fa65911..6a663fbfa 100644 --- a/modules/openfast-library/src/FAST_Subs.f90 +++ b/modules/openfast-library/src/FAST_Subs.f90 @@ -1562,7 +1562,7 @@ SUBROUTINE FAST_Init( p, y_FAST, t_initial, InputFile, ErrStat, ErrMsg, TMax, Tu y_FAST%Module_Abrev( Module_Orca ) = 'Orca' y_FAST%Module_Abrev( Module_IceF ) = 'IceF' y_FAST%Module_Abrev( Module_IceD ) = 'IceD' - y_FAST%Module_Abrev( Module_SD ) = 'SlD' + y_FAST%Module_Abrev( Module_SlD ) = 'SlD' p%n_substeps = 1 ! number of substeps for between modules and global/FAST time p%BD_OutputSibling = .false. @@ -6409,7 +6409,7 @@ SUBROUTINE FAST_DestroyAll( p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD14, AD, IfW, CALL FAST_DestroyIceDyn_Data( IceD, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - ! SubDyn + ! SoilDyn CALL FAST_DestroySoilDyn_Data( SlD, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index adba25628..95b89e8dd 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -117,6 +117,8 @@ subroutine SlD_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOu p%Stiffness = InputFileData%Stiffness ! p%Damping = InputFileData%Damping + p%UseREDWINinterface = .FALSE. ! Initially set to false in case DLL not used. + ! Define initial system states here: x%DummyContState = 0.0_ReKi z%DummyConstrState = 0.0_ReKi diff --git a/modules/soildyn/src/SoilDyn_Registry.txt b/modules/soildyn/src/SoilDyn_Registry.txt index 7147c1fa3..5d11f5fbe 100644 --- a/modules/soildyn/src/SoilDyn_Registry.txt +++ b/modules/soildyn/src/SoilDyn_Registry.txt @@ -122,7 +122,7 @@ typedef ^ ParameterType DbKi DT typedef ^ ParameterType DLL_Type DLL_Trgt - - - "The addresses and names of the Bladed DLL and its procedure" - typedef ^ ParameterType DbKi DLL_DT - - - "Time step for DLL" seconds typedef ^ ParameterType CHARACTER(1024) RootName - - - "RootName for writing output files" - -typedef ^ ParameterType LOGICAL UseREDWINinterface - - - "True if interface successfully initialized" - +typedef ^ ParameterType LOGICAL UseREDWINinterface - .FALSE. - "True if interface successfully initialized" - typedef ^ ParameterType CHARACTER(1024) RootFileName - - - "Root file name" - typedef ^ ParameterType CHARACTER(1024) EchoFileName - - - "Name of echo file" - typedef ^ ParameterType CHARACTER(1024) SumFileName - - - "Name of summary file" - diff --git a/modules/soildyn/src/SoilDyn_Types.f90 b/modules/soildyn/src/SoilDyn_Types.f90 index 7e5c9264f..7142616df 100644 --- a/modules/soildyn/src/SoilDyn_Types.f90 +++ b/modules/soildyn/src/SoilDyn_Types.f90 @@ -132,7 +132,7 @@ MODULE SoilDyn_Types TYPE(DLL_Type) :: DLL_Trgt !< The addresses and names of the Bladed DLL and its procedure [-] REAL(DbKi) :: DLL_DT !< Time step for DLL [seconds] CHARACTER(1024) :: RootName !< RootName for writing output files [-] - LOGICAL :: UseREDWINinterface !< True if interface successfully initialized [-] + LOGICAL :: UseREDWINinterface = .FALSE. !< True if interface successfully initialized [-] CHARACTER(1024) :: RootFileName !< Root file name [-] CHARACTER(1024) :: EchoFileName !< Name of echo file [-] CHARACTER(1024) :: SumFileName !< Name of summary file [-] diff --git a/modules/soildyn/src/driver/SoilDyn_Driver.f90 b/modules/soildyn/src/driver/SoilDyn_Driver.f90 index 8bc7048c2..a4c01926c 100644 --- a/modules/soildyn/src/driver/SoilDyn_Driver.f90 +++ b/modules/soildyn/src/driver/SoilDyn_Driver.f90 @@ -94,7 +94,7 @@ PROGRAM SoilDyn_Driver DvrOut=-1 ! Set output unit to negative ! Display the copyright notice - CALL DispCopyrightLicense( version ) + CALL DispCopyrightLicense( version%Name ) ! Obtain OpenFAST git commit hash git_commit = QueryGitVersion() ! Tell our users what they're running From 125540f3b1a07dc71d0673aa2c6531f203eef52e Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 3 Jun 2020 08:57:41 -0600 Subject: [PATCH 101/136] SlD: add check on WtrDpth (passed from HD) --- modules/soildyn/src/SoilDyn.f90 | 10 ++-- modules/soildyn/src/SoilDyn_IO.f90 | 31 ++++++++++- modules/soildyn/src/SoilDyn_Registry.txt | 2 +- modules/soildyn/src/SoilDyn_Types.f90 | 67 ++++++++++++++++++++---- 4 files changed, 92 insertions(+), 18 deletions(-) diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index 95b89e8dd..1361e49e6 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -28,11 +28,6 @@ !********************************************************************************************************************************** MODULE SoilDyn -!FIXME: stuff we need to do -! - cannot allow checkpoints. The DLL starts at T=0 always, and builds the history for histerysis loops -! - Is the stiffness matrix returned about a given operating point, or is it just what is read in? Can it be used in linearization? -! - - USE SoilDyn_Types USE SoilDyn_IO USE NWTC_Library @@ -301,9 +296,10 @@ subroutine SlD_InitMeshes( InputFileData, InitInp, u, y, p, m, ErrStat, ErrMsg ) p%NumPoints = 1_IntKi !FIXME: update to allow more than one set of points ! NumPoints = InputFileData%StiffDamp_NumPoints - call AllocAry(MeshLocations,3,1,'Mesh locations',ErrStat,ErrMsg); + p%NumPoints = 1 + call AllocAry(MeshLocations,3,p%NumPoints,'Mesh locations',ErrStat,ErrMsg); do i=1,size(MeshLocations,2) - MeshLocations(1:3,i) = InputFileData%SD_locations(1:3) + MeshLocations(1:3,i) = InputFileData%SD_locations(1:3,i) enddo case (Calc_PYcurve) p%NumPoints = InputFileData%PY_NumPoints diff --git a/modules/soildyn/src/SoilDyn_IO.f90 b/modules/soildyn/src/SoilDyn_IO.f90 index 74de51acc..803df001b 100644 --- a/modules/soildyn/src/SoilDyn_IO.f90 +++ b/modules/soildyn/src/SoilDyn_IO.f90 @@ -298,7 +298,10 @@ subroutine SlD_ReadInput( InputFileName, EchoFileName, InputFileData, ErrStat, E ! K55 = K44 ! Location - call ReadAry( UnitInput, InputFileName, InputFileData%SD_locations(1:3), 3, 'SD_locations', 'Stiffness Damping location', TmpErrStat, TmpErrMsg, UnitEcho); if (Failed()) return; + !NOTE: only 1 SD_location allowed at present. Sometime allow multiple SD_locations + allocate( InputFileData%SD_locations(3,1), STAT=TmpErrStat ) ! InputFileData%SD_NumPoints + if (TmpErrStat /= 0) call SetErrStat(ErrID_Fatal, 'Could not allocate SD_locations', ErrStat, ErrMsg, RoutineName) + call ReadAry( UnitInput, InputFileName, InputFileData%SD_locations(1:3,1), 3, 'SD_locations', 'Stiffness Damping location', TmpErrStat, TmpErrMsg, UnitEcho); if (Failed()) return; ! Stiffness call ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line', TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; @@ -478,7 +481,9 @@ SUBROUTINE SlD_ValidateInput( InitInp, InputFileData, ErrStat, ErrMsg ) select case(InputFileData%CalcOption) case (Calc_StiffDamp) + call ValidateStiffnessMatrix() case (Calc_PYcurve) + call ValidatePYcurves() case (Calc_REDWIN) call ValidateDLL() end select @@ -486,14 +491,21 @@ SUBROUTINE SlD_ValidateInput( InitInp, InputFileData, ErrStat, ErrMsg ) CONTAINS subroutine ValidateStiffnessMatrix() + call CheckWtrDepth( InputFileData%SD_locations, 'SD locations', ErrStat2, ErrMsg2) + call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) ! Placeholder end subroutine ValidateStiffnessMatrix subroutine ValidatePYcurves() + call CheckWtrDepth( InputFileData%PY_locations, 'PY locations', ErrStat2, ErrMsg2) + call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) ! Placeholder end subroutine ValidatePYcurves subroutine ValidateDLL() + call CheckWtrDepth( InputFileData%DLL_locations, 'DLL locations', ErrStat2, ErrMsg2) + call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + ! Check the model read( InputFileData%DLL_modelChr(1:1), *, IOSTAT=IOS ) InputFileData%DLL_model call CheckIOS ( IOS, "", 'DLL_model', NumType, ErrStat2, ErrMsg2 ) @@ -515,6 +527,23 @@ subroutine ValidateDLL() end subroutine ValidateDLL + subroutine CheckWtrDepth(Depths,InfoDesc,ErrStat3,ErrMsg3) + real(ReKi), intent(in ) :: Depths(:,:) + character(*), intent(in ) :: InfoDesc + integer(IntKi), intent( out) :: ErrStat3 + character(ErrMsgLen), intent( out) :: ErrMsg3 + ErrStat3 = ErrID_None + ErrMsg3 = '' + do i = 1,size(Depths,dim=2) + if (Depths(3,i) > -abs(InitInp%WtrDpth)) then + call SetErrStat( ErrID_Fatal, ' Soil location '//trim(Num2LStr(i))//' ('//trim(Num2LStr(Depths(3,i)))// & + ' m) for '//trim(InfoDesc)//' is above mudline',ErrStat3,ErrMsg3,'') + endif + enddo + if (ErrStat3 /= ErrID_None) ErrMsg3=trim(ErrMsg3)//NewLine//'Water depth passed to SoilDyn = '//trim(Num2LStr(InitInp%WtrDpth))//' m' + return + end subroutine CheckWtrDepth + END SUBROUTINE SlD_ValidateInput diff --git a/modules/soildyn/src/SoilDyn_Registry.txt b/modules/soildyn/src/SoilDyn_Registry.txt index 5d11f5fbe..26c49502e 100644 --- a/modules/soildyn/src/SoilDyn_Registry.txt +++ b/modules/soildyn/src/SoilDyn_Registry.txt @@ -48,7 +48,7 @@ typedef ^ SlD_InputFile LOGICAL EchoFlag - - - "E typedef ^ SlD_InputFile CHARACTER(ChanLen) OutList : - - "List of user-requested output channels" - typedef ^ SlD_InputFile R8Ki DT - - - "Timestep requested" '(s)' typedef ^ SlD_InputFile IntKi CalcOption - - - "Calculation methodology to use" - -typedef ^ SlD_InputFile ReKi SD_locations 3 - - "Location of the Stiffness damping point" '(m)' +typedef ^ SlD_InputFile ReKi SD_locations :: - - "Location of the Stiffness damping point" '(m)' typedef ^ SlD_InputFile R8Ki Stiffness {6}{6} - - "Stiffness matrix 6x6" '(N/m, N-m/rad)' typedef ^ SlD_InputFile R8Ki Damping {6}{6} - - "Damping ratio matrix 6x6" - typedef ^ SlD_InputFile IntKi PY_numpoints - - - "Number of P-Y curve mesh points" - diff --git a/modules/soildyn/src/SoilDyn_Types.f90 b/modules/soildyn/src/SoilDyn_Types.f90 index 7142616df..16469043f 100644 --- a/modules/soildyn/src/SoilDyn_Types.f90 +++ b/modules/soildyn/src/SoilDyn_Types.f90 @@ -66,7 +66,7 @@ MODULE SoilDyn_Types CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: OutList !< List of user-requested output channels [-] REAL(R8Ki) :: DT !< Timestep requested ['(s)'] INTEGER(IntKi) :: CalcOption !< Calculation methodology to use [-] - REAL(ReKi) , DIMENSION(1:3) :: SD_locations !< Location of the Stiffness damping point ['(m)'] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: SD_locations !< Location of the Stiffness damping point ['(m)'] REAL(R8Ki) , DIMENSION(1:6,1:6) :: Stiffness !< Stiffness matrix 6x6 ['(N/m,] REAL(R8Ki) , DIMENSION(1:6,1:6) :: Damping !< Damping ratio matrix 6x6 [-] INTEGER(IntKi) :: PY_numpoints !< Number of P-Y curve mesh points [-] @@ -660,7 +660,20 @@ SUBROUTINE SlD_CopyInputFile( SrcInputFileData, DstInputFileData, CtrlCode, ErrS ENDIF DstInputFileData%DT = SrcInputFileData%DT DstInputFileData%CalcOption = SrcInputFileData%CalcOption +IF (ALLOCATED(SrcInputFileData%SD_locations)) THEN + i1_l = LBOUND(SrcInputFileData%SD_locations,1) + i1_u = UBOUND(SrcInputFileData%SD_locations,1) + i2_l = LBOUND(SrcInputFileData%SD_locations,2) + i2_u = UBOUND(SrcInputFileData%SD_locations,2) + IF (.NOT. ALLOCATED(DstInputFileData%SD_locations)) THEN + ALLOCATE(DstInputFileData%SD_locations(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInputFileData%SD_locations.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF DstInputFileData%SD_locations = SrcInputFileData%SD_locations +ENDIF DstInputFileData%Stiffness = SrcInputFileData%Stiffness DstInputFileData%Damping = SrcInputFileData%Damping DstInputFileData%PY_numpoints = SrcInputFileData%PY_numpoints @@ -750,6 +763,9 @@ SUBROUTINE SlD_DestroyInputFile( InputFileData, ErrStat, ErrMsg ) IF (ALLOCATED(InputFileData%OutList)) THEN DEALLOCATE(InputFileData%OutList) ENDIF +IF (ALLOCATED(InputFileData%SD_locations)) THEN + DEALLOCATE(InputFileData%SD_locations) +ENDIF IF (ALLOCATED(InputFileData%PY_locations)) THEN DEALLOCATE(InputFileData%PY_locations) ENDIF @@ -810,7 +826,11 @@ SUBROUTINE SlD_PackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs END IF Db_BufSz = Db_BufSz + 1 ! DT Int_BufSz = Int_BufSz + 1 ! CalcOption + Int_BufSz = Int_BufSz + 1 ! SD_locations allocated yes/no + IF ( ALLOCATED(InData%SD_locations) ) THEN + Int_BufSz = Int_BufSz + 2*2 ! SD_locations upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%SD_locations) ! SD_locations + END IF Db_BufSz = Db_BufSz + SIZE(InData%Stiffness) ! Stiffness Db_BufSz = Db_BufSz + SIZE(InData%Damping) ! Damping Int_BufSz = Int_BufSz + 1 ! PY_numpoints @@ -897,8 +917,22 @@ SUBROUTINE SlD_PackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs Db_Xferred = Db_Xferred + 1 IntKiBuf ( Int_Xferred:Int_Xferred+(1)-1 ) = InData%CalcOption Int_Xferred = Int_Xferred + 1 - ReKiBuf ( Re_Xferred:Re_Xferred+(SIZE(InData%SD_locations))-1 ) = PACK(InData%SD_locations,.TRUE.) + IF ( .NOT. ALLOCATED(InData%SD_locations) ) 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%SD_locations,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%SD_locations,1) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%SD_locations,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%SD_locations,2) + Int_Xferred = Int_Xferred + 2 + + IF (SIZE(InData%SD_locations)>0) ReKiBuf ( Re_Xferred:Re_Xferred+(SIZE(InData%SD_locations))-1 ) = PACK(InData%SD_locations,.TRUE.) Re_Xferred = Re_Xferred + SIZE(InData%SD_locations) + END IF DbKiBuf ( Db_Xferred:Db_Xferred+(SIZE(InData%Stiffness))-1 ) = PACK(InData%Stiffness,.TRUE.) Db_Xferred = Db_Xferred + SIZE(InData%Stiffness) DbKiBuf ( Db_Xferred:Db_Xferred+(SIZE(InData%Damping))-1 ) = PACK(InData%Damping,.TRUE.) @@ -1079,17 +1113,32 @@ SUBROUTINE SlD_UnPackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er Db_Xferred = Db_Xferred + 1 OutData%CalcOption = IntKiBuf( Int_Xferred ) Int_Xferred = Int_Xferred + 1 - i1_l = LBOUND(OutData%SD_locations,1) - i1_u = UBOUND(OutData%SD_locations,1) - ALLOCATE(mask1(i1_l:i1_u),STAT=ErrStat2) + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! SD_locations 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 + i2_l = IntKiBuf( Int_Xferred ) + i2_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ALLOCATED(OutData%SD_locations)) DEALLOCATE(OutData%SD_locations) + ALLOCATE(OutData%SD_locations(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating mask1.', ErrStat, ErrMsg,RoutineName) + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%SD_locations.', ErrStat, ErrMsg,RoutineName) RETURN END IF - mask1 = .TRUE. - OutData%SD_locations = UNPACK(ReKiBuf( Re_Xferred:Re_Xferred+(SIZE(OutData%SD_locations))-1 ), mask1, 0.0_ReKi ) + ALLOCATE(mask2(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating mask2.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + mask2 = .TRUE. + IF (SIZE(OutData%SD_locations)>0) OutData%SD_locations = UNPACK(ReKiBuf( Re_Xferred:Re_Xferred+(SIZE(OutData%SD_locations))-1 ), mask2, 0.0_ReKi ) Re_Xferred = Re_Xferred + SIZE(OutData%SD_locations) - DEALLOCATE(mask1) + DEALLOCATE(mask2) + END IF i1_l = LBOUND(OutData%Stiffness,1) i1_u = UBOUND(OutData%Stiffness,1) i2_l = LBOUND(OutData%Stiffness,2) From a6cd85be617f2b73f59cf7625d7f733929cb4d4d Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 16 Jun 2020 12:32:40 -0600 Subject: [PATCH 102/136] SlD: rearrange so stiffness matrices can easily be passed out at init. --- modules/soildyn/src/SoilDyn.f90 | 39 +-- modules/soildyn/src/SoilDyn_IO.f90 | 10 +- modules/soildyn/src/SoilDyn_Registry.txt | 14 +- modules/soildyn/src/SoilDyn_Types.f90 | 378 +++++++++++++++-------- 4 files changed, 274 insertions(+), 167 deletions(-) diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index 1361e49e6..9062c58a9 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -109,8 +109,6 @@ subroutine SlD_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOu p%DLL_Model = InputFileData%DLL_Model p%DLL_OnlyStiff = InputFileData%DLL_OnlyStiff p%CalcOption = InputFileData%CalcOption - p%Stiffness = InputFileData%Stiffness -! p%Damping = InputFileData%Damping p%UseREDWINinterface = .FALSE. ! Initially set to false in case DLL not used. @@ -146,6 +144,8 @@ subroutine SlD_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOu ! Setup and initialize the Calc Options select case(p%CalcOption) case (Calc_StiffDamp) + call move_alloc(InputFileData%Stiffness,p%Stiffness) + !call move_alloc(InputFileData%Damping,p%Damping) case (Calc_PYcurve) case (Calc_REDWIN) call SlD_REDWINsetup( InputFileData,p, m, xd, ErrStat, ErrMsg ) @@ -188,7 +188,7 @@ subroutine SlD_REDWINsetup( InputFileData,p, m, xd, ErrStat, ErrMsg ) ErrMsg = "" ! set placeholder for DLL stifness matrices - call AllocAry( p%DLL_Stiffness, 6, 6, size(m%dll_data), 'DLL stiffness matrices', ErrStat2, ErrMsg2 ) + call AllocAry( p%Stiffness, 6, 6, size(m%dll_data), 'DLL stiffness matrices', ErrStat2, ErrMsg2 ) call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) ! Initialize the dll @@ -198,7 +198,7 @@ subroutine SlD_REDWINsetup( InputFileData,p, m, xd, ErrStat, ErrMsg ) call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName); if (ErrStat >= AbortErrLev) return NullDispl = 0.0_R8Ki NullForce = 0.0_ReKi - call REDWINinterface_GetStiffMatrix( p%DLL_Trgt, p%DLL_Model, NullDispl, NullForce, p%DLL_StiffNess(1:6,1:6,i), m%dll_data(i), ErrStat2, ErrMsg2 ) + call REDWINinterface_GetStiffMatrix( p%DLL_Trgt, p%DLL_Model, NullDispl, NullForce, p%StiffNess(1:6,1:6,i), m%dll_data(i), ErrStat2, ErrMsg2 ) call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) ! now initialize the states info from the miscvar @@ -522,20 +522,23 @@ subroutine SlD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg select case(p%CalcOption) case (Calc_StiffDamp) - ! Copy displacement from point mesh (angles in radians -- REDWIN dll also uses rad) - Displacement(1:3) = u%SoilMesh%TranslationDisp(1:3,1) ! Translations -- This is R8Ki in the mesh - Displacement(4:6) = GetSmllRotAngs(u%SoilMesh%Orientation(1:3,1:3,1), ErrStat2, ErrMsg2); if (Failed()) return; - - ! Calculate reaction with F = k*dX - Force = matmul(p%Stiffness, Displacement) - - ! Return reaction force onto the resulting point mesh - y%SoilMesh%Force (1,1) = -real(Force(1),ReKi) - y%SoilMesh%Force (2,1) = -real(Force(2),ReKi) - y%SoilMesh%Force (3,1) = -real(Force(3),ReKi) - y%SoilMesh%Moment(1,1) = -real(Force(4),ReKi) - y%SoilMesh%Moment(2,1) = -real(Force(5),ReKi) - y%SoilMesh%Moment(3,1) = -real(Force(6),ReKi) +!TODO: add ability to do more than one point + do i=1,1 + ! Copy displacement from point mesh (angles in radians -- REDWIN dll also uses rad) + Displacement(1:3) = u%SoilMesh%TranslationDisp(1:3,i) ! Translations -- This is R8Ki in the mesh + Displacement(4:6) = GetSmllRotAngs(u%SoilMesh%Orientation(1:3,1:3,i), ErrStat2, ErrMsg2); if (Failed()) return; + + ! Calculate reaction with F = k*dX + Force = matmul(p%Stiffness(1:6,1:6,i), Displacement) + + ! Return reaction force onto the resulting point mesh + y%SoilMesh%Force (1,i) = -real(Force(1),ReKi) + y%SoilMesh%Force (2,i) = -real(Force(2),ReKi) + y%SoilMesh%Force (3,i) = -real(Force(3),ReKi) + y%SoilMesh%Moment(1,i) = -real(Force(4),ReKi) + y%SoilMesh%Moment(2,i) = -real(Force(5),ReKi) + y%SoilMesh%Moment(3,i) = -real(Force(6),ReKi) + enddo case (Calc_PYcurve) call SetErrStat(ErrID_Fatal,' SoilDyn does not support P-Y curve calculations yet.',ErrStat,ErrMsg,RoutineName) diff --git a/modules/soildyn/src/SoilDyn_IO.f90 b/modules/soildyn/src/SoilDyn_IO.f90 index 803df001b..243706ca9 100644 --- a/modules/soildyn/src/SoilDyn_IO.f90 +++ b/modules/soildyn/src/SoilDyn_IO.f90 @@ -281,7 +281,7 @@ subroutine SlD_ReadInput( InputFileName, EchoFileName, InputFileData, ErrStat, E CALL CheckIOS ( IOS, InputFileName, 'DT', NumType, TmpErrStat, TmpErrMsg ); if (Failed()) return; END IF - ! CalcOption -- option on which calculation methodology to use {1: Stiffness / Damping matrices [unavailable], 2: P-Y curves [unavailable], 3: coupled REDWIN DLL} + ! CalcOption -- option on which calculation methodology to use {1: Stiffness / Damping matrices, 2: P-Y curves [unavailable], 3: coupled REDWIN DLL} call ReadVar( UnitInput, InputFileName, InputFileData%CalcOption, "CalcOption", "Calculation methodology to use", TmpErrStat, TmpErrMsg, UnitEcho); if (Failed()) return; @@ -298,21 +298,23 @@ subroutine SlD_ReadInput( InputFileName, EchoFileName, InputFileData, ErrStat, E ! K55 = K44 ! Location - !NOTE: only 1 SD_location allowed at present. Sometime allow multiple SD_locations + !NOTE: only 1 SD_location allowed at present. TODO allow multiple SD_locations allocate( InputFileData%SD_locations(3,1), STAT=TmpErrStat ) ! InputFileData%SD_NumPoints if (TmpErrStat /= 0) call SetErrStat(ErrID_Fatal, 'Could not allocate SD_locations', ErrStat, ErrMsg, RoutineName) call ReadAry( UnitInput, InputFileName, InputFileData%SD_locations(1:3,1), 3, 'SD_locations', 'Stiffness Damping location', TmpErrStat, TmpErrMsg, UnitEcho); if (Failed()) return; ! Stiffness call ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line', TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; + call AllocAry( InputFileData%Stiffness, 6, 6, 1, 'Stiffness matrices', TmpErrStat, TmpErrMsg ); if (Failed()) return; do i=1,6 - call ReadAry( UnitInput, InputFileName, InputFileData%Stiffness(i,:), 6, 'Stiffness', 'Elastic stiffness matrix', TmpErrStat, TmpErrMsg, UnitEcho); if (Failed()) return; + call ReadAry( UnitInput, InputFileName, InputFileData%Stiffness(i,:,1), 6, 'Stiffness', 'Elastic stiffness matrix', TmpErrStat, TmpErrMsg, UnitEcho); if (Failed()) return; enddo ! Damping call ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line', TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; + call AllocAry( InputFileData%Damping, 6, 6, 1, 'Damping matrices', TmpErrStat, TmpErrMsg ); if (Failed()) return; do i=1,6 - call ReadAry( UnitInput, InputFileName, InputFileData%Damping(i,:), 6, 'Damping', 'Elastic damping ratio (-)', TmpErrStat, TmpErrMsg, UnitEcho); if (Failed()) return; + call ReadAry( UnitInput, InputFileName, InputFileData%Damping(i,:,1), 6, 'Damping', 'Elastic damping ratio (-)', TmpErrStat, TmpErrMsg, UnitEcho); if (Failed()) return; enddo !------------------------------------------------------------------------------------------------- diff --git a/modules/soildyn/src/SoilDyn_Registry.txt b/modules/soildyn/src/SoilDyn_Registry.txt index 26c49502e..6c456d548 100644 --- a/modules/soildyn/src/SoilDyn_Registry.txt +++ b/modules/soildyn/src/SoilDyn_Registry.txt @@ -49,8 +49,8 @@ typedef ^ SlD_InputFile CHARACTER(ChanLen) OutList : - - "L typedef ^ SlD_InputFile R8Ki DT - - - "Timestep requested" '(s)' typedef ^ SlD_InputFile IntKi CalcOption - - - "Calculation methodology to use" - typedef ^ SlD_InputFile ReKi SD_locations :: - - "Location of the Stiffness damping point" '(m)' -typedef ^ SlD_InputFile R8Ki Stiffness {6}{6} - - "Stiffness matrix 6x6" '(N/m, N-m/rad)' -typedef ^ SlD_InputFile R8Ki Damping {6}{6} - - "Damping ratio matrix 6x6" - +typedef ^ SlD_InputFile R8Ki Stiffness ::: - - "Stiffness matrix 6x6" '(N/m, N-m/rad)' +typedef ^ SlD_InputFile R8Ki Damping ::: - - "Damping ratio matrix 6x6" - typedef ^ SlD_InputFile IntKi PY_numpoints - - - "Number of P-Y curve mesh points" - typedef ^ SlD_InputFile ReKi PY_locations :: - - "P-Y curve location points for mesh" '(m)' typedef ^ SlD_InputFile character(1024) PY_inputFile : - - "Input file with P-Y curve data" - @@ -74,14 +74,12 @@ typedef ^ InitInputType CHARACTER(1024) RootName - - - typedef ^ InitInputType LOGICAL Linearize - .FALSE. - "Flag that tells this module if the glue code wants to linearize." - typedef ^ InitInputType ReKi WtrDpth - - - "Water depth to mudline (global coordinates)" '(m)' typedef ^ InitInputType ReKi SubRotateZ - - - "Substructure rotation angle, in case we change orientations" '(rad)' -#typedef ^ InitInputType IntKi nNodes_R - - - "Number of nodes subdyn thinks are reaction nodes (from SubDyn nNodes_C)" - -#typedef ^ InitInputType IntKi Nodes_R {:} - - "Nodes in input mesh that reaction force may be applied to (note: p%Nodes_C in SD has 2 dimensions in the old format, but only 1 in new)" '(-)' -#typedef ^ InitInputType MeshType SoilMesh - - - "Interior+Interface nodes outputs on a point mesh (from SD) -- only some are used!" '(-)' # Define outputs from the initialization routine here: typedef ^ InitOutputType CHARACTER(ChanLen) WriteOutputHdr {:} - - "Names of the output-to-file channels" - typedef ^ InitOutputType CHARACTER(ChanLen) WriteOutputUnt {:} - - "Units of the output-to-file channels" - typedef ^ InitOutputType ProgDesc Ver - - - "This module's name, version, and date" - +typedef ^ InitOutputType ReKi SoilStiffness {:}{:}{:} - - "Soil stiffness at each mesh point (in order)" '(N/m, N-m/rad)' # if this module has implemented linearization, return the names of the rows/columns of the Jacobian matrices: #typedef ^ InitOutputType CHARACTER(LinChanLen) LinNames_y {:} - - "Names of the outputs used in linearization" - #typedef ^ InitOutputType CHARACTER(LinChanLen) LinNames_x {:} - - "Names of the continuous states used in linearization" - @@ -132,10 +130,8 @@ typedef ^ ParameterType OutParmType OutParam { typedef ^ ParameterType IntKi NumOuts - - - "Number of parameters in the output list (number of outputs requested)" - typedef ^ ParameterType IntKi NumPoints - - - "Number of points interfacing soil with" - typedef ^ ParameterType ReKi WtrDepth - - - "Water depth to mudline (global coordinates)" '(m)' -typedef ^ ParameterType IntKi Nodes_C {:}{:} - - "Nodes in input mesh that reaction force may be applied to" '(-)' -typedef ^ ParameterType R8Ki Stiffness {6}{6} - - "Stiffness matrix" '(N/m, N-m/rad)' -#typedef ^ ParameterType R8Ki Damping {6}{6} - - "Damping matrix" '(N/m, N-m/rad)' -typedef ^ ParameterType R8Ki DLL_Stiffness {:}{:}{:} - - "Stiffness matrices from REDWIN DLL" '(N/m, N-m/rad)' +typedef ^ ParameterType R8Ki Stiffness ::: - - "Stiffness matrix" '(N/m, N-m/rad)' +#typedef ^ ParameterType R8Ki Damping ::: - - "Damping matrix" '(N/m, N-m/rad)' typedef ^ ParameterType logical DLL_OnlyStiff - - - "Use only the stiffness matrix in calculating the restoring forces" - # ..... Inputs .................................................................................................................... diff --git a/modules/soildyn/src/SoilDyn_Types.f90 b/modules/soildyn/src/SoilDyn_Types.f90 index 16469043f..79afac701 100644 --- a/modules/soildyn/src/SoilDyn_Types.f90 +++ b/modules/soildyn/src/SoilDyn_Types.f90 @@ -67,8 +67,8 @@ MODULE SoilDyn_Types REAL(R8Ki) :: DT !< Timestep requested ['(s)'] INTEGER(IntKi) :: CalcOption !< Calculation methodology to use [-] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: SD_locations !< Location of the Stiffness damping point ['(m)'] - REAL(R8Ki) , DIMENSION(1:6,1:6) :: Stiffness !< Stiffness matrix 6x6 ['(N/m,] - REAL(R8Ki) , DIMENSION(1:6,1:6) :: Damping !< Damping ratio matrix 6x6 [-] + REAL(R8Ki) , DIMENSION(:,:,:), ALLOCATABLE :: Stiffness !< Stiffness matrix 6x6 ['(N/m,] + REAL(R8Ki) , DIMENSION(:,:,:), ALLOCATABLE :: Damping !< Damping ratio matrix 6x6 [-] INTEGER(IntKi) :: PY_numpoints !< Number of P-Y curve mesh points [-] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: PY_locations !< P-Y curve location points for mesh ['(m)'] character(1024) , DIMENSION(:), ALLOCATABLE :: PY_inputFile !< Input file with P-Y curve data [-] @@ -99,6 +99,7 @@ MODULE SoilDyn_Types CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: WriteOutputHdr !< Names of the output-to-file channels [-] CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: WriteOutputUnt !< Units of the output-to-file channels [-] TYPE(ProgDesc) :: Ver !< This module's name, version, and date [-] + REAL(ReKi) , DIMENSION(:,:,:), ALLOCATABLE :: SoilStiffness !< Soil stiffness at each mesh point (in order) ['(N/m,] END TYPE SlD_InitOutputType ! ======================= ! ========= SlD_ContinuousStateType ======= @@ -142,9 +143,7 @@ MODULE SoilDyn_Types INTEGER(IntKi) :: NumOuts !< Number of parameters in the output list (number of outputs requested) [-] INTEGER(IntKi) :: NumPoints !< Number of points interfacing soil with [-] REAL(ReKi) :: WtrDepth !< Water depth to mudline (global coordinates) ['(m)'] - INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: Nodes_C !< Nodes in input mesh that reaction force may be applied to ['(-)'] - REAL(R8Ki) , DIMENSION(1:6,1:6) :: Stiffness !< Stiffness matrix ['(N/m,] - REAL(R8Ki) , DIMENSION(:,:,:), ALLOCATABLE :: DLL_Stiffness !< Stiffness matrices from REDWIN DLL ['(N/m,] + REAL(R8Ki) , DIMENSION(:,:,:), ALLOCATABLE :: Stiffness !< Stiffness matrix ['(N/m,] LOGICAL :: DLL_OnlyStiff !< Use only the stiffness matrix in calculating the restoring forces [-] END TYPE SlD_ParameterType ! ======================= @@ -639,6 +638,7 @@ SUBROUTINE SlD_CopyInputFile( SrcInputFileData, DstInputFileData, CtrlCode, ErrS INTEGER(IntKi) :: i,j,k INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 INTEGER(IntKi) :: i2, i2_l, i2_u ! bounds (upper/lower) for an array dimension 2 + INTEGER(IntKi) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'SlD_CopyInputFile' @@ -674,8 +674,38 @@ SUBROUTINE SlD_CopyInputFile( SrcInputFileData, DstInputFileData, CtrlCode, ErrS END IF DstInputFileData%SD_locations = SrcInputFileData%SD_locations ENDIF +IF (ALLOCATED(SrcInputFileData%Stiffness)) THEN + i1_l = LBOUND(SrcInputFileData%Stiffness,1) + i1_u = UBOUND(SrcInputFileData%Stiffness,1) + i2_l = LBOUND(SrcInputFileData%Stiffness,2) + i2_u = UBOUND(SrcInputFileData%Stiffness,2) + i3_l = LBOUND(SrcInputFileData%Stiffness,3) + i3_u = UBOUND(SrcInputFileData%Stiffness,3) + IF (.NOT. ALLOCATED(DstInputFileData%Stiffness)) THEN + ALLOCATE(DstInputFileData%Stiffness(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInputFileData%Stiffness.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF DstInputFileData%Stiffness = SrcInputFileData%Stiffness +ENDIF +IF (ALLOCATED(SrcInputFileData%Damping)) THEN + i1_l = LBOUND(SrcInputFileData%Damping,1) + i1_u = UBOUND(SrcInputFileData%Damping,1) + i2_l = LBOUND(SrcInputFileData%Damping,2) + i2_u = UBOUND(SrcInputFileData%Damping,2) + i3_l = LBOUND(SrcInputFileData%Damping,3) + i3_u = UBOUND(SrcInputFileData%Damping,3) + IF (.NOT. ALLOCATED(DstInputFileData%Damping)) THEN + ALLOCATE(DstInputFileData%Damping(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInputFileData%Damping.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF DstInputFileData%Damping = SrcInputFileData%Damping +ENDIF DstInputFileData%PY_numpoints = SrcInputFileData%PY_numpoints IF (ALLOCATED(SrcInputFileData%PY_locations)) THEN i1_l = LBOUND(SrcInputFileData%PY_locations,1) @@ -766,6 +796,12 @@ SUBROUTINE SlD_DestroyInputFile( InputFileData, ErrStat, ErrMsg ) IF (ALLOCATED(InputFileData%SD_locations)) THEN DEALLOCATE(InputFileData%SD_locations) ENDIF +IF (ALLOCATED(InputFileData%Stiffness)) THEN + DEALLOCATE(InputFileData%Stiffness) +ENDIF +IF (ALLOCATED(InputFileData%Damping)) THEN + DEALLOCATE(InputFileData%Damping) +ENDIF IF (ALLOCATED(InputFileData%PY_locations)) THEN DEALLOCATE(InputFileData%PY_locations) ENDIF @@ -831,8 +867,16 @@ SUBROUTINE SlD_PackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs Int_BufSz = Int_BufSz + 2*2 ! SD_locations upper/lower bounds for each dimension Re_BufSz = Re_BufSz + SIZE(InData%SD_locations) ! SD_locations END IF + Int_BufSz = Int_BufSz + 1 ! Stiffness allocated yes/no + IF ( ALLOCATED(InData%Stiffness) ) THEN + Int_BufSz = Int_BufSz + 2*3 ! Stiffness upper/lower bounds for each dimension Db_BufSz = Db_BufSz + SIZE(InData%Stiffness) ! Stiffness + END IF + Int_BufSz = Int_BufSz + 1 ! Damping allocated yes/no + IF ( ALLOCATED(InData%Damping) ) THEN + Int_BufSz = Int_BufSz + 2*3 ! Damping upper/lower bounds for each dimension Db_BufSz = Db_BufSz + SIZE(InData%Damping) ! Damping + END IF Int_BufSz = Int_BufSz + 1 ! PY_numpoints Int_BufSz = Int_BufSz + 1 ! PY_locations allocated yes/no IF ( ALLOCATED(InData%PY_locations) ) THEN @@ -933,10 +977,44 @@ SUBROUTINE SlD_PackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs IF (SIZE(InData%SD_locations)>0) ReKiBuf ( Re_Xferred:Re_Xferred+(SIZE(InData%SD_locations))-1 ) = PACK(InData%SD_locations,.TRUE.) Re_Xferred = Re_Xferred + SIZE(InData%SD_locations) END IF - DbKiBuf ( Db_Xferred:Db_Xferred+(SIZE(InData%Stiffness))-1 ) = PACK(InData%Stiffness,.TRUE.) + IF ( .NOT. ALLOCATED(InData%Stiffness) ) 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%Stiffness,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%Stiffness,1) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%Stiffness,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%Stiffness,2) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%Stiffness,3) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%Stiffness,3) + Int_Xferred = Int_Xferred + 2 + + IF (SIZE(InData%Stiffness)>0) DbKiBuf ( Db_Xferred:Db_Xferred+(SIZE(InData%Stiffness))-1 ) = PACK(InData%Stiffness,.TRUE.) Db_Xferred = Db_Xferred + SIZE(InData%Stiffness) - DbKiBuf ( Db_Xferred:Db_Xferred+(SIZE(InData%Damping))-1 ) = PACK(InData%Damping,.TRUE.) + END IF + IF ( .NOT. ALLOCATED(InData%Damping) ) 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%Damping,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%Damping,1) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%Damping,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%Damping,2) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%Damping,3) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%Damping,3) + Int_Xferred = Int_Xferred + 2 + + IF (SIZE(InData%Damping)>0) DbKiBuf ( Db_Xferred:Db_Xferred+(SIZE(InData%Damping))-1 ) = PACK(InData%Damping,.TRUE.) Db_Xferred = Db_Xferred + SIZE(InData%Damping) + END IF IntKiBuf ( Int_Xferred:Int_Xferred+(1)-1 ) = InData%PY_numpoints Int_Xferred = Int_Xferred + 1 IF ( .NOT. ALLOCATED(InData%PY_locations) ) THEN @@ -1067,6 +1145,7 @@ SUBROUTINE SlD_UnPackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er LOGICAL, ALLOCATABLE :: mask5(:,:,:,:,:) INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 INTEGER(IntKi) :: i2, i2_l, i2_u ! bounds (upper/lower) for an array dimension 2 + INTEGER(IntKi) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'SlD_UnPackInputFile' @@ -1139,32 +1218,64 @@ SUBROUTINE SlD_UnPackInputFile( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er Re_Xferred = Re_Xferred + SIZE(OutData%SD_locations) DEALLOCATE(mask2) END IF - i1_l = LBOUND(OutData%Stiffness,1) - i1_u = UBOUND(OutData%Stiffness,1) - i2_l = LBOUND(OutData%Stiffness,2) - i2_u = UBOUND(OutData%Stiffness,2) - ALLOCATE(mask2(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! Stiffness 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 + i2_l = IntKiBuf( Int_Xferred ) + i2_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + i3_l = IntKiBuf( Int_Xferred ) + i3_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ALLOCATED(OutData%Stiffness)) DEALLOCATE(OutData%Stiffness) + ALLOCATE(OutData%Stiffness(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating mask2.', ErrStat, ErrMsg,RoutineName) + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%Stiffness.', ErrStat, ErrMsg,RoutineName) RETURN END IF - mask2 = .TRUE. - OutData%Stiffness = REAL( UNPACK(DbKiBuf( Db_Xferred:Db_Xferred+(SIZE(OutData%Stiffness))-1 ), mask2, 0.0_DbKi ), R8Ki) + ALLOCATE(mask3(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating mask3.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + mask3 = .TRUE. + IF (SIZE(OutData%Stiffness)>0) OutData%Stiffness = REAL( UNPACK(DbKiBuf( Db_Xferred:Db_Xferred+(SIZE(OutData%Stiffness))-1 ), mask3, 0.0_DbKi ), R8Ki) Db_Xferred = Db_Xferred + SIZE(OutData%Stiffness) - DEALLOCATE(mask2) - i1_l = LBOUND(OutData%Damping,1) - i1_u = UBOUND(OutData%Damping,1) - i2_l = LBOUND(OutData%Damping,2) - i2_u = UBOUND(OutData%Damping,2) - ALLOCATE(mask2(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + DEALLOCATE(mask3) + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! Damping 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 + i2_l = IntKiBuf( Int_Xferred ) + i2_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + i3_l = IntKiBuf( Int_Xferred ) + i3_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ALLOCATED(OutData%Damping)) DEALLOCATE(OutData%Damping) + ALLOCATE(OutData%Damping(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating mask2.', ErrStat, ErrMsg,RoutineName) + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%Damping.', ErrStat, ErrMsg,RoutineName) RETURN END IF - mask2 = .TRUE. - OutData%Damping = REAL( UNPACK(DbKiBuf( Db_Xferred:Db_Xferred+(SIZE(OutData%Damping))-1 ), mask2, 0.0_DbKi ), R8Ki) + ALLOCATE(mask3(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating mask3.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + mask3 = .TRUE. + IF (SIZE(OutData%Damping)>0) OutData%Damping = REAL( UNPACK(DbKiBuf( Db_Xferred:Db_Xferred+(SIZE(OutData%Damping))-1 ), mask3, 0.0_DbKi ), R8Ki) Db_Xferred = Db_Xferred + SIZE(OutData%Damping) - DEALLOCATE(mask2) + DEALLOCATE(mask3) + END IF OutData%PY_numpoints = IntKiBuf( Int_Xferred ) Int_Xferred = Int_Xferred + 1 IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! PY_locations not allocated @@ -1496,6 +1607,8 @@ SUBROUTINE SlD_CopyInitOutput( SrcInitOutputData, DstInitOutputData, CtrlCode, E ! Local INTEGER(IntKi) :: i,j,k INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 + INTEGER(IntKi) :: i2, i2_l, i2_u ! bounds (upper/lower) for an array dimension 2 + INTEGER(IntKi) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'SlD_CopyInitOutput' @@ -1529,6 +1642,22 @@ SUBROUTINE SlD_CopyInitOutput( SrcInitOutputData, DstInitOutputData, CtrlCode, E CALL NWTC_Library_Copyprogdesc( SrcInitOutputData%Ver, DstInitOutputData%Ver, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN +IF (ALLOCATED(SrcInitOutputData%SoilStiffness)) THEN + i1_l = LBOUND(SrcInitOutputData%SoilStiffness,1) + i1_u = UBOUND(SrcInitOutputData%SoilStiffness,1) + i2_l = LBOUND(SrcInitOutputData%SoilStiffness,2) + i2_u = UBOUND(SrcInitOutputData%SoilStiffness,2) + i3_l = LBOUND(SrcInitOutputData%SoilStiffness,3) + i3_u = UBOUND(SrcInitOutputData%SoilStiffness,3) + IF (.NOT. ALLOCATED(DstInitOutputData%SoilStiffness)) THEN + ALLOCATE(DstInitOutputData%SoilStiffness(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%SoilStiffness.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInitOutputData%SoilStiffness = SrcInitOutputData%SoilStiffness +ENDIF END SUBROUTINE SlD_CopyInitOutput SUBROUTINE SlD_DestroyInitOutput( InitOutputData, ErrStat, ErrMsg ) @@ -1547,6 +1676,9 @@ SUBROUTINE SlD_DestroyInitOutput( InitOutputData, ErrStat, ErrMsg ) DEALLOCATE(InitOutputData%WriteOutputUnt) ENDIF CALL NWTC_Library_Destroyprogdesc( InitOutputData%Ver, ErrStat, ErrMsg ) +IF (ALLOCATED(InitOutputData%SoilStiffness)) THEN + DEALLOCATE(InitOutputData%SoilStiffness) +ENDIF END SUBROUTINE SlD_DestroyInitOutput SUBROUTINE SlD_PackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) @@ -1612,6 +1744,11 @@ SUBROUTINE SlD_PackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrM Int_BufSz = Int_BufSz + SIZE( Int_Buf ) DEALLOCATE(Int_Buf) END IF + Int_BufSz = Int_BufSz + 1 ! SoilStiffness allocated yes/no + IF ( ALLOCATED(InData%SoilStiffness) ) THEN + Int_BufSz = Int_BufSz + 2*3 ! SoilStiffness upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%SoilStiffness) ! SoilStiffness + END IF IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) THEN @@ -1701,6 +1838,25 @@ SUBROUTINE SlD_PackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrM ELSE IntKiBuf( Int_Xferred ) = 0; Int_Xferred = Int_Xferred + 1 ENDIF + IF ( .NOT. ALLOCATED(InData%SoilStiffness) ) 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%SoilStiffness,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%SoilStiffness,1) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%SoilStiffness,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%SoilStiffness,2) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%SoilStiffness,3) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%SoilStiffness,3) + Int_Xferred = Int_Xferred + 2 + + IF (SIZE(InData%SoilStiffness)>0) ReKiBuf ( Re_Xferred:Re_Xferred+(SIZE(InData%SoilStiffness))-1 ) = PACK(InData%SoilStiffness,.TRUE.) + Re_Xferred = Re_Xferred + SIZE(InData%SoilStiffness) + END IF END SUBROUTINE SlD_PackInitOutput SUBROUTINE SlD_UnPackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) @@ -1723,6 +1879,8 @@ SUBROUTINE SlD_UnPackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, E LOGICAL, ALLOCATABLE :: mask4(:,:,:,:) LOGICAL, ALLOCATABLE :: mask5(:,:,:,:,:) INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 + INTEGER(IntKi) :: i2, i2_l, i2_u ! bounds (upper/lower) for an array dimension 2 + INTEGER(IntKi) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'SlD_UnPackInitOutput' @@ -1830,6 +1988,35 @@ SUBROUTINE SlD_UnPackInitOutput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, E IF(ALLOCATED(Re_Buf )) DEALLOCATE(Re_Buf ) IF(ALLOCATED(Db_Buf )) DEALLOCATE(Db_Buf ) IF(ALLOCATED(Int_Buf)) DEALLOCATE(Int_Buf) + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! SoilStiffness 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 + i2_l = IntKiBuf( Int_Xferred ) + i2_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + i3_l = IntKiBuf( Int_Xferred ) + i3_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ALLOCATED(OutData%SoilStiffness)) DEALLOCATE(OutData%SoilStiffness) + ALLOCATE(OutData%SoilStiffness(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%SoilStiffness.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + ALLOCATE(mask3(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating mask3.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + mask3 = .TRUE. + IF (SIZE(OutData%SoilStiffness)>0) OutData%SoilStiffness = UNPACK(ReKiBuf( Re_Xferred:Re_Xferred+(SIZE(OutData%SoilStiffness))-1 ), mask3, 0.0_ReKi ) + Re_Xferred = Re_Xferred + SIZE(OutData%SoilStiffness) + DEALLOCATE(mask3) + END IF END SUBROUTINE SlD_UnPackInitOutput SUBROUTINE SlD_CopyContState( SrcContStateData, DstContStateData, CtrlCode, ErrStat, ErrMsg ) @@ -2811,36 +2998,21 @@ SUBROUTINE SlD_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg DstParamData%NumOuts = SrcParamData%NumOuts DstParamData%NumPoints = SrcParamData%NumPoints DstParamData%WtrDepth = SrcParamData%WtrDepth -IF (ALLOCATED(SrcParamData%Nodes_C)) THEN - i1_l = LBOUND(SrcParamData%Nodes_C,1) - i1_u = UBOUND(SrcParamData%Nodes_C,1) - i2_l = LBOUND(SrcParamData%Nodes_C,2) - i2_u = UBOUND(SrcParamData%Nodes_C,2) - IF (.NOT. ALLOCATED(DstParamData%Nodes_C)) THEN - ALLOCATE(DstParamData%Nodes_C(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) +IF (ALLOCATED(SrcParamData%Stiffness)) THEN + i1_l = LBOUND(SrcParamData%Stiffness,1) + i1_u = UBOUND(SrcParamData%Stiffness,1) + i2_l = LBOUND(SrcParamData%Stiffness,2) + i2_u = UBOUND(SrcParamData%Stiffness,2) + i3_l = LBOUND(SrcParamData%Stiffness,3) + i3_u = UBOUND(SrcParamData%Stiffness,3) + IF (.NOT. ALLOCATED(DstParamData%Stiffness)) THEN + ALLOCATE(DstParamData%Stiffness(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%Nodes_C.', ErrStat, ErrMsg,RoutineName) + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%Stiffness.', ErrStat, ErrMsg,RoutineName) RETURN END IF END IF - DstParamData%Nodes_C = SrcParamData%Nodes_C -ENDIF DstParamData%Stiffness = SrcParamData%Stiffness -IF (ALLOCATED(SrcParamData%DLL_Stiffness)) THEN - i1_l = LBOUND(SrcParamData%DLL_Stiffness,1) - i1_u = UBOUND(SrcParamData%DLL_Stiffness,1) - i2_l = LBOUND(SrcParamData%DLL_Stiffness,2) - i2_u = UBOUND(SrcParamData%DLL_Stiffness,2) - i3_l = LBOUND(SrcParamData%DLL_Stiffness,3) - i3_u = UBOUND(SrcParamData%DLL_Stiffness,3) - IF (.NOT. ALLOCATED(DstParamData%DLL_Stiffness)) THEN - ALLOCATE(DstParamData%DLL_Stiffness(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%DLL_Stiffness.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - END IF - DstParamData%DLL_Stiffness = SrcParamData%DLL_Stiffness ENDIF DstParamData%DLL_OnlyStiff = SrcParamData%DLL_OnlyStiff END SUBROUTINE SlD_CopyParam @@ -2861,11 +3033,8 @@ SUBROUTINE SlD_DestroyParam( ParamData, ErrStat, ErrMsg ) ENDDO DEALLOCATE(ParamData%OutParam) ENDIF -IF (ALLOCATED(ParamData%Nodes_C)) THEN - DEALLOCATE(ParamData%Nodes_C) -ENDIF -IF (ALLOCATED(ParamData%DLL_Stiffness)) THEN - DEALLOCATE(ParamData%DLL_Stiffness) +IF (ALLOCATED(ParamData%Stiffness)) THEN + DEALLOCATE(ParamData%Stiffness) ENDIF END SUBROUTINE SlD_DestroyParam @@ -2957,16 +3126,10 @@ SUBROUTINE SlD_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, S Int_BufSz = Int_BufSz + 1 ! NumOuts Int_BufSz = Int_BufSz + 1 ! NumPoints Re_BufSz = Re_BufSz + 1 ! WtrDepth - Int_BufSz = Int_BufSz + 1 ! Nodes_C allocated yes/no - IF ( ALLOCATED(InData%Nodes_C) ) THEN - Int_BufSz = Int_BufSz + 2*2 ! Nodes_C upper/lower bounds for each dimension - Int_BufSz = Int_BufSz + SIZE(InData%Nodes_C) ! Nodes_C - END IF + Int_BufSz = Int_BufSz + 1 ! Stiffness allocated yes/no + IF ( ALLOCATED(InData%Stiffness) ) THEN + Int_BufSz = Int_BufSz + 2*3 ! Stiffness upper/lower bounds for each dimension Db_BufSz = Db_BufSz + SIZE(InData%Stiffness) ! Stiffness - Int_BufSz = Int_BufSz + 1 ! DLL_Stiffness allocated yes/no - IF ( ALLOCATED(InData%DLL_Stiffness) ) THEN - Int_BufSz = Int_BufSz + 2*3 ! DLL_Stiffness upper/lower bounds for each dimension - Db_BufSz = Db_BufSz + SIZE(InData%DLL_Stiffness) ! DLL_Stiffness END IF Int_BufSz = Int_BufSz + 1 ! DLL_OnlyStiff IF ( Re_BufSz .GT. 0 ) THEN @@ -3097,42 +3260,24 @@ SUBROUTINE SlD_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, S Int_Xferred = Int_Xferred + 1 ReKiBuf ( Re_Xferred:Re_Xferred+(1)-1 ) = InData%WtrDepth Re_Xferred = Re_Xferred + 1 - IF ( .NOT. ALLOCATED(InData%Nodes_C) ) 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%Nodes_C,1) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%Nodes_C,1) - Int_Xferred = Int_Xferred + 2 - IntKiBuf( Int_Xferred ) = LBOUND(InData%Nodes_C,2) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%Nodes_C,2) - Int_Xferred = Int_Xferred + 2 - - IF (SIZE(InData%Nodes_C)>0) IntKiBuf ( Int_Xferred:Int_Xferred+(SIZE(InData%Nodes_C))-1 ) = PACK(InData%Nodes_C,.TRUE.) - Int_Xferred = Int_Xferred + SIZE(InData%Nodes_C) - END IF - DbKiBuf ( Db_Xferred:Db_Xferred+(SIZE(InData%Stiffness))-1 ) = PACK(InData%Stiffness,.TRUE.) - Db_Xferred = Db_Xferred + SIZE(InData%Stiffness) - IF ( .NOT. ALLOCATED(InData%DLL_Stiffness) ) THEN + IF ( .NOT. ALLOCATED(InData%Stiffness) ) 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%DLL_Stiffness,1) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%DLL_Stiffness,1) + IntKiBuf( Int_Xferred ) = LBOUND(InData%Stiffness,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%Stiffness,1) Int_Xferred = Int_Xferred + 2 - IntKiBuf( Int_Xferred ) = LBOUND(InData%DLL_Stiffness,2) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%DLL_Stiffness,2) + IntKiBuf( Int_Xferred ) = LBOUND(InData%Stiffness,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%Stiffness,2) Int_Xferred = Int_Xferred + 2 - IntKiBuf( Int_Xferred ) = LBOUND(InData%DLL_Stiffness,3) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%DLL_Stiffness,3) + IntKiBuf( Int_Xferred ) = LBOUND(InData%Stiffness,3) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%Stiffness,3) Int_Xferred = Int_Xferred + 2 - IF (SIZE(InData%DLL_Stiffness)>0) DbKiBuf ( Db_Xferred:Db_Xferred+(SIZE(InData%DLL_Stiffness))-1 ) = PACK(InData%DLL_Stiffness,.TRUE.) - Db_Xferred = Db_Xferred + SIZE(InData%DLL_Stiffness) + IF (SIZE(InData%Stiffness)>0) DbKiBuf ( Db_Xferred:Db_Xferred+(SIZE(InData%Stiffness))-1 ) = PACK(InData%Stiffness,.TRUE.) + Db_Xferred = Db_Xferred + SIZE(InData%Stiffness) END IF IntKiBuf ( Int_Xferred:Int_Xferred+1-1 ) = TRANSFER( InData%DLL_OnlyStiff , IntKiBuf(1), 1) Int_Xferred = Int_Xferred + 1 @@ -3301,46 +3446,7 @@ SUBROUTINE SlD_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg Int_Xferred = Int_Xferred + 1 OutData%WtrDepth = ReKiBuf( Re_Xferred ) Re_Xferred = Re_Xferred + 1 - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! Nodes_C 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 - i2_l = IntKiBuf( Int_Xferred ) - i2_u = IntKiBuf( Int_Xferred + 1) - Int_Xferred = Int_Xferred + 2 - IF (ALLOCATED(OutData%Nodes_C)) DEALLOCATE(OutData%Nodes_C) - ALLOCATE(OutData%Nodes_C(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%Nodes_C.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - ALLOCATE(mask2(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating mask2.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - mask2 = .TRUE. - IF (SIZE(OutData%Nodes_C)>0) OutData%Nodes_C = UNPACK( IntKiBuf ( Int_Xferred:Int_Xferred+(SIZE(OutData%Nodes_C))-1 ), mask2, 0_IntKi ) - Int_Xferred = Int_Xferred + SIZE(OutData%Nodes_C) - DEALLOCATE(mask2) - END IF - i1_l = LBOUND(OutData%Stiffness,1) - i1_u = UBOUND(OutData%Stiffness,1) - i2_l = LBOUND(OutData%Stiffness,2) - i2_u = UBOUND(OutData%Stiffness,2) - ALLOCATE(mask2(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating mask2.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - mask2 = .TRUE. - OutData%Stiffness = REAL( UNPACK(DbKiBuf( Db_Xferred:Db_Xferred+(SIZE(OutData%Stiffness))-1 ), mask2, 0.0_DbKi ), R8Ki) - Db_Xferred = Db_Xferred + SIZE(OutData%Stiffness) - DEALLOCATE(mask2) - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! DLL_Stiffness not allocated + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! Stiffness not allocated Int_Xferred = Int_Xferred + 1 ELSE Int_Xferred = Int_Xferred + 1 @@ -3353,10 +3459,10 @@ SUBROUTINE SlD_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg i3_l = IntKiBuf( Int_Xferred ) i3_u = IntKiBuf( Int_Xferred + 1) Int_Xferred = Int_Xferred + 2 - IF (ALLOCATED(OutData%DLL_Stiffness)) DEALLOCATE(OutData%DLL_Stiffness) - ALLOCATE(OutData%DLL_Stiffness(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ALLOCATED(OutData%Stiffness)) DEALLOCATE(OutData%Stiffness) + ALLOCATE(OutData%Stiffness(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%DLL_Stiffness.', ErrStat, ErrMsg,RoutineName) + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%Stiffness.', ErrStat, ErrMsg,RoutineName) RETURN END IF ALLOCATE(mask3(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) @@ -3365,8 +3471,8 @@ SUBROUTINE SlD_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg RETURN END IF mask3 = .TRUE. - IF (SIZE(OutData%DLL_Stiffness)>0) OutData%DLL_Stiffness = REAL( UNPACK(DbKiBuf( Db_Xferred:Db_Xferred+(SIZE(OutData%DLL_Stiffness))-1 ), mask3, 0.0_DbKi ), R8Ki) - Db_Xferred = Db_Xferred + SIZE(OutData%DLL_Stiffness) + IF (SIZE(OutData%Stiffness)>0) OutData%Stiffness = REAL( UNPACK(DbKiBuf( Db_Xferred:Db_Xferred+(SIZE(OutData%Stiffness))-1 ), mask3, 0.0_DbKi ), R8Ki) + Db_Xferred = Db_Xferred + SIZE(OutData%Stiffness) DEALLOCATE(mask3) END IF OutData%DLL_OnlyStiff = TRANSFER( IntKiBuf( Int_Xferred ), mask0 ) From a12e05373c8a7c1c96428e6ff00bdd5e976bc9a8 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 16 Jun 2020 13:08:23 -0600 Subject: [PATCH 103/136] SlD: remove SubRotateZ from soildyn --- modules/openfast-library/src/FAST_Subs.f90 | 3 +-- modules/soildyn/src/SoilDyn_Registry.txt | 1 - modules/soildyn/src/SoilDyn_Types.f90 | 7 ------- 3 files changed, 1 insertion(+), 10 deletions(-) diff --git a/modules/openfast-library/src/FAST_Subs.f90 b/modules/openfast-library/src/FAST_Subs.f90 index c03be387e..547608833 100644 --- a/modules/openfast-library/src/FAST_Subs.f90 +++ b/modules/openfast-library/src/FAST_Subs.f90 @@ -874,7 +874,7 @@ SUBROUTINE FAST_InitializeAll( t_initial, p_FAST, y_FAST, m_FAST, ED, BD, SrvD, InitInData_SD%SDInputFile = p_FAST%SubFile InitInData_SD%RootName = p_FAST%OutFileRoot InitInData_SD%TP_RefPoint = ED%Output(1)%PlatformPtMesh%Position(:,1) ! bjj: not sure what this is supposed to be - InitInData_SD%SubRotateZ = 0.0 ! bjj: not sure what this is supposed to be + InitInData_SD%SubRotateZ = 0.0 ! Rotation of substructure. Only used with SD driver, so set to 0 here. CALL SD_Init( InitInData_SD, SD%Input(1), SD%p, SD%x(STATE_CURR), SD%xd(STATE_CURR), SD%z(STATE_CURR), & @@ -947,7 +947,6 @@ SUBROUTINE FAST_InitializeAll( t_initial, p_FAST, y_FAST, m_FAST, ED, BD, SrvD, !InitInData_SlD%UseInputFile = .TRUE. InitInData_SlD%InputFile = p_FAST%SoilFile InitInData_SlD%RootName = p_FAST%OutFileRoot - InitInData_SlD%SubRotateZ = InitInData_SD%SubRotateZ ! rotation angle of subdyn. Since we link to SD nodes, rotate SlD accordingly CALL SlD_Init( InitInData_SlD, SlD%Input(1), SlD%p, SlD%x(STATE_CURR), SlD%xd(STATE_CURR), SlD%z(STATE_CURR), & SlD%OtherSt(STATE_CURR), SlD%y, SlD%m, p_FAST%dt_module( MODULE_SlD ), InitOutData_SlD, ErrStat2, ErrMsg2 ) diff --git a/modules/soildyn/src/SoilDyn_Registry.txt b/modules/soildyn/src/SoilDyn_Registry.txt index 6c456d548..1b42e5a0c 100644 --- a/modules/soildyn/src/SoilDyn_Registry.txt +++ b/modules/soildyn/src/SoilDyn_Registry.txt @@ -73,7 +73,6 @@ typedef ^ InitInputType CHARACTER(1024) InputFile - - - typedef ^ InitInputType CHARACTER(1024) RootName - - - "Root name of the input file" - typedef ^ InitInputType LOGICAL Linearize - .FALSE. - "Flag that tells this module if the glue code wants to linearize." - typedef ^ InitInputType ReKi WtrDpth - - - "Water depth to mudline (global coordinates)" '(m)' -typedef ^ InitInputType ReKi SubRotateZ - - - "Substructure rotation angle, in case we change orientations" '(rad)' # Define outputs from the initialization routine here: typedef ^ InitOutputType CHARACTER(ChanLen) WriteOutputHdr {:} - - "Names of the output-to-file channels" - diff --git a/modules/soildyn/src/SoilDyn_Types.f90 b/modules/soildyn/src/SoilDyn_Types.f90 index 79afac701..a9917c4bd 100644 --- a/modules/soildyn/src/SoilDyn_Types.f90 +++ b/modules/soildyn/src/SoilDyn_Types.f90 @@ -91,7 +91,6 @@ MODULE SoilDyn_Types CHARACTER(1024) :: RootName !< Root name of the input file [-] LOGICAL :: Linearize = .FALSE. !< Flag that tells this module if the glue code wants to linearize. [-] REAL(ReKi) :: WtrDpth !< Water depth to mudline (global coordinates) ['(m)'] - REAL(ReKi) :: SubRotateZ !< Substructure rotation angle, in case we change orientations ['(rad)'] END TYPE SlD_InitInputType ! ======================= ! ========= SlD_InitOutputType ======= @@ -1453,7 +1452,6 @@ SUBROUTINE SlD_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, ErrS DstInitInputData%RootName = SrcInitInputData%RootName DstInitInputData%Linearize = SrcInitInputData%Linearize DstInitInputData%WtrDpth = SrcInitInputData%WtrDpth - DstInitInputData%SubRotateZ = SrcInitInputData%SubRotateZ END SUBROUTINE SlD_CopyInitInput SUBROUTINE SlD_DestroyInitInput( InitInputData, ErrStat, ErrMsg ) @@ -1506,7 +1504,6 @@ SUBROUTINE SlD_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs Int_BufSz = Int_BufSz + 1*LEN(InData%RootName) ! RootName Int_BufSz = Int_BufSz + 1 ! Linearize Re_BufSz = Re_BufSz + 1 ! WtrDpth - Re_BufSz = Re_BufSz + 1 ! SubRotateZ IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) THEN @@ -1546,8 +1543,6 @@ SUBROUTINE SlD_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs Int_Xferred = Int_Xferred + 1 ReKiBuf ( Re_Xferred:Re_Xferred+(1)-1 ) = InData%WtrDpth Re_Xferred = Re_Xferred + 1 - ReKiBuf ( Re_Xferred:Re_Xferred+(1)-1 ) = InData%SubRotateZ - Re_Xferred = Re_Xferred + 1 END SUBROUTINE SlD_PackInitInput SUBROUTINE SlD_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) @@ -1594,8 +1589,6 @@ SUBROUTINE SlD_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er Int_Xferred = Int_Xferred + 1 OutData%WtrDpth = ReKiBuf( Re_Xferred ) Re_Xferred = Re_Xferred + 1 - OutData%SubRotateZ = ReKiBuf( Re_Xferred ) - Re_Xferred = Re_Xferred + 1 END SUBROUTINE SlD_UnPackInitInput SUBROUTINE SlD_CopyInitOutput( SrcInitOutputData, DstInitOutputData, CtrlCode, ErrStat, ErrMsg ) From 71a808295b73356fc9111d8a2a35f9d0a0b40bb9 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 16 Jun 2020 13:12:47 -0600 Subject: [PATCH 104/136] SlD: remove StVarPrint from discretestates (it isn't used by REDWIN DLL yet) --- modules/soildyn/src/SoilDyn.f90 | 4 ---- modules/soildyn/src/SoilDyn_Registry.txt | 1 - modules/soildyn/src/SoilDyn_Types.f90 | 18 ------------------ 3 files changed, 23 deletions(-) diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index 9062c58a9..35e483892 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -204,7 +204,6 @@ subroutine SlD_REDWINsetup( InputFileData,p, m, xd, ErrStat, ErrMsg ) ! now initialize the states info from the miscvar xd%dll_states(i)%Props = m%dll_data(i)%Props xd%dll_states(i)%StVar = m%dll_data(i)%StVar - xd%dll_states(i)%StVarPrint = m%dll_data(i)%StVarPrint enddo end subroutine SlD_REDWINsetup @@ -476,13 +475,11 @@ subroutine SlD_UpdateStates( t, n, Inputs, InputTimes, p, x, xd, z, OtherState, do i=1,size(xd%dll_states) xd%dll_states(i)%Props = m%dll_data(i)%Props xd%dll_states(i)%StVar = m%dll_data(i)%StVar - xd%dll_states(i)%StVarPrint = m%dll_data(i)%StVarPrint enddo else do i=1,size(xd%dll_states) xd%dll_states(i)%Props = 0.0_R8Ki xd%dll_states(i)%StVar = 0.0_R8Ki - xd%dll_states(i)%StVarPrint = 0.0_IntKi enddo endif @@ -550,7 +547,6 @@ subroutine SlD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ! copy the state info over to miscvar for passing to dll (we are separating states out to better match the framework) m%dll_data(i)%Props = xd%dll_states(i)%Props m%dll_data(i)%StVar = xd%dll_states(i)%StVar - m%dll_data(i)%StVarPrint = xd%dll_states(i)%StVarPrint ! Copy displacement from point mesh (angles in radians -- REDWIN dll also uses rad) Displacement(1:3) = u%SoilMesh%TranslationDisp(1:3,i) ! Translations -- This is R8Ki in the mesh diff --git a/modules/soildyn/src/SoilDyn_Registry.txt b/modules/soildyn/src/SoilDyn_Registry.txt index 1b42e5a0c..187b894f6 100644 --- a/modules/soildyn/src/SoilDyn_Registry.txt +++ b/modules/soildyn/src/SoilDyn_Registry.txt @@ -40,7 +40,6 @@ typedef ^ REDWINdllType IntKi RunMode - typedef SoilDyn/SlD REDWINdllStates R8Ki Props {100}{200} - - "Array containing foundation model properties (used internally by the REDWIN models). Specific to each model." - typedef ^ REDWINdllStates R8Ki StVar {12}{100} - - "Array containing the state variables at the end of the step (used internally by the REDWIN models). Specific to each model." - -typedef ^ REDWINdllStates IntKi StVarPrint {12}{100} - - "Array indicating which state variables should be printed to the screen. This feature is currently not supported." - # SoilDyn input file diff --git a/modules/soildyn/src/SoilDyn_Types.f90 b/modules/soildyn/src/SoilDyn_Types.f90 index a9917c4bd..e9856f81f 100644 --- a/modules/soildyn/src/SoilDyn_Types.f90 +++ b/modules/soildyn/src/SoilDyn_Types.f90 @@ -57,7 +57,6 @@ MODULE SoilDyn_Types TYPE, PUBLIC :: REDWINdllStates REAL(R8Ki) , DIMENSION(1:100,1:200) :: Props !< Array containing foundation model properties (used internally by the REDWIN models). Specific to each model. [-] REAL(R8Ki) , DIMENSION(1:12,1:100) :: StVar !< Array containing the state variables at the end of the step (used internally by the REDWIN models). Specific to each model. [-] - INTEGER(IntKi) , DIMENSION(1:12,1:100) :: StVarPrint !< Array indicating which state variables should be printed to the screen. This feature is currently not supported. [-] END TYPE REDWINdllStates ! ======================= ! ========= SlD_InputFile ======= @@ -465,7 +464,6 @@ SUBROUTINE SlD_CopyREDWINdllStates( SrcREDWINdllStatesData, DstREDWINdllStatesDa ErrMsg = "" DstREDWINdllStatesData%Props = SrcREDWINdllStatesData%Props DstREDWINdllStatesData%StVar = SrcREDWINdllStatesData%StVar - DstREDWINdllStatesData%StVarPrint = SrcREDWINdllStatesData%StVarPrint END SUBROUTINE SlD_CopyREDWINdllStates SUBROUTINE SlD_DestroyREDWINdllStates( REDWINdllStatesData, ErrStat, ErrMsg ) @@ -516,7 +514,6 @@ SUBROUTINE SlD_PackREDWINdllStates( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Int_BufSz = 0 Db_BufSz = Db_BufSz + SIZE(InData%Props) ! Props Db_BufSz = Db_BufSz + SIZE(InData%StVar) ! StVar - Int_BufSz = Int_BufSz + SIZE(InData%StVarPrint) ! StVarPrint IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) THEN @@ -548,8 +545,6 @@ SUBROUTINE SlD_PackREDWINdllStates( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, Db_Xferred = Db_Xferred + SIZE(InData%Props) DbKiBuf ( Db_Xferred:Db_Xferred+(SIZE(InData%StVar))-1 ) = PACK(InData%StVar,.TRUE.) Db_Xferred = Db_Xferred + SIZE(InData%StVar) - IntKiBuf ( Int_Xferred:Int_Xferred+(SIZE(InData%StVarPrint))-1 ) = PACK(InData%StVarPrint,.TRUE.) - Int_Xferred = Int_Xferred + SIZE(InData%StVarPrint) END SUBROUTINE SlD_PackREDWINdllStates SUBROUTINE SlD_UnPackREDWINdllStates( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) @@ -612,19 +607,6 @@ SUBROUTINE SlD_UnPackREDWINdllStates( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrSt OutData%StVar = REAL( UNPACK(DbKiBuf( Db_Xferred:Db_Xferred+(SIZE(OutData%StVar))-1 ), mask2, 0.0_DbKi ), R8Ki) Db_Xferred = Db_Xferred + SIZE(OutData%StVar) DEALLOCATE(mask2) - i1_l = LBOUND(OutData%StVarPrint,1) - i1_u = UBOUND(OutData%StVarPrint,1) - i2_l = LBOUND(OutData%StVarPrint,2) - i2_u = UBOUND(OutData%StVarPrint,2) - ALLOCATE(mask2(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating mask2.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - mask2 = .TRUE. - OutData%StVarPrint = UNPACK( IntKiBuf ( Int_Xferred:Int_Xferred+(SIZE(OutData%StVarPrint))-1 ), mask2, 0_IntKi ) - Int_Xferred = Int_Xferred + SIZE(OutData%StVarPrint) - DEALLOCATE(mask2) END SUBROUTINE SlD_UnPackREDWINdllStates SUBROUTINE SlD_CopyInputFile( SrcInputFileData, DstInputFileData, CtrlCode, ErrStat, ErrMsg ) From 45d05982303f1c274ffe91bf17b7cfc2d68281a1 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 16 Jun 2020 14:01:10 -0600 Subject: [PATCH 105/136] SoilDyn+SubDyn: Passing of stiffness and mesh nodes to SD --- modules/openfast-library/src/FAST_Subs.f90 | 97 +++++++----- modules/subdyn/src/SubDyn.f90 | 23 +++ modules/subdyn/src/SubDyn_Registry.txt | 2 + modules/subdyn/src/SubDyn_Types.f90 | 170 ++++++++++++++++++++- 4 files changed, 253 insertions(+), 39 deletions(-) diff --git a/modules/openfast-library/src/FAST_Subs.f90 b/modules/openfast-library/src/FAST_Subs.f90 index 547608833..6a23ffced 100644 --- a/modules/openfast-library/src/FAST_Subs.f90 +++ b/modules/openfast-library/src/FAST_Subs.f90 @@ -844,6 +844,43 @@ SUBROUTINE FAST_InitializeAll( t_initial, p_FAST, y_FAST, m_FAST, ED, BD, SrvD, END IF END IF ! CompHydro + ! ........................ + ! initialize SoilDyn + ! ........................ + ALLOCATE( SlD%Input( p_FAST%InterpOrder+1 ), SlD%InputTimes( p_FAST%InterpOrder+1 ), STAT = ErrStat2 ) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal,"Error allocating SlD%Input and SlD%InputTimes.",ErrStat,ErrMsg,RoutineName) + CALL Cleanup() + RETURN + END IF + + IF ( p_FAST%CompSoil == Module_SlD .and. p_FAST%CompSub == Module_SD ) THEN + + IF ( p_FAST%CompHydro == Module_HD ) THEN + InitInData_SlD%WtrDpth = InitOutData_HD%WtrDpth + ELSE + InitInData_SlD%WtrDpth = 0.0_ReKi + END IF + + !InitInData_SlD%UseInputFile = .TRUE. + InitInData_SlD%InputFile = p_FAST%SoilFile + InitInData_SlD%RootName = p_FAST%OutFileRoot + + CALL SlD_Init( InitInData_SlD, SlD%Input(1), SlD%p, SlD%x(STATE_CURR), SlD%xd(STATE_CURR), SlD%z(STATE_CURR), & + SlD%OtherSt(STATE_CURR), SlD%y, SlD%m, p_FAST%dt_module( MODULE_SlD ), InitOutData_SlD, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + + p_FAST%ModuleInitialized(Module_SlD) = .TRUE. + CALL SetModuleSubstepTime(Module_SlD, p_FAST, y_FAST, ErrStat2, ErrMsg2) + CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + + IF (ErrStat >= AbortErrLev) THEN + CALL Cleanup() + RETURN + END IF + ! Add interfaces as we develop them. + END IF + ! ........................ ! initialize SubDyn or ExtPtfm_MCKF ! ........................ @@ -875,7 +912,28 @@ SUBROUTINE FAST_InitializeAll( t_initial, p_FAST, y_FAST, m_FAST, ED, BD, SrvD, InitInData_SD%RootName = p_FAST%OutFileRoot InitInData_SD%TP_RefPoint = ED%Output(1)%PlatformPtMesh%Position(:,1) ! bjj: not sure what this is supposed to be InitInData_SD%SubRotateZ = 0.0 ! Rotation of substructure. Only used with SD driver, so set to 0 here. - + + if ( p_FAST%CompSoil == Module_SlD ) then + ! Copy over the soil stiffness matrices + if (allocated(SlD%p%Stiffness)) then + call AllocAry(InitInData_SD%SoilStiffness,size(SlD%p%Stiffness,1),size(SlD%p%Stiffness,2),size(SlD%p%Stiffness,3),'SoilStiffness',ErrStat2,ErrMsg2) + CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + IF (ErrStat >= AbortErrLev) THEN + CALL Cleanup() + RETURN + END IF + InitInData_SD%SoilStiffness = SlD%p%Stiffness + endif + ! make a copy of the SoilMesh to pass over + if (SlD%Input(1)%SoilMesh%Initialized) then + CALL MeshCopy ( SrcMesh = SlD%Input(1)%SoilMesh & + , DestMesh = InitInData_SD%SoilMesh & + , CtrlCode = MESH_COUSIN & + , IOS = COMPONENT_OUTPUT & + , ErrStat = ErrStat2 & + , ErrMess = ErrMsg2 ) + endif + endif CALL SD_Init( InitInData_SD, SD%Input(1), SD%p, SD%x(STATE_CURR), SD%xd(STATE_CURR), SD%z(STATE_CURR), & SD%OtherSt(STATE_CURR), SD%y, SD%m, p_FAST%dt_module( MODULE_SD ), InitOutData_SD, ErrStat2, ErrMsg2 ) @@ -926,43 +984,6 @@ SUBROUTINE FAST_InitializeAll( t_initial, p_FAST, y_FAST, m_FAST, ED, BD, SrvD, END IF - ! ........................ - ! initialize SoilDyn - ! ........................ - ALLOCATE( SlD%Input( p_FAST%InterpOrder+1 ), SlD%InputTimes( p_FAST%InterpOrder+1 ), STAT = ErrStat2 ) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal,"Error allocating SlD%Input and SlD%InputTimes.",ErrStat,ErrMsg,RoutineName) - CALL Cleanup() - RETURN - END IF - - IF ( p_FAST%CompSoil == Module_SlD .and. p_FAST%CompSub == Module_SD ) THEN - - IF ( p_FAST%CompHydro == Module_HD ) THEN - InitInData_SlD%WtrDpth = InitOutData_HD%WtrDpth - ELSE - InitInData_SlD%WtrDpth = 0.0_ReKi - END IF - - !InitInData_SlD%UseInputFile = .TRUE. - InitInData_SlD%InputFile = p_FAST%SoilFile - InitInData_SlD%RootName = p_FAST%OutFileRoot - - CALL SlD_Init( InitInData_SlD, SlD%Input(1), SlD%p, SlD%x(STATE_CURR), SlD%xd(STATE_CURR), SlD%z(STATE_CURR), & - SlD%OtherSt(STATE_CURR), SlD%y, SlD%m, p_FAST%dt_module( MODULE_SlD ), InitOutData_SlD, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - p_FAST%ModuleInitialized(Module_SlD) = .TRUE. - CALL SetModuleSubstepTime(Module_SlD, p_FAST, y_FAST, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - IF (ErrStat >= AbortErrLev) THEN - CALL Cleanup() - RETURN - END IF - ! Add interfaces as we develop them. - END IF - ! ------------------------------ ! initialize CompMooring modules ! ------------------------------ diff --git a/modules/subdyn/src/SubDyn.f90 b/modules/subdyn/src/SubDyn.f90 index c15100f50..a62aa21fb 100644 --- a/modules/subdyn/src/SubDyn.f90 +++ b/modules/subdyn/src/SubDyn.f90 @@ -193,6 +193,29 @@ SUBROUTINE SD_Init( InitInput, u, p, x, xd, z, OtherState, y, m, Interval, InitO ErrStat = ErrID_None ErrMsg = "" +!TODO: parse the SoilDyn inputs if any were passed +! SoilStiffness is dimensioned (6,6,N) +if (allocated(InitInput%SoilStiffness)) then +print*,' add logic for handling soilstiffness matrices from SoilDyn: ',size(InitInput%SoilStiffness,3),' points' +print*,' ',InitInput%SoilStiffness(1,1:6,1) +print*,' ',InitInput%SoilStiffness(2,1:6,1) +print*,' ',InitInput%SoilStiffness(3,1:6,1) +print*,' ',InitInput%SoilStiffness(4,1:6,1) +print*,' ',InitInput%SoilStiffness(5,1:6,1) +print*,' ',InitInput%SoilStiffness(6,1:6,1) +endif +! SoilMesh has N points. Correspond in order to the SoilStiffness matrices passed in +! %RefOrientation is the identity matrix (3,3,N) +! %Position is the reference position (3,N) +if (InitInput%SoilMesh%Initialized) then +print*,' add logic for handling soilMesh from SoilDyn: ',InitInput%SoilMesh%NNodes,' mesh nodes' +print*,InitInput%SoilMesh%Position +endif +! Maybe add some logic to check that these we have a match in dimensions +! Maybe some logic to make sure these points correspond roughly to nodes -- though this may not be true for a long pile into the soil with multiple connection points +! Note: F = -kx whre k is the relevant 6x6 matrix from SoilStiffness + + ! Initialize the NWTC Subroutine Library CALL NWTC_Init( ) diff --git a/modules/subdyn/src/SubDyn_Registry.txt b/modules/subdyn/src/SubDyn_Registry.txt index 859b2d0dc..055a2df51 100644 --- a/modules/subdyn/src/SubDyn_Registry.txt +++ b/modules/subdyn/src/SubDyn_Registry.txt @@ -21,6 +21,8 @@ typedef ^ InitInputType ReKi g - - - "Gravity acceleration" typedef ^ InitInputType ReKi WtrDpth - - - "Water Depth (positive valued)" typedef ^ InitInputType ReKi TP_RefPoint {3} - - "global position of transition piece reference point (could also be defined in SubDyn itself)" typedef ^ InitInputType ReKi SubRotateZ - - - "Rotation angle in degrees about global Z" +typedef ^ InitInputType ReKi SoilStiffness ::: - - "Soil stiffness matrices from SoilDyn" '(N/m, N-m/rad)' +typedef ^ InitInputType MeshType SoilMesh - - - "Mesh for soil stiffness locations" - # ============================== Define Initialization outputs here: ============================================================================================================================================ typedef ^ InitOutputType CHARACTER(ChanLen) WriteOutputHdr {:} - - "Names of the output-to-file channels" - diff --git a/modules/subdyn/src/SubDyn_Types.f90 b/modules/subdyn/src/SubDyn_Types.f90 index a60295d4a..867f16dce 100644 --- a/modules/subdyn/src/SubDyn_Types.f90 +++ b/modules/subdyn/src/SubDyn_Types.f90 @@ -46,6 +46,8 @@ MODULE SubDyn_Types REAL(ReKi) :: WtrDpth !< Water Depth (positive valued) [-] REAL(ReKi) , DIMENSION(1:3) :: TP_RefPoint !< global position of transition piece reference point (could also be defined in SubDyn itself) [-] REAL(ReKi) :: SubRotateZ !< Rotation angle in degrees about global Z [-] + REAL(ReKi) , DIMENSION(:,:,:), ALLOCATABLE :: SoilStiffness !< Soil stiffness matrices from SoilDyn ['(N/m,] + TYPE(MeshType) :: SoilMesh !< Mesh for soil stiffness locations [-] END TYPE SD_InitInputType ! ======================= ! ========= SD_InitOutputType ======= @@ -497,7 +499,7 @@ SUBROUTINE SD_UnPackIList( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg END SUBROUTINE SD_UnPackIList SUBROUTINE SD_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, ErrStat, ErrMsg ) - TYPE(SD_InitInputType), INTENT(IN) :: SrcInitInputData + TYPE(SD_InitInputType), INTENT(INOUT) :: SrcInitInputData TYPE(SD_InitInputType), INTENT(INOUT) :: DstInitInputData INTEGER(IntKi), INTENT(IN ) :: CtrlCode INTEGER(IntKi), INTENT( OUT) :: ErrStat @@ -505,6 +507,8 @@ SUBROUTINE SD_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, ErrSt ! Local INTEGER(IntKi) :: i,j,k INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 + INTEGER(IntKi) :: i2, i2_l, i2_u ! bounds (upper/lower) for an array dimension 2 + INTEGER(IntKi) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'SD_CopyInitInput' @@ -517,6 +521,25 @@ SUBROUTINE SD_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, ErrSt DstInitInputData%WtrDpth = SrcInitInputData%WtrDpth DstInitInputData%TP_RefPoint = SrcInitInputData%TP_RefPoint DstInitInputData%SubRotateZ = SrcInitInputData%SubRotateZ +IF (ALLOCATED(SrcInitInputData%SoilStiffness)) THEN + i1_l = LBOUND(SrcInitInputData%SoilStiffness,1) + i1_u = UBOUND(SrcInitInputData%SoilStiffness,1) + i2_l = LBOUND(SrcInitInputData%SoilStiffness,2) + i2_u = UBOUND(SrcInitInputData%SoilStiffness,2) + i3_l = LBOUND(SrcInitInputData%SoilStiffness,3) + i3_u = UBOUND(SrcInitInputData%SoilStiffness,3) + IF (.NOT. ALLOCATED(DstInitInputData%SoilStiffness)) THEN + ALLOCATE(DstInitInputData%SoilStiffness(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitInputData%SoilStiffness.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInitInputData%SoilStiffness = SrcInitInputData%SoilStiffness +ENDIF + CALL MeshCopy( SrcInitInputData%SoilMesh, DstInitInputData%SoilMesh, CtrlCode, ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat>=AbortErrLev) RETURN END SUBROUTINE SD_CopyInitInput SUBROUTINE SD_DestroyInitInput( InitInputData, ErrStat, ErrMsg ) @@ -528,6 +551,10 @@ SUBROUTINE SD_DestroyInitInput( InitInputData, ErrStat, ErrMsg ) ! ErrStat = ErrID_None ErrMsg = "" +IF (ALLOCATED(InitInputData%SoilStiffness)) THEN + DEALLOCATE(InitInputData%SoilStiffness) +ENDIF + CALL MeshDestroy( InitInputData%SoilMesh, ErrStat, ErrMsg ) END SUBROUTINE SD_DestroyInitInput SUBROUTINE SD_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, SizeOnly ) @@ -571,6 +598,29 @@ SUBROUTINE SD_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg Re_BufSz = Re_BufSz + 1 ! WtrDpth Re_BufSz = Re_BufSz + SIZE(InData%TP_RefPoint) ! TP_RefPoint Re_BufSz = Re_BufSz + 1 ! SubRotateZ + Int_BufSz = Int_BufSz + 1 ! SoilStiffness allocated yes/no + IF ( ALLOCATED(InData%SoilStiffness) ) THEN + Int_BufSz = Int_BufSz + 2*3 ! SoilStiffness upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%SoilStiffness) ! SoilStiffness + END IF + ! Allocate buffers for subtypes, if any (we'll get sizes from these) + Int_BufSz = Int_BufSz + 3 ! SoilMesh: size of buffers for each call to pack subtype + CALL MeshPack( InData%SoilMesh, Re_Buf, Db_Buf, Int_Buf, ErrStat2, ErrMsg2, .TRUE. ) ! SoilMesh + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ErrStat >= AbortErrLev) RETURN + + IF(ALLOCATED(Re_Buf)) THEN ! SoilMesh + Re_BufSz = Re_BufSz + SIZE( Re_Buf ) + DEALLOCATE(Re_Buf) + END IF + IF(ALLOCATED(Db_Buf)) THEN ! SoilMesh + Db_BufSz = Db_BufSz + SIZE( Db_Buf ) + DEALLOCATE(Db_Buf) + END IF + IF(ALLOCATED(Int_Buf)) THEN ! SoilMesh + Int_BufSz = Int_BufSz + SIZE( Int_Buf ) + DEALLOCATE(Int_Buf) + END IF IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) THEN @@ -614,6 +664,53 @@ SUBROUTINE SD_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg Re_Xferred = Re_Xferred + SIZE(InData%TP_RefPoint) ReKiBuf ( Re_Xferred:Re_Xferred+(1)-1 ) = InData%SubRotateZ Re_Xferred = Re_Xferred + 1 + IF ( .NOT. ALLOCATED(InData%SoilStiffness) ) 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%SoilStiffness,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%SoilStiffness,1) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%SoilStiffness,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%SoilStiffness,2) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%SoilStiffness,3) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%SoilStiffness,3) + Int_Xferred = Int_Xferred + 2 + + IF (SIZE(InData%SoilStiffness)>0) ReKiBuf ( Re_Xferred:Re_Xferred+(SIZE(InData%SoilStiffness))-1 ) = PACK(InData%SoilStiffness,.TRUE.) + Re_Xferred = Re_Xferred + SIZE(InData%SoilStiffness) + END IF + CALL MeshPack( InData%SoilMesh, Re_Buf, Db_Buf, Int_Buf, ErrStat2, ErrMsg2, OnlySize ) ! SoilMesh + 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 END SUBROUTINE SD_PackInitInput SUBROUTINE SD_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) @@ -636,6 +733,8 @@ SUBROUTINE SD_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Err LOGICAL, ALLOCATABLE :: mask4(:,:,:,:) LOGICAL, ALLOCATABLE :: mask5(:,:,:,:,:) INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 + INTEGER(IntKi) :: i2, i2_l, i2_u ! bounds (upper/lower) for an array dimension 2 + INTEGER(IntKi) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'SD_UnPackInitInput' @@ -674,6 +773,75 @@ SUBROUTINE SD_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Err DEALLOCATE(mask1) OutData%SubRotateZ = ReKiBuf( Re_Xferred ) Re_Xferred = Re_Xferred + 1 + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! SoilStiffness 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 + i2_l = IntKiBuf( Int_Xferred ) + i2_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + i3_l = IntKiBuf( Int_Xferred ) + i3_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ALLOCATED(OutData%SoilStiffness)) DEALLOCATE(OutData%SoilStiffness) + ALLOCATE(OutData%SoilStiffness(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%SoilStiffness.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + ALLOCATE(mask3(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating mask3.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + mask3 = .TRUE. + IF (SIZE(OutData%SoilStiffness)>0) OutData%SoilStiffness = UNPACK(ReKiBuf( Re_Xferred:Re_Xferred+(SIZE(OutData%SoilStiffness))-1 ), mask3, 0.0_ReKi ) + Re_Xferred = Re_Xferred + SIZE(OutData%SoilStiffness) + DEALLOCATE(mask3) + END IF + 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 MeshUnpack( OutData%SoilMesh, Re_Buf, Db_Buf, Int_Buf, ErrStat2, ErrMsg2 ) ! SoilMesh + 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) END SUBROUTINE SD_UnPackInitInput SUBROUTINE SD_CopyInitOutput( SrcInitOutputData, DstInitOutputData, CtrlCode, ErrStat, ErrMsg ) From 210b06f962e787365ca0eb9e5789e1f1cf2a06fc Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 16 Jun 2020 14:18:24 -0600 Subject: [PATCH 106/136] SlD: add option for only returning non-linear portion of reaction forces --- modules/soildyn/src/SoilDyn.f90 | 37 +++++++++++++++---- modules/soildyn/src/SoilDyn_Registry.txt | 3 +- modules/soildyn/src/SoilDyn_Types.f90 | 14 +++++++ modules/soildyn/src/driver/SoilDyn_Driver.f90 | 1 + .../src/driver/SoilDyn_Driver_Subs.f90 | 13 ++++++- .../src/driver/SoilDyn_Driver_Types.f90 | 1 + 6 files changed, 59 insertions(+), 10 deletions(-) diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index 35e483892..62f5d3d4c 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -117,8 +117,10 @@ subroutine SlD_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOu z%DummyConstrState = 0.0_ReKi OtherState%DummyOtherState = 0.0_ReKi + ! are the returned reaction forces only the non-linear portion (used when SubDyn is calculating the linear portion) + p%SlDNonLinearForcePortionOnly = InitInp%SlDNonLinearForcePortionOnly + if (p%SlDNonLinearForcePortionOnly) call WrScr(' SoilDyn returning only non-linear portion of reaction forces') -!FIXME: set some initial values of y and u here) if (InitInp%Linearize) then @@ -510,6 +512,7 @@ subroutine SlD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg real(ReKi) :: AllOuts(0:MaxOutPts) real(R8Ki) :: Displacement(6) real(R8Ki) :: Force(6) + real(R8Ki) :: ForceLinear(6) integer(IntKi) :: i !< generic counter ! Initialize ErrStat @@ -527,14 +530,21 @@ subroutine SlD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ! Calculate reaction with F = k*dX Force = matmul(p%Stiffness(1:6,1:6,i), Displacement) - + if (p%SlDNonLinearForcePortionOnly) then + ForceLinear = matmul(p%Stiffness(1:6,1:6,i), Displacement) + endif + + ! TODO: add damping term effects here + ! Return reaction force onto the resulting point mesh - y%SoilMesh%Force (1,i) = -real(Force(1),ReKi) - y%SoilMesh%Force (2,i) = -real(Force(2),ReKi) - y%SoilMesh%Force (3,i) = -real(Force(3),ReKi) - y%SoilMesh%Moment(1,i) = -real(Force(4),ReKi) - y%SoilMesh%Moment(2,i) = -real(Force(5),ReKi) - y%SoilMesh%Moment(3,i) = -real(Force(6),ReKi) + y%SoilMesh%Force (1:3,i) = -real(Force(1:3),ReKi) + y%SoilMesh%Moment(1:3,i) = -real(Force(4:6),ReKi) + + ! Subrtract out the linear piece here + if (p%SlDNonLinearForcePortionOnly) then + y%SoilMesh%Force (1:3,i) = y%SoilMesh%Force (1:3,i) + real(ForceLinear(1:3),ReKi) + y%SoilMesh%Moment(1:3,i) = y%SoilMesh%Moment(1:3,i) + real(ForceLinear(4:6),ReKi) + endif enddo case (Calc_PYcurve) @@ -552,11 +562,22 @@ subroutine SlD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg Displacement(1:3) = u%SoilMesh%TranslationDisp(1:3,i) ! Translations -- This is R8Ki in the mesh Displacement(4:6) = GetSmllRotAngs(u%SoilMesh%Orientation(1:3,1:3,i), ErrStat2, ErrMsg2); if (Failed()) return; ! Small angle assumption should be valid here -- Note we are assuming reforientation is identity + ! Linear portion of the stiffness reaction (NOTE: the DLL stiffness info is stored in parameters + if (p%SlDNonLinearForcePortionOnly) then + ForceLinear = matmul(p%Stiffness(1:6,1:6,i), Displacement) + endif + call REDWINinterface_CalcOutput( p%DLL_Trgt, p%DLL_Model, Displacement, Force, m%dll_data(i), ErrStat2, ErrMsg2 ); if (Failed()) return; ! Return reaction force onto the resulting point mesh y%SoilMesh%Force (1:3,i) = -real(Force(1:3),ReKi) y%SoilMesh%Moment(1:3,i) = -real(Force(4:6),ReKi) + + ! Subrtract out the linear piece here + if (p%SlDNonLinearForcePortionOnly) then + y%SoilMesh%Force (1:3,i) = y%SoilMesh%Force (1:3,i) + real(ForceLinear(1:3),ReKi) + y%SoilMesh%Moment(1:3,i) = y%SoilMesh%Moment(1:3,i) + real(ForceLinear(4:6),ReKi) + endif enddo end select diff --git a/modules/soildyn/src/SoilDyn_Registry.txt b/modules/soildyn/src/SoilDyn_Registry.txt index 187b894f6..f6f6e202b 100644 --- a/modules/soildyn/src/SoilDyn_Registry.txt +++ b/modules/soildyn/src/SoilDyn_Registry.txt @@ -72,6 +72,7 @@ typedef ^ InitInputType CHARACTER(1024) InputFile - - - typedef ^ InitInputType CHARACTER(1024) RootName - - - "Root name of the input file" - typedef ^ InitInputType LOGICAL Linearize - .FALSE. - "Flag that tells this module if the glue code wants to linearize." - typedef ^ InitInputType ReKi WtrDpth - - - "Water depth to mudline (global coordinates)" '(m)' +typedef ^ InitInputType logical SlDNonLinearForcePortionOnly - .FALSE. - "Only the non-linear portion of the reaction forces is returned" - # Define outputs from the initialization routine here: typedef ^ InitOutputType CHARACTER(ChanLen) WriteOutputHdr {:} - - "Names of the output-to-file channels" - @@ -131,7 +132,7 @@ typedef ^ ParameterType ReKi WtrDepth typedef ^ ParameterType R8Ki Stiffness ::: - - "Stiffness matrix" '(N/m, N-m/rad)' #typedef ^ ParameterType R8Ki Damping ::: - - "Damping matrix" '(N/m, N-m/rad)' typedef ^ ParameterType logical DLL_OnlyStiff - - - "Use only the stiffness matrix in calculating the restoring forces" - - +typedef ^ ParameterType logical SlDNonLinearForcePortionOnly - .FALSE. - "Only the non-linear portion of the reaction forces is returned" - # ..... Inputs .................................................................................................................... typedef ^ InputType MeshType SoilMesh - - - "Mesh of soil contact points" - diff --git a/modules/soildyn/src/SoilDyn_Types.f90 b/modules/soildyn/src/SoilDyn_Types.f90 index e9856f81f..44264bd4f 100644 --- a/modules/soildyn/src/SoilDyn_Types.f90 +++ b/modules/soildyn/src/SoilDyn_Types.f90 @@ -90,6 +90,7 @@ MODULE SoilDyn_Types CHARACTER(1024) :: RootName !< Root name of the input file [-] LOGICAL :: Linearize = .FALSE. !< Flag that tells this module if the glue code wants to linearize. [-] REAL(ReKi) :: WtrDpth !< Water depth to mudline (global coordinates) ['(m)'] + LOGICAL :: SlDNonLinearForcePortionOnly = .FALSE. !< Only the non-linear portion of the reaction forces is returned [-] END TYPE SlD_InitInputType ! ======================= ! ========= SlD_InitOutputType ======= @@ -143,6 +144,7 @@ MODULE SoilDyn_Types REAL(ReKi) :: WtrDepth !< Water depth to mudline (global coordinates) ['(m)'] REAL(R8Ki) , DIMENSION(:,:,:), ALLOCATABLE :: Stiffness !< Stiffness matrix ['(N/m,] LOGICAL :: DLL_OnlyStiff !< Use only the stiffness matrix in calculating the restoring forces [-] + LOGICAL :: SlDNonLinearForcePortionOnly = .FALSE. !< Only the non-linear portion of the reaction forces is returned [-] END TYPE SlD_ParameterType ! ======================= ! ========= SlD_InputType ======= @@ -1434,6 +1436,7 @@ SUBROUTINE SlD_CopyInitInput( SrcInitInputData, DstInitInputData, CtrlCode, ErrS DstInitInputData%RootName = SrcInitInputData%RootName DstInitInputData%Linearize = SrcInitInputData%Linearize DstInitInputData%WtrDpth = SrcInitInputData%WtrDpth + DstInitInputData%SlDNonLinearForcePortionOnly = SrcInitInputData%SlDNonLinearForcePortionOnly END SUBROUTINE SlD_CopyInitInput SUBROUTINE SlD_DestroyInitInput( InitInputData, ErrStat, ErrMsg ) @@ -1486,6 +1489,7 @@ SUBROUTINE SlD_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs Int_BufSz = Int_BufSz + 1*LEN(InData%RootName) ! RootName Int_BufSz = Int_BufSz + 1 ! Linearize Re_BufSz = Re_BufSz + 1 ! WtrDpth + Int_BufSz = Int_BufSz + 1 ! SlDNonLinearForcePortionOnly IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) THEN @@ -1525,6 +1529,8 @@ SUBROUTINE SlD_PackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMs Int_Xferred = Int_Xferred + 1 ReKiBuf ( Re_Xferred:Re_Xferred+(1)-1 ) = InData%WtrDpth Re_Xferred = Re_Xferred + 1 + IntKiBuf ( Int_Xferred:Int_Xferred+1-1 ) = TRANSFER( InData%SlDNonLinearForcePortionOnly , IntKiBuf(1), 1) + Int_Xferred = Int_Xferred + 1 END SUBROUTINE SlD_PackInitInput SUBROUTINE SlD_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) @@ -1571,6 +1577,8 @@ SUBROUTINE SlD_UnPackInitInput( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, Er Int_Xferred = Int_Xferred + 1 OutData%WtrDpth = ReKiBuf( Re_Xferred ) Re_Xferred = Re_Xferred + 1 + OutData%SlDNonLinearForcePortionOnly = TRANSFER( IntKiBuf( Int_Xferred ), mask0 ) + Int_Xferred = Int_Xferred + 1 END SUBROUTINE SlD_UnPackInitInput SUBROUTINE SlD_CopyInitOutput( SrcInitOutputData, DstInitOutputData, CtrlCode, ErrStat, ErrMsg ) @@ -2990,6 +2998,7 @@ SUBROUTINE SlD_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg DstParamData%Stiffness = SrcParamData%Stiffness ENDIF DstParamData%DLL_OnlyStiff = SrcParamData%DLL_OnlyStiff + DstParamData%SlDNonLinearForcePortionOnly = SrcParamData%SlDNonLinearForcePortionOnly END SUBROUTINE SlD_CopyParam SUBROUTINE SlD_DestroyParam( ParamData, ErrStat, ErrMsg ) @@ -3107,6 +3116,7 @@ SUBROUTINE SlD_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, S Db_BufSz = Db_BufSz + SIZE(InData%Stiffness) ! Stiffness END IF Int_BufSz = Int_BufSz + 1 ! DLL_OnlyStiff + Int_BufSz = Int_BufSz + 1 ! SlDNonLinearForcePortionOnly IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) THEN @@ -3256,6 +3266,8 @@ SUBROUTINE SlD_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, S END IF IntKiBuf ( Int_Xferred:Int_Xferred+1-1 ) = TRANSFER( InData%DLL_OnlyStiff , IntKiBuf(1), 1) Int_Xferred = Int_Xferred + 1 + IntKiBuf ( Int_Xferred:Int_Xferred+1-1 ) = TRANSFER( InData%SlDNonLinearForcePortionOnly , IntKiBuf(1), 1) + Int_Xferred = Int_Xferred + 1 END SUBROUTINE SlD_PackParam SUBROUTINE SlD_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) @@ -3452,6 +3464,8 @@ SUBROUTINE SlD_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg END IF OutData%DLL_OnlyStiff = TRANSFER( IntKiBuf( Int_Xferred ), mask0 ) Int_Xferred = Int_Xferred + 1 + OutData%SlDNonLinearForcePortionOnly = TRANSFER( IntKiBuf( Int_Xferred ), mask0 ) + Int_Xferred = Int_Xferred + 1 END SUBROUTINE SlD_UnPackParam SUBROUTINE SlD_CopyInput( SrcInputData, DstInputData, CtrlCode, ErrStat, ErrMsg ) diff --git a/modules/soildyn/src/driver/SoilDyn_Driver.f90 b/modules/soildyn/src/driver/SoilDyn_Driver.f90 index a4c01926c..c3c3107d9 100644 --- a/modules/soildyn/src/driver/SoilDyn_Driver.f90 +++ b/modules/soildyn/src/driver/SoilDyn_Driver.f90 @@ -261,6 +261,7 @@ PROGRAM SoilDyn_Driver !............................................................................................................................... InitInData%InputFile = Settings%SldIptFileName + InitInData%SlDNonLinearForcePortionOnly = SettingsFlags%SlDNonLinearForcePortionOnly ! Initialize the module CALL SlD_Init( InitInData, u(1), p, x, xd, z, OtherState, y, misc, TimeInterval, InitOutData, ErrStat, ErrMsg ) diff --git a/modules/soildyn/src/driver/SoilDyn_Driver_Subs.f90 b/modules/soildyn/src/driver/SoilDyn_Driver_Subs.f90 index 03c4f9b61..8a1e6086d 100644 --- a/modules/soildyn/src/driver/SoilDyn_Driver_Subs.f90 +++ b/modules/soildyn/src/driver/SoilDyn_Driver_Subs.f90 @@ -48,6 +48,7 @@ SUBROUTINE DispHelpText() CALL WrScr(" "//SwChar//"TSteps[#] -- number of timesteps ") CALL WrScr(" "//SwChar//"v -- verbose output ") CALL WrScr(" "//SwChar//"vv -- very verbose output ") + CALL WrScr(" "//SwChar//"NonLinear -- only return non-linear portion of reaction force") CALL WrScr(" "//SwChar//"help -- print this help menu and exit") CALL WrScr("") CALL WrScr(" Notes:") @@ -85,6 +86,7 @@ subroutine InitSettingsFlags( ProgInfo, CLSettings, CLFlags ) CLFlags%DTDefault = .FALSE. ! specified 'DEFAULT' for resolution in time CLFlags%Verbose = .FALSE. ! Turn on verbose error reporting? CLFlags%VVerbose = .FALSE. ! Turn on very verbose error reporting? + CLFlags%SlDNonLinearForcePortionOnly = .FALSE. ! Report only non-linear portion of forces end subroutine InitSettingsFlags @@ -278,7 +280,10 @@ SUBROUTINE ParseArg( CLSettings, CLFlags, ThisArgUC, ThisArg, sldFlagSet, ErrSta ! If no delimeters were given, than this option is simply a flag IF ( Delim1 == 0_IntKi ) THEN ! check to see if the filename is the name of the SlD input file - IF ( ThisArgUC(1:3) == "SLD" ) THEN + IF ( ThisArgUC(1:9) == "NONLINEAR" ) THEN + CLFlags%SlDNonLinearForcePortionOnly = .TRUE. + RETURN + ELSEIF ( ThisArgUC(1:3) == "SLD" ) THEN sldFlagSet = .TRUE. ! More logic in the routine that calls this one to set things. RETURN ELSEIF ( ThisArgUC(1:2) == "VV" ) THEN @@ -549,6 +554,12 @@ SUBROUTINE ReadDvrIptFile( DvrFileName, DvrFlags, DvrSettings, ProgInfo, ErrStat ErrStatTmp,ErrMsgTmp, UnEchoLocal ) if (Failed()) return + ! Non-linear reaction portion only + CALL ReadVar( UnIn, FileName,DvrFlags%SlDNonLinearForcePortionOnly,'SlDNonLinearForcePortionOnly',' Only report the non-linear portion of the reaction force.', & + ErrStatTmp,ErrMsgTmp, UnEchoLocal ) + if (Failed()) return + + !------------------------------------------------------------------------------------------------- ! SoilDyn time series input -- this is read from a file of 7 columns (time and 6 dof) diff --git a/modules/soildyn/src/driver/SoilDyn_Driver_Types.f90 b/modules/soildyn/src/driver/SoilDyn_Driver_Types.f90 index ac608b3c6..c9ffd38e5 100644 --- a/modules/soildyn/src/driver/SoilDyn_Driver_Types.f90 +++ b/modules/soildyn/src/driver/SoilDyn_Driver_Types.f90 @@ -50,6 +50,7 @@ MODULE SoilDyn_Driver_Types LOGICAL :: DTDefault = .FALSE. !< specified a 'DEFAULT' for the time resolution LOGICAL :: Verbose = .FALSE. !< Verbose error reporting LOGICAL :: VVerbose = .FALSE. !< Very Verbose error reporting + LOGICAL :: SlDNonLinearForcePortionOnly = .FALSE. !< To only return the non-linear portion of the reaction force END TYPE SlDDriver_Flags From 00d4424897288580a558fb24356f119d24f54b11 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 16 Jun 2020 14:49:24 -0600 Subject: [PATCH 107/136] SoilDyn: set SlD_Init flag for non-linear portion Reset this once SubDyn handles the linear piece --- modules/openfast-library/src/FAST_Subs.f90 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/openfast-library/src/FAST_Subs.f90 b/modules/openfast-library/src/FAST_Subs.f90 index 6a23ffced..3b24d2229 100644 --- a/modules/openfast-library/src/FAST_Subs.f90 +++ b/modules/openfast-library/src/FAST_Subs.f90 @@ -865,6 +865,8 @@ SUBROUTINE FAST_InitializeAll( t_initial, p_FAST, y_FAST, m_FAST, ED, BD, SrvD, !InitInData_SlD%UseInputFile = .TRUE. InitInData_SlD%InputFile = p_FAST%SoilFile InitInData_SlD%RootName = p_FAST%OutFileRoot +print*,'FIXME: FAST_SUBS:SlD_Init: reset the SoilDynNonLinearOnly once SubDyn can handle the linear soil reaction' + InitInData_SlD%SlDNonLinearForcePortionOnly = .FALSE. ! SoilDyn will only return the Non-Linear portion of the reaction force CALL SlD_Init( InitInData_SlD, SlD%Input(1), SlD%p, SlD%x(STATE_CURR), SlD%xd(STATE_CURR), SlD%z(STATE_CURR), & SlD%OtherSt(STATE_CURR), SlD%y, SlD%m, p_FAST%dt_module( MODULE_SlD ), InitOutData_SlD, ErrStat2, ErrMsg2 ) From 63771d6764568de0ca2f6c2034a169582ed0043f Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 16 Jun 2020 15:42:13 -0600 Subject: [PATCH 108/136] SlD: Output node forces include linear terms Even if what is passed out on the mesh does not include the linear terms --- modules/soildyn/src/SoilDyn.f90 | 25 ++++----- modules/soildyn/src/SoilDyn_IO.f90 | 6 +-- modules/soildyn/src/SoilDyn_Registry.txt | 1 + modules/soildyn/src/SoilDyn_Types.f90 | 67 ++++++++++++++++++++++++ 4 files changed, 84 insertions(+), 15 deletions(-) diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index 62f5d3d4c..869c9d32c 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -136,11 +136,11 @@ subroutine SlD_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOu end if - ! Set miscvars: including dll_data arrays and checking for input files. - call SlD_InitStatesMisc( InputFileData, m, xd, ErrStat2,ErrMsg2); if (Failed()) return; + call SlD_InitMeshes( InputFileData, u, y, p, m, ErrStat2,ErrMsg2); if (Failed()) return; - call SlD_InitMeshes( InputFileData, InitInp, u, y, p, m, ErrStat2,ErrMsg2); if (Failed()) return; + ! Set miscvars: including dll_data arrays and checking for input files. + call SlD_InitStatesMisc( InputFileData, m, xd, ErrStat2,ErrMsg2); if (Failed()) return; ! Setup and initialize the Calc Options @@ -227,6 +227,9 @@ subroutine SlD_InitStatesMisc( InputFileData, m, xd, ErrStat, ErrMsg ) ErrStat = ErrID_None ErrMsg = '' + call AllocAry(m%ForceTotal,6,p%NumPoints,'ForceTotal array for output', ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + select case(p%CalcOption) case (Calc_StiffDamp) allocate( xd%dll_states(1), STAT=ErrStat2 ) @@ -275,9 +278,8 @@ subroutine SlD_InitStatesMisc( InputFileData, m, xd, ErrStat, ErrMsg ) if (ErrStat >= AbortErrLev) return end subroutine SlD_InitStatesMisc - subroutine SlD_InitMeshes( InputFileData, InitInp, u, y, p, m, ErrStat, ErrMsg ) + subroutine SlD_InitMeshes( InputFileData, u, y, p, m, ErrStat, ErrMsg ) type(SlD_InputFile), intent(in ) :: InputFileData !< Data stored in the module's input file - type(SlD_InitInputType), intent(in ) :: InitInp !< Input data for initialization routine type(SlD_InputType), intent(inout) :: u !< An initial guess for the input; input mesh must be defined type(SlD_OutputType), intent(inout) :: y !< Initial system outputs type(SlD_ParameterType), intent(inout) :: p !< Parameters @@ -511,7 +513,6 @@ subroutine SlD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg real(ReKi) :: AllOuts(0:MaxOutPts) real(R8Ki) :: Displacement(6) - real(R8Ki) :: Force(6) real(R8Ki) :: ForceLinear(6) integer(IntKi) :: i !< generic counter @@ -529,7 +530,7 @@ subroutine SlD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg Displacement(4:6) = GetSmllRotAngs(u%SoilMesh%Orientation(1:3,1:3,i), ErrStat2, ErrMsg2); if (Failed()) return; ! Calculate reaction with F = k*dX - Force = matmul(p%Stiffness(1:6,1:6,i), Displacement) + m%ForceTotal(1:6,i) = matmul(p%Stiffness(1:6,1:6,i), Displacement) if (p%SlDNonLinearForcePortionOnly) then ForceLinear = matmul(p%Stiffness(1:6,1:6,i), Displacement) endif @@ -537,8 +538,8 @@ subroutine SlD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ! TODO: add damping term effects here ! Return reaction force onto the resulting point mesh - y%SoilMesh%Force (1:3,i) = -real(Force(1:3),ReKi) - y%SoilMesh%Moment(1:3,i) = -real(Force(4:6),ReKi) + y%SoilMesh%Force (1:3,i) = -real(m%ForceTotal(1:3,i),ReKi) + y%SoilMesh%Moment(1:3,i) = -real(m%ForceTotal(4:6,i),ReKi) ! Subrtract out the linear piece here if (p%SlDNonLinearForcePortionOnly) then @@ -567,11 +568,11 @@ subroutine SlD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ForceLinear = matmul(p%Stiffness(1:6,1:6,i), Displacement) endif - call REDWINinterface_CalcOutput( p%DLL_Trgt, p%DLL_Model, Displacement, Force, m%dll_data(i), ErrStat2, ErrMsg2 ); if (Failed()) return; + call REDWINinterface_CalcOutput( p%DLL_Trgt, p%DLL_Model, Displacement, m%ForceTotal(1:6,i), m%dll_data(i), ErrStat2, ErrMsg2 ); if (Failed()) return; ! Return reaction force onto the resulting point mesh - y%SoilMesh%Force (1:3,i) = -real(Force(1:3),ReKi) - y%SoilMesh%Moment(1:3,i) = -real(Force(4:6),ReKi) + y%SoilMesh%Force (1:3,i) = -real(m%ForceTotal(1:3,i),ReKi) + y%SoilMesh%Moment(1:3,i) = -real(m%ForceTotal(4:6,i),ReKi) ! Subrtract out the linear piece here if (p%SlDNonLinearForcePortionOnly) then diff --git a/modules/soildyn/src/SoilDyn_IO.f90 b/modules/soildyn/src/SoilDyn_IO.f90 index 243706ca9..93bd7146a 100644 --- a/modules/soildyn/src/SoilDyn_IO.f90 +++ b/modules/soildyn/src/SoilDyn_IO.f90 @@ -847,12 +847,12 @@ subroutine SlD_WriteOutput(p, AllOuts, u, y, m, ErrStat, ErrMsg ) do i=1,p%NumPoints ! Forces do j=1,3 - AllOuts( SoilPtF(j ,i) ) = y%SoilMesh%Force(j,i) / 1000.0_ReKi + AllOuts( SoilPtF(j,i) ) = -m%ForceTotal(j,i) / 1000.0_ReKi enddo ! Moments - do j=1,3 - AllOuts( SoilPtF(j+3,i) ) = y%SoilMesh%Moment(j,i) / 1000.0_ReKi + do j=4,6 + AllOuts( SoilPtF(j,i) ) = -m%ForceTotal(j,i) / 1000.0_ReKi enddo ! Translation displacement diff --git a/modules/soildyn/src/SoilDyn_Registry.txt b/modules/soildyn/src/SoilDyn_Registry.txt index f6f6e202b..2bea3410d 100644 --- a/modules/soildyn/src/SoilDyn_Registry.txt +++ b/modules/soildyn/src/SoilDyn_Registry.txt @@ -110,6 +110,7 @@ typedef ^ OtherStateType IntKi DummyOtherState - - - "Re # Define any data that are used only for efficiency purposes (these variables are not associated with time): # e.g. indices for searching in an array, large arrays that are local variables in any routine called multiple times, etc. typedef ^ MiscVarType REDWINdllType dll_data : - - "data used for REDWIN DLL" - +typedef ^ MiscVarType R8Ki ForceTotal :: - - "Total reaction force at each node" - # ..... Parameters ................................................................................................................ diff --git a/modules/soildyn/src/SoilDyn_Types.f90 b/modules/soildyn/src/SoilDyn_Types.f90 index 44264bd4f..e8269293a 100644 --- a/modules/soildyn/src/SoilDyn_Types.f90 +++ b/modules/soildyn/src/SoilDyn_Types.f90 @@ -124,6 +124,7 @@ MODULE SoilDyn_Types ! ========= SlD_MiscVarType ======= TYPE, PUBLIC :: SlD_MiscVarType TYPE(REDWINdllType) , DIMENSION(:), ALLOCATABLE :: dll_data !< data used for REDWIN DLL [-] + REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: ForceTotal !< Total reaction force at each node [-] END TYPE SlD_MiscVarType ! ======================= ! ========= SlD_ParameterType ======= @@ -2674,6 +2675,7 @@ SUBROUTINE SlD_CopyMisc( SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg ) ! Local INTEGER(IntKi) :: i,j,k INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 + INTEGER(IntKi) :: i2, i2_l, i2_u ! bounds (upper/lower) for an array dimension 2 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'SlD_CopyMisc' @@ -2695,6 +2697,20 @@ SUBROUTINE SlD_CopyMisc( SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN ENDDO +ENDIF +IF (ALLOCATED(SrcMiscData%ForceTotal)) THEN + i1_l = LBOUND(SrcMiscData%ForceTotal,1) + i1_u = UBOUND(SrcMiscData%ForceTotal,1) + i2_l = LBOUND(SrcMiscData%ForceTotal,2) + i2_u = UBOUND(SrcMiscData%ForceTotal,2) + IF (.NOT. ALLOCATED(DstMiscData%ForceTotal)) THEN + ALLOCATE(DstMiscData%ForceTotal(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%ForceTotal.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstMiscData%ForceTotal = SrcMiscData%ForceTotal ENDIF END SUBROUTINE SlD_CopyMisc @@ -2712,6 +2728,9 @@ SUBROUTINE SlD_DestroyMisc( MiscData, ErrStat, ErrMsg ) CALL SlD_Destroyredwindlltype( MiscData%dll_data(i1), ErrStat, ErrMsg ) ENDDO DEALLOCATE(MiscData%dll_data) +ENDIF +IF (ALLOCATED(MiscData%ForceTotal)) THEN + DEALLOCATE(MiscData%ForceTotal) ENDIF END SUBROUTINE SlD_DestroyMisc @@ -2774,6 +2793,11 @@ SUBROUTINE SlD_PackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, Si END IF END DO END IF + Int_BufSz = Int_BufSz + 1 ! ForceTotal allocated yes/no + IF ( ALLOCATED(InData%ForceTotal) ) THEN + Int_BufSz = Int_BufSz + 2*2 ! ForceTotal upper/lower bounds for each dimension + Db_BufSz = Db_BufSz + SIZE(InData%ForceTotal) ! ForceTotal + END IF IF ( Re_BufSz .GT. 0 ) THEN ALLOCATE( ReKiBuf( Re_BufSz ), STAT=ErrStat2 ) IF (ErrStat2 /= 0) THEN @@ -2842,6 +2866,22 @@ SUBROUTINE SlD_PackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, Si ENDIF END DO END IF + IF ( .NOT. ALLOCATED(InData%ForceTotal) ) 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%ForceTotal,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%ForceTotal,1) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%ForceTotal,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%ForceTotal,2) + Int_Xferred = Int_Xferred + 2 + + IF (SIZE(InData%ForceTotal)>0) DbKiBuf ( Db_Xferred:Db_Xferred+(SIZE(InData%ForceTotal))-1 ) = PACK(InData%ForceTotal,.TRUE.) + Db_Xferred = Db_Xferred + SIZE(InData%ForceTotal) + END IF END SUBROUTINE SlD_PackMisc SUBROUTINE SlD_UnPackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg ) @@ -2864,6 +2904,7 @@ SUBROUTINE SlD_UnPackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg LOGICAL, ALLOCATABLE :: mask4(:,:,:,:) LOGICAL, ALLOCATABLE :: mask5(:,:,:,:,:) INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 + INTEGER(IntKi) :: i2, i2_l, i2_u ! bounds (upper/lower) for an array dimension 2 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'SlD_UnPackMisc' @@ -2933,6 +2974,32 @@ SUBROUTINE SlD_UnPackMisc( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg IF(ALLOCATED(Int_Buf)) DEALLOCATE(Int_Buf) END DO END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! ForceTotal 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 + i2_l = IntKiBuf( Int_Xferred ) + i2_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ALLOCATED(OutData%ForceTotal)) DEALLOCATE(OutData%ForceTotal) + ALLOCATE(OutData%ForceTotal(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%ForceTotal.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + ALLOCATE(mask2(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating mask2.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + mask2 = .TRUE. + IF (SIZE(OutData%ForceTotal)>0) OutData%ForceTotal = REAL( UNPACK(DbKiBuf( Db_Xferred:Db_Xferred+(SIZE(OutData%ForceTotal))-1 ), mask2, 0.0_DbKi ), R8Ki) + Db_Xferred = Db_Xferred + SIZE(OutData%ForceTotal) + DEALLOCATE(mask2) + END IF END SUBROUTINE SlD_UnPackMisc SUBROUTINE SlD_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg ) From 9789ef7f2d5ed3b45f003b13322078fba2bf3957 Mon Sep 17 00:00:00 2001 From: Emmanuel Branlard Date: Wed, 17 Jun 2020 14:50:54 -0600 Subject: [PATCH 109/136] FlexSub: adding Soil stiffness --- modules/subdyn/src/SD_FEM.f90 | 76 +++++++++- modules/subdyn/src/SubDyn.f90 | 52 ++++--- modules/subdyn/src/SubDyn_Registry.txt | 3 + modules/subdyn/src/SubDyn_Types.f90 | 197 +++++++++++++++++++++++++ 4 files changed, 302 insertions(+), 26 deletions(-) diff --git a/modules/subdyn/src/SD_FEM.f90 b/modules/subdyn/src/SD_FEM.f90 index 366a3f945..62a37dbc0 100644 --- a/modules/subdyn/src/SD_FEM.f90 +++ b/modules/subdyn/src/SD_FEM.f90 @@ -1059,23 +1059,33 @@ INTEGER(IntKi) FUNCTION nDOF_Unconstrained() END SUBROUTINE AssembleKM !> Add soil stiffness and mass to global system matrices +!! Soil stiffness can come from two sources: +!! - "SSI" matrices (specified at reaction nodes) +!! - "Soil" matrices (specified at Initalization) SUBROUTINE InsertSoilMatrices(M, K, Init, p, ErrStat, ErrMsg, Substract) real(ReKi), dimension(:,:), intent(inout) :: M real(ReKi), dimension(:,:), intent(inout) :: K - type(SD_InitType), intent(in ) :: Init + type(SD_InitType), intent(inout) :: Init ! TODO look for closest indices elsewhere type(SD_ParameterType), intent(in ) :: p integer(IntKi), intent( out) :: ErrStat ! Error status of the operation character(*), intent( out) :: ErrMsg ! Error message if ErrStat /= ErrID_None logical, optional, intent(in ) :: SubStract ! If present, and if true, substract instead of adding - integer :: I, J, iiNode + integer :: I, J, iiNode, nDOF integer :: iDOF, jDOF, iNode !< DOF and node indices real(ReKi), dimension(6,6) :: K_soil, M_soil ! Auxiliary matrices for soil + real(ReKi) :: Dist ErrMsg = "" ErrStat = ErrID_None + ! --- SSI matrices ! TODO consider doing the 21 -> 6x6 conversion while reading ! 6x6 matrix goes to one node of one element only do iiNode = 1, p%nNodes_C ! loop on constrained nodes iNode = p%Nodes_C(iiNode,1) + nDOF=size(p%NodesDOF(iNode)%List) + if (nDOF/=6) then + ErrMsg='SSI soil matrix is to be inserted at SubDyn node '//Num2LStr(iNode)//', but this node has '//num2lstr(nDOF)//' DOFs'; + ErrStat=ErrID_Fatal; return + endif call Array21_to_6by6(Init%SSIK(:,iiNode), K_soil) call Array21_to_6by6(Init%SSIM(:,iiNode), M_soil) if (present(Substract)) then @@ -1093,6 +1103,46 @@ SUBROUTINE InsertSoilMatrices(M, K, Init, p, ErrStat, ErrMsg, Substract) enddo enddo enddo + ! --- "Soil" matrices + if (allocated(Init%Soil_K)) then + do iiNode = 1,size(Init%Soil_Points,2) + ! --- Find closest node + call FindClosestNodes(Init%Soil_Points(1:3,iiNode), Init%Nodes, iNode, Dist); + if (Dist>0.1_ReKi) then + ErrMsg='Closest SubDyn Node is node '//Num2LStr(iNode)//', which is more than 0.1m away from soildyn point '//num2lstr(iiNode); + ErrStat=ErrID_Fatal; return + endif + Init%Soil_Nodes(iiNode) = iNode + ! --- Insert/remove from matrices + nDOF=size(p%NodesDOF(iNode)%List) + if (nDOF/=6) then + ErrMsg='Soil matrix is to be inserted at SubDyn node '//Num2LStr(iNode)//', but this node has '//num2lstr(nDOF)//' DOFs'; + ErrStat=ErrID_Fatal; return + endif + K_soil = Init%Soil_K(1:6,1:6,iiNode) + if (present(Substract)) then + if (Substract) then + K_soil = - K_soil + endif + endif + do I = 1, 6 + iDOF = p%NodesDOF(iNode)%List(I) ! DOF index + do J = 1, 6 + jDOF = p%NodesDOF(iNode)%List(J) ! DOF index + K(iDOF, jDOF) = K(iDOF, jDOF) + K_soil(I,J) + enddo + enddo + if (.not.present(Substract)) then + CALL WrScr(' Soil stiffness inserted at SubDyn node '//trim(Num2LStr(iNode))) + print*,' ',K_Soil(1,1:6) + print*,' ',K_Soil(2,1:6) + print*,' ',K_Soil(3,1:6) + print*,' ',K_Soil(4,1:6) + print*,' ',K_Soil(5,1:6) + print*,' ',K_Soil(6,1:6) + endif + enddo + endif contains !> Convert a flatten array of 21 values into a symmetric 6x6 matrix SUBROUTINE Array21_to_6by6(A21, M66) @@ -1111,8 +1161,26 @@ SUBROUTINE Array21_to_6by6(A21, M66) END SUBROUTINE Array21_to_6by6 END SUBROUTINE InsertSoilMatrices - - +!------------------------------------------------------------------------------------------------------ +!> Find closest node index to a point, returns distance as well +SUBROUTINE FindClosestNodes(Point, Nodes, iNode, Dist) + real(ReKi), dimension(3), intent(IN ) :: Point !< Point coordinates + real(ReKi), dimension(:,:), intent(IN ) :: Nodes !< List of nodes, Positions are in columns 2-4... + integer(IntKi), intent( OUT) :: iNode !< Index of closest node + real(ReKi), intent( OUT) :: Dist !< Distance from Point to node iNode + integer(IntKi) :: I + real(ReKi) :: min_dist, loc_dist + ! + min_dist=999999._ReKi + iNode=-1 + do i = 1, size(Nodes,1) + loc_dist = sqrt((Point(1) - Nodes(i,2))**2 + (Point(2) - Nodes(i,3))**2+ (Point(3) - Nodes(i,4))**2) + if (loc_dist Build transformation matrix T, such that x= T.x~ where x~ is the reduced vector of DOF diff --git a/modules/subdyn/src/SubDyn.f90 b/modules/subdyn/src/SubDyn.f90 index a62aa21fb..a576aa27a 100644 --- a/modules/subdyn/src/SubDyn.f90 +++ b/modules/subdyn/src/SubDyn.f90 @@ -193,28 +193,6 @@ SUBROUTINE SD_Init( InitInput, u, p, x, xd, z, OtherState, y, m, Interval, InitO ErrStat = ErrID_None ErrMsg = "" -!TODO: parse the SoilDyn inputs if any were passed -! SoilStiffness is dimensioned (6,6,N) -if (allocated(InitInput%SoilStiffness)) then -print*,' add logic for handling soilstiffness matrices from SoilDyn: ',size(InitInput%SoilStiffness,3),' points' -print*,' ',InitInput%SoilStiffness(1,1:6,1) -print*,' ',InitInput%SoilStiffness(2,1:6,1) -print*,' ',InitInput%SoilStiffness(3,1:6,1) -print*,' ',InitInput%SoilStiffness(4,1:6,1) -print*,' ',InitInput%SoilStiffness(5,1:6,1) -print*,' ',InitInput%SoilStiffness(6,1:6,1) -endif -! SoilMesh has N points. Correspond in order to the SoilStiffness matrices passed in -! %RefOrientation is the identity matrix (3,3,N) -! %Position is the reference position (3,N) -if (InitInput%SoilMesh%Initialized) then -print*,' add logic for handling soilMesh from SoilDyn: ',InitInput%SoilMesh%NNodes,' mesh nodes' -print*,InitInput%SoilMesh%Position -endif -! Maybe add some logic to check that these we have a match in dimensions -! Maybe some logic to make sure these points correspond roughly to nodes -- though this may not be true for a long pile into the soil with multiple connection points -! Note: F = -kx whre k is the relevant 6x6 matrix from SoilStiffness - ! Initialize the NWTC Subroutine Library CALL NWTC_Init( ) @@ -230,6 +208,24 @@ SUBROUTINE SD_Init( InitInput, u, p, x, xd, z, OtherState, y, m, Interval, InitO Init%g = InitInput%g Init%TP_RefPoint = InitInput%TP_RefPoint Init%SubRotateZ = InitInput%SubRotateZ + if ((allocated(InitInput%SoilStiffness)) .and. (InitInput%SoilMesh%Initialized)) then + ! Soil Mesh and Stiffness + ! SoilMesh has N points. Correspond in order to the SoilStiffness matrices passed in + ! %RefOrientation is the identity matrix (3,3,N) + ! %Position is the reference position (3,N) + ! Maybe some logic to make sure these points correspond roughly to nodes -- though this may not be true for a long pile into the soil with multiple connection points + ! Note: F = -kx whre k is the relevant 6x6 matrix from SoilStiffness + call AllocAry(Init%Soil_K, 6,6, size(InitInput%SoilStiffness,3), 'Soil_K', ErrStat2, ErrMsg2); + call AllocAry(Init%Soil_Points, 3, InitInput%SoilMesh%NNodes, 'Soil_Points', ErrStat2, ErrMsg2); + call AllocAry(Init%Soil_Nodes, InitInput%SoilMesh%NNodes, 'Soil_Nodes' , ErrStat2, ErrMsg2); + Init%Soil_K = InitInput%SoilStiffness ! SoilStiffness is dimensioned (6,6,N) + Init%Soil_Points = InitInput%SoilMesh%Position ! SoilStiffness is dimensioned (6,6,N) + Init%Soil_Nodes = -1 ! Will be determined in InsertSoilMatrices, Nodes not known yet + if (size(Init%Soil_K,3) /= size(Init%Soil_Points,2)) then + ErrStat2=ErrID_Fatal; ErrMsg2='Number of soil points inconsistent with number of soil stiffness matrix' + endif + if (Failed()) return + endif !bjj added this ugly check (mostly for checking SubDyn driver). not sure if anyone would want to play with different values of gravity so I don't return an error. IF (Init%g < 0.0_ReKi ) CALL ProgWarn( ' SubDyn calculations use gravity assuming it is input as a positive number; the input value is negative.' ) @@ -2566,6 +2562,18 @@ SUBROUTINE OutSummary(Init, p, InitInput, CBparams, ErrStat,ErrMsg) write(UnSum, '("#",4x,6(A9),10('//trim(SFmt)//'))') 'Elem_[#] ','Node_1','Node_2','Prop_1','Prop_2','Type','Length_[m]','Area_[m^2]','Dens._[kg/m^3]','E_[N/m2]','G_[N/m2]','shear_[-]','Ixx_[m^4]','Iyy_[m^4]','Jzz_[m^4]','T0_[N]' call yaml_write_array(UnSum, 'Elements', DummyArray, ReFmt, ErrStat2, ErrMsg2, AllFmt='6(F8.0,","),3(F15.3,","),7(E15.6,",")') !, comment='',label=.true.) deallocate(DummyArray) + + if (allocated(Init%Soil_K)) then + call yaml_write_array(UnSum, 'Soil_Nodes', Init%Soil_Nodes, IFmt, ErrStat2, ErrMsg2, comment='') + CALL AllocAry( DummyArray, 3, size(Init%Soil_Points,2), 'SoilP', ErrStat2, ErrMsg2 ); if(Failed()) return + do i=1,size(Init%Soil_K,3) + DummyArray(1:3,I) = Init%Nodes(Init%Soil_Nodes(I), 2:4) + call yaml_write_array(UnSum, 'Soil_K'//Num2LStr(I), Init%Soil_K(:,:,I), ReFmt, ErrStat2, ErrMsg2, comment='') + enddo + call yaml_write_array(UnSum, 'Soil_Points_SoilDyn', Init%Soil_Points, ReFmt, ErrStat2, ErrMsg2, comment='') + call yaml_write_array(UnSum, 'Soil_Points_SubDyn', DummyArray, ReFmt, ErrStat2, ErrMsg2, comment='') + endif + deallocate(DummyArray) ! --- User inputs (less interesting, repeat of input file) WRITE(UnSum, '(A)') SectionDivide diff --git a/modules/subdyn/src/SubDyn_Registry.txt b/modules/subdyn/src/SubDyn_Registry.txt index 055a2df51..cdb6bda75 100644 --- a/modules/subdyn/src/SubDyn_Registry.txt +++ b/modules/subdyn/src/SubDyn_Registry.txt @@ -93,6 +93,9 @@ typedef ^ ^ LOGICAL TabDelim - - - "Generate a tab-delimited output file in OutJ typedef ^ ^ ReKi SSIK {:}{:} - - "SSI stiffness packed matrix elements (21 of them), for each reaction joint" typedef ^ ^ ReKi SSIM {:}{:} - - "SSI mass packed matrix elements (21 of them), for each reaction joint" typedef ^ ^ CHARACTER(1024) SSIfile {:} - - "Soil Structure Interaction (SSI) files to associate with each reaction node" +typedef ^ ^ ReKi Soil_K {:}{:}{:} - - "Soil stiffness (at passed at Init, not in input file) 6x6xn" +typedef ^ ^ ReKi Soil_Points {:}{:} - - "Node positions where soil stiffness will be added" +typedef ^ ^ Integer Soil_Nodes {:} - - "Node indices where soil stiffness will be added" #-------------------------- arrays and variables used in the module ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ typedef ^ ^ INTEGER NElem - - - "Total number of elements" typedef ^ ^ INTEGER NPropB - - - "Total number of property sets for Beams" diff --git a/modules/subdyn/src/SubDyn_Types.f90 b/modules/subdyn/src/SubDyn_Types.f90 index 867f16dce..875a2b3c6 100644 --- a/modules/subdyn/src/SubDyn_Types.f90 +++ b/modules/subdyn/src/SubDyn_Types.f90 @@ -129,6 +129,9 @@ MODULE SubDyn_Types REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: SSIK !< SSI stiffness packed matrix elements (21 of them), for each reaction joint [-] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: SSIM !< SSI mass packed matrix elements (21 of them), for each reaction joint [-] CHARACTER(1024) , DIMENSION(:), ALLOCATABLE :: SSIfile !< Soil Structure Interaction (SSI) files to associate with each reaction node [-] + REAL(ReKi) , DIMENSION(:,:,:), ALLOCATABLE :: Soil_K !< Soil stiffness (at passed at Init, not in input file) 6x6xn [-] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: Soil_Points !< Node positions where soil stiffness will be added [-] + INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: Soil_Nodes !< Node indices where soil stiffness will be added [-] INTEGER(IntKi) :: NElem !< Total number of elements [-] INTEGER(IntKi) :: NPropB !< Total number of property sets for Beams [-] INTEGER(IntKi) :: NPropC !< Total number of property sets for Cable [-] @@ -2539,6 +2542,7 @@ SUBROUTINE SD_CopyInitType( SrcInitTypeData, DstInitTypeData, CtrlCode, ErrStat, INTEGER(IntKi) :: i,j,k INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 INTEGER(IntKi) :: i2, i2_l, i2_u ! bounds (upper/lower) for an array dimension 2 + INTEGER(IntKi) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'SD_CopyInitType' @@ -2737,6 +2741,48 @@ SUBROUTINE SD_CopyInitType( SrcInitTypeData, DstInitTypeData, CtrlCode, ErrStat, END IF END IF DstInitTypeData%SSIfile = SrcInitTypeData%SSIfile +ENDIF +IF (ALLOCATED(SrcInitTypeData%Soil_K)) THEN + i1_l = LBOUND(SrcInitTypeData%Soil_K,1) + i1_u = UBOUND(SrcInitTypeData%Soil_K,1) + i2_l = LBOUND(SrcInitTypeData%Soil_K,2) + i2_u = UBOUND(SrcInitTypeData%Soil_K,2) + i3_l = LBOUND(SrcInitTypeData%Soil_K,3) + i3_u = UBOUND(SrcInitTypeData%Soil_K,3) + IF (.NOT. ALLOCATED(DstInitTypeData%Soil_K)) THEN + ALLOCATE(DstInitTypeData%Soil_K(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitTypeData%Soil_K.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInitTypeData%Soil_K = SrcInitTypeData%Soil_K +ENDIF +IF (ALLOCATED(SrcInitTypeData%Soil_Points)) THEN + i1_l = LBOUND(SrcInitTypeData%Soil_Points,1) + i1_u = UBOUND(SrcInitTypeData%Soil_Points,1) + i2_l = LBOUND(SrcInitTypeData%Soil_Points,2) + i2_u = UBOUND(SrcInitTypeData%Soil_Points,2) + IF (.NOT. ALLOCATED(DstInitTypeData%Soil_Points)) THEN + ALLOCATE(DstInitTypeData%Soil_Points(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitTypeData%Soil_Points.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInitTypeData%Soil_Points = SrcInitTypeData%Soil_Points +ENDIF +IF (ALLOCATED(SrcInitTypeData%Soil_Nodes)) THEN + i1_l = LBOUND(SrcInitTypeData%Soil_Nodes,1) + i1_u = UBOUND(SrcInitTypeData%Soil_Nodes,1) + IF (.NOT. ALLOCATED(DstInitTypeData%Soil_Nodes)) THEN + ALLOCATE(DstInitTypeData%Soil_Nodes(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating DstInitTypeData%Soil_Nodes.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + END IF + DstInitTypeData%Soil_Nodes = SrcInitTypeData%Soil_Nodes ENDIF DstInitTypeData%NElem = SrcInitTypeData%NElem DstInitTypeData%NPropB = SrcInitTypeData%NPropB @@ -2999,6 +3045,15 @@ SUBROUTINE SD_DestroyInitType( InitTypeData, ErrStat, ErrMsg ) IF (ALLOCATED(InitTypeData%SSIfile)) THEN DEALLOCATE(InitTypeData%SSIfile) ENDIF +IF (ALLOCATED(InitTypeData%Soil_K)) THEN + DEALLOCATE(InitTypeData%Soil_K) +ENDIF +IF (ALLOCATED(InitTypeData%Soil_Points)) THEN + DEALLOCATE(InitTypeData%Soil_Points) +ENDIF +IF (ALLOCATED(InitTypeData%Soil_Nodes)) THEN + DEALLOCATE(InitTypeData%Soil_Nodes) +ENDIF IF (ALLOCATED(InitTypeData%Nodes)) THEN DEALLOCATE(InitTypeData%Nodes) ENDIF @@ -3162,6 +3217,21 @@ SUBROUTINE SD_PackInitType( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, IF ( ALLOCATED(InData%SSIfile) ) THEN Int_BufSz = Int_BufSz + 2*1 ! SSIfile upper/lower bounds for each dimension Int_BufSz = Int_BufSz + SIZE(InData%SSIfile)*LEN(InData%SSIfile) ! SSIfile + END IF + Int_BufSz = Int_BufSz + 1 ! Soil_K allocated yes/no + IF ( ALLOCATED(InData%Soil_K) ) THEN + Int_BufSz = Int_BufSz + 2*3 ! Soil_K upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%Soil_K) ! Soil_K + END IF + Int_BufSz = Int_BufSz + 1 ! Soil_Points allocated yes/no + IF ( ALLOCATED(InData%Soil_Points) ) THEN + Int_BufSz = Int_BufSz + 2*2 ! Soil_Points upper/lower bounds for each dimension + Re_BufSz = Re_BufSz + SIZE(InData%Soil_Points) ! Soil_Points + END IF + Int_BufSz = Int_BufSz + 1 ! Soil_Nodes allocated yes/no + IF ( ALLOCATED(InData%Soil_Nodes) ) THEN + Int_BufSz = Int_BufSz + 2*1 ! Soil_Nodes upper/lower bounds for each dimension + Int_BufSz = Int_BufSz + SIZE(InData%Soil_Nodes) ! Soil_Nodes END IF Int_BufSz = Int_BufSz + 1 ! NElem Int_BufSz = Int_BufSz + 1 ! NPropB @@ -3512,6 +3582,54 @@ SUBROUTINE SD_PackInitType( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, Int_Xferred = Int_Xferred + 1 END DO ! I END DO !i1 + END IF + IF ( .NOT. ALLOCATED(InData%Soil_K) ) 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%Soil_K,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%Soil_K,1) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%Soil_K,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%Soil_K,2) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%Soil_K,3) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%Soil_K,3) + Int_Xferred = Int_Xferred + 2 + + IF (SIZE(InData%Soil_K)>0) ReKiBuf ( Re_Xferred:Re_Xferred+(SIZE(InData%Soil_K))-1 ) = PACK(InData%Soil_K,.TRUE.) + Re_Xferred = Re_Xferred + SIZE(InData%Soil_K) + END IF + IF ( .NOT. ALLOCATED(InData%Soil_Points) ) 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%Soil_Points,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%Soil_Points,1) + Int_Xferred = Int_Xferred + 2 + IntKiBuf( Int_Xferred ) = LBOUND(InData%Soil_Points,2) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%Soil_Points,2) + Int_Xferred = Int_Xferred + 2 + + IF (SIZE(InData%Soil_Points)>0) ReKiBuf ( Re_Xferred:Re_Xferred+(SIZE(InData%Soil_Points))-1 ) = PACK(InData%Soil_Points,.TRUE.) + Re_Xferred = Re_Xferred + SIZE(InData%Soil_Points) + END IF + IF ( .NOT. ALLOCATED(InData%Soil_Nodes) ) 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%Soil_Nodes,1) + IntKiBuf( Int_Xferred + 1) = UBOUND(InData%Soil_Nodes,1) + Int_Xferred = Int_Xferred + 2 + + IF (SIZE(InData%Soil_Nodes)>0) IntKiBuf ( Int_Xferred:Int_Xferred+(SIZE(InData%Soil_Nodes))-1 ) = PACK(InData%Soil_Nodes,.TRUE.) + Int_Xferred = Int_Xferred + SIZE(InData%Soil_Nodes) END IF IntKiBuf ( Int_Xferred:Int_Xferred+(1)-1 ) = InData%NElem Int_Xferred = Int_Xferred + 1 @@ -3780,6 +3898,7 @@ SUBROUTINE SD_UnPackInitType( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrM LOGICAL, ALLOCATABLE :: mask5(:,:,:,:,:) INTEGER(IntKi) :: i1, i1_l, i1_u ! bounds (upper/lower) for an array dimension 1 INTEGER(IntKi) :: i2, i2_l, i2_u ! bounds (upper/lower) for an array dimension 2 + INTEGER(IntKi) :: i3, i3_l, i3_u ! bounds (upper/lower) for an array dimension 3 INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(*), PARAMETER :: RoutineName = 'SD_UnPackInitType' @@ -4174,6 +4293,84 @@ SUBROUTINE SD_UnPackInitType( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrM END DO ! I END DO !i1 DEALLOCATE(mask1) + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! Soil_K 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 + i2_l = IntKiBuf( Int_Xferred ) + i2_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + i3_l = IntKiBuf( Int_Xferred ) + i3_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ALLOCATED(OutData%Soil_K)) DEALLOCATE(OutData%Soil_K) + ALLOCATE(OutData%Soil_K(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%Soil_K.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + ALLOCATE(mask3(i1_l:i1_u,i2_l:i2_u,i3_l:i3_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating mask3.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + mask3 = .TRUE. + IF (SIZE(OutData%Soil_K)>0) OutData%Soil_K = UNPACK(ReKiBuf( Re_Xferred:Re_Xferred+(SIZE(OutData%Soil_K))-1 ), mask3, 0.0_ReKi ) + Re_Xferred = Re_Xferred + SIZE(OutData%Soil_K) + DEALLOCATE(mask3) + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! Soil_Points 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 + i2_l = IntKiBuf( Int_Xferred ) + i2_u = IntKiBuf( Int_Xferred + 1) + Int_Xferred = Int_Xferred + 2 + IF (ALLOCATED(OutData%Soil_Points)) DEALLOCATE(OutData%Soil_Points) + ALLOCATE(OutData%Soil_Points(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%Soil_Points.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + ALLOCATE(mask2(i1_l:i1_u,i2_l:i2_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating mask2.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + mask2 = .TRUE. + IF (SIZE(OutData%Soil_Points)>0) OutData%Soil_Points = UNPACK(ReKiBuf( Re_Xferred:Re_Xferred+(SIZE(OutData%Soil_Points))-1 ), mask2, 0.0_ReKi ) + Re_Xferred = Re_Xferred + SIZE(OutData%Soil_Points) + DEALLOCATE(mask2) + END IF + IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! Soil_Nodes 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 (ALLOCATED(OutData%Soil_Nodes)) DEALLOCATE(OutData%Soil_Nodes) + ALLOCATE(OutData%Soil_Nodes(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%Soil_Nodes.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + ALLOCATE(mask1(i1_l:i1_u),STAT=ErrStat2) + IF (ErrStat2 /= 0) THEN + CALL SetErrStat(ErrID_Fatal, 'Error allocating mask1.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + mask1 = .TRUE. + IF (SIZE(OutData%Soil_Nodes)>0) OutData%Soil_Nodes = UNPACK( IntKiBuf ( Int_Xferred:Int_Xferred+(SIZE(OutData%Soil_Nodes))-1 ), mask1, 0_IntKi ) + Int_Xferred = Int_Xferred + SIZE(OutData%Soil_Nodes) + DEALLOCATE(mask1) END IF OutData%NElem = IntKiBuf( Int_Xferred ) Int_Xferred = Int_Xferred + 1 From 7a7b37e37ca9e3e7830bc2a57c98b2dba50dca0e Mon Sep 17 00:00:00 2001 From: Emmanuel Branlard Date: Wed, 17 Jun 2020 19:32:24 -0600 Subject: [PATCH 110/136] FlexSub: activating NonLinear SoilDyn part --- modules/openfast-library/src/FAST_Subs.f90 | 3 +-- modules/subdyn/src/SD_FEM.f90 | 6 ------ 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/modules/openfast-library/src/FAST_Subs.f90 b/modules/openfast-library/src/FAST_Subs.f90 index 3b24d2229..2370294d5 100644 --- a/modules/openfast-library/src/FAST_Subs.f90 +++ b/modules/openfast-library/src/FAST_Subs.f90 @@ -865,8 +865,7 @@ SUBROUTINE FAST_InitializeAll( t_initial, p_FAST, y_FAST, m_FAST, ED, BD, SrvD, !InitInData_SlD%UseInputFile = .TRUE. InitInData_SlD%InputFile = p_FAST%SoilFile InitInData_SlD%RootName = p_FAST%OutFileRoot -print*,'FIXME: FAST_SUBS:SlD_Init: reset the SoilDynNonLinearOnly once SubDyn can handle the linear soil reaction' - InitInData_SlD%SlDNonLinearForcePortionOnly = .FALSE. ! SoilDyn will only return the Non-Linear portion of the reaction force + InitInData_SlD%SlDNonLinearForcePortionOnly = .true. ! SoilDyn will only return the Non-Linear portion of the reaction force CALL SlD_Init( InitInData_SlD, SlD%Input(1), SlD%p, SlD%x(STATE_CURR), SlD%xd(STATE_CURR), SlD%z(STATE_CURR), & SlD%OtherSt(STATE_CURR), SlD%y, SlD%m, p_FAST%dt_module( MODULE_SlD ), InitOutData_SlD, ErrStat2, ErrMsg2 ) diff --git a/modules/subdyn/src/SD_FEM.f90 b/modules/subdyn/src/SD_FEM.f90 index 62a37dbc0..a7f81810a 100644 --- a/modules/subdyn/src/SD_FEM.f90 +++ b/modules/subdyn/src/SD_FEM.f90 @@ -1134,12 +1134,6 @@ SUBROUTINE InsertSoilMatrices(M, K, Init, p, ErrStat, ErrMsg, Substract) enddo if (.not.present(Substract)) then CALL WrScr(' Soil stiffness inserted at SubDyn node '//trim(Num2LStr(iNode))) - print*,' ',K_Soil(1,1:6) - print*,' ',K_Soil(2,1:6) - print*,' ',K_Soil(3,1:6) - print*,' ',K_Soil(4,1:6) - print*,' ',K_Soil(5,1:6) - print*,' ',K_Soil(6,1:6) endif enddo endif From 1acb67e04e1b1d5535e7b5f6364dcc3a1bb4bb1a Mon Sep 17 00:00:00 2001 From: Emmanuel Branlard Date: Wed, 17 Jun 2020 19:04:40 -0600 Subject: [PATCH 111/136] FlexSub: Bug fix: count of internal DOF was wrong since introduction of SSI (onlya affect joints and rigid links) --- modules/subdyn/src/SD_FEM.f90 | 32 +++++++------ modules/subdyn/src/SubDyn.f90 | 89 +++++++++++++++++++++++++++++------ modules/subdyn/src/Yaml.f90 | 30 ++++++++---- 3 files changed, 112 insertions(+), 39 deletions(-) diff --git a/modules/subdyn/src/SD_FEM.f90 b/modules/subdyn/src/SD_FEM.f90 index a7f81810a..1c1677934 100644 --- a/modules/subdyn/src/SD_FEM.f90 +++ b/modules/subdyn/src/SD_FEM.f90 @@ -1062,10 +1062,11 @@ END SUBROUTINE AssembleKM !! Soil stiffness can come from two sources: !! - "SSI" matrices (specified at reaction nodes) !! - "Soil" matrices (specified at Initalization) -SUBROUTINE InsertSoilMatrices(M, K, Init, p, ErrStat, ErrMsg, Substract) +SUBROUTINE InsertSoilMatrices(M, K, NodesDOF, Init, p, ErrStat, ErrMsg, Substract) real(ReKi), dimension(:,:), intent(inout) :: M real(ReKi), dimension(:,:), intent(inout) :: K - type(SD_InitType), intent(inout) :: Init ! TODO look for closest indices elsewhere + type(IList),dimension(:), intent(in ) :: NodesDOF !< Map from Node Index to DOF lists + type(SD_InitType), intent(inout) :: Init !< TODO set it to in only type(SD_ParameterType), intent(in ) :: p integer(IntKi), intent( out) :: ErrStat ! Error status of the operation character(*), intent( out) :: ErrMsg ! Error message if ErrStat /= ErrID_None @@ -1081,7 +1082,7 @@ SUBROUTINE InsertSoilMatrices(M, K, Init, p, ErrStat, ErrMsg, Substract) ! 6x6 matrix goes to one node of one element only do iiNode = 1, p%nNodes_C ! loop on constrained nodes iNode = p%Nodes_C(iiNode,1) - nDOF=size(p%NodesDOF(iNode)%List) + nDOF=size(NodesDOF(iNode)%List) if (nDOF/=6) then ErrMsg='SSI soil matrix is to be inserted at SubDyn node '//Num2LStr(iNode)//', but this node has '//num2lstr(nDOF)//' DOFs'; ErrStat=ErrID_Fatal; return @@ -1095,9 +1096,9 @@ SUBROUTINE InsertSoilMatrices(M, K, Init, p, ErrStat, ErrMsg, Substract) endif endif do I = 1, 6 - iDOF = p%NodesDOF(iNode)%List(I) ! DOF index + iDOF = NodesDOF(iNode)%List(I) ! DOF index do J = 1, 6 - jDOF = p%NodesDOF(iNode)%List(J) ! DOF index + jDOF = NodesDOF(iNode)%List(J) ! DOF index K(iDOF, jDOF) = K(iDOF, jDOF) + K_soil(I,J) M(iDOF, jDOF) = M(iDOF, jDOF) + M_soil(I,J) enddo @@ -1114,7 +1115,7 @@ SUBROUTINE InsertSoilMatrices(M, K, Init, p, ErrStat, ErrMsg, Substract) endif Init%Soil_Nodes(iiNode) = iNode ! --- Insert/remove from matrices - nDOF=size(p%NodesDOF(iNode)%List) + nDOF=size(NodesDOF(iNode)%List) if (nDOF/=6) then ErrMsg='Soil matrix is to be inserted at SubDyn node '//Num2LStr(iNode)//', but this node has '//num2lstr(nDOF)//' DOFs'; ErrStat=ErrID_Fatal; return @@ -1126,9 +1127,9 @@ SUBROUTINE InsertSoilMatrices(M, K, Init, p, ErrStat, ErrMsg, Substract) endif endif do I = 1, 6 - iDOF = p%NodesDOF(iNode)%List(I) ! DOF index + iDOF = NodesDOF(iNode)%List(I) ! DOF index do J = 1, 6 - jDOF = p%NodesDOF(iNode)%List(J) ! DOF index + jDOF = NodesDOF(iNode)%List(J) ! DOF index K(iDOF, jDOF) = K(iDOF, jDOF) + K_soil(I,J) enddo enddo @@ -1241,14 +1242,16 @@ SUBROUTINE BuildTMatrix(Init, p, RA, RAm1, Tred, ErrStat, ErrMsg) call Fatal('No rigid assembly attributed to node'//trim(Num2LStr(iNode))//'. RAm1 wrong'); return endif ia = find(IRA, aID, ErrStat2, ErrMsg2); if(Failed()) return - print*,'Node',iNode, 'is involved in RA', aID, ia + print*,'Node',iNode, 'is involved in RA:', aID, '. Index in list of RA to process', ia if ( ia <= 0) then ! This rigid assembly has already been processed - ! The DOF list is taken from the stored RA DOF list - call init_list(p%NodesDOFtilde(iNode), RA_DOFtilde(aID)%List, ErrStat2, ErrMsg2) + ! OLD: The DOF list is taken from the stored RA DOF list + ! call init_list(p%NodesDOFtilde(iNode), RA_DOFtilde(aID)%List, ErrStat2, ErrMsg2) + ! NEW: this node has no DOFs + call init_list(p%NodesDOFtilde(iNode), 0, 0, ErrStat2, ErrMsg2) print*,'The RA',aID,', has already been processed!' print*,'N',iNode,'I ',p%NodesDOF(iNode)%List(1:6) - print*,'N',iNode,'It',p%NodesDOFtilde(iNode)%List + print*,'N',iNode,'It',RA_DOFtilde(aID)%List cycle ! We pass to the next joint else call RAElimination( RA(aID)%List, Tc, INodesID, Init, p, ErrStat2, ErrMsg2); if(Failed()) return; @@ -1284,8 +1287,8 @@ SUBROUTINE BuildTMatrix(Init, p, RA, RAm1, Tred, ErrStat, ErrMsg) call init_list(p%NodesDOFtilde(iNode), nc, 0, ErrStat2, ErrMsg2) p%NodesDOFtilde(iNode)%List(1:nc) = (/ (iprev + i, i=1,nc) /) IDOFNew => p%NodesDOFtilde(iNode)%List(1:nc) ! alias to shorten notations - !print*,'N',iNode,'I ',IDOFOld - !print*,'N',iNode,'It',IDOFNew + print*,'N',iNode,'I ',IDOFOld + print*,'N',iNode,'It',IDOFNew Tred(IDOFOld, IDOFNew) = Tc iPrev = iPrev + nc enddo @@ -1824,7 +1827,6 @@ SUBROUTINE ElemM(ep, Me) if ( EqualRealNos(eP%rho, 0.0_ReKi) ) then Me=0.0_ReKi else - print*,'FEM: Mass matrix for rigid members rho/=0 TODO' CALL ElemM_Cable(ep%Area, ep%Length, ep%rho, ep%DirCos, Me) !CALL ElemM_(A, L, rho, DirCos, Me) endif diff --git a/modules/subdyn/src/SubDyn.f90 b/modules/subdyn/src/SubDyn.f90 index a576aa27a..feeb154dc 100644 --- a/modules/subdyn/src/SubDyn.f90 +++ b/modules/subdyn/src/SubDyn.f90 @@ -260,10 +260,10 @@ SUBROUTINE SD_Init( InitInput, u, p, x, xd, z, OtherState, y, m, Interval, InitO ! Assemble Stiffness and mass matrix CALL AssembleKM(Init, p, ErrStat2, ErrMsg2); if(Failed()) return - ! Insert soil stiffness and mass matrix - CALL InsertSoilMatrices(Init%M, Init%K, Init, p, ErrStat2, ErrMsg2); if(Failed()) return + ! Insert soil stiffness and mass matrix (NOTE: using NodesDOF, unreduced matrix) + CALL InsertSoilMatrices(Init%M, Init%K, p%NodesDOF, Init, p, ErrStat2, ErrMsg2); if(Failed()) return - ! --- Elimination of constraints (reset M, K, D, and BCs IntFc ) + ! --- Elimination of constraints (reset M, K, D, to lower size, and BCs IntFc ) CALL DirectElimination(Init, p, ErrStat2, ErrMsg2); if(Failed()) return ! --- Additional Damping and stiffness at pin/ball/universal joints @@ -320,6 +320,8 @@ SUBROUTINE SD_Init( InitInput, u, p, x, xd, z, OtherState, y, m, Interval, InitO call AllocAry( p%INodes_SD_to_Mesh, p%nNodes, 'INodes_SD_to_Mesh', ErrStat2, ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocMiscVars') call Y2Mesh_SD_Mapping(p, p%INodes_Mesh_to_SD) ! Store mapping from y2/u mesh to Subdyn nodes indices call SD_Y2Mesh_Mapping(p, p%INodes_SD_to_Mesh) ! Store mapping from Subdyn to y2/u-mesh nodes indices + !print*,'I_SD_to_Mesh',p%INodes_SD_to_Mesh + !print*,'I_Mesh_to_SD',p%INodes_Mesh_to_SD ! --- Write the summary file IF ( Init%SSSum ) THEN @@ -379,7 +381,18 @@ SUBROUTINE SD_UpdateStates( t, n, Inputs, InputTimes, p, x, xd, z, OtherState, m ErrStat = ErrID_None ! no error has occurred ErrMsg = "" + !print*,'------------------------------------------------------' + !print*,'------------------------------------------------------' + !print*,'------------------------------------------------------' + !print*,'------------------------------------------------------' + !print*,'UpdateState',t,n + !print*,'------------------------------------------------------' + !print*,'------------------------------------------------------' + !print*,'------------------------------------------------------' + !print*,'------------------------------------------------------' IF ( p%nDOFM == 0) RETURN ! no retained modes = no states + !print*,'x%qm (in)',x%qm + !print*,'x%qmd (in)',x%qmdot IF (p%IntMethod .eq. 1) THEN CALL SD_RK4( t, n, Inputs, InputTimes, p, x, xd, z, OtherState, m, ErrStat, ErrMsg ) @@ -390,6 +403,8 @@ SUBROUTINE SD_UpdateStates( t, n, Inputs, InputTimes, p, x, xd, z, OtherState, m ELSE CALL SD_AM2( t, n, Inputs, InputTimes, p, x, xd, z, OtherState, m, ErrStat, ErrMsg ) END IF + !print*,'x%qm (out)',x%qm + !print*,'x%qmd(out)',x%qmdot END SUBROUTINE SD_UpdateStates @@ -425,6 +440,7 @@ SUBROUTINE SD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) TYPE(SD_ContinuousStateType) :: dxdt ! Continuous state derivatives at t- for output file qmdotdot purposes only INTEGER(IntKi) :: ErrStat2 ! Error status of the operation (occurs after initial error) CHARACTER(ErrMsgLen) :: ErrMsg2 ! Error message if ErrStat2 /= ErrID_None + logical:: LinDetected ! Initialize ErrStat ErrStat = ErrID_None ErrMsg = "" @@ -436,6 +452,20 @@ SUBROUTINE SD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) m%u_TP = (/REAL(u%TPMesh%TranslationDisp(:,1),ReKi), rotations/) m%udot_TP = (/u%TPMesh%TranslationVel( :,1), u%TPMesh%RotationVel(:,1)/) m%udotdot_TP = (/u%TPMesh%TranslationAcc( :,1), u%TPMesh%RotationAcc(:,1)/) + + !print*,'-----------------------------------------' + !print*,'CalCoutput',t + + LinDetected=.false. + DO iY2Node = 1,p%nNodes + if (any(abs(u%LMesh%Force (:,iY2Node) - 1000000)<1)) LinDetected = .true. + if (any(abs(u%LMesh%Moment (:,iY2Node) - 1000000)<1)) LinDetected = .true. + enddo + !if (.not. LinDetected) print*,'>>>> TRUE CALL' + !if ( LinDetected) print*,'>>>> LIN CALL' + + !print*,'uTP',m%u_TP + ! Inputs on interior nodes: CALL GetExtForceOnInternalDOF( u, p, m, m%UFL ) @@ -458,6 +488,11 @@ SUBROUTINE SD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) m%UL_dot = matmul( p%PhiRb_TI, m%udot_TP ) ! UL_dot [ Y2(4) = 0*x(2) + D2(4,2)*u(2) ] m%UL_dotdot = matmul( p%PhiRb_TI, m%udotdot_TP ) ! UL_dotdot [ Y2(6) = 0*x(:) + D2(6,3)*u(3) + 0*u(4) + 0] END IF + !if (.not. LinDetected) print*,'UL',m%UL + + !if (t>0.010) then + ! STOP + !endif !STATIC IMPROVEMENT METHOD ( modify UL ) if (p%SttcSolve/=idSIM_None) then @@ -482,6 +517,7 @@ SUBROUTINE SD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) m%UL = m%UL - UL0M end if endif + !print*,'UL',m%UL ! --- Build original DOF vectors (DOF before the CB reduction) m%U_red (p%IDI__) = m%UR_bar m%U_red (p%ID__L) = m%UL @@ -514,7 +550,13 @@ SUBROUTINE SD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) y%Y2mesh%TranslationAcc (:,iY2Node) = m%U_full_dotdot (DOFList(1:3)) y%Y2mesh%RotationVel (:,iY2Node) = m%U_full_dot (DOFList(4:6)) y%Y2mesh%RotationAcc (:,iY2Node) = m%U_full_dotdot (DOFList(4:6)) + !if (.not. LinDetected)print*,'Ufull ',iSDNode, m%U_full (DOFList(1:6)) + !if (.not. LinDetected)print*,'Ufulld ',iSDNode, m%U_full_dot (DOFList(1:6)) + !if (.not. LinDetected)print*,'Ufulldd',iSDNode, m%U_full_dotdot (DOFList(1:6)) enddo +! DO iY2Node = 1,p%nNodes +! print*,'Y2Disp',iY2Node,y%Y2mesh%TranslationDisp (:,iY2Node) +! enddo !________________________________________ ! Set loads outputs on y%Y1Mesh !________________________________________ @@ -532,6 +574,7 @@ SUBROUTINE SD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) !Take care of Hydrodynamic Forces that will go into INterface Forces later HydroForces(startDOF:startDOF+5) = (/u%LMesh%Force(1:3,iY2Node),u%LMesh%Moment(1:3,iY2Node)/) !(6,NNODES_I) ENDDO + !print*,'HydroForces',HydroForces !HydroTP = matmul(transpose(p%TI),HydroForces) ! (6,1) calculated below ! note: matmul( HydroForces, p%TI ) = matmul( transpose(p%TI), HydroForces) because HydroForces is 1-D @@ -547,6 +590,7 @@ SUBROUTINE SD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) ! Y1(:3) = -f_TP ! MExtra = -u_TP x f_TP ! Y1_MExtra = - MExtra = -u_TP x Y1(1:3) ! NOTE: double cancelling of signs + !if (.not. LinDetected)print*,'Y1',Y1 if (p%ExtraMoment) then Y1_ExtraMoment(1) = - m%u_TP(2) * Y1(3) + m%u_TP(3) * Y1(2) Y1_ExtraMoment(2) = - m%u_TP(3) * Y1(1) + m%u_TP(1) * Y1(3) @@ -1822,8 +1866,8 @@ SUBROUTINE SD_Guyan_RigidBodyMass(Init, p, MBB, ErrStat, ErrMsg) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - ! --- Remove SSI from Mass and stiffness matrix - CALL InsertSoilMatrices(Init%M, Init%K, Init, p, ErrStat2, ErrMsg2, Substract=.True.); + ! --- Remove SSI from Mass and stiffness matrix (NOTE: use NodesDOFtilde, reduced matrix) + CALL InsertSoilMatrices(Init%M, Init%K, p%NodesDOFtilde, Init, p, ErrStat2, ErrMsg2, Substract=.True.); ! --- Perform Guyan reduction to get MBB nR = p%nDOFR__ ! Using interface + reaction nodes @@ -1848,7 +1892,7 @@ SUBROUTINE SD_Guyan_RigidBodyMass(Init, p, MBB, ErrStat, ErrMsg) if(allocated(OmegaL)) deallocate(OmegaL) ! --- Insert SSI from Mass and stiffness matrix again - CALL InsertSoilMatrices(Init%M, Init%K, Init, p, ErrStat2, ErrMsg2, Substract=.False.); if(Failed()) return + CALL InsertSoilMatrices(Init%M, Init%K, p%NodesDOFtilde, Init, p, ErrStat2, ErrMsg2, Substract=.False.); if(Failed()) return contains logical function Failed() call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) @@ -2177,7 +2221,7 @@ SUBROUTINE PartitionDOFNodes(Init, m, p, ErrStat, ErrMsg) p%nDOFI_F = p%nDOFI_F + count(p%Nodes_I(iiNode, 2:7)==idBC_Fixed) ! assumes 6 DOFs enddo if (p%nDOFI__/=p%nDOFI_Rb+p%nDOFI_F) then - call Fatal('Error in distributing interface DOFs, total number of DOF does not equal number of leader and fixed DOF'); return + call Fatal('Error in distributing interface DOFs, total number of interface DOF('//num2lstr(p%nDOFI__)//') does not equal sum of: leader ('//num2lstr(p%nDOFI_Rb)//'), fixed ('//num2lstr(p%nDOFI_F)//')'); return endif ! DOFs of reaction nodes @@ -2192,7 +2236,7 @@ SUBROUTINE PartitionDOFNodes(Init, m, p, ErrStat, ErrMsg) p%nDOFC_L = p%nDOFC_L + count(p%Nodes_C(iiNode, 2:7)==idBC_Internal) ! assumes 6 DOFs enddo if (p%nDOFC__/=p%nDOFC_Rb+p%nDOFC_F+p%nDOFC_L) then - call Fatal('Error in distributing reaction DOFs, total number of DOF does not equal number of leader, fixed and internal DOF'); return + call Fatal('Error in distributing reaction DOFs, total number of reaction DOF('//num2lstr(p%nDOFC__)//') does not equal sum of: leader ('//num2lstr(p%nDOFC_Rb)//'), fixed ('//num2lstr(p%nDOFC_F)//'), internal ('//num2lstr(p%nDOFC_L)//')'); return endif ! DOFs of reaction + interface nodes p%nDOFR__ = p%nDOFI__ + p%nDOFC__ ! Total number, used to be called "nDOFR" @@ -2200,10 +2244,12 @@ SUBROUTINE PartitionDOFNodes(Init, m, p, ErrStat, ErrMsg) ! DOFs of internal nodes p%nDOFL_L=0 do iiNode= 1,p%nNodes_L + print*,'NodeL',p%Nodes_L(iiNode,1), 'DOF:',p%NodesDOFtilde( p%Nodes_L(iiNode,1) )%List p%nDOFL_L = p%nDOFL_L + len(p%NodesDOFtilde( p%Nodes_L(iiNode,1) )) enddo + print*,'L_L',p%nDOFL_L,'red',p%nDOF_red,'R__',p%nDOFR__ if (p%nDOFL_L/=p%nDOF_red-p%nDOFR__) then - call Fatal('Error in distributing internal DOFs, total number of DOF does not equal total number of DOF minus interface and reaction'); return + call Fatal('Error in distributing internal DOFs, total number of internal DOF('//num2lstr(p%nDOFL_L)//') does not equal total number of DOF('//num2lstr(p%nDOF_red)//') minus interface and reaction ('//num2lstr(p%nDOFR__)//')'); return endif ! Total number of DOFs in each category: @@ -2290,7 +2336,7 @@ SUBROUTINE PartitionDOFNodes(Init, m, p, ErrStat, ErrMsg) c_L=0; ! Counters over L dofs do iiNode= 1,p%nNodes_L !Loop on interface nodes iNode = p%Nodes_L(iiNode,1) - do J = 1, 6 ! DOFs + do J = 1, size(p%NodesDOFtilde(iNode)%List) ! DOFs c_L=c_L+1 p%IDL_L(c_L) = p%NodesDOFtilde(iNode)%List(J) ! DOF number enddo @@ -2394,6 +2440,7 @@ SUBROUTINE GetExtForceOnInternalDOF( u, p, m, UFL ) ! --- Build vector of external force m%Fext= myNaN DO iMeshNode = 1,p%nNodes + !print*,'iMN',iMeshNode,u%LMesh%Force (:,iMeshNode),u%LMesh%Moment(:,iMeshNode) iSDNode = p%INodes_Mesh_to_SD(iMeshNode) nMembers = (size(p%NodesDOF(iSDNode)%List)-3)/3 ! Number of members deducted from Node's nDOFList ! Force - All nodes have only 3 translational DOFs @@ -2403,6 +2450,12 @@ SUBROUTINE GetExtForceOnInternalDOF( u, p, m, UFL ) m%Fext( p%NodesDOF(iSDNode)%List(5::3)) = u%LMesh%Moment(2,iMeshNode)/nMembers m%Fext( p%NodesDOF(iSDNode)%List(6::3)) = u%LMesh%Moment(3,iMeshNode)/nMembers enddo + !print*,'----' + !DO iSDNode = 1,p%nNodes + ! iMeshNode = p%INodes_SD_to_Mesh(iSDNode) + ! print*,'iSD',iSDNode,u%LMesh%Force (:,iMeshNode),u%LMesh%Moment(:,iMeshNode) + !enddo + ! TODO: remove test below in the future if (any(m%Fext == myNaN)) then print*,'Error in setting up Fext' @@ -2411,6 +2464,7 @@ SUBROUTINE GetExtForceOnInternalDOF( u, p, m, UFL ) ! --- Reduced vector of external force m%Fext_red = matmul(transpose(p%T_red), m%Fext) UFL= m%Fext_red(p%ID__L) + !print*,'UFL',UFL END SUBROUTINE GetExtForceOnInternalDOF @@ -2492,10 +2546,10 @@ SUBROUTINE OutSummary(Init, p, InitInput, CBparams, ErrStat,ErrMsg) call yaml_write_var(UnSum, 'nNodes ', p%nNodes ,IFmt, ErrStat2, ErrMsg2, comment='Number of Nodes: total (I+C+L)') #ifdef SD_SUMMARY_DEBUG call yaml_write_var(UnSum, 'nDOFI__ ', p%nDOFI__ ,IFmt, ErrStat2, ErrMsg2, comment='Number of DOFs: "interface" (I__)') - call yaml_write_var(UnSum, 'nDOFI_B', p%nDOFI_Rb,IFmt, ErrStat2, ErrMsg2, comment='Number of DOFs: "interface" retained (I_B)') + call yaml_write_var(UnSum, 'nDOFI_B ', p%nDOFI_Rb,IFmt, ErrStat2, ErrMsg2, comment='Number of DOFs: "interface" retained (I_B)') call yaml_write_var(UnSum, 'nDOFI_F ', p%nDOFI_F ,IFmt, ErrStat2, ErrMsg2, comment='Number of DOFs: "interface" fixed (I_F)') call yaml_write_var(UnSum, 'nDOFC__ ', p%nDOFC__ ,IFmt, ErrStat2, ErrMsg2, comment='Number of DOFs: "reactions" (C__)') - call yaml_write_var(UnSum, 'nDOFC_B', p%nDOFC_Rb,IFmt, ErrStat2, ErrMsg2, comment='Number of DOFs: "reactions" retained (C_B)') + call yaml_write_var(UnSum, 'nDOFC_B ', p%nDOFC_Rb,IFmt, ErrStat2, ErrMsg2, comment='Number of DOFs: "reactions" retained (C_B)') call yaml_write_var(UnSum, 'nDOFC_L ', p%nDOFC_L ,IFmt, ErrStat2, ErrMsg2, comment='Number of DOFs: "reactions" internal (C_L)') call yaml_write_var(UnSum, 'nDOFC_F ', p%nDOFC_F ,IFmt, ErrStat2, ErrMsg2, comment='Number of DOFs: "reactions" fixed (C_F)') call yaml_write_var(UnSum, 'nDOFR__ ', p%nDOFR__ ,IFmt, ErrStat2, ErrMsg2, comment='Number of DOFs: "intf+react" (__R)') @@ -2731,13 +2785,18 @@ SUBROUTINE OutSummary(Init, p, InitInput, CBparams, ErrStat,ErrMsg) call yaml_write_array(UnSum, 'PhiLOm2-1', p%PhiLInvOmgL2, ReFmt, ErrStat2, ErrMsg2, comment='') call yaml_write_array(UnSum, 'KLL^-1' , p%KLLm1 , ReFmt, ErrStat2, ErrMsg2, comment='') endif + ! --- Reduction info + WRITE(UnSum, '(A)') SectionDivide + call yaml_write_array(UnSum, 'T_red', p%T_red, 'E9.2', ErrStat2, ErrMsg2, comment='(Constraint elimination matrix)') +#endif ! --- write TP TI matrix WRITE(UnSum, '(A)') SectionDivide - call yaml_write_array(UnSum, 'TI' , p%TI, ReFmt, ErrStat2, ErrMsg2, comment='(TP refpoint Transformation Matrix TI)') - call yaml_write_array(UnSum, 'TIReact', p%TIReact, ReFmt, ErrStat2, ErrMsg2, comment='(Transformation Matrix TIreact to (0,0,-WtrDepth))') + call yaml_write_array(UnSum, 'TI' , p%TI , 'E9.2', ErrStat2, ErrMsg2, comment='(TP refpoint Transformation Matrix TI)') + if (allocated(p%TIReact)) then + call yaml_write_array(UnSum, 'TIReact', p%TIReact, 'E9.2', ErrStat2, ErrMsg2, comment='(Transformation Matrix TIreact to (0,0,-WtrDepth))') + endif -#endif call CleanUp() contains diff --git a/modules/subdyn/src/Yaml.f90 b/modules/subdyn/src/Yaml.f90 index 2be2d1bab..ec3043c23 100644 --- a/modules/subdyn/src/Yaml.f90 +++ b/modules/subdyn/src/Yaml.f90 @@ -475,10 +475,14 @@ subroutine yaml_write_array2R4(fid, key, A, VarFmt, ErrStat, ErrMsg, level, comm if (nr==0) then write(fid, '('//trim(Fmt)//'"- [ ]")', iostat=ErrStat) else - if (present(AllFmt)) then - Fmt = '('//trim(Fmt)//'"- [",'//trim(AllFmt)//'"]")' + if (nc==0) then + Fmt = '('//trim(Fmt)//'"- []")' else - Fmt = '('//trim(Fmt)//'"- [",'//trim(Num2LStr(nc))//'('//VarFmt//',","),"]")' + if (present(AllFmt)) then + Fmt = '('//trim(Fmt)//'"- [",'//trim(AllFmt)//'"]")' + else + Fmt = '('//trim(Fmt)//'"- [",'//trim(Num2LStr(nc))//'('//VarFmt//',","),"]")' + endif endif do i=1,nr write(fid, Fmt, iostat=ErrStat) A(i,:) @@ -528,10 +532,14 @@ subroutine yaml_write_array2R8(fid, key, A, VarFmt, ErrStat, ErrMsg, level, comm if (nr==0) then write(fid, '('//trim(Fmt)//'"- [ ]")', iostat=ErrStat) else - if (present(AllFmt)) then - Fmt = '('//trim(Fmt)//'"- [",'//trim(AllFmt)//'"]")' + if (nc==0) then + Fmt = '('//trim(Fmt)//'"- []")' else - Fmt = '('//trim(Fmt)//'"- [",'//trim(Num2LStr(nc))//'('//VarFmt//',","),"]")' + if (present(AllFmt)) then + Fmt = '('//trim(Fmt)//'"- [",'//trim(AllFmt)//'"]")' + else + Fmt = '('//trim(Fmt)//'"- [",'//trim(Num2LStr(nc))//'('//VarFmt//',","),"]")' + endif endif do i=1,nr write(fid, Fmt, iostat=ErrStat) A(i,:) @@ -578,10 +586,14 @@ subroutine yaml_write_array2R16(fid, key, A, VarFmt, ErrStat, ErrMsg, level, com if (nr==0) then write(fid, '('//trim(Fmt)//'"- [ ]")', iostat=ErrStat) else - if (present(AllFmt)) then - Fmt = '('//trim(Fmt)//'"- [",'//trim(AllFmt)//'"]")' + if (nc==0) then + Fmt = '('//trim(Fmt)//'"- []")' else - Fmt = '('//trim(Fmt)//'"- [",'//trim(Num2LStr(nc))//'('//VarFmt//',","),"]")' + if (present(AllFmt)) then + Fmt = '('//trim(Fmt)//'"- [",'//trim(AllFmt)//'"]")' + else + Fmt = '('//trim(Fmt)//'"- [",'//trim(Num2LStr(nc))//'('//VarFmt//',","),"]")' + endif endif do i=1,nr write(fid, Fmt, iostat=ErrStat) A(i,:) From 282277d61c24bcd8db718ae8c33501f5ec180c5a Mon Sep 17 00:00:00 2001 From: Emmanuel Branlard Date: Wed, 17 Jun 2020 20:14:13 -0600 Subject: [PATCH 112/136] FlexSub: removing some print statements --- modules/subdyn/src/SD_FEM.f90 | 75 +++++++++++++++------- modules/subdyn/src/SubDyn.f90 | 113 ++++++++-------------------------- 2 files changed, 80 insertions(+), 108 deletions(-) diff --git a/modules/subdyn/src/SD_FEM.f90 b/modules/subdyn/src/SD_FEM.f90 index 1c1677934..e931274c9 100644 --- a/modules/subdyn/src/SD_FEM.f90 +++ b/modules/subdyn/src/SD_FEM.f90 @@ -73,6 +73,7 @@ MODULE SD_FEM INTEGER(IntKi), PARAMETER :: SDMaxInpCols = MAX(JointsCol,InterfCol,MembersCol,PropSetsBCol,PropSetsXCol,COSMsCol,CMassCol) + LOGICAL, PARAMETER :: DEV_VERSION = .false. INTERFACE FINDLOCI ! In the future, use FINDLOC from intrinsic MODULE PROCEDURE FINDLOCI_ReKi @@ -170,7 +171,9 @@ TYPE(IList) FUNCTION NodesList(p, Elements) ! Sorting required by find function call sort(NodesList, ErrStat2, ErrMsg2) enddo - call print_list(NodesList, 'Joint list') + if (DEV_VERSION) then + call print_list(NodesList, 'Joint list') + endif END FUNCTION NodesList !------------------------------------------------------------------------------------------------------ !> Returns list of rigid link elements (Er) @@ -193,7 +196,9 @@ TYPE(IList) FUNCTION RigidLinkElements(Init, p, ErrStat, ErrMsg) call append(RigidLinkElements, ie, ErrStat, ErrMsg); endif end do - call print_list(RigidLinkElements,'Rigid element list') + if (DEV_VERSION) then + call print_list(RigidLinkElements,'Rigid element list') + endif END FUNCTION RigidLinkElements !------------------------------------------------------------------------------------------------------ @@ -757,14 +762,18 @@ SUBROUTINE SetElementProperties(Init, p, ErrStat, ErrMsg) p%ElemProps(i)%Rho = rho else if (eType==idMemberCable) then - print*,'Member',I,'eType',eType,'Ps',P1,P2 + if (DEV_VERSION) then + print*,'Member',I,'is a cable' + endif p%ElemProps(i)%Area = 1 ! Arbitrary set to 1 p%ElemProps(i)%YoungE = Init%PropsC(P1, 2)/1 ! Young's modulus, E=EA/A [N/m^2] p%ElemProps(i)%Rho = Init%PropsC(P1, 3) ! Material density [kg/m3] p%ElemProps(i)%T0 = Init%PropsC(P1, 4) ! Pretension force [N] else if (eType==idMemberRigid) then - print*,'Member',I,'eType',eType,'Ps',P1,P2 + if (DEV_VERSION) then + print*,'Member',I,'is a rigid link' + endif p%ElemProps(i)%Area = 1 ! Arbitrary set to 1 p%ElemProps(i)%Rho = Init%PropsR(P1, 2) @@ -963,7 +972,9 @@ SUBROUTINE AssembleKM(Init, p, ErrStat, ErrMsg) ! total unconstrained degrees of freedom of the system p%nDOF = nDOF_Unconstrained() - print*,'nDOF_unconstrained:',p%nDOF, ' (if all Cantilever, it would be: ',6*p%nNodes,')' + if (DEV_VERSION) then + print*,'nDOF_unconstrained:',p%nDOF, ' (if all Cantilever, it would be: ',6*p%nNodes,')' + endif CALL AllocAry( Init%K, p%nDOF, p%nDOF , 'Init%K', ErrStat2, ErrMsg2); if(Failed()) return; ! system stiffness matrix CALL AllocAry( Init%M, p%nDOF, p%nDOF , 'Init%M', ErrStat2, ErrMsg2); if(Failed()) return; ! system mass matrix @@ -1218,12 +1229,16 @@ SUBROUTINE BuildTMatrix(Init, p, RA, RAm1, Tred, ErrStat, ErrMsg) allocate(RA_DOFtilde(1:size(RA)), stat=ErrStat2); if(Failed()) return; ! Indices of DOF for each rigid assmbly, in reduced system p%nDOF_red = nDOF_ConstraintReduced() - print*,'nDOF constraint elim', p%nDOF_red , '/' , p%nDOF + if (DEV_VERSION) then + print*,'nDOF constraint elim', p%nDOF_red , '/' , p%nDOF + endif CALL AllocAry( Tred, p%nDOF, p%nDOF_red, 'p%T_red', ErrStat2, ErrMsg2); if(Failed()) return; ! system stiffness matrix Tred=0 call init_list(IRA, size(RA), 0, ErrStat2, ErrMsg2); if(Failed()) return; IRA%List(1:size(RA)) = (/(ia , ia = 1,size(RA))/) - call print_list(IRA, 'List of RA indices') + if (DEV_VERSION) then + call print_list(IRA, 'List of RA indices') + endif ! --- For each node: ! - create list of indices I in the assembled vector of DOF @@ -1242,16 +1257,20 @@ SUBROUTINE BuildTMatrix(Init, p, RA, RAm1, Tred, ErrStat, ErrMsg) call Fatal('No rigid assembly attributed to node'//trim(Num2LStr(iNode))//'. RAm1 wrong'); return endif ia = find(IRA, aID, ErrStat2, ErrMsg2); if(Failed()) return - print*,'Node',iNode, 'is involved in RA:', aID, '. Index in list of RA to process', ia + if (DEV_VERSION) then + print*,'Node',iNode, 'is involved in RA:', aID, '. Index in list of RA to process', ia + endif if ( ia <= 0) then ! This rigid assembly has already been processed ! OLD: The DOF list is taken from the stored RA DOF list ! call init_list(p%NodesDOFtilde(iNode), RA_DOFtilde(aID)%List, ErrStat2, ErrMsg2) ! NEW: this node has no DOFs call init_list(p%NodesDOFtilde(iNode), 0, 0, ErrStat2, ErrMsg2) - print*,'The RA',aID,', has already been processed!' - print*,'N',iNode,'I ',p%NodesDOF(iNode)%List(1:6) - print*,'N',iNode,'It',RA_DOFtilde(aID)%List + if (DEV_VERSION) then + print*,'The RA',aID,', has already been processed!' + print*,'N',iNode,'I ',p%NodesDOF(iNode)%List(1:6) + print*,'N',iNode,'It',RA_DOFtilde(aID)%List + endif cycle ! We pass to the next joint else call RAElimination( RA(aID)%List, Tc, INodesID, Init, p, ErrStat2, ErrMsg2); if(Failed()) return; @@ -1287,8 +1306,8 @@ SUBROUTINE BuildTMatrix(Init, p, RA, RAm1, Tred, ErrStat, ErrMsg) call init_list(p%NodesDOFtilde(iNode), nc, 0, ErrStat2, ErrMsg2) p%NodesDOFtilde(iNode)%List(1:nc) = (/ (iprev + i, i=1,nc) /) IDOFNew => p%NodesDOFtilde(iNode)%List(1:nc) ! alias to shorten notations - print*,'N',iNode,'I ',IDOFOld - print*,'N',iNode,'It',IDOFNew + !print*,'N',iNode,'I ',IDOFOld + !print*,'N',iNode,'It',IDOFNew Tred(IDOFOld, IDOFNew) = Tc iPrev = iPrev + nc enddo @@ -1351,7 +1370,7 @@ INTEGER(IntKi) FUNCTION nDOF_ConstraintReduced() elseif(NodeType == idJointCantilever ) then if ( NodeHasRigidElem(iNode, Init, p, er)) then ! This joint is involved in a rigid link assembly, we skip it (accounted for above) - print*,'Node',iNode, 'is involved in a RA' + print*,'Node',iNode, 'is involved in a Rigid assembly' else ! That's a regular Cantilever joint nDOF_ConstraintReduced = nDOF_ConstraintReduced + 6 @@ -1500,9 +1519,13 @@ SUBROUTINE RAElimination(Elements, Tc, INodesID, Init, p, ErrStat, ErrMsg) ! --- List of nodes stored first in LINodes than moved to INodes LNodesID = NodesList(p, Elements) - print*,'Nodes involved in assembly (bfr1) ',LNodesID%List + if (DEV_VERSION) then + print*,'Nodes involved in assembly (bfr1) ',LNodesID%List + endif call unique(LNodesID, ErrStat2, ErrMsg2); - print*,'Nodes involved in assembly (bfr2) ',LNodesID%List + if (DEV_VERSION) then + print*,'Nodes involved in assembly (bfr2) ',LNodesID%List + endif !--- Look for potential interface node call init_list(LNodesInterf, 0, 0, ErrStat2, ErrMsg2); @@ -1539,7 +1562,9 @@ SUBROUTINE RAElimination(Elements, Tc, INodesID, Init, p, ErrStat, ErrMsg) iTmp = INodesID(1) INodesID(1) = INodesID(iiMainNode) INodesID(iiMainNode) = iTmp - print*,'Nodes involved in assembly (after)',INodesID + if (DEV_VERSION) then + print*,'Nodes involved in assembly (after)',INodesID + endif ! --- Building Transformation matrix nNodes =size(INodesID) @@ -1699,7 +1724,9 @@ SUBROUTINE RigidLinkAssemblies(Init, p, RA, RAm1, ErrStat, ErrMsg) e0 = pop(Er, ErrStat2, ErrMsg2); call append(Ea, e0, ErrStat2, ErrMsg2); call AddNeighbors(e0, Er, Ea) - call print_list(Ea,'Rigid assembly (loop 1)') + if (DEV_VERSION) then + call print_list(Ea,'Rigid assembly (loop 1)') + endif do ie = 1, len(Ea) e0 = get(Ea, ie, ErrStat2, ErrMsg2) RAm1(e0) = nRA ! Index of rigid assembly that this element belongs to @@ -1720,9 +1747,11 @@ SUBROUTINE RigidLinkAssemblies(Init, p, RA, RAm1, ErrStat, ErrMsg) call append(RA(ia), ie, ErrStat2, ErrMsg2) endif enddo - do ia = 1, nRA - call print_list(RA(ia),'Rigid assembly (loop 2)') - enddo + if (DEV_VERSION) then + do ia = 1, nRA + call print_list(RA(ia),'Rigid assembly (loop 2)') + enddo + endif CONTAINS !> The neighbor-elements of element e0 (that are found within the list Er) are added to the list Ea RECURSIVE SUBROUTINE AddNeighbors(e0, Er, Ea) @@ -1740,7 +1769,9 @@ RECURSIVE SUBROUTINE AddNeighbors(e0, Er, Ea) ik=ik+1 ek = Er%List(ik) if (ElementsConnected(p, e0, ek, iWhichNode_e0, iWhichNode_ek)) then - print*,'Element ',ek,'is connected to element',e0,'via its node',iWhichNode_ek + if (DEV_VERSION) then + print*,'Element ',ek,'is connected to element',e0,'via its node',iWhichNode_ek + endif ! Remove element from Er (a rigid element can belong to only one assembly) ek2 = pop(Er, ik, ErrStat2, ErrMsg2) ! same as ek before ik=ik-1 diff --git a/modules/subdyn/src/SubDyn.f90 b/modules/subdyn/src/SubDyn.f90 index feeb154dc..69806911f 100644 --- a/modules/subdyn/src/SubDyn.f90 +++ b/modules/subdyn/src/SubDyn.f90 @@ -202,7 +202,9 @@ SUBROUTINE SD_Init( InitInput, u, p, x, xd, z, OtherState, y, m, Interval, InitO InitOut%Ver = SD_ProgDesc ! --- Test TODO remove me in the future -! CALL SD_Tests(ErrStat2, ErrMsg2); if(Failed()) return + if (DEV_VERSION) then + CALL SD_Tests(ErrStat2, ErrMsg2); if(Failed()) return + endif ! transfer glue-code information to data structure for SubDyn initialization: Init%g = InitInput%g @@ -381,18 +383,7 @@ SUBROUTINE SD_UpdateStates( t, n, Inputs, InputTimes, p, x, xd, z, OtherState, m ErrStat = ErrID_None ! no error has occurred ErrMsg = "" - !print*,'------------------------------------------------------' - !print*,'------------------------------------------------------' - !print*,'------------------------------------------------------' - !print*,'------------------------------------------------------' - !print*,'UpdateState',t,n - !print*,'------------------------------------------------------' - !print*,'------------------------------------------------------' - !print*,'------------------------------------------------------' - !print*,'------------------------------------------------------' IF ( p%nDOFM == 0) RETURN ! no retained modes = no states - !print*,'x%qm (in)',x%qm - !print*,'x%qmd (in)',x%qmdot IF (p%IntMethod .eq. 1) THEN CALL SD_RK4( t, n, Inputs, InputTimes, p, x, xd, z, OtherState, m, ErrStat, ErrMsg ) @@ -403,8 +394,6 @@ SUBROUTINE SD_UpdateStates( t, n, Inputs, InputTimes, p, x, xd, z, OtherState, m ELSE CALL SD_AM2( t, n, Inputs, InputTimes, p, x, xd, z, OtherState, m, ErrStat, ErrMsg ) END IF - !print*,'x%qm (out)',x%qm - !print*,'x%qmd(out)',x%qmdot END SUBROUTINE SD_UpdateStates @@ -440,7 +429,6 @@ SUBROUTINE SD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) TYPE(SD_ContinuousStateType) :: dxdt ! Continuous state derivatives at t- for output file qmdotdot purposes only INTEGER(IntKi) :: ErrStat2 ! Error status of the operation (occurs after initial error) CHARACTER(ErrMsgLen) :: ErrMsg2 ! Error message if ErrStat2 /= ErrID_None - logical:: LinDetected ! Initialize ErrStat ErrStat = ErrID_None ErrMsg = "" @@ -453,19 +441,6 @@ SUBROUTINE SD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) m%udot_TP = (/u%TPMesh%TranslationVel( :,1), u%TPMesh%RotationVel(:,1)/) m%udotdot_TP = (/u%TPMesh%TranslationAcc( :,1), u%TPMesh%RotationAcc(:,1)/) - !print*,'-----------------------------------------' - !print*,'CalCoutput',t - - LinDetected=.false. - DO iY2Node = 1,p%nNodes - if (any(abs(u%LMesh%Force (:,iY2Node) - 1000000)<1)) LinDetected = .true. - if (any(abs(u%LMesh%Moment (:,iY2Node) - 1000000)<1)) LinDetected = .true. - enddo - !if (.not. LinDetected) print*,'>>>> TRUE CALL' - !if ( LinDetected) print*,'>>>> LIN CALL' - - !print*,'uTP',m%u_TP - ! Inputs on interior nodes: CALL GetExtForceOnInternalDOF( u, p, m, m%UFL ) @@ -488,11 +463,6 @@ SUBROUTINE SD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) m%UL_dot = matmul( p%PhiRb_TI, m%udot_TP ) ! UL_dot [ Y2(4) = 0*x(2) + D2(4,2)*u(2) ] m%UL_dotdot = matmul( p%PhiRb_TI, m%udotdot_TP ) ! UL_dotdot [ Y2(6) = 0*x(:) + D2(6,3)*u(3) + 0*u(4) + 0] END IF - !if (.not. LinDetected) print*,'UL',m%UL - - !if (t>0.010) then - ! STOP - !endif !STATIC IMPROVEMENT METHOD ( modify UL ) if (p%SttcSolve/=idSIM_None) then @@ -517,7 +487,6 @@ SUBROUTINE SD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) m%UL = m%UL - UL0M end if endif - !print*,'UL',m%UL ! --- Build original DOF vectors (DOF before the CB reduction) m%U_red (p%IDI__) = m%UR_bar m%U_red (p%ID__L) = m%UL @@ -550,13 +519,7 @@ SUBROUTINE SD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) y%Y2mesh%TranslationAcc (:,iY2Node) = m%U_full_dotdot (DOFList(1:3)) y%Y2mesh%RotationVel (:,iY2Node) = m%U_full_dot (DOFList(4:6)) y%Y2mesh%RotationAcc (:,iY2Node) = m%U_full_dotdot (DOFList(4:6)) - !if (.not. LinDetected)print*,'Ufull ',iSDNode, m%U_full (DOFList(1:6)) - !if (.not. LinDetected)print*,'Ufulld ',iSDNode, m%U_full_dot (DOFList(1:6)) - !if (.not. LinDetected)print*,'Ufulldd',iSDNode, m%U_full_dotdot (DOFList(1:6)) enddo -! DO iY2Node = 1,p%nNodes -! print*,'Y2Disp',iY2Node,y%Y2mesh%TranslationDisp (:,iY2Node) -! enddo !________________________________________ ! Set loads outputs on y%Y1Mesh !________________________________________ @@ -574,7 +537,6 @@ SUBROUTINE SD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) !Take care of Hydrodynamic Forces that will go into INterface Forces later HydroForces(startDOF:startDOF+5) = (/u%LMesh%Force(1:3,iY2Node),u%LMesh%Moment(1:3,iY2Node)/) !(6,NNODES_I) ENDDO - !print*,'HydroForces',HydroForces !HydroTP = matmul(transpose(p%TI),HydroForces) ! (6,1) calculated below ! note: matmul( HydroForces, p%TI ) = matmul( transpose(p%TI), HydroForces) because HydroForces is 1-D @@ -590,7 +552,6 @@ SUBROUTINE SD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) ! Y1(:3) = -f_TP ! MExtra = -u_TP x f_TP ! Y1_MExtra = - MExtra = -u_TP x Y1(1:3) ! NOTE: double cancelling of signs - !if (.not. LinDetected)print*,'Y1',Y1 if (p%ExtraMoment) then Y1_ExtraMoment(1) = - m%u_TP(2) * Y1(3) + m%u_TP(3) * Y1(2) Y1_ExtraMoment(2) = - m%u_TP(3) * Y1(1) + m%u_TP(1) * Y1(3) @@ -2244,10 +2205,8 @@ SUBROUTINE PartitionDOFNodes(Init, m, p, ErrStat, ErrMsg) ! DOFs of internal nodes p%nDOFL_L=0 do iiNode= 1,p%nNodes_L - print*,'NodeL',p%Nodes_L(iiNode,1), 'DOF:',p%NodesDOFtilde( p%Nodes_L(iiNode,1) )%List p%nDOFL_L = p%nDOFL_L + len(p%NodesDOFtilde( p%Nodes_L(iiNode,1) )) enddo - print*,'L_L',p%nDOFL_L,'red',p%nDOF_red,'R__',p%nDOFR__ if (p%nDOFL_L/=p%nDOF_red-p%nDOFR__) then call Fatal('Error in distributing internal DOFs, total number of internal DOF('//num2lstr(p%nDOFL_L)//') does not equal total number of DOF('//num2lstr(p%nDOF_red)//') minus interface and reaction ('//num2lstr(p%nDOFR__)//')'); return endif @@ -2369,38 +2328,25 @@ SUBROUTINE PartitionDOFNodes(Init, m, p, ErrStat, ErrMsg) endif enddo - !print*,'DOFI__ ',p%IDI__ - !print*,'DOFI_Rb ',p%IDI_Rb - !print*,'DOFI_F ',p%IDI_F - !print*,'DOFC__ ',p%IDC__ - !print*,'DOFC_Rb ',p%IDC_Rb - !print*,'DOFC_F ',p%IDC_F - !print*,'DOFC_L ',p%IDC_L - !print*,'DOFR__ ',p%IDR__ - !print*,'DOFL_L ',p%IDL_L - !print*,'DOF__Rb ',p%ID__Rb - !print*,'DOF__F ',p%ID__F - !print*,'DOF__L ',p%ID__L - !print*,'Nodes_C',p%Nodes_C(:,1) - !print*,'Nodes_L',p%Nodes_L(:,1) - !print*,'Nodes_I',p%Nodes_I(:,1) - write(*,'(A,I0)')'Number of DOFs: "interface" (I__): ',p%nDOFI__ - write(*,'(A,I0)')'Number of DOFs: "interface" retained (I_B): ',p%nDOFI_Rb - write(*,'(A,I0)')'Number of DOFs: "interface" fixed (I_F): ',p%nDOFI_F - write(*,'(A,I0)')'Number of DOFs: "reactions" (C__): ',p%nDOFC__ - write(*,'(A,I0)')'Number of DOFs: "reactions" retained (C_B): ',p%nDOFC_Rb - write(*,'(A,I0)')'Number of DOFs: "reactions" internal (C_L): ',p%nDOFC_L - write(*,'(A,I0)')'Number of DOFs: "reactions" fixed (C_F): ',p%nDOFC_F - write(*,'(A,I0)')'Number of DOFs: "intf+react" (__R): ',p%nDOFR__ - write(*,'(A,I0)')'Number of DOFs: "internal" internal (L_L): ',p%nDOFL_L - write(*,'(A,I0)')'Number of DOFs: retained (__B): ',p%nDOF__Rb - write(*,'(A,I0)')'Number of DOFs: internal (__L): ',p%nDOF__L - write(*,'(A,I0)')'Number of DOFs: fixed (__F): ',p%nDOF__F - write(*,'(A,I0)')'Number of DOFs: total : ',p%nDOF_red - write(*,'(A,I0)')'Number of Nodes: "interface" (I): ',p%nNodes_I - write(*,'(A,I0)')'Number of Nodes: "reactions" (C): ',p%nNodes_C - write(*,'(A,I0)')'Number of Nodes: "internal" (L): ',p%nNodes_L - write(*,'(A,I0)')'Number of Nodes: total (I+C+L): ',p%nNodes + if(DEV_VERSION) then + write(*,'(A,I0)')'Number of DOFs: "interface" (I__): ',p%nDOFI__ + write(*,'(A,I0)')'Number of DOFs: "interface" retained (I_B): ',p%nDOFI_Rb + write(*,'(A,I0)')'Number of DOFs: "interface" fixed (I_F): ',p%nDOFI_F + write(*,'(A,I0)')'Number of DOFs: "reactions" (C__): ',p%nDOFC__ + write(*,'(A,I0)')'Number of DOFs: "reactions" retained (C_B): ',p%nDOFC_Rb + write(*,'(A,I0)')'Number of DOFs: "reactions" internal (C_L): ',p%nDOFC_L + write(*,'(A,I0)')'Number of DOFs: "reactions" fixed (C_F): ',p%nDOFC_F + write(*,'(A,I0)')'Number of DOFs: "intf+react" (__R): ',p%nDOFR__ + write(*,'(A,I0)')'Number of DOFs: "internal" internal (L_L): ',p%nDOFL_L + write(*,'(A,I0)')'Number of DOFs: retained (__B): ',p%nDOF__Rb + write(*,'(A,I0)')'Number of DOFs: internal (__L): ',p%nDOF__L + write(*,'(A,I0)')'Number of DOFs: fixed (__F): ',p%nDOF__F + write(*,'(A,I0)')'Number of DOFs: total : ',p%nDOF_red + write(*,'(A,I0)')'Number of Nodes: "interface" (I): ',p%nNodes_I + write(*,'(A,I0)')'Number of Nodes: "reactions" (C): ',p%nNodes_C + write(*,'(A,I0)')'Number of Nodes: "internal" (L): ',p%nNodes_L + write(*,'(A,I0)')'Number of Nodes: total (I+C+L): ',p%nNodes + endif call CleanUp() @@ -2440,7 +2386,6 @@ SUBROUTINE GetExtForceOnInternalDOF( u, p, m, UFL ) ! --- Build vector of external force m%Fext= myNaN DO iMeshNode = 1,p%nNodes - !print*,'iMN',iMeshNode,u%LMesh%Force (:,iMeshNode),u%LMesh%Moment(:,iMeshNode) iSDNode = p%INodes_Mesh_to_SD(iMeshNode) nMembers = (size(p%NodesDOF(iSDNode)%List)-3)/3 ! Number of members deducted from Node's nDOFList ! Force - All nodes have only 3 translational DOFs @@ -2450,21 +2395,17 @@ SUBROUTINE GetExtForceOnInternalDOF( u, p, m, UFL ) m%Fext( p%NodesDOF(iSDNode)%List(5::3)) = u%LMesh%Moment(2,iMeshNode)/nMembers m%Fext( p%NodesDOF(iSDNode)%List(6::3)) = u%LMesh%Moment(3,iMeshNode)/nMembers enddo - !print*,'----' - !DO iSDNode = 1,p%nNodes - ! iMeshNode = p%INodes_SD_to_Mesh(iSDNode) - ! print*,'iSD',iSDNode,u%LMesh%Force (:,iMeshNode),u%LMesh%Moment(:,iMeshNode) - !enddo ! TODO: remove test below in the future - if (any(m%Fext == myNaN)) then - print*,'Error in setting up Fext' - STOP + if (DEV_VERSION) then + if (any(m%Fext == myNaN)) then + print*,'Error in setting up Fext' + STOP + endif endif ! --- Reduced vector of external force m%Fext_red = matmul(transpose(p%T_red), m%Fext) UFL= m%Fext_red(p%ID__L) - !print*,'UFL',UFL END SUBROUTINE GetExtForceOnInternalDOF From df696ea8f584416e0926c39393aa3b8453107bd7 Mon Sep 17 00:00:00 2001 From: Emmanuel Branlard Date: Wed, 17 Jun 2020 20:27:15 -0600 Subject: [PATCH 113/136] FlexSub: input/output meshes now same as subdyn mesh --- modules/subdyn/src/SubDyn.f90 | 124 +++---------------------- modules/subdyn/src/SubDyn_Output.f90 | 8 +- modules/subdyn/src/SubDyn_Registry.txt | 2 - modules/subdyn/src/SubDyn_Types.f90 | 114 ----------------------- 4 files changed, 18 insertions(+), 230 deletions(-) diff --git a/modules/subdyn/src/SubDyn.f90 b/modules/subdyn/src/SubDyn.f90 index 69806911f..d81cd1623 100644 --- a/modules/subdyn/src/SubDyn.f90 +++ b/modules/subdyn/src/SubDyn.f90 @@ -46,7 +46,6 @@ Module SubDyn PUBLIC :: SD_CalcOutput ! Routine for computing outputs PUBLIC :: SD_CalcContStateDeriv ! Tight coupling routine for computing derivatives of continuous states - LOGICAL, parameter :: NO_Y2_MAP = .False. CONTAINS SUBROUTINE CreateTPMeshes( TP_RefPoint, inputMesh, outputMesh, ErrStat, ErrMsg ) @@ -85,13 +84,10 @@ SUBROUTINE CreateTPMeshes( TP_RefPoint, inputMesh, outputMesh, ErrStat, ErrMsg ) END SUBROUTINE CreateTPMeshes !--------------------------------------------------------------------------- !> Create output (Y2, for motion) and input (u, for forces)meshes, based on SubDyn nodes -!! Ordering of nodes is: I (interface), L (internal), C (bottom) -SUBROUTINE CreateY2Meshes( NNode, Nodes, INodes_I, INodes_L, INodes_C, inputMesh, outputMesh, ErrStat, ErrMsg ) +!! Ordering of nodes is the same as SubDyn (used to be : I L C) +SUBROUTINE CreateInputOutputMeshes( NNode, Nodes, inputMesh, outputMesh, ErrStat, ErrMsg ) INTEGER(IntKi), INTENT( IN ) :: NNode !total number of nodes in the structure, used to size the array Nodes, i.e. its rows REAL(ReKi), INTENT( IN ) :: Nodes(NNode, JointsCol) - INTEGER(IntKi), INTENT( IN ) :: INodes_I(:) !< Indices of interface nodes - INTEGER(IntKi), INTENT( IN ) :: INodes_L(:) !< Indices of interior nodes - INTEGER(IntKi), INTENT( IN ) :: INodes_C(:) !< Indices of reaction nodes TYPE(MeshType), INTENT( INOUT ) :: inputMesh ! u%LMesh TYPE(MeshType), INTENT( INOUT ) :: outputMesh ! y%Y2Mesh INTEGER(IntKi), INTENT( OUT ) :: ErrStat ! Error status of the operation @@ -109,35 +105,11 @@ SUBROUTINE CreateY2Meshes( NNode, Nodes, INodes_I, INodes_L, INodes_C, inputMesh ,Force = .TRUE. & ,Moment = .TRUE. ) - if (NO_Y2_MAP) then - DO I = 1,size(Nodes,1) - Point = Nodes(I, 2:4) - CALL MeshPositionNode(inputMesh, I, Point, ErrStat, ErrMsg); IF(ErrStat/=ErrID_None) RETURN - CALL MeshConstructElement(inputMesh, ELEMENT_POINT, ErrStat, ErrMsg, I) - ENDDO - else - ! --- Interface nodes - iOffset = 0 - DO I = 1,size(INodes_I) - Point = Nodes(INodes_I(I), 2:4) - CALL MeshPositionNode(inputMesh, I+iOffSet, Point, ErrStat, ErrMsg); IF(ErrStat/=ErrID_None) RETURN - CALL MeshConstructElement(inputMesh, ELEMENT_POINT, ErrStat, ErrMsg, I+iOffset) - ENDDO - ! --- Interior nodes - iOffset = size(INodes_I) - DO I = 1,size(INodes_L) - Point = Nodes(INodes_L(I), 2:4) - CALL MeshPositionNode(inputMesh, I+iOffSet, Point, ErrStat, ErrMsg); IF(ErrStat/=ErrID_None) RETURN - CALL MeshConstructElement(inputMesh, ELEMENT_POINT, ErrStat, ErrMsg, I+iOffset) - END DO - ! --- Base Reaction nodes - iOffset = size(INodes_I) + size(INodes_L) - DO I = 1,size(INodes_C) - Point = Nodes(INodes_C(I), 2:4) - CALL MeshPositionNode(inputMesh, I+iOffSet, Point, ErrStat, ErrMsg); IF(ErrStat/=ErrID_None) RETURN - CALL MeshConstructElement(inputMesh, ELEMENT_POINT, ErrStat, ErrMsg, I+iOffset) - END DO - endif + DO I = 1,size(Nodes,1) + Point = Nodes(I, 2:4) + CALL MeshPositionNode(inputMesh, I, Point, ErrStat, ErrMsg); IF(ErrStat/=ErrID_None) RETURN + CALL MeshConstructElement(inputMesh, ELEMENT_POINT, ErrStat, ErrMsg, I) + ENDDO CALL MeshCommit ( inputMesh, ErrStat, ErrMsg); IF(ErrStat/=ErrID_None) RETURN ! Create the Interior Points output mesh as a sibling copy of the input mesh @@ -158,7 +130,7 @@ SUBROUTINE CreateY2Meshes( NNode, Nodes, INodes_I, INodes_L, INodes_C, inputMesh !Identity should mean no rotation, which is our first guess at the output -RRD CALL Eye( outputMesh%Orientation, ErrStat, ErrMsg ) -END SUBROUTINE CreateY2Meshes +END SUBROUTINE CreateInputOutputMeshes !--------------------------------------------------------------------------- !> This routine is called at the start of the simulation to perform initialization steps. !! The parameters are set here and not changed during the simulation. @@ -316,14 +288,8 @@ SUBROUTINE SD_Init( InitInput, u, p, x, xd, z, OtherState, y, m, Interval, InitO ! Create the input and output meshes associated with Transition Piece reference point CALL CreateTPMeshes( InitInput%TP_RefPoint, u%TPMesh, y%Y1Mesh, ErrStat2, ErrMsg2 ); if(Failed()) return - ! Construct the input mesh for the interior nodes which result from the Craig-Bampton reduction - CALL CreateY2Meshes( p%nNodes, Init%Nodes, p%Nodes_I(:,1), p%Nodes_L(:,1), p%Nodes_C(:,1), u%LMesh, y%Y2Mesh, ErrStat2, ErrMsg2 ); if(Failed()) return - call AllocAry( p%INodes_Mesh_to_SD, p%nNodes, 'INodes_Mesh_to_SD', ErrStat2, ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocMiscVars') - call AllocAry( p%INodes_SD_to_Mesh, p%nNodes, 'INodes_SD_to_Mesh', ErrStat2, ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocMiscVars') - call Y2Mesh_SD_Mapping(p, p%INodes_Mesh_to_SD) ! Store mapping from y2/u mesh to Subdyn nodes indices - call SD_Y2Mesh_Mapping(p, p%INodes_SD_to_Mesh) ! Store mapping from Subdyn to y2/u-mesh nodes indices - !print*,'I_SD_to_Mesh',p%INodes_SD_to_Mesh - !print*,'I_Mesh_to_SD',p%INodes_Mesh_to_SD + ! Construct the input mesh (u%LMesh, force on nodes) and output mesh (y%Y2Mesh, displacements) + CALL CreateInputOutputMeshes( p%nNodes, Init%Nodes, u%LMesh, y%Y2Mesh, ErrStat2, ErrMsg2 ); if(Failed()) return ! --- Write the summary file IF ( Init%SSSum ) THEN @@ -507,7 +473,7 @@ SUBROUTINE SD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) ! --- Place displacement/velocity/acceleration into Y2 output mesh DO iSDNode = 1,p%nNodes - iY2Node = p%INodes_SD_to_Mesh(iSDNode) + iY2Node = iSDNode DOFList => p%NodesDOF(iSDNode)%List ! Alias to shorten notations ! TODO TODO which orientation to give for joints with more than 6 dofs? ! Construct the direction cosine matrix given the output angles @@ -532,7 +498,7 @@ SUBROUTINE SD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) !TODO: where are these HydroTP, HydroForces documented? DO I = 1, p%nNodes_I iSDNode = p%Nodes_I(I,1) - iY2Node = p%INodes_SD_to_Mesh(iSDNode) + iY2Node = iSDNode startDOF = (I-1)*6 + 1 ! NOTE: this works since interface is assumed to be sorted like LMesh and have 6 DOF per nodes !Take care of Hydrodynamic Forces that will go into INterface Forces later HydroForces(startDOF:startDOF+5) = (/u%LMesh%Force(1:3,iY2Node),u%LMesh%Moment(1:3,iY2Node)/) !(6,NNODES_I) @@ -2386,7 +2352,7 @@ SUBROUTINE GetExtForceOnInternalDOF( u, p, m, UFL ) ! --- Build vector of external force m%Fext= myNaN DO iMeshNode = 1,p%nNodes - iSDNode = p%INodes_Mesh_to_SD(iMeshNode) + iSDNode = iMeshNode nMembers = (size(p%NodesDOF(iSDNode)%List)-3)/3 ! Number of members deducted from Node's nDOFList ! Force - All nodes have only 3 translational DOFs m%Fext( p%NodesDOF(iSDNode)%List(1:3) ) = u%LMesh%Force (:,iMeshNode) @@ -2524,15 +2490,8 @@ SUBROUTINE OutSummary(Init, p, InitInput, CBparams, ErrStat,ErrMsg) call yaml_write_array(UnSum, 'DOF2Nodes', p%DOFtilde2Nodes , IFmt, ErrStat2, ErrMsg2, comment='(nDOFRed x 3, for each constrained DOF, col1: node index, col2: number of DOF, col3: DOF starting from 1)',label=.true.) ! Nodes properties - CALL AllocAry( DummyArray, size(Init%Nodes,1), JointsCol+1, 'Elem', ErrStat2, ErrMsg2 ); if(Failed()) return - do i = 1, p%nNodes - DummyArray(i,1) = Init%Nodes(i, 1) - DummyArray(i,2) = p%INodes_SD_to_Mesh(i) - DummyArray(i,3:JointsCol+1) = Init%Nodes(i, 2:JointsCol) - enddo - write(UnSum, '("#",4x,2(A9),9('//trim(SFmt)//'))') 'Node_[#]', 'Y2Node', 'X_[m]','Y_[m]','Z_[m]', 'JType_[-]', 'JDirX_[-]','JDirY_[-]','JDirZ_[-]','JStff_[Nm/rad]','JDmp_[Nm/rad.s]' - call yaml_write_array(UnSum, 'Nodes', DummyArray, ReFmt, ErrStat2, ErrMsg2, AllFmt='2(F8.0,","),3(F15.3,","),F15.0,5(E15.6,",")') !, comment='',label=.true.) - deallocate(DummyArray) + write(UnSum, '("#",4x,1(A9),9('//trim(SFmt)//'))') 'Node_[#]', 'X_[m]','Y_[m]','Z_[m]', 'JType_[-]', 'JDirX_[-]','JDirY_[-]','JDirZ_[-]','JStff_[Nm/rad]','JDmp_[Nm/rad.s]' + call yaml_write_array(UnSum, 'Nodes', Init%Nodes, ReFmt, ErrStat2, ErrMsg2, AllFmt='1(F8.0,","),3(F15.3,","),F15.0,5(E15.6,",")') !, comment='',label=.true.) ! Element properties CALL AllocAry( DummyArray, size(p%ElemProps), 16, 'Elem', ErrStat2, ErrMsg2 ); if(Failed()) return @@ -2753,59 +2712,6 @@ SUBROUTINE CleanUp() END SUBROUTINE CleanUp END SUBROUTINE OutSummary -!------------------------------------------------------------------------------------------------------ -!> Set the index array that maps SD internal nodes to the Y2Mesh nodes. -!! NOTE: SDtoMesh is not checked for size, nor are the index array values checked for validity, -!! so this routine could easily have segmentation faults if any errors exist. -SUBROUTINE SD_Y2Mesh_Mapping(p, SDtoMesh) - TYPE(SD_ParameterType), INTENT(IN ) :: p !< Parameters - INTEGER(IntKi), INTENT( OUT) :: SDtoMesh(:) !< index/mapping of mesh nodes with SD mesh - ! locals - INTEGER(IntKi) :: i - INTEGER(IntKi) :: SDnode - INTEGER(IntKi) :: y2Node - if (NO_Y2_MAP) then - DO I = 1,SIZE(SDtoMesh) - SDtoMesh( I ) = I - END DO - else - y2Node = 0 - ! Interface nodes (IDI) - DO I = 1,SIZE(p%Nodes_I,1) - y2Node = y2Node + 1 - SDnode = p%Nodes_I(I,1) - SDtoMesh( SDnode ) = y2Node ! TODO add safety check - END DO - ! Interior nodes (IDL) - DO I = 1,SIZE(p%Nodes_L,1) - y2Node = y2Node + 1 - SDnode = p%Nodes_L(I,1) - SDtoMesh( SDnode ) = y2Node ! TODO add safety check - END DO - ! Base Reaction nodes (IDC) - DO I = 1,SIZE(p%Nodes_C,1) - y2Node = y2Node + 1 - SDnode = p%Nodes_C(I,1) - SDtoMesh( SDnode ) = y2Node ! TODO add safety check - END DO - endif -END SUBROUTINE SD_Y2Mesh_Mapping -!> -SUBROUTINE Y2Mesh_SD_Mapping(p, MeshtoSD) - TYPE(SD_ParameterType), INTENT(IN ) :: p !< Parameters - INTEGER(IntKi), INTENT( OUT) :: MeshtoSD(:) !< index/mapping of mesh nodes with SD mesh - INTEGER(IntKi) :: I - if (NO_Y2_MAP) then - DO I = 1,SIZE(MeshtoSD) - MeshtoSD( I ) = I - END DO - else - MeshtoSD( 1:p%nNodes_I) = p%Nodes_I(:,1) - MeshtoSD(p%nNodes_I+ 1:p%nNodes_I+p%nNodes_L) = p%Nodes_L(:,1) - MeshtoSD(p%nNodes_I+p%nNodes_L+1:p%nNodes_I+p%nNodes_L+p%nNodes_C) = p%Nodes_C(:,1) - endif -END SUBROUTINE Y2Mesh_SD_Mapping - !------------------------------------------------------------------------------------------------------ !> Calculate length of a member as given in input file !! Joints and Members ID have not been reindexed (Elems and Nodes have) diff --git a/modules/subdyn/src/SubDyn_Output.f90 b/modules/subdyn/src/SubDyn_Output.f90 index 41dd02fd7..2c68d3b49 100644 --- a/modules/subdyn/src/SubDyn_Output.f90 +++ b/modules/subdyn/src/SubDyn_Output.f90 @@ -395,11 +395,9 @@ SUBROUTINE SDOut_MapOutputs( CurrentTime, u,p,x, y, m, AllOuts, ErrStat, ErrMsg ENDDO ENDDO ! FK_elm2 ! + FM_elm2 !removed the inertial component 12/13 !Not sure why I need an intermediate step here, but the sum would not work otherwise - !NEED TO ADD HYDRODYNAMIC FORCES AT THE RESTRAINT NODES - ! The joind iD of the reaction, i.e. thre reaction node ID is within p%MOutLst3(I)%Noutcnt - !Since constrained nodes are ordered as given in the input file and so as in the order of y2mesh, i Can do: - iSDNode = p%Nodes_C(I,1) - iMeshNode = p%INodes_SD_to_Mesh(iSDNode) + ! NEED TO ADD HYDRODYNAMIC FORCES AT THE RESTRAINT NODES + iSDNode = p%Nodes_C(I,1) + iMeshNode = iSDNode ! input and Y2 mesh nodes are the same as subdyn Fext = (/ u%LMesh%Force(:,iMeshNode), u%LMesh%Moment(:,iMeshNode) /) ReactNs((I-1)*6+1:6*I) = FK_elm2 - Fext !Accumulate reactions from all nodes in GLOBAL COORDINATES ENDDO diff --git a/modules/subdyn/src/SubDyn_Registry.txt b/modules/subdyn/src/SubDyn_Registry.txt index cdb6bda75..adca6cee0 100644 --- a/modules/subdyn/src/SubDyn_Registry.txt +++ b/modules/subdyn/src/SubDyn_Registry.txt @@ -175,8 +175,6 @@ typedef ^ ParameterType ElemPropType ElemProps {:} - - "List of element properti typedef ^ ^ ReKi T_red {:}{:} - - "Transformation matrix performing the constraint reduction x = T. xtilde" "-" typedef ^ ^ IList NodesDOF {:} - - "DOF indices of each nodes in unconstrained assembled system " "-" typedef ^ ^ IList NodesDOFtilde {:} - - "DOF indices of each nodes in constrained assembled system " "-" -typedef ^ ^ IntKi INodes_Mesh_to_SD {:} - - "Nodes indices from Y2/U-mesh to subdyn iSDNode = INodes_Mesh_to_SD(iMeshNode) " "-" -typedef ^ ^ IntKi INodes_SD_to_Mesh {:} - - "Nodes indices from subdyn nodes to U/Y2-Mesh iMeshNode = INodes_SD_to_Mesh(iSDNode) " "-" typedef ^ ^ IntKi ElemsDOF {:}{:} - - "12 DOF indices of node 1 and 2 of a given member in unconstrained assembled system " "-" typedef ^ ^ IntKi DOFtilde2Nodes {:}{:} - - "nDOFRed x 3, for each constrained DOF, col1 node index, col2 number of DOF, col3 DOF starting from 1" "-" # --- CB reduction diff --git a/modules/subdyn/src/SubDyn_Types.f90 b/modules/subdyn/src/SubDyn_Types.f90 index 875a2b3c6..16bb630f3 100644 --- a/modules/subdyn/src/SubDyn_Types.f90 +++ b/modules/subdyn/src/SubDyn_Types.f90 @@ -214,8 +214,6 @@ MODULE SubDyn_Types REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: T_red !< Transformation matrix performing the constraint reduction x = T. xtilde [-] TYPE(IList) , DIMENSION(:), ALLOCATABLE :: NodesDOF !< DOF indices of each nodes in unconstrained assembled system [-] TYPE(IList) , DIMENSION(:), ALLOCATABLE :: NodesDOFtilde !< DOF indices of each nodes in constrained assembled system [-] - INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: INodes_Mesh_to_SD !< Nodes indices from Y2/U-mesh to subdyn iSDNode = INodes_Mesh_to_SD(iMeshNode) [-] - INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: INodes_SD_to_Mesh !< Nodes indices from subdyn nodes to U/Y2-Mesh iMeshNode = INodes_SD_to_Mesh(iSDNode) [-] INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: ElemsDOF !< 12 DOF indices of node 1 and 2 of a given member in unconstrained assembled system [-] INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: DOFtilde2Nodes !< nDOFRed x 3, for each constrained DOF, col1 node index, col2 number of DOF, col3 DOF starting from 1 [-] INTEGER(IntKi) :: nDOFM !< retained degrees of freedom (modes) [-] @@ -6778,30 +6776,6 @@ SUBROUTINE SD_CopyParam( SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg ) IF (ErrStat>=AbortErrLev) RETURN ENDDO ENDIF -IF (ALLOCATED(SrcParamData%INodes_Mesh_to_SD)) THEN - i1_l = LBOUND(SrcParamData%INodes_Mesh_to_SD,1) - i1_u = UBOUND(SrcParamData%INodes_Mesh_to_SD,1) - IF (.NOT. ALLOCATED(DstParamData%INodes_Mesh_to_SD)) THEN - ALLOCATE(DstParamData%INodes_Mesh_to_SD(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%INodes_Mesh_to_SD.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - END IF - DstParamData%INodes_Mesh_to_SD = SrcParamData%INodes_Mesh_to_SD -ENDIF -IF (ALLOCATED(SrcParamData%INodes_SD_to_Mesh)) THEN - i1_l = LBOUND(SrcParamData%INodes_SD_to_Mesh,1) - i1_u = UBOUND(SrcParamData%INodes_SD_to_Mesh,1) - IF (.NOT. ALLOCATED(DstParamData%INodes_SD_to_Mesh)) THEN - ALLOCATE(DstParamData%INodes_SD_to_Mesh(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%INodes_SD_to_Mesh.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - END IF - DstParamData%INodes_SD_to_Mesh = SrcParamData%INodes_SD_to_Mesh -ENDIF IF (ALLOCATED(SrcParamData%ElemsDOF)) THEN i1_l = LBOUND(SrcParamData%ElemsDOF,1) i1_u = UBOUND(SrcParamData%ElemsDOF,1) @@ -7522,12 +7496,6 @@ SUBROUTINE SD_DestroyParam( ParamData, ErrStat, ErrMsg ) ENDDO DEALLOCATE(ParamData%NodesDOFtilde) ENDIF -IF (ALLOCATED(ParamData%INodes_Mesh_to_SD)) THEN - DEALLOCATE(ParamData%INodes_Mesh_to_SD) -ENDIF -IF (ALLOCATED(ParamData%INodes_SD_to_Mesh)) THEN - DEALLOCATE(ParamData%INodes_SD_to_Mesh) -ENDIF IF (ALLOCATED(ParamData%ElemsDOF)) THEN DEALLOCATE(ParamData%ElemsDOF) ENDIF @@ -7809,16 +7777,6 @@ SUBROUTINE SD_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, Si END IF END DO END IF - Int_BufSz = Int_BufSz + 1 ! INodes_Mesh_to_SD allocated yes/no - IF ( ALLOCATED(InData%INodes_Mesh_to_SD) ) THEN - Int_BufSz = Int_BufSz + 2*1 ! INodes_Mesh_to_SD upper/lower bounds for each dimension - Int_BufSz = Int_BufSz + SIZE(InData%INodes_Mesh_to_SD) ! INodes_Mesh_to_SD - END IF - Int_BufSz = Int_BufSz + 1 ! INodes_SD_to_Mesh allocated yes/no - IF ( ALLOCATED(InData%INodes_SD_to_Mesh) ) THEN - Int_BufSz = Int_BufSz + 2*1 ! INodes_SD_to_Mesh upper/lower bounds for each dimension - Int_BufSz = Int_BufSz + SIZE(InData%INodes_SD_to_Mesh) ! INodes_SD_to_Mesh - END IF Int_BufSz = Int_BufSz + 1 ! ElemsDOF allocated yes/no IF ( ALLOCATED(InData%ElemsDOF) ) THEN Int_BufSz = Int_BufSz + 2*2 ! ElemsDOF upper/lower bounds for each dimension @@ -8359,32 +8317,6 @@ SUBROUTINE SD_PackParam( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ErrMsg, Si ENDIF END DO END IF - IF ( .NOT. ALLOCATED(InData%INodes_Mesh_to_SD) ) 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%INodes_Mesh_to_SD,1) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%INodes_Mesh_to_SD,1) - Int_Xferred = Int_Xferred + 2 - - IF (SIZE(InData%INodes_Mesh_to_SD)>0) IntKiBuf ( Int_Xferred:Int_Xferred+(SIZE(InData%INodes_Mesh_to_SD))-1 ) = PACK(InData%INodes_Mesh_to_SD,.TRUE.) - Int_Xferred = Int_Xferred + SIZE(InData%INodes_Mesh_to_SD) - END IF - IF ( .NOT. ALLOCATED(InData%INodes_SD_to_Mesh) ) 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%INodes_SD_to_Mesh,1) - IntKiBuf( Int_Xferred + 1) = UBOUND(InData%INodes_SD_to_Mesh,1) - Int_Xferred = Int_Xferred + 2 - - IF (SIZE(InData%INodes_SD_to_Mesh)>0) IntKiBuf ( Int_Xferred:Int_Xferred+(SIZE(InData%INodes_SD_to_Mesh))-1 ) = PACK(InData%INodes_SD_to_Mesh,.TRUE.) - Int_Xferred = Int_Xferred + SIZE(InData%INodes_SD_to_Mesh) - END IF IF ( .NOT. ALLOCATED(InData%ElemsDOF) ) THEN IntKiBuf( Int_Xferred ) = 0 Int_Xferred = Int_Xferred + 1 @@ -9543,52 +9475,6 @@ SUBROUTINE SD_UnPackParam( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrStat, ErrMsg IF(ALLOCATED(Int_Buf)) DEALLOCATE(Int_Buf) END DO END IF - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! INodes_Mesh_to_SD 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 (ALLOCATED(OutData%INodes_Mesh_to_SD)) DEALLOCATE(OutData%INodes_Mesh_to_SD) - ALLOCATE(OutData%INodes_Mesh_to_SD(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%INodes_Mesh_to_SD.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - ALLOCATE(mask1(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating mask1.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - mask1 = .TRUE. - IF (SIZE(OutData%INodes_Mesh_to_SD)>0) OutData%INodes_Mesh_to_SD = UNPACK( IntKiBuf ( Int_Xferred:Int_Xferred+(SIZE(OutData%INodes_Mesh_to_SD))-1 ), mask1, 0_IntKi ) - Int_Xferred = Int_Xferred + SIZE(OutData%INodes_Mesh_to_SD) - DEALLOCATE(mask1) - END IF - IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! INodes_SD_to_Mesh 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 (ALLOCATED(OutData%INodes_SD_to_Mesh)) DEALLOCATE(OutData%INodes_SD_to_Mesh) - ALLOCATE(OutData%INodes_SD_to_Mesh(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating OutData%INodes_SD_to_Mesh.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - ALLOCATE(mask1(i1_l:i1_u),STAT=ErrStat2) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal, 'Error allocating mask1.', ErrStat, ErrMsg,RoutineName) - RETURN - END IF - mask1 = .TRUE. - IF (SIZE(OutData%INodes_SD_to_Mesh)>0) OutData%INodes_SD_to_Mesh = UNPACK( IntKiBuf ( Int_Xferred:Int_Xferred+(SIZE(OutData%INodes_SD_to_Mesh))-1 ), mask1, 0_IntKi ) - Int_Xferred = Int_Xferred + SIZE(OutData%INodes_SD_to_Mesh) - DEALLOCATE(mask1) - END IF IF ( IntKiBuf( Int_Xferred ) == 0 ) THEN ! ElemsDOF not allocated Int_Xferred = Int_Xferred + 1 ELSE From 36a266f47f73db6f1846e856965f9ce069fd8668 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Fri, 19 Jun 2020 10:23:43 -0600 Subject: [PATCH 114/136] SubDyn: missing logic on deallocate DummyArray may not be allocated when SoilDyn is not used. --- modules/subdyn/src/SubDyn.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/subdyn/src/SubDyn.f90 b/modules/subdyn/src/SubDyn.f90 index d81cd1623..df7bd1605 100644 --- a/modules/subdyn/src/SubDyn.f90 +++ b/modules/subdyn/src/SubDyn.f90 @@ -2526,8 +2526,8 @@ SUBROUTINE OutSummary(Init, p, InitInput, CBparams, ErrStat,ErrMsg) enddo call yaml_write_array(UnSum, 'Soil_Points_SoilDyn', Init%Soil_Points, ReFmt, ErrStat2, ErrMsg2, comment='') call yaml_write_array(UnSum, 'Soil_Points_SubDyn', DummyArray, ReFmt, ErrStat2, ErrMsg2, comment='') + deallocate(DummyArray) endif - deallocate(DummyArray) ! --- User inputs (less interesting, repeat of input file) WRITE(UnSum, '(A)') SectionDivide From c39d11d66c5592eb27331ee3b5eee3e2e8e34c74 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 23 Jun 2020 18:32:07 -0600 Subject: [PATCH 115/136] SlD: remove confusing comment in FAST_Solver --- modules/openfast-library/src/FAST_Solver.f90 | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/modules/openfast-library/src/FAST_Solver.f90 b/modules/openfast-library/src/FAST_Solver.f90 index cd7c4d465..c8c6e571b 100644 --- a/modules/openfast-library/src/FAST_Solver.f90 +++ b/modules/openfast-library/src/FAST_Solver.f90 @@ -5359,11 +5359,7 @@ SUBROUTINE FAST_AdvanceStates( t_initial, n_t_global, p_FAST, y_FAST, m_FAST, ED END IF -! FIXME: the copy to BD is redundant with above. - ! Transfer the outputs of ED to other modules. -! CALL Transfer_ED_to_HD_SD_BD_Mooring( p_FAST, ED%Output(1), HD%Input(STATE_PRED), SD%Input(1), ExtPtfm%Input(STATE_PRED), & -! MAPp%Input(STATE_PRED), FEAM%Input(STATE_PRED), MD%Input(STATE_PRED), & -! Orca%Input(STATE_PRED), BD%Input(STATE_PRED,:), MeshMapData, ErrStat2, ErrMsg2 ) + ! Transfer platform ED to SD IF ( p_FAST%CompSub == Module_SD ) THEN ! Map ED (motion) outputs to SD inputs: CALL Transfer_Point_to_Point( ED%Output(1)%PlatformPtMesh, SD%Input(1)%TPMesh, MeshMapData%ED_P_2_SD_TP, ErrStat2, ErrMsg2 ) From 59c57d7892c371bd73bf4b160aba3200a666671e Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 23 Jun 2020 18:46:26 -0600 Subject: [PATCH 116/136] SlD driver: stiffness matrix is from init --- modules/soildyn/src/driver/SoilDyn_Driver.f90 | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/modules/soildyn/src/driver/SoilDyn_Driver.f90 b/modules/soildyn/src/driver/SoilDyn_Driver.f90 index c3c3107d9..c603ae61e 100644 --- a/modules/soildyn/src/driver/SoilDyn_Driver.f90 +++ b/modules/soildyn/src/driver/SoilDyn_Driver.f90 @@ -283,15 +283,8 @@ PROGRAM SoilDyn_Driver ! If requested, get the stiffness matrix if ( SettingsFlags%StiffMatOut .and. p%CalcOption==Calc_REDWIN ) then do i=1,size(misc%dll_data) - Displacement = 0.0_R8Ki - call REDWINinterface_GetStiffMatrix( p%DLL_Trgt, p%DLL_Model, Displacement, Force, StiffMatrix, misc%dll_data(i), ErrStat, ErrMsg ) - IF ( ErrStat /= ErrID_None ) THEN ! Check if there was an error and do something about it if necessary - CALL WrScr( 'Get stiffness: '//ErrMsg ) - if ( ErrStat >= AbortErrLev ) call ProgEnd() - END IF - call WrScr('Stiffness matrix for point '//trim(Num2LStr(i))//' at T = 0') - call WrMatrix( StiffMatrix, CU, '(ES12.4)', ' StiffMatrix' ) + call WrMatrix( p%Stiffness(1:6,1:6,i), CU, '(ES12.4)', ' StiffMatrix' ) enddo endif From 55685396a669de274138c55fae95de0283af69a3 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 24 Jun 2020 08:38:59 -0600 Subject: [PATCH 117/136] SlD: remove unused variables and routines --- modules/soildyn/src/SoilDyn.f90 | 5 --- modules/soildyn/src/SoilDyn_IO.f90 | 32 ++----------------- modules/soildyn/src/driver/SoilDyn_Driver.f90 | 1 - .../src/driver/SoilDyn_Driver_Subs.f90 | 10 +----- 4 files changed, 4 insertions(+), 44 deletions(-) diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index 869c9d32c..a65f78829 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -83,7 +83,6 @@ subroutine SlD_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOu character(ErrMsgLen) :: ErrMsg2 !< local error message character(*), parameter :: RoutineName = 'SlD_Init' type(SlD_InputFile) :: InputFileData !< Data stored in the module's input file - character(1024) :: EchoFileName ! Initialize variables ErrStat = ErrID_None @@ -220,9 +219,6 @@ subroutine SlD_InitStatesMisc( InputFileData, m, xd, ErrStat, ErrMsg ) integer(IntKi) :: i ! Generic counter integer(IntKi) :: ErrStat2 !< local error status character(ErrMsgLen) :: ErrMsg2 !< local error message - logical :: FileExist - character(1024) :: PropsLoc !< Full path to PropsFile location - character(1024) :: LDispLoc !< Full path to LDispFile location ErrStat = ErrID_None ErrMsg = '' @@ -291,7 +287,6 @@ subroutine SlD_InitMeshes( InputFileData, u, y, p, m, ErrStat, ErrMsg ) character(ErrMsgLen) :: ErrMsg2 !< local error message real(R8Ki) :: DCM(3,3) - real(ReKi) :: Pos(3) real(ReKi), allocatable :: MeshLocations(:,:) select case(p%CalcOption) diff --git a/modules/soildyn/src/SoilDyn_IO.f90 b/modules/soildyn/src/SoilDyn_IO.f90 index 93bd7146a..396f9b9a5 100644 --- a/modules/soildyn/src/SoilDyn_IO.f90 +++ b/modules/soildyn/src/SoilDyn_IO.f90 @@ -212,8 +212,6 @@ subroutine SlD_ReadInput( InputFileName, EchoFileName, InputFileData, ErrStat, E integer(IntKi) :: UnitInput !< Unit number for the input file integer(IntKi) :: UnitEcho !< The local unit number for this module's echo file - character(1024) :: TmpPath !< Temporary storage for relative path name - character(1024) :: TmpFmt !< Temporary storage for format statement character(35) :: Frmt !< Output format for logical parameters. (matches NWTC Subroutine Library format) character(200) :: Line !< Temporary storage of a line from the input file (to compare with "default") integer(IntKi) :: LineLen !< Length of the line read @@ -549,28 +547,6 @@ end subroutine CheckWtrDepth END SUBROUTINE SlD_ValidateInput -!==================================================================================================== -!> This private subroutine copies the info from the input file over to the parameters for SoilDyn. -SUBROUTINE SlD_SetParameters( InitInp, InputFileData, p, m, ErrStat, ErrMsg ) - TYPE(Sld_InitInputType), INTENT(IN ) :: InitInp !< Input data for initialization - TYPE(Sld_InputFile), INTENT(INOUT) :: InputFileData !< The data for initialization - TYPE(Sld_ParameterType), INTENT(INOUT) :: p !< The parameters for SoilDyn - TYPE(Sld_MiscVarType), INTENT(INOUT) :: m !< The misc/optimization variables for SoilDyn - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status from this subroutine - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message from this subroutine - INTEGER(IntKi) :: TmpErrStat !< Temporary error status for subroutine and function calls - CHARACTER(ErrMsgLen) :: TmpErrMsg !< Temporary error message for subroutine and function calls - INTEGER(IntKi) :: I !< Generic counter - CHARACTER(*), PARAMETER :: RoutineName="SlD_SetParameters" - - ! Initialize ErrStat - ErrStat = ErrID_None - ErrMsg = "" - -END SUBROUTINE SlD_SetParameters - - - !********************************************************************************************************************************** ! NOTE: The following lines of code were generated by a Matlab script called "Write_ChckOutLst.m" @@ -835,8 +811,6 @@ subroutine SlD_WriteOutput(p, AllOuts, u, y, m, ErrStat, ErrMsg ) character(*), parameter :: RoutineName = 'SlD_WriteOutput' integer(IntKi) :: i,j ! generic counters real(ReKi) :: Theta(3) ! euler angle extraction (small angle assumption required for this module anyhow) - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 ErrStat = ErrID_None ErrMsg = '' @@ -847,17 +821,17 @@ subroutine SlD_WriteOutput(p, AllOuts, u, y, m, ErrStat, ErrMsg ) do i=1,p%NumPoints ! Forces do j=1,3 - AllOuts( SoilPtF(j,i) ) = -m%ForceTotal(j,i) / 1000.0_ReKi + AllOuts( SoilPtF(j,i) ) = real( -m%ForceTotal(j,i) / 1000.0_ReKi, SiKi ) enddo ! Moments do j=4,6 - AllOuts( SoilPtF(j,i) ) = -m%ForceTotal(j,i) / 1000.0_ReKi + AllOuts( SoilPtF(j,i) ) = real( -m%ForceTotal(j,i) / 1000.0_ReKi, SiKi ) enddo ! Translation displacement do j=1,3 - AllOuts( SoilPtD(j ,i) ) = u%SoilMesh%TranslationDisp(j,i) + AllOuts( SoilPtD(j ,i) ) = real( u%SoilMesh%TranslationDisp(j,i), SiKi ) enddo ! We have defined the referene orientatation aligned with XYZ, so we don't need as much math here. diff --git a/modules/soildyn/src/driver/SoilDyn_Driver.f90 b/modules/soildyn/src/driver/SoilDyn_Driver.f90 index c603ae61e..9f917c55b 100644 --- a/modules/soildyn/src/driver/SoilDyn_Driver.f90 +++ b/modules/soildyn/src/driver/SoilDyn_Driver.f90 @@ -67,7 +67,6 @@ PROGRAM SoilDyn_Driver TYPE(SlDDriver_Flags) :: SettingsFlags ! Flags indicating which settings were specified (includes CL and ipt file) TYPE(SlDDriver_Settings) :: Settings ! Driver settings REAL(DbKi) :: Timer(1:2) ! Keep track of how long this takes to run - REAL(DbKi) :: TimeNow ! The current time ! Data transfer real(R8Ki) :: Force(6) diff --git a/modules/soildyn/src/driver/SoilDyn_Driver_Subs.f90 b/modules/soildyn/src/driver/SoilDyn_Driver_Subs.f90 index 8a1e6086d..6b934fa6b 100644 --- a/modules/soildyn/src/driver/SoilDyn_Driver_Subs.f90 +++ b/modules/soildyn/src/driver/SoilDyn_Driver_Subs.f90 @@ -243,8 +243,6 @@ SUBROUTINE ParseArg( CLSettings, CLFlags, ThisArgUC, ThisArg, sldFlagSet, ErrSta INTEGER(IntKi) :: Delim1 ! where the [ is INTEGER(IntKi) :: Delim2 ! where the ] is INTEGER(IntKi) :: DelimSep ! where the : is - INTEGER(IntKi) :: DelimSep2 ! where the : is - INTEGER(IntKi) :: DelimSep3 ! where the : is REAL(ReKi) :: TempReal ! temp variable to hold a real INTEGER(IntKi) :: ErrStatTmp ! Temporary error status for calls @@ -396,11 +394,6 @@ SUBROUTINE ReadDvrIptFile( DvrFileName, DvrFlags, DvrSettings, ProgInfo, ErrStat ! Time steps CHARACTER(1024) :: InputChr ! Character string for timesteps and input file names (to handle DEFAULT or NONE value) - ! Gridded data - INTEGER(IntKi) :: TmpIntAr3(3) ! Temporary array for reading in a pair of integer values from the input file - REAL(ReKi) :: TmpRealAr3(3) ! Temporary array for reading in a pair of real values from the input file - REAL(ReKi) :: GridCtrCoord(3) ! Center coordinate of the grid read in - ! Local error handling INTEGER(IntKi) :: ios !< I/O status INTEGER(IntKi) :: ErrStatTmp !< Temporary error status for calls @@ -816,9 +809,8 @@ SUBROUTINE GetFileLength(UnitDataFile, DataFileName, NumDataColumns, NumDataLine INTEGER(IntKi) :: LineLen !< The length of the line read in CHARACTER(1024) :: StrRead !< String containing the first word read in REAL(R8Ki) :: RealRead !< Returns value of the number (if there was one), or NaN (as set by NWTC_Num) if there wasn't - CHARACTER(1024) :: VarName !< Name of the variable we are trying to read from the file CHARACTER(24) :: Words(20) !< Array of words we extract from a line. We shouldn't have more than 20. - INTEGER(IntKi) :: i,j,k !< simple integer counters + INTEGER(IntKi) :: i !< simple integer counters INTEGER(IntKi) :: LineNumber !< the line I am on LOGICAL :: LineHasText !< Flag indicating if the line I just read has text. If so, it is a header line. LOGICAL :: HaveReadData !< Flag indicating if I have started reading data. From f080fb5fecc5162bdc4010e7604702282f928295 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Fri, 26 Jun 2020 12:11:47 -0600 Subject: [PATCH 118/136] SlD: add documentation for tower top force and SD matrix boundar condition --- ...penFAST_Prescribing_Loads_at_Tower_Top.pdf | Bin 0 -> 1061428 bytes ...Matrix_as_Boundary_Condition_in_SubDyn.pdf | Bin 0 -> 648202 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/OtherSupporting/OpenFAST_Prescribing_Loads_at_Tower_Top.pdf create mode 100644 docs/OtherSupporting/OpenFAST_Using_a_Stiffness_Matrix_as_Boundary_Condition_in_SubDyn.pdf diff --git a/docs/OtherSupporting/OpenFAST_Prescribing_Loads_at_Tower_Top.pdf b/docs/OtherSupporting/OpenFAST_Prescribing_Loads_at_Tower_Top.pdf new file mode 100644 index 0000000000000000000000000000000000000000..becf0dbad5b50fc0ebe36074cb0234031e0780ce GIT binary patch literal 1061428 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

=BpHa)Joph^Fh*#Mso#%yof*rpiR( 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 z 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�CLoo09+z|(c~ zQ1^NH5Ezi~<-k~)SHCtbEH6C#H+h4#yrG1mfK}7A;B|%S!_`e0AkQ`((5i-|G7vqV zR|rWsy;YZvT3IS4@m=768^TSq1j1RBve)F$0mPc7$^VU=AU5!c)ytWnc$Dd;ZWVK= zep5{^O3_2YH)|>0v|CgB0~|-+C-=1UB{n^2<2~Kl)@NAZ-P96x_vGV{S$?0(U!%tp zm#EHW(lnjfZt`;O=hoY97Oh<%A68G!aIrF8S7O@rG<#&*RQ}%EyHj1V@rwT_?=AB* zie8DZOP*aj(=XpYsvh6iIe**&AhWZQ)Mh)>w?k->0ZG~-i<$xEUN>L#)DcWyUvgr2 zp;k%>k_P79Z%a9+1tycl(1|@Tr4} z78Mnpkylkt?3;E>Gk*Q-QfaO!gJcNyY3r!%d_oiBJ?zsP<4R(Q+v=hQ5v^3{7S5Yn zESeR~O4QHl`|vNIHzPQav|`GCem@^OJ+J!_KW`~NgtI^c)J+49=YNL6f2W&@G;Ia` zaaoaF=pGL9{Z-fa>qDb8873FFnw124GpAO_6iADZQK(^&@KQ^f=p%T?@#l}k1ohv^ z)UT_2pbwx%f8P!r!MQ;RFOR{5WEA55}u0u{0rI?=O3*Z;JI zM4ECg%mKUtOK)k8nU()TWMQpx-v1Ho5#Yl(vG7wSDSEP~YFR0LPh6J?1yNkR)W;&g zG39i=X*2ga9Mi>Rpe(PWG0(pmWrpS}%Yau!hSA(ysO)l3ohm+65|0Uaqcv4zjH7(J zNP-^Lnir*c6&f!t+_3Gv&AziQ@VlruFCTQ2@c0p^>-tIbX;p}peGdscl&M*M_d@;wL`pF>IXOXkIXJ%Za-B`SQAj50~FOgdn^U)l_y%d~; zb4&I}FXbpohQel}gF{^X6*svI1gP{c?Cd|4<;qTXNpmtV0z7Qz4S zGXdVz(vp4vJqzIw@b}kOch9!7%DB3FIlH`Bb03+uk^N5}?iM?i1Qab(WUo3vpx-bD zG}4i+x2(}5J+R0yyRxAlMKbr5TT0W4HZJ{Cc{J>cTS0$c=wn&cLP2M4*dOk zJ7B~cKb}#&qUbLPn;ke}>(S^ZR~Q3nanzGS5Vw=?Y2@_tr-|0@z!E$@p@Xj3V1I5f za#(g)keS~(r60HbHyDiCPFC~!eZ*k$zoJ~MUH*Pm3JSO&|6ctS8rArn&n4|b2=n~r zVDlR+901UibqQ|V<9QfojsO^NLiSa^j-q2jXt*B#-opwxOlv%O7LaB^<51HIp@FWX z4%j1-C)`;}xB7U+ISzH{;km5d-B+MyeqVQK3F&d5DnC9g;=slvFUNWB*W#xfCY2+*y&E&%fGuo^i8b#1R&^Ayh$>%BO;EXCIbdyohEQDzMM zf`*GWrOBY$DFe@#U0v%W(PdX>2FrX#HkySnzlzuchq`oRt;?p9k87CkPm}!aI#iUm zeTR{!0B%bU@8*)C%-`ld2m!6u%e?qblK7_N-jl`)1Tl9XeHfUC6%b4l05u0uf)2Hv zfoDQ(l!gFQNXCmrFSnvg+`g%tFjv1%asc(bKJ}TBFsw{ zY@_CZ&mjU>Glqp#u*2E@W3a_2n;m~#q`ENC4Ex+t24ZT~z)j=g7V4>}rMewL08=I; zy*_hL5oV_GnXneT)=9h_#;?9+k7K(X1-YGdRbzZ_AuS9+tPk0>K{zFN^LVI;Vf~ z?1z`7Y8O6g<@3^$ca}YBlyl!o0`H?;RzCtWMpI#`6JACy?f@%U5Y7ys0vmy>1?LUZ z&Carpda~uJ`45lScQ%ZB#McqmxN;s3uh$xjc%7oV8ki!3m*B|5k!oIOfQ9%!e4qravq=z3wU2C126bJ9TCbB%kx4JM(frQ*mh|0PQZL`=KslyZMp@VjGg2H`&QnH zYB(7L#YA8n09Bhf@TVO(t>sF!-CQ7|Kp{G_@g0d^|A$bRD_-DA(0NLX(iYB?`ShYc z;NINnADR6Z(+4?P0{VYtl_3^^ew^tcC3&DIe>X6Qw<&R*Z1GP|bdq#&q)=AfQ5Q}6 z$ThrVrbP8$S{>njGWs>pgQYu64)2E z>J`J=-<$LQ&4L5+^%-}^^Kk=^rcR#hnWNIB7>Ow|L^m5iH(|C!vtbtqM~FB z(e-)_XOSz_hRJ7F<>Ww(8BaIKI#DQns!XLysxB|2^5)f3@?#|;(DM{1GOxQPhnl;M z8PkUOz{#?tbpgqX+y(UjOmDtEb@7lSpr4^a#Zh^5v-v;9vbHGK9nzd3Oesacm7f-$ z3F=PjF6wKWsVb1FmL!ZOd!1YmNm~+W93#0jPcp@VnQ^1o$y?EBl3LXCR$ZgatG>vQ z0n7h_^;wbBC`-bbTODpd%UW2OZjNu$aaTrhEGU&XzLR8TqgeQW9bNBD<`AF>3Ht~Q zkeW*Q>W4>jn^g~W$}au26z_#+jvj+w(uqCxb!A0GHby(d+@;ue9Amrscc3WC*yw2g zb*&^YaxL3(eP08?A^xwKyp1anfl459hTG4>B__;NyAHeOUmBS=J!%^L{Tu5I`kVB^ z7?g72Ax6z>+MM~tRFvgsdudzW*G{n-F-&6dj&YULm%Y@SYqZ86>ZTEqMLL2Fand-% zNH_nw?KPsz@#7d(!EZSqqZFitIas_YmHtDA{LMs35Z+FE)tpkEt}IxB1ZbLvg|UK?UK zPz%~(y#6ZgDR3xdloHX{ewUok+PuJgWf+&(SuSx2uG)hA%xrfW$!<8Zk%93^5D_80 z)CS0YpQVQ^Jc$#l5pU_loaB#P0yFvaylbXsQ(1*sa7lTnCYcnM{vmAr<`O2s>M1vR z(DbjCNMfqB!qaK+f8A~eD(NDp<TD|A`*#(S6 z@V^W5I;vg_WH>TD^Zv&Mb*uL3BUrH+;xFzgRFfK-@-{NcZ--Gqr=Z-;q4Q}uG0@Dj zPOHLtjg@IOGDho~_P>d1ab~G6XigZ5ea-ic!NI}ubm2BTSZz2m;^N(pLM}h{Q4O=n zSLeW4sT%W(3-Ua7G9auh=E~>1E*35q2hevT1KO_8Rp@Nc*MVaJ0z)ZTwJEC3=BFb_ z?^au|i9U=}dy)Rq!;f7DvP2ib0E_PL|Bi<66hme1Et2jlAVzYG3z_OfCyN3IbzCEE zn_#mRASVgP9oBJdcG49Co{7Zw1eHyHzf6F>r0Wya_uBYDYFDr~YmJ zs!I)4GOKnqf}Bym{*A&WPUR9%8_S>Yq`}Ow7fW*{+4vbxGEh|J;uH|CRE!lWjp2Zv_CshmX5Mq^TA=)j z>ML}p7R#ISaN4cYxW5ysPs=KAQB&k}DF|qhx;f{hZWmqSaOx`i%ojWcLO00cv?f3K zq*iy?eF|~>IUX#WZEK4gYczRN9IHfRe?-_Lt62f67$GF890zWP=f)yP5YVb4k`GDE zp(B47ii^P8D%t|COP7YYxak(-!x+U(Ldah`II+4%OUle)Z-*c>17ha?U&jG@)!$13 zQb4$`LVTYKH*|mtKF)XeXvT>Vq`-g=$jr*<4%x@{une|U&Ho;*Y zCkoJ@FKgdmIQ)ffWg3TN)65jB^$4>UM%4)m$3tDkWcmJ4F4xiiifzuR8vR(Pc}5fq z?*43NM^w%#<`QHqt$-aVI9M3X>`9PljodH~k4=Hq!GbVAsl0mq%Lu&gi^9#`{W-Xl z1O!4X7#p?-SP}c47`5=~+Btd-!wL3$a7jP7S!sM>+`|mZ*1OgZWF}QWMBTi&Cx-ky zOJi@v5VnZp9MAE^C89Ib<85?>uYY5jnxv<>nqE^=wvs;QRb17az zR1c;OiRo#y2c?Xp#Qpl@d*w|~&C0(pd7}iuzAFX7m8~LY&y0-e6IW3(o3@(5;4&aA z%T48lL|R(WYibCTwLCvR5Cr?XOJgXLxSd|~JR+#d+136tpP|eIgAq53lFNJcMqNI3 zQZ^yMqbV*I*1FOsmoX>U>^ z?6kF41txIwe|v6^$ruSA_ftozxKU%!pceR+k_+;R%cNP`S(j3C6p(c?adsRcMKr77 zlpKw7+B>ykUAh9ss`88rNdowu>4TJ%+HK`joLu5q`!8??JkI_6{QTdv+t4(i?hsD! zD#^xYXq#he83|8nurD7=FEhV&c^+MBB|7Z`ufCI%9>i%f2pY&mNgvTo@s{RL&`~zK z?=Jj0WkD0~W2TAdy}JnUO(}%TU|CURA*T4yG2M($l?DlH?7s+gs?9p9<$2P zJFnU<=JEn07hUr|Gh<3a?W}GpisL7ARogGRKLs`EDt-1BW`V|h6ihp&3a)oeMXzN?aQ}E-LcRlpsCs=yVszIoTM?NDQKIFDX;aFVxaORT;Jw!z#^jh{#4ToFN?kgS@ z&atInUP&|=9{bmsEqS(X?=NleMoDZ~XIywVw83_9z7}bZR8(qpV8M>hS5UPP?X7#jiOa6dI53? z)8+K}x>&5Tu%n5#{%(J1qs~w)Di>Xp;KeDO#RMkX?=i>m05XwPe!2iNNrlkK62nkq> zJUQESgQ(Jx{?^@l5=n=`fOJNBlDet_h@!%3D5-Lmr7W=guO$jzO!+qPLrqkF;B&VD z;ijak;W5S`WLtos;w2RH9Rr!>{wGT>4eXBmOpGklLlgQIHI_pOvL{Q)h~0@< zsHcYAhw2~;2_pjo!`1u~Z*#{J4J8MkLoV=tDPjB<{`Q7V^>g?ixGj86Aq2BL%EGoJ zPFndV7?F}^nH)}fS4I|rk+8^g32nl;V&U3iels)kb5nxlS?Z(i78VhZ7Q52Z_l?PK z^AupM-#o(eTllj~!HF+)iDr{;a9!X;Nmuip?JohH313Qx5%Ru+!rbe3HEp5?{;Hm# z_pTJOw)rRa;R#p4!Vh8b?$~R)Ee)_(K9*@w(uxf8n@rD_z9$nG^Y%-!0;4gx z;oRNnHw&Kz-FHXQb2!bc%2^<@Um#OWxbX_?%RQ52-=bcC*2)Wn38u}cPNt7^DVwLn zXcTVTO7=1n%+Nrz9w<@;R!vrinKh*2;pAyh7>Ge|*Lv4XU~rMEiP@jQ;6=~}W$ zk|xw4Dv2~+jI@9Spr=E&HL|VYIP=K8un*=Tp$ISW)@=PR9f1@}d*qURtcz%d$m{i{HDn=*IrxQ4R!|*h37)jbN}#E*~6REGJ@E?9YlC_T*N~ zmJLRFUl;6bBGh!%ft%unR-HCzW_gcs{Yr<8Ipu;^i^=5FS|8bT$5kg50cHeeWm_M` z5v{hIA{nTb=cb0bx~PC6!=WWlr=s{(XG-Ot=8|@V7qT?LcOW~_wDJ$V^z0T9Munjf z*VB#fd0nF_YsaUshwtn?!scZSHrur`uf$`-^(r zJm7j%){VsT5HRv+!eH(h73LH&?Dj!rJwCt9pV%a~<0{yiF5WeI3Ta(uHbH`uEr$b@ zhZA5%2_rUS_z2%0o(+qal^Ncj9z91Eejk^H^J#@;>7y;CVm%i77wnp6kxWasg%x(S zsQm)q>6KU|IaeGa+zp*_q6V3bK9p&$z}*g{Dcj)xM}z_7-D}U%J2#C*XGOySU;n%R=krtU0=(!&%xq*28Qb)yfxn#MH?`(%^3`or^&>YKI zIvUa+?gVBQMotlRcQ*;p!uVqR6A|d}>&bEt=oBG8o$BU5=f$S>e-XO#beV{A|&d{_Y&3c&S@4=OiMHloPHP; zb<2RZr->Qjw#%O1+U#3-L}1wPwEoT&Gw#)VAipdRIn+5PaHYD=u?nKE%NTe@Rm4kL zN|OZzXyFPw6)4E&)du^yJ01Wt&U{6d6N2`a&I19y_b|4sv)0f9zU>g^zK+aXaK(Rj zF(;9aKtCv1W&b5NHV-`G8^@2xB68htQ=1&2GEJcu#PlL@{4F^`dTlF5z>!TGvq>+r zj2}V78ygQzvkgB5wTgh%7@}$^_0Bar5g7)f)ary?F(mv^U3K58^ z0@^I1*FcJZ5oFUI-1(z)>BpQYponsfZQ+Etw^&Btp&#C8cb(=)b`>q0OlY1cy;@Xnl zsGF(zgp%N|dce)`&kF|!eXdN!4aLO`V`B?NucBH}Xk%bvY*NH9taKzJaYnj``dUPN z#;RmubP$f$Ym-fkPc2h4&wSfNU8e{e%REXXC#;XFfB(JMK4&C(H zgqqWs&|P+&4eK<-hpE+RTZVK*G@8M$(`9T!K`t#uvc}`)ji)mvOm-JAJU{rBbNG?6 zfU)>IU@P4v;1RqVk0F{&PrA&&Y@fyqZ5^MqlGf~SE3Z2i+t-w#O6xAoBH8JXG>cBM zCet;ej&5d;U6%;eO5oTxY_&67C=?EHdj&q#+74YFBS$U&WwsN)AP|su_>&Q6aZ~oi zcK=GWINtIO2bZ99Ueh5$d#lFB@UH0emkT(CdX=HSa134y@Y_?V2X*l|4nn-rJA|}R zw%OD$B!qdLx!1CqbI~!^RG=&eu;Z3NP=3hApFu7MEB}?JG-m8kEB`blX;IfFc0R#8 z1ba{f5lmsl*f0=K*N%!w2{h8WSqCf&nuJ}RX^nn$O?4|wF%#M&y=FcPh)nP;>M}}i z)mclM8NTXF*43`!un1Iu?119_JKj{gMC1G%P3UoVx7Stm<-G_&%R_Bx&^Nzt?;D>$E&wU{ONFT0aYSch}U6ey|7^K{t0UdE$XuCT$hqa`q&tlte zwWlVQ1n6e@0onb>8IPw)7VhF>zJqwpH~A$! zzVx<(tLH1K?!Q0YVIJqXps+KL%ZuuRQ`8Mn106$p4sQvp63f>Sn1*wQHh!7vo~L(Z z{*mVh<-yZqi&`VGaR#({66|2C%O#DK}`6>6k4;d4Ay37dx93?nB6$iQG&=qZ@|e$rbwSvtD`vZ^@-)l3e5L{M=rQ zHh!Ht1qWSn^v^M%C@UB)o8%5-6rXYs@(|zU?PAP|>OU@{Kye@j--(dl$hb*)^pl|4 zxQ;Gi5k=CKi@Z8K`c=|8+^gabLEVEGAE#;`MT?s@-Zev9QIL;EOF_&j46`Yzy5$75 zhmI_ib^?z513Virnjrv=cR}}a^GNGScAK|oI5$hzT8aqit(2Cu+de5Yw6$;}pqFXV z%OJc_$?i%L>-+8L2i&)z1;~cf^o_A>CdJIUMg#A;W7cQp+OELO+}Pv6Z=4gFVQI#A zy*Swa$O3$#!WS^MF>gr$-3(;m1)t60(Rl7bbS4VHHH2jIDn$D-P>vO;*+5(nE>k`3 z#6;AsXe4L-4tYhYYx>&wSSs>ybGDq!v$!ECK zH(O4DIZo$d8736@4Us!e@m?Lmk6hHnD}Ryedb7ZPq>V#guU&6qY@c^9P=`!lHbFvH zKL#Zi`?uzpKhQ5Tk$s_a`2$cq>;K;EJRt9Vyn|231?eIhBQ2}Od1Z@!Op$KMEoR3j z_c%eg>z@Bg5|tw*N65|8`uGumyV&giR+a2nlXX-9*3G}wwG7|^rG|AkK}FLj9q zhXx0UYQ(E_iin5@2d9%uq-Fl1|348!LN9@u0fe?9{5K6GEbV`(I^ypb>=rM)$`#U zr6(&DC8%Jaa&m}{mTPcPuIT3AA?2(uUeX9r^YV~lFN*8!e&&ej-c+1Ndfp! z-t><0+$H_{v0v2WkdxV1?DNqxDHX*434l#Z?~&DI2|l)^jPJC{zF`&9xd@91NyGak zU~iGEwtVG8%{{(evO64e>V|zgO>Pj`M}%db78=?Ke)oo0OQ{X@2$!lX`6+pWCt0eO z@gp7;P)#v5!pc?$C5#>rc^!%D0n0M42@Q%45CcZ8$j{J8BG;>o_cqvi6M@0Wq)A6E zS=Bce6=DZ7{DOm*Sab<>a`6+kZ?P zVw9AOgp?GkL**rC5fB}h*nv6OY$X2c8z~q!pS2lFAia<-m_zvax7p5Ob-bMzhk#q-q8b1g18rnaI{9_!Z2oZBP$80?5G}t1EUTc30oBzF)8&D_1XWc2dhd5{pB>MO;Qt+U&(1!~WIGC-2(mWw=*33W^|L zk@QtifOs&7;hC#3OqyfRk@98Po!%nh8~&4!Y$}s|pSqzCK$7(T@2? zRQ(V)W9m-=g5O>rVT`u9pWiSr)wej_J*6OtLc6YU7Dp8ucf0gThROTlpH4uF?aJk# zYsBL%>pU+Z%rijBRfng)vd^kDK=zmYwfAQ9r%iw5UD82Q=?{4Ms7fmJ*dT%E60!5$ zn%Sn`th2Sd{zgTUY@n|O`G*++c>n=cD-?sjBtm=~_tUqsH`y|Fm!L{d<{K){E8{TF zEZ>co`pn)cS=& zpGY7O&(bC`qG3KIr?*E-_0G>j^~=!c!L~ZS45zS=;Najkm*0-n_y}4BFPGdXo~t67 z3$zR$2I)zmg@&RZ+v8(u)b305;}Xt*D-_ENyM!BVM-|iW)u4yCGH3_qhFN)^0)EhIKLf-B+ClOKT;^7<7Ao$w)_ZLLImR0hmfNhAPgAMLn3 z0|W^|*#pji6$c&ktU@fRf1o;3{!**A>}CL`vtlmX`=A-+w3N98e?$4<0)}M9SmGbc zFm>^5t@Cpz>+`D#bJ;OI)_4KfixStk2T5Qy`&U&aFzUB>B zx7xfFfZ2obgLWXoV|s=DyZ1_f3O2WTnS|nKOt$xfbN2{z>=&X}eO=oLV$7 ziJ^`Ao`|?TqEO8QYBc4!Cdv}}_HLE>;lYUo)~1xpysg;HN|W0)mzX@jb6Qfc&FEtEVL+-;5Q+$t~P zXlPCIhg?MtHZGg&q|8gw5;=k@sDS+D?)HpXWLdO8d0!9Qwaa>nb71*HSAR=WOSLf64 zsl&fVePHIy(9F|E+GYKrF{Lo6CoB9kY>}W~U%OuS*+yA)ur@liyJsts>@#W8RBY9E2LX+hJM%9U&$RLq{3-cCG4@EVmdH&2fB8flqg8=ZJo~ zF4mfbHe(N!I`7v9FMwrA`Fq=|3Djt|59NAjWPh zq&UpvdywEu@~K6F&4n*(3IY-MFob_ktN7{e+QYe@K2mPSI71`J>iqrWw(J6gV$aJ5 z$ErmEc^Jj$K_qrQWA4C z@;J#ROt4ob-3l0S&i2E7RyO#mL~nfO5I^Grb14k{XbHZrEa80XmSc6v98r={`Q^#^ z+qwMO^03#Nv_V0UQG;%jsCK<%bpV8Clh{pbI^V7Dbq=^HMu`2sPk= zZi>p2y2|X%S?5`5(D+yx@>g8Vo#k+nNgDRUROpN!iPb20o!@oj(>m&Ja9id zXrAM)QWfQ-gh^(3!>JuXFoSmg$ADe(Y|k0RpDFUTP6Om!NRAUg$P=z@T+64a=CrjY z`6j=$vPrPH6<@vFf#V6ajrZAQ)g8OC3gSK}WXLO4xA&!h`h~WfTW6nnIHmV=w)Ugc zsY_CmFuV$=oBG_%C?$JB1M*A%8($uKtRaJ+k&L87PT4bBvVhpcuoheiM56(vIhF*I zGOhXO9Kv4T+6H^O6hfu=SL&*FU@1rfU|M(T+xJ$qH8sppDAe-%iKUClKW@B1pF|L;}U zjeJj(siCz1C|5dMY#QXHS6Pw8m0wfQ*asO>ey84hiY#h1q@%529y14 zhc*|4hmaz=<=FV8Wa4A*|0yDjjHl^u?b8*P*;*ZHO&mGS-D?L}{7D=?zs|;5rxVFA znFT(a&t2B4M@S49%=h(S?ftf<{rSG70Za3*ni^=p2`CONzWjBdWLh65{H8a#kHh$; z4H)G|R(ig6XWqeVy?OSqIo__?rTta7);K{TDuaN4KuF9BC0LuC8*8sXNJb)B^FsnH znh7YhB3Xuay!bot2nnwpvW$!ZoWuqh6x8YFw}i{AUBJTgg%Z!l&7<|U#gE#nmBcqY z5nqK+GoR2vCXc6~bA}k1JcKqr`FXre3ZorQ{W_b_$YqmVzElx;V^r`~_+pgkl?!;( zhzZHluzpduU(~%z())kr6wUODX)1w3%LTOq)6l7&p}5660!HXBAn9~-KqkQRnUH_O z3kZNH%xxBv6rs5s!W#Xi*-|*WqinSk#+E$2^*e8699;Q^+9qZXi@bO^k2s?&pA9T@ zD6s%!oGjX-1p0Ta*S7f|>SM>HpYAIsUiU86&M${tn(bEHFq-KJ#%HQScA?e`5Xn2GyV#OBl6r~=@nzuCbMiVd$-Bgt= zfG+FHLUZRrZq$5TAq-rzpL!{!z)BkuGHPZn5lfzFw6ih0dM5SsfO#X37`TCe4+UZD zgkGkOW5M&t4Xyn&?R1g)d}bZA#l4yT8_TgRg;T6*lDkXEjkFPr#ltZwAW_l+GeYvW z$N0KASsB462ahathY43ZmGA^e72NbN4(|K0m$g6)0F#&9z(YZxoXiqW`9T`epa+-kNMd@l6DVD z1i|Ecs_UWDy^tT9o9v9gQK@BUY#(l<$2?b`0E3hAG!tA~%My#zEMc#2rj--spCo?T ze_tY|SLHMxiJEJKF~?Zi0W)i#Si)-mAR7>KZi#J?mhlM+i`b0~NbE74d#0g>wTb5) zU+Z%Gqz;>CYy|}ay>N0`b>Bfx%sYnKlyN_-X~uOXRt1~DdeT_Y0?G!k4)&)!+r7iN()S z{U&mfZtJ(ghq3ympG>ksE8&1e8@#+;QYfc)No6mu;Q1QvqPaD)iUji{{X}-9Yyy{M z*Nn01ImS`vj~8kA3J!=k%(}-?$2!kGRyi*#w1$wRoCaTSt7xSo7B?P!9reRkeH07I z$Eofv7xP+m@7$j^(2ZcjW)v*-ZUOZRaPUczYN2I>@s9mj;K6#p3*h%068GQHy=qk1RpklfqUG0FBKfT)QDc5f^eO&R3Ra;*#87rLrwz$|0mu~)(-}3)ngp^ zL$!F6)kxs&;eynTRKyY4+Gu<`ad{;KXxb@>2smm=!7MI8cN0n{xj=LWTPor!j)HX@ zD?yVlNX1EigkWFc+C1}_^RP%OXXh}aQ)}YB(wyiF zvq#m{CFS`+RiPM>Sw{p>uuXA-W+=0#hIBniMxCl>W*XPrcB9ty-`?+<&3knB$f2KB zlFf_JtsJ>yQLujwH872DDOYGnmv8WGF+APW%`2-L5PktPZu5BtM#^^n$|S}*P*w#b z-z)w*zxxZXn0J`)m7d^S@pbYt|MTVP<8-JT>19r9oJ-rfos0D7umQ&Qh1?}nqvi{M ze%Y4OQWky*(h3TvU(7(f5a{e^{lNNJTafg`*j7ie)F&mZK6QD0AWr(@54vE5O4$g} z-ktmtTC$0nzrbd*BOb>w&|+nGtCX$^jUNqKL6wpoHhc{gM8|+OmTnc5`Eo@@q%~-F-Math)96QhE2W1 z?j-I;)mm1F5ZNPJkIB$mLb>B?7E|WopX{G8a-T6gfDYmQzUF9#fMBoF^z*y=H7zG@ zOOCO~i+{K>N6V&UMuk<3&fT&njQClWz*Gf2% zGH=Mq(U~jUBif18kbQmGRJ=lC~<0-cZE(T>+Nf+Juzx zUKaMi(hdlX@ZSa3KCEE>4)Rz##rQp7Q^%A71Oq29=J9tFhIv34nAvfB!pH z9H$i+;N;Vmc6N6D%HF=}`O~SjAGfL1>s$B?1l2hX+XqlAm>6Np;Btvj4LF|nt@_l~r*HjVobfGJPFdyzFwwtD#^^eyr6LX*wln;P<{^A zk>NJDj1qW!?YTc)S&RH~_*-1iiKG<-`t_{Ru(iUY<~1=Abmi*()Y)lkl=kvkAg)|| zdd`-i9f=z3w-p37TA{D z*vIgx;FxC%inkr&&mTp9cx)F%5-hl0!n9$wY%JO7|V{)HU#wQi=LPUD54># z&BVhZle;AzvBgQ(s|I0410pwHa15x9@_P9zrYO$|wBb+(x~O3c9#p^MhX8c-`T70d zsPDdEy>S9;OjBUbyFY&;1=U`v(zDFI;!m&KUbmpuk*n4gKRam4i>@S?D=q*o=0hcq zF$~;{c+7x4!2>I(zP?rLCJ)h?tY1X%4Hwdh2IR>B>D)8-@6=se(tZ<$x2RNQlXj?eI`klQ?N>@ zrWBJ-;I@jWUtAns_7~wEOAt5Q!&z+HV$JWIscY4y30`!Yp1hu}SezPPFy=ie8{@EJ zq2-#?(v}+RCOy>IwLVG02*#1GSP~z#6d^Uyu?y~cV;7}ViX8QPp<@=a>nz1#4t%B| zj$7cSR(o?7#cb6CqouZLTU;zQ%AXFQmr2ntEpa{7&0EG7c2l*ApEZDu?lX#9(3(Ad zhZe~njFrp_B_HK0ZFC`8g^nd+;DJ+@i4(;lM?Ii9aR8G$5iO_@W?fe`X)hJ@svrs) z$-af+0sWL#NQYXAq&sFHN}J#*l_O=y(VBfP9lpU(gxPR_x$Q2iC@mGX+k$XDL7wPy zSs;m1&In~8og^!TS3&u{vLi$s?3)I@(<)=-^xSgr897k(SpYROkP*Rqkc#`Lx!Ppw z23uW>I^Y`&f9#4d3-m%OCGR(m9+q_U@+>kr|KZb`+HSU!h?*o3KYrQpgtupUUz0V( z5~u%XFU(eq=x-|m@@RlC_mPyQQrioMC;UaPpw3hXj0n!vSnqU?5bWn?eU)E4LSmfI z;K>Y7uW%=M`{?pZqu56CJ34+e>CLR(3s2N3;V)<&>f|zLQ45^5Uzr-6>RP5f7FRS} zA6IIA617Ufw_?a!z}WVz5N`Il-Q7tEuvZ|#B9XGa)*-yu0Icd^!=oeo?+k_EDMVvD{DGjdZby&vmpA^D-QU4+%E;! zPcY@@yr}5tJKrgUAm6B`E(v+HD4aL1VT)u#Z*6^R71AVR=(@fMyLPHxcfVN)TPG1T zY*NEFjPE0K?t-IJqO;@rqiDvu{JG4lt0|&10?~4mU-e>Cg_PlNlaP}Om@{(jHp=96 zQBb34rAukr%st_3Zs)b|oEquCZQF3?p|SJkNybNJ<(~(DkW*!zP}2+pyyLjty_t~+C07fEePi7^V!`{f@D$3IPduSm zyo#jQT5#^IOe^8%I!h^D0Y;qd9c$99kygRMJjb=?FqD%hi#t1Gub`CB= zSs?r|N-=*$5@4#5VSawTK?djU=xX3f`b^>4jk<=fxr=*U*Zw*fah7t$ehmB+2bKkV zh6GQkH!|aT9e>%roqCnvHOA zvf=_gV!h%9ir)s9%v!3hd--?Nt|>oDX9OSlwNOJsI#W9mGMQGzQK_G&yuYTjUtIfJ z+WDYdx$yud>-TTJ{+DmRcBHq3(J^*xKSJ4x=T;N5wo0A`BHl!#YDuk@GMu|uy()x@ zUc~579in?BvMs)QEa5*?EBiX?`ara~WOYQ@1V5xz1tDBCT1#ftWJ7AAWIf_*zA8yi zlQLpjX?WPf*e1CJ+QiOh-s1XPgaGLyY9W|e7^b~{PXPjq+M~53P_d^kyF*IYr^IoL zt`UOp%LSelZHZy|*oN-&^=)`$uQ3n5z+Pu7E3y7453%_@Yjn3M-apxtiPBtW4Q5O? zR!?(`bo4F>sB-@a8|_~l6JlJ&_9Cz`!ezT{V|2)6+;s12yz&h;nz?VoFD)V5Nl|~q zn!-#}>6#6z>Fg--)YP(d!6#+QmYB%gCp~Iv%A`U=_Z-cQhHG(5&Nw90Qde^*09U?^ z|Ao+FZ9x8LlnV~Novp%B=PegjQGXYq%zk`P^oD{kur+NAbM;0bDF%}i&x$JtQ0X4S zm1dAMqFHisbV)Md`W3xcN2^`+e70+7q;8=kTETG_D3jJh$jrQ!>*_L3H{L-gXX#Lo zRGfy+J}7jxMo4Ua>J574zzTySLjhAm@*=F6C}Q3WHZVAJ!Kf6i^uQvDOK)E1hYV}^ z9E;q^Vi*8cSsWr@Mz)%L-4q~4{_6w(@rKT|C6H#ckZS}cS|dV5Bsi*WIti%?*h)sF zQASL1`5X8KIG7u@3&!^5*un*M)p@rmI2JX6eJOF+?M-o5;yu}=8Fo1L&mS0Rs{$AW zk4kUq;Y-JCqf{}FU9x_isr;VI)LC#(jY-MGb?({{0N;Ara^48ccB-ahXh&i5cgPCV zY4sgS`>Nun_88VqmHI2&*qtC__u{P{w|Yf)-is#4mZUU-+?-Z=U`<0;T;wg;%0p$( z4ZB3b#%$R1Sq2vf18jBkxnpoZK#H)P;{-HuU4&{vLoWty7+vx?A*qlz&njE|5jur7 zi?-8V!BWPu+3#FQNK@@O+*07$;(mKzw%*L`FnNP|<}Eju0gbg=sgp5~G{txcelqeb zmK4?lM%W1hl$-0)MR# zGXwJ#N_T>VX>vuJE8;WND|5ajRN>pai~DmpCVUhjccMv<{pcGkYpnz>@6YoSoRdH^ zxpmKh4Oug}Gq1K6GIl6t>kjpmHDf2C(Df<6w@)g=&?Z08iL`^b04*$Qpv!E8U~+U0 z^$Y1UfVC+(=uD03vv}1}3eHSj62%W#h{d67@Y?Gr)P;*vLg^XAo?q+}nBcc!jhM^OD=9NZ-SWY~KB&&h3WE$E`K@Ds(g*$%8mr$- zn)1OjMLMVj*xn?;HAvyWR=O>)hJlCRKoBm3IjBU!=_m|<9d%tJ=5q#h_8xkSao}lV zJRMzI?|@_}vfrjdGJ|vlK-Ld&Iv|aIxxd4ukX7C%t7KFZSVgOb&lB6TNX*J`XH1w; za8%~#dDaDL=dF29PW4Z}s4PLen&GRGk1@*jB1^NuUn9}6qOkm(>i}spd+=6ORSql3 z%k?aejE#*g*xuD@e^r{EI9>PpO?Cp~+ivp@RPd-@ROpUGWNgW6>j=H^rr&OPYg7*q zyiTS`A=a?+C{x|{hD}*#u?CD_Y zaC-=c!;R#^W+6?)LGXL!OLel?rcZ!;QCLyQx}Z5FloFc9?>bod)L+{1F&?uLtaoy9Gd(55|h5< z4&d+d6QIm%Y{*B!!XC8HbcwS663;@4K2#3xbrpc0tJo9Fl`s}g5~3Lgkh0wCKEJ9Y-vZ$uj$Lt? z0#d3L=vQ#t7H_>8mOEJ3R^80MTz-CYX`7^ImzMEVbLbaBLY0dW)}EN5g`Iwv-2xnj z!Ibo8l)rU2pDMJ@>?KY4bHl2tUVhVr`>)R(Z;EKSWv^{MW1O5z)kmv2N2?liN38EV zquni4z>%@mLTV%CD_hoR26bqT@bXI|=9%uRZ0c3tq-TI`2L8jlEdjhc`oFwe+ek?4 zzr5SQQ+%k<-MLS~Hb(dq>sv|>uh;w*yHCk{j)@P&Xjt7JyHh4m*pA^HEC15u3AMtu zC`RY5YPq=^8{2!Xx7!tT9QP|uOv&{uBqRK!2`2g5Y0W|Rrqtm=MDF^>=@P;pu+f{E ziCwDvgJg8pD(4v9V$7SQ7`Qv*RQir*&0vH_6doJ=m@h<<$eFjLljr`6*nOc_K@%qVbNu9jpDrK2I z%xuvBw)!`>)EZs6sYVcH@ePx<^R<#_Xu{+zBW4H4`?|9#IhAVtZ$eKD9HT;Dd`+t- z>x{24e0gx?FQ0Br_VhY<;S4-XdF{CLxZO)XikQ4xQlqNAV#=sR7@Y3z z7?2@JH3^Tn7QxJFl`^f}goIMDQ>tQ^oo%Qr2egBiIlOQ9mh7#oVVF0fv?)nD4BOtQ z!XExbsH5+Iz|Stz%HH$!+vcX0mIh@^H>Kz1fvGea=X(~|yM;}Z;Ty7~BVZwH<`OlD zax5`_wmvxt5+{PGc=bptiJ7;BHFbIO$jI0zIqhUGr-zjC7rXK-WK?%w0}p%)V{%{| z^a#0c&FK8>%$z(!K4|(iQc%qT0_#dPmUO~qVZUWmBVlwC6`BkP48-0!1)KwNE31;y z0#-u{#8FngbHRcSK-{pubMl(>UBy{MG%%f)4OZqCz%mXcm%W!ZTP0<6RW*eGPaPYv>K&2bN`#0go?{h#lyx;VBjCZlMG15S@EI(34->A zJBMZ?#mAb*<%fXI&i|TKE{2Y?q-}JWS>BAq0GY1a%BWG_wsu?6{Nin(}Nw1*H zd>hK4x*D;Ny#skB&dX>OzdXsNbn6PP{|U7qKw3vin&bNi(YJ zn8>|+W;OO;8OMM8umsCtnsX%JQ&VE^aR-sXR~)iw)=azqQ&&y-6Nc#M&#V^4369)6 z*|fB3{H%Eho@kQzRc7t(K)u!w6T|PeQcD}PzUNtsqwZw3a=%l5BW2WH#*=T%RuM=RZ=*X8@vwGyU5OzMuF`bi=rE37s1X5Ej%>0`{M zI(%P!S8-nNIQw-iW%rIq{`(&K8ZIqYWd8m`aNtZ`>(saAOx!x>1pqssf}xu-J8*Ee5NJn5ao__4jrq&R@bFi-g|TK|Zdgr6eIYF*Mt- zLMFVQH2u>qOw2}_DRspCS^~BzguC5+n_x;qQC_Xp)Ks=tDRgCW*NV~=PHX6w zrNWuQY4Ip?As59Ald=(YCZ@Xb>--K%yCT{ZlxwgSSir^AqU>MO`S^VJL*@Ap`2P`Y zeOLpF!C3e^!C|k>0|fJe`2;VpMvZ1=2jz}Ud|`wBFvSo4h1R>3|6H@WWC?l?O6fa( zfH->ktzQ5LN59mLvT=>E!Y8B$EEkadufOB>WPKm7=Ly^|A&b}(O4`{;#w?JcU&t=)%e?z8XS`%eZ7jIqrO9x?C4c_1>YAk|TP^+Oe2N&7AgCML&}*vcsvz|_ZX ztA1s&JsuC78GeN)Vs~c=YH#e-DStl4#!;%)f8MsGn3@iM4v)X)m6$7S#e6vd^nw2& ziT@$yh5x9MwTJol|I~r{8y5W~Bp?8N>K%Vj8X_z984Pl-#iY#M<&?G;W{mV&eY|-B zxhBI2DT}Ys*hkhIr6_^;f6z3cqo1B(5%rz^r@_}AQq~rJYiVv{V}qOJ@n{<;2lXYp ztq7j``oq-c7t^eNk_3_bNwKFhH#mx)P$o>oIjIl+GsQUI^(w2uq0EMD9)45q)sT~*x}`Ot9w3L zIW#mldzJg5CAldS1z8!1SsX0e_ZysBV;qLy6zOu%8kh#-3=ywck@x;A-Cnd8v<}mi z*afPGk2((;!ZazjhhqyD7oeo65QXn*+WdpoHQGPfE3O__=G_l6a<|?^UAH%Mi5^Zq zZ%I1e;rvvRo4sPpgN$`kWm?THT~=PWErnlUJ$n;=C+<9k&hzJ}N)wsdY6PKqdv)2} zVBns5A!triB~EqqNpxFLccF%9bOP%dLkF7#7UN{*XHA`SvsBnKc|6Z;Pm@=E9JV`p z!ve$ggZ>3mfB-6y{P*rZQ3q*1$p?ruK; zdO%A@G;}yL)kwFiiV6#`DZSu?C^2zSuL-_=LE$!T zvi~rwXiUY-=xjKf2-Pb8BiRH;S`oYJo@0&Wa&ZGLAa+)9U%hzvR#j~^v}0b-_sugr zlp1~`ztZZ5+6+6LRgays4J8*^{J2u%Yy`Ro8I zSzT079bCgtceT`_tr8*6ZDZNs6RXkYVvSglGNa2n!-#Dqt`~M`rA07-HC*GtFcAhyT@n2hh_zAQ-6mUiX#|28b4){Ep4M8azI+jJ~;f z$_6I1zLJ#$bZzHen*?4Dkctt(sb~%x_XTmo!^O#9w!t>NHF0-l#9IE_UVxIpbb)Pb zvfr#qlTK?Bpno6Yv<@r*rA-FDxW5ShTE@AssAQ8KyipWidddTa>lkBJ)YjYG_de!{ zPpB+^FWko9xDb!1MaNQvpN)-+Bk)wB%rd@2%uM&#_qg19tlZ6z6IV6?RoD|Q{z%Xb zvmIo zB}Qk_LtBOm1J@&pV)FRTR%qcULgHU`G|_Ri>y2MBcBeOE5&e-0XAiM4WN1MK* ze7l(t(Go|%c!vK7Pbh&ajy-oytx9{Ta!&1Jh#A$ZKgchl2qEKYmjnZY(rc77i~yA& z$Rg*IXaEPPmzHL>W^dGl>26gIGB{Iz!X!#JOIpf$~irJdSVL71Zs>;z13N~Zvzb4WMrL9Pg$qx|e1{ZO^L>*vq7AG~ zGOqu4|JFs`i@Y%7b)=tELu@a&%4C-JUG0Dx2xB3GhSsMx|eAVns@ zycZf*%6?pxks7nbn+qQ!;1ah3x5<6vQMnVOgvwm^Soo*Rs=7s%qF-N<^G^S9YTfn! zQBigz^pK*^ODT~|d_Xp^usFX9;Cdt=RaERe7dO1M%>bc;+CE|=;wgI0%Mx8&L^LCZ zEf#W{Wj0`Bk36X5Pkxi8mxniBs~5Jc2oQF@xZTP=a_Bnys&n3yl{H-X^uB6xD{RYX zI-Iy~zdX^23au9q6$1;2{Slp>K*&nwOM>DH0RgcJRa~qiAYdtg`2#8*myEYoW=MZzBay3@nV*-*QrZgZQl zZ3`AZxBNC05ViR~Nx7eTh+r!JLgv*_fQk!ZBm!me)tfp_kNl)nx%( ziS)-h@n+>Nn&tkSA@}kQD0L#2h#@i}_OQt26h3-!Q}_M|R6;gr%Lug#kc5C#(c}dT z+!pM#Lz5C*lHsYQ$23?mBMwF$Ec>tgyh#n5+_7yp6;705ah!}~_g;O`u`-y$Rr=;% z2$bO(n@1?lJD(%`R)B4!HBQu4LGhOTsr$XS5$O(!j2teWsY^IG|M8PRKHM;2LqKrz zLvAVHgkQ6o31wZyz`Mjk>{LSmF0E~VZ3G-{moxqQ#CKFQ4eY%N6BPKU+#6X*P8LC> z`&nQ2{L=$=qi?HF6k9oaX?5i=SXD(hYYEW_w!>fR6B@$&W#xy;(CiMwc_*7X6Ag_u zt^)VUaW}A&t zr34wO-id*}`@icK&azd)9PnkyRvNhxG?u(q@OBI24O?w zW+O&LK(Cum$z&f9r4{ZNAZ(~RVji^ca1Sm>Z%*WQ@X+u{xopx7#%6gtTV|*Q6;P44 z{2>*Je+rj;?0?+nwX2u5-Ky8fJ$7Tef`nzy0oS-~cl*N@3bmBFL6&b|Wb}II>ZLJ- z{cIGzl8yDW>l$7~gEGL&SL)Y6Y^bgRE zkC^|%);k7A-gWKUlVp-il8J5GHfCZwnb@{%+qP|66Wg}gvGMQgeeUb7r|Nk>bya`p z{&m-0d+oK?c^*sDQ+m+o0ZbigM4q5U9BCasZRE>o68#@ilh@-h{gUk;>J0TrVmS8i z7&eG1`$C8@P#dIUNy(%um`ya!70MOG0S_`ok#6A(72l&5fUnI=8mMcrZQ-`nN2U~BLVouI@h5G z3U}xsE4-dQR5MsQ%Y)tU!-lS?x(f4*yA65O@LaL81IS5Y5xPF;dxfki08lM_LnWweIh+V1|uXJw8d zZOGVE_0~3O@Xail~i*lTaO-MlAxTbgNh^5*XDai+!+JVEMK3D(FQ7SGOTJC-kwH4GIQ^7?f$d7l#-hxDb=9i5-02uHMIuYe0e#EI8@8ruM*86bqPBcwhv$)u z%6-4wyPD_ocF9j_go1i_7!*W0F|fmY6I?!-$o>gt?zZ|oFMG>(6J+ax-@wVQHq271 z=P!Y0V?VFLcT=0x7fkbhz0Z!6kyv1#kz!gZC~hpVU4yP1ILiuMktOl~d6mhSabAhE z-ChU-PAl{s_L`-clXzxvY4cd$+X`)Hmh#m5G|I@WwEcvx$SADYAZSvi9o# zlmm~6#3iO@_CnVI-%mKBz0;?|Uv}+x%iP4Du)4-Ae+aQt8dhawsCJd{R3rEl?fH0y z&Slog_5Sb@Cq8l26t=ESmcP1_^&#a}N9W<aow4WG~E571ekP$DVu(fvmB|cl;VsxeR|Mw)P*>RS?_m{HMnF@JsPX7MLW~IN{)V zBGHr>-8O#xjs)f8wmkZ)OAn`t*DN^5^9~&?=&_6vHm8!9Ph;U$HiwDWJ1{ zy1)SA-o7Hzu#paj6~LU*aPR+*W9S>ztAgC?)&&nkmmmR~Ll=1Oa zp(u`vBuqS*R8b^j!1ruXWAQm_HR%%SAkxh5U-q2l70-_r)354on=p~ra2IE@Lf?&?Wj9wW%A2V3 zvU(Xuvd^mQV^jJ!D12Op=4Z&OD!8UqMEMRxytW6vOOFe-vUil|zZ=IE`JYu^bcRp) z?b^LhWW2;`G0#4(vkK_b4Y_w**0GKBUtHU8z{@RhHaq$L)lV3s2c)Rn*$g17#t1u4 zG625Taw8XTu5H6RiPRIWBwbD7Q4{y#I%1bjDAsSdDz$hcptf6mOlko9c3Mj`+83{lzS794S=%*9!P@* z8nF0Kfz2b2i9bhQ-P$I*UI)wQV9d{t1h93n6VPjK(C#mAUbkxPvohQ5pQ8=k=_;ZQ zVqVJEve?N^r&7D1te=O8&)=j&44KIR!W>XgHc2V5@S~pLbO?k=22{Y|C`mwA&c)FS_194AIlT^IdK>3Df5n$XB;E%IgpKmKw0; z+IfRwPCAaup5mVqScPIGti z-5hNXPpdG6KC*2-OOlF~5<8^Dh^b+8WwtO%s*#G-;oFm+YR*f%7h#dZm@Kfi$twYN zN@xpfyU07orBy_Q7t1`-hgN!=k-?p=ZbnaJ9MF$D5p8$hRwt7CB_ZbGeO|_OmMYcm zN~S;YRlyFr&$(3MNpdYCt+4it%}UKi@p7bF(e%xouaDk~(SN90=Loh;T z6F2JL@0MWTVPyfx`m<}-j63n!19BU4>!j|~BLB&Vxl9|@!~8w3(B?w#?+tD2XePFL zBKGO8ule@I@aL)veUPJIl~|alG5H%%Of@aBH?-OIUr&Q6I@M{%Ay(Zrv)9{JL3uLW zJf^u671e}{Vm@zH(M4Mmu!#ypJ8gd>|NqX0@n;5iDcYDkQ=?HYWF+`XO~AMC$3 z;@9#(hg@*Fgr`;0fo>tG(C6!+$$4Nihp?9R%s0+^7SxM5C9Xu}w=z@ThCN0F4wfE-kCBQy@@WSSHdHLmHpW3ik>~kp zMV<_~y8S7QIXZHl6ol?cg6h0gg)MxpjBW8gXgls+qX<7FKGSy6m=+c%-q=!=Y>qpT z_gZ<`UoMAt^id)MOV(y#-4Jz_UMMe8v8lucEl3-Hz=ZVMGrYq>G*lBNiMH#;`*n?u zG1JCg@fx_9+LmH@-yu%tOSwG!oTp$0V$0U#9(WZ=5hW*ZK_$FT6RaR?aW4sCn;=w5F73c-JqR)_^npc+|>3*ft^( zR!f~K+(N;#ZWnV7imUeRjT0Zxun17Vi+bif=%5W@P)%H*Mn`f6_$;i=N5UN9=d>@t zezqyt@;RsE8U0y}Pw3;5!xPcjnoU@BuWRZs^bB;HMo4s>DLo5YdWWhnZ0@0}kp_{7gi=*nu5!zI&bv+Rh zy`8s+V`5@MB`#!N{6?*ic>w!O@)XZk>-63)#g!cqWZ0=hjip;4q(%?a|sjS+^ z)Q+m2kY+#|q*AY80O-Uio!rtpLBMRHzjW3<$=>wK9*QQ%r=6ILPHsOd)`p1T*3Uhb zhj@c17JnX%yV|RmT_-^Sut|5v!GBMbB0BVQq+SqOq$&>?%a450f?h;d-uJ>I7!Ijm zW_hG>qah!Ync{N}6w={EQzW^+EkMT441*5kSZ;d8{U>P~OM6R-8S?#o@KtPQn;Q2@h)nz*^T&M^|02WbshFHkTZP1@$`D)wz3h)Kv- zsVCskQ97lN5ITZu6Hl*{WV}E%D!K>x@Oppk0b+*H=NFv}Twa=yX*OLpB*uY7QC00C zU9DX_@Ji*#)T%i;aG|dw$^exT+Wctc1%0tN{SNj}2)T~;&chR}yN5?kgO{T1n{~q< zXFOfo5kK;p%d59bn&oe0n?_6OLuxRaxS3Y_b{+w_EEk8ivjEb}kM|Ex&BnqYk|r1a zQ=zLh{RT1FDM-tt*`95V(QMMB95|#6^YA77pyC~Qt{farl)Xdap{GT4nIm}8Y#aOn z>81m~3X$>A$=N>GA>q~Ys_I7|5U`P_2))S?c;LeE#-UakT7|k&duk#EmdUY8LR6Z& zi;r-iZ$NZ?nIr9L?i*~+U#`Xp3GvK{WwWo^(%YP1qIRGDF6rmz{U`#>|4srp$B%Wb z&^NBGa46CbzyO~{RByv4k6MB_35PLV5m>x3B_gT7`zpkhH~ST^qFt|O*3}M+5>!za zPQeb10>hf}@yvd+esy#6uu(wx0@hQ%3PhTX!Y9qd=~k7L`_$@1UjMoi0C*Tz5fao5 zgx@(?^8(ih4Hs0#5h;Dq!4Xz(7X2yw`KXOO-cCj(!_3DfSv`^8>GbKwDlJ)CimJ{H zP1$~3(ArX9fAtG|Ze~rkn$+2S6|snCzr@rhh_|*3mBwG%_*@6pZ6%;|#MN_vj1P=_ zDjsD77lx$;E}hy+f&Kp4USYHSblhg?_ZVuz`@KkDP#Y_G3<#gL``n(lNu3f~;~Mse z^;Vq&JbTw{3B5~R7G$Ube1lj)*a`aDg*81tZHKrRn7X+aZ6k^ht!H^~n2=`OtO_GB z_i_2v&4lfI6ZTS@PUYSjAso*ZWmB}Q{WNtVGSe|ZbIy;A%afy_u<_+Z>x#go$)i*D zTM*6!3b$U=zY@^U8Gu_`R{2$;n}kTNn!9iFo+#gwI4qP1OfKWmkfWxm^@*au&v5ja zb$F%XHc2c`E`~ptmVr{ZA6NwH(o<*Q#4W|2-`GDYu$>P0QOc^pR35oXZ)P_aDPSz-P!*^xJ zQj^E=wub&SnCUkhp5=~fYy36<57{+N^O13DN;(pxvXw=Y!%L}Rnc}$10 zSM7OZ^_*l!WtB}ghQJ%2lljilDF!kw1(!$9cT4K>&n4~D{DLx2x4epT?3~AZbZY_i zGk%MstFW#u`DHvKQV3y9tn8;a=?fXS2QKH9ID#Jx50_h?nb8VW z7WR19DAT9$r~wL!bL*wyu%JoZ?D8IlviYB+fp?kC(UTWc-KV+*WqJTtHumHDyj<=~ zsruFZhZS3FWK>cuQNRIn$P@nlA7b0{@{Ikkre(kKM|tbyq4YYgy{{Dls)E9D^D}(+ zmf`@`9Kj+|TdzM%=?xCfa`_lLPIi6IlP5DH7b%i_dQl6gL2j$Pi+JuI;>;Tnf*wKA zPd_DdyrXu&OZ+(EGqB9fszF8V3Qema;a5SOI@yUQL?OLZB<9L?yhQUtkB+q18{YsG z8^>2Tb{#*ye%=nxxzoGXp(uo%S*IIr9&@=1g(k4 zUTah{NR8cpG`!J1k~-VbUk4kv^b`SRhxG1MD5hM9a2>T|?x#lW`T|+b56%ne;id~kB5gW86cKC zsfhf+Ccm2qH5}6D@BJ*{cx8@nnLjXD6Lg&SN{9lBP=vPwS&btt)H1UK$rd2zb>0a3 zjy=psP*snuZnkPb3(0%I1E-B`G@E{vQ@_OA{-}SoM0Bg95g3!@AUDPVP|#(@4xb*- z?qja_k*;QQ0A^1nf7?qIb({q^&nU+V%Nzf;Gq(F7+D06a_=BqYy0fMN&V+`=5@+6? z3hMf{-JM2`cE%)}8Lq7I5oERhjMW6KimXk_MPDn@X|9&TmioUbZeO_Xcx=nPFg!f*If(3FRBnjG6b`Huiy%i(Nf0>tf15F=5sI z?0qq$cNg}!`}9`uwlGQ$7~dw3R7;A+3B~Zyf;?X`cz}#(2Rg>JcrOWDHhlBaleBBj z$Jc*LFdvj$kk4HL8721-@tYcDSw-SYY3Tk@b7`mV^;jxT2X7O_j;}-u-7h#g8*Myc6dv+rdO4P zDXXpN4*vLcWS}-fe4udID64)QS9|vDQ>OIa$N2U+4|GJrLpl{7UyU9FCS?L8i=E~? zsRfs^^QvACQfplxLubag3QpQfVM*J(ZkN`urvA^pGjBR*M%oewg>Uz#4ya99l|FA1 z`TK8x&9O>M*N?Ym9?SRPf@iO5%45F;O-1Iv?_yXWeh|-Q12~s9=2vPT8mRw1z%$st z6i$`@J#^wa4&*kU18k$qC?V0{CWD znWJo{dhz3z&3$w6_^djcBIil55S&QmmyQoltaU4VI1WGX^Vet zTBeW0{)_CNyJ|U8M>Ka=%OU@PgF&1AM|3`|PYen)q@XEneZ4;R5v(BSFVjQmzW@{F zN#n})?bLpK2fPjvekrUcvcsY$vU$@^nE?Z4OlqFMp&y5HhHL>U?&nJG-n^K7BvsFW z1Iyc?I<5<2`))k6*M{xv%&ebw=L^`M%t|MJyMG{i^NsS>kZs-d#nP-vkv{hK1^D4? zkTMy#a?>uAe@ za3%S0rzCID(O*YNuO53>$csRj&g;zJ&Tc{9-`AGjfDMrCfum?~%5jcHr`634e-Ue_ znqaJ_bDO5FX3oVo~KJ;ky zcg0FEA*1bP>CxAiz-xRs3gk9bb6fr?(EWr$GA4GCIacGv=wnl#n;ZIYHKVa2LIlRy zmrxb7byQC7GdTH?%9nKS2zg zjpoXvWK}}`0muGc{b=}ph6s6_n|SloDQ~i*3A^5|CZO_5TU?xyrt4&Lvght{C^n2i zaj~}YXptY-2TQf4=Cj0p*B|BG1Yiwz)G$a%Ty7rV0zFb%3AJ5u4R2N(j42_Mop_S? z)+>NqT<79%@X8l^Q3o|yYMq3QXlCMH<5yBIbMQKcLilhUuXzCK<0=rMrGc~A_s!c! z>ItGo)fGn=Qd03eCw>frq1c~MNhIRutIF_Rz=eThIppeaPiN3_(BYGr{I82^Q?eHGYCa9oebg_pA>iteVL!s6xIMju4(G+vD{E8R zFw~jHc+iTf2NK(ZD8s_SFnmU(x3N1y$jQh|4Ee8cX@Dp~ic+iv29ZLkg&?yCs}(~H zreMi>xum(;7;&l4uskyC!!sV#&Wi~98Vv9X|qXzEpoIffL&QoJo)T)=qik% zWGd6E#l!5FAf~(BlZld%Z%JE2O2}h*cIEGU8T;DxM+uE`;NN@MgBGS0#S}0XD4W

E|j zkSIY)M!XD>inV$N>+)mZ{1O=oyhPH)Mdiw2Qlp9ivL6f?#19NIRhOserZiO|AXT}v zTjYw21XV-w8jvWpGGHPQykwyNl>%VA<#6$${48N9N5I8-MRKUceCu zc^SpI906WXEGWn?;sWxS04<-#&k_JC+&nH{$O2Ts7|tyL9lR)qlbef3af$)=0>ocN zenFXlmz^WTbMkXDxnMAz3pnGX=WK&Xsd4lj?1XL9m5*<7?MA7BxnWjgLkbGT>- z(Bpvr8A4t@ABvHY&ld_nmkFd42n}0Hc|}|%&Jpm6phB_)`2amsC)kmXkbr%BE{O%I z8t-Niumtvti@069WO6yV09O&*Y`mBSj(L>m{0W}RDA0LIIaW`x24^EfK>sE>lhV)Y zuck}LtK_uVv<})9+BWd>9c?4+o1UxWJy*&94c+!!CI9EHl9P8id#;rK@4Qk@TCeA7 zdC%4Io~z|OSIghd<~>);yI(QaYp3U`dCyhzo~!2n!>*beonMMjjnMZmq4P~?xARYF zw=+z1j!E~XN74Jzv+2p;GXbm?fy@Vw)5&~QMOj5@r(r06a=>~udTtHk&^<4XVQ+lF z>UaO6=)ObX)7uicqEgp((U9#F@Z-l(*C?2HM!j0j#Ix1XY9^j5(keJ=Q8_q8|HB-- zZbq&^_$i16`0<(tzMV*NUbBcMuj!^1VdHYfJ+r2mQQMllMuVY`sT4|-C1GJ|5^h7I zx|?8x$dnOoN}*Gl;;0mQTM#V(%fyM~PO6ln4uR3IxK}2pQcea>FgJ zjWfQ!GwtcxvysmZ4?4u7_G)W#6B14IokSDu>oyvdLZv!J0~R-ZTNg024-PB}|7{|y z4ct;p0AF>8O+N=1|%VFL%v9L)q$NsUq=iSi~q z;RwUgx$8o=(Vc-PU&05@(;VHp=HXTUh$5}1Muit-a0qW#>!{vD0udJ#7aJcF*B^A_ zjk-kR>VJeYD}n*%Egfl`{EVnzB9QEPD>7s%cvU*Hh>LTJ_=!X&H$H-$nGqWioxw?n z3MBkVfjr+SP!V};pJ<}^87r7#g3+2Nwip;^P@5!pxbm(gHOIzNt8K3(0VP0AB(W0c~ zLtYFHsR(i#7jJ)Ve)#BJG`}@BC5QU_dUN#g^Qv$Anhhv5Jy*gQ-Ewi_so%y)C|~)# zW_-JT=-!0SZm*sG{->iptD4%d=R|}Bw@`4fU`xZo=RUt^2Tr&~s|d*xYgw0edyS6V zo?MYQE$qi1RLLzP_FSo4G}x(g!HtnYul=8VEq;^q?cVhHjoEj-9v+Wp{CHKhNP1y= z#VMum<3jfNb6L|~$~VNy9ah)9?{PP>W3s#J6yM=qixvtmwRkQ|ASxUtIZ|mLj21Rg zEPzH#2rr;gFB`fG-D&F2QwHBl$==a=Z$10s_mu&)N5c9d7xMC_yAdu8PW~~^e-vb? z7=NAx9lZP{(yaT&VX0b;eBRin2PORTJkR8`C1Xr%6L zj3&}xMrcK3MBtPxu!QJmY7XKO{ry;aF42d`(f0}Jxc77f>gwv=ML??l3(Q)=5%L>I zhc2i?Ni%;d9%;}^R6F0x$au&Z@KB0B{U|AVL&{9oms2a)ty6!P#E)GlP5$z?fqM@; znRM^fmf-Iy_icAv{@r(9{nRk(r{K5{%c@>$ukOF?_uMwHY4bCy&;0||ZQ4@3aC4`9 z|GmizS|_B=+WfIYzc-(j&9MG>-e9|J5fxKspKiSVOEH$ks?I(?BEj<9CEiZEpJ$HV z=`;IQ<<2j%)#a4JikjRuR#!YUUQW(K|+E-lne=oL$qpr@FGcv`c|C!_Srd?V7 ziMjWa^a+%zvVvCP>5B_lH4~gi;r∓nwDj_0m2WGkfTop>=(n6l3~%%Z6+pa^&cW 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 C1IF(F literal 0 HcmV?d00001 diff --git a/docs/OtherSupporting/OpenFAST_Using_a_Stiffness_Matrix_as_Boundary_Condition_in_SubDyn.pdf b/docs/OtherSupporting/OpenFAST_Using_a_Stiffness_Matrix_as_Boundary_Condition_in_SubDyn.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f697381055fc13a9ea0443d0fe8e57f273ea5eb7 GIT binary patch literal 648202 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ⅆW534dgBgCkOSZeK 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 z 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

aPlWT!P%x|&8 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⁢|xbPQ> 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�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�Qh+3XfDgU`6llX7%rni3Ke1UEe(mWp)5}}GXkTT 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

  • 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%0AJvO|)oI?l%I;Jc?31R>f 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≫3?XwM-pyLHWz>e$2fugdcP=K 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π=qbh#e@p+lU`|-s)~6 z58B?b;mCIcw;l7fy+)9M-;^<>-{^MMF88)Y&bG*NBya+D#sBCyGVAg9QSnM|TH>j{ zY;hS(gJ&gh4I0nU?XUsrDEE|obkxB$S z-g1Jsfco|JGv>hm{ERv9m!sxu=AHrA`#tlEx%XhL=fL3HGt>uohQj{z95wG5?gKo- zVQ)Xj8P9OoHf)_~y=etTVl3phVJv}ZSSQxNhOiOrYHSm>9ovoFf*rzMY+kox*XY>T zhBdd|-qpQle=@syi?VF7jT&g0FbaNxveKPZlx#P#CRi@GIZg*^KXKl47~hlO&v@G#o_snk*GP|#7Uvk3pbR_f>|;VaR8T0|%CJ7({l{(7NYEGnR* zTi>n?8KE zDIQNmHe$_;P@AaT)FsM9X^@E^UN;4$=hr4P*rtu+LSy+KL?pzWvRX}H(!}d-)Fwln zXh(ORjUm$xZ#V`v0*ouwc=qU~qqC&`%>yUfgR@zq5*-6Ipy#q%)fl9Pwr&HOh zvJWCp>3Z8AW8Pl}k}Uc!T_BDUZ(}Zq@B5o8*2KY!DtIvh*2v)M;PxQ?y#V;04_xit z?#1tQg4>+n9ve7d0}~XunF13yxCsa5Yhs`fYsN-nL@bu_Z(?_|I4dz$H+F`23u~Nf zK-?TZr$;x0ST}yfA1I=n7!EuZ&Eu7FFYb#vU>&8!=!Nw>4t{sdKkx1B+V$v;Yme^h zU2@G_xcNvP(0{2@#se(b`F0R4}Vy!f?uEN%LxIkH`bz(jhx`iHj>0EiakD5 zoBo$tBWP9>O75xR*L2h+T0yARCbE8o@ID9P2aE&2WfcmC5> z)1^yTv9+71!1j@t_tG1!35Z`xYZLJWc!t63Sl4MAO){hj*{>}*VJEGCff#bkP6ODk z<7N{aJR6g+Ws_*pSNqrLbCb>*cdiHlpj&9f_(%niAcFt;*s(87{|w(V+!_X_h_^3( zcA~WjeCZnElfRt)7zTeuxwW5IO8gjQoxk)St^47bHJ5%xJY(L0Tadm7>)T=dhfu?` zV6G6Vk3#I&2J0l|zO-4tBMTw*g#Ls_udjelT%|wZ{VS@=@cOg*b)SCyT6i7hs)d8D zUcd5HAiKl^eDU?;pm8htsiGM>--3hu9;K zl*|D^8BeF{+dDEFlzO?lr(O@F3q8UHONSCEqlr0Zw8#vPtX2mGuur8(OYdRMnbT+J|qS{#^HPid9uxa%ltKzC^oW z*Op~@Z=zE+g?c)|zx72EQD1&!N9~^Vk#Z*Cp@9J#%R%!45Hh!6Uuh29GWf}zVCQw$ z4K^Ap22&}mrxH;14<4}ro7tR*DB6ey3K|&H2DR0vU+sQ+SRKED}}XkV83N_ zd3P$_(4n*<*~8qRZrq67a^1FVlmVrwa}Y{8m<;gfa4KC1C^(Xjk8{&6l{5&gNpw!1 zFh?LeHxFPI9bS0?^*jpn?}_NCU?G@%vy7{);zGz73hw(r5=W5qRjcy=S*~_EaMQOJ z?HG*Z!cKos4YQ$0!Y@{G3gfVYL$x73V-45g5T2<;>=E~1?;Et-s4^{EOeuxg%fXu( zf8>VJ)eEy^*K@5Cm%%n5QXa4Qfkdt0kL65WE$fjyj5l5g#6GsZY9gi=)CUwhP*qwP z>;eC8KTDC*PcB@UgD~duEBo-VD4~dciQe?aHB)oIUh`m$f?O5KhX~dakPe+# z65EG8+U!`dVuNeUpGuAO_6{stTU6NYR4kYQ+{RR?1Vysqdq55lCB9_P zA%ZnG`BG`BI16bAWu%^Jh!g7bh;0}{B@k8TAOtC`m(U?M2X@H)4FF$O`5Sa=9;9T^ zuh`w8P}p1S448M@RHu-N#neo|01d;sf`JvQSH&!;O3n94iH~<@T9IUT!qwVgQ~Ikd zTe)AgUk+$iS#b3&%MqxFPk{vG^tt71z*^gMaM37;*r+*}bgfxbt!V>U58(&}mi%>f z?~()pGhpJwefZAl&oqV;R#dlTRt~)f%ANanZ5m2JIHOTE)*2+9g!H=(+urQBdjxDB zxn%@D>;WEY=*VKQxUUZ=p-_24CN`#&bJfmrtX$~C#w^R!fo?3FLsR@2#&@2xuyCB6 zLec=-Ba*y~b)unmoP*pGi8N5xo0DMl{`Zz<<%Gx;)HX+7GZbrZSW+ig2twk?%BDL< z^8-1r!z*!+Wk$u0h%f51QGrsX^&3j;NN3taH8Ih>@5|eoI~FG(Nrogv4E2`8a$aFX z&?D696%XaHtPCuaQQ)@}SWba7Rj2R(1!xNV8wJi# zK%f{(Neb>{QgApJCaJ3NKroaHDP)<%NqA5&lWwz_1fXDUnsLPp%;sb~p^C{sfD(Ad zVFn>ZQaJ`qxIpa!j+U+Br2c^jP(xJe*Gd8$E=$@3mzg*?3HEXmj!82_9(WpJ$n1F| zr}N&u`;5yxy53PJA&D83fJDq-OF5oMMD)Bl2!r?t!MNkeYyd3gz%F+@k@B^+GqU7m z9i6R5D>UViBpMXIr~ooL*d#(1kL62#s0k2^$H}LqLx+43&K+P$1?&R5&rdl}j)AN@7Sg)AJ6#Kw<$Wd-;Sl1Lp}aQK z5i+wbn;CcECfq7y`U)LGT97pn#KkXJENXpm%(HB1CypatzvR*d6AtmPf$eF=)@Y#9 zHRQs#YoNE$z{0W&B2dlkn+@&X$DM&a>KVy`tQ-dLkVWiu5t6@J2ySBwLi`#OP)kB>vwbYMT2!^_^#)6@BQwPl@XS)k+_MK zgNRB+NTur`ZiTQic5O3oUk=oBpq9Nii`Nt2ZYvm~z#st@K^-3TOPEW`=?Bw~rcLRz zw;JNhidTxMyu>nPO$|!ed?W+f)a$x`)%et$PCuhIAUv9{CCc%ed>2pFKFp zrH86Lw;uRtqqQ;H6}EA)Y8=!VC8PO*W8)i_Y71|AbR(Ngstob!$Q@6N$FJS7H4RDI zq&VbK96yljlC80eHxi_oVB?L=cdgm+mHoYdAOOUQ3Z$v+u-#>BSF;*d6_$1Kyn^EL z%L-7GT(y+U(SnjwoQhMB)Hn-RKryNyP)RAyP-};(fPbo%kyVNEDXIf=U?i>jI3FjGYDUVT>5q^sNyhZYl+o0= z2ER1Z;&Vm4xv;HsP3@fD)XQc_BE-Uk$(SC@P9Kw-64?$%O?m)~5E)&!hIb2DkY?KUY*UszHK02|V z*Oe`u*xR@rn@{Sn(Y#@z=O8>DT?l^<$(zKOr}ygp!&^VKF{d_Gu3ev0ddq1JYAsI% zw3utnclX`>>LXVz`^SI3tGc`75;!a6^x7@Bia$}gZdrcp?#ISf-m!Iw=C$!I3YZr4 z;IQ{>k?xNFE_8nAz7yAO{q|=zxIMJhg0mihM!Zmf)Q(1y1=#-P0*lwHglIRbV4+a9 zrGiy0n6e_3dedaB^(m0p>#MSF@ZIZ(+4S|L(y z)LQ<|Mwld}Mi=<6YE!0h&s&N9ycmnQGJ~b*|5I6%;uXabTu=ew=~TZ4kww({Q@Dyy zDHikQ7v+D2dL;pOQ?OS8Sh8sgupR|vQ|0U^49V1q04`y3Gk$2i{26RX)Gw-$<_@l2lnX0kW!LGKP;x`1zn@7Az%)8+{$ zFpH8)U^z*H?>;Gt(eoS{Zi<@z_Vd%{x!2LWyzxG_#e(?gWwPfy;jgZQmk4F0YdIE)^f?yLf5(@_%#woHf zM^NjH;wtPdop-?AGTjD$@c`6?hXw|)I-qG#r%AfdRd;vM)~0@BL!e%eYa z0lz!orvof&wWbC&B~^@c1(Z~vOCiBRttfR2z{WNizthS_6p4?vQ3?ud22vGuC-eW$ z-j{&4Rh^06b0t}_Z0(XITZ^w&%a$x%OS0u9UKC5VoOp|u>?X*TY%8%PBgrwQP)Hyl zltQ4TZ0!RIEuFRlQ%X_LIDihxaS-u&^m)6HFPY?<@4d< zf=@RZkoi@CQ#c_;fq*>*t>;o2SAE-t$-r5lvpv?|T$Zh{8F-~iarS;*WoKK~gcOTa z{JNv9S^;DwlwPH*sNiv4Hj`pQ+F&-97+byBKLA2VnXMAByqIHV?UC~{C}9&(-yu`Tk63<@Zx_m_@f%UH^}-=p5VdE{3W&I(@1;?^KlM8Ylf^P2W>uhp{Y*t2^*=cNbYcX{usQ*tPbspj;9n)L2U_Ss0aOJ4ba?CCn zkjN@!q)a2>7F)_mjmF`tvpI}rxZ{?ZNwe+;1V|Bk337q}L1KhJ-ytf3ixElaX~H3O zkPe$%Vm8PsfYu@t>UFw0O?f%D&OkD2Ei?+amLh0B{G#Wu^cX%D8C&u&{@3&D*jS9c zb981+(=Qy`wvCC+NiwmMiEZ1qZQHh;Ol(^d+s4Vvb3gCRZKv_ltdQ+CfIE!=AK63RDENfA~}*q9gC20WBN)#EclC@lycycEk7p z0Lb$LV%Y%1C@Y&rHZ%Tvs>mq@^_js-@$JQ1aU(113csvL=jWMwnsS2#=*XUWLC`)6v%q{>k zxmFI(Yk|ip`b!yV-6W>~-LC*knLB6@Yieo&2F`(O8hcdoUpnKuhxTi`!DVjs>^E1f ziAkrLk3JazefnLgYw&3_{-j5facX(5vO>pf@+admDd*r zm4^=;bv;s;8>>d~R(6rC8b*U=jY-p)KCMnl3P%lZ4RUQByvavMfQzlL z7p->1n{{fOWbNcleDF}Q<}9Ok(dBu%c-d~e7@wAoWy3cZtLo47`r;H+!3ZZ~3NIbB zBrGs_qgTW1x#audYt75dcDwz{zpM=wn$1cfYA}9HO|6NvSR|onu2|1MEA47oF=K_$ zes&s(#sE<}M9)e44hST}kFvwXgdE@$dNluEja|`}5xpwHysbrX%wQi%?R%Mm2J> zruG!LJX)SVPdVco)kj=Yi5Z%sor8;kz{JEJm`>BoP~H5Lwl*cJ>_N*=4=VhrQBW|| zgHBdOc&K>skI@IyHGm&533qSc_J2%l=aFsu#P`ad$}TQ)`Yib+99dPCmv5*;J1zOm znScNCF6O4Do`{FIW$ufuSJ=F1<_sW$2#`0eW*+!GI5~2a)4xPfk3eX=j?feSlGk7u zGJ&@MCvl+MNlKLz`8xga0m)&a}$ad^}!j#Zepcj zltM6(Od|DjOSUA4$aCJSXvM7{!tze7QwtNDa6s85c9Zv6HCI^8YBqKUJx{@G^(6vO zncNhvS6hX2yo=AoNdhUQRzc~+RO-_Clji1@HV?GOlypzYLwbsEnr)^QSmbb0xa#ip zmDB3I-|v?A5d>NR_QlEU4$Tz}7CaHwW7FxFBvSJD`^27IO_ELdl&Dn58U;x`@I&h@z5n}dsS?o%UiUa+yb*VO_U z!Qz`#bT4HPpJaW0b`I;@H{#g5R@S&eK^vA7>tcV+h{X0=Yufm`70jd%1}FY6R}Y07 z3a=OF6w9Xda}oyv%k4cY#vMz-btw!Nj?+M{Q;l{1?i494E5uc^@ilWvy!dgP<;}fK ztTKkj3%oi|tPOG3)`|dgRtfG2S}p1+q#LJt+yRx>Uzrv~<+;CK1f1|g!~{+pAvEW!*Ty5^;nER*Ei{;uGDPv*wc#x9yO|V-I5ua4`wQD8*t) zC=pc(4D}k47l9jlMkQ|x`>Pp!4`U07tBG52??qRp_9ynjSYX3Prdri3zA?6_Nh&AE zPFz@2Hvb}cN@CMVwxuDO9J_p3QWHBkQTaw!*gSfsCrSODTkS_HUPO;EWggoNurvs zY&jd&y_;pABpHGk6$q+;nnLb;51+$~Qo>OrmLVd-C=3*<(@5s`CPCL6CZZ#68-#E? zj-jEb76jp%7Led-6(QC)7KlI~4qR+%+&d|S4j}KPeWYZAY{W27jbK<&DXVnVM9==T zP9?*}9MEML6x30w`&rEbN#pAIgaq?(Bf&9~{8}7eu&3Cf-+`CuKuifKkbrdkv*%puFTdft zCcEQuY(CuI>sD!Oa11i$_uwPn3_u1(CBbwJ8s8tJh+UWgvS}EPYd0O zDx5JLxP8unWGtPxGEz8B zbkmvf3ZGhiw28%HnH`0Nv}vk_DJu;R2p;a`QJ#wt6D5s8qGFolZXus9Y1gC)Qu49k zuY#5F_=P)19Cae&@iw5(6;o}y; z@WxN8n_giG5ZTIVP{E}IFl=>LXGb#u8GZ#NRuRYc5cls@*0Q4Sk=0z*6bU{?$`>?cN-oU%gC%B(t0L#C`g0;6%7A7JfhZ7RkzciRgEZiSm!KEW~UbJ zyOyEZXWi&D$~N_~Ca(JjoM#A?H}u@)p^l|jMFS>^Ms1hJ3sS830D5vFbZ=YO;#JAv znX%@ER0G*s4;$84q2ZD?jUu%Wqtp-E2a&X($=IMvJSBHEKNb@~W%(kMVTW&Pk6E%u z^P@7h3A-VW z(Kiqgw<%0yMEG+l0#^|sBtR`-_O97=dVV7$DIEp0$+roBvn6mQmi1NCtKh=Hvwy)-Ap-%oF_H=?thEP#fpip6E!@`1!GJMMDi%)Sgl3%A~ zP96OjS8O$RO0qA^VY0AnZgRp?#XFt0FyELeQU9r~DYil#+fS)9y5QvaASSD%4)07Q z00;Gvepx2T_r$#C3 z2r$Q!!G|zC!*w#lbg>s{Kz%7L0P7672^XmeT1G-AF-%1f!^4`cTn}E=`V_3lx^=OA z9rBPrG#JH*$cKDYAIlpS*-BAB5ppNz()*JQ?y|;oZ8a?e)lK;ptGmukui+SpAV#T8 zYEZ2+0Y1#}z7Z@K&+Zq?;I|EV+WMvllD5TSku*uYwMFZxVJ^2LZRe4&b$wf|G}+sHu-3zxEqhe*Lm>*M!?g?U<8Q2=LltUMAd9g-Hu@4{JuT7Z3Z+ z&SxhL%k^bbceVp_8;k zVe!R3-AGWQLFqM@r-V?ua$pgzy{b_UeyXLoHgRcr*nD4f4Hqu7p%Jy=1fn#+hrq!V z61!#toE2FBp+gFk!wny6SndHYYTO+KtWayOJ7q|JWlc8>$f?Zk>?--U{M*z1O@GM2 ztE@?BQwy`Oa$(u>x9L}~C6#vU2?f{*HLai8Mcr1GiSv2$?B*G$YOC@G5K)UZ8{CZx z)^i*UdaX_JH1TY1l~nHajosQSvjWgZm6|Mt;!>e)l0`A46^?CfjZT;u@P)F~oiW~o zgk)`81w=qp5p;WYJ$Sa1*<&In2_fMU5NsykBri?4ZUwftmLR(xFnqAX-1Pv}BJl2o zPv;y@-#Jko!0vsl4={SoNA_A*)O$JLtk7aQsOuljoi|&*PI)b?h{S-Y<$$esghNmx z9#I5i!}sEKc7-*l70Scih2qHP5(@DL2uTaXB99R{_lF+)CV}in!9uLSZ)KpDTNWy| z{)C!6e=n)Be?-&1H4Q)ag;h!&v?`}!YG}FZU_9(e#kStoY=5y(UN!WQWs|VI6!R%N9DbO%H-AlAYw-#0vAAE z0|#PB5}lW>iU+TM8Y7RvxQ7Qdy!CqM2Ivm#;%YCIwlryVF@Geebr_^n-f14(O^Q{u z$YLppyPm=`{N-I#YC$|$Ra5QQStZ@&w!r?~A-zRoiC#t9Tg^Groqc6z1#@lIbWDq) zvXtKXq&#_L)og4D)RfjuPuBBIzb?@uxF5ZmJfu)J?+K2dLT6o5JK78#5II$!5OYLH04sIUf175!PE29r?zgbZlq>JLEm%(IKRlKgdGu1Up6KSFNu?!2-X6V&^AT|3poNMKL7U`Iw7rdVMOIxT#l|%Da_&Tc>W5 zXuhi$r`EjL%Z~NO`tibu{$@k(7Kh~-SrlTegz>JW>hJyBxIXUb-NB*yu?lwECGFS? z&DGjmrk?jsXI|-lQ7Cd8nN*iPXy$SH#7fz`BdpAbpyS0FLq4-0yTXdPKP~2pQ%WK_ z2Mfz1kgK(nX=%k&DlXo7zWFWqrapSIw4zqcGttzlRHfD&reT4$5PjlcruHG*2!Gjx z=4Z$=TDWYka?Tb?M_ZE9Pem95$KvvN`Osf^6f-BRNFcRYf$jX}fH(kC!~~iK5gkEq zEQdhff<@3E!@b70=#~fj_)z_1m2M=D;e`%ECK0nE`Q=A^9E#6`UBQ8VP5taQ9AzwY zJ5iMFs@~N)w|!qp1TSfxU?`t$YChRaLlTiY_j;uFj1)PSbN_NS%VL0?KQYUqz8dA^ z@Q&LD>*^Bf+qjTf?5zr+c2i@Bs-%mmv?Ia)LhUQ@MSg(oi1dp1S6B2={ckDRcY1AX zdZ8Q2TcO7Gj~vwYv6b8-$Hr?r{_)3;M|+yLve&J)t@984$6{SZ8iVh6AC^-Rr+BJ- zbLl4vj~fg4C*EIIyS9^hS^QbF-mYdgJPAI{sG=&bl+{A*dtYoPu~SD$bQ zATyG@LOIQuImuf;x0ht{motx&xCTP-Yp;`NU9Y8_kjQDsy~^+m!8Dq^VB_i6oS* zE;}F+DpcyvdE}993G0PxzabUKq1$28`kN zn(}_*^P2<8@IoyPC(H$l3jGQ=XfPWAlgdmiNH#%h(mxy{_MbIh#qa^~4R>~0nw)Ns znFF1x1hj;3xmChnrgtx>wf=pkpps*_-!hcY8kBYMQXN#kyK-ENP3Qd5XJEevwWNZc zMO*K}FE+Pv0llji-rulLSU8?dD1ltNFmd^s*e^$f_zFQ zL<{B6n1!^bOc7p!po#vC_Duzuz=%M00D&gm@102q>rn5C2~7PmXo+2-!RM)swH2z7M9!v0Q)wdWqlxjvM>bLO`ZZAOIGtb{G+Ew?Zo$0qA zmr3#Op`FGy5g2^FmpGbZv5Pkqs#>9ToDO>4*#r5K2e-9A(BHknXJoPT)U|Xm%Z3ak>gt1`wH6S7q+ug)eXo9#eN*{HV6Rx}(NiqYtBOnxM~jaPzE zAW7E5g`&zL{8DB*E~uy zM&2ApJ61AXTyd5-*yT5~z&`d^y0kugXu_O$$U7mNfXVG`Ob=SpW%J|HoR*-uD=-wH z3YVZw#|qi2nU3n%*AV3{Pq4;_cpOyM6d_5m7p>pI6LoQ(tOG7kw_UDdkbymDyAl7O zSqFdVhb()v-Kp-YR|xbyEModK2I1F1mS&v3mRB89x;L2GbJ=KV6-KCAijBxl0wyiK zvtMT@Zp$pOxeg#n3a)U<@(cbV<8q7O_JRoBDV4DN>pU3vdH9iAfphP!ob4*&z$(HJ zOnobmlqbJ96gi>zz;)YoxxD~x$7R=|U61_kVdw}Y0kOV(CXIeY;#(PBB)}znaU-O$ zN9|#R&^JrkUxMTVC)|hdW~;#Mr5*q{!yL$f(?1SWNhP#$x3x;87FNhi!6x}h;!hy? z*xP;4aTauym}^)9uqM7@*>^uyiSYq+)`%=&1#pOA>9D&Fv4~pcSl5Qr=aIpFLS_+4 zxK8E6fj6lxir%CZ^pfGos1Ji8+ZPe+pe`ygSyoDyLJX6n@lH{G9KY{ZfY-zL-2wJc z3SR-QZBiyua;T)sfGAZpBU~=zFl7q zofIih|99y!5DPuJL_`j6XY8*%kDxR$>0jg}p?m9kQ1`hAZmSY2)4^L}us@6rib`!r z7-BP)K_!+*i;)#wc+-T5zdDB-aads0b7v(o?i>;zo-c%$tW%5dWcn9IEI6#}G0UGRPSF zB)Q6hlpR@E>cu`PYsVVLum7V&k_stuLRh}NWN+_qj8b{ogD5I@dHzk3it0r?~djDd}^|sBHC>|G@IX$Xs2zgP7?}(Tv*G~ypW1`U1Wg-$H)L?mg zdFlEKL;`B5z;HUXke|g|I7{mKI)U^g9(sh^;GxG&9~9Oo_j-z%Epb z*$>%M&vS1iRf07C78#Q~@C@R?F^{(ua2L`{my?%4lYa#WhdC=HB{iBTe@rf0a-2r~ z!G$G%$?pK6A6;%N1u)KtDrvGHXFUfg37mi9wneQ5ilz5pQvVbqwD7cZE(U5LoQ zEPf<4m4p>QX((M%Ykn7$vij4_Em1$Bwsa;A7x|4JIaK&XyPe0@FL z6etlzoHRN4E}{Yc%-+Bo&Ae!UEyOh@1twQti=Vn#iX#i1qJCH&LkRuk(N4m7NuY}n z7Aks5dOQo8kY|+}8QggSCiadv!z5ai4>{uQwAch${acTqBudY)vyaESSQ#+N2F z#og&@(69IKJ%Od*lR_a520jA7btP^B{Sd0!CM8TT^}dZfojkj zy*<;SGKVJCIw4p%xL7zCaJ@VJ2$tS5-b)BLr1R(}__n=rx|pb|5KQwn?9*%E!B7zb zC&BcdnZW+)L2hmR#ELFCY#4rl=7KSGJ*%4tOeh9r^=#8~hXsDVUHr}vk61n`K{iZD zZBjc3Ul*Z4w?8LivwXbYhY`j(36lkhpR3Z{f&`_h=;xUtKxSE(0cMD8`|yA< zAkUWY^=b&@6sVbj(sSO9Y)n#C#IF{_Jesd4IVtj0jwMO4YmlyASrBC3Ms;oF~$Kt(l&B=xMo9?N2 zJ7M?o;{E?hu}kFe{#MWH#B$iXvBfVq} zo=)6MG0EEFI_7vQfA1oGGuE8~PILt(=`t?VwfzD&;#465RLo%YyZDpoR?In|-{3AV zPsQDEUR0?&cgnNw_ghp{RV(yW@oZ-c+3?|$q<|&Vx#8h1a16l}+lUSYqDK@! z8Z}EYKo_w6cVMfkvU%+@Hd#?B{<;8Mt0ZVdYAI_7(}O?;8ilV}&i9X+*YS_vUY{nt z9Y3FsmSgei-hw*Q5Z&k=5jvA^<6J(!PLDAy%E{&*ZM`>8$k1+oZ$qO` z&5*N-^~1rfQkZ5;K%@vrCptcM(W8o&oEI}?pxUE;60AM4U_`8Bn&wm_QY=Y=Z-c&o zna4a9SDcbFNjjY=^**;DW8@NnbpkW-S5sW#XPf!p^!Ci3>P9ufhOWEITI)s{6*na; zqm#1%0?u^&*^oGbiIjQ$<-{5n2Tm?`=fj8-!>r;SgzMD2Gt;+-liJbUA`SNFgo zdlOnR5D1LhuO3|#LggFDBM|@kZSmIgr^``)lro-)hxdhdql{Abb#OP1_w6-)XAb9U ze>5A7SHt7ZDWB`X4v$Rc1GaM8!?870bcf?Yaa@*n*RK3;&cpO(ulHcu=CijkxYq)y z`fj<0(fg=d{NE`TF63?o8{QrEANJJ~8;x1rmI^b}*nx-I?`z>&Z&UAbHua`rE=wE6 z+%pc(mzQsgrpa0M&v(7Ic-~!2>OH6CQTkoQ$ z2DgSR-7m?li{(>pZxf~X7qUjyZ;#b0N#pqM2D>g}nlcrgUNVobFYwvsC?6-4t@wjp zx5InkBeC{uE?Vw|r*$&M7p2*;TU|D351x;fTNSd}dfW=1{prG+EozT*WNz|awSId& zrVevjvM{85`S-E~ZVb&4<=jsvq+Glvr(Sny@D~qn4s2m|MMJxqABg`bxn<3cCR8 zgOmu|Dm4uJXvCwo1D=P!D=|8oNEsgn`&!};mPB`N?sgWRbDhY*OS@HZJkg;)E^VQh zzxR4udG8)afBV>8_W$`P&2t~Jo8*4k`Mh+Pd3#FL-D%MFHrecT?LJ42bh-)tq48o_ zzkm41*K%3}URPHs)3E6>;rl?1&#v6{{8Xr3g^=mK0e9Tr7!O|UX*#u59gU<}rMXd^ zxuAG6ip>*TQ0;a2CYZR?#pQV9zENshqifgn2&OzyRi5OfdMBPyT_0r@j^}gUc zUp0B@Rat3qIyR;0yprDRA*l0Yat=t}X?TV8^1J)3$o#?Q1jpbHIMmn`cr=GCuHa2tW<7V+;sbnc_^G!{Cj49gU`QgKPp@_Ks8(|d7ta~`Xo!%vi zOKtz9#@&djJJ=RSROj-JKxraB-NSwLfby~_Hq$XR^l3hW89Q&_lQ7h7XNu1knclqg6oHm9_ z8*DuFzlogdmke9p#$~2HZ1=UUZtJs3U3_jGmM-zT52mth@4eT_xvj)KKBE;Xqm@m) zjH};L+<)loc78c|^}O}`)p%dcHW^8xzS&NyDEY|!GX4D}ZPwW7b9d_aGJ%%c`TAX% zn{rvC)A}j+1%8VCZVjgP1AD65?fFuhlgWLgxH-cs=f2mS+8Vd}WM_!3<-AT^`-OZ6 znmBvm^W_M0%Wci(t&_=#$G%F(`Jj0gb_bo0Bn#?sbD;Wj18rt@Wy}5KywdvO^{LRD zG%lc-R#URGIFJs9vh;U_V1g}?%sJ1uTp&3@4>}~BbOds(Azg8ru}G{)s^7PujmST)7oJUx$nbtpY4YCYO_KjS!IP z($6H4Vmxux<(t$a<&qFazKx;CE#~H(5t`Q(ldK@E2>ej>^5=4Od*OL}f4lCu=svjT zIlR}LOg(++s6KViw4eX5^TVfl!Y{f4EpbAVh6l4o76h24yO0bB^!Z*OnbBV)bFZ%J z)(rcmJy~tZTa8)r*)VCwXgz;Y_MLHho`J0^)-2YHVabj^Mt%p-8A2Db89Es-9-4PzNk-!TMNy{Dkn+bd}g$%zX8gbLvS2DHyPuISBI7 zeL_LhI21`aubN?6Zp*PoN;_eHqgW;gXw~L|w+sk}xSXZpqTLm&M&eATHbVGFRpzSV zJ-2yxC~kG+ZHvsqHt=8GCw@hw5$%R8LAz0%ciXFNoHZLNsU8t}5?Q%~fje5BDu+Z( zx!cUuP`82;(nAKVSHdmB8|J-7H!|_|=4;lQZ6hVb*V6;Sm;0qd zj7!Zs#4e{es1E6$&>pCqtn)nUhaVOfj}?eX-&bIRS>Zu%O8Eq?e=Im>fpm&8jzBV> z=FHWc?rW{H&jk2*p(@)9CqC58C|Afv&W!~LFK98o&hFw^ab={=&SP!t6f!8m%cKl> zQ-X3Itjj(#iJ_~T52rWn@uFuZlhHD{+BS5b*bBI`uQ3k7Ry>BV?0L9mgGTS#G9Ao> zfF6=5W<6ndQ9Rdg*vFNzEtgx%Y7S7*u)>D!gb*&VETM}K(1lnb6YvZB^z7n+P*|pF zkT^GHpD#fyx+zOjQtmzzTYn4Z^oeFfM65uxMPa|81E+k5Ow*zXLz{`=g^4B4n70v3l;p+k{gbT}{#4ZrmEeJpilv@khWSkTK;TD@Lz>Q6>R= znj^dj%1&sIU`{BT?IsisOHaZ%IAw>u5d~JehT^-NNyYKfg{Rq^D zI|6L-fEo-!K=g()eY+)`%yly%Ehs5j(@pP_l&~v9M(^hw<>M2Rz+(v)3M`;U4>KRA zk{(Y6G@{^fhux>2ARKxS&%yqRv-a8Qs%HuumSR&}XCK}$m0lS)(~k@I&O?y{02EyJ zvo5g@<K=aZh~U?(`m3Bgx}!4Ku*!hPxs9lYnsVkqha-ss9o}6{dF*U*h}Ojv0v3l6YB^E`_~^I zhWfL7s9s0ZD=p3}^;Uz9%!M*~q|y&b^(ys%_Z69iL<-_4$-C^B&~}~3wkJdaS_9y# zoTs$io{4c@ca(+a_l3!cBD^QUnpR0j9PY&z`i}I993@-B!R~-2)i=%!4FLGL200g= z6EQc>1N!9kb`00Y_vN~oU}X4=9mwm@hK;Y?AoCl>a1F?69hu)q#7>6vmdK`ddP6n+ znnIL1Wht}OvZ1}$W8*KWf0nL!zzGj|Bf9m`zpP_Aq6VGZ+{oh|F4F8Kv#Ut9h z=vDXvA9 z+Pqd1GtRF0=EJ;KjGXV=ps8Ft^x0;d8^n z9jmr0o^6S2GY%K424?sNq!fPHMA2ipRE+i;FQHvflERSCl~c|XSKDvYl6t}0TPijI zZO}x}z}hbP9ualVkooq$x(H;p?1*?|>LhyeD%oX$heYI&-(%vthTraubcFa$)7H0> zcFhy+9a=2z_Ryqe(yl9p;7vKP~me$9;c$S#a0mU)**u`<7abls*N;8rTgSZaBU8gb%aF%|m*-9S}E zPpTRuT0|spMzWCvgG|6rnoH#e+#G>k9)NOv-B+)_ZT^PbeKUKPWSE(qvt8^OE!?Xz zvm8I`2CJ|9lQ^BCA^p|<=YS`2w_DY-eQM~e`U*)A<&l_%t0tE1o@LR6nY?METa&x^ zWqWVPk*Cun@-oLQ_S<{Fq4jNC{wpp9!GI!80zv);P#l!#v3Bc=wJdMS^-~CLFu|@O z9#hOw)Wks}ftyZjTu&-b%lTQ(iQ%b%d0_5GxfH(N7E(vjcEzh$C<}pZq|k-l#Tno@ zCeVw|1>iX4C(rnM@U^FJOhx7|d&FQ8U_wa#;mG%N5ON>^0l;7QbKiTuBCaGFak#8x zlWU}w2Up7YbUwPagja*x*m(m$5RCZl>4BU2J8eE~t;9BORxX?`H~~Xc-g+x#;y#*R z+I)N1BGsE5(`}`^i~v^I_7v=ziq;=PmG z-0D-%sT*YF8Z(&nr|T#GGL+}l2K&}@$^x8MNZZw%dBabRN70hmL(Q(%9_0E!)W8`d z3U_HJq4X2Z{g$M6sn`f2{PHJs4|J2SVj@_vP|*cvygRKBeYRf+^O9%##jo+xo3aPQCIgh zUz0!{Yu41{04c?44MD1DSKYeOJTRuC>({7l{wj^{i*m-QggNiSS~-s<4UX*6QdKwV zD};>TnUcEDs;N^>t08Ddt>QlsSrrWH?irCaH-EJ`o?ueiU6m_DGwTg(j@q>!(Y8qv z6U_OZ;THKUZuc!PiOiBJs2-bSK0;>dr{eAJ7`H|DS0^PMf+@BMp-I0>Ec)@o@kUOE zK&6|fA?Obp`})~Zz;U%T|9$#o=u3$%OCiqyJtNJ1aaJE!z4O!je01(J>)}U(l%tac zT}fA)kKovK-*E8+mtU99nH);6Eg=qb_GE2oX7{6($LO>a3~5IbJ{3V&@bJy7{kM0) zK=;|iH3NkJNi7IKV8Dc-pUf>@-MCNntZ}%r4aB_OSPY-v=n|=>@G=& zKJRCu5d@-Zm3dzgs3K%uya+7dsl!Tm;!SmtzjpQlp>%;TjG^_t9tk7yv)Qg*ZgaCT zgF}F9-Y_;lm+B*dJ32EwEjl%UTD)|b7|>uCn;P7Wy(X|wK`WVZ;_Y6X#Hl~;ak`Iw z%4`}Q3BQ$VAlT&zyiVS#AE z9s`?zSxrId@tMVrru+y~=$}6@kw7Lc1{r_|BV%F{5=a6}^fypI>JL2+Dn z4tahEk5asim%U&yP3*Ib*9miq8|6-V09u#N-Lk5WZxo9gY=F^tt=yRnhwfv1h<-^Jpkpe`93Qhe6OBJz zRZK?kVc?_URsPOn-1{9T|DCK{^iv8P{_^z5zCl_UpN|o2EB50>ktE5A_`JV}D&Aq` zw!ZTXq4+H_r?<*@JUG%7KRTAW15eyLZXSDCeMGN(N2+%D7LrXK#}nqXV`djuoovD+ zIqm1w-oZo#hDY##9Kz8j0Bw1W7A%yZm4Us3ouRJfU(#C73>J!kg@J&c;4i68K(9`~ z#>TEmK)|FKQ{i`&OiCr0ROA)i|0!V``4)cj**??zc~L$|FPj8Eni#= z?2P{ys7dgj@G<^3e19PMpTB>g`&;{`^-uZ#0l0s({4w`G_5Cr3{@>tzQGX!$)BZ>6 zzxnOW;pXK)d z9p8W3^oRP>`hVy6pZxzq=0EHHh0lMF`yc!m{;c@_|KA^pzt0yA|HAk0$p5Kj{EPpW zWnVe_AB6tR{dXSzjoE)m{Ii7qz8?Q`%`kr{|BC@PH=VGlg@d6Tov?+jgQ1Y2zO{iN zour|av4hEyqIqKW61mkI-?8%3Bl+5kUwKNmwXGY`&0b9}wUr3{{rlJjkf z;*gq`652{%eLh9h4dOK}QSJBhfnD^81tMwDhJm=NP$_#`YsBi%CVpr{#8t#F$a8P( zFuowY@2yHI^1iD9@+6c=pv4CXrh*fDWLVwNNfx0^A6vZp=-LK+xeDT4l!j`9^Bx6c z8|@k!%h9J8+7pgTHx`xJOuV$~mn|#8{rC5&lM!XtuV5d!g9`tL|3a4k$BAKPX8328 z7zo%n7+Kl>=R}=(Lb@paX!omY)x2}C1HT+ypp)2ou+KR>5>OZ9`eo0 zO4okQZ|Xw50aG6rI9e+tC}ls?oc=>r176eR=c!}U=hfiu%MYUWQ0nT`tvi7ouJVwq zbHbZF%>@Td2|K~@)1zzv&-1c_MY2)_Q=+66>1Aifxt|mBTX#4!!T8Agl~%1rV&?Se zUeOz<&D#V!)qh`d`YBT5%y#4)J`MYOK;?6-PPJFW$Xqv?X)CSF|&5ZL9EY0;me?*6vPx z7Tbf5(m=s04@JjkJ|;mcU&1v)Y6np%6*}(KM5rdYD&1fAT<;7so{FW9{P)u6sc&gT z4`t{>Z@-KKQ8?lMdJqz#Z709hap zADOmVoXYJ4`^se20BpWX>H1wVkLuzkStdgo&N>=X{I4>!YsYvEd_Es;hG-jX^n+mY z~8($yc)Q}vk#Ul#>cKj-v= zDJ6BG6jJ(7iat9BSV0~?rdi+WNxYw`_09iO(!a+HP_!(8IVsp|!COlFtqS}v5&Hj~ z{J4yHgVA)WdYJQuXZ=z=w}tdN0&n^KUy{dMPyjl_kt-tH8@A}70WxM??=@edb6ak2`*!hOwNwIuB}sDur{bpJXU-v3Mm?# zGg84{@?_rB(Vpq)z4O5Lv}ZJ)w+OAl;q$>0ZcVC?1mOW*eH>DPQuX1B!D&>F?ET0E zKH=PYEchVDBbnu-i*#>{8>Aali{!s9H|p)t8oXY*UwN}Z;=fO`1{{C#WxiWC^f2%> z@aRIxxzPPVBk))|ssIp=`KlaRdIySSQmlwq13fNC4F|Rt`4~bYGM6e%w2?XfBeEFU6iZV`%7Ii*YIFDv2#ckyBxNvy78fJG%}W%QDJPGuIsV3=?S6Kdjy%id7)w&lg5`H*1__h zc$L8uS!%&AnLo4KCfKbO$y4tgjWz<^+&BT$9B2EeCUhdz8X3Hf`=U+;sbH2+cS`OQ zS-I?j6q1R779i#$gk&VpC2)qup=2uX=6;PF_{j-}6_>4wJ}5#$!%*h8nfl6cHCDAz zvG8>A8n^UP9l9T2?v>K#c@#nYOq;_<67M&Y&e!~=Bxv4PwbO~~eAi;Cl|R+mQ=emM zl}X655YCb3nbJHe+OcCY>zs_iT~ueau+mv7FXA}6pVo4Aq*934sc<@ZA%$+}$ukI$ zWE^3Ah7nzQ>4R)uWS$aPT~W=nEG}6Zni%pkaB=CZ6pc1g*(7K~VMle@_6KnjSz&*U z=~D5lg8Us%FRys%BB#;3>uhA5qKv1)LQWO?Ns5!Fb6pjwcQ?7QOEMSd-g4D&iEr4P zqf_CtWVR~P!jDR$Rm>?y-Pl7QkbvBYB^|L$aC0iOANCB6<8(n-C0T%mG(AxoR?F1b zTE8m}xB-cvMM_;@reu2%6f4|e)YvenSr7EQFuvhOssJA1Kz z$Xp(0J*DOqzdKA}y5xh$c8qb~Uk6RNAIKzd5jMH)VEB{1`ClB!dQUjWOw6x1syT}M z_OUiM^0=g$*Y+r~&M_KLS`;hw$Qe{1tw;aP@fcCpQeux~2lk;do};BB3L#$aYx*13 z`FDV<>ZPd6XL|}>`8kcO%oVgR<1gnLK}Zhr8HUaL$V-zmlM~3Msaq2(nIXKcMC)^tQY-GxT%O)ebA`xj=XrfZ=oJhQ>f*3( z@ajB`62|4lQ&nrfg-^73@+YS-t1T)@F0sP8+IX<+s#ZpSl$)TSr?uo@1+hQcrYDqa*|&PreJFUaUzK>6Mz+syJ!n^p#p27R2;EQb};gUyBbiC`JX-)Xvin?NP5Ni6;C z_s@tLOyD1hLt^PWs<``vHV8DmFB2+bMlT*YKZ1TnJFR8vy@*IDmfcav%28}=J6%a% z5!MJS<*Y-%`H{}E=2|1$n#SLSY*n_6;m%H(fTl?BOiWqgoxE@ik)s1_b z_`OpyY{)*2Dp3M50bZ4~P`0de@gN#zV(wsSbaE(+x{ySHRNQW-Ry@%nZXvtc?3HB0 z;p4>0J)p+AaSJ!wn_rDm^%|i_{CrwmF&|D8?yRC;VS z*3x;{_$6(##P4ZyQDm3zEANQ* z;)m7r{}%vyK!v{{cMZtr_g;p_N1 zJ*h~~&~x-HQeH-0PTm$t%g}PPB5jLS?&fzPfo$YBzkDsqBGNdb2dsnF@il(A$SCi} zn#8&|wWI7bYmF#d%o?F|pXvR=td;SVGzH8t#&Ylqa69-G@tYR;4d5HWH-T?9TUxz^iD&_$1&9_PT1-TXIeQyeAR2*a1fmg$MibEpL?aN5Ks1^NVQ(W4 zjV7WNh*}_Ofv7bRwLsJYQ42(^iKqpl7KmCCp#z}6QKd20igk*nFtLC4G0Yg%|vKGXh3Kt!VQEQ z2saRJ6X6EJ4TKvAw~26@`_l#%h&~|tfan9F&qVYA(Fa5y5Pc@14~RY>`uMUg>2Ue; zfE)(oFd&Cb$YDSZ19BLU!zSb~Acp}tJh1du(-|CLvmCqv+zuAlUSNBH?FF{i#P*uu z)dm(=0|)~M0|>)J7(f_67(f^%!T`bm!Y~n?Ky(7p2}Gxf=meq@h)y6nO+=>|xNTs8 z_|FIBe|l^9Ev(Lldo6Eg!%Vq?j+t^f9Wmw2)Md(>Xp1Rtq+3mS0~MKa8F@{K@l4rD zs*U;8qNwr&q<|^lOTgEFH-g1O(m}A*tQ`Ws3l8#8`VcwFI>oxty3=~ls_eA(S$ULY zie;l^r{$nU*=gysaIHL*yUaX_)IxWgI3M4lamPa!YVqmOH! zXR|}u>|i$Ana%FbX61H%K9kK%r%@3e_f%G=JH6x7Bj6%$<~U@gyLKN-RQ=x3Y7g5V z62o*KrxL;Pxq(6&*g*m!249Me1nETq&8gFfHG>SU%zsK?cN)nkBv2FD^i z-qLzxh(j4YY?kg&_vic!%H^uR+#&RFf9M*JhLBIHTQb(D4`D2pv0Hsm9iiTp(_=&P zov?e2IfY-n6|b8+^jNiB%~M-*j;c%4iE5KNO>M|PyI-BF?iXfKJ*(q8cB{1*@B*wN z!>^v7(PNr8UcFw`)l9WS+b{e}#i4PFa`p=kP=09k;qY&EMvsW`nMFM;TF?&25XcIc*M`&1SL5Hf|$ZTu-o1_lfTf<1B6=EV3wNv+m}i z6kjolcMoRcG?9#0sfO1~uV6Js?|iD6rx_=wdwQ4yZ*z*Lf*CP2R5PQ(DE8I#ScB7y zB43SRt({ZX#n@f-Xf^n1ye!SA>tR9Bv@%tEZPLYP<(;W}h_U3Ach=WaQo_=*q_UWC z(Iw-n&QUZDl)mpM>FjEnv7u&qov}Tw-pCh~U|M~Raf|p;We<n;#M>6Ov9YhSURb5`MspZjFozP-+9?djtm^qNDLM2BvRT!S@ z%z;#9PG;nOr;;(CGU|-VD041}eW#;_bmFp3>%?V2$M@f)<_aI{9@)11S@Atpqo=wV z+-R&_x-iLTpQmYE%i9LN!16ZEo4-)Vre>qf(_CdN_f%QwmDZJiZ>}|G=Bg__$6%#musShUS@}7-%SCsYn5$gORW9Z# z)62}csxKFDUt8B@ql)^xgR z487^xd$vT7*_}kymsjBru3JsU=WI<{a!zVJ7qzvuEfGbVZwXP2kv+Y}7(Er1Sgn|< zv8o;#HxwJ0&gungh6l zuK?pcjxY1)ny=4%S@)0(@&3}d`rw(i^02F0?nigm<$~s-N7CTE)9M{=h2U8Q}8KvYj8XI@1_^%Ygq7a zxMLR4Wa!VNX8J_>fa-%kAselt2)x@(V+qtmZ{qV6Y`B-!)6?vx;MeBQb#BFYrBqJk z!DoV}D4Xt(*C|KrPtrZKk6D8AgO}q;X$W<2U+~S~yX2*MdXyf6O+MBuPoQ*KL@Vh5 zmMp!1+I{qM3NR;ckSdjfnCSwVMOV`@>Y(lPGK*og$`R#@;ElnL5RI{v1)DCXPuM6n ziEoyj!EwR2X%6k77qMRP>6PcmTa`J1vfxjHzrtn~boe$wtcnjZvx9G>E$B+oeO&>(WQk$I@}^TB1ByZj*12AC$MsyX4oD3ze(z*`yp) zdX?9dQ_3j|x1?AGS#m8`ShiW-vs$d9t+m!Q);FwQ+FIBkmJQ3bvwzCSlW_(I^X)uN zUcru|Aq{UIQCPVT`!F4+;!7%%0@#;G(GT0=d9oZUkQQAw#CI2LAB|$q(+Ufh#D4_Q zM}GE4-X}lH&!gY5MwTpZm9AD^=IOKp*=QZ#&-bwk+Qm!xEdH=W>;v2#KR~=+N9)-l zwuE-D<7^DOnH8}W^af9mrnB3qG`NY&%+4-gUl1&yTjT|F@jw3QDJ!8r(kFqR$u9XO z`gKa zr$X3U4BPAIN?tD=ph}iPEjY7T$m10QD_Me3ZiV+A#(6$~v+)J;#9Vrsjxf#=v7-5y z--dB&;O9%Ay#+h?Bi4h80m*M?b~0DKsiD4K}>aB-voUHLZA%HwRZq%K}%@EA$KOi7qd- zR>{}OE9Gy^pTUrV4Mx}-)ZM30jLb`qPLIw&fj2HXrAfV~bcMbpP3{$cv!e&G{4ws?3fbw# zy}W=Tc)sp)D0;G57^SERS7zIaEfOcY#c_88i%3pPk?dZJ&1;ptO!9KeUcMd=SL<~r z7q^1DnZ%ME5k1V-o&MntyfIBa(NH?+=u!9a&}Xu{y1DAZ2AEe?I?3JtVS{gE9vfdZ zzKTh(QW6EjIn0~zN1T!y_{Xd+u&qBSa63y5d<1J-q%Nu1v^Ihk>4mG5RS_qZlM%8- zu|za0%@IqLr4bfVBxZ?l*sKaxEJd8K*(9=QZbz=8%po~?*p0eF(p2-#C9xj9q1(B+ zQh2Z7cz;7bEOQ@^PAp;3F(oB}Vc)fjW2I5)@lt_VZXU(*N1PCa)WxE|{yOk^s1z@- zivm;mLgjUG(|A2HD{8C6ZFWX>H^tZvup#0YQc0sc#AC92+0rB*g0^82TtDgf z$h-oCz`f!T2pbOcCL9B=(hJwk((Q}*jeISa;4?O?`x1pIJ^bRQY|h zJnyLNSyvq#`qJ&ff&$!ioUkB`mFbr}nY24)PwLC^uaXWY9Zo)+VyjH898{S$EBPV$ zzNGE)mO(a4ibh$MqLc}8Wm08wWr}TR($M6gDN=%0o+YnNdN}prK@X>GAGAHq7DH+7 zG%amp+S0V!($=NDnPy89uM`P!@r7yJ?Tkuu!%1BDNr&^qTSrVnA@%S_x;b-3i7${m zsx#NgojTf`TVfUak%R=K8%8N=)DibGo;>*VUz+QlbOHzOT=@aw2=arwR^@?4Z6#Pg|#V!q_xAgo~@h`>m8waf&#J5PlP`1YHmi8*U ztHGm)n|TqLu^*o1V|<#r+~4Aq@eTugV}?cy#MOXy)-k5XfEV|lD_ zZ|s&-g~8=dx)E21KR72J&GME^m*MQi9yk-+M^>nJs~gpw>Ooae`>aQ%3}r)8d#~#N4iHr(U$|+G(R})N8M+yI{hl5rO{HtDe37(9M^Qcv5#fpp_sE>yGfP-pdMDYOS#*@9AYD4 z+}4fOgI39!5>>`maL$t>_p%Gw1oKoMU5vyz31?dz>@wW``Ws4x3z56Y6swdGKKW+% zb5T)Ir$aZ#d7g8U^Ht|NPK8223-|hPj~vAcq6^|Z(JY$r<^9|EO~-cc4tx>V$udt$ zkDj{tFM+rCVD?oY0-kvZVfP-MImKOigq|uDGmE8IcG!1HoLjt1Q}S^0+-ZAthnd;M z?YQ(Ll^ribj*AtyIq*v&%i;CWCFH3uLpjg<+m?9Z-ivV^tb7kygGY3GQAwdC3x!pL zo;_<+p+!f5t0Q`CdM5f%45Ms0Tgh_dI*X}DDRW*ySMX-(Qe~m-GRMbK)I)HqIfYh)78*bYyTzvdH55c|Fo%<%*0KZJRSO zF$GzuNsmyOc@u3nZ=*wXyJ}~7_I5kB@8v^DhK5~3j!urac>d`WpM0`m@rj1TN&S<> zV*v6noPq~|E`})8Od@L);e)$D9 zDbTI#J=MXr{yy=%wE>==2hYbM^A4vYdfBpUwlMO#><{IWvTRR}w_CD?r)MO@sPR+c zd0za^cpe`g=NXa_6Km7rG8pmH%oa;KUXp6EGIu(eQzUJBL?P~~cj)PPBlHoqBN|7v zjA$RRZbat@n>HeE1RoJML?bOW4~eFSukFqmIsNplsvqgPVev^{C{>tGbb`$!VJ7VO zV7ou9Bwi%!6d~HXVnvRwhmtq|BKptxDoT7^=Fs35kx0_>2Xm2kMZ&Nk{VM6W4dfS% z7AYmu>%n8#z=hYdflqv5$Ew-aTyp!mhDVl8415r9v8-P{o_*m(H4}%www=Xv`YNXD z*T1anO`H4RC6_(s%iOG=qyj7`A{!8A9qK0Kat^FA4!RA@>E;-!bp))SL*WLu;j8B-Wp zb4e7N62+qQ_@qMIL$mZDF*yz?>hs81^f{SBrQ{7_gW@wgtt`r_TJw-~uzTI9%Ln!a zyD{0_fQ*AYj?{eux6z|MAw{J@JW()lt5YnpN26#rrE7@^iHcWb>S(t}-*OpKD*~?` z3;Z##n%%$(nQPmE{JJJBD4t+>c%6~3cVl;$Nl`oX1Up^WG9v+PDrRvSeT%cB#us9mHMEvAwp53MOenh zWJI}b$(cK?%sLR0VpV!(h7K@_d$X-_rY()0fq`4;#nsgu#Lu4tXA5hsBJ3k=Zh%p zmYoSE5Scb?}w=l}fw=Q%^iu)28@@4V)z%sZ&$lONZOo72$n!>JeV zu#iM>D56v4sx^2YG#xH~~B_a)(?o@*f8FmPx zS|G**$OLpJkhYo#$wjf(X+RX$)v}FvdAqe`@8{OG=MMGX`!=M^nsV!-!tFhWKl|dP z_7}(E@VA-1S!-WG^WXUlT{ma^XTPcY;cX}XVV$;4k53-}J1N?hK@Tg;&&*2RuIx}W!ty+i1c4<8tj%bxyFK`H=VI|wyhbUKu z?pCXoTo}TOPqycjv7K~aL;KtYQWg+2zn;wkDQ(UHsT~hPA#wJ111iBysKoj(^AdL; z^D-XueKWp2vjS|o2f||y*u*l6`WX&}T6H?j(IFQvwp+8&<4-f3$+dDl+))k`b_dtR zo#03h2iSu_sbcmBVwfGwQHDK45se!4790`gMp8A@nTvC#G}^+fdokQCy}x@<33uT8 zX1I^|;BoeMa32OU%Pi^?w`zErG*9Z(I-Q-aTb*m2f;>*S-7yS!01OW!f-rTh(d9vv z9^_HJE(GQkbZ2rdoH#Ji+1-6|=sPpt9Loj?in?Iz^YK_BS?u%M+!Q~9l9AM(`j32t zke`cGUUTggkYGFZUDNaU|NBd1d3tj9F1WiVU~E6lJr6qmA~Vz~P|FG6IwKM;1j_RK zVar$bpFeCZdIu9TIm7Kf@jd~)ag=-h^!RV-*n|Pf2f=a`2TVm_6JkOE&WWH~drT>B zR9cRV8l9H<29NH}wdPZK!{ID!cuAE1Ed5o6TrbORoJX8ep&ZBMBqCLSfL=i6N(<$s zco}(0+9vOn4#+2^?`7W>a=)}ieocBq{s4bS-j|NZ$MF~BGwCZ?TPiJ+@5J|zJEeQ% z`>`-nnTr>a`O*UUW_$|~ns5tgl3L^|#Ve(mvJj9f^fVqt($Z+TQ5Psp<|Rq?;t=sm zLXNr?f}>=KQw5=#*VSquElw7Tt)iAz=*G5ESG2Tf>dCZ1H*jjR>7+Y~$RZFuSdf8h z!w6`E;qK3=x^`4C;Cy$0o(T61jy8wEw?v32N!3}>julz1W-;ty_!w3t7^^ZcNkJ^s zk=}>2-SnZ51EB9|(9dqq2D^Xiv@};On8FGXi3e9eFC0`NiVDFt(lj8-O}LOT;UcEG zkkTdi7>$lw=QrI0sg$$fZ_b8L(3$DZbT@HO z3u0;$AXS{^BJ^LTF0s5AWc?yBV61|7ncarcNKu2DO3Rq3ouST595G5 z1Ii7-930u`U{7N)@LD~b8V?@I#u3H5qoxE=Ax5$>a%jIqqsFG#6#J?w$J$r*>{DvR z9;Mbc?4r={v^W(u9P4ANS(7Er>|KzGd&OPiF_wRoeN+5MWFu^am}WNJkfjo_(;GaF4QIy{Z1!N$J2xgY{Zuo1B!1TgCt z%5hQ{jcbHS*c5(%X9$u9hlPpwQsFUSyYO3l1b=~#3*TWSiA#hD!ZKlv@EqnTLM}d6 zj2;SwHpY$wiXq6g2}STscyUB+6^8t)qan!u`%Di{z6A+HhggaY1> z;2x$)!C?aHOTHi@Ms~`PY_2vVmHB3VM}Aj+PkwJcAIU$FkMo_$UIx+mvP!$p@7bNV z{Fi4Fy3NemZDwZcN(l6BVE1X@?lfa(=_i9c#?Y(*-!``T7xUNdMos80Yq@pM>bI7o zs?T@s{PQRK_aDXY9^KTnD>cfx(R$2!!de6*bisGl;NakyQ>UpP9s$%o1*3raVX0Zn zbN!zF0DBpS=5z0J*l-nVy3T~1l#w|Y(f2QG(^r^ZnX`|}cRJ2T`Me7W=UKj)qh{wg zCv+GP>YQwe$AcJ5%c+(}(C?9c#qw>}Y@D?4jaQz0;pVYdjjQeD4)~&<|BxnHCoo_5u|hTp%puwnAJqCLmC1CxJq z$I~C=ja;?e`V(s0-WJVlW+xTRykx>`m802s!rx(Oc$4{jR?JeI>7z6OeOW zkaONZYA!doE!@;5|PBTh4RL1CJ< z=G8>=}8h_H4{8$&$v$_;^qbYQC5di_028{uu!?7)dV*phbZ#0US7h=Q3eHAr)wO z7=?#o#=Uwjl7`O)-IC^83L66=t9Y(ztG3sUe<)G)jFm)BqY4vh| zzTEW}tTY*#;PsA@M`^XOTJYm|ZEUPL{*3(dm~79NW#!-5>Byx0TbmwnP9_Mv*W>pQ zJF=(}o`52uEvwf*aM9)I{=apsUh(zMkq7w&>qGZ#x7|LzqI@LU@#d0y2AP+wudMgc zCwUL7xn)XveApO1dd4l!cl~nSKYpWiUt1fiPZw9ryW!xvLz@&bAu57Ux zuaGK9CD$r-Nj=j2lE5Pl7ZVl>j41j2A+mzzTQtm+c_D%-8Tyz8J#?{pEAGNQ_y;@pcVg(3hV0xTY%ZPKbS#HS4L1Fx6NXeHqED@f_k>VMxTIoo@Y~MEbG)q z8``dZeERZ})awGn2+>7#F_18oiPGVez98n)94{?vnkEmj922n)1Mi*%9)}vXX zCczGn5m8xARs>1pMM2;= z0+bPDNj9Vgh~Em}(0!=Vlq38><)B$XH4Pl95jqKrQBWJ2XAK1>X4*r6OePe}v}Y;uE9- zE}}o8GHbK-n)R{u3B;0%{rU_@SYXxTPWNS>S?8uw?T<#AKXs9?JcZ1X$#(7;VY~E{ z@_Y2Iz~7~8LJzZ#aT|rlq=%Jf(NnAxLSCT+C4@FKL%55*o4Z?*(rC1RgK~sa$W7#O zdA7Wg+#^3gw#dEYUGfK6t0N=jhsfjd>*NjjEh5NR;uV1vd4;ed$3V|=j0A!vf`LiG z0k0?#hV#JPLAOCCf&x+)K#iC7^QPOI=3D4&_--+zu?Nsgbn)O`IEz~pn!1%7u&cBq zg0v?B6v_u+_hfdDsW?0NaG`E-oGni51)NT%3C(ud_BZ<_S6Utcn;~Luqi=V2H?z13 zQMYIR(0^N_&@7Zd5p<_K=JSOE^{_9AUZaegq@%39`>bc!5$bLpG`U@P! zi1Lfr51-9r|6b5P5eC$re?K})TjuSSsDEfpB>c1?4XZ`xt288;l&#~al*7KvaWosXp)1hz%xAchosxM8H=X%K=27_O@q=HG z;pAc_&QzmrbAb>N^SFFpXhL{g-uU9*J3n*IsIBwy-n3oga0@H6~g{xx2GIeo;5^NXshT;*DknHruhGGisM3FfC46`d)< zMa^~{wNiJaFUm)>-n%3JyL^(LUyf=R6V6g*kD2LFGtbo+HN#HW1VZU(AHHcX5mZes zr)UN5*)6ZaC@qa)?J_jS>2gUlilq!V3R-&DA8m+K7W+*1$*9za)!DQ zby;zOD5v*&e6$i#H=-8J9ZbFb=1YAoY`EC^N^uJ8xTo5mIymF;2Y+>W>!Oxv=&BK4 z71hmby8O}_r-J`9{IQ4I*6z3Z?z!voyt<&++`Mbetb1GXiX(YbE*)*XZBz%64WnmN zC+dpkg3DJ!G(2o;nLOr+e#RI)WmYNmb>Yjx*qFi3kZ1U21lsbx75G{*S{v=I4PQ!H zv=;ZJ;fIAsC0W%0aG4NY7|aPC+81s`aWJw!Du%iWP=T`)vk3=%a7IO4Ob-Qx{Kl-m zyBj7BWEwu71R5u+a0Y0OhC$ukj@rl0G?jV$Jb9jPUZ69NYX^mD&+CEf3=ng4qRs2} z_|H~>`PC?R$F9ScmFb_o(=^iKZ)v}C<@~v;xC5CJ4_n8r@2nHnN3+{D^&W9Z-kK$Wd3MQndxXV+I$Nfokpkcw!kgHjd-K_n)9{52hR5cU-DmyU%J2a zp5omj-6Opdj0wKxK%3gB3ZslVUtNG*$}M%Q=2kh@2A?&y`udH1K1sJDG@PdGUc-~t zYczT$Sdg|`hbyfeK!lOOXNF5*Ot_RW;X0<~eu&cpkT40n74Zv*o<&inLZdrcbTUw) zP*{k1f}xpXa;5Z1wDdcW`eqMn%)DSFc$)|GL$iXSbmwC>R|DAI8oz zUE40d@#&}b|8xu3I|l4cLacb0JoK}E#tGx3S*d?idQ98ke3siPzbL(^^@T*ygT~>@ z_-1)>!L!;veqZQy`Pb_E@`vgv;ag41bL4qVKnSm?yV4Ht%icG=tk;f)f=0X5{m|lj zO_0q-tKOkwJz!9!wJ#V>qZ-35=H*ASMZH*QwoMJowt+mmH5~w_y_8uv;kM@(23@^R z6eB?0U8D$16jgY$K~zyNr(jXRmI6}Xh>E7>NQ1+3XqdX7x;H?d9`FRr5>I2mEO5XE zAUHs=+Rns{8C!@Ma1(HaL2m{wGICH&+g(GKev_k3_CH|Y4Wpjk^e#VbcI=kqi|xZP z(MFqCwH>1f+HQZnZi1I|`lUMkdffzPWto6oG6y*bWUj_$_<$COhIj->J&kdOjoN(Q zomFIh{5=Yc`0@qoFL!k!&pQLi;4>zB$JLk2O0vsl{Gg!$p(`pL`{~{XK7m+BS+83M zZ(BDG{qWWmW5@o8;zj@lz~`XleN3NOJ%XSz5^+XcZKNl_iR9$~_WE4dWB6RU+rc<> zH+{CtBZ&?L%~1vwtk8~-dE|2V(4Y_b=wX2qKKBHDBFycPrJ6=@ve+uJVu`cDHOGZr zeTbNv?oMFO9H!TI$cKG2CL}fO3;LJ!`a&Mb(rtRZHqVzjv6Xf^-fP z(GjrM9szcs>n=M;b}MSOEh)U~QqYhWRLLkVO zl`4r)fP#(`42DAMt56j{P@gF?HAPV)Sa}wGzRBT_bHJH7Hk7O~-{j^}hw?vT-<TXzZM`Y7r_2n(5#?S zBR~|~o^x1s3mPNlm&~}auGp*C6!ruX>Phao3CMt$+OK%$*(c?_0BA?w!ra zk=}x+uPT1keatR1 zjz%1=&BwDF-$&IGeD&Zb!hjd7K zOZr;k3Z)Kdh13ftIF=U}PzI32OuIhGGVQ>Lc#ao{j0MP^f&hqdh#& z6<1+!E=~+)pFpmjs@EBB&c?Zzc#SC6dn#2u+RBWuk4 zr%(TO>s1cN3Bnbp?_mG??D|;SuBmp#*es=f=UO@3!|mV>ac^;7XUoJZxL!EHfk`aT zCpLkYArCV_@-H6F`82njHdhs1&M^EYK(Hhl-OrT5zix-`f{dYhd7qkQ(_%W1jyK^; z#Y+QCaW%qLlung8N_$GTls?686`oP|@_W@CrEirUE!COQiqckiPKXjAlusdkmn=kWq$h&YGZHEgjf==(l&88z1PUPpo zxkY)XBM;@lxjn^+M3Sj5nq%PA0I#BCI%$r&C|!|!Gx=$f zbtDUuJxP{HMv|4u!6ZorOa9z2BzSTYompIKI0?BK(#Of}_Ef{UVP;R40NkCol4@~^ zrVx~JN4-?b_-#ew_u0cPd3M;H8-dFayYA4u4VBGL{$R)E6Y`pm~{F$03z z@17+t5J?|F&|A(XvB~kJljCg|atXS|tBL}&5~GBVv0(`GK3x&~Z(vAP5~@!9t7+<4 zG*ZzCIxa3iBimE|0!a2`##u%hy#Rh}CjlstHtTrNl=|^ErC?BV>)vU9Y;qwkcy8{< z)|I=gLXz0LXY7KN|3NY63gDWLfu$NKla1!MFVJ!ETlcqK@;d&4!$yz`O1RBA!#%^- z7TAb4@teerYM=BT{yq1x^qzX0JI;ThIk$?x#s7!@rTCi4EfLr9D@E32N1@`UF7gn; zQ!j)%!d+n;)}zb?QX(tJvIKi5Q%Rl9dBCqb0|e1Dh1%U|1I%Kw>ueLn=jEg;?#^uf zJ4#z`{PjWW+q+R@!;LpS^2m)hZosj75P!Gz`qzKAez|h+*`GZ7Z13i0pQZM$vwlc6 zg1t`A5|5d~N4m$kv5{u$wR(3t+{BL8#=D!s--RWrM~5`VN#VP&2;=8`?dek#r$Zmo zo~}||cO;xnTU03jtUf0WG(bl>kNu1OwDSnf%~XG$rzz-aK`)JTCMQ6ttT<=&I>gsJ zzpx)+>rDU5^^>8CefQ0~=8jd@&R+vv+j^b#2P$t39HDAVUC$i*`ccESy(POV~>S(+2vWrGvQ9%+L zuWzdT@8M&%S$_u`D5{TF-j!vKc^@g;6WbHl zdeD0RJ%LBdeqOetocBk4W;CAmnR$ijLLd4R=y{D8Z7p73jEl`ce!4hRZZGEm)NL(C zmF1|S9F-SDD?_?qxDp|AB16y| za)MxLg3pAH_SN`J_*}mUAL=)2>(YKYi|99tOJM__>+l!a6L!QuJ!ArUJ3^>6G#J7; zmj@Z}ns)e&-ka=rahE1y!PuapSc&)D?TYYWU*HG0Cm<*M&Mb{EAhYCB$0&V*-sTX3UM9f$yo}#)dywD2 z9u#0DK^D{ib+?1@_xgAE*$!w9`B^{6$z5JVA#*q5rO(veWa_FSRmc?#D7ra-5>#-O z1lWY%nC@-#Z1KF{VLLoMp8Gv-c}{pZ#^dxvJe3~e35J&S4v~qL9d&>cqwTfmp20)3 zV0b25FLZumtI+}bSvp_rD_!$l8#q?t zgM0&SaJAqT*KsV^D#b+^ac4|YnxT}OhQD*D8%ViY7ZJeCDc3Nt=jKwMl%@JI!+OI7WHWL&9d>-ll)IDQkm ziMMAZ&86j+rDaATgd>t76E)0)h>!C~LD{RSai)YMxnWX?oK&lrI__ernYj#K#*Guk zOG}w$WGS~yS|%@5S2JtKYHp3RMqaHRVUCdZxc8(Z@_Xu6%vaO-&UM9mLeNO}hwO9L5D4Q5*;V@S>%$5z?|3B)6L#4s)6hpCP zk78=|VCJb^8eK|z3V=m1ReI(G01KOKc)ChKp+`rDV8+HNnt5qO(M|tQlx0zywF9|c z-;W$Se~Y}59)FXyVS z_U1~J-LyhE5S-|2w`-OET&hfU4^=C(dqeX({`#|JO9*6Y;4WyHY@L#>EA8%HOpBF^ zYmnWqi1w0(M zQNkfNH9ep@(xOjuqy@U+>4x*cIh#D#EYHH6Y2k9?@Peiy3Rz;x%X-ZEg-R3h$|KekU#>l7;J-B#A35q zU@*3cEsy}&fQS&@;umMJlQ?l)$8lq4>Hc2#P8!#pI8HLnyrJ7PcGG6>WNF%@GwxTC zPG4I0B}ShAoO>mNm%O}wuk+d|9MJvG{%`01&pEp1K=)%(jHU_$d0V80b!TK&?5E$d zTiptV#u&_ySPHH|Zevx2_=T^2PV@%0&V@|)gkSN96L2fsseS)#vW4IfMiGvk?xUkf zrlvb%;`J^=>%OT4XHpB!c7u4eak(-<8=|IebGV3@A18yGzUy zL&Ixwb+0AQ4952*==rubcOKb<5ceb4ZSY`n=yn7PhUVjLMhNekk+W zk~|MR*xZ>cVs1g0M@NC7?_$IXz4Z& zJqq$ZSr^b#v2?|sN6!XVS5>?4d;f65?ya3w84ocpGq}P0@QT&Nwa|MeM0Z2)CiE4z zmdns*R&cT(8ecK8hqJMXdebbvqRG^28Zoh^baJfMgxlRBAlL6?sAn& zpVqAIId;$erR7hGj2?EI+m|w^)u^m>$bFEevmQS{Td0lJpld&M?Q_$@oR&Hkc~V zLHqW7L|bfNy$F|vZd@38e|{*X#zBT(jl)K7Akft~!tfVAU5n#KUQ(-<9mY z986;h&&X>XWvgpSO>5FCR%I3!6_v|RWtMdu*ms}7=xp+Q`Oqy7v8VLam8+e$m6~HX zJufZ0prkTu%-+1O$HJFnXAISCz5izNHpW?8fFEEgVH9LMjaYUH7REC83qK~o4(TX zL;Ku0?Kzn60CbLkiGQ>lb_h@Hd7=Cjg|8|P9MI?GlK;736`!f%GhKYf@?}@VuY6va ze`UPjiuPmuu`f6)DxAm3$3<6}t1O>D(du&e`G%{k%*A-g=Ry`qU~Z3>UHCg^MR_?b zjDJA#qFc!4MN;@Uf!GJ&!wIqI%Pv>hn-IY#0O%);-2@-_>2gQqLK{GzbUG^-UMv)q z0q}36+N%}Lic$c`$e=s^;DL1L2De)))u^zVRUMIP&XqAEVt#W*Wab)UWkyE)&b75zD@&tfx~PSG znkrHaV0vX9BW22(ep9czQ!W@Y0(#G#`i)UhF%6XUtqP6DM zC+C?`=aZ=m%&JaJWvhqmK~HXf+nUiaYebxaHG|AH`?lY@s>&hNr95X6`uYIDYXnX| zZ89Zursq5rcQbAs#*3jDR~DCI7&<~&7E8~7(wvLNt{m;LOd5=mdSV4z_xt)~P2d@O zI+@@sSu>dvED^KbFa-N$l5tNNl5}P~f#Gb~7Lr7gmACf$%ji(e+ft4DwdC|n)5bTc zlbl!Y9hF|H<|7C-Tq_4bu)P925^<6w(hR-N3;OhclT$6&BM{D@OvfI0rZh)$R1d5c z^}VdzPmQ^C-u9E6q%s`?b$emk&I`Ni3l`HBn1gxaO5FWCM{E0O$n+TB3WaoiF=^%Y zT;^+%LBra;F288N{lhfH3A!xKuTrSqG5$2iA{0yNXim-8w|o0J&vwDERMboRO6GFI z5QYs(poQ7FG8CyRSoS8cUd}gRvy_qx)>v4pOVMLbH0l;j7agvb3oDKmV4{v=kC`jz zWapdf8%zszBW5+IM#8+qczm6)jBWGm1w*sFwz#-y{kz!odP zZ4c~YcCPd=HQmN`eY8CG1Pn&JfC||Nfcx;(vNyZXzaufm`*5p=yV3wz_ZGc@jwO8e z2cDeo)&h#aLMGbqe%5L6z?99qw)=gVbA3nT=Q_E+Nc^2n$1ay-?!58%&aL8C6BBa^ zmkgxE+PzwrxxS*ku9gvG-B*6o= zhhX(2-XMZ2_=ltg6AC)?4{LG6H054${TB||7N8LcWz=LQA!Ssg*KSQ}4l6);tqEPa zB8W{jgBu1cy~zBov#_W)LbrqKs;yLm!=fy<#ysN7SeflwtJkr>$Up#l3X9RHkA-Dv ziz`oF7?4e_sKwn|drkAfOZPL;xC$WAAKOh=H7z*=ukhS@QWJ#^->jC4XELnhw=8iD z93xfI`ftri%a0suW0_R?whVK>3S8dOP=(X+xofvC6z0YgxIkY(M)9Kj#h)BweO@B9=@5Zd_9CM#tECjLK%L28e zkc;EQt5%oqF`(25fZ#FjhUSz|xoQtlL}N4%*)p08XNhDdhE8mk#)S#E(Pp@e2 zm>dAhY4;__`>rJl^7&{~Z9#y81KFPjA_Er>>#O|l#VeTnw{0=T5@^;b4(epN8>-LA z?EtnF_6NewqINDzZ5_!_4iqicDY+xcTLsClw4g}YJkn0INxQWtoD&n_|qymR#kRMU%u_!->ofz%xZM?_g~yghSM zXRd#C&~L6^+F2LV{;s;DrQO_`I6R5Ge7!P>vcx@m>bD2G;P93m?X`JxzTZc?-`K-x zUAG`V+YlyehA{?!3$r0kUME*D+=lOClmSJ}G$#j3toewrzxN?}tWL*x;hx*Y z;gM_&sKYVZ_=Y{2=N-^^8ChBM+KEy;YE{0+&1F!tM~VFW98?NvNJBYV9gPD!*p0Zo z!VGe(pcEq=P$nlBOhf08J%5`^`BPp801@q}KqZ@~kx`@ii&l+TupsEvlYZ*eUnS)@ur zOM7NAN##5zWB<8d+K&l!Y1fLLlyJ1v#DvNG4!c&Mlx0L{3i1kbau!1T{fKt#SiduJ zY_i(dw9VyZGIj{F-(9bJSdYHH%@sdMFmxikd{!}XbS zwc-?$qMrRRVlEK0)QBpWf3oR^S5jL7XULdo+-fEBsl)F#X+~?hD%MStkMtCzN?Q6u zqtxMj{H?`t4L4zb@lRy+km!LRHexOzZf zLgyOF%+40lcQSBimd zhgO2kpYrSPVuN<>#&K!Nl?vdzcS47esv3+?4v&@up;jGSm7k?wStlwR$cPZP^Ep+a zl1oFBV}|3YusCy|Z;h(mLoTrELfUO_s9UgY14hxSl>w55lhAgU%;jr-bpH%?$@_&a zQyYvH$q4fm@oc@@iv+*#G^B&W( z&*8+c4#6gYq8jbs#JdvCVJE6~pUv>poUTJJ9BQQd6ZdRYVbgvq;@K9$aOv>IVymbjEPhF&79nWLY6C2|L|Q&y10Dg+}yDK&N|^u_yM@i%&I)D&o3 z4t{>hu^@|%j?hHv!(3m_qX~m$%HR8GdDa&lZ^mD>zXc<_8!cQ!jL)t+xyu$$uT3Aw z^ucvtG-zUu)`9WdpIE(Wzs(ieaGjhi$t|^c>mE&IbF=%);vnreCyh*>%Oq*A1%4a! zn-O3|aSXxD$dBaD(cPmUX8YdT-}2Ie91}r^cX*Jb?O}&_`*fQe^}*!^v{c0Nb`KY| zwV3BBc7%}Si>n^LuR`N2);1M3$<3@?k1Se?gj+GJ!DEvS2JfpZ=7CdJ`_4G>w#u~ zQ#Mk&uP!;8|HFmA>Sh~ZsBUwV#*9*@rgz>P$=3Lj^^Vq8-RXb@mi6Z;yGV0lTwD!3 z=7hka<&O@u0?OJ!zDiirt==RjE%?=Vc&v<2YkTJ+j8bSR7_bQ}Qd_dwXsY>Q!$fX{ zcCBBklAQTcp~zT0aO4S;PK7&s6ix*!1q>}EY$#syx?-Fi9{k_~F-7NoK2pMt6^gt4B%u9`XkGm^o496mR(J&K99m{rzI3!>(N> za{mUpx}5>a9S^M55$F+_6Ju>mS0shaa=FZ*LPX61#uqLSf%EbgJ&NMsw_eg3RNfwa ztGmT%8Pq9L6Wq@$@Z0-99)0Cua4$3wx|Gd_R!J4qdK9|(0~N+Ph63t9GZS0tu!Mtq zl61CBl&)F=jRN_7gjWItXUZMFj3UX-oE#+%g<~F&j0@x+^yBNbAN`ch8`mfP9UX9; z9$OQtcz601;)@Tht-3`WF6*$)?~yW`yRDD+aoihV-cE}-s@lP~V+OQ~-#sHe(b5W$oTug=Y9Y0Kr+1@d3$0;&h2^ zOMh&3U4rE)kMYV#!iw6cd_5rZUf4J;N*%Lul|-WLqKf9JxVX5^s9TI~de&9Y>`hhV zB&d9~&FXD4__$H6oS~QqMJb}5N@In>>(T7`n0*=+MZ(;iF;KFso`UHa)8l1VYk3-U zP`~5-hFf!~tK%(txQp6!Fob=Op9rr8LZm1`PmoAF6YNOsl#Zvt#wv7KiYha=iT#fG z+IO_LEQm()V+Dj7=c_akhz13pjI(*Ea9M+282L|Bx@JDrZsgygCKD>h)ux(9A<1Yg zg1-g0sXIMFD|8HN<|7Jj$PUzHm@lZ!>WzLPLLBUyfh;dqX!cgPcX2g{m{Ha1YWe;7QUqLFRS_G{HtNnK(wHZD7`6~( z7FWt(2$>XFstmhH@69LxPsjy(TLr0-NiPf{4RQ>;;4m$al80fXzF8$KtX{2*i4vKD zrZ2scfiw0bE}4jDJ!K-_LK?g5x1Q?3Z293d*D_>&knsu$B_)_#hsZv4}VF8-LSUSj12~6)Ye#i|0y_h;T_A+8zP~y0{0mys>31Vo< zkd)@`7WUdcDbaz9y8+`wKA$3N6}7;-ySl)1uSD_T641mR?3O3&Q~sD?8qP!lgztK}jI5*_ zjfla(CuZbqj~}A^fZa%H=vC+47?^srrg1)kqMT`g{n)4 zsC`$Boo3rN2XB(qw72&+8JZYAVO_sA5TYtE;sf9IWTdgn8Y)-j2klNQ@=lOA5e50* zMxCSS(dj65Db}f!2BtJ`N}=1@cQ5+gEiP2J7unmdV}h1YuW$PJpY>z}T+}V{rHLD` z+oZK2XE3gnZzAAX@^5m_K+3@<^(PK9rZ+&tHYJN?ix#~aMGqE|{ujtp6%$2`N1S() zm=lHbh3j!n^ygpCMuVsfbOv8j^uTSZnrD-(+lO3aAN&h}*rmPg2@v5(d7NBA@pfow zg7>SjKUnpf6Ov1WgwxuBLLgV<1>B@wGa$%5*GJdl$3T4rmMz1R|rGV*GW#|pdh2nTY%t^op#0&E5+!|1L? zo&W;(qcaWP+`j}t*Ja2m05K#7tb|loIzAvDP}SYufT&Nj-QPYz)V8_+MyIN;y?_19 z95(lK;t3r7BvD*V6-GC0s>r8%uG%GU#QK_?B(1xQ$S=(*3mk~2(G0STK+D2iEP&mx z9w(%&X$kAT0sa_8dZLxhmdxZ+RSZ00FW!3P1^Eu^ves{OfemDS--JBkZ^{ z1~;Z)>EO4$d7XA2ExTzc4j0p z;>`78`CUsQ;_VSK-50#7iwSo&>YJY$ckkxhYVit;^8s3NPLNOhdu)&dWHU+vu6W-( z{OW^gQW<5KC&8?cmha@GA!pO^aYQ?=TEsZF)iFx>Dfx3%PdRejQGccsDnZ^wDtLTX z^74-#;=+k>CzA!i722_jNFeztg02K(}-FfPN&~sy(w&v zLE#%=(-_6@qh>rkrgtCbRUc;6L>2SE+i$9{VY6^=7uC$UA_#Zta z>m|^i39c2hC453*Qc5Jv4otgJhFB~U~2oToL$`q@$Y4n7CrJf+$uv8qh-zJCSr<18MWN0a;}FJuNh zVI&put|?x}+aJ}}aP{;SAzDPjV`qf02j<`KLj~^d94w}h4Yg}hOzq3fLa>CZf#wxTpPGNPy?=czxMtg1Kh237B8-^;5H7Ro}Z!}CgIfNDn={Jn!6 zT%>I!FqhJc9=VuAP3UDADhg(XMtt>KwqvXxk<*?z0&g0(p_5;OR^?@7VcaXwG3@$d zWF^4Dk6SvQGiY(g(!zF*$}Kk;`h0F9*pxQ!+6A9qFk~H(hzY2I+D#4cRPUE0-)mxr>d`g`1rqnTLWcHUKh4O{Ft2$7~0jGelfqx5RU+ERI08l1^8Q+2FdbfI1Om|F#Gf82D;BM*A(H8ey(N0 zC`7A~84boc74TY2)Z@;^$$Kr)+-mVJk$^v zpQgK+cqg&%w<@%IcY@^@3TXrbki>2S9+U}l0QZ7ca@IiiwgOn%PiKBl_zkwyAw{-` znqXhS(bNiy{wy;*TvHmf)W-!@&I0COT-^HX3V9F;EPUzR6?2e~?~eS`dJR)FFG7H` zJYt8t$TS0`84u`vI%5P3ginrqYWbzUH`x*Tb-%x2 zMIHbS^50c{pXcG`VwtljO1P6hauH5~H{dWeiY4HekVwF6Q*84yc4u5IVjgBBc|kV2 zAZcihv;n4esYzs4@xNK-rk@tl^J7XgEr=Qk+nwi9b;L(fy5nT09_4(6ZVq(V!kFc( zQ0n5%%H%{{080gYgjgckhMF;dA{Ypn5+`=?$KTC+5d5&o<|1&pA9U~39xc$>9?dYC z_t!hw7x?3q#`-=w4OarZaajltN!N`?q<27N2=u(Q+DWy4+? zaFzutd=bll-OQY_49EhH01$%&5;YC=JF)f#D0}U$+Eb4*OzVtmFg1_iZ%9Mo*(PzliFo_m>%cSVd zmky7>q5kn2rzfU+PD&Sr7YY2zcX-=p6YuI4Nr2)KZY(^&e>Q+`C72if`s-an39MfJ zBXGB?>zL|EyyUw;=c}CQQ+v`xHOe_lXz8ct-ia+SHlZtu6Sx2qF}(Q#8B%I_0SSkP zfz{k{3)ojDkfOn-i)s1pDBA6gob4^-O%!YlIO!+jGmj`*MA%4RPmii71@^wA`Esf# z=f24?8Ch9i-_GeNrTln2=<%DlPVP4{-^+;POBfpNV+Uxz=V&P+5oCFjKYDyC;~Vx#hj#$Us*5p`Q}OnR z79R-*BPmR>Lk69i!>wUM0A~V!!+?VY13aABGtAY<%LxsIR|brkck)_d1!@i|+=0YF z64-VjV$eGM30x@Q4B`x21oV+z#e|G&ADs*&VU42P1>P??uOEajlG^g1*0F&8TB4Tg zAMcV`?dlG0N>~nY1})Y7ly|1hkqSYX6n?n3hfA1_!2#@Jt;-K!9uer-jnS2X2h+C% ze2#(f7&zo(+-tCfB8FUgo1=#wrx-xaV=k-j_EpvtAN<+aSb)wh#Oq1$dtDqpLKfYb zKT>y!z|0P!`Lp(PHkXbN{S8=%F#O)nal5xlUBh%D(&98NC00LADtAI~H;Oyy6-X!& z6t`^u5INIBQo)ZcGFMPC!9o+?>=auL-JIiXbp{s`vD{)}z8oO%EC`>7Ak>g@VHzzY zWxZ~}q~2@_aLi%4WEfdM2EY{`Uf`glomy@>#8C33TwMQ~SAU1Cc}R*2 zEZB2sq9>4QZ^Pem9>4L^wC9lNEsWQ|lwiOT!++>}%h8*8mjaFtP1Z(l@8$a>1C733 zIM{Y?(|iHNY{%{FNV>dsdTe5KPj$5rr0uV8^2+Y0s&E&?gClN-(em{7aE98PV*Xua zacSOon;F5aEo(!&dA`5O>CUmj9lfwIKUb5}(ovRR6X2$`zU8%|MpO&?W78zOEGzUU*T-Lo0O7 zSI|VO?U>!MXmE(te%=v4K)qpYnpurx?l3Eot(_!l8d#mGLx?~ou!H5s9oEd`j>(Z- zp{>APb2VcV*{WMWFS3YbNF0}p#9zmTu|S8Gm>)TVqM$DURe>cgWpJsVWqi1F*?njr zIr7ocS)j2IrSsSJ`Pqd>>rvF&PWrjnLP{%U-0T1pR1E7JH&rM&Ow<0Ea zMkI^#_{G&s2Cjio&%6$JwEnPliMGdQbo-=P`3I8fK*iqL8m2XlYF)nZCbR0*>2IVY z{+Agg{l!AxOkz)6oEMNZFco+5MS&gYG?a~xE=ytBJd01=YjrUhpeNG8K_NCP5uej7 z+9m=ncB8|zhXB$u4-2;Hz6s|iLPZ$8&FYLUj;J$5NMh61URS`U(GMoBdjaQVI5wM6 z9uj5b&1t8hflsoFk-nU>l_$%_nuVp>OXR_n8ddP+S}aZZhYXAyDr)p)0kUvndWqPx zgpD&zb&cqJWwC+~vE>m~!Qn@*j?u><_m0IMXp5c~t`jX;_7|^@ZIdlorx?a$I8<4` z@r2DFgZXpNMY{PUzmIfQlmbKT0rCyOBRZoDZ&q1> zpuEs^jz}ou1+W*3L$EsSNit@HNol6V{1APMWX(XqgdXfBbS=>*#1v5IY2Skl8qz;! zkDP?%hi=9xl_3Ub87M2jfultZ6LOoM>Ue-AfvG$lB{nDsi#&)M^2{Ll)GX8`f>5`? z5&%>~46Lxp_Q8p0cbh&i0A2$~=+2Y6+LD}W4>%BiDQ@J>M@iG&jeXnz2>bIhREn9! zH$WQWa6~zf5p*MA6p(pOWO*ZhaKf?=gwbSx*isXr9%ktV`dB^>X~b>|_h-d2fHqqW z0S>mfa|+0tHlzIn#{@%1dOpDKutJO0A(u(40h(n60E9}0yTF2G_&*8bQ3T9Hdqd>N zh?MX1!Xn=@Ermws4+)wj@g&bu^Q%}$1KhDVPIf0^G^l}YrGS!ZfhMZ$ zry2X<*7|z#fFq0s6O^yZBe)|r+o^brYdS6f2INoBvg*%PfYCfeuTh6nLF-01lC_UU zDnyh7j%khSSt5LAOT~FZH7wWbHn)`X^8`L)MY>>tXhQZLl?#vRah@JY;z65bdCqVN z!e6oXhzntaF9iX!TQ)_(3l*5uF9U9}y{lW5Qq?o03pc`RRzN`vLdTK7OCFeYD_j>% zIoaDX=QJvPt--;iM58rVxh54wO`!`vgbp;Q8()W3hg9U%{ds`68}0njAY+OKn3vrf zkJh|w?eRo4d+mimLDkj~fm|lE&;w*?W=3%*HYf-dQW)Kro9{CiT9=-)3l1I|`>hOc z?b}EGA-+%U3T0$=>((R9_FY$)DBHZ`RV0|FMF?@b=8{QE3lq=d?>a9-9&BWu!_6of z3r55_loP8o5xm*Mo344`)^oSSrcwUMhn&9Hx<~&y=k^3q8;Cr#dmu*6v`#53=yq1C zgQU4=@hhBGiak?@@F#%~8HG&TJ25^HZRx?R}EA~EM z$XXTp3%X^Cj;SSdyo(FtMo$YWFeOGjOjyXq1G zo=&r?LbPcm`1GldKv++-)&qWO}69$&eyq2>_%CC;v!X}iSHTnu^65S!9(7X=()kUl~Bvb+mL}zL( z2C6Q#9?aPVTxbvaNHSNrUKoX%irk$4bger&iXXB)+-XvB2`11?!^Lae9A5W50M^mls79}>X#lJ=Mv}Ya~XU=lsh2! zdvc-N_`v$0(HDzB^eoMdedPhvO2zzR2SdL-J40YFTISxMDFluba?LCV{ImH%o- zR9R3KM%cXw7@(kNZhJ!mKH1e88Z*U(r?n@i4Eu50Hs=VQ_%Q_kBpE>X1Xh`gKcGeC zC3UU;3rO*O(f36Zm2C7|f-<ZH#Xboq~lx96Y(f$2>)C(GmFltg>P zs}xPCR|#PbHS0J;wJ4M_NudrzVOrr*=&^h5`xAIok=ixBSggBwH#L`4Dx)dtmqitO zVrN^xnsv0TBw5a!vH$s1ctk!%nYz=-k1sZFfB38KusH1yHs;7zzPV zRz{a6j?EWrX+qj{d()f=>PL%T@#W04tfcFszXhMT7hAsP6X7EnUZOKS{_Z6{#ldMX%4nkwRJT zdPQh-CNsC`61$AgO^>C86Y11?YmX@t54i2 zA?d|3cgtX9sDAOy2pM$JyvS*W!?gkxwwvrnnuEQQB0H1WuaY$4kW$Jr$BHNZu3L16 zR+!m$(Fa9F#3xGNTf&UU$6@P6QLfLsdC902tjs3Nke(RA%lLg4a=jO#$mP2+)YeOt z$X8%~L37R>ruDD)erc$0zTYyD7w_#J?Q9|KkY>1$_r$@kAR!Cn zP{Pzv_5qdO9u zXNa8{qm!$K{3sD9aS{ZS~P6$yBFeyP}KWGm&3GF z%#ii(Lcs!UfOX6YbO6Y>Ba0J@;nPpAuGg&`J`98?BdQQRc0dG2Kw8!AKm^5ayzKP% zJoSri?`h9;MwQEAq?+g3Z3&rCI@B;;ZnSf2=o+E09Hxgu0TeBZKZ%|}TfOc1bF*$? zu+*AD;YX-WU6(2m(pKzNEj#tROve&dqEiAgLvg0yzQYWQrA89H$CzOc+0Vw#R&5Zu z@`jswWv~cRqQT(Fu9J}Lbltf=D~q9~K0~dCc;hsQUy$P&^1Z;+o~XkuJJ}~XPds3z zr$7i`es|zn3gk@Y4yHGs0Sw2ve4AIvjVaDS&7Unf7G-VTNFxepqLjd6+kEQ0K+ju< z@%rI&1vaIOwPS1pwl7dycgL+anZEj*)@IdEzLpkvl+1asU}OJ2>rqvVdG8Ht)jo!E z(C%1@Z&LQniZ05&DAgwm-!}ESQR>|D{G=u@)L>DB_6MXwyWWhKoI_o|-e3l5DA?n% zdEKJ2sw%p>!=71%PynQ8`YynQO#=(w)-f9?;aVOy4Y&5I_-CZlCq7HBn0{Jka$l$O zg5p;V>U}3G(m7EH&}r+JpK8tY!An$Tt{pR))R`Vj#}t|2txGQIHg1gDr{d){^GyV| zkwVilk1szymc}dTn3r!lhFP^CqO{76>{>AO#b>KRS=wS%BR|y2u`^ngzAimX7J6SRAA3jS#tzM6UQwo=JhF$@7J(g2hGc=1m;4wOh zk&g4oHN_h5UnVe8pU6v-NCRa+<{e+tG#V3Zy!L*jSswV6qnMTW&iJv+dGQR-Qm_v$ z!DYhfb=s_e{P%j7^*XX>kjFB~<~(o0Ya0UpX)bRkOv z6Gcaq^wg3@DL&QK{=qpjC>SUyX@g=OE?x--V&AJ;2ZQbBs>>`A7o%ZIN0oxp@5JHN z#>HaqKAz&BGGEEV>RBrF0(6a5T|as+H6t-^Ogk40%$$@#Rfv)rf= zp=LFX(!KmUuxkp7mtqnnAtt34@~z(WHx3wCrt&qf0dd)n)$#n5f@>j9A7H&fC#YY! z5}Eq9W;^tp?BIk&-yiEzPeD~D1%pm2yF*}Q)7VN+U0*ApH;ZG{hlF8Hnr+T_N^eVB znDNhyy0L0F*yisZ$S20^on_vWSow6vdZZXq9Ij1~4`hJD5RSV1+zMzUNK5Qgq|(ua$}e{rmPY>ss%0ojJ0uCa@6Ph9IvZOY!f?ROfEzJQ$3 z0mlI#`e|~zECiW;uvUG*k=v|Y1OK)T)>EkWHYlRU@KSZanx(|70(hv1!MX>YXWC@j zq#NA&?kcu{!L*6d;>5iFH96_V?P!K9PepX@%o$@x#lJXa z9({Z_&4Vl0xtyT^fy#}d<0&$KJf&%`U3QK7ptB1nqlkmye7;tJib%o{#^FRyOh$36 z*aR%)tT`&)xB@l6B*h+=8J2l;_hyB;>R}1<0~n+I>Xm^}TiDZFB6B{$tEN4#NZS^Y zR+~kIhJE?gBe8%>@>jgsSneR3ARaIN(yx8o6zil86X%OkUy2*l+IGIM+wZHz3+Sd%cM!M6x( zk;lk5xT_80=N_kCP>0DXUTDM$V^eX<&loaxjeA$?0t%DC?=-1-P7Wpp^Je~L?q-y5 z5Vfpq>{@AFPGM-%bos7n!Y6%DtSt~TCbgb}_=Y~^nqAI`O22iBClgT!mVlO5v{Mv| zbC9UAUCOGm@oA}~4CQ&Xstv_une;E#Jo02C2+a20bKo;Wok!Gj)`BR3=5sTHwUcOR zNZU=qT@D-aJTRmP!)0J#aBl3yl~2bTSm>?7s}Tr-Eqft@rOgN_nGH^I6>>dR99+`$9 zL`D>j%cvXn%5i#xa8UALsjib{?Pn@k^vXZ0N5Q_C*H6N+d;+10G^iHgpdjt6n*RI# z*G3{~Q+(l?!LC#Kw7iF)7*_S<${jlw$Cfy8>nP`2v~!8jEN{Ms zi7g9MxGN~Ha$T?bkw`=HI~dooMYFN{xf+6nWRc9PE|(uZ4Y9`_L)R&^0VVAE(W}os-!_4fkI_@6I_0-1gqO#1y~(-H7{!H?p`UF3|oa+qVy!P zhms!pb7@q%B8YYv>udrTYdjH6<7t$T7zq5Z6(^B^dpF8cxnv-?Q3=W z8Qw!?ptP@y+|&7a{hPRPyG7`rRLDwUh98&wj{Eg&?s?NHrMNS<{4m%FvJoQZ5Wi!j z>@-sjn3I<~YXhn!34i%i+9r&~((D@EYyoo6=&?|`W2^%fZ)BM;0udjBWPqtARylR7 z3BpTkKC;t(@jbTzLsL-HQLFmfHA0>DatqlT%ng@&<6K1tj^EvG-`A`2mBnLL^?Xc~ z!vmka1~Qjyy#k-Z6rp7w?WG0=xpA_=EjNYRx1Cw)S={>GTIO4IiWOES zIAz@Szy1m|D%%IsOcvB|U9*Xh4qu?5P!1=`qI$3p{-yKROw3GQG8Wc9 z@;}@!9hNVhKlpz*|J?ss&mZ2O_O;4?uaxy`?ms;?HunFKerbH+urYtF>WljawmoR2bJ!>KL7T}|M33S_&3(ynExaH@6mLBS^bCi$9lTI zR{P%?|Mtqi$N%k>|JM0W@1MT;+gJYwAAOHhNgfBJu0|1XRG#sBAd@rU#OxB4%X z|2_-Y|6wol-)PKq|3dt~fB!iOe@p+1{vRv;WAz`jf7$T&i2v;WHPheo{n;}yG5vKE z|LFYf<3Ia9cz+@NLHlccf9(6y{-yP2+`mTup}zS4WhcuYxPKp4=086G|2XC>e@yvH z#>GV|VrJ=JWJfDvspnuMWMp7tXhbVzWNqSLicil-PsjG}4*l2V&&I&U!vh2P_s@+> z`dT`ehmtbp!(@y7>?(jSu*i4-0kR+>K5&Q+#y1E+U7!gOK}^$ZTAo3efO3*LyfEx7TjDw}QuQUi5A4`8qVJmivRAO~SWE_;-8rgT$nDIs0=e0%K7qggP^){>1L!(g;wg=z@`mA!2!qM>ao@lBvVVKu>;1H;H%g>>^4l}G(tFC=9Wob5$$tc+V zy47^R-f}csuLqa=uEz5*WtunNjMbT+Jq1YRrIyn4fnUDv6Jzw!DD(8OzH7-R>C7erOWuz+b-0?@e>Eh zQ|tx7Z3-N}1Hzh<&(m;qzeM}VRpZ9{EN`)2A^rxo@A22gQUmM!2GpY;T{#l7QFSAu z?3j!X;h?gZTz1#wL)*!UPG5_2HTgIpzVKa%^KI0m^r<@_=U@>I=pyYzjova4yd zOYK_oKDWx_G#>7>gjv3 z2HqaG?>A!>s*Rl)nc%6j+NN1f&si2pvO4a}PQfnm7*#KvyF{z@44qGLWz8q7H(L8c z!+WFh_%en3x6_IEMzi-ks?TH}PF;3AB$MJ=o37_CM=egberFB?cqw3{zH8$mnO${eem#>trnCq7 zT#8}M0F)uW`yLkwi!M@M0B1duSFBe+#y2grb?QuMvnkzoY*c}!w3GZMZ3R1WA0U~} z3@k10R6Y90eFYxh7pmM0_PW~E=rl^d==(V0R9ucKYf-2gWEXsHkec^Q_?1;!N~62hHsEnu3Rs*O~i6?V^ zF*BmnrZCyc{wRCqUi5WiC3F8^+Cb^dWU;JuI7{mG$o)vTyJ8`6MR1=+Tai$xf%k`P zC+6zKNR`rjQxe5pdY)^8?06tB%Hg&DO1S5ShI{-%@k{z(=7GpSS4`G~J<})M5Yc$T zVzz_T8Ex!}tI&98gq0Xv(WmN&2p(9@VDf=ngLxh-64R!cXV(szsMUgrC}td#l1{kN zd*z}BZ$i?6qRvJewLZq?WH_v*J9cz^R9^X6j@h?6 zCdIg=zjVEMKG^KXJ$r4(ReLkyHR#pg)#Di#vtJ|KAb&e+L9|duD;-`R;Cg#6uF?%FC$RWA^cGux8Hew-|3f{eT@y;aWo3oZUKP zjt`~4N|Rag^uI8*gRK#>T#aqk$=Ajn&FmzX?K_xJg`MuVaUYY(~g) zo%*V2T>e8?j;Kqf)rra9hwck|p6!qiizHp7*)Ionyy~YEF{d>T@V|<#v+DpBVw20K zOrjBfMJ@<&mOs+%t(u)+Cr`ZZy$)AduNPt*(7P{+=NzJ*Bh4GHy4JrlRzHL;^yIDa z;8pZwo|Ka}!;!C_=s4otJ&!fIpT9WWk6Rbvwjd)~c;nJ8LJzT(^}QE~J%Pp?3!zTebx0BvJ- zj^l*ydjHDs+7-BU^M`c4vpyl7=fyBy<;ci?xwUr8;?#-|jm%PbuaAmUlrTx3RdQh# zoTQDNpkbq&eFZ!1jJ3kO*Z$3cXDS&6J7PDJy-t zwx4$xbm8T2E10x6X>(8N%I$sBG2UHEi0Wl3kwP?}l zydQZCdpjvrc$m?4!?>F(|thVBNDkWf+@k(Ta|5Ezg~ z5Rj7YM(KFQ>$>B*faiUG_p{dfy#L&@7K`s}_C9BSPJQ?JGG`A5&-j$k;M7~=$_)K=6R49}kc zD;_-y8`m~jt5M@mKTSui&@oF2WsZ%gC;!I>tCi3-?Mc=589r z%^xtv6LD%h?NjGSIAwj1n|9EY%|huj{IWGN-p`1?$jQ;MG7~xOpCRu)C5M9|o}C0LmG&H!vFfDeG6g zaprgpet{`xkCEdfnOJG3k*nW4-DIlss=ZC_Axp$`XN=wi1 z52=q_*sEqwKd~jxpzVJmd99DVA89gClxSOI)|~R)?<_BKtVkezqq7@UDaF+b@2U3Y zG2DVrr4t{Fn*7w}+Dz|(`ct{4nj<|w9ldwbUoYw*wbS(C+VV_m%)4lCnsL9mKegC5 zep>Za{(@lQQ6kUb_tE@B+kG>g9^;56!QH$(Yv z4;+rSgvMS)NNzTQyiX3lAM;?;_BjjH>^3;ZoM|?`x=2(rwV0^$C^`%0OiiNMXu|Bo zvshdDG3Z@j_;txS_6+|?W82_&Bro;2v`)K(rnjzkcA96(ChWM%(oHD+AZ5Q%dXP#h zw@G8)v$>zVJ5TjOC4cR`N6YwX@l-}|B{U!B<=KyXti4w6qU{)ky4~Qkvxr`qpXYb_ zm>M{~{o?AWY;2=zgydEZ=a+|hHTGF6I_z~R79ERh8}OzmPZ-?LL?Ba@5u)0$d=mwlcp zyua}QGBqtCBJ^Iv!4tplZs)P92!fA$7PY*MBsrk;y%p`eo+DJ*4Z=q`Cr{$xds2;w z8I{WiflBO8+Nie<?$|qVo1yy;&$`9%@Ew-!>jW?{EZTDPU>K2yb;1;%Z zyBB1d7bh(`hn|P1=(UYJm-ua!2*OmT`FV{nt2j26*qw%=TdJX7Ftphk2*v0gxYenJ zms`m{F7*^F`P>=9!d|(n8ub0J_nxMxkQSY`QCDIc&wDYIP-(jys3vi!8|bO$$lMQ6 z1sG**6V?bl8-VrM3LFDowrj_)9@_S*-%OrPJlMcB9|!4pJd>9)?7gy0^MXMS&${hb zR!9t!Vwl@-dT-tIk`+kRfi#Ye*w_^+7eE)-AVMIB4;EsNYNKlHsi-xtC9_!J9eSEt zWAIK5Lv}F;x53nt?_;$!oj6pKf7Sbi$3wxWx|P&J^(p3r1@;=r4{9|EqO!23;ctkH zV<~B$b=q>urm&gL)v2X~Y#Fs?)3xKkDAQfOYo|PP?^1|fV{_90j}m9+G}<-b(W)UC zKZ{;q60ocXr3)p8KMB6M{0+-Cy<}mCa*5xxpwBcW*eA6;>-mp}oJTze44uEYEgP7R zptEx}jxoz~-PsECvbQ_WRHje%z3sz_)6a#+?>#zy-gwM=N*2>7FWF9gveoI?hWXX{ zw951FVrEY$UUzf$KK7!nOLKjVy~#*7ueZss*Lj^GD}%j!Rr5)+bh0ziey8;lU!p3d z_$@yl+QJOW%8;*nDHnR7_VYnArXTPDybNrNuw3sSQ<$H$1m+Af_`YY*eHIq+^S^~A zl}Iag!K&(%J2+l9WV!FOFwY=AsvH=^*%+iyL?r+H+0qWLWPw$0hJEduvOH}Wo+XE> z#b~D`3=myzBUjhL&jxPfg4NqLSE|u`WOYc=6k4pnKxxmE3e7FwLzie9lQxwITQ}oe zuCBySIkoKh4mhip7}yUsD748FhIF|D0-JIC7dF-sMrck_9<#M9CpwDz)B4dbm+EK= ztEj)^;pvM4BMGQ=joN|-RJ5m>2Bv88*_Wht)wMRPmM=snbraSN+{_JJUgp35*g97c zlP;IcmS4Cjfyfp`2#t^-8bgJ`#G+U}ooO4E)(5jIL1-I)-TDfM)N_Wdc@f)8IqF>u zfQ*?R0-Mh>XrdBE$E2T+RQe#c?`?!eJkl++whLXsaIxIur*sNg2^XJ{dBM6%kr}-k zAhV+J{BZ?uW`#>GOG+SfzS3D$4)3rg-{iX?>Q9KXIG>Bi&7Wg#aWWi5583iR+J}+1 zoI%>=93y;Z*cIVD7G#lrr^cCPtx~Ij{1H5D;6A`c=R8i3%~!H+)@?O0B@p7LSrHSP zYG(aob;Ax0Qx)wMGN;H@y9L+EP^BNwaQ&0R*>VkvndpS-C&dlr+)Tf@GUwIXW`<*R z_c3R;6Kpw>rk{jprF7C!Fvd-eZ_#V9PoX{rhy}Nd(=^SBMQ6OtClJ`8BAW3M!xYk> z^^QJLuiZxdDaAlHflP!0Ml!CdJgkE^kLtD+W`;e}7jdy?OVHWS*(3W~ag?3eKDQCY zy4p^n<;SffEB)YJX}n+dCd%PE_S-oUXwm+8m2)TNa=JO#8KOX3({PzmM!f~P-X~xc z;xL1cgDiH*RH~Wz9WPPhyho{s7Zuik4U zWw(sOvVO&9!vY&iV7B%yG?_I?jonONZ_CzL6@QH%n%fx4Uyz?~cCYew!bJF8bMl)R zMeMsWGOTv4*^g>xzwCWD$8DzL_mWsK`#5D~gh&a}#+Hjt{Ptd@pS@OYXKQFx*KZPD|J&z^L5iTlRjWYMGg!5^$d#@%D2F_OPu& zG!HqY=@Ry@O7?kVZf54bwep`&Nl;w(ne2 zB`9pi<*>4Rs$XI%S^eZ}n8(iOEBYR1B}EyQb3Ci*ot_TKki0dCP%|NdNuc{q>Q9N0 zcb_e*djr~iXQt#-jk9>VV_xi#6Q?%s_!3hGRM6DDz=6P995dOidelUyW+Lm4t&}p$ zzAPoq277<8O=F_U&%aIVUQZibJ$Z-W^|OW&(Z}!G-7LGhI`HL}(@URX&UJ%OF z;OqtXQ3xyHcD#Ydq~8w`UWm6eX73W^hD43gA>`?_hq%f*G@6}?I&71Dzw|lY{h5WG zN&L;x3AeP8{^NOn0Lu&E=|rY&o7ZShwLS*%J!YaziK~lL(pjB{DfoQrsfv(8Z&#XS z*V`{F$8gLMecDsX7$6qlCh}IE_MD!N^_^3?Pe9sxI;SZt?Oe|3F((8W|LVp_Ox_JQ z^cQm-q^Hh|TA3f~auVtvzS+|7>xoXPw7?QB<)PEpBHwh@62t)&>et!;;i39@;gggA zQ8xT%jfRqDyOVRZOjBF_pZqspabE-&@{!~*JqLLGA~;q;at&E$BMTzLp!Bp-6Wr+yq3gU8XJ7E? zV~f;R4x-8Gg3h(|7RTp#_wY@Uosk30tHXK_-#L9@&Q#`p;xS8*YOk}4C6LRJgo3~{ zd2o}rMNC&^2GtdJa~;+7jtx;sBy-uE-LeczGd{0>tzGBkEsu@MwN_N!?R~+YC-D(G z_=|r?4s2>n%hdc$8SyLScT2$$&U#?sWMybgZRfH|WY@+Qwn{t>V@K|`JH6~;c!+z} z%F4zug)S3{_2p=`TTu~N8j#QOs!Mr$8fy^1J9$q;?Na1)qib+ssRXZ*>cG3&ugrpPJG`vT>D=BcYA^Acx;?0zwzoY1y2r_~wH1VH zK9{k~>7v9)Cql~SVBEJwM&9o1ko2j4mpp1?Ehnt``qz&M(OyccZ&-c10#jPaZ5pyh zT9M0OgFxCh6dZe@0&c0L^1D!nB0yQ^)68TY!;ojV5z1ba_Z^pS&KU%iY|>hIf*Cqu zYR(U`2oVREM@!KDk{80S?I@gs7&3H-LvZF~CcdW>H}D*K_KD;XKmG~-C^9uJnr_SD zz}5-H9UqQVgHe65FcYy5VG=nmA9x>T0zb_QYZ*Hf0|;5pJ%UqyMMjJr#zDOLkx$_s zMPXazI|Y!20pv~i`UrAl>@XYB@D&+1b|?%;wVdOEd*p@5mhY56_RZ($;T}0*_~knd zkf}kWQ29M-!s`peM#^{cAUXp`9eDl6Fo7|b7XS{6xjS(FqOhg% zosW=|0p#GAiv*yqV&?s!(0gaS0o{vbr?wpXYEINz_oJ1YR2L-!oH8?3?NzI zNkw7r#&U*{IB+HN3{U#m^=^YS%1K}ToY6281~a*#Y=t^y80G-S8AQs#aR$T_Aa^b4 zl>z?cAUOb9`J4A)^K3@1DJ-;TnP1b{fci;Mb}%Id9; zTf`oSyLTJn)SX2=02NH0btGh;!x233=vK(gu=^QUiLZsg;k#{co>+=FZk1NC zuvLVXAKwOJ^;gE~P7@DrjGT4G9M=R}&}UM5{+?=#VX@){a4gLN@0xqzFL*Y>kf5-U zY@}*#+?>^kgPT1%V|H;&ysZa>`jN_GPkN)ItoBYxUM+?DQ?ZqtxxR$CcrFOu@A}fV zErJxV7b3(A$$EI7#Duu>@ryez$?xn2->PXo<`8;Z1mrQdo2mc8XaJ(3)TJIxyMkTrtQUH&aSIP(tJJ3qT%#6nV@K3=EY}4ocbU6bSl!iiOuo15 z5_W~MauoCT?NWA?vGx`7_v{jPS;sz7KkqFKUBHZOSEn*`jb0##O=jg&t1RONBg6ep z!;Ar4Ev%aAmBrkp+{G^HkTNR+*Pw-`vFK`>rZo`@I2NA?|KwkI71gaV&AcTW93rIQ)5rJ+b+&`#)Ms>v1Muxi(i|Px4&)SjAcw@3^m5-GK-ap zm1nh%#fjxo7cYISN8W39SCY4@7+E+-E217){GkNL?c&CkpL5grG~4z=7kW;iO~-8tm;3d%_Wk0TskRAS z2Muk&&5Av*M;|r0xrk?4CHuP$^);C7{*P1G(6N+oAm8UtHrbK$zEVg= z)DhfN5gxGJmgk9lyWQREtw-1-y}I%7Q15e(XK$pE8f}_SkFZ5&FHWeB8l9#udeOCo zbl;J^y+ejehE2jMrFFwx+7G1bNg`+Fd;dfC9?{WKw!C0VpeYX8a~jc?KYdC1alG!l zYUY?W-6n$G_PTv>OUTE6+I{=MA&CbXp3m8|<+kkh{X;^Jn}X=6zOv1arVWenJ#Gu$ zruI2#cAuu6*51Z*0o31_x{dG|X||kJ-o_fm*17B6Bsnd%eanT4A3fzxpHFtPq8^V6 z;pv0*Te3dw&4$zR+ZdymPCgrHn5Vc_X!!mGde~;Sahp)R{i?}-`lgLgHU0$l=1oAe zZu8`{j177YI-u!~UY@`j_5)9o*l<;2PGG3`1DbwK^V+ag-~D*Yahkc9Pz!ULl~vWJ z>t;&80;di6AyGB47H3F9oL^`YVKLcst|I%5z2=vC?D1$O{uDs$BzzM;3m}@3uY}yq z&SnR>yAsXZHdIj3XdnA01lvAk%}R0@Sw0?-=yuIUKuoFIbIs65T+U{u>AU253}kp; zn}I-LoSWu)z~^`To1Oq~eDE=n-)U5@xyY3rxES*lIxg8Sco|$G9F#^e-XHtc$$K$| zBd^s%{*g5apbfyOmSsTIP0AwrX_Ub!c&W{qQ!a(M?>NJ|UOe^2t7X=Jt;Enb~{2aTHnM8bj!3HFpFSU*xQ_y6aWG zjwUK`R|>JnkCW)Pv~Lv#k)DBn?9Oq@hmt6avsWBXbLRKuc#n1&&)R)MV<`|cTk{35 zUW_zh?^=S#o}8C$Ijh@FG#F|=Lw&SPT1e+)%c{qoT4U{gm_g_$b7gR2`a)v=zIXst zpeMeDck1e!SCO+~MK)8f3MLMYGvR^{D_*SM<7=azmH+tRVaWp$&$a6IR_ptV{p>po z1}TKHp{A{&vy49vHH%a3a|Efj=FfszPQwq?Jm~R4@!LqrULAlQrUv)5#m!olQ1AQ* z*=jwQy@y=JK(1n_u!kuUis$hS+uRaoITI>-d%=>L7!k&q)kPYXnyBfg;SBnC@vZXB zU5$kkys{!utwDv5P2k}U zh<#0c^y1xWWuka1McpUFL509AL`hhP-E6SCrS6^yOv8xVyT2Y?7o9gdn=e)#)UuO2Y`|2-GG<4{M_6C8agq~(ryot=>4vjkQ&Zmd14eeStM6WQVc=;*Ir ziaTx^m0^;T-Mjydk+ov$iN|yvN@iy9(R4V; zF$oD@AA|3_4KZ;Fe?cvtIwX^9eB2Q|G&DNt|Fte^EavIi2z}bzu|Y&G@V++bR_S*? zD|Sul#GY@A6_VZk?71dmSycM;&TMcBbL7ODS5Km#!wFv{@wPvZP&fD1}TvtKMA#L7`lv)S&W z^~RQlo*qq+MtkfBYAA1duFSiV&X=}R70!6vv=thrc_dDu4(eRlF2}yh;V4%XFO!?B z<#`Luod1=$v*ZJABeU$OPuc=#rluV3E}K5~QIH~RN@wq*p#{?eL=srQ-ciTEaTN@h zZx}NzqySLS@=)oZ&L1knx)Nip$4kw8J;1e=L}v)Jl$MS=;~Ju*pl=rb1FnyHXS79& zt!&0cYDEFbe*R){_1n5L-;8b^aP_}b!Pfa`+hhBPRORDSt~icOL5J0j#mxEduEL{u zEnKhEL{s2l;Yfj8OlvVDGH^c##t1nElaI1-e0UL9BO*-i;aelH|27nzGvNmV2R@Ep zRGqV7Sf*k6n+*Mu$@jYX>B8wMxg81pO&Ge;dWFj+RmfdF5dDt1oq+8c%FkiV$}{JO;WFX4xD7&il2yJ$ zs0SX!7BM^G$*ZR0UgcSJOdp1=f^Eo3%(^Q#1zx9Zy3R;*dT5H8>dF;aj~&-|+qU_YfLfm6ggTi-P*^yR zNU}H6B|Yx!@=4feDH(6A2TX0*2+x+Yw?RUmEWse zmr~{P=met~L4gt5PFZkx^{5Egwnl%ZaVS9SC1u`I=@ON$AgV2)h7)+CO*~0*@3%|hp;a|R^xjZRZT<~u|ye?4N zgAmY942eXfjR=YYMX9XU4dSIs4`Mq!C^!5d7zkpT`JmTytXeJw}6 z&Q>_77tAsRWbxnX{*a=7_u*g@&X!Z)*T=X0Y|{qu(1ectf09N!1y;659X&NoI+jg` zQ)Dhp)v-vH*h*!eDb90^x$ke*ET!xv+v~=%3e9bQQE@cS*%UyA^2(zRa%-snP|^N@*?OS0Bbr#W%}JHuvX6atMggP?l70B* zJfyEhukU3q?nqNv~}y#+oPkJMv8 z;&^RH_CZ&`6N>UAdqG#wkt|YABHz;&d6#*zpKM!s&Jjc!u}=2R*SPfMJ90L*jn2K) zj{!#LN|i$+%BX)lHd?O+J`icg8J!4m>sPn>Wu@)@sZXA*zFmv%Y5nb|KSjKF-aCzA zLWI4rzx~>Ha$0*ww!3ay`Uuyzprvd6kaj)G&h5K=NU}~7dRZ! zyfQX#6OmFI|5lf;0yl1Fges`pcA}yYt35*Wp|hi|dz^i-^~|Aw=C@?+_1LIJ@0I2K z>~ojR`D_lV?>j@LeO2MyreFE+@N+nlEhdM$`5Wf8r-! zuxW{FM@|-KHy4i7K|8dlrR|zpt0JT34@}DV4{MU=1^K>U-fDP>NSuEl`PKsyOPauw zdVdTsaA3&9>0J%_QfBkP``HZia5wkCjiz~DQrV4LQiZdWRRMrKy9wckiF0w!!*%Ik zDQjLj;XjsF^XyKutS5&;*G2}6A;{#Vz7nx@eA?=|=FqMYK=t0b(`=i`c&L4AsC{v! zMf_e+gY#j=Q1JA7eEYm-^PXEd+a3Gqa}Nb=me9imOAzfV^k`L-EeoFjQ&xBp70%(m zz;Em%bIeuT#J~5moSP}Q#YQ71cfuUm40oNhD#O2EoY;8!^7U0HP*2x)0~f+6Hq-WS zp|1R*GE{}Tv!$G*g0{d+d#P!-Dr1!iE~{+wfJC6JZCe{vc3HQwy1ELodU2F%zW8P~ zT1WM{jj<5gsRvmv@%_D+DwX|%mR#QyjtNQ4;U%6n-+;l}l#hpJu-DsH@1md7_=84u zrQu;mqjtGx={Z$`UP$?t`t4JJcSVKmUT=d-`gA56FPL?{Os=C(Z1mo9nH4cFt*w>V zasMhd#mrJ9P}*E9`j7`03Mj>R#`l5tpy6 z+I)+5$-zbUWyf+qWIB%eWR0Q|K3V(tM!>?#WJSFN*JOVaToo~Kyo}lYDf`v_)Y#9% zelro-h{lq~r7EMu)-&goC-Z{dcUsQYV0+~k)}C=*4$>!2_$XT?EKl~Ic!BP(BdSF_ z(2XW%)`JbnHYMU`Lfe#C8%@Fm&SFo#5T0xAKW$n#DULfveMN&mbxTsn0Tx0bU4828 zg9c|pjDMK&+_Pb)cy)fqX;FvI*73Rhl=Le-nEu{Awmb*iFAX)Rr#~sui?l1Q9cy;- z!29@dE5+CSS=mjzXTMG#3ErD|Lx6F?Pf1L+ z<^hR}_#W7N(~jS;((%V*T%N$S*=M75o7hw2`!aaAhfW7WxR8yB_PB6qD@zVLFSi2O zr1c<5a#*Ri*&HeR2<_`3nT`!`uSs#6GiHH)-|O1xG-XIj8NYBWxlQ36DZd#4pyA5X z(C@CVu{SW+`4)r91O${D!hhk0lpQb2F+F^CEV)*v$z^{?O1q@`Fl&`hv|Tj~AL}PP zSQ|0mA6>nBaq|IF{{<{r`vGi~vXAe)B>M1Ka!l_R;|{Gi>_yKT+2njx-oKx@bwB6H z9p-*#Kb;F1g)G#ioG+GA+HYxo`fLG9e=ve>x4G>X&iP%_@NL2xgOsQD=kfMf?K1iz z&)}8G%N!(I9dBmj1r+sndXtXn9O$}8Gk&E7?=n8ut7V;fi3c2KYrt7|?Vatac@(d! zSr3?z_5c1u6R_y5zk|cPSfs`u8j`femLj6uD;VlL-?5$3UGr@=8TL!e%rKTi9DIsS zqU*<;#%C6*)aBbj!CpIn4F z^2RT$kaQ@&xt|pW=&qK1>%X&{wQHqj5Gl`K& z+Z_=^LyyXiV?`dnxc9Z0>!ql0hegu>pXfbej7@VUMFtCEX9{XfiV^eMhLoB~Xq>x5 zIK@dak&;mquLU=sJsKXUl$Q*(njFOG$LuAej^b}AKn6c>noyp7BlTWn<2~D3hDGGt zgy4_(=gJF_GMkKqs!`=7WwHBfef#zq=vZG~oBJse7j_v!l6!vLexBPOVHEZ%b94^E zJX8CGYKfEze~yH`%RC!$nmx*H5f_xD<}{JOU^lQ1)$K*AJIHjxU7EkKA8>5&_I#cE z_F8s>gdCSN|40XAvBGAst2$#;wb^ito7fRCImhF#gqoJm28aC_l{pa}_TgV^*!0Cr z%q4y2T*#)mnJG$tb!Oli+!S=B_9po#j*k!PJnQo!T>wyJKOV8n^)=PCKKGh z#{HUCR#uv#Cpm9O_?u{q7zF0D4>sq((iyuyFoqmq+D^zlESY%!;!AX4eh4e38VwEQ zSB1~f@gxc_$gR-5Z7TFEgoh%<6!)>;z8z8qZIHGGFf0e&lFgu@6T!T(TnfsJf0zT1 zCHkSv$o#07-6fKkyT#<84gPs1#!BGB%=cNkP5r`}Le_@PX$%1?)r4V7YLGB_SXcPSTmhm+GnNK*f_+JvW z%B88kNR-J*U|Ps{q>y8TR);pzBGoyh_)wI%F4%asG;fI>>wD~TP1M&LrQO>OW|_kp zrBsu~i^Rc@*bRtR=<$gkl2tpAk3PZ@2rj*Fq}h5!dvTH8J-dQGC13hBAxPZ={&qJJ zBxEARcq+^Q&+&RL>-v>rov^2Mx8mY1ElqgTABS-Md4L9WbnlNtI3URHBV+$OkE7&j zW6U9K?4WO?@1W12=xE^ZTc9Q__0MBDT-=;oe?5o8FXUpQZ)j=kKx1HRYHlq+w^i3j zM`LazK&J|p21?tA7@L_tce68Abdymsbh9*s8PN#|^1JZ5z-{2DYG_>GR@U~sE&_D= zD0hr`QP;o49CS2)s5n>(&~dSY*m!^-IzcRcJ0lZb1yS*T7@^(?(3v?n*zj_2I6FJD zJ9Duk>`Xa8Fc^#j$jQOU$%fKkvv;+2(05_8wx|DR38KdKhIZyQ4(14Jn%^br8z3AV z1nB5!{!y;YU&^(%XaB=7c0&Z51N8?E5IYyg?}AX*ymEF3BS%AHJ3(o4Lpy{$!o=Zo zA&n}+&WOeYVMp^XA?olFnE$u&zYX{~epmb#NB#l#7s<7*85#bI*v8S$>JMHcLk?pr zW4N)kgFVVS&>!9z8S*-qJ6IVD{?TMltsMTmurmLR$ZMrPOuUukQWH! z{o^e!5XjGQN%Id&X@rrviR=Hw@-LcyHr!uE{{L_;pd65v{(o*3IQ*Y2BQ4DY({=CI3+?|F^mR+g$%q3;ajQ{~cZbZLa^Q z1^y%D|BkNzthxTY?W49bsF?a+dm+Jp@1;l+#VICyQ0Dy zrQabxjf0(|@$Vhlzc+ZlGd28egQuooY{H>v?q*B_f^c)FYSMscP+1_fX*d)R2nW;~ zAdLdY3u_YuD!Jzu`XkwwlI4qU)ep0iW1@AM}*zTLb*Rai=<|z}%yUH^~MPUcm1vfX{ zCgK7RouWS!Cwf6lL}dHy?jz}m)lZE@f-Oh$3`-2MGQA+2HDzWz76@5j&)riJ<;ODs z|B?5Mk2UClc#@x~NpEs|{2YrBtEU|>EUKwe{%j^6qmk%M-21tg%co3to!X`uSVJ7{ zb<%Mm<~*p;O7X{MPdET0+0rEd!jt3BwP!k%3|13u9FP>FW(t3BWHkt_Y@0Zxnfo+9 zsq9$6_u?H|UK8dwIW%?~e{`vwmm+fLuV$ErS_sU1#G!X}pm@?YsLzU_v-M+nVLZ7f z+*wy^F@(VjXUm48$FccOvrP)uo2hs9V-6<}WZpNSlN!F) zj!73gV-s8~AZkE?QNRB2;zs3J0fV`~G{67!j~57)cjfns#`<3}5CoM5=8}w)8+=6u zhM>}?{9O;i4Mn9Ixg-N~UDf0Hok8W29*p~nFFYuf%X&OOFlxU2-Ij;*DhJOWIZ-a@ zfqAZQ@IZi9WjqknEWKn4<+{=?P$2ZGj1zo?1Imrc)N-jj)V}6Q9Z(qXiVOyXUhxn1 zI|I(8@?enPd5r$%GYAakK|M~oB;x^I)#JIs1_Hx?S8ZWDsBAocFAu`Wb*V2oxuIOY zGvWMI4<$oAs=6ZM0blZk6O4MKbxFp}%>x2osskkhgD$lxH<%OEnSZYXC4*h|j~mPd zy4)_@JTTN#t-srXxuDmKAs~<&m7nVJJVIsNxhex+BSYo8x?+pUigiT>y+(%0e05n5 zm9^-q43#_UirzJIA2pAz>RrPDzJ}v>-mWWkT*HCt->Z7paG?6_iXJL8(N)bYdC&qDZ9*uS`)9zuHoRhhJ)uC4%GO&QXbDW96Z->pw_Ufw%2g*T*HA{ zBd*$B!+~1IujoOq;ecMl0lkI;dJP9^UAtPxH5|}uI8f{ERoiPgVApWKuHk@P!vVX7 z19lAu>>3W(H5{;OIAGUsz^-zDQ1`*hydczibyaqi0|dOv0YcqpuG(JZ00FOZfPhyy zP|3lrDeoE%&@~*tbNyYKZy?Y$9H47BK-X}9uHgV(!-0w!uGV`E2kJg^MUV3u4$f;h ze&@Ek%!axTUX@+L!Fde_=QSLh*KnZjp;zm;hJ))G4%GefiY?bQ9KZ84US{LEh65FG zUe&vXgX41Be`YdBDG>{Y$19H{W< z?|NWvAS!~n6oYUBVJNo0#Zq7xDjVPBSOo@xp!)K%9t_nVmt>qE)EahK20^V6f0IEt zAt0_xu^vjsjhb(l^&qIV^Rf(v8ZVb*JgCj>RoN9=ZXnlH87iUSrC1Nb%?11Go&@#Z zA9E{XJ6tSO7Q=sRrNRH7@1OtNA?w>Y{JGtNaC3vfFkCD~Mlo4&T&#cY!GO3}|G#+0 gA!ldoMDwRp9KWA2C_2DVZ-2Mj7001K&_5mjUq^VUkN^Mx literal 0 HcmV?d00001 From ab5f0715e2ec4aa6fdfe9169c550c34e8fdb5955 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Mon, 29 Jun 2020 14:11:56 -0600 Subject: [PATCH 119/136] SlD: remove stale TODO.txt --- modules/soildyn/src/TODO.txt | 75 ------------------------------------ 1 file changed, 75 deletions(-) delete mode 100644 modules/soildyn/src/TODO.txt diff --git a/modules/soildyn/src/TODO.txt b/modules/soildyn/src/TODO.txt deleted file mode 100644 index e0d46a7c0..000000000 --- a/modules/soildyn/src/TODO.txt +++ /dev/null @@ -1,75 +0,0 @@ -2020.02.25 - -To Do -===== - -DRIVER ------- - -Output file - - -MODULE ------- - -summary file - - outputs, and what points they correspond to - - which mesh point the point links to - - stiffness matrix at each point - - mudline passed in (based on water depth from HD?) - - Stiffness matrix (and notes) - -Input file changes - -runmode - - model 1 includes this (given in Props(1,1) at init) - - model 2 does not include this???? - - model 3 does not include this???? - -Mesh nodes connection to the glue code / SubDyn - -pass in mudline depth - -Check against the SubDyn mesh. Can I pass that in??? - - -OUTSTANDING QUESTIONS ---------------------- -Since we have StVar, can we do correction steps by saving the old copy, and replacing it on corrections? - - -GLUE CODE ---------- - -everything - - - - -NOTES: --------- -- confirmed that stiffmatrix does not take into account the displacement -- confirmed we need different copies of dll's if multiple used - - - -========================================================================== -FROM the Email/meetings - -- Input file - - Remove “DLL_ProcName” line - - Reference system – define relative to global – but do some error checking on this - - Should pass in water depth – to create warning if the points are not defined below the mudline (-z value) - - Change to capital (X,Y,Z) - x Include DLL name for each point, and ensure they are unique. - - Comments on “Model used in DLL” - - Include units of stiffness and damping matrix. - - Include ability to enter multiple stiffness/damping matrices for a jacket. -- Error handling for the input files vs model being used. - --> no good method known as yet. -- Is there cross-talk between DLL calls at multiple points? Need to create a different DLL for each call. -- Verification approach – ideas? - - Connect with Erin to do some spot checking. -- Implement the ability to input a time-varying force at the tower top - - From 8cfb3201744f99143bcbe799401f233598f8248d Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 18 Aug 2020 13:14:23 -0600 Subject: [PATCH 120/136] SlD: [BugFix] bug in the FindClosestNodes routine --- modules/subdyn/src/SD_FEM.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/subdyn/src/SD_FEM.f90 b/modules/subdyn/src/SD_FEM.f90 index 26819443f..cfba064ca 100644 --- a/modules/subdyn/src/SD_FEM.f90 +++ b/modules/subdyn/src/SD_FEM.f90 @@ -1188,7 +1188,7 @@ SUBROUTINE FindClosestNodes(Point, Nodes, iNode, Dist) do i = 1, size(Nodes,1) loc_dist = sqrt((Point(1) - Nodes(i,2))**2 + (Point(2) - Nodes(i,3))**2+ (Point(3) - Nodes(i,4))**2) if (loc_dist Date: Wed, 19 Aug 2020 10:30:07 -0600 Subject: [PATCH 121/136] SoilDyn: update regression test .fst files --- reg_tests/r-test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reg_tests/r-test b/reg_tests/r-test index 020c8d29f..599925a9d 160000 --- a/reg_tests/r-test +++ b/reg_tests/r-test @@ -1 +1 @@ -Subproject commit 020c8d29f30153da4fe35fed6d8a1e8be286052d +Subproject commit 599925a9dae79dc5ac269472ddc4ba22c042ffc5 From 02c1e680c430e0b45f2c8db53a0c5ddf35cf4bad Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 19 Aug 2020 11:11:10 -0600 Subject: [PATCH 122/136] SoilDyn: Update .fst regression test files --- reg_tests/r-test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reg_tests/r-test b/reg_tests/r-test index 599925a9d..010f0254e 160000 --- a/reg_tests/r-test +++ b/reg_tests/r-test @@ -1 +1 @@ -Subproject commit 599925a9dae79dc5ac269472ddc4ba22c042ffc5 +Subproject commit 010f0254e70f0e1413b43ec4181271074baed39c From 91bfa824ccf9fb01f3f96e7b42a9591524a68658 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 22 Sep 2020 12:10:58 -0600 Subject: [PATCH 123/136] SoilDyn: add message that damping matrix in CalcOption 1 not supported, and REDWIN DLL /= 2 not supported --- modules/soildyn/src/SoilDyn_IO.f90 | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/modules/soildyn/src/SoilDyn_IO.f90 b/modules/soildyn/src/SoilDyn_IO.f90 index 396f9b9a5..4dcf966ce 100644 --- a/modules/soildyn/src/SoilDyn_IO.f90 +++ b/modules/soildyn/src/SoilDyn_IO.f90 @@ -493,7 +493,10 @@ SUBROUTINE SlD_ValidateInput( InitInp, InputFileData, ErrStat, ErrMsg ) subroutine ValidateStiffnessMatrix() call CheckWtrDepth( InputFileData%SD_locations, 'SD locations', ErrStat2, ErrMsg2) call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) - ! Placeholder + ! Notify user that damping does not yet work + if (maxval(abs(InputFileData%Damping)) > epsilon(1.0_ReKi)) then + call SetErrStat( ErrID_Severe, 'Damping matrix not supported yet with CalcOption==1 in SoilDyn. Ignoring values entered.', ErrStat, ErrMsg, RoutineName) + endif end subroutine ValidateStiffnessMatrix subroutine ValidatePYcurves() @@ -511,12 +514,16 @@ subroutine ValidateDLL() call CheckIOS ( IOS, "", 'DLL_model', NumType, ErrStat2, ErrMsg2 ) call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) if ( ErrStat >= AbortErrLev ) return - if ( InputFileData%DLL_model > 3 .or. InputFileData%DLL_model < 1 ) then + if ( InputFileData%DLL_model > 3_IntKi .or. InputFileData%DLL_model < 1_IntKi ) then call SetErrStat( ErrID_Fatal,' DLL_Model must be 1, 2, or 3', ErrStat,ErrMsg,RoutineName) - if ( ErrStat >= AbortErrLev ) return + endif + ! Disable option 1 and 3 + if ( InputFileData%DLL_model /= 2_IntKi ) then + call SetErrStat( ErrID_Fatal,' Only DLL_Model 2 is currently supported and validated.', ErrStat,ErrMsg,RoutineName) + return endif InputFileData%DLL_OnlyStiff = .false. - if (LEN_TRIM(InputFileData%DLL_modelChr) > 1 ) then + if (LEN_TRIM(InputFileData%DLL_modelChr) > 1_IntKi ) then if ( InputFileData%DLL_modelChr(2:2) == 'S' ) then InputFileData%DLL_OnlyStiff = .true. call SetErrStat( ErrID_Info, ' Using only the stiffness matrices from the REDWIN DLL', ErrStat,ErrMsg,RoutineName ) From 4a4d5ff9aefc9413f234e489ea0663034838064a Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 23 Sep 2020 16:30:58 -0600 Subject: [PATCH 124/136] SlD: missing source file in SubDyn VS project --- vs-build/FASTlib/FASTlib.vfproj | 1 + 1 file changed, 1 insertion(+) diff --git a/vs-build/FASTlib/FASTlib.vfproj b/vs-build/FASTlib/FASTlib.vfproj index 1b711d418..ca4f151cd 100644 --- a/vs-build/FASTlib/FASTlib.vfproj +++ b/vs-build/FASTlib/FASTlib.vfproj @@ -2167,6 +2167,7 @@ + From bd9fafa6eb70ad8165ca8baeb2b7759d7af6d1a0 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Thu, 8 Oct 2020 15:20:48 -0600 Subject: [PATCH 125/136] OpenFAST_Algorithm: fix error in AdvanceStates description, and updeate SlD --- .../OpenFAST_Algorithms.pdf | Bin 228169 -> 228301 bytes .../OpenFAST_Algorithms.tex | 23 ++++-------------- 2 files changed, 5 insertions(+), 18 deletions(-) diff --git a/docs/OtherSupporting/OpenFAST_Algorithms/OpenFAST_Algorithms.pdf b/docs/OtherSupporting/OpenFAST_Algorithms/OpenFAST_Algorithms.pdf index 6ab08da7277c1d439e423f835739c881d690bfac..824b1e60a9ba36ced5d5bceed8b86815ff9ddf57 100644 GIT binary patch delta 19471 zcmV(;K-<5`_6^PV4Ui-OGM6#M0x6MB4}Zhq=iVG7#wI|UE^MHOZV!s1w8F|#S8>vI zfBg<6*@4HHHa`Z8eeDmgU$g|bt?E*9d%Oz;VR(DJa&5dCOG)FJl>Xv;<=Eaw) z&bMDT_tO~)ndD`Az5X_xNt0ydVhTbh^X00&|0t)QS639-FaYkgmLak>+&N$~>3_KM z&_+J1$}-RBD++T}m49#2GJMJ;msZoO$dxkftJmvobwhYI$?En4_glEyL<%WdK%}WC zj>r9nn><>1?>@2W7C|Xg-)+tS0|VfC>5oCXM6*nR14s1-9NyK7AJK zmY!WPK{Pw|y?JvJ-fjqE1zS%3oScRH96(FsxS**hNB6Yt@^f=jXODRrrgDmo=()4@ zRp615sPzl*M7&lUH08Pr*Sz*V-HdQ!6<4IhC~mCgQqn|i;HcAXqg99F34hvC^a`Uu zrMaV8>K(=QYaX=bRC3;qXZ=7*o6?W%>8QX;4$zKDQZ0>)N*c=rApL$eEca|w;6n_} zl%eugT`61?>HW4k|5*;FC0wYQ{wE>Nk)=m&gJcen&qtCFkBLrl6up?FNvZ=U54Cxg zrJGS6G?luru{_YMl%|Wv4u5uxhIq(8L(tDDWMIK_V~|HmRbEcl`a`)gBD(?B85Sd6qF)rN1W_Zw5%V;_=rbE@_%X61E@h5j%eD| zN!N=kA8tmu5Y)f8NM%qT6XZ(mn6up~vK(U~9y8d5$6m~!488?OM2R&cF`frB&*iO(NW^2g8HaocG0X5+*`AxM{9Da)6D z_oT!l@66*6`I$rz4}a-+H~;YF%`g|na23~GkYOpWnrsPS_n_ZKXov9eY7r6GeHntnB$1 ztrpt4MYbEBB2d3ayFxDfE?FZ^8V?z&1F#p8_Ot?NV)k%Bxqq(L>7vMfT$W*>-DdS& zx*pyvA#FUhjuQzPq>@xONINwJPoo&&B_1_6khcS

    iy3;Er1J%aZo#x(d8}|CrMb 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 delta 19379 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 diff --git a/docs/OtherSupporting/OpenFAST_Algorithms/OpenFAST_Algorithms.tex b/docs/OtherSupporting/OpenFAST_Algorithms/OpenFAST_Algorithms.tex index 2322b7081..635b91864 100644 --- a/docs/OtherSupporting/OpenFAST_Algorithms/OpenFAST_Algorithms.tex +++ b/docs/OtherSupporting/OpenFAST_Algorithms/OpenFAST_Algorithms.tex @@ -352,38 +352,25 @@ \section{Solve Option 2 Improvements} \State $\Call{AD\_UpdateStates}{\mathit{p\_AD},\mathit{u\_AD},\mathit{x\_AD},\mathit{xd\_AD},\mathit{z\_AD}}$ \State $\Call{SrvD\_UpdateStates}{\mathit{p\_SrvD},\mathit{u\_SrvD},\mathit{x\_SrvD},\mathit{xd\_SrvD},\mathit{z\_SrvD}}$ \State -% \begin Transfer_ED_to_HD_SD_BD_Mooring -% \State $\mathit{u\_ED}($not platform reference point$) \gets \Call{TransferOutputsToInputs}{y\_SrvD,y\_AD}$ %\Comment{sets all but platform reference point inputs} - -% \State $\mathit{u\_BD} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ % only if not BD_Solve_Option1 - \State $\mathit{u\_HD} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ - \State $\mathit{u\_SD} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ - \State $\mathit{u\_ExtPtfm} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ - \State $\mathit{u\_MAP} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ - \State $\mathit{u\_FEAM} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ - \State $\mathit{u\_MD} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ - \State $\mathit{u\_Orca} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ -% \end Transfer_ED_to_HD_SD_BD_Mooring +\State $\mathit{u\_SD} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ +\State $\Call{SD\_UpdateStates}{\mathit{p\_SD},\mathit{u\_SD},\mathit{x\_SD},\mathit{xd\_SD},\mathit{z\_SD}}$ \State - \State $\Call{SD\_UpdateStates}{\mathit{p\_SD},\mathit{u\_SD},\mathit{x\_SD},\mathit{xd\_SD},\mathit{z\_SD}}$ +\If{CompSoil} \State $\mathit{y\_SD} \gets \Call{SD\_CalcOutput}{\mathit{p\_SD},\mathit{u\_SD},\mathit{x\_SD},\mathit{xd\_SD},\mathit{z\_SD}}$ \State $\mathit{u\_SlD} \gets \Call{TransferMeshPosition}{\mathit{y\_SD}}$ \State $\Call{SlD\_UpdateStates}{\mathit{p\_SlD},\mathit{u\_SlD},\mathit{x\_SlD},\mathit{xd\_SlD},\mathit{z\_SlD}}$ - -%%%% - +\EndIf \State - \State All other modules (used in Solve Option 1) advance their states \EndProcedure \end{algorithmic} +Note that SoilDyn is very sensitive to the motion of SubDyn, thus calculations of SubDyn are performed before the SoilDyn extrapolation. Note that AeroDyn and ServoDyn outputs get calculated inside the ${CalcOutputs\_And\_SolveForInputs}$ routine. ElastoDyn, BeamDyn, and InflowWind outputs do not get recalculated in ${CalcOutputs\_And\_SolveForInputs}$ except for the first time the routine is called (because CalcOutput is called before UpdateStates at time 0). - \section {Linearization} \subsection{Loads Transfer} The loads transfer can be broken down into four components, all of which are used in the Line2-to-Line2 loads transfer: From 7618542824b2363924b3f56815b22a080e1559d1 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 9 Mar 2022 08:43:14 -0700 Subject: [PATCH 126/136] SlD: fix typos in driver _Types.f90 file --- modules/soildyn/src/driver/SoilDyn_Driver_Types.f90 | 5 ----- 1 file changed, 5 deletions(-) diff --git a/modules/soildyn/src/driver/SoilDyn_Driver_Types.f90 b/modules/soildyn/src/driver/SoilDyn_Driver_Types.f90 index c9ffd38e5..fe145586c 100644 --- a/modules/soildyn/src/driver/SoilDyn_Driver_Types.f90 +++ b/modules/soildyn/src/driver/SoilDyn_Driver_Types.f90 @@ -33,11 +33,6 @@ MODULE SoilDyn_Driver_Types !> This contains flags to note if the settings were made. This same data structure is !! used both during the driver input file and the command line options. - !! - !! NOTE: The WindFileType is only set if it is given as a command line option. Otherwise - !! it is handled internally by InflowWInd. - !! - !! NOTE: The wind direction is specified by the SoilDyn input file. TYPE :: SlDDriver_Flags LOGICAL :: DvrIptFile = .FALSE. !< Was an input file name given on the command line? LOGICAL :: SlDIptFile = .FALSE. !< Was an SoilDyn input file requested? From 82a40d9fe4c2c93f974daefd6abda5153f3d41c9 Mon Sep 17 00:00:00 2001 From: Derek Slaughter Date: Mon, 22 Aug 2022 16:21:36 +0000 Subject: [PATCH 127/136] FAST_Registry: SoilDyn to SubDyn use y3Mesh This changes uses the y3Mesh when mapping from SoilDyn to SubDyn instead of the y2Mesh. --- .../openfast-library/src/FAST_Registry.txt | 4 +- modules/openfast-library/src/FAST_Solver.f90 | 14 +++---- modules/openfast-library/src/FAST_Types.f90 | 40 +++++++++---------- 3 files changed, 29 insertions(+), 29 deletions(-) diff --git a/modules/openfast-library/src/FAST_Registry.txt b/modules/openfast-library/src/FAST_Registry.txt index 05125ad53..6486d2387 100644 --- a/modules/openfast-library/src/FAST_Registry.txt +++ b/modules/openfast-library/src/FAST_Registry.txt @@ -649,8 +649,8 @@ typedef ^ FAST_ModuleMapType MeshMapType SDy3_P_2_IceF_P - - - "Map SubDyn y3Mes typedef ^ FAST_ModuleMapType MeshMapType IceD_P_2_SD_P {:} - - "Map IceDyn point mesh to SubDyn LMesh point mesh" typedef ^ FAST_ModuleMapType MeshMapType SDy3_P_2_IceD_P {:} - - "Map SubDyn y3Mesh point mesh to IceDyn point mesh" # SlD <-> SD -typedef ^ FAST_ModuleMapType MeshMapType SlD_P_2_SD_P - - - "Map SoilDyn point mesh to SubDyn y2Mesh point mesh" -typedef ^ FAST_ModuleMapType MeshMapType SD_P_2_SlD_P - - - "Map SubDyn y2Mesh point mesh to SoilDyn point mesh" +typedef ^ FAST_ModuleMapType MeshMapType SlD_P_3_SD_P - - - "Map SoilDyn point mesh to SubDyn y3Mesh point mesh" +typedef ^ FAST_ModuleMapType MeshMapType SD_P_3_SlD_P - - - "Map SubDyn y3Mesh point mesh to SoilDyn point mesh" # Stored Jacobians: typedef ^ FAST_ModuleMapType ReKi Jacobian_Opt1 {:}{:} - - "Stored Jacobian in ED_HD_InputOutputSolve or FullOpt1_InputOutputSolve" typedef ^ FAST_ModuleMapType Integer Jacobian_pivot {:} - - "Pivot array used for LU decomposition of Jacobian_Opt1" diff --git a/modules/openfast-library/src/FAST_Solver.f90 b/modules/openfast-library/src/FAST_Solver.f90 index 14961cb9b..36b87474a 100644 --- a/modules/openfast-library/src/FAST_Solver.f90 +++ b/modules/openfast-library/src/FAST_Solver.f90 @@ -1503,7 +1503,7 @@ SUBROUTINE SlD_InputSolve( u_SlD, y_SD, MeshMapData, ErrStat, ErrMsg ) ! Map SD outputs to SoilDyn inputs !---------------------------------------------------------------------------------------------------- ! motions: - CALL Transfer_Point_to_Point( y_SD%y2Mesh, u_SlD%SoilMesh, MeshMapData%SD_P_2_SlD_P, ErrStat, ErrMsg ) + CALL Transfer_Point_to_Point( y_SD%y3Mesh, u_SlD%SoilMesh, MeshMapData%SD_P_3_SlD_P, ErrStat, ErrMsg ) END SUBROUTINE SlD_InputSolve !---------------------------------------------------------------------------------------------------------------------------------- @@ -3183,8 +3183,8 @@ SUBROUTINE U_FullOpt1_Residual( y_ED2, y_SD2, y_HD2, y_BD2, y_Orca2, y_ExtPtfm2, if (p_FAST%CompSoil == Module_SlD) then ! SlD loads to SD - CALL Transfer_Point_to_Point( y_SlD%SoilMesh, MeshMapData%u_SD_LMesh_2, MeshMapData%SlD_P_2_SD_P, ErrStat2, ErrMsg2, u_SlD%SoilMesh, y_SD2%Y2Mesh ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat, ErrMsg,RoutineName//'Transfer_SlD_to_SD (y_SlD2%SoilMesh -> y_SD2%Y2Mesh)' ) + CALL Transfer_Point_to_Point( y_SlD%SoilMesh, MeshMapData%u_SD_LMesh_2, MeshMapData%SlD_P_3_SD_P, ErrStat2, ErrMsg2, u_SlD%SoilMesh, y_SD2%Y3Mesh ) + CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat, ErrMsg,RoutineName//'Transfer_SlD_to_SD (y_SlD2%SoilMesh -> y_SD2%Y3Mesh)' ) MeshMapData%u_SD_LMesh%Force = MeshMapData%u_SD_LMesh%Force + MeshMapData%u_SD_LMesh_2%Force MeshMapData%u_SD_LMesh%Moment = MeshMapData%u_SD_LMesh%Moment + MeshMapData%u_SD_LMesh_2%Moment endif ! SoilDyn @@ -4922,11 +4922,11 @@ SUBROUTINE InitModuleMappings(p_FAST, ED, BD, AD14, AD, HD, SD, ExtPtfm, SrvD, M IF ( p_FAST%CompSoil == Module_SlD ) THEN ! SoilDyn output SoilMesh point mesh to SubDyn input LMesh point mesh - CALL MeshMapCreate( SlD%y%SoilMesh, SD%Input(1)%LMesh, MeshMapData%SlD_P_2_SD_P, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':SlD_P_2_SD_P' ) + CALL MeshMapCreate( SlD%y%SoilMesh, SD%Input(1)%LMesh, MeshMapData%SlD_P_3_SD_P, ErrStat2, ErrMsg2 ) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':SlD_P_3_SD_P' ) ! SubDyn output y2Mesh point mesh to SoilDyn input SoilMesh point mesh - CALL MeshMapCreate( SD%y%y2Mesh, SlD%Input(1)%SoilMesh, MeshMapData%SD_P_2_SlD_P, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':SD_P_2_SlD_P' ) + CALL MeshMapCreate( SD%y%y3Mesh, SlD%Input(1)%SoilMesh, MeshMapData%SD_P_3_SlD_P, ErrStat2, ErrMsg2 ) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':SD_P_3_SlD_P' ) END IF ! SubDyn-SoilDyn IF (ErrStat >= AbortErrLev ) RETURN diff --git a/modules/openfast-library/src/FAST_Types.f90 b/modules/openfast-library/src/FAST_Types.f90 index 8a88bbd16..37c72bc71 100644 --- a/modules/openfast-library/src/FAST_Types.f90 +++ b/modules/openfast-library/src/FAST_Types.f90 @@ -665,8 +665,8 @@ MODULE FAST_Types TYPE(MeshMapType) :: SDy3_P_2_IceF_P !< Map SubDyn y3Mesh point mesh to IceFloe point mesh [-] TYPE(MeshMapType) , DIMENSION(:), ALLOCATABLE :: IceD_P_2_SD_P !< Map IceDyn point mesh to SubDyn LMesh point mesh [-] TYPE(MeshMapType) , DIMENSION(:), ALLOCATABLE :: SDy3_P_2_IceD_P !< Map SubDyn y3Mesh point mesh to IceDyn point mesh [-] - TYPE(MeshMapType) :: SlD_P_2_SD_P !< Map SoilDyn point mesh to SubDyn y2Mesh point mesh [-] - TYPE(MeshMapType) :: SD_P_2_SlD_P !< Map SubDyn y2Mesh point mesh to SoilDyn point mesh [-] + TYPE(MeshMapType) :: SlD_P_3_SD_P !< Map SoilDyn point mesh to SubDyn y3Mesh point mesh [-] + TYPE(MeshMapType) :: SD_P_3_SlD_P !< Map SubDyn y3Mesh point mesh to SoilDyn point mesh [-] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: Jacobian_Opt1 !< Stored Jacobian in ED_HD_InputOutputSolve or FullOpt1_InputOutputSolve [-] INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: Jacobian_pivot !< Pivot array used for LU decomposition of Jacobian_Opt1 [-] INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: Jac_u_indx !< matrix to help fill/pack the u vector in computing the jacobian [-] @@ -37418,10 +37418,10 @@ SUBROUTINE FAST_CopyModuleMapType( SrcModuleMapTypeData, DstModuleMapTypeData, C IF (ErrStat>=AbortErrLev) RETURN ENDDO ENDIF - CALL NWTC_Library_Copymeshmaptype( SrcModuleMapTypeData%SlD_P_2_SD_P, DstModuleMapTypeData%SlD_P_2_SD_P, CtrlCode, ErrStat2, ErrMsg2 ) + CALL NWTC_Library_Copymeshmaptype( SrcModuleMapTypeData%SlD_P_3_SD_P, DstModuleMapTypeData%SlD_P_3_SD_P, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN - CALL NWTC_Library_Copymeshmaptype( SrcModuleMapTypeData%SD_P_2_SlD_P, DstModuleMapTypeData%SD_P_2_SlD_P, CtrlCode, ErrStat2, ErrMsg2 ) + CALL NWTC_Library_Copymeshmaptype( SrcModuleMapTypeData%SD_P_3_SlD_P, DstModuleMapTypeData%SD_P_3_SlD_P, CtrlCode, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ErrStat>=AbortErrLev) RETURN IF (ALLOCATED(SrcModuleMapTypeData%Jacobian_Opt1)) THEN @@ -37735,8 +37735,8 @@ SUBROUTINE FAST_DestroyModuleMapType( ModuleMapTypeData, ErrStat, ErrMsg ) ENDDO DEALLOCATE(ModuleMapTypeData%SDy3_P_2_IceD_P) ENDIF - CALL NWTC_Library_Destroymeshmaptype( ModuleMapTypeData%SlD_P_2_SD_P, ErrStat, ErrMsg ) - CALL NWTC_Library_Destroymeshmaptype( ModuleMapTypeData%SD_P_2_SlD_P, ErrStat, ErrMsg ) + CALL NWTC_Library_Destroymeshmaptype( ModuleMapTypeData%SlD_P_3_SD_P, ErrStat, ErrMsg ) + CALL NWTC_Library_Destroymeshmaptype( ModuleMapTypeData%SD_P_3_SlD_P, ErrStat, ErrMsg ) IF (ALLOCATED(ModuleMapTypeData%Jacobian_Opt1)) THEN DEALLOCATE(ModuleMapTypeData%Jacobian_Opt1) ENDIF @@ -38703,37 +38703,37 @@ SUBROUTINE FAST_PackModuleMapType( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, END IF END DO END IF - Int_BufSz = Int_BufSz + 3 ! SlD_P_2_SD_P: size of buffers for each call to pack subtype - CALL NWTC_Library_Packmeshmaptype( Re_Buf, Db_Buf, Int_Buf, InData%SlD_P_2_SD_P, ErrStat2, ErrMsg2, .TRUE. ) ! SlD_P_2_SD_P + Int_BufSz = Int_BufSz + 3 ! SlD_P_3_SD_P: size of buffers for each call to pack subtype + CALL NWTC_Library_Packmeshmaptype( Re_Buf, Db_Buf, Int_Buf, InData%SlD_P_3_SD_P, ErrStat2, ErrMsg2, .TRUE. ) ! SlD_P_3_SD_P CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN - IF(ALLOCATED(Re_Buf)) THEN ! SlD_P_2_SD_P + IF(ALLOCATED(Re_Buf)) THEN ! SlD_P_3_SD_P Re_BufSz = Re_BufSz + SIZE( Re_Buf ) DEALLOCATE(Re_Buf) END IF - IF(ALLOCATED(Db_Buf)) THEN ! SlD_P_2_SD_P + IF(ALLOCATED(Db_Buf)) THEN ! SlD_P_3_SD_P Db_BufSz = Db_BufSz + SIZE( Db_Buf ) DEALLOCATE(Db_Buf) END IF - IF(ALLOCATED(Int_Buf)) THEN ! SlD_P_2_SD_P + IF(ALLOCATED(Int_Buf)) THEN ! SlD_P_3_SD_P Int_BufSz = Int_BufSz + SIZE( Int_Buf ) DEALLOCATE(Int_Buf) END IF - Int_BufSz = Int_BufSz + 3 ! SD_P_2_SlD_P: size of buffers for each call to pack subtype - CALL NWTC_Library_Packmeshmaptype( Re_Buf, Db_Buf, Int_Buf, InData%SD_P_2_SlD_P, ErrStat2, ErrMsg2, .TRUE. ) ! SD_P_2_SlD_P + Int_BufSz = Int_BufSz + 3 ! SD_P_3_SlD_P: size of buffers for each call to pack subtype + CALL NWTC_Library_Packmeshmaptype( Re_Buf, Db_Buf, Int_Buf, InData%SD_P_3_SlD_P, ErrStat2, ErrMsg2, .TRUE. ) ! SD_P_3_SlD_P CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN - IF(ALLOCATED(Re_Buf)) THEN ! SD_P_2_SlD_P + IF(ALLOCATED(Re_Buf)) THEN ! SD_P_3_SlD_P Re_BufSz = Re_BufSz + SIZE( Re_Buf ) DEALLOCATE(Re_Buf) END IF - IF(ALLOCATED(Db_Buf)) THEN ! SD_P_2_SlD_P + IF(ALLOCATED(Db_Buf)) THEN ! SD_P_3_SlD_P Db_BufSz = Db_BufSz + SIZE( Db_Buf ) DEALLOCATE(Db_Buf) END IF - IF(ALLOCATED(Int_Buf)) THEN ! SD_P_2_SlD_P + IF(ALLOCATED(Int_Buf)) THEN ! SD_P_3_SlD_P Int_BufSz = Int_BufSz + SIZE( Int_Buf ) DEALLOCATE(Int_Buf) END IF @@ -40617,7 +40617,7 @@ SUBROUTINE FAST_PackModuleMapType( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ENDIF END DO END IF - CALL NWTC_Library_Packmeshmaptype( Re_Buf, Db_Buf, Int_Buf, InData%SlD_P_2_SD_P, ErrStat2, ErrMsg2, OnlySize ) ! SlD_P_2_SD_P + CALL NWTC_Library_Packmeshmaptype( Re_Buf, Db_Buf, Int_Buf, InData%SlD_P_3_SD_P, ErrStat2, ErrMsg2, OnlySize ) ! SlD_P_3_SD_P CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -40645,7 +40645,7 @@ SUBROUTINE FAST_PackModuleMapType( ReKiBuf, DbKiBuf, IntKiBuf, Indata, ErrStat, ELSE IntKiBuf( Int_Xferred ) = 0; Int_Xferred = Int_Xferred + 1 ENDIF - CALL NWTC_Library_Packmeshmaptype( Re_Buf, Db_Buf, Int_Buf, InData%SD_P_2_SlD_P, ErrStat2, ErrMsg2, OnlySize ) ! SD_P_2_SlD_P + CALL NWTC_Library_Packmeshmaptype( Re_Buf, Db_Buf, Int_Buf, InData%SD_P_3_SlD_P, ErrStat2, ErrMsg2, OnlySize ) ! SD_P_3_SlD_P CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -43435,7 +43435,7 @@ SUBROUTINE FAST_UnPackModuleMapType( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrSta Int_Buf = IntKiBuf( Int_Xferred:Int_Xferred+Buf_size-1 ) Int_Xferred = Int_Xferred + Buf_size END IF - CALL NWTC_Library_Unpackmeshmaptype( Re_Buf, Db_Buf, Int_Buf, OutData%SlD_P_2_SD_P, ErrStat2, ErrMsg2 ) ! SlD_P_2_SD_P + CALL NWTC_Library_Unpackmeshmaptype( Re_Buf, Db_Buf, Int_Buf, OutData%SlD_P_3_SD_P, ErrStat2, ErrMsg2 ) ! SlD_P_3_SD_P CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN @@ -43475,7 +43475,7 @@ SUBROUTINE FAST_UnPackModuleMapType( ReKiBuf, DbKiBuf, IntKiBuf, Outdata, ErrSta Int_Buf = IntKiBuf( Int_Xferred:Int_Xferred+Buf_size-1 ) Int_Xferred = Int_Xferred + Buf_size END IF - CALL NWTC_Library_Unpackmeshmaptype( Re_Buf, Db_Buf, Int_Buf, OutData%SD_P_2_SlD_P, ErrStat2, ErrMsg2 ) ! SD_P_2_SlD_P + CALL NWTC_Library_Unpackmeshmaptype( Re_Buf, Db_Buf, Int_Buf, OutData%SD_P_3_SlD_P, ErrStat2, ErrMsg2 ) ! SD_P_3_SlD_P CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF (ErrStat >= AbortErrLev) RETURN From 9dff305842b32de3491300096fc84a174c363418 Mon Sep 17 00:00:00 2001 From: Derek Slaughter Date: Mon, 22 Aug 2022 16:22:23 +0000 Subject: [PATCH 128/136] SoilDyn: Fix header in REDWINinterface.f90 --- modules/soildyn/src/REDWINinterface.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/soildyn/src/REDWINinterface.f90 b/modules/soildyn/src/REDWINinterface.f90 index e3bd4fc68..14a290451 100644 --- a/modules/soildyn/src/REDWINinterface.f90 +++ b/modules/soildyn/src/REDWINinterface.f90 @@ -2,7 +2,7 @@ ! LICENSING ! Copyright (C) 2013-2016 National Renewable Energy Laboratory ! -! This file is part of FAST's Controls and Electrical Drive Module, "ServoDyn". +! This file is part of SoilDyn. ! ! Licensed under the Apache License, Version 2.0 (the "License"); ! you may not use this file except in compliance with the License. From e8bb4eb61c44012d30edcde4347f8f8219421a7c Mon Sep 17 00:00:00 2001 From: Derek Slaughter Date: Mon, 22 Aug 2022 16:25:54 +0000 Subject: [PATCH 129/136] SubDyn: If Soil_K from SoilDyn, isFloating=false This change modifies the isFloating function in SD_FEM.f90 to return false if Init%Soil_K has been allocated, which occurs if SoilDyn is active. Without this check, SubDyn assumes the structure is floating when SoilDyn is active and no constraints are specified directly in SubDyn. --- modules/subdyn/src/SD_FEM.f90 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/modules/subdyn/src/SD_FEM.f90 b/modules/subdyn/src/SD_FEM.f90 index bee8e4a9e..f966c2950 100644 --- a/modules/subdyn/src/SD_FEM.f90 +++ b/modules/subdyn/src/SD_FEM.f90 @@ -2144,8 +2144,12 @@ logical function isFloating(Init, p) type(SD_InitType), intent(in ):: Init type(SD_ParameterType),intent(in ) :: p integer(IntKi) :: i - !isFloating=size(p%Nodes_C)>0 isFloating=.True. + ! If soil stiffness is provided by SoilDyn, return false + if (allocated(Init%Soil_K)) then + isFloating=.false. + return + end if do i =1,size(p%Nodes_C,1) if ((all(p%Nodes_C(I,2:7)==idBC_Internal)) .and. (Init%SSIfile(i)=='')) then continue From 078f344039a17d54b4404f000c9b7fd6e9b067c6 Mon Sep 17 00:00:00 2001 From: Derek Slaughter Date: Mon, 22 Aug 2022 20:55:17 +0000 Subject: [PATCH 130/136] Added OC6_phaseII regression test This commit adds the OC6_phaseII regression test to CTestList.cmake and updates the r-test submodule to the latest revision --- reg_tests/CTestList.cmake | 1 + reg_tests/r-test | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/reg_tests/CTestList.cmake b/reg_tests/CTestList.cmake index 754243336..512dace40 100644 --- a/reg_tests/CTestList.cmake +++ b/reg_tests/CTestList.cmake @@ -237,6 +237,7 @@ of_regression("5MW_OC4Jckt_ExtPtfm" "openfast;elastodyn;extpt of_regression("HelicalWake_OLAF" "openfast;aerodyn15;olaf") of_regression("EllipticalWing_OLAF" "openfast;aerodyn15;olaf") of_regression("StC_test_OC4Semi" "openfast;servodyn;hydrodyn;moordyn;offshore;stc") +of_regression("OC6_phaseII" "openfast;soildyn;subdyn;hydrodyn;offshore;stc") # OpenFAST C++ API test if(BUILD_OPENFAST_CPP_API) diff --git a/reg_tests/r-test b/reg_tests/r-test index 166b0a439..1a1db15b1 160000 --- a/reg_tests/r-test +++ b/reg_tests/r-test @@ -1 +1 @@ -Subproject commit 166b0a439d9defa02ea21a0a32fc30fce88dfede +Subproject commit 1a1db15b13b6ce1fb43ca863636d5a4d8fb06755 From 493af4fec7eb266e9d03ee72781a7e83f7df6e9c Mon Sep 17 00:00:00 2001 From: Derek Slaughter Date: Tue, 23 Aug 2022 14:23:50 +0000 Subject: [PATCH 131/136] Update r-test to latest SoilDyn commit --- reg_tests/r-test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reg_tests/r-test b/reg_tests/r-test index 1a1db15b1..d13305786 160000 --- a/reg_tests/r-test +++ b/reg_tests/r-test @@ -1 +1 @@ -Subproject commit 1a1db15b13b6ce1fb43ca863636d5a4d8fb06755 +Subproject commit d13305786a98576c8ef7b909abe49db217e3c083 From b65dea7a59289d0c533556c4846a1a367f746611 Mon Sep 17 00:00:00 2001 From: Derek Slaughter Date: Wed, 24 Aug 2022 15:04:32 +0000 Subject: [PATCH 132/136] Rework reg_test CMakeLists.txt to copy test data Added custom targets to copy common regression test data to the build/reg_test/glue_codes directory. This should ensure that the controller DLLs are in the proper place for testing. --- reg_tests/CMakeLists.txt | 167 +++++++++++++++++++++------------------ reg_tests/r-test | 2 +- 2 files changed, 92 insertions(+), 77 deletions(-) diff --git a/reg_tests/CMakeLists.txt b/reg_tests/CMakeLists.txt index 50c585768..e31bbe149 100644 --- a/reg_tests/CMakeLists.txt +++ b/reg_tests/CMakeLists.txt @@ -80,106 +80,121 @@ set(CTEST_RTEST_ATOL "1.9" CACHE STRING "Set the absolute orders of magnitude to # include the r-test cmake projects (servodyn controllers) add_subdirectory("${CMAKE_CURRENT_LIST_DIR}/r-test") +#------------------------------------------------------------------------------- # build and seed the test directories with the data they need to run the tests +#------------------------------------------------------------------------------- + file(MAKE_DIRECTORY ${CTEST_BINARY_DIR}) -foreach(regTest glue-codes/openfast glue-codes/openfast-cpp modules/aerodyn modules/beamdyn modules/hydrodyn modules/subdyn) +foreach(regTest glue-codes/openfast glue-codes/openfast-cpp glue-codes/python + glue-codes/fast-farm modules/aerodyn modules/beamdyn + modules/hydrodyn modules/subdyn) file(MAKE_DIRECTORY ${CTEST_BINARY_DIR}/${regTest}) endforeach() -## openfast seed -foreach(turbineDirectory 5MW_Baseline AOC AWT27 SWRT UAE_VI WP_Baseline) - file(COPY "${CMAKE_CURRENT_LIST_DIR}/r-test/glue-codes/openfast/${turbineDirectory}" - DESTINATION "${CTEST_BINARY_DIR}/glue-codes/openfast/") -endforeach() +set(src ${CMAKE_CURRENT_LIST_DIR}/r-test/glue-codes/openfast) +set(dst ${CTEST_BINARY_DIR}/glue-codes) +add_custom_target( + copy_test_data_for_openfast + COMMAND "${CMAKE_COMMAND}" -E copy_directory "${src}/5MW_Baseline" "${dst}/openfast/5MW_Baseline" + COMMAND "${CMAKE_COMMAND}" -E copy_directory "${src}/AOC" "${dst}/openfast/AOC" + COMMAND "${CMAKE_COMMAND}" -E copy_directory "${src}/AWT27" "${dst}/openfast/AWT27" + COMMAND "${CMAKE_COMMAND}" -E copy_directory "${src}/SWRT" "${dst}/openfast/SWRT" + COMMAND "${CMAKE_COMMAND}" -E copy_directory "${src}/UAE_VI" "${dst}/openfast/UAE_VI" + COMMAND "${CMAKE_COMMAND}" -E copy_directory "${src}/WP_Baseline" "${dst}/openfast/WP_Baseline" + DEPENDS openfast +) -foreach(turbineDirectory 5MW_Baseline) - file(COPY "${CMAKE_CURRENT_LIST_DIR}/r-test/glue-codes/openfast/${turbineDirectory}" - DESTINATION "${CTEST_BINARY_DIR}/glue-codes/python/") -endforeach() +add_custom_target( + copy_test_data_for_python + COMMAND "${CMAKE_COMMAND}" -E copy_directory "${src}/5MW_Baseline" "${dst}/python/5MW_Baseline" + DEPENDS openfastlib +) -## fastfarm seed -foreach(turbineDirectory 5MW_Baseline) - file(COPY "${CMAKE_CURRENT_LIST_DIR}/r-test/glue-codes/fast-farm/${turbineDirectory}" - DESTINATION "${CTEST_BINARY_DIR}/glue-codes/fast-farm/") -endforeach() +if(BUILD_OPENFAST_CPP_API) + add_custom_target( + copy_test_data_for_openfastcpp + COMMAND "${CMAKE_COMMAND}" -E copy_directory "${src}/5MW_Baseline" "${dst}/openfast-cpp/5MW_Baseline" + DEPENDS openfastcpp + ) +endif() + +if(BUILD_FASTFARM) + add_custom_target( + copy_test_data_for_fastfarm + COMMAND "${CMAKE_COMMAND}" -E copy_directory "${src}/5MW_Baseline" "${dst}/fast-farm/5MW_Baseline" + DEPENDS FAST.Farm + ) +endif() # add the tests include(${CMAKE_CURRENT_LIST_DIR}/CTestList.cmake) +#------------------------------------------------------------------------------- # Copy the DISCON controllers to the 5MW turbine directories -set(src "${CMAKE_CURRENT_LIST_DIR}/r-test/glue-codes/openfast/5MW_Baseline/ServoData") - -set(of_dest "${CTEST_BINARY_DIR}/glue-codes/openfast/5MW_Baseline/ServoData/") -add_custom_command( - OUTPUT "${of_dest}/DISCON.dll" - DEPENDS DISCON - COMMAND "${CMAKE_COMMAND}" -E copy "${src}/DISCON/build/DISCON.dll" "${of_dest}" -) -add_custom_command( - OUTPUT "${of_dest}/DISCON_ITIBarge.dll" - DEPENDS DISCON_ITIBarge - COMMAND "${CMAKE_COMMAND}" -E copy "${src}/DISCON_ITI/build/DISCON_ITIBarge.dll" "${of_dest}" - ) -add_custom_command( - OUTPUT "${of_dest}/DISCON_OC3Hywind.dll" - DEPENDS DISCON_OC3Hywind - COMMAND "${CMAKE_COMMAND}" -E copy "${src}/DISCON_OC3/build/DISCON_OC3Hywind.dll" "${of_dest}" -) +#------------------------------------------------------------------------------- -set(ofpy_dest "${CTEST_BINARY_DIR}/glue-codes/python/5MW_Baseline/ServoData/") -add_custom_command( - OUTPUT "${ofpy_dest}/DISCON.dll" - DEPENDS DISCON - COMMAND "${CMAKE_COMMAND}" -E copy "${src}/DISCON/build/DISCON.dll" "${ofpy_dest}" -) -add_custom_command( - OUTPUT "${ofpy_dest}/DISCON_ITIBarge.dll" - DEPENDS DISCON_ITIBarge - COMMAND "${CMAKE_COMMAND}" -E copy "${src}/DISCON_ITI/build/DISCON_ITIBarge.dll" "${ofpy_dest}" -) -add_custom_command( - OUTPUT "${ofpy_dest}/DISCON_OC3Hywind.dll" - DEPENDS DISCON_OC3Hywind - COMMAND "${CMAKE_COMMAND}" -E copy "${src}/DISCON_OC3/build/DISCON_OC3Hywind.dll" "${ofpy_dest}" -) +set(src_servo "${CMAKE_CURRENT_LIST_DIR}/r-test/glue-codes/openfast/5MW_Baseline/ServoData") +set(src_discon "${src_servo}/DISCON/build/DISCON.dll") +set(src_discon_iti "${src_servo}/DISCON_ITI/build/DISCON_ITIBarge.dll") +set(src_discon_oc3 "${src_servo}/DISCON_OC3/build/DISCON_OC3Hywind.dll") -set(ff_dest "${CTEST_BINARY_DIR}/glue-codes/fast-farm/5MW_Baseline/ServoData/") -add_custom_command( - OUTPUT "${ff_dest}/DISCON_WT1.dll" - DEPENDS DISCON - COMMAND "${CMAKE_COMMAND}" -E copy "${src}/DISCON/build/DISCON.dll" "${ff_dest}/DISCON_WT1.dll" -) -add_custom_command( - OUTPUT "${ff_dest}/DISCON_WT2.dll" - DEPENDS DISCON - COMMAND "${CMAKE_COMMAND}" -E copy "${src}/DISCON/build/DISCON.dll" "${ff_dest}/DISCON_WT2.dll" -) -add_custom_command( - OUTPUT "${ff_dest}/DISCON_WT3.dll" - DEPENDS DISCON - COMMAND "${CMAKE_COMMAND}" -E copy "${src}/DISCON/build/DISCON.dll" "${ff_dest}/DISCON_WT3.dll" +set(dest ${CTEST_BINARY_DIR}/glue-codes/openfast/5MW_Baseline/ServoData) +add_custom_target( + regression_test_controllers_openfast + COMMAND "${CMAKE_COMMAND}" -E copy ${src_discon} ${dest} + COMMAND "${CMAKE_COMMAND}" -E copy ${src_discon_iti} ${dest} + COMMAND "${CMAKE_COMMAND}" -E copy ${src_discon_oc3} ${dest} + DEPENDS openfast DISCON DISCON_ITIBarge DISCON_OC3Hywind copy_test_data_for_openfast ) +set(dest ${CTEST_BINARY_DIR}/glue-codes/python/5MW_Baseline/ServoData) add_custom_target( - regression_test_controllers - DEPENDS - "${of_dest}/DISCON.dll" - "${of_dest}/DISCON_ITIBarge.dll" - "${of_dest}/DISCON_OC3Hywind.dll" - "${ofpy_dest}/DISCON.dll" - "${ofpy_dest}/DISCON_ITIBarge.dll" - "${ofpy_dest}/DISCON_OC3Hywind.dll" - "${ff_dest}/DISCON_WT1.dll" - "${ff_dest}/DISCON_WT2.dll" - "${ff_dest}/DISCON_WT3.dll" + regression_test_controllers_python + COMMAND "${CMAKE_COMMAND}" -E copy ${src_discon} ${dest} + COMMAND "${CMAKE_COMMAND}" -E copy ${src_discon_iti} ${dest} + COMMAND "${CMAKE_COMMAND}" -E copy ${src_discon_oc3} ${dest} + DEPENDS openfastlib DISCON DISCON_ITIBarge DISCON_OC3Hywind copy_test_data_for_python ) +if(BUILD_OPENFAST_CPP_API) + set(dest ${CTEST_BINARY_DIR}/glue-codes/openfast-cpp/5MW_Baseline/ServoData) + add_custom_target( + regression_test_controllers_openfastcpp + COMMAND "${CMAKE_COMMAND}" -E copy ${src_discon} ${dest} + COMMAND "${CMAKE_COMMAND}" -E copy ${src_discon_iti} ${dest} + COMMAND "${CMAKE_COMMAND}" -E copy ${src_discon_oc3} ${dest} + DEPENDS openfastcpp DISCON DISCON_ITIBarge DISCON_OC3Hywind copy_test_data_for_openfastcpp + ) +endif() + +if(BUILD_FASTFARM) + set(dest ${CTEST_BINARY_DIR}/fast-farm/5MW_Baseline/ServoData) + add_custom_target( + regression_test_controllers_fastfarm + COMMAND "${CMAKE_COMMAND}" -E copy ${src_discon} ${dest}/DISCON_WT1.dll + COMMAND "${CMAKE_COMMAND}" -E copy ${src_discon} ${dest}/DISCON_WT2.dll + COMMAND "${CMAKE_COMMAND}" -E copy ${src_discon} ${dest}/DISCON_WT3.dll + DEPENDS FAST.Farm DISCON copy_test_data_for_fastfarm + ) +endif() + +#------------------------------------------------------------------------------- +# Combined Targets +#------------------------------------------------------------------------------- + add_custom_target( regression_tests DEPENDS openfast - regression_test_controllers + regression_test_controllers_openfast + regression_test_controllers_python ) +if(BUILD_OPENFAST_CPP_API) + add_dependencies(regression_tests regression_test_controllers_openfastcpp) +endif() +if(BUILD_FASTFARM) + add_dependencies(regression_tests regression_test_controllers_fastfarm) +endif() add_custom_target( regression_test_module_drivers diff --git a/reg_tests/r-test b/reg_tests/r-test index d13305786..adfa23c17 160000 --- a/reg_tests/r-test +++ b/reg_tests/r-test @@ -1 +1 @@ -Subproject commit d13305786a98576c8ef7b909abe49db217e3c083 +Subproject commit adfa23c1750d8c9d0eba901b9bce3caa972a622c From 3d356416142688e3866601f1cc6bbf9e22ceafd4 Mon Sep 17 00:00:00 2001 From: Derek Slaughter Date: Wed, 24 Aug 2022 15:23:59 +0000 Subject: [PATCH 133/136] reg_test/CMakeLists.txt fixed missing target Added regression_test_controllers target as it was mistakenly removed --- reg_tests/CMakeLists.txt | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/reg_tests/CMakeLists.txt b/reg_tests/CMakeLists.txt index e31bbe149..8b40ca560 100644 --- a/reg_tests/CMakeLists.txt +++ b/reg_tests/CMakeLists.txt @@ -183,21 +183,27 @@ endif() #------------------------------------------------------------------------------- add_custom_target( - regression_tests + regression_test_controllers DEPENDS - openfast regression_test_controllers_openfast regression_test_controllers_python ) if(BUILD_OPENFAST_CPP_API) - add_dependencies(regression_tests regression_test_controllers_openfastcpp) + add_dependencies(regression_test_controllers regression_test_controllers_openfastcpp) endif() if(BUILD_FASTFARM) - add_dependencies(regression_tests regression_test_controllers_fastfarm) + add_dependencies(regression_test_controllers regression_test_controllers_fastfarm) endif() add_custom_target( - regression_test_module_drivers + regression_tests + DEPENDS + openfast + regression_test_controllers +) + +add_custom_target( + regression_test_module_drivers DEPENDS aerodyn_driver beamdyn_driver From 8224f85f4758b582b38e1b9faf2c79cbd8ee474c Mon Sep 17 00:00:00 2001 From: Derek Slaughter Date: Wed, 24 Aug 2022 19:51:14 +0000 Subject: [PATCH 134/136] SoilDyn: updated version info --- modules/soildyn/src/REDWINinterface.f90 | 17 +++++------------ modules/soildyn/src/SoilDyn.f90 | 2 +- 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/modules/soildyn/src/REDWINinterface.f90 b/modules/soildyn/src/REDWINinterface.f90 index 14a290451..c699ca398 100644 --- a/modules/soildyn/src/REDWINinterface.f90 +++ b/modules/soildyn/src/REDWINinterface.f90 @@ -79,7 +79,7 @@ end subroutine INTERFACEFOUNDATION end interface #endif - type(ProgDesc), parameter :: REDWINinterface_Ver = ProgDesc( 'SoilDyn Interface for REDWIN soil interaction DLLs', 'using '//TRIM(OS_Desc), '99-Feb-2020' ) + type(ProgDesc), parameter :: REDWINinterface_Ver = ProgDesc( 'SoilDyn Interface for REDWIN soil interaction DLLs', 'using '//TRIM(OS_Desc), '28-Aug-2022' ) ! Interface version (in case we end up with multiple different versions supported at some later date) INTEGER(IntKi), PARAMETER :: RW_v00 = 0 ! Version number @@ -145,8 +145,6 @@ subroutine REDWINinterface_Init( DLL_FileName, DLL_ProcName, DLL_Trgt, DLL_Model character(1024) :: PropsLoc !< Full path to PropsFile location character(1024) :: LDispLoc !< Full path to LDispFile location - - ErrStat = ErrID_None ErrMsg= '' @@ -163,22 +161,17 @@ subroutine REDWINinterface_Init( DLL_FileName, DLL_ProcName, DLL_Trgt, DLL_Model call CheckPaths() if (ErrStat >= AbortErrLev) return - ! Load the DLL -#ifdef STATIC_DLL_LOAD - ! because OpenFOAM needs the MPI task to copy the library, we're not going to dynamically load it; it needs to be loaded at runtime. - DLL_Trgt%FileName = '' - DLL_Trgt%ProcName = '' -#else ! Define and load the DLL: DLL_Trgt%FileName = DLL_FileName DLL_Trgt%ProcName = "" ! initialize all procedures to empty so we try to load only one DLL_Trgt%ProcName(1) = DLL_ProcName - CALL LoadDynamicLib ( DLL_Trgt, ErrStat2, ErrMsg2 ); if(Failed()) return; -#endif + CALL LoadDynamicLib ( DLL_Trgt, ErrStat2, ErrMsg2 ) + if(Failed()) return ! Initialize DLL dll_data%IDtask = IDtask_init - CALL CallREDWINdll(DLL_Trgt, DLL_Model, dll_data, ErrStat2, ErrMsg2); if(Failed()) return; + CALL CallREDWINdll(DLL_Trgt, DLL_Model, dll_data, ErrStat2, ErrMsg2) + if(Failed()) return ! Checks on model version ! NOTE: there is not a good way to tell exactly which DLL model is in use. The DLL does not return diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 index a65f78829..622cf8bd3 100644 --- a/modules/soildyn/src/SoilDyn.f90 +++ b/modules/soildyn/src/SoilDyn.f90 @@ -37,7 +37,7 @@ MODULE SoilDyn PRIVATE - TYPE(ProgDesc), PARAMETER :: SlD_Ver = ProgDesc( 'SoilDyn', 'v0.01.00', '99-Feb-2020' ) !< module date/version information + TYPE(ProgDesc), PARAMETER :: SlD_Ver = ProgDesc( 'SoilDyn', 'v0.01.00', '24-Aug-2022' ) !< module date/version information ! ..... Public Subroutines ................................................................................................... PUBLIC :: SlD_Init ! Initialization routine From 7387f6ebb15efde2bfcd8ba971d44ef9744f8f0c Mon Sep 17 00:00:00 2001 From: Derek Slaughter Date: Wed, 24 Aug 2022 19:53:00 +0000 Subject: [PATCH 135/136] reg_tests/CMakeLists.txt: reverted debug changes Reverted changes made in attempt to get SoilDyn regression tests to pass. May be good to revisit these changes later. --- reg_tests/CMakeLists.txt | 167 +++++++++++++++++---------------------- 1 file changed, 73 insertions(+), 94 deletions(-) diff --git a/reg_tests/CMakeLists.txt b/reg_tests/CMakeLists.txt index 8b40ca560..50c585768 100644 --- a/reg_tests/CMakeLists.txt +++ b/reg_tests/CMakeLists.txt @@ -80,130 +80,109 @@ set(CTEST_RTEST_ATOL "1.9" CACHE STRING "Set the absolute orders of magnitude to # include the r-test cmake projects (servodyn controllers) add_subdirectory("${CMAKE_CURRENT_LIST_DIR}/r-test") -#------------------------------------------------------------------------------- # build and seed the test directories with the data they need to run the tests -#------------------------------------------------------------------------------- - file(MAKE_DIRECTORY ${CTEST_BINARY_DIR}) -foreach(regTest glue-codes/openfast glue-codes/openfast-cpp glue-codes/python - glue-codes/fast-farm modules/aerodyn modules/beamdyn - modules/hydrodyn modules/subdyn) +foreach(regTest glue-codes/openfast glue-codes/openfast-cpp modules/aerodyn modules/beamdyn modules/hydrodyn modules/subdyn) file(MAKE_DIRECTORY ${CTEST_BINARY_DIR}/${regTest}) endforeach() -set(src ${CMAKE_CURRENT_LIST_DIR}/r-test/glue-codes/openfast) -set(dst ${CTEST_BINARY_DIR}/glue-codes) -add_custom_target( - copy_test_data_for_openfast - COMMAND "${CMAKE_COMMAND}" -E copy_directory "${src}/5MW_Baseline" "${dst}/openfast/5MW_Baseline" - COMMAND "${CMAKE_COMMAND}" -E copy_directory "${src}/AOC" "${dst}/openfast/AOC" - COMMAND "${CMAKE_COMMAND}" -E copy_directory "${src}/AWT27" "${dst}/openfast/AWT27" - COMMAND "${CMAKE_COMMAND}" -E copy_directory "${src}/SWRT" "${dst}/openfast/SWRT" - COMMAND "${CMAKE_COMMAND}" -E copy_directory "${src}/UAE_VI" "${dst}/openfast/UAE_VI" - COMMAND "${CMAKE_COMMAND}" -E copy_directory "${src}/WP_Baseline" "${dst}/openfast/WP_Baseline" - DEPENDS openfast -) - -add_custom_target( - copy_test_data_for_python - COMMAND "${CMAKE_COMMAND}" -E copy_directory "${src}/5MW_Baseline" "${dst}/python/5MW_Baseline" - DEPENDS openfastlib -) +## openfast seed +foreach(turbineDirectory 5MW_Baseline AOC AWT27 SWRT UAE_VI WP_Baseline) + file(COPY "${CMAKE_CURRENT_LIST_DIR}/r-test/glue-codes/openfast/${turbineDirectory}" + DESTINATION "${CTEST_BINARY_DIR}/glue-codes/openfast/") +endforeach() -if(BUILD_OPENFAST_CPP_API) - add_custom_target( - copy_test_data_for_openfastcpp - COMMAND "${CMAKE_COMMAND}" -E copy_directory "${src}/5MW_Baseline" "${dst}/openfast-cpp/5MW_Baseline" - DEPENDS openfastcpp - ) -endif() +foreach(turbineDirectory 5MW_Baseline) + file(COPY "${CMAKE_CURRENT_LIST_DIR}/r-test/glue-codes/openfast/${turbineDirectory}" + DESTINATION "${CTEST_BINARY_DIR}/glue-codes/python/") +endforeach() -if(BUILD_FASTFARM) - add_custom_target( - copy_test_data_for_fastfarm - COMMAND "${CMAKE_COMMAND}" -E copy_directory "${src}/5MW_Baseline" "${dst}/fast-farm/5MW_Baseline" - DEPENDS FAST.Farm - ) -endif() +## fastfarm seed +foreach(turbineDirectory 5MW_Baseline) + file(COPY "${CMAKE_CURRENT_LIST_DIR}/r-test/glue-codes/fast-farm/${turbineDirectory}" + DESTINATION "${CTEST_BINARY_DIR}/glue-codes/fast-farm/") +endforeach() # add the tests include(${CMAKE_CURRENT_LIST_DIR}/CTestList.cmake) -#------------------------------------------------------------------------------- # Copy the DISCON controllers to the 5MW turbine directories -#------------------------------------------------------------------------------- - -set(src_servo "${CMAKE_CURRENT_LIST_DIR}/r-test/glue-codes/openfast/5MW_Baseline/ServoData") -set(src_discon "${src_servo}/DISCON/build/DISCON.dll") -set(src_discon_iti "${src_servo}/DISCON_ITI/build/DISCON_ITIBarge.dll") -set(src_discon_oc3 "${src_servo}/DISCON_OC3/build/DISCON_OC3Hywind.dll") - -set(dest ${CTEST_BINARY_DIR}/glue-codes/openfast/5MW_Baseline/ServoData) -add_custom_target( - regression_test_controllers_openfast - COMMAND "${CMAKE_COMMAND}" -E copy ${src_discon} ${dest} - COMMAND "${CMAKE_COMMAND}" -E copy ${src_discon_iti} ${dest} - COMMAND "${CMAKE_COMMAND}" -E copy ${src_discon_oc3} ${dest} - DEPENDS openfast DISCON DISCON_ITIBarge DISCON_OC3Hywind copy_test_data_for_openfast -) +set(src "${CMAKE_CURRENT_LIST_DIR}/r-test/glue-codes/openfast/5MW_Baseline/ServoData") -set(dest ${CTEST_BINARY_DIR}/glue-codes/python/5MW_Baseline/ServoData) -add_custom_target( - regression_test_controllers_python - COMMAND "${CMAKE_COMMAND}" -E copy ${src_discon} ${dest} - COMMAND "${CMAKE_COMMAND}" -E copy ${src_discon_iti} ${dest} - COMMAND "${CMAKE_COMMAND}" -E copy ${src_discon_oc3} ${dest} - DEPENDS openfastlib DISCON DISCON_ITIBarge DISCON_OC3Hywind copy_test_data_for_python +set(of_dest "${CTEST_BINARY_DIR}/glue-codes/openfast/5MW_Baseline/ServoData/") +add_custom_command( + OUTPUT "${of_dest}/DISCON.dll" + DEPENDS DISCON + COMMAND "${CMAKE_COMMAND}" -E copy "${src}/DISCON/build/DISCON.dll" "${of_dest}" ) - -if(BUILD_OPENFAST_CPP_API) - set(dest ${CTEST_BINARY_DIR}/glue-codes/openfast-cpp/5MW_Baseline/ServoData) - add_custom_target( - regression_test_controllers_openfastcpp - COMMAND "${CMAKE_COMMAND}" -E copy ${src_discon} ${dest} - COMMAND "${CMAKE_COMMAND}" -E copy ${src_discon_iti} ${dest} - COMMAND "${CMAKE_COMMAND}" -E copy ${src_discon_oc3} ${dest} - DEPENDS openfastcpp DISCON DISCON_ITIBarge DISCON_OC3Hywind copy_test_data_for_openfastcpp +add_custom_command( + OUTPUT "${of_dest}/DISCON_ITIBarge.dll" + DEPENDS DISCON_ITIBarge + COMMAND "${CMAKE_COMMAND}" -E copy "${src}/DISCON_ITI/build/DISCON_ITIBarge.dll" "${of_dest}" ) -endif() +add_custom_command( + OUTPUT "${of_dest}/DISCON_OC3Hywind.dll" + DEPENDS DISCON_OC3Hywind + COMMAND "${CMAKE_COMMAND}" -E copy "${src}/DISCON_OC3/build/DISCON_OC3Hywind.dll" "${of_dest}" +) -if(BUILD_FASTFARM) - set(dest ${CTEST_BINARY_DIR}/fast-farm/5MW_Baseline/ServoData) - add_custom_target( - regression_test_controllers_fastfarm - COMMAND "${CMAKE_COMMAND}" -E copy ${src_discon} ${dest}/DISCON_WT1.dll - COMMAND "${CMAKE_COMMAND}" -E copy ${src_discon} ${dest}/DISCON_WT2.dll - COMMAND "${CMAKE_COMMAND}" -E copy ${src_discon} ${dest}/DISCON_WT3.dll - DEPENDS FAST.Farm DISCON copy_test_data_for_fastfarm - ) -endif() +set(ofpy_dest "${CTEST_BINARY_DIR}/glue-codes/python/5MW_Baseline/ServoData/") +add_custom_command( + OUTPUT "${ofpy_dest}/DISCON.dll" + DEPENDS DISCON + COMMAND "${CMAKE_COMMAND}" -E copy "${src}/DISCON/build/DISCON.dll" "${ofpy_dest}" +) +add_custom_command( + OUTPUT "${ofpy_dest}/DISCON_ITIBarge.dll" + DEPENDS DISCON_ITIBarge + COMMAND "${CMAKE_COMMAND}" -E copy "${src}/DISCON_ITI/build/DISCON_ITIBarge.dll" "${ofpy_dest}" +) +add_custom_command( + OUTPUT "${ofpy_dest}/DISCON_OC3Hywind.dll" + DEPENDS DISCON_OC3Hywind + COMMAND "${CMAKE_COMMAND}" -E copy "${src}/DISCON_OC3/build/DISCON_OC3Hywind.dll" "${ofpy_dest}" +) -#------------------------------------------------------------------------------- -# Combined Targets -#------------------------------------------------------------------------------- +set(ff_dest "${CTEST_BINARY_DIR}/glue-codes/fast-farm/5MW_Baseline/ServoData/") +add_custom_command( + OUTPUT "${ff_dest}/DISCON_WT1.dll" + DEPENDS DISCON + COMMAND "${CMAKE_COMMAND}" -E copy "${src}/DISCON/build/DISCON.dll" "${ff_dest}/DISCON_WT1.dll" +) +add_custom_command( + OUTPUT "${ff_dest}/DISCON_WT2.dll" + DEPENDS DISCON + COMMAND "${CMAKE_COMMAND}" -E copy "${src}/DISCON/build/DISCON.dll" "${ff_dest}/DISCON_WT2.dll" +) +add_custom_command( + OUTPUT "${ff_dest}/DISCON_WT3.dll" + DEPENDS DISCON + COMMAND "${CMAKE_COMMAND}" -E copy "${src}/DISCON/build/DISCON.dll" "${ff_dest}/DISCON_WT3.dll" +) add_custom_target( regression_test_controllers DEPENDS - regression_test_controllers_openfast - regression_test_controllers_python + "${of_dest}/DISCON.dll" + "${of_dest}/DISCON_ITIBarge.dll" + "${of_dest}/DISCON_OC3Hywind.dll" + "${ofpy_dest}/DISCON.dll" + "${ofpy_dest}/DISCON_ITIBarge.dll" + "${ofpy_dest}/DISCON_OC3Hywind.dll" + "${ff_dest}/DISCON_WT1.dll" + "${ff_dest}/DISCON_WT2.dll" + "${ff_dest}/DISCON_WT3.dll" ) -if(BUILD_OPENFAST_CPP_API) - add_dependencies(regression_test_controllers regression_test_controllers_openfastcpp) -endif() -if(BUILD_FASTFARM) - add_dependencies(regression_test_controllers regression_test_controllers_fastfarm) -endif() add_custom_target( - regression_tests + regression_tests DEPENDS openfast regression_test_controllers ) add_custom_target( - regression_test_module_drivers + regression_test_module_drivers DEPENDS aerodyn_driver beamdyn_driver From b916b49c493569c4808a5f40bb92178b06f729cc Mon Sep 17 00:00:00 2001 From: Derek Slaughter Date: Wed, 24 Aug 2022 23:34:16 +0000 Subject: [PATCH 136/136] FAST_Solver: transfer of ED outputs to SD inputs This code was added for SoilDyn but was applied to all SubDyn cases. This change moves the code inside the related SubDyn block and only applies it if SoilDyn is enabled. --- modules/openfast-library/src/FAST_Solver.f90 | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/modules/openfast-library/src/FAST_Solver.f90 b/modules/openfast-library/src/FAST_Solver.f90 index 36b87474a..bf07aa04a 100644 --- a/modules/openfast-library/src/FAST_Solver.f90 +++ b/modules/openfast-library/src/FAST_Solver.f90 @@ -5984,15 +5984,6 @@ SUBROUTINE FAST_AdvanceStates( t_initial, n_t_global, p_FAST, m_FAST, ED, BD, Sr END DO !j_ss END IF - - ! Transfer platform ED to SD - IF ( p_FAST%CompSub == Module_SD ) THEN - ! Map ED (motion) outputs to SD inputs: - CALL Transfer_Point_to_Point( ED%y%PlatformPtMesh, SD%Input(1)%TPMesh, MeshMapData%ED_P_2_SD_TP, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END IF - - ! HydroDyn: get predicted states IF ( p_FAST%CompHydro == Module_HD ) THEN CALL HydroDyn_CopyContState (HD%x( STATE_CURR), HD%x( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) @@ -6018,6 +6009,13 @@ SUBROUTINE FAST_AdvanceStates( t_initial, n_t_global, p_FAST, m_FAST, ED, BD, Sr ! SubDyn/ExtPtfm: get predicted states IF ( p_FAST%CompSub == Module_SD ) THEN + + ! Transfer platform ED to SD if SlD is active (Map ED (motion) outputs to SD inputs) + IF ( p_FAST%CompSoil == Module_SlD ) THEN + CALL Transfer_Point_to_Point( ED%y%PlatformPtMesh, SD%Input(1)%TPMesh, MeshMapData%ED_P_2_SD_TP, ErrStat2, ErrMsg2 ) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + END IF + CALL SD_CopyContState (SD%x( STATE_CURR), SD%x( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) CALL SD_CopyDiscState (SD%xd(STATE_CURR), SD%xd(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2)

  • 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%0AE79L6&w>a85Eek zZCs{N3?6?&QYN;tCXWCpSqzGYLQ(0X{B=Uk0=}iLsh^q`*RvnvsU@gM>p(|cS8m4>U!wL2VB#F(?))pU5@RfG&Qh(Zob~$@0xN}OsuTb#Cyw2XMxDe^3aeU zcmbL84Rr!zeSuJr$&}qc(FN&z^LPs9p9Q|EXV_ z*3PVy4`LoCZ;(fwV%#G_E#1*CoetN!_;h2l8)$gCLvBy=J0d3;*%=w`cLiZlW}1hk zSBHVOnYMw*8Ay8HpWc3(R8xKFkn?p7wt9kP9UFpaF>=-sK%&w{?iq)$f6+QOf%|dd z3qWd7;Wp7K6g99F+r6Lj<_Yt08)Xgg{Q$?IGD)v?Ieq-vkU9BJSR=tk!qC2vIA|)Q zxiZyY?Dhooy%y`3THCukwGpqt3#PUv#AVR}XDEL7*p@35Hu2}vfNCzKI{o6>BD3?e z&ihXt+9I*^>pD2XcLOjtvqXwjFVC@kOR)7!#pz{=SU9~xt0hlxQFh)C`6a7Z8gc4< zSNT-T`rq@mW%pr9;K@wjxQ61DX7d3)K2yM`7_F=JHk z4PXyrR1-Y)x~(4_Y+mN?*>yO?+%;Mxe~+^cDYY9{7Xk`wd5k39-Kv)|=%5~YvB3~4 zHbP9|>xsoY>v7kDv(Gg>9^RfQZ}NkqZ+dLgpZYF;O%V*OX1hUEU6_K8J1g8ztA{2^ z_+TYov}#0}0nZZT>+lR}3IO-uEO}Tg7!;1{BnS|EPEi>Pf7hLl+%+;zF=bakLISm@ z%yDkTs5gT2-lFq_05Tj-`?IX;pcT+OCfuOGXkbOmoMnRMF3Y&;r?QTY!X|=8gd0F8 z<|l+X|IimE?7w$NzGF}xU_72=XM|{?O&TS`l;tS%u6|vN;@kx;X2m>N}g> zXrI2XWJ+d8sd5-ebl9?gaM>ow1|D4e{!E#UzF@_Y&h6O|e*ozdV@m}n-N=h3Eh8W8 zzuLXh&;NmS((*M<67V}g!2R2-|KYKko{fZ}IWIxf-BI=T*2 zbRD!%BreV+(9Dn@dlaHMxcEpZ)@-qWp)Xiiwetb)_NkaE)yOnzg+2D2_c$RCj4K94 z^=mlt?OzKyGORx*klN+-h)%idslJ8fxN680YmzG+wrm+7L05YLkQ>uuJ$BMSY_0%` zpu7q1wAABY##dmBC5HGnBC*S1`a^gwfdHlI*GdZ`!15vS9zrHzsiFdS$94)b;ohxAeypjeFJ6~G{VIw6kZo?9#y*1FS`%w}e^~6UF!P?uYsGqtY zE%mwzmE}<)PStL_v?dahmYrcv9RJAY%YtFh8>lK{?np^9~u`GWj z$Z$K|J`a1*b8^0?crbO*$9Jlyq~&*U=Q_m~f`&%AV_g4BID|_lXB*cww=w3$FDC|c zR>n=U*$zH=F15(C3u6__Bu*T1r4BI?ISy#Ul0OJW3 z;%PKGUJ7>{KVmdI-kN%|K%HLJIaQfnc;sz&hpBxs`#!mp+S#!p@V>C5{BU|fIgTe@ zM79`^_n|gb+CW8%(wwevLqo-}lqgu6Wf94IEeqq3g|wpSz`XqXxRr(BSO;7k-ERJ2~{64R=zDwV3dt@L0EHxVXmqEU`HyqJyOAjiz?kxG^f%wRI=lpcZ=Cbe5WJ}3)-gNrCS-(YTE+TBrpcRw6^0O za$SwqcIsPNMrK|yQiL#s8HDUH0F2;(dF#M67NNX~PsV*Wfvxk`>kP3;OA@@Eu-$L1 zBv)N-d3Ylh{?NQcl`3v86gR3CKnWs@ta{H*b`fHu z)^2p3gkozoqq{4HAs|A?%gr#EUv6uDT7IebtePJT|O^B1-_ z6{>Z(?}S#7^)(H>Iyb`RC^gbSCB9cIJoFOo4^+pKiDaL~ybUoAv5({|S9(hytm?Px zCl4~vqEDdQ46S5ah}v$7{sDxA%&LI=>M@ z?7}h9KBZ?_^0GheSCJw$0?)a;>P|u%w%t@4^;mlPY{45I&l<#OB63ieqA$pk!u-u{ zk^PUSdcX_lI`CI~=835*jwJM>(X1--b%=W#F9%e77r^VJVRjc|pVmDL5gsj$w`&lG ze?|3K=FH6OuEqFe77vDYa-t!FFyKDJAI-f32(F>Yfb$LqH~EfeiB4ld{x)#a(ks!< z$B7=3+=Cx}`-0jD7s|vBU3XtM=VdZm+6Z^R&nS#Bi6a-z$D1W;4o*mhHa4`V;r?~_ zI$k@y{W^em3(?CP3n`g8t;4%BXB3T* zcU1Q-=uC!O+jk?j6z?WNPo^c z6WLIn&+=doFFuAFbWvaPBVwRIFTk$l^dlln`pxTs@qt4|NU&C3Y=zK=&Znr0+t2C^ z_lDL@^Jj%HF*R;h`Z!!)9mhtOvrE9}=GNmK)Hlve=?2ZlRNDYh4hL+-7WEe(2XOz3moj-~nr6R>kt`ws8U@%FUf4$%z9;S)N2qNy45biNdBL9}?tZO7Vkgv|bD%iXm z&m2;Oo6wKxzpN%Eb84IJKzTCpEU-MCXvkYxE{6zeQj`rul}S*S;4`4!RXqP`dk-dd zHkCA8vhY=>7l*m6@w>4@xyEu2524Nw7vee(eIM>Xu0ht@(uPZ^u}+M6z*iwIjw__V2_jW zlKF!$w%gsSj+YcF2UK|%7kD;!_Bpq+}y{Yx_;ZI?zP6s6gU!! zeyn0Lk&J~DbHR;*8u^PY`c2)+d;FONGo!@KNrVWYPIPw7^&24M8bPk;(Y`u2 zkBoVKrf+>Ux$T!WV=V`ANgLSMLHy5>kdQU{@~iKT|Mh;)xZo{wfQ93a*4EZ%=flS& zwA2D52kCQVZ=>#@f@i|uVmaXcM;>^(hTCY3yX(srw{~s`?S8CNQ;(^8 z*~9jc`Dfbxjb*+$Rzeitj#RP7SudG$YC2Qzzq5pcqyNO@Hsl{$`Y(C^@Q@%S;-}K) za^5L}ooRHK;QGFcP@xW#?BCnJ%COZf*ceqYhV2QBPtX1Fz3C!>=CIk!btxQL?6)%VcE^=HrrwTC z)+y86J1-qwYfr=Zo1i&I|J+eD;EN3!D=t3m)3CcMa}7*kC((p7-7J?K!)Dwtvht zJ=IcuUtM(9-Bl&isJ6wE<>Q@yb#e^zv~R?K_zqUU;f#+R@gjGIcl2tvC$OlyF04%E zRQ5@7-4d^`jD?NiVCYUk_4VseAL!|)2`iVMD$u8cftiKXcDC*Zp(K972vgR2`D5`K z=Ey-(rF0n-wLD6^BCxilsJaF4xOGXZ?E48D_9Ec9B z#vdg-Hy>`7{_E?x1~O|4;w#A3^q-Upd1}h5t_p=wtp{>8H=2Z$B7$khST* zNiY2q3;*A&{3i>)zu$k8G*j-sjZ*%n6;PR<`PT)ozn(PsA^vUUFCqQpf0{1^`?r<9 zg~gcvX&&`It$@mUnfH8CvhwWUV2o{y9Gx7D^{xNO+8S8E!7wx8)8qe>iMb3Pc9!;*@)n~smGNW_%(XYDHgQ9}_wDb__Uute|NqqenyU}b zl8E%Or_}J#GyPe$-$^{j`eHlnV6upYsDXIU`Qqf@qV=$C;hJc|Ao|n@51QY|lQai>Zi-jc)zSUD4!igUhJ~gJhDAQ8GpP*tn-sl?1(KO$} z?X4|k-7H+ZeZBg-NKYf8&nINUz-;%_^j~CcS{%N7hzPoUGT{1h+{yVzt0<=o-53p|C42|w&o-n|=w7{l8yLR;*4}NKs>Ubv@y3T( zW`0(ra^Mh}n$VH6;hnjy+#9PeKgDH6x+TsO&+E_6@rlSyg->L|HK0ULjCR=B4v*6@ zb#uQHEs$19SA(V_U!xDx5SlkA0eV|QJ%Q(WY&=;=<4XOeMMEW~$G|cueJ1(-;B zp@+}!5Kxb2vKw-)cK8Z@D(fQHeFu&{uR36$5xE~qZ< zyuIRMCw3{d%s6jB@Dhswh}lKqF;T6-V)J?5ofp^W0~xVdQI=To6p@=f5+{G^TDWdi zk(M7kafZYy%m%;FcmHP3)D-Glg7ac+YUAt3zp1NW8D@r|tU;=1i2C@mIMO(WX4cv{ zl$Pco=@mM$1oF8q15^U+SB{*o(o5B)#y@E@#?QLQq&dBcmCAg1uBSDT3_s(lx9Ik6 zFs>&nkpjB)!G+A5Sx1&v_QtD7D_USUU%aIVIR@Zm9%;5HoG3f_jN54i)_gnS6o}Gf zFb;E|TDF%eSZusU+5e*Y*5C0cE2*>h?e2Y9+}FedB|!Q(L48rXcKxOGFvfK{!^&ip zG-OF_nN>cP!O2aB*>bbsW0mNo$=4=Uaan13jbNZbA2(*`O?j7jagN}vI6o0tOxBYJ zmbZem?6Vk9+ShucAh$WqeNjUvF?GM01QyLvvJ~%bG>^@|zL`@}uTvpqL8y?9x@miI z@x8O0P-A+FuQ@tX1Y)m3GP257^z3Q+ZcNICJxeJ`O<`&M3P%UpRY^~|xF)Z$?8DhD zmqZj#1Ntm28%EO7AN~-1AD7GN^)%s#)pJ7LEWvPVl|!lVlPb7VmFx6DK$Yge#ho(W z)6hcf+coXn`gx#~G{kcV$0%ZIK}w&)I{2k_e5`2I$C;Xm4)iUIyvmW{Pm)f!$zN&g z1{M;(6=X=B_wvd}qRNV_6Yt$Kj#l?zV)e%~5_UyonWms2?oX^i#y}eG+Hd{5ajiDO zF^Hb?Qdovc*;4kSYmkR=Ayikzl~RyMdqmbl+|SHGp+tCA9asBy9Dll&e`$_cn7#F< z6qrGI2Ph|MYF?lr9_rScq2}PY&sMY_Y5f$S3j(y@w7vr;27V?oH$p(TW9PFNCq1ru z6dJ@;i-qFFajOT~=BbaqbXQ?cjY-yR_+Db#Z1m+VBl?(>faB9e87H>aZ$Y%AwiAx& z=H0h7DcQ*jw-SirjWM@8Nj}{_D_iC6|Jr_6%0}n}kD5)tEiT~}Aba;|Y}s3n3MBWw1m1 zxr8QDVtqIi-V5J)BfeBFuls;QjHe*z3Mx)ZbN-3L{INnUYw!JNz>v?+xsc@JawkYTgW^g4(f`(~Y%|xE7R& zmn%);<{0^q0}4{~=nLuYmSI?F^;J}8;9QE~Ol-=Y2jVuu0}_TzEYia(R*Y;15r=%X zj%*4hX(G$A~BoQ{-iPIa3UFIni)M zl*UJQW`3U+HJ_e%pjZW~@ZW`8?NO`#gQTjuxb}N$sCkosF@#>aBR&KsK?3R`VGiT< zxV?QzwwXnWEv%d$c~#%Yo+ud1R>-<7sC*?}B*OP?dYbR;D25N6<~>2;RMAL9LaJl= z0G6wfg(EF3DGQ10{d7ElaztiPejinSE=ct$Ua+tJ(1rrab)$YxP-Lm**>Scn=i{j4 zriw-@ zUNxo`q864(kgby}0}^~guD0GToFZ0jSu=G-o=i}29w~{qFcVo*YRqnn&av)EhmMTt zfQMM8r6_Wm1 zmNdRZZx215*EBfT+Nx|#IQ}PxEhFxyo?}9z2*(NpigNBMg(a?gD*Php-g9gmPEiB{ z;?bMwASW+`^)V%q|C%7ZP^HkbS2syRi%&)iy)OEnc3(WHvb zMEgRr>bnmznHy&!#PV1mBQeV~W4eSKTE7a|FK|IDMJANopC!{R)-XhzC&3>XV_&xT zLEh!dn*9r*9xc+x0?IuP>LJeB0!L=|4H1i-QYqZy;}I&)I24eX7h3ubh#lnK0|0qH zwYW;{XWnw#PKu7gN-E*owz~-$-Ivn^IGlXc$X&SMS97FLrt7Wyj0QmyJz{W zcj9N17yCv=VQRw@xV8elJ9n*6&AT^s2IsF7u9H-PGd9Sw`lRM}#Cwi~DhiTDEEqQL zVzx;a0Z}#Wh*o}Ol@ntyju1WvOgr)+bk>)TJ?1o(m)FH6VAZT#LlVBs{Z)%?3dwX1 z-3#~@b~Fe5-+y6>`!z&zqUzLBW>xCWG$&G ze1iZXzie^-#BRKh-+}LknErNchPHVW53X<;DL>`h_DgBG(%msc-r73`hkGP1C+{gb zs=kobanFb~Fx$v0EL>*P46=HKfz6v;ENmN~&M`vDh1H?!052zXCA0k;BPFR-OH2oh zxOf}QrmnW+&7+FuJjGR-OV#potYbl%agY_-`kHw@+LwOIQ!lt?+CO(qL=uJDT|La< z_AT4kHfWS6+wR{Wx$L}WiXfkhd z8&<1DBTecXj9S-u6lL{}lF$68x@3{W8xQY+?YT1pYcy+*{d*|FD}mBlx=*^nX5{SH zyy=Nq44S8J#_3tKsi&f2khjOHQ&h7?R`qr2btd*PBw9~&n14sT_xx_#%EjW#&$1)mgV?F7m>WhfmA`}pG=-IETLwH^JRoTtoVwhbDLQIg}M)2@0ci?z8QLgam7=)dm?46N2{Hlv;A8Y$$9|AF4D ziA_UEUflio)YJ>I3gzkIz=dl)9lJ|@S+3G(utRirS&$*Kpj-}fUU$8u1TR_U ztcn8PV=yqGZ;cdoQ06Ob*t781vEi^36i-?bkJCb5JnvuvTx0e`4JE@L-P`fcV-C15 z8#z5RhYg|Cg6BmEJZVY~Xd1%XZolxb+2j+Ij#V{+5->fMvz{{0UXq+2*4;=})6IU| zP5RvL(!S_^ysVcxqJ03@4Q_-8+LZAqS4fn+SGY5kHYH3Wk`%D#Bo@4&Xh2@y57kgl zB_*QRcG6-*gi^*4jnyrzeU>;5y!0{wgON6-dQ7?O=^pz<3h5sS%ui;?f4F{Z)+?20 z-OXJ(DU@ppS!JXGyJ!F6?euu>2kq-jas*ya7+)Ukcc$%g{``Zi*zV;ZZx7S{ge?*AyE~i*x)6ikL5vS_+5A9T z-4|;^Qy#o1w<10c&~@)xb!|uUN0+u=a<#}bX)q^p1Y~iPmJS;yJ@smHPYhM1YX{|7 z_(y09H?dY;kO6Sl+O%ihiRrb+gUfI$k97Nma6by02p3Eykm)q$@BsDezX`07bU5R4 zQW}LMf6T?cjw#8ma<}G&+(f3spV%55b=w`%^Ff~0z9bY3krU8laOIVixwWSuhye=_ zZoQKL8IW}>n-KRjHONS`*$umUs(`6ikON>&ES-%eBmKP%*UiW1ZCEjE!>|8BDDruS zVih4OE2ai-N15-jx|t6+OTj8p^(TKPKKO_25whiz^0355>?xY}(TW!5G_hCmN$mTK zq1d;a@K8_Gf@*f*XV27^rb<36-!b=Tdz;?u zKb_nZX-mGG%TQPAJa$$ZUz(Za?jtFs07&_Nif^plpOiXgcf(6sQU|vkiOXR$=S3(k zwC^8oa3>~W5EBsl(iHn78~9ruciJl_q3^v`r*lWd4|Q|zUbF2B^%@iT93(I}J6RXZ z1b$I|K}q-96}Ntu+m<6qw_A)#L`a~6j6MC#P!QVH=FG!k%<_9DPZh{m|CRQt`}P!v z`$SG>j_Fc@9WD!sLt?rax=`-2zvDh@@9vCKXW)?kjoUl1epte{wYGS4a?2{~&t)!B z>jASM^IN=L1J;#6HEp>o?AU02JNy+@$12HaidtJ*7|7e31VY{2%=&VTaNBCEgf9$7 zn6i4pUbHmujf16Y(2&L9DuANmsjju0_6zp+cAUD&RY|FS+KHF+q=2AhPeMg&Qb?cf zIlQsa$v*Pih%0w--kg;~2VvV6iVw?@2eV8}@A<&rk@>?9QHyj!uiQLY&Vj9ND362y_)w_A07T9y|g zSc2ou9Vs%{JKVXjyIN3P1#2(w!GsZ=gz;8ZW;Dra^El3hXJr{9mN2q}&OAqZ4yG15 z%Wio%E%sljyI^a#$VqkrRdaexr(A6+!mjU5GcgxuxHF$FtM0NOLtF~d++Eo>yqwtD zD|7AHFAuzZbPyAWF4Z=?@q5}JNK9s|Z4%Z`V0#**rC&KsH)=N8dVEVxJGT6@HY8nv-dSN0S_+w9rA!#Px;^gpQ#N4d^s|DH%fi+h*;Jc{ zfLLW@VskFMhzbElu)Mkw322uQxab#~05D+o2Vl2X|5%eCePiG&>FFLOtNLIkP_>~U z1I98Xa-ey-)YlkpdNMKKv7$j0;w3`lEb1dztFH=AT<};u9@{xqnxYp?l-93+4GtUX zSp(SeySTE z4DJ}GIxZW-&VjG$C0HW;bV__qO}>teK(}Q#n~18vqtu1EEXc!0av6uuhSxLjDF!h6 z&Iewo8)s2WT5E+C>+pyHNNU;?C-(6zO1{fz9rc=H&P=i+)0 zdwZO*7g+6y?h>ZC@k^YK=kycRU3*V5Z3#?6X*8V?cir&v9XB4Ilh-1j)jEPsL9l4DeLhD}cNS!{%0e(s6iDP>Wlz^o<&1zQ5 z9$(9RK4;&iBP%x!_PfT|1cmniOEORpNL+C&B{bZ{WlB+3a3pd2qIyu25{+?FsV zxZ(=^{mW27PQ4>j%+=Dn>Ex+##Z%(Mrmm_}a{Lu*djlh^`sO&fRVkNEZXb~$h9cN~ zcwXR>9g|3%b7I}lRuEZ_40V-j+N@eQMzg=yw9QS5>W}4X@RL`ceNPdd^(@``bvRyPwl9?eAoD~L z0JoBziQV)_nIe@3eR-{4P}kT3KjWr?-?>&QnVq?qBX;Fk1M1!>fDe&~BcI*m|lmM$=v-LJ@O zr2K?Rpz)MS5SdF@E*gzG4}ps{;^sUbvji4B6n3w#Z%^TayQlX$96( zoA9J~eVaY#Ie1}cXgpYJ-Cnogeqr7(asg|fc(=E5_!xIshqbUl$HSx(pGXL(@A#3U zF|QYInfp+HXk5*o4 z5?EStc(k!cd9;Ou&;P!8OO)Uv>d=^-R}^IUlyUoGVA_#joGsz~`kKDZvoIeH)DgcQ z*t431`aHj?z-nd&12!Y>9Nv!~n4dp?`TOI$_HCVSZeyj@)MP4L8vMzB!aKj7(bLn* ztE#dtt4_dxo%|cOaK<1z-p5nw`GqYd`YJ9(ZGp``bgDFnl*O^nO|0fKRfWv#J>+$_eF@VbyiZTKN%kwefiL- zP1O~>pL0Cdnuh+T$3N=~x)L9EqP{x&*0WVG)3-N`h1;7NZiaj&>uU$=@*1hQiW8RV z%Ahb0!--S(ng6~L?8d#z1VAT2OhG2nHzQbRN;DSoEvzs7%s8o4+P+|^W}j1$b(b?R zxBMt+%SQUAPA@Zkjzmu#=gV&Q1!uA;<5+M=qw4a&X-8cahbeccO~pW68C_hJa<(}2lL>R_$S%%*2lxVCo|Gt=BE|b z&7PLrzntk|rREfFE9%;z5&a&Z^&HqKh79b;rbD{bFcZfEau9F{i@+yrNq%ddpL70p zmT`9SFKg1scL@OOTSI^mD-HHAC2170&l7av$BB^WA6Y|79Ox_Gp@~DIoB8JR1AhS|@h}+CZce zUttSSXydJW+phLZl$ET92CqvRe3S1C!O?w~$ElL?+IMHlzqc%QNg6H~WNRa3m9y+~ zgaZxq*v5$|1xbxhW&M7YhsSyKQC5r2>=GEwIz=B2ZvBh`sE6LR9gqXhB2as*ZKzSN zGZ+L$XE_1#3Pc>CwU?#A4paUjlxV^J5Qdt)Z&xnL1 zKUcd$pKsMmUBwJ^!DxSde3~2<$>hglfQZ)|C3=oNVz32lkI^qx&|CF+48D>IdYpoY z!|g_cSqFGb5k_j;pg4~mS6Ffyk8#XtGc{Nx78;?F*h<>5Fz`a)at!T-SVdWBDTmgB z^>JRcD6cnpSl5@VveMS!p%ZTwp1Ht9`IK|V-Pfi+Gh%2O#}_ZrJ=Dd^6Z$Ot?`_tu z9IPyR?OjRXYY*eybb0+V)Gp$ZI&h)b86qCTU{05Mt6aWH;gF3N-l7>^nyVz(N|>`% zQs`AEd9M<~eY7Rr=s=-;=a-Nj^P22-i@e1LTvy6sYG{lm{n8$M;1;dp(H!fkOkm!5 zFO{jb*BPP>MK3U~h4(QaYL&@~X;Jow2@;Q3`C);CYhBm6RM8-qgvY+D4I?2^Uy>Ep|`5C znvpvdg>}bOuA+qY?l(Xk^UkQc60U>j1y?p_Izs=x`bNXNe`GA;+ffdS@?6LwSO$XA zY!0p!9lsDTF?^n+B%thmy?(ZffgDY?nU$ALh>n3VqHF;IthaN}i^N;e6PuTIKW@Fs zQY^A1#|eI*rExyq$JH{gqHU+yc|2&p5w58)ZMnW2Q@yo|LImry=|zOe5cfA6wMTW> zf>2dZ&E#V`1#INl~Rm2QD2Rj4L272b#Y3=tF-K+|F%Tb+bxVvA5$75C~k zRFy>_12f|SlAdvsPvYk)EFhOu6^mOTb0b_-l(Tc=dA1S$3z!bLlXttzU_g{+5X=32 zVvxEqeKbp`Ytasi6AKwuy(0`GELDXW$gf#L{TR1o89|)s@89)7j1jnsl^H=l3fcH6 zRI_d-hE~L7!d>6o63A3KbQ@A-c)5B7 zzmjlb^mlWRkd~;+-q&ujwyHt@lBMdEM)L|B^RAy^4`f8iAa@SVn^!y`V@)vV+z4_2NiW`1{7xJ6zW=H1=7?P2kV4n zXDXxg^hD?Zs}!aozw~(~!nGyNa4%u89|QZil%cMY?Bxq+AI>||h5JBqqC{y^Lm=wT z6Jm9}vIK36CZ*n7OHNP!FH&9yJ4xP#)+!5bu~TR?o1IQ1anCf3@2md)AD$O29d%kM zyL!M;P4!zH zPb|2+f7(vmvb#diqZ@uSSQrpK*)a`VaP>O3Eaz>}K5-y#ZsOJvv7;Fx@Z*lij&Ep> z7fs0@2KcP*kG_w=tD^DCZETUXT1dc-;YgNQ1=1en*WhfJ`=rpLVgp~!s?#a4GGqLP ztOt0P=h)meBc6`&EAe8*byL$GD_u8~JOR3z&U;G8_o&T+NBmf+ts>ln5%_TTt$GWp ziLMqj418Md8L9IX=N^JW*6O>6jg5=_)a8(@bV=>VH{FkW{MvH~S>$_0Pny^{7V&se z*OXhHnyY-w8`}!r-Zh!!gF=F0ZylwjM*?btEuopMCwQo+s3|%D06e}vlLb9FkS`hx zU?bbUq!;eg^p?265vqaO#|*!#xsK00B)7kO&Y`z3KW2i=lkx{If4bNW?P_owfnYPQ zu_vAcxEJ;Jc_d!E5fdSgFNx+7IXCLkMYLdGhjfQDCqm1>0pMDBcs)AE!eV8$CJ+@Q z2P8^y=TCdkUvI~2W>6RVwtavnzG{_XUA=L~@a!~mA)!Oha0den`TkHTvFHtI5ciMq zBs0dFIX!QJBpq@7Q&!s%9W05)MF&+l)kWwt?kk{$Ev%x63Shk67m;?%KO?nw^5U4& zA@BTZ;Rrv`t0aeYY<~63E}k`b&rawpD<^k3!;Q;coT5KBOpeXolSf+<{MAFEa7#|9 z?h{bVeL*F0X!dm|8a)Lem4oL(ctsl%)Bh11>4ZwcynA#Qa=qaBam%J^EO%?K*kZ&2 zA7NICa)XS{ne0c1RO|TNz%gA(9?bd5W@wyxS-p?2z=!T}w|8wOwoo7bUmVLw%)=3~%c- z8!1DTRiC{5f-}R(8^l6ZV4WvW94pqq|C{LloOFhh80}j%Qq6J++{ej6lDBB!Zmg#) z(uM=NH#l9!_^5$Z|K41fc#2AaAHf?jo1r~mw7#aR_^TB2FYk+%#~Uk!{taI=G{jS1 zWm5o*t5Io5M@vaZ5$oNiqnMKVy|!B1r8<#$uJ>ys?+KB)Ur~0QI!GUx3+Fn;Z&D(4 zzVd@kI)Tg}hvF6%GNpOuaVOErZ)P*KNmG66-W_1Cv^ngQ10HfOBqu_sVKATcGqfj| zx3DLEZ=G2dcq8&96aX=K6>BD*BPWnjsqa?GKqjxCMSx!bpYtrND!B2iKU1NmU?ki# z+KU+S-3%W7t!)~&#b!aa+!BvqyT|5^CoivdJ_z_Qk|_QW5eZxgE6i7E6Ks4zPkVLxGF zhaEcm45r6x2s#BBI=jWjgoK1-tkYCU&TztjJ0&GemAx ztb7b_c@MKB6?=kxOdL&Rbxd7WcAQOpJt=+>yNlQyXVV=@b7k&a{L^Q=0j?#b1qjUHn9N1k1bUMNfNtnup z*EQr)Tl{mn?lMJSZLKe>ICnC$nA}5K%ZZsYvkbqGUXpz3K#J{RPub>m=L7rLt0sON zWA@|8*N$nzebzw6^HGR}@XBcqX$wAZj-_}kViP=H?nmRI0`Pq}Oem!L)vHK5&R)Vk z&T;~UCDT=T_vb=#pUe`h)rQLrn!;S$9r~7Ijvb!QvFo1Y4^Eo+`Rl{RiPe!!OB5Al z*TSv?wOdoc9FYrgu39aX^>;I2L8R$luFg&-kK^+{9ALtKBi7l+?NB-GA24%>0XGB3 zUR)xKFFwQPaJFtb#GL~u7|9%J^M~jIX3*<+Yw3;4QWE4utFyx--T?Chx+oJHpKEw1E?x@R0P4;)ia6RWiO5)Vmw;QYd#h3k{qVOc zl_C$BAOZ0t3e*`8QQo@!A15+zt(iTD@`-&Vd225d8<*92=j;J_9#%rlkfgVf00+}C%3l6=4y&i&z^`d*NoJau%^X`Y@F)NW|wcm zV|XpVK~N;Pp=r2a&P0}GfVI9_24MKM+>X2E_AgSGrs;zb5n+ISWyIW zbo|I8GwsdmU1qsrCzx}0aN99TE45fyNIE)Ix8_aI(e(&EtAc><6t%mRH~UUtUQ&@h zVf0>achE$fSFBePQN(Sl@yU{ngR^=kI$OfWkwZ~a#wC2LPi8pg;#MoW7dPXY;hST% zTN1P`9{UBKm`<@R{{QjJct35=EnJ6Hbk||dM_+y9esFlRCJ68TAZH}c`l1jc^r)xA z8RqthSmWapX@bDz@gMl}W1L;9PZ`pu$5~LWR$YdAN)j6kuCb-kUz-x7vAJcD?xkXw zVKKoU&CNdNRXp}_9BqG7U~7%Yge1k3%k_TXc1F(<+;903wy?-0%leCYg+1V+*M!ld zdz%Y^P{Z@fU9X8NuPn@B%e8ONbKi+}+(qvt;a#z49>Z~>>}9>4Yn)q-gT>AypDU)l zX~JY-T-d9zKt2>mWO>D{%xW_B;9uUI6zcaZL{ApRd!{?+MfFv@zg~${Dr5?lc~eo9 z*+%8ZKa0$mIVt*PIN7JjLYi`CGQQ{v5LkWd&!pPgfYJs{6wZG6PZq_#u4ez}m^Jfeb`% zA3QWO%%Th9EWc0-9T6JMiDpy7>)f3-JPNza$J}@y^meEF0o-}9 z?S5936#Wq80IWfP?*2#S(F5#ha&}oU-!{&!J|6k@hCaw^%)L8u>*xSsQANvgcr%L3 z+^LyZm!_ph^)y5;B*6~{VSlX-LWBBdjt+gOdLp{ySWpK$vQVPHcO@%MYuUL4{#?Et zzFL}mrKPj0D*N3G|6&6_EA#_Y2_J0+6Zk6{h$}?r^)T|I;!-6%VLjPFaBnb6$H#uU zo0|tj1hy*w1Nd6-K4c=j?fa55Z^|T5D4RU;W9zTE0t0v+A5>>BI%tLq1OA@~;6D~R z20b@^Xee)}zbYYe|D~ClHk|q;<(iN-SCCIsnw$`yi-bZ$iZ)`(cdz~GbzAIILrnw_ z>Ge@A3xKMxa^aAU!Fl%vHtb_&?Lqy&xDW&3;wK0f=2&|kAYwm0$fi7BqoA9mfs}mN ztA83ZvL#EJr{mB?>-tTyPTDJdl(A(KhY;+@{!zjTx& z6OcDeyq9jF6I}fl9gXZng4+Wx3Yf`LSZDG74DC}@o?LG;^CBoMC~xs$=Mxh(TC9{ zVBVwYjJujN%+}7{rsA*boaY@9xMvRk3=p~~PxpRf-61Y9ae+?hFvBx=%jdc5Dq(BJ zbg@U$*=1Wp)~plb`~vUMsnhb7ZYB&V{aL#}H0pdl( z2F6iAVRlmst_=hVy~;dxfIaH7TtNU^1_oBThLxw*=9ByJGPeY0a=cXj?ldk!+gr0g zg%cw+a9wk@IXFQ2H9&UxPB43R6=|=g!nmm+S{SdXucy2kA%?E?A;rY=RrHgHn-D&x zvOkKG!(^EAgXZp~JzFU4Y5#zp)LHCjYV*n?OQT#E{BC({APIs&CEB=UYAP2eN0o*r za}VZ=`Z3d`Xls?s2+`gh&%~tSHZye2w+Pi_Z=bG`k|P)?^RkO&Z8X zSB^q8XZTV1z4Dj)6S)+ zFf2SKpQnmpqmT4FKem0fOmH3G$NA<;n6*}V?u`W3L|sd&;>y(Ma2+33o*E0I?w~PW zc%QG~HH8w4qY28~b1;1E_r77XnW6m*GJwo1%RSg;Z};#PCrExd6+C~Ln6z{;>9!QU z7AUEuG@DF$u>BU@C3g5$6A>=6(Z$MpM-vc}6+|0hV{juQrWr9k%}9V;cJSK+Sx8N) zk6Y#EEBGrV2$Mx#KO8aCdoNB%pG1bePmw;AMEx@jyq` z9JebGb8L9J|E|*oqrzkiuGUr1I*n^_(Dl9j9Sg_84!~@xv9)>x)GnyRpR6k+P`Xm9 zBrD0YEvqCXr&XEQbo^0Mui5KK;9ARP&6r$lvbzJ=H8N(F*kovL-l(-qU)%i>RbM5f zWPSf8=HQ_Y8`q$FX*Q)>kypq4iUzOQw5>htezxj?r08m`C0LQm8>LZX&|D2Q?!8G^ z_u8ITeQ-gz@pJn0dmvrJL;Q>7t2ejj6pKvlrb9QxZ(Nb@V~V(w+S8(!*BtI--XFjb zM+#ag-0I}LLCYv41(664=Y-|>q03khqA*E$+d8SJMcn3nwqv&mWKwVB_YLP>QGp?- z|41AxzV2_@JKvL3G&1d_w+Fa7z6lw^adiF8n`XN{j#O@2w94zY6}DfR%`rN>=(z=W z<<_YjFRrn*NTZisO?xRVugELCn-vs2tOYLns`p1ixxSY~y*v_kZv&?GmF*t~E33ys zN+KH%Au2Vitb3|+5qDgvp=tu;9jApw_}=Yl5(Y=Yw7aPPeEB--9QqT@i&}E)0G!sR zBV02sBMB#P4h7P2`89LRe8BizfHA4e)B67*BYl&Xr0B@Lv2^VO`NT#& zH188iPu=LURQ^C=(}8QMhmmpjyh_~l{W!YX^Yr?7^u>hKxp+NGH~HdrXWLy+{;A*g z2W5dPLaz@j;Gm1jlZDFX6u8aLMviaYTOhbu-qDdV#PCfsW;Z{J5ak z5;?tM={IjL5!w7p!h6_hs!^+*`H0(DQo^WKqR*R#Uz59A<_)a7T)a`9 zlrzhZFNak2Azo^vCSKT&W54;U=s6kyl0%eTob=1X$FOe#G@~#;n5_6-!D10=Okff9 z83`;YPY!PqYcw%a-#PDqMC(eWl4X#icWU{ z3k7JUD)YOa$<*MNTG}|3W+pqP>zg_zsxARFpr&~d-L_fX>;MS`xxY&z!;ZDC)!&y* zo-OKUlZ2dv`fyF5yEOb;5F{M9W}|Ui_0diRO;Ziq8ubHAN95VFN?-LC`CSvWGU^wd|wszVa|TP1FF@*|pF4 z!bSCAlVD4A-!=~|TZK-?GO?7h^#d)3MN%0xf0-N~S{@7dMQgM{S@(_vnM^jDVc6g( zZDMT;!9yrV<%4r^)!ULI@5Z3^@$|`5H~UAiTSAEOYs1z|Ny4SDn+%d(^ZmEHD&X-c zDx__qVGfxEt>ZL>^^Vst&nsuxRHbJMW~;O%=~c$O>Es!4r~4Hb#B1Ogl0&!nsVi&0BqGHgm&p3#(-QIB=`_GB(>#-Z#Cyf z*R@TJrimyX{fU6xU_CiDx4eHFEV^5?hTi;+D#&O}WxF6dpplRG=Mh`UXqVdeRnl}qGtDxp6M{EYbR zk6}Yf;a%wmUC&vJtuk2;6AgM^t-rWsw`v$?_a%FqmfsliQ0WG~)bi;SRR@>n`wzd3 zeKJ)TD1({J4WA`Fu|$de_8lk=?>&`=nq_UEBRj zoEa(Xwx}3$%5?}$*&j#O9e&shWQ`FRC9C!55RV}EK^4rKvFP(WGBuAG1jrNRpYB0y zu^vw2WbE7KWQ8i&|2^89JFrARCl#Nr^VRceqHK`hKI?}(gu}Or@HmVF8rbshlG2Y3 zrG8^GwshVOtNnr{IoUVG$e1)aK|Ygv0|kHg-MlAm;-Uim=q}mP8ZL^tRg>kWDnbu3 zqb7(Ix6RZ{>zS|0S~k;rX4IV*#^y-&RjE_f5Mv2}_!UW(jN6Vm6uAj!1%jV#Q5GC| zPY9XGZ0+Zrw>6ie2cmGx`J?q!89p1<84IBHg&pa@gS>nLlWLe;o~q9ETbxb{bF5uU zTHxWmhc=;FnxNf{yt+f$)K4>t^T?JJT$YFWC?E6>?0%S6d3gycnGRmzg&Nce)SA;M zU|Vq`=n?@k`|yjbnBvmO&)fl|VN=E5CEuhQ>yQb8< zlZ{4qf1sTlbC|oyJEjT7DSNVTC)+slp^1@=RT~S*6;|p}_wi(){S6*Vc84vnlMvor z<962>K=WmbUQ`mgeyPc&q2X@a^7zTBg?~C?yK%rpNCLaQ+4=9Fehz}|1IZwNA!J5} z*V$i7O|;`R&u@D=I$2&-RERo)un?;Rfx(*?!rR?+8ygZQGqVb0?bJI?SeGhTaxaz1 zD7D!=-pS-1QhXh{+&jH%r?VO`oS+R=Xs@v9)oN(MUY<}(rcE_~~+>U=G zCV>Otlc-wodmgihYj|R2`ZH1xN6-61MsfE}je}&$)`N>CpNA$0#hH}7P`O-y8)MgK zON&%3FV#i1P&}ZtgQnqqgf=`pS-oVq4emVK%^2A(Sp8HTpkDn5OrP9|cv zyebpN8B4UEt&Ih~!WZAGdTbpXW*vhM9Ikyhuu#9SdyRI&^KAb6&P_pi$(t)g57~@u z<&$Y!;FQi-7xJ z!BLDF1_d<0hQs2251SK^G49fKj0qH8{B!+Fu!q{ZWTFt-_htJ7_pzVv<2mN4=lO6w zr|5o8#MND>@9-xLeOLN6HG8Z~X?vq@R+N8qUeV^e(sG79_*VK>rthMYze+TQ75wCI zmP}U65!APnRhq_~ieH`QeTudo*a%QqoY2@7P51x{-uQs8pw)t?tnhfdhQ)_Rmt7mN z+DOYvW+vTe{dZe)fO3ev`F^vQOIsyo`5#<-LJ8r0wCG-YB@wHa{1S32l(VAjL$s5d zoUiay)F|{G45R{Qa?~*t&M6>lLH9hd7&cOa&Hk3FAa0}q`Jgn~Kj8>p4#Sn81EqCs z>h0zxIXqGli(iP25lEo3W@3%(khH;9XxhSWprA_%N$03#SW-oR!K}RTvS^a7@Hid^ zsKxjXD)`KvHWldrToM>K%mvM$)jm@8ITFl5D94pWS8ejq%$e!(ZszLnU9`)@%dX zLGUy*4uk}kA!2wu8!fZ0X5d8!WT$IO?`UH1MiSOog6S0c1`RWBl)^myH0AG@(T(uW zD)__V72g3txtN0>QOGZgs`mss#N}k`vd*wYk5S_=cY^e{_ccn|+|5ZK{Vl{xW!Usv z-@s46V+*_mjs2MA@iAtfNpqsnGiUk8$Sb4sn!%CZyz%Fw){#kwjO4SBBJ}XVA^ys7 z$A!6#|Hax{M%NK5Tf%0?5Ibh(m||vTW@ct)<~WXHwquT&nSIR6%*@Pm%nWmK=iWE( z&U-WS{rJ{8pzc;{mDE)w^_FVOqoVo&o$2X*nr#Et!TDv$T$wrAb3%Dq;HD|u03jl< z6TiiHc>o(RPM*p`1VfTJ_Ztj}>YBdQ;agK3`DxR`jGe_Nx8O9siXE3#Z*kV}e`@6= z2m*jRUwVG_mepwuojNRZx1dbvKjq1kBp3*q_!;x!cl#D?_T{B>v`|TkK=&(iec8vo zmAJ$TzXw^>?{9q_w02*_4||u~R@hHB8*kGKO=hS?ohPNDG70;zU$vKrTqaH!>g8y< zNRHi|2>)R?{T7^f=CHBdrU0C^Q;YNumEru%&#noLw4keM-;G2Zjv_8C^m|toUFZF4 z?n=@yZb{T#)HTEgwD1r%@qjvF0dP)7eIt4N?q!g(jw1RQdF&nQMyFqVNw88@xj-t@ zTW$=38z|Q-;%ACVld-QOR@;$r?)EHzxX4Vv(W#JI)UdP=lsQ# z$U&o;rjxdEGQ9P%`uh5DTX#{tr=_2G=+Cm+tFt;+{7EuVvSSbAyk8NE26fSm<~urD z7YCO$4K`h7YkDX^$mb*xq#7|Ss0wjP&|i=;ayHc;tlLX!<1)h{(m<5DPmw9tfyoFk zKl#({*!gsYgf`YD=0~TM?GM_%_feX{?D->GkE>9Mc&U-`fJS?FPtGkJA=W&<7c5?q zK}G|vMjT?Q3N9*Sam0aPu2nL=rq;~CgP9l%o71Cshbr{YO@~E<(Qv9ka5lAtCb8#hBdL1PjnMjtGt$r z9Z4Yf0vibwlUqc;u3Lx%TgE!Ax!*fE8T8$sO`5)QMX*vqB#_N~&4VXK{U(y7_;8ZC z@fyax0Ui=fBv9u8=sB~ZK{jpp^pihAT#{#t(J#|_tNSRFFAbA=)PW~nF6gd9L+(N= zQLA?0ounomq-u>i+Ry6Wl?9FQGqSQV9qXL`(>|8hlNX+_@rEDiC;eIAg}KV5 z+M&DG8@tKMEl#NoQbrXSNx955Q@^PzZ>R5+fPw#EN~27>U_-BN_CU-s8iGc)y0E6(Iqb-%+2-PbJOyo!@%gw!jyyw1+}L`_j2d^m|{}I^+{rS zKcF~EJ7E&vCa`pf3z)mez?LB~ZuiG0X%>^knF!S@T_+XMD z6H|xnJ^__+9VH-xj+*$fyi(bW0qMPbYOdr`h0iz(xW2r0ubaVUD08{j`V44Id%g;b z&uL4&a%S+riUQd)|90H^ENg2-CIL=1r{94wwAXR4e}TcLw*yI@aWU_P4qhE31N#Ce z+>p!wHdXu5a6lSXfT!+&4L2ZdJl8_(gx5WPS1mi-sjebB`&f6?yt`Q|BVcS zgzkCGK77qa>wZY%ceL-n=?OsI{Z4odlz65^?I@`X^tlalpmm>rwR=mUM5nl+ZY;6_ zu5l}SV09K*jkBPFB#V$9;q`J1=sD-HfJ_WQd1k6SAfYaRgmo4P2vnnT-=g_^W!6~k zS|6RyM>%6@;MWi$!JI?^@_35SUm!tHhV4e;6m*2FKSMd`mrFNtP>c|!cCfw!-k0Y$ z%f4$jZustGgPCJD*z-HPA64-w`5ZV>{0k?1d~!0kG-aHyFSqo#luaRM&(rjUN&G(Y z{r!4vFV&SnJvP|(M>N!QQJg3);io%ksq7O-Uj?i(CT8Zt8X5Wqv%(eHRhC&#V4o4g zG*kcK&IIwZnQyP?`X6)=&BwKiOAAVJYBaBk0^V1Nw{-KWrz~cuI!a(d z97jt=$me1gD4n|k2!8Ale=@$9p6_{|(j^UF0IgQK?A1Wr+cGx$?7LoRpt+^lTSk%2 zG@*hoVWPZ*H`m&aq|3)7$7Xy*592}n?DZ&K#kcemndD|^CE>A?d5fQ+AnxaTsm#>Y z_mV&7c{7sW$e{hh&4fbE{o+^PL0Z&y1db`oRV+!UK~^1muu%O0?Wk*OTRww;>m$Kc zU3AQmjEFI3LYSRXWR;UMdGgf|FRiA1lI_!pHO&aC0kg&7oiobfZAwfYFKZI4hP$(K zCTK<89piMwWC`wiQo_H~u@6jIgh=P%B{6>}v^rbRp@55pwjt|zZiS!tb~!Q~kY=Iq z=C*v|H%-}`oU35qHzRH~w?|Pr7N>X6$a3&VB9Yg8LK8&ZR%FFq_B{TkQk3idNSm0E z(@x2px{0(FgI&R-gKxT5S9O_bvqfqGs5IECn;$N2?@-5$_zao3pv2!=7;rL?hRY4W z(@AL9YUG+oyYJ5oM|5OPbvVCiIYuZ#>EIszr?P-Of!vv#SZl`Tf`C|qrlo_+l!$#d zI=`$-kt`{aufV!=Qp3#tdw7V%;UiBc@-ffuGinv{l;*Q04eDb)xmgep<;U*;dm$nF zx=(hRs77bcUv>J#eDJoikDCr0k~L`aJ&&a{d-b_F0s^9KK1FulIC@j&=~R=?(=`-z zzDQ!RAqU|6n>0`mg#{%Y9XT~MIEx$foNd5c{`d_kbkW>fT_I(Ii z7R>vOACHrXzo3 zPB~N}-7F?+Xzv{D*q7w7+I4g%9umR);%|TSFMnaia>!EKm>5vmuS4?$g0?>K-La&q zGB*aEcPNWU$%kytvf`jMPkSCf&~Ydj-~~a~BFNgeJK&t2bRxN9@$oq4?cAnBVC)ry zOpogCIal<1yO()35O%CdpYC+VD#&a1_phf3@Y3(H1uc)8PXluOFw2UUxT|#Qt=G4k z&Xj=W3Vk!^9RKiMU{7E9Z)NN$A7L}vvf}Gpe`$lbarvbdbgC}}R}gG-$ei=}a3<+FffV zf2dU#=kwISB7ZgA;KJifuXHof9T!oShDAbuzIe0uJ*Jb_Tp$?De6;;Vbfy)w6mWM`zLTje_$8EcKDys~~ZGn-6x!u-D3@0DUb|8E6Z* zCj*2-!>oz?&sE9o2bNeW2*CB4nwnt`q6N3h&Go^6hmPf%p(D-8y+t;=bOK5L8SadN zGBlQn!T$b%0#koW+&f6W92u3f=g%Sk=(2YNLGQf*&<1}e&~YUA64`Wn*l@=UQ~L{l3<%{YbodRKEZml;P)N~fpFC9m7`iyN;->8zSJtx69KL32ct&{3y;uvo z*2zCd!>JQ;$o#Q``oeZ0j?2#TP0B>~U4w0`(v3;V=6oO2SA3)6(~?)8b&@awO-nb< zc6>~N`Vg-qeEERUqr!aHG=*0!_Xdc=(|F2Z$vwbq(#em1)>0tUBWPzDbGB-E>wNEO0-3?E&+T4%r zJJyWLEhFJBhRye^A1zXrs@`;!ZwvZ51Zh*LHQZKj$=K#c9v;(F>6m0+s;g#@=u(;Z z_Pn(wkNqODW8~~!J%B35>Fco6e>;_$$vloI0)nN*<>`^qmSF}w@jJuZ#?4Fc|J=wR zc@->ahB$M1wcHo?brGYdp0E1NWz=r!!|q54mrrwd9SH9=8?IOb!xh#?POYBF8jFrw zIIz6<Fb^@sJx3#$)1>YR%kI$N6kXj!?V4G6p4f3;I>o7s{hqmhTr#_Tk z_h&2F9iH1Yc)*sWbvCcCZ-7FbCm1mz1Op>Zjdivr+`-&>OlZvs6;>xW0e8}=LFZqo zPS30Ea8G(`vq+Q>?c=6q^}=NGeFgmXdDj;jhIIqB?!Pm0-1a|KTZ57tx*4N)KO{>+ zDKlinsI4uK3E`QwauDJ1&R7!&*+<;JZL~!xSLdB}pCa+NwRF4MHYPUr{tO>lLej~J zcXMUJl+`vV!=C-qpot^WSm4!}Wpa&r%^UcxA4lOpVew8}+@E->(rz+5c*7ECllLBy z;=AlyDB#MMDY@|SbYdc(Mew#F>+}5VAn+$3PCIn%8X4MR0im-w%JFzbe>}h!2}=Uw zUI?RFU@+u;v9YAAosWJrad=PKy{PWy*pD0kvRPLzD6f0zCi3pR1Lt{V!`gVk6K4G| z1BszSlLlw9E;6x@NY3l|?tIqcKwcxY(r?q3pqcB~-2>T2WSB$ia4a0pkMZ+bs6Vxu zy!*U+RzDfpZeTLe^}*K8Li=w8qSr$Na)XZ?0psUwz zn)?RVE8C&&IFiV}wfg1#BrOd!7r^jUap@HB8p)b#%Wln-$e)5A5gfCDz3ZV5YP(uIDOPrjy zG2kTFr{@1XGbhV`X6CeVwKb!XR~C~cRy8xRw6`)bvL#kFb98Wa1)Z>S{L7Z&1_GTVN#n|93q43A5fBY2=yt024=_0}D=-rj2KJ3U#7@V^PRYnf3CbqtVEX^aq3G;j>Skj0|CeBYiA+JPtN$QaWn=o!5A-j!Du`)S z#np~Mo|v5l#E9zb;!4cQ#rS{WM&)AV{C8&5_GCGSRn9NJfC#q&V>NtXoA?l7fyS%G zSVBR>NK+!yK_`}Ic?}p;%v0|#e#f!61!-!ugt&c#aXUA0_!C3Y@vk!n5f5#sjYzj{^*n9T1`baN76fAG3F=qI8i_U1B9B6H{3Nh0&-LQNub;_4ZV zRjp1WUp1)yXdwo>jYs(o+RVdE1NadXwO+>3hAnTpQTZa$-frFTz;KK~AVD7%{yXcS zkx;hV7$H|0>t`Z;D2?71%|ha8n7*TZV6IqXiUq%|J(3@a7;cdr37 zz+meB22IK~%N3K)SM450@ObH5AwGO(|LwJ|cALczJpeFkt=g3r-ji$~+{w5Nn~Uy| z>R11#5SoQ)OQu{@QS#7me9P;C6U(0wJ!0Frj!I2bf(b@>h}=R9Qv+O-b*4VI9OtK})Vx0Uw=Q#(t#VH?a9c1AKo1Ckx`n{|) zY!V97HLh*4%Vkk6YY?5fEy|w+Z0z_b2Q-#6o{#4n)vxPv#CI?wwXD0|*?UqV+VBaS zU0g-PGW?NXIK(rj|Kr;~2Au}{qcWJa*n02|Pz{iQmz`XtH0{9}x$$NuFc;D1lTPFu z##X|2*-^rbEI}c9jtXbrc@yE929L z!z0V{44>N`+7Sm*!yr^1s!d`UeANt!nE$9P)m?M>A zaYbj@P{Sy^+jeqHeX{#Ekcg=c?Ei<>;`;y8TCD6Gob3Okm1ZJlVq|1vV*dB$JM)9{ zO_-m5Xnx?Iq?MvbIU5CIi68!HhKdRS_cd~Fcmy>`5W-w>?5oix>L<&3sv7C}>>rqm z%H7%t@JYi^Zi1Vr6$=$~njSXLG!5DX1?ox&rX3%C6t;eL0dLQz52r8w88>5GhZ`;v z?GI}%$%h*xaDAavgrYg)EV%IDGpl%&B*qaWca0U6$DZf&sph$*Mxvw@=htk}-8WBo ziWsO`RR&8nmi_Qq6@kU-WZ_qI+Wz}JZ~@$zqH{ILN8Nc5Sao9`rp@l4eNG@~wGf4_ z>*~rB1CXw{A~edM1{6$Yp{^&<)N~u#+AGLcxt_?3k3B@%-NZ&YxS2Nq_JRJWX9P5u zZ5@TaVOBV^ zPj%w6u$n4;0vRjwn#5+4=mXdkXT?Zh3qB>r-NCyy`^u52f@NRNHlwtIQqf4Ja%oP& z=eUJeM1ENbF*dvGD)1xRK(fh$Fm=*RFn>G-@|-Vn;DoRT;CSfE5X02Ma#(XJ(t%ZF z20xzhNr|8EQ-9RSFl-%jbJ@8gc5W)8$b1^0Yu^{1-7k)L&eh2R5G%3ui?~w}eVVCHmA$X&d z&K%b((H$lH2fiU<=Cch>+HB|PEAN3M1>>8+#=V!z9&Z5uvqmFYFqJ3?yi%wz`a4VD zIU?}Gt`!gNnSBeGIx z&j-8V!+R?qsN{c?qX2zHsCI2IEq%qR7H(4_`5LzeYD1X*)6d)fb@-iU@+~tqPL63uOj?Cv#&jPxfxJPn#!|dPW76VM71w*ADA}qwRc!e; zC5;}d)>%Gwdo)SHfIyzr&gXB6m6Y+Q3QWIXMwIDug``pYzsI}i1 zA{9VZK~aDYLhQoqO#}?c{}{%8BIy5*T3vo%go5LvKb<1ee&))5B*x$PfB;c7?_rE& z+omrJD#9fyL940I$ra+vNxE3VxlO6nWe^(WJ?g-W8@Zcu!{g5{mt16JsO}lK2tFAl za46PFGjK)WD%J)kfx-=y;(E3(UjiPidT)aK-M?L4F+}?UcQYg^Js-M}=}DhYJB_Z8 zf4uI(*&Ku2Y0)?821+9yelt#&cz^7B0xM8d<->`XRr$fjM9oFcMwh`%f`eZ(oU@j5 z9UdRzx?M~<6<4F`T^W6nx)K&op-_@0&6?+bP!5yIceq2bxh6xO@u1+g?GVJ7>?<2b z`5pGTW8s!fY9l)TBWTc|)w4HsV!n)fMWa%)!}d6?KLV59GJ~VlX~4C@w?}N_%B)~_ zAPGGNM~}6%+R)TL)1vRvNW^8GtJ1cpm*4b~SV!Gl+*@1PSvi-DWCIlo&x9T4b15lj zUK_4P#U{$o9c+T`V!qT9GtfFPd!IK@VC#GFy>Qz1-l{Y%`noy8=F2MD`p^RRg*Yt& z{p*86E^FQBuE{dJ=r3tJ0JvkFQayf&tv{KWg+&~vRtPill<=I^%$OQH5M#h%xHuo-xJ-SOh2CM)K$SpR4L3RBSv5Mo zPoF&GMqdTr#tKud(`JuHClRVk*)?pw>m~+5#n=n0d9#3vsC5-{>}rzwh~N?MdHJn# zgp|*nJoJrwj5{>fQ4?$X)<%gUuT&uA8@RFV>S88RsU$;3Axz5Y;^jK%ji{akiS`RhMAbDsUj<0c0|kBJy$4zg5c5< zf=qk}&bYiMv}X{`yMt2zc>M*riMt$$@n_5l$||OT7WfaK>&W&x_DnHGis0f{q2z{8 zMFX)FG@-%wmx4lIB!yeUoNLB(I^Bhb5g~BCF?jAf^}`uucWRO@poz9?<~`b5NYr3) zt2B+Paad{goG8>zZx^~b)PGHDT`*h>{gbDl6Pa?n-XCwk0lO49e`)K28lX=APUbT| zOk7#&&!`ttYI`(qwLhK7nH5^*pnx{L@YU?ek0+8mI5f>8tAmE`gPpX=)xG6{AY4=RkY7;8txt zq_Q%fEK5|mbpp0`mR=%w;HD+Q+{T#*B_^Qul{b0L)ngJ!vTbh*Z`nXtNI9TxcMEOq z>02pSHn{J~Mkh$dXNG=gd#gdxUs5~RZ=b%LSA&Olz!oeBa=QtCU=+<{FskfWS0kR>;CEZbw2Gt3~#C|Kzh3 zr%+vRLZ~>8Nrj+!_)rV!LN83Y+>~a4xqy=wZv4onTjJTJ{Qk)Kk-DoDDE$c(6l!?k zTB3$soI82L{jr50Zj0lcFQ+FsRm=CsY~#4qXFm!O+%gioU98;o#Vi?Su9gqI8GYF(YE$sJZ3|=TqiusasebWAY%KJT zr}9ZT3&Rq+>a{~In;Fz2Yd2RD)a2n5-9oHPs_B?uKBlSp1=2-MOusaQAJktsQ?>2n ziM}NO6YZZ;9c+Y{$RBKF0uwV4O8fRKqAXKe%{(CV?vOesw+D@lSkkH$3BWPdYQ6xy zH6nD0?_%HQOsXJkj_n1tdITSB!O7gqgXs`-oxNc9y2NvdmeUHMigTz18!qfMJid2} zdC)~F`Pp~<=FwvI<>swSg1*MCRm>E|6y5mks1XxgKCZs&{A}2>?oErrIaaJLwbHUr zVv)HSB>B~y(v3&Dl?iZYr1Y)X&gE6J3#lw`AqUwl;xiYNQSI21qEg?~S<)}6ssLw5 z8eYDe$O{+Lx7mv@?6h0$I}iQr_sB4%58|2;w5{Xa?1T&pXMyOm31-hyALgDiBlTrd zD~azMNM{ML*YRdbt0~|S=s}_esn4hAJ~3(QngQ=|ovgogIZjdWAktzMWyKKL!Ue7+ z9ObGb1VT;rpan2l5gS7KDBF#HwzrY0;gfehhBkyDA2BMD(0oS30>EIrC40sI3v*0Ewj3G93vD(&tE(e@l^zg7Z6~{qK+@<7 z^*D|Zq~E{@aWY?&xkJL!a&7B@07qL?gfKBJI^S7D2Xmh3TW#lR7F$IM%@X>^^$a{X z?brXLjT)i2?Xu$}E&M=;7K3C-cpjxdn;S0ggm6E?KPA#d*0n1bywWdHN7w|{1Y4{K zQB0r-mQF%$oV)}r;F0YMVF_MM&;(aZT#GEyA*)=YLfc=_Pj8Q@Lxtg+_ZU490G0{; z?l%Ig{MadSFx zV_QL=RP^G7j2bPhnqjO{LjV%{-ybDv^bE@?l?`K|3PD&!;){&X)&y9=m+v92Pj}gA zfvaZnx`CWXAsQTE1>HvOvbAFE1=>naXvQSM6=A{cDM1nJ8KWsCd!kS=L|bq(?tzth zQ#R4@Gtli?L1g&qqu+MK@cht*sG(V5Ibk$EtBUF{7Ik$P$QEHx%K6%&ZYgK&< zo~J$jPL=D8W+Y7!=6jub#N-1=j#{s7Hx8Qma3?RuSOQ-|1o8Bk4-xDz8?x-oAQsWb zHwq{UPr&p3yhU-uXogxM@1h5vfs#ZcCRZ#efqf1nfYk2Q8c$)Kd2gBn3lYXcw&L~n zg1T*z1ur7D5SsXr4y_*YNbP9}?FM!lD4a|HKEgmMpD~Ytbo3?|R4Guonm%n+ODj;Y z|M?tm0-|^Me%toOvCwOjCcMt}cYc2U=d{9$6mP?m?h@&nx%-mSqVSp=M+1i`70vt` z+s3^Z7#2YI0EKGgq0g2U%MtsQQ8qCTNFnf-kW?QD6?xnnAq=@3VXAS8bNk4g$A7HA zx+-_bEeAfpSC(*j7 zj@9;DDvZJ=IC0QOkKqqbbTUUw{i0bk>y}znz)5GoMHk?%{k~V{J87l0U#Gj5un%LT zrRf-?^3VXx?kiz+V4K9*;>%kb75kc@y(4}w1{15xyT2t6m94g>LsC6 z2@SzJWc5mX5eEUb9mDWV2q;=TD+Kg241n|QGzp0F>%VP;=0O?bvaXUe%c>a;AN%n7 z{t+fusJAuPjTI;$seb_TAvEPvQ5OKV4-|WUNwAB%e^6=Hx5rB>AMNB&w6|fb!l>}) z_~SvY-JX1Xs}6)eAPBzY>26EwvPV9kgIz^;m4Qu$X(v0w2(v}mceGj+x2NYz;hx(0 zI@gBpYn<;W$Ec80n)LanrrH!6ylwIAwbVhbcRQEQRDp*xWAp7dm{=K)6>*ac z7lPU88oH}qgf^njy2QDGXV!0mqDd{`Oa7M^h1>v_-*2DO@Yl=&ys{8Aru-Qh`qpBW z1Gc?;-fiVW$Kh69u7xS6koJN(edacTh+z#!mrd^ZydutGnq1G3u^6K~JoH@7 zADUv3SE|N+lv{*orgpg$U#=;Zio89RZPrO(>JP+Bv?JTc>R0sPubRH3t+kHwf1~`W zM=eUwN(hJ%jA*8Bs$JCQ^|@bqYx@&vTajd;Yhueb!8E}d%@NIhfJZRUJs>oIt`awF z9nR68Vk}D$-<|)bDNL3+=MrU{tP>!^q)E;~75B}1WrTb`w(6FX#i=|~u(o*D?QZXZ)|-6f_#U>y)OKwh?R(I zT8mTYwEmCV-H9E7v6)CAv6Tq22?k%!cgs9|j-9&p-iJS}Y?6 z1dL==rZeTqwFNk40R45_Qu|*|sd_5w@fie6-l=j);(sI*PQ@cg-S)HL=F}K)#vZ?n zOrMTyi{#@_i09Y-yrGF8OUl+r`Xb?N7L>0Pv-&xnw~_T2=k%9Qj8A#xhMWAkv&7m} ztd7IrxUV-)WCj2Sv!>e=yLy{q$@4w2I{W&g=g(b38%w90f5xH5JT2HWBp!o7I!Tpx zbmkKf(RVWW)WJ@NmW!ST*o3JHd(c`+z(;3ikY^u%f~nz#TtCmsephFOP#Q$1EfZB% zu(J5F^<3J5u+nmDtD|<>Sy+2lTl;N!A;`@juQL7w)=bB(wt^dUyb|QC;|BPqrRS#- z6ZXwdEm_=?AttK3_Hx%>GsXP;Pj*%8)kLI??F&ZF3(dkVLSOSYNX%^2eT_X0Nes*q z)&5ZiTUb?`#Ym5pdq4){H=4e%O6hAw@$tA5K-R>>1Y1U2x!x(b9)Mj0tFn8?jeQQ< zdjCOY<9j1T_EVXkY&0xlT3wvE2B6hT^9HG4eg49pXrV(SWjl2{lgV}fsbEd*f}Tjd zLxkE9qY2>`#+l+7ed{X!SciyKSx{A}6oBxO@b=mr=nbR*vI7aLa8W1;hWP)CrvX+0 zixv(e8%gbytHc<|?0kh@jb8Y&K>R+}nE5n`=fF%m`)6 zM)a&U2i|}c`h^HN;U%#^Dl8UJfTB|*JnpD?kX8M!+UYct#z7e47h~l9QgD&1?cdv> z+f71l*zliIb2hd(T(Mga(>||$J{bQsE`AYn9(o>*v7jkoYgCS@LsYgB6*<)?pB*{9 zQqMka&8oU;Vp4kkLt}Nk(7F{dYZ9=aGOrpdXU9o2+PRRaFf54W$XX3vJfk3J0N#Q8 z%A%NaD%c6>3${c#B}MkC!b0Z?u`%;F%aCPgDLLWyY{Ing>ZW#JQwlO z@agDJI28Uo&N-|f$|L*bLsuu5n$p+s+mS`_1<)cCZa&0yQqu*=nPaV9UP(qSj|Eq6 z-mgmZ8e^1yyqAK@{%9U*pPYRiqi4iEo{`tGt=O{wgP%E{*9n^|F@;5%ad1QTNA^U2 zH2O%mq;|t;eop=s6KdKPO^72%%CRoBN)-|fP`YKk+lIa)o^ZUY3#OP6S`oQ&CHH~5 za@{_vLwm_0r~+t9TYOs=ahNWsOXbfdYqDCLZl#60n^T0f|5LCXBY1i=aLKRPuZZy$ zdJoty4}|}n*?02=fx`~|L5ce_!Uyjwh4W?}vZj1f2nETVj&vWNG2i;HvIk{vCg1SA zPO*j=5nF)U3mnS=$4ngq(TN78q4H+h`*YvRb&t_xWF`0oU7*dafm zi;s0&$#{{JiHN96=g#-Cbz4FURS@bn^BXmp@yP2gryR{52_=bg6`DgnRI#^1LMT*N z)`cI)aI0pO(w&U8n4;}lFWbi6vpe86Pb}&5#Plv-g%Z}~UY4lX!;5yeMyGqXS@Bxr z>LAY_W=PZreamC`$lZ&B-}bi?9IYQcwi%+;`lRabHIAV#yof4s@ zaY<*bE5q~dLm#S7W{03aRIS&nm|AY*ok@niupc|n=F9o&^k&8_ZF`rp7X7G1jK0JZ znlEqFzzvwd&?W|6AH{yc^Z7g38_`1+qDMRmz?O8UI*Cvm{e5U=tJkq1!L9aT`^mgR zqYt6XG0a$r1UFb=jjAE^u%97eeuRGC&aHMO_ky|Mw(2Z^OBbs{U%(w_Yf*6|kBJrY z#)8Crmicip(1NWZ&!!~JzTdYwqhXhrC>Qb;qFubRP=OJmFa6RBPTL?*t1)mr{E)CA zjjun`jG_8r3GV6Ambcdvj^R+PEs0?V@6vWVlWdw>Z@<4%9py=i|dtd6!F_t;|yS%<0auTdSYQC)ylJpJ;4Y>y2X-k&*3fEijH;R^*cM2Jr=b5Ccr|vXFtW1>8rhj%uNcQ zURlQX|89oRs!f48GmdWF`snk@^3Fq^$aWpG#JJCX&*^}r)>H~Hr;(t#&wVF?zqOgo z?9X<(I~ji3=eGTk%Y4W0uGt>bDT}oKNujV;bDra}Rq+VR7j9EhZUp=8E1l3vKBB=@Szxm-s2%Xda1X;ejvPhi3#g7R~SDAR>Y$WgK@23q+SmqWzc zS?TicbiP#gb+~5~Rn?>;*{#)^0Sh1bYc=y6^HF~+9wK;C#e!L5Iz`Pi@rbspavfAq z&Ij?^V&R|G>*&||4@@?*e!az`(dVmn8Q16(_BP&m8suNuo&}Fv-pQPOFc>dZnFM6h z{DGt?i}^*Z>;g~@${3D$^B~K7VnuGQaBbaIy2D8Ao(V&j`0)F)51cadJZy`(2Mi&6 z9L&5)6Slbby|K7JgLGGcd_(^d7=#9^Q?7J!|v$m7E(Qa~Yi)?y-YV_th6m z&FIWLxC+4`|KRd%TgD06;S;d$-N%bllH4`uWYQEwBAnSp2 z|AP4g81lEJ2EAw?i?H!7s(YPwumjV=csH@OY{>$c-DvIY3phI?2e}SO(~ZA5U6k}& z8GoD5V!349N{Ql0LgoO-e9$__s&Rj&!(Hs5)M{o5GNd0p~I zY(pjlj+*5u3Aw3no(C5bndhXlI1Y3sgu*se7Rz+X5sXm~I`{q;zarK|`5nUz%7E)9 z%SWo0l9tGwFK?#>8VaEOljFy>`Nwsc?GdfC`?2F+&1uX+U1Vh!lCL79CGnJa4@kW6 z{ouofV{{^Wa>)lt^~$wEjnT`J*eS$SI>zcUIq#Qi`toOfn5g=fuRX6S1=}XRM@5Fr ztFN*G$Wxe1YL}^~^4jpt!}7N2T*B6Nn8@=YW|UPTg_VP7bflMd)+j{OgoJ`?olV91 zC5d&uilbX3Dr9IUZ*!?>#xnFjVbp5iIYxM*w$~bpLz`6*BAfANJ&C1~j4iy}^U^S!*wv$| zA2qLU)W68gtblT$T+u(S;|HqN4$Nvc-9&+gnI|vhK?XkxT(=;;ywB*qqt{ZY7o>r7 zRRf>&RVtI1xRL9^WP~YV-_(uq7Ow!YE{)XguDG{!yv&QvU?IlgVWL^$C#=zCW)?tO zx$WFp!@EI^k;cB2*{;Or_WBPxuUUt)te(Y^MrG#tVNJ_Q9yB89z0K%W>e#_GJNf)p zE#?afrh|;DUlRU>mqZ`|HTAX`qx?@x8iz!`w+k%=B z7)S*H4^uru?rZo?}z7zI*Ek>~`k@kNq5taxUfz6)J}@#X6oo9~f14olBGIEjIk-qnUnm zpdHsPW=G!j&g{JjTc_dIi*oocWCAGU{>;9mgfIuE#40JF%1Yg8#$jTWC6MQ@sI)4J zS%*eV8K1+A!|{@^n9!{C!Dn!s-|})@#ZV;H_T}FyAJgcV`QYb7%SeYuB=$y88!&2n zwB|!i9JJI%K?3xM?0ZMV%ErV^%6X{GRJHV^_H*UlTCZz4<|%c?s1ItV^Q?K&uxJ@hjDyV=M#9In zy_^6kb}T?9mz!Ul%`oMZ>J|5%reCXNpoge~6iL`*G=nke}j^0Q#=qCKmeE)Skm1f=BgM-Ius1yB)cV8tgo zA8E{l7)A`E82`#HEtEE|F%8!Ikz_iNt4o(`)BL`6-YfwMauubHb{IG{=dfTwTNoN`fU=I=6z8!#RzC?YR(L>!)4t68|Mn-(KCkwImmA-joFX!aV{{aA3@ zY`;oeD5}!Cl9f9yjbjrL$2>?tVko1}Wc{`IK$6B(X1oe`^Wi@ZIEzNke9ryo&E(Nm z2bvcU`8NWlyp%*f)VWFrui#mU3$0=^v}C54UvXAhqD`q1a?CDAuf82zVGP^Cm38Sj z@R;qsQO;82>lJUwNE^yfeMU9Tvc94v2~6Ws8876dw-k7RIEb&$e|&_Zt7&31^6NSH zc@8HnZ2s(@*&B`Yb8|PtoX=g=p7alLm~&v#%;BJX%_JY8Uy%;mWJ7X^xQndhD@D^9 zJ|(1DK9J#JI*i)N>bPWL2d+&MMq=QAGi^uqUVmlsZFj~v@`Bc*;Ck(i(m|8Y{*y=R z)0UFPl}AIQBVtY7gV)g;{jL9}RuSM^VkGsb!!U@9hq(xieyZQjipvH*CaY>17bzI4c zGRrLUEUX3g_;C$RP0*mJ{8$^cUwrSM*kLbkb#vXqZc^rE>mkWxh6K}oRO1LXfR;=c z4Un0|MKW?>r`&p>P_}{2MS)^+jX|6&zwwrtkmGBgeK*g>Wg5=#`0)AgX?)_|7Z&T` zYl%F-P!3lMeh+ZzVk>%#a!Et85wp;Wdb};8>M-pQ-2XSxLBJkGrq$-8Jzpbcv^QCq z(FQB6Qkic4p!}pxFxGx4VbE*y?jT3XGWd-UOOaQZZ)Tn|%lsg1NnL^t8HG>PL>oDp zw?W$jOqur`%hlvi?|^kWWQzY*HJ^QrW(eZ8ItzP4`$tG6L!d(*_XD5B{WN>tH2bw= zD$Z~m`DlZwj(d4u7%Xb7aK=VC5))G(Dt(h->u-eHg8}qnDd7kioljG7)$FuYOwj}h zKQU)(6Ubxg_OFh5+lMBMmA2MPye%?PIrn;E3l8vVWU*0!AJ~GITlC-`d zW^CJ!s6~VK@P~8p+@;EWV#DYv$Ir6NlyAjXxH1=UxuJa?{#+EZEmL#V#g+_|Chv7v z`#9oxDv0spM|L>V2UJ4<;)~)QecNuX(ui6+9=c>4knC4(r;hf*Fq=CT2CTZ`=MCRr z+7dNCz?@|X@Z2%PgsZjn`fvIW@DVabcgFBYCrq`O)pN=&#kV!LRbXS_A9hM^;#OF0;nY)wdteX#&g+rOw}(PBv|f=m&Ev0=T!wTHXe)0^^U%-kewJX z*`n<>T;&iOde}6IU4JgyENC}f_(!npzfRr19J(EzW$0xg9FUSrXmhf@RcM$8qyBV+4nKQc^3k#$=pNTbp6Q|)|GzPIG^7B zG`t(Xv>3D|g3yLz{Vs1otS`}OM115cbs6Q_`$bgd^#jpk^n%6x7Z%)}IUca9L1?w> zz;)rXkR#fjO|26{qU3K*%8f1qu9ssSB7K+lZn`%<4>|w3^V)Qr%FB%}(&`3I3c13Q z8*k)!ev3P4trwkfS}o@<8ue8#8<2M|o&2shnb2y}xPf-N>Bz2)3^rkflM!6>&Gmk> z3xh+}{DMJ{TgXVE=qm$3u2WIuu7Rs@mNGr_^!QsOIELD$Tw_h?_I*ujh=Vy5x2_L5w!(j*+xM?I?9=Xv!-kShhuM$f&r& z1z49fjUySrd4MYu##@E~JjX)#4*M(}%Is#+^&Fg zDJGi{H^x7}(ADvNyk zji4loGZ!0AX$=~WHGWeHI{|HBRv2E_uTJO7SB&JxMu`?R^&bfz2EFSuTpJECwIK%< zzoSfj9E3`2?fZ1Q1a@Dc-j7-x-llssG?4r)22a!8-|h&K-*4$@{oL>RPDgTsqhuCr zTm59LKl_-?tiMl2pJItT(rS$KJ9NjIc70i-jYm3 zq2#O3jN-1p3q}99!^Vgptwstz!M5G|pnj7;|AB?f0Q)9E^Hnhxn+`745dE01iAV(- z0hK%(-|1?iR|4tKx$pM+@iB{kp!qth&1@?e%hVH`t%0?hOv-*41?_I10_(T0b8w^Z zEU9$@%P?xZDVo*&{vzfXyN*R;Z_2e1nHs+?3Jnp`a!3fIyU9A)3%va>9FcxPk~G3T zd5t?jM4PPYx++SK+%B#v(k|&G1$@%oN{~>oq2GQHn0%28yxSn+Atv}8pzK6^pL$#R z8gW!svnk~;N+bmw1rG8j^T!Ls_!E|)6qw-_1U>W;=UCEWqVOTfA&LuYD`tDjee!(M z-um_DE1okgYM75%XCtg?Ev*+X`3c6TO#kRVKPBjriDg`gvC*NFLK7}G z=|Ik>Sb{I9QFQ;Ie$cU8)X&xnaTKuT(j(&IZ>rnAejo1${fVI-;`=bgD^$Lr531;d z=;`+&`cVkM&#vAlb7x?T!R6t5PP8#^H|~NP*TOWL@E@r3(_Zd4S_T#&_p-9#;$l)E zl6Z}}>n%vxBO$MKaySoeuwsEj>9)mzngXZwPtZ<^@r`+ik7U13wVF_phx6$^(*Fkl zM?kp06#e+b-`2~^zmvdk7dux>eDLLB`kMDX#xK3qUZv;wWKvS|-(}XH z+Ijnz*<_NbGix?rH&r?Dd%`i6PW^$Ez=tbwS)H9P#&S4E<>;J#w{&mpVd-IIzx0ga z6k<3S0)YH_;D+G0=EH^@)z^8tMaN1Sc^fvK*l(f25L*uqFPZk?siX zciYs!FP6cvt!$(j9_ULDYEKFqimik~9Fs6eSw^WOETORh%*Xsv*XO#H~FS4^HbG`aV{_Wii+C*QrZTG9L!PWI}_#y9qFn|$+VY4Wdwy?gwld;Wg#^lNzK zp~XR;mIu@URm0xMUI>cF#0zYjbvQL=^qcbc<^LnIo8`^^0ePqI-oPu`E73P)LG>#B zXpH6qc%b6;7?l<{T|;J^*EP492$^9$?eVy&a5@-7LZr1_!AOx6L&+~pG%ghRh)g0s~`ut2jZ7b z+b#=gYQo+^%InL1VjGhL-Z*)Ai$x-;z;=;}m=utc{!~ngti}}q*hIbhYOMLft7ptc zl36bVSg-c9+bjtbs8qeg{|Oow#MMZ*n?j)yKQY{m!X^G=Xt1r&5Q#RpoV>tzjZMTn zwmbs@XBvzWkb&Y=fz^;#MnL8gjjJnzk*bRtsWi^xxz9iK{N(k&+q(LF+%WmSPptb| za+diux_hfpliWV}(_c@%`_nf!M({!$!eP813NdCP#E|u5wfF`*OQdrp9J6L6FK-qZ z(J_>xcV-V}U&{W5{&n^P<^#tm=9EM1VSBi({8pi#?dR^~?-T^yAy$K|Z~^5`S#Ck& zqq-I{jcr!)3OYVDUW}Q?{88y>N zH-*hhy_Yu&x<;9CRo4_V9@aH%CPZEHnhC`VCKN!96Dx!TGT>o`TpEsxJwm^5OrWO( zoEMf0T>`y97!!^Nw7`(l1luk`Y3j2PaxHWwttk0w;Zmc=>^F~@blzNUcA4~;dBmhH z{XJL@3}zcJ+t~}ID_hYv9XVE?CtGdU@0IP5_fk5D0y6T{%*c~^bn>6aH9$&2f$4Fl zZkRYUJ)AZ9Jas|+ic}beIh#*@VE{@0^!MyOjA9%i?yoS4d5W<|@qM7J9wdZ3VRu@} zNYzZ9SLWimxeoPOe5Lx;+>Poz_`ck0>TlKe@kgrLtpeb4`GtA9S#8cQQt4p6N=@Zy zPG$3<5S>LC*qei9hl*-bxGCS((B5z*x(RJoZwz0T-;TDax8?6e_v9Z(kL7na3^lwS zdPN;;_XC-=(1+@W;bRS-pudMc%_kS*C8346b+{w6I(Jp*hVV=3i}|M8-e-sCVX%Zv=2O^#6UpNq64PMgQ3&A>n z{aQ=Q$$nQGE^p+bs(Op6tQ3);7DJ_}Bcq{WDDN+p3oQ1l19u`ww=S&aXfYh5ATLM2 zn=G*#7=AJ{LyppC$x#-lJCI^BONEIueKCYn;Aj}1<7?-CGC$;4A{A4;0Snl^M zTLIkhV|*O<=hgtWCzt0Y#`0?t!HNH2u0Oqbi(Z{f7K}c6^SX4jDtYR6jJf&@nVXKD{;S~#N#FWkR??;g&m@ZDXl_KMB28bOIhLd8ggE? zWLhpw9UJk2S)p@sgake5*eP3nAVX5N3@JN<4f2z}V;L&r^OKJVm}WkX$Kp6{!+2aK zSH??ICoBiKG#*Z0`p^uNgM`0Go;Z`O;Q;jCvn74mOUB0s$_|16&WpBl@MLNLb@t6) zYo$dctYmN-Dk|-0sj>mBQ?5l_x|sdn&2;(c@G&WX-pFFeiDo*Dl-wT)SD`X^_+ zZSMs&KDaBi7})v^_WY}cer0=H{XNPa{&C0SGV^cvMt%U_&NK4`cN)=wG$*R9J$&V)ApSb~bb z-*ydf=4&V4oP2HaO8jlyis!%n^pb%+lh00$?7JOTZRyajcv5pz5*N%yrJ| z+}C+FOFgk3y(ia`-zI$1Ip7}f+$s%Z_b_`JWyRg-F1VYbjnP81iHNCM#)uhuCQ}O{ zZ64LeAw1i7QI&2VzGl!a-U1HvGusQ!)_0N=^ZO?HfWVbKkBEYq zLKxBG9+H8OJfrmNUMH4&p{?k zSn_15lS-ly2|2D2+qGi3wYG+$sxTc8Fxi3Kmu&s=yvAi)uK4QrzI@+Nk!=Iv z|I53+({<~*hAV1fKfmsdm3RHRDXixRhn)usW{7ZD9J6C*_ByF*$u*{ z?=vp%B$b_P_GBmdc~Wd@Y}naEK491>703^vj?1mn@`TtHSD`(F-b#eyx8JEY`y&lg43n+m6KPDESW)TaFI3!M| z%Js&PAdbmyxSwY{Iu+zS6mM4%+vJHON5*iD6boI7Y~rBcEIuB@cA-x#mjN4_%4NWs zoZVWt7>UB)lvDZ%lRg+apdP9iGC$|p$HPxmJj?Fq4)8#Be#AY_KN0v*kiDNDlm?ai zf`caeuYt=$*D*Ib`b~CSa7}2r`4#S8dG=zyL%7&+iKipLTIO=Jl3v5E;8?>fFfDbhpiXe|^ID!?y>L4BD-Q*E94+pAL&^;8f5lG1w zUwjcFsMDU?(=0z?v4*68tVtdLPS!&)O)pIiSl%Gd83ND8g8_dq7+^V$kf5euh|JCE zlH~Cqis!^rAsqVee9#IG22TW;;QRT26<8h^3Y-YAMxZOu6X*{xffDu6e#5-mB-KN3 zu+H$w&f}fn1k;R}tQH^$1+8j#{{IET4!cfx_RnS^omt#RfJJnuN>Q?uB18C%ToeRf zkq0ib-&b^`edOrdPfNv_%-R7|T6-qQ%P~xQ+%{{0LE;I_*u;5ywuIwh{1TWrXcf>E zj=&7YWkjiJVt>3i*_4^AN=`CWa(Kx+s``?aI^2P+-0TZj7kgpSZPtI~)PFGFS?AXi zY%(d)0~%kK6r4_K zRnm^|Byu$p?&(w%YE@&9oC5p*IYPo3Iw!3FL4!v7+{Pkrw|s3K@mE8HOX?a?jLFpG z3oc894|Q45DA{`9EmvvkO)ExDa=DnTDpu{Is(pqkCu4kT4TEx!WnKVYONs{YcQ`je z{OQf?VVr{(>x^t~q?8rSSTXcsf7>2$zk^n?$`-Vx@tbIe zb4L>wRf4nSw*EFoj9kcG$X#Gu5WjG?)wV4vI6S<8;!E%{#}em~re(9{&t5WjjdPRp zHt|-+txjoW@RlH@w{2*nx`aklXsyfC77l@5yO3*YY`<7^rJY5W&EaM@$*$!t%7RUo zi#F_Lvx{-Hs)Pt=hUq#rT&L5WAeoLR;!hQ$L=AMwzW+#ZY6r5IlC`rE2Q$$HU*`FLtGFI|LlIl<5q)bjq9-`(W z9t8kd^kSfdH(4<)SFGnPPto9)^Zh(6^Y{dhmqYx{pEv)Sa?0=R>&spQc{?jlWQn=} zRGyZfGKf;tc5>o)r##--g%);FuA zxrO3H!68r_sO>n#H93nwDxws2-Ry?CkX8u5!bZDch%EVlS694{ax674} z$1?u>Xr*{{i-+ojjQI@FSucK<+dy0@tWCn4Taj(gBkt&>}`{;+%m_{yIWiC zUhrMq*&43tDlR7Tvs0(0j?)L&Z=)cp#GjnSj;CWR!2p?{0qb`m)t0C#gur`tS<6Kn zl^n7=1SwqPd^b7YkUBXvE!nfWF?z&u7jDe#MUJX`QrxzF>( z{0r2O3o%*{K`K9UC-piz$WmQwKf9Nu*^gX7gw#rxOLi}J_qYe$Oh0Uf+%$5_Zo{32 z?wI?Cn|A|#Jk#3b?n?e_+4PJGsrG@)htQko>?g!gDV|2XeXaC=$L^k z9BKrGRi`T=z@E;S1`a#52#Ru=F+JOC6KT6d-%FyT6Zds=X!`<)GD|{eq#Lr6W>;~= z8Gj`y>g+T#_+PD5=9zg8&$;csZ~f|_9ZxQQbhTutk!lb2)i!>$c<~Q^ zczIJ(n)>9xUw(P=`~9&o!>VA^9qV+T+5=au+&bAlE zZD%@6=4qc+?3t6VRo50!f>=1@Uc*um-%4f$u%VUwT5WBF-^6Za`%%9+qP=JwF^-{k zS#cI#gjcJpA{!E2YFA{l+85cbeA_qZ9aJB~k5GFP`|$JlW&Y*x2g32lhsH^)a@0~~ zjj}`EVe}_XBzUiZpPf2}40!1PODKv6%;&*(y3Br)LZ%Fiixhu*%)xVNh9^w7c}4Un z$l{lSNs*6|@`=Al8mmPq!b3XE*L4?eciritTsax#k%hWY4;n;6Xbc@gA~`^zC%#s3 zO9i#O0`IE86(#JlloK3AoXnM%=d#@V`1}LZcgoU_%;I(S^-lD59`ChXFPm)}AMdpj z#BpUh3>_At3?ga6=)JG%SBA6u1xTE z>}k0;U5o&-)T=!sNup`eV$fdXDDrf)Bt(Y0Y3DyK@Z!K1sip#IoL(PLm6~4QXd@$l zCA~EH_ANhnALEgMAJ^B+iFuug#JtPre)+*|8^1KGfY*=y9CJtC#-2MbO65|4&3bI< z#s?ocHNWmgveIF})NzId%+paV)prhGO6BZ1f()nHE+~}U(RNK_M1wX22Au{0Ixq1) z!$sWEu+N60pINp88!EZNh#aKIM0~v%4GTLv?cyUfvb?=q-k<#q$i54Xjhbq>Q49=XV6B)AVVM!?$A$KgOMcI zQsf=O$kk=+bL@xXR&iXe&c?~Z*)m*a#|{G#CO6aBdAMyHuo55>BIy9ifl^ttsE{K8 zb$+(4(3Sgl=HJ=vOn+`~ZY;-Jx&9o5a>43Ab``rySed<>=NI$X$jx#ra;$djWPVh= zJI9aZPGl*=K!$k`V#5iU`GQuX-MGZK!qIKqWb8t_j3@X5{7co&l;Ep!ou|Zn3j)!q z;CYc)bb$_+IhmS(J!*OluBp*!r;ePa%OIpj33LVfgL{Lt4jO_Aew10x5p|WWE0Fe? zMNQoNy7^nDE2|fcPxN(y&?J9k5n~@bG61e@BQBE90&hhs%LrA;l#nq{mVr&0Pa3$I ztubciugN@U3yBAahF;u9Rv!S^j{1@A6q6owE({ql2yoIoV$P74=$xo%H#%u&89m`8<;0QUjq?bp$OqL(Q+vIBA#%wr` z2hH@BeFb!0eTGC0Q}1-za6{OC+qmt0AjE9<2O^L=Ja(1_L<9Y3H-H>%*qBF`Z=(E- z0{IfFlDN9e8~hMYBfbkr?{1#q?_wTeh8dcC6%UU_A~r?b-tX6A@SLOzPYdBeo)#KU zkR0-O^w<~4L-z0y!XG+c0HN4m-z(fH2@5N%Y*0JHU8u|d7R`o@2vE#OF=$1KI=L&y z{G|m!Cy7V5T`^s-53i`MD`;F;T(yxNX!O+<PdCf_a^ll>9_Jp>Tk49>EgSD9(cNK;`973q!T>kPu_hiMT;b!IEbgE&Ei68k=U-U zq*jU>sXl6(Z(I0Y-y`B9j*>7c4mn&a&iC8ec(^Qvt;HafVT{*nm{^2=T?nSNq7=l} z2Db+94AQ}qet$oiCLI*0yl|&*RG?+S65vUMA>o+72~T(e4BAHgimtJgyoan4qLD}T z7#{kB2Ybk!h%lC(`LX%aoC)O1MH9V*F!hpkj^m(F>?LP?#HF%*kU)q|xHbSfAxnOG zb+Qu@n*GBL)Y3v`xaY4O;mH3}qPN2qHg*A^&z}9@;oF>vqRXl+y5U8BQZ<|=1pv|z zEE(3yds_Lu={-kz&r#kJ?LEsQ76Wp)7&g2`w_#6w;OrL^MhC$Po_Bf!sKmcJ+8qcu zy_&u1#mhUHlAsTFJJ06D8A;*eLenc<${A8288T_6%H_)6;>#}|Sa(~k9(Z-Z@_Pi@UiihGA_;Oh?`F3+xL*1R3Yy@7jE^a6T; zYjOBC`ZgDPAA@tXTTSvGe%dAM5+9Hs@DA0AG6(p!p?X7>iU^*Om~dAdkHq*AEm(RY zwk!5rjEZ?HlOdd44uU^lol(4;z&m6Jj1vBreRqP$FHxTi>KyvGOd z5g`7@?|-~Mkzjgq2J-tv;qyKpQh~^ynVhVVw!hzMn@y`#yGUz>~-CgvqO#@GS=is_xU$UP5P$1Ct!B=kCgjK>#%Nv;gg)NIU z)Mjd&S+Z7a_`_pg&K~PwsG_i&exUP#J7}uYQF7e=8O7G@-LiXs@4@WU?xVJ&_D@7U zDIKkU`sPopKRW!_mM=xVBpur_Z+q5$I&xb2LG1^_7j|FT{o3xUyJJx$R2AyMp44vp zQ`}HbGe(7(p7cvBr@>`V7Z~OAPUYS z&J675&|waDL_7^wcN|-b*3L6srduB3%Q701XJlGFPyZd|z)U$x4d6q(gOzVXw-pM$ z(eE%7tY4FO-=IdBikT8BXn*BsWv;?hB+%y-H?UHr-Y79MThUgyHxK4=-1+aPg&^tt zocOJ_TH$QWfLpax4&?~#MxwQ&IkY7=mAjC;l(Xf$aAvL@JI9^hn0^p6xr55?%5HP_ zar~Xzcf(ubE_ZFW_vl}2KpTk1YeSb3M!xV=_+_kI=C8eFiX;l*1|Sk9*BG9s&zpf` zP1NkFFk=io#vlm9(hPi+a-v3BJSzhq5AYp2=inZhdw1=A4n0Jr5r6UtSQcs}DWRp;K_xYXMabyEsAgJ#^YO`8E1iBh z{fjh>_0sg)i{N;M5$zWm9+?J)ZLOJESvS-6uRSunqkp|xk0&A$vS+pKu4-4Ui*XEQ zw`5CNXLh@`HICwIl5uLdKB`c+pr%6IWN*f)vEpc)x;?*DLF=RqakNd}5l7p1B>H3c z^w=6|q-#h)!$b8RlU}Ppw8=IQN4J)5i&J+Pw<*;6$l5q@D&*Voxz_H+T5p~CkC8t# zJpsz~08ynTUlK5l)&)QK<*uIex1w|>x!^qej;Za#q>2f44~MpJsL7!+hf*B!amdeb z4zp*dK*i*>^XxCq?33jo#{lU$*xL#|NJ+8uA^Ccu!o@vzu6Xi6_Ov5(SS^x;BUnvl zS|+5!N}Y#)D@pa>n#2FdyO0$CY^^Inj@7U5>-yGR7mt5p@_TtNuO^ocdf53|E^r=-+TV_x2v_U{BLxt z@rCin7fidu8Hw_C$EK;7v%zd5C@QRtu{%9ew;#Cs^E|4nTtRQ7Um#1JLo37RMB1+rbZhBjq%#kiiFh_Cz+8<8CDDJ#N zT!6(kC*#f)(?=i!nXibj4LZnUAmGQFhPNEvbgG77fv-;dg7qFs7ZU{=cm>O4u!J!t zxN-$Q+mB2>qTiYoF>C*GMvVDbCt+6+fnu}FqBCf$?QDiHA|VgUK*?=>+6uB_fX_6G4c~dftMxKIm@FHJo52V{2c!> zZ{tA}YDFromQuyB;$(5EXqzd{7U>g3g!N+aLh(}3R-Ekp#$l3@56;LXf~%ozC*?0T z2gF9BweGS79fHxgopWfhY}_u#5z9r{1b~N@=aIPTA&-<;!}$5~w!}QgV-R6ueOitY z{RBCP1UXpgWdt>lb$rAjjv2HCA4raw6^SSIF&^#i?P(8Uvl)%<|M=joQ?Y=Tub9g> zhsO{+%WJS_0Vg|x;JP!*lSNO)G z5ROTcJF^{Q%D)G?Jd zVW)x;@9wUVwy)o6ixsQQXrwhua2#|9d0(@ z=VzVB*#KN{YHb}F)7Pvs_q*L5*`rEkz9EsgUr&E+RzhPEnv|xbS?RcRRkBN`GN=9% zVIH!49ykWWfkg{)V>EzoO;}m7Y^hDm7?xB1S<1n6oip)8uwo!cSR&8@)6MAOAFq>I zq5htpl@-mH`i;&tYdSjz)_hd%8eCqxwiI)+$!I+1MM3-L;J`p<=bGj8lCr&l$vrx- z4ZZ(M1x5C$Q<#Qs!nEzfv>ihKWi@3-@Pj3k9dtVo+p_XVW;1et*hg*Vgy>$umE=8D(S8V2z>^L zOB2FD6vejeKg;qXUQW0ui`?9nG9n#|+}!R+_yz&pB%V#6uyeDK3z4f4CPGZE4K--Z z{>GXbik$N7?HP+8Gcp#Lj7&vlBggTHtlLPkLmkLSI`m9CK!h)eb?_8YJ?_>tR-m}P zrZ($FV{SC*o^sE+kGrqB?e0_IRRm*++2+7?62Sn9SYd=hPKPKv%Mr?8`IXh}=tfd# zQ^H5&+Q#K(vlR8Fq-ah=qWyF44sP#DkjKuLPi`b44N)RRIV#v%+F|2X;f2UJ!3*QW z#*c{Pp^Mu_Ds9bPfkzDw7Dh}TJpD?ZoR#nD-OxU3L;EZkG1G9?hQW=49t@3U({jSq5N(@##fj=>q(u)?}#%t`Q@!y7- z8BFElfS2+fG&_!AkzypJdHTK69lb`f3wKOc$B2>KIMg8;$p}V9r!#pYS(#@%r!#{_ zas%#|H)po#qk~(M+tzVL@2J@@ava5K8@KO(2cs3-yo+_%?Ci!3T@@+9k4GX=K~&Qf z1x+a@V5vQ-o4#J7lvn#Iy=bcUL@(V7W8u*qgX+jgYIJOro*A7TrKwS2lpe(#e>NDd zjZW?ypQm>{lg5~89_{^9K7Z?~DDT^VtS(#4z^&^)unw}`;IB#kk1oP$tXA6PO0A3Q zsH;PD`#f4EtGd&1vE@>mL*#|HPduE@@ z&XT#q{m<`$uRx)W2c5Yoy__rwdzp>UR|7uHof1&F&~sWV#Op z^YoRyzHH~-Jr4~JZ|i?_`GM_97$dcakP*kwr>9D0eUmG{JWSx5s*1Pcu`V-F=v@x& z>WQgpY|S=w=a&mVUw}o1`olF%5|3(&04^s*9<^-82L8eF;#Huog!DIl-kq{)X z9Gq&jMWX={k%xB}RGd~TWXVRC3Bkp#ZVxPU7Vy?#*;%Gj^{L%#v|wdhl*`1Z5=hR) z4VG2@!YZjFfY=c%@Sw;*xD4V}J;PGYq3%`%{f93>N$A*vjJSAT=uWvHE0vsyqaV z>{=J6GTl{j$7&|y^LhD5SY>B9bOQVqQ`{W)GH2t!;EEa5gxZ-h#*9f=+c#s(8Yc{f zG6aJrOGBJkOc;|j%jnAg=|-1dk{O3hlbJ{y*&UKS+Gc)8m_C62Lqy)Pxw=^&PetaUp2Zg53e4)4mGN1_&vhmA&U`yst$hA4pi;hoqt0`nQqEP1)1(Qg*RiXUScgY zetq>x4@&qoZ%5-6&muoL$r7WV=kK|wJF??SGKLdkZ#vywhm{zw)d zrcO+!Xzfl@JV+mOJiDz_@Hz!&P|L@Sh@YqxF9xScng8!&}BIeAre6eBx!_V zxd>Un!nv+5V6j3AEstJLPXwY1L4V74M^l$RdjA72AAb3f4<7o_9rgQfnfv(rKYH&* z=IO5Z30%|NQuWefzVM6n*XY%R|g_m=<-aLEo{87L7F| zm$sYlga#Z-;9CpGl)@MRBGm&5Nu^c5OV-AXM3O5j`Ed%9%lmC!NAx+XJca4PFsP(? zd&V8CPUJd8#GR0ETz+V;unu^7IU)r?==yY8~y*=NMZ_=s|ELGz-@xOWy9T6hF(;ll%<- zG|%wAR_FlafW#DK43foW(g>2Qti&pNda@r=AG4~ zrlGK_YcF%xct!FaUjEkpO#jYX|LobnJ8-Myw>--9IZXRG^t06&BAtZt9jS<@6A+_I zDbz9)SKC#oHvUPqkxL3_jKpbD#OzBEsFNc06gd$Ij1-oi$IKv6Sxo-kE&6`_u+Hc? zR&q0#1TTX9w1};ze}-PbuO-~*4$i=IS^VDp&cjaHi6@X8_(}=+i^M*HYy1Nt{}kAp zAn2h(qQ$9Hr*R#0;Q2|kcwz->#LWHJIPi7T-9D2xeIK{6W+&RyiBdqj#2R@lqwC6G zHmR?pcvq(wR0L#`plDk|a3l9P!%!@?H}*J?=|GNBsuOimqMAyj6f~pEDm0}C*#5Yn zTvF`Hr16cFoNdd3n7(|#axMvr(~A?LWhpeMRZga9i~}$+o(fAcQTY;|bI)^uXYOZm z7Vx)Li=$9aJGZWl;Ug>l)!x;Pg^>?G+`Fl!W_E=9p<*TAx#i~N{Duyhw|g?tl+L3N z^YlwEtu5$1>x0If%bQ1Ztk~5sLFacLzbS6{n)Y71O#cMaRG00(RWzkn2~AZ^(AzX3 z9#lj;sK^(Ka=IJF^|TLMqHxRyBD5Qh`?^?8_oZ$Ayd6DkNBiu^u9Xo&ovi#|65X9d zNll5O$>>y+j{03xb75ivYsWHfaWetQZ9qmC5nTN7Md8Pm3|*n1?zB(mY@OkxzhtL7 zyI5-)**|PY_uD^Wr|nuNyDo|LCjUH1CpEtd!4)Hk<{yK>PhA)72>CTn#BW?%tJsQuv~3=UG0-8P*$)tIi|EJc7mU4?REhE~pFI|IECi{YD|Zzgd_l{F~yT!claTKFZ95 zW}-8(nfMdMqa_clzvLOG+Y#prFLwMO!^N3!&>s&cWFuBM<~+tfseB>x1=Z!xdvb-L z!j|fu>O;mug~z<#%sgFvgLysfHn^@Nb)HV56e^QqK>1VD`O-X!nqsGvl+VYK(Nq)( zQ3ZcA_iom`NCQ&47!VsrL5veXHQp^}wx@3QX* z?}+c_Y!l=Hv!4`38-*n3bv&CEk6$QNlw7vN;=WA?a^=71&|$a4Oay zjoeVJgs+U%xM68jpiz(l)?9vTE}tKNgdcx|zfn;9@Sdxt&xcR*H5kEzKgRJH@t;86QnI4)hMWf+T7c29f_IdX8)B8GEe-d|2?en|-XmO{t ztdoR}$g<8zJCPU)%ZSx>YP+hhUeZa=rn3*eZ^L#awdeCcJb!TOzH}(!NvGpqy=(oB z_b>mvSbXv$J)>1o@Vl9(mtXwCeM7~*oKf0%_ty>`OY%{)@w1=1t+D>j+5X0k1OGna z^FjrU;I)6G2W;P^VsvhGW>v!UW675w`Bg4AaRInP0b~!5Zh)xBKs!zw0G&#}C47U# zI}vbk1z$L5gOn-?Ik1jgx^%I;xX{v$ueR4yT$gHc#LAB#`_QUBeu{4p%RAcc$lx0# z4)-Y+a`|E?bZ-!C4kGe#CMIC~*{&F}6EJBf=DeNgS9`#6U^vK?63vP`e;_`?Kp+uc zWzLhl%I4CgiHQrsMPXs09UsBO5PO#L;0qXZH};@CG~G-b6OYL+gkA{G%Wuf+Tmn52 zMO)lkJbT=GJpUwNTR0@?5)%$da+E=^3&xHkCRAx%EmNUs#5g)FKbQjBcql~<~{^v$B4nORrb+4=8!KU|C$w(l3(5F<+!Kdgm(o3+u$+#kImaE+yCUdABf`l5E*7 zm(2h%S)$~`sGs=P{cXbZx2+u9d7A_){c78&@k*M*rFbPrqTqG0kP~?Zj2e!o%CF`j z{|*C}rm%RW6{ob^-;n#h3d`+atz=P#<6VkN@~T<{&uUHSLL7S9`YcP9VN9*j)gUZDMjIU=U+c zk_lW#Iyjva9rVu$-Bxq;ruvmlsZEMK$_2K7O_Sb|)btFeqd_*wty5fDf}2O{%>Ykn z8diC5KVII&yIg6K(C(#9Aml?+Xb!!MY>0&M{c=?G`^N&a0eS}SP6QaMx}`;+m^`!J zJA5Nngz~(tD(qI7FH$xHu6zY8V$~$X;yy9%i^eHIj0uT2MVv~cUL~<=PN`CaIFU8U z!MnVPdCq+b+ckt@!Hv8Uk+M?P+vJMjBU?|mh#0@p>&)H0bU3AZmw!`y;L-J?2MY1t zO=xhung7smV;A$qrJu}^g!S*u+%o>z8FXy0JBGBSCuhcbMriidURs0L6{h7yOv?)W ztLwCU*6F08eg~=bDB?}Q8_oQ~NeT-^@On1OSTmKcdwsej-WlVZ&W<#GpDRcln!$iW z>?Edv-$9cREHM<)QDB~n`Ro6!_W#+q<8ptq<5pmIVb8M5%9?xY4crHn>4I;<3_91 zb*s%}tX33BYnpPr=IeNrnnu&~l>JfVWA;ypM?0MTT#c_ujo9}c7t((pWgq9CkdDYq zuYZ$72c%#!K*f|K<>$pD=9b6If-@>Bk}Ox8e9-CSW6`MURCgVkbM89jyns!+dGx|rp##lySl2(?N zhV*uH5!z|VDl>2K1jy?nf5HlKQhRCQKpUA57O_^2pW&6Tr-_B!8|QHAR9%oX@ES%- zJfv9hfd;2wxP&)k={RILwM>sQO8Fg8mm&rk$|~xG>CMWEX|?{aQ9 z;Z&eb&U-PIs-;UMV{cDFmQ%5eP_psaM7EG^WVc10iaaGfmE~MouiC3`p+?XsyP4al zZqP?_qsHUxj4&hqTkY}OfN>O$j>j>E* zPL0)_Ifqe?tQFRZWA@wG?b7YW6RxAexPsUgAqp!;7nd$$Gwnc23gDqA9>9mC%TWyDU~3nnh03&05*jz{#qm~u(XtFz zDo#L&TCOcPxYZ;1f4vCB>OCuP1KfaB)(uTqL7Y4mEFe{~P}U7hDM$tnfJ8|^RkxKU z2+h?~k%k6Mh`c%(S}9P`k};U$m>lgDlW99uAi6x|qa0d}{K$tD2DZw(1zOc90s)=W zrXX^rEqPk6QHHSuj|a_Q1;6mOHAxQ-pwpX@LGIFbgL(s{cNohr8UJVbpS0zlCHe-i z0J0_Hslw7fqQ5#a5b-ja#zcfnFtqd*dbdXjz|Svu?tSmq^yZ~=486JP0f`i&DCU<~ zBK6tKRjAdS<)vEIR;2KBW$-wIxHL(4~Gv&zQoQ6bK+Cd^Vy`=?h|~XuaFW_Vya;9 zMx@-&3;o-iyL!g@Z7mF<;_H665B0%~JWxjEQnn`XHmU^okSrwYN zNWcr$9`5O5Sb%SCu3})rvU0XouT|@s|7f@@BC(EvaoC+WB#$LgvaIdT z9L~_0qZyQuwNj~3Exu(KdUXtc^~Znv|V%(7}-3)btJJFM%KsykS%y7AMOobE_f z*JM{;IV8PM+EXxc=QVHv79jA9XR3@1`aJOK(oLtu(;vyC{&i2o*;|v z4^UP)Js0LmzTtwj8D}E`o)s7TmKAP8U}8JtV$);Bgr)?e_yx3PAmVM>A;QN>c-I5H zet4hw}KghLVh4u!dBxa#md3obJYxl8a-U7k*fq72Hr$2 z48M?pCkrAJo$0n2&v7U9q_Q6E&9Ib>XjvZo3JKxp+kC7CP>^ z=k91IfrXsZG5yr?{KH+0ss_E0$i%|JZc)-{Rka5b4_qy4|GPJ>NEZ@{9Q^_+PVpaiT2%TXHAq z%u|V=NI%kzx-ssg9GOSpGkn2dm7;3Z70C7K!~(W+iKMZ@9w&t1tvkL$-rMsD`==bV(`ol}G8c8`gVC&0^{dfrz7O^I>#>dg zdz|<1_sV}3y*qYK;UVr}{$csS=%2^_KVx44=SFqr`Ce5?DwU4Xt%myXcRvH)WPXcZD;{FrVMyk-x_+&GyPnkFh5~hSBanQJ z6(B2|5D4M^?J20F>M0`SDHNZ;1HJGdujY}dx0;9FYQ5XU`KGPz;I66GTgi?sx;U2} zy#hCMi*Wo|n6L~D;9+c5I$Ds_2N3V_OA*5<6fp#%XK3N%fdJd-NJ8@8ohS2yg9kNw z(5{$<1_$XCJVO=w7~zx7bUO6rf>lR{lQ1F2IK8KRy!_M^eQPS&P&LNz~ZAT4-9Cd;^VLD-cf;vO#PPn1TeVr*+o&g)#87JwZ+-5twjhbcOq<+Nex{@4& zq}xTZgjr);t%0{_;EZO6hR|e<+7T8WW#M-AAWN`Wf&ujwGRo>=dG6~f3fsZISuBH2 z9(Mvtjl4#4is22EnPnxCa*!lN8VHJoMzh<5zlEC7Kuy+U)LOQ)kj+AZVP7C>zzis& z)<}^sa{?F3n=!$xsbM-~B28Y!U3af_lWt?iPyz%bJTCW_J5Fo*-NRGw;?g5{p3iri zZ&}a>SBX5*uP&CJv6~5o;?iTc&2ybOy8qB!sjdbbNumH$^)u!RKWgZaS0S@#p$;E0 zp$)cy_as-9J#*pp=Ui1P=D?f(@SLMc9kSug2cEN4Db9&EfBBpfZL;d-iaE}fEbu1Z zX@kM&bP`65+IeZz66_h>uTCBym=7q<1VdpgV`3%bgdsejs6uWvoc{-6NBh;C{dOM} z(~_X|c{qL5YPZDzJ?(#y$b?7CPqyXruZk&QA0p<9{R6>p!XmR)>!lo z@SLgPApJ;pHNC7m=>8ZUzYP=5SUf)ew_pNti==pFv>rap3yGEjlhLxu3X^_$v8-2`zbs*!Bzo4dl1TC;-GefFPqM;V-D?iC)5t ztEarXsD>Zif{BEIBv)3wd-D9IP2^WJ`~S2{^Cd(d4*=AF=04DXzf(QOQuqyhC*xWd z?)f$WZC^1B7=a10Zp7BM+U2RfLsffAS&f>%p*eHm7Y#}6!&fIk&}fDRfm^-8t&Zk% ztKIzWxQt&9;KOL+AJtw{wDD{8t+^}@4PKICy*yS=eLt=AuSmIGcSt!@Bqo(c`BTcL z%104Wb#WUnc!_+6IfpZ4Av}}x|@QcKBEFJ?|A;{>NoT9O?5_LlJ z6tWZELqk6tB8D1nDRNN0Unb-Sqn^Q`GjPi@p(p=KM|9q8szqG86LqU9s*cjd+0|HA z7Z(p(J0oJSqE@k`gOG#1%b?iuY5&)!A6+B&getOSKx2^y5a5@;y zRztEsQP^YmlAqJIdJonSd`a^A;Ln?O*4p~o0fDpnC28uD#N6uB3)fdSMZ+2K3dPCJ zmL^W&F@0_%rFA5w5m1Cb#d3NE=I`vt>a*?y#{n~bfn~+DE`1GiQJYRUfj|qo2oa4e zNo?ez#74aS?t7}=cO=%UO03t5l$TJiAk-8jLX}v;YC3b_H>$*yTXw;FGRz{DPDJ%=#BHisAx5%l5UdV zypdSKolcyA(MBQt3g-l120M;o)M`QENb8tbMDm>QKIJ96Ui1&k1wt|(G~I6^Ob@c2 zQu+TQiA!?WaTtq>wr*7~oIJcNgO_zl{X3XwhmzJb6i;|3yJumPFk5Us)k>H39*O%EbbVWpyx< z_2MuStB+k5!Y@wPrz9ees|-Q20odw1O%b5@7j)gjTr33BFWZ`dtcjO0Y?sRP3i zByx>U6C2n3-FJ^nPQEv`xxzz9f_A37mG~ZlCr>!|p2YVyV{D;j>yb|ZSEs7ZQis1o z%^-5BOP9mx(rIX#qXXJ?w2pIkvxtZlZ;@8!68+odxkQ}%lGHVz6q43L{bvi7PDar) z4{%V;7xU!v#Y5av+;2Hj;AS|YffhTs2RMrB=B#nuoHeeSv!>o9d%VTv9HU9m88r<$ zc;|>o=K?x4%g6*JHND7#^U>7wq6dt>H4-?-h%laXce9J|K+whhZtYB4_0k+PoPvfk zjC`jMDgMI*ql>v_w|FnlF(aS);LNgrrMAQGYpTEi`c*&3-i`~!UZeLIO@9pi{AV4h zUIa?B!=Z0z7jQNlIlZ_^t&yz-oN{@gFt|S5Xr$APx~7U(_z!XX!t+puUxhzK9+&$z z@~5W(B%eV5^UTv4s9=+geQBr^f?sXh;M-9CdiNfU??1jrK+(wtNr$pSXtxe|(-^agXIcagPPO^Sq^Vj|J=no2f0-G|&MS+1nt90tHk+9gKsu zU<23=_JM=o25>ugxpC$G12c1TTQ}Z#Yft~7qp{SE-O`!~BR$ff0F6F=LF!LQQmUWa z=r3j+77OQ}p1l6ZkzISohCX_8Ie+cdHrMQWLfczgk3QjTn|bf%o3Gxy`Rbd=yk$PUVz^W+ zz#e80ZxneN~e}GT6x8mg=@ztNhTjWD%kwts$bA>|gO|%0a zMjPw#f4c=O;J5QisWpMN{vw+#5<>T)whnFl65sYeirHcYZ6I}9@sq=zc<91g5JVwCl z2&ma9!mQX3XGBsII-$m%jSYQM;78z^Rge9$1|&&2{D`@O2r!C z4x7Cp|N2dCn}@q^QA4o--vsjJ9$W{$sb z_3m#yxM}A2cMsn7y-y5ZQ@QGqof8jUw`%C{BOA7Sc7GLD2S<&)ntToTK<-&D>o7v? z8Mvy!2#&0SaCo85cZOU%Wn_IO92w4|U-ZnaH(s*5@e&d&Cw?X?ekg4I)Z)PzLM#zi z#|P7#PpOG*I#y3}?o>TSz9yL>zz*^4#vs&`qEG!XE0v1(0taBul7$I^eqSX8RbDFR8tqd=wpFfC==RHtKbZ zj>6*tSDiBH43I$*a?+%SxPYyOLe8c>k6Jd5U#2Vnt+g<3t6CQFhym)z7qz&k4u*(- zJ$drWt=EY|lkG|P9Qn@qM~=0(!!Pe7@B2mTqX0ccx3(yu#nBMj--q^JMe&yw*aLWf z2Fb!+w66n>3p>;+x|N;L9Zq$B8r^Y)dWY*hyx*<$iq5;i2Yo|#J^-}824Jm<1EATh zIS!`59`Kn)@0E$;vv79n?#ZK*#N=c`6myA?m%E+4A1R8)$4SjZqIX{|xmD^d_7C*- z`V!dzZmTvYg^IX4(-zJ%lWW(@BO~C-wQCuhjJ~4YI-6Gt)`Eg?UVXkbKR;ie$1AAJ z|Li48YyK=22z20eob>;a+JRTV0@B2wb*0LwZX8LsQyp8hLc&9r?BST9MyayntdW{< zhU(lE!YW(QYN=b&>l#s$(_?fBejn@Y31rJ&&DXx>&P?Q6t<*ro+TO#8eW`XRIS{ek zafdO~v*DK6{Fbq}y}Ei^`&myU9FkK0QZ1;5j}o-W$O@X{Tyj9N1)K&WC%WZuYNDC@ z>Z;aXj!#KiSvEvh4-)%Yf7w47XJy$KTU{sitx~QzuzO9$6|D$VU?3O#wL2UQyEAL| zSMS~uDkh^&J?!vCdzG6+9>t{A@TEBj*l-(rwj%sJ7`s0zh%BAVp0CSDJZ5z1Z%DsE( z4wn`e5SLUob=afwsc<=?kY8&yEv>T!1#xR0A5&j5V3sYcV3=0rSBAut$CE)jLuwH< z#3uJev(ydv5a&AK-k;$lfjQ|emsc>dSgx1}>c!FhV`4gJ^Z4Z;8wf=`-cnj(%qDny zb=;aX1bdM~OIAaskYlX&re3I*nYK}s3PJW#_QsnJT~pXFoYM6?-#&E-Z+%|c>C)UA zt=2tansO;AC+}ojk*rVr=$0}?w)%QUBomZny)-re|M@6O>sntMo=qbjTQakQ#N1^Z z-}a4TSJtjd{Z6F4YfX5oS>FKTZIZr%3SF4Sz8MR5$ zT(Kk-bYLVq0_R5NMs^?Fws-f|b)vLy_qHvoYkkw0wZW|eYnXt1?X{V>-Q|K*rc^2z z7$~G=8igMD|VGYCD z{l4k->qKq5RCV9STO<9+b|}^#wYT>hrJ-`$SR9f~mol1_`ZnA!g;`C07Dj2C+aaWU zhU)g)MrUBiNH6oGXX9wOs*I$Zq&eVQ_1^m0swieNWFnJ;#8s__>yuFf-Zv&^$KS{0 z%FzSc$K#04*tRkNP#pO?AS0fhZ5%~#H0t$mF*Ci5zLqB2H2gIUr)Zd=$k7Zf#W+VS#+l6w6O-kL&mV{dBwbNQ=+H)1qjP99Ita6xhK7(dP@{=OqOv#U z^U<7@F>7Ez;$;hiLnDN1kS4eD^XdobY87!4dXxf(RJouWv*6xYc-V5xJg-3lfDR)z zUp(Ha)OPsrkW~ntqGLA?r<%1Izc)$^f#@+3G zjKI5CbEW-QNl!a@UJvtMl%Os=)*u7tPi6`pgh5EgX|pEy+i!P=EDj&5li&e(0BeT} zEj~@2L*8!?%z_=y-aQ4qv(6XDJc<*-WWFIyR?tT~H#jS45n%Fp(^+|T?b_PVs0{fO zGgy<2ycyvpJfJR*|8Uur#XQc%d1D^gwvM=~LnDw8YZg{Or%;}!Iw*wKsB1GRl6bUW zjY3$3QYZFNcZntF;;J@+T79TihF{$NsU3YGLw;n;Zpl@8Qhp(kV0=9j+lP*@y#ZY` zTTJR9hw#cQp8c#|*3N*-k>K}2&SDTf$P`ui*PzBL&)MUiGMQX0=F zvR=YqfIkgy>wex)!ri36wAGbly)$8l4u$n{S^o(1M;@NNO z1tdLc;Z+4m48nGuxn&W;!zN_`*KtGA1H}xvWF#CsgK7a7=_wSz#v5Zki zP^{p`TIxkwx&_Hr02INlhVOV9_NHMqbx(@ujl#POaGZu?BpgN21Ex#Rk`NLPBpypp ziG-^huofj3FUnS)Wr~XI=fO%LgUaF?YQ{`+aXFe;f;3o;Rzh^BQi19S5jsuSAA0?P zF-u~+JaFSpx76F)QawSVMJz{PFC!%tw|}m=ZM8Cd-DBI>SWITfb8GK-vKiU6e@_Cb zHYJ&bLWH;}-6I&p^VgC(4ar98JMP@L|M8MR;z^P zl@%l?N$GMSmezApTCzztj+Y}WWFgJS97o6a2t&(-i;Y#M74AqvS0JF$nzwY@j)WnP zB_gkM5V9MI1oHft(uB-2k|sMm75?$x_BH|(wz_m^sCt@orsK2u zx$%Cl)YsByQG0dXLXtf9%aK)KZTn_lswdEXNUFwN?bCeHXEY^eMlMJ}rRpUUv=0?KiOD$f=tIb7iU2bY+Wm7MS%|hgGlyW4-%Iz=4s!=B;NrX8vQn^>_A1Jp&J#|5+ zs(xccqAW6Ok2RUxgfTh}owcW?_!0)$dv9_zK{;b<3OIX>FsjL?|+OE8!2Arz0 zzoG&`RoT0;Ev{5`)M#sG(3P2VI#q!1K9#4uqO-Q)=;WTyZcEGc*-cwwQmvSWpDX-V^Iu!0Ko|fE>DDRSSEZB)_+GvRh zb9fQU!y8K~FyHE~kwla_Jb!n59Hf|uaxq&13IBz zZF?&9pialvd*Hv68-kv2z8xLPctz2k94oZ`S7|hEl_agduLOgw_>h8x#j6a(2^ou$ zD7rGEnO|b6MA2dqQN;&h4Wo~BO1K)B#e^r8SUlw;c(B~pfc@p`s3oEIKdIUtxY+Jh zdIEaNS1rMpN>v}F5A-OKGf|5X!$Q9j5V1cKTHlV<63*^-lixt!9R{U_)o!)fyprJb zhBcB`0DK5Nz;iZ(?Bwm}5f)o#)n{lesoFvTk@VtMcfH6Z4@T$*Mg%Q^pxjTm`otPp z+Hn3A{7~xS{S$f0nH*7CpLK^EdR=V&bo*_ISNa0PaA-jBiJ((InEDfXx;*&n#{SJd zco&2>AS>bZkz&RQS!>WrSUHx`OCEyblEqvk84@87Eg~WM|0{q;z$XB4C4eJf4&V#` z6s9AW6Uc(3B}pVBHdf@VUg(poOu+BYaUKtqWL2!FcG59`^^vBjDVaBC(8W+oyI@V)9%leJQUSF z8ET)TEYU``eXP>w(~#c&DtWGzB3>2!`O#SGpQFQhza)h!tK!6l^DmJ8)|17CXq2Qt zrs5-*{*6_?Np6H( zC`X)Pt6~TbmfCk$`~6fX8;^StajI~!qgQmGk~#kxscZch#}UZX=EhURJ~83ai9oG( z_7+t^7TSq$*TIHT$&6=+i5RTLV2>~%5Eb9JkJxD6Zznd}uC@{DO?z?SvOPLtGkG;h zFxXyOfn<>cby~r1NLooMxX{tlARx1bq^wavzdC8i;$`5Y*|c{<>Ta(JRq2@OE|xV@ zt0wO}bM2w$@0?tH=b3BrM-J^3A~M|j7+Ju~^lM04L&ooI;s2$BQ|VfNME z1Ul3V(V_?np(uf>la-}_$OYtt%o>eFC&#;(N>LV90IJq}2efw~``IO61-k%Ut^I?z zR&l-`R$avA@SE?H^1qm}z8OY_*pGd>&({M)`4yIu`KQQ3Pn{)*U1wW2L zNsc99QVXGJbV&B{eng1|lg{xbBg+F*$Lm;rqasZ!HUiCM+9-%NHf#%;R_wNI)lN94 zj?oT5t+q?5%iIl)*YT@%Go?dhb338SRW7gSlO_G_zcAaab|at6+1v3#J!D`)^&Kf}3w#;ltM(tNwE&9s9I25k5miQ0 zPLX1RzQESL%ve$4%vAgP{v_|vO7J}dxy@!aS*UnYYbrsV8p}*wc#C)y>CPJPx2LT} z*J^}iTsW_qty+pgkth~x(=j<3HR5A)wZ8%12E<3feSp{w4gw+rATAt={*hJpNh_SS z?y?@Sl11wXGUCec$766N2179jVwM;Yi&d55RoJY;zUt~KQT6HM;WcX}hLLieR%Bl! zBKR;e!sK1TMoo2umeTC3SL`*BCL)-$pzf<(-wWzHc_>CAOWm5dV}vJ{Iy==60GDpn zEJ-hlqDo!eRnsbo&qz!pA#P2C^I@wvxV5Tm9!-dAuAhwz_9zaU$7-NNkoS*9naFd$stifSR*zgydnCz| zuFJ&Bu4Fy_EA;d}yYjnYjixG}XqMI5)ndo1uyBfNuwJw4t$&}Iko(2^JO z**uxg+xonM#Myit?BT0k^xV(HklDosSH*u2A>^)?>8vk;a%?xg0rl05k3v zQ;$=(_BMiAn>)01_m#1q{1E9`2_d|?KohLcw`DlIX1wmSxeTNs)SD&GiN4%$tbKFe zP4Vh@%>2#M@QIEia;8Re?G2{N&}daQ`BH+fT&V=$<3c&=QoS>S+E1z2>ywSKiVtdi zE?>k)y6FmyltfF@k}u%!(Tpz;3Izf_uhmL3oR{`8Svp-yoNxCb7&!BCLlx%W;NlX{T0s0H9*p6gHvIwR^JX1g65ok*8DI8RLVz>j7! zW<&eGGiI7fMxZ6EL_}x%ALaJvow9@-un6s5N7UVVjR~2q5+*2U?3h??M3>JzdgGRVpfOsAh!YCMp zo(2GVsi#)!VS*(CN{5`tgs7nyCg&1GPgnyklhOE#@5a0dS#rSJ4L;67o6Oob{*FW- z%jy%%Fptc6%G3U7r2Ss|_j3DtTttp~5V1+4%jOXI)_35GyBcGHMidFgPV^bLn}m=k{FCBujlQ;=>v9E)XZwW8Y%%wy(} z>_na~W+w!`7-kAVzQ~W7%p+!_c_hs2DPC8+vq;V%+M8h!9nJDZ2hSHh9-c=~of*$% zC$ff6m#k$qUIu2FFe6Q59TO8-WV*vJ93ELaH8n9Y(r9Ey;K)d$I1r9x z<9w{fOswI(3^coW?tQ|Hw-6S`uQCgre$s9i$Hnea%$j57`FV9=?Z~=y<#~4bG|RG9 zgk9AhSCxnGBFo&BWtL$T(Alv=UhZo}HpF?cE4@-7Rc`*l5#jBWIpEoUugPiBnOz*5z+~B{N>la_zD%6!KVHCyq02yUEIV_3f{4<>9&Vqx0^3-$(*+l`yy*wAG)9 zeBmX#-|aB4HUkAk(NWkq`t|n937z|cbQ@fDA#JF&lSDNY(x@&4y5*F)5xx69-*O4ou?ovl7PBY=K z$H~6@bimJgLN++S#S&TJH&kG7pv~oKqOtv3cTk80vBA+hZ0?x5{R8Mqmr$g_kQn^; z=GveCg*ce!CCQc;E&Kp}NzC{Rm?jl4D%#MBJDq92O+IQY(#{49pCR7?$QdO|cyuK3SHytkA>c-lOrgQWoG{9sV~HqY+Q%c20{3x* z3+&K-25vl=)M!9`;e2zU6P0v=l5RAD@jHcK&x&XSLm|f={)!`h z<+|#oSnI@^X%1}p51%)?$G90JHHBS3&C z1PB4dQ5%u~k&whBh-hsAchzdG3TRc(TD8`JqgwZ_dsl6(b!*+bjw=4o^PD6EYy0+n zudDz2egBWQB+tC}IEzDBsC{6PP?6PFBTVqK3F`m3+#xNOpB56v$>$|n$J9wP@ZMZr z4zNT$bp_=l;+&lZ{KA!CYmQMHZCxE*C}s@IoMH}m?w|mcUky6H8{R6TM80MpvOB_# zgqIwmyB|HHhf;$nIf2%_g4{b-`-Hk#n7e{v=wveM^>{B|TbhrLi9PO4S<8yCwD5#~ zm7ThR+6Pb%#|ET1n3IBc&h4pk#J91Bvbe2RW>}r(hp_7#ui9!yHRKSf#r?<7gyK zuwERqu48BPDU{*}EGJxqf0wEU>_V7mY( zH)a^q-Gc~l3C}DJqeq&!2F3+>hI`mJc=*`ZJH$r^I)@|%^7&3lNrXAkKP$}2$<5N$ z#op20IWWpIDm}y=#Df*EYc7zVf!Sc$X?E5a3~>gXMrpLMGNYS8bK2TiSYnZsR0Gh11V=)I=91fPhVhxSipfd7L6sOxnh`gBa<2HW8&B7>Jw!GvQ04NKyiQp ziFxY+5}rIBhBqtNY|?iCO>mgdyLWW=2cGEB6x|KJt`lmie|k;73^y-sG_x={FeGbm zT#_Uw)H9((J+-8BD$T^!FCo+^+~3v8CoViN!K9YT>|2#$)627WL2T^%*uD=f4wjg3vt_w~sRDD^I7hXo{;0&ptx^6+%B zHubZ0DvV{@TJgPOtP2>~8BE_mGY@A|e{UT3rh@azNO&5LF1&Z$n?C}td!oz_@3g!= zVjpeynr(On16U2(#NX(Tm%%6N;X})&pbYrNMcem|>v~x(dG8jTbaXu=OTIP z^cAj268;&Fz=FuvJBX41mxY7EV)~c`+0lD1U@18q@=uqT*m{QHohi7&CWKH zAbR)aF&JK+*`0|ge$JLw^wj9AaHrp&jPeN!42<#7(5-A7s|Qh1qF!t2{r!svr7r8- zT;glxXk!)-z;N_(gn!qhC4ykNyXSX$e&FnCXB!aUXzAfuf?-%+9ehhkHi8M16A-8@ zs+8JF{fRb)PBWpJGEA46E;ai|2PcfdBE}+yVa>SCxNdn3g4F~PtWVln+Abx*KHI_E z!Q64cyTG~LWx4C)UMi0dJ%92k^ELMy2El)5;KSgpq4cn(u%_^DSfPP1<|JxwZ#{k77BrSRG!rz7Dg$6j=13l0KJ@7Z+(LVtxRz1)I{{tZ?B`u|Y5A;9} z^gs{vKo9gl5A;9}^gs{%9Y~e-!2ejN>46^T0VBAS7LYb0ZEo5b02g#{Bke)ja}LHa z2VkcIH_r9+pELGC$gJivxUE^vSu?UJ+0$}7a>@`a;pOm7^vUb9v(L`Hs@(Y8<~-ND zY5d}RZvN2%-~R%{{eKKI3QiWL7H$(@04jAbOfW_;UC<_231F)piqt*O13l0KJcz1UE37% zqv`ROVZ#h-%rSyS=-L+8IFmG8+uDY1vRD89G>Wz30bQGd**cxkwW*kybGWWe!&!}wy81<(4>Dr_Y$u_A&vQ6rcY}1X_kUAvWqz=h8 zsY9|&>X2-cIwafHHcp;*P@7@Iza``?oWx^gG;Rai;dZDEU!h?Wj-$3CXgh?nP}|99 zy)%-LY`YkZ_dIM5PeRhSff=V3}r0e-YtJ*Gk<8K9>IZTKky<1(~@1!g#y8~_dufn``F z*ssMjs3!&AQm}d$_>`cP)&O!quN;g@u{to4kFYBMT|J##fW02zt_65-fL94{$}ll# zi$Plj=F|o{xPf~Diw3PALoW_vA|6Blg9@z00bLQG196D4YTepCpjQP(;cPA7QDcw^ z>OqF&kpC$^6-XC2mJa&mU{LW@(yztQxCV?s{izHV?2-e{YXKKB zuu}uHAOx)%vsbFZqC;RtdBw zN3?M)1mKV%Ih6+OhGHd1qZ)(Maex-|lrHQf?k>y)SP{S^{J$I_4D{0zCI4HZychCsPFYDMGju0GAZ(BE3qDbOEtK>y)7NS{?OVB)gubrh(4e63CE0)FC~IQPjLkXLUMBWhkEHD01{s{6jawJ_>2I%h9Ok^1mYD;u}@W*WSb|i$L ztPbTBJmQ8tD&s!`68BCCqP7}QWDSfQVb)ZrZbR)!4KMQ>NO&=@qP=jPw3L4Pyn z<|9 ztxDv}3Z31VNM^OJ#*n!OW(E<`KWS&ZACrEi(jASE6qEofSyL1SPZ42VwfyaT_7B*? zpdk^G9qLV{%k>gntcn5l8eNQZ9pB)nqRDkW6Qbww&uxprs@JWW18avG=}3aAjJ#W( z`J;?~fe&S08QP~`{qF3>d@H-@b^rEmIXXs^y(PDvudXAluBhp%M0y)CQNC9qDiwyl z)W}0%-Xble0ob}KEXj2_;zg>fRJ8_M8s`$yhLJjpYfzNP4Ls=My1Os^eXSZ-cv4E^ zO4Hq^yEIXU^jPyB+EHH(;E|w0rx~dc2NLuNX?E#l2v{LDsvX+D$j4;nmmmrB6)&+{ z78e1GN|bTleQZr0`{}Dpmwxn>tV>76Ii>q94ayayt;%(Bzq{s&{=}kcgY+8R5v3Nz zuN-jz=Z!1+f9e7H`j&%n(QH1J1$w3E{j6|=2gY!aMFn7{1oSe&XeJm51}lnm^TEhc zrKk?&fOW;F#*sJ#;FAyfWhlpGVL0l;USF`D4{*V~T&y3W!3Efg&`JTqod-s9!8cd8 z4(`YRBgLQ(+u0}!lJxjs7kQ?@)73n(hX!bKcF$}F9% z3)DIX=>+msWT5HOI)~lp=hElCkszq9vQo+JGayc%L zRaR*=xIn6rs)tD>EZo{UM_R6y*5UaosX_?%`o`}YS z;8z?I7l`DlDm+J|5G%#iV6>02N`dFpN;Hs?uu7)E<;Hj_lxjR(RxX!`MRHt65v)-H zqPRv`s}@VaSB17tq?Y2f3W-#WYoQ!GA)YG}OBEVv60VU-acNDtR3ec|a5*`OOQagH zTBd>mA{r8@RwR>aSVCEiRD<&Y6@juwq=2+UxK=HaNNYsuYFt_I=X%l)CcceBAg!#G zi_~~Xo=mJ(LUuz-q-qT$9mgUFv>dEPiwlbKga+(Lt(j_3olH@Q=T}q!-th>$NGnpv zrS*UbwG3#DiI>R4S|CEMNG*{nw0KlPG}}N4*VL+1av6}kLaETQ@G@mBUL&f~5 zP}^`A*D7(bS}M{?nYcuzQ2`4uagjoTtJE?uD+Ws-Vvz<{N!2wntrnmwuSc5J>r)FR zfLYY~Mg^q6gx|;>26j|xrKDD@W#Z6}z+NWYqbDF!;B{3pag`Bgb%3Z$A(q!lpwsEO zS1RQ7c!(^Nw5!o_fZ?yWCEWmOQ!UkK)j)5+2weo=b_1>?q=66_prV!5Kr5?dfT~1U zr;sZ}lJ43Qk*Wgj2gFeVQsA>zs{(E;kwP)ynkuPW)m@_?v=sHa<$P7#S&5uKqjaf=`g7rL?%*q_c({D>=x