The Decl'NetCDF plugin
The Decl'NetCDF plugin was created to read from and write to NetCDF files in a declarative way.
Decl'NetCDF plugin allows you to:
- Read/write data as NetCDF variables from/to NetCDF file.
- Define groups in the NetCDF file. Groups can be nested.
- Read/write variables and groups attributes. Automatically read and written when openning the file.
- Execute input/output operations on event.
- Execute input/output operations on data share (when the event is not defined).
- Define
UNLIMITED
dimension and dimensions names. - Read/write only part of NetCDF variable by hyperslab definition.
- Read/write in parallel mode using MPI.
Configuration elements
The root of Decl'NetCDF plugin configuration (named decl_netcdf
), is a dictionary or a list of dictionaries that contains the following subtrees:
key | value |
---|---|
file |
file subtree |
communicator |
communicator subtree |
on_event |
on_event subtree |
groups |
groups subtree |
variables |
variables subtree |
write |
write subtree |
read |
read subtree |
Configuration examples:
plugins:
decl_netcdf:
file: ""file_name.nc""
write: ...
plugins:
decl_netcdf:
- file: ""file_name.nc""
write: ...
- file: "file_name_2.nc"
write: ...
- file: ""file_name.nc""
read: ...
file subtree
Defines name (path) of the input/output file.
key | value |
---|---|
file |
string containing filename (can have $-expressions ) |
Configuration example:
plugins:
decl_netcdf:
file: "file_name_${i}.nc"
communicator subtree
Enables parallel NetCDF input/output. Defines communicator to use on read/write (all processes must have the same communicator and filename).
key | value |
---|---|
communicator |
$-expression to valid MPI_comm |
Configuration example:
plugins:
decl_netcdf:
file: ""file_name.nc""
communicator: $MPI_COMM_WORLD
on_event subtree
Defines on which events the plugin reads/writes data from/to NetCDF file. The value can be either single event name or the array of events names (both examples presented below).
key | value |
---|---|
on_event |
string or array of string that cointain event names |
Configuration examples:
plugins:
decl_netcdf:
file: "file_name.nc"
on_event: "event"
plugins:
decl_netcdf:
file: "file_name.nc"
on_event: ["event_1", "event_2"]
when subtree
Defines the condition on which plugin will execute input/output operation on the file.
key | value |
---|---|
when |
$-expression condition evalueated to boolean value |
Configuration example:
plugins:
decl_netcdf:
file: "file_name.nc"
when: "$i < 10"
groups subtree
Defines groups in the NetCDF file. Mainly used to read/write attributes values of the groups.
If group won't have any attributes, this subtree can be omitted. Decl'NetCDF plugin will create group by default for every variable.
key | value |
---|---|
groups |
Map of group name subtree |
Configuration example:
plugins:
decl_netcdf:
file: "file_name.nc"
groups:
group1:
attributes:
attr1:
value: $value1
attr2:
value: $value2
group1/group2:
attributes:
attr1:
value: $value3
attr2:
value: $value4
group name subtree
key | value |
---|---|
name (path) of the group | Map with attribute key with value as map of attribute subtree |
variables subtree
Defines variables in the NetCDF file. Mainly used to define dimensions names and read/write attributes of the variable.
- If no dimensions names are defined, the plugin will give them arbitrary names.
- If the data type of variable differs from the one in descriptor this subtree is mandatory. It also allows to define
UNLIMITED
dimension (size of dimension must be then set to0
). - If the variable is in group it has to be define in the variable name (
/
group notation:group_name/varaibale_name
) - This subtree can be omitted. In this case, the name of NetCDF variable will be the same as the name of the descriptor and have the same type and no attributes.
key | value |
---|---|
variable path | variable definition subtree |
Configuration example:
plugins:
decl_netcdf:
file: "file_name.nc"
variables:
group1/group2/variable_name:
type: array
subtype: double
size: [0, $value, $value] # 0 -> UNLIMITED dimension
dimensions: ["time", "height", "width"]
attributes:
attr1: $value
variable definition subtree
key | value |
---|---|
type | type of variable (defined the same way as other types in PDI) |
dimensions | array of dimensions names of variable |
attributes | Map of attribute subtree |
attribute subtree
key | value |
---|---|
attribute name | $-expression value to be written as attribute |
write subtree
The write
subtree can have 2 definitions:
-
Just a name of descriptor to write or the list of descriptors names to write to file. In this case the name of NetCDF variable will be the same as the name of the descriptor and have the same type and no attributes.
Configuration examples:
plugins: decl_netcdf: file: "file_name.nc" write: data_name #------------------------------------- plugins: decl_netcdf: file: "file_name.nc" write: [data_name_1, data_name_2]
-
Dictionary, with key as descriptor name and value as following subtree:
key | value |
---|---|
when |
read/write when subtree |
variable |
variable name to write (may be defined in variables subtree) |
variable_selection |
subtree |
Configuration example:
data:
int_submatrix_11:
type: array
subtype: int
size: [4, 4]
plugins:
decl_netcdf:
file: "file_name.nc"
variables:
integer_matrix:
type: array
subtype: int
size: [8, 8]
dimensions: ["height", "width"]
write:
int_submatrix_11:
when: $i < 10
variable: integer_matrix
variable_selection: # select bottom-left submatrix 4x4
start: [4, 4]
subsize: [4, 4]
subtree
Defines the part of file NetCDF variable where from read/to write the data. The hyperslab will be created from given start
and subsize
(count
) lists.
key | value |
---|---|
start |
list specifying start index for each dimension |
subsize |
list specifying count for each dimension |
read/write when subtree
Defines the condition on which plugin will read/write specific variable.
key | value |
---|---|
when |
$-expression condition evalueated to boolean value |
read subtree
The read
subtree can have 2 definitions:
-
Just a name of descriptor to read or the list of descriptors names to read to file. In this case the name of NetCDF variable must be the same as the name of the descriptor and have the same type and no attributes will be read.
Configuration examples:
plugins: decl_netcdf: file: "file_name.nc" read: data_name #------------------------------------- plugins: decl_netcdf: file: "file_name.nc" read: [data_name_1, data_name_2]
-
Dictionary, with key as descriptor name and value as following subtree:
key | value |
---|---|
when |
read/write when subtree |
variable |
variable name to read (may be defined in variables subtree) |
variable_selection |
subtree |
Configuration example:
data:
int_submatrix_11:
type: array
subtype: int
size: [4, 4]
plugins:
decl_netcdf:
file: "file_name.nc"
variables:
integer_matrix:
type: array
subtype: int
size: [8, 8]
read:
int_submatrix_11:
when: $i < 10
variable: integer_matrix
variable_selection: # select bottom-left submatrix 4x4
start: [4, 4]
subsize: [4, 4]
Full yaml example
metadata:
var_attr: float
group1_attr: float
group1_data_attr: float
data:
int_submatrix_top:
type: array
subtype: int
size: [4, 8]
int_submatrix_bottom:
type: array
subtype: int
size: [4, 8]
plugins:
decl_netcdf:
- file: "example.nc"
on_event: "write"
groups:
group_1:
attributes:
some_attr: $group1_attr
group_1/data:
attributes:
some_attr: $group1_data_attr
variables:
group_1/data/int_matrix:
type: array
subtype: int
size: [8, 8]
dimensions: ["height", "width"]
attributes:
custom_attr: $var_attr
write:
int_submatrix_top:
variable: group_1/data/int_matrix
variable_selection:
start: [0, 0]
subsize: [4, 8]
int_submatrix_bottom:
variable: group_1/data/int_matrix
variable_selection:
start: [4, 0]
subsize: [4, 8]
- file: "example.nc"
on_event: "read"
groups:
group_1/data:
attributes:
some_attr: $custom_attr
variables:
group_1/data/int_matrix:
type: array
subtype: int
size: [8, 8]
dimensions: ["height", "width"]
attributes:
custom_attr: $var_attr
read:
int_submatrix_top:
variable: group_1/data/int_matrix
variable_selection:
start: [0, 0]
subsize: [4, 8]
int_submatrix_bottom:
variable: group_1/data/int_matrix
variable_selection:
start: [4, 0]
subsize: [4, 8]