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.
sbcssm.F90 in NEMO/trunk/src/OCE/SBC – NEMO

source: NEMO/trunk/src/OCE/SBC/sbcssm.F90 @ 12489

Last change on this file since 12489 was 12377, checked in by acc, 4 years ago

The big one. Merging all 2019 developments from the option 1 branch back onto the trunk.

This changeset reproduces 2019/dev_r11943_MERGE_2019 on the trunk using a 2-URL merge
onto a working copy of the trunk. I.e.:

svn merge --ignore-ancestry \

svn+ssh://acc@forge.ipsl.jussieu.fr/ipsl/forge/projets/nemo/svn/NEMO/trunk \
svn+ssh://acc@forge.ipsl.jussieu.fr/ipsl/forge/projets/nemo/svn/NEMO/branches/2019/dev_r11943_MERGE_2019 ./

The --ignore-ancestry flag avoids problems that may otherwise arise from the fact that
the merge history been trunk and branch may have been applied in a different order but
care has been taken before this step to ensure that all applicable fixes and updates
are present in the merge branch.

The trunk state just before this step has been branched to releases/release-4.0-HEAD
and that branch has been immediately tagged as releases/release-4.0.2. Any fixes
or additions in response to tickets on 4.0, 4.0.1 or 4.0.2 should be done on
releases/release-4.0-HEAD. From now on future 'point' releases (e.g. 4.0.2) will
remain unchanged with periodic releases as needs demand. Note release-4.0-HEAD is a
transitional naming convention. Future full releases, say 4.2, will have a release-4.2
branch which fulfills this role and the first point release (e.g. 4.2.0) will be made
immediately following the release branch creation.

2020 developments can be started from any trunk revision later than this one.

  • Property svn:keywords set to Id
File size: 14.2 KB
Line 
1MODULE sbcssm
2   !!======================================================================
3   !!                       ***  MODULE  sbcssm  ***
4   !! Surface module :  provide time-mean ocean surface variables
5   !!======================================================================
6   !! History :  9.0  ! 2006-07  (G. Madec)  Original code
7   !!            3.3  ! 2010-10  (C. Bricaud, G. Madec)  add the Patm forcing for sea-ice
8   !!            3.7  ! 2015-11  (G. Madec)  non linear free surface by default: e3t_m always computed
9   !!----------------------------------------------------------------------
10
11   !!----------------------------------------------------------------------
12   !!   sbc_ssm       : calculate sea surface mean currents, temperature, 
13   !!                   and salinity over nn_fsbc time-step
14   !!----------------------------------------------------------------------
15   USE oce            ! ocean dynamics and tracers
16   USE dom_oce        ! ocean space and time domain
17   USE sbc_oce        ! surface boundary condition: ocean fields
18   USE sbcapr         ! surface boundary condition: atmospheric pressure
19   USE eosbn2         ! equation of state and related derivatives
20   USE traqsr, ONLY: ln_traqsr
21   !
22   USE in_out_manager ! I/O manager
23   USE prtctl         ! Print control
24   USE iom            ! IOM library
25
26   IMPLICIT NONE
27   PRIVATE
28
29   PUBLIC   sbc_ssm        ! routine called by step.F90
30   PUBLIC   sbc_ssm_init   ! routine called by sbcmod.F90
31
32   LOGICAL, SAVE ::   l_ssm_mean = .FALSE.   ! keep track of whether means have been read from restart file
33   
34   !!----------------------------------------------------------------------
35   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
36   !! $Id$
37   !! Software governed by the CeCILL license (see ./LICENSE)
38   !!----------------------------------------------------------------------
39CONTAINS
40
41   SUBROUTINE sbc_ssm( kt, Kbb, Kmm )
42      !!---------------------------------------------------------------------
43      !!                     ***  ROUTINE sbc_oce  ***
44      !!                     
45      !! ** Purpose :   provide ocean surface variable to sea-surface boundary
46      !!                condition computation
47      !!               
48      !! ** Method  :   compute mean surface velocity (2 components at U and
49      !!      V-points) [m/s], temperature [Celsius] and salinity [psu] over
50      !!      the periode (kt - nn_fsbc) to kt
51      !!         Note that the inverse barometer ssh (i.e. ssh associated with Patm)
52      !!      is add to ssh_m when ln_apr_dyn = T. Required for sea-ice dynamics.
53      !!---------------------------------------------------------------------
54      INTEGER, INTENT(in) ::   kt   ! ocean time step
55      INTEGER, INTENT(in) ::   Kbb, Kmm   ! ocean time level indices
56      !
57      INTEGER  ::   ji, jj               ! loop index
58      REAL(wp) ::   zcoef, zf_sbc       ! local scalar
59      REAL(wp), DIMENSION(jpi,jpj,jpts) :: zts
60      !!---------------------------------------------------------------------
61      !
62      !                                        !* surface T-, U-, V- ocean level variables (T, S, depth, velocity)
63      zts(:,:,jp_tem) = ts(:,:,1,jp_tem,Kmm)
64      zts(:,:,jp_sal) = ts(:,:,1,jp_sal,Kmm)
65      !
66      IF( nn_fsbc == 1 ) THEN                             !   Instantaneous surface fields        !
67         !                                                ! ---------------------------------------- !
68         ssu_m(:,:) = uu(:,:,1,Kbb)
69         ssv_m(:,:) = vv(:,:,1,Kbb)
70         IF( l_useCT )  THEN    ;   sst_m(:,:) = eos_pt_from_ct( zts(:,:,jp_tem), zts(:,:,jp_sal) )
71         ELSE                   ;   sst_m(:,:) = zts(:,:,jp_tem)
72         ENDIF
73         sss_m(:,:) = zts(:,:,jp_sal)
74         !                          ! removed inverse barometer ssh when Patm forcing is used (for sea-ice dynamics)
75         IF( ln_apr_dyn ) THEN   ;   ssh_m(:,:) = ssh(:,:,Kmm) - 0.5 * ( ssh_ib(:,:) + ssh_ibb(:,:) )
76         ELSE                    ;   ssh_m(:,:) = ssh(:,:,Kmm)
77         ENDIF
78         !
79         e3t_m(:,:) = e3t(:,:,1,Kmm)
80         !
81         frq_m(:,:) = fraqsr_1lev(:,:)
82         !
83      ELSE
84         !                                                ! ----------------------------------------------- !
85         IF( kt == nit000 .AND. .NOT. l_ssm_mean ) THEN   !   Initialisation: 1st time-step, no input means !
86            !                                             ! ----------------------------------------------- !
87            IF(lwp) WRITE(numout,*)
88            IF(lwp) WRITE(numout,*) 'sbc_ssm : mean fields initialised to instantaneous values'
89            IF(lwp) WRITE(numout,*) '~~~~~~~   '
90            zcoef = REAL( nn_fsbc - 1, wp )
91            ssu_m(:,:) = zcoef * uu(:,:,1,Kbb)
92            ssv_m(:,:) = zcoef * vv(:,:,1,Kbb)
93            IF( l_useCT )  THEN    ;   sst_m(:,:) = zcoef * eos_pt_from_ct( zts(:,:,jp_tem), zts(:,:,jp_sal) )
94            ELSE                    ;   sst_m(:,:) = zcoef * zts(:,:,jp_tem)
95            ENDIF
96            sss_m(:,:) = zcoef * zts(:,:,jp_sal)
97            !                          ! removed inverse barometer ssh when Patm forcing is used (for sea-ice dynamics)
98            IF( ln_apr_dyn ) THEN   ;   ssh_m(:,:) = zcoef * ( ssh(:,:,Kmm) - 0.5 * ( ssh_ib(:,:) + ssh_ibb(:,:) ) )
99            ELSE                    ;   ssh_m(:,:) = zcoef *   ssh(:,:,Kmm)
100            ENDIF
101            !
102            e3t_m(:,:) = zcoef * e3t(:,:,1,Kmm)
103            !
104            frq_m(:,:) = zcoef * fraqsr_1lev(:,:)
105            !                                             ! ---------------------------------------- !
106         ELSEIF( MOD( kt - 2 , nn_fsbc ) == 0 ) THEN      !   Initialisation: New mean computation   !
107            !                                             ! ---------------------------------------- !
108            ssu_m(:,:) = 0._wp     ! reset to zero ocean mean sbc fields
109            ssv_m(:,:) = 0._wp
110            sst_m(:,:) = 0._wp
111            sss_m(:,:) = 0._wp
112            ssh_m(:,:) = 0._wp
113            e3t_m(:,:) = 0._wp
114            frq_m(:,:) = 0._wp
115         ENDIF
116         !                                                ! ---------------------------------------- !
117         !                                                !        Cumulate at each time step        !
118         !                                                ! ---------------------------------------- !
119         ssu_m(:,:) = ssu_m(:,:) + uu(:,:,1,Kbb)
120         ssv_m(:,:) = ssv_m(:,:) + vv(:,:,1,Kbb)
121         IF( l_useCT )  THEN     ;   sst_m(:,:) = sst_m(:,:) + eos_pt_from_ct( zts(:,:,jp_tem), zts(:,:,jp_sal) )
122         ELSE                    ;   sst_m(:,:) = sst_m(:,:) + zts(:,:,jp_tem)
123         ENDIF
124         sss_m(:,:) = sss_m(:,:) + zts(:,:,jp_sal)
125         !                          ! removed inverse barometer ssh when Patm forcing is used (for sea-ice dynamics)
126         IF( ln_apr_dyn ) THEN   ;   ssh_m(:,:) = ssh_m(:,:) + ssh(:,:,Kmm) - 0.5 * ( ssh_ib(:,:) + ssh_ibb(:,:) )
127         ELSE                    ;   ssh_m(:,:) = ssh_m(:,:) + ssh(:,:,Kmm)
128         ENDIF
129         !
130         e3t_m(:,:) = e3t_m(:,:) + e3t(:,:,1,Kmm)
131         !
132         frq_m(:,:) = frq_m(:,:) + fraqsr_1lev(:,:)
133
134         !                                                ! ---------------------------------------- !
135         IF( MOD( kt - 1 , nn_fsbc ) == 0 ) THEN          !   Mean value at each nn_fsbc time-step   !
136            !                                             ! ---------------------------------------- !
137            zcoef = 1. / REAL( nn_fsbc, wp )
138            sst_m(:,:) = sst_m(:,:) * zcoef     ! mean SST             [Celsius]
139            sss_m(:,:) = sss_m(:,:) * zcoef     ! mean SSS             [psu]
140            ssu_m(:,:) = ssu_m(:,:) * zcoef     ! mean suface current  [m/s]
141            ssv_m(:,:) = ssv_m(:,:) * zcoef     !
142            ssh_m(:,:) = ssh_m(:,:) * zcoef     ! mean SSH             [m]
143            e3t_m(:,:) = e3t_m(:,:) * zcoef     ! mean vertical scale factor [m]
144            frq_m(:,:) = frq_m(:,:) * zcoef     ! mean fraction of solar net radiation absorbed in the 1st T level [-]
145            !
146         ENDIF
147         !                                                ! ---------------------------------------- !
148         IF( lrst_oce ) THEN                              !      Write in the ocean restart file     !
149            !                                             ! ---------------------------------------- !
150            IF(lwp) WRITE(numout,*)
151            IF(lwp) WRITE(numout,*) 'sbc_ssm : sea surface mean fields written in ocean restart file ',   &
152               &                    'at it= ', kt,' date= ', ndastp
153            IF(lwp) WRITE(numout,*) '~~~~~~~'
154            zf_sbc = REAL( nn_fsbc, wp )
155            IF( lwxios ) CALL iom_swap(      cwxios_context          )
156            CALL iom_rstput( kt, nitrst, numrow, 'nn_fsbc', zf_sbc, ldxios = lwxios )    ! sbc frequency
157            CALL iom_rstput( kt, nitrst, numrow, 'ssu_m'  , ssu_m, ldxios = lwxios  )    ! sea surface mean fields
158            CALL iom_rstput( kt, nitrst, numrow, 'ssv_m'  , ssv_m, ldxios = lwxios  )
159            CALL iom_rstput( kt, nitrst, numrow, 'sst_m'  , sst_m, ldxios = lwxios  )
160            CALL iom_rstput( kt, nitrst, numrow, 'sss_m'  , sss_m, ldxios = lwxios  )
161            CALL iom_rstput( kt, nitrst, numrow, 'ssh_m'  , ssh_m, ldxios = lwxios  )
162            CALL iom_rstput( kt, nitrst, numrow, 'e3t_m'  , e3t_m, ldxios = lwxios  )
163            CALL iom_rstput( kt, nitrst, numrow, 'frq_m'  , frq_m, ldxios = lwxios  )
164            !
165            IF( lwxios ) CALL iom_swap(      cxios_context          )
166         ENDIF
167         !
168      ENDIF
169      !
170      IF( MOD( kt - 1 , nn_fsbc ) == 0 ) THEN          !   Mean value at each nn_fsbc time-step   !
171         CALL iom_put( 'ssu_m', ssu_m )
172         CALL iom_put( 'ssv_m', ssv_m )
173         CALL iom_put( 'sst_m', sst_m )
174         CALL iom_put( 'sss_m', sss_m )
175         CALL iom_put( 'ssh_m', ssh_m )
176         CALL iom_put( 'e3t_m', e3t_m )
177         CALL iom_put( 'frq_m', frq_m )
178      ENDIF
179      !
180   END SUBROUTINE sbc_ssm
181
182
183   SUBROUTINE sbc_ssm_init( Kbb, Kmm )
184      !!----------------------------------------------------------------------
185      !!                  ***  ROUTINE sbc_ssm_init  ***
186      !!
187      !! ** Purpose :   Initialisation of the sbc data
188      !!
189      !! ** Action  : - read parameters
190      !!----------------------------------------------------------------------
191      INTEGER, INTENT(in) ::   Kbb, Kmm   ! ocean time level indices
192      REAL(wp) ::   zcoef, zf_sbc   ! local scalar
193      !!----------------------------------------------------------------------
194      !
195      IF( nn_fsbc == 1 ) THEN
196         !
197         IF(lwp) WRITE(numout,*)
198         IF(lwp) WRITE(numout,*) 'sbc_ssm_init : sea surface mean fields, nn_fsbc=1 : instantaneous values'
199         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~ '
200         !
201      ELSE
202         !               
203         IF(lwp) WRITE(numout,*)
204         IF(lwp) WRITE(numout,*) 'sbc_ssm_init : sea surface mean fields'
205         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~ '
206         !
207         IF( ln_rstart .AND. iom_varid( numror, 'nn_fsbc', ldstop = .FALSE. ) > 0 ) THEN
208            l_ssm_mean = .TRUE.
209            CALL iom_get( numror               , 'nn_fsbc', zf_sbc, ldxios = lrxios )    ! sbc frequency of previous run
210            CALL iom_get( numror, jpdom_autoglo, 'ssu_m'  , ssu_m, ldxios = lrxios  )    ! sea surface mean velocity    (U-point)
211            CALL iom_get( numror, jpdom_autoglo, 'ssv_m'  , ssv_m, ldxios = lrxios  )    !   "         "    velocity    (V-point)
212            CALL iom_get( numror, jpdom_autoglo, 'sst_m'  , sst_m, ldxios = lrxios  )    !   "         "    temperature (T-point)
213            CALL iom_get( numror, jpdom_autoglo, 'sss_m'  , sss_m, ldxios = lrxios  )    !   "         "    salinity    (T-point)
214            CALL iom_get( numror, jpdom_autoglo, 'ssh_m'  , ssh_m, ldxios = lrxios  )    !   "         "    height      (T-point)
215            CALL iom_get( numror, jpdom_autoglo, 'e3t_m'  , e3t_m, ldxios = lrxios  )    ! 1st level thickness          (T-point)
216            ! fraction of solar net radiation absorbed in 1st T level
217            IF( iom_varid( numror, 'frq_m', ldstop = .FALSE. ) > 0 ) THEN
218               CALL iom_get( numror, jpdom_autoglo, 'frq_m'  , frq_m, ldxios = lrxios  )
219            ELSE
220               frq_m(:,:) = 1._wp   ! default definition
221            ENDIF
222            !
223            IF( zf_sbc /= REAL( nn_fsbc, wp ) ) THEN      ! nn_fsbc has changed between 2 runs
224               IF(lwp) WRITE(numout,*) '   restart with a change in the frequency of mean from ', zf_sbc, ' to ', nn_fsbc 
225               zcoef = REAL( nn_fsbc - 1, wp ) / zf_sbc 
226               ssu_m(:,:) = zcoef * ssu_m(:,:) 
227               ssv_m(:,:) = zcoef * ssv_m(:,:)
228               sst_m(:,:) = zcoef * sst_m(:,:)
229               sss_m(:,:) = zcoef * sss_m(:,:)
230               ssh_m(:,:) = zcoef * ssh_m(:,:)
231               e3t_m(:,:) = zcoef * e3t_m(:,:)
232               frq_m(:,:) = zcoef * frq_m(:,:)
233            ELSE
234               IF(lwp) WRITE(numout,*) '   mean fields read in the ocean restart file'
235            ENDIF
236         ENDIF
237      ENDIF
238      !
239      IF( .NOT.l_ssm_mean ) THEN   ! default initialisation. needed by iceistate
240         !
241         IF(lwp) WRITE(numout,*) '   default initialisation of ss._m arrays'
242         ssu_m(:,:) = uu(:,:,1,Kbb)
243         ssv_m(:,:) = vv(:,:,1,Kbb)
244         IF( l_useCT )  THEN    ;   sst_m(:,:) = eos_pt_from_ct( ts(:,:,1,jp_tem,Kmm), ts(:,:,1,jp_sal,Kmm) )
245         ELSE                   ;   sst_m(:,:) = ts(:,:,1,jp_tem,Kmm)
246         ENDIF
247         sss_m(:,:) = ts  (:,:,1,jp_sal,Kmm)
248         ssh_m(:,:) = ssh(:,:,Kmm)
249         e3t_m(:,:) = e3t (:,:,1,Kmm)
250         frq_m(:,:) = 1._wp
251         !
252      ENDIF
253      !
254      IF( .NOT. ln_traqsr )   fraqsr_1lev(:,:) = 1._wp   ! default definition: qsr 100% in the fisrt level
255      !
256      IF( lwxios.AND.nn_fsbc > 1 ) THEN
257         CALL iom_set_rstw_var_active('nn_fsbc')
258         CALL iom_set_rstw_var_active('ssu_m')
259         CALL iom_set_rstw_var_active('ssv_m')
260         CALL iom_set_rstw_var_active('sst_m')
261         CALL iom_set_rstw_var_active('sss_m')
262         CALL iom_set_rstw_var_active('ssh_m')
263         CALL iom_set_rstw_var_active('e3t_m')
264         CALL iom_set_rstw_var_active('frq_m')
265      ENDIF
266
267   END SUBROUTINE sbc_ssm_init
268
269   !!======================================================================
270END MODULE sbcssm
Note: See TracBrowser for help on using the repository browser.