New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
ticket/0681 – NEMO
wiki:ticket/0681

Version 8 (modified by djlea, 13 years ago) (diff)

--

Last edited Timestamp?


Author : Daniel Lea (representing the NEMOVAR team)

ticket : #681

Branches : Two branches dev_1784_ASM and dev_1784_OBS


Description

The ASM branch adds the functionality to apply increments to model variables, temperature, salinity, SSH and velocity, read into the model from a file which may be produced by data assimilation. This code is controlled by the namelist nam_asminc. There is a brief description of all the namelist options provided. To build the ASM code key_asminc must be set.

The OBS branch is a diagnostic branch which reads in observation files (profile temperature and salinity, sea surface temperature and sea level anomaly) and calculates the model equivalent value at the observation location. This information along with the observation value is output into a "feedback" file. This can be used for model validation and verification and also to provide information for data assimilation. This code is controlled by the namelist nam_obs. See section "system changes". There is a brief description of all the namelist options provided. To build the OBS code key_diaobs must be set.

See section "system changes" for example namelists and headers from example observation files.


Testing

Testing could consider (where appropriate) other configurations in addition to NVTK].

NVTK Tested Not yet although a similar ORCA2 test within the Met Office see below for description
Other model configurations YES ORCA025
Processor configurations tested ORCA2: 1 (1x1), 2 (1x2), 4 (4x1) and 8 (4x2) processors ORCA025: 128 proc (16 x 8)
If adding new functionality please confirm that the
New code doesn't change results when it is switched off
and ''works'' when switched on
YES for both (see below)

'Please add further summary details here'

Several tests in orca2 configuration were performed. Each run was a 2 day run using climatological fluxes.

  1. Run with the NEMO trunk at vn3.2
  2. Run with the OBS and ASM branches included but without key_diaobs or key_asminc
  3. Run with the OBS and ASM branches included but with both key_diaobs and key_asminc set and with the namobs and nam_asminc namelists included but everything set to false
  4. Run with the OBS and ASM branches with sample observations and the observation operator turned on
  5. Run with the OBS and ASM branches with sample observations and a sample increments files with the observation operator and assimilation increments code turned on in the namelist

Tests 1, 2, 3 and 4 all produce identical restart files at the end of the run. Test 5 produces a restart file which differs from the previous tests by approximately the same amount as the change specified in the increments file. This shows that the change has no impact on the rest of the model except if we decide we wish to apply increments to the model fields. Tests 4 and 5 were run in 1x1, 1x2, 4x1 and 4x2 processor configuration with bit comparison turned on. The model fields bit compare with all these runs. The observation feedback files are also identical.

Bit Comparability

Does this change preserve answers in your tested standard configurations (to the last bit) ? YES
Does this change bit compare across various processor configurations. (1xM, Nx1 and MxN are recommended) YES
Is this change expected to preserve answers in all possible model configurations? YES
Is this change expected to preserve all diagnostics?
,,''Preserving answers in model runs does not necessarily imply preserved diagnostics. ''
YES

If you answered '''NO''' to any of the above, please provide further details:

Cannot test bit comparison because the NEMO base code does not bit compare on our systems. However, the observation operator will have no effect on the model bit comparison (since this does not feedback into the model fields). Applying increments may not bit compare.

  • Which routine(s) are causing the difference?
  • Why the changes are not protected by a logical switch or new section-version
  • What is needed to achieve regression with the previous model release (e.g. a regression branch, hand-edits etc). If this is not possible, explain why not.
  • What do you expect to see occur in the test harness jobs?
  • Which diagnostics have you altered and why have they changed?Please add details here........

System Changes

Does your change alter namelists? YES
Does your change require a change in compiler options? NO (unless you wish to turn it on when key_diaobs and key_asminc must be set)

If any of these apply, please document the changes required here.......

Namelist changes required if key_diaobs and key_asminc are set

!-----------------------------------------------------------------------
!       namobs    observation usage switch
!-----------------------------------------------------------------------
!
!  ln_t3d                  Logical switch for T profile observations         
!  ln_s3d                  Logical switch for S profile observations          
!  ln_ena                  Logical switch for ENACT insitu data set           
!  ln_cor                  Logical switch for Coriolis insitu data set       
!  ln_profb                Logical switch for feedback insitu data set     
!  ln_sla                  Logical switch for SLA observations               
!  ln_sladt                Logical switch for AVISO SLA data              
!  ln_slafb                Logical switch for feedback SLA data            
!  ln_ssh                  Logical switch for SSH observations              
!  ln_sst                  Logical switch for SST observations              
!  ln_reysst               Logical switch for Reynolds observations       
!  ln_ghrsst               Logical switch for GHRSST observations          
!  ln_sstfb                Logical switch for feedback SST data          
!  ln_sss                  Logical switch for SSS observations              
!  ln_seaice               Logical switch for Sea Ice observations        
!  ln_vel3d                Logical switch for velocity observations         
!  ln_velavcur             Logical switch for velocity daily av. cur.    
!  ln_velhrcur             Logical switch for velocity high freq. cur.   
!  ln_velavadcp            Logical switch for velocity daily av. ADCP  
!  ln_velhradcp            Logical switch for velocity high freq. ADCP
!  ln_velfb                Logical switch for feedback velocity data       
!  ln_grid_global          Global distribtion of observations         
!  ln_grid_search_lookup   Logical switch for obs grid search w/lookup table  
!  grid_search_file        Grid search lookup file header 
!  enactfiles              ENACT input observation file names 
!  coriofiles              Coriolis input observation file name  
!  profbfiles              Profile feedback input observation file name 
!  ln_profb_enatim         Enact feedback input time setting switch    
!  slafilesact             Active SLA input observation file name
!  slafilespas             Passive SLA input observation file name 
!  slafbfiles              Feedback SLA input observation file name 
!  sstfiles                GHRSST input observation file name       
!  sstfbfiles              Feedback SST input observation file name 
!  seaicefiles             Sea Ice input observation file name 
!  velavcurfiles           Vel. cur. daily av. input file name  
!  velhvcurfiles           Vel. cur. high freq. input file name  
!  velavadcpfiles          Vel. ADCP daily av. input file name    
!  velhvadcpfiles          Vel. ADCP high freq. input file name 
!  velfbfiles              Vel. feedback input observation file name 
!  dobsini                 Initial date in window YYYYMMDD.HHMMSS       
!  dobsend                 Final date in window YYYYMMDD.HHMMSS         
!  n1dint                  Type of vertical interpolation method        
!  n2dint                  Type of horizontal interpolation method       
!  ln_nea                  Rejection of observations near land switch    
!  nmsshc                  MSSH correction scheme                         
!  mdtcorr                 MDT  correction                               
!  mdtcutoff               MDT cutoff for computed correction          
!  ln_altbias              Logical switch for alt bias                
!  ln_ignmis               Logical switch for ignoring missing files   
!  endailyavtypes          ENACT daily average types                    
 &namobs
   ln_t3d = .true.
   ln_s3d = .true.
   ln_ena = .false.
   ln_profb = .true.
   ln_sla = .true.
   ln_sladt = .false.
   ln_slafb = .true.
   ln_sst = .true.
   ln_sstfb = .true.
   profbfiles = 'profiles_01.nc'
   slafbfiles = 'sla_01.nc'
   sstfbfiles = 'sst_01.nc' 'sst_02.nc' 'sst_03.nc' 'sst_04.nc' 'sst_05.nc'
   ln_altbias = .false.
   ln_grid_global = .true.
   ln_grid_search_lookup = .true.
   ln_ignmis = .true.  
/ 
!-----------------------------------------------------------------------
!       nam_asminc    assimilation increments namelist
!-----------------------------------------------------------------------
! ln_bkgwri   Logical switch for writing out background state 
! ln_trjwri   Logical switch for writing out state trajectory
! ln_trainc   Logical switch for applying tracer increments
! ln_dyninc   Logical switch for applying velocity increments
! ln_sshinc   Logical switch for applying SSH increments 
! ln_asmdin   Logical switch for Direct Initialization (DI)
! ln_asmiau   Logical switch for Incremental Analysis Updating (IAU)
! nitbkg      Timestep of background in [0,nitend-nit000-1]
! nitdin      Timestep of background for DI in [0,nitend-nit000-1]
! nitiaustr   Timestep of start of IAU interval in [0,nitend-nit000-1]
! nitiaufin   Timestep of end of IAU interval in [0,nitend-nit000-1]
! niaufn      Type of IAU weighting function
! nittrjfrq   Frequency of trajectory output for 4D-VAR
! ln_salfix   Logical switch for ensuring that the sa > salfixmin
! salfixmin   Minimum salinity after applying the increments
&nam_asminc
    ln_bkgwri = .true.
    ln_trjwri = .false.
    ln_trainc = .false.
    ln_dyninc = .false.
    ln_sshinc = .false.
    ln_asmdin = .false.
    ln_asmiau = .false.
    nitbkg = 0
    nitdin = 0
    nitiaustr = 1
    nitiaufin = 150
    niaufn = 0
    nittrjfrq = 0
    ln_salfix = .false.
    salfixmin = -9999
/

ASM notes

OBS notes

Example profile observation netcdf file header (in the observation "feedback file" format)

netcdf profiles_01 {
dimensions:
	N_OBS = 603 ;
	N_LEVELS = 150 ;
	N_VARS = 2 ;
	N_QCF = 2 ;
	N_ENTRIES = 1 ;
	N_EXTRA = 1 ;
	STRINGNAM = 8 ;
	STRINGGRID = 1 ;
	STRINGWMO = 8 ;
	STRINGTYP = 4 ;
	STRINGJULD = 14 ;
variables:
	char VARIABLES(N_VARS, STRINGNAM) ;
		VARIABLES:long_name = "List of variables in feedback files" ;
	char ENTRIES(N_ENTRIES, STRINGNAM) ;
		ENTRIES:long_name = "List of additional entries for each variable in feedback files" ;
	char EXTRA(N_EXTRA, STRINGNAM) ;
		EXTRA:long_name = "List of extra variables" ;
	char STATION_IDENTIFIER(N_OBS, STRINGWMO) ;
		STATION_IDENTIFIER:long_name = "Station identifier" ;
	char STATION_TYPE(N_OBS, STRINGTYP) ;
		STATION_TYPE:long_name = "Code instrument type" ;
	double LONGITUDE(N_OBS) ;
		LONGITUDE:long_name = "Longitude" ;
		LONGITUDE:units = "degrees_east" ;
		LONGITUDE:_Fillvalue = 99999.f ;
	double LATITUDE(N_OBS) ;
		LATITUDE:long_name = "Latitude" ;
		LATITUDE:units = "degrees_north" ;
		LATITUDE:_Fillvalue = 99999.f ;
	double DEPTH(N_OBS, N_LEVELS) ;
		DEPTH:long_name = "Depth" ;
		DEPTH:units = "metre" ;
		DEPTH:_Fillvalue = 99999.f ;
	int DEPTH_QC(N_OBS, N_LEVELS) ;
		DEPTH_QC:long_name = "Quality on depth" ;
		DEPTH_QC:Conventions = "q where q =[0,9]" ;
		DEPTH_QC:_Fillvalue = 0 ;
	int DEPTH_QC_FLAGS(N_OBS, N_LEVELS, N_QCF) ;
		DEPTH_QC_FLAGS:long_name = "Quality flags on depth" ;
		DEPTH_QC_FLAGS:Conventions = "NEMOVAR flag conventions" ;
	double JULD(N_OBS) ;
		JULD:long_name = "Julian day" ;
		JULD:units = "days since JULD_REFERENCE" ;
		JULD:Conventions = "relative julian days with decimal part (as parts of day)" ;
		JULD:_Fillvalue = 99999.f ;
	char JULD_REFERENCE(STRINGJULD) ;
		JULD_REFERENCE:long_name = "Date of reference for julian days" ;
		JULD_REFERENCE:Conventions = "YYYYMMDDHHMMSS" ;
	int OBSERVATION_QC(N_OBS) ;
		OBSERVATION_QC:long_name = "Quality on observation" ;
		OBSERVATION_QC:Conventions = "q where q =[0,9]" ;
		OBSERVATION_QC:_Fillvalue = 0 ;
	int OBSERVATION_QC_FLAGS(N_OBS, N_QCF) ;
		OBSERVATION_QC_FLAGS:long_name = "Quality flags on observation" ;
		OBSERVATION_QC_FLAGS:Conventions = "NEMOVAR flag conventions" ;
		OBSERVATION_QC_FLAGS:_Fillvalue = 0 ;
	int POSITION_QC(N_OBS) ;
		POSITION_QC:long_name = "Quality on position (latitude and longitude)" ;
		POSITION_QC:Conventions = "q where q =[0,9]" ;
		POSITION_QC:_Fillvalue = 0 ;
	int POSITION_QC_FLAGS(N_OBS, N_QCF) ;
		POSITION_QC_FLAGS:long_name = "Quality flags on position" ;
		POSITION_QC_FLAGS:Conventions = "NEMOVAR flag conventions" ;
		POSITION_QC_FLAGS:_Fillvalue = 0 ;
	int JULD_QC(N_OBS) ;
		JULD_QC:long_name = "Quality on date and time" ;
		JULD_QC:Conventions = "q where q =[0,9]" ;
		JULD_QC:_Fillvalue = 0 ;
	int JULD_QC_FLAGS(N_OBS, N_QCF) ;
		JULD_QC_FLAGS:long_name = "Quality flags on date and time" ;
		JULD_QC_FLAGS:Conventions = "NEMOVAR flag conventions" ;
		JULD_QC_FLAGS:_Fillvalue = 0 ;
	int ORIGINAL_FILE_INDEX(N_OBS) ;
		ORIGINAL_FILE_INDEX:long_name = "Index in original data file" ;
		ORIGINAL_FILE_INDEX:_Fillvalue = -99999 ;
	float POTM_OBS(N_OBS, N_LEVELS) ;
		POTM_OBS:long_name = "Potential temperature" ;
		POTM_OBS:units = "Degrees Celsius" ;
		POTM_OBS:_Fillvalue = 99999.f ;
	float POTM_Hx(N_OBS, N_LEVELS) ;
		POTM_Hx:long_name = "Model interpolated potential temperature" ;
		POTM_Hx:units = "Degrees Celsius" ;
		POTM_Hx:_Fillvalue = 99999.f ;
	int POTM_QC(N_OBS) ;
		POTM_QC:long_name = "Quality on potential temperature" ;
		POTM_QC:Conventions = "q where q =[0,9]" ;
		POTM_QC:_Fillvalue = 0 ;
	int POTM_QC_FLAGS(N_OBS, N_QCF) ;
		POTM_QC_FLAGS:long_name = "Quality flags on potential temperature" ;
		POTM_QC_FLAGS:Conventions = "NEMOVAR flag conventions" ;
		POTM_QC_FLAGS:_Fillvalue = 0 ;
	int POTM_LEVEL_QC(N_OBS, N_LEVELS) ;
		POTM_LEVEL_QC:long_name = "Quality for each level on potential temperature" ;
		POTM_LEVEL_QC:Conventions = "q where q =[0,9]" ;
		POTM_LEVEL_QC:_Fillvalue = 0 ;
	int POTM_LEVEL_QC_FLAGS(N_OBS, N_LEVELS, N_QCF) ;
		POTM_LEVEL_QC_FLAGS:long_name = "Quality flags for each level on potential temperature" ;
		POTM_LEVEL_QC_FLAGS:Conventions = "NEMOVAR flag conventions" ;
		POTM_LEVEL_QC_FLAGS:_Fillvalue = 0 ;
	int POTM_IOBSI(N_OBS) ;
		POTM_IOBSI:long_name = "ORCA grid search I coordinate" ;
	int POTM_IOBSJ(N_OBS) ;
		POTM_IOBSJ:long_name = "ORCA grid search J coordinate" ;
	int POTM_IOBSK(N_OBS, N_LEVELS) ;
		POTM_IOBSK:long_name = "ORCA grid search K coordinate" ;
	char POTM_GRID(STRINGGRID) ;
		POTM_GRID:long_name = "ORCA grid search grid (T,U,V)" ;
	float PSAL_OBS(N_OBS, N_LEVELS) ;
		PSAL_OBS:long_name = "Practical salinity" ;
		PSAL_OBS:units = "PSU" ;
		PSAL_OBS:_Fillvalue = 99999.f ;
	float PSAL_Hx(N_OBS, N_LEVELS) ;
		PSAL_Hx:long_name = "Model interpolated practical salinity" ;
		PSAL_Hx:units = "PSU" ;
		PSAL_Hx:_Fillvalue = 99999.f ;
	int PSAL_QC(N_OBS) ;
		PSAL_QC:long_name = "Quality on practical salinity" ;
		PSAL_QC:Conventions = "q where q =[0,9]" ;
		PSAL_QC:_Fillvalue = 0 ;
	int PSAL_QC_FLAGS(N_OBS, N_QCF) ;
		PSAL_QC_FLAGS:long_name = "Quality flags on practical salinity" ;
		PSAL_QC_FLAGS:Conventions = "NEMOVAR flag conventions" ;
		PSAL_QC_FLAGS:_Fillvalue = 0 ;
	int PSAL_LEVEL_QC(N_OBS, N_LEVELS) ;
		PSAL_LEVEL_QC:long_name = "Quality for each level on practical salinity" ;
		PSAL_LEVEL_QC:Conventions = "q where q =[0,9]" ;
		PSAL_LEVEL_QC:_Fillvalue = 0 ;
	int PSAL_LEVEL_QC_FLAGS(N_OBS, N_LEVELS, N_QCF) ;
		PSAL_LEVEL_QC_FLAGS:long_name = "Quality flags for each level on practical salinity" ;
		PSAL_LEVEL_QC_FLAGS:Conventions = "NEMOVAR flag conventions" ;
		PSAL_LEVEL_QC_FLAGS:_Fillvalue = 0 ;
	int PSAL_IOBSI(N_OBS) ;
		PSAL_IOBSI:long_name = "ORCA grid search I coordinate" ;
	int PSAL_IOBSJ(N_OBS) ;
		PSAL_IOBSJ:long_name = "ORCA grid search J coordinate" ;
	int PSAL_IOBSK(N_OBS, N_LEVELS) ;
		PSAL_IOBSK:long_name = "ORCA grid search K coordinate" ;
	char PSAL_GRID(STRINGGRID) ;
		PSAL_GRID:long_name = "ORCA grid search grid (T,U,V)" ;
	float TEMP(N_OBS, N_LEVELS) ;
		TEMP:long_name = "Insitu temperature" ;
		TEMP:units = "Degrees Celsius" ;
		TEMP:_Fillvalue = 99999.f ;

// global attributes:
		:title = "NEMO observation operator output" ;
		:Convention = "NEMO unified observation operator output" ;
}

Example sea level anomaly file header (in the observation "feedback file" format)

netcdf sla_01 {
dimensions:
	N_OBS = 41301 ;
	N_LEVELS = 1 ;
	N_VARS = 1 ;
	N_QCF = 2 ;
	N_ENTRIES = 1 ;
	N_EXTRA = 1 ;
	STRINGNAM = 8 ;
	STRINGGRID = 1 ;
	STRINGWMO = 8 ;
	STRINGTYP = 4 ;
	STRINGJULD = 14 ;
variables:
	char VARIABLES(N_VARS, STRINGNAM) ;
		VARIABLES:long_name = "List of variables in feedback files" ;
	char ENTRIES(N_ENTRIES, STRINGNAM) ;
		ENTRIES:long_name = "List of additional entries for each variable in feedback files" ;
	char EXTRA(N_EXTRA, STRINGNAM) ;
		EXTRA:long_name = "List of extra variables" ;
	char STATION_IDENTIFIER(N_OBS, STRINGWMO) ;
		STATION_IDENTIFIER:long_name = "Station identifier" ;
	char STATION_TYPE(N_OBS, STRINGTYP) ;
		STATION_TYPE:long_name = "Code instrument type" ;
	double LONGITUDE(N_OBS) ;
		LONGITUDE:long_name = "Longitude" ;
		LONGITUDE:units = "degrees_east" ;
		LONGITUDE:_Fillvalue = 99999.f ;
	double LATITUDE(N_OBS) ;
		LATITUDE:long_name = "Latitude" ;
		LATITUDE:units = "degrees_north" ;
		LATITUDE:_Fillvalue = 99999.f ;
	double DEPTH(N_OBS, N_LEVELS) ;
		DEPTH:long_name = "Depth" ;
		DEPTH:units = "metre" ;
		DEPTH:_Fillvalue = 99999.f ;
	int DEPTH_QC(N_OBS, N_LEVELS) ;
		DEPTH_QC:long_name = "Quality on depth" ;
		DEPTH_QC:Conventions = "q where q =[0,9]" ;
		DEPTH_QC:_Fillvalue = 0 ;
	int DEPTH_QC_FLAGS(N_OBS, N_LEVELS, N_QCF) ;
		DEPTH_QC_FLAGS:long_name = "Quality flags on depth" ;
		DEPTH_QC_FLAGS:Conventions = "NEMOVAR flag conventions" ;
	double JULD(N_OBS) ;
		JULD:long_name = "Julian day" ;
		JULD:units = "days since JULD_REFERENCE" ;
		JULD:Conventions = "relative julian days with decimal part (as parts of day)" ;
		JULD:_Fillvalue = 99999.f ;
	char JULD_REFERENCE(STRINGJULD) ;
		JULD_REFERENCE:long_name = "Date of reference for julian days" ;
		JULD_REFERENCE:Conventions = "YYYYMMDDHHMMSS" ;
	int OBSERVATION_QC(N_OBS) ;
		OBSERVATION_QC:long_name = "Quality on observation" ;
		OBSERVATION_QC:Conventions = "q where q =[0,9]" ;
		OBSERVATION_QC:_Fillvalue = 0 ;
	int OBSERVATION_QC_FLAGS(N_OBS, N_QCF) ;
		OBSERVATION_QC_FLAGS:long_name = "Quality flags on observation" ;
		OBSERVATION_QC_FLAGS:Conventions = "NEMOVAR flag conventions" ;
		OBSERVATION_QC_FLAGS:_Fillvalue = 0 ;
	int POSITION_QC(N_OBS) ;
		POSITION_QC:long_name = "Quality on position (latitude and longitude)" ;
		POSITION_QC:Conventions = "q where q =[0,9]" ;
		POSITION_QC:_Fillvalue = 0 ;
	int POSITION_QC_FLAGS(N_OBS, N_QCF) ;
		POSITION_QC_FLAGS:long_name = "Quality flags on position" ;
		POSITION_QC_FLAGS:Conventions = "NEMOVAR flag conventions" ;
		POSITION_QC_FLAGS:_Fillvalue = 0 ;
	int JULD_QC(N_OBS) ;
		JULD_QC:long_name = "Quality on date and time" ;
		JULD_QC:Conventions = "q where q =[0,9]" ;
		JULD_QC:_Fillvalue = 0 ;
	int JULD_QC_FLAGS(N_OBS, N_QCF) ;
		JULD_QC_FLAGS:long_name = "Quality flags on date and time" ;
		JULD_QC_FLAGS:Conventions = "NEMOVAR flag conventions" ;
		JULD_QC_FLAGS:_Fillvalue = 0 ;
	int ORIGINAL_FILE_INDEX(N_OBS) ;
		ORIGINAL_FILE_INDEX:long_name = "Index in original data file" ;
		ORIGINAL_FILE_INDEX:_Fillvalue = -99999 ;
	float SLA_OBS(N_OBS, N_LEVELS) ;
		SLA_OBS:long_name = "Sea level anomaly" ;
		SLA_OBS:units = "metre" ;
		SLA_OBS:_Fillvalue = 99999.f ;
	float SLA_Hx(N_OBS, N_LEVELS) ;
		SLA_Hx:long_name = "Model interpolated sea level anomaly" ;
		SLA_Hx:units = "metre" ;
		SLA_Hx:_Fillvalue = 99999.f ;
	int SLA_QC(N_OBS) ;
		SLA_QC:long_name = "Quality on sea level anomaly" ;
		SLA_QC:Conventions = "q where q =[0,9]" ;
		SLA_QC:_Fillvalue = 0 ;
	int SLA_QC_FLAGS(N_OBS, N_QCF) ;
		SLA_QC_FLAGS:long_name = "Quality flags on sea level anomaly" ;
		SLA_QC_FLAGS:Conventions = "NEMOVAR flag conventions" ;
		SLA_QC_FLAGS:_Fillvalue = 0 ;
	int SLA_LEVEL_QC(N_OBS, N_LEVELS) ;
		SLA_LEVEL_QC:long_name = "Quality for each level on sea level anomaly" ;
		SLA_LEVEL_QC:Conventions = "q where q =[0,9]" ;
		SLA_LEVEL_QC:_Fillvalue = 0 ;
	int SLA_LEVEL_QC_FLAGS(N_OBS, N_LEVELS, N_QCF) ;
		SLA_LEVEL_QC_FLAGS:long_name = "Quality flags for each level on sea level anomaly" ;
		SLA_LEVEL_QC_FLAGS:Conventions = "NEMOVAR flag conventions" ;
		SLA_LEVEL_QC_FLAGS:_Fillvalue = 0 ;
	int SLA_IOBSI(N_OBS) ;
		SLA_IOBSI:long_name = "ORCA grid search I coordinate" ;
	int SLA_IOBSJ(N_OBS) ;
		SLA_IOBSJ:long_name = "ORCA grid search J coordinate" ;
	int SLA_IOBSK(N_OBS, N_LEVELS) ;
		SLA_IOBSK:long_name = "ORCA grid search K coordinate" ;
	char SLA_GRID(STRINGGRID) ;
		SLA_GRID:long_name = "ORCA grid search grid (T,U,V)" ;
	float MDT(N_OBS, N_LEVELS) ;
		MDT:long_name = "Mean Dynamic Topography" ;
		MDT:units = "metre" ;
		MDT:_Fillvalue = 99999.f ;

// global attributes:
		:title = "NEMO observation operator output" ;
		:Convention = "NEMO unified observation operator output" ;
}

Example sea surface temperature observation file header (in the observation "feedback file" format)

netcdf sst_01 {
dimensions:
	N_OBS = 33099 ;
	N_LEVELS = 1 ;
	N_VARS = 1 ;
	N_QCF = 2 ;
	N_ENTRIES = 1 ;
	STRINGNAM = 8 ;
	STRINGGRID = 1 ;
	STRINGWMO = 8 ;
	STRINGTYP = 4 ;
	STRINGJULD = 14 ;
variables:
	char VARIABLES(N_VARS, STRINGNAM) ;
		VARIABLES:long_name = "List of variables in feedback files" ;
	char ENTRIES(N_ENTRIES, STRINGNAM) ;
		ENTRIES:long_name = "List of additional entries for each variable in feedback files" ;
	char STATION_IDENTIFIER(N_OBS, STRINGWMO) ;
		STATION_IDENTIFIER:long_name = "Station identifier" ;
	char STATION_TYPE(N_OBS, STRINGTYP) ;
		STATION_TYPE:long_name = "Code instrument type" ;
	double LONGITUDE(N_OBS) ;
		LONGITUDE:long_name = "Longitude" ;
		LONGITUDE:units = "degrees_east" ;
		LONGITUDE:_Fillvalue = 99999.f ;
	double LATITUDE(N_OBS) ;
		LATITUDE:long_name = "Latitude" ;
		LATITUDE:units = "degrees_north" ;
		LATITUDE:_Fillvalue = 99999.f ;
	double DEPTH(N_OBS, N_LEVELS) ;
		DEPTH:long_name = "Depth" ;
		DEPTH:units = "metre" ;
		DEPTH:_Fillvalue = 99999.f ;
	int DEPTH_QC(N_OBS, N_LEVELS) ;
		DEPTH_QC:long_name = "Quality on depth" ;
		DEPTH_QC:Conventions = "q where q =[0,9]" ;
		DEPTH_QC:_Fillvalue = 0 ;
	int DEPTH_QC_FLAGS(N_OBS, N_LEVELS, N_QCF) ;
		DEPTH_QC_FLAGS:long_name = "Quality flags on depth" ;
		DEPTH_QC_FLAGS:Conventions = "NEMOVAR flag conventions" ;
	double JULD(N_OBS) ;
		JULD:long_name = "Julian day" ;
		JULD:units = "days since JULD_REFERENCE" ;
		JULD:Conventions = "relative julian days with decimal part (as parts of day)" ;
		JULD:_Fillvalue = 99999.f ;
	char JULD_REFERENCE(STRINGJULD) ;
		JULD_REFERENCE:long_name = "Date of reference for julian days" ;
		JULD_REFERENCE:Conventions = "YYYYMMDDHHMMSS" ;
	int OBSERVATION_QC(N_OBS) ;
		OBSERVATION_QC:long_name = "Quality on observation" ;
		OBSERVATION_QC:Conventions = "q where q =[0,9]" ;
		OBSERVATION_QC:_Fillvalue = 0 ;
	int OBSERVATION_QC_FLAGS(N_OBS, N_QCF) ;
		OBSERVATION_QC_FLAGS:long_name = "Quality flags on observation" ;
		OBSERVATION_QC_FLAGS:Conventions = "NEMOVAR flag conventions" ;
		OBSERVATION_QC_FLAGS:_Fillvalue = 0 ;
	int POSITION_QC(N_OBS) ;
		POSITION_QC:long_name = "Quality on position (latitude and longitude)" ;
		POSITION_QC:Conventions = "q where q =[0,9]" ;
		POSITION_QC:_Fillvalue = 0 ;
	int POSITION_QC_FLAGS(N_OBS, N_QCF) ;
		POSITION_QC_FLAGS:long_name = "Quality flags on position" ;
		POSITION_QC_FLAGS:Conventions = "NEMOVAR flag conventions" ;
		POSITION_QC_FLAGS:_Fillvalue = 0 ;
	int JULD_QC(N_OBS) ;
		JULD_QC:long_name = "Quality on date and time" ;
		JULD_QC:Conventions = "q where q =[0,9]" ;
		JULD_QC:_Fillvalue = 0 ;
	int JULD_QC_FLAGS(N_OBS, N_QCF) ;
		JULD_QC_FLAGS:long_name = "Quality flags on date and time" ;
		JULD_QC_FLAGS:Conventions = "NEMOVAR flag conventions" ;
		JULD_QC_FLAGS:_Fillvalue = 0 ;
	int ORIGINAL_FILE_INDEX(N_OBS) ;
		ORIGINAL_FILE_INDEX:long_name = "Index in original data file" ;
		ORIGINAL_FILE_INDEX:_Fillvalue = -99999 ;
	float SST_OBS(N_OBS, N_LEVELS) ;
		SST_OBS:long_name = "Sea surface temperature" ;
		SST_OBS:units = "Degree centigrade" ;
		SST_OBS:_Fillvalue = 99999.f ;
	float SST_Hx(N_OBS, N_LEVELS) ;
		SST_Hx:long_name = "Model interpolated sea surface temperature" ;
		SST_Hx:units = "Degree centigrade" ;
		SST_Hx:_Fillvalue = 99999.f ;
	int SST_QC(N_OBS) ;
		SST_QC:long_name = "Quality on sea surface temperature" ;
		SST_QC:Conventions = "q where q =[0,9]" ;
		SST_QC:_Fillvalue = 0 ;
	int SST_QC_FLAGS(N_OBS, N_QCF) ;
		SST_QC_FLAGS:long_name = "Quality flags on sea surface temperature" ;
		SST_QC_FLAGS:Conventions = "NEMOVAR flag conventions" ;
		SST_QC_FLAGS:_Fillvalue = 0 ;
	int SST_LEVEL_QC(N_OBS, N_LEVELS) ;
		SST_LEVEL_QC:long_name = "Quality for each level on sea surface temperature" ;
		SST_LEVEL_QC:Conventions = "q where q =[0,9]" ;
		SST_LEVEL_QC:_Fillvalue = 0 ;
	int SST_LEVEL_QC_FLAGS(N_OBS, N_LEVELS, N_QCF) ;
		SST_LEVEL_QC_FLAGS:long_name = "Quality flags for each level on sea surface temperature" ;
		SST_LEVEL_QC_FLAGS:Conventions = "NEMOVAR flag conventions" ;
		SST_LEVEL_QC_FLAGS:_Fillvalue = 0 ;
	int SST_IOBSI(N_OBS) ;
		SST_IOBSI:long_name = "ORCA grid search I coordinate" ;
	int SST_IOBSJ(N_OBS) ;
		SST_IOBSJ:long_name = "ORCA grid search J coordinate" ;
	int SST_IOBSK(N_OBS, N_LEVELS) ;
		SST_IOBSK:long_name = "ORCA grid search K coordinate" ;
	char SST_GRID(STRINGGRID) ;
		SST_GRID:long_name = "ORCA grid search grid (T,U,V)" ;

// global attributes:
		:title = "NEMO observation operator output" ;
		:Convention = "NEMO unified observation operator output" ;
}

Header from an example assimilation increments file

netcdf assim_background_increments {
dimensions:
        x = 182 ;
        y = 149 ;
        z = 31 ;
        t = UNLIMITED ; // (1 currently)
variables:
        float nav_lon(y, x) ;
        float nav_lat(y, x) ;
        float nav_lev(z) ;
        double time_counter(t) ;
        double time ;
        double z_inc_dateb ;
        double z_inc_datef ;
        double bckint(t, z, y, x) ;
        double bckins(t, z, y, x) ;
        double bckinu(t, z, y, x) ;
        double bckinv(t, z, y, x) ;
        double bckineta(t, y, x) ;

// global attributes:
                :DOMAIN_number_total = 1 ;
                :DOMAIN_number = 0 ;
                :DOMAIN_dimensions_ids = 1, 2 ;
                :DOMAIN_size_global = 182, 149 ;
                :DOMAIN_size_local = 182, 149 ;
                :DOMAIN_position_first = 1, 1 ;
                :DOMAIN_position_last = 182, 149 ;
                :DOMAIN_halo_size_start = 0, 0 ;
                :DOMAIN_halo_size_end = 0, 0 ;
                :DOMAIN_type = "BOX" ;
}

Example

If you wish to test the observation operator please download some ENSEMBLES data from http://www.hadobs.org/

Select EN3 - Ensembles > Download data > Download EN3_v2a for 2007 (for example)

EN3_v2a_Profiles_2007.tar

Namelist to run the observation operator on this data - replace profiles_01.nc with the observation file you wish to use (or link in)

!-----------------------------------------------------------------------
!       namobs    observation usage switch
!-----------------------------------------------------------------------
!
!  ln_t3d                  Logical switch for T profile observations         
!  ln_s3d                  Logical switch for S profile observations          
!  ln_ena                  Logical switch for ENACT insitu data set           
!  ln_cor                  Logical switch for Coriolis insitu data set       
!  ln_profb                Logical switch for feedback insitu data set     
!  ln_sla                  Logical switch for SLA observations               
!  ln_sladt                Logical switch for AVISO SLA data              
!  ln_slafb                Logical switch for feedback SLA data            
!  ln_ssh                  Logical switch for SSH observations              
!  ln_sst                  Logical switch for SST observations              
!  ln_reysst               Logical switch for Reynolds observations       
!  ln_ghrsst               Logical switch for GHRSST observations          
!  ln_sstfb                Logical switch for feedback SST data          
!  ln_sss                  Logical switch for SSS observations              
!  ln_seaice               Logical switch for Sea Ice observations        
!  ln_vel3d                Logical switch for velocity observations         
!  ln_velavcur             Logical switch for velocity daily av. cur.    
!  ln_velhrcur             Logical switch for velocity high freq. cur.   
!  ln_velavadcp            Logical switch for velocity daily av. ADCP  
!  ln_velhradcp            Logical switch for velocity high freq. ADCP
!  ln_velfb                Logical switch for feedback velocity data       
!  ln_grid_global          Global distribtion of observations         
!  ln_grid_search_lookup   Logical switch for obs grid search w/lookup table  
!  grid_search_file        Grid search lookup file header 
!  enactfiles              ENACT input observation file names 
!  coriofiles              Coriolis input observation file name  
!  profbfiles              Profile feedback input observation file name 
!  ln_profb_enatim         Enact feedback input time setting switch    
!  slafilesact             Active SLA input observation file name
!  slafilespas             Passive SLA input observation file name 
!  slafbfiles              Feedback SLA input observation file name 
!  sstfiles                GHRSST input observation file name       
!  sstfbfiles              Feedback SST input observation file name 
!  seaicefiles             Sea Ice input observation file name 
!  velavcurfiles           Vel. cur. daily av. input file name  
!  velhvcurfiles           Vel. cur. high freq. input file name  
!  velavadcpfiles          Vel. ADCP daily av. input file name    
!  velhvadcpfiles          Vel. ADCP high freq. input file name 
!  velfbfiles              Vel. feedback input observation file name 
!  dobsini                 Initial date in window YYYYMMDD.HHMMSS       
!  dobsend                 Final date in window YYYYMMDD.HHMMSS         
!  n1dint                  Type of vertical interpolation method        
!  n2dint                  Type of horizontal interpolation method       
!  ln_nea                  Rejection of observations near land switch    
!  nmsshc                  MSSH correction scheme                         
!  mdtcorr                 MDT  correction                               
!  mdtcutoff               MDT cutoff for computed correction          
!  ln_altbias              Logical switch for alt bias                
!  ln_ignmis               Logical switch for ignoring missing files   
!  endailyavtypes          ENACT daily average types                    
 &namobs
   ln_t3d = .true.
   ln_s3d = .true.
   ln_ena = .true.
   nmsshc = 0
   enactfiles = 'profiles_01.nc'
   ln_altbias = .false.
   ln_grid_global = .true.
   ln_grid_search_lookup = .true.
   ln_ignmis = .true.  
/ 

Running NEMO will produce feedback files enact_fdbk_0000.nc etc for each processor. To plot the feedback files you will need to a utility such as the IDL routine dataplot.pro (location?)


Resources

''Please ''summarize'' any changes in runtime or memory use caused by this change......'' No change if turned off. If active the runtime change depends on the number observations for the observation operator. The runtime change is neglible for the assimilation increments code.


IPR issues

Has the code been wholly (100%) produced by NEMO developers staff working exclusively on NEMO? YES?

The code has been produced by the NEMOVAR consortium which includes ECMWF, CERFACS, INRIA and the Met Office

If No:

  • Identify the collaboration agreement details
  • Ensure the code routine header is in accordance with the agreement, (Copyright/Redistribution? etc).Add further details here if required..........