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.
obs_sstbias.F90 in NEMO/branches/2021/dev_r14116_HPC-10_mcastril_Mixed_Precision_implementation/src/OCE/OBS – NEMO

source: NEMO/branches/2021/dev_r14116_HPC-10_mcastril_Mixed_Precision_implementation/src/OCE/OBS/obs_sstbias.F90 @ 15540

Last change on this file since 15540 was 15540, checked in by sparonuz, 3 years ago

Mixed precision version, tested up to 30 years on ORCA2.

  • Property svn:keywords set to Id
File size: 9.1 KB
Line 
1MODULE obs_sstbias
2   !!======================================================================
3   !!                       ***  MODULE obs_sstbias  ***
4   !! Observation diagnostics: Read the bias for SST data
5   !!======================================================================
6   !!----------------------------------------------------------------------
7   !!   obs_app_sstbias : Driver for reading and applying the SST bias
8   !!----------------------------------------------------------------------
9   !! * Modules used   
10   USE par_kind, ONLY : &       ! Precision variables
11      & wp, &
12      & dp, &
13      & sp
14   USE par_oce, ONLY : &        ! Domain parameters
15      & jpi, &
16      & jpj, &
17      & jpim1
18   USE in_out_manager, ONLY : & ! I/O manager
19      & lwp,    &
20      & numout 
21   USE obs_surf_def             ! Surface observation definitions
22   USE dom_oce, ONLY : &        ! Domain variables
23      & tmask, &
24      & tmask_i, &
25      & e1t,   &
26      & e2t,   &
27      & gphit, &
28      & glamt
29   USE oce, ONLY : &           ! Model variables
30      & ssh
31   USE obs_inter_h2d
32   USE obs_utils               ! Various observation tools
33   USE obs_inter_sup
34   IMPLICIT NONE
35   !! * Routine accessibility
36   PRIVATE
37   PUBLIC obs_app_sstbias     ! Read the altimeter bias
38   !! * Substitutions
39#  include "single_precision_substitute.h90"
40
41CONTAINS
42   SUBROUTINE obs_app_sstbias( sstdata, k2dint, knumtypes, &
43                               cl_bias_files )
44      !!---------------------------------------------------------------------
45      !!
46      !!                   *** ROUTINE obs_app_sstbias ***
47      !!
48      !! ** Purpose : Read SST bias data from files and apply correction to
49      !!             observations
50      !!
51      !! ** Method  :
52      !!
53      !! ** Action  :
54      !!
55      !! References :
56      !!
57      !! History :
58      !!      ! :  2014-08 (J. While) Bias correction code for SST obs,
59      !!      !                      based on obs_rea_altbias
60      !!----------------------------------------------------------------------
61      !! * Modules used
62      USE iom
63      USE netcdf
64      !! * Arguments
65
66      TYPE(obs_surf), INTENT(INOUT) :: sstdata       ! SST data
67      INTEGER, INTENT(IN) :: k2dint
68      INTEGER, INTENT(IN) :: knumtypes !number of bias types to read in
69      CHARACTER(LEN=128), DIMENSION(knumtypes), INTENT(IN) :: &
70                          cl_bias_files !List of files to read
71      !! * Local declarations
72      INTEGER :: jobs         ! Obs loop variable
73      INTEGER :: jpisstbias   ! Number of grid point in latitude for the bias
74      INTEGER :: jpjsstbias   ! Number of grid point in longitude for the bias
75      INTEGER :: iico         ! Grid point indices
76      INTEGER :: ijco
77      INTEGER :: jt
78      INTEGER :: i_nx_id      ! Index to read the NetCDF file
79      INTEGER :: i_ny_id      !
80      INTEGER :: i_file_id    !
81      INTEGER :: i_var_id
82      INTEGER, DIMENSION(knumtypes) :: &
83         & ibiastypes             ! Array of the bias types in each file
84      REAL(dp), DIMENSION(jpi,jpj,knumtypes) :: & 
85         & z_sstbias              ! Array to store the SST bias values
86      REAL(dp), DIMENSION(jpi,jpj) :: & 
87         & z_sstbias_2d           ! Array to store the SST bias values   
88      REAL(dp), DIMENSION(1) :: &
89         & zext, &
90         & zobsmask
91      REAL(dp), DIMENSION(2,2,1) :: &
92         & zweig
93      REAL(dp), DIMENSION(:,:,:), ALLOCATABLE :: &
94         & zmask, &
95         & zglam, &
96         & zgphi
97      REAL(dp), DIMENSION(:,:,:), ALLOCATABLE :: &
98         & zmask_tmp, &
99         & zglam_tmp, &
100         & zgphi_tmp   
101      REAL(dp), ALLOCATABLE, DIMENSION(:,:,:) ::  zbias   
102      REAL(dp) :: zlam
103      REAL(dp) :: zphi
104      INTEGER, DIMENSION(:,:,:), ALLOCATABLE :: &
105         & igrdi, &
106         & igrdj
107      INTEGER, DIMENSION(:,:,:), ALLOCATABLE :: &
108         & igrdi_tmp, &
109         & igrdj_tmp   
110      INTEGER :: numsstbias
111      INTEGER(KIND=NF90_INT) :: ifile_source
112     
113      INTEGER :: incfile
114      INTEGER :: jtype
115      INTEGER :: iret 
116      INTEGER :: inumtype
117      IF(lwp)WRITE(numout,*) 
118      IF(lwp)WRITE(numout,*) 'obs_rea_sstbias : '
119      IF(lwp)WRITE(numout,*) '----------------- '
120      IF(lwp)WRITE(numout,*) 'Read SST bias '
121      ! Open and read the files
122      z_sstbias(:,:,:)=0.0_wp
123      DO jtype = 1, knumtypes
124     
125         numsstbias=0
126         IF(lwp)WRITE(numout,*) 'Opening ',cl_bias_files(jtype)
127         CALL iom_open( cl_bias_files(jtype), numsstbias, ldstop=.FALSE. )       
128         IF (numsstbias > 0) THEN
129     
130            !Read the bias type from the file
131            !No IOM get attribute command at time of writing,
132            !so have to use NETCDF
133            !routines directly - should be upgraded in the future
134            iret=NF90_OPEN(TRIM(cl_bias_files(jtype)), NF90_NOWRITE, incfile)
135            iret=NF90_GET_ATT( incfile, NF90_GLOBAL, "SST_source", &
136                              ifile_source )
137            ibiastypes(jtype) = ifile_source                 
138            iret=NF90_CLOSE(incfile)       
139           
140            IF ( iret /= 0  ) CALL ctl_stop( &
141               'obs_rea_sstbias : Cannot read bias type from file '// &
142               cl_bias_files(jtype) )
143            ! Get the SST bias data
144            CALL iom_get( numsstbias, jpdom_global, 'tn', z_sstbias_2d(:,:), 1 )
145            z_sstbias(:,:,jtype) = z_sstbias_2d(:,:)       
146            ! Close the file
147            CALL iom_close(numsstbias)       
148         ELSE
149            CALL ctl_stop('obs_read_sstbias: File '// & 
150                           TRIM( cl_bias_files(jtype) )//' Not found')
151         ENDIF
152      END DO
153           
154      ! Interpolate the bias already on the model grid at the observation point
155      ALLOCATE( &
156         & igrdi(2,2,sstdata%nsurf), &
157         & igrdj(2,2,sstdata%nsurf), &
158         & zglam(2,2,sstdata%nsurf), &
159         & zgphi(2,2,sstdata%nsurf), &
160         & zmask(2,2,sstdata%nsurf)  )
161       
162      DO jobs = 1, sstdata%nsurf 
163         igrdi(1,1,jobs) = sstdata%mi(jobs)-1
164         igrdj(1,1,jobs) = sstdata%mj(jobs)-1
165         igrdi(1,2,jobs) = sstdata%mi(jobs)-1
166         igrdj(1,2,jobs) = sstdata%mj(jobs)
167         igrdi(2,1,jobs) = sstdata%mi(jobs)
168         igrdj(2,1,jobs) = sstdata%mj(jobs)-1
169         igrdi(2,2,jobs) = sstdata%mi(jobs)
170         igrdj(2,2,jobs) = sstdata%mj(jobs)
171      END DO
172      CALL obs_int_comm_2d( 2, 2, sstdata%nsurf, jpi, jpj, &
173         &                  igrdi, igrdj, glamt, zglam )
174      CALL obs_int_comm_2d( 2, 2, sstdata%nsurf, jpi, jpj, &
175         &                  igrdi, igrdj, gphit, zgphi )
176      CALL obs_int_comm_2d( 2, 2, sstdata%nsurf, jpi, jpj, &
177         &                  igrdi, igrdj, tmask(:,:,1), zmask )
178      DO jtype = 1, knumtypes
179         
180         !Find the number observations of type and allocate tempory arrays
181         inumtype = COUNT( sstdata%ntyp(:) == ibiastypes(jtype) )
182         ALLOCATE( &
183            & igrdi_tmp(2,2,inumtype), &
184            & igrdj_tmp(2,2,inumtype), &
185            & zglam_tmp(2,2,inumtype), &
186            & zgphi_tmp(2,2,inumtype), &
187            & zmask_tmp(2,2,inumtype), &
188            & zbias( 2,2,inumtype ) )
189         jt=1
190         DO jobs = 1, sstdata%nsurf 
191            IF ( sstdata%ntyp(jobs) == ibiastypes(jtype) ) THEN
192               igrdi_tmp(:,:,jt) = igrdi(:,:,jobs) 
193               igrdj_tmp(:,:,jt) = igrdj(:,:,jobs)
194               zglam_tmp(:,:,jt) = zglam(:,:,jobs)
195               zgphi_tmp(:,:,jt) = zgphi(:,:,jobs)
196               zmask_tmp(:,:,jt) = zmask(:,:,jobs)
197               jt = jt +1
198            ENDIF
199         END DO
200                         
201         CALL obs_int_comm_2d( 2, 2, inumtype, jpi, jpj, &
202               &           igrdi_tmp(:,:,:), igrdj_tmp(:,:,:), &
203               &           z_sstbias(:,:,jtype), zbias(:,:,:) )
204         jt=1
205         DO jobs = 1, sstdata%nsurf
206            IF ( sstdata%ntyp(jobs) == ibiastypes(jtype) ) THEN
207               zlam = sstdata%rlam(jobs)
208               zphi = sstdata%rphi(jobs)
209               iico = sstdata%mi(jobs)
210               ijco = sstdata%mj(jobs)         
211               CALL obs_int_h2d_init( 1, 1, k2dint, zlam, zphi,         &
212                  &                   zglam_tmp(:,:,jt), &
213                  &                   zgphi_tmp(:,:,jt), &
214                  &                   zmask_tmp(:,:,jt), zweig, zobsmask )
215               CALL obs_int_h2d( 1, 1, zweig, zbias(:,:,jt),  zext )
216               ! adjust sst with bias field
217               sstdata%robs(jobs,1) = sstdata%robs(jobs,1) - zext(1)
218               jt=jt+1
219            ENDIF
220         END DO 
221               
222         !Deallocate arrays
223         DEALLOCATE( &
224         & igrdi_tmp, &
225         & igrdj_tmp, &
226         & zglam_tmp, &
227         & zgphi_tmp, &
228         & zmask_tmp, &
229         & zbias )           
230      END DO
231      DEALLOCATE( &
232         & igrdi, &
233         & igrdj, &
234         & zglam, &
235         & zgphi, &
236         & zmask )
237
238      IF(lwp) THEN
239         WRITE(numout,*) " "
240         WRITE(numout,*) "SST bias correction applied successfully"
241         WRITE(numout,*) "Obs types: ",ibiastypes(:), &
242                              " Have all been bias corrected\n"
243      ENDIF
244   END SUBROUTINE obs_app_sstbias
245 
246END MODULE obs_sstbias
Note: See TracBrowser for help on using the repository browser.