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.
sbcssr.F90 in branches/DEV_r1837_mass_heat_salt_fluxes/NEMO/OPA_SRC/SBC – NEMO

source: branches/DEV_r1837_mass_heat_salt_fluxes/NEMO/OPA_SRC/SBC/sbcssr.F90 @ 1859

Last change on this file since 1859 was 1859, checked in by gm, 14 years ago

ticket:#665 step 2 & 3: heat content in qns & new forcing terms

  • Property svn:keywords set to Id
File size: 10.5 KB
Line 
1MODULE sbcssr
2   !!======================================================================
3   !!                       ***  MODULE  sbcssr  ***
4   !! Surface module :  heat and fresh water fluxes a restoring term toward observed SST/SSS
5   !!======================================================================
6   !! History :  3.0  !  2006-06  (G. Madec)  Original code
7   !!            3.2  !  2009-04  (B. Lemaire)  Introduce iom_put
8   !!             -   !  2009-07  (C. Talandier, G. Madec)  Add a bound to the Erp
9   !!            3.3  !  2010-05  (Y. Aksenov G. Madec) salt flux + heat associated with emp
10   !!----------------------------------------------------------------------
11
12   !!----------------------------------------------------------------------
13   !!   sbc_ssr        : add to sbc a restoring term toward SST/SSS climatology
14   !!----------------------------------------------------------------------
15   USE oce             ! ocean dynamics and tracers
16   USE dom_oce         ! ocean space and time domain
17   USE sbc_oce         ! surface boundary condition
18   USE phycst          ! physical constants
19   USE sbcrnf          ! surface boundary condition : runoffs
20   USE fldread         ! read input fields
21   USE iom             ! I/O manager
22   USE in_out_manager  ! I/O manager
23   USE lib_mpp         ! distribued memory computing library
24   USE lbclnk          ! ocean lateral boundary conditions (or mpp link)
25
26   IMPLICIT NONE
27   PRIVATE
28
29   PUBLIC   sbc_ssr    ! routine called in sbcmod
30   
31
32   REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   erp      !: evaporation damping   [kg/m2/s]
33   REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   qrp      !: heat flux damping        [w/m2]
34
35   !                                           !!* Namelist namsbc_ssr *
36   INTEGER, PUBLIC ::   nn_sstr     =   0       ! SST/SSS restoring indicator
37   INTEGER, PUBLIC ::   nn_sssr     =   0       ! SST/SSS restoring indicator
38   REAL(wp)        ::   rn_dqdt     = -40.e0    ! restoring factor on SST and SSS
39   REAL(wp)        ::   rn_deds     = -27.70    ! restoring factor on SST and SSS
40   LOGICAL         ::   ln_sssr_bnd = .false.   ! flag to bound erp term
41   REAL(wp)        ::   rn_sssr_bnd =   4.e0    ! ABS(Max./Min.) value of erp term [mm/day]
42
43   REAL(wp) , ALLOCATABLE, DIMENSION(:) ::   buffer   ! Temporary buffer for exchange
44   TYPE(FLD), ALLOCATABLE, DIMENSION(:) ::   sf_sst   ! structure of input SST (file informations, fields read)
45   TYPE(FLD), ALLOCATABLE, DIMENSION(:) ::   sf_sss   ! structure of input SSS (file informations, fields read)
46
47   !! * Substitutions
48#  include "domzgr_substitute.h90"
49   !!----------------------------------------------------------------------
50   !! NEMO/OPA 3.3 , LOCEAN-IPSL (2010)
51   !! $Id$
52   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt)
53   !!----------------------------------------------------------------------
54
55CONTAINS
56
57   SUBROUTINE sbc_ssr( kt )
58      !!---------------------------------------------------------------------
59      !!                     ***  ROUTINE sbc_ssr  ***
60      !!
61      !! ** Purpose :   Add to heat and/or freshwater fluxes a damping term
62      !!                toward observed SST and/or SSS.
63      !!
64      !! ** Method  : - Read namelist namsbc_ssr
65      !!              - Read observed SST and/or SSS
66      !!              - at each nscb time step
67      !!                   add a retroaction term on qns    (nn_sstr = 1)
68      !!                   add a damping term on emps       (nn_sssr = 1)
69      !!                   add a damping term on emp & emps (nn_sssr = 2)
70      !!---------------------------------------------------------------------
71      INTEGER, INTENT(in   ) ::   kt   ! ocean time step
72      !!
73      INTEGER  ::   ji, jj   ! dummy loop indices
74      INTEGER  ::   ierror   ! return error code
75      REAL(wp) ::   zerp, zqrp, zsrp, zerp_bnd    ! local scalar
76      !!
77      CHARACTER(len=100) ::  cn_dir = './'   ! Root directory for location of ssr files
78      TYPE(FLD_N) ::   sn_sst, sn_sss        ! informations about the fields to be read
79      NAMELIST/namsbc_ssr/ cn_dir, nn_sstr, nn_sssr, rn_dqdt, rn_deds, sn_sst, sn_sss, ln_sssr_bnd, rn_sssr_bnd
80      !!----------------------------------------------------------------------
81      !
82      !                                               ! -------------------- !
83      IF( kt == nit000 ) THEN                         ! First call kt=nit000 !
84         !                                            ! -------------------- !
85         !                            !* set file information
86         ! ... default values (NB: frequency positive => hours, negative => months)
87         !            !   file    ! frequency !  variable  ! time intep !  clim   ! 'yearly' or ! weights  ! rotation   !
88         !            !   name    !  (hours)  !   name     !   (T/F)    !  (T/F)  !  'monthly'  ! filename ! pairs      !
89         sn_sst = FLD_N( 'sst'    ,    24     ,  'sst'     ,  .false.   , .false. ,   'yearly'  , ''       , ''         )
90         sn_sss = FLD_N( 'sss'    ,    -1     ,  'sss'     ,  .true.    , .false. ,   'yearly'  , ''       , ''         )
91
92         REWIND ( numnam )            !* read in namlist namflx
93         READ( numnam, namsbc_ssr ) 
94
95         IF(lwp) THEN                 !* control print
96            WRITE(numout,*)
97            WRITE(numout,*) 'sbc_ssr : SST and/or SSS damping term '
98            WRITE(numout,*) '~~~~~~~ '
99            WRITE(numout,*) '   Namelist namsbc_ssr :'
100            WRITE(numout,*) '      SST restoring term (Yes=1)             nn_sstr     = ', nn_sstr
101            WRITE(numout,*) '      SSS damping term (Yes=1, salt flux)    nn_sssr     = ', nn_sssr
102            WRITE(numout,*) '                       (Yes=2, volume flux) '
103            WRITE(numout,*) '      dQ/dT (restoring magnitude on SST)     rn_dqdt     = ', rn_dqdt, ' W/m2/K'
104            WRITE(numout,*) '      dE/dS (restoring magnitude on SST)     rn_deds     = ', rn_deds, ' mm/day'
105            WRITE(numout,*) '      flag to bound erp term                 ln_sssr_bnd = ', ln_sssr_bnd
106            WRITE(numout,*) '      ABS(Max./Min.) erp threshold           rn_sssr_bnd = ', rn_sssr_bnd, ' mm/day'
107         ENDIF
108
109         IF( nn_sstr == 1 ) THEN      !* set sf_sst structure
110            !
111            ALLOCATE( sf_sst(1), STAT=ierror )
112            IF( ierror > 0 ) THEN
113               CALL ctl_stop( 'sbc_ssr: unable to allocate sf_sst structure' )   ;   RETURN
114            ENDIF
115            ALLOCATE( sf_sst(1)%fnow(jpi,jpj) )
116            ALLOCATE( sf_sst(1)%fdta(jpi,jpj,2) )
117            !
118            ! fill sf_sst with sn_sst and control print
119            CALL fld_fill( sf_sst, (/ sn_sst /), cn_dir, 'sbc_ssr', 'SST restoring term toward SST data', 'namsbc_ssr' )
120         ENDIF
121         !
122         IF( nn_sssr >= 1 ) THEN      ! set sf_sss structure
123            !
124            ALLOCATE( sf_sss(1), STAT=ierror )
125            IF( ierror > 0 ) THEN
126               CALL ctl_stop( 'sbc_ssr: unable to allocate sf_sss structure' )   ;   RETURN
127            ENDIF
128            ALLOCATE( sf_sss(1)%fnow(jpi,jpj) )
129            ALLOCATE( sf_sss(1)%fdta(jpi,jpj,2) )
130            !
131            ! fill sf_sss with sn_sss and control print
132            CALL fld_fill( sf_sss, (/ sn_sss /), cn_dir, 'sbc_ssr', 'SSS restoring term toward SSS data', 'namsbc_ssr' )
133         ENDIF
134         !
135         ! Initialize qrp and erp if no restoring
136         IF( nn_sstr /= 1                   )   qrp(:,:) = 0.e0 
137         IF( nn_sssr /= 1 .OR. nn_sssr /= 2 )   erp(:,:) = 0.e0 
138      ENDIF
139
140      IF( nn_sstr + nn_sssr /= 0 ) THEN
141         !
142         IF( nn_sstr == 1)   CALL fld_read( kt, nn_fsbc, sf_sst )   ! Read SST data and provides it at kt
143         IF( nn_sssr >= 1)   CALL fld_read( kt, nn_fsbc, sf_sss )   ! Read SSS data and provides it at kt
144         !
145         !                                         ! ========================= !
146         IF( MOD( kt-1, nn_fsbc ) == 0 ) THEN      !    Add restoring term     !
147            !                                      ! ========================= !
148            !
149            IF( nn_sstr == 1 ) THEN                   !* Temperature restoring term
150!CDIR COLLAPSE
151               DO jj = 1, jpj
152                  DO ji = 1, jpi
153                     zqrp = rn_dqdt * ( sst_m(ji,jj) - sf_sst(1)%fnow(ji,jj) )
154                     qns(ji,jj) = qns(ji,jj) + zqrp
155                     qrp(ji,jj) = zqrp
156                  END DO
157               END DO
158               CALL iom_put( "qrp", qrp )                             ! heat flux damping
159            ENDIF
160            !
161            IF( nn_sssr == 1 ) THEN                   !* Salinity damping term (salt flux only (emps))
162               zsrp = rn_deds / rday                                  ! from [mm/day] to [kg/m2/s]
163!CDIR COLLAPSE
164               DO jj = 1, jpj
165                  DO ji = 1, jpi
166                     zerp = zsrp * ( 1. - 2.*rnfmsk(ji,jj) )   &      ! No damping in vicinity of river mouths
167                        &        * ( sss_m(ji,jj) - sf_sss(1)%fnow(ji,jj) )
168                     emps(ji,jj) = emps(ji,jj) + zerp
169                     erp( ji,jj) = zerp / MAX( sss_m(ji,jj), 1.e-20  )  ! converted into an equivalent emp (diag. only)
170                  END DO
171               END DO
172               CALL iom_put( "erp", erp )                             ! freshwater flux damping
173               !
174            ELSEIF( nn_sssr == 2 ) THEN               !* Salinity damping term (volume flux (emp) and qns)
175               zsrp = rn_deds / rday                                  ! from [mm/day] to [kg/m2/s]
176               zerp_bnd = rn_sssr_bnd / rday                          !       -              -   
177!CDIR COLLAPSE
178               DO jj = 1, jpj
179                  DO ji = 1, jpi                           
180                     zerp = zsrp * ( 1. - 2.*rnfmsk(ji,jj) )   &      ! No damping in vicinity of river mouths
181                        &        * ( sss_m(ji,jj) - sf_sss(1)%fnow(ji,jj) )   &
182                        &        / MAX(  sss_m(ji,jj), 1.e-20  )
183                     IF( ln_sssr_bnd )   zerp = SIGN( 1., zerp ) * MIN( zerp_bnd, ABS(zerp) )
184!!gm better coding   IF( ln_sssr_bnd )   zerp = MAX( -zerp_bnd, MIN( zerp, zerp_bnd )  )
185                     emp(ji,jj) = emp(ji,jj) + zerp
186                     qns(ji,jj) = qns(ji,jj) - zerp * rcp * sst_m(ji,jj)
187                     erp(ji,jj) = zerp
188                  END DO
189               END DO
190               CALL iom_put( "erp", erp )                             ! freshwater flux damping
191            ENDIF
192            !
193         ENDIF
194         !
195      ENDIF
196      !
197   END SUBROUTINE sbc_ssr
198     
199   !!======================================================================
200END MODULE sbcssr
Note: See TracBrowser for help on using the repository browser.