From e28f8f5105c72073c0d4ec4b9f2b42ea22fa5fe1 Mon Sep 17 00:00:00 2001 From: Gildas Cambon <gildas.cambon@ird.fr> Date: Wed, 19 Mar 2025 16:44:23 +0100 Subject: [PATCH] Resolve #51 #57 #58 #59 #60 "issues with time unit attribute in inputs file for USE_CALENDAR" + Preprocessing/Bio + Nesting_tools + various things --- Aforc_ECMWF/make_bry_wkb_ECMWF.m | 12 +- Aforc_ERA5/ERA5_convert.py | 7 +- Aforc_ERA5/era5_crocotools_param.py | 8 +- Aforc_ERA5/interp_ERA5.m | 22 +- Aforc_ERA5/make_ERA5.m | 174 ++--- Aforc_ERA5/make_bry_wkb_ERA5.m | 14 +- CHANGELOG.md | 15 + Nesting_tools/create_nestedbulk.m | 20 +- Nesting_tools/create_nestedclim.m | 73 +- Nesting_tools/create_nesteddust.m | 50 +- Nesting_tools/create_nestedforcing.m | 45 +- Nesting_tools/create_nestedinitial.m | 23 +- Nesting_tools/create_nestedndepo.m | 113 ++++ Nesting_tools/interp_dust.m | 1 + Nesting_tools/nested_clim.m | 192 +++--- Nesting_tools/nested_dust.m | 4 + Nesting_tools/nested_ndepo.m | 118 ++++ Nesting_tools/nestgui.fig | Bin 43757 -> 48005 bytes Nesting_tools/plot_nestndepo.m | 83 +++ Oforc_OGCM/create_OGCM.m | 88 +-- Oforc_OGCM/make_OGCM_SODA.m | 222 +++--- Oforc_OGCM/make_OGCM_mercator.m | 635 +++++++++--------- Preprocessing_tools/Bio/add_bry_pisces.m | 347 +++++----- Preprocessing_tools/Bio/add_bry_pisces_Z.m | 347 ++++++---- Preprocessing_tools/Bio/add_dic.m | 122 ++-- Preprocessing_tools/Bio/add_doc.m | 120 ++-- Preprocessing_tools/Bio/add_don.m | 69 +- Preprocessing_tools/Bio/add_dop.m | 63 +- Preprocessing_tools/Bio/add_fer.m | 117 ++-- Preprocessing_tools/Bio/add_no3.m | 150 +++-- Preprocessing_tools/Bio/add_o2.m | 114 ++-- Preprocessing_tools/Bio/add_po4.m | 111 +-- Preprocessing_tools/Bio/add_sio3.m | 112 +-- Preprocessing_tools/Bio/add_talk.m | 119 ++-- Preprocessing_tools/Bio/make_biol.m | 137 ++-- Preprocessing_tools/Bio/make_bry_pisces.m | 152 ++--- Preprocessing_tools/Bio/make_clim_pisces.m | 178 ++--- Preprocessing_tools/Bio/make_dust.m | 22 +- Preprocessing_tools/Bio/make_ini_pisces.m | 3 +- Preprocessing_tools/Bio/make_n2o_bioebus.m | 317 --------- Preprocessing_tools/Bio/make_ndepo.m | 18 +- .../{ => npzd-bioebus}/add_Sphyto_Lphyto.m | 26 +- .../Bio/{ => npzd-bioebus}/add_Szoo_Lzoo.m | 26 +- .../Bio/{ => npzd-bioebus}/add_bry_bioebus.m | 47 +- .../{ => npzd-bioebus}/add_bry_bioebus_Z.m | 48 +- .../Bio/{ => npzd-bioebus}/add_bry_npzd.m | 45 +- .../Bio/{ => npzd-bioebus}/add_bry_npzd_Z.m | 39 +- .../Bio/{ => npzd-bioebus}/add_chla.m | 0 .../add_ini_Sphyto_Lphyto.m | 0 .../{ => npzd-bioebus}/add_ini_Szoo_Lzoo.m | 0 .../Bio/{ => npzd-bioebus}/add_ini_bioebus.m | 0 .../Bio/{ => npzd-bioebus}/add_ini_chla.m | 0 .../Bio/{ => npzd-bioebus}/add_ini_no3.m | 0 .../Bio/{ => npzd-bioebus}/add_ini_npzd.m | 0 .../Bio/{ => npzd-bioebus}/add_ini_o2.m | 0 .../Bio/{ => npzd-bioebus}/add_ini_phyto.m | 0 .../Bio/{ => npzd-bioebus}/add_ini_zoo.m | 0 .../Bio/{ => npzd-bioebus}/add_phyto.m | 19 +- .../Bio/{ => npzd-bioebus}/add_zoo.m | 20 +- .../Bio/{ => npzd-bioebus}/bry_interp_bgc.m | 0 .../bry_interp_bgc_chloro.m | 0 .../Bio/{ => npzd-bioebus}/make_bry_bioebus.m | 2 +- .../Bio/{ => npzd-bioebus}/make_bry_npzd.m | 4 +- .../{ => npzd-bioebus}/make_clim_bioebus.m | 0 .../Bio/{ => npzd-bioebus}/make_clim_npzd.m | 4 +- .../Bio/{ => npzd-bioebus}/make_ini_bioebus.m | 0 .../Bio/{ => npzd-bioebus}/make_ini_npzd.m | 0 .../Bio/npzd-bioebus/make_n2o_bioebus.m | 322 +++++++++ .../Bio/{ => npzd-bioebus}/nevis_2003.m | 0 .../Bio/{ => npzd-bioebus}/vinterp_bry_bgc.m | 1 - Preprocessing_tools/create_bry_Z.m | 18 +- Preprocessing_tools/create_bryfile.m | 104 ++- Preprocessing_tools/create_bryfile_wkb.m | 31 +- Preprocessing_tools/create_bulk.m | 21 +- Preprocessing_tools/create_climfile.m | 190 +++--- Preprocessing_tools/create_forcing.m | 51 +- Preprocessing_tools/create_inifile.m | 35 +- Preprocessing_tools/create_oafile.m | 54 +- Preprocessing_tools/get_time_attributes.m | 29 + Preprocessing_tools/make_bry.m | 8 +- Preprocessing_tools/make_clim.m | 46 +- Preprocessing_tools/nc_add_globatt.m | 4 +- Preprocessing_tools/vinterp_bry.m | 64 +- Preprocessing_tools/write_time_attributes.m | 29 + Rivers/create_runoff.m | 53 +- Rivers/make_runoff.m | 6 +- crocotools_param.m | 3 + oct_start.m | 1 + start.m | 1 + 89 files changed, 3318 insertions(+), 2570 deletions(-) create mode 100644 Nesting_tools/create_nestedndepo.m create mode 100644 Nesting_tools/nested_ndepo.m create mode 100644 Nesting_tools/plot_nestndepo.m delete mode 100644 Preprocessing_tools/Bio/make_n2o_bioebus.m rename Preprocessing_tools/Bio/{ => npzd-bioebus}/add_Sphyto_Lphyto.m (85%) rename Preprocessing_tools/Bio/{ => npzd-bioebus}/add_Szoo_Lzoo.m (84%) rename Preprocessing_tools/Bio/{ => npzd-bioebus}/add_bry_bioebus.m (92%) rename Preprocessing_tools/Bio/{ => npzd-bioebus}/add_bry_bioebus_Z.m (91%) rename Preprocessing_tools/Bio/{ => npzd-bioebus}/add_bry_npzd.m (90%) rename Preprocessing_tools/Bio/{ => npzd-bioebus}/add_bry_npzd_Z.m (91%) rename Preprocessing_tools/Bio/{ => npzd-bioebus}/add_chla.m (100%) rename Preprocessing_tools/Bio/{ => npzd-bioebus}/add_ini_Sphyto_Lphyto.m (100%) rename Preprocessing_tools/Bio/{ => npzd-bioebus}/add_ini_Szoo_Lzoo.m (100%) rename Preprocessing_tools/Bio/{ => npzd-bioebus}/add_ini_bioebus.m (100%) rename Preprocessing_tools/Bio/{ => npzd-bioebus}/add_ini_chla.m (100%) rename Preprocessing_tools/Bio/{ => npzd-bioebus}/add_ini_no3.m (100%) rename Preprocessing_tools/Bio/{ => npzd-bioebus}/add_ini_npzd.m (100%) rename Preprocessing_tools/Bio/{ => npzd-bioebus}/add_ini_o2.m (100%) rename Preprocessing_tools/Bio/{ => npzd-bioebus}/add_ini_phyto.m (100%) rename Preprocessing_tools/Bio/{ => npzd-bioebus}/add_ini_zoo.m (100%) rename Preprocessing_tools/Bio/{ => npzd-bioebus}/add_phyto.m (85%) rename Preprocessing_tools/Bio/{ => npzd-bioebus}/add_zoo.m (85%) rename Preprocessing_tools/Bio/{ => npzd-bioebus}/bry_interp_bgc.m (100%) rename Preprocessing_tools/Bio/{ => npzd-bioebus}/bry_interp_bgc_chloro.m (100%) rename Preprocessing_tools/Bio/{ => npzd-bioebus}/make_bry_bioebus.m (99%) rename Preprocessing_tools/Bio/{ => npzd-bioebus}/make_bry_npzd.m (98%) rename Preprocessing_tools/Bio/{ => npzd-bioebus}/make_clim_bioebus.m (100%) rename Preprocessing_tools/Bio/{ => npzd-bioebus}/make_clim_npzd.m (97%) rename Preprocessing_tools/Bio/{ => npzd-bioebus}/make_ini_bioebus.m (100%) rename Preprocessing_tools/Bio/{ => npzd-bioebus}/make_ini_npzd.m (100%) create mode 100644 Preprocessing_tools/Bio/npzd-bioebus/make_n2o_bioebus.m rename Preprocessing_tools/Bio/{ => npzd-bioebus}/nevis_2003.m (100%) rename Preprocessing_tools/Bio/{ => npzd-bioebus}/vinterp_bry_bgc.m (98%) create mode 100644 Preprocessing_tools/get_time_attributes.m create mode 100644 Preprocessing_tools/write_time_attributes.m diff --git a/Aforc_ECMWF/make_bry_wkb_ECMWF.m b/Aforc_ECMWF/make_bry_wkb_ECMWF.m index 6793a878..ddae7b73 100644 --- a/Aforc_ECMWF/make_bry_wkb_ECMWF.m +++ b/Aforc_ECMWF/make_bry_wkb_ECMWF.m @@ -75,6 +75,10 @@ result=close(nc); grid_angle=mean(mean(angle(mask==1))); [M L]=size(h); % +wkb_prefix=[wkb_prefix,'_ECMWF_']; +frc_prefix=[frc_prefix,'_ECMWF_']; +% +% % Loop over monthly files % for Y=Ymin:Ymax @@ -92,20 +96,18 @@ for Y=Ymin:Ymax % % Forcing file name % - frc_prefix=[frc_prefix,'_ECMWF_']; if level==0 nc_suffix='.nc'; else nc_suffix=['.nc.',num2str(level)]; end frcname=[frc_prefix,'Y',num2str(Y),... - 'M',num2str(M),nc_suffix]; + 'M',num2str(sprintf(Mth_format,M)),nc_suffix]; % % WKB file name % - wkb_prefix=[wkb_prefix,'_ECMWF_']; brywkbname=[wkb_prefix,'Y',num2str(Y),... - 'M',num2str(M),nc_suffix]; + 'M',num2str(sprintf(Mth_format,M)),nc_suffix]; disp(' ') disp([' Making file: ',brywkbname]) disp([' from: ',frcname]) @@ -125,7 +127,7 @@ for Y=Ymin:Ymax % Create the boundary file % create_bryfile_wkb(brywkbname,grdname,CROCO_title,wkb_obc,... - wkb_time,wkb_cycle,'clobber'); + wkb_time,wkb_cycle,'clobber',Yorig); disp(' ') % % diff --git a/Aforc_ERA5/ERA5_convert.py b/Aforc_ERA5/ERA5_convert.py index 76def899..d3a7ff72 100755 --- a/Aforc_ERA5/ERA5_convert.py +++ b/Aforc_ERA5/ERA5_convert.py @@ -95,7 +95,7 @@ for iyear in range(year_start,year_end+1): data[np.where(data==mvalue)]=9999. # -# Convert time from seconds since 1970-1-1 0:0:0 into days since Yorig-1-1 0:0:0 +# Convert time from seconds since 1970-1-1 0:0:0 into days since Yorig-01-01 00:00:00 # time = time / 86400. @@ -115,7 +115,7 @@ for iyear in range(year_start,year_end+1): # Create and write output netcdf file # - fname_out = era5_dir_processed + '/' + vname.upper() + '_Y' + str(iyear) + 'M' + str(imonth) + '.nc' + fname_out = era5_dir_processed + '/' + vname.upper() + '_Y' + str(iyear) + 'M' + str(imonth).zfill(2) + '.nc' nw = netcdf(fname_out,mode='w',format='NETCDF4') @@ -132,7 +132,8 @@ for iyear in range(year_start,year_end+1): vartime.long_name = 'Time' varlon.units = 'degree_east' varlat.units = 'degree_north' - vartime.units = 'days since '+str(Yorig)+'-1-1' + vartime.units = 'days since '+str(Yorig)+'-01-01 00:00:00' + vartime.calendar = 'proleptic_gregorian' vardata.missing_value = 9999. vardata.units = units[k] vardata.long_name = vlong diff --git a/Aforc_ERA5/era5_crocotools_param.py b/Aforc_ERA5/era5_crocotools_param.py index fd3630ea..a6872712 100644 --- a/Aforc_ERA5/era5_crocotools_param.py +++ b/Aforc_ERA5/era5_crocotools_param.py @@ -21,14 +21,15 @@ era5_dir_processed = config_dir + 'DATA/ERA5_' + config_name # # extraction wave variables # -wave_extract=False # True to extract wave variables +#wave_extract=False # True to extract wave variables +wave_extract=True # True to extract wave variables # # Dates limits # year_start = 2005 month_start = 1 year_end = 2005 -month_end = 3 +month_end = 4 # # Year origin of time # @@ -40,7 +41,8 @@ n_overlap = 0 # # Request time (daily hours '00/01/.../23') # -time = '00/01/02/03/04/05/06/07/08/09/10/11/12/13/14/15/16/17/18/19/20/21/22/23' +time = '00/06/12/18' +#time = '00/01/02/03/04/05/06/07/08/09/10/11/12/13/14/15/16/17/18/19/20/21/22/23' # # Request variables (see available at ERA5_variables.json) variables = ['lsm','tp','strd','ssr','t2m','q','u10','v10'] #note lsm is land_sea_mask diff --git a/Aforc_ERA5/interp_ERA5.m b/Aforc_ERA5/interp_ERA5.m index 0c1364e5..568175a1 100644 --- a/Aforc_ERA5/interp_ERA5.m +++ b/Aforc_ERA5/interp_ERA5.m @@ -1,6 +1,6 @@ function interp_ERA5(ATMO_dir,Y,M,Roa,interp_method,... lon1,lat1,lonwave1,latwave1,mask1,maskwave1,maskwave2,tin,... - nc_frc, nc_blk,lon,lat,angle,tout, add_waves) + nc_frc, nc_blk,lon,lat,angle,tout, add_waves) % % Read the local ERA5 files and perform the space interpolations % @@ -12,7 +12,7 @@ function interp_ERA5(ATMO_dir,Y,M,Roa,interp_method,... % 1: Air temperature: Convert from Kelvin to Celsius % vname='T2M'; -nc=netcdf([ATMO_dir,vname,'_Y',num2str(Y),'M',num2str(M),'.nc'],'r'); +nc=netcdf([ATMO_dir,vname,'_Y',num2str(Y),'M',num2str(sprintf('%02d',M)),'.nc'],'r'); tair=squeeze(nc{vname}(tin,:,:)); close(nc); tair=get_missing_val(lon1,lat1,mask1.*tair,nan,Roa,nan); @@ -25,7 +25,7 @@ tair=interp2(lon1,lat1,tair,lon,lat,interp_method); % Get Specific Humidity [Kg/Kg] % vname='Q'; -nc=netcdf([ATMO_dir,vname,'_Y',num2str(Y),'M',num2str(M),'.nc'],'r'); +nc=netcdf([ATMO_dir,vname,'_Y',num2str(Y),'M',num2str(sprintf('%02d',M)),'.nc'],'r'); shum=squeeze(nc{vname}(tin,:,:)); close(nc); shum=get_missing_val(lon1,lat1,mask1.*shum,nan,Roa,nan); @@ -40,7 +40,7 @@ rhum=shum./qsat(tair); % 3: Precipitation rate: Convert from [kg/m^2/s] to cm/day % vname='TP'; -nc=netcdf([ATMO_dir,vname,'_Y',num2str(Y),'M',num2str(M),'.nc'],'r'); +nc=netcdf([ATMO_dir,vname,'_Y',num2str(Y),'M',num2str(sprintf('%02d',M)),'.nc'],'r'); prate=squeeze(nc{vname}(tin,:,:)); close(nc); prate=get_missing_val(lon1,lat1,mask1.*prate,nan,Roa,nan); @@ -54,7 +54,7 @@ prate(prate<1.e-4)=0; % Solar shortwave % vname='SSR'; -nc=netcdf([ATMO_dir,vname,'_Y',num2str(Y),'M',num2str(M),'.nc'],'r'); +nc=netcdf([ATMO_dir,vname,'_Y',num2str(Y),'M',num2str(sprintf('%02d',M)),'.nc'],'r'); dswrf=squeeze(nc{vname}(tin,:,:)); close(nc); radsw=get_missing_val(lon1,lat1,mask1.*dswrf,nan,Roa,nan); @@ -77,7 +77,7 @@ radsw(radsw<1.e-10)=0; % 5.2 get the downward longwave flux [W/m^2] % vname='STRD'; -nc=netcdf([ATMO_dir,vname,'_Y',num2str(Y),'M',num2str(M),'.nc'],'r'); +nc=netcdf([ATMO_dir,vname,'_Y',num2str(Y),'M',num2str(sprintf('%02d',M)),'.nc'],'r'); dlwrf_in=squeeze(nc{vname}(tin,:,:)); close(nc); radlw_in=get_missing_val(lon1,lat1,mask1.*dlwrf_in,nan,Roa,nan); @@ -87,7 +87,7 @@ radlw_in=interp2(lon1,lat1,radlw_in,lon,lat,interp_method); % 6: Wind [m/s] % vname='U10M'; -nc=netcdf([ATMO_dir,vname,'_Y',num2str(Y),'M',num2str(M),'.nc'],'r'); +nc=netcdf([ATMO_dir,vname,'_Y',num2str(Y),'M',num2str(sprintf('%02d',M)),'.nc'],'r'); uwnd=squeeze(nc{vname}(tin,:,:)); close(nc) uwnd=get_missing_val(lon1,lat1,mask1.*uwnd,nan,Roa,nan); @@ -95,7 +95,7 @@ uwnd=interp2(lon1,lat1,uwnd,lon,lat,interp_method); % % vname='V10M'; -nc=netcdf([ATMO_dir,vname,'_Y',num2str(Y),'M',num2str(M),'.nc'],'r'); +nc=netcdf([ATMO_dir,vname,'_Y',num2str(Y),'M',num2str(sprintf('%02d',M)),'.nc'],'r'); vwnd=squeeze(nc{vname}(tin,:,:)); close(nc) vwnd=get_missing_val(lon1,lat1,mask1.*vwnd,nan,Roa,nan); @@ -149,7 +149,7 @@ if add_waves == 1 % 8: Surface wave amplitude: convert from SWH to Amp % vname='SWH'; - nc=netcdf([ATMO_dir,vname,'_Y',num2str(Y),'M',num2str(M),'.nc'],'r'); + nc=netcdf([ATMO_dir,vname,'_Y',num2str(Y),'M',num2str(sprintf('%02d',M)),'.nc'],'r'); awave=1/(2*sqrt(2))*squeeze(nc{vname}(tin,:,:)); close(nc); %[ATMO_DIR,vname,'_Y',num2str(Y),'M',num2str(M),'.nc'] @@ -159,7 +159,7 @@ if add_waves == 1 % 9: Surface wave direction % vname='MWD'; - nc=netcdf([ATMO_dir,vname,'_Y',num2str(Y),'M',num2str(M),'.nc'],'r'); + nc=netcdf([ATMO_dir,vname,'_Y',num2str(Y),'M',num2str(sprintf('%02d',M)),'.nc'],'r'); dwave=squeeze(nc{vname}(tin,:,:)); close(nc); dwave=get_missing_val(lonwave1,latwave1,maskwave1.*dwave,nan,Roa,nan); @@ -168,7 +168,7 @@ if add_waves == 1 % 10: Surface wave peak period % vname='PP1D'; - nc=netcdf([ATMO_dir,vname,'_Y',num2str(Y),'M',num2str(M),'.nc'],'r'); + nc=netcdf([ATMO_dir,vname,'_Y',num2str(Y),'M',num2str(sprintf('%02d',M)),'.nc'],'r'); pwave=squeeze(nc{vname}(tin,:,:)); close(nc); pwave=get_missing_val(lonwave1,latwave1,maskwave2.*pwave,nan,Roa,nan); diff --git a/Aforc_ERA5/make_ERA5.m b/Aforc_ERA5/make_ERA5.m index faee3873..b5d4c25b 100644 --- a/Aforc_ERA5/make_ERA5.m +++ b/Aforc_ERA5/make_ERA5.m @@ -1,13 +1,13 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % make_ERA5.m -% +% % Create and fill frc and bulk files with ERA5 data. % (ERA-5 Reanalysis) -% -% Further Information: +% +% Further Information: % http://www.croco-ocean.org -% +% % This file is part of CROCOTOOLS % % CROCOTOOLS is free software; you can redistribute it and/or modify @@ -25,7 +25,7 @@ % Foundation, Inc., 59 Temple Place, Suite 330, Boston, % MA 02111-1307 USA % -% Updated D. Donoso, G. Cambon. P. Penven (Oct 2021) +% Updated D. Donoso, G. Cambon. P. Penven (Oct 2021) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% clear all close all @@ -33,8 +33,8 @@ close all % % Common parameters % -crocotools_param -isoctave=exist('octave_config_info'); +crocotools_param +isoctave=exist('octave_config_info'); frc_prefix=[frc_prefix,'_ERA5_']; blk_prefix=[blk_prefix,'_ERA5_']; % @@ -68,8 +68,8 @@ close(nc); % % Get the ERA5 horizontal grids (it should be the same for every month) % -nc=netcdf([ERA5_dir,'LSM_Y',num2str(Ymin),'M',num2str(Mmin),'.nc'],'r'); -disp(['Use this land file :',char([ERA5_dir,'LSM_Y',num2str(Ymin),'M',num2str(Mmin),'.nc'])]) +nc=netcdf([ERA5_dir,'LSM_Y',num2str(Ymin),'M',num2str(sprintf(Mth_format,Mmin)),'.nc'],'r'); +disp(['Use this land file :',char([ERA5_dir,'LSM_Y',num2str(Ymin),'M',num2str(sprintf(Mth_format,Mmin)),'.nc'])]) lon1=nc{'lon'}(:); lat1=nc{'lat'}(:); @@ -85,10 +85,10 @@ close(nc); if add_waves == 1 % % get horizontal grid for ocean waves - % for ERA5 wave variables, resolution change to 0.5° instead of 0.25° + % for ERA5 wave variables, resolution change to 0.5° instead of 0.25° % for the atmo variable (0.25° x 0.25° (atmosphere) vs 0.5° x 0.5° (ocean waves)) % - filein=[ERA5_dir,'SWH_Y',num2str(Ymin),'M',num2str(Mmin),'.nc']; + filein=[ERA5_dir,'SWH_Y',num2str(Ymin),'M',num2str(sprintf(Mth_format,Mmin)),'.nc']; nc=netcdf(filein,'r'); lonwave=nc{'lon'}(:); latwave=nc{'lat'}(:); @@ -100,7 +100,7 @@ if add_waves == 1 close(nc); % fix: PP1D doesn t have the same mask than SWH - filein2=[ERA5_dir,'PP1D_Y',num2str(Ymin),'M',num2str(Mmin),'.nc']; + filein2=[ERA5_dir,'PP1D_Y',num2str(Ymin),'M',num2str(sprintf(Mth_format,Mmin)),'.nc']; nc=netcdf(filein2); maskwave2=squeeze(nc{'PP1D'}(1,:,:)); missvalue_wave2 = ncreadatt(filein2,'PP1D','missing_value'); @@ -126,7 +126,7 @@ disp(['Loop on the years and the months']) % for Y=Ymin:Ymax - if Y==Ymin + if Y==Ymin mo_min=Mmin; else mo_min=1; @@ -139,14 +139,14 @@ for Y=Ymin:Ymax for M=mo_min:mo_max disp(' ') disp(['Processing year ',num2str(Y),... - ' - month ',num2str(M)]) + ' - month ',num2str(sprintf(Mth_format,M))]) disp(' ') %-------------------------------------------------------------------% % % Process time (here in days), with SST file (minimum time step) % %-------------------------------------------------------------------% - nc=netcdf([ERA5_dir,'T2M_Y',num2str(Y),'M',num2str(M),'.nc'],'r'); + nc=netcdf([ERA5_dir,'T2M_Y',num2str(Y),'M',num2str(sprintf(Mth_format,M)),'.nc'],'r'); ERA5_time=nc{'time'}(:); close(nc); dt=mean(gradient(ERA5_time)); @@ -160,9 +160,9 @@ for Y=Ymin:Ymax itolap=freq*itolap_era5; tlen=tlen0+2*itolap; disp(['tlen=',num2str(tlen)]) - disp(['Overlap is ',num2str(itolap_era5),' records before and after']) + disp(['Overlap is ',num2str(itolap_era5),' records before and after']) time=0*(1:tlen); - time(itolap+1:tlen0+itolap)=ERA5_time; + time(itolap+1:tlen0+itolap)=ERA5_time; disp(['=====================']) disp('Compute time for croco file') disp(['=====================']) @@ -178,59 +178,61 @@ for Y=Ymin:Ymax % % ------------------------------------------------------------------% % - disp(['=====================']) + disp(['=====================']) disp('Create the frc/blk netcdf file') disp(['=====================']) blkname=[blk_prefix,'Y',num2str(Y),... - 'M',num2str(sprintf(Mth_format,M)),nc_suffix]; + 'M',num2str(sprintf(Mth_format,M)),nc_suffix]; frcname=[frc_prefix,'Y',num2str(Y),... - 'M',num2str(sprintf(Mth_format,M)),nc_suffix]; + 'M',num2str(sprintf(Mth_format,M)),nc_suffix]; if makeblk==1 - disp(['Create a new bulk file: ' blkname]) - create_bulk(blkname,grdname,CROCO_title,time,0); - nc_add_globatt(blkname,Yorig,Mmin,Dmin,Hmin,Min_min,Smin,'ERA5'); - disp([' ']) + disp(['Create a new bulk file: ' blkname]) + create_bulk(blkname,grdname,CROCO_title,time,0,Yorig); + nc_add_globatt(blkname,Yorig,Mmin,Dmin,Hmin,Min_min,Smin,'ERA5'); + disp([' ']) end if makefrc==1 - disp(['Create a new forcing file: ' frcname]) - disp([' ']) - create_forcing(frcname,grdname,CROCO_title,... - time,0,0,... - 0,0,0,... - 0,0,0,0,0,0) + disp(['Create a new forcing file: ' frcname]) + disp([' ']) + create_forcing(frcname,grdname,CROCO_title,... + time,0,0,... + 0,0,0,... + 0,0,0,0,0,0,Yorig) end % % % % Add the waves % % - if makefrc==1 && add_waves==1 - disp(['Add waves data']) - disp(['==============']) + if makefrc==1 && add_waves==1 + disp(['-> Add waves data previously downloaded']) + disp([' using Aforc_ERA5/ERA5_request.py']) end - % % + % % % % % % Add the tides % % if makefrc==1 && add_tides==1 - pot_tides=1; - add_tidal_data(tidename,grdname,frcname,Ntides,tidalrank,... + disp([' ']) + disp(['-> Add tidal data']) + pot_tides=1; + add_tidal_data(tidename,grdname,frcname,Ntides,tidalrank,... Yorig,Y,M,coastfileplot,makeplot,pot_tides) end % % % Open the CROCO forcing files if makefrc==1 - nc_frc=netcdf(frcname,'write'); + nc_frc=netcdf(frcname,'write'); else - nc_frc=[]; + nc_frc=[]; end - % Open the CROCO bulk files + % Open the CROCO bulk files if makeblk==1 - nc_blk=netcdf(blkname,'write'); + nc_blk=netcdf(blkname,'write'); else - nc_blk=[]; + nc_blk=[]; end - % + % % Check if there are ERA5 files for the previous Month Mm=M-1; Ym=Y; @@ -239,12 +241,12 @@ for Y=Ymin:Ymax Ym=Y-1; end % - fname = [ERA5_dir,'TP_Y',num2str(Ym),'M',num2str(Mm),'.nc']; + fname = [ERA5_dir,'TP_Y',num2str(Ym),'M',num2str(sprintf(Mth_format,Mm)),'.nc']; %nc=netcdf([ERA5_dir,'TP_Y',num2str(Ym),'M',num2str(Mm),'.nc']); % disp(' ') disp('======================================================') - disp('Perform interpolations for the previous month') + disp('Perform interpolations for the previous month') disp('======================================================') disp(' ') if exist(fname)==0 @@ -256,16 +258,16 @@ for Y=Ymin:Ymax nc=netcdf(fname,'r'); tndx=length(nc('time')); if makefrc==1 - for aa=1:itolap - nc_frc{'sms_time'}(aa)=nc{'time'}(tndx-(itolap-aa)); - end + for aa=1:itolap + nc_frc{'sms_time'}(aa)=nc{'time'}(tndx-(itolap-aa)); + end end % - if makeblk==1 - for aa=1:itolap - nc_blk{'bulk_time'}(aa)=nc{'time'}(tndx-(itolap-aa)); - end - end + if makeblk==1 + for aa=1:itolap + nc_blk{'bulk_time'}(aa)=nc{'time'}(tndx-(itolap-aa)); + end + end close(nc) end % @@ -279,29 +281,29 @@ for Y=Ymin:Ymax end interp_ERA5(ERA5_dir,Ym,Mm,Roa,interp_method,lon1,lat1,lon1wave,lat1wave, ... mask,maskwave,maskwave2,aa0,nc_frc,nc_blk,lon,lat,angle,aa,add_waves) - end - %###################################################################### - % + end + %###################################################################### + % disp(' ') disp('======================================================') disp('Perform interpolations for the current month') disp('======================================================') disp(' ') - + % Perform interpolations for the current month % - + for tndx=1:tlen0 if mod(tndx,6)==0 disp(['Step: ',num2str(tndx),' of ',num2str(tlen0)]) end interp_ERA5(ERA5_dir,Y,M,Roa,interp_method,lon1,lat1,lon1wave,lat1wave,... - mask,maskwave,maskwave2,tndx,nc_frc,nc_blk,lon,lat,angle,tndx+itolap,add_waves) + mask,maskwave,maskwave2,tndx,nc_frc,nc_blk,lon,lat,angle,tndx+itolap,add_waves) end - - disp(' ') + + disp(' ') disp('======================================================') - disp('Perform interpolations for next month') + disp('Perform interpolations for next month') disp('======================================================') disp(' ') %###################################################################### @@ -313,9 +315,9 @@ for Y=Ymin:Ymax Mp=1; Yp=Y+1; end - + fname=[ERA5_dir,'TP_Y',num2str(Yp),'M',num2str(Mp),'.nc']; - + if exist(fname)==0 disp(['No data for the next month: using current month']) tndx=tlen0; @@ -325,18 +327,18 @@ for Y=Ymin:Ymax nc=netcdf(fname,'r'); if makefrc==1 - disp('sms_time') - for tndx=tlen0+itolap+1:tlen; - nc_frc{'sms_time'}(tndx)=nc{'time'}(tndx-tlen0-(itolap)); - end; + disp('sms_time') + for tndx=tlen0+itolap+1:tlen; + nc_frc{'sms_time'}(tndx)=nc{'time'}(tndx-tlen0-(itolap)); + end; end - if makeblk==1 - disp('bulk_time') - for tndx=tlen0+itolap+1:tlen; - nc_blk{'bulk_time'}(tndx)=nc{'time'}(tndx-tlen0-(itolap)); - end - end + if makeblk==1 + disp('bulk_time') + for tndx=tlen0+itolap+1:tlen; + nc_blk{'bulk_time'}(tndx)=nc{'time'}(tndx-tlen0-(itolap)); + end + end close(nc) end % @@ -349,23 +351,23 @@ for Y=Ymin:Ymax disp(['tout=tndx ',num2str(tndx)]) if Mp==M %tin=tlen0; % persistency if current month is used - tin=tndx-2*itolap + tin=tndx-2*itolap; disp(['tin=',num2str(tin)]) else tin=tndx-tlen0-itolap; disp(['tin=',num2str(tin)]) end interp_ERA5(ERA5_dir,Yp,Mp,Roa,interp_method,lon1,lat1,lon1wave,lat1wave,... - mask,maskwave,maskwave2,tin,nc_frc,nc_blk,lon,lat,angle,tout,add_waves) + mask,maskwave,maskwave2,tin,nc_frc,nc_blk,lon,lat,angle,tout,add_waves) end; % % Close the CROCO forcing files % if ~isempty(nc_frc) - close(nc_frc); + close(nc_frc); end if ~isempty(nc_blk) - close(nc_blk); + close(nc_blk); end end end @@ -375,13 +377,13 @@ end % disp('======================================================') if SPIN_Long>0 -disp('Add spin up phase') + disp('Add spin up phase') M=Mmin-1; Y=Ymin-SPIN_Long; for month=1:12*SPIN_Long M=M+1; if M==13 - M=1; + M=1; Y=Y+1; end % @@ -392,22 +394,22 @@ disp('Add spin up phase') % blkname=[blk_prefix,'Y',num2str(Ymin),'M',num2str(sprintf(Mth_format,M)),nc_suffix]; blkname2=[blk_prefix,'Y',num2str(Y),'M',num2str(sprintf(Mth_format,M)),nc_suffix]; - disp(['Create ',blkname2]) + disp(['Create ',blkname2]) if (isoctave == 0) eval(['!cp ',blkname,' ',blkname2]) else system(['cp ',blkname,' ',blkname2]) - end + end % % Change the time % nc=netcdf(blkname2,'write'); time=nc{'bulk_time'}(:)-365.*(Ymin-Y);%+datenum(Yorig,1,1); - %[y,m,d,h,mi,s]=datevec(time); - %dy=Ymin-Y; - %y=y-dy; - %time=datenum(y,m,d,h,mi,s)-datenum(Yorig,1,1); + %[y,m,d,h,mi,s]=datevec(time); + %dy=Ymin-Y; + %y=y-dy; + %time=datenum(y,m,d,h,mi,s)-datenum(Yorig,1,1); nc{'bulk_time'}(:)=time; close(nc) end @@ -420,7 +422,7 @@ if makeplot==1 disp('======================================================') disp(' Make a few plots...') slides=[1 12 24 36]; - + test_forcing(blkname,grdname,'tair',slides,3,coastfileplot) figure test_forcing(blkname,grdname,'rhum',slides,3,coastfileplot) diff --git a/Aforc_ERA5/make_bry_wkb_ERA5.m b/Aforc_ERA5/make_bry_wkb_ERA5.m index b9c163c8..7d4097fe 100644 --- a/Aforc_ERA5/make_bry_wkb_ERA5.m +++ b/Aforc_ERA5/make_bry_wkb_ERA5.m @@ -75,6 +75,10 @@ result=close(nc); grid_angle=mean(mean(angle(mask==1))); [M L]=size(h); % +wkb_prefix=[wkb_prefix,'_ERA5_']; +frc_prefix=[frc_prefix,'_ERA5_']; +% +% % Loop over monthly files % for Y=Ymin:Ymax @@ -92,20 +96,18 @@ for Y=Ymin:Ymax % % Forcing file name % - frc_prefix=[frc_prefix,'_ERA5_']; if level==0 nc_suffix='.nc'; else nc_suffix=['.nc.',num2str(level)]; end frcname=[frc_prefix,'Y',num2str(Y),... - 'M',num2str(M),nc_suffix]; + 'M',num2str(sprintf(Mth_format,M)),nc_suffix]; % % WKB file name % - wkb_prefix=[wkb_prefix,'_ERA5_']; brywkbname=[wkb_prefix,'Y',num2str(Y),... - 'M',num2str(M),nc_suffix]; + 'M',num2str(sprintf(Mth_format,M)),nc_suffix]; disp(' ') disp([' Making file: ',brywkbname]) disp([' from: ',frcname]) @@ -120,12 +122,12 @@ for Y=Ymin:Ymax close(nc) wkb_time=time; - wkb_cycle=wkb_time(end); + wkb_cycle=0; % % Create the boundary file % create_bryfile_wkb(brywkbname,grdname,CROCO_title,wkb_obc,... - wkb_time,wkb_cycle,'clobber'); + wkb_time,wkb_cycle,'clobber',Yorig); disp(' ') % % diff --git a/CHANGELOG.md b/CHANGELOG.md index e62c6b3a..74e9ee83 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,8 +6,21 @@ Release changelog are available here : https://gitlab.inria.fr/croco-ocean/croco ### Added +- Issue 57 : update croco_frcbio creation with make_dust.m and make_ndepo.m (Thanks to C. Ethee and R. Person) + + ## Fixed +- Issue 60 : fix overlaps problems with mercator daily and monthly forcing starting the first days of the month at 00:00h +- Issue 59 : + - propagate time unit, cycle_length and calendar attribute updates + - updates and fixes for bio into nestgui (interp_ini, interp_frcbio, interp_clim) + +- Issue 51 : + - various fixes, cleaning and indentation in croco_tools + - add time unit, cycle_length and calendar attribute update + - refactorization for time unit, cycle_length and calendar attributea + - Issue 50 : fix in mexcdf functionality for matlab 20xx versions (in particular matlab 2024) - Issue 49, 43 : add GSHHS coastline dataset in m_map private directory - Issue 44 : fix problem in editmask with longitude in 0-360° convention @@ -15,6 +28,8 @@ Release changelog are available here : https://gitlab.inria.fr/croco-ocean/croco ## Changed +- Issue 58 : cleaning and update in Preprocessing_tools/Bio + ## Removed ### Deprecated diff --git a/Nesting_tools/create_nestedbulk.m b/Nesting_tools/create_nestedbulk.m index bb5b8ed6..cfb377fd 100644 --- a/Nesting_tools/create_nestedbulk.m +++ b/Nesting_tools/create_nestedbulk.m @@ -1,4 +1,4 @@ -function create_bulk(blkname,parentname,grdname,title,bulkt,bulkc) +function create_bulk(blkname,parentname,grdname,title,bulkt,bulkc,Yorig) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Create an empty netcdf heat flux bulk bulk file @@ -38,7 +38,18 @@ M=length(nc('eta_psi')); result=close(nc); Lp=L+1; Mp=M+1; - +% +% options for write_time_attributes +insecond = 0; +add_cycle = 1 ; +% +% Initialize Yorig if not provided +if ~exist('Yorig', 'var') , Yorig = [] ; , end +% +% Get time attributes +[time_unit_att,time_second_unit_att,calendar_att]=... + get_time_attributes(Yorig); +% nw = netcdf(blkname, 'clobber'); %result = redef(nw); @@ -60,9 +71,8 @@ nw('bulk_time') = length(bulkt); nw{'bulk_time'} = ncdouble('bulk_time'); nw{'bulk_time'}.long_name = ncchar('bulk formulation execution time'); nw{'bulk_time'}.long_name = 'bulk formulation execution time'; -nw{'bulk_time'}.units = ncchar('days'); -nw{'bulk_time'}.units = 'days'; -nw{'bulk_time'}.cycle_length = bulkc; +write_time_attributes(nc,'bulk_time',bulkc,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); nw{'tair'} = ncdouble('bulk_time', 'eta_rho', 'xi_rho'); nw{'tair'}.long_name = ncchar('surface air temperature'); diff --git a/Nesting_tools/create_nestedclim.m b/Nesting_tools/create_nestedclim.m index 9f38043d..bdea5542 100644 --- a/Nesting_tools/create_nestedclim.m +++ b/Nesting_tools/create_nestedclim.m @@ -4,8 +4,8 @@ function ncclim=create_nestedclim(climfile,gridfile,parentfile,title,... tcycle,scycle,ucycle,vcycle,sshcycle,... tbiol, cbiol,tpisces,cpisces,... clobber,... - biol,pisces,timebiol,cyclebiol,timepisces,cyclepisce, ... - namebiol,namepisces,unitbiol,unitpisces,hc,vtransform) + biol,pisces,timebiol,cyclebiol,timepisces,cyclepisces, ... + namebiol,namepisces,unitbiol,unitpisces,hc,vtransform,Yorig) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % function ncclim=create_climfile(climfile,gridfile,theta_s,... @@ -62,6 +62,18 @@ function ncclim=create_nestedclim(climfile,gridfile,parentfile,title,... % e-mail:Pierrick.Penven@ird.fr % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% options for write_time_attributes +insecond = 0; +add_cycle = 1; +% +% Initialize Yorig if not provided +if ~exist('Yorig', 'var') , Yorig = [] ; , end +% +% Get time attributes +[time_unit_att,time_second_unit_att,calendar_att]=... + get_time_attributes(Yorig); +% disp(' ') disp(' ') disp(['Creating the file : ',climfile]) @@ -95,11 +107,11 @@ ncclim('eta_rho') = Mp; ncclim('s_rho') = N; ncclim('s_w') = Np; ncclim('tracer') = 2; -ncclim('tclm_time') = size(ttime); -ncclim('sclm_time') = size(stime); -ncclim('uclm_time') = size(utime); -ncclim('vclm_time') = size(vtime); -ncclim('ssh_time') = size(sshtime); +ncclim('tclm_time') = length(ttime); +ncclim('sclm_time') = length(stime); +ncclim('uclm_time') = length(utime); +ncclim('vclm_time') = length(vtime); +ncclim('ssh_time') = length(sshtime); if biol for k=1:length(timebiol) @@ -152,13 +164,13 @@ ncclim{'Vstretching'}.long_name = 'vertical terrain-following stretching functio % ncclim{'tstart'}.long_name = ncchar('start processing day'); ncclim{'tstart'}.long_name = 'start processing day'; -ncclim{'tstart'}.units = ncchar('day'); -ncclim{'tstart'}.units = 'day'; +write_time_attributes(nc,'tstart',tcycle,time_unit_att,time_second_unit_att,... + calendar_att,0,0); % ncclim{'tend'}.long_name = ncchar('end processing day'); ncclim{'tend'}.long_name = 'end processing day'; -ncclim{'tend'}.units = ncchar('day'); -ncclim{'tend'}.units = 'day'; +write_time_attributes(nc,'tend',tcycle,time_unit_att,time_second_unit_att,... + calendar_att,0,0); % ncclim{'theta_s'}.long_name = ncchar('S-coordinate surface control parameter'); ncclim{'theta_s'}.long_name = 'S-coordinate surface control parameter'; @@ -200,43 +212,39 @@ ncclim{'Cs_rho'}.field = 'Cs_rho, scalar'; % ncclim{'tclm_time'}.long_name = ncchar('time for temperature climatology'); ncclim{'tclm_time'}.long_name = 'time for temperature climatology'; -ncclim{'tclm_time'}.units = ncchar('day'); -ncclim{'tclm_time'}.units = 'day'; -ncclim{'tclm_time'}.cycle_length = tcycle; ncclim{'tclm_time'}.field = ncchar('tclm_time, scalar, series'); ncclim{'tclm_time'}.field = 'tclm_time, scalar, series' ; +write_time_attributes(nc,'tclm_time',tcycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % ncclim{'sclm_time'}.long_name = ncchar('time for salinity climatology'); ncclim{'sclm_time'}.long_name = 'time for salinity climatology'; -ncclim{'sclm_time'}.units = ncchar('day'); -ncclim{'sclm_time'}.units = 'day'; -ncclim{'sclm_time'}.cycle_length = scycle; ncclim{'sclm_time'}.field = ncchar('sclm_time, scalar, serie'); ncclim{'sclm_time'}.field = 'sclm_time, scalar, serie'; +write_time_attributes(nc,'sclm_time',scycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % ncclim{'uclm_time'}.long_name = ncchar('time climatological u'); ncclim{'uclm_time'}.long_name = 'time climatological u'; -ncclim{'uclm_time'}.units = ncchar('day'); -ncclim{'uclm_time'}.units = 'day'; -ncclim{'uclm_time'}.cycle_length = ucycle; ncclim{'uclm_time'}.field = ncchar('uclm_time, scalar, serie'); ncclim{'uclm_time'}.field = 'uclm_time, scalar, serie'; +write_time_attributes(nc,'uclm_time',ucycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % ncclim{'vclm_time'}.long_name = ncchar('time climatological v'); ncclim{'vclm_time'}.long_name = 'time climatological v'; -ncclim{'vclm_time'}.units = ncchar('day'); -ncclim{'vclm_time'}.units = 'day'; -ncclim{'vclm_time'}.cycle_length = vcycle; ncclim{'vclm_time'}.field = ncchar('vclm_time, scalar, serie'); ncclim{'vclm_time'}.field = 'vclm_time, scalar, serie'; +write_time_attributes(nc,'vclm_time',vcycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); + % ncclim{'ssh_time'}.long_name = ncchar('time for sea surface height'); ncclim{'ssh_time'}.long_name = 'time for sea surface height'; -ncclim{'ssh_time'}.units = ncchar('day'); -ncclim{'ssh_time'}.units = 'day'; -ncclim{'ssh_time'}.cycle_length = sshcycle; ncclim{'ssh_time'}.field = ncchar('ssh_time, scalar, serie'); ncclim{'ssh_time'}.field = 'ssh_time, scalar, serie'; +write_time_attributes(nc,'ssh_time',sshcycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % if biol for k=1:length(timebiol) @@ -244,12 +252,12 @@ if biol ncclim{char(timebiol(k))} = ncdouble(char(timebiol(k,:))); ncclim{char(timebiol(k))}.long_name = ncchar(char(timebiol(k))); ncclim{char(timebiol(k))}.long_name = char(timebiol(k)); - ncclim{char(timebiol(k))}.units = ncchar('day'); - ncclim{char(timebiol(k))}.units = 'day'; - ncclim{char(timebiol(k))}.cycle_length = char(timebiol(k)); ncclim{char(timebiol(k))}.field = ncchar([char(timebiol(k)),', scalar, series']); ncclim{char(timebiol(k))}.field = [char(timebiol(k)),', scalar, series'] ; -% + write_time_attributes(nc,char(timebiol(k)),cbiol,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); + + % % disp(char(namebiol(k))) ncclim{char(namebiol(k))} = ncdouble(char(timebiol(k,:)),'s_rho','eta_rho','xi_rho'); ncclim{char(namebiol(k))}.long_name = ncchar(char(namebiol(k))); @@ -269,11 +277,10 @@ if pisces ncclim{char(timepisces(k))} = ncdouble(char(timepisces(k,:))); ncclim{char(timepisces(k))}.long_name = ncchar(char(timepisces(k))); ncclim{char(timepisces(k))}.long_name = char(timepisces(k)); - ncclim{char(timepisces(k))}.units = ncchar('day'); - ncclim{char(timepisces(k))}.units = 'day'; - ncclim{char(timepisces(k))}.cycle_length = ncchar([char(namepisces(k)),', scalar, series']); ncclim{char(timepisces(k))}.field = ncchar([char(timepisces(k)), ',scalar, series']); ncclim{char(timepisces(k))}.field = [char(timepisces(k)), ',scalar, series'] ; + write_time_attributes(nc,char(timepisces(k)),cpisces,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % %disp(char(namepisces(k))) ncclim{char(namepisces(k))} = ncdouble(char(timepisces(k,:)),'s_rho','eta_rho','xi_rho'); diff --git a/Nesting_tools/create_nesteddust.m b/Nesting_tools/create_nesteddust.m index ffb0ac73..e8ee205a 100644 --- a/Nesting_tools/create_nesteddust.m +++ b/Nesting_tools/create_nesteddust.m @@ -30,6 +30,17 @@ function create_nesteddust(dustname,parentname,grdname,title,dustt,dustc) % e-mail:Pierrick.Penven@ird.fr % Update : Gildas Cambon 13 Oct 2009 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% options for write_time_attributes +insecond = 0 ; +add_cycle = 1 ; +% +% Initialize Yorig if not provided +if ~exist('Yorig', 'var') , Yorig = []; , end +% +% Get time attributes +[time_unit_att,time_second_unit_att,calendar_att]=... + get_time_attributes(Yorig); +% nc=netcdf(grdname); L=length(nc('xi_psi')); M=length(nc('eta_psi')); @@ -56,11 +67,10 @@ nw('dust_time') = length(dustt); nw{'dust_time'} = ncdouble('dust_time'); nw{'dust_time'}.long_name = ncchar('dust time'); nw{'dust_time'}.long_name = 'dust time'; -nw{'dust_time'}.units = ncchar('days'); -nw{'dust_time'}.units = 'days'; -nw{'dust_time'}.cycle_length = dustc; nw{'dust_time'}.field = ncchar('time, scalar, series'); nw{'dust_time'}.field = 'time, scalar, series'; +write_time_attributes(nc,'dust_time',dustc,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); nw{'dust'} = ncdouble('dust_time', 'eta_rho', 'xi_rho'); nw{'dust'}.long_name = ncchar('Fe Dust Deposition'); @@ -70,7 +80,39 @@ nw{'dust'}.units = 'nmol Fe m-3'; nw{'dust'}.field = ncchar('Fe Dust Deposition, scalar, series'); nw{'dust'}.field = 'Fe Dust Deposition, scalar, series'; -%endef(nw); +nw{'dustfer'} = ncdouble('dust_time', 'eta_rho', 'xi_rho'); +nw{'dustfer'}.long_name = ncchar('Fe Dust Deposition'); +nw{'dustfer'}.long_name = 'Fe Dust Deposition'; +nw{'dustfer'}.units = ncchar('Kg m-2 s-1'); +nw{'dustfer'}.units = 'Kg m-2 s-1'; +nw{'dustfer'}.field = ncchar('dustfer, scalar, series'); +nw{'dustfer'}.field = 'dustfer, scalar, series'; +% +nw{'dustpo4'} = ncdouble('dust_time', 'eta_rho', 'xi_rho'); +nw{'dustpo4'}.long_name = ncchar('PO4 Dust Deposition'); +nw{'dustpo4'}.long_name = 'PO4 Dust Deposition'; +nw{'dustpo4'}.units = ncchar('Kg m-2 s-1'); +nw{'dustpo4'}.units = 'Kg m-2 s-1'; +nw{'dustpo4'}.field = ncchar('dustpo4, scalar, series'); +nw{'dustpo4'}.field = 'dustpo4, scalar, series'; +% +nw{'dustsi'} = ncdouble('dust_time', 'eta_rho', 'xi_rho'); +nw{'dustsi'}.long_name = ncchar('Si Dust Deposition'); +nw{'dustsi'}.long_name = 'Si Dust Deposition'; +nw{'dustsi'}.units = ncchar('Kg m-2 s-1'); +nw{'dustsi'}.units = 'Kg m-2 s-1'; +nw{'dustsi'}.field = ncchar('dustsi, scalar, series'); +nw{'dustsi'}.field = 'dustsi, scalar, series'; +% +nw{'solubility2'} = ncdouble('dust_time', 'eta_rho', 'xi_rho'); +nw{'solubility2'}.long_name = ncchar('Fe solubility from Mahowald'); +nw{'solubility2'}.long_name = 'Fe solubility from Mahowald'; +nw{'solubility2'}.units = ncchar('%'); +nw{'solubility2'}.units = '%'; +nw{'solubility2'}.field = ncchar('solubility2, scalar, series'); +nw{'solubility2'}.field = 'solubility2, scalar, series'; + +endef(nw); % % Create global attributes diff --git a/Nesting_tools/create_nestedforcing.m b/Nesting_tools/create_nestedforcing.m index 2a7c37ce..dfc2d432 100644 --- a/Nesting_tools/create_nestedforcing.m +++ b/Nesting_tools/create_nestedforcing.m @@ -1,6 +1,6 @@ function create_nestedforcing(frcname,parentname,grdname,title,smst,... shft,swft,srft,sstt,ssst,smsc,... - shfc,swfc,srfc,sstc,sssc) + shfc,swfc,srfc,sstc,sssc,Yorig) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Create an empty netcdf forcing file @@ -38,6 +38,18 @@ M=length(nc('eta_psi')); close(nc); Lp=L+1; Mp=M+1; +% +% options for write_time_attributes +insecond = 0; +add_cycle = 1 ; +% +% Initialize Yorig if not provided +if ~exist('Yorig', 'var') , Yorig = [] ; , end +% +% Get time attributes +[time_unit_att,time_second_unit_att,calendar_att]=... + get_time_attributes(Yorig); +% nw = netcdf(frcname, 'clobber'); %redef(nw); % @@ -63,57 +75,52 @@ nw('sss_time') = length(ssst); nw{'sms_time'} = ncdouble('sms_time'); nw{'sms_time'}.long_name = ncchar('surface momentum stress time'); nw{'sms_time'}.long_name = 'surface momentum stress time'; -nw{'sms_time'}.units = ncchar('days'); -nw{'sms_time'}.units = 'days'; -nw{'sms_time'}.cycle_length = smsc; nw{'sms_time'}.field = ncchar('time, scalar, series'); nw{'sms_time'}.field = 'time, scalar, series'; +write_time_attributes(nc,'sms_time',smsc,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); nw{'shf_time'} = ncdouble('shf_time'); nw{'shf_time'}.long_name = ncchar('surface heat flux time'); nw{'shf_time'}.long_name = 'surface heat flux time'; -nw{'shf_time'}.units = ncchar('days'); -nw{'shf_time'}.units = 'days'; -nw{'shf_time'}.cycle_length =shfc ; nw{'shf_time'}.field = ncchar('time, scalar, series'); nw{'shf_time'}.field = 'time, scalar, series'; +write_time_attributes(nc,'shf_time',shfc,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); nw{'swf_time'} = ncdouble('swf_time'); nw{'swf_time'}.long_name = ncchar('surface freshwater flux time'); nw{'swf_time'}.long_name = 'surface freshwater flux time'; -nw{'swf_time'}.units = ncchar('days'); -nw{'swf_time'}.units = 'days'; -nw{'swf_time'}.cycle_length = swfc; nw{'swf_time'}.field = ncchar('time, scalar, series'); nw{'swf_time'}.field = 'time, scalar, series'; +write_time_attributes(nc,'swf_time',swfc,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); nw{'sst_time'} = ncdouble('sst_time'); nw{'sst_time'}.long_name = ncchar('sea surface temperature time'); nw{'sst_time'}.long_name = 'sea surface temperature time'; -nw{'sst_time'}.units = ncchar('days'); -nw{'sst_time'}.units = 'days'; -nw{'sst_time'}.cycle_length = sstc; nw{'sst_time'}.field = ncchar('time, scalar, series'); nw{'sst_time'}.field = 'time, scalar, series'; +write_time_attributes(nc,'sst_time',sstc,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); + nw{'sss_time'} = ncdouble('sss_time'); nw{'sss_time'}.long_name = ncchar('sea surface salinity time'); nw{'sss_time'}.long_name = 'sea surface salinity time'; -nw{'sss_time'}.units = ncchar('days'); -nw{'sss_time'}.units = 'days'; -nw{'sss_time'}.cycle_length = sssc; nw{'sss_time'}.field = ncchar('time, scalar, series'); nw{'sss_time'}.field = 'time, scalar, series'; +write_time_attributes(nc,'sss_time',sssc,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); nw{'srf_time'} = ncdouble('srf_time'); nw{'srf_time'}.long_name = ncchar('solar shortwave radiation time'); nw{'srf_time'}.long_name = 'solar shortwave radiation time'; -nw{'srf_time'}.units = ncchar('days'); -nw{'srf_time'}.units = 'days'; -nw{'srf_time'}.cycle_length = srfc; nw{'srf_time'}.field = ncchar('time, scalar, series'); nw{'srf_time'}.field = 'time, scalar, series'; +write_time_attributes(nc,'srf_time',srfc,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); nw{'sustr'} = ncdouble('sms_time', 'eta_u', 'xi_u'); nw{'sustr'}.long_name = ncchar('surface u-momentum stress'); diff --git a/Nesting_tools/create_nestedinitial.m b/Nesting_tools/create_nestedinitial.m index 7bb1e37e..6fb41bfb 100644 --- a/Nesting_tools/create_nestedinitial.m +++ b/Nesting_tools/create_nestedinitial.m @@ -1,7 +1,7 @@ function ncini=create_nestedinitial(inifile,gridfile,parentfile,title,... theta_s,theta_b,Tcline,N,time,clobber,... biol,pisces,namebiol,namepisces,... - unitbiol,unitpisces,hc,vtransform) + unitbiol,unitpisces,hc,vtransform,Yorig) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % function ncini=create_inifile(inifile,gridfile,theta_s,... @@ -68,6 +68,17 @@ elseif nargin <18 vtransform = 1; end % +% options for write_time_attributes +insecond = 1 ; +add_cycle = 0 ; +% +% Initialize Yorig if not provided +if ~exist('Yorig', 'var') , Yorig = []; , end +% +% Get time attributes +[time_unit_att,time_second_unit_att,calendar_att]=... + get_time_attributes(Yorig); +% % Read the grid file % nc=netcdf(gridfile, 'nowrite'); @@ -143,11 +154,13 @@ ncini{'tstart'}.long_name = ncchar('start processing day'); ncini{'tstart'}.long_name = 'start processing day'; ncini{'tstart'}.units = ncchar('day'); ncini{'tstart'}.units = 'day'; +write_time_attributes(nc,'tstart','',time_unit_att,time_second_unit_att,... + calendar_att,0,0); % ncini{'tend'}.long_name = ncchar('end processing day'); ncini{'tend'}.long_name = 'end processing day'; -ncini{'tend'}.units = ncchar('day'); -ncini{'tend'}.units = 'day'; +write_time_attributes(nc,'tend','',time_unit_att,time_second_unit_att,... + calendar_att,0,0); % ncini{'theta_s'}.long_name = ncchar('S-coordinate surface control parameter'); ncini{'theta_s'}.long_name = 'S-coordinate surface control parameter'; @@ -189,10 +202,10 @@ ncini{'Cs_rho'}.field = 'Cs_rho, scalar'; % ncini{'scrum_time'}.long_name = ncchar('time since initialization'); ncini{'scrum_time'}.long_name = 'time since initialization'; -ncini{'scrum_time'}.units = ncchar('second'); -ncini{'scrum_time'}.units = 'second'; ncini{'scrum_time'}.field = ncchar('time, scalar, series'); ncini{'scrum_time'}.field = 'time, scalar, series'; +write_time_attributes(nc,'scrum_time','',time_unit_att,time_second_unit_att,... + calendar_att,1,0); % ncini{'u'}.long_name = ncchar('u-momentum component'); ncini{'u'}.long_name = 'u-momentum component'; diff --git a/Nesting_tools/create_nestedndepo.m b/Nesting_tools/create_nestedndepo.m new file mode 100644 index 00000000..b1b0128e --- /dev/null +++ b/Nesting_tools/create_nestedndepo.m @@ -0,0 +1,113 @@ +function create_nestedndepo(ndeponame,parentname,grdname,title,ndepot,ndepoc) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Create an empty netcdf ndepo forcing file (for PISCES) +% ndeponame: name of the ndepo file +% grdname: name of the grid file +% title: title in the netcdf file +% +% Further Information: +% http://www.croco-ocean.org +% +% This file is part of CROCOTOOLS +% +% CROCOTOOLS is free software; you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published +% by the Free Software Foundation; either version 2 of the License, +% or (at your option) any later version. +% +% CROCOTOOLS is distributed in the hope that it will be useful, but +% WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this program; if not, write to the Free Software +% Foundation, Inc., 59 Temple Place, Suite 330, Boston, +% MA 02111-1307 USA +% +% Copyright (c) 2004-2006 by Pierrick Penven +% e-mail:Pierrick.Penven@ird.fr +% Update : Gildas Cambon 13 Oct 2009 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +nc=netcdf(grdname); +L=length(nc('xi_psi')); +M=length(nc('eta_psi')); +close(nc); +Lp=L+1; +Mp=M+1; +nw = netcdf(ndeponame, 'write'); +%redef(nw); +% +% Create dimensions +% +nw('xi_u') = L; +nw('eta_u') = Mp; +nw('xi_v') = Lp; +nw('eta_v') = M; +nw('xi_rho') = Lp; +nw('eta_rho') = Mp; +nw('xi_psi') = L; +nw('eta_psi') = M; +nw('ndepo_time') = length(ndepot); +% +% Create variables and attributes +% +nw{'ndepo_time'} = ncdouble('ndepo_time'); +nw{'ndepo_time'}.long_name = ncchar('ndepo time'); +nw{'ndepo_time'}.long_name = 'ndepo time'; +nw{'ndepo_time'}.units = ncchar('days'); +nw{'ndepo_time'}.units = 'days'; +nw{'ndepo_time'}.cycle_length = ndepoc; +nw{'ndepo_time'}.field = ncchar('time, scalar, series'); +nw{'ndepo_time'}.field = 'time, scalar, series'; + +% +nw{'ndepo'} = ncdouble('ndepo_time', 'eta_rho', 'xi_rho'); +nw{'ndepo'}.long_name = ncchar('Nitrogen Deposition'); +nw{'ndepo'}.long_name = 'Nitrogen Deposition'; +nw{'ndepo'}.units = ncchar('KgN m-2 s-1'); +nw{'ndepo'}.units = 'KgN m-2 s-1'; +nw{'ndepo'}.field = ncchar('ndepo, scalar, series'); +nw{'ndepo'}.field = 'ndepo, scalar, series'; +% +nw{'noyndepo'} = ncdouble('ndepo_time', 'eta_rho', 'xi_rho'); +nw{'noyndepo'}.long_name = ncchar('NOy Deposition'); +nw{'noyndepo'}.long_name = 'NOy Deposition'; +nw{'noyndepo'}.units = ncchar('KgN m-2 s-1'); +nw{'noyndepo'}.units = 'KgN m-2 s-1'; +nw{'noyndepo'}.field = ncchar('noyndepo, scalar, series'); +nw{'noyndepo'}.field = 'noyndepo, scalar, series'; +% +nw{'nhxndepo'} = ncdouble('ndepo_time', 'eta_rho', 'xi_rho'); +nw{'nhxndepo'}.long_name = ncchar('NHx Deposition'); +nw{'nhxndepo'}.long_name = 'NHx Deposition'; +nw{'nhxndepo'}.units = ncchar('KgN m-2 s-1'); +nw{'nhxndepo'}.units = 'KgN m-2 s-1'; +nw{'nhxndepo'}.field = ncchar('nhxndepo, scalar, series'); +nw{'nhxndepo'}.field = 'nhxndepo, scalar, series'; +% +%endef(nw); + +% +% Create global attributes +% + +nw.title = ncchar(title); +nw.title = title; +nw.date = ncchar(date); +nw.date = date; +nw.grd_file = ncchar(grdname); +nw.grd_file = grdname; +nw.parent_file = ncchar(parentname); +nw.parent_file = parentname; + +% +% Write time variables +% + +nw{'ndepo_time'}(:) = ndepot; + + +close(nw); +return diff --git a/Nesting_tools/interp_dust.m b/Nesting_tools/interp_dust.m index cf9305e8..31cdf89b 100644 --- a/Nesting_tools/interp_dust.m +++ b/Nesting_tools/interp_dust.m @@ -50,4 +50,5 @@ switch Answer handles.childdust=childname; end nested_dust(handles.childgrid,handles.parentdust,handles.childdust) +nested_ndepo(handles.childgrid,handles.parentdust,handles.childdust) return diff --git a/Nesting_tools/nested_clim.m b/Nesting_tools/nested_clim.m index b3847285..96bdf80a 100644 --- a/Nesting_tools/nested_clim.m +++ b/Nesting_tools/nested_clim.m @@ -1,12 +1,12 @@ function nested_clim(child_grd,parent_clim,child_clim,... - vertical_correc,extrapmask,biol,bioebus,pisces) + vertical_correc,extrapmask,biol,bioebus,pisces) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % compute the climatology of the embedded grid % -% Further Information: +% Further Information: % http://www.croco-ocean.org -% +% % This file is part of CROCOTOOLS % % CROCOTOOLS is free software; you can redistribute it and/or modify @@ -24,8 +24,8 @@ function nested_clim(child_grd,parent_clim,child_clim,... % Foundation, Inc., 59 Temple Place, Suite 330, Boston, % MA 02111-1307 USA % -% Copyright (c) 2004-2006 by Pierrick Penven -% e-mail:Pierrick.Penven@ird.fr +% Copyright (c) 2004-2006 by Pierrick Penven +% e-mail:Pierrick.Penven@ird.fr % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -46,9 +46,8 @@ tpisces=[];cpisces=[]; % Check type of clim file -% -if nvar <= 31 -elseif (nvar <= 41 & biol) +if biol + if (bioebus~=1) %% for biol + npzd timebiol={'no3_time';'o2_time';'chla_time';'phyto_time';'zoo_time'}; cyclebiol={'no3_cyle';'o2_cycle';'chla_cycle';'phyto_cycle';'zoo_cycle'}; namebiol={'NO3';'O2';'CHLA';'PHYTO';'ZOO'}; @@ -57,30 +56,27 @@ elseif (nvar <= 41 & biol) disp(['Compute Biogeochemical variables type NPZD : ']) disp(['NChlPZD or N2ChlPZD2 ']) disp('==========================') -elseif (46 <= nvar <=47 & biobus) + else % for biol + bioebus) timebiol={'no3_time';'o2_time';'chla_time';'sphyto_time';'lphyto_time';'szoo_time';'lzoo_time';'n2o_time'}; cyclebiol={'no3_cyle';'o2_cycle';'chla_cycle';'sphyto_cycle';'lphyto_cycle';'szoo_cycle';'lzoo_cycle';'n2o_cycle'}; namebiol={'NO3';'O2';'CHLA';'SPHYTO';'LPHYTO';'SZOO';'LZOO';'N2O'}; unitbiol={'mMol N m-3';'mMol O m-3';'mg C l-1';'mMol N m-3';'mMol N m-3';'mMol N m-3';'mMol N m-3';'mMol N m-3'}; disp(['Compute Biological variables for BIOEBUS : ']) disp('==========================') -elseif (pisces & nvar>=47) - timepisces={'no3_time';'po4_time';'si_time';'o2_time';'dic_time';'talk_time';'doc_time';'fer_time'}; - cyclepisces={'no3_cycle';'po4_cycle';'si_cycle';'o2_cycle';'dic_cycle';'talk_cycle';'doc_cycle';'fer_cycle'}; - namepisces={'NO3';'PO4';'Si';'O2';'DIC';'TALK';'DOC';'FER'}; - unitpisces={'mMol N m-3';'mMol P m-3';'mMol Si m-3';'mMol O m-3';'mMol C m-3';'mMol C m-3';'mMol C m-3';'uMol Fe m-3'}; - disp('Compute Biogeochemical variables for PISCES') - disp('=========================') -else - error(sprintf(['You don''t have the neccesary variables in the clim file. \n',... - 'or you didn''t choose the right bio. model. \n',... - 'Check croco_ini.nc parent file and make_clim.m'])) + end +elseif (pisces) + timepisces={'no3_time';'po4_time';'si_time';'o2_time';'dic_time';'talk_time';'doc_time';'fer_time'}; + cyclepisces={'no3_cycle';'po4_cycle';'si_cycle';'o2_cycle';'dic_cycle';'talk_cycle';'doc_cycle';'fer_cycle'}; + namepisces={'NO3';'PO4';'Si';'O2';'DIC';'TALK';'DOC';'FER'}; + unitpisces={'mMol N m-3';'mMol P m-3';'mMol Si m-3';'mMol O m-3';'mMol C m-3';'mMol C m-3';'mMol C m-3';'uMol Fe m-3'}; + disp('Compute Biogeochemical variables for PISCES') + disp('=========================') end -% + % Title % title=['Climatology file for the embedded grid :',child_clim,... - ' using parent forcing file: ',parent_clim]; + ' using parent forcing file: ',parent_clim]; disp(' ') disp(title) if extrapmask==1 @@ -93,7 +89,7 @@ if vertical_correc==1 disp('===============') end % -if pisces & biol +if pisces & biol error(['Both Biol NPZD and Pisces are ON, no possible yet...!']) end % @@ -132,9 +128,9 @@ vtransform=nc{'Vtransform'}(:); hc = nc{'hc'}(:); disp([' Use parent VTRANSFORM = ',num2str(vtransform)]) if ~exist('vtransform') | isempty(vtransform) - disp([' No VTRANSFORM parameter found']) - disp([' Use the default one VTRANSFORM = 1']) - vtransform=1; + disp([' No VTRANSFORM parameter found']) + disp([' Use the default one VTRANSFORM = 1']) + vtransform=1; end ttime = nc{'tclm_time'}(:); tcycle = nc{'tclm_time'}.cycle_length(:); @@ -148,23 +144,30 @@ sshtime = nc{'ssh_time'}(:); sshcycle = nc{'ssh_time'}.cycle_length(:); % if biol==1 - for k=1:length(namebiol) - eval([char(timebiol(k)),'=nc{''',char(timebiol(k)),'''}(:);']); - eval([char(cyclebiol(k)),'=nc{''',char(timebiol(k)),'''}.cycle_length(:);']); - % - eval(['tbiol(k,:)=',char(timebiol(k)),';']); - eval(['cbiol(k,:)=',char(cyclebiol(k)),';']); -end + for k=1:length(namebiol) + if strcmp(char(namebiol{k}), 'NO3') || strcmp(char(namebiol{k}), 'O2') || strcmp(char(namebiol{k}), 'N2O') + skip = 3; % for no3_time + o2_time + n2o_time % a bit sloppy + % wa tale value every 3 month to have kinf of seasonal ... + else + skip = 1; + end + + eval([char(timebiol(k)),'=nc{''',char(timebiol(k)),'''}(1:skip:end,:);']); + eval([char(cyclebiol(k)),'=nc{''',char(timebiol(k)),'''}.cycle_length(:);']); + + eval(['tbiol(k,:)=',char(timebiol(k)),';']); + eval(['cbiol(k,:)=',char(cyclebiol(k)),';']); + end end % if pisces==1 - for k=1:length(namepisces) - eval([char(timepisces(k)),'=nc{''',char(timepisces(k)),'''}(:);']); - eval([char(cyclepisces(k)),'=nc{''',char(timepisces(k)),'''}.cycle_length(:);']); - % - eval(['tpisces(k,:)=',char(timepisces(k)),';']); - eval(['cpisces(k,:)=',char(cyclepisces(k)),';']); - end + for k=1:length(namepisces) + eval([char(timepisces(k)),'=nc{''',char(timepisces(k)),'''}(:);']); + eval([char(cyclepisces(k)),'=nc{''',char(timepisces(k)),'''}.cycle_length(:);']); + % + eval(['tpisces(k,:)=',char(timepisces(k)),';']); + eval(['cpisces(k,:)=',char(cyclepisces(k)),';']); + end end % result=close(nc); @@ -178,15 +181,16 @@ end % disp(' ') disp(' Create the climatology file...') +% ncclim=create_nestedclim(child_clim,child_grd,parent_clim,title,... - theta_s,theta_b,Tcline,N,... - ttime,stime,utime,vtime,sshtime,... - tcycle,scycle,ucycle,vcycle,sshcycle,... - tbiol,cbiol,tpisces, cpisces, ... - 'clobber',... - biol,pisces,... - timebiol, cyclebiol,timepisces,cyclepisces,... - namebiol,namepisces,unitbiol,unitpisces,hc,vtransform); + theta_s,theta_b,Tcline,N,... + ttime,stime,utime,vtime,sshtime,... + tcycle,scycle,ucycle,vcycle,sshcycle,... + tbiol,cbiol,tpisces, cpisces, ... + 'clobber',... + biol,pisces,... + timebiol, cyclebiol,timepisces,cyclepisces,... + namebiol,namepisces,unitbiol,unitpisces,hc,vtransform); % % parent indices % @@ -207,66 +211,66 @@ jrchild=(jmin+0.5-0.5/refinecoeff:1/refinecoeff:jmax+0.5+0.5/refinecoeff); [ichildgrd_v,jchildgrd_v]=meshgrid(irchild,jpchild); % % interpolations -% +% disp(' ') -disp(' Do the interpolations...') +disp(' Do the interpolations...') np=netcdf(parent_clim); disp('u...') for tindex=1:length(climtime) - disp([' Time index : ',num2str(tindex),' of ',num2str(length(climtime))]) + disp([' Time index : ',num2str(tindex),' of ',num2str(length(climtime))]) interpvar4d(np,ncclim,igrd_u,jgrd_u,ichildgrd_u,jchildgrd_u,'u',mask,tindex,N) end disp('v...') for tindex=1:length(climtime) - disp([' Time index : ',num2str(tindex),' of ',num2str(length(climtime))]) + disp([' Time index : ',num2str(tindex),' of ',num2str(length(climtime))]) interpvar4d(np,ncclim,igrd_v,jgrd_v,ichildgrd_v,jchildgrd_v,'v',mask,tindex,N) end disp('zeta...') for tindex=1:length(climtime) - disp([' Time index : ',num2str(tindex),' of ',num2str(length(climtime))]) + disp([' Time index : ',num2str(tindex),' of ',num2str(length(climtime))]) interpvar3d(np,ncclim,igrd_r,jgrd_r,ichildgrd_r,jchildgrd_r,'SSH',mask,tindex) end disp('ubar...') for tindex=1:length(climtime) - disp([' Time index : ',num2str(tindex),' of ',num2str(length(climtime))]) + disp([' Time index : ',num2str(tindex),' of ',num2str(length(climtime))]) interpvar3d(np,ncclim,igrd_u,jgrd_u,ichildgrd_u,jchildgrd_u,'ubar',mask,tindex) end disp('vbar...') for tindex=1:length(climtime) - disp([' Time index : ',num2str(tindex),' of ',num2str(length(climtime))]) + disp([' Time index : ',num2str(tindex),' of ',num2str(length(climtime))]) interpvar3d(np,ncclim,igrd_v,jgrd_v,ichildgrd_v,jchildgrd_v,'vbar',mask,tindex) end disp('temp...') for tindex=1:length(climtime) - disp([' Time index : ',num2str(tindex),' of ',num2str(length(climtime))]) + disp([' Time index : ',num2str(tindex),' of ',num2str(length(climtime))]) interpvar4d(np,ncclim,igrd_r,jgrd_r,ichildgrd_r,jchildgrd_r,'temp',mask,tindex,N) end disp('salt...') for tindex=1:length(climtime) - disp([' Time index : ',num2str(tindex),' of ',num2str(length(climtime))]) + disp([' Time index : ',num2str(tindex),' of ',num2str(length(climtime))]) interpvar4d(np,ncclim,igrd_r,jgrd_r,ichildgrd_r,jchildgrd_r,'salt',mask,tindex,N) end % %% % if biol - for k=1:length(namebiol) - disp(char(namebiol(k))) - for tindex=1:length(tbiol(k,:)) - disp([' Time index : ',num2str(tindex),' of ',num2str(length(tbiol(k,:)))]) - interpvar4d(np,ncclim,igrd_r,jgrd_r,ichildgrd_r,jchildgrd_r,char(namebiol(k)),mask,tindex,N) - end + for k=1:length(namebiol) + disp(char(namebiol(k))) + for tindex=1:length(tbiol(k,:)) + disp([' Time index : ',num2str(tindex),' of ',num2str(length(tbiol(k,:)))]) + interpvar4d(np,ncclim,igrd_r,jgrd_r,ichildgrd_r,jchildgrd_r,char(namebiol(k)),mask,tindex,N) end + end end % if pisces - for k=1:length(namepisces) - disp(char(namepisces(k))) - for tindex=1:length(tpisces(k,:)) - disp([' Time index : ',num2str(tindex),' of ',num2str(length(tpisces(k,:)))]) - interpvar4d(np,ncclim,igrd_r,jgrd_r,ichildgrd_r,jchildgrd_r,char(namepisces(k)),mask,tindex,N) - end + for k=1:length(namepisces) + disp(char(namepisces(k))) + for tindex=1:length(tpisces(k,:)) + disp([' Time index : ',num2str(tindex),' of ',num2str(length(tpisces(k,:)))]) + interpvar4d(np,ncclim,igrd_r,jgrd_r,ichildgrd_r,jchildgrd_r,char(namepisces(k)),mask,tindex,N) end + end end close(np); close(ncclim); @@ -274,33 +278,33 @@ close(ncclim); % Vertical corrections % if (vertical_correc==1) - disp('Process variable physical variables') - for tindex=1:length(climtime) - disp([' Time index : ',num2str(tindex),' of ',num2str(length(climtime))]) - vert_correc(child_clim,tindex,0,0,namebiol,namepisces) - end - %% - if biol - disp('Process variable NPZD') - for k=1:length(namebiol) - disp(char(namebiol(k))) - for tindex=1:length(tbiol(k,:)) - disp([' Time index : ',num2str(tindex),' of ',num2str(length(tbiol(k,:)))]) - vert_correc_onefield(child_clim,tindex,char(namebiol(k))) - end - end + disp('Process variable physical variables') + for tindex=1:length(climtime) + disp([' Time index : ',num2str(tindex),' of ',num2str(length(climtime))]) + vert_correc(child_clim,tindex,0,0,namebiol,namepisces) + end + %% + if biol + disp('Process variable NPZD') + for k=1:length(namebiol) + disp(char(namebiol(k))) + for tindex=1:length(tbiol(k,:)) + disp([' Time index : ',num2str(tindex),' of ',num2str(length(tbiol(k,:)))]) + vert_correc_onefield(child_clim,tindex,char(namebiol(k))) + end end - %% - if pisces - disp('Process variable PISCES') - for k=1:length(namepisces) - disp(char(namepisces(k))) - for tindex=1:length(tpisces(k,:)) - disp([' Time index : ',num2str(tindex),' of ',num2str(length(tpisces(k,:)))]) - vert_correc_onefield(child_clim,tindex,char(namepisces(k))) - end - end + end + %% + if pisces + disp('Process variable PISCES') + for k=1:length(namepisces) + disp(char(namepisces(k))) + for tindex=1:length(tpisces(k,:)) + disp([' Time index : ',num2str(tindex),' of ',num2str(length(tpisces(k,:)))]) + vert_correc_onefield(child_clim,tindex,char(namepisces(k))) + end end + end end % % Make a plot diff --git a/Nesting_tools/nested_dust.m b/Nesting_tools/nested_dust.m index 98a94db7..10d34370 100644 --- a/Nesting_tools/nested_dust.m +++ b/Nesting_tools/nested_dust.m @@ -102,6 +102,10 @@ nc=netcdf(child_dust,'write'); disp('dust...') for tindex=1:length(dustt) interpvar3d(np,nc,igrd_r,jgrd_r,ichildgrd_r,jchildgrd_r,'dust',mask,tindex) + interpvar3d(np,nc,igrd_r,jgrd_r,ichildgrd_r,jchildgrd_r,'dustfer',mask,tindex) + interpvar3d(np,nc,igrd_r,jgrd_r,ichildgrd_r,jchildgrd_r,'dustpo4',mask,tindex) + interpvar3d(np,nc,igrd_r,jgrd_r,ichildgrd_r,jchildgrd_r,'dustsi',mask,tindex) + interpvar3d(np,nc,igrd_r,jgrd_r,ichildgrd_r,jchildgrd_r,'solubility2',mask,tindex) end result=close(np); result=close(nc); diff --git a/Nesting_tools/nested_ndepo.m b/Nesting_tools/nested_ndepo.m new file mode 100644 index 00000000..63d6f102 --- /dev/null +++ b/Nesting_tools/nested_ndepo.m @@ -0,0 +1,118 @@ +function nested_ndepo(child_grd,parent_ndepo,child_ndepo) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% compute the ndepo file (PISCES biogeochemical model) +% of the embedded grid +% +% Further Information: +% http://www.croco-ocean.org +% +% This file is part of CROCOTOOLS +% +% CROCOTOOLS is free software; you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published +% by the Free Software Foundation; either version 2 of the License, +% or (at your option) any later version. +% +% CROCOTOOLS is distributed in the hope that it will be useful, but +% WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this program; if not, write to the Free Software +% Foundation, Inc., 59 Temple Place, Suite 330, Boston, +% MA 02111-1307 USA +% +% Copyright (c) 2004-2006 by Pierrick Penven +% e-mail:Pierrick.Penven@ird.fr +% Update : Gildas Cambon: 13 Nov 2009 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +extrapmask=0; +% +% Title +% +title=['ndepo file for the embedded grid :',child_ndepo,... + ' using parent ndepo file: ',parent_ndepo]; +disp(' ') +disp(title) +% +% Read in the embedded grid +% +disp(' ') +disp(' Read in the embedded grid...') +nc=netcdf(child_grd); +parent_grd=nc.parent_grid(:); +imin=nc{'grd_pos'}(1); +imax=nc{'grd_pos'}(2); +jmin=nc{'grd_pos'}(3); +jmax=nc{'grd_pos'}(4); +refinecoeff=nc{'refine_coef'}(:); +result=close(nc); +nc=netcdf(parent_grd); +Lp=length(nc('xi_rho')); +Mp=length(nc('eta_rho')); +if extrapmask==1 + mask=nc{'mask_rho'}(:); +else + mask=[]; +end +result=close(nc); +% +% Read in the parent ndepo file +% +disp(' ') +disp(' Read in the parent ndepo file...') +nc = netcdf(parent_ndepo); +ndepot = nc{'ndepo_time'}(:); +ndepoc = nc{'ndepo_time'}.cycle_length(:); +result=close(nc); +% +% Create the ndepo file +% +disp(' ') +disp(' Create the ndepo file...') +create_nestedndepo(child_ndepo,parent_ndepo,child_grd,title,... + ndepot,ndepoc) +% +% parent indices +% +[igrd_r,jgrd_r]=meshgrid((1:1:Lp),(1:1:Mp)); +[igrd_p,jgrd_p]=meshgrid((1:1:Lp-1),(1:1:Mp-1)); +[igrd_u,jgrd_u]=meshgrid((1:1:Lp-1),(1:1:Mp)); +[igrd_v,jgrd_v]=meshgrid((1:1:Lp),(1:1:Mp-1)); +% +% the children indices +% +ipchild=(imin:1/refinecoeff:imax); +jpchild=(jmin:1/refinecoeff:jmax); +irchild=(imin+0.5-0.5/refinecoeff:1/refinecoeff:imax+0.5+0.5/refinecoeff); +jrchild=(jmin+0.5-0.5/refinecoeff:1/refinecoeff:jmax+0.5+0.5/refinecoeff); +[ichildgrd_p,jchildgrd_p]=meshgrid(ipchild,jpchild); +[ichildgrd_r,jchildgrd_r]=meshgrid(irchild,jrchild); +[ichildgrd_u,jchildgrd_u]=meshgrid(ipchild,jrchild); +[ichildgrd_v,jchildgrd_v]=meshgrid(irchild,jpchild); +% +% interpolations +% +disp(' ') +disp(' Do the interpolations...') +np=netcdf(parent_ndepo); +nc=netcdf(child_ndepo,'write'); +disp('ndepo...') +for tindex=1:length(ndepot) + interpvar3d(np,nc,igrd_r,jgrd_r,ichildgrd_r,jchildgrd_r,'ndepo',mask,tindex) + interpvar3d(np,nc,igrd_r,jgrd_r,ichildgrd_r,jchildgrd_r,'noyndepo',mask,tindex) + interpvar3d(np,nc,igrd_r,jgrd_r,ichildgrd_r,jchildgrd_r,'nhxndepo',mask,tindex) +end +result=close(np); +result=close(nc); +disp(' ') +disp(' Done ') +% +% Make a plot +% +disp(' ') +disp(' Make a plot...') +figure(1) +plot_nestndepo(child_ndepo,'ndepo',[1 6],1) diff --git a/Nesting_tools/nestgui.fig b/Nesting_tools/nestgui.fig index b6a22c1684e145f76caa30e670a28dcfc8018a03..4f5c4b92d7fd0473e92ea098b8dde0bf487acec2 100644 GIT binary patch literal 48005 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 literal 43757 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 VdH89MH&|_Ezv7gl*5MV~{{hq1s2TtO diff --git a/Nesting_tools/plot_nestndepo.m b/Nesting_tools/plot_nestndepo.m new file mode 100644 index 00000000..111a655a --- /dev/null +++ b/Nesting_tools/plot_nestndepo.m @@ -0,0 +1,83 @@ +function plot_nestndepo(child_ndepo,thefield,thetime,skip) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Test the embedded ndepo forcing file. +% +% Further Information: +% http://www.croco-ocean.org +% +% This file is part of CROCOTOOLS +% +% CROCOTOOLS is free software; you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published +% by the Free Software Foundation; either version 2 of the License, +% or (at your option) any later version. +% +% CROCOTOOLS is distributed in the hope that it will be useful, but +% WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this program; if not, write to the Free Software +% Foundation, Inc., 59 Temple Place, Suite 330, Boston, +% MA 02111-1307 USA +% +% Copyright (c) 2004-2006 by Pierrick Penven +% e-mail:Pierrick.Penven@ird.fr +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +npts=[0 0 0 0]; +i=0; +for time=thetime + i=i+1; + + subplot(2,length(thetime),i) + + + nc=netcdf(child_ndepo); + parent_ndepo=nc.parent_file(:); + child_grd=nc.grd_file(:); + fieldc=nc{thefield}(time,:,:); + fieldname=nc{thefield}.long_name(:); + result=close(nc); + + nc=netcdf(child_grd); + parent_grd=nc.parent_grid(:); + refinecoeff=nc{'refine_coef'}(:); + lonc=nc{'lon_rho'}(:); + latc=nc{'lat_rho'}(:); + mask=nc{'mask_rho'}(:); + result=close(nc); + mask(mask==0)=NaN; + pcolor(lonc,latc,mask.*fieldc) + shading flat + axis image + caxis([min(min(fieldc)) max(max(fieldc))]) + colorbar + axis([min(min(lonc)) max(max(lonc)) min(min(latc)) max(max(latc))]) + title(['\bf ',fieldname,' CHILD']) + + subplot(2,length(thetime),i+length(thetime)) + nc=netcdf(parent_ndepo); + field=nc{thefield}(time,:,:); + fieldname=nc{thefield}.long_name(:); + result=close(nc); + + nc=netcdf(parent_grd); + lon=nc{'lon_rho'}(:); + lat=nc{'lat_rho'}(:); + mask=nc{'mask_rho'}(:); + result=close(nc); + mask(mask==0)=NaN; + pcolor(lon,lat,mask.*field) + shading flat + axis image + caxis([min(min(fieldc)) max(max(fieldc))]) + colorbar + axis([min(min(lonc)) max(max(lonc)) min(min(latc)) max(max(latc))]) + title(['\bf ',fieldname,' PARENT']) +end + + +return diff --git a/Oforc_OGCM/create_OGCM.m b/Oforc_OGCM/create_OGCM.m index 88f04690..c4428922 100644 --- a/Oforc_OGCM/create_OGCM.m +++ b/Oforc_OGCM/create_OGCM.m @@ -1,12 +1,12 @@ function create_OGCM(fname,lonT,latT,lonU,latU,lonV,latV,depth,time,... - temp,salt,u,v,ssh,Yorig) + temp,salt,u,v,ssh,Yorig) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Create the OGCM file % -% Further Information: +% Further Information: % http://www.croco-ocean.org -% +% % This file is part of CROCOTOOLS % % CROCOTOOLS is free software; you can redistribute it and/or modify @@ -24,8 +24,8 @@ function create_OGCM(fname,lonT,latT,lonU,latU,lonV,latV,depth,time,... % Foundation, Inc., 59 Temple Place, Suite 330, Boston, % MA 02111-1307 USA % -% Copyright (c) 2005-2006 by Pierrick Penven -% e-mail:Pierrick.Penven@ird.fr +% Copyright (c) 2005-2006 by Pierrick Penven +% e-mail:Pierrick.Penven@ird.fr % % Updated 6-Sep-2006 by Pierrick Penven % Updated 7-Oct-2013 by Gildas Cambon @@ -120,8 +120,10 @@ nc{'depth'}=ncdouble('depth') ; nc{'depth'}.units=ncchar('meters'); nc{'depth'}.units='meters'; nc{'time'}=ncdouble('time') ; -eval(['nc{''time''}.units = ncchar(''days since 1-Jan-',num2str(Yorig),' 00:00:0.0'');']) -eval(['nc{''time''}.units = ''days since 1-Jan-',num2str(Yorig),' 00:00:0.0'';']) +eval(['nc{''time''}.units = ncchar(''days since ',sprintf('%04d', Yorig),'-01-01 00:00:00'');']) +eval(['nc{''time''}.units = ''days since ',sprintf('%04d', Yorig),'-01-01 00:00:00'';']) +nc{'time'}.calendar = ncchar('proleptic_gregorian'); +nc{'time'}.calendar = 'proleptic_gregorian'; endef(nc); % % File the file @@ -136,13 +138,13 @@ nc{'latV'}(:)=latV; nc{'lonV'}(:)=lonV; % for tndx=1:length(time) -% -nc{'time'}(tndx)=time(tndx); -% + % + nc{'time'}(tndx)=time(tndx); + % if length(time)==1 nc{'ssh'}(tndx,:,:)=ssh; -% nc{'taux'}(tndx,:,:)=taux; -% nc{'tauy'}(tndx,:,:)=tauy; + % nc{'taux'}(tndx,:,:)=taux; + % nc{'tauy'}(tndx,:,:)=tauy; u1=u; v1=v; nc{'u'}(tndx,:,:,:)=u1; @@ -151,8 +153,8 @@ nc{'time'}(tndx)=time(tndx); nc{'salt'}(tndx,:,:,:)=salt; else nc{'ssh'}(tndx,:,:)=squeeze(ssh(tndx,:,:)); -% nc{'taux'}(tndx,:,:)=squeeze(taux(tndx,:,:)); -% nc{'tauy'}(tndx,:,:)=squeeze(tauy(tndx,:,:)); + % nc{'taux'}(tndx,:,:)=squeeze(taux(tndx,:,:)); + % nc{'tauy'}(tndx,:,:)=squeeze(tauy(tndx,:,:)); u1=squeeze(u(tndx,:,:,:)); v1=squeeze(v(tndx,:,:,:)); nc{'u'}(tndx,:,:,:)=u1; @@ -160,35 +162,35 @@ nc{'time'}(tndx)=time(tndx); nc{'temp'}(tndx,:,:,:)=squeeze(temp(tndx,:,:,:)); nc{'salt'}(tndx,:,:,:)=squeeze(salt(tndx,:,:,:)); end -% -% Compute the barotropic velocities -% -masku=isfinite(u1); -maskv=isfinite(v1); -u1(isnan(u1))=0; -v1(isnan(v1))=0; -dz=gradient(depth); -NZ=length(depth); -du=0*squeeze(u1(1,:,:)); -zu=du; -dv=0*squeeze(v1(1,:,:)); -zv=dv; -for k=1:NZ - du=du+dz(k)*squeeze(u1(k,:,:)); - zu=zu+dz(k)*squeeze(masku(k,:,:)); - dv=dv+dz(k)*squeeze(v1(k,:,:)); - zv=zv+dz(k)*squeeze(maskv(k,:,:)); -end -du(zu==0)=NaN; -dv(zv==0)=NaN; -zu(zu==0)=NaN; -zv(zv==0)=NaN; -ubar=du./zu; -vbar=dv./zv; -% -nc{'ubar'}(tndx,:,:)=ubar; -nc{'vbar'}(tndx,:,:)=vbar; -% + % + % Compute the barotropic velocities + % + masku=isfinite(u1); + maskv=isfinite(v1); + u1(isnan(u1))=0; + v1(isnan(v1))=0; + dz=gradient(depth); + NZ=length(depth); + du=0*squeeze(u1(1,:,:)); + zu=du; + dv=0*squeeze(v1(1,:,:)); + zv=dv; + for k=1:NZ + du=du+dz(k)*squeeze(u1(k,:,:)); + zu=zu+dz(k)*squeeze(masku(k,:,:)); + dv=dv+dz(k)*squeeze(v1(k,:,:)); + zv=zv+dz(k)*squeeze(maskv(k,:,:)); + end + du(zu==0)=NaN; + dv(zv==0)=NaN; + zu(zu==0)=NaN; + zv(zv==0)=NaN; + ubar=du./zu; + vbar=dv./zv; + % + nc{'ubar'}(tndx,:,:)=ubar; + nc{'vbar'}(tndx,:,:)=vbar; + % end % close(nc) diff --git a/Oforc_OGCM/make_OGCM_SODA.m b/Oforc_OGCM/make_OGCM_SODA.m index f59e5e54..31a2f33e 100644 --- a/Oforc_OGCM/make_OGCM_SODA.m +++ b/Oforc_OGCM/make_OGCM_SODA.m @@ -6,10 +6,10 @@ % http://iridl.ldeo.columbia.edu./SOURCES/.CARTON-GIESE/.SODA/ % The on-line reference to ECCO is at % http://ecco.jpl.nasa.gov/cgi-bin/nph-dods/datasets/ -% -% Further Information: +% +% Further Information: % http://www.croco-ocean.org -% +% % This file is part of CROCOTOOLS % % CROCOTOOLS is free software; you can redistribute it and/or modify @@ -27,8 +27,8 @@ % Foundation, Inc., 59 Temple Place, Suite 330, Boston, % MA 02111-1307 USA % -% Copyright (c) 2005-2006 by Pierrick Penven -% e-mail:Pierrick.Penven@ird.fr +% Copyright (c) 2005-2006 by Pierrick Penven +% e-mail:Pierrick.Penven@ird.fr % % Contributions of P. Marchesiello (IRD), J. Lefevre (IRD), % and F. Colberg (UCT) @@ -46,18 +46,18 @@ close all % crocotools_param - % - % SODA DODS URL - % - % SODA_2.2.4/ [ C20R-2 1871-2008 / POP2.1 ] - %%url='http://iridl.ldeo.columbia.edu/SOURCES/.CARTON-GIESE/.SODA/.v2p2p4' ; - url='http://apdrc.soest.hawaii.edu:80/dods/public_data/SODA/soda_pop2.2.4' ; +% +% SODA DODS URL +% +% SODA_2.2.4/ [ C20R-2 1871-2008 / POP2.1 ] +%%url='http://iridl.ldeo.columbia.edu/SOURCES/.CARTON-GIESE/.SODA/.v2p2p4' ; +url='http://apdrc.soest.hawaii.edu:80/dods/public_data/SODA/soda_pop2.2.4' ; % itolap_tot=itolap_a + itolap_p; disp(['Overlap before =',num2str(itolap_a)]) disp(['Overlap after =',num2str(itolap_p)]) disp(['Total overlap =',num2str(itolap_tot)]) -disp(['...']) +disp(['...']) % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % end of user input parameters @@ -81,6 +81,10 @@ lat=nc{'lat_rho'}(:); angle=nc{'angle'}(:); h=nc{'h'}(:); close(nc) + +if ~strcmp(OGCM, 'SODA') + error('Error: OGCM must be "SODA" in crocotools_param.m. Exiting script.'); +end % % Extract data over the internet % @@ -94,16 +98,16 @@ if Download_data==1 latmax=max(max(lat)); % % Download data with DODS (the download matlab routine depends on the OGCM) - % + % disp('Download data...') - download_SODA(Ymin,Ymax,Mmin,Mmax,lonmin,lonmax,latmin,latmax,... - OGCM_dir,OGCM_prefix,url,Yorig) + download_SODA(Ymin,Ymax,Mmin,Mmax,lonmin,lonmax,latmin,latmax,... + OGCM_dir,OGCM_prefix,url,Yorig) end % %------------------------------------------------------------------------------------ % -% Get the OGCM grid -% +% Get the OGCM grid +% nc=netcdf([OGCM_dir,OGCM_prefix,'Y',num2str(Ymin),'M',num2str(Mmin),'.cdf'],'r'); lonT=nc{'lonT'}(:); latT=nc{'latT'}(:); @@ -117,18 +121,18 @@ NZ=NZ-rmdepth; Z=Z(1:NZ); close(nc) % -% Initial file +% Initial file % (the strategy is to start at the begining of a month) -% it is possible to do some temporal interpolation... +% it is possible to do some temporal interpolation... % but I am too lazy. lets start the first day of % month Mmin of year Ymin... with the first data available. % if makeini==1 - if ~exist('vtransform') - vtransform=1; %Old Vtransform - disp([' NO VTRANSFORM parameter found']) - disp([' USE vtransform default value Vtransfor = 1']) - end + if ~exist('vtransform') + vtransform=1; %Old Vtransform + disp([' NO VTRANSFORM parameter found']) + disp([' USE vtransform default value Vtransfor = 1']) + end ininame=[ini_prefix,'Y',num2str(Ymin),'M',num2str(sprintf(Mth_format,Mmin)),nc_suffix]; % % Process the time in Yorig time (i.e days since Yorig-01-01) @@ -136,29 +140,29 @@ if makeini==1 tini=datenum(Ymin,Mmin,1)-datenum(Yorig,1,1); disp(['Create an initial file for ',datestr(tini+datenum(Yorig,1,1));]) create_inifile(ininame,grdname,CROCO_title,... - theta_s,theta_b,hc,N,... - tini,'clobber', vtransform); - nc_add_globatt(ininame,Yorig,Mmin,Dmin,Hmin,Min_min,Smin,OGCM); + theta_s,theta_b,hc,N,... + tini,'clobber', vtransform,Yorig); + nc_add_globatt(ininame,Yorig,Mmin,Dmin,Hmin,Min_min,Smin,OGCM); nc_ini=netcdf(ininame,'write'); interp_OGCM(OGCM_dir,OGCM_prefix,Ymin,Mmin,Roa,interp_method,... - lonU,latU,lonV,latV,lonT,latT,Z,1,... - nc_ini,[],lon,lat,angle,h,1,obc,vtransform) + lonU,latU,lonV,latV,lonT,latT,Z,1,... + nc_ini,[],lon,lat,angle,h,1,obc,vtransform) close(nc_ini) end % -% Clim and Bry files +% Clim and Bry files % if makeclim==1 | makebry==1 - if ~exist('vtransform') - vtransform=1; %Old Vtransform - disp([' NO VTRANSFORM parameter found']) - disp([' USE vtransform default value Vtransfor = 1']) - end + if ~exist('vtransform') + vtransform=1; %Old Vtransform + disp([' NO VTRANSFORM parameter found']) + disp([' USE vtransform default value Vtransfor = 1']) + end % % Loop on the years and the months % for Y=Ymin:Ymax - if Y==Ymin + if Y==Ymin mo_min=Mmin; else mo_min=1; @@ -171,100 +175,100 @@ if makeclim==1 | makebry==1 for M=mo_min:mo_max disp(' ') disp(['Processing year ',num2str(Y),... - ' - month ',num2str(sprintf(Mth_format,M))]) + ' - month ',num2str(sprintf(Mth_format,M))]) disp(' ') % Mm=M-1;Ym=Y; if Mm==0 - Mm=12; - Ym=Y-1; + Mm=12; + Ym=Y-1; end Mp=M+1;Yp=Y; if Mp==13 - Mp=1; - Yp=Y+1; + Mp=1; + Yp=Y+1; end % - % Add 2 times step in the CROCO files: 1 at the beginning and 1 at the end + % Add 2 times step in the CROCO files: 1 at the beginning and 1 at the end % nc=netcdf([OGCM_dir,OGCM_prefix,'Y',num2str(Y),'M',num2str(M),'.cdf'],'r'); OGCM_time=nc{'time'}(:); ntimes=length(OGCM_time); if ntimes==1 - dt=30; % monthly files (SODA..) + dt=30; % monthly files (SODA..) itolap_a=1; itolap_p=1; itolap_tot=itolap_a + itolap_p; disp(['Reduced overlap for monthly SODA files']) disp(['...']) else - dt=max(gradient(OGCM_time)); + dt=max(gradient(OGCM_time)); end % %% Fill the time axis % croco_time=0*(1:ntimes+itolap_tot); - %Current month + %Current month croco_time(itolap_a+1:end-itolap_p)=OGCM_time; % %Previous month % disp(['===================================']) for aa= 1:itolap_a - disp(['Compute beginning overlap, time index:',num2str(aa)]) - disp(['Add ',num2str(-(itolap_a + 1 - aa)), ' timestep dt']) - disp(['--------']) - croco_time(aa) = croco_time(itolap_a+1) - ((itolap_a + 1 - aa).* dt); + disp(['Compute beginning overlap, time index:',num2str(aa)]) + disp(['Add ',num2str(-(itolap_a + 1 - aa)), ' timestep dt']) + disp(['--------']) + croco_time(aa) = croco_time(itolap_a+1) - ((itolap_a + 1 - aa).* dt); end % - %Next month + %Next month % - disp(['===================================']) + disp(['===================================']) for aa= 1:itolap_p - disp(['Compute end overlap, time index:',num2str(ntimes+itolap_tot - itolap_p + aa)]) - disp(['Add ',num2str(aa), ' timestep dt']) - disp(['--------']) - croco_time(end - itolap_p + aa ) = croco_time(end - itolap_p) + aa.* dt; + disp(['Compute end overlap, time index:',num2str(ntimes+itolap_tot - itolap_p + aa)]) + disp(['Add ',num2str(aa), ' timestep dt']) + disp(['--------']) + croco_time(end - itolap_p + aa ) = croco_time(end - itolap_p) + aa.* dt; end disp(['===================================']) close(nc) - %----------------------------------------------------- + %----------------------------------------------------- % % Create and open the CROCO files % if makebry==1 - bryname=[bry_prefix,'Y',num2str(Y),... - 'M',num2str(sprintf(Mth_format,M)),nc_suffix]; - create_bryfile(bryname,grdname,CROCO_title,[1 1 1 1],... - theta_s,theta_b,hc,N,... - croco_time,0,'clobber',vtransform); - nc_add_globatt(bryname,Yorig,Mmin,Dmin,Hmin,Min_min,Smin,OGCM); - nc_bry=netcdf(bryname,'write'); + bryname=[bry_prefix,'Y',num2str(Y),... + 'M',num2str(sprintf(Mth_format,M)),nc_suffix]; + create_bryfile(bryname,grdname,CROCO_title,[1 1 1 1],... + theta_s,theta_b,hc,N,... + croco_time,0,'clobber',vtransform,Yorig); + nc_add_globatt(bryname,Yorig,Mmin,Dmin,Hmin,Min_min,Smin,OGCM); + nc_bry=netcdf(bryname,'write'); else - nc_bry=[]; + nc_bry=[]; end if makeclim==1 - clmname=[clm_prefix,'Y',num2str(Y),... - 'M',num2str(sprintf(Mth_format,M)),nc_suffix]; - create_climfile(clmname,grdname,CROCO_title,... - theta_s,theta_b,hc,N,croco_time,0,'clobber',vtransform); - nc_add_globatt(clmname,Yorig,Mmin,Dmin,Hmin,Min_min,Smin,OGCM); - nc_clm=netcdf(clmname,'write'); + clmname=[clm_prefix,'Y',num2str(Y),... + 'M',num2str(sprintf(Mth_format,M)),nc_suffix]; + create_climfile(clmname,grdname,CROCO_title,... + theta_s,theta_b,hc,N,croco_time,0,'clobber',vtransform,Yorig); + nc_add_globatt(clmname,Yorig,Mmin,Dmin,Hmin,Min_min,Smin,OGCM); + nc_clm=netcdf(clmname,'write'); else - nc_clm=[]; + nc_clm=[]; end % % Check if there are OGCM files for the previous Month % fname=[OGCM_dir,OGCM_prefix,'Y',num2str(Ym),'M',num2str(Mm),'.cdf']; if exist(fname)==0 - disp([' No data for the previous month: using current month']) - Mm=M; - Ym=Y; - tndx_OGCM=ones(itolap_a,1); + disp([' No data for the previous month: using current month']) + Mm=M; + Ym=Y; + tndx_OGCM=ones(itolap_a,1); else - nc=netcdf(fname,'r'); - tndx_OGCM=[(length(nc('time'))- (itolap_a -1) ):1: (length(nc('time')))]; - close(nc) + nc=netcdf(fname,'r'); + tndx_OGCM=[(length(nc('time'))- (itolap_a -1) ):1: (length(nc('time')))]; + close(nc) end % % Perform the interpolations for the previous month @@ -272,11 +276,11 @@ if makeclim==1 | makebry==1 disp(' Previous month :') disp('=================') for aa=1:itolap_a - disp(['Beg overlap # ', num2str(aa),' -> tindex ',num2str(aa)]) - disp(['It. of prev month used for it= ',num2str(tndx_OGCM(aa))]) - interp_OGCM(OGCM_dir,OGCM_prefix,Ym,Mm,Roa,interp_method,... - lonU,latU,lonV,latV,lonT,latT,Z,tndx_OGCM(aa),... - nc_clm,nc_bry,lon,lat,angle,h,aa,obc,vtransform) + disp(['Beg overlap # ', num2str(aa),' -> tindex ',num2str(aa)]) + disp(['It. of prev month used for it= ',num2str(tndx_OGCM(aa))]) + interp_OGCM(OGCM_dir,OGCM_prefix,Ym,Mm,Roa,interp_method,... + lonU,latU,lonV,latV,lonT,latT,Z,tndx_OGCM(aa),... + nc_clm,nc_bry,lon,lat,angle,h,aa,obc,vtransform) end % % Perform the interpolations for the current month @@ -285,26 +289,26 @@ if makeclim==1 | makebry==1 disp(' Current month :') disp('================') for tndx_OGCM=1:ntimes - disp([' Time step : ',num2str(tndx_OGCM),' of ',num2str(ntimes),' :']) - interp_OGCM(OGCM_dir,OGCM_prefix,Y,M,Roa,interp_method,... - lonU,latU,lonV,latV,lonT,latT,Z,tndx_OGCM,... - nc_clm,nc_bry,lon,lat,angle,h,tndx_OGCM+itolap_a,obc,vtransform) + disp([' Time step : ',num2str(tndx_OGCM),' of ',num2str(ntimes),' :']) + interp_OGCM(OGCM_dir,OGCM_prefix,Y,M,Roa,interp_method,... + lonU,latU,lonV,latV,lonT,latT,Z,tndx_OGCM,... + nc_clm,nc_bry,lon,lat,angle,h,tndx_OGCM+itolap_a,obc,vtransform) end % % Read the OGCM file for the next month % fname=[OGCM_dir,OGCM_prefix,'Y',num2str(Yp),'M',num2str(Mp),'.cdf']; if exist(fname)==0 - disp([' No data for the next month: using current month']) - Mp=M; - Yp=Y; - for aa=1:itolap_p - tndx_OGCM(aa)=ntimes; - end + disp([' No data for the next month: using current month']) + Mp=M; + Yp=Y; + for aa=1:itolap_p + tndx_OGCM(aa)=ntimes; + end else - for aa=1:itolap_p - tndx_OGCM(aa)=aa; - end; + for aa=1:itolap_p + tndx_OGCM(aa)=aa; + end; end % % Perform the interpolations for the next month @@ -312,20 +316,20 @@ if makeclim==1 | makebry==1 disp(' Next month :') disp('=============') for aa=1:itolap_p - disp(['End Overlap #',num2str(aa),' -> tindex ',num2str(ntimes+itolap_a+aa)]) - disp(['It. of next month used for it= ',num2str(tndx_OGCM(aa))]) - interp_OGCM(OGCM_dir,OGCM_prefix,Yp,Mp,Roa,interp_method,... - lonU,latU,lonV,latV,lonT,latT,Z,tndx_OGCM(aa),... - nc_clm,nc_bry,lon,lat,angle,h,ntimes+itolap_a+aa,obc,vtransform) + disp(['End Overlap #',num2str(aa),' -> tindex ',num2str(ntimes+itolap_a+aa)]) + disp(['It. of next month used for it= ',num2str(tndx_OGCM(aa))]) + interp_OGCM(OGCM_dir,OGCM_prefix,Yp,Mp,Roa,interp_method,... + lonU,latU,lonV,latV,lonT,latT,Z,tndx_OGCM(aa),... + nc_clm,nc_bry,lon,lat,angle,h,ntimes+itolap_a+aa,obc,vtransform) end % % Close the CROCO files % if ~isempty(nc_clm) - close(nc_clm); + close(nc_clm); end if ~isempty(nc_bry) - close(nc_bry); + close(nc_bry); end % end @@ -345,7 +349,7 @@ if SPIN_Long>0 % ininame=[ini_prefix,'Y',num2str(Ymin),'M',num2str(sprintf(Mth_format,Mmin)),nc_suffix]; ininame2=[ini_prefix,'Y',num2str(Ymin-SPIN_Long),'M',num2str(sprintf(Mth_format,M)),nc_suffix]; - disp(['Create ',ininame2]) + disp(['Create ',ininame2]) eval(['!cp ',ininame,' ',ininame2]) % % Change the time @@ -361,7 +365,7 @@ if SPIN_Long>0 for month=1:12*SPIN_Long M=M+1; if M==13 - M=1; + M=1; Y=Y+1; end % @@ -373,8 +377,8 @@ if SPIN_Long>0 % clmname=[clm_prefix,'Y',num2str(Ymin),'M',num2str(sprintf(Mth_format,M)),nc_suffix]; clmname2=[clm_prefix,'Y',num2str(Y),'M',num2str(sprintf(Mth_format,M)),nc_suffix]; - disp(['Create ',clmname2]) - eval(['!cp ',clmname,' ',clmname2]) + disp(['Create ',clmname2]) + eval(['!cp ',clmname,' ',clmname2]) % % Change the time % @@ -401,8 +405,8 @@ if SPIN_Long>0 % bryname=[bry_prefix,'Y',num2str(Ymin),'M',num2str(sprintf(Mth_format,M)),nc_suffix]; bryname2=[bry_prefix,'Y',num2str(Y),'M',num2str(sprintf(Mth_format,M)),nc_suffix]; - disp(['Create ',bryname2]) - eval(['!cp ',bryname,' ',bryname2]) + disp(['Create ',bryname2]) + eval(['!cp ',bryname,' ',bryname2]) % % Change the time % diff --git a/Oforc_OGCM/make_OGCM_mercator.m b/Oforc_OGCM/make_OGCM_mercator.m index 687dcdbf..f7243368 100644 --- a/Oforc_OGCM/make_OGCM_mercator.m +++ b/Oforc_OGCM/make_OGCM_mercator.m @@ -1,6 +1,6 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % -% Create and fill CROCO clim and bry files with OGCM +% Create and fill CROCO clim and bry files with OGCM % MERCATOR data. % % On crocotools_param.m, available datasets: @@ -17,10 +17,10 @@ % (more than 15days from now : Best analysis) % % Online reference to MERCATOR is at http://marine.copernicus.eu -% -% Further Information: +% +% Further Information: % http://www.croco-ocean.org -% +% % This file is part of CROCOTOOLS % % CROCOTOOLS is free software; you can redistribute it and/or modify @@ -38,8 +38,8 @@ % Foundation, Inc., 59 Temple Place, Suite 330, Boston, % MA 02111-1307 USA % -% Copyright (c) 2005-2006 by Pierrick Penven -% e-mail:Pierrick.Penven@ird.fr +% Copyright (c) 2005-2006 by Pierrick Penven +% e-mail:Pierrick.Penven@ird.fr % % Contributions of P. Marchesiello (IRD), J. Lefevre (IRD), % and F. Colberg (UCT) @@ -68,7 +68,7 @@ itolap_tot=itolap_a + itolap_p; disp(['Overlap before =',num2str(itolap_a)]) disp(['Overlap after =',num2str(itolap_p)]) disp(['Total overlap =',num2str(itolap_tot)]) -disp(['...']) +disp(['...']) % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % end of user input parameters @@ -78,10 +78,10 @@ disp(['===================']) disp([' Compute time axis ']) disp(['===================']) if level==0 - nc_suffix='.nc'; + nc_suffix='.nc'; else - nc_suffix=['.nc.',num2str(level)]; - grdname=[grdname,'.',num2str(level)]; + nc_suffix=['.nc.',num2str(level)]; + grdname=[grdname,'.',num2str(level)]; end % % Get the model grid @@ -93,6 +93,10 @@ angle=nc{'angle'}(:); h=nc{'h'}(:); close(nc) % +if ~strcmp(OGCM, 'mercator') + error('Error: OGCM must be "mercator" in crocotools_param.m. Exiting script.'); + end +% % Extract data over the internet % if Download_data==1 @@ -105,7 +109,7 @@ if Download_data==1 latmax=max(max(lat)); % % Download data with DODS (the download matlab routine depends on the OGCM) - % + % disp('Download data...') % Loop on the years % @@ -122,20 +126,20 @@ if Download_data==1 mo_max=12; end for M=mo_min:mo_max - thedatemonth=['Y',num2str(Y),'M',num2str(M)]; + thedatemonth=['Y',num2str(Y),'M',num2str(M)]; download_mercator_python(pathCMC,user,password,mercator_type,... - product_id, ... - Y,M, ... - lonmin,lonmax,latmin,latmax,hmax, ... - OGCM_dir,OGCM_prefix,thedatemonth,Yorig) + product_id, ... + Y,M, ... + lonmin,lonmax,latmin,latmax,hmax, ... + OGCM_dir,OGCM_prefix,thedatemonth,Yorig) end - end %End loop over month and years for the downloading with python/motu client + end %End loop over month and years for the downloading with python/motu client end %End loop for Download_data % %------------------------------------------------------------------------------------ % -% Get the OGCM grid -% +% Get the OGCM grid +% nc=netcdf([OGCM_dir,OGCM_prefix,'Y',num2str(Ymin),'M',num2str(Mmin),'.cdf']); lonT=nc{'lonT'}(:); latT=nc{'latT'}(:); @@ -149,9 +153,9 @@ NZ=NZ-rmdepth; Z=Z(1:NZ); close(nc) % -% Initial file +% Initial file % (the strategy is to start at the begining of a month) -% it is possible to do some temporal interpolation... +% it is possible to do some temporal interpolation... % but I am too lazy. lets start the first day of % month Mmin of year Ymin... with the first data available. % @@ -161,25 +165,25 @@ if makeini==1 disp([' NO VTRANSFORM parameter found']) disp([' USE vtransform default value Vtransfor = 1']) end - ininame=[ini_prefix,'Y',num2str(Ymin),'M',num2str(sprintf(Mth_format,Mmin)),nc_suffix]; - % - % Process the time in Yorig time (i.e days since Yorig-01-01) - % - tini=datenum(Ymin,Mmin,1)-datenum(Yorig,1,1); - disp([' ']) - disp(['=> Create an initial file for ',datestr(tini+datenum(Yorig,1,1));]) - create_inifile(ininame,grdname,CROCO_title,... - theta_s,theta_b,hc,N,... - tini,'clobber', vtransform); - nc_ini=netcdf(ininame,'write'); - interp_OGCM(OGCM_dir,OGCM_prefix,Ymin,Mmin,Roa,interp_method,... - lonU,latU,lonV,latV,lonT,latT,Z,1,... - nc_ini,[],lon,lat,angle,h,1,obc,vtransform) - nc_add_globatt(ininame,Yorig,Mmin,Dmin,Hmin,Min_min,Smin,OGCM); - close(nc_ini) + ininame=[ini_prefix,'Y',num2str(Ymin),'M',num2str(sprintf(Mth_format,Mmin)),nc_suffix]; + % + % Process the time in Yorig time (i.e days since Yorig-01-01) + % + tini=datenum(Ymin,Mmin,1)-datenum(Yorig,1,1); + disp([' ']) + disp(['=> Create an initial file for ',datestr(tini+datenum(Yorig,1,1));]) + create_inifile(ininame,grdname,CROCO_title,... + theta_s,theta_b,hc,N,... + tini,'clobber', vtransform,Yorig); + nc_ini=netcdf(ininame,'write'); + interp_OGCM(OGCM_dir,OGCM_prefix,Ymin,Mmin,Roa,interp_method,... + lonU,latU,lonV,latV,lonT,latT,Z,1,... + nc_ini,[],lon,lat,angle,h,1,obc,vtransform) + nc_add_globatt(ininame,Yorig,Mmin,Dmin,Hmin,Min_min,Smin,OGCM); + close(nc_ini) end % -% Clim and Bry files +% Clim and Bry files % if makeclim==1 | makebry==1 if ~exist('vtransform') @@ -187,297 +191,302 @@ if makeclim==1 | makebry==1 disp([' NO VTRANSFORM parameter found']) disp([' USE vtransform default value Vtransfor = 1']) end - % - % Loop on the years and the months - % - for Y=Ymin:Ymax - if Y==Ymin - mo_min=Mmin; - else - mo_min=1; - end - if Y==Ymax - mo_max=Mmax; - else - mo_max=12; - end - for M=mo_min:mo_max - disp(' ') - disp(['Processing year ',num2str(Y),... - ' - month ',num2str(M)]) - disp(' ') - % - Mm=M-1;Ym=Y; - if Mm==0 - Mm=12; - Ym=Y-1; - end - Mp=M+1;Yp=Y; - if Mp==13 - Mp=1; - Yp=Y+1; - end - % - % Add 2 times step in the CROCO files: 1 at the beginning and 1 at the end - % - nc=netcdf([OGCM_dir,OGCM_prefix,'Y',num2str(Y),'M',num2str(M),'.cdf']); - OGCM_time=nc{'time'}(:); - ntimes=length(OGCM_time); - if ntimes==1 - dt=30; % monthly files - itolap_a=1; itolap_p=1; - itolap_tot=itolap_a + itolap_p; - disp(['Reduced overlap for monthly files']) - disp(['...']) - else - dt=max(gradient(OGCM_time)); - end - % - %% Fill the time axis - % - croco_time=0*(1:ntimes+itolap_tot); - %Current month - croco_time(itolap_a+1:end-itolap_p)=OGCM_time; - % - %Previous month - % - disp(['===================================']) - for aa= 1:itolap_a - disp(['Compute beginning overlap, time index:',num2str(aa)]) - disp(['Add ',num2str(-(itolap_a + 1 - aa)), ' timestep dt']) - disp(['--------']) - croco_time(aa) = croco_time(itolap_a+1) - ((itolap_a + 1 - aa).* dt); - end - % - %Next month - % - disp(['===================================']) - for aa= 1:itolap_p - disp(['Compute end overlap, time index:',num2str(ntimes+itolap_tot - itolap_p + aa)]) - disp(['Add ',num2str(aa), ' timestep dt']) - disp(['--------']) - croco_time(end - itolap_p + aa ) = croco_time(end - itolap_p) + aa.* dt; - end - disp(['===================================']) - close(nc) - %----------------------------------------------------- - % - % Create and open the CROCO files - % - if makebry==1 - bryname=[bry_prefix,'Y',num2str(Y),... - 'M',num2str(sprintf(Mth_format,M)),nc_suffix]; - disp([' ']) - disp(['=> Create bry file : ', bryname ]) - create_bryfile(bryname,grdname,CROCO_title,[1 1 1 1],... - theta_s,theta_b,hc,N,... - croco_time,0,'clobber',vtransform); - nc_add_globatt(bryname,Yorig,Mmin,Dmin,Hmin,Min_min,Smin,OGCM); - nc_bry=netcdf(bryname,'write'); - else - nc_bry=[]; - end - if makeclim==1 - clmname=[clm_prefix,'Y',num2str(Y),... - 'M',num2str(sprintf(Mth_format,M)),nc_suffix]; - create_climfile(clmname,grdname,CROCO_title,... - theta_s,theta_b,hc,N,... - croco_time,0,'clobber',vtransform); - nc_add_globatt(clmname,Yorig,Mmin,Dmin,Hmin,Min_min,Smin,OGCM); - nc_clm=netcdf(clmname,'write'); - else - nc_clm=[]; - end - % - % Check if there are OGCM files for the previous Month - % - fname=[OGCM_dir,OGCM_prefix,'Y',num2str(Ym),'M',num2str(Mm),'.cdf']; - if exist(fname)==0 - disp([' No data for the previous month: using current month']) - Mm=M; - Ym=Y; - tndx_OGCM=ones(itolap_a,1); - else - nc=netcdf(fname); - tndx_OGCM=[(length(nc('time'))- (itolap_a -1) ):1: (length(nc('time')))]; - close(nc) - end - % - % Perform the interpolations for the previous month - % - disp(' Previous month :') - disp('=================') - for aa=1:itolap_a - disp(['Beg overlap # ', num2str(aa),' -> tindex ',num2str(aa)]) - disp(['It. of prev month used for it= ',num2str(tndx_OGCM(aa))]) - interp_OGCM(OGCM_dir,OGCM_prefix,Ym,Mm,Roa,interp_method,... - lonU,latU,lonV,latV,lonT,latT,Z,tndx_OGCM(aa),... - nc_clm,nc_bry,lon,lat,angle,h,aa,obc,vtransform) - end - % - % Perform the interpolations for the current month - % + % + % Loop on the years and the months + % + for Y=Ymin:Ymax + if Y==Ymin + mo_min=Mmin; + else + mo_min=1; + end + if Y==Ymax + mo_max=Mmax; + else + mo_max=12; + end + for M=mo_min:mo_max + disp(' ') + disp(['Processing year ',num2str(Y),... + ' - month ',num2str(M)]) + disp(' ') + % + Mm=M-1;Ym=Y; + if Mm==0 + Mm=12; + Ym=Y-1; + end + Mp=M+1;Yp=Y; + if Mp==13 + Mp=1; + Yp=Y+1; + end + % + % Add 2 times step in the CROCO files: 1 at the beginning and 1 at the end + % + nc=netcdf([OGCM_dir,OGCM_prefix,'Y',num2str(Y),'M',num2str(M),'.cdf']); + OGCM_time=nc{'time'}(:); + ntimes=length(OGCM_time); + if ntimes==1 + dt = eomday(Y, M); % monthly files + %disp(['Number of days of the given month: ',num2str(dt)]); + if strcmp(OGCM, 'mercator') + dt = eomday(Y, M) + 1 ; % add +1 days to avoid problems + % with mercator starting at first days month + end + itolap_a=1; itolap_p=1; + itolap_tot=itolap_a + itolap_p; + disp(['Reduced overlap for monthly files']) + disp(['...']) + else + dt=max(gradient(OGCM_time)); + end + % + %Fill the time axis + % + croco_time=0*(1:ntimes+itolap_tot); + %Current month + croco_time(itolap_a+1:end-itolap_p)=OGCM_time; + % + %Previous month + % + disp(['===================================']) + for aa= 1:itolap_a + disp(['Compute beginning overlap, time index:',num2str(aa)]) + disp(['Add ',num2str(-(itolap_a + 1 - aa)), ' timestep dt']) + disp(['--------']) + croco_time(aa) = croco_time(itolap_a+1) - ((itolap_a + 1 - aa).* dt); + end + % + %Next month + % + disp(['===================================']) + for aa= 1:itolap_p + disp(['Compute end overlap, time index:',num2str(ntimes+itolap_tot - itolap_p + aa)]) + disp(['Add ',num2str(aa), ' timestep dt']) + disp(['--------']) + croco_time(end - itolap_p + aa ) = croco_time(end - itolap_p) + aa.* dt; + end + disp(['===================================']) + close(nc) + %----------------------------------------------------- + % + % Create and open the CROCO files + % + if makebry==1 + bryname=[bry_prefix,'Y',num2str(Y),... + 'M',num2str(sprintf(Mth_format,M)),nc_suffix]; + disp([' ']) + disp(['=> Create bry file : ', bryname ]) + create_bryfile(bryname,grdname,CROCO_title,[1 1 1 1],... + theta_s,theta_b,hc,N,... + croco_time,0,'clobber',vtransform,Yorig); + nc_add_globatt(bryname,Yorig,Mmin,Dmin,Hmin,Min_min,Smin,OGCM); + nc_bry=netcdf(bryname,'write'); + else + nc_bry=[]; + end + if makeclim==1 + clmname=[clm_prefix,'Y',num2str(Y),... + 'M',num2str(sprintf(Mth_format,M)),nc_suffix]; + create_climfile(clmname,grdname,CROCO_title,... + theta_s,theta_b,hc,N,... + croco_time,0,'clobber',vtransform,Yorig); + nc_add_globatt(clmname,Yorig,Mmin,Dmin,Hmin,Min_min,Smin,OGCM); + nc_clm=netcdf(clmname,'write'); + else + nc_clm=[]; + end + % + % Check if there are OGCM files for the previous Month + % + fname=[OGCM_dir,OGCM_prefix,'Y',num2str(Ym),'M',num2str(Mm),'.cdf']; + if exist(fname)==0 + disp([' No data for the previous month: using current month']) + Mm=M; + Ym=Y; + tndx_OGCM=ones(itolap_a,1); + else + nc=netcdf(fname); + tndx_OGCM=[(length(nc('time'))- (itolap_a -1) ):1: (length(nc('time')))]; + close(nc) + end + % + % Perform the interpolations for the previous month + % + disp(' Previous month :') + disp('=================') + for aa=1:itolap_a + disp(['Beg overlap # ', num2str(aa),' -> tindex ',num2str(aa)]) + disp(['It. of prev month used for it= ',num2str(tndx_OGCM(aa))]) + interp_OGCM(OGCM_dir,OGCM_prefix,Ym,Mm,Roa,interp_method,... + lonU,latU,lonV,latV,lonT,latT,Z,tndx_OGCM(aa),... + nc_clm,nc_bry,lon,lat,angle,h,aa,obc,vtransform) + end + % + % Perform the interpolations for the current month + % - disp(' Current month :') - disp('================') - for tndx_OGCM=1:ntimes - disp([' Time step : ',num2str(tndx_OGCM),' of ',num2str(ntimes),' :']) - interp_OGCM(OGCM_dir,OGCM_prefix,Y,M,Roa,interp_method,... - lonU,latU,lonV,latV,lonT,latT,Z,tndx_OGCM,... - nc_clm,nc_bry,lon,lat,angle,h,tndx_OGCM+itolap_a,obc,vtransform) - end - % - % Read the OGCM file for the next month - % - fname=[OGCM_dir,OGCM_prefix,'Y',num2str(Yp),'M',num2str(Mp),'.cdf']; - if exist(fname)==0 - disp([' No data for the next month: using current month']) - Mp=M; - Yp=Y; - for aa=1:itolap_p - tndx_OGCM(aa)=ntimes; - end - else - for aa=1:itolap_p - tndx_OGCM(aa)=aa; - end; - end - % - % Perform the interpolations for the next month - % - disp(' Next month :') - disp('=============') - for aa=1:itolap_p - disp(['End Overlap #',num2str(aa),' -> tindex ',num2str(ntimes+itolap_a+aa)]) - disp(['It. of next month used for it= ',num2str(tndx_OGCM(aa))]) - interp_OGCM(OGCM_dir,OGCM_prefix,Yp,Mp,Roa,interp_method,... - lonU,latU,lonV,latV,lonT,latT,Z,tndx_OGCM(aa),... - nc_clm,nc_bry,lon,lat,angle,h,ntimes+itolap_a+aa,obc,vtransform) - end - % - % Close the CROCO files - % - if ~isempty(nc_clm) - close(nc_clm); - end - if ~isempty(nc_bry) - close(nc_bry); - end - % + disp(' Current month :') + disp('================') + for tndx_OGCM=1:ntimes + disp([' Time step : ',num2str(tndx_OGCM),' of ',num2str(ntimes),' :']) + interp_OGCM(OGCM_dir,OGCM_prefix,Y,M,Roa,interp_method,... + lonU,latU,lonV,latV,lonT,latT,Z,tndx_OGCM,... + nc_clm,nc_bry,lon,lat,angle,h,tndx_OGCM+itolap_a,obc,vtransform) + end + % + % Read the OGCM file for the next month + % + fname=[OGCM_dir,OGCM_prefix,'Y',num2str(Yp),'M',num2str(Mp),'.cdf']; + if exist(fname)==0 + disp([' No data for the next month: using current month']) + Mp=M; + Yp=Y; + for aa=1:itolap_p + tndx_OGCM(aa)=ntimes; + end + else + for aa=1:itolap_p + tndx_OGCM(aa)=aa; + end; + end + % + % Perform the interpolations for the next month + % + disp(' Next month :') + disp('=============') + for aa=1:itolap_p + disp(['End Overlap #',num2str(aa),' -> tindex ',num2str(ntimes+itolap_a+aa)]) + disp(['It. of next month used for it= ',num2str(tndx_OGCM(aa))]) + interp_OGCM(OGCM_dir,OGCM_prefix,Yp,Mp,Roa,interp_method,... + lonU,latU,lonV,latV,lonT,latT,Z,tndx_OGCM(aa),... + nc_clm,nc_bry,lon,lat,angle,h,ntimes+itolap_a+aa,obc,vtransform) + end + % + % Close the CROCO files + % + if ~isempty(nc_clm) + close(nc_clm); + end + if ~isempty(nc_bry) + close(nc_bry); + end + % + end end - end end % % Spin-up: (reproduce the first year 'SPIN_Long' times) % just copy the files for the first year and change the time % if SPIN_Long>0 - % - % Initial file - % - if makeini==1 % - % Copy the file - % - ininame=[ini_prefix,'Y',num2str(Ymin),'M',num2str(sprintf(Mth_format,Mmin)),nc_suffix]; - ininame2=[ini_prefix,'Y',num2str(Ymin-SPIN_Long),'M',num2str(sprintf(Mth_format,Mmin)),nc_suffix]; - disp(['Create ',ininame2]) - eval(['!cp ',ininame,' ',ininame2]) + % Initial file % - % Change the time - % - nc=netcdf(ininame2,'write'); - time=nc{'scrum_time'}(:)-365.*SPIN_Long*(24*3600); - nc{'scrum_time'}(:)=time; - close(nc) - end - % - M=Mmin-1; - Y=Ymin-SPIN_Long; - for month=1:12*SPIN_Long - M=M+1; - if M==13 - M=1; - Y=Y+1; + if makeini==1 + % + % Copy the file + % + ininame=[ini_prefix,'Y',num2str(Ymin),'M',num2str(sprintf(Mth_format,Mmin)),nc_suffix]; + ininame2=[ini_prefix,'Y',num2str(Ymin-SPIN_Long),'M',num2str(sprintf(Mth_format,Mmin)),nc_suffix]; + disp(['Create ',ininame2]) + eval(['!cp ',ininame,' ',ininame2]) + % + % Change the time + % + nc=netcdf(ininame2,'write'); + time=nc{'scrum_time'}(:)-365.*SPIN_Long*(24*3600); + nc{'scrum_time'}(:)=time; + close(nc) end % - % Climatology files - % - if makeclim==1 - % - % Copy the file - % - clmname=[clm_prefix,'Y',num2str(Ymin),'M',num2str(sprintf(Mth_format,M)),nc_suffix]; - clmname2=[clm_prefix,'Y',num2str(Y),'M',num2str(sprintf(Mth_format,M)),nc_suffix]; - disp(['Create ',clmname2]) - eval(['!cp ',clmname,' ',clmname2]) - % - % Change the time - % - nc=netcdf(clmname2,'write'); - time=nc{'tclm_time'}(:)-365.*(Ymin-Y); - nc{'tclm_time'}(:)=time; - nc{'temp_time'}(:)=time; - nc{'sclm_time'}(:)=time; - nc{'salt_time'}(:)=time; - nc{'uclm_time'}(:)=time; - nc{'vclm_time'}(:)=time; - nc{'v2d_time'}(:)=time; - nc{'v3d_time'}(:)=time; - nc{'ssh_time'}(:)=time; - nc{'zeta_time'}(:)=time; - close(nc) - end - % - % Boundary files - % - if makebry==1 - % - % Copy the file - % - bryname=[bry_prefix,'Y',num2str(Ymin),'M',num2str(sprintf(Mth_format,M)),nc_suffix]; - bryname2=[bry_prefix,'Y',num2str(Y),'M',num2str(sprintf(Mth_format,M)),nc_suffix]; - disp(['Create ',bryname2]) - eval(['!cp ',bryname,' ',bryname2]) - % - % Change the time - % - nc=netcdf(bryname2,'write'); - time=nc{'bry_time'}(:)-365.*(Ymin-Y); - nc{'bry_time'}(:)=time; - close(nc) + M=Mmin-1; + Y=Ymin-SPIN_Long; + for month=1:12*SPIN_Long + M=M+1; + if M==13 + M=1; + Y=Y+1; + end + % + % Climatology files + % + if makeclim==1 + % + % Copy the file + % + clmname=[clm_prefix,'Y',num2str(Ymin),'M',num2str(sprintf(Mth_format,M)),nc_suffix]; + clmname2=[clm_prefix,'Y',num2str(Y),'M',num2str(sprintf(Mth_format,M)),nc_suffix]; + disp(['Create ',clmname2]) + eval(['!cp ',clmname,' ',clmname2]) + % + % Change the time + % + nc=netcdf(clmname2,'write'); + time=nc{'tclm_time'}(:)-365.*(Ymin-Y); + nc{'tclm_time'}(:)=time; + nc{'temp_time'}(:)=time; + nc{'sclm_time'}(:)=time; + nc{'salt_time'}(:)=time; + nc{'uclm_time'}(:)=time; + nc{'vclm_time'}(:)=time; + nc{'v2d_time'}(:)=time; + nc{'v3d_time'}(:)=time; + nc{'ssh_time'}(:)=time; + nc{'zeta_time'}(:)=time; + close(nc) + end + % + % Boundary files + % + if makebry==1 + % + % Copy the file + % + bryname=[bry_prefix,'Y',num2str(Ymin),'M',num2str(sprintf(Mth_format,M)),nc_suffix]; + bryname2=[bry_prefix,'Y',num2str(Y),'M',num2str(sprintf(Mth_format,M)),nc_suffix]; + disp(['Create ',bryname2]) + eval(['!cp ',bryname,' ',bryname2]) + % + % Change the time + % + nc=netcdf(bryname2,'write'); + time=nc{'bry_time'}(:)-365.*(Ymin-Y); + nc{'bry_time'}(:)=time; + close(nc) + end end - end end %--------------------------------------------------------------- % Make a few plots %--------------------------------------------------------------- if makeplot==1 - disp(' ') - disp(' Make a few plots...') - if makeini==1 - ininame=[ini_prefix,'Y',num2str(Ymin),'M',num2str(sprintf(Mth_format,Mmin)),nc_suffix]; - figure - test_clim(ininame,grdname,'temp',1,coastfileplot) - figure - test_clim(ininame,grdname,'salt',1,coastfileplot) - end - if makeclim==1 - clmname=[clm_prefix,'Y',num2str(Y),'M',num2str(sprintf(Mth_format,M)),nc_suffix]; - figure - test_clim(clmname,grdname,'temp',1,coastfileplot) - figure - test_clim(clmname,grdname,'salt',1,coastfileplot) - end - if makebry==1 - bryname=[bry_prefix,'Y',num2str(Y),'M',num2str(sprintf(Mth_format,M)),nc_suffix]; - figure - test_bry(bryname,grdname,'temp',1,obc) - figure - test_bry(bryname,grdname,'salt',1,obc) - figure - test_bry(bryname,grdname,'u',1,obc) - figure - test_bry(bryname,grdname,'v',1,obc) - end + disp(' ') + disp(' Make a few plots...') + if makeini==1 + ininame=[ini_prefix,'Y',num2str(Ymin),'M',num2str(sprintf(Mth_format,Mmin)),nc_suffix]; + figure + test_clim(ininame,grdname,'temp',1,coastfileplot) + figure + test_clim(ininame,grdname,'salt',1,coastfileplot) + end + if makeclim==1 + clmname=[clm_prefix,'Y',num2str(Y),'M',num2str(sprintf(Mth_format,M)),nc_suffix]; + figure + test_clim(clmname,grdname,'temp',1,coastfileplot) + figure + test_clim(clmname,grdname,'salt',1,coastfileplot) + end + if makebry==1 + bryname=[bry_prefix,'Y',num2str(Y),'M',num2str(sprintf(Mth_format,M)),nc_suffix]; + figure + test_bry(bryname,grdname,'temp',1,obc) + figure + test_bry(bryname,grdname,'salt',1,obc) + figure + test_bry(bryname,grdname,'u',1,obc) + figure + test_bry(bryname,grdname,'v',1,obc) + end end diff --git a/Preprocessing_tools/Bio/add_bry_pisces.m b/Preprocessing_tools/Bio/add_bry_pisces.m index 966f7527..96550928 100644 --- a/Preprocessing_tools/Bio/add_bry_pisces.m +++ b/Preprocessing_tools/Bio/add_bry_pisces.m @@ -1,25 +1,26 @@ -function add_bry_pisces(bryname,obc,time,cycle,makequota,clobber); +function add_bry_pisces(bryname,obc,time,cycle,... + makequota,clobber,Yorig); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% function add_bry_pisces(bryname,grdname,title,obc... -% theta_s,theta_b,hc,N,... -% time,cycle,clobber); -% -% This function create the header of a Netcdf climatology -% file. -% -% Input: -% -% bryname Netcdf climatology file name (character string). -% obc open boundaries flag (1=open , [S E N W]). -% time time.(vector) -% cycle Length (days) for cycling the climatology.(Real) -% clobber Switch to allow or not writing over an existing -% file.(character string) -% -% Further Information: +% +% function add_bry_pisces(bryname,grdname,title,obc... +% theta_s,theta_b,hc,N,... +% time,cycle,clobber); +% +% This function create the header of a Netcdf climatology +% file. +% +% Input: +% +% bryname Netcdf climatology file name (character string). +% obc open boundaries flag (1=open , [S E N W]). +% time time.(vector) +% cycle Length (days) for cycling the climatology.(Real) +% clobber Switch to allow or not writing over an existing +% file.(character string) +% +% Further Information: % http://www.croco-ocean.org -% +% % This file is part of CROCOTOOLS % % CROCOTOOLS is free software; you can redistribute it and/or modify @@ -37,14 +38,26 @@ function add_bry_pisces(bryname,obc,time,cycle,makequota,clobber); % Foundation, Inc., 59 Temple Place, Suite 330, Boston, % MA 02111-1307 USA % -% Copyright (c) 2001-2006 by Pierrick Penven -% e-mail:Pierrick.Penven@ird.fr +% Copyright (c) 2001-2006 by Pierrick Penven +% e-mail:Pierrick.Penven@ird.fr % Pierrick Penven, IRD, 2005. % % Olivier Aumont the master, IRD, 2006. % % Patricio Marchesiello, chief, IRD, 2007. % % Christophe Eugene Raoul Menkes, the slave, IRD, 2007. % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% options for write_time_attributes +insecond = 0 ; +add_cycle = 1 ; +% +% Initialize Yorig if not provided +if ~exist('Yorig', 'var') , Yorig = []; , end +% +% Get time attributes +[time_unit_att,time_second_unit_att,calendar_att]=... + get_time_attributes(Yorig); +% disp(' ') disp([' Adding PISCES data into file : ',bryname]) disp(' ') @@ -65,8 +78,8 @@ nc('si_time') = length(time); nc('fer_time') = length(time); nc('o2_time') = length(time); if makequota - nc('dop_time') = length(time); - nc('don_time') = length(time); + nc('dop_time') = length(time); + nc('don_time') = length(time); end nc('one') = 1; % @@ -75,346 +88,344 @@ nc('one') = 1; nc{'dic_time'} = ncdouble('dic_time') ; nc{'dic_time'}.long_name = ncchar('time for DIC climatology'); nc{'dic_time'}.long_name = 'time for DIC climatology'; -nc{'dic_time'}.units = ncchar('day'); -nc{'dic_time'}.units = 'day'; -nc{'dic_time'}.cycle_length = cycle;% +write_time_attributes(nc,'dic_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'talk_time'} = ncdouble('talk_time') ; nc{'talk_time'}.long_name = ncchar('time for TALK climatology'); nc{'talk_time'}.long_name = 'time for TALK climatology'; -nc{'talk_time'}.units = ncchar('day'); -nc{'talk_time'}.units = 'day'; -nc{'talk_time'}.cycle_length = cycle;% +write_time_attributes(nc,'talk_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'no3_time'} = ncdouble('no3_time') ; nc{'no3_time'}.long_name = ncchar('time for NO3 climatology'); nc{'no3_time'}.long_name = 'time for NO3 climatology'; -nc{'no3_time'}.units = ncchar('day'); -nc{'no3_time'}.units = 'day'; -nc{'no3_time'}.cycle_length = cycle;% +write_time_attributes(nc,'no3_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); + % nc{'po4_time'} = ncdouble('po4_time') ; nc{'po4_time'}.long_name = ncchar('time for PO4 climatology'); nc{'po4_time'}.long_name = 'time for PO4 climatology'; -nc{'po4_time'}.units = ncchar('day'); -nc{'po4_time'}.units = 'day'; -nc{'po4_time'}.cycle_length = cycle;% +write_time_attributes(nc,'po4_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); + % nc{'si_time'} = ncdouble('si_time') ; nc{'si_time'}.long_name = ncchar('time for Si climatology'); nc{'si_time'}.long_name = 'time for Si climatology'; -nc{'si_time'}.units = ncchar('day'); -nc{'si_time'}.units = 'day'; -nc{'si_time'}.cycle_length = cycle;% +write_time_attributes(nc,'si_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); + % nc{'o2_time'} = ncdouble('o2_time') ; nc{'o2_time'}.long_name = ncchar('time for O2 climatology'); nc{'o2_time'}.long_name = 'time for O2 climatology'; -nc{'o2_time'}.units = ncchar('day'); -nc{'o2_time'}.units = 'day'; -nc{'o2_time'}.cycle_length = cycle;% +write_time_attributes(nc,'o2_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); + % nc{'doc_time'} = ncdouble('doc_time') ; nc{'doc_time'}.long_name = ncchar('time for DOC climatology'); nc{'doc_time'}.long_name = 'time for DOC climatology'; -nc{'doc_time'}.units = ncchar('day'); -nc{'doc_time'}.units = 'day'; -nc{'doc_time'}.cycle_length = cycle;% +write_time_attributes(nc,'doc_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); + % nc{'fer_time'} = ncdouble('fer_time') ; nc{'fer_time'}.long_name = ncchar('time for FER climatology'); nc{'fer_time'}.long_name = 'time for FER climatology'; -nc{'fer_time'}.units = ncchar('day'); -nc{'fer_time'}.units = 'day'; -nc{'fer_time'}.cycle_length = cycle;% +write_time_attributes(nc,'fer_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); + % if makequota - nc{'dop_time'} = ncdouble('dop_time') ; - nc{'dop_time'}.long_name = ncchar('time for DOP climatology'); - nc{'dop_time'}.long_name = 'time for DOP climatology'; - nc{'dop_time'}.units = ncchar('day'); - nc{'dop_time'}.units = 'day'; - nc{'dop_time'}.cycle_length = cycle;% -% - nc{'don_time'} = ncdouble('don_time') ; - nc{'don_time'}.long_name = ncchar('time for DON climatology'); - nc{'don_time'}.long_name = 'time for DON climatology'; - nc{'don_time'}.units = ncchar('day'); - nc{'don_time'}.units = 'day'; - nc{'don_time'}.cycle_length = cycle;% + nc{'dop_time'} = ncdouble('dop_time') ; + nc{'dop_time'}.long_name = ncchar('time for DOP climatology'); + nc{'dop_time'}.long_name = 'time for DOP climatology'; + write_time_attributes(nc,'dop_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); + + % + nc{'don_time'} = ncdouble('don_time') ; + nc{'don_time'}.long_name = ncchar('time for DON climatology'); + nc{'don_time'}.long_name = 'time for DON climatology'; + write_time_attributes(nc,'don_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); + end % % if obc(1)==1 -% -% Southern boundary -% + % + % Southern boundary + % nc{'NO3_south'} = ncdouble('no3_time','s_rho','xi_rho') ; nc{'NO3_south'}.long_name = ncchar('southern boundary NO3'); nc{'NO3_south'}.long_name = 'southern boundary NO3'; nc{'NO3_south'}.units = ncchar('mMol N m-3'); nc{'NO3_south'}.units = 'mMol N m-3'; -% + % nc{'PO4_south'} = ncdouble('po4_time','s_rho','xi_rho') ; nc{'PO4_south'}.long_name = ncchar('southern boundary PO4'); nc{'PO4_south'}.long_name = 'southern boundary PO4'; nc{'PO4_south'}.units = ncchar('mMol N m-3'); nc{'PO4_south'}.units = 'mMol N m-3'; -% + % nc{'Si_south'} = ncdouble('si_time','s_rho','xi_rho') ; nc{'Si_south'}.long_name = ncchar('southern boundary Si'); nc{'Si_south'}.long_name = 'southern boundary Si'; nc{'Si_south'}.units = ncchar('mMol N m-3'); nc{'Si_south'}.units = 'mMol N m-3'; -% + % nc{'O2_south'} = ncdouble('o2_time','s_rho','xi_rho') ; nc{'O2_south'}.long_name = ncchar('southern boundary O2'); nc{'O2_south'}.long_name = 'southern boundary O2'; nc{'O2_south'}.units = ncchar('mMol N m-3'); nc{'O2_south'}.units = 'mMol N m-3'; -% + % nc{'DIC_south'} = ncdouble('dic_time','s_rho','xi_rho') ; nc{'DIC_south'}.long_name = ncchar('southern boundary DIC'); nc{'DIC_south'}.long_name = 'southern boundary DIC'; nc{'DIC_south'}.units = ncchar('mMol N m-3'); nc{'DIC_south'}.units = 'mMol N m-3'; -% + % nc{'TALK_south'} = ncdouble('talk_time','s_rho','xi_rho') ; nc{'TALK_south'}.long_name = ncchar('southern boundary TALK'); nc{'TALK_south'}.long_name = 'southern boundary TALK'; nc{'TALK_south'}.units = ncchar('mMol N m-3'); nc{'TALK_south'}.units = 'mMol N m-3'; -% + % nc{'DOC_south'} = ncdouble('doc_time','s_rho','xi_rho') ; nc{'DOC_south'}.long_name = ncchar('southern boundary DOC'); nc{'DOC_south'}.long_name = 'southern boundary DOC'; nc{'DOC_south'}.units = ncchar('mMol N m-3'); nc{'DOC_south'}.units = 'mMol N m-3'; -% + % nc{'FER_south'} = ncdouble('fer_time','s_rho','xi_rho') ; nc{'FER_south'}.long_name = ncchar('southern boundary Iron'); nc{'FER_south'}.long_name = 'southern boundary Iron'; nc{'FER_south'}.units = ncchar('mMol N m-3'); nc{'FER_south'}.units = 'mMol N m-3'; -% + % if makequota - nc{'DOP_south'} = ncdouble('dop_time','s_rho','xi_rho') ; - nc{'DOP_south'}.long_name = ncchar('southern boundary DOP'); - nc{'DOP_south'}.long_name = 'southern boundary DOP'; - nc{'DOP_south'}.units = ncchar('mMol N m-3'); - nc{'DOP_south'}.units = 'mMol N m-3'; -% - nc{'DON_south'} = ncdouble('don_time','s_rho','xi_rho') ; - nc{'DON_south'}.long_name = ncchar('southern boundary DON'); - nc{'DON_south'}.long_name = 'southern boundary DON'; - nc{'DON_south'}.units = ncchar('mMol N m-3'); - nc{'DON_south'}.units = 'mMol N m-3'; - end -% + nc{'DOP_south'} = ncdouble('dop_time','s_rho','xi_rho') ; + nc{'DOP_south'}.long_name = ncchar('southern boundary DOP'); + nc{'DOP_south'}.long_name = 'southern boundary DOP'; + nc{'DOP_south'}.units = ncchar('mMol N m-3'); + nc{'DOP_south'}.units = 'mMol N m-3'; + % + nc{'DON_south'} = ncdouble('don_time','s_rho','xi_rho') ; + nc{'DON_south'}.long_name = ncchar('southern boundary DON'); + nc{'DON_south'}.long_name = 'southern boundary DON'; + nc{'DON_south'}.units = ncchar('mMol N m-3'); + nc{'DON_south'}.units = 'mMol N m-3'; + end + % end % if obc(2)==1 -% -% Eastern boundary -% + % + % Eastern boundary + % nc{'NO3_east'} = ncdouble('no3_time','s_rho','eta_rho') ; nc{'NO3_east'}.long_name = ncchar('eastern boundary NO3'); nc{'NO3_east'}.long_name = 'eastern boundary NO3'; nc{'NO3_east'}.units = ncchar('mMol N m-3'); nc{'NO3_east'}.units = 'mMol N m-3'; -% + % nc{'PO4_east'} = ncdouble('po4_time','s_rho','eta_rho') ; nc{'PO4_east'}.long_name = ncchar('eastern boundary PO4'); nc{'PO4_east'}.long_name = 'eastern boundary PO4'; nc{'PO4_east'}.units = ncchar('mMol N m-3'); nc{'PO4_east'}.units = 'mMol N m-3'; -% + % nc{'Si_east'} = ncdouble('si_time','s_rho','eta_rho') ; nc{'Si_east'}.long_name = ncchar('eastern boundary Si'); nc{'Si_east'}.long_name = 'eastern boundary Si'; nc{'Si_east'}.units = ncchar('mMol N m-3'); nc{'Si_east'}.units = 'mMol N m-3'; -% + % nc{'O2_east'} = ncdouble('o2_time','s_rho','eta_rho') ; nc{'O2_east'}.long_name = ncchar('eastern boundary O2'); nc{'O2_east'}.long_name = 'eastern boundary O2'; nc{'O2_east'}.units = ncchar('mMol N m-3'); nc{'O2_east'}.units = 'mMol N m-3'; -% + % nc{'DIC_east'} = ncdouble('dic_time','s_rho','eta_rho') ; nc{'DIC_east'}.long_name = ncchar('eastern boundary DIC'); nc{'DIC_east'}.long_name = 'eastern boundary DIC'; nc{'DIC_east'}.units = ncchar('mMol N m-3'); nc{'DIC_east'}.units = 'mMol N m-3'; -% + % nc{'TALK_east'} = ncdouble('talk_time','s_rho','eta_rho') ; nc{'TALK_east'}.long_name = ncchar('eastern boundary TALK'); nc{'TALK_east'}.long_name = 'eastern boundary TALK'; nc{'TALK_east'}.units = ncchar('mMol N m-3'); nc{'TALK_east'}.units = 'mMol N m-3'; -% + % nc{'DOC_east'} = ncdouble('doc_time','s_rho','eta_rho') ; nc{'DOC_east'}.long_name = ncchar('eastern boundary DOC'); nc{'DOC_east'}.long_name = 'eastern boundary DOC'; nc{'DOC_east'}.units = ncchar('mMol N m-3'); nc{'DOC_east'}.units = 'mMol N m-3'; -% + % nc{'FER_east'} = ncdouble('fer_time','s_rho','eta_rho') ; nc{'FER_east'}.long_name = ncchar('eastern boundary Iron'); nc{'FER_east'}.long_name = 'eastern boundary Iron'; nc{'FER_east'}.units = ncchar('mMol N m-3'); nc{'FER_east'}.units = 'mMol N m-3'; -% + % if makequota - nc{'DOP_east'} = ncdouble('dop_time','s_rho','eta_rho') ; - nc{'DOP_east'}.long_name = ncchar('eastern boundary DOP'); - nc{'DOP_east'}.long_name = 'eastern boundary DOP'; - nc{'DOP_east'}.units = ncchar('mMol N m-3'); - nc{'DOP_east'}.units = 'mMol N m-3'; -% - nc{'DON_east'} = ncdouble('don_time','s_rho','eta_rho') ; - nc{'DON_east'}.long_name = ncchar('eastern boundary DON'); - nc{'DON_east'}.long_name = 'eastern boundary DON'; - nc{'DON_east'}.units = ncchar('mMol N m-3'); - nc{'DON_east'}.units = 'mMol N m-3'; + nc{'DOP_east'} = ncdouble('dop_time','s_rho','eta_rho') ; + nc{'DOP_east'}.long_name = ncchar('eastern boundary DOP'); + nc{'DOP_east'}.long_name = 'eastern boundary DOP'; + nc{'DOP_east'}.units = ncchar('mMol N m-3'); + nc{'DOP_east'}.units = 'mMol N m-3'; + % + nc{'DON_east'} = ncdouble('don_time','s_rho','eta_rho') ; + nc{'DON_east'}.long_name = ncchar('eastern boundary DON'); + nc{'DON_east'}.long_name = 'eastern boundary DON'; + nc{'DON_east'}.units = ncchar('mMol N m-3'); + nc{'DON_east'}.units = 'mMol N m-3'; end -% + % end % if obc(3)==1 -% -% Northern boundary -% + % + % Northern boundary + % nc{'NO3_north'} = ncdouble('no3_time','s_rho','xi_rho') ; nc{'NO3_north'}.long_name = ncchar('northern boundary NO3'); nc{'NO3_north'}.long_name = 'northern boundary NO3'; nc{'NO3_north'}.units = ncchar('mMol N m-3'); nc{'NO3_north'}.units = 'mMol N m-3'; -% + % nc{'PO4_north'} = ncdouble('po4_time','s_rho','xi_rho') ; nc{'PO4_north'}.long_name = ncchar('northern boundary PO4'); nc{'PO4_north'}.long_name = 'northern boundary PO4'; nc{'PO4_north'}.units = ncchar('mMol N m-3'); nc{'PO4_north'}.units = 'mMol N m-3'; -% + % nc{'Si_north'} = ncdouble('si_time','s_rho','xi_rho') ; nc{'Si_north'}.long_name = ncchar('northern boundary Si'); nc{'Si_north'}.long_name = 'northern boundary Si'; nc{'Si_north'}.units = ncchar('mMol N m-3'); nc{'Si_north'}.units = 'mMol N m-3'; -% + % nc{'O2_north'} = ncdouble('o2_time','s_rho','xi_rho') ; nc{'O2_north'}.long_name = ncchar('northern boundary O2'); nc{'O2_north'}.long_name = 'northern boundary O2'; nc{'O2_north'}.units = ncchar('mMol N m-3'); nc{'O2_north'}.units = 'mMol N m-3'; -% + % nc{'DIC_north'} = ncdouble('dic_time','s_rho','xi_rho') ; nc{'DIC_north'}.long_name = ncchar('northern boundary DIC'); nc{'DIC_north'}.long_name = 'northern boundary DIC'; nc{'DIC_north'}.units = ncchar('mMol N m-3'); nc{'DIC_north'}.units = 'mMol N m-3'; -% + % nc{'TALK_north'} = ncdouble('talk_time','s_rho','xi_rho') ; nc{'TALK_north'}.long_name = ncchar('northern boundary TALK'); nc{'TALK_north'}.long_name = 'northern boundary TALK'; nc{'TALK_north'}.units = ncchar('mMol N m-3'); nc{'TALK_north'}.units = 'mMol N m-3'; -% + % nc{'DOC_north'} = ncdouble('doc_time','s_rho','xi_rho') ; nc{'DOC_north'}.long_name = ncchar('northern boundary DOC'); nc{'DOC_north'}.long_name = 'northern boundary DOC'; nc{'DOC_north'}.units = ncchar('mMol N m-3'); nc{'DOC_north'}.units = 'mMol N m-3'; -% + % nc{'FER_north'} = ncdouble('fer_time','s_rho','xi_rho') ; nc{'FER_north'}.long_name = ncchar('northern boundary Iron'); nc{'FER_north'}.long_name = 'northern boundary Iron'; nc{'FER_north'}.units = ncchar('mMol N m-3'); nc{'FER_north'}.units = 'mMol N m-3'; -% + % if makequota - nc{'DOP_north'} = ncdouble('dop_time','s_rho','xi_rho') ; - nc{'DOP_north'}.long_name = ncchar('northern boundary DOP'); - nc{'DOP_north'}.long_name = 'northern boundary DOP'; - nc{'DOP_north'}.units = ncchar('mMol N m-3'); - nc{'DOP_north'}.units = 'mMol N m-3'; -% - nc{'DON_north'} = ncdouble('don_time','s_rho','xi_rho') ; - nc{'DON_north'}.long_name = ncchar('northern boundary DON'); - nc{'DON_north'}.long_name = 'northern boundary DON'; - nc{'DON_north'}.units = ncchar('mMol N m-3'); - nc{'DON_north'}.units = 'mMol N m-3'; + nc{'DOP_north'} = ncdouble('dop_time','s_rho','xi_rho') ; + nc{'DOP_north'}.long_name = ncchar('northern boundary DOP'); + nc{'DOP_north'}.long_name = 'northern boundary DOP'; + nc{'DOP_north'}.units = ncchar('mMol N m-3'); + nc{'DOP_north'}.units = 'mMol N m-3'; + % + nc{'DON_north'} = ncdouble('don_time','s_rho','xi_rho') ; + nc{'DON_north'}.long_name = ncchar('northern boundary DON'); + nc{'DON_north'}.long_name = 'northern boundary DON'; + nc{'DON_north'}.units = ncchar('mMol N m-3'); + nc{'DON_north'}.units = 'mMol N m-3'; end -% + % end % if obc(4)==1 -% -% Western boundary -% + % + % Western boundary + % nc{'NO3_west'} = ncdouble('no3_time','s_rho','eta_rho') ; nc{'NO3_west'}.long_name = ncchar('western boundary NO3'); nc{'NO3_west'}.long_name = 'western boundary NO3'; nc{'NO3_west'}.units = ncchar('mMol N m-3'); nc{'NO3_west'}.units = 'mMol N m-3'; -% + % nc{'PO4_west'} = ncdouble('po4_time','s_rho','eta_rho') ; nc{'PO4_west'}.long_name = ncchar('western boundary PO4'); nc{'PO4_west'}.long_name = 'western boundary PO4'; nc{'PO4_west'}.units = ncchar('mMol N m-3'); nc{'PO4_west'}.units = 'mMol N m-3'; -% + % nc{'Si_west'} = ncdouble('si_time','s_rho','eta_rho') ; nc{'Si_west'}.long_name = ncchar('western boundary Si'); nc{'Si_west'}.long_name = 'western boundary Si'; nc{'Si_west'}.units = ncchar('mMol N m-3'); nc{'Si_west'}.units = 'mMol N m-3'; -% + % nc{'O2_west'} = ncdouble('o2_time','s_rho','eta_rho') ; nc{'O2_west'}.long_name = ncchar('western boundary O2'); nc{'O2_west'}.long_name = 'western boundary O2'; nc{'O2_west'}.units = ncchar('mMol N m-3'); nc{'O2_west'}.units = 'mMol N m-3'; -% + % nc{'DIC_west'} = ncdouble('dic_time','s_rho','eta_rho') ; nc{'DIC_west'}.long_name = ncchar('western boundary DIC'); nc{'DIC_west'}.long_name = 'western boundary DIC'; nc{'DIC_west'}.units = ncchar('mMol N m-3'); nc{'DIC_west'}.units = 'mMol N m-3'; -% + % nc{'TALK_west'} = ncdouble('talk_time','s_rho','eta_rho') ; nc{'TALK_west'}.long_name = ncchar('western boundary TALK'); nc{'TALK_west'}.long_name = 'western boundary TALK'; nc{'TALK_west'}.units = ncchar('mMol N m-3'); nc{'TALK_west'}.units = 'mMol N m-3'; -% + % nc{'DOC_west'} = ncdouble('doc_time','s_rho','eta_rho') ; nc{'DOC_west'}.long_name = ncchar('western boundary DOC'); nc{'DOC_west'}.long_name = 'western boundary DOC'; nc{'DOC_west'}.units = ncchar('mMol N m-3'); nc{'DOC_west'}.units = 'mMol N m-3'; -% + % nc{'FER_west'} = ncdouble('fer_time','s_rho','eta_rho') ; nc{'FER_west'}.long_name = ncchar('western boundary Iron'); nc{'FER_west'}.long_name = 'western boundary Iron'; nc{'FER_west'}.units = ncchar('mMol N m-3'); nc{'FER_west'}.units = 'mMol N m-3'; -% + % if makequota - nc{'DOP_west'} = ncdouble('dop_time','s_rho','eta_rho') ; - nc{'DOP_west'}.long_name = ncchar('western boundary DOP'); - nc{'DOP_west'}.long_name = 'western boundary DOP'; - nc{'DOP_west'}.units = ncchar('mMol N m-3'); - nc{'DOP_west'}.units = 'mMol N m-3'; -% - nc{'DON_west'} = ncdouble('don_time','s_rho','eta_rho') ; - nc{'DON_west'}.long_name = ncchar('western boundary DON'); - nc{'DON_west'}.long_name = 'western boundary DON'; - nc{'DON_west'}.units = ncchar('mMol N m-3'); - nc{'DON_west'}.units = 'mMol N m-3'; + nc{'DOP_west'} = ncdouble('dop_time','s_rho','eta_rho') ; + nc{'DOP_west'}.long_name = ncchar('western boundary DOP'); + nc{'DOP_west'}.long_name = 'western boundary DOP'; + nc{'DOP_west'}.units = ncchar('mMol N m-3'); + nc{'DOP_west'}.units = 'mMol N m-3'; + % + nc{'DON_west'} = ncdouble('don_time','s_rho','eta_rho') ; + nc{'DON_west'}.long_name = ncchar('western boundary DON'); + nc{'DON_west'}.long_name = 'western boundary DON'; + nc{'DON_west'}.units = ncchar('mMol N m-3'); + nc{'DON_west'}.units = 'mMol N m-3'; end -% + % end % % Leave define mode @@ -432,8 +443,8 @@ nc{'si_time'}(:) = time; nc{'fer_time'}(:) = time; nc{'o2_time'}(:) = time; if makequota - nc{'dop_time'}(:) = time; - nc{'don_time'}(:) = time; + nc{'dop_time'}(:) = time; + nc{'don_time'}(:) = time; end if obc(1)==1 nc{'NO3_south'}(:) = 0; @@ -445,10 +456,10 @@ if obc(1)==1 nc{'DOC_south'}(:) = 0; nc{'FER_south'}(:) = 0; if makequota - nc{'DOP_south'}(:) = 0; - nc{'DON_south'}(:) = 0; + nc{'DOP_south'}(:) = 0; + nc{'DON_south'}(:) = 0; end -end +end if obc(2)==1 nc{'NO3_east'}(:) = 0; nc{'PO4_east'}(:) = 0; @@ -459,10 +470,10 @@ if obc(2)==1 nc{'DOC_east'}(:) = 0; nc{'FER_east'}(:) = 0; if makequota - nc{'DOP_east'}(:) = 0; - nc{'DON_east'}(:) = 0; + nc{'DOP_east'}(:) = 0; + nc{'DON_east'}(:) = 0; end -end +end if obc(3)==1 nc{'NO3_north'}(:) = 0; nc{'PO4_north'}(:) = 0; @@ -473,10 +484,10 @@ if obc(3)==1 nc{'DOC_north'}(:) = 0; nc{'FER_north'}(:) = 0; if makequota - nc{'DOP_north'}(:) = 0; - nc{'DON_north'}(:) = 0; + nc{'DOP_north'}(:) = 0; + nc{'DON_north'}(:) = 0; end -end +end if obc(4)==1 nc{'NO3_west'}(:) = 0; nc{'PO4_west'}(:) = 0; @@ -487,10 +498,10 @@ if obc(4)==1 nc{'DOC_west'}(:) = 0; nc{'FER_west'}(:) = 0; if makequota - nc{'DOP_west'}(:) = 0; - nc{'DON_west'}(:) = 0 + nc{'DOP_west'}(:) = 0; + nc{'DON_west'}(:) = 0 end -end +end close(nc) return diff --git a/Preprocessing_tools/Bio/add_bry_pisces_Z.m b/Preprocessing_tools/Bio/add_bry_pisces_Z.m index 69bde9cd..97667243 100644 --- a/Preprocessing_tools/Bio/add_bry_pisces_Z.m +++ b/Preprocessing_tools/Bio/add_bry_pisces_Z.m @@ -1,4 +1,5 @@ -function add_bry_pisces_Z(zbryname,obc,Z,time,cycle,makequota,clobber); +function add_bry_pisces_Z(zbryname,obc,Z,time,cycle,makequota,... + clobber,Yorig); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % function add_bry_pisces_Z(zbryname,obc,... % @@ -23,6 +24,19 @@ function add_bry_pisces_Z(zbryname,obc,Z,time,cycle,makequota,clobber); % Christophe Eugene Raoul Menkes, the slave, IRD, 2007. % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% options for write_time_attributes +insecond = 0 ; +add_cycle = 1 ; +% +% Initialize Yorig if not provided +if ~exist('Yorig', 'var') , Yorig = []; , end +% +% Get time attributes +[time_unit_att,time_second_unit_att,calendar_att]=... + get_time_attributes(Yorig); +% + disp(' ') disp([' Adding PISCES data into file : ',zbryname]) disp(' ') @@ -35,59 +49,118 @@ nc = netcdf(zbryname,clobber); % Create dimensions % nc('dic_time') = length(time); +nc{'dic_time'} = ncdouble('dic_time') ; +nc{'dic_time'}.long_name = 'time for DIC'; +write_time_attributes(nc,'dic_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); + +% nc('doc_time') = length(time); +nc{'doc_time'} = ncdouble('doc_time') ; +nc{'doc_time'}.long_name = 'time for DOC'; +write_time_attributes(nc,'doc_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); + +% nc('no3_time') = length(time); +nc{'no3_time'} = ncdouble('no3_time') ; +nc{'no3_time'}.long_name = 'time for NO3'; +write_time_attributes(nc,'no3_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); + +% nc('po4_time') = length(time); +nc{'po4_time'} = ncdouble('po4_time') ; +nc{'po4_time'}.long_name = 'time for PO4'; +write_time_attributes(nc,'po4_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); + +% nc('talk_time') = length(time); +nc{'talk_time'} = ncdouble('talk_time') ; +nc{'talk_time'}.long_name = 'time for TALK'; +write_time_attributes(nc,'talk_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); + +% nc('si_time') = length(time); +nc{'si_time'} = ncdouble('si_time') ; +nc{'si_time'}.long_name = 'time for silicate'; +write_time_attributes(nc,'si_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); + +% nc('fer_time') = length(time); +nc{'fer_time'} = ncdouble('fer_time') ; +nc{'fer_time'}.long_name = 'time for iron'; +write_time_attributes(nc,'fer_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); + +% % nc('o2_time') = length(time); +nc{'o2_time'} = ncdouble('o2_time') ; +nc{'o2_time'}.long_name = 'time for oxygen'; +write_time_attributes(nc,'o2_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); + + if makequota - nc('dop_time') = length(time); - nc('don_time') = length(time); + nc('dop_time') = length(time); + nc{'dop_time'} = ncdouble('dop_time') ; + nc{'dop_time'}.long_name = 'time for dop'; + write_time_attributes(nc,'dop_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); + + % + nc('don_time') = length(time); + nc{'don_time'} = ncdouble('don_time') ; + nc{'don_time'}.long_name = 'time for don'; + write_time_attributes(nc,'don_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); + end nc('one') = 1; % if obc(1)==1 -% -% Southern boundary -% + % + % Southern boundary + % nc{'NO3_south'} = ncdouble('no3_time','Z','xi_rho') ; nc{'NO3_south'}.long_name = ncchar('southern boundary NO3'); nc{'NO3_south'}.long_name = 'southern boundary NO3'; nc{'NO3_south'}.units = ncchar('mMol N m-3'); nc{'NO3_south'}.units = 'mMol N m-3'; -% + % nc{'PO4_south'} = ncdouble('po4_time','Z','xi_rho') ; nc{'PO4_south'}.long_name = ncchar('southern boundary PO4'); nc{'PO4_south'}.long_name = 'southern boundary PO4'; nc{'PO4_south'}.units = ncchar('mMol N m-3'); nc{'PO4_south'}.units = 'mMol N m-3'; -% + % nc{'Si_south'} = ncdouble('si_time','Z','xi_rho') ; nc{'Si_south'}.long_name = ncchar('southern boundary Si'); nc{'Si_south'}.long_name = 'southern boundary Si'; nc{'Si_south'}.units = ncchar('mMol N m-3'); nc{'Si_south'}.units = 'mMol N m-3'; -% + % nc{'O2_south'} = ncdouble('o2_time','Z','xi_rho') ; nc{'O2_south'}.long_name = ncchar('southern boundary O2'); nc{'O2_south'}.long_name = 'southern boundary O2'; nc{'O2_south'}.units = ncchar('mMol N m-3'); nc{'O2_south'}.units = 'mMol N m-3'; -% + % nc{'DIC_south'} = ncdouble('dic_time','Z','xi_rho') ; nc{'DIC_south'}.long_name = ncchar('southern boundary DIC'); nc{'DIC_south'}.long_name = 'southern boundary DIC'; nc{'DIC_south'}.units = ncchar('mMol N m-3'); nc{'DIC_south'}.units = 'mMol N m-3'; -% + % nc{'TALK_south'} = ncdouble('talk_time','Z','xi_rho') ; nc{'TALK_south'}.long_name = ncchar('southern boundary TALK'); nc{'TALK_south'}.long_name = 'southern boundary TALK'; nc{'TALK_south'}.units = ncchar('mMol N m-3'); nc{'TALK_south'}.units = 'mMol N m-3'; -% + % nc{'DOC_south'} = ncdouble('doc_time','Z','xi_rho') ; nc{'DOC_south'}.long_name = ncchar('southern boundary DOC'); nc{'DOC_south'}.long_name = 'southern boundary DOC'; @@ -99,225 +172,225 @@ if obc(1)==1 nc{'FER_south'}.long_name = 'southern boundary Iron'; nc{'FER_south'}.units = ncchar('mMol N m-3'); nc{'FER_south'}.units = 'mMol N m-3'; -% - if makequota - nc{'DOP_south'} = ncdouble('dop_time','Z','xi_rho') ; - nc{'DOP_south'}.long_name = ncchar('southern boundary DOP'); - nc{'DOP_south'}.long_name = 'southern boundary DOP'; - nc{'DOP_south'}.units = ncchar('mMol N m-3'); - nc{'DOP_south'}.units = 'mMol N m-3'; -% - nc{'DON_south'} = ncdouble('don_time','Z','xi_rho') ; - nc{'DON_south'}.long_name = ncchar('southern boundary DON'); - nc{'DON_south'}.long_name = 'southern boundary DON'; - nc{'DON_south'}.units = ncchar('mMol N m-3'); - nc{'DON_south'}.units = 'mMol N m-3'; - end -% + % + if makequota + nc{'DOP_south'} = ncdouble('dop_time','Z','xi_rho') ; + nc{'DOP_south'}.long_name = ncchar('southern boundary DOP'); + nc{'DOP_south'}.long_name = 'southern boundary DOP'; + nc{'DOP_south'}.units = ncchar('mMol N m-3'); + nc{'DOP_south'}.units = 'mMol N m-3'; + % + nc{'DON_south'} = ncdouble('don_time','Z','xi_rho') ; + nc{'DON_south'}.long_name = ncchar('southern boundary DON'); + nc{'DON_south'}.long_name = 'southern boundary DON'; + nc{'DON_south'}.units = ncchar('mMol N m-3'); + nc{'DON_south'}.units = 'mMol N m-3'; + end + % end % if obc(2)==1 -% -% Eastern boundary -% + % + % Eastern boundary + % nc{'NO3_east'} = ncdouble('no3_time','Z','eta_rho') ; nc{'NO3_east'}.long_name = ncchar('eastern boundary NO3'); nc{'NO3_east'}.long_name = 'eastern boundary NO3'; nc{'NO3_east'}.units = ncchar('mMol N m-3'); nc{'NO3_east'}.units = 'mMol N m-3'; -% + % nc{'PO4_east'} = ncdouble('po4_time','Z','eta_rho') ; nc{'PO4_east'}.long_name = ncchar('eastern boundary PO4'); nc{'PO4_east'}.long_name = 'eastern boundary PO4'; nc{'PO4_east'}.units = ncchar('mMol N m-3'); nc{'PO4_east'}.units = 'mMol N m-3'; -% + % nc{'Si_east'} = ncdouble('si_time','Z','eta_rho') ; nc{'Si_east'}.long_name = ncchar('eastern boundary Si'); nc{'Si_east'}.long_name = 'eastern boundary Si'; nc{'Si_east'}.units = ncchar('mMol N m-3'); nc{'Si_east'}.units = 'mMol N m-3'; -% + % nc{'O2_east'} = ncdouble('o2_time','Z','eta_rho') ; nc{'O2_east'}.long_name = ncchar('eastern boundary O2'); nc{'O2_east'}.long_name = 'eastern boundary O2'; nc{'O2_east'}.units = ncchar('mMol N m-3'); nc{'O2_east'}.units = 'mMol N m-3'; -% + % nc{'DIC_east'} = ncdouble('dic_time','Z','eta_rho') ; nc{'DIC_east'}.long_name = ncchar('eastern boundary DIC'); nc{'DIC_east'}.long_name = 'eastern boundary DIC'; nc{'DIC_east'}.units = ncchar('mMol N m-3'); nc{'DIC_east'}.units = 'mMol N m-3'; -% + % nc{'TALK_east'} = ncdouble('talk_time','Z','eta_rho') ; nc{'TALK_east'}.long_name = ncchar('eastern boundary TALK'); nc{'TALK_east'}.long_name = 'eastern boundary TALK'; nc{'TALK_east'}.units = ncchar('mMol N m-3'); nc{'TALK_east'}.units = 'mMol N m-3'; -% + % nc{'DOC_east'} = ncdouble('doc_time','Z','eta_rho') ; nc{'DOC_east'}.long_name = ncchar('eastern boundary DOC'); nc{'DOC_east'}.long_name = 'eastern boundary DOC'; nc{'DOC_east'}.units = ncchar('mMol N m-3'); nc{'DOC_east'}.units = 'mMol N m-3'; -% + % nc{'FER_east'} = ncdouble('fer_time','Z','eta_rho') ; nc{'FER_east'}.long_name = ncchar('eastern boundary Iron'); nc{'FER_east'}.long_name = 'eastern boundary Iron'; nc{'FER_east'}.units = ncchar('mMol N m-3'); nc{'FER_east'}.units = 'mMol N m-3'; -% - if makequota - nc{'DOP_east'} = ncdouble('dop_time','Z','eta_rho') ; - nc{'DOP_east'}.long_name = ncchar('eastern boundary DOP'); - nc{'DOP_east'}.long_name = 'eastern boundary DOP'; - nc{'DOP_east'}.units = ncchar('mMol N m-3'); - nc{'DOP_east'}.units = 'mMol N m-3'; -% - nc{'DON_east'} = ncdouble('don_time','Z','eta_rho') ; - nc{'DON_east'}.long_name = ncchar('eastern boundary DON'); - nc{'DON_east'}.long_name = 'eastern boundary DON'; - nc{'DON_east'}.units = ncchar('mMol N m-3'); - nc{'DON_east'}.units = 'mMol N m-3'; - end -% + % + if makequota + nc{'DOP_east'} = ncdouble('dop_time','Z','eta_rho') ; + nc{'DOP_east'}.long_name = ncchar('eastern boundary DOP'); + nc{'DOP_east'}.long_name = 'eastern boundary DOP'; + nc{'DOP_east'}.units = ncchar('mMol N m-3'); + nc{'DOP_east'}.units = 'mMol N m-3'; + % + nc{'DON_east'} = ncdouble('don_time','Z','eta_rho') ; + nc{'DON_east'}.long_name = ncchar('eastern boundary DON'); + nc{'DON_east'}.long_name = 'eastern boundary DON'; + nc{'DON_east'}.units = ncchar('mMol N m-3'); + nc{'DON_east'}.units = 'mMol N m-3'; + end + % end % if obc(3)==1 -% -% Northern boundary -% + % + % Northern boundary + % nc{'NO3_north'} = ncdouble('no3_time','Z','xi_rho') ; nc{'NO3_north'}.long_name = ncchar('northern boundary NO3'); nc{'NO3_north'}.long_name = 'northern boundary NO3'; nc{'NO3_north'}.units = ncchar('mMol N m-3'); nc{'NO3_north'}.units = 'mMol N m-3'; -% + % nc{'PO4_north'} = ncdouble('po4_time','Z','xi_rho') ; nc{'PO4_north'}.long_name = ncchar('northern boundary PO4'); nc{'PO4_north'}.long_name = 'northern boundary PO4'; nc{'PO4_north'}.units = ncchar('mMol N m-3'); nc{'PO4_north'}.units = 'mMol N m-3'; -% + % nc{'Si_north'} = ncdouble('si_time','Z','xi_rho') ; nc{'Si_north'}.long_name = ncchar('northern boundary Si'); nc{'Si_north'}.long_name = 'northern boundary Si'; nc{'Si_north'}.units = ncchar('mMol N m-3'); nc{'Si_north'}.units = 'mMol N m-3'; -% + % nc{'O2_north'} = ncdouble('o2_time','Z','xi_rho') ; nc{'O2_north'}.long_name = ncchar('northern boundary O2'); nc{'O2_north'}.long_name = 'northern boundary O2'; nc{'O2_north'}.units = ncchar('mMol N m-3'); nc{'O2_north'}.units = 'mMol N m-3'; -% + % nc{'DIC_north'} = ncdouble('dic_time','Z','xi_rho') ; nc{'DIC_north'}.long_name = ncchar('northern boundary DIC'); nc{'DIC_north'}.long_name = 'northern boundary DIC'; nc{'DIC_north'}.units = ncchar('mMol N m-3'); nc{'DIC_north'}.units = 'mMol N m-3'; -% + % nc{'TALK_north'} = ncdouble('talk_time','Z','xi_rho') ; nc{'TALK_north'}.long_name = ncchar('northern boundary TALK'); nc{'TALK_north'}.long_name = 'northern boundary TALK'; nc{'TALK_north'}.units = ncchar('mMol N m-3'); nc{'TALK_north'}.units = 'mMol N m-3'; -% + % nc{'DOC_north'} = ncdouble('doc_time','Z','xi_rho') ; nc{'DOC_north'}.long_name = ncchar('northern boundary DOC'); nc{'DOC_north'}.long_name = 'northern boundary DOC'; nc{'DOC_north'}.units = ncchar('mMol N m-3'); nc{'DOC_north'}.units = 'mMol N m-3'; -% + % nc{'FER_north'} = ncdouble('fer_time','Z','xi_rho') ; nc{'FER_north'}.long_name = ncchar('northern boundary Iron'); nc{'FER_north'}.long_name = 'northern boundary Iron'; nc{'FER_north'}.units = ncchar('mMol N m-3'); nc{'FER_north'}.units = 'mMol N m-3'; -% - if makequota - nc{'DOP_north'} = ncdouble('dop_time','Z','xi_rho') ; - nc{'DOP_north'}.long_name = ncchar('northern boundary DOP'); - nc{'DOP_north'}.long_name = 'northern boundary DOP'; - nc{'DOP_north'}.units = ncchar('mMol N m-3'); - nc{'DOP_north'}.units = 'mMol N m-3'; -% - nc{'DON_north'} = ncdouble('don_time','Z','xi_rho') ; - nc{'DON_north'}.long_name = ncchar('northern boundary DON'); - nc{'DON_north'}.long_name = 'northern boundary DON'; - nc{'DON_north'}.units = ncchar('mMol N m-3'); - nc{'DON_north'}.units = 'mMol N m-3'; - end -% + % + if makequota + nc{'DOP_north'} = ncdouble('dop_time','Z','xi_rho') ; + nc{'DOP_north'}.long_name = ncchar('northern boundary DOP'); + nc{'DOP_north'}.long_name = 'northern boundary DOP'; + nc{'DOP_north'}.units = ncchar('mMol N m-3'); + nc{'DOP_north'}.units = 'mMol N m-3'; + % + nc{'DON_north'} = ncdouble('don_time','Z','xi_rho') ; + nc{'DON_north'}.long_name = ncchar('northern boundary DON'); + nc{'DON_north'}.long_name = 'northern boundary DON'; + nc{'DON_north'}.units = ncchar('mMol N m-3'); + nc{'DON_north'}.units = 'mMol N m-3'; + end + % end % if obc(4)==1 -% -% Western boundary -% + % + % Western boundary + % nc{'NO3_west'} = ncdouble('no3_time','Z','eta_rho') ; nc{'NO3_west'}.long_name = ncchar('western boundary NO3'); nc{'NO3_west'}.long_name = 'western boundary NO3'; nc{'NO3_west'}.units = ncchar('mMol N m-3'); nc{'NO3_west'}.units = 'mMol N m-3'; -% + % nc{'PO4_west'} = ncdouble('po4_time','Z','eta_rho') ; nc{'PO4_west'}.long_name = ncchar('western boundary PO4'); nc{'PO4_west'}.long_name = 'western boundary PO4'; nc{'PO4_west'}.units = ncchar('mMol N m-3'); nc{'PO4_west'}.units = 'mMol N m-3'; -% + % nc{'Si_west'} = ncdouble('si_time','Z','eta_rho') ; nc{'Si_west'}.long_name = ncchar('western boundary Si'); nc{'Si_west'}.long_name = 'western boundary Si'; nc{'Si_west'}.units = ncchar('mMol N m-3'); nc{'Si_west'}.units = 'mMol N m-3'; -% + % nc{'O2_west'} = ncdouble('o2_time','Z','eta_rho') ; nc{'O2_west'}.long_name = ncchar('western boundary O2'); nc{'O2_west'}.long_name = 'western boundary O2'; nc{'O2_west'}.units = ncchar('mMol N m-3'); nc{'O2_west'}.units = 'mMol N m-3'; -% + % nc{'DIC_west'} = ncdouble('dic_time','Z','eta_rho') ; nc{'DIC_west'}.long_name = ncchar('western boundary DIC'); nc{'DIC_west'}.long_name = 'western boundary DIC'; nc{'DIC_west'}.units = ncchar('mMol N m-3'); nc{'DIC_west'}.units = 'mMol N m-3'; -% + % nc{'TALK_west'} = ncdouble('talk_time','Z','eta_rho') ; nc{'TALK_west'}.long_name = ncchar('western boundary TALK'); nc{'TALK_west'}.long_name = 'western boundary TALK'; nc{'TALK_west'}.units = ncchar('mMol N m-3'); nc{'TALK_west'}.units = 'mMol N m-3'; -% + % nc{'DOC_west'} = ncdouble('doc_time','Z','eta_rho') ; nc{'DOC_west'}.long_name = ncchar('western boundary DOC'); nc{'DOC_west'}.long_name = 'western boundary DOC'; nc{'DOC_west'}.units = ncchar('mMol N m-3'); nc{'DOC_west'}.units = 'mMol N m-3'; -% + % nc{'FER_west'} = ncdouble('fer_time','Z','eta_rho') ; nc{'FER_west'}.long_name = ncchar('western boundary Iron'); nc{'FER_west'}.long_name = 'western boundary Iron'; nc{'FER_west'}.units = ncchar('mMol N m-3'); nc{'FER_west'}.units = 'mMol N m-3'; -% - if makequota - nc{'DOP_west'} = ncdouble('dop_time','Z','eta_rho') ; - nc{'DOP_west'}.long_name = ncchar('western boundary DOP'); - nc{'DOP_west'}.long_name = 'western boundary DOP'; - nc{'DOP_west'}.units = ncchar('mMol N m-3'); - nc{'DOP_west'}.units = 'mMol N m-3'; -% - nc{'DON_west'} = ncdouble('don_time','Z','eta_rho') ; - nc{'DON_west'}.long_name = ncchar('western boundary DON'); - nc{'DON_west'}.long_name = 'western boundary DON'; - nc{'DON_west'}.units = ncchar('mMol N m-3'); - nc{'DON_west'}.units = 'mMol N m-3'; - end -% + % + if makequota + nc{'DOP_west'} = ncdouble('dop_time','Z','eta_rho') ; + nc{'DOP_west'}.long_name = ncchar('western boundary DOP'); + nc{'DOP_west'}.long_name = 'western boundary DOP'; + nc{'DOP_west'}.units = ncchar('mMol N m-3'); + nc{'DOP_west'}.units = 'mMol N m-3'; + % + nc{'DON_west'} = ncdouble('don_time','Z','eta_rho') ; + nc{'DON_west'}.long_name = ncchar('western boundary DON'); + nc{'DON_west'}.long_name = 'western boundary DON'; + nc{'DON_west'}.units = ncchar('mMol N m-3'); + nc{'DON_west'}.units = 'mMol N m-3'; + end + % end % % Leave define mode @@ -326,18 +399,18 @@ end % % Write variables % -nc('dic_time') = time; -nc('doc_time') = time; -nc('no3_time') = time; -nc('po4_time') = time; -nc('talk_time') = time; -nc('si_time') = time; -nc('fer_time') = time; -nc('o2_time') = time; - if makequota - nc('dop_time') = time; - nc('don_time') = time; - end +nc{'dic_time'}(:) = time; +nc{'doc_time'}(:) = time; +nc{'no3_time'}(:) = time; +nc{'po4_time'}(:) = time; +nc{'talk_time'}(:) = time; +nc{'si_time'}(:) = time; +nc{'fer_time'}(:) = time; +nc{'o2_time'}(:) = time; +if makequota + nc{'dop_time'}(:) = time; + nc{'don_time'}(:) = time; +end if obc(1)==1 nc{'NO3_south'}(:) = 0; nc{'PO4_south'}(:) = 0; @@ -347,12 +420,12 @@ if obc(1)==1 nc{'TALK_south'}(:) = 0; nc{'DOC_south'}(:) = 0; nc{'FER_south'}(:) = 0; - if makequota - nc{'DOP_south'}(:) = 0; - nc{'DON_south'}(:) = 0; - end -end -if obc(2)==1 + if makequota + nc{'DOP_south'}(:) = 0; + nc{'DON_south'}(:) = 0; + end +end +if obc(2)==1 nc{'NO3_east'}(:) = 0; nc{'PO4_east'}(:) = 0; nc{'Si_east'}(:) = 0; @@ -361,12 +434,12 @@ if obc(2)==1 nc{'TALK_east'}(:) = 0; nc{'DOC_east'}(:) = 0; nc{'FER_east'}(:) = 0; - if makequota - nc{'DOP_east'}(:) = 0; - nc{'DON_east'}(:) = 0; - end -end -if obc(3)==1 + if makequota + nc{'DOP_east'}(:) = 0; + nc{'DON_east'}(:) = 0; + end +end +if obc(3)==1 nc{'NO3_north'}(:) = 0; nc{'PO4_north'}(:) = 0; nc{'Si_north'}(:) = 0; @@ -375,12 +448,12 @@ if obc(3)==1 nc{'TALK_north'}(:) = 0; nc{'DOC_north'}(:) = 0; nc{'FER_north'}(:) = 0; - if makequota - nc{'DOP_north'}(:) = 0; - nc{'DON_north'}(:) = 0; - end -end -if obc(4)==1 + if makequota + nc{'DOP_north'}(:) = 0; + nc{'DON_north'}(:) = 0; + end +end +if obc(4)==1 nc{'NO3_west'}(:) = 0; nc{'PO4_west'}(:) = 0; nc{'Si_west'}(:) = 0; @@ -389,11 +462,11 @@ if obc(4)==1 nc{'TALK_west'}(:) = 0; nc{'DOC_west'}(:) = 0; nc{'FER_west'}(:) = 0; - if makequota - nc{'DOP_west'}(:) = 0; - nc{'DON_west'}(:) = 0; - end -end + if makequota + nc{'DOP_west'}(:) = 0; + nc{'DON_west'}(:) = 0; + end +end close(nc) return diff --git a/Preprocessing_tools/Bio/add_dic.m b/Preprocessing_tools/Bio/add_dic.m index 7796c218..fd3edaac 100644 --- a/Preprocessing_tools/Bio/add_dic.m +++ b/Preprocessing_tools/Bio/add_dic.m @@ -1,5 +1,5 @@ function add_dic(oafile,climfile,inifile,gridfile,seas_datafile,... - ann_datafile,cycle,makeoa,makeclim,makeini); + ann_datafile,cycle,makeoa,makeclim,makeini,Yorig); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % function [longrd,latgrd,dic]=add_dic(climfile,gridfile,... @@ -13,12 +13,12 @@ function add_dic(oafile,climfile,inifile,gridfile,seas_datafile,... % lower levels % % input: -% +% % climfile : croco climatology file to process (netcdf) % gridfile : croco grid file (netcdf) -% seas_datafile : regular longitude - latitude - z seasonal data +% seas_datafile : regular longitude - latitude - z seasonal data % file used for the upper levels (netcdf) -% ann_datafile : regular longitude - latitude - z annual data +% ann_datafile : regular longitude - latitude - z annual data % file used for the lower levels (netcdf) % cycle : time length (days) of climatology cycle (ex:360 for % annual cycle) - 0 if no cycle. @@ -29,13 +29,25 @@ function add_dic(oafile,climfile,inifile,gridfile,seas_datafile,... % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % +% options for write_time_attributes +insecond = 0 ; +add_cycle = 1 ; +% +% +% Initialize Yorig if not provided +if ~exist('Yorig', 'var') , Yorig = [] ; , end +% +% Get time attributes +[time_unit_att,time_second_unit_att,calendar_att]=... + get_time_attributes(Yorig); +% % Read in the grid % nc=netcdf(gridfile,'r'); hmax=max(max(nc{'h'}(:))); close(nc); % -% read in the datafiles +% read in the datafiles % nc=netcdf(seas_datafile,'r'); t=nc{'T'}(:); @@ -46,42 +58,37 @@ kmax=max(find(zdic<hmax))-1; zdic=zdic(1:kmax); close(nc) % -% open the OA file -% +% open the OA file +% if (makeoa) disp('Add_dic: creating variables and attributes for the OA file') nc=netcdf(oafile,'write'); -%% redef(nc); + %% redef(nc); nc('dic_time') = length(t); nc{'dic_time'} = ncdouble('dic_time') ; nc('Zdic') = length(zdic); nc{'Zdic'} = ncdouble('Zdic') ; nc{'DIC'} = ncdouble('dic_time','Zdic','eta_rho','xi_rho') ; -% - nc{'dic_time'}.long_name = ncchar('time for DIC'); - nc{'dic_time'}.long_name = 'time for DIC'; - nc{'dic_time'}.units = ncchar('day'); - nc{'dic_time'}.units = 'day'; - if cycle~=0 - nc{'dic_time'}.cycle_length = cycle; - end -% + write_time_attributes(nc,'dic_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); + + % nc{'Zdic'}.long_name = ncchar('Depth for DIC'); nc{'Zdic'}.long_name = 'Depth for DIC'; nc{'Zdic'}.units = ncchar('m'); nc{'Zdic'}.units = 'm'; -% + % nc{'DIC'}.long_name = ncchar('DIC'); nc{'DIC'}.long_name = 'DIC'; nc{'DIC'}.units = ncchar('mMol C m-3'); nc{'DIC'}.units = 'mMol C m-3'; nc{'DIC'}.fields = ncchar('DIC, scalar, series'); nc{'DIC'}.fields = 'DIC, scalar, series'; -% -%% endef(nc); -% -% record deth and time and close -% + % + %% endef(nc); + % + % record deth and time and close + % nc{'dic_time'}(:)=t*30; % if time in month in the dataset !!! nc{'Zdic'}(:)=zdic; close(nc) @@ -91,56 +98,55 @@ end % if (makeclim) disp('Add_dic: creating variables and attributes for the Climatology file') -% -% open the clim file -% + % + % open the clim file + % nc=netcdf(climfile,'write'); -%% redef(nc); + %% redef(nc); nc('dic_time') = length(t);; nc{'dic_time'} = ncdouble('dic_time') ; nc{'DIC'} = ncdouble('dic_time','s_rho','eta_rho','xi_rho') ; -% + % nc{'dic_time'}.long_name = ncchar('time for DIC'); nc{'dic_time'}.long_name = 'time for DIC'; - nc{'dic_time'}.units = ncchar('day'); - nc{'dic_time'}.units = 'day'; - if cycle~=0 - nc{'dic_time'}.cycle_length = cycle; - end -% + write_time_attributes(nc,'dic_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); + % nc{'DIC'}.long_name = ncchar('DIC'); nc{'DIC'}.long_name = 'DIC'; nc{'DIC'}.units = ncchar('mMol C m-3'); nc{'DIC'}.units = 'mMol C m-3'; nc{'DIC'}.fields = ncchar('DIC, scalar, series'); nc{'DIC'}.fields = 'DIC, scalar, series'; -% -%% endef(nc); -% -% record the time and close -% + % + %% endef(nc); + % + % record the time and close + % nc{'dic_time'}(:)=t*30; % if time in month in the dataset !!! close(nc) end -% -% Same thing for the Initial file -if (makeini) -% -disp('Add_dic: creating variables and attributes for the Initial file') -% -% open the clim file -% -nc=netcdf(inifile,'write'); -redef(nc); -nc{'DIC'} = ncdouble('time','s_rho','eta_rho','xi_rho') ; -% -nc{'DIC'}.long_name = ncchar('DIC'); -nc{'DIC'}.long_name = 'DIC'; -nc{'DIC'}.units = ncchar('mMol C m-3'); -nc{'DIC'}.units = 'mMol C m-3'; -end +% % +% % Same thing for the Initial file +% if (makeini) +% % +% disp('Add_dic: creating variables and attributes for the Initial file') +% % +% % open the clim file +% % +% nc=netcdf(inifile,'write'); +% redef(nc); +% nc{'DIC'} = ncdouble('time','s_rho','eta_rho','xi_rho') ; +% % +% nc{'DIC'}.long_name = ncchar('DIC'); +% nc{'DIC'}.long_name = 'DIC'; +% nc{'DIC'}.units = ncchar('mMol C m-3'); +% nc{'DIC'}.units = 'mMol C m-3'; +% endef(nc); +% close(nc) +% end + + -endef(nc); -close(nc) return diff --git a/Preprocessing_tools/Bio/add_doc.m b/Preprocessing_tools/Bio/add_doc.m index 2a101b7a..5362a137 100644 --- a/Preprocessing_tools/Bio/add_doc.m +++ b/Preprocessing_tools/Bio/add_doc.m @@ -1,5 +1,5 @@ function add_doc(oafile,climfile,inifile,gridfile,seas_datafile,... - ann_datafile,cycle,makeoa,makeclim,makeini); + ann_datafile,cycle,makeoa,makeclim,makeini,Yorig); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % function [longrd,latgrd,doc]=add_doc(climfile,gridfile,... @@ -13,12 +13,12 @@ function add_doc(oafile,climfile,inifile,gridfile,seas_datafile,... % lower levels % % input: -% +% % climfile : croco climatology file to process (netcdf) % gridfile : croco grid file (netcdf) -% seas_datafile : regular longitude - latitude - z seasonal data +% seas_datafile : regular longitude - latitude - z seasonal data % file used for the upper levels (netcdf) -% ann_datafile : regular longitude - latitude - z annual data +% ann_datafile : regular longitude - latitude - z annual data % file used for the lower levels (netcdf) % cycle : time length (days) of climatology cycle (ex:360 for % annual cycle) - 0 if no cycle. @@ -29,13 +29,24 @@ function add_doc(oafile,climfile,inifile,gridfile,seas_datafile,... % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % +% options for write_time_attributes +insecond = 0 ; +add_cycle = 1 ; +% +% Initialize Yorig if not provided +if ~exist('Yorig', 'var') , Yorig = []; , end +% +% Get time attributes +[time_unit_att,time_second_unit_att,calendar_att]=... + get_time_attributes(Yorig); +% % Read in the grid % nc=netcdf(gridfile,'r'); hmax=max(max(nc{'h'}(:))); close(nc); % -% read in the datafiles +% read in the datafiles % nc=netcdf(seas_datafile,'r'); t=nc{'T'}(:); @@ -46,42 +57,40 @@ kmax=max(find(zdoc<hmax))-1; zdoc=zdoc(1:kmax); close(nc) % -% open the OA file -% +% open the OA file +% if (makeoa) disp('Add_doc: creating variables and attributes for the OA file') nc=netcdf(oafile,'write'); -%% redef(nc); + %% redef(nc); nc('doc_time') = length(t); nc{'doc_time'} = ncdouble('doc_time') ; nc('Zdoc') = length(zdoc); nc{'Zdoc'} = ncdouble('Zdoc') ; nc{'DOC'} = ncdouble('doc_time','Zdoc','eta_rho','xi_rho') ; -% + % nc{'doc_time'}.long_name = ncchar('time for doc'); nc{'doc_time'}.long_name = 'time for doc'; - nc{'doc_time'}.units = ncchar('day'); - nc{'doc_time'}.units = 'day'; - if cycle~=0 - nc{'doc_time'}.cycle_length = cycle; - end -% + write_time_attributes(nc,'doc_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); + + % nc{'Zdoc'}.long_name = ncchar('Depth for DOC'); nc{'Zdoc'}.long_name = 'Depth for DOC'; nc{'Zdoc'}.units = ncchar('m'); nc{'Zdoc'}.units = 'm'; -% + % nc{'DOC'}.long_name = ncchar('DOC'); nc{'DOC'}.long_name = 'DOC'; nc{'DOC'}.units = ncchar('mMol C m-3'); nc{'DOC'}.units = 'mMol C m-3'; nc{'DOC'}.fields = ncchar('DOC, scalar, series'); nc{'DOC'}.fields = 'DOC, scalar, series'; -% -%% endef(nc); -% -% record deth and time and close -% + % + %% endef(nc); + % + % record deth and time and close + % nc{'doc_time'}(:)=t*30; % if time in month in the dataset !!! nc{'Zdoc'}(:)=zdoc; close(nc) @@ -91,56 +100,53 @@ end % if (makeclim) disp('Add_doc: creating variables and attributes for the Climatology file') -% -% open the clim file -% + % + % open the clim file + % nc=netcdf(climfile,'write'); -%% redef(nc); + %% redef(nc); nc('doc_time') = length(t);; nc{'doc_time'} = ncdouble('doc_time') ; nc{'DOC'} = ncdouble('doc_time','s_rho','eta_rho','xi_rho') ; -% + % nc{'doc_time'}.long_name = ncchar('time for doc'); nc{'doc_time'}.long_name = 'time for doc'; - nc{'doc_time'}.units = ncchar('day'); - nc{'doc_time'}.units = 'day'; - if cycle~=0 - nc{'doc_time'}.cycle_length = cycle; - end -% + write_time_attributes(nc,'doc_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); + % nc{'DOC'}.long_name = ncchar('DOC'); nc{'DOC'}.long_name = 'DOC'; nc{'DOC'}.units = ncchar('mMol C m-3'); nc{'DOC'}.units = 'mMol C m-3'; nc{'DOC'}.fields = ncchar('DOC, scalar, series'); nc{'DOC'}.fields = 'DOC, scalar, series'; -% -%% endef(nc); -% -% record the time and close -% + % + %% endef(nc); + % + % record the time and close + % nc{'doc_time'}(:)=t*30; % if time in month in the dataset !!! close(nc) end -% -% Same thing for the Initial file -% -if (makeini) -disp('Add_doc: creating variables and attributes for the Initial file') -% -% open the clim file -% -nc=netcdf(inifile,'write'); -redef(nc); -nc{'DOC'} = ncdouble('time','s_rho','eta_rho','xi_rho') ; -% -nc{'DOC'}.long_name = ncchar('DOC'); -nc{'DOC'}.long_name = 'DOC'; -nc{'DOC'}.units = ncchar('mMol C m-3'); -nc{'DOC'}.units = 'mMol C m-3'; -% -endef(nc); -close(nc) -end +% % +% % Same thing for the Initial file +% % +% if (makeini) +% disp('Add_doc: creating variables and attributes for the Initial file') +% % +% % open the clim file +% % +% nc=netcdf(inifile,'write'); +% redef(nc); +% nc{'DOC'} = ncdouble('time','s_rho','eta_rho','xi_rho') ; +% % +% nc{'DOC'}.long_name = ncchar('DOC'); +% nc{'DOC'}.long_name = 'DOC'; +% nc{'DOC'}.units = ncchar('mMol C m-3'); +% nc{'DOC'}.units = 'mMol C m-3'; +% % +% endef(nc); +% close(nc) +% end return diff --git a/Preprocessing_tools/Bio/add_don.m b/Preprocessing_tools/Bio/add_don.m index 4d769193..005b6f03 100644 --- a/Preprocessing_tools/Bio/add_don.m +++ b/Preprocessing_tools/Bio/add_don.m @@ -1,5 +1,5 @@ function add_don(oafile,climfile,inifile,gridfile,seas_datafile,... - ann_datafile,cycle,makeoa,makeclim,makequota,makeini); + ann_datafile,cycle,makeoa,makeclim,makequota,makeini,Yorig); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % function [longrd,latgrd,doc]=add_doc(climfile,gridfile,... @@ -50,6 +50,18 @@ function add_don(oafile,climfile,inifile,gridfile,seas_datafile,... % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % +% options for write_time_attributes +insecond = 0 ; +add_cycle = 1 ; +% +% Initialize Yorig if not provided +if ~exist('Yorig', 'var') , Yorig = []; , end +% +% Get time attributes +[time_unit_att,time_second_unit_att,calendar_att]=... + get_time_attributes(Yorig); +% +% % Read in the grid % nc=netcdf(gridfile,'r'); @@ -100,11 +112,9 @@ if (makeoa) nc{'don_time'}.long_name = ncchar('time for don'); nc{'don_time'}.long_name = 'time for don'; - nc{'don_time'}.units = ncchar('day'); - nc{'don_time'}.units = 'day'; - if cycle~=0 - nc{'don_time'}.cycle_length = cycle; - end + write_time_attributes(nc,'don_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); + %% nc{'Zdon'}.long_name = ncchar('Depth for DON'); nc{'Zdon'}.long_name = 'Depth for DON'; @@ -143,11 +153,8 @@ if (makeclim) % nc{'don_time'}.long_name = ncchar('time for don'); nc{'don_time'}.long_name = 'time for don'; - nc{'don_time'}.units = ncchar('day'); - nc{'don_time'}.units = 'day'; - if cycle~=0 - nc{'don_time'}.cycle_length = cycle; - end + write_time_attributes(nc,'don_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'DON'}.long_name = ncchar('DON'); nc{'DON'}.long_name = 'DON'; @@ -163,25 +170,25 @@ if (makeclim) nc{'don_time'}(:)=t*30; % if time in month in the dataset !!! close(nc) end -% -% Same thing for the Initial file -% -if (makeini) -disp('Add_don: creating variables and attributes for the Initial file') -% -% open the clim file -% -nc=netcdf(inifile,'write'); -redef(nc); -nc{'DON'} = ncdouble('time','s_rho','eta_rho','xi_rho') ; -% -nc{'DON'}.long_name = ncchar('DON'); -nc{'DON'}.long_name = 'DON'; -nc{'DON'}.units = ncchar('mMol C m-3'); -nc{'DON'}.units = 'mMol C m-3'; -% -endef(nc); -close(nc) -end +% % +% % Same thing for the Initial file +% % +% if (makeini) +% disp('Add_don: creating variables and attributes for the Initial file') +% % +% % open the clim file +% % +% nc=netcdf(inifile,'write'); +% redef(nc); +% nc{'DON'} = ncdouble('time','s_rho','eta_rho','xi_rho') ; +% % +% nc{'DON'}.long_name = ncchar('DON'); +% nc{'DON'}.long_name = 'DON'; +% nc{'DON'}.units = ncchar('mMol C m-3'); +% nc{'DON'}.units = 'mMol C m-3'; +% % +% endef(nc); +% close(nc) +% end return diff --git a/Preprocessing_tools/Bio/add_dop.m b/Preprocessing_tools/Bio/add_dop.m index 8c990087..5010f40d 100644 --- a/Preprocessing_tools/Bio/add_dop.m +++ b/Preprocessing_tools/Bio/add_dop.m @@ -1,5 +1,5 @@ function add_dop(oafile,climfile,inifile,gridfile,seas_datafile,... - ann_datafile,cycle,makeoa,makeclim,makequota,makeini); + ann_datafile,cycle,makeoa,makeclim,makequota,makeini,Yorig); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % function [longrd,latgrd,dop]=add_dop(climfile,gridfile,... @@ -49,6 +49,18 @@ function add_dop(oafile,climfile,inifile,gridfile,seas_datafile,... % e-mail:Pierrick.Penven@ird.fr % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% options for write_time_attributes +insecond = 0 ; +add_cycle = 1 ; +% +% Initialize Yorig if not provided +if ~exist('Yorig', 'var') , Yorig = []; , end +% +% Get time attributes +[time_unit_att,time_second_unit_att,calendar_att]=... + get_time_attributes(Yorig); +% % % Read in the grid % @@ -100,11 +112,8 @@ if (makeoa) nc{'dop_time'}.long_name = ncchar('time for dop'); nc{'dop_time'}.long_name = 'time for dop'; - nc{'dop_time'}.units = ncchar('day'); - nc{'dop_time'}.units = 'day'; - if cycle~=0 - nc{'dop_time'}.cycle_length = cycle; - end + write_time_attributes(nc,'dop_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'Zdop'}.long_name = ncchar('Depth for DOP'); nc{'Zdop'}.long_name = 'Depth for DOP'; @@ -143,11 +152,8 @@ if (makeclim) % nc{'dop_time'}.long_name = ncchar('time for dop'); nc{'dop_time'}.long_name = 'time for dop'; - nc{'dop_time'}.units = ncchar('day'); - nc{'dop_time'}.units = 'day'; - if cycle~=0 - nc{'dop_time'}.cycle_length = cycle; - end + write_time_attributes(nc,'dop_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'DOP'}.long_name = ncchar('DOP'); nc{'DOP'}.long_name = 'DOP'; @@ -163,22 +169,23 @@ if (makeclim) nc{'dop_time'}(:)=t*30; % if time in month in the dataset !!! close(nc) end -if (makeini) -disp('Add_dop: creating variables and attributes for the Initial file') -% -% open the clim file -% -nc=netcdf(inifile,'write'); -redef(nc); -nc{'DOP'} = ncdouble('time','s_rho','eta_rho','xi_rho') ; -% -nc{'DOP'}.long_name = ncchar('DOP'); -nc{'DOP'}.long_name = 'DOP'; -nc{'DOP'}.units = ncchar('mMol C m-3'); -nc{'DOP'}.units = 'mMol C m-3'; -% -endef(nc); -close(nc) -end +% % +% if (makeini) +% disp('Add_dop: creating variables and attributes for the Initial file') +% % +% % open the clim file +% % +% nc=netcdf(inifile,'write'); +% redef(nc); +% nc{'DOP'} = ncdouble('time','s_rho','eta_rho','xi_rho') ; +% % +% nc{'DOP'}.long_name = ncchar('DOP'); +% nc{'DOP'}.long_name = 'DOP'; +% nc{'DOP'}.units = ncchar('mMol C m-3'); +% nc{'DOP'}.units = 'mMol C m-3'; +% % +% endef(nc); +% close(nc) +% end return diff --git a/Preprocessing_tools/Bio/add_fer.m b/Preprocessing_tools/Bio/add_fer.m index 086a1879..6ae7633c 100644 --- a/Preprocessing_tools/Bio/add_fer.m +++ b/Preprocessing_tools/Bio/add_fer.m @@ -1,5 +1,5 @@ function add_fer(oafile,climfile,inifile,gridfile,seas_datafile,... - ann_datafile,cycle,makeoa,makeclim,makeini); + ann_datafile,cycle,makeoa,makeclim,makeini,Yorig); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % function [longrd,latgrd,fer]=add_fer(climfile,gridfile,... @@ -13,12 +13,12 @@ function add_fer(oafile,climfile,inifile,gridfile,seas_datafile,... % lower levels % % input: -% +% % climfile : croco climatology file to process (netcdf) % gridfile : croco grid file (netcdf) -% seas_datafile : regular longitude - latitude - z seasonal data +% seas_datafile : regular longitude - latitude - z seasonal data % file used for the upper levels (netcdf) -% ann_datafile : regular longitude - latitude - z annual data +% ann_datafile : regular longitude - latitude - z annual data % file used for the lower levels (netcdf) % cycle : time length (days) of climatology cycle (ex:360 for % annual cycle) - 0 if no cycle. @@ -29,13 +29,25 @@ function add_fer(oafile,climfile,inifile,gridfile,seas_datafile,... % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % +% options for write_time_attributes +insecond = 0 ; +add_cycle = 1 ; +% +% Initialize Yorig if not provided +if ~exist('Yorig', 'var') , Yorig = []; , end +% +% Get time attributes +[time_unit_att,time_second_unit_att,calendar_att]=... + get_time_attributes(Yorig); +% +% % Read in the grid % nc=netcdf(gridfile,'r'); hmax=max(max(nc{'h'}(:))); close(nc); % -% read in the datafiles +% read in the datafiles % nc=netcdf(seas_datafile,'r'); t=nc{'T'}(:); @@ -46,42 +58,40 @@ kmax=max(find(zfer<hmax))-1; zfer=zfer(1:kmax); close(nc) % -% open the OA file -% +% open the OA file +% if (makeoa) disp('Add_fer: creating variables and attributes for the OA file') nc=netcdf(oafile,'write'); -%% redef(nc); + %% redef(nc); nc('fer_time') = length(t); nc{'fer_time'} = ncdouble('fer_time') ; nc('Zfer') = length(zfer); nc{'Zfer'} = ncdouble('Zfer') ; nc{'FER'} = ncdouble('fer_time','Zfer','eta_rho','xi_rho') ; -% + % nc{'fer_time'}.long_name = ncchar('time for iron'); nc{'fer_time'}.long_name = 'time for iron'; - nc{'fer_time'}.units = ncchar('day'); - nc{'fer_time'}.units = 'day'; - if cycle~=0 - nc{'fer_time'}.cycle_length = cycle; - end -% + write_time_attributes(nc,'fer_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); + + % nc{'Zfer'}.long_name = ncchar('Depth for FER'); nc{'Zfer'}.long_name = 'Depth for FER'; nc{'Zfer'}.units = ncchar('m'); nc{'Zfer'}.units = 'm'; -% + % nc{'FER'}.long_name = ncchar('Iron'); nc{'FER'}.long_name = 'Iron'; nc{'FER'}.units = ncchar('uMol Fe m-3'); nc{'FER'}.units = 'uMol Fe m-3'; nc{'FER'}.fields = ncchar('FER, scalar, series'); nc{'FER'}.fields = 'FER, scalar, series'; -% -%% endef(nc); -% -% record deth and time and close -% + % + %% endef(nc); + % + % record deth and time and close + % nc{'fer_time'}(:)=t*30; % if time in month in the dataset !!! nc{'Zfer'}(:)=zfer; close(nc) @@ -91,52 +101,49 @@ end % if (makeclim) disp('Add_fer: creating variables and attributes for the Climatology file') -% -% open the clim file -% + % + % open the clim file + % nc=netcdf(climfile,'write'); -%% redef(nc); - nc('fer_time') = length(t);; + %% redef(nc); + nc('fer_time') = length(t); nc{'fer_time'} = ncdouble('fer_time') ; nc{'FER'} = ncdouble('fer_time','s_rho','eta_rho','xi_rho') ; -% + % nc{'fer_time'}.long_name = ncchar('time for iron'); nc{'fer_time'}.long_name = 'time for iron'; - nc{'fer_time'}.units = ncchar('day'); - nc{'fer_time'}.units = 'day'; - if cycle~=0 - nc{'fer_time'}.cycle_length = cycle; - end -% + write_time_attributes(nc,'fer_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); + % nc{'FER'}.long_name = ncchar('Iron'); nc{'FER'}.long_name = 'Iron'; nc{'FER'}.units = ncchar('uMol Fe m-3'); nc{'FER'}.units = 'uMol Fe m-3'; nc{'FER'}.fields = ncchar('FER, scalar, series'); nc{'FER'}.fields = 'FER, scalar, series'; -% -%% endef(nc); -% -% record the time and close -% + % + %% endef(nc); + % + % record the time and close + % nc{'fer_time'}(:)=t*30; % if time in month in the dataset !!! close(nc) end -if (makeini) -disp('Add_fer: creating variables and attributes for the Initial file') -% -% open the clim file -% -nc=netcdf(inifile,'write'); -redef(nc); -nc{'FER'} = ncdouble('time','s_rho','eta_rho','xi_rho') ; -% -nc{'FER'}.long_name = ncchar('FER'); -nc{'FER'}.long_name = 'FER'; -nc{'FER'}.units = ncchar('uMol Fe m-3'); -nc{'FER'}.units = 'uMol Fe m-3'; -% -endef(nc); -close(nc) -end +% if (makeini) +% disp('Add_fer: creating variables and attributes for the Initial file') +% % +% % open the clim file +% % +% nc=netcdf(inifile,'write'); +% redef(nc); +% nc{'FER'} = ncdouble('time','s_rho','eta_rho','xi_rho') ; +% % +% nc{'FER'}.long_name = ncchar('FER'); +% nc{'FER'}.long_name = 'FER'; +% nc{'FER'}.units = ncchar('uMol Fe m-3'); +% nc{'FER'}.units = 'uMol Fe m-3'; +% % +% endef(nc); +% close(nc) +% end return diff --git a/Preprocessing_tools/Bio/add_no3.m b/Preprocessing_tools/Bio/add_no3.m index ac708dae..8a528bde 100644 --- a/Preprocessing_tools/Bio/add_no3.m +++ b/Preprocessing_tools/Bio/add_no3.m @@ -1,5 +1,5 @@ function add_no3(oafile,climfile,inifile,gridfile,seas_datafile,... - ann_datafile,cycle,makeoa,makeclim,makeini); + ann_datafile,cycle,makeoa,makeclim,makeini,Yorig); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % function [longrd,latgrd,no3]=add_no3(climfile,gridfile,... @@ -11,12 +11,12 @@ function add_no3(oafile,climfile,inifile,gridfile,seas_datafile,... % lower levels % % input: -% +% % climfile : croco climatology file to process (netcdf) % gridfile : croco grid file (netcdf) -% seas_datafile : regular longitude - latitude - z seasonal data +% seas_datafile : regular longitude - latitude - z seasonal data % file used for the upper levels (netcdf) -% ann_datafile : regular longitude - latitude - z annual data +% ann_datafile : regular longitude - latitude - z annual data % file used for the lower levels (netcdf) % cycle : time length (days) of climatology cycle (ex:360 for % annual cycle) - 0 if no cycle. @@ -24,10 +24,10 @@ function add_no3(oafile,climfile,inifile,gridfile,seas_datafile,... % output: % % [longrd,latgrd,no3] : surface field to plot (as an illustration) -% -% Further Information: +% +% Further Information: % http://www.croco-ocean.org -% +% % This file is part of CROCOTOOLS % % CROCOTOOLS is free software; you can redistribute it and/or modify @@ -45,18 +45,30 @@ function add_no3(oafile,climfile,inifile,gridfile,seas_datafile,... % Foundation, Inc., 59 Temple Place, Suite 330, Boston, % MA 02111-1307 USA % -% Copyright (c) 2001-2006 by Pierrick Penven -% e-mail:Pierrick.Penven@ird.fr +% Copyright (c) 2001-2006 by Pierrick Penven +% e-mail:Pierrick.Penven@ird.fr % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % +% options for write_time_attributes +insecond = 0 ; +add_cycle = 1 ; +% +% Initialize Yorig if not provided +if ~exist('Yorig', 'var') , Yorig = []; , end +% +% Get time attributes +[time_unit_att,time_second_unit_att,calendar_att]=... + get_time_attributes(Yorig); +% +% % Read in the grid % nc=netcdf(gridfile,'r'); hmax=max(max(nc{'h'}(:))); close(nc); % -% read in the datafiles +% read in the datafiles % nc=netcdf(seas_datafile,'r'); t=nc{'T'}(:); @@ -70,59 +82,56 @@ zno3=zno3(1:kmax); size(zno3); close(nc) % -% open the OA file -% +% open the OA file +% if (makeoa) disp('Add_no3: creating variables and attributes for the OA file') nc=netcdf(oafile,'write'); - % redef(nc); - + % redef(nc); + %Create Dimensions nc('no3_time') = length(t); %Create Variable nc{'no3_time'} = ncdouble('no3_time') ; -% -%% -% + % + %% + % %Create Dimensions - nc('Zno3') = length(zno3); + nc('Zno3') = length(zno3); %Create Variable nc{'Zno3'} = ncdouble('Zno3') ; -% -%% -% + % + %% + % %Create Variable nc{'NO3'} = ncdouble('no3_time','Zno3','eta_rho','xi_rho') ; -% -%% -% + % + %% + % %Create Attribute - + nc{'no3_time'}.long_name = ncchar('time for nitrate'); nc{'no3_time'}.long_name = 'time for nitrate'; - nc{'no3_time'}.units = ncchar('day'); - nc{'no3_time'}.units = 'day'; - if cycle~=0 - nc{'no3_time'}.cycle_length = cycle; - end -%%% + write_time_attributes(nc,'no3_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); + %%% nc{'Zno3'}.long_name = ncchar('Depth for NO3'); nc{'Zno3'}.long_name = 'Depth for NO3'; nc{'Zno3'}.units = ncchar('m'); nc{'Zno3'}.units = 'm'; -%%% + %%% nc{'NO3'}.long_name = ncchar('Nitrate'); nc{'NO3'}.long_name = 'Nitrate'; nc{'NO3'}.units = ncchar('mMol N m-3'); nc{'NO3'}.units = 'mMol N m-3'; nc{'NO3'}.fields = ncchar('NO3, scalar, series'); nc{'NO3'}.fields = 'NO3, scalar, series'; -%%% -%% endef(nc); -% -%% Write variables -%% record depth and time and close -% + %%% + %% endef(nc); + % + %% Write variables + %% record depth and time and close + % nc{'no3_time'}(:)=t*30; % if time in month in the dataset !!! nc{'Zno3'}(:)=zno3; close(nc) @@ -132,56 +141,59 @@ end % if (makeclim) disp('Add_no3: creating variables and attributes for the Climatology file') -% -% open the clim file -% + % + % open the clim file + % nc=netcdf(climfile,'write'); - % redef(nc); + % redef(nc); nc('no3_time') = length(t);; nc{'no3_time'} = ncdouble('no3_time') ; nc{'NO3'} = ncdouble('no3_time','s_rho','eta_rho','xi_rho') ; -% + % nc{'no3_time'}.long_name = ncchar('time for nitrate'); nc{'no3_time'}.long_name = 'time for nitrate'; - nc{'no3_time'}.units = ncchar('day'); - nc{'no3_time'}.units = 'day'; + nc{'no3_time'}.units = ncchar(time_unit_att); + nc{'no3_time'}.units = time_unit_att; + nc{'no3_time'}.calendar = calendar_att; if cycle~=0 nc{'no3_time'}.cycle_length = cycle; end -% + write_time_attributes(nc,'tclm_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); + % nc{'NO3'}.long_name = ncchar('Nitrate'); nc{'NO3'}.long_name = 'Nitrate'; nc{'NO3'}.units = ncchar('mMol N m-3'); nc{'NO3'}.units = 'mMol N m-3'; nc{'NO3'}.fields = ncchar('NO3, scalar, series'); nc{'NO3'}.fields = 'NO3, scalar, series'; -% -%% endef(nc); -% -% record the time and close -% + % + %% endef(nc); + % + % record the time and close + % nc{'no3_time'}(:)=t*30; % if time in month in the dataset !!! close(nc) end -% -if (makeini) -% Same thing for the Initial file -% -disp('Add_no3: creating variables and attributes for the Initial file') -% -% open the clim file - -nc=netcdf(inifile,'write'); -redef(nc); -nc{'NO3'} = ncdouble('time','s_rho','eta_rho','xi_rho') ; +% % +% if (makeini) +% % Same thing for the Initial file +% % +% disp('Add_no3: creating variables and attributes for the Initial file') +% % +% % open the clim file -nc{'NO3'}.long_name = ncchar('Nitrate'); -nc{'NO3'}.long_name = 'Nitrate'; -nc{'NO3'}.units = ncchar('mMol N m-3'); -nc{'NO3'}.units = 'mMol N m-3'; +% nc=netcdf(inifile,'write'); +% redef(nc); +% nc{'NO3'} = ncdouble('time','s_rho','eta_rho','xi_rho') ; -endef(nc); -close(nc) -end +% nc{'NO3'}.long_name = ncchar('Nitrate'); +% nc{'NO3'}.long_name = 'Nitrate'; +% nc{'NO3'}.units = ncchar('mMol N m-3'); +% nc{'NO3'}.units = 'mMol N m-3'; + +% endef(nc); +% close(nc) +% end return diff --git a/Preprocessing_tools/Bio/add_o2.m b/Preprocessing_tools/Bio/add_o2.m index 7a266525..febe5c29 100644 --- a/Preprocessing_tools/Bio/add_o2.m +++ b/Preprocessing_tools/Bio/add_o2.m @@ -1,5 +1,5 @@ function add_o2(oafile,climfile,inifile,gridfile,month_datafile,... - ann_datafile,cycle,makeoa,makeclim,makeini); + ann_datafile,cycle,makeoa,makeclim,makeini,Yorig); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % function [longrd,latgrd,o2]=add_o2(climfile,gridfile,... @@ -13,12 +13,12 @@ function add_o2(oafile,climfile,inifile,gridfile,month_datafile,... % lower levels % % input: -% +% % climfile : croco climatology file to process (netcdf) % gridfile : croco grid file (netcdf) -% month_datafile : regular longitude - latitude - z monthly data +% month_datafile : regular longitude - latitude - z monthly data % file used for the upper levels (netcdf) -% ann_datafile : regular longitude - latitude - z annual data +% ann_datafile : regular longitude - latitude - z annual data % file used for the lower levels (netcdf) % cycle : time length (days) of climatology cycle (ex:360 for % annual cycle) - 0 if no cycle. @@ -29,13 +29,25 @@ function add_o2(oafile,climfile,inifile,gridfile,month_datafile,... % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % +% options for write_time_attributes +insecond = 0 ; +add_cycle = 1 ; +% +% Initialize Yorig if not provided +if ~exist('Yorig', 'var') , Yorig = []; , end +% +% Get time attributes +[time_unit_att,time_second_unit_att,calendar_att]=... + get_time_attributes(Yorig); +% +% % Read in the grid % nc=netcdf(gridfile,'r'); hmax=max(max(nc{'h'}(:))); close(nc); % -% read in the datafiles +% read in the datafiles % nc=netcdf(month_datafile,'r'); t=nc{'T'}(:); @@ -46,42 +58,40 @@ kmax=max(find(zo2<hmax))-1; zo2=zo2(1:kmax); close(nc) % -% open the OA file -% +% open the OA file +% if (makeoa) disp('Add_o2: creating variables and attributes for the OA file') nc=netcdf(oafile,'write'); -%% redef(nc); + %% redef(nc); nc('o2_time') = length(t); nc{'o2_time'} = ncdouble('o2_time') ; nc('Zo2') = length(zo2); nc{'Zo2'} = ncdouble('Zo2') ; nc{'O2'} = ncdouble('o2_time','Zo2','eta_rho','xi_rho') ; -% + % nc{'o2_time'}.long_name = ncchar('time for oxygen'); nc{'o2_time'}.long_name = 'time for oxygen'; - nc{'o2_time'}.units = ncchar('day'); - nc{'o2_time'}.units = 'day'; - if cycle~=0 - nc{'o2_time'}.cycle_length = cycle; - end -% + write_time_attributes(nc,'o2_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); + + % nc{'Zo2'}.long_name = ncchar('Depth for O2'); nc{'Zo2'}.long_name = 'Depth for O2'; nc{'Zo2'}.units = ncchar('m'); nc{'Zo2'}.units = 'm'; -% + % nc{'O2'}.long_name = ncchar('Oxygen'); nc{'O2'}.long_name = 'Oxygen'; nc{'O2'}.units = ncchar('mMol O m-3'); nc{'O2'}.units = 'mMol O m-3'; nc{'O2'}.fields = ncchar('O2, scalar, series'); nc{'O2'}.fields = 'O2, scalar, series'; -% -%% endef(nc); -% -% record depth and time and close -% + % + %% endef(nc); + % + % record depth and time and close + % nc{'o2_time'}(:)=t*30; % ojo aqui quite *30 % if time in month in the dataset !!! nc{'Zo2'}(:)=squeeze(zo2); close(nc) @@ -91,55 +101,53 @@ end % if (makeclim) disp('Add_o2: creating variables and attributes for the Climatology file') -% -% open the clim file -% + % + % open the clim file + % nc=netcdf(climfile,'write'); - %% redef(nc); + %% redef(nc); nc('o2_time') = length(t); nc{'o2_time'} = ncdouble('o2_time') ; nc{'O2'} = ncdouble('o2_time','s_rho','eta_rho','xi_rho') ; -% + % nc{'o2_time'}.long_name = ncchar('time for oxygen'); nc{'o2_time'}.long_name = 'time for oxygen'; - nc{'o2_time'}.units = ncchar('day'); - nc{'o2_time'}.units = 'day'; - if cycle~=0 - nc{'o2_time'}.cycle_length = cycle; - end -% + write_time_attributes(nc,'o2_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); + % nc{'O2'}.long_name = ncchar('Oxygen'); nc{'O2'}.long_name = 'Oxygen'; nc{'O2'}.units = ncchar('mMol O m-3'); nc{'O2'}.units = 'mMol O m-3'; nc{'O2'}.fields = ncchar('O2, scalar, series'); nc{'O2'}.fields = 'O2, scalar, series'; -% -%% endef(nc); -% -% record the time and close -% + % + %% endef(nc); + % + % record the time and close + % nc{'o2_time'}(:,:)=t*30; % if time in month in the dataset !!! close(nc) end -if (makeini) -% Same thing for the Initial file -% -disp('Add_o2: creating variables and attributes for the Initial file') -% -% open the clim file +% % +% if (makeini) +% % Same thing for the Initial file +% % +% disp('Add_o2: creating variables and attributes for the Initial file') +% % +% % open the clim file -nc=netcdf(inifile,'write'); -redef(nc); -nc{'O2'} = ncdouble('time','s_rho','eta_rho','xi_rho') ; +% nc=netcdf(inifile,'write'); +% redef(nc); +% nc{'O2'} = ncdouble('time','s_rho','eta_rho','xi_rho') ; -nc{'O2'}.long_name = ncchar('Oxygen'); -nc{'O2'}.long_name = 'Oxygen'; -nc{'O2'}.units = ncchar('mMol O m-3'); -nc{'O2'}.units = 'mMol O m-3'; +% nc{'O2'}.long_name = ncchar('Oxygen'); +% nc{'O2'}.long_name = 'Oxygen'; +% nc{'O2'}.units = ncchar('mMol O m-3'); +% nc{'O2'}.units = 'mMol O m-3'; -endef(nc); -close(nc) -end +% endef(nc); +% close(nc) +% end return diff --git a/Preprocessing_tools/Bio/add_po4.m b/Preprocessing_tools/Bio/add_po4.m index b495f53f..16f4c6ec 100644 --- a/Preprocessing_tools/Bio/add_po4.m +++ b/Preprocessing_tools/Bio/add_po4.m @@ -1,5 +1,5 @@ function add_po4(oafile,climfile,inifile,gridfile,seas_datafile,... - ann_datafile,cycle,makeoa,makeclim,makeini); + ann_datafile,cycle,makeoa,makeclim,makeini,Yorig); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % function [longrd,latgrd,po4]=add_po4(climfile,gridfile,... @@ -13,12 +13,12 @@ function add_po4(oafile,climfile,inifile,gridfile,seas_datafile,... % lower levels % % input: -% +% % climfile : croco climatology file to process (netcdf) % gridfile : croco grid file (netcdf) -% seas_datafile : regular longitude - latitude - z seasonal data +% seas_datafile : regular longitude - latitude - z seasonal data % file used for the upper levels (netcdf) -% ann_datafile : regular longitude - latitude - z annual data +% ann_datafile : regular longitude - latitude - z annual data % file used for the lower levels (netcdf) % cycle : time length (days) of climatology cycle (ex:360 for % annual cycle) - 0 if no cycle. @@ -28,6 +28,17 @@ function add_po4(oafile,climfile,inifile,gridfile,seas_datafile,... % [longrd,latgrd,po4] : surface field to plot (as an illustration) % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% options for write_time_attributes +insecond = 0 ; +add_cycle = 1 ; +% +% Initialize Yorig if not provided +if ~exist('Yorig', 'var') , Yorig = []; , end +% +% Get time attributes +[time_unit_att,time_second_unit_att,calendar_att]=... + get_time_attributes(Yorig); +% % % Read in the grid % @@ -35,7 +46,7 @@ nc=netcdf(gridfile,'r'); hmax=max(max(nc{'h'}(:))); close(nc); % -% read in the datafiles +% read in the datafiles % nc=netcdf(seas_datafile,'r'); t=nc{'T'}(:); @@ -46,42 +57,39 @@ kmax=max(find(zpo4<hmax))-1; zpo4=zpo4(1:kmax); close(nc) % -% open the OA file -% +% open the OA file +% if (makeoa) disp('Add_po4: creating variables and attributes for the OA file') nc=netcdf(oafile,'write'); -%% redef(nc); + %% redef(nc); nc('po4_time') = length(t); nc{'po4_time'} = ncdouble('po4_time') ; nc('Zpo4') = length(zpo4); nc{'Zpo4'} = ncdouble('Zpo4') ; nc{'PO4'} = ncdouble('po4_time','Zpo4','eta_rho','xi_rho') ; -% + % nc{'po4_time'}.long_name = ncchar('time for phosphate'); nc{'po4_time'}.long_name = 'time for phosphate'; - nc{'po4_time'}.units = ncchar('day'); - nc{'po4_time'}.units = 'day'; - if cycle~=0 - nc{'po4_time'}.cycle_length = cycle; - end -% + write_time_attributes(nc,'po4_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); + % nc{'Zpo4'}.long_name = ncchar('Depth for PO4'); nc{'Zpo4'}.long_name = 'Depth for PO4'; nc{'Zpo4'}.units = ncchar('m'); nc{'Zpo4'}.units = 'm'; -% + % nc{'PO4'}.long_name = ncchar('Phosphate'); nc{'PO4'}.long_name = 'Phosphate'; nc{'PO4'}.units = ncchar('mMol P m-3'); nc{'PO4'}.units = 'mMol P m-3'; nc{'PO4'}.fields = ncchar('PO4, scalar, series'); nc{'PO4'}.fields = 'PO4, scalar, series'; -% -%% endef(nc); -% -% record deth and time and close -% + % + %% endef(nc); + % + % record deth and time and close + % nc{'po4_time'}(:)=t*30; % if time in month in the dataset !!! nc{'Zpo4'}(:)=zpo4; close(nc) @@ -91,54 +99,51 @@ end % if (makeclim) disp('Add_po4: creating variables and attributes for the Climatology file') -% -% open the clim file -% + % + % open the clim file + % nc=netcdf(climfile,'write'); -%% redef(nc); + %% redef(nc); nc('po4_time') = length(t);; nc{'po4_time'} = ncdouble('po4_time') ; nc{'PO4'} = ncdouble('po4_time','s_rho','eta_rho','xi_rho') ; -% + % nc{'po4_time'}.long_name = ncchar('time for phosphate'); nc{'po4_time'}.long_name = 'time for phosphate'; - nc{'po4_time'}.units = ncchar('day'); - nc{'po4_time'}.units = 'day'; - if cycle~=0 - nc{'po4_time'}.cycle_length = cycle; - end -% + write_time_attributes(nc,'po4_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); + % nc{'PO4'}.long_name = ncchar('Phosphate'); nc{'PO4'}.long_name = 'Phosphate'; nc{'PO4'}.units = ncchar('mMol P m-3'); nc{'PO4'}.units = 'mMol P m-3'; nc{'PO4'}.fields = ncchar('PO4, scalar, series'); nc{'PO4'}.fields = 'PO4, scalar, series'; -% -%% endef(nc); -% -% record the time and close -% + % + %% endef(nc); + % + % record the time and close + % nc{'po4_time'}(:)=t*30; % if time in month in the dataset !!! close(nc) end -if (makeini) -% Same thing for the Initial file -% -disp('Add_po4: creating variables and attributes for the Initial file') -% -% open the clim file +% if (makeini) +% % Same thing for the Initial file +% % +% disp('Add_po4: creating variables and attributes for the Initial file') +% % +% % open the clim file -nc=netcdf(inifile,'write'); -redef(nc); -nc{'PO4'} = ncdouble('time','s_rho','eta_rho','xi_rho') ; +% nc=netcdf(inifile,'write'); +% redef(nc); +% nc{'PO4'} = ncdouble('time','s_rho','eta_rho','xi_rho') ; -nc{'PO4'}.long_name = ncchar('Phosphate'); -nc{'PO4'}.long_name = 'Phosphate'; -nc{'PO4'}.units = ncchar('mMol P m-3'); -nc{'PO4'}.units = 'mMol P m-3'; +% nc{'PO4'}.long_name = ncchar('Phosphate'); +% nc{'PO4'}.long_name = 'Phosphate'; +% nc{'PO4'}.units = ncchar('mMol P m-3'); +% nc{'PO4'}.units = 'mMol P m-3'; -endef(nc); -close(nc) -end +% endef(nc); +% close(nc) +% end return diff --git a/Preprocessing_tools/Bio/add_sio3.m b/Preprocessing_tools/Bio/add_sio3.m index b7ad5053..9708ce01 100644 --- a/Preprocessing_tools/Bio/add_sio3.m +++ b/Preprocessing_tools/Bio/add_sio3.m @@ -1,5 +1,5 @@ function add_sio3(oafile,climfile,inifile,gridfile,seas_datafile,... - ann_datafile,cycle,makeoa,makeclim,makeini); + ann_datafile,cycle,makeoa,makeclim,makeini,Yorig); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % function [longrd,latgrd,sio3]=add_sio3(climfile,gridfile,... @@ -13,12 +13,12 @@ function add_sio3(oafile,climfile,inifile,gridfile,seas_datafile,... % lower levels % % input: -% +% % climfile : croco climatology file to process (netcdf) % gridfile : croco grid file (netcdf) -% seas_datafile : regular longitude - latitude - z seasonal data +% seas_datafile : regular longitude - latitude - z seasonal data % file used for the upper levels (netcdf) -% ann_datafile : regular longitude - latitude - z annual data +% ann_datafile : regular longitude - latitude - z annual data % file used for the lower levels (netcdf) % cycle : time length (days) of climatology cycle (ex:360 for % annual cycle) - 0 if no cycle. @@ -29,13 +29,25 @@ function add_sio3(oafile,climfile,inifile,gridfile,seas_datafile,... % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % +% options for write_time_attributes +insecond = 0 ; +add_cycle = 1 ; +% +% Initialize Yorig if not provided +if ~exist('Yorig', 'var') , Yorig = []; , end +% +% Get time attributes +[time_unit_att,time_second_unit_att,calendar_att]=... + get_time_attributes(Yorig); +% +% % Read in the grid % nc=netcdf(gridfile,'r'); hmax=max(max(nc{'h'}(:))); close(nc); % -% read in the datafiles +% read in the datafiles % nc=netcdf(seas_datafile,'r'); t=nc{'T'}(:); @@ -46,42 +58,39 @@ kmax=max(find(zsi<hmax))-1; zsi=zsi(1:kmax); close(nc) % -% open the OA file -% +% open the OA file +% if (makeoa) disp('Add_sio3: creating variables and attributes for the OA file') nc=netcdf(oafile,'write'); -%% redef(nc); + %% redef(nc); nc('si_time') = length(t); nc{'si_time'} = ncdouble('si_time') ; nc('Zsi') = length(zsi); nc{'Zsi'} = ncdouble('Zsi') ; nc{'Si'} = ncdouble('si_time','Zsi','eta_rho','xi_rho') ; -% + % nc{'si_time'}.long_name = ncchar('time for silicate'); nc{'si_time'}.long_name = 'time for silicate'; - nc{'si_time'}.units = ncchar('day'); - nc{'si_time'}.units = 'day'; - if cycle~=0 - nc{'si_time'}.cycle_length = cycle; - end -% + write_time_attributes(nc,'si_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); + % nc{'Zsi'}.long_name = ncchar('Depth for Si'); nc{'Zsi'}.long_name = 'Depth for Si'; nc{'Zsi'}.units = ncchar('m'); nc{'Zsi'}.units = 'm'; -% + % nc{'Si'}.long_name = ncchar('Silicate'); nc{'Si'}.long_name = 'Silicate'; nc{'Si'}.units = ncchar('mMol Si m-3'); nc{'Si'}.units = 'mMol Si m-3'; nc{'Si'}.fields = ncchar('Si, scalar, series'); nc{'Si'}.fields = 'Si, scalar, series'; -% -%% endef(nc); -% -% record deth and time and close -% + % + %% endef(nc); + % + % record deth and time and close + % nc{'si_time'}(:)=t*30; % if time in month in the dataset !!! nc{'Zsi'}(:)=zsi; close(nc) @@ -91,54 +100,51 @@ end % if (makeclim) disp('Add_sio3: creating variables and attributes for the Climatology file') -% -% open the clim file -% + % + % open the clim file + % nc=netcdf(climfile,'write'); -%% redef(nc); + %% redef(nc); nc('si_time') = length(t);; nc{'si_time'} = ncdouble('si_time') ; nc{'Si'} = ncdouble('si_time','s_rho','eta_rho','xi_rho') ; -% + % nc{'si_time'}.long_name = ncchar('time for silicate'); nc{'si_time'}.long_name = 'time for silicate'; - nc{'si_time'}.units = ncchar('day'); - nc{'si_time'}.units = 'day'; - if cycle~=0 - nc{'si_time'}.cycle_length = cycle; - end -% + write_time_attributes(nc,'si_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); + % nc{'Si'}.long_name = ncchar('Silicate'); nc{'Si'}.long_name = 'Silicate'; nc{'Si'}.units = ncchar('mMol Si m-3'); nc{'Si'}.units = 'mMol Si m-3'; nc{'Si'}.fields = ncchar('Si, scalar, series'); nc{'Si'}.fields = 'Si, scalar, series'; -% -%% endef(nc); -% -% record the time and close -% + % + %% endef(nc); + % + % record the time and close + % nc{'si_time'}(:)=t*30; % if time in month in the dataset !!! close(nc) end -if (makeini) -% Same thing for the Initial file -% -disp('Add_si: creating variables and attributes for the Initial file') -% -% open the clim file +% if (makeini) +% % Same thing for the Initial file +% % +% disp('Add_si: creating variables and attributes for the Initial file') +% % +% % open the clim file -nc=netcdf(inifile,'write'); -redef(nc); -nc{'Si'} = ncdouble('time','s_rho','eta_rho','xi_rho') ; +% nc=netcdf(inifile,'write'); +% redef(nc); +% nc{'Si'} = ncdouble('time','s_rho','eta_rho','xi_rho') ; -nc{'Si'}.long_name = ncchar('Silicate'); -nc{'Si'}.long_name = 'Silicate'; -nc{'Si'}.units = ncchar('mMol Si m-3'); -nc{'Si'}.units = 'mMol Si m-3'; +% nc{'Si'}.long_name = ncchar('Silicate'); +% nc{'Si'}.long_name = 'Silicate'; +% nc{'Si'}.units = ncchar('mMol Si m-3'); +% nc{'Si'}.units = 'mMol Si m-3'; -endef(nc); -close(nc) -end +% endef(nc); +% close(nc) +% end return diff --git a/Preprocessing_tools/Bio/add_talk.m b/Preprocessing_tools/Bio/add_talk.m index 41f56e0c..5a4757c4 100644 --- a/Preprocessing_tools/Bio/add_talk.m +++ b/Preprocessing_tools/Bio/add_talk.m @@ -1,5 +1,5 @@ function add_talk(oafile,climfile,inifile,gridfile,seas_datafile,... - ann_datafile,cycle,makeoa,makeclim,makeini); + ann_datafile,cycle,makeoa,makeclim,makeini,Yorig); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % function [longrd,latgrd,talk]=add_talk(climfile,gridfile,... @@ -13,12 +13,12 @@ function add_talk(oafile,climfile,inifile,gridfile,seas_datafile,... % lower levels % % input: -% +% % climfile : croco climatology file to process (netcdf) % gridfile : croco grid file (netcdf) -% seas_datafile : regular longitude - latitude - z seasonal data +% seas_datafile : regular longitude - latitude - z seasonal data % file used for the upper levels (netcdf) -% ann_datafile : regular longitude - latitude - z annual data +% ann_datafile : regular longitude - latitude - z annual data % file used for the lower levels (netcdf) % cycle : time length (days) of climatology cycle (ex:360 for % annual cycle) - 0 if no cycle. @@ -28,6 +28,16 @@ function add_talk(oafile,climfile,inifile,gridfile,seas_datafile,... % [longrd,latgrd,talk] : surface field to plot (as an illustration) % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% options for write_time_attributes +insecond = 0 ; +add_cycle = 1 ; +% +% Initialize Yorig if not provided +if ~exist('Yorig', 'var') , Yorig = []; , end +% +% Get time attributes +[time_unit_att,time_second_unit_att,calendar_att]=... + get_time_attributes(Yorig); % % Read in the grid % @@ -35,7 +45,7 @@ nc=netcdf(gridfile,'r'); hmax=max(max(nc{'h'}(:))); close(nc); % -% read in the datafiles +% read in the datafiles % nc=netcdf(seas_datafile,'r'); t=nc{'T'}(:); @@ -46,42 +56,40 @@ kmax=max(find(ztalk<hmax))-1; ztalk=ztalk(1:kmax); close(nc) % -% open the OA file -% +% open the OA file +% if (makeoa) disp('Add_talk: creating variables and attributes for the OA file') nc=netcdf(oafile,'write'); -%% redef(nc); + %% redef(nc); nc('talk_time') = length(t); nc{'talk_time'} = ncdouble('talk_time') ; nc('Ztalk') = length(ztalk); nc{'Ztalk'} = ncdouble('Ztalk') ; nc{'TALK'} = ncdouble('talk_time','Ztalk','eta_rho','xi_rho') ; -% + % nc{'talk_time'}.long_name = ncchar('time for TALK'); nc{'talk_time'}.long_name = 'time for TALK'; - nc{'talk_time'}.units = ncchar('day'); - nc{'talk_time'}.units = 'day'; - if cycle~=0 - nc{'talk_time'}.cycle_length = cycle; - end -% + write_time_attributes(nc,'talk_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); + + % nc{'Ztalk'}.long_name = ncchar('Depth for TALK'); nc{'Ztalk'}.long_name = 'Depth for TALK'; nc{'Ztalk'}.units = ncchar('m'); nc{'Ztalk'}.units = 'm'; -% + % nc{'TALK'}.long_name = ncchar('TALK'); nc{'TALK'}.long_name = 'TALK'; nc{'TALK'}.units = ncchar('mMol C m-3'); nc{'TALK'}.units = 'mMol C m-3'; nc{'TALK'}.fields = ncchar('TALK, scalar, series'); nc{'TALK'}.fields = 'TALK, scalar, series'; -% -%% endef(nc); -% -% record deth and time and close -% + % + %% endef(nc); + % + % record deth and time and close + % nc{'talk_time'}(:)=t*30; % if time in month in the dataset !!! nc{'Ztalk'}(:)=ztalk; close(nc) @@ -91,56 +99,53 @@ end % if (makeclim) disp('Add_talk: creating variables and attributes for the Climatology file') -% -% open the clim file -% + % + % open the clim file + % nc=netcdf(climfile,'write'); -%% redef(nc); + %% redef(nc); nc('talk_time') = length(t);; nc{'talk_time'} = ncdouble('talk_time') ; nc{'TALK'} = ncdouble('talk_time','s_rho','eta_rho','xi_rho') ; -% + % nc{'talk_time'}.long_name = ncchar('time for TALK'); nc{'talk_time'}.long_name = 'time for TALK'; - nc{'talk_time'}.units = ncchar('day'); - nc{'talk_time'}.units = 'day'; - if cycle~=0 - nc{'talk_time'}.cycle_length = cycle; - end -% + write_time_attributes(nc,'talk_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); + % nc{'TALK'}.long_name = ncchar('TALK'); nc{'TALK'}.long_name = 'TALK'; nc{'TALK'}.units = ncchar('mMol C m-3'); nc{'TALK'}.units = 'mMol C m-3'; nc{'TALK'}.fields = ncchar('TALK, scalar, series'); nc{'TALK'}.fields = 'TALK, scalar, series'; -% -%% endef(nc); -% -% record the time and close -% + % + %% endef(nc); + % + % record the time and close + % nc{'talk_time'}(:)=t*30; % if time in month in the dataset !!! close(nc) end -% -% Same thing for the Initial file -% -if (makeini) -disp('Add_talk: creating variables and attributes for the Initial file') -% -% open the clim file -% -nc=netcdf(inifile,'write'); -redef(nc); -nc{'TALK'} = ncdouble('time','s_rho','eta_rho','xi_rho') ; -% -nc{'TALK'}.long_name = ncchar('TALK'); -nc{'TALK'}.long_name = 'TALK'; -nc{'TALK'}.units = ncchar('mMol C m-3'); -nc{'TALK'}.units = 'mMol C m-3'; -% -endef(nc); -close(nc) -end +% % +% % Same thing for the Initial file +% % +% if (makeini) +% disp('Add_talk: creating variables and attributes for the Initial file') +% % +% % open the clim file +% % +% nc=netcdf(inifile,'write'); +% redef(nc); +% nc{'TALK'} = ncdouble('time','s_rho','eta_rho','xi_rho') ; +% % +% nc{'TALK'}.long_name = ncchar('TALK'); +% nc{'TALK'}.long_name = 'TALK'; +% nc{'TALK'}.units = ncchar('mMol C m-3'); +% nc{'TALK'}.units = 'mMol C m-3'; +% % +% endef(nc); +% close(nc) +% end return diff --git a/Preprocessing_tools/Bio/make_biol.m b/Preprocessing_tools/Bio/make_biol.m index 32968ef0..a226e7dd 100644 --- a/Preprocessing_tools/Bio/make_biol.m +++ b/Preprocessing_tools/Bio/make_biol.m @@ -4,9 +4,9 @@ close all % % Add biological parameters to CROCO input files % -% Further Information: +% Further Information: % http://www.croco-ocean.org -% +% % This file is part of CROCOTOOLS % % CROCOTOOLS is free software; you can redistribute it and/or modify @@ -24,8 +24,8 @@ close all % Foundation, Inc., 59 Temple Place, Suite 330, Boston, % MA 02111-1307 USA % -% Copyright (c) 2003-2006 by Pierrick Penven -% e-mail:Pierrick.Penven@ird.fr +% Copyright (c) 2003-2006 by Pierrick Penven +% e-mail:Pierrick.Penven@ird.fr % % Contributions of P. Marchesiello (IRD) % @@ -50,54 +50,60 @@ crocotools_param % Climatological file %---------------------------------------------------------------------- if (makeclim) - disp('===========================================================') - disp('Climatology for the biogeochemical model') - if (makenpzd) - disp('========================') - disp('Climatology for NPZD variables') - % disp('already done in make_ini_npzd') - make_clim_npzd - end - if (makepisces) - disp('========================') - disp('Climatology for PISCES variables') - make_clim_pisces - disp('------------------------') - disp('Iron deposition file') - make_dust - disp('------------------------') - disp('Nitrogen deposition') - make_ndepo - end - if (makebioebus) - disp('========================') - disp('Climatology for BioEBUS variables') - %disp('already done in make_ini_bioebus') - make_clim_bioebus - end + disp('===========================================================') + disp('Climatology for the biogeochemical model') + if (makenpzd) + disp('========================') + disp('Climatology for NPZD variables') + make_clim_npzd + end + if (makebioebus) + disp('========================') + disp('Climatology for BioEBUS variables') + make_clim_bioebus + end + if (makepisces) + disp('========================') + disp('Climatology for PISCES variables') + make_clim_pisces + disp('------------------------') + disp('Iron deposition file') + make_dust + disp('------------------------') + disp('Nitrogen deposition') + make_ndepo + end + end %---------------------------------------------------------------------- % Bry file %---------------------------------------------------------------------- if (makebry) - disp('===========================================================') - disp('Bry for the biogeochemical model') - if (makenpzd) - disp('========================') - disp('Bry for NPZD variables') - make_bry_npzd - end - if (makepisces) - disp('========================') - disp('Bry for PISCES variables') - make_bry_pisces - end - if (makebioebus) - disp('========================') - disp('Bry for BioEBUS variables') - make_bry_bioebus - end + disp('===========================================================') + disp('Bry for the biogeochemical model') + if (makenpzd) + disp('========================') + disp('Bry for NPZD variables') + make_bry_npzd + end + if (makebioebus) + disp('========================') + disp('Bry for BioEBUS variables') + make_bry_bioebus + end + if (makepisces) + disp('========================') + disp('Bry for PISCES variables') + make_bry_pisces + disp('------------------------') + disp('Iron deposition file') + make_dust + disp('------------------------') + disp('Nitrogen deposition') + make_ndepo + end + end %---------------------------------------------------------------------- @@ -105,29 +111,34 @@ end %---------------------------------------------------------------------- if (makeini) - disp('===========================================================') - disp('Initial variables for the biogeochemical model') - if (makenpzd) - disp('========================') - disp('Initial NPZD variables') - make_ini_npzd - end - if (makebioebus) - disp('========================') - disp('Initial BioEBUS variables') - make_ini_bioebus - end + disp('===========================================================') + disp('Initial variables for the biogeochemical model') + if (makenpzd) + disp('========================') + disp('Initial NPZD variables') + make_ini_npzd + end + if (makebioebus) + disp('========================') + disp('Initial BioEBUS variables') + make_ini_bioebus + end + if (makepisces) + disp('========================') + disp('Initial PISCES variables') + make_ini_pisces + end end %---------------------------------------------------------------------- % N2O in BioEBUS %---------------------------------------------------------------------- - if (makebioebus) - disp('========================') - disp('Input values for N2O in BioEBUS') - make_n2o_bioebus - end +if (makebioebus) + disp('========================') + disp('Input values for N2O in BioEBUS') + make_n2o_bioebus +end diff --git a/Preprocessing_tools/Bio/make_bry_pisces.m b/Preprocessing_tools/Bio/make_bry_pisces.m index bb9d5406..406a8be9 100644 --- a/Preprocessing_tools/Bio/make_bry_pisces.m +++ b/Preprocessing_tools/Bio/make_bry_pisces.m @@ -5,7 +5,7 @@ % Extrapole and interpole temperature and salinity from a % climatology to get boundary conditions for % CROCO (boundary netcdf file) . -% Get the velocities and sea surface elevation via a +% Get the velocities and sea surface elevation via a % geostrophic computation. % % Data input format (netcdf): @@ -18,10 +18,10 @@ % Data source : IRI/LDEO climate Data Library (World Ocean Atlas 1998) % http://ingrid.ldgo.columbia.edu/ % http://iridl.ldeo.columbia.edu/SOURCES/.NOAA/.NODC/.WOA98/ -% -% Further Information: +% +% Further Information: % http://www.croco-ocean.org -% +% % This file is part of CROCOTOOLS % % CROCOTOOLS is free software; you can redistribute it and/or modify @@ -39,8 +39,8 @@ % Foundation, Inc., 59 Temple Place, Suite 330, Boston, % MA 02111-1307 USA % -% Copyright (c) 2005-2006 by Pierrick Penven -% e-mail:Pierrick.Penven@ird.fr +% Copyright (c) 2005-2006 by Pierrick Penven +% e-mail:Pierrick.Penven@ird.fr % % Updated 1-Sep-2006 by Pierrick Penven % Pierrick Penven, IRD, 2005. % @@ -64,8 +64,8 @@ Roa; % % Set times and cycles: monthly climatology for all data % -time=woa_time; % time -cycle=woa_cycle; % cycle +time=woa_time; % time +cycle=woa_cycle; % cycle % % Data climatologies file names: % @@ -89,9 +89,9 @@ fer_ann_data = [woapisces_dir,'fer_ann.cdf']; dust_seas_data = [woapisces_dir,'dust_seas.cdf']; dust_ann_data = [woapisces_dir,'dust_ann.cdf']; if strcmp(climato_dir,cars2009_dir); - err_msg=sprintf(['Error : you need to use woadir when creating the croco_oa.nc (Z) \n'... - 'file to be compatible with PISCES']) - error(err_msg) + err_msg=sprintf(['Error : you need to use woadir when creating the croco_oa.nc (Z) \n'... + 'file to be compatible with PISCES']) + error(err_msg) end % % @@ -109,7 +109,7 @@ disp([' Title: ',CROCO_title]) % disp(' ') disp(' Read in the grid...') - nc=netcdf(grdname,'r'); +nc=netcdf(grdname,'r'); lon=nc{'lon_rho'}(:); lat=nc{'lat_rho'}(:); Lp=length(nc('xi_rho')); @@ -134,10 +134,10 @@ end if (makeZbry) disp(' ') disp(' Redefine the boundary Z-file...') -% -% get Z -% - nc=netcdf(no3_ann_data,'r'); + % + % get Z + % + nc=netcdf(no3_ann_data,'r'); Z=nc{'Z'}(:); kmax=max(find(Z<hmax))-1; Z=Z(1:kmax); @@ -145,82 +145,82 @@ if (makeZbry) add_bry_pisces_Z(Zbryname,obc,Z,time,cycle,makequota,'write'); disp(' ') disp(' Horizontal extrapolations') -% -% Loop on the lateral boundaries -% + % + % Loop on the lateral boundaries + % for obcndx=1:4 if obc(obcndx)==1 if obcndx==1 disp(' Processing southern boundary...') - suffix='_south'; + suffix='_south'; elseif obcndx==2 disp(' Processing eastern boundary...') - suffix='_east'; + suffix='_east'; elseif obcndx==3 disp(' Processing northern boundary...') - suffix='_north'; + suffix='_north'; elseif obcndx==4 disp(' Processing western boundary...') - suffix='_west'; + suffix='_west'; end disp(' Nitrate...') bry_interp_pisces(Zbryname,lon,lat,no3_seas_data,no3_ann_data,... - 'nitrate',['NO3',suffix],obcndx,Roa); + 'nitrate',['NO3',suffix],obcndx,Roa); disp(' Phosphate...') bry_interp_pisces(Zbryname,lon,lat,po4_seas_data,po4_ann_data,... - 'phosphate',['PO4',suffix],obcndx,Roa); + 'phosphate',['PO4',suffix],obcndx,Roa); disp(' Silicate...') bry_interp_pisces(Zbryname,lon,lat,sio3_seas_data,sio3_ann_data,... - 'silicate',['Si',suffix],obcndx,Roa); + 'silicate',['Si',suffix],obcndx,Roa); disp(' Oxygen...') bry_interp_pisces(Zbryname,lon,lat,o2_seas_data,o2_ann_data,... - 'oxygen',['O2',suffix],obcndx,Roa); + 'oxygen',['O2',suffix],obcndx,Roa); disp(' Dissolved Inorganic Carbon...') bry_interp_pisces(Zbryname,lon,lat,dic_seas_data,dic_ann_data,... - 'dic',['DIC',suffix],obcndx,Roa); + 'dic',['DIC',suffix],obcndx,Roa); disp(' Total Alkalinity...') bry_interp_pisces(Zbryname,lon,lat,talk_seas_data,talk_ann_data,... - 'talk',['TALK',suffix],obcndx,Roa); + 'talk',['TALK',suffix],obcndx,Roa); disp(' Dissolved Organic Carbon...') bry_interp_pisces(Zbryname,lon,lat,doc_seas_data,doc_ann_data,... - 'doc',['DOC',suffix],obcndx,Roa); - if makequota - disp(' Dissolved Organic Nitrogen...') - bry_interp_pisces(Zbryname,lon,lat,doc_seas_data,doc_ann_data,... - 'doc',['DON',suffix],obcndx,Roa); - disp(' Dissolved Organic Phosphorus...') - bry_interp_pisces(Zbryname,lon,lat,doc_seas_data,doc_ann_data,... - 'doc',['DOP',suffix],obcndx,Roa); + 'doc',['DOC',suffix],obcndx,Roa); + if makequota + disp(' Dissolved Organic Nitrogen...') + bry_interp_pisces(Zbryname,lon,lat,doc_seas_data,doc_ann_data,... + 'doc',['DON',suffix],obcndx,Roa); + disp(' Dissolved Organic Phosphorus...') + bry_interp_pisces(Zbryname,lon,lat,doc_seas_data,doc_ann_data,... + 'doc',['DOP',suffix],obcndx,Roa); end disp(' Iron...') bry_interp_pisces(Zbryname,lon,lat,fer_seas_data,fer_ann_data,... - 'fer',['FER',suffix],obcndx,Roa); + 'fer',['FER',suffix],obcndx,Roa); end end end % -% Vertical interpolations +% Vertical interpolations % if (makebry) disp(' ') disp(' Vertical interpolations') -% -% Loop on the lateral boundaries -% + % + % Loop on the lateral boundaries + % for obcndx=1:4 if obc(obcndx)==1 if obcndx==1 disp(' Processing southern boundary...') - suffix='_south'; + suffix='_south'; elseif obcndx==2 disp(' Processing eastern boundary...') - suffix='_east'; + suffix='_east'; elseif obcndx==3 disp(' Processing northern boundary...') - suffix='_north'; + suffix='_north'; elseif obcndx==4 disp(' Processing western boundary...') - suffix='_west'; + suffix='_west'; end disp(' ') disp(' Nitrate...') @@ -244,12 +244,12 @@ if (makebry) disp(' Dissolved Organic Carbon...') vinterp_bry(bryname,grdname,Zbryname,['DOC',suffix],obcndx); if makequota - disp(' ') - disp(' Dissolved Organic Nitrogen...') - vinterp_bry(bryname,grdname,Zbryname,['DON',suffix],obcndx); - disp(' ') - disp(' Dissolved Organic Phosphorus...') - vinterp_bry(bryname,grdname,Zbryname,['DOP',suffix],obcndx); + disp(' ') + disp(' Dissolved Organic Nitrogen...') + vinterp_bry(bryname,grdname,Zbryname,['DON',suffix],obcndx); + disp(' ') + disp(' Dissolved Organic Phosphorus...') + vinterp_bry(bryname,grdname,Zbryname,['DOP',suffix],obcndx); end disp(' ') disp(' Iron...') @@ -261,30 +261,30 @@ end % Make a few plots % if makeplot==1 -disp(' ') -disp(' Make a few plots...') -test_bry(bryname,grdname,'NO3',1,obc) -figure -test_bry(bryname,grdname,'PO4',1,obc) -figure -test_bry(bryname,grdname,'Si',1,obc) -figure -test_bry(bryname,grdname,'O2',1,obc) -figure -test_bry(bryname,grdname,'DIC',6,obc) -figure -test_bry(bryname,grdname,'TALK',6,obc) -figure -test_bry(bryname,grdname,'DOC',6,obc) -figure -test_bry(bryname,grdname,'FER',6,obc) -figure - if makequota - test_bry(bryname,grdname,'DON',6,obc) - figure - test_bry(bryname,grdname,'DOP',6,obc) - figure - end + disp(' ') + disp(' Make a few plots...') + test_bry(bryname,grdname,'NO3',1,obc) + figure + test_bry(bryname,grdname,'PO4',1,obc) + figure + test_bry(bryname,grdname,'Si',1,obc) + figure + test_bry(bryname,grdname,'O2',1,obc) + figure + test_bry(bryname,grdname,'DIC',6,obc) + figure + test_bry(bryname,grdname,'TALK',6,obc) + figure + test_bry(bryname,grdname,'DOC',6,obc) + figure + test_bry(bryname,grdname,'FER',6,obc) + figure + if makequota + test_bry(bryname,grdname,'DON',6,obc) + figure + test_bry(bryname,grdname,'DOP',6,obc) + figure + end end % % End diff --git a/Preprocessing_tools/Bio/make_clim_pisces.m b/Preprocessing_tools/Bio/make_clim_pisces.m index 51342d1a..0198dcb3 100644 --- a/Preprocessing_tools/Bio/make_clim_pisces.m +++ b/Preprocessing_tools/Bio/make_clim_pisces.m @@ -218,95 +218,95 @@ end vinterp_clm(clmname,grdname,oaname,'FER','fer_time','Zfer',0,'r'); end -%---------------------------------------------------------------------------- -% Initial file -%---------------------------------------------------------------------------- -if (makeini) -% -% NO3 -% - disp(' ') - disp(' Vertical interpolations') - disp(' ') - disp(' NO3...') - vinterp_clm(ininame,grdname,oaname,'NO3','no3_time','Zno3',tini,'r',1); -% -% DIC -% - disp(' ') - disp(' Vertical interpolations') - disp(' ') - disp(' DIC...') - vinterp_clm(ininame,grdname,oaname,'DIC','dic_time','Zdic',tini,'r',1); -% -% PO4 -% - disp(' ') - disp(' Vertical interpolations') - disp(' ') - disp(' PO4...') - vinterp_clm(ininame,grdname,oaname,'PO4','po4_time','Zpo4',tini,'r',1); - % - % Si - % - disp(' ') - disp(' Vertical interpolations') - disp(' ') - disp(' Si...') - vinterp_clm(ininame,grdname,oaname,'Si','si_time','Zsi',tini,'r',1); -% -% O2 -% - disp(' ') - disp(' Vertical interpolations') - disp(' ') - disp(' O2...') - vinterp_clm(ininame,grdname,oaname,'O2','o2_time','Zo2',tini,'r',1); -% -% TALK -% - disp(' ') - disp(' Vertical interpolations') - disp(' ') - disp(' TALK...') - vinterp_clm(ininame,grdname,oaname,'TALK','talk_time','Ztalk',tini,'r',1); -% -% DOC -% - disp(' ') - disp(' Vertical interpolations') - disp(' ') - disp(' DOC...') - vinterp_clm(ininame,grdname,oaname,'DOC','doc_time','Zdoc',tini,'r',1); - -if makequota -% -% DON -% - disp(' ') - disp(' Vertical interpolations') - disp(' ') - disp(' DON...') - vinterp_clm(ininame,grdname,oaname,'DON','don_time','Zdon',tini,'r',1); -% -% DOP -% - disp(' ') - disp(' Vertical interpolations') - disp(' ') - disp(' DOP...') - vinterp_clm(ininame,grdname,oaname,'DOP','dop_time','Zdop',tini,'r',1); -end - -% -% FER -% - disp(' ') - disp(' Vertical interpolations') - disp(' ') - disp(' FER...') - vinterp_clm(ininame,grdname,oaname,'FER','fer_time','Zfer',tini,'r',1); -end +% %---------------------------------------------------------------------------- +% % Initial file +% %---------------------------------------------------------------------------- +% if (makeini) +% % +% % NO3 +% % +% disp(' ') +% disp(' Vertical interpolations') +% disp(' ') +% disp(' NO3...') +% vinterp_clm(ininame,grdname,oaname,'NO3','no3_time','Zno3',tini,'r',1); +% % +% % DIC +% % +% disp(' ') +% disp(' Vertical interpolations') +% disp(' ') +% disp(' DIC...') +% vinterp_clm(ininame,grdname,oaname,'DIC','dic_time','Zdic',tini,'r',1); +% % +% % PO4 +% % +% disp(' ') +% disp(' Vertical interpolations') +% disp(' ') +% disp(' PO4...') +% vinterp_clm(ininame,grdname,oaname,'PO4','po4_time','Zpo4',tini,'r',1); +% % +% % Si +% % +% disp(' ') +% disp(' Vertical interpolations') +% disp(' ') +% disp(' Si...') +% vinterp_clm(ininame,grdname,oaname,'Si','si_time','Zsi',tini,'r',1); +% % +% % O2 +% % +% disp(' ') +% disp(' Vertical interpolations') +% disp(' ') +% disp(' O2...') +% vinterp_clm(ininame,grdname,oaname,'O2','o2_time','Zo2',tini,'r',1); +% % +% % TALK +% % +% disp(' ') +% disp(' Vertical interpolations') +% disp(' ') +% disp(' TALK...') +% vinterp_clm(ininame,grdname,oaname,'TALK','talk_time','Ztalk',tini,'r',1); +% % +% % DOC +% % +% disp(' ') +% disp(' Vertical interpolations') +% disp(' ') +% disp(' DOC...') +% vinterp_clm(ininame,grdname,oaname,'DOC','doc_time','Zdoc',tini,'r',1); + +% if makequota +% % +% % DON +% % +% disp(' ') +% disp(' Vertical interpolations') +% disp(' ') +% disp(' DON...') +% vinterp_clm(ininame,grdname,oaname,'DON','don_time','Zdon',tini,'r',1); +% % +% % DOP +% % +% disp(' ') +% disp(' Vertical interpolations') +% disp(' ') +% disp(' DOP...') +% vinterp_clm(ininame,grdname,oaname,'DOP','dop_time','Zdop',tini,'r',1); +% end + +% % +% % FER +% % +% disp(' ') +% disp(' Vertical interpolations') +% disp(' ') +% disp(' FER...') +% vinterp_clm(ininame,grdname,oaname,'FER','fer_time','Zfer',tini,'r',1); +% end if (makeplot) disp(' ') diff --git a/Preprocessing_tools/Bio/make_dust.m b/Preprocessing_tools/Bio/make_dust.m index bfcf43b8..6ba5f98c 100644 --- a/Preprocessing_tools/Bio/make_dust.m +++ b/Preprocessing_tools/Bio/make_dust.m @@ -26,6 +26,18 @@ clear all close all %%%%%%%%%%%%%%%%%%%%% USERS DEFINED VARIABLES %%%%%%%%%%%%%%%%%%%%%%%% +% +% options for write_time_attributes +insecond = 0 ; +add_cycle = 1 ; +% +% Initialize Yorig if not provided +if ~exist('Yorig', 'var') , Yorig = []; , end +% +% Get time attributes +[time_unit_att,time_second_unit_att,calendar_att]=... + get_time_attributes(Yorig); +% disp(' ') disp('Creating biology forcing file') % @@ -86,13 +98,9 @@ nc{'dustpo4'} = ncdouble('dust_time','eta_rho','xi_rho') ; nc{'dustsi'} = ncdouble('dust_time','eta_rho','xi_rho') ; nc{'solubility2'} = ncdouble('dust_time','eta_rho','xi_rho') ; % -nc{'dust_time'}.long_name = ncchar('time for dust'); -nc{'dust_time'}.long_name = 'time for dust'; -nc{'dust_time'}.units = ncchar('day'); -nc{'dust_time'}.units = 'day'; -if cycle~=0 - nc{'dust_time'}.cycle_length = cycle; -end +write_time_attributes(nc,'dust_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); + % nc{'dust'}.long_name = ncchar('Dust Deposition'); nc{'dust'}.long_name = 'Dust Deposition'; diff --git a/Preprocessing_tools/Bio/make_ini_pisces.m b/Preprocessing_tools/Bio/make_ini_pisces.m index 80a3afa4..29199244 100644 --- a/Preprocessing_tools/Bio/make_ini_pisces.m +++ b/Preprocessing_tools/Bio/make_ini_pisces.m @@ -115,7 +115,8 @@ disp(' ') disp('Iron ...') ext_tracers_ini(ininame,grdname,fer_month_data,fer_ann_data,... 'fer','FER','r',tini); -if (makeplot == 1)disp(' ') +if (makeplot == 1) + disp(' ') % % Make a few plots % diff --git a/Preprocessing_tools/Bio/make_n2o_bioebus.m b/Preprocessing_tools/Bio/make_n2o_bioebus.m deleted file mode 100644 index c8805312..00000000 --- a/Preprocessing_tools/Bio/make_n2o_bioebus.m +++ /dev/null @@ -1,317 +0,0 @@ -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Add N2O data in input CROCO files from Global Atlas (WOA or CARS) -% -% N2O distribution from Nevison et al. (2003) formulation -% -% Data input format (netcdf): -% variable(T, Z, Y, X) -% T : time [Months] -% Z : Depth [m] -% Y : Latitude [degree north] -% X : Longitude [degree east] -% -% -% Elodie Gutknecht, 2013 -% Gildas Cambon, 2013 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -clear all -close all -% -% Title -% -crocotools_param -%%%%%%%%%%%%%%%%%%% END USERS DEFINED VARIABLES %%%%%%%%%%%%%%%%%%%%%%% - -% -%========= - -if makeini - nc=netcdf(grdname,'r'); -h = nc{'h'}(:); -close(nc) -% O2 initial conditions -nc=netcdf(ininame,'r'); -theta_s = nc{'theta_s'}(:); -theta_b = nc{'theta_b'}(:); -Tcline = nc{'Tcline'}(:); -N = length(nc('s_rho')); -vtransform=nc{'Vtransform'}(:); -if ~exist('vtransform') - vtransform=1; %Old Vtransform - disp([' NO VTRANSFORM parameter found']) - disp([' USE TRANSFORM default value vtransform = 1']) -end -O2_ini = nc{'O2'}(:); -close(nc) -type = 'initial conditions file' ; -history = 'CROCO' ; -[KK,LL,MM]=size(O2_ini); -% -zw_ini=zlevs(h,0.,theta_s,theta_b,Tcline,N,'w',vtransform); -N2O_ini=zeros(KK,LL,MM);N2O_ini=NaN; -for k=1:KK - for j=1:LL - for i=1:MM - N2O_ini(k,j,i)=nevis_2003(squeeze(zw_ini(k,j,i)),squeeze(O2_ini(k,j,i))); - end - end -end -% Find NaN -find(isnan(N2O_ini)==1);% -% -% open the ini file -nc = netcdf(ininame,'write'); -% new variable -%%redef(nc); -nc('n2o_time') = 1; -nc{'n2o_time'} = ncdouble('time') ; -nc{'N2O'} = ncdouble('time','s_rho','eta_rho','xi_rho') ; -nc{'N2O'}.long_name = ncchar('Nitrous oxide'); -nc{'N2O'}.long_name = 'Nitrous oxide'; -nc{'N2O'}.units = ncchar('mMol N2O m-3'); -nc{'N2O'}.units = 'mMol N2O m-3'; -nc{'N2O'}.fields = ncchar('NO2, scalar, series'); -nc{'N2O'}.fields = 'NO2, scalar, series'; -%%endef(nc); -% write new variable -nc{'N2O'}(:,:,:) = N2O_ini; -% Synchronize on disk -close(nc); -end - -%========== -if makeclim - nc=netcdf(grdname,'r'); -h = nc{'h'}(:); -close(nc) -% O2 climatological conditions -nc=netcdf(clmname,'r'); -theta_s = nc{'theta_s'}(:); -theta_b = nc{'theta_b'}(:); -Tcline = nc{'Tcline'}(:); -N = length(nc('s_rho')); -vtransform=nc{'Vtransform'}(:); -if ~exist('vtransform') - vtransform=1; %Old Vtransform - disp([' NO VTRANSFORM parameter found']) - disp([' USE TRANSFORM default value vtransform = 1']) -end -O2_clm = nc{'O2'}(:); -O2_time = nc{'o2_time'}(:); -O2_cycle = nc{'o2_time'}.cycle_length(:); -zeta = nc{'zeta'}(:); -close(nc) -[TT,KK,LL,MM]=size(O2_clm); -for itps=1:length(O2_time) - zw_clm(itps,:,:,:)=zlevs(h,squeeze(zeta(itps,:,:)),theta_s,theta_b,Tcline,N,'w',vtransform); -end -N2O_clm=zeros(TT,KK,LL,MM); N2O_clm(:)=NaN; -for t=1:TT - for k=1:KK - for j=1:LL - for i=1:MM - zw= squeeze(zw_clm(t,k,j,i)); - O2=squeeze(O2_clm(t,k,j,i)); - N2O_clm(t,k,j,i)=nevis_2003(zw,02); - end - end - end -end -% Find NaN -find(isnan(N2O_clm)==1); -% -% add N20 in climatological file -type = 'climatological conditions file' ; -history = 'CROCO' ; -% -% open the clm file -% -nc = netcdf(clmname,'write'); -% -% new variable -% -%%redef(nc); -nc('n2o_time') = TT; -nc{'n2o_time'} = ncdouble('n2o_time') ; -nc{'n2o_time'}.long_name = ncchar('time climatological N2O'); -nc{'n2o_time'}.long_name = 'time climatological N2O'; -nc{'n2o_time'}.units = ncchar('day'); -nc{'n2o_time'}.units = 'day'; -nc{'n2o_time'}.cycle_length = O2_cycle; - -nc{'N2O'} = ncdouble('n2o_time','s_rho','eta_rho','xi_rho') ; -nc{'N2O'}.long_name = ncchar('Nitrous oxide'); -nc{'N2O'}.long_name = 'Nitrous oxide'; -nc{'N2O'}.units = ncchar('mMol N2O m-3'); -nc{'N2O'}.units = 'mMol N2O m-3'; -nc{'N2O'}.fields = ncchar('NO2, scalar, series'); -nc{'N2O'}.fields = 'NO2, scalar, series'; -%%endef(nc); -% -% write new variable -% -nc{'n2o_time'}(:) = O2_time(:); -nc{'N2O'}(:,:,:,:) = N2O_clm(:); -% -% Synchronize on disk -% -close(nc); -end - -%========== -if makebry -% O2 boundary conditions - nc=netcdf(grdname,'r'); -h = nc{'h'}(:); -close(nc) - -nc=netcdf(bryname,'r'); -theta_s = nc{'theta_s'}(:); -theta_b = nc{'theta_b'}(:); -Tcline = nc{'Tcline'}(:); -N = length(nc('s_rho')); -vtransform=nc{'Vtransform'}(:); -if ~exist('vtransform') - vtransform=1; %Old Vtransform - disp([' NO VTRANSFORM parameter found']) - disp([' USE TRANSFORM default value vtransform = 1']) -end -O2_bry_west = nc{'O2_west'}(:); -O2_bry_east = nc{'O2_east'}(:); -O2_bry_south = nc{'O2_south'}(:); -O2_bry_north = nc{'O2_north'}(:); -O2_time = nc{'o2_time'}(:); -O2_cycle = nc{'o2_time'}.cycle_length(:); -zeta_west = nc{'zeta_west'}(:); -zeta_east = nc{'zeta_east'}(:); -zeta_south = nc{'zeta_south'}(:); -zeta_north = nc{'zeta_north'}(:); -close(nc) - -% BRY -[TT,KK,MM]=size(O2_bry_south); [TT,KK,LL]=size(O2_bry_west); -type='w'; -zw_bry_west = zeros(TT,KK+1); -zw_bry_east = zeros(TT,KK+1); -zw_bry_south = zeros(TT,KK+1); -zw_bry_north = zeros(TT,KK+1); - -N2O_bry_east = zeros(TT,KK,LL); N2O_bry_east(:)=NaN ; -N2O_bry_west = zeros(TT,KK,LL); N2O_bry_west(:)=NaN ; -N2O_bry_south = zeros(TT,KK,MM); N2O_bry_south(:)=NaN ; -N2O_bry_north = zeros(TT,KK,MM); N2O_bry_north(:)=NaN ; -for t=1:TT - for j=1:LL - h_west = squeeze(h(j,1)); - h_east = squeeze(h(j,end)); - zw_bry_west(t,:,j) = zlevs_1d(h_west , squeeze(zeta_west(t,j)) , theta_s, theta_b, hc, N, type, vtransform); - zw_bry_east(t,:,j)= zlevs_1d(h_east , squeeze(zeta_east(t,j)) , theta_s, theta_b, hc, N, type, vtransform); - end -end -for t=1:TT - for i=1:MM - h_south = squeeze(h(1,i)); - h_north = squeeze(h(end,i)); - zw_bry_south(t,:,i)= zlevs_1d(h_south , squeeze(zeta_south(t,i)) , theta_s, theta_b, hc, N, type, vtransform); - zw_bry_north(t,:,i)= zlevs_1d(h_north , squeeze(zeta_north(t,i)) , theta_s, theta_b, hc, N, type, vtransform); - end -end -for t=1:TT - for k=1:KK - for j=1:LL - zw_east=zw_bry_east(t,k,j); - zw_west=zw_bry_west(t,k,j); - O2_east=O2_bry_east(t,k,j); - O2_west=O2_bry_west(t,k,j); - N2O_bry_east(t,k,j)= nevis_2003(zw_east,O2_east); - N2O_bry_west(t,k,j)= nevis_2003(zw_west,O2_west); - end - end -end -for t=1:TT - for k=1:KK - for i=1:MM - zw_north=zw_bry_north(t,k,i); - zw_south=zw_bry_south(t,k,i); - O2_north=O2_bry_north(t,k,i); - O2_south=O2_bry_south(t,k,i); - N2O_bry_north(t,k,i)=nevis_2003(zw_north,O2_north); - N2O_bry_south(t,k,i)=nevis_2003(zw_south,O2_south); - end - end -end -T= O2_time ;% time in days -cycle=O2_cycle; - -% -% add N20 in bryfile file -% -type = 'boundary conditions file' ; -history = 'CROCO' ; -% -% open the bry file -% -nc = netcdf(bryname,'write'); -% new variable -% -%%redef(nc); -nc('n2o_time') = length(T); -nc{'n2o_time'} = ncdouble('n2o_time') ; -nc{'n2o_time'}.long_name = ncchar('time climatological N2O'); -nc{'n2o_time'}.long_name = 'time climatological N2O'; -nc{'n2o_time'}.units = ncchar('day'); -nc{'n2o_time'}.units = 'day'; -nc{'n2o_time'}.cycle_length = O2_cycle; - -nc{'N2O_east'} = ncdouble('n2o_time','s_rho','eta_rho') ; -nc{'N2O_east'}.long_name = ncchar('Nitrous oxide'); -nc{'N2O_east'}.long_name = 'Nitrous oxide'; -nc{'N20_east'}.units = ncchar('mMol N2O m-3'); -nc{'N2O_east'}.units = 'mMol N2O m-3'; -nc{'N2O_east'}.fields = ncchar('NO2, scalar, series'); -nc{'N2O_east'}.fields = 'NO2, scalar, series'; - -nc{'N2O_west'} = ncdouble('n2o_time','s_rho','eta_rho') ; -nc{'N2O_west'}.long_name = ncchar('Nitrous oxide'); -nc{'N2O_west'}.long_name = 'Nitrous oxide'; -nc{'N2O_west'}.units = ncchar('mMol N2O m-3'); -nc{'N2O_west'}.units = 'mMol N2O m-3'; -nc{'N2O_west'}.fields = ncchar('NO2, scalar, series'); -nc{'N2O_west'}.fields = 'NO2, scalar, series'; - -nc{'N2O_south'} = ncdouble('n2o_time','s_rho','xi_rho') ; -nc{'N2O_south'}.long_name = ncchar('Nitrous oxide'); -nc{'N2O_south'}.long_name = 'Nitrous oxide'; -nc{'N20_south'}.units = ncchar('mMol N2O m-3'); -nc{'N2O_south'}.units = 'mMol N2O m-3'; -nc{'N2O_south'}.fields = ncchar('NO2, scalar, series'); -nc{'N2O_south'}.fields = 'NO2, scalar, series'; - -nc{'N2O_north'} = ncdouble('n2o_time','s_rho','xi_rho') ; -nc{'N2O_north'}.long_name = ncchar('Nitrous oxide'); -nc{'N2O_north'}.long_name = 'Nitrous oxide'; -nc{'N20_north'}.units = ncchar('mMol N2O m-3'); -nc{'N2O_north'}.units = 'mMol N2O m-3'; -nc{'N2O_north'}.fields = ncchar('NO2, scalar, series'); -nc{'N2O_north'}.fields = 'NO2, scalar, series'; - -% -% write new variable -% -nc{'n2o_time'}(:) = T; -nc{'N2O_east'}(:,:,:,:) = N2O_bry_east; -nc{'N2O_west'}(:,:,:,:) = N2O_bry_west; -nc{'N2O_south'}(:,:,:,:) = N2O_bry_south; -nc{'N2O_north'}(:,:,:,:) = N2O_bry_north; -% -% Synchronize on disk -% -close(nc); -end - - - - - - diff --git a/Preprocessing_tools/Bio/make_ndepo.m b/Preprocessing_tools/Bio/make_ndepo.m index 1c2c35bb..1571c796 100644 --- a/Preprocessing_tools/Bio/make_ndepo.m +++ b/Preprocessing_tools/Bio/make_ndepo.m @@ -29,6 +29,17 @@ close all disp(' ') disp('Creating biology forcing file') % +% options for write_time_attributes +insecond = 0 ; +add_cycle = 1 ; +% +% Initialize Yorig if not provided +if ~exist('Yorig', 'var') , Yorig = []; , end +% +% Get time attributes +[time_unit_att,time_second_unit_att,calendar_att]=... + get_time_attributes(Yorig); +% % Title - Grid file name - Forcing file name % crocotools_param @@ -84,11 +95,8 @@ nc{'nhxndepo'} = ncdouble('ndepo_time','eta_rho','xi_rho') ; % nc{'ndepo_time'}.long_name = ncchar('time for nitrogen deposition'); nc{'ndepo_time'}.long_name = 'time for nitrogen deposition'; -nc{'ndepo_time'}.units = ncchar('day'); -nc{'ndepo_time'}.units = 'day'; -if cycle~=0 - nc{'ndepo_time'}.cycle_length = cycle; -end +write_time_attributes(nc,'ndepo_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'ndepo'}.long_name = ncchar('Nitrogen Deposition'); nc{'ndepo'}.long_name = 'Nitrogen Deposition'; diff --git a/Preprocessing_tools/Bio/add_Sphyto_Lphyto.m b/Preprocessing_tools/Bio/npzd-bioebus/add_Sphyto_Lphyto.m similarity index 85% rename from Preprocessing_tools/Bio/add_Sphyto_Lphyto.m rename to Preprocessing_tools/Bio/npzd-bioebus/add_Sphyto_Lphyto.m index 95a2eade..ed04cf5e 100644 --- a/Preprocessing_tools/Bio/add_Sphyto_Lphyto.m +++ b/Preprocessing_tools/Bio/npzd-bioebus/add_Sphyto_Lphyto.m @@ -41,6 +41,18 @@ function add_Sphyto_Lphyto(climfile); % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % +% options for write_time_attributes +insecond = 0 ; +add_cycle = 1 ; +% +% +% Initialize Yorig if not provided +if ~exist('Yorig', 'var') , Yorig = [] ; , end +% +% Get time attributes +[time_unit_att,time_second_unit_att,calendar_att]=... + get_time_attributes(Yorig); +% theta1=0.1; theta2=0.4; % @@ -61,11 +73,8 @@ nc{'SPHYTO'} = ncdouble('sphyto_time','s_rho','eta_rho','xi_rho') ; % nc{'sphyto_time'}.long_name = ncchar('time for Small Phytoplankton'); nc{'sphyto_time'}.long_name = 'time for Small Phytoplankton'; -nc{'sphyto_time'}.units = ncchar('day'); -nc{'sphyto_time'}.units = 'day'; -if cycle~=0 - nc{'sphyto_time'}.cycle_length = cycle; -end +write_time_attributes(nc,'sphyto_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc('lphyto_time') = tlen; nc{'lphyto_time'} = ncdouble('lphyto_time') ; @@ -73,11 +82,8 @@ nc{'LPHYTO'} = ncdouble('lphyto_time','s_rho','eta_rho','xi_rho') ; % nc{'lphyto_time'}.long_name = ncchar('time for Large Phytoplankton'); nc{'lphyto_time'}.long_name = 'time for Large Phytoplankton'; -nc{'lphyto_time'}.units = ncchar('day'); -nc{'lphyto_time'}.units = 'day'; -if cycle~=0 - nc{'lphyto_time'}.cycle_length = cycle; -end +write_time_attributes(nc,'lphyto_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'SPHYTO'}.long_name = ncchar('Small Phytoplankton'); nc{'SPHYTO'}.long_name = 'Small Phytoplankton'; diff --git a/Preprocessing_tools/Bio/add_Szoo_Lzoo.m b/Preprocessing_tools/Bio/npzd-bioebus/add_Szoo_Lzoo.m similarity index 84% rename from Preprocessing_tools/Bio/add_Szoo_Lzoo.m rename to Preprocessing_tools/Bio/npzd-bioebus/add_Szoo_Lzoo.m index 96bc091c..1015c3a3 100644 --- a/Preprocessing_tools/Bio/add_Szoo_Lzoo.m +++ b/Preprocessing_tools/Bio/npzd-bioebus/add_Szoo_Lzoo.m @@ -41,6 +41,18 @@ function add_Szoo_Lzoo(climfile); % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % +% options for write_time_attributes +insecond = 0 ; +add_cycle = 1 ; +% +% +% Initialize Yorig if not provided +if ~exist('Yorig', 'var') , Yorig = [] ; , end +% +% Get time attributes +[time_unit_att,time_second_unit_att,calendar_att]=... + get_time_attributes(Yorig); +% theta1=0.2; theta2=0.3; % @@ -61,11 +73,8 @@ nc{'SZOO'} = ncdouble('szoo_time','s_rho','eta_rho','xi_rho') ; % nc{'szoo_time'}.long_name = ncchar('time for Small Zooplankton'); nc{'szoo_time'}.long_name = 'time for Small Zooplankton'; -nc{'szoo_time'}.units = ncchar('day'); -nc{'szoo_time'}.units = 'day'; -if cycle~=0 - nc{'szoo_time'}.cycle_length = cycle; -end +write_time_attributes(nc,'szoo_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc('lzoo_time') = tlen; nc{'lzoo_time'} = ncdouble('lzoo_time') ; @@ -73,11 +82,8 @@ nc{'LZOO'} = ncdouble('lzoo_time','s_rho','eta_rho','xi_rho') ; % nc{'lzoo_time'}.long_name = ncchar('time for Large Zooplankton'); nc{'lzoo_time'}.long_name = 'time for Large Zooplankton'; -nc{'lzoo_time'}.units = ncchar('day'); -nc{'lzoo_time'}.units = 'day'; -if cycle~=0 - nc{'lzoo_time'}.cycle_length = cycle; -end +write_time_attributes(nc,'lzoo_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'SZOO'}.long_name = ncchar('Small Zooplankton'); nc{'SZOO'}.long_name = 'Small Zooplankton'; diff --git a/Preprocessing_tools/Bio/add_bry_bioebus.m b/Preprocessing_tools/Bio/npzd-bioebus/add_bry_bioebus.m similarity index 92% rename from Preprocessing_tools/Bio/add_bry_bioebus.m rename to Preprocessing_tools/Bio/npzd-bioebus/add_bry_bioebus.m index 6938dafe..ab69dbd2 100644 --- a/Preprocessing_tools/Bio/add_bry_bioebus.m +++ b/Preprocessing_tools/Bio/npzd-bioebus/add_bry_bioebus.m @@ -46,6 +46,18 @@ function add_bry_bioebus(bryname,obc,time_no3,time_o2,time_zoo,time_phyto,time_c % Gildas Cambon, IRD, 2011 % % Gildas Cambon, IRD, 2013 : Add oxygen processing % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% options for write_time_attributes +insecond = 0 ; +add_cycle = 1 ; +% +% Initialize Yorig if not provided +if ~exist('Yorig', 'var') , Yorig = []; , end +% +% Get time attributes +[time_unit_att,time_second_unit_att,calendar_att]=... + get_time_attributes(Yorig); +% disp(' ') disp([' Adding BIOEBUS BGC data into file : ',bryname]) disp(' ') @@ -71,51 +83,44 @@ nc('one') = 1; nc{'no3_time'} = ncdouble('no3_time') ; nc{'no3_time'}.long_name = ncchar('time for NO3 climatology') nc{'no3_time'}.long_name = 'time for NO3 climatology'; -nc{'no3_time'}.units = ncchar('day'); -nc{'no3_time'}.units = 'day'; -nc{'no3_time'}.cycle_length = cycle;% +write_time_attributes(nc,'no3_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'o2_time'} = ncdouble('o2_time') ; nc{'o2_time'}.long_name = ncchar('time for O2 climatology') nc{'o2_time'}.long_name = 'time for O2 climatology'; -nc{'o2_time'}.units = ncchar('day'); -nc{'o2_time'}.units = 'day'; -nc{'o2_time'}.cycle_length = cycle; +write_time_attributes(nc,'o2_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'chla_time'} = ncdouble('chla_time') ; nc{'chla_time'}.long_name = ncchar('time for CHLA climatology'); nc{'chla_time'}.long_name = 'time for CHLA climatology'; -nc{'chla_time'}.units = ncchar('day'); -nc{'chla_time'}.units = 'day'; -nc{'chla_time'}.cycle_length = cycle;% +write_time_attributes(nc,'chla_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'sphyto_time'} = ncdouble('sphyto_time') ; nc{'sphyto_time'}.long_name = ncchar('time for SPHYTO climatology'); nc{'sphyto_time'}.long_name = 'time for SPHYTO climatology'; -nc{'sphyto_time'}.units = ncchar('day'); -nc{'sphyto_time'}.units = 'day'; -nc{'sphyto_time'}.cycle_length = cycle;% +write_time_attributes(nc,'sphyto_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'lphyto_time'} = ncdouble('lphyto_time') ; nc{'lphyto_time'}.long_name = ncchar('time for LPHYTO climatology'); nc{'lphyto_time'}.long_name = 'time for LPHYTO climatology'; -nc{'lphyto_time'}.units = ncchar('day'); -nc{'lphyto_time'}.units = 'day'; -nc{'lphyto_time'}.cycle_length = cycle;% +write_time_attributes(nc,'lphyto_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'szoo_time'} = ncdouble('szoo_time') ; nc{'szoo_time'}.long_name = ncchar('time for SZOO climatology'); nc{'szoo_time'}.long_name = 'time for SZOO climatology'; -nc{'szoo_time'}.units = ncchar('day'); -nc{'szoo_time'}.units = 'day'; -nc{'szoo_time'}.cycle_length = cycle;% +write_time_attributes(nc,'szoo_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'lzoo_time'} = ncdouble('lzoo_time') ; nc{'lzoo_time'}.long_name = ncchar('time for LZOO climatology'); nc{'lzoo_time'}.long_name = 'time for LZOO climatology'; -nc{'lzoo_time'}.units = ncchar('day'); -nc{'lzoo_time'}.units = 'day'; -nc{'lzoo_time'}.cycle_length = cycle;% +write_time_attributes(nc,'lzoo_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % % if obc(1)==1 diff --git a/Preprocessing_tools/Bio/add_bry_bioebus_Z.m b/Preprocessing_tools/Bio/npzd-bioebus/add_bry_bioebus_Z.m similarity index 91% rename from Preprocessing_tools/Bio/add_bry_bioebus_Z.m rename to Preprocessing_tools/Bio/npzd-bioebus/add_bry_bioebus_Z.m index 4a953a06..d643aa40 100644 --- a/Preprocessing_tools/Bio/add_bry_bioebus_Z.m +++ b/Preprocessing_tools/Bio/npzd-bioebus/add_bry_bioebus_Z.m @@ -23,6 +23,18 @@ function add_bry_bioebus_Z(zbryname,obc,Z,time_no3,time_o2,time_zoo,time_phyto,t % Christophe Eugene Raoul Menkes, the slave, IRD, 2007. % % Gildas Cambon, IRD/LEGOS, 2013 : Add O2 processing % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% options for write_time_attributes +insecond = 0 ; +add_cycle = 1 ; +% +% Initialize Yorig if not provided +if ~exist('Yorig', 'var') , Yorig = []; , end +% +% Get time attributes +[time_unit_att,time_second_unit_att,calendar_att]=... + get_time_attributes(Yorig); +% disp(' ') disp([' Adding BioEBUS data into file : ',zbryname]) disp(' ') @@ -48,51 +60,45 @@ nc('one') = 1; nc{'no3_time'} = ncdouble('no3_time') ; nc{'no3_time'}.long_name = ncchar('time for NO3 climatology') nc{'no3_time'}.long_name = 'time for NO3 climatology'; -nc{'no3_time'}.units = ncchar('day'); -nc{'no3_time'}.units = 'day'; -nc{'no3_time'}.cycle_length = cycle; +write_time_attributes(nc,'no3_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); + % nc{'o2_time'} = ncdouble('o2_time') ; nc{'o2_time'}.long_name = ncchar('time for O2 climatology') nc{'o2_time'}.long_name = 'time for O2 climatology'; -nc{'o2_time'}.units = ncchar('day'); -nc{'o2_time'}.units = 'day'; -nc{'o2_time'}.cycle_length = cycle; +write_time_attributes(nc,'o2_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'chla_time'} = ncdouble('chla_time') ; nc{'chla_time'}.long_name = ncchar('time for CHLA climatology'); nc{'chla_time'}.long_name = 'time for CHLA climatology'; -nc{'chla_time'}.units = ncchar('day'); -nc{'chla_time'}.units = 'day'; -nc{'chla_time'}.cycle_length = cycle;% +write_time_attributes(nc,'chla_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'sphyto_time'} = ncdouble('sphyto_time') ; nc{'sphyto_time'}.long_name = ncchar('time for SPHYTO climatology'); nc{'sphyto_time'}.long_name = 'time for SPHYTO climatology'; -nc{'sphyto_time'}.units = ncchar('day'); -nc{'sphyto_time'}.units = 'day'; -nc{'sphyto_time'}.cycle_length = cycle;% +write_time_attributes(nc,'sphyto_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'lphyto_time'} = ncdouble('lphyto_time') ; nc{'lphyto_time'}.long_name = ncchar('time for LPHYTO climatology'); nc{'lphyto_time'}.long_name = 'time for LPHYTO climatology'; -nc{'lphyto_time'}.units = ncchar('day'); -nc{'lphyto_time'}.units = 'day'; -nc{'lphyto_time'}.cycle_length = cycle;% +write_time_attributes(nc,'lphyto_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'szoo_time'} = ncdouble('szoo_time') ; nc{'szoo_time'}.long_name = ncchar('time for SZOO climatology'); nc{'szoo_time'}.long_name = 'time for SZOO climatology'; -nc{'szoo_time'}.units = ncchar('day'); -nc{'szoo_time'}.units = 'day'; -nc{'szoo_time'}.cycle_length = cycle; +write_time_attributes(nc,'szoo_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'lzoo_time'} = ncdouble('lzoo_time') ; nc{'lzoo_time'}.long_name = ncchar('time for LZOO climatology'); nc{'lzoo_time'}.long_name = 'time for LZOO climatology'; -nc{'lzoo_time'}.units = ncchar('day'); -nc{'lzoo_time'}.units = 'day'; -nc{'lzoo_time'}.cycle_length = cycle; +write_time_attributes(nc,'lzoo_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % if obc(1)==1 diff --git a/Preprocessing_tools/Bio/add_bry_npzd.m b/Preprocessing_tools/Bio/npzd-bioebus/add_bry_npzd.m similarity index 90% rename from Preprocessing_tools/Bio/add_bry_npzd.m rename to Preprocessing_tools/Bio/npzd-bioebus/add_bry_npzd.m index 9cd49e6b..a46c0111 100644 --- a/Preprocessing_tools/Bio/add_bry_npzd.m +++ b/Preprocessing_tools/Bio/npzd-bioebus/add_bry_npzd.m @@ -46,6 +46,22 @@ function add_bry_npzd(bryname,obc,time_no3,time_o2,time_zoo,time_phyto,time_chla % Gildas Cambon, IRD, 2011 % % Gildas Cambon, IRD, 2013 : Add oxygen processing % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% options for write_time_attributes +insecond = 0 ; +add_cycle = 1 ; +% +% Initialize Yorig if not provided +if ~exist('Yorig', 'var') , Yorig = []; , end +% +% Get time attributes +[time_unit_att,time_second_unit_att,calendar_att]=... + get_time_attributes(Yorig); +% +disp(' ') +disp([' Adding PISCES data into file : ',bryname]) +disp(' ') +% disp(' ') disp([' Adding NPZD BGC data into file : ',bryname]) disp(' ') @@ -67,39 +83,34 @@ nc('one') = 1; % Create variables and attributes % nc{'no3_time'} = ncdouble('no3_time') ; -nc{'no3_time'}.long_name = ncchar('time for NO3 climatology') +nc{'no3_time'}.long_name = ncchar('time for NO3 climatology'); nc{'no3_time'}.long_name = 'time for NO3 climatology'; -nc{'no3_time'}.units = ncchar('day'); -nc{'no3_time'}.units = 'day'; -nc{'no3_time'}.cycle_length = cycle;% +write_time_attributes(nc,'no3_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'o2_time'} = ncdouble('o2_time') ; -nc{'o2_time'}.long_name = ncchar('time for O2 climatology') +nc{'o2_time'}.long_name = ncchar('time for O2 climatology'); nc{'o2_time'}.long_name = 'time for O2 climatology'; -nc{'o2_time'}.units = ncchar('day'); -nc{'o2_time'}.units = 'day'; -nc{'o2_time'}.cycle_length = cycle; +write_time_attributes(nc,'o2_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'chla_time'} = ncdouble('chla_time') ; nc{'chla_time'}.long_name = ncchar('time for CHLA climatology'); nc{'chla_time'}.long_name = 'time for CHLA climatology'; -nc{'chla_time'}.units = ncchar('day'); -nc{'chla_time'}.units = 'day'; -nc{'chla_time'}.cycle_length = cycle;% +write_time_attributes(nc,'chla_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'phyto_time'} = ncdouble('phyto_time') ; nc{'phyto_time'}.long_name = ncchar('time for PHYTO climatology'); nc{'phyto_time'}.long_name = 'time for PHYTO climatology'; -nc{'phyto_time'}.units = ncchar('day'); -nc{'phyto_time'}.units = 'day'; -nc{'phyto_time'}.cycle_length = cycle;% +write_time_attributes(nc,'phyto_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'zoo_time'} = ncdouble('zoo_time') ; nc{'zoo_time'}.long_name = ncchar('time for ZOO climatology'); nc{'zoo_time'}.long_name = 'time for ZOO climatology'; -nc{'zoo_time'}.units = ncchar('day'); -nc{'zoo_time'}.units = 'day'; -nc{'zoo_time'}.cycle_length = cycle;% +write_time_attributes(nc,'zoo_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % % if obc(1)==1 diff --git a/Preprocessing_tools/Bio/add_bry_npzd_Z.m b/Preprocessing_tools/Bio/npzd-bioebus/add_bry_npzd_Z.m similarity index 91% rename from Preprocessing_tools/Bio/add_bry_npzd_Z.m rename to Preprocessing_tools/Bio/npzd-bioebus/add_bry_npzd_Z.m index c1755f6a..29b60a6b 100644 --- a/Preprocessing_tools/Bio/add_bry_npzd_Z.m +++ b/Preprocessing_tools/Bio/npzd-bioebus/add_bry_npzd_Z.m @@ -23,6 +23,18 @@ function add_bry_npzd_Z(zbryname,obc,Z,time_no3,time_o2,time_zoo,time_phyto,time % Christophe Eugene Raoul Menkes, the slave, IRD, 2007. % % Gildas Cambon, IRD/LEGOS, 2013 : Add O2 processing % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% options for write_time_attributes +insecond = 0 ; +add_cycle = 1 ; +% +% Initialize Yorig if not provided +if ~exist('Yorig', 'var') , Yorig = []; , end +% +% Get time attributes +[time_unit_att,time_second_unit_att,calendar_att]=... + get_time_attributes(Yorig); +% disp(' ') disp([' Adding NPZD data into file : ',zbryname]) disp(' ') @@ -46,37 +58,32 @@ nc('one') = 1; nc{'no3_time'} = ncdouble('no3_time') ; nc{'no3_time'}.long_name = ncchar('time for NO3 climatology') nc{'no3_time'}.long_name = 'time for NO3 climatology'; -nc{'no3_time'}.units = ncchar('day'); -nc{'no3_time'}.units = 'day'; -nc{'no3_time'}.cycle_length = cycle; +write_time_attributes(nc,'no3_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'o2_time'} = ncdouble('o2_time') ; nc{'o2_time'}.long_name = ncchar('time for O2 climatology') nc{'o2_time'}.long_name = 'time for O2 climatology'; -nc{'o2_time'}.units = ncchar('day'); -nc{'o2_time'}.units = 'day'; -nc{'o2_time'}.cycle_length = cycle; +write_time_attributes(nc,'o2_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'chla_time'} = ncdouble('chla_time') ; nc{'chla_time'}.long_name = ncchar('time for CHLA climatology'); nc{'chla_time'}.long_name = 'time for CHLA climatology'; -nc{'chla_time'}.units = ncchar('day'); -nc{'chla_time'}.units = 'day'; -nc{'chla_time'}.cycle_length = cycle;% +write_time_attributes(nc,'chla_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'phyto_time'} = ncdouble('phyto_time') ; nc{'phyto_time'}.long_name = ncchar('time for PHYTO climatology'); nc{'phyto_time'}.long_name = 'time for PHYTO climatology'; -nc{'phyto_time'}.units = ncchar('day'); -nc{'phyto_time'}.units = 'day'; -nc{'phyto_time'}.cycle_length = cycle;% +write_time_attributes(nc,'phyto_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'zoo_time'} = ncdouble('zoo_time') ; nc{'zoo_time'}.long_name = ncchar('time for ZOO climatology'); nc{'zoo_time'}.long_name = 'time for ZOO climatology'; -nc{'zoo_time'}.units = ncchar('day'); -nc{'zoo_time'}.units = 'day'; -nc{'zoo_time'}.cycle_length = cycle; +write_time_attributes(nc,'zoo_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % if obc(1)==1 @@ -89,7 +96,7 @@ if obc(1)==1 nc{'NO3_south'}.units = ncchar('mMol N m-3'); nc{'NO3_south'}.units = 'mMol N m-3'; % - nc{'O2_south'} = ncdouble('no3_time','Z','xi_rho') ; + nc{'O2_south'} = ncdouble('o2_time','Z','xi_rho') ; nc{'O2_south'}.long_name = ncchar('southern boundary O2'); nc{'O2_south'}.long_name = 'southern boundary O2'; nc{'O2_south'}.units = ncchar('mMol O m-3'); diff --git a/Preprocessing_tools/Bio/add_chla.m b/Preprocessing_tools/Bio/npzd-bioebus/add_chla.m similarity index 100% rename from Preprocessing_tools/Bio/add_chla.m rename to Preprocessing_tools/Bio/npzd-bioebus/add_chla.m diff --git a/Preprocessing_tools/Bio/add_ini_Sphyto_Lphyto.m b/Preprocessing_tools/Bio/npzd-bioebus/add_ini_Sphyto_Lphyto.m similarity index 100% rename from Preprocessing_tools/Bio/add_ini_Sphyto_Lphyto.m rename to Preprocessing_tools/Bio/npzd-bioebus/add_ini_Sphyto_Lphyto.m diff --git a/Preprocessing_tools/Bio/add_ini_Szoo_Lzoo.m b/Preprocessing_tools/Bio/npzd-bioebus/add_ini_Szoo_Lzoo.m similarity index 100% rename from Preprocessing_tools/Bio/add_ini_Szoo_Lzoo.m rename to Preprocessing_tools/Bio/npzd-bioebus/add_ini_Szoo_Lzoo.m diff --git a/Preprocessing_tools/Bio/add_ini_bioebus.m b/Preprocessing_tools/Bio/npzd-bioebus/add_ini_bioebus.m similarity index 100% rename from Preprocessing_tools/Bio/add_ini_bioebus.m rename to Preprocessing_tools/Bio/npzd-bioebus/add_ini_bioebus.m diff --git a/Preprocessing_tools/Bio/add_ini_chla.m b/Preprocessing_tools/Bio/npzd-bioebus/add_ini_chla.m similarity index 100% rename from Preprocessing_tools/Bio/add_ini_chla.m rename to Preprocessing_tools/Bio/npzd-bioebus/add_ini_chla.m diff --git a/Preprocessing_tools/Bio/add_ini_no3.m b/Preprocessing_tools/Bio/npzd-bioebus/add_ini_no3.m similarity index 100% rename from Preprocessing_tools/Bio/add_ini_no3.m rename to Preprocessing_tools/Bio/npzd-bioebus/add_ini_no3.m diff --git a/Preprocessing_tools/Bio/add_ini_npzd.m b/Preprocessing_tools/Bio/npzd-bioebus/add_ini_npzd.m similarity index 100% rename from Preprocessing_tools/Bio/add_ini_npzd.m rename to Preprocessing_tools/Bio/npzd-bioebus/add_ini_npzd.m diff --git a/Preprocessing_tools/Bio/add_ini_o2.m b/Preprocessing_tools/Bio/npzd-bioebus/add_ini_o2.m similarity index 100% rename from Preprocessing_tools/Bio/add_ini_o2.m rename to Preprocessing_tools/Bio/npzd-bioebus/add_ini_o2.m diff --git a/Preprocessing_tools/Bio/add_ini_phyto.m b/Preprocessing_tools/Bio/npzd-bioebus/add_ini_phyto.m similarity index 100% rename from Preprocessing_tools/Bio/add_ini_phyto.m rename to Preprocessing_tools/Bio/npzd-bioebus/add_ini_phyto.m diff --git a/Preprocessing_tools/Bio/add_ini_zoo.m b/Preprocessing_tools/Bio/npzd-bioebus/add_ini_zoo.m similarity index 100% rename from Preprocessing_tools/Bio/add_ini_zoo.m rename to Preprocessing_tools/Bio/npzd-bioebus/add_ini_zoo.m diff --git a/Preprocessing_tools/Bio/add_phyto.m b/Preprocessing_tools/Bio/npzd-bioebus/add_phyto.m similarity index 85% rename from Preprocessing_tools/Bio/add_phyto.m rename to Preprocessing_tools/Bio/npzd-bioebus/add_phyto.m index c38091ca..cbcc07cc 100644 --- a/Preprocessing_tools/Bio/add_phyto.m +++ b/Preprocessing_tools/Bio/npzd-bioebus/add_phyto.m @@ -39,6 +39,18 @@ function add_phyto(climfile); % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % +% options for write_time_attributes +insecond = 0 ; +add_cycle = 1 ; +% +% +% Initialize Yorig if not provided +if ~exist('Yorig', 'var') , Yorig = [] ; , end +% +% Get time attributes +[time_unit_att,time_second_unit_att,calendar_att]=... + get_time_attributes(Yorig); +% theta=0.5; % disp('Add_phyto: creating variable and attribute') @@ -56,11 +68,8 @@ nc{'PHYTO'} = ncdouble('phyto_time','s_rho','eta_rho','xi_rho') ; % nc{'phyto_time'}.long_name = ncchar('time for phytoplankton'); nc{'phyto_time'}.long_name = 'time for phytoplankton'; -nc{'phyto_time'}.units = ncchar('day'); -nc{'phyto_time'}.units = 'day'; -if cycle~=0 - nc{'phyto_time'}.cycle_length = cycle; -end +write_time_attributes(nc,'phyto_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'PHYTO'}.long_name = ncchar('Phytoplankton'); nc{'PHYTO'}.long_name = 'Phytoplankton'; diff --git a/Preprocessing_tools/Bio/add_zoo.m b/Preprocessing_tools/Bio/npzd-bioebus/add_zoo.m similarity index 85% rename from Preprocessing_tools/Bio/add_zoo.m rename to Preprocessing_tools/Bio/npzd-bioebus/add_zoo.m index 597a1c10..cf14cdaf 100644 --- a/Preprocessing_tools/Bio/add_zoo.m +++ b/Preprocessing_tools/Bio/npzd-bioebus/add_zoo.m @@ -41,6 +41,19 @@ function add_zoo(climfile); % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % +% options for write_time_attributes +insecond = 0 ; +add_cycle = 1 ; +% +% +% Initialize Yorig if not provided +if ~exist('Yorig', 'var') , Yorig = [] ; , end +% +% Get time attributes +[time_unit_att,time_second_unit_att,calendar_att]=... + get_time_attributes(Yorig); +% +% theta=0.2; % disp('Add_zoo: creating variable and attribute') @@ -58,11 +71,8 @@ nc{'ZOO'} = ncdouble('zoo_time','s_rho','eta_rho','xi_rho') ; % nc{'zoo_time'}.long_name = ncchar('time for zooplankton'); nc{'zoo_time'}.long_name = 'time for zooplankton'; -nc{'zoo_time'}.units = ncchar('day'); -nc{'zoo_time'}.units = 'day'; -if cycle~=0 - nc{'zoo_time'}.cycle_length = cycle; -end +write_time_attributes(nc,'zoo_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'ZOO'}.long_name = ncchar('Zooplankton'); nc{'ZOO'}.long_name = 'Zooplankton'; diff --git a/Preprocessing_tools/Bio/bry_interp_bgc.m b/Preprocessing_tools/Bio/npzd-bioebus/bry_interp_bgc.m similarity index 100% rename from Preprocessing_tools/Bio/bry_interp_bgc.m rename to Preprocessing_tools/Bio/npzd-bioebus/bry_interp_bgc.m diff --git a/Preprocessing_tools/Bio/bry_interp_bgc_chloro.m b/Preprocessing_tools/Bio/npzd-bioebus/bry_interp_bgc_chloro.m similarity index 100% rename from Preprocessing_tools/Bio/bry_interp_bgc_chloro.m rename to Preprocessing_tools/Bio/npzd-bioebus/bry_interp_bgc_chloro.m diff --git a/Preprocessing_tools/Bio/make_bry_bioebus.m b/Preprocessing_tools/Bio/npzd-bioebus/make_bry_bioebus.m similarity index 99% rename from Preprocessing_tools/Bio/make_bry_bioebus.m rename to Preprocessing_tools/Bio/npzd-bioebus/make_bry_bioebus.m index 7e7ad426..9bea5deb 100644 --- a/Preprocessing_tools/Bio/make_bry_bioebus.m +++ b/Preprocessing_tools/Bio/npzd-bioebus/make_bry_bioebus.m @@ -72,7 +72,7 @@ no3_ann_data=[climato_dir,'no3_ann.cdf']; o2_seas_data=[climato_dir,'o2_month.cdf']; o2_ann_data=[climato_dir,'o2_ann.cdf']; chla_seas_data=[chla_dir,'chla_seas.cdf']; -chla_ann_data=[chla_dir,'chla_seas.cdf']; +chla_ann_data=[chla_dir,'chla_ann.cdf']; % % %%%%%%%%%%%%%%%%%%% END USERS DEFINED VARIABLES %%%%%%%%%%%%%%%%%%%%%%% diff --git a/Preprocessing_tools/Bio/make_bry_npzd.m b/Preprocessing_tools/Bio/npzd-bioebus/make_bry_npzd.m similarity index 98% rename from Preprocessing_tools/Bio/make_bry_npzd.m rename to Preprocessing_tools/Bio/npzd-bioebus/make_bry_npzd.m index 11b9b01a..0dd9b10b 100644 --- a/Preprocessing_tools/Bio/make_bry_npzd.m +++ b/Preprocessing_tools/Bio/npzd-bioebus/make_bry_npzd.m @@ -67,9 +67,9 @@ Roa; % Data climatologies file names: % % -no3_seas_data=[climato_dir,'no3_seas.cdf']; +no3_seas_data=[climato_dir,'no3_month.cdf']; no3_ann_data=[climato_dir,'no3_ann.cdf']; -o2_seas_data=[climato_dir,'o2_seas.cdf']; +o2_seas_data=[climato_dir,'o2_month.cdf']; o2_ann_data=[climato_dir,'o2_ann.cdf']; chla_seas_data=[chla_dir,'chla_seas.cdf']; chla_ann_data=[chla_dir,'chla_ann.cdf']; diff --git a/Preprocessing_tools/Bio/make_clim_bioebus.m b/Preprocessing_tools/Bio/npzd-bioebus/make_clim_bioebus.m similarity index 100% rename from Preprocessing_tools/Bio/make_clim_bioebus.m rename to Preprocessing_tools/Bio/npzd-bioebus/make_clim_bioebus.m diff --git a/Preprocessing_tools/Bio/make_clim_npzd.m b/Preprocessing_tools/Bio/npzd-bioebus/make_clim_npzd.m similarity index 97% rename from Preprocessing_tools/Bio/make_clim_npzd.m rename to Preprocessing_tools/Bio/npzd-bioebus/make_clim_npzd.m index 0f31acb2..65edff43 100644 --- a/Preprocessing_tools/Bio/make_clim_npzd.m +++ b/Preprocessing_tools/Bio/npzd-bioebus/make_clim_npzd.m @@ -34,9 +34,9 @@ crocotools_param % % Data climatologies file names: % -no3_seas_data=[climato_dir,'no3_seas.cdf']; +no3_seas_data=[climato_dir,'no3_month.cdf']; no3_ann_data=[climato_dir,'no3_ann.cdf']; -o2_seas_data=[climato_dir,'o2_seas.cdf']; +o2_seas_data=[climato_dir,'o2_month.cdf']; o2_ann_data=[climato_dir,'o2_ann.cdf']; chla_seas_data=[chla_dir,'chla_seas.cdf']; diff --git a/Preprocessing_tools/Bio/make_ini_bioebus.m b/Preprocessing_tools/Bio/npzd-bioebus/make_ini_bioebus.m similarity index 100% rename from Preprocessing_tools/Bio/make_ini_bioebus.m rename to Preprocessing_tools/Bio/npzd-bioebus/make_ini_bioebus.m diff --git a/Preprocessing_tools/Bio/make_ini_npzd.m b/Preprocessing_tools/Bio/npzd-bioebus/make_ini_npzd.m similarity index 100% rename from Preprocessing_tools/Bio/make_ini_npzd.m rename to Preprocessing_tools/Bio/npzd-bioebus/make_ini_npzd.m diff --git a/Preprocessing_tools/Bio/npzd-bioebus/make_n2o_bioebus.m b/Preprocessing_tools/Bio/npzd-bioebus/make_n2o_bioebus.m new file mode 100644 index 00000000..ea0677a5 --- /dev/null +++ b/Preprocessing_tools/Bio/npzd-bioebus/make_n2o_bioebus.m @@ -0,0 +1,322 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Add N2O data in input CROCO files from Global Atlas (WOA or CARS) +% +% N2O distribution from Nevison et al. (2003) formulation +% +% Data input format (netcdf): +% variable(T, Z, Y, X) +% T : time [Months] +% Z : Depth [m] +% Y : Latitude [degree north] +% X : Longitude [degree east] +% +% +% Elodie Gutknecht, 2013 +% Gildas Cambon, 2013 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +clear all +close all +% +% Title +% +crocotools_param +%%%%%%%%%%%%%%%%%%% END USERS DEFINED VARIABLES %%%%%%%%%%%%%%%%%%%%%%% +% +% options for write_time_attributes +insecond = 0 ; +add_cycle = 1 ; +Yorig=''; +% +% Initialize Yorig if not provided +if ~exist('Yorig', 'var') , Yorig = []; , end +% +% Get time attributes +[time_unit_att,time_second_unit_att,calendar_att]=... + get_time_attributes(Yorig); +% +% +%========= + +if makeini + nc=netcdf(grdname,'r'); + h = nc{'h'}(:); + close(nc) + % O2 initial conditions + nc=netcdf(ininame,'r'); + theta_s = nc{'theta_s'}(:); + theta_b = nc{'theta_b'}(:); + Tcline = nc{'Tcline'}(:); + N = length(nc('s_rho')); + vtransform=nc{'Vtransform'}(:); + if ~exist('vtransform') + vtransform=1; %Old Vtransform + disp([' NO VTRANSFORM parameter found']) + disp([' USE TRANSFORM default value vtransform = 1']) + end + O2_ini = nc{'O2'}(:); + close(nc) + type = 'initial conditions file' ; + history = 'CROCO' ; + [KK,LL,MM]=size(O2_ini); + % + zw_ini=zlevs(h,0.,theta_s,theta_b,Tcline,N,'w',vtransform); + N2O_ini=zeros(KK,LL,MM);N2O_ini=NaN; + for k=1:KK + for j=1:LL + for i=1:MM + N2O_ini(k,j,i)=nevis_2003(squeeze(zw_ini(k,j,i)),squeeze(O2_ini(k,j,i))); + end + end + end + % Find NaN + find(isnan(N2O_ini)==1);% + % + % open the ini file + nc = netcdf(ininame,'write'); + % new variable + %%redef(nc); + % + nc{'N2O'} = ncdouble('time','s_rho','eta_rho','xi_rho') ; + nc{'N2O'}.long_name = 'Nitrous oxide'; + nc{'N2O'}.fields = 'NO2, scalar, series'; + %%endef(nc); + % write new variable + nc{'N2O'}(:,:,:) = N2O_ini; + % Synchronize on disk + close(nc); +end + +%========== +if makeclim + nc=netcdf(grdname,'r'); + h = nc{'h'}(:); + close(nc) + % O2 climatological conditions + nc=netcdf(clmname,'r'); + theta_s = nc{'theta_s'}(:); + theta_b = nc{'theta_b'}(:); + Tcline = nc{'Tcline'}(:); + N = length(nc('s_rho')); + vtransform=nc{'Vtransform'}(:); + if ~exist('vtransform') + vtransform=1; %Old Vtransform + disp([' NO VTRANSFORM parameter found']) + disp([' USE TRANSFORM default value vtransform = 1']) + end + O2_clm = nc{'O2'}(:); + O2_time = nc{'o2_time'}(:); + O2_cycle = nc{'o2_time'}.cycle_length(:); + zeta = nc{'zeta'}(:); + close(nc) + [TT,KK,LL,MM]=size(O2_clm); + for itps=1:length(O2_time) + zw_clm(itps,:,:,:)=zlevs(h,squeeze(zeta(itps,:,:)),theta_s,theta_b,Tcline,N,'w',vtransform); + end + N2O_clm=zeros(TT,KK,LL,MM); N2O_clm(:)=NaN; + for t=1:TT + for k=1:KK + for j=1:LL + for i=1:MM + zw= squeeze(zw_clm(t,k,j,i)); + O2=squeeze(O2_clm(t,k,j,i)); + N2O_clm(t,k,j,i)=nevis_2003(zw,02); + end + end + end + end + % Find NaN + find(isnan(N2O_clm)==1); + % + % add N20 in climatological file + type = 'climatological conditions file' ; + history = 'CROCO' ; + % + % open the clm file + % + nc = netcdf(clmname,'write'); + % + % new variable + % + %%redef(nc); + nc('n2o_time') = TT; + nc{'n2o_time'} = ncdouble('n2o_time') ; + nc{'n2o_time'}.long_name = ncchar('time climatological N2O'); + nc{'n2o_time'}.long_name = 'time climatological N2O'; + write_time_attributes(nc,'n2o_time',O2_cycle,time_unit_att,time_second_unit_att,... + calendar_att,0,1); + + nc{'N2O'} = ncdouble('n2o_time','s_rho','eta_rho','xi_rho') ; + nc{'N2O'}.long_name = ncchar('Nitrous oxide'); + nc{'N2O'}.long_name = 'Nitrous oxide'; + nc{'N2O'}.units = ncchar('mMol N2O m-3'); + nc{'N2O'}.units = 'mMol N2O m-3'; + nc{'N2O'}.fields = ncchar('NO2, scalar, series'); + nc{'N2O'}.fields = 'NO2, scalar, series'; + %%endef(nc); + % + % write new variable + % + nc{'n2o_time'}(:) = O2_time(:); + nc{'N2O'}(:,:,:,:) = N2O_clm(:); + % + % Synchronize on disk + % + close(nc); +end + +%========== +if makebry + % O2 boundary conditions + nc=netcdf(grdname,'r'); + h = nc{'h'}(:); + close(nc) + + nc=netcdf(bryname,'r'); + theta_s = nc{'theta_s'}(:); + theta_b = nc{'theta_b'}(:); + Tcline = nc{'Tcline'}(:); + N = length(nc('s_rho')); + vtransform=nc{'Vtransform'}(:); + if ~exist('vtransform') + vtransform=1; %Old Vtransform + disp([' NO VTRANSFORM parameter found']) + disp([' USE TRANSFORM default value vtransform = 1']) + end + O2_bry_west = nc{'O2_west'}(:); + O2_bry_east = nc{'O2_east'}(:); + O2_bry_south = nc{'O2_south'}(:); + O2_bry_north = nc{'O2_north'}(:); + O2_time = nc{'o2_time'}(:); + O2_cycle = nc{'o2_time'}.cycle_length(:); + zeta_west = nc{'zeta_west'}(:); + zeta_east = nc{'zeta_east'}(:); + zeta_south = nc{'zeta_south'}(:); + zeta_north = nc{'zeta_north'}(:); + close(nc) + + % BRY + [TT,KK,MM]=size(O2_bry_south); [TT,KK,LL]=size(O2_bry_west); + type='w'; + zw_bry_west = zeros(TT,KK+1); + zw_bry_east = zeros(TT,KK+1); + zw_bry_south = zeros(TT,KK+1); + zw_bry_north = zeros(TT,KK+1); + + N2O_bry_east = zeros(TT,KK,LL); N2O_bry_east(:)=NaN ; + N2O_bry_west = zeros(TT,KK,LL); N2O_bry_west(:)=NaN ; + N2O_bry_south = zeros(TT,KK,MM); N2O_bry_south(:)=NaN ; + N2O_bry_north = zeros(TT,KK,MM); N2O_bry_north(:)=NaN ; + for t=1:TT + for j=1:LL + h_west = squeeze(h(j,1)); + h_east = squeeze(h(j,end)); + zw_bry_west(t,:,j) = zlevs_1d(h_west , squeeze(zeta_west(t,j)) , theta_s, theta_b, hc, N, type, vtransform); + zw_bry_east(t,:,j)= zlevs_1d(h_east , squeeze(zeta_east(t,j)) , theta_s, theta_b, hc, N, type, vtransform); + end + end + for t=1:TT + for i=1:MM + h_south = squeeze(h(1,i)); + h_north = squeeze(h(end,i)); + zw_bry_south(t,:,i)= zlevs_1d(h_south , squeeze(zeta_south(t,i)) , theta_s, theta_b, hc, N, type, vtransform); + zw_bry_north(t,:,i)= zlevs_1d(h_north , squeeze(zeta_north(t,i)) , theta_s, theta_b, hc, N, type, vtransform); + end + end + for t=1:TT + for k=1:KK + for j=1:LL + zw_east=zw_bry_east(t,k,j); + zw_west=zw_bry_west(t,k,j); + O2_east=O2_bry_east(t,k,j); + O2_west=O2_bry_west(t,k,j); + N2O_bry_east(t,k,j)= nevis_2003(zw_east,O2_east); + N2O_bry_west(t,k,j)= nevis_2003(zw_west,O2_west); + end + end + end + for t=1:TT + for k=1:KK + for i=1:MM + zw_north=zw_bry_north(t,k,i); + zw_south=zw_bry_south(t,k,i); + O2_north=O2_bry_north(t,k,i); + O2_south=O2_bry_south(t,k,i); + N2O_bry_north(t,k,i)=nevis_2003(zw_north,O2_north); + N2O_bry_south(t,k,i)=nevis_2003(zw_south,O2_south); + end + end + end + T= O2_time ;% time in days + cycle=O2_cycle; + + % + % add N20 in bryfile file + % + type = 'boundary conditions file' ; + history = 'CROCO' ; + % + % open the bry file + % + nc = netcdf(bryname,'write'); + % new variable + % + %%redef(nc); + nc('n2o_time') = length(T); + nc{'n2o_time'} = ncdouble('n2o_time') ; + nc{'n2o_time'}.long_name = ncchar('time climatological N2O'); + nc{'n2o_time'}.long_name = 'time climatological N2O'; + write_time_attributes(nc,'n2o_time',O2_cycle,time_unit_att,time_second_unit_att,... + calendar_att,0,1); + + nc{'N2O_east'} = ncdouble('n2o_time','s_rho','eta_rho') ; + nc{'N2O_east'}.long_name = ncchar('Nitrous oxide'); + nc{'N2O_east'}.long_name = 'Nitrous oxide'; + nc{'N20_east'}.units = ncchar('mMol N2O m-3'); + nc{'N2O_east'}.units = 'mMol N2O m-3'; + nc{'N2O_east'}.fields = ncchar('NO2, scalar, series'); + nc{'N2O_east'}.fields = 'NO2, scalar, series'; + + nc{'N2O_west'} = ncdouble('n2o_time','s_rho','eta_rho') ; + nc{'N2O_west'}.long_name = ncchar('Nitrous oxide'); + nc{'N2O_west'}.long_name = 'Nitrous oxide'; + nc{'N2O_west'}.units = ncchar('mMol N2O m-3'); + nc{'N2O_west'}.units = 'mMol N2O m-3'; + nc{'N2O_west'}.fields = ncchar('NO2, scalar, series'); + nc{'N2O_west'}.fields = 'NO2, scalar, series'; + + nc{'N2O_south'} = ncdouble('n2o_time','s_rho','xi_rho') ; + nc{'N2O_south'}.long_name = ncchar('Nitrous oxide'); + nc{'N2O_south'}.long_name = 'Nitrous oxide'; + nc{'N20_south'}.units = ncchar('mMol N2O m-3'); + nc{'N2O_south'}.units = 'mMol N2O m-3'; + nc{'N2O_south'}.fields = ncchar('NO2, scalar, series'); + nc{'N2O_south'}.fields = 'NO2, scalar, series'; + + nc{'N2O_north'} = ncdouble('n2o_time','s_rho','xi_rho') ; + nc{'N2O_north'}.long_name = ncchar('Nitrous oxide'); + nc{'N2O_north'}.long_name = 'Nitrous oxide'; + nc{'N20_north'}.units = ncchar('mMol N2O m-3'); + nc{'N2O_north'}.units = 'mMol N2O m-3'; + nc{'N2O_north'}.fields = ncchar('NO2, scalar, series'); + nc{'N2O_north'}.fields = 'NO2, scalar, series'; + + % + % write new variable + % + nc{'n2o_time'}(:) = T; + nc{'N2O_east'}(:,:,:,:) = N2O_bry_east; + nc{'N2O_west'}(:,:,:,:) = N2O_bry_west; + nc{'N2O_south'}(:,:,:,:) = N2O_bry_south; + nc{'N2O_north'}(:,:,:,:) = N2O_bry_north; + % + % Synchronize on disk + % + close(nc); +end + + + + + + diff --git a/Preprocessing_tools/Bio/nevis_2003.m b/Preprocessing_tools/Bio/npzd-bioebus/nevis_2003.m similarity index 100% rename from Preprocessing_tools/Bio/nevis_2003.m rename to Preprocessing_tools/Bio/npzd-bioebus/nevis_2003.m diff --git a/Preprocessing_tools/Bio/vinterp_bry_bgc.m b/Preprocessing_tools/Bio/npzd-bioebus/vinterp_bry_bgc.m similarity index 98% rename from Preprocessing_tools/Bio/vinterp_bry_bgc.m rename to Preprocessing_tools/Bio/npzd-bioebus/vinterp_bry_bgc.m index 154fb011..ea3c42dc 100644 --- a/Preprocessing_tools/Bio/vinterp_bry_bgc.m +++ b/Preprocessing_tools/Bio/npzd-bioebus/vinterp_bry_bgc.m @@ -93,7 +93,6 @@ for l=1:tlen %for l=1:1 disp([' Time index: ',num2str(l),' of total: ',num2str(tlen)]) var=squeeze(noa{vname}(l,:)); -% disp(['SIZE VAR=',num2str(size(var))]) if addsurf var=cat(1,var(1,:),var); end diff --git a/Preprocessing_tools/create_bry_Z.m b/Preprocessing_tools/create_bry_Z.m index ffd60b91..10e06c66 100644 --- a/Preprocessing_tools/create_bry_Z.m +++ b/Preprocessing_tools/create_bry_Z.m @@ -1,5 +1,5 @@ function create_bry_Z(zbryname,grdname,title,obc,... - Z,time,cycle,clobber); + Z,time,cycle,clobber,Yorig); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % This function create the header of a Netcdf boundary @@ -44,6 +44,17 @@ disp(' ') disp([' Creating the file : ',zbryname]) disp(' ') % +% options for write_time_attributes +insecond = 0; +add_cycle = 1 ; +% +% Initialize Yorig if not provided +if ~exist('Yorig', 'var') , Yorig = [] ; , end +% +% Get time attributes +[time_unit_att,time_second_unit_att,calendar_att]=... + get_time_attributes(Yorig); +% % Read the grid file and check the topography % nc = netcdf(grdname, 'nowrite'); @@ -81,9 +92,8 @@ nc{'Z'}.units = 'm'; nc{'bry_time'} = ncdouble('bry_time') ; nc{'bry_time'}.long_name = ncchar('time for temperature climatology'); nc{'bry_time'}.long_name = 'time for temperature climatology'; -nc{'bry_time'}.units = ncchar('day'); -nc{'bry_time'}.units = 'day'; -nc{'bry_time'}.cycle_length = cycle;% +write_time_attributes(nc,'bry_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % if obc(1)==1 % diff --git a/Preprocessing_tools/create_bryfile.m b/Preprocessing_tools/create_bryfile.m index e36dde8a..0c24858a 100644 --- a/Preprocessing_tools/create_bryfile.m +++ b/Preprocessing_tools/create_bryfile.m @@ -1,6 +1,6 @@ function create_bryfile(bryname,grdname,title,obc,... theta_s,theta_b,hc,N,... - time,cycle,clobber,vtransform); + time,cycle,clobber,vtransform,Yorig); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % function create_bryfile(bryname,grdname,title,obc... @@ -60,6 +60,19 @@ if nargin < 12 end disp([' VTRANSFORM = ',num2str(vtransform)]) % +% options for write_time_attributes +insecond = 0; +add_cycle = 1 ; +% +% +% Initialize Yorig if not provided +if ~exist('Yorig', 'var') , Yorig = [] ; , end +% +% Get time attributes +[time_unit_att,time_second_unit_att,calendar_att]=... + get_time_attributes(Yorig); +% +% % Read the grid file and check the topography % nc = netcdf(grdname, 'nowrite'); @@ -130,14 +143,14 @@ nc{'Vstretching'}.long_name = 'vertical terrain-following stretching function'; nc{'tstart'} = ncdouble('one') ; nc{'tstart'}.long_name = ncchar('start processing day'); nc{'tstart'}.long_name = 'start processing day'; -nc{'tstart'}.units = ncchar('day'); -nc{'tstart'}.units = 'day'; +write_time_attributes(nc,'tstart','',time_unit_att,time_second_unit_att,... + calendar_att,0,0); % nc{'tend'} = ncdouble('one') ; nc{'tend'}.long_name = ncchar('end processing day'); nc{'tend'}.long_name = 'end processing day'; -nc{'tend'}.units = ncchar('day'); -nc{'tend'}.units = 'day'; +write_time_attributes(nc,'tend','',time_unit_att,time_second_unit_att,... + calendar_att,0,0); % nc{'theta_s'} = ncdouble('one') ; nc{'theta_s'}.long_name = ncchar('S-coordinate surface control parameter'); @@ -214,103 +227,70 @@ nc{'Cs_w'}.valid_min = -1; nc{'Cs_w'}.valid_max = 0; % nc{'bry_time'} = ncdouble('bry_time') ; -nc{'bry_time'}.long_name = ncchar('time for boundary climatology'); -nc{'bry_time'}.long_name = 'time for boundary climatology'; -nc{'bry_time'}.units = ncchar('day'); -nc{'bry_time'}.units = 'day'; -nc{'bry_time'}.calendar = ncchar('360.0 days in every year'); -nc{'bry_time'}.calendar = '360.0 days in every year'; -nc{'bry_time'}.cycle_length = cycle; +nc{'bry_time'}.long_name = ncchar('time for boundary'); +nc{'bry_time'}.long_name = 'time for boundary'; +write_time_attributes(nc,'bry_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'tclm_time'} = ncdouble('tclm_time') ; nc{'tclm_time'}.long_name = ncchar('time for temperature climatology'); nc{'tclm_time'}.long_name = 'time for temperature climatology'; -nc{'tclm_time'}.units = ncchar('day'); -nc{'tclm_time'}.units = 'day'; -nc{'tclm_time'}.calendar = ncchar('360.0 days in every year'); -nc{'tclm_time'}.calendar = '360.0 days in every year'; -nc{'tclm_time'}.cycle_length = cycle; +write_time_attributes(nc,'tclm_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'temp_time'} = ncdouble('temp_time') ; nc{'temp_time'}.long_name = ncchar('time for temperature climatology'); nc{'temp_time'}.long_name = 'time for temperature climatology'; -nc{'temp_time'}.units = ncchar('day'); -nc{'temp_time'}.units = 'day'; -nc{'temp_time'}.calendar = ncchar('360.0 days in every year'); -nc{'temp_time'}.calendar = '360.0 days in every year'; -nc{'temp_time'}.cycle_length = cycle; +write_time_attributes(nc,'temp_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'sclm_time'} = ncdouble('sclm_time') ; nc{'sclm_time'}.long_name = ncchar('time for salinity climatology'); nc{'sclm_time'}.long_name = 'time for salinity climatology'; -nc{'sclm_time'}.units = ncchar('day'); -nc{'sclm_time'}.units = 'day'; -nc{'sclm_time'}.calendar = ncchar('360.0 days in every year'); -nc{'sclm_time'}.calendar = '360.0 days in every year'; -nc{'sclm_time'}.cycle_length = cycle; +write_time_attributes(nc,'sclm_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'salt_time'} = ncdouble('salt_time') ; nc{'salt_time'}.long_name = ncchar('time for salinity climatology'); nc{'salt_time'}.long_name = 'time for salinity climatology'; -nc{'salt_time'}.units = ncchar('day'); -nc{'salt_time'}.units = 'day'; -nc{'salt_time'}.calendar = ncchar('360.0 days in every year'); -nc{'salt_time'}.calendar = '360.0 days in every year'; -nc{'salt_time'}.cycle_length = cycle; +write_time_attributes(nc,'salt_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'uclm_time'} = ncdouble('uclm_time') ; nc{'uclm_time'}.long_name = ncchar('time climatological u'); nc{'uclm_time'}.long_name = 'time climatological u'; -nc{'uclm_time'}.units = ncchar('day'); -nc{'uclm_time'}.units = 'day'; -nc{'uclm_time'}.calendar = ncchar('360.0 days in every year'); -nc{'uclm_time'}.calendar = '360.0 days in every year'; -nc{'uclm_time'}.cycle_length = cycle; +write_time_attributes(nc,'sclm_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'vclm_time'} = ncdouble('vclm_time') ; nc{'vclm_time'}.long_name = ncchar('time climatological v'); nc{'vclm_time'}.long_name = 'time climatological v'; -nc{'vclm_time'}.units = ncchar('day'); -nc{'vclm_time'}.units = 'day'; -nc{'vclm_time'}.calendar = ncchar('360.0 days in every year'); -nc{'vclm_time'}.calendar = '360.0 days in every year'; -nc{'vclm_time'}.cycle_length = cycle; +write_time_attributes(nc,'vclm_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'v2d_time'} = ncdouble('v2d_time') ; nc{'v2d_time'}.long_name = ncchar('time for 2D velocity climatology'); nc{'v2d_time'}.long_name = 'time for 2D velocity climatology'; -nc{'v2d_time'}.units = ncchar('day'); -nc{'v2d_time'}.units = 'day'; -nc{'v2d_time'}.calendar = ncchar('360.0 days in every year'); -nc{'v2d_time'}.calendar = '360.0 days in every year'; -nc{'v2d_time'}.cycle_length = cycle; +write_time_attributes(nc,'v2d_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'v3d_time'} = ncdouble('v3d_time') ; nc{'v3d_time'}.long_name = ncchar('time for 3D velocity climatology'); nc{'v3d_time'}.long_name = 'time for 3D velocity climatology'; -nc{'v3d_time'}.units = ncchar('day'); -nc{'v3d_time'}.units = 'day'; -nc{'v3d_time'}.calendar = ncchar('360.0 days in every year'); -nc{'v3d_time'}.calendar = '360.0 days in every year'; -nc{'v3d_time'}.cycle_length = cycle; +write_time_attributes(nc,'v3d_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'ssh_time'} = ncdouble('ssh_time') ; nc{'ssh_time'}.long_name = ncchar('time for sea surface height'); nc{'ssh_time'}.long_name = 'time for sea surface height'; -nc{'ssh_time'}.units = ncchar('day'); -nc{'ssh_time'}.units = 'day'; -nc{'ssh_time'}.calendar = ncchar('360.0 days in every year'); -nc{'ssh_time'}.calendar = '360.0 days in every year'; -nc{'ssh_time'}.cycle_length = cycle; +write_time_attributes(nc,'ssh_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'zeta_time'} = ncdouble('zeta_time') ; nc{'zeta_time'}.long_name = ncchar('time for sea surface height'); nc{'zeta_time'}.long_name = 'time for sea surface height'; -nc{'zeta_time'}.units = ncchar('day'); -nc{'zeta_time'}.units = 'day'; -nc{'zeta_time'}.calendar = ncchar('360.0 days in every year'); -nc{'zeta_time'}.calendar = '360.0 days in every year'; -nc{'zeta_time'}.cycle_length = cycle; +write_time_attributes(nc,'zeta_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % if obc(1)==1 % diff --git a/Preprocessing_tools/create_bryfile_wkb.m b/Preprocessing_tools/create_bryfile_wkb.m index 1320ede3..b7729550 100644 --- a/Preprocessing_tools/create_bryfile_wkb.m +++ b/Preprocessing_tools/create_bryfile_wkb.m @@ -1,5 +1,5 @@ function create_bryfile(brywkbname,grdname,title,wkb_obc,... - time,cycle,clobber); + time,cycle,clobber,Yorig); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % function create_bryfile(brywkbname,grdname,title,wkb_obc... @@ -46,6 +46,17 @@ disp(' ') disp([' Creating the file : ',brywkbname]) disp(' ') % +% options for write_time_attributes +insecond = 0; +add_cycle = 1 ; +% +% Initialize Yorig if not provided +if ~exist('Yorig', 'var') , Yorig = [] ; , end + % + % Get time attributes + [time_unit_att,time_second_unit_att,calendar_att]=... + get_time_attributes(Yorig); +% % Read the grid file % nc = netcdf(grdname, 'nowrite'); @@ -78,25 +89,21 @@ nc('one') = 1; nc{'tstart'} = ncdouble('one') ; nc{'tstart'}.long_name = ncchar('start processing day'); nc{'tstart'}.long_name = 'start processing day'; -nc{'tstart'}.units = ncchar('day'); -nc{'tstart'}.units = 'day'; +write_time_attributes(nc,'tstart','',time_unit_att,time_second_unit_att,... + calendar_att,0,0); % nc{'tend'} = ncdouble('one') ; nc{'tend'}.long_name = ncchar('end processing day'); nc{'tend'}.long_name = 'end processing day'; -nc{'tend'}.units = ncchar('day'); -nc{'tend'}.units = 'day'; -% +write_time_attributes(nc,'tend','',time_unit_att,time_second_unit_att,... + calendar_att,0,0); % nc{'brywkb_time'} = ncdouble('brywkb_time') ; nc{'brywkb_time'}.long_name = ncchar('time for boundary climatology'); nc{'brywkb_time'}.long_name = 'time for boundary climatology'; -nc{'brywkb_time'}.units = ncchar('day'); -nc{'brywkb_time'}.units = 'day'; -nc{'brywkb_time'}.calendar = ncchar('360.0 days in every year'); -nc{'brywkb_time'}.calendar = '360.0 days in every year'; -nc{'brywkb_time'}.cycle_length = cycle; -% +write_time_attributes(nc,'brywkb_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); + if wkb_obc(1)==1 % % Southern boundary diff --git a/Preprocessing_tools/create_bulk.m b/Preprocessing_tools/create_bulk.m index 1ef47816..e7783e5c 100644 --- a/Preprocessing_tools/create_bulk.m +++ b/Preprocessing_tools/create_bulk.m @@ -1,4 +1,4 @@ -function create_bulk(frcname,grdname,title,bulkt,bulkc) +function create_bulk(frcname,grdname,title,bulkt,bulkc,Yorig) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Create an empty netcdf heat flux bulk forcing file @@ -39,10 +39,20 @@ M=length(nc('eta_psi')); close(nc); Lp=L+1; Mp=M+1; - +% +% options for write_time_attributes +insecond = 0; +add_cycle = 1 ; +% +% Initialize Yorig if not provided +if ~exist('Yorig', 'var') , Yorig = [] ; , end +% +% Get time attributes +[time_unit_att,time_second_unit_att,calendar_att]=... + get_time_attributes(Yorig); +% nw = netcdf(frcname, 'clobber'); %result = redef(nw); - % % Create dimensions % @@ -61,9 +71,8 @@ nw('bulk_time') = 0; nw{'bulk_time'} = ncdouble('bulk_time'); nw{'bulk_time'}.long_name = ncchar('bulk formulation execution time'); nw{'bulk_time'}.long_name = 'bulk formulation execution time'; -nw{'bulk_time'}.units = ncchar('days'); -nw{'bulk_time'}.units = 'days'; -nw{'bulk_time'}.cycle_length = bulkc; +write_time_attributes(nc,'bulk_time',bulkc,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); nw{'tair'} = ncdouble('bulk_time', 'eta_rho', 'xi_rho'); nw{'tair'}.long_name = ncchar('surface air temperature'); diff --git a/Preprocessing_tools/create_climfile.m b/Preprocessing_tools/create_climfile.m index 7e2bee7a..617d1de9 100644 --- a/Preprocessing_tools/create_climfile.m +++ b/Preprocessing_tools/create_climfile.m @@ -1,39 +1,39 @@ function create_climfile(clmname,grdname,title,... - theta_s,theta_b,hc,N,... - time,cycle,clobber,vtransform); + theta_s,theta_b,hc,N,... + time,cycle,clobber,vtransform, Yorig); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % function create_climfile(clmname,grdname,title,... % theta_s,theta_b,hc,N,... % time,cycle,clobber); % -% This function create the header of a Netcdf climatology +% This function create the header of a Netcdf climatology % file. % % Input: % % clmname Netcdf climatology file name (character string). % grdname Netcdf grid file name (character string). -% theta_s S-coordinate surface control parameter.(Real) +% theta_s S-coordinate surface control parameter.(Real) % theta_b S-coordinate bottom control parameter.(Real) % hc Width (m) of surface or bottom boundary layer % where higher vertical resolution is required -% during stretching.(Real) -% N Number of vertical levels.(Integer) -% time Temperature climatology time.(vector) +% during stretching.(Real) +% N Number of vertical levels.(Integer) +% time Temperature climatology time.(vector) % time Salinity climatology time.(vector) % time Velocity climatology time.(vector) % cycle Length (days) for cycling the climatology.(Real) -% clobber Switch to allow or not writing over an existing +% clobber Switch to allow or not writing over an existing % file.(character string) % % Output % % nc Output netcdf object. -% -% Further Information: +% +% Further Information: % http://www.croco-ocean.org -% +% % This file is part of CROCOTOOLS % % CROCOTOOLS is free software; you can redistribute it and/or modify @@ -51,20 +51,32 @@ function create_climfile(clmname,grdname,title,... % Foundation, Inc., 59 Temple Place, Suite 330, Boston, % MA 02111-1307 USA % -% Copyright (c) 2001-2006 by Pierrick Penven -% e-mail:Pierrick.Penven@ird.fr +% Copyright (c) 2001-2006 by Pierrick Penven +% e-mail:Pierrick.Penven@ird.fr % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% disp(' ') disp([' Creating the file : ',clmname]) disp(' ') if nargin < 11 - disp([' NO VTRANSFORM parameter found']) - disp([' USE TRANSFORM default value vtransform = 1']) - vtransform = 1; + disp([' NO VTRANSFORM parameter found']) + disp([' USE TRANSFORM default value vtransform = 1']) + vtransform = 1; end disp([' VTRANSFORM = ',num2str(vtransform)]) % +% options for write_time_attributes +insecond = 0; +add_cycle = 1; +% +% Initialize Yorig if not provided +if ~exist('Yorig', 'var') , Yorig = [] ; , end +% +% Get time attributes +[time_unit_att,time_second_unit_att,calendar_att]=... + get_time_attributes(Yorig); +% +% % Read the grid file % nc = netcdf(grdname, 'nowrite'); @@ -75,9 +87,9 @@ Mp=length(nc('eta_rho')); close(nc); hmin=min(min(h(maskr==1))); if vtransform ==1; - if hc > hmin - error([' hc (',num2str(hc),' m) > hmin (',num2str(hmin),' m)']) - end + if hc > hmin + error([' hc (',num2str(hc),' m) > hmin (',num2str(hmin),' m)']) + end end L=Lp-1; M=Mp-1; @@ -85,7 +97,7 @@ Np=N+1; % % Create the climatology file % -type = 'CLIMATOLOGY file' ; +type = 'CLIMATOLOGY file' ; history = 'CROCO' ; nc = netcdf(clmname,clobber); % result = redef(nc); @@ -164,13 +176,13 @@ nc{'spherical'}.flag_meanings = 'spherical Cartesian'; % nc{'tstart'}.long_name = ncchar('start processing day'); nc{'tstart'}.long_name = 'start processing day'; -nc{'tstart'}.units = ncchar('day'); -nc{'tstart'}.units = 'day'; +write_time_attributes(nc,'tstart',cycle,time_unit_att,time_second_unit_att,... + calendar_att,0,0); % nc{'tend'}.long_name = ncchar('end processing day'); nc{'tend'}.long_name = 'end processing day'; -nc{'tend'}.units = ncchar('day'); -nc{'tend'}.units = 'day'; +write_time_attributes(nc,'tend',cycle,time_unit_att,time_second_unit_att,... + calendar_att,0,0); % nc{'theta_s'}.long_name = ncchar('S-coordinate surface control parameter'); nc{'theta_s'}.long_name = 'S-coordinate surface control parameter'; @@ -203,7 +215,7 @@ if (vtransform ==1) nc{'s_rho'}.standard_name = 'ocean_s_coordinate_g1'; elseif (vtransform ==2) nc{'s_rho'}.standard_name = ncchar('ocean_s_coordinate_g2'); - nc{'s_rho'}.standard_name = 'ocean_s_coordinate_g2'; + nc{'s_rho'}.standard_name = 'ocean_s_coordinate_g2'; end nc{'s_rho'}.formula_terms = ncchar('s: s_rho C: Cs_rho eta: zeta depth: h depth_c: hc'); nc{'s_rho'}.formula_terms = 's: s_rho C: Cs_rho eta: zeta depth: h depth_c: hc'; @@ -240,83 +252,53 @@ nc{'Cs_w'}.valid_max = 0; % nc{'tclm_time'}.long_name = ncchar('time for temperature climatology'); nc{'tclm_time'}.long_name = 'time for temperature climatology'; -nc{'tclm_time'}.units = ncchar('day'); -nc{'tclm_time'}.units = 'day'; -nc{'tclm_time'}.calendar = ncchar('360.0 days in every year'); -nc{'tclm_time'}.calendar = '360.0 days in every year'; -nc{'tclm_time'}.cycle_length = cycle; +write_time_attributes(nc,'tclm_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'temp_time'}.long_name = ncchar('time for temperature climatology'); nc{'temp_time'}.long_name = 'time for temperature climatology'; -nc{'temp_time'}.units = ncchar('day'); -nc{'temp_time'}.units = 'day'; -nc{'temp_time'}.calendar = ncchar('360.0 days in every year'); -nc{'temp_time'}.calendar = '360.0 days in every year'; -nc{'temp_time'}.cycle_length = cycle; +write_time_attributes(nc,'temp_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'sclm_time'}.long_name = ncchar('time for salinity climatology'); nc{'sclm_time'}.long_name = 'time for salinity climatology'; -nc{'sclm_time'}.units = ncchar('day'); -nc{'sclm_time'}.units = 'day'; -nc{'sclm_time'}.calendar = ncchar('360.0 days in every year'); -nc{'sclm_time'}.calendar = '360.0 days in every year'; -nc{'sclm_time'}.cycle_length = cycle; +write_time_attributes(nc,'sclm_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'salt_time'}.long_name = ncchar('time for salinity climatology'); nc{'salt_time'}.long_name = 'time for salinity climatology'; -nc{'salt_time'}.units = ncchar('day'); -nc{'salt_time'}.units = 'day'; -nc{'salt_time'}.calendar = ncchar('360.0 days in every year'); -nc{'salt_time'}.calendar = '360.0 days in every year'; -nc{'salt_time'}.cycle_length = cycle; +write_time_attributes(nc,'salt_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'uclm_time'}.long_name = ncchar('time climatological u'); nc{'uclm_time'}.long_name = 'time climatological u'; -nc{'uclm_time'}.units = ncchar('day'); -nc{'uclm_time'}.units = 'day'; -nc{'uclm_time'}.calendar = ncchar('360.0 days in every year'); -nc{'uclm_time'}.calendar = '360.0 days in every year'; -nc{'uclm_time'}.cycle_length = cycle; +write_time_attributes(nc,'uclm_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'vclm_time'}.long_name = ncchar('time climatological v'); nc{'vclm_time'}.long_name = 'time climatological v'; -nc{'vclm_time'}.units = ncchar('day'); -nc{'vclm_time'}.units = 'day'; -nc{'vclm_time'}.calendar = ncchar('360.0 days in every year'); -nc{'vclm_time'}.calendar = '360.0 days in every year'; -nc{'vclm_time'}.cycle_length = cycle; +write_time_attributes(nc,'vclm_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'v2d_time'}.long_name = ncchar('time for 2D velocity climatology'); nc{'v2d_time'}.long_name = 'time for 2D velocity climatology'; -nc{'v2d_time'}.units = ncchar('day'); -nc{'v2d_time'}.units = 'day'; -nc{'v2d_time'}.calendar = ncchar('360.0 days in every year'); -nc{'v2d_time'}.calendar = '360.0 days in every year'; -nc{'v2d_time'}.cycle_length = cycle; +write_time_attributes(nc,'v2d_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'v3d_time'}.long_name = ncchar('time for 3D velocity climatology'); nc{'v3d_time'}.long_name = 'time for 3D velocity climatology'; -nc{'v3d_time'}.units = ncchar('day'); -nc{'v3d_time'}.units = 'day'; -nc{'v3d_time'}.calendar = ncchar('360.0 days in every year'); -nc{'v3d_time'}.calendar = '360.0 days in every year'; -nc{'v3d_time'}.cycle_length = cycle; +write_time_attributes(nc,'v3d_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'ssh_time'}.long_name = ncchar('time for sea surface height'); nc{'ssh_time'}.long_name = 'time for sea surface height'; -nc{'ssh_time'}.units = ncchar('day'); -nc{'ssh_time'}.units = 'day'; -nc{'ssh_time'}.calendar = ncchar('360.0 days in every year'); -nc{'ssh_time'}.calendar = '360.0 days in every year'; -nc{'ssh_time'}.cycle_length = cycle; +write_time_attributes(nc,'ssh_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'zeta_time'}.long_name = ncchar('time for sea surface height'); nc{'zeta_time'}.long_name = 'time for sea surface height'; -nc{'zeta_time'}.units = ncchar('day'); -nc{'zeta_time'}.units = 'day'; -nc{'zeta_time'}.calendar = ncchar('360.0 days in every year'); -nc{'zeta_time'}.calendar = '360.0 days in every year'; -nc{'zeta_time'}.cycle_length = cycle; +write_time_attributes(nc,'zeta_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'temp'}.long_name = ncchar('potential temperature'); nc{'temp'}.long_name = 'potential temperature'; @@ -412,52 +394,40 @@ nc.history = history; % Set S-Curves in domain [-1 < sc < 0] at vertical W- and RHO-points. % [s_rho,Cs_rho,s_w,Cs_w] = scoordinate(theta_s,theta_b,N,hc,vtransform); -%disp(['vtransform=',num2str(vtransform)]) - -% cff1=1./sinh(theta_s); -% cff2=0.5/tanh(0.5*theta_s); -% s_rho=((1:N)-N-0.5)/N; -% Cs_rho=(1.-theta_b)*cff1*sinh(theta_s*s_rho)... -% +theta_b*(cff2*tanh(theta_s*(s_rho+0.5))-0.5); -% s_w=((0:N)-N)/N; -% Cs_w=(1.-theta_b)*cff1*sinh(theta_s*s_w)... -% +theta_b*(cff2*tanh(theta_s*(s_w+0.5))-0.5); - - % % Write variables % nc{'spherical'}(:)='T'; nc{'Vtransform'}(:)=vtransform; nc{'Vstretching'}(:)=1; -nc{'tstart'}(:) = min([min(time) min(time) min(time)]); -nc{'tend'}(:) = max([max(time) max(time) max(time)]); -nc{'theta_s'}(:) = theta_s; -nc{'theta_b'}(:) = theta_b; -nc{'Tcline'}(:) = hc; -nc{'hc'}(:) = hc; +nc{'tstart'}(:) = min([min(time) min(time) min(time)]); +nc{'tend'}(:) = max([max(time) max(time) max(time)]); +nc{'theta_s'}(:) = theta_s; +nc{'theta_b'}(:) = theta_b; +nc{'Tcline'}(:) = hc; +nc{'hc'}(:) = hc; nc{'s_rho'}(:) = s_rho; nc{'s_w'}(:) = s_w; -nc{'Cs_rho'}(:) = Cs_rho; +nc{'Cs_rho'}(:) = Cs_rho; nc{'Cs_w'}(:) = Cs_w; -nc{'tclm_time'}(:) = time; -nc{'temp_time'}(:) = time; -nc{'sclm_time'}(:) = time; -nc{'salt_time'}(:) = time; -nc{'uclm_time'}(:) = time; -nc{'vclm_time'}(:) = time; -nc{'v2d_time'}(:) = time; -nc{'v3d_time'}(:) = time; +nc{'tclm_time'}(:) = time; +nc{'temp_time'}(:) = time; +nc{'sclm_time'}(:) = time; +nc{'salt_time'}(:) = time; +nc{'uclm_time'}(:) = time; +nc{'vclm_time'}(:) = time; +nc{'v2d_time'}(:) = time; +nc{'v3d_time'}(:) = time; nc{'ssh_time'}(:) = time; nc{'zeta_time'}(:) = time; -nc{'u'}(:) = 0; -nc{'v'}(:) = 0; -nc{'ubar'}(:) = 0; -nc{'vbar'}(:) = 0; -nc{'SSH'}(:) = 0; -nc{'zeta'}(:) = 0; -nc{'temp'}(:) = 0; -nc{'salt'}(:) = 0; +nc{'u'}(:) = 0; +nc{'v'}(:) = 0; +nc{'ubar'}(:) = 0; +nc{'vbar'}(:) = 0; +nc{'SSH'}(:) = 0; +nc{'zeta'}(:) = 0; +nc{'temp'}(:) = 0; +nc{'salt'}(:) = 0; close(nc) return diff --git a/Preprocessing_tools/create_forcing.m b/Preprocessing_tools/create_forcing.m index 624c2de9..f56963d0 100644 --- a/Preprocessing_tools/create_forcing.m +++ b/Preprocessing_tools/create_forcing.m @@ -1,6 +1,6 @@ function create_forcing(frcname,grdname,title,smst,... shft,swft,srft,sstt,ssst,smsc,... - shfc,swfc,srfc,sstc,sssc) + shfc,swfc,srfc,sstc,sssc, Yorig) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Create an empty netcdf forcing file @@ -38,7 +38,18 @@ M=length(nc('eta_psi')); close(nc); Lp=L+1; Mp=M+1; - +% +% options for write_time_attributes +insecond = 0; +add_cycle = 1 ; +% +% Initialize Yorig if not provided +if ~exist('Yorig', 'var') , Yorig = [] ; , end +% +% Get time attributes +[time_unit_att,time_second_unit_att,calendar_att]=... + get_time_attributes(Yorig); +% nw = netcdf(frcname, 'clobber'); %result = redef(nw); @@ -67,52 +78,44 @@ nw('wwv_time') = length(smst); nw{'sms_time'} = ncdouble('sms_time'); nw{'sms_time'}.long_name = ncchar('surface momentum stress time'); nw{'sms_time'}.long_name = 'surface momentum stress time'; -nw{'sms_time'}.units = ncchar('days'); -nw{'sms_time'}.units = 'days'; -nw{'sms_time'}.cycle_length = smsc; +write_time_attributes(nc,'sms_time',smsc,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); nw{'shf_time'} = ncdouble('shf_time'); nw{'shf_time'}.long_name = ncchar('surface heat flux time'); nw{'shf_time'}.long_name = 'surface heat flux time'; -nw{'shf_time'}.units = ncchar('days'); -nw{'shf_time'}.units = 'days'; -nw{'shf_time'}.cycle_length =shfc ; +write_time_attributes(nc,'shf_time',shfc,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); nw{'swf_time'} = ncdouble('swf_time'); nw{'swf_time'}.long_name = ncchar('surface freshwater flux time'); nw{'swf_time'}.long_name = 'surface freshwater flux time'; -nw{'swf_time'}.units = ncchar('days'); -nw{'swf_time'}.units = 'days'; -nw{'swf_time'}.cycle_length = swfc; +write_time_attributes(nc,'swf_time',swfc,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); nw{'sst_time'} = ncdouble('sst_time'); nw{'sst_time'}.long_name = ncchar('sea surface temperature time'); nw{'sst_time'}.long_name = 'sea surface temperature time'; -nw{'sst_time'}.units = ncchar('days'); -nw{'sst_time'}.units = 'days'; -nw{'sst_time'}.cycle_length = sstc; +write_time_attributes(nc,'sst_time',sstc,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); nw{'sss_time'} = ncdouble('sss_time'); nw{'sss_time'}.long_name = ncchar('sea surface salinity time'); nw{'sss_time'}.long_name = 'sea surface salinity time'; -nw{'sss_time'}.units = ncchar('days'); -nw{'sss_time'}.units = 'days'; -nw{'sss_time'}.cycle_length = sssc; +write_time_attributes(nc,'sss_time',sssc,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); nw{'srf_time'} = ncdouble('srf_time'); nw{'srf_time'}.long_name = ncchar('solar shortwave radiation time'); nw{'srf_time'}.long_name = 'solar shortwave radiation time'; -nw{'srf_time'}.units = ncchar('days'); -nw{'srf_time'}.units = 'days'; -nw{'srf_time'}.cycle_length = srfc; +write_time_attributes(nc,'srf_time',srfc,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); nw{'wwv_time'} = ncdouble('wwv_time'); nw{'wwv_time'}.long_name = ncchar('surface wave fields time'); nw{'wwv_time'}.long_name = 'surface wave fields time'; -nw{'wwv_time'}.units = ncchar('days'); -nw{'wwv_time'}.units = 'days'; -nw{'wwv_time'}.cycle_length = smsc; - +write_time_attributes(nc,'wwv_time',smsc,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); nw{'sustr'} = ncdouble('sms_time', 'eta_u', 'xi_u'); nw{'sustr'}.long_name = ncchar('surface u-momentum stress'); diff --git a/Preprocessing_tools/create_inifile.m b/Preprocessing_tools/create_inifile.m index acdc9abc..265bb410 100644 --- a/Preprocessing_tools/create_inifile.m +++ b/Preprocessing_tools/create_inifile.m @@ -1,5 +1,6 @@ function create_inifile(inifile,gridfile,title,... - theta_s,theta_b,hc,N,time,clobber,vtransform) + theta_s,theta_b,hc,N,time,clobber,vtransform,... + Yorig) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % function nc=create_inifile(inifile,gridfile,theta_s,... @@ -53,12 +54,24 @@ function create_inifile(inifile,gridfile,title,... %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% disp(' ') disp([' Creating the file : ',inifile]) + if nargin < 10 disp([' NO VTRANSFORM parameter found']) disp([' USE TRANSFORM default value vtransform = 1']) vtransform = 1; + disp([' VTRANSFORM = ',num2str(vtransform)]) end -disp([' VTRANSFORM = ',num2str(vtransform)]) +% +% options for write_time_attributes +insecond = 1 ; +add_cycle = 0 ; +% +% Initialize Yorig if not provided +if ~exist('Yorig', 'var') , Yorig = []; , end +% +% Get time attributes +[time_unit_att,time_second_unit_att,calendar_att]=... + get_time_attributes(Yorig); % % Read the grid file % @@ -131,13 +144,13 @@ nc{'Vstretching'}.long_name = 'vertical terrain-following stretching function'; % nc{'tstart'}.long_name = ncchar('start processing day'); nc{'tstart'}.long_name = 'start processing day'; -nc{'tstart'}.units = ncchar('day'); -nc{'tstart'}.units = 'day'; +write_time_attributes(nc,'tstart','',time_unit_att,time_second_unit_att,... + calendar_att,0,0); % nc{'tend'}.long_name = ncchar('end processing day'); nc{'tend'}.long_name = 'end processing day'; -nc{'tend'}.units = ncchar('day'); -nc{'tend'}.units = 'day'; +write_time_attributes(nc,'tend','',time_unit_att,time_second_unit_att,... + calendar_att,0,0); % nc{'theta_s'}.long_name = ncchar('S-coordinate surface control parameter'); nc{'theta_s'}.long_name = 'S-coordinate surface control parameter'; @@ -175,13 +188,13 @@ nc{'Cs_rho'}.valid_max = 0; % nc{'ocean_time'}.long_name = ncchar('time since initialization'); nc{'ocean_time'}.long_name = 'time since initialization'; -nc{'ocean_time'}.units = ncchar('second'); -nc{'ocean_time'}.units = 'second'; -% +write_time_attributes(nc,'ocean_time','',time_unit_att,time_second_unit_att,... + calendar_att,1,0); + nc{'scrum_time'}.long_name = ncchar('time since initialization'); nc{'scrum_time'}.long_name = 'time since initialization'; -nc{'scrum_time'}.units = ncchar('second'); -nc{'scrum_time'}.units = 'second'; +write_time_attributes(nc,'scrum_time','',time_unit_att,time_second_unit_att,... + calendar_att,1,0); % nc{'u'}.long_name = ncchar('u-momentum component'); nc{'u'}.long_name = 'u-momentum component'; diff --git a/Preprocessing_tools/create_oafile.m b/Preprocessing_tools/create_oafile.m index 875e1cd8..7b765817 100644 --- a/Preprocessing_tools/create_oafile.m +++ b/Preprocessing_tools/create_oafile.m @@ -1,5 +1,5 @@ function create_oafile(oaname,grdname,title,Z,... - time,cycle,clobber); + time,cycle,clobber,Yorig); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % function nc=create_oafile(oaname,grdname,title,Z,... @@ -49,6 +49,18 @@ disp(' ') disp([' Creating the file : ',oaname]) disp(' ') % +% options for write_time_attributes +insecond = 0; +add_cycle = 1 ; +% +% Initialize Yorig if not provided +if ~exist('Yorig', 'var') , Yorig = [] ; , end +% +% Get time attributes +[time_unit_att,time_second_unit_att,calendar_att]=... + get_time_attributes(Yorig); +% +% % Read the grid file % nc = netcdf(grdname, 'nowrite'); @@ -153,51 +165,43 @@ nc{'Z'}.units = 'm'; % nc{'tclm_time'}.long_name = ncchar('time for temperature climatology'); nc{'tclm_time'}.long_name = 'time for temperature climatology'; -nc{'tclm_time'}.units = ncchar('day'); -nc{'tclm_time'}.units = 'day'; -nc{'tclm_time'}.cycle_length = cycle; +write_time_attributes(nc,'tclm_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'sclm_time'}.long_name = ncchar('time for salinity climatology'); nc{'sclm_time'}.long_name = 'time for salinity climatology'; -nc{'sclm_time'}.units = ncchar('day'); -nc{'sclm_time'}.units = 'day'; -nc{'sclm_time'}.cycle_length = cycle; +write_time_attributes(nc,'sclm_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'uclm_time'}.long_name = ncchar('time for u climatology'); nc{'uclm_time'}.long_name = 'time for u climatology'; -nc{'uclm_time'}.units = ncchar('day'); -nc{'uclm_time'}.units = 'day'; -nc{'uclm_time'}.cycle_length = cycle; +write_time_attributes(nc,'uclm_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'vclm_time'}.long_name = ncchar('time for v climatology'); nc{'vclm_time'}.long_name = 'time for v climatology'; -nc{'vclm_time'}.units = ncchar('day'); -nc{'vclm_time'}.units = 'day'; -nc{'vclm_time'}.cycle_length = cycle; +write_time_attributes(nc,'vclm_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'v2d_time'}.long_name = ncchar('time for 2D velocity climatology'); nc{'v2d_time'}.long_name = 'time for 2D velocity climatology'; -nc{'v2d_time'}.units = ncchar('day'); -nc{'v2d_time'}.units = 'day'; -nc{'v2d_time'}.cycle_length = cycle; +write_time_attributes(nc,'v2d_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'v3d_time'}.long_name = ncchar('time for 3D velocity climatology'); nc{'v3d_time'}.long_name = 'time for 3D velocity climatology'; -nc{'v3d_time'}.units = ncchar('day'); -nc{'v3d_time'}.units = 'day'; -nc{'v3d_time'}.cycle_length = cycle; +write_time_attributes(nc,'v3d_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'ssh_time'}.long_name = ncchar('time for sea surface height'); nc{'ssh_time'}.long_name = 'time for sea surface height'; -nc{'ssh_time'}.units = ncchar('day'); -nc{'ssh_time'}.units = 'day'; -nc{'ssh_time'}.cycle_length = cycle; +write_time_attributes(nc,'ssh_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'zeta_time'}.long_name = ncchar('time for zeta climatology'); nc{'zeta_time'}.long_name = 'time for zeta climatology'; -nc{'zeta_time'}.units = ncchar('day'); -nc{'zeta_time'}.units = 'day'; -nc{'zeta_time'}.cycle_length = cycle; +write_time_attributes(nc,'zeta_time',cycle,time_unit_att,time_second_unit_att,... + calendar_att,insecond,add_cycle); % nc{'temp'}.long_name = ncchar('potential temperature'); nc{'temp'}.long_name = 'potential temperature'; diff --git a/Preprocessing_tools/get_time_attributes.m b/Preprocessing_tools/get_time_attributes.m new file mode 100644 index 00000000..5d1ca468 --- /dev/null +++ b/Preprocessing_tools/get_time_attributes.m @@ -0,0 +1,29 @@ +function [time_unit_att, time_second_unit_att, calendar_att] = ... + get_time_attributes(Yorig) ; + + % GET_TIME_ATTRIBUTES Get time and calendar attributes for CROCO NetCDF files + % + % Inputs: + % Yorig - Reference year (optional) for time origin + % + % Outputs: + % time_unit_att - Time unit attribute string + % calendar_att - Calendar type attribute string + + % Initialize default values + time_unit_att = 'days'; + time_second_unit_att = 'seconds'; + calendar_att = 'none'; + + % Check if valid Yorig is provided + % if nargin >= 1 && ~isempty(Yorig) + if ~isempty(Yorig) + disp([' Time reference is ', sprintf('%04d', Yorig), '-01-01 00:00:00']) + time_unit_att = ['days since ', sprintf('%04d', Yorig), '-01-01 00:00:00']; + time_second_unit_att = ['seconds since ',sprintf('%04d', Yorig),'-01-01 00:00:00']; + calendar_att = 'proleptic_gregorian'; + else + disp(' No time reference') + end + +end \ No newline at end of file diff --git a/Preprocessing_tools/make_bry.m b/Preprocessing_tools/make_bry.m index 92b8dfa4..709a88e3 100644 --- a/Preprocessing_tools/make_bry.m +++ b/Preprocessing_tools/make_bry.m @@ -60,10 +60,10 @@ crocotools_param % salt_month_data : monthly salinity climatology % salt_ann_data : annual salinity climatology % -temp_month_data=[climato_dir,'temp_month.cdf'] -temp_ann_data=[climato_dir,'temp_ann.cdf'] -salt_month_data=[climato_dir,'salt_month.cdf'] -salt_ann_data=[climato_dir,'salt_ann.cdf'] +temp_month_data=[climato_dir,'temp_month.cdf']; +temp_ann_data=[climato_dir,'temp_ann.cdf']; +salt_month_data=[climato_dir,'salt_month.cdf']; +salt_ann_data=[climato_dir,'salt_ann.cdf']; % % %%%%%%%%%%%%%%%%%%% END USERS DEFINED VARIABLES %%%%%%%%%%%%%%%%%%%%%%% diff --git a/Preprocessing_tools/make_clim.m b/Preprocessing_tools/make_clim.m index daf515f5..6709dd1f 100644 --- a/Preprocessing_tools/make_clim.m +++ b/Preprocessing_tools/make_clim.m @@ -169,29 +169,29 @@ end -%---------------------------------------------------------------------------- -% Initial file -%---------------------------------------------------------------------------- -if (makeini) - - disp('======================== ') - disp('Initial') - create_inifile(ininame,grdname,CROCO_title,... - theta_s,theta_b,hc,N,... - tini,'clobber',vtransform); - disp(' ') - disp(' Temperature...') - vinterp_clm(ininame,grdname,oaname,'temp','tclm_time','Z',tini,'r',1); - disp(' ') - disp(' Salinity...') - vinterp_clm(ininame,grdname,oaname,'salt','sclm_time','Z',tini,'r',1); - if (insitu2pot) - disp(' ') - disp(' Compute potential temperature from in-situ...') - getpot(ininame,grdname) - end - -end +% %---------------------------------------------------------------------------- +% % Initial file +% %---------------------------------------------------------------------------- +% if (makeini) + +% disp('======================== ') +% disp('Initial') +% create_inifile(ininame,grdname,CROCO_title,... +% theta_s,theta_b,hc,N,... +% tini,'clobber',vtransform); +% disp(' ') +% disp(' Temperature...') +% vinterp_clm(ininame,grdname,oaname,'temp','tclm_time','Z',tini,'r',1); +% disp(' ') +% disp(' Salinity...') +% vinterp_clm(ininame,grdname,oaname,'salt','sclm_time','Z',tini,'r',1); +% if (insitu2pot) +% disp(' ') +% disp(' Compute potential temperature from in-situ...') +% getpot(ininame,grdname) +% end + +% end diff --git a/Preprocessing_tools/nc_add_globatt.m b/Preprocessing_tools/nc_add_globatt.m index 1b244761..67d800c6 100644 --- a/Preprocessing_tools/nc_add_globatt.m +++ b/Preprocessing_tools/nc_add_globatt.m @@ -30,7 +30,9 @@ if nargin < 8 product = 'unknown' end % -origin_date = datestr(datenum(Yorig,Mmin,Dmin,Hmin,Min_min,Smin),0); +%origin_date = datestr(datenum(Yorig,Mmin,Dmin,Hmin,Min_min,Smin),0); +origin_date = char(datetime(Yorig,Mmin,Dmin,Hmin,Min_min,Smin, 'Format', 'yyyy-MM-dd HH:mm:ss')); + % nc=netcdf(filename,'write'); nc.origin_date = origin_date; diff --git a/Preprocessing_tools/vinterp_bry.m b/Preprocessing_tools/vinterp_bry.m index de614f7d..3606af22 100644 --- a/Preprocessing_tools/vinterp_bry.m +++ b/Preprocessing_tools/vinterp_bry.m @@ -3,10 +3,10 @@ function vinterp_bry(bryname,grdname,Zbryname,vname,obcndx) % % Vertical interpolation from a Z-grid to a sigma-grid in the % case of boundary (bry) files. -% -% Further Information: +% +% Further Information: % http://www.croco-ocean.org -% +% % This file is part of CROCOTOOLS % % CROCOTOOLS is free software; you can redistribute it and/or modify @@ -24,13 +24,13 @@ function vinterp_bry(bryname,grdname,Zbryname,vname,obcndx) % Foundation, Inc., 59 Temple Place, Suite 330, Boston, % MA 02111-1307 USA % -% Copyright (c) 2005-2006 by Pierrick Penven -% e-mail:Pierrick.Penven@ird.fr +% Copyright (c) 2005-2006 by Pierrick Penven +% e-mail:Pierrick.Penven@ird.fr % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % -% open the grid file -% +% open the grid file +% ng=netcdf(grdname,'r'); L=length(ng('xi_rho')); M=length(ng('eta_rho')); @@ -45,8 +45,8 @@ elseif obcndx==4 end close(ng); % -% open the boundary file -% +% open the boundary file +% nc=netcdf(bryname,'write'); theta_s = nc{'theta_s'}(:); theta_b = nc{'theta_b'}(:); @@ -54,14 +54,14 @@ hc = nc{'hc'}(:); N = length(nc('s_rho')); vtransform = nc{'Vtransform'}(:); if ~exist('vtransform') - vtransform=1; %Old Vtransform - disp([' NO VTRANSFORM parameter found']) - disp([' USE VTRANSFORM default value vtransform = 1']) + vtransform=1; %Old Vtransform + disp([' NO VTRANSFORM parameter found']) + disp([' USE VTRANSFORM default value vtransform = 1']) end % -% open the oa file -% - noa=netcdf(Zbryname,'r'); +% open the oa file +% +noa=netcdf(Zbryname,'r'); z=-noa{'Z'}(:); t=noa{'bry_time'}(:); tlen=length(t); @@ -73,16 +73,16 @@ zcroco=squeeze(zlevs(h,0.*h,theta_s,theta_b,hc,N,'r',vtransform)); zmin=min(min(zcroco)); zmax=max(max(zcroco)); % -% Check if the min z level is below the min sigma level +% Check if the min z level is below the min sigma level % (if not add a deep layer) % addsurf=max(z)<zmax; addbot=min(z)>zmin; if addsurf - z=[100;z]; + z=[100;z]; end if addbot - z=[z;-100000]; + z=[z;-100000]; end Nz=min(find(z<zmin)); z=z(1:Nz); @@ -90,10 +90,9 @@ z=z(1:Nz); % loop on time % for l=1:tlen -%for l=1:1 -% disp([' Time index: ',num2str(l),' of total: ',num2str(tlen)]) + %for l=1:1 + disp([' Time index: ',num2str(l),' of total: ',num2str(tlen)]) var=squeeze(noa{vname}(l,:,:)); -% disp(['SIZE VAR=',num2str(size(var))]) if addsurf var=cat(1,var(1,:,:),var); end @@ -105,27 +104,4 @@ for l=1:tlen end close(nc); close(noa); - - -%DEBUG -% -%size(var) -%var -% -%size(flipdim(var,1)) -%flipdim(var,1) -% -%size(z) -%z -% -%size(flipud(z)) -%flipud(z) -% -%size(zcroco) -%zcroco -% -%size(ztosigma_1d(flipdim(var,1),zcroco,flipud(z))) -% -% -%% return diff --git a/Preprocessing_tools/write_time_attributes.m b/Preprocessing_tools/write_time_attributes.m new file mode 100644 index 00000000..cdd646b7 --- /dev/null +++ b/Preprocessing_tools/write_time_attributes.m @@ -0,0 +1,29 @@ +function write_time_attributes(nc,time_name,cycle,... + time_unit_att,... + time_second_unit_att, ... + calendar_att, ... + insecond,... + add_cycle) ; + %----------------------------------------------------------------------- + % Inputs: + % time_unit_att : Time unit attribute string, + % used by default for time units + % time_second_unit_att : Time unit attribute string + % calendar_att : Calendar type attribute string + % insecond : optional, switch to have time units in seconds + %----------------------------------------------------------------------- + + nc{time_name}.calendar = calendar_att; + % + if exist('insecond', 'var') && insecond == 1 + nc{time_name}.units = time_second_unit_att; + else + nc{time_name}.units = time_unit_att; + end + % + %Add cycle attribute + if exist('add_cycle', 'var') && add_cycle == 1 + nc{time_name}.cycle_length = cycle ; + end + +end \ No newline at end of file diff --git a/Rivers/create_runoff.m b/Rivers/create_runoff.m index 4cedbe46..878a083b 100644 --- a/Rivers/create_runoff.m +++ b/Rivers/create_runoff.m @@ -1,6 +1,7 @@ function create_runoff(runoffname,grdname,title,... qbart,qbarc,rivername,rivernumber,... - runoffname_StrLen,dir,psource_ncfile_ts,biol,pisces,quota) + runoffname_StrLen,dir,psource_ncfile_ts,... + biol,pisces,quota, Yorig) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Create an empty netcdf runoff file @@ -27,14 +28,25 @@ function create_runoff(runoffname,grdname,title,... % MA 02111-1307 USA % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +timeref = 1 ; +if nargin < 14 + disp([' Yorig parameter found']) + disp([' No time reference']) + timeref = 0 ; +end +if timeref == 1 + time_unit_att = ['days since ',sprintf('%04d', Yorig),'-01-01 00:00:00']; + calendar_att = 'proleptic_gregorian' ; +else + time_unit_att = ['days']; + calendar_att = 'climatological year' ; +end +% nw=netcdf(runoffname,'clobber'); %%%result = redef(nw); - - % % Create dimensions % - nw('qbar_time') = length(qbart); nw('n_qbar') = rivernumber; nw('runoffname_StrLen') = runoffname_StrLen; @@ -45,18 +57,21 @@ nw('two') = 2; % nw{'qbar_time'} = ncdouble('qbar_time'); nw{'qbar_time'}.long_name = ncchar('runoff time'); -nw{'qbar_time'}.units = ncchar('days'); +nw{'qbar_time'}.units = ncchar(time_unit_att); +nw{'qbar_time'}.calendar = calendar_att; nw{'qbar_time'}.cycle_length = qbarc; if psource_ncfile_ts nw{'temp_src_time'} = ncdouble('qbar_time'); nw{'temp_src_time'}.long_name = ncchar('runoff time'); - nw{'temp_src_time'}.units = ncchar('days'); + nw{'temp_src_time'}.units = ncchar(time_unit_att); + nw{'temp_src_time'}.calendar = calendar_att; nw{'temp_src_time'}.cycle_length = qbarc; nw{'salt_src_time'} = ncdouble('qbar_time'); nw{'salt_src_time'}.long_name = ncchar('runoff time'); - nw{'salt_src_time'}.units = ncchar('days'); + nw{'salt_src_time'}.units = ncchar(time_unit_att); + nw{'salt_src_time'}.calendar = calendar_att; nw{'salt_src_time'}.cycle_length = qbarc; end nw{'runoff_name'} = ncchar('n_qbar','runoffname_StrLen'); @@ -86,7 +101,8 @@ if psource_ncfile_ts if biol nw{'no3_src_time'} = ncdouble('qbar_time'); nw{'no3_src_time'}.long_name = ncchar('runoff time'); - nw{'no3_src_time'}.units = ncchar('days'); + nw{'no3_src_time'}.units = ncchar(time_unit_att); + nw{'no3_src_time'}.calendar = calendar_att; nw{'no3_src_time'}.cycle_length = 360; nw{'NO3_src'} = ncdouble('n_qbar','qbar_time'); @@ -95,7 +111,8 @@ if psource_ncfile_ts if pisces nw{'po4_src_time'} = ncdouble('qbar_time'); nw{'po4_src_time'}.long_name = ncchar('runoff time'); - nw{'po4_src_time'}.units = ncchar('days'); + nw{'po4_src_time'}.units = ncchar(time_unit_att); + nw{'po4_src_time'}.calendar = calendar_att; nw{'po4_src_time'}.cycle_length = 360; nw{'PO4_src'} = ncdouble('n_qbar','qbar_time'); @@ -104,7 +121,8 @@ if psource_ncfile_ts nw{'si_src_time'} = ncdouble('qbar_time'); nw{'si_src_time'}.long_name = ncchar('runoff time'); - nw{'si_src_time'}.units = ncchar('days'); + nw{'si_src_time'}.units = ncchar(time_unit_att); + nw{'si_src_time'}.calendar = calendar_att; nw{'si_src_time'}.cycle_length = 360; nw{'Si_src'} = ncdouble('n_qbar','qbar_time'); @@ -113,7 +131,8 @@ if psource_ncfile_ts nw{'dic_src_time'} = ncdouble('qbar_time'); nw{'dic_src_time'}.long_name = ncchar('runoff time'); - nw{'dic_src_time'}.units = ncchar('days'); + nw{'dic_src_time'}.units = ncchar(time_unit_att); + nw{'dic_src_time'}.calendar = calendar_att; nw{'dic_src_time'}.cycle_length = 360; nw{'DIC_src'} = ncdouble('n_qbar','qbar_time'); @@ -122,7 +141,8 @@ if psource_ncfile_ts nw{'doc_src_time'} = ncdouble('qbar_time'); nw{'doc_src_time'}.long_name = ncchar('runoff time'); - nw{'doc_src_time'}.units = ncchar('days'); + nw{'doc_src_time'}.units = ncchar(time_unit_att); + nw{'doc_src_time'}.calendar = calendar_att; nw{'doc_src_time'}.cycle_length = 360; nw{'DOC_src'} = ncdouble('n_qbar','qbar_time'); @@ -131,7 +151,8 @@ if psource_ncfile_ts nw{'talk_src_time'} = ncdouble('qbar_time'); nw{'talk_src_time'}.long_name = ncchar('runoff time'); - nw{'talk_src_time'}.units = ncchar('days'); + nw{'talk_src_time'}.units = ncchar(time_unit_att); + nw{'talk_src_time'}.calendar = calendar_att; nw{'talk_src_time'}.cycle_length = 360; nw{'TALK_src'} = ncdouble('n_qbar','qbar_time'); @@ -140,7 +161,8 @@ if psource_ncfile_ts if quota nw{'don_src_time'} = ncdouble('qbar_time'); nw{'don_src_time'}.long_name = ncchar('runoff time'); - nw{'don_src_time'}.units = ncchar('days'); + nw{'don_src_time'}.units = ncchar(time_unit_att); + nw{'don_src_time'}.calendar = calendar_att; nw{'don_src_time'}.cycle_length = 360; nw{'DON_src'} = ncdouble('n_qbar','qbar_time'); @@ -149,7 +171,8 @@ if psource_ncfile_ts nw{'dop_src_time'} = ncdouble('qbar_time'); nw{'dop_src_time'}.long_name = ncchar('runoff time'); - nw{'dop_src_time'}.units = ncchar('days'); + nw{'dop_src_time'}.units = ncchar(time_unit_att); + nw{'dop_src_time'}.calendar = calendar_att; nw{'dop_src_time'}.cycle_length = 360; nw{'DOP_src'} = ncdouble('n_qbar','qbar_time'); diff --git a/Rivers/make_runoff.m b/Rivers/make_runoff.m index edef1e76..226b185e 100644 --- a/Rivers/make_runoff.m +++ b/Rivers/make_runoff.m @@ -104,7 +104,7 @@ plotting_zoom=0; % %========================================================================================= % Add biogeochemical variables -if (makenpzd | makepisces | makebioebus | makequota) makebio = 1; +if (makenpzd | makepisces | makebioebus | makequota) makebio = 1; else makebio = 0; end @@ -390,7 +390,9 @@ else disp(' Create the runoff file...') create_runoff(rivname,grdname,title_name,... qbar_time,qbar_cycle, ... - rivername,number_rivertoprocess,rivname_StrLen,dir,psource_ncfile_ts,makebio,makepisces,makequota) + rivername,number_rivertoprocess,... + rivname_StrLen,dir,psource_ncfile_ts,... + makebio,makepisces,makequota) %% %% Adjust the rivers positions relative to the mask %% diff --git a/crocotools_param.m b/crocotools_param.m index 8b310ce1..e1a593e8 100644 --- a/crocotools_param.m +++ b/crocotools_param.m @@ -490,6 +490,9 @@ end rmdepth = 2; % % Overlap parameters : nb of records around each sequence +% => for SODA put itolap_a = itolap_p = 1 +% => for mercator daily put itolap_a = itolap_p = 2 +% (due to date of the month first day of month) % itolap_a = 1; % before itolap_p = 1; % after diff --git a/oct_start.m b/oct_start.m index d16ae96d..5fb8b9ed 100644 --- a/oct_start.m +++ b/oct_start.m @@ -59,6 +59,7 @@ addpath([tools_path,'Forecast_tools']) addpath([tools_path,'Nesting_tools']) addpath([tools_path,'Preprocessing_tools']) addpath([tools_path,'Preprocessing_tools/Bio']) +addpath([tools_path,'Preprocessing_tools/Bio/npzd-bioebus']) addpath([tools_path,'Oforc_OGCM']) addpath([tools_path,'Tides']) addpath([tools_path,'Tides/T_TIDE']) diff --git a/start.m b/start.m index 52509619..df81a16a 100644 --- a/start.m +++ b/start.m @@ -55,6 +55,7 @@ addpath([tools_path,'Forecast_tools']) addpath([tools_path,'Nesting_tools']) addpath([tools_path,'Preprocessing_tools']) addpath([tools_path,'Preprocessing_tools/Bio']) +addpath([tools_path,'Preprocessing_tools/Bio/npzd-bioebus']) addpath([tools_path,'Oforc_OGCM']) addpath([tools_path,'Tides']) addpath([tools_path,'Tides/T_TIDE']) -- GitLab