Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Table of Content Zone
locationtop
typelist

Topology.

1D network topology.

The topology information is stored as attributes to a dummy variable (in the example below called "Mesh1"); the first attributes are dimensionality and locations. The value of the dimensionality attribute should be integer 1 for a 1D network. The value of the locations attribute is a string with a blank separated, extendable list of location names. Initially these locations have a purely topological meaning, but they may be used to define additional numerical stagger positions too. The names are not formally standardized, but the names "node" and "edge" are recommended for the 1D network geometry. For each location name X, there will be a further attribute composed of the concatenation of the name X and '_coordinates'. For example, the location name "edge" points to an attribute edge_coordinates. These coordinates attributes follow the CF-conventions, i.e. they point to the variables that contain the latitude and longitude (or other coordinate) variables that contain the coordinate data for that particular location. From these attributes it's still not clear what the exact network topology is. Therefore, we need one more attribute that specifies the connectivity of the locations. The attribute edge_node_connectivity is composed of the location names "edge" and "node" and the word 'connectivity'. It tells us:

1. that the location "edge" corresponds to the edges/links of the 1D network.
2. that the location "node" corresponds to the nodes/points of the 1D network.
3. that "Mesh1_edge_nodes" (the value of edge_node_connectivity) is the variable that defines each edge by means of its two end points.

Consistent with the CF-conventions compression option, the connectivity indices are 0-based, i.e. if the Mesh1_edge_nodes array contains values 0 and 1 then this means that that edge connects the first two points.

Example:

Code Block
dimensions:  
        nMesh1_node = 35 ;
        nMesh1_edge = 24 ;

        Two = 2;

variables:  
// Mesh coordinates
        double Mesh1_node_x(nMesh1_node) ;  
                Mesh1_node_x:standard_name = "longitude" ;  
                Mesh1_node_x:long_name = "Longitude of 1D network nodes." ;  
                Mesh1_node_x:units = "degrees_east" ;  
        double Mesh1_node_y(nMesh1_node) ;  
                Mesh1_node_y:standard_name = "latitude" ;  
                Mesh1_node_y:long_name = "Latitude of 1D network nodes." ;
                Mesh1_node_y:units = "degrees_north" ;  
        double Mesh1_edge_x(nMesh1_edge) ;  
                Mesh1_edge_x:standard_name = "longitude" ;  
                Mesh1_edge_x:long_name = "Characteristic longitude of 1D network edge (e.g. center coordinate of the link)." ;  
                Mesh1_edge_x:units = "degrees_east" ;  
        double Mesh1_edge_y(nMesh1_edge) ;  
                Mesh1_edge_y:standard_name = "latitude" ;  
                Mesh1_edge_y:long_name = "Characteristic latitude of 1D network edge (e.g. center coordinate of the link)." ;  
                Mesh1_edge_y:units = "degrees_north" ;  

// Mesh topology
        integer Mesh1_edge_nodes(nMesh1_edge, Two) ;  
                Mesh1_edge_nodes:standard_name = "" ;  // YET TO BE DETERMINED
                Mesh1_edge_nodes:long_name = "Maps every edge/link to the two nodes that it connects." ;  
        integer Mesh1 ; 
                Mesh1:standard_name = "" ;  // YET TO BE DETERMINED
                Mesh1:long_name = "Topology data of 1D network" ;
                Mesh1:dimensionality = 1 ;
                Mesh1:locations = "edge node" ;
                Mesh1:node_coordinates = "Mesh1_node_x Mesh1_node_y" ;
                Mesh1:edge_coordinates = "Mesh1_edge_x Mesh1_edge_y" ;
                Mesh1:edge_node_connectivity = "Mesh1_edge_nodes" ;

2D triangular mesh topology.

The topology information is stored as attributes to a dummy variable (in the example below called "Mesh2"); the first attributes are dimensionality and locations. The value of the dimensionality attribute should be integer 2 for a 2D (triangular) mesh. The value of the locations attribute is a string with a blank separated, extendable list of location names. Initially these locations have a purely topological meaning, but they may be used to define additional numerical stagger positions too. The names are not formally standardized, but the names "node", "edge" and "face" are recommended for the 2D mesh geometry. For each location name X, there will be a further attribute composed of the concatenation of the name X and '_coordinates'. For example, the location name "face" points to an attribute face_coordinates. These coordinates attributes follow the CF-conventions, i.e. they point to the variables that contain the latitude and longitude (or other coordinate) variables that contain the coordinate data for that particular location. From these attributes it's still not clear what the exact mesh topology is. Therefore, we need two more attributes that specify the connectivity of the locations. The attributes face_node_connectivity and edge_node_connectivity are composed of two location names and the word 'connectivity'. They tell us:

1. that the location "node" corresponds to the nodes/points of the 2D triangular mesh.
2. that the location "edge" corresponds to the edges of the 2D triangular mesh (the second dimension of the variable it points to is 2).
3. that the location "face" corresponds to the triangles of the 2D triangular mesh (the second dimension of the variable it points to is larger than 2).
4. that this is a triangular mesh since the second dimension of the variable that face_node_connectivity points to is 3.
5. that "Mesh2_edge_nodes" (the value of edge_node_connectivity) is the variable that defines each edge by means of its end points.
6. that "Mesh2_face_nodes" (the value of face_node_connectivity) is the variable that defines each triangular face by means of its three corners.

Consistent with the CF-conventions compression option, the connectivity indices are 0-based, i.e. if the "Mesh2_edge_nodes" array contains values 0 and 1 then this means that that edge connects the first two points. The example includes an optional face_connectivity attribute that specifies which triangular faces are neighbors.

Example:

Code Block
dimensions:  
        nMesh2_node = 4 ;
        nMesh2_edge = 5 ;
        nMesh2_face = 2 ;
        nMesh2_face_links = 1 ;

        Two = 2 ;
        TriThree = 3 ;

variables:  
// Mesh coordinates
        double Mesh2_node_x(nMesh2_node) ;  
                Mesh2_node_x:standard_name = "longitude" ;  
                Mesh2_node_x:long_name = "Longitude of 2D mesh nodes." ;  
                Mesh2_node_x:units = "degrees_east" ;  
        double Mesh2_node_y(nMesh2_node) ;  
                Mesh2_node_y:standard_name = "latitude" ;  
                Mesh2_node_y:long_name = "Latitude of 2D mesh nodes." ;
                Mesh2_node_y:units = "degrees_north" ;  
        double Mesh2_face_x(nMesh2_face) ;  
                Mesh2_face_x:standard_name = "longitude" ;  
                Mesh2_face_x:long_name = "Characteristics longitude of 2D mesh triangle (e.g. circumcenter coordinate)." ;  
                Mesh2_face_x:units = "degrees_east" ;  
        double Mesh2_face_y(nMesh2_face) ;  
                Mesh2_face_y:standard_name = "latitude" ;  
                Mesh2_face_y:long_name = "Characteristics latitude of 2D mesh triangle (e.g. circumcenter coordinate)." ;  
                Mesh2_face_y:units = "degrees_north" ;  
        double Mesh2_edge_x(nMesh2_edge) ;  
                Mesh2_edge_x:standard_name = "longitude" ;  
                Mesh2_edge_x:long_name = "Characteristic longitude of 2D mesh edge (e.g. center coordinate of the edge)." ;  
                Mesh2_edge_x:units = "degrees_east" ;  
        double Mesh2_edge_y(nMesh2_edge) ;  
                Mesh2_edge_y:standard_name = "latitude" ;  
                Mesh2_edge_y:long_name = "Characteristic latitude of 2D mesh edge (e.g. center coordinate of the edge)." ;  
                Mesh2_edge_y:units = "degrees_north" ;  

// Mesh topology
        integer Mesh2_edge_nodes(nMesh2_edge, Two) ;  
                Mesh2_edge_nodes:standard_name = "" ;  // YET TO BE DETERMINED
                Mesh2_edge_nodes:long_name = "Maps every edge to the two nodes that it connects." ;  
        integer Mesh2_face_nodes(nMesh2_face, TriThree) ;  
                Mesh2_face_nodes:standard_name = "" ;  // YET TO BE DETERMINED
                Mesh2_face_nodes:long_name = "Maps every triangular face to its three corner nodes." ;  
        integer Mesh2_face_links(nMesh2_face_links, Two) ;  
                Mesh2_face_links:standard_name = "" ;  // YET TO BE DETERMINED
                Mesh2_face_links:long_name = "Indicates which triangular faces are neighbors." ;  
        integer Mesh2 ; 
                Mesh2:standard_name = "" ;  // YET TO BE DETERMINED
                Mesh2:long_name = "Topology data of 2D unstructured mesh" ;
                Mesh2:dimensionality = 2 ;
                Mesh2:locations = "face edge node" ;
                Mesh2:node_coordinates = "Mesh2_node_x Mesh2_node_y" ;
                Mesh2:edge_coordinates = "Mesh2_edge_x Mesh2_edge_y" ;
                Mesh2:edge_node_connectivity = "Mesh2_edge_nodes" ;
                Mesh2:face_coordinates = "Mesh2_face_x Mesh2_face_y" ;
                Mesh2:face_node_connectivity = "Mesh2_face_nodes" ;
                Mesh2:face_connectivity = "Mesh2_face_links" ;

2D flexible mesh (mixed triangles, quadrilaterals, etc.) topology.

The topology information is stored as attributes to a dummy variable (in the example below called "Mesh2"); the first attributes are dimensionality and locations. The value of the dimensionality attribute should be integer 2 for a 2D mesh. The value of the locations attribute is a string with a blank separated, extendable list of location names. Initially these locations have a purely topological meaning, but they may be used to define additional numerical stagger positions too. The names are not formally standardized, but the names "node", "edge" and "face" are recommended for the 2D mesh geometry. For each location name X, there will be a further attribute composed of the concatenation of the name X and '_coordinates'. For example, the location name "face" points to an attribute face_coordinates. These coordinates attributes follow the CF-conventions, i.e. they point to the variables that contain the latitude and longitude (or other coordinate) variables that contain the coordinate data for that particular location. From these attributes it's still not clear what the exact mesh topology is. Therefore, we need two more attributes that specify the connectivity of the locations. The attributes face_node_connectivity and edge_node_connectivity are composed of two location names and the word 'connectivity'. They tell us:

1. that the location "node" corresponds to the nodes/points of the 2D mesh.
2. that the location "edge" corresponds to the edges of the 2D mesh (the second dimension of the variable it points to is 2).
3. that the location "face" corresponds to the faces of the 2D mesh (the second dimension of the variable it points to is larger than 2).
4. that this is a mesh composed of quandrilaterals (and possibly some triangles) since the second dimension of the variable that face_node_connectivity points to is 4.
5. that "Mesh2_edge_nodes" (the value of edge_node_connectivity) is the variable that defines each edge by means of its end points.
6. that "Mesh2_face_nodes" (the value of face_node_connectivity) is the variable that defines each face by means of its corner nodes.

Consistent with the CF-conventions compression option, the connectivity indices are 0-based, i.e. if the "Mesh2_edge_nodes" array contains values 0 and 1 then this means that that edge connects the first two points. If the mesh contains triangles then the last node numbers of those faces in the "Mesh2_face_nodes" array will be equal to _FillValue (which should be larger than the number of nodes in the mesh). The example includes an optional face_connectivity attribute that specifies which faces are neighbors.

Example:

Code Block
dimensions:  
        nMesh2_node = 6 ;
        nMesh2_edge = 7 ;
        nMesh2_face = 2 ;
        nMesh2_face_links = 1 ;
        nMaxMesh2_face_nodes = 4 ;

        Two = 2 ;

variables:  
// Mesh coordinates
        double Mesh2_node_x(nMesh2_node) ;  
                Mesh2_node_x:standard_name = "longitude" ;  
                Mesh2_node_x:long_name = "Longitude of 2D mesh nodes." ;  
                Mesh2_node_x:units = "degrees_east" ;  
        double Mesh2_node_y(nMesh2_node) ;  
                Mesh2_node_y:standard_name = "latitude" ;  
                Mesh2_node_y:long_name = "Latitude of 2D mesh nodes." ;
                Mesh2_node_y:units = "degrees_north" ;  
        double Mesh2_face_x(nMesh2_face) ;  
                Mesh2_face_x:standard_name = "longitude" ;  
                Mesh2_face_x:long_name = "Characteristics longitude of 2D mesh face (e.g. circumcenter coordinate)." ;  
                Mesh2_face_x:units = "degrees_east" ;  
        double Mesh2_face_y(nMesh2_face) ;  
                Mesh2_face_y:standard_name = "latitude" ;  
                Mesh2_face_y:long_name = "Characteristics latitude of 2D mesh face (e.g. circumcenter coordinate)." ;  
                Mesh2_face_y:units = "degrees_north" ;  
        double Mesh2_edge_x(nMesh2_edge) ;  
                Mesh2_edge_x:standard_name = "longitude" ;  
                Mesh2_edge_x:long_name = "Characteristic longitude of 2D mesh edge (e.g. center coordinate of the edge)." ;  
                Mesh2_edge_x:units = "degrees_east" ;  
        double Mesh2_edge_y(nMesh2_edge) ;  
                Mesh2_edge_y:standard_name = "latitude" ;  
                Mesh2_edge_y:long_name = "Characteristic latitude of 2D mesh edge (e.g. center coordinate of the edge)." ;  
                Mesh2_edge_y:units = "degrees_north" ;  

// Mesh topology
        integer Mesh2_edge_nodes(nMesh2_edge, Two) ;  
                Mesh2_edge_nodes:standard_name = "" ;  // YET TO BE DETERMINED
                Mesh2_edge_nodes:long_name = "Maps every edge to the two nodes that it connects." ;  
        integer Mesh2_face_nodes(nMesh2_face, nMaxMesh2_face_nodes) ;  
                Mesh2_face_nodes:standard_name = "" ;  // YET TO BE DETERMINED
                Mesh2_face_nodes:long_name = "Maps every face to its corner nodes." ;  
                Mesh2_face_nodes:_FillValue = 999999 ;
        integer Mesh2_face_links(nMesh2_face_links, Two) ;  
                Mesh2_face_links:standard_name = "" ;  // YET TO BE DETERMINED
                Mesh2_face_links:long_name = "Indicates which faces are neighbors." ;  
        integer Mesh2 ; 
                Mesh2:standard_name = "" ;  // YET TO BE DETERMINED
                Mesh2:long_name = "Topology data of 2D unstructured mesh" ;
                Mesh2:dimensionality = 2 ;
                Mesh2:locations = "face edge node" ;
                Mesh2:node_coordinates = "Mesh2_node_x Mesh2_node_y" ;
                Mesh2:edge_coordinates = "Mesh2_edge_x Mesh2_edge_y" ;
                Mesh2:edge_node_connectivity = "Mesh2_edge_nodes" ;
                Mesh2:face_coordinates = "Mesh2_face_x Mesh2_face_y" ;
                Mesh2:face_node_connectivity = "Mesh2_face_nodes" ;
                Mesh2:face_connectivity = "Mesh2_face_links" ;

3D layered mesh topology.

For a 3D layered unstructured mesh topology the approach is taken as for the structured mesh according CF-conventions. For the horizontal plane a 2D unstructured mesh topology is defined, which is extruded in the vertical direction by means of a vertical coordinate. The example below matches the example in the previous section combined with a vertical coordinate according CF-conventions. This example introduces also the attributes grid mesh and location on the 2D variables "Mesh2_surface" and "Mesh2_depth". For more information about these attributes see the data definition section below.

Example:

Code Block
dimensions:  
        nMesh2_node = 6 ;
        nMesh2_edge = 7 ;
        nMesh2_face = 2 ;
        nMesh2_face_links = 1 ;
        nMaxMesh2_face_nodes = 4 ;
        Mesh2_layers = 310 ;

        Two = 2 ;

variables:  
// Mesh coordinates
        double Mesh2_node_x(nMesh2_node) ;  
                Mesh2_node_x:standard_name = "longitude" ;  
                Mesh2_node_x:long_name = "Longitude of 2D mesh nodes." ;  
                Mesh2_node_x:units = "degrees_east" ;  
        double Mesh2_node_y(nMesh2_node) ;  
                Mesh2_node_y:standard_name = "latitude" ;  
                Mesh2_node_y:long_name = "Latitude of 2D mesh nodes." ;
                Mesh2_node_y:units = "degrees_north" ;  
        double Mesh2_face_x(nMesh2_face) ;  
                Mesh2_face_x:standard_name = "longitude" ;  
                Mesh2_face_x:long_name = "Characteristics longitude of 2D mesh face (e.g. circumcenter coordinate)." ;  
                Mesh2_face_x:units = "degrees_east" ;  
        double Mesh2_face_y(nMesh2_face) ;  
                Mesh2_face_y:standard_name = "latitude" ;  
                Mesh2_face_y:long_name = "Characteristics latitude of 2D mesh face (e.g. circumcenter coordinate)." ;  
                Mesh2_face_y:units = "degrees_north" ;  
        double Mesh2_edge_x(nMesh2_edge) ;  
                Mesh2_edge_x:standard_name = "longitude" ;  
                Mesh2_edge_x:long_name = "Characteristic longitude of 2D mesh edge (e.g. center coordinate of the edge)." ;  
                Mesh2_edge_x:units = "degrees_east" ;  
        double Mesh2_edge_y(nMesh2_edge) ;  
                Mesh2_edge_y:standard_name = "latitude" ;  
                Mesh2_edge_y:long_name = "Characteristic latitude of 2D mesh edge (e.g. center coordinate of the edge)." ;  
                Mesh2_edge_y:units = "degrees_north" ;  

// Mesh topology
        integer Mesh2_edge_nodes(nMesh2_edge, Two) ;  
                Mesh2_edge_nodes:standard_name = "" ;  // YET TO BE DETERMINED
                Mesh2_edge_nodes:long_name = "Maps every edge to the two nodes that it connects." ;  
        integer Mesh2_face_nodes(nMesh2_face, nMaxMesh2_face_nodes) ;  
                Mesh2_face_nodes:standard_name = "" ;  // YET TO BE DETERMINED
                Mesh2_face_nodes:long_name = "Maps every face to its corner nodes." ;  
                Mesh2_face_nodes:_FillValue = 999999 ;
        integer Mesh2_face_links(nMesh2_face_links, Two) ;  
                Mesh2_face_links:standard_name = "" ;  // YET TO BE DETERMINED
                Mesh2_face_links:long_name = "Indicates which faces are neighbors." ;  
        integer Mesh2 ; 
                Mesh2:standard_name = "" ;  // YET TO BE DETERMINED
                Mesh2:long_name = "Topology data of 2D unstructured mesh" ;
                Mesh2:dimensionality = 2 ;
                Mesh2:locations = "face edge node" ;
                Mesh2:node_coordinates = "Mesh2_node_x Mesh2_node_y" ;
                Mesh2:edge_coordinates = "Mesh2_edge_x Mesh2_edge_y" ;
                Mesh2:edge_node_connectivity = "Mesh2_edge_nodes" ;
                Mesh2:face_coordinates = "Mesh2_face_x Mesh2_face_y" ;
                Mesh2:face_node_connectivity = "Mesh2_face_nodes" ;
                Mesh2:face_connectivity = "Mesh2_face_links" ;

// Vertical coordinate
        double Mesh2_layers(Mesh2_layers) ;
                Mesh2_layers:standard_name = "ocean_sigma_coordinate" ;
                Mesh2_layers:long_name = "sigma at layer midpoints" ;
                Mesh2_layers:positive = "up" ;
                Mesh2_layers:formula_terms = "sigma: Mesh2_layers eta: Mesh2_surface depth: Mesh2_depth" ;
        double Mesh2_depth(nMesh2_node) ;  
                Mesh2_depth:standard_name = "sea_floor_depth_below_geoid" ;
                Mesh2_depth:units = "m" ;
                Mesh2_depth:positive = "down" ;
                Mesh2_depth:gridmesh = "Mesh2"
                Mesh2_depth:location = "node" ;
                Mesh2_depth:coordinates = "Mesh2_node_x Mesh2_node_y" ;
        double Mesh2_surface(nMesh2_node) ;  
                Mesh2_surface:standard_name = "sea_surface_height_above_geoid" ;
                Mesh2_surface:units = "m" ;
                Mesh2_surface:gridmesh = "Mesh2"
                Mesh2_surface:location = "face" ;
                Mesh2_surface:coordinates = "Mesh2_face_x Mesh2_face_y" ;

Data defined on unstructured meshes.

According to CF-conventions a variable defined on a structured mesh is specified as

Code Block
        double waterlevel(time,nmax,mmax) ;  
                waterlevel:standard_name = "sea_surface_height_above_geoid" ;
                waterlevel:units = "m" ;
                waterlevel:coordinates = "lat lon" ;

The coordinates attribute refers to the variables that contain the latitude and longitude coordinates. For a curvilinear grid these variables will share two spatial dimensions, here nmax and mmax: lat(nmax,mmax) and lon(nmax,mmax). In numerical models the various quantities are often computed at different locations of the mesh: staggered data. The standard CF-conventions don't offer specific support for this functionality and thus for every stagger location separate coordinates are provided: cell center coordinates, corner point coordinates, u-flux point coordinates, and v-flux point coordinates. The underlying topology of the mesh, i.e. how these coordinates (variable definition locations) relate to eachother isn't stored in the file. This shortcoming is to some degree solved by the gridspec proposal by Balaji. We introduce here attributes that link to the topological data defined above.

Data variables.

The use of the coordinates attribute is copied from the CF-conventions. It is used for variables defined on the unstructured meshes to directly map its values to their location: latitude and longitude. To map the variable onto the topology of the underlying mesh, two new attributes have been introduced. First, the attribute 'grid' mesh points to the variable containing the meta-data attributes of the mesh on which the variable has been defined. Second, the attribute 'location' points to the (stagger) location within the mesh at which the variable is defined. Note that in this example the coordinates attribute is redundant since the coordinates could also be obtained by using the "face"_coordinates attribute of the "Mesh2" variable.

Code Block
        double Mesh2_surface(time,nMesh2_node) ;  
                Mesh2_surface:standard_name = "sea_surface_height_above_geoid" ;
                Mesh2_surface:units = "m" ;
                Mesh2_surface:gridmesh = "Mesh2"
                Mesh2_surface:location = "face" ;
                Mesh2_surface:coordinates = "Mesh2_face_x Mesh2_face_y" ;

Location maps.

Some variables may only be defined at specific locations within the mesh, e.g. only at boundary points or at special locations like weirs and gates. To save space and to improve readability, the concept of a location_map is introduced. It is very similar to compression option in the the CF-conventions. The location_map is an integer variable that contains the indices of the locations at which data is stored. The example below defines a location_map "nMesh1_cell" as a subset of the nodes of Mesh1. The attribute location_map of the variable "Mesh_waterlevel" points to this location_map and the coordinates attribute points to the corresponding (subset) of latitude and longitude coordinates. Note that the coordinates attribute is again redundant since the coordinates could also be obtained by using the location_map "nMesh1_cell" and the "node"_coordinates attribute of the "Mesh1" variable. Consistent with the compress option, the location_map indices are 0-based, i.e. if Mesh1_flownode(0) equals 1 then this points to the second "node" in "Mesh1".

Volume and flux variables.

The same mesh geometry can be used in different ways to schematize the hydrodynamic volumes and fluxes. Let's take a simple triangular mesh. From a finite volume point of view this mesh will generally be interpreted as consisting of two volumes with triangular base. However, others may use a contious Galerkin finite element method that can be shown to be equivalent to a subdivision into four volumes. In the former case the two faces corrspond to volumes and the fluxes cross the edges. In the latter case the volumes are defined surrounding the four nodes and the fluxes are directed along the edges. The two abbreviated ncdumps below show how the basic 2D triangular mesh definition can be extended to include this data. The coordinate variables for the volume data now include bounds attributes to define the surface area of the volumes. Note the subtle difference in the long names between the flux variables in the two cases; the standard_name attribute have to make a more formal distinction between the two cases.

Volume at faces:

Code Block

dimensions:  
        nMesh2_node = 4
Code Block

        integer Mesh1_cell(nMesh1_cell) ;
        nMesh2_edge = 5 ;
       Mesh1_cell:standard_name nMesh2_face = ""2 ;
  // YET TO BE DETERMINED (proposal: location_map) nMesh2_face_links = 1 ;
        nMaxMesh2_contour_pts = 3 ;

     Mesh1_cell:long_name = "Defines Mesh1_cell as subset of the nodes of Mesh1." ;  
          Two = 2 ;
        Three = 3 ;

variables:  
// Mesh coordinates
        double Mesh2_node_x(nMesh2_node) ;  
                // as in 2D triangular mesh example
         Mesh1_cell:grid = "Mesh1" ;double Mesh2_node_y(nMesh2_node) ;  
                Mesh1_cell:location = "node" ;// as in 2D triangular mesh example
        double Mesh1Mesh2_cellface_x(nMesh1nMesh2_cellface) ;  
                Mesh1Mesh2_cellface_x:standard_name = "longitude" ;  
                Mesh1Mesh2_cellface_x:long_name = "CharacteristicCharacteristics longitude of cell2D mesh face (e.g. longitudecircumcenter of nodecoordinate)." ;  
                Mesh1Mesh2_cellface_x:units = "degrees_east" ;  
                Mesh2_face_x:bounds = "Mesh2_face_contour_x" ;  
        double Mesh1Mesh2_cellface_y(nMesh1nMesh2_cellface) ;  
                Mesh1Mesh2_cellface_y:standard_name = "latitude" ;  
                Mesh1Mesh2_cellface_y:long_name = "CharacteristicCharacteristics latitude of cell2D mesh face (e.g. latitudecircumcenter of nodecoordinate)." ;  
                Mesh1Mesh2_cellface_y:units = "degrees_north" ;  

         double Mesh1_waterlevel(time, nMesh1_cell) ;  
  Mesh2_face_y:bounds = "Mesh2_face_contour_y" ;  
        double Mesh1Mesh2_waterlevel:standard_name = "sea_surface_height_above_geoid" ;face_contour_x(nMesh2_face, nMaxMesh2_contour_pts) ;  
                Mesh1_waterlevel:unitsMesh2_face_contour_x:standard_name = "mlongitude" ;  
                Mesh1_waterlevel:location_mapMesh2_face_contour_x:long_name = "Mesh1_cellList of x-points that form outline of flow volume" ;  
                Mesh1_waterlevel:coordinatesMesh2_face_contour_x:units = "Mesh1_cell_x Mesh1_cell_y" ;

The location_map doesn't have to be monotonic. So, it can be used for both creating subsets of the original locations, and for renumbering the locations. If the location_map attribute is used, then the grid and location attributes shouldn't be used.

(warning) Should Mesh1_cell follow the CF/COARDS coordinate dimension conventions, i.e. integer Mesh1_cell(Mesh1_cell)? How would this work out for a location_map that is only used for renumbering.

The case of an integrated 1D-2D-3D mesh.

Combined mesh topology.

Example of a combination of connected 1D network, 2D mesh and 3D mesh.

The variable and dimension names used in this example differ slightly from those used in the examples on Unstructured grids. Please find a translation table below:

Unstructured grids

This example

NetNode

node

NetLink

edge/edge_nodes

NetElem/NetCell

face

NetElemNode/NetCellNode

face_nodes

NetElemLink/NetCellLink/FlowLink

face_links

degrees_east" ;  
        double Mesh2_face_contour_y(nMesh2_face, nMaxMesh2_contour_pts) ;  
                Mesh2_face_contour_y:standard_name = "latitude" ;  
                Mesh2_face_contour_y:units = "degrees_north" ;  
                Mesh2_face_contour_y:long_name = "List of y-points that form outline of flow volume" ;  
        double Mesh2_edge_x(nMesh2_edge) ;  
                // as in 2D triangular mesh example
        double Mesh2_edge_y(nMesh2_edge) ;  
                // as in 2D triangular mesh example

// Mesh topology
        integer Mesh2_edge_nodes(nMesh2_edge, Two) ;  
                // as in 2D triangular mesh example
        integer Mesh2_face_nodes(nMesh2_face, Three) ;  
                // as in 2D triangular mesh example
        integer Mesh2_face_links(nMesh2_face_links, Two) ;  
                // as in 2D triangular mesh example
        integer Mesh2 ; 
                // as in 2D triangular mesh example

// Volume and flux data
        double Mesh2_volumes(nMesh2_face) ;
                Mesh2_volumes:long_name = "volumes" ;
                Mesh2_fluxes:units = "m3" ;
                Mesh2_volumes:mesh = "Mesh2" ;
                Mesh2_volumes:location = "face" ;
                Mesh2_volumes:coordinates = "Mesh2_face_x Mesh2_face_y" ;
        double Mesh2_fluxes(nMesh2_edge) ;  
                Mesh2_fluxes:long_name = "flux across edge" ;
                Mesh2_fluxes:units = "m3 s-1" ;
                Mesh2_fluxes:mesh = "Mesh2"
                Mesh2_fluxes:location = "edge" ;
                Mesh2_fluxes:coordinates = "Mesh2_edge_x Mesh2_edge_y" ;

Volume at nodes:

Code Block

dimensions:  
        nMesh2_node = 4 ;
        nMesh2_edge = 5 ;
        nMesh2_face = 2 ;
        nMesh2_face_links = 1 ;
        nMaxMesh2_contour_pts = 6 ;

        Two = 2 ;
        Three = 3 ;

variables:  
// Mesh coordinates
        double Mesh2_node_x(nMesh2_node) ;  
                Mesh2_node_x:standard_name = "longitude" ;  
                Mesh2_node_x:long_name = "Longitude of 2D mesh nodes." ;  
                Mesh2_node_x:units = "degrees_east" ;  
                Mesh2_node_x:bounds = "Mesh2_node_contour_x" ;  
        double Mesh2_node_y(nMesh2_node) ;  
                Mesh2_node_y:standard_name = "latitude" ;  
                Mesh2_node_y:long_name = "Latitude of 2D mesh nodes." ;
                Mesh2_node_y:units = "degrees_north" ;  
                Mesh2_node_y:bounds = "Mesh2_node_contour_y" ;  
        double Mesh2_node_contour_x(nMesh2_face, nMaxMesh2_contour_pts) ;  
                Mesh2_node_contour_x:standard_name = "longitude" ;  
                Mesh2_node_contour_x:long_name = "List of x-points that form outline of flow volume" ;  
                Mesh2_node_contour_x:units = "degrees_east" ;  
        double Mesh2_node_contour_y(nMesh2_face, nMaxMesh2_contour_pts) ;  
                Mesh2_node_contour_y:standard_name = "latitude" ;  
                Mesh2_node_contour_y:units = "degrees_north" ;  
                Mesh2_node_contour_y:long_name = "List of y-points that form outline of flow volume" ;  
        double Mesh2_face_x(nMesh2_face) ;  
                // as in 2D triangular mesh example
        double Mesh2_face_y(nMesh2_face) ;  
                // as in 2D triangular mesh example
        double Mesh2_edge_x(nMesh2_edge) ;  
                // as in 2D triangular mesh example
        double Mesh2_edge_y(nMesh2_edge) ;  
                // as in 2D triangular mesh example

// Mesh topology
        integer Mesh2_edge_nodes(nMesh2_edge, Two) ;  
                // as in 2D triangular mesh example
        integer Mesh2_face_nodes(nMesh2_face, Three) ;  
                // as in 2D triangular mesh example
        integer Mesh2_face_links(nMesh2_face_links, Two) ;  
                // as in 2D triangular mesh example
        integer Mesh2 ; 
                // as in 2D triangular mesh example

// Volume and flux data
        double Mesh2_volumes(nMesh2_node) ;
                Mesh2_volumes:long_name = "volumes" ;
                Mesh2_fluxes:units = "m3" ;
                Mesh2_volumes:mesh = "Mesh2" ;
                Mesh2_volumes:location = "node" ;
                Mesh2_volumes:coordinates = "Mesh2_node_x Mesh2_node_y" ;
        double Mesh2_fluxes(nMesh2_edge) ;  
                Mesh2_fluxes:long_name = "flux along edge" ;
                Mesh2_fluxes:units = "m3 s-1" ;
                Mesh2_fluxes:mesh = "Mesh2"
                Mesh2_fluxes:location = "edge" ;
                Mesh2_fluxes:coordinates = "Mesh2_edge_x Mesh2_edge_y" ;

Location maps.

Some variables may only be defined at specific locations within the mesh, e.g. only at boundary points or at special locations like weirs and gates. To save space and to improve readability, the concept of a location_map is introduced. It is very similar to compression option in the the CF-conventions. The location map is an integer variable that contains the indices of the locations at which data is stored. The example below defines a location map "nMesh1_cell" as a subset of the "node"s of Mesh1. The attribute location_map of the variable "Mesh_waterlevel" points to this location map and the coordinates attribute points to the corresponding (subset) of latitude and longitude coordinates. The grod and location attributes of the location map variable are required; the coordinates attribute is optional. Note that the coordinates attributes on both "Mesh1_cell" and "Mesh1_waterlevel" are again redundant since the coordinates could also be obtained by using the location map "nMesh1_cell" and the node_coordinates attribute of the "Mesh1" variable. Consistent with the compress option, the location map indices are 0-based, i.e. if Mesh1_flownode(0) equals 1 then this points to the second "node" in "Mesh1".

Code Block

        integer Mesh1_cell(nMesh1_cell) ;
                Mesh1_cell:standard_name = "" ; // YET TO BE DETERMINED (proposal: location_map)
                Mesh1_cell:long_name = "Defines Mesh1_cell as subset of the nodes of Mesh1." ;  
                Mesh1_cell:mesh = "Mesh1" ;
                Mesh1_cell:location = "node" ;
                Mesh1_cell:coordinates = "Mesh1_cell_x Mesh1_cell_y" ;
        double Mesh1_cell_x(nMesh1_cell) ;
                Mesh1_cell_x:standard_name = "longitude" ;  
                Mesh1_cell_x:long_name = "Characteristic longitude of cell (e.g. longitude of node)." ;  
                Mesh1_cell_x:units = "degrees_east" ;  
        double Mesh1_cell_y(nMesh1_cell) ;
                Mesh1_cell_y:standard_name = "latitude" ;  
                Mesh1_cell_y:long_name = "Characteristic latitude of cell (e.g. latitude of node)" ;  
                Mesh1_cell_y:units = "degrees_north" ;  

        double Mesh1_waterlevel(time, nMesh1_cell) ;  
                Mesh1_waterlevel:standard_name = "sea_surface_height_above_geoid" ;
                Mesh1_waterlevel:units = "m" ;
                Mesh1_waterlevel:location_map = "Mesh1_cell" ;
                Mesh1_waterlevel:coordinates = "Mesh1_cell_x Mesh1_cell_y" ;

The location map doesn't have to be monotonic. So, it can be used for creating subsets of the original locations as well as for renumbering the locations. If the location_map attribute is used, then the mesh and location attributes shouldn't be used.

(warning) Should Mesh1_cell follow the CF/COARDS coordinate dimension conventions, i.e. integer Mesh1_cell(Mesh1_cell)? How would this work out for a location_map that is only used for renumbering.

The case of an integrated 1D-2D-3D mesh.

Combined mesh topology.

In the previous sections, we have extensively looked at single mesh geometries. What about the results file of a model with an integrated 1D, 2D and 3D model. Instead of trying to put the whole geometry into one big complex generic geometry definition, we propose to add an extra attribute parent_mesh to the individual mesh definitions. The parent_mesh attribute points to a variable that contains all the meta-data for the combined mesh. The "CombinedMesh" variable contains attributes sub_meshes and contact. The former attribute refers back to all submeshes and the latter attribute points to two variables that define the shared edges of the meshes. For each edge that two meshes have in common, the variable "CombiMesh_edge_mesh" points to the two meshes and the variable "CombiMesh_edge" points to the indices of the edges within those meshes that correspond. For example, if edge 6 of "Mesh2" aligns with edge 1 of "Mesh3", then "CombiMesh_edge_mesh" stores integer flags 1 and 2 (representing "Mesh2" and "Mesh3" respectively) and "CombiMesh_edge" stores the edge indices 5 and 0. Consistent with all other indices, the mesh and edge indices are 0-based. At the interface of the 1D and 2D mesh, a 1D edge should cross the 2D edge.

(warning) I thought that by working with edges one could represent all cases, but I just realized that a 1D mesh connected to a 2D finite element mesh doesn't have any crossing or shared edges. It seems that this approach was too much inspired by our finite volume approach. Need to think about this again...

Code Block

dimensions:  
        // dimensions for mesh 1
        nMesh1_node = 3 ;
        nMesh1_edge = 2 ;

        // dimensions for mesh 2
        nMesh2_node = 6 ;
        nMesh2_edge = 7 ;
        nMesh2_face = 2 ;
        nMaxMesh2_face_nodes = 4 ;

        // dimensions for mesh 3
        nMesh3_node = 6 ;
        nMesh3_edge = 7 ;
        nMesh3_face = 2 ;
        nMaxMesh3_face_nodes = 4 ;
        Mesh3_layers = 10 ;

        // dimension for combined mesh
        nCombiMesh_contacts = 3 ;

        // common dimensions
        Two = 2 ;

variables:  
// Mesh coordinates of Mesh1
        // skipped

// Topology of Mesh1
        integer Mesh1_edge_nodes(nMesh1_edge, Two) ;  
                Mesh1_edge_nodes:long_name = "links between two nodes" ;  
        integer Mesh1 ; 
                Mesh1:long_name = "Topology data of Mesh1" ;
                Mesh1:dimensionality = 1 ;
                Mesh1:locations = "link node" ;
                Mesh1:node_coordinates = "Mesh1_node_x Mesh1_node_y" ;
                Mesh1:edge_coordinates = "Mesh1_edge_x Mesh1_edge_y" ;
                Mesh1:edge_nodes = "Mesh1_edge_nodes" ;
                Mesh1:parent_mesh = "CombinedMesh" ;

// Mesh coordinates of Mesh2
        // skipped

// Topology of Mesh2
        integer Mesh2_edge_nodes(nMesh2_edge, Two) ;  
                Mesh2_edge_nodes:long_name = "link between two nodes" ;  
        integer Mesh2_face_nodes(nMesh2_face, nMaxMesh2_face_nodes) ;  
                Mesh2_face_nodes:long_name = "Mapping from net face to net nodes." ;  
        integer Mesh2_face_links(nMesh2_face_links, Two) ;  
                FlowLink:long_name = "link/interface between two flow elements (faces)" ;  
        integer Mesh2 ; 
                Mesh2:long_name = "Topology data of Mesh2" ;
                Mesh2:dimensionality = 2 ;
                Mesh2:locations = "face edge node" ;
                Mesh2:node_coordinates = "Mesh2_node_x Mesh2_node_y" ;
                Mesh2:edge_coordinates = "Mesh2_edge_x Mesh2_edge_y" ;
                Mesh2:edge_nodes = "Mesh2_edge_nodes" ;
                Mesh2:face_coordinates = "Mesh2_face_x Mesh2_face_y" ;
                Mesh2:face_nodes = "Mesh2_face_nodes" ;
                Mesh2:face_connectivity = "Mesh2_face_links" ;
                Mesh2:parent_mesh = "CombinedMesh" ;

// Mesh coordinates of Mesh3
        // skipped

// Topology of Mesh3
        double Mesh3_layers(Mesh3_layers) ;
                Mesh3_layers:standard_name = "ocean_sigma_coordinate" ;
                Mesh3_layers:long_name = "sigma at layer midpoints" ;
                Mesh3_layers:positive = "up" ;
                Mesh3_layers:formula_terms = "sigma: Mesh3_layers eta: Mesh3_waterlevel depth: Mesh3_depth" ;
        integer Mesh3 ; 
                Mesh3:long_name = "Topology data of Mesh3" ;
                Mesh3:dimensionality = 2 ;
                Mesh3:locations = "face edge node" ;
                Mesh3:node_coordinates = "Mesh3_node_x Mesh3_node_y" ;
                Mesh3:edge_coordinates = "Mesh3_edge_x Mesh3_edge_y" ;
                Mesh3:edge_nodes = "Mesh3_edge_nodes" ;
                Mesh3:face_coordinates = "Mesh3_face_x Mesh3_face_y" ;
                Mesh3:face_nodes = "Mesh3_face_nodes" ;
                Mesh3:face_connectivity = "Mesh3_face_links" ;
                Mesh3:parent_mesh = "CombinedMesh" ;

// Topology of combined mesh
        integer CombiMesh_edge_mesh(nCombiMesh_contacts, Two) ; 
                CombiMesh_edge_mesh:long_name = "Mesh number of contact" ; 
                CombiMesh_edge_mesh:valid_range = 0, 2;
                CombiMesh_edge_mesh:valid_values = 0, 1, 2;
                CombiMesh_edge_mesh:flag_meanings = "Mesh1 Mesh2 Mesh3" ;
        integer CombiMesh_edge(nCombiMesh_contacts, Two) ; 
                CombiMesh_edge:long_name = "Edge number of contact" ; 
        integer CombinedMesh ; 
                CombinedMesh:long_name = "Topology data of CombinedMesh" ;
                CombinedMesh:sub_meshes = "Mesh1 Mesh2 Mesh3" ;
                CombinedMesh:contact = "CombiMesh_edge_mesh CombiMesh_edge" ;

// Other variables
        // skipped

Example of a combination of connected 1D network, 2D mesh and 3D mesh.

The variable and dimension names used in this example differ slightly from those used in the examples on Unstructured grids. Please find a translation table below:

Unstructured grids

This example

NetNode

node

NetLink

edge/edge_nodes

NetElem/NetCell

face

NetElemNode/NetCellNode

face_nodes

NetElemLink/NetCellLink/FlowLink

face_links

Code Block

netcdf test_map {  

dimensions:  
        // dimensions for mesh 1
        nMesh1_node = 5 ;
        nMesh1_edge = 4 ;
        nMaxMesh1_contour_pts = 99 ;
        nMesh1_cell = 4 ;
        nMesh1_interface = 3 ;

        // dimensions for mesh 2
        nMesh2_node = 6 ;
        nMesh2_edge = 7 ;
        nMesh2_face = 2 ;
        nMesh2_face_links = 1 ;
        nMaxMesh2_face_nodes = 4 ;
        nMaxMesh2_contour_pts = 99 ;

Code Block

netcdf test_map {  

dimensions:  
        // dimensions for mesh 1 mesh 3
        nMesh3_node = 6 ;
        nMesh3_edge = 7 ;
        nMesh3_face = 2 ;
        nMesh1nMesh3_face_nodelinks = 31 ;
        nMesh1nMaxMesh3_face_edgenodes = 24 ;
        nMaxMesh1nMaxMesh3_contour_pts = 99 ;
        nMesh1nMesh3_celllayer = 23 ;
        nMesh1nMesh3_interface = 24 ;
        
        // dimensionsdimension for combined mesh 2
        nMesh2nCombiMesh_nodecontacts = 63 ;

        nMesh2_edge = 7 ;// common dimensions
        nMesh2_faceTwo = 2 ;
        nMesh2_face_linkstime = UNLIMITED ; // 1;
        nMaxMesh2_face_nodes = 4;(1 currently)  

variables:  
// Basic mesh data (coordinates independent of computational cells whatsoever)
        nMaxMesh2_contour_pts = 99 ;

double Mesh1_node_x(nMesh1_node) ;  
        // dimensions for mesh 3
    Mesh1_node_x:standard_name =   nMesh3_node = 6"projection_x_coordinate" ;
  
      nMesh3_edge = 7 ;
        nMesh3_faceMesh1_node_x:long_name = 2"netnodal x-coordinate" ;
  
      nMesh3_face_links = 1;
        nMaxMesh3Mesh1_facenode_nodesx:units = "m" 4;  
        nMaxMesh3_contour_pts = 99 ;
 double Mesh1_node_y(nMesh1_node) ;  
       nMesh3_layer = 3 ;
      Mesh1_node_y:standard_name = nMesh3_interface = 4;

"projection_y_coordinate" ;  
        // common dimensions
      Mesh1_node_y:long_name = Two = 2"netnodal y-coordinate" ;
        time = UNLIMITED ; // (1 currently)  

variables:  
// Basic mesh data (coordinates independent of computational cells whatsoever)      Mesh1_node_y:units = "m" ;  
        double Mesh1_nodeedge_x(nMesh1_nodeedge) ;  
                Mesh1_nodeedge_x:standard_name = "projection_x_coordinate" ;  
                Mesh1_nodeedge_x:long_name = "netnodalCenter x-coordinate" ;of net 
link                Mesh1_node_x:units = "m"(velocity point)." ;  
                Mesh1_nodeedge_x:boundsunits = "Mesh1_node_contour_xm" ;  
        double Mesh1_nodeedge_y(nMesh1_nodeedge) ;  
                Mesh1_nodeedge_y:standard_name = "projection_y_coordinate" ;  
                Mesh1_nodeedge_y:long_name = "netnodalCenter y-coordinatecoordinate of net link (velocity point)." ;  
                Mesh1_edge_y:units = "m" ;  

// Basic Mesh1_node_y:units = "m"mesh topology
        integer Mesh1_edge_nodes(nMesh1_edge, Two) ;  
                Mesh1_nodeedge_ynodes:boundslong_name = "Mesh1_node_contour_ylinks between two nodes" ;  
        doubleinteger Mesh1_edge_x(nMesh1_edge) ;  
                Mesh1_edge_x:standardlong_name = "projection_x_coordinateTopology data of Mesh1" ;  
                Mesh1_edge_x:long_name:dimensionality = 1 "Center;
 coordinate of net link (velocity point)." ;  
       Mesh1:locations = "link node" ;
     Mesh1_edge_x:units = "m" ;  
      Mesh1:node_coordinates  double= "Mesh1_node_x Mesh1_edgenode_y(nMesh1_edge)" ;  
                Mesh1_:edge_y:standard_namecoordinates = "projectionMesh1_edge_x Mesh1_edge_y_coordinate" ;  
                Mesh1_:edge_y:long_namenodes = "Center coordinate of net link (velocity point).Mesh1_edge_nodes" ;  
                Mesh1_edge_y:units:parent_mesh = "mCombinedMesh" ;

// Similar for Mesh2
        double Mesh1Mesh2_node_contour_x(nMesh1nMesh2_node, nMaxMesh1_contour_pts) ;  
                Mesh1Mesh2_node_contour_x:standard_name = "projection_x_coordinate" ;  
                Mesh1Mesh2_node_contour_x:long_name = "List ofnetnodal x-points that form outline of flow volumecoordinate" ;  
                Mesh1Mesh2_node_contour_x:units = "m" ;  
        double Mesh1Mesh2_node_contour_y(nMesh1nMesh2_node, nMaxMesh1_contour_pts) ;  
                Mesh1Mesh2_node_contour_y:standard_name = "projection_y_coordinate" ;  
                Mesh1Mesh2_node_contour_y:unitslong_name = "mnetnodal y-coordinate" ;  
                Mesh1_node_contour_y:long_name = "List of y-points that form outline of flow volumeMesh2_node_y:units = "m" ;  

// Basic mesh topology
     double   integer Mesh1_edge_nodes(nMesh1_edge, TwoMesh2_face_x(nMesh2_face) ;  
                Mesh1Mesh2_edgeface_nodesx:longstandard_name = "links between two nodesprojection_x_coordinate" ;  
        integer Mesh1 ; 
                Mesh1Mesh2_face_x:long_name = "TopologyFlow dataelement ofcircumcenter Mesh1x" ;  
                Mesh1:dimensionalityMesh2_face_x:units = 1"m" ;  
                Mesh1:locationsMesh2_face_x:bounds = "link node" ;"Mesh2_face_contour_x" ;  
        double Mesh2_face_y(nMesh2_face) ;  
                Mesh1:node_coordinatesMesh2_face_y:standard_name = "Mesh1projection_node_x Mesh1_node_yy_coordinate" ;  
                Mesh1:edge_coordinatesMesh2_face_y:long_name = "Mesh1_edge_x Mesh1_edge_Flow element circumcenter y" ;  
                Mesh1:edge_nodesMesh2_face_y:units = "Mesh1_edge_nodesm" ;  
                Mesh1:parent_meshMesh2_face_y:bounds = "CombinedMeshMesh2_face_contour_y" ;

// Similar for Mesh2
        double Mesh2_nodeface_contour_x(nMesh2_node_face, nMaxMesh2_contour_pts) ;  
                Mesh2_nodeface_contour_x:standard_name = "projection_x_coordinate" ;  
                Mesh2_face_nodecontour_x:long_name = "netnodalList of x-coordinatepoints that form outline of flow volume" ;  
                Mesh2_nodeface_contour_x:units = "m" ;  
        double Mesh2_nodeface_contour_y(nMesh2_nodeface, nMaxMesh2_contour_pts) ;  
                Mesh2_face_nodecontour_y:standard_name = "projection_y_coordinate" ;  
                Mesh2_nodeface_contour_y:long_nameunits = "netnodal y-coordinatem" ;  
                Mesh2_face_nodecontour_y:unitslong_name = "mList of y-points that form outline of flow volume" ;  
        double Mesh2_faceedge_x(nMesh2_faceedge) ;  
                Mesh2_faceedge_x:standard_name = "projection_x_coordinate" ;  
                Mesh2_faceedge_x:long_name = "FlowCenter elementcoordinate circumcenterof x"net ;link  
                Mesh2_face_x:units = "m"(velocity point)." ;  
                Mesh2_faceedge_x:boundsunits = "Mesh2_face_contour_xm" ;  
        double Mesh2_faceedge_y(nMesh2_faceedge) ;  
                Mesh2_faceedge_y:standard_name = "projection_y_coordinate" ;  
                Mesh2_faceedge_y:long_name = "Flow element circumcenter yCenter coordinate of net link (velocity point)." ;  
                Mesh2_face_y:units = "m" edge_y:units = "m" ;  

        integer Mesh2_edge_nodes(nMesh2_edge, Two) ;  
                Mesh2_faceedge_ynodes:boundslong_name = "Mesh2_face_contour_ylink between two nodes" ;  
        doubleinteger Mesh2_face_contour_xnodes(nMesh2_face, nMaxMesh2_contourface_ptsnodes) ;  
                Mesh2_face_contour_xnodes:standardlong_name = "projection_x_coordinate" ;  
      Mapping from net face to net nodes." ;  
        integer  Mesh2_face_contour_x:long_name = "List of x-points that form outline of flow volume" links(nMesh2_face_links, Two) ;  
                Mesh2_face_contour_x:unitsFlowLink:long_name = "m" ;  
        double Mesh2_face_contour_y(nMesh2_face, nMaxMesh2_contour_pts) ;  link/interface between two flow elements (faces)" ;  
        integer Mesh2 ; 
                Mesh2_face_contour_y:standard:long_name = "projection_y_coordinateTopology data of Mesh2" ;  
                Mesh2_face_contour_y:units:dimensionality = "m"2 ;  
                Mesh2_face_contour_y:long_name:locations = "List of y-points that form outline of flow volume" ;  
face edge node" ;
                Mesh2:node_coordinates double= "Mesh2_edgenode_x(nMesh2_edge) Mesh2_node_y" ;  
                Mesh2_:edge_x:standard_namecoordinates = "projectionMesh2_edge_x Mesh2_edge_coordinatey" ;  
                Mesh2_:edge_x:long_namenodes = "Center coordinate of net link (velocity point).Mesh2_edge_nodes" ;
  
              Mesh2:face_coordinates = "Mesh2_edgeface_x:units = "m" ;  
 Mesh2_face_y" ;
               double Mesh2_edge_y(nMesh2_edge) ;  :face_nodes = "Mesh2_face_nodes" ;
                Mesh2_edge_y:standardface_nameconnectivity = "projectionMesh2_yface_coordinatelinks" ;  
                Mesh2_edge_y:longparent_namemesh = "Center coordinate of net link (velocity point)."CombinedMesh" ;

// Similar for Mesh3
        double Mesh3_node_x(nMesh3_node) ;  
                Mesh2Mesh3_edgenode_yx:unitsstandard_name = "mprojection_x_coordinate" ;  
              integer  Mesh2Mesh3_edge_nodes(nMesh2_edge, Two)node_x:long_name = "netnodal x-coordinate" ;  
                Mesh2Mesh3_edgenode_nodesx:long_nameunits = "link between two nodesm" ;  
        integerdouble Mesh2Mesh3_facenode_nodesy(nMesh2_face, nMaxMesh2_face_nodesnMesh3_node) ;  
                Mesh2Mesh3_facenode_nodesy:longstandard_name = "Mapping from net face to net nodes." ;  
        integer Mesh2_face_links(nMesh2_face_links, Two) projection_y_coordinate" ;  
                FlowLinkMesh3_node_y:long_name = "link/interface between two flow elements (faces)netnodal y-coordinate" ;
  
        integer Mesh2 ; 
   Mesh3_node_y:units = "m" ;  
        Mesh2:long_name = "Topology data of Mesh2" ; double Mesh3_face_x(nMesh3_face) ;  
                Mesh2:dimensionalityMesh3_face_x:standard_name = 2"projection_x_coordinate" ;  
                Mesh2:locationsMesh3_face_x:long_name = "faceFlow element edgecircumcenter nodex" ;  
                Mesh2:node_coordinatesMesh3_face_x:units = "Mesh2_node_x Mesh2_node_ym" ;  
                Mesh2:edge_coordinatesMesh3_face_x:bounds = "Mesh2Mesh3_face_edgecontour_x Mesh2_edge_y" ;
  
              Mesh2:edge_nodes = "Mesh2_edge_nodes" ;double Mesh3_face_y(nMesh3_face) ;  
                Mesh2:face_coordinatesMesh3_face_y:standard_name = "Mesh2projection_face_x Mesh2_face_yy_coordinate" ;  
                Mesh2:face_nodesMesh3_face_y:long_name = "Mesh2_face_nodesFlow element circumcenter y" ;  
                Mesh2:Mesh3_face_connectivityy:units = "Mesh2_face_linksm" ;  
                Mesh2:parent_meshMesh3_face_y:bounds = "CombinedMeshMesh3_face_contour_y" ;

// Similar for Mesh3
        double Mesh3_nodeface_contour_x(nMesh3_nodeface, nMaxMesh3_contour_pts) ;  
                Mesh3_nodeface_contour_x:standard_name = "projection_x_coordinate" ;  
                Mesh3_face_nodecontour_x:long_name = "netnodalList of x-coordinatepoints that form outline of flow volume" ;  
                Mesh3_nodeface_contour_x:units = "m" ;  
        double Mesh3_face_nodecontour_y(nMesh3_nodeface, nMaxMesh3_contour_pts) ;  
                Mesh3_face_nodecontour_y:standard_name = "projection_y_coordinate" ;  
                Mesh3_face_nodecontour_y:long_nameunits = "netnodal y-coordinatem" ;  
                Mesh3_face_contour_y:long_name = "List of y-points that form  Mesh3_node_y:units = "m"outline of flow volume" ;  
        double Mesh3_faceedge_x(nMesh3_faceedge) ;  
                Mesh3_faceedge_x:standard_name = "projection_x_coordinate" ;  
                Mesh3_faceedge_x:long_name = "Flow element circumcenter xCenter coordinate of edges (velocity point)." ;  
                Mesh3_faceedge_x:units = "m" ;  
                Mesh3_face_x:bounds = "Mesh3_face_contour_x" ;  
        double Mesh3_faceedge_y(nMesh3_faceedge) ;  
                Mesh3_faceedge_y:standard_name = "projection_y_coordinate" ;  
                Mesh3_faceedge_y:long_name = "Flow element circumcenter yCenter coordinate of edges (velocity point)." ;  
                Mesh3_faceedge_y:units = "m" ;  

        integer Mesh3_edge_nodes(nMesh3_edge, Two) ;  
                Mesh3_faceedge_ynodes:boundslong_name = "Mesh3_face_contour_ylink between two nodes" ;  
        doubleinteger Mesh3_face_contour_xnodes(nMesh3_face, nMaxMesh3_contourface_ptsnodes) ;  
                Mesh3_face_contour_xnodes:standardlong_name = "projection_x_coordinate"Mapping from faces to nodes." ;  
        integer Mesh3_face_links(nMesh3_face_links, Two) ;  
                Mesh3_face_contour_xFlowLink:long_name = "Listlink/interface ofbetween x-pointstwo thatflow form outline of flow volumeelements (faces)" ;  
        double Mesh3_layers(Mesh3_layers) ;
      Mesh3_face_contour_x:units = "m" ;  
        double Mesh3_face_contour_y(nMesh3_face, nMaxMesh3_contour_pts) ;  layers:standard_name = "ocean_sigma_coordinate" ;
                Mesh3_face_contour_y:standardlayers:long_name = "projection_y_coordinatesigma at layer midpoints" ;  
                Mesh3_face_contour_y:unitslayers:positive = "mup" ;  
                Mesh3_face_contour_y:long_namelayers:formula_terms = "List of y-points that form outline of flow volume" ;  sigma: Mesh3_layers eta: Mesh3_zwl depth: Mesh3_depth" ;
        double Mesh3_edge_xinterfaces(nMesh3Mesh3_edgeinterfaces) ;  
                Mesh3_edge_xinterfaces:standard_name = "projectionocean_xsigma_coordinate" ;  
                Mesh3_edge_xinterfaces:long_name = "Centersigma coordinateat of edges (velocity point).layer interfaces" ;  
                Mesh3_edge_xinterfaces:unitspositive = "mup" ;
    
           double Mesh3_edge_y(nMesh3_edge) ;  
      interfaces:formula_terms = "sigma: Mesh3_interfaces eta: Mesh3_zwl depth: Mesh3_depth" ;
        integer  Mesh3_edge_y:standard_name = "projection_y_coordinate" ;  
                Mesh3_edge_y:long_name = "CenterTopology coordinatedata of edges (velocity point).Mesh3" ;  
                Mesh3_edge_y:unitsdimensionality = "m"2 ;
     
          integer Mesh3_edge_nodes(nMesh3_edge, Two) ;  
:locations = "face edge node" ;
                Mesh3:node_coordinates = "Mesh3_edge_nodes:long_name = "link between two nodes" ;  
node_x Mesh3_node_y" ;
               integer Mesh3_face_nodes(nMesh3_face, nMaxMesh3_face_nodes) ;  
:edge_coordinates = "Mesh3_edge_x Mesh3_edge_y" ;
                Mesh3:edge_nodes = "Mesh3_faceedge_nodes:long_name = "Mapping from faces to nodes." ;  
" ;
                Mesh3:face_coordinates integer= "Mesh3_face_links(nMesh3x Mesh3_face_links, Two) ;  y" ;
                FlowLinkMesh3:longface_namenodes = "link/interface between two flow elements (faces)" ;  
"Mesh3_face_nodes" ;
               double Mesh3_layers(Mesh3_layers):face_connectivity = "Mesh3_face_links" ;
                Mesh3_layers:standardparent_namemesh = "ocean_sigma_coordinateCombinedMesh" ;

// Information of combined mesh
            Mesh3_layers:long_name = "sigma at layer midpoints" ;integer CombiMesh_edge_mesh(nCombiMesh_contacts, Two) ; 
                Mesh3CombiMesh_edge_layersmesh:positivelong_name = "upMesh number of contact" ; 
                Mesh3CombiMesh_edge_layersmesh:formulavalid_termsrange = "sigma: Mesh3_layers eta: Mesh3_zwl depth: Mesh3_depth" ;
        double Mesh3_interfaces(Mesh3_interfaces) 0, 2;
                Mesh3CombiMesh_edge_interfacesmesh:standardvalid_namevalues = "ocean_sigma_coordinate" 0, 1, 2;
                Mesh3CombiMesh_edge_interfacesmesh:longflag_namemeanings = "sigmaMesh1 atMesh2 layer interfacesMesh3" ;
                Mesh3_interfaces:positive = "up" ;integer CombiMesh_edge(nCombiMesh_contacts, Two) ; 
                Mesh3CombiMesh_interfacesedge:formulalong_termsname = "sigma: Mesh3_interfaces eta: Mesh3_zwl depth: Mesh3_depthEdge number of contact" ; 
        integer Mesh3CombinedMesh ; 
                Mesh3CombinedMesh:long_name = "Topology data of Mesh3CombinedMesh" ;
                Mesh3CombinedMesh:dimensionalitysub_meshes = 2 "Mesh1 Mesh2 Mesh3" ;
                Mesh3CombinedMesh:locationscontact = "face edge node" ;CombiMesh_edge_mesh CombiMesh_edge" ;

// Time coordinate
        double time(time) ;  
                Mesh3time:nodestandard_coordinatesname = "Mesh3_node_x Mesh3_node_ytime" ;
                Mesh3time:edge_coordinatesunits = "Mesh3_edge_x Mesh3_edge_y" ;
                Mesh3:edge_nodes = "Mesh3_edge_nodes" ;
                Mesh3:face_coordinates = "Mesh3_face_x Mesh3_face_y" ;
                Mesh3:face_nodes = "Mesh3_face_nodes" ;
         seconds since 1992-08-31 00:00:00" ;  

// The 1D network connects to the 2D mesh by having one network node inside one
// of the 2D mesh faces. The values (water level, concentrations, etc.) at this
// common volume are only stored on the 2D mesh. Therefore, we have simulation
// data on only a subset of the 1D network and we thus define two location maps
// for the 1D network: one for the flow cells (at the 1D network nodes) and one
// for the flow links (at the 1D network edges).

       Mesh3:face_connectivity = "Mesh3_face_links"double Mesh1_cell_x(nMesh1_cell) ;
                Mesh3:parent_meshMesh1_cell_x:standard_name = "CombinedMeshprojection_x_coordinate" ;

        integer CombiMesh_edge_mesh(nCombiMesh_contacts, Two) ; 
                CombiMeshMesh1_edgecell_meshx:long_name = "Meshflow numbercell ofcircumcenter contactx-coordinate" ;  
                CombiMeshMesh1_edgecell_meshx:valid_rangeunits = 0,"m" 2;  
                CombiMeshMesh1_edgecell_meshx:valid_valuesbounds = 0, 1, 2;
  "Mesh1_cell_contour_x" ;  
        double Mesh1_cell_y(nMesh1_cell) ;
    CombiMesh_edge_mesh:flag_meanings = "Mesh1 Mesh2 Mesh3" ;
        integer CombiMesh_edge(nCombiMesh_contacts, Two) ;Mesh1_cell_y:standard_name = "projection_y_coordinate" ;  
                CombiMeshMesh1_cell_edgey:long_name = "Edgeflow numbercell ofcircumcenter contacty-coordinate" ;  
          integer CombinedMesh(nCombinedMesh_contacts, Four)      Mesh1_cell_y:units = "m" ;  
                CombinedMesh:long_nameMesh1_cell_y:bounds = "Topology data of CombinedMeshMesh1_cell_contour_y" ;
  
        double      CombinedMesh:sub_meshes = "Mesh1 Mesh2 Mesh3" ;Mesh1_cell_contour_x(nMesh1_node, nMaxMesh1_contour_pts) ;  
                CombinedMesh:contactMesh1_cell_contour_x:standard_name = "CombiMeshprojection_edge_mesh CombiMesh_edgex_coordinate" ;

  
      double time(time) ;  
                time:standard_name = "time" ;Mesh1_cell_contour_x:long_name = "List of x-points that form outline of flow cell" ;  
                timeMesh1_cell_contour_x:units = "seconds since 1992-08-31 00:00:00m" ;  
// 1D mesh nodes may be merged with 2D mesh faces. Or 2D mesh faces may be masked and omitted in
// solution output. As a result, allow for a map between flow node numbers and basic mesh entities/numbers).
//
// Relation between basic mesh (nodes/edges/faces) and computational mesh (corners/interfaces/cells)
// (For cell center data, nMesh1_cell <= nMesh1_node, nMesh2_cell <= nMesh2_face)
// (In case of identity maps, leave out the location_map, and specify coordinates, grid and location
//  directly in attributes of solution variable.)double Mesh1_cell_contour_y(nMesh1_node, nMaxMesh1_contour_pts) ;  
                Mesh1_cell_contour_y:standard_name = "projection_y_coordinate" ;  
                Mesh1_cell_contour_y:units = "m" ;  
                Mesh1_cell_contour_y:long_name = "List of y-points that form outline of flow cell" ;  
        double Mesh1_flow_cell_x(nMesh1_cell) ;
                Mesh1_flow_cell_x:standardlong_name = "projection_x_coordinatemap from flowcell to 1D mesh node" ;  
                Mesh1_flow_cell_x:long_name = "flow cell circumcenter x-coordinate:mesh = "Mesh1" ;  
                Mesh1_flow_cell_x:unitslocation = "mnode" ; // location of flow cell on topological mesh entity.

        double Mesh1_cellinterface_yx(nMesh1_cellinterface) ;
                Mesh1_cellinterface_yx:standard_name = "projection_yx_coordinate" ;  
                Mesh1_cellinterface_yx:long_name = "flow cell circumcentercenter yx-coordinate" ;  
                Mesh1_cellinterface_yx:units = "m" ;  
        double Mesh1_flownodeinterface_y(nMesh1_cellinterface) ;
                Mesh1_cellinterface_nodey:longstandard_name = "map from flowcell to 1D mesh nodeprojection_y_coordinate" ;  
                Mesh1_cellinterface_nodey:gridlong_name = "Mesh1flow link center y-coordinate" ;  
                Mesh1_cellinterface_nodey:locationunits = "nodem" ; // location of flow cell on topological mesh entity.
        double Mesh1_flowlinkflow_link(nMesh1_interface) ;
                Mesh1_cellflow_nodelink:long_name = "map from flowlinkflow link to 1D mesh edge" ;  
                Mesh1_cellflow_nodelink:gridmesh = "Mesh1" ;
                Mesh1_cellflow_nodelink:location = "edge" ; // location of flow link on topological mesh entity.

// Data on Mesh1
        double Mesh1_zwl(time, nMesh1_cell) ;  
                Mesh1_zwl:standard_name = "sea_surface_height_above_geoid" ;
                Mesh1_zwl:units = "m" ;
                Mesh1_zwl:location_map = "Mesh1_flownodeflow_cell" ;
                Mesh1_zwl:coordinates = "Mesh1_cell_x Mesh1_cell_y" ;
        double Mesh1_u(time, nMesh1_interface) ;  
                Mesh1_zwl:standard_name = "sea_water_speed" ;
                Mesh1_u:long_name = "Velocity (along the edge)" ; 
                Mesh1_u:units = "m s-1" ;  
                Mesh1_u:location_map = "Mesh1_flowlinkflow_link" ;
                Mesh1_u:coordinates = "Mesh1_interface_x Mesh1_interface_y" ;  

// Data on Mesh2
        double Mesh2_depth(nMesh2_node) ;  
                Mesh2_depth:standard_name = "sea_floor_depth_below_geoid" ;
                Mesh2_depth:units = "m" ;
                Mesh2_depth:positive = "down" ;
                Mesh2_depth:gridmesh = "Mesh2"
                Mesh2_depth:location = "node" ;
                Mesh2_depth:coordinates = "Mesh2_node_x Mesh2_node_y" ;
        double Mesh2_zwl(time, nMesh2_face) ;  
                Mesh2_zwl:standard_name = "sea_surface_height_above_geoid" ;
                Mesh2_zwl:units = "m" ;
                Mesh2_zwl:gridmesh = "Mesh2"
                Mesh2_zwl:location = "face" ;
                Mesh2_zwl:coordinates = "Mesh2_face_x Mesh2_face_y" ;
        double Mesh2_ucx(time, nMesh2_face) ;  
                Mesh2_ucx:standard_name = "eastward_sea_water_velocity" ;
                Mesh2_ucx:units = "m s-1" ;
                Mesh2_ucx:gridmesh = "Mesh2"
                Mesh2_ucx:location = "face" ;
                Mesh2_ucx:coordinates = "Mesh2_face_x Mesh2_face_y" ;  
        double Mesh2_ucy(time, nMesh2_face) ;  
                Mesh2_ucy:standard_name = "northward_sea_water_velocity" ;
                Mesh2_ucy:units = "m s-1" ;
                Mesh2_ucy:gridmesh = "Mesh2"
                Mesh2_ucy:location = "face" ;
                Mesh2_ucy:coordinates = "Mesh2_face_x Mesh2_face_y" ;  
        double Mesh2_unorm(time, nMesh2_edge) ;  
                Mesh2_unorm:long_name = "Normal component of velocity at the interface" ; 
                Mesh2_unorm:units = "m s-1" ;  
                Mesh2_unorm:gridmesh = "Mesh2"
                Mesh2_unorm:location = "edge" ;  
                Mesh2_unorm:coordinates = "Mesh2_edge_x Mesh2_edge_y" ;  
todo: meaning?
        integer Mesh2_edgetype(nMesh2_edge) ;  
                Mesh2_edgetype:long_name = "Type of edge" ; 
                Mesh2_edgetype:valid_range = 0, 21 ;
                Mesh2_edgetype:valid_values = 0, 1, 2 ;
                Mesh2_edgetype:flag_meanings = "closed_edge open_internal_edge open_boundary_edge" ;
                Mesh2_edgetype:gridmesh = "Mesh2"
                Mesh2_edgetype:location = "edge" ;  
                Mesh2_edgetype:coordinates = "Mesh2_edge_x Mesh2_edge_y" ;  

        double Mesh3_depth(nMesh3_node) ;  
                Mesh3_depth:standard_name = "sea_floor_depth_below_geoid" ;
                Mesh3_depth:units = "m" ;
                Mesh3_depth:positive = "down" ;
                Mesh3_depth:gridmesh = "Mesh3"
                Mesh3_depth:location = "node" ;
                Mesh3_depth:coordinates = "Mesh3_node_x Mesh3_node_y" ;
        double Mesh3_zwl(time, nMesh3_face) ;  
                Mesh3_zwl:standard_name = "sea_surface_height_above_geoid" ;
                Mesh3_zwl:units = "m" ;
                Mesh3_zwl:gridmesh = "Mesh3"
                Mesh3_zwl:location = "face" ;
                Mesh3_zwl:coordinates = "Mesh3_face_x Mesh3_face_y" ;
        double Mesh3_ucx(time, nMesh3_face, nMesh3_layer) ;  
                Mesh3_ucx:standard_name = "eastward_sea_water_velocity" ;
                Mesh3_ucx:units = "m s-1" ;
                Mesh3_ucx:gridmesh = "Mesh3"
                Mesh3_ucx:location = "face" ;
                Mesh3_ucx:coordinates = "Mesh3_face_x Mesh3_face_y Mesh3_layers" ;  
        double Mesh3_ucy(time, nMesh3_face, nMesh3_layer) ;  
                Mesh3_ucy:standard_name = "northward_sea_water_velocity" ;
                Mesh3_ucy:units = "m s-1" ;
                Mesh3_ucy:gridmesh = "Mesh3"
                Mesh3_ucy:location = "face" ;
                Mesh3_ucy:coordinates = "Mesh3_face_x Mesh3_face_y Mesh3_layers" ;  
        double Mesh3_unorm(time, nMesh3_edge, nMesh3_layer) ;  
                Mesh3_unorm:long_name = "Normal component of velocity at the interface" ; 
                Mesh3_unorm:units = "m s-1" ;  
                Mesh3_unorm:gridmesh = "Mesh3"
                Mesh3_unorm:location = "edge" ;  
                Mesh3_unorm:coordinates = "Mesh3_edge_x Mesh3_edge_y Mesh3_layers" ;  
TODO: meaning
        integer Mesh3_edgetype(nMesh3_edge) ;  
                Mesh3_edgetype:long_name = "Type of edge" ; 
                Mesh3_edgetype:valid_range = 0, 21 ;
                Mesh3_edgetype:valid_values = 0, 1, 2 ;
                Mesh3_edgetype:flag_meanings = "closed_edge open_internal_edge open_boundary_edge" ;
                Mesh3_edgetype:gridmesh = "Mesh3"
                Mesh3_edgetype:location = "edge" ;  
                Mesh3_edgetype:coordinates = "Mesh3_edge_x Mesh3_edge_y" ;  

// global attributes:  
                :institution = "Deltares" ;  
                :references = "http://www.deltares.nl" ;  
                :source = "UNSTRUC" ;  
                :history = "CreatedVarious on 2010-04-12, Bert Jagers\n",
    "2010-06-01, distinguish basic mesh/net and flow mesh, include mapping between the two, Arthur van Dam" iterations; see wiki history.";  
                :Conventions = "CF-1.4:Deltares-0.1" ;