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_generic_obs/src/OCE/OBS – NEMO

source: NEMO/branches/UKMO/NEMO_4.0.4_generic_obs/src/OCE/OBS/obs_group_def.F90 @ 15240

Last change on this file since 15240 was 15240, checked in by dford, 3 years ago

Add option to use time mean background.

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