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.
trasbc.F90 in NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/TRA – NEMO

source: NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/TRA/trasbc.F90 @ 10946

Last change on this file since 10946 was 10946, checked in by acc, 5 years ago

2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps : Convert STO, TRD and USR modules and all knock on effects of these conversions. Note change to USR module may have implications for the TEST CASES (not tested yet). Standard SETTE tested only

  • Property svn:keywords set to Id
File size: 13.2 KB
RevLine 
[3]1MODULE trasbc
2   !!==============================================================================
3   !!                       ***  MODULE  trasbc  ***
4   !! Ocean active tracers:  surface boundary condition
5   !!==============================================================================
[2528]6   !! History :  OPA  !  1998-10  (G. Madec, G. Roullet, M. Imbard)  Original code
7   !!            8.2  !  2001-02  (D. Ludicone)  sea ice and free surface
8   !!  NEMO      1.0  !  2002-06  (G. Madec)  F90: Free form and module
9   !!            3.3  !  2010-04  (M. Leclair, G. Madec)  Forcing averaged over 2 time steps
10   !!             -   !  2010-09  (C. Ethe, G. Madec) Merge TRA-TRC
[5120]11   !!            3.6  !  2014-11  (P. Mathiot) isf melting forcing
[3]12   !!----------------------------------------------------------------------
[503]13
14   !!----------------------------------------------------------------------
[6140]15   !!   tra_sbc       : update the tracer trend at ocean surface
[3]16   !!----------------------------------------------------------------------
[6140]17   USE oce            ! ocean dynamics and active tracers
18   USE sbc_oce        ! surface boundary condition: ocean
19   USE dom_oce        ! ocean space domain variables
20   USE phycst         ! physical constant
21   USE eosbn2         ! Equation Of State
22   USE sbcmod         ! ln_rnf 
23   USE sbcrnf         ! River runoff 
24   USE sbcisf         ! Ice shelf   
25   USE iscplini       ! Ice sheet coupling
26   USE traqsr         ! solar radiation penetration
27   USE trd_oce        ! trends: ocean variables
28   USE trdtra         ! trends manager: tracers
[9023]29#if defined key_asminc   
30   USE asminc         ! Assimilation increment
31#endif
[4990]32   !
[6140]33   USE in_out_manager ! I/O manager
34   USE prtctl         ! Print control
35   USE iom            ! xIOS server
36   USE lbclnk         ! ocean lateral boundary conditions (or mpp link)
37   USE timing         ! Timing
[3]38
39   IMPLICIT NONE
40   PRIVATE
41
[6140]42   PUBLIC   tra_sbc   ! routine called by step.F90
[3]43
44   !! * Substitutions
45#  include "vectopt_loop_substitute.h90"
46   !!----------------------------------------------------------------------
[9598]47   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
[888]48   !! $Id$
[10068]49   !! Software governed by the CeCILL license (see ./LICENSE)
[3]50   !!----------------------------------------------------------------------
51CONTAINS
52
[10946]53   SUBROUTINE tra_sbc ( kt, Kmm, Krhs )
[3]54      !!----------------------------------------------------------------------
55      !!                  ***  ROUTINE tra_sbc  ***
56      !!                   
57      !! ** Purpose :   Compute the tracer surface boundary condition trend of
58      !!      (flux through the interface, concentration/dilution effect)
59      !!      and add it to the general trend of tracer equations.
60      !!
[6140]61      !! ** Method :   The (air+ice)-sea flux has two components:
62      !!      (1) Fext, external forcing (i.e. flux through the (air+ice)-sea interface);
63      !!      (2) Fwe , tracer carried with the water that is exchanged with air+ice.
64      !!               The input forcing fields (emp, rnf, sfx, isf) contain Fext+Fwe,
[10874]65      !!             they are simply added to the tracer trend (tsa).
[6140]66      !!               In linear free surface case (ln_linssh=T), the volume of the
67      !!             ocean does not change with the water exchanges at the (air+ice)-sea
68      !!             interface. Therefore another term has to be added, to mimic the
69      !!             concentration/dilution effect associated with water exchanges.
[664]70      !!
[10874]71      !! ** Action  : - Update tsa with the surface boundary condition trend
[6140]72      !!              - send trends to trdtra module for further diagnostics(l_trdtra=T)
[503]73      !!----------------------------------------------------------------------
[10874]74      INTEGER, INTENT(in) ::   kt   ! ocean time-step index
[10946]75      INTEGER, INTENT(in) ::   Kmm, Krhs  ! time level indices
[6140]76      !
[9023]77      INTEGER  ::   ji, jj, jk, jn              ! dummy loop indices 
78      INTEGER  ::   ikt, ikb                    ! local integers
79      REAL(wp) ::   zfact, z1_e3t, zdep, ztim   ! local scalar
[9019]80      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::  ztrdt, ztrds
[3]81      !!----------------------------------------------------------------------
[3294]82      !
[9019]83      IF( ln_timing )   CALL timing_start('tra_sbc')
[3294]84      !
[3]85      IF( kt == nit000 ) THEN
86         IF(lwp) WRITE(numout,*)
87         IF(lwp) WRITE(numout,*) 'tra_sbc : TRAcer Surface Boundary Condition'
88         IF(lwp) WRITE(numout,*) '~~~~~~~ '
89      ENDIF
[6140]90      !
[4990]91      IF( l_trdtra ) THEN                    !* Save ta and sa trends
[9019]92         ALLOCATE( ztrdt(jpi,jpj,jpk) , ztrds(jpi,jpj,jpk) ) 
[10874]93         ztrdt(:,:,:) = tsa(:,:,:,jp_tem)
94         ztrds(:,:,:) = tsa(:,:,:,jp_sal)
[216]95      ENDIF
[6140]96      !
97!!gm  This should be moved into sbcmod.F90 module ? (especially now that ln_traqsr is read in namsbc namelist)
[2528]98      IF( .NOT.ln_traqsr ) THEN     ! no solar radiation penetration
[7753]99         qns(:,:) = qns(:,:) + qsr(:,:)      ! total heat flux in qns
100         qsr(:,:) = 0._wp                     ! qsr set to zero
[2528]101      ENDIF
[3]102
[2528]103      !----------------------------------------
[4990]104      !        EMP, SFX and QNS effects
[2528]105      !----------------------------------------
[6140]106      !                             !==  Set before sbc tracer content fields  ==!
107      IF( kt == nit000 ) THEN             !* 1st time-step
108         IF( ln_rstart .AND.    &               ! Restart: read in restart file
[2528]109              & iom_varid( numror, 'sbc_hc_b', ldstop = .FALSE. ) > 0 ) THEN
[6140]110            IF(lwp) WRITE(numout,*) '          nit000-1 sbc tracer content field read in the restart file'
[4990]111            zfact = 0.5_wp
[7753]112            sbc_tsc(:,:,:) = 0._wp
[9367]113            CALL iom_get( numror, jpdom_autoglo, 'sbc_hc_b', sbc_tsc_b(:,:,jp_tem), ldxios = lrxios )   ! before heat content sbc trend
114            CALL iom_get( numror, jpdom_autoglo, 'sbc_sc_b', sbc_tsc_b(:,:,jp_sal), ldxios = lrxios )   ! before salt content sbc trend
[6140]115         ELSE                                   ! No restart or restart not found: Euler forward time stepping
[4990]116            zfact = 1._wp
[7753]117            sbc_tsc(:,:,:) = 0._wp
118            sbc_tsc_b(:,:,:) = 0._wp
[2528]119         ENDIF
[6140]120      ELSE                                !* other time-steps: swap of forcing fields
[4990]121         zfact = 0.5_wp
[7753]122         sbc_tsc_b(:,:,:) = sbc_tsc(:,:,:)
[2528]123      ENDIF
[6140]124      !                             !==  Now sbc tracer content fields  ==!
125      DO jj = 2, jpj
126         DO ji = fs_2, fs_jpim1   ! vector opt.
[10499]127            sbc_tsc(ji,jj,jp_tem) = r1_rau0_rcp * qns(ji,jj)   ! non solar heat flux
[6140]128            sbc_tsc(ji,jj,jp_sal) = r1_rau0     * sfx(ji,jj)   ! salt flux due to freezing/melting
[3]129         END DO
[6140]130      END DO
131      IF( ln_linssh ) THEN                !* linear free surface 
132         DO jj = 2, jpj                         !==>> add concentration/dilution effect due to constant volume cell
[2528]133            DO ji = fs_2, fs_jpim1   ! vector opt.
[10874]134               sbc_tsc(ji,jj,jp_tem) = sbc_tsc(ji,jj,jp_tem) + r1_rau0 * emp(ji,jj) * tsn(ji,jj,1,jp_tem)
135               sbc_tsc(ji,jj,jp_sal) = sbc_tsc(ji,jj,jp_sal) + r1_rau0 * emp(ji,jj) * tsn(ji,jj,1,jp_sal)
[2528]136            END DO
[6140]137         END DO                                 !==>> output c./d. term
[10874]138         IF( iom_use('emp_x_sst') )   CALL iom_put( "emp_x_sst", emp (:,:) * tsn(:,:,1,jp_tem) )
139         IF( iom_use('emp_x_sss') )   CALL iom_put( "emp_x_sss", emp (:,:) * tsn(:,:,1,jp_sal) )
[2528]140      ENDIF
[6140]141      !
142      DO jn = 1, jpts               !==  update tracer trend  ==!
[2528]143         DO jj = 2, jpj
[6140]144            DO ji = fs_2, fs_jpim1   ! vector opt. 
[10874]145               tsa(ji,jj,1,jn) = tsa(ji,jj,1,jn) + zfact * ( sbc_tsc_b(ji,jj,jn) + sbc_tsc(ji,jj,jn) ) / e3t_n(ji,jj,1)
[2528]146            END DO
147         END DO
[3]148      END DO
[6140]149      !                 
150      IF( lrst_oce ) THEN           !==  write sbc_tsc in the ocean restart file  ==!
[9367]151         IF( lwxios ) CALL iom_swap(      cwxios_context          )
152         CALL iom_rstput( kt, nitrst, numrow, 'sbc_hc_b', sbc_tsc(:,:,jp_tem), ldxios = lwxios )
153         CALL iom_rstput( kt, nitrst, numrow, 'sbc_sc_b', sbc_tsc(:,:,jp_sal), ldxios = lwxios )
154         IF( lwxios ) CALL iom_swap(      cxios_context          )
[2528]155      ENDIF
156      !
157      !----------------------------------------
[4990]158      !       Ice Shelf effects (ISF)
159      !     tbl treated as in Losh (2008) JGR
160      !----------------------------------------
161      !
[6140]162!!gm BUG ?   Why no differences between non-linear and linear free surface ?
163!!gm         probably taken into account in r1_hisf_tbl : to be verified
164      IF( ln_isf ) THEN
165         zfact = 0.5_wp
[4990]166         DO jj = 2, jpj
167            DO ji = fs_2, fs_jpim1
[6140]168               !
[4990]169               ikt = misfkt(ji,jj)
170               ikb = misfkb(ji,jj)
[6140]171               !
[4990]172               ! level fully include in the ice shelf boundary layer
173               ! sign - because fwf sign of evapo (rnf sign of precip)
174               DO jk = ikt, ikb - 1
175               ! compute trend
[10874]176                  tsa(ji,jj,jk,jp_tem) = tsa(ji,jj,jk,jp_tem)                                                &
[6140]177                     &           + zfact * ( risf_tsc_b(ji,jj,jp_tem) + risf_tsc(ji,jj,jp_tem) )             &
178                     &           * r1_hisf_tbl(ji,jj)
[4990]179               END DO
180   
181               ! level partially include in ice shelf boundary layer
182               ! compute trend
[10874]183               tsa(ji,jj,ikb,jp_tem) = tsa(ji,jj,ikb,jp_tem)                                                 &
[6140]184                  &              + zfact * ( risf_tsc_b(ji,jj,jp_tem) + risf_tsc(ji,jj,jp_tem) )             &
185                  &              * r1_hisf_tbl(ji,jj) * ralpha(ji,jj)
186
[4990]187            END DO
188         END DO
189      END IF
190      !
191      !----------------------------------------
[2528]192      !        River Runoff effects
193      !----------------------------------------
194      !
[3764]195      IF( ln_rnf ) THEN         ! input of heat and salt due to river runoff
196         zfact = 0.5_wp
[2528]197         DO jj = 2, jpj 
198            DO ji = fs_2, fs_jpim1
[3764]199               IF( rnf(ji,jj) /= 0._wp ) THEN
200                  zdep = zfact / h_rnf(ji,jj)
[2528]201                  DO jk = 1, nk_rnf(ji,jj)
[10874]202                                        tsa(ji,jj,jk,jp_tem) = tsa(ji,jj,jk,jp_tem)                                 &
[6140]203                                           &                 +  ( rnf_tsc_b(ji,jj,jp_tem) + rnf_tsc(ji,jj,jp_tem) ) * zdep
[10874]204                     IF( ln_rnf_sal )   tsa(ji,jj,jk,jp_sal) = tsa(ji,jj,jk,jp_sal)                                 &
[6140]205                                           &                 +  ( rnf_tsc_b(ji,jj,jp_sal) + rnf_tsc(ji,jj,jp_sal) ) * zdep 
[2715]206                  END DO
[2528]207               ENDIF
[2715]208            END DO 
209         END DO 
[3764]210      ENDIF
[6472]211
[10874]212      IF( iom_use('rnf_x_sst') )   CALL iom_put( "rnf_x_sst", rnf*tsn(:,:,1,jp_tem) )   ! runoff term on sst
213      IF( iom_use('rnf_x_sss') )   CALL iom_put( "rnf_x_sss", rnf*tsn(:,:,1,jp_sal) )   ! runoff term on sss
[6472]214
[9023]215#if defined key_asminc
[6140]216      !
217      !----------------------------------------
[9023]218      !        Assmilation effects
219      !----------------------------------------
220      !
221      IF( ln_sshinc ) THEN         ! input of heat and salt due to assimilation
222          !
223         IF( ln_linssh ) THEN
224            DO jj = 2, jpj 
225               DO ji = fs_2, fs_jpim1
[10874]226                  ztim = ssh_iau(ji,jj) / e3t_n(ji,jj,1)
227                  tsa(ji,jj,1,jp_tem) = tsa(ji,jj,1,jp_tem) + tsn(ji,jj,1,jp_tem) * ztim
228                  tsa(ji,jj,1,jp_sal) = tsa(ji,jj,1,jp_sal) + tsn(ji,jj,1,jp_sal) * ztim
[9023]229               END DO
230            END DO
231         ELSE
232            DO jj = 2, jpj 
233               DO ji = fs_2, fs_jpim1
234                  ztim = ssh_iau(ji,jj) / ( ht_n(ji,jj) + 1. - ssmask(ji, jj) )
[10874]235                  tsa(ji,jj,:,jp_tem) = tsa(ji,jj,:,jp_tem) + tsn(ji,jj,:,jp_tem) * ztim
236                  tsa(ji,jj,:,jp_sal) = tsa(ji,jj,:,jp_sal) + tsn(ji,jj,:,jp_sal) * ztim
[9023]237               END DO 
238            END DO 
239         ENDIF
240         !
241      ENDIF
242      !
243#endif
244      !
245      !----------------------------------------
[6140]246      !        Ice Sheet coupling imbalance correction to have conservation
247      !----------------------------------------
248      !
249      IF( ln_iscpl .AND. ln_hsb) THEN         ! input of heat and salt due to river runoff
250         DO jk = 1,jpk
251            DO jj = 2, jpj 
252               DO ji = fs_2, fs_jpim1
[10874]253                  zdep = 1._wp / e3t_n(ji,jj,jk) 
254                  tsa(ji,jj,jk,jp_tem) = tsa(ji,jj,jk,jp_tem) - htsc_iscpl(ji,jj,jk,jp_tem) * zdep
255                  tsa(ji,jj,jk,jp_sal) = tsa(ji,jj,jk,jp_sal) - htsc_iscpl(ji,jj,jk,jp_sal) * zdep 
[6140]256               END DO 
257            END DO 
258         END DO
259      ENDIF
260
261      IF( l_trdtra )   THEN                      ! save the horizontal diffusive trends for further diagnostics
[10874]262         ztrdt(:,:,:) = tsa(:,:,:,jp_tem) - ztrdt(:,:,:)
263         ztrds(:,:,:) = tsa(:,:,:,jp_sal) - ztrds(:,:,:)
[10946]264         CALL trd_tra( kt, Kmm, Krhs, 'TRA', jp_tem, jptra_nsr, ztrdt )
265         CALL trd_tra( kt, Kmm, Krhs, 'TRA', jp_sal, jptra_nsr, ztrds )
[9019]266         DEALLOCATE( ztrdt , ztrds ) 
[216]267      ENDIF
[503]268      !
[2528]269      IF(ln_ctl)   CALL prt_ctl( tab3d_1=tsa(:,:,:,jp_tem), clinfo1=' sbc  - Ta: ', mask1=tmask,   &
270         &                       tab3d_2=tsa(:,:,:,jp_sal), clinfo2=       ' Sa: ', mask2=tmask, clinfo3='tra' )
[503]271      !
[9019]272      IF( ln_timing )   CALL timing_stop('tra_sbc')
[3294]273      !
[3]274   END SUBROUTINE tra_sbc
275
276   !!======================================================================
277END MODULE trasbc
Note: See TracBrowser for help on using the repository browser.