Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migration of unmigrated content due to installation of a new plugin
Include Page
TOOLS:Header, DesignTOOLS:
Header, Design
scrollbar

...

Implementation steps

We will implement running of Sobek through a dll using the following approach:

...

setvalues will be defined in new interface (not in iwlaccess !)
fortran c / code will implement methods in interface

Steps to follow

step 1
Convert cf_openmi to vs2005 sln (debugging fortran will be easier and is a requirement)

step 2
Define derived types for 1d model:

  • Network
    Code Block
    
    Type Network
     int nNodes 
     Node Nodes [nNodes]
     int nBranches
     Branch Branches []
    End Type
    
    Type Node
    End Type
    
    Type Branch
    End Type
    
  • Model parameters
  • Boundary Conditions
  • Initial Conditions
  • Structures
  • Output variables

step 3
create an adapter inside cf_openmi with an interface to 1d model with at least the following kind of methods:
-setnetwork
-setboundaryandinitial
-setparameters

we want our c# model to look like this (user friendly)

No Format

        [Test]
        public void RunSobek()
        {
            double startTime = 0.0;
            double endTime = 10.0;
            double timeStep = 1.0;

            Model1D.Initialize();

            // create simple network
            //
            // n1           n2             n3
            // x|----|--------|x|-------------|x
            //      r1             r2
            //

            Model1D.SetBranches(...);
            Model1D.SetGridSteps(...);
            
            Model1D.SetRunTimeParameter(startTime, endTime, timeStep);
            
            Model1D.RunTimeStep();

            double time = Model1D.GetCurrentTime();

            Assert.AreEqual(1.0, time);
        }

 

see similar implementation for modflow

examples

Notes

  1. Sobek OpenMI module: 
    Useful function for initialising and performing one or more timesteps and finalizing.
    •  'SE_OpenMI.f90' communicates with OEM buffer.
    • 'SE_OpenMI.f90' has calls to module OMI_CF_control in (OMI_CF_control.f90), which in turn calls directly sobeksim subroutines
  1. Present SOBEK reads nefis files during initialisation (using m_nefisinput.mod). Nefis is used in subroutines: read_initial_values_strpar_etc, soedef, sogetm and wetcrs.

SOBEK variables read from NEFIS

interface

General structure of the Deltshell - Sobeksim interface

The sobeksim interface now consists of the projects:

  1. DelftModelApi.Net
  2. delft_model_api
  3. delft_model_data

furthermore a module called GUI_communication is added to the project kernel_sobek_f

In DelftModelApi.Net the static class modelApi is defined. This class contains functions to transfer data from C# to the SOBEKSIM kernel. The functions in class modelApi are implemented in delft_model_api.dll. In module modelApi the exported functions of delft_model_api.dll are defined. The relevant data is stored in ModelGlobalData. ModelGlobalData uses derived types which are defined in ModelTypes and NetworkTypes. ModelTypes contains the run-time parameters and model state variables, whereas NetworkTypes contains the derived types to define a network. The module GUI_communication transfers the data from ModelGlobalData to the data structure of Sobeksim.

DelftModelApi.Net and GUI_Communication are described in the next subsections

DelftModelApi.Net

DelftModelApi.net contains the static class ModelApi. ModelApi in its turn contains functions to transfer data from C# to the SOBEKSIM kernel.
Available functions are:

Name

Description

setUsePluginData

Sets the flag for the computational kernel to use the modelapi

NetworkSetDimensions

Sets the dimensions of the network (number of branches, nodes, cross sections, ...

NetworkSetNode

Define a new node in the network

NetworkSetBranch

Define a new branch in the network

NetworkGetBranch

Get a branch

NetworkSetQBoundary

Set a Q-boundary at an end node of the network (limitation: at this time only constant boundary conditions are allowed)

NetworkSetHBoundary

Set an H-boundary at an end node of the network (limitation: at this time only constant boundary conditions are allowed)

NetworkSetTabCrossSection

Define a cross section in terms of widths with respect to height

NetworkSetCS

connect a cross section definition to a branch (limitation: Momentarily only one cross section per branch is allowed)

ModelInitialize

Start the SOBEK initialisation

ModelSetSimulationTimes

Set the simulation times for the model

ModelFinalize

Close/terminate the simulation

ModelGetCurrentTime

Gets the SOBEK current simulation time

ModelPerformTimeStep

Perform one time step

GUI_communication

In GUI_communication the datastructure of Sobeksim is filled. Since the initialisation of the arrays is performed at different locations in Sobeksim, there is a number of subroutines that perform a part of the initialisation, namely setValues, setValuesinMempool, getcsnam, setFlsData, setIds and setArrays.

Subroutine dumppool of GUI_Communication can be used for debugging purposes. Because dumppool writes the datastructure of sobeksim to file.

Todo

network

  1. More options for definition of grid

Structures

  1. Add structures to interface
  2. Add controllers and triggers to interface

Cross sections

  1. Add different types of cross sections, other than tabulated.
  2. Possibility to add more than one cross section on a branch (interpolation)
  3. Generation of conveyance tables

Boundary conditions

  1. QH-tables
  2. Time dependent boundary conditions
  3. Lateral discharges

Other

  1. Replace reading of Sobeksim.fnm
  2. Replace reading of Sobeksim.ini

Examples

In this example a network with three branches is defined. ModelApi example

Notes

  1. Sobek OpenMI module: 
    Useful function for initialising and performing one or more timesteps and finalizing.
    •  'SE_OpenMI.f90' communicates with OEM buffer.
    • 'SE_OpenMI.f90' has calls to module OMI_CF_control in (OMI_CF_control.f90), which in turn calls directly sobeksim subroutines
  1. Present SOBEK reads nefis files during initialisation (using m_nefisinput.mod). Nefis is used in subroutines: read_initial_values_strpar_etc, soedef, sogetm and wetcrs.

SOBEK variables read from NEFIS

Code Block
Code Block

module DS_communication

   type Sobek_Data	
      integer                         :: nnode         ! nr of sobek nodes
      integer                         :: nbran         ! nr of branches
      integer                         :: nstdb
      integer                         :: nstru         ! number of structures
      integer                         :: ntrigrnnode         ! numbernr of sobek triggersnodes
      integer                         :: ncontrnbran         ! numbernr of controllersbranches
      integer                         :: ntcrel        ! number of trigger-controller relationsnstdb
      integer                         :: ncsrelnstru         ! number of controller-structure relationsstructures
      integer                         :: nqlat ntrigr        ! number of lateral inflowstriggers
      integer                         :: ngridncontr         ! nrnumber of sobek pointscontrollers
      integer                         :: nbounntcrel         ! number of opentrigger-controller boundariesrelations
      integer                         :: nhstatncsrel        ! number of 1D waterlevel boundariescontroller-structure relations
      integer                         :: nqstatnqlat         ! number of 1Dlateral discharge boundariesinflows
      integer                         :: ntabm
 ngrid         !  integernr of sobek points
      integer                   :: maxtab
     :: integernboun         ! number of open boundaries
      integer      :: maxlev
      integer            :: nhstat        ! number of 1D ::waterlevel ncrossboundaries
      integer                         :: nqstat nevents
       ! integernumber of 1D discharge boundaries
      integer               :: mxstrpar      ! leading dimension of:: strparntabm
      integer                         :: mxistrtyp     ! leading dimension of istrtypmaxtab
      integer                         :: mxstrmu       !maxlev
      integer                         :: mxcrossncross
      integer                         :: mxqltparnevents
      integer                         :: mxtrigermxstrpar      ! leading dimension of trigerstrpar
      integer                         :: mxcontrl mxistrtyp     ! leading dimension of contrlistrtyp
      integer                         :: mxconhismxstrmu = 5  ! leading dimension of conhis!
      integer                         :: mxconhis mxcross
      integer                      ! leading dimension of:: conhismxqltpar
      integer                         :: mxtrcnrlmxtriger      ! leading dimension of trcnrltriger
      integer                         :: mxcnstrlmxcontrl      ! leading dimension of cnstrl = 2contrl
      integer                         :: mxengpar mxconhis = 5  ! !leading dimension of engparconhis
      integer                         :: mxbranchmxconhis      ! leadleading dimdimension of branchconhis
      integer                         :: nuptmxtrcnrl      ! leading dimension of  trcnrl
      integer                         :: msect
mxcnstrl      integer! leading dimension of cnstrl = 2
              integer     :: lcnvmax

      real   , allocatable            :: strparmxengpar (:,:)  ! structure parameters ! dimension of engpar
      (mxstrpar,nstru)
integer      real   , allocatable            :: strmu  (:,:) mxbranch  ! structure mu  ! lead dim of branch
      integer      (mxstrmu,nstru)
      integer, allocatable            :: istrtyp(:,:)nupt  ! structure type       
      integer   (mxistrtyp,nstru)
      character(len=40), allocatable  :: contrnam(:)   ! names of controllers      :: msect
   (ncontr)
   integer   character(len=40), allocatable  :: trigrnam(:)   ! names of triggers             (ntrigr):: lcnvmax

      character(len=40)real   , allocatable  :: qlatnm(:)     ! ids of qlats :: strpar (:,:)  ! structure  parameters          (nqlatmxstrpar,nstru)
      real   , allocatable            :: qlatstrmu  (:,:)  ! structure  !mu lateral inflow                (nqlatmxstrmu,nstru)
      real   integer, allocatable            :: qltparistrtyp(:,:)   ! lateralstructure inflowtype parameters     (mxqltpar,nqlat)
      integer, allocatable   (mxistrtyp,nstru)
      character(len=40), allocatable  :: nodecontrnam(:,:)     ! sobeknames node administration     (nnode)
of controllers      integer, allocatable   (ncontr)
      character(len=40), allocatable  :: branchtrigrnam(:,:)   ! sobeknames of branchtriggers admin            (mxbranch,nbranntrigr)
      integercharacter(len=40), allocatable            :: trigerqlatnm(:,:)     ! triggerids of dataqlats                  (mxtriger,ntrigrnqlat)
      real   , allocatable            :: qlat  contrl(:,:)     ! controllerlateral inflow data               (mxcontrl,ncontrnqlat)
      integerreal   , allocatable            :: trcnrlqltpar(:,:)   ! lateral triggerinflow parameters controller relation   (mxtrcnrlmxqltpar,ntcrelnqlat)
      integer, allocatable            :: cnstrlnode(:,:)     ! controller structure relation (mxcnstrl,ncsrel sobek node administration     (nnode)
      integer, allocatable            :: hbdparbranch(:,:)   ! integer parameters (3,*), 1=?, 2=iopt, 3=itab (3,nhstatsobek branch admin            (mxbranch,nbran)
      integer, allocatable            :: qbdpartriger(:,:)   ! integer parameters (3,*), 1=?, 2=iopt, 3=itab (3,nqstat trigger data                  (mxtriger,ntrigr)
      real   , allocatable            :: contrl(:,:)   ! controller data     :: engpar(:)     ! Engelund-Hansen parameters    (mxengparmxcontrl,ncontr)
      real   integer, allocatable            :: hpacktrcnrl(:,:)      ! s0trigger voor sobek points     controller relation     (ngridmxtrcnrl,ntcrel)
      real   integer, allocatable            :: qpackcnstrl(:,:)      ! q  voor sobek points  controller structure relation (mxcnstrl,ncsrel)
      integer, allocatable (ngrid)
      double precision, allocatable   :: xycoorhbdpar(:,:)   ! integer parameters (23,ngrid*), x1=?,y coordinates for sobek points (2,ngrid2=iopt, 3=itab (3,nhstat)
      integer, allocatable allocatable           :: qbdpar(:,:)   ! integer  :: nlevu   (:)parameters (3,*), 1=?, 2=iopt, 3=itab (3,nqstat)
   !   real   , allocatable            :: engpar(:)     ! Engelund-Hansen parameters    (nuptmxengpar)
      real,   , allocatable allocatable           :: chan_hu hpack(:,:) !     !                s0 voor sobek points          (ngrid)
      real,   , allocatable allocatable           :: chan_af qpack(:,:,:)      ! q  voor sobek points          (ngrid)
      double precision, allocatable   :: xycoor(nupt,lcnvmax,msect)
      real,:,:)   ! (2,ngrid) x,y coordinates for sobek points (2,ngrid)
      integer,  allocatable           :: nlevu :: chan_wf (:,:,:)   !  !                             (nupt,lcnvmax,msect)
      real,     allocatable           :: chan_pfhu (:,:,:) !     !                          (nupt,lcnvmax,msectngrid)
      real,     allocatable           :: chan_coaf (:,:,:)    !                          (nupt,lcnvmax,msect)
      real,     allocatable           :: chan_cnwf (:,:,:)    !                          (nupt,lcnvmax,msect)
      real,     allocatable           :: chan_cz1pf (:,:,:)    !                          (nupt,lcnvmax,msect)
      real,     allocatable           :: chan_cz2co (:,:,:)    !                          (nupt,lcnvmax,msect)
      integerreal,     allocatable            :: nlevhchan_cn   (:,:,:)        !                          (nupt,lcnvmax,msect)
      real,     allocatable            :: chan_hh cz1(:,:,:)      !                          (ngridnupt,lcnvmax,msect)
      real,     allocatable            :: chan_at cz2(:,:,:)      !                          (ngridnupt,lcnvmax,msect)
      realinteger,    allocatable            :: nlevh  chan_wt (:,:)        !                          (ngridnupt,lcnvmax)
      character(len=CharLen ), allocatable, save :: nodenm        ,msect)
      real,   ! allocatable          (nnode)
    :: chan_hh character(len=CharLen ), allocatable, save :: gridnnm (:,:)      !               !           (ngrid,lcnvmax)
   end type Sobek_Data
end module
Code Block

network
   branch
   grid_point (h + u)
 real,    allocatable  name
      x, y
   node
  :: chan_at (:,:)    name
  ! cross_section
      location
      A(H), W(H), P(H), Cup(H), Cdown(H)
      type

   structure
(ngrid,lcnvmax)
      real,  name
  allocatable    location
      type
  :: chan_wt (:,:)  parameters

   trigger
 !     name
      location
      controller

   controller
      name(ngrid,lcnvmax)
      location
      structure
character(len=CharLen ), allocatable, save :: nodenm    
data
   initial
      y(L), Q(L), H(L), t =! 0

   boundary conditions
      name(nnode)
      type character(len=CharLen Q(t), H(t), Q(H), Ql(L,t)
allocatable, save :: gridnnm          value_type = table or value or time! series

   parameters
      Engelund-Hansen parameters (ngrid)

Q1: What is relation trigger-contoller, contoller-structure

...