!! Manage cells connection in the river network
!|author: Giovanni Ravazzani
! license: GPL
!
!### History
!
! current version 1.0 - 4th October 2016
!
! | version | date | comment |
! |----------|-------------|----------|
! | 1.0 | 04/Oct/2016 | Original code |
!
!### License
! license: GNU GPL
!
!### Module Description
! Module to manage how cells are connected in a network
!
MODULE HydroNetwork
! Modules used:
USE DataTypeSizes, ONLY : &
! Imported Parameters:
float, short
USE GridLib, ONLY : &
! imported definition:
grid_integer
USE GridOperations, ONLY : &
!Importe routines:
GetIJ
USE Utilities, ONLY : &
!imported routines:
GetUnit
USE Loglib, ONLY : &
!Imported routines:
Catch
USE ErrorCodes, ONLY : &
!Imported parameters:
openFileError
USE StringManipulation, ONLY : &
!Imported routines:
ToString
IMPLICIT NONE
! Global (i.e. public) Declarations:
!TYPE ReachSoilBalance
! INTEGER :: id
! !====================================================
! REAL(KIND = float) :: x0 !!\__beginning of reach
! REAL(KIND = float) :: y0 !!/ spatial coordinate
! REAL(KIND = float) :: x1 !!\__end of reach
! REAL(KIND = float) :: y1 !!/
! !====================================================
! INTEGER :: i0 !!\__beginning of reach
! INTEGER :: j0 !!/ local reference system
! INTEGER :: i1 !!\__end of reach
! INTEGER :: j1 !!/
! !====================================================
! INTEGER :: ncells !!number of cells in a reach
! INTEGER :: order !! Horton-Sthraler order
! REAL(KIND = float) :: slope !! average reach slope [m/m]
! REAL(KIND = float) :: length !!reach length [m]
! REAL(KIND = float) :: area !! area drained by end section [m2]
! INTEGER(KIND = short) :: soilBalanceID
! REAL(KIND = float) :: n !!manning roughness coefficient [s m^(-1/3)]
!END TYPE ReachSoilBalance
!TYPE ReachSubsurfaceFlow
! INTEGER :: id
! !====================================================
! REAL(KIND = float) :: x0 !!\__beginning of reach
! REAL(KIND = float) :: y0 !!/ spatial coordinate
! REAL(KIND = float) :: x1 !!\__end of reach
! REAL(KIND = float) :: y1 !!/
! !====================================================
! INTEGER :: i0 !!\__beginning of reach
! INTEGER :: j0 !!/ local reference system
! INTEGER :: i1 !!\__end of reach
! INTEGER :: j1 !!/
! !====================================================
! INTEGER :: ncells !!number of cells in a reach
! INTEGER :: order !! Horton-Sthraler order
! REAL(KIND = float) :: slope !! average reach slope [m/m]
! REAL(KIND = float) :: length !!reach length [m]
! REAL(KIND = float) :: area !! area drained by end section [m2]
! INTEGER :: routing_model
!END TYPE ReachSubsurfaceFlow
TYPE ReachSurfaceFlow
INTEGER :: id
!====================================================
REAL(KIND = float) :: x0 !!\__beginning of reach
REAL(KIND = float) :: y0 !!/ spatial coordinate
REAL(KIND = float) :: x1 !!\__end of reach
REAL(KIND = float) :: y1 !!/
!====================================================
INTEGER :: i0 !!\__beginning of reach
INTEGER :: j0 !!/ local reference system
INTEGER :: i1 !!\__end of reach
INTEGER :: j1 !!/
!====================================================
INTEGER :: ncells !!number of cells in a reach
INTEGER :: order !! Horton-Sthraler order
REAL(KIND = float) :: slope !! average reach slope [m/m]
REAL(KIND = float) :: length !!reach length [m]
REAL(KIND = float) :: area !! area drained by end section [m2]
INTEGER :: routing_model
REAL(KIND = float) :: n !!manning roughness coefficient [s m^(-1/3)]
REAL(KIND = float) :: B0 !!bottom width, = 0 for triangular section [m]
REAL(KIND = float) :: alpha !!angle formed by dykes over a horizontal plane [deg]
REAL(KIND = float) :: k !!flood wave travel time used to compute C1, C2, and C3 [s]
REAL(KIND = float) :: x !!Muskingum weighting factor [-]
END TYPE ReachSurfaceFlow
TYPE ReachGroundwater
INTEGER :: id
!====================================================
REAL(KIND = float) :: x0 !!\__beginning of reach
REAL(KIND = float) :: y0 !!/ spatial coordinate
REAL(KIND = float) :: x1 !!\__end of reach
REAL(KIND = float) :: y1 !!/
!====================================================
INTEGER :: i0 !!\__beginning of reach
INTEGER :: j0 !!/ local reference system
INTEGER :: i1 !!\__end of reach
INTEGER :: j1 !!/
!====================================================
INTEGER :: ncells !!number of cells in a reach
INTEGER :: order !! Horton-Sthraler order
REAL(KIND = float) :: riverbed ![m]
REAL(KIND = float) :: scalefactor_conductivity
END TYPE ReachGroundwater
TYPE ReachSediment
INTEGER :: id
!====================================================
REAL(KIND = float) :: x0 !!\__beginning of reach
REAL(KIND = float) :: y0 !!/ spatial coordinate
REAL(KIND = float) :: x1 !!\__end of reach
REAL(KIND = float) :: y1 !!/
!====================================================
INTEGER :: i0 !!\__beginning of reach
INTEGER :: j0 !!/ local reference system
INTEGER :: i1 !!\__end of reach
INTEGER :: j1 !!/
!====================================================
INTEGER :: ncells !!number of cells in a reach
INTEGER :: order !! Horton-Sthraler order
REAL(KIND = float) :: slope !! average reach slope [m/m]
REAL(KIND = float) :: length !!reach length [m]
REAL(KIND = float) :: area !! area drained by end section [m2]
REAL(KIND = float) :: d50 !!mean sediment size [mm]
INTEGER(KIND = short) :: routingMethod
END TYPE ReachSediment
!TYPE NetworkSoilBalance
! TYPE(ReachSoilBalance),POINTER :: branch (:)
! INTEGER :: nreach
!END TYPE NetworkSoilBalance
!TYPE NetworkSubsurfaceFlow
! TYPE(ReachSubsurfaceFlow),POINTER:: branch (:)
! INTEGER :: nreach
!END TYPE NetworkSubsurfaceFlow
TYPE NetworkGroundwater
TYPE(ReachGroundwater),POINTER :: branch (:)
INTEGER :: nreach
END TYPE NetworkGroundwater
TYPE NetworkSurfaceFlow
TYPE(ReachSurfaceFlow),POINTER :: branch (:)
INTEGER :: nreach
END TYPE NetworkSurfaceFlow
TYPE NetworkSediment
TYPE(ReachSediment),POINTER :: branch (:)
INTEGER :: nreach
END TYPE NetworkSediment
!Public routines
PUBLIC :: ReadHydroNetwork
!Local declarations:
!Local routines
PRIVATE :: ReadNetworkSurfaceFlow
!PRIVATE :: ReadNetworkSubsurfaceFlow
!PRIVATE :: ReadNetworkSoilBalance
PRIVATE :: ReadNetworkGroundwater
PRIVATE :: ReadNetworkSediment
!Local parameters
! Operator definitions:
! Define new operators or overload existing ones.
INTERFACE ReadHydroNetwork
MODULE PROCEDURE ReadNetworkSurfaceFlow
!MODULE PROCEDURE ReadNetworkSubsurfaceFlow
!MODULE PROCEDURE ReadNetworkSoilBalance
MODULE PROCEDURE ReadNetworkGroundwater
MODULE PROCEDURE ReadNetworkSediment
END INTERFACE
!=======
CONTAINS
!=======
! Define procedures contained in this module.
!==============================================================================
!| Description:
! Read network for surface flow routing from file
SUBROUTINE ReadNetworkSurfaceFlow &
!
( filename, domain, network )
!arguments with intent in:
CHARACTER (LEN = *), INTENT(IN) :: filename
TYPE(grid_integer), INTENT(IN) :: domain
!arguments with intent out:
TYPE(NetworkSurfaceFlow), INTENT(OUT) :: network
!local declarations
INTEGER :: k
INTEGER :: fileunit
INTEGER :: err_io
INTEGER :: id
LOGICAL :: check_domain
!-------------------------------end of declaration-----------------------------
!open file in readonly mode
fileunit = GetUnit ()
OPEN (unit = fileunit, file = filename, status = "old", &
action = "read", iostat = err_io )
IF (err_io /= 0) THEN
CALL Catch ('error', 'HydroNetwork', &
'error opening file of surface flow hydro network: ', &
code = openFileError, argument = fileName )
END IF
!count number of branches in network
k = 0
READ(fileunit,*)
READ(fileunit,*)
DO !loop till end of file
READ(fileunit,*,iostat=err_io) id
IF (err_io /= 0) THEN
EXIT
ELSE
k = k + 1
END IF
END DO
IF (k < 1) THEN
CALL Catch ('error', 'HydroNetwork', &
'no branches detected in surface flow network')
ELSE
CALL Catch ('info', 'HydroNetwork', &
' number of detected branches in surface flow network: ', &
argument = ToString(k) )
END IF
!rewind file
REWIND (fileunit)
!skip first two lines
READ(fileunit,*)
READ(fileunit,*)
!allocate branches
network % nreach = k
ALLOCATE (network % branch(k))
!read info from file
DO k = 1, network % nreach
READ (fileunit,*) network % branch (k) % id, network % branch (k) % x0, &
network % branch (k) % y0, network % branch (k) % x1, &
network % branch (k) % y1, network % branch (k) % ncells, &
network % branch (k) % order, network % branch (k) % slope, &
network % branch (k) % length, network % branch (k) % area, &
network % branch (k) % routing_model, network % branch (k) % n, &
network % branch (k) % B0, network % branch (k) % alpha, &
network % branch (k) % k, network % branch (k) % x
!compute i0, j0, i1, j1
CALL GetIJ (X = network % branch (k) % x0, Y = network % branch (k) % y0, &
grid = domain, i = network % branch (k) % i0, j = network % branch (k) % j0, &
check = check_domain)
IF (.NOT. check_domain) THEN
CALL Catch ('error', 'HydroNetwork', &
'beginning cell out of domain in branch of surface flow with id: ', &
argument = ToString(network % branch(k) % id ) )
END IF
CALL GetIJ (X = network % branch (k) % x1, Y = network % branch (k) % y1, &
grid = domain, i = network % branch (k) % i1, j = network % branch (k) % j1, &
check = check_domain )
IF (.NOT. check_domain) THEN
CALL Catch ('error', 'HydroNetwork', &
'end cell out of domain in branch of surface flow with id: ', &
argument = ToString(network % branch(k) % id ) )
END IF
END DO
!close file
CLOSE (fileunit)
RETURN
END SUBROUTINE ReadNetworkSurfaceFlow
!==============================================================================
!! Description:
!! Read network for sub-surface flow routing from file
!SUBROUTINE ReadNetworkSubsurfaceFlow &
!!
!( filename, domain, network )
!
!!arguments with intent in:
!CHARACTER (LEN = *), INTENT(IN) :: filename
!TYPE(grid_integer), INTENT(IN) :: domain
!
!!arguments with intent out:
!TYPE(NetworkSubsurfaceFlow), INTENT(OUT) :: network
!
!
!!local declarations
!INTEGER :: k
!INTEGER :: fileunit
!INTEGER :: err_io
!INTEGER :: id
!LOGICAL :: check_domain
!
!!-------------------------------end of declaration-----------------------------
!!open file in readonly mode
!fileunit = GetUnit ()
!OPEN (unit = fileunit, file = filename, status = "old", &
! action = "read", iostat = err_io )
!
!IF (err_io /= 0) THEN
! CALL Catch ('error', 'HydroNetwork', &
! 'error opening file of sub-surface flow hydro network: ', &
! code = openFileError, argument = filename )
!END IF
!
!!count number of branches in network
!k = 0
!READ(fileunit,*)
!READ(fileunit,*)
!
!DO !loop till end of file
! READ(fileunit,*,iostat=err_io) id
! IF (err_io /= 0) THEN
! EXIT
! ELSE
! k = k + 1
! END IF
!END DO
!
!IF (k < 1) THEN
! CALL Catch ('error', 'HydroNetwork', &
! 'no branches detected in sub-surface flow network')
!ELSE
! CALL Catch ('info', 'HydroNetwork', &
! ' number of detected branches in sub-surface flow network: ', &
! argument = ToString(k) )
!END IF
!
!!rewind file
!REWIND (fileunit)
!!skip first two lines
!READ(fileunit,*)
!READ(fileunit,*)
!
!!allocate branches
!network % nreach = k
!ALLOCATE (network % branch(k))
!
!!read info from file
!DO k = 1, network % nreach
! READ (fileunit,*) network % branch (k) % id, network % branch (k) % x0, &
! network % branch (k) % y0, network % branch (k) % x1, &
! network % branch (k) % y1, network % branch (k) % ncells, &
! network % branch (k) % order, network % branch (k) % slope, &
! network % branch (k) % length, network % branch (k) % area, &
! network % branch (k) % routing_model
!
! !compute i0, j0, i1, j1
! CALL GetIJ (X = network % branch (k) % x0, Y = network % branch (k) % y0, &
! grid = domain, i = network % branch (k) % i0, j = network % branch (k) % j0, &
! check = check_domain)
! IF (.NOT. check_domain) THEN
! CALL Catch ('error', 'HydroNetwork', &
! 'beginning cell out of domain in branch of sub-surface flow with id: ', &
! argument = ToString(network % branch(k) % id ) )
! END IF
!
! CALL GetIJ (X = network % branch (k) % x1, Y = network % branch (k) % y1, &
! grid = domain, i = network % branch (k) % i1, j = network % branch (k) % j1, &
! check = check_domain )
! IF (.NOT. check_domain) THEN
! CALL Catch ('error', 'HydroNetwork', &
! 'end cell out of domain in branch of sub-surface flow with id: ', &
! argument = ToString(network % branch(k) % id ) )
! END IF
!END DO
!
!!close file
!CLOSE (fileunit)
!
!RETURN
!END SUBROUTINE ReadNetworkSubsurfaceFlow
!==============================================================================
!! Description:
!! Read network for soil balance from file
!SUBROUTINE ReadNetworkSoilBalance &
!!
!( filename, domain, network )
!
!!arguments with intent in:
!CHARACTER (LEN = *), INTENT(IN) :: filename
!TYPE(grid_integer), INTENT(IN) :: domain
!
!!arguments with intent out:
!TYPE(NetworkSoilBalance), INTENT(OUT) :: network
!
!
!!local declarations
!INTEGER :: k
!INTEGER :: fileunit
!INTEGER :: err_io
!INTEGER :: id
!LOGICAL :: check_domain
!
!!-------------------------------end of declaration-----------------------------
!!open file in readonly mode
!fileunit = GetUnit ()
!OPEN (unit = fileunit, file = filename, status = "old", &
! action = "read", iostat = err_io )
!
!IF (err_io /= 0) THEN
! CALL Catch ('error', 'HydroNetwork', &
! 'error opening file of soil balance hydro network: ', &
! code = openFileError, argument = filename )
!END IF
!
!!count number of branches in network
!k = 0
!READ(fileunit,*)
!READ(fileunit,*)
!
!DO !loop till end of file
! READ(fileunit,*,iostat=err_io) id
! IF (err_io /= 0) THEN
! EXIT
! ELSE
! k = k + 1
! END IF
!END DO
!
!IF (k < 1) THEN
! CALL Catch ('error', 'HydroNetwork', &
! 'no branches detected in soil balance network')
!ELSE
! CALL Catch ('info', 'HydroNetwork', &
! ' number of detected branches in soil balance network: ', &
! argument = ToString(k) )
!END IF
!
!!rewind file
!REWIND (fileunit)
!!skip first two lines
!READ(fileunit,*)
!READ(fileunit,*)
!
!!allocate branches
!network % nreach = k
!ALLOCATE (network % branch(k))
!
!!read info from file
!DO k = 1, network % nreach
! READ (fileunit,*) network % branch (k) % id, network % branch (k) % x0, &
! network % branch (k) % y0, network % branch (k) % x1, &
! network % branch (k) % y1, network % branch (k) % ncells, &
! network % branch (k) % order, network % branch (k) % slope, &
! network % branch (k) % length, network % branch (k) % area, &
! network % branch (k) % soilBalanceID, network % branch (k) % n
!
! !compute i0, j0, i1, j1
! CALL GetIJ (X = network % branch (k) % x0, Y = network % branch (k) % y0, &
! grid = domain, i = network % branch (k) % i0, j = network % branch (k) % j0, &
! check = check_domain)
! IF (.NOT. check_domain) THEN
! CALL Catch ('error', 'HydroNetwork', &
! 'beginning cell out of domain in branch of soil balance with id: ', &
! argument = ToString(network % branch(k) % id ) )
! END IF
!
! CALL GetIJ (X = network % branch (k) % x1, Y = network % branch (k) % y1, &
! grid = domain, i = network % branch (k) % i1, j = network % branch (k) % j1, &
! check = check_domain )
! IF (.NOT. check_domain) THEN
! CALL Catch ('error', 'HydroNetwork', &
! 'end cell out of domain in branch of soil balance with id: ', &
! argument = ToString(network % branch(k) % id ) )
! END IF
!END DO
!
!!close file
!CLOSE (fileunit)
!
!RETURN
!END SUBROUTINE ReadNetworkSoilBalance
!==============================================================================
!| Description:
! Read network for groundwater-surface interaction from file
SUBROUTINE ReadNetworkGroundwater &
!
( filename, domain, network )
!arguments with intent in:
CHARACTER (LEN = *), INTENT(IN) :: filename
TYPE(grid_integer), INTENT(IN) :: domain
!arguments with intent out:
TYPE(NetworkGroundwater), INTENT(OUT) :: network
!local declarations
INTEGER :: k
INTEGER :: fileunit
INTEGER :: err_io
INTEGER :: id
LOGICAL :: check_domain
!-------------------------------end of declaration-----------------------------
!open file in readonly mode
fileunit = GetUnit ()
OPEN (unit = fileunit, file = filename, status = "old", &
action = "read", iostat = err_io )
IF (err_io /= 0) THEN
CALL Catch ('error', 'HydroNetwork', &
'error opening file of groundwater hydro network: ', &
code = openFileError, argument = filename )
END IF
!count number of branches in network
k = 0
READ(fileunit,*)
READ(fileunit,*)
DO !loop till end of file
READ(fileunit,*,iostat=err_io) id
IF (err_io /= 0) THEN
EXIT
ELSE
k = k + 1
END IF
END DO
IF (k < 1) THEN
CALL Catch ('error', 'HydroNetwork', &
'no branches detected in groundwater network')
ELSE
CALL Catch ('info', 'HydroNetwork', &
' number of detected branches in groundwater network: ', &
argument = ToString(k) )
END IF
!rewind file
REWIND (fileunit)
!skip first two lines
READ(fileunit,*)
READ(fileunit,*)
!allocate branches
network % nreach = k
ALLOCATE (network % branch(k))
!read info from file
DO k = 1, network % nreach
READ (fileunit,*) network % branch (k) % id, network % branch (k) % x0, &
network % branch (k) % y0, network % branch (k) % x1, &
network % branch (k) % y1, network % branch (k) % ncells, &
network % branch (k) % order, network % branch (k) % riverbed, &
network % branch (k) % scalefactor_conductivity
!compute i0, j0, i1, j1
CALL GetIJ (X = network % branch (k) % x0, Y = network % branch (k) % y0, &
grid = domain, i = network % branch (k) % i0, j = network % branch (k) % j0, &
check = check_domain)
IF (.NOT. check_domain) THEN
CALL Catch ('error', 'HydroNetwork', &
'beginning cell out of domain in branch of groundwater with id: ', &
argument = ToString(network % branch(k) % id ) )
END IF
CALL GetIJ (X = network % branch (k) % x1, Y = network % branch (k) % y1, &
grid = domain, i = network % branch (k) % i1, j = network % branch (k) % j1, &
check = check_domain )
IF (.NOT. check_domain) THEN
CALL Catch ('error', 'HydroNetwork', &
'end cell out of domain in branch of groundwater with id: ', &
argument = ToString(network % branch(k) % id ) )
END IF
END DO
!close file
CLOSE (fileunit)
RETURN
END SUBROUTINE ReadNetworkGroundwater
!==============================================================================
!| Description:
! Read network for sediment routing from file
SUBROUTINE ReadNetworkSediment &
!
( filename, domain, network )
!arguments with intent in:
CHARACTER (LEN = *), INTENT(IN) :: filename
TYPE(grid_integer), INTENT(IN) :: domain
!arguments with intent out:
TYPE(NetworkSediment), INTENT(OUT) :: network
!local declarations
INTEGER :: k
INTEGER :: fileunit
INTEGER :: err_io
INTEGER :: id
LOGICAL :: check_domain
!-------------------------------end of declaration-----------------------------
!open file in readonly mode
fileunit = GetUnit ()
OPEN (unit = fileunit, file = filename, status = "old", &
action = "read", iostat = err_io )
IF (err_io /= 0) THEN
CALL Catch ('error', 'HydroNetwork', &
'error opening file of sediment routing hydro network: ', &
code = openFileError, argument = filename )
END IF
!count number of branches in network
k = 0
READ(fileunit,*)
READ(fileunit,*)
DO !loop till end of file
READ(fileunit,*,iostat=err_io) id
IF (err_io /= 0) THEN
EXIT
ELSE
k = k + 1
END IF
END DO
IF (k < 1) THEN
CALL Catch ('error', 'HydroNetwork', &
'no branches detected in sediment routing network')
ELSE
CALL Catch ('info', 'HydroNetwork', &
' number of detected branches in sediment routing network: ', &
argument = ToString(k) )
END IF
!rewind file
REWIND (fileunit)
!skip first two lines
READ(fileunit,*)
READ(fileunit,*)
!allocate branches
network % nreach = k
ALLOCATE (network % branch(k))
!read info from file
DO k = 1, network % nreach
READ (fileunit,*) network % branch (k) % id, network % branch (k) % x0, &
network % branch (k) % y0, network % branch (k) % x1, &
network % branch (k) % y1, network % branch (k) % ncells, &
network % branch (k) % order, network % branch (k) % slope, &
network % branch (k) % length, network % branch (k) % area, &
network % branch (k) % d50
!compute i0, j0, i1, j1
CALL GetIJ (X = network % branch (k) % x0, Y = network % branch (k) % y0, &
grid = domain, i = network % branch (k) % i0, j = network % branch (k) % j0, &
check = check_domain)
IF (.NOT. check_domain) THEN
CALL Catch ('error', 'HydroNetwork', &
'beginning cell out of domain in branch of sediment transport with id: ', &
argument = ToString(network % branch(k) % id ) )
END IF
CALL GetIJ (X = network % branch (k) % x1, Y = network % branch (k) % y1, &
grid = domain, i = network % branch (k) % i1, j = network % branch (k) % j1, &
check = check_domain )
IF (.NOT. check_domain) THEN
CALL Catch ('error', 'HydroNetwork', &
'end cell out of domain in branch of sediment transport with id: ', &
argument = ToString(network % branch(k) % id ) )
END IF
END DO
!close file
CLOSE (fileunit)
RETURN
END SUBROUTINE ReadNetworkSediment
END MODULE HydroNetwork