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.
Changeset 3000 – NEMO

Changeset 3000


Ignore:
Timestamp:
2011-10-26T15:44:20+02:00 (13 years ago)
Author:
djlea
Message:

Updated obstools. Addition of headers to programs which explain what each utility does and how to run it. All the programs now build using the naketools utility.

Location:
branches/dev_2802_OBStools/NEMOGCM/TOOLS/OBSTOOLS/src
Files:
33 added
4 deleted
13 edited

Legend:

Unmodified
Added
Removed
  • branches/dev_2802_OBStools/NEMOGCM/TOOLS/OBSTOOLS/src/convmerge.F90

    r2945 r3000  
    33   USE toolspar_kind 
    44   USE obs_fbm 
     5   USE obs_utils 
    56   IMPLICIT NONE 
    67 
     
    1819      !!  ** Action  : 
    1920      !! 
     21      !!   Optional : 
     22      !!     namelist = namobs.in    to select the observation range  
     23      !! 
    2024      !!   History : 
     25      !!        ! 2010 (K. Mogensen) Initial version 
    2126      !!---------------------------------------------------------------------- 
    2227      !! * Arguments 
     
    122127#include "greg2jul.h90" 
    123128 
    124 #include "ddatetoymdhms.h90" 
     129!#include "ddatetoymdhms.h90" 
    125130 
    126131END MODULE convmerge 
  • branches/dev_2802_OBStools/NEMOGCM/TOOLS/OBSTOOLS/src/corio2fb.F90

    r2945 r3000  
    11PROGRAM corio2fb 
     2   !!--------------------------------------------------------------------- 
     3   !! 
     4   !!                     ** PROGRAM corio2fb ** 
     5   !! 
     6   !!  ** Purpose : Convert Coriolis format profiles to feedback format 
     7   !! 
     8   !!  ** Method  : Use of utilities from obs_fbm. 
     9   !! 
     10   !!  ** Action  : 
     11   !! 
     12   !!   Usage: 
     13   !!     corio2fb.exe outputfile inputfile1 inputfile2 ... 
     14   !! 
     15   !!   History : 
     16   !!        ! 2010 (K. Mogensen) Initial version 
     17   !!---------------------------------------------------------------------- 
    218   USE obs_fbm 
    319   USE obs_prof_io 
  • branches/dev_2802_OBStools/NEMOGCM/TOOLS/OBSTOOLS/src/ctl_stop.h90

    r2945 r3000  
    1010      !!  ** Action  : 
    1111      !! 
    12       !!   History :   (08-12) K. Mogensen. NEMOVAR version 
     12      !!   History :   (2008-12) K. Mogensen. NEMOVAR version 
    1313      !!---------------------------------------------------------------------- 
    1414      CHARACTER(len=*) :: cerr 
  • branches/dev_2802_OBStools/NEMOGCM/TOOLS/OBSTOOLS/src/enact2fb.F90

    r2945 r3000  
    11PROGRAM enact2fb 
     2   !!--------------------------------------------------------------------- 
     3   !! 
     4   !!                     ** PROGRAM corio2fb ** 
     5   !! 
     6   !!  ** Purpose : Convert ENACT format profiles to feedback format 
     7   !! 
     8   !!  ** Method  : Use of utilities from obs_fbm. 
     9   !! 
     10   !!  ** Action  : 
     11   !! 
     12   !!   Usage: 
     13   !!     enact2fb.exe outputfile inputfile1 inputfile2 ... 
     14   !! 
     15   !!   History : 
     16   !!        ! 2010 (K. Mogensen) Initial version 
     17   !!---------------------------------------------------------------------- 
    218   USE obs_fbm 
    319   USE obs_prof_io 
  • branches/dev_2802_OBStools/NEMOGCM/TOOLS/OBSTOOLS/src/fbaccdata.F90

    r2945 r3000  
    11MODULE fbaccdata 
    2    INTEGER, DIMENSION(:,:,:,:), ALLOCATABLE :: inum 
    3    REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: zmean,zrms,zsdev 
     2   USE fbacctype 
     3   IMPLICIT NONE 
     4   INTEGER, DIMENSION(:,:,:,:,:), ALLOCATABLE :: inum,inumov,inumbv 
     5   INTEGER, DIMENSION(:,:,:,:), ALLOCATABLE :: inuma 
     6   REAL, DIMENSION(:,:,:,:,:), ALLOCATABLE :: zbias,zrms,zsdev,zomean,zmmean,& 
     7      & zoemea,zovmea,zbemea,zbvmea 
     8   REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: zoamean 
    49   INTEGER, PARAMETER :: maxvars = 10 
    510   REAL, DIMENSION(maxvars) :: zcheck 
    611   REAL, DIMENSION(maxvars) :: zhistmax, zhistmin, zhiststep 
    7    TYPE histtype 
    8       INTEGER :: npoints 
    9       INTEGER, POINTER, DIMENSION(:,:,:,:) :: nhist 
    10    END TYPE histtype 
    1112   TYPE(histtype), DIMENSION(maxvars) :: hist 
    12  
     13   REAL, DIMENSION(maxvars) :: zxymax, zxymin, zxystep 
     14   TYPE(xytype), DIMENSION(maxvars) :: xy 
    1315END MODULE fbaccdata 
    1416 
  • branches/dev_2802_OBStools/NEMOGCM/TOOLS/OBSTOOLS/src/fbcomb.F90

    r2945 r3000  
    11PROGRAM fbcomb 
     2   !!--------------------------------------------------------------------- 
     3   !! 
     4   !!                     ** PROGRAM fbcomb ** 
     5   !! 
     6   !!  ** Purpose : Combine MPI decomposed feedback files into one file 
     7   !! 
     8   !!  ** Method  : Use of utilities from obs_fbm. 
     9   !! 
     10   !!  ** Action  :  
     11   !! 
     12   !!   Usage: 
     13   !!     fbcomb.exe outputfile inputfile1 inputfile2 ... 
     14   !! 
     15   !!   History : 
     16   !!        ! 2010 (K. Mogensen) Initial version 
     17   !!---------------------------------------------------------------------- 
    218   USE toolspar_kind 
    319   USE obs_fbm 
     
    2339   REAL(KIND=dp),ALLOCATABLE :: zsort(:,:) 
    2440   INTEGER,ALLOCATABLE  :: iset(:),inum(:),iindex(:) 
     41   INTEGER :: iwmo 
    2542   ! 
    2643   ! Output data 
     
    3047   ! Loop variables 
    3148   ! 
    32    INTEGER :: ia,iv,ii,ij, ist 
     49   INTEGER :: ia,iv,ii,ij 
    3350   ! 
    3451   ! Get number of command line arguments 
     
    4865   ntotobs = 0 
    4966   ninfiles = nargs - 1 
    50    ist=-1 
    5167   DO ia=1, ninfiles 
    5268      CALL getarg( ia+1, cdinfile(ia) ) 
     
    5571      WRITE(*,'(2A)')'File = ', TRIM(cdinfile(ia)) 
    5672      WRITE(*,'(A,I9,A)')'has', obsdata(ia)%nobs, ' observations' 
    57       IF (obsdata(ia)%nobs > 0 .AND. ist < 0) ist=ia             ! find first file with obs in 
    5873      ntotobs = ntotobs + obsdata(ia)%nobs 
    5974   ENDDO 
     
    6277   ! Check that the data is confirming 
    6378   ! 
    64    DO ia=ist+1, ninfiles 
    65       IF ( obsdata(ia)%cdjuldref /= obsdata(ist)%cdjuldref ) THEN 
     79   DO ia=2, ninfiles 
     80      IF ( obsdata(ia)%cdjuldref /= obsdata(1)%cdjuldref ) THEN 
    6681         WRITE(*,*)'Different julian date reference. Aborting' 
    6782         CALL abort 
    6883      ENDIF 
    69       IF ( obsdata(ia)%nvar /= obsdata(ist)%nvar ) THEN 
     84      IF ( obsdata(ia)%nvar /= obsdata(1)%nvar ) THEN 
    7085         WRITE(*,*)'Different number of variables. Aborting' 
    7186         CALL abort 
    7287      ENDIF 
    73       IF  (obsdata(ia)%nadd /= obsdata(ist)%nadd ) THEN 
     88      IF  (obsdata(ia)%nadd /= obsdata(1)%nadd ) THEN 
    7489         WRITE(*,*)'Different number of additional entries. Aborting' 
    7590         CALL abort 
    7691      ENDIF 
    77       IF ( obsdata(ia)%next /= obsdata(ist)%next ) THEN 
     92      IF ( obsdata(ia)%next /= obsdata(1)%next ) THEN 
    7893         WRITE(*,*)'Different number of additional variables. Aborting' 
    7994         CALL abort 
    8095      ENDIF 
    81       IF ( obsdata(ia)%lgrid .NEQV. obsdata(ist)%lgrid ) THEN 
     96      IF ( obsdata(ia)%lgrid .NEQV. obsdata(1)%lgrid ) THEN 
    8297         WRITE(*,*)'Inconsistent grid search info. Aborting' 
    8398         CALL abort 
    8499      ENDIF 
    85100      DO iv=1, obsdata(ia)%nvar 
    86          IF ( obsdata(ia)%cname(iv) /= obsdata(ist)%cname(iv) ) THEN 
     101         IF ( obsdata(ia)%cname(iv) /= obsdata(1)%cname(iv) ) THEN 
    87102            WRITE(*,*)'Variable name ', TRIM(obsdata(ia)%cname(iv)), & 
    88                &      ' is different from ', TRIM(obsdata(ist)%cname(iv)), & 
     103               &      ' is different from ', TRIM(obsdata(1)%cname(iv)), & 
    89104               &      '. Aborting' 
    90105            CALL abort 
    91106         ENDIF 
    92          IF ( obsdata(ist)%lgrid .AND. obsdata(ia)%nobs > 0) THEN 
    93             IF ( obsdata(ia)%cgrid(iv) /= obsdata(ist)%cgrid(iv) ) THEN 
    94                WRITE(*,*)'Grid name ', TRIM(obsdata(ia)%cgrid(iv)), & 
    95                   &      ' is different from ', TRIM(obsdata(ist)%cgrid(iv)), & 
    96                   &      '. Aborting' 
    97                CALL abort 
     107         IF ( obsdata(1)%lgrid ) THEN 
     108            IF ( obsdata(ia)%cgrid(iv) /= obsdata(1)%cgrid(iv) ) THEN 
     109               IF (obsdata(1)%nobs==0) THEN 
     110                  obsdata(1)%cgrid(iv) = obsdata(ia)%cgrid(iv) 
     111               ELSE 
     112                  IF (obsdata(ia)%nobs>0) THEN 
     113                     WRITE(*,*)'Grid name ', TRIM(obsdata(ia)%cgrid(iv)), & 
     114                        &      ' is different from ', & 
     115                        &      TRIM(obsdata(1)%cgrid(iv)), '. Aborting' 
     116                     CALL abort 
     117                  ENDIF 
     118               ENDIF 
    98119            ENDIF 
    99120         ENDIF 
    100121      ENDDO 
    101122      DO iv=1,obsdata(ia)%nadd 
    102          IF ( obsdata(ia)%caddname(iv) /= obsdata(ist)%caddname(iv) ) THEN 
     123         IF ( obsdata(ia)%caddname(iv) /= obsdata(1)%caddname(iv) ) THEN 
    103124            WRITE(*,*)'Additional name ', TRIM(obsdata(ia)%caddname(iv)), & 
    104                &      ' is different from ', TRIM(obsdata(ist)%caddname(iv)), & 
     125               &      ' is different from ', TRIM(obsdata(1)%caddname(iv)), & 
    105126               &      '. Aborting' 
    106127            CALL abort 
     
    108129      ENDDO 
    109130      DO iv=1,obsdata(ia)%next 
    110          IF ( obsdata(ia)%cextname(iv) /= obsdata(ist)%cextname(iv) ) THEN 
     131         IF ( obsdata(ia)%cextname(iv) /= obsdata(1)%cextname(iv) ) THEN 
    111132            WRITE(*,*)'Extra name ', TRIM(obsdata(ia)%cextname(iv)), & 
    112                &      ' is different from ', TRIM(obsdata(ist)%cextname(iv)), & 
     133               &      ' is different from ', TRIM(obsdata(1)%cextname(iv)), & 
    113134               &      '. Aborting' 
    114135            CALL abort 
     
    119140   ! Construct sorting arrays 
    120141   ! 
    121    ALLOCATE( zsort(3,ntotobs), iset(ntotobs), & 
     142   ALLOCATE( zsort(5,ntotobs), iset(ntotobs), & 
    122143      & inum(ntotobs), iindex(ntotobs)) 
    123144   ii = 0 
     
    128149         zsort(2,ii) = obsdata(ia)%pphi(ij) 
    129150         zsort(3,ii) = obsdata(ia)%plam(ij) 
     151         iwmo = TRANSFER( obsdata(ia)%cdwmo(ij)(1:4), iwmo ) 
     152         zsort(4,ii) = iwmo 
     153         iwmo = TRANSFER( obsdata(ia)%cdwmo(ij)(5:8), iwmo ) 
     154         zsort(5,ii) = iwmo 
    130155         iset(ii) = ia 
    131156         inum(ii) = ij 
     
    135160   ! Get indexes for time sorting. 
    136161   ! 
    137    CALL index_sort_dp_n(zsort,3,iindex,ntotobs) 
     162   CALL index_sort_dp_n(zsort,5,iindex,ntotobs) 
    138163   ! 
    139164   ! Allocate output data 
     
    144169   ENDDO 
    145170   CALL init_obfbdata( obsoutdata ) 
    146    CALL alloc_obfbdata( obsoutdata, obsdata(ist)%nvar, ntotobs, nlev, & 
    147       &                 obsdata(ist)%nadd, obsdata(ist)%next, obsdata(ist)%lgrid ) 
     171   CALL alloc_obfbdata( obsoutdata, obsdata(1)%nvar, ntotobs, nlev, & 
     172      &                 obsdata(1)%nadd, obsdata(1)%next, obsdata(1)%lgrid ) 
    148173   ! 
    149174   ! Copy input data into output data 
  • branches/dev_2802_OBStools/NEMOGCM/TOOLS/OBSTOOLS/src/fbmatchup.F90

    r2945 r3000  
    11PROGRAM fbmatchup 
     2   !!--------------------------------------------------------------------- 
     3   !! 
     4   !!                     ** PROGRAM fbmatchup ** 
     5   !! 
     6   !!  ** Purpose : Find matching obs in feedback files 
     7   !! 
     8   !!  ** Method  : Use of utilities from obs_fbm. 
     9   !! 
     10   !!  ** Action  : 
     11   !!  
     12   !!   Usage: 
     13   !!     fbmatchup outputfile inputfile1 varname1 inputfile2 varname2 ... 
     14   !! 
     15   !!   Optional:  
     16   !!     namelist = namfbmatchup.in       to set ldaily820 
     17   !! 
     18   !!   History : 
     19   !!        ! 2010 (K. Mogensen) Initial version 
     20   !!---------------------------------------------------------------------- 
    221   USE toolspar_kind 
    322   USE obs_fbm 
     
    1433   CHARACTER(len=256),ALLOCATABLE :: cdinfile(:) 
    1534   CHARACTER(len=ilenname),ALLOCATABLE :: cdnames(:) 
    16    INTEGER :: nqc 
     35   CHARACTER(len=2*ilenname) :: cdtmp 
    1736   LOGICAL :: ldaily820 
    18    NAMELIST/namfbmatchup/nqc,ldaily820 
     37   NAMELIST/namfbmatchup/ldaily820 
    1938   ! 
    2039   ! Input data 
     
    2241   TYPE(obfbdata)         :: obsdatatmp(1) 
    2342   TYPE(obfbdata),POINTER :: obsdata(:) 
    24    INTEGER :: ninfiles,ntotobs,nlev 
     43   INTEGER :: ninfiles,ntotobs,nlev,nadd,next 
    2544   ! 
    2645   ! Time sorting arrays 
     
    3554   REAL(KIND=fbsp) :: ztim,zphi,zlam 
    3655   INTEGER(KIND=SELECTED_INT_KIND(12)) :: iwmo 
     56   LOGICAL, ALLOCATABLE :: ltaken(:) 
    3757   ! 
    3858   ! Output data 
     
    4060   TYPE(obfbdata) :: obsoutdata 
    4161   ! 
     62   ! Storage for extra to search for unique. 
     63   ! 
     64   CHARACTER(len=ilenname), ALLOCATABLE :: cexttmp(:) 
     65   TYPE extout 
     66      LOGICAL, POINTER, DIMENSION(:) :: luse 
     67      INTEGER, POINTER, DIMENSION(:) :: ipos 
     68   END TYPE extout 
     69   TYPE(extout), POINTER, DIMENSION(:) :: pextinf 
     70   ! 
    4271   ! Loop variables 
    4372   ! 
    44    INTEGER :: ia,ip,i1,ii,ij,ik1,ik2,iv,ist 
     73   INTEGER :: ifi,ia,ip,i1,ii,ij,ik1,ik2,iv,ist,iadd,ie,iext 
    4574   LOGICAL :: llfound 
    46    LOGICAL :: lexists 
     75   LOGICAL :: lexists,lnotobs 
    4776   INTEGER :: ityp 
    4877   ! 
     
    5988   ! Read namelist if present 
    6089   ! 
    61    nqc=1 
    6290   ldaily820=.FALSE. 
    6391   INQUIRE(file='namfbmatchup.in',exist=lexists) 
     
    7199   ! Get input data 
    72100   ! 
    73    ninfiles = ( nargs -1 )/ 2 
     101   ninfiles = ( nargs -1 ) / 2 
    74102   ALLOCATE( obsdata( ninfiles ) ) 
    75103   ALLOCATE( cdinfile( ninfiles ) ) 
    76104   ALLOCATE( cdnames( ninfiles ) ) 
    77105   ip = 1 
    78    DO ia=1, ninfiles 
     106   DO ifi = 1, ninfiles 
    79107      ! 
    80108      ! Read the unsorted file 
    81109      ! 
    82110      ip = ip + 1 
    83       CALL getarg( ip, cdinfile(ia) ) 
     111      CALL getarg( ip, cdinfile(ifi) ) 
    84112      ip = ip + 1 
    85       CALL getarg( ip, cdnames(ia) ) 
     113      CALL getarg( ip, cdnames(ifi) ) 
    86114      CALL init_obfbdata( obsdatatmp(1) ) 
    87       CALL read_obfbdata( TRIM(cdinfile(ia)), obsdatatmp(1) ) 
    88       ! 
    89       ! Check that only one variable present in input file 
    90       ! 
    91       IF ( obsdatatmp(1)%nadd > 1 ) THEN 
    92          WRITE(*,*)'Warning. More than one variable in input file' 
    93          WRITE(*,*)'Number of variables = ', obsdatatmp(1)%nadd 
    94          WRITE(*,*)'Only the first one is going to be stored' 
    95       ENDIF 
    96       IF ( obsdatatmp(1)%nadd < 1 ) THEN 
    97          WRITE(*,*)'Error. less than one variable in input file' 
    98          CALL abort 
    99       ENDIF 
    100       ! 
    101       ! Check that we have few levels than in the first file 
    102       ! 
    103       IF ( ia > 1 )  THEN 
     115      CALL read_obfbdata( TRIM(cdinfile(ifi)), obsdatatmp(1) ) 
     116      ! 
     117      ! Check if we have fewer levels than in the first file 
     118      ! 
     119      IF ( ifi > 1 )  THEN 
    104120         IF ( obsdatatmp(1)%nlev > obsdata(1)%nlev ) THEN 
    105121            WRITE(*,*)'Warning. More levels in file than the first file' 
     
    111127      ENDIF 
    112128      ! 
    113       ! Check that we have few observations than in the first file 
    114       ! 
    115       IF ( ia > 1 )  THEN 
     129      ! Check if we have fewer observations than in the first file 
     130      ! 
     131      IF ( ifi > 1 )  THEN 
    116132         IF ( obsdatatmp(1)%nobs > obsdata(1)%nobs ) THEN 
    117133            WRITE(*,*)'Warning. More obs in file than the first file' 
     
    125141      ! Check that we have the same number of variables 
    126142      ! 
    127       IF ( ia > 1 )  THEN 
     143      IF ( ifi > 1 )  THEN 
    128144         IF ( obsdatatmp(1)%nvar /= obsdata(1)%nvar ) THEN 
    129145            WRITE(*,*)'Error. Different number of variables.' 
     
    136152      ! Check reference datas 
    137153      ! 
    138       IF ( ia > 1 )  THEN 
     154      IF ( ifi > 1 )  THEN 
    139155         IF ( obsdatatmp(1)%cdjuldref /= obsdata(1)%cdjuldref ) THEN 
    140156            WRITE(*,*)'Different reference dates' 
     
    145161      ! Special fix for daily average MRB data (820) for the first file 
    146162      ! 
    147       IF (ldaily820.AND.(ia==1)) THEN 
     163      IF (ldaily820.AND.(ifi==1)) THEN 
    148164         DO ij = 1,obsdatatmp(1)%nobs 
    149165            READ(obsdatatmp(1)%cdtyp(ij),'(I5)')ityp 
     
    171187      ! 
    172188      CALL index_sort_dp_n(zsort,3,iindex,obsdatatmp(1)%nobs) 
    173       CALL init_obfbdata( obsdata(ia) ) 
    174       CALL alloc_obfbdata( obsdata(ia), & 
     189      CALL init_obfbdata( obsdata(ifi) ) 
     190      CALL alloc_obfbdata( obsdata(ifi), & 
    175191         &                 obsdatatmp(1)%nvar, obsdatatmp(1)%nobs, & 
    176192         &                 obsdatatmp(1)%nlev, obsdatatmp(1)%nadd, & 
     
    179195      ! Copy input data into output data 
    180196      ! 
    181       CALL merge_obfbdata( 1, obsdatatmp, obsdata(ia), iset, inum, iindex ) 
     197      CALL merge_obfbdata( 1, obsdatatmp, obsdata(ifi), iset, inum, iindex ) 
    182198      CALL dealloc_obfbdata( obsdatatmp(1) ) 
    183199       
    184       WRITE(*,'(2A)')'File = ', TRIM(cdinfile(ia)) 
    185       WRITE(*,'(A,I9,A)')'has', obsdata(ia)%nobs, ' observations' 
     200      WRITE(*,'(2A)')'File = ', TRIM(cdinfile(ifi)) 
     201      WRITE(*,'(A,I9,A)')'has', obsdata(ifi)%nobs, ' observations' 
    186202 
    187203      DEALLOCATE( zsort, iset, inum, iindex ) 
     
    190206   ! 
    191207   ! Prepare output data 
    192    ! 
     208   !  
    193209   CALL init_obfbdata( obsoutdata ) 
    194210   ! 
     211   ! Count number of additional fields 
     212   ! 
     213   nadd = 0 
     214   DO ifi = 1, ninfiles 
     215      nadd = nadd + obsdata(ifi)%nadd 
     216   ENDDO 
     217   ! 
     218   ! Count number of unique extra fields 
     219   ! 
     220   ! First the maximum to construct list 
     221   next = 0 
     222   DO ifi = 1, ninfiles 
     223      next = next + obsdata(ifi)%next 
     224   ENDDO 
     225   ALLOCATE( & 
     226      & cexttmp(next) & 
     227      & ) 
     228   ! Setup pextinf structure and search for unique extra fields 
     229   ALLOCATE( & 
     230      & pextinf(ninfiles) & 
     231      & ) 
     232   next = 0 
     233   DO ifi = 1, ninfiles 
     234      ALLOCATE( & 
     235         & pextinf(ifi)%luse(obsdata(ifi)%next), & 
     236         & pextinf(ifi)%ipos(obsdata(ifi)%next)  & 
     237         & ) 
     238      DO ie = 1, obsdata(ifi)%next 
     239         llfound = .FALSE. 
     240         DO ii = 1, next 
     241            IF ( cexttmp(ii) == obsdata(ifi)%cextname(ie) ) THEN 
     242               llfound = .TRUE. 
     243            ENDIF 
     244         ENDDO 
     245         IF (llfound) THEN 
     246            pextinf(ifi)%luse(ie) = .FALSE. 
     247            pextinf(ifi)%ipos(ie) = -1 
     248         ELSE 
     249            next = next + 1 
     250            pextinf(ifi)%luse(ie) = .TRUE. 
     251            pextinf(ifi)%ipos(ie) = next 
     252            cexttmp(next) = obsdata(ifi)%cextname(ie) 
     253         ENDIF 
     254      ENDDO 
     255   ENDDO 
     256   ! 
    195257   ! Copy the first input data to output data 
    196258   ! 
    197259   CALL copy_obfbdata( obsdata(1), obsoutdata, & 
    198       &                kadd = ninfiles ) 
    199    DO ia = 1, ninfiles 
    200       obsoutdata%caddname(ia) = cdnames(ia) 
    201       obsoutdata%caddlong(ia,:) = obsdata(ia)%caddlong(1,:) 
    202       obsoutdata%caddunit(ia,:) = obsdata(ia)%caddunit(1,:) 
     260      &                kadd = nadd, kext = next ) 
     261   ALLOCATE( ltaken(obsoutdata%nlev) ) 
     262   iadd = 0 
     263   DO ifi = 1, ninfiles 
     264      DO ia = 1, obsdata(ifi)%nadd 
     265         cdtmp = TRIM(obsdata(ifi)%caddname(ia))//TRIM(cdnames(ifi)) 
     266         obsoutdata%caddname(iadd+ia) = cdtmp(1:ilenname) 
     267         DO iv = 1, obsdata(ifi)%nvar 
     268            obsoutdata%caddlong(iadd+ia,iv) = obsdata(ifi)%caddlong(ia,iv) 
     269            obsoutdata%caddunit(iadd+ia,iv) = obsdata(ifi)%caddunit(ia,iv) 
     270         ENDDO 
     271      ENDDO 
     272      DO ie = 1, obsdata(ifi)%next 
     273         IF ( pextinf(ifi)%luse(ie) ) THEN 
     274            obsoutdata%cextname(pextinf(ifi)%ipos(ie)) = & 
     275               & obsdata(ifi)%cextname(ie) 
     276            obsoutdata%cextlong(pextinf(ifi)%ipos(ie)) = & 
     277               & obsdata(ifi)%cextlong(ie) 
     278            obsoutdata%cextunit(pextinf(ifi)%ipos(ie)) = & 
     279               & obsdata(ifi)%cextunit(ie) 
     280         ENDIF 
     281      ENDDO 
     282      iadd = iadd + obsdata(ifi)%nadd 
    203283   ENDDO 
    204284   ! 
     
    220300   ! Merge extra data into output data 
    221301   ! 
    222    DO ia = 2, ninfiles 
     302   iadd = obsdata(1)%nadd 
     303   DO ifi = 2, ninfiles 
    223304      ist = 1 
    224       DO ii = 1, obsdata(ia)%nobs 
     305      DO ii = 1, obsdata(ifi)%nobs 
    225306         IF (MOD(ii,10000)==1) THEN 
    226             WRITE(*,*)'Handling observation no ',ii,' for file no ',ia 
     307            WRITE(*,*)'Handling observation no ',ii,' for file no ',ifi 
    227308         ENDIF 
    228309         llfound = .FALSE. 
    229          iwmo = TRANSFER( obsdata(ia)%cdwmo(ii), iwmo ) 
    230          ztim = REAL( obsdata(ia)%ptim(ii), fbsp ) 
    231          zphi = REAL( obsdata(ia)%pphi(ii), fbsp ) 
    232          zlam = REAL( obsdata(ia)%plam(ii), fbsp )  
     310         iwmo = TRANSFER( obsdata(ifi)%cdwmo(ii), iwmo ) 
     311         ztim = REAL( obsdata(ifi)%ptim(ii), fbsp ) 
     312         zphi = REAL( obsdata(ifi)%pphi(ii), fbsp ) 
     313         zlam = REAL( obsdata(ifi)%plam(ii), fbsp )  
    233314         ! Check if the the same index is the right one. 
    234315         IF ( iwmo == irwmo(ii) ) THEN 
     
    237318                  IF ( zlam == zrlam(ii) ) THEN 
    238319                     llfound = .TRUE. 
    239                      DO iv = 1, obsdata(ia)%nvar 
    240                         ! Since the inner loop don't change the 
    241                         ! qc decisions use this to ensure match 
    242                         ! for duplicate observations 
    243                         IF ( obsdata(ia)%ivqc(ii,iv) /= & 
    244                            & obsoutdata%ivqc(ii,iv)) THEN 
    245                            llfound = .FALSE. 
    246                            CYCLE 
    247                         ENDIF 
    248                      ENDDO 
    249                      IF (llfound) i1 = ii 
     320                     i1 = ii 
    250321                  ENDIF 
    251322               ENDIF 
     
    261332                        IF ( zlam == zrlam(i1) ) THEN 
    262333                           llfound = .TRUE. 
    263                            DO iv = 1, obsdata(ia)%nvar 
    264                               ! Since the inner loop don't change the 
    265                               ! qc decisions use this to ensure match 
    266                               ! for duplicate observations 
    267                               IF ( obsdata(ia)%ivqc(ii,iv) /= & 
    268                                  & obsoutdata%ivqc(i1,iv)) THEN 
    269                                  llfound = .FALSE. 
    270                                  WRITE (*,*)'QC flags different for ',& 
    271                                     &  TRIM(obsdata(ia)%cdwmo(ii)),' at ', & 
    272                                     & obsdata(ia)%ptim(ii) 
    273                                  CYCLE 
    274                               ENDIF 
    275                            ENDDO 
    276                            IF (llfound) EXIT 
     334                           EXIT 
    277335                        ENDIF 
    278336                     ENDIF 
     
    289347                        IF ( zlam == zrlam(i1) ) THEN 
    290348                           llfound = .TRUE. 
    291                            DO iv = 1, obsdata(ia)%nvar 
    292                               ! Since the inner loop don't change the 
    293                               ! qc decisions use this to ensure match 
    294                               ! for duplicate observations 
    295                               IF ( obsdata(ia)%ivqc(ii,iv) /= & 
    296                                  & obsoutdata%ivqc(i1,iv)) THEN 
    297                                  llfound = .FALSE. 
    298                                  WRITE (*,*)'QC flags different for ',& 
    299                                     &  TRIM(obsdata(ia)%cdwmo(ii)),' at ', & 
    300                                     & obsdata(ia)%ptim(ii) 
    301                                  CYCLE 
    302                               ENDIF 
    303                            ENDDO 
    304                            IF (llfound) EXIT 
     349                           EXIT 
    305350                        ENDIF 
    306351                     ENDIF 
     
    311356         ! If found put the data into the common structure 
    312357         IF (llfound) THEN 
    313             IF ( nqc == ia ) THEN 
    314                obsoutdata%ioqc(i1)   = obsdata(ia)%ioqc(ii) 
    315                obsoutdata%ipqc(i1)   = obsdata(ia)%ipqc(ii) 
    316                obsoutdata%itqc(i1)   = obsdata(ia)%itqc(ii) 
    317                obsoutdata%ivqc(i1,:) = obsdata(ia)%ivqc(ii,:) 
    318             ENDIF 
    319             obsoutdata%ioqcf(:,i1)   = IOR( obsdata(ia)%ioqcf(:,ii), & 
     358            obsoutdata%ioqc(i1) = &  
     359               & MAX( obsoutdata%ioqc(i1), obsdata(ifi)%ioqc(ii) ) 
     360            obsoutdata%ipqc(i1) = & 
     361               & MAX( obsoutdata%ipqc(i1), obsdata(ifi)%ipqc(ii) ) 
     362            obsoutdata%itqc(i1) = & 
     363               & MAX( obsoutdata%itqc(i1), obsdata(ifi)%itqc(ii) ) 
     364            obsoutdata%ivqc(i1,:) = & 
     365               & MAX( obsoutdata%ivqc(i1,:), obsdata(ifi)%ivqc(ii,:) ) 
     366            obsoutdata%ioqcf(:,i1)   = IOR( obsdata(ifi)%ioqcf(:,ii), & 
    320367               &                            obsoutdata%ioqcf(:,i1) ) 
    321             obsoutdata%ipqcf(:,i1)   = IOR( obsdata(ia)%ipqcf(:,ii), & 
     368            obsoutdata%ipqcf(:,i1)   = IOR( obsdata(ifi)%ipqcf(:,ii), & 
    322369               &                            obsoutdata%ipqcf(:,i1) ) 
    323             obsoutdata%itqcf(:,i1)   = IOR( obsdata(ia)%itqcf(:,ii), & 
     370            obsoutdata%itqcf(:,i1)   = IOR( obsdata(ifi)%itqcf(:,ii), & 
    324371               &                            obsoutdata%itqcf(:,i1) ) 
    325             obsoutdata%ivqcf(:,i1,:) = IOR( obsdata(ia)%ivqcf(:,ii,:), & 
     372            obsoutdata%ivqcf(:,i1,:) = IOR( obsdata(ifi)%ivqcf(:,ii,:), & 
    326373               &                            obsoutdata%ivqcf(:,i1,:) ) 
    327374            llfound = .FALSE. 
    328             ! Search for levels 
    329             DO ik1 = 1, obsdata(ia)%nlev 
    330                DO ik2 = 1, obsoutdata%nlev 
    331                   IF ( REAL( obsdata(ia)%pdep(ik1,ii), fbsp ) ==  & 
     375            ! Search for levels  
     376            ltaken(:) = .FALSE. 
     377            DO ik1 = 1, obsdata(ifi)%nlev 
     378               levloop : DO ik2 = 1, obsoutdata%nlev 
     379                  IF ( REAL( obsdata(ifi)%pdep(ik1,ii), fbsp ) ==  & 
    332380                     & REAL( obsoutdata%pdep(ik2,i1),  fbsp ) ) THEN 
    333                      obsoutdata%padd(ik2,i1,ia,:) = & 
    334                         & obsdata(ia)%padd(ik1,ii,1,:) 
    335                      IF ( nqc == ia ) THEN 
    336                         obsoutdata%idqc(ik2,i1)    = obsdata(ia)%idqc(ik1,ii) 
    337                         obsoutdata%ivlqc(ik2,i1,:) = obsdata(ia)%ivlqc(ik1,ii,:) 
    338                      ENDIF 
     381                     lnotobs=.TRUE. 
     382                     IF (ltaken(ik2)) CYCLE 
     383                     DO iv = 1, obsdata(ifi)%nvar 
     384                        IF ( REAL( obsdata(ifi)%pob(ik1,ii,iv), fbsp ) == & 
     385                           & REAL( obsoutdata%pob(ik2,i1,iv), fbsp ) ) THEN 
     386                           lnotobs=.FALSE. 
     387                        ENDIF 
     388                     ENDDO 
     389                     IF (lnotobs) CYCLE levloop 
     390                     ltaken(ik2)=.TRUE. 
     391                     DO ia = 1, obsdata(ifi)%nadd 
     392                        obsoutdata%padd(ik2,i1,iadd+ia,:) = & 
     393                           & obsdata(ifi)%padd(ik1,ii,ia,:) 
     394                     ENDDO 
     395                     DO ie = 1, obsdata(ifi)%next 
     396                        IF ( pextinf(ifi)%luse(ie) ) THEN 
     397                           obsoutdata%pext(ik2,i1,pextinf(ifi)%ipos(ie)) = & 
     398                              & obsdata(ifi)%pext(ik1,ii,ie) 
     399                        ENDIF 
     400                     ENDDO 
     401                     obsoutdata%idqc(ik2,i1) = & 
     402                        & MAX( obsoutdata%idqc(ik2,i1), obsdata(ifi)%idqc(ik1,ii) ) 
     403                     obsoutdata%ivlqc(ik2,i1,:) = & 
     404                        & MAX( obsoutdata%ivlqc(ik2,i1,:), obsdata(ifi)%ivlqc(ik1,ii,:) ) 
    339405                     obsoutdata%idqcf(:,ik2,i1)    = & 
    340                         &                IOR( obsdata(ia)%idqcf(:,ik1,ii), & 
     406                        &                IOR( obsdata(ifi)%idqcf(:,ik1,ii), & 
    341407                        &                     obsoutdata%idqcf(:,ik2,i1) ) 
    342408                     obsoutdata%ivlqcf(:,ik2,i1,:) = & 
    343                         &                IOR( obsdata(ia)%ivlqcf(:,ik1,ii,:), & 
     409                        &                IOR( obsdata(ifi)%ivlqcf(:,ik1,ii,:), & 
    344410                        &                     obsoutdata%ivlqcf(:,ik2,i1,:) ) 
    345411                     llfound = .TRUE. 
    346412                     EXIT 
    347413                  ENDIF 
    348                ENDDO 
     414               ENDDO levloop 
    349415               ! Write warning if level not found 
    350                IF (.NOT.llfound.AND.(obsdata(ia)%pdep(ik1,ii)/=fbrmdi)) THEN 
     416               IF (.NOT.llfound.AND.(obsdata(ifi)%pdep(ik1,ii)/=fbrmdi)) THEN 
    351417                  WRITE(*,*)'Level not found in first file : ',& 
    352418                     &      TRIM( cdinfile(1)  ) 
    353419                  WRITE(*,*)'Data file                     : ',& 
    354                      &      TRIM( cdinfile(ia) ) 
     420                     &      TRIM( cdinfile(ifi) ) 
    355421                  WRITE(*,*)'Identifier                    : ',& 
    356                      &      obsdata(ia)%cdwmo(ii) 
    357                   WRITE(*,*)'Julian date                   : ',& 
    358                      &      obsdata(ia)%ptim(ii) 
     422                     &      obsdata(ifi)%cdwmo(ii) 
     423                  WRITE(*,*)'Julifin date                   : ',& 
     424                     &      obsdata(ifi)%ptim(ii) 
    359425                  WRITE(*,*)'Latitude                      : ',& 
    360                      &      obsdata(ia)%pphi(ii) 
     426                     &      obsdata(ifi)%pphi(ii) 
    361427                  WRITE(*,*)'Longitude                     : ',& 
    362                      &      obsdata(ia)%plam(ii) 
     428                     &      obsdata(ifi)%plam(ii) 
    363429                  WRITE(*,*)'Depth                         : ',& 
    364                      &      obsdata(ia)%pdep(ik1,ii) 
     430                     &      obsdata(ifi)%pdep(ik1,ii) 
    365431               ENDIF 
    366432            ENDDO 
     
    371437               &      TRIM( cdinfile(1)  ) 
    372438            WRITE(*,*)'Data file                                : ',& 
    373                &      TRIM( cdinfile(ia) ) 
     439               &      TRIM( cdinfile(ifi) ) 
    374440            WRITE(*,*)'Identifier                               : ',& 
    375                &      obsdata(ia)%cdwmo(ii) 
    376             WRITE(*,*)'Julian date                              : ',& 
    377                &      obsdata(ia)%ptim(ii) 
     441               &      obsdata(ifi)%cdwmo(ii) 
     442            WRITE(*,*)'Julifin date                              : ',& 
     443               &      obsdata(ifi)%ptim(ii) 
    378444            WRITE(*,*)'Latitude                                 : ',& 
    379                &      obsdata(ia)%pphi(ii) 
     445               &      obsdata(ifi)%pphi(ii) 
    380446            WRITE(*,*)'Longitude                                : ',& 
    381                &      obsdata(ia)%plam(ii) 
     447               &      obsdata(ifi)%plam(ii) 
    382448            ist = 1 
    383449         ENDIF 
    384450      ENDDO 
    385       IF (obsdata(ia)%nobs>0) THEN 
    386          WRITE(*,*)'Handled last obs. no    ',ii,' for file no ',ia 
    387       ENDIF 
     451      IF (obsdata(ifi)%nobs>0) THEN 
     452         WRITE(*,*)'Handled last obs. no    ',ii,' for file no ',ifi 
     453      ENDIF 
     454      iadd = iadd + obsdata(ifi)%nadd 
    388455   ENDDO 
    389456   ! 
     
    391458   ! 
    392459   CALL write_obfbdata( TRIM(cdoutfile), obsoutdata ) 
     460   ! 
     461   ! Deallocate temporary data 
     462   !  
     463   DEALLOCATE(zrtim,zrphi,zrlam,irwmo ) 
     464   DEALLOCATE( & 
     465      & cexttmp & 
     466      & ) 
     467   DO ifi = 1, ninfiles 
     468      DEALLOCATE( & 
     469         & pextinf(ifi)%luse, & 
     470         & pextinf(ifi)%ipos  & 
     471         & ) 
     472   ENDDO 
     473   DEALLOCATE( & 
     474      & pextinf & 
     475      & ) 
    393476 
    394477END PROGRAM fbmatchup 
  • branches/dev_2802_OBStools/NEMOGCM/TOOLS/OBSTOOLS/src/fbprint.F90

    r2945 r3000  
    11PROGRAM fbprint 
     2   !!--------------------------------------------------------------------- 
     3   !! 
     4   !!                     ** PROGRAM fbprint ** 
     5   !! 
     6   !!  ** Purpose : Print feedback file contents as text 
     7   !! 
     8   !!  ** Method  : Use of utilities from obs_fbm. 
     9   !! 
     10   !!  ** Action  : 
     11   !! 
     12   !!   Usage : 
     13   !!     fbprint [options] inputfile 
     14   !!   Options : 
     15   !!     -b            shorter output 
     16   !!     -q            QC flags (nqc=1) select observations based on QC flags 
     17   !!     -Q            QC flags (nqc=2) select observations based on QC flags 
     18   !!     -B            QC flags (nqc=3) select observations based on QC flags 
     19   !!     -u            unsorted 
     20   !!     -s ID         select station ID   
     21   !!     -t TYPE       select observation type 
     22   !!     -v NUM1-NUM2  select variable range to print by number (default all) 
     23   !!     -a NUM1-NUM2  select additional variable range to print by number (default all) 
     24   !!     -e NUM1-NUM2  select extra variable range to print by number (default all) 
     25   !!     -d            output date range 
     26   !!     -D            print depths 
     27   !!     -z            use zipped files 
     28   !!  
     29   !!   History : 
     30   !!        ! 2010 (K. Mogensen) Initial version 
     31   !!---------------------------------------------------------------------- 
    232   USE toolspar_kind  
    333   USE obs_fbm 
    434   USE index_sort 
     35   USE date_utils 
     36   USE proftools 
     37 
    538   IMPLICIT NONE 
    639   ! 
     
    1144#endif 
    1245   INTEGER :: nargs 
    13    CHARACTER(len=256) :: cdinfile,cdbrief 
    14    LOGICAL :: lbrief, lqcflags, lstat 
    15    CHARACTER(len=8) :: cdstat 
     46   CHARACTER(len=256) :: cdinfile, cdbrief 
     47   LOGICAL :: lbrief, lqcflags, lstat, ltyp, lsort, ldaterange, lzinp, ldepths 
     48   CHARACTER(len=ilenwmo) :: cdstat 
     49   CHARACTER(len=ilentyp) :: cdtyp 
    1650   INTEGER :: nqc 
     51   INTEGER :: nvar1, nvar2, nadd1, nadd2, next1, next2 
    1752   ! 
    1853   ! Input data 
     
    2257   ! Loop variables 
    2358   ! 
    24    INTEGER :: ii 
     59   INTEGER :: ii, iarg, ip 
    2560   ! 
    2661   ! Sorting 
    2762   ! 
     63   INTEGER :: iwmo 
    2864   REAL(KIND=dp),ALLOCATABLE :: zsort(:,:) 
    2965   INTEGER,ALLOCATABLE  :: iindex(:) 
     
    3470   lbrief = .FALSE. 
    3571   lstat = .FALSE. 
     72   ltyp = .FALSE. 
     73   ldaterange = .FALSE. 
     74   ldepths = .FALSE. 
    3675   cdstat = 'XXXXXXX' 
     76   cdtyp = 'XXXX' 
     77   lsort = .TRUE. 
    3778   nqc = 0 
    38    IF ( (nargs < 1) .OR. (nargs > 3) ) THEN 
     79   nvar1 = -1 
     80   nvar2 = -1 
     81   nadd1 = -1 
     82   nadd2 = -1 
     83   next1 = -1 
     84   next2 = -1 
     85   lzinp = .FALSE. 
     86   IF ( nargs < 1 ) THEN 
    3987      CALL usage() 
    4088   ENDIF 
    41    IF (( nargs == 2 )) THEN 
    42       CALL getarg( 1, cdbrief ) 
     89   iarg = 1 
     90   DO 
     91      IF ( iarg == nargs ) EXIT 
     92      CALL getarg( iarg, cdbrief ) 
    4393      IF ( cdbrief == '-b' ) THEN 
    4494         lbrief = .TRUE. 
     95         iarg = iarg + 1 
    4596      ELSEIF( cdbrief == '-q' ) THEN 
    4697         lqcflags = .TRUE. 
    4798         nqc=1 
     99         iarg = iarg + 1 
    48100      ELSEIF( cdbrief == '-Q' ) THEN 
    49101         lqcflags = .TRUE. 
    50102         nqc=2 
     103         iarg = iarg + 1 
    51104      ELSEIF( cdbrief == '-B' ) THEN 
    52105         lqcflags = .TRUE. 
    53106         nqc=3 
     107         iarg = iarg + 1 
     108      ELSEIF( cdbrief == '-u' ) THEN 
     109         lsort = .FALSE. 
     110         iarg = iarg + 1 
     111      ELSEIF ( cdbrief == '-s' ) THEN 
     112         lstat = .TRUE. 
     113         CALL getarg( iarg + 1, cdstat ) 
     114         iarg = iarg + 2  
     115      ELSEIF ( cdbrief == '-t' ) THEN 
     116         ltyp = .TRUE. 
     117         CALL getarg( iarg + 1, cdtyp ) 
     118         iarg = iarg + 2  
     119      ELSEIF ( cdbrief == '-v' ) THEN 
     120         CALL getarg( iarg + 1, cdbrief ) 
     121         ip=INDEX(cdbrief,'-') 
     122         IF (ip==0) THEN 
     123            READ(cdbrief,'(I10)') nvar1 
     124            IF (nvar1==0) THEN 
     125               nvar2=-1 
     126            ELSE 
     127               nvar2 = nvar1 
     128            ENDIF 
     129         ELSEIF(ip==1) THEN 
     130            nvar1=1 
     131            READ(cdbrief(ip+1:),'(I10)') nvar2 
     132         ELSE 
     133            READ(cdbrief(1:ip-1),'(I10)') nvar1 
     134            READ(cdbrief(ip+1:),'(I10)') nvar2 
     135         ENDIF 
     136         iarg = iarg + 2 
     137      ELSEIF ( cdbrief == '-a' ) THEN 
     138         CALL getarg( iarg + 1, cdbrief ) 
     139         ip=INDEX(cdbrief,'-') 
     140         IF (ip==0) THEN 
     141            READ(cdbrief,'(I10)') nadd1 
     142            IF (nadd1==0) THEN 
     143               nadd2=-1 
     144            ELSE 
     145               nadd2 = nadd1 
     146            ENDIF 
     147         ELSEIF(ip==1) THEN 
     148            nadd1=1 
     149            READ(cdbrief(ip+1:),'(I10)') nadd2 
     150         ELSE 
     151            READ(cdbrief(1:ip-1),'(I10)') nadd1 
     152            READ(cdbrief(ip+1:),'(I10)') nadd2 
     153         ENDIF 
     154         iarg = iarg + 2 
     155      ELSEIF ( cdbrief == '-e' ) THEN 
     156         CALL getarg( iarg + 1, cdbrief ) 
     157         ip=INDEX(cdbrief,'-') 
     158         IF (ip==0) THEN 
     159            READ(cdbrief,'(I10)') next1 
     160            IF (next1==0) THEN 
     161               next2=-1 
     162            ELSE 
     163               next2 = next1 
     164            ENDIF 
     165         ELSEIF(ip==1) THEN 
     166            next1=1 
     167            READ(cdbrief(ip+1:),'(I10)') next2 
     168         ELSE 
     169            READ(cdbrief(1:ip-1),'(I10)') next1 
     170            READ(cdbrief(ip+1:),'(I10)') next2 
     171         ENDIF 
     172         iarg = iarg + 2 
     173      ELSEIF ( cdbrief == '-d' ) THEN 
     174         ldaterange=.TRUE. 
     175         iarg = iarg + 1 
     176      ELSEIF ( cdbrief == '-D' ) THEN 
     177         ldepths=.TRUE. 
     178         iarg = iarg + 1 
     179      ELSEIF ( cdbrief == '-z' ) THEN 
     180         lzinp=.TRUE. 
     181         iarg = iarg + 1 
    54182      ELSE 
    55183         CALL usage 
    56184      ENDIF 
    57    ENDIF 
    58    IF (( nargs == 3 )) THEN 
    59       CALL getarg( 1, cdbrief ) 
    60       IF ( cdbrief == '-s' ) THEN 
    61          lstat = .TRUE. 
    62          CALL getarg( 2, cdstat ) 
    63       ELSE 
    64          CALL usage 
    65       ENDIF 
    66    ENDIF 
     185   ENDDO 
    67186   CALL getarg( nargs, cdinfile ) 
    68187   ! 
    69188   ! Get input data 
    70189   ! 
    71    CALL read_obfbdata( TRIM(cdinfile), obsdata ) 
     190   IF (lzinp) THEN 
     191#if defined NOSYSTEM 
     192      WRITE(*,*)'Compressed files need the system subroutine call' 
     193      CALL abort 
     194#else 
     195      CALL system( 'cp '//TRIM(cdinfile)//' fbprint_tmp.nc.gz' ) 
     196      CALL system( 'gzip -df fbprint_tmp.nc.gz' ) 
     197      CALL read_obfbdata( 'fbprint_tmp.nc', obsdata ) 
     198      CALL system( 'rm -f fbprint_tmp.nc' ) 
     199#endif 
     200   ELSE 
     201      CALL read_obfbdata( TRIM(cdinfile), obsdata ) 
     202   ENDIF 
     203   CALL sealsfromargo( obsdata ) 
    72204   WRITE(*,'(2A,I9,A,I9,A)')TRIM(cdinfile), ' has ', obsdata%nobs ,& 
    73205      & ' observations and a maximum of ', obsdata%nlev, ' levels' 
     206   IF (nvar1<0) THEN 
     207      nvar1 = 1 
     208      nvar2 = obsdata%nvar 
     209   ENDIF 
     210   IF (nadd1<0) THEN 
     211      nadd1 = 1 
     212      nadd2 = obsdata%nadd 
     213   ENDIF 
     214   IF (next1<0) THEN 
     215      next1 = 1 
     216      next2 = obsdata%next 
     217   ENDIF 
    74218   ! 
    75219   ! Sort the data 
    76220   !    
    77    ALLOCATE(zsort(3,obsdata%nobs),iindex(obsdata%nobs)) 
    78    DO ii=1,obsdata%nobs 
    79       zsort(1,ii)=obsdata%ptim(ii) 
    80       zsort(2,ii)=obsdata%pphi(ii) 
    81       zsort(3,ii)=obsdata%plam(ii) 
    82    ENDDO 
    83    CALL index_sort_dp_n(zsort,3,iindex,obsdata%nobs) 
    84    ! 
    85    ! Print the sorted list 
    86    !    
    87    DO ii=1,obsdata%nobs 
    88       IF (lstat) THEN 
    89          IF (cdstat /= obsdata%cdwmo(ii)) CYCLE 
     221   ALLOCATE(zsort(5,obsdata%nobs),iindex(obsdata%nobs)) 
     222   IF (lsort) THEN 
     223      DO ii=1,obsdata%nobs 
     224         zsort(1,ii)=obsdata%ptim(ii) 
     225         zsort(2,ii)=obsdata%pphi(ii) 
     226         zsort(3,ii)=obsdata%plam(ii) 
     227         iwmo = TRANSFER( obsdata%cdwmo(ii)(1:4), iwmo ) 
     228         zsort(4,ii) = iwmo 
     229         iwmo = TRANSFER( obsdata%cdwmo(ii)(5:8), iwmo ) 
     230         zsort(5,ii) = iwmo 
     231      ENDDO 
     232      CALL index_sort_dp_n(zsort,5,iindex,obsdata%nobs) 
     233   ELSE 
     234      DO ii=1,obsdata%nobs 
     235         iindex(ii)=ii 
     236      ENDDO 
     237   ENDIF 
     238   IF (ldaterange) THEN 
     239      IF (obsdata%nobs>0) THEN 
     240         WRITE(*,'(A)')'First observation' 
     241         CALL print_time(obsdata%ptim(1)) 
     242         WRITE(*,'(A)')'Last observation' 
     243         CALL print_time(obsdata%ptim(obsdata%nobs)) 
    90244      ENDIF 
    91       IF (lqcflags) THEN 
    92          CALL print_obs_qc(obsdata,iindex(ii),nqc) 
    93       ELSE 
    94          CALL print_obs(obsdata,iindex(ii),lbrief,lqcflags,nqc) 
     245   ELSE 
     246      ! 
     247      ! Print the sorted list 
     248      !    
     249      DO ii=1,obsdata%nobs 
     250         IF (lstat) THEN 
     251            IF (TRIM(ADJUSTL(cdstat)) /= & 
     252               &TRIM(ADJUSTL(obsdata%cdwmo(iindex(ii))))) CYCLE 
     253         ENDIF 
     254         IF (ltyp) THEN 
     255            IF (TRIM(ADJUSTL(cdtyp)) /= & 
     256               &TRIM(ADJUSTL(obsdata%cdtyp(iindex(ii))))) CYCLE 
     257         ENDIF 
     258         IF (ldepths) THEN 
     259            CALL print_depths(obsdata,iindex(ii)) 
     260         ELSE 
     261            IF (lqcflags) THEN 
     262               CALL print_obs_qc(obsdata,iindex(ii),nqc,nvar1,nvar2) 
     263            ELSE 
     264               CALL print_obs(obsdata,iindex(ii),lbrief,& 
     265                  &           nvar1,nvar2,nadd1,nadd2,next1,next2) 
     266            ENDIF 
     267         ENDIF 
     268      ENDDO 
     269 
     270   ENDIF 
     271 
     272CONTAINS 
     273 
     274   SUBROUTINE usage 
     275      WRITE(*,'(A)')'Usage:' 
     276      WRITE(*,'(A)')'fbprint [options] inputfile' 
     277      CALL abort() 
     278   END SUBROUTINE usage 
     279    
     280   SUBROUTINE print_depths(obsdata,iindex) 
     281      IMPLICIT NONE 
     282      TYPE(obfbdata) :: obsdata 
     283      INTEGER :: iindex 
     284      INTEGER :: kj 
     285      REAL :: mindep,maxdep 
     286 
     287      mindep=10000 
     288      maxdep=0 
     289      DO kj=1,obsdata%nlev 
     290         IF (obsdata%pdep(kj,iindex)<99999.0) THEN 
     291            IF (obsdata%pdep(kj,iindex)>maxdep) maxdep=obsdata%pdep(kj,iindex) 
     292            IF (obsdata%pdep(kj,iindex)<mindep) mindep=obsdata%pdep(kj,iindex) 
     293         ENDIF 
     294      ENDDO 
     295       
     296      WRITE(*,*)'Fileindex           = ',obsdata%kindex(iindex) 
     297      WRITE(*,*)'Station identifier  = ',obsdata%cdwmo(iindex) 
     298      WRITE(*,*)'Station type        = ',obsdata%cdtyp(iindex) 
     299      WRITE(*,*)'Latitude            = ',obsdata%pphi(iindex) 
     300      WRITE(*,*)'Longtude            = ',obsdata%plam(iindex) 
     301      CALL print_time( obsdata%ptim(iindex) ) 
     302      WRITE(*,*)'Position QC         = ',obsdata%ipqc(iindex) 
     303      WRITE(*,*)'Observation QC      = ',obsdata%ioqc(iindex) 
     304      WRITE(*,*)'Minimum obs. depth  = ',mindep 
     305      WRITE(*,*)'Maximum obs. depth  = ',maxdep 
     306      WRITE(*,*) 
     307 
     308   END SUBROUTINE print_depths 
     309 
     310   SUBROUTINE print_obs(obsdata,iindex,lshort,& 
     311      &                 kvar1,kvar2,kadd1,kadd2,kext1,kext2) 
     312      IMPLICIT NONE 
     313      TYPE(obfbdata) :: obsdata 
     314      INTEGER :: iindex 
     315      LOGICAL :: lshort 
     316      INTEGER :: kvar1,kvar2,kadd1,kadd2,kext1,kext2 
     317      INTEGER :: jv,ja,je,jk 
     318      INTEGER :: kj 
     319      LOGICAL :: lskip 
     320      CHARACTER(len=1024) :: cdfmt1,cdfmt2 
     321      CHARACTER(len=16) :: cdtmp 
     322 
     323      WRITE(*,*)'Fileindex           = ',obsdata%kindex(iindex) 
     324      WRITE(*,*)'Station identifier  = ',obsdata%cdwmo(iindex) 
     325      WRITE(*,*)'Station type        = ',obsdata%cdtyp(iindex) 
     326      WRITE(*,*)'Latitude            = ',obsdata%pphi(iindex) 
     327      WRITE(*,*)'Longtude            = ',obsdata%plam(iindex) 
     328      CALL print_time( obsdata%ptim(iindex) ) 
     329      WRITE(*,*)'Position QC         = ',obsdata%ipqc(iindex) 
     330      WRITE(*,*)'Observation QC      = ',obsdata%ioqc(iindex) 
     331      IF (.NOT.lshort) THEN 
     332         DO jv = kvar1, kvar2 
     333            WRITE(*,*)'Variable name       = ',obsdata%cname(jv) 
     334            WRITE(*,*)'Variable QC         = ',obsdata%ivqc(iindex,jv) 
     335            IF (obsdata%lgrid) THEN 
     336               WRITE(*,*)'Grid I              = ',obsdata%iobsi(iindex,jv) 
     337               WRITE(*,*)'Grid J              = ',obsdata%iobsj(iindex,jv) 
     338            ENDIF 
     339         ENDDO 
     340         cdfmt1='(1X,A8,1X,A8' 
     341         cdfmt2='(1X,F8.2,1X,I8' 
     342         DO jv = kvar1, kvar2 
     343            cdfmt1 = TRIM(cdfmt1)//',1X,A15,1X,A8' 
     344            cdfmt2 = TRIM(cdfmt2)//',1X,E15.9,1X,I8' 
     345            IF (kadd2-kadd1+1>0) THEN 
     346               WRITE(cdtmp,'(I10)')kadd2-kadd1+1 
     347               cdfmt1 = TRIM(cdfmt1)//',1X,'//TRIM(ADJUSTL(cdtmp))//'(1X,A15)' 
     348               cdfmt2 = TRIM(cdfmt2)//',1X,'//TRIM(ADJUSTL(cdtmp))//'(1X,E15.9)' 
     349            ENDIF 
     350            IF (obsdata%lgrid) THEN 
     351               cdfmt1 = TRIM(cdfmt1)//',1X,A10' 
     352               cdfmt2 = TRIM(cdfmt2)//',1X,I10' 
     353            ENDIF 
     354         ENDDO 
     355         IF (kext2-kext1+1>0) THEN 
     356            WRITE(cdtmp,'(I10)')kext2-kext1+1 
     357            cdfmt1 = TRIM(cdfmt1)//',1X,'//TRIM(ADJUSTL(cdtmp))//'(1X,A15)' 
     358            cdfmt2 = TRIM(cdfmt2)//',1X,'//TRIM(ADJUSTL(cdtmp))//'(1X,E15.9)' 
     359         ENDIF 
     360         cdfmt1=TRIM(cdfmt1)//')' 
     361         cdfmt2=TRIM(cdfmt2)//')' 
     362         IF (obsdata%lgrid) THEN 
     363            WRITE(*,FMT=cdfmt1)& 
     364               & 'DEPTH', 'DEP_QC', & 
     365               & (TRIM(obsdata%cname(jv))//'_OBS', & 
     366               & TRIM(obsdata%cname(jv))//'_QC' , & 
     367               & (TRIM(obsdata%cname(jv))//'_'//TRIM(obsdata%caddname(ja)),& 
     368               & ja = kadd1, kadd2 ), & 
     369               & TRIM(obsdata%cname(jv))//'_K' , & 
     370               & jv = kvar1, kvar2 ), & 
     371               & ( TRIM(obsdata%cextname(ja)),& 
     372               & ja = kext1, kext2 ) 
     373            DO kj=1,obsdata%nlev 
     374               IF (obsdata%pdep(kj,iindex)<99999.0) THEN 
     375                  WRITE (*,FMT=cdfmt2) & 
     376                     & obsdata%pdep(kj,iindex),   & 
     377                     & obsdata%idqc(kj,iindex),   & 
     378                     & ( obsdata%pob(kj,iindex,jv), obsdata%ivlqc(kj,iindex,jv), & 
     379                     & ( obsdata%padd(kj,iindex,ja,jv) , ja = kadd1, kadd2 ), & 
     380                     & obsdata%iobsk(kj,iindex,jv), & 
     381                     & jv = kvar1, kvar2 ), & 
     382                     & ( obsdata%pext(kj,iindex,ja), ja = kext1, kext2 ) 
     383               ENDIF 
     384            ENDDO 
     385         ELSE 
     386            cdfmt1=TRIM(cdfmt1)//')' 
     387            cdfmt2=TRIM(cdfmt2)//')' 
     388            WRITE(*,FMT=cdfmt1)& 
     389               & 'DEPTH', 'DEP_QC', & 
     390               & (TRIM(obsdata%cname(jv))//'_OBS', & 
     391               & TRIM(obsdata%cname(jv))//'_QC' , & 
     392               & (TRIM(obsdata%cname(jv))//TRIM(obsdata%caddname(ja)),& 
     393               & ja = kadd1, kadd2 ), & 
     394               & jv = kvar1, kvar2 ), & 
     395               & ( TRIM(obsdata%cextname(ja)),& 
     396               & ja = kext1, kext2 ) 
     397            DO kj=1,obsdata%nlev 
     398               IF (obsdata%pdep(kj,iindex)<99999.0) THEN 
     399                  WRITE (*,FMT=cdfmt2) & 
     400                     & obsdata%pdep(kj,iindex),   & 
     401                     & obsdata%idqc(kj,iindex),   & 
     402                     & ( obsdata%pob(kj,iindex,jv), obsdata%ivlqc(kj,iindex,jv), & 
     403                     & ( obsdata%padd(kj,iindex,ja,jv) , ja = kadd1, kadd2 ), & 
     404                     & jv = kvar1, kvar2 ), & 
     405                     & ( obsdata%pext(kj,iindex,ja), ja = kext1, kext2 ) 
     406               ENDIF 
     407            ENDDO 
     408         ENDIF 
    95409      ENDIF 
    96    ENDDO 
    97  
    98 END PROGRAM fbprint 
    99  
    100 SUBROUTINE usage 
    101    WRITE(*,'(A)')'Usage:' 
    102    WRITE(*,'(A)')'fbprint [-b] [-q] inputfile' 
    103    WRITE(*,'(A)')'where -b selects brief output' 
    104    WRITE(*,'(A)')'  and -q selects qc flags rather than extra fields' 
    105    CALL abort() 
    106 END SUBROUTINE usage 
    107  
    108 SUBROUTINE print_obs(obsdata,iindex,lshort) 
    109    USE obs_fbm 
    110    USE date_utils 
    111    IMPLICIT NONE 
    112    TYPE(obfbdata) :: obsdata 
    113    INTEGER :: iindex 
    114    LOGICAL :: lshort 
    115    INTEGER :: jv,ja,je,jk 
    116    INTEGER :: kj,iyr,imon,iday,ihou,imin,isec 
    117    LOGICAL :: lskip 
    118    CHARACTER(len=1024) :: cdfmt1,cdfmt2 
    119    CHARACTER(len=16) :: cdtmp 
    120  
    121    WRITE(*,*)'Fileindex           = ',obsdata%kindex(iindex) 
    122    WRITE(*,*)'Station identifier  = ',obsdata%cdwmo(iindex) 
    123    WRITE(*,*)'Station type        = ',obsdata%cdtyp(iindex) 
    124    WRITE(*,*)'Latitude            = ',obsdata%pphi(iindex) 
    125    WRITE(*,*)'Longtude            = ',obsdata%plam(iindex) 
    126    WRITE(*,*)'Position QC         = ',obsdata%ipqc(iindex) 
    127    WRITE(*,*)'Observation QC      = ',obsdata%ioqc(iindex) 
    128    WRITE(*,*)'Julian date         = ',obsdata%ptim(iindex) 
    129    CALL jul2greg(isec,imin,ihou,iday,imon,iyr,obsdata%ptim(iindex)) 
    130    WRITE(*,'(1X,A,I4,2I2.2)') & 
    131       &      'Gregorian date      = ',iyr,imon,iday 
    132    WRITE(*,'(1X,A,I2.2,A1,I2.2,A1,I2.2)') & 
    133       &      'Time                = ',ihou,':',imin,':',isec 
    134    IF (.NOT.lshort) THEN 
    135       DO jv = 1,obsdata%nvar 
     410      WRITE(*,*) 
     411   END SUBROUTINE print_obs 
     412    
     413   SUBROUTINE print_obs_qc(obsdata,iindex,kqc,kvar1,kvar2) 
     414      IMPLICIT NONE 
     415      TYPE(obfbdata) :: obsdata 
     416      INTEGER :: iindex 
     417      LOGICAL :: lqc 
     418      INTEGER :: kqc 
     419      INTEGER :: kvar1,kvar2 
     420      INTEGER :: jv,ja,je,jk 
     421      INTEGER :: kj 
     422      LOGICAL :: lskip 
     423      CHARACTER(len=1024) :: cdfmt1,cdfmt2 
     424      CHARACTER(len=16) :: cdtmp 
     425      INTEGER :: iqcf 
     426       
     427      IF (kqc==2) THEN 
     428         lskip=.TRUE. 
     429         IF (obsdata%ipqc(iindex)>1) lskip=.FALSE. 
     430         IF (obsdata%ioqc(iindex)>1) lskip=.FALSE. 
     431         DO jv = kvar1, kvar2 
     432            IF (obsdata%ivqc(iindex,jv)>1) lskip=.FALSE. 
     433         ENDDO 
     434         DO kj=1,obsdata%nlev 
     435            IF (obsdata%pdep(kj,iindex)<99999.0) THEN 
     436               IF (obsdata%idqc(kj,iindex)>1) lskip=.FALSE. 
     437               DO jv = kvar1, kvar2 
     438                  IF (obsdata%ivlqc(kj,iindex,jv)>1) lskip=.FALSE. 
     439               ENDDO 
     440            ENDIF 
     441         ENDDO 
     442         IF (lskip) RETURN 
     443      ELSEIF (kqc==3) THEN 
     444         lskip=.TRUE. 
     445         DO kj=1,obsdata%nlev 
     446            IF (obsdata%pdep(kj,iindex)<99999.0) THEN 
     447               iqcf=0 
     448               DO jv = kvar1, kvar2 
     449                  IF (obsdata%ivlqc(kj,iindex,jv)>1) iqcf=iqcf+1 
     450                  IF (iqcf==obsdata%nvar) lskip=.FALSE. 
     451               ENDDO 
     452            ENDIF 
     453         ENDDO 
     454         IF (lskip) RETURN 
     455      ENDIF 
     456      WRITE(*,*)'Fileindex           = ',obsdata%kindex(iindex) 
     457      WRITE(*,*)'Station identifier  = ',obsdata%cdwmo(iindex) 
     458      WRITE(*,*)'Station type        = ',obsdata%cdtyp(iindex) 
     459      WRITE(*,*)'Latitude            = ',obsdata%pphi(iindex) 
     460      WRITE(*,*)'Longtude            = ',obsdata%plam(iindex) 
     461      CALL print_time( obsdata%ptim(iindex) ) 
     462      WRITE(*,*)'Position QC         = ',obsdata%ipqc(iindex) 
     463      WRITE(*,*)'Position QC flags   = ',obsdata%ipqcf(:,iindex) 
     464      WRITE(*,*)'Observation QC      = ',obsdata%ioqc(iindex) 
     465      WRITE(*,*)'Observation QC flags= ',obsdata%ioqcf(:,iindex) 
     466      DO jv = kvar1, kvar2 
    136467         WRITE(*,*)'Variable name       = ',obsdata%cname(jv) 
    137468         WRITE(*,*)'Variable QC         = ',obsdata%ivqc(iindex,jv) 
    138          IF (obsdata%lgrid) THEN 
    139             WRITE(*,*)'Grid I              = ',obsdata%iobsi(iindex,jv) 
    140             WRITE(*,*)'Grid J              = ',obsdata%iobsj(iindex,jv) 
    141          ENDIF 
     469         WRITE(*,*)'Variable QC flags   = ',obsdata%ivqcf(:,iindex,jv) 
    142470      ENDDO 
    143471      cdfmt1='(1X,A8,1X,A8' 
    144472      cdfmt2='(1X,F8.2,1X,I8' 
    145       DO jv=1, obsdata%nvar 
     473      WRITE(cdtmp,'(I10)')obsdata%nqcf 
     474      cdfmt1 = TRIM(cdfmt1)//',1X,A18' 
     475      cdfmt2 = TRIM(cdfmt2)//',1X,'//TRIM(ADJUSTL(cdtmp))//'(I9)' 
     476      DO jv = kvar1, kvar2 
    146477         cdfmt1 = TRIM(cdfmt1)//',1X,A15,1X,A8' 
    147478         cdfmt2 = TRIM(cdfmt2)//',1X,E15.9,1X,I8' 
    148          IF (obsdata%nadd>0) THEN 
    149             WRITE(cdtmp,'(I10)')obsdata%nadd 
    150             cdfmt1 = TRIM(cdfmt1)//',1X,'//TRIM(ADJUSTL(cdtmp))//'(1X,A15)' 
    151             cdfmt2 = TRIM(cdfmt2)//',1X,'//TRIM(ADJUSTL(cdtmp))//'(1X,E15.9)' 
    152          ENDIF 
    153          IF (obsdata%lgrid) THEN 
    154             cdfmt1 = TRIM(cdfmt1)//',1X,A10' 
    155             cdfmt2 = TRIM(cdfmt2)//',1X,I10' 
    156          ENDIF 
     479         WRITE(cdtmp,'(I10)')obsdata%nqcf 
     480         cdfmt1 = TRIM(cdfmt1)//',1X,A18' 
     481         cdfmt2 = TRIM(cdfmt2)//',1X,'//TRIM(ADJUSTL(cdtmp))//'(I9)' 
    157482      ENDDO 
    158483      IF (obsdata%next>0) THEN 
     
    163488      cdfmt1=TRIM(cdfmt1)//')' 
    164489      cdfmt2=TRIM(cdfmt2)//')' 
    165       IF (obsdata%lgrid) THEN 
    166          WRITE(*,FMT=cdfmt1)& 
    167             & 'DEPTH', 'DEP_QC', & 
    168             & (TRIM(obsdata%cname(jv))//'_OBS', & 
    169             & TRIM(obsdata%cname(jv))//'_QC' , & 
    170             & (TRIM(obsdata%cname(jv))//'_'//TRIM(obsdata%caddname(ja)),& 
    171             & ja = 1, obsdata%nadd ), & 
    172             & TRIM(obsdata%cname(jv))//'_K' , & 
    173             & jv = 1, obsdata%nvar ), & 
    174             & ( TRIM(obsdata%cextname(ja)),& 
    175             & ja = 1, obsdata%next ) 
    176          DO kj=1,obsdata%nlev 
    177             IF (obsdata%pdep(kj,iindex)<99999.0) THEN 
    178                WRITE (*,FMT=cdfmt2) & 
    179                   & obsdata%pdep(kj,iindex),   & 
    180                   & obsdata%idqc(kj,iindex),   & 
    181                   & ( obsdata%pob(kj,iindex,jv), obsdata%ivlqc(kj,iindex,jv), & 
    182                   & ( obsdata%padd(kj,iindex,ja,jv) , ja=1, obsdata%nadd ), & 
    183                   & obsdata%iobsk(kj,iindex,jv), & 
    184                   & jv = 1, obsdata%nvar ), & 
    185                   & ( obsdata%pext(kj,iindex,ja), ja=1, obsdata%next ) 
    186             ENDIF 
    187          ENDDO 
    188       ELSE 
    189          cdfmt1=TRIM(cdfmt1)//')' 
    190          cdfmt2=TRIM(cdfmt2)//')' 
    191          WRITE(*,FMT=cdfmt1)& 
    192             & 'DEPTH', 'DEP_QC', & 
    193             & (TRIM(obsdata%cname(jv))//'_OBS', & 
    194             & TRIM(obsdata%cname(jv))//'_QC' , & 
    195             & (TRIM(obsdata%cname(jv))//TRIM(obsdata%caddname(ja)),& 
    196             & ja = 1, obsdata%nadd ), & 
    197             & jv = 1, obsdata%nvar ), & 
    198             & ( TRIM(obsdata%cextname(ja)),& 
    199             & ja = 1, obsdata%next ) 
    200          DO kj=1,obsdata%nlev 
    201             IF (obsdata%pdep(kj,iindex)<99999.0) THEN 
    202                WRITE (*,FMT=cdfmt2) & 
    203                   & obsdata%pdep(kj,iindex),   & 
    204                   & obsdata%idqc(kj,iindex),   & 
    205                   & ( obsdata%pob(kj,iindex,jv), obsdata%ivlqc(kj,iindex,jv), & 
    206                   & ( obsdata%padd(kj,iindex,ja,jv) , ja=1, obsdata%nadd ), & 
    207                   & jv = 1, obsdata%nvar ), & 
    208                      & ( obsdata%pext(kj,iindex,ja), ja=1, obsdata%next ) 
    209             ENDIF 
    210          ENDDO 
    211       ENDIF 
    212    ENDIF 
    213    WRITE(*,*) 
    214 END SUBROUTINE print_obs 
    215  
    216 SUBROUTINE print_obs_qc(obsdata,iindex,kqc) 
    217    USE obs_fbm 
    218    USE date_utils 
    219    IMPLICIT NONE 
    220    TYPE(obfbdata) :: obsdata 
    221    INTEGER :: iindex 
    222    LOGICAL :: lqc 
    223    INTEGER :: kqc 
    224    INTEGER :: jv,ja,je,jk 
    225    INTEGER :: kj,iyr,imon,iday,ihou,imin,isec 
    226    LOGICAL :: lskip 
    227    CHARACTER(len=1024) :: cdfmt1,cdfmt2 
    228    CHARACTER(len=16) :: cdtmp 
    229    integer :: iqcf 
    230  
    231    IF (kqc==2) THEN 
    232       lskip=.TRUE. 
    233       IF (obsdata%ipqc(iindex)>1) lskip=.FALSE. 
    234       IF (obsdata%ioqc(iindex)>1) lskip=.FALSE. 
    235       DO jv = 1,obsdata%nvar 
    236          IF (obsdata%ivqc(iindex,jv)>1) lskip=.FALSE. 
    237       ENDDO 
     490      WRITE(*,FMT=cdfmt1)& 
     491         & 'DEPTH', 'DEP_QC', 'DEP_QC_FLAGS', & 
     492         & (TRIM(obsdata%cname(jv))//'_OBS', & 
     493         & TRIM(obsdata%cname(jv))//'_QC' , & 
     494         & TRIM(obsdata%cname(jv))//'_QC_FLAGS',& 
     495         & jv = kvar1, kvar2 ), & 
     496         & ( TRIM(obsdata%cextname(ja)),& 
     497         & ja = 1, obsdata%next ) 
    238498      DO kj=1,obsdata%nlev 
    239          IF (obsdata%pdep(kj,iindex)<99999.0) THEN 
     499         IF (kqc>=2)  THEN 
     500            lskip=.TRUE. 
    240501            IF (obsdata%idqc(kj,iindex)>1) lskip=.FALSE. 
    241             DO jv = 1, obsdata%nvar 
     502            DO jv = kvar1, kvar2 
    242503               IF (obsdata%ivlqc(kj,iindex,jv)>1) lskip=.FALSE. 
    243504            ENDDO 
    244          ENDIF 
    245       ENDDO 
    246       IF (lskip) RETURN 
    247    ELSEIF (kqc==3) THEN 
    248       lskip=.TRUE. 
    249       DO kj=1,obsdata%nlev 
     505            IF (lskip) CYCLE 
     506         ENDIF 
    250507         IF (obsdata%pdep(kj,iindex)<99999.0) THEN 
    251             iqcf=0 
    252             DO jv = 1, obsdata%nvar 
    253                IF (obsdata%ivlqc(kj,iindex,jv)>1) iqcf=iqcf+1 
    254                IF (iqcf==obsdata%nvar) lskip=.FALSE. 
    255             ENDDO 
    256          ENDIF 
    257       ENDDO 
    258       IF (lskip) RETURN 
    259    ENDIF 
    260    WRITE(*,*)'Fileindex           = ',obsdata%kindex(iindex) 
    261    WRITE(*,*)'Station identifier  = ',obsdata%cdwmo(iindex) 
    262    WRITE(*,*)'Station type        = ',obsdata%cdtyp(iindex) 
    263    WRITE(*,*)'Latitude            = ',obsdata%pphi(iindex) 
    264    WRITE(*,*)'Longtude            = ',obsdata%plam(iindex) 
    265    WRITE(*,*)'Position QC         = ',obsdata%ipqc(iindex) 
    266    WRITE(*,*)'Position QC flags   = ',obsdata%ipqcf(:,iindex) 
    267    WRITE(*,*)'Observation QC      = ',obsdata%ioqc(iindex) 
    268    WRITE(*,*)'Observation QC flags= ',obsdata%ioqcf(:,iindex) 
    269    WRITE(*,*)'Julian date         = ',obsdata%ptim(iindex) 
    270    CALL jul2greg(isec,imin,ihou,iday,imon,iyr,obsdata%ptim(iindex)) 
    271    WRITE(*,'(1X,A,I4,2I2.2)') & 
    272       &      'Gregorian date      = ',iyr,imon,iday 
    273    WRITE(*,'(1X,A,I2.2,A1,I2.2,A1,I2.2)') & 
    274       &      'Time                = ',ihou,':',imin,':',isec 
    275    DO jv = 1,obsdata%nvar 
    276       WRITE(*,*)'Variable name       = ',obsdata%cname(jv) 
    277       WRITE(*,*)'Variable QC         = ',obsdata%ivqc(iindex,jv) 
    278       WRITE(*,*)'Variable QC flags   = ',obsdata%ivqcf(:,iindex,jv) 
    279    ENDDO 
    280    cdfmt1='(1X,A8,1X,A8' 
    281    cdfmt2='(1X,F8.2,1X,I8' 
    282    WRITE(cdtmp,'(I10)')obsdata%nqcf 
    283    cdfmt1 = TRIM(cdfmt1)//',1X,A18' 
    284    cdfmt2 = TRIM(cdfmt2)//',1X,'//TRIM(ADJUSTL(cdtmp))//'(I9)' 
    285    DO jv=1, obsdata%nvar 
    286       cdfmt1 = TRIM(cdfmt1)//',1X,A15,1X,A8' 
    287       cdfmt2 = TRIM(cdfmt2)//',1X,E15.9,1X,I8' 
    288       WRITE(cdtmp,'(I10)')obsdata%nqcf 
    289       cdfmt1 = TRIM(cdfmt1)//',1X,A18' 
    290       cdfmt2 = TRIM(cdfmt2)//',1X,'//TRIM(ADJUSTL(cdtmp))//'(I9)' 
    291    ENDDO 
    292    IF (obsdata%next>0) THEN 
    293       WRITE(cdtmp,'(I10)')obsdata%next 
    294       cdfmt1 = TRIM(cdfmt1)//',1X,'//TRIM(ADJUSTL(cdtmp))//'(1X,A15)' 
    295       cdfmt2 = TRIM(cdfmt2)//',1X,'//TRIM(ADJUSTL(cdtmp))//'(1X,E15.9)' 
    296    ENDIF 
    297    cdfmt1=TRIM(cdfmt1)//')' 
    298    cdfmt2=TRIM(cdfmt2)//')' 
    299    WRITE(*,FMT=cdfmt1)& 
    300       & 'DEPTH', 'DEP_QC', 'DEP_QC_FLAGS', & 
    301       & (TRIM(obsdata%cname(jv))//'_OBS', & 
    302       & TRIM(obsdata%cname(jv))//'_QC' , & 
    303       & TRIM(obsdata%cname(jv))//'_QC_FLAGS',& 
    304       & jv = 1, obsdata%nvar ), & 
    305       & ( TRIM(obsdata%cextname(ja)),& 
    306       & ja = 1, obsdata%next ) 
    307    DO kj=1,obsdata%nlev 
    308       IF (kqc>=2)  THEN 
    309          lskip=.TRUE. 
    310          IF (obsdata%idqc(kj,iindex)>1) lskip=.FALSE. 
    311          DO jv = 1, obsdata%nvar 
    312             IF (obsdata%ivlqc(kj,iindex,jv)>1) lskip=.FALSE. 
    313          ENDDO 
    314          IF (lskip) CYCLE 
    315       ENDIF 
    316       IF (obsdata%pdep(kj,iindex)<99999.0) THEN 
    317          WRITE (*,FMT=cdfmt2) & 
    318             & obsdata%pdep(kj,iindex),   & 
    319             & obsdata%idqc(kj,iindex),   & 
    320             & ( obsdata%idqcf(ja,kj,iindex), ja = 1, obsdata%nqcf ), & 
    321             & ( obsdata%pob(kj,iindex,jv), obsdata%ivlqc(kj,iindex,jv), & 
    322             & ( obsdata%ivlqcf(ja,kj,iindex,jv) , ja=1, obsdata%nqcf ), & 
    323             & jv = 1, obsdata%nvar ), & 
    324             & ( obsdata%pext(kj,iindex,ja), ja=1, obsdata%next ) 
    325       ENDIF 
    326    ENDDO 
    327    WRITE(*,*) 
    328  
    329 END SUBROUTINE print_obs_qc 
     508            WRITE (*,FMT=cdfmt2) & 
     509               & obsdata%pdep(kj,iindex),   & 
     510               & obsdata%idqc(kj,iindex),   & 
     511               & ( obsdata%idqcf(ja,kj,iindex), ja = 1, obsdata%nqcf ), & 
     512               & ( obsdata%pob(kj,iindex,jv), obsdata%ivlqc(kj,iindex,jv), & 
     513               & ( obsdata%ivlqcf(ja,kj,iindex,jv) , ja=1, obsdata%nqcf ), & 
     514               & jv = kvar1, kvar2 ), & 
     515               & ( obsdata%pext(kj,iindex,ja), ja=1, obsdata%next ) 
     516         ENDIF 
     517      ENDDO 
     518      WRITE(*,*) 
     519       
     520   END SUBROUTINE print_obs_qc 
     521 
     522   SUBROUTINE print_time(ptim) 
     523      IMPLICIT NONE 
     524      REAL(fbdp) :: ptim 
     525      INTEGER:: iyr,imon,iday,ihou,imin,isec       
     526      WRITE(*,*)'Julian date         = ',ptim 
     527      CALL jul2greg(isec,imin,ihou,iday,imon,iyr,ptim) 
     528      WRITE(*,'(1X,A,I4,2I2.2)') & 
     529         &      'Gregorian date      = ',iyr,imon,iday 
     530      WRITE(*,'(1X,A,I2.2,A1,I2.2,A1,I2.2)') & 
     531         &      'Time                = ',ihou,':',imin,':',isec 
     532   END  SUBROUTINE print_time 
     533 
     534END PROGRAM fbprint 
     535 
    330536    
  • branches/dev_2802_OBStools/NEMOGCM/TOOLS/OBSTOOLS/src/fbsel.F90

    r2945 r3000  
    11PROGRAM fbsel 
     2   !!--------------------------------------------------------------------- 
     3   !! 
     4   !!                     ** PROGRAM fbsel ** 
     5   !! 
     6   !!  ** Purpose : Select or subsample observations 
     7   !! 
     8   !!  ** Method  : Use of utilities from obs_fbm. 
     9   !! 
     10   !!  ** Action  : 
     11   !! 
     12   !!   Usage: 
     13   !!     fbsel <input filename> <output filename> 
     14   !! 
     15   !!   History : 
     16   !!        ! 2010 (K. Mogensen) Initial version 
     17   !!---------------------------------------------------------------------- 
    218   USE obs_fbm 
    319   USE date_utils 
     
    1127   INTEGER,PARAMETER :: maxdates=20 
    1228   INTEGER :: nqc,ntyp,ndates,ninidate(maxdates),nenddate(maxdates) 
    13    LOGICAL :: lsplitqc,lsplittyp 
    14    INTEGER :: iqc,ityp,idate 
     29   LOGICAL :: lsplitqc,lsplittyp,lsplitstat 
     30   INTEGER :: iqc,ityp,idate,istat 
    1531   REAL :: maxlat,minlat,maxlon,minlon 
     32   CHARACTER(len=ilenwmo) :: cdwmo,cdwmobeg,cdwmoend 
     33   CHARACTER(len=ilenwmo), DIMENSION(:), POINTER :: clstatids 
     34   INTEGER :: nstat 
    1635   NAMELIST/namsel/nqc,ntyp,ndates,ninidate,nenddate,lsplitqc,lsplittyp, & 
    17       &            maxlat,minlat,maxlon,minlon 
     36      &            lsplitstat,maxlat,minlat,maxlon,minlon,cdwmo,& 
     37      &            cdwmobeg,cdwmoend 
    1838 
    1939   IF (iargc()/=2) THEN 
     
    3454   lsplitqc=.FALSE. 
    3555   lsplittyp=.FALSE. 
     56   lsplitstat=.FALSE. 
     57   cdwmo=REPEAT('X',ilenwmo) 
     58   cdwmobeg=cdwmo 
     59   cdwmoend=cdwmo 
    3660   maxlat=1e+38 
    3761   minlat=-1e+38 
     
    4165   READ(10,namsel) 
    4266   CLOSE(10) 
     67   IF (cdwmobeg==REPEAT('X',ilenwmo)) cdwmobeg=cdwmo 
     68   IF (cdwmoend==REPEAT('X',ilenwmo)) cdwmoend=cdwmo 
    4369   WRITE(*,namsel) 
    4470 
     
    5985            CALL fb_sel(fbdatain,fbdataout,iqc,ntyp, & 
    6086               &        ninidate(idate),nenddate(idate), & 
    61                &        maxlat,minlat,maxlon,minlon) 
     87               &        maxlat,minlat,maxlon,minlon,cdwmobeg,cdwmoend) 
    6288            WRITE(filenametmp,'(A,I2.2,A,A)')'qc_',iqc,'_',TRIM(cnameout) 
    6389            IF (fbdataout%nobs>0) THEN 
     
    7399            CALL fb_sel(fbdatain,fbdataout,nqc,ityp, & 
    74100               &        ninidate(idate),nenddate(idate), & 
    75                &        maxlat,minlat,maxlon,minlon) 
     101               &        maxlat,minlat,maxlon,minlon,cdwmobeg,cdwmoend) 
    76102            WRITE(filenametmp,'(A,I4.4,A,A)')'typ_',ityp,'_',TRIM(cnameout) 
    77103            IF (fbdataout%nobs>0) THEN 
     
    83109            CALL dealloc_obfbdata(fbdataout) 
    84110         ENDDO 
     111      ELSEIF (lsplitstat) THEN 
     112         CALL fb_sel_uniqueids(fbdatain,clstatids,nstat) 
     113         DO istat=1,nstat 
     114            CALL fb_sel(fbdatain,fbdataout,nqc,ntyp, & 
     115               &        ninidate(idate),nenddate(idate), & 
     116               &        maxlat,minlat,maxlon,minlon,clstatids(istat),clstatids(istat)) 
     117            WRITE(filenametmp,'(4A)')'statid_', & 
     118               & TRIM(clstatids(istat)),'_',TRIM(cnameout) 
     119            IF (fbdataout%nobs>0) THEN 
     120               WRITE(*,*)'Station = ',clstatids(istat) 
     121               WRITE(*,*)'Number of observations selected = ',fbdataout%nobs 
     122               WRITE(*,*)'Writing file : ',TRIM(filenametmp) 
     123               CALL write_obfbdata(TRIM(filenametmp),fbdataout) 
     124            ENDIF 
     125            CALL dealloc_obfbdata(fbdataout) 
     126         ENDDO 
    85127      ELSE 
    86128         CALL fb_sel(fbdatain,fbdataout,nqc,ntyp, &  
    87129            &        ninidate(idate),nenddate(idate), & 
    88             &        maxlat,minlat,maxlon,minlon) 
     130            &        maxlat,minlat,maxlon,minlon,cdwmobeg,cdwmoend) 
    89131         WRITE(*,*)'Number of observations selected = ',fbdataout%nobs 
    90132         WRITE(*,*)'Writing file : ',TRIM(cnameout) 
     
    97139 
    98140   SUBROUTINE fb_sel(fbdatain,fbdataout,nqc,ntyp,ninidate,nenddate,& 
    99       &              maxlat,minlat,maxlon,minlon) 
     141      &              maxlat,minlat,maxlon,minlon,cdwmobeg,cdwmoend) 
    100142      TYPE(obfbdata) :: fbdatain,fbdataout 
    101143      INTEGER :: nqc,ntyp,ninidate,nenddate 
    102144      REAL :: maxlat,minlat,maxlon,minlon 
     145      CHARACTER(len=ilenwmo) :: cdwmobeg,cdwmoend 
    103146      INTEGER :: jobs 
    104147      INTEGER :: iqc,ityp 
     
    106149      INTEGER :: iyea,imon,iday 
    107150      REAL(KIND=dp) :: zjini,zjend 
    108  
     151      LOGICAL :: lcheckwmo 
     152 
     153      lcheckwmo=(cdwmobeg/=REPEAT('X',ilenwmo)).OR.& 
     154         &      (cdwmoend/=REPEAT('X',ilenwmo)) 
    109155      iyea=ninidate/10000 
    110156      imon=ninidate/100-iyea*100 
     
    131177            llvalid(jobs)=(fbdatain%ptim(jobs)<=zjend).AND.llvalid(jobs) 
    132178         ENDIF 
    133          llvalid(jobs)=(fbdatain%pphi(jobs)<=maxlat).AND. & 
    134             &          (fbdatain%pphi(jobs)>=minlat).AND. & 
    135             &          (fbdatain%plam(jobs)<=maxlon).AND. & 
    136             &          (fbdatain%plam(jobs)>=minlon).AND.llvalid(jobs) 
     179         llvalid(jobs)=(fbdatain%pphi(jobs)<=maxlat).AND.       & 
     180            &          (fbdatain%pphi(jobs)>=minlat).AND.       & 
     181            &          (((fbdatain%plam(jobs)<=maxlon).AND.     & 
     182            &            (fbdatain%plam(jobs)>=minlon)).OR.     & 
     183            &           ((fbdatain%plam(jobs)+360<=maxlon).AND. & 
     184            &            (fbdatain%plam(jobs)+360>=minlon)).OR. & 
     185            &           ((fbdatain%plam(jobs)-360<=maxlon).AND. & 
     186            &            (fbdatain%plam(jobs)-360>=minlon))).AND.llvalid(jobs)  
     187         IF (lcheckwmo) THEN 
     188            llvalid(jobs)=LGE(TRIM(fbdatain%cdwmo(jobs)),TRIM(cdwmobeg)) & 
     189               &    .AND. LLE(TRIM(fbdatain%cdwmo(jobs)),TRIM(cdwmoend)) & 
     190               &    .AND. llvalid(jobs) 
     191         ENDIF 
    137192         ! Add more checks here... 
    138193      ENDDO 
     
    142197   END SUBROUTINE fb_sel 
    143198 
     199   SUBROUTINE fb_sel_uniqueids(fbdatain,clstatids,nstat) 
     200      TYPE(obfbdata) :: fbdatain 
     201      CHARACTER(len=ilenwmo), DIMENSION(:), POINTER :: clstatids 
     202      INTEGER :: nstat 
     203      INTEGER :: jobs,kobs 
     204      LOGICAL, DIMENSION(fbdatain%nobs) :: lunique 
     205 
     206      lunique(:)=.TRUE. 
     207      DO jobs=1,fbdatain%nobs 
     208         IF (.NOT.lunique(jobs)) CYCLE 
     209         DO kobs=jobs+1,fbdatain%nobs 
     210            IF (.NOT.lunique(kobs)) CYCLE 
     211            IF (fbdatain%cdwmo(jobs)==fbdatain%cdwmo(kobs)) THEN 
     212               lunique(kobs)=.FALSE. 
     213            ENDIF 
     214         ENDDO 
     215      ENDDO 
     216      nstat=COUNT(lunique) 
     217      ALLOCATE(clstatids(nstat)) 
     218      kobs=0 
     219      DO jobs=1,fbdatain%nobs 
     220         IF (lunique(jobs)) THEN 
     221            kobs=kobs+1 
     222            clstatids(kobs)=fbdatain%cdwmo(jobs) 
     223         ENDIF 
     224      ENDDO 
     225      WRITE(*,*)'Unique station ids' 
     226      DO jobs=1,nstat 
     227         WRITE(*,'(I5,1X,A)')jobs,clstatids(jobs) 
     228      ENDDO 
     229 
     230   END SUBROUTINE fb_sel_uniqueids 
     231    
    144232   SUBROUTINE check_prof(fbdata,iobs,iqc) 
    145233       
  • branches/dev_2802_OBStools/NEMOGCM/TOOLS/OBSTOOLS/src/fbstat.F90

    r2945 r3000  
    11PROGRAM fbstat 
     2   !!--------------------------------------------------------------------- 
     3   !! 
     4   !!                     ** PROGRAM fbstat ** 
     5   !! 
     6   !!  ** Purpose : Output feedback file summary info/statistics 
     7   !!         into a number of .dat files for different areas 
     8   !! 
     9   !!  ** Method  : Use of utilities from obs_fbm. 
     10   !! 
     11   !!  ** Action  : 
     12   !! 
     13   !!   Usage: 
     14   !!     fbstat [-nmlev] <filenames> 
     15   !!   Optional: 
     16   !!     namelist = namfbstat.in 
     17   !! 
     18   !!   History : 
     19   !!        ! 2010 (K. Mogensen) Initial version 
     20   !!---------------------------------------------------------------------- 
    221   USE obs_fbm 
    322   USE fbaccdata 
    423   USE coords 
    524   USE omonainfo 
     25   USE fbstatncio 
     26   USE proftools 
    627   IMPLICIT NONE 
    728   TYPE(obfbdata) :: fbdata 
    8    CHARACTER(len=256) :: filename 
    9    INTEGER :: jfile,jbox,jlev,jfirst,jvar,jadd,ji 
     29   CHARACTER(len=256) :: filename,outfilename 
     30   INTEGER :: jfile,jbox,jlev,jfirst,jvar,jadd,ji,ja,jt,jboxl 
    1031#ifndef NOIARGCPROTO 
    1132   INTEGER,EXTERNAL :: iargc 
     
    1334   REAL,DIMENSION(:),ALLOCATABLE :: zlev 
    1435   INTEGER :: nmlev, nfiles 
    15    LOGICAL :: lexists,lomona,ltext 
     36   LOGICAL :: lexists,lomona,ltext,lnetcdf,lzinp 
    1637   REAL, ALLOCATABLE, DIMENSION(:,:,:) :: zdat3d 
    1738   REAL, ALLOCATABLE, DIMENSION(:,:) :: zdat2d 
    1839   INTEGER,DIMENSION(1) :: itime 
    1940   INTEGER :: inidate,icurdate,loopno,ityp,iloopno 
    20    INTEGER :: nvar,nadd 
     41   INTEGER :: nvar,nadd,noberr,nbgerr 
    2142   CHARACTER(len=4) :: expver 
    22    CHARACTER(len=7) :: cltyp 
     43   CHARACTER(len=20) :: cltyp 
    2344   CHARACTER(len=128) :: cdfmthead,cdfmtbody 
    2445   LOGICAL :: lnear,linner,linnerp,linnerini,lpassive,lhistogram,lfound 
    25    INTEGER :: nqc 
    26    CHARACTER(len=ilenname), DIMENSION(:), ALLOCATABLE :: cname,caddname 
    27    CHARACTER(len=20) :: carea 
    28    INTEGER :: jstabox, jendbox 
    29    NAMELIST/namfbstat/ltext,lomona,nmlev,inidate,icurdate,loopno,& 
    30       &               expver,lnear,linner,lpassive,lhistogram, & 
    31       &               zhistmax,zhistmin,zhiststep,zcheck,carea 
     46   LOGICAL :: lxyplot,lrmmean 
     47   INTEGER :: nqc,nqco 
     48   REAL :: rlspc,rlmax 
     49   CHARACTER(len=ilenname), DIMENSION(:), ALLOCATABLE :: cname,caddname,& 
     50      & cobename,cbgename 
     51   INTEGER, PARAMETER :: nmaxareas = 20 
     52   CHARACTER(len=20), DIMENSION(nmaxareas) :: carea 
     53   LOGICAL, DIMENSION(:), ALLOCATABLE :: lskipbox 
     54   INTEGER, parameter :: maxtyp = 10 
     55   CHARACTER(len=ilentyp), DIMENSION(maxtyp) :: ctyp 
     56   INTEGER :: ntyp,nboxuserl,ipdcst 
     57   REAL :: mindcst 
     58   NAMELIST/namfbstat/ltext,lomona,lnetcdf,nmlev,inidate,icurdate,loopno,& 
     59      &               expver,lnear,linner,lpassive,lhistogram,& 
     60      &               zhistmax,zhistmin,zhiststep,zcheck,carea,nmlev,& 
     61      &               nqc,nqco, & 
     62      &               rlspc,rlmax,ntyp,ctyp,& 
     63      &               lxyplot,zxymin,zxymax,zxystep,lzinp,lrmmean,mindcst 
    3264 
    3365   ltext=.TRUE. 
     66   lnetcdf=.TRUE. 
    3467   lomona=.FALSE. 
    3568   nmlev=31 
    3669   inidate=19010101 
    3770   icurdate=19010116 
    38    loopno=-1 
     71   loopno=0 
    3972   expver='test' 
    4073   lnear=.TRUE. 
     
    4578   zhistmax(:)=10.0 
    4679   zhiststep(:)=0.1 
    47    zcheck(:)=10.0 
     80   zcheck(:)=1000.0 
    4881   nqc=2 
    49    carea='all' 
     82   nqco=2 
     83   carea(:)='all' 
     84   rlmax=5000.0 
     85   rlspc=-0.1 
     86   ntyp=1 
     87   ctyp(:)='all' 
     88   lxyplot=.FALSE. 
     89   zxymin(:)=-5.0 
     90   zxymax(:)=45.0 
     91   zxystep(:)=0.5 
     92   lzinp=.FALSE. 
     93   lrmmean=.FALSE. 
     94   mindcst=-1.0 
     95 
    5096   INQUIRE(file='namfbstat.in',exist=lexists) 
    5197   IF (lexists) THEN 
     
    55101      WRITE(*,namfbstat) 
    56102   ENDIF 
     103   mindcst=mindcst*1000.0 !From km to m. 
    57104   IF (iargc()==0) THEN 
    58105      WRITE(*,*)'Usage:' 
     
    85132   END DO 
    86133   nfiles=iargc() 
    87     
    88    IF (carea/='all') THEN 
     134 
     135   CALL coord_user_init('o') 
     136 
     137   ALLOCATE(lskipbox(nboxuser)) 
     138   lskipbox(:)=.FALSE. 
     139 
     140   IF (carea(1)/='all') THEN 
    89141      IF (lomona) THEN 
    90          WRITE(*,*)'For omona files carea has to be all' 
     142         WRITE(*,*)'For omona files carea(1) has to be all' 
    91143         CALL abort 
    92144      ENDIF 
    93       lfound=.FALSE. 
    94       DO jbox=1,nbox 
    95          IF (TRIM(carea)==TRIM(cl_boxes(jbox))) THEN 
    96             jstabox=jbox 
    97             jendbox=jbox 
    98             lfound=.TRUE. 
     145      lskipbox(:)=.TRUE. 
     146      DO ji=1,nmaxareas 
     147         IF (carea(ji)/='all') THEN 
     148            lfound=.FALSE. 
     149            DO jbox=1,nboxuser 
     150               IF (TRIM(carea(ji))==TRIM(cl_boxes_user(jbox))) THEN 
     151                  lskipbox(jbox)=.FALSE. 
     152                  lfound=.TRUE. 
     153               ENDIF 
     154            ENDDO 
     155            IF (.NOT.lfound) THEN 
     156               WRITE(*,*)'Area ',TRIM(carea(ji)),' not found' 
     157               CALL abort 
     158            ENDIF 
    99159         ENDIF 
    100160      ENDDO 
    101       IF (.NOT.lfound) THEN 
    102          WRITE(*,*)'Area not found' 
     161      nboxuserl=0 
     162      DO ji=1,nboxuser 
     163         WRITE(*,*)'Area ',TRIM(cl_boxes_user(ji)),' is set to ',lskipbox(ji) 
     164         IF (.NOT.lskipbox(ji)) nboxuserl=nboxuserl+1 
     165      ENDDO 
     166      WRITE(*,*)'Total areas for statistics = ',nboxuserl 
     167      IF (lomona.AND.(nboxuserl/=nboxuser)) THEN 
     168         WRITE(*,*)'Omona files only possible if all areas' 
    103169         CALL abort 
    104170      ENDIF 
    105171   ELSE 
    106       jstabox=1 
    107       jendbox=nbox 
     172      nboxuserl=nboxuser 
    108173   ENDIF 
    109    PRINT *,'jstabox,jendbox=',jstabox,jendbox 
    110  
    111    IF (.NOT.lnear) nmlev=nmlev-1 
    112  
    113    ALLOCATE(& 
    114       & zlev(nmlev) & 
    115       & ) 
    116    IF(lnear) THEN 
    117       CALL getlevs(nmlev,zlev) 
     174 
     175   IF (rlspc>0.0) THEN 
     176      lnear=.TRUE. 
     177      nmlev=rlmax/rlspc+1 
     178      ALLOCATE(zlev(nmlev)) 
     179      DO ji=1,nmlev 
     180         zlev(ji)=(ji-1)*rlspc 
     181      ENDDO 
    118182   ELSE 
    119       CALL getlevsmean(nmlev,zlev) 
     183      IF (.NOT.lnear) nmlev=nmlev-1 
     184      ALLOCATE(& 
     185         & zlev(nmlev) & 
     186         & ) 
     187      IF(lnear) THEN 
     188         CALL getlevs(nmlev,zlev) 
     189      ELSE 
     190         CALL getlevsmean(nmlev,zlev) 
     191      ENDIF 
    120192   ENDIF 
    121193 
     
    123195      CALL getarg(jfile,filename) 
    124196      WRITE(*,*)'Handling file : ',TRIM(filename) 
    125       CALL read_obfbdata(TRIM(filename),fbdata) 
     197      CALL flush(6) 
     198      IF (lzinp) THEN 
     199#if defined NOSYSTEM 
     200         WRITE(*,*)'Compressed files need the system subroutine call' 
     201         CALL abort 
     202#else 
     203         CALL system('cp '//TRIM(filename)//' fbstat_tmp.nc.gz') 
     204         CALL system('gzip -df fbstat_tmp.nc.gz') 
     205         CALL read_obfbdata('fbstat_tmp.nc',fbdata) 
     206         CALL system('rm -f fbstat_tmp.nc') 
     207#endif 
     208      ELSE 
     209         CALL read_obfbdata(TRIM(filename),fbdata) 
     210      ENDIF 
     211      CALL sealsfromargo( fbdata ) 
    126212      IF (jfile==jfirst) THEN 
    127213         nvar=fbdata%nvar 
    128          nadd=fbdata%nadd 
     214         nadd=0 
     215         DO ja= 1, fbdata%nadd 
     216            IF (fbdata%caddname(ja)(1:2)=='Hx') nadd=nadd+1 
     217         ENDDO 
     218         noberr=0 
     219         DO ja= 1, fbdata%nadd 
     220            IF (fbdata%caddname(ja)(1:3)=='OBE') noberr=noberr+1 
     221         ENDDO 
     222         nbgerr=0 
     223         DO ja= 1, fbdata%nadd 
     224            IF (fbdata%caddname(ja)(1:3)=='BGE') nbgerr=nbgerr+1 
     225         ENDDO 
    129226         IF (lhistogram) THEN 
    130227            IF (nvar>maxvars) THEN 
     
    139236                  &  hist(jvar)%npoints 
    140237               WRITE(*,*)'Size of histogram array (elements) = ',& 
    141                   &  hist(jvar)%npoints*nmlev*nbox*nadd 
     238                  &  hist(jvar)%npoints*nmlev*nboxuserl*nadd 
    142239               ALLOCATE(& 
    143                   & hist(jvar)%nhist(hist(jvar)%npoints,nmlev,nbox,nadd) & 
     240                  & hist(jvar)%nhist(hist(jvar)%npoints,nmlev,nboxuserl,nadd,ntyp) & 
    144241                  & ) 
    145                hist(jvar)%nhist(:,:,:,:)=0 
     242               hist(jvar)%nhist(:,:,:,:,:)=0 
     243            ENDDO 
     244         ENDIF 
     245         ipdcst=0 
     246         IF (mindcst>0) THEN 
     247            DO ja= 1, fbdata%next 
     248               IF (TRIM(fbdata%cextname(ja))=='DCST') THEN 
     249                  ipdcst=ja 
     250                  EXIT  
     251               ENDIF 
     252            ENDDO 
     253            IF (ipdcst==0) THEN 
     254               WRITE(*,*)'Distance to coast not found in file, but mindcst>0' 
     255               WRITE(*,*)'Extra variables:' 
     256               DO ja= 1, fbdata%next 
     257                  WRITE(*,*)ja,TRIM(fbdata%cextname(ja)) 
     258               ENDDO 
     259               CALL abort 
     260            ENDIF 
     261         ENDIF 
     262         IF (lxyplot) THEN 
     263            IF (nvar>maxvars) THEN 
     264               WRITE(*,*)'fbstat.F90: Increase maxvars to ',nvar 
     265               WRITE(*,*)'if you want xyplots' 
     266               CALL abort 
     267            ENDIF 
     268            DO jvar = 1, nvar 
     269               xy(jvar)%npoints=(zxymax(jvar)-zxymin(jvar))& 
     270                  &              /zxystep(jvar)+1 
     271               WRITE(*,*)'Number of points in x and y for xyplots = ',& 
     272                  &  xy(jvar)%npoints 
     273               WRITE(*,*)'Size of xyplot array (elements)         = ',& 
     274                  &  xy(jvar)%npoints*xy(jvar)%npoints*nmlev*nboxuserl*nadd 
     275               ALLOCATE(& 
     276                  & xy(jvar)%nxy(xy(jvar)%npoints,xy(jvar)%npoints,& 
     277                  &              nmlev,nboxuserl,nadd,ntyp) & 
     278                  & ) 
     279               xy(jvar)%nxy(:,:,:,:,:,:)=0 
    146280            ENDDO 
    147281         ENDIF 
    148282         ALLOCATE(& 
    149             & inum(nmlev,nbox,nadd,nvar),  & 
    150             & zmean(nmlev,nbox,nadd,nvar), & 
    151             & zrms(nmlev,nbox,nadd,nvar),  & 
    152             & zsdev(nmlev,nbox,nadd,nvar), & 
    153             & cname(nvar),                 & 
    154             & caddname(nadd)               & 
     283            & inum(nmlev,nboxuserl,nadd,nvar,ntyp),  & 
     284            & inumov(nmlev,nboxuserl,noberr,nvar,ntyp),  & 
     285            & inumbv(nmlev,nboxuserl,nbgerr,nvar,ntyp),  & 
     286            & inuma(nmlev,nboxuserl,nvar,ntyp),      & 
     287            & zbias(nmlev,nboxuserl,nadd,nvar,ntyp), & 
     288            & zrms(nmlev,nboxuserl,nadd,nvar,ntyp),  & 
     289            & zsdev(nmlev,nboxuserl,nadd,nvar,ntyp), & 
     290            & zomean(nmlev,nboxuserl,nadd,nvar,ntyp),& 
     291            & zmmean(nmlev,nboxuserl,nadd,nvar,ntyp),& 
     292            & zoemea(nmlev,nboxuserl,noberr,nvar,ntyp),& 
     293            & zovmea(nmlev,nboxuserl,noberr,nvar,ntyp),& 
     294            & zbemea(nmlev,nboxuserl,nbgerr,nvar,ntyp),& 
     295            & zbvmea(nmlev,nboxuserl,nbgerr,nvar,ntyp),& 
     296            & zoamean(nmlev,nboxuserl,nvar,ntyp),    & 
     297            & cname(nvar),                           & 
     298            & caddname(nadd),                        & 
     299            & cobename(noberr),                      & 
     300            & cbgename(nbgerr)                       & 
    155301            & ) 
    156302         DO jvar = 1, nvar 
    157303            cname(jvar) = fbdata%cname(jvar) 
    158304         END DO 
    159          DO jadd = 1, nadd 
    160             caddname(jadd) = fbdata%caddname(jadd) 
     305         jadd = 0 
     306         DO ja= 1, fbdata%nadd 
     307            IF (fbdata%caddname(ja)(1:2)=='Hx') THEN 
     308               jadd=jadd+1 
     309               caddname(jadd) = fbdata%caddname(ja) 
     310            ENDIF 
    161311         END DO 
    162          inum(:,:,:,:)=0 
    163          zmean(:,:,:,:)=0.0 
    164          zrms(:,:,:,:)=0.0 
    165          zsdev(:,:,:,:)=0.0 
     312         jadd = 0 
     313         DO ja= 1, fbdata%nadd 
     314            IF (fbdata%caddname(ja)(1:3)=='OBE') THEN 
     315               jadd=jadd+1 
     316               cobename(jadd) = fbdata%caddname(ja) 
     317            ENDIF 
     318         END DO 
     319         jadd = 0 
     320         DO ja= 1, fbdata%nadd 
     321            IF (fbdata%caddname(ja)(1:3)=='BGE') THEN 
     322               jadd=jadd+1 
     323               cbgename(jadd) = fbdata%caddname(ja) 
     324            ENDIF 
     325         END DO 
     326         IF (nadd>0) THEN 
     327            inum(:,:,:,:,:)=0 
     328            zbias(:,:,:,:,:)=0.0 
     329            zrms(:,:,:,:,:)=0.0 
     330            zsdev(:,:,:,:,:)=0.0 
     331            zomean(:,:,:,:,:)=0.0  
     332            zmmean(:,:,:,:,:)=0.0 
     333         ENDIF 
     334         IF (noberr>0) THEN 
     335            inumov(:,:,:,:,:)=0 
     336            zoemea(:,:,:,:,:)=0 
     337            zovmea(:,:,:,:,:)=0 
     338         ENDIF 
     339         IF (nbgerr>0) THEN 
     340            inumbv(:,:,:,:,:)=0 
     341            zbemea(:,:,:,:,:)=0 
     342            zbvmea(:,:,:,:,:)=0 
     343         ENDIF 
     344         inuma(:,:,:,:)=0 
     345         zoamean(:,:,:,:)=0.0 
    166346      ELSE 
    167347         IF (fbdata%nvar/=nvar) THEN 
     
    170350            CALL abort 
    171351         ENDIF 
    172          IF (fbdata%nadd/=nadd) THEN 
    173             WRITE(*,*)'Different number of nadd ',fbdata%nadd,' in ',& 
     352         jadd = 0 
     353         DO ja= 1, fbdata%nadd 
     354            IF (fbdata%caddname(ja)(1:2)=='Hx') THEN 
     355               jadd=jadd+1 
     356            ENDIF 
     357         END DO 
     358         IF (jadd/=nadd) THEN 
     359            WRITE(*,*)'Different number of nadd ',jadd,' in ',& 
    174360               & TRIM(filename) 
    175361            CALL abort 
    176362         ENDIF 
    177       ENDIF 
    178       CALL fb_stat(fbdata,jstabox,jendbox,nmlev,zlev,lnear,nqc,lhistogram) 
     363         jadd = 0 
     364         DO ja= 1, fbdata%nadd 
     365            IF (fbdata%caddname(ja)(1:3)=='OBE') THEN 
     366               jadd=jadd+1 
     367            ENDIF 
     368         END DO 
     369         IF (jadd/=noberr) THEN 
     370            WRITE(*,*)'Different number of noberr ',jadd,' in ',& 
     371               & TRIM(filename) 
     372            CALL abort 
     373         ENDIF 
     374         jadd = 0 
     375         DO ja= 1, fbdata%nadd 
     376            IF (fbdata%caddname(ja)(1:3)=='BGE') THEN 
     377               jadd=jadd+1 
     378            ENDIF 
     379         END DO 
     380         IF (jadd/=nbgerr) THEN 
     381            WRITE(*,*)'Different number of nbgerr ',jadd,' in ',& 
     382               & TRIM(filename) 
     383            CALL abort 
     384         ENDIF 
     385         IF (ipdcst>0) THEN 
     386            IF (ipdcst>fbdata%next) THEN 
     387               WRITE(*,*)'Distrance to coast in file not compatible with first file' 
     388               CALL abort 
     389            ENDIF 
     390            IF (TRIM(fbdata%cextname(ipdcst))/='DCST') THEN 
     391               WRITE(*,*)'Distrance to coast in file not compatible with first file' 
     392               CALL abort 
     393            ENDIF 
     394         ENDIF 
     395      ENDIF 
     396      IF (lrmmean) THEN 
     397         CALL fb_rmmean(fbdata) 
     398      ENDIF 
     399      CALL fb_stat(fbdata,lskipbox,nmlev,zlev,lnear,nqc,nqco,& 
     400         &         lhistogram,lxyplot,ntyp,ctyp,ipdcst,mindcst) 
    179401      CALL dealloc_obfbdata(fbdata) 
    180402   ENDDO 
    181403 
    182    DO jvar=1, nvar 
    183       DO jadd=1, nadd 
    184          DO jbox=jstabox, jendbox 
    185             DO jlev = 1, nmlev 
    186                IF ( inum(jlev,jbox,jadd,jvar) > 0 ) THEN 
    187                   zmean(jlev,jbox,jadd,jvar) = & 
    188                      & zmean(jlev,jbox,jadd,jvar)/inum(jlev,jbox,jadd,jvar) 
    189                   zrms(jlev,jbox,jadd,jvar) = & 
    190                      & SQRT(zrms(jlev,jbox,jadd,jvar)/inum(jlev,jbox,jadd,jvar)) 
    191                   zsdev(jlev,jbox,jadd,jvar) = & 
    192                      & SQRT(MAX(zrms(jlev,jbox,jadd,jvar)**2-zmean(jlev,jbox,jadd,jvar)**2,0.0)) 
    193                ELSE 
    194                   zmean(jlev,jbox,jadd,jvar) = fbrmdi 
    195                   zrms(jlev,jbox,jadd,jvar) = fbrmdi 
    196                   zsdev(jlev,jbox,jadd,jvar) = fbrmdi 
    197                ENDIF 
     404   DO jt=1,ntyp 
     405      DO jvar=1,nvar 
     406         DO jadd=1,nadd 
     407            jboxl=0 
     408            DO jbox=1,nboxuser 
     409               IF (lskipbox(jbox)) CYCLE 
     410               jboxl=jboxl+1 
     411               DO jlev = 1, nmlev 
     412                  IF ( inum(jlev,jboxl,jadd,jvar,jt) > 0 ) THEN 
     413                     zbias(jlev,jboxl,jadd,jvar,jt) = & 
     414                        & zbias(jlev,jboxl,jadd,jvar,jt)/inum(jlev,jboxl,jadd,jvar,jt) 
     415                     zrms(jlev,jboxl,jadd,jvar,jt) = & 
     416                        & SQRT(zrms(jlev,jboxl,jadd,jvar,jt)/inum(jlev,jboxl,jadd,jvar,jt)) 
     417                     zsdev(jlev,jboxl,jadd,jvar,jt) = & 
     418                        & SQRT(MAX(zrms(jlev,jboxl,jadd,jvar,jt)**2-zbias(jlev,jboxl,jadd,jvar,jt)**2,0.0)) 
     419                     zomean(jlev,jboxl,jadd,jvar,jt) = & 
     420                        & zomean(jlev,jboxl,jadd,jvar,jt)/inum(jlev,jboxl,jadd,jvar,jt) 
     421                     zmmean(jlev,jboxl,jadd,jvar,jt) = & 
     422                        & zmmean(jlev,jboxl,jadd,jvar,jt)/inum(jlev,jboxl,jadd,jvar,jt) 
     423                  ELSE 
     424                     zbias(jlev,jboxl,jadd,jvar,jt) = fbrmdi 
     425                     zrms(jlev,jboxl,jadd,jvar,jt) = fbrmdi 
     426                     zsdev(jlev,jboxl,jadd,jvar,jt) = fbrmdi 
     427                     zomean(jlev,jboxl,jadd,jvar,jt) = fbrmdi 
     428                     zmmean(jlev,jboxl,jadd,jvar,jt) = fbrmdi 
     429                  ENDIF 
     430               ENDDO 
     431            ENDDO 
     432         ENDDO 
     433         DO jadd=1,noberr 
     434            jboxl=0 
     435            DO jbox=1,nboxuser 
     436               IF (lskipbox(jbox)) CYCLE 
     437               jboxl=jboxl+1 
     438               DO jlev = 1, nmlev 
     439                  IF ( inumov(jlev,jboxl,jadd,jvar,jt) > 0 ) THEN 
     440                     zoemea(jlev,jboxl,jadd,jvar,jt) = & 
     441                        & zoemea(jlev,jboxl,jadd,jvar,jt)/inumov(jlev,jboxl,jadd,jvar,jt) 
     442                     zovmea(jlev,jboxl,jadd,jvar,jt) = & 
     443                        & zovmea(jlev,jboxl,jadd,jvar,jt)/inumov(jlev,jboxl,jadd,jvar,jt) 
     444                  ELSE 
     445                     zoemea(jlev,jboxl,jadd,jvar,jt) = fbrmdi 
     446                     zovmea(jlev,jboxl,jadd,jvar,jt) = fbrmdi 
     447                  ENDIF 
     448               ENDDO 
     449            ENDDO 
     450         ENDDO 
     451         DO jadd=1,nbgerr 
     452            jboxl=0 
     453            DO jbox=1,nboxuser 
     454               IF (lskipbox(jbox)) CYCLE 
     455               jboxl=jboxl+1 
     456               DO jlev = 1, nmlev 
     457                  IF ( inumbv(jlev,jboxl,jadd,jvar,jt) > 0 ) THEN 
     458                     zbemea(jlev,jboxl,jadd,jvar,jt) = & 
     459                        & zbemea(jlev,jboxl,jadd,jvar,jt)/inumbv(jlev,jboxl,jadd,jvar,jt) 
     460                     zbvmea(jlev,jboxl,jadd,jvar,jt) = & 
     461                        & zbvmea(jlev,jboxl,jadd,jvar,jt)/inumbv(jlev,jboxl,jadd,jvar,jt) 
     462                  ELSE 
     463                     zbemea(jlev,jboxl,jadd,jvar,jt) = fbrmdi 
     464                     zbvmea(jlev,jboxl,jadd,jvar,jt) = fbrmdi 
     465                  ENDIF 
     466               ENDDO 
    198467            ENDDO 
    199468         ENDDO 
    200469      ENDDO 
    201470   ENDDO 
     471   DO jt=1,ntyp 
     472      DO jvar=1,nvar 
     473         jboxl=0 
     474         DO jbox=1,nboxuser 
     475            IF (lskipbox(jbox)) CYCLE 
     476            jboxl=jboxl+1 
     477            DO jlev = 1, nmlev 
     478               IF ( inuma(jlev,jboxl,jvar,jt) > 0 ) THEN 
     479                  zoamean(jlev,jboxl,jvar,jt) = & 
     480                     & zoamean(jlev,jboxl,jvar,jt)/inuma(jlev,jboxl,jvar,jt) 
     481               ELSE 
     482                  zoamean(jlev,jboxl,jvar,jt) = fbrmdi 
     483               ENDIF 
     484            ENDDO 
     485         ENDDO 
     486      ENDDO 
     487   ENDDO 
    202488 
    203489   IF (ltext) THEN 
    204       DO jvar=1, nvar 
    205          DO jadd=1, nadd 
    206             DO jbox=jstabox, jendbox 
    207                WRITE(filename,'(5A)')TRIM(cname(jvar)),& 
    208                   &                  TRIM(caddname(jadd)),'_',& 
    209                   &                  TRIM(cl_boxes(jbox)),'.dat' 
     490 
     491      DO jt=1,ntyp 
     492         DO jvar=1,nvar 
     493            DO jadd=1,nadd 
     494               jboxl=0 
     495               DO jbox=1,nboxuser 
     496                  IF (lskipbox(jbox)) CYCLE 
     497                  jboxl=jboxl+1 
     498                  WRITE(filename,'(7A)')TRIM(cname(jvar)),& 
     499                     &                  TRIM(caddname(jadd)),'_',& 
     500                     &                  TRIM(cl_boxes_user(jbox)),'_',& 
     501                     &                  TRIM(ADJUSTL(ctyp(jt))),'.dat' 
     502                  OPEN(10,file=TRIM(filename)) 
     503                  DO jlev = 1, nmlev 
     504                     WRITE(10,'(F16.7,2I12,5F17.10)') zlev(jlev), & 
     505                        & jlev, inum(jlev,jboxl,jadd,jvar,jt), & 
     506                        & zbias(jlev,jboxl,jadd,jvar,jt), & 
     507                        & zrms(jlev,jboxl,jadd,jvar,jt), & 
     508                        & zsdev(jlev,jboxl,jadd,jvar,jt), & 
     509                        & zomean(jlev,jboxl,jadd,jvar,jt), & 
     510                        & zmmean(jlev,jboxl,jadd,jvar,jt) 
     511                  ENDDO 
     512                  CLOSE(10) 
     513               ENDDO 
     514            ENDDO 
     515            DO jadd=1,noberr 
     516               jboxl=0 
     517               DO jbox=1,nboxuser 
     518                  IF (lskipbox(jbox)) CYCLE 
     519                  jboxl=jboxl+1 
     520                  WRITE(filename,'(7A)')TRIM(cname(jvar)),& 
     521                     &                  TRIM(cobename(jadd)),'_',& 
     522                     &                  TRIM(cl_boxes_user(jbox)),'_',& 
     523                     &                  TRIM(ADJUSTL(ctyp(jt))),'.dat' 
     524                  OPEN(10,file=TRIM(filename)) 
     525                  DO jlev = 1, nmlev 
     526                     WRITE(10,'(F16.7,2I12,5F17.10)') zlev(jlev), & 
     527                        & jlev, inumov(jlev,jboxl,jadd,jvar,jt), & 
     528                        & zoemea(jlev,jboxl,jadd,jvar,jt), & 
     529                        & zovmea(jlev,jboxl,jadd,jvar,jt) 
     530                  ENDDO 
     531                  CLOSE(10) 
     532               ENDDO 
     533            ENDDO 
     534            DO jadd=1,nbgerr 
     535               jboxl=0 
     536               DO jbox=1,nboxuser 
     537                  IF (lskipbox(jbox)) CYCLE 
     538                  jboxl=jboxl+1 
     539                  WRITE(filename,'(7A)')TRIM(cname(jvar)),& 
     540                     &                  TRIM(cbgename(jadd)),'_',& 
     541                     &                  TRIM(cl_boxes_user(jbox)),'_',& 
     542                     &                  TRIM(ADJUSTL(ctyp(jt))),'.dat' 
     543                  OPEN(10,file=TRIM(filename)) 
     544                  DO jlev = 1, nmlev 
     545                     WRITE(10,'(F16.7,2I12,5F17.10)') zlev(jlev), & 
     546                        & jlev, inumbv(jlev,jboxl,jadd,jvar,jt), & 
     547                        & zbemea(jlev,jboxl,jadd,jvar,jt), & 
     548                        & zbvmea(jlev,jboxl,jadd,jvar,jt) 
     549                  ENDDO 
     550                  CLOSE(10) 
     551               ENDDO 
     552            ENDDO 
     553         ENDDO 
     554      ENDDO 
     555 
     556      DO jt=1,ntyp 
     557         DO jvar=1,nvar 
     558            jboxl=0 
     559            DO jbox=1,nboxuser 
     560               IF (lskipbox(jbox)) CYCLE 
     561               jboxl=jboxl+1 
     562               WRITE(filename,'(7A)')TRIM(cname(jvar)),'_',& 
     563                  &                  TRIM(cl_boxes_user(jbox)),'_',& 
     564                  &                  TRIM(ADJUSTL(ctyp(jt))),'.dat' 
    210565               OPEN(10,file=TRIM(filename)) 
    211566               DO jlev = 1, nmlev 
    212                   WRITE(10,'(F16.7,2I12,3F17.10)') zlev(jlev), & 
    213                      & jlev, inum(jlev,jbox,jadd,jvar), & 
    214                      & zmean(jlev,jbox,jadd,jvar), & 
    215                      & zrms(jlev,jbox,jadd,jvar), & 
    216                      & zsdev(jlev,jbox,jadd,jvar) 
     567                  WRITE(10,'(F16.7,2I12,F17.10)') zlev(jlev), & 
     568                     & jlev, inuma(jlev,jboxl,jvar,jt), & 
     569                     & zoamean(jlev,jboxl,jvar,jt) 
    217570               ENDDO 
    218571               CLOSE(10) 
     
    220573         ENDDO 
    221574      ENDDO 
     575 
     576      IF (lhistogram) THEN 
     577         DO jt=1,ntyp 
     578            DO jvar=1,nvar 
     579               DO jadd=1,nadd 
     580                  jboxl=0 
     581                  DO jbox=1,nboxuser 
     582                     IF (lskipbox(jbox)) CYCLE 
     583                     jboxl=jboxl+1 
     584                     WRITE(filename,'(7A)')TRIM(cname(jvar)),& 
     585                        &                  TRIM(caddname(jadd)),'_',& 
     586                        &                  TRIM(cl_boxes_user(jbox)),'_',& 
     587                        &                  TRIM(ADJUSTL(ctyp(jt))),& 
     588                        &                  '_histogram.dat' 
     589                     OPEN(10,file=TRIM(filename)) 
     590                     WRITE(10,'(A10,1000F10.2)')'#',(zlev(jlev),jlev=1,nmlev) 
     591                     DO ji=1,hist(jvar)%npoints 
     592                        WRITE(10,'(F10.2,1000I10)') & 
     593                           & zhistmin(jvar)+(ji-1)*zhiststep(jvar), & 
     594                           & (hist(jvar)%nhist(ji,jlev,jboxl,jadd,jt),jlev=1,nmlev) 
     595                     ENDDO 
     596                     CLOSE(10) 
     597                  ENDDO 
     598               ENDDO 
     599            ENDDO 
     600         ENDDO 
     601      ENDIF 
     602       
    222603   ENDIF 
    223604 
    224    IF (lhistogram) THEN 
    225       DO jvar=1, nvar 
    226          DO jadd=1, nadd 
    227             DO jbox=jstabox, jendbox 
    228                WRITE(filename,'(5A)')TRIM(cname(jvar)),& 
    229                   &                  TRIM(caddname(jadd)),'_',& 
    230                   &                  TRIM(cl_boxes(jbox)),'_histogram.dat' 
    231                OPEN(10,file=TRIM(filename)) 
    232                WRITE(10,'(A10,100F10.2)')'#',(zlev(jlev),jlev=1,nmlev) 
    233                DO ji=1,hist(jvar)%npoints 
    234                   WRITE(10,'(F10.2,100I10)') & 
    235                      & zhistmin(jvar)+(ji-1)*zhiststep(jvar), & 
    236                      & (hist(jvar)%nhist(ji,jlev,jbox,jadd),jlev=1,nmlev) 
    237                ENDDO 
    238                CLOSE(10) 
    239             ENDDO 
     605   IF (lnetcdf) THEN 
     606 
     607      IF (nadd>0) THEN 
     608         DO jt=1,ntyp 
     609            WRITE(outfilename,'(3A)')'fbstat_',TRIM(ADJUSTL(ctyp(jt))),'.nc' 
     610            CALL fbstat_ncwrite(TRIM(outfilename),& 
     611               & nvar,cname,nadd,caddname,noberr,cobename,nbgerr,cbgename,& 
     612               & nboxuser,nboxuserl,20,cl_boxes_user,lskipbox,nmlev,zlev,& 
     613               & inum(:,:,:,:,jt),zbias(:,:,:,:,jt),zrms(:,:,:,:,jt), & 
     614               & zsdev(:,:,:,:,jt),zomean(:,:,:,:,jt),zmmean(:,:,:,:,jt),& 
     615               & inuma(:,:,:,jt),zoamean(:,:,:,jt), & 
     616               & inumov(:,:,:,:,jt),zoemea(:,:,:,:,jt),zovmea(:,:,:,:,jt), & 
     617               & inumbv(:,:,:,:,jt),zbemea(:,:,:,:,jt),zbvmea(:,:,:,:,jt) ) 
     618            IF (lhistogram) THEN 
     619               WRITE(outfilename,'(3A)')'fbstat_hist_',TRIM(ADJUSTL(ctyp(jt))),'.nc' 
     620               CALL fbstat_ncwrite_hist(TRIM(outfilename),& 
     621                  & nvar,cname,nadd,caddname,& 
     622                  & nboxuser,20,cl_boxes_user,lskipbox,nmlev,zlev,& 
     623                  & hist,zhistmin,zhiststep,jt) 
     624            ENDIF 
     625            IF (lxyplot) THEN 
     626               WRITE(outfilename,'(3A)')'fbstat_xyplot_',TRIM(ADJUSTL(ctyp(jt))),'.nc' 
     627               CALL fbstat_ncwrite_xy(TRIM(outfilename),& 
     628                  & nvar,cname,nadd,caddname,& 
     629                  & nboxuser,20,cl_boxes_user,lskipbox,nmlev,zlev,& 
     630                  & xy,zxymin,zxystep,jt) 
     631            ENDIF 
    240632         ENDDO 
    241       ENDDO 
     633      ENDIF 
    242634   ENDIF 
    243635 
    244636   IF (lomona) THEN 
    245637 
     638      IF (ntyp>1) THEN 
     639         WRITE(*,*)'Omona file only supported for the first type which is : ',TRIM(ctyp(1)) 
     640      ENDIF 
    246641      IF (nmlev>1) THEN 
    247          ALLOCATE(zdat3d(nmlev,nbox,1)) 
     642         ALLOCATE(zdat3d(nmlev,nboxuser,1)) 
    248643      ELSE 
    249          ALLOCATE(zdat2d(nbox,1)) 
     644         ALLOCATE(zdat2d(nboxuser,1)) 
    250645      ENDIF 
    251646 
     
    257652      iloopno = loopno 
    258653      linnerini = linner 
    259       DO jvar = 1, nvar 
    260          linner = linnerini 
    261          loopno = iloopno 
    262          SELECT CASE (TRIM(cname(jvar))) 
    263          CASE('POTM') 
    264             cl_var = 'votemper' 
    265          CASE('PSAL') 
    266             cl_var='vosaline' 
    267          CASE('SLA') 
    268             cl_var='sossheig' 
    269          CASE('SST') 
    270             cl_var='sosstsst' 
    271          END SELECT 
    272          DO jadd = 1, nadd 
    273             linner = (caddname(jadd)(1:3)=='Hxa').OR.linner 
     654      i_fill=0 
     655 
     656      DO jt=1,ntyp 
     657         DO jvar = 1, nvar 
     658            linner = linnerini 
     659            loopno = iloopno 
     660            SELECT CASE (TRIM(cname(jvar))) 
     661            CASE('POTM') 
     662               cl_var = 'votemper' 
     663            CASE('PSAL') 
     664               cl_var='vosaline' 
     665            CASE('SLA') 
     666               cl_var='sossheig' 
     667            CASE('SST') 
     668               cl_var='sosstsst' 
     669            CASE('UVEL') 
     670               cl_var='vozocrtx' 
     671            CASE('VVEL') 
     672               cl_var='vomecrty' 
     673            END SELECT 
     674            DO jadd = 1, nadd 
     675               linner = (caddname(jadd)(1:3)=='Hxa').OR.linner 
     676               IF (lpassive) THEN 
     677                  ityp=145 
     678               ELSE 
     679                  IF (linner) THEN 
     680                     linnerp=.TRUE. 
     681                     ityp=144 
     682                     IF (jadd>1) loopno=loopno+1 
     683                  ELSE 
     684                     ityp=142 
     685                     IF (.NOT.linnerp) THEN 
     686                        IF (jadd>1) loopno=loopno+1 
     687                     ENDIF 
     688                  ENDIF 
     689               ENDIF 
     690               WRITE(cltyp,'(I3.3,A1,I2.2,A1,A)')ityp,'_',loopno,'_',& 
     691                  & TRIM(ADJUSTL(ctyp(jt))) 
     692               CALL obs_variable_att(cltyp) 
     693               IF (nmlev>1) THEN 
     694                  zdat3d(:,:,1) = zbias(:,:,jadd,jvar,jt) 
     695                  i_fill=0 
     696                  CALL write_omona_netcdf(cl_filename_out,zdat3d,itime, & 
     697                     &                    cl_boxes_user,REAL(fbrmdi),i_fill) 
     698                  CALL write_dep_netcdf(cl_filename_out,cl_boxes_user,zlev) 
     699               ELSE 
     700                  zdat2d(:,1) = zbias(1,:,jadd,jvar,jt) 
     701                  i_fill=0 
     702                  CALL write_omona_netcdf(cl_filename_out,zdat2d,itime, & 
     703                     &                    cl_boxes_user,REAL(fbrmdi),i_fill) 
     704               ENDIF 
     705               IF (lpassive) THEN 
     706                  ityp=245 
     707               ELSE 
     708                  IF (linner) THEN 
     709                     ityp=244 
     710                  ELSE 
     711                     ityp=242 
     712                  ENDIF 
     713               ENDIF 
     714               WRITE(cltyp,'(I3.3,A1,I2.2,A1,A)')ityp,'_',loopno,'_',& 
     715                  & TRIM(ADJUSTL(ctyp(jt))) 
     716               CALL obs_variable_att(cltyp) 
     717               IF (nmlev>1) THEN 
     718                  zdat3d(:,:,1) = zrms(:,:,jadd,jvar,jt) 
     719                  i_fill=0 
     720                  CALL write_omona_netcdf(cl_filename_out,zdat3d,itime, & 
     721                     &                    cl_boxes_user,REAL(fbrmdi),i_fill) 
     722                  CALL write_dep_netcdf(cl_filename_out,cl_boxes_user,zlev) 
     723               ELSE 
     724                  zdat2d(:,1) = zrms(1,:,jadd,jvar,jt) 
     725                  i_fill=0 
     726                  CALL write_omona_netcdf(cl_filename_out,zdat2d,itime, & 
     727                     &                    cl_boxes_user,REAL(fbrmdi),i_fill) 
     728               ENDIF 
     729               IF (lpassive) THEN 
     730                  ityp=345 
     731               ELSE 
     732                  IF (linner) THEN 
     733                     ityp=344 
     734                  ELSE 
     735                     ityp=342 
     736                  ENDIF 
     737               ENDIF 
     738               WRITE(cltyp,'(I3.3,A1,I2.2,A1,A)')ityp,'_',loopno,'_',& 
     739               & TRIM(ADJUSTL(ctyp(jt))) 
     740               CALL obs_variable_att(cltyp) 
     741               IF (nmlev>1) THEN 
     742                  zdat3d(:,:,1) = zsdev(:,:,jadd,jvar,jt) 
     743                  i_fill=0 
     744                  CALL write_omona_netcdf(cl_filename_out,zdat3d,itime, & 
     745                     &                    cl_boxes_user,REAL(fbrmdi),i_fill) 
     746                  CALL write_dep_netcdf(cl_filename_out,cl_boxes_user,zlev) 
     747               ELSE 
     748                  zdat2d(:,1) = zsdev(1,:,jadd,jvar,jt) 
     749                  i_fill=0 
     750                  CALL write_omona_netcdf(cl_filename_out,zdat2d,itime, & 
     751                     &                    cl_boxes_user,REAL(fbrmdi),i_fill) 
     752               ENDIF 
     753               IF (lpassive) THEN 
     754                  ityp=445 
     755               ELSE 
     756                  IF (linner) THEN 
     757                     ityp=444 
     758                  ELSE 
     759                     ityp=442 
     760                  ENDIF 
     761               ENDIF 
     762               WRITE(cltyp,'(I3.3,A1,I2.2,A1,A)')ityp,'_',loopno,'_',& 
     763                  & TRIM(ADJUSTL(ctyp(jt))) 
     764               CALL obs_variable_att(cltyp) 
     765               IF (nmlev>1) THEN 
     766                  zdat3d(:,:,1) = inum(:,:,jadd,jvar,jt) 
     767                  i_fill=0 
     768                  CALL write_omona_netcdf(cl_filename_out,zdat3d,itime, & 
     769                     &                    cl_boxes_user,REAL(fbrmdi),i_fill) 
     770                  CALL write_dep_netcdf(cl_filename_out,cl_boxes_user,zlev) 
     771               ELSE 
     772                  zdat2d(:,1) = inum(1,:,jadd,jvar,jt) 
     773                  i_fill=0 
     774                  CALL write_omona_netcdf(cl_filename_out,zdat2d,itime, & 
     775                     &                    cl_boxes_user,REAL(fbrmdi),i_fill) 
     776               ENDIF 
     777               IF (lpassive) THEN 
     778                  ityp=545 
     779               ELSE 
     780                  IF (linner) THEN 
     781                     ityp=544 
     782                  ELSE 
     783                     ityp=542 
     784                  ENDIF 
     785               ENDIF 
     786               WRITE(cltyp,'(I3.3,A1,I2.2,A1,A)')ityp,'_',loopno,'_',& 
     787                  & TRIM(ADJUSTL(ctyp(jt))) 
     788               CALL obs_variable_att(cltyp) 
     789               IF (nmlev>1) THEN 
     790                  zdat3d(:,:,1) = zomean(:,:,jadd,jvar,jt) 
     791                  i_fill=0 
     792                  CALL write_omona_netcdf(cl_filename_out,zdat3d,itime, & 
     793                     &                    cl_boxes_user,REAL(fbrmdi),i_fill) 
     794                  CALL write_dep_netcdf(cl_filename_out,cl_boxes_user,zlev) 
     795               ELSE 
     796                  zdat2d(:,1) = zomean(1,:,jadd,jvar,jt) 
     797                  i_fill=0 
     798                  CALL write_omona_netcdf(cl_filename_out,zdat2d,itime, & 
     799                     &                    cl_boxes_user,REAL(fbrmdi),i_fill) 
     800               ENDIF 
     801               IF (lpassive) THEN 
     802                  ityp=645 
     803               ELSE 
     804                  IF (linner) THEN 
     805                     ityp=644 
     806                  ELSE 
     807                     ityp=642 
     808                  ENDIF 
     809               ENDIF 
     810               WRITE(cltyp,'(I3.3,A1,I2.2,A1,A)')ityp,'_',loopno,'_',& 
     811                  & TRIM(ADJUSTL(ctyp(jt))) 
     812               CALL obs_variable_att(cltyp) 
     813               IF (nmlev>1) THEN 
     814                  zdat3d(:,:,1) = zmmean(:,:,jadd,jvar,jt) 
     815                  i_fill=0 
     816                  CALL write_omona_netcdf(cl_filename_out,zdat3d,itime, & 
     817                     &                    cl_boxes_user,REAL(fbrmdi),i_fill) 
     818                  CALL write_dep_netcdf(cl_filename_out,cl_boxes_user,zlev) 
     819               ELSE 
     820                  zdat2d(:,1) = zmmean(1,:,jadd,jvar,jt) 
     821                  i_fill=0 
     822                  CALL write_omona_netcdf(cl_filename_out,zdat2d,itime, & 
     823                     &                    cl_boxes_user,REAL(fbrmdi),i_fill) 
     824               ENDIF 
     825               linner=.FALSE. 
     826            ENDDO 
     827            loopno = iloopno 
     828            DO jadd = 1, noberr 
     829               linner = .TRUE. 
     830               ityp = 139 
     831               IF (jadd>1) loopno=loopno+1 
     832               WRITE(cltyp,'(I3.3,A1,I2.2,A1,A)')ityp,'_',loopno,'_',& 
     833                  & TRIM(ADJUSTL(ctyp(jt))) 
     834               CALL obs_variable_att(cltyp) 
     835               IF (nmlev>1) THEN 
     836                  zdat3d(:,:,1) = zoemea(:,:,jadd,jvar,jt) 
     837                  i_fill=0 
     838                  CALL write_omona_netcdf(cl_filename_out,zdat3d,itime, & 
     839                     &                    cl_boxes_user,REAL(fbrmdi),i_fill) 
     840                  CALL write_dep_netcdf(cl_filename_out,cl_boxes_user,zlev) 
     841               ELSE 
     842                  zdat2d(:,1) = zoemea(1,:,jadd,jvar,jt) 
     843                  i_fill=0 
     844                  CALL write_omona_netcdf(cl_filename_out,zdat2d,itime, & 
     845                     &                    cl_boxes_user,REAL(fbrmdi),i_fill) 
     846               ENDIF 
     847               ityp = 239 
     848               WRITE(cltyp,'(I3.3,A1,I2.2,A1,A)')ityp,'_',loopno,'_',& 
     849                  & TRIM(ADJUSTL(ctyp(jt))) 
     850               CALL obs_variable_att(cltyp) 
     851               IF (nmlev>1) THEN 
     852                  zdat3d(:,:,1) = zovmea(:,:,jadd,jvar,jt) 
     853                  i_fill=0 
     854                  CALL write_omona_netcdf(cl_filename_out,zdat3d,itime, & 
     855                     &                    cl_boxes_user,REAL(fbrmdi),i_fill) 
     856                  CALL write_dep_netcdf(cl_filename_out,cl_boxes_user,zlev) 
     857               ELSE 
     858                  zdat2d(:,1) = zovmea(1,:,jadd,jvar,jt) 
     859                  i_fill=0 
     860                  CALL write_omona_netcdf(cl_filename_out,zdat2d,itime, & 
     861                     &                    cl_boxes_user,REAL(fbrmdi),i_fill) 
     862               ENDIF 
     863            ENDDO 
     864            loopno = iloopno 
     865            DO jadd = 1, nbgerr 
     866               linner = .TRUE. 
     867               ityp = 141 
     868               IF (jadd>1) loopno=loopno+1 
     869               WRITE(cltyp,'(I3.3,A1,I2.2,A1,A)')ityp,'_',loopno,'_',& 
     870                  & TRIM(ADJUSTL(ctyp(jt))) 
     871               CALL obs_variable_att(cltyp) 
     872               IF (nmlev>1) THEN 
     873                  zdat3d(:,:,1) = zbemea(:,:,jadd,jvar,jt) 
     874                  i_fill=0 
     875                  CALL write_omona_netcdf(cl_filename_out,zdat3d,itime, & 
     876                     &                    cl_boxes_user,REAL(fbrmdi),i_fill) 
     877                  CALL write_dep_netcdf(cl_filename_out,cl_boxes_user,zlev) 
     878               ELSE 
     879                  zdat2d(:,1) = zbemea(1,:,jadd,jvar,jt) 
     880                  i_fill=0 
     881                  CALL write_omona_netcdf(cl_filename_out,zdat2d,itime, & 
     882                     &                    cl_boxes_user,REAL(fbrmdi),i_fill) 
     883               ENDIF 
     884               ityp = 241 
     885               WRITE(cltyp,'(I3.3,A1,I2.2,A1,A)')ityp,'_',loopno,'_',& 
     886                  & TRIM(ADJUSTL(ctyp(jt))) 
     887               CALL obs_variable_att(cltyp) 
     888               IF (nmlev>1) THEN 
     889                  zdat3d(:,:,1) = zbvmea(:,:,jadd,jvar,jt) 
     890                  i_fill=0 
     891                  CALL write_omona_netcdf(cl_filename_out,zdat3d,itime, & 
     892                     &                    cl_boxes_user,REAL(fbrmdi),i_fill) 
     893                  CALL write_dep_netcdf(cl_filename_out,cl_boxes_user,zlev) 
     894               ELSE 
     895                  zdat2d(:,1) = zbvmea(1,:,jadd,jvar,jt) 
     896                  i_fill=0 
     897                  CALL write_omona_netcdf(cl_filename_out,zdat2d,itime, & 
     898                     &                    cl_boxes_user,REAL(fbrmdi),i_fill) 
     899               ENDIF 
     900            ENDDO 
    274901            IF (lpassive) THEN 
    275                ityp=145 
     902               ityp=745 
    276903            ELSE 
    277                IF (linner) THEN 
    278                   linnerp=.TRUE. 
    279                   ityp=144 
    280                   IF (jadd>1) loopno=loopno+1 
    281                ELSE 
    282                   ityp=142 
    283                   IF (.NOT.linnerp) THEN 
    284                      IF (jadd>1) loopno=loopno+1 
    285                   ENDIF 
    286                ENDIF 
    287             ENDIF 
    288             WRITE(cltyp,'(I3.3,A1,I2.2)')ityp,'_',loopno 
     904               ityp=742 
     905            ENDIF 
     906            WRITE(cltyp,'(I3.3,A1,A)')ityp,'_',& 
     907               & TRIM(ADJUSTL(ctyp(jt))) 
    289908            CALL obs_variable_att(cltyp) 
    290909            IF (nmlev>1) THEN 
    291                zdat3d(:,:,1) = zmean(:,:,jadd,jvar) 
     910               zdat3d(:,:,1) = inuma(:,:,jvar,jt) 
     911               i_fill=0 
    292912               CALL write_omona_netcdf(cl_filename_out,zdat3d,itime, & 
    293                   &                    cl_boxes,REAL(fbrmdi)) 
    294                CALL write_dep_netcdf(cl_filename_out,cl_boxes,zlev) 
     913                  &                    cl_boxes_user,REAL(fbrmdi),i_fill) 
     914               CALL write_dep_netcdf(cl_filename_out,cl_boxes_user,zlev) 
    295915            ELSE 
    296                zdat2d(:,1) = zmean(1,:,jadd,jvar) 
     916               zdat2d(:,1) = inuma(1,:,jvar,jt) 
     917               i_fill=0 
    297918               CALL write_omona_netcdf(cl_filename_out,zdat2d,itime, & 
    298                   &                    cl_boxes,REAL(fbrmdi)) 
     919                  &                    cl_boxes_user,REAL(fbrmdi),i_fill) 
    299920            ENDIF 
    300921            IF (lpassive) THEN 
    301                ityp=245 
     922               ityp=845 
    302923            ELSE 
    303                IF (linner) THEN 
    304                   ityp=244 
    305                ELSE 
    306                   ityp=242 
    307                ENDIF 
    308             ENDIF 
    309             WRITE(cltyp,'(I3.3,A1,I2.2)')ityp,'_',loopno 
     924               ityp=842 
     925            ENDIF 
     926            WRITE(cltyp,'(I3.3,A1,A)')ityp,'_',& 
     927               & TRIM(ADJUSTL(ctyp(jt))) 
    310928            CALL obs_variable_att(cltyp) 
    311929            IF (nmlev>1) THEN 
    312                zdat3d(:,:,1) = zrms(:,:,jadd,jvar) 
     930               zdat3d(:,:,1) = zoamean(:,:,jvar,jt) 
     931               i_fill=0 
    313932               CALL write_omona_netcdf(cl_filename_out,zdat3d,itime, & 
    314                   &                    cl_boxes,REAL(fbrmdi)) 
    315                CALL write_dep_netcdf(cl_filename_out,cl_boxes,zlev) 
     933                  &                    cl_boxes_user,REAL(fbrmdi),i_fill) 
     934               CALL write_dep_netcdf(cl_filename_out,cl_boxes_user,zlev) 
    316935            ELSE 
    317                zdat2d(:,1) = zrms(1,:,jadd,jvar) 
     936               zdat2d(:,1) = zoamean(1,:,jvar,jt) 
     937               i_fill=0 
    318938               CALL write_omona_netcdf(cl_filename_out,zdat2d,itime, & 
    319                   &                    cl_boxes,REAL(fbrmdi)) 
    320             ENDIF 
    321             IF (lpassive) THEN 
    322                ityp=345 
    323             ELSE 
    324                IF (linner) THEN 
    325                   ityp=344 
    326                ELSE 
    327                   ityp=342 
    328                ENDIF 
    329             ENDIF 
    330             WRITE(cltyp,'(I3.3,A1,I2.2)')ityp,'_',loopno 
    331             CALL obs_variable_att(cltyp) 
    332             IF (nmlev>1) THEN 
    333                zdat3d(:,:,1) = zsdev(:,:,jadd,jvar) 
    334                CALL write_omona_netcdf(cl_filename_out,zdat3d,itime, & 
    335                   &                    cl_boxes,REAL(fbrmdi)) 
    336                CALL write_dep_netcdf(cl_filename_out,cl_boxes,zlev) 
    337             ELSE 
    338                zdat2d(:,1) = zsdev(1,:,jadd,jvar) 
    339                CALL write_omona_netcdf(cl_filename_out,zdat2d,itime, & 
    340                   &                    cl_boxes,REAL(fbrmdi)) 
    341             ENDIF 
    342             IF (lpassive) THEN 
    343                ityp=445 
    344             ELSE 
    345                IF (linner) THEN 
    346                   ityp=444 
    347                ELSE 
    348                   ityp=442 
    349                ENDIF 
    350             ENDIF 
    351             WRITE(cltyp,'(I3.3,A1,I2.2)')ityp,'_',loopno 
    352             CALL obs_variable_att(cltyp) 
    353             IF (nmlev>1) THEN 
    354                zdat3d(:,:,1) = inum(:,:,jadd,jvar) 
    355                CALL write_omona_netcdf(cl_filename_out,zdat3d,itime, & 
    356                   &                    cl_boxes,REAL(fbrmdi)) 
    357                CALL write_dep_netcdf(cl_filename_out,cl_boxes,zlev) 
    358             ELSE 
    359                zdat2d(:,1) = inum(1,:,jadd,jvar) 
    360                CALL write_omona_netcdf(cl_filename_out,zdat2d,itime, & 
    361                   &                    cl_boxes,REAL(fbrmdi)) 
    362             ENDIF 
    363             linner=.FALSE. 
     939                  &                    cl_boxes_user,REAL(fbrmdi),i_fill) 
     940            ENDIF 
    364941         ENDDO 
    365942      ENDDO 
     
    375952CONTAINS 
    376953 
    377    SUBROUTINE fb_stat(fbdata,nstabox, nendbox, nmlev,zlev,lnear,kqc,lhist) 
     954   SUBROUTINE fb_stat(fbdata,lskipbox,nmlev,zlev,lnear,kqc,kqco,lhist,lxyplot,& 
     955      &               ntyp,ctyp,ipdcst,mindcst) 
    378956      USE fbaccdata 
    379957      USE coords 
    380958      TYPE(obfbdata) :: fbdata 
    381       INTEGER :: nstabox,nendbox 
     959      LOGICAL, DIMENSION(nboxuser) :: lskipbox 
    382960      INTEGER :: nmlev 
    383961      REAL :: zlev(nmlev) 
    384962      LOGICAL :: lnear 
    385       INTEGER :: kqc 
    386       LOGICAL :: lhist 
    387       INTEGER :: jlev, jobs, jvar, klev,jlev2,ih 
    388       REAL :: zarea(4),zlat,zlon,zdiff,zdiff2 
     963      INTEGER :: kqc,kqco 
     964      LOGICAL :: lhist,lxyplot 
     965      INTEGER :: ntyp 
     966      CHARACTER(len=ilentyp), DIMENSION(ntyp) :: ctyp 
     967      INTEGER :: ipdcst 
     968      REAL :: mindcst 
     969      INTEGER, DIMENSION(nboxuser) :: jlboxnum 
     970      INTEGER :: jlev, jobs, jvar, klev,jlev2,ih,ja,jadd,jbox,jt,ix,iy,jboxl 
     971      REAL :: zarea(4),zlat,zlon,zdiff,zdiff2,zvar 
    389972       
    390       DO jbox = nstabox, nendbox 
    391          CALL coord_area(cl_boxes(jbox),zarea) 
     973      jboxl=0 
     974      jlboxnum=-1 
     975      DO jbox = 1, nboxuser 
     976         IF (lskipbox(jbox)) CYCLE 
     977         jboxl=jboxl+1 
     978         jlboxnum(jbox)=jboxl 
     979      ENDDO 
     980 
     981      !$omp parallel do default(shared) private(jlev,jobs,jvar,klev,jlev2,ih,ja,jadd,jbox,jt,ix,iy,jboxl,zarea,zlat,zlon,zdiff,zdiff2) 
     982      DO jbox = 1, nboxuser 
     983         IF (lskipbox(jbox)) CYCLE 
     984         jboxl=jlboxnum(jbox) 
     985         CALL coord_area_user(cl_boxes_user(jbox),zarea) 
    392986         DO jobs = 1, fbdata%nobs 
     987            ! Reject observations with observation, position or time flag rejections 
     988            IF (fbdata%ioqc(jobs)>kqco) CYCLE 
     989            IF (fbdata%ipqc(jobs)>kqco) CYCLE 
     990            IF (fbdata%itqc(jobs)>kqco) CYCLE 
    393991            zlat = fbdata%pphi(jobs) 
    394992            zlon = fbdata%plam(jobs) 
     
    4071005             
    4081006               DO jlev = 1, fbdata%nlev 
     1007                  IF (ipdcst>0) THEN 
     1008                     IF (fbdata%pext(jlev,jobs,ipdcst)==fbrmdi) CYCLE 
     1009                     IF (fbdata%pext(jlev,jobs,ipdcst)<mindcst) CYCLE 
     1010                  ENDIF 
    4091011                  DO jvar = 1, fbdata%nvar 
    4101012                     IF (nmlev==1) THEN 
     
    4251027                        ENDIF 
    4261028                        IF ( klev > nmlev ) THEN 
    427                            DO jadd = 1, fbdata%nvar 
    428                               IF ( ABS(fbdata%padd(jlev,jobs,jadd,jvar))<9000 ) THEN 
     1029                           DO ja = 1, fbdata%nadd 
     1030                              IF ( fbdata%caddname(ja)(1:2) /= 'Hx' ) CYCLE 
     1031                              IF ( ABS(fbdata%padd(jlev,jobs,ja,jvar))<9000 ) THEN 
    4291032                                 WRITE(*,*)'Error in fb_stat' 
    4301033                                 WRITE(*,*)'Increase nmlev to at least ',klev 
     
    4351038                        ENDIF 
    4361039                     ENDIF 
     1040                     IF (( klev > 0 ).AND. & 
     1041                        &(ABS(fbdata%pob(jlev,jobs,jvar)) < 9000 )) THEN 
     1042                        DO jt=1,ntyp 
     1043                           IF (TRIM(ADJUSTL(ctyp(jt)))/='all') THEN 
     1044                              IF (TRIM(ADJUSTL(ctyp(jt)))/=TRIM(ADJUSTL(fbdata%cdtyp(jobs)))) CYCLE 
     1045                           ENDIF 
     1046                           inuma(klev,jboxl,jvar,jt) = inuma(klev,jboxl,jvar,jt) + 1 
     1047                           zoamean(klev,jboxl,jvar,jt) = zoamean(klev,jboxl,jvar,jt) + & 
     1048                              & fbdata%pob(jlev,jobs,jvar) 
     1049                        ENDDO 
     1050                     ENDIF 
     1051                     IF ( fbdata%ivlqc(jlev,jobs,jvar) < 0 ) CYCLE  
    4371052                     IF ( fbdata%ivlqc(jlev,jobs,jvar) > kqc ) CYCLE  
    4381053                     IF (( klev > 0 ).AND. & 
    4391054                        &(ABS(fbdata%pob(jlev,jobs,jvar)) < 9000 )) THEN 
    440                         DO jadd = 1, fbdata%nadd 
    441                            IF ( ABS(fbdata%padd(jlev,jobs,jadd,jvar)) < 9000 ) THEN 
    442                               zdiff = ( fbdata%padd(jlev,jobs,jadd,jvar) - & 
     1055                        jadd = 0 
     1056                        DO ja = 1, fbdata%nadd 
     1057                           IF ( fbdata%caddname(ja)(1:2) /= 'Hx' ) CYCLE 
     1058                           jadd = jadd + 1 
     1059                           IF ( ABS(fbdata%padd(jlev,jobs,ja,jvar)) < 9000 ) THEN 
     1060                              zdiff = ( fbdata%padd(jlev,jobs,ja,jvar) - & 
    4431061                                 &      fbdata%pob(jlev,jobs,jvar) ) 
    444                               inum(klev,jbox,jadd,jvar) = inum(klev,jbox,jadd,jvar) + 1 
    445                               zmean(klev,jbox,jadd,jvar) = zmean(klev,jbox,jadd,jvar) + & 
    446                                  & zdiff 
    447                               zrms(klev,jbox,jadd,jvar) = zrms(klev,jbox,jadd,jvar) + & 
    448                                  & zdiff * zdiff 
     1062                              DO jt=1,ntyp 
     1063                                 IF (TRIM(ADJUSTL(ctyp(jt)))/='all') THEN 
     1064                                    IF (TRIM(ADJUSTL(ctyp(jt)))/=TRIM(ADJUSTL(fbdata%cdtyp(jobs)))) CYCLE 
     1065                                 ENDIF 
     1066                                 inum(klev,jboxl,jadd,jvar,jt) = inum(klev,jboxl,jadd,jvar,jt) + 1 
     1067                                 zbias(klev,jboxl,jadd,jvar,jt) = zbias(klev,jboxl,jadd,jvar,jt) + & 
     1068                                    & zdiff 
     1069                                 zrms(klev,jboxl,jadd,jvar,jt) = zrms(klev,jboxl,jadd,jvar,jt) + & 
     1070                                    & zdiff * zdiff 
     1071                                 zomean(klev,jboxl,jadd,jvar,jt) = zomean(klev,jboxl,jadd,jvar,jt) + & 
     1072                                    & fbdata%pob(jlev,jobs,jvar) 
     1073                                 zmmean(klev,jboxl,jadd,jvar,jt) = zmmean(klev,jboxl,jadd,jvar,jt) + & 
     1074                                    & fbdata%padd(jlev,jobs,ja,jvar) 
     1075                              ENDDO 
    4491076                              IF (ABS(zdiff)>zcheck(jvar)) THEN 
    4501077                                 WRITE(*,*)'Departure outside check range ',& 
     
    4591086                                 WRITE(*,*)'Depth = ',fbdata%pdep(jlev,jobs) 
    4601087                                 WRITE(*,*)'Obs   = ',fbdata%pob(jlev,jobs,jvar) 
    461                                  WRITE(*,*)'Var   = ',fbdata%padd(jlev,jobs,jadd,jvar) 
     1088                                 WRITE(*,*)'Var   = ',fbdata%padd(jlev,jobs,ja,jvar) 
    4621089                                 WRITE(*,*)'QC    = ',fbdata%ivlqc(jlev,jobs,jvar) 
    4631090                                 WRITE(*,*)'QCflag= ',fbdata%ivlqcf(:,jlev,jobs,jvar) 
     
    4661093                                 ih=NINT((zdiff-zhistmin(jvar))/zhiststep(jvar))+1 
    4671094                                 IF ((ih>=1).AND.(ih<=hist(jvar)%npoints)) THEN 
    468                                     hist(jvar)%nhist(ih,klev,jbox,jadd) = & 
    469                                        hist(jvar)%nhist(ih,klev,jbox,jadd) +1 
     1095                                    DO jt=1,ntyp 
     1096                                       IF (TRIM(ADJUSTL(ctyp(jt)))/='all') THEN 
     1097                                          IF (TRIM(ADJUSTL(ctyp(jt)))/=TRIM(ADJUSTL(fbdata%cdtyp(jobs)))) CYCLE 
     1098                                       ENDIF 
     1099                                       hist(jvar)%nhist(ih,klev,jboxl,jadd,jt) = & 
     1100                                          hist(jvar)%nhist(ih,klev,jboxl,jadd,jt) +1 
     1101                                    ENDDO 
    4701102                                 ELSE 
    4711103                                    WRITE(*,*)'Histogram value outside range for ',& 
     
    4761108                                    WRITE(*,*)'Step  = ',zhiststep(jvar) 
    4771109                                    WRITE(*,*)'Index = ',ih 
    478                                     WRITE(*,*)'Id    = ',fbdata%cdwmo(jobs) 
     1110                                    WRITE(*,*)'Id    = ',TRIM(fbdata%cdwmo(jobs)) 
     1111                                    WRITE(*,*)'Typ   = ',TRIM(fbdata%cdtyp(jobs)) 
     1112                                    WRITE(*,*)'Lat   = ',fbdata%pphi(jobs) 
     1113                                    WRITE(*,*)'Lon   = ',fbdata%plam(jobs) 
     1114                                    WRITE(*,*)'Tim   = ',fbdata%ptim(jobs) 
     1115                                    WRITE(*,*)'Depth = ',fbdata%pdep(jlev,jobs) 
     1116                                    WRITE(*,*)'Obs   = ',fbdata%pob(jlev,jobs,jvar) 
     1117                                    WRITE(*,*)'Var   = ',fbdata%padd(jlev,jobs,jadd,jvar) 
     1118                                    WRITE(*,*)'QC    = ',fbdata%ivlqc(jlev,jobs,jvar) 
     1119                                    WRITE(*,*)'QCflag= ',fbdata%ivlqcf(:,jlev,jobs,jvar) 
     1120                                 ENDIF 
     1121                              ENDIF 
     1122                              IF (lxyplot) THEN 
     1123                                 ix=NINT((fbdata%pob(jlev,jobs,jvar)-zxymin(jvar))/& 
     1124                                    &    zxystep(jvar))+1 
     1125                                 iy=NINT((fbdata%padd(jlev,jobs,ja,jvar)-zxymin(jvar))/& 
     1126                                    &    zxystep(jvar))+1 
     1127                                 IF ((ix>=1).AND.(ix<=xy(jvar)%npoints).AND. & 
     1128                                    &(iy>=1).AND.(iy<=xy(jvar)%npoints)) THEN 
     1129                                    DO jt=1,ntyp 
     1130                                       IF (TRIM(ADJUSTL(ctyp(jt)))/='all') THEN 
     1131                                          IF (TRIM(ADJUSTL(ctyp(jt)))/=TRIM(ADJUSTL(fbdata%cdtyp(jobs)))) CYCLE 
     1132                                       ENDIF 
     1133                                       xy(jvar)%nxy(ix,iy,klev,jboxl,jadd,jt) = & 
     1134                                          xy(jvar)%nxy(ix,iy,klev,jboxl,jadd,jt) +1 
     1135                                    ENDDO 
     1136                                 ELSE 
     1137                                    WRITE(*,*)'xy plot values outside range for ',& 
     1138                                       & TRIM(fbdata%cname(jvar)),' entry ',& 
     1139                                       & fbdata%caddname(jadd) 
     1140                                    WRITE(*,*)'Obs   = ',fbdata%pob(jlev,jobs,jvar) 
     1141                                    WRITE(*,*)'Model = ',fbdata%padd(jlev,jobs,ja,jvar) 
     1142                                    WRITE(*,*)'Range = ',zxymin(jvar),zxymax(jvar) 
     1143                                    WRITE(*,*)'Step  = ',zxystep(jvar) 
     1144                                    WRITE(*,*)'Index = ',ih 
     1145                                    WRITE(*,*)'Id    = ',TRIM(fbdata%cdwmo(jobs)) 
     1146                                    WRITE(*,*)'Typ   = ',TRIM(fbdata%cdtyp(jobs)) 
    4791147                                    WRITE(*,*)'Lat   = ',fbdata%pphi(jobs) 
    4801148                                    WRITE(*,*)'Lon   = ',fbdata%plam(jobs) 
     
    4891157                           ENDIF 
    4901158                        ENDDO 
     1159                        jadd = 0 
     1160                        DO ja = 1, fbdata%nadd 
     1161                           IF ( fbdata%caddname(ja)(1:3) /= 'OBE' ) CYCLE 
     1162                           jadd = jadd + 1 
     1163                           IF ( ABS(fbdata%padd(jlev,jobs,ja,jvar)) < 9000 ) THEN 
     1164                              zvar = fbdata%padd(jlev,jobs,ja,jvar)*fbdata%padd(jlev,jobs,ja,jvar) 
     1165                              DO jt=1,ntyp 
     1166                                 IF (TRIM(ADJUSTL(ctyp(jt)))/='all') THEN 
     1167                                    IF (TRIM(ADJUSTL(ctyp(jt)))/=TRIM(ADJUSTL(fbdata%cdtyp(jobs)))) CYCLE 
     1168                                 ENDIF 
     1169                                 inumov(klev,jboxl,jadd,jvar,jt) = inumov(klev,jboxl,jadd,jvar,jt) + 1 
     1170                                 zoemea(klev,jboxl,jadd,jvar,jt) = zoemea(klev,jboxl,jadd,jvar,jt) + & 
     1171                                    & fbdata%padd(jlev,jobs,ja,jvar)                                  
     1172                                 zovmea(klev,jboxl,jadd,jvar,jt) = zovmea(klev,jboxl,jadd,jvar,jt) + zvar 
     1173                              ENDDO 
     1174                           ENDIF 
     1175                        ENDDO 
     1176                        jadd = 0 
     1177                        DO ja = 1, fbdata%nadd 
     1178                           IF ( fbdata%caddname(ja)(1:3) /= 'BGE' ) CYCLE 
     1179                           jadd = jadd + 1 
     1180                           IF ( ABS(fbdata%padd(jlev,jobs,ja,jvar)) < 9000 ) THEN 
     1181                              zvar = fbdata%padd(jlev,jobs,ja,jvar)*fbdata%padd(jlev,jobs,ja,jvar) 
     1182                              DO jt=1,ntyp 
     1183                                 IF (TRIM(ADJUSTL(ctyp(jt)))/='all') THEN 
     1184                                    IF (TRIM(ADJUSTL(ctyp(jt)))/=TRIM(ADJUSTL(fbdata%cdtyp(jobs)))) CYCLE 
     1185                                 ENDIF 
     1186                                 inumbv(klev,jboxl,jadd,jvar,jt) = inumbv(klev,jboxl,jadd,jvar,jt) + 1 
     1187                                 zbemea(klev,jboxl,jadd,jvar,jt) = zbemea(klev,jboxl,jadd,jvar,jt) + & 
     1188                                    & fbdata%padd(jlev,jobs,ja,jvar) 
     1189                                 zbvmea(klev,jboxl,jadd,jvar,jt) = zbvmea(klev,jboxl,jadd,jvar,jt) + zvar 
     1190                              ENDDO 
     1191                           ENDIF 
     1192                        ENDDO 
    4911193                     ENDIF 
    4921194                  ENDDO 
     
    4951197         ENDDO 
    4961198      ENDDO 
     1199      !$omp end parallel do 
    4971200       
    4981201   END SUBROUTINE fb_stat 
     1202 
     1203   SUBROUTINE fb_rmmean(fbdata) 
     1204      TYPE(obfbdata) :: fbdata 
     1205      INTEGER :: jadd,jmean 
     1206 
     1207      jmean=0 
     1208      DO jadd=1,fbdata%nadd 
     1209         IF (fbdata%caddname(jadd)(1:4)=='MEAN') THEN 
     1210            jmean=jadd 
     1211            EXIT 
     1212         ENDIF 
     1213      ENDDO 
     1214      IF (jmean==0) THEN 
     1215         WRITE(*,*)'Warning: MEAN additional variable not found' 
     1216         RETURN 
     1217      ENDIF 
     1218      IF (fbdata%nobs>0) THEN 
     1219         DO jadd=1,fbdata%nadd  
     1220            IF (fbdata%caddname(jadd)(1:2)=='Hx') THEN 
     1221               fbdata%padd(:,:,jadd,:)=fbdata%padd(:,:,jadd,:)& 
     1222                  &                   +fbdata%padd(:,:,jmean,:) 
     1223            ENDIF 
     1224         ENDDO 
     1225      ENDIF 
     1226 
     1227   END SUBROUTINE fb_rmmean 
    4991228 
    5001229   SUBROUTINE getlevsmean(nmlev,zlev) 
  • branches/dev_2802_OBStools/NEMOGCM/TOOLS/OBSTOOLS/src/fbthin.F90

    r2945 r3000  
    11PROGRAM fbthin 
     2   !!--------------------------------------------------------------------- 
     3   !! 
     4   !!                     ** PROGRAM fbthin ** 
     5   !! 
     6   !!  ** Purpose : Thin the data to 1 degree resolution 
     7   !! 
     8   !!  ** Method  : Use of utilities from obs_fbm. 
     9   !! 
     10   !!  ** Action  : 
     11   !! 
     12   !!   Usage: 
     13   !!     fbthin inputfile outputfile 
     14   !! 
     15   !!   Required: 
     16   !!     namelist = namthin.in 
     17   !! 
     18   !!   History : 
     19   !!        ! 2010 (K. Mogensen) Initial version 
     20   !!---------------------------------------------------------------------- 
    221   USE obs_fbm 
    322   IMPLICIT NONE 
     
    524   ! Command line arguments for output file and input file 
    625   ! 
    7 #ifndef NOIARGTHINROTO 
     26#ifndef NOIARGCPROTO 
    827   INTEGER,EXTERNAL :: iargc 
    928#endif 
     
    5069   SUBROUTINE fb_thin( fbdata ) 
    5170      ! 
    52       ! Observation thinning stub 
     71      ! Observation thinning  
    5372      ! 
    5473      IMPLICIT NONE 
    5574      TYPE(obfbdata) :: fbdata 
    56       REAL :: dlat = 1.0 
    57       REAL :: dlon = 1.0 
    58       LOGICAL :: lred = .TRUE. 
    59       INTEGER, ALLOCATABLE :: thinobs(:,:), thinqc(:,:) 
    60       REAL, ALLOCATABLE :: thindist(:,:), thingridlat(:), thingridlon(:,:) 
    61       INTEGER :: nlon,nlat 
    62       INTEGER :: ii,ij,iv,ilon,ilat,iqc,iobs,irej 
    63       REAL :: zlon,zdlon,zrpi,zdist 
    64       LOGICAL :: lexists 
    65       NAMELIST/namthin/dlat,dlon,lred 
     75      ! Namelist parameters 
     76      INTEGER, PARAMETER :: nmaxtypes = 10 
     77      CHARACTER(len=ilentyp), DIMENSION(nmaxtypes) :: thintypes 
     78      REAL, DIMENSION(nmaxtypes) :: thindists, thindtime 
     79      ! Local variables 
     80      NAMELIST/namthin/thintypes, thindists, thindtime 
     81      INTEGER :: it,ii,ij,iv,iobs,irej 
     82      REAL :: zdist 
     83 
     84      ! Get namelist 
     85      thintypes(:) = 'XXXX' 
     86      ! Distance in km 
     87      thindists(:) = 100.0 
     88      ! Time difference in days 
     89      thindtime(:) = 0.99999999 
     90      OPEN(10,file='namthin.in') 
     91      READ(10,namthin) 
     92      CLOSE(10) 
     93      WRITE(*,namthin) 
    6694       
    67       INQUIRE(file='namthin.in',exist=lexists) 
    68       IF (lexists) THEN 
    69          OPEN(10,file='namthin.in') 
    70          READ(10,namthin) 
    71          CLOSE(10) 
    72       ENDIF 
    73       WRITE(*,namthin) 
     95      ! Convert to meters 
     96      thindists(:) = thindists(:) * 1000.0 
    7497 
    75       nlon=360/dlon 
    76       nlat=180/dlat+1 
    77       ALLOCATE(thinobs(nlon,nlat)) 
    78       ALLOCATE(thinqc(nlon,nlat)) 
    79       ALLOCATE(thindist(nlon,nlat)) 
    80       ALLOCATE(thingridlat(nlat)) 
    81       ALLOCATE(thingridlon(nlon,nlat)) 
    82       thinobs(:,:)=0 
    83       thinqc(:,:)=0 
    84       thindist(:,:)=0 
    85       zrpi=ATAN(1.0)/45. 
    86       DO ij=1,nlat 
    87          thingridlat(ij)=(ij-1)*dlat-90.0 
    88          IF (lred) THEN 
    89             zdlon=MIN(dlon/MAX(COS(ABS(zrpi*thingridlat(ij))),0.0001),360.0) 
    90          ELSE 
    91             zdlon=dlon 
    92          ENDIF 
    93          DO ii=1,nlon 
    94             thingridlon(ii,ij)=(ii-1)*zdlon 
    95          ENDDO 
     98      DO it = 1, nmaxtypes 
     99 
     100         IF ( TRIM(thintypes(it)) == 'XXXX' ) CYCLE 
     101 
     102         iobs = 0  
     103         irej = 0 
     104 
     105         master_loop: DO ii= 1, fbdata%nobs  
     106             
     107            IF ( TRIM(ADJUSTL(thintypes(it))) /= 'all' ) THEN 
     108               IF ( TRIM(ADJUSTL(fbdata%cdtyp(ii))) /= & 
     109                  & TRIM(ADJUSTL(thintypes(it))) ) CYCLE 
     110            ENDIF 
     111             
     112            iobs = iobs + 1 
     113 
     114            ! Skip data with missing lon and lat and observation flag rejected. 
     115 
     116            IF (fbdata%plam(ii)==fbrmdi) CYCLE 
     117            IF (fbdata%pphi(ii)==fbrmdi) CYCLE 
     118            IF (fbdata%ioqc(ii)>2) CYCLE 
     119             
     120            DO ij=ii+1, fbdata%nobs 
     121 
     122               ! Skip data with missing lon and lat and observation flag rejected. 
     123                
     124               IF (fbdata%plam(ij)==fbrmdi) CYCLE 
     125               IF (fbdata%pphi(ij)==fbrmdi) CYCLE 
     126               IF (fbdata%ioqc(ij)>2) CYCLE 
     127                
     128               ! Skip different type unless thintypes is 'all' 
     129 
     130               IF ( TRIM(ADJUSTL(thintypes(it))) /= 'all' ) THEN 
     131                  IF ( TRIM(ADJUSTL(fbdata%cdtyp(ij))) /= & 
     132                     & TRIM(ADJUSTL(thintypes(it))) ) CYCLE 
     133               ENDIF 
     134 
     135               IF ( ABS( fbdata%ptim(ij) - fbdata%ptim(ii) ) & 
     136                  & >= thindtime(it) ) CYCLE 
     137 
     138               zdist = distance( fbdata%plam(ii), fbdata%pphi(ii), & 
     139                  &              fbdata%plam(ij), fbdata%pphi(ij) ) 
     140 
     141               IF ( zdist < thindists(it) ) THEN 
     142 
     143                  irej = irej + 1 
     144                  fbdata%ioqc(ij)    = 4 
     145                  fbdata%ioqcf(2,ij) = fbdata%ioqcf(2,ij) + 32 
     146 
     147               ENDIF 
     148            ENDDO 
     149             
     150         ENDDO master_loop 
     151 
     152         WRITE(*,*)'For type                = ',TRIM(thintypes(it)) 
     153         WRITE(*,*)'Observations considered = ',iobs 
     154         WRITE(*,*)'Observations rejected   = ',irej 
     155 
    96156      ENDDO 
    97       irej=0 
    98       iobs=0 
    99157 
    100       DO ii=1,fbdata%nobs 
    101158 
    102          ! Skip data with missing lon and lat. 
    103          IF (fbdata%plam(ii)==fbrmdi) CYCLE 
    104          IF (fbdata%pphi(ii)==fbrmdi) CYCLE 
    105  
    106          ! Count number of observations with qcflag<=2. 
    107          iqc=0 
    108          DO iv=1,fbdata%nvar 
    109             DO ij=1,fbdata%nlev 
    110                IF(fbdata%ivlqc(ij,ii,iv)<=2) iqc=iqc+1 
    111             ENDDO 
    112          ENDDO 
    113  
    114          ! Find ilat,ilon positions 
    115          zlon=fbdata%plam(ii) 
    116          IF (zlon>=360.0) zlon=zlon-360 
    117          IF (zlon<0.0) zlon=zlon+360 
    118          ! If reduced grid change zdlon accordingly 
    119          IF (lred) THEN 
    120             zdlon=MIN(dlon/MAX(COS(ABS(zrpi*fbdata%pphi(ii))),0.0001),360.0) 
    121          ELSE 
    122             zdlon=dlon 
    123          ENDIF 
    124          ilon=INT(zlon/zdlon)+1 
    125          ilat=INT((fbdata%pphi(ii)+90.0)/dlat)+1 
    126          iobs=iobs+1 
    127          ! Check which observation to pick based on number of valid obs. 
    128          IF (thinobs(ilon,ilat)>0) THEN 
    129             irej=irej+1 
    130             IF (iqc>=thinqc(ilon,ilat)) THEN 
    131                zdist=distance(zrpi,zlon,fbdata%pphi(ii),& 
    132                   & thingridlon(ilon,ilat),thingridlat(ilat)) 
    133                IF(iqc==thinqc(ilon,ilat)) THEN 
    134                   IF (zdist<thindist(ilon,ilat)) THEN 
    135                      fbdata%ivlqc(:,thinobs(ilon,ilat),:)=4 
    136                      thinobs(ilon,ilat)=ii 
    137                      thinqc(ilon,ilat)=iqc 
    138                      thindist(ilon,ilat)=zdist 
    139                   ELSE 
    140                      fbdata%ivlqc(:,ii,:)=4 
    141                   ENDIF 
    142                ELSE 
    143                   fbdata%ivlqc(:,thinobs(ilon,ilat),:)=4 
    144                   thinobs(ilon,ilat)=ii 
    145                   thinqc(ilon,ilat)=iqc 
    146                   thindist(ilon,ilat)=zdist 
    147                ENDIF 
    148             ELSE 
    149                fbdata%ivlqc(:,ii,:)=4 
    150             ENDIF 
    151          ELSE 
    152             thinobs(ilon,ilat)=ii 
    153             thinqc(ilon,ilat)=iqc 
    154             thindist(ilon,ilat)=distance(zrpi,zlon,fbdata%pphi(ii),& 
    155                & thingridlon(ilon,ilat),thingridlat(ilat)) 
    156          ENDIF 
    157       ENDDO 
    158       WRITE(*,*)'Observations considered = ',iobs 
    159       WRITE(*,*)'Observations rejected   = ',irej 
    160  
    161       DEALLOCATE(thinobs) 
    162       DEALLOCATE(thinqc) 
    163       DEALLOCATE(thindist) 
    164       DEALLOCATE(thingridlat) 
    165       DEALLOCATE(thingridlon) 
    166        
     159      
    167160   END SUBROUTINE fb_thin 
    168161 
    169    REAL FUNCTION distance( prpi, plon, plat, gridlon, gridlat ) 
    170       REAL :: prpi,plon,plat,gridlat,gridlon 
    171       REAL :: zplat,zplon,zgridlat,zgridlon 
    172       REAL :: za1,za2,zb1,zb2,zc1,zc2,zcos1,zcos2 
    173  
    174       zplon=plon 
    175       zgridlon=gridlon 
    176       IF (zplon<-180) zplon=zplon+360.0 
    177       IF (zplon>=180) zplon=zplon-360.0 
    178       IF (zgridlon<-180) zgridlon=zgridlon+360.0 
    179       IF (zgridlon>=180) zgridlon=zgridlon-360.0 
    180       zplon=zplon*prpi 
    181       zgridlon=zgridlon*prpi 
    182       zplat=plat*prpi 
    183       zgridlat=gridlat*prpi 
    184       zcos1=COS(zplat) 
    185       zcos2=COS(zgridlat) 
    186       za1=SIN(zplat) 
    187       za2=SIN(zgridlat) 
    188       zb1=zcos1*COS(zplon) 
    189       zb2=zcos2*COS(zgridlon) 
    190       zc1=zcos1*SIN(zplon) 
    191       zc2=zcos2*SIN(zgridlon) 
    192  
    193       distance=ASIN(SQRT(1.0-(za1*za2+zb1*zb2+zc1*zc2)**2)) 
    194        
    195     END FUNCTION distance 
     162#include "distance.h90" 
    196163 
    197164END PROGRAM fbthin 
  • branches/dev_2802_OBStools/NEMOGCM/TOOLS/OBSTOOLS/src/sla2fb.F90

    r2945 r3000  
    11PROGRAM sla2fb 
     2   !!--------------------------------------------------------------------- 
     3   !! 
     4   !!                     ** PROGRAM sla2fb ** 
     5   !! 
     6   !!  ** Purpose : Convert AVISO SLA format to feedback format 
     7   !! 
     8   !!  ** Method  : Use of utilities from obs_fbm. 
     9   !! 
     10   !!  ** Action  : 
     11   !! 
     12   !!   Usage: 
     13   !!     sla2fb [-s type] outputfile inputfile1 inputfile2 ... 
     14   !!   Option: 
     15   !!     -s            Select altimeter data_source 
     16   !! 
     17   !!   History : 
     18   !!        ! 2010 (K. Mogensen) Initial version 
     19   !!---------------------------------------------------------------------- 
    220   USE obs_fbm 
    321   USE obs_sla_io 
     
    1331   CHARACTER(len=256) :: cdoutfile 
    1432   CHARACTER(len=256),ALLOCATABLE :: cdinfile(:) 
     33   CHARACTER(len=256) :: cdtmp 
     34   CHARACTER(len=5) :: cdsource 
    1535   ! 
    1636   ! Input data 
     
    2545   ! Loop variables 
    2646   ! 
    27    INTEGER :: ip,ia,ji,jk 
     47   INTEGER :: ip,ia,ji,jk,noff 
    2848   ! 
    2949   ! Get number of command line arguments 
     
    3252   IF (nargs < 1) THEN 
    3353      WRITE(*,'(A)')'Usage:' 
    34       WRITE(*,'(A)')'sla2fb outputfile inputfile1 inputfile2 ...' 
     54      WRITE(*,'(A)')'sla2fb [-s type] outputfile inputfile1 inputfile2 ...' 
    3555      CALL abort() 
    3656   ENDIF 
    37    CALL getarg(1,cdoutfile) 
     57   cdsource='' 
    3858   ! 
    3959   ! Get input data 
    4060   ! 
    41    ALLOCATE( slaf(MAX(nargs-1,1)) ) 
    42    ALLOCATE( cdinfile(nargs-1) ) 
     61   noff=1 
     62   IF ( nargs > 1 ) THEN 
     63      CALL getarg(1,cdtmp) 
     64      IF (TRIM(cdtmp)=='-s') THEN 
     65         IF ( nargs < 3 ) THEN 
     66            WRITE(*,*)'Missing arguments to -s <datasource>' 
     67            CALL abort 
     68         ENDIF 
     69         CALL getarg(2,cdsource) 
     70         noff=3 
     71      ENDIF 
     72   ENDIF 
     73   CALL getarg(noff,cdoutfile) 
     74   ninfiles = nargs - noff 
     75   ALLOCATE( slaf(MAX(nargs-noff,1)) ) 
     76   ALLOCATE( cdinfile(nargs-noff) ) 
    4377   ntotobs = 0 
    44    ninfiles  = nargs - 1 
    4578   DO ia=1,ninfiles 
    46       CALL getarg( ia + 1, cdinfile(ia) ) 
     79      CALL getarg( ia + noff, cdinfile(ia) ) 
    4780      WRITE(*,'(2A)')'File = ',TRIM(cdinfile(ia)) 
    4881      CALL read_avisofile( TRIM(cdinfile(ia)), slaf(ia), 6, .TRUE., .FALSE. ) 
    4982      WRITE(*,'(A,I9,A)')'has',slaf(ia)%nobs,' observations' 
     83      IF (LEN_TRIM(cdsource)>0) THEN 
     84         DO ji=1,slaf(ia)%nobs 
     85            slaf(ia)%cdwmo(ji)=TRIM(slaf(ia)%cdwmo(ji))//'_'//TRIM(cdsource) 
     86         ENDDO 
     87      ENDIF 
    5088      ntotobs = ntotobs + slaf(ia)%nobs 
    5189   ENDDO 
  • branches/dev_2802_OBStools/NEMOGCM/TOOLS/OBSTOOLS/src/vel2fb.F90

    r2945 r3000  
    11PROGRAM vel2fb 
     2   !!--------------------------------------------------------------------- 
     3   !! 
     4   !!                     ** PROGRAM vel2fb ** 
     5   !! 
     6   !!  ** Purpose : Convert TAO/PIRATA/RAMA currents to feedback format 
     7   !! 
     8   !!  ** Method  : Use of utilities from obs_fbm. 
     9   !! 
     10   !!  ** Action  : 
     11   !! 
     12   !!   Usage: 
     13   !!     vel2fb outputfile inputfile1 inputfile2 ... 
     14   !!  
     15   !!   History : 
     16   !!        ! 2010 (K. Mogensen) Initial version 
     17   !!---------------------------------------------------------------------- 
    218   USE obs_fbm 
    319   USE obs_vel_io 
Note: See TracChangeset for help on using the changeset viewer.