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

...

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.

...

SOBEK variables read from NEFISNEFIS

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                         :: ntrigr        ! number of triggers
      integer                         :: ncontr        ! number of controllers
      integer                         :: ntcrel        ! number of trigger-controller relations
      integer                         :: ncsrel        ! number of controller-structure relations
      integer                         :: nqlat         ! number of lateral inflows
      integer                         :: ngrid         ! nr of sobek points
      integer                         :: nboun         ! number of open boundaries
      integer                         :: nhstat        ! number of 1D waterlevel boundaries
      integer                         :: nqstat        ! number of 1D discharge boundaries
      integer                         :: ntabm
      integer                         :: maxtab
      integer                         :: maxlev
      integer                         :: ncross
      integer                         :: nevents
      integer                         :: mxstrpar      ! leading dimension of strpar
      integer                         :: mxistrtyp     ! leading dimension of istrtyp
      integer                         :: mxstrmu       !
      integer                         :: mxcross
      integer                         :: mxqltpar
      integer                         :: mxtriger      ! leading dimension of triger
      integer                         :: mxcontrl      ! leading dimension of contrl
      integer                         :: mxconhis = 5  ! leading dimension of conhis
      integer                         :: mxconhis      ! leading dimension of conhis
      integer                         :: mxtrcnrl      ! leading dimension of trcnrl
      integer                         :: mxcnstrl      ! leading dimension of cnstrl = 2
      integer                         :: mxengpar      ! dimension of engpar
      integer                         :: mxbranch      ! lead dim of branch
      integer                         :: nupt           
      integer                         :: msect
      integer                         :: lcnvmax

      real   , allocatable            :: strpar (:,:)  ! structure parameters          (mxstrpar,nstru)
      real   , allocatable            :: strmu  (:,:)  ! structure mu                  (mxstrmu,nstru)
      integer, allocatable            :: istrtyp(:,:)  ! structure type                (mxistrtyp,nstru)
      character(len=40), allocatable  :: contrnam(:)   ! names of controllers          (ncontr)
      character(len=40), allocatable  :: trigrnam(:)   ! names of triggers             (ntrigr)
      character(len=40), allocatable  :: qlatnm(:)     ! ids of qlats                  (nqlat)
      real   , allocatable            :: qlat  (:)     ! lateral inflow                (nqlat)
      real   , allocatable            :: qltpar(:,:)   ! lateral inflow parameters     (mxqltpar,nqlat)
      integer, allocatable            :: node(:,:)     ! sobek node administration     (nnode)
      integer, allocatable            :: branchbranch(:,:)   ! sobek branch admin            (mxbranch,nbran)
      integer, allocatable            :: triger(:,:)   ! sobek branch admintrigger data                  (mxbranchmxtriger,nbranntrigr)
      real  integer , allocatable            :: trigercontrl(:,:)   ! triggercontroller data                  (mxtrigermxcontrl,ntrigrncontr)
      real   integer, allocatable            :: contrltrcnrl(:,:)   ! trigger controller data relation   (mxtrcnrl,ntcrel)
      integer, allocatable            :: cnstrl(:,:)   ! controller structure relation  (mxcontrlmxcnstrl,ncontrncsrel)
      integer, allocatable            :: trcnrlhbdpar(:,:)   ! triggerinteger controller relation   (mxtrcnrl,ntcrelparameters (3,*), 1=?, 2=iopt, 3=itab (3,nhstat)
      integer, allocatable            :: cnstrlqbdpar(:,:)   ! controller structure relation (mxcnstrl,ncsrel)
      integer integer parameters (3,*), 1=?, 2=iopt, 3=itab (3,nqstat)
      real   , allocatable            :: hbdparengpar(:,:)     ! integerEngelund-Hansen parameters (3,*), 1=?, 2=iopt, 3=itab (3,nhstat(mxengpar)
      integerreal   , allocatable            :: qbdparhpack(:,:)      ! integer parameters (3,*), 1=?, 2=iopt, 3=itab (3,nqstats0 voor sobek points          (ngrid)
      real   , allocatable            :: engparqpack(:)      ! Engelund-Hansenq parameters voor sobek points (mxengpar)
      real   ,(ngrid)
 allocatable     double precision,   allocatable   :: hpackxycoor(:,:)      ! s0 voor sobek points          (! (2,ngrid) x,y coordinates for sobek points (2,ngrid)
      realinteger,  allocatable , allocatable         :: nlevu  :: qpack(:)      ! q  voor sobek points          (ngrid)
      double precision, allocatable   :: xycoor(:,:)   ! (2,ngrid) x,y coordinates for sobek points (2,ngridnupt)
      integerreal,     allocatable           :: nlevu chan_hu  (:,:)   !                               (nuptngrid)
      real,     allocatable           :: chan_huaf (:,:,:) !   !                            (ngrid(nupt,lcnvmax,msect)
      real,     allocatable           :: chan_afwf (:,:,:)    !                          (nupt,lcnvmax,msect)
      real,     allocatable           :: chan_wfpf (:,:,:)    !                          (nupt,lcnvmax,msect)
      real,     allocatable           :: chan_pfco (:,:,:)    !                          (nupt,lcnvmax,msect)
      real,     allocatable           :: chan_cocn (:,:,:)    !                          (nupt,lcnvmax,msect)
      real,     allocatable           :: chan_cn cz1(:,:,:)    !                          (nupt,lcnvmax,msect)
      real,     allocatable           :: chan_cz1cz2(:,:,:)    !                          (nupt,lcnvmax,msect)
      realinteger, allocatable    allocatable        :: nlevh  :: chan_cz2(:,:,:)        !                          (nupt,lcnvmax,msect)
      integerreal,    allocatable            :: nlevhchan_hh   (:,:)        !                          (nuptngrid,lcnvmax,msect)
      real,    allocatable            :: chan_hhat (:,:)      !                          (ngrid,lcnvmax)
      real,    allocatable            :: chan_atwt (:,:)      !                          (ngrid,lcnvmax)
      real,    allocatablecharacter(len=CharLen ), allocatable, save :: nodenm                 !           (nnode)
   :: chan_wt (:,:)      !   character(len=CharLen ), allocatable, save :: gridnnm                !            (ngrid,lcnvmax))

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

Code Block
  integer, allocatable   character(len=CharLen ), allocatable, save :: nodenm                 !         :: trcnrl(:,:)   ! trigger controller relation   (mxtrcnrl,ntcrel)
  integer, allocatable            :: cnstrl(nnode:,:)
   ! controller structure relation character(len=CharLen ), allocatable, save :: gridnnm                !           (ngrid)
   end type Sobek_Data
end module
(mxcnstrl,ncsrel)

Q2: Engelund-Hansen parameters - isn't it morphology? is it required for flow

Q3: Give definition of a structure, controller, trigger and give full list of their parameter names.

Q4: Cross-section type currently of two types - describe them

  • free form
  • wetted-perimeter formula