!Salomeで作った四面体要素(2次要素)のunvファイルをCalculiX用inpファイルに変換

! 拘束とか載荷の節点群は、座標指定ではなく、Salomeのグループで指定する。
! なので、Salomeで、Mesh_1を右クリック-->Create Groups from Geometry-->Nodes
! から、geometryで予めcreate groupしたグループを選択すればいい。

! ちなみに、  /#  で 修正必要箇所 に跳べる。

implicit real*8(a-h,o-z)
dimension x(10000000),y(1000000),z(1000000) !節点座標

!---各種入力データ---
!#--ファイル名
open(7,file='Mesh_1.unv')
open(8,file='mesh_1.inp')
!#--荷重
p=1.d-4!荷重(MN)
!#--Mesh_1 の Mesh Information を見て入力
nsetten=723   !2次要素の節点数(Nodes)
nedge=36    !1D(edges)の数
nface=148   !2D(faces)の数
nvolume=412 !3D(volume)の数
!#--sub mesh の Mesh Information を見て入力
nkotei1=9        !固定グループの節点数(Nodes)
!nkotei2=3        !固定グループの節点数(Nodes)
nsaika=9         !載荷グループの節点数(Nodes)
!---

!---inpファイルの節点情報(*NODE)を作る---
write(8,'("*NODE, NSET=Nall")')
do i=1,19
read (7,'()')!ヘッダーの読み飛ばし
end do
!---節点番号と節点座標の読み込みと書き出し
do i=1,nsetten
read (7,*) nset,n1,n2,n3
read(7,*) x(i),y(i),z(i)
write(8,'(i6,a,1pe17.9,a,1pe17.9a,1pe17.9)') nset,',',x(i)/1.0d3&
&,',',y(i)/1.0d3,',',z(i)/1.0d3
end do
!---

!---inpファイルの要素情報(*ELEMENT)を作る---
write(8,'("*ELEMENT, TYPE=C3D10, ELSET=Eall")')!今のところ1種材料
read (7,'()') 
read (7,'()') 
read (7,'()') 
!---Edges情報の読み飛ばし
do i=1,nedge
read(7,*) nyou,n1,n2,n3,n4,n5
read(7,*) n6,n7,n8
read(7,*) n9,n10
end do
!---Faces情報の読み飛ばし
do i=1,nface
read(7,*) nyou,n1,n2,n3,n4,n5
read(7,*) n6,n7,n8,n9,n10,n11
end do
!---Volumes情報の読み込みと書き出し、ついでに体積計算
taiseki=0.d0
do i=1,nvolume
read(7,*) nyou,n1,n2,n3,n4,n5
read(7,*) nset1,nset5,nset2,nset6,nset3,nset7,nset8,nset9
read(7,*) nset10,nset4
write(8,*) i,',',nset1,',',nset2,',',nset3,',',&
    &nset4,',',nset5,',',nset6,',',nset7,',',nset8,',',nset9,',',nset10
!---体積の計算
x1=x(nset1);y1=y(nset1);z1=z(nset1)
x2=x(nset2);y2=y(nset2);z2=z(nset2)
x3=x(nset3);y3=y(nset3);z3=z(nset3)
x4=x(nset4);y4=y(nset4);z4=z(nset4)
taiseki=taiseki+(&
& (x4-x1)*((y2-y1)*(z3-z1)-(z2-z1)*(y3-y1)) &
&+(y4-y1)*((z2-z1)*(x3-x1)-(x2-x1)*(z3-z1)) &
&+(z4-z1)*((x2-x1)*(y3-y1)-(y2-y1)*(x3-x1)) &
&)/6
end do
print*,'体積は',taiseki
!---

!---inpファイルの節点群(*NSET)を作る---
read (7,'()') 
read (7,'()') 
read (7,'()') 
!   以下のグループの並び順は、Salomeで sub mesh を作った順に並び替える
!#--固定するグループ1の節点番号の読み込みと書き出し
read (7,'()') 
read (7,'()') 
write(8,'("*NSET,NSET=kousoku1")')
do i=1,int(nkotei1/2)
read(7,*) n1,nset1,n2,n3,n4,nset2,n5,n6
write(8,*) nset1,','
write(8,*) nset2,','
enddo
if (mod(nkotei1,2)==1) then
read(7,*) n1,nset1,n2,n3
write(8,*) nset1,','
endif
!#--固定するグループ2の節点番号の読み込みと書き出し
!read (7,'()') 
!read (7,'()') 
!write(8,'("*NSET,NSET=kousoku2")')
!do i=1,int(nkotei2/2)
!read(7,*) n1,nset1,n2,n3,n4,nset2,n5,n6
!write(8,*) nset1,','
!write(8,*) nset2,','
!enddo
!if (mod(nkotei2,2)==1) then
!read(7,*) n1,nset1,n2,n3
!write(8,*) nset1,','
!endif
!#--載荷するグループの節点番号の読み込みと書き出し
read (7,'()') 
read (7,'()') 
write(8,'("*NSET,NSET=saika")')
do i=1,int(nsaika/2)
read(7,*) n1,nset1,n2,n3,n4,nset2,n5,n6
write(8,*) nset1,','
write(8,*) nset2,','
enddo
if (mod(nsaika,2)==1) then
read(7,*) n1,nset1,n2,n3
write(8,*) nset1,','
endif
!---
close(7)

!---inpファイルに色々な情報を書く---
!#--材料の設定
write(8,'("*MATERIAL,NAME=EL")')
write(8,'("*ELASTIC")')
write(8,'("6.0d3,0.3")')!ヤング率(MPa), ポアソン比
write(8,'("*SOLID SECTION,ELSET=Eall,MATERIAL=EL")')
!---計算の設定(*STEP~*END STEP)
write(8,'("*STEP")')
write(8,'("*STATIC,SOLVER=SPOOLES")')
!#--拘束条件(拘束方向は、x:1,y:2,z:3)
write(8,'("*BOUNDARY")')
write(8,'("kousoku1,1,3")')
!write(8,'("*BOUNDARY")')
!write(8,'("kousoku2,1,3")')
!#--荷重条件(載荷方向は、x:1,y:2,z:3)
write(8,'("*CLOAD")')
write(8,'(A,a,i6,a,1pe17.9)')'saika',',',2,',',p/nsaika
!---出力の設定
write(8,'("*NODE PRINT,NSET=saika")')
write(8,'("U")')
write(8,'("*EL PRINT,ELSET=Eall")')
write(8,'("S")')
write(8,'("*NODE FILE")')
write(8,'("U")')
write(8,'("*EL FILE")')
write(8,'("S")')
write(8,'("*END STEP")')
!---
close(8)
end
