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.
obsseaice_io.h90 in branches/UKMO/icebergs_restart_single_file/NEMOGCM/NEMO/OPA_SRC/OBS – NEMO

source: branches/UKMO/icebergs_restart_single_file/NEMOGCM/NEMO/OPA_SRC/OBS/obsseaice_io.h90 @ 5852

Last change on this file since 5852 was 5852, checked in by davestorkey, 8 years ago

UKMO/icebergs_restart_single_file branch : remove SVN keywords

File size: 10.7 KB
Line 
1   !!----------------------------------------------------------------------
2   !! NEMO/OPA 3.3 , NEMO Consortium (2010)
3   !! $Id$
4   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
5   !!----------------------------------------------------------------------
6
7   SUBROUTINE read_seaice( cdfilename, inpfile, kunit, ldwp, ldgrid )
8      !!---------------------------------------------------------------------
9      !!
10      !!                     ** ROUTINE read_seaice **
11      !!
12      !! ** Purpose : Read from file the SEAICE observations.
13      !!
14      !! ** Method  : The data file is a NetCDF file.
15      !!
16      !! ** Action  :
17      !!
18      !! References :
19      !!
20      !! History :
21      !!          ! 09-01 (K. Mogensen) Original based on old versions
22      !!----------------------------------------------------------------------
23      !! * Arguments
24      CHARACTER(LEN=*) :: cdfilename ! Input filename
25      TYPE(obfbdata)   :: inpfile    ! Output obfbdata structure
26      INTEGER          :: kunit      ! Unit for output
27      LOGICAL          :: ldwp       ! Print info
28      LOGICAL          :: ldgrid     ! Save grid info in data structure
29      !! * Local declarations
30      CHARACTER(LEN=12),PARAMETER :: cpname = 'read_seaice'
31      INTEGER :: i_file_id    ! netcdf IDS
32      INTEGER :: i_time_id
33      INTEGER :: i_ni_id
34      INTEGER :: i_data_id
35      INTEGER :: i_var_id
36      INTEGER :: i_data       ! Number of data per parameter in current file
37      INTEGER :: i_time       ! Number of reference times in file
38      INTEGER, DIMENSION(:), POINTER :: &
39         & i_reftime        ! Reference time in file in seconds since 1/1/1981.
40      INTEGER, DIMENSION(:,:), POINTER :: &
41         & i_dtime, &       ! Offset in seconds since reference time
42         & i_qc,    &       ! Quality control flag.
43         & i_type           ! Type of seaice measurement.           
44      REAL(wp), DIMENSION(:), POINTER :: &
45         & z_phi,   &       ! Latitudes
46         & z_lam            ! Longitudes
47      REAL(wp), DIMENSION(:,:), POINTER :: &
48         & z_seaice         ! Seaice data     
49      INTEGER, PARAMETER :: imaxdim = 2    ! Assumed maximum for no. dims. in file
50      INTEGER, DIMENSION(2) :: idims       ! Dimensions in file
51      INTEGER :: iilen          ! Length of netCDF attributes
52      INTEGER :: itype          ! Typeof netCDF attributes
53      REAL(KIND=wp) :: zsca      ! Scale factor
54      REAL(KIND=wp) :: zoff      ! Offset for data in netcdf file
55      REAL(KIND=wp) :: z_offset  ! Offset for time conversion
56      REAL(KIND=wp) :: zfill     ! Fill value in netcdf file
57      CHARACTER (len=33) ::creftime     ! Reference time of file
58      INTEGER :: i_refyear       ! Integer version of reference time
59      INTEGER :: i_refmonth
60      INTEGER :: i_refday
61      INTEGER :: i_refhour
62      INTEGER :: i_refmin
63      INTEGER :: i_refsec
64      INTEGER :: ichunk
65      INTEGER :: jtim
66      INTEGER :: jobs
67      INTEGER :: iobs
68
69      CALL chkerr( nf90_open( TRIM( cdfilename ), nf90_nowrite, &
70         &                i_file_id, chunksize=ichunk), cpname, __LINE__ )
71     
72      ! Get the netCDF dimensions
73     
74      CALL chkerr( nf90_inq_dimid( i_file_id, 'time', i_time_id ),  &
75         &       cpname, __LINE__ )
76      CALL chkerr( nf90_inquire_dimension( i_file_id, i_time_id, &
77         &                              len = i_time ),  &
78         &      cpname, __LINE__ )
79     
80      CALL chkerr( nf90_inq_dimid( i_file_id, 'ni', i_ni_id ),  &
81         &       cpname, __LINE__ )
82      CALL chkerr( nf90_inquire_dimension( i_file_id, i_ni_id, &
83         &                              len = i_data ),  &
84         &      cpname, __LINE__ )
85     
86     
87      ! Allocate NetCDF variables
88     
89      ALLOCATE( &
90         & i_reftime    ( i_time                 ), &
91         & i_dtime      ( i_data,i_time  ), &     
92         & i_qc         ( i_data,i_time  ), &
93         & i_type       ( i_data,i_time  ), &     
94         & z_phi        ( i_data                 ), &   
95         & z_lam        ( i_data                 ), & 
96         & z_seaice        ( i_data,i_time  )  &
97         & )
98     
99      ! Get reference time of file which is in seconds since 1981/1/1 00:00.
100     
101      CALL chkerr( nf90_inq_varid( i_file_id, 'time', i_var_id ), &
102         &       cpname, __LINE__ )
103      idims(1) = i_time
104      CALL chkdim( i_file_id, i_var_id, 1, idims, cpname, __LINE__ )
105      CALL chkerr( nf90_get_var  ( i_file_id, i_var_id, i_reftime),&
106         &       cpname, __LINE__ )
107      IF (nf90_inquire_attribute( i_file_id, i_var_id, "units") &
108         &                      == nf90_noerr) THEN
109         CALL chkerr( nf90_get_att( i_file_id, i_var_id, &
110            &                     "units",creftime), cpname,  __LINE__ )
111      ELSE
112         creftime = "seconds since 1981-01-01 00:00:00"
113      ENDIF
114      READ(creftime(15:18),*)i_refyear
115      READ(creftime(20:21),*)i_refmonth
116      READ(creftime(23:24),*)i_refday
117      READ(creftime(26:27),*)i_refhour
118      READ(creftime(29:30),*)i_refmin
119      READ(creftime(32:33),*)i_refsec
120      !Work out offset in days between reference time and 1/1/1950.
121      CALL greg2jul( i_refsec, i_refmin, i_refhour, i_refday, &
122         &           i_refmonth, i_refyear, z_offset)
123     
124      ! Get list of times for each ob in seconds relative to reference time
125     
126      CALL chkerr( nf90_inq_varid( i_file_id, 'SeaIce_dtime', i_var_id ), &
127         &       cpname, __LINE__ )
128      idims(1) = i_data
129      idims(2) = i_time
130      CALL chkdim( i_file_id, i_var_id, 2, idims, cpname, __LINE__ )
131      CALL chkerr( nf90_get_var  ( i_file_id, i_var_id, i_dtime),&
132         &       cpname, __LINE__ )
133      zsca = 1.0     
134      IF (nf90_inquire_attribute( i_file_id, i_var_id, "scale_factor") &
135         &                      == nf90_noerr) THEN
136         CALL chkerr( nf90_get_att( i_file_id, i_var_id, &
137            &                     "scale_factor",zsca), cpname,  __LINE__ )
138      ENDIF
139      zoff = 0.0
140      IF (nf90_inquire_attribute( i_file_id, i_var_id, "add_offset") &
141         &                      == nf90_noerr) THEN
142         CALL chkerr( nf90_get_att( i_file_id, i_var_id, &
143            &                     "add_offset",zoff), cpname,  __LINE__ )
144      ENDIF
145      i_dtime(:,:) = NINT((zsca * FLOAT(i_dtime(:,:))) &
146         &                 + zoff)
147     
148      ! Get longitudes
149     
150      CALL chkerr( nf90_inq_varid( i_file_id, 'lon', i_var_id ), &
151         &         cpname, __LINE__ )
152      idims(1) = i_data
153      CALL chkdim( i_file_id, i_var_id, 1, idims, cpname, __LINE__ )
154      CALL chkerr( nf90_get_var  ( i_file_id, i_var_id, z_lam),   &
155         &         cpname, __LINE__ )
156     
157      ! Get latitudes
158     
159      CALL chkerr( nf90_inq_varid( i_file_id, 'lat', i_var_id ), &
160         &         cpname, __LINE__ )
161      idims(1) = i_data
162      CALL chkdim( i_file_id, i_var_id, 1, idims, cpname, __LINE__ )
163      CALL chkerr( nf90_get_var  ( i_file_id, i_var_id, z_phi),   &
164         &         cpname, __LINE__ )
165     
166      ! Get seaice data
167     
168      CALL chkerr( nf90_inq_varid( i_file_id, 'sea_ice_concentration', &
169         &                         i_var_id ), &
170         &         cpname, __LINE__ )
171      idims(1) = i_data
172      idims(2) = i_time
173      CALL chkdim( i_file_id, i_var_id, 2, idims, cpname, __LINE__ )
174      CALL chkerr( nf90_get_var  ( i_file_id, i_var_id, z_seaice), &
175         &       cpname, __LINE__ )
176      zoff = 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      zsca = 1.0
183      IF (nf90_inquire_attribute( i_file_id, i_var_id, "scale_factor") &
184         &                       == nf90_noerr) THEN
185         CALL chkerr( nf90_get_att( i_file_id, i_var_id, &
186            &                       "scale_factor",zsca), cpname, __LINE__ )
187      ENDIF
188      zfill = 0.0
189      IF (nf90_inquire_attribute( i_file_id, i_var_id, "_FillValue") &
190         &                       == nf90_noerr) THEN
191         CALL chkerr( nf90_get_att( i_file_id, i_var_id, &
192            &                       "_FillValue",zfill), cpname, __LINE__ )
193      ENDIF
194      WHERE(z_seaice(:,:) /=  zfill)
195         z_seaice(:,:) = (zsca * z_seaice(:,:)) + zoff
196      ELSEWHERE
197         z_seaice(:,:) = fbrmdi
198      END WHERE
199     
200      ! Get QC flag
201     
202      CALL chkerr( nf90_inq_varid( i_file_id, 'confidence_flag', i_var_id ), &
203         &       cpname, __LINE__ )
204      idims(1) = i_data
205      idims(2) = i_time
206      CALL chkdim( i_file_id, i_var_id, 2, idims, cpname, __LINE__ )
207      CALL chkerr( nf90_get_var  ( i_file_id, i_var_id, i_qc),   &
208            &       cpname, __LINE__ )
209     
210      ! Get seaice obs type
211     
212      i_type(:,:)=1
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) = 'SEAICE'
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)') 'seaice','  '
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_seaice(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_seaice(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   END SUBROUTINE read_seaice
269
270
Note: See TracBrowser for help on using the repository browser.