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 trunk/NEMO/OPA_SRC/SBC – NEMO

source: trunk/NEMO/OPA_SRC/SBC/sbcssr.F90 @ 1553

Last change on this file since 1553 was 1524, checked in by ctlod, 15 years ago

style changes only, see ticket: #406

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