示例#1
0
def main():  #\
    """Function to Instantiate a JacketSE Assembly: \n
       INPUTS \n
             All hardwired, so edit the quantities below all the way to the line "#________________ DO NOT MODIFY THE FOLLOWING ________________#" \n
             -See JacketOpt_PyOPT for more information. \n
       OUTPUTS \n
             myjckt -jacket assembly instance \n\n

             Optimization parameters:    \n\n

             f0          -float, target frequency [Hz]
             f0epsilon   -float,  f0*(1+f0epsilon) will not be exceeded \n
             jcktDTRmin  -Float, minimum jacket member DTR allowed, mostly for 60+waterdepths. \n
             mxftprint   -Float, max allowed foot print [m]
             guesses     -Float(n), guesses for all design variables check out DesVar class. \n
             bounds      -Float(n,2), bounds for all design variables check out DesVar class. \n\n
             SAMPLE CALLS: \n
             1.OPTIMIZATION: python JacketOpt_ExtCobyla.py C:\RRD\PYTHON\WISDEM\JacketSE\src\jacketse\MyJacketInputs.py \n
             2.OPTIMIZATION: python JacketOpt_PyOPT.py C:\RRD\PYTHON\WISDEM\JacketSE\src\jacketse\MyJacketInputs.py True \n
             3.BUILD JACKET: python >>> myjacket=C:\RRD\PYTHON\WISDEM\JacketSE\src\jacketse\MyJacketInputs.py \n
        """

    #Set inputs							     ###----ALL USER INPUT----###
    Jcktins = JcktGeoInputs()

    Jcktins.nlegs = 4
    Jcktins.nbays = 4
    Jcktins.batter = 30.5495  #=(-43.127+24.614)/(5.939-5.333)
    #Jcktins.dck_botz =15.651
    Jcktins.dck_botz = 16.15  #CJBe
    Jcktins.dck_width = 8. + 1.2
    Jcktins.weld2D = 0.
    Jcktins.VPFlag = True  #vertical pile T/F;  to enable piles in frame3DD set pileinputs.ndiv>0
    Jcktins.clamped = True  #whether or not the bottom of the structure is rigidly connected. Use False when equivalent spring constants are being used.
    Jcktins.AFflag = False  #whether or not to use apparent fixity piles
    Jcktins.PreBuildTPLvl = 0  #if >0, the TP is prebuilt according to rules per PreBuildTP

    #______________________________________________#

    #Soil inputs
    Soilinputs = SoilGeoInputs()
    Soilinputs.zbots = -np.array([3., 5., 7., 15., 30., 50.])
    Soilinputs.gammas = np.array(
        [10000., 10000., 10000., 10000., 10000., 10000.])
    Soilinputs.cus = np.array([60000., 60000., 60000., 60000., 60000., 60000.])
    Soilinputs.phis = np.array(
        [26., 26., 26., 26., 26., 26]
    )  #np.array([36.,33.,26.,37.,35.,37.5])#np.array([36.,33.,26.,37.,35.,37.5])
    Soilinputs.delta = 25.
    Soilinputs.sndflg = True
    Soilinputs.PenderSwtch = False  #True
    Soilinputs.SoilSF = 1.
    #______________________________________________#

    #Water and wind inputs
    Waterinputs = WaterInputs()

    Waterinputs.wdepth = 50.
    Waterinputs.wlevel = 50.  #Distance from bottom of structure to surface  THIS, I believe is no longer needed as piles may be negative in z, to check and remove in case
    Waterinputs.T = 12.  #Wave Period
    Waterinputs.HW = 10.  #Wave Height
    Waterinputs.Cd = 3.  #Drag Coefficient, enhanced to account for marine growth and other members not calculated
    Waterinputs.Cm = 8.  #2.  #ADded mass Coefficient

    Windinputs = WindInputs()
    Windinputs.HH = 88.15 + 2.4  #CHECK HOW THIS COMPLIES....
    Windinputs.U50HH = 30.  #assumed gust speed
    Windinputs.Cdj = 4.  #Drag Coefficient for jacket members, enhanced to account for TP drag not calculated otherwise
    Windinputs.Cdt = 2  #Drag Coefficient for tower, enhanced to account for TP drag not calculated otherwise
    #______________________________________________#

    #Pile data
    Pilematin = MatInputs()
    Pilematin.matname = np.array(['steel'
                                  ])  #CJB Changed this from RC into steel
    Pilematin.E = np.array([2.1e11])
    Pilematin.G = np.array([8.07690e+10])
    Pilematin.rho = np.array(
        [3339.12]
    ) * 34274.82 / 36876.  #From Test04.txt in SD, to check with official FAST certtest

    Pileinputs = PileGeoInputs()
    Pileinputs.Pilematins = Pilematin
    Pileinputs.ndiv = 0  #CJB Change this from 1 to 0 #3			   ###----USER INPUT----###
    Pileinputs.Dpile = 2.082
    Pileinputs.tpile = 0.491
    Pileinputs.Lp = 0.  #[m] Embedment length
    #______________________________________________#

    #Legs data
    legmatin = MatInputs()
    legmatin.matname = (['steel'])
    legmatin.rho = np.array([7850.])
    Dleg = np.asarray([1.2]).repeat(Jcktins.nbays +
                                    1)  #e.g., np.array([2.0,1.8,1.6,1.6,1.6])
    tleg = np.asarray([0.05, 0.05, 0.035, 0.035, 0.035])

    leginputs = LegGeoInputs()
    leginputs.legZbot = 4.5  ###----USER INPUT----###
    leginputs.ndiv = 1  ###----USER INPUT----###
    leginputs.legmatins = legmatin
    leginputs.Dleg = Dleg
    leginputs.tleg = tleg

    #The following is a passthrough variables
    legbot_stmphin = (
        45.5 - 43.127
    )  #=2.373 Distance from bottom of leg to second joint along z; must be>0
    #______________________________________________#

    #Xbrc data
    Xbrcmatin = MatInputs()
    Xbrcmatin.matname = np.array(['steel']).repeat(Jcktins.nbays)
    Xbrcmatin.rho = np.array([7850.])

    Dbrc = np.asarray([0.8]).repeat(Jcktins.nbays)
    tbrc = np.asarray([0.02]).repeat(Jcktins.nbays)

    Xbrcinputs = XBrcGeoInputs()
    Xbrcinputs.Dbrc = Dbrc
    Xbrcinputs.tbrc = tbrc
    Xbrcinputs.ndiv = 1  ###----USER INPUT----###
    Xbrcinputs.Xbrcmatins = Xbrcmatin
    Xbrcinputs.precalc = False  #This can be set to true if we want Xbraces to be precalculated in D and t, in which case the above set Dbrc and tbrc would be overwritten
    #______________________________________________#

    #Mbrc data
    Mbrcmatin = MatInputs()
    Mbrcmatin.matname = np.array(['steel'])
    Mbrcmatin.rho = np.array([7850.])

    Mbrcinputs = MudBrcGeoInputs()
    Mbrcinputs.Dbrc_mud = 0.8  ###----USER INPUT----###
    Mbrcinputs.tbrc_mud = 0.02
    Mbrcinputs.ndiv = 2  ###----USER INPUT----###
    Mbrcinputs.Mbrcmatins = Mbrcmatin
    Mbrcinputs.precalc = False  #This can be set to true if we want Mudbrace to be precalculated in D and t, in which case the above set Dbrc_mud and tbrc_mud would be overwritten
    #______________________________________________#

    #Hbrc data
    Hbrcmatin = MatInputs()
    Hbrcmatin.matname = np.array(['steel'])
    Hbrcmatin.rho = np.array([7850.])
    Dbrc_hbrc = 1.1  ###----USER INPUT----###

    Hbrcinputs = HBrcGeoInputs()
    Hbrcinputs.Dbrch = Dbrc_hbrc  ###----USER INPUT----###
    Hbrcinputs.ndiv = 0
    Hbrcinputs.Hbrcmatins = Hbrcmatin
    Hbrcinputs.precalc = True  #This can be set to true if we want Hbrace to be set=Xbrace top D and t, in which case the above set Dbrch and tbrch would be overwritten
    #______________________________________________#

    #TP data

    #Note PrebuildTPLvl is set in JacketIns				           ###----USER INPUT----###
    #TP lumped mass data
    TPlumpinputs = TPlumpMass()  ###----ALL USER INPUT----###
    TPlumpinputs.mass = 666.e3  #-98385.33+( 7850.*4*np.pi/4.*(1.2**2-(1.2-2.*0.04)**2)*4)  #[kg]  TO MODIFY AFTER WE ASSESS OVERALL TP MASS, to be reduced for the steel weight
    TPlumpinputs.CMoff = np.array([
        0., 0., 2.
    ])  #CG of concrete block is 2 m above intersection of diagonal braces
    TPlumpinputs.I = 1. / 12 * TPlumpinputs.mass * np.array(
        [8.**2 + 4.**2, 8.**2 + 4.**2, 8.**2 + 8.**2, 0., 0., 0.])

    TPstrtmatin = MatInputs()
    TPstmpsmatin = MatInputs()
    TPgirdmatin = MatInputs()
    TPbrcmatin = MatInputs()
    TPstemmatin = MatInputs()
    TPstmpsmatin.matname = np.array(['steel'])
    TPstmpsmatin.rho = np.array([7850.])

    TPstrtmatin.matname = np.array(['steel'])
    TPstrtmatin.rho = np.array([1350.])
    TPbrcmatin.matname = np.array(['steel'])
    TPbrcmatin.rho = np.array(
        [1350.]
    )  #np.array([7850.]) tpstrucmass=np.pi/4*(1.2**2-(1.2-2*0.04)**2)*7850*4*4 7850.*tpstrucmass/myjckt.TP.TPouts.mass=1462.185
    TPgirdmatin.matname = np.array(['steel'])
    TPgirdmatin.rho = np.array([1350.])
    TPstemmatin.matname = np.array(['steel'
                                    ]).repeat(2)  ###----ALL USER INPUT----###
    TPstemmatin.rho = np.array([1350.])

    TPinputs = TPGeoInputs()
    TPinputs.TPstrtmatins = TPstrtmatin
    TPinputs.TPbrcmatins = TPbrcmatin
    TPinputs.TPstemmatins = TPstemmatin
    TPinputs.TPstmpmatins = TPstmpsmatin
    TPinputs.TPgirdmatins = TPgirdmatin

    #Set TP dimensions as leg and brace dimensions
    TPinputs.Dstrut = 1.2  ###----ALL USER INPUT----###
    TPinputs.tstrut = 0.04
    TPinputs.Dgir = TPinputs.Dstrut
    TPinputs.tgir = TPinputs.tstrut
    TPinputs.Dbrc = TPinputs.Dstrut
    TPinputs.tbrc = TPinputs.tstrut
    ###----ALL USER INPUT----###
    TPinputs.hstump = 0.499  #(16.15-15.651)
    TPinputs.Dstump = 1.2
    TPinputs.tstump = 0.04

    TPinputs.stumpndiv = 1
    TPinputs.brcndiv = 1
    TPinputs.girndiv = 1
    TPinputs.strutndiv = 1
    TPinputs.stemndiv = 1
    TPinputs.nstems = 3
    TPinputs.Dstem = np.array([5.6]).repeat(TPinputs.nstems)
    TPinputs.tstem = np.array([0.032, 0.032, 0.032])
    TPinputs.hstem = np.array([(4.) / TPinputs.nstems]).repeat(TPinputs.nstems)
    #______________________________________________#

    #Tower data
    Twrmatin = MatInputs()
    Twrmatin.matname = np.array(['steel'])
    Twrmatin.rho = np.array([7850.])

    Twrinputs = TwrGeoInputs()
    Twrinputs.Twrmatins = Twrmatin
    #Twrinputs.Htwr=88.15  #Trumped by HH
    Twrinputs.Htwr2frac = 1. / 88.15  #fraction of tower height with constant x-section
    Twrinputs.ndiv = np.array([
        1, 1
    ])  #ndiv for uniform and tapered section			   ###----USER INPUT----###
    Twrinputs.DeltaZmax = 5.  #[m], maximum FE element length allowed in the tower members (i.e. the uniform and the tapered members)
    Twrinputs.Db = 5.6
    Twrinputs.DTRb = Twrinputs.Db / 0.032
    Twrinputs.Dt = 4.
    Twrinputs.DTRt = Twrinputs.Dt / 0.03
    #Set whether or not DTRb and DTRt for the tower are the same. Note if next set to False it will trump DTRt setting above
    Twrinputs.DTRsdiff = True  ##SET THIS TO TRUE IF YOU WANT DTRs to be different between base and top

    #If you use the following 12 lines, The geometry defined above is ignored
    ztwr = np.array([
        20.15, 21.15, 32.15, 42.15, 54.15, 64.15, 74.15, 83.15, 88.15
    ]) - 20.15
    Dtwr = np.array([5.6, 5.577, 5.318, 5.082, 4.8, 4.565, 4.329, 4.118, 4])
    ttwr = np.array(
        [0.032, 0.032, 0.03, 0.028, 0.024, 0.022, 0.02, 0.03, 0.03])
    pmtwr = np.array(
        [np.array([20.15, 54.15, 88.15]) - 20.15,
         [1.9e3, 1.4e3, 1.0e3]]).T  #(3,2) first col z's, second weights
    #Interpolate data to refine tower discretization
    dz = 1.  #[m] maximum deltaz allowed in discretization
    ztwr2 = np.linspace(ztwr[0], ztwr[-1], round(
        (ztwr[-1] - ztwr[0]) / dz))  #New discretization
    Dtwr_interp = interp1d(ztwr, Dtwr)
    ttwr_interp = interp1d(ztwr, ttwr)
    Twrinputs.ztwr = ztwr2
    Twrinputs.Dtwr = Dtwr_interp(ztwr2)
    Twrinputs.ttwr = ttwr_interp(ztwr2)
    Twrinputs.TwrlumpedMass = np.zeros([pmtwr.shape[0], 11])
    Twrinputs.TwrlumpedMass[:, 0:2] = pmtwr

    TwrRigidTop = False  #False=Account for RNA via math rather than a physical rigidmember
    #______________________________________________#

    #RNA data
    RNAins = RNAprops()
    RNAins.mass = 350.e3  #[kg]
    RNAins.I[0] = 86.579E+6  #[kg m2]
    RNAins.I[1] = 53.530E+6  #[kg m2]
    RNAins.I[2] = 58.112E+6  #[kg m2]
    RNAins.CMoff[2] = 2.34  #[m]
    RNAins.Thoff[2] = 2.4  #[m]
    RNAins.yawangle = 45.  #angle with respect to global X, CCW looking from above, wind from left
    RNAins.rna_weightM = True
    #______________________________________________#

    #RNA loads              Fx-z,         Mxx-zz
    RNA_F = np.array(
        [1000.e3, 0., 0., 0., 0., 0.]
    )  #unfactored thrust, though accounting for gust and dynamic effects (no IEC PSF though)
    #______________________________________________#

    # Frame3DD parameters           									      ###----ALL USER INPUT----###
    FrameAuxIns = Frame3DDaux()
    FrameAuxIns.sh_fg = 1  #shear flag-->Timoshenko
    FrameAuxIns.deltaz = 5.
    FrameAuxIns.geo_fg = 0
    FrameAuxIns.nModes = 6  # number of desired dynamic modes of vibration
    FrameAuxIns.Mmethod = 1  # 1: subspace Jacobi     2: Stodola
    FrameAuxIns.lump = 0  # 0: consistent mass ... 1: lumped mass matrix
    FrameAuxIns.tol = 1e-9  # mode shape tolerance
    FrameAuxIns.shift = 0.0  # shift value ... for unrestrained structures
    FrameAuxIns.gvector = np.array([0., 0., -9.8065])  #GRAVITY

    #Decide whether or not to consider DLC 6.1 as well
    twodlcs = False

    #______________________________________________#
    #______________________________________________#

    # OTHER AUXILIARY CONSTRAINTS AND TARGETS FOR OPTIMIZATION #
    #______________________________________________#
    #______________________________________________#

    #Set Optimization Bounds and guesses for the various variables:
    #          x=  [ batter,  Dpile,    tpile,        Lp,   Dleg,     tleg,       Dbrc,   tbrc,     Dbrc_mud,   tbrc_mud,   Dgit,      tgir,      Db,   DTRb   Dt,   DTRt   Htwr2fac        dck_widthfact]
    MnCnst = np.array([
        8., 1., 1. * 0.0254, 20., 1., 1. * 0.0254, 1., 1. * 0.0254, 1.,
        1. * 0.0254, 1., 1. * 0.0254, 5., 120., 3., 120., 0.05, 2.
    ])
    MxCnst = np.array([
        15., 2.5, 5. * 0.0254, 50., 2.5, 5. * 0.0254, 2., 5. * 0.0254, 2.,
        5. * 0.0254, 2., 5. * 0.0254, 7., 200., 4., 200., 0.25, 3.
    ])
    guesses = np.array([
        10., 1.5, 1.5 * 0.0254, 26., 1.8, 1.5 * 0.0254, 1.2, 1.5 * 0.0254, 1.2,
        1.5 * 0.0254, 1.2, 1.5 * 0.0254, 6., 140., 3.5, 150., 0.2, 2.
    ])

    #SET Maximum Footprint [m]
    mxftprint = 30.

    #Set target frequency [Hz] and f0epsilon, i.e. fmax=(1+f0eps)*f0
    f0 = 0.22
    f0epsilon = 0.1

    #Set the minminimum DTR allowed for jacket members; mostly for 60+waterdepths
    jcktDTRmin = 22.

    #_____________________________________________________________#
    #________________ DO NOT MODIFY THE FOLLOWING ________________#
    #_____________________________________________________________#

    bounds = np.vstack((MnCnst, MxCnst))
    desvarmeans = np.mean(bounds, 1)

    # Now Launch the assembly and pass all of the inputs
    #myjckt=set_as_top(JacketSE(Jcktins.clamped,Jcktins.AFflag,twodlcs=twodlcs, wlevel_Ulist=29))#CJB and JQ
    myjckt = set_as_top(
        JacketSE(Jcktins.clamped, Jcktins.AFflag, twodlcs=twodlcs))
    #pySubDyn Parameters CJB+
    #SDpySubDynA = pySubDynA()

    #INPUTS TO RUN SUBDYN-------------------------------------------------------
    #(PATH INFORMATION FOR INPUT FILE AND DRIVER)

    Base_name = "OC4_pySubDyn"  #Input name here

    #INPUT FILE PATH
    myjckt.InputFile_name = str(Base_name) + ".txt"
    #myjckt.SDpySubDynA.InputFile_name=str(Base_name)+".txt"
    myjckt.InputandDriverpath = "C:\wisdem\plugins\JacketSE\src\jacketse\SubDyn\CertTest"
    myjckt.InputFile_path = myjckt.InputandDriverpath + os.sep + str(
        myjckt.InputFile_name)

    #DRIVER PATH
    myjckt.Driver_name = str(Base_name) + "D" + ".txt"
    myjckt.Driver_path = myjckt.InputandDriverpath + os.sep + str(
        myjckt.Driver_name)
    myjckt.Driver_path = myjckt.InputandDriverpath + os.sep + str(
        myjckt.Driver_name)

    #PATH TO RUN SUBDYN
    SDEXEpath = "C:\wisdem\plugins\JacketSE\src\jacketse\SubDyn" + os.sep + "bin\SubDyn_Win32.exe"
    myjckt.SDpath = str(SDEXEpath) + ' ' + str(myjckt.Driver_path)
    #test.SDpath='r'+"'''"+test.SDEXEpath+' '+test.SDDriverpath+"'''"

    #PATH TO READ OUTPUT (INPUTS TO READ OUTPUT)
    myjckt.Readpath_out = str(
        myjckt.InputandDriverpath) + os.sep + str(Base_name) + ".SD.out"
    myjckt.Readpath_sum = str(
        myjckt.InputandDriverpath) + os.sep + str(Base_name) + ".SD.sum"
    myjckt.Delete_file = False  #Deletes driver, input, and output files. Does not delete Echo file.

    #INPUT FILE INPUTS----------------------------------------------------------

    #Simulation Control
    myjckt.Echo = np.array(
        [False, "Echo", "- Echo input data to "
         "<rootname>.SD.ech"
         " (flag)"])
    myjckt.SDdeltaT = np.array([
        "DEFAULT", "SDdeltaT", "- Local Integration Step. If "
        "default"
        ", the glue-code integration step will be used."
    ])
    myjckt.IntMethod = np.array(
        [4, "IntMethod", "- Integration Method [1/2/3/4 = RK4/AB4/ABM4/AM2]."])
    myjckt.SttcSolve = np.array([
        False, "SttcSolve", "- Solve dynamics about static equilibrium point"
    ])

    #FEA and CRAIG-BAMPTON PARAMETERS
    myjckt.FEMmod = np.array([
        3,
        "- FEM switch: element model in the FEM. [1= Euler-Bernoulli(E-B);  2=Tapered E-B (unavailable);  3= 2-node Timoshenko;  4= 2-node tapered Timoshenko (unavailable)]"
    ])
    myjckt.NDiv = np.array(
        [1, "NDiv", "- Number of sub-elements per member"]
    )  #CJB "HARDWIRED" INTO PYSUBDYN AS 1 TO ALLOW JACKETSE'S NODES TO BE USED AS SUBDYN'S JOINTS
    myjckt.CBMod = np.array([
        False,
        "- [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."
    ])
    myjckt.Nmodes = np.array([
        75,
        "- Number of internal modes to retain (ignored if CBMod=False). If Nmodes=0 --> Guyan Reduction."
    ])
    myjckt.JDampings = np.array([
        2, "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)."
    ])

    #Structure Joints
    myjckt.SDjointsHeader = np.array([[
        'JointID', 'JointXss', 'JointYss', 'JointZss',
        '[Coordinates of Member joints in SS-Coordinate System]'
    ], ['(-)', '(m)', '(m)', '(m)']])

    #Base Reaction Joints
    myjckt.BaseRxnJointsHeader = np.array([[
        'RJointID', 'RctTDXss', 'RctTDYss', 'RctTDZss', 'RctRDXss', 'RctRDYss',
        'RctRDZss', '[Global Coordinate System]'
    ], ['(-)', ('flag'), ('flag'), ('flag'), ('flag'), ('flag'), ('flag')]])

    #Interface Joints
    myjckt.InterfaceRxnJointsHeader = np.array([[
        'IJointID', 'ItfTDXss', 'ItfTDYss', 'ItfTDZss', 'ItfRDXss', 'ItfRDYss',
        'ItfRDZss', '[Global Coordinate System]'
    ], ['(-)', ('flag'), ('flag'), ('flag'), ('flag'), ('flag'), ('flag')]])

    #Members
    myjckt.MembersHeader = np.array([[
        'MemberID', 'MJointID1', 'MJointID2', 'MPropSetID1', 'MPropSetID2',
        'COSMID'
    ], ['(-)', '(-)', '(-)', '(-)', '(-)', '(-)']])

    #MEMBER X-SECTION PROPERTY data 1/2
    myjckt.NPropSets = np.array([
        6, 'NPropSets',
        '- # of structurally unique x-sections (i.e. # of X-sectional props utilized throughout all of the members)'
    ])
    myjckt.PropSet1Header = np.array(
        [['PropSetID', 'YoungE', 'ShearG', 'MatDens', 'XsecD', 'XsecT'],
         ['(-)', '(N/m2)', '(N/m2)', '(kg/m3)', '(m)', '(m)']])

    #MEMBER X-SECTION PROPERTY data 2/2
    myjckt.PropSet2 = np.array([])
    myjckt.PropSet2Header = np.array([[
        "PropSetID", "YoungE", "ShearG", "MatDens", "XsecA", "XsecAsx",
        "XsecAsy", "XsecJxx", "XsecJyy", "XsecJ0"
    ],
                                      [
                                          "(-)", "(N/m2)", "(N/m2)", "(kg/m3)",
                                          "(m2)", "(m2)", "(m2)", "(m4)",
                                          "(m4)", "(m4)"
                                      ]])

    #MEMBER COSINE MATRICES COSM(i,j)
    myjckt.COSMHeader = np.array([[
        "COSMID", "COSM11", "COSMID12", "COSMID13", "COSMID21", "COSMID22",
        "COSMID23", "COSMID31", "COSMID32", "COSMID33"
    ], ["(-)", "(-)", "(-)", "(-)", "(-)", "(-)", "(-)", "(-)", "(-)", "(-)"]])
    myjckt.COSMs = np.array([])

    #JOINT ADDITIONAL CONCENTRATED MASSES
    myjckt.CmassHeader = np.array(
        [["CMJointID", "JMass", "JMXX", "JMYY", "JMZZ"],
         ["(-)", "(kg)", "(kg*m^2)", "(kg*m^2)", "(kg*m^2)"]])
    myjckt.Cmass = np.array([])

    #OUTPUT: SUMMARY & OUTFILE
    myjckt.SSSum = np.array([
        True, "SSSum",
        "- Output a Summary File (flag).It contains: matrices K,M  and C-B reduced M_BB, M-BM, K_BB, K_MM(OMG^2), PHI_R, PHI_L. It can also contain COSMs if requested."
    ])
    myjckt.OutCOSM = np.array([
        True, "OutCOSM",
        "- Output cosine matrices with the selected output member forces (flag)"
    ])
    myjckt.OutAll = np.array(
        [True, "OutAll", "- [T/F] Output all members' end forces "])
    myjckt.OutSwtch = np.array([
        1, "OutSwtch",
        "- [1/2/3] Output requested channels to: 1=<rootname>.SD.out;  2=<rootname>.out (generated by FAST);  3=both files."
    ])
    myjckt.TabDelim = np.array([
        True, "TabDelim",
        "- Generate a tab-delimited output in the <rootname>.SD.out file"
    ])
    myjckt.OutDec = np.array(
        [1, "OutDec", "- Decimation of output in the <rootname>.SD.out file"])
    myjckt.OutFmt = np.array([
        "Es11.4e2", "OutFmt",
        "- Output format for numerical results in the <rootname>.SD.out file"
    ])
    myjckt.OutSFmt = np.array([
        "A11", "OutFmt",
        "- Output format for header strings in the <rootname>.SD.out file"
    ])

    #MEMBER OUTPUT LIST
    myjckt.MemOutListHeader=np.array([['MemberID','NoutCnt','NodeCnt','[NOutCnt=how many nodes to get output for [< 10]; NodeCnt are local ordinal numbers from the start of the member, and must be >=1 and <= NDiv+1] If NMOutputs=0 leave blank as well.]'],\
                                           ['(-)','(-)','(-)']])

    #SSOutline
    myjckt.SSOutlist=np.array([["ReactFXss, ReactFYss, ReactFZss, ReactMXss, ReactMYss, ReactMZss",'-Base reactions (forces onto SS structure)'],\
                    ["IntfFXss,  IntfFYss,  IntfFZss,  IntfMXss, IntfMYss, IntfMZss",'-Interface reactions (forces from SS structure)'],\
                    ["IntfTDXss,  IntfTDYss,  IntfTDZss,  IntfRDXss, IntfRDYss, IntfRDZss",'-Interface deflections '],\
                    ["IntfTAXss,  IntfTAYss,  IntfTAZss,  IntfRAXss, IntfRAYss, IntfRAZss",'Interface accelerations']])

    myjckt.SDjoints=np.array([[1, -5.93900, -5.93900, -43.12700],\
                            [2, 5.93900, -5.93900, -43.12700],\
                            [3, 5.93900, 5.93900, -43.12700],\
                            [4, -5.93900, 5.93900, -43.12700],\
                            [5, -4.01600, -4.01600, 15.65100],\
                            [6, 4.01600, -4.01600, 15.65100],\
                            [7, 4.01600, 4.01600, 15.65100],\
                            [8, -4.01600, 4.01600, 15.65100],\
                            [9, 0.00000, -4.79180, -8.06090],\
                            [10, 4.79180, 0.00000, -8.06090],\
                            [11, 0.00000, 4.79180, -8.06090],\
                            [12, -4.79180, 0.00000, -8.06090]])

    myjckt.BaseRxnJoints=np.array([[1,1,1,1,1,1,1],\
                                 [2,1,1,1,1,1,1],\
                                 [3,1,1,1,1,1,1],\
                                 [4,1,1,1,1,1,1]])

    myjckt.InterfaceJointsFlags=np.array([[5,1,1,1,1,1,1],\
                                   [6,1,1,1,1,1,1],\
                                   [7,1,1,1,1,1,1],\
                                   [8,1,1,1,1,1,1]])

    myjckt.Members=np.array([[1, 1, 5, 2, 2],\
                            [2, 2, 6, 2, 2],\
                            [3, 3, 7, 2, 2],\
                            [4, 4, 8, 2, 2],\
                            [5, 1, 9, 3, 3],\
                            [6, 9, 6, 3, 3],\
                            [7, 5, 9, 3, 3],\
                            [8, 9, 2, 3, 3],\
                            [9, 2, 10, 3, 3],\
                            [10, 10, 7, 3, 3],\
                            [11, 6, 10, 3, 3],\
                            [12, 10, 3, 3, 3],\
                            [13, 3, 11, 3, 3],\
                            [14, 11, 8, 3, 3],\
                            [15, 7, 11, 3, 3],\
                            [16, 11, 4, 3, 3],\
                            [17, 4, 12, 3, 3],\
                            [18, 12, 5, 3, 3],\
                            [19, 8, 12, 3, 3],\
                            [20, 12, 1, 3, 3],\
                            [21, 5, 6, 3, 3],\
                            [22, 6, 7, 3, 3],\
                            [23, 7, 8, 3, 3],\
                            [24, 8, 5, 3, 3]])

    myjckt.MemOutList = np.array([[1, 2, 1, 2]])

    #DRIVER INPUTS--------------------------------------------------------------

    myjckt.EchoD = np.array(
        [True, "Echo", "- Echo the input file data (flag)"])

    #Environmental Conditions
    myjckt.Gravity = np.array([9.81, "Gravity", "- Gravity (m/s^2)"])
    myjckt.WtrDpth = np.array(
        [43.127, "WtrDpth", "- Water Depth (m) positive value"])

    #SubDyn
    myjckt.SDInputFile = np.array([myjckt.InputFile_path, "SDInputFile"])
    myjckt.OutRootName = np.array([
        str(myjckt.InputandDriverpath) + os.sep + str(Base_name), "OutRootName"
    ])
    myjckt.NSteps = np.array(
        [600, "NSteps", "- Number of time steps in the simulations (-)"])
    myjckt.TimeInterval = np.array(
        [0.005, "TimeInterval", "- TimeInterval for the simulation (sec)"])
    myjckt.TP_RefPoint = np.array([
        0.0, 0.0, 18.15, "TP_RefPoint",
        "- Location of the TP reference point in global coordinates (m)"
    ])
    myjckt.SubRotateZ = np.array([
        0.0, "SubRotateZ",
        "- Rotation angle of the structure geometry in degrees about the global Z axis."
    ])

    #INPUTS
    myjckt.InputsMod = np.array([
        1, "InputsMod",
        "- Inputs model {0: all inputs are zero for every timestep, 1: steadystate inputs, 2: read inputs from a file (InputsFile)} (switch)"
    ])
    myjckt.InputsFile = np.array(
        ['""', "InputsFile", "- Name of the inputs file if InputsMod = 2"])

    #STEADY INPUTS
    myjckt.uTPInSteady = np.array([
        0.1, 0.0, 0.0, 0.0, 0.0, 0.0, "uTPInSteady",
        "- input displacements and rotations ( m, rads )"
    ])
    myjckt.uDotTPInSteady = np.array([
        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, "uDotTPInSteady",
        "- input translational and rotational velocities ( m/s, rads/s)"
    ])
    myjckt.uDotDotTPInSteady = np.array([
        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, "uDotDotTPInSteady",
        "- input translational and rotational accelerations ( m/s^2, rads/s^2)"
    ])

    #myjckt.SDpySubDynA.run()
    myjckt.JcktGeoIn = Jcktins
    myjckt.Soilinputs = Soilinputs
    myjckt.Waterinputs = Waterinputs
    myjckt.Windinputs = Windinputs
    myjckt.Pileinputs = Pileinputs
    myjckt.leginputs = leginputs
    myjckt.legbot_stmphin = legbot_stmphin  #Distance from bottom of leg to second joint along z; must be>0
    myjckt.Xbrcinputs = Xbrcinputs
    myjckt.Mbrcinputs = Mbrcinputs
    myjckt.Hbrcinputs = Hbrcinputs
    myjckt.TPlumpinputs = TPlumpinputs
    myjckt.TPinputs = TPinputs

    myjckt.Twrinputs = Twrinputs
    myjckt.TwrRigidTop = TwrRigidTop  #Account for RNA via math rather than a physical rigidmember
    myjckt.RNAinputs = RNAins
    myjckt.RNA_F = RNA_F

    myjckt.FrameAuxIns = FrameAuxIns

    return myjckt, f0, f0epsilon, jcktDTRmin, mxftprint, guesses, bounds.T
def main(): #\
    """Function to Instantiate a JacketSE Assembly: \n
       INPUTS \n
             All hardwired, so edit the quantities below all the way to the line "#________________ DO NOT MODIFY THE FOLLOWING ________________#" \n
             -See JacketOpt_PyOPT for more information. \n
       OUTPUTS \n
             myjckt -jacket assembly instance \n\n

             Optimization parameters:    \n\n

             f0          -float, target frequency [Hz]
             f0epsilon   -float,  f0*(1+f0epsilon) will not be exceeded \n
             DTRsdiff    -Boolean,     Set this to True if DTRs are to be different between base and top. \n
             jcktDTRmin  -Float, minimum jacket member DTR allowed, mostly for 60+waterdepths. \n
             mxftprint   -Float, max allowed foot print [m]
             guesses     -Float(n), guesses for all design variables check out DesVar class. \n
             bounds      -Float(n,2), bounds for all design variables check out DesVar class. \n\n
             SAMPLE CALLS: \n
             1.OPTIMIZATION: python JacketOpt_ExtCobyla.py C:\RRD\PYTHON\WISDEM\JacketSE\src\jacketse\MyJacketInputs.py \n
             2.OPTIMIZATION: python JacketOpt_PyOPT.py C:\RRD\PYTHON\WISDEM\JacketSE\src\jacketse\MyJacketInputs.py True \n
             3.BUILD JACKET: python >>> myjacket=C:\RRD\PYTHON\WISDEM\JacketSE\src\jacketse\MyJacketInputs.py \n
        """

    #Set inputs							     ###----ALL USER INPUT----###
    Jcktins=JcktGeoInputs()

    Jcktins.nlegs =4
    Jcktins.nbays =4
    Jcktins.batter=30.5495 #=(-43.127+24.614)/(5.939-5.333)
    Jcktins.dck_botz =15.651
    Jcktins.dck_width= 8.+1.2
    Jcktins.weld2D   = 0.
    Jcktins.VPFlag = True    #vertical pile T/F;  to enable piles in frame3DD set pileinputs.ndiv>0
    Jcktins.clamped= True    #whether or not the bottom of the structure is rigidly connected. Use False when equivalent spring constants are being used.
    Jcktins.AFflag = False  #whether or not to use apparent fixity piles
    Jcktins.PreBuildTPLvl = 0  #if >0, the TP is prebuilt according to rules per PreBuildTP

    #______________________________________________#

    #Soil inputs
    Soilinputs=SoilGeoInputs()
    Soilinputs.zbots   =-np.array([3.,5.,7.,15.,30.,50.])
    Soilinputs.gammas  =np.array([10000.,10000.,10000.,10000.,10000.,10000.])
    Soilinputs.cus     =np.array([60000.,60000.,60000.,60000.,60000.,60000.])
    Soilinputs.phis    =np.array([26.,26.,26.,26.,26.,26])#np.array([36.,33.,26.,37.,35.,37.5])#np.array([36.,33.,26.,37.,35.,37.5])
    Soilinputs.delta   =25.
    Soilinputs.sndflg   =True
    Soilinputs.PenderSwtch   =False #True
    Soilinputs.SoilSF   =1.
    #______________________________________________#

    #Water and wind inputs
    Waterinputs=WaterInputs()
    Waterinputs.wdepth   =50.
    Waterinputs.wlevel   =50. #Distance from bottom of structure to surface  THIS, I believe is no longer needed as piles may be negative in z, to check and remove in case
    Waterinputs.T=12.  #Wave Period
    Waterinputs.HW=10. #Wave Height
    Waterinputs.Cd=3.  #Drag Coefficient, enhanced to account for marine growth and other members not calculated
    Waterinputs.Cm=8.#2.  #ADded mass Coefficient

    Windinputs=WindInputs()
    Windinputs.HH=88.15+2.4 #CHECK HOW THIS COMPLIES....
    Windinputs.U50HH=30. #assumed gust speed
    Windinputs.Cdj=4.  #Drag Coefficient for jacket members, enhanced to account for TP drag not calculated otherwise
    Windinputs.Cdt=2  #Drag Coefficient for tower, enhanced to account for TP drag not calculated otherwise
    #______________________________________________#

    #Pile data
    Pilematin=MatInputs()
    Pilematin.matname=np.array(['RC'])
    Pilematin.E=np.array([ 2.1e11])
    Pilematin.G=np.array([8.07690e+10])
    Pilematin.rho=np.array([3339.12]) *34274.82/36876.   #From Test04.txt in SD, to check with official FAST certtest

    Pileinputs=PileGeoInputs()
    Pileinputs.Pilematins=Pilematin
    Pileinputs.ndiv=1 #3			   ###----USER INPUT----###
    Pileinputs.Dpile=2.082
    Pileinputs.tpile=0.491
    Pileinputs.AFflag=False			   ###----USER INPUT----###
    Pileinputs.Lp=0. #[m] Embedment length
    #______________________________________________#

    #Legs data
    legmatin=MatInputs()
    legmatin.matname=(['steel'])
    legmatin.rho=np.array([7850.])
    Dleg=np.asarray([1.2]).repeat(Jcktins.nbays+1)                      #e.g., np.array([2.0,1.8,1.6,1.6,1.6])
    tleg=np.asarray([0.05,0.05,0.035,0.035,0.035])

    leginputs=LegGeoInputs()
    leginputs.legZbot   = 4.5		 ###----USER INPUT----###
    leginputs.ndiv=1     			 ###----USER INPUT----###
    leginputs.legmatins=legmatin
    leginputs.Dleg=Dleg
    leginputs.tleg=tleg


    #The following is a passthrough variables
    legbot_stmphin =(45.5-43.127)  #=2.373 Distance from bottom of leg to second joint along z; must be>0
    #______________________________________________#

    #Xbrc data
    Xbrcmatin=MatInputs()
    Xbrcmatin.matname=np.array(['steel']).repeat(Jcktins.nbays)
    Xbrcmatin.rho=np.array([7850.])

    Dbrc=np.asarray([0.8]).repeat(Jcktins.nbays)
    tbrc=np.asarray([0.02]).repeat(Jcktins.nbays)

    Xbrcinputs=XBrcGeoInputs()
    Xbrcinputs.Dbrc=Dbrc
    Xbrcinputs.tbrc=tbrc
    Xbrcinputs.ndiv=1				 ###----USER INPUT----###
    Xbrcinputs.Xbrcmatins=Xbrcmatin
    Xbrcinputs.precalc=False   #This can be set to true if we want Xbraces to be precalculated in D and t, in which case the above set Dbrc and tbrc would be overwritten
    #______________________________________________#

    #Mbrc data
    Mbrcmatin=MatInputs()
    Mbrcmatin.matname=np.array(['steel'])
    Mbrcmatin.rho=np.array([7850.])

    Mbrcinputs=MudBrcGeoInputs()
    Mbrcinputs.Dbrc_mud=0.8                  ###----USER INPUT----###
    Mbrcinputs.tbrc_mud=0.02
    Mbrcinputs.ndiv=2					    ###----USER INPUT----###
    Mbrcinputs.Mbrcmatins=Mbrcmatin
    Mbrcinputs.precalc=False   #This can be set to true if we want Mudbrace to be precalculated in D and t, in which case the above set Dbrc_mud and tbrc_mud would be overwritten
    #______________________________________________#

    #Hbrc data
    Hbrcmatin=MatInputs()
    Hbrcmatin.matname=np.array(['steel'])
    Hbrcmatin.rho=np.array([7850.])
    Dbrc_hbrc=1.1				           ###----USER INPUT----###

    Hbrcinputs=HBrcGeoInputs()
    Hbrcinputs.Dbrch=Dbrc_hbrc					   ###----USER INPUT----###
    Hbrcinputs.ndiv=0
    Hbrcinputs.Hbrcmatins=Hbrcmatin
    Hbrcinputs.precalc=True   #This can be set to true if we want Hbrace to be set=Xbrace top D and t, in which case the above set Dbrch and tbrch would be overwritten
    #______________________________________________#

    #TP data


    #Note PrebuildTPLvl is set in JacketIns				           ###----USER INPUT----###
    #TP lumped mass data
    TPlumpinputs=TPlumpMass()						      ###----ALL USER INPUT----###
    TPlumpinputs.mass = 666.e3#-98385.33+( 7850.*4*np.pi/4.*(1.2**2-(1.2-2.*0.04)**2)*4)  #[kg]  TO MODIFY AFTER WE ASSESS OVERALL TP MASS, to be reduced for the steel weight
    TPlumpinputs.CMoff= np.array([0.,0.,2.]) #CG of concrete block is 2 m above intersection of diagonal braces
    TPlumpinputs.I    = 1./12*TPlumpinputs.mass*np.array([8.**2+4.**2,8.**2+4.**2,8.**2+8.**2,0.,0.,0.])

    TPstrtmatin=MatInputs()
    TPstmpsmatin=MatInputs()
    TPgirdmatin=MatInputs()
    TPbrcmatin=MatInputs()
    TPstemmatin=MatInputs()
    TPstmpsmatin.matname=np.array(['steel'])
    TPstmpsmatin.rho=np.array([7850.])

    TPstrtmatin.matname=np.array(['steel'])
    TPstrtmatin.rho=np.array([1350.])
    TPbrcmatin.matname=np.array(['steel'])
    TPbrcmatin.rho=np.array([1350.])#np.array([7850.]) tpstrucmass=np.pi/4*(1.2**2-(1.2-2*0.04)**2)*7850*4*4 7850.*tpstrucmass/myjckt.TP.TPouts.mass=1462.185
    TPgirdmatin.matname=np.array(['steel'])
    TPgirdmatin.rho=np.array([1350.])
    TPstemmatin.matname=np.array(['steel']).repeat(2) ###----ALL USER INPUT----###
    TPstemmatin.rho=np.array([1350.])

    TPinputs=TPGeoInputs()
    TPinputs.TPstrtmatins=TPstrtmatin
    TPinputs.TPbrcmatins=TPbrcmatin
    TPinputs.TPstemmatins=TPstemmatin
    TPinputs.TPstmpmatins=TPstmpsmatin
    TPinputs.TPgirdmatins=TPgirdmatin

    #Set TP dimensions as leg and brace dimensions
    TPinputs.Dstrut=1.2				    ###----ALL USER INPUT----###
    TPinputs.tstrut=0.04
    TPinputs.Dgir=TPinputs.Dstrut
    TPinputs.tgir=TPinputs.tstrut
    TPinputs.Dbrc=TPinputs.Dstrut
    TPinputs.tbrc=TPinputs.tstrut
							     ###----ALL USER INPUT----###
    TPinputs.hstump=0.499#(16.15-15.651)
    TPinputs.Dstump=1.2
    TPinputs.tstump=0.04

    TPinputs.stumpndiv=1
    TPinputs.brcndiv=1
    TPinputs.girndiv=1
    TPinputs.strutndiv=1
    TPinputs.stemndiv=1
    TPinputs.nstems=3
    TPinputs.Dstem=np.array([5.6]).repeat(TPinputs.nstems)
    TPinputs.tstem=np.array([0.032,0.032,0.032])
    TPinputs.hstem=np.array([(4.)/TPinputs.nstems]).repeat(TPinputs.nstems)
    #______________________________________________#

    #Tower data
    Twrmatin=MatInputs()
    Twrmatin.matname=np.array(['steel'])
    Twrmatin.rho=np.array([7850.])

    Twrinputs=TwrGeoInputs()
    Twrinputs.Twrmatins=Twrmatin
    #Twrinputs.Htwr=88.15  #Trumped by HH
    Twrinputs.Htwr2frac=1./88.15  #fraction of tower height with constant x-section
    Twrinputs.ndiv=np.array([1,1])  #ndiv for uniform and tapered section			   ###----USER INPUT----###
    Twrinputs.DeltaZmax= 5. #[m], maximum FE element length allowed in the tower members (i.e. the uniform and the tapered members)
    Twrinputs.Db=5.6
    Twrinputs.DTRb=Twrinputs.Db/0.032
    Twrinputs.Dt=4.
    Twrinputs.DTRt=Twrinputs.Dt/0.03

        #If you use the following 12 lines, The geometry defined above is ignored
    ztwr=np.array([20.15,21.15,32.15,42.15,54.15,64.15,74.15,83.15,88.15]) -20.15
    Dtwr=np.array([5.6,5.577,5.318,5.082,4.8,4.565,4.329,4.118,4])
    ttwr=np.array([0.032,0.032,0.03,0.028,0.024,0.022,0.02,0.03,0.03])
    pmtwr=np.array([ np.array([20.15,54.15,88.15])-20.15,[1.9e3,1.4e3,1.0e3]]).T  #(3,2) first col z's, second weights
    #Interpolate data to refine tower discretization
    dz=1. #[m] maximum deltaz allowed in discretization
    ztwr2=np.linspace(ztwr[0],ztwr[-1],round((ztwr[-1]-ztwr[0])/dz))   #New discretization
    Dtwr_interp=interp1d(ztwr,Dtwr)
    ttwr_interp=interp1d(ztwr,ttwr)
    Twrinputs.ztwr=ztwr2
    Twrinputs.Dtwr=Dtwr_interp(ztwr2)
    Twrinputs.ttwr=ttwr_interp(ztwr2)
    Twrinputs.TwrlumpedMass=np.zeros([pmtwr.shape[0],11])
    Twrinputs.TwrlumpedMass[:,0:2]=pmtwr

    TwrRigidTop=False           #False=Account for RNA via math rather than a physical rigidmember
    #______________________________________________#

    #RNA data
    RNAins=RNAprops()
    RNAins.mass=350.e3  #[kg]
    RNAins.I[0]=86.579E+6  #[kg m2]
    RNAins.I[1]=53.530E+6  #[kg m2]
    RNAins.I[2]=58.112E+6  #[kg m2]
    RNAins.CMoff[2]=2.34    #[m]
    RNAins.Thoff[2]=2.4     #[m]
    RNAins.yawangle=45.  #angle with respect to global X, CCW looking from above, wind from left
    RNAins.rna_weightM=True
    #______________________________________________#

    #RNA loads              Fx-z,         Mxx-zz
    RNA_F=np.array([1000.e3,0.,0.,0.,0.,0.])   #unfactored thrust, though accounting for gust and dynamic effects (no IEC PSF though)
    #______________________________________________#

    # Frame3DD parameters           									      ###----ALL USER INPUT----###
    FrameAuxIns=Frame3DDaux()
    FrameAuxIns.sh_fg=1               #shear flag-->Timoshenko
    FrameAuxIns.deltaz=5.
    FrameAuxIns.geo_fg=0
    FrameAuxIns.nModes = 6             # number of desired dynamic modes of vibration
    FrameAuxIns.Mmethod = 1            # 1: subspace Jacobi     2: Stodola
    FrameAuxIns.lump = 0               # 0: consistent mass ... 1: lumped mass matrix
    FrameAuxIns.tol = 1e-9             # mode shape tolerance
    FrameAuxIns.shift = 0.0            # shift value ... for unrestrained structures
    FrameAuxIns.gvector=np.array([0.,0.,-9.8065])    #GRAVITY
    #______________________________________________#
    #______________________________________________#

# OTHER AUXILIARY CONSTRAINTS AND TARGETS FOR OPTIMIZATION #
    #______________________________________________#
    #______________________________________________#

    #Set Optimization Bounds and guesses for the various variables:
    #          x=  [ batter,  Dpile,    tpile,        Lp,   Dleg,     tleg,       Dbrc,   tbrc,     Dbrc_mud,   tbrc_mud,   Dgit,      tgir,      Db,   DTRb   Dt,   DTRt   Htwr2fac        dck_widthfact]
    MnCnst = np.array([ 8.,      1.,    1.*0.0254,   20.,   1.,       1.*0.0254,  1.,    1.*0.0254,   1.,     1.*0.0254,      1.,     1.*0.0254,  5.,   120.,  3.,   120.,     0.05,         2.])
    MxCnst = np.array([ 15.,     2.5,   5.*0.0254,   50.,   2.5,      5.*0.0254,  2.,    5.*0.0254,   2.,     5.*0.0254,      2.,     5.*0.0254,  7.,   200.,  4.,   200.,     0.25,         3.])
    guesses= np.array([  10.,    1.5,   1.5*0.0254,  26.,   1.8,     1.5*0.0254,  1.2,   1.5*0.0254,  1.2,    1.5*0.0254,     1.2,    1.5*0.0254, 6.,   140.,  3.5,  150.,     0.2,          2.])

    #SET Maximum Footprint [m]
    mxftprint =30.

    #Set target frequency [Hz] and f0epsilon, i.e. fmax=(1+f0eps)*f0
    f0=0.22
    f0epsilon=0.1

    #Set whether or not DTRb and DTRt for the tower are teh same
    DTRsdiff=True    ##SET THIS TO TRUE IF YOU WANT DTRs to be different between base and top

    #Set the minminimum DTR allowed for jacket members; mostly for 60+waterdepths
    jcktDTRmin=22.

   #_____________________________________________________________#
   #________________ DO NOT MODIFY THE FOLLOWING ________________#
   #_____________________________________________________________#

    bounds=np.vstack((MnCnst,MxCnst))
    desvarmeans=np.mean(bounds,1)


    # Now Launch the assembly and pass all of the inputs

    myjckt=set_as_top(JacketSE(Jcktins.clamped,Jcktins.AFflag,Jcktins.PreBuildTPLvl>0))
    myjckt.JcktGeoIn=Jcktins
    myjckt.Soilinputs=Soilinputs
    myjckt.Waterinputs=Waterinputs
    myjckt.Windinputs=Windinputs
    myjckt.Pileinputs=Pileinputs
    myjckt.leginputs=leginputs
    myjckt.legbot_stmphin =legbot_stmphin  #Distance from bottom of leg to second joint along z; must be>0
    myjckt.Xbrcinputs=Xbrcinputs
    myjckt.Mbrcinputs=Mbrcinputs
    myjckt.Hbrcinputs=Hbrcinputs
    myjckt.TPlumpinputs=TPlumpinputs
    myjckt.TPinputs=TPinputs

    myjckt.Twrinputs=Twrinputs
    myjckt.TwrRigidTop=TwrRigidTop       #Account for RNA via math rather than a physical rigidmember
    myjckt.RNAinputs=RNAins
    myjckt.RNA_F=RNA_F

    myjckt.FrameAuxIns=FrameAuxIns


    return myjckt,f0,f0epsilon,jcktDTRmin,DTRsdiff,mxftprint,guesses,bounds.T
示例#3
0
def main():  # \
    """Function to Instantiate a JacketSE Assembly: \n
       INPUTS \n
             All hardwired, so edit the quantities below all the way to the line "#________________ DO NOT MODIFY THE FOLLOWING ________________#" \n
             -See JacketOpt_PyOPT for more information. \n
       OUTPUTS \n
             myjckt -jacket assembly instance \n\n

             Optimization parameters:    \n\n

             f0          -float, target frequency [Hz]
             f0epsilon   -float,  f0*(1+f0epsilon) will not be exceeded \n
             jcktDTRmin  -Float, minimum jacket member DTR allowed, mostly for 60+waterdepths. \n
             mxftprint   -Float, max allowed foot print [m]
             guesses     -Float(n), guesses for all design variables check out DesVar class. \n
             bounds      -Float(n,2), bounds for all design variables check out DesVar class. \n\n
             SAMPLE CALLS: \n
             1.OPTIMIZATION: python JacketOpt_ExtCobyla.py C:\RRD\PYTHON\WISDEM\JacketSE\src\jacketse\MyJacketInputs.py \n
             2.OPTIMIZATION: python JacketOpt_PyOPT.py C:\RRD\PYTHON\WISDEM\JacketSE\src\jacketse\MyJacketInputs.py True \n
             3.BUILD JACKET: python >>> myjacket=C:\RRD\PYTHON\WISDEM\JacketSE\src\jacketse\MyJacketInputs.py \n
        """

    # Set inputs							     ###----ALL USER INPUT----###
    Jcktins = JcktGeoInputs()

    Jcktins.nlegs = 4
    Jcktins.nbays = 4
    Jcktins.batter = 30.5495  # =(-43.127+24.614)/(5.939-5.333)
    # Jcktins.dck_botz =15.651
    Jcktins.dck_botz = 16.15  # CJBe
    Jcktins.dck_width = 8.0 + 1.2
    Jcktins.weld2D = 0.0
    Jcktins.VPFlag = True  # vertical pile T/F;  to enable piles in frame3DD set pileinputs.ndiv>0
    Jcktins.clamped = (
        True
    )  # whether or not the bottom of the structure is rigidly connected. Use False when equivalent spring constants are being used.
    Jcktins.AFflag = False  # whether or not to use apparent fixity piles
    Jcktins.PreBuildTPLvl = 0  # if >0, the TP is prebuilt according to rules per PreBuildTP

    # ______________________________________________#

    # Soil inputs
    Soilinputs = SoilGeoInputs()
    Soilinputs.zbots = -np.array([3.0, 5.0, 7.0, 15.0, 30.0, 50.0])
    Soilinputs.gammas = np.array([10000.0, 10000.0, 10000.0, 10000.0, 10000.0, 10000.0])
    Soilinputs.cus = np.array([60000.0, 60000.0, 60000.0, 60000.0, 60000.0, 60000.0])
    Soilinputs.phis = np.array(
        [26.0, 26.0, 26.0, 26.0, 26.0, 26]
    )  # np.array([36.,33.,26.,37.,35.,37.5])#np.array([36.,33.,26.,37.,35.,37.5])
    Soilinputs.delta = 25.0
    Soilinputs.sndflg = True
    Soilinputs.PenderSwtch = False  # True
    Soilinputs.SoilSF = 1.0
    # ______________________________________________#

    # Water and wind inputs
    Waterinputs = WaterInputs()

    Waterinputs.wdepth = 50.0
    Waterinputs.wlevel = (
        50.0
    )  # Distance from bottom of structure to surface  THIS, I believe is no longer needed as piles may be negative in z, to check and remove in case
    Waterinputs.T = 12.0  # Wave Period
    Waterinputs.HW = 10.0  # Wave Height
    Waterinputs.Cd = 3.0  # Drag Coefficient, enhanced to account for marine growth and other members not calculated
    Waterinputs.Cm = 8.0  # 2.  #ADded mass Coefficient

    Windinputs = WindInputs()
    Windinputs.HH = 88.15 + 2.4  # CHECK HOW THIS COMPLIES....
    Windinputs.U50HH = 30.0  # assumed gust speed
    Windinputs.Cdj = (
        4.0
    )  # Drag Coefficient for jacket members, enhanced to account for TP drag not calculated otherwise
    Windinputs.Cdt = 2  # Drag Coefficient for tower, enhanced to account for TP drag not calculated otherwise
    # ______________________________________________#

    # Pile data
    Pilematin = MatInputs()
    Pilematin.matname = np.array(["steel"])  # CJB Changed this from RC into steel
    Pilematin.E = np.array([2.1e11])
    Pilematin.G = np.array([8.07690e10])
    Pilematin.rho = (
        np.array([3339.12]) * 34274.82 / 36876.0
    )  # From Test04.txt in SD, to check with official FAST certtest

    Pileinputs = PileGeoInputs()
    Pileinputs.Pilematins = Pilematin
    Pileinputs.ndiv = 0  # CJB Change this from 1 to 0 #3			   ###----USER INPUT----###
    Pileinputs.Dpile = 2.082
    Pileinputs.tpile = 0.491
    Pileinputs.Lp = 0.0  # [m] Embedment length
    # ______________________________________________#

    # Legs data
    legmatin = MatInputs()
    legmatin.matname = ["steel"]
    legmatin.rho = np.array([7850.0])
    Dleg = np.asarray([1.2]).repeat(Jcktins.nbays + 1)  # e.g., np.array([2.0,1.8,1.6,1.6,1.6])
    tleg = np.asarray([0.05, 0.05, 0.035, 0.035, 0.035])

    leginputs = LegGeoInputs()
    leginputs.legZbot = 4.5  ###----USER INPUT----###
    leginputs.ndiv = 1  ###----USER INPUT----###
    leginputs.legmatins = legmatin
    leginputs.Dleg = Dleg
    leginputs.tleg = tleg

    # The following is a passthrough variables
    legbot_stmphin = 45.5 - 43.127  # =2.373 Distance from bottom of leg to second joint along z; must be>0
    # ______________________________________________#

    # Xbrc data
    Xbrcmatin = MatInputs()
    Xbrcmatin.matname = np.array(["steel"]).repeat(Jcktins.nbays)
    Xbrcmatin.rho = np.array([7850.0])

    Dbrc = np.asarray([0.8]).repeat(Jcktins.nbays)
    tbrc = np.asarray([0.02]).repeat(Jcktins.nbays)

    Xbrcinputs = XBrcGeoInputs()
    Xbrcinputs.Dbrc = Dbrc
    Xbrcinputs.tbrc = tbrc
    Xbrcinputs.ndiv = 1  ###----USER INPUT----###
    Xbrcinputs.Xbrcmatins = Xbrcmatin
    Xbrcinputs.precalc = (
        False
    )  # This can be set to true if we want Xbraces to be precalculated in D and t, in which case the above set Dbrc and tbrc would be overwritten
    # ______________________________________________#

    # Mbrc data
    Mbrcmatin = MatInputs()
    Mbrcmatin.matname = np.array(["steel"])
    Mbrcmatin.rho = np.array([7850.0])

    Mbrcinputs = MudBrcGeoInputs()
    Mbrcinputs.Dbrc_mud = 0.8  ###----USER INPUT----###
    Mbrcinputs.tbrc_mud = 0.02
    Mbrcinputs.ndiv = 2  ###----USER INPUT----###
    Mbrcinputs.Mbrcmatins = Mbrcmatin
    Mbrcinputs.precalc = (
        False
    )  # This can be set to true if we want Mudbrace to be precalculated in D and t, in which case the above set Dbrc_mud and tbrc_mud would be overwritten
    # ______________________________________________#

    # Hbrc data
    Hbrcmatin = MatInputs()
    Hbrcmatin.matname = np.array(["steel"])
    Hbrcmatin.rho = np.array([7850.0])
    Dbrc_hbrc = 1.1  ###----USER INPUT----###

    Hbrcinputs = HBrcGeoInputs()
    Hbrcinputs.Dbrch = Dbrc_hbrc  ###----USER INPUT----###
    Hbrcinputs.ndiv = 0
    Hbrcinputs.Hbrcmatins = Hbrcmatin
    Hbrcinputs.precalc = (
        True
    )  # This can be set to true if we want Hbrace to be set=Xbrace top D and t, in which case the above set Dbrch and tbrch would be overwritten
    # ______________________________________________#

    # TP data

    # Note PrebuildTPLvl is set in JacketIns				           ###----USER INPUT----###
    # TP lumped mass data
    TPlumpinputs = TPlumpMass()  ###----ALL USER INPUT----###
    TPlumpinputs.mass = (
        666.0e3
    )  # -98385.33+( 7850.*4*np.pi/4.*(1.2**2-(1.2-2.*0.04)**2)*4)  #[kg]  TO MODIFY AFTER WE ASSESS OVERALL TP MASS, to be reduced for the steel weight
    TPlumpinputs.CMoff = np.array([0.0, 0.0, 2.0])  # CG of concrete block is 2 m above intersection of diagonal braces
    TPlumpinputs.I = (
        1.0
        / 12
        * TPlumpinputs.mass
        * np.array([8.0 ** 2 + 4.0 ** 2, 8.0 ** 2 + 4.0 ** 2, 8.0 ** 2 + 8.0 ** 2, 0.0, 0.0, 0.0])
    )

    TPstrtmatin = MatInputs()
    TPstmpsmatin = MatInputs()
    TPgirdmatin = MatInputs()
    TPbrcmatin = MatInputs()
    TPstemmatin = MatInputs()
    TPstmpsmatin.matname = np.array(["steel"])
    TPstmpsmatin.rho = np.array([7850.0])

    TPstrtmatin.matname = np.array(["steel"])
    TPstrtmatin.rho = np.array([1350.0])
    TPbrcmatin.matname = np.array(["steel"])
    TPbrcmatin.rho = np.array(
        [1350.0]
    )  # np.array([7850.]) tpstrucmass=np.pi/4*(1.2**2-(1.2-2*0.04)**2)*7850*4*4 7850.*tpstrucmass/myjckt.TP.TPouts.mass=1462.185
    TPgirdmatin.matname = np.array(["steel"])
    TPgirdmatin.rho = np.array([1350.0])
    TPstemmatin.matname = np.array(["steel"]).repeat(2)  ###----ALL USER INPUT----###
    TPstemmatin.rho = np.array([1350.0])

    TPinputs = TPGeoInputs()
    TPinputs.TPstrtmatins = TPstrtmatin
    TPinputs.TPbrcmatins = TPbrcmatin
    TPinputs.TPstemmatins = TPstemmatin
    TPinputs.TPstmpmatins = TPstmpsmatin
    TPinputs.TPgirdmatins = TPgirdmatin

    # Set TP dimensions as leg and brace dimensions
    TPinputs.Dstrut = 1.2  ###----ALL USER INPUT----###
    TPinputs.tstrut = 0.04
    TPinputs.Dgir = TPinputs.Dstrut
    TPinputs.tgir = TPinputs.tstrut
    TPinputs.Dbrc = TPinputs.Dstrut
    TPinputs.tbrc = TPinputs.tstrut
    ###----ALL USER INPUT----###
    TPinputs.hstump = 0.499  # (16.15-15.651)
    TPinputs.Dstump = 1.2
    TPinputs.tstump = 0.04

    TPinputs.stumpndiv = 1
    TPinputs.brcndiv = 1
    TPinputs.girndiv = 1
    TPinputs.strutndiv = 1
    TPinputs.stemndiv = 1
    TPinputs.nstems = 3
    TPinputs.Dstem = np.array([5.6]).repeat(TPinputs.nstems)
    TPinputs.tstem = np.array([0.032, 0.032, 0.032])
    TPinputs.hstem = np.array([(4.0) / TPinputs.nstems]).repeat(TPinputs.nstems)
    # ______________________________________________#

    # Tower data
    Twrmatin = MatInputs()
    Twrmatin.matname = np.array(["steel"])
    Twrmatin.rho = np.array([7850.0])

    Twrinputs = TwrGeoInputs()
    Twrinputs.Twrmatins = Twrmatin
    # Twrinputs.Htwr=88.15  #Trumped by HH
    Twrinputs.Htwr2frac = 1.0 / 88.15  # fraction of tower height with constant x-section
    Twrinputs.ndiv = np.array([1, 1])  # ndiv for uniform and tapered section			   ###----USER INPUT----###
    Twrinputs.DeltaZmax = (
        5.0
    )  # [m], maximum FE element length allowed in the tower members (i.e. the uniform and the tapered members)
    Twrinputs.Db = 5.6
    Twrinputs.DTRb = Twrinputs.Db / 0.032
    Twrinputs.Dt = 4.0
    Twrinputs.DTRt = Twrinputs.Dt / 0.03
    # Set whether or not DTRb and DTRt for the tower are the same. Note if next set to False it will trump DTRt setting above
    Twrinputs.DTRsdiff = True  ##SET THIS TO TRUE IF YOU WANT DTRs to be different between base and top

    # If you use the following 12 lines, The geometry defined above is ignored
    ztwr = np.array([20.15, 21.15, 32.15, 42.15, 54.15, 64.15, 74.15, 83.15, 88.15]) - 20.15
    Dtwr = np.array([5.6, 5.577, 5.318, 5.082, 4.8, 4.565, 4.329, 4.118, 4])
    ttwr = np.array([0.032, 0.032, 0.03, 0.028, 0.024, 0.022, 0.02, 0.03, 0.03])
    pmtwr = np.array(
        [np.array([20.15, 54.15, 88.15]) - 20.15, [1.9e3, 1.4e3, 1.0e3]]
    ).T  # (3,2) first col z's, second weights
    # Interpolate data to refine tower discretization
    dz = 1.0  # [m] maximum deltaz allowed in discretization
    ztwr2 = np.linspace(ztwr[0], ztwr[-1], round((ztwr[-1] - ztwr[0]) / dz))  # New discretization
    Dtwr_interp = interp1d(ztwr, Dtwr)
    ttwr_interp = interp1d(ztwr, ttwr)
    Twrinputs.ztwr = ztwr2
    Twrinputs.Dtwr = Dtwr_interp(ztwr2)
    Twrinputs.ttwr = ttwr_interp(ztwr2)
    Twrinputs.TwrlumpedMass = np.zeros([pmtwr.shape[0], 11])
    Twrinputs.TwrlumpedMass[:, 0:2] = pmtwr

    TwrRigidTop = False  # False=Account for RNA via math rather than a physical rigidmember
    # ______________________________________________#

    # RNA data
    RNAins = RNAprops()
    RNAins.mass = 350.0e3  # [kg]
    RNAins.I[0] = 86.579e6  # [kg m2]
    RNAins.I[1] = 53.530e6  # [kg m2]
    RNAins.I[2] = 58.112e6  # [kg m2]
    RNAins.CMoff[2] = 2.34  # [m]
    RNAins.Thoff[2] = 2.4  # [m]
    RNAins.yawangle = 45.0  # angle with respect to global X, CCW looking from above, wind from left
    RNAins.rna_weightM = True
    # ______________________________________________#

    # RNA loads              Fx-z,         Mxx-zz
    RNA_F = np.array(
        [1000.0e3, 0.0, 0.0, 0.0, 0.0, 0.0]
    )  # unfactored thrust, though accounting for gust and dynamic effects (no IEC PSF though)
    # ______________________________________________#

    # Frame3DD parameters           									      ###----ALL USER INPUT----###
    FrameAuxIns = Frame3DDaux()
    FrameAuxIns.sh_fg = 1  # shear flag-->Timoshenko
    FrameAuxIns.deltaz = 5.0
    FrameAuxIns.geo_fg = 0
    FrameAuxIns.nModes = 6  # number of desired dynamic modes of vibration
    FrameAuxIns.Mmethod = 1  # 1: subspace Jacobi     2: Stodola
    FrameAuxIns.lump = 0  # 0: consistent mass ... 1: lumped mass matrix
    FrameAuxIns.tol = 1e-9  # mode shape tolerance
    FrameAuxIns.shift = 0.0  # shift value ... for unrestrained structures
    FrameAuxIns.gvector = np.array([0.0, 0.0, -9.8065])  # GRAVITY

    # Decide whether or not to consider DLC 6.1 as well
    twodlcs = False

    # ______________________________________________#
    # ______________________________________________#

    # OTHER AUXILIARY CONSTRAINTS AND TARGETS FOR OPTIMIZATION #
    # ______________________________________________#
    # ______________________________________________#

    # Set Optimization Bounds and guesses for the various variables:
    #          x=  [ batter,  Dpile,    tpile,        Lp,   Dleg,     tleg,       Dbrc,   tbrc,     Dbrc_mud,   tbrc_mud,   Dgit,      tgir,      Db,   DTRb   Dt,   DTRt   Htwr2fac        dck_widthfact]
    MnCnst = np.array(
        [
            8.0,
            1.0,
            1.0 * 0.0254,
            20.0,
            1.0,
            1.0 * 0.0254,
            1.0,
            1.0 * 0.0254,
            1.0,
            1.0 * 0.0254,
            1.0,
            1.0 * 0.0254,
            5.0,
            120.0,
            3.0,
            120.0,
            0.05,
            2.0,
        ]
    )
    MxCnst = np.array(
        [
            15.0,
            2.5,
            5.0 * 0.0254,
            50.0,
            2.5,
            5.0 * 0.0254,
            2.0,
            5.0 * 0.0254,
            2.0,
            5.0 * 0.0254,
            2.0,
            5.0 * 0.0254,
            7.0,
            200.0,
            4.0,
            200.0,
            0.25,
            3.0,
        ]
    )
    guesses = np.array(
        [
            10.0,
            1.5,
            1.5 * 0.0254,
            26.0,
            1.8,
            1.5 * 0.0254,
            1.2,
            1.5 * 0.0254,
            1.2,
            1.5 * 0.0254,
            1.2,
            1.5 * 0.0254,
            6.0,
            140.0,
            3.5,
            150.0,
            0.2,
            2.0,
        ]
    )

    # SET Maximum Footprint [m]
    mxftprint = 30.0

    # Set target frequency [Hz] and f0epsilon, i.e. fmax=(1+f0eps)*f0
    f0 = 0.22
    f0epsilon = 0.1

    # Set the minminimum DTR allowed for jacket members; mostly for 60+waterdepths
    jcktDTRmin = 22.0

    # _____________________________________________________________#
    # ________________ DO NOT MODIFY THE FOLLOWING ________________#
    # _____________________________________________________________#

    bounds = np.vstack((MnCnst, MxCnst))
    desvarmeans = np.mean(bounds, 1)

    # Now Launch the assembly and pass all of the inputs
    # myjckt=set_as_top(JacketSE(Jcktins.clamped,Jcktins.AFflag,twodlcs=twodlcs, wlevel_Ulist=29))#CJB and JQ
    myjckt = set_as_top(JacketSE(Jcktins.clamped, Jcktins.AFflag, twodlcs=twodlcs))
    # pySubDyn Parameters CJB+
    # SDpySubDynA = pySubDynA()

    # INPUTS TO RUN SUBDYN-------------------------------------------------------
    # (PATH INFORMATION FOR INPUT FILE AND DRIVER)

    Base_name = "OC4_pySubDyn"  # Input name here

    # INPUT FILE PATH
    myjckt.InputFile_name = str(Base_name) + ".txt"
    # myjckt.SDpySubDynA.InputFile_name=str(Base_name)+".txt"
    myjckt.InputandDriverpath = "C:\wisdem\plugins\JacketSE\src\jacketse\SubDyn\CertTest"
    myjckt.InputFile_path = myjckt.InputandDriverpath + os.sep + str(myjckt.InputFile_name)

    # DRIVER PATH
    myjckt.Driver_name = str(Base_name) + "D" + ".txt"
    myjckt.Driver_path = myjckt.InputandDriverpath + os.sep + str(myjckt.Driver_name)
    myjckt.Driver_path = myjckt.InputandDriverpath + os.sep + str(myjckt.Driver_name)

    # PATH TO RUN SUBDYN
    SDEXEpath = "C:\wisdem\plugins\JacketSE\src\jacketse\SubDyn" + os.sep + "bin\SubDyn_Win32.exe"
    myjckt.SDpath = str(SDEXEpath) + " " + str(myjckt.Driver_path)
    # test.SDpath='r'+"'''"+test.SDEXEpath+' '+test.SDDriverpath+"'''"

    # PATH TO READ OUTPUT (INPUTS TO READ OUTPUT)
    myjckt.Readpath_out = str(myjckt.InputandDriverpath) + os.sep + str(Base_name) + ".SD.out"
    myjckt.Readpath_sum = str(myjckt.InputandDriverpath) + os.sep + str(Base_name) + ".SD.sum"
    myjckt.Delete_file = False  # Deletes driver, input, and output files. Does not delete Echo file.

    # INPUT FILE INPUTS----------------------------------------------------------

    # Simulation Control
    myjckt.Echo = np.array([False, "Echo", "- Echo input data to " "<rootname>.SD.ech" " (flag)"])
    myjckt.SDdeltaT = np.array(
        [
            "DEFAULT",
            "SDdeltaT",
            "- Local Integration Step. If " "default" ", the glue-code integration step will be used.",
        ]
    )
    myjckt.IntMethod = np.array([4, "IntMethod", "- Integration Method [1/2/3/4 = RK4/AB4/ABM4/AM2]."])
    myjckt.SttcSolve = np.array([False, "SttcSolve", "- Solve dynamics about static equilibrium point"])

    # FEA and CRAIG-BAMPTON PARAMETERS
    myjckt.FEMmod = np.array(
        [
            3,
            "- FEM switch: element model in the FEM. [1= Euler-Bernoulli(E-B);  2=Tapered E-B (unavailable);  3= 2-node Timoshenko;  4= 2-node tapered Timoshenko (unavailable)]",
        ]
    )
    myjckt.NDiv = np.array(
        [1, "NDiv", "- Number of sub-elements per member"]
    )  # CJB "HARDWIRED" INTO PYSUBDYN AS 1 TO ALLOW JACKETSE'S NODES TO BE USED AS SUBDYN'S JOINTS
    myjckt.CBMod = np.array(
        [
            False,
            "- [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.",
        ]
    )
    myjckt.Nmodes = np.array(
        [75, "- Number of internal modes to retain (ignored if CBMod=False). If Nmodes=0 --> Guyan Reduction."]
    )
    myjckt.JDampings = np.array(
        [
            2,
            "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).",
        ]
    )

    # Structure Joints
    myjckt.SDjointsHeader = np.array(
        [
            ["JointID", "JointXss", "JointYss", "JointZss", "[Coordinates of Member joints in SS-Coordinate System]"],
            ["(-)", "(m)", "(m)", "(m)"],
        ]
    )

    # Base Reaction Joints
    myjckt.BaseRxnJointsHeader = np.array(
        [
            [
                "RJointID",
                "RctTDXss",
                "RctTDYss",
                "RctTDZss",
                "RctRDXss",
                "RctRDYss",
                "RctRDZss",
                "[Global Coordinate System]",
            ],
            ["(-)", ("flag"), ("flag"), ("flag"), ("flag"), ("flag"), ("flag")],
        ]
    )

    # Interface Joints
    myjckt.InterfaceRxnJointsHeader = np.array(
        [
            [
                "IJointID",
                "ItfTDXss",
                "ItfTDYss",
                "ItfTDZss",
                "ItfRDXss",
                "ItfRDYss",
                "ItfRDZss",
                "[Global Coordinate System]",
            ],
            ["(-)", ("flag"), ("flag"), ("flag"), ("flag"), ("flag"), ("flag")],
        ]
    )

    # Members
    myjckt.MembersHeader = np.array(
        [
            ["MemberID", "MJointID1", "MJointID2", "MPropSetID1", "MPropSetID2", "COSMID"],
            ["(-)", "(-)", "(-)", "(-)", "(-)", "(-)"],
        ]
    )

    # MEMBER X-SECTION PROPERTY data 1/2
    myjckt.NPropSets = np.array(
        [
            6,
            "NPropSets",
            "- # of structurally unique x-sections (i.e. # of X-sectional props utilized throughout all of the members)",
        ]
    )
    myjckt.PropSet1Header = np.array(
        [
            ["PropSetID", "YoungE", "ShearG", "MatDens", "XsecD", "XsecT"],
            ["(-)", "(N/m2)", "(N/m2)", "(kg/m3)", "(m)", "(m)"],
        ]
    )

    # MEMBER X-SECTION PROPERTY data 2/2
    myjckt.PropSet2 = np.array([])
    myjckt.PropSet2Header = np.array(
        [
            ["PropSetID", "YoungE", "ShearG", "MatDens", "XsecA", "XsecAsx", "XsecAsy", "XsecJxx", "XsecJyy", "XsecJ0"],
            ["(-)", "(N/m2)", "(N/m2)", "(kg/m3)", "(m2)", "(m2)", "(m2)", "(m4)", "(m4)", "(m4)"],
        ]
    )

    # MEMBER COSINE MATRICES COSM(i,j)
    myjckt.COSMHeader = np.array(
        [
            [
                "COSMID",
                "COSM11",
                "COSMID12",
                "COSMID13",
                "COSMID21",
                "COSMID22",
                "COSMID23",
                "COSMID31",
                "COSMID32",
                "COSMID33",
            ],
            ["(-)", "(-)", "(-)", "(-)", "(-)", "(-)", "(-)", "(-)", "(-)", "(-)"],
        ]
    )
    myjckt.COSMs = np.array([])

    # JOINT ADDITIONAL CONCENTRATED MASSES
    myjckt.CmassHeader = np.array(
        [["CMJointID", "JMass", "JMXX", "JMYY", "JMZZ"], ["(-)", "(kg)", "(kg*m^2)", "(kg*m^2)", "(kg*m^2)"]]
    )
    myjckt.Cmass = np.array([])

    # OUTPUT: SUMMARY & OUTFILE
    myjckt.SSSum = np.array(
        [
            True,
            "SSSum",
            "- Output a Summary File (flag).It contains: matrices K,M  and C-B reduced M_BB, M-BM, K_BB, K_MM(OMG^2), PHI_R, PHI_L. It can also contain COSMs if requested.",
        ]
    )
    myjckt.OutCOSM = np.array(
        [True, "OutCOSM", "- Output cosine matrices with the selected output member forces (flag)"]
    )
    myjckt.OutAll = np.array([True, "OutAll", "- [T/F] Output all members' end forces "])
    myjckt.OutSwtch = np.array(
        [
            1,
            "OutSwtch",
            "- [1/2/3] Output requested channels to: 1=<rootname>.SD.out;  2=<rootname>.out (generated by FAST);  3=both files.",
        ]
    )
    myjckt.TabDelim = np.array([True, "TabDelim", "- Generate a tab-delimited output in the <rootname>.SD.out file"])
    myjckt.OutDec = np.array([1, "OutDec", "- Decimation of output in the <rootname>.SD.out file"])
    myjckt.OutFmt = np.array(
        ["Es11.4e2", "OutFmt", "- Output format for numerical results in the <rootname>.SD.out file"]
    )
    myjckt.OutSFmt = np.array(["A11", "OutFmt", "- Output format for header strings in the <rootname>.SD.out file"])

    # MEMBER OUTPUT LIST
    myjckt.MemOutListHeader = np.array(
        [
            [
                "MemberID",
                "NoutCnt",
                "NodeCnt",
                "[NOutCnt=how many nodes to get output for [< 10]; NodeCnt are local ordinal numbers from the start of the member, and must be >=1 and <= NDiv+1] If NMOutputs=0 leave blank as well.]",
            ],
            ["(-)", "(-)", "(-)"],
        ]
    )

    # SSOutline
    myjckt.SSOutlist = np.array(
        [
            [
                "ReactFXss, ReactFYss, ReactFZss, ReactMXss, ReactMYss, ReactMZss",
                "-Base reactions (forces onto SS structure)",
            ],
            [
                "IntfFXss,  IntfFYss,  IntfFZss,  IntfMXss, IntfMYss, IntfMZss",
                "-Interface reactions (forces from SS structure)",
            ],
            ["IntfTDXss,  IntfTDYss,  IntfTDZss,  IntfRDXss, IntfRDYss, IntfRDZss", "-Interface deflections "],
            ["IntfTAXss,  IntfTAYss,  IntfTAZss,  IntfRAXss, IntfRAYss, IntfRAZss", "Interface accelerations"],
        ]
    )

    myjckt.SDjoints = np.array(
        [
            [1, -5.93900, -5.93900, -43.12700],
            [2, 5.93900, -5.93900, -43.12700],
            [3, 5.93900, 5.93900, -43.12700],
            [4, -5.93900, 5.93900, -43.12700],
            [5, -4.01600, -4.01600, 15.65100],
            [6, 4.01600, -4.01600, 15.65100],
            [7, 4.01600, 4.01600, 15.65100],
            [8, -4.01600, 4.01600, 15.65100],
            [9, 0.00000, -4.79180, -8.06090],
            [10, 4.79180, 0.00000, -8.06090],
            [11, 0.00000, 4.79180, -8.06090],
            [12, -4.79180, 0.00000, -8.06090],
        ]
    )

    myjckt.BaseRxnJoints = np.array(
        [[1, 1, 1, 1, 1, 1, 1], [2, 1, 1, 1, 1, 1, 1], [3, 1, 1, 1, 1, 1, 1], [4, 1, 1, 1, 1, 1, 1]]
    )

    myjckt.InterfaceJointsFlags = np.array(
        [[5, 1, 1, 1, 1, 1, 1], [6, 1, 1, 1, 1, 1, 1], [7, 1, 1, 1, 1, 1, 1], [8, 1, 1, 1, 1, 1, 1]]
    )

    myjckt.Members = np.array(
        [
            [1, 1, 5, 2, 2],
            [2, 2, 6, 2, 2],
            [3, 3, 7, 2, 2],
            [4, 4, 8, 2, 2],
            [5, 1, 9, 3, 3],
            [6, 9, 6, 3, 3],
            [7, 5, 9, 3, 3],
            [8, 9, 2, 3, 3],
            [9, 2, 10, 3, 3],
            [10, 10, 7, 3, 3],
            [11, 6, 10, 3, 3],
            [12, 10, 3, 3, 3],
            [13, 3, 11, 3, 3],
            [14, 11, 8, 3, 3],
            [15, 7, 11, 3, 3],
            [16, 11, 4, 3, 3],
            [17, 4, 12, 3, 3],
            [18, 12, 5, 3, 3],
            [19, 8, 12, 3, 3],
            [20, 12, 1, 3, 3],
            [21, 5, 6, 3, 3],
            [22, 6, 7, 3, 3],
            [23, 7, 8, 3, 3],
            [24, 8, 5, 3, 3],
        ]
    )

    myjckt.MemOutList = np.array([[1, 2, 1, 2]])

    # DRIVER INPUTS--------------------------------------------------------------

    myjckt.EchoD = np.array([True, "Echo", "- Echo the input file data (flag)"])

    # Environmental Conditions
    myjckt.Gravity = np.array([9.81, "Gravity", "- Gravity (m/s^2)"])
    myjckt.WtrDpth = np.array([43.127, "WtrDpth", "- Water Depth (m) positive value"])

    # SubDyn
    myjckt.SDInputFile = np.array([myjckt.InputFile_path, "SDInputFile"])
    myjckt.OutRootName = np.array([str(myjckt.InputandDriverpath) + os.sep + str(Base_name), "OutRootName"])
    myjckt.NSteps = np.array([600, "NSteps", "- Number of time steps in the simulations (-)"])
    myjckt.TimeInterval = np.array([0.005, "TimeInterval", "- TimeInterval for the simulation (sec)"])
    myjckt.TP_RefPoint = np.array(
        [0.0, 0.0, 18.15, "TP_RefPoint", "- Location of the TP reference point in global coordinates (m)"]
    )
    myjckt.SubRotateZ = np.array(
        [0.0, "SubRotateZ", "- Rotation angle of the structure geometry in degrees about the global Z axis."]
    )

    # INPUTS
    myjckt.InputsMod = np.array(
        [
            1,
            "InputsMod",
            "- Inputs model {0: all inputs are zero for every timestep, 1: steadystate inputs, 2: read inputs from a file (InputsFile)} (switch)",
        ]
    )
    myjckt.InputsFile = np.array(['""', "InputsFile", "- Name of the inputs file if InputsMod = 2"])

    # STEADY INPUTS
    myjckt.uTPInSteady = np.array(
        [0.1, 0.0, 0.0, 0.0, 0.0, 0.0, "uTPInSteady", "- input displacements and rotations ( m, rads )"]
    )
    myjckt.uDotTPInSteady = np.array(
        [
            0.0,
            0.0,
            0.0,
            0.0,
            0.0,
            0.0,
            "uDotTPInSteady",
            "- input translational and rotational velocities ( m/s, rads/s)",
        ]
    )
    myjckt.uDotDotTPInSteady = np.array(
        [
            0.0,
            0.0,
            0.0,
            0.0,
            0.0,
            0.0,
            "uDotDotTPInSteady",
            "- input translational and rotational accelerations ( m/s^2, rads/s^2)",
        ]
    )

    # myjckt.SDpySubDynA.run()
    myjckt.JcktGeoIn = Jcktins
    myjckt.Soilinputs = Soilinputs
    myjckt.Waterinputs = Waterinputs
    myjckt.Windinputs = Windinputs
    myjckt.Pileinputs = Pileinputs
    myjckt.leginputs = leginputs
    myjckt.legbot_stmphin = legbot_stmphin  # Distance from bottom of leg to second joint along z; must be>0
    myjckt.Xbrcinputs = Xbrcinputs
    myjckt.Mbrcinputs = Mbrcinputs
    myjckt.Hbrcinputs = Hbrcinputs
    myjckt.TPlumpinputs = TPlumpinputs
    myjckt.TPinputs = TPinputs

    myjckt.Twrinputs = Twrinputs
    myjckt.TwrRigidTop = TwrRigidTop  # Account for RNA via math rather than a physical rigidmember
    myjckt.RNAinputs = RNAins
    myjckt.RNA_F = RNA_F

    myjckt.FrameAuxIns = FrameAuxIns

    return myjckt, f0, f0epsilon, jcktDTRmin, mxftprint, guesses, bounds.T
示例#4
0
def main():  #\
    """Function to Instantiate a JacketSE Assembly: \n
       INPUTS \n
             All hardwired, so edit the quantities below all the way to the line "#________________ DO NOT MODIFY THE FOLLOWING ________________#" \n
             -See JacketOpt_PyOPT for more information. \n
       OUTPUTS \n
             myjckt -jacket assembly instance \n\n

             Optimization parameters:    \n\n

             f0          -float, target frequency [Hz]
             f0epsilon   -float,  f0*(1+f0epsilon) will not be exceeded \n
             DTRsdiff    -Boolean,     Set this to True if DTRs are to be different between base and top. \n
             jcktDTRmin  -Float, minimum jacket member DTR allowed, mostly for 60+waterdepths. \n
             mxftprint   -Float, max allowed foot print [m]
             guesses     -Float(n), guesses for all design variables check out DesVar class. \n
             bounds      -Float(n,2), bounds for all design variables check out DesVar class. \n\n
             SAMPLE CALLS: \n
             1.OPTIMIZATION: python JacketOpt_ExtCobyla.py C:\RRD\PYTHON\WISDEM\JacketSE\src\jacketse\MyJacketInputs.py \n
             2.OPTIMIZATION: python JacketOpt_PyOPT.py C:\RRD\PYTHON\WISDEM\JacketSE\src\jacketse\MyJacketInputs.py True \n
             3.BUILD JACKET: python >>> myjacket=C:\RRD\PYTHON\WISDEM\JacketSE\src\jacketse\MyJacketInputs.py \n
        """

    #Set inputs							     ###----ALL USER INPUT----###
    Jcktins = JcktGeoInputs()

    Jcktins.nlegs = 4
    Jcktins.nbays = 4
    Jcktins.batter = 30.5495  #=(-43.127+24.614)/(5.939-5.333)
    Jcktins.dck_botz = 15.651
    Jcktins.dck_width = 8. + 1.2
    Jcktins.weld2D = 0.
    Jcktins.VPFlag = True  #vertical pile T/F;  to enable piles in frame3DD set pileinputs.ndiv>0
    Jcktins.clamped = True  #whether or not the bottom of the structure is rigidly connected. Use False when equivalent spring constants are being used.
    Jcktins.AFflag = False  #whether or not to use apparent fixity piles
    Jcktins.PreBuildTPLvl = 0  #if >0, the TP is prebuilt according to rules per PreBuildTP

    #______________________________________________#

    #Soil inputs
    Soilinputs = SoilGeoInputs()
    Soilinputs.zbots = -np.array([3., 5., 7., 15., 30., 50.])
    Soilinputs.gammas = np.array(
        [10000., 10000., 10000., 10000., 10000., 10000.])
    Soilinputs.cus = np.array([60000., 60000., 60000., 60000., 60000., 60000.])
    Soilinputs.phis = np.array(
        [26., 26., 26., 26., 26., 26]
    )  #np.array([36.,33.,26.,37.,35.,37.5])#np.array([36.,33.,26.,37.,35.,37.5])
    Soilinputs.delta = 25.
    Soilinputs.sndflg = True
    Soilinputs.PenderSwtch = False  #True
    Soilinputs.SoilSF = 1.
    #______________________________________________#

    #Water and wind inputs
    Waterinputs = WaterInputs()
    Waterinputs.wdepth = 50.
    Waterinputs.wlevel = 50.  #Distance from bottom of structure to surface  THIS, I believe is no longer needed as piles may be negative in z, to check and remove in case
    Waterinputs.T = 12.  #Wave Period
    Waterinputs.HW = 10.  #Wave Height
    Waterinputs.Cd = 3.  #Drag Coefficient, enhanced to account for marine growth and other members not calculated
    Waterinputs.Cm = 8.  #2.  #ADded mass Coefficient

    Windinputs = WindInputs()
    Windinputs.HH = 88.15 + 2.4  #CHECK HOW THIS COMPLIES....
    Windinputs.U50HH = 30.  #assumed gust speed
    Windinputs.Cdj = 4.  #Drag Coefficient for jacket members, enhanced to account for TP drag not calculated otherwise
    Windinputs.Cdt = 2  #Drag Coefficient for tower, enhanced to account for TP drag not calculated otherwise
    #______________________________________________#

    #Pile data
    Pilematin = MatInputs()
    Pilematin.matname = np.array(['RC'])
    Pilematin.E = np.array([2.1e11])
    Pilematin.G = np.array([8.07690e+10])
    Pilematin.rho = np.array(
        [3339.12]
    ) * 34274.82 / 36876.  #From Test04.txt in SD, to check with official FAST certtest

    Pileinputs = PileGeoInputs()
    Pileinputs.Pilematins = Pilematin
    Pileinputs.ndiv = 1  #3			   ###----USER INPUT----###
    Pileinputs.Dpile = 2.082
    Pileinputs.tpile = 0.491
    Pileinputs.AFflag = False  ###----USER INPUT----###
    Pileinputs.Lp = 0.  #[m] Embedment length
    #______________________________________________#

    #Legs data
    legmatin = MatInputs()
    legmatin.matname = (['steel'])
    legmatin.rho = np.array([7850.])
    Dleg = np.asarray([1.2]).repeat(Jcktins.nbays +
                                    1)  #e.g., np.array([2.0,1.8,1.6,1.6,1.6])
    tleg = np.asarray([0.05, 0.05, 0.035, 0.035, 0.035])

    leginputs = LegGeoInputs()
    leginputs.legZbot = 4.5  ###----USER INPUT----###
    leginputs.ndiv = 1  ###----USER INPUT----###
    leginputs.legmatins = legmatin
    leginputs.Dleg = Dleg
    leginputs.tleg = tleg

    #The following is a passthrough variables
    legbot_stmphin = (
        45.5 - 43.127
    )  #=2.373 Distance from bottom of leg to second joint along z; must be>0
    #______________________________________________#

    #Xbrc data
    Xbrcmatin = MatInputs()
    Xbrcmatin.matname = np.array(['steel']).repeat(Jcktins.nbays)
    Xbrcmatin.rho = np.array([7850.])

    Dbrc = np.asarray([0.8]).repeat(Jcktins.nbays)
    tbrc = np.asarray([0.02]).repeat(Jcktins.nbays)

    Xbrcinputs = XBrcGeoInputs()
    Xbrcinputs.Dbrc = Dbrc
    Xbrcinputs.tbrc = tbrc
    Xbrcinputs.ndiv = 1  ###----USER INPUT----###
    Xbrcinputs.Xbrcmatins = Xbrcmatin
    Xbrcinputs.precalc = False  #This can be set to true if we want Xbraces to be precalculated in D and t, in which case the above set Dbrc and tbrc would be overwritten
    #______________________________________________#

    #Mbrc data
    Mbrcmatin = MatInputs()
    Mbrcmatin.matname = np.array(['steel'])
    Mbrcmatin.rho = np.array([7850.])

    Mbrcinputs = MudBrcGeoInputs()
    Mbrcinputs.Dbrc_mud = 0.8  ###----USER INPUT----###
    Mbrcinputs.tbrc_mud = 0.02
    Mbrcinputs.ndiv = 2  ###----USER INPUT----###
    Mbrcinputs.Mbrcmatins = Mbrcmatin
    Mbrcinputs.precalc = False  #This can be set to true if we want Mudbrace to be precalculated in D and t, in which case the above set Dbrc_mud and tbrc_mud would be overwritten
    #______________________________________________#

    #Hbrc data
    Hbrcmatin = MatInputs()
    Hbrcmatin.matname = np.array(['steel'])
    Hbrcmatin.rho = np.array([7850.])
    Dbrc_hbrc = 1.1  ###----USER INPUT----###

    Hbrcinputs = HBrcGeoInputs()
    Hbrcinputs.Dbrch = Dbrc_hbrc  ###----USER INPUT----###
    Hbrcinputs.ndiv = 0
    Hbrcinputs.Hbrcmatins = Hbrcmatin
    Hbrcinputs.precalc = True  #This can be set to true if we want Hbrace to be set=Xbrace top D and t, in which case the above set Dbrch and tbrch would be overwritten
    #______________________________________________#

    #TP data

    #Note PrebuildTPLvl is set in JacketIns				           ###----USER INPUT----###
    #TP lumped mass data
    TPlumpinputs = TPlumpMass()  ###----ALL USER INPUT----###
    TPlumpinputs.mass = 666.e3  #-98385.33+( 7850.*4*np.pi/4.*(1.2**2-(1.2-2.*0.04)**2)*4)  #[kg]  TO MODIFY AFTER WE ASSESS OVERALL TP MASS, to be reduced for the steel weight
    TPlumpinputs.CMoff = np.array([
        0., 0., 2.
    ])  #CG of concrete block is 2 m above intersection of diagonal braces
    TPlumpinputs.I = 1. / 12 * TPlumpinputs.mass * np.array(
        [8.**2 + 4.**2, 8.**2 + 4.**2, 8.**2 + 8.**2, 0., 0., 0.])

    TPstrtmatin = MatInputs()
    TPstmpsmatin = MatInputs()
    TPgirdmatin = MatInputs()
    TPbrcmatin = MatInputs()
    TPstemmatin = MatInputs()
    TPstmpsmatin.matname = np.array(['steel'])
    TPstmpsmatin.rho = np.array([7850.])

    TPstrtmatin.matname = np.array(['steel'])
    TPstrtmatin.rho = np.array([1350.])
    TPbrcmatin.matname = np.array(['steel'])
    TPbrcmatin.rho = np.array(
        [1350.]
    )  #np.array([7850.]) tpstrucmass=np.pi/4*(1.2**2-(1.2-2*0.04)**2)*7850*4*4 7850.*tpstrucmass/myjckt.TP.TPouts.mass=1462.185
    TPgirdmatin.matname = np.array(['steel'])
    TPgirdmatin.rho = np.array([1350.])
    TPstemmatin.matname = np.array(['steel'
                                    ]).repeat(2)  ###----ALL USER INPUT----###
    TPstemmatin.rho = np.array([1350.])

    TPinputs = TPGeoInputs()
    TPinputs.TPstrtmatins = TPstrtmatin
    TPinputs.TPbrcmatins = TPbrcmatin
    TPinputs.TPstemmatins = TPstemmatin
    TPinputs.TPstmpmatins = TPstmpsmatin
    TPinputs.TPgirdmatins = TPgirdmatin

    #Set TP dimensions as leg and brace dimensions
    TPinputs.Dstrut = 1.2  ###----ALL USER INPUT----###
    TPinputs.tstrut = 0.04
    TPinputs.Dgir = TPinputs.Dstrut
    TPinputs.tgir = TPinputs.tstrut
    TPinputs.Dbrc = TPinputs.Dstrut
    TPinputs.tbrc = TPinputs.tstrut
    ###----ALL USER INPUT----###
    TPinputs.hstump = 0.499  #(16.15-15.651)
    TPinputs.Dstump = 1.2
    TPinputs.tstump = 0.04

    TPinputs.stumpndiv = 1
    TPinputs.brcndiv = 1
    TPinputs.girndiv = 1
    TPinputs.strutndiv = 1
    TPinputs.stemndiv = 1
    TPinputs.nstems = 3
    TPinputs.Dstem = np.array([5.6]).repeat(TPinputs.nstems)
    TPinputs.tstem = np.array([0.032, 0.032, 0.032])
    TPinputs.hstem = np.array([(4.) / TPinputs.nstems]).repeat(TPinputs.nstems)
    #______________________________________________#

    #Tower data
    Twrmatin = MatInputs()
    Twrmatin.matname = np.array(['steel'])
    Twrmatin.rho = np.array([7850.])

    Twrinputs = TwrGeoInputs()
    Twrinputs.Twrmatins = Twrmatin
    #Twrinputs.Htwr=88.15  #Trumped by HH
    Twrinputs.Htwr2frac = 1. / 88.15  #fraction of tower height with constant x-section
    Twrinputs.ndiv = np.array([
        1, 1
    ])  #ndiv for uniform and tapered section			   ###----USER INPUT----###
    Twrinputs.DeltaZmax = 5.  #[m], maximum FE element length allowed in the tower members (i.e. the uniform and the tapered members)
    Twrinputs.Db = 5.6
    Twrinputs.DTRb = Twrinputs.Db / 0.032
    Twrinputs.Dt = 4.
    Twrinputs.DTRt = Twrinputs.Dt / 0.03

    #If you use the following 12 lines, The geometry defined above is ignored
    ztwr = np.array([
        20.15, 21.15, 32.15, 42.15, 54.15, 64.15, 74.15, 83.15, 88.15
    ]) - 20.15
    Dtwr = np.array([5.6, 5.577, 5.318, 5.082, 4.8, 4.565, 4.329, 4.118, 4])
    ttwr = np.array(
        [0.032, 0.032, 0.03, 0.028, 0.024, 0.022, 0.02, 0.03, 0.03])
    pmtwr = np.array(
        [np.array([20.15, 54.15, 88.15]) - 20.15,
         [1.9e3, 1.4e3, 1.0e3]]).T  #(3,2) first col z's, second weights
    #Interpolate data to refine tower discretization
    dz = 1.  #[m] maximum deltaz allowed in discretization
    ztwr2 = np.linspace(ztwr[0], ztwr[-1], round(
        (ztwr[-1] - ztwr[0]) / dz))  #New discretization
    Dtwr_interp = interp1d(ztwr, Dtwr)
    ttwr_interp = interp1d(ztwr, ttwr)
    Twrinputs.ztwr = ztwr2
    Twrinputs.Dtwr = Dtwr_interp(ztwr2)
    Twrinputs.ttwr = ttwr_interp(ztwr2)
    Twrinputs.TwrlumpedMass = np.zeros([pmtwr.shape[0], 11])
    Twrinputs.TwrlumpedMass[:, 0:2] = pmtwr

    TwrRigidTop = False  #False=Account for RNA via math rather than a physical rigidmember
    #______________________________________________#

    #RNA data
    RNAins = RNAprops()
    RNAins.mass = 350.e3  #[kg]
    RNAins.I[0] = 86.579E+6  #[kg m2]
    RNAins.I[1] = 53.530E+6  #[kg m2]
    RNAins.I[2] = 58.112E+6  #[kg m2]
    RNAins.CMoff[2] = 2.34  #[m]
    RNAins.Thoff[2] = 2.4  #[m]
    RNAins.yawangle = 45.  #angle with respect to global X, CCW looking from above, wind from left
    RNAins.rna_weightM = True
    #______________________________________________#

    #RNA loads              Fx-z,         Mxx-zz
    RNA_F = np.array(
        [1000.e3, 0., 0., 0., 0., 0.]
    )  #unfactored thrust, though accounting for gust and dynamic effects (no IEC PSF though)
    #______________________________________________#

    # Frame3DD parameters           									      ###----ALL USER INPUT----###
    FrameAuxIns = Frame3DDaux()
    FrameAuxIns.sh_fg = 1  #shear flag-->Timoshenko
    FrameAuxIns.deltaz = 5.
    FrameAuxIns.geo_fg = 0
    FrameAuxIns.nModes = 6  # number of desired dynamic modes of vibration
    FrameAuxIns.Mmethod = 1  # 1: subspace Jacobi     2: Stodola
    FrameAuxIns.lump = 0  # 0: consistent mass ... 1: lumped mass matrix
    FrameAuxIns.tol = 1e-9  # mode shape tolerance
    FrameAuxIns.shift = 0.0  # shift value ... for unrestrained structures
    FrameAuxIns.gvector = np.array([0., 0., -9.8065])  #GRAVITY
    #______________________________________________#
    #______________________________________________#

    # OTHER AUXILIARY CONSTRAINTS AND TARGETS FOR OPTIMIZATION #
    #______________________________________________#
    #______________________________________________#

    #Set Optimization Bounds and guesses for the various variables:
    #          x=  [ batter,  Dpile,    tpile,        Lp,   Dleg,     tleg,       Dbrc,   tbrc,     Dbrc_mud,   tbrc_mud,   Dgit,      tgir,      Db,   DTRb   Dt,   DTRt   Htwr2fac        dck_widthfact]
    MnCnst = np.array([
        8., 1., 1. * 0.0254, 20., 1., 1. * 0.0254, 1., 1. * 0.0254, 1.,
        1. * 0.0254, 1., 1. * 0.0254, 5., 120., 3., 120., 0.05, 2.
    ])
    MxCnst = np.array([
        15., 2.5, 5. * 0.0254, 50., 2.5, 5. * 0.0254, 2., 5. * 0.0254, 2.,
        5. * 0.0254, 2., 5. * 0.0254, 7., 200., 4., 200., 0.25, 3.
    ])
    guesses = np.array([
        10., 1.5, 1.5 * 0.0254, 26., 1.8, 1.5 * 0.0254, 1.2, 1.5 * 0.0254, 1.2,
        1.5 * 0.0254, 1.2, 1.5 * 0.0254, 6., 140., 3.5, 150., 0.2, 2.
    ])

    #SET Maximum Footprint [m]
    mxftprint = 30.

    #Set target frequency [Hz] and f0epsilon, i.e. fmax=(1+f0eps)*f0
    f0 = 0.22
    f0epsilon = 0.1

    #Set whether or not DTRb and DTRt for the tower are teh same
    DTRsdiff = True  ##SET THIS TO TRUE IF YOU WANT DTRs to be different between base and top

    #Set the minminimum DTR allowed for jacket members; mostly for 60+waterdepths
    jcktDTRmin = 22.

    #_____________________________________________________________#
    #________________ DO NOT MODIFY THE FOLLOWING ________________#
    #_____________________________________________________________#

    bounds = np.vstack((MnCnst, MxCnst))
    desvarmeans = np.mean(bounds, 1)

    # Now Launch the assembly and pass all of the inputs

    myjckt = set_as_top(
        JacketSE(Jcktins.clamped, Jcktins.AFflag, Jcktins.PreBuildTPLvl > 0))
    myjckt.JcktGeoIn = Jcktins
    myjckt.Soilinputs = Soilinputs
    myjckt.Waterinputs = Waterinputs
    myjckt.Windinputs = Windinputs
    myjckt.Pileinputs = Pileinputs
    myjckt.leginputs = leginputs
    myjckt.legbot_stmphin = legbot_stmphin  #Distance from bottom of leg to second joint along z; must be>0
    myjckt.Xbrcinputs = Xbrcinputs
    myjckt.Mbrcinputs = Mbrcinputs
    myjckt.Hbrcinputs = Hbrcinputs
    myjckt.TPlumpinputs = TPlumpinputs
    myjckt.TPinputs = TPinputs

    myjckt.Twrinputs = Twrinputs
    myjckt.TwrRigidTop = TwrRigidTop  #Account for RNA via math rather than a physical rigidmember
    myjckt.RNAinputs = RNAins
    myjckt.RNA_F = RNA_F

    myjckt.FrameAuxIns = FrameAuxIns

    return myjckt, f0, f0epsilon, jcktDTRmin, DTRsdiff, mxftprint, guesses, bounds.T