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

Last change on this file since 450 was 440, checked in by opalod, 18 years ago

nemo_v1_update_046 : CT : - light modifications related to the way to make SST/SSS damping

  • add a flx_init subroutine to read the namflx namelist to get feedback coefficients for SST(dqdt0)/SSS(deds0) damping
  • replace the ztrp variable by the dqdt0 read in the namflx namelist
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 11.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 daymod          ! calendar
17
18   IMPLICIT NONE
19   PRIVATE
20
21   !! * Routine accessibility
22   PUBLIC dta_sal   ! called by step.F90 and inidta.F90
23   
24   !! * Shared module variables
25   LOGICAL , PUBLIC, PARAMETER ::   lk_dtasal = .TRUE.    !: salinity data flag
26   REAL(wp), PUBLIC, DIMENSION(jpi,jpj,jpk) ::   &  !:
27      s_dta       !: salinity data at given time-step
28
29   !! * Module variables
30   INTEGER ::   &
31      nlecsa = 0,   &  ! switch for the first read
32      nsal1     ,   &  ! first record used
33      nsal2            ! second record used
34   REAL(wp), DIMENSION(jpi,jpj,jpk,2) ::   &
35      saldta    ! salinity data at two consecutive times
36
37   !! * Substitutions
38#  include "domzgr_substitute.h90"
39   !!----------------------------------------------------------------------
40   !!   OPA 9.0 , LOCEAN-IPSL (2005)
41   !! $Header$
42   !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt
43   !!----------------------------------------------------------------------
44
45CONTAINS
46
47   !!----------------------------------------------------------------------
48   !!   Default option:                                         NetCDF file
49   !!----------------------------------------------------------------------
50
51   SUBROUTINE dta_sal( kt )
52      !!----------------------------------------------------------------------
53      !!                   ***  ROUTINE dta_sal  ***
54      !!       
55      !! ** Purpose :   Reads monthly salinity data
56      !!             
57      !! ** Method  : - Read on unit numsdt the monthly salinity data interpo-
58      !!     lated onto the model grid.
59      !!              - At each time step, a linear interpolation is applied
60      !!     between two monthly values.
61      !!
62      !! History :
63      !!        !  91-03  ()  Original code
64      !!        !  92-07  (M. Imbard)
65      !!   9.0  !  02-06  (G. Madec)  F90: Free form and module
66      !!----------------------------------------------------------------------
67      !! * Modules used
68      USE ioipsl
69
70      !! * Arguments
71      INTEGER, INTENT(in) ::   kt             ! ocean time step
72
73      !! * Local declarations
74      CHARACTER (len=32) ::   clname
75
76      INTEGER, PARAMETER ::   jpmois = 12, jpf = 1
77      INTEGER ::   ji, jj, jl           ! dummy loop indicies
78      INTEGER ::   &
79         imois, iman, ik, i15,       &  ! temporary integers
80         ipi, ipj, ipk, itime           !    "          "
81#if defined key_tradmp
82      INTEGER ::   &
83         jk, il0, il1,               &  ! temporary integers
84         ii0, ii1, ij0, ij1             !    "          "
85#endif
86      INTEGER, DIMENSION(jpmois) ::   istep
87      REAL(wp) ::   &
88         zxy, zl, zdate0
89      REAL(wp), DIMENSION(jpi,jpj) ::   zlon, zlat
90      REAL(wp), DIMENSION(jpk) ::   zlev
91      !!----------------------------------------------------------------------
92
93      ! 0. Initialization
94      ! -----------------
95
96      iman  = jpmois
97      i15   = nday / 16
98
99      imois = nmonth + i15 - 1
100      IF( imois == 0 ) imois = iman
101
102      itime = jpmois
103      ipi=jpiglo
104      ipj=jpjglo
105      ipk = jpk
106
107      ! 1. First call kt=nit000
108      ! -----------------------
109
110      IF( kt == nit000 .AND. nlecsa == 0 ) THEN
111         nsal1 = 0
112         IF(lwp) THEN
113            WRITE(numout,*)
114            WRITE(numout,*) ' dta_sal : monthly salinity data in NetCDF file'
115            WRITE(numout,*) ' ~~~~~~~'
116            WRITE(numout,*)
117         ENDIF
118
119         ! open file
120         
121         clname = 'data_1m_salinity_nomask'
122#if defined key_agrif
123         if ( .NOT. Agrif_Root() ) then
124            clname = TRIM(Agrif_CFixed())//'_'//TRIM(clname)
125         endif
126#endif         
127         CALL flinopen(TRIM(clname),mig(1),nlci,mjg(1),nlcj,.FALSE.   &
128              ,ipi,ipj,ipk,zlon,zlat,zlev,itime,istep,zdate0,rdt,numsdt)
129
130         ! title, dimensions and tests
131
132         IF( itime /= jpmois ) THEN
133            IF(lwp) THEN
134               WRITE(numout,*)
135               WRITE(numout,*) 'problem with time coordinates'
136               WRITE(numout,*) ' itime ',itime,' jpmois ',jpmois
137            ENDIF
138            STOP 'dta_sal'
139         ENDIF
140         IF( ipi /= jpidta .OR. ipj /= jpjdta .OR. ipk /= jpk ) THEN
141            IF(lwp) THEN
142               WRITE(numout,*)
143               WRITE(numout,*) 'problem with dimensions'
144               WRITE(numout,*) ' ipi ',ipi,' jpidta ',jpidta
145               WRITE(numout,*) ' ipj ',ipj,' jpjdta ',jpjdta
146               WRITE(numout,*) ' ipk ',ipk,' jpk ',jpk
147            ENDIF
148            STOP 'dta_sal'
149         ENDIF
150         IF(lwp)WRITE(numout,*) itime,istep,zdate0,rdt,numsdt
151
152      ENDIF
153
154
155      ! 2. Read monthly file
156      ! -------------------
157
158      IF( ( kt == nit000 .AND. nlecsa == 0) .OR. imois /= nsal1 ) THEN
159         nlecsa = 1
160         
161         ! 2.1 Calendar computation
162         
163         nsal1 = imois        ! first file record used
164         nsal2 = nsal1 + 1    ! last  file record used
165         nsal1 = MOD( nsal1, iman )
166         IF( nsal1 == 0 ) nsal1 = iman
167         nsal2 = MOD( nsal2, iman )
168         IF( nsal2 == 0 ) nsal2 = iman
169         IF(lwp) WRITE(numout,*) 'first record file used nsal1 ', nsal1
170         IF(lwp) WRITE(numout,*) 'last  record file used nsal2 ', nsal2
171         
172         ! 2.3 Read monthly salinity data Levitus
173
174         CALL flinget(numsdt,'vosaline',jpidta,jpjdta,jpk,jpmois,nsal1,   &
175           nsal1,mig(1),nlci,mjg(1),nlcj,saldta(1:nlci,1:nlcj,1:jpk,1))
176
177         CALL flinget(numsdt,'vosaline',jpidta,jpjdta,jpk,jpmois,nsal2,   &
178           nsal2,mig(1),nlci,mjg(1),nlcj,saldta(1:nlci,1:nlcj,1:jpk,2))
179
180         
181         IF(lwp) THEN
182            WRITE(numout,*)
183            WRITE(numout,*) ' read Levitus salinity ok'
184            WRITE(numout,*)
185         ENDIF
186         
187#if defined key_tradmp
188         IF( cp_cfg == "orca"  .AND. jp_cfg == 2 ) THEN
189
190            !                                        ! =======================
191            !                                        !  ORCA_R2 configuration
192            !                                        ! =======================
193            ij0 = 101   ;   ij1 = 109
194            ii0 = 141   ;   ii1 = 155   
195            DO jj = mj0(ij0), mj1(ij1)                      ! Reduced salinity in the Alboran Sea
196               DO ji = mi0(ii0), mi1(ii1)
197                  DO jk = 13, 13
198                     saldta(ji,jj,jk,:) = saldta(ji,jj,jk,:) - 0.15
199                  END DO
200                  DO jk = 14, 15
201                     saldta(ji,jj,jk,:) = saldta(ji,jj,jk,:) - 0.25
202                  END DO
203                  DO jk = 16, 17
204                     saldta(ji,jj,jk,:) = saldta(ji,jj,jk,:) - 0.30
205                  END DO
206                  DO jk = 18, 25
207                     saldta(ji,jj,jk,:) = saldta(ji,jj,jk,:) - 0.35
208                  END DO
209               END DO
210            END DO
211            IF( n_cla == 1 ) THEN 
212               !                                         ! New salinity profile at Gibraltar
213               il0 = 138   ;   il1 = 138   
214               ij0 = 101   ;   ij1 = 101
215               ii0 = 139   ;   ii1 = 139   
216               saldta( mi0(ii0):mi1(ii1), mj0(ij0):mj1(ij1) , : , : ) =   &
217                  &                                    saldta( mi0(il0):mi1(il1) , mj0(ij0):mj1(ij1) , : , : )
218               ij0 = 101   ;   ij1 = 101
219               saldta( mi0(ii0):mi1(ii1), mj0(ij0):mj1(ij1) , : , : ) =   &
220                  &                                    saldta( mi0(il0):mi1(il1) , mj0(ij0):mj1(ij1) , : , : )
221               il0 = 138   ;   il1 = 138   
222               ij0 = 101   ;   ij1 = 102
223               ii0 = 139   ;   ii1 = 139   
224               DO jl = mi0(il0), mi1(il1)                ! New salinity profile at Gibraltar
225                  DO jj = mj0(ij0), mj1(ij1)
226                     DO ji = mi0(ii0), mi1(ii1)
227                        saldta(ji,jj,:,:) = saldta(jl,jj,:,:)
228                     END DO
229                  END DO
230               END DO
231
232               il0 = 164   ;   il1 = 164   
233               ij0 =  88   ;   ij1 =  88
234               ii0 = 161   ;   ii1 = 163   
235               DO jl = mi0(il0), mi1(il1)                ! New salinity profile at Bab el Mandeb
236                  DO jj = mj0(ij0), mj1(ij1)
237                     DO ji = mi0(ii0), mi1(ii1)
238                        saldta(ji,jj,:,:) = saldta(jl,jj,:,:)
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                        saldta(ji,jj,:,:) = saldta(jl,jj,:,:)
245                     END DO
246                  END DO
247               END DO
248
249            ENDIF
250
251         ENDIF
252#endif
253         
254         !                                     ! Mask
255         DO jl = 1, 2
256            saldta(:,:,:,jl) = saldta(:,:,:,jl)*tmask(:,:,:)
257            saldta(:,:,jpk,jl) = 0.
258            IF( lk_zps ) THEN                   ! z-coord. partial steps
259               DO jj = 1, jpj                           ! interpolation of salinity at the last ocean level (i.e. the partial step)
260                  DO ji = 1, jpi
261                     ik = mbathy(ji,jj) - 1
262                     IF( ik > 2 ) THEN
263                        zl = ( gdept(ik) - fsdept(ji,jj,ik) ) / ( gdept(ik) - gdept(ik-1) )
264                        saldta(ji,jj,ik,jl) = (1.-zl) * saldta(ji,jj,ik,jl) +zl * saldta(ji,jj,ik-1,jl) 
265                     ENDIF
266                  END DO
267               END DO
268            ENDIF
269         END DO
270         
271
272         IF(lwp) THEN
273            WRITE(numout,*)' salinity Levitus month ',nsal1,nsal2
274            WRITE(numout,*)
275            WRITE(numout,*) ' Levitus month = ',nsal1,'  level = 1'
276            CALL prihre(saldta(:,:,1,1),jpi,jpj,1,jpi,20,1,jpj,20,1.,numout)
277            WRITE(numout,*) ' Levitus month = ',nsal1,'  level = ',jpk/2
278            CALL prihre(saldta(:,:,jpk/2,1),jpi,jpj,1,jpi,20,1,jpj,20,1.,numout)
279            WRITE(numout,*) ' Levitus month = ',nsal1,'  level = ',jpkm1
280            CALL prihre(saldta(:,:,jpkm1,1),jpi,jpj,1,jpi,20,1,jpj,20,1.,numout)
281         ENDIF
282      ENDIF
283     
284 
285      ! 3. At every time step compute salinity data
286      ! -------------------------------------------
287
288      zxy = FLOAT(nday + 15 - 30*i15)/30.
289      s_dta(:,:,:) = ( 1.- zxy ) * saldta(:,:,:,1) + zxy * saldta(:,:,:,2)
290
291   END SUBROUTINE dta_sal
292
293#else
294   !!----------------------------------------------------------------------
295   !!   Default option:                                    NO salinity data
296   !!----------------------------------------------------------------------
297   LOGICAL , PUBLIC, PARAMETER ::   lk_dtasal = .FALSE.   !: salinity data flag
298CONTAINS
299   SUBROUTINE dta_sal( kt )        ! Empty routine
300      WRITE(*,*) 'dta_sal: You should not have seen this print! error?', kt
301   END SUBROUTINE dta_sal
302#endif
303   !!======================================================================
304END MODULE dtasal
Note: See TracBrowser for help on using the repository browser.