123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 |
- # https://akaszynski.github.io/pyansys/ansys_control.html#initial-setup-and-example
- # pip install pyansys --upgrade
- import pyansys
- import numpy as np
- import os
- def plot_rotor(ansys):
- ansys.run("/Post1")
- ansys.run("ALLS")
- ansys.run("/erase")
- ansys.run("/win,1,ltop $/win,2,rtop")
- ansys.run("/win,3,lbot $/win,4,rbot")
- ansys.run("/win,1,off")
- ansys.run("/win,2,off")
- ansys.run("/win,3,off")
- ansys.run("/win,4,off")
- ansys.run("/win,1,on")
- ansys.plnsol("S", "X") # Stress in Radialrichtung
- ansys.run("/noerase")
- ansys.run("/win,1,off")
- ansys.run("/win,2,on")
- ansys.run("/view,2,0,0,-1")
- ansys.plnsol("S", "X") # Stress in Radialrichtung, Sicht von hinten
- ansys.run("/noerase")
- ansys.run("/win,2,off")
- ansys.run("/win,3,on")
- ansys.plnsol("S", "Y") # Stress in Tangentialrichtung
- ansys.run("/noerase")
- ansys.run("/win,3,off")
- ansys.run("/win,4,on")
- ansys.plnsol("U", "SUM")
- ansys.run("/noerase")
- ansys.run("/win,4,off")
- ansys.run("/EOF")
- def sim_rotor(materials, angles, outer_diameter=250, inner_diameter=50, thickness=5, omega=0.1):
- layers = len(angles)
- layer_thickness = thickness / layers
- path = os.getcwd()+"\\ws"
- mapdl = pyansys.launch_mapdl(run_location=path, interactive_plotting=True)
- # clear existing geometry
- mapdl.finish()
- mapdl.clear()
- th = 200 # [°C] Herstellungstemperatur
- tn = 20 # [°C] Nutzungstemperatur
- mapdl.prep7()
- # define Material
- for i in range(0, len(materials)):
- mapdl.mptemp(i + 1, th)
- mapdl.mpdata("EX", i + 1, "", materials[i]["e11"])
- mapdl.mpdata("EY", i + 1, "", materials[i]["e22"])
- mapdl.mpdata("EZ", i + 1, "", materials[i]["e33"])
- mapdl.mpdata("PRXY", i + 1, "", materials[i]["pr12"])
- mapdl.mpdata("PRXZ", i + 1, "", materials[i]["pr13"])
- mapdl.mpdata("PRYZ", i + 1, "", materials[i]["pr23"])
- mapdl.mpdata("DENS", i + 1, "", materials[i]["dens"])
- mapdl.mpdata("GXY", i + 1, "", materials[i]["g12"])
- mapdl.mpdata("GXZ", i + 1, "", materials[i]["g13"])
- mapdl.mpdata("GYZ", i + 1, "", materials[i]["g23"])
- # Waermeausdenungsk
- mapdl.mpdata("ALPX", i + 1, "", materials[i]["alp11"])
- mapdl.mpdata("ALPY", i + 1, "", materials[i]["alp22"])
- mapdl.mpdata("ALPZ", i + 1, "", materials[i]["alp33"])
- # Waermeleitfaehigk
- # mapdl.mpdata("KXX", i + 1, "", materials[i]["k11"])
- # mapdl.mpdata("KYY", i + 1, "", materials[i]["k22"])
- # mapdl.mpdata("KZZ", i + 1, "", materials[i]["k33"])
- # Quellkoeffizient
- # mapdl.mpdata("BETX", i + 1, "", materials[i]["bet11"])
- # mapdl.mpdata("BETY", i + 1, "", materials[i]["bet22"])
- # mapdl.mpdata("BETZ", i + 1, "", materials[i]["bet33"])
- # Diffusionskoeffizient
- # mapdl.mpdata("DXX", i + 1, "", materials[i]["d11"])
- # mapdl.mpdata("DYY", i + 1, "", materials[i]["d22"])
- # mapdl.mpdata("DZZ", i + 1, "", materials[i]["d33"])
- # define Element
- mapdl.et(1, "SHELL181")
- # enable Laminate
- mapdl.run("KEYOPT,1,8,1")
- # define Laminate
- mapdl.run("SECT, 1, SHELL")
- # secdata, Thickness ,MatId,theta,Number of integration points in layer
- if len(angles) != len(materials):
- for i in range(0, len(angles)):
- mapdl.secdata(layer_thickness, 1, angles[i], 3)
- else:
- for i in range(0, len(angles)):
- mapdl.secdata(layer_thickness, i + 1, angles[i], 3)
- # Shell node will be offset to midplane of the section
- mapdl.secoffset("MID")
- mapdl.run("seccontrol,,,,,,,")
- mapdl.run("/ESHAPE,1.0")
- # define Geometry
- # change global coordinate system to cylindric system
- mapdl.csys(1)
- mapdl.cyl4(0, 0, inner_diameter / 2, 0, outer_diameter / 2, 180)
- mapdl.cyl4(0, 0, inner_diameter / 2, 180, outer_diameter / 2, 360)
- mapdl.nsel("S", "LOC", "Y", 0)
- mapdl.nummrg("ALL")
- mapdl.nsel("S", "LOC", "Y", 180)
- mapdl.nummrg("ALL")
- mapdl.lsel("S", "", "", 1, 7, 2)
- mapdl.lesize("ALL", "", "", 20)
- mapdl.lsel("S", "", "", 2, 4, 2)
- mapdl.lesize("ALL", "", "", 20)
- mapdl.lsel("ALL")
- # mapdl.aplot()
- mapdl.mshape(0, "2D") # quadratic 2D Shapes
- mapdl.mshkey(1) # 0-free meshing
- mapdl.amesh("ALL")
- # mapdl.eplot()
- mapdl.run("/SOLU")
- mapdl.omega("", "", omega) # [rad/s] Winkelgeschwindigkeit(+: gegen Uhrzeigersinn))
- mapdl.nsel("S", "LOC", "X", inner_diameter / 2)
- mapdl.d("ALL", "UX", 0)
- mapdl.d("ALL", "UY", 0)
- mapdl.d("ALL", "UZ", 0)
- mapdl.d("ALL", "ROTX", 0)
- mapdl.d("ALL", "ROTY", 0)
- mapdl.d("ALL", "ROTZ", 0)
- mapdl.run("ALLS")
- mapdl.outres("ALL", "ALL")
- # mapdl.open_gui()
- mapdl.solve()
- mapdl.finish()
- #mapdl.post1()
- #mapdl.open_gui()
- # plot_rotor(mapdl)
- # access results using ANSYS object
- resultfile = os.getcwd() + '\\ws\\file.rst'
- result = pyansys.read_binary(resultfile)
- # result = mapdl.result
- result.plot_principal_nodal_stress(0, 'EQV')
- # plot_nodal_solution doesnt work
- nodenum, stress = result.principal_nodal_stress(0)
- # von Mises stress is the last column
- # must be nanmax as the shell element stress is not recorded
- maxstress = np.nanmax(stress[:, -1])
- mapdl.exit()
- return maxstress
- print(sim_rotor(
- [{
- "e11": 42.5,
- "e22": 11,
- "e33": 11,
- "pr12": 0.28,
- "pr13": 0.28,
- "pr23": 0.28,
- "dens": 1950E-6,
- "g12": 4.2,
- "g13": 4.2,
- "g23": 2.56,
- "alp11": 5.7E-6,
- "alp22": 45E-6,
- "alp33": 45E-6,
- "k11": 0.72E3,
- "k22": 0.5E3,
- "k33": 0.5E3,
- "bet11": 0E-3,
- "bet22": 4E-3,
- "bet33": 4E-3,
- "d11": 4.4E3,
- "d22": 3.1E3,
- "d33": 3.1E3
- }], [90, 0, 0, 0, 0, 0]))
|