gafusion/omas

NetCDF Doesn't Support Logical/Boolean Variables so Saving Code Parameters Fails

Opened this issue · 3 comments

This problem has been around for a while and can be avoided by saving with HDF5 instead, but I'm opening this issue to document the limitation and see if anyone has ideas about whether other solutions could be possible.

NetCDF doesn't support any logical or boolean variable types so an error gets thrown when there's one in the code.parameters:

TypeError: illegal primitive data type, must be one of dict_keys(['S1', 'i1', 'u1', 'i2', 'u2', 'i4', 'u4', 'i8', 'u8', 'f4', 'f8']), got bool

It would be possible for OMAS to convert these to integers {0,1} before saving to the file, but there wouldn't be any way to know if an integer stored in NetCDF should be converted to a logical variable when read in, since code.parameters doesn't have any defined structure.

orso82 commented

Perhaps for those variables you could convert the booleans to integers, and then mark the conversion with an attribute (something like .setncattr('is_boolean', 'true')). Then of course, you'll have to take care of that when reading the file back into OMAS.

Note that in OMFIT we go through this rigamarole for exporting to netcdf - https://github.com/gafusion/OMFIT-source/blob/unstable/omfit/omfit_classes/omfit_data.py#L35 - then again when importing from netcdf - https://github.com/gafusion/OMFIT-source/blob/unstable/omfit/omfit_classes/omfit_data.py#L138 . Seems like an opportunity for generalizing the approach into a common set of utilities.

Stale issue message