mnc
A tool for Oceanographers and Meteorologists to easily create their NetCDF files using Matlab
Science Score: 67.0%
This score indicates how likely this project is to be science-related based on various indicators:
-
✓CITATION.cff file
Found CITATION.cff file -
✓codemeta.json file
Found codemeta.json file -
✓.zenodo.json file
Found .zenodo.json file -
✓DOI references
Found 3 DOI reference(s) in README -
✓Academic publication links
Links to: zenodo.org -
○Academic email domains
-
○Institutional organization owner
-
○JOSS paper metadata
-
○Scientific vocabulary similarity
Low similarity (4.2%) to scientific vocabulary
Repository
A tool for Oceanographers and Meteorologists to easily create their NetCDF files using Matlab
Basic Info
- Host: GitHub
- Owner: humbertolvarona
- License: mit
- Language: MATLAB
- Default Branch: main
- Size: 87.9 KB
Statistics
- Stars: 3
- Watchers: 1
- Forks: 0
- Open Issues: 0
- Releases: 1
Metadata Files
README.md
mNC
A tool for Oceanographers and Meteorologists to easily create their NetCDF files using Matlab
DOI
Creates mytest.nc file from one-dimensional arrays of longitude and latitude
lon = [-38.5, -38, -37.5, -37, -36.5, -36, -35.5];
lat = [-1.5, -1, -0.5, 0, 0.5, 1, 1.5];
matlab:
create_NC('mytest.nc', [-38.5:0.5:-35.5], [-1.5:0.5:1.5]);
bash:
ncdump -v lon,lat mytest.nc
Result:
netcdf mytest {
dimensions:
lon = 7 ;
lat = 7 ;
variables:
double lon(lon) ;
lon:standard_name = "logitude" ;
lon:long_name = "logitude" ;
lon:units = "degrees_east" ;
lon:axis = "X" ;
double lat(lat) ;
lat:standard_name = "latitude" ;
lat:long_name = "latitude" ;
lat:units = "degrees_north" ;
lat:axis = "Y" ;
// global attributes:
:creation_date = "13-Oct-2021 11:34:03" ;
:Producer = "null text" ;
:dataType = "2D Grid" ;
:Comment = "no comments" ;
data:
lon = -38.5, -38, -37.5, -37, -36.5, -36, -35.5 ;
lat = -1.5, -1, -0.5, 0, 0.5, 1, 1.5 ;
}
Creates mytest_2.nc file from two-dimensional arrays of longitude and latitude
matlab:
lons = [-38.5, -38, -37.5, -37, -36.5, -36, -35.5];
lats = [-1.5, -1, -0.5, 0, 0.5];
[LATS, LONS] = meshgrid(lats, lons);
createNC2DCoordinates('mytest_2.nc', LONS, LATS);
bash:
ncdump -v lon,lat mytest.nc
Result:
netcdf mytest_2 {
dimensions:
lon = 7 ;
lat = 5 ;
variables:
double lon(lat, lon) ;
lon:standard_name = "longitude" ;
lon:long_name = "longitude" ;
lon:units = "degrees_east" ;
lon:axis = "X" ;
double lat(lat, lon) ;
lat:standard_name = "latitude" ;
lat:long_name = "latitude" ;
lat:units = "degrees_north" ;
lat:axis = "Y" ;
// global attributes:
:creation_date = "13-Oct-2021 11:45:59" ;
:Producer = "null text" ;
:dataType = "2D Grid" ;
:Comment = "no comments" ;
data:
lon = -38.5, -38, -37.5, -37, -36.5, -36, -35.5, -38.5, -38, -37.5, -37, -36.5, -36, -35.5, -38.5, -38, -37.5, -37, -36.5, -36, -35.5, -38.5, -38, -37.5, -37, -36.5, -36, -35.5, -38.5, -38, -37.5, -37, -36.5, -36, -35.5 ;
lat = -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1, -1, -1, -1, -1, -1, -1, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 0, 0, 0, 0, 0, 0, 0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5 ;
}
Inserts a 2D variable in the file mytest_2.nc
Example: a bathymetry where the depth ranges between -100 and -1 m
matlab:
[nLon, nLat] = size(LONS);
BathymetryRange = [-100:-1];
Bath = rand(nLon,nLat) * range(BathymetryRange) + BathymetryRange(1);
insertvariable2DNC('mytest2.nc', Bath, 'z', 'Bathymetry', 'Shallow water bathymetry', 'm')
bash:
ncdump -v lon,lat mytest_2.nc
Result:
netcdf mytest_2 {
dimensions:
lon = 7 ;
lat = 5 ;
variables:
double lon(lat, lon) ;
lon:standard_name = "longitude" ;
lon:long_name = "longitude" ;
lon:units = "degrees_east" ;
lon:axis = "X" ;
double lat(lat, lon) ;
lat:standard_name = "latitude" ;
lat:long_name = "latitude" ;
lat:units = "degrees_north" ;
lat:axis = "Y" ;
double z(lat, lon) ;
z:standard_name = "Bathymetry" ;
z:long_name = "Shallow water bathymetry" ;
z:units = "m" ;
z:missing_value = NaN ;
z:FillValue = NaN ;
// global attributes:
:creation_date = "13-Oct-2021 11:45:59" ;
:Producer = "null text" ;
:dataType = "2D Grid" ;
:Comment = "no comments" ;
data:
z = -18.477674995598, -31.2119663253941, -68.6071514739748, -5.92801716500286, -96.589838030212, -56.5643083940166, -62.2257127477922, -24.2138379732488, -21.2752097874307, -81.4996121491165, -51.5133248169651, -55.886966129621, -36.0150119989848, -29.7728817450508, -25.2860184837463, -72.6735173771407, -32.7094349914862, -35.1452976065898, -83.9014382157316, -88.2192295257207, -50.6619588537678, -4.98534810690798, -66.3018130600528, -42.058492653002, -77.8426179903774, -25.6245611287404, -74.7455835695324, -49.9102518851509, -30.7914044569881, -11.8005779989559, -5.03014890466102, -45.8256625335835, -86.2761801599608, -85.2198934496533, -74.5066828417501 ;
}
Insert a three-dimensional static variable that is depth-dependent
BathymetryRange = [0, 10, 20, 30, 40, 50];
matlab:
BathymetryRange = [0:10:50];
TemperatureRange = [27:0.02:28];
[nLon, nLat] = size(LONS);
nDepth = length(BathymetryRange);
Temp = rand(nLon, nLat, nDepth) * range(TemperatureRange) + TemperatureRange(1);
% The depth values are inserted
insertdepthNC('mytest2.nc', BathymetryRange)
insertstaticvariable3DNC('mytest2.nc', Temp, 'pottemp', 'potential_temperature', 'Potential Temperature', '°C', 999.99)
bash:
ncdump -v depth,pottemp mytest_2.nc
Result:
netcdf mytest_2 {
dimensions:
lon = 7 ;
lat = 5 ;
depth = 6 ;
variables:
double lon(lat, lon) ;
lon:standard_name = "longitude" ;
lon:long_name = "longitude" ;
lon:units = "degrees_east" ;
lon:axis = "X" ;
double lat(lat, lon) ;
lat:standard_name = "latitude" ;
lat:long_name = "latitude" ;
lat:units = "degrees_north" ;
lat:axis = "Y" ;
double z(lat, lon) ;
z:standard_name = "Bathymetry" ;
z:long_name = "Shallow water bathymetry" ;
z:units = "m" ;
z:missing_value = NaN ;
z:FillValue = NaN ;
double depth(depth) ;
depth:standard_name = "Depth" ;
depth:long_name = "Vertical axis" ;
depth:units = "m" ;
depth:axis = "Z" ;
double pottemp(depth, lat, lon) ;
pottemp:standard_name = "potential_temperature" ;
pottemp:long_name = "Potential Temperature" ;
pottemp:units = "°C" ;
pottemp:missing_value = 999.99 ;
pottemp:FillValue = 999.99 ;
// global attributes:
:creation_date = "13-Oct-2021 11:45:59" ;
:Producer = "null text" ;
:dataType = "2D Grid" ;
:Comment = "no comments" ;
data:
depth = 0, 10, 20, 30, 40, 50 ;
pottemp = 27.8407172559837, 27.2542821789715, 27.8142848260688, 27.243524968725, 27.9292636231872, 27.3499837659848, 27.1965952504312, 27.251083857976, 27.6160446761466, 27.4732888489027, 27.351659507063,
...
...
...
27.3341630527375, 27.6987458323348, 27.1978098266859 ;
}
Insert a three-dimensional dynamic variable that is time-dependent
Time range = Daily data from '2001-05-03' to '1900-01-01'
(The '-' as a field separator in the date is mandatory)
Base time = '1900-01-01'
matlab:
% Daily mean
% Base time '1900-01-01'
timeRange = [datenum('2001-05-03'):datenum('2001-05-21')] - datenum('1900-01-01');
TemperatureRange = [27:0.02:28];
[nLon, nLat] = size(LONS);
nTime = length(timeRange);
Temp = rand(nLon, nLat, nTime) * range(TemperatureRange) + TemperatureRange(1);
inserttimeNC('mytest2.nc', timeRange, 'days since 1900-01-01');
insertdynamicvariable3DNC('mytest2.nc', Temp, 'temp', 'temperature', 'SST', '°C', 999.99)
bash:
ncdump -v temp,time -t mytest_2.nc
Result:
netcdf mytest_2 {
dimensions:
lon = 7 ;
lat = 5 ;
depth = 6 ;
time = UNLIMITED ; // (19 currently)
variables:
double lon(lat, lon) ;
lon:standard_name = "longitude" ;
lon:long_name = "longitude" ;
lon:units = "degrees_east" ;
lon:axis = "X" ;
double lat(lat, lon) ;
lat:standard_name = "latitude" ;
lat:long_name = "latitude" ;
lat:units = "degrees_north" ;
lat:axis = "Y" ;
double z(lat, lon) ;
z:standard_name = "Bathymetry" ;
z:long_name = "Shallow water bathymetry" ;
z:units = "m" ;
z:missing_value = NaN ;
z:FillValue = NaN ;
double depth(depth) ;
depth:standard_name = "Depth" ;
depth:long_name = "Vertical axis" ;
depth:units = "m" ;
depth:axis = "Z" ;
double pottemp(depth, lat, lon) ;
pottemp:standard_name = "potential_temperature" ;
pottemp:long_name = "Potential Temperature" ;
pottemp:units = "°C" ;
pottemp:missing_value = 999.99 ;
pottemp:FillValue = 999.99 ;
double time(time) ;
time:standard_name = "time" ;
time:long_name = "time" ;
time:units = "days since 1900-01-01" ;
time:calendar = "standard" ;
time:axis = "T" ;
double temp(time, lat, lon) ;
temp:standard_name = "temperature" ;
temp:long_name = "SST" ;
temp:units = "°C" ;
temp:missing_value = 999.99 ;
temp:FillValue = 999.99 ;
// global attributes:
:creation_date = "13-Oct-2021 13:46:11" ;
:Producer = "null text" ;
:dataType = "2D Grid" ;
:Comment = "no comments" ;
data:
time = "2001-05-03", "2001-05-04", "2001-05-05", "2001-05-06", "2001-05-07", "2001-05-08", "2001-05-09", "2001-05-10", "2001-05-11", "2001-05-12", "2001-05-13", "2001-05-14", "2001-05-15", "2001-05-16", "2001-05-17", "2001-05-18", "2001-05-19", "2001-05-20", "2001-05-21" ;
temp = 27.3130274882277, 27.0764394578121, 27.7914151469637, 27.3653839792903, 27.5850993892254, 27.1833367061834, 27.076918942246, 27.1536627665307, 27.826875990171, 27.3009567426333, 27.3838844900057,
...
...
...
27.3341630527375, 27.6987458323348, 27.1978098266859 ;
}
Inserting a depth and time dependent variable.
Functions insertdepthNC and inserttimeNC must be used previously.
matlab:
depthRange = [0:10:50];
timeRange = [datenum('2001-05-03'):datenum('2001-05-21')] - datenum('1900-01-01');
SaltRange = [35.5:0.1:36.5];
[nLon, nLat] = size(LONS);
nDepth = length(depthRange);
nTime = length(timeRange);
Salt = rand(nLon, nLat, nDepth, nTime) * range(SaltRange) + SaltRange(1);
insertdynamicvariable4DNC('mytest2.nc', Salt, 'salt', 'SSS', 'Sea Surface Salinity', 'psu', -999.0)
bash:
ncdump -v salt mytest_2.nc
Result:
netcdf mytest_2 {
dimensions:
lon = 7 ;
lat = 5 ;
depth = 6 ;
time = UNLIMITED ; // (19 currently)
variables:
...
...
...
double depth(depth) ;
depth:standard_name = "Depth" ;
depth:long_name = "Vertical axis" ;
depth:units = "m" ;
depth:axis = "Z" ;
double pottemp(depth, lat, lon) ;
pottemp:standard_name = "potential_temperature" ;
pottemp:long_name = "Potential Temperature" ;
pottemp:units = "°C" ;
pottemp:missing_value = 999.99 ;
pottemp:FillValue = 999.99 ;
double time(time) ;
time:standard_name = "time" ;
time:long_name = "time" ;
time:units = "days since 1900-01-01" ;
time:calendar = "standard" ;
time:axis = "T" ;
double temp(time, lat, lon) ;
temp:standard_name = "temperature" ;
temp:long_name = "SST" ;
temp:units = "°C" ;
temp:missing_value = 999.99 ;
temp:FillValue = 999.99 ;
double salt(time, depth, lat, lon) ;
salt:standard_name = "SSS" ;
salt:long_name = "Sea Surface Salinity" ;
salt:units = "psu" ;
salt:missing_value = -999. ;
salt:FillValue = -999. ;
// global attributes:
:creation_date = "13-Oct-2021 15:01:43" ;
:Producer = "null text" ;
:dataType = "2D Grid" ;
:Comment = "no comments" ;
}
Insert a time series
To insert a time series the functions inserttime_NC has to be used previously
matlab:
LHF_Range = [-150:10:-80];
timeRange = [datenum('2001-05-03'):datenum('2001-05-21')] - datenum('1900-01-01');
nTime = length(timeRange);
LHF = rand(1, nTime) * range(LHFRange) + LHFRange(1);
inserttimeserieNC('mytest2.nc', LHF, 'lhf', 'LHF', 'Latent Heat Flux', 'W/m^2', 1.e+20)
bash:
ncdump -v lhf mytest_2.nc
Result:
netcdf mytest_2 {
dimensions:
lon = 7 ;
lat = 5 ;
depth = 6 ;
time = UNLIMITED ; // (19 currently)
variables:
double lon(lat, lon) ;
lon:standard_name = "longitude" ;
lon:long_name = "longitude" ;
lon:units = "degrees_east" ;
lon:axis = "X" ;
double lat(lat, lon) ;
lat:standard_name = "latitude" ;
lat:long_name = "latitude" ;
lat:units = "degrees_north" ;
lat:axis = "Y" ;
double z(lat, lon) ;
z:standard_name = "Bathymetry" ;
z:long_name = "Shallow water bathymetry" ;
z:units = "m" ;
z:missing_value = NaN ;
z:FillValue = NaN ;
double depth(depth) ;
depth:standard_name = "Depth" ;
depth:long_name = "Vertical axis" ;
depth:units = "m" ;
depth:axis = "Z" ;
double pottemp(depth, lat, lon) ;
pottemp:standard_name = "potential_temperature" ;
pottemp:long_name = "Potential Temperature" ;
pottemp:units = "°C" ;
pottemp:missing_value = 999.99 ;
pottemp:FillValue = 999.99 ;
double time(time) ;
time:standard_name = "time" ;
time:long_name = "time" ;
time:units = "days since 1900-01-01" ;
time:calendar = "standard" ;
time:axis = "T" ;
double temp(time, lat, lon) ;
temp:standard_name = "temperature" ;
temp:long_name = "SST" ;
temp:units = "°C" ;
temp:missing_value = 999.99 ;
temp:FillValue = 999.99 ;
double salt(time, depth, lat, lon) ;
salt:standard_name = "SSS" ;
salt:long_name = "Sea Surface Salinity" ;
salt:units = "psu" ;
salt:missing_value = -999. ;
salt:FillValue = -999. ;
double lhf(time) ;
lhf:standard_name = "LHF" ;
lhf:long_name = "Latent Heat Flux" ;
lhf:units = "W/m^2" ;
lhf:missing_value = 1.e+20 ;
lhf:FillValue = 1.e+20 ;
// global attributes:
:creation_date = "13-Oct-2021 15:01:43" ;
:Producer = "null text" ;
:dataType = "2D Grid" ;
:Comment = "no comments" ;
data:
lhf = -125.379955123903, -123.719684788329, -129.544507133169, -126.458305049462, -91.5692549892492, -84.8326305071334, -103.772336089214, -93.9690344680875, -129.713354851269, -81.3917310092116, -84.5737397899491, -132.297764636527, -100.859013831388, -134.095709492856, -100.818057038615, -123.932837199952, -96.494980684739, -109.482836080872, -125.736495459038 ;
}
Create a NetCDF file with time series only
matlab:
timeRange = [datenum('2001-05-03'):datenum('2001-05-21')] - datenum('1900-01-01');
createtimeserieNC('mytest3.nc', timeRange, '1900-01-01')
SWR_Range = [180:10:250];
LWR_Range = [-100:10:-50];
nTime = length(timeRange);
SWR = rand(1, nTime) * range(SWRRange) + SWRRange(1);
LWR = rand(1, nTime) * range(LWRRange) + LWRRange(1);
inserttimeserieNC('mytest3.nc', SWR, 'swr', 'SWR', 'Short Wave Radiation', 'W/m^2', 1.e+20)
inserttimeserieNC('mytest3.nc', LWR, 'lwr', 'LWR', 'Long Wave Radiation', 'W/m^2', 1.e+20)
bash:
ncdump -v lwr,swr,time -t mytest_3.nc
Result:
netcdf mytest_3 {
dimensions:
time = UNLIMITED ; // (19 currently)
variables:
double time(time) ;
time:standard_name = "time" ;
time:long_name = "time" ;
time:units = "days since 1900-01-01" ;
time:calendar = "standard" ;
time:axis = "T" ;
double swr(time) ;
swr:standard_name = "SWR" ;
swr:long_name = "Short Wave Radiation" ;
swr:units = "W/m^2" ;
swr:missing_value = 1.e+20 ;
swr:FillValue = 1.e+20 ;
double lwr(time) ;
lwr:standard_name = "LWR" ;
lwr:long_name = "Long Wave Radiation" ;
lwr:units = "W/m^2" ;
lwr:missing_value = 1.e+20 ;
lwr:FillValue = 1.e+20 ;
// global attributes:
:creation_date = "13-Oct-2021 15:59:17" ;
:Producer = "null text" ;
:dataType = "Time series only" ;
:Comment = "no comments" ;
data:
time = "2001-05-03", "2001-05-04", "2001-05-05", "2001-05-06", "2001-05-07", "2001-05-08", "2001-05-09", "2001-05-10", "2001-05-11", "2001-05-12", "2001-05-13", "2001-05-14", "2001-05-15", "2001-05-16", "2001-05-17", "2001-05-18", "2001-05-19", "2001-05-20", "2001-05-21" ;
swr = 209.679376465332, 249.097068762438, 210.909769744377, 235.104545828219, 218.205895421282, 240.182234958772, 243.346623294593, 235.004205938925, 241.68268679656, 186.877429186821, 195.80290627705, 225.488124656128, 213.019894526324, 229.115843377746, 190.362983352515, 194.062437958129, 206.378626897567, 203.281329439278, 204.329633483502 ;
lwr = -69.3865225685708, -74.6937604966374, -87.2313991934547, -50.3519323423257, -73.3152709634012, -84.355922245511, -79.7881506368443, -60.5495796817233, -98.9336126754137, -94.0063895900241, -85.5835296256372, -54.8947746739663, -74.6499192070357, -54.4607958681041, -86.5101360896428, -58.297106644226, -68.9318597650484, -70.7001552939819, -68.9116708557565 ;
}
Note
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
The function insertlevelNC is equivalent to insertdepthNC, the function insertstaticvariable3DAtmosphereNC is equivalent to insertstaticvariable3DNC and the function insertdynamicvariable4DAtmosphereNC is equivalent to insertdynamicvariable4DNC, with the only difference that they write the "level" parameter instead of the "depth" parameter.
Owner
- Name: Humberto L. Varona
- Login: humbertolvarona
- Kind: user
- Location: Brazil
- Repositories: 2
- Profile: https://github.com/humbertolvarona
Citation (CITATION.cff)
cff-version: 1.2.0 message: "If you use this software, please cite it as below." authors: - family-names: "Varona" given-names: "Humberto L." orcid: "https://orcid.org/0000-0001-7405-4827" title: "mNC: A tool for Oceanographers and Meteorologists to easily create their NetCDF files using Matlab" version: 1.0 doi: 10.5281/zenodo.5572749 date-released: 2021-10-15 url: "https://doi.org/10.5281/zenodo.5572749"