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.
trcrad.F90 in trunk/NEMO/TOP_SRC/TRP – NEMO

source: trunk/NEMO/TOP_SRC/TRP/trcrad.F90 @ 340

Last change on this file since 340 was 334, checked in by opalod, 19 years ago

nemo_v1_update_022 : CE + RB + CT : add print control possibility

  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 5.4 KB
Line 
1MODULE trcrad
2   !!======================================================================
3   !!                       ***  MODULE  trcrad  ***
4   !! Ocean passive tracers:  correction of negative concentrations
5   !!======================================================================
6#if defined key_passivetrc
7   !!----------------------------------------------------------------------
8   !!   trc_rad    : correction of negative concentrations
9   !!----------------------------------------------------------------------
10   !! * Modules used
11   USE oce_trc             ! ocean dynamics and tracers variables
12   USE trc                 ! ocean passive tracers variables
13   USE lib_mpp
14   USE prtctl_trc          ! Print control for debbuging
15
16   IMPLICIT NONE
17   PRIVATE
18
19   !! * Routine accessibility
20   PUBLIC trc_rad        ! routine called by trcstp.F90
21   !! * Substitutions
22#  include "passivetrc_substitute.h90"
23   !!----------------------------------------------------------------------
24   !!   OPA 9.0 , LODYC-IPSL   (2003)
25   !!----------------------------------------------------------------------
26CONTAINS
27
28   SUBROUTINE trc_rad( kt )
29      !!----------------------------------------------------------------------
30      !!                  ***  ROUTINE trc_rad  ***
31      !!
32      !! ** Purpose : "crappy" routine to correct artificial negative
33      !!      concentrations due to isopycnal scheme
34      !!
35      !! ** Method  : Set negative concentrations to zero
36      !!              compute the corresponding mass added to the tracers
37      !!              and remove it when possible
38      !!
39      !! History :
40      !!   8.2  !  01-01  (O. Aumont & E. Kestenare)  Original code
41      !!   9.0  !  04-03  (C. Ethe)  free form F90
42      !!----------------------------------------------------------------------
43      !! * Arguments
44      INTEGER, INTENT( in ) ::   kt       ! ocean time-step index
45     
46      !! * Local declarations
47      INTEGER ::  ji, jj, jk, jn             ! dummy loop indices
48#if defined key_trc_pisces
49      REAL(wp) :: zvolk, trcorb, trmasb ,trcorn, trmasn 
50#endif
51      CHARACTER (len=22) :: charout
52      !!----------------------------------------------------------------------
53
54      IF( kt == nittrc000 ) THEN
55         IF(lwp) WRITE(numout,*)
56         IF(lwp) WRITE(numout,*) 'trc_rad : Correct artificial negative concentrations '
57         IF(lwp) WRITE(numout,*) '~~~~~~~ '
58      ENDIF
59
60
61#if defined key_trc_lobster1 || defined key_cfc
62      DO jn = 1, jptra
63         DO jk = 1, jpkm1
64            DO jj = 1, jpj
65               DO ji = 1, jpi
66                  trn(ji,jj,jk,jn) = MAX( 0. , trn(ji,jj,jk,jn) )
67                  trb(ji,jj,jk,jn) = MAX( 0. , trb(ji,jj,jk,jn) )
68               END DO
69            END DO
70         END DO
71      END DO
72     
73#elif defined key_trc_pisces
74      DO jn = 1, jptra
75         trcorb = 0.
76         trmasb = 0.
77         trcorn = 0.
78         trmasn = 0.
79         DO jk = 1, jpkm1
80            DO jj = 1, jpj
81               DO ji = 1, jpi
82                  zvolk = e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) &
83#if defined key_off_degrad
84                  &  * facvol(ji,jj,jk) &
85#endif
86                  &  * tmask(ji,jj,jk) 
87
88                  trcorb = trcorb + MIN( 0., trb(ji,jj,jk,jn) )  * zvolk
89                  trcorn = trcorn + MIN( 0., trn(ji,jj,jk,jn) )  * zvolk
90
91                  trb(ji,jj,jk,jn) = MAX( 0. , trb(ji,jj,jk,jn) )
92                  trn(ji,jj,jk,jn) = MAX( 0. , trn(ji,jj,jk,jn) )
93
94                  trmasb = trmasb + trb(ji,jj,jk,jn) * zvolk
95                  trmasn = trmasn + trn(ji,jj,jk,jn) * zvolk
96               END DO
97            END DO
98         END DO
99
100         IF( lk_mpp ) THEN
101           CALL mpp_sum( trcorb )   ! sum over the global domain
102           CALL mpp_sum( trcorn )   ! sum over the global domain
103           CALL mpp_sum( trmasb )   ! sum over the global domain
104           CALL mpp_sum( trmasn )   ! sum over the global domain
105         ENDIF
106
107         IF( trcorb /= 0 ) THEN
108            DO jk = 1, jpkm1
109               DO jj = 1, jpj
110                  DO ji = 1, jpi
111                     trb(ji,jj,jk,jn) = MAX( 0. , trb(ji,jj,jk,jn) )
112                     trb(ji,jj,jk,jn) = trb(ji,jj,jk,jn) * ( 1. + trcorb/trmasb ) * tmask(ji,jj,jk)
113                  END DO
114               END DO
115            END DO
116         ENDIF
117
118         IF( trcorn /= 0) THEN
119            DO jk = 1, jpkm1
120               DO jj = 1, jpj
121                  DO ji = 1, jpi
122                     trn(ji,jj,jk,jn) = MAX( 0. , trn(ji,jj,jk,jn) )
123                     trn(ji,jj,jk,jn) = trn(ji,jj,jk,jn) * ( 1. + trcorn/trmasn ) * tmask(ji,jj,jk)
124                  END DO
125               END DO
126            END DO
127         ENDIF
128
129      END DO
130     
131#endif
132
133      IF(ln_ctl)   THEN  ! print mean trends (used for debugging)
134         WRITE(charout, FMT="('rad')")
135         CALL prt_ctl_trc_info(charout)
136         CALL prt_ctl_trc(tab4d=trn, mask=tmask, clinfo=ctrcnm)
137      ENDIF
138
139     
140   END SUBROUTINE trc_rad
141
142#else
143   !!----------------------------------------------------------------------
144   !!   Dummy module :                      NO passive tracer
145   !!----------------------------------------------------------------------
146CONTAINS
147   SUBROUTINE trc_rad (kt )              ! Empty routine
148      INTEGER, INTENT(in) :: kt
149      WRITE(*,*) 'trc_rad: You should not have seen this print! error?', kt
150   END SUBROUTINE trc_rad
151#endif
152   
153   !!======================================================================
154END MODULE trcrad
Note: See TracBrowser for help on using the repository browser.