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.
fbsel.F90 in branches/dev_2802_OBStools/NEMOGCM/TOOLS/OBSTOOLS – NEMO

source: branches/dev_2802_OBStools/NEMOGCM/TOOLS/OBSTOOLS/fbsel.F90 @ 2893

Last change on this file since 2893 was 2893, checked in by djlea, 13 years ago

Adding obs tools to branch

File size: 5.4 KB
Line 
1PROGRAM fbsel
2   USE obs_fbm
3   USE date_utils
4   IMPLICIT NONE
5   TYPE(obfbdata) :: fbdatain,fbdataout
6   CHARACTER(len=256) :: filenamein,filenameout,filenametmp,cnameout
7#ifndef NOIARGCPROTO
8   INTEGER,EXTERNAL :: iargc
9#endif
10   INTEGER,PARAMETER :: maxtyp=1023
11   INTEGER,PARAMETER :: maxdates=20
12   INTEGER :: nqc,ntyp,ndates,ninidate(maxdates),nenddate(maxdates)
13   LOGICAL :: lsplitqc,lsplittyp
14   INTEGER :: iqc,ityp,idate
15   REAL :: maxlat,minlat,maxlon,minlon
16   NAMELIST/namsel/nqc,ntyp,ndates,ninidate,nenddate,lsplitqc,lsplittyp, &
17      &            maxlat,minlat,maxlon,minlon
18
19   IF (iargc()/=2) THEN
20      WRITE(*,*)'Usage:'
21      WRITE(*,*)'fbsel <input filename> <output filename>'
22      CALL abort
23   ENDIF
24
25   CALL getarg(1,filenamein)
26   CALL getarg(2,filenameout)
27   
28   nqc=-1
29   ntyp=-1
30   ndates=1
31   ninidate=19500101
32   nenddate=21000101
33
34   lsplitqc=.FALSE.
35   lsplittyp=.FALSE.
36   maxlat=1e+38
37   minlat=-1e+38
38   maxlon=1e+38
39   minlon=-1e+38
40   OPEN(10,file='namsel.in')
41   READ(10,namsel)
42   CLOSE(10)
43   WRITE(*,namsel)
44
45   CALL init_obfbdata(fbdatain)
46   CALL init_obfbdata(fbdataout)
47
48   WRITE(*,*)'Reading file : ',TRIM(filenamein)
49   CALL read_obfbdata(TRIM(filenamein),fbdatain)
50   WRITE(*,*)'Number of observations before selection = ',fbdatain%nobs
51   DO idate=1,ndates
52      IF (ndates==1) THEN
53         cnameout=filenameout
54      ELSE
55         WRITE(cnameout,'(I2.2,2A)')idate,'_',TRIM(filenameout)
56      ENDIF
57      IF (lsplitqc) THEN
58         DO iqc=1,3
59            CALL fb_sel(fbdatain,fbdataout,iqc,ntyp, &
60               &        ninidate(idate),nenddate(idate), &
61               &        maxlat,minlat,maxlon,minlon)
62            WRITE(filenametmp,'(A,I2.2,A,A)')'qc_',iqc,'_',TRIM(cnameout)
63            IF (fbdataout%nobs>0) THEN
64               WRITE(*,*)'QC selected = ',iqc
65               WRITE(*,*)'Number of observations selected = ',fbdataout%nobs
66               WRITE(*,*)'Writing file : ',TRIM(filenametmp)
67               CALL write_obfbdata(TRIM(filenametmp),fbdataout)
68            ENDIF
69            CALL dealloc_obfbdata(fbdataout)
70         ENDDO
71      ELSEIF (lsplittyp) THEN
72         DO ityp=0,maxtyp
73            CALL fb_sel(fbdatain,fbdataout,nqc,ityp, &
74               &        ninidate(idate),nenddate(idate), &
75               &        maxlat,minlat,maxlon,minlon)
76            WRITE(filenametmp,'(A,I4.4,A,A)')'typ_',ityp,'_',TRIM(cnameout)
77            IF (fbdataout%nobs>0) THEN
78               WRITE(*,*)'Type = ',ityp
79               WRITE(*,*)'Number of observations selected = ',fbdataout%nobs
80               WRITE(*,*)'Writing file : ',TRIM(filenametmp)
81               CALL write_obfbdata(TRIM(filenametmp),fbdataout)
82            ENDIF
83            CALL dealloc_obfbdata(fbdataout)
84         ENDDO
85      ELSE
86         CALL fb_sel(fbdatain,fbdataout,nqc,ntyp, & 
87            &        ninidate(idate),nenddate(idate), &
88            &        maxlat,minlat,maxlon,minlon)
89         WRITE(*,*)'Number of observations selected = ',fbdataout%nobs
90         WRITE(*,*)'Writing file : ',TRIM(cnameout)
91         CALL write_obfbdata(TRIM(cnameout),fbdataout)
92         CALL dealloc_obfbdata(fbdataout)
93      ENDIF
94   ENDDO
95
96CONTAINS
97
98   SUBROUTINE fb_sel(fbdatain,fbdataout,nqc,ntyp,ninidate,nenddate,&
99      &              maxlat,minlat,maxlon,minlon)
100      TYPE(obfbdata) :: fbdatain,fbdataout
101      INTEGER :: nqc,ntyp,ninidate,nenddate
102      REAL :: maxlat,minlat,maxlon,minlon
103      INTEGER :: jobs
104      INTEGER :: iqc,ityp
105      LOGICAL :: llvalid(fbdatain%nobs)
106      INTEGER :: iyea,imon,iday
107      REAL(KIND=dp) :: zjini,zjend
108
109      iyea=ninidate/10000
110      imon=ninidate/100-iyea*100
111      iday=ninidate-iyea*10000-imon*100
112      CALL greg2jul(0,0,0,iday,imon,iyea,zjini)
113      iyea=nenddate/10000
114      imon=nenddate/100-iyea*100
115      iday=nenddate-iyea*10000-imon*100
116      CALL greg2jul(0,0,0,iday,imon,iyea,zjend)
117      DO jobs = 1, fbdatain%nobs
118         llvalid(jobs)=.TRUE.
119         IF (nqc/=-1) THEN
120            CALL check_prof(fbdatain,jobs,iqc)
121            llvalid(jobs)=(iqc==nqc).AND.llvalid(jobs)
122         ENDIF
123         IF (ntyp/=-1) THEN
124            READ(fbdatain%cdtyp(jobs),'(I4)')ityp
125            llvalid(jobs)=(ityp==ntyp).AND.llvalid(jobs)
126         ENDIF
127         IF (ninidate/=-1) THEN
128            llvalid(jobs)=(fbdatain%ptim(jobs)>zjini).AND.llvalid(jobs)
129         ENDIF
130         IF (nenddate/=-1) THEN
131            llvalid(jobs)=(fbdatain%ptim(jobs)<=zjend).AND.llvalid(jobs)
132         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)
137         ! Add more checks here...
138      ENDDO
139
140      CALL subsamp_obfbdata(fbdatain,fbdataout,llvalid)
141
142   END SUBROUTINE fb_sel
143
144   SUBROUTINE check_prof(fbdata,iobs,iqc)
145     
146      TYPE(obfbdata) :: fbdata
147      INTEGER :: iobs,iqc
148      INTEGER :: i,ivar
149     
150      LOGICAL :: lpart,lfull
151
152      lpart=.false.
153      lfull=.true.
154      DO ivar=1,fbdata%nvar
155         DO i=1,fbdata%nlev
156            IF ((fbdata%ivlqc(i,iobs,ivar)>2).AND.&
157               &(fbdata%ivlqc(i,iobs,ivar)<9)) lpart = .TRUE.
158            IF (fbdata%ivlqc(i,iobs,ivar)<=2) lfull = .FALSE.
159         ENDDO
160      ENDDO
161
162      IF(lfull) THEN
163         iqc=3
164      ELSEIF (lpart) then
165         iqc=2
166      ELSE
167         iqc=1
168      ENDIF
169
170   END SUBROUTINE check_prof
171
172END PROGRAM fbsel
Note: See TracBrowser for help on using the repository browser.