MODULE limtrp !!====================================================================== !! *** MODULE limtrp *** !! LIM transport ice model : sea-ice advection/diffusion !!====================================================================== #if defined key_lim3 !!---------------------------------------------------------------------- !! 'key_lim3' LIM3 sea-ice model !!---------------------------------------------------------------------- !! lim_trp : advection/diffusion process of sea ice !! lim_trp_init : initialization and namelist read !!---------------------------------------------------------------------- !! * Modules used USE phycst USE dom_oce USE daymod USE in_out_manager ! I/O manager USE ice_oce ! ice variables USE dom_ice USE ice USE iceini USE limistate USE limadv USE limhdf USE lbclnk USE lib_mpp USE par_ice USE prtctl ! Print control IMPLICIT NONE PRIVATE !! * Routine accessibility PUBLIC lim_trp ! called by ice_step !! * Shared module variables REAL(wp), PUBLIC :: & !: bound = 0.e0 !: boundary condit. (0.0 no-slip, 1.0 free-slip) !! * Module variables REAL(wp) :: & ! constant values epsi06 = 1.e-06 , & epsi03 = 1.e-03 , & epsi16 = 1.e-16 , & rzero = 0.e0 , & rone = 1.e0 , & zeps10 = 1.e-10 !! * Substitution # include "vectopt_loop_substitute.h90" !!---------------------------------------------------------------------- !! LIM 3.0, UCL-ASTR-LOCEAN-IPSL (2008) !! $Header: /home/opalod/NEMOCVSROOT/NEMO/LIM_SRC/limtrp.F90,v 1.5 2005/03/27 18:34:42 opalod Exp $ !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt !!---------------------------------------------------------------------- CONTAINS SUBROUTINE lim_trp !!------------------------------------------------------------------- !! *** ROUTINE lim_trp *** !! !! ** purpose : advection/diffusion process of sea ice !! !! ** method : variables included in the process are scalar, !! other values are considered as second order. !! For advection, a second order Prather scheme is used. !! !! ** action : !! !! History : !! 1.0 ! 00-01 (M.A. Morales Maqueda, H. Goosse, and T. Fichefet) Original code !! ! 01-05 (G. Madec, R. Hordoir) opa norm !! 2.0 ! 04-01 (G. Madec, C. Ethe) F90, mpp !! 3.0 ! 05-11 (M. Vancoppenolle) Multi-layer sea ice, salinity variations !!--------------------------------------------------------------------- !! * Local Variables INTEGER :: ji, jj, jk, jl, layer, & ! dummy loop indices initad ! number of sub-timestep for the advection INTEGER :: ji_maxu, ji_maxv, jj_maxu, jj_maxv REAL(wp) :: & zindb , & zindsn , & zindic , & zusvosn, & zusvoic, & zvbord , & zcfl , & zusnit , & zrtt, zsal, zage, & zbigval, ze, & zmaxu, zmaxv REAL(wp), DIMENSION(jpi,jpj) :: & ! temporary workspace zui_u , zvi_v , zsm , & zs0at, zs0ow REAL(wp), DIMENSION(jpi,jpj,jpl):: & ! temporary workspace zs0ice, zs0sn, zs0a , & zs0c0 , & zs0sm , zs0oi ! MHE Multilayer heat content REAL(wp), DIMENSION(jpi,jpj,jkmax,jpl) :: & ! temporary workspace zs0e !--------------------------------------------------------------------- IF( numit == nstart ) CALL lim_trp_init ! Initialization (first time-step only) zsm(:,:) = area(:,:) IF( ln_limdyn ) THEN WRITE(numout,*) WRITE(numout,*) ' lim_trp : Ice Advection' WRITE(numout,*) ' ~~~~~~~' !-----------------------------------------------------------------------------! ! 1) CFL Test !-----------------------------------------------------------------------------! !------------------------------------------ ! ice velocities at ocean U- and V-points !------------------------------------------ ! zvbord factor between 1 and 2 to take into account slip or no-slip boundary conditions. zvbord = 1.0 + ( 1.0 - bound ) DO jj = 1, jpjm1 DO ji = 1, jpim1 zui_u(ji,jj) = u_ice(ji,jj) zvi_v(ji,jj) = v_ice(ji,jj) END DO END DO ! Lateral boundary conditions CALL lbc_lnk( zui_u, 'U', -1. ) CALL lbc_lnk( zvi_v, 'V', -1. ) !------------------------- ! CFL test for stability !------------------------- zcfl = 0.e0 zcfl = MAX( zcfl, MAXVAL( ABS( zui_u(1:jpim1, : ) ) * rdt_ice / e1u(1:jpim1, : ) ) ) zcfl = MAX( zcfl, MAXVAL( ABS( zvi_v( : ,1:jpjm1) ) * rdt_ice / e2v( : ,1:jpjm1) ) ) zmaxu = 0.0 zmaxv = 0.0 DO ji = 1, jpim1 DO jj = 1, jpjm1 IF ( (ABS(zui_u(ji,jj)) .GT. zmaxu) ) THEN zmaxu = MAX(zui_u(ji,jj), zmaxu ) ji_maxu = ji jj_maxu = jj ENDIF IF ( (ABS(zvi_v(ji,jj)) .GT. zmaxv) ) THEN zmaxv = MAX(zvi_v(ji,jj), zmaxv ) ji_maxv = ji jj_maxv = jj ENDIF END DO END DO IF (lk_mpp ) CALL mpp_max(zcfl) IF ( zcfl > 0.5 .AND. lwp ) & WRITE(numout,*) 'lim_trp : violation of cfl criterion the ',nday,'th day, cfl = ',zcfl !-----------------------------------------------------------------------------! ! 2) Computation of transported fields !-----------------------------------------------------------------------------! !------------------------------------------------------ ! 1.1) Snow vol, ice vol, salt and age contents, area !------------------------------------------------------ zs0ow (:,:) = ato_i(:,:) * area(:,:) ! Open water area DO jl = 1, jpl !sum over thickness categories ! area -> is the unmasked and masked area of T-grid cell zs0sn (:,:,jl) = v_s(:,:,jl) * area(:,:) ! Snow volume. zs0ice(:,:,jl) = v_i(:,:,jl) * area(:,:) ! Ice volume. zs0a (:,:,jl) = a_i(:,:,jl) * area(:,:) ! Ice area zs0sm (:,:,jl) = smv_i(:,:,jl) * area(:,:) ! Salt content zs0oi (:,:,jl) = oa_i (:,:,jl) * area(:,:) ! Age content !---------------------------------- ! 1.2) Ice and snow heat contents !---------------------------------- zs0c0 (:,:,jl) = e_s(:,:,1,jl) ! Snow heat cont. DO jk = 1, nlay_i zs0e(:,:,jk,jl) = e_i(:,:,jk,jl) ! Ice heat content END DO END DO !-----------------------------------------------------------------------------! ! 3) Advection of Ice fields !-----------------------------------------------------------------------------! ! If ice drift field is too fast, use an appropriate time step for advection. initad = 1 + INT( MAX( rzero, SIGN( rone, zcfl-0.5 ) ) ) zusnit = 1.0 / REAL( initad ) IF ( MOD( nday , 2 ) == 0) THEN DO jk = 1,initad !--- ice open water area CALL lim_adv_x( zusnit, zui_u, rone , zsm, zs0ow(:,:) , sxopw(:,:) , & sxxopw(:,:), syopw(:,:) , & syyopw(:,:), sxopw(:,:) ) CALL lim_adv_y( zusnit, zvi_v, rzero, zsm, zs0ow(:,:) , sxopw (:,:) , & sxxopw(:,:), syopw (:,:) , & syyopw(:,:), sxyopw(:,:) ) DO jl = 1, jpl !--- ice volume --- CALL lim_adv_x( zusnit, zui_u, rone , zsm, zs0ice(:,:,jl) , sxice (:,:,jl) , & sxxice(:,:,jl) , syice (:,:,jl) , & syyice(:,:,jl) , sxyice(:,:,jl) ) CALL lim_adv_y( zusnit, zvi_v, rzero, zsm, zs0ice(:,:,jl) , sxice (:,:,jl) , & sxxice(:,:,jl) , syice (:,:,jl) , & syyice(:,:,jl) , sxyice(:,:,jl) ) !--- snow volume --- CALL lim_adv_x( zusnit, zui_u, rone , zsm, zs0sn (:,:,jl) , sxsn (:,:,jl) , & sxxsn (:,:,jl) , sysn (:,:,jl) , & syysn (:,:,jl) , sxysn (:,:,jl) ) CALL lim_adv_y( zusnit, zvi_v, rzero, zsm, zs0sn (:,:,jl) , sxsn (:,:,jl) , & sxxsn (:,:,jl) , sysn (:,:,jl) , & syysn (:,:,jl) , sxysn (:,:,jl) ) !--- ice salinity --- CALL lim_adv_x( zusnit, zui_u, rone , zsm, zs0sm (:,:,jl) , sxsal (:,:,jl) , & sxxsal(:,:,jl) , sysal (:,:,jl) , & syysal(:,:,jl) , sxysal(:,:,jl) ) CALL lim_adv_y( zusnit, zvi_v, rzero, zsm, zs0sm (:,:,jl) , sxsal (:,:,jl) , & sxxsal(:,:,jl) , sysal (:,:,jl) , & syysal(:,:,jl) , sxysal(:,:,jl) ) !--- ice age --- CALL lim_adv_x( zusnit, zui_u, rone , zsm, zs0oi (:,:,jl) , sxage (:,:,jl) , & sxxage(:,:,jl) , syage (:,:,jl) , & syyage(:,:,jl) , sxyage(:,:,jl) ) CALL lim_adv_y( zusnit, zvi_v, rzero, zsm, zs0oi (:,:,jl) , sxage (:,:,jl) , & sxxage(:,:,jl) , syage (:,:,jl) , & syyage(:,:,jl) , sxyage(:,:,jl) ) !--- ice concentrations --- CALL lim_adv_x( zusnit, zui_u, rone , zsm, zs0a (:,:,jl) , sxa (:,:,jl) , & sxxa (:,:,jl) , sya (:,:,jl) , & syya (:,:,jl) , sxya (:,:,jl) ) CALL lim_adv_y( zusnit, zvi_v, rzero, zsm, zs0a (:,:,jl) , sxa (:,:,jl) , & sxxa (:,:,jl) , sya (:,:,jl) , & syya (:,:,jl) , sxya (:,:,jl) ) !--- ice / snow thermal energetic contents --- CALL lim_adv_x( zusnit, zui_u, rone , zsm, zs0c0 (:,:,jl) , sxc0 (:,:,jl) , & sxxc0 (:,:,jl) , syc0 (:,:,jl) , & syyc0 (:,:,jl) , sxyc0 (:,:,jl) ) CALL lim_adv_y( zusnit, zvi_v, rzero, zsm, zs0c0 (:,:,jl) , sxc0 (:,:,jl) , & sxxc0 (:,:,jl) , syc0 (:,:,jl) , & syyc0 (:,:,jl) , sxyc0 (:,:,jl) ) DO layer = 1, nlay_i CALL lim_adv_x( zusnit, zui_u, rone , zsm, & zs0e(:,:,layer,jl) , sxe (:,:,layer,jl) , & sxxe(:,:,layer,jl) , sye (:,:,layer,jl) , & syye(:,:,layer,jl) , sxye(:,:,layer,jl) ) CALL lim_adv_y( zusnit, zvi_v, rzero, zsm, & zs0e(:,:,layer,jl) , sxe (:,:,layer,jl) , & sxxe(:,:,layer,jl) , sye (:,:,layer,jl) , & syye(:,:,layer,jl) , sxye(:,:,layer,jl) ) END DO END DO END DO ELSE DO jk = 1, initad !--- ice volume --- CALL lim_adv_y( zusnit, zvi_v, rone , zsm, zs0ow (:,:) , sxopw (:,:) , & sxxopw(:,:) , syopw (:,:) , & syyopw(:,:) , sxyopw(:,:) ) CALL lim_adv_x( zusnit, zui_u, rzero, zsm, zs0ow (:,:) , sxopw (:,:) , & sxxopw(:,:) , syopw (:,:) , & syyopw(:,:) , sxyopw(:,:) ) DO jl = 1, jpl !--- ice volume --- CALL lim_adv_y( zusnit, zvi_v, rone , zsm, zs0ice(:,:,jl) , sxice (:,:,jl) , & sxxice(:,:,jl) , syice (:,:,jl) , & syyice(:,:,jl) , sxyice(:,:,jl) ) CALL lim_adv_x( zusnit, zui_u, rzero, zsm, zs0ice(:,:,jl) , sxice (:,:,jl) , & sxxice(:,:,jl) , syice (:,:,jl) , & syyice(:,:,jl) , sxyice(:,:,jl) ) !--- snow volume --- CALL lim_adv_y( zusnit, zvi_v, rone , zsm, zs0sn (:,:,jl) , sxsn (:,:,jl) , & sxxsn (:,:,jl) , sysn (:,:,jl) , & syysn (:,:,jl) , sxysn (:,:,jl) ) CALL lim_adv_x( zusnit, zui_u, rzero, zsm, zs0sn (:,:,jl) , sxsn (:,:,jl) , & sxxsn (:,:,jl) , sysn (:,:,jl) , & syysn (:,:,jl) , sxysn (:,:,jl) ) !--- ice salinity --- CALL lim_adv_y( zusnit, zvi_v, rone , zsm, zs0sm (:,:,jl) , sxsal (:,:,jl) , & sxxsal(:,:,jl) , sysal (:,:,jl) , & syysal(:,:,jl) , sxysal(:,:,jl) ) CALL lim_adv_x( zusnit, zui_u, rzero, zsm, zs0sm (:,:,jl) , sxsal (:,:,jl) , & sxxsal(:,:,jl) , sysal (:,:,jl) , & syysal(:,:,jl) , sxysal(:,:,jl) ) !--- ice age --- CALL lim_adv_y( zusnit, zvi_v, rone , zsm, zs0oi (:,:,jl) , sxage (:,:,jl) , & sxxage(:,:,jl) , syage (:,:,jl) , & syyage(:,:,jl) , sxyage(:,:,jl) ) CALL lim_adv_x( zusnit, zui_u, rzero, zsm, zs0oi (:,:,jl) , sxage (:,:,jl) , & sxxage(:,:,jl) , syage (:,:,jl) , & syyage(:,:,jl) , sxyage(:,:,jl) ) !--- ice concentration --- CALL lim_adv_y( zusnit, zvi_v, rone , zsm, zs0a (:,:,jl) , sxa (:,:,jl) , & sxxa (:,:,jl) , sya (:,:,jl) , & syya (:,:,jl) , sxya (:,:,jl) ) CALL lim_adv_x( zusnit, zui_u, rzero, zsm, zs0a (:,:,jl) , sxa (:,:,jl) , & sxxa (:,:,jl) , sya (:,:,jl) , & syya (:,:,jl) , sxya (:,:,jl) ) !--- ice / snow thermal energetic contents --- CALL lim_adv_y( zusnit, zvi_v, rone , zsm, zs0c0 (:,:,jl) , sxc0 (:,:,jl) , & sxxc0 (:,:,jl) , syc0 (:,:,jl) , & syyc0 (:,:,jl) , sxyc0 (:,:,jl) ) CALL lim_adv_x( zusnit, zui_u, rzero, zsm, zs0c0 (:,:,jl) , sxc0 (:,:,jl) , & sxxc0 (:,:,jl) , syc0 (:,:,jl) , & syyc0 (:,:,jl) , sxyc0 (:,:,jl) ) DO layer = 1, nlay_i CALL lim_adv_y( zusnit, zvi_v, rone , zsm, zs0e(:,:,layer,jl) , & sxe (:,:,layer,jl) , sxxe (:,:,layer,jl) , sye (:,:,layer,jl) , & syye (:,:,layer,jl), sxye (:,:,layer,jl) ) CALL lim_adv_x( zusnit, zui_u, rzero, zsm, zs0e(:,:,layer,jl) , & sxe (:,:,layer,jl) , sxxe (:,:,layer,jl) , sye (:,:,layer,jl) , & syye (:,:,layer,jl), sxye (:,:,layer,jl) ) END DO END DO END DO ENDIF !------------------------------------------- ! Recover the properties from their contents !------------------------------------------- zs0ow (:,:) = zs0ow(:,:) / area(:,:) DO jl = 1, jpl zs0ice(:,:,jl) = zs0ice(:,:,jl) / area(:,:) zs0sn (:,:,jl) = zs0sn (:,:,jl) / area(:,:) zs0sm (:,:,jl) = zs0sm (:,:,jl) / area(:,:) zs0oi (:,:,jl) = zs0oi (:,:,jl) / area(:,:) zs0a (:,:,jl) = zs0a (:,:,jl) / area(:,:) zs0c0 (:,:,jl) = zs0c0 (:,:,jl) / area(:,:) DO jk = 1, nlay_i zs0e(:,:,jk,jl) = zs0e(:,:,jk,jl) / area(:,:) END DO END DO !------------------------------------------------------------------------------! ! 4) Diffusion of Ice fields !------------------------------------------------------------------------------! !------------------------------------ ! 4.1) diffusion of open water area !------------------------------------ ! Compute total ice fraction zs0at(:,:) = 0.0 DO jl = 1, jpl DO jj = 1, jpj DO ji = 1, jpi zs0at (ji,jj) = zs0at(ji,jj) + zs0a(ji,jj,jl) ! END DO END DO END DO ! Masked eddy diffusivity coefficient at ocean U- and V-points DO jj = 1, jpjm1 ! NB: has not to be defined on jpj line and jpi row DO ji = 1 , fs_jpim1 ! vector opt. pahu(ji,jj) = ( 1.0 - MAX( rzero, SIGN( rone, -zs0at(ji ,jj) ) ) ) & & * ( 1.0 - MAX( rzero, SIGN( rone, -zs0at(ji+1,jj) ) ) ) * ahiu(ji,jj) pahv(ji,jj) = ( 1.0 - MAX( rzero, SIGN( rone, -zs0at(ji,jj ) ) ) ) & & * ( 1.0 - MAX( rzero, SIGN( rone,- zs0at(ji,jj+1) ) ) ) * ahiv(ji,jj) END DO !jj END DO ! ji ! Diffusion CALL lim_hdf( zs0ow (:,:) ) !---------------------------------------- ! 4.2) Diffusion of other ice variables !---------------------------------------- DO jl = 1, jpl ! Masked eddy diffusivity coefficient at ocean U- and V-points DO jj = 1, jpjm1 ! NB: has not to be defined on jpj line and jpi row DO ji = 1 , fs_jpim1 ! vector opt. pahu(ji,jj) = ( 1.0 - MAX( rzero, SIGN( rone, -zs0a(ji ,jj,jl) ) ) ) & & * ( 1.0 - MAX( rzero, SIGN( rone, -zs0a(ji+1,jj,jl) ) ) ) * ahiu(ji,jj) pahv(ji,jj) = ( 1.0 - MAX( rzero, SIGN( rone, -zs0a(ji,jj,jl ) ) ) ) & & * ( 1.0 - MAX( rzero, SIGN( rone,- zs0a(ji,jj+1,jl) ) ) ) * ahiv(ji,jj) END DO !jj END DO ! ji CALL lim_hdf( zs0ice (:,:,jl) ) CALL lim_hdf( zs0sn (:,:,jl) ) CALL lim_hdf( zs0sm (:,:,jl) ) CALL lim_hdf( zs0oi (:,:,jl) ) CALL lim_hdf( zs0a (:,:,jl) ) CALL lim_hdf( zs0c0 (:,:,jl) ) DO jk = 1, nlay_i CALL lim_hdf( zs0e (:,:,jk,jl) ) END DO ! jk END DO !jl !----------------------------------------- ! 4.3) Remultiply everything by ice area !----------------------------------------- zs0ow(:,:) = MAX(rzero, zs0ow(:,:) * area(:,:) ) DO jl = 1, jpl zs0ice(:,:,jl) = MAX( rzero, zs0ice(:,:,jl) * area(:,:) ) !!bug: est-ce utile zs0sn (:,:,jl) = MAX( rzero, zs0sn (:,:,jl) * area(:,:) ) !!bug: cf /area juste apres zs0sm (:,:,jl) = MAX( rzero, zs0sm (:,:,jl) * area(:,:) ) !!bug: cf /area juste apres zs0oi (:,:,jl) = MAX( rzero, zs0oi (:,:,jl) * area(:,:) ) zs0a (:,:,jl) = MAX( rzero, zs0a (:,:,jl) * area(:,:) ) !! suppress both change le resultat zs0c0 (:,:,jl) = MAX( rzero, zs0c0 (:,:,jl) * area(:,:) ) DO jk = 1, nlay_i zs0e(:,:,jk,jl) = MAX( rzero, zs0e (:,:,jk,jl) * area(:,:) ) END DO ! jk END DO ! jl !------------------------------------------------------------------------------! ! 5) Update and limit ice properties after transport !------------------------------------------------------------------------------! !-------------------------------------------------- ! 5.1) Recover mean values over the grid squares. !-------------------------------------------------- DO jl = 1, jpl DO jk = 1, nlay_i DO jj = 1, jpj DO ji = 1, jpi zs0e (ji,jj,jk,jl) = & MAX( rzero, zs0e (ji,jj,jk,jl) / area(ji,jj) ) END DO END DO END DO END DO DO jj = 1, jpj DO ji = 1, jpi zs0ow (ji,jj) = MAX( rzero, zs0ow (ji,jj) / area(ji,jj) ) END DO END DO zs0at(:,:) = 0.0 DO jl = 1, jpl DO jj = 1, jpj DO ji = 1, jpi zs0sn (ji,jj,jl) = MAX( rzero, zs0sn (ji,jj,jl)/area(ji,jj) ) zs0ice(ji,jj,jl) = MAX( rzero, zs0ice(ji,jj,jl)/area(ji,jj) ) zs0sm (ji,jj,jl) = MAX( rzero, zs0sm (ji,jj,jl)/area(ji,jj) ) zs0oi (ji,jj,jl) = MAX( rzero, zs0oi (ji,jj,jl)/area(ji,jj) ) zs0a (ji,jj,jl) = MAX( rzero, zs0a (ji,jj,jl)/area(ji,jj) ) zs0c0 (ji,jj,jl) = MAX( rzero, zs0c0 (ji,jj,jl)/area(ji,jj) ) zs0at (ji,jj) = zs0at(ji,jj) + zs0a(ji,jj,jl) END DO END DO END DO !--------------------------------------------------------- ! 5.2) Snow thickness, Ice thickness, Ice concentrations !--------------------------------------------------------- DO jj = 1, jpj DO ji = 1, jpi zindb = MAX( 0.0 , SIGN( 1.0, zs0at(ji,jj) - zeps10) ) zs0ow(ji,jj) = (1.0 - zindb) + zindb*MAX( zs0ow(ji,jj), 0.00 ) ato_i(ji,jj) = zs0ow(ji,jj) END DO END DO ! Remove very small areas DO jl = 1, jpl DO jj = 1, jpj DO ji = 1, jpi zindb = MAX( 0.0 , SIGN( 1.0, zs0a(ji,jj,jl) - zeps10) ) zs0a(ji,jj,jl) = zindb * MIN( zs0a(ji,jj,jl), 0.99 ) v_s(ji,jj,jl) = zindb * zs0sn (ji,jj,jl) v_i(ji,jj,jl) = zindb * zs0ice(ji,jj,jl) zindsn = MAX( rzero, SIGN( rone, v_s(ji,jj,jl) - zeps10 ) ) zindic = MAX( rzero, SIGN( rone, v_i(ji,jj,jl) - zeps10 ) ) zindb = MAX( zindsn, zindic ) zs0a (ji,jj,jl) = zindb * zs0a(ji,jj,jl) !ice concentration a_i (ji,jj,jl) = zs0a(ji,jj,jl) v_s (ji,jj,jl) = zindsn * v_s(ji,jj,jl) v_i (ji,jj,jl) = zindic * v_i(ji,jj,jl) END DO END DO END DO DO jj = 1, jpj DO ji = 1, jpi zs0at(ji,jj) = SUM( zs0a(ji,jj,1:jpl) ) END DO END DO !---------------------- ! 5.3) Ice properties !---------------------- zbigval = 1.0d+13 DO jl = 1, jpl DO jj = 1, jpj DO ji = 1, jpi ! Switches and dummy variables zusvosn = 1.0/MAX( v_s(ji,jj,jl) , epsi16 ) zusvoic = 1.0/MAX( v_i(ji,jj,jl) , epsi16 ) zrtt = 173.15 * rone zindsn = MAX( rzero, SIGN( rone, v_s(ji,jj,jl) - zeps10 ) ) zindic = MAX( rzero, SIGN( rone, v_i(ji,jj,jl) - zeps10 ) ) zindb = MAX( zindsn, zindic ) ! Ice salinity and age zsal = MAX( MIN( (rhoic-rhosn)/rhoic*sss_io(ji,jj) , & zusvoic * zs0sm(ji,jj,jl) ), s_i_min ) * & v_i(ji,jj,jl) IF ( ( num_sal .EQ. 2 ) .OR. ( num_sal .EQ. 4 ) ) & smv_i(ji,jj,jl) = zindic*zsal + (1.0-zindic)*0.0 zage = MAX( MIN( zbigval, zs0oi(ji,jj,jl) / & MAX( a_i(ji,jj,jl), epsi16 ) ), 0.0 ) * & a_i(ji,jj,jl) oa_i (ji,jj,jl) = zindic*zage ! Snow heat content ze = MIN( MAX( 0.0, zs0c0(ji,jj,jl)*area(ji,jj) ), zbigval ) e_s(ji,jj,1,jl) = zindsn * ze + (1.0 - zindsn) * 0.0 END DO !ji END DO !jj END DO ! jl DO jl = 1, jpl DO jk = 1, nlay_i DO jj = 1, jpj DO ji = 1, jpi ! Ice heat content zindic = MAX( rzero, SIGN( rone, v_i(ji,jj,jl) - zeps10 ) ) ze = MIN( MAX( 0.0, zs0e(ji,jj,jk,jl)*area(ji,jj) ), zbigval ) e_i(ji,jj,jk,jl) = zindic * ze + ( 1.0 - zindic ) * 0.0 END DO !ji END DO ! jj END DO ! jk END DO ! jl ENDIF IF(ln_ctl) THEN ! Control print CALL prt_ctl_info(' ') CALL prt_ctl_info(' - Cell values : ') CALL prt_ctl_info(' ~~~~~~~~~~~~~ ') CALL prt_ctl(tab2d_1=area , clinfo1=' lim_trp : cell area :') CALL prt_ctl(tab2d_1=at_i , clinfo1=' lim_trp : at_i :') CALL prt_ctl(tab2d_1=vt_i , clinfo1=' lim_trp : vt_i :') CALL prt_ctl(tab2d_1=vt_s , clinfo1=' lim_trp : vt_s :') DO jl = 1, jpl CALL prt_ctl_info(' ') CALL prt_ctl_info(' - Category : ', ivar1=jl) CALL prt_ctl_info(' ~~~~~~~~~~') CALL prt_ctl(tab2d_1=a_i (:,:,jl) , clinfo1= ' lim_trp : a_i : ') CALL prt_ctl(tab2d_1=ht_i (:,:,jl) , clinfo1= ' lim_trp : ht_i : ') CALL prt_ctl(tab2d_1=ht_s (:,:,jl) , clinfo1= ' lim_trp : ht_s : ') CALL prt_ctl(tab2d_1=v_i (:,:,jl) , clinfo1= ' lim_trp : v_i : ') CALL prt_ctl(tab2d_1=v_s (:,:,jl) , clinfo1= ' lim_trp : v_s : ') CALL prt_ctl(tab2d_1=e_s (:,:,1,jl) , clinfo1= ' lim_trp : e_s : ') CALL prt_ctl(tab2d_1=t_su (:,:,jl) , clinfo1= ' lim_trp : t_su : ') CALL prt_ctl(tab2d_1=t_s (:,:,1,jl) , clinfo1= ' lim_trp : t_snow : ') CALL prt_ctl(tab2d_1=sm_i (:,:,jl) , clinfo1= ' lim_trp : sm_i : ') CALL prt_ctl(tab2d_1=smv_i (:,:,jl) , clinfo1= ' lim_trp : smv_i : ') DO jk = 1, nlay_i CALL prt_ctl_info(' ') CALL prt_ctl_info(' - Layer : ', ivar1=jk) CALL prt_ctl_info(' ~~~~~~~') CALL prt_ctl(tab2d_1=t_i(:,:,jk,jl) , clinfo1= ' lim_trp : t_i : ') CALL prt_ctl(tab2d_1=e_i(:,:,jk,jl) , clinfo1= ' lim_trp : e_i : ') END DO END DO ENDIF END SUBROUTINE lim_trp SUBROUTINE lim_trp_init !!------------------------------------------------------------------- !! *** ROUTINE lim_trp_init *** !! !! ** Purpose : initialization of ice advection parameters !! !! ** Method : Read the namicetrp namelist and check the parameter !! values called at the first timestep (nit000) !! !! ** input : Namelist namicetrp !! !! history : !! 2.0 ! 03-08 (C. Ethe) Original code !!------------------------------------------------------------------- NAMELIST/namicetrp/ bound !!------------------------------------------------------------------- ! Read Namelist namicetrp REWIND ( numnam_ice ) READ ( numnam_ice , namicetrp ) IF(lwp) THEN WRITE(numout,*) WRITE(numout,*) 'lim_trp_init : Ice parameters for advection ' WRITE(numout,*) '~~~~~~~~~~~~' WRITE(numout,*) ' boundary conditions (0.0 no-slip, 1.0 free-slip) bound = ', bound WRITE(numout,*) ENDIF END SUBROUTINE lim_trp_init #else !!---------------------------------------------------------------------- !! Default option Empty Module No sea-ice model !!---------------------------------------------------------------------- CONTAINS SUBROUTINE lim_trp ! Empty routine END SUBROUTINE lim_trp #endif !!====================================================================== END MODULE limtrp