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.
tradmp.F90 in branches/DEV_r2106_LOCEAN2010/NEMO/OPA_SRC/TRA – NEMO

source: branches/DEV_r2106_LOCEAN2010/NEMO/OPA_SRC/TRA/tradmp.F90 @ 2224

Last change on this file since 2224 was 2104, checked in by cetlod, 14 years ago

update DEV_r2006_merge_TRA_TRC according to review

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 35.0 KB
Line 
1MODULE tradmp
2   !!======================================================================
3   !!                       ***  MODULE  tradmp  ***
4   !! Ocean physics: internal restoring trend on active tracers (T and S)
5   !!======================================================================
6   !! History :  OPA  ! 1991-03  (O. Marti, G. Madec)  Original code
7   !!                 ! 1992-06  (M. Imbard)  doctor norme
8   !!                 ! 1996-01  (G. Madec)  statement function for e3
9   !!                 ! 1997-05  (G. Madec)  macro-tasked on jk-slab
10   !!                 ! 1998-07  (M. Imbard, G. Madec) ORCA version
11   !!            7.0  ! 2001-02  (M. Imbard)  cofdis, Original code
12   !!            8.1  ! 2001-02  (G. Madec, E. Durand)  cleaning
13   !!  NEMO      1.0  ! 2002-08  (G. Madec, E. Durand)  free form + modules
14   !!            3.2  ! 2009-08  (G. Madec, C. Talandier)  DOCTOR norm for namelist parameter
15   !!            3.3  ! 2010-06  (C. Ethe, G. Madec) merge TRA-TRC
16   !!----------------------------------------------------------------------
17#if   defined key_tradmp   ||   defined key_esopa
18   !!----------------------------------------------------------------------
19   !!   key_tradmp                                         internal damping
20   !!----------------------------------------------------------------------
21   !!   tra_dmp      : update the tracer trend with the internal damping
22   !!   tra_dmp_init : initialization, namlist read, parameters control
23   !!   dtacof_zoom  : restoring coefficient for zoom domain
24   !!   dtacof       : restoring coefficient for global domain
25   !!   cofdis       : compute the distance to the coastline
26   !!----------------------------------------------------------------------
27   USE oce             ! ocean dynamics and tracers variables
28   USE dom_oce         ! ocean space and time domain variables
29   USE trdmod_oce         ! ocean space and time domain variables
30   USE trdtra         ! ocean space and time domain variables
31   USE zdf_oce         ! ocean vertical physics
32   USE phycst          ! Define parameters for the routines
33   USE dtatem          ! temperature data
34   USE dtasal          ! salinity data
35   USE zdfmxl          ! mixed layer depth
36   USE in_out_manager  ! I/O manager
37   USE lib_mpp         ! distribued memory computing
38   USE prtctl          ! Print control
39
40   IMPLICIT NONE
41   PRIVATE
42
43   PUBLIC   tra_dmp      ! routine called by step.F90
44   PUBLIC   tra_dmp_init ! routine called by opa.F90
45   PUBLIC   dtacof       ! routine called by tradmp.F90 and trcdmp.F90
46   PUBLIC   dtacof_zoom  ! routine called by tradmp.F90 and trcdmp.F90
47
48#if ! defined key_agrif
49   LOGICAL, PUBLIC, PARAMETER ::   lk_tradmp = .TRUE.     !: internal damping flag
50#else
51   LOGICAL, PUBLIC            ::   lk_tradmp = .TRUE.     !: internal damping flag
52#endif
53   REAL(wp), PUBLIC, DIMENSION(jpi,jpj,jpk) ::   resto    !: restoring coeff. on T and S (s-1)
54   
55   !                             !!* Namelist namtra_dmp : T & S newtonian damping *
56   INTEGER  ::   nn_hdmp =   -1   ! = 0/-1/'latitude' for damping over T and S
57   INTEGER  ::   nn_zdmp =    0   ! = 0/1/2 flag for damping in the mixed layer
58   REAL(wp) ::   rn_surf =   50.  ! surface time scale for internal damping        [days]
59   REAL(wp) ::   rn_bot  =  360.  ! bottom time scale for internal damping         [days]
60   REAL(wp) ::   rn_dep  =  800.  ! depth of transition between rn_surf and rn_bot [meters]
61   INTEGER  ::   nn_file =    2   ! = 1 create a damping.coeff NetCDF file
62
63   !! * Substitutions
64#  include "domzgr_substitute.h90"
65#  include "vectopt_loop_substitute.h90"
66   !!----------------------------------------------------------------------
67   !! NEMO/OPA 3.2 , LOCEAN-IPSL (2009)
68   !! $Id$
69   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt)
70   !!----------------------------------------------------------------------
71
72CONTAINS
73
74   SUBROUTINE tra_dmp( kt )
75      !!----------------------------------------------------------------------
76      !!                   ***  ROUTINE tra_dmp  ***
77      !!                 
78      !! ** Purpose :   Compute the tracer trend due to a newtonian damping
79      !!      of the tracer field towards given data field and add it to the
80      !!      general tracer trends.
81      !!
82      !! ** Method  :   Newtonian damping towards t_dta and s_dta computed
83      !!      and add to the general tracer trends:
84      !!                     ta = ta + resto * (t_dta - tb)
85      !!                     sa = sa + resto * (s_dta - sb)
86      !!         The trend is computed either throughout the water column
87      !!      (nlmdmp=0) or in area of weak vertical mixing (nlmdmp=1) or
88      !!      below the well mixed layer (nlmdmp=2)
89      !!
90      !! ** Action  : - (ta,sa)   tracer trends updated with the damping trend
91      !!----------------------------------------------------------------------
92      INTEGER, INTENT(in) ::   kt   ! ocean time-step index
93      !!
94      INTEGER ::   ji, jj, jk   ! dummy loop indices
95      REAL(wp) ::  zta, zsa
96      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::  ztrdt, ztrds
97      !!----------------------------------------------------------------------
98
99      IF( l_trdtra )   THEN                    !* Save ta and sa trends
100         ALLOCATE( ztrdt(jpi,jpj,jpk) )   ;    ztrdt(:,:,:) = tsa(:,:,:,jp_tem)
101         ALLOCATE( ztrds(jpi,jpj,jpk) )   ;    ztrds(:,:,:) = tsa(:,:,:,jp_sal)
102      ENDIF
103
104      SELECT CASE ( nn_zdmp ) 
105      !
106      CASE( 0 )                   !==  newtonian damping throughout the water column  ==!
107         DO jk = 1, jpkm1
108            DO jj = 2, jpjm1
109               DO ji = fs_2, fs_jpim1   ! vector opt.
110                  zta = resto(ji,jj,jk) * ( t_dta(ji,jj,jk) - tsb(ji,jj,jk,jp_tem) )
111                  zsa = resto(ji,jj,jk) * ( s_dta(ji,jj,jk) - tsb(ji,jj,jk,jp_sal) )
112                  tsa(ji,jj,jk,jp_tem) = tsa(ji,jj,jk,jp_tem) + zta
113                  tsa(ji,jj,jk,jp_sal) = tsa(ji,jj,jk,jp_sal) + zsa
114               END DO
115            END DO
116         END DO
117         !
118      CASE ( 1 )                  !==  no damping in the turbocline (avt > 5 cm2/s)  ==!
119         DO jk = 1, jpkm1
120            DO jj = 2, jpjm1
121               DO ji = fs_2, fs_jpim1   ! vector opt.
122                  IF( avt(ji,jj,jk) <= 5.e-4 ) THEN
123                     zta = resto(ji,jj,jk) * ( t_dta(ji,jj,jk) - tsb(ji,jj,jk,jp_tem) )
124                     zsa = resto(ji,jj,jk) * ( s_dta(ji,jj,jk) - tsb(ji,jj,jk,jp_sal) )
125                     tsa(ji,jj,jk,jp_tem) = tsa(ji,jj,jk,jp_tem) + zta
126                     tsa(ji,jj,jk,jp_sal) = tsa(ji,jj,jk,jp_sal) + zsa
127                  ENDIF
128               END DO
129            END DO
130         END DO
131         !
132      CASE ( 2 )                  !==  no damping in the mixed layer   ==!
133         DO jk = 1, jpkm1
134            DO jj = 2, jpjm1
135               DO ji = fs_2, fs_jpim1   ! vector opt.
136                  IF( fsdept(ji,jj,jk) >= hmlp (ji,jj) ) THEN
137                     zta = resto(ji,jj,jk) * ( t_dta(ji,jj,jk) - tsb(ji,jj,jk,jp_tem) )
138                     zsa = resto(ji,jj,jk) * ( s_dta(ji,jj,jk) - tsb(ji,jj,jk,jp_sal) )
139                     tsa(ji,jj,jk,jp_tem) = tsa(ji,jj,jk,jp_tem) + zta
140                     tsa(ji,jj,jk,jp_sal) = tsa(ji,jj,jk,jp_sal) + zsa
141                  ENDIF
142               END DO
143            END DO
144         END DO
145         !
146      END SELECT
147
148      IF( l_trdtra )   THEN       ! trend diagnostic
149         ztrdt(:,:,:) = tsa(:,:,:,jp_tem) - ztrdt(:,:,:)
150         ztrds(:,:,:) = tsa(:,:,:,jp_sal) - ztrds(:,:,:)
151         CALL trd_tra( kt, 'TRA', jp_tem, jptra_trd_dmp, ztrdt )
152         CALL trd_tra( kt, 'TRA', jp_sal, jptra_trd_dmp, ztrds )
153         DEALLOCATE( ztrdt )      ;     DEALLOCATE( ztrds )
154      ENDIF
155      !                           ! Control print
156      IF(ln_ctl)   CALL prt_ctl( tab3d_1=tsa(:,:,:,jp_tem), clinfo1=' dmp  - Ta: ', mask1=tmask,   &
157         &                       tab3d_2=tsa(:,:,:,jp_sal), clinfo2=       ' Sa: ', mask2=tmask, clinfo3='tra' )
158      !
159   END SUBROUTINE tra_dmp
160
161
162   SUBROUTINE tra_dmp_init
163      !!----------------------------------------------------------------------
164      !!                  ***  ROUTINE tra_dmp_init  ***
165      !!
166      !! ** Purpose :   Initialization for the newtonian damping
167      !!
168      !! ** Method  :   read the nammbf namelist and check the parameters
169      !!----------------------------------------------------------------------
170      NAMELIST/namtra_dmp/ nn_hdmp, nn_zdmp, rn_surf, rn_bot, rn_dep, nn_file
171      !!----------------------------------------------------------------------
172
173      REWIND ( numnam )                  ! Read Namelist namtra_dmp : temperature and salinity damping term
174      READ   ( numnam, namtra_dmp )
175      IF( lzoom )   nn_zdmp = 0           ! restoring to climatology at closed north or south boundaries
176
177      IF(lwp) THEN                       ! Namelist print
178         WRITE(numout,*)
179         WRITE(numout,*) 'tra_dmp : T and S newtonian damping'
180         WRITE(numout,*) '~~~~~~~'
181         WRITE(numout,*) '   Namelist namtra_dmp : set damping parameter'
182         WRITE(numout,*) '      T and S damping option         nn_hdmp = ', nn_hdmp
183         WRITE(numout,*) '      mixed layer damping option     nn_zdmp = ', nn_zdmp, '(zoom: forced to 0)'
184         WRITE(numout,*) '      surface time scale (days)      rn_surf = ', rn_surf
185         WRITE(numout,*) '      bottom time scale (days)       rn_bot  = ', rn_bot
186         WRITE(numout,*) '      depth of transition (meters)   rn_dep  = ', rn_dep
187         WRITE(numout,*) '      create a damping.coeff file    nn_file = ', nn_file
188      ENDIF
189
190      SELECT CASE ( nn_hdmp )
191      CASE (  -1  )   ;   IF(lwp) WRITE(numout,*) '   tracer damping in the Med & Red seas only'
192      CASE ( 1:90 )   ;   IF(lwp) WRITE(numout,*) '   tracer damping poleward of', nn_hdmp, ' degrees'
193      CASE DEFAULT
194         WRITE(ctmp1,*) '          bad flag value for nn_hdmp = ', nn_hdmp
195         CALL ctl_stop(ctmp1)
196      END SELECT
197
198      SELECT CASE ( nn_zdmp )
199      CASE ( 0 )   ;   IF(lwp) WRITE(numout,*) '   tracer damping throughout the water column'
200      CASE ( 1 )   ;   IF(lwp) WRITE(numout,*) '   no tracer damping in the turbocline (avt > 5 cm2/s)'
201      CASE ( 2 )   ;   IF(lwp) WRITE(numout,*) '   no tracer damping in the mixed layer'
202      CASE DEFAULT
203         WRITE(ctmp1,*) 'bad flag value for nn_zdmp = ', nn_zdmp
204         CALL ctl_stop(ctmp1)
205      END SELECT
206
207      IF( .NOT.lk_dtasal .OR. .NOT.lk_dtatem )   &
208         &   CALL ctl_stop( 'no temperature and/or salinity data define key_dtatem and key_dtasal' )
209
210      !                          ! Damping coefficients initialization
211      IF( lzoom ) THEN   ;   CALL dtacof_zoom( resto )
212      ELSE               ;   CALL dtacof( nn_hdmp, rn_surf, rn_bot, rn_dep,  &
213                             &            nn_file, 'TRA'  , resto            )
214      ENDIF
215      !
216   END SUBROUTINE tra_dmp_init
217
218
219   SUBROUTINE dtacof_zoom( presto )
220      !!----------------------------------------------------------------------
221      !!                  ***  ROUTINE dtacof_zoom  ***
222      !!
223      !! ** Purpose :   Compute the damping coefficient for zoom domain
224      !!
225      !! ** Method  : - set along closed boundary due to zoom a damping over
226      !!                6 points with a max time scale of 5 days.
227      !!              - ORCA arctic/antarctic zoom: set the damping along
228      !!                south/north boundary over a latitude strip.
229      !!
230      !! ** Action  : - resto, the damping coeff. for T and S
231      !!----------------------------------------------------------------------
232      !! * Arguments
233      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout)  ::  presto     !: restoring coeff. (s-1)
234      !
235      INTEGER  ::   ji, jj, jk, jn              ! dummy loop indices
236      REAL(wp) ::   zlat, zlat0, zlat1, zlat2   ! temporary scalar
237      REAL(wp), DIMENSION(6)  ::   zfact        ! temporary workspace
238      !!----------------------------------------------------------------------
239
240      zfact(1) =  1.
241      zfact(2) =  1. 
242      zfact(3) = 11./12.
243      zfact(4) =  8./12.
244      zfact(5) =  4./12.
245      zfact(6) =  1./12.
246      zfact(:) = zfact(:) / ( 5. * rday )    ! 5 days max restoring time scale
247
248      presto(:,:,:) = 0.e0
249
250      ! damping along the forced closed boundary over 6 grid-points
251      DO jn = 1, 6
252         IF( lzoom_w )   presto( mi0(jn+jpizoom):mi1(jn+jpizoom), : , : )                    = zfact(jn)   ! west  closed
253         IF( lzoom_s )   presto( : , mj0(jn+jpjzoom):mj1(jn+jpjzoom), : )                    = zfact(jn)   ! south closed
254         IF( lzoom_e )   presto( mi0(jpiglo+jpizoom-1-jn):mi1(jpiglo+jpizoom-1-jn) , : , : ) = zfact(jn)   ! east  closed
255         IF( lzoom_n )   presto( : , mj0(jpjglo+jpjzoom-1-jn):mj1(jpjglo+jpjzoom-1-jn) , : ) = zfact(jn)   ! north closed
256      END DO
257
258      !                                           ! ====================================================
259      IF( lzoom_arct .AND. lzoom_anta ) THEN      !  ORCA configuration : arctic zoom or antarctic zoom
260         !                                        ! ====================================================
261         IF(lwp) WRITE(numout,*)
262         IF(lwp .AND. lzoom_arct ) WRITE(numout,*) '              dtacof_zoom : ORCA    Arctic zoom'
263         IF(lwp .AND. lzoom_arct ) WRITE(numout,*) '              dtacof_zoom : ORCA Antarctic zoom'
264         IF(lwp) WRITE(numout,*)
265         !
266         !                          ! Initialization :
267         presto(:,:,:) = 0.e0
268         zlat0 = 10.                     ! zlat0 : latitude strip where resto decreases
269         zlat1 = 30.                     ! zlat1 : resto = 1 before zlat1
270         zlat2 = zlat1 + zlat0           ! zlat2 : resto decreases from 1 to 0 between zlat1 and zlat2
271
272         DO jk = 2, jpkm1           ! Compute arrays resto ; value for internal damping : 5 days
273            DO jj = 1, jpj
274               DO ji = 1, jpi
275                  zlat = ABS( gphit(ji,jj) )
276                  IF( zlat1 <= zlat .AND. zlat <= zlat2 ) THEN
277                     presto(ji,jj,jk) = 0.5 * ( 1./(5.*rday) ) * ( 1. - cos(rpi*(zlat2-zlat)/zlat0) ) 
278                  ELSEIF( zlat < zlat1 ) THEN
279                     presto(ji,jj,jk) = 1./(5.*rday)
280                  ENDIF
281               END DO
282            END DO
283         END DO
284         !
285      ENDIF
286      !                             ! Mask resto array
287      presto(:,:,:) = presto(:,:,:) * tmask(:,:,:)
288      !
289   END SUBROUTINE dtacof_zoom
290
291
292   SUBROUTINE dtacof( kn_hdmp, pn_surf, pn_bot, pn_dep,  &
293      &               kn_file, cdtype , presto           )
294      !!----------------------------------------------------------------------
295      !!                  ***  ROUTINE dtacof  ***
296      !!
297      !! ** Purpose :   Compute the damping coefficient
298      !!
299      !! ** Method  :   Arrays defining the damping are computed for each grid
300      !!                point for temperature and salinity (resto)
301      !!                Damping depends on distance to coast, depth and latitude
302      !!
303      !! ** Action  : - resto, the damping coeff. for T and S
304      !!----------------------------------------------------------------------
305      USE iom
306      USE ioipsl
307      !! * Arguments
308      INTEGER                         , INTENT(in   )  ::  kn_hdmp    !: damping option
309      REAL(wp)                        , INTENT(in   )  ::  pn_surf    !: surface time scale (days)
310      REAL(wp)                        , INTENT(in   )  ::  pn_bot     !: bottom time scale (days)
311      REAL(wp)                        , INTENT(in   )  ::  pn_dep     !: depth of transition (meters)
312      INTEGER                         , INTENT(in   )  ::  kn_file    !: save the damping coef on a file or not
313      CHARACTER(len=3)                , INTENT(in   )  ::  cdtype     ! =TRA or TRC (tracer indicator)
314      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout)  ::  presto     !: restoring coeff. (s-1)
315      !
316      INTEGER ::   ji, jj, jk                   ! dummy loop indices
317      INTEGER ::   ii0, ii1, ij0, ij1           !    -          -
318      INTEGER ::   inum0                        ! logical unit for file restoring damping term
319      INTEGER ::   icot                         ! logical unit for file distance to the coast
320      REAL(wp) ::   zinfl, zlon                 ! temporary scalars
321      REAL(wp) ::   zlat, zlat0, zlat1, zlat2   !    -         -
322      REAL(wp) ::   zsdmp, zbdmp                !    -         -
323      REAL(wp), DIMENSION(jpk)         ::   zhfac
324      REAL(wp), DIMENSION(jpi,jpj)     ::   zmrs
325      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zdct
326      CHARACTER(len=20)                ::   cfile
327      !!----------------------------------------------------------------------
328
329      ! ====================================
330      !  ORCA configuration : global domain
331      ! ====================================
332
333      IF(lwp) WRITE(numout,*)
334      IF(lwp) WRITE(numout,*) '              dtacof : Global domain of ORCA'
335      IF(lwp) WRITE(numout,*) '              ------------------------------'
336
337      ! ... Initialization :
338      presto(:,:,:) = 0.e0
339      !
340      IF( kn_hdmp > 0 ) THEN      !  Damping poleward of 'nn_hdmp' degrees  !
341         !                        !-----------------------------------------!
342         IF(lwp) WRITE(numout,*)
343         IF(lwp) WRITE(numout,*) '              Damping poleward of ', kn_hdmp,' deg.'
344         !
345         CALL iom_open ( 'dist.coast.nc', icot, ldstop = .FALSE. )
346         !
347         IF( icot > 0 ) THEN          ! distance-to-coast read in file
348            CALL iom_get  ( icot, jpdom_data, 'Tcoast', zdct )
349            CALL iom_close( icot )
350         ELSE                         ! distance-to-coast computed and saved in file (output in zdct)
351            CALL cofdis( zdct )
352         ENDIF
353
354         !                            ! Compute arrays resto
355         zinfl = 1000.e3                   ! distance of influence for damping term
356         zlat0 = 10.                       ! latitude strip where resto decreases
357         zlat1 = REAL( kn_hdmp )           ! resto = 0 between -zlat1 and zlat1
358         zlat2 = zlat1 + zlat0             ! resto increases from 0 to 1 between |zlat1| and |zlat2|
359
360         DO jj = 1, jpj
361            DO ji = 1, jpi
362               zlat = ABS( gphit(ji,jj) )
363               IF ( zlat1 <= zlat .AND. zlat <= zlat2 ) THEN
364                  presto(ji,jj,1) = 0.5 * ( 1. - cos(rpi*(zlat-zlat1)/zlat0 ) )
365               ELSEIF ( zlat > zlat2 ) THEN
366                  presto(ji,jj,1) = 1.
367               ENDIF
368            END DO
369         END DO
370
371         IF ( kn_hdmp == 20 ) THEN       ! North Indian ocean (20N/30N x 45E/100E) : resto=0
372            DO jj = 1, jpj
373               DO ji = 1, jpi
374                  zlat = gphit(ji,jj)
375                  zlon = MOD( glamt(ji,jj), 360. )
376                  IF ( zlat1 < zlat .AND. zlat < zlat2 .AND. 45. < zlon .AND. zlon < 100. ) THEN
377                     presto(ji,jj,1) = 0.e0
378                  ENDIF
379               END DO
380            END DO
381         ENDIF
382
383         zsdmp = 1./(pn_surf * rday)
384         zbdmp = 1./(pn_bot  * rday)
385         DO jk = 2, jpkm1
386            DO jj = 1, jpj
387               DO ji = 1, jpi
388                  zdct(ji,jj,jk) = MIN( zinfl, zdct(ji,jj,jk) )
389                  !   ... Decrease the value in the vicinity of the coast
390                  presto(ji,jj,jk) = presto(ji,jj,1) * 0.5 * ( 1. - COS( rpi*zdct(ji,jj,jk)/zinfl) )
391                  !   ... Vertical variation from zsdmp (sea surface) to zbdmp (bottom)
392                  presto(ji,jj,jk) = presto(ji,jj,jk)      * ( zbdmp + (zsdmp-zbdmp)*EXP(-fsdept(ji,jj,jk)/pn_dep) )
393               END DO
394            END DO
395         END DO
396         !
397      ENDIF
398
399
400      IF( cp_cfg == "orca" .AND. ( kn_hdmp > 0 .OR. kn_hdmp == -1 ) ) THEN
401
402         !                                         ! =========================
403         !                                         !  Med and Red Sea damping
404         !                                         ! =========================
405         IF(lwp)WRITE(numout,*)
406         IF(lwp)WRITE(numout,*) '              ORCA configuration: Damping in Med and Red Seas'
407
408
409         zmrs(:,:) = 0.e0                             ! damping term on the Med or Red Sea
410
411         SELECT CASE ( jp_cfg )
412         !                                           ! =======================
413         CASE ( 4 )                                  !  ORCA_R4 configuration
414            !                                        ! =======================
415            ! Mediterranean Sea
416            ij0 =  50   ;   ij1 =  56
417            ii0 =  81   ;   ii1 =  91   ;   zmrs( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) = 1.e0
418            ij0 =  50   ;   ij1 =  55
419            ii0 =  75   ;   ii1 =  80   ;   zmrs( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) = 1.e0
420            ij0 =  52   ;   ij1 =  53
421            ii0 =  70   ;   ii1 =  74   ;   zmrs( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) = 1.e0
422            ! Smooth transition from 0 at surface to 1./rday at the 18th level in Med and Red Sea
423            DO jk = 1, 17
424               zhfac (jk) = 0.5*( 1.- COS( rpi*(jk-1)/16. ) ) / rday
425            END DO
426            DO jk = 18, jpkm1
427               zhfac (jk) = 1./rday
428            END DO
429            !                                        ! =======================
430         CASE ( 2 )                                  !  ORCA_R2 configuration
431            !                                        ! =======================
432            ! Mediterranean Sea
433            ij0 =  96   ;   ij1 = 110
434            ii0 = 157   ;   ii1 = 181   ;   zmrs( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) = 1.e0
435            ij0 = 100   ;   ij1 = 110
436            ii0 = 144   ;   ii1 = 156   ;   zmrs( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) = 1.e0
437            ij0 = 100   ;   ij1 = 103
438            ii0 = 139   ;   ii1 = 143   ;   zmrs( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) = 1.e0
439            ! Decrease before Gibraltar Strait
440            ij0 = 101   ;   ij1 = 102
441            ii0 = 139   ;   ii1 = 141   ;   zmrs( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) = 0.e0
442            ii0 = 142   ;   ii1 = 142   ;   zmrs( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) = 1.e0 / 90.e0
443            ii0 = 143   ;   ii1 = 143   ;   zmrs( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) = 0.40e0
444            ii0 = 144   ;   ii1 = 144   ;   zmrs( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) = 0.75e0
445            ! Red Sea
446            ij0 =  87   ;   ij1 =  96
447            ii0 = 147   ;   ii1 = 163   ;   zmrs( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) = 1.e0
448            ! Decrease before Bab el Mandeb Strait
449            ij0 =  91   ;   ij1 =  91
450            ii0 = 153   ;   ii1 = 160   ;   zmrs( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) = 0.80e0
451            ij0 =  90   ;   ij1 =  90
452            ii0 = 153   ;   ii1 = 160   ;   zmrs( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) = 0.40e0
453            ij0 =  89   ;   ij1 =  89
454            ii0 = 158   ;   ii1 = 160   ;   zmrs( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) = 1.e0 / 90.e0
455            ij0 =  88   ;   ij1 =  88
456            ii0 = 160   ;   ii1 = 163   ;   zmrs( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) = 0.e0
457            ! Smooth transition from 0 at surface to 1./rday at the 18th level in Med and Red Sea
458            DO jk = 1, 17
459               zhfac (jk) = 0.5*( 1.- COS( rpi*(jk-1)/16. ) ) / rday
460            END DO
461            DO jk = 18, jpkm1
462               zhfac (jk) = 1./rday
463            END DO
464            !                                        ! =======================
465         CASE ( 05 )                                 !  ORCA_R05 configuration
466            !                                        ! =======================
467            ! Mediterranean Sea
468            ii0 = 568   ;   ii1 = 574 
469            ij0 = 324   ;   ij1 = 333   ;   zmrs( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) = 1.e0
470            ii0 = 575   ;   ii1 = 658
471            ij0 = 314   ;   ij1 = 366   ;   zmrs( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) = 1.e0
472            ! Black Sea (remaining part
473            ii0 = 641   ;   ii1 = 651
474            ij0 = 367   ;   ij1 = 372   ;   zmrs( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) = 1.e0
475            ! Decrease before Gibraltar Strait
476            ij0 = 324   ;   ij1 = 333
477            ii0 = 565   ;   ii1 = 565   ;   zmrs( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) = 1.e0 / 90.e0
478            ii0 = 566   ;   ii1 = 566   ;   zmrs( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) = 0.40
479            ii0 = 567   ;   ii1 = 567   ;   zmrs( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) = 0.75
480            ! Red Sea
481            ii0 = 641   ;   ii1 = 665
482            ij0 = 270   ;   ij1 = 310   ;   zmrs( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) = 1.e0
483            ! Decrease before Bab el Mandeb Strait
484            ii0 = 666   ;   ii1 = 675
485            ij0 = 270   ;   ij1 = 290   
486            DO ji = mi0(ii0), mi1(ii1)
487               zmrs( ji , mj0(ij0):mj1(ij1) ) = 0.1 * ABS( FLOAT(ji - mi1(ii1)) )
488            END DO
489            zsdmp = 1./(pn_surf * rday)
490            zbdmp = 1./(pn_bot  * rday)
491            DO jk = 1, jpk
492               zhfac (jk) = ( zbdmp + (zsdmp-zbdmp) * EXP(-fsdept(1,1,jk)/pn_dep) )
493            END DO
494            !                                       ! ========================
495         CASE ( 025 )                               !  ORCA_R025 configuration
496            !                                       ! ========================
497            CALL ctl_stop( ' Not yet implemented in ORCA_R025' )
498            !
499         END SELECT
500
501         DO jk = 1, jpkm1
502            presto(:,:,jk) = zmrs(:,:) * zhfac(jk) + ( 1. - zmrs(:,:) ) * presto(:,:,jk)
503         END DO
504
505         ! Mask resto array and set to 0 first and last levels
506         presto(:,:, : ) = presto(:,:,:) * tmask(:,:,:)
507         presto(:,:, 1 ) = 0.e0
508         presto(:,:,jpk) = 0.e0
509         !                         !--------------------!
510      ELSE                         !     No damping     !
511         !                         !--------------------!
512         CALL ctl_stop( 'Choose a correct value of nn_hdmp or DO NOT defined key_tradmp' )
513      ENDIF
514
515      !                            !--------------------------------!
516      IF( kn_file == 1 ) THEN      !  save damping coef. in a file  !
517         !                         !--------------------------------!
518         IF(lwp) WRITE(numout,*) '              create damping.coeff.nc file'
519         IF( cdtype == 'TRA' ) cfile = 'damping.coeff'
520         IF( cdtype == 'TRC' ) cfile = 'damping.coeff.trc'
521         cfile = TRIM( cfile )
522         CALL iom_open  ( cfile, inum0, ldwrt = .TRUE., kiolib = jprstlib )
523         CALL iom_rstput( 0, 0, inum0, 'Resto', presto )
524         CALL iom_close ( inum0 )
525      ENDIF
526      !
527   END SUBROUTINE dtacof
528
529
530   SUBROUTINE cofdis( pdct )
531      !!----------------------------------------------------------------------
532      !!                 ***  ROUTINE cofdis  ***
533      !!
534      !! ** Purpose :   Compute the distance between ocean T-points and the
535      !!      ocean model coastlines. Save the distance in a NetCDF file.
536      !!
537      !! ** Method  :   For each model level, the distance-to-coast is
538      !!      computed as follows :
539      !!       - The coastline is defined as the serie of U-,V-,F-points
540      !!      that are at the ocean-land bound.
541      !!       - For each ocean T-point, the distance-to-coast is then
542      !!      computed as the smallest distance (on the sphere) between the
543      !!      T-point and all the coastline points.
544      !!       - For land T-points, the distance-to-coast is set to zero.
545      !!      C A U T I O N : Computation not yet implemented in mpp case.
546      !!
547      !! ** Action  : - pdct, distance to the coastline (argument)
548      !!              - NetCDF file 'dist.coast.nc'
549      !!----------------------------------------------------------------------
550      USE ioipsl      ! IOipsl librairy
551      !!
552      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT( out ) ::   pdct   ! distance to the coastline
553      !!
554      INTEGER ::   ji, jj, jk, jl      ! dummy loop indices
555      INTEGER ::   iju, ijt            ! temporary integers
556      INTEGER ::   icoast, itime
557      INTEGER ::   icot         ! logical unit for file distance to the coast
558      LOGICAL, DIMENSION(jpi,jpj) ::   llcotu, llcotv, llcotf   ! ???
559      CHARACTER (len=32) ::   clname
560      REAL(wp) ::   zdate0
561      REAL(wp), DIMENSION(jpi,jpj)   ::   zxt, zyt, zzt, zmask   ! cartesian coordinates for T-points
562      REAL(wp), DIMENSION(3*jpi*jpj) ::   zxc, zyc, zzc, zdis    ! temporary workspace
563      !!----------------------------------------------------------------------
564
565      ! 0. Initialization
566      ! -----------------
567      IF(lwp) WRITE(numout,*)
568      IF(lwp) WRITE(numout,*) 'cofdis : compute the distance to coastline'
569      IF(lwp) WRITE(numout,*) '~~~~~~'
570      IF(lwp) WRITE(numout,*)
571      IF( lk_mpp ) &
572           & CALL ctl_stop('         Computation not yet implemented with key_mpp_...', &
573           &               '         Rerun the code on another computer or ', &
574           &               '         create the "dist.coast.nc" file using IDL' )
575
576      pdct(:,:,:) = 0.e0
577      zxt(:,:) = cos( rad * gphit(:,:) ) * cos( rad * glamt(:,:) )
578      zyt(:,:) = cos( rad * gphit(:,:) ) * sin( rad * glamt(:,:) )
579      zzt(:,:) = sin( rad * gphit(:,:) )
580
581
582      ! 1. Loop on vertical levels
583      ! --------------------------
584      !                                                ! ===============
585      DO jk = 1, jpkm1                                 ! Horizontal slab
586         !                                             ! ===============
587         ! Define the coastline points (U, V and F)
588         DO jj = 2, jpjm1
589            DO ji = 2, jpim1
590               zmask(ji,jj) =  ( tmask(ji,jj+1,jk) + tmask(ji+1,jj+1,jk) &
591                   &           + tmask(ji,jj  ,jk) + tmask(ji+1,jj  ,jk) )
592               llcotu(ji,jj) = ( tmask(ji,jj,  jk) + tmask(ji+1,jj  ,jk) == 1. ) 
593               llcotv(ji,jj) = ( tmask(ji,jj  ,jk) + tmask(ji  ,jj+1,jk) == 1. ) 
594               llcotf(ji,jj) = ( zmask(ji,jj) > 0. ) .AND. ( zmask(ji,jj) < 4. )
595            END DO
596         END DO
597
598         ! Lateral boundaries conditions
599         llcotu(:, 1 ) = umask(:,  2  ,jk) == 1
600         llcotu(:,jpj) = umask(:,jpjm1,jk) == 1
601         llcotv(:, 1 ) = vmask(:,  2  ,jk) == 1
602         llcotv(:,jpj) = vmask(:,jpjm1,jk) == 1
603         llcotf(:, 1 ) = fmask(:,  2  ,jk) == 1
604         llcotf(:,jpj) = fmask(:,jpjm1,jk) == 1
605
606         IF( nperio == 1 .OR. nperio == 4 .OR. nperio == 6 ) THEN
607            llcotu( 1 ,:) = llcotu(jpim1,:)
608            llcotu(jpi,:) = llcotu(  2  ,:)
609            llcotv( 1 ,:) = llcotv(jpim1,:)
610            llcotv(jpi,:) = llcotv(  2  ,:)
611            llcotf( 1 ,:) = llcotf(jpim1,:)
612            llcotf(jpi,:) = llcotf(  2  ,:)
613         ELSE
614            llcotu( 1 ,:) = umask(  2  ,:,jk) == 1
615            llcotu(jpi,:) = umask(jpim1,:,jk) == 1
616            llcotv( 1 ,:) = vmask(  2  ,:,jk) == 1
617            llcotv(jpi,:) = vmask(jpim1,:,jk) == 1
618            llcotf( 1 ,:) = fmask(  2  ,:,jk) == 1
619            llcotf(jpi,:) = fmask(jpim1,:,jk) == 1
620         ENDIF
621         IF( nperio == 3 .OR. nperio == 4 ) THEN
622            DO ji = 1, jpim1
623               iju = jpi - ji + 1
624               llcotu(ji,jpj  ) = llcotu(iju,jpj-2)
625               llcotf(ji,jpjm1) = llcotf(iju,jpj-2)
626               llcotf(ji,jpj  ) = llcotf(iju,jpj-3)
627            END DO
628            DO ji = jpi/2, jpim1
629               iju = jpi - ji + 1
630               llcotu(ji,jpjm1) = llcotu(iju,jpjm1)
631            END DO
632            DO ji = 2, jpi
633               ijt = jpi - ji + 2
634               llcotv(ji,jpjm1) = llcotv(ijt,jpj-2)
635               llcotv(ji,jpj  ) = llcotv(ijt,jpj-3)
636            END DO
637         ENDIF
638         IF( nperio == 5 .OR. nperio == 6 ) THEN
639            DO ji = 1, jpim1
640               iju = jpi - ji
641               llcotu(ji,jpj  ) = llcotu(iju,jpjm1)
642               llcotf(ji,jpj  ) = llcotf(iju,jpj-2)
643            END DO
644            DO ji = jpi/2, jpim1
645               iju = jpi - ji
646               llcotf(ji,jpjm1) = llcotf(iju,jpjm1)
647            END DO
648            DO ji = 1, jpi
649               ijt = jpi - ji + 1
650               llcotv(ji,jpj  ) = llcotv(ijt,jpjm1)
651            END DO
652            DO ji = jpi/2+1, jpi
653               ijt = jpi - ji + 1
654               llcotv(ji,jpjm1) = llcotv(ijt,jpjm1)
655            END DO
656         ENDIF
657
658         ! Compute cartesian coordinates of coastline points
659         ! and the number of coastline points
660
661         icoast = 0
662         DO jj = 1, jpj
663            DO ji = 1, jpi
664               IF( llcotf(ji,jj) ) THEN
665                  icoast = icoast + 1
666                  zxc(icoast) = COS( rad*gphif(ji,jj) ) * COS( rad*glamf(ji,jj) )
667                  zyc(icoast) = COS( rad*gphif(ji,jj) ) * SIN( rad*glamf(ji,jj) )
668                  zzc(icoast) = SIN( rad*gphif(ji,jj) )
669               ENDIF
670               IF( llcotu(ji,jj) ) THEN
671                  icoast = icoast+1
672                  zxc(icoast) = COS( rad*gphiu(ji,jj) ) * COS( rad*glamu(ji,jj) )
673                  zyc(icoast) = COS( rad*gphiu(ji,jj) ) * SIN( rad*glamu(ji,jj) )
674                  zzc(icoast) = SIN( rad*gphiu(ji,jj) )
675               ENDIF
676               IF( llcotv(ji,jj) ) THEN
677                  icoast = icoast+1
678                  zxc(icoast) = COS( rad*gphiv(ji,jj) ) * COS( rad*glamv(ji,jj) )
679                  zyc(icoast) = COS( rad*gphiv(ji,jj) ) * SIN( rad*glamv(ji,jj) )
680                  zzc(icoast) = SIN( rad*gphiv(ji,jj) )
681               ENDIF
682            END DO
683         END DO
684
685         ! Distance for the T-points
686
687         DO jj = 1, jpj
688            DO ji = 1, jpi
689               IF( tmask(ji,jj,jk) == 0. ) THEN
690                  pdct(ji,jj,jk) = 0.
691               ELSE
692                  DO jl = 1, icoast
693                     zdis(jl) = ( zxt(ji,jj) - zxc(jl) )**2   &
694                        &     + ( zyt(ji,jj) - zyc(jl) )**2   &
695                        &     + ( zzt(ji,jj) - zzc(jl) )**2
696                  END DO
697                  pdct(ji,jj,jk) = ra * SQRT( MINVAL( zdis(1:icoast) ) )
698               ENDIF
699            END DO
700         END DO
701         !                                                ! ===============
702      END DO                                              !   End of slab
703      !                                                   ! ===============
704
705
706      ! 2. Create the  distance to the coast file in NetCDF format
707      ! ----------------------------------------------------------   
708      clname = 'dist.coast'
709      itime = 0
710      CALL ymds2ju( 0     , 1      , 1     , 0.e0 , zdate0 )
711      CALL restini( 'NONE', jpi    , jpj   , glamt, gphit ,   &
712         &          jpk   , gdept_0, clname, itime, zdate0,   &
713         &          rdt   , icot                         )
714      CALL restput( icot, 'Tcoast', jpi, jpj, jpk, 0, pdct )
715      CALL restclo( icot )
716
717   END SUBROUTINE cofdis
718
719#else
720   !!----------------------------------------------------------------------
721   !!   Default key                                     NO internal damping
722   !!----------------------------------------------------------------------
723   LOGICAL , PUBLIC, PARAMETER ::   lk_tradmp = .FALSE.    !: internal damping flag
724CONTAINS
725   SUBROUTINE tra_dmp( kt )        ! Empty routine
726      WRITE(*,*) 'tra_dmp: You should not have seen this print! error?', kt
727   END SUBROUTINE tra_dmp
728   SUBROUTINE tra_dmp_init        ! Empty routine
729   END SUBROUTINE tra_dmp_init
730#endif
731
732   !!======================================================================
733END MODULE tradmp
Note: See TracBrowser for help on using the repository browser.