! SUB_SHUILIANGJISUAN.f90 ! ! FUNCTIONS/SUBROUTINES exported from SUB_SHUILIANGJISUAN.dll: ! SUB_SHUILIANGJISUAN - subroutine ! subroutine SUB_SHUILIANGJISUAN( NDATA ,& ! 计算时刻数 // 输入参数 LONG ,& ! 河道长度 INbd ,& ! 断面底宽 INzd ,& ! 底高程 INsm ,& ! 边坡系数 INrough ,& ! 糙率 ZZ0 ,& ! 计算区域初始水位 DB ,& ! 下游边界条件类型 1.水位边界 2.流量边界 UQ ,& ! 上游流量过程 DQH ,& ! 上游水位/流量过程 dt ,& ! 计算步长( 秒) OUTT ,& ! 计算断面输出时刻 OUTQ ,& ! 计算断面输出流量 OUTH ) ! 计算断面输出水位 ! Expose subroutine SUB_SHUILIANGJISUAN to users of this DLL ! !DEC$ ATTRIBUTES DLLEXPORT::SUB_SHUILIANGJISUAN ! Variables INTEGER::FHD INTEGER::NRIVER INTEGER::NSECT INTEGER::MRIVER INTEGER::KRC INTEGER::NDATA REAL::ZZ0 INTEGER::DB REAL::UQ(NDATA) REAL::DQH(NDATA) REAL::OUTQ(1000) REAL::OUTH(1000) REAL::OUTT(1000) REAL::DDGC ! 计算断面堤顶高程 REAL::MAXH INTEGER::MY ! 1.漫溢 2.未漫溢 integer River,tstep ! node INTEGER,ALLOCATABLE::Ns(:),Pc(:),Nrc(:,:),Lc(:,:) REAL,ALLOCATABLE::Dric(:,:),Qj(:,:,:),Asave(:,:) ! section REAL,ALLOCATABLE::ds(:,:),bd(:,:),zd(:,:),sm(:,:), rough(:,:) ! boundary INTEGER,ALLOCATABLE::UB1(:),UB2(:),DB1(:),DB2(:),NUB(:,:),NDB(:,:) REAL,ALLOCATABLE::UBV(:,:),Aphi(:,:),DBV(:,:),Gate(:,:) REAL::ql,Zctr ! calcu REAL::dt,sita,Bsor1,Bsor2 ! zzqq REAL,ALLOCATABLE::Z0(:,:),Q0(:,:),Z(:,:),Q(:,:),V(:,:) ! r_bv REAL::condu,condd(3) ! BARC REAL::Bs,As,Rs,Cs REAL,ALLOCATABLE::Qp(:) REAL,ALLOCATABLE::Zc(:,:),Qc(:,:) INTEGER::I INTEGER::II REAL::LONG REAL::INbd REAL::INzd REAL::INsm REAL::INrough INTEGER::TEMP !OPEN(1,FILE='OUTFHDL.TXT') !WRITE(1,*)' ! 计算时刻数 ', NDATA ,& ! ' ! 河道长度 ', LONG ,& ! '! 断面底宽 ', INbd ,& ! '! 底高程 ' , INzd ,& ! '! 边坡系数 ', INsm ,& ! ' ! 糙率 ' , INrough ,& ! ' ! 计算区域初始水位 ', ZZ0 ,& ! ' ! 下游边界条件类型 1.水位边界 2.流量边界 ', DB ,& ! ' ! 上游流量过程 ' , UQ ,& ! ' ! 上游水位/流量过程 ', DQH ,& ! ' ! 计算步长( 秒) ', dt ,& ! '! 计算断面堤顶高程 ', DDGC FHD = 0 TEMP = 0 ! 1.读入河道组态数据 !open(1,file='河道组态数据.TXT') ! 读入:1.河道数量 2.河道计算断面数最大值 3.河道汊点数最大值 4.计算时刻数 !CALL SUB_GETNXT(1) !read(1,*) nriver = 1 nsect = 6 krc = 0 mriver=nsect - 1 ! 这是我写的,微段数不就等于断面数-1吗 ALLOCATE(Ns(nriver),Pc(nriver),Nrc(krc,nriver),Lc(krc,nriver)) ALLOCATE(Dric(krc,nriver),Qj(ndata,krc,nriver),Asave(krc,nriver)) ALLOCATE(ds(mriver,nriver),bd(nsect,nriver),zd(nsect,nriver),sm(nsect,nriver), rough(nsect,nriver)) ALLOCATE(UB1(nriver),UB2(nriver),DB1(nriver),DB2(nriver),NUB(2,nriver),NDB(2,nriver)) ALLOCATE(UBV(ndata,nriver),Aphi(2,nriver),DBV(ndata,nriver),Gate(4,nriver)) ALLOCATE(Z0(nsect,nriver),Q0(nsect,nriver),Z(nsect,nriver),Q(nsect,nriver),V(nsect,nriver)) ALLOCATE(Qp(ndata)) ALLOCATE(Zc(nsect,nriver),Qc(nsect,nriver)) !读入: 1.河道序号 2.河道断面数 3.河道汊点数 ! (所有汊点均变成三汊口处理) ! CALL SUB_GETNXT(1) ! DO I = 1,nriver !read(1,*)II,Ns(i),Pc(i) ! END DO Ns(1) = 6 Pc(1) = 0 !读入:! 1.河道序号 2.河道汊点微段号 3.汊点类型 4.流动方向 ! 汊点类型:1——普通汊点,2——集中入流,3——调蓄水库 ! 与汊点相连的河道或集中入流的水流方向,流入汊点:1,流出汊点:-1,调蓄水库任意给定 Nrc = 0 Lc = 0 Dric = 0 ! DO J = 1,nriver ! DO I = 1,Pc(J) ! CALL SUB_GETNXT(1) !read(1,*)II,Nrc(i,j),Lc(i,j),Dric(i,j) ! END DO ! END DO ! 集中入流的汊点读入流量过程 Qj = 0.0 !DO k=1,nriver ! DO j=1,Pc(k) ! CALL SUB_GETNXT(1) ! if(Lc(j,k).eq.2)then ! read(1,*)II,II,(Qj(i,j,k),i=1,ndata) ! end if ! END DO ! END DO ! 连接调蓄水库的汊点读入水库面积(m2) Asave = 0.0 !DO k=1,nriver ! DO j=1,Pc(k) ! if(Lc(j,k).eq.3)then ! CALL SUB_GETNXT(1) ! read(1,*)Asave(j,k) ! end if ! END DO ! END DO ! 2.读入河道几何数据 ! CALL SUB_GETNXT(1) ! ds = 0.0 ! DO J = 1,nriver ! DO I = 1,Ns(j)-1 !read(1,*)II,II,ds(i,j) ! 每条河道各微段的长度,普通汊点、集中入流微段及调蓄水库的长度取0,每条河道的首末微段长度必须取一个非零值。 ! END DO ! END DO ds(:,1) = LONG/5 ! CALL SUB_GETNXT(1) ! bd = 0.0 ! zd = 0.0 ! sm = 0.0 ! rough = 0.0 ! DO j=1,nriver ! DO I =1,Ns(j) !read(1,*)II,II,bd(i,j),zd(i,j),sm(i,j),rough(i,j) ! 梯形断面底宽、底高程、边坡系数、糙率 ! END DO ! END DO bd = INbd zd = INzd sm = INsm rough = INrough ! 3.读入河道边界数据 ! CALL SUB_GETNXT(1) ! read(1,*)ZZ0,Zctr ! ZZ0——计算区域初始水位,Zctr——河道末端挡潮闸运行控制水位, Zctr = 0.0 Scanal = 0.0 ! Scanal——河网所有河道的合计长度,用于计算旁侧入流量ql DO J = 1,nriver DO I = 1,Ns(j)-1 Scanal = Scanal + ds(i,j) ! 每条河道各微段的长度,普通汊点、集中入流微段及调蓄水库的长度取0,每条河道的首末微段长度必须取一个非零值。 END DO END DO !CALL SUB_GETNXT(1) !DO I = 1,ndata ! read(1,*)II,Qp(i) ! Qp——计算区域入河流量过程 ! END DO Qp = 0.0 ! UB1上游边界条件类型1(1——水位边界,2——流量边界,3——水位流量关系) ! UB2上游边界条件类型2(1——河网外边界,2——河网内边界) ! DB1下游边界条件类型1(1——水位边界,2——流量边界,3——水位流量关系) ! DB2下游边界条件类型2(1——河网外边界,2——河网内边界) !CALL SUB_GETNXT(1) ! DO I = 1,nriver ! read(1,*)II,UB1(i),UB2(i),DB1(i),DB2(i) !END DO UB1(1) = 2 UB2(1) = 1 DB1(1) = DB DB2(1) = 1 !CALL SUB_GETNXT(1) UBV = 0.0 NUB = 0 !DO i=1,nriver ! if(UB2(i).eq.1)then ! 如果是上游河网外部边界 ! read(1,*)II,II,II,(UBV(j,i),j=1,ndata) ! 读入上游外边界断面处的水位,或流量过程 ! elseif(UB2(i).eq.2)then ! 如果是上游河网内部边界 ! read(1,*)II,II,II,(NUB(j,i),j=1,2) ! 读入上游内边界断面所连接的河道编号、微段编号 ! endif ! END DO DO I = 1,ndata UBV(I,1) = UQ(I) END DO !CALL SUB_GETNXT(1) !DO i=1,nriver ! if(DB2(i).eq.1)then ! 下游外部 ! if(DB1(i).eq.3)then ! 如果是闸下潮位过程 ! read(1,*)II,II,II,(DBV(j,i),j=1,ndata),(Gate(j,i),j=1,4) ! 读入 Gate(1,i) = 闸净宽;Gate(2,i) = 最大过流量;Gate(3,i) = 流量公式C1;Gate(4,i) = 流量公式C2 (流量公式Q=C1*B*e*dZ^C2中的C1和C2) ! ELSE ! read(1,*)II,II,II,(DBV(j,i),j=1,ndata) ! 读入下游外边界断面处的水位,或流量,或闸下潮位过程 ! end if ! elseif(DB2(i).eq.2)then ! 下游内部 ! if(DB1(i).eq.2)then ! read(1,*)II,II,II,(NDB(j,i),j=1,2),(Aphi(j,i),j=1,2) ! 下游流量内边界(管涵)的过流断面面积、流速系数 下游内边界一般用水位,如果用流量,一般是管涵,需要提供过流面积和流速系数 ! ELSE ! read(1,*)II,II,II,(NDB(j,i),j=1,2) ! 读入下游内边界断面所连接的河道编号、微段编号 ! end if ! endif !END DO DO I = 1,ndata DBV(I,1) = DQH(I) END DO ! 4.读入河道计算条件 !CALL SUB_GETNXT(1) !read(1,*)period,dt,sita ! period——计算小时数,dt——计算时间步长(秒),sita——水量隐格式权系数 !CALL SUB_GETNXT(1) !read(1,*)sorz,sorq,epsz,epsq ! sorz、sorq——水位、流量迭代松弛因子,epsz、epsq——水位、流量迭代控制精度 !CALL SUB_GETNXT(1) !read(1,*)Bsor1,Bsor2 ! Bsor1、Bsor2——水闸外边界、管涵内边界计算中的松弛因子 !close(1) period =REAL( NDATA - 1 ) ! read(1,*)dt sita = 0.7 sorz = 0.3 sorq = 0.3 epsz = 0.01 epsq = 0.1 Bsor1 = 0.3 Bsor2 = 0.1 ! 计算时间步长 maxtstep=period*3600/dt maxiter=1000 ! 仿真模拟步数 ! 给河道水位、流量赋初值 DO river=1,nriver DO Is=1,Ns(river) Z0(Is,river)=ZZ0 Q0(Is,river)=0.0 END DO END DO ! 流量、水位输出 !open(1,file='河道1各断面水位变化.TXT') !open(2,file='河道2各断面水位变化.TXT') !open(3,file='河道3各断面水位变化.TXT') !open(4,file='河道4各断面水位变化.TXT') ! !open(11,file='河道1各断面流量变化.TXT') !open(12,file='河道2各断面流量变化.TXT') !open(13,file='河道3各断面流量变化.TXT') !open(14,file='河道4各断面流量变化.TXT') ! ---------------------------------------------------------------------------------- ! 迭代求解每个时刻的水位、流量 ! ---------------------------------------------------------------------------------- DO tstep=1,maxtstep ! 步数累加器 TEMP = TEMP + 1 ttime=dt*tstep/3600.0 ! 真实时刻 ! write(*,15)ttime iter=0 DO river=1,nriver DO Is=1,Ns(river) Z(Is,river)=Z0(Is,river) Q(Is,river)=Q0(Is,river) END DO END DO ! 计算当前时刻入河流量大小 call int_a( ttime ,& ! 真实时刻 // 输入参数 ndata ,& ! 入河流量变化过程时段数 Qp ,& ! 入河流量变化过程线 fc ) ! 当前时刻入河流量大小 // 输出参数 ql=fc/Scanal 25 iter=iter+1 DO river=1,nriver DO Is=1,Ns(river) Zc(Is,river)=Z(Is,river) Qc(Is,river)=Q(Is,river) END DO END DO DO river=1,nriver ! 确定计算时刻河段上下游边界条件值 call sub_bound( NRIVER ,& NSECT ,& MRIVER ,& KRC ,& NDATA ,& river ,& tstep ,& Ns ,& Pc ,& Nrc ,& Lc ,& Dric ,& Qj ,& Asave ,& UB1 ,& UB2 ,& DB1 ,& DB2 ,& NUB ,& NDB ,& UBV ,& Aphi ,& DBV ,& Gate ,& ql ,& Zctr ,& dt ,& sita ,& Bsor1 ,& Bsor2 ,& Z0 ,& Q0 ,& Z ,& Q ,& V ,& condu ,& condd ) ! 用四点隐格式计算未知时层水位Z和流量Q call sub_QZ( NRIVER ,& NSECT ,& MRIVER ,& KRC ,& NDATA ,& river ,& tstep ,& Ns ,& Pc ,& Nrc ,& Lc ,& Dric ,& Qj ,& Asave ,& ds ,& bd ,& zd ,& sm ,& rough ,& UB1 ,& UB2 ,& DB1 ,& DB2 ,& NUB ,& NDB ,& UBV ,& Aphi ,& DBV ,& Gate ,& ql ,& Zctr ,& dt ,& sita ,& Bsor1 ,& Bsor2 ,& Z0 ,& Q0 ,& Z ,& Q ,& V ,& condu ,& condd ,& Bs ,& As ,& Rs ,& Cs ) END DO dzmax=0.0 dqmax=0.0 DO river=1,nriver DO Is=1,Ns(river) dz=abs(Z(Is,river)-Zc(Is,river)) dq=abs(Q(Is,river)-Qc(Is,river)) if(dz.gt.dzmax)then dzmax=dz maxz_r=river maxz_s=Is end if if(dq.gt.dqmax)then dqmax=dq maxq_r=river maxq_s=Is end if END DO END DO if(dzmax.gt.epsz.or.dqmax.gt.epsq)then ! write(*,50)iter,maxz_r,maxz_s,dzmax,maxq_r,maxq_s,dqmax DO river=1,nriver DO Is=1,Ns(river) Z(Is,river)=(1.0-sorz)*Zc(Is,river)+sorz*Z(Is,river) Q(Is,river)=(1.0-sorq)*Qc(Is,river)+sorq*Q(Is,river) END DO END DO if(iter.le.maxiter)then goto 25 else ! write(*,55) goto 600 end if else DO river=1,nriver DO Is=1,Ns(river) ! 计算断面几何要素 call sub_sect(NRIVER ,& NSECT ,& MRIVER ,& KRC ,& NDATA ,& river,Is,Z(Is,river),& ds ,& bd ,& zd ,& sm ,& rough ,& Bs ,& As ,& Rs ,& Cs ) V(Is,river)=Q(Is,river)/As END DO END DO ! 输出几个典型河道的水位流量变化过程 DO jj=1,nriver !write(jj,80)ttime,(Z(ii,jj),ii=1,Ns(jj)) END DO DO jj=1,nriver jj1=jj+10 !write(jj1,80)ttime,(Q(ii,jj),ii=1,Ns(jj)) END DO IF(FHD==1)THEN OUTQ(TEMP ) = Q(5,1)*0.9 OUTH(TEMP ) = Z(5,1)*0.95 ELSE OUTQ(TEMP ) = Q(5,1) OUTH(TEMP ) = Z(5,1) END IF OUTT(TEMP ) = ttime DO river=1,nriver DO Is=1,Ns(river) Z0(Is,river)=Z(Is,river) Q0(Is,river)=Q(Is,river) END DO END DO end if END DO 600 close(100) close(2) close(3) close(4) close(11) close(12) close(13) close(14) 15 format(55x,'time=',f10.2) 50 format(55x,'iter=',i5/1x,'maxz_r=',i5,5x,'maxz_s=',i5,5x,'dzmax=',e10.4/1x,'maxq_r=',i5,5x,'maxq_s=',i5,5x,'dqmax=',e10.4) 55 format(1x,'迭代发散') 80 format(1x,40f12.4) !MAXH = MAXVAL(OUTH) !IF(MAXH.GT.DDGC)THEN ! MY = 1 !ELSE ! MY = 0 !END IF !WRITE(1,*)' ! 1.漫溢 0.未漫溢 ' , MY ,& ! '! 计算断面输出时刻 ', OUTT ,& ! '! 计算断面输出流量 ', OUTQ ,& ! '! 计算断面输出水位 ', OUTH CLOSE(1) END SUBROUTINE SUB_SHUILIANGJISUAN