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

...

For the generation of the boundary conditions we'll need one additional bit of information from the flow model, namely the names of all open boundaries as well as their location and (negative) boundary segment numbers associated them.

Example Below you will find a first example of a netCDF file with all information that delwaq graphical user interface needs for a simple case with volumes defined on the faces of the grid (e.g. Delft3D, D-FLOW Flexible Mesh, ROMS, Untrim):ROMS, Untrim).
New items in this listing are the aggregation tables for volumes and exchanges, the from-to pointer table, and the boundary names and indices. These items are to be identified by means of the new attribute delwaq_role. This attribute has been introduced in agreement with the cf_role attribute for quantities that probably can't be standardized beyond the scope of delwaq.

delwaq_role

description

segment_aggregation_table

For every flow volume the segment number of the corresponding delwaq schematisation. Note that this array may have length nNodes (for node centred flow codes like CG finite element codes like Telemac) or nFaces (for face centred flow codes like D-Flow Flexible Mesh and Untrim). This table indicates which grid cells are included in the delwaq computation and which grid cells have been merged. It does not indicate numbers of open boundary segments.

exchange_aggregation_table

For every flow volume interface the exchange number of the corresponding delwaq schematisation; generally it will have length nEdges. This table indicates where the various exchanges are located on the grid for both internal and open boundary exchanges. Although it may be used to derive the associated from and to segment numbers, it does not indicate the (from/to) order or does it indicate the numbers of the open boundary segments. This table may be derived using the topological information of the flow grid, the segment_aggregation_table and the from_to_segment_table.

from_to_segment_table

This table is size nExchanges x 2: for every delwaq exchange it indicates the from (1st value) and to (2nd value) segment numbers. This table may be expanded to include "from-1" and "to+1" segment indices as well. Note that this table implicitly defines positive flow direction for all exchanges as well as the open boundary segment numbers.

boundary_name

For every open boundary its name. Note that a boundary is defined as one or more exchanges.

boundary_exchange_index

For every open boundary the numbers (and order) of the exchanges that are associated with that boundary.

Sketch of the flow (left) and delwaq (right) topologies used in the example below:

Image Added

Code Block
dimensions:
        nNodes = 12 ;
        nEdges = 21 ;
        nFaces = 10 ;
        maxNumNodesPerFace = 5 ;
        nSegments = 5 ;
        nExchanges = 12 ;
        nBoundaries = 4 ; = 4 ;
        maxLenBndName = 5 ;
        maxNumExchangesPerBnd = 2 ;
 
        Two = 2 ;
 
variables:
// Mesh topology
        maxLenBndNameinteger =Mesh 5 ;
        maxNumExchangesPerBnd = 2 ;
        timeVolMesh:cf_role = 100"mesh_topology" ; //nTimeSteps for volumes
        timeFlx = 99  ; //nTimeSteps for exchanges
 
        Two = 2 ;
 
variables:
// Mesh topology
 Mesh:long_name = "Topology data of 2D unstructured mesh" ;
               integer Mesh:dimension = 2 ;
                Mesh:cfnode_rolecoordinates = "mesh_topologyMesh_node_x Mesh_node_y" ;
                Mesh:longface_node_nameconnectivity = "Topology data of 2D unstructured mesh" ;
Mesh_face_nodes" ;
                Mesh:edge_node_connectivity = "Mesh_edge_nodes" ; // attribute required if variables will Mesh:dimensionbe =defined 2on ;edges
                Mesh:nodeedge_coordinates = "Mesh_nodeedge_x Mesh_nodeedge_y" ; // optional attribute (requires edge_node_connectivity)
                Mesh:face_node_connectivitycoordinates = "Mesh_face_x Mesh_face_nodesy" ; // optional attribute
                Mesh:face_edge_node_connectivity = "Mesh_edgeface_nodesedges" ; // attribute required if variables will be defined on edgesoptional attribute (requires edge_node_connectivity)
                Mesh:edgeface_face_coordinatesconnectivity = "Mesh_edge_x Mesh_edge_yface_links" ; // optional attribute (requires edge_node_connectivity)
        integer Mesh_face_nodes(nFaces, maxNumNodesPerFace) ;
                Mesh_face_nodes:facecf_coordinatesrole = "Mesh_face_x Mesh_face_y" ; // optional attributenode_connectivity" ;
                Mesh:_face_edgenodes:long_connectivityname = "Mesh_face_edges" ; // optional attribute (requires edge_node_connectivity)Maps every face to its corner nodes." ;
                Mesh:_face_facenodes:_connectivityFillValue = " 999999 ;
                Mesh_face_links" ; // optional attributenodes:start_index = 1 ;
        integer Mesh_faceedge_nodes(nFacesnEdges, maxNumNodesPerFaceTwo) ;
                Mesh_faceedge_nodes:cf_role = "faceedge_node_connectivity" ;
                Mesh_faceedge_nodes:long_name = "Maps every faceedge to itsthe cornertwo nodes that it connects." ;
                Mesh_faceedge_nodes:start_FillValueindex = 9999991 ;
                Mesh_face_nodes:start_index = 1 ;
// Mesh node coordinates
        integerdouble Mesh_edgenode_nodes(nEdges, Twox(nNodes) ;
                Mesh_edgenode_nodesx:cfstandard_rolename = "edge_node_connectivitylongitude" ;
                Mesh_edgenode_nodesx:long_name = "MapsLongitude everyof edge2D tomesh the two nodes that it connects." ;
                Mesh_edgenode_nodesx:start_indexunits = 1"degrees_east" ;
 
// Mesh node coordinates
        double Mesh_node_xy(nNodes) ;
                Mesh_node_xy:standard_name = "longitudelatitude" ;
                Mesh_node_xy:long_name = "LongitudeLatitude of 2D mesh nodes." ;
                Mesh_node_xy:units = "degrees_eastnorth" ;
 
// Optional mesh face and edge coordinate variables
        double Mesh_nodeface_yx(nNodesnFaces) ;
                Mesh_nodeface_yx:standard_name = "latitudelongitude" ;
                Mesh_nodeface_yx:long_name = "LatitudeCharacteristics longitude of 2D mesh nodes. face." ;
                Mesh_face_x:units = "degrees_east" ;
                Mesh_nodeface_yx:unitsbounds = "degreesMesh_face_northxbnds" ;
 
// Optional mesh face and edge coordinate variables
        double Mesh_face_xy(nFaces) ;
                Mesh_face_xy:standard_name = "longitudelatitude" ;
                Mesh_face_xy:long_name = "Characteristics longitudelatitude of 2D mesh face." ;
                Mesh_face_xy:units = "degrees_eastnorth" ;
                Mesh_face_xy:bounds = "Mesh_face_xbndsybnds" ;
        double Mesh_face_yxbnds(nFaces,maxNumNodesPerFace) ;
                Mesh_face_yxbnds:standard_name = "latitudelongitude" ;
                Mesh_face_yxbnds:long_name = "CharacteristicsLongitude latitudebounds of 2D mesh facemesh face (i.e. corner coordinates)." ;
                Mesh_face_yxbnds:units = "degrees_northeast" ;
                Mesh_face_yxbnds:bounds_FillValue = "Mesh_face_ybnds" 9.9692099683868690E36;
        double Mesh_face_xbndsybnds(nFaces,maxNumNodesPerFace) ;
                Mesh_face_xbndsybnds:standard_name = "longitudelatitude" ;
                Mesh_face_xbndsybnds:long_name = "LongitudeLatitude bounds of 2D mesh face (i.e. corner coordinates)." ;
                Mesh_face_xbndsybnds:units = "degrees_eastnorth" ;
                Mesh_face_xbndsybnds:_FillValue = 9.9692099683868690E36;
        double Mesh_edge_x(nEdges) ;
                Mesh_face_ybnds(nFaces,maxNumNodesPerFace)edge_x:standard_name = "longitude" ;
                Mesh_faceedge_ybndsx:standardlong_name = "latitudeCharacteristic longitude of 2D mesh edge (e.g. midpoint of the edge)." ;
                Mesh_faceedge_ybndsx:long_nameunits = "Latitude bounds of 2D mesh face (i.e. corner coordinates)."degrees_east" ;
        double Mesh_edge_y(nEdges) ;
                Mesh_faceedge_ybndsy:unitsstandard_name = "degrees_northlatitude" ;
                Mesh_faceedge_ybndsy:long_FillValuename = 9.9692099683868690E36;
"Characteristic latitude of 2D mesh edge (e.g. midpoint of the edge)." ;
             double   Mesh_edge_x(nEdges)y:units = "degrees_north" ;
        // bounds variables for edges skipped

//   Mesh_edge_x:standard_name = "longitude" ;Aggregation tables
        integer Dlwq_volaggr(nFaces) ;
      Mesh_edge_x:long_name = "Characteristic longitude of 2D mesh edge (e.g. midpoint of the edge). Dlwq_volaggr:delwaq_role = "segment_aggregation_table" ;
                MeshDlwq_edge_x:unitsvolaggr:long_name = "degrees_east" ;
        double Mesh_edge_y(nEdges)delwaq segment number for each face (flow volume)" ;
                MeshDlwq_edge_y:standard_namevolaggr:mesh = "latitudeMesh" ;
                Mesh_edge_y:long_name = "Characteristic latitude of 2D mesh edge (e.g. midpoint of the edge).            Dlwq_volaggr:location = "face" ;
                MeshDlwq_edge_yvolaggr:unitscoordinates = "degrees_northMesh_face_x Mesh_face_y" ;
        //    bounds variables for edges skipped

// Aggregation tables Dlwq_volaggr:_FillValue = 0;
        integer Dlwq_volaggrflxaggr(nFacesnEdges) ;
                Dlwq_volaggrflxaggr:delwaq_role = "segmentexchange_aggregation_table" ;
                Dlwq_volaggrflxaggr:long_name = "delwaq segmentexchange number for each faceedge (flow volume) boundary)" ;
                Dlwq_flxaggr:mesh = "Mesh" ;
                Dlwq_flxaggr:location = "edge" ;
                Dlwq_volaggrflxaggr:meshcoordinates = "Mesh_edge_x Mesh_edge_y" ;
                Dlwq_volaggrflxaggr:location_FillValue = "face"0;
        integer Dlwq_fromto(nExchanges,Two) ;
                Dlwq_volaggrfromto:coordinatesdelwaq_role = "Meshfrom_faceto_x Mesh_face_ysegment_table" ;
                Dlwq_volaggrfromto:long_FillValuename = 0 "delwaq from/to table" ;
        integer Dlwq_flxaggr(nEdges) ;
        
// Boundary information
        char Dlwq_flxaggr:delwaq_role = "exchange_aggregation_table" Bnd_name(nBoundaries, maxLenBndName) ;
                DlwqBnd_flxaggrname:longdelwaq_namerole = "delwaq exchange number for each edge (flow boundary)boundary_name" ;
                DlwqBnd_flxaggrname:meshlong_name = "Mesh "boundary ;
name for the delwaq user interface" ;
        char  Dlwq_flxaggr:location = "edge" Bnd_exch(nBoundaries, maxNumExchangesPerBnd) ;
                DlwqBnd_flxaggrexch:coordinatesdelwaq_role = "Meshboundary_edge_x Mesh_edge_yexchange_index" ;
                DlwqBnd_flxaggrexch:long_FillValuename = 0;
 = "indices of exchanges associated with  integer Dlwq_fromto(nExchanges,Two)the boundary" ;
                DlwqBnd_fromtoexch:delwaq_roleFillValue  = "from_to_segment_table" 0;
        
data:

    Mesh = 0  Dlwq_fromto:long_name = "delwaq from/to table" ;
 ; // dummy
    
    Mesh_face_nodes =
         1,  2,  5, 999999, 999999,
//   Boundary information
     1,  5, char Bnd_name(nBoundaries8, maxLenBndName) ;999999, 999999,
         5,  9,  8, 999999,  Bnd_name:delwaq_role = "boundary_name" ;
999999,
         5,  6,  9, 999999, 999999,
     Bnd_name:long_name = "boundary name for2, the12, delwaq user interface" ;5, 999999, 999999,
        char Bnd_exch(nBoundaries3, maxNumExchangesPerBnd) ;
4,  7,  6, 12,
         6,  Bnd_exch:delwaq_role = "boundary_exchange_index" ;10,  9, 999999, 999999,
         6,  7, 11,    Bnd_exch:long_name 10, 999999,
  = "indices of exchanges associated with the boundary" ;
5, 12,  6, 999999, 999999,
         2,   Bnd_exch:_FillValue  = 0;
3, 12, 999999, 999999 ;

    Mesh_edge_nodes =
   

// Volume and flux data on original1, flow grid2,
        double Flow_volumes(timeVol, nFaces) ;
 2,  3,
         3,  4,
        Flow_volumes:long_name = "volumes" ; 1,  5,
         2,  5,
     Flow_volumes:units = "m3" ;    5,  6,
         6, 12,
      Flow_volumes:mesh = "Mesh" ;   6,  8,
         4,  7,
     Flow_volumes:location = "face" ;
    1,  8,
         5,  8,
       Flow_volumes:coordinates = "Mesh_face_x Mesh_face_y" ; 5,  9,
        double Flow_fluxes(timeFlx6, nEdges) ;9,
         6, 10,
      Flow_fluxes:long_name = "flux across edge" ;
7, 11,
         8,  9,
      Flow_fluxes:units = "m3 s-1" ; 9, 10,
        10, 11,
       Flow_fluxes:mesh = "Mesh"  2, 12,
         5, 12,
      Flow_fluxes:location = "edge"   3, 12 ;
 
    Mesh_node_x =     ... ;  // data skipped
 Flow_fluxes:coordinates = "Mesh_edge_x Mesh_edgenode_y" = ... ;

data:
  // data skipped
    Mesh_face_x = 0... ;  // dummy
    data skipped
    Mesh_face_nodesy =
 ... ;  // data    1,  2,  5, 999999, 999999,
         1,  5,  8, 999999, 999999,
         5,  9,  8, 999999, 999999,
         5,  6,  9, 999999, 999999,skipped
    Mesh_face_xbnds = ... ;  // data skipped
    Mesh_face_ybnds = ... ;  // data skipped
    Mesh_edge_x = ... ;  // data skipped
    Mesh_edge_y = ... ;  // data skipped

    Dlwq_volaggr =
        1, 2, 122,  53, 9999991, 9999995,
         3,  4,  71,  6, 12,1 ;

         6, 10,  9, 999999, 999999,Dlwq_flxaggr =
        1, 60, 2, 73, 110, 100, 9999994,
 5, 6, 7, 0, 8, 0, 10,  511, 0, 9, 12, 0, 60, 999999, 999999,4 ;

    Dlwq_fromto =
    2,   3-1, 12 1,
 999999, 999999 ;

    Mesh_edge_nodes =
 -4,  5,
        1,  2,
         21,  35,
         34,  45,
         15,  5-6,
         -2,  52,
         52,  63,
       -3,  69, 12,
         63,  84,
         4,  -7,
       -5,  4 ;

   1, Bnd_name 8,=
       "west ",
     5,  8"north",
       "east  5",
  9,
     "south" ;

   6, Bnd_exch 9,=
       1,  67, 10,
       2,  70, 11,
         86,  911,
       9,  9, 10,12 ;

This data file may or may not contain the volume and flux data needed for the delwaq computational core

Code Block

dimensions:
        10, 11,
     timeVol = 100 ; //nTimeSteps for volumes
    2, 12,
   timeFlx = 99  ; //nTimeSteps 5,for 12,
         3, 12 ;
 
    Mesh_node_x = ... ;  // data skippedexchanges
 
variables:

// Volume and flux data on original flow grid
    Mesh_node_y = ... ;  // data skippeddouble Flow_volumes(timeVol, nFaces) ;
    Mesh_face_x  = ... ;  // data skipped
    MeshFlow_facevolumes:long_yname = ..."volumes" ;  // data skipped
    Mesh_face_xbnds  = ... ;  // data skipped
    Mesh_face_ybndsFlow_volumes:units = ..."m3" ;
  //  data skipped
    Mesh_edge_x = ... ;  // data skipped
    Mesh_edge_y = ... ;  // data skipped

 Flow_volumes:mesh = "Mesh" ;
            Dlwq_volaggr =
   Flow_volumes:location = "face" ;
  1, 2, 2, 3, 1, 5, 3, 4, 1, 1 ;

    DlwqFlow_flxaggrvolumes:coordinates =
 "Mesh_face_x    Mesh_face_y" ;
   1, 0, 2, 3, 0, 0, 4, 5, 6, 7, 0, 8, 0, 10, 11, 0, 9, 12, 0, 0, 4 ;

    Dlwq_fromto =double Flow_fluxes(timeFlx, nEdges) ;
                Flow_fluxes:long_name = "flux across edge" ;
       -1,   1,
       -4,  5,Flow_fluxes:units = "m3 s-1" ;
        1,  2,
      Flow_fluxes:mesh  1,  5,= "Mesh"
        4,  5,
      Flow_fluxes:location = 5, -6,"edge" ;
       -2,  2,
        2,  3,
       -3,  9,
Flow_fluxes:coordinates = "Mesh_edge_x Mesh_edge_y" ;

// or aggrgated data on delwaq topology
        double 3Dlwq_volumes(timeVol, nSegments) 4,;
         4, -7,
       -5,  4Dlwq_volumes:long_name = "volumes of segments" ;

    Bnd_name =
       "west ",
     Dlwq_volumes:units = "north",
    m3" ;
   "east ",
    double Dlwq_fluxes(timeFlx, nExchanges) "south" ;

    Bnd_exch =
       1,  7,
  Dlwq_fluxes:long_name = "exchanges between segments" ;
 2,  0,
       6, 11,
     Dlwq_fluxes:units = 9, 12"m3 s-1" ;

data:

    Flow_volumes = ... ; // data skipped
    Flow_fluxes = ... ; // data skipped