MODULE icestp !!====================================================================== !! *** MODULE icestp *** !! Surface module : update the ocean surface boundary condition over ice !! & covered area using LIM sea-ice model !! Sea-Ice model : LIM-3 Sea ice model time-stepping !!===================================================================== !! History : 2.0 ! 2006-12 (M. Vancoppenolle) Original code !! 3.0 ! 2008-02 (C. Talandier) Surface module from icestp.F90 !! - ! 2008-04 (G. Madec) sltyle and ice_ctl routine !! 3.3 ! 2010-11 (G. Madec) ice-ocean stress always computed at each ocean time-step !! 3.4 ! 2011-01 (A Porter) dynamical allocation !! - ! 2012-10 (C. Rousset) add ice_dia !! 3.6 ! 2014-07 (M. Vancoppenolle, G. Madec, O. Marti) revise coupled interface !! 4.0 ! 2016-06 (L. Brodeau) new unified bulk routine (based on AeroBulk) !!---------------------------------------------------------------------- #if defined key_lim3 !!---------------------------------------------------------------------- !! 'key_lim3' : LIM 3.0 sea-ice model !!---------------------------------------------------------------------- !! ice_stp : sea-ice model time-stepping and update ocean sbc over ice-covered area !!---------------------------------------------------------------------- USE oce ! ocean dynamics and tracers USE dom_oce ! ocean space and time domain USE ice ! LIM-3: ice variables USE ice1D ! LIM-3: thermodynamical variables ! USE sbc_oce ! Surface boundary condition: ocean fields USE sbc_ice ! Surface boundary condition: ice fields USE iceforcing ! Surface boundary condition for sea ice ! USE phycst ! Define parameters for the routines USE eosbn2 ! equation of state USE icerhg ! Ice rheology USE iceadv ! Ice advection USE icethd ! Ice thermodynamics USE icerdgrft ! Ice ridging/rafting USE iceupdate ! sea surface boundary condition USE icedia ! Ice budget diagnostics USE icewri ! Ice outputs USE icerst ! Ice restarts USE icecor ! Ice corrections USE icevar ! Ice variables switch USE icectl ! ! MV MP 2016 USE limmp ! END MV MP 2016 USE iceist ! LIM initial state USE icethd_sal ! LIM ice thermodynamics: salinity ! USE c1d ! 1D vertical configuration USE in_out_manager ! I/O manager USE iom ! I/O manager library USE prtctl ! Print control USE lib_fortran ! USE lbclnk ! lateral boundary condition - MPP link USE lib_mpp ! MPP library USE timing ! Timing USE bdy_oce , ONLY: ln_bdy USE bdyice ! unstructured open boundary data # if defined key_agrif USE agrif_ice USE agrif_lim3_update USE agrif_lim3_interp # endif IMPLICIT NONE PRIVATE PUBLIC ice_stp ! routine called by sbcmod.F90 PUBLIC ice_init ! routine called by sbcmod.F90 !! * Substitutions # include "vectopt_loop_substitute.h90" !!---------------------------------------------------------------------- !! NEMO/OPA 4.0 , UCL NEMO Consortium (2011) !! $Id: icestp.F90 8319 2017-07-11 15:00:44Z clem $ !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) !!---------------------------------------------------------------------- CONTAINS SUBROUTINE ice_stp( kt, ksbc ) !!--------------------------------------------------------------------- !! *** ROUTINE ice_stp *** !! !! ** Purpose : update the ocean surface boundary condition via the !! Louvain la Neuve Sea Ice Model time stepping !! !! ** Method : ice model time stepping !! - call the ice dynamics routine !! - call the ice advection/diffusion routine !! - call the ice thermodynamics routine !! - call the routine that computes mass and !! heat fluxes at the ice/ocean interface !! - save the outputs !! - save the outputs for restart when necessary !! !! ** Action : - time evolution of the LIM sea-ice model !! - update all sbc variables below sea-ice: !! utau, vtau, taum, wndm, qns , qsr, emp , sfx !!--------------------------------------------------------------------- INTEGER, INTENT(in) :: kt ! ocean time step INTEGER, INTENT(in) :: ksbc ! type of sbc flux ( 1 = user defined formulation, ! 3 = bulk formulation, ! 4 = Pure Coupled formulation) INTEGER :: jl ! dummy loop index !!---------------------------------------------------------------------- IF( nn_timing == 1 ) CALL timing_start('ice_stp') !-----------------------! ! --- Ice time step --- ! !-----------------------! IF( MOD( kt-1, nn_fsbc ) == 0 ) THEN ! Ice model time step kt_ice = kt # if defined key_agrif IF( .NOT. Agrif_Root() ) lim_nbstep = MOD( lim_nbstep, Agrif_irhot() * Agrif_Parent(nn_fsbc) / nn_fsbc ) + 1 # endif ! mean surface ocean current at ice velocity point (C-grid dynamics : U- & V-points as the ocean) u_oce(:,:) = ssu_m(:,:) * umask(:,:,1) v_oce(:,:) = ssv_m(:,:) * vmask(:,:,1) ! masked sea surface freezing temperature [Kelvin] (set to rt0 over land) CALL eos_fzp( sss_m(:,:) , t_bo(:,:) ) t_bo(:,:) = ( t_bo(:,:) + rt0 ) * tmask(:,:,1) + rt0 * ( 1._wp - tmask(:,:,1) ) ! CALL ice_bef ! Store previous ice values !------------------------------------------------! ! --- Dynamical coupling with the atmosphere --- ! !------------------------------------------------! ! it provides: ! utau_ice, vtau_ice = surface ice stress [N/m2] !-------------------------------------------------- CALL ice_forcing_tau( kt, ksbc, utau_ice, vtau_ice ) !-------------------------------------------------------! ! --- ice dynamics and transport (except in 1D case) ---! !-------------------------------------------------------! CALL ice_diag0 ! set diag of mass, heat and salt fluxes to 0 CALL ice_rst_opn( kt ) ! Open Ice restart file ! ! --- zap this if no ice dynamics --- ! IF( .NOT. lk_c1d .AND. ln_limdyn ) THEN CALL ice_rhg( kt ) ! -- rheology CALL ice_adv( kt ) ! -- advection IF( nn_limdyn == 2 .AND. nn_monocat /= 2 ) & ! -- ridging/rafting & CALL ice_rdgrft( kt ) IF( nn_limdyn == 2 ) CALL ice_cor( kt , 1 ) ! -- Corrections ! ENDIF ! --- #if defined key_agrif IF( .NOT. Agrif_Root() ) CALL agrif_interp_lim3('T') #endif IF( ln_limthd .AND. ln_bdy ) CALL bdy_ice( kt ) ! -- bdy ice thermo ! previous lead fraction and ice volume for flux calculations CALL ice_var_glo2eqv ! ht_i and ht_s for ice albedo calculation CALL ice_var_agg(1) ! at_i for coupling CALL ice_bef !------------------------------------------------------! ! --- Thermodynamical coupling with the atmosphere --- ! !------------------------------------------------------! ! It provides the following fields used in sea ice model: ! fr1_i0 , fr2_i0 = 1sr & 2nd fraction of qsr penetration in ice [%] ! emp_oce , emp_ice = E-P over ocean and sea ice [Kg/m2/s] ! sprecip = solid precipitation [Kg/m2/s] ! evap_ice = sublimation [Kg/m2/s] ! qsr_tot , qns_tot = solar & non solar heat flux (total) [W/m2] ! qsr_ice , qns_ice = solar & non solar heat flux over ice [W/m2] ! dqns_ice = non solar heat sensistivity [W/m2] ! qemp_oce, qemp_ice, qprec_ice, qevap_ice = sensible heat (associated with evap & precip) [W/m2] !------------------------------------------------------------------------------------------------------ CALL ice_forcing_flx( kt, ksbc ) !----------------------------! ! --- ice thermodynamics --- ! !----------------------------! ! --- zap this if no ice thermo --- ! IF( ln_limthd ) CALL ice_thd( kt ) ! -- Ice thermodynamics ! MV MP 2016 IF ( ln_pnd ) CALL lim_mp( kt ) ! -- Melt ponds ! END MV MP 2016 IF( ln_limthd ) CALL ice_cor( kt , 2 ) ! -- Corrections ! --- # if defined key_agrif IF( .NOT. Agrif_Root() ) CALL agrif_update_lim3( kt ) # endif CALL ice_var_glo2eqv ! necessary calls (at least for coupling) CALL ice_var_agg( 2 ) ! necessary calls (at least for coupling) ! !! clem: one should switch the calculation of the fluxes onto the parent grid but the following calls do not work !! moreover it should only be called at the update frequency (as in agrif_lim3_update.F90) !!# if defined key_agrif !! IF( .NOT. Agrif_Root() ) CALL Agrif_ChildGrid_To_ParentGrid() !!# endif CALL ice_update_flx( kt ) ! -- Update surface ocean mass, heat and salt fluxes !!# if defined key_agrif !! IF( .NOT. Agrif_Root() ) CALL Agrif_ParentGrid_To_ChildGrid() !!# endif IF( ln_limdiahsb ) CALL ice_dia( kt ) ! -- Diagnostics and outputs ! CALL ice_wri( 1 ) ! -- Ice outputs ! IF( kt == nit000 .AND. ln_rstart ) & & CALL iom_close( numrir ) ! close input ice restart file ! IF( lrst_ice ) CALL ice_rst_write( kt ) ! -- Ice restart file ! IF( ln_limctl ) CALL ice_ctl( kt ) ! alerts in case of model crash ! ENDIF ! End sea-ice time step only !-------------------------! ! --- Ocean time step --- ! !-------------------------! ! Update surface ocean stresses (only in ice-dynamic case) otherwise the atm.-ocean stresses are used everywhere ! using before instantaneous surf. currents IF( ln_limdyn ) CALL ice_update_tau( kt, ub(:,:,1), vb(:,:,1) ) !!gm remark, the ocean-ice stress is not saved in ice diag call above ..... find a solution!!! ! IF( nn_timing == 1 ) CALL timing_stop('ice_stp') ! END SUBROUTINE ice_stp SUBROUTINE ice_init !!---------------------------------------------------------------------- !! *** ROUTINE ice_init *** !! !! ** purpose : Allocate all the dynamic arrays of the LIM-3 modules !!---------------------------------------------------------------------- INTEGER :: ji, jj, ierr !!---------------------------------------------------------------------- IF(lwp) WRITE(numout,*) IF(lwp) WRITE(numout,*) 'ice_init : update ocean surface boudary condition' IF(lwp) WRITE(numout,*) '~~~~~~~~ via Louvain la Neuve Ice Model (LIM-3) time stepping' ! ! ! Open the reference and configuration namelist files and namelist output file CALL ctl_opn( numnam_ice_ref, 'namelist_ice_ref', 'OLD', 'FORMATTED', 'SEQUENTIAL', -1, numout, lwp ) CALL ctl_opn( numnam_ice_cfg, 'namelist_ice_cfg', 'OLD', 'FORMATTED', 'SEQUENTIAL', -1, numout, lwp ) IF(lwm) CALL ctl_opn( numoni, 'output.namelist.ice', 'UNKNOWN', 'FORMATTED', 'SEQUENTIAL', -1, numout, lwp, 1 ) ! CALL ice_run_init ! set some ice run parameters ! ! ! Allocate the ice arrays (sbc_ice already allocated in sbc_init) ierr = ice_alloc () ! ice variables ierr = ierr + sbc_ice_alloc () ! surface forcing ierr = ierr + ice1D_alloc () ! thermodynamics IF( ln_limdyn ) ierr = ierr + ice_rdgrft_alloc () ! ridging/rafting ! IF( lk_mpp ) CALL mpp_sum( ierr ) IF( ierr /= 0 ) CALL ctl_stop('STOP', 'ice_init : unable to allocate ice arrays') ! CALL ice_rhg_init ! set ice dynamics parameters ! CALL ice_itd_init ! ice thickness distribution initialization ! CALL ice_thd_init ! set ice thermodynics parameters ! CALL ice_thd_sal_init ! set ice salinity parameters ! MV MP 2016 CALL lim_mp_init ! set melt ponds parameters ! END MV MP 2016 IF( ln_limdyn ) CALL ice_rdgrft_init ! ice thickness distribution initialization for ridging/rafting ! ! Initial sea-ice state IF( .NOT. ln_rstart ) THEN ! start from rest: sea-ice deduced from sst CALL ice_ist ELSE ! start from a restart file CALL ice_rst_read ENDIF CALL ice_var_agg(2) CALL ice_var_glo2eqv ! CALL ice_update_init ! ice surface boundary condition ! IF( ln_limdiahsb) CALL ice_dia_init ! initialization for diags ! fr_i(:,:) = at_i(:,:) ! initialisation of sea-ice fraction tn_ice(:,:,:) = t_su(:,:,:) ! initialisation of surface temp for coupled simu ! DO jj = 1, jpj DO ji = 1, jpi IF( gphit(ji,jj) > 0._wp ) THEN ; rn_amax_2d(ji,jj) = rn_amax_n ! NH ELSE ; rn_amax_2d(ji,jj) = rn_amax_s ! SH ENDIF END DO END DO ! END SUBROUTINE ice_init SUBROUTINE ice_run_init !!------------------------------------------------------------------- !! *** ROUTINE ice_run_init *** !! !! ** Purpose : Definition some run parameter for ice model !! !! ** Method : Read the namicerun namelist and check the parameter !! values called at the first timestep (nit000) !! !! ** input : Namelist namicerun !!------------------------------------------------------------------- INTEGER :: ios ! Local integer output status for namelist read NAMELIST/namicerun/ jpl, nlay_i, nlay_s, nn_monocat, rn_amax_n, rn_amax_s, cn_icerst_in, cn_icerst_indir, & & cn_icerst_out, cn_icerst_outdir, ln_limthd, ln_limdyn, nn_limdyn, rn_uice, rn_vice NAMELIST/namicediag/ ln_limdiachk, ln_limdiahsb, ln_limctl, iiceprt, jiceprt !!------------------------------------------------------------------- ! REWIND( numnam_ice_ref ) ! Namelist namicerun in reference namelist : Parameters for ice READ ( numnam_ice_ref, namicerun, IOSTAT = ios, ERR = 901) 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namicerun in reference namelist', lwp ) REWIND( numnam_ice_cfg ) ! Namelist namicerun in configuration namelist : Parameters for ice READ ( numnam_ice_cfg, namicerun, IOSTAT = ios, ERR = 902 ) 902 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namicerun in configuration namelist', lwp ) IF(lwm) WRITE ( numoni, namicerun ) ! REWIND( numnam_ice_ref ) ! Namelist namicediag in reference namelist : Parameters for ice READ ( numnam_ice_ref, namicediag, IOSTAT = ios, ERR = 903) 903 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namicediag in reference namelist', lwp ) REWIND( numnam_ice_cfg ) ! Namelist namicediag in configuration namelist : Parameters for ice READ ( numnam_ice_cfg, namicediag, IOSTAT = ios, ERR = 904 ) 904 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namicediag in configuration namelist', lwp ) IF(lwm) WRITE ( numoni, namicediag ) ! IF(lwp) THEN ! control print WRITE(numout,*) WRITE(numout,*) 'ice_run_init : ice share parameters for dynamics/advection/thermo of sea-ice' WRITE(numout,*) ' ~~~~~~' WRITE(numout,*) ' number of ice categories jpl = ', jpl WRITE(numout,*) ' number of ice layers nlay_i = ', nlay_i WRITE(numout,*) ' number of snow layers nlay_s = ', nlay_s WRITE(numout,*) ' virtual ITD mono-category param (1-4) or not (0) nn_monocat = ', nn_monocat WRITE(numout,*) ' maximum ice concentration for NH = ', rn_amax_n WRITE(numout,*) ' maximum ice concentration for SH = ', rn_amax_s WRITE(numout,*) ' Ice thermodynamics (T) or not (F) ln_limthd = ', ln_limthd WRITE(numout,*) ' Ice dynamics (T) or not (F) ln_limdyn = ', ln_limdyn WRITE(numout,*) ' (ln_limdyn=T) Ice dynamics switch nn_limdyn = ', nn_limdyn WRITE(numout,*) ' 2: total' WRITE(numout,*) ' 1: advection only (no diffusion, no ridging/rafting)' WRITE(numout,*) ' 0: advection only (as 1 + prescribed velocity, bypass rheology)' WRITE(numout,*) ' (ln_limdyn=T) prescribed u-vel (case nn_limdyn=0) = ', rn_uice WRITE(numout,*) ' (ln_limdyn=T) prescribed v-vel (case nn_limdyn=0) = ', rn_vice WRITE(numout,*) WRITE(numout,*) '...and ice diagnostics' WRITE(numout,*) ' ~~~~~~~~~~~~~~~~~~~~' WRITE(numout,*) ' Diagnose online heat/mass/salt budget ln_limdiachk = ', ln_limdiachk WRITE(numout,*) ' Output heat/mass/salt budget ln_limdiahsb = ', ln_limdiahsb WRITE(numout,*) ' control prints in ocean.out for (i,j)=(iiceprt,jiceprt) = ', ln_limctl WRITE(numout,*) ' i-index for control prints (ln_limctl=true) = ', iiceprt WRITE(numout,*) ' j-index for control prints (ln_limctl=true) = ', jiceprt ENDIF ! IF ( ( jpl > 1 ) .AND. ( nn_monocat == 1 ) ) THEN nn_monocat = 0 IF(lwp) WRITE(numout,*) IF(lwp) WRITE(numout,*) ' nn_monocat forced to 0 as jpl>1, i.e. multi-category case is chosen' ENDIF IF ( ( jpl == 1 ) .AND. ( nn_monocat == 0 ) ) THEN CALL ctl_stop( 'STOP', 'ice_run_init : if jpl=1 then nn_monocat should be between 1 and 4' ) ENDIF ! ! sea-ice timestep and inverse rdt_ice = REAL(nn_fsbc) * rdt r1_rdtice = 1._wp / rdt_ice ! inverse of nlay_i and nlay_s r1_nlay_i = 1._wp / REAL( nlay_i, wp ) r1_nlay_s = 1._wp / REAL( nlay_s, wp ) ! IF( lwp .AND. ln_bdy .AND. ln_limdiachk ) & & CALL ctl_warn('online conservation check activated but it does not work with BDY') ! IF( lwp ) WRITE(numout,*) ' ice timestep rdt_ice = ', rdt_ice ! END SUBROUTINE ice_run_init SUBROUTINE ice_itd_init !!------------------------------------------------------------------ !! *** ROUTINE ice_itd_init *** !! !! ** Purpose : Initializes the ice thickness distribution !! ** Method : ... !! ** input : Namelist namiceitd !!------------------------------------------------------------------- INTEGER :: ios ! Local integer output status for namelist read NAMELIST/namiceitd/ rn_himean ! INTEGER :: jl ! dummy loop index REAL(wp) :: zc1, zc2, zc3, zx1 ! local scalars REAL(wp) :: zhmax, znum, zden, zalpha ! !!------------------------------------------------------------------ ! REWIND( numnam_ice_ref ) ! Namelist namiceitd in reference namelist : Parameters for ice READ ( numnam_ice_ref, namiceitd, IOSTAT = ios, ERR = 905) 905 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namiceitd in reference namelist', lwp ) REWIND( numnam_ice_cfg ) ! Namelist namiceitd in configuration namelist : Parameters for ice READ ( numnam_ice_cfg, namiceitd, IOSTAT = ios, ERR = 906 ) 906 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namiceitd in configuration namelist', lwp ) IF(lwm) WRITE ( numoni, namiceitd ) ! IF(lwp) THEN ! control print WRITE(numout,*) WRITE(numout,*) 'ice_itd_init : Initialization of ice cat distribution ' WRITE(numout,*) '~~~~~~~~~~~~' WRITE(numout,*) ' mean ice thickness in the domain rn_himean = ', rn_himean ENDIF ! !---------------------------------- !- Thickness categories boundaries !---------------------------------- ! !== h^(-alpha) function ==! zalpha = 0.05_wp zhmax = 3._wp * rn_himean DO jl = 1, jpl znum = jpl * ( zhmax+1 )**zalpha zden = REAL( jpl-jl , wp ) * ( zhmax + 1._wp )**zalpha + REAL( jl , wp ) hi_max(jl) = ( znum / zden )**(1./zalpha) - 1 END DO ! DO jl = 1, jpl ! mean thickness by category hi_mean(jl) = ( hi_max(jl) + hi_max(jl-1) ) * 0.5_wp END DO ! hi_max(jpl) = 99._wp ! set to a big value to ensure that all ice is thinner than hi_max(jpl) ! IF(lwp) WRITE(numout,*) IF(lwp) WRITE(numout,*) ' Thickness category boundaries ' IF(lwp) WRITE(numout,*) ' hi_max ', hi_max(0:jpl) ! END SUBROUTINE ice_itd_init SUBROUTINE ice_bef !!---------------------------------------------------------------------- !! *** ROUTINE ice_bef *** !! !! ** purpose : store ice variables at "before" time step !!---------------------------------------------------------------------- INTEGER :: ji, jj, jl ! dummy loop index !!---------------------------------------------------------------------- ! DO jl = 1, jpl DO jj = 2, jpjm1 DO ji = 2, jpim1 a_i_b (ji,jj,jl) = a_i (ji,jj,jl) ! ice area v_i_b (ji,jj,jl) = v_i (ji,jj,jl) ! ice volume v_s_b (ji,jj,jl) = v_s (ji,jj,jl) ! snow volume smv_i_b(ji,jj,jl) = smv_i(ji,jj,jl) ! salt content oa_i_b (ji,jj,jl) = oa_i (ji,jj,jl) ! areal age content e_s_b (ji,jj,:,jl) = e_s (ji,jj,:,jl) ! snow thermal energy e_i_b (ji,jj,:,jl) = e_i (ji,jj,:,jl) ! ice thermal energy ! ! ice thickness rswitch = MAX( 0._wp , SIGN( 1._wp, a_i_b(ji,jj,jl) - epsi20 ) ) ! 0 if no ice and 1 if yes ht_i_b(ji,jj,jl) = v_i_b (ji,jj,jl) / MAX( a_i_b(ji,jj,jl) , epsi20 ) * rswitch ht_s_b(ji,jj,jl) = v_s_b (ji,jj,jl) / MAX( a_i_b(ji,jj,jl) , epsi20 ) * rswitch END DO END DO END DO CALL lbc_lnk_multi( a_i_b, 'T', 1., v_i_b , 'T', 1., v_s_b , 'T', 1., smv_i_b, 'T', 1., & & oa_i_b, 'T', 1., ht_i_b, 'T', 1., ht_s_b, 'T', 1. ) CALL lbc_lnk( e_i_b, 'T', 1. ) CALL lbc_lnk( e_s_b, 'T', 1. ) ! ice velocities & total concentration DO jj = 2, jpjm1 DO ji = 2, jpim1 at_i_b(ji,jj) = SUM( a_i_b(ji,jj,:) ) u_ice_b(ji,jj) = u_ice(ji,jj) v_ice_b(ji,jj) = v_ice(ji,jj) END DO END DO CALL lbc_lnk_multi( at_i_b, 'T', 1., u_ice_b , 'U', -1., v_ice_b , 'V', -1. ) END SUBROUTINE ice_bef SUBROUTINE ice_diag0 !!---------------------------------------------------------------------- !! *** ROUTINE ice_diag0 *** !! !! ** purpose : set ice-ocean and ice-atm. fluxes to zeros at the beggining !! of the time step !!---------------------------------------------------------------------- INTEGER :: ji, jj ! dummy loop index !!---------------------------------------------------------------------- DO jj = 1, jpj DO ji = 1, jpi sfx (ji,jj) = 0._wp ; sfx_bri(ji,jj) = 0._wp ; sfx_lam(ji,jj) = 0._wp sfx_sni(ji,jj) = 0._wp ; sfx_opw(ji,jj) = 0._wp sfx_bog(ji,jj) = 0._wp ; sfx_dyn(ji,jj) = 0._wp sfx_bom(ji,jj) = 0._wp ; sfx_sum(ji,jj) = 0._wp sfx_res(ji,jj) = 0._wp ; sfx_sub(ji,jj) = 0._wp ! wfx_snw(ji,jj) = 0._wp ; wfx_ice(ji,jj) = 0._wp wfx_sni(ji,jj) = 0._wp ; wfx_opw(ji,jj) = 0._wp wfx_bog(ji,jj) = 0._wp ; wfx_dyn(ji,jj) = 0._wp wfx_bom(ji,jj) = 0._wp ; wfx_sum(ji,jj) = 0._wp wfx_res(ji,jj) = 0._wp ; wfx_sub(ji,jj) = 0._wp wfx_spr(ji,jj) = 0._wp ; wfx_lam(ji,jj) = 0._wp wfx_snw_dyn(ji,jj) = 0._wp ; wfx_snw_sum(ji,jj) = 0._wp wfx_snw_sub(ji,jj) = 0._wp ; wfx_ice_sub(ji,jj) = 0._wp wfx_snw_sni(ji,jj) = 0._wp ! MV MP 2016 wfx_pnd(ji,jj) = 0._wp ! END MV MP 2016 hfx_thd(ji,jj) = 0._wp ; hfx_snw(ji,jj) = 0._wp ; hfx_opw(ji,jj) = 0._wp hfx_bog(ji,jj) = 0._wp ; hfx_dyn(ji,jj) = 0._wp hfx_bom(ji,jj) = 0._wp ; hfx_sum(ji,jj) = 0._wp hfx_res(ji,jj) = 0._wp ; hfx_sub(ji,jj) = 0._wp hfx_spr(ji,jj) = 0._wp ; hfx_dif(ji,jj) = 0._wp hfx_err(ji,jj) = 0._wp ; hfx_err_rem(ji,jj) = 0._wp hfx_err_dif(ji,jj) = 0._wp wfx_err_sub(ji,jj) = 0._wp ! afx_tot(ji,jj) = 0._wp ; afx_dyn(ji,jj) = 0._wp ; afx_thd(ji,jj) = 0._wp ! diag_heat(ji,jj) = 0._wp ; diag_smvi(ji,jj) = 0._wp diag_vice(ji,jj) = 0._wp ; diag_vsnw(ji,jj) = 0._wp ! SIMIP diagnostics diag_dms_dyn(ji,jj) = 0._wp ; diag_dmi_dyn(ji,jj) = 0._wp diag_fc_bo(ji,jj) = 0._wp ; diag_fc_su(ji,jj) = 0._wp tau_icebfr(ji,jj) = 0._wp; ! landfast ice param only (clem: important to keep the init here) END DO END DO END SUBROUTINE ice_diag0 #else !!---------------------------------------------------------------------- !! Default option Dummy module NO LIM 3.0 sea-ice model !!---------------------------------------------------------------------- CONTAINS ! SUBROUTINE ice_stp ( kt, ksbc ) ! Dummy routine INTEGER, INTENT(in) :: kt, ksbc WRITE(*,*) 'ice_stp: You should not have seen this print! error?', kt END SUBROUTINE ice_stp ! SUBROUTINE ice_init ! Dummy routine END SUBROUTINE ice_init #endif !!====================================================================== END MODULE icestp