分享 fortran調(diào)用ansys做桁架結(jié)構(gòu)優(yōu)化例子
瀏覽:46795 評論:2
ANSYS命令流部分:
/clear
B=1000 !基本尺寸
!進(jìn)入PREP7并建模
/PREP7
*dim,A,,3,1 !定義一個3*1的數(shù)組
*VREAD,A,E:\PROJECTS\TRUSS\trussdata_1,txt,,IJK,3,1 !IJK表示讀入的順序
(F7.2)
A1=A(1,1)
A2=A(2,1)
A3=A(3,1)
*cfopen,E:\PROJECTS\TRUSS\trussdata_3,txt
*vwrite,A1,A2,A3
(F7.2,/F7.2,/F7.2)
*cfclos
ET,1,LINK1 !二維桿單元
R,1,A1 !以參數(shù)形式的實(shí)參
R,2,A2
R,3,A3
MP,EX,1,2.1E6 !楊氏模量
N,1,-B,0,0 !定義結(jié)點(diǎn)
N,2,0,0,0
N,3,B,0,0
N,4,0,-B,0
E,1,4 !定義單元
REAL,2
E,2,4
REAL,3
E,3,4
FINISH
!
!進(jìn)入求解器,定義載荷和求解
/SOLU
D,1,ALL,0,,3 !結(jié)點(diǎn)UX=UY=0
F,4,FX,200000 !結(jié)點(diǎn)4上的X方向載荷分量(工況1)
F,4,FY,-200000 !結(jié)點(diǎn)4上的Y方向載荷分量(工況2)
SOLVE
FINISH
!進(jìn)入POST1并讀出狀態(tài)變量數(shù)值
/POST1
SET,LAST
ETABLE,EVOL,VOLU !將每個單元的體積放入ETABLE
SSUM !將單元表格內(nèi)數(shù)據(jù)求和
*GET,VTOT,SSUM,,ITEM,EVOL !VTOT=總體積
RHO=2.85E-4
WT=RHO*VTOT !計(jì)算總體積
ETABLE,SIG,LS,1 !將軸向應(yīng)力放入ETABLE
*GET,SIG1,ELEM,1,ETAB,SIG !SIG1=第一個單元的軸向應(yīng)力
*GET,SIG2,ELEM,2,ETAB,SIG !SIG2=第二個單元的軸向應(yīng)力
SIG1=ABS(SIG1) !計(jì)算軸向應(yīng)力的絕對值
SIG2=ABS(SIG2)
!/ESHAPE,2 !以實(shí)體單元模式顯示殼單元
!/VIEW,1,1,1,1 !軸測視圖
!EPLOT !畫單元
FINISH
*cfopen,E:\PROJECTS\TRUSS\trussdata_2,txt
*vwrite,SIG1,SIG2,WT
(F7.2,/F7.2,/F7.2)
*cfclos
FORTRAN程序部分:
PROGRAM TRUSS
USE DFLIB
IMPLICIT NONE
character(len=20) :: filename1="trussdata_2.txt"
character(len=20) :: filename2="trussdata_1.txt"
REAL,parameter :: e=0.01 !e為計(jì)算精度
REAL,parameter :: xu=400 !xu為許用應(yīng)力
INTEGER :: fileid,k
INTEGER i
LOGICAL(4) result
REAL u1(50),u2(50),ww(50),umax !u1,u2為應(yīng)力比,umax為最大應(yīng)力
REAL sig1,sig2,W,ap !sig1為桿1的最大應(yīng)力,sig2為桿2的最大應(yīng)力
REAL x1(50),x2(50),xx1,xx2 !x為桿截面面積
i=1
k=1
x1(1)=707 !定義桿的初始值
x2(1)=707
ap=10
DO WHILE( ap>=e )
!調(diào)用 ANSYS做結(jié)構(gòu)分析
result=SYSTEMQQ('C:\Ansys81\v81\ANSYS\bin\intel\ANSYS81 -b -p &
& ane3fl -i E:\ANSYSOBJECT\truss.txt -o E:\ANSYSOBJECT\trussanswer.txt')
fileid=10
open(fileid,file=filename1) !從ansys寫出的文件中讀入數(shù)據(jù)(應(yīng)力和求得的重量)
read(fileid,*) sig1,sig2,W
close(fileid)
ww(k)=w
u1(i)=sig1/xu
u2(i)=sig2/xu
if ( u1(i)>=u2(i) ) then !判斷最大應(yīng)力
umax=u1(i)
else
umax=u2(i)
end if
!射線步
x1(i+1)=umax*x1(i)
x2(i+1)=umax*x2(i)
u1(i+1)=u1(i)/umax !求出新的應(yīng)力比
u2(i+1)=u2(i)/umax
!調(diào)整步
x1(i+2)=u1(i+1)*x1(i+1)
x2(i+2)=u2(i+1)*x2(i+1)
xx1=x1(i+2)/(500.0*1.414)
xx2=x2(i+2)/(500.0*1.414)
fileid=20
open(fileid,file=filename2) !
write(fileid,"(A3,F7.2,/A3,F7.2,/A3,F7.2)") "A1=",x1(i+2),"A2=",x2(i+2),"A3=",x1(i+2)
close(fileid)
if ( i>=3) then
if ( ww(k)-ww(k-1)>0 ) then
write(*,"(A3,F7.2,/A3,F7.2,/A3,F7.2)") "A1=",x1(i),"A2=",x2(i),"A3=",x1(i)
write(*,*) ww(k),ww(k-1)
pause
end if
end if
i=i+2
if ( i>=5 ) then !ap為精度控制
ap=sqrt((x1(i+1)-x1(i-1))**2+(x2(i+1)-x2(i-1))**2)
end if
k=k+1
END DO
STOP
END
/clear
B=1000 !基本尺寸
!進(jìn)入PREP7并建模
/PREP7
*dim,A,,3,1 !定義一個3*1的數(shù)組
*VREAD,A,E:\PROJECTS\TRUSS\trussdata_1,txt,,IJK,3,1 !IJK表示讀入的順序
(F7.2)
A1=A(1,1)
A2=A(2,1)
A3=A(3,1)
*cfopen,E:\PROJECTS\TRUSS\trussdata_3,txt
*vwrite,A1,A2,A3
(F7.2,/F7.2,/F7.2)
*cfclos
ET,1,LINK1 !二維桿單元
R,1,A1 !以參數(shù)形式的實(shí)參
R,2,A2
R,3,A3
MP,EX,1,2.1E6 !楊氏模量
N,1,-B,0,0 !定義結(jié)點(diǎn)
N,2,0,0,0
N,3,B,0,0
N,4,0,-B,0
E,1,4 !定義單元
REAL,2
E,2,4
REAL,3
E,3,4
FINISH
!
!進(jìn)入求解器,定義載荷和求解
/SOLU
D,1,ALL,0,,3 !結(jié)點(diǎn)UX=UY=0
F,4,FX,200000 !結(jié)點(diǎn)4上的X方向載荷分量(工況1)
F,4,FY,-200000 !結(jié)點(diǎn)4上的Y方向載荷分量(工況2)
SOLVE
FINISH
!進(jìn)入POST1并讀出狀態(tài)變量數(shù)值
/POST1
SET,LAST
ETABLE,EVOL,VOLU !將每個單元的體積放入ETABLE
SSUM !將單元表格內(nèi)數(shù)據(jù)求和
*GET,VTOT,SSUM,,ITEM,EVOL !VTOT=總體積
RHO=2.85E-4
WT=RHO*VTOT !計(jì)算總體積
ETABLE,SIG,LS,1 !將軸向應(yīng)力放入ETABLE
*GET,SIG1,ELEM,1,ETAB,SIG !SIG1=第一個單元的軸向應(yīng)力
*GET,SIG2,ELEM,2,ETAB,SIG !SIG2=第二個單元的軸向應(yīng)力
SIG1=ABS(SIG1) !計(jì)算軸向應(yīng)力的絕對值
SIG2=ABS(SIG2)
!/ESHAPE,2 !以實(shí)體單元模式顯示殼單元
!/VIEW,1,1,1,1 !軸測視圖
!EPLOT !畫單元
FINISH
*cfopen,E:\PROJECTS\TRUSS\trussdata_2,txt
*vwrite,SIG1,SIG2,WT
(F7.2,/F7.2,/F7.2)
*cfclos
FORTRAN程序部分:
PROGRAM TRUSS
USE DFLIB
IMPLICIT NONE
character(len=20) :: filename1="trussdata_2.txt"
character(len=20) :: filename2="trussdata_1.txt"
REAL,parameter :: e=0.01 !e為計(jì)算精度
REAL,parameter :: xu=400 !xu為許用應(yīng)力
INTEGER :: fileid,k
INTEGER i
LOGICAL(4) result
REAL u1(50),u2(50),ww(50),umax !u1,u2為應(yīng)力比,umax為最大應(yīng)力
REAL sig1,sig2,W,ap !sig1為桿1的最大應(yīng)力,sig2為桿2的最大應(yīng)力
REAL x1(50),x2(50),xx1,xx2 !x為桿截面面積
i=1
k=1
x1(1)=707 !定義桿的初始值
x2(1)=707
ap=10
DO WHILE( ap>=e )
!調(diào)用 ANSYS做結(jié)構(gòu)分析
result=SYSTEMQQ('C:\Ansys81\v81\ANSYS\bin\intel\ANSYS81 -b -p &
& ane3fl -i E:\ANSYSOBJECT\truss.txt -o E:\ANSYSOBJECT\trussanswer.txt')
fileid=10
open(fileid,file=filename1) !從ansys寫出的文件中讀入數(shù)據(jù)(應(yīng)力和求得的重量)
read(fileid,*) sig1,sig2,W
close(fileid)
ww(k)=w
u1(i)=sig1/xu
u2(i)=sig2/xu
if ( u1(i)>=u2(i) ) then !判斷最大應(yīng)力
umax=u1(i)
else
umax=u2(i)
end if
!射線步
x1(i+1)=umax*x1(i)
x2(i+1)=umax*x2(i)
u1(i+1)=u1(i)/umax !求出新的應(yīng)力比
u2(i+1)=u2(i)/umax
!調(diào)整步
x1(i+2)=u1(i+1)*x1(i+1)
x2(i+2)=u2(i+1)*x2(i+1)
xx1=x1(i+2)/(500.0*1.414)
xx2=x2(i+2)/(500.0*1.414)
fileid=20
open(fileid,file=filename2) !
write(fileid,"(A3,F7.2,/A3,F7.2,/A3,F7.2)") "A1=",x1(i+2),"A2=",x2(i+2),"A3=",x1(i+2)
close(fileid)
if ( i>=3) then
if ( ww(k)-ww(k-1)>0 ) then
write(*,"(A3,F7.2,/A3,F7.2,/A3,F7.2)") "A1=",x1(i),"A2=",x2(i),"A3=",x1(i)
write(*,*) ww(k),ww(k-1)
pause
end if
end if
i=i+2
if ( i>=5 ) then !ap為精度控制
ap=sqrt((x1(i+1)-x1(i-1))**2+(x2(i+1)-x2(i-1))**2)
end if
k=k+1
END DO
STOP
END
技術(shù)鄰APP
工程師必備
工程師必備
- 項(xiàng)目客服
- 培訓(xùn)客服
- 平臺客服
TOP
2




















