program f90_SEEP4nodSU !2次元飽和不飽和定常浸透流解析 implicit none integer::i,j,k,l,k1,k2,k3,n,ia,ja,ne,nnn character::strcom*256 !書出用コメント integer::NODT !節点総数 integer::NELT !要素総数 integer::MATEL !材料種類数 integer::KOH !全水頭指定節点数 integer::KOQ !流量指定節点数 integer::KOU !浸潤境界指定節点数 integer::KOP !浸潤面圧力水頭0点数 integer::nt !全自由度(総節点数×1[1節点自由度]) integer::mm !温度固定点処理後自由度 integer::ib !バンド幅 integer::nod=4 !1要素節点数 integer::nhen=1 !1節点自由度 integer,allocatable::kakom(:,:) !要素構成節点番号 real(8),allocatable::Ak0(:) !要素透水係数 real(8),allocatable::Akr(:) !要素透水係数 real(8),allocatable::alpha(:) !パラメータalpha real(8),allocatable::em(:) !パラメータm integer,allocatable::matno(:) !材料種別No real(8),allocatable::wm(:,:) !材料物性作業用 real(8),allocatable::x(:) !節点x座標 real(8),allocatable::z(:) !節点y座標 integer,allocatable::nokh(:) !全水頭指定節点番号 integer,allocatable::nokq(:) !流量指定節点番号 integer,allocatable::noku(:) !浸潤境界節点番号 integer,allocatable::nokp(:) !浸潤面圧力水頭0点節点番号 real(8),allocatable::Hinp(:) !指定全水頭入力 real(8),allocatable::Qinp(:) !指定流量入力 real(8),allocatable::tak(:,:) !全体剛性行列 real(8),allocatable::wak(:,:) !水頭指定節点対応列記憶 real(8),allocatable::hvec(:) !全体全水頭ベクトル real(8),allocatable::h1vec(:) !全水頭ベクトル real(8),allocatable::h2vec(:) !全水頭ベクトル real(8),allocatable::qvec(:) !全体節点流量ベクトル real(8),allocatable::q0vec(:) !全体節点流量ベクトル real(8),allocatable::reac(:) !作業用ベクトル real(8),allocatable::vx(:) !x方向流速ベクトル real(8),allocatable::vz(:) !y方向流速ベクトル real(8),allocatable::vm(:) !流速ベクトル real(8),allocatable::index(:) !温度固定点処理用 real(8)::eak(1:4, 1:4) !要素透水行列 real(8)::fact0=1.0E-30 !0判定 real(8)::elarea integer::itmax=100 integer::icount real(8)::QTi,QTo,vmmax,xgm,zgm,vimax,xgi,zgi,vomax,xgo,zgo integer::kmmax,kimax,komax character :: linebuf*1000 character :: fmt1*200,fmt2*200,fmt3*200,fmt4*200 real(4) :: t1,t2 integer :: iv(1:8) character date*8,time1*10,time2*10,zone*5 !時間計測開始 call DATE_AND_TIME(date,time1,zone,iv) read(time1,*) t1 !*************************** !data input !*************************** open(11,file='fnameR.csv',status='old') !!-------------------------------------------------------------------------------------- !!書出用コメント入力 !!-------------------------------------------------------------------------------------- read(11,'(a)') strcom !------------------------------------------------------------------------------------------ !節点数,要素数,材料種類数,全水頭指定節点数,流量指定節点数,浸潤境界節点数 !------------------------------------------------------------------------------------------ read(11,*) NODT,NELT,MATEL,KOH,KOQ,KOU !------------------------------------------------------------------------------------------ !配列寸法宣言 !------------------------------------------------------------------------------------------ nt=NODT*nhen allocate(kakom(1:NELT,1:nod)) allocate(matno(1:NELT)) allocate(wm(1:NELT,1:3)) allocate(Ak0(1:NELT)) allocate(Akr(1:NELT)) allocate(alpha(1:NELT)) allocate(em(1:NELT)) allocate(x(1:NODT)) allocate(z(1:NODT)) if(0{q0} !浸潤境界節点では流入は許容しない !(浸潤境界節点での流入量を0セット) !----------------------------------------------------- do i=1,nt q0vec(i)=0.0D0 end do if(00)then mm=mm+1 index(mm)=i end if end do do i=1,mm ia=index(i) reac(i)=qvec(ia) do j=1,mm ja=index(j) tak(i,j)=tak(ia,ja) end do end do !----------------------------------------------------- !バンド幅計算とフルマトリックスのバンド化記憶 !----------------------------------------------------- ib=IBAND(mm,tak,fact0,nt) call BAND(mm,ib,tak,nt) !----------------------------------------------------- !対角項確認と異常終了通知 !----------------------------------------------------- do i=1,mm if(abs(tak(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 :: n1,m1,nt real(8) :: array(1:nt,1:nt),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 :: mm,nt real(8) :: 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