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

Last change on this file since 239 was 239, checked in by opalod, 19 years ago

CT : UPDATE172 : remove all direct acces modules and the related cpp key key_fdir

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