SUB_SHUILIANGJISUAN/Fortran/SUB_BOUND.f90

165 lines
3.9 KiB
Fortran
Raw Permalink Normal View History

2025-05-09 17:45:43 +08:00
! ==================================================================================
2025-05-09 17:56:57 +08:00
! 确定计算时刻河段上下游边界条件值的子程序
2025-05-09 17:45:43 +08:00
! ==================================================================================
!
2025-05-09 17:56:57 +08:00
! 说明下游外边界条件都给定一个过程有ndata个数据点1小时间隔水位边界即为水位过程
! 流量边界即为流量过程,水位流量关系边界只限挡潮闸情况,给出闸下潮位过程。
! 河道末端挡潮闸水位流量关系简化成Q=C1*B*e*dZ^C2。Z>Ztide且Z>Zctr时开闸
! 否则关闸Zctr是挡潮闸运行控制水位保证内河不会过低。
2025-05-09 17:45:43 +08:00
! ----------------------------------------------------------------------------------
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
2025-05-09 17:56:57 +08:00
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
2025-05-09 17:45:43 +08:00
! calcu
REAL::dt,sita,Bsor1,Bsor2
! zzqq
2025-05-09 17:56:57 +08:00
REAL::Z0(nsect,nriver),Q0(nsect,nriver),Z(nsect,nriver),&
Q(nsect,nriver),V(nsect,nriver)
2025-05-09 17:45:43 +08:00
! r_bv
REAL::condu,condd(3)
REAL:: ZQ(NDATA)
TC=DT*FLOAT(TSTEP)/3600.0
2025-05-09 17:56:57 +08:00
! 上游边界处理
IF(UB2(RIVER).EQ.1)THEN ! 外
2025-05-09 17:45:43 +08:00
DO II=1,NDATA
ZQ(II)=UBV(II,RIVER)
END DO
CALL INT_A(TC,NDATA,ZQ,FC)
CONDU=FC
2025-05-09 17:56:57 +08:00
ELSEIF(UB2(RIVER).EQ.2)THEN ! 内
2025-05-09 17:45:43 +08:00
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
2025-05-09 17:56:57 +08:00
! 下游边界处理
2025-05-09 17:45:43 +08:00
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