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_field.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_field.F90 @ 15187

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

Update treatment of SLA and POTM additional/extra variables.

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