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

source: branches/dev_2802_OBStools/NEMOGCM/TOOLS/OBSTOOLS/fbcomb.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: 4.8 KB
Line 
1PROGRAM fbcomb
2   USE toolspar_kind
3   USE obs_fbm
4   USE index_sort
5   IMPLICIT NONE
6   !
7   ! Command line arguments for output file and input file
8   !
9#ifndef NOIARGCPROTO
10   INTEGER,EXTERNAL :: iargc
11#endif
12   INTEGER :: nargs
13   CHARACTER(len=256) :: cdoutfile
14   CHARACTER(len=256),ALLOCATABLE :: cdinfile(:)
15   !
16   ! Input data
17   !
18   TYPE(obfbdata),POINTER :: obsdata(:)
19   INTEGER :: ninfiles,ntotobs,nlev
20   !
21   ! Time sorting arrays
22   !
23   REAL(KIND=dp),ALLOCATABLE :: zsort(:,:)
24   INTEGER,ALLOCATABLE  :: iset(:),inum(:),iindex(:)
25   !
26   ! Output data
27   !
28   TYPE(obfbdata) :: obsoutdata
29   !
30   ! Loop variables
31   !
32   INTEGER :: ia,iv,ii,ij, ist
33   !
34   ! Get number of command line arguments
35   !
36   nargs = IARGC()
37   IF ( nargs < 2 ) THEN
38      WRITE(*,'(A)')'Usage:'
39      WRITE(*,'(A)')'fbcomb outputfile inputfile1 inputfile2 ...'
40      CALL abort()
41   ENDIF
42   CALL getarg( 1, cdoutfile )
43   !
44   ! Get input data
45   !
46   ALLOCATE( obsdata( nargs - 1 ) )
47   ALLOCATE( cdinfile( nargs - 1 ) )
48   ntotobs = 0
49   ninfiles = nargs - 1
50   ist=-1
51   DO ia=1, ninfiles
52      CALL getarg( ia+1, cdinfile(ia) )
53      CALL init_obfbdata( obsdata(ia) )
54      CALL read_obfbdata( TRIM(cdinfile(ia)), obsdata(ia) )
55      WRITE(*,'(2A)')'File = ', TRIM(cdinfile(ia))
56      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
58      ntotobs = ntotobs + obsdata(ia)%nobs
59   ENDDO
60   WRITE(*,'(A,I8)') 'Total obsfiles : ',ntotobs
61   !
62   ! Check that the data is confirming
63   !
64   DO ia=ist+1, ninfiles
65      IF ( obsdata(ia)%cdjuldref /= obsdata(ist)%cdjuldref ) THEN
66         WRITE(*,*)'Different julian date reference. Aborting'
67         CALL abort
68      ENDIF
69      IF ( obsdata(ia)%nvar /= obsdata(ist)%nvar ) THEN
70         WRITE(*,*)'Different number of variables. Aborting'
71         CALL abort
72      ENDIF
73      IF  (obsdata(ia)%nadd /= obsdata(ist)%nadd ) THEN
74         WRITE(*,*)'Different number of additional entries. Aborting'
75         CALL abort
76      ENDIF
77      IF ( obsdata(ia)%next /= obsdata(ist)%next ) THEN
78         WRITE(*,*)'Different number of additional variables. Aborting'
79         CALL abort
80      ENDIF
81      IF ( obsdata(ia)%lgrid .NEQV. obsdata(ist)%lgrid ) THEN
82         WRITE(*,*)'Inconsistent grid search info. Aborting'
83         CALL abort
84      ENDIF
85      DO iv=1, obsdata(ia)%nvar
86         IF ( obsdata(ia)%cname(iv) /= obsdata(ist)%cname(iv) ) THEN
87            WRITE(*,*)'Variable name ', TRIM(obsdata(ia)%cname(iv)), &
88               &      ' is different from ', TRIM(obsdata(ist)%cname(iv)), &
89               &      '. Aborting'
90            CALL abort
91         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
98            ENDIF
99         ENDIF
100      ENDDO
101      DO iv=1,obsdata(ia)%nadd
102         IF ( obsdata(ia)%caddname(iv) /= obsdata(ist)%caddname(iv) ) THEN
103            WRITE(*,*)'Additional name ', TRIM(obsdata(ia)%caddname(iv)), &
104               &      ' is different from ', TRIM(obsdata(ist)%caddname(iv)), &
105               &      '. Aborting'
106            CALL abort
107         ENDIF
108      ENDDO
109      DO iv=1,obsdata(ia)%next
110         IF ( obsdata(ia)%cextname(iv) /= obsdata(ist)%cextname(iv) ) THEN
111            WRITE(*,*)'Extra name ', TRIM(obsdata(ia)%cextname(iv)), &
112               &      ' is different from ', TRIM(obsdata(ist)%cextname(iv)), &
113               &      '. Aborting'
114            CALL abort
115         ENDIF
116      ENDDO
117   ENDDO
118   !
119   ! Construct sorting arrays
120   !
121   ALLOCATE( zsort(3,ntotobs), iset(ntotobs), &
122      & inum(ntotobs), iindex(ntotobs))
123   ii = 0
124   DO ia = 1,ninfiles
125      DO ij = 1,obsdata(ia)%nobs
126         ii = ii+1
127         zsort(1,ii) = obsdata(ia)%ptim(ij)
128         zsort(2,ii) = obsdata(ia)%pphi(ij)
129         zsort(3,ii) = obsdata(ia)%plam(ij)
130         iset(ii) = ia
131         inum(ii) = ij
132      ENDDO
133   ENDDO
134   !
135   ! Get indexes for time sorting.
136   !
137   CALL index_sort_dp_n(zsort,3,iindex,ntotobs)
138   !
139   ! Allocate output data
140   !   
141   nlev = -1
142   DO ia = 1,ninfiles
143      IF ( obsdata(ia)%nlev > nlev ) nlev = obsdata(ia)%nlev
144   ENDDO
145   CALL init_obfbdata( obsoutdata )
146   CALL alloc_obfbdata( obsoutdata, obsdata(ist)%nvar, ntotobs, nlev, &
147      &                 obsdata(ist)%nadd, obsdata(ist)%next, obsdata(ist)%lgrid )
148   !
149   ! Copy input data into output data
150   !
151   CALL merge_obfbdata( ninfiles, obsdata, obsoutdata, iset, inum, iindex )
152   !
153   ! Save output data
154   !
155   CALL write_obfbdata ( TRIM(cdoutfile), obsoutdata )
156   
157END PROGRAM fbcomb
Note: See TracBrowser for help on using the repository browser.