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_monthly.h90 in trunk/NEMO/OPA_SRC/DTA – NEMO

source: trunk/NEMO/OPA_SRC/DTA/dtasal_monthly.h90 @ 42

Last change on this file since 42 was 3, checked in by opalod, 20 years ago

Initial revision

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 8.6 KB
Line 
1   !!----------------------------------------------------------------------
2   !!                     ***  dtasal_monthly.h90  ***
3   !!----------------------------------------------------------------------
4   !!   OPA 9.0 , LODYC-IPSL  (2003)
5   !!----------------------------------------------------------------------
6
7   SUBROUTINE dta_sal( kt )
8      !!----------------------------------------------------------------------
9      !!                   ***  ROUTINE dta_sal  ***
10      !!       
11      !! ** Purpose :   Reads monthly salinity data
12      !!             
13      !! ** Method  :   Read on unit numsdt the interpolated Levitus salinity onto
14      !!     onto the model grid.
15      !!     Data begin at january.
16      !!     The value is centered at the middle of month.
17      !!     In the opa model, kt=1 agree with january 1.
18      !!     At each time step, a linear interpolation is applied between
19      !!     two monthly values.
20      !!
21      !! History :
22      !!        !  91-03  ()  Original code
23      !!        !  92-07  (M. Imbard)
24      !!   8.5  !  02-06  (G. Madec)  F90: Free form and module
25      !!----------------------------------------------------------------------
26      !! * Modules used
27      USE ioipsl
28
29      !! * Arguments
30      INTEGER, INTENT(in) ::   kt             ! ocean time step
31
32      !! * Local declarations
33      CHARACTER (len=32) ::   clname
34
35      INTEGER, PARAMETER ::   jpmois = 12, jpf = 1
36      INTEGER ::   ji, jj, jk, jl    ! dummy loop indicies
37      INTEGER ::   &
38         imois, iman, ik, i15,  &  ! temporary integers
39         ipi, ipj, ipk, itime      !    "          "
40      INTEGER, DIMENSION(jpmois) ::   istep
41      REAL(wp) ::   &
42         zxy, zl, zdate0
43      REAL(wp), DIMENSION(jpi,jpj) ::   zlon, zlat
44      REAL(wp), DIMENSION(jpk) ::   zlev
45      !!----------------------------------------------------------------------
46
47
48      ! 0. Initialization
49      ! -----------------
50
51      iman  = jpmois
52      i15   = nday / 16
53
54      imois = nmonth + i15 - 1
55      IF( imois == 0 ) imois = iman
56
57      itime = jpmois
58      ipi=jpiglo
59      ipj=jpjglo
60      ipk = jpk
61
62      ! 1. First call kt=nit000
63      ! -----------------------
64
65      IF( kt == nit000 .AND. nlecsa == 0 ) THEN
66         nsal1 = 0
67         IF(lwp) THEN
68            WRITE(numout,*)
69            WRITE(numout,*) ' dta_sal : monthly salinity data in NetCDF file'
70            WRITE(numout,*) ' ~~~~~~~'
71            WRITE(numout,*)
72         ENDIF
73
74         ! open file
75         
76         clname = 'LEVITUS_1m_Salinity_Ice_nomask'
77         CALL flinopen(TRIM(clname),mig(1),nlci,mjg(1),nlcj,.FALSE.   &
78              ,ipi,ipj,ipk,zlon,zlat,zlev,itime,istep,zdate0,rdt,numsdt)
79
80         ! title, dimensions and tests
81
82         IF( itime /= jpmois ) THEN
83            IF(lwp) THEN
84               WRITE(numout,*)
85               WRITE(numout,*) 'problem with time coordinates'
86               WRITE(numout,*) ' itime ',itime,' jpmois ',jpmois
87            ENDIF
88            STOP 'dtasal_monthly.h90'
89         ENDIF
90         IF( ipi /= jpidta .AND. ipj /= jpjdta .AND. ipk /= jpk ) THEN
91            IF(lwp) THEN
92               WRITE(numout,*)
93               WRITE(numout,*) 'problem with dimensions'
94               WRITE(numout,*) ' ipi ',ipi,' jpidta ',jpidta
95               WRITE(numout,*) ' ipj ',ipj,' jpjdta ',jpjdta
96               WRITE(numout,*) ' ipk ',ipk,' jpk ',jpk
97            ENDIF
98            STOP 'dtasal_monthly.h90'
99         ENDIF
100         IF(lwp)WRITE(numout,*) itime,istep,zdate0,rdt,numsdt
101
102      ENDIF
103
104
105      ! 2. Read monthly file
106      ! -------------------
107
108      IF( ( kt == nit000 .AND. nlecsa == 0) .OR. imois /= nsal1 ) THEN
109         nlecsa = 1
110         
111         ! 2.1 Calendar computation
112         
113         nsal1 = imois        ! first file record used
114         nsal2 = nsal1 + 1    ! last  file record used
115         nsal1 = MOD( nsal1, iman )
116         IF( nsal1 == 0 ) nsal1 = iman
117         nsal2 = MOD( nsal2, iman )
118         IF( nsal2 == 0 ) nsal2 = iman
119         IF(lwp) WRITE(numout,*) 'first record file used nsal1 ', nsal1
120         IF(lwp) WRITE(numout,*) 'last  record file used nsal2 ', nsal2
121         
122         ! 2.3 Read monthly salinity data Levitus
123
124         CALL flinget(numsdt,'vosaline',jpidta,jpjdta,jpk,jpmois,nsal1,   &
125           nsal1,mig(1),nlci,mjg(1),nlcj,saldta(1:nlci,1:nlcj,1:jpk,1))
126
127         CALL flinget(numsdt,'vosaline',jpidta,jpjdta,jpk,jpmois,nsal2,   &
128           nsal2,mig(1),nlci,mjg(1),nlcj,saldta(1:nlci,1:nlcj,1:jpk,2))
129
130         
131         IF(lwp) THEN
132            WRITE(numout,*)
133            WRITE(numout,*) ' read Levitus salinity ok'
134            WRITE(numout,*)
135         ENDIF
136         
137#  if defined key_tradmp
138         IF( cp_cfg == "orca"  .AND. jp_cfg == 2 ) THEN
139
140            !                                        ! =======================
141            !                                        !  ORCA_R2 configuration
142            !                                        ! =======================
143         
144            DO jj = mj0(101), mj1(109)                      ! Reduced salinity in the Alboran Sea
145               DO ji = mi0(141), mi1(155)
146                  DO jk = 13, 13
147                     saldta(ji,jj,jk,:) = saldta(ji,jj,jk,:) - 0.15
148                  END DO
149                  DO jk = 14, 15
150                     saldta(ji,jj,jk,:) = saldta(ji,jj,jk,:) - 0.25
151                  END DO
152                  DO jk = 16, 17
153                     saldta(ji,jj,jk,:) = saldta(ji,jj,jk,:) - 0.30
154                  END DO
155                  DO jk = 18, 25
156                     saldta(ji,jj,jk,:) = saldta(ji,jj,jk,:) - 0.35
157                  END DO
158               END DO
159            END DO
160            IF( n_cla == 1 ) THEN
161               !                                         ! New salinity profile at Gibraltar
162               saldta( mi0(139):mi1(139) , mj0(101):mj1(101) , : , : ) =   &
163                  &                                    saldta( mi0(138):mi1(138) , mj0(101):mj1(101) , : , : )
164               saldta( mi0(139):mi1(139) , mj0(102):mj1(102) , : , : ) =   &
165                  &                                    saldta( mi0(138):mi1(138) , mj0(102):mj1(102) , : , : )
166               DO jl = mi0(138), mi1(138)                ! New temperature profile at Gibraltar
167                  DO jj = mj0(101), mj1(102)
168                     DO ji = mi0(139), mi1(139)
169                        saldta(ji,jj,:,:) = saldta(jl,jj,:,:)
170                     END DO
171                  END DO
172               END DO
173
174               DO jl = mi0(164), mi1(164)                ! New salinity profile at Bab el Mandeb
175                  DO jj = mj0(88), mj1(88)
176                     DO ji = mi0(161), mi1(163)
177                        saldta(ji,jj,:,:) = saldta(jl,jj,:,:)
178                     END DO
179                  END DO
180                  DO jj = mj0(87), mj1(87)
181                     DO ji = mi0(161), mi1(163)
182                        saldta(ji,jj,:,:) = saldta(jl,jj,:,:)
183                     END DO
184                  END DO
185               END DO
186
187            ENDIF
188
189         ENDIF
190#endif
191         
192         !                                     ! Mask
193         DO jl = 1, 2
194            saldta(:,:,:,jl) = saldta(:,:,:,jl)*tmask(:,:,:)
195            saldta(:,:,jpk,jl) = 0.
196            IF( lk_zps ) THEN                   ! z-coord. partial steps
197               DO jj = 1, jpj                           ! interpolation of salinity at the last ocean level (i.e. the partial step)
198                  DO ji = 1, jpi
199                     ik = mbathy(ji,jj) - 1
200                     IF( ik > 2 ) THEN
201                        zl = ( gdept(ik) - fsdept(ji,jj,ik) ) / ( gdept(ik) - gdept(ik-1) )
202                        saldta(ji,jj,ik,jl) = (1.-zl) * saldta(ji,jj,ik,jl) +zl * saldta(ji,jj,ik-1,jl)
203                     ENDIF
204                  END DO
205               END DO
206            ENDIF
207         END DO
208         
209
210         IF(lwp) THEN
211            WRITE(numout,*)' salinity Levitus month ',nsal1,nsal2
212            WRITE(numout,*)
213            WRITE(numout,*) ' Levitus mounth = ',nsal1,'  level = 1'
214            CALL prihre(saldta(1,1,1,1),jpi,jpj,1,jpi,20,1,jpj,20,1.,numout)
215            WRITE(numout,*) ' Levitus mounth = ',nsal1,'  level = ',jpk/2
216            CALL prihre(saldta(1,1,jpk/2,1),jpi,jpj,1,jpi,20,1,jpj,20,1.,numout)
217            WRITE(numout,*) ' Levitus mounth = ',nsal1,'  level = ',jpkm1
218            CALL prihre(saldta(1,1,jpkm1,1),jpi,jpj,1,jpi,20,1,jpj,20,1.,numout)
219         ENDIF
220      ENDIF
221     
222 
223      ! 3. At every time step compute salinity data
224      ! -------------------------------------------
225
226      zxy = FLOAT(nday + 15 - 30*i15)/30.
227      sdta(:,:,:)= ( (1.-zxy)*saldta(:,:,:,1) + zxy*saldta(:,:,:,2) )
228
229   END SUBROUTINE dta_sal
Note: See TracBrowser for help on using the repository browser.