program f90_FEMondoCH !2次元熱伝導解析 implicit none integer::i,j,k,n,nnn,ia,ja,ne,it,k1,k2 character(len=50)::ftinp !温度履歴読み込みファイル character(len=100)::strcom !書出用コメント integer::NODT !節点総数 integer::NELT !要素総数 integer::MATEL !材料種類数 integer::KOT !温度指定節点数 integer::KOC !熱伝達指定辺数 integer::nod=4 !1要素節点数 integer::nhen=1 !1節点自由度数 integer::nt !全自由度(総節点数×1[1節点自由度]) integer::mm !温度固定点処理後自由度 integer::ib !バンド幅 integer,allocatable::kakom(:,:) !要素構成接点番号 real(8),allocatable::Ak(:) !要素熱伝導率 real(8),allocatable::Ac(:) !要素比熱 real(8),allocatable::Arho(:) !要素単位堆積重量 real(8),allocatable::Tk(:) !要素最終温度上昇量 real(8),allocatable::Al(:) !要素発熱速度係数 integer,allocatable::matno(:) !材料種別No real(8),allocatable::wm(:,:) !作業用材料物性記憶 real(8),allocatable::x(:) !節点x座標 real(8),allocatable::y(:) !節点y座標 integer,allocatable::nokt(:) !温度指定節点番号 integer,allocatable::nekc(:,:) !熱伝達境界要素・辺番号 real(8),allocatable::alphac(:) !指定辺熱伝達率 real(8),allocatable::Tinp(:) !指定温度入力 real(8),allocatable::Tcin1(:) !指定熱伝達境界温度入力(前回) real(8),allocatable::Tcin2(:) !指定熱伝達境界温度入力(現在) real(8)::alpc !作業用熱伝達率 real(8)::tc !作業用熱伝達境界温度 integer::kchen !作業用熱伝達境界辺番号 real(8)::dotq !作業用発熱率 real(8),allocatable::tck1(:,:) !全体剛性行列(前回) real(8),allocatable::tck2(:,:) !全体剛性行列(現在) real(8),allocatable::rtck2(:,:) !全体剛性行列(現在)拘束節点列保存 real(8)::ck1(4,4) !要素剛性行列(前回) real(8)::ck2(4,4) !要素剛性行列(現在) real(8)::ht(4,4) !要素熱伝達行列 real(8)::fq(4) !要素発熱率ベクトル real(8)::fc(4) !要素熱伝達ベクトル real(8),allocatable::tempe0(:) !全体節点温度初期値 real(8),allocatable::ftvec(:) !全体熱流束ベクトル real(8),allocatable::tempe(:) !全体節点温度ベクトル real(8),allocatable::reac(:) !作業用節点温度ベクトル integer,allocatable::index(:) !温度固定点処理用 real(8)::delta !時間刻み real(8)::ttime !時刻 integer::itmax !時刻歴ステップ数 integer::nout !出力節点数 integer,allocatable::noout(:) !出力節点番号 integer::ntout !全節点温度出力回数 integer,allocatable::nntout(:) !全節点温度出力ステップ real(8),allocatable::tempend(:,:)!出力用節点温度 real(8)::fact0=1.0D-30 !0判定 real(8)::elarea1 real(8)::elarea2 integer::io character::str*20 character :: linebuf*1000 character :: fmt1*200,fmt2*200 real(4) :: t1,t2 integer :: iv(1:8) character date*10,time1*20,time2*20,zone*10 !時間計測開始 call DATE_AND_TIME(date,time1,zone,iv) read(time1,*) t1 !***************************************************** !データ入力 !***************************************************** open(11,file='fnameR.csv',status='old') !-------------------------------------------------------------------------------------- !書出用コメント入力 !-------------------------------------------------------------------------------------- read(11,'(a)') strcom !-------------------------------------------------------------------------------------- !時刻歴読み込みファイル指定 !-------------------------------------------------------------------------------------- read(11,'(a)') ftinp !------------------------------------------------------------------------------------------ !節点数,要素数,材料種類数,温度固定点数,熱伝達境界辺数,時間刻み !------------------------------------------------------------------------------------------ read(11,*) NODT,NELT,MATEL,KOT,KOC,delta !------------------------------------------------------------------------------------------ !配列寸法宣言 !------------------------------------------------------------------------------------------ nt=NODT*nhen allocate(kakom(1:NELT,1:4)) allocate(Ak(1:NELT)) allocate(Ac(1:NELT)) allocate(Arho(1:NELT)) allocate(Tk(1:NELT)) allocate(Al(1:NELT)) allocate(matno(1:NELT)) allocate(wm(1:MATEL,1:5)) allocate(x(1:NODT)) allocate(y(1:NODT)) allocate(nokt(1:KOT)) allocate(nekc(1:KOC,1:2)) allocate(alphac(1:KOC)) allocate(Tinp(1:KOT)) allocate(Tcin1(1:KOC)) allocate(Tcin2(1:KOC)) allocate(index(1:nt)) allocate(tck1(1:nt,1:nt)) allocate(tck2(1:nt,1:nt)) allocate(rtck2(1:nt,1:KOT)) allocate(tempe0(1:nt)) allocate(tempe(1:nt)) allocate(reac(1:nt)) allocate(ftvec(1:nt)) !------------------------------------------------------------------------------------------ !材料特性(Ak,Ac,Arho,Tk,Al) !------------------------------------------------------------------------------------------ do i=1,MATEL read(11,*) wm(i,1),wm(i,2),wm(i,3),wm(i,4),wm(i,5) end do !------------------------------------------------------------------------------------------ !要素構成節点と材料種別(node-1,node-2,node-3,node-4,matno) !------------------------------------------------------------------------------------------ do ne=1,NELT read(11,*) kakom(ne,1),kakom(ne,2),kakom(ne,3),kakom(ne,4),matno(ne) do i=1,MATEL if(i==matno(ne))then Ak(ne) =wm(i,1) Ac(ne) =wm(i,2) Arho(ne)=wm(i,3) Tk(ne) =wm(i,4) Al(ne) =wm(i,5) end if end do end do deallocate(wm) !------------------------------------------------------------------------------------------ !節点座標(x,y),初期節点温度 !------------------------------------------------------------------------------------------ do i=1,NODT read(11,*) x(i),y(i),tempe0(i) end do !------------------------------------------------------------------------------------------ !温度指定節点番号 !------------------------------------------------------------------------------------------ if(00)then mm=mm+1 index(mm)=i end if end do do i=1,mm ia=index(i) do j=1,mm ja=index(j) tck2(i,j)=tck2(ia,ja) end do end do !----------------------------------------------------- !バンド幅計算とフルマトリックスのバンド化記憶 !----------------------------------------------------- ib=IBAND(mm,tck2,fact0,nt) Call BAND(mm,ib,tck2,nt) !----------------------------------------------------- !対角項確認と異常終了通知 !----------------------------------------------------- do i=1,mm if(abs(tck2(i,1))m1)then mm=m1 else mm=n1-i+1 end if do j=1,mm z=array(i,j) if(j/=m1)then if(m1-j+11)then array(i,j)=z/array(i,1) else array(i,1)=sqrt(z) end if else array(i,j)=z/array(i,1) end if end do end do end subroutine CHBAND10 subroutine CHBAND11(n1,m1,array,vector,nt) integer,intent(in)::n1,m1,nt real(8),intent(in)::array(1:nt,1:nt) real(8),intent(out)::vector(nt) integer :: i,j,mm real(8) :: z vector(1)=vector(1)/array(1,1) do i=2,n1 z=vector(i) if(i>m1)then mm=m1 else mm=i end if do j=2,mm z=z-array(i-j+1,j)*vector(i-j+1) end do vector(i)=z/array(i,1) end do vector(n1)=vector(n1)/array(n1,1) do i=n1-1,1,-1 z=vector(i) do j=2,m1 if(i+j-1>n1)exit z=z-array(i,j)*vector(i+j-1) end do vector(i)=z/array(i,1) end do end subroutine CHBAND11 integer function IBAND(mm,array,fact0,nt) integer,intent(in)::mm,nt real(8),intent(in)::array(1:nt,1:nt),fact0 integer :: i,j !----------------------------------------------------- !バンド幅計算 !----------------------------------------------------- IBAND=1 do i=1,mm-1 do j=mm,i+1,-1 if(fact0<=abs(array(i,j)))exit end do if(IBAND<=j-i+1)IBAND=j-i+1 end do if(mm