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

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

Last change on this file was 13295, checked in by acc, 4 years ago

Replace do-loop macros in the trunk with alternative forms with greater flexibility for extra halo applications. This alters a lot of routines but does not change any behaviour or results. do_loop_substitute.h90 is greatly simplified by this change. SETTE results are identical to those with the previous revision

  • Property svn:keywords set to Id
File size: 7.2 KB
RevLine 
[888]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   !!======================================================================
[3625]7   !! History :  3.0  !  2006-06  (G. Madec)  Original code
[888]8   !!----------------------------------------------------------------------
9
10   !!----------------------------------------------------------------------
[3625]11   !!   sbc_ice_if    : update sbc in ice-covered area
[888]12   !!----------------------------------------------------------------------
[3625]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
[9570]18#if defined key_si3
[9168]19   USE ice            , ONLY :   a_i
[4990]20#else
[9168]21   USE sbc_ice        , ONLY :   a_i 
[4990]22#endif
[9168]23   !
24   USE in_out_manager ! I/O manager
25   USE iom            ! I/O manager library
[3625]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) 
[888]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   
[12377]37   !! * Substitutions
38#  include "do_loop_substitute.h90"
[888]39   !!----------------------------------------------------------------------
[9598]40   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
[1152]41   !! $Id$
[10068]42   !! Software governed by the CeCILL license (see ./LICENSE)
[888]43   !!----------------------------------------------------------------------
44CONTAINS
45
[12377]46   SUBROUTINE sbc_ice_if( kt, Kbb, Kmm )
[888]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      !!
[1037]56      !! ** Action  :   utau, vtau : remain unchanged
[1695]57      !!                taum, wndm : remain unchanged
[1037]58      !!                qns, qsr   : update heat flux below sea-ice
[3625]59      !!                emp, sfx   : update freshwater flux below sea-ice
[1037]60      !!                fr_i       : update the ice fraction
[888]61      !!---------------------------------------------------------------------
[2715]62      INTEGER, INTENT(in) ::   kt   ! ocean time step
[12377]63      INTEGER, INTENT(in) ::   Kbb, Kmm   ! ocean time level indices
[888]64      !
[1037]65      INTEGER  ::   ji, jj     ! dummy loop indices
66      INTEGER  ::   ierror     ! return error code
[4147]67      INTEGER  ::   ios        ! Local integer output status for namelist read
[1037]68      REAL(wp) ::   ztrp, zsice, zt_fzp, zfr_obs
69      REAL(wp) ::   zqri, zqrj, zqrp, zqi
70      !!
[888]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
[4147]79         READ  ( numnam_ref, namsbc_iif, IOSTAT = ios, ERR = 901)
[11536]80901      IF( ios /= 0 )   CALL ctl_nam ( ios , 'namsbc_iif in reference namelist' )
[888]81
[4147]82         READ  ( numnam_cfg, namsbc_iif, IOSTAT = ios, ERR = 902 )
[11536]83902      IF( ios >  0 )   CALL ctl_nam ( ios , 'namsbc_iif in configuration namelist' )
[4624]84         IF(lwm) WRITE ( numond, namsbc_iif )
[888]85
86         ALLOCATE( sf_ice(1), STAT=ierror )
[2715]87         IF( ierror > 0 )   CALL ctl_stop( 'STOP', 'sbc_ice_if: unable to allocate sf_ice structure' )
[2528]88         ALLOCATE( sf_ice(1)%fnow(jpi,jpj,1) )
[2715]89         IF( sn_ice%ln_tint )   ALLOCATE( sf_ice(1)%fdta(jpi,jpj,1,2) )
[888]90
[1133]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' )
[888]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 )
[1037]104         
[7646]105         CALL eos_fzp( sss_m(:,:), fr_i(:,:) )       ! sea surface freezing temperature [Celsius]
[5541]106         fr_i(:,:) = fr_i(:,:) * tmask(:,:,1)
[4161]107
[5407]108         IF( ln_cpl )   a_i(:,:,1) = fr_i(:,:)         
[1037]109
110         ! Flux and ice fraction computation
[13295]111         DO_2D( 1, 1, 1, 1 )
[12377]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
[888]119
[12377]120            ts(ji,jj,1,jp_tem,Kmm) = MAX( ts(ji,jj,1,jp_tem,Kmm), zt_fzp )     ! avoid over-freezing point temperature
[888]121
[12377]122            qsr(ji,jj) = ( 1. - zfr_obs ) * qsr(ji,jj)   ! solar heat flux : zero below observed ice cover
[888]123
[12377]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)
[888]131
[12377]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
[888]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.