Changeset 13284
- Timestamp:
- 2020-07-09T17:12:23+02:00 (3 years ago)
- Location:
- NEMO/releases/r4.0/r4.0-HEAD
- Files:
-
- 84 edited
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
NEMO/releases/r4.0/r4.0-HEAD/cfgs/AGRIF_DEMO/EXPREF/1_namelist_cfg
r13278 r13284 353 353 &namzdf_tke ! turbulent eddy kinetic dependent vertical diffusion (ln_zdftke =T) 354 354 !----------------------------------------------------------------------- 355 rn_eice = 0 ! below sea ice: =0 ON ; =4 OFF when ice fraction > 1/4356 355 / 357 356 !!====================================================================== -
NEMO/releases/r4.0/r4.0-HEAD/cfgs/AGRIF_DEMO/EXPREF/namelist_cfg
r13278 r13284 353 353 &namzdf_tke ! turbulent eddy kinetic dependent vertical diffusion (ln_zdftke =T) 354 354 !----------------------------------------------------------------------- 355 rn_eice = 0 ! below sea ice: =0 ON ; =4 OFF when ice fraction > 1/4356 355 / 357 356 !!====================================================================== -
NEMO/releases/r4.0/r4.0-HEAD/cfgs/ORCA2_ICE_PISCES/EXPREF/namelist_cfg
r13278 r13284 374 374 ! = 2 add a tke source just at the base of the ML 375 375 ! = 3 as = 1 applied on HF part of the stress (ln_cpl=T) 376 rn_eice = 0 ! below sea ice: =0 ON ; =4 OFF when ice fraction > 1/4377 376 / 378 377 !----------------------------------------------------------------------- -
NEMO/releases/r4.0/r4.0-HEAD/cfgs/SHARED/field_def_nemo-ice.xml
r12337 r13284 49 49 <field id="icehpnd" long_name="melt pond depth" standard_name="sea_ice_meltpond_depth" unit="m" /> 50 50 <field id="icevpnd" long_name="melt pond volume" standard_name="sea_ice_meltpond_volume" unit="m" /> 51 <field id="icehlid" long_name="melt pond lid depth" standard_name="sea_ice_meltpondlid_depth" unit="m" /> 52 <field id="icevlid" long_name="melt pond lid volume" standard_name="sea_ice_meltpondlid_volume" unit="m" /> 51 53 52 54 <!-- heat --> … … 81 83 <field id="icediv" long_name="Divergence of the sea-ice velocity field" standard_name="divergence_of_sea_ice_velocity" unit="s-1" /> 82 84 <field id="iceshe" long_name="Maximum shear of sea-ice velocity field" standard_name="maximum_shear_of_sea_ice_velocity" unit="s-1" /> 83 85 <field id="beta_evp" long_name="Relaxation parameter of ice rheology (beta)" standard_name="relaxation_parameter_of_ice_rheology" unit="" /> 86 84 87 <!-- surface heat fluxes --> 85 88 <field id="qt_ice" long_name="total heat flux at ice surface" standard_name="surface_downward_heat_flux_in_air" unit="W/m2" /> … … 171 174 <field id="frq_m" unit="-" /> 172 175 176 <!-- rheology convergence tests --> 177 <field id="uice_cvg" long_name="sea ice velocity convergence" standard_name="sea_ice_velocity_convergence" unit="m/s" /> 178 173 179 <!-- ================= --> 174 180 <!-- Add-ons for SIMIP --> … … 209 215 <field id="dmisum" long_name="sea-ice mass change through surface melting" standard_name="tendency_of_sea_ice_amount_due_to_surface_melting" unit="kg/m2/s" /> 210 216 <field id="dmibom" long_name="sea-ice mass change through bottom melting" standard_name="tendency_of_sea_ice_amount_due_to_basal_melting" unit="kg/m2/s" /> 217 <field id="dmilam" long_name="sea-ice mass change through lateral melting" standard_name="tendency_of_sea_ice_amount_due_to_lateral_melting" unit="kg/m2/s" /> 211 218 <field id="dmsspr" long_name="snow mass change through snow fall" standard_name="snowfall_flux" unit="kg/m2/s" /> 212 219 <field id="dmsmel" long_name="snow mass change through melt" standard_name="surface_snow_melt_flux" unit="kg/m2/s" /> … … 287 294 <field id="iceapnd_cat" long_name="Ice melt pond concentration per category" unit="" /> 288 295 <field id="icehpnd_cat" long_name="Ice melt pond thickness per category" unit="m" detect_missing_value="true" /> 296 <field id="icehlid_cat" long_name="Ice melt pond lid thickness per category" unit="m" detect_missing_value="true" /> 289 297 <field id="iceafpnd_cat" long_name="Ice melt pond fraction per category" unit="" /> 298 <field id="iceaepnd_cat" long_name="Ice melt pond effective fraction per category" unit="" /> 290 299 <field id="icemask_cat" long_name="Fraction of time step with sea ice (per category)" unit="" /> 291 300 <field id="iceage_cat" long_name="Ice age per category" unit="days" detect_missing_value="true" /> … … 298 307 <field id="snwthic_cat_cmip" long_name="Snow thickness in thickness categories" standard_name="snow_thickness_over_categories" detect_missing_value="true" unit="m" > snwthic_cat * icemask_cat + $missval * (1.-icemask_cat) </field> 299 308 <field id="iceconc_cat_pct_cmip" long_name="Sea-ice area fractions in thickness categories" standard_name="sea_ice_area_fraction_over_categories" detect_missing_value="true" unit="%" > iceconc_cat*100. * icemask_cat + $missval * (1.-icemask_cat) </field> 309 310 <!-- heat diffusion convergence tests --> 311 <field id="tice_cvgerr" long_name="sea ice temperature convergence error" standard_name="sea_ice_temperature_convergence_err" unit="K" /> 312 <field id="tice_cvgstp" long_name="sea ice temperature convergence iterations" standard_name="sea_ice_temperature_convergence_stp" unit="" /> 300 313 301 314 </field_group> <!-- SBC_3D --> … … 558 571 <field field_ref="dmisum" name="sidmassmelttop" /> 559 572 <field field_ref="dmibom" name="sidmassmeltbot" /> 573 <field field_ref="dmilam" name="sidmassmeltlat" /> 560 574 <field field_ref="dmsspr" name="sndmasssnf" /> 561 575 <field field_ref="dmsmel" name="sndmassmelt" /> -
NEMO/releases/r4.0/r4.0-HEAD/cfgs/SHARED/field_def_nemo-oce.xml
r12288 r13284 36 36 <field id="toce_vmean300" field_ref="toce_e3t_vsum300" unit="degree_C" grid_ref="grid_T_vsum" detect_missing_value="true" > toce_e3t_vsum300/e3t_vsum300 </field> 37 37 38 <!--- additions to diawri.F90 ---> 39 <field id="socegrad" long_name="module of salinity gradient" unit="psu/m" grid_ref="grid_T_3D"/> 40 <field id="socegrad2" long_name="square of module of salinity gradient" unit="psu2/m2" grid_ref="grid_T_3D"/> 41 <field id="eken_int" long_name="vertical integration of kinetic energy" unit="m3/s2" /> 42 <field id="relvor" long_name="relative vorticity" unit="s-1" grid_ref="grid_T_3D"/> 43 <field id="absvor" long_name="absolute vorticity" unit="s-1" grid_ref="grid_T_3D"/> 44 <field id="potvor" long_name="potential vorticity" unit="s-1" grid_ref="grid_T_3D"/> 45 <field id="salt2c" long_name="Salt content vertically integrated" unit="1e-3*kg/m2" /> 38 46 39 47 <!-- t-eddy viscosity coefficients (ldfdyn) --> -
NEMO/releases/r4.0/r4.0-HEAD/cfgs/SHARED/namelist_ice_ref
r12121 r13284 43 43 ln_cat_usr = .false. ! ice categories are defined by rn_catbnd below (m) 44 44 rn_catbnd = 0.,0.45,1.1,2.1,3.7,6.0 45 rn_himin = 0.1 ! minimum ice thickness (m) used in remapping 45 rn_himin = 0.1 ! minimum ice thickness (m) allowed 46 rn_himax = 99.0 ! maximum ice thickness (m) allowed 46 47 / 47 48 !------------------------------------------------------------------------------ … … 56 57 rn_ishlat = 2. ! lbc : free slip (0) ; partial slip (0-2) ; no slip (2) ; strong slip (>2) 57 58 ln_landfast_L16 = .false. ! landfast: parameterization from Lemieux 2016 58 rn_ depfra= 0.125 ! fraction of ocean depth that ice must reach to initiate landfast59 rn_lf_depfra = 0.125 ! fraction of ocean depth that ice must reach to initiate landfast 59 60 ! recommended range: [0.1 ; 0.25] 60 rn_ icebfr = 15. ! maximum bottom stress per unit volume [N/m3]61 rn_lf relax= 1.e-5 ! relaxation time scale to reach static friction [s-1]62 rn_ tensile= 0.05 ! isotropic tensile strength [0-0.5??]61 rn_lf_bfr = 15. ! maximum bottom stress per unit volume [N/m3] 62 rn_lf_relax = 1.e-5 ! relaxation time scale to reach static friction [s-1] 63 rn_lf_tensile = 0.05 ! isotropic tensile strength [0-0.5??] 63 64 / 64 65 !------------------------------------------------------------------------------ … … 97 98 rn_relast = 0.333 ! ratio of elastic timescale to ice time step: Telast = dt_ice * rn_relast 98 99 ! advised value: 1/3 (rn_nevp=120) or 1/9 (rn_nevp=300) 100 ln_rhg_chkcvg = .false. ! check convergence of rheology (outputs: file ice_cvg.nc & variable uice_cvg) 99 101 / 100 102 !------------------------------------------------------------------------------ 101 103 &namdyn_adv ! Ice advection 102 104 !------------------------------------------------------------------------------ 103 ln_adv_Pra = .true. ! Advection scheme (Prather)104 ln_adv_UMx = .false. 105 ln_adv_Pra = .true. ! Advection scheme (Prather) 106 ln_adv_UMx = .false. ! Advection scheme (Ultimate-Macho) 105 107 nn_UMx = 5 ! order of the scheme for UMx (1-5 ; 20=centered 2nd order) 106 108 / … … 109 111 !------------------------------------------------------------------------------ 110 112 rn_cio = 5.0e-03 ! ice-ocean drag coefficient (-) 111 rn_blow_s = 0.66 ! mesure of snow blowing into the leads 113 nn_snwfra = 0 ! calculate the fraction of ice covered by snow (for zdf and albedo) 114 ! = 0 fraction = 1 (if snow) or 0 (if no snow) 115 ! = 1 fraction = 1-exp(-0.2*rhos*hsnw) [MetO formulation] 116 ! = 2 fraction = hsnw / (hsnw+0.02) [CICE formulation] 117 rn_snwblow = 0.66 ! mesure of snow blowing into the leads 112 118 ! = 1 => no snow blowing, < 1 => some snow blowing 113 119 nn_flxdist = -1 ! Redistribute heat flux over ice categories … … 118 124 ln_cndflx = .false. ! Use conduction flux as surface boundary conditions (i.e. for Jules coupling) 119 125 ln_cndemulate = .false. ! emulate conduction flux (if not provided in the inputs) 126 nn_qtrice = 0 ! Solar flux transmitted thru the surface scattering layer: 127 ! = 0 Grenfell and Maykut 1977 (depends on cloudiness and is 0 when there is snow) 128 ! = 1 Lebrun 2019 (equals 0.3 anytime with different melting/dry snw conductivities) 120 129 / 121 130 !------------------------------------------------------------------------------ … … 126 135 ln_icedO = .true. ! activate ice growth in open-water (T) or not (F) 127 136 ln_icedS = .true. ! activate brine drainage (T) or not (F) 137 ! 138 ln_leadhfx = .true. ! heat in the leads is used to melt sea-ice before warming the ocean 128 139 / 129 140 !------------------------------------------------------------------------------ … … 135 146 rn_cnd_s = 0.31 ! thermal conductivity of the snow (0.31 W/m/K, Maykut and Untersteiner, 1971) 136 147 ! Obs: 0.1-0.5 (Lecomte et al, JAMES 2013) 137 rn_kappa_i = 1.0 ! radiation attenuation coefficient in sea ice [1/m] 148 rn_kappa_i = 1.0 ! radiation attenuation coefficient in sea ice [1/m] 149 rn_kappa_s = 10.0 ! nn_qtrice = 0: radiation attenuation coefficient in snow [1/m] 150 rn_kappa_smlt = 7.0 ! nn_qtrice = 1: radiation attenuation coefficient in melting snow [1/m] 151 rn_kappa_sdry = 10.0 ! radiation attenuation coefficient in dry snow [1/m] 152 ln_zdf_chkcvg = .false. ! check convergence of heat diffusion scheme (outputs: tice_cvgerr, tice_cvgstp) 138 153 / 139 154 !------------------------------------------------------------------------------ … … 175 190 &namthd_pnd ! Melt ponds 176 191 !------------------------------------------------------------------------------ 177 ln_pnd = .false. ! activate melt ponds or not 178 ln_pnd_H12 = .false. ! activate evolutive melt ponds (from Holland et al 2012) 179 ln_pnd_CST = .false. ! activate constant melt ponds 180 rn_apnd = 0.2 ! prescribed pond fraction, at Tsu=0 degC 181 rn_hpnd = 0.05 ! prescribed pond depth, at Tsu=0 degC 182 ln_pnd_alb = .false. ! melt ponds affect albedo or not 192 ln_pnd = .false. ! activate melt ponds or not 193 ln_pnd_LEV = .false. ! level ice melt ponds (from Flocco et al 2007,2010 & Holland et al 2012) 194 rn_apnd_min = 0.15 ! minimum ice fraction that contributes to melt pond. range: 0.0 -- 0.15 ?? 195 rn_apnd_max = 0.85 ! maximum ice fraction that contributes to melt pond. range: 0.7 -- 0.85 ?? 196 ln_pnd_CST = .false. ! constant melt ponds 197 rn_apnd = 0.2 ! prescribed pond fraction, at Tsu=0 degC 198 rn_hpnd = 0.05 ! prescribed pond depth, at Tsu=0 degC 199 ln_pnd_lids = .true. ! frozen lids on top of the ponds (only for ln_pnd_LEV) 200 ln_pnd_alb = .true. ! effect of melt ponds on ice albedo 183 201 / 184 202 !------------------------------------------------------------------------------ … … 186 204 !------------------------------------------------------------------------------ 187 205 ln_iceini = .true. ! activate ice initialization (T) or not (F) 188 ln_iceini_file = .false. ! netcdf file provided for initialization (T) or not (F) 206 nn_iceini_file = 0 ! 0 = Initialise sea ice based on SSTs 207 ! 1 = Initialise sea ice from single category netcdf file 208 ! 2 = Initialise sea ice from multi category restart file 189 209 rn_thres_sst = 2.0 ! max temp. above Tfreeze with initial ice = (sst - tfreeze) 190 210 rn_hti_ini_n = 3.0 ! initial ice thickness (m), North … … 206 226 rn_hpd_ini_n = 0.05 ! initial pond depth (m), North 207 227 rn_hpd_ini_s = 0.05 ! " " South 208 ! -- for ln_iceini_file = T 228 rn_hld_ini_n = 0.0 ! initial pond lid depth (m), North 229 rn_hld_ini_s = 0.0 ! " " South 230 ! -- for nn_iceini_file = 1 209 231 sn_hti = 'Ice_initialization' , -12 ,'hti' , .false. , .true., 'yearly' , '' , '', '' 210 232 sn_hts = 'Ice_initialization' , -12 ,'hts' , .false. , .true., 'yearly' , '' , '', '' … … 217 239 sn_apd = 'NOT USED' , -12 ,'apd' , .false. , .true., 'yearly' , '' , '', '' 218 240 sn_hpd = 'NOT USED' , -12 ,'hpd' , .false. , .true., 'yearly' , '' , '', '' 241 sn_hld = 'NOT USED' , -12 ,'hld' , .false. , .true., 'yearly' , '' , '', '' 219 242 cn_dir='./' 220 243 / … … 238 261 ln_icediahsb = .false. ! output the heat, mass & salt budgets (T) or not (F) 239 262 ln_icectl = .false. ! ice points output for debug (T or F) 240 iiceprt = 10 !i-index for debug241 jiceprt = 10 !j-index for debug242 / 263 iiceprt = 10 ! i-index for debug 264 jiceprt = 10 ! j-index for debug 265 / -
NEMO/releases/r4.0/r4.0-HEAD/cfgs/SHARED/namelist_ref
r13278 r13284 281 281 sn_snow = 'ncar_precip.15JUNE2009_fill', -1. , 'SNOW' , .false. , .true. , 'yearly' , 'weights_core_orca2_bilinear_noc.nc' , '' , '' 282 282 sn_slp = 'slp.15JUNE2009_fill' , 6. , 'SLP' , .false. , .true. , 'yearly' , 'weights_core_orca2_bilinear_noc.nc' , '' , '' 283 sn_cc = 'NOT USED' , 24 , 'CC' , .false. , .true. , 'yearly' , 'weights_core_orca2_bilinear_noc.nc' , '' , '' 283 284 sn_tdif = 'taudif_core' , 24 , 'taudif' , .false. , .true. , 'yearly' , 'weights_core_orca2_bilinear_noc.nc' , '' , '' 284 285 / … … 286 287 &namsbc_cpl ! coupled ocean/atmosphere model ("key_oasis3") 287 288 !----------------------------------------------------------------------- 288 nn_cplmodel = 1 ! Maximum number of models to/from which NEMO is potentially sending/receiving data 289 ln_usecplmask = .false. ! use a coupling mask file to merge data received from several models 290 ! ! -> file cplmask.nc with the float variable called cplmask (jpi,jpj,nn_cplmodel) 291 nn_cats_cpl = 5 ! Number of sea ice categories over which coupling is to be carried out (if not 1) 289 nn_cplmodel = 1 ! Maximum number of models to/from which NEMO is potentially sending/receiving data 290 ln_usecplmask = .false. ! use a coupling mask file to merge data received from several models 291 ! ! -> file cplmask.nc with the float variable called cplmask (jpi,jpj,nn_cplmodel) 292 ln_scale_ice_flux = .false. ! use ice fluxes that are already "ice weighted" ( i.e. multiplied ice concentration) 293 nn_cats_cpl = 5 ! Number of sea ice categories over which coupling is to be carried out (if not 1) 292 294 !_____________!__________________________!____________!_____________!______________________!________! 293 295 ! ! description ! multiple ! vector ! vector ! vector ! … … 645 647 bn_aip = 'NOT USED' , 24. , 'siapnd' , .true. , .false., 'daily' , '' , '' , '' 646 648 bn_hip = 'NOT USED' , 24. , 'sihpnd' , .true. , .false., 'daily' , '' , '' , '' 649 bn_hil = 'NOT USED' , 24. , 'sihlid' , .true. , .false., 'daily' , '' , '' , '' 647 650 ! if bn_t_i etc are "not used", then define arbitrary temperatures and salinity and ponds 648 651 rn_ice_tem = 270. ! arbitrary temperature of incoming sea ice … … 651 654 rn_ice_apnd = 0.2 ! -- pond fraction = a_ip/a_i -- 652 655 rn_ice_hpnd = 0.05 ! -- pond depth -- 656 rn_ice_hlid = 0.0 ! -- pond lid depth -- 653 657 / 654 658 !----------------------------------------------------------------------- … … 679 683 ! 680 684 ln_drgimp = .true. ! implicit top/bottom friction flag 685 ln_drgice_imp = .false. ! implicit ice-ocean drag 681 686 / 682 687 !----------------------------------------------------------------------- … … 1054 1059 ! ! = 3 as =2 with distinct dissipative an mixing length scale 1055 1060 ln_mxl0 = .true. ! surface mixing length scale = F(wind stress) (T) or not (F) 1061 nn_mxlice = 0 ! type of scaling under sea-ice 1062 ! = 0 no scaling under sea-ice 1063 ! = 1 scaling with constant sea-ice thickness 1064 ! = 2 scaling with mean sea-ice thickness ( only with SI3 sea-ice model ) 1065 ! = 3 scaling with maximum sea-ice thickness 1066 rn_mxlice = 10. ! max constant ice thickness value when scaling under sea-ice ( nn_mxlice=1) 1056 1067 rn_mxl0 = 0.04 ! surface buoyancy lenght scale minimum value 1057 1068 ln_lc = .true. ! Langmuir cell parameterisation (Axell 2002) … … 1065 1076 ! = 0 constant 10 m length scale 1066 1077 ! = 1 0.5m at the equator to 30m poleward of 40 degrees 1067 rn_eice = 4 ! below sea ice: =0 ON ; =4 OFF when ice fraction > 1/4 1078 nn_eice = 1 ! attenutaion of langmuir & surface wave breaking under ice 1079 ! ! = 0 no impact of ice cover on langmuir & surface wave breaking 1080 ! ! = 1 weigthed by 1-TANH(10*fr_i) 1081 ! ! = 2 weighted by 1-fr_i 1082 ! ! = 3 weighted by 1-MIN(1,4*fr_i) 1068 1083 / 1069 1084 !----------------------------------------------------------------------- … … 1078 1093 rn_charn = 70000. ! Charnock constant for wb induced roughness length 1079 1094 rn_hsro = 0.02 ! Minimum surface roughness 1095 rn_hsri = 0.03 ! Ice-ocean roughness 1080 1096 rn_frac_hs = 1.3 ! Fraction of wave height as roughness (if nn_z0_met>1) 1081 1097 nn_z0_met = 2 ! Method for surface roughness computation (0/1/2/3) 1082 ! ! =3 requires ln_wave=T 1098 ! ! = 3 requires ln_wave=T 1099 nn_z0_ice = 1 ! attenutaion of surface wave breaking under ice 1100 ! ! = 0 no impact of ice cover 1101 ! ! = 1 roughness uses rn_hsri and is weigthed by 1-TANH(10*fr_i) 1102 ! ! = 2 roughness uses rn_hsri and is weighted by 1-fr_i 1103 ! ! = 3 roughness uses rn_hsri and is weighted by 1-MIN(1,4*fr_i) 1083 1104 nn_bc_surf = 1 ! surface condition (0/1=Dir/Neum) 1084 1105 nn_bc_bot = 1 ! bottom condition (0/1=Dir/Neum) -
NEMO/releases/r4.0/r4.0-HEAD/cfgs/SPITZ12/EXPREF/namelist_cfg
r13278 r13284 217 217 ln_loglayer = .true. ! logarithmic drag: Cd = vkarmn/log(z/z0) |U| 218 218 ln_drgimp = .true. ! implicit top/bottom friction flag 219 ln_drgice_imp = .true. ! implicit ice-ocean drag 219 220 / 220 221 !----------------------------------------------------------------------- … … 340 341 nn_havtb = 1 ! horizontal shape for avtb (=1) or not (=0) 341 342 / 343 !----------------------------------------------------------------------- 344 &namzdf_tke ! turbulent eddy kinetic dependent vertical diffusion (ln_zdftke =T) 345 !----------------------------------------------------------------------- 346 ln_mxl0 = .true. ! surface mixing length scale = F(wind stress) (T) or not (F) 347 nn_mxlice = 2 ! type of scaling under sea-ice 348 ! = 0 no scaling under sea-ice 349 ! = 1 scaling with constant sea-ice thickness 350 ! = 2 scaling with mean sea-ice thickness ( only with SI3 sea-ice model ) 351 ! = 3 scaling with maximum sea-ice thickness 352 nn_eice = 1 ! attenutaion of langmuir & surface wave breaking under ice 353 ! ! = 0 no impact of ice cover on langmuir & surface wave breaking 354 ! ! = 1 weigthed by 1-TANH(10*fr_i) 355 ! ! = 2 weighted by 1-fr_i 356 ! ! = 3 weighted by 1-MIN(1,4*fr_i) 357 / 342 358 !!====================================================================== 343 359 !! *** Diagnostics namelists *** !! -
NEMO/releases/r4.0/r4.0-HEAD/cfgs/SPITZ12/EXPREF/namelist_ice_cfg
r11731 r13284 82 82 !------------------------------------------------------------------------------ 83 83 ln_pnd = .true. ! activate melt ponds or not 84 ln_pnd_H12 = .true. ! activate evolutive melt ponds (from Holland et al 2012) 85 ln_pnd_alb = .true. ! melt ponds affect albedo or not 84 ln_pnd_LEV = .true. ! activate level ice melt ponds 86 85 / 87 86 -
NEMO/releases/r4.0/r4.0-HEAD/doc/namelists/nambdy_dta
r11703 r13284 29 29 bn_aip = 'NOT USED' , 24. , 'siapnd' , .true. , .false., 'daily' , '' , '' , '' 30 30 bn_hip = 'NOT USED' , 24. , 'sihpnd' , .true. , .false., 'daily' , '' , '' , '' 31 bn_hil = 'NOT USED' , 24. , 'sihlid' , .true. , .false., 'daily' , '' , '' , '' 31 32 ! if bn_t_i etc are "not used", then define arbitrary temperatures and salinity and ponds 32 33 rn_ice_tem = 270. ! arbitrary temperature of incoming sea ice … … 35 36 rn_ice_apnd = 0.2 ! -- pond fraction = a_ip/a_i -- 36 37 rn_ice_hpnd = 0.05 ! -- pond depth -- 38 rn_ice_hlid = 0.0 ! -- pond lid depth -- 37 39 / -
NEMO/releases/r4.0/r4.0-HEAD/doc/namelists/namdia
r11703 r13284 8 8 ln_icediahsb = .false. ! output the heat, mass & salt budgets (T) or not (F) 9 9 ln_icectl = .false. ! ice points output for debug (T or F) 10 iiceprt = 10 !i-index for debug11 jiceprt = 10 !j-index for debug10 iiceprt = 10 ! i-index for debug 11 jiceprt = 10 ! j-index for debug 12 12 / -
NEMO/releases/r4.0/r4.0-HEAD/doc/namelists/namdrg
r13272 r13284 8 8 ! 9 9 ln_drgimp = .true. ! implicit top/bottom friction flag 10 ln_drgice_imp = .false. ! implicit ice-ocean drag 10 11 / -
NEMO/releases/r4.0/r4.0-HEAD/doc/namelists/namdyn
r11703 r13284 10 10 rn_ishlat = 2. ! lbc : free slip (0) ; partial slip (0-2) ; no slip (2) ; strong slip (>2) 11 11 ln_landfast_L16 = .false. ! landfast: parameterization from Lemieux 2016 12 rn_ depfra= 0.125 ! fraction of ocean depth that ice must reach to initiate landfast12 rn_lf_depfra = 0.125 ! fraction of ocean depth that ice must reach to initiate landfast 13 13 ! recommended range: [0.1 ; 0.25] 14 rn_ icebfr = 15. ! maximum bottom stress per unit volume [N/m3]15 rn_lf relax= 1.e-5 ! relaxation time scale to reach static friction [s-1]16 rn_ tensile= 0.05 ! isotropic tensile strength [0-0.5??]14 rn_lf_bfr = 15. ! maximum bottom stress per unit volume [N/m3] 15 rn_lf_relax = 1.e-5 ! relaxation time scale to reach static friction [s-1] 16 rn_lf_tensile = 0.05 ! isotropic tensile strength [0-0.5??] 17 17 / -
NEMO/releases/r4.0/r4.0-HEAD/doc/namelists/namdyn_rhg
r11025 r13284 9 9 rn_relast = 0.333 ! ratio of elastic timescale to ice time step: Telast = dt_ice * rn_relast 10 10 ! advised value: 1/3 (rn_nevp=120) or 1/9 (rn_nevp=300) 11 ln_rhg_chkcvg = .false. ! check convergence of rheology (outputs: file ice_cvg.nc & variable uice_cvg) 11 12 / -
NEMO/releases/r4.0/r4.0-HEAD/doc/namelists/namini
r11703 r13284 3 3 !------------------------------------------------------------------------------ 4 4 ln_iceini = .true. ! activate ice initialization (T) or not (F) 5 ln_iceini_file = .false. ! netcdf file provided for initialization (T) or not (F) 5 nn_iceini_file = 0 ! 0 = Initialise sea ice based on SSTs 6 ! 1 = Initialise sea ice from single category netcdf file 7 ! 2 = Initialise sea ice from multi category restart file 6 8 rn_thres_sst = 2.0 ! max temp. above Tfreeze with initial ice = (sst - tfreeze) 7 9 rn_hti_ini_n = 3.0 ! initial ice thickness (m), North … … 23 25 rn_hpd_ini_n = 0.05 ! initial pond depth (m), North 24 26 rn_hpd_ini_s = 0.05 ! " " South 25 ! -- for ln_iceini_file = T 27 rn_hld_ini_n = 0.0 ! initial pond lid depth (m), North 28 rn_hld_ini_s = 0.0 ! " " South 29 ! -- for nn_iceini_file = 1 26 30 sn_hti = 'Ice_initialization' , -12 ,'hti' , .false. , .true., 'yearly' , '' , '', '' 27 31 sn_hts = 'Ice_initialization' , -12 ,'hts' , .false. , .true., 'yearly' , '' , '', '' … … 34 38 sn_apd = 'NOT USED' , -12 ,'apd' , .false. , .true., 'yearly' , '' , '', '' 35 39 sn_hpd = 'NOT USED' , -12 ,'hpd' , .false. , .true., 'yearly' , '' , '', '' 40 sn_hld = 'NOT USED' , -12 ,'hld' , .false. , .true., 'yearly' , '' , '', '' 36 41 cn_dir='./' 37 42 / -
NEMO/releases/r4.0/r4.0-HEAD/doc/namelists/namsbc_blk
r11703 r13284 31 31 sn_snow = 'ncar_precip.15JUNE2009_fill', -1. , 'SNOW' , .false. , .true. , 'yearly' , 'weights_core_orca2_bilinear_noc.nc' , '' , '' 32 32 sn_slp = 'slp.15JUNE2009_fill' , 6. , 'SLP' , .false. , .true. , 'yearly' , 'weights_core_orca2_bilinear_noc.nc' , '' , '' 33 sn_cc = 'NOT USED' , 24 , 'CC' , .false. , .true. , 'yearly' , 'weights_core_orca2_bilinear_noc.nc' , '' , '' 33 34 sn_tdif = 'taudif_core' , 24 , 'taudif' , .false. , .true. , 'yearly' , 'weights_core_orca2_bilinear_noc.nc' , '' , '' 34 35 / -
NEMO/releases/r4.0/r4.0-HEAD/doc/namelists/namsbc_cpl
r10075 r13284 2 2 &namsbc_cpl ! coupled ocean/atmosphere model ("key_oasis3") 3 3 !----------------------------------------------------------------------- 4 nn_cplmodel = 1 ! Maximum number of models to/from which NEMO is potentially sending/receiving data5 ln_usecplmask = .false. ! use a coupling mask file to merge data received from several models6 ! ! -> file cplmask.nc with the float variable called cplmask (jpi,jpj,nn_cplmodel)7 nn_cats_cpl = 5 ! Number of sea ice categories over which coupling is to be carried out (if not 1)8 4 nn_cplmodel = 1 ! Maximum number of models to/from which NEMO is potentially sending/receiving data 5 ln_usecplmask = .false. ! use a coupling mask file to merge data received from several models 6 ! ! -> file cplmask.nc with the float variable called cplmask (jpi,jpj,nn_cplmodel) 7 ln_scale_ice_flux = .false. ! use ice fluxes that are already "ice weighted" ( i.e. multiplied ice concentration) 8 nn_cats_cpl = 5 ! Number of sea ice categories over which coupling is to be carried out (if not 1) 9 9 !_____________!__________________________!____________!_____________!______________________!________! 10 10 ! ! description ! multiple ! vector ! vector ! vector ! -
NEMO/releases/r4.0/r4.0-HEAD/doc/namelists/namthd
r11025 r13284 6 6 ln_icedO = .true. ! activate ice growth in open-water (T) or not (F) 7 7 ln_icedS = .true. ! activate brine drainage (T) or not (F) 8 ! 9 ln_leadhfx = .true. ! heat in the leads is used to melt sea-ice before warming the ocean 8 10 / -
NEMO/releases/r4.0/r4.0-HEAD/doc/namelists/namthd_pnd
r11536 r13284 2 2 &namthd_pnd ! Melt ponds 3 3 !------------------------------------------------------------------------------ 4 ln_pnd = .false. ! activate melt ponds or not 5 ln_pnd_H12 = .false. ! activate evolutive melt ponds (from Holland et al 2012) 6 ln_pnd_CST = .false. ! activate constant melt ponds 7 rn_apnd = 0.2 ! prescribed pond fraction, at Tsu=0 degC 8 rn_hpnd = 0.05 ! prescribed pond depth, at Tsu=0 degC 9 ln_pnd_alb = .false. ! melt ponds affect albedo or not 4 ln_pnd = .false. ! activate melt ponds or not 5 ln_pnd_LEV = .false. ! level ice melt ponds (from Flocco et al 2007,2010 & Holland et al 2012) 6 rn_apnd_min = 0.15 ! minimum ice fraction that contributes to melt pond. range: 0.0 -- 0.15 ?? 7 rn_apnd_max = 0.85 ! maximum ice fraction that contributes to melt pond. range: 0.7 -- 0.85 ?? 8 ln_pnd_CST = .false. ! constant melt ponds 9 rn_apnd = 0.2 ! prescribed pond fraction, at Tsu=0 degC 10 rn_hpnd = 0.05 ! prescribed pond depth, at Tsu=0 degC 11 ln_pnd_lids = .true. ! frozen lids on top of the ponds (only for ln_pnd_LEV) 12 ln_pnd_alb = .true. ! effect of melt ponds on ice albedo 10 13 / -
NEMO/releases/r4.0/r4.0-HEAD/doc/namelists/namthd_zdf
r11025 r13284 7 7 rn_cnd_s = 0.31 ! thermal conductivity of the snow (0.31 W/m/K, Maykut and Untersteiner, 1971) 8 8 ! Obs: 0.1-0.5 (Lecomte et al, JAMES 2013) 9 rn_kappa_i = 1.0 ! radiation attenuation coefficient in sea ice [1/m] 9 rn_kappa_i = 1.0 ! radiation attenuation coefficient in sea ice [1/m] 10 rn_kappa_s = 10.0 ! nn_qtrice = 0: radiation attenuation coefficient in snow [1/m] 11 rn_kappa_smlt = 7.0 ! nn_qtrice = 1: radiation attenuation coefficient in melting snow [1/m] 12 rn_kappa_sdry = 10.0 ! radiation attenuation coefficient in dry snow [1/m] 13 ln_zdf_chkcvg = .false. ! check convergence of heat diffusion scheme (output variable: tice_cvg) 10 14 / -
NEMO/releases/r4.0/r4.0-HEAD/doc/namelists/namzdf_gls
r9355 r13284 13 13 nn_z0_met = 2 ! Method for surface roughness computation (0/1/2/3) 14 14 ! ! =3 requires ln_wave=T 15 nn_z0_ice = 1 ! attenutaion of surface wave breaking under ice 16 ! ! = 0 no impact of ice cover 17 ! ! = 1 roughness uses rn_hsri and is weigthed by 1-TANH(10*fr_i) 18 ! ! = 2 roughness uses rn_hsri and is weighted by 1-fr_i 19 ! ! = 3 roughness uses rn_hsri and is weighted by 1-MIN(1,4*fr_i) 15 20 nn_bc_surf = 1 ! surface condition (0/1=Dir/Neum) 16 21 nn_bc_bot = 1 ! bottom condition (0/1=Dir/Neum) -
NEMO/releases/r4.0/r4.0-HEAD/doc/namelists/namzdf_tke
r13272 r13284 25 25 ! = 0 constant 10 m length scale 26 26 ! = 1 0.5m at the equator to 30m poleward of 40 degrees 27 rn_eice = 4 ! below sea ice: =0 ON ; =4 OFF when ice fraction > 1/4 27 nn_eice = 1 ! attenutaion of langmuir & surface wave breaking under ice 28 ! ! = 0 no impact of ice cover on langmuir & surface wave breaking 29 ! ! = 1 weigthed by 1-TANH(10*fr_i) 30 ! ! = 2 weighted by 1-fr_i 31 ! ! = 3 weighted by 1-MIN(1,4*fr_i) 28 32 / -
NEMO/releases/r4.0/r4.0-HEAD/src/ICE/ice.F90
r11627 r13284 70 70 !! a_ip | - | Ice pond concentration | | 71 71 !! v_ip | - | Ice pond volume per unit area| m | 72 !! v_il | v_il_1d | Ice pond lid volume per area | m | 72 73 !! | 73 74 !!-------------|-------------|---------------------------------|-------| … … 85 86 !! t_su ! t_su_1d | Sea ice surface temperature ! K | 86 87 !! h_ip | h_ip_1d | Ice pond thickness | m | 88 !! h_il | h_il_1d | Ice pond lid thickness | m | 87 89 !! | 88 90 !! notes: the ice model only sees a bulk (i.e., vertically averaged) | … … 112 114 !! hm_ip | - | Mean ice pond depth | m | 113 115 !! vt_ip | - | Total ice pond vol. per unit area| m | 116 !! hm_il | - | Mean ice pond lid depth | m | 117 !! vt_il | - | Total ice pond lid vol. per area | m | 114 118 !!===================================================================== 115 119 … … 137 141 REAL(wp), PUBLIC :: rn_ishlat !: lateral boundary condition for sea-ice 138 142 LOGICAL , PUBLIC :: ln_landfast_L16 !: landfast ice parameterizationfrom lemieux2016 139 REAL(wp), PUBLIC :: rn_ depfra!: fraction of ocean depth that ice must reach to initiate landfast ice140 REAL(wp), PUBLIC :: rn_ icebfr !: maximum bottom stress per unit area of contact (lemieux2016) or per unit volume (home)141 REAL(wp), PUBLIC :: rn_lf relax!: relaxation time scale (s-1) to reach static friction142 REAL(wp), PUBLIC :: rn_ tensile!: isotropic tensile strength143 REAL(wp), PUBLIC :: rn_lf_depfra !: fraction of ocean depth that ice must reach to initiate landfast ice 144 REAL(wp), PUBLIC :: rn_lf_bfr !: maximum bottom stress per unit area of contact (lemieux2016) or per unit volume (home) 145 REAL(wp), PUBLIC :: rn_lf_relax !: relaxation time scale (s-1) to reach static friction 146 REAL(wp), PUBLIC :: rn_lf_tensile !: isotropic tensile strength 143 147 ! 144 148 ! !!** ice-ridging/rafting namelist (namdyn_rdgrft) ** … … 151 155 INTEGER , PUBLIC :: nn_nevp !: number of iterations for subcycling 152 156 REAL(wp), PUBLIC :: rn_relast !: ratio => telast/rdt_ice (1/3 or 1/9 depending on nb of subcycling nevp) 157 LOGICAL , PUBLIC :: ln_rhg_chkcvg !: check ice rheology convergence 153 158 ! 154 159 ! !!** ice-advection namelist (namdyn_adv) ** … … 158 163 ! !!** ice-surface boundary conditions namelist (namsbc) ** 159 164 ! -- icethd_dh -- ! 160 REAL(wp), PUBLIC :: rn_blow_s !: coef. for partitioning of snowfall between leads and sea ice 165 REAL(wp), PUBLIC :: rn_snwblow !: coef. for partitioning of snowfall between leads and sea ice 166 ! -- icethd_zdf and icealb -- ! 167 INTEGER , PUBLIC :: nn_snwfra !: calculate the fraction of ice covered by snow 168 ! ! = 0 fraction = 1 (if snow) or 0 (if no snow) 169 ! ! = 1 fraction = 1-exp(-0.2*rhos*hsnw) [MetO formulation] 170 ! ! = 2 fraction = hsnw / (hsnw+0.02) [CICE formulation] 161 171 ! -- icethd -- ! 162 172 REAL(wp), PUBLIC :: rn_cio !: drag coefficient for oceanic stress … … 166 176 ! ! = 1 Average N(cat) fluxes then redistribute over the N(cat) ice using T-ice and albedo sensitivity 167 177 ! ! = 2 Redistribute a single flux over categories 178 ! -- icethd_zdf -- ! 168 179 LOGICAL , PUBLIC :: ln_cndflx !: use conduction flux as surface boundary condition (instead of qsr and qns) 169 180 LOGICAL , PUBLIC :: ln_cndemulate !: emulate conduction flux (if not provided) … … 172 183 INTEGER, PUBLIC, PARAMETER :: np_cnd_ON = 1 !: forcing from conduction flux (SM0L) (compute qcn and qsr_tr via sbcblk.F90 or sbccpl.F90) 173 184 INTEGER, PUBLIC, PARAMETER :: np_cnd_EMU = 2 !: emulate conduction flux via icethd_zdf.F90 (BL99) (1st round compute qcn and qsr_tr, 2nd round use it) 174 185 INTEGER, PUBLIC :: nn_qtrice !: Solar flux transmitted thru the surface scattering layer: 186 ! ! = 0 Grenfell and Maykut 1977 (depends on cloudiness and is 0 when there is snow) 187 ! ! = 1 Lebrun 2019 (equals 0.3 anytime with different melting/dry snw conductivities) 188 ! 175 189 ! !!** ice-vertical diffusion namelist (namthd_zdf) ** 176 190 LOGICAL , PUBLIC :: ln_cndi_U64 !: thermal conductivity: Untersteiner (1964) 177 191 LOGICAL , PUBLIC :: ln_cndi_P07 !: thermal conductivity: Pringle et al (2007) 178 REAL(wp), PUBLIC :: rn_kappa_i !: coef. for the extinction of radiation Grenfell et al. (2006) [1/m]179 192 REAL(wp), PUBLIC :: rn_cnd_s !: thermal conductivity of the snow [W/m/K] 193 REAL(wp), PUBLIC :: rn_kappa_i !: coef. for the extinction of radiation in sea ice, Grenfell et al. (2006) [1/m] 194 REAL(wp), PUBLIC :: rn_kappa_s !: coef. for the extinction of radiation in snw (nn_qtrice=0) [1/m] 195 REAL(wp), PUBLIC :: rn_kappa_smlt !: coef. for the extinction of radiation in melt snw (nn_qtrice=1) [1/m] 196 REAL(wp), PUBLIC :: rn_kappa_sdry !: coef. for the extinction of radiation in dry snw (nn_qtrice=1) [1/m] 197 LOGICAL , PUBLIC :: ln_zdf_chkcvg !: check convergence of heat diffusion scheme 180 198 181 199 ! !!** ice-salinity namelist (namthd_sal) ** … … 190 208 ! !!** ice-ponds namelist (namthd_pnd) 191 209 LOGICAL , PUBLIC :: ln_pnd !: Melt ponds (T) or not (F) 192 LOGICAL , PUBLIC :: ln_pnd_H12 !: Melt ponds scheme from Holland et al 2012 210 LOGICAL , PUBLIC :: ln_pnd_LEV !: Melt ponds scheme from Holland et al (2012), Flocco et al (2007, 2010) 211 REAL(wp), PUBLIC :: rn_apnd_min !: Minimum ice fraction that contributes to melt ponds 212 REAL(wp), PUBLIC :: rn_apnd_max !: Maximum ice fraction that contributes to melt ponds 193 213 LOGICAL , PUBLIC :: ln_pnd_CST !: Melt ponds scheme with constant fraction and depth 194 214 REAL(wp), PUBLIC :: rn_apnd !: prescribed pond fraction (0<rn_apnd<1) 195 215 REAL(wp), PUBLIC :: rn_hpnd !: prescribed pond depth (0<rn_hpnd<1) 216 LOGICAL, PUBLIC :: ln_pnd_lids !: Allow ponds to have frozen lids 196 217 LOGICAL , PUBLIC :: ln_pnd_alb !: melt ponds affect albedo 197 218 … … 218 239 219 240 ! !!** define arrays 220 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: u_oce,v_oce !: surface ocean velocity used in ice dynamics 221 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: ht_i_new !: ice collection thickness accreted in leads 222 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: strength !: ice strength 223 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: stress1_i, stress2_i, stress12_i !: 1st, 2nd & diagonal stress tensor element 224 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: delta_i !: ice rheology elta factor (Flato & Hibler 95) [s-1] 225 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: divu_i !: Divergence of the velocity field [s-1] 226 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: shear_i !: Shear of the velocity field [s-1] 227 ! 228 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: t_bo !: Sea-Ice bottom temperature [Kelvin] 229 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: qlead !: heat balance of the lead (or of the open ocean) 230 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: qsb_ice_bot !: net downward heat flux from the ice to the ocean 231 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: fhld !: heat flux from the lead used for bottom melting 232 233 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: wfx_snw !: mass flux from snow-ocean mass exchange [kg.m-2.s-1] 234 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: wfx_snw_sni !: mass flux from snow ice growth component of wfx_snw [kg.m-2.s-1] 235 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: wfx_snw_sum !: mass flux from surface melt component of wfx_snw [kg.m-2.s-1] 236 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: wfx_pnd !: mass flux from melt pond-ocean mass exchange [kg.m-2.s-1] 237 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: wfx_spr !: mass flux from snow precipitation on ice [kg.m-2.s-1] 238 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: wfx_sub !: mass flux from sublimation of snow/ice [kg.m-2.s-1] 239 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: wfx_snw_sub !: mass flux from snow sublimation [kg.m-2.s-1] 240 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: wfx_ice_sub !: mass flux from ice sublimation [kg.m-2.s-1] 241 242 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: wfx_snw_dyn !: mass flux from dynamical component of wfx_snw [kg.m-2.s-1] 243 244 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: wfx_ice !: mass flux from ice-ocean mass exchange [kg.m-2.s-1] 245 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: wfx_sni !: mass flux from snow ice growth component of wfx_ice [kg.m-2.s-1] 246 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: wfx_opw !: mass flux from lateral ice growth component of wfx_ice [kg.m-2.s-1] 247 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: wfx_bog !: mass flux from bottom ice growth component of wfx_ice [kg.m-2.s-1] 248 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: wfx_dyn !: mass flux from dynamical ice growth component of wfx_ice [kg.m-2.s-1] 249 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: wfx_bom !: mass flux from bottom melt component of wfx_ice [kg.m-2.s-1] 250 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: wfx_sum !: mass flux from surface melt component of wfx_ice [kg.m-2.s-1] 251 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: wfx_lam !: mass flux from lateral melt component of wfx_ice [kg.m-2.s-1] 252 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: wfx_res !: mass flux from residual component of wfx_ice [kg.m-2.s-1] 253 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: wfx_err_sub !: mass flux error after sublimation [kg.m-2.s-1] 254 255 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: sfx_bog !: salt flux due to ice bottom growth [pss.kg.m-2.s-1 => g.m-2.s-1] 256 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: sfx_bom !: salt flux due to ice bottom melt [pss.kg.m-2.s-1 => g.m-2.s-1] 257 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: sfx_lam !: salt flux due to ice lateral melt [pss.kg.m-2.s-1 => g.m-2.s-1] 258 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: sfx_sum !: salt flux due to ice surface melt [pss.kg.m-2.s-1 => g.m-2.s-1] 259 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: sfx_sni !: salt flux due to snow-ice growth [pss.kg.m-2.s-1 => g.m-2.s-1] 260 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: sfx_opw !: salt flux due to growth in open water [pss.kg.m-2.s-1 => g.m-2.s-1] 261 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: sfx_bri !: salt flux due to brine rejection [pss.kg.m-2.s-1 => g.m-2.s-1] 262 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: sfx_dyn !: salt flux due to porous ridged ice formation [pss.kg.m-2.s-1 => g.m-2.s-1] 263 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: sfx_res !: salt flux due to correction on ice thick. (residual) [pss.kg.m-2.s-1 => g.m-2.s-1] 264 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: sfx_sub !: salt flux due to ice sublimation [pss.kg.m-2.s-1 => g.m-2.s-1] 265 266 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hfx_bog !: total heat flux causing bottom ice growth [W.m-2] 267 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hfx_bom !: total heat flux causing bottom ice melt [W.m-2] 268 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hfx_sum !: total heat flux causing surface ice melt [W.m-2] 269 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hfx_opw !: total heat flux causing open water ice formation [W.m-2] 270 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hfx_dif !: total heat flux causing Temp change in the ice [W.m-2] 271 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hfx_snw !: heat flux for snow melt [W.m-2] 272 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hfx_err_dif !: heat flux remaining due to change in non-solar flux [W.m-2] 273 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hfx_err_rem !: heat flux error after heat remapping => must be 0 [W.m-2] 274 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: qt_atm_oi !: heat flux at the interface atm-[oce+ice] [W.m-2] 275 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: qt_oce_ai !: heat flux at the interface oce-[atm+ice] [W.m-2] 241 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: u_oce,v_oce !: surface ocean velocity used in ice dynamics 242 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: ht_i_new !: ice collection thickness accreted in leads 243 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: strength !: ice strength 244 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: stress1_i, stress2_i, stress12_i !: 1st, 2nd & diagonal stress tensor element 245 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: delta_i !: ice rheology elta factor (Flato & Hibler 95) [s-1] 246 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: divu_i !: Divergence of the velocity field [s-1] 247 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: shear_i !: Shear of the velocity field [s-1] 248 ! 249 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: t_bo !: Sea-Ice bottom temperature [Kelvin] 250 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: qlead !: heat balance of the lead (or of the open ocean) 251 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: qsb_ice_bot !: net downward heat flux from the ice to the ocean 252 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: fhld !: heat flux from the lead used for bottom melting 253 254 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: wfx_snw !: mass flux from snow-ocean mass exchange [kg.m-2.s-1] 255 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: wfx_snw_sni !: mass flux from snow ice growth component of wfx_snw [kg.m-2.s-1] 256 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: wfx_snw_sum !: mass flux from surface melt component of wfx_snw [kg.m-2.s-1] 257 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: wfx_pnd !: mass flux from melt pond-ocean mass exchange [kg.m-2.s-1] 258 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: wfx_spr !: mass flux from snow precipitation on ice [kg.m-2.s-1] 259 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: wfx_sub !: mass flux from sublimation of snow/ice [kg.m-2.s-1] 260 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: wfx_snw_sub !: mass flux from snow sublimation [kg.m-2.s-1] 261 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: wfx_ice_sub !: mass flux from ice sublimation [kg.m-2.s-1] 262 263 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: wfx_snw_dyn !: mass flux from dynamical component of wfx_snw [kg.m-2.s-1] 264 265 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: wfx_ice !: mass flux from ice-ocean mass exchange [kg.m-2.s-1] 266 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: wfx_sni !: mass flux from snow ice growth component of wfx_ice [kg.m-2.s-1] 267 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: wfx_opw !: mass flux from lateral ice growth component of wfx_ice [kg.m-2.s-1] 268 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: wfx_bog !: mass flux from bottom ice growth component of wfx_ice [kg.m-2.s-1] 269 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: wfx_dyn !: mass flux from dynamical ice growth component of wfx_ice [kg.m-2.s-1] 270 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: wfx_bom !: mass flux from bottom melt component of wfx_ice [kg.m-2.s-1] 271 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: wfx_sum !: mass flux from surface melt component of wfx_ice [kg.m-2.s-1] 272 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: wfx_lam !: mass flux from lateral melt component of wfx_ice [kg.m-2.s-1] 273 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: wfx_res !: mass flux from residual component of wfx_ice [kg.m-2.s-1] 274 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: wfx_err_sub !: mass flux error after sublimation [kg.m-2.s-1] 275 276 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: sfx_bog !: salt flux due to ice bottom growth [pss.kg.m-2.s-1 => g.m-2.s-1] 277 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: sfx_bom !: salt flux due to ice bottom melt [pss.kg.m-2.s-1 => g.m-2.s-1] 278 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: sfx_lam !: salt flux due to ice lateral melt [pss.kg.m-2.s-1 => g.m-2.s-1] 279 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: sfx_sum !: salt flux due to ice surface melt [pss.kg.m-2.s-1 => g.m-2.s-1] 280 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: sfx_sni !: salt flux due to snow-ice growth [pss.kg.m-2.s-1 => g.m-2.s-1] 281 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: sfx_opw !: salt flux due to growth in open water [pss.kg.m-2.s-1 => g.m-2.s-1] 282 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: sfx_bri !: salt flux due to brine rejection [pss.kg.m-2.s-1 => g.m-2.s-1] 283 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: sfx_dyn !: salt flux due to porous ridged ice formation [pss.kg.m-2.s-1 => g.m-2.s-1] 284 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: sfx_res !: salt flux due to correction on ice thick. (residual) [pss.kg.m-2.s-1 => g.m-2.s-1] 285 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: sfx_sub !: salt flux due to ice sublimation [pss.kg.m-2.s-1 => g.m-2.s-1] 286 287 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hfx_bog !: total heat flux causing bottom ice growth [W.m-2] 288 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hfx_bom !: total heat flux causing bottom ice melt [W.m-2] 289 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hfx_sum !: total heat flux causing surface ice melt [W.m-2] 290 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hfx_opw !: total heat flux causing open water ice formation [W.m-2] 291 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hfx_dif !: total heat flux causing Temp change in the ice [W.m-2] 292 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hfx_snw !: heat flux for snow melt [W.m-2] 293 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hfx_err_dif !: heat flux remaining due to change in non-solar flux [W.m-2] 294 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: qt_atm_oi !: heat flux at the interface atm-[oce+ice] [W.m-2] 295 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: qt_oce_ai !: heat flux at the interface oce-[atm+ice] [W.m-2] 276 296 277 297 ! heat flux associated with ice-atmosphere mass exchange 278 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hfx_sub!: heat flux for sublimation [W.m-2]279 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hfx_spr!: heat flux of the snow precipitation [W.m-2]298 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hfx_sub !: heat flux for sublimation [W.m-2] 299 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hfx_spr !: heat flux of the snow precipitation [W.m-2] 280 300 281 301 ! heat flux associated with ice-ocean mass exchange 282 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hfx_thd!: ice-ocean heat flux from thermo processes (icethd_dh) [W.m-2]283 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hfx_dyn!: ice-ocean heat flux from ridging [W.m-2]284 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hfx_res!: heat flux due to correction on ice thick. (residual) [W.m-2]285 286 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: rn_amax_2d !: maximum ice concentration 2d array287 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: qtr_ice_bot !: transmitted solar radiation under ice288 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: t1_ice !: temperature of the first layer(ln_cndflx=T) [K]289 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: cnd_ice !: effective conductivity at the top of ice/snow(ln_cndflx=T) [W.m-2.K-1]302 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hfx_thd !: ice-ocean heat flux from thermo processes (icethd_dh) [W.m-2] 303 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hfx_dyn !: ice-ocean heat flux from ridging [W.m-2] 304 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hfx_res !: heat flux due to correction on ice thick. (residual) [W.m-2] 305 306 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: rn_amax_2d !: maximum ice concentration 2d array 307 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: qtr_ice_bot !: transmitted solar radiation under ice 308 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: t1_ice !: temperature of the first layer (ln_cndflx=T) [K] 309 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: cnd_ice !: effective conductivity of the 1st layer (ln_cndflx=T) [W.m-2.K-1] 290 310 291 311 !!---------------------------------------------------------------------- … … 293 313 !!---------------------------------------------------------------------- 294 314 !! Variables defined for each ice category 295 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: h_i!: Ice thickness (m)296 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: a_i!: Ice fractional areas (concentration)297 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: v_i!: Ice volume per unit area (m)298 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: v_s!: Snow volume per unit area (m)299 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: h_s!: Snow thickness (m)300 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: t_su!: Sea-Ice Surface Temperature (K)301 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: s_i!: Sea-Ice Bulk salinity (pss)302 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: sv_i!: Sea-Ice Bulk salinity * volume per area (pss.m)303 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: o_i!: Sea-Ice Age (s)304 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: oa_i!: Sea-Ice Age times ice area (s)305 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: bv_i!: brine volume315 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: h_i !: Ice thickness (m) 316 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: a_i !: Ice fractional areas (concentration) 317 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: v_i !: Ice volume per unit area (m) 318 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: v_s !: Snow volume per unit area (m) 319 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: h_s !: Snow thickness (m) 320 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: t_su !: Sea-Ice Surface Temperature (K) 321 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: s_i !: Sea-Ice Bulk salinity (pss) 322 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: sv_i !: Sea-Ice Bulk salinity * volume per area (pss.m) 323 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: o_i !: Sea-Ice Age (s) 324 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: oa_i !: Sea-Ice Age times ice area (s) 325 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: bv_i !: brine volume 306 326 307 327 !! Variables summed over all categories, or associated to all the ice in a single grid cell 308 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: u_ice, v_ice !: components of the ice velocity (m/s) 309 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: vt_i , vt_s !: ice and snow total volume per unit area (m) 310 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: st_i !: Total ice salinity content (pss.m) 311 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: at_i !: ice total fractional area (ice concentration) 312 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: ato_i !: =1-at_i ; total open water fractional area 313 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: et_i , et_s !: ice and snow total heat content (J/m2) 314 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: tm_i !: mean ice temperature over all categories (K) 315 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: tm_s !: mean snw temperature over all categories (K) 316 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: bvm_i !: brine volume averaged over all categories 317 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: sm_i !: mean sea ice salinity averaged over all categories (pss) 318 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: tm_su !: mean surface temperature over all categories (K) 319 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hm_i !: mean ice thickness over all categories (m) 320 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hm_s !: mean snow thickness over all categories (m) 321 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: om_i !: mean ice age over all categories (s) 322 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: tau_icebfr !: ice friction on ocean bottom (landfast param activated) 323 324 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) :: t_s !: Snow temperatures [K] 325 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) :: e_s !: Snow enthalpy [J/m2] 326 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) :: t_i !: ice temperatures [K] 327 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) :: e_i !: ice enthalpy [J/m2] 328 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) :: sz_i !: ice salinity [PSS] 329 330 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: a_ip !: melt pond concentration 331 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: v_ip !: melt pond volume per grid cell area [m] 332 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: a_ip_frac !: melt pond fraction (a_ip/a_i) 333 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: h_ip !: melt pond depth [m] 334 335 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: at_ip !: total melt pond concentration 336 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hm_ip !: mean melt pond depth [m] 337 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: vt_ip !: total melt pond volume per gridcell area [m] 338 339 !!---------------------------------------------------------------------- 340 !! * Old values of global variables 341 !!---------------------------------------------------------------------- 342 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: v_s_b, v_i_b, h_s_b, h_i_b, h_ip_b !: snow and ice volumes/thickness 343 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: a_i_b, sv_i_b, oa_i_b !: 344 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) :: e_s_b !: snow heat content 345 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) :: e_i_b !: ice temperatures 346 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: u_ice_b, v_ice_b !: ice velocity 347 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: at_i_b !: ice concentration (total) 328 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: u_ice, v_ice !: components of the ice velocity (m/s) 329 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: vt_i , vt_s !: ice and snow total volume per unit area (m) 330 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: st_i !: Total ice salinity content (pss.m) 331 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: at_i !: ice total fractional area (ice concentration) 332 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: ato_i !: =1-at_i ; total open water fractional area 333 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: et_i , et_s !: ice and snow total heat content (J/m2) 334 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: tm_i !: mean ice temperature over all categories (K) 335 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: tm_s !: mean snw temperature over all categories (K) 336 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: bvm_i !: brine volume averaged over all categories 337 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: sm_i !: mean sea ice salinity averaged over all categories (pss) 338 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: tm_su !: mean surface temperature over all categories (K) 339 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hm_i !: mean ice thickness over all categories (m) 340 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hm_s !: mean snow thickness over all categories (m) 341 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: om_i !: mean ice age over all categories (s) 342 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: tau_icebfr !: ice friction on ocean bottom (landfast param activated) 343 344 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) :: t_s !: Snow temperatures [K] 345 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) :: e_s !: Snow enthalpy [J/m2] 346 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) :: t_i !: ice temperatures [K] 347 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) :: e_i !: ice enthalpy [J/m2] 348 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) :: sz_i !: ice salinity [PSS] 349 350 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: a_ip !: melt pond concentration 351 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: v_ip !: melt pond volume per grid cell area [m] 352 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: a_ip_frac !: melt pond fraction (a_ip/a_i) 353 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: a_ip_eff !: melt pond effective fraction (not covered up by lid) (a_ip/a_i) 354 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: h_ip !: melt pond depth [m] 355 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: v_il !: melt pond lid volume [m] 356 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: h_il !: melt pond lid thickness [m] 357 358 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: at_ip !: total melt pond concentration 359 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hm_ip !: mean melt pond depth [m] 360 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: vt_ip !: total melt pond volume per gridcell area [m] 361 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hm_il !: mean melt pond lid depth [m] 362 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: vt_il !: total melt pond lid volume per gridcell area [m] 363 364 !!---------------------------------------------------------------------- 365 !! * Global variables at before time step 366 !!---------------------------------------------------------------------- 367 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: v_s_b, v_i_b, h_s_b, h_i_b !: snow and ice volumes/thickness 368 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: a_i_b, sv_i_b !: 369 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) :: e_s_b !: snow heat content 370 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) :: e_i_b !: ice temperatures 371 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: u_ice_b, v_ice_b !: ice velocity 372 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: at_i_b !: ice concentration (total) 348 373 349 374 !!---------------------------------------------------------------------- 350 375 !! * Ice thickness distribution variables 351 376 !!---------------------------------------------------------------------- 352 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: hi_max!: Boundary of ice thickness categories in thickness space353 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: hi_mean!: Mean ice thickness in catgories377 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: hi_max !: Boundary of ice thickness categories in thickness space 378 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: hi_mean !: Mean ice thickness in catgories 354 379 ! 355 380 !!---------------------------------------------------------------------- 356 381 !! * Ice diagnostics 357 382 !!---------------------------------------------------------------------- 358 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: diag_trp_vi !: transport of ice volume359 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: diag_trp_vs !: transport of snw volume360 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: diag_trp_ei !: transport of ice enthalpy [W/m2]361 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: diag_trp_es !: transport of snw enthalpy [W/m2]362 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: diag_trp_sv !: transport of salt content363 ! 364 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: diag_heat !: snw/ice heat content variation [W/m2]365 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: diag_sice !: ice salt content variation []366 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: diag_vice !: ice volume variation [m/s]367 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: diag_vsnw !: snw volume variation [m/s]368 383 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: diag_trp_vi !: transport of ice volume 384 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: diag_trp_vs !: transport of snw volume 385 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: diag_trp_ei !: transport of ice enthalpy [W/m2] 386 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: diag_trp_es !: transport of snw enthalpy [W/m2] 387 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: diag_trp_sv !: transport of salt content 388 ! 389 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: diag_heat !: snw/ice heat content variation [W/m2] 390 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: diag_sice !: ice salt content variation [] 391 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: diag_vice !: ice volume variation [m/s] 392 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: diag_vsnw !: snw volume variation [m/s] 393 ! 369 394 !!---------------------------------------------------------------------- 370 395 !! * Ice conservation 371 396 !!---------------------------------------------------------------------- 372 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: diag_v !: conservation of ice volume373 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: diag_s !: conservation of ice salt374 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: diag_t !: conservation of ice heat375 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: diag_fv !: conservation of ice volume376 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: diag_fs !: conservation of ice salt377 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: diag_ft !: conservation of ice heat397 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: diag_v !: conservation of ice volume 398 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: diag_s !: conservation of ice salt 399 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: diag_t !: conservation of ice heat 400 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: diag_fv !: conservation of ice volume 401 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: diag_fs !: conservation of ice salt 402 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: diag_ft !: conservation of ice heat 378 403 ! 379 404 !!---------------------------------------------------------------------- … … 381 406 !!---------------------------------------------------------------------- 382 407 ! Extra sea ice diagnostics to address the data request 383 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: t_si !: Temperature at Snow-ice interface (K) 384 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: tm_si !: mean temperature at the snow-ice interface (K) 385 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: qcn_ice_bot !: Bottom conduction flux (W/m2) 386 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: qcn_ice_top !: Surface conduction flux (W/m2) 387 408 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: t_si !: Temperature at Snow-ice interface (K) 409 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: tm_si !: mean temperature at the snow-ice interface (K) 410 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: qcn_ice_bot !: Bottom conduction flux (W/m2) 411 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: qcn_ice_top !: Surface conduction flux (W/m2) 412 ! 413 !!---------------------------------------------------------------------- 414 !! * Only for atmospheric coupling 415 !!---------------------------------------------------------------------- 416 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: a_i_last_couple !: Ice fractional area at last coupling time 388 417 ! 389 418 !!---------------------------------------------------------------------- … … 400 429 INTEGER :: ice_alloc 401 430 ! 402 INTEGER :: ierr(1 6), ii431 INTEGER :: ierr(17), ii 403 432 !!----------------------------------------------------------------- 404 433 ierr(:) = 0 … … 424 453 & hfx_sum (jpi,jpj) , hfx_bom (jpi,jpj) , hfx_bog(jpi,jpj) , hfx_dif(jpi,jpj) , & 425 454 & hfx_opw (jpi,jpj) , hfx_thd (jpi,jpj) , hfx_dyn(jpi,jpj) , hfx_spr(jpi,jpj) , & 426 & hfx_err_dif(jpi,jpj) , hfx_err_rem(jpi,jpj) , wfx_err_sub(jpi,jpj) ,STAT=ierr(ii) )455 & hfx_err_dif(jpi,jpj) , wfx_err_sub(jpi,jpj) , STAT=ierr(ii) ) 427 456 428 457 ! * Ice global state variables … … 448 477 449 478 ii = ii + 1 450 ALLOCATE( a_ip(jpi,jpj,jpl) , v_ip(jpi,jpj,jpl) , a_ip_frac(jpi,jpj,jpl) , h_ip(jpi,jpj,jpl) , STAT = ierr(ii) ) 451 452 ii = ii + 1 453 ALLOCATE( at_ip(jpi,jpj) , hm_ip(jpi,jpj) , vt_ip(jpi,jpj) , STAT = ierr(ii) ) 479 ALLOCATE( a_ip(jpi,jpj,jpl) , v_ip(jpi,jpj,jpl) , a_ip_frac(jpi,jpj,jpl) , h_ip(jpi,jpj,jpl), & 480 & v_il(jpi,jpj,jpl) , h_il(jpi,jpj,jpl) , a_ip_eff (jpi,jpj,jpl) , STAT = ierr(ii) ) 481 482 ii = ii + 1 483 ALLOCATE( at_ip(jpi,jpj) , hm_ip(jpi,jpj) , vt_ip(jpi,jpj) , hm_il(jpi,jpj) , vt_il(jpi,jpj) , STAT = ierr(ii) ) 454 484 455 485 ! * Old values of global variables 456 486 ii = ii + 1 457 ALLOCATE( v_s_b (jpi,jpj,jpl) , v_i_b (jpi,jpj,jpl) , h_s_b(jpi,jpj,jpl) , h_i_b(jpi,jpj,jpl), h_ip_b(jpi,jpj,jpl),&458 & a_i_b (jpi,jpj,jpl) , sv_i_b(jpi,jpj,jpl) , e_i_b(jpi,jpj,nlay_i,jpl) , e_s_b(jpi,jpj,nlay_s,jpl) , 459 & oa_i_b(jpi,jpj,jpl) ,STAT=ierr(ii) )487 ALLOCATE( v_s_b (jpi,jpj,jpl) , v_i_b (jpi,jpj,jpl) , h_s_b(jpi,jpj,jpl) , h_i_b(jpi,jpj,jpl), & 488 & a_i_b (jpi,jpj,jpl) , sv_i_b(jpi,jpj,jpl) , e_i_b(jpi,jpj,nlay_i,jpl) , e_s_b(jpi,jpj,nlay_s,jpl) , & 489 & STAT=ierr(ii) ) 460 490 461 491 ii = ii + 1 … … 481 511 ALLOCATE( t_si(jpi,jpj,jpl) , tm_si(jpi,jpj) , qcn_ice_bot(jpi,jpj,jpl) , qcn_ice_top(jpi,jpj,jpl) , STAT = ierr(ii) ) 482 512 513 ! * For atmospheric coupling 514 ii = ii + 1 515 ALLOCATE( a_i_last_couple(jpi,jpj,jpl) , STAT=ierr(ii) ) 516 483 517 ice_alloc = MAXVAL( ierr(:) ) 484 518 IF( ice_alloc /= 0 ) CALL ctl_stop( 'STOP', 'ice_alloc: failed to allocate arrays.' ) 485 519 ! 520 486 521 END FUNCTION ice_alloc 487 522 -
NEMO/releases/r4.0/r4.0-HEAD/src/ICE/ice1d.F90
r10786 r13284 51 51 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: hfx_snw_1d 52 52 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: hfx_dyn_1d 53 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: hfx_err_rem_1d54 53 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: hfx_err_dif_1d 55 54 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: qt_oce_ai_1d … … 124 123 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: oa_i_1d !: 125 124 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: o_i_1d !: 126 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: a_ip_1d !: 125 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: a_ip_1d !: ice ponds 127 126 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: v_ip_1d !: 128 127 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: h_ip_1d !: 129 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: a_ip_frac_1d !: 128 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: v_il_1d !: Ice pond lid 129 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: h_il_1d !: 130 130 131 131 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: t_s_1d !: corresponding to the 2D var t_s … … 146 146 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: sss_1d 147 147 148 ! convergence check 149 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: tice_cvgerr_1d !: convergence of ice/snow temp (dT) [K] 150 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: tice_cvgstp_1d !: convergence of ice/snow temp (subtimestep) [-] 148 151 ! 149 152 !!---------------------- … … 157 160 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: a_ip_2d 158 161 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: v_ip_2d 162 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: v_il_2d 159 163 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: t_su_2d 160 164 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: h_i_2d … … 175 179 !!---------------------------------------------------------------------! 176 180 INTEGER :: ice1D_alloc ! return value 177 INTEGER :: ierr( 7), ii181 INTEGER :: ierr(8), ii 178 182 !!---------------------------------------------------------------------! 179 183 ierr(:) = 0 … … 189 193 & hfx_thd_1d(jpij) , hfx_spr_1d (jpij) , & 190 194 & hfx_snw_1d(jpij) , hfx_sub_1d (jpij) , & 191 & hfx_res_1d(jpij) , hfx_err_ rem_1d(jpij) , hfx_err_dif_1d(jpij) , qt_oce_ai_1d(jpij), STAT=ierr(ii) )195 & hfx_res_1d(jpij) , hfx_err_dif_1d(jpij) , qt_oce_ai_1d(jpij), STAT=ierr(ii) ) 192 196 ! 193 197 ii = ii + 1 … … 208 212 & dh_s_tot(jpij) , dh_i_sum(jpij) , dh_i_itm (jpij) , dh_i_bom(jpij) , dh_i_bog(jpij) , & 209 213 & dh_i_sub(jpij) , dh_s_mlt(jpij) , dh_snowice(jpij) , s_i_1d (jpij) , s_i_new (jpij) , & 210 & a_ip_1d (jpij) , v_ip_1d (jpij) , v_i_1d (jpij) , v_s_1d (jpij) , 211 & h_i p_1d (jpij) , a_ip_frac_1d(jpij) ,&214 & a_ip_1d (jpij) , v_ip_1d (jpij) , v_i_1d (jpij) , v_s_1d (jpij) , v_il_1d (jpij) , & 215 & h_il_1d (jpij) , h_ip_1d (jpij) , & 212 216 & sv_i_1d (jpij) , oa_i_1d (jpij) , o_i_1d (jpij) , STAT=ierr(ii) ) 213 217 ! … … 224 228 ! 225 229 ii = ii + 1 230 ALLOCATE( tice_cvgerr_1d(jpij) , tice_cvgstp_1d(jpij) , STAT=ierr(ii) ) 231 ! 232 ii = ii + 1 226 233 ALLOCATE( a_i_2d (jpij,jpl) , a_ib_2d(jpij,jpl) , h_i_2d (jpij,jpl) , h_ib_2d(jpij,jpl) , & 227 234 & v_i_2d (jpij,jpl) , v_s_2d (jpij,jpl) , oa_i_2d(jpij,jpl) , sv_i_2d(jpij,jpl) , & 228 & a_ip_2d(jpij,jpl) , v_ip_2d(jpij,jpl) , t_su_2d(jpij,jpl) , 235 & a_ip_2d(jpij,jpl) , v_ip_2d(jpij,jpl) , t_su_2d(jpij,jpl) , v_il_2d(jpij,jpl) , & 229 236 & STAT=ierr(ii) ) 230 237 -
NEMO/releases/r4.0/r4.0-HEAD/src/ICE/icealb.F90
r11536 r13284 14 14 !! ice_alb_init : initialisation of albedo computation 15 15 !!---------------------------------------------------------------------- 16 USE ice, ONLY: jpl ! sea-ice: number of categories17 16 USE phycst ! physical constants 18 17 USE dom_oce ! domain: ocean 18 USE ice, ONLY: jpl ! sea-ice: number of categories 19 USE icevar ! sea-ice: operations 19 20 ! 20 21 USE in_out_manager ! I/O manager … … 45 46 CONTAINS 46 47 47 SUBROUTINE ice_alb( pt_su, ph_ice, ph_snw, ld_pnd_alb, pafrac_pnd, ph_pnd, p alb_cs, palb_os)48 SUBROUTINE ice_alb( pt_su, ph_ice, ph_snw, ld_pnd_alb, pafrac_pnd, ph_pnd, pcloud_fra, palb_ice ) 48 49 !!---------------------------------------------------------------------- 49 50 !! *** ROUTINE ice_alb *** … … 97 98 REAL(wp), INTENT(in ), DIMENSION(:,:,:) :: pafrac_pnd ! melt pond relative fraction (per unit ice area) 98 99 REAL(wp), INTENT(in ), DIMENSION(:,:,:) :: ph_pnd ! melt pond depth 99 REAL(wp), INTENT( out), DIMENSION(:,:,:) :: palb_cs ! albedo of ice under clear sky 100 REAL(wp), INTENT( out), DIMENSION(:,:,:) :: palb_os ! albedo of ice under overcast sky 101 ! 100 REAL(wp), INTENT(in ), DIMENSION(:,:) :: pcloud_fra ! cloud fraction 101 REAL(wp), INTENT( out), DIMENSION(:,:,:) :: palb_ice ! albedo of ice 102 ! 103 REAL(wp), DIMENSION(jpi,jpj,jpl) :: za_s_fra ! ice fraction covered by snow 102 104 INTEGER :: ji, jj, jl ! dummy loop indices 103 105 REAL(wp) :: z1_c1, z1_c2,z1_c3, z1_c4 ! local scalar … … 106 108 REAL(wp) :: zalb_ice, zafrac_ice ! bare sea ice albedo & relative ice fraction 107 109 REAL(wp) :: zalb_snw, zafrac_snw ! snow-covered sea ice albedo & relative snow fraction 110 REAL(wp) :: zalb_cs, zalb_os ! albedo of ice under clear/overcast sky 108 111 !!--------------------------------------------------------------------- 109 112 ! … … 116 119 z1_c4 = 1. / 0.03 117 120 ! 121 CALL ice_var_snwfra( ph_snw, za_s_fra ) ! calculate ice fraction covered by snow 122 ! 118 123 DO jl = 1, jpl 119 124 DO jj = 1, jpj 120 125 DO ji = 1, jpi 121 ! !--- Specific snow, ice and pond fractions (for now, we prevent melt ponds and snow at the same time) 122 IF( ph_snw(ji,jj,jl) == 0._wp ) THEN 123 zafrac_snw = 0._wp 124 IF( ld_pnd_alb ) THEN 125 zafrac_pnd = pafrac_pnd(ji,jj,jl) 126 ELSE 127 zafrac_pnd = 0._wp 128 ENDIF 129 zafrac_ice = 1._wp - zafrac_pnd 126 ! 127 !---------------------------------------------! 128 !--- Specific snow, ice and pond fractions ---! 129 !---------------------------------------------! 130 zafrac_snw = za_s_fra(ji,jj,jl) 131 IF( ld_pnd_alb ) THEN 132 zafrac_pnd = MIN( pafrac_pnd(ji,jj,jl), 1._wp - zafrac_snw ) ! make sure (a_ip_eff + a_s_fra) <= 1 130 133 ELSE 131 zafrac_snw = 1._wp ! Snow fully "shades" melt ponds and ice132 134 zafrac_pnd = 0._wp 133 zafrac_ice = 0._wp 134 ENDIF 135 ! 135 ENDIF 136 zafrac_ice = MAX( 0._wp, 1._wp - zafrac_pnd - zafrac_snw ) ! max for roundoff errors 137 ! 138 !---------------! 139 !--- Albedos ---! 140 !---------------! 136 141 ! !--- Bare ice albedo (for hi > 150cm) 137 142 IF( ld_pnd_alb ) THEN 138 143 zalb_ice = rn_alb_idry 139 144 ELSE 140 IF( ph_snw(ji,jj,jl) == 0._wp .AND. pt_su(ji,jj,jl) >= rt0 ) THEN ; zalb_ice = rn_alb_imlt141 ELSE ; zalb_ice = rn_alb_idry ; ENDIF145 IF( ph_snw(ji,jj,jl) == 0._wp .AND. pt_su(ji,jj,jl) >= rt0 ) THEN ; zalb_ice = rn_alb_imlt 146 ELSE ; zalb_ice = rn_alb_idry ; ENDIF 142 147 ENDIF 143 148 ! !--- Bare ice albedo (for hi < 150cm) … … 155 160 ENDIF 156 161 ! !--- Ponded ice albedo 157 IF( ld_pnd_alb ) THEN 158 zalb_pnd = rn_alb_dpnd - ( rn_alb_dpnd - zalb_ice ) * EXP( - ph_pnd(ji,jj,jl) * z1_href_pnd ) 159 ELSE 160 zalb_pnd = rn_alb_dpnd 161 ENDIF 162 zalb_pnd = rn_alb_dpnd - ( rn_alb_dpnd - zalb_ice ) * EXP( - ph_pnd(ji,jj,jl) * z1_href_pnd ) 163 ! 162 164 ! !--- Surface albedo is weighted mean of snow, ponds and bare ice contributions 163 palb_os(ji,jj,jl) = ( zafrac_snw * zalb_snw + zafrac_pnd * zalb_pnd + zafrac_ice * zalb_ice ) * tmask(ji,jj,1) 164 ! 165 palb_cs(ji,jj,jl) = palb_os(ji,jj,jl) & 166 & - ( - 0.1010 * palb_os(ji,jj,jl) * palb_os(ji,jj,jl) & 167 & + 0.1933 * palb_os(ji,jj,jl) - 0.0148 ) * tmask(ji,jj,1) 168 ! 165 zalb_os = ( zafrac_snw * zalb_snw + zafrac_pnd * zalb_pnd + zafrac_ice * zalb_ice ) * tmask(ji,jj,1) 166 ! 167 zalb_cs = zalb_os - ( - 0.1010 * zalb_os * zalb_os & 168 & + 0.1933 * zalb_os - 0.0148 ) * tmask(ji,jj,1) 169 ! 170 ! albedo depends on cloud fraction because of non-linear spectral effects 171 palb_ice(ji,jj,jl) = ( 1._wp - pcloud_fra(ji,jj) ) * zalb_cs + pcloud_fra(ji,jj) * zalb_os 172 169 173 END DO 170 174 END DO -
NEMO/releases/r4.0/r4.0-HEAD/src/ICE/icecor.F90
r11536 r13284 81 81 DO jl = 1, jpl 82 82 WHERE( at_i(:,:) > rn_amax_2d(:,:) ) a_i(:,:,jl) = a_i(:,:,jl) * rn_amax_2d(:,:) / at_i(:,:) 83 END DO 84 83 END DO 84 ! !----------------------------------------------------- 85 ! ! Rebin categories with thickness out of bounds ! 86 ! !----------------------------------------------------- 87 IF ( jpl > 1 ) CALL ice_itd_reb( kt ) 88 ! 85 89 ! !----------------------------------------------------- 86 90 IF ( nn_icesal == 2 ) THEN ! salinity must stay in bounds [Simin,Simax] ! … … 97 101 END DO 98 102 ENDIF 99 ! !-----------------------------------------------------100 ! ! Rebin categories with thickness out of bounds !101 ! !-----------------------------------------------------102 IF ( jpl > 1 ) CALL ice_itd_reb( kt )103 104 103 ! !----------------------------------------------------- 105 104 CALL ice_var_zapsmall ! Zap small values ! -
NEMO/releases/r4.0/r4.0-HEAD/src/ICE/icectl.F90
r12545 r13284 350 350 !! *** ROUTINE ice_ctl *** 351 351 !! 352 !! ** Purpose : Alerts in case of model crash352 !! ** Purpose : control checks 353 353 !!------------------------------------------------------------------- 354 354 INTEGER, INTENT(in) :: kt ! ocean time step 355 INTEGER :: ji, jj, jk, jl ! dummy loop indices 356 INTEGER :: inb_altests ! number of alert tests (max 20) 357 INTEGER :: ialert_id ! number of the current alert 358 REAL(wp) :: ztmelts ! ice layer melting point 355 INTEGER :: ja, ji, jj, jk, jl ! dummy loop indices 356 INTEGER :: ialert_id ! number of the current alert 357 REAL(wp) :: ztmelts ! ice layer melting point 359 358 CHARACTER (len=30), DIMENSION(20) :: cl_alname ! name of alert 360 359 INTEGER , DIMENSION(20) :: inb_alp ! number of alerts positive 361 360 !!------------------------------------------------------------------- 362 363 inb_altests = 10 364 inb_alp(:) = 0 365 366 ! Alert if incompatible volume and concentration 367 ialert_id = 2 ! reference number of this alert 368 cl_alname(ialert_id) = ' Incompat vol and con ' ! name of the alert 361 inb_alp(:) = 0 362 ialert_id = 0 363 364 ! Alert if very high salinity 365 ialert_id = ialert_id + 1 ! reference number of this alert 366 cl_alname(ialert_id) = ' Very high salinity ' ! name of the alert 369 367 DO jl = 1, jpl 370 368 DO jj = 1, jpj 371 369 DO ji = 1, jpi 372 IF( v_i(ji,jj,jl) /= 0._wp .AND. a_i(ji,jj,jl) == 0._wp ) THEN 373 WRITE(numout,*) ' ALERTE 2 : Incompatible volume and concentration ' 374 inb_alp(ialert_id) = inb_alp(ialert_id) + 1 370 IF( v_i(ji,jj,jl) > epsi10 ) THEN 371 IF( sv_i(ji,jj,jl) / v_i(ji,jj,jl) > rn_simax ) THEN 372 WRITE(numout,*) ' ALERTE : Very high salinity ',sv_i(ji,jj,jl)/v_i(ji,jj,jl) 373 WRITE(numout,*) ' at i,j,l = ',ji,jj,jl 374 inb_alp(ialert_id) = inb_alp(ialert_id) + 1 375 ENDIF 375 376 ENDIF 376 377 END DO … … 378 379 END DO 379 380 380 ! Alerte if very thick ice 381 ialert_id = 3 ! reference number of this alert 382 cl_alname(ialert_id) = ' Very thick ice ' ! name of the alert 383 jl = jpl 384 DO jj = 1, jpj 385 DO ji = 1, jpi 386 IF( h_i(ji,jj,jl) > 50._wp ) THEN 387 WRITE(numout,*) ' ALERTE 3 : Very thick ice' 388 !CALL ice_prt( kt, ji, jj, 2, ' ALERTE 3 : Very thick ice ' ) 389 inb_alp(ialert_id) = inb_alp(ialert_id) + 1 390 ENDIF 391 END DO 392 END DO 393 394 ! Alert if very fast ice 395 ialert_id = 4 ! reference number of this alert 396 cl_alname(ialert_id) = ' Very fast ice ' ! name of the alert 397 DO jj = 1, jpj 398 DO ji = 1, jpi 399 IF( MAX( ABS( u_ice(ji,jj) ), ABS( v_ice(ji,jj) ) ) > 2. .AND. & 400 & at_i(ji,jj) > 0._wp ) THEN 401 WRITE(numout,*) ' ALERTE 4 : Very fast ice' 402 !CALL ice_prt( kt, ji, jj, 1, ' ALERTE 4 : Very fast ice ' ) 403 inb_alp(ialert_id) = inb_alp(ialert_id) + 1 404 ENDIF 405 END DO 406 END DO 407 408 ! Alert on salt flux 409 ialert_id = 5 ! reference number of this alert 410 cl_alname(ialert_id) = ' High salt flux ' ! name of the alert 411 DO jj = 1, jpj 412 DO ji = 1, jpi 413 IF( ABS( sfx (ji,jj) ) > 1.0e-2 ) THEN ! = 1 psu/day for 1m ocean depth 414 WRITE(numout,*) ' ALERTE 5 : High salt flux' 415 !CALL ice_prt( kt, ji, jj, 3, ' ALERTE 5 : High salt flux ' ) 416 inb_alp(ialert_id) = inb_alp(ialert_id) + 1 417 ENDIF 418 END DO 419 END DO 420 421 ! Alert if there is ice on continents 422 ialert_id = 6 ! reference number of this alert 423 cl_alname(ialert_id) = ' Ice on continents ' ! name of the alert 424 DO jj = 1, jpj 425 DO ji = 1, jpi 426 IF( tmask(ji,jj,1) <= 0._wp .AND. at_i(ji,jj) > 0._wp ) THEN 427 WRITE(numout,*) ' ALERTE 6 : Ice on continents' 428 !CALL ice_prt( kt, ji, jj, 1, ' ALERTE 6 : Ice on continents ' ) 429 inb_alp(ialert_id) = inb_alp(ialert_id) + 1 430 ENDIF 431 END DO 432 END DO 433 434 ! 435 ! ! Alert if very fresh ice 436 ialert_id = 7 ! reference number of this alert 437 cl_alname(ialert_id) = ' Very fresh ice ' ! name of the alert 381 ! Alert if very low salinity 382 ialert_id = ialert_id + 1 ! reference number of this alert 383 cl_alname(ialert_id) = ' Very low salinity ' ! name of the alert 438 384 DO jl = 1, jpl 439 385 DO jj = 1, jpj 440 386 DO ji = 1, jpi 441 IF( s_i(ji,jj,jl) < 0.1 .AND. a_i(ji,jj,jl) > 0._wp ) THEN 442 WRITE(numout,*) ' ALERTE 7 : Very fresh ice' 443 ! CALL ice_prt(kt,ji,jj,1, ' ALERTE 7 : Very fresh ice ' ) 444 inb_alp(ialert_id) = inb_alp(ialert_id) + 1 387 IF( v_i(ji,jj,jl) > epsi10 ) THEN 388 IF( sv_i(ji,jj,jl) / v_i(ji,jj,jl) < rn_simin ) THEN 389 WRITE(numout,*) ' ALERTE : Very low salinity ',sv_i(ji,jj,jl),v_i(ji,jj,jl) 390 WRITE(numout,*) ' at i,j,l = ',ji,jj,jl 391 inb_alp(ialert_id) = inb_alp(ialert_id) + 1 392 ENDIF 445 393 ENDIF 446 394 END DO 447 395 END DO 448 396 END DO 449 ! 450 ! Alert if qns very big 451 ialert_id = 8 ! reference number of this alert 452 cl_alname(ialert_id) = ' fnsolar very big ' ! name of the alert 453 DO jj = 1, jpj 454 DO ji = 1, jpi 455 IF( ABS( qns(ji,jj) ) > 1500._wp .AND. at_i(ji,jj) > 0._wp ) THEN 456 ! 457 WRITE(numout,*) ' ALERTE 8 : Very high non-solar heat flux' 458 !CALL ice_prt( kt, ji, jj, 2, ' ') 459 inb_alp(ialert_id) = inb_alp(ialert_id) + 1 460 ! 461 ENDIF 462 END DO 463 END DO 464 !+++++ 465 466 ! ! Alert if too old ice 467 ialert_id = 9 ! reference number of this alert 468 cl_alname(ialert_id) = ' Very old ice ' ! name of the alert 469 DO jl = 1, jpl 470 DO jj = 1, jpj 471 DO ji = 1, jpi 472 IF ( ( ( ABS( o_i(ji,jj,jl) ) > rdt_ice ) .OR. & 473 ( ABS( o_i(ji,jj,jl) ) < 0._wp) ) .AND. & 474 ( a_i(ji,jj,jl) > 0._wp ) ) THEN 475 WRITE(numout,*) ' ALERTE 9 : Wrong ice age' 476 !CALL ice_prt( kt, ji, jj, 1, ' ALERTE 9 : Wrong ice age ') 477 inb_alp(ialert_id) = inb_alp(ialert_id) + 1 478 ENDIF 479 END DO 480 END DO 481 END DO 482 483 ! Alert if very warm ice 484 ialert_id = 10 ! reference number of this alert 485 cl_alname(ialert_id) = ' Very warm ice ' ! name of the alert 486 inb_alp(ialert_id) = 0 397 398 ! Alert if very cold ice 399 ialert_id = ialert_id + 1 ! reference number of this alert 400 cl_alname(ialert_id) = ' Very cold ice ' ! name of the alert 487 401 DO jl = 1, jpl 488 402 DO jk = 1, nlay_i … … 490 404 DO ji = 1, jpi 491 405 ztmelts = -rTmlt * sz_i(ji,jj,jk,jl) + rt0 492 IF( t_i(ji,jj,jk,jl) > ztmelts .AND. v_i(ji,jj,jl) > 1.e-10 &493 & .AND. a_i(ji,jj,jl) > 0._wp ) THEN494 WRITE(numout,*) ' ALERTE 10 : Very warm ice'406 IF( t_i(ji,jj,jk,jl) < -50.+rt0 .AND. v_i(ji,jj,jl) > epsi10 ) THEN 407 WRITE(numout,*) ' ALERTE : Very cold ice ',(t_i(ji,jj,jk,jl)-rt0) 408 WRITE(numout,*) ' at i,j,k,l = ',ji,jj,jk,jl 495 409 inb_alp(ialert_id) = inb_alp(ialert_id) + 1 496 410 ENDIF … … 499 413 END DO 500 414 END DO 415 416 ! Alert if very warm ice 417 ialert_id = ialert_id + 1 ! reference number of this alert 418 cl_alname(ialert_id) = ' Very warm ice ' ! name of the alert 419 DO jl = 1, jpl 420 DO jk = 1, nlay_i 421 DO jj = 1, jpj 422 DO ji = 1, jpi 423 ztmelts = -rTmlt * sz_i(ji,jj,jk,jl) + rt0 424 IF( t_i(ji,jj,jk,jl) > ztmelts .AND. v_i(ji,jj,jl) > epsi10 ) THEN 425 WRITE(numout,*) ' ALERTE : Very warm ice',(t_i(ji,jj,jk,jl)-rt0) 426 WRITE(numout,*) ' at i,j,k,l = ',ji,jj,jk,jl 427 inb_alp(ialert_id) = inb_alp(ialert_id) + 1 428 ENDIF 429 END DO 430 END DO 431 END DO 432 END DO 433 434 ! Alerte if very thick ice 435 ialert_id = ialert_id + 1 ! reference number of this alert 436 cl_alname(ialert_id) = ' Very thick ice ' ! name of the alert 437 jl = jpl 438 DO jj = 1, jpj 439 DO ji = 1, jpi 440 IF( h_i(ji,jj,jl) > 50._wp ) THEN 441 WRITE(numout,*) ' ALERTE : Very thick ice ',h_i(ji,jj,jl) 442 WRITE(numout,*) ' at i,j,l = ',ji,jj,jl 443 inb_alp(ialert_id) = inb_alp(ialert_id) + 1 444 ENDIF 445 END DO 446 END DO 447 448 ! Alerte if very thin ice 449 ialert_id = ialert_id + 1 ! reference number of this alert 450 cl_alname(ialert_id) = ' Very thin ice ' ! name of the alert 451 jl = 1 452 DO jj = 1, jpj 453 DO ji = 1, jpi 454 IF( h_i(ji,jj,jl) < rn_himin ) THEN 455 WRITE(numout,*) ' ALERTE : Very thin ice ',h_i(ji,jj,jl) 456 WRITE(numout,*) ' at i,j,l = ',ji,jj,jl 457 inb_alp(ialert_id) = inb_alp(ialert_id) + 1 458 ENDIF 459 END DO 460 END DO 461 462 ! Alert if very fast ice 463 ialert_id = ialert_id + 1 ! reference number of this alert 464 cl_alname(ialert_id) = ' Very fast ice ' ! name of the alert 465 DO jj = 1, jpj 466 DO ji = 1, jpi 467 IF( MAX( ABS( u_ice(ji,jj) ), ABS( v_ice(ji,jj) ) ) > 2. ) THEN 468 WRITE(numout,*) ' ALERTE : Very fast ice ',MAX( ABS( u_ice(ji,jj) ), ABS( v_ice(ji,jj) ) ) 469 WRITE(numout,*) ' at i,j = ',ji,jj 470 inb_alp(ialert_id) = inb_alp(ialert_id) + 1 471 ENDIF 472 END DO 473 END DO 474 475 ! Alert if there is ice on continents 476 ialert_id = ialert_id + 1 ! reference number of this alert 477 cl_alname(ialert_id) = ' Ice on continents ' ! name of the alert 478 DO jj = 1, jpj 479 DO ji = 1, jpi 480 IF( tmask(ji,jj,1) == 0._wp .AND. ( at_i(ji,jj) > 0._wp .OR. vt_i(ji,jj) > 0._wp ) ) THEN 481 WRITE(numout,*) ' ALERTE : Ice on continents ',at_i(ji,jj),vt_i(ji,jj) 482 WRITE(numout,*) ' at i,j = ',ji,jj 483 inb_alp(ialert_id) = inb_alp(ialert_id) + 1 484 ENDIF 485 END DO 486 END DO 487 488 ! Alert if incompatible ice concentration and volume 489 ialert_id = ialert_id + 1 ! reference number of this alert 490 cl_alname(ialert_id) = ' Incompatible ice conc and vol ' ! name of the alert 491 DO jj = 1, jpj 492 DO ji = 1, jpi 493 IF( ( vt_i(ji,jj) == 0._wp .AND. at_i(ji,jj) > 0._wp ) .OR. & 494 & ( vt_i(ji,jj) > 0._wp .AND. at_i(ji,jj) == 0._wp ) ) THEN 495 WRITE(numout,*) ' ALERTE : Incompatible ice conc and vol ',at_i(ji,jj),vt_i(ji,jj) 496 WRITE(numout,*) ' at i,j = ',ji,jj 497 inb_alp(ialert_id) = inb_alp(ialert_id) + 1 498 ENDIF 499 END DO 500 END DO 501 501 502 502 ! sum of the alerts on all processors 503 503 IF( lk_mpp ) THEN 504 DO ialert_id = 1, inb_altests505 CALL mpp_sum('icectl', inb_alp( ialert_id))504 DO ja = 1, ialert_id 505 CALL mpp_sum('icectl', inb_alp(ja)) 506 506 END DO 507 507 ENDIF … … 509 509 ! print alerts 510 510 IF( lwp ) THEN 511 ialert_id = 1 ! reference number of this alert512 cl_alname(ialert_id) = ' NO alerte 1 ' ! name of the alert513 511 WRITE(numout,*) ' time step ',kt 514 512 WRITE(numout,*) ' All alerts at the end of ice model ' 515 DO ialert_id = 1, inb_altests516 WRITE(numout,*) ialert_id, cl_alname(ialert_id)//' : ', inb_alp(ialert_id), ' times ! '513 DO ja = 1, ialert_id 514 WRITE(numout,*) ja, cl_alname(ja)//' : ', inb_alp(ja), ' times ! ' 517 515 END DO 518 516 ENDIF … … 563 561 WRITE(numout,*) ' v_ice(i ,j) : ', v_ice(ji,jj) 564 562 WRITE(numout,*) ' strength : ', strength(ji,jj) 565 WRITE(numout,*)566 563 WRITE(numout,*) ' - Cell values ' 567 564 WRITE(numout,*) ' ~~~~~~~~~~~ ' … … 572 569 DO jl = 1, jpl 573 570 WRITE(numout,*) ' - Category (', jl,')' 571 WRITE(numout,*) ' ~~~~~~~~~~~ ' 574 572 WRITE(numout,*) ' a_i : ', a_i(ji,jj,jl) 575 573 WRITE(numout,*) ' h_i : ', h_i(ji,jj,jl) … … 608 606 WRITE(numout,*) ' v_ice(i ,j) : ', v_ice(ji,jj) 609 607 WRITE(numout,*) ' strength : ', strength(ji,jj) 610 WRITE(numout,*) ' u_ice_b : ', u_ice_b(ji,jj) , ' v_ice_b : ', v_ice_b(ji,jj)611 608 WRITE(numout,*) 612 609 … … 625 622 WRITE(numout,*) ' e_snow : ', e_s(ji,jj,1,jl) , ' e_snow_b : ', e_s_b(ji,jj,1,jl) 626 623 WRITE(numout,*) ' sv_i : ', sv_i(ji,jj,jl) , ' sv_i_b : ', sv_i_b(ji,jj,jl) 627 WRITE(numout,*) ' oa_i : ', oa_i(ji,jj,jl) , ' oa_i_b : ', oa_i_b(ji,jj,jl)628 624 END DO !jl 629 625 … … 733 729 CALL prt_ctl(tab2d_1=v_i (:,:,jl) , clinfo1= ' v_i : ') 734 730 CALL prt_ctl(tab2d_1=v_s (:,:,jl) , clinfo1= ' v_s : ') 735 CALL prt_ctl(tab2d_1=e_i (:,:,1,jl) , clinfo1= ' e_i1 : ')736 731 CALL prt_ctl(tab2d_1=e_s (:,:,1,jl) , clinfo1= ' e_snow : ') 737 732 CALL prt_ctl(tab2d_1=sv_i (:,:,jl) , clinfo1= ' sv_i : ') … … 741 736 CALL prt_ctl_info(' - Layer : ', ivar1=jk) 742 737 CALL prt_ctl(tab2d_1=t_i(:,:,jk,jl) , clinfo1= ' t_i : ') 738 CALL prt_ctl(tab2d_1=e_i(:,:,jk,jl) , clinfo1= ' e_i : ') 743 739 END DO 744 740 END DO -
NEMO/releases/r4.0/r4.0-HEAD/src/ICE/icedyn.F90
r11536 r13284 99 99 WHERE( a_ip(:,:,:) >= epsi20 ) 100 100 h_ip(:,:,:) = v_ip(:,:,:) / a_ip(:,:,:) 101 h_il(:,:,:) = v_il(:,:,:) / a_ip(:,:,:) 101 102 ELSEWHERE 102 103 h_ip(:,:,:) = 0._wp 104 h_il(:,:,:) = 0._wp 103 105 END WHERE 104 106 ! … … 221 223 NAMELIST/namdyn/ ln_dynALL, ln_dynRHGADV, ln_dynADV1D, ln_dynADV2D, rn_uice, rn_vice, & 222 224 & rn_ishlat , & 223 & ln_landfast_L16, rn_ depfra, rn_icebfr, rn_lfrelax, rn_tensile225 & ln_landfast_L16, rn_lf_depfra, rn_lf_bfr, rn_lf_relax, rn_lf_tensile 224 226 !!------------------------------------------------------------------- 225 227 ! … … 244 246 WRITE(numout,*) ' lateral boundary condition for sea ice dynamics rn_ishlat = ', rn_ishlat 245 247 WRITE(numout,*) ' Landfast: param from Lemieux 2016 ln_landfast_L16 = ', ln_landfast_L16 246 WRITE(numout,*) ' fraction of ocean depth that ice must reach rn_ depfra = ', rn_depfra247 WRITE(numout,*) ' maximum bottom stress per unit area of contact rn_ icebfr = ', rn_icebfr248 WRITE(numout,*) ' relax time scale (s-1) to reach static friction rn_lf relax = ', rn_lfrelax249 WRITE(numout,*) ' isotropic tensile strength rn_ tensile = ', rn_tensile248 WRITE(numout,*) ' fraction of ocean depth that ice must reach rn_lf_depfra = ', rn_lf_depfra 249 WRITE(numout,*) ' maximum bottom stress per unit area of contact rn_lf_bfr = ', rn_lf_bfr 250 WRITE(numout,*) ' relax time scale (s-1) to reach static friction rn_lf_relax = ', rn_lf_relax 251 WRITE(numout,*) ' isotropic tensile strength rn_lf_tensile = ', rn_lf_tensile 250 252 WRITE(numout,*) 251 253 ENDIF -
NEMO/releases/r4.0/r4.0-HEAD/src/ICE/icedyn_adv.F90
r12197 r13284 84 84 ! !-----------------------! 85 85 CALL ice_dyn_adv_umx( nn_UMx, kt, u_ice, v_ice, h_i, h_s, h_ip, & 86 & ato_i, v_i, v_s, sv_i, oa_i, a_i, a_ip, v_ip, e_s, e_i )86 & ato_i, v_i, v_s, sv_i, oa_i, a_i, a_ip, v_ip, v_il, e_s, e_i ) 87 87 ! !-----------------------! 88 88 CASE( np_advPRA ) ! PRATHER scheme ! 89 89 ! !-----------------------! 90 90 CALL ice_dyn_adv_pra( kt, u_ice, v_ice, h_i, h_s, h_ip, & 91 & ato_i, v_i, v_s, sv_i, oa_i, a_i, a_ip, v_ip, e_s, e_i )91 & ato_i, v_i, v_s, sv_i, oa_i, a_i, a_ip, v_ip, v_il, e_s, e_i ) 92 92 END SELECT 93 93 -
NEMO/releases/r4.0/r4.0-HEAD/src/ICE/icedyn_adv_pra.F90
r12197 r13284 44 44 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: sxap , syap , sxxap , syyap , sxyap ! melt pond fraction 45 45 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: sxvp , syvp , sxxvp , syyvp , sxyvp ! melt pond volume 46 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: sxvl , syvl , sxxvl , syyvl , sxyvl ! melt pond lid volume 46 47 47 48 !! * Substitutions … … 55 56 56 57 SUBROUTINE ice_dyn_adv_pra( kt, pu_ice, pv_ice, ph_i, ph_s, ph_ip, & 57 & pato_i, pv_i, pv_s, psv_i, poa_i, pa_i, pa_ip, pv_ip, p e_s, pe_i )58 & pato_i, pv_i, pv_s, psv_i, poa_i, pa_i, pa_ip, pv_ip, pv_il, pe_s, pe_i ) 58 59 !!---------------------------------------------------------------------- 59 60 !! ** routine ice_dyn_adv_pra ** … … 81 82 REAL(wp), DIMENSION(:,:,:) , INTENT(inout) :: pa_ip ! melt pond fraction 82 83 REAL(wp), DIMENSION(:,:,:) , INTENT(inout) :: pv_ip ! melt pond volume 84 REAL(wp), DIMENSION(:,:,:) , INTENT(inout) :: pv_il ! melt pond lid thickness 83 85 REAL(wp), DIMENSION(:,:,:,:), INTENT(inout) :: pe_s ! snw heat content 84 86 REAL(wp), DIMENSION(:,:,:,:), INTENT(inout) :: pe_i ! ice heat content 85 87 ! 86 INTEGER :: ji, jj, jk, jl, jt! dummy loop indices88 INTEGER :: ji, jj, jk, jl, jt ! dummy loop indices 87 89 INTEGER :: icycle ! number of sub-timestep for the advection 88 90 REAL(wp) :: zdt ! - - … … 90 92 REAL(wp), DIMENSION(jpi,jpj) :: zati1, zati2 91 93 REAL(wp), DIMENSION(jpi,jpj) :: zudy, zvdx 92 REAL(wp), DIMENSION(jpi,jpj,jpl) :: zhi_max, zhs_max, zhip_max 94 REAL(wp), DIMENSION(jpi,jpj,jpl) :: zhi_max, zhs_max, zhip_max, zs_i, zsi_max 95 REAL(wp), DIMENSION(jpi,jpj,nlay_i,jpl) :: ze_i, zei_max 96 REAL(wp), DIMENSION(jpi,jpj,nlay_s,jpl) :: ze_s, zes_max 93 97 REAL(wp), DIMENSION(jpi,jpj,jpl) :: zarea 94 98 REAL(wp), DIMENSION(jpi,jpj,jpl) :: z0ice, z0snw, z0ai, z0smi, z0oi 95 REAL(wp), DIMENSION(jpi,jpj,jpl) :: z0ap , z0vp 99 REAL(wp), DIMENSION(jpi,jpj,jpl) :: z0ap , z0vp, z0vl 96 100 REAL(wp), DIMENSION(jpi,jpj,nlay_s,jpl) :: z0es 97 101 REAL(wp), DIMENSION(jpi,jpj,nlay_i,jpl) :: z0ei … … 100 104 IF( kt == nit000 .AND. lwp ) WRITE(numout,*) '-- ice_dyn_adv_pra: Prather advection scheme' 101 105 ! 102 ! --- Record max of the surrounding 9-pts ice thick. (for call Hbig) --- ! 106 ! --- Record max of the surrounding 9-pts (for call Hbig) --- ! 107 ! thickness and salinity 108 WHERE( pv_i(:,:,:) >= epsi10 ) ; zs_i(:,:,:) = psv_i(:,:,:) / pv_i(:,:,:) 109 ELSEWHERE ; zs_i(:,:,:) = 0._wp 110 END WHERE 103 111 DO jl = 1, jpl 104 112 DO jj = 2, jpjm1 … … 116 124 & ph_s (ji+1,jj+1,jl), ph_s (ji-1,jj-1,jl), & 117 125 & ph_s (ji+1,jj-1,jl), ph_s (ji-1,jj+1,jl) ) 126 zsi_max (ji,jj,jl) = MAX( epsi20, zs_i (ji,jj,jl), zs_i (ji+1,jj ,jl), zs_i (ji ,jj+1,jl), & 127 & zs_i (ji-1,jj ,jl), zs_i (ji ,jj-1,jl), & 128 & zs_i (ji+1,jj+1,jl), zs_i (ji-1,jj-1,jl), & 129 & zs_i (ji+1,jj-1,jl), zs_i (ji-1,jj+1,jl) ) 118 130 END DO 119 131 END DO 120 132 END DO 121 CALL lbc_lnk_multi( 'icedyn_adv_pra', zhi_max, 'T', 1., zhs_max, 'T', 1., zhip_max, 'T', 1. ) 133 CALL lbc_lnk_multi( 'icedyn_adv_pra', zhi_max, 'T', 1., zhs_max, 'T', 1., zhip_max, 'T', 1., zsi_max, 'T', 1. ) 134 ! 135 ! enthalpies 136 DO jk = 1, nlay_i 137 WHERE( pv_i(:,:,:) >= epsi10 ) ; ze_i(:,:,jk,:) = pe_i(:,:,jk,:) / pv_i(:,:,:) 138 ELSEWHERE ; ze_i(:,:,jk,:) = 0._wp 139 END WHERE 140 END DO 141 DO jk = 1, nlay_s 142 WHERE( pv_s(:,:,:) >= epsi10 ) ; ze_s(:,:,jk,:) = pe_s(:,:,jk,:) / pv_s(:,:,:) 143 ELSEWHERE ; ze_s(:,:,jk,:) = 0._wp 144 END WHERE 145 END DO 146 DO jl = 1, jpl 147 DO jk = 1, nlay_i 148 DO jj = 2, jpjm1 149 DO ji = fs_2, fs_jpim1 150 zei_max(ji,jj,jk,jl) = MAX( epsi20, ze_i(ji,jj,jk,jl), ze_i(ji+1,jj ,jk,jl), ze_i(ji ,jj+1,jk,jl), & 151 & ze_i(ji-1,jj ,jk,jl), ze_i(ji ,jj-1,jk,jl), & 152 & ze_i(ji+1,jj+1,jk,jl), ze_i(ji-1,jj-1,jk,jl), & 153 & ze_i(ji+1,jj-1,jk,jl), ze_i(ji-1,jj+1,jk,jl) ) 154 END DO 155 END DO 156 END DO 157 END DO 158 DO jl = 1, jpl 159 DO jk = 1, nlay_s 160 DO jj = 2, jpjm1 161 DO ji = fs_2, fs_jpim1 162 zes_max(ji,jj,jk,jl) = MAX( epsi20, ze_s(ji,jj,jk,jl), ze_s(ji+1,jj ,jk,jl), ze_s(ji ,jj+1,jk,jl), & 163 & ze_s(ji-1,jj ,jk,jl), ze_s(ji ,jj-1,jk,jl), & 164 & ze_s(ji+1,jj+1,jk,jl), ze_s(ji-1,jj-1,jk,jl), & 165 & ze_s(ji+1,jj-1,jk,jl), ze_s(ji-1,jj+1,jk,jl) ) 166 END DO 167 END DO 168 END DO 169 END DO 170 CALL lbc_lnk( 'icedyn_adv_pra', zei_max, 'T', 1. ) 171 CALL lbc_lnk( 'icedyn_adv_pra', zes_max, 'T', 1. ) 172 ! 122 173 ! 123 174 ! --- If ice drift is too fast, use subtime steps for advection (CFL test for stability) --- ! … … 158 209 z0ei(:,:,jk,jl) = pe_i(:,:,jk,jl) * e1e2t(:,:) ! Ice heat content 159 210 END DO 160 IF ( ln_pnd_H12 ) THEN 161 z0ap(:,:,jl) = pa_ip(:,:,jl) * e1e2t(:,:) ! Melt pond fraction 162 z0vp(:,:,jl) = pv_ip(:,:,jl) * e1e2t(:,:) ! Melt pond volume 211 IF ( ln_pnd_LEV ) THEN 212 z0ap(:,:,jl) = pa_ip(:,:,jl) * e1e2t(:,:) ! Melt pond fraction 213 z0vp(:,:,jl) = pv_ip(:,:,jl) * e1e2t(:,:) ! Melt pond volume 214 IF ( ln_pnd_lids ) THEN 215 z0vl(:,:,jl) = pv_il(:,:,jl) * e1e2t(:,:) ! Melt pond lid volume 216 ENDIF 163 217 ENDIF 164 218 END DO … … 191 245 END DO 192 246 ! 193 IF ( ln_pnd_ H12) THEN247 IF ( ln_pnd_LEV ) THEN 194 248 CALL adv_x( zdt , zudy , 1._wp , zarea , z0ap , sxap , sxxap , syap , syyap , sxyap ) !--- melt pond fraction 195 249 CALL adv_y( zdt , zvdx , 0._wp , zarea , z0ap , sxap , sxxap , syap , syyap , sxyap ) 196 250 CALL adv_x( zdt , zudy , 1._wp , zarea , z0vp , sxvp , sxxvp , syvp , syyvp , sxyvp ) !--- melt pond volume 197 251 CALL adv_y( zdt , zvdx , 0._wp , zarea , z0vp , sxvp , sxxvp , syvp , syyvp , sxyvp ) 252 IF ( ln_pnd_lids ) THEN 253 CALL adv_x( zdt , zudy , 1._wp , zarea , z0vl , sxvl , sxxvl , syvl , syyvl , sxyvl ) !--- melt pond lid volume 254 CALL adv_y( zdt , zvdx , 0._wp , zarea , z0vl , sxvl , sxxvl , syvl , syyvl , sxyvl ) 255 ENDIF 198 256 ENDIF 199 257 ! !--------------------------------------------! … … 222 280 & sxxe(:,:,jk,:), sye(:,:,jk,:), syye(:,:,jk,:), sxye(:,:,jk,:) ) 223 281 END DO 224 IF ( ln_pnd_ H12) THEN282 IF ( ln_pnd_LEV ) THEN 225 283 CALL adv_y( zdt , zvdx , 1._wp , zarea , z0ap , sxap , sxxap , syap , syyap , sxyap ) !--- melt pond fraction 226 284 CALL adv_x( zdt , zudy , 0._wp , zarea , z0ap , sxap , sxxap , syap , syyap , sxyap ) 227 285 CALL adv_y( zdt , zvdx , 1._wp , zarea , z0vp , sxvp , sxxvp , syvp , syyvp , sxyvp ) !--- melt pond volume 228 286 CALL adv_x( zdt , zudy , 0._wp , zarea , z0vp , sxvp , sxxvp , syvp , syyvp , sxyvp ) 229 ENDIF 287 IF ( ln_pnd_lids ) THEN 288 CALL adv_y( zdt , zvdx , 1._wp , zarea , z0vl , sxvl , sxxvl , syvl , syyvl , sxyvl ) !--- melt pond lid volume 289 CALL adv_x( zdt , zudy , 0._wp , zarea , z0vl , sxvl , sxxvl , syvl , syyvl , sxyvl ) 290 ENDIF 291 ENDIF 230 292 ! 231 293 ENDIF … … 244 306 pe_i(:,:,jk,jl) = z0ei(:,:,jk,jl) * r1_e1e2t(:,:) * tmask(:,:,1) 245 307 END DO 246 IF ( ln_pnd_ H12) THEN308 IF ( ln_pnd_LEV ) THEN 247 309 pa_ip(:,:,jl) = z0ap(:,:,jl) * r1_e1e2t(:,:) * tmask(:,:,1) 248 310 pv_ip(:,:,jl) = z0vp(:,:,jl) * r1_e1e2t(:,:) * tmask(:,:,1) 311 IF ( ln_pnd_lids ) THEN 312 pv_il(:,:,jl) = z0vl(:,:,jl) * r1_e1e2t(:,:) * tmask(:,:,1) 313 ENDIF 249 314 ENDIF 250 315 END DO … … 263 328 ! Remove negative values (conservation is ensured) 264 329 ! (because advected fields are not perfectly bounded and tiny negative values can occur, e.g. -1.e-20) 265 CALL ice_var_zapneg( zdt, pato_i, pv_i, pv_s, psv_i, poa_i, pa_i, pa_ip, pv_ip, p e_s, pe_i )330 CALL ice_var_zapneg( zdt, pato_i, pv_i, pv_s, psv_i, poa_i, pa_i, pa_ip, pv_ip, pv_il, pe_s, pe_i ) 266 331 ! 267 332 ! --- Make sure ice thickness is not too big --- ! 268 333 ! (because ice thickness can be too large where ice concentration is very small) 269 CALL Hbig( zdt, zhi_max, zhs_max, zhip_max, pv_i, pv_s, pa_i, pa_ip, pv_ip, pe_s ) 334 CALL Hbig( zdt, zhi_max, zhs_max, zhip_max, zsi_max, zes_max, zei_max, & 335 & pv_i, pv_s, pa_i, pa_ip, pv_ip, psv_i, pe_s, pe_i ) 270 336 ! 271 337 ! --- Ensure snow load is not too big --- ! … … 619 685 620 686 621 SUBROUTINE Hbig( pdt, phi_max, phs_max, phip_max, pv_i, pv_s, pa_i, pa_ip, pv_ip, pe_s ) 687 SUBROUTINE Hbig( pdt, phi_max, phs_max, phip_max, psi_max, pes_max, pei_max, & 688 & pv_i, pv_s, pa_i, pa_ip, pv_ip, psv_i, pe_s, pe_i ) 622 689 !!------------------------------------------------------------------- 623 690 !! *** ROUTINE Hbig *** … … 633 700 !! ** input : Max thickness of the surrounding 9-points 634 701 !!------------------------------------------------------------------- 635 REAL(wp) , INTENT(in ) :: pdt ! tracer time-step 636 REAL(wp), DIMENSION(:,:,:) , INTENT(in ) :: phi_max, phs_max, phip_max ! max ice thick from surrounding 9-pts 637 REAL(wp), DIMENSION(:,:,:) , INTENT(inout) :: pv_i, pv_s, pa_i, pa_ip, pv_ip 702 REAL(wp) , INTENT(in ) :: pdt ! tracer time-step 703 REAL(wp), DIMENSION(:,:,:) , INTENT(in ) :: phi_max, phs_max, phip_max, psi_max ! max ice thick from surrounding 9-pts 704 REAL(wp), DIMENSION(:,:,:,:), INTENT(in ) :: pes_max 705 REAL(wp), DIMENSION(:,:,:,:), INTENT(in ) :: pei_max 706 REAL(wp), DIMENSION(:,:,:) , INTENT(inout) :: pv_i, pv_s, pa_i, pa_ip, pv_ip, psv_i 638 707 REAL(wp), DIMENSION(:,:,:,:), INTENT(inout) :: pe_s 639 ! 640 INTEGER :: ji, jj, jl ! dummy loop indices 641 REAL(wp) :: z1_dt, zhip, zhi, zhs, zfra 708 REAL(wp), DIMENSION(:,:,:,:), INTENT(inout) :: pe_i 709 ! 710 INTEGER :: ji, jj, jk, jl ! dummy loop indices 711 REAL(wp) :: z1_dt, zhip, zhi, zhs, zsi, zes, zei, zfra 642 712 !!------------------------------------------------------------------- 643 713 ! … … 645 715 ! 646 716 DO jl = 1, jpl 647 648 717 DO jj = 1, jpj 649 718 DO ji = 1, jpi … … 652 721 ! ! -- check h_ip -- ! 653 722 ! if h_ip is larger than the surrounding 9 pts => reduce h_ip and increase a_ip 654 IF( ln_pnd_ H12.AND. pv_ip(ji,jj,jl) > 0._wp ) THEN723 IF( ln_pnd_LEV .AND. pv_ip(ji,jj,jl) > 0._wp ) THEN 655 724 zhip = pv_ip(ji,jj,jl) / MAX( epsi20, pa_ip(ji,jj,jl) ) 656 725 IF( zhip > phip_max(ji,jj,jl) .AND. pa_ip(ji,jj,jl) < 0.15 ) THEN … … 679 748 ENDIF 680 749 ! 750 ! ! -- check s_i -- ! 751 ! if s_i is larger than the surrounding 9 pts => put salt excess in the ocean 752 zsi = psv_i(ji,jj,jl) / pv_i(ji,jj,jl) 753 IF( zsi > psi_max(ji,jj,jl) .AND. pa_i(ji,jj,jl) < 0.15 ) THEN 754 zfra = psi_max(ji,jj,jl) / zsi 755 sfx_res(ji,jj) = sfx_res(ji,jj) + psv_i(ji,jj,jl) * ( 1._wp - zfra ) * rhoi * z1_dt 756 psv_i(ji,jj,jl) = psv_i(ji,jj,jl) * zfra 757 ENDIF 758 ! 681 759 ENDIF 682 760 END DO 683 761 END DO 684 762 END DO 763 ! 764 ! ! -- check e_i/v_i -- ! 765 DO jl = 1, jpl 766 DO jk = 1, nlay_i 767 DO jj = 1, jpj 768 DO ji = 1, jpi 769 IF ( pv_i(ji,jj,jl) > 0._wp ) THEN 770 ! if e_i/v_i is larger than the surrounding 9 pts => put the heat excess in the ocean 771 zei = pe_i(ji,jj,jk,jl) / pv_i(ji,jj,jl) 772 IF( zei > pei_max(ji,jj,jk,jl) .AND. pa_i(ji,jj,jl) < 0.15 ) THEN 773 zfra = pei_max(ji,jj,jk,jl) / zei 774 hfx_res(ji,jj) = hfx_res(ji,jj) - pe_i(ji,jj,jk,jl) * ( 1._wp - zfra ) * z1_dt ! W.m-2 <0 775 pe_i(ji,jj,jk,jl) = pe_i(ji,jj,jk,jl) * zfra 776 ENDIF 777 ENDIF 778 END DO 779 END DO 780 END DO 781 END DO 782 ! ! -- check e_s/v_s -- ! 783 DO jl = 1, jpl 784 DO jk = 1, nlay_s 785 DO jj = 1, jpj 786 DO ji = 1, jpi 787 IF ( pv_s(ji,jj,jl) > 0._wp ) THEN 788 ! if e_s/v_s is larger than the surrounding 9 pts => put the heat excess in the ocean 789 zes = pe_s(ji,jj,jk,jl) / pv_s(ji,jj,jl) 790 IF( zes > pes_max(ji,jj,jk,jl) .AND. pa_i(ji,jj,jl) < 0.15 ) THEN 791 zfra = pes_max(ji,jj,jk,jl) / zes 792 hfx_res(ji,jj) = hfx_res(ji,jj) - pe_s(ji,jj,jk,jl) * ( 1._wp - zfra ) * z1_dt ! W.m-2 <0 793 pe_s(ji,jj,jk,jl) = pe_s(ji,jj,jk,jl) * zfra 794 ENDIF 795 ENDIF 796 END DO 797 END DO 798 END DO 799 END DO 685 800 ! 686 801 END SUBROUTINE Hbig … … 756 871 & sxsal(jpi,jpj,jpl) , sysal(jpi,jpj,jpl) , sxxsal(jpi,jpj,jpl) , syysal(jpi,jpj,jpl) , sxysal(jpi,jpj,jpl) , & 757 872 & sxage(jpi,jpj,jpl) , syage(jpi,jpj,jpl) , sxxage(jpi,jpj,jpl) , syyage(jpi,jpj,jpl) , sxyage(jpi,jpj,jpl) , & 758 & sxap(jpi,jpj,jpl) , syap (jpi,jpj,jpl) , sxxap (jpi,jpj,jpl) , syyap (jpi,jpj,jpl) , sxyap (jpi,jpj,jpl) , & 759 & sxvp(jpi,jpj,jpl) , syvp (jpi,jpj,jpl) , sxxvp (jpi,jpj,jpl) , syyvp (jpi,jpj,jpl) , sxyvp (jpi,jpj,jpl) , & 873 & sxap (jpi,jpj,jpl) , syap (jpi,jpj,jpl) , sxxap (jpi,jpj,jpl) , syyap (jpi,jpj,jpl) , sxyap (jpi,jpj,jpl) , & 874 & sxvp (jpi,jpj,jpl) , syvp (jpi,jpj,jpl) , sxxvp (jpi,jpj,jpl) , syyvp (jpi,jpj,jpl) , sxyvp (jpi,jpj,jpl) , & 875 & sxvl (jpi,jpj,jpl) , syvl (jpi,jpj,jpl) , sxxvl (jpi,jpj,jpl) , syyvl (jpi,jpj,jpl) , sxyvl (jpi,jpj,jpl) , & 760 876 ! 761 877 & sxc0 (jpi,jpj,nlay_s,jpl) , syc0 (jpi,jpj,nlay_s,jpl) , sxxc0(jpi,jpj,nlay_s,jpl) , & … … 852 968 END DO 853 969 ! 854 IF( ln_pnd_H12 ) THEN ! melt pond fraction 855 CALL iom_get( numrir, jpdom_autoglo, 'sxap' , sxap ) 856 CALL iom_get( numrir, jpdom_autoglo, 'syap' , syap ) 857 CALL iom_get( numrir, jpdom_autoglo, 'sxxap', sxxap ) 858 CALL iom_get( numrir, jpdom_autoglo, 'syyap', syyap ) 859 CALL iom_get( numrir, jpdom_autoglo, 'sxyap', sxyap ) 860 ! ! melt pond volume 861 CALL iom_get( numrir, jpdom_autoglo, 'sxvp' , sxvp ) 862 CALL iom_get( numrir, jpdom_autoglo, 'syvp' , syvp ) 863 CALL iom_get( numrir, jpdom_autoglo, 'sxxvp', sxxvp ) 864 CALL iom_get( numrir, jpdom_autoglo, 'syyvp', syyvp ) 865 CALL iom_get( numrir, jpdom_autoglo, 'sxyvp', sxyvp ) 970 IF( ln_pnd_LEV ) THEN ! melt pond fraction 971 IF( iom_varid( numror, 'sxap', ldstop = .FALSE. ) > 0 ) THEN 972 CALL iom_get( numrir, jpdom_autoglo, 'sxap' , sxap ) 973 CALL iom_get( numrir, jpdom_autoglo, 'syap' , syap ) 974 CALL iom_get( numrir, jpdom_autoglo, 'sxxap', sxxap ) 975 CALL iom_get( numrir, jpdom_autoglo, 'syyap', syyap ) 976 CALL iom_get( numrir, jpdom_autoglo, 'sxyap', sxyap ) 977 ! ! melt pond volume 978 CALL iom_get( numrir, jpdom_autoglo, 'sxvp' , sxvp ) 979 CALL iom_get( numrir, jpdom_autoglo, 'syvp' , syvp ) 980 CALL iom_get( numrir, jpdom_autoglo, 'sxxvp', sxxvp ) 981 CALL iom_get( numrir, jpdom_autoglo, 'syyvp', syyvp ) 982 CALL iom_get( numrir, jpdom_autoglo, 'sxyvp', sxyvp ) 983 ELSE 984 sxap = 0._wp ; syap = 0._wp ; sxxap = 0._wp ; syyap = 0._wp ; sxyap = 0._wp ! melt pond fraction 985 sxvp = 0._wp ; syvp = 0._wp ; sxxvp = 0._wp ; syyvp = 0._wp ; sxyvp = 0._wp ! melt pond volume 986 ENDIF 987 ! 988 IF ( ln_pnd_lids ) THEN ! melt pond lid volume 989 IF( iom_varid( numror, 'sxvl', ldstop = .FALSE. ) > 0 ) THEN 990 CALL iom_get( numrir, jpdom_autoglo, 'sxvl' , sxvl ) 991 CALL iom_get( numrir, jpdom_autoglo, 'syvl' , syvl ) 992 CALL iom_get( numrir, jpdom_autoglo, 'sxxvl', sxxvl ) 993 CALL iom_get( numrir, jpdom_autoglo, 'syyvl', syyvl ) 994 CALL iom_get( numrir, jpdom_autoglo, 'sxyvl', sxyvl ) 995 ELSE 996 sxvl = 0._wp; syvl = 0._wp ; sxxvl = 0._wp ; syyvl = 0._wp ; sxyvl = 0._wp ! melt pond lid volume 997 ENDIF 998 ENDIF 866 999 ENDIF 867 1000 ! … … 877 1010 sxc0 = 0._wp ; syc0 = 0._wp ; sxxc0 = 0._wp ; syyc0 = 0._wp ; sxyc0 = 0._wp ! snow layers heat content 878 1011 sxe = 0._wp ; sye = 0._wp ; sxxe = 0._wp ; syye = 0._wp ; sxye = 0._wp ! ice layers heat content 879 IF( ln_pnd_H12 ) THEN 880 sxap = 0._wp ; syap = 0._wp ; sxxap = 0._wp ; syyap = 0._wp ; sxyap = 0._wp ! melt pond fraction 881 sxvp = 0._wp ; syvp = 0._wp ; sxxvp = 0._wp ; syyvp = 0._wp ; sxyvp = 0._wp ! melt pond volume 1012 IF( ln_pnd_LEV ) THEN 1013 sxap = 0._wp ; syap = 0._wp ; sxxap = 0._wp ; syyap = 0._wp ; sxyap = 0._wp ! melt pond fraction 1014 sxvp = 0._wp ; syvp = 0._wp ; sxxvp = 0._wp ; syyvp = 0._wp ; sxyvp = 0._wp ! melt pond volume 1015 IF ( ln_pnd_lids ) THEN 1016 sxvl = 0._wp; syvl = 0._wp ; sxxvl = 0._wp ; syyvl = 0._wp ; sxyvl = 0._wp ! melt pond lid volume 1017 ENDIF 882 1018 ENDIF 883 1019 ENDIF … … 942 1078 END DO 943 1079 ! 944 IF( ln_pnd_ H12) THEN ! melt pond fraction1080 IF( ln_pnd_LEV ) THEN ! melt pond fraction 945 1081 CALL iom_rstput( iter, nitrst, numriw, 'sxap' , sxap ) 946 1082 CALL iom_rstput( iter, nitrst, numriw, 'syap' , syap ) … … 954 1090 CALL iom_rstput( iter, nitrst, numriw, 'syyvp', syyvp ) 955 1091 CALL iom_rstput( iter, nitrst, numriw, 'sxyvp', sxyvp ) 1092 ! 1093 IF ( ln_pnd_lids ) THEN ! melt pond lid volume 1094 CALL iom_rstput( iter, nitrst, numriw, 'sxvl' , sxvl ) 1095 CALL iom_rstput( iter, nitrst, numriw, 'syvl' , syvl ) 1096 CALL iom_rstput( iter, nitrst, numriw, 'sxxvl', sxxvl ) 1097 CALL iom_rstput( iter, nitrst, numriw, 'syyvl', syyvl ) 1098 CALL iom_rstput( iter, nitrst, numriw, 'sxyvl', sxyvl ) 1099 ENDIF 956 1100 ENDIF 957 1101 ! -
NEMO/releases/r4.0/r4.0-HEAD/src/ICE/icedyn_adv_umx.F90
r12197 r13284 60 60 61 61 SUBROUTINE ice_dyn_adv_umx( kn_umx, kt, pu_ice, pv_ice, ph_i, ph_s, ph_ip, & 62 & pato_i, pv_i, pv_s, psv_i, poa_i, pa_i, pa_ip, pv_ip, p e_s, pe_i )62 & pato_i, pv_i, pv_s, psv_i, poa_i, pa_i, pa_ip, pv_ip, pv_il, pe_s, pe_i ) 63 63 !!---------------------------------------------------------------------- 64 64 !! *** ROUTINE ice_dyn_adv_umx *** … … 85 85 REAL(wp), DIMENSION(:,:,:) , INTENT(inout) :: pa_ip ! melt pond concentration 86 86 REAL(wp), DIMENSION(:,:,:) , INTENT(inout) :: pv_ip ! melt pond volume 87 REAL(wp), DIMENSION(:,:,:) , INTENT(inout) :: pv_il ! melt pond lid volume 87 88 REAL(wp), DIMENSION(:,:,:,:), INTENT(inout) :: pe_s ! snw heat content 88 89 REAL(wp), DIMENSION(:,:,:,:), INTENT(inout) :: pe_i ! ice heat content … … 92 93 REAL(wp) :: zamsk ! 1 if advection of concentration, 0 if advection of other tracers 93 94 REAL(wp) :: zdt, zvi_cen 94 REAL(wp), DIMENSION(1) :: zcflprv, zcflnow ! for global communication 95 REAL(wp), DIMENSION(jpi,jpj) :: zudy, zvdx, zcu_box, zcv_box 96 REAL(wp), DIMENSION(jpi,jpj) :: zati1, zati2 97 REAL(wp), DIMENSION(jpi,jpj,jpl) :: zu_cat, zv_cat 98 REAL(wp), DIMENSION(jpi,jpj,jpl) :: zua_ho, zva_ho, zua_ups, zva_ups 99 REAL(wp), DIMENSION(jpi,jpj,jpl) :: z1_ai , z1_aip, zhvar 100 REAL(wp), DIMENSION(jpi,jpj,jpl) :: zhi_max, zhs_max, zhip_max 95 REAL(wp), DIMENSION(1) :: zcflprv, zcflnow ! for global communication 96 REAL(wp), DIMENSION(jpi,jpj) :: zudy, zvdx, zcu_box, zcv_box 97 REAL(wp), DIMENSION(jpi,jpj) :: zati1, zati2 98 REAL(wp), DIMENSION(jpi,jpj,jpl) :: zu_cat, zv_cat 99 REAL(wp), DIMENSION(jpi,jpj,jpl) :: zua_ho, zva_ho, zua_ups, zva_ups 100 REAL(wp), DIMENSION(jpi,jpj,jpl) :: z1_ai , z1_aip, zhvar 101 REAL(wp), DIMENSION(jpi,jpj,jpl) :: zhi_max, zhs_max, zhip_max, zs_i, zsi_max 102 REAL(wp), DIMENSION(jpi,jpj,nlay_i,jpl) :: ze_i, zei_max 103 REAL(wp), DIMENSION(jpi,jpj,nlay_s,jpl) :: ze_s, zes_max 101 104 ! 102 105 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zuv_ho, zvv_ho, zuv_ups, zvv_ups, z1_vi, z1_vs … … 105 108 IF( kt == nit000 .AND. lwp ) WRITE(numout,*) '-- ice_dyn_adv_umx: Ultimate-Macho advection scheme' 106 109 ! 107 ! --- Record max of the surrounding 9-pts ice thick. (for call Hbig) --- ! 110 ! --- Record max of the surrounding 9-pts (for call Hbig) --- ! 111 ! thickness and salinity 112 WHERE( pv_i(:,:,:) >= epsi10 ) ; zs_i(:,:,:) = psv_i(:,:,:) / pv_i(:,:,:) 113 ELSEWHERE ; zs_i(:,:,:) = 0._wp 114 END WHERE 108 115 DO jl = 1, jpl 109 116 DO jj = 2, jpjm1 … … 121 128 & ph_s (ji+1,jj+1,jl), ph_s (ji-1,jj-1,jl), & 122 129 & ph_s (ji+1,jj-1,jl), ph_s (ji-1,jj+1,jl) ) 123 END DO 124 END DO 125 END DO 126 CALL lbc_lnk_multi( 'icedyn_adv_umx', zhi_max, 'T', 1., zhs_max, 'T', 1., zhip_max, 'T', 1. ) 130 zsi_max (ji,jj,jl) = MAX( epsi20, zs_i (ji,jj,jl), zs_i (ji+1,jj ,jl), zs_i (ji ,jj+1,jl), & 131 & zs_i (ji-1,jj ,jl), zs_i (ji ,jj-1,jl), & 132 & zs_i (ji+1,jj+1,jl), zs_i (ji-1,jj-1,jl), & 133 & zs_i (ji+1,jj-1,jl), zs_i (ji-1,jj+1,jl) ) 134 END DO 135 END DO 136 END DO 137 CALL lbc_lnk_multi( 'icedyn_adv_umx', zhi_max, 'T', 1., zhs_max, 'T', 1., zhip_max, 'T', 1., zsi_max, 'T', 1. ) 138 ! 139 ! enthalpies 140 DO jk = 1, nlay_i 141 WHERE( pv_i(:,:,:) >= epsi10 ) ; ze_i(:,:,jk,:) = pe_i(:,:,jk,:) / pv_i(:,:,:) 142 ELSEWHERE ; ze_i(:,:,jk,:) = 0._wp 143 END WHERE 144 END DO 145 DO jk = 1, nlay_s 146 WHERE( pv_s(:,:,:) >= epsi10 ) ; ze_s(:,:,jk,:) = pe_s(:,:,jk,:) / pv_s(:,:,:) 147 ELSEWHERE ; ze_s(:,:,jk,:) = 0._wp 148 END WHERE 149 END DO 150 DO jl = 1, jpl 151 DO jk = 1, nlay_i 152 DO jj = 2, jpjm1 153 DO ji = fs_2, fs_jpim1 154 zei_max(ji,jj,jk,jl) = MAX( epsi20, ze_i(ji,jj,jk,jl), ze_i(ji+1,jj ,jk,jl), ze_i(ji ,jj+1,jk,jl), & 155 & ze_i(ji-1,jj ,jk,jl), ze_i(ji ,jj-1,jk,jl), & 156 & ze_i(ji+1,jj+1,jk,jl), ze_i(ji-1,jj-1,jk,jl), & 157 & ze_i(ji+1,jj-1,jk,jl), ze_i(ji-1,jj+1,jk,jl) ) 158 END DO 159 END DO 160 END DO 161 END DO 162 DO jl = 1, jpl 163 DO jk = 1, nlay_s 164 DO jj = 2, jpjm1 165 DO ji = fs_2, fs_jpim1 166 zes_max(ji,jj,jk,jl) = MAX( epsi20, ze_s(ji,jj,jk,jl), ze_s(ji+1,jj ,jk,jl), ze_s(ji ,jj+1,jk,jl), & 167 & ze_s(ji-1,jj ,jk,jl), ze_s(ji ,jj-1,jk,jl), & 168 & ze_s(ji+1,jj+1,jk,jl), ze_s(ji-1,jj-1,jk,jl), & 169 & ze_s(ji+1,jj-1,jk,jl), ze_s(ji-1,jj+1,jk,jl) ) 170 END DO 171 END DO 172 END DO 173 END DO 174 CALL lbc_lnk( 'icedyn_adv_pra', zei_max, 'T', 1. ) 175 CALL lbc_lnk( 'icedyn_adv_pra', zes_max, 'T', 1. ) 127 176 ! 128 177 ! … … 324 373 ! 325 374 !== melt ponds ==! 326 IF ( ln_pnd_ H12) THEN375 IF ( ln_pnd_LEV ) THEN 327 376 ! concentration 328 377 zamsk = 1._wp … … 334 383 CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy , zvdx , zua_ho , zva_ho , zcu_box, zcv_box, & 335 384 & zhvar, pv_ip, zua_ups, zva_ups ) 385 ! lid 386 IF ( ln_pnd_lids ) THEN 387 zamsk = 0._wp 388 zhvar(:,:,:) = pv_il(:,:,:) * z1_aip(:,:,:) 389 CALL adv_umx( zamsk, kn_umx, jt, kt, zdt, zudy , zvdx , zua_ho , zva_ho , zcu_box, zcv_box, & 390 & zhvar, pv_il, zua_ups, zva_ups ) 391 ENDIF 336 392 ENDIF 337 393 ! … … 350 406 ! Remove negative values (conservation is ensured) 351 407 ! (because advected fields are not perfectly bounded and tiny negative values can occur, e.g. -1.e-20) 352 CALL ice_var_zapneg( zdt, pato_i, pv_i, pv_s, psv_i, poa_i, pa_i, pa_ip, pv_ip, p e_s, pe_i )408 CALL ice_var_zapneg( zdt, pato_i, pv_i, pv_s, psv_i, poa_i, pa_i, pa_ip, pv_ip, pv_il, pe_s, pe_i ) 353 409 ! 354 410 ! --- Make sure ice thickness is not too big --- ! 355 411 ! (because ice thickness can be too large where ice concentration is very small) 356 CALL Hbig( zdt, zhi_max, zhs_max, zhip_max, pv_i, pv_s, pa_i, pa_ip, pv_ip, pe_s ) 412 CALL Hbig( zdt, zhi_max, zhs_max, zhip_max, zsi_max, zes_max, zei_max, & 413 & pv_i, pv_s, pa_i, pa_ip, pv_ip, psv_i, pe_s, pe_i ) 357 414 ! 358 415 ! --- Ensure snow load is not too big --- ! … … 1517 1574 1518 1575 1519 SUBROUTINE Hbig( pdt, phi_max, phs_max, phip_max, pv_i, pv_s, pa_i, pa_ip, pv_ip, pe_s ) 1576 SUBROUTINE Hbig( pdt, phi_max, phs_max, phip_max, psi_max, pes_max, pei_max, & 1577 & pv_i, pv_s, pa_i, pa_ip, pv_ip, psv_i, pe_s, pe_i ) 1520 1578 !!------------------------------------------------------------------- 1521 1579 !! *** ROUTINE Hbig *** … … 1531 1589 !! ** input : Max thickness of the surrounding 9-points 1532 1590 !!------------------------------------------------------------------- 1533 REAL(wp) , INTENT(in ) :: pdt ! tracer time-step 1534 REAL(wp), DIMENSION(:,:,:) , INTENT(in ) :: phi_max, phs_max, phip_max ! max ice thick from surrounding 9-pts 1535 REAL(wp), DIMENSION(:,:,:) , INTENT(inout) :: pv_i, pv_s, pa_i, pa_ip, pv_ip 1591 REAL(wp) , INTENT(in ) :: pdt ! tracer time-step 1592 REAL(wp), DIMENSION(:,:,:) , INTENT(in ) :: phi_max, phs_max, phip_max, psi_max ! max ice thick from surrounding 9-pts 1593 REAL(wp), DIMENSION(:,:,:,:), INTENT(in ) :: pes_max 1594 REAL(wp), DIMENSION(:,:,:,:), INTENT(in ) :: pei_max 1595 REAL(wp), DIMENSION(:,:,:) , INTENT(inout) :: pv_i, pv_s, pa_i, pa_ip, pv_ip, psv_i 1536 1596 REAL(wp), DIMENSION(:,:,:,:), INTENT(inout) :: pe_s 1537 ! 1538 INTEGER :: ji, jj, jl ! dummy loop indices 1539 REAL(wp) :: z1_dt, zhip, zhi, zhs, zfra 1597 REAL(wp), DIMENSION(:,:,:,:), INTENT(inout) :: pe_i 1598 ! 1599 INTEGER :: ji, jj, jk, jl ! dummy loop indices 1600 REAL(wp) :: z1_dt, zhip, zhi, zhs, zsi, zes, zei, zfra 1540 1601 !!------------------------------------------------------------------- 1541 1602 ! … … 1543 1604 ! 1544 1605 DO jl = 1, jpl 1545 1546 1606 DO jj = 1, jpj 1547 1607 DO ji = 1, jpi … … 1550 1610 ! ! -- check h_ip -- ! 1551 1611 ! if h_ip is larger than the surrounding 9 pts => reduce h_ip and increase a_ip 1552 IF( ln_pnd_ H12.AND. pv_ip(ji,jj,jl) > 0._wp ) THEN1612 IF( ln_pnd_LEV .AND. pv_ip(ji,jj,jl) > 0._wp ) THEN 1553 1613 zhip = pv_ip(ji,jj,jl) / MAX( epsi20, pa_ip(ji,jj,jl) ) 1554 1614 IF( zhip > phip_max(ji,jj,jl) .AND. pa_ip(ji,jj,jl) < 0.15 ) THEN … … 1577 1637 ENDIF 1578 1638 ! 1639 ! ! -- check s_i -- ! 1640 ! if s_i is larger than the surrounding 9 pts => put salt excess in the ocean 1641 zsi = psv_i(ji,jj,jl) / pv_i(ji,jj,jl) 1642 IF( zsi > psi_max(ji,jj,jl) .AND. pa_i(ji,jj,jl) < 0.15 ) THEN 1643 zfra = psi_max(ji,jj,jl) / zsi 1644 sfx_res(ji,jj) = sfx_res(ji,jj) + psv_i(ji,jj,jl) * ( 1._wp - zfra ) * rhoi * z1_dt 1645 psv_i(ji,jj,jl) = psv_i(ji,jj,jl) * zfra 1646 ENDIF 1647 ! 1579 1648 ENDIF 1580 1649 END DO 1581 1650 END DO 1582 1651 END DO 1652 ! 1653 ! ! -- check e_i/v_i -- ! 1654 DO jl = 1, jpl 1655 DO jk = 1, nlay_i 1656 DO jj = 1, jpj 1657 DO ji = 1, jpi 1658 IF ( pv_i(ji,jj,jl) > 0._wp ) THEN 1659 ! if e_i/v_i is larger than the surrounding 9 pts => put the heat excess in the ocean 1660 zei = pe_i(ji,jj,jk,jl) / pv_i(ji,jj,jl) 1661 IF( zei > pei_max(ji,jj,jk,jl) .AND. pa_i(ji,jj,jl) < 0.15 ) THEN 1662 zfra = pei_max(ji,jj,jk,jl) / zei 1663 hfx_res(ji,jj) = hfx_res(ji,jj) - pe_i(ji,jj,jk,jl) * ( 1._wp - zfra ) * z1_dt ! W.m-2 <0 1664 pe_i(ji,jj,jk,jl) = pe_i(ji,jj,jk,jl) * zfra 1665 ENDIF 1666 ENDIF 1667 END DO 1668 END DO 1669 END DO 1670 END DO 1671 ! ! -- check e_s/v_s -- ! 1672 DO jl = 1, jpl 1673 DO jk = 1, nlay_s 1674 DO jj = 1, jpj 1675 DO ji = 1, jpi 1676 IF ( pv_s(ji,jj,jl) > 0._wp ) THEN 1677 ! if e_s/v_s is larger than the surrounding 9 pts => put the heat excess in the ocean 1678 zes = pe_s(ji,jj,jk,jl) / pv_s(ji,jj,jl) 1679 IF( zes > pes_max(ji,jj,jk,jl) .AND. pa_i(ji,jj,jl) < 0.15 ) THEN 1680 zfra = pes_max(ji,jj,jk,jl) / zes 1681 hfx_res(ji,jj) = hfx_res(ji,jj) - pe_s(ji,jj,jk,jl) * ( 1._wp - zfra ) * z1_dt ! W.m-2 <0 1682 pe_s(ji,jj,jk,jl) = pe_s(ji,jj,jk,jl) * zfra 1683 ENDIF 1684 ENDIF 1685 END DO 1686 END DO 1687 END DO 1688 END DO 1583 1689 ! 1584 1690 END SUBROUTINE Hbig -
NEMO/releases/r4.0/r4.0-HEAD/src/ICE/icedyn_rdgrft.F90
r11732 r13284 494 494 REAL(wp) :: airdg1, oirdg1, aprdg1, virdg1, sirdg1 495 495 REAL(wp) :: airft1, oirft1, aprft1 496 REAL(wp), DIMENSION(jpij) :: airdg2, oirdg2, aprdg2, virdg2, sirdg2, vsrdg, vprdg ! area etc of new ridges497 REAL(wp), DIMENSION(jpij) :: airft2, oirft2, aprft2, virft , sirft , vsrft, vprft ! area etc of rafted ice496 REAL(wp), DIMENSION(jpij) :: airdg2, oirdg2, aprdg2, virdg2, sirdg2, vsrdg, vprdg, vlrdg ! area etc of new ridges 497 REAL(wp), DIMENSION(jpij) :: airft2, oirft2, aprft2, virft , sirft , vsrft, vprft, vlrft ! area etc of rafted ice 498 498 ! 499 499 REAL(wp), DIMENSION(jpij) :: ersw ! enth of water trapped into ridges … … 565 565 oirft2(ji) = oa_i_2d(ji,jl1) * afrft * hi_hrft 566 566 567 IF ( ln_pnd_ H12) THEN567 IF ( ln_pnd_LEV ) THEN 568 568 aprdg1 = a_ip_2d(ji,jl1) * afrdg 569 569 aprdg2(ji) = a_ip_2d(ji,jl1) * afrdg * hi_hrdg(ji,jl1) … … 572 572 aprft2(ji) = a_ip_2d(ji,jl1) * afrft * hi_hrft 573 573 vprft (ji) = v_ip_2d(ji,jl1) * afrft 574 IF ( ln_pnd_lids ) THEN 575 vlrdg (ji) = v_il_2d(ji,jl1) * afrdg 576 vlrft (ji) = v_il_2d(ji,jl1) * afrft 577 ENDIF 574 578 ENDIF 575 579 … … 598 602 sv_i_2d(ji,jl1) = sv_i_2d(ji,jl1) - sirdg1 - sirft(ji) 599 603 oa_i_2d(ji,jl1) = oa_i_2d(ji,jl1) - oirdg1 - oirft1 600 IF ( ln_pnd_ H12) THEN604 IF ( ln_pnd_LEV ) THEN 601 605 a_ip_2d(ji,jl1) = a_ip_2d(ji,jl1) - aprdg1 - aprft1 602 606 v_ip_2d(ji,jl1) = v_ip_2d(ji,jl1) - vprdg(ji) - vprft(ji) 607 IF ( ln_pnd_lids ) THEN 608 v_il_2d(ji,jl1) = v_il_2d(ji,jl1) - vlrdg(ji) - vlrft(ji) 609 ENDIF 603 610 ENDIF 604 611 ENDIF … … 692 699 v_s_2d (ji,jl2) = v_s_2d (ji,jl2) + ( vsrdg (ji) * rn_fsnwrdg * fvol(ji) + & 693 700 & vsrft (ji) * rn_fsnwrft * zswitch(ji) ) 694 IF ( ln_pnd_ H12) THEN701 IF ( ln_pnd_LEV ) THEN 695 702 v_ip_2d (ji,jl2) = v_ip_2d(ji,jl2) + ( vprdg (ji) * rn_fpndrdg * fvol (ji) & 696 703 & + vprft (ji) * rn_fpndrft * zswitch(ji) ) 697 704 a_ip_2d (ji,jl2) = a_ip_2d(ji,jl2) + ( aprdg2(ji) * rn_fpndrdg * farea & 698 705 & + aprft2(ji) * rn_fpndrft * zswitch(ji) ) 706 IF ( ln_pnd_lids ) THEN 707 v_il_2d (ji,jl2) = v_il_2d(ji,jl2) + ( vlrdg(ji) * rn_fpndrdg * fvol (ji) & 708 & + vlrft(ji) * rn_fpndrft * zswitch(ji) ) 709 ENDIF 699 710 ENDIF 700 711 … … 727 738 !---------------- 728 739 ! In case ridging/rafting lead to very small negative values (sometimes it happens) 729 CALL ice_var_roundoff( a_i_2d, v_i_2d, v_s_2d, sv_i_2d, oa_i_2d, a_ip_2d, v_ip_2d, ze_s_2d, ze_i_2d )740 CALL ice_var_roundoff( a_i_2d, v_i_2d, v_s_2d, sv_i_2d, oa_i_2d, a_ip_2d, v_ip_2d, v_il_2d, ze_s_2d, ze_i_2d ) 730 741 ! 731 742 END SUBROUTINE rdgrft_shift … … 839 850 CALL tab_3d_2d( npti, nptidx(1:npti), a_ip_2d(1:npti,1:jpl), a_ip(:,:,:) ) 840 851 CALL tab_3d_2d( npti, nptidx(1:npti), v_ip_2d(1:npti,1:jpl), v_ip(:,:,:) ) 852 CALL tab_3d_2d( npti, nptidx(1:npti), v_il_2d(1:npti,1:jpl), v_il(:,:,:) ) 841 853 DO jl = 1, jpl 842 854 DO jk = 1, nlay_s … … 865 877 CALL tab_2d_3d( npti, nptidx(1:npti), a_ip_2d(1:npti,1:jpl), a_ip(:,:,:) ) 866 878 CALL tab_2d_3d( npti, nptidx(1:npti), v_ip_2d(1:npti,1:jpl), v_ip(:,:,:) ) 879 CALL tab_2d_3d( npti, nptidx(1:npti), v_il_2d(1:npti,1:jpl), v_il(:,:,:) ) 867 880 DO jl = 1, jpl 868 881 DO jk = 1, nlay_s -
NEMO/releases/r4.0/r4.0-HEAD/src/ICE/icedyn_rhg.F90
r11536 r13284 110 110 INTEGER :: ios, ioptio ! Local integer output status for namelist read 111 111 !! 112 NAMELIST/namdyn_rhg/ ln_rhg_EVP, ln_aEVP, rn_creepl, rn_ecc , nn_nevp, rn_relast 112 NAMELIST/namdyn_rhg/ ln_rhg_EVP, ln_aEVP, rn_creepl, rn_ecc , nn_nevp, rn_relast, ln_rhg_chkcvg 113 113 !!------------------------------------------------------------------- 114 114 ! … … 126 126 WRITE(numout,*) '~~~~~~~~~~~~~~~' 127 127 WRITE(numout,*) ' Namelist : namdyn_rhg:' 128 WRITE(numout,*) ' rheology EVP (icedyn_rhg_evp) ln_rhg_EVP = ', ln_rhg_EVP 129 WRITE(numout,*) ' use adaptive EVP (aEVP) ln_aEVP = ', ln_aEVP 130 WRITE(numout,*) ' creep limit rn_creepl = ', rn_creepl 131 WRITE(numout,*) ' eccentricity of the elliptical yield curve rn_ecc = ', rn_ecc 132 WRITE(numout,*) ' number of iterations for subcycling nn_nevp = ', nn_nevp 133 WRITE(numout,*) ' ratio of elastic timescale over ice time step rn_relast = ', rn_relast 128 WRITE(numout,*) ' rheology EVP (icedyn_rhg_evp) ln_rhg_EVP = ', ln_rhg_EVP 129 WRITE(numout,*) ' use adaptive EVP (aEVP) ln_aEVP = ', ln_aEVP 130 WRITE(numout,*) ' creep limit rn_creepl = ', rn_creepl 131 WRITE(numout,*) ' eccentricity of the elliptical yield curve rn_ecc = ', rn_ecc 132 WRITE(numout,*) ' number of iterations for subcycling nn_nevp = ', nn_nevp 133 WRITE(numout,*) ' ratio of elastic timescale over ice time step rn_relast = ', rn_relast 134 WRITE(numout,*) ' check convergence of rheology ln_rhg_chkcvg = ', ln_rhg_chkcvg 134 135 ENDIF 135 136 ! -
NEMO/releases/r4.0/r4.0-HEAD/src/ICE/icedyn_rhg_evp.F90
r13271 r13284 41 41 USE prtctl ! Print control 42 42 43 USE netcdf ! NetCDF library for convergence test 43 44 IMPLICIT NONE 44 45 PRIVATE … … 49 50 !! * Substitutions 50 51 # include "vectopt_loop_substitute.h90" 52 53 !! for convergence tests 54 INTEGER :: ncvgid ! netcdf file id 55 INTEGER :: nvarid ! netcdf variable id 56 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zmsk00, zmsk15 51 57 !!---------------------------------------------------------------------- 52 58 !! NEMO/ICE 4.0 , NEMO Consortium (2018) … … 119 125 REAL(wp) :: ecc2, z1_ecc2 ! square of yield ellipse eccenticity 120 126 REAL(wp) :: zalph1, z1_alph1, zalph2, z1_alph2 ! alpha coef from Bouillon 2009 or Kimmritz 2017 127 REAl(wp) :: zbetau, zbetav 121 128 REAL(wp) :: zm1, zm2, zm3, zmassU, zmassV, zvU, zvV ! ice/snow mass and volume 122 129 REAL(wp) :: zdelta, zp_delf, zds2, zdt, zdt2, zdiv, zdiv2 ! temporary scalars … … 125 132 REAL(wp) :: zvCr ! critical ice volume above which ice is landfast 126 133 ! 127 REAL(wp) :: zresm ! Maximal error on ice velocity128 134 REAL(wp) :: zintb, zintn ! dummy argument 129 135 REAL(wp) :: zfac_x, zfac_y … … 141 147 REAL(wp), DIMENSION(jpi,jpj) :: zds ! shear 142 148 REAL(wp), DIMENSION(jpi,jpj) :: zs1, zs2, zs12 ! stress tensor components 143 !!$ REAL(wp), DIMENSION(jpi,jpj) :: zu_ice, zv_ice, zresr ! check convergence144 149 REAL(wp), DIMENSION(jpi,jpj) :: zsshdyn ! array used for the calculation of ice surface slope: 145 150 ! ! ocean surface (ssh_m) if ice is not embedded … … 160 165 REAL(wp), PARAMETER :: zmmin = 1._wp ! ice mass (kg/m2) below which ice velocity becomes very small 161 166 REAL(wp), PARAMETER :: zamin = 0.001_wp ! ice concentration below which ice velocity becomes very small 167 !! --- check convergence 168 REAL(wp), DIMENSION(jpi,jpj) :: zu_ice, zv_ice 162 169 !! --- diags 163 REAL(wp), DIMENSION(jpi,jpj) :: zmsk00164 170 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zsig1, zsig2, zsig3 165 171 !! --- SIMIP diags … … 174 180 IF( kt == nit000 .AND. lwp ) WRITE(numout,*) '-- ice_dyn_rhg_evp: EVP sea-ice rheology' 175 181 ! 176 !!gm for Clem: OPTIMIZATION: I think zfmask can be computed one for all at the initialization.... 182 ! for diagnostics and convergence tests 183 ALLOCATE( zmsk00(jpi,jpj), zmsk15(jpi,jpj) ) 184 DO jj = 1, jpj 185 DO ji = 1, jpi 186 zmsk00(ji,jj) = MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) - epsi06 ) ) ! 1 if ice , 0 if no ice 187 zmsk15(ji,jj) = MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) - 0.15_wp ) ) ! 1 if 15% ice, 0 if less 188 END DO 189 END DO 190 ! 191 !!gm for Clem: OPTIMIZATION: I think zfmask can be computed one for all at the initialization.... 177 192 !------------------------------------------------------------------------------! 178 193 ! 0) mask at F points for the ice … … 222 237 z1_ecc2 = 1._wp / ecc2 223 238 224 ! Time step for subcycling225 zdtevp = rdt_ice / REAL( nn_nevp )226 z1_dtevp = 1._wp / zdtevp227 228 239 ! alpha parameters (Bouillon 2009) 229 240 IF( .NOT. ln_aEVP ) THEN 230 zalph1 = ( 2._wp * rn_relast * rdt_ice ) * z1_dtevp 241 zdtevp = rdt_ice / REAL( nn_nevp ) 242 zalph1 = 2._wp * rn_relast * REAL( nn_nevp ) 231 243 zalph2 = zalph1 * z1_ecc2 232 244 233 245 z1_alph1 = 1._wp / ( zalph1 + 1._wp ) 234 246 z1_alph2 = 1._wp / ( zalph2 + 1._wp ) 247 ELSE 248 zdtevp = rdt_ice 249 ! zalpha parameters set later on adaptatively 235 250 ENDIF 251 z1_dtevp = 1._wp / zdtevp 236 252 237 253 ! Initialise stress tensor … … 244 260 245 261 ! landfast param from Lemieux(2016): add isotropic tensile strength (following Konig Beatty and Holland, 2010) 246 IF( ln_landfast_L16 ) THEN ; zkt = rn_ tensile262 IF( ln_landfast_L16 ) THEN ; zkt = rn_lf_tensile 247 263 ELSE ; zkt = 0._wp 248 264 ENDIF … … 315 331 zvV = 0.5_wp * ( vt_i(ji,jj) * e1e2t(ji,jj) + vt_i(ji,jj+1) * e1e2t(ji,jj+1) ) * r1_e1e2v(ji,jj) * vmask(ji,jj,1) 316 332 ! ice-bottom stress at U points 317 zvCr = zaU(ji,jj) * rn_ depfra * hu_n(ji,jj)318 ztaux_base(ji,jj) = - rn_ icebfr * MAX( 0._wp, zvU - zvCr ) * EXP( -rn_crhg * ( 1._wp - zaU(ji,jj) ) )333 zvCr = zaU(ji,jj) * rn_lf_depfra * hu_n(ji,jj) 334 ztaux_base(ji,jj) = - rn_lf_bfr * MAX( 0._wp, zvU - zvCr ) * EXP( -rn_crhg * ( 1._wp - zaU(ji,jj) ) ) 319 335 ! ice-bottom stress at V points 320 zvCr = zaV(ji,jj) * rn_ depfra * hv_n(ji,jj)321 ztauy_base(ji,jj) = - rn_ icebfr * MAX( 0._wp, zvV - zvCr ) * EXP( -rn_crhg * ( 1._wp - zaV(ji,jj) ) )336 zvCr = zaV(ji,jj) * rn_lf_depfra * hv_n(ji,jj) 337 ztauy_base(ji,jj) = - rn_lf_bfr * MAX( 0._wp, zvV - zvCr ) * EXP( -rn_crhg * ( 1._wp - zaV(ji,jj) ) ) 322 338 ! ice_bottom stress at T points 323 zvCr = at_i(ji,jj) * rn_ depfra * ht_n(ji,jj)324 tau_icebfr(ji,jj) = - rn_ icebfr * MAX( 0._wp, vt_i(ji,jj) - zvCr ) * EXP( -rn_crhg * ( 1._wp - at_i(ji,jj) ) )339 zvCr = at_i(ji,jj) * rn_lf_depfra * ht_n(ji,jj) 340 tau_icebfr(ji,jj) = - rn_lf_bfr * MAX( 0._wp, vt_i(ji,jj) - zvCr ) * EXP( -rn_crhg * ( 1._wp - at_i(ji,jj) ) ) 325 341 END DO 326 342 END DO … … 345 361 l_full_nf_update = jter == nn_nevp ! false: disable full North fold update (performances) for iter = 1 to nn_nevp-1 346 362 ! 347 !!$ IF(ln_ctl) THEN ! Convergence test 348 !!$ DO jj = 1, jpjm1 349 !!$ zu_ice(:,jj) = u_ice(:,jj) ! velocity at previous time step 350 !!$ zv_ice(:,jj) = v_ice(:,jj) 351 !!$ END DO 352 !!$ ENDIF 363 ! convergence test 364 IF( ln_rhg_chkcvg ) THEN 365 DO jj = 1, jpj 366 DO ji = 1, jpi 367 zu_ice(ji,jj) = u_ice(ji,jj) * umask(ji,jj,1) ! velocity at previous time step 368 zv_ice(ji,jj) = v_ice(ji,jj) * vmask(ji,jj,1) 369 END DO 370 END DO 371 ENDIF 353 372 354 373 ! --- divergence, tension & shear (Appendix B of Hunke & Dukowicz, 2002) --- ! … … 391 410 zp_delt(ji,jj) = strength(ji,jj) / ( zdelta + rn_creepl ) 392 411 393 ! alpha & betafor aEVP412 ! alpha for aEVP 394 413 ! gamma = 0.5*P/(delta+creepl) * (c*pi)**2/Area * dt/m 395 414 ! alpha = beta = sqrt(4*gamma) … … 399 418 zalph2 = zalph1 400 419 z1_alph2 = z1_alph1 420 ! explicit: 421 ! z1_alph1 = 1._wp / zalph1 422 ! z1_alph2 = 1._wp / zalph1 423 ! zalph1 = zalph1 - 1._wp 424 ! zalph2 = zalph1 401 425 ENDIF 402 426 … … 409 433 CALL lbc_lnk( 'icedyn_rhg_evp', zp_delt, 'T', 1. ) 410 434 435 ! Save beta at T-points for further computations 436 IF( ln_aEVP ) THEN 437 DO jj = 1, jpj 438 DO ji = 1, jpi 439 zbeta(ji,jj) = MAX( 50._wp, rpi * SQRT( 0.5_wp * zp_delt(ji,jj) * r1_e1e2t(ji,jj) * zdt_m(ji,jj) ) ) 440 END DO 441 END DO 442 ENDIF 443 411 444 DO jj = 1, jpjm1 412 445 DO ji = 1, jpim1 413 446 414 ! alpha & betafor aEVP447 ! alpha for aEVP 415 448 IF( ln_aEVP ) THEN 416 zalph2 = MAX( 50._wp, rpi * SQRT( 0.5_wp * zp_delt(ji,jj) * r1_e1e2t(ji,jj) * zdt_m(ji,jj)) )449 zalph2 = MAX( zbeta(ji,jj), zbeta(ji+1,jj), zbeta(ji,jj+1), zbeta(ji+1,jj+1) ) 417 450 z1_alph2 = 1._wp / ( zalph2 + 1._wp ) 418 zbeta(ji,jj) = zalph2 451 ! explicit: 452 ! z1_alph2 = 1._wp / zalph2 453 ! zalph2 = zalph2 - 1._wp 419 454 ENDIF 420 455 … … 486 521 ! 487 522 IF( ln_aEVP ) THEN !--- ice velocity using aEVP (Kimmritz et al 2016 & 2017) 488 v_ice(ji,jj) = ( ( rswitch * ( zmV_t(ji,jj) * ( zbeta(ji,jj) * v_ice(ji,jj) + v_ice_b(ji,jj) ) & ! previous velocity 489 & + zRHS + zTauO * v_ice(ji,jj) ) & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 490 & / MAX( zepsi, zmV_t(ji,jj) * ( zbeta(ji,jj) + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 491 & + ( 1._wp - rswitch ) * v_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax ) & ! static friction => slow decrease to v=0 492 & ) * zmsk01y(ji,jj) + v_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01y(ji,jj) ) & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin 523 zbetav = MAX( zbeta(ji,jj), zbeta(ji,jj+1) ) 524 v_ice(ji,jj) = ( ( rswitch * ( zmV_t(ji,jj) * ( zbetav * v_ice(ji,jj) + v_ice_b(ji,jj) ) & ! previous velocity 525 & + zRHS + zTauO * v_ice(ji,jj) & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 526 & ) / MAX( zepsi, zmV_t(ji,jj) * ( zbetav + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 527 & + ( 1._wp - rswitch ) * ( v_ice_b(ji,jj) & 528 & + v_ice (ji,jj) * MAX( 0._wp, zbetav - zdtevp * rn_lf_relax ) & ! static friction => slow decrease to v=0 529 & ) / ( zbetav + 1._wp ) & 530 & ) * zmsk01y(ji,jj) + v_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01y(ji,jj) ) & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin 493 531 & ) * zmsk00y(ji,jj) 494 532 ELSE !--- ice velocity using EVP implicit formulation (cf Madec doc & Bouillon 2009) 495 v_ice(ji,jj) = ( ( rswitch * ( zmV_t(ji,jj)* v_ice(ji,jj) & ! previous velocity496 & + zRHS + zTauO * v_ice(ji,jj) )& ! F + tau_ia + Coriolis + spg + tau_io(only ocean part)497 & / MAX( zepsi, zmV_t(ji,jj) + zTauO - zTauB )& ! m/dt + tau_io(only ice part) + landfast498 & + ( 1._wp - rswitch ) * v_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax )& ! static friction => slow decrease to v=0499 & ) * zmsk01y(ji,jj) + v_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01y(ji,jj) )& ! v_ice = v_oce/100 if mass < zmmin & conc < zamin500 & ) 533 v_ice(ji,jj) = ( ( rswitch * ( zmV_t(ji,jj) * v_ice(ji,jj) & ! previous velocity 534 & + zRHS + zTauO * v_ice(ji,jj) & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 535 & ) / MAX( zepsi, zmV_t(ji,jj) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 536 & + ( 1._wp - rswitch ) * v_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lf_relax ) & ! static friction => slow decrease to v=0 537 & ) * zmsk01y(ji,jj) + v_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01y(ji,jj) ) & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin 538 & ) * zmsk00y(ji,jj) 501 539 ENDIF 502 540 END DO … … 537 575 ! 538 576 IF( ln_aEVP ) THEN !--- ice velocity using aEVP (Kimmritz et al 2016 & 2017) 539 u_ice(ji,jj) = ( ( rswitch * ( zmU_t(ji,jj) * ( zbeta(ji,jj) * u_ice(ji,jj) + u_ice_b(ji,jj) ) & ! previous velocity 540 & + zRHS + zTauO * u_ice(ji,jj) ) & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 541 & / MAX( zepsi, zmU_t(ji,jj) * ( zbeta(ji,jj) + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 542 & + ( 1._wp - rswitch ) * u_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax ) & ! static friction => slow decrease to v=0 543 & ) * zmsk01x(ji,jj) + u_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01x(ji,jj) ) & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin 577 zbetau = MAX( zbeta(ji,jj), zbeta(ji+1,jj) ) 578 u_ice(ji,jj) = ( ( rswitch * ( zmU_t(ji,jj) * ( zbetau * u_ice(ji,jj) + u_ice_b(ji,jj) ) & ! previous velocity 579 & + zRHS + zTauO * u_ice(ji,jj) & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 580 & ) / MAX( zepsi, zmU_t(ji,jj) * ( zbetau + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 581 & + ( 1._wp - rswitch ) * ( u_ice_b(ji,jj) & 582 & + u_ice (ji,jj) * MAX( 0._wp, zbetau - zdtevp * rn_lf_relax ) & ! static friction => slow decrease to v=0 583 & ) / ( zbetau + 1._wp ) & 584 & ) * zmsk01x(ji,jj) + u_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01x(ji,jj) ) & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin 544 585 & ) * zmsk00x(ji,jj) 545 586 ELSE !--- ice velocity using EVP implicit formulation (cf Madec doc & Bouillon 2009) 546 u_ice(ji,jj) = ( ( rswitch * ( zmU_t(ji,jj)* u_ice(ji,jj) & ! previous velocity547 & + zRHS + zTauO * u_ice(ji,jj) )& ! F + tau_ia + Coriolis + spg + tau_io(only ocean part)548 & / MAX( zepsi, zmU_t(ji,jj) + zTauO - zTauB )& ! m/dt + tau_io(only ice part) + landfast549 & + ( 1._wp - rswitch ) * u_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax )& ! static friction => slow decrease to v=0550 & ) * zmsk01x(ji,jj) + u_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01x(ji,jj) )& ! v_ice = v_oce/100 if mass < zmmin & conc < zamin551 & 587 u_ice(ji,jj) = ( ( rswitch * ( zmU_t(ji,jj) * u_ice(ji,jj) & ! previous velocity 588 & + zRHS + zTauO * u_ice(ji,jj) & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 589 & ) / MAX( zepsi, zmU_t(ji,jj) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 590 & + ( 1._wp - rswitch ) * u_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lf_relax ) & ! static friction => slow decrease to v=0 591 & ) * zmsk01x(ji,jj) + u_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01x(ji,jj) ) & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin 592 & ) * zmsk00x(ji,jj) 552 593 ENDIF 553 594 END DO … … 590 631 ! 591 632 IF( ln_aEVP ) THEN !--- ice velocity using aEVP (Kimmritz et al 2016 & 2017) 592 u_ice(ji,jj) = ( ( rswitch * ( zmU_t(ji,jj) * ( zbeta(ji,jj) * u_ice(ji,jj) + u_ice_b(ji,jj) ) & ! previous velocity 593 & + zRHS + zTauO * u_ice(ji,jj) ) & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 594 & / MAX( zepsi, zmU_t(ji,jj) * ( zbeta(ji,jj) + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 595 & + ( 1._wp - rswitch ) * u_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax ) & ! static friction => slow decrease to v=0 596 & ) * zmsk01x(ji,jj) + u_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01x(ji,jj) ) & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin 633 zbetau = MAX( zbeta(ji,jj), zbeta(ji+1,jj) ) 634 u_ice(ji,jj) = ( ( rswitch * ( zmU_t(ji,jj) * ( zbetau * u_ice(ji,jj) + u_ice_b(ji,jj) ) & ! previous velocity 635 & + zRHS + zTauO * u_ice(ji,jj) & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 636 & ) / MAX( zepsi, zmU_t(ji,jj) * ( zbetau + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 637 & + ( 1._wp - rswitch ) * ( u_ice_b(ji,jj) & 638 & + u_ice (ji,jj) * MAX( 0._wp, zbetau - zdtevp * rn_lf_relax ) & ! static friction => slow decrease to v=0 639 & ) / ( zbetau + 1._wp ) & 640 & ) * zmsk01x(ji,jj) + u_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01x(ji,jj) ) & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin 597 641 & ) * zmsk00x(ji,jj) 598 642 ELSE !--- ice velocity using EVP implicit formulation (cf Madec doc & Bouillon 2009) 599 u_ice(ji,jj) = ( ( rswitch * ( zmU_t(ji,jj)* u_ice(ji,jj) & ! previous velocity600 & + zRHS + zTauO * u_ice(ji,jj) )& ! F + tau_ia + Coriolis + spg + tau_io(only ocean part)601 & / MAX( zepsi, zmU_t(ji,jj) + zTauO - zTauB )& ! m/dt + tau_io(only ice part) + landfast602 & + ( 1._wp - rswitch ) * u_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax )& ! static friction => slow decrease to v=0603 & ) * zmsk01x(ji,jj) + u_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01x(ji,jj) )& ! v_ice = v_oce/100 if mass < zmmin & conc < zamin604 & 643 u_ice(ji,jj) = ( ( rswitch * ( zmU_t(ji,jj) * u_ice(ji,jj) & ! previous velocity 644 & + zRHS + zTauO * u_ice(ji,jj) & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 645 & ) / MAX( zepsi, zmU_t(ji,jj) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 646 & + ( 1._wp - rswitch ) * u_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lf_relax ) & ! static friction => slow decrease to v=0 647 & ) * zmsk01x(ji,jj) + u_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01x(ji,jj) ) & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin 648 & ) * zmsk00x(ji,jj) 605 649 ENDIF 606 650 END DO … … 641 685 ! 642 686 IF( ln_aEVP ) THEN !--- ice velocity using aEVP (Kimmritz et al 2016 & 2017) 643 v_ice(ji,jj) = ( ( rswitch * ( zmV_t(ji,jj) * ( zbeta(ji,jj) * v_ice(ji,jj) + v_ice_b(ji,jj) ) & ! previous velocity 644 & + zRHS + zTauO * v_ice(ji,jj) ) & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 645 & / MAX( zepsi, zmV_t(ji,jj) * ( zbeta(ji,jj) + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 646 & + ( 1._wp - rswitch ) * v_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax ) & ! static friction => slow decrease to v=0 647 & ) * zmsk01y(ji,jj) + v_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01y(ji,jj) ) & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin 687 zbetav = MAX( zbeta(ji,jj), zbeta(ji,jj+1) ) 688 v_ice(ji,jj) = ( ( rswitch * ( zmV_t(ji,jj) * ( zbetav * v_ice(ji,jj) + v_ice_b(ji,jj) ) & ! previous velocity 689 & + zRHS + zTauO * v_ice(ji,jj) & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 690 & ) / MAX( zepsi, zmV_t(ji,jj) * ( zbetav + 1._wp ) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 691 & + ( 1._wp - rswitch ) * ( v_ice_b(ji,jj) & 692 & + v_ice (ji,jj) * MAX( 0._wp, zbetav - zdtevp * rn_lf_relax ) & ! static friction => slow decrease to v=0 693 & ) / ( zbetav + 1._wp ) & 694 & ) * zmsk01y(ji,jj) + v_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01y(ji,jj) ) & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin 648 695 & ) * zmsk00y(ji,jj) 649 696 ELSE !--- ice velocity using EVP implicit formulation (cf Madec doc & Bouillon 2009) 650 v_ice(ji,jj) = ( ( rswitch * ( zmV_t(ji,jj)* v_ice(ji,jj) & ! previous velocity651 & + zRHS + zTauO * v_ice(ji,jj) )& ! F + tau_ia + Coriolis + spg + tau_io(only ocean part)652 & / MAX( zepsi, zmV_t(ji,jj) + zTauO - zTauB )& ! m/dt + tau_io(only ice part) + landfast653 & + ( 1._wp - rswitch ) * v_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lfrelax )& ! static friction => slow decrease to v=0654 & ) * zmsk01y(ji,jj) + v_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01y(ji,jj) )& ! v_ice = v_oce/100 if mass < zmmin & conc < zamin655 & 697 v_ice(ji,jj) = ( ( rswitch * ( zmV_t(ji,jj) * v_ice(ji,jj) & ! previous velocity 698 & + zRHS + zTauO * v_ice(ji,jj) & ! F + tau_ia + Coriolis + spg + tau_io(only ocean part) 699 & ) / MAX( zepsi, zmV_t(ji,jj) + zTauO - zTauB ) & ! m/dt + tau_io(only ice part) + landfast 700 & + ( 1._wp - rswitch ) * v_ice(ji,jj) * MAX( 0._wp, 1._wp - zdtevp * rn_lf_relax ) & ! static friction => slow decrease to v=0 701 & ) * zmsk01y(ji,jj) + v_oce(ji,jj) * 0.01_wp * ( 1._wp - zmsk01y(ji,jj) ) & ! v_ice = v_oce/100 if mass < zmmin & conc < zamin 702 & ) * zmsk00y(ji,jj) 656 703 ENDIF 657 704 END DO … … 667 714 ENDIF 668 715 669 !!$ IF(ln_ctl) THEN ! Convergence test 670 !!$ DO jj = 2 , jpjm1 671 !!$ zresr(:,jj) = MAX( ABS( u_ice(:,jj) - zu_ice(:,jj) ), ABS( v_ice(:,jj) - zv_ice(:,jj) ) ) 672 !!$ END DO 673 !!$ zresm = MAXVAL( zresr( 1:jpi, 2:jpjm1 ) ) 674 !!$ CALL mpp_max( 'icedyn_rhg_evp', zresm ) ! max over the global domain 675 !!$ ENDIF 716 ! convergence test 717 IF( ln_rhg_chkcvg ) CALL rhg_cvg( kt, jter, nn_nevp, u_ice, v_ice, zu_ice, zv_ice ) 676 718 ! 677 719 ! ! ==================== ! 678 720 END DO ! end loop over jter ! 679 721 ! ! ==================== ! 722 IF( ln_aEVP ) CALL iom_put( 'beta_evp' , zbeta ) 680 723 ! 681 724 !------------------------------------------------------------------------------! … … 734 777 ! 5) diagnostics 735 778 !------------------------------------------------------------------------------! 736 DO jj = 1, jpj737 DO ji = 1, jpi738 zmsk00(ji,jj) = MAX( 0._wp , SIGN( 1._wp , at_i(ji,jj) - epsi06 ) ) ! 1 if ice, 0 if no ice739 END DO740 END DO741 742 779 ! --- ice-ocean, ice-atm. & ice-oceanbottom(landfast) stresses --- ! 743 780 IF( iom_use('utau_oi') .OR. iom_use('vtau_oi') .OR. iom_use('utau_ai') .OR. iom_use('vtau_ai') .OR. & … … 796 833 DEALLOCATE( zsig1 , zsig2 , zsig3 ) 797 834 ENDIF 798 835 799 836 ! --- SIMIP --- ! 800 837 IF( iom_use('dssh_dx') .OR. iom_use('dssh_dy') .OR. & … … 852 889 ENDIF 853 890 ! 891 ! --- convergence tests --- ! 892 IF( ln_rhg_chkcvg ) THEN 893 IF( iom_use('uice_cvg') ) THEN 894 IF( ln_aEVP ) THEN ! output: beta * ( u(t=nn_nevp) - u(t=nn_nevp-1) ) 895 CALL iom_put( 'uice_cvg', MAX( ABS( u_ice(:,:) - zu_ice(:,:) ) * zbeta(:,:) * umask(:,:,1) , & 896 & ABS( v_ice(:,:) - zv_ice(:,:) ) * zbeta(:,:) * vmask(:,:,1) ) * zmsk15(:,:) ) 897 ELSE ! output: nn_nevp * ( u(t=nn_nevp) - u(t=nn_nevp-1) ) 898 CALL iom_put( 'uice_cvg', REAL( nn_nevp ) * MAX( ABS( u_ice(:,:) - zu_ice(:,:) ) * umask(:,:,1) , & 899 & ABS( v_ice(:,:) - zv_ice(:,:) ) * vmask(:,:,1) ) * zmsk15(:,:) ) 900 ENDIF 901 ENDIF 902 ENDIF 903 ! 904 DEALLOCATE( zmsk00, zmsk15 ) 905 ! 854 906 END SUBROUTINE ice_dyn_rhg_evp 907 908 909 SUBROUTINE rhg_cvg( kt, kiter, kitermax, pu, pv, pub, pvb ) 910 !!---------------------------------------------------------------------- 911 !! *** ROUTINE rhg_cvg *** 912 !! 913 !! ** Purpose : check convergence of oce rheology 914 !! 915 !! ** Method : create a file ice_cvg.nc containing the convergence of ice velocity 916 !! during the sub timestepping of rheology so as: 917 !! uice_cvg = MAX( u(t+1) - u(t) , v(t+1) - v(t) ) 918 !! This routine is called every sub-iteration, so it is cpu expensive 919 !! 920 !! ** Note : for the first sub-iteration, uice_cvg is set to 0 (too large otherwise) 921 !!---------------------------------------------------------------------- 922 INTEGER , INTENT(in) :: kt, kiter, kitermax ! ocean time-step index 923 REAL(wp), DIMENSION(:,:), INTENT(in) :: pu, pv, pub, pvb ! now and before velocities 924 !! 925 INTEGER :: it, idtime, istatus 926 INTEGER :: ji, jj ! dummy loop indices 927 REAL(wp) :: zresm ! local real 928 CHARACTER(len=20) :: clname 929 REAL(wp), DIMENSION(jpi,jpj) :: zres ! check convergence 930 !!---------------------------------------------------------------------- 931 932 ! create file 933 IF( kt == nit000 .AND. kiter == 1 ) THEN 934 ! 935 IF( lwp ) THEN 936 WRITE(numout,*) 937 WRITE(numout,*) 'rhg_cvg : ice rheology convergence control' 938 WRITE(numout,*) '~~~~~~~' 939 ENDIF 940 ! 941 IF( lwm ) THEN 942 clname = 'ice_cvg.nc' 943 IF( .NOT. Agrif_Root() ) clname = TRIM(Agrif_CFixed())//"_"//TRIM(clname) 944 istatus = NF90_CREATE( TRIM(clname), NF90_CLOBBER, ncvgid ) 945 istatus = NF90_DEF_DIM( ncvgid, 'time' , NF90_UNLIMITED, idtime ) 946 istatus = NF90_DEF_VAR( ncvgid, 'uice_cvg', NF90_DOUBLE , (/ idtime /), nvarid ) 947 istatus = NF90_ENDDEF(ncvgid) 948 ENDIF 949 ! 950 ENDIF 951 952 ! time 953 it = ( kt - 1 ) * kitermax + kiter 954 955 ! convergence 956 IF( kiter == 1 ) THEN ! remove the first iteration for calculations of convergence (always very large) 957 zresm = 0._wp 958 ELSE 959 DO jj = 1, jpj 960 DO ji = 1, jpi 961 zres(ji,jj) = MAX( ABS( pu(ji,jj) - pub(ji,jj) ) * umask(ji,jj,1), & 962 & ABS( pv(ji,jj) - pvb(ji,jj) ) * vmask(ji,jj,1) ) * zmsk15(ji,jj) 963 END DO 964 END DO 965 zresm = MAXVAL( zres ) 966 CALL mpp_max( 'icedyn_rhg_evp', zresm ) ! max over the global domain 967 ENDIF 968 969 IF( lwm ) THEN 970 ! write variables 971 istatus = NF90_PUT_VAR( ncvgid, nvarid, (/zresm/), (/it/), (/1/) ) 972 ! close file 973 IF( kt == nitend ) istatus = NF90_CLOSE(ncvgid) 974 ENDIF 975 976 END SUBROUTINE rhg_cvg 855 977 856 978 … … 910 1032 END SUBROUTINE rhg_evp_rst 911 1033 1034 912 1035 #else 913 1036 !!---------------------------------------------------------------------- -
NEMO/releases/r4.0/r4.0-HEAD/src/ICE/iceistate.F90
r12735 r13284 41 41 ! !! ** namelist (namini) ** 42 42 LOGICAL, PUBLIC :: ln_iceini !: Ice initialization or not 43 LOGICAL, PUBLIC :: ln_iceini_file !: Ice initialization from 2D netcdf file 43 INTEGER, PUBLIC :: nn_iceini_file !: Ice initialization: 44 ! 0 = Initialise sea ice based on SSTs 45 ! 1 = Initialise sea ice from single category netcdf file 46 ! 2 = Initialise sea ice from multi category restart file 44 47 REAL(wp) :: rn_thres_sst 45 48 REAL(wp) :: rn_hti_ini_n, rn_hts_ini_n, rn_ati_ini_n, rn_smi_ini_n, rn_tmi_ini_n, rn_tsu_ini_n, rn_tms_ini_n 46 49 REAL(wp) :: rn_hti_ini_s, rn_hts_ini_s, rn_ati_ini_s, rn_smi_ini_s, rn_tmi_ini_s, rn_tsu_ini_s, rn_tms_ini_s 47 REAL(wp) :: rn_apd_ini_n, rn_hpd_ini_n 48 REAL(wp) :: rn_apd_ini_s, rn_hpd_ini_s 50 REAL(wp) :: rn_apd_ini_n, rn_hpd_ini_n, rn_hld_ini_n 51 REAL(wp) :: rn_apd_ini_s, rn_hpd_ini_s, rn_hld_ini_s 49 52 ! 50 ! ! if ln_iceini_file = T51 INTEGER , PARAMETER :: jpfldi = 9! maximum number of files to read53 ! ! if nn_iceini_file = 1 54 INTEGER , PARAMETER :: jpfldi = 10 ! maximum number of files to read 52 55 INTEGER , PARAMETER :: jp_hti = 1 ! index of ice thickness (m) 53 56 INTEGER , PARAMETER :: jp_hts = 2 ! index of snw thickness (m) … … 59 62 INTEGER , PARAMETER :: jp_apd = 8 ! index of pnd fraction (-) 60 63 INTEGER , PARAMETER :: jp_hpd = 9 ! index of pnd depth (m) 64 INTEGER , PARAMETER :: jp_hld = 10 ! index of pnd lid depth (m) 61 65 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: si ! structure of input fields (file informations, fields read) 62 66 ! … … 81 85 !! ** Steps : 1) Set initial surface and basal temperatures 82 86 !! 2) Recompute or read sea ice state variables 83 !! 3) Fill in the ice thickness distribution using gaussian 84 !! 4) Fill in space-dependent arrays for state variables 85 !! 5) snow-ice mass computation 86 !! 6) store before fields 87 !! 3) Fill in space-dependent arrays for state variables 88 !! 4) snow-ice mass computation 87 89 !! 88 90 !! ** Notes : o_i, t_su, t_s, t_i, sz_i must be filled everywhere, even … … 98 100 REAL(wp), DIMENSION(jpi,jpj) :: zht_i_ini, zat_i_ini, ztm_s_ini !data from namelist or nc file 99 101 REAL(wp), DIMENSION(jpi,jpj) :: zt_su_ini, zht_s_ini, zsm_i_ini, ztm_i_ini !data from namelist or nc file 100 REAL(wp), DIMENSION(jpi,jpj) :: zapnd_ini, zhpnd_ini 102 REAL(wp), DIMENSION(jpi,jpj) :: zapnd_ini, zhpnd_ini, zhlid_ini !data from namelist or nc file 101 103 REAL(wp), DIMENSION(jpi,jpj,jpl) :: zti_3d , zts_3d !temporary arrays 102 104 !! 103 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: zhi_2d, zhs_2d, zai_2d, zti_2d, zts_2d, ztsu_2d, zsi_2d, zaip_2d, zhip_2d 105 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: zhi_2d, zhs_2d, zai_2d, zti_2d, zts_2d, ztsu_2d, zsi_2d, zaip_2d, zhip_2d, zhil_2d 104 106 !-------------------------------------------------------------------- 105 107 … … 155 157 a_ip (:,:,:) = 0._wp 156 158 v_ip (:,:,:) = 0._wp 157 a_ip_frac(:,:,:) = 0._wp 159 v_il (:,:,:) = 0._wp 160 a_ip_eff (:,:,:) = 0._wp 158 161 h_ip (:,:,:) = 0._wp 162 h_il (:,:,:) = 0._wp 159 163 ! 160 164 ! ice velocities … … 167 171 IF( ln_iceini ) THEN 168 172 ! !---------------! 169 IF( ln_iceini_file )THEN! Read a file !173 IF( nn_iceini_file == 1 )THEN ! Read a file ! 170 174 ! !---------------! 171 175 WHERE( ff_t(:,:) >= 0._wp ) ; zswitch(:,:) = 1._wp … … 193 197 si(jp_tsu)%fnow(:,:,1) = ( rn_tsu_ini_n * zswitch + rn_tsu_ini_s * (1._wp - zswitch) ) * tmask(:,:,1) 194 198 si(jp_tms)%fnow(:,:,1) = ( rn_tms_ini_n * zswitch + rn_tms_ini_s * (1._wp - zswitch) ) * tmask(:,:,1) 195 ELSEIF( TRIM(si(jp_tmi)%clrootname) == 'NOT USED' .AND. TRIM(si(jp_tms)%clrootname) /= 'NOT USED' ) THEN ! if T_s is read and not T_i, set T_i = (T_s + T_freeze)/2196 si(jp_tmi)%fnow(:,:,1) = 0.5_wp * ( si(jp_tms)%fnow(:,:,1) + 271.15 )197 ELSEIF( TRIM(si(jp_tmi)%clrootname) == 'NOT USED' .AND. TRIM(si(jp_tsu)%clrootname) /= 'NOT USED' ) THEN ! if T_su is read and not T_i, set T_i = (T_su + T_freeze)/2198 si(jp_tmi)%fnow(:,:,1) = 0.5_wp * ( si(jp_tsu)%fnow(:,:,1) + 271.15 )199 ELSEIF( TRIM(si(jp_tsu)%clrootname) == 'NOT USED' .AND. TRIM(si(jp_tms)%clrootname) /= 'NOT USED' ) THEN ! if T_s is read and not T_su, set T_su = T_s200 si(jp_tsu)%fnow(:,:,1) = si(jp_tms)%fnow(:,:,1)201 ELSEIF( TRIM(si(jp_tsu)%clrootname) == 'NOT USED' .AND. TRIM(si(jp_tmi)%clrootname) /= 'NOT USED' ) THEN ! if T_i is read and not T_su, set T_su = T_i202 si(jp_tsu)%fnow(:,:,1) = si(jp_tmi)%fnow(:,:,1)203 ELSEIF( TRIM(si(jp_tms)%clrootname) == 'NOT USED' .AND. TRIM(si(jp_tsu)%clrootname) /= 'NOT USED' ) THEN ! if T_su is read and not T_s, set T_s = T_su204 si(jp_tms)%fnow(:,:,1) = si(jp_tsu)%fnow(:,:,1)205 ELSEIF( TRIM(si(jp_tms)%clrootname) == 'NOT USED' .AND. TRIM(si(jp_tmi)%clrootname) /= 'NOT USED' ) THEN ! if T_i is read and not T_s, set T_s = T_i206 si(jp_tms)%fnow(:,:,1) = si(jp_tmi)%fnow(:,:,1)207 199 ENDIF 200 IF( TRIM(si(jp_tmi)%clrootname) == 'NOT USED' .AND. TRIM(si(jp_tms)%clrootname) /= 'NOT USED' ) & ! if T_s is read and not T_i, set T_i = (T_s + T_freeze)/2 201 & si(jp_tmi)%fnow(:,:,1) = 0.5_wp * ( si(jp_tms)%fnow(:,:,1) + 271.15 ) 202 IF( TRIM(si(jp_tmi)%clrootname) == 'NOT USED' .AND. TRIM(si(jp_tsu)%clrootname) /= 'NOT USED' ) & ! if T_su is read and not T_i, set T_i = (T_su + T_freeze)/2 203 & si(jp_tmi)%fnow(:,:,1) = 0.5_wp * ( si(jp_tsu)%fnow(:,:,1) + 271.15 ) 204 IF( TRIM(si(jp_tsu)%clrootname) == 'NOT USED' .AND. TRIM(si(jp_tms)%clrootname) /= 'NOT USED' ) & ! if T_s is read and not T_su, set T_su = T_s 205 & si(jp_tsu)%fnow(:,:,1) = si(jp_tms)%fnow(:,:,1) 206 IF( TRIM(si(jp_tsu)%clrootname) == 'NOT USED' .AND. TRIM(si(jp_tmi)%clrootname) /= 'NOT USED' ) & ! if T_i is read and not T_su, set T_su = T_i 207 & si(jp_tsu)%fnow(:,:,1) = si(jp_tmi)%fnow(:,:,1) 208 IF( TRIM(si(jp_tms)%clrootname) == 'NOT USED' .AND. TRIM(si(jp_tsu)%clrootname) /= 'NOT USED' ) & ! if T_su is read and not T_s, set T_s = T_su 209 & si(jp_tms)%fnow(:,:,1) = si(jp_tsu)%fnow(:,:,1) 210 IF( TRIM(si(jp_tms)%clrootname) == 'NOT USED' .AND. TRIM(si(jp_tmi)%clrootname) /= 'NOT USED' ) & ! if T_i is read and not T_s, set T_s = T_i 211 & si(jp_tms)%fnow(:,:,1) = si(jp_tmi)%fnow(:,:,1) 208 212 ! 209 213 ! pond concentration … … 215 219 IF( TRIM(si(jp_hpd)%clrootname) == 'NOT USED' ) & 216 220 & si(jp_hpd)%fnow(:,:,1) = ( rn_hpd_ini_n * zswitch + rn_hpd_ini_s * (1._wp - zswitch) ) * tmask(:,:,1) 221 ! 222 ! pond lid depth 223 IF( TRIM(si(jp_hld)%clrootname) == 'NOT USED' ) & 224 & si(jp_hld)%fnow(:,:,1) = ( rn_hld_ini_n * zswitch + rn_hld_ini_s * (1._wp - zswitch) ) * tmask(:,:,1) 217 225 ! 218 226 zsm_i_ini(:,:) = si(jp_smi)%fnow(:,:,1) * tmask(:,:,1) … … 222 230 zapnd_ini(:,:) = si(jp_apd)%fnow(:,:,1) * tmask(:,:,1) 223 231 zhpnd_ini(:,:) = si(jp_hpd)%fnow(:,:,1) * tmask(:,:,1) 232 zhlid_ini(:,:) = si(jp_hld)%fnow(:,:,1) * tmask(:,:,1) 224 233 ! 225 234 ! change the switch for the following … … 246 255 zapnd_ini(:,:) = rn_apd_ini_n * zswitch(:,:) * zat_i_ini(:,:) ! rn_apd = pond fraction => rn_apd * a_i = pond conc. 247 256 zhpnd_ini(:,:) = rn_hpd_ini_n * zswitch(:,:) 257 zhlid_ini(:,:) = rn_hld_ini_n * zswitch(:,:) 248 258 ELSEWHERE 249 259 zht_i_ini(:,:) = rn_hti_ini_s * zswitch(:,:) … … 256 266 zapnd_ini(:,:) = rn_apd_ini_s * zswitch(:,:) * zat_i_ini(:,:) ! rn_apd = pond fraction => rn_apd * a_i = pond conc. 257 267 zhpnd_ini(:,:) = rn_hpd_ini_s * zswitch(:,:) 268 zhlid_ini(:,:) = rn_hld_ini_s * zswitch(:,:) 258 269 END WHERE 259 270 ! … … 264 275 zapnd_ini(:,:) = 0._wp 265 276 zhpnd_ini(:,:) = 0._wp 277 zhlid_ini(:,:) = 0._wp 278 ENDIF 279 280 IF ( .NOT.ln_pnd_lids ) THEN 281 zhlid_ini(:,:) = 0._wp 266 282 ENDIF 267 283 268 !------------- !269 ! fill fields !270 !------------- !284 !----------------! 285 ! 3) fill fields ! 286 !----------------! 271 287 ! select ice covered grid points 272 288 npti = 0 ; nptidx(:) = 0 … … 290 306 CALL tab_2d_1d( npti, nptidx(1:npti), a_ip_1d(1:npti) , zapnd_ini ) 291 307 CALL tab_2d_1d( npti, nptidx(1:npti), h_ip_1d(1:npti) , zhpnd_ini ) 308 CALL tab_2d_1d( npti, nptidx(1:npti), h_il_1d(1:npti) , zhlid_ini ) 292 309 293 310 ! allocate temporary arrays 294 ALLOCATE( zhi_2d(npti,jpl), zhs_2d(npti,jpl), zai_2d (npti,jpl), & 295 & zti_2d(npti,jpl), zts_2d(npti,jpl), ztsu_2d(npti,jpl), zsi_2d(npti,jpl), zaip_2d(npti,jpl), zhip_2d(npti,jpl) ) 311 ALLOCATE( zhi_2d (npti,jpl), zhs_2d (npti,jpl), zai_2d (npti,jpl), & 312 & zti_2d (npti,jpl), zts_2d (npti,jpl), ztsu_2d(npti,jpl), zsi_2d(npti,jpl), & 313 & zaip_2d(npti,jpl), zhip_2d(npti,jpl), zhil_2d(npti,jpl) ) 296 314 297 315 ! distribute 1-cat into jpl-cat: (jpi*jpj) -> (jpi*jpj,jpl) 298 CALL ice_var_itd( h_i_1d(1:npti) , h_s_1d(1:npti) , at_i_1d(1:npti), & 299 & zhi_2d , zhs_2d , zai_2d , & 300 & t_i_1d(1:npti,1), t_s_1d(1:npti,1), t_su_1d(1:npti), s_i_1d(1:npti), a_ip_1d(1:npti), h_ip_1d(1:npti), & 301 & zti_2d , zts_2d , ztsu_2d , zsi_2d , zaip_2d , zhip_2d ) 316 CALL ice_var_itd( h_i_1d(1:npti) , h_s_1d(1:npti) , at_i_1d(1:npti), & 317 & zhi_2d , zhs_2d , zai_2d , & 318 & t_i_1d(1:npti,1), t_s_1d(1:npti,1), t_su_1d(1:npti), & 319 & s_i_1d(1:npti) , a_ip_1d(1:npti) , h_ip_1d(1:npti), h_il_1d(1:npti), & 320 & zti_2d , zts_2d , ztsu_2d , & 321 & zsi_2d , zaip_2d , zhip_2d , zhil_2d ) 302 322 303 323 ! move to 3D arrays: (jpi*jpj,jpl) -> (jpi,jpj,jpl) … … 315 335 CALL tab_2d_3d( npti, nptidx(1:npti), zaip_2d , a_ip ) 316 336 CALL tab_2d_3d( npti, nptidx(1:npti), zhip_2d , h_ip ) 337 CALL tab_2d_3d( npti, nptidx(1:npti), zhil_2d , h_il ) 317 338 318 339 ! deallocate temporary arrays 319 340 DEALLOCATE( zhi_2d, zhs_2d, zai_2d , & 320 & zti_2d, zts_2d, ztsu_2d, zsi_2d, zaip_2d, zhip_2d )341 & zti_2d, zts_2d, ztsu_2d, zsi_2d, zaip_2d, zhip_2d, zhil_2d ) 321 342 322 343 ! calculate extensive and intensive variables … … 360 381 361 382 ! Melt ponds 362 WHERE( a_i > epsi10 ) 363 a_ip_frac(:,:,:) = a_ip(:,:,:) / a_i(:,:,:) 364 ELSEWHERE 365 a_ip_frac(:,:,:) = 0._wp 383 WHERE( a_i > epsi10 ) ; a_ip_eff(:,:,:) = a_ip(:,:,:) / a_i(:,:,:) 384 ELSEWHERE ; a_ip_eff(:,:,:) = 0._wp 366 385 END WHERE 367 386 v_ip(:,:,:) = h_ip(:,:,:) * a_ip(:,:,:) 387 v_il(:,:,:) = h_il(:,:,:) * a_ip(:,:,:) 368 388 369 389 ! specific temperatures for coupled runs … … 371 391 t1_ice(:,:,:) = t_i (:,:,1,:) 372 392 ! 393 ! ice concentration should not exceed amax 394 at_i(:,:) = SUM( a_i, dim=3 ) 395 DO jl = 1, jpl 396 WHERE( at_i(:,:) > rn_amax_2d(:,:) ) a_i(:,:,jl) = a_i(:,:,jl) * rn_amax_2d(:,:) / at_i(:,:) 397 END DO 398 at_i(:,:) = SUM( a_i, dim=3 ) 399 ! 373 400 ENDIF ! ln_iceini 374 401 ! 375 at_i(:,:) = SUM( a_i, dim=3 )376 !377 402 !---------------------------------------------- 378 ! 3) Snow-ice mass (case ice is fully embedded)403 ! 4) Snow-ice mass (case ice is fully embedded) 379 404 !---------------------------------------------- 380 405 snwice_mass (:,:) = tmask(:,:,1) * SUM( rhos * v_s(:,:,:) + rhoi * v_i(:,:,:), dim=3 ) ! snow+ice mass … … 426 451 ENDIF 427 452 ENDIF 428 429 !------------------------------------430 ! 4) store fields at before time-step431 !------------------------------------432 ! it is only necessary for the 1st interpolation by Agrif433 a_i_b (:,:,:) = a_i (:,:,:)434 e_i_b (:,:,:,:) = e_i (:,:,:,:)435 v_i_b (:,:,:) = v_i (:,:,:)436 v_s_b (:,:,:) = v_s (:,:,:)437 e_s_b (:,:,:,:) = e_s (:,:,:,:)438 sv_i_b (:,:,:) = sv_i (:,:,:)439 oa_i_b (:,:,:) = oa_i (:,:,:)440 u_ice_b(:,:) = u_ice(:,:)441 v_ice_b(:,:) = v_ice(:,:)442 ! total concentration is needed for Lupkes parameterizations443 at_i_b (:,:) = at_i (:,:)444 453 445 454 !!clem: output of initial state should be written here but it is impossible because … … 466 475 ! 467 476 CHARACTER(len=256) :: cn_dir ! Root directory for location of ice files 468 TYPE(FLD_N) :: sn_hti, sn_hts, sn_ati, sn_smi, sn_tmi, sn_tsu, sn_tms, sn_apd, sn_hpd 477 TYPE(FLD_N) :: sn_hti, sn_hts, sn_ati, sn_smi, sn_tmi, sn_tsu, sn_tms, sn_apd, sn_hpd, sn_hld 469 478 TYPE(FLD_N), DIMENSION(jpfldi) :: slf_i ! array of namelist informations on the fields to read 470 479 ! 471 NAMELIST/namini/ ln_iceini, ln_iceini_file, rn_thres_sst, &480 NAMELIST/namini/ ln_iceini, nn_iceini_file, rn_thres_sst, & 472 481 & rn_hti_ini_n, rn_hti_ini_s, rn_hts_ini_n, rn_hts_ini_s, & 473 482 & rn_ati_ini_n, rn_ati_ini_s, rn_smi_ini_n, rn_smi_ini_s, & 474 483 & rn_tmi_ini_n, rn_tmi_ini_s, rn_tsu_ini_n, rn_tsu_ini_s, rn_tms_ini_n, rn_tms_ini_s, & 475 & rn_apd_ini_n, rn_apd_ini_s, rn_hpd_ini_n, rn_hpd_ini_s, &476 & sn_hti, sn_hts, sn_ati, sn_tsu, sn_tmi, sn_smi, sn_tms, sn_apd, sn_hpd, cn_dir484 & rn_apd_ini_n, rn_apd_ini_s, rn_hpd_ini_n, rn_hpd_ini_s, rn_hld_ini_n, rn_hld_ini_s, & 485 & sn_hti, sn_hts, sn_ati, sn_tsu, sn_tmi, sn_smi, sn_tms, sn_apd, sn_hpd, sn_hld, cn_dir 477 486 !!----------------------------------------------------------------------------- 478 487 ! … … 488 497 slf_i(jp_ati) = sn_ati ; slf_i(jp_smi) = sn_smi 489 498 slf_i(jp_tmi) = sn_tmi ; slf_i(jp_tsu) = sn_tsu ; slf_i(jp_tms) = sn_tms 490 slf_i(jp_apd) = sn_apd ; slf_i(jp_hpd) = sn_hpd 499 slf_i(jp_apd) = sn_apd ; slf_i(jp_hpd) = sn_hpd ; slf_i(jp_hld) = sn_hld 491 500 ! 492 501 IF(lwp) THEN ! control print … … 496 505 WRITE(numout,*) ' Namelist namini:' 497 506 WRITE(numout,*) ' ice initialization (T) or not (F) ln_iceini = ', ln_iceini 498 WRITE(numout,*) ' ice initialization from a netcdf file ln_iceini_file = ', ln_iceini_file507 WRITE(numout,*) ' ice initialization from a netcdf file nn_iceini_file = ', nn_iceini_file 499 508 WRITE(numout,*) ' max ocean temp. above Tfreeze with initial ice rn_thres_sst = ', rn_thres_sst 500 IF( ln_iceini .AND. .NOT.ln_iceini_file) THEN509 IF( ln_iceini .AND. nn_iceini_file == 0 ) THEN 501 510 WRITE(numout,*) ' initial snw thickness in the north-south rn_hts_ini = ', rn_hts_ini_n,rn_hts_ini_s 502 511 WRITE(numout,*) ' initial ice thickness in the north-south rn_hti_ini = ', rn_hti_ini_n,rn_hti_ini_s … … 508 517 WRITE(numout,*) ' initial pnd fraction in the north-south rn_apd_ini = ', rn_apd_ini_n,rn_apd_ini_s 509 518 WRITE(numout,*) ' initial pnd depth in the north-south rn_hpd_ini = ', rn_hpd_ini_n,rn_hpd_ini_s 519 WRITE(numout,*) ' initial pnd lid depth in the north-south rn_hld_ini = ', rn_hld_ini_n,rn_hld_ini_s 510 520 ENDIF 511 521 ENDIF 512 522 ! 513 IF( ln_iceini_file) THEN ! Ice initialization using input file523 IF( nn_iceini_file == 1 ) THEN ! Ice initialization using input file 514 524 ! 515 525 ! set si structure … … 532 542 rn_apd_ini_n = 0. ; rn_apd_ini_s = 0. 533 543 rn_hpd_ini_n = 0. ; rn_hpd_ini_s = 0. 534 CALL ctl_warn( 'rn_apd_ini & rn_hpd_ini = 0 when no ponds' ) 544 rn_hld_ini_n = 0. ; rn_hld_ini_s = 0. 545 CALL ctl_warn( 'rn_apd_ini & rn_hpd_ini = 0 & rn_hld_ini = 0 when no ponds' ) 546 ENDIF 547 ! 548 IF( .NOT.ln_pnd_lids ) THEN 549 rn_hld_ini_n = 0. ; rn_hld_ini_s = 0. 535 550 ENDIF 536 551 ! -
NEMO/releases/r4.0/r4.0-HEAD/src/ICE/iceitd.F90
r11732 r13284 47 47 LOGICAL :: ln_cat_usr ! ice categories are defined by rn_catbnd 48 48 REAL(wp), DIMENSION(0:100) :: rn_catbnd ! ice categories bounds 49 REAL(wp) :: rn_himax ! maximum ice thickness allowed 49 50 ! 50 51 !!---------------------------------------------------------------------- … … 304 305 IF ( a_i_1d(ji) > epsi10 .AND. h_i_1d(ji) < rn_himin ) THEN 305 306 a_i_1d(ji) = a_i_1d(ji) * h_i_1d(ji) / rn_himin 306 IF( ln_pnd_ H12) a_ip_1d(ji) = a_ip_1d(ji) * h_i_1d(ji) / rn_himin307 IF( ln_pnd_LEV ) a_ip_1d(ji) = a_ip_1d(ji) * h_i_1d(ji) / rn_himin 307 308 h_i_1d(ji) = rn_himin 308 309 ENDIF … … 410 411 CALL tab_3d_2d( npti, nptidx(1:npti), a_ip_2d(1:npti,1:jpl), a_ip ) 411 412 CALL tab_3d_2d( npti, nptidx(1:npti), v_ip_2d(1:npti,1:jpl), v_ip ) 413 CALL tab_3d_2d( npti, nptidx(1:npti), v_il_2d(1:npti,1:jpl), v_il ) 412 414 CALL tab_3d_2d( npti, nptidx(1:npti), t_su_2d(1:npti,1:jpl), t_su ) 413 415 DO jl = 1, jpl … … 474 476 zaTsfn(ji,jl2) = zaTsfn(ji,jl2) + ztrans 475 477 ! 476 IF ( ln_pnd_ H12) THEN478 IF ( ln_pnd_LEV ) THEN 477 479 ztrans = a_ip_2d(ji,jl1) * zworka(ji) ! Pond fraction 478 480 a_ip_2d(ji,jl1) = a_ip_2d(ji,jl1) - ztrans … … 482 484 v_ip_2d(ji,jl1) = v_ip_2d(ji,jl1) - ztrans 483 485 v_ip_2d(ji,jl2) = v_ip_2d(ji,jl2) + ztrans 486 ! 487 IF ( ln_pnd_lids ) THEN ! Pond lid volume 488 ztrans = v_il_2d(ji,jl1) * zworka(ji) 489 v_il_2d(ji,jl1) = v_il_2d(ji,jl1) - ztrans 490 v_il_2d(ji,jl2) = v_il_2d(ji,jl2) + ztrans 491 ENDIF 484 492 ENDIF 485 493 ! … … 526 534 ! clem: The transfer between one category to another can lead to very small negative values (-1.e-20) 527 535 ! because of truncation error ( i.e. 1. - 1. /= 0 ) 528 CALL ice_var_roundoff( a_i_2d, v_i_2d, v_s_2d, sv_i_2d, oa_i_2d, a_ip_2d, v_ip_2d, ze_s_2d, ze_i_2d )536 CALL ice_var_roundoff( a_i_2d, v_i_2d, v_s_2d, sv_i_2d, oa_i_2d, a_ip_2d, v_ip_2d, v_il_2d, ze_s_2d, ze_i_2d ) 529 537 530 538 ! at_i must be <= rn_amax … … 554 562 CALL tab_2d_3d( npti, nptidx(1:npti), a_ip_2d(1:npti,1:jpl), a_ip ) 555 563 CALL tab_2d_3d( npti, nptidx(1:npti), v_ip_2d(1:npti,1:jpl), v_ip ) 564 CALL tab_2d_3d( npti, nptidx(1:npti), v_il_2d(1:npti,1:jpl), v_il ) 556 565 CALL tab_2d_3d( npti, nptidx(1:npti), t_su_2d(1:npti,1:jpl), t_su ) 557 566 DO jl = 1, jpl … … 683 692 REAL(wp) :: zhmax, znum, zden, zalpha ! - - 684 693 ! 685 NAMELIST/namitd/ ln_cat_hfn, rn_himean, ln_cat_usr, rn_catbnd, rn_himin 694 NAMELIST/namitd/ ln_cat_hfn, rn_himean, ln_cat_usr, rn_catbnd, rn_himin, rn_himax 686 695 !!------------------------------------------------------------------ 687 696 ! … … 702 711 WRITE(numout,*) ' mean ice thickness in the domain rn_himean = ', rn_himean 703 712 WRITE(numout,*) ' Ice categories are defined by rn_catbnd ln_cat_usr = ', ln_cat_usr 704 WRITE(numout,*) ' minimum ice thickness rn_himin = ', rn_himin 713 WRITE(numout,*) ' minimum ice thickness allowed rn_himin = ', rn_himin 714 WRITE(numout,*) ' maximum ice thickness allowed rn_himax = ', rn_himax 705 715 ENDIF 706 716 ! … … 739 749 END DO 740 750 ! 741 hi_max(jpl) = 99._wp! set to a big value to ensure that all ice is thinner than hi_max(jpl)751 hi_max(jpl) = rn_himax ! set to a big value to ensure that all ice is thinner than hi_max(jpl) 742 752 ! 743 753 IF(lwp) WRITE(numout,*) -
NEMO/releases/r4.0/r4.0-HEAD/src/ICE/icerst.F90
r11536 r13284 132 132 CALL iom_rstput( iter, nitrst, numriw, 'a_ip' , a_ip ) 133 133 CALL iom_rstput( iter, nitrst, numriw, 'v_ip' , v_ip ) 134 CALL iom_rstput( iter, nitrst, numriw, 'v_il' , v_il ) 134 135 ! Snow enthalpy 135 136 DO jk = 1, nlay_s … … 171 172 INTEGER :: jk 172 173 LOGICAL :: llok 173 INTEGER :: id0, id1, id2, id3, id4 ! local integer174 INTEGER :: id0, id1, id2, id3, id4, id5 ! local integer 174 175 CHARACTER(len=25) :: znam 175 176 CHARACTER(len=2) :: zchar, zchar1 … … 250 251 v_ip(:,:,:) = 0._wp 251 252 ENDIF 253 ! melt pond lids 254 id3 = iom_varid( numrir, 'v_il' , ldstop = .FALSE. ) 255 IF( id3 > 0 ) THEN 256 CALL iom_get( numrir, jpdom_autoglo, 'v_il', v_il) 257 ELSE 258 IF(lwp) WRITE(numout,*) ' ==>> previous run without melt ponds lids output then set it to zero' 259 v_il(:,:,:) = 0._wp 260 ENDIF 252 261 ! fields needed for Met Office (Jules) coupling 253 262 IF( ln_cpl ) THEN 254 id 3= iom_varid( numrir, 'cnd_ice' , ldstop = .FALSE. )255 id 4= iom_varid( numrir, 't1_ice' , ldstop = .FALSE. )256 IF( id 3 > 0 .AND. id4> 0 ) THEN ! fields exist263 id4 = iom_varid( numrir, 'cnd_ice' , ldstop = .FALSE. ) 264 id5 = iom_varid( numrir, 't1_ice' , ldstop = .FALSE. ) 265 IF( id4 > 0 .AND. id5 > 0 ) THEN ! fields exist 257 266 CALL iom_get( numrir, jpdom_autoglo, 'cnd_ice', cnd_ice ) 258 267 CALL iom_get( numrir, jpdom_autoglo, 't1_ice' , t1_ice ) … … 274 283 CALL ice_istate( nit000 ) 275 284 ! 276 IF( .NOT.ln_iceini .OR. .NOT.ln_iceini_file) &277 & CALL ctl_stop('STOP', 'ice_rst_read: you need ln_ice_ini=T and ln_iceini_file=T')285 IF( .NOT.ln_iceini .OR. nn_iceini_file == 0 ) & 286 & CALL ctl_stop('STOP', 'ice_rst_read: you need ln_ice_ini=T and nn_iceini_file=0') 278 287 ! 279 288 ENDIF -
NEMO/releases/r4.0/r4.0-HEAD/src/ICE/icesbc.F90
r11575 r13284 116 116 INTEGER :: ji, jj, jl ! dummy loop index 117 117 REAL(wp) :: zmiss_val ! missing value retrieved from xios 118 REAL(wp), DIMENSION(jpi,jpj,jpl) :: zalb_os, zalb_cs ! ice albedo under overcast/clear sky 119 REAL(wp), DIMENSION(:,:) , ALLOCATABLE :: zalb, zmsk00 ! 2D workspace 118 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: zalb, zmsk00 ! 2D workspace 120 119 !!-------------------------------------------------------------------- 121 120 ! … … 131 130 CALL iom_miss_val( "icetemp", zmiss_val ) 132 131 133 ! --- cloud-sky and overcast-sky ice albedos --- ! 134 CALL ice_alb( t_su, h_i, h_s, ln_pnd_alb, a_ip_frac, h_ip, zalb_cs, zalb_os ) 135 136 ! albedo depends on cloud fraction because of non-linear spectral effects 137 !!gm cldf_ice is a real, DOCTOR naming rule: start with cd means CHARACTER passed in argument ! 138 alb_ice(:,:,:) = ( 1. - cldf_ice ) * zalb_cs(:,:,:) + cldf_ice * zalb_os(:,:,:) 139 ! 132 ! --- ice albedo --- ! 133 CALL ice_alb( t_su, h_i, h_s, ln_pnd_alb, a_ip_eff, h_ip, cloud_fra, alb_ice ) 134 140 135 ! 141 136 SELECT CASE( ksbc ) !== fluxes over sea ice ==! … … 281 276 INTEGER :: ios, ioptio ! Local integer 282 277 !! 283 NAMELIST/namsbc/ rn_cio, rn_blow_s, nn_flxdist, ln_cndflx, ln_cndemulate278 NAMELIST/namsbc/ rn_cio, nn_snwfra, rn_snwblow, nn_flxdist, ln_cndflx, ln_cndemulate, nn_qtrice 284 279 !!------------------------------------------------------------------- 285 280 ! … … 297 292 WRITE(numout,*) '~~~~~~~~~~~~~~~~' 298 293 WRITE(numout,*) ' Namelist namsbc:' 299 WRITE(numout,*) ' drag coefficient for oceanic stress rn_cio = ', rn_cio 300 WRITE(numout,*) ' coefficient for ice-lead partition of snowfall rn_blow_s = ', rn_blow_s 301 WRITE(numout,*) ' Multicategory heat flux formulation nn_flxdist = ', nn_flxdist 302 WRITE(numout,*) ' Use conduction flux as surface condition ln_cndflx = ', ln_cndflx 303 WRITE(numout,*) ' emulate conduction flux ln_cndemulate = ', ln_cndemulate 294 WRITE(numout,*) ' drag coefficient for oceanic stress rn_cio = ', rn_cio 295 WRITE(numout,*) ' fraction of ice covered by snow (options 0,1,2) nn_snwfra = ', nn_snwfra 296 WRITE(numout,*) ' coefficient for ice-lead partition of snowfall rn_snwblow = ', rn_snwblow 297 WRITE(numout,*) ' Multicategory heat flux formulation nn_flxdist = ', nn_flxdist 298 WRITE(numout,*) ' Use conduction flux as surface condition ln_cndflx = ', ln_cndflx 299 WRITE(numout,*) ' emulate conduction flux ln_cndemulate = ', ln_cndemulate 300 WRITE(numout,*) ' solar flux transmitted thru the surface scattering layer nn_qtrice = ', nn_qtrice 301 WRITE(numout,*) ' = 0 Grenfell and Maykut 1977' 302 WRITE(numout,*) ' = 1 Lebrun 2019' 304 303 ENDIF 305 304 ! -
NEMO/releases/r4.0/r4.0-HEAD/src/ICE/icestp.F90
r11536 r13284 202 202 IF( lrst_ice ) CALL ice_rst_write( kt ) ! -- Ice restart file 203 203 ! 204 IF( ln_icectl ) CALL ice_ctl( kt ) ! -- alerts in case of model crash204 IF( ln_icectl ) CALL ice_ctl( kt ) ! -- Control checks 205 205 ! 206 206 ENDIF ! End sea-ice time step only … … 223 223 !! ** purpose : Initialize sea-ice parameters 224 224 !!---------------------------------------------------------------------- 225 INTEGER :: j i, jj, ierr225 INTEGER :: jl, ierr 226 226 !!---------------------------------------------------------------------- 227 227 IF(lwp) WRITE(numout,*) … … 247 247 IF( ierr /= 0 ) CALL ctl_stop('STOP', 'ice_init : unable to allocate ice arrays') 248 248 ! 249 CALL ice_itd_init ! ice thickness distribution initialization250 !251 CALL ice_thd_init ! set ice thermodynics parameters (clem: important to call it first for melt ponds)252 !253 ! ! Initial sea-ice state254 IF( .NOT. ln_rstart ) THEN ! start from rest: sea-ice deduced from sst255 CALL ice_istate_init256 CALL ice_istate( nit000 )257 ELSE ! start from a restart file258 CALL ice_rst_read259 ENDIF260 CALL ice_var_glo2eqv261 CALL ice_var_agg(1)262 !263 CALL ice_sbc_init ! set ice-ocean and ice-atm. coupling parameters264 !265 CALL ice_dyn_init ! set ice dynamics parameters266 !267 CALL ice_update_init ! ice surface boundary condition268 !269 CALL ice_alb_init ! ice surface albedo270 !271 CALL ice_dia_init ! initialization for diags272 !273 fr_i (:,:) = at_i(:,:) ! initialisation of sea-ice fraction274 tn_ice(:,:,:) = t_su(:,:,:) ! initialisation of surface temp for coupled simu275 !276 249 ! ! set max concentration in both hemispheres 277 250 WHERE( gphit(:,:) > 0._wp ) ; rn_amax_2d(:,:) = rn_amax_n ! NH 278 251 ELSEWHERE ; rn_amax_2d(:,:) = rn_amax_s ! SH 279 252 END WHERE 280 253 ! 254 CALL ice_itd_init ! ice thickness distribution initialization 255 ! 256 CALL ice_thd_init ! set ice thermodynics parameters (clem: important to call it first for melt ponds) 257 ! 258 ! ! Initial sea-ice state 259 IF ( ln_rstart .OR. nn_iceini_file == 2 ) THEN 260 CALL ice_rst_read ! start from a restart file 261 ELSE 262 CALL ice_istate_init 263 CALL ice_istate( nit000 ) ! start from rest or read a file 264 ENDIF 265 CALL ice_var_glo2eqv 266 CALL ice_var_agg(1) 267 ! 268 CALL ice_sbc_init ! set ice-ocean and ice-atm. coupling parameters 269 ! 270 CALL ice_dyn_init ! set ice dynamics parameters 271 ! 272 CALL ice_update_init ! ice surface boundary condition 273 ! 274 CALL ice_alb_init ! ice surface albedo 275 ! 276 CALL ice_dia_init ! initialization for diags 277 ! 278 fr_i (:,:) = at_i(:,:) ! initialisation of sea-ice fraction 279 tn_ice(:,:,:) = t_su(:,:,:) ! initialisation of surface temp for coupled simu 280 ! 281 281 IF( ln_rstart ) CALL iom_close( numrir ) ! close input ice restart file 282 282 ! … … 363 363 v_s_b (:,:,:) = v_s (:,:,:) ! snow volume 364 364 sv_i_b(:,:,:) = sv_i(:,:,:) ! salt content 365 oa_i_b(:,:,:) = oa_i(:,:,:) ! areal age content366 365 e_s_b (:,:,:,:) = e_s (:,:,:,:) ! snow thermal energy 367 366 e_i_b (:,:,:,:) = e_i (:,:,:,:) ! ice thermal energy … … 372 371 h_i_b(:,:,:) = 0._wp 373 372 h_s_b(:,:,:) = 0._wp 374 END WHERE375 376 WHERE( a_ip(:,:,:) >= epsi20 )377 h_ip_b(:,:,:) = v_ip(:,:,:) / a_ip(:,:,:) ! ice pond thickness378 ELSEWHERE379 h_ip_b(:,:,:) = 0._wp380 373 END WHERE 381 374 ! … … 421 414 hfx_res(:,:) = 0._wp ; hfx_sub(:,:) = 0._wp 422 415 hfx_spr(:,:) = 0._wp ; hfx_dif(:,:) = 0._wp 423 hfx_err_rem(:,:) = 0._wp424 416 hfx_err_dif(:,:) = 0._wp 425 417 wfx_err_sub(:,:) = 0._wp … … 442 434 diag_trp_ei(:,:) = 0._wp ; diag_trp_es(:,:) = 0._wp 443 435 diag_trp_sv(:,:) = 0._wp 444 436 445 437 END SUBROUTINE diag_set0 446 438 -
NEMO/releases/r4.0/r4.0-HEAD/src/ICE/icethd.F90
r11536 r13284 35 35 ! 36 36 USE in_out_manager ! I/O manager 37 USE iom ! I/O manager library 37 38 USE lib_mpp ! MPP library 38 39 USE lib_fortran ! fortran utilities (glob_sum + no signed zero) … … 51 52 LOGICAL :: ln_icedO ! activate ice growth in open-water (T) or not (F) 52 53 LOGICAL :: ln_icedS ! activate gravity drainage and flushing (T) or not (F) 54 LOGICAL :: ln_leadhfx ! heat in the leads is used to melt sea-ice before warming the ocean 55 56 !! for convergence tests 57 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: ztice_cvgerr, ztice_cvgstp 53 58 54 59 !! * Substitutions … … 102 107 WRITE(numout,*) '~~~~~~~' 103 108 ENDIF 109 110 ! convergence tests 111 IF( ln_zdf_chkcvg ) THEN 112 ALLOCATE( ztice_cvgerr(jpi,jpj,jpl) , ztice_cvgstp(jpi,jpj,jpl) ) 113 ztice_cvgerr = 0._wp ; ztice_cvgstp = 0._wp 114 ENDIF 104 115 105 116 !---------------------------------------------! … … 164 175 ! If the grid cell is fully covered by ice (no leads) => transfer energy from the lead budget to the ice bottom budget 165 176 IF( ( zqld >= 0._wp .AND. at_i(ji,jj) > 0._wp ) .OR. at_i(ji,jj) >= (1._wp - epsi10) ) THEN 166 fhld (ji,jj) = rswitch * zqld * r1_rdtice / MAX( at_i(ji,jj), epsi10 ) ! divided by at_i since this is (re)multiplied by a_i in icethd_dh.F90 177 IF( ln_leadhfx ) THEN ; fhld(ji,jj) = rswitch * zqld * r1_rdtice / MAX( at_i(ji,jj), epsi10 ) ! divided by at_i since this is (re)multiplied by a_i in icethd_dh.F90 178 ELSE ; fhld(ji,jj) = 0._wp 179 ENDIF 167 180 qlead(ji,jj) = 0._wp 168 181 ELSE … … 216 229 ! ! --- & Change units of e_i, e_s from J/m2 to J/m3 --- ! 217 230 ! 218 s_i_new (1:npti) = 0._wp ; dh_s_tot(1:npti) = 0._wp ! --- some init --- ! (important to have them here)231 s_i_new (1:npti) = 0._wp ; dh_s_tot(1:npti) = 0._wp ! --- some init --- ! (important to have them here) 219 232 dh_i_sum (1:npti) = 0._wp ; dh_i_bom(1:npti) = 0._wp ; dh_i_itm (1:npti) = 0._wp 220 233 dh_i_sub (1:npti) = 0._wp ; dh_i_bog(1:npti) = 0._wp … … 249 262 ! 250 263 IF( ln_icedO ) CALL ice_thd_do ! --- Frazil ice growth in leads --- ! 264 ! 265 ! convergence tests 266 IF( ln_zdf_chkcvg ) THEN 267 CALL iom_put( 'tice_cvgerr', ztice_cvgerr ) ; DEALLOCATE( ztice_cvgerr ) 268 CALL iom_put( 'tice_cvgstp', ztice_cvgstp ) ; DEALLOCATE( ztice_cvgstp ) 269 ENDIF 251 270 ! 252 271 ! controls … … 354 373 CALL tab_2d_1d( npti, nptidx(1:npti), a_ip_1d (1:npti), a_ip (:,:,kl) ) 355 374 CALL tab_2d_1d( npti, nptidx(1:npti), h_ip_1d (1:npti), h_ip (:,:,kl) ) 356 CALL tab_2d_1d( npti, nptidx(1:npti), a_ip_frac_1d(1:npti), a_ip_frac(:,:,kl) )375 CALL tab_2d_1d( npti, nptidx(1:npti), h_il_1d (1:npti), h_il (:,:,kl) ) 357 376 ! 358 377 CALL tab_2d_1d( npti, nptidx(1:npti), qprec_ice_1d (1:npti), qprec_ice ) … … 406 425 CALL tab_2d_1d( npti, nptidx(1:npti), hfx_res_1d (1:npti), hfx_res ) 407 426 CALL tab_2d_1d( npti, nptidx(1:npti), hfx_err_dif_1d(1:npti), hfx_err_dif ) 408 CALL tab_2d_1d( npti, nptidx(1:npti), hfx_err_rem_1d(1:npti), hfx_err_rem )409 427 CALL tab_2d_1d( npti, nptidx(1:npti), qt_oce_ai_1d (1:npti), qt_oce_ai ) 410 428 ! … … 441 459 sv_i_1d(1:npti) = s_i_1d (1:npti) * v_i_1d (1:npti) 442 460 v_ip_1d(1:npti) = h_ip_1d(1:npti) * a_ip_1d(1:npti) 461 v_il_1d(1:npti) = h_il_1d(1:npti) * a_ip_1d(1:npti) 443 462 oa_i_1d(1:npti) = o_i_1d (1:npti) * a_i_1d (1:npti) 444 463 … … 460 479 CALL tab_1d_2d( npti, nptidx(1:npti), a_ip_1d (1:npti), a_ip (:,:,kl) ) 461 480 CALL tab_1d_2d( npti, nptidx(1:npti), h_ip_1d (1:npti), h_ip (:,:,kl) ) 462 CALL tab_1d_2d( npti, nptidx(1:npti), a_ip_frac_1d(1:npti), a_ip_frac(:,:,kl) )481 CALL tab_1d_2d( npti, nptidx(1:npti), h_il_1d (1:npti), h_il (:,:,kl) ) 463 482 ! 464 483 CALL tab_1d_2d( npti, nptidx(1:npti), wfx_snw_sni_1d(1:npti), wfx_snw_sni ) … … 498 517 CALL tab_1d_2d( npti, nptidx(1:npti), hfx_res_1d (1:npti), hfx_res ) 499 518 CALL tab_1d_2d( npti, nptidx(1:npti), hfx_err_dif_1d(1:npti), hfx_err_dif ) 500 CALL tab_1d_2d( npti, nptidx(1:npti), hfx_err_rem_1d(1:npti), hfx_err_rem )501 519 CALL tab_1d_2d( npti, nptidx(1:npti), qt_oce_ai_1d (1:npti), qt_oce_ai ) 502 520 ! … … 515 533 CALL tab_1d_2d( npti, nptidx(1:npti), sv_i_1d(1:npti), sv_i(:,:,kl) ) 516 534 CALL tab_1d_2d( npti, nptidx(1:npti), v_ip_1d(1:npti), v_ip(:,:,kl) ) 535 CALL tab_1d_2d( npti, nptidx(1:npti), v_il_1d(1:npti), v_il(:,:,kl) ) 517 536 CALL tab_1d_2d( npti, nptidx(1:npti), oa_i_1d(1:npti), oa_i(:,:,kl) ) 537 ! check convergence of heat diffusion scheme 538 IF( ln_zdf_chkcvg ) THEN 539 CALL tab_1d_2d( npti, nptidx(1:npti), tice_cvgerr_1d(1:npti), ztice_cvgerr(:,:,kl) ) 540 CALL tab_1d_2d( npti, nptidx(1:npti), tice_cvgstp_1d(1:npti), ztice_cvgstp(:,:,kl) ) 541 ENDIF 518 542 ! 519 543 END SELECT … … 536 560 INTEGER :: ios ! Local integer output status for namelist read 537 561 !! 538 NAMELIST/namthd/ ln_icedH, ln_icedA, ln_icedO, ln_icedS 562 NAMELIST/namthd/ ln_icedH, ln_icedA, ln_icedO, ln_icedS, ln_leadhfx 539 563 !!------------------------------------------------------------------- 540 564 ! … … 552 576 WRITE(numout,*) '~~~~~~~~~~~~' 553 577 WRITE(numout,*) ' Namelist namthd:' 554 WRITE(numout,*) ' activate ice thick change from top/bot (T) or not (F) ln_icedH = ', ln_icedH 555 WRITE(numout,*) ' activate lateral melting (T) or not (F) ln_icedA = ', ln_icedA 556 WRITE(numout,*) ' activate ice growth in open-water (T) or not (F) ln_icedO = ', ln_icedO 557 WRITE(numout,*) ' activate gravity drainage and flushing (T) or not (F) ln_icedS = ', ln_icedS 578 WRITE(numout,*) ' activate ice thick change from top/bot (T) or not (F) ln_icedH = ', ln_icedH 579 WRITE(numout,*) ' activate lateral melting (T) or not (F) ln_icedA = ', ln_icedA 580 WRITE(numout,*) ' activate ice growth in open-water (T) or not (F) ln_icedO = ', ln_icedO 581 WRITE(numout,*) ' activate gravity drainage and flushing (T) or not (F) ln_icedS = ', ln_icedS 582 WRITE(numout,*) ' heat in the leads is used to melt sea-ice before warming the ocean ln_leadhfx = ', ln_leadhfx 558 583 ENDIF 559 584 ! -
NEMO/releases/r4.0/r4.0-HEAD/src/ICE/icethd_dh.F90
r10786 r13284 13 13 !!---------------------------------------------------------------------- 14 14 !! ice_thd_dh : vertical sea-ice growth and melt 15 !! ice_thd_snwblow : distribute snow fall between ice and ocean 16 !!---------------------------------------------------------------------- 15 !!---------------------------------------------------------------------- 17 16 USE dom_oce ! ocean space and time domain 18 17 USE phycst ! physical constants … … 20 19 USE ice1D ! sea-ice: thermodynamics variables 21 20 USE icethd_sal ! sea-ice: salinity profiles 21 USE icevar ! for CALL ice_var_snwblow 22 22 ! 23 23 USE in_out_manager ! I/O manager … … 29 29 30 30 PUBLIC ice_thd_dh ! called by ice_thd 31 PUBLIC ice_thd_snwblow ! called in sbcblk/sbccpl and here32 33 INTERFACE ice_thd_snwblow34 MODULE PROCEDURE ice_thd_snwblow_1d, ice_thd_snwblow_2d35 END INTERFACE36 31 37 32 !!---------------------------------------------------------------------- … … 186 181 ! Snow precipitation 187 182 !------------------- 188 CALL ice_ thd_snwblow( 1. - at_i_1d(1:npti), zsnw(1:npti) ) ! snow distribution over ice after wind blowing183 CALL ice_var_snwblow( 1. - at_i_1d(1:npti), zsnw(1:npti) ) ! snow distribution over ice after wind blowing 189 184 190 185 zdeltah(1:npti,:) = 0._wp … … 636 631 END SUBROUTINE ice_thd_dh 637 632 638 639 !!--------------------------------------------------------------------------640 !! INTERFACE ice_thd_snwblow641 !!642 !! ** Purpose : Compute distribution of precip over the ice643 !!644 !! Snow accumulation in one thermodynamic time step645 !! snowfall is partitionned between leads and ice.646 !! If snow fall was uniform, a fraction (1-at_i) would fall into leads647 !! but because of the winds, more snow falls on leads than on sea ice648 !! and a greater fraction (1-at_i)^beta of the total mass of snow649 !! (beta < 1) falls in leads.650 !! In reality, beta depends on wind speed,651 !! and should decrease with increasing wind speed but here, it is652 !! considered as a constant. an average value is 0.66653 !!--------------------------------------------------------------------------654 !!gm I think it can be usefull to set this as a FUNCTION, not a SUBROUTINE....655 SUBROUTINE ice_thd_snwblow_2d( pin, pout )656 REAL(wp), DIMENSION(:,:), INTENT(in ) :: pin ! previous fraction lead ( 1. - a_i_b )657 REAL(wp), DIMENSION(:,:), INTENT(inout) :: pout658 pout = ( 1._wp - ( pin )**rn_blow_s )659 END SUBROUTINE ice_thd_snwblow_2d660 661 SUBROUTINE ice_thd_snwblow_1d( pin, pout )662 REAL(wp), DIMENSION(:), INTENT(in ) :: pin663 REAL(wp), DIMENSION(:), INTENT(inout) :: pout664 pout = ( 1._wp - ( pin )**rn_blow_s )665 END SUBROUTINE ice_thd_snwblow_1d666 667 633 #else 668 634 !!---------------------------------------------------------------------- -
NEMO/releases/r4.0/r4.0-HEAD/src/ICE/icethd_ent.F90
r10069 r13284 128 128 ! comment: if input h_i_old and eh_i_old are already multiplied by a_i (as in icethd_do), 129 129 ! then we should not (* a_i) again but not important since this is just to check that remap error is ~0 130 DO ji = 1, npti131 hfx_err_rem_1d(ji) = hfx_err_rem_1d(ji) + a_i_1d(ji) * r1_rdtice * &132 & ( SUM( qnew(ji,1:nlay_i) ) * zhnew(ji) - SUM( eh_i_old(ji,0:nlay_i+1) ) )133 END DO130 !DO ji = 1, npti 131 ! hfx_err_rem_1d(ji) = hfx_err_rem_1d(ji) + a_i_1d(ji) * r1_rdtice * & 132 ! & ( SUM( qnew(ji,1:nlay_i) ) * zhnew(ji) - SUM( eh_i_old(ji,0:nlay_i+1) ) ) 133 !END DO 134 134 135 135 END SUBROUTINE ice_thd_ent -
NEMO/releases/r4.0/r4.0-HEAD/src/ICE/icethd_pnd.F90
r11536 r13284 35 35 ! ! associated indices: 36 36 INTEGER, PARAMETER :: np_pndNO = 0 ! No pond scheme 37 INTEGER, PARAMETER :: np_pndCST = 1 ! Constant pond scheme38 INTEGER, PARAMETER :: np_pnd H12 = 2 ! Evolutive pond scheme (Holland et al. 2012)37 INTEGER, PARAMETER :: np_pndCST = 1 ! Constant ice pond scheme 38 INTEGER, PARAMETER :: np_pndLEV = 2 ! Level ice pond scheme 39 39 40 40 !! * Substitutions … … 51 51 !! *** ROUTINE ice_thd_pnd *** 52 52 !! 53 !! ** Purpose : change melt pond fraction 53 !! ** Purpose : change melt pond fraction and thickness 54 54 !! 55 !! ** Method : brut force56 55 !!------------------------------------------------------------------- 57 56 ! … … 60 59 CASE (np_pndCST) ; CALL pnd_CST !== Constant melt ponds ==! 61 60 ! 62 CASE (np_pnd H12) ; CALL pnd_H12 !== Holland et al 2012melt ponds ==!61 CASE (np_pndLEV) ; CALL pnd_LEV !== Level ice melt ponds ==! 63 62 ! 64 63 END SELECT … … 88 87 ! 89 88 IF( a_i_1d(ji) > 0._wp .AND. t_su_1d(ji) >= rt0 ) THEN 90 a_ip_frac_1d(ji) = rn_apnd91 89 h_ip_1d(ji) = rn_hpnd 92 a_ip_1d(ji) = a_ip_frac_1d(ji) * a_i_1d(ji) 90 a_ip_1d(ji) = rn_apnd * a_i_1d(ji) 91 h_il_1d(ji) = 0._wp ! no pond lids whatsoever 93 92 ELSE 94 a_ip_frac_1d(ji) = 0._wp95 93 h_ip_1d(ji) = 0._wp 96 94 a_ip_1d(ji) = 0._wp 95 h_il_1d(ji) = 0._wp 97 96 ENDIF 98 97 ! … … 102 101 103 102 104 SUBROUTINE pnd_H12 105 !!------------------------------------------------------------------- 106 !! *** ROUTINE pnd_H12 *** 107 !! 108 !! ** Purpose : Compute melt pond evolution 109 !! 110 !! ** Method : Empirical method. A fraction of meltwater is accumulated in ponds 111 !! and sent to ocean when surface is freezing 112 !! 113 !! pond growth: Vp = Vp + dVmelt 114 !! with dVmelt = R/rhow * ( rhoi*dh_i + rhos*dh_s ) * a_i 115 !! pond contraction: Vp = Vp * exp(0.01*MAX(Tp-Tsu,0)/Tp) 116 !! with Tp = -2degC 117 !! 118 !! ** Tunable parameters : (no real expertise yet, ideas?) 103 SUBROUTINE pnd_LEV 104 !!------------------------------------------------------------------- 105 !! *** ROUTINE pnd_LEV *** 106 !! 107 !! ** Purpose : Compute melt pond evolution 108 !! 109 !! ** Method : A fraction of meltwater is accumulated in ponds and sent to ocean when surface is freezing 110 !! We work with volumes and then redistribute changes into thickness and concentration 111 !! assuming linear relationship between the two. 112 !! 113 !! ** Action : - pond growth: Vp = Vp + dVmelt --- from Holland et al 2012 --- 114 !! dVmelt = (1-r)/rhow * ( rhoi*dh_i + rhos*dh_s ) * a_i 115 !! dh_i = meltwater from ice surface melt 116 !! dh_s = meltwater from snow melt 117 !! (1-r) = fraction of melt water that is not flushed 118 !! 119 !! - limtations: a_ip must not exceed (1-r)*a_i 120 !! h_ip must not exceed 0.5*h_i 121 !! 122 !! - pond shrinking: 123 !! if lids: Vp = Vp -dH * a_ip 124 !! dH = lid thickness change. Retrieved from this eq.: --- from Flocco et al 2010 --- 125 !! 126 !! rhoi * Lf * dH/dt = ki * MAX(Tp-Tsu,0) / H 127 !! H = lid thickness 128 !! Lf = latent heat of fusion 129 !! Tp = -2C 130 !! 131 !! And solved implicitely as: 132 !! H(t+dt)**2 -H(t) * H(t+dt) -ki * (Tp-Tsu) * dt / (rhoi*Lf) = 0 133 !! 134 !! if no lids: Vp = Vp * exp(0.01*MAX(Tp-Tsu,0)/Tp) --- from Holland et al 2012 --- 135 !! 136 !! - Flushing: w = -perm/visc * rho_oce * grav * Hp / Hi --- from Flocco et al 2007 --- 137 !! perm = permability of sea-ice 138 !! visc = water viscosity 139 !! Hp = height of top of the pond above sea-level 140 !! Hi = ice thickness thru which there is flushing 141 !! 142 !! - Corrections: remove melt ponds when lid thickness is 10 times the pond thickness 143 !! 144 !! - pond thickness and area is retrieved from pond volume assuming a linear relationship between h_ip and a_ip: 145 !! a_ip/a_i = a_ip_frac = h_ip / zaspect 146 !! 147 !! ** Tunable parameters : ln_pnd_lids, rn_apnd_max, rn_apnd_min 119 148 !! 120 !! ** Note : Stolen from CICE for quick test of the melt pond 121 !! radiation and freshwater interfaces 122 !! Coupling can be radiative AND freshwater 123 !! Advection, ridging, rafting are called 124 !! 125 !! ** References : Holland, M. M. et al (J Clim 2012) 126 !!------------------------------------------------------------------- 127 REAL(wp), PARAMETER :: zrmin = 0.15_wp ! minimum fraction of available meltwater retained for melt ponding 128 REAL(wp), PARAMETER :: zrmax = 0.70_wp ! maximum - - - - - 129 REAL(wp), PARAMETER :: zpnd_aspect = 0.8_wp ! pond aspect ratio 130 REAL(wp), PARAMETER :: zTp = -2._wp ! reference temperature 131 ! 132 REAL(wp) :: zfr_mlt ! fraction of available meltwater retained for melt ponding 133 REAL(wp) :: zdv_mlt ! available meltwater for melt ponding 134 REAL(wp) :: z1_Tp ! inverse reference temperature 135 REAL(wp) :: z1_rhow ! inverse freshwater density 136 REAL(wp) :: z1_zpnd_aspect ! inverse pond aspect ratio 137 REAL(wp) :: zfac, zdum 138 ! 139 INTEGER :: ji ! loop indices 140 !!------------------------------------------------------------------- 141 z1_rhow = 1._wp / rhow 142 z1_zpnd_aspect = 1._wp / zpnd_aspect 143 z1_Tp = 1._wp / zTp 149 !! ** Note : mostly stolen from CICE 150 !! 151 !! ** References : Flocco and Feltham (JGR, 2007) 152 !! Flocco et al (JGR, 2010) 153 !! Holland et al (J. Clim, 2012) 154 !!------------------------------------------------------------------- 155 REAL(wp), DIMENSION(nlay_i) :: ztmp ! temporary array 156 !! 157 REAL(wp), PARAMETER :: zaspect = 0.8_wp ! pond aspect ratio 158 REAL(wp), PARAMETER :: zTp = -2._wp ! reference temperature 159 REAL(wp), PARAMETER :: zvisc = 1.79e-3_wp ! water viscosity 160 !! 161 REAL(wp) :: zfr_mlt, zdv_mlt ! fraction and volume of available meltwater retained for melt ponding 162 REAL(wp) :: zdv_frz, zdv_flush ! Amount of melt pond that freezes, flushes 163 REAL(wp) :: zhp ! heigh of top of pond lid wrt ssh 164 REAL(wp) :: zv_ip_max ! max pond volume allowed 165 REAL(wp) :: zdT ! zTp-t_su 166 REAL(wp) :: zsbr ! Brine salinity 167 REAL(wp) :: zperm ! permeability of sea ice 168 REAL(wp) :: zfac, zdum ! temporary arrays 169 REAL(wp) :: z1_rhow, z1_aspect, z1_Tp ! inverse 170 !! 171 INTEGER :: ji, jk ! loop indices 172 !!------------------------------------------------------------------- 173 z1_rhow = 1._wp / rhow 174 z1_aspect = 1._wp / zaspect 175 z1_Tp = 1._wp / zTp 144 176 145 177 DO ji = 1, npti 146 ! !--------------------------------!147 IF( h_i_1d(ji) < rn_himin ) THEN ! Case ice thickness < rn_himin!148 ! !--------------------------------!149 !--- Remove ponds on thin ice 178 ! !----------------------------------------------------! 179 IF( h_i_1d(ji) < rn_himin .OR. a_i_1d(ji) < epsi10 ) THEN ! Case ice thickness < rn_himin or tiny ice fraction ! 180 ! !----------------------------------------------------! 181 !--- Remove ponds on thin ice or tiny ice fractions 150 182 a_ip_1d(ji) = 0._wp 151 a_ip_frac_1d(ji) = 0._wp152 183 h_ip_1d(ji) = 0._wp 153 ! !--------------------------------! 154 ELSE ! Case ice thickness >= rn_himin ! 155 ! !--------------------------------! 156 v_ip_1d(ji) = h_ip_1d(ji) * a_ip_1d(ji) ! record pond volume at previous time step 157 ! 158 ! available meltwater for melt ponding [m, >0] and fraction 159 zdv_mlt = -( dh_i_sum(ji)*rhoi + dh_s_mlt(ji)*rhos ) * z1_rhow * a_i_1d(ji) 160 zfr_mlt = zrmin + ( zrmax - zrmin ) * a_i_1d(ji) ! from CICE doc 161 !zfr_mlt = zrmin + zrmax * a_i_1d(ji) ! from Holland paper 162 ! 163 !--- Pond gowth ---! 164 ! v_ip should never be negative, otherwise code crashes 165 v_ip_1d(ji) = MAX( 0._wp, v_ip_1d(ji) + zfr_mlt * zdv_mlt ) 166 ! 167 ! melt pond mass flux (<0) 184 h_il_1d(ji) = 0._wp 185 ! !--------------------------------! 186 ELSE ! Case ice thickness >= rn_himin ! 187 ! !--------------------------------! 188 v_ip_1d(ji) = h_ip_1d(ji) * a_ip_1d(ji) ! retrieve volume from thickness 189 v_il_1d(ji) = h_il_1d(ji) * a_ip_1d(ji) 190 ! 191 !------------------! 192 ! case ice melting ! 193 !------------------! 194 ! 195 !--- available meltwater for melt ponding ---! 196 zdum = -( dh_i_sum(ji)*rhoi + dh_s_mlt(ji)*rhos ) * z1_rhow * a_i_1d(ji) 197 zfr_mlt = rn_apnd_min + ( rn_apnd_max - rn_apnd_min ) * at_i_1d(ji) ! = ( 1 - r ) = fraction of melt water that is not flushed 198 zdv_mlt = MAX( 0._wp, zfr_mlt * zdum ) ! max for roundoff errors? 199 ! 200 !--- overflow ---! 201 ! If pond area exceeds zfr_mlt * a_i_1d(ji) then reduce the pond volume 202 ! a_ip_max = zfr_mlt * a_i 203 ! => from zaspect = h_ip / (a_ip / a_i), set v_ip_max as: 204 zv_ip_max = zfr_mlt**2 * a_i_1d(ji) * zaspect 205 zdv_mlt = MAX( 0._wp, MIN( zdv_mlt, zv_ip_max - v_ip_1d(ji) ) ) 206 207 ! If pond depth exceeds half the ice thickness then reduce the pond volume 208 ! h_ip_max = 0.5 * h_i 209 ! => from zaspect = h_ip / (a_ip / a_i), set v_ip_max as: 210 zv_ip_max = z1_aspect * a_i_1d(ji) * 0.25 * h_i_1d(ji) * h_i_1d(ji) 211 zdv_mlt = MAX( 0._wp, MIN( zdv_mlt, zv_ip_max - v_ip_1d(ji) ) ) 212 213 !--- Pond growing ---! 214 v_ip_1d(ji) = v_ip_1d(ji) + zdv_mlt 215 ! 216 !--- Lid melting ---! 217 IF( ln_pnd_lids ) v_il_1d(ji) = MAX( 0._wp, v_il_1d(ji) - zdv_mlt ) ! must be bounded by 0 218 ! 219 !--- mass flux ---! 168 220 IF( zdv_mlt > 0._wp ) THEN 169 zfac = z fr_mlt * zdv_mlt * rhow * r1_rdtice221 zfac = zdv_mlt * rhow * r1_rdtice ! melt pond mass flux < 0 [kg.m-2.s-1] 170 222 wfx_pnd_1d(ji) = wfx_pnd_1d(ji) - zfac 171 223 ! 172 ! adjust ice/snow melting flux to balance melt pond flux (>0) 173 zdum = zfac / ( wfx_snw_sum_1d(ji) + wfx_sum_1d(ji) ) 224 zdum = zfac / ( wfx_snw_sum_1d(ji) + wfx_sum_1d(ji) ) ! adjust ice/snow melting flux > 0 to balance melt pond flux 174 225 wfx_snw_sum_1d(ji) = wfx_snw_sum_1d(ji) * (1._wp + zdum) 175 226 wfx_sum_1d(ji) = wfx_sum_1d(ji) * (1._wp + zdum) 176 227 ENDIF 228 229 !-------------------! 230 ! case ice freezing ! i.e. t_su_1d(ji) < (zTp+rt0) 231 !-------------------! 232 ! 233 zdT = MAX( zTp+rt0 - t_su_1d(ji), 0._wp ) 177 234 ! 178 235 !--- Pond contraction (due to refreezing) ---! 179 v_ip_1d(ji) = v_ip_1d(ji) * EXP( 0.01_wp * MAX( zTp+rt0 - t_su_1d(ji), 0._wp ) * z1_Tp ) 180 ! 181 ! Set new pond area and depth assuming linear relation between h_ip and a_ip_frac 182 ! h_ip = zpnd_aspect * a_ip_frac = zpnd_aspect * a_ip/a_i 183 a_ip_1d(ji) = SQRT( v_ip_1d(ji) * z1_zpnd_aspect * a_i_1d(ji) ) 184 a_ip_frac_1d(ji) = a_ip_1d(ji) / a_i_1d(ji) 185 h_ip_1d(ji) = zpnd_aspect * a_ip_frac_1d(ji) 236 IF( ln_pnd_lids ) THEN 237 ! 238 !--- Lid growing and subsequent pond shrinking ---! 239 zdv_frz = 0.5_wp * MAX( 0._wp, -v_il_1d(ji) + & ! Flocco 2010 (eq. 5) solved implicitly as aH**2 + bH + c = 0 240 & SQRT( v_il_1d(ji)**2 + a_ip_1d(ji)**2 * 4._wp * rcnd_i * zdT * rdt_ice / (rLfus * rhow) ) ) ! max for roundoff errors 241 242 ! Lid growing 243 v_il_1d(ji) = MAX( 0._wp, v_il_1d(ji) + zdv_frz ) 244 245 ! Pond shrinking 246 v_ip_1d(ji) = MAX( 0._wp, v_ip_1d(ji) - zdv_frz ) 247 248 ELSE 249 ! Pond shrinking 250 v_ip_1d(ji) = v_ip_1d(ji) * EXP( 0.01_wp * zdT * z1_Tp ) ! Holland 2012 (eq. 6) 251 ENDIF 252 ! 253 !--- Set new pond area and depth ---! assuming linear relation between h_ip and a_ip_frac 254 ! v_ip = h_ip * a_ip 255 ! a_ip/a_i = a_ip_frac = h_ip / zaspect (cf Holland 2012, fitting SHEBA so that knowing v_ip we can distribute it to a_ip and h_ip) 256 a_ip_1d(ji) = MIN( a_i_1d(ji), SQRT( v_ip_1d(ji) * z1_aspect * a_i_1d(ji) ) ) ! make sure a_ip < a_i 257 h_ip_1d(ji) = zaspect * a_ip_1d(ji) / a_i_1d(ji) 258 259 !---------------! 260 ! Pond flushing ! 261 !---------------! 262 ! height of top of the pond above sea-level 263 zhp = ( h_i_1d(ji) * ( rau0 - rhoi ) + h_ip_1d(ji) * ( rau0 - rhow * a_ip_1d(ji) / a_i_1d(ji) ) ) * r1_rau0 264 265 ! Calculate the permeability of the ice (Assur 1958, see Flocco 2010) 266 DO jk = 1, nlay_i 267 zsbr = - 1.2_wp & 268 & - 21.8_wp * ( t_i_1d(ji,jk) - rt0 ) & 269 & - 0.919_wp * ( t_i_1d(ji,jk) - rt0 )**2 & 270 & - 0.0178_wp * ( t_i_1d(ji,jk) - rt0 )**3 271 ztmp(jk) = sz_i_1d(ji,jk) / zsbr 272 END DO 273 zperm = MAX( 0._wp, 3.e-08_wp * MINVAL(ztmp)**3 ) 274 275 ! Do the drainage using Darcy's law 276 zdv_flush = -zperm * rau0 * grav * zhp * rdt_ice / (zvisc * h_i_1d(ji)) * a_ip_1d(ji) 277 zdv_flush = MAX( zdv_flush, -v_ip_1d(ji) ) 278 v_ip_1d(ji) = v_ip_1d(ji) + zdv_flush 279 280 !--- Set new pond area and depth ---! assuming linear relation between h_ip and a_ip_frac 281 a_ip_1d(ji) = MIN( a_i_1d(ji), SQRT( v_ip_1d(ji) * z1_aspect * a_i_1d(ji) ) ) ! make sure a_ip < a_i 282 h_ip_1d(ji) = zaspect * a_ip_1d(ji) / a_i_1d(ji) 283 284 !--- Corrections and lid thickness ---! 285 IF( ln_pnd_lids ) THEN 286 !--- retrieve lid thickness from volume ---! 287 IF( a_ip_1d(ji) > epsi10 ) THEN ; h_il_1d(ji) = v_il_1d(ji) / a_ip_1d(ji) 288 ELSE ; h_il_1d(ji) = 0._wp 289 ENDIF 290 !--- remove ponds if lids are much larger than ponds ---! 291 IF ( h_il_1d(ji) > h_ip_1d(ji) * 10._wp ) THEN 292 a_ip_1d(ji) = 0._wp 293 h_ip_1d(ji) = 0._wp 294 h_il_1d(ji) = 0._wp 295 ENDIF 296 ENDIF 186 297 ! 187 298 ENDIF 299 188 300 END DO 189 301 ! 190 END SUBROUTINE pnd_ H12302 END SUBROUTINE pnd_LEV 191 303 192 304 … … 205 317 INTEGER :: ios, ioptio ! Local integer 206 318 !! 207 NAMELIST/namthd_pnd/ ln_pnd, ln_pnd_H12, ln_pnd_CST, rn_apnd, rn_hpnd, ln_pnd_alb 319 NAMELIST/namthd_pnd/ ln_pnd, ln_pnd_LEV , rn_apnd_min, rn_apnd_max, & 320 & ln_pnd_CST , rn_apnd, rn_hpnd, & 321 & ln_pnd_lids, ln_pnd_alb 208 322 !!------------------------------------------------------------------- 209 323 ! … … 221 335 WRITE(numout,*) '~~~~~~~~~~~~~~~~' 222 336 WRITE(numout,*) ' Namelist namicethd_pnd:' 223 WRITE(numout,*) ' Melt ponds activated or not ln_pnd = ', ln_pnd 224 WRITE(numout,*) ' Evolutive melt pond fraction and depth (Holland et al 2012) ln_pnd_H12 = ', ln_pnd_H12 225 WRITE(numout,*) ' Prescribed melt pond fraction and depth ln_pnd_CST = ', ln_pnd_CST 226 WRITE(numout,*) ' Prescribed pond fraction rn_apnd = ', rn_apnd 227 WRITE(numout,*) ' Prescribed pond depth rn_hpnd = ', rn_hpnd 228 WRITE(numout,*) ' Melt ponds affect albedo or not ln_pnd_alb = ', ln_pnd_alb 337 WRITE(numout,*) ' Melt ponds activated or not ln_pnd = ', ln_pnd 338 WRITE(numout,*) ' Level ice melt pond scheme ln_pnd_LEV = ', ln_pnd_LEV 339 WRITE(numout,*) ' Minimum ice fraction that contributes to melt ponds rn_apnd_min = ', rn_apnd_min 340 WRITE(numout,*) ' Maximum ice fraction that contributes to melt ponds rn_apnd_max = ', rn_apnd_max 341 WRITE(numout,*) ' Constant ice melt pond scheme ln_pnd_CST = ', ln_pnd_CST 342 WRITE(numout,*) ' Prescribed pond fraction rn_apnd = ', rn_apnd 343 WRITE(numout,*) ' Prescribed pond depth rn_hpnd = ', rn_hpnd 344 WRITE(numout,*) ' Frozen lids on top of melt ponds ln_pnd_lids = ', ln_pnd_lids 345 WRITE(numout,*) ' Melt ponds affect albedo or not ln_pnd_alb = ', ln_pnd_alb 229 346 ENDIF 230 347 ! … … 233 350 IF( .NOT.ln_pnd ) THEN ; ioptio = ioptio + 1 ; nice_pnd = np_pndNO ; ENDIF 234 351 IF( ln_pnd_CST ) THEN ; ioptio = ioptio + 1 ; nice_pnd = np_pndCST ; ENDIF 235 IF( ln_pnd_ H12 ) THEN ; ioptio = ioptio + 1 ; nice_pnd = np_pndH12; ENDIF352 IF( ln_pnd_LEV ) THEN ; ioptio = ioptio + 1 ; nice_pnd = np_pndLEV ; ENDIF 236 353 IF( ioptio /= 1 ) & 237 & CALL ctl_stop( 'ice_thd_pnd_init: choose either none (ln_pnd=F) or only one pond scheme (ln_pnd_ H12or ln_pnd_CST)' )354 & CALL ctl_stop( 'ice_thd_pnd_init: choose either none (ln_pnd=F) or only one pond scheme (ln_pnd_LEV or ln_pnd_CST)' ) 238 355 ! 239 356 SELECT CASE( nice_pnd ) 240 357 CASE( np_pndNO ) 241 IF( ln_pnd_alb ) THEN ; ln_pnd_alb = .FALSE. ; CALL ctl_warn( 'ln_pnd_alb=false when no ponds' ) ; ENDIF 358 IF( ln_pnd_alb ) THEN ; ln_pnd_alb = .FALSE. ; CALL ctl_warn( 'ln_pnd_alb=false when no ponds' ) ; ENDIF 359 IF( ln_pnd_lids ) THEN ; ln_pnd_lids = .FALSE. ; CALL ctl_warn( 'ln_pnd_lids=false when no ponds' ) ; ENDIF 360 CASE( np_pndCST ) 361 IF( ln_pnd_lids ) THEN ; ln_pnd_lids = .FALSE. ; CALL ctl_warn( 'ln_pnd_lids=false when constant ponds' ) ; ENDIF 242 362 END SELECT 243 363 ! -
NEMO/releases/r4.0/r4.0-HEAD/src/ICE/icethd_sal.F90
r11536 r13284 55 55 !! -> nn_icesal = 3 -> Sice = S(z) [multiyear ice] 56 56 !!--------------------------------------------------------------------- 57 LOGICAL, INTENT(in) :: ld_sal 57 LOGICAL, INTENT(in) :: ld_sal ! gravity drainage and flushing or not 58 58 ! 59 INTEGER :: ji, jk ! dummy loop indices 60 REAL(wp) :: iflush, igravdr ! local scalars 61 REAL(wp) :: zs_sni, zs_i_gd, zs_i_fl, zs_i_si, zs_i_bg ! local scalars 59 INTEGER :: ji ! dummy loop indices 60 REAL(wp) :: zs_sni, zds ! local scalars 62 61 REAL(wp) :: z1_time_gd, z1_time_fl 63 62 !!--------------------------------------------------------------------- … … 68 67 CASE( 2 ) ! time varying salinity with linear profile ! 69 68 ! !---------------------------------------------! 70 z1_time_gd = 1._wp / rn_time_gd * rdt_ice71