162 lines
3.7 KiB
Fortran
162 lines
3.7 KiB
Fortran
! ==================================================================================
|
||
! 确定计算时刻河段上下游边界条件值的子程序
|
||
! ==================================================================================
|
||
!
|
||
! 说明:下游外边界条件都给定一个过程,有ndata个数据点(1小时间隔),水位边界即为水位过程,
|
||
! 流量边界即为流量过程,水位流量关系边界只限挡潮闸情况,给出闸下潮位过程。
|
||
! 河道末端挡潮闸水位流量关系简化成Q=C1*B*e*dZ^C2。Z>Ztide且Z>Zctr时开闸,
|
||
! 否则关闸,Zctr是挡潮闸运行控制水位,保证内河不会过低。
|
||
! ----------------------------------------------------------------------------------
|
||
SUBROUTINE 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 )
|
||
|
||
INTEGER::NRIVER
|
||
INTEGER::NSECT
|
||
INTEGER::MRIVER
|
||
INTEGER::KRC
|
||
INTEGER::NDATA
|
||
|
||
INTEGER RIVER,TSTEP
|
||
|
||
! node
|
||
INTEGER::Ns(nriver),Pc(nriver),Nrc(krc,nriver),Lc(krc,nriver)
|
||
REAL::Dric(krc,nriver),Qj(ndata,krc,nriver),Asave(krc,nriver)
|
||
! boundary
|
||
INTEGER::UB1(nriver),UB2(nriver),DB1(nriver),DB2(nriver),NUB(2,nriver),NDB(2,nriver)
|
||
REAL::UBV(ndata,nriver),Aphi(2,nriver),DBV(ndata,nriver),Gate(4,nriver),ql,Zctr
|
||
! calcu
|
||
REAL::dt,sita,Bsor1,Bsor2
|
||
! zzqq
|
||
REAL::Z0(nsect,nriver),Q0(nsect,nriver),Z(nsect,nriver),Q(nsect,nriver),V(nsect,nriver)
|
||
! r_bv
|
||
REAL::condu,condd(3)
|
||
|
||
REAL:: ZQ(NDATA)
|
||
|
||
|
||
|
||
TC=DT*FLOAT(TSTEP)/3600.0
|
||
|
||
! 上游边界处理
|
||
IF(UB2(RIVER).EQ.1)THEN ! 外
|
||
DO II=1,NDATA
|
||
ZQ(II)=UBV(II,RIVER)
|
||
END DO
|
||
CALL INT_A(TC,NDATA,ZQ,FC)
|
||
CONDU=FC
|
||
ELSEIF(UB2(RIVER).EQ.2)THEN ! 内
|
||
IR=NUB(1,RIVER)
|
||
IS=NUB(2,RIVER)
|
||
IF(UB1(RIVER).EQ.1)THEN
|
||
CONDU=Z(IS,IR)
|
||
END IF
|
||
IF(UB1(RIVER).EQ.2)THEN
|
||
CONDU=Q(IS+1,IR)
|
||
END IF
|
||
END IF
|
||
|
||
! 下游边界处理
|
||
IF(DB2(RIVER).EQ.1)THEN
|
||
DO II=1,NDATA
|
||
ZQ(II)=DBV(II,RIVER)
|
||
END DO
|
||
CALL INT_A(TC,NDATA,ZQ,FC)
|
||
IF(DB1(RIVER).EQ.1)THEN
|
||
CONDD(1)=1.0
|
||
CONDD(2)=0.0
|
||
CONDD(3)=FC
|
||
ELSE IF(DB1(RIVER).EQ.2)THEN
|
||
CONDD(1)=0.0
|
||
CONDD(2)=1.0
|
||
CONDD(3)=FC
|
||
ELSE IF(DB1(RIVER).EQ.3)THEN
|
||
ZU0=Z0(NS(RIVER)-1,RIVER)
|
||
ZU=Z0(NS(RIVER)-1,RIVER)
|
||
ZU=(1-BSOR1)*ZU0+BSOR1*ZU
|
||
B=GATE(1,RIVER)
|
||
QMAX=GATE(2,RIVER)
|
||
C1=GATE(3,RIVER)
|
||
C2=GATE(4,RIVER)
|
||
IF(ZU>FC.AND.ZU>=ZCTR)THEN
|
||
DZ=ZU-FC
|
||
EK=5.0*DZ
|
||
IF(DZ<0.15)THEN
|
||
E=0.0
|
||
END IF
|
||
QQ=C1*B*EK*DZ**C2
|
||
QQ=(1-BSOR1)*Q0(NS(RIVER),RIVER)+BSOR1*QQ
|
||
IF(QQ>QMAX)THEN
|
||
QQ=QMAX
|
||
END IF
|
||
CONDD(1)=0.0
|
||
CONDD(2)=1.0
|
||
CONDD(3)=QQ
|
||
ELSE
|
||
CONDD(1)=0.0
|
||
CONDD(2)=1.0
|
||
CONDD(3)=0.0
|
||
END IF
|
||
END IF
|
||
ELSEIF(DB2(RIVER).EQ.2)THEN
|
||
IR=NDB(1,RIVER)
|
||
IS=NDB(2,RIVER)
|
||
IF(DB1(RIVER).EQ.1)THEN
|
||
CONDD(1)=1.0
|
||
CONDD(2)=0.0
|
||
CONDD(3)=Z(IS,IR)
|
||
ELSE
|
||
AH=APHI(1,RIVER)
|
||
PHI=APHI(2,RIVER)
|
||
IF(Z(NS(RIVER),RIVER)>=Z(IS,IR))THEN
|
||
QQ=AH*PHI*SQRT(2*9.8*(Z(NS(RIVER),RIVER)-Z(IS,IR)))
|
||
ELSE
|
||
QQ=-AH*PHI*SQRT(2*9.8*(Z(IS,IR)-Z(NS(RIVER),RIVER)))
|
||
END IF
|
||
QQ=(1-BSOR2)*Q0(NS(RIVER),RIVER)+BSOR2*QQ
|
||
CONDD(1)=0.0
|
||
CONDD(2)=1.0
|
||
CONDD(3)=QQ
|
||
END IF
|
||
END IF
|
||
|
||
END SUBROUTINE SUB_BOUND
|
||
|
||
|
||
|
||
|