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 trunk/NEMO/OPA_SRC/DTA – NEMO

source: trunk/NEMO/OPA_SRC/DTA/dtasal.F90 @ 1715

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

move daymod public variables in dom_oce, see ticket:590

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