Repository: NREL/ROSCO_toolbox (language: python)

Issue:
Print Version in DISCON Header
Minor update: print version in DISCON header.  Uses ROSCO_toolbox version in `setup.py`. Not necessarily same as ROSCO controller, but we can sync the versions going forward and this is a step towards helping us debug.

Note: this is based on #29 and includes those changes


Discussion / hints:

Fix patch:
diff --git a/Examples/DISCON.IN b/Examples/DISCON.IN
index 52344834..61a666db 100644
--- a/Examples/DISCON.IN
+++ b/Examples/DISCON.IN
@@ -1,45 +1,45 @@
-! Controller parameter input file for the NREL-5MW wind turbine
-!    - File written using ROSCO Controller tuning logic on 12/17/20
+! Controller parameter input file for the IEA-15-240-RWT-UMaineSemi wind turbine
+!    - File written using ROSCO version 2.1.1 controller tuning logic on 02/04/21
 
 !------- DEBUG ------------------------------------------------------------
 1                   ! LoggingLevel		- {0: write no debug files, 1: write standard output .dbg-file, 2: write standard output .dbg-file and complete avrSWAP-array .dbg2-file}
 
 !------- CONTROLLER FLAGS -------------------------------------------------
-1                   ! F_LPFType			- {1: first-order low-pass filter, 2: second-order low-pass filter}, [rad/s] (currently filters generator speed and pitch control signals
-0                   ! F_NotchType		- Notch on the measured generator speed and/or tower fore-aft motion (for floating) {0: disable, 1: generator speed, 2: tower-top fore-aft motion, 3: generator speed and tower-top fore-aft motion}
+2                   ! F_LPFType			- {1: first-order low-pass filter, 2: second-order low-pass filter}, [rad/s] (currently filters generator speed and pitch control signals
+2                   ! F_NotchType		- Notch on the measured generator speed and/or tower fore-aft motion (for floating) {0: disable, 1: generator speed, 2: tower-top fore-aft motion, 3: generator speed and tower-top fore-aft motion}
 0                   ! IPC_ControlMode	- Turn Individual Pitch Control (IPC) for fatigue load reductions (pitch contribution) {0: off, 1: 1P reductions, 2: 1P+2P reductions}
 2                   ! VS_ControlMode	- Generator torque control mode in above rated conditions {0: constant torque, 1: constant power, 2: TSR tracking PI control}
 1                   ! PC_ControlMode    - Blade pitch control mode {0: No pitch, fix to fine pitch, 1: active PI blade pitch control}
 0                   ! Y_ControlMode		- Yaw control mode {0: no yaw control, 1: yaw rate control, 2: yaw-by-IPC}
 1                   ! SS_Mode           - Setpoint Smoother mode {0: no setpoint smoothing, 1: introduce setpoint smoothing}
-0                   ! WE_Mode           - Wind speed estimator mode {0: One-second low pass filtered hub height wind speed, 1: Immersion and Invariance Estimator, 2: Extended Kalman Filter}
-0                   ! PS_Mode           - Pitch saturation mode {0: no pitch saturation, 1: implement pitch saturation}
+2                   ! WE_Mode           - Wind speed estimator mode {0: One-second low pass filtered hub height wind speed, 1: Immersion and Invariance Estimator, 2: Extended Kalman Filter}
+1                   ! PS_Mode           - Pitch saturation mode {0: no pitch saturation, 1: implement pitch saturation}
 0                   ! SD_Mode           - Shutdown mode {0: no shutdown procedure, 1: pitch to max pitch at shutdown}
-0                   ! Fl_Mode           - Floating specific feedback mode {0: no nacelle velocity feedback, 1: nacelle velocity feedback}
+1                   ! Fl_Mode           - Floating specific feedback mode {0: no nacelle velocity feedback, 1: nacelle velocity feedback}
 0                   ! Flp_Mode          - Flap control mode {0: no flap control, 1: steady state flap angle, 2: Proportional flap control}
 
 !------- FILTERS ----------------------------------------------------------
-1.57080             ! F_LPFCornerFreq	- Corner frequency (-3dB point) in the low-pass filters, [rad/s]
-0.00000             ! F_LPFDamping		- Damping coefficient [used only when F_FilterType = 2]
-0.44990             ! F_NotchCornerFreq	- Natural frequency of the notch filter, [rad/s]
+1.00810             ! F_LPFCornerFreq	- Corner frequency (-3dB point) in the low-pass filters, [rad/s]
+0.70000             ! F_LPFDamping		- Damping coefficient [used only when F_FilterType = 2]
+3.35500             ! F_NotchCornerFreq	- Natural frequency of the notch filter, [rad/s]
 0.00000   0.25000   ! F_NotchBetaNumDen	- Two notch damping values (numerator and denominator, resp) - determines the width and depth of the notch, [-]
 0.628320000000      ! F_SSCornerFreq    - Corner frequency (-3dB point) in the first order low pass filter for the setpoint smoother, [rad/s].
-0.23250   1.00000   ! F_FlCornerFreq    - Natural frequency and damping in the second order low pass filter of the tower-top fore-aft motion for floating feedback control [rad/s, -].
-0.00000   1.00000   ! F_FlpCornerFreq   - Corner frequency and damping in the second order low pass filter of the blade root bending moment for flap control [rad/s, -].
+0.21300   1.00000   ! F_FlCornerFreq    - Natural frequency and damping in the second order low pass filter of the tower-top fore-aft motion for floating feedback control [rad/s, -].
+1.16240   1.00000   ! F_FlpCornerFreq   - Corner frequency and damping in the second order low pass filter of the blade root bending moment for flap control [rad/s, -].
 
 !------- BLADE PITCH CONTROL ----------------------------------------------
-28                  ! PC_GS_n			- Amount of gain-scheduling table entries
-0.000000  0.055534  0.083631  0.106008  0.125390  0.142939  0.159177  0.174442  0.188870  0.202686  0.215959  0.228773  0.241173  0.253254  0.264982  0.276438  0.287644  0.298587  0.309327  0.319883  0.330260  0.340461  0.350473  0.360332  0.370046  0.379623  0.389066  0.398385                ! PC_GS_angles	    - Gain-schedule table: pitch angles
--0.019261  -0.016189  -0.013852  -0.012014  -0.010531  -0.009308  -0.008284  -0.007413  -0.006663  -0.006010  -0.005437  -0.004931  -0.004479  -0.004074  -0.003709  -0.003378  -0.003077  -0.002801  -0.002549  -0.002316  -0.002100  -0.001901  -0.001715  -0.001542  -0.001381  -0.001230  -0.001088  -0.000954                ! PC_GS_KP		- Gain-schedule table: pitch controller kp gains
--0.006968  -0.006022  -0.005302  -0.004736  -0.004279  -0.003903  -0.003587  -0.003319  -0.003088  -0.002887  -0.002710  -0.002554  -0.002415  -0.002290  -0.002178  -0.002076  -0.001983  -0.001898  -0.001820  -0.001749  -0.001682  -0.001621  -0.001564  -0.001510  -0.001461  -0.001414  -0.001370  -0.001329                ! PC_GS_KI		- Gain-schedule table: pitch controller ki gains
-0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0                ! PC_GS_KD			- Gain-schedule table: pitch controller kd gains
-0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0                ! PC_GS_TF			- Gain-schedule table: pitch controller tf gains (derivative filter)
+30                  ! PC_GS_n			- Amount of gain-scheduling table entries
+0.000000  0.061302  0.088725  0.110460  0.129231  0.146101  0.161618  0.176096  0.189763  0.202765  0.215213  0.227190  0.238754  0.249961  0.260854  0.271463  0.281817  0.291944  0.301857  0.311577  0.321120  0.330501  0.339728  0.348811  0.357760  0.366583  0.375288  0.383879  0.392362  0.400744                ! PC_GS_angles	    - Gain-schedule table: pitch angles
+-1.918261  -1.686902  -1.496241  -1.336407  -1.200485  -1.083480  -0.981701  -0.892358  -0.813301  -0.742853  -0.679678  -0.622707  -0.571067  -0.524044  -0.481046  -0.441577  -0.405219  -0.371619  -0.340474  -0.311524  -0.284547  -0.259345  -0.235751  -0.213614  -0.192804  -0.173205  -0.154715  -0.137241  -0.120702                ! PC_GS_KP		- Gain-schedule table: pitch controller kp gains
+-0.295306  -0.266827  -0.243358  -0.223684  -0.206953  -0.192551  -0.180022  -0.169025  -0.159294  -0.150622  -0.142846  -0.135833  -0.129477  -0.123688  -0.118396  -0.113537  -0.109062  -0.104926  -0.101092  -0.097529  -0.094208  -0.091106  -0.088202  -0.085477  -0.082915  -0.080503  -0.078227  -0.076076  -0.074040                ! PC_GS_KI		- Gain-schedule table: pitch controller ki gains
+0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0                ! PC_GS_KD			- Gain-schedule table: pitch controller kd gains
+0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0                ! PC_GS_TF			- Gain-schedule table: pitch controller tf gains (derivative filter)
 1.570800000000      ! PC_MaxPit			- Maximum physical pitch limit, [rad].
--0.00873000000      ! PC_MinPit			- Minimum physical pitch limit, [rad].
-0.174500000000      ! PC_MaxRat			- Maximum pitch rate (in absolute value) in pitch controller, [rad/s].
--0.17450000000      ! PC_MinRat			- Minimum pitch rate (in absolute value) in pitch controller, [rad/s].
-122.9096700000      ! PC_RefSpd			- Desired (reference) HSS speed for pitch controller, [rad/s].
--0.00873000000      ! PC_FinePit		- Record 5: Below-rated pitch angle set-point, [rad]
+0.000000000000      ! PC_MinPit			- Minimum physical pitch limit, [rad].
+0.034900000000      ! PC_MaxRat			- Maximum pitch rate (in absolute value) in pitch controller, [rad/s].
+-0.03490000000      ! PC_MinRat			- Minimum pitch rate (in absolute value) in pitch controller, [rad/s].
+0.791680000000      ! PC_RefSpd			- Desired (reference) HSS speed for pitch controller, [rad/s].
+0.000000000000      ! PC_FinePit		- Record 5: Below-rated pitch angle set-point, [rad]
 0.017450000000      ! PC_Switch			- Angle above lowest minimum pitch angle for switch, [rad]
 
 !------- INDIVIDUAL PITCH CONTROL -----------------------------------------
@@ -49,38 +49,38 @@
 0.0                 ! IPC_CornerFreqAct - Corner frequency of the first-order actuators model, to induce a phase lag in the IPC signal {0: Disable}, [rad/s]
 
 !------- VS TORQUE CONTROL ------------------------------------------------
-94.40000000000      ! VS_GenEff			- Generator efficiency mechanical power -> electrical power, [should match the efficiency defined in the generator properties!], [%]
-43093.51876000      ! VS_ArSatTq		- Above rated generator torque PI control saturation, [Nm]
-1500000.000000      ! VS_MaxRat			- Maximum torque rate (in absolute value) in torque controller, [Nm/s].
-47402.87063000      ! VS_MaxTq			- Maximum generator torque in Region 3 (HSS side), [Nm].
+96.55000000000      ! VS_GenEff			- Generator efficiency mechanical power -> electrical power, [should match the efficiency defined in the generator properties!], [%]
+19624046.66639      ! VS_ArSatTq		- Above rated generator torque PI control saturation, [Nm]
+4500000.000000      ! VS_MaxRat			- Maximum torque rate (in absolute value) in torque controller, [Nm/s].
+21586451.33303      ! VS_MaxTq			- Maximum generator torque in Region 3 (HSS side), [Nm].
 0.000000000000      ! VS_MinTq			- Minimum generator (HSS side), [Nm].
-34.68909000000      ! VS_MinOMSpd		- Optimal mode minimum speed, cut-in speed towards optimal mode gain path, [rad/s]
-2.526550000000      ! VS_Rgn2K			- Generator torque constant in Region 2 (HSS side), [N-m/(rad/s)^2]
-5000000.000000      ! VS_RtPwr			- Wind turbine rated power [W]
-43093.51876000      ! VS_RtTq			- Rated torque, [Nm].
-122.9096700000      ! VS_RefSpd			- Rated generator speed [rad/s]
+0.523600000000      ! VS_MinOMSpd		- Optimal mode minimum speed, cut-in speed towards optimal mode gain path, [rad/s]
+34937749.21735      ! VS_Rgn2K			- Generator torque constant in Region 2 (HSS side), [N-m/(rad/s)^2]
+15000000.00000      ! VS_RtPwr			- Wind turbine rated power [W]
+19624046.66639      ! VS_RtTq			- Rated torque, [Nm].
+0.791680000000      ! VS_RefSpd			- Rated generator speed [rad/s]
 1                   ! VS_n				- Number of generator PI torque controller gains
--998.986000000      ! VS_KP				- Proportional gain for generator PI torque controller [1/(rad/s) Nm]. (Only used in the transitional 2.5 region if VS_ControlMode =/ 2)
--185.790360000      ! VS_KI				- Integral gain for generator PI torque controller [1/rad Nm]. (Only used in the transitional 2.5 region if VS_ControlMode =/ 2)
-7.51                ! VS_TSRopt			- Power-maximizing region 2 tip-speed-ratio [rad].
+-38005940.32297      ! VS_KP				- Proportional gain for generator PI torque controller [1/(rad/s) Nm]. (Only used in the transitional 2.5 region if VS_ControlMode =/ 2)
+-4588245.18720      ! VS_KI				- Integral gain for generator PI torque controller [1/rad Nm]. (Only used in the transitional 2.5 region if VS_ControlMode =/ 2)
+9.00                ! VS_TSRopt			- Power-maximizing region 2 tip-speed-ratio [rad].
 
 !------- SETPOINT SMOOTHER ---------------------------------------------
 1.00000             ! SS_VSGain         - Variable speed torque controller setpoint smoother gain, [-].
 0.00100             ! SS_PCGain         - Collective pitch controller setpoint smoother gain, [-].
 
 !------- WIND SPEED ESTIMATOR ---------------------------------------------
-63.000              ! WE_BladeRadius	- Blade length (distance from hub center to blade tip), [m]
+120.000             ! WE_BladeRadius	- Blade length (distance from hub center to blade tip), [m]
 1                   ! WE_CP_n			- Amount of parameters in the Cp array
 0.0 0.0 0.0 0.0     ! WE_CP - Parameters that define the parameterized CP(lambda) function
 0.0          		! WE_Gamma			- Adaption gain of the wind speed estimator algorithm [m/rad]
-97.0                ! WE_GearboxRatio	- Gearbox ratio [>=1],  [-]
-43702538.05700      ! WE_Jtot			- Total drivetrain inertia, including blades, hub and casted generator inertia to LSS, [kg m^2]
+1.0                 ! WE_GearboxRatio	- Gearbox ratio [>=1],  [-]
+318628138.00000      ! WE_Jtot			- Total drivetrain inertia, including blades, hub and casted generator inertia to LSS, [kg m^2]
 1.225               ! WE_RhoAir			- Air density, [kg m^-3]
-"Cp_Ct_Cq.NREL5MW.txt"      ! PerfFileName      - File containing rotor performance tables (Cp,Ct,Cq)
-52      24          ! PerfTableSize     - Size of rotor performance tables, first number refers to number of blade pitch angles, second number referse to number of tip-speed ratios
-45                  ! WE_FOPoles_N      - Number of first-order system poles used in EKF
-3.00 3.50 4.00 4.50 5.00 5.50 6.00 6.50 7.00 7.50 8.00 8.50 9.00 9.50 10.00 10.50 11.00 11.40 11.90 12.40 12.90 13.40 13.90 14.40 14.90 15.40 15.90 16.40 16.90 17.40 17.90 18.40 18.90 19.40 19.90 20.40 20.90 21.40 21.90 22.40 22.90 23.40 23.90 24.40 24.90               ! WE_FOPoles_v      - Wind speeds corresponding to first-order system poles [m/s]
--0.01770597 -0.02065697 -0.02360796 -0.02655896 -0.02950995 -0.03246095 -0.03541194 -0.03836294 -0.04131393 -0.04426493 -0.04721592 -0.05016692 -0.05311791 -0.05606891 -0.05901990 -0.06197090 -0.06492189 -0.05552595 -0.05550495 -0.06612150 -0.07823391 -0.09181547 -0.10541082 -0.12063288 -0.13526687 -0.15098364 -0.16805193 -0.18381181 -0.20083198 -0.21911394 -0.23737327 -0.25461250 -0.27320900 -0.29297106 -0.31361831 -0.33167820 -0.35038172 -0.37015848 -0.39096899 -0.41270837 -0.43763254 -0.47283160 -0.50939485 -0.54727356 -0.58644343               ! WE_FOPoles        - First order system poles
+"Cp_Ct_Cq.IEA15MW.txt"      ! PerfFileName      - File containing rotor performance tables (Cp,Ct,Cq)
+104     72          ! PerfTableSize     - Size of rotor performance tables, first number refers to number of blade pitch angles, second number referse to number of tip-speed ratios
+60                  ! WE_FOPoles_N      - Number of first-order system poles used in EKF
+3.00 3.27 3.53 3.80 4.07 4.33 4.60 4.87 5.14 5.40 5.67 5.94 6.20 6.47 6.74 7.00 7.27 7.54 7.80 8.07 8.34 8.60 8.87 9.14 9.41 9.67 9.94 10.21 10.47 10.74 10.74 11.23 11.72 12.22 12.71 13.20 13.69 14.18 14.67 15.17 15.66 16.15 16.64 17.13 17.62 18.12 18.61 19.10 19.59 20.08 20.57 21.07 21.56 22.05 22.54 23.03 23.52 24.02 24.51 25.00               ! WE_FOPoles_v      - Wind speeds corresponding to first-order system poles [m/s]
+-0.02366483 -0.02577018 -0.02787553 -0.02998089 -0.03208624 -0.03419159 -0.03629695 -0.03840230 -0.04050765 -0.04261301 -0.04471836 -0.04682371 -0.04892907 -0.05103442 -0.05313977 -0.05524513 -0.05735048 -0.05945583 -0.06156119 -0.06366654 -0.06577189 -0.06787725 -0.06998260 -0.07208795 -0.07419331 -0.07629866 -0.07840401 -0.08050937 -0.08261472 -0.08472008 -0.07921295 -0.05358619 -0.05636426 -0.06307564 -0.07173987 -0.08172495 -0.09271927 -0.10454428 -0.11705643 -0.13017613 -0.14379976 -0.15793978 -0.17258746 -0.18766434 -0.20315149 -0.21909644 -0.23538854 -0.25208919 -0.26915631 -0.28659300 -0.30437969 -0.32249538 -0.34096095 -0.35974552 -0.37881117 -0.39822177 -0.41789494 -0.43785131 -0.45808118 -0.47857910               ! WE_FOPoles        - First order system poles
 
 !------- YAW CONTROL ------------------------------------------------------
 0.0                 ! Y_ErrThresh		- Yaw error threshold. Turbine begins to yaw when it passes this. [rad^2 s]
@@ -101,16 +101,16 @@
 0.0                 ! FA_IntSat			- Integrator saturation (maximum signal amplitude contribution to pitch from FA damper), [rad]
 
 !------- MINIMUM PITCH SATURATION -------------------------------------------
-45                  ! PS_BldPitchMin_N  - Number of values in minimum blade pitch lookup table (should equal number of values in PS_WindSpeeds and PS_BldPitchMin)
-3.00 3.50 4.00 4.50 5.00 5.50 6.00 6.50 7.00 7.50 8.00 8.50 9.00 9.50 10.00 10.50 11.00 11.40 11.90 12.40 12.90 13.40 13.90 14.40 14.90 15.40 15.90 16.40 16.90 17.40 17.90 18.40 18.90 19.40 19.90 20.40 20.90 21.40 21.90 22.40 22.90 23.40 23.90 24.40 24.90               ! PS_WindSpeeds     - Wind speeds corresponding to minimum blade pitch angles [m/s]
--0.00872665 -0.00872665 -0.00872665 -0.00872665 -0.00872665 -0.00872665 -0.00872665 -0.00872665 -0.00872665 -0.00872665 -0.00872665 -0.00872665 -0.00872665 -0.00872665 -0.00872665 -0.00872665 -0.00872665 -0.00872665 -0.00872665 -0.00872665 -0.00872665 -0.00872665 -0.00872665 -0.00872665 -0.00872665 -0.00872665 -0.00872665 -0.00872665 -0.00872665 -0.00872665 -0.00872665 -0.00872665 -0.00872665 -0.00872665 -0.00872665 -0.00872665 -0.00872665 -0.00872665 -0.00872665 -0.00872665 -0.00872665 -0.00872665 -0.00872665 -0.00872665 -0.00872665               ! PS_BldPitchMin    - Minimum blade pitch angles [rad]
+60                  ! PS_BldPitchMin_N  - Number of values in minimum blade pitch lookup table (should equal number of values in PS_WindSpeeds and PS_BldPitchMin)
+3.00 3.27 3.53 3.80 4.07 4.33 4.60 4.87 5.14 5.40 5.67 5.94 6.20 6.47 6.74 7.00 7.27 7.54 7.80 8.07 8.34 8.60 8.87 9.14 9.41 9.67 9.94 10.21 10.47 10.74 10.74 11.23 11.72 12.22 12.71 13.20 13.69 14.18 14.67 15.17 15.66 16.15 16.64 17.13 17.62 18.12 18.61 19.10 19.59 20.08 20.57 21.07 21.56 22.05 22.54 23.03 23.52 24.02 24.51 25.00               ! PS_WindSpeeds     - Wind speeds corresponding to minimum blade pitch angles [m/s]
+0.06981317 0.06981317 0.06981317 0.06544985 0.06108652 0.06108652 0.05672320 0.05235988 0.04363323 0.03926991 0.03054326 0.02617994 0.01745329 0.01308997 0.00436332 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000               ! PS_BldPitchMin    - Minimum blade pitch angles [rad]
 
 !------- SHUTDOWN -----------------------------------------------------------
-0.436300000000      ! SD_MaxPit         - Maximum blade pitch angle to initiate shutdown, [rad]
+0.400740000000      ! SD_MaxPit         - Maximum blade pitch angle to initiate shutdown, [rad]
 0.418880000000      ! SD_CornerFreq     - Cutoff Frequency for first order low-pass filter for blade pitch angle, [rad/s]
 
 !------- Floating -----------------------------------------------------------
-0.000000000000      ! Fl_Kp             - Nacelle velocity proportional feedback gain [s]
+-9.32577000000      ! Fl_Kp             - Nacelle velocity proportional feedback gain [s]
 
 !------- FLAP ACTUATION -----------------------------------------------------
 0.000000000000      ! Flp_Angle         - Initial or steady state flap angle [rad]
diff --git a/Examples/NREL5MW_saved.p b/Examples/NREL5MW_saved.p
index b8852402..fbdc484a 100644
Binary files a/Examples/NREL5MW_saved.p and b/Examples/NREL5MW_saved.p differ
diff --git a/Examples/example_01.py b/Examples/example_01.py
index 2433be29..f5de2dd7 100644
--- a/Examples/example_01.py
+++ b/Examples/example_01.py
@@ -18,7 +18,8 @@
 from ROSCO_toolbox import turbine as ROSCO_turbine
 
 # Load yaml file
-parameter_filename = os.path.join(os.path.dirname(__file__),'NREL5MW_example.yaml')
+this_dir = os.path.dirname(os.path.abspath(__file__))
+parameter_filename = os.path.join(this_dir,'NREL5MW_example.yaml')
 inps = yaml.safe_load(open(parameter_filename))
 path_params         = inps['path_params']
 turbine_params      = inps['turbine_params']
@@ -28,13 +29,13 @@
 
 turbine.load_from_fast(
     path_params['FAST_InputFile'],
-    os.path.join(os.path.dirname(__file__),path_params['FAST_directory']),
+    os.path.join(this_dir,path_params['FAST_directory']),
     dev_branch=True,
-    rot_source='txt',txt_filename=os.path.join(os.path.dirname(__file__),path_params['rotor_performance_filename'])
+    rot_source='txt',txt_filename=os.path.join(this_dir,path_params['rotor_performance_filename'])
     )
 
 # Print some basic turbine info
 print(turbine)
 
 # Save the turbine model
-turbine.save(os.path.join(os.path.dirname(__file__),'NREL5MW_saved.p'))
\ No newline at end of file
+turbine.save(os.path.join(this_dir,'NREL5MW_saved.p'))
\ No newline at end of file
diff --git a/Examples/example_02.py b/Examples/example_02.py
index 12c1db70..51254f47 100644
--- a/Examples/example_02.py
+++ b/Examples/example_02.py
@@ -19,7 +19,8 @@
 turbine = ROSCO_turbine.Turbine
 
 # Load quick from python pickle
-turbine = turbine.load(os.path.join(os.path.dirname(__file__),'NREL5MW_saved.p'))
+this_dir = os.path.dirname(os.path.abspath(__file__))
+turbine = turbine.load(os.path.join(this_dir,'NREL5MW_saved.p'))
 
 # plot rotor performance 
 print('Plotting Cp data')
diff --git a/Examples/example_03.py b/Examples/example_03.py
index 8a352da3..c262ede9 100644
--- a/Examples/example_03.py
+++ b/Examples/example_03.py
@@ -19,7 +19,8 @@
 control_params = {}
 
 # Load yaml file
-parameter_filename = os.path.join(os.path.dirname(__file__),'NREL5MW_example.yaml')
+this_dir = os.path.dirname(os.path.abspath(__file__))
+parameter_filename = os.path.join(this_dir,'NREL5MW_example.yaml')
 inps = yaml.safe_load(open(parameter_filename))
 path_params         = inps['path_params']
 turbine_params      = inps['turbine_params']
@@ -29,11 +30,11 @@
 turbine = ROSCO_turbine.Turbine(turbine_params)
 turbine.load_from_fast(
     path_params['FAST_InputFile'],
-    os.path.join(os.path.dirname(__file__),path_params['FAST_directory']),
+    os.path.join(this_dir,path_params['FAST_directory']),
     dev_branch=True,
     rot_source='cc-blade',
     txt_filename=None)
 
 # Write rotor performance text file
-txt_filename = os.path.join(os.path.dirname(__file__),'Cp_Ct_Cq.Ex03.txt')
+txt_filename = os.path.join(this_dir,'Cp_Ct_Cq.Ex03.txt')
 write_rotor_performance(turbine,txt_filename=txt_filename)
diff --git a/Examples/example_04.py b/Examples/example_04.py
index 431749eb..9da8a7ca 100644
--- a/Examples/example_04.py
+++ b/Examples/example_04.py
@@ -20,7 +20,8 @@
 from ROSCO_toolbox.utilities import write_DISCON
 
 # Load yaml file 
-parameter_filename = os.path.join(os.path.dirname(__file__),'NREL5MW_example.yaml')
+this_dir = os.path.dirname(os.path.abspath(__file__))
+parameter_filename = os.path.join(this_dir,'NREL5MW_example.yaml')
 inps = yaml.safe_load(open(parameter_filename))
 path_params         = inps['path_params']
 turbine_params      = inps['turbine_params']
@@ -33,9 +34,9 @@
 # Load turbine data from OpenFAST and rotor performance text file
 turbine.load_from_fast(
     path_params['FAST_InputFile'],
-    os.path.join(os.path.dirname(__file__),path_params['FAST_directory']),
+    os.path.join(this_dir,path_params['FAST_directory']),
     dev_branch=True,
-    rot_source='txt',txt_filename=os.path.join(os.path.dirname(__file__),path_params['rotor_performance_filename'])
+    rot_source='txt',txt_filename=os.path.join(this_dir,path_params['rotor_performance_filename'])
     )
 
 # Tune controller 
diff --git a/Examples/example_05.py b/Examples/example_05.py
index c97dc472..f88a779f 100644
--- a/Examples/example_05.py
+++ b/Examples/example_05.py
@@ -25,7 +25,7 @@
 from ROSCO_toolbox import control_interface as ROSCO_ci
 
 # Specify controller dynamic library path and name
-this_dir = os.path.dirname(__file__)
+this_dir = os.path.dirname(os.path.abspath(__file__))
 lib_name = os.path.join(this_dir,'../ROSCO/build/libdiscon.dylib')
 param_filename = os.path.join(this_dir,'DISCON.IN')
 
diff --git a/Examples/example_06.py b/Examples/example_06.py
index 9731c235..5e038527 100644
--- a/Examples/example_06.py
+++ b/Examples/example_06.py
@@ -19,10 +19,10 @@
 from ROSCO_toolbox.utilities import write_DISCON, run_openfast
 from ROSCO_toolbox import sim as ROSCO_sim
 
-this_dir = os.path.dirname(__file__)
+this_dir = os.path.dirname(os.path.abspath(__file__))
 
 # Load yaml file 
-parameter_filename = os.path.join(this_dir,'NREL5MW_example.yaml')
+parameter_filename = os.path.join(os.path.dirname(this_dir), 'Tune_Cases', 'IEA15MW.yaml') 
 inps = yaml.safe_load(open(parameter_filename))
 path_params         = inps['path_params']
 turbine_params      = inps['turbine_params']
@@ -33,7 +33,10 @@
 controller      = ROSCO_controller.Controller(controller_params)
 
 # Load turbine data from OpenFAST and rotor performance text file
-turbine.load_from_fast(path_params['FAST_InputFile'],path_params['FAST_directory'],dev_branch=True,rot_source='txt',txt_filename=path_params['rotor_performance_filename'])
+turbine.load_from_fast(path_params['FAST_InputFile'], \
+  os.path.join(this_dir,path_params['FAST_directory']), \
+    dev_branch=True,rot_source='txt',\
+      txt_filename=os.path.join(this_dir,path_params['FAST_directory'],path_params['rotor_performance_filename']))
 
 # Tune controller 
 controller.tune_controller(turbine)
@@ -44,7 +47,8 @@
 
 # Run OpenFAST
 # --- May need to change fastcall if you use a non-standard command to call openfast
-run_openfast(path_params['FAST_directory'], fastcall='openfast_sdev', fastfile=path_params['FAST_InputFile'], chdir=True)
+fastcall = 'openfast'
+run_openfast(path_params['FAST_directory'], fastcall=fastcall, fastfile=path_params['FAST_InputFile'], chdir=True)
 
 
 
diff --git a/Examples/example_08.py b/Examples/example_08.py
index 22841a9e..43786e82 100644
--- a/Examples/example_08.py
+++ b/Examples/example_08.py
@@ -19,7 +19,7 @@
 from ROSCO_toolbox.ofTools.fast_io import output_processing
 import os
 
-this_dir = os.path.dirname(__file__)
+this_dir = os.path.dirname(os.path.abspath(__file__))
 
 # Define openfast output filenames
 filenames = ["../Test_Cases/NREL-5MW/NREL-5MW.outb"]
diff --git a/Examples/example_09.py b/Examples/example_09.py
index 3065450f..2e909ebc 100644
--- a/Examples/example_09.py
+++ b/Examples/example_09.py
@@ -14,11 +14,11 @@
 from ROSCO_toolbox.utilities import run_openfast
 import os
 
-this_dir = os.path.dirname(__file__)
+this_dir = os.path.dirname(os.path.abspath(__file__))
 
 # Define openfast output filenames
 wind_directory = os.path.join(this_dir,'../Test_Cases/Wind/')
 turbsim_infile = '90m_12mps_twr.inp'
 
-run_openfast(wind_directory, fastcall='turbsim_sdev', fastfile=turbsim_infile, chdir=False)
+run_openfast(wind_directory, fastcall='turbsim', fastfile=turbsim_infile, chdir=False)
 
diff --git a/Examples/example_10.py b/Examples/example_10.py
index ed98aa48..b9b26186 100644
--- a/Examples/example_10.py
+++ b/Examples/example_10.py
@@ -21,10 +21,10 @@
 from ROSCO_toolbox import turbine as ROSCO_turbine
 from ROSCO_toolbox import controller as ROSCO_controller
 
-rt_dir = os.path.dirname(os.path.dirname(__file__))
+this_dir =  os.path.dirname(os.path.abspath(__file__))
 
 # Load yaml file
-parameter_filename = os.path.join(rt_dir,'Tune_Cases/BAR.yaml')
+parameter_filename = os.path.join(os.path.dirname(this_dir),'Tune_Cases/BAR.yaml')
 inps = yaml.safe_load(open(parameter_filename))
 path_params         = inps['path_params']
 turbine_params      = inps['turbine_params']
@@ -34,7 +34,7 @@
 turbine = ROSCO_turbine.Turbine(turbine_params)
 # turbine.load_from_fast(path_params['FAST_InputFile'],path_params['FAST_directory'],dev_branch=True,rot_source='txt',txt_filename=path_params['rotor_performance_filename'])
 turbine.load_from_fast(path_params['FAST_InputFile'], \
-    os.path.join(rt_dir,path_params['FAST_directory']),dev_branch=True)
+    os.path.join(this_dir,path_params['FAST_directory']),dev_branch=True)
 
 # Tune controller
 controller = ROSCO_controller.Controller(controller_params)
diff --git a/ROSCO_toolbox/controller.py b/ROSCO_toolbox/controller.py
index ebafca71..12f5645b 100644
--- a/ROSCO_toolbox/controller.py
+++ b/ROSCO_toolbox/controller.py
@@ -158,8 +158,8 @@ def tune_controller(self, turbine):
         TSR_rated = rated_rotor_speed*R/turbine.v_rated  # TSR at rated
 
         # separate wind speeds by operation regions
-        v_below_rated = np.arange(turbine.v_min,turbine.v_rated,0.5)             # below rated
-        v_above_rated = np.arange(turbine.v_rated,turbine.v_max,0.5)             # above rated
+        v_below_rated = np.linspace(turbine.v_min,turbine.v_rated, num=30)             # below rated
+        v_above_rated = np.linspace(turbine.v_rated,turbine.v_max, num=30)             # above rated
         v = np.concatenate((v_below_rated, v_above_rated))
 
         # separate TSRs by operations regions
@@ -242,12 +242,12 @@ def tune_controller(self, turbine):
 
         # separate and define below and above rated parameters
         A_vs = A[0:len(v_below_rated)]          # below rated
-        A_pc = A[len(v_below_rated):len(v)]     # above rated
+        A_pc = A[-len(v_above_rated)+1:]     # above rated
         B_tau = B_tau * np.ones(len(v))
 
         # -- Find gain schedule --
         self.pc_gain_schedule = ControllerTypes()
-        self.pc_gain_schedule.second_order_PI(self.zeta_pc, self.omega_pc,A_pc,B_beta[len(v_below_rated):len(v)],linearize=True,v=v_above_rated)
+        self.pc_gain_schedule.second_order_PI(self.zeta_pc, self.omega_pc,A_pc,B_beta[-len(v_above_rated)+1:],linearize=True,v=v_above_rated[1:])
         self.vs_gain_schedule = ControllerTypes()
         self.vs_gain_schedule.second_order_PI(self.zeta_vs, self.omega_vs,A_vs,B_tau[0:len(v_below_rated)],linearize=False,v=v_below_rated)
 
@@ -303,7 +303,8 @@ def tune_controller(self, turbine):
         # --- Floating feedback term ---
         if self.Fl_Mode == 1: # Floating feedback
             Kp_float = (dtau_dv/dtau_dbeta) * turbine.TowerHt * Ng 
-            self.Kp_float = Kp_float[len(v_below_rated)]
+            f_kp     = interpolate.interp1d(v,Kp_float)
+            self.Kp_float = f_kp(turbine.v_rated * (1.05))   # get Kp at v_rated + 0.5 m/s
             # Turn on the notch filter if floating
             self.F_NotchType = 2
             
diff --git a/ROSCO_toolbox/ofTools/README.md b/ROSCO_toolbox/ofTools/README.md
index 5b26c1c7..2207a1a6 100644
--- a/ROSCO_toolbox/ofTools/README.md
+++ b/ROSCO_toolbox/ofTools/README.md
@@ -1,6 +1,11 @@
 # OpenFAST Tools
 A set of OpenFAST tools is provided to ease the use of the ROSCO toolbox in conjuction with [OpenFAST](https://github.com/openfast/openfast).
 
+OpenFAST can be installed using conda-forge using
+```
+conda install -c conda-forge openfast
+```
+
 Note that most of these scripts are copy and pasted from [weis's aeroleasticse](https://github.com/WISDEM/WEIS/tree/master/weis/aeroelasticse)
 
 ### case_gen
diff --git a/ROSCO_toolbox/ofTools/case_gen/CaseGen_IEC.py b/ROSCO_toolbox/ofTools/case_gen/CaseGen_IEC.py
index ef92e3c8..408cb189 100644
--- a/ROSCO_toolbox/ofTools/case_gen/CaseGen_IEC.py
+++ b/ROSCO_toolbox/ofTools/case_gen/CaseGen_IEC.py
@@ -79,7 +79,10 @@ def execute(self, case_inputs={}):
                 IEC_WindType = 'NTM'
                 alpha = 0.2
                 iecwind = pyIECWind_turb()
-                TMax = 630.
+                if self.TMax == 0:
+                    TMax = 720.
+                else:
+                    TMax = self.TMax
 
             elif dlc in [1.3, 6.1, 6.3]:
                 if self.Turbine_Class == 'I':
@@ -93,19 +96,28 @@ def execute(self, case_inputs={}):
                 IEC_WindType = '%uETM'%x
                 alpha = 0.11
                 iecwind = pyIECWind_turb()
-                TMax = 630.
+                if self.TMax == 0:
+                    TMax = 720.
+                else:
+                    TMax = self.TMax
 
             elif dlc == 1.4:
                 IEC_WindType = 'ECD'
                 alpha = 0.2
                 iecwind = pyIECWind_extreme()
-                TMax = 90.
+                if self.TMax == 0:
+                    TMax = 120.
+                else:
+                    TMax = self.TMax
 
             elif dlc == 1.5:
                 IEC_WindType = 'EWS'
                 alpha = 0.2
                 iecwind = pyIECWind_extreme()
-                TMax = 90.
+                if self.TMax == 0:
+                    TMax = 120.
+                else:
+                    TMax = self.TMax
 
             # Windfile generation setup
             if self.TMax == 0.:
@@ -144,24 +156,24 @@ def execute(self, case_inputs={}):
                 case_inputs_i[("ServoDyn","TPitManS1")]  = {'vals':[self.TStart], 'group':0}
                 case_inputs_i[("ServoDyn","TPitManS2")]  = {'vals':[self.TStart], 'group':0}
                 case_inputs_i[("ServoDyn","TPitManS3")]  = {'vals':[self.TStart], 'group':0}
-                case_inputs_i[("ServoDyn","PitManRat1")] = {'vals':[self.PC_MaxRat], 'group':0}
-                case_inputs_i[("ServoDyn","PitManRat2")] = {'vals':[self.PC_MaxRat], 'group':0}
-                case_inputs_i[("ServoDyn","PitManRat3")] = {'vals':[self.PC_MaxRat], 'group':0}
-                case_inputs_i[("ServoDyn","BlPitchF1")]  = {'vals':[90.], 'group':0}
-                case_inputs_i[("ServoDyn","BlPitchF2")]  = {'vals':[90.], 'group':0}
-                case_inputs_i[("ServoDyn","BlPitchF3")]  = {'vals':[90.], 'group':0}
+                case_inputs_i[("ServoDyn","PitManRat(1)")] = {'vals':[self.PC_MaxRat], 'group':0}
+                case_inputs_i[("ServoDyn","PitManRat(2)")] = {'vals':[self.PC_MaxRat], 'group':0}
+                case_inputs_i[("ServoDyn","PitManRat(3)")] = {'vals':[self.PC_MaxRat], 'group':0}
+                case_inputs_i[("ServoDyn","BlPitchF(1)")]  = {'vals':[90.], 'group':0}
+                case_inputs_i[("ServoDyn","BlPitchF(2)")]  = {'vals':[90.], 'group':0}
+                case_inputs_i[("ServoDyn","BlPitchF(3)")]  = {'vals':[90.], 'group':0}
                 case_inputs_i[("ServoDyn","GenTiStp")]   = {'vals':["True"], 'group':0}
                 case_inputs_i[("ServoDyn","TimGenOf")]   = {'vals':[self.TStart], 'group':0}
             else:
                 case_inputs_i[("ServoDyn","TPitManS1")]  = {'vals':[9999.9], 'group':0}
                 case_inputs_i[("ServoDyn","TPitManS2")]  = {'vals':[9999.9], 'group':0}
                 case_inputs_i[("ServoDyn","TPitManS3")]  = {'vals':[9999.9], 'group':0}
-                case_inputs_i[("ServoDyn","PitManRat1")] = {'vals':[2.], 'group':0}
-                case_inputs_i[("ServoDyn","PitManRat2")] = {'vals':[2.], 'group':0}
-                case_inputs_i[("ServoDyn","PitManRat3")] = {'vals':[2.], 'group':0}
-                case_inputs_i[("ServoDyn","BlPitchF1")]  = {'vals':[0.], 'group':0}
-                case_inputs_i[("ServoDyn","BlPitchF2")]  = {'vals':[0.], 'group':0}
-                case_inputs_i[("ServoDyn","BlPitchF3")]  = {'vals':[0.], 'group':0}
+                case_inputs_i[("ServoDyn","PitManRat(1)")] = {'vals':[2.], 'group':0}
+                case_inputs_i[("ServoDyn","PitManRat(2)")] = {'vals':[2.], 'group':0}
+                case_inputs_i[("ServoDyn","PitManRat(3)")] = {'vals':[2.], 'group':0}
+                case_inputs_i[("ServoDyn","BlPitchF(1)")]  = {'vals':[0.], 'group':0}
+                case_inputs_i[("ServoDyn","BlPitchF(2)")]  = {'vals':[0.], 'group':0}
+                case_inputs_i[("ServoDyn","BlPitchF(3)")]  = {'vals':[0.], 'group':0}
                 case_inputs_i[("ServoDyn","GenTiStp")]   = {'vals':["True"], 'group':0}
                 case_inputs_i[("ServoDyn","TimGenOf")]   = {'vals':[9999.9], 'group':0}
 
@@ -192,7 +204,6 @@ def execute(self, case_inputs={}):
                 case_inputs_i[("ServoDyn","PCMode")]    = {'vals':[5], 'group':0}
                 case_inputs_i[("AeroDyn15","AFAeroMod")]= {'vals':[2], 'group':0}
                 case_inputs_i[("ElastoDyn","GenDOF")]   = {'vals':["True"], 'group':0}
-                case_inputs_i[("ElastoDyn","YawDOF")]   = {'vals':["True"], 'group':0}
 
 
             # Matrix combining N dlc variables that affect wind file generation
@@ -283,7 +294,9 @@ def execute(self, case_inputs={}):
             if ("Fst","TMax") not in case_inputs_i:
                 case_inputs_i[("Fst","TMax")] = {'vals':[TMax], 'group':0}
             case_inputs_i[("InflowWind","WindType")] = {'vals':WindFile_type_out, 'group':1}
-            case_inputs_i[("InflowWind","Filename")] = {'vals':WindFile_out, 'group':1}
+            case_inputs_i[("InflowWind","Filename_Uni")] = {'vals':WindFile_out, 'group':1}
+            case_inputs_i[("InflowWind","FileName_BTS")] = {'vals':WindFile_out, 'group':1}
+            case_inputs_i[("InflowWind","RefLength")] = {'vals':[self.D], 'group':0}
 
             if len(self.dlc_inputs['Yaw'][i]) > 0:
                     case_inputs_i[("ElastoDyn","NacYaw")] = {'vals':self.dlc_inputs['Yaw'][i], 'group':2}
@@ -298,7 +311,7 @@ def execute(self, case_inputs={}):
             # make unique wave seeds
             if self.uniqueWaveSeeds:
                 seed_base   = int(float(dlc) * 10000)   # set wave seed based on dlc so no repeats
-                num_in_dlc  = len(case_inputs_i[("InflowWind","Filename")]['vals'])  # sims in each DLC
+                num_in_dlc  = len(case_inputs_i[("InflowWind","FileName_BTS")]['vals'])  # sims in each DLC
                 wave_seeds  = (seed_base + np.arange(0,num_in_dlc)).tolist()
 
                 case_inputs_i[("HydroDyn","WaveSeed1")] = {'vals':wave_seeds, 'group':1}
diff --git a/ROSCO_toolbox/ofTools/fast_io/FAST_reader.py b/ROSCO_toolbox/ofTools/fast_io/FAST_reader.py
index e32e8a01..310a8ca2 100644
--- a/ROSCO_toolbox/ofTools/fast_io/FAST_reader.py
+++ b/ROSCO_toolbox/ofTools/fast_io/FAST_reader.py
@@ -522,6 +522,7 @@ def read_MainInput(self):
         self.fst_vt['Fst']['SubFile_path']      = os.path.split(self.fst_vt['Fst']['SubFile'])[0]
         self.fst_vt['Fst']['MooringFile_path']  = os.path.split(self.fst_vt['Fst']['MooringFile'])[0]
         self.fst_vt['Fst']['IceFile_path']      = os.path.split(self.fst_vt['Fst']['IceFile'])[0]
+
     def read_ElastoDyn(self):
         # ElastoDyn v1.03 Input File
         # Currently no differences between FASTv8.16 and OpenFAST.
@@ -781,7 +782,6 @@ def read_BeamDyn(self):
 
         self.read_BeamDynBlade()
 
-
     def read_BeamDynBlade(self):
         # BeamDyn Blade
 
@@ -836,6 +836,7 @@ def read_InflowWind(self):
         self.fst_vt['InflowWind']['Echo']           = bool_read(f.readline().split()[0])
         self.fst_vt['InflowWind']['WindType']       = int(f.readline().split()[0])
         self.fst_vt['InflowWind']['PropogationDir'] = float_read(f.readline().split()[0])
+        self.fst_vt['InflowWind']['VFlowAng']       = float_read(f.readline().split()[0])
         self.fst_vt['InflowWind']['NWindVel']       = int(f.readline().split()[0])
         self.fst_vt['InflowWind']['WindVxiList']    = float_read(f.readline().split()[0])
         self.fst_vt['InflowWind']['WindVyiList']    = float_read(f.readline().split()[0])
@@ -849,14 +850,13 @@ def read_InflowWind(self):
 
         # Parameters for Uniform wind file   [used only for WindType = 2] (uniform_wind_params)
         f.readline()
-        self.fst_vt['InflowWind']['Filename'] = os.path.join(os.path.split(inflow_file)[0], f.readline().split()[0][1:-1])
-        self.fst_vt['InflowWind']['RefHt'] = float_read(f.readline().split()[0])
+        self.fst_vt['InflowWind']['Filename_Uni'] = os.path.join(os.path.split(inflow_file)[0], f.readline().split()[0][1:-1])
+        self.fst_vt['InflowWind']['RefHt_Uni'] = float_read(f.readline().split()[0])
         self.fst_vt['InflowWind']['RefLength'] = float_read(f.readline().split()[0])
 
         # Parameters for Binary TurbSim Full-Field files   [used only for WindType = 3] (turbsim_wind_params)
         f.readline()
-        self.fst_vt['InflowWind']['Filename'] = os.path.join(os.path.split(inflow_file)[0], f.readline().split()[0][1:-1])
-
+        self.fst_vt['InflowWind']['FileName_BTS'] = os.path.join(os.path.split(inflow_file)[0], f.readline().split()[0][1:-1])
         # Parameters for Binary Bladed-style Full-Field files   [used only for WindType = 4] (bladed_wind_params)
         f.readline()
         self.fst_vt['InflowWind']['FilenameRoot'] = f.readline().split()[0][1:-1]       
@@ -873,7 +873,7 @@ def read_InflowWind(self):
         self.fst_vt['InflowWind']['dx']    = float_read(f.readline().split()[0])
         self.fst_vt['InflowWind']['dy']    = float_read(f.readline().split()[0])
         self.fst_vt['InflowWind']['dz']    = float_read(f.readline().split()[0])
-        self.fst_vt['InflowWind']['RefHt'] = float_read(f.readline().split()[0])
+        self.fst_vt['InflowWind']['RefHt_Hawc'] = float_read(f.readline().split()[0])
 
         # Scaling parameters for turbulence (still hawc_wind_params)
         f.readline()
@@ -889,8 +889,9 @@ def read_InflowWind(self):
         f.readline()
         self.fst_vt['InflowWind']['URef']        = float_read(f.readline().split()[0])
         self.fst_vt['InflowWind']['WindProfile'] = int(f.readline().split()[0])
-        self.fst_vt['InflowWind']['PLExp']       = float_read(f.readline().split()[0])
+        self.fst_vt['InflowWind']['PLExp_Hawc']  = float_read(f.readline().split()[0])
         self.fst_vt['InflowWind']['Z0']          = float_read(f.readline().split()[0])
+        self.fst_vt['InflowWind']['XOffset']     = float_read(f.readline().split()[0])
 
         # Inflow Wind Output Parameters (inflow_out_params)
         f.readline()
@@ -1002,7 +1003,6 @@ def read_AeroDyn14Tower(self):
             self.fst_vt['AeroDynTower']['TwrRe'][i]  = data[0]
             self.fst_vt['AeroDynTower']['TwrCD'][i,:]  = data[1:]
 
-
     def read_AeroDyn15(self):
         # AeroDyn v15.03
 
@@ -1052,7 +1052,7 @@ def read_AeroDyn15(self):
         # Dynamic Blade-Element/Momentum Theory Options 
         f.readline()
         self.fst_vt['AeroDyn15']['DBEMT_Mod']          = int(f.readline().split()[0])
-        self.fst_vt['AeroDyn15']['tau1_const']         = int(f.readline().split()[0])
+        self.fst_vt['AeroDyn15']['tau1_const']         = float_read(f.readline().split()[0])
 
         # Olaf -- cOnvecting LAgrangian Filaments (Free Vortex Wake) Theory Options
         f.readline()
@@ -1120,6 +1120,10 @@ def read_AeroDyn15(self):
         self.read_AeroDyn15Blade()
         self.read_AeroDyn15Polar()
         self.read_AeroDyn15Coord()
+        if self.fst_vt['AeroDyn15']['WakeMod'] == 3:
+            if self.fst_vt['AeroDyn15']['AFAeroMod'] == 2:
+                raise Exception('OLAF is called with unsteady airfoil aerodynamics, but OLAF currently only supports AFAeroMod == 1')
+            self.read_AeroDyn15OLAF()
 
     def read_AeroDyn15Blade(self):
         # AeroDyn v5.00 Blade Definition File
@@ -1264,6 +1268,56 @@ def read_AeroDyn15Coord(self):
 
                 f.close()
 
+    def read_AeroDyn15OLAF(self):
+        
+        self.fst_vt['AeroDyn15']['OLAF'] = {}
+        olaf_filename = os.path.join(self.FAST_directory, self.fst_vt['AeroDyn15']['OLAFInputFileName'])
+        f = open(olaf_filename)
+        f.readline()
+        f.readline()
+        f.readline()
+        self.fst_vt['AeroDyn15']['OLAF']['IntMethod']       = int_read(f.readline().split()[0])
+        self.fst_vt['AeroDyn15']['OLAF']['DTfvw']           = float_read(f.readline().split()[0])
+        self.fst_vt['AeroDyn15']['OLAF']['FreeWakeStart']   = float_read(f.readline().split()[0])
+        self.fst_vt['AeroDyn15']['OLAF']['FullCircStart']   = float_read(f.readline().split()[0])
+        f.readline()
+        self.fst_vt['AeroDyn15']['OLAF']['CircSolvingMethod']   = int_read(f.readline().split()[0])
+        self.fst_vt['AeroDyn15']['OLAF']['CircSolvConvCrit']    = float_read(f.readline().split()[0])
+        self.fst_vt['AeroDyn15']['OLAF']['CircSolvRelaxation']  = float_read(f.readline().split()[0])
+        self.fst_vt['AeroDyn15']['OLAF']['CircSolvMaxIter']     = int_read(f.readline().split()[0])
+        self.fst_vt['AeroDyn15']['OLAF']['PrescribedCircFile']  = f.readline().split()[0]
+        f.readline()
+        f.readline()
+        f.readline()
+        self.fst_vt['AeroDyn15']['OLAF']['nNWPanel']   = int(f.readline().split()[0])
+        self.fst_vt['AeroDyn15']['OLAF']['WakeLength'] = int(f.readline().split()[0])
+        self.fst_vt['AeroDyn15']['OLAF']['FreeWakeLength']  = int_read(f.readline().split()[0])
+        self.fst_vt['AeroDyn15']['OLAF']['FWShedVorticity'] = float_read(f.readline().split()[0])
+        f.readline()
+        self.fst_vt['AeroDyn15']['OLAF']['DiffusionMethod'] = int_read(f.readline().split()[0])
+        self.fst_vt['AeroDyn15']['OLAF']['RegDeterMethod']  = int_read(f.readline().split()[0])
+        self.fst_vt['AeroDyn15']['OLAF']['RegFunction']     = int_read(f.readline().split()[0])
+        self.fst_vt['AeroDyn15']['OLAF']['WakeRegMethod']   = int_read(f.readline().split()[0])
+        self.fst_vt['AeroDyn15']['OLAF']['WakeRegFactor']   = float(f.readline().split()[0])
+        self.fst_vt['AeroDyn15']['OLAF']['WingRegFactor']   = float(f.readline().split()[0])
+        self.fst_vt['AeroDyn15']['OLAF']['CoreSpreadEddyVisc'] = int(f.readline().split()[0])
+        f.readline()
+        self.fst_vt['AeroDyn15']['OLAF']['TwrShadowOnWake'] = bool_read(f.readline().split()[0])
+        self.fst_vt['AeroDyn15']['OLAF']['ShearModel']      = int_read(f.readline().split()[0])
+        f.readline()
+        self.fst_vt['AeroDyn15']['OLAF']['VelocityMethod']  = int_read(f.readline().split()[0])
+        self.fst_vt['AeroDyn15']['OLAF']['TreeBranchFactor']= float_read(f.readline().split()[0])
+        self.fst_vt['AeroDyn15']['OLAF']['PartPerSegment']  = int(f.readline().split()[0])
+        f.readline()
+        f.readline()
+        self.fst_vt['AeroDyn15']['OLAF']['WrVTk']       = int(f.readline().split()[0])
+        self.fst_vt['AeroDyn15']['OLAF']['nVTKBlades']  = int(f.readline().split()[0])
+        self.fst_vt['AeroDyn15']['OLAF']['VTKCoord']    = int_read(f.readline().split()[0])
+        self.fst_vt['AeroDyn15']['OLAF']['VTK_fps']     = float_read(f.readline().split()[0])
+        f.readline()
+        f.close()
+
+
     def read_ServoDyn(self):
         # ServoDyn v1.05 Input File
         # Currently no differences between FASTv8.16 and OpenFAST.
@@ -1287,12 +1341,12 @@ def read_ServoDyn(self):
         self.fst_vt['ServoDyn']['TPitManS1']    = float_read(f.readline().split()[0])
         self.fst_vt['ServoDyn']['TPitManS2']    = float_read(f.readline().split()[0])
         self.fst_vt['ServoDyn']['TPitManS3']    = float_read(f.readline().split()[0])
-        self.fst_vt['ServoDyn']['PitManRat1']   = float_read(f.readline().split()[0])
-        self.fst_vt['ServoDyn']['PitManRat2']   = float_read(f.readline().split()[0])
-        self.fst_vt['ServoDyn']['PitManRat3']   = float_read(f.readline().split()[0])
-        self.fst_vt['ServoDyn']['BlPitchF1']    = float_read(f.readline().split()[0])
-        self.fst_vt['ServoDyn']['BlPitchF2']    = float_read(f.readline().split()[0])
-        self.fst_vt['ServoDyn']['BlPitchF3']    = float_read(f.readline().split()[0])
+        self.fst_vt['ServoDyn']['PitManRat(1)'] = float_read(f.readline().split()[0])
+        self.fst_vt['ServoDyn']['PitManRat(2)'] = float_read(f.readline().split()[0])
+        self.fst_vt['ServoDyn']['PitManRat(3)'] = float_read(f.readline().split()[0])
+        self.fst_vt['ServoDyn']['BlPitchF(1)']  = float_read(f.readline().split()[0])
+        self.fst_vt['ServoDyn']['BlPitchF(2)']  = float_read(f.readline().split()[0])
+        self.fst_vt['ServoDyn']['BlPitchF(3)']  = float_read(f.readline().split()[0])
 
         # Geneartor and Torque Control (gen_torq_ctrl)
         f.readline()
@@ -1447,7 +1501,7 @@ def read_DISCON_in(self):
                 self.fst_vt['DISCON_in']['Ct_table'] = Ct_table
                 self.fst_vt['DISCON_in']['Cq_table'] = Cq_table
             except:
-                pass
+                print('WARNING: Cp table not loaded!')
             
             # Add some DISCON entries that might be needed within WISDEM        
             self.fst_vt['DISCON_in']['v_rated'] = 1.
@@ -1455,7 +1509,6 @@ def read_DISCON_in(self):
         else:
             del self.fst_vt['DISCON_in']
 
-
     def read_HydroDyn(self):
         # AeroDyn v2.03
 
@@ -2150,7 +2203,8 @@ def read_MoorDyn(self):
         self.fst_vt['MoorDyn']['NumSegs']       = []
         self.fst_vt['MoorDyn']['NodeAnch']      = []
         self.fst_vt['MoorDyn']['NodeFair']      = []
-        self.fst_vt['MoorDyn']['Flags_Outputs'] = []
+        self.fst_vt['MoorDyn']['Outputs']       = []
+        self.fst_vt['MoorDyn']['CtrlChan']      = []
         for i in range(self.fst_vt['MoorDyn']['NLines']):
             data_line = f.readline().strip().split()
             self.fst_vt['MoorDyn']['Line'].append(int(data_line[0]))
@@ -2159,7 +2213,11 @@ def read_MoorDyn(self):
             self.fst_vt['MoorDyn']['NumSegs'].append(int(data_line[3]))
             self.fst_vt['MoorDyn']['NodeAnch'].append(int(data_line[4]))
             self.fst_vt['MoorDyn']['NodeFair'].append(int(data_line[5]))
-            self.fst_vt['MoorDyn']['Flags_Outputs'].append(str(data_line[6]))
+            self.fst_vt['MoorDyn']['Outputs'].append(str(data_line[6]))
+            if len(data_line) > 7:
+                self.fst_vt['MoorDyn']['CtrlChan'].append(int(data_line[7]))
+            else:
+                self.fst_vt['MoorDyn']['CtrlChan'].append(0)
         f.readline()
         self.fst_vt['MoorDyn']['dtM']       = float_read(f.readline().split()[0])
         self.fst_vt['MoorDyn']['kbot']      = float_read(f.readline().split()[0])
diff --git a/ROSCO_toolbox/ofTools/fast_io/FAST_vars.py b/ROSCO_toolbox/ofTools/fast_io/FAST_vars.py
index 2d9c9d5d..a1b605df 100644
--- a/ROSCO_toolbox/ofTools/fast_io/FAST_vars.py
+++ b/ROSCO_toolbox/ofTools/fast_io/FAST_vars.py
@@ -288,12 +288,12 @@
 InflowWind['PLexp']     = 0.0           
 
 # Parameters for Uniform wind file [used only for WindType = 2]
-InflowWind['Filename'] = ''            
+InflowWind['UniformFilename'] = ''            
 InflowWind['RefHt']    = 0.0           
 InflowWind['RefLength'] = 0.0           
 
 # Parameters for Binary TurbSim Full-Field files [used only for WindType = 3]
-InflowWind['Filename'] = ''            
+InflowWind['TurbSimFilename'] = ''            
 
 # Parameters for Binary Bladed-style Full-Field files [used only for WindType = 4]
 InflowWind['FilenameRoot'] = ''            
@@ -321,6 +321,7 @@
 InflowWind['WindProfile'] = 0             
 InflowWind['PLExp']       = 0.0           
 InflowWind['Z0']          = 0.0           
+InflowWind['InitPosition(x)'] = 0.0           
 
 # Inflow Wind Output Parameters (actual OutList included in master OutList)
 InflowWind['SumPrint']   = False         
@@ -510,12 +511,12 @@
 ServoDyn['TPitManE1']        = 0.0           #FAST7 only
 ServoDyn['TPitManE2']        = 0.0           #FAST7 only
 ServoDyn['TPitManE3']        = 0.0           #FAST7 only
-ServoDyn['PitManRat1']       = 0.0           
-ServoDyn['PitManRat2']       = 0.0           
-ServoDyn['PitManRat3']       = 0.0           
-ServoDyn['BlPitchF1']        = 0.0           
-ServoDyn['BlPitchF2']        = 0.0           
-ServoDyn['BlPitchF3']        = 0.0           
+ServoDyn['PitManRat(1)']     = 0.0           
+ServoDyn['PitManRat(2)']     = 0.0           
+ServoDyn['PitManRat(3)']     = 0.0           
+ServoDyn['BlPitchF(1)']      = 0.0           
+ServoDyn['BlPitchF(2)']      = 0.0           
+ServoDyn['BlPitchF(3)']      = 0.0           
 ServoDyn['BlPitch1']         = 0.0           #FAST7 only
 ServoDyn['BlPitch2']         = 0.0           #FAST7 only
 ServoDyn['BlPitch3']         = 0.0           #FAST7 only
diff --git a/ROSCO_toolbox/ofTools/fast_io/FAST_writer.py b/ROSCO_toolbox/ofTools/fast_io/FAST_writer.py
index 5c048516..bbbe6b0f 100644
--- a/ROSCO_toolbox/ofTools/fast_io/FAST_writer.py
+++ b/ROSCO_toolbox/ofTools/fast_io/FAST_writer.py
@@ -549,8 +549,11 @@ def write_ElastoDyn(self):
         f.write('{:<22} {:<11} {:}'.format('"'+self.fst_vt['ElastoDyn']['OutFmt']+'"', 'OutFmt', '- Format used for text tabular output (except time).  Resulting field should be 10 characters. (quoted string) (currently unused)\n'))
         f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDyn']['TStart'], 'TStart', '- Time to begin tabular output (s) (currently unused)\n'))
         f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDyn']['DecFact'], 'DecFact', '- Decimation factor for tabular output {1: output every time step} (-) (currently unused)\n'))
-        f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDyn']['NTwGages'], 'NTwGages', '- Number of tower nodes that have strain gages for output [0 to 9] (-)\n'))
-        f.write('{:<22} {:<11} {:}'.format(', '.join(self.fst_vt['ElastoDyn']['TwrGagNd']), 'TwrGagNd', '- List of tower nodes that have strain gages [1 to TwrNodes] (-) [unused if NTwGages=0]\n'))
+        f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDyn']['NTwGages'], 'NTwGages', '- Number of tower nodes that have strain gages for output [0 to 9] (-)\n'))  
+        if self.fst_vt['ElastoDyn']['TwrGagNd'] != 0:
+            f.write('{:<22} {:<11} {:}'.format(', '.join(self.fst_vt['ElastoDyn']['TwrGagNd']), 'TwrGagNd', '- List of tower nodes that have strain gages [1 to TwrNodes] (-) [unused if NTwGages=0]\n'))
+        else:
+            f.write('{:<22} {:<11} {:}'.format(0, 'TwrGagNd', '- List of tower nodes that have strain gages [1 to TwrNodes] (-) [unused if NTwGages=0]\n'))
         f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDyn']['NBlGages'], 'NBlGages', '- Number of blade nodes that have strain gages for output [0 to 9] (-)\n'))
         if self.fst_vt['ElastoDyn']['BldGagNd'] != 0:
             f.write('{:<22} {:<11} {:}'.format(', '.join(['%d'%i for i in self.fst_vt['ElastoDyn']['BldGagNd']]), 'BldGagNd', '- List of blade nodes that have strain gages [1 to BldNodes] (-) [unused if NBlGages=0]\n'))
@@ -685,24 +688,25 @@ def write_InflowWind(self):
         f.write('Generated with AeroElasticSE FAST driver\n')
         f.write('---------------------------------------------------------------------------------------------------------------\n')
         f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['Echo'], 'Echo', '- Echo input data to <RootName>.ech (flag)\n'))
-        f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['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)\n'))
+        f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['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; 7=native Bladed FF)\n'))
         f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['PropagationDir'], 'PropagationDir', '- Direction of wind propagation (meteoroligical rotation from aligned with X (positive rotates towards -Y) -- degrees)\n'))
+        f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['VFlowAng'], 'VFlowAng', '- Upflow angle (degrees) (not used for native Bladed format WindType=7)\n'))
         f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['NWindVel'], 'NWindVel', '- Number of points to output the wind velocity    (0 to 9)\n'))
         f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['WindVxiList'], 'WindVxiList', '- List of coordinates in the inertial X direction (m)\n'))
         f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['WindVyiList'], 'WindVyiList', '- List of coordinates in the inertial Y direction (m)\n'))
         f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['WindVziList'], 'WindVziList', '- List of coordinates in the inertial Z direction (m)\n'))
         f.write('================== Parameters for Steady Wind Conditions [used only for WindType = 1] =========================\n')
         f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['HWindSpeed'], 'HWindSpeed', '- Horizontal windspeed                            (m/s)\n'))
-        f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['RefHt'], 'RefHtT1', '- Reference height for horizontal wind speed      (m)\n'))
+        f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['RefHt'], 'RefHt', '- Reference height for horizontal wind speed      (m)\n'))
         f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['PLexp'], 'PLexp', '- Power law exponent                              (-)\n'))
         f.write('================== Parameters for Uniform wind file   [used only for WindType = 2] ============================\n')
-        f.write('{:<22} {:<11} {:}'.format('"'+self.fst_vt['InflowWind']['Filename']+'"', 'FilenameT2', '- Filename of time series data for uniform wind field.      (-)\n'))
-        f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['RefHt'], 'RefHtT2', '- Reference height for horizontal wind speed                (m)\n'))
+        f.write('{:<22} {:<11} {:}'.format('"'+self.fst_vt['InflowWind']['Filename_Uni']+'"', 'Filename_Uni', '- Filename of time series data for uniform wind field.      (-)\n'))
+        f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['RefHt_Uni'], 'RefHt_Uni', '- Reference height for horizontal wind speed                (m)\n'))
         f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['RefLength'], 'RefLength', '- Reference length for linear horizontal and vertical sheer (-)\n'))
         f.write('================== Parameters for Binary TurbSim Full-Field files   [used only for WindType = 3] ==============\n')
-        f.write('{:<22} {:<11} {:}'.format('"'+self.fst_vt['InflowWind']['Filename']+'"', 'FilenameT3', '- Name of the Full field wind file to use (.bts)\n'))
+        f.write('{:<22} {:<11} {:}'.format('"'+self.fst_vt['InflowWind']['FileName_BTS']+'"', 'FileName_BTS', '- Name of the Full field wind file to use (.bts)\n'))
         f.write('================== Parameters for Binary Bladed-style Full-Field files   [used only for WindType = 4] =========\n')
-        f.write('{:<22} {:<11} {:}'.format('"'+self.fst_vt['InflowWind']['FilenameRoot']+'"', 'FilenameT4', '- Rootname of the full-field wind file to use (.wnd, .sum)\n'))
+        f.write('{:<22} {:<11} {:}'.format('"'+self.fst_vt['InflowWind']['FilenameRoot']+'"', 'FilenameRoot', '- Rootname of the full-field wind file to use (.wnd, .sum)\n'))
         f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['TowerFile'], 'TowerFile', '- Have tower file (.twr) (flag)\n'))
         f.write('================== Parameters for HAWC-format binary files  [Only used with WindType = 5] =====================\n')
         f.write('{:<22} {:<11} {:}'.format('"'+self.fst_vt['InflowWind']['FileName_u']+'"', 'FileName_u', '- name of the file containing the u-component fluctuating wind (.bin)\n'))
@@ -714,7 +718,7 @@ def write_InflowWind(self):
         f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['dx'], 'dx', '- distance (in meters) between points in the x direction    (m)\n'))
         f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['dy'], 'dy', '- distance (in meters) between points in the y direction    (m)\n'))
         f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['dz'], 'dz', '- distance (in meters) between points in the z direction    (m)\n'))
-        f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['RefHt'], 'RefHtT5', '- reference height; the height (in meters) of the vertical center of the grid (m)\n'))
+        f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['RefHt_Hawc'], 'RefHt_Hawc', '- reference height; the height (in meters) of the vertical center of the grid (m)\n'))
         f.write('-------------   Scaling parameters for turbulence   ---------------------------------------------------------\n')
         f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['ScaleMethod'], 'ScaleMethod', '- Turbulence scaling method   [0 = none, 1 = direct scaling, 2 = calculate scaling factor based on a desired standard deviation]\n'))
         f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['SFx'], 'SFx', '- Turbulence scaling factor for the x direction (-)   [ScaleMethod=1]\n'))
@@ -726,8 +730,9 @@ def write_InflowWind(self):
         f.write('-------------   Mean wind profile parameters (added to HAWC-format files)   ---------------------------------\n')
         f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['URef'], 'URef', '- Mean u-component wind speed at the reference height (m/s)\n'))
         f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['WindProfile'], 'WindProfile', '- Wind profile type (0=constant;1=logarithmic,2=power law)\n'))
-        f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['PLExp'], 'PLExp', '- Power law exponent (-) (used for PL wind profile type only)\n'))
+        f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['PLExp_Hawc'], 'PLExp_Hawc', '- Power law exponent (-) (used for PL wind profile type only)\n'))
         f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['Z0'], 'Z0', '- Surface roughness length (m) (used for LG wind profile type only)\n'))
+        f.write('{:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['XOffset'], 'XOffset', '- Initial offset in +x direction (shift of wind box) (-)\n'))
         f.write('====================== OUTPUT ==================================================\n')
         f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['InflowWind']['SumPrint'], 'SumPrint', '- Print summary data to <RootName>.IfW.sum (flag)\n'))
         f.write('OutList      - The next line(s) contains a list of output parameters.  See OutListParameters.xlsx for a listing of available output channels, (-)\n')
@@ -864,6 +869,9 @@ def write_AeroDyn15(self):
         if self.fst_vt['AeroDyn15']['af_data'][1][0]['NumCoords'] != 0:
             self.write_AeroDyn15Coord()
         
+        if self.fst_vt['AeroDyn15']['WakeMod'] == 3:
+            self.write_OLAF()
+
         # Generate AeroDyn v15.03 input file
         self.fst_vt['Fst']['AeroFile'] = self.FAST_namingOut + '_AeroDyn15.dat'
         ad_file = os.path.join(self.FAST_runDirectory, self.fst_vt['Fst']['AeroFile'])
@@ -894,23 +902,24 @@ def write_AeroDyn15(self):
             f.write('{: 2.15e} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['Pvap'], 'Pvap', '- Vapour pressure of fluid (Pa) [used only when CavitCheck=True]\n'))
             f.write('{: 2.15e} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['FluidDepth'], 'FluidDepth', '- Water depth above mid-hub height (m) [used only when CavitCheck=True]\n'))
         f.write('======  Blade-Element/Momentum Theory Options  ====================================================== [used only when WakeMod=1]\n')
-        f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['SkewMod'], 'SkewMod', '- Type of skewed-wake correction model (switch) {1=uncoupled, 2=Pitt/Peters, 3=coupled} [used only when WakeMod=1]\n'))
-        f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['SkewModFactor'], 'SkewModFactor', '- Constant used in Pitt/Peters skewed wake model {or "default" is 15/32*pi} (-) [used only when SkewMod=2; unused when WakeMod=0]\n'))
-        f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['TipLoss'], 'TipLoss', '- Use the Prandtl tip-loss model? (flag) [used only when WakeMod=1]\n'))
-        f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['HubLoss'], 'HubLoss', '- Use the Prandtl hub-loss model? (flag) [used only when WakeMod=1]\n'))
-        f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['TanInd'], 'TanInd', '- Include tangential induction in BEMT calculations? (flag) [used only when WakeMod=1]\n'))
-        f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['AIDrag'], 'AIDrag', '- Include the drag term in the axial-induction calculation? (flag) [used only when WakeMod=1]\n'))
-        f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['TIDrag'], 'TIDrag', '- Include the drag term in the tangential-induction calculation? (flag) [used only when WakeMod=1 and TanInd=TRUE]\n'))
-        f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['IndToler'], 'IndToler', '- Convergence tolerance for BEMT nonlinear solve residual equation {or "default"} (-) [used only when WakeMod=1]\n'))
-        f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['MaxIter'], 'MaxIter', '- Maximum number of iteration steps (-) [used only when WakeMod=1]\n'))
+        f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['SkewMod'], 'SkewMod', '- Type of skewed-wake correction model (switch) {1=uncoupled, 2=Pitt/Peters, 3=coupled} [unused when WakeMod=0 or 3]\n'))
+        f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['SkewModFactor'], 'SkewModFactor', '- Constant used in Pitt/Peters skewed wake model {or "default" is 15/32*pi} (-) [used only when SkewMod=2; unused when WakeMod=0 or 3]\n'))
+        f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['TipLoss'], 'TipLoss', '- Use the Prandtl tip-loss model? (flag) [unused when WakeMod=0 or 3]\n'))
+        f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['HubLoss'], 'HubLoss', '- Use the Prandtl hub-loss model? (flag) [unused when WakeMod=0 or 3]\n'))
+        f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['TanInd'], 'TanInd', '- Include tangential induction in BEMT calculations? (flag) [unused when WakeMod=0 or 3]\n'))
+        f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['AIDrag'], 'AIDrag', '- Include the drag term in the axial-induction calculation? (flag) [unused when WakeMod=0 or 3]\n'))
+        f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['TIDrag'], 'TIDrag', '- Include the drag term in the tangential-induction calculation? (flag) [unused when WakeMod=0,3 or TanInd=FALSE]\n'))
+        f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['IndToler'], 'IndToler', '- Convergence tolerance for BEMT nonlinear solve residual equation {or "default"} (-) [unused when WakeMod=0 or 3]\n'))
+        f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['MaxIter'], 'MaxIter', '- Maximum number of iteration steps (-) [unused when WakeMod=0]\n'))
         f.write('======  Dynamic Blade-Element/Momentum Theory Options  ====================================================== [used only when WakeMod=1]\n')
         f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['DBEMT_Mod'], 'DBEMT_Mod', '- Type of dynamic BEMT (DBEMT) model {1=constant tau1, 2=time-dependent tau1} (-) [used only when WakeMod=2]\n'))
-        f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['tau1_const'], 'tau1_const', '- Time constant for DBEMT (s) [used only when WakeMod=2 and DBEMT_Mod=1]\n'))
+        f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['tau1_const'], 'tau1_const', '- Time constant for DBEMT (s) [used only when WakeMod=2 and DBEMT_Mod=1]\n'))
         f.write('======  OLAF -- cOnvecting LAgrangian Filaments (Free Vortex Wake) Theory Options  ================== [used only when WakeMod=3]\n')
-        f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAFInputFileName'], 'OLAFInputFileName', '- Input file for OLAF [used only when WakeMod=3]\n'))  
+        olaf_file = self.FAST_namingOut + '_OLAF.dat'
+        f.write('{!s:<22} {:<11} {:}'.format(olaf_file, 'OLAFInputFileName', '- Input file for OLAF [used only when WakeMod=3]\n'))  
         f.write('======  Beddoes-Leishman Unsteady Airfoil Aerodynamics Options  ===================================== [used only when AFAeroMod=2]\n')
-        f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['UAMod'], 'UAMod', "Unsteady Aero Model Switch (switch) {1=Baseline model (Original), 2=Gonzalez's variant (changes in Cn,Cc,Cm), 3=Minemma/Pierce variant (changes in Cc and Cm)} [used only when AFAeroMod=2]\n"))
-        f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['FLookup'], 'FLookup', "Flag to indicate whether a lookup for f' will be calculated (TRUE) or whether best-fit exponential equations will be used (FALSE); if FALSE S1-S4 must be provided in airfoil input files (flag) [used only when AFAeroMod=2]\n"))
+        f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['UAMod'], 'UAMod', "- Unsteady Aero Model Switch (switch) {1=Baseline model (Original), 2=Gonzalez's variant (changes in Cn,Cc,Cm), 3=Minnema/Pierce variant (changes in Cc and Cm)} [used only when AFAeroMod=2]\n"))
+        f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['FLookup'], 'FLookup', "- Flag to indicate whether a lookup for f' will be calculated (TRUE) or whether best-fit exponential equations will be used (FALSE); if FALSE S1-S4 must be provided in airfoil input files (flag) [used only when AFAeroMod=2]\n"))
         f.write('======  Airfoil Information =========================================================================\n')
         f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['AFTabMod'], 'AFTabMod', '- Interpolation method for multiple airfoil tables {1=1D interpolation on AoA (first table only); 2=2D interpolation on AoA and Re; 3=2D interpolation on AoA and UserProp} (-)\n'))
         f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['InCol_Alfa'], 'InCol_Alfa', '- The column in the airfoil tables that contains the angle of attack (-)\n'))
@@ -1140,7 +1149,56 @@ def write_AeroDyn15Coord(self):
             for row in coord:
                 f.write(' '.join(['{: 2.14e}'.format(val) for val in row])+'\n')
             f.close()
-    
+
+    def write_OLAF(self):
+
+        olaf_file = os.path.join(self.FAST_runDirectory, self.FAST_namingOut + '_OLAF.dat')
+        f = open(olaf_file, 'w')
+        
+        f.write('--------------------------- OLAF (cOnvecting LAgrangian Filaments) INPUT FILE -----------------\n')
+        f.write('Free wake input file for the Helix test case\n')
+        f.write('--------------------------- GENERAL OPTIONS ---------------------------------------------------\n')
+        f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['IntMethod'], 'Integration method', '{5: Forward Euler 1st order, default: 5} (switch)\n'))
+        f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['DTfvw'], 'DTfvw method', 'Time interval for wake propagation. {default: dtaero} (s)\n'))
+        f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['FreeWakeStart'], 'FreeWakeStart method', 'Time when wake is free. (-) value = always free. {default: 0.0} (s)\n'))
+        f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['FullCircStart'], 'FullCircStart', 'Time at which full circulation is reached. {default: 0.0} (s)\n'))
+        f.write('--------------------------- CIRCULATION SPECIFICATIONS ----------------------------------------\n')
+        f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['CircSolvingMethod'], 'CircSolvingMethod', 'Circulation solving method {1: Cl-Based, 2: No-Flow Through, 3: Prescribed, default: 1 }(switch)\n'))
+        f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['CircSolvConvCrit'], 'CircSolvConvCrit', 'Convergence criteria {default: 0.001} [only if CircSolvingMethod=1] (-)\n'))
+        f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['CircSolvRelaxation'], 'CircSolvRelaxation', 'Relaxation factor {default: 0.1} [only if CircSolvingMethod=1] (-)\n'))
+        f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['CircSolvMaxIter'], 'CircSolvMaxIter', 'Maximum number of iterations for circulation solving {default: 30} (-)\n'))
+        f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['PrescribedCircFile'], 'PrescribedCircFile','File containing prescribed circulation [only if CircSolvingMethod=3] (quoted string)\n'))
+        f.write('===============================================================================================\n')
+        f.write('--------------------------- WAKE OPTIONS ------------------------------------------------------\n')
+        f.write('------------------- WAKE EXTENT AND DISCRETIZATION --------------------------------------------\n')
+        f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['nNWPanel'], 'nNWPanel','Number of near-wake panels [integer] (-)\n'))
+        f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['WakeLength'], 'WakeLength','Total wake distance [integer] (number of time steps)\n'))
+        f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['FreeWakeLength'], 'FreeWakeLength','Wake length that is free [integer] (number of time steps) {default: WakeLength}\n'))
+        f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['FWShedVorticity'], 'FWShedVorticity','Include shed vorticity in the far wake {default: false}\n'))
+        f.write('------------------- WAKE REGULARIZATIONS AND DIFFUSION -----------------------------------------\n')
+        f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['DiffusionMethod'], 'DiffusionMethod','Diffusion method to account for viscous effects {0: None, 1: Core Spreading, "default": 0}\n'))
+        f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['RegDeterMethod'], 'RegDeterMethod','Method to determine the regularization parameters {0:  Manual, 1: Optimized, default: 0 }\n'))
+        f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['RegFunction'], 'RegFunction','Viscous diffusion function {0: None, 1: Rankine, 2: LambOseen, 3: Vatistas, 4: Denominator, "default": 3} (switch)\n'))
+        f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['WakeRegMethod'], 'WakeRegMethod','Wake regularization method {1: Constant, 2: Stretching, 3: Age, default: 1} (switch)\n'))
+        f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['WakeRegFactor'], 'WakeRegFactor','Wake regularization factor (m)\n'))
+        f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['WingRegFactor'], 'WingRegFactor','Wing regularization factor (m)\n'))
+        f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['CoreSpreadEddyVisc'], 'CoreSpreadEddyVisc','Eddy viscosity in core spreading methods, typical values 1-1000\n'))
+        f.write('------------------- WAKE TREATMENT OPTIONS ---------------------------------------------------\n')
+        f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['TwrShadowOnWake'], 'TwrShadowOnWake','Include tower flow disturbance effects on wake convection {default:false} [only if TwrPotent or TwrShadow]\n'))
+        f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['ShearModel'], 'ShearModel','Shear Model {0: No treatment, 1: Mirrored vorticity, default: 0}\n'))
+        f.write('------------------- SPEEDUP OPTIONS -----------------------------------------------------------\n')
+        f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['VelocityMethod'], 'VelocityMethod','Method to determine the velocity {1:Biot-Savart Segment, 2:Particle tree, default: 1}\n'))
+        f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['TreeBranchFactor'], 'TreeBranchFactor','Branch radius fraction above which a multipole calculation is used {default: 2.0} [only if VelocityMethod=2]\n'))
+        f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['PartPerSegment'], 'PartPerSegment','Number of particles per segment [only if VelocityMethod=2]\n'))
+        f.write('===============================================================================================\n')
+        f.write('--------------------------- OUTPUT OPTIONS  ---------------------------------------------------\n')
+        f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['WrVTk'], 'WrVTk','Outputs Visualization Toolkit (VTK) (independent of .fst option) {0: NoVTK, 1: Write VTK at each time step} (flag)\n'))
+        f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['nVTKBlades'], 'nVTKBlades','Number of blades for which VTK files are exported {0: No VTK per blade, n: VTK for blade 1 to n} (-)\n'))
+        f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['VTKCoord'], 'VTKCoord','Coordinate system used for VTK export. {1: Global, 2: Hub, "default": 1}\n'))
+        f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn15']['OLAF']['VTK_fps'], 'VTK_fps','Frame rate for VTK output (frames per second) {"all" for all glue code timesteps, "default" for all OLAF timesteps} [used only if WrVTK=1]\n'))
+        f.write('------------------------------------------------------------------------------------------------\n')
+
+        f.close()
     
     def write_ServoDyn(self):
         # ServoDyn v1.05 Input File
@@ -1160,12 +1218,12 @@ def write_ServoDyn(self):
         f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ServoDyn']['TPitManS1'], 'TPitManS(1)', '- Time to start override pitch maneuver for blade 1 and end standard pitch control (s)\n'))
         f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ServoDyn']['TPitManS2'], 'TPitManS(2)', '- Time to start override pitch maneuver for blade 2 and end standard pitch control (s)\n'))
         f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ServoDyn']['TPitManS3'], 'TPitManS(3)', '- Time to start override pitch maneuver for blade 3 and end standard pitch control (s) [unused for 2 blades]\n'))
-        f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ServoDyn']['PitManRat1'], 'PitManRat(1)', '- Pitch rate at which override pitch maneuver heads toward final pitch angle for blade 1 (deg/s)\n'))
-        f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ServoDyn']['PitManRat2'], 'PitManRat(2)', '- Pitch rate at which override pitch maneuver heads toward final pitch angle for blade 2 (deg/s)\n'))
-        f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ServoDyn']['PitManRat3'], 'PitManRat(3)', '- Pitch rate at which override pitch maneuver heads toward final pitch angle for blade 3 (deg/s) [unused for 2 blades]\n'))
-        f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ServoDyn']['BlPitchF1'], 'BlPitchF(1)', '- Blade 1 final pitch for pitch maneuvers (degrees)\n'))
-        f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ServoDyn']['BlPitchF2'], 'BlPitchF(2)', '- Blade 2 final pitch for pitch maneuvers (degrees)\n'))
-        f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ServoDyn']['BlPitchF3'], 'BlPitchF(3)', '- Blade 3 final pitch for pitch maneuvers (degrees) [unused for 2 blades]\n'))
+        f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ServoDyn']['PitManRat(1)'], 'PitManRat(1)', '- Pitch rate at which override pitch maneuver heads toward final pitch angle for blade 1 (deg/s)\n'))
+        f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ServoDyn']['PitManRat(2)'], 'PitManRat(2)', '- Pitch rate at which override pitch maneuver heads toward final pitch angle for blade 2 (deg/s)\n'))
+        f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ServoDyn']['PitManRat(3)'], 'PitManRat(3)', '- Pitch rate at which override pitch maneuver heads toward final pitch angle for blade 3 (deg/s) [unused for 2 blades]\n'))
+        f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ServoDyn']['BlPitchF(1)'], 'BlPitchF(1)', '- Blade 1 final pitch for pitch maneuvers (degrees)\n'))
+        f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ServoDyn']['BlPitchF(2)'], 'BlPitchF(2)', '- Blade 2 final pitch for pitch maneuvers (degrees)\n'))
+        f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ServoDyn']['BlPitchF(3)'], 'BlPitchF(3)', '- Blade 3 final pitch for pitch maneuvers (degrees) [unused for 2 blades]\n'))
         f.write('---------------------- GENERATOR AND TORQUE CONTROL ----------------------------\n')
         f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ServoDyn']['VSContrl'], 'VSContrl', '- Variable-speed control mode {0: none, 1: simple VS, 3: user-defined from routine UserVSCont, 4: user-defined from Simulink/Labview, 5: user-defined from Bladed-style DLL} (switch)\n'))
         f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ServoDyn']['GenModel'], 'GenModel', '- Generator model {1: simple, 2: Thevenin, 3: user-defined from routine UserGen} (switch) [used only when VSContrl=0]\n'))
@@ -1285,7 +1343,10 @@ def write_DISCON_in(self):
         controller.pitch_op_pc          = self.fst_vt['DISCON_in']['PC_GS_angles']
         controller.pc_gain_schedule.Kp  = self.fst_vt['DISCON_in']['PC_GS_KP']
         controller.pc_gain_schedule.Ki  = self.fst_vt['DISCON_in']['PC_GS_KI']
-        controller.Ki_ipc1p             = self.fst_vt['DISCON_in']['IPC_KI']
+        if 'IPC_KI' in self.fst_vt['DISCON_in'].keys():
+            controller.Ki_ipc1p         = self.fst_vt['DISCON_in']['IPC_KI'][0]
+        else:
+            controller.Ki_ipc1p         = 0.
         controller.max_pitch            = self.fst_vt['DISCON_in']['PC_MaxPit']
         controller.min_pitch            = self.fst_vt['DISCON_in']['PC_MinPit']
         controller.vs_minspd            = self.fst_vt['DISCON_in']['VS_MinOMSpd']
@@ -1307,7 +1368,6 @@ def write_DISCON_in(self):
         controller.Ki_flap              = self.fst_vt['DISCON_in']['Flp_Ki']
         controller.flp_angle            = self.fst_vt['DISCON_in']['Flp_Angle']
         controller.flp_maxpit           = self.fst_vt['DISCON_in']['Flp_MaxPit']
-        controller.Ki_ipc1p             = self.fst_vt['DISCON_in']['IPC_KI'][0]
 
         turbine = type('', (), {})()
         turbine.Cp = type('', (), {})()
@@ -1641,7 +1701,13 @@ def write_SubDyn(self):
         f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['SubDyn']['NDiv'], 'NDiv', '- Number of sub-elements per member\n'))
         f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['SubDyn']['CBMod'], 'CBMod', '- [T/F] If True perform C-B reduction, else full FEM dofs will be retained. If True, select Nmodes to retain in C-B reduced system.\n'))
         f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['SubDyn']['Nmodes'], 'Nmodes', '- Number of internal modes to retain (ignored if CBMod=False). If Nmodes=0 --> Guyan Reduction.\n'))
-        f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['SubDyn']['JDampings'], 'JDampings', '- Damping Ratios for each retained mode (% of critical) If Nmodes>0, list Nmodes structural damping ratios for each retained mode (% of critical), or a single damping ratio to be applied to all retained modes. (last entered value will be used for all remaining modes).\n'))
+        
+        JDampings = self.fst_vt['SubDyn']['JDampings']
+        if isinstance(JDampings, int):
+            f.write('{:<22} {:<11} {:}'.format(self.fst_vt['SubDyn']['JDampings'], 'JDampings', '- Damping Ratios for each retained mode (% of critical) If Nmodes>0, list Nmodes structural damping ratios for each retained mode (% of critical), or a single damping ratio to be applied to all retained modes. (last entered value will be used for all remaining modes).\n'))
+        else:
+            f.write('{:<22} {:<11} {:}'.format(", ".join(self.fst_vt['SubDyn']['JDampings']), 'JDampings', '- Damping Ratios for each retained mode (% of critical) If Nmodes>0, list Nmodes structural damping ratios for each retained mode (% of critical), or a single damping ratio to be applied to all retained modes. (last entered value will be used for all remaining modes).\n'))
+            
         f.write('---- STRUCTURE JOINTS: joints connect structure members (~Hydrodyn Input File)---\n')
         f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['SubDyn']['NJoints'], 'NJoints', '- Number of joints (-)\n'))
         f.write(" ".join(['{:^11s}'.format(i) for i in ['JointID', 'JointXss', 'JointYss', 'JointZss']])+' [Coordinates of Member joints in SS-Coordinate System]\n')
@@ -1883,8 +1949,8 @@ def write_MoorDyn(self):
             f.write(" ".join(ln) + '\n')
         f.write('---------------------- LINE PROPERTIES --------------------------------------\n')
         f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['MoorDyn']['NLines'], 'NLines', '- number of line objects\n'))
-        f.write(" ".join(['{:^11s}'.format(i) for i in ['Line', 'LineType', 'UnstrLen', 'NumSegs', 'NodeAnch', 'NodeFair', 'Flags/Outputs']])+'\n')
-        f.write(" ".join(['{:^11s}'.format(i) for i in ['(-)', '(-)', '(m)', '(-)', '(-)', '(-)', '(-)']])+'\n')
+        f.write(" ".join(['{:^11s}'.format(i) for i in ['Line', 'LineType', 'UnstrLen', 'NumSegs', 'NodeAnch', 'NodeFair', 'Outputs', 'CtrlChan']])+'\n')
+        f.write(" ".join(['{:^11s}'.format(i) for i in ['(-)', '(-)', '(m)', '(-)', '(-)', '(-)', '(-)', '(-)']])+'\n')
         for i in range(self.fst_vt['MoorDyn']['NLines']):
             ln = []
             ln.append('{:^11d}'.format(self.fst_vt['MoorDyn']['Line'][i]))
@@ -1893,7 +1959,8 @@ def write_MoorDyn(self):
             ln.append('{:^11d}'.format(self.fst_vt['MoorDyn']['NumSegs'][i]))
             ln.append('{:^11d}'.format(self.fst_vt['MoorDyn']['NodeAnch'][i]))
             ln.append('{:^11d}'.format(self.fst_vt['MoorDyn']['NodeFair'][i]))
-            ln.append('{:^11}'.format(self.fst_vt['MoorDyn']['Flags_Outputs'][i]))
+            ln.append('{:^11}'.format(self.fst_vt['MoorDyn']['Outputs'][i]))
+            ln.append('{:^11}'.format(self.fst_vt['MoorDyn']['CtrlChan'][i]))
             f.write(" ".join(ln) + '\n')
         f.write('---------------------- SOLVER OPTIONS ---------------------------------------\n')
         f.write('{:<22} {:<11} {:}'.format(self.fst_vt['MoorDyn']['dtM'], 'dtM', '- time step to use in mooring integration (s)\n'))
diff --git a/ROSCO_toolbox/ofTools/fast_io/pyIECWind.py b/ROSCO_toolbox/ofTools/fast_io/pyIECWind.py
index 0d026440..3cc899bb 100644
--- a/ROSCO_toolbox/ofTools/fast_io/pyIECWind.py
+++ b/ROSCO_toolbox/ofTools/fast_io/pyIECWind.py
@@ -106,6 +106,7 @@ def EOG(self, V_hub_in):
         shear_vert = np.zeros_like(t)+alpha
         shear_vert_lin = np.zeros_like(t)
         V_gust = np.zeros_like(t)
+        upflow = np.zeros_like(t)
 
         V_gust = min([ 1.35*(V_e1 - V_hub), 3.3*(sigma_1/(1+0.1*(self.D/self.Sigma_1))) ])
 
@@ -120,7 +121,7 @@ def EOG(self, V_hub_in):
         self.fname_out = []
         self.fname_type = []
         fname = self.case_name + '_EOG_U%2.1f.wnd'%V_hub_in
-        data = np.column_stack((t, V, V_dir, V_vert, shear_horz, shear_vert, shear_vert_lin, V_gust_t))
+        data = np.column_stack((t, V, V_dir, V_vert, shear_horz, shear_vert, shear_vert_lin, V_gust_t, upflow))
         hd = []
         hd.append('! Extreme operating guest\n')
         hd = self.heading_common(hd)
@@ -155,8 +156,9 @@ def EDC(self, V_hub_in):
         shear_vert = np.zeros_like(t)+alpha
         shear_vert_lin = np.zeros_like(t)
         V_gust = np.zeros_like(t)
+        upflow = np.zeros_like(t)
 
-        # Transcient
+        # Transient
         Theta_e = 4.*np.arctan(sigma_1/(V_hub*(1.+0.01*(self.D/self.Sigma_1))))*180./np.pi
         if Theta_e > 180.:
             Theta_e = 180.
@@ -177,7 +179,7 @@ def EDC(self, V_hub_in):
         if self.dir_change.lower() == 'both' or self.dir_change.lower() == '+':
             ## Vert
             fname = self.case_name + '_EDC_P_U%2.1f.wnd'%V_hub_in
-            data = np.column_stack((t, V, Theta_p, V_vert, shear_horz, shear_vert, shear_vert_lin, V_gust))
+            data = np.column_stack((t, V, Theta_p, V_vert, shear_horz, shear_vert, shear_vert_lin, V_gust, upflow))
             hd = []
             hd.append('! Exteme Vertical Wind Shear, positive\n')
             hd = self.heading_common(hd)
@@ -190,7 +192,7 @@ def EDC(self, V_hub_in):
         if self.dir_change.lower() == 'both' or self.dir_change.lower() == '-':
             ## Vert
             fname = self.case_name + '_EDC_N_U%2.1f.wnd'%V_hub_in
-            data = np.column_stack((t, V, Theta_n, V_vert, shear_horz, shear_vert, shear_vert_lin, V_gust))
+            data = np.column_stack((t, V, Theta_n, V_vert, shear_horz, shear_vert, shear_vert_lin, V_gust, upflow))
             hd = []
             hd.append('! Exteme Vertical Wind Shear, negative\n')
             hd = self.heading_common(hd)
@@ -224,8 +226,9 @@ def ECD(self, V_hub_in):
         shear_vert = np.zeros_like(t)+alpha
         shear_vert_lin = np.zeros_like(t)
         V_gust = np.zeros_like(t)
+        upflow = np.zeros_like(t)
 
-        # Transcient
+        # Transient
         if V_hub < 4:
             Theta_cg = 180
         else:
@@ -250,7 +253,7 @@ def ECD(self, V_hub_in):
         if self.dir_change.lower() == 'both' or self.dir_change.lower() == '+':
             ## Vert
             fname = self.case_name + '_ECD_P_U%2.1f.wnd'%V_hub_in
-            data = np.column_stack((t, V, Theta_p, V_vert, shear_horz, shear_vert, shear_vert_lin, V_gust))
+            data = np.column_stack((t, V, Theta_p, V_vert, shear_horz, shear_vert, shear_vert_lin, V_gust, upflow))
             hd = []
             hd.append('! Exteme coherent gust with direction change, positive\n')
             hd = self.heading_common(hd)
@@ -263,7 +266,7 @@ def ECD(self, V_hub_in):
         if self.dir_change.lower() == 'both' or self.dir_change.lower() == '-':
             ## Vert
             fname = self.case_name + '_ECD_N_U%2.1f.wnd'%V_hub_in
-            data = np.column_stack((t, V, Theta_n, V_vert, shear_horz, shear_vert, shear_vert_lin, V_gust))
+            data = np.column_stack((t, V, Theta_n, V_vert, shear_horz, shear_vert, shear_vert_lin, V_gust, upflow))
             hd = []
             hd.append('! Exteme coherent gust with direction change, negative\n')
             hd = self.heading_common(hd)
@@ -297,8 +300,9 @@ def EWS(self, V_hub_in):
         # shear_horz = np.zeros_like(t)
         shear_vert = np.zeros_like(t)+alpha
         V_gust = np.zeros_like(t)
+        upflow = np.zeros_like(t)
 
-        # Transcient
+        # Transient
         shear_lin_p = np.zeros_like(t)
         shear_lin_n = np.zeros_like(t)
 
@@ -313,7 +317,7 @@ def EWS(self, V_hub_in):
             if self.shear_orient.lower() == 'both' or self.shear_orient.lower() == 'v':
                 ## Vert
                 fname = self.case_name + '_EWS_V_P_U%2.1f.wnd'%V_hub_in
-                data = np.column_stack((t, V, V_dir, V_vert, np.zeros_like(t), shear_vert, shear_lin_p, V_gust))
+                data = np.column_stack((t, V, V_dir, V_vert, np.zeros_like(t), shear_vert, shear_lin_p, V_gust, upflow))
                 hd = []
                 hd.append('! Exteme Vertical Wind Shear, positive\n')
                 hd = self.heading_common(hd)
@@ -325,7 +329,7 @@ def EWS(self, V_hub_in):
             if self.shear_orient.lower() == 'both' or self.shear_orient.lower() == 'h':
                 # Horz
                 fname = self.case_name + '_EWS_H_P_U%2.1f.wnd'%V_hub_in
-                data = np.column_stack((t, V, V_dir, V_vert, shear_lin_p, shear_vert, np.zeros_like(t), V_gust))
+                data = np.column_stack((t, V, V_dir, V_vert, shear_lin_p, shear_vert, np.zeros_like(t), V_gust, upflow))
                 hd = []
                 hd.append('! Exteme Horizontal Wind Shear, positive\n')
                 hd = self.heading_common(hd)
@@ -338,7 +342,7 @@ def EWS(self, V_hub_in):
             if self.shear_orient.lower() == 'both' or self.shear_orient.lower() == 'v':
                 ## Vert
                 fname = self.case_name + '_EWS_V_N_U%2.1f.wnd'%V_hub_in
-                data = np.column_stack((t, V, V_dir, V_vert, np.zeros_like(t), shear_vert, shear_lin_n, V_gust))
+                data = np.column_stack((t, V, V_dir, V_vert, np.zeros_like(t), shear_vert, shear_lin_n, V_gust, upflow))
                 hd = []
                 hd.append('! Exteme Vertical Wind Shear, negative\n')
                 hd = self.heading_common(hd)
@@ -350,7 +354,7 @@ def EWS(self, V_hub_in):
             if self.shear_orient.lower() == 'both' or self.shear_orient.lower() == 'h':
                 # Horz
                 fname = self.case_name + '_EWS_H_N_U%2.1f.wnd'%V_hub_in
-                data = np.column_stack((t, V, V_dir, V_vert, shear_lin_n, shear_vert, np.zeros_like(t), V_gust))
+                data = np.column_stack((t, V, V_dir, V_vert, shear_lin_n, shear_vert, np.zeros_like(t), V_gust, upflow))
                 hd = []
                 hd.append('! Exteme Horizontal Wind Shear, negative\n')
                 hd = self.heading_common(hd)
@@ -380,16 +384,16 @@ def write_wnd(self, fname, data, hd):
         if not os.path.isdir(self.outdir):
             os.makedirs(self.outdir)
 
-        # Move transcient event to user definted time
+        # Move transient event to user defined time
         data[:,0] += self.TStart
         data = np.vstack((data[0,:], data, data[-1,:]))
         data[0,0] = self.T0
         data[-1,0] = self.TF
 
         # Headers
-        hd1 = ['Time', 'Wind', 'Wind', 'Vertical', 'Horiz.', 'Pwr. Law', 'Lin. Vert.', 'Gust']
-        hd2 = ['', 'Speed', 'Dir', 'Speed', 'Shear', 'Vert. Shr', 'Shear', 'Speed']
-        hd3 = ['(s)', '(m/s)', '(deg)', '(m/s)', '(-)', '(-)', '(-)', '(m/s)', ]
+        hd1 = ['Time', 'Wind', 'Wind', 'Vertical', 'Horiz.', 'Pwr. Law', 'Lin. Vert.', 'Gust', 'Upflow']
+        hd2 = ['', 'Speed', 'Dir', 'Speed', 'Shear', 'Vert. Shr', 'Shear', 'Speed', 'Angle']
+        hd3 = ['(s)', '(m/s)', '(deg)', '(m/s)', '(-)', '(-)', '(-)', '(m/s)', '(deg)']
 
         self.fpath = os.path.join(self.outdir, fname)
         fid = open(self.fpath, 'w')
@@ -439,9 +443,9 @@ def setup(self):
         turbsim_vt.runtime_options.RandSeed1  = self.seed
         turbsim_vt.runtime_options.WrADTWR    = False
         turbsim_vt.tmspecs.AnalysisTime       = self.AnalysisTime
-        turbsim_vt.tmspecs.HubHt              = self.z_hub
-        turbsim_vt.tmspecs.GridHeight         = np.ceil(self.z_hub*1.9)
-        turbsim_vt.tmspecs.GridWidth          = np.ceil(self.z_hub*1.9)
+        turbsim_vt.tmspecs.HubHt              = self.z_hub # wind grid centered at hub height
+        turbsim_vt.tmspecs.GridHeight         = (self.z_hub - 1.) * 2.0 # wind grid stops 1 meter above the ground
+        turbsim_vt.tmspecs.GridWidth          = (self.z_hub - 1.) * 2.0 # squared wind grid
         turbsim_vt.tmspecs.NumGrid_Z          = 25
         turbsim_vt.tmspecs.NumGrid_Y          = 25
         turbsim_vt.tmspecs.HFlowAng           = 0.0
diff --git a/ROSCO_toolbox/utilities.py b/ROSCO_toolbox/utilities.py
index 31451bc0..ec31411c 100644
--- a/ROSCO_toolbox/utilities.py
+++ b/ROSCO_toolbox/utilities.py
@@ -28,6 +28,7 @@
 from matplotlib import transforms
 from itertools import takewhile, product
 import struct
+import ROSCO_toolbox
 
 from ROSCO_toolbox.ofTools.util import spectral
 # Some useful constants
@@ -57,7 +58,7 @@ def write_DISCON(turbine, controller, param_file='DISCON.IN', txt_filename='Cp_C
     # Should be obvious what's going on here...
     file = open(param_file,'w')
     file.write('! Controller parameter input file for the %s wind turbine\n' % turbine.TurbineName)
-    file.write('!    - File written using ROSCO Controller tuning logic on %s\n' % now.strftime('%m/%d/%y'))
+    file.write('!    - File written using ROSCO version {} controller tuning logic on {}\n'.format(ROSCO_toolbox.__version__, now.strftime('%m/%d/%y')))
     file.write('\n')
     file.write('!------- DEBUG ------------------------------------------------------------\n')
     file.write('{0:<12d}        ! LoggingLevel		- {{0: write no debug files, 1: write standard output .dbg-file, 2: write standard output .dbg-file and complete avrSWAP-array .dbg2-file}}\n'.format(int(controller.LoggingLevel)))
@@ -454,7 +455,7 @@ def DISCON_dict(turbine, controller, txt_filename=None):
     return DISCON_dict
 
 
-def run_openfast(fast_dir,fastcall='OpenFAST',fastfile=None,chdir=False):
+def run_openfast(fast_dir,fastcall='openfast',fastfile=None,chdir=False):
     '''
     Runs a openfast openfast simulation.
     
diff --git a/Test_Cases/BAR_10/BAR_10_InflowFile.dat b/Test_Cases/BAR_10/BAR_10_InflowFile.dat
index b6191b38..3cd7c48f 100644
--- a/Test_Cases/BAR_10/BAR_10_InflowFile.dat
+++ b/Test_Cases/BAR_10/BAR_10_InflowFile.dat
@@ -2,24 +2,25 @@
 Generated with AeroElasticSE FAST driver
 ---------------------------------------------------------------------------------------------------------------
 False                  Echo        - Echo input data to <RootName>.ech (flag)
-3                      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)
+1                      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)
 0.0                    PropagationDir - Direction of wind propagation (meteoroligical rotation from aligned with X (positive rotates towards -Y) -- degrees)
+0                      VFlowAng       - Upflow angle (degrees) (not used for native Bladed format WindType=7)
 1                      NWindVel    - Number of points to output the wind velocity    (0 to 9)
 0.0                    WindVxiList - List of coordinates in the inertial X direction (m)
 0.0                    WindVyiList - List of coordinates in the inertial Y direction (m)
 90.0                   WindVziList - List of coordinates in the inertial Z direction (m)
 ================== Parameters for Steady Wind Conditions [used only for WindType = 1] =========================
 10.0                   HWindSpeed  - Horizontal windspeed                            (m/s)
-140.0                  RefHtT1     - Reference height for horizontal wind speed      (m)
-0.2                    PLexp       - Power law exponent                              (-)
+140.0                  RefHt       - Reference height for horizontal wind speed      (m)
+0.12                   PLexp       - Power law exponent                              (-)
 ================== Parameters for Uniform wind file   [used only for WindType = 2] ============================
-"/Users/pbortolo/work/2_openfast/BAR/OpenFAST_Models/BAR_00/Wind/140m_12mps.bts" FilenameT2  - Filename of time series data for uniform wind field.      (-)
-140.0                  RefHtT2     - Reference height for horizontal wind speed                (m)
+"Wind/NoShr_9-14_Inc1_50s.wnd" Filename_Uni    - Filename of time series data for uniform wind field.      (-)
+140.0                  RefHt_Uni       - Reference height for horizontal wind speed                (m)
 125.88                 RefLength   - Reference length for linear horizontal and vertical sheer (-)
 ================== Parameters for Binary TurbSim Full-Field files   [used only for WindType = 3] ==============
-"/Users/nabbas/Documents/WindEnergyToolbox/WindFiles/TurbWind/140m/140m_12mps.bts" FilenameT3  - Name of the Full field wind file to use (.bts)
+"Wind/145m_11mps_ClassA1ETM.bts" FileName_BTS    - Name of the Full field wind file to use (.bts)
 ================== Parameters for Binary Bladed-style Full-Field files   [used only for WindType = 4] =========
-"90m_12mps_twr"        FilenameT4  - Rootname of the full-field wind file to use (.wnd, .sum)
+"Wind/90m_12mps_twr"   FilenameRoot - Rootname of the full-field wind file to use (.wnd, .sum)
 False                  TowerFile   - Have tower file (.twr) (flag)
 ================== Parameters for HAWC-format binary files  [Only used with WindType = 5] =====================
 "/Users/pbortolo/work/2_openfast/BAR/OpenFAST_Models/BAR_00/basic_5u.bin" FileName_u  - name of the file containing the u-component fluctuating wind (.bin)
@@ -31,7 +32,7 @@ False                  TowerFile   - Have tower file (.twr) (flag)
 16.0                   dx          - distance (in meters) between points in the x direction    (m)
 3.0                    dy          - distance (in meters) between points in the y direction    (m)
 3.0                    dz          - distance (in meters) between points in the z direction    (m)
-140.0                  RefHtT5     - reference height; the height (in meters) of the vertical center of the grid (m)
+140.0                  RefHt_Hawc  - reference height; the height (in meters) of the vertical center of the grid (m)
 -------------   Scaling parameters for turbulence   ---------------------------------------------------------
 2                      ScaleMethod - Turbulence scaling method   [0 = none, 1 = direct scaling, 2 = calculate scaling factor based on a desired standard deviation]
 1.0                    SFx         - Turbulence scaling factor for the x direction (-)   [ScaleMethod=1]
@@ -43,11 +44,12 @@ False                  TowerFile   - Have tower file (.twr) (flag)
 -------------   Mean wind profile parameters (added to HAWC-format files)   ---------------------------------
 12.0                   URef        - Mean u-component wind speed at the reference height (m/s)
 2                      WindProfile - Wind profile type (0=constant;1=logarithmic,2=power law)
-0.2                    PLExp       - Power law exponent (-) (used for PL wind profile type only)
+0.2                    PLExp_Hawc  - Power law exponent (-) (used for PL wind profile type only)
 0.03                   Z0          - Surface roughness length (m) (used for LG wind profile type only)
+0                      XOffset     - Initial offset in +x direction (shift of wind box)
 ====================== OUTPUT ==================================================
 False                  SumPrint    - Print summary data to <RootName>.IfW.sum (flag)
 OutList      - The next line(s) contains a list of output parameters.  See OutListParameters.xlsx for a listing of available output channels, (-)
-"Wind1VelX"
+Wind1VelX
 END of input file (the word "END" must appear in the first 3 columns of this last OutList line)
 ---------------------------------------------------------------------------------------
diff --git a/Test_Cases/BAR_10/BAR_10_ServoDyn.dat b/Test_Cases/BAR_10/BAR_10_ServoDyn.dat
index 7fdc1175..51579653 100644
--- a/Test_Cases/BAR_10/BAR_10_ServoDyn.dat
+++ b/Test_Cases/BAR_10/BAR_10_ServoDyn.dat
@@ -63,7 +63,7 @@ False                  CompNTMD    - Compute nacelle tuned mass damper {true/fal
 False                  CompTTMD    - Compute tower tuned mass damper {true/false} (flag)
 "b.dat"                TTMDfile    - Name of the file for tower tuned mass damper (quoted string) [unused when CompTTMD is false]
 ---------------------- BLADED INTERFACE ---------------------------------------- [used only with Bladed Interface]
-"/Users/nabbas/Documents/WindEnergyToolbox/ROSCO/build/libdiscon.dylib" DLL_FileName - Name/location of the dynamic library {.dll [Windows] or .so [Linux]} in the Bladed-DLL format (-) [used only with Bladed Interface]
+"../../ROSCO/build/libdiscon.dylib" DLL_FileName - Name/location of the dynamic library {.dll [Windows] or .so [Linux]} in the Bladed-DLL format (-) [used only with Bladed Interface]
 "BAR_10_DISCON.IN"     DLL_InFile  - Name of input file sent to the DLL (-) [used only with Bladed Interface]
 "DISCON"               DLL_ProcName - Name of procedure in DLL to be called (-) [case sensitive; used only with DLL Interface]
 "default"              DLL_DT      - Communication interval for dynamic library (s) (or "default") [used only with Bladed Interface]
diff --git a/Test_Cases/IEA-15-240-RWT-UMaineSemi/IEA-15-240-RWT-UMaineSemi_MoorDyn.dat b/Test_Cases/IEA-15-240-RWT-UMaineSemi/IEA-15-240-RWT-UMaineSemi_MoorDyn.dat
index 18ca40f1..9032a2d8 100644
--- a/Test_Cases/IEA-15-240-RWT-UMaineSemi/IEA-15-240-RWT-UMaineSemi_MoorDyn.dat
+++ b/Test_Cases/IEA-15-240-RWT-UMaineSemi/IEA-15-240-RWT-UMaineSemi_MoorDyn.dat
@@ -18,11 +18,11 @@ Node Type      X         Y       Z       M    V    FX   FY   FZ  CdA   CA
 6   Fixed   418.800 -725.383 -200.000    0    0    0    0    0    0    0
 ---------------------- LINE PROPERTIES --------------------------------------                                           
 3           NLines    - number of line objects                                      
-Line  LineType  UnstrLen  NumSegs  NodeAnch  NodeFair  Flags/Outputs                   
-(-)   (-)       (m)       (-)      (-)       (-)       (-)                 
-1     main      850.00    50        2         1         -                   
-2     main      850.00    50        4         3         -                   
-3     main      850.00    50        6         5         -                   
+Line  LineType  UnstrLen  NumSegs  NodeAnch  NodeFair  Flags/Outputs    Control               
+(-)   (-)       (m)       (-)      (-)       (-)       (-)                 (-)
+1     main      850.00    50        2         1         -                  0 
+2     main      850.00    50        4         3         -                  0 
+3     main      850.00    50        6         5         -                  0 
 ---------------------- SOLVER OPTIONS ---------------------------------------                                           
 0.001    dtM       - time step to use in mooring integration (s)
 3.0e6    kbot      - bottom stiffness (Pa/m)
diff --git a/Test_Cases/IEA-15-240-RWT-UMaineSemi/IEA-15-240-RWT-UMaineSemi_ServoDyn.dat b/Test_Cases/IEA-15-240-RWT-UMaineSemi/IEA-15-240-RWT-UMaineSemi_ServoDyn.dat
index 8985e90a..92c9b2fe 100644
--- a/Test_Cases/IEA-15-240-RWT-UMaineSemi/IEA-15-240-RWT-UMaineSemi_ServoDyn.dat
+++ b/Test_Cases/IEA-15-240-RWT-UMaineSemi/IEA-15-240-RWT-UMaineSemi_ServoDyn.dat
@@ -63,7 +63,7 @@ False                  CompNTMD    - Compute nacelle tuned mass damper {true/fal
 False                  CompTTMD    - Compute tower tuned mass damper {true/false} (flag)
 "unused"               TTMDfile    - Name of the file for tower tuned mass damper (quoted string) [unused when CompTTMD is false]
 ---------------------- BLADED INTERFACE ---------------------------------------- [used only with Bladed Interface]
-"../../ROSCO/libdiscon.dylib" DLL_FileName - Name/location of the dynamic library {.dll [Windows] or .so [Linux]} in the Bladed-DLL format (-) [used only with Bladed Interface]
+"../../ROSCO/build/libdiscon.dylib"  DLL_FileName - Name/location of the dynamic library {.dll [Windows] or .so [Linux]} in the Bladed-DLL format (-) [used only with Bladed Interface]
 "ServoData/DISCON-UMaineSemi.IN"   DLL_InFile  - Name of input file sent to the DLL (-) [used only with Bladed Interface]
 "DISCON"               DLL_ProcName - Name of procedure in DLL to be called (-) [case sensitive; used only with DLL Interface]
 "default"              DLL_DT      - Communication interval for dynamic library (s) (or "default") [used only with Bladed Interface]
diff --git a/Test_Cases/IEA-15-240-RWT-UMaineSemi/IEA-15-240-RWT_AeroDyn15.dat b/Test_Cases/IEA-15-240-RWT-UMaineSemi/IEA-15-240-RWT_AeroDyn15.dat
index 215aa958..182bc835 100644
--- a/Test_Cases/IEA-15-240-RWT-UMaineSemi/IEA-15-240-RWT_AeroDyn15.dat
+++ b/Test_Cases/IEA-15-240-RWT-UMaineSemi/IEA-15-240-RWT_AeroDyn15.dat
@@ -3,15 +3,15 @@ IEA 15 MW Offshore Reference Turbine
 ======  General Options  ============================================================================
 False                  Echo        - Echo the input to "<rootname>.AD.ech"?  (flag)
 "default"              DTAero      - Time interval for aerodynamic calculations {or "default"} (s)
-1                      WakeMod     - Type of wake/induction model (switch) {0=none, 1=BEMT}
-2                      AFAeroMod   - Type of blade airfoil aerodynamics model (switch) {1=steady model, 2=Beddoes-Leishman unsteady model} [must be 1 when linearizing]
+1                      WakeMod      - Type of wake/induction model (switch) {0=none, 1=BEMT, 2=DBEMT, 3=OLAF} [WakeMod cannot be 2 or 3 when linearizing]
+2                      AFAeroMod    - Type of blade airfoil aerodynamics model (switch) {1=steady model, 2=Beddoes-Leishman unsteady model} [AFAeroMod must be 1 when linearizing]
 1                      TwrPotent   - Type tower influence on wind based on potential flow around the tower (switch) {0=none, 1=baseline potential flow, 2=potential flow with Bak correction}
-False                  TwrShadow   - Calculate tower influence on wind based on downstream tower shadow? (flag)
+False                  TwrShadow    - Calculate tower influence on wind based on downstream tower shadow (switch) {0=none, 1=Powles model, 2=Eames model}
 True                   TwrAero     - Calculate tower aerodynamic loads? (flag)
 False                  FrozenWake  - Assume frozen wake during linearization? (flag) [used only when WakeMod=1 and when linearizing]
-False                  CavitCheck  - Perform cavitation check? (flag) TRUE will turn off unsteady aerodynamics
-False                  CompAA      - Flag to compute AeroAcoustics calculation [only used when WakeMod=1 or 2]
-"AeroAcousticsInput.dat" AA_InputFile - Aeroacoustics input file
+False                  CavitCheck   - Perform cavitation check? (flag) [AFAeroMod must be 1 when CavitCheck=true]
+False                  CompAA       - Flag to compute AeroAcoustics calculation [used only when WakeMod = 1 or 2]
+"AeroAcousticsInput.dat" AA_InputFile - AeroAcoustics input file [used only when CompAA=true]
 ======  Environmental Conditions  ===================================================================
  1.225000000000000e+00 AirDens     - Air density (kg/m^3)
  1.479232653061225e-05 KinVisc     - Kinematic air viscosity (m^2/s)
@@ -20,23 +20,23 @@ False                  CompAA      - Flag to compute AeroAcoustics calculation [
  1.700000000000000e+03 Pvap        - Vapour pressure of fluid (Pa) [used only when CavitCheck=True]
  5.000000000000000e-01 FluidDepth  - Water depth above mid-hub height (m) [used only when CavitCheck=True]
 ======  Blade-Element/Momentum Theory Options  ====================================================== [used only when WakeMod=1]
-2                      SkewMod     - Type of skewed-wake correction model (switch) {1=uncoupled, 2=Pitt/Peters, 3=coupled} [used only when WakeMod=1]
-"default"              SkewModFactor - Constant used in Pitt/Peters skewed wake model {or "default" is 15/32*pi} (-) [used only when SkewMod=2; unused when WakeMod=0]
-True                   TipLoss     - Use the Prandtl tip-loss model? (flag) [used only when WakeMod=1]
-True                   HubLoss     - Use the Prandtl hub-loss model? (flag) [used only when WakeMod=1]
-True                   TanInd      - Include tangential induction in BEMT calculations? (flag) [used only when WakeMod=1]
-True                   AIDrag      - Include the drag term in the axial-induction calculation? (flag) [used only when WakeMod=1]
-True                   TIDrag      - Include the drag term in the tangential-induction calculation? (flag) [used only when WakeMod=1 and TanInd=TRUE]
-"Default"              IndToler    - Convergence tolerance for BEMT nonlinear solve residual equation {or "default"} (-) [used only when WakeMod=1]
-500                    MaxIter     - Maximum number of iteration steps (-) [used only when WakeMod=1]
+2                      SkewMod     - Type of skewed-wake correction model (switch) {1=uncoupled, 2=Pitt/Peters, 3=coupled} [unused when WakeMod=0 or 3]
+"default"            SkewModFactor - Constant used in Pitt/Peters skewed wake model {or "default" is 15/32*pi} (-) [used only when SkewMod=2; unused when WakeMod=0 or 3]
+True                   TipLoss     - Use the Prandtl tip-loss model? (flag) [unused when WakeMod=0 or 3]
+True                   HubLoss     - Use the Prandtl hub-loss model? (flag) [unused when WakeMod=0 or 3]
+True                   TanInd      - Include tangential induction in BEMT calculations? (flag) [unused when WakeMod=0 or 3]
+True                   AIDrag      - Include the drag term in the axial-induction calculation? (flag) [unused when WakeMod=0 or 3]
+True                   TIDrag      - Include the drag term in the tangential-induction calculation? (flag) [unused when WakeMod=0,3 or TanInd=FALSE]
+"Default"              IndToler    - Convergence tolerance for BEMT nonlinear solve residual equation {or "default"} (-) [unused when WakeMod=0 or 3]
+500                    MaxIter     - Maximum number of iteration steps (-) [unused when WakeMod=0]
 ======  Dynamic Blade-Element/Momentum Theory Options  ====================================================== [used only when WakeMod=1]
 2                      DBEMT_Mod   - Type of dynamic BEMT (DBEMT) model {1=constant tau1, 2=time-dependent tau1} (-) [used only when WakeMod=2]
 2                      tau1_const  - Time constant for DBEMT (s) [used only when WakeMod=2 and DBEMT_Mod=1]
 ======  OLAF -- cOnvecting LAgrangian Filaments (Free Vortex Wake) Theory Options  ================== [used only when WakeMod=3]
 "unused"               OLAFInputFileName - Input file for OLAF [used only when WakeMod=3]
 ======  Beddoes-Leishman Unsteady Airfoil Aerodynamics Options  ===================================== [used only when AFAeroMod=2]
-3                      UAMod       Unsteady Aero Model Switch (switch) {1=Baseline model (Original), 2=Gonzalez's variant (changes in Cn,Cc,Cm), 3=Minemma/Pierce variant (changes in Cc and Cm)} [used only when AFAeroMod=2]
-True                   FLookup     Flag to indicate whether a lookup for f' will be calculated (TRUE) or whether best-fit exponential equations will be used (FALSE); if FALSE S1-S4 must be provided in airfoil input files (flag) [used only when AFAeroMod=2]
+3                      UAMod       - Unsteady Aero Model Switch (switch) {1=Baseline model (Original), 2=Gonzalez's variant (changes in Cn,Cc,Cm), 3=Minnema/Pierce variant (changes in Cc and Cm)} [used only when AFAeroMod=2]
+True                   FLookup     - Flag to indicate whether a lookup for f' will be calculated (TRUE) or whether best-fit exponential equations will be used (FALSE); if FALSE S1-S4 must be provided in airfoil input files (flag) [used only when AFAeroMod=2]
 ======  Airfoil Information =========================================================================
 1                      AFTabMod    - Interpolation method for multiple airfoil tables {1=1D interpolation on AoA (first table only); 2=2D interpolation on AoA and Re; 3=2D interpolation on AoA and UserProp} (-)
 1                      InCol_Alfa  - The column in the airfoil tables that contains the angle of attack (-)
@@ -130,6 +130,9 @@ True                   SumPrint    - Generate a summary file listing input optio
 "RtAeroMzh"
 "RtVAvgxh"
 "RtAeroCp"
+"RtAeroCt"
+"RtArea"
+"RtSpeed"
 "RtTSR"
 END of input file (the word "END" must appear in the first 3 columns of this last OutList line)
 ---------------------------------------------------------------------------------------
diff --git a/Test_Cases/IEA-15-240-RWT-UMaineSemi/IEA-15-240-RWT_InflowFile.dat b/Test_Cases/IEA-15-240-RWT-UMaineSemi/IEA-15-240-RWT_InflowFile.dat
index 540bb6b4..f7e3ccc8 100644
--- a/Test_Cases/IEA-15-240-RWT-UMaineSemi/IEA-15-240-RWT_InflowFile.dat
+++ b/Test_Cases/IEA-15-240-RWT-UMaineSemi/IEA-15-240-RWT_InflowFile.dat
@@ -2,8 +2,9 @@
 IEA 15 MW Offshore Reference Turbine
 ---------------------------------------------------------------------------------------------------------------
 False                  Echo        - Echo input data to <RootName>.ech (flag)
-1                      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)
+1                      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; 7=native Bladed FF)
 0.0                    PropagationDir - Direction of wind propagation (meteoroligical rotation from aligned with X (positive rotates towards -Y) -- degrees)
+0                      VFlowAng       - Upflow angle (degrees) (not used for native Bladed format WindType=7)
 1                      NWindVel    - Number of points to output the wind velocity    (0 to 9)
 0.0                    WindVxiList - List of coordinates in the inertial X direction (m)
 0.0                    WindVyiList - List of coordinates in the inertial Y direction (m)
@@ -13,11 +14,11 @@ False                  Echo        - Echo input data to <RootName>.ech (flag)
 150.0                  RefHt       - Reference height for horizontal wind speed      (m)
 0.12                   PLexp       - Power law exponent                              (-)
 ================== Parameters for Uniform wind file   [used only for WindType = 2] ============================
-"Wind/NoShr_9-14_Inc1_50s.wnd" Filename    - Filename of time series data for uniform wind field.      (-)
-150.0                  RefHt       - Reference height for horizontal wind speed                (m)
+"Wind/NoShr_9-14_Inc1_50s.wnd" Filename_Uni    - Filename of time series data for uniform wind field.      (-)
+150.0                  RefHt_Uni       - Reference height for horizontal wind speed                (m)
 125.88                 RefLength   - Reference length for linear horizontal and vertical sheer (-)
 ================== Parameters for Binary TurbSim Full-Field files   [used only for WindType = 3] ==============
-"Wind/145m_11mps_ClassA1ETM.bts" Filename    - Name of the Full field wind file to use (.bts)
+"Wind/145m_11mps_ClassA1ETM.bts" FileName_BTS    - Name of the Full field wind file to use (.bts)
 ================== Parameters for Binary Bladed-style Full-Field files   [used only for WindType = 4] =========
 "Wind/90m_12mps_twr"   FilenameRoot - Rootname of the full-field wind file to use (.wnd, .sum)
 False                  TowerFile   - Have tower file (.twr) (flag)
@@ -31,7 +32,7 @@ False                  TowerFile   - Have tower file (.twr) (flag)
 16.0                   dx          - distance (in meters) between points in the x direction    (m)
 3.0                    dy          - distance (in meters) between points in the y direction    (m)
 3.0                    dz          - distance (in meters) between points in the z direction    (m)
-150.0                  RefHt       - reference height; the height (in meters) of the vertical center of the grid (m)
+150.0                  RefHt_Hawc  - reference height; the height (in meters) of the vertical center of the grid (m)
 -------------   Scaling parameters for turbulence   ---------------------------------------------------------
 2                      ScaleMethod - Turbulence scaling method   [0 = none, 1 = direct scaling, 2 = calculate scaling factor based on a desired standard deviation]
 1.0                    SFx         - Turbulence scaling factor for the x direction (-)   [ScaleMethod=1]
@@ -43,8 +44,9 @@ False                  TowerFile   - Have tower file (.twr) (flag)
 -------------   Mean wind profile parameters (added to HAWC-format files)   ---------------------------------
 12.0                   URef        - Mean u-component wind speed at the reference height (m/s)
 2                      WindProfile - Wind profile type (0=constant;1=logarithmic,2=power law)
-0.2                    PLExp       - Power law exponent (-) (used for PL wind profile type only)
+0.2                    PLExp_Hawc  - Power law exponent (-) (used for PL wind profile type only)
 0.03                   Z0          - Surface roughness length (m) (used for LG wind profile type only)
+0                      XOffset     - Initial offset in +x direction (shift of wind box)
 ====================== OUTPUT ==================================================
 False                  SumPrint    - Print summary data to <RootName>.IfW.sum (flag)
 OutList      - The next line(s) contains a list of output parameters.  See OutListParameters.xlsx for a listing of available output channels, (-)
diff --git a/Test_Cases/NREL-5MW/NRELOffshrBsline5MW_InflowWind.dat b/Test_Cases/NREL-5MW/NRELOffshrBsline5MW_InflowWind.dat
index 333cff15..3fd8bc13 100644
--- a/Test_Cases/NREL-5MW/NRELOffshrBsline5MW_InflowWind.dat
+++ b/Test_Cases/NREL-5MW/NRELOffshrBsline5MW_InflowWind.dat
@@ -4,6 +4,7 @@ Steady 8 m/s winds with no shear for FAST CertTests #20 and #25
 False         Echo           - Echo input data to <RootName>.ech (flag)
           1   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)
           0   PropagationDir - Direction of wind propagation (meteoroligical rotation from aligned with X (positive rotates towards -Y) -- degrees)
+          0   VFlowAng       - Upflow angle (degrees) (not used for native Bladed format WindType=7)
           1   NWindVel       - Number of points to output the wind velocity    (0 to 9)
           0   WindVxiList    - List of coordinates in the inertial X direction (m)
           0   WindVyiList    - List of coordinates in the inertial Y direction (m)
@@ -13,14 +14,14 @@ False         Echo           - Echo input data to <RootName>.ech (flag)
          90   RefHt          - Reference height for horizontal wind speed      (m)
           0   PLexp          - Power law exponent                              (-)
 ================== Parameters for Uniform wind file   [used only for WindType = 2] ============================
-"unused"    Filename       - Filename of time series data for uniform wind field.      (-)
-         90   RefHt          - Reference height for horizontal wind speed                (m)
+"unused"      Filename_Uni   - Filename of time series data for uniform wind field.      (-)
+         90   RefHt_Uni      - Reference height for horizontal wind speed                (m)
      125.88   RefLength      - Reference length for linear horizontal and vertical sheer (-)
 ================== Parameters for Binary TurbSim Full-Field files   [used only for WindType = 3] ==============
-"unused"    Filename       - Name of the Full field wind file to use (.bts)
-================== Parameters for Binary Bladed-style Full-Field files   [used only for WindType = 4] =========
-"unused"      FilenameRoot   - Rootname of the full-field wind file to use (.wnd, .sum)
-False         TowerFile      - Have tower file (.twr) (flag)
+"Wind/90m_12mps_twr.bts"    FileName_BTS   - Name of the Full field wind file to use (.bts)
+================== Parameters for Binary Bladed-style Full-Field files   [used only for WindType = 4 or WindType = 7] =========
+"unused"      FileNameRoot   - WindType=4: Rootname of the full-field wind file to use (.wnd, .sum); WindType=7: name of the intermediate file with wind scaling values
+False         TowerFile      - Have tower file (.twr) (flag) ignored when WindType = 7
 ================== Parameters for HAWC-format binary files  [Only used with WindType = 5] =====================
 "unused"    FileName_u     - name of the file containing the u-component fluctuating wind (.bin)
 "unused"    FileName_v     - name of the file containing the v-component fluctuating wind (.bin)
@@ -31,7 +32,7 @@ False         TowerFile      - Have tower file (.twr) (flag)
          16   dx             - distance (in meters) between points in the x direction    (m)
           3   dy             - distance (in meters) between points in the y direction    (m)
           3   dz             - distance (in meters) between points in the z direction    (m)
-         90   RefHt          - reference height; the height (in meters) of the vertical center of the grid (m)
+         90   RefHt_Hawc     - reference height; the height (in meters) of the vertical center of the grid (m)
   -------------   Scaling parameters for turbulence   ---------------------------------------------------------
           1   ScaleMethod    - Turbulence scaling method   [0 = none, 1 = direct scaling, 2 = calculate scaling factor based on a desired standard deviation]
           1   SFx            - Turbulence scaling factor for the x direction (-)   [ScaleMethod=1]
@@ -43,8 +44,9 @@ False         TowerFile      - Have tower file (.twr) (flag)
   -------------   Mean wind profile parameters (added to HAWC-format files)   ---------------------------------
           5   URef           - Mean u-component wind speed at the reference height (m/s)
           2   WindProfile    - Wind profile type (0=constant;1=logarithmic,2=power law)
-          0   PLExp          - Power law exponent (-) (used for PL wind profile type only)
+        0.2   PLExp_Hawc     - Power law exponent (-) (used for PL wind profile type only)
        0.03   Z0             - Surface roughness length (m) (used for LG wind profile type only)
+          0   XOffset         - Initial offset in +x direction (shift of wind box)
 ====================== OUTPUT ==================================================
 False         SumPrint     - Print summary data to <RootName>.IfW.sum (flag)
               OutList      - The next line(s) contains a list of output parameters.  See OutListParameters.xlsx for a listing of available output channels, (-)
diff --git a/Tune_Cases/BAR.yaml b/Tune_Cases/BAR.yaml
index c93d0a73..ebaacad7 100644
--- a/Tune_Cases/BAR.yaml
+++ b/Tune_Cases/BAR.yaml
@@ -4,7 +4,7 @@
 # ------------------------------ OpenFAST PATH DEFINITIONS ------------------------------
 path_params:
   FAST_InputFile: 'BAR_10.fst'                                                                # Name of *.fst file
-  FAST_directory: 'Test_Cases/BAR_10'                     # Main OpenFAST model directory, where the *.fst lives 
+  FAST_directory: '../Test_Cases/BAR_10'                     # Main OpenFAST model directory, where the *.fst lives 
   # Optional (but suggested...)
   rotor_performance_filename:  'BAR_10_Cp_Ct_Cq.txt'                                # Filename for rotor performance text file (if it has been generated by ccblade already)
 


Test patch:
diff --git a/ROSCO_testing/run_Testing.py b/ROSCO_testing/run_Testing.py
index b528ba0d..51518530 100644
--- a/ROSCO_testing/run_Testing.py
+++ b/ROSCO_testing/run_Testing.py
@@ -79,16 +79,14 @@ def run_testing(turbine2test, testtype, rosco_binaries=[], discon_files=[], **kw
 if __name__ == "__main__":
 
     # WEIS directory, for running openfast, etc.
-    # weis_dir = os.environ.get('weis_dir')       # works if we do  `export weis_dir=$(pwd)` in WEIS directory in terminal
-    weis_dir = '/Users/dzalkind/Tools/WEIS-3'
     this_dir =  os.path.dirname(__file__)
 
     # Setup ROSCO testing parameters
     rt_kwargs = {} 
     rt_kwargs['runDir']     = os.path.join(this_dir,'results/')        # directory for FAST simulations
     rt_kwargs['namebase']   = 'lite_test'     # Base name for FAST files 
-    rt_kwargs['FAST_exe']   = os.path.join(weis_dir,'local','bin','openfast')       # OpenFAST executable path
-    rt_kwargs['Turbsim_exe']= os.path.join(weis_dir,'local','bin','turbsim')        # Turbsim executable path
+    rt_kwargs['FAST_exe']   = 'openfast'       # OpenFAST executable path
+    rt_kwargs['Turbsim_exe']= 'turbsim'    # Turbsim executable path
     rt_kwargs['FAST_ver']   = 'OpenFAST'            # FAST version
     rt_kwargs['dev_branch'] = True                  # dev branch of Openfast?
     rt_kwargs['debug_level']= 2                     # debug level. 0 - no outputs, 1 - minimal outputs, 2 - all outputs
@@ -99,11 +97,11 @@ def run_testing(turbine2test, testtype, rosco_binaries=[], discon_files=[], **kw
     rt_kwargs['outfile_fmt'] = 2                    # 1 = .txt, 2 = binary, 3 = both
 
     # ---- Define test type ----
-    turbine2test = 'IEA-15MW'   # IEA-15MW or NREL-5MW
+    turbine2test = 'NREL-5MW'   # IEA-15MW or NREL-5MW
     testtype     = 'lite'       # lite, heavy, binary-comp, discon-comp
 
     # Only fill one of these if comparing controllers
-    rosco_binaries = [glob.glob(os.path.join(this_dir,'../ROSCO/build/libdiscon*'))[0]] # Differently named libdiscons to compare
+    rosco_binaries = [glob.glob(os.path.join(this_dir,'../ROSCO/build/libdiscon.*'))[0]] # Differently named libdiscons to compare
     discon_files = []   # Differently named DISCON.IN files to compare