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 NEMO/branches/UKMO/NEMO_4.0.4_generic_obs/src/OCE/TRA – NEMO

source: NEMO/branches/UKMO/NEMO_4.0.4_generic_obs/src/OCE/TRA/tradmp.F90 @ 15246

Last change on this file since 15246 was 15246, checked in by dford, 3 years ago

Add option to output T&S climatology.

File size: 11.4 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   !!                 ! 1998-07  (M. Imbard, G. Madec) ORCA version
9   !!            7.0  ! 2001-02  (M. Imbard)  add distance to coast, Original code
10   !!            8.1  ! 2001-02  (G. Madec, E. Durand)  cleaning
11   !!  NEMO      1.0  ! 2002-08  (G. Madec, E. Durand)  free form + modules
12   !!            3.2  ! 2009-08  (G. Madec, C. Talandier)  DOCTOR norm for namelist parameter
13   !!            3.3  ! 2010-06  (C. Ethe, G. Madec) merge TRA-TRC
14   !!            3.4  ! 2011-04  (G. Madec, C. Ethe) Merge of dtatem and dtasal + suppression of CPP keys
15   !!            3.6  ! 2015-06  (T. Graham)  read restoring coefficient in a file
16   !!            3.7  ! 2015-10  (G. Madec)  remove useless trends arrays
17   !!----------------------------------------------------------------------
18
19   !!----------------------------------------------------------------------
20   !!   tra_dmp_alloc : allocate tradmp arrays
21   !!   tra_dmp       : update the tracer trend with the internal damping
22   !!   tra_dmp_init  : initialization, namlist read, parameters control
23   !!----------------------------------------------------------------------
24   USE oce            ! ocean: variables
25   USE dom_oce        ! ocean: domain variables
26   USE c1d            ! 1D vertical configuration
27   USE trd_oce        ! trends: ocean variables
28   USE trdtra         ! trends manager: tracers
29   USE zdf_oce        ! ocean: vertical physics
30   USE phycst         ! physical constants
31   USE dtatsd         ! data: temperature & salinity
32   USE zdfmxl         ! vertical physics: mixed layer depth
33   !
34   USE in_out_manager ! I/O manager
35   USE iom            ! XIOS
36   USE lib_mpp        ! MPP library
37   USE prtctl         ! Print control
38   USE timing         ! Timing
39
40   IMPLICIT NONE
41   PRIVATE
42
43   PUBLIC   tra_dmp        ! called by step.F90
44   PUBLIC   tra_dmp_init   ! called by nemogcm.F90
45
46   !                                           !!* Namelist namtra_dmp : T & S newtonian damping *
47   LOGICAL            , PUBLIC ::   ln_tradmp   !: internal damping flag
48   INTEGER            , PUBLIC ::   nn_zdmp     !: = 0/1/2 flag for damping in the mixed layer
49   CHARACTER(LEN=200) , PUBLIC ::   cn_resto    !: name of netcdf file containing restoration coefficient field
50   !
51   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   resto    !: restoring coeff. on T and S (s-1)
52   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   tclim    !: temperature climatology on each time step(Celcius)
53   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   sclim    !: salinity climatology on each time step (psu)
54
55   !! * Substitutions
56#  include "vectopt_loop_substitute.h90"
57   !!----------------------------------------------------------------------
58   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
59   !! $Id$
60   !! Software governed by the CeCILL license (see ./LICENSE)
61   !!----------------------------------------------------------------------
62CONTAINS
63
64   INTEGER FUNCTION tra_dmp_alloc()
65      !!----------------------------------------------------------------------
66      !!                ***  FUNCTION tra_dmp_alloc  ***
67      !!----------------------------------------------------------------------
68      ALLOCATE( resto(jpi,jpj,jpk), &
69         &      tclim(jpi,jpj,jpk), &
70         &      sclim(jpi,jpj,jpk), STAT= tra_dmp_alloc )
71      !
72      CALL mpp_sum ( 'tradmp', tra_dmp_alloc )
73      IF( tra_dmp_alloc > 0 )   CALL ctl_warn('tra_dmp_alloc: allocation of arrays failed')
74      !
75   END FUNCTION tra_dmp_alloc
76
77
78   SUBROUTINE tra_dmp( kt )
79      !!----------------------------------------------------------------------
80      !!                   ***  ROUTINE tra_dmp  ***
81      !!                 
82      !! ** Purpose :   Compute the tracer trend due to a newtonian damping
83      !!      of the tracer field towards given data field and add it to the
84      !!      general tracer trends.
85      !!
86      !! ** Method  :   Newtonian damping towards t_dta and s_dta computed
87      !!      and add to the general tracer trends:
88      !!                     ta = ta + resto * (t_dta - tb)
89      !!                     sa = sa + resto * (s_dta - sb)
90      !!         The trend is computed either throughout the water column
91      !!      (nlmdmp=0) or in area of weak vertical mixing (nlmdmp=1) or
92      !!      below the well mixed layer (nlmdmp=2)
93      !!
94      !! ** Action  : - tsa: tracer trends updated with the damping trend
95      !!----------------------------------------------------------------------
96      INTEGER, INTENT(in) ::   kt   ! ocean time-step index
97      !
98      INTEGER ::   ji, jj, jk, jn   ! dummy loop indices
99      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts)     ::  zts_dta
100      REAL(wp), DIMENSION(:,:,:,:), ALLOCATABLE ::  ztrdts
101      !!----------------------------------------------------------------------
102      !
103      IF( ln_timing )   CALL timing_start('tra_dmp')
104      !
105      IF( l_trdtra )   THEN                    !* Save ta and sa trends
106         ALLOCATE( ztrdts(jpi,jpj,jpk,jpts) ) 
107         ztrdts(:,:,:,:) = tsa(:,:,:,:) 
108      ENDIF
109      !                           !==  input T-S data at kt  ==!
110      CALL dta_tsd( kt, zts_dta )            ! read and interpolates T-S data at kt
111      !
112      tclim(:,:,:) = zts_dta(:,:,:,jp_tem)
113      sclim(:,:,:) = zts_dta(:,:,:,jp_sal)
114      !
115      SELECT CASE ( nn_zdmp )     !==  type of damping  ==!
116      !
117      CASE( 0 )                        !*  newtonian damping throughout the water column  *!
118         DO jn = 1, jpts
119            DO jk = 1, jpkm1
120               DO jj = 2, jpjm1
121                  DO ji = fs_2, fs_jpim1   ! vector opt.
122                     tsa(ji,jj,jk,jn) = tsa(ji,jj,jk,jn) + resto(ji,jj,jk) * ( zts_dta(ji,jj,jk,jn) - tsb(ji,jj,jk,jn) )
123                  END DO
124               END DO
125            END DO
126         END DO
127         !
128      CASE ( 1 )                       !*  no damping in the turbocline (avt > 5 cm2/s)  *!
129         DO jk = 1, jpkm1
130            DO jj = 2, jpjm1
131               DO ji = fs_2, fs_jpim1   ! vector opt.
132                  IF( avt(ji,jj,jk) <= avt_c ) THEN
133                     tsa(ji,jj,jk,jp_tem) = tsa(ji,jj,jk,jp_tem)   &
134                        &                 + resto(ji,jj,jk) * ( zts_dta(ji,jj,jk,jp_tem) - tsb(ji,jj,jk,jp_tem) )
135                     tsa(ji,jj,jk,jp_sal) = tsa(ji,jj,jk,jp_sal)   &
136                        &                 + resto(ji,jj,jk) * ( zts_dta(ji,jj,jk,jp_sal) - tsb(ji,jj,jk,jp_sal) )
137                  ENDIF
138               END DO
139            END DO
140         END DO
141         !
142      CASE ( 2 )                       !*  no damping in the mixed layer   *!
143         DO jk = 1, jpkm1
144            DO jj = 2, jpjm1
145               DO ji = fs_2, fs_jpim1   ! vector opt.
146                  IF( gdept_n(ji,jj,jk) >= hmlp (ji,jj) ) THEN
147                     tsa(ji,jj,jk,jp_tem) = tsa(ji,jj,jk,jp_tem)   &
148                        &                 + resto(ji,jj,jk) * ( zts_dta(ji,jj,jk,jp_tem) - tsb(ji,jj,jk,jp_tem) )
149                     tsa(ji,jj,jk,jp_sal) = tsa(ji,jj,jk,jp_sal)   &
150                        &                 + resto(ji,jj,jk) * ( zts_dta(ji,jj,jk,jp_sal) - tsb(ji,jj,jk,jp_sal) )
151                  ENDIF
152               END DO
153            END DO
154         END DO
155         !
156      END SELECT
157      !
158      IF( l_trdtra )   THEN       ! trend diagnostic
159         ztrdts(:,:,:,:) = tsa(:,:,:,:) - ztrdts(:,:,:,:)
160         CALL trd_tra( kt, 'TRA', jp_tem, jptra_dmp, ztrdts(:,:,:,jp_tem) )
161         CALL trd_tra( kt, 'TRA', jp_sal, jptra_dmp, ztrdts(:,:,:,jp_sal) )
162         DEALLOCATE( ztrdts ) 
163      ENDIF
164      !                           ! Control print
165      IF(ln_ctl)   CALL prt_ctl( tab3d_1=tsa(:,:,:,jp_tem), clinfo1=' dmp  - Ta: ', mask1=tmask,   &
166         &                       tab3d_2=tsa(:,:,:,jp_sal), clinfo2=       ' Sa: ', mask2=tmask, clinfo3='tra' )
167      !
168      IF( ln_timing )   CALL timing_stop('tra_dmp')
169      !
170   END SUBROUTINE tra_dmp
171
172
173   SUBROUTINE tra_dmp_init
174      !!----------------------------------------------------------------------
175      !!                  ***  ROUTINE tra_dmp_init  ***
176      !!
177      !! ** Purpose :   Initialization for the newtonian damping
178      !!
179      !! ** Method  :   read the namtra_dmp namelist and check the parameters
180      !!----------------------------------------------------------------------
181      INTEGER ::   ios, imask   ! local integers
182      !
183      NAMELIST/namtra_dmp/ ln_tradmp, nn_zdmp, cn_resto
184      !!----------------------------------------------------------------------
185      !
186      REWIND( numnam_ref )   ! Namelist namtra_dmp in reference namelist : T & S relaxation
187      READ  ( numnam_ref, namtra_dmp, IOSTAT = ios, ERR = 901)
188901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namtra_dmp in reference namelist' )
189      !
190      REWIND( numnam_cfg )   ! Namelist namtra_dmp in configuration namelist : T & S relaxation
191      READ  ( numnam_cfg, namtra_dmp, IOSTAT = ios, ERR = 902 )
192902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namtra_dmp in configuration namelist' )
193      IF(lwm) WRITE ( numond, namtra_dmp )
194      !
195      IF(lwp) THEN                  ! Namelist print
196         WRITE(numout,*)
197         WRITE(numout,*) 'tra_dmp_init : T and S newtonian relaxation'
198         WRITE(numout,*) '~~~~~~~~~~~~'
199         WRITE(numout,*) '   Namelist namtra_dmp : set relaxation parameters'
200         WRITE(numout,*) '      Apply relaxation   or not       ln_tradmp   = ', ln_tradmp
201         WRITE(numout,*) '         mixed layer damping option      nn_zdmp  = ', nn_zdmp
202         WRITE(numout,*) '         Damping file name               cn_resto = ', cn_resto
203         WRITE(numout,*)
204      ENDIF
205      !
206      IF( ln_tradmp ) THEN
207         !                          ! Allocate arrays
208         IF( tra_dmp_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'tra_dmp_init: unable to allocate arrays' )
209         !
210         SELECT CASE (nn_zdmp)      ! Check values of nn_zdmp
211         CASE ( 0 )   ;   IF(lwp) WRITE(numout,*) '   tracer damping as specified by mask'
212         CASE ( 1 )   ;   IF(lwp) WRITE(numout,*) '   no tracer damping in the mixing layer (kz > 5 cm2/s)'
213         CASE ( 2 )   ;   IF(lwp) WRITE(numout,*) '   no tracer damping in the mixed  layer'
214         CASE DEFAULT
215            CALL ctl_stop('tra_dmp_init : wrong value of nn_zdmp')
216         END SELECT
217         !
218         !!TG: Initialisation of dtatsd - Would it be better to have dmpdta routine
219         !    so can damp to something other than intitial conditions files?
220         !!gm: In principle yes. Nevertheless, we can't anticipate demands that have never been formulated.
221         IF( .NOT.ln_tsd_dmp ) THEN
222            IF(lwp) WRITE(numout,*)
223            IF(lwp) WRITE(numout, *)  '   read T-S data not initialized, we force ln_tsd_dmp=T'
224            CALL dta_tsd_init( ld_tradmp=ln_tradmp )        ! forces the initialisation of T-S data
225         ENDIF
226         !                          ! Read in mask from file
227         CALL iom_open ( cn_resto, imask)
228         CALL iom_get  ( imask, jpdom_autoglo, 'resto', resto )
229         CALL iom_close( imask )
230      ENDIF
231      !
232   END SUBROUTINE tra_dmp_init
233
234   !!======================================================================
235END MODULE tradmp
Note: See TracBrowser for help on using the repository browser.