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.
obssst_io.h90 in branches/nemo_v3_3_beta/NEMOGCM/NEMO/OPA_SRC/OBS – NEMO

source: branches/nemo_v3_3_beta/NEMOGCM/NEMO/OPA_SRC/OBS/obssst_io.h90 @ 2281

Last change on this file since 2281 was 2281, checked in by smasson, 14 years ago

set proper svn properties to all files...

  • Property svn:keywords set to Id
File size: 10.9 KB
Line 
1   SUBROUTINE read_ghrsst( cdfilename, inpfile, kunit, ldwp, ldgrid )
2      !!---------------------------------------------------------------------
3      !!
4      !!                     ** ROUTINE read_ghrsst **
5      !!
6      !! ** Purpose : Read from file the GHRSST observations.
7      !!
8      !! ** Method  : The data file is a NetCDF file.
9      !!
10      !! ** Action  :
11      !!
12      !! References :
13      !!
14      !! History :
15      !!          ! 09-01 (K. Mogensen) Original based on old versions
16      !!----------------------------------------------------------------------
17      !! * Arguments
18      CHARACTER(LEN=*) :: cdfilename ! Input filename
19      TYPE(obfbdata)   :: inpfile    ! Output obfbdata structure
20      INTEGER          :: kunit      ! Unit for output
21      LOGICAL          :: ldwp       ! Print info
22      LOGICAL          :: ldgrid     ! Save grid info in data structure
23      !! * Local declarations
24      CHARACTER(LEN=12),PARAMETER :: cpname = 'read_ghrsst'
25      INTEGER :: i_file_id        ! netcdf IDS
26      INTEGER :: i_time_id
27      INTEGER :: i_ni_id
28      INTEGER :: i_data_id
29      INTEGER :: i_var_id
30      INTEGER :: i_data           ! Number of data per parameter in current file
31      INTEGER :: i_time           ! Number of reference times in file
32      INTEGER, DIMENSION(:), POINTER :: &
33         & i_reftime        ! Reference time in file in seconds since 1/1/1981.
34      INTEGER, DIMENSION(:,:), POINTER :: &
35         & i_dtime, &       ! Offset in seconds since reference time
36         & i_qc,    &       ! Quality control flag.
37         & i_type           ! Type of SST measurement.           
38      REAL(wp), DIMENSION(:), POINTER :: &
39         & z_phi,   &       ! Latitudes
40         & z_lam            ! Longitudes
41      REAL(wp), DIMENSION(:,:), POINTER :: &
42         & z_sst            ! SST data     
43      INTEGER, PARAMETER :: imaxdim = 2      ! Assumed maximum for no. dims. in file
44      INTEGER, DIMENSION(2) :: idims         ! Dimensions in file
45      INTEGER :: iilen            ! Length of netCDF attributes
46      INTEGER :: itype            ! Typeof netCDF attributes
47      REAL(KIND=wp) :: zsca           ! Scale factor
48      REAL(KIND=wp) :: zoff           ! Offset for data in netcdf file
49      REAL(KIND=wp) :: z_offset       ! Offset for time conversion
50      REAL(KIND=wp) :: zfill          ! Fill value in netcdf file
51      CHARACTER (len=33) :: creftime  ! Reference time of file
52      INTEGER :: i_refyear            ! Integer version of reference time
53      INTEGER :: i_refmonth
54      INTEGER :: i_refday
55      INTEGER :: i_refhour
56      INTEGER :: i_refmin
57      INTEGER :: i_refsec
58      INTEGER :: ichunk
59      INTEGER :: jtim
60      INTEGER :: jobs
61      INTEGER :: iobs
62
63      CALL chkerr( nf90_open( TRIM( cdfilename ), nf90_nowrite, &
64         &                i_file_id, chunksize=ichunk), cpname, __LINE__ )
65     
66      ! Get the netCDF dimensions
67     
68      CALL chkerr( nf90_inq_dimid( i_file_id, 'time', i_time_id ),  &
69         &       cpname, __LINE__ )
70      CALL chkerr( nf90_inquire_dimension( i_file_id, i_time_id, &
71         &                              len = i_time ),  &
72         &      cpname, __LINE__ )
73     
74      CALL chkerr( nf90_inq_dimid( i_file_id, 'ni', i_ni_id ),  &
75         &       cpname, __LINE__ )
76      CALL chkerr( nf90_inquire_dimension( i_file_id, i_ni_id, &
77         &                              len = i_data ),  &
78         &      cpname, __LINE__ )
79     
80     
81      ! Allocate NetCDF variables
82     
83      ALLOCATE( &
84         & i_reftime    ( i_time                 ), &
85         & i_dtime      ( i_data,i_time  ), &     
86         & i_qc         ( i_data,i_time  ), &
87         & i_type       ( i_data,i_time  ), &     
88         & z_phi        ( i_data                 ), &   
89         & z_lam        ( i_data                 ), & 
90         & z_sst        ( i_data,i_time  )  &
91         & )
92     
93      ! Get reference time of file which is in seconds since 1981/1/1 00:00.
94     
95      CALL chkerr( nf90_inq_varid( i_file_id, 'time', i_var_id ), &
96         &       cpname, __LINE__ )
97      idims(1) = i_time
98      CALL chkdim( i_file_id, i_var_id, 1, idims, cpname, __LINE__ )
99      CALL chkerr( nf90_get_var  ( i_file_id, i_var_id, i_reftime),&
100         &       cpname, __LINE__ )
101      IF (nf90_inquire_attribute( i_file_id, i_var_id, "units") &
102         &                      == nf90_noerr) THEN
103         CALL chkerr( nf90_get_att( i_file_id, i_var_id, &
104            &                     "units",creftime), cpname,  __LINE__ )
105      ELSE
106         creftime = "seconds since 1981-01-01 00:00:00"
107      ENDIF
108      READ(creftime(15:18),*)i_refyear
109      READ(creftime(20:21),*)i_refmonth
110      READ(creftime(23:24),*)i_refday
111      READ(creftime(26:27),*)i_refhour
112      READ(creftime(29:30),*)i_refmin
113      READ(creftime(32:33),*)i_refsec
114      !Work out offset in days between reference time and 1/1/1950.
115      CALL greg2jul( i_refsec, i_refmin, i_refhour, i_refday, &
116         &           i_refmonth, i_refyear, z_offset)
117     
118      ! Get list of times for each ob in seconds relative to reference time
119     
120      CALL chkerr( nf90_inq_varid( i_file_id, 'sst_dtime', i_var_id ), &
121         &       cpname, __LINE__ )
122      idims(1) = i_data
123      idims(2) = i_time
124      CALL chkdim( i_file_id, i_var_id, 2, idims, cpname, __LINE__ )
125      CALL chkerr( nf90_get_var  ( i_file_id, i_var_id, i_dtime),&
126         &       cpname, __LINE__ )
127      zsca = 1.0     
128      IF (nf90_inquire_attribute( i_file_id, i_var_id, "scale_factor") &
129         &                      == nf90_noerr) THEN
130         CALL chkerr( nf90_get_att( i_file_id, i_var_id, &
131            &                     "scale_factor",zsca), cpname,  __LINE__ )
132      ENDIF
133      zoff = 0.0
134      IF (nf90_inquire_attribute( i_file_id, i_var_id, "add_offset") &
135         &                      == nf90_noerr) THEN
136         CALL chkerr( nf90_get_att( i_file_id, i_var_id, &
137            &                     "add_offset",zoff), cpname,  __LINE__ )
138      ENDIF
139      i_dtime(:,:) = NINT((zsca * FLOAT(i_dtime(:,:))) &
140         &                 + zoff)
141     
142      ! Get longitudes
143     
144      CALL chkerr( nf90_inq_varid( i_file_id, 'lon', i_var_id ), &
145         &         cpname, __LINE__ )
146      idims(1) = i_data
147      CALL chkdim( i_file_id, i_var_id, 1, idims, cpname, __LINE__ )
148      CALL chkerr( nf90_get_var  ( i_file_id, i_var_id, z_lam),   &
149         &         cpname, __LINE__ )
150     
151      ! Get latitudes
152     
153      CALL chkerr( nf90_inq_varid( i_file_id, 'lat', i_var_id ), &
154         &         cpname, __LINE__ )
155      idims(1) = i_data
156      CALL chkdim( i_file_id, i_var_id, 1, idims, cpname, __LINE__ )
157      CALL chkerr( nf90_get_var  ( i_file_id, i_var_id, z_phi),   &
158         &         cpname, __LINE__ )
159     
160      ! Get SST data
161     
162      CALL chkerr( nf90_inq_varid( i_file_id, 'sea_surface_temperature', &
163         &                         i_var_id ), &
164         &         cpname, __LINE__ )
165      idims(1) = i_data
166      idims(2) = i_time
167      CALL chkdim( i_file_id, i_var_id, 2, idims, cpname, __LINE__ )
168      CALL chkerr( nf90_get_var  ( i_file_id, i_var_id, z_sst), &
169         &       cpname, __LINE__ )
170      zoff = 0.
171      IF (nf90_inquire_attribute( i_file_id, i_var_id, "scale_factor") &
172         &                      == nf90_noerr) THEN
173         CALL chkerr( nf90_get_att( i_file_id, i_var_id, &
174            &                     "scale_factor",zsca), cpname, __LINE__ )
175      ENDIF
176      zsca = 1.0
177      IF (nf90_inquire_attribute( i_file_id, i_var_id, "scale_factor") &
178         &                       == nf90_noerr) THEN
179         CALL chkerr( nf90_get_att( i_file_id, i_var_id, &
180            &                       "scale_factor",zsca), cpname, __LINE__ )
181      ENDIF
182      zfill = 0.0
183      IF (nf90_inquire_attribute( i_file_id, i_var_id, "_FillValue") &
184         &                       == nf90_noerr) THEN
185         CALL chkerr( nf90_get_att( i_file_id, i_var_id, &
186            &                       "_FillValue",zfill), cpname, __LINE__ )
187      ENDIF
188      WHERE(z_sst(:,:) /=  zfill)
189         z_sst(:,:) = (zsca * z_sst(:,:)) + zoff
190      ELSEWHERE
191         z_sst(:,:) = fbrmdi
192      END WHERE
193     
194      ! Get QC flag
195     
196      CALL chkerr( nf90_inq_varid( i_file_id, 'confidence_flag', i_var_id ), &
197         &       cpname, __LINE__ )
198      idims(1) = i_data
199      idims(2) = i_time
200      CALL chkdim( i_file_id, i_var_id, 2, idims, cpname, __LINE__ )
201      CALL chkerr( nf90_get_var  ( i_file_id, i_var_id, i_qc),   &
202            &       cpname, __LINE__ )
203     
204      ! Get SST obs type
205     
206      CALL chkerr( nf90_inq_varid( i_file_id, 'data_source', i_var_id ), &
207         &         cpname, __LINE__ )
208      idims(1) = i_data
209      idims(2) = i_time
210      CALL chkdim( i_file_id, i_var_id, 2, idims, cpname, __LINE__ )
211      CALL chkerr( nf90_get_var  ( i_file_id, i_var_id, i_type),   &
212         &       cpname, __LINE__ )
213     
214      ! Close the file
215     
216      CALL chkerr( nf90_close( i_file_id ), cpname, __LINE__ )
217
218      ! Fill the obfbdata structure
219
220      ! Allocate obfbdata
221     
222      iobs = i_data * i_time
223      CALL init_obfbdata( inpfile )
224      CALL alloc_obfbdata( inpfile, 1, iobs, 1, 0, 0, ldgrid )
225      inpfile%cname(1) = 'SST'
226
227      ! Fill the obfbdata structure from input data
228
229      inpfile%cdjuldref = "19500101000000"
230      iobs = 0
231      DO jtim = 1, i_time
232         DO jobs = 1, i_data
233            iobs = iobs + 1
234            ! Characters
235            WRITE(inpfile%cdwmo(iobs),'(A6,A2)') 'ghrsst','  '
236            WRITE(inpfile%cdtyp(iobs),'(I4)') i_type(jobs,jtim)
237            ! Real values
238            inpfile%plam(iobs)         = z_lam(jobs)
239            inpfile%pphi(iobs)         = z_phi(jobs)
240            inpfile%pob(1,iobs,1)      = z_sst(jobs,jtim)
241            inpfile%ptim(iobs)         = &
242               & REAL(i_reftime(jtim))/(60.*60.*24.) + &
243               & z_offset + REAL(i_dtime(jobs,jtim))/(60.*60.*24.)
244            inpfile%pdep(1,iobs)       = 0.0
245            ! Integers
246            inpfile%kindex(iobs)       = iobs
247            IF ( z_sst(jobs,jtim) == fbrmdi ) THEN
248               inpfile%ioqc(iobs)      = 4
249               inpfile%ivqc(iobs,1)    = 4
250               inpfile%ivlqc(1,iobs,1) = 4
251            ELSE
252               inpfile%ioqc(iobs)      = i_qc(jobs,jtim)
253               inpfile%ivqc(iobs,1)    = i_qc(jobs,jtim)
254               inpfile%ivlqc(1,iobs,1) = 1
255            ENDIF
256            inpfile%ipqc(iobs)         = 0
257            inpfile%ipqcf(:,iobs)      = 0
258            inpfile%itqc(iobs)         = 0
259            inpfile%itqcf(:,iobs)      = 0
260            inpfile%ivqcf(:,iobs,1)    = 0
261            inpfile%ioqcf(:,iobs)      = 0
262            inpfile%idqc(1,iobs)       = 0
263            inpfile%idqcf(1,1,iobs)    = 0
264            inpfile%ivlqcf(:,1,iobs,1) = 0
265         END DO
266      END DO
267
268      DEALLOCATE( &
269         & i_reftime, &
270         & i_dtime,   &
271         & i_qc,      &
272         & i_type,    &
273         & z_phi,     &
274         & z_lam,     &
275         & z_sst      &
276         & )
277
278   END SUBROUTINE read_ghrsst
279
280
Note: See TracBrowser for help on using the repository browser.