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.
trcais.F90 in NEMO/branches/2020/dev_r12740_TOP-01_rlod_Antarctic_ice_Sheet_Fe_Source/src/TOP – NEMO

source: NEMO/branches/2020/dev_r12740_TOP-01_rlod_Antarctic_ice_Sheet_Fe_Source/src/TOP/trcais.F90 @ 13524

Last change on this file since 13524 was 13524, checked in by rlod, 4 years ago

First step of nutrient sources from Antarctic Ice Sheet

File size: 12.3 KB
Line 
1MODULE trcais
2   !!======================================================================
3   !!                         ***  MODULE trcais  ***
4   !!  Module for passive tracers in Antarctic ice sheet
5   !!  delivered by iceberg and ice shelf freshwater fluxes
6   !!======================================================================
7   !! History :  1.0  ! 2020    (R. Person, O. Aumont, C. Ethe),
8   !!======================================================================
9#if defined key_top
10   !!----------------------------------------------------------------------
11   !!   'key_top'                                                TOP model
12   !!----------------------------------------------------------------------
13   !!   trc_ais       : external source of tracers from Antarctic ice sheet
14   !!----------------------------------------------------------------------
15   USE par_trc        !  passive tracers parameters
16   USE oce_trc        !  shared variables between ocean and passive tracers
17   USE trc            !  passive tracers common variables
18   USE iom            !  I/O manager
19   USE lib_mpp        !  MPP library
20   USE sbc_oce        !
21   USE isf_oce        ! ice shelf melting contribution
22   USE sbcrnf         ! iceberg freshwater flux
23   USE trcnam         ! Namelist read
24   USE prtctl_trc     ! Print control
25
26   IMPLICIT NONE
27   PRIVATE
28
29   PUBLIC   trc_ais         ! called in trcstp.F90 or within TOP modules
30   PUBLIC   trc_ais_ini     ! called in trcini.F90
31
32   INTEGER  , SAVE, PUBLIC                              :: nb_trcais    ! number of tracers in AIS
33   REAL(wp) , SAVE, PUBLIC                              :: rn_icbdep    ! mean underwater depth of iceberg (in meters)
34   INTEGER  , SAVE, PUBLIC                              :: icblev       ! mean underwater depth of iceberg (in level depth)
35   INTEGER  , SAVE, PUBLIC, ALLOCATABLE, DIMENSION(:)   :: n_trc_indais ! index of tracer with AIS freswater flux
36   REAL(wp) , SAVE, PUBLIC, ALLOCATABLE, DIMENSION(:)   :: rf_trafac    ! multiplicative factor for AIS tracer values
37
38   !! * Substitutions
39#  include "do_loop_substitute.h90"
40   !!----------------------------------------------------------------------
41   !! NEMO/TOP 4.0 , NEMO Consortium (2018)
42   !! Software governed by the CeCILL license (see ./LICENSE)
43   !!----------------------------------------------------------------------
44CONTAINS
45
46   SUBROUTINE trc_ais_ini
47      !!---------------------------------------------------------------------
48      !!                     ***  ROUTINE trc_ais_ini ***
49      !!
50      !! ** Purpose :   Initialization of passive tracers from the Antartic
51      !!                Ice Sheet delivered by iceberg and ice shelf
52      !!                freshwater flux
53      !!
54      !! ** Method  : - Read namtsd namelist
55      !!             
56      !!---------------------------------------------------------------------
57      INTEGER            :: jl, jn, jk                     ! dummy loop indices
58      INTEGER            :: ierr0, ierr1, ierr2, ierr3     ! temporary integers
59      INTEGER            :: ios                            ! Local integer output status for namelist read
60      REAL(wp)   , DIMENSION(jpmaxtrc) :: rn_trafac    ! multiplicative factor for tracer values
61      !!
62      NAMELIST/namtrc_ais/ nn_ais_tr, rn_trafac, rn_icbdep
63      !!----------------------------------------------------------------------
64      !
65      IF( lwp ) THEN
66         WRITE(numout,*)
67         WRITE(numout,*) 'trc_ais_ini : Antarctic ice sheet tracer initialization'
68         WRITE(numout,*) '~~~~~~~~~~~~'
69      ENDIF
70      !
71      IF (.NOT. ln_rnf_icb) THEN
72         CALL ctl_stop( 'trc_ais_ini: no iceberg freswater flux in runoff file' )   ;  RETURN
73      ENDIF
74      !
75      ! Compute the number of tracers to be initialised in iceberg and ice
76      ! shelf freshwater flux
77      ALLOCATE( n_trc_indais(jptra), STAT=ierr0 )
78      IF( ierr0 > 0 ) THEN
79         CALL ctl_stop( 'trc_ais_ini: unable to allocate n_trc_indais' )   ;  RETURN
80      ENDIF
81      nb_trcais       = 0
82      n_trc_indais(:) = 0
83      !
84      ! Read Antarctic Ice Sheet Namelist
85      READ  ( numnat_ref, namtrc_ais, IOSTAT = ios, ERR = 901)
86901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namtrc_ais in reference namelist' )
87      READ  ( numnat_cfg, namtrc_ais, IOSTAT = ios, ERR = 902 )
88902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namtrc_ais in configuration namelist' )
89      IF(lwm) WRITE ( numont, namtrc_ais )
90      !
91      IF( lwp ) THEN
92         WRITE(numout,*) ' '
93         WRITE(numout,*) '   Namelist : namtrc_ais'
94         WRITE(numout,*) '   Antarctic Ice Sheet tracers option (nn_ais_tr) : ', nn_ais_tr
95      ENDIF
96      ! compose AIS data indexes
97      DO jn = 1, jptra
98         IF( ln_trc_ais(jn) ) THEN
99             nb_trcais       = nb_trcais + 1   ;   n_trc_indais(jn) = nb_trcais
100         ENDIF
101      END DO
102
103      ! Print summmary of Antarctic Ice Sheet tracers supply
104      IF( lwp ) THEN
105         WRITE(numout,*)
106         WRITE(numout,'(a,i3)') '   Total tracers to be initialized with AIS freshwater fluxes:', nb_trcais
107      ENDIF
108      !
109      IF( nb_trcais > 0 ) THEN
110         ALLOCATE( rf_trafac(nb_trcais), STAT=ierr0 )
111         DO jn = 1, jptra
112            IF( ln_trc_ais(jn) ) THEN
113                jl = n_trc_indais(jn)
114                rf_trafac(jl) = rn_trafac(jn)
115                IF(lwp) WRITE(numout, 9001) jn, ctrcnm(jn), 'AIS', rn_trafac(jn), rf_trafac(jl)
116            ENDIF
117         END DO
118      ENDIF
1199001  FORMAT(2x,i5, 8x, a15, 3x, a3, 5x, e11.3, 5x, e11.3)
120
121      !
122      icblev = 1        !  compute last level where depth less than rn_icbdep (120 m)
123         DO jk = jpkm1, 1, -1
124            IF( gdept_1d(jk) > rn_icbdep )   icblev = jk - 1
125         END DO
126         IF(lwp) WRITE(numout,*)
127         IF(lwp) WRITE(numout,*) ' Level corresponding to iceberg depth ',  icblev,' ', gdept_1d(icblev+1)
128      !
129   END SUBROUTINE trc_ais_ini
130
131   SUBROUTINE trc_ais(kt, Kmm, ptr, Krhs)
132      !!----------------------------------------------------------------------
133      !!                   ***  ROUTINE trc_ais  ***
134      !!
135      !! ** Purpose :  Apply Antarctic Ice Sheet inputs to tracers
136      !!
137      !! ** Method  :  Read freswater flux from iceberg and ice shelf
138      !!               and update data
139      !!               
140      !!----------------------------------------------------------------------
141      !!
142      INTEGER                                   , INTENT(in)           ::   kt ! ocean time-step index
143      INTEGER                                   , INTENT(in)           ::   Kmm, Krhs ! time level indices
144      REAL(wp), DIMENSION(jpi,jpj,jpk,jptra,jpt), INTENT(inout)        ::   ptr ! passive tracers and RHS of tracer equation
145      !!
146      INTEGER  :: ji, jj, jk, jn, jl             ! Loop index
147      INTEGER  :: ikt, ikb  ! top and bottom level of the tbl
148      CHARACTER (len=22) :: charout
149      REAL(wp) :: zfact, zcalv, zfrac
150      !!---------------------------------------------------------------------
151      !
152      IF( ln_timing )   CALL timing_start('trc_ais')
153
154      IF( kt == nit000 .AND. lwp) THEN
155         WRITE(numout,*)
156         WRITE(numout,*) 'trc_ais : passive tracers from Antarctic Ice Sheet'
157         WRITE(numout,*) '~~~~~~~ '
158      ENDIF
159
160
161      ! 0. initialization
162      SELECT CASE ( nn_ais_tr )
163
164      CASE ( 0 ) ! No tracers in Antarctic Ice Sheet (null concentration in AIS)
165         !
166         ! Iceberg freshwater dilution for tracers with absent iceberg load
167         IF( ln_rnf_icb ) THEN
168            DO jn = 1, jptra
169               IF( ln_trc_ais(jn) ) THEN
170                  jl = n_trc_indais(jn)
171                  DO_2D_11_11
172                     zfact = 1. / e3t(ji,jj,1,Kmm)
173                     ptr(ji,jj,jk,jn,Krhs) = ptr(ji,jj,1,jn,Krhs) + fwficb(ji,jj) * r1_rho0 * ptr(ji,jj,1,jn,Kmm) * zfact
174                  END_2D
175               END IF
176            END DO   
177         END IF   
178         ! Ice shelf freshwater dilution for tracers with absent ice shelf load
179         IF( ln_isf ) THEN
180            DO jn = 1, jptra
181               IF( ln_trc_ais(jn) ) THEN
182                  jl = n_trc_indais(jn)
183                  DO_2D_11_11
184                     IF( ln_isfpar_mlt ) THEN
185                        zcalv = - fwfisf_par(ji,jj) * r1_rho0 / rhisf_tbl_par(ji,jj)
186                        ikt = misfkt_par(ji,jj)
187                        ikb = misfkb_par(ji,jj)
188                        zfrac = rfrac_tbl_par(ji,jj)
189                     END IF   
190                     IF( ln_isfcav_mlt ) THEN
191                        zcalv = - fwfisf_cav(ji,jj) * r1_rho0 / rhisf_tbl_cav(ji,jj)
192                        ikt = misfkt_cav(ji,jj)
193                        ikb = misfkb_cav(ji,jj)
194                        zfrac = rfrac_tbl_cav(ji,jj)
195                     END IF   
196                     ! level fully include in the ice shelf boundary layer
197                     DO jk = ikt, ikb - 1
198                        ptr(ji,jj,jk,jn,Krhs) = ptr(ji,jj,jk,jn,Krhs) + zcalv * ptr(ji,jj,jk,jn,Kmm)
199                     END DO
200                     ! level partially include in ice shelf boundary layer
201                     ptr(ji,jj,ikb,jn,Krhs) = ptr(ji,jj,ikb,jn,Krhs) +  zcalv * ptr(ji,jj,ikb,jn,Kmm) * zfrac 
202                  END_2D
203               ENDIF   
204            END DO
205         END IF
206         !
207      CASE ( 1 )  ! Specific treatment  with an imposed concentration in AIS
208         !
209         ! source of bgc tracers from iceberg in Southern Ocean
210         ! distributed along the water column until 120 m depth (Person et al., 2019)
211         IF( ln_rnf_icb ) THEN
212            DO jn = 1, jptra
213               IF( ln_trc_ais(jn) ) THEN
214                  jl = n_trc_indais(jn)
215                  DO_2D_11_11
216                     DO jk = 1, icblev
217                        zcalv  =  fwficb(ji,jj) * r1_rho0 
218                        ptr(ji,jj,jk,jn,Krhs) = ptr(ji,jj,jk,jn,Krhs) + rf_trafac(jl) * zcalv / gdepw(ji,jj,icblev+1,Kmm)
219                     END DO   
220                  END_2D
221                END IF 
222            END DO   
223         END IF   
224         ! source of bgc tracers from ice shelf in the Southern Ocean
225         ! with tbl treated as in Mathiot et al. (2017)
226         IF( ln_isf ) THEN
227            DO jn = 1, jptra
228               IF( ln_trc_ais(jn) ) THEN
229                  jl = n_trc_indais(jn)
230                  DO_2D_11_11
231                     IF( ln_isfpar_mlt ) THEN
232                        zcalv = - fwfisf_par(ji,jj) * r1_rho0 / rhisf_tbl_par(ji,jj)
233                        ikt = misfkt_par(ji,jj)
234                        ikb = misfkb_par(ji,jj)
235                        zfrac = rfrac_tbl_par(ji,jj)
236                     END IF
237                     IF( ln_isfcav_mlt ) THEN
238                        zcalv = - fwfisf_cav(ji,jj) * r1_rho0 / rhisf_tbl_cav(ji,jj)
239                        ikt = misfkt_cav(ji,jj)
240                        ikb = misfkb_cav(ji,jj)
241                        zfrac = rfrac_tbl_cav(ji,jj)
242                     END IF
243                     ! level fully include in the ice shelf boundary layer
244                     DO jk = ikt, ikb - 1
245                        ptr(ji,jj,jk,jn,Krhs) = ptr(ji,jj,jk,jn,Krhs) + rf_trafac(jl) * zcalv
246                     END DO
247                     ! level partially include in ice shelf boundary layer
248                     ptr(ji,jj,ikb,jn,Krhs) = ptr(ji,jj,ikb,jn,Krhs) + rf_trafac(jl) * zcalv * zfrac
249                  END_2D
250               ENDIF
251            END DO
252         END IF
253      END SELECT
254      !
255
256      IF( ln_timing )   CALL timing_stop('trc_ais')
257      !
258      ! for debugging
259      IF( sn_cfctl%l_prttrc ) THEN ! print mean trends (used for debugging)
260         WRITE(charout, FMT="('ais ')")
261         CALL prt_ctl_trc_info(charout)
262         CALL prt_ctl_trc( tab4d=ptr(:,:,:,:,Krhs), mask=tmask, clinfo=ctrcnm, clinfo2='trd' )
263      ENDIF
264      !
265   END SUBROUTINE trc_ais
266
267#else
268   !!----------------------------------------------------------------------
269   !!   Dummy module                              NO 3D passive tracer data
270   !!----------------------------------------------------------------------
271CONTAINS
272   SUBROUTINE trc_ais_ini   ! Empty routine
273   END SUBROUTINE trc_ais_ini
274   SUBROUTINE trc_ais( kt, Kmm, Krhs )        ! Empty routine
275      INTEGER, INTENT(in) :: kt, Kmm, Krhs ! time level indices
276      WRITE(*,*) 'trc_ais: You should not have seen this print! error?', kt, Kmm, Krhs
277   END SUBROUTINE trc_ais
278#endif
279
280   !!======================================================================
281END MODULE trcais
Note: See TracBrowser for help on using the repository browser.