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

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

Last change on this file since 3211 was 3211, checked in by spickles2, 13 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: 7.9 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   USE fldread         ! read input field
19   USE iom             ! I/O manager library
20   USE in_out_manager  ! I/O manager
21   USE lib_mpp         ! MPP library
22
23   IMPLICIT NONE
24   PRIVATE
25
26   PUBLIC   sbc_ice_if      ! routine called in sbcmod
27
28   TYPE(FLD), ALLOCATABLE, DIMENSION(:) ::   sf_ice   ! structure of input ice-cover (file informations, fields read)
29
30   !! * Control permutation of array indices
31#  include "oce_ftrans.h90"
32#  include "dom_oce_ftrans.h90"
33#  include "sbc_oce_ftrans.h90"
34   
35   !! * Substitutions
36#  include "domzgr_substitute.h90"
37   !!----------------------------------------------------------------------
38   !! NEMO/OPA 3.3 , NEMO Consortium (2010)
39   !! $Id$
40   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
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, emps  : 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      REAL(wp) ::   ztrp, zsice, zt_fzp, zfr_obs
65      REAL(wp) ::   zqri, zqrj, zqrp, zqi
66      !!
67      CHARACTER(len=100) ::   cn_dir              ! Root directory for location of ice-if files
68      TYPE(FLD_N)        ::   sn_ice              ! informations about the fields to be read
69      NAMELIST/namsbc_iif/ cn_dir, sn_ice
70      !!---------------------------------------------------------------------
71      !                                         ! ====================== !
72      IF( kt == nit000 ) THEN                   !  First call kt=nit000  !
73         !                                      ! ====================== !
74         ! set file information
75         cn_dir = './'        ! directory in which the model is executed
76         ! ... default values (NB: frequency positive => hours, negative => months)
77         !             !   file    ! frequency !  variable  ! time intep !  clim  ! 'yearly' or ! weights  ! rotation   !
78         !             !   name    !  (hours)  !   name     !   (T/F)    !  (T/F) !  'monthly'  ! filename ! pairs      !
79         sn_ice = FLD_N('ice_cover',    -1    ,  'ice_cov' ,  .true.    , .true. ,   'yearly'  , ''       , ''         )
80
81         REWIND ( numnam )               ! ... read in namlist namiif
82         READ   ( numnam, namsbc_iif )
83
84         ALLOCATE( sf_ice(1), STAT=ierror )
85         IF( ierror > 0 )   CALL ctl_stop( 'STOP', 'sbc_ice_if: unable to allocate sf_ice structure' )
86         ALLOCATE( sf_ice(1)%fnow(jpi,jpj,1) )
87         IF( sn_ice%ln_tint )   ALLOCATE( sf_ice(1)%fdta(jpi,jpj,1,2) )
88
89         ! fill sf_ice with sn_ice and control print
90         CALL fld_fill( sf_ice, (/ sn_ice /), cn_dir, 'sbc_ice_if', 'ice-if sea-ice model', 'namsbc_iif' )
91         !
92      ENDIF
93
94      CALL fld_read( kt, nn_fsbc, sf_ice )           ! Read input fields and provides the
95      !                                              ! input fields at the current time-step
96     
97      IF( MOD( kt-1, nn_fsbc) == 0 ) THEN
98         !
99         ztrp = -40.             ! restoring terme for temperature (w/m2/k)
100         zsice = - 0.04 / 0.8    ! ratio of isohaline compressibility over isotherme compressibility
101                                 ! ( d rho / dt ) / ( d rho / ds )      ( s = 34, t = -1.8 )
102         
103#if defined key_z_first
104         fr_i(:,:) = tfreez( sss_m ) * tmask_1(:,:)       ! sea surface freezing temperature [Celcius]
105#else
106         fr_i(:,:) = tfreez( sss_m ) * tmask(:,:,1)      ! sea surface freezing temperature [Celcius]
107#endif
108
109         ! Flux and ice fraction computation
110!CDIR COLLAPSE
111         DO jj = 1, jpj
112            DO ji = 1, jpi
113               !
114               zt_fzp  = fr_i(ji,jj)                        ! freezing point temperature
115               zfr_obs = sf_ice(1)%fnow(ji,jj,1)            ! observed ice cover
116               !                                            ! ocean ice fraction (0/1) from the freezing point temperature
117               IF( sst_m(ji,jj) <= zt_fzp ) THEN   ;   fr_i(ji,jj) = 1.e0
118               ELSE                                ;   fr_i(ji,jj) = 0.e0
119               ENDIF
120
121               tn(ji,jj,1) = MAX( tn(ji,jj,1), zt_fzp )     ! avoid over-freezing point temperature
122
123               qsr(ji,jj) = ( 1. - zfr_obs ) * qsr(ji,jj)   ! solar heat flux : zero below observed ice cover
124
125               !                                            ! non solar heat flux : add a damping term
126               !      # ztrp*(t-(tgel-1.))  if observed ice and no opa ice   (zfr_obs=1 fr_i=0)
127               !      # ztrp*min(0,t-tgel)  if observed ice and opa ice      (zfr_obs=1 fr_i=1)
128               zqri = ztrp * ( tb(ji,jj,1) - ( zt_fzp - 1.) )
129               zqrj = ztrp * MIN( 0., tb(ji,jj,1) - zt_fzp )
130#if defined key_z_first
131               zqrp = ( zfr_obs * ( (1. - fr_i(ji,jj) ) * zqri    &
132                 &                 +      fr_i(ji,jj)   * zqrj ) ) * tmask_1(ji,jj)
133#else
134               zqrp = ( zfr_obs * ( (1. - fr_i(ji,jj) ) * zqri    &
135                 &                 +      fr_i(ji,jj)   * zqrj ) ) * tmask(ji,jj,1)
136#endif
137
138               !                                            ! non-solar heat flux
139               !      # qns unchanged              if no climatological ice              (zfr_obs=0)
140               !      # qns = zqrp                 if climatological ice and no opa ice  (zfr_obs=1, fr_i=0)
141               !      # qns = zqrp -2(-4) watt/m2  if climatological ice and opa ice     (zfr_obs=1, fr_i=1)
142               !                                   (-2=arctic, -4=antarctic)   
143               zqi = -3. + SIGN( 1.e0, ff(ji,jj) )
144#if defined key_z_first
145               qns(ji,jj) = ( ( 1.- zfr_obs ) * qns(ji,jj)                             &
146                  &          +      zfr_obs   * fr_i(ji,jj) * zqi ) * tmask_1(ji,jj)    &
147                  &       + zqrp
148#else
149               qns(ji,jj) = ( ( 1.- zfr_obs ) * qns(ji,jj)                             &
150                  &          +      zfr_obs   * fr_i(ji,jj) * zqi ) * tmask(ji,jj,1)   &
151                  &       + zqrp
152#endif
153            END DO
154         END DO
155         !
156      ENDIF
157      !
158   END SUBROUTINE sbc_ice_if
159
160   !!======================================================================
161END MODULE sbcice_if
Note: See TracBrowser for help on using the repository browser.