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

source: branches/TAM_V3_0/NEMO/OPA_SRC/DTA/dtasal.F90 @ 1944

Last change on this file since 1944 was 1884, checked in by rblod, 14 years ago

Light adaptation of NEMO direct model routine to handle TAM

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