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

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

RB:nemo_v1_update_038: first integration of Agrif :

  • add agrif to dynspg_flt_jki.F90
  • cosmetic change of key_AGRIF in key_agrif
  • 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
94      ! 0. Initialization
95      ! -----------------
96
97      iman  = jpmois
98      i15   = nday / 16
99
100      imois = nmonth + i15 - 1
101      IF( imois == 0 ) imois = iman
102
103      itime = jpmois
104      ipi=jpiglo
105      ipj=jpjglo
106      ipk = jpk
107
108      ! 1. First call kt=nit000
109      ! -----------------------
110
111      IF( kt == nit000 .AND. nlecsa == 0 ) THEN
112         nsal1 = 0
113         IF(lwp) THEN
114            WRITE(numout,*)
115            WRITE(numout,*) ' dta_sal : monthly salinity data in NetCDF file'
116            WRITE(numout,*) ' ~~~~~~~'
117            WRITE(numout,*)
118         ENDIF
119
120         ! open file
121         
122         clname = 'data_1m_salinity_nomask'
123#if defined key_agrif
124         if ( .NOT. Agrif_Root() ) then
125            clname = TRIM(Agrif_CFixed())//'_'//TRIM(clname)
126         endif
127#endif         
128         CALL flinopen(TRIM(clname),mig(1),nlci,mjg(1),nlcj,.FALSE.   &
129              ,ipi,ipj,ipk,zlon,zlat,zlev,itime,istep,zdate0,rdt,numsdt)
130
131         ! title, dimensions and tests
132
133         IF( itime /= jpmois ) THEN
134            IF(lwp) THEN
135               WRITE(numout,*)
136               WRITE(numout,*) 'problem with time coordinates'
137               WRITE(numout,*) ' itime ',itime,' jpmois ',jpmois
138            ENDIF
139            STOP 'dta_sal'
140         ENDIF
141         IF( ipi /= jpidta .OR. ipj /= jpjdta .OR. ipk /= jpk ) THEN
142            IF(lwp) THEN
143               WRITE(numout,*)
144               WRITE(numout,*) 'problem with dimensions'
145               WRITE(numout,*) ' ipi ',ipi,' jpidta ',jpidta
146               WRITE(numout,*) ' ipj ',ipj,' jpjdta ',jpjdta
147               WRITE(numout,*) ' ipk ',ipk,' jpk ',jpk
148            ENDIF
149            STOP 'dta_sal'
150         ENDIF
151         IF(lwp)WRITE(numout,*) itime,istep,zdate0,rdt,numsdt
152
153      ENDIF
154
155
156      ! 2. Read monthly file
157      ! -------------------
158
159      IF( ( kt == nit000 .AND. nlecsa == 0) .OR. imois /= nsal1 ) THEN
160         nlecsa = 1
161         
162         ! 2.1 Calendar computation
163         
164         nsal1 = imois        ! first file record used
165         nsal2 = nsal1 + 1    ! last  file record used
166         nsal1 = MOD( nsal1, iman )
167         IF( nsal1 == 0 ) nsal1 = iman
168         nsal2 = MOD( nsal2, iman )
169         IF( nsal2 == 0 ) nsal2 = iman
170         IF(lwp) WRITE(numout,*) 'first record file used nsal1 ', nsal1
171         IF(lwp) WRITE(numout,*) 'last  record file used nsal2 ', nsal2
172         
173         ! 2.3 Read monthly salinity data Levitus
174
175         CALL flinget(numsdt,'vosaline',jpidta,jpjdta,jpk,jpmois,nsal1,   &
176           nsal1,mig(1),nlci,mjg(1),nlcj,saldta(1:nlci,1:nlcj,1:jpk,1))
177
178         CALL flinget(numsdt,'vosaline',jpidta,jpjdta,jpk,jpmois,nsal2,   &
179           nsal2,mig(1),nlci,mjg(1),nlcj,saldta(1:nlci,1:nlcj,1:jpk,2))
180
181         
182         IF(lwp) THEN
183            WRITE(numout,*)
184            WRITE(numout,*) ' read Levitus salinity ok'
185            WRITE(numout,*)
186         ENDIF
187         
188#  if defined key_tradmp
189         IF( cp_cfg == "orca"  .AND. jp_cfg == 2 ) THEN
190
191            !                                        ! =======================
192            !                                        !  ORCA_R2 configuration
193            !                                        ! =======================
194            ij0 = 101   ;   ij1 = 109
195            ii0 = 141   ;   ii1 = 155   
196            DO jj = mj0(ij0), mj1(ij1)                      ! Reduced salinity in the Alboran Sea
197               DO ji = mi0(ii0), mi1(ii1)
198                  DO jk = 13, 13
199                     saldta(ji,jj,jk,:) = saldta(ji,jj,jk,:) - 0.15
200                  END DO
201                  DO jk = 14, 15
202                     saldta(ji,jj,jk,:) = saldta(ji,jj,jk,:) - 0.25
203                  END DO
204                  DO jk = 16, 17
205                     saldta(ji,jj,jk,:) = saldta(ji,jj,jk,:) - 0.30
206                  END DO
207                  DO jk = 18, 25
208                     saldta(ji,jj,jk,:) = saldta(ji,jj,jk,:) - 0.35
209                  END DO
210               END DO
211            END DO
212            IF( n_cla == 1 ) THEN 
213               !                                         ! New salinity profile at Gibraltar
214               il0 = 138   ;   il1 = 138   
215               ij0 = 101   ;   ij1 = 101
216               ii0 = 139   ;   ii1 = 139   
217               saldta( mi0(ii0):mi1(ii1), mj0(ij0):mj1(ij1) , : , : ) =   &
218                  &                                    saldta( mi0(il0):mi1(il1) , mj0(ij0):mj1(ij1) , : , : )
219               ij0 = 101   ;   ij1 = 101
220               saldta( mi0(ii0):mi1(ii1), mj0(ij0):mj1(ij1) , : , : ) =   &
221                  &                                    saldta( mi0(il0):mi1(il1) , mj0(ij0):mj1(ij1) , : , : )
222               il0 = 138   ;   il1 = 138   
223               ij0 = 101   ;   ij1 = 102
224               ii0 = 139   ;   ii1 = 139   
225               DO jl = mi0(il0), mi1(il1)                ! New salinity profile at Gibraltar
226                  DO jj = mj0(ij0), mj1(ij1)
227                     DO ji = mi0(ii0), mi1(ii1)
228                        saldta(ji,jj,:,:) = saldta(jl,jj,:,:)
229                     END DO
230                  END DO
231               END DO
232
233               il0 = 164   ;   il1 = 164   
234               ij0 =  88   ;   ij1 =  88
235               ii0 = 161   ;   ii1 = 163   
236               DO jl = mi0(il0), mi1(il1)                ! New salinity profile at Bab el Mandeb
237                  DO jj = mj0(ij0), mj1(ij1)
238                     DO ji = mi0(ii0), mi1(ii1)
239                        saldta(ji,jj,:,:) = saldta(jl,jj,:,:)
240                     END DO
241                  END DO
242                  ij0 =  87   ;   ij1 =  87
243                  DO jj = mj0(ij0), mj1(ij1)
244                     DO ji = mi0(ii0), mi1(ii1)
245                        saldta(ji,jj,:,:) = saldta(jl,jj,:,:)
246                     END DO
247                  END DO
248               END DO
249
250            ENDIF
251
252         ENDIF
253#endif
254         
255         !                                     ! Mask
256         DO jl = 1, 2
257            saldta(:,:,:,jl) = saldta(:,:,:,jl)*tmask(:,:,:)
258            saldta(:,:,jpk,jl) = 0.
259            IF( lk_zps ) THEN                   ! z-coord. partial steps
260               DO jj = 1, jpj                           ! interpolation of salinity at the last ocean level (i.e. the partial step)
261                  DO ji = 1, jpi
262                     ik = mbathy(ji,jj) - 1
263                     IF( ik > 2 ) THEN
264                        zl = ( gdept(ik) - fsdept(ji,jj,ik) ) / ( gdept(ik) - gdept(ik-1) )
265                        saldta(ji,jj,ik,jl) = (1.-zl) * saldta(ji,jj,ik,jl) +zl * saldta(ji,jj,ik-1,jl) 
266                     ENDIF
267                  END DO
268               END DO
269            ENDIF
270         END DO
271         
272
273         IF(lwp) THEN
274            WRITE(numout,*)' salinity Levitus month ',nsal1,nsal2
275            WRITE(numout,*)
276            WRITE(numout,*) ' Levitus month = ',nsal1,'  level = 1'
277            CALL prihre(saldta(:,:,1,1),jpi,jpj,1,jpi,20,1,jpj,20,1.,numout)
278            WRITE(numout,*) ' Levitus month = ',nsal1,'  level = ',jpk/2
279            CALL prihre(saldta(:,:,jpk/2,1),jpi,jpj,1,jpi,20,1,jpj,20,1.,numout)
280            WRITE(numout,*) ' Levitus month = ',nsal1,'  level = ',jpkm1
281            CALL prihre(saldta(:,:,jpkm1,1),jpi,jpj,1,jpi,20,1,jpj,20,1.,numout)
282         ENDIF
283      ENDIF
284     
285 
286      ! 3. At every time step compute salinity data
287      ! -------------------------------------------
288
289      zxy = FLOAT(nday + 15 - 30*i15)/30.
290      s_dta(:,:,:) = ( 1.- zxy ) * saldta(:,:,:,1) + zxy * saldta(:,:,:,2)
291
292   END SUBROUTINE dta_sal
293
294#else
295   !!----------------------------------------------------------------------
296   !!   Default option:                                    NO salinity data
297   !!----------------------------------------------------------------------
298   LOGICAL , PUBLIC, PARAMETER ::   lk_dtasal = .FALSE.   !: salinity data flag
299CONTAINS
300   SUBROUTINE dta_sal( kt )        ! Empty routine
301      WRITE(*,*) 'dta_sal: You should not have seen this print! error?', kt
302   END SUBROUTINE dta_sal
303#endif
304   !!======================================================================
305END MODULE dtasal
Note: See TracBrowser for help on using the repository browser.