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 @ 1152

Last change on this file since 1152 was 1152, checked in by rblod, 16 years ago

Convert cvs header to svn Id, step II

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 13.6 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           IF( n_cla == 1 ) THEN 
174              !                                         ! New salinity profile at Gibraltar
175              il0 = 138   ;   il1 = 138   
176              ij0 = 101   ;   ij1 = 101
177              ii0 = 139   ;   ii1 = 139   
178#if defined key_orca_lev10
179              zsal  ( mi0(ii0):mi1(ii1), mj0(ij0):mj1(ij1) , : , : ) =   &
180                   &                          zsal  ( mi0(il0):mi1(il1) , mj0(ij0):mj1(ij1) , : , : )
181#else
182              saldta( mi0(ii0):mi1(ii1), mj0(ij0):mj1(ij1) , : , : ) =   &
183                   &                          saldta( mi0(il0):mi1(il1) , mj0(ij0):mj1(ij1) , : , : )
184#endif
185              ij0 = 101   ;   ij1 = 101
186#if defined key_orca_lev10
187              zsal  ( mi0(ii0):mi1(ii1), mj0(ij0):mj1(ij1) , : , : ) =   &
188                   &                          zsal  ( mi0(il0):mi1(il1) , mj0(ij0):mj1(ij1) , : , : )
189#else
190              saldta( mi0(ii0):mi1(ii1), mj0(ij0):mj1(ij1) , : , : ) =   &
191                   &                          saldta( mi0(il0):mi1(il1) , mj0(ij0):mj1(ij1) , : , : )
192#endif
193              il0 = 138   ;   il1 = 138   
194              ij0 = 101   ;   ij1 = 102
195              ii0 = 139   ;   ii1 = 139   
196              DO jl = mi0(il0), mi1(il1)                ! New salinity profile at Gibraltar
197                 DO jj = mj0(ij0), mj1(ij1)
198                    DO ji = mi0(ii0), mi1(ii1)
199#if defined key_orca_lev10
200                       zsal  (ji,jj,:,:) = zsal  (jl,jj,:,:)
201#else
202                       saldta(ji,jj,:,:) = saldta(jl,jj,:,:)
203#endif
204                    END DO
205                 END DO
206              END DO
207             
208              il0 = 164   ;   il1 = 164   
209              ij0 =  88   ;   ij1 =  88
210              ii0 = 161   ;   ii1 = 163   
211              DO jl = mi0(il0), mi1(il1)                ! New salinity profile at Bab el Mandeb
212                 DO jj = mj0(ij0), mj1(ij1)
213                    DO ji = mi0(ii0), mi1(ii1)
214#if defined key_orca_lev10
215                       zsal  (ji,jj,:,:) = zsal  (jl,jj,:,:)
216#else
217                       saldta(ji,jj,:,:) = saldta(jl,jj,:,:)
218#endif
219                    END DO
220                 END DO
221                 ij0 =  87   ;   ij1 =  87
222                 DO jj = mj0(ij0), mj1(ij1)
223                    DO ji = mi0(ii0), mi1(ii1)
224#if defined key_orca_lev10
225                       zsal  (ji,jj,:,:) = zsal  (jl,jj,:,:)
226#else
227                       saldta(ji,jj,:,:) = saldta(jl,jj,:,:)
228#endif
229                    END DO
230                 END DO
231              END DO
232             
233           ENDIF
234           
235        ENDIF
236#endif   
237       
238#if defined key_orca_lev10
239        !  interpolate from 31 to 301 level the zsal field result in saldta
240        DO jl = 1, 2
241           DO jjk = 1, 5
242              saldta(:,:,jjk,jl) = zsal(:,:,1,jl)
243           ENDDO
244           DO jk = 1, jpk - 20, 10
245              ikr = INT( jk / 10 ) + 1
246              ikw = (ikr-1) * 10 + 1
247              ikt = ikw + 5
248              DO jjk = ikt , ikt + 9
249                 zfac = ( gdept_0(jjk) - gdepw_0(ikt) ) / ( gdepw_0(ikt+10) - gdepw_0(ikt) )
250                 saldta(:,:,jjk,jl) = zsal(:,:,ikr,jl) + ( zsal(:,:,ikr+1,jl) - zsal(:,:,ikr,jl) ) * zfac
251              END DO
252           END DO
253           DO jjk = jpk-5, jpk
254              saldta(:,:,jjk,jl) = zsal(:,:,jpkdta-1,jl)
255           END DO
256           ! fill the overlap areas
257           CALL lbc_lnk (saldta(:,:,:,jl),'Z',-999.,'no0')
258        END DO
259       
260#endif
261       
262        IF( ln_sco ) THEN
263           DO jl = 1, 2
264              DO jj = 1, jpj                  ! interpolation of salinites
265                 DO ji = 1, jpi
266                    DO jk = 1, jpk
267                       zl=fsdept(ji,jj,jk)
268                       IF(zl <  gdept_0(1)) zsaldta(jk,jl) =  saldta(ji,jj,1,jl)
269                       IF(zl >  gdept_0(jpk)) zsaldta(jk,jl) =  saldta(ji,jj,jpkm1,jl)
270                       DO jkk = 1, jpkm1
271                          IF((zl-gdept_0(jkk))*(zl-gdept_0(jkk+1)).le.0.0) THEN
272                             zsaldta(jk,jl) = saldta(ji,jj,jkk,jl)                                  &
273                                  &           + (zl-gdept_0(jkk))/(gdept_0(jkk+1)-gdept_0(jkk))       &
274                                  &                              *(saldta(ji,jj,jkk+1,jl) - saldta(ji,jj,jkk,jl))
275                          ENDIF
276                       END DO
277                    END DO
278                    DO jk = 1, jpkm1
279                       saldta(ji,jj,jk,jl) = zsaldta(jk,jl)
280                    END DO
281                    saldta(ji,jj,jpk,jl) = 0.0
282                 END DO
283              END DO
284           END DO
285           
286           IF(lwp) WRITE(numout,*)
287           IF(lwp) WRITE(numout,*) ' Levitus salinity data interpolated to s-coordinate'
288           IF(lwp) WRITE(numout,*)
289           
290        ELSE
291           !                                  ! Mask
292           DO jl = 1, 2
293              saldta(:,:,:,jl) = saldta(:,:,:,jl)*tmask(:,:,:)
294              saldta(:,:,jpk,jl) = 0.
295              IF( ln_zps ) THEN               ! z-coord. partial steps
296                 DO jj = 1, jpj               ! interpolation of salinity at the last ocean level (i.e. the partial step)
297                    DO ji = 1, jpi
298                       ik = mbathy(ji,jj) - 1
299                       IF( ik > 2 ) THEN
300                          zl = ( gdept_0(ik) - fsdept(ji,jj,ik) ) / ( gdept_0(ik) - gdept_0(ik-1) )
301                          saldta(ji,jj,ik,jl) = (1.-zl) * saldta(ji,jj,ik,jl) +zl * saldta(ji,jj,ik-1,jl)
302                       ENDIF
303                    END DO
304                 END DO
305              ENDIF
306           END DO
307        ENDIF
308       
309       
310        IF(lwp) THEN
311           WRITE(numout,*)' salinity Levitus month ',nsal1,nsal2
312           WRITE(numout,*)
313           WRITE(numout,*) ' Levitus month = ',nsal1,'  level = 1'
314           CALL prihre(saldta(:,:,1,1),jpi,jpj,1,jpi,20,1,jpj,20,1.,numout)
315           WRITE(numout,*) ' Levitus month = ',nsal1,'  level = ',jpk/2
316           CALL prihre(saldta(:,:,jpk/2,1),jpi,jpj,1,jpi,20,1,jpj,20,1.,numout)
317           WRITE(numout,*) ' Levitus month = ',nsal1,'  level = ',jpkm1
318           CALL prihre(saldta(:,:,jpkm1,1),jpi,jpj,1,jpi,20,1,jpj,20,1.,numout)
319        ENDIF
320     ENDIF
321     
322     
323     ! 3. At every time step compute salinity data
324     ! -------------------------------------------
325     
326     zxy = FLOAT(nday + 15 - 30*i15)/30.
327     s_dta(:,:,:) = ( 1.- zxy ) * saldta(:,:,:,1) + zxy * saldta(:,:,:,2)
328     
329     ! Close the file
330     ! --------------
331     
332     IF( kt == nitend )   CALL iom_close (numsdt)
333
334   END SUBROUTINE dta_sal
335
336#else
337   !!----------------------------------------------------------------------
338   !!   Default option:                                    NO salinity data
339   !!----------------------------------------------------------------------
340   LOGICAL , PUBLIC, PARAMETER ::   lk_dtasal = .FALSE.   !: salinity data flag
341CONTAINS
342   SUBROUTINE dta_sal( kt )        ! Empty routine
343      WRITE(*,*) 'dta_sal: You should not have seen this print! error?', kt
344   END SUBROUTINE dta_sal
345#endif
346   !!======================================================================
347END MODULE dtasal
Note: See TracBrowser for help on using the repository browser.