source: NEMO/trunk/src/OCE/SBC/sbcice_if.F90 @ 12377

Last change on this file since 12377 was 12377, checked in by acc, 13 months 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: 7.2 KB
Line 
1MODULE sbcice_if
2   !!======================================================================
3   !!                       ***  MODULE  sbcice  ***
4   !! Surface module :  update surface ocean boundary condition over ice
5   !!                   covered area using ice-if model
6   !!======================================================================
7   !! History :  3.0  !  2006-06  (G. Madec)  Original code
8   !!----------------------------------------------------------------------
9
10   !!----------------------------------------------------------------------
11   !!   sbc_ice_if    : update sbc in ice-covered area
12   !!----------------------------------------------------------------------
13   USE oce            ! ocean dynamics and tracers
14   USE dom_oce        ! ocean space and time domain
15   USE phycst         ! physical constants
16   USE eosbn2         ! equation of state
17   USE sbc_oce        ! surface boundary condition: ocean fields
18#if defined key_si3
19   USE ice            , ONLY :   a_i
20#else
21   USE sbc_ice        , ONLY :   a_i 
22#endif
23   !
24   USE in_out_manager ! I/O manager
25   USE iom            ! I/O manager library
26   USE fldread        ! read input field
27   USE lib_mpp        ! MPP library
28   USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 
29
30   IMPLICIT NONE
31   PRIVATE
32
33   PUBLIC   sbc_ice_if      ! routine called in sbcmod
34
35   TYPE(FLD), ALLOCATABLE, DIMENSION(:) ::   sf_ice   ! structure of input ice-cover (file informations, fields read)
36   
37   !! * Substitutions
38#  include "do_loop_substitute.h90"
39   !!----------------------------------------------------------------------
40   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
41   !! $Id$
42   !! Software governed by the CeCILL license (see ./LICENSE)
43   !!----------------------------------------------------------------------
44CONTAINS
45
46   SUBROUTINE sbc_ice_if( kt, Kbb, Kmm )
47      !!---------------------------------------------------------------------
48      !!                     ***  ROUTINE sbc_ice_if  ***
49      !!
50      !! ** Purpose :   handle surface boundary condition over ice cover area
51      !!      when sea-ice model are not used
52      !!
53      !! ** Method  : - read sea-ice cover climatology
54      !!              - blah blah blah, ...
55      !!
56      !! ** Action  :   utau, vtau : remain unchanged
57      !!                taum, wndm : remain unchanged
58      !!                qns, qsr   : update heat flux below sea-ice
59      !!                emp, sfx   : update freshwater flux below sea-ice
60      !!                fr_i       : update the ice fraction
61      !!---------------------------------------------------------------------
62      INTEGER, INTENT(in) ::   kt   ! ocean time step
63      INTEGER, INTENT(in) ::   Kbb, Kmm   ! ocean time level indices
64      !
65      INTEGER  ::   ji, jj     ! dummy loop indices
66      INTEGER  ::   ierror     ! return error code
67      INTEGER  ::   ios        ! Local integer output status for namelist read
68      REAL(wp) ::   ztrp, zsice, zt_fzp, zfr_obs
69      REAL(wp) ::   zqri, zqrj, zqrp, zqi
70      !!
71      CHARACTER(len=100) ::   cn_dir              ! Root directory for location of ice-if files
72      TYPE(FLD_N)        ::   sn_ice              ! informations about the fields to be read
73      NAMELIST/namsbc_iif/ cn_dir, sn_ice
74      !!---------------------------------------------------------------------
75      !                                         ! ====================== !
76      IF( kt == nit000 ) THEN                   !  First call kt=nit000  !
77         !                                      ! ====================== !
78         ! set file information
79         READ  ( numnam_ref, namsbc_iif, IOSTAT = ios, ERR = 901)
80901      IF( ios /= 0 )   CALL ctl_nam ( ios , 'namsbc_iif in reference namelist' )
81
82         READ  ( numnam_cfg, namsbc_iif, IOSTAT = ios, ERR = 902 )
83902      IF( ios >  0 )   CALL ctl_nam ( ios , 'namsbc_iif in configuration namelist' )
84         IF(lwm) WRITE ( numond, namsbc_iif )
85
86         ALLOCATE( sf_ice(1), STAT=ierror )
87         IF( ierror > 0 )   CALL ctl_stop( 'STOP', 'sbc_ice_if: unable to allocate sf_ice structure' )
88         ALLOCATE( sf_ice(1)%fnow(jpi,jpj,1) )
89         IF( sn_ice%ln_tint )   ALLOCATE( sf_ice(1)%fdta(jpi,jpj,1,2) )
90
91         ! fill sf_ice with sn_ice and control print
92         CALL fld_fill( sf_ice, (/ sn_ice /), cn_dir, 'sbc_ice_if', 'ice-if sea-ice model', 'namsbc_iif' )
93         !
94      ENDIF
95
96      CALL fld_read( kt, nn_fsbc, sf_ice )           ! Read input fields and provides the
97      !                                              ! input fields at the current time-step
98     
99      IF( MOD( kt-1, nn_fsbc) == 0 ) THEN
100         !
101         ztrp = -40.             ! restoring terme for temperature (w/m2/k)
102         zsice = - 0.04 / 0.8    ! ratio of isohaline compressibility over isotherme compressibility
103                                 ! ( d rho / dt ) / ( d rho / ds )      ( s = 34, t = -1.8 )
104         
105         CALL eos_fzp( sss_m(:,:), fr_i(:,:) )       ! sea surface freezing temperature [Celsius]
106         fr_i(:,:) = fr_i(:,:) * tmask(:,:,1)
107
108         IF( ln_cpl )   a_i(:,:,1) = fr_i(:,:)         
109
110         ! Flux and ice fraction computation
111         DO_2D_11_11
112            !
113            zt_fzp  = fr_i(ji,jj)                        ! freezing point temperature
114            zfr_obs = sf_ice(1)%fnow(ji,jj,1)            ! observed ice cover
115            !                                            ! ocean ice fraction (0/1) from the freezing point temperature
116            IF( sst_m(ji,jj) <= zt_fzp ) THEN   ;   fr_i(ji,jj) = 1.e0
117            ELSE                                ;   fr_i(ji,jj) = 0.e0
118            ENDIF
119
120            ts(ji,jj,1,jp_tem,Kmm) = MAX( ts(ji,jj,1,jp_tem,Kmm), zt_fzp )     ! avoid over-freezing point temperature
121
122            qsr(ji,jj) = ( 1. - zfr_obs ) * qsr(ji,jj)   ! solar heat flux : zero below observed ice cover
123
124            !                                            ! non solar heat flux : add a damping term
125            !      # ztrp*(t-(tgel-1.))  if observed ice and no opa ice   (zfr_obs=1 fr_i=0)
126            !      # ztrp*min(0,t-tgel)  if observed ice and opa ice      (zfr_obs=1 fr_i=1)
127            zqri = ztrp * ( ts(ji,jj,1,jp_tem,Kbb) - ( zt_fzp - 1.) )
128            zqrj = ztrp * MIN( 0., ts(ji,jj,1,jp_tem,Kbb) - zt_fzp )
129            zqrp = ( zfr_obs * ( (1. - fr_i(ji,jj) ) * zqri    &
130              &                 +      fr_i(ji,jj)   * zqrj ) ) * tmask(ji,jj,1)
131
132            !                                            ! non-solar heat flux
133            !      # qns unchanged              if no climatological ice              (zfr_obs=0)
134            !      # qns = zqrp                 if climatological ice and no opa ice  (zfr_obs=1, fr_i=0)
135            !      # qns = zqrp -2(-4) watt/m2  if climatological ice and opa ice     (zfr_obs=1, fr_i=1)
136            !                                   (-2=arctic, -4=antarctic)   
137            zqi = -3. + SIGN( 1._wp, ff_f(ji,jj) )
138            qns(ji,jj) = ( ( 1.- zfr_obs ) * qns(ji,jj)                             &
139               &          +      zfr_obs   * fr_i(ji,jj) * zqi ) * tmask(ji,jj,1)   &
140               &       + zqrp
141         END_2D
142         !
143      ENDIF
144      !
145   END SUBROUTINE sbc_ice_if
146
147   !!======================================================================
148END MODULE sbcice_if
Note: See TracBrowser for help on using the repository browser.