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.
dtasal.F90 in branches/dev_004_VVL/NEMO/OPA_SRC/DTA – NEMO

source: branches/dev_004_VVL/NEMO/OPA_SRC/DTA/dtasal.F90 @ 1361

Last change on this file since 1361 was 1273, checked in by ctlod, 15 years ago

update Gibrlatar, Bab El Mandeb and Sound straits in both full & partial steps bathymetry files such as closed seas, see ticket: #305

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 12.3 KB
Line 
1MODULE dtasal
2   !!======================================================================
3   !!                     ***  MODULE  dtasal  ***
4   !! Ocean data  :  read ocean salinity data from monthly atlas data
5   !!=====================================================================
6#if defined key_dtasal   ||   defined key_esopa
7   !!----------------------------------------------------------------------
8   !!   'key_dtasal'                                          salinity data
9   !!----------------------------------------------------------------------
10   !!   dta_sal      : read ocean salinity data
11   !!----------------------------------------------------------------------
12   !! * Modules used
13   USE oce             ! ocean dynamics and tracers
14   USE dom_oce         ! ocean space and time domain
15   USE in_out_manager  ! I/O manager
16   USE phycst          ! physical constants
17   USE daymod          ! calendar
18#if defined key_orca_lev10
19   USE lbclnk          ! ocean lateral boundary conditions (or mpp link)
20#endif
21
22   IMPLICIT NONE
23   PRIVATE
24
25   !! * Routine accessibility
26   PUBLIC dta_sal   ! called by step.F90 and inidta.F90
27   
28   !! * Shared module variables
29   LOGICAL , PUBLIC, PARAMETER ::   lk_dtasal = .TRUE.    !: salinity data flag
30   REAL(wp), PUBLIC, DIMENSION(jpi,jpj,jpk) ::   &  !:
31      s_dta       !: salinity data at given time-step
32
33   !! * Module variables
34   INTEGER ::   &
35      numsdt,           &  !: logical unit for data salinity
36      nsal1, nsal2         ! first and second record used
37   REAL(wp), DIMENSION(jpi,jpj,jpk,2) ::   &
38      saldta    ! salinity data at two consecutive times
39
40   !! * Substitutions
41#  include "domzgr_substitute.h90"
42   !!----------------------------------------------------------------------
43   !!   OPA 9.0 , LOCEAN-IPSL (2005)
44   !! $Id$
45   !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt
46   !!----------------------------------------------------------------------
47
48CONTAINS
49
50   !!----------------------------------------------------------------------
51   !!   Default option:                                         NetCDF file
52   !!----------------------------------------------------------------------
53
54   SUBROUTINE dta_sal( kt )
55     !!----------------------------------------------------------------------
56     !!                   ***  ROUTINE dta_sal  ***
57     !!       
58     !! ** Purpose :   Reads monthly salinity data
59     !!             
60     !! ** Method  : - Read on unit numsdt the monthly salinity data interpo-
61     !!     lated onto the model grid.
62     !!              - At each time step, a linear interpolation is applied
63     !!     between two monthly values.
64     !!
65     !! History :
66     !!        !  91-03  ()  Original code
67     !!        !  92-07  (M. Imbard)
68     !!   9.0  !  02-06  (G. Madec)  F90: Free form and module
69     !!----------------------------------------------------------------------
70     !! * Modules used
71     USE iom
72     
73     !! * Arguments
74     INTEGER, INTENT(in) ::   kt             ! ocean time step
75     
76     !! * Local declarations
77     
78     INTEGER ::   ji, jj, jk, jl, jkk   ! dummy loop indicies
79     INTEGER ::   &
80          imois, iman, i15, ik           ! temporary integers
81#  if defined key_tradmp
82     INTEGER ::   &
83          il0, il1, ii0, ii1, ij0, ij1   ! temporary integers         
84# endif
85     REAL(wp) ::   zxy, zl
86#if defined key_orca_lev10
87     REAL(wp), DIMENSION(jpi,jpj,jpkdta,2) :: zsal
88     INTEGER   :: ikr, ikw, ikt, jjk
89     REAL(wp)  :: zfac
90#endif
91     REAL(wp), DIMENSION(jpk,2) ::   &
92          zsaldta            ! auxiliary array for interpolation
93     !!----------------------------------------------------------------------
94     
95     ! 0. Initialization
96     ! -----------------
97     
98     iman  = INT( raamo )
99!!! better but change the results     i15 = INT( 2*FLOAT( nday ) / ( FLOAT( nobis(nmonth) ) + 0.5 ) )
100     i15   = nday / 16
101     imois = nmonth + i15 - 1
102     IF( imois == 0 ) imois = iman
103     
104     ! 1. First call kt=nit000
105     ! -----------------------
106     
107     IF( kt == nit000 ) THEN
108       
109        nsal1 = 0   ! initializations
110        IF(lwp) WRITE(numout,*) ' dta_sal : monthly salinity data in NetCDF file'
111        CALL iom_open ( 'data_1m_salinity_nomask', numsdt ) 
112       
113     ENDIF
114     
115     
116     ! 2. Read monthly file
117     ! -------------------
118     
119     IF( kt == nit000 .OR. imois /= nsal1 ) THEN
120       
121        ! 2.1 Calendar computation
122       
123        nsal1 = imois        ! first file record used
124        nsal2 = nsal1 + 1    ! last  file record used
125        nsal1 = MOD( nsal1, iman )
126        IF( nsal1 == 0 ) nsal1 = iman
127        nsal2 = MOD( nsal2, iman )
128        IF( nsal2 == 0 ) nsal2 = iman
129        IF(lwp) WRITE(numout,*) 'first record file used nsal1 ', nsal1
130        IF(lwp) WRITE(numout,*) 'last  record file used nsal2 ', nsal2
131       
132        ! 2.3 Read monthly salinity data Levitus
133       
134#if defined key_orca_lev10
135        if (ln_zps) stop
136        zsal(:,:,:,:) = 0.
137        CALL iom_get (numsdt,jpdom_data,'vosaline',zsal(:,:,:,1),nsal1)
138        CALL iom_get (numsdt,jpdom_data,'vosaline',zsal(:,:,:,2),nsal2)
139#else
140        CALL iom_get (numsdt,jpdom_data,'vosaline',saldta(:,:,:,1),nsal1)
141        CALL iom_get (numsdt,jpdom_data,'vosaline',saldta(:,:,:,2),nsal2)
142#endif
143       
144        IF(lwp) THEN
145           WRITE(numout,*)
146           WRITE(numout,*) ' read Levitus salinity ok'
147           WRITE(numout,*)
148        ENDIF
149       
150#if defined key_tradmp
151        IF( cp_cfg == "orca"  .AND. jp_cfg == 2 ) THEN
152           
153           !                                        ! =======================
154           !                                        !  ORCA_R2 configuration
155           !                                        ! =======================
156           ij0 = 101   ;   ij1 = 109
157           ii0 = 141   ;   ii1 = 155   
158           DO jj = mj0(ij0), mj1(ij1)                  ! Reduced salinity in the Alboran Sea
159              DO ji = mi0(ii0), mi1(ii1)
160#if defined key_orca_lev10
161                 zsal  (ji,jj,13:13,:) = zsal  (ji,jj,13:13,:) - 0.15
162                 zsal  (ji,jj,14:15,:) = zsal  (ji,jj,14:15,:) - 0.25
163                 zsal  (ji,jj,16:17,:) = zsal  (ji,jj,16:17,:) - 0.30
164                 zsal  (ji,jj,18:25,:) = zsal  (ji,jj,18:25,:) - 0.35
165#else
166                 saldta(ji,jj,13:13,:) = saldta(ji,jj,13:13,:) - 0.15
167                 saldta(ji,jj,14:15,:) = saldta(ji,jj,14:15,:) - 0.25
168                 saldta(ji,jj,16:17,:) = saldta(ji,jj,16:17,:) - 0.30
169                 saldta(ji,jj,18:25,:) = saldta(ji,jj,18:25,:) - 0.35
170#endif
171              END DO
172           END DO
173
174           IF( n_cla == 1 ) THEN 
175              !                                         ! New salinity profile at Gibraltar
176              il0 = 138   ;   il1 = 138   
177              ij0 = 101   ;   ij1 = 102
178              ii0 = 139   ;   ii1 = 139   
179              DO jl = mi0(il0), mi1(il1)
180                 DO jj = mj0(ij0), mj1(ij1)
181                    DO ji = mi0(ii0), mi1(ii1)
182#if defined key_orca_lev10
183                       zsal  (ji,jj,:,:) = zsal  (jl,jj,:,:)
184#else
185                       saldta(ji,jj,:,:) = saldta(jl,jj,:,:)
186#endif
187                    END DO
188                 END DO
189              END DO
190              !                                         ! New salinity profile at Bab el Mandeb
191              il0 = 164   ;   il1 = 164   
192              ij0 =  87   ;   ij1 =  88
193              ii0 = 161   ;   ii1 = 163   
194              DO jl = mi0(il0), mi1(il1)
195                 DO jj = mj0(ij0), mj1(ij1)
196                    DO ji = mi0(ii0), mi1(ii1)
197#if defined key_orca_lev10
198                       zsal  (ji,jj,:,:) = zsal  (jl,jj,:,:)
199#else
200                       saldta(ji,jj,:,:) = saldta(jl,jj,:,:)
201#endif
202                    END DO
203                 END DO
204              END DO
205              !
206           ENDIF
207           !
208        ENDIF
209#endif   
210       
211#if defined key_orca_lev10
212        !  interpolate from 31 to 301 level the zsal field result in saldta
213        DO jl = 1, 2
214           DO jjk = 1, 5
215              saldta(:,:,jjk,jl) = zsal(:,:,1,jl)
216           ENDDO
217           DO jk = 1, jpk - 20, 10
218              ikr = INT( jk / 10 ) + 1
219              ikw = (ikr-1) * 10 + 1
220              ikt = ikw + 5
221              DO jjk = ikt , ikt + 9
222                 zfac = ( gdept_0(jjk) - gdepw_0(ikt) ) / ( gdepw_0(ikt+10) - gdepw_0(ikt) )
223                 saldta(:,:,jjk,jl) = zsal(:,:,ikr,jl) + ( zsal(:,:,ikr+1,jl) - zsal(:,:,ikr,jl) ) * zfac
224              END DO
225           END DO
226           DO jjk = jpk-5, jpk
227              saldta(:,:,jjk,jl) = zsal(:,:,jpkdta-1,jl)
228           END DO
229           ! fill the overlap areas
230           CALL lbc_lnk (saldta(:,:,:,jl),'Z',-999.,'no0')
231        END DO
232       
233#endif
234       
235        IF( ln_sco ) THEN
236           DO jl = 1, 2
237              DO jj = 1, jpj                  ! interpolation of salinites
238                 DO ji = 1, jpi
239                    DO jk = 1, jpk
240                       zl=fsdept(ji,jj,jk)
241                       IF(zl <  gdept_0(1)) zsaldta(jk,jl) =  saldta(ji,jj,1,jl)
242                       IF(zl >  gdept_0(jpk)) zsaldta(jk,jl) =  saldta(ji,jj,jpkm1,jl)
243                       DO jkk = 1, jpkm1
244                          IF((zl-gdept_0(jkk))*(zl-gdept_0(jkk+1)).le.0.0) THEN
245                             zsaldta(jk,jl) = saldta(ji,jj,jkk,jl)                                  &
246                                  &           + (zl-gdept_0(jkk))/(gdept_0(jkk+1)-gdept_0(jkk))       &
247                                  &                              *(saldta(ji,jj,jkk+1,jl) - saldta(ji,jj,jkk,jl))
248                          ENDIF
249                       END DO
250                    END DO
251                    DO jk = 1, jpkm1
252                       saldta(ji,jj,jk,jl) = zsaldta(jk,jl)
253                    END DO
254                    saldta(ji,jj,jpk,jl) = 0.0
255                 END DO
256              END DO
257           END DO
258           
259           IF(lwp) WRITE(numout,*)
260           IF(lwp) WRITE(numout,*) ' Levitus salinity data interpolated to s-coordinate'
261           IF(lwp) WRITE(numout,*)
262           
263        ELSE
264           !                                  ! Mask
265           DO jl = 1, 2
266              saldta(:,:,:,jl) = saldta(:,:,:,jl)*tmask(:,:,:)
267              saldta(:,:,jpk,jl) = 0.
268              IF( ln_zps ) THEN               ! z-coord. partial steps
269                 DO jj = 1, jpj               ! interpolation of salinity at the last ocean level (i.e. the partial step)
270                    DO ji = 1, jpi
271                       ik = mbathy(ji,jj) - 1
272                       IF( ik > 2 ) THEN
273                          zl = ( gdept_0(ik) - fsdept(ji,jj,ik) ) / ( gdept_0(ik) - gdept_0(ik-1) )
274                          saldta(ji,jj,ik,jl) = (1.-zl) * saldta(ji,jj,ik,jl) +zl * saldta(ji,jj,ik-1,jl)
275                       ENDIF
276                    END DO
277                 END DO
278              ENDIF
279           END DO
280        ENDIF
281       
282       
283        IF(lwp) THEN
284           WRITE(numout,*)' salinity Levitus month ',nsal1,nsal2
285           WRITE(numout,*)
286           WRITE(numout,*) ' Levitus month = ',nsal1,'  level = 1'
287           CALL prihre(saldta(:,:,1,1),jpi,jpj,1,jpi,20,1,jpj,20,1.,numout)
288           WRITE(numout,*) ' Levitus month = ',nsal1,'  level = ',jpk/2
289           CALL prihre(saldta(:,:,jpk/2,1),jpi,jpj,1,jpi,20,1,jpj,20,1.,numout)
290           WRITE(numout,*) ' Levitus month = ',nsal1,'  level = ',jpkm1
291           CALL prihre(saldta(:,:,jpkm1,1),jpi,jpj,1,jpi,20,1,jpj,20,1.,numout)
292        ENDIF
293     ENDIF
294     
295     
296     ! 3. At every time step compute salinity data
297     ! -------------------------------------------
298     
299     zxy = FLOAT(nday + 15 - 30*i15)/30.
300     s_dta(:,:,:) = ( 1.- zxy ) * saldta(:,:,:,1) + zxy * saldta(:,:,:,2)
301     
302     ! Close the file
303     ! --------------
304     
305     IF( kt == nitend )   CALL iom_close (numsdt)
306
307   END SUBROUTINE dta_sal
308
309#else
310   !!----------------------------------------------------------------------
311   !!   Default option:                                    NO salinity data
312   !!----------------------------------------------------------------------
313   LOGICAL , PUBLIC, PARAMETER ::   lk_dtasal = .FALSE.   !: salinity data flag
314CONTAINS
315   SUBROUTINE dta_sal( kt )        ! Empty routine
316      WRITE(*,*) 'dta_sal: You should not have seen this print! error?', kt
317   END SUBROUTINE dta_sal
318#endif
319   !!======================================================================
320END MODULE dtasal
Note: See TracBrowser for help on using the repository browser.