Model Integration with SWAT -...
Transcript of Model Integration with SWAT -...
Model Integration with SWAT
A publish-subscribe type system
June 24, 2013
André Dozier and Olaf David
Detailed Assessment Model – daily and 1-5km resolution
SWAT Read Inputs
MODFLOW Solver
MODFLOW Read Inputs
MODFLOW Close
RT3D Read Inputs
RT3D Solver
RT3D Close
SWAT HRU calcs
SWAT Routing
SWAT Output
SWAT Close
Daily Loop
Optimization – yearly (or 2-5 year) and 30-50km resolution
WALL Solver
WALL Solver
Minimize Vulnerability and Cost
CGE Solver
SWAT Solver
IUWM BMPs
Few Iterations
Ensure Economic Demand = Cons. Use
Supply to WALL Demand to SWAT
Manually add model
detail
Pareto optimal curve of
management solutions
DayCent
Linkages
• Need to add two linking components
SWAT Model
Other Model
Linkages
• Need to add two linking components
SWAT Model
OMS Simulation
Other Model
My OMS Component
My Wrapper
Linkages
• Need to add two linking components
SWAT Model
OMS Simulation
Other Model
My OMS Component
My Wrapper
Linkages
• Need to add two linking components
SWAT Model
event
OMS Simulation
SWAT run
direction Other Model
run component
finished
My OMS Component
My Wrapper Special OMS Component - Event names - Event inputs - Event outputs - Communication via MPI
(use blocking sends)
Linkages
• Need to add two linking components
OMS Simulation
Other Model
My OMS Component Normal (or special if desired) OMS component - Inputs - Outputs - Execution subroutine
My Wrapper Special OMS Component - Event names - Event inputs - Event outputs - Communication via MPI
(use blocking sends)
Linkages
• Need to add two linking components
OMS Simulation
OMS Simulation
My OMS Component Normal (or special if desired) OMS component - Inputs - Outputs - Execution subroutine
My Wrapper Special OMS Component - Event names - Event inputs - Event outputs - Communication via MPI
(use blocking sends)
Linkages
• Need to add two linking components
Simulation specifications - location(s) or NULL - Native or managed?
“Events” in SWAT SWAT Start Read Inputs Year Loop Month Loop Daily Loop End End End
“Events” in SWAT SWAT Start Read Inputs Year Loop Month Loop Daily Loop call TopOfDailyLoop%fire() End End End
“Events” in SWAT SWAT Start Read Inputs Year Loop Month Loop Daily Loop call TopOfDailyLoop%fire() End End End
Array of function pointers
“Events” in SWAT SWAT Start Read Inputs Year Loop Month Loop Daily Loop call TopOfDailyLoop%fire() End End End
mysub
othersub
Array of function pointers
To “subscribe”
subroutine mysub()
print *,“my sub”
end subroutine
subroutine othersub()
print *,“other sub”
end subroutine
“Events” in SWAT SWAT Start Read Inputs Year Loop Month Loop Daily Loop call TopOfDailyLoop%fire() End End End
mysub
othersub
Array of function pointers
To “subscribe”
subroutine mysub()
print *,“my sub”
end subroutine
subroutine othersub()
print *,“other sub”
end subroutine
program subscriber()
use parm
implicit none
integer :: event_i
interface
subroutine mysub()
end subroutine
end interface
interface
subroutine othersub()
end subroutine
end interface
event_i = TopOfDailyLoop%subscribe(mysub)
event_i = TopOfDailyLoop%subscribe(othersub)
call swat_main()
end program
“Events” in SWAT SWAT Start Read Inputs Year Loop Month Loop Daily Loop call TopOfDailyLoop%fire() End End End
mysub
othersub
Array of function pointers
subroutine mysub()
print *,“my sub”
end subroutine
subroutine othersub()
print *,“other sub”
end subroutine
Special OMS-SWAT Component SWAT Start Read Inputs Year Loop Month Loop Daily Loop call TopOfDailyLoop%fire() End End call EndOfYear%fire() End
mpi_input
mpi_output
subroutine mpi_input()
use parm
! Variable initialization
! MPI inputs
call MPI_RECEIVE(buf, …)
! Variable dereferencing
end subroutine
subroutine mpi_output()
use parm
! Variable initialization
! MPI outputs
call MPI_SEND(buf, …)
! MPI wait until finished
call MPI_RECEIVE(buf, …)
! Variable dereferencing
end subroutine
Special OMS-SWAT Component SWAT Start Read Inputs Year Loop Month Loop Daily Loop call TopOfDailyLoop%fire() End End call EndOfYear%fire() End
mpi_input
mpi_output
Waits until inputs are available from another OMS component
Sends output from SWAT to OMS with the option of waiting until the component has finished running
My OMS Component
My Wrapper
Linkages
• Need to add two linking components
SWAT Model
event
OMS Simulation
SWAT run
direction Other Model
run component
finished
One Possible Orientation SWAT Start Read Inputs Year Loop Month Loop Daily Loop call TopOfDailyLoop%fire() End End call EndOfYear%fire() End
mpi_input
mpi_output
OMS Simulation
OMS Component(s)
OMS Component(s)
Another Possible Orientation SWAT Start Read Inputs Year Loop Month Loop Daily Loop call TopOfDailyLoop%fire() End End call EndOfYear%fire() End
mpi_output
mpi_input
OMS Simulation
OMS Component(s)
Allows parallel implementation
Yet Another Possible Orientation SWAT Start Read Inputs Year Loop Month Loop Daily Loop call TopOfDailyLoop%fire() End End call EndOfYear%fire() End
mpi_output
mpi_input
OMS Simulation
OMS Component(s)
mpi_input
mpi_output
Detailed Assessment Model – daily and 1-5km resolution
SWAT Read Inputs
MODFLOW Solver
MODFLOW Read Inputs
MODFLOW Close
RT3D Read Inputs
RT3D Solver
RT3D Close
SWAT HRU calcs
SWAT Routing
SWAT Output
SWAT Close
Daily Loop
Optimization – yearly (or 2-5 year) and 30-50km resolution
WALL Solver
WALL Solver
Minimize Vulnerability and Cost
CGE Solver
SWAT Solver
IUWM BMPs
Few Iterations
Ensure Economic Demand = Cons. Use
Supply to WALL Demand to SWAT
Manually add model
detail
Pareto optimal curve of
management solutions
DayCent
First test case