SUB_SHUILIANGJISUAN/Fortran/SUB_BOUND.f90
2025-05-09 17:45:43 +08:00

162 lines
3.7 KiB
Fortran
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

! ==================================================================================
! 确定计算时刻河段上下游边界条件值的子程序
! ==================================================================================
!
! 说明下游外边界条件都给定一个过程有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