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/branches/2019/dev_r11613_ENHANCE-04_namelists_as_internalfiles/src/OCE/SBC – NEMO

source: NEMO/branches/2019/dev_r11613_ENHANCE-04_namelists_as_internalfiles/src/OCE/SBC/sbcice_if.F90 @ 11671

Last change on this file since 11671 was 11671, checked in by acc, 5 years ago

Branch 2019/dev_r11613_ENHANCE-04_namelists_as_internalfiles. Final, non-substantive changes to complete this branch. These changes remove all REWIND statements on the old namelist fortran units (now character variables for internal files). These changes have been left until last since they are easily repeated via a script and it may be preferable to use the previous revision for merge purposes and reapply these last changes separately. This branch has been fully SETTE tested.

  • 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   !!----------------------------------------------------------------------
38   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
39   !! $Id$
40   !! Software governed by the CeCILL license (see ./LICENSE)
41   !!----------------------------------------------------------------------
42CONTAINS
43
44   SUBROUTINE sbc_ice_if( kt )
45      !!---------------------------------------------------------------------
46      !!                     ***  ROUTINE sbc_ice_if  ***
47      !!
48      !! ** Purpose :   handle surface boundary condition over ice cover area
49      !!      when sea-ice model are not used
50      !!
51      !! ** Method  : - read sea-ice cover climatology
52      !!              - blah blah blah, ...
53      !!
54      !! ** Action  :   utau, vtau : remain unchanged
55      !!                taum, wndm : remain unchanged
56      !!                qns, qsr   : update heat flux below sea-ice
57      !!                emp, sfx   : update freshwater flux below sea-ice
58      !!                fr_i       : update the ice fraction
59      !!---------------------------------------------------------------------
60      INTEGER, INTENT(in) ::   kt   ! ocean time step
61      !
62      INTEGER  ::   ji, jj     ! dummy loop indices
63      INTEGER  ::   ierror     ! return error code
64      INTEGER  ::   ios        ! Local integer output status for namelist read
65      REAL(wp) ::   ztrp, zsice, zt_fzp, zfr_obs
66      REAL(wp) ::   zqri, zqrj, zqrp, zqi
67      !!
68      CHARACTER(len=100) ::   cn_dir              ! Root directory for location of ice-if files
69      TYPE(FLD_N)        ::   sn_ice              ! informations about the fields to be read
70      NAMELIST/namsbc_iif/ cn_dir, sn_ice
71      !!---------------------------------------------------------------------
72      !                                         ! ====================== !
73      IF( kt == nit000 ) THEN                   !  First call kt=nit000  !
74         !                                      ! ====================== !
75         ! set file information
76         READ  ( numnam_ref, namsbc_iif, IOSTAT = ios, ERR = 901)
77901      IF( ios /= 0 )   CALL ctl_nam ( ios , 'namsbc_iif in reference namelist' )
78
79         READ  ( numnam_cfg, namsbc_iif, IOSTAT = ios, ERR = 902 )
80902      IF( ios >  0 )   CALL ctl_nam ( ios , 'namsbc_iif in configuration namelist' )
81         IF(lwm) WRITE ( numond, namsbc_iif )
82
83         ALLOCATE( sf_ice(1), STAT=ierror )
84         IF( ierror > 0 )   CALL ctl_stop( 'STOP', 'sbc_ice_if: unable to allocate sf_ice structure' )
85         ALLOCATE( sf_ice(1)%fnow(jpi,jpj,1) )
86         IF( sn_ice%ln_tint )   ALLOCATE( sf_ice(1)%fdta(jpi,jpj,1,2) )
87
88         ! fill sf_ice with sn_ice and control print
89         CALL fld_fill( sf_ice, (/ sn_ice /), cn_dir, 'sbc_ice_if', 'ice-if sea-ice model', 'namsbc_iif' )
90         !
91      ENDIF
92
93      CALL fld_read( kt, nn_fsbc, sf_ice )           ! Read input fields and provides the
94      !                                              ! input fields at the current time-step
95     
96      IF( MOD( kt-1, nn_fsbc) == 0 ) THEN
97         !
98         ztrp = -40.             ! restoring terme for temperature (w/m2/k)
99         zsice = - 0.04 / 0.8    ! ratio of isohaline compressibility over isotherme compressibility
100                                 ! ( d rho / dt ) / ( d rho / ds )      ( s = 34, t = -1.8 )
101         
102         CALL eos_fzp( sss_m(:,:), fr_i(:,:) )       ! sea surface freezing temperature [Celsius]
103         fr_i(:,:) = fr_i(:,:) * tmask(:,:,1)
104
105         IF( ln_cpl )   a_i(:,:,1) = fr_i(:,:)         
106
107         ! Flux and ice fraction computation
108         DO jj = 1, jpj
109            DO ji = 1, jpi
110               !
111               zt_fzp  = fr_i(ji,jj)                        ! freezing point temperature
112               zfr_obs = sf_ice(1)%fnow(ji,jj,1)            ! observed ice cover
113               !                                            ! ocean ice fraction (0/1) from the freezing point temperature
114               IF( sst_m(ji,jj) <= zt_fzp ) THEN   ;   fr_i(ji,jj) = 1.e0
115               ELSE                                ;   fr_i(ji,jj) = 0.e0
116               ENDIF
117
118               tsn(ji,jj,1,jp_tem) = MAX( tsn(ji,jj,1,jp_tem), zt_fzp )     ! avoid over-freezing point temperature
119
120               qsr(ji,jj) = ( 1. - zfr_obs ) * qsr(ji,jj)   ! solar heat flux : zero below observed ice cover
121
122               !                                            ! non solar heat flux : add a damping term
123               !      # ztrp*(t-(tgel-1.))  if observed ice and no opa ice   (zfr_obs=1 fr_i=0)
124               !      # ztrp*min(0,t-tgel)  if observed ice and opa ice      (zfr_obs=1 fr_i=1)
125               zqri = ztrp * ( tsb(ji,jj,1,jp_tem) - ( zt_fzp - 1.) )
126               zqrj = ztrp * MIN( 0., tsb(ji,jj,1,jp_tem) - zt_fzp )
127               zqrp = ( zfr_obs * ( (1. - fr_i(ji,jj) ) * zqri    &
128                 &                 +      fr_i(ji,jj)   * zqrj ) ) * tmask(ji,jj,1)
129
130               !                                            ! non-solar heat flux
131               !      # qns unchanged              if no climatological ice              (zfr_obs=0)
132               !      # qns = zqrp                 if climatological ice and no opa ice  (zfr_obs=1, fr_i=0)
133               !      # qns = zqrp -2(-4) watt/m2  if climatological ice and opa ice     (zfr_obs=1, fr_i=1)
134               !                                   (-2=arctic, -4=antarctic)   
135               zqi = -3. + SIGN( 1._wp, ff_f(ji,jj) )
136               qns(ji,jj) = ( ( 1.- zfr_obs ) * qns(ji,jj)                             &
137                  &          +      zfr_obs   * fr_i(ji,jj) * zqi ) * tmask(ji,jj,1)   &
138                  &       + zqrp
139            END DO
140         END DO
141         !
142      ENDIF
143      !
144   END SUBROUTINE sbc_ice_if
145
146   !!======================================================================
147END MODULE sbcice_if
Note: See TracBrowser for help on using the repository browser.