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.
obs_group_def.F90 in NEMO/branches/UKMO/NEMO_4.0.4_FOAM_package/src/OCE/OBS – NEMO

source: NEMO/branches/UKMO/NEMO_4.0.4_FOAM_package/src/OCE/OBS/obs_group_def.F90 @ 15799

Last change on this file since 15799 was 15799, checked in by dford, 2 years ago

More generic interface and structure for OBS code. See Met Office utils tickets 471 and 530.

File size: 27.6 KB
Line 
1MODULE obs_group_def
2   !!=====================================================================
3   !!                       ***  MODULE obs_group_def  ***
4   !! Observation diagnostics: Routines specific to observation groups
5   !!=====================================================================
6   !! History : 4.0  !  2021-06  (D Ford)  Original code
7   !!----------------------------------------------------------------------
8   !!   obs_group_alloc         : allocate observation group types
9   !!   obs_group_dealloc       : deallocate observation group types
10   !!   obs_group_read_namelist : read observation group namelists
11   !!   obs_group_check         : check observation group options
12   !!----------------------------------------------------------------------
13
14   !! * Modules used
15   USE iom                ! In/out manager
16   USE par_kind, ONLY : & ! Precision variables
17      & wp
18   USE obs_surf_def       ! Surface data definitions
19   USE obs_profiles_def   ! Profile data definitions
20   USE tradmp, ONLY : &   ! Damping to climatology
21      & ln_tradmp
22   USE obs_grid, ONLY : & ! Use global distribution of observations
23      & ln_grid_global
24
25   IMPLICIT NONE
26
27   !! * Routine/type accessibility
28   PRIVATE
29
30   PUBLIC &
31      & obs_group,               &
32      & obs_group_alloc,         &
33      & obs_group_dealloc,       &
34      & obs_group_read_namelist, &
35      & obs_group_check
36
37   !! * Shared Module variables
38   INTEGER, PARAMETER :: jpmaxntypes = 1000   ! Maximum number of obs types for each obs group
39   INTEGER, PARAMETER :: jpmaxnfiles = 1000   ! Maximum number of files for each obs group
40
41   INTEGER, PARAMETER, PUBLIC :: imaxavtypes = 20   !: Max number of daily avgd obs types
42   
43   ! Expected names for observation types with special behaviours (not needed for all observation types)
44   CHARACTER(LEN=8), PUBLIC :: cobsname_uvel = 'UVEL' ! Expected variable name for U velocity (2D or 3D)
45   CHARACTER(LEN=8), PUBLIC :: cobsname_vvel = 'VVEL' ! Expected variable name for V velocity (2D or 3D)
46   CHARACTER(LEN=8), PUBLIC :: cobsname_sla  = 'SLA'  ! Expected variable name for sea level anomaly
47   CHARACTER(LEN=8), PUBLIC :: cobsname_fbd  = 'FBD'  ! Expected variable name for sea ice freeboard
48   CHARACTER(LEN=8), PUBLIC :: cobsname_t3d  = 'POTM' ! Expected variable name for 3D temperature
49   CHARACTER(LEN=8), PUBLIC :: cobsname_s3d  = 'PSAL' ! Expected variable name for 3D salinity
50   CHARACTER(LEN=8), PUBLIC :: cobsname_t2d  = 'SST'  ! Expected variable name for 2D temperature
51   CHARACTER(LEN=8), PUBLIC :: cobsname_s2d  = 'SSS'  ! Expected variable name for 2D salinity
52
53   !! * Type definition for observation groups
54   TYPE obs_group
55      !
56      CHARACTER(LEN=25)                             :: cgroupname    !: Name of obs group (for stdout)
57      CHARACTER(LEN=8),   DIMENSION(:), ALLOCATABLE :: cobstypes     !: Observation types to read from files
58      CHARACTER(LEN=128), DIMENSION(:), ALLOCATABLE :: cobsfiles     !: Observation file names
59      CHARACTER(LEN=128), DIMENSION(:), ALLOCATABLE :: cobsbiasfiles !: Bias input file names
60      CHARACTER(LEN=128)                            :: cbiasvarname  !: Bias variable name in input file
61      CHARACTER(LEN=128)                            :: caltbiasfile  !: Altimeter bias input file name
62      CHARACTER(LEN=1)                              :: cgrid         !: Grid type (T,U,V)
63      !
64      INTEGER,            DIMENSION(:), ALLOCATABLE :: nprofdavtypes !: Profile data types representing a daily average
65      !
66      INTEGER  :: nobstypes          !: Number of observation types
67      INTEGER  :: nobsfiles          !: Number of observation files
68      INTEGER  :: nobsbiasfiles      !: Number of bias files
69      INTEGER  :: nbiasvar           !: Index of observation type to be bias corrected
70      INTEGER  :: navtypes           !: Number of profile data types representing a daily average
71      INTEGER  :: nextvars           !: Number of extra variables in addition to any in input files
72      INTEGER  :: naddvars           !: Number of additional variables in addition to any in input files
73      INTEGER  :: n1dint             !: Type of vertical interpolation method
74      INTEGER  :: n2dint             !: Type of horizontal interpolation method
75      INTEGER  :: nmsshc             !: MSSH correction scheme
76      INTEGER  :: nadd_ssh           !: Index of additional variable representing SSH
77      INTEGER  :: next_mdt           !: Index of extra variable representing MDT
78      INTEGER  :: nadd_fbd           !: Index of additional variable representing ice freeboard
79      INTEGER  :: next_snow          !: Index of extra variable representing snow thickness
80      INTEGER  :: nadd_clm           !: Index of additional variable representing climatology
81      !
82      LOGICAL  :: lenabled           !: Logical switch for group being processed and not ignored
83      LOGICAL  :: lsurf              !: Logical switch for surface data
84      LOGICAL  :: lprof              !: Logical switch for profile data
85      LOGICAL  :: lvel               !: Logical switch for velocity data
86      LOGICAL  :: lsla               !: Logical switch for SLA data
87      LOGICAL  :: lfbd               !: Logical switch for ice freeboard data
88      LOGICAL  :: laltbias           !: Logical switch for altimeter bias correction
89      LOGICAL  :: lobsbias           !: Logical switch for bias correction
90      LOGICAL  :: lnea               !: Logical switch for rejecting observations near land
91      LOGICAL  :: lbound_reject      !: Logical switch for rejecting obs near the boundary
92      LOGICAL  :: lignmis            !: Logical switch for ignoring missing files
93      LOGICAL  :: lall_at_all        !: Logical switch for computing all model variables at all obs points
94      LOGICAL  :: lnight             !: Logical switch for calculating night-time average
95      LOGICAL  :: ltime_mean_bkg     !: Logical switch for applying time mean of background (e.g. to remove tidal signal)
96      LOGICAL  :: loutput_clim       !: Logical switch for outputting climatological temperature/salinity
97      LOGICAL  :: lfp_indegs         !: Logical: T=> averaging footprint is in degrees, F=> in metres
98      !
99      REAL(wp) :: ravglamscl         !: E/W diameter of observation footprint (metres/degrees)
100      REAL(wp) :: ravgphiscl         !: N/S diameter of observation footprint (metres/degrees)
101      REAL(wp) :: rmdtcorr           !: MDT correction
102      REAL(wp) :: rmdtcutoff         !: MDT cutoff for computed correction
103      REAL(wp) :: rtime_mean_period  !: Meaning period if ltime_mean_bkg
104      !
105      REAL(wp), POINTER, DIMENSION(:,:,:)   :: rglam  !: Longitudes
106      REAL(wp), POINTER, DIMENSION(:,:,:)   :: rgphi  !: Latitudes
107      REAL(wp), POINTER, DIMENSION(:,:,:,:) :: rmask  !: Land/sea masks
108      !
109      TYPE(obs_surf) :: ssurfdata    !: Initial surface data
110      TYPE(obs_surf) :: ssurfdataqc  !: Surface data after quality control
111      TYPE(obs_prof) :: sprofdata    !: Initial profile data
112      TYPE(obs_prof) :: sprofdataqc  !: Profile data after quality control
113      !
114   END TYPE
115
116CONTAINS
117
118   SUBROUTINE obs_group_alloc( sdobsgroup )
119      !!----------------------------------------------------------------------
120      !!                     ***  ROUTINE obs_group_alloc  ***
121      !!
122      !! ** Purpose : - Allocate data for observation group types
123      !!
124      !! ** Method  : - Allocate arrays
125      !!
126      !! ** Action  : - Allocate arrays
127      !!
128      !!----------------------------------------------------------------------
129      !! * Arguments
130      TYPE(obs_group), INTENT(INOUT) :: sdobsgroup ! Obs group to be allocated
131      !!----------------------------------------------------------------------
132
133      ALLOCATE( sdobsgroup%cobstypes    (sdobsgroup%nobstypes            ), &
134         &      sdobsgroup%cobsfiles    (sdobsgroup%nobsfiles            ), &
135         &      sdobsgroup%cobsbiasfiles(sdobsgroup%nobsbiasfiles        ), &
136         &      sdobsgroup%nprofdavtypes(sdobsgroup%navtypes             ), &
137         &      sdobsgroup%rglam        (jpi,jpj,    sdobsgroup%nobstypes), &
138         &      sdobsgroup%rgphi        (jpi,jpj,    sdobsgroup%nobstypes), &
139         &      sdobsgroup%rmask        (jpi,jpj,jpk,sdobsgroup%nobstypes) )
140
141   END SUBROUTINE obs_group_alloc
142
143
144   SUBROUTINE obs_group_dealloc( sdobsgroup )
145      !!----------------------------------------------------------------------
146      !!                     ***  ROUTINE obs_group_dealloc  ***
147      !!
148      !! ** Purpose : - Deallocate data for observation group types
149      !!
150      !! ** Method  : - Deallocate arrays
151      !!
152      !! ** Action  : - Deallocate arrays
153      !!
154      !!----------------------------------------------------------------------
155      !! * Arguments
156      TYPE(obs_group), INTENT(INOUT) :: sdobsgroup ! Obs group to be deallocated
157      !!----------------------------------------------------------------------
158
159      DEALLOCATE( sdobsgroup%cobstypes,     &
160         &        sdobsgroup%cobsfiles,     &
161         &        sdobsgroup%cobsbiasfiles, &
162         &        sdobsgroup%nprofdavtypes, &
163         &        sdobsgroup%rglam,         &
164         &        sdobsgroup%rgphi,         &
165         &        sdobsgroup%rmask )
166
167   END SUBROUTINE obs_group_dealloc
168
169
170   SUBROUTINE obs_group_read_namelist( sdobsgroup )
171      !!----------------------------------------------------------------------
172      !!                     ***  ROUTINE obs_group_read_namelist  ***
173      !!
174      !! ** Purpose : - Read namelist for observation group types
175      !!
176      !! ** Method  : - Read namelist
177      !!
178      !! ** Action  : - Read namelist
179      !!
180      !!----------------------------------------------------------------------
181      !! * Arguments
182      TYPE(obs_group), INTENT(INOUT) :: sdobsgroup ! Obs group to be populated
183      !! * Local variables
184      INTEGER :: ios                               ! Status for namelist read
185      INTEGER :: itype, ifile                      ! Loop counters
186      INTEGER :: jtype, jfile                      ! Loop counters
187      !
188      CHARACTER(LEN=128)                         :: cn_groupname
189      CHARACTER(LEN=8),   DIMENSION(jpmaxntypes) :: cn_obstypes
190      CHARACTER(LEN=128), DIMENSION(jpmaxnfiles) :: cn_obsfiles
191      CHARACTER(LEN=128), DIMENSION(jpmaxnfiles) :: cn_obsbiasfiles
192      CHARACTER(LEN=128)                         :: cn_type_to_biascorrect
193      CHARACTER(LEN=128)                         :: cn_obsbiasfile_varname
194      CHARACTER(LEN=128)                         :: cn_altbiasfile
195      INTEGER,            DIMENSION(imaxavtypes) :: nn_profdavtypes
196      INTEGER                                    :: nn_1dint
197      INTEGER                                    :: nn_2dint
198      INTEGER                                    :: nn_msshc
199      LOGICAL                                    :: ln_enabled
200      LOGICAL                                    :: ln_surf
201      LOGICAL                                    :: ln_prof
202      LOGICAL                                    :: ln_altbias
203      LOGICAL                                    :: ln_obsbias
204      LOGICAL                                    :: ln_nea
205      LOGICAL                                    :: ln_bound_reject
206      LOGICAL                                    :: ln_ignmis
207      LOGICAL                                    :: ln_all_at_all
208      LOGICAL                                    :: ln_night
209      LOGICAL                                    :: ln_time_mean_bkg
210      LOGICAL                                    :: ln_output_clim
211      LOGICAL                                    :: ln_fp_indegs
212      REAL(wp)                                   :: rn_avglamscl
213      REAL(wp)                                   :: rn_avgphiscl
214      REAL(wp)                                   :: rn_mdtcorr
215      REAL(wp)                                   :: rn_mdtcutoff
216      REAL(wp)                                   :: rn_time_mean_period
217      !!
218      NAMELIST/namobs_dta/cn_groupname, ln_prof, ln_surf, ln_enabled,           &
219         &                cn_obsfiles, cn_obstypes, ln_nea, ln_bound_reject,    &
220         &                ln_ignmis, nn_2dint, nn_1dint, nn_profdavtypes,       &
221         &                ln_fp_indegs, rn_avglamscl, rn_avgphiscl, ln_obsbias, &
222         &                cn_obsbiasfiles, cn_type_to_biascorrect,              &
223         &                cn_obsbiasfile_varname, ln_night, ln_time_mean_bkg,   &
224         &                rn_time_mean_period, ln_altbias, cn_altbiasfile,      &
225         &                nn_msshc, rn_mdtcorr, rn_mdtcutoff, ln_all_at_all,    &
226         &                ln_output_clim
227      !!----------------------------------------------------------------------
228
229      cn_obstypes(:)     = ''
230      cn_obsfiles(:)     = ''
231      cn_obsbiasfiles(:) = ''
232      nn_profdavtypes(:) = -1
233
234      ! There is only one namobs_dta block in namelist_ref -> use it for each group so we do a rewind
235      REWIND(numnam_ref)
236      READ  ( numnam_ref, namobs_dta, IOSTAT = ios, ERR = 901)
237901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namobs_dta in reference namelist' )
238
239      ! Read namobs_dta from namelist_cfg
240      ! WARNING: we don't do a rewind here, each group reads its own namobs_dta block one after another
241      READ  ( numnam_cfg, namobs_dta, IOSTAT = ios, ERR = 902 )
242902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namobs_dta in configuration namelist' )
243      IF(lwm) WRITE( numond, namobs_dta )
244     
245      sdobsgroup%cgroupname = cn_groupname
246      sdobsgroup%lenabled   = ln_enabled
247
248      IF (sdobsgroup%lenabled) THEN
249         sdobsgroup%nobstypes     = 0
250         sdobsgroup%nobsfiles     = 0
251         sdobsgroup%naddvars      = 0
252         sdobsgroup%nextvars      = 0
253         sdobsgroup%navtypes      = 0
254         sdobsgroup%nobsbiasfiles = 0
255         sdobsgroup%lvel          = .false.
256         sdobsgroup%lsla          = .false.
257         sdobsgroup%lfbd          = .false.
258         sdobsgroup%nadd_ssh      = 0
259         sdobsgroup%next_mdt      = 0
260         sdobsgroup%nadd_fbd      = 0
261         sdobsgroup%next_snow     = 0
262
263         DO jtype = 1, jpmaxntypes
264            IF ( TRIM(cn_obstypes(jtype)) /= '' ) THEN
265               sdobsgroup%nobstypes = sdobsgroup%nobstypes + 1
266            ENDIF
267         END DO
268         DO jfile = 1, jpmaxnfiles
269            IF ( TRIM(cn_obsfiles(jfile)) /= '' ) THEN
270               sdobsgroup%nobsfiles = sdobsgroup%nobsfiles + 1
271            ENDIF
272         END DO
273         DO jtype = 1, imaxavtypes
274            IF ( nn_profdavtypes(jtype) /= -1 ) THEN
275               sdobsgroup%navtypes = sdobsgroup%navtypes + 1
276            ENDIF
277         END DO
278         DO jfile = 1, jpmaxnfiles
279            IF ( TRIM(cn_obsbiasfiles(jfile)) /= '' ) THEN
280               sdobsgroup%nobsbiasfiles = sdobsgroup%nobsbiasfiles + 1
281            ENDIF
282         END DO
283
284         CALL obs_group_alloc( sdobsgroup )
285
286         itype = 0
287         DO jtype = 1, jpmaxntypes
288            IF ( TRIM(cn_obstypes(jtype)) /= '' ) THEN
289               itype = itype + 1
290               sdobsgroup%cobstypes(itype) = TRIM(cn_obstypes(jtype))
291               IF ( (TRIM(sdobsgroup%cobstypes(itype)) == cobsname_uvel) .OR. &
292                  & (TRIM(sdobsgroup%cobstypes(itype)) == cobsname_vvel) ) THEN
293                  sdobsgroup%lvel = .true.
294               ELSEIF ( TRIM(sdobsgroup%cobstypes(itype)) == cobsname_sla ) THEN
295                  sdobsgroup%lsla = .true.
296                  ! SSH=additional, MDT=extra
297                  sdobsgroup%naddvars = sdobsgroup%naddvars + 1
298                  sdobsgroup%nextvars = sdobsgroup%nextvars + 1
299                  sdobsgroup%nadd_ssh = sdobsgroup%naddvars
300                  sdobsgroup%next_mdt = sdobsgroup%nextvars
301               ELSEIF ( TRIM(sdobsgroup%cobstypes(itype)) == cobsname_fbd ) THEN
302                  sdobsgroup%lfbd = .true.
303                  ! freeboard=additional, snow thickness=extra
304                  sdobsgroup%naddvars  = sdobsgroup%naddvars + 1
305                  sdobsgroup%nextvars  = sdobsgroup%nextvars + 1
306                  sdobsgroup%nadd_fbd  = sdobsgroup%naddvars
307                  sdobsgroup%next_snow = sdobsgroup%nextvars
308               ENDIF
309               !
310               IF ( ln_output_clim .AND. ln_tradmp .AND. (.NOT. sdobsgroup%loutput_clim) ) THEN
311                  IF ( (TRIM(sdobsgroup%cobstypes(itype)) == cobsname_t3d) .OR. &
312                     & (TRIM(sdobsgroup%cobstypes(itype)) == cobsname_s3d) .OR. &
313                     & (TRIM(sdobsgroup%cobstypes(itype)) == cobsname_t2d) .OR. &
314                     & (TRIM(sdobsgroup%cobstypes(itype)) == cobsname_s2d) ) THEN
315                     sdobsgroup%loutput_clim = .TRUE.
316                     sdobsgroup%naddvars = sdobsgroup%naddvars + 1
317                     sdobsgroup%nadd_clm = sdobsgroup%naddvars
318                  ENDIF
319               ENDIF
320               !
321               IF (TRIM(sdobsgroup%cobstypes(itype)) == cobsname_uvel) THEN
322                  sdobsgroup%cgrid              = 'U'
323                  sdobsgroup%rglam(:,:,itype)   = glamu(:,:)
324                  sdobsgroup%rgphi(:,:,itype)   = gphiu(:,:)
325                  sdobsgroup%rmask(:,:,:,itype) = umask(:,:,:)
326               ELSEIF (TRIM(sdobsgroup%cobstypes(itype)) == cobsname_vvel) THEN
327                  sdobsgroup%cgrid              = 'V'
328                  sdobsgroup%rglam(:,:,itype)   = glamv(:,:)
329                  sdobsgroup%rgphi(:,:,itype)   = gphiv(:,:)
330                  sdobsgroup%rmask(:,:,:,itype) = vmask(:,:,:)
331               ELSE
332                  sdobsgroup%cgrid              = 'T'
333                  sdobsgroup%rglam(:,:,itype)   = glamt(:,:)
334                  sdobsgroup%rgphi(:,:,itype)   = gphit(:,:)
335                  sdobsgroup%rmask(:,:,:,itype) = tmask(:,:,:)
336               ENDIF
337            ENDIF
338         END DO
339         ifile = 0
340         DO jfile = 1, jpmaxnfiles
341            IF ( TRIM(cn_obsfiles(jfile)) /= '' ) THEN
342               ifile = ifile + 1
343               sdobsgroup%cobsfiles(ifile) = TRIM(cn_obsfiles(jfile))
344            ENDIF
345         END DO
346         itype = 0
347         DO jtype = 1, imaxavtypes
348            IF ( nn_profdavtypes(jtype) /= -1 ) THEN
349               itype = itype + 1
350               sdobsgroup%nprofdavtypes(itype) = nn_profdavtypes(jtype)
351            ENDIF
352         END DO
353         ifile = 0
354         DO jfile = 1, jpmaxnfiles
355            IF ( TRIM(cn_obsbiasfiles(jfile)) /= '' ) THEN
356               ifile = ifile + 1
357               sdobsgroup%cobsbiasfiles(ifile) = cn_obsbiasfiles(jfile)
358            ENDIF
359         END DO
360         IF ( ln_obsbias ) THEN
361            sdobsgroup%nbiasvar = -1
362            DO jtype = 1, sdobsgroup%nobstypes
363               IF ( TRIM(sdobsgroup%cobstypes(itype)) == TRIM(cn_type_to_biascorrect) ) THEN
364                  sdobsgroup%nbiasvar = jtype
365                  EXIT
366               ENDIF
367            ENDDO
368         ENDIF
369
370         sdobsgroup%caltbiasfile       = cn_altbiasfile
371         sdobsgroup%n1dint             = nn_1dint
372         sdobsgroup%n2dint             = nn_2dint
373         sdobsgroup%nmsshc             = nn_msshc
374         sdobsgroup%lsurf              = ln_surf
375         sdobsgroup%lprof              = ln_prof
376         sdobsgroup%laltbias           = ln_altbias
377         sdobsgroup%lobsbias           = ln_obsbias
378         sdobsgroup%cbiasvarname       = cn_obsbiasfile_varname
379         sdobsgroup%lnea               = ln_nea
380         sdobsgroup%lbound_reject      = ln_bound_reject
381         sdobsgroup%lignmis            = ln_ignmis
382         sdobsgroup%lall_at_all        = ln_all_at_all
383         sdobsgroup%lnight             = ln_night
384         sdobsgroup%ltime_mean_bkg     = ln_time_mean_bkg
385         sdobsgroup%lfp_indegs         = ln_fp_indegs
386         sdobsgroup%ravglamscl         = rn_avglamscl
387         sdobsgroup%ravgphiscl         = rn_avgphiscl
388         sdobsgroup%rmdtcorr           = rn_mdtcorr
389         sdobsgroup%rmdtcutoff         = rn_mdtcutoff
390         sdobsgroup%rtime_mean_period  = rn_time_mean_period
391      ENDIF
392
393   END SUBROUTINE obs_group_read_namelist
394
395
396   SUBROUTINE obs_group_check( sdobsgroup, kgroup )
397      !!----------------------------------------------------------------------
398      !!                     ***  ROUTINE obs_group_check  ***
399      !!
400      !! ** Purpose : - Error check observation group types
401      !!
402      !! ** Method  : - Check and print options
403      !!
404      !! ** Action  : - Check and print options
405      !!
406      !!----------------------------------------------------------------------
407      !! * Arguments
408      TYPE(obs_group), INTENT(IN) :: sdobsgroup ! Obs group to be checked
409      INTEGER,         INTENT(IN) :: kgroup     ! Number of group being checked
410      !! * Local variables
411      INTEGER :: jtype, jfile                   ! Loop counters
412      !!----------------------------------------------------------------------
413
414      IF (lwp) THEN
415         WRITE(numout,*)
416         WRITE(numout,*) 'obs_group_check : Options for group ', kgroup, ', ', TRIM(sdobsgroup%cgroupname)
417         WRITE(numout,*) '~~~~~~~~~~~~'
418         WRITE(numout,*) '          Logical switch for group being enabled                  ln_enabled = ', sdobsgroup%lenabled
419         IF ( .NOT. sdobsgroup%lenabled ) THEN
420            WRITE(numout,*) '             Group disabled, will not be used'
421         ELSE
422            WRITE(numout,*) '          Observation types in group:', sdobsgroup%nobstypes
423            DO jtype = 1, sdobsgroup%nobstypes
424               WRITE(numout,*) '             ', TRIM(sdobsgroup%cobstypes(jtype))
425            END DO
426               WRITE(numout,*) '          Observation files in group:', sdobsgroup%nobsfiles
427            DO jfile = 1, sdobsgroup%nobsfiles
428               WRITE(numout,*) '             ', TRIM(sdobsgroup%cobsfiles(jfile))
429            END DO
430            WRITE(numout,*) '          General settings:'
431            WRITE(numout,*) '             Logical switch for surface data                         ln_surf = ', sdobsgroup%lsurf
432            WRITE(numout,*) '             Logical switch for profile data                         ln_prof = ', sdobsgroup%lprof
433            WRITE(numout,*) '             Rejection of observations near land switch               ln_nea = ', sdobsgroup%lnea
434            WRITE(numout,*) '             Rejection of obs near open bdys                 ln_bound_reject = ', sdobsgroup%lbound_reject
435            WRITE(numout,*) '             Logical switch for ignoring missing files             ln_ignmis = ', sdobsgroup%lignmis
436            WRITE(numout,*) '             Type of horizontal interpolation method                nn_2dint = ', sdobsgroup%n2dint
437            IF ( sdobsgroup%n2dint <= 4 ) THEN
438               WRITE(numout,*) '                model counterparts will be interpolated horizontally'
439            ELSE
440               WRITE(numout,*) '                model counterparts will be averaged horizontally'
441            ENDIF
442            WRITE(numout,*) '          Settings only for surface data, which is ', sdobsgroup%lsurf
443            WRITE(numout,*) '             Obs footprint in deg [T] or m [F]                  ln_fp_indegs = ', sdobsgroup%lfp_indegs
444            WRITE(numout,*) '             E/W diameter of obs footprint                      rn_avglamscl = ', sdobsgroup%ravglamscl
445            WRITE(numout,*) '             N/S diameter of obs footprint                      rn_avgphiscl = ', sdobsgroup%ravgphiscl
446            WRITE(numout,*) '             Logical switch for night-time average                  ln_night = ', sdobsgroup%lnight
447            WRITE(numout,*) '             Logical switch for time-mean background        ln_time_mean_bkg = ', sdobsgroup%ltime_mean_bkg
448            WRITE(numout,*) '             Meaning period (hours) for time-mean bkg    rn_time_mean_period = ', sdobsgroup%rtime_mean_period
449            WRITE(numout,*) '             Logical switch for bias correction                   ln_obsbias = ', sdobsgroup%lobsbias
450            IF ( sdobsgroup%lobsbias ) THEN
451               WRITE(numout,*) '             Observation type to be bias corrected    cn_type_to_biascorrect = ', TRIM(sdobsgroup%cobstypes(sdobsgroup%nbiasvar))
452               WRITE(numout,*) '             Bias variable name in bias files         cn_obsbiasfile_varname = ', TRIM(sdobsgroup%cbiasvarname)
453               WRITE(numout,*) '             Bias files in group:', sdobsgroup%nobsbiasfiles
454               DO jfile = 1, sdobsgroup%nobsbiasfiles
455                  WRITE(numout,*) '                ', TRIM(sdobsgroup%cobsbiasfiles(jfile))
456               END DO
457            ENDIF
458            WRITE(numout,*) '          Settings only for profile data, which is ', sdobsgroup%lprof
459            WRITE(numout,*) '             Type of vertical interpolation method                  nn_1dint = ', sdobsgroup%n1dint
460            WRITE(numout,*) '             Daily average types                             nn_profdavtypes = ', sdobsgroup%nprofdavtypes
461            WRITE(numout,*) '             Logical switch to compute all vars at all pts     ln_all_at_all = ', sdobsgroup%lall_at_all
462            WRITE(numout,*) '          Settings only for SLA data, which is ', sdobsgroup%lsla
463            WRITE(numout,*) '             Logical switch for alt bias                          ln_altbias = ', sdobsgroup%laltbias
464            WRITE(numout,*) '             Alt bias file name                               cn_altbiasfile = ', TRIM(sdobsgroup%caltbiasfile)
465            WRITE(numout,*) '             MSSH correction scheme                                 nn_msshc = ', sdobsgroup%nmsshc
466            WRITE(numout,*) '             MDT  correction                                      rn_mdtcorr = ', sdobsgroup%rmdtcorr
467            WRITE(numout,*) '             MDT cutoff for computed correction                 rn_mdtcutoff = ', sdobsgroup%rmdtcutoff
468            WRITE(numout,*) '          Settings only for temperature/salinity data'
469            WRITE(numout,*) '             Logical switch for outputting climatology        ln_output_clim = ', sdobsgroup%loutput_clim
470
471            IF ( (       sdobsgroup%lsurf .AND.       sdobsgroup%lprof ) .OR. &
472               & ( .NOT. sdobsgroup%lsurf .AND. .NOT. sdobsgroup%lprof ) ) THEN
473               CALL ctl_stop( ' One and only one of ln_surf or ln_prof must be set per observation group' )
474            ENDIF
475
476            IF ( sdobsgroup%nobstypes == 0 ) THEN
477               CALL ctl_stop( ' No observation types specified for this observation group' )
478            ENDIF
479
480            IF ( sdobsgroup%nobsfiles == 0 ) THEN
481               CALL ctl_stop( ' No observation files specified for this observation group' )
482            ENDIF
483
484            IF ( (sdobsgroup%lobsbias) .AND. (sdobsgroup%nobsbiasfiles == 0) ) THEN
485               CALL ctl_stop( ' No bias files specified for this observation group' )
486            ENDIF
487
488            IF ( (sdobsgroup%n2dint < 0) .OR. (sdobsgroup%n2dint > 6) ) THEN
489               CALL ctl_stop( ' Invalid horizontal interpolation type' )
490            ENDIF
491
492            IF( (sdobsgroup%n1dint < 0) .OR. (sdobsgroup%n1dint > 1) ) THEN
493               CALL ctl_stop(' Invalid vertical interpolation type')
494            ENDIF
495
496            IF ( (sdobsgroup%n2dint > 4) .AND. (sdobsgroup%n2dint <= 6) ) THEN
497               IF ( sdobsgroup%ravglamscl <= 0._wp ) THEN
498                  CALL ctl_stop( ' Incorrect value set for averaging footprint scale rn_avglamscl' )
499               ENDIF
500               IF ( sdobsgroup%ravgphiscl <= 0._wp ) THEN
501                  CALL ctl_stop( ' Incorrect value set for averaging footprint scale rn_avgphiscl' )
502               ENDIF
503            ENDIF
504
505            IF ( sdobsgroup%lsla .AND. sdobsgroup%laltbias ) THEN
506               IF ( TRIM(sdobsgroup%caltbiasfile) == '' ) THEN
507                  CALL ctl_stop( ' No altimeter bias file specified' )
508               ENDIF
509            ENDIF
510
511            IF( sdobsgroup%lvel .AND. (.NOT. ln_grid_global) ) THEN
512               CALL ctl_stop( ' Velocity data only works with ln_grid_global=.true.' )
513            ENDIF
514
515         ENDIF
516
517      ENDIF
518
519   END SUBROUTINE obs_group_check
520
521END MODULE obs_group_def
Note: See TracBrowser for help on using the repository browser.