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/2011/DEV_r2739_STFC_dCSE/NEMOGCM/NEMO/OPA_SRC/SBC – NEMO

source: branches/2011/DEV_r2739_STFC_dCSE/NEMOGCM/NEMO/OPA_SRC/SBC/sbcssr.F90 @ 3211

Last change on this file since 3211 was 3211, checked in by spickles2, 12 years ago

Stephen Pickles, 11 Dec 2011

Commit to bring the rest of the DCSE NEMO development branch
in line with the latest development version. This includes
array index re-ordering of all OPA_SRC/.

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