/caaba/pycaaba/caabatools.py

https://gitlab.com/RolfSander/caaba-mecca
Python | 70 lines | 42 code | 10 blank | 18 comment | 18 complexity | 569a08abd9978d57da6af8abd6233017 MD5 | raw file
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*- Time-stamp: <2020-06-29 15:40:17 sander>
  3. # caabatools
  4. # Rolf Sander, 2018
  5. ##############################################################################
  6. import sys, os
  7. assert sys.version_info >= (3, 6)
  8. import re # regexp
  9. from netCDF4 import Dataset
  10. ##############################################################################
  11. # list all KPP species in spcfile
  12. def list_spc(spcfile):
  13. spclist = []
  14. regexp = re.compile('^[ \t]*([A-Za-z][A-Za-z0-9_#]*)[ \t]*=.*;')
  15. f = open(spcfile,'r')
  16. for line in f:
  17. result = regexp.search(line)
  18. if result:
  19. spclist.append(result.group(1))
  20. f.close()
  21. # for spc in spclist:
  22. # print spc
  23. return spclist
  24. ##############################################################################
  25. def split_caaba_mecca_nc(verbosity=1):
  26. with Dataset('caaba_mecca.nc', 'r') as ncid:
  27. if any('RR' in s[0:2] for s in ncid.variables):
  28. if (verbosity>0):
  29. print('\nSplitting caaba_mecca.nc into mixing ratios and reaction rates...')
  30. os.rename('caaba_mecca.nc', 'caaba_mecca-ori.nc')
  31. with Dataset('caaba_mecca-ori.nc', 'r') as ncid_in, \
  32. Dataset('caaba_mecca.nc', 'w', format='NETCDF3_CLASSIC') as ncid_out1, \
  33. Dataset('caaba_mecca_rr.nc', 'w', format='NETCDF3_CLASSIC') as ncid_out2:
  34. # copy global attributes all at once via dictionary:
  35. ncid_out1.setncatts(ncid_in.__dict__)
  36. ncid_out2.setncatts(ncid_in.__dict__)
  37. # copy dimensions:
  38. for name, dimension in list(ncid_in.dimensions.items()):
  39. ncid_out1.createDimension(
  40. name, (len(dimension) if not dimension.isunlimited() else None))
  41. ncid_out2.createDimension(
  42. name, (len(dimension) if not dimension.isunlimited() else None))
  43. for name, variable in list(ncid_in.variables.items()):
  44. # put mixing ratios and dimension variables into caaba_mecca.nc:
  45. if (name[0:2]!='RR' or name in ncid_in.dimensions):
  46. ncid_out1.createVariable(name, variable.datatype, variable.dimensions)
  47. ncid_out1[name][:] = ncid_in[name][:] # copy data
  48. ncid_out1[name].setncatts(ncid_in[name].__dict__) # copy attributes
  49. # put reaction rates and dimension variables into caaba_mecca_rr.nc:
  50. if (name[0:2]=='RR' or name in ncid_in.dimensions):
  51. ncid_out2.createVariable(name, variable.datatype, variable.dimensions)
  52. ncid_out2[name][:] = ncid_in[name][:] # copy data
  53. ncid_out2[name].setncatts(ncid_in[name].__dict__) # copy attributes
  54. os.remove('caaba_mecca-ori.nc')
  55. ##############################################################################
  56. if __name__ == '__main__':
  57. # only for testing
  58. #split_caaba_mecca_nc()
  59. #spclist = list_spc('mecca/gas.spc')
  60. pass