8节点等参单元 有限元程序.docx

上传人:b****7 文档编号:9737949 上传时间:2023-02-06 格式:DOCX 页数:17 大小:17.71KB
下载 相关 举报
8节点等参单元 有限元程序.docx_第1页
第1页 / 共17页
8节点等参单元 有限元程序.docx_第2页
第2页 / 共17页
8节点等参单元 有限元程序.docx_第3页
第3页 / 共17页
8节点等参单元 有限元程序.docx_第4页
第4页 / 共17页
8节点等参单元 有限元程序.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

8节点等参单元 有限元程序.docx

《8节点等参单元 有限元程序.docx》由会员分享,可在线阅读,更多相关《8节点等参单元 有限元程序.docx(17页珍藏版)》请在冰豆网上搜索。

8节点等参单元 有限元程序.docx

8节点等参单元有限元程序

programstress

!

character*64fname1,fname2

dimensionake(16,16)

dimensionld(1000),is(16),a(30000)

common/sol1/nn,ne,nm,nc

common/sol2/nf,nd,n,nfd

common/shu1/mea(200,9)

common/shu2/x(1000),y(1000)

common/shu3/aeu(10,3)

common/shu4/p(1000)

common/shu5/jz(1000,2)

!

write(*,'(a22)')'inputdatafile:

'

!

read(*,'(a)')fname1

!

write(*,'(a22)')'outputdatafile:

'

!

read(*,'(a)')fname2

open(1,file='fname1_re1.txt')

open(2,file='fname2_re2.txt')

read(1,*)nn,ne,nm,nc

nf=2

nd=8

nfd=nf*nd

n=nn*nf

do50i=1,nn

50read(1,*)k,x(i),y(i),p(2*i-1),p(2*i)

read(1,*)((jz(i,j),j=1,2),i=1,nc)

do100i=1,ne

read(1,*)ie,(mea(i,j),j=1,9)

100continue

read(1,*)((aeu(i,j),j=1,3),i=1,nm)

!

400format(4i5)

!

405format(i5,4f15.6)

!

410format(5x,i5,5x,i5)

!

415format(5x,i5,5x,9i5)

!

420format(3f15.6)

write(2,460)nn,ne,nm,nc

write(2,465)(i,x(i),y(i),p(2*i-1),p(2*i),i=1,nn)

write(2,470)((jz(i,j),j=1,2),i=1,nc)

write(2,475)(i,(mea(i,j),j=1,9),i=1,ne)

write(2,480)(i,(aeu(i,j),j=1,3),i=1,nm)

460format(/5x,'总的节点数,单元数,材料数,约束数'//(10x,4i5))

465format(/5x,'节点号',5x,'横坐标',5x,'纵坐标',5x,'节点载荷'//(5x,i5,4f15.6))

470format(/5x,'约束节点号及节点类型'//(5x,i5,5x,i5))

475format(/'节点编号矩阵:

单元号',15x,'八个节点的整体编号',12x,'材料号'//(10x,i5,8i5,5x,i5))

480format(/3x,'材料的材料号',5x,'杨氏模量',10x,'泊松比',10x,'厚度'//(5x,i5,5x,3e15.6))

callfld(nt,ld)

do500i=1,nt

500a(i)=0

do600ie=1,ne

callke(ie,ake)

callfis(ie,is)

do560i=1,nfd

do560j=1,nfd

if(is(i)-is(j))560,520,520

520ni=is(i)

ij=ld(ni)-ni+is(j)

a(ij)=a(ij)+ake(i,j)

560continue

600continue

callfcc(nt,ld,a)

calldecom(nt,a,ld)

!

write(*,*)'kakka'

write(2,850)(i,p(2*i-1),p(2*i),i=1,nn)

!

write(*,*)'kakka'

callstr

!

write(*,*)'kakka'

850format(//25x,'节点位移'//5x,'nodeno.',12x,'u',12x,'v',/(7x,i5,2e15.7))

end

!

c应力输出子程序

subroutinestr

common/sol1/nn,ne,nm,nc

common/shu3/aeu(10,3)

common/shu4/p(1000)

common/bmdmp/bmatx(3,16),dmatx(3,3)

common/shu1/mea(200,9)

dimensions(3,16),st(3),ve(16),is(16)

dimensionss(8),tt(8)

datass/-1,1,1,-1,0,1,0,-1/

datatt/-1,-1,1,1.,-1,0,1,0/

callzero(3,3,dmatx)

callzero(3,16,bmatx)

do800ie=1,ne

write(2,850)ie

nm1=mea(ie,9)

yong=aeu(nm1,1)

poiss=aeu(nm1,2)

thick=aeu(nm1,3)

callmodps(yong,poiss)

callfis(ie,is)

do750i=1,16

ni=is(i)

ve(i)=p(ni)

750continue

do300i=1,8

exisp=ss(i)

etasp=tt(i)

k=mea(ie,i)

callsfr2(exisp,etasp)

calljacob2(ie,djacb)

callbmatps

calldot(3,3,16,dmatx,bmatx,s)

calldot(3,16,1,s,ve,st)

write(2,880)i,k,st

(1),st

(2),st(3)

c1=(st

(1)+st

(2))/2.0

c2=sqrt((st

(1)-st

(2))**2/4.0+st(3)**2)

psi=c1+c2

psj=c1-c2

s1=amax1(psi,psj,0.0)

s3=amin1(psi,psj,0.0)

s2=st

(1)+st

(2)-s1-s3

!

write(*,*)s1,s2,s3

c3=(s1-s2)**2+(s2-s3)**2+(s1-s3)**2

seq4=sqrt(c3/2.0)

!

write(2,*)seq4

300continue

800continue

880format(i5,5x,i5,5x,f15.5,5x,f15.5,5x,f15.5)

850format(//10x,'第',i3,'个单元的节点应力'/2x,'局部编号',2x,'整体编号',5x,'u方向应力',12x,'v方向应力',12x,'剪应力')

return

end

!

c这是一个形成局部编号与整体编号对应关系is数组的子程序

SUBROUTINEFIS(IE,IS)

common/shu1/mea(200,9)

common/sol2/nf,nd,n,nfd

dimensionis(nfd)

DO150ID=1,ND

DO100JF=1,NF

I1=(ID-1)*NF+JF

IS(I1)=(MEA(IE,ID)-1)*NF+JF

100CONTINUE

150CONTINUE

RETURN

END

!

c这是一个形成变带宽存储指示数组ld的子程序

SUBROUTINEFLD(NT,LD)

common/sol1/nn,ne,nm,nc

common/sol2/nf,nd,n,nfd

common/shu1/mea(200,9)

dimensionld(n)

LD

(1)=1

DO300K=1,NN

NMIN=1000

DO200I=1,NE

DO150J=1,ND

IF(MEA(I,J).NE.K)GOTO150

DO100L=1,ND

IF(MEA(I,L).LT.NMIN)NMIN=MEA(I,L)

100CONTINUE

150CONTINUE

200CONTINUE

DO250I=1,NF

J=(K-1)*NF+I

IF(J.NE.1)LD(J)=LD(J-1)+(K-NMIN)*NF+I

250CONTINUE

300CONTINUE

NT=LD(N)

RETURN

END

!

c这是一个处理约束的子程序

SUBROUTINEFCC(NT,LD,A)

common/sol1/nn,ne,nm,nc

common/sol2/nf,nd,n,nfd

common/shu5/jz(1000,2)

dimensionld(n),a(nt)

DO350K=1,NC

I=JZ(K,1)

J=JZ(K,2)

NI=(I-1)*NF+J

NJ=LD(NI)

A(NJ)=1.0E25

350CONTINUE

RETURN

END

!

c这是一个解线性方程组的子程序

SUBROUTINEDECOM(NT,A,LD)

common/shu4/p(1000)

common/sol2/nf,nd,n,nfd

dimensiona(nt),ld(n)

DO20I=1,N

LDI=LD(I)

IF(I.EQ.1)GOTO10

IO=LDI-I

IM1=I-1

MI=1-IO+LD(IM1)

IF(MI.GT.IM1)GOTO10

DO8J=MI,IM1

JO=LD(J)-J

IJ=IO+J

IF(J.EQ.1)GOTO6

JM1=J-1

MJ=1-JO+LD(JM1)

MIJ=MAX0(MI,MJ)

IF(MIJ.GT.JM1)GOTO6

S=0.0

DO2K=MIJ,JM1

IK=IO+K

JK=JO+K

S=S+A(IK)*A(JK)

2CONTINUE

A(IJ)=A(IJ)-S

6p(I)=p(I)-A(IJ)*p(J)

8CONTINUE

10ALDI=A(LDI)

IF(I.EQ.1.OR.MI.GT.IM1)GOTO13

DO12J=MI,IM1

IJ=IO+J

LDJ=LD(J)

S=A(IJ)

A(IJ)=S/A(LDJ)

ALDI=ALDI-S*A(IJ)

12CONTINUE

13A(LDI)=ALDI

p(I)=p(I)/ALDI

20CONTINUE

DO40LDI=2,N

I=N-LDI+2

IO=LD(I)-I

MI=1-IO+LD(I-1)

IM1=I-1

IF(MI.GT.IM1)GOTO40

DO30J=MI,IM1

IJ=IO+J

p(J)=p(J)-A(IJ)*p(I)

30CONTINUE

40CONTINUE

RETURN

END

!

c这是一个形成单元刚度矩阵的子程序

subroutineke(ie,ake)

dimensionposgp

(2)

common/sol1/nn,ne,nm,nc

common/bmdmp/bmatx(3,16),dmatx(3,3)

common/shu3/aeu(10,3)

common/shu1/mea(200,9)

common/shu2/x(1000),y(1000)

dimensionbt(16,3),bd(16,3)

dimensionake(16,16),ake1(16,16)

posgp

(1)=-0.5773502692

posgp

(2)=0.5773502692

nm1=mea(ie,9)

young=aeu(nm1,1)

poiss=aeu(nm1,2)

thick=aeu(nm1,3)

callmodps(young,poiss)

callzero(16,16,ake)

do80iagus=1,2

do80jagus=1,2

exisp=posgp(iagus)

etasp=posgp(jagus)

callsfr2(exisp,etasp)

calljacob2(ie,djacb)

callbmatps

calltran(3,16,bmatx,bt)

calldot(16,3,3,bt,dmatx,bd)

calldot(16,3,16,bd,bmatx,ake1)

do70i=1,16

do70j=1,16

70ake(i,j)=ake(i,j)+djacb*thick*ake1(i,j)

80continue

!

write(2,*)ie

!

do90i=1,16

!

write(*,*)ie

!

write(2,10)(ake(i,j),j=1,16)

!

90continue

!

10format(16e15.3)

return

end

!

c这是一个形成弹性矩阵的子程序

subroutinemodps(y,p)

common/bmdmp/bmatx(3,16),dmatx(3,3)

callzero(3,3,dmatx)

!

write(*,*)y,p

const=y/(1.0-p*p)

dmatx(1,1)=const

dmatx(2,2)=const

dmatx(1,2)=const*p

dmatx(2,1)=dmatx(1,2)

dmatx(3,3)=const*(1.0-p)/2.0

!

do100i=1,3

!

write(*,*)(dmatx(i,j),j=1,3)

!

100continue

return

end

!

c这是一个计算形函数当前积分点及形函数对局部坐标的导数值的子程序

subroutinesfr2(s,t)

common/sd/sh(8),deriv(2,8)

s2=s*2.0

t2=t*2.0

ss=s*s

tt=t*t

st=s*t

stt=s*t*t

sst=s*s*t

st2=s*t*2.0

sh

(1)=(-1.0+st+ss+tt-sst-stt)/4.0

sh

(2)=(-1.0-st+ss+tt-sst+stt)/4.0

sh(3)=(-1.0+st+ss+tt+sst+stt)/4.0

sh(4)=(-1.0-st+ss+tt+sst-stt)/4.0

sh(5)=(1.0-t-ss+sst)/2.0

sh(6)=(1.0+s-tt-stt)/2.0

sh(7)=(1.0+t-ss-sst)/2.0

sh(8)=(1.0-s-tt+stt)/2.0

deriv(1,1)=(t+s2-st2-tt)/4.0

deriv(1,2)=(-t+s2-st2+tt)/4.0

deriv(1,3)=(t+s2+st2+tt)/4.0

deriv(1,4)=(-t+s2+st2-tt)/4.0

deriv(1,5)=-s+st

deriv(1,6)=(1.0-tt)/2.0

deriv(1,7)=-s-st

deriv(1,8)=(-1.0+tt)/2.0

deriv(2,1)=(s+t2-ss-st2)/4.0

deriv(2,2)=(-s+t2-ss+st2)/4.0

deriv(2,3)=(s+t2+ss+st2)/4.0

deriv(2,4)=(-s+t2+ss-st2)/4.0

deriv(2,5)=(-1.0+ss)/2.0

deriv(2,6)=-t-st

deriv(2,7)=(1.0-ss)/2.0

deriv(2,8)=-t+st

return

end

!

c这是一个形成jacobi矩阵的子程序

subroutinejacob2(ie,djacb)

dimensionxjacm(2,2),xjaci(2,2)

common/sd/sh(8),deriv(2,8)

common/car/cartd(2,8)

common/shu1/mea(200,9)

common/shu2/x(1000),y(1000)

do200j=1,2

xjacm(1,j)=0.0

xjacm(2,j)=0.0

do200k=1,8

if(j.eq.1)then

xjacm(1,j)=xjacm(1,j)+deriv(1,k)*x(mea(ie,k))

xjacm(2,j)=xjacm(2,j)+deriv(2,k)*x(mea(ie,k))

else

xjacm(1,j)=xjacm(1,j)+deriv(1,k)*y(mea(ie,k))

xjacm(2,j)=xjacm(2,j)+deriv(2,k)*y(mea(ie,k))

endif

200continue

djacb=xjacm(1,1)*xjacm(2,2)-xjacm(1,2)*xjacm(2,1)

!

write(*,*)xjacm(1,1),xjacm(1,2),xjacm(2,1),xjacm(2,2)

!

write(*,*)ie

!

write(*,*)djacb

if(djacb.lt.1.e-6)then

write(6,6100)ie

6100format('单元编号为:

',i4,'的jcobi行列式的值小于或等于零!

')

stop'程序运行被中断于子程序jacob2'

endif

xjaci(1,1)=xjacm(2,2)/djacb

xjaci(2,2)=xjacm(1,1)/djacb

xjaci(1,2)=-xjacm(1,2)/djacb

xjaci(2,1)=-xjacm(2,1)/djacb

do300i=1,2

do300k=1,8

cartd(i,k)=0.0

do300j=1,2

cartd(i,k)=cartd(i,k)+xjaci(i,j)*deriv(j,k)

300continue

return

end

!

c这是一个形成应变矩阵的子程序

subroutinebmatps

common/car/cartd(2,8)

common/bmdmp/bmatx(3,16),dmatx(3,3)

callzero(3,16,bmatx)

ngash=0

do200i=1,8

mgash=ngash+1

ngash=mgash+1

bmatx(1,mgash)=cartd(1,i)

bmatx(1,ngash)=0.0

bmatx(2,mgash)=0.0

bmatx(2,ngash)=cartd(2,i)

bmatx(3,mgash)=cartd(2,i)

bmatx(3,ngash)=cartd(1,i)

200continue

return

end

SUBROUTINEZERO(M,N,A)

DIMENSIONA(M,N)

DO10I=1,M

DO10J=1,N

A(I,J)=0.0

10CONTINUE

RETURN

END

SUBROUTINETRAN(M,N,A,B)

DIMENSIONA(M,N),B(N,M)

DO20I=1,M

DO20J=1,N

B(J,I)=A(I,J)

20CONTINUE

RETURN

END

SUBROUTINEDOT(M,N,L,A,B,C)

DIMENSIONA(M,N),B(N,L),C(M,L)

DO50I=1,M

DO50J=1,L

C(I,J)=0.0

DO40K=1,N

C(I,J)=C(I,J)+A(I,K)*B(K,J)

40CONTINUE

50CONTINUE

RETURN

END

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1