Skip to content

Instantly share code, notes, and snippets.

@uturuncoglu
Created November 9, 2022 19:37
Show Gist options
  • Save uturuncoglu/65bbebf5b11e943da823c045c7e3c3ef to your computer and use it in GitHub Desktop.
Save uturuncoglu/65bbebf5b11e943da823c045c7e3c3ef to your computer and use it in GitHub Desktop.
Calculates Ekman Transport related variables from RegCM output using Climate Data Tools for Matlab
% commands to use this script
% grid.txt:
% #
% # gridID 1
% #
% gridtype = lonlat
% gridsize = 129600
% datatype = float
% xsize = 360
% ysize = 360
% xname = lon
% xlongname = "longitude"
% xunits = "degrees_east"
% yname = lat
% ylongname = "latitude"
% yunits = "degrees_north"
% xfirst = 22.0
% xinc = 0.025
% yfirst = 33.0
% yinc = 0.025
% cdo remapbil,grid.txt EGE3_SRF.2004070100.nc EGE3_SRF.2004070100_rlatlon.nc
% matlab -nodisplay -r calc_ekman
% cdo remapbil,../../obs/ghrsst/roms_grid_rho.txt ekman.nc ekman_remap.nc
% read required variables
lat = ncread('EGE3_SRF.2004070100_rlatlon.nc', 'lat');
lon = ncread('EGE3_SRF.2004070100_rlatlon.nc', 'lon');
uas = ncread('EGE3_SRF.2004070100_rlatlon.nc', 'uas');
vas = ncread('EGE3_SRF.2004070100_rlatlon.nc', 'vas');
mask = ncread('EGE3_SRF.2004070100_rlatlon.nc', 'mask');
time = ncread('EGE3_SRF.2004070100_rlatlon.nc', 'time');
% calculate ekman transport
[lon2d, lat2d] = meshgrid(lon,lat);
[ue,ve,we,de] = ekman(lat2d,lon2d,uas,vas);
% write to netcdf file
% open file
if exist('ekman.nc', 'file') == 1
delete 'ekman.nc'
end
ncid = netcdf.create('ekman.nc','NOCLOBBER');
% define dimensions
lat_dimid = netcdf.defDim(ncid,'lat' ,length(lat));
lon_dimid = netcdf.defDim(ncid,'lon' ,length(lon));
time_dimid = netcdf.defDim(ncid,'time',length(time));
% define variables
lat_varid = netcdf.defVar(ncid,'lat','double',lat_dimid);
netcdf.putAtt(ncid,lat_varid,'long_name','latitude');
netcdf.putAtt(ncid,lat_varid,'units','degrees_north');
netcdf.putAtt(ncid,lat_varid,'axis','Y');
lon_varid = netcdf.defVar(ncid,'lon','double',lon_dimid);
netcdf.putAtt(ncid,lon_varid,'long_name','longitude');
netcdf.putAtt(ncid,lon_varid,'units','degrees_east');
netcdf.putAtt(ncid,lon_varid,'axis','X');
time_varid = netcdf.defVar(ncid,'time','double',time_dimid);
netcdf.putAtt(ncid,time_varid,'long_name','time');
netcdf.putAtt(ncid,time_varid,'standard_name','time');
netcdf.putAtt(ncid,time_varid,'units','hours since 1949-12-01 00:00:00 UTC');
netcdf.putAtt(ncid,time_varid,'calendar','gregorian');
netcdf.putAtt(ncid,time_varid,'axis','T');
mask_varid = netcdf.defVar(ncid,'mask','double',[lon_dimid,lat_dimid]);
netcdf.putAtt(ncid,mask_varid,'long_name','land-sea mask');
netcdf.putAtt(ncid,mask_varid,'units','1');
netcdf.putAtt(ncid,mask_varid,'coordinates','lat lon');
uas_varid = netcdf.defVar(ncid,'uas','double',[lon_dimid,lat_dimid,time_dimid]);
netcdf.putAtt(ncid,uas_varid,'long_name','zonal surface wind speed');
netcdf.putAtt(ncid,uas_varid,'units','m s-1');
netcdf.putAtt(ncid,uas_varid,'coordinates','lat lon');
vas_varid = netcdf.defVar(ncid,'vas','double',[lon_dimid,lat_dimid,time_dimid]);
netcdf.putAtt(ncid,vas_varid,'long_name','meridional surface wind speed');
netcdf.putAtt(ncid,vas_varid,'units','m s-1');
netcdf.putAtt(ncid,vas_varid,'coordinates','lat lon');
ue_varid = netcdf.defVar(ncid,'ue','double',[lon_dimid,lat_dimid,time_dimid]);
netcdf.putAtt(ncid,ue_varid,'long_name','zonal ekman layer transport');
netcdf.putAtt(ncid,ue_varid,'units','m2 s-1');
netcdf.putAtt(ncid,ue_varid,'coordinates','lat lon');
ve_varid = netcdf.defVar(ncid,'ve','double',[lon_dimid,lat_dimid,time_dimid]);
netcdf.putAtt(ncid,ve_varid,'long_name','meridional ekman layer transport');
netcdf.putAtt(ncid,ve_varid,'units','m2 s-1');
netcdf.putAtt(ncid,ve_varid,'coordinates','lat lon');
we_varid = netcdf.defVar(ncid,'we','double',[lon_dimid,lat_dimid,time_dimid]);
netcdf.putAtt(ncid,we_varid,'long_name','ekman pumping vertical velocity');
netcdf.putAtt(ncid,we_varid,'units','m s-1');
netcdf.putAtt(ncid,we_varid,'coordinates','lat lon');
de_varid = netcdf.defVar(ncid,'de','double',[lon_dimid,lat_dimid,time_dimid]);
netcdf.putAtt(ncid,de_varid,'long_name','ekman layer depth');
netcdf.putAtt(ncid,de_varid,'units','m');
netcdf.putAtt(ncid,de_varid,'coordinates','lat lon');
% exit define mode
netcdf.endDef(ncid);
% add data to variable
netcdf.putVar(ncid,lat_varid,lat);
netcdf.putVar(ncid,lon_varid,lon);
netcdf.putVar(ncid,time_varid,time);
netcdf.putVar(ncid,mask_varid,mask);
netcdf.putVar(ncid,uas_varid,uas(:,:,1,:));
netcdf.putVar(ncid,vas_varid,vas(:,:,1,:));
netcdf.putVar(ncid,ue_varid,ue(:,:,1,:));
netcdf.putVar(ncid,ve_varid,ve(:,:,1,:));
netcdf.putVar(ncid,we_varid,we(:,:,1,:));
netcdf.putVar(ncid,de_varid,de(:,:,1,:));
% close the netcdf
netcdf.close(ncid);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment