1 | PROGRAM 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 | |
---|
157 | END PROGRAM fbcomb |
---|