c 直交異方性材料の直方体構造物を、直方六面体(ソリッド)要素の
c 線形/弾性の剛性行列で解くプログラム。剛性行列は、
c Robert J. Melesh, Strucutural Analysis of Solids,
c Jornal of the Structural Division, ASCE,
c Vol. 89, No. ST4, 1963, pp. 205-223
c にあるものを用いた。但し、印刷ミスと思われる以下の箇所について、
c p.209: K11(6,5)の+2d'(5,5)を+2d(5,5)に
c p.209: K11(6,8)の-4d'(5,5)を-4d(5,5)に
c p.209: K22(3,1)の+4d(4,4)を+d(4,4)に
c p.210: K33(5,4)の-d'(6,6)を+d'(6,6)に
c p.211: K31左(8,1)の2を-2に
c p.211: k31左(8,4)の-1を-2に
c それぞれ修正した(対応箇所についてはプログラム中にも注意を書いた)
c
c 02/8/5版(tyoku.fをスカイライン化)
c プログラムを作った人:後藤文彦
c 改造などは自由ですが、もとのプログラムが、
c http://gthmhk.virtualave.net/programoj/tyoku/tyokus.f
c であることをプログラム中に明記して戴けると嬉しいです。
c バグの報告は、
c http://gthmhk.virtualave.net/denbin.html
c にお願いします。
c
program tyokus
implicit real*8 (a-h, o-z)
dimension bc(7000*3),f(7000*3),e66(6,6),
& d(7000*3),ngame(100),nfair(100),
& kkaisi(7000),kryou(7000),bu(7000),bv(7000),bw(7000),
& lkaisi(7000),lryou(7000),fx(7000),fy(7000),fz(7000),
& sm(3,3,8,8),n8(8),imx(7000*3),
& su(25000000), sl(25000000), stu(25000000), stl(25000000),
& mksky(25000000),mkx(7000)
c 配列の最大サイズ:nmax
nmax=25000000
c スカイラインの1次元配列のサイズは、同じ自由度数でも要素分割
c に依存するので、自由度数から一意には決められない。
c mage.f の要素分割のやり方だと、軸長(z軸)の分割数がxy断面
c の分割数に比べて多いとスパース部分が増える。
c 仮にスパース部分が皆無だったとすると
c およそ自由度×自由度/2のサイズになるが、こんなサイズは想定外。
c 取り敢えず、7000を最大節点数、その3倍を最大自由度数にしておく。
c 具体的な要素分割例としては、(縦+1)×(横+1)×(軸長+1)が、
c (5+1)*(9+1)*(99+1)=7000,(14+1)*(19+1)*(19+1)=7000 など。
c mage.f の曲げ問題で幅(半解析だから幅の半分)×高さ×軸長が
c 1*(8〜20)*(50〜100)ぐらいの範囲のものを解く場合、有効数字3桁
c の収束解が得られる要素分割数は 6分割×10分割×100分割ぐらい。
c そういうでかいのは tyokum.f
c (http://gthmhk.virtualave.net/programoj/tyoku/tyokum.f)
c で解いて下さい。
c 幅(の半分)に対して桁高が10倍以上高い場合は、幅の分割数は
c 1 でもいいぐらいかも。
c
c 梁の断面の横の長さ:yoko, 縦の長さ:tate
read(*,*) yoko
read(*,*) tate
c 梁の軸長:ziku
read(*,*) ziku
c
a=yoko*tate
xi=yoko*tate**3/12.d0
yi=tate*yoko**3/12.d0
c 断面横方向の要素分割数:nx
read(*,*) nx
c 一要素の横の長さの半分:yoko1
yoko1=yoko/float(nx)/2.d0
c 断面縦方向の要素分割数:ny
read(*,*) ny
c 一要素の縦の長さの半分:tate1
tate1=tate/float(ny)/2.d0
c 軸方向の要素分割数:nz
read(*,*) nz
c 一要素の軸長の半分:ziku1
ziku1=ziku/float(nz)/2.d0
c
c 要素数:nyou
nyou=nx*ny*nz
c 節点数:nset
nset=(nx+1)*(ny+1)*(nz+1)
c 自由度数:nziyuu
nziyuu=nset*3
c
c ****** 境界条件 *******
do 100 i=1, nziyuu
bc(i)=1.d0
100 continue
read(*,*) kkasyo
do 110 i=1,kkasyo
read(*,*) kkaisi(i)
read(*,*) kryou(i)
read(*,*) bu(i)
read(*,*) bv(i)
read(*,*) bw(i)
do 110 j=kkaisi(i)-1, kryou(i)-1
bc(3*j+1)=bu(i)
bc(3*j+2)=bv(i)
bc(3*j+3)=bw(i)
110 continue
c ****** 載荷条件 *******
do 120 i=1, nziyuu
f(i)=0.d0
120 continue
read(*,*) lkasyo
do 130 i=1,lkasyo
read(*,*) lkaisi(i)
read(*,*) lryou(i)
read(*,*) fx(i)
read(*,*) fy(i)
read(*,*) fz(i)
do 130 j=lkaisi(i)-1, lryou(i)-1
f(3*j+1)=fx(i)
f(3*j+2)=fy(i)
f(3*j+3)=fz(i)
130 continue
c 応力−ひずみ行列:e66
c 最初は、e66の3*3のところに、ひずみ−応力行列を読み込む
call zeromx(6,e66)
do 140 i=1,3
do 140 j=1,3
read(*,*) e66(i,j)
140 continue
c で、ヤング率やポアソン比を書き写してから
exx=1.d0/e66(1,1)
eyy=1.d0/e66(2,2)
ezz=1.d0/e66(3,3)
poixy=-e66(1,2)*exx
poixz=-e66(1,3)*exx
poiyz=-e66(2,3)*eyy
c 逆行列を取って、応力−ひずみ行列に変換する
call gyaku(e66)
c せん断弾性係数を読み込む
read(*,*) e66(4,4)
read(*,*) e66(5,5)
read(*,*) e66(6,6)
c 一応、せん断弾性係数も書き写しておく
gxy=e66(4,4)
gxz=e66(5,5)
gyz=e66(6,6)
c 荷重増分:dp
read(*,*) dp
c
c 出力条件:
c 比較のために出力したい梁−柱理論値:nhikak
c nhikak=1: w 方向の伸びを出力
c
read(*,*) nhikak
c 変位を画面出力したい節点の数:ngamen
read(*,*) ngamen
c 変位を画面出力したい節点の節点番号:ngame(i)
do 200 i=1,ngamen
read(*,*) ngame(i)
200 continue
c 変位をファイル出力したい節点の数:nfairu
read(*,*) nfairu
c 変位をファイル出力したい節点の節点番号:nfair(i)
do 210 i=1,nfairu
read(*,*) nfair(i)
210 continue
c
c 増分ステップ数:nstep
read(*,*) nstep
c
c ***********データ入力終わり***********
c
c
c Melesh(1963)の剛性行列をsmに書き込む
call melesh(yoko1,tate1,ziku1,e66,sm)
c
c まずは、スカイラインの概形をmkskyに書き込む
mkx(1)=1
do 980 i=1,nset-1
mkx(i+1)=mkx(i)+i
980 continue
c
lasto=mkx(nset)+nset-1
write(*,*) ' 節点数(<7000)=',nset
write(*,*) ' 自由度数(<21000)=',nziyuu
write(*,*) ' スカイライン整形配列サイズ(<25000000)=',lasto
if(lasto.gt.nmax) then
write(*,*) ' スカイライン整形配列が大きすぎます'
stop
endif
c
do 990 i=1,nset
do 990 j=1,nset
ij=mkx(j)+j-i
mksky(ij)=0
990 continue
c
do 1000 k=1,nz
do 1000 j=1,ny
do 1000 i=1,nx
n8(8)=(nx+1)*(ny+1)*(k-1)+(nx+1)*(j-1)+i
n8(4)=n8(8)+1
n8(7)=n8(8)+(nx+1)
n8(3)=n8(7)+1
n8(5)=n8(8)+(nx+1)*(ny+1)
n8(1)=n8(4)+(nx+1)*(ny+1)
n8(6)=n8(7)+(nx+1)*(ny+1)
n8(2)=n8(3)+(nx+1)*(ny+1)
c
do 1000 ii=1,8
do 1000 jj=1,8
n8ii=n8(ii)
n8jj=n8(jj)
if(n8ii.gt.n8jj) goto 1000
ij=mkx(n8jj)+n8jj-n8ii
mksky(ij)=1
1000 continue
c
c スカイラインの対角項番号をimxに書き込む
imx(1)=1
do 1001 j=1,nset
ifzumi=0
do 1001 i=1,j
ij=mkx(j)+j-i
if(ifzumi.eq.1) goto 1004
if(mksky(ij).eq.1) then
ifzumi=1
do 1002 k=1,3
n3=3*(j-1)+k
imx(n3+1)=imx(n3)+(j-i)*3+k
1002 continue
endif
1004 continue
if(ifzumi.eq.1) mksky(ij)=1
1001 continue
c
imxyz=imx(nziyuu)+nziyuu-1
write(*,*) ' スカイライン配列サイズ(<25000000)= 約',imxyz
if(imxyz.ge.nmax) then
write(*,*) 'imxyz(<25000000)=',imxyz
write(*,*) 'たぶん配列サイズが大きすぎます'
stop
endif
c
c 全要素のsmを、それぞれの要素の8節点の節点番号ごとに
c 割り振って上三角スカイラインsu,下三角スカイラインslに書き込む
do 220 i=1, imxyz
su(i)=0.d0
sl(i)=0.d0
220 continue
c
do 1003 k=1,nz
do 1003 j=1,ny
do 1003 i=1,nx
n8(8)=(nx+1)*(ny+1)*(k-1)+(nx+1)*(j-1)+i
n8(4)=n8(8)+1
n8(7)=n8(8)+(nx+1)
n8(3)=n8(7)+1
n8(5)=n8(8)+(nx+1)*(ny+1)
n8(1)=n8(4)+(nx+1)*(ny+1)
n8(6)=n8(7)+(nx+1)*(ny+1)
n8(2)=n8(3)+(nx+1)*(ny+1)
c
do 1003 ii=1,8
do 1003 jj=1,8
n8ii=n8(ii)
n8jj=n8(jj)
do 1003 l=1,3
do 1003 m=1,3
i24=(n8ii-1)*3 +l
j24=(n8jj-1)*3 +m
if(i24.le.j24) then
ij=imx(j24)+j24-i24
su(ij)=su(ij)+sm(l,m,ii,jj)
c if(i24.eq.j24) write(*,*) i24,j24,su(ij)
else
ij=imx(i24)+i24-j24
sl(ij)=sl(ij)+sm(l,m,ii,jj)
endif
1003 continue
c
c
c 境界条件を入れる
c su,slの中で定義されていないs(i,j)の空白部分を定義してはいけない
c 対角項以外
do 1100 i=1,nset
do 1100 j=i+1,nset
mij=mkx(j)+j-i
if(mksky(mij).eq.1) then
do 1103 l=1,3
do 1103 m=1,3
i3=(i-1)*3+l
j3=(j-1)*3+m
ij=imx(j3)+j3-i3
su(ij)=su(ij)*bc(i3)*bc(j3)
sl(ij)=sl(ij)*bc(i3)*bc(j3)
1103 continue
endif
1100 continue
c 対角項
do 1101 i=1,nset
do 1101 l=1,3
do 1101 m=l,3
i3=(i-1)*3+l
j3=(i-1)*3+m
ij=imx(j3)+j3-i3
su(ij)=su(ij)*bc(i3)*bc(j3)
sl(ij)=sl(ij)*bc(i3)*bc(j3)
1101 continue
c
c
do 1200 i=1,nziyuu
if( bc(i).lt.1.d-3) then
su(imx(i))=1.d0
f(i)=0.d0
end if
1200 continue
c
p=0.d0
open(8,file='uvw.out')
do 2000 l=1,nstep
p=p+dp
c solveで剛性方程式を解くとsu,slの中身が書き変わってしまうので
c stu,stlに置き換える。
do 2010 i=1,imxyz
stl(i)=sl(i)
stu(i)=su(i)
2010 continue
c 荷重項はstlの対角項に入れる
do 2020 i=1,nziyuu
stl(imx(i))=f(i)*p
2020 continue
c
c
c 剛性方程式を解く
call solve(stu,stl,imx,nziyuu)
do 2030 i=1,nziyuu
d(i)=stl(imx(i))
2030 continue
c
c 出力
c
do 3000 j=1,ngamen
nga=ngame(j)*3-3
write(*,*) '--------------------------------------------------'
write(*,*) '節点番号:',ngame(j)
goto (511,512,513), nhikak
511 write(*,125) ' f=',p,' PL/EA=',p*ziku/ezz/a
goto 599
512 continue
tawa=p*ziku**3/3.d0/ezz/xi
pk=(12.d0+11.d0*poiyz)/10.d0/(1.d0+poiyz)
ek=1.1d0+0.2d0*gyz/ezz
tawap=tawa+p*ziku/gyz/a*pk
tawae=tawa+p*ziku/gyz/a*ek
vk=gyz*a/p/ziku*(d(nga+2)-p*ziku**3/3.d0/ezz/xi)
tawav=tawa+p*ziku/gyz/a*vk
write(*,115) ' 1/κ(Poisson 比νから)=',pk
write(*,115) ' 1/κ( Ezz, Gyz から )=',ek
write(*,115) ' 1/κ(たわみv から逆算)=',vk
write(*,115) ' 荷重 f=',p
write(*,115) ' たわみ v(せん断無視の梁理論)=',tawa
write(*,115) ' たわみ v(νから せん断考慮)=',tawap
write(*,115) ' たわみ v(Ezz,Gyz せん断考慮)=',tawae
goto 599
513 write(*,125) ' f=',p,' PL^3/3EI=',p*ziku**3/3.d0/ezz/yi
goto 599
write(*,115) ' f=',p
599 continue
write(*,135) ' u,v,w=',d(nga+1),d(nga+2),d(nga+3)
3000 continue
do 3010 j=1,nfairu
nga=ngame(j)*3-3
c write(8,*) '--------------------------------------------------'
c write(8,*) '節点番号:',nfair(j)
write(8,145) p,d(nga+1),d(nga+2),d(nga+3)
3010 continue
c
2000 continue
close(8)
115 format(a,1pd13.5)
125 format(a,1pd12.5,a,1pd12.5)
126 format(a,1pd12.5,a,1pd12.5,a,1pd12.5)
135 format(a,1p3d13.5)
145 format(1p4d13.5)
end
c
c
c **********************************************************
c
c ひずみ−応力行列の逆数を取って、
c 応力−ひずみ行列を求める。
c
subroutine gyaku(a)
implicit real*8(a-h, o-z)
dimension a(6,6), b(3,3)
det=a(1,1)*a(2,2)*a(3,3)+a(2,1)*a(3,2)*a(1,3)
& +a(3,1)*a(1,2)*a(2,3)-a(2,1)*a(1,2)*a(3,3)
& -a(3,1)*a(2,2)*a(1,3)-a(1,1)*a(3,2)*a(2,3)
b(1,1)=(-1.d0)**(1+1)*(a(2,2)*a(3,3)-a(3,2)*a(2,3))
b(1,2)=(-1.d0)**(1+2)*(a(2,1)*a(3,3)-a(3,1)*a(2,3))
b(1,3)=(-1.d0)**(1+3)*(a(2,1)*a(3,2)-a(3,1)*a(2,2))
b(2,1)=(-1.d0)**(2+1)*(a(1,2)*a(3,3)-a(3,2)*a(1,3))
b(2,2)=(-1.d0)**(2+2)*(a(1,1)*a(3,3)-a(3,1)*a(1,3))
b(2,3)=(-1.d0)**(2+3)*(a(1,1)*a(3,2)-a(3,1)*a(1,2))
b(3,1)=(-1.d0)**(3+1)*(a(1,2)*a(2,3)-a(2,2)*a(1,3))
b(3,2)=(-1.d0)**(3+2)*(a(1,1)*a(2,3)-a(2,1)*a(1,3))
b(3,3)=(-1.d0)**(3+3)*(a(1,1)*a(2,2)-a(2,1)*a(1,2))
do 10 i=1,3
do 10 j=1,3
a(i,j)=b(j,i)/det
10 continue
return
end
c
c 剛性方程式を解くサブルーチン
c 岩熊先生(http://www.civil.tohoku.ac.jp/~bear/)が、
c 東京大学の大計のライブラリーかどこかの「ガウスの消去法」の
c サブルーチンを2次元骨組をスカイライン法+弧長法で解くために
c 書き換えたものを私が3次元梁用に書き換えたもの
c (http://gthmhk.virtualave.net/programoj/hari/hari.html)
c を弧長法なし(+固有値の計算なし)に書き換えた。
c
subroutine solve(stuh,stlh,imx,n01)
c
c 方程式は掃き出し法によりここで解かれる
c
implicit real*8 (a-h,o-z)
dimension stuh(25000000),stlh(25000000),imx(n01),msl(n01)
c
c
do 100 i=1,n01
msl(i)=1+i+imx(i)-imx(i+1)
100 continue
c
c 前進消去
c
do 10 j=2,n01
ist=msl(j)+1
ied=j-1
if( ist.gt.ied ) go to 20
do 30 i=ist,ied
kst=msl(j)
if( msl(i).gt.kst ) kst=msl(i)
ked=i-1
ij=imx(j)+j-i
do 30 k=kst,ked
kj=imx(j)+j-k
ki=imx(i)+i-k
stuh(ij)=stuh(ij)-stuh(kj)*stlh(ki)
stlh(ij)=stlh(ij)-stlh(kj)*stuh(ki)
30 continue
20 continue
do 40 i=msl(j),ied
ij=imx(j)+j-i
stuh(ij)=stuh(ij)/stuh(imx(i))
stlh(ij)=stlh(ij)/stuh(imx(i))
40 continue
do 10 k=msl(j),ied
kj=imx(j)+j-k
stuh(imx(j))=stuh(imx(j))-stuh(kj)*stlh(kj)*stuh(imx(k))
stlh(imx(j))=stlh(imx(j))-stlh(kj)*stlh(imx(k))
10 continue
c
c 後進消去
c
do 60 j=1,n01
stlh(imx(j))=stlh(imx(j))/stuh(imx(j))
60 continue
do 70 j=2,n01
i=n01+2-j
ked=i-1
do 70 k=msl(i),ked
ii=imx(i)+i-k
stlh(imx(k))=stlh(imx(k))-stuh(ii)*stlh(imx(i))
70 continue
return
end
c
c
c 剛性行列
subroutine melesh(a,b,c,d,sm)
implicit real*8(a-h, o-z)
dimension d(6,6),sm(3,3,8,8),
& s21a(8,8),s21b(8,8),s31a(8,8),s31b(8,8),s32a(8,8),s32b(8,8)
c sm に Melesh(1963) の剛性行列そのままを与えて
c メインプログラムで節点順に並び替えた剛性行列を s に入れる。
d11=d(1,1)*b**2*c**2
d22=d(2,2)*a**2*c**2
d33=d(3,3)*a**2*b**2
d44=d(4,4)*b**2*c**2
d55=d(5,5)*a**2*b**2
d66=d(6,6)*a**2*b**2
d44d=d(4,4)*a**2*c**2
d55d=d(5,5)*b**2*c**2
d66d=d(6,6)*a**2*c**2
d44dd=c*d(4,4)
d55dd=b*d(5,5)
d66dd=a*d(6,6)
d12=c*d(1,2)
d13=b*d(1,3)
d23=a*d(2,3)
c
sm(1,1,1,1)= 4.d0*d11 +4.d0*d44d+4.d0*d55
sm(1,1,2,1)= 2.d0*d11 -4.d0*d44d+2.d0*d55
sm(1,1,3,1)= d11 -2.d0*d44d-2.d0*d55
sm(1,1,4,1)= 2.d0*d11 +2.d0*d44d-4.d0*d55
sm(1,1,5,1)=-4.d0*d11 +2.d0*d44d+2.d0*d55
sm(1,1,6,1)=-2.d0*d11 -2.d0*d44d +d55
sm(1,1,7,1)= -d11 -d44d -d55
sm(1,1,8,1)=-2.d0*d11 +d44d-2.d0*d55
c Melesh(63)ではsm(1,1,1,1)のd44dがd44になっている。
c
sm(1,1,2,2)= 4.d0*d11 +4.d0*d44d+4.d0*d55
sm(1,1,3,2)= 2.d0*d11 +2.d0*d44d-4.d0*d55
sm(1,1,4,2)= d11 -2.d0*d44d-2.d0*d55
sm(1,1,5,2)=-2.d0*d11 -2.d0*d44d +d55
sm(1,1,6,2)=-4.d0*d11 +2.d0*d44d+2.d0*d55
sm(1,1,7,2)=-2.d0*d11 +d44d-2.d0*d55
sm(1,1,8,2)= -d11 -d44d -d55
c
sm(1,1,3,3)= 4.d0*d11 +4.d0*d44d+4.d0*d55
sm(1,1,4,3)= 2.d0*d11 -4.d0*d44d+2.d0*d55
sm(1,1,5,3)= -d11 -d44d -d55
sm(1,1,6,3)=-2.d0*d11 +d44d-2.d0*d55
sm(1,1,7,3)=-4.d0*d11 +2.d0*d44d+2.d0*d55
sm(1,1,8,3)=-2.d0*d11 -2.d0*d44d +d55
c
sm(1,1,4,4)= 4.d0*d11 +4.d0*d44d+4.d0*d55
sm(1,1,5,4)=-2.d0*d11 +d44d-2.d0*d55
sm(1,1,6,4)= -d11 -d44d -d55
sm(1,1,7,4)=-2.d0*d11 -2.d0*d44d +d55
sm(1,1,8,4)=-4.d0*d11 +2.d0*d44d+2.d0*d55
c
sm(1,1,5,5)= 4.d0*d11 +4.d0*d44d+4.d0*d55
sm(1,1,6,5)= 2.d0*d11 -4.d0*d44d+2.d0*d55
sm(1,1,7,5)= d11 -2.d0*d44d-2.d0*d55
sm(1,1,8,5)= 2.d0*d11 +2.d0*d44d-4.d0*d55
c Melesh(1963)ではsm(1,1,6,5)とsm(1,1,8,5)のd55がd55dになっている
c
sm(1,1,6,6)= 4.d0*d11 +4.d0*d44d+4.d0*d55
sm(1,1,7,6)= 2.d0*d11 +2.d0*d44d-4.d0*d55
sm(1,1,8,6)= d11 -2.d0*d44d-2.d0*d55
c
sm(1,1,7,7)= 4.d0*d11 +4.d0*d44d+4.d0*d55
sm(1,1,8,7)= 2.d0*d11 -4.d0*d44d+2.d0*d55
c
sm(1,1,8,8)= 4.d0*d11 +4.d0*d44d+4.d0*d55
c
c
sm(2,2,1,1)= 4.d0*d22 +4.d0*d44 +4.d0*d66
sm(2,2,2,1)=-4.d0*d22 +2.d0*d44 +2.d0*d66
sm(2,2,3,1)=-2.d0*d22 +d44 -2.d0*d66
sm(2,2,4,1)= 2.d0*d22 +2.d0*d44 -4.d0*d66
sm(2,2,5,1)= 2.d0*d22 -4.d0*d44 +2.d0*d66
sm(2,2,6,1)=-2.d0*d22 -2.d0*d44 +d66
sm(2,2,7,1)= -d22 -d44 -d66
sm(2,2,8,1)= d22 -2.d0*d44 -2.d0*d66
c Melesh(63)では、sm(2,2,3,1)のd44が4.d0*d44になっている
c sm(2,2,3,1)=-2.d0*d22 +4.d0*d44 -2.d0*d66
c
sm(2,2,2,2)= 4.d0*d22 +4.d0*d44 +4.d0*d66
sm(2,2,3,2)= 2.d0*d22 +2.d0*d44 -4.d0*d66
sm(2,2,4,2)=-2.d0*d22 +d44 -2.d0*d66
sm(2,2,5,2)=-2.d0*d22 -2.d0*d44 +d66
sm(2,2,6,2)= 2.d0*d22 -4.d0*d44 +2.d0*d66
sm(2,2,7,2)= d22 -2.d0*d44 -2.d0*d66
sm(2,2,8,2)= -d22 -d44 -d66
c
sm(2,2,3,3)= 4.d0*d22 +4.d0*d44 +4.d0*d66
sm(2,2,4,3)=-4.d0*d22 +2.d0*d44 +2.d0*d66
sm(2,2,5,3)= -d22 -d44 -d66
sm(2,2,6,3)= d22 -2.d0*d44 -2.d0*d66
sm(2,2,7,3)= 2.d0*d22 -4.d0*d44 +2.d0*d66
sm(2,2,8,3)=-2.d0*d22 -2.d0*d44 +d66
c
sm(2,2,4,4)= 4.d0*d22 +4.d0*d44 +4.d0*d66
sm(2,2,5,4)= d22 -2.d0*d44 -2.d0*d66
sm(2,2,6,4)= -d22 -d44 -d66
sm(2,2,7,4)=-2.d0*d22 -2.d0*d44 +d66
sm(2,2,8,4)= 2.d0*d22 -4.d0*d44 +2.d0*d66
c
sm(2,2,5,5)= 4.d0*d22 +4.d0*d44 +4.d0*d66
sm(2,2,6,5)=-4.d0*d22 +2.d0*d44 +2.d0*d66
sm(2,2,7,5)=-2.d0*d22 +d44 -2.d0*d66
sm(2,2,8,5)= 2.d0*d22 +2.d0*d44 -4.d0*d66
c
sm(2,2,6,6)= 4.d0*d22 +4.d0*d44 +4.d0*d66
sm(2,2,7,6)= 2.d0*d22 +2.d0*d44 -4.d0*d66
sm(2,2,8,6)=-2.d0*d22 +d44 -2.d0*d66
c
sm(2,2,7,7)= 4.d0*d22 +4.d0*d44 +4.d0*d66
sm(2,2,8,7)=-4.d0*d22 +2.d0*d44 +2.d0*d66
c
sm(2,2,8,8)= 4.d0*d22 +4.d0*d44 +4.d0*d66
c
c
sm(3,3,1,1)= 4.d0*d33 +4.d0*d55d +4.d0*d66d
sm(3,3,2,1)= 2.d0*d33 +2.d0*d55d -4.d0*d66d
sm(3,3,3,1)=-2.d0*d33 +d55d -2.d0*d66d
sm(3,3,4,1)=-4.d0*d33 +2.d0*d55d +2.d0*d66d
sm(3,3,5,1)= 2.d0*d33 -4.d0*d55d +2.d0*d66d
sm(3,3,6,1)= d33 -2.d0*d55d -2.d0*d66d
sm(3,3,7,1)= -d33 -d55d -d66d
sm(3,3,8,1)=-2.d0*d33 -2.d0*d55d +d66d
c
sm(3,3,2,2)= 4.d0*d33 +4.d0*d55d +4.d0*d66d
sm(3,3,3,2)=-4.d0*d33 +2.d0*d55d +2.d0*d66d
sm(3,3,4,2)=-2.d0*d33 +d55d -2.d0*d66d
sm(3,3,5,2)= d33 -2.d0*d55d -2.d0*d66d
sm(3,3,6,2)= 2.d0*d33 -4.d0*d55d +2.d0*d66d
sm(3,3,7,2)=-2.d0*d33 -2.d0*d55d +d66d
sm(3,3,8,2)= -d33 -d55d -d66d
c
sm(3,3,3,3)= 4.d0*d33 +4.d0*d55d +4.d0*d66d
sm(3,3,4,3)= 2.d0*d33 +2.d0*d55d -4.d0*d66d
sm(3,3,5,3)= -d33 -d55d -d66d
sm(3,3,6,3)=-2.d0*d33 -2.d0*d55d +d66d
sm(3,3,7,3)= 2.d0*d33 -4.d0*d55d +2.d0*d66d
sm(3,3,8,3)= d33 -2.d0*d55d -2.d0*d66d
c
sm(3,3,4,4)= 4.d0*d33 +4.d0*d55d +4.d0*d66d
c sm(3,3,5,4)=-2.d0*d33 -2.d0*d55d -d66d
sm(3,3,5,4)=-2.d0*d33 -2.d0*d55d +d66d
sm(3,3,6,4)= -d33 -d55d -d66d
sm(3,3,7,4)= d33 -2.d0*d55d -2.d0*d66d
sm(3,3,8,4)= 2.d0*d33 -4.d0*d55d +2.d0*d66d
c Melesh(63)ではsm(3,3,5,4)の+d66dは-d66dになっているが、
c 答えが出ないので+d66dに変えた。
c
sm(3,3,5,5)= 4.d0*d33 +4.d0*d55d +4.d0*d66d
sm(3,3,6,5)= 2.d0*d33 +2.d0*d55d -4.d0*d66d
sm(3,3,7,5)=-2.d0*d33 +d55d -2.d0*d66d
sm(3,3,8,5)=-4.d0*d33 +2.d0*d55d +2.d0*d66d
c
sm(3,3,6,6)= 4.d0*d33 +4.d0*d55d +4.d0*d66d
sm(3,3,7,6)=-4.d0*d33 +2.d0*d55d +2.d0*d66d
sm(3,3,8,6)=-2.d0*d33 +d55d -2.d0*d66d
c
sm(3,3,7,7)= 4.d0*d33 +4.d0*d55d +4.d0*d66d
sm(3,3,8,7)= 2.d0*d33 +2.d0*d55d -4.d0*d66d
c
sm(3,3,8,8)= 4.d0*d33 +4.d0*d55d +4.d0*d66d
c
c
do 10 n=1,3
do 10 i=1,8
do 15 j=1,i
sm(n,n,i,j)=sm(n,n,i,j)/18.d0/a/b/c
15 continue
do 10 j=1,i-1
sm(n,n,j,i)=sm(n,n,i,j)
10 continue
c
c
s21a(1,1)=-2.d0
s21a(2,1)= 2.d0
s21a(3,1)= 1.d0
s21a(4,1)=-1.d0
s21a(5,1)=-2.d0
s21a(6,1)= 2.d0
s21a(7,1)= 1.d0
s21a(8,1)=-1.d0
c
s21a(1,3)=-1.d0
s21a(2,3)= 1.d0
s21a(3,3)= 2.d0
s21a(4,3)=-2.d0
s21a(5,3)=-1.d0
s21a(6,3)= 1.d0
s21a(7,3)= 2.d0
s21a(8,3)=-2.d0
c
s21b(1,1)=-2.d0
s21b(2,1)=-2.d0
s21b(3,1)=-1.d0
s21b(4,1)=-1.d0
s21b(5,1)= 2.d0
s21b(6,1)= 2.d0
s21b(7,1)= 1.d0
s21b(8,1)= 1.d0
c
s21b(1,3)= 1.d0
s21b(2,3)= 1.d0
s21b(3,3)= 2.d0
s21b(4,3)= 2.d0
s21b(5,3)=-1.d0
s21b(6,3)=-1.d0
s21b(7,3)=-2.d0
s21b(8,3)=-2.d0
c
s31a(1,1)= 2.d0
s31a(2,1)= 1.d0
s31a(3,1)=-1.d0
s31a(4,1)=-2.d0
s31a(5,1)= 2.d0
s31a(6,1)= 1.d0
s31a(7,1)=-1.d0
s31a(8,1)=-2.d0
c Melesh(63)ではs31a(8,1)は2になっているが、i=1,8まで
c 足しても0にならないので -2 の間違いだと思う。
c
s31a(1,2)= 1.d0
s31a(2,2)= 2.d0
s31a(3,2)=-2.d0
s31a(4,2)=-1.d0
s31a(5,2)= 1.d0
s31a(6,2)= 2.d0
s31a(7,2)=-2.d0
s31a(8,2)=-1.d0
c
s31b(1,1)= 2.d0
s31b(2,1)= 1.d0
s31b(3,1)= 1.d0
s31b(4,1)= 2.d0
s31b(5,1)=-2.d0
s31b(6,1)=-1.d0
s31b(7,1)=-1.d0
s31b(8,1)=-2.d0
c
s31b(1,2)= 1.d0
s31b(2,2)= 2.d0
s31b(3,2)= 2.d0
s31b(4,2)= 1.d0
s31b(5,2)=-1.d0
s31b(6,2)=-2.d0
s31b(7,2)=-2.d0
s31b(8,2)=-1.d0
c
s32a(1,1)=-2.d0
s32a(2,1)=-2.d0
s32a(3,1)= 2.d0
s32a(4,1)= 2.d0
s32a(5,1)=-1.d0
s32a(6,1)=-1.d0
s32a(7,1)= 1.d0
s32a(8,1)= 1.d0
c
s32a(1,5)=-1.d0
s32a(2,5)=-1.d0
s32a(3,5)= 1.d0
s32a(4,5)= 1.d0
s32a(5,5)=-2.d0
s32a(6,5)=-2.d0
s32a(7,5)= 2.d0
s32a(8,5)= 2.d0
c
s32b(1,1)=-2.d0
s32b(2,1)= 2.d0
s32b(3,1)= 2.d0
s32b(4,1)=-2.d0
s32b(5,1)=-1.d0
s32b(6,1)= 1.d0
s32b(7,1)= 1.d0
s32b(8,1)=-1.d0
c
s32b(1,5)=-1.d0
s32b(2,5)= 1.d0
s32b(3,5)= 1.d0
s32b(4,5)=-1.d0
s32b(5,5)=-2.d0
s32b(6,5)= 2.d0
s32b(7,5)= 2.d0
s32b(8,5)=-2.d0
c
do 20 i=1,8
s21a(i,2)= s21a(i,1)
s21a(i,5)=-s21a(i,1)
s21a(i,6)=-s21a(i,1)
s21a(i,4)= s21a(i,3)
s21a(i,7)=-s21a(i,3)
s21a(i,8)=-s21a(i,3)
c
s21b(i,2)=-s21b(i,1)
s21b(i,5)= s21b(i,1)
s21b(i,6)=-s21b(i,1)
s21b(i,4)=-s21b(i,3)
s21b(i,7)= s21b(i,3)
s21b(i,8)=-s21b(i,3)
c
s31a(i,4)= s31a(i,1)
s31a(i,5)=-s31a(i,1)
s31a(i,8)=-s31a(i,1)
s31a(i,3)= s31a(i,2)
s31a(i,6)=-s31a(i,2)
s31a(i,7)=-s31a(i,2)
c
s31b(i,4)=-s31b(i,1)
s31b(i,5)= s31b(i,1)
s31b(i,8)=-s31b(i,1)
s31b(i,3)=-s31b(i,2)
s31b(i,6)= s31b(i,2)
s31b(i,7)=-s31b(i,2)
c
s32a(i,2)=-s32a(i,1)
s32a(i,3)=-s32a(i,1)
s32a(i,4)= s32a(i,1)
s32a(i,6)=-s32a(i,5)
s32a(i,7)=-s32a(i,5)
s32a(i,8)= s32a(i,5)
c
s32b(i,2)= s32b(i,1)
s32b(i,3)=-s32b(i,1)
s32b(i,4)=-s32b(i,1)
s32b(i,6)= s32b(i,5)
s32b(i,7)=-s32b(i,5)
s32b(i,8)=-s32b(i,5)
20 continue
c Melesh(63)ではs31a(8,4)=-1.d0となっているが、これだと
c (8,j),j=1,8まで総和したときに0にならない。
c
do 30 i=1,8
do 30 j=1,8
sm(2,1,i,j)=( d12*s21a(i,j) + d44dd*s21b(i,j) )/12.d0
sm(3,1,i,j)=( d13*s31a(i,j) + d55dd*s31b(i,j) )/12.d0
sm(3,2,i,j)=( d23*s32a(i,j) + d66dd*s32b(i,j) )/12.d0
30 continue
do 40 i=1,8
do 40 j=1,8
sm(1,2,i,j)=sm(2,1,j,i)
sm(1,3,i,j)=sm(3,1,j,i)
sm(2,3,i,j)=sm(3,2,j,i)
40 continue
c
return
end
c
c
subroutine zeromx(n,a)
implicit real*8(a-h,o-z)
dimension a(n,n)
do 10 i=1,n
do 10 j=1,n
a(i,j)=0.d0
10 continue
return
end
c