From 3fe903d98bba46bf713e4a47d9bbb2b2dc0c049b Mon Sep 17 00:00:00 2001 From: Quentin Rodier <quentin.rodier@meteo.fr> Date: Fri, 5 Nov 2021 16:12:31 +0100 Subject: [PATCH] Quentin 05/11/2021: Add parts of turb conv micro MNH 5.5.0 source --- src/mesonh/conv/convect_chem_transport.f90 | 295 + src/mesonh/conv/convect_closure.f90 | 755 +++ src/mesonh/conv/convect_closure_adjust.f90 | 183 + .../conv/convect_closure_adjust_shal.f90 | 134 + src/mesonh/conv/convect_closure_shal.f90 | 619 ++ src/mesonh/conv/convect_closure_thrvlcl.f90 | 299 + src/mesonh/conv/convect_condens.f90 | 191 + src/mesonh/conv/convect_downdraft.f90 | 505 ++ src/mesonh/conv/convect_mixing_funct.f90 | 151 + src/mesonh/conv/convect_precip_adjust.f90 | 337 + src/mesonh/conv/convect_satmixratio.f90 | 122 + src/mesonh/conv/convect_trigger_funct.f90 | 454 ++ src/mesonh/conv/convect_trigger_shal.f90 | 461 ++ src/mesonh/conv/convect_tstep_pref.f90 | 206 + src/mesonh/conv/convect_updraft.f90 | 641 ++ src/mesonh/conv/convect_updraft_shal.f90 | 598 ++ src/mesonh/conv/deep_convection.f90 | 1393 ++++ src/mesonh/conv/ini_convpar.f90 | 111 + src/mesonh/conv/ini_convpar_e1.f90 | 111 + src/mesonh/conv/ini_convpar_shal.f90 | 112 + src/mesonh/conv/modd_convpar.f90 | 77 + src/mesonh/conv/modd_convpar_shal.f90 | 79 + src/mesonh/conv/modd_convparext.f90 | 22 + src/mesonh/conv/shallow_convection.f90 | 973 +++ src/mesonh/micro/c2r2_adjust.f90 | 440 ++ src/mesonh/micro/cart_compress.f90 | 170 + src/mesonh/micro/condensation.f90 | 513 ++ src/mesonh/micro/gamma.f90 | 224 + src/mesonh/micro/gamma_inc.f90 | 148 + src/mesonh/micro/general_gamma.f90 | 91 + src/mesonh/micro/hypgeo.f90 | 119 + src/mesonh/micro/hypser.f90 | 116 + src/mesonh/micro/ice4_compute_pdf.f90 | 324 + src/mesonh/micro/ice4_fast_rg.f90 | 582 ++ src/mesonh/micro/ice4_fast_rh.f90 | 593 ++ src/mesonh/micro/ice4_fast_ri.f90 | 129 + src/mesonh/micro/ice4_fast_rs.f90 | 521 ++ src/mesonh/micro/ice4_nucleation.f90 | 152 + src/mesonh/micro/ice4_nucleation_wrapper.f90 | 149 + src/mesonh/micro/ice4_rainfr_vert.f90 | 83 + src/mesonh/micro/ice4_rimltc.f90 | 105 + src/mesonh/micro/ice4_rrhong.f90 | 105 + src/mesonh/micro/ice4_rsrimcg_old.f90 | 144 + src/mesonh/micro/ice4_sedimentation_split.f90 | 494 ++ .../ice4_sedimentation_split_momentum.f90 | 577 ++ src/mesonh/micro/ice4_sedimentation_stat.f90 | 444 ++ src/mesonh/micro/ice4_slow.f90 | 263 + src/mesonh/micro/ice4_tendencies.f90 | 620 ++ src/mesonh/micro/ice4_warm.f90 | 316 + src/mesonh/micro/ice_adjust.f90 | 524 ++ src/mesonh/micro/ini_cst.f90 | 197 + src/mesonh/micro/ini_lima.f90 | 173 + src/mesonh/micro/ini_lima_cold_mixed.f90 | 1348 ++++ src/mesonh/micro/ini_lima_warm.f90 | 461 ++ src/mesonh/micro/ini_neb.f90 | 72 + src/mesonh/micro/ini_rain_c2r2.f90 | 637 ++ src/mesonh/micro/ini_rain_ice.f90 | 1408 ++++ src/mesonh/micro/ini_rain_ice_elec.f90 | 1255 ++++ src/mesonh/micro/init_aerosol_properties.f90 | 436 ++ src/mesonh/micro/lima.f90 | 1803 +++++ src/mesonh/micro/lima_adjust.f90 | 1307 ++++ src/mesonh/micro/lima_adjust_split.f90 | 848 +++ src/mesonh/micro/lima_bergeron.f90 | 121 + src/mesonh/micro/lima_ccn_activation.f90 | 835 +++ src/mesonh/micro/lima_ccn_hom_freezing.f90 | 397 ++ src/mesonh/micro/lima_cold.f90 | 435 ++ src/mesonh/micro/lima_cold_hom_nucl.f90 | 659 ++ src/mesonh/micro/lima_cold_sedimentation.f90 | 354 + src/mesonh/micro/lima_cold_slow_processes.f90 | 537 ++ .../micro/lima_compute_cloud_fractions.f90 | 173 + .../micro/lima_conversion_melting_snow.f90 | 121 + src/mesonh/micro/lima_droplets_accretion.f90 | 160 + .../micro/lima_droplets_autoconversion.f90 | 127 + .../micro/lima_droplets_hom_freezing.f90 | 145 + .../micro/lima_droplets_riming_snow.f90 | 226 + .../micro/lima_droplets_self_collection.f90 | 94 + src/mesonh/micro/lima_drops_break_up.f90 | 100 + src/mesonh/micro/lima_drops_hom_freezing.f90 | 144 + .../micro/lima_drops_self_collection.f90 | 123 + .../micro/lima_drops_to_droplets_conv.f90 | 103 + src/mesonh/micro/lima_functions.f90 | 307 + src/mesonh/micro/lima_graupel.f90 | 569 ++ src/mesonh/micro/lima_graupel_deposition.f90 | 97 + .../micro/lima_ice_aggregation_snow.f90 | 119 + src/mesonh/micro/lima_ice_deposition.f90 | 175 + src/mesonh/micro/lima_ice_melting.f90 | 164 + src/mesonh/micro/lima_ice_snow_deposition.f90 | 230 + .../lima_init_ccn_activation_spectrum.f90 | 458 ++ src/mesonh/micro/lima_inst_procs.f90 | 197 + src/mesonh/micro/lima_meyers.f90 | 466 ++ src/mesonh/micro/lima_meyers_nucleation.f90 | 348 + src/mesonh/micro/lima_mixed.f90 | 643 ++ .../micro/lima_mixed_fast_processes.f90 | 1426 ++++ .../micro/lima_mixed_slow_processes.f90 | 304 + src/mesonh/micro/lima_mixrat_to_nconc.f90 | 192 + src/mesonh/micro/lima_notadjust.f90 | 624 ++ src/mesonh/micro/lima_nucleation_procs.f90 | 334 + src/mesonh/micro/lima_phillips.f90 | 663 ++ .../micro/lima_phillips_ifn_nucleation.f90 | 512 ++ src/mesonh/micro/lima_phillips_integ.f90 | 163 + .../micro/lima_phillips_ref_spectrum.f90 | 140 + src/mesonh/micro/lima_precip_scavenging.f90 | 856 +++ src/mesonh/micro/lima_rain_accr_snow.f90 | 299 + src/mesonh/micro/lima_rain_evaporation.f90 | 149 + src/mesonh/micro/lima_rain_freezing.f90 | 134 + src/mesonh/micro/lima_read_xker_gweth.f90 | 1737 +++++ src/mesonh/micro/lima_read_xker_raccs.f90 | 4951 ++++++++++++++ src/mesonh/micro/lima_read_xker_rdryg.f90 | 1736 +++++ src/mesonh/micro/lima_read_xker_sdryg.f90 | 3337 ++++++++++ src/mesonh/micro/lima_read_xker_sweth.f90 | 3337 ++++++++++ src/mesonh/micro/lima_sedimentation.f90 | 244 + src/mesonh/micro/lima_snow_deposition.f90 | 163 + src/mesonh/micro/lima_tendencies.f90 | 797 +++ src/mesonh/micro/lima_warm.f90 | 486 ++ src/mesonh/micro/lima_warm_coal.f90 | 460 ++ src/mesonh/micro/lima_warm_evap.f90 | 353 + src/mesonh/micro/lima_warm_nucl.f90 | 860 +++ src/mesonh/micro/lima_warm_sedimentation.f90 | 396 ++ src/mesonh/micro/modd_blankn.f90 | 173 + src/mesonh/micro/modd_conf.f90 | 127 + src/mesonh/micro/modd_cst.f90 | 116 + src/mesonh/micro/modd_dyn.f90 | 86 + src/mesonh/micro/modd_elec_descr.f90 | 178 + src/mesonh/micro/modd_les.f90 | 458 ++ .../micro/modd_lima_precip_scavengingn.f90 | 50 + src/mesonh/micro/modd_lunit.f90 | 49 + src/mesonh/micro/modd_neb.f90 | 43 + src/mesonh/micro/modd_nsv.f90 | 253 + src/mesonh/micro/modd_param_c1r3.f90 | 65 + src/mesonh/micro/modd_param_c2r2.f90 | 80 + src/mesonh/micro/modd_param_ice.f90 | 83 + src/mesonh/micro/modd_param_lima.f90 | 216 + src/mesonh/micro/modd_param_lima_cold.f90 | 128 + src/mesonh/micro/modd_param_lima_mixed.f90 | 169 + src/mesonh/micro/modd_param_lima_warm.f90 | 125 + src/mesonh/micro/modd_parameters.f90 | 98 + src/mesonh/micro/modd_rain_c2r2_descr.f90 | 72 + .../micro/modd_rain_c2r2_khko_param.f90 | 120 + src/mesonh/micro/modd_rain_ice_descr.f90 | 87 + src/mesonh/micro/modd_rain_ice_param.f90 | 185 + src/mesonh/micro/modn_param_lima.f90 | 36 + src/mesonh/micro/prognos_lima.f90 | 393 ++ src/mesonh/micro/radar_rain_ice.f90 | 486 ++ src/mesonh/micro/rain_c2r2_khko.f90 | 1957 ++++++ src/mesonh/micro/rain_ice.f90 | 945 +++ src/mesonh/micro/rain_ice_elec.f90 | 5849 +++++++++++++++++ src/mesonh/micro/rain_ice_fast_rg.f90 | 455 ++ src/mesonh/micro/rain_ice_fast_rh.f90 | 403 ++ src/mesonh/micro/rain_ice_fast_ri.f90 | 103 + src/mesonh/micro/rain_ice_fast_rs.f90 | 375 ++ src/mesonh/micro/rain_ice_nucleation.f90 | 180 + src/mesonh/micro/rain_ice_red.f90 | 1882 ++++++ .../micro/rain_ice_sedimentation_split.f90 | 617 ++ .../micro/rain_ice_sedimentation_stat.f90 | 582 ++ src/mesonh/micro/rain_ice_slow.f90 | 225 + src/mesonh/micro/rain_ice_warm.f90 | 235 + src/mesonh/micro/read_xker_gweth.f90 | 1737 +++++ src/mesonh/micro/read_xker_raccs.f90 | 4950 ++++++++++++++ src/mesonh/micro/read_xker_rdryg.f90 | 1736 +++++ src/mesonh/micro/read_xker_rweth.f90 | 1733 +++++ src/mesonh/micro/read_xker_sdryg.f90 | 3337 ++++++++++ src/mesonh/micro/read_xker_sweth.f90 | 3337 ++++++++++ src/mesonh/micro/rrcolss.f90 | 312 + src/mesonh/micro/rscolrg.f90 | 312 + src/mesonh/micro/rzcolx.f90 | 271 + src/mesonh/micro/set_conc_lima.f90 | 200 + src/mesonh/turb/bl89.f90 | 396 ++ src/mesonh/turb/bl_depth_diag.f90 | 200 + src/mesonh/turb/compute_bl89_ml.f90 | 250 + src/mesonh/turb/compute_entr_detr.f90 | 488 ++ src/mesonh/turb/compute_frac_ice.f90 | 286 + .../turb/compute_function_thermo_mf.f90 | 238 + src/mesonh/turb/compute_mf_cloud.f90 | 196 + src/mesonh/turb/compute_mf_cloud_bigaus.f90 | 209 + src/mesonh/turb/compute_mf_cloud_direct.f90 | 119 + src/mesonh/turb/compute_mf_cloud_stat.f90 | 181 + src/mesonh/turb/compute_updraft.f90 | 647 ++ src/mesonh/turb/compute_updraft_raha.f90 | 666 ++ src/mesonh/turb/compute_updraft_rhcj10.f90 | 625 ++ src/mesonh/turb/emoist.f90 | 185 + src/mesonh/turb/etheta.f90 | 180 + src/mesonh/turb/ini_cturb.f90 | 254 + src/mesonh/turb/mf_turb.f90 | 332 + src/mesonh/turb/mf_turb_expl.f90 | 227 + src/mesonh/turb/mf_turb_greyzone.f90 | 340 + src/mesonh/turb/modd_cturb.f90 | 91 + src/mesonh/turb/modd_diag_in_run.f90 | 43 + src/mesonh/turb/modd_turb_cloud.f90 | 58 + .../turb/modd_turb_flux_aircraft_balloon.f90 | 54 + src/mesonh/turb/modd_turbn.f90 | 211 + src/mesonh/turb/mode_prandtl.f90 | 1399 ++++ src/mesonh/turb/mode_sbl.f90 | 457 ++ src/mesonh/turb/modn_turb.f90 | 47 + src/mesonh/turb/modn_turb_cloud.f90 | 49 + src/mesonh/turb/modn_turbn.f90 | 167 + src/mesonh/turb/prandtl.f90 | 609 ++ src/mesonh/turb/rmc01.f90 | 260 + src/mesonh/turb/sbl_depth.f90 | 145 + src/mesonh/turb/shallow_mf.f90 | 437 ++ src/mesonh/turb/shuman_mf.f90 | 445 ++ src/mesonh/turb/thl_rt_from_th_r_mf.f90 | 146 + src/mesonh/turb/tke_eps_sources.f90 | 485 ++ src/mesonh/turb/tm06.f90 | 165 + src/mesonh/turb/tm06_h.f90 | 124 + src/mesonh/turb/tridiag.f90 | 261 + src/mesonh/turb/tridiag_massflux.f90 | 301 + src/mesonh/turb/tridiag_thermo.f90 | 297 + src/mesonh/turb/tridiag_tke.f90 | 266 + src/mesonh/turb/tridiag_wind.f90 | 267 + src/mesonh/turb/turb.f90 | 1876 ++++++ src/mesonh/turb/turb_cloud_index.f90 | 344 + src/mesonh/turb/turb_hor.f90 | 469 ++ src/mesonh/turb/turb_hor_dyn_corr.f90 | 625 ++ src/mesonh/turb/turb_hor_splt.f90 | 632 ++ src/mesonh/turb/turb_hor_sv_corr.f90 | 218 + src/mesonh/turb/turb_hor_sv_flux.f90 | 364 + src/mesonh/turb/turb_hor_thermo_corr.f90 | 468 ++ src/mesonh/turb/turb_hor_thermo_flux.f90 | 752 +++ src/mesonh/turb/turb_hor_tke.f90 | 246 + src/mesonh/turb/turb_hor_uv.f90 | 355 + src/mesonh/turb/turb_hor_uw.f90 | 299 + src/mesonh/turb/turb_hor_vw.f90 | 307 + src/mesonh/turb/turb_ver.f90 | 746 +++ src/mesonh/turb/turb_ver_dyn_flux.f90 | 924 +++ src/mesonh/turb/turb_ver_sv_corr.f90 | 223 + src/mesonh/turb/turb_ver_sv_flux.f90 | 490 ++ src/mesonh/turb/turb_ver_thermo_corr.f90 | 848 +++ src/mesonh/turb/turb_ver_thermo_flux.f90 | 1109 ++++ 228 files changed, 119707 insertions(+) create mode 100644 src/mesonh/conv/convect_chem_transport.f90 create mode 100644 src/mesonh/conv/convect_closure.f90 create mode 100644 src/mesonh/conv/convect_closure_adjust.f90 create mode 100644 src/mesonh/conv/convect_closure_adjust_shal.f90 create mode 100644 src/mesonh/conv/convect_closure_shal.f90 create mode 100644 src/mesonh/conv/convect_closure_thrvlcl.f90 create mode 100644 src/mesonh/conv/convect_condens.f90 create mode 100644 src/mesonh/conv/convect_downdraft.f90 create mode 100644 src/mesonh/conv/convect_mixing_funct.f90 create mode 100644 src/mesonh/conv/convect_precip_adjust.f90 create mode 100644 src/mesonh/conv/convect_satmixratio.f90 create mode 100644 src/mesonh/conv/convect_trigger_funct.f90 create mode 100644 src/mesonh/conv/convect_trigger_shal.f90 create mode 100644 src/mesonh/conv/convect_tstep_pref.f90 create mode 100644 src/mesonh/conv/convect_updraft.f90 create mode 100644 src/mesonh/conv/convect_updraft_shal.f90 create mode 100644 src/mesonh/conv/deep_convection.f90 create mode 100644 src/mesonh/conv/ini_convpar.f90 create mode 100644 src/mesonh/conv/ini_convpar_e1.f90 create mode 100644 src/mesonh/conv/ini_convpar_shal.f90 create mode 100644 src/mesonh/conv/modd_convpar.f90 create mode 100644 src/mesonh/conv/modd_convpar_shal.f90 create mode 100644 src/mesonh/conv/modd_convparext.f90 create mode 100644 src/mesonh/conv/shallow_convection.f90 create mode 100644 src/mesonh/micro/c2r2_adjust.f90 create mode 100644 src/mesonh/micro/cart_compress.f90 create mode 100644 src/mesonh/micro/condensation.f90 create mode 100644 src/mesonh/micro/gamma.f90 create mode 100644 src/mesonh/micro/gamma_inc.f90 create mode 100644 src/mesonh/micro/general_gamma.f90 create mode 100644 src/mesonh/micro/hypgeo.f90 create mode 100644 src/mesonh/micro/hypser.f90 create mode 100644 src/mesonh/micro/ice4_compute_pdf.f90 create mode 100644 src/mesonh/micro/ice4_fast_rg.f90 create mode 100644 src/mesonh/micro/ice4_fast_rh.f90 create mode 100644 src/mesonh/micro/ice4_fast_ri.f90 create mode 100644 src/mesonh/micro/ice4_fast_rs.f90 create mode 100644 src/mesonh/micro/ice4_nucleation.f90 create mode 100644 src/mesonh/micro/ice4_nucleation_wrapper.f90 create mode 100644 src/mesonh/micro/ice4_rainfr_vert.f90 create mode 100644 src/mesonh/micro/ice4_rimltc.f90 create mode 100644 src/mesonh/micro/ice4_rrhong.f90 create mode 100644 src/mesonh/micro/ice4_rsrimcg_old.f90 create mode 100644 src/mesonh/micro/ice4_sedimentation_split.f90 create mode 100644 src/mesonh/micro/ice4_sedimentation_split_momentum.f90 create mode 100644 src/mesonh/micro/ice4_sedimentation_stat.f90 create mode 100644 src/mesonh/micro/ice4_slow.f90 create mode 100644 src/mesonh/micro/ice4_tendencies.f90 create mode 100644 src/mesonh/micro/ice4_warm.f90 create mode 100644 src/mesonh/micro/ice_adjust.f90 create mode 100644 src/mesonh/micro/ini_cst.f90 create mode 100644 src/mesonh/micro/ini_lima.f90 create mode 100644 src/mesonh/micro/ini_lima_cold_mixed.f90 create mode 100644 src/mesonh/micro/ini_lima_warm.f90 create mode 100644 src/mesonh/micro/ini_neb.f90 create mode 100644 src/mesonh/micro/ini_rain_c2r2.f90 create mode 100644 src/mesonh/micro/ini_rain_ice.f90 create mode 100644 src/mesonh/micro/ini_rain_ice_elec.f90 create mode 100644 src/mesonh/micro/init_aerosol_properties.f90 create mode 100644 src/mesonh/micro/lima.f90 create mode 100644 src/mesonh/micro/lima_adjust.f90 create mode 100644 src/mesonh/micro/lima_adjust_split.f90 create mode 100644 src/mesonh/micro/lima_bergeron.f90 create mode 100644 src/mesonh/micro/lima_ccn_activation.f90 create mode 100644 src/mesonh/micro/lima_ccn_hom_freezing.f90 create mode 100644 src/mesonh/micro/lima_cold.f90 create mode 100644 src/mesonh/micro/lima_cold_hom_nucl.f90 create mode 100644 src/mesonh/micro/lima_cold_sedimentation.f90 create mode 100644 src/mesonh/micro/lima_cold_slow_processes.f90 create mode 100644 src/mesonh/micro/lima_compute_cloud_fractions.f90 create mode 100644 src/mesonh/micro/lima_conversion_melting_snow.f90 create mode 100644 src/mesonh/micro/lima_droplets_accretion.f90 create mode 100644 src/mesonh/micro/lima_droplets_autoconversion.f90 create mode 100644 src/mesonh/micro/lima_droplets_hom_freezing.f90 create mode 100644 src/mesonh/micro/lima_droplets_riming_snow.f90 create mode 100644 src/mesonh/micro/lima_droplets_self_collection.f90 create mode 100644 src/mesonh/micro/lima_drops_break_up.f90 create mode 100644 src/mesonh/micro/lima_drops_hom_freezing.f90 create mode 100644 src/mesonh/micro/lima_drops_self_collection.f90 create mode 100644 src/mesonh/micro/lima_drops_to_droplets_conv.f90 create mode 100644 src/mesonh/micro/lima_functions.f90 create mode 100644 src/mesonh/micro/lima_graupel.f90 create mode 100644 src/mesonh/micro/lima_graupel_deposition.f90 create mode 100644 src/mesonh/micro/lima_ice_aggregation_snow.f90 create mode 100644 src/mesonh/micro/lima_ice_deposition.f90 create mode 100644 src/mesonh/micro/lima_ice_melting.f90 create mode 100644 src/mesonh/micro/lima_ice_snow_deposition.f90 create mode 100644 src/mesonh/micro/lima_init_ccn_activation_spectrum.f90 create mode 100644 src/mesonh/micro/lima_inst_procs.f90 create mode 100644 src/mesonh/micro/lima_meyers.f90 create mode 100644 src/mesonh/micro/lima_meyers_nucleation.f90 create mode 100644 src/mesonh/micro/lima_mixed.f90 create mode 100644 src/mesonh/micro/lima_mixed_fast_processes.f90 create mode 100644 src/mesonh/micro/lima_mixed_slow_processes.f90 create mode 100644 src/mesonh/micro/lima_mixrat_to_nconc.f90 create mode 100644 src/mesonh/micro/lima_notadjust.f90 create mode 100644 src/mesonh/micro/lima_nucleation_procs.f90 create mode 100644 src/mesonh/micro/lima_phillips.f90 create mode 100644 src/mesonh/micro/lima_phillips_ifn_nucleation.f90 create mode 100644 src/mesonh/micro/lima_phillips_integ.f90 create mode 100644 src/mesonh/micro/lima_phillips_ref_spectrum.f90 create mode 100644 src/mesonh/micro/lima_precip_scavenging.f90 create mode 100644 src/mesonh/micro/lima_rain_accr_snow.f90 create mode 100644 src/mesonh/micro/lima_rain_evaporation.f90 create mode 100644 src/mesonh/micro/lima_rain_freezing.f90 create mode 100644 src/mesonh/micro/lima_read_xker_gweth.f90 create mode 100644 src/mesonh/micro/lima_read_xker_raccs.f90 create mode 100644 src/mesonh/micro/lima_read_xker_rdryg.f90 create mode 100644 src/mesonh/micro/lima_read_xker_sdryg.f90 create mode 100644 src/mesonh/micro/lima_read_xker_sweth.f90 create mode 100644 src/mesonh/micro/lima_sedimentation.f90 create mode 100644 src/mesonh/micro/lima_snow_deposition.f90 create mode 100644 src/mesonh/micro/lima_tendencies.f90 create mode 100644 src/mesonh/micro/lima_warm.f90 create mode 100644 src/mesonh/micro/lima_warm_coal.f90 create mode 100644 src/mesonh/micro/lima_warm_evap.f90 create mode 100644 src/mesonh/micro/lima_warm_nucl.f90 create mode 100644 src/mesonh/micro/lima_warm_sedimentation.f90 create mode 100644 src/mesonh/micro/modd_blankn.f90 create mode 100644 src/mesonh/micro/modd_conf.f90 create mode 100644 src/mesonh/micro/modd_cst.f90 create mode 100644 src/mesonh/micro/modd_dyn.f90 create mode 100644 src/mesonh/micro/modd_elec_descr.f90 create mode 100644 src/mesonh/micro/modd_les.f90 create mode 100644 src/mesonh/micro/modd_lima_precip_scavengingn.f90 create mode 100644 src/mesonh/micro/modd_lunit.f90 create mode 100644 src/mesonh/micro/modd_neb.f90 create mode 100644 src/mesonh/micro/modd_nsv.f90 create mode 100644 src/mesonh/micro/modd_param_c1r3.f90 create mode 100644 src/mesonh/micro/modd_param_c2r2.f90 create mode 100644 src/mesonh/micro/modd_param_ice.f90 create mode 100644 src/mesonh/micro/modd_param_lima.f90 create mode 100644 src/mesonh/micro/modd_param_lima_cold.f90 create mode 100644 src/mesonh/micro/modd_param_lima_mixed.f90 create mode 100644 src/mesonh/micro/modd_param_lima_warm.f90 create mode 100644 src/mesonh/micro/modd_parameters.f90 create mode 100644 src/mesonh/micro/modd_rain_c2r2_descr.f90 create mode 100644 src/mesonh/micro/modd_rain_c2r2_khko_param.f90 create mode 100644 src/mesonh/micro/modd_rain_ice_descr.f90 create mode 100644 src/mesonh/micro/modd_rain_ice_param.f90 create mode 100644 src/mesonh/micro/modn_param_lima.f90 create mode 100644 src/mesonh/micro/prognos_lima.f90 create mode 100644 src/mesonh/micro/radar_rain_ice.f90 create mode 100644 src/mesonh/micro/rain_c2r2_khko.f90 create mode 100644 src/mesonh/micro/rain_ice.f90 create mode 100644 src/mesonh/micro/rain_ice_elec.f90 create mode 100644 src/mesonh/micro/rain_ice_fast_rg.f90 create mode 100644 src/mesonh/micro/rain_ice_fast_rh.f90 create mode 100644 src/mesonh/micro/rain_ice_fast_ri.f90 create mode 100644 src/mesonh/micro/rain_ice_fast_rs.f90 create mode 100644 src/mesonh/micro/rain_ice_nucleation.f90 create mode 100644 src/mesonh/micro/rain_ice_red.f90 create mode 100644 src/mesonh/micro/rain_ice_sedimentation_split.f90 create mode 100644 src/mesonh/micro/rain_ice_sedimentation_stat.f90 create mode 100644 src/mesonh/micro/rain_ice_slow.f90 create mode 100644 src/mesonh/micro/rain_ice_warm.f90 create mode 100644 src/mesonh/micro/read_xker_gweth.f90 create mode 100644 src/mesonh/micro/read_xker_raccs.f90 create mode 100644 src/mesonh/micro/read_xker_rdryg.f90 create mode 100644 src/mesonh/micro/read_xker_rweth.f90 create mode 100644 src/mesonh/micro/read_xker_sdryg.f90 create mode 100644 src/mesonh/micro/read_xker_sweth.f90 create mode 100644 src/mesonh/micro/rrcolss.f90 create mode 100644 src/mesonh/micro/rscolrg.f90 create mode 100644 src/mesonh/micro/rzcolx.f90 create mode 100644 src/mesonh/micro/set_conc_lima.f90 create mode 100644 src/mesonh/turb/bl89.f90 create mode 100644 src/mesonh/turb/bl_depth_diag.f90 create mode 100644 src/mesonh/turb/compute_bl89_ml.f90 create mode 100644 src/mesonh/turb/compute_entr_detr.f90 create mode 100644 src/mesonh/turb/compute_frac_ice.f90 create mode 100644 src/mesonh/turb/compute_function_thermo_mf.f90 create mode 100644 src/mesonh/turb/compute_mf_cloud.f90 create mode 100644 src/mesonh/turb/compute_mf_cloud_bigaus.f90 create mode 100644 src/mesonh/turb/compute_mf_cloud_direct.f90 create mode 100644 src/mesonh/turb/compute_mf_cloud_stat.f90 create mode 100644 src/mesonh/turb/compute_updraft.f90 create mode 100644 src/mesonh/turb/compute_updraft_raha.f90 create mode 100644 src/mesonh/turb/compute_updraft_rhcj10.f90 create mode 100644 src/mesonh/turb/emoist.f90 create mode 100644 src/mesonh/turb/etheta.f90 create mode 100644 src/mesonh/turb/ini_cturb.f90 create mode 100644 src/mesonh/turb/mf_turb.f90 create mode 100644 src/mesonh/turb/mf_turb_expl.f90 create mode 100644 src/mesonh/turb/mf_turb_greyzone.f90 create mode 100644 src/mesonh/turb/modd_cturb.f90 create mode 100644 src/mesonh/turb/modd_diag_in_run.f90 create mode 100644 src/mesonh/turb/modd_turb_cloud.f90 create mode 100644 src/mesonh/turb/modd_turb_flux_aircraft_balloon.f90 create mode 100644 src/mesonh/turb/modd_turbn.f90 create mode 100644 src/mesonh/turb/mode_prandtl.f90 create mode 100644 src/mesonh/turb/mode_sbl.f90 create mode 100644 src/mesonh/turb/modn_turb.f90 create mode 100644 src/mesonh/turb/modn_turb_cloud.f90 create mode 100644 src/mesonh/turb/modn_turbn.f90 create mode 100644 src/mesonh/turb/prandtl.f90 create mode 100644 src/mesonh/turb/rmc01.f90 create mode 100644 src/mesonh/turb/sbl_depth.f90 create mode 100644 src/mesonh/turb/shallow_mf.f90 create mode 100644 src/mesonh/turb/shuman_mf.f90 create mode 100644 src/mesonh/turb/thl_rt_from_th_r_mf.f90 create mode 100644 src/mesonh/turb/tke_eps_sources.f90 create mode 100644 src/mesonh/turb/tm06.f90 create mode 100644 src/mesonh/turb/tm06_h.f90 create mode 100644 src/mesonh/turb/tridiag.f90 create mode 100644 src/mesonh/turb/tridiag_massflux.f90 create mode 100644 src/mesonh/turb/tridiag_thermo.f90 create mode 100644 src/mesonh/turb/tridiag_tke.f90 create mode 100644 src/mesonh/turb/tridiag_wind.f90 create mode 100644 src/mesonh/turb/turb.f90 create mode 100644 src/mesonh/turb/turb_cloud_index.f90 create mode 100644 src/mesonh/turb/turb_hor.f90 create mode 100644 src/mesonh/turb/turb_hor_dyn_corr.f90 create mode 100644 src/mesonh/turb/turb_hor_splt.f90 create mode 100644 src/mesonh/turb/turb_hor_sv_corr.f90 create mode 100644 src/mesonh/turb/turb_hor_sv_flux.f90 create mode 100644 src/mesonh/turb/turb_hor_thermo_corr.f90 create mode 100644 src/mesonh/turb/turb_hor_thermo_flux.f90 create mode 100644 src/mesonh/turb/turb_hor_tke.f90 create mode 100644 src/mesonh/turb/turb_hor_uv.f90 create mode 100644 src/mesonh/turb/turb_hor_uw.f90 create mode 100644 src/mesonh/turb/turb_hor_vw.f90 create mode 100644 src/mesonh/turb/turb_ver.f90 create mode 100644 src/mesonh/turb/turb_ver_dyn_flux.f90 create mode 100644 src/mesonh/turb/turb_ver_sv_corr.f90 create mode 100644 src/mesonh/turb/turb_ver_sv_flux.f90 create mode 100644 src/mesonh/turb/turb_ver_thermo_corr.f90 create mode 100644 src/mesonh/turb/turb_ver_thermo_flux.f90 diff --git a/src/mesonh/conv/convect_chem_transport.f90 b/src/mesonh/conv/convect_chem_transport.f90 new file mode 100644 index 000000000..c515f25b0 --- /dev/null +++ b/src/mesonh/conv/convect_chem_transport.f90 @@ -0,0 +1,295 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 conv 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ################# + MODULE MODI_CONVECT_CHEM_TRANSPORT +! ################# +! +INTERFACE +! + SUBROUTINE CONVECT_CHEM_TRANSPORT( KLON, KLEV, KCH, PCH1, PCH1C, & + KDPL, KPBL, KLCL, KCTL, KLFS, KDBL, & + PUMF, PUER, PUDR, PDMF, PDER, PDDR, & + PTIMEC, PDXDY, PMIXF, PLMASS, PWSUB,& + KFTSTEPS ) + +! +INTEGER, INTENT(IN) :: KLON ! horizontal dimension +INTEGER, INTENT(IN) :: KLEV ! vertical dimension +INTEGER, INTENT(IN) :: KCH ! number of passive tracers +! +REAL,DIMENSION(KLON,KLEV,KCH),INTENT(IN) :: PCH1 ! grid scale tracer concentr. +REAL,DIMENSION(KLON,KLEV,KCH),INTENT(OUT):: PCH1C! conv adjusted tracer concntr. +! +INTEGER, DIMENSION(KLON), INTENT(IN) :: KDPL ! index for departure level +INTEGER, DIMENSION(KLON), INTENT(IN) :: KPBL ! index for top of source layer +INTEGER, DIMENSION(KLON), INTENT(IN) :: KLCL ! index lifting condens. level +INTEGER, DIMENSION(KLON), INTENT(IN) :: KCTL ! index for cloud top level +INTEGER, DIMENSION(KLON), INTENT(IN) :: KLFS ! index for level of free sink +INTEGER, DIMENSION(KLON), INTENT(IN) :: KDBL ! index for downdraft base level +! +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PUMF ! updraft mass flux (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PUER ! updraft entrainment (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PUDR ! updraft detrainment (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PDMF ! downdraft mass flux (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PDER ! downdraft entrainment (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PDDR ! downdraft detrainment (kg/s) +! +REAL, DIMENSION(KLON), INTENT(IN) :: PTIMEC! convection time step +REAL, DIMENSION(KLON), INTENT(IN) :: PDXDY ! grid area (m^2) +REAL, DIMENSION(KLON), INTENT(IN) :: PMIXF ! mixed fraction at LFS +REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PLMASS! mass of model layer (kg) +REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PWSUB ! envir. compensating subsidence(Pa/s) +INTEGER, INTENT(IN) :: KFTSTEPS ! maximum fractional time steps +! +END SUBROUTINE CONVECT_CHEM_TRANSPORT +! +END INTERFACE +! +END MODULE MODI_CONVECT_CHEM_TRANSPORT +! ######################################################################## + SUBROUTINE CONVECT_CHEM_TRANSPORT( KLON, KLEV, KCH, PCH1, PCH1C, & + KDPL, KPBL, KLCL, KCTL, KLFS, KDBL, & + PUMF, PUER, PUDR, PDMF, PDER, PDDR, & + PTIMEC, PDXDY, PMIXF, PLMASS, PWSUB,& + KFTSTEPS ) +! ######################################################################## +! +!!**** Compute modified chemical tracer values due to convective event +!! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to determine the final adjusted +!! environmental values of the chemical tracers +!! The final convective tendencies can then be evaluated in the main +!! routine DEEP_CONVECT by (PCH1C-PCH1)/PTIMEC +!! +!! +!!** METHOD +!! ------ +!! Identical to the computation of the conservative variables in the +!! main deep convection code +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST +!! XG ! gravity constant +!! +!! Module MODD_CONVPAREXT +!! JCVEXB, JCVEXT ! extra levels on the vertical boundaries +!! +!! AUTHOR +!! ------ +!! P. BECHTOLD * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! +!! Original 11/12/97 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_CONVPAREXT +USE MODD_NSV, ONLY : NSV_LGBEG,NSV_LGEND +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +INTEGER, INTENT(IN) :: KLON ! horizontal dimension +INTEGER, INTENT(IN) :: KLEV ! vertical dimension +INTEGER, INTENT(IN) :: KCH ! number of passive tracers +! +REAL,DIMENSION(KLON,KLEV,KCH),INTENT(IN) :: PCH1 ! grid scale tracer concentr. +REAL,DIMENSION(KLON,KLEV,KCH),INTENT(OUT):: PCH1C! conv adjusted tracer concntr. +! +INTEGER, DIMENSION(KLON), INTENT(IN) :: KDPL ! index for departure level +INTEGER, DIMENSION(KLON), INTENT(IN) :: KPBL ! index for top of source layer +INTEGER, DIMENSION(KLON), INTENT(IN) :: KLCL ! index lifting condens. level +INTEGER, DIMENSION(KLON), INTENT(IN) :: KCTL ! index for cloud top level +INTEGER, DIMENSION(KLON), INTENT(IN) :: KLFS ! index for level of free sink +INTEGER, DIMENSION(KLON), INTENT(IN) :: KDBL ! index for downdraft base level +! +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PUMF ! updraft mass flux (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PUER ! updraft entrainment (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PUDR ! updraft detrainment (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PDMF ! downdraft mass flux (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PDER ! downdraft entrainment (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PDDR ! downdraft detrainment (kg/s) +! +REAL, DIMENSION(KLON), INTENT(IN) :: PTIMEC! convection time step +REAL, DIMENSION(KLON), INTENT(IN) :: PDXDY ! grid area (m^2) +REAL, DIMENSION(KLON), INTENT(IN) :: PMIXF ! mixed fraction at LFS +REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PLMASS! mass of model layer (kg) +REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PWSUB ! envir. compensating subsidence(Pa/s) +INTEGER, INTENT(IN) :: KFTSTEPS ! maximum fractional time steps +! +! +!* 0.2 Declarations of local variables : +! +INTEGER :: INCH1 ! number of chemical tracers +INTEGER :: IIE, IKB, IKE ! horizontal + vertical loop bounds +INTEGER :: IKS ! vertical dimension +INTEGER :: JI ! horizontal loop index +INTEGER :: JK, JKP ! vertical loop index +INTEGER :: JN ! chemical tracer loop index +INTEGER :: JSTEP ! fractional time loop index +INTEGER :: JKLD, JKLP, JKMAX ! loop index for levels +! +REAL, DIMENSION(KLON,KLEV) :: ZOMG ! compensat. subsidence (Pa/s) +REAL, DIMENSION(KLON,KLEV,KCH) :: ZUCH1, ZDCH1 ! updraft/downdraft values +REAL, DIMENSION(KLON) :: ZTIMEC ! fractional convective time step +REAL, DIMENSION(KLON,KLEV) :: ZTIMC! 2D work array for ZTIMEC +REAL, DIMENSION(KLON,KLEV,KCH) :: ZCH1MFIN, ZCH1MFOUT + ! work arrays for environm. compensat. mass +REAL, DIMENSION(KLON,KCH) :: ZWORK1, ZWORK2, ZWORK3 +! +!------------------------------------------------------------------------------- +! +!* 0.3 Compute loop bounds +! ------------------- +! +INCH1 = KCH +IIE = KLON +IKB = 1 + JCVEXB +IKS = KLEV +IKE = KLEV - JCVEXT +JKMAX = MAXVAL( KCTL(:) ) +! +! +!* 2. Updraft computations +! -------------------- +! +ZUCH1(:,:,:) = 0. +! +!* 2.1 Initialization at LCL +! ---------------------------------- +! +DO JI = 1, IIE + JKLD = KDPL(JI) + JKLP = KPBL(JI) + ZWORK1(JI,:) = .5 * ( PCH1(JI,JKLD,:) + PCH1(JI,JKLP,:) ) +END DO +! +!* 2.2 Final updraft loop +! ------------------ +! +DO JK = MINVAL( KDPL(:) ), JKMAX +JKP = JK + 1 +! + DO JN = 1, INCH1 + DO JI = 1, IIE + IF ( KDPL(JI) <= JK .AND. KLCL(JI) > JK ) & + ZUCH1(JI,JK,JN) = ZWORK1(JI,JN) +! + IF ( KLCL(JI) - 1 <= JK .AND. KCTL(JI) > JK ) THEN + ZUCH1(JI,JKP,JN) = ZUCH1(JI,JK,JN) + !if you have reactive i.e. non-passive tracers + ! update their values here and add the corresponding + ! sink term in the following equation + ZUCH1(JI,JKP,JN) = ( PUMF(JI,JK) * ZUCH1(JI,JK,JN) + & + PUER(JI,JKP) * PCH1(JI,JK,JN) ) / & + ( PUMF(JI,JKP) + PUDR(JI,JKP) + 1.E-7 ) + END IF + END DO + END DO +! +END DO +! +!* 3. Downdraft computations +! ---------------------- +! +ZDCH1(:,:,:) = 0. +! +!* 3.1 Initialization at the LFS +! ------------------------- +! +ZWORK1(:,:) = SPREAD( PMIXF(:), DIM=2, NCOPIES=INCH1 ) +DO JI = 1, IIE + JK = KLFS(JI) + ZDCH1(JI,JK,:) = ZWORK1(JI,:) * PCH1(JI,JK,:) + & + ( 1. - ZWORK1(JI,:) ) * ZUCH1(JI,JK,:) +END DO +! +!* 3.2 Final downdraft loop +! -------------------- +! +DO JK = MAXVAL( KLFS(:) ), IKB + 1, -1 +JKP = JK - 1 + DO JN = 1, INCH1 + DO JI = 1, IIE + IF ( JK <= KLFS(JI) .AND. JKP >= KDBL(JI) ) THEN + ZDCH1(JI,JKP,JN) = ( ZDCH1(JI,JK,JN) * PDMF(JI,JK) - & + PCH1(JI,JK,JN) * PDER(JI,JKP) ) / & + ( PDMF(JI,JKP) - PDDR(JI,JKP) - 1.E-7 ) + END IF + END DO + END DO +END DO +! +! +!* 4. Final closure (environmental) computations +! ------------------------------------------ +! +PCH1C(:,IKB:IKE,:) = PCH1(:,IKB:IKE,:) ! initialize adjusted envir. values +! +DO JK = IKB, IKE + ZOMG(:,JK) = PWSUB(:,JK) * PDXDY(:) / XG ! environmental subsidence +END DO +! +ZTIMEC(:) = PTIMEC(:) / REAL( KFTSTEPS ) ! adjust fractional time step + ! to be an integer multiple of PTIMEC +WHERE ( PTIMEC(:) < 1. ) ZTIMEC(:) = 0. +ZTIMC(:,:)= SPREAD( ZTIMEC(:), DIM=2, NCOPIES=IKS ) +! +ZCH1MFIN(:,:,:) = 0. +ZCH1MFOUT(:,:,:) = 0. +! +DO JSTEP = 1, KFTSTEPS ! Enter the fractional time step loop +! + DO JK = IKB + 1, JKMAX + JKP = MAX( IKB + 1, JK - 1 ) + ZWORK3(:,:) = SPREAD( ZOMG(:,JK), DIM=2, NCOPIES=INCH1 ) + ZWORK1(:,:) = SIGN( 1., ZWORK3(:,:) ) + ZWORK2(:,:) = 0.5 * ( 1. + ZWORK1(:,:) ) + ZWORK1(:,:) = 0.5 * ( 1. - ZWORK1(:,:) ) + ZCH1MFIN(:,JK,:) = - ZWORK3(:,:) * PCH1C(:,JKP,:) * ZWORK1(:,:) + ZCH1MFOUT(:,JK,:) = ZWORK3(:,:) * PCH1C(:,JK,:) * ZWORK2(:,:) + ZCH1MFIN(:,JKP,:) = ZCH1MFIN(:,JKP,:) + ZCH1MFOUT(:,JK,:) * ZWORK2(:,:) + ZCH1MFOUT(:,JKP,:)= ZCH1MFOUT(:,JKP,:) + ZCH1MFIN(:,JK,:) * ZWORK1(:,:) + END DO +! + DO JN = 1, INCH1 + DO JK = IKB + 1, JKMAX + PCH1C(:,JK,JN) = PCH1C(:,JK,JN) + ZTIMC(:,JK) / PLMASS(:,JK) * ( & + ZCH1MFIN(:,JK,JN) + PUDR(:,JK) * ZUCH1(:,JK,JN) + & + PDDR(:,JK) * ZDCH1(:,JK,JN) - ZCH1MFOUT(:,JK,JN) - & + ( PUER(:,JK) + PDER(:,JK) ) * PCH1(:,JK,JN) ) + IF(JN < NSV_LGBEG .OR. JN>NSV_LGEND-1) THEN + PCH1C(:,JK,JN) = MAX( 0., PCH1C(:,JK,JN) ) + ELSE + ! no tendency for horizontal Lagrangian variables + PCH1C(:,JK,JN) = PCH1(:,JK,JN) + END IF + END DO + END DO +! +END DO ! Exit the fractional time step loop +! +! +END SUBROUTINE CONVECT_CHEM_TRANSPORT diff --git a/src/mesonh/conv/convect_closure.f90 b/src/mesonh/conv/convect_closure.f90 new file mode 100644 index 000000000..f94e9bf86 --- /dev/null +++ b/src/mesonh/conv/convect_closure.f90 @@ -0,0 +1,755 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 conv 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ################# + MODULE MODI_CONVECT_CLOSURE +! ################# +! +INTERFACE +! + SUBROUTINE CONVECT_CLOSURE( KLON, KLEV, & + PPRES, PDPRES, PZ, PDXDY, PLMASS, & + PTHL, PTH, PRW, PRC, PRI, OTRIG1, & + PTHC, PRWC, PRCC, PRIC, PWSUB, & + KLCL, KDPL, KPBL, KLFS, KCTL, KML, & + PUMF, PUER, PUDR, PUTHL, PURW, & + PURC, PURI, PUPR, & + PDMF, PDER, PDDR, PDTHL, PDRW, & + PTPR, PSPR, PDTEVR, & + PCAPE, PTIMEC, & + KFTSTEPS, & + PDTEVRF, PPRLFLX, PPRSFLX ) +! +INTEGER, INTENT(IN) :: KLON ! horizontal dimension +INTEGER, INTENT(IN) :: KLEV ! vertical dimension +INTEGER, DIMENSION(KLON), INTENT(IN) :: KLFS ! index for level of free sink +INTEGER, DIMENSION(KLON), INTENT(IN) :: KLCL ! index lifting condens. level +INTEGER, DIMENSION(KLON), INTENT(IN) :: KCTL ! index for cloud top level +INTEGER, DIMENSION(KLON), INTENT(IN) :: KDPL ! index for departure level +INTEGER, DIMENSION(KLON), INTENT(IN) :: KPBL ! index for top of source layer +INTEGER, DIMENSION(KLON), INTENT(IN) :: KML ! index for melting level +REAL, DIMENSION(KLON), INTENT(INOUT) :: PTIMEC ! convection time step +REAL, DIMENSION(KLON), INTENT(IN) :: PDXDY ! grid area (m^2) +REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PTHL ! grid scale enthalpy (J/kg) +REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PTH ! grid scale theta +REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PRW ! grid scale total water + ! mixing ratio +REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PRC ! grid scale r_c +REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PRI ! grid scale r_i +LOGICAL, DIMENSION(KLON), INTENT(IN) :: OTRIG1 ! logical to keep trace of + ! convective arrays modified in UPDRAFT +! +! +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PPRES ! pressure (P) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PDPRES ! pressure difference between + ! bottom and top of layer (Pa) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PLMASS ! mass of model layer (kg) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PZ ! height of model layer (m) +REAL, DIMENSION(KLON), INTENT(IN) :: PCAPE ! available potent. energy +INTEGER, INTENT(OUT) :: KFTSTEPS! maximum of fract time steps + ! only used for chemical tracers +! +! +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PUMF ! updraft mass flux (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PUER ! updraft entrainment (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PUDR ! updraft detrainment (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PUPR ! updraft precipitation in + ! flux units (kg water / s) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PUTHL ! updraft enthalpy (J/kg) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PURW ! updraft total water (kg/kg) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PURC ! updraft cloud water (kg/kg) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PURI ! updraft cloud ice (kg/kg) +! +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PDMF ! downdraft mass flux (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PDER ! downdraft entrainment (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PDDR ! downdraft detrainment (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PDTHL ! downdraft enthalpy (J/kg) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PDRW ! downdraft total water (kg/kg) +REAL, DIMENSION(KLON), INTENT(INOUT):: PTPR ! total surf precipitation (kg/s) +REAL, DIMENSION(KLON), INTENT(OUT) :: PSPR ! solid surf precipitation (kg/s) +REAL, DIMENSION(KLON), INTENT(INOUT):: PDTEVR! donwndraft evapor. (kg/s) +! +REAL, DIMENSION(KLON,KLEV), INTENT(OUT) :: PTHC ! conv. adj. grid scale theta +REAL, DIMENSION(KLON,KLEV), INTENT(OUT) :: PRWC ! conv. adj. grid scale r_w +REAL, DIMENSION(KLON,KLEV), INTENT(OUT) :: PRCC ! conv. adj. grid scale r_c +REAL, DIMENSION(KLON,KLEV), INTENT(OUT) :: PRIC ! conv. adj. grid scale r_i +REAL, DIMENSION(KLON,KLEV), INTENT(OUT) :: PWSUB ! envir. compensating subsidence(Pa/s) +! +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PDTEVRF! downdraft evaporation rate +REAL, DIMENSION(KLON,KLEV), INTENT(OUT) :: PPRLFLX! liquid precip flux +REAL, DIMENSION(KLON,KLEV), INTENT(OUT) :: PPRSFLX! solid precip flux +! +END SUBROUTINE CONVECT_CLOSURE +! +END INTERFACE +! +END MODULE MODI_CONVECT_CLOSURE +! ######################################################################### + SUBROUTINE CONVECT_CLOSURE( KLON, KLEV, & + PPRES, PDPRES, PZ, PDXDY, PLMASS, & + PTHL, PTH, PRW, PRC, PRI, OTRIG1, & + PTHC, PRWC, PRCC, PRIC, PWSUB, & + KLCL, KDPL, KPBL, KLFS, KCTL, KML, & + PUMF, PUER, PUDR, PUTHL, PURW, & + PURC, PURI, PUPR, & + PDMF, PDER, PDDR, PDTHL, PDRW, & + PTPR, PSPR, PDTEVR, & + PCAPE, PTIMEC, & + KFTSTEPS, & + PDTEVRF, PPRLFLX, PPRSFLX ) +! ######################################################################### +! +!!**** Uses modified Fritsch-Chappell closure +!! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to determine the final adjusted +!! (over a time step PTIMEC) environmental values of THETA_l, R_w, R_c, R_i +!! The final convective tendencies can then be evaluated in the main +!! routine DEEP_CONVECT by (PTHC-PTH)/PTIMEC +!! +!! +!!** METHOD +!! ------ +!! Computations are done at every model level starting from bottom. +!! The use of masks allows to optimise the inner loops (horizontal loops). +!! +!! +!! +!! EXTERNAL +!! -------- +!! +!! CONVECT_CLOSURE_THRVLCL +!! CONVECT_CLOSURE_ADJUST +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST +!! XG ! gravity constant +!! XP00 ! reference pressure +!! XRD, XRV ! gaz constants for dry air and water vapor +!! XCPD, XCPV ! specific heat for dry air and water vapor +!! XCL, XCI ! specific heat for liquid water and ice +!! XTT ! triple point temperature +!! XLVTT, XLSTT ! vaporization, sublimation heat constant +!! +!! Module MODD_CONVPAR +!! XA25 ! reference grid area +!! XSTABT ! stability factor in time integration +!! XSTABC ! stability factor in CAPE adjustment +!! XMELDPTH ! allow melting over specific pressure depth +!! +!! Module MODD_CONVPAREXT +!! JCVEXB, JCVEXT ! extra levels on the vertical boundaries +!! +!! +!! REFERENCE +!! --------- +!! +!! Book1,2 of documentation ( routine CONVECT_CLOSURE) +!! Fritsch and Chappell, 1980, J. Atmos. Sci. +!! Kain and Fritsch, 1993, Meteor. Monographs, Vol. +!! +!! AUTHOR +!! ------ +!! P. BECHTOLD * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original 26/03/96 +!! Peter Bechtold 04/10/97 change for enthalpie, r_c + r_i tendencies +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_CONVPAR +USE MODD_CONVPAREXT +! +USE MODI_CONVECT_SATMIXRATIO +USE MODI_CONVECT_CLOSURE_THRVLCL +USE MODI_CONVECT_CLOSURE_ADJUST +! +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +INTEGER, INTENT(IN) :: KLON ! horizontal dimension +INTEGER, INTENT(IN) :: KLEV ! vertical dimension +INTEGER, DIMENSION(KLON), INTENT(IN) :: KLFS ! index for level of free sink +INTEGER, DIMENSION(KLON), INTENT(IN) :: KLCL ! index lifting condens. level +INTEGER, DIMENSION(KLON), INTENT(IN) :: KCTL ! index for cloud top level +INTEGER, DIMENSION(KLON), INTENT(IN) :: KDPL ! index for departure level +INTEGER, DIMENSION(KLON), INTENT(IN) :: KPBL ! index for top of source layer +INTEGER, DIMENSION(KLON), INTENT(IN) :: KML ! index for melting level +REAL, DIMENSION(KLON), INTENT(INOUT) :: PTIMEC ! convection time step +REAL, DIMENSION(KLON), INTENT(IN) :: PDXDY ! grid area (m^2) +REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PTHL ! grid scale enthalpy (J/kg) +REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PTH ! grid scale theta +REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PRW ! grid scale total water + ! mixing ratio +REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PRC ! grid scale r_c +REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PRI ! grid scale r_i +LOGICAL, DIMENSION(KLON), INTENT(IN) :: OTRIG1 ! logical to keep trace of + ! convective arrays modified in UPDRAFT +! +! +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PPRES ! pressure (P) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PDPRES ! pressure difference between + ! bottom and top of layer (Pa) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PLMASS ! mass of model layer (kg) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PZ ! height of model layer (m) +REAL, DIMENSION(KLON), INTENT(IN) :: PCAPE ! available potent. energy +INTEGER, INTENT(OUT) :: KFTSTEPS! maximum of fract time steps + ! only used for chemical tracers +! +! +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PUMF ! updraft mass flux (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PUER ! updraft entrainment (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PUDR ! updraft detrainment (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PUPR ! updraft precipitation in + ! flux units (kg water / s) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PUTHL ! updraft enthalpy (J/kg) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PURW ! updraft total water (kg/kg) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PURC ! updraft cloud water (kg/kg) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PURI ! updraft cloud ice (kg/kg) +! +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PDMF ! downdraft mass flux (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PDER ! downdraft entrainment (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PDDR ! downdraft detrainment (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PDTHL ! downdraft enthalpy (J/kg) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PDRW ! downdraft total water (kg/kg) +REAL, DIMENSION(KLON), INTENT(INOUT):: PTPR ! total surf precipitation (kg/s) +REAL, DIMENSION(KLON), INTENT(OUT) :: PSPR ! solid surf precipitation (kg/s) +REAL, DIMENSION(KLON), INTENT(INOUT):: PDTEVR! donwndraft evapor. (kg/s) +! +REAL, DIMENSION(KLON,KLEV), INTENT(OUT) :: PTHC ! conv. adj. grid scale theta +REAL, DIMENSION(KLON,KLEV), INTENT(OUT) :: PRWC ! conv. adj. grid scale r_w +REAL, DIMENSION(KLON,KLEV), INTENT(OUT) :: PRCC ! conv. adj. grid scale r_c +REAL, DIMENSION(KLON,KLEV), INTENT(OUT) :: PRIC ! conv. adj. grid scale r_i +REAL, DIMENSION(KLON,KLEV), INTENT(OUT) :: PWSUB ! envir. compensating subsidence(Pa/s) +! +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PDTEVRF! downdraft evaporation rate +REAL, DIMENSION(KLON,KLEV), INTENT(OUT) :: PPRLFLX! liquid precip flux +REAL, DIMENSION(KLON,KLEV), INTENT(OUT) :: PPRSFLX! solid precip flux +! +!* 0.2 Declarations of local variables : +! +INTEGER :: IIE, IKB, IKE ! horizontal + vertical loop bounds +INTEGER :: IKS ! vertical dimension +INTEGER :: JK, JKP, JKMAX ! vertical loop index +INTEGER :: JI ! horizontal loop index +INTEGER :: JITER ! iteration loop index +INTEGER :: JSTEP ! fractional time loop index +REAL :: ZCPORD, ZRDOCP ! C_pd / R_d, R_d / C_pd +! +REAL, DIMENSION(KLON,KLEV) :: ZTHLC ! convectively adjusted + ! grid scale enthalpy +REAL, DIMENSION(KLON,KLEV) :: ZOMG ! conv. environm. subsidence (Pa/s) +REAL, DIMENSION(KLON,KLEV) :: ZUMF ! non-adjusted updraft mass flux +REAL, DIMENSION(KLON,KLEV) :: ZUER ! " updraft entrainm. rate +REAL, DIMENSION(KLON,KLEV) :: ZUDR ! " updraft detrainm. rate +REAL, DIMENSION(KLON,KLEV) :: ZDMF ! " downdraft mass flux +REAL, DIMENSION(KLON,KLEV) :: ZDER ! " downdraft entrainm. rate +REAL, DIMENSION(KLON,KLEV) :: ZDDR ! " downdraft detrainm. rate +REAL, DIMENSION(KLON) :: ZTPR ! " total precipitation +REAL, DIMENSION(KLON) :: ZDTEVR ! " total downdraft evapor. +REAL, DIMENSION(KLON,KLEV):: ZPRLFLX ! " liquid precip flux +REAL, DIMENSION(KLON,KLEV):: ZPRSFLX ! " solid precip flux +REAL, DIMENSION(KLON) :: ZPRMELT ! melting of precipitation +REAL, DIMENSION(KLON) :: ZPRMELTO ! non-adjusted " +REAL, DIMENSION(KLON) :: ZADJ ! mass adjustment factor +REAL, DIMENSION(KLON) :: ZADJMAX ! limit value for ZADJ +REAL, DIMENSION(KLON) :: ZCAPE ! new CAPE after adjustment +REAL, DIMENSION(KLON) :: ZTIMEC ! fractional convective time step +REAL, DIMENSION(KLON,KLEV):: ZTIMC ! 2D work array for ZTIMEC +! +REAL, DIMENSION(KLON) :: ZTHLCL ! new theta at LCL +REAL, DIMENSION(KLON) :: ZRVLCL ! new r_v at LCL +REAL, DIMENSION(KLON) :: ZZLCL ! height of LCL +REAL, DIMENSION(KLON) :: ZTLCL ! temperature at LCL +REAL, DIMENSION(KLON) :: ZTELCL ! envir. temper. at LCL +REAL, DIMENSION(KLON) :: ZTHEUL ! theta_e for undilute ascent +REAL, DIMENSION(KLON) :: ZTHES1, ZTHES2! saturation environm. theta_e +REAL, DIMENSION(KLON,KLEV) :: ZTHMFIN, ZTHMFOUT, ZRWMFIN, ZRWMFOUT +REAL, DIMENSION(KLON,KLEV) :: ZRCMFIN, ZRCMFOUT, ZRIMFIN, ZRIMFOUT + ! work arrays for environm. compensat. mass flux +REAL, DIMENSION(KLON) :: ZPI ! (P/P00)**R_d/C_pd +REAL, DIMENSION(KLON) :: ZLV ! latent heat of vaporisation +REAL, DIMENSION(KLON) :: ZLS ! latent heat of sublimation +REAL, DIMENSION(KLON) :: ZLM ! latent heat of melting +REAL, DIMENSION(KLON) :: ZCPH ! specific heat C_ph +REAL, DIMENSION(KLON) :: ZMELDPTH ! actual depth of melting layer +INTEGER, DIMENSION(KLON) :: ITSTEP ! fractional convective time step +INTEGER, DIMENSION(KLON) :: ICOUNT ! timestep counter +INTEGER, DIMENSION(KLON) :: ILCL ! index lifting condens. level +INTEGER, DIMENSION(KLON) :: IWORK1 ! work array +REAL, DIMENSION(KLON) :: ZWORK1, ZWORK2, ZWORK3, ZWORK4, ZWORK5 +REAL, DIMENSION(KLON,KLEV):: ZWORK6 +LOGICAL, DIMENSION(KLON) :: GWORK1, GWORK3! work arrays +LOGICAL, DIMENSION(KLON,KLEV) :: GWORK4 ! work array +! +! +!------------------------------------------------------------------------------- +! +!* 0.2 Initialize local variables +! ---------------------------- +! +! +PSPR(:) = 0. +ZTIMC(:,:) = 0. +ZTHES2(:) = 0. +ZWORK1(:) = 0. +ZWORK2(:) = 0. +ZWORK3(:) = 0. +ZWORK4(:) = 0. +ZWORK5(:) = 0. +GWORK1(:) = .FALSE. +GWORK3(:) = .FALSE. +GWORK4(:,:) = .FALSE. +ILCL(:) = KLCL(:) +! +ZCPORD = XCPD / XRD +ZRDOCP = XRD / XCPD +! +ZADJ(:) = 1. +ZWORK5(:) = 1. +WHERE( .NOT. OTRIG1(:) ) ZWORK5(:) = 0. +! +! +!* 0.3 Compute loop bounds +! ------------------- +! +IIE = KLON +IKB = 1 + JCVEXB +IKS = KLEV +IKE = KLEV - JCVEXT +JKMAX = MAXVAL( KCTL(:) ) +! +! +!* 2. Save initial mass flux values to be used in adjustment procedure +! --------------------------------------------------------------- +! +ZUMF(:,:) = PUMF(:,:) +ZUER(:,:) = PUER(:,:) +ZUDR(:,:) = PUDR(:,:) +ZDMF(:,:) = PDMF(:,:) +ZDER(:,:) = PDER(:,:) +ZDDR(:,:) = PDDR(:,:) +ZTPR(:) = PTPR(:) +ZDTEVR(:) = PDTEVR(:) +ZOMG(:,:) = 0. +PWSUB(:,:) = 0. +ZPRMELT(:) = 0. +PPRLFLX(:,:) = 0. +ZPRLFLX(:,:) = 0. +PPRSFLX(:,:) = 0. +ZPRSFLX(:,:) = 0. +! +! +!* 2.1 Some preliminar computations for melting of precipitation +! used later in section 9 and computation of precip fluxes +! Precipitation fluxes are updated for melting and evaporation +! --------------------------------------------------------- +! +! +ZWORK1(:) = 0. +ZMELDPTH(:) = 0. +ZWORK6(:,:) = 0. +DO JK = JKMAX + 1, IKB + 1, -1 + ! Nota: PUPR is total precipitation flux, but the solid, liquid + ! precipitation is stored in units kg/kg; therefore we compute here + ! the solid fraction of the total precipitation flux. + DO JI = 1, IIE + ZWORK2(JI) = PUPR(JI,JK) / ( PURC(JI,JK) + PURI(JI,JK) + 1.E-8 ) + ZPRMELT(JI) = ZPRMELT(JI) + PURI(JI,JK) * ZWORK2(JI) + ZWORK1(JI) = ZWORK1(JI) + PURC(JI,JK) * ZWORK2(JI) - PDTEVRF(JI,JK) + ZPRLFLX(JI,JK)= MAX( 0., ZWORK1(JI) ) + ZPRMELT(JI) = ZPRMELT(JI) + MIN( 0., ZWORK1(JI) ) + ZPRSFLX(JI,JK)= ZPRMELT(JI) + IF ( KML(JI) >= JK .AND. ZMELDPTH(JI) <= XMELDPTH ) THEN + ZPI(JI) = ( PPRES(JI,JK) / XP00 ) ** ZRDOCP + ZWORK3(JI) = PTH(JI,JK) * ZPI(JI) ! temperature estimate + ZLM(JI) = XLSTT + ( XCPV - XCI ) * ( ZWORK3(JI) - XTT ) - & + ( XLVTT + ( XCPV - XCL ) * ( ZWORK3(JI) - XTT ) ) ! L_s - L_v + ZCPH(JI) = XCPD + XCPV * PRW(JI,JK) + ZMELDPTH(JI) = ZMELDPTH(JI) + PDPRES(JI,JK) + ZWORK6(JI,JK)= ZLM(JI) * PTIMEC(JI) / PLMASS(JI,JK) * PDPRES(JI,JK) + ZOMG(JI,JK)= 1. ! at this place only used as work variable + END IF + END DO +! +END DO +! +ZWORK2(:) = 0. +DO JK = JKMAX, IKB + 1, -1 + ZWORK1(:) = ZPRMELT(:) * PDPRES(:,JK) / MAX( XMELDPTH, ZMELDPTH(:) ) + ZWORK2(:) = ZWORK2(:) + ZWORK1(:) * ZOMG(:,JK) + ZPRLFLX(:,JK) = ZPRLFLX(:,JK) + ZWORK2(:) + ZPRSFLX(:,JK) = ZPRSFLX(:,JK) - ZWORK2(:) +END DO +WHERE( ZPRSFLX(:,:) < 1. ) ZPRSFLX(:,:)=0. +ZPRMELTO(:) = ZPRMELT(:) +! +! +!* 3. Compute limits on the closure adjustment factor so that the +! inflow in convective drafts from a given layer can't be larger +! than the mass contained in this layer initially. +! --------------------------------------------------------------- +! +ZADJMAX(:) = 1000. +IWORK1(:) = MAX( ILCL(:), KLFS(:) ) +JKP = MINVAL( KDPL(:) ) +DO JK = JKP, IKE + DO JI = 1, IIE + IF( JK > KDPL(JI) .AND. JK <= IWORK1(JI) ) THEN + ZWORK1(JI) = PLMASS(JI,JK) / & + ( ( PUER(JI,JK) + PDER(JI,JK) + 1.E-5 ) * PTIMEC(JI) ) + ZADJMAX(JI) = MIN( ZADJMAX(JI), ZWORK1(JI) ) + END IF + END DO +END DO +! +! +GWORK1(:) = OTRIG1(:) ! logical array to limit adjustment to not definitively + ! adjusted columns +! +DO JK = IKB, IKE + ZTHLC(:,JK) = PTHL(:,JK) ! initialize adjusted envir. values + PRWC(:,JK) = PRW(:,JK) + PRCC(:,JK) = PRC(:,JK) + PRIC(:,JK) = PRI(:,JK) + PTHC(:,JK) = PTH(:,JK) +END DO +! +! +! +DO JITER = 1, 6 ! Enter adjustment loop to assure that all CAPE is + ! removed within the advective time interval TIMEC +! + ZTIMEC(:) = PTIMEC(:) + GWORK4(:,:) = SPREAD( GWORK1(:), DIM=2, NCOPIES=IKS ) + WHERE( GWORK4(:,:) ) PWSUB(:,:) = 0. + ZOMG(:,:)=0. +! + DO JK = IKB + 1, JKMAX + JKP = MAX( IKB + 1, JK - 1 ) + WHERE ( GWORK1(:) .AND. JK <= KCTL(:) ) +! +! +!* 4. Determine vertical velocity at top and bottom of each layer +! to satisfy mass continuity. +! --------------------------------------------------------------- + ! we compute here Domega/Dp = - g rho Dw/Dz = 1/Dt +! + ZWORK1(:) = - ( PUER(:,JKP) + PDER(:,JKP) - & + PUDR(:,JKP) - PDDR(:,JKP) ) / PLMASS(:,JKP) +! + PWSUB(:,JK) = PWSUB(:,JKP) - PDPRES(:,JK-1) * ZWORK1(:) + ! we use PDPRES(JK-1) and not JKP in order to have zero subsidence + ! at the first layer +! +! +!* 5. Compute fractional time step. For stability or +! mass conservation reasons one must split full time step PTIMEC) +! --------------------------------------------------------------- +! + ZWORK1(:) = XSTABT * PDPRES(:,JKP) / ( ABS( PWSUB(:,JK) ) + 1.E-10 ) + ! the factor XSTABT is used for stability reasons + ZTIMEC(:) = MIN( ZTIMEC(:), ZWORK1(:) ) +! + ! transform vertical velocity in mass flux units + ZOMG(:,JK) = PWSUB(:,JK) * PDXDY(:) / XG + END WHERE + END DO +! +! + WHERE( GWORK4(:,:) ) + ZTHLC(:,:) = PTHL(:,:) ! reinitialize adjusted envir. values + PRWC(:,:) = PRW(:,:) ! when iteration criterium not attained + PRCC(:,:) = PRC(:,:) + PRIC(:,:) = PRI(:,:) + PTHC(:,:) = PTH(:,:) + END WHERE +! +! +! 6. Check for mass conservation, i.e. ZWORK1 > 1.E-2 +! If mass is not conserved, the convective tendencies +! automatically become zero. +! ---------------------------------------------------- +! + DO JI = 1, IIE + JK=KCTL(JI) + ZWORK1(JI) = PUDR(JI,JK) * PDPRES(JI,JK) / ( PLMASS(JI,JK) + .1 ) & + - PWSUB(JI,JK) + END DO + WHERE( GWORK1(:) .AND. ABS( ZWORK1(:) ) - .01 > 0. ) + GWORK1(:) = .FALSE. + PTIMEC(:) = 1.E-1 + ZTPR(:) = 0. + ZWORK5(:) = 0. + END WHERE + DO JK = IKB, IKE + PWSUB(:,JK) = PWSUB(:,JK) * ZWORK5(:) + ZPRLFLX(:,JK) = ZPRLFLX(:,JK) * ZWORK5(:) + ZPRSFLX(:,JK) = ZPRSFLX(:,JK) * ZWORK5(:) + END DO + GWORK4(:,1:IKB) = .FALSE. + GWORK4(:,IKE:IKS) = .FALSE. +! + ITSTEP(:) = INT( PTIMEC(:) / ZTIMEC(:) ) + 1 + ZTIMEC(:) = PTIMEC(:) / REAL( ITSTEP(:) ) ! adjust fractional time step + ! to be an integer multiple of PTIMEC + ZTIMC(:,:)= SPREAD( ZTIMEC(:), DIM=2, NCOPIES=IKS ) + ICOUNT(:) = 0 +! +! +! + KFTSTEPS = MAXVAL( ITSTEP(:) ) + DO JSTEP = 1, KFTSTEPS ! Enter the fractional time step loop here +! + ICOUNT(:) = ICOUNT(:) + 1 +! + GWORK3(:) = ITSTEP(:) >= ICOUNT(:) .AND. GWORK1(:) +! +! +!* 7. Assign enthalpy and r_w values at the top and bottom of each +! layer based on the sign of w +! ------------------------------------------------------------ +! + ZTHMFIN(:,:) = 0. + ZRWMFIN(:,:) = 0. + ZRCMFIN(:,:) = 0. + ZRIMFIN(:,:) = 0. + ZTHMFOUT(:,:) = 0. + ZRWMFOUT(:,:) = 0. + ZRCMFOUT(:,:) = 0. + ZRIMFOUT(:,:) = 0. +! + DO JK = IKB + 1, JKMAX + DO JI = 1, IIE + GWORK4(JI,JK) = GWORK3(JI) .AND. JK <= KCTL(JI) + END DO + JKP = MAX( IKB + 1, JK - 1 ) + DO JI = 1, IIE + IF ( GWORK3(JI) ) THEN +! + ZWORK1(JI) = SIGN( 1., ZOMG(JI,JK) ) + ZWORK2(JI) = 0.5 * ( 1. + ZWORK1(JI) ) + ZWORK1(JI) = 0.5 * ( 1. - ZWORK1(JI) ) + ZTHMFIN(JI,JK) = - ZOMG(JI,JK) * ZTHLC(JI,JKP) * ZWORK1(JI) + ZTHMFOUT(JI,JK) = ZOMG(JI,JK) * ZTHLC(JI,JK) * ZWORK2(JI) + ZRWMFIN(JI,JK) = - ZOMG(JI,JK) * PRWC(JI,JKP) * ZWORK1(JI) + ZRWMFOUT(JI,JK) = ZOMG(JI,JK) * PRWC(JI,JK) * ZWORK2(JI) + ZRCMFIN(JI,JK) = - ZOMG(JI,JK) * PRCC(JI,JKP) * ZWORK1(JI) + ZRCMFOUT(JI,JK) = ZOMG(JI,JK) * PRCC(JI,JK) * ZWORK2(JI) + ZRIMFIN(JI,JK) = - ZOMG(JI,JK) * PRIC(JI,JKP) * ZWORK1(JI) + ZRIMFOUT(JI,JK) = ZOMG(JI,JK) * PRIC(JI,JK) * ZWORK2(JI) + END IF + END DO + DO JI = 1, IIE + IF ( GWORK3(JI) ) THEN + ZTHMFIN(JI,JKP) = ZTHMFIN(JI,JKP) + ZTHMFOUT(JI,JK) * ZWORK2(JI) + ZTHMFOUT(JI,JKP) = ZTHMFOUT(JI,JKP) + ZTHMFIN(JI,JK) * ZWORK1(JI) + ZRWMFIN(JI,JKP) = ZRWMFIN(JI,JKP) + ZRWMFOUT(JI,JK) * ZWORK2(JI) + ZRWMFOUT(JI,JKP) = ZRWMFOUT(JI,JKP) + ZRWMFIN(JI,JK) * ZWORK1(JI) + ZRCMFIN(JI,JKP) = ZRCMFIN(JI,JKP) + ZRCMFOUT(JI,JK) * ZWORK2(JI) + ZRCMFOUT(JI,JKP) = ZRCMFOUT(JI,JKP) + ZRCMFIN(JI,JK) * ZWORK1(JI) + ZRIMFIN(JI,JKP) = ZRIMFIN(JI,JKP) + ZRIMFOUT(JI,JK) * ZWORK2(JI) + ZRIMFOUT(JI,JKP) = ZRIMFOUT(JI,JKP) + ZRIMFIN(JI,JK) * ZWORK1(JI) +! + END IF + END DO + END DO +! + WHERE ( GWORK4(:,:) ) +! +!****************************************************************************** +! +!* 8. Update the environmental values of enthalpy and r_w at each level +! NOTA: These are the MAIN EQUATIONS of the scheme +! ----------------------------------------------------------------- +! +! + ZTHLC(:,:) = ZTHLC(:,:) + ZTIMC(:,:) / PLMASS(:,:) * ( & + ZTHMFIN(:,:) + PUDR(:,:) * PUTHL(:,:) + & + PDDR(:,:) * PDTHL(:,:) - ZTHMFOUT(:,:) - & + ( PUER(:,:) + PDER(:,:) ) * PTHL(:,:) ) + PRWC(:,:) = PRWC(:,:) + ZTIMC(:,:) / PLMASS(:,:) * ( & + ZRWMFIN(:,:) + PUDR(:,:) * PURW(:,:) + & + PDDR(:,:) * PDRW(:,:) - ZRWMFOUT(:,:) - & + ( PUER(:,:) + PDER(:,:) ) * PRW(:,:) ) + PRCC(:,:) = PRCC(:,:) + ZTIMC(:,:) / PLMASS(:,:) * ( & + ZRCMFIN(:,:) + PUDR(:,:) * PURC(:,:) - ZRCMFOUT(:,:) - & + ( PUER(:,:) + PDER(:,:) ) * PRC(:,:) ) + PRIC(:,:) = PRIC(:,:) + ZTIMC(:,:) / PLMASS(:,:) * ( & + ZRIMFIN(:,:) + PUDR(:,:) * PURI(:,:) - ZRIMFOUT(:,:) - & + ( PUER(:,:) + PDER(:,:) ) * PRI(:,:) ) +! +! +!****************************************************************************** +! + END WHERE +! + END DO ! Exit the fractional time step loop +! +! +!* 9. Allow frozen precipitation to melt over a 200 mb deep layer +! ----------------------------------------------------------- +! + DO JK = JKMAX, IKB + 1, -1 + ZTHLC(:,JK) = ZTHLC(:,JK) - & + ZPRMELT(:) * ZWORK6(:,JK) / MAX( XMELDPTH, ZMELDPTH(:) ) + END DO +! +! +!* 10. Compute final linearized value of theta envir. +! ---------------------------------------------- +! + DO JK = IKB + 1, JKMAX + DO JI = 1, IIE + IF( GWORK1(JI) .AND. JK <= KCTL(JI) ) THEN + ZPI(JI) = ( XP00 / PPRES(JI,JK) ) ** ZRDOCP + ZCPH(JI) = XCPD + PRWC(JI,JK) * XCPV + ZWORK2(JI) = PTH(JI,JK) / ZPI(JI) ! first temperature estimate + ZLV(JI) = XLVTT + ( XCPV - XCL ) * ( ZWORK2(JI) - XTT ) + ZLS(JI) = XLVTT + ( XCPV - XCI ) * ( ZWORK2(JI) - XTT ) + ! final linearized temperature + ZWORK2(JI) = ( ZTHLC(JI,JK) + ZLV(JI) * PRCC(JI,JK) + ZLS(JI) * PRIC(JI,JK) & + - (1. + PRWC(JI,JK) ) * XG * PZ(JI,JK) ) / ZCPH(JI) + ZWORK2(JI) = MAX( 180., MIN( 340., ZWORK2(JI) ) ) + PTHC(JI,JK)= ZWORK2(JI) * ZPI(JI) ! final adjusted envir. theta + END IF + END DO + END DO +! +! +!* 11. Compute new cloud ( properties at new LCL ) +! NOTA: The computations are very close to +! that in routine TRIGGER_FUNCT +! --------------------------------------------- +! + CALL CONVECT_CLOSURE_THRVLCL( KLON, KLEV, & + PPRES, PTHC, PRWC, PZ, GWORK1, & + ZTHLCL, ZRVLCL, ZZLCL, ZTLCL, ZTELCL, & + ILCL, KDPL, KPBL ) +! +! + ZTLCL(:) = MAX( 230., MIN( 335., ZTLCL(:) ) ) ! set some overflow bounds + ZTELCL(:) = MAX( 230., MIN( 335., ZTELCL(:) ) ) + ZTHLCL(:) = MAX( 230., MIN( 345., ZTHLCL(:) ) ) + ZRVLCL(:) = MAX( 0., MIN( 1., ZRVLCL(:) ) ) +! +! +!* 12. Compute adjusted CAPE +! --------------------- +! + ZCAPE(:) = 0. + ZPI(:) = ZTHLCL(:) / ZTLCL(:) + ZPI(:) = MAX( 0.95, MIN( 1.5, ZPI(:) ) ) + ZWORK1(:) = XP00 / ZPI(:) ** ZCPORD ! pressure at LCL +! + CALL CONVECT_SATMIXRATIO( KLON, ZWORK1, ZTELCL, ZWORK3, ZLV, ZLS, ZCPH ) + ZWORK3(:) = MIN( .1, MAX( 0., ZWORK3(:) ) ) +! + ! compute theta_e updraft undilute + ZTHEUL(:) = ZTLCL(:) * ZPI(:) ** ( 1. - 0.28 * ZRVLCL(:) ) & + * EXP( ( 3374.6525 / ZTLCL(:) - 2.5403 ) & + * ZRVLCL(:) * ( 1. + 0.81 * ZRVLCL(:) ) ) +! + ! compute theta_e saturated environment at LCL + ZTHES1(:) = ZTELCL(:) * ZPI(:) ** ( 1. - 0.28 * ZWORK3(:) ) & + * EXP( ( 3374.6525 / ZTELCL(:) - 2.5403 ) & + * ZWORK3(:) * ( 1. + 0.81 * ZWORK3(:) ) ) +! + DO JK = MINVAL( ILCL(:) ), JKMAX + JKP = JK - 1 + DO JI = 1, IIE + ZWORK4(JI) = 1. + IF ( JK == ILCL(JI) ) ZWORK4(JI) = 0. +! + ! compute theta_e saturated environment and adjusted values + ! of theta +! + GWORK3(JI) = JK >= ILCL(JI) .AND. JK <= KCTL(JI) .AND. GWORK1(JI) +! + ZPI(JI) = ( XP00 / PPRES(JI,JK) ) ** ZRDOCP + ZWORK2(JI) = PTHC(JI,JK) / ZPI(JI) + END DO +! + CALL CONVECT_SATMIXRATIO( KLON, PPRES(:,JK), ZWORK2, ZWORK3, ZLV, ZLS, ZCPH ) +! +! + DO JI = 1, IIE + IF ( GWORK3(JI) ) THEN + ZTHES2(JI) = ZWORK2(JI) * ZPI(JI) ** ( 1. - 0.28 * ZWORK3(JI) ) & + * EXP( ( 3374.6525 / ZWORK2(JI) - 2.5403 ) & + * ZWORK3(JI) * ( 1. + 0.81 * ZWORK3(JI) ) ) +! + ZWORK3(JI) = PZ(JI,JK) - PZ(JI,JKP) * ZWORK4(JI) - & + ( 1. - ZWORK4(JI) ) * ZZLCL(JI) ! level thickness + ZWORK1(JI) = ( 2. * ZTHEUL(JI) ) / ( ZTHES1(JI) + ZTHES2(JI) ) - 1. + ZCAPE(JI) = ZCAPE(JI) + XG * ZWORK3(JI) * MAX( 0., ZWORK1(JI) ) + ZTHES1(JI) = ZTHES2(JI) + END IF + END DO + END DO +! +! +!* 13. Determine mass adjustment factor knowing how much +! CAPE has been removed. +! ------------------------------------------------- +! + WHERE ( GWORK1(:) ) + ZWORK1(:) = MAX( PCAPE(:) - ZCAPE(:), 0.1 * PCAPE(:) ) + ZWORK2(:) = ZCAPE(:) / ( PCAPE(:) + 1.E-8 ) +! + GWORK1(:) = ZWORK2(:) > 0.1 .OR. ZCAPE(:) == 0. ! mask for adjustment + END WHERE +! + WHERE ( ZCAPE(:) == 0. .AND. GWORK1(:) ) ZADJ(:) = ZADJ(:) * 0.5 + WHERE ( ZCAPE(:) /= 0. .AND. GWORK1(:) ) & + ZADJ(:) = ZADJ(:) * XSTABC * PCAPE(:) / ( ZWORK1(:) + 1.E-8 ) + ZADJ(:) = MIN( ZADJ(:), ZADJMAX(:) ) +! +! +!* 13. Adjust mass flux by the factor ZADJ to converge to +! specified degree of stabilization +! ---------------------------------------------------- +! + CALL CONVECT_CLOSURE_ADJUST( KLON, KLEV, ZADJ, & + PUMF, ZUMF, PUER, ZUER, PUDR, ZUDR, & + PDMF, ZDMF, PDER, ZDER, PDDR, ZDDR, & + ZPRMELT, ZPRMELTO, PDTEVR, ZDTEVR, & + PTPR, ZTPR, & + PPRLFLX, ZPRLFLX, PPRSFLX, ZPRSFLX ) +! +! + IF ( COUNT( GWORK1(:) ) == 0 ) EXIT ! exit big adjustment iteration loop + ! when all columns have reached + ! desired degree of stabilization. +! +END DO ! end of big adjustment iteration loop +! +! + ! skip adj. total water array to water vapor +DO JK = IKB, IKE + PRWC(:,JK) = MAX( 0., PRWC(:,JK) - PRCC(:,JK) - PRIC(:,JK) ) +END DO +! + ! compute surface solid (ice) precipitation +PSPR(:) = ZPRMELT(:) * ( 1. - ZMELDPTH(:) / XMELDPTH ) +PSPR(:) = MAX( 0., PSPR(:) ) +! +! +END SUBROUTINE CONVECT_CLOSURE diff --git a/src/mesonh/conv/convect_closure_adjust.f90 b/src/mesonh/conv/convect_closure_adjust.f90 new file mode 100644 index 000000000..177c8844b --- /dev/null +++ b/src/mesonh/conv/convect_closure_adjust.f90 @@ -0,0 +1,183 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 conv 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ################# + MODULE MODI_CONVECT_CLOSURE_ADJUST +! ################# +! +INTERFACE +! + SUBROUTINE CONVECT_CLOSURE_ADJUST( KLON, KLEV, PADJ, & + PUMF, PZUMF, PUER, PZUER, PUDR, PZUDR, & + PDMF, PZDMF, PDER, PZDER, PDDR, PZDDR, & + PPRMELT, PZPRMELT, PDTEVR, PZDTEVR, & + PTPR, PZTPR, & + PPRLFLX, PZPRLFL, PPRSFLX, PZPRSFL ) +! +INTEGER, INTENT(IN) :: KLON ! horizontal dimension +INTEGER, INTENT(IN) :: KLEV ! vertical dimension +REAL, DIMENSION(KLON), INTENT(IN) :: PADJ ! mass adjustment factor +! +! +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PUMF ! updraft mass flux (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PZUMF ! initial value of " +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PUER ! updraft entrainment (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PZUER ! initial value of " +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PUDR ! updraft detrainment (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PZUDR ! initial value of " +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PDMF ! downdraft mass flux (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PZDMF ! initial value of " +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PDER ! downdraft entrainment (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PZDER ! initial value of " +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PDDR ! downdraft detrainment (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PZDDR ! initial value of " +REAL, DIMENSION(KLON), INTENT(INOUT):: PTPR ! total precipitation (kg/s) +REAL, DIMENSION(KLON), INTENT(INOUT):: PZTPR ! initial value of " +REAL, DIMENSION(KLON), INTENT(INOUT):: PDTEVR ! donwndraft evapor. (kg/s) +REAL, DIMENSION(KLON), INTENT(INOUT):: PZDTEVR ! initial value of " +REAL, DIMENSION(KLON), INTENT(INOUT):: PPRMELT ! melting of precipitation +REAL, DIMENSION(KLON), INTENT(INOUT):: PZPRMELT ! initial value of " +REAL, DIMENSION(KLON,KLEV),INTENT(INOUT) :: PPRLFLX! liquid precip flux +REAL, DIMENSION(KLON,KLEV),INTENT(INOUT) :: PZPRLFL! initial value " +REAL, DIMENSION(KLON,KLEV),INTENT(INOUT) :: PPRSFLX! solid precip flux +REAL, DIMENSION(KLON,KLEV),INTENT(INOUT) :: PZPRSFL! initial value " +! +END SUBROUTINE CONVECT_CLOSURE_ADJUST +! +END INTERFACE +! +END MODULE MODI_CONVECT_CLOSURE_ADJUST +! ########################################################################### + SUBROUTINE CONVECT_CLOSURE_ADJUST( KLON, KLEV, PADJ, & + PUMF, PZUMF, PUER, PZUER, PUDR, PZUDR, & + PDMF, PZDMF, PDER, PZDER, PDDR, PZDDR, & + PPRMELT, PZPRMELT, PDTEVR, PZDTEVR, & + PTPR, PZTPR, & + PPRLFLX, PZPRLFL, PPRSFLX, PZPRSFL ) +! ########################################################################### +! +!!**** Uses closure adjustment factor to adjust mass flux and to modify +!! precipitation efficiency when necessary. The computations are +!! similar to routine CONVECT_PRECIP_ADJUST. +!! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to adjust the mass flux using the +!! factor PADJ computed in CONVECT_CLOSURE +!! +!! +!!** METHOD +!! ------ +!! Computations are done at every model level starting from bottom. +!! The use of masks allows to optimise the inner loops (horizontal loops). +!! +!! +!! EXTERNAL +!! -------- +!! Module MODD_CONVPAREXT +!! JCVEXB, JCVEXT ! extra levels on the vertical boundaries +!! +!! None +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! None +!! +!! REFERENCE +!! --------- +!! +!! Book1,2 of documentation ( routine CONVECT_CLOSURE_ADJUST) +!! +!! AUTHOR +!! ------ +!! P. BECHTOLD * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original 26/03/96 +!! Last modified 04/10/97 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CONVPAREXT +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +! +INTEGER, INTENT(IN) :: KLON ! horizontal dimension +INTEGER, INTENT(IN) :: KLEV ! vertical dimension +REAL, DIMENSION(KLON), INTENT(IN) :: PADJ ! mass adjustment factor +! +! +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PUMF ! updraft mass flux (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PZUMF ! initial value of " +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PUER ! updraft entrainment (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PZUER ! initial value of " +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PUDR ! updraft detrainment (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PZUDR ! initial value of " +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PDMF ! downdraft mass flux (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PZDMF ! initial value of " +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PDER ! downdraft entrainment (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PZDER ! initial value of " +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PDDR ! downdraft detrainment (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PZDDR ! initial value of " +REAL, DIMENSION(KLON), INTENT(INOUT):: PTPR ! total precipitation (kg/s) +REAL, DIMENSION(KLON), INTENT(INOUT):: PZTPR ! initial value of " +REAL, DIMENSION(KLON), INTENT(INOUT):: PDTEVR ! donwndraft evapor. (kg/s) +REAL, DIMENSION(KLON), INTENT(INOUT):: PZDTEVR ! initial value of " +REAL, DIMENSION(KLON), INTENT(INOUT):: PPRMELT ! melting of precipitation +REAL, DIMENSION(KLON), INTENT(INOUT):: PZPRMELT ! initial value of " +REAL, DIMENSION(KLON,KLEV),INTENT(INOUT) :: PPRLFLX! liquid precip flux +REAL, DIMENSION(KLON,KLEV),INTENT(INOUT) :: PZPRLFL! initial value " +REAL, DIMENSION(KLON,KLEV),INTENT(INOUT) :: PPRSFLX! solid precip flux +REAL, DIMENSION(KLON,KLEV),INTENT(INOUT) :: PZPRSFL! initial value " +! +! +!* 0.2 Declarations of local variables : +! +INTEGER :: IKB, IKE ! vert. loop bounds +INTEGER :: JK ! vertical loop index +! +! +!------------------------------------------------------------------------------- +! +!* 0.3 Compute loop bounds +! ------------------- +! +IKB = 1 + JCVEXB +IKE = KLEV - JCVEXT +! +! +!* 1. Adjust mass flux by the factor PADJ to converge to +! specified degree of stabilization +! ---------------------------------------------------- +! + PPRMELT(:) = PZPRMELT(:) * PADJ(:) + PDTEVR(:) = PZDTEVR(:) * PADJ(:) + PTPR(:) = PZTPR(:) * PADJ(:) +! + DO JK = IKB + 1, IKE + PUMF(:,JK) = PZUMF(:,JK) * PADJ(:) + PUER(:,JK) = PZUER(:,JK) * PADJ(:) + PUDR(:,JK) = PZUDR(:,JK) * PADJ(:) + PDMF(:,JK) = PZDMF(:,JK) * PADJ(:) + PDER(:,JK) = PZDER(:,JK) * PADJ(:) + PDDR(:,JK) = PZDDR(:,JK) * PADJ(:) + PPRLFLX(:,JK) = PZPRLFL(:,JK) * PADJ(:) + PPRSFLX(:,JK) = PZPRSFL(:,JK) * PADJ(:) + END DO +! +END SUBROUTINE CONVECT_CLOSURE_ADJUST diff --git a/src/mesonh/conv/convect_closure_adjust_shal.f90 b/src/mesonh/conv/convect_closure_adjust_shal.f90 new file mode 100644 index 000000000..91ddb2cbe --- /dev/null +++ b/src/mesonh/conv/convect_closure_adjust_shal.f90 @@ -0,0 +1,134 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 conv 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ################# + MODULE MODI_CONVECT_CLOSURE_ADJUST_SHAL +! ################# +! +INTERFACE +! + SUBROUTINE CONVECT_CLOSURE_ADJUST_SHAL( KLON, KLEV, PADJ, & + PUMF, PZUMF, PUER, PZUER, PUDR, PZUDR ) +! +INTEGER, INTENT(IN) :: KLON ! horizontal dimension +INTEGER, INTENT(IN) :: KLEV ! vertical dimension +REAL, DIMENSION(KLON), INTENT(IN) :: PADJ ! mass adjustment factor +! +! +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PUMF ! updraft mass flux (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PZUMF ! initial value of " +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PUER ! updraft entrainment (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PZUER ! initial value of " +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PUDR ! updraft detrainment (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PZUDR ! initial value of " +! +END SUBROUTINE CONVECT_CLOSURE_ADJUST_SHAL +! +END INTERFACE +! +END MODULE MODI_CONVECT_CLOSURE_ADJUST_SHAL +! ################################################################################ + SUBROUTINE CONVECT_CLOSURE_ADJUST_SHAL( KLON, KLEV, PADJ, & + PUMF, PZUMF, PUER, PZUER, PUDR, PZUDR ) +! ################################################################################ +! +!!**** Uses closure adjustment factor to adjust mass flux and to modify +!! precipitation efficiency when necessary. The computations are +!! similar to routine CONVECT_PRECIP_ADJUST. +!! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to adjust the mass flux using the +!! factor PADJ computed in CONVECT_CLOSURE +!! +!! +!!** METHOD +!! ------ +!! Computations are done at every model level starting from bottom. +!! The use of masks allows to optimise the inner loops (horizontal loops). +!! +!! +!! EXTERNAL +!! -------- +!! Module MODD_CONVPAREXT +!! JCVEXB, JCVEXT ! extra levels on the vertical boundaries +!! +!! None +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! None +!! +!! REFERENCE +!! --------- +!! +!! Book1,2 of documentation ( routine CONVECT_CLOSURE_ADJUST) +!! +!! AUTHOR +!! ------ +!! P. BECHTOLD * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original 26/03/96 +!! Last modified 15/11/96 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CONVPAREXT +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +! +INTEGER, INTENT(IN) :: KLON ! horizontal dimension +INTEGER, INTENT(IN) :: KLEV ! vertical dimension +REAL, DIMENSION(KLON), INTENT(IN) :: PADJ ! mass adjustment factor +! +! +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PUMF ! updraft mass flux (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PZUMF ! initial value of " +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PUER ! updraft entrainment (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PZUER ! initial value of " +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PUDR ! updraft detrainment (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PZUDR ! initial value of " +! +! +!* 0.2 Declarations of local variables : +! +INTEGER :: IKB, IKE ! vert. loop bounds +INTEGER :: JK ! vertical loop index +! +! +!------------------------------------------------------------------------------- +! +!* 0.3 Compute loop bounds +! ------------------- +! +IKB = 1 + JCVEXB +IKE = KLEV - JCVEXT +! +! +!* 1. Adjust mass flux by the factor PADJ to converge to +! specified degree of stabilization +! ---------------------------------------------------- +! + DO JK = IKB + 1, IKE + PUMF(:,JK) = PZUMF(:,JK) * PADJ(:) + PUER(:,JK) = PZUER(:,JK) * PADJ(:) + PUDR(:,JK) = PZUDR(:,JK) * PADJ(:) + END DO +! +END SUBROUTINE CONVECT_CLOSURE_ADJUST_SHAL diff --git a/src/mesonh/conv/convect_closure_shal.f90 b/src/mesonh/conv/convect_closure_shal.f90 new file mode 100644 index 000000000..73e59decb --- /dev/null +++ b/src/mesonh/conv/convect_closure_shal.f90 @@ -0,0 +1,619 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 conv 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ################# + MODULE MODI_CONVECT_CLOSURE_SHAL +! ################# +! +INTERFACE +! + SUBROUTINE CONVECT_CLOSURE_SHAL( KLON, KLEV, & + PPRES, PDPRES, PZ, PDXDY, PLMASS, & + PTHL, PTH, PRW, PRC, PRI, OTRIG1, & + PTHC, PRWC, PRCC, PRIC, PWSUB, & + KLCL, KDPL, KPBL, KCTL, & + PUMF, PUER, PUDR, PUTHL, PURW, & + PURC, PURI, PCAPE, PTIMEC, KFTSTEPS ) + +! +INTEGER, INTENT(IN) :: KLON ! horizontal dimension +INTEGER, INTENT(IN) :: KLEV ! vertical dimension +INTEGER, DIMENSION(KLON), INTENT(IN) :: KLCL ! index lifting condens. level +INTEGER, DIMENSION(KLON), INTENT(IN) :: KCTL ! index for cloud top level +INTEGER, DIMENSION(KLON), INTENT(IN) :: KDPL ! index for departure level +INTEGER, DIMENSION(KLON), INTENT(IN) :: KPBL ! index for top of source layer +REAL, DIMENSION(KLON), INTENT(INOUT) :: PTIMEC ! convection time step +REAL, DIMENSION(KLON), INTENT(IN) :: PDXDY ! grid area (m^2) +REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PTHL ! grid scale enthalpy (J/kg) +REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PTH ! grid scale theta +REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PRW ! grid scale total water + ! mixing ratio +REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PRC ! grid scale r_c +REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PRI ! grid scale r_i +LOGICAL, DIMENSION(KLON), INTENT(IN) :: OTRIG1 ! logical to keep trace of + ! convective arrays modified in UPDRAFT +! +! +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PPRES ! pressure (P) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PDPRES ! pressure difference between + ! bottom and top of layer (Pa) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PLMASS ! mass of model layer (kg) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PZ ! height of model layer (m) +REAL, DIMENSION(KLON), INTENT(IN) :: PCAPE ! available potent. energy +INTEGER, INTENT(OUT) :: KFTSTEPS! maximum of fract time steps + ! only used for chemical tracers +! +! +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PUMF ! updraft mass flux (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PUER ! updraft entrainment (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PUDR ! updraft detrainment (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PUTHL ! updraft enthalpy (J/kg) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PURW ! updraft total water (kg/kg) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PURC ! updraft cloud water (kg/kg) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PURI ! updraft cloud ice (kg/kg) +! +REAL, DIMENSION(KLON,KLEV), INTENT(OUT) :: PTHC ! conv. adj. grid scale theta +REAL, DIMENSION(KLON,KLEV), INTENT(OUT) :: PRWC ! conv. adj. grid scale r_w +REAL, DIMENSION(KLON,KLEV), INTENT(OUT) :: PRCC ! conv. adj. grid scale r_c +REAL, DIMENSION(KLON,KLEV), INTENT(OUT) :: PRIC ! conv. adj. grid scale r_i +REAL, DIMENSION(KLON,KLEV), INTENT(OUT) :: PWSUB ! envir. compensating subsidence(Pa/s) +! +END SUBROUTINE CONVECT_CLOSURE_SHAL +! +END INTERFACE +! +END MODULE MODI_CONVECT_CLOSURE_SHAL +! ############################################################################## + SUBROUTINE CONVECT_CLOSURE_SHAL( KLON, KLEV, & + PPRES, PDPRES, PZ, PDXDY, PLMASS, & + PTHL, PTH, PRW, PRC, PRI, OTRIG1, & + PTHC, PRWC, PRCC, PRIC, PWSUB, & + KLCL, KDPL, KPBL, KCTL, & + PUMF, PUER, PUDR, PUTHL, PURW, & + PURC, PURI, PCAPE, PTIMEC, KFTSTEPS ) +! ############################################################################## +! +!!**** Uses modified Fritsch-Chappell closure +!! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to determine the final adjusted +!! (over a time step PTIMEC) environmental values of THETA_l, R_w, R_c, R_i +!! The final convective tendencies can then be evaluated in the main +!! routine DEEP_CONVECT by (PTHC-PTH)/PTIMEC +!! +!! +!!** METHOD +!! ------ +!! Computations are done at every model level starting from bottom. +!! The use of masks allows to optimise the inner loops (horizontal loops). +!! +!! +!! +!! EXTERNAL +!! -------- +!! +!! CONVECT_CLOSURE_THRVLCL +!! CONVECT_CLOSURE_ADJUST_SHAL +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST +!! XG ! gravity constant +!! XP00 ! reference pressure +!! XRD, XRV ! gaz constants for dry air and water vapor +!! XCPD, XCPV ! specific heat for dry air and water vapor +!! XCL, XCI ! specific heat for liquid water and ice +!! XTT ! triple point temperature +!! XLVTT, XLSTT ! vaporization, sublimation heat constant +!! +!! Module MODD_CONVPAR_SHAL +!! XA25 ! reference grid area +!! XSTABT ! stability factor in time integration +!! XSTABC ! stability factor in CAPE adjustment +!! +!! Module MODD_CONVPAREXT +!! JCVEXB, JCVEXT ! extra levels on the vertical boundaries +!! +!! +!! REFERENCE +!! --------- +!! +!! Book1,2 of documentation ( routine CONVECT_CLOSURE) +!! Fritsch and Chappell, 1980, J. Atmos. Sci. +!! Kain and Fritsch, 1993, Meteor. Monographs, Vol. +!! +!! AUTHOR +!! ------ +!! P. BECHTOLD * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original 26/03/96 +!! Peter Bechtold 15/11/96 change for enthalpie, r_c + r_i tendencies +!! Tony Dore 14/10/96 Initialise local variables +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_CONVPAR_SHAL +USE MODD_CONVPAREXT +! +USE MODI_CONVECT_CLOSURE_THRVLCL +USE MODI_CONVECT_SATMIXRATIO +USE MODI_CONVECT_CLOSURE_ADJUST_SHAL +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +INTEGER, INTENT(IN) :: KLON ! horizontal dimension +INTEGER, INTENT(IN) :: KLEV ! vertical dimension +INTEGER, DIMENSION(KLON), INTENT(IN) :: KLCL ! index lifting condens. level +INTEGER, DIMENSION(KLON), INTENT(IN) :: KCTL ! index for cloud top level +INTEGER, DIMENSION(KLON), INTENT(IN) :: KDPL ! index for departure level +INTEGER, DIMENSION(KLON), INTENT(IN) :: KPBL ! index for top of source layer +REAL, DIMENSION(KLON), INTENT(INOUT) :: PTIMEC ! convection time step +REAL, DIMENSION(KLON), INTENT(IN) :: PDXDY ! grid area (m^2) +REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PTHL ! grid scale enthalpy (J/kg) +REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PTH ! grid scale theta +REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PRW ! grid scale total water + ! mixing ratio +REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PRC ! grid scale r_c +REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PRI ! grid scale r_i +LOGICAL, DIMENSION(KLON), INTENT(IN) :: OTRIG1 ! logical to keep trace of + ! convective arrays modified in UPDRAFT +! +! +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PPRES ! pressure (P) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PDPRES ! pressure difference between + ! bottom and top of layer (Pa) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PLMASS ! mass of model layer (kg) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PZ ! height of model layer (m) +REAL, DIMENSION(KLON), INTENT(IN) :: PCAPE ! available potent. energy +INTEGER, INTENT(OUT) :: KFTSTEPS! maximum of fract time steps + ! only used for chemical tracers +! +! +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PUMF ! updraft mass flux (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PUER ! updraft entrainment (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PUDR ! updraft detrainment (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PUTHL ! updraft enthalpy (J/kg) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PURW ! updraft total water (kg/kg) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PURC ! updraft cloud water (kg/kg) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PURI ! updraft cloud ice (kg/kg) +! +REAL, DIMENSION(KLON,KLEV), INTENT(OUT) :: PTHC ! conv. adj. grid scale theta +REAL, DIMENSION(KLON,KLEV), INTENT(OUT) :: PRWC ! conv. adj. grid scale r_w +REAL, DIMENSION(KLON,KLEV), INTENT(OUT) :: PRCC ! conv. adj. grid scale r_c +REAL, DIMENSION(KLON,KLEV), INTENT(OUT) :: PRIC ! conv. adj. grid scale r_i +REAL, DIMENSION(KLON,KLEV), INTENT(OUT) :: PWSUB ! envir. compensating subsidence(Pa/s) +! +!* 0.2 Declarations of local variables : +! +INTEGER :: IIE, IKB, IKE ! horizontal + vertical loop bounds +INTEGER :: IKS ! vertical dimension +INTEGER :: JK, JKP, JKMAX ! vertical loop index +INTEGER :: JI ! horizontal loop index +INTEGER :: JITER ! iteration loop index +INTEGER :: JSTEP ! fractional time loop index +REAL :: ZCPORD, ZRDOCP ! C_pd / R_d, R_d / C_pd +! +REAL, DIMENSION(KLON,KLEV) :: ZTHLC ! convectively adjusted + ! grid scale enthalpy +REAL, DIMENSION(KLON,KLEV) :: ZOMG ! conv. environm. subsidence (Pa/s) +REAL, DIMENSION(KLON,KLEV) :: ZUMF ! non-adjusted updraft mass flux +REAL, DIMENSION(KLON,KLEV) :: ZUER ! " updraft entrainm. rate +REAL, DIMENSION(KLON,KLEV) :: ZUDR ! " updraft detrainm. rate +REAL, DIMENSION(KLON) :: ZADJ ! mass adjustment factor +REAL, DIMENSION(KLON) :: ZADJMAX ! limit value for ZADJ +REAL, DIMENSION(KLON) :: ZCAPE ! new CAPE after adjustment +REAL, DIMENSION(KLON) :: ZTIMEC ! fractional convective time step +REAL, DIMENSION(KLON,KLEV):: ZTIMC ! 2D work array for ZTIMEC +! +REAL, DIMENSION(KLON) :: ZTHLCL ! new theta at LCL +REAL, DIMENSION(KLON) :: ZRVLCL ! new r_v at LCL +REAL, DIMENSION(KLON) :: ZZLCL ! height of LCL +REAL, DIMENSION(KLON) :: ZTLCL ! temperature at LCL +REAL, DIMENSION(KLON) :: ZTELCL ! envir. temper. at LCL +REAL, DIMENSION(KLON) :: ZTHEUL ! theta_e for undilute ascent +REAL, DIMENSION(KLON) :: ZTHES1, ZTHES2! saturation environm. theta_e +REAL, DIMENSION(KLON,KLEV) :: ZTHMFIN, ZTHMFOUT, ZRWMFIN, ZRWMFOUT +REAL, DIMENSION(KLON,KLEV) :: ZRCMFIN, ZRCMFOUT, ZRIMFIN, ZRIMFOUT + ! work arrays for environm. compensat. mass flux +REAL, DIMENSION(KLON) :: ZPI ! (P/P00)**R_d/C_pd +REAL, DIMENSION(KLON) :: ZLV ! latent heat of vaporisation +REAL, DIMENSION(KLON) :: ZLS ! latent heat of sublimation +REAL, DIMENSION(KLON) :: ZCPH ! specific heat C_ph +INTEGER, DIMENSION(KLON) :: ITSTEP ! fractional convective time step +INTEGER, DIMENSION(KLON) :: ICOUNT ! timestep counter +INTEGER, DIMENSION(KLON) :: ILCL ! index lifting condens. level +INTEGER, DIMENSION(KLON) :: IWORK1 ! work array +REAL, DIMENSION(KLON) :: ZWORK1, ZWORK2, ZWORK3, ZWORK4, ZWORK5 +LOGICAL, DIMENSION(KLON) :: GWORK1, GWORK3! work arrays +LOGICAL, DIMENSION(KLON,KLEV) :: GWORK4 ! work array +! +! +!------------------------------------------------------------------------------- +! +!* 0.2 Initialize local variables +! ---------------------------- +! +! +ZTIMC(:,:) = 0. +ZTHES2(:) = 0. +ZWORK1(:) = 0. +ZWORK2(:) = 0. +ZWORK3(:) = 0. +ZWORK4(:) = 0. +ZWORK5(:) = 0. +GWORK1(:) = .FALSE. +GWORK3(:) = .FALSE. +GWORK4(:,:) = .FALSE. +ILCL(:) = KLCL(:) +! +ZCPORD = XCPD / XRD +ZRDOCP = XRD / XCPD +! +ZADJ(:) = 1. +ZWORK5(:) = 1. +WHERE( .NOT. OTRIG1(:) ) ZWORK5(:) = 0. +! +! +!* 0.3 Compute loop bounds +! ------------------- +! +IIE = KLON +IKB = 1 + JCVEXB +IKS = KLEV +IKE = KLEV - JCVEXT +JKMAX = MAXVAL( KCTL(:) ) +! +! +!* 2. Save initial mass flux values to be used in adjustment procedure +! --------------------------------------------------------------- +! +ZUMF(:,:) = PUMF(:,:) +ZUER(:,:) = PUER(:,:) +ZUDR(:,:) = PUDR(:,:) +ZOMG(:,:) = 0. +PWSUB(:,:) = 0. +! +! +!* 3. Compute limits on the closure adjustment factor so that the +! inflow in convective drafts from a given layer can't be larger +! than the mass contained in this layer initially. +! --------------------------------------------------------------- +! +ZADJMAX(:) = 1000. +IWORK1(:) = ILCL(:) +JKP = MINVAL( KDPL(:) ) +DO JK = JKP, IKE + DO JI = 1, IIE + IF( JK > KDPL(JI) .AND. JK <= IWORK1(JI) ) THEN + ZWORK1(JI) = PLMASS(JI,JK) / ( ( PUER(JI,JK) + 1.E-5 ) * PTIMEC(JI) ) + ZADJMAX(JI) = MIN( ZADJMAX(JI), ZWORK1(JI) ) + END IF + END DO +END DO +! +! +GWORK1(:) = OTRIG1(:) ! logical array to limit adjustment to not definitively + ! adjusted columns +! +DO JK = IKB, IKE + ZTHLC(:,JK) = PTHL(:,JK) ! initialize adjusted envir. values + PRWC(:,JK) = PRW(:,JK) + PRCC(:,JK) = PRC(:,JK) + PRIC(:,JK) = PRI(:,JK) + PTHC(:,JK) = PTH(:,JK) +END DO +! +! +! +DO JITER = 1, 4 ! Enter adjustment loop to assure that all CAPE is + ! removed within the advective time interval TIMEC +! + ZTIMEC(:) = PTIMEC(:) + GWORK4(:,:) = SPREAD( GWORK1(:), DIM=2, NCOPIES=IKS ) + WHERE( GWORK4(:,:) ) PWSUB(:,:) = 0. + ZOMG(:,:)=0. +! + DO JK = IKB + 1, JKMAX + JKP = MAX( IKB + 1, JK - 1 ) + WHERE ( GWORK1(:) .AND. JK <= KCTL(:) ) +! +! +!* 4. Determine vertical velocity at top and bottom of each layer +! to satisfy mass continuity. +! --------------------------------------------------------------- + ! we compute here Domega/Dp = - g rho Dw/Dz = 1/Dt +! + ZWORK1(:) = - ( PUER(:,JKP) - PUDR(:,JKP) ) / PLMASS(:,JKP) +! + PWSUB(:,JK) = PWSUB(:,JKP) - PDPRES(:,JK-1) * ZWORK1(:) + ! we use PDPRES(JK-1) and not JKP in order to have zero subsidence + ! at the first layer +! +! +!* 5. Compute fractional time step. For stability or +! mass conservation reasons one must split full time step PTIMEC) +! --------------------------------------------------------------- +! + ZWORK1(:) = XSTABT * PDPRES(:,JKP) / ( ABS( PWSUB(:,JK) ) + 1.E-10 ) + ! the factor XSTABT is used for stability reasons + ZTIMEC(:) = MIN( ZTIMEC(:), ZWORK1(:) ) +! + ! transform vertical velocity in mass flux units + ZOMG(:,JK) = PWSUB(:,JK) * PDXDY(:) / XG + END WHERE + END DO +! +! + WHERE( GWORK4(:,:) ) + ZTHLC(:,:) = PTHL(:,:) ! reinitialize adjusted envir. values + PRWC(:,:) = PRW(:,:) ! when iteration criterium not attained + PRCC(:,:) = PRC(:,:) + PRIC(:,:) = PRI(:,:) + PTHC(:,:) = PTH(:,:) + END WHERE +! +! +! 6. Check for mass conservation, i.e. ZWORK1 > 1.E-2 +! If mass is not conserved, the convective tendencies +! automatically become zero. +! ---------------------------------------------------- +! + DO JI = 1, IIE + JK=KCTL(JI) + ZWORK1(JI) = PUDR(JI,JK) * PDPRES(JI,JK) / ( PLMASS(JI,JK) + .1 ) & + - PWSUB(JI,JK) + END DO + WHERE( GWORK1(:) .AND. ABS( ZWORK1(:) ) - .01 > 0. ) + GWORK1(:) = .FALSE. + PTIMEC(:) = 1.E-1 + ZWORK5(:) = 0. + END WHERE + DO JK = IKB, IKE + PWSUB(:,JK) = PWSUB(:,JK) * ZWORK5(:) + END DO + GWORK4(:,1:IKB) = .FALSE. + GWORK4(:,IKE:IKS) = .FALSE. +! + ITSTEP(:) = INT( PTIMEC(:) / ZTIMEC(:) ) + 1 + ZTIMEC(:) = PTIMEC(:) / REAL( ITSTEP(:) ) ! adjust fractional time step + ! to be an integer multiple of PTIMEC + ZTIMC(:,:)= SPREAD( ZTIMEC(:), DIM=2, NCOPIES=IKS ) + ICOUNT(:) = 0 +! +! +! + KFTSTEPS = MAXVAL( ITSTEP(:) ) + DO JSTEP = 1, KFTSTEPS ! Enter the fractional time step loop here +! + ICOUNT(:) = ICOUNT(:) + 1 +! + GWORK3(:) = ITSTEP(:) >= ICOUNT(:) .AND. GWORK1(:) +! +! +!* 7. Assign enthalpy and r_w values at the top and bottom of each +! layer based on the sign of w +! ------------------------------------------------------------ +! + ZTHMFIN(:,:) = 0. + ZRWMFIN(:,:) = 0. + ZRCMFIN(:,:) = 0. + ZRIMFIN(:,:) = 0. + ZTHMFOUT(:,:) = 0. + ZRWMFOUT(:,:) = 0. + ZRCMFOUT(:,:) = 0. + ZRIMFOUT(:,:) = 0. +! + DO JK = IKB + 1, JKMAX + DO JI = 1, IIE + GWORK4(JI,JK) = GWORK3(JI) .AND. JK <= KCTL(JI) + END DO + JKP = MAX( IKB + 1, JK - 1 ) + DO JI = 1, IIE + IF ( GWORK3(JI) ) THEN +! + ZWORK1(JI) = SIGN( 1., ZOMG(JI,JK) ) + ZWORK2(JI) = 0.5 * ( 1. + ZWORK1(JI) ) + ZWORK1(JI) = 0.5 * ( 1. - ZWORK1(JI) ) + ZTHMFIN(JI,JK) = - ZOMG(JI,JK) * ZTHLC(JI,JKP) * ZWORK1(JI) + ZTHMFOUT(JI,JK) = ZOMG(JI,JK) * ZTHLC(JI,JK) * ZWORK2(JI) + ZRWMFIN(JI,JK) = - ZOMG(JI,JK) * PRWC(JI,JKP) * ZWORK1(JI) + ZRWMFOUT(JI,JK) = ZOMG(JI,JK) * PRWC(JI,JK) * ZWORK2(JI) + ZRCMFIN(JI,JK) = - ZOMG(JI,JK) * PRCC(JI,JKP) * ZWORK1(JI) + ZRCMFOUT(JI,JK) = ZOMG(JI,JK) * PRCC(JI,JK) * ZWORK2(JI) + ZRIMFIN(JI,JK) = - ZOMG(JI,JK) * PRIC(JI,JKP) * ZWORK1(JI) + ZRIMFOUT(JI,JK) = ZOMG(JI,JK) * PRIC(JI,JK) * ZWORK2(JI) + END IF + END DO + DO JI = 1, IIE + IF ( GWORK3(JI) ) THEN + ZTHMFIN(JI,JKP) = ZTHMFIN(JI,JKP) + ZTHMFOUT(JI,JK) * ZWORK2(JI) + ZTHMFOUT(JI,JKP) = ZTHMFOUT(JI,JKP) + ZTHMFIN(JI,JK) * ZWORK1(JI) + ZRWMFIN(JI,JKP) = ZRWMFIN(JI,JKP) + ZRWMFOUT(JI,JK) * ZWORK2(JI) + ZRWMFOUT(JI,JKP) = ZRWMFOUT(JI,JKP) + ZRWMFIN(JI,JK) * ZWORK1(JI) + ZRCMFIN(JI,JKP) = ZRCMFIN(JI,JKP) + ZRCMFOUT(JI,JK) * ZWORK2(JI) + ZRCMFOUT(JI,JKP) = ZRCMFOUT(JI,JKP) + ZRCMFIN(JI,JK) * ZWORK1(JI) + ZRIMFIN(JI,JKP) = ZRIMFIN(JI,JKP) + ZRIMFOUT(JI,JK) * ZWORK2(JI) + ZRIMFOUT(JI,JKP) = ZRIMFOUT(JI,JKP) + ZRIMFIN(JI,JK) * ZWORK1(JI) +! + END IF + END DO + END DO +! + WHERE ( GWORK4(:,:) ) +! +!****************************************************************************** +! +!* 8. Update the environmental values of enthalpy and r_w at each level +! NOTA: These are the MAIN EQUATIONS of the scheme +! ----------------------------------------------------------------- +! +! + ZTHLC(:,:) = ZTHLC(:,:) + ZTIMC(:,:) / PLMASS(:,:) * ( & + ZTHMFIN(:,:) + PUDR(:,:) * PUTHL(:,:) & + - ZTHMFOUT(:,:) - PUER(:,:) * PTHL(:,:) ) + PRWC(:,:) = PRWC(:,:) + ZTIMC(:,:) / PLMASS(:,:) * ( & + ZRWMFIN(:,:) + PUDR(:,:) * PURW(:,:) & + - ZRWMFOUT(:,:) - PUER(:,:) * PRW(:,:) ) + PRCC(:,:) = PRCC(:,:) + ZTIMC(:,:) / PLMASS(:,:) * ( & + ZRCMFIN(:,:) + PUDR(:,:) * PURC(:,:) - ZRCMFOUT(:,:) - & + PUER(:,:) * PRC(:,:) ) + PRIC(:,:) = PRIC(:,:) + ZTIMC(:,:) / PLMASS(:,:) * ( & + ZRIMFIN(:,:) + PUDR(:,:) * PURI(:,:) - ZRIMFOUT(:,:) - & + PUER(:,:) * PRI(:,:) ) +! +! +!****************************************************************************** +! + END WHERE +! + END DO ! Exit the fractional time step loop +! +! +!* 10. Compute final linearized value of theta envir. +! ---------------------------------------------- +! + DO JK = IKB + 1, JKMAX + DO JI = 1, IIE + IF( GWORK1(JI) .AND. JK <= KCTL(JI) ) THEN + ZPI(JI) = ( XP00 / PPRES(JI,JK) ) ** ZRDOCP + ZCPH(JI) = XCPD + PRWC(JI,JK) * XCPV + ZWORK2(JI) = PTH(JI,JK) / ZPI(JI) ! first temperature estimate + ZLV(JI) = XLVTT + ( XCPV - XCL ) * ( ZWORK2(JI) - XTT ) + ZLS(JI) = XLVTT + ( XCPV - XCI ) * ( ZWORK2(JI) - XTT ) + ! final linearized temperature + ZWORK2(JI) = ( ZTHLC(JI,JK) + ZLV(JI) * PRCC(JI,JK) + ZLS(JI) * PRIC(JI,JK) & + - (1. + PRWC(JI,JK) ) * XG * PZ(JI,JK) ) / ZCPH(JI) + ZWORK2(JI) = MAX( 180., MIN( 340., ZWORK2(JI) ) ) + PTHC(JI,JK)= ZWORK2(JI) * ZPI(JI) ! final adjusted envir. theta + END IF + END DO + END DO +! +! +!* 11. Compute new cloud ( properties at new LCL ) +! NOTA: The computations are very close to +! that in routine TRIGGER_FUNCT +! --------------------------------------------- +! + CALL CONVECT_CLOSURE_THRVLCL( KLON, KLEV, & + PPRES, PTHC, PRWC, PZ, GWORK1, & + ZTHLCL, ZRVLCL, ZZLCL, ZTLCL, ZTELCL, & + ILCL, KDPL, KPBL ) +! +! + ZTLCL(:) = MAX( 230., MIN( 335., ZTLCL(:) ) ) ! set some overflow bounds + ZTELCL(:) = MAX( 230., MIN( 335., ZTELCL(:) ) ) + ZTHLCL(:) = MAX( 230., MIN( 345., ZTHLCL(:) ) ) + ZRVLCL(:) = MAX( 0., MIN( 1., ZRVLCL(:) ) ) +! +! +!* 12. Compute adjusted CAPE +! --------------------- +! + ZCAPE(:) = 0. + ZPI(:) = ZTHLCL(:) / ZTLCL(:) + ZPI(:) = MAX( 0.95, MIN( 1.5, ZPI(:) ) ) + ZWORK1(:) = XP00 / ZPI(:) ** ZCPORD ! pressure at LCL +! + CALL CONVECT_SATMIXRATIO( KLON, ZWORK1, ZTELCL, ZWORK3, ZLV, ZLS, ZCPH ) + ZWORK3(:) = MIN( .1, MAX( 0., ZWORK3(:) ) ) +! + ! compute theta_e updraft undilute + ZTHEUL(:) = ZTLCL(:) * ZPI(:) ** ( 1. - 0.28 * ZRVLCL(:) ) & + * EXP( ( 3374.6525 / ZTLCL(:) - 2.5403 ) & + * ZRVLCL(:) * ( 1. + 0.81 * ZRVLCL(:) ) ) +! + ! compute theta_e saturated environment at LCL + ZTHES1(:) = ZTELCL(:) * ZPI(:) ** ( 1. - 0.28 * ZWORK3(:) ) & + * EXP( ( 3374.6525 / ZTELCL(:) - 2.5403 ) & + * ZWORK3(:) * ( 1. + 0.81 * ZWORK3(:) ) ) +! + DO JK = MINVAL( ILCL(:) ), JKMAX + JKP = JK - 1 + DO JI = 1, IIE + ZWORK4(JI) = 1. + IF ( JK == ILCL(JI) ) ZWORK4(JI) = 0. +! + ! compute theta_e saturated environment and adjusted values + ! of theta +! + GWORK3(JI) = JK >= ILCL(JI) .AND. JK <= KCTL(JI) .AND. GWORK1(JI) +! + ZPI(JI) = ( XP00 / PPRES(JI,JK) ) ** ZRDOCP + ZWORK2(JI) = PTHC(JI,JK) / ZPI(JI) + END DO +! + CALL CONVECT_SATMIXRATIO( KLON, PPRES(:,JK), ZWORK2, ZWORK3, ZLV, ZLS, ZCPH ) +! +! + DO JI = 1, IIE + IF ( GWORK3(JI) ) THEN + ZTHES2(JI) = ZWORK2(JI) * ZPI(JI) ** ( 1. - 0.28 * ZWORK3(JI) ) & + * EXP( ( 3374.6525 / ZWORK2(JI) - 2.5403 ) & + * ZWORK3(JI) * ( 1. + 0.81 * ZWORK3(JI) ) ) +! + ZWORK3(JI) = PZ(JI,JK) - PZ(JI,JKP) * ZWORK4(JI) - & + ( 1. - ZWORK4(JI) ) * ZZLCL(JI) ! level thickness + ZWORK1(JI) = ( 2. * ZTHEUL(JI) ) / ( ZTHES1(JI) + ZTHES2(JI) ) - 1. + ZCAPE(JI) = ZCAPE(JI) + XG * ZWORK3(JI) * MAX( 0., ZWORK1(JI) ) + ZTHES1(JI) = ZTHES2(JI) + END IF + END DO + END DO +! +! +!* 13. Determine mass adjustment factor knowing how much +! CAPE has been removed. +! ------------------------------------------------- +! + WHERE ( GWORK1(:) ) + ZWORK1(:) = MAX( PCAPE(:) - ZCAPE(:), 0.2 * PCAPE(:) ) + ZWORK2(:) = ZCAPE(:) / ( PCAPE(:) + 1.E-8 ) +! + GWORK1(:) = ZWORK2(:) > 0.2 .OR. ZCAPE(:) == 0. ! mask for adjustment + END WHERE +! + WHERE ( ZCAPE(:) == 0. .AND. GWORK1(:) ) ZADJ(:) = ZADJ(:) * 0.5 + WHERE ( ZCAPE(:) /= 0. .AND. GWORK1(:) ) & + ZADJ(:) = ZADJ(:) * XSTABC * PCAPE(:) / ( ZWORK1(:) + 1.E-8 ) + ZADJ(:) = MIN( ZADJ(:), ZADJMAX(:) ) +! +! +!* 13. Adjust mass flux by the factor ZADJ to converge to +! specified degree of stabilization +! ---------------------------------------------------- +! + CALL CONVECT_CLOSURE_ADJUST_SHAL( KLON, KLEV, ZADJ, & + PUMF, ZUMF, PUER, ZUER, PUDR, ZUDR ) +! +! + IF ( COUNT( GWORK1(:) ) == 0 ) EXIT ! exit big adjustment iteration loop + ! when all columns have reached + ! desired degree of stabilization. +! +END DO ! end of big adjustment iteration loop +! +! + ! skip adj. total water array to water vapor +DO JK = IKB, IKE + PRWC(:,JK) = MAX( 0., PRWC(:,JK) - PRCC(:,JK) - PRIC(:,JK) ) +END DO +! +! +END SUBROUTINE CONVECT_CLOSURE_SHAL diff --git a/src/mesonh/conv/convect_closure_thrvlcl.f90 b/src/mesonh/conv/convect_closure_thrvlcl.f90 new file mode 100644 index 000000000..b83976908 --- /dev/null +++ b/src/mesonh/conv/convect_closure_thrvlcl.f90 @@ -0,0 +1,299 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 conv 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ################# + MODULE MODI_CONVECT_CLOSURE_THRVLCL +! ################# +! +INTERFACE +! + SUBROUTINE CONVECT_CLOSURE_THRVLCL( KLON, KLEV, & + PPRES, PTH, PRV, PZ, OWORK1, & + PTHLCL, PRVLCL, PZLCL, PTLCL, PTELCL,& + KLCL, KDPL, KPBL ) +! +INTEGER, INTENT(IN) :: KLON ! horizontal dimension +INTEGER, INTENT(IN) :: KLEV ! vertical dimension +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PTH ! theta +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PRV ! vapor mixing ratio +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PPRES ! pressure +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PZ ! height of grid point (m) +INTEGER, DIMENSION(KLON), INTENT(IN) :: KDPL ! contains vert. index of DPL +INTEGER, DIMENSION(KLON), INTENT(IN) :: KPBL ! " vert. index of source layer top +LOGICAL, DIMENSION(KLON), INTENT(IN) :: OWORK1! logical mask +! +REAL, DIMENSION(KLON), INTENT(OUT):: PTHLCL ! theta at LCL +REAL, DIMENSION(KLON), INTENT(OUT):: PRVLCL ! vapor mixing ratio at LCL +REAL, DIMENSION(KLON), INTENT(OUT):: PZLCL ! height at LCL (m) +REAL, DIMENSION(KLON), INTENT(OUT):: PTLCL ! temperature at LCL (m) +REAL, DIMENSION(KLON), INTENT(OUT):: PTELCL ! environm. temp. at LCL (K) +INTEGER, DIMENSION(KLON), INTENT(OUT):: KLCL ! contains vert. index of LCL +! +END SUBROUTINE CONVECT_CLOSURE_THRVLCL +! +END INTERFACE +! +END MODULE MODI_CONVECT_CLOSURE_THRVLCL +! ######################################################################### + SUBROUTINE CONVECT_CLOSURE_THRVLCL( KLON, KLEV, & + PPRES, PTH, PRV, PZ, OWORK1, & + PTHLCL, PRVLCL, PZLCL, PTLCL, PTELCL,& + KLCL, KDPL, KPBL ) +! ######################################################################### +! +!!**** Determine thermodynamic properties at new LCL +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to determine the thermodynamic +!! properties at the new lifting condensation level LCL +!! +!! +!! +!!** METHOD +!! ------ +!! see CONVECT_TRIGGER_FUNCT +!! +!! +!! +!! EXTERNAL +!! -------- +!! Routine CONVECT_SATMIXRATIO +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST +!! XG ! gravity constant +!! XP00 ! Reference pressure +!! XRD, XRV ! Gaz constants for dry air and water vapor +!! XCPD ! Cpd (dry air) +!! XTT ! triple point temperature +!! XBETAW, XGAMW ! constants for vapor saturation pressure +!! +!! Module MODD_CONVPAR +!! XA25 ! reference grid area +!! XZLCL ! lowest allowed pressure difference between +!! ! surface and LCL +!! XZPBL ! minimum mixed layer depth to sustain convection +!! XWTRIG ! constant in vertical velocity trigger +!! +!! Module MODD_CONVPAREXT +!! JCVEXB, JCVEXT ! extra levels on the vertical boundaries +!! +!! REFERENCE +!! --------- +!! +!! Book2 of documentation ( routine TRIGGER_FUNCT) +!! Fritsch and Chappell (1980), J. Atm. Sci., Vol. 37, 1722-1761. +!! +!! AUTHOR +!! ------ +!! P. BECHTOLD * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original 07/11/95 +!! Last modified 04/10/97 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_CONVPAR +USE MODD_CONVPAREXT +USE MODI_CONVECT_SATMIXRATIO +! +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +INTEGER, INTENT(IN) :: KLON ! horizontal dimension +INTEGER, INTENT(IN) :: KLEV ! vertical dimension +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PTH ! theta +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PRV ! vapor mixing ratio +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PPRES ! pressure +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PZ ! height of grid point (m) +INTEGER, DIMENSION(KLON), INTENT(IN) :: KDPL ! contains vert. index of DPL +INTEGER, DIMENSION(KLON), INTENT(IN) :: KPBL ! " vert. index of source layer top +LOGICAL, DIMENSION(KLON), INTENT(IN) :: OWORK1! logical mask +! +REAL, DIMENSION(KLON), INTENT(OUT):: PTHLCL ! theta at LCL +REAL, DIMENSION(KLON), INTENT(OUT):: PRVLCL ! vapor mixing ratio at LCL +REAL, DIMENSION(KLON), INTENT(OUT):: PZLCL ! height at LCL (m) +REAL, DIMENSION(KLON), INTENT(OUT):: PTLCL ! temperature at LCL (m) +REAL, DIMENSION(KLON), INTENT(OUT):: PTELCL ! environm. temp. at LCL (K) +INTEGER, DIMENSION(KLON), INTENT(OUT):: KLCL ! contains vert. index of LCL +! +!* 0.2 Declarations of local variables : +! +INTEGER :: JK, JKM, JKMIN, JKMAX ! vertical loop index +INTEGER :: JI ! horizontal loop index +INTEGER :: IIE, IKB, IKE ! horizontal + vertical loop bounds +REAL :: ZEPS ! R_d / R_v +REAL :: ZCPORD, ZRDOCP ! C_pd / R_d, R_d / C_pd +! +REAL, DIMENSION(KLON) :: ZPLCL ! pressure at LCL +REAL, DIMENSION(KLON) :: ZTMIX ! mixed layer temperature +REAL, DIMENSION(KLON) :: ZEVMIX ! mixed layer water vapor pressure +REAL, DIMENSION(KLON) :: ZDPTHMIX, ZPRESMIX ! mixed layer depth and pressure +REAL, DIMENSION(KLON) :: ZLV, ZCPH! specific heats of vaporisation, dry air +REAL, DIMENSION(KLON) :: ZDP ! pressure between LCL and model layer +REAL, DIMENSION(KLON) :: ZWORK1, ZWORK2 ! work arrays +! +! +!------------------------------------------------------------------------------- +! +!* 0.3 Compute array bounds +! -------------------- +! +IIE = KLON +IKB = 1 + JCVEXB +IKE = KLEV - JCVEXT +! +! +!* 1. Initialize local variables +! -------------------------- +! +ZEPS = XRD / XRV +ZCPORD = XCPD / XRD +ZRDOCP = XRD / XCPD +! +ZDPTHMIX(:) = 0. +ZPRESMIX(:) = 0. +PTHLCL(:) = 300. +PTLCL(:) = 300. +PTELCL(:) = 300. +PRVLCL(:) = 0. +PZLCL(:) = PZ(:,IKB) +ZTMIX(:) = 230. +ZPLCL(:) = 1.E4 +KLCL(:) = IKB + 1 +! +! +!* 2. Construct a mixed layer as in TRIGGER_FUNCT +! ------------------------------------------- +! + JKMAX = MAXVAL( KPBL(:) ) + JKMIN = MINVAL( KDPL(:) ) + DO JK = IKB + 1, JKMAX + JKM = JK + 1 + DO JI = 1, IIE + IF ( JK >= KDPL(JI) .AND. JK <= KPBL(JI) ) THEN +! + ZWORK1(JI) = PPRES(JI,JK) - PPRES(JI,JKM) + ZDPTHMIX(JI) = ZDPTHMIX(JI) + ZWORK1(JI) + ZPRESMIX(JI) = ZPRESMIX(JI) + PPRES(JI,JK) * ZWORK1(JI) + PTHLCL(JI) = PTHLCL(JI) + PTH(JI,JK) * ZWORK1(JI) + PRVLCL(JI) = PRVLCL(JI) + PRV(JI,JK) * ZWORK1(JI) +! + END IF + END DO + END DO +! +! +WHERE ( OWORK1(:) ) +! + ZPRESMIX(:) = ZPRESMIX(:) / ZDPTHMIX(:) + PTHLCL(:) = PTHLCL(:) / ZDPTHMIX(:) + PRVLCL(:) = PRVLCL(:) / ZDPTHMIX(:) +! +!* 3.1 Use an empirical direct solution ( Bolton formula ) +! to determine temperature and pressure at LCL. +! Nota: the adiabatic saturation temperature is not +! equal to the dewpoint temperature +! -------------------------------------------------- +! +! + ZTMIX(:) = PTHLCL(:) * ( ZPRESMIX(:) / XP00 ) ** ZRDOCP + ZEVMIX(:) = PRVLCL(:) * ZPRESMIX(:) / ( PRVLCL(:) + ZEPS ) + ZEVMIX(:) = MAX( 1.E-8, ZEVMIX(:) ) + ZWORK1(:) = ALOG( ZEVMIX(:) / 613.3 ) + ! dewpoint temperature + ZWORK1(:) = ( 4780.8 - 32.19 * ZWORK1(:) ) / ( 17.502 - ZWORK1(:) ) + ! adiabatic saturation temperature + PTLCL(:) = ZWORK1(:) - ( .212 + 1.571E-3 * ( ZWORK1(:) - XTT ) & + - 4.36E-4 * ( ZTMIX(:) - XTT ) ) * ( ZTMIX(:) - ZWORK1(:) ) + PTLCL(:) = MIN( PTLCL(:), ZTMIX(:) ) + ZPLCL(:) = XP00 * ( PTLCL(:) / PTHLCL(:) ) ** ZCPORD +! +END WHERE +! + ZPLCL(:) = MIN( 2.E5, MAX( 10., ZPLCL(:) ) ) ! bound to avoid overflow +! +! +!* 3.2 Correct PTLCL in order to be completely consistent +! with MNH saturation formula +! -------------------------------------------------- +! + CALL CONVECT_SATMIXRATIO( KLON, ZPLCL, PTLCL, ZWORK1, ZLV, ZWORK2, ZCPH ) + WHERE( OWORK1(:) ) + ZWORK2(:) = ZWORK1(:) / PTLCL(:) * ( XBETAW / PTLCL(:) - XGAMW ) ! dr_sat/dT + ZWORK2(:) = ( ZWORK1(:) - PRVLCL(:) ) / & + ( 1. + ZLV(:) / ZCPH(:) * ZWORK2(:) ) + PTLCL(:) = PTLCL(:) - ZLV(:) / ZCPH(:) * ZWORK2(:) +! + END WHERE +! +! +!* 3.3 If PRVLCL is oversaturated set humidity and temperature +! to saturation values. +! ------------------------------------------------------- +! + CALL CONVECT_SATMIXRATIO( KLON, ZPRESMIX, ZTMIX, ZWORK1, ZLV, ZWORK2, ZCPH ) + WHERE( OWORK1(:) .AND. PRVLCL(:) > ZWORK1(:) ) + ZWORK2(:) = ZWORK1(:) / ZTMIX(:) * ( XBETAW / ZTMIX(:) - XGAMW ) ! dr_sat/dT + ZWORK2(:) = ( ZWORK1(:) - PRVLCL(:) ) / & + ( 1. + ZLV(:) / ZCPH(:) * ZWORK2(:) ) + PTLCL(:) = ZTMIX(:) + ZLV(:) / ZCPH(:) * ZWORK2(:) + PRVLCL(:) = PRVLCL(:) - ZWORK2(:) + ZPLCL(:) = ZPRESMIX(:) + PTHLCL(:) = PTLCL(:) * ( XP00 / ZPLCL(:) ) ** ZRDOCP + END WHERE +! +! +!* 4.1 Determine vertical loop index at the LCL +! ----------------------------------------- +! + DO JK = JKMIN, IKE - 1 + DO JI = 1, IIE + IF ( ZPLCL(JI) <= PPRES(JI,JK) .AND. OWORK1(JI) ) THEN + KLCL(JI) = JK + 1 + PZLCL(JI) = PZ(JI,JK+1) + END IF + END DO + END DO +! +! +!* 4.2 Estimate height and environmental temperature at LCL +! ---------------------------------------------------- +! + DO JI = 1, IIE + JK = KLCL(JI) + JKM = JK - 1 + ZDP(JI) = ALOG( ZPLCL(JI) / PPRES(JI,JKM) ) / & + ALOG( PPRES(JI,JK) / PPRES(JI,JKM) ) + ZWORK1(JI) = PTH(JI,JK) * ( PPRES(JI,JK) / XP00 ) ** ZRDOCP + ZWORK2(JI) = PTH(JI,JKM) * ( PPRES(JI,JKM) / XP00 ) ** ZRDOCP + ZWORK1(JI) = ZWORK2(JI) + ( ZWORK1(JI) - ZWORK2(JI) ) * ZDP(JI) + ! we compute the precise value of the LCL + ! The precise height is between the levels KLCL and KLCL-1. + ZWORK2(JI) = PZ(JI,JKM) + ( PZ(JI,JK) - PZ(JI,JKM) ) * ZDP(JI) + END DO + WHERE( OWORK1(:) ) + PTELCL(:) = ZWORK1(:) + PZLCL(:) = ZWORK2(:) + END WHERE +! +! +! +END SUBROUTINE CONVECT_CLOSURE_THRVLCL diff --git a/src/mesonh/conv/convect_condens.f90 b/src/mesonh/conv/convect_condens.f90 new file mode 100644 index 000000000..b74799aa7 --- /dev/null +++ b/src/mesonh/conv/convect_condens.f90 @@ -0,0 +1,191 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 conv 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ############################################################################# +! ################# + MODULE MODI_CONVECT_CONDENS +! ################# +! +INTERFACE +! + SUBROUTINE CONVECT_CONDENS( KLON, & + KICE, PPRES, PTHL, PRW, PRCO, PRIO, PZ, OWORK1, & + PT, PEW, PRC, PRI, PLV, PLS, PCPH ) +! +INTEGER, INTENT(IN) :: KLON ! horizontal loop index +INTEGER, INTENT(IN) :: KICE ! flag for ice ( 1 = yes, + ! 0 = no ice ) +REAL, DIMENSION(KLON), INTENT(IN) :: PPRES ! pressure +REAL, DIMENSION(KLON), INTENT(IN) :: PTHL ! enthalpy (J/kg) +REAL, DIMENSION(KLON), INTENT(IN) :: PRW ! total water mixing ratio +REAL, DIMENSION(KLON), INTENT(IN) :: PRCO ! cloud water estimate (kg/kg) +REAL, DIMENSION(KLON), INTENT(IN) :: PRIO ! cloud ice estimate (kg/kg) +REAL, DIMENSION(KLON), INTENT(IN) :: PZ ! level height (m) +LOGICAL, DIMENSION(KLON),INTENT(IN) :: OWORK1 ! logical mask +! +! +REAL, DIMENSION(KLON), INTENT(OUT):: PT ! temperature +REAL, DIMENSION(KLON), INTENT(OUT):: PRC ! cloud water mixing ratio(kg/kg) +REAL, DIMENSION(KLON), INTENT(OUT):: PRI ! cloud ice mixing ratio (kg/kg) +REAL, DIMENSION(KLON), INTENT(OUT):: PLV ! latent heat L_v +REAL, DIMENSION(KLON), INTENT(OUT):: PLS ! latent heat L_s +REAL, DIMENSION(KLON), INTENT(OUT):: PCPH ! specific heat C_ph +REAL, DIMENSION(KLON), INTENT(OUT):: PEW ! water saturation mixing ratio +! +END SUBROUTINE CONVECT_CONDENS +! +END INTERFACE +! +END MODULE MODI_CONVECT_CONDENS + SUBROUTINE CONVECT_CONDENS( KLON, & + KICE, PPRES, PTHL, PRW, PRCO, PRIO, PZ, OWORK1, & + PT, PEW, PRC, PRI, PLV, PLS, PCPH ) +! ############################################################################# +! +!!**** Compute temperature cloud and ice water content from enthalpy and r_w +!! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to determine cloud condensate +!! and to return values for L_v, L_s and C_ph +!! +!! +!!** METHOD +!! ------ +!! Condensate is extracted iteratively +!! +!! +!! EXTERNAL +!! -------- +!! None +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! Module MODD_CST +!! XG ! gravity constant +!! XALPW, XBETAW, XGAMW ! constants for water saturation pressure +!! XALPI, XBETAI, XGAMI ! constants for ice saturation pressure +!! XP00 ! reference pressure +!! XRD, XRV ! gaz constants for dry air and water vapor +!! XCPD, XCPV ! specific heat for dry air and water vapor +!! XCL, XCI ! specific heat for liquid water and ice +!! XTT ! triple point temperature +!! XLVTT, XLSTT ! vaporization, sublimation heat constant +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CONVPAR +!! XTFRZ1 ! begin of freezing interval +!! XTFRZ2 ! end of freezing interval +!! +!! REFERENCE +!! --------- +!! +!! Book1,2 of documentation ( routine CONVECT_CONDENS) +!! +!! AUTHOR +!! ------ +!! P. BECHTOLD * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original 07/11/95 +!! Last modified 04/10/97 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_CONVPAR +! +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +INTEGER, INTENT(IN) :: KLON ! horizontal loop index +INTEGER, INTENT(IN) :: KICE ! flag for ice ( 1 = yes, + ! 0 = no ice ) +REAL, DIMENSION(KLON), INTENT(IN) :: PPRES ! pressure +REAL, DIMENSION(KLON), INTENT(IN) :: PTHL ! enthalpy (J/kg) +REAL, DIMENSION(KLON), INTENT(IN) :: PRW ! total water mixing ratio +REAL, DIMENSION(KLON), INTENT(IN) :: PRCO ! cloud water estimate (kg/kg) +REAL, DIMENSION(KLON), INTENT(IN) :: PRIO ! cloud ice estimate (kg/kg) +REAL, DIMENSION(KLON), INTENT(IN) :: PZ ! level height (m) +LOGICAL, DIMENSION(KLON),INTENT(IN) :: OWORK1 ! logical mask +! +! +REAL, DIMENSION(KLON), INTENT(OUT):: PT ! temperature +REAL, DIMENSION(KLON), INTENT(OUT):: PRC ! cloud water mixing ratio(kg/kg) +REAL, DIMENSION(KLON), INTENT(OUT):: PRI ! cloud ice mixing ratio (kg/kg) +REAL, DIMENSION(KLON), INTENT(OUT):: PLV ! latent heat L_v +REAL, DIMENSION(KLON), INTENT(OUT):: PLS ! latent heat L_s +REAL, DIMENSION(KLON), INTENT(OUT):: PCPH ! specific heat C_ph +REAL, DIMENSION(KLON), INTENT(OUT):: PEW ! water saturation mixing ratio +! +!* 0.2 Declarations of local variables KLON +! +INTEGER :: JITER ! iteration index +REAL :: ZEPS ! R_d / R_v +! +REAL, DIMENSION(KLON) :: ZEI ! ice saturation mixing ratio +REAL, DIMENSION(KLON) :: ZWORK1, ZWORK2, ZWORK3, ZT ! work arrays +! +! +!------------------------------------------------------------------------------- +! +!* 1. Initialize temperature and Exner function +! ----------------------------------------- +! +ZEPS = XRD / XRV +! +! + ! Make a first temperature estimate, based e.g. on values of + ! r_c and r_i at lower level +! + !! Note that the definition of ZCPH is not the same as used in + !! routine CONVECT_SATMIXRATIO + PCPH(:) = XCPD + XCPV * PRW(:) + ZWORK1(:) = ( 1. + PRW(:) ) * XG * PZ(:) + PT(:) = ( PTHL(:) + PRCO(:) * XLVTT + PRIO(:) * XLSTT - ZWORK1(:) ) & + / PCPH(:) + PT(:) = MAX(180., MIN( 330., PT(:) ) ) ! set overflow bounds in + ! case that PTHL=0 +! +! +!* 2. Enter the iteration loop +! ------------------------ +! +DO JITER = 1,6 + PEW(:) = EXP( XALPW - XBETAW / PT(:) - XGAMW * ALOG( PT(:) ) ) + ZEI(:) = EXP( XALPI - XBETAI / PT(:) - XGAMI * ALOG( PT(:) ) ) + PEW(:) = ZEPS * PEW(:) / ( PPRES(:) - PEW(:) ) + ZEI(:) = ZEPS * ZEI(:) / ( PPRES(:) - ZEI(:) ) +! + PLV(:) = XLVTT + ( XCPV - XCL ) * ( PT(:) - XTT ) ! compute L_v + PLS(:) = XLSTT + ( XCPV - XCI ) * ( PT(:) - XTT ) ! compute L_i +! + ZWORK2(:) = ( XTFRZ1 - PT(:) ) / ( XTFRZ1 - XTFRZ2 ) ! freezing interval + ZWORK2(:) = MAX( 0., MIN(1., ZWORK2(:) ) ) * REAL( KICE ) + ZWORK3(:) = ( 1. - ZWORK2(:) ) * PEW(:) + ZWORK2(:) * ZEI(:) + PRC(:) = MAX( 0., ( 1. - ZWORK2(:) ) * ( PRW(:) - ZWORK3(:) ) ) + PRI(:) = MAX( 0., ZWORK2(:) * ( PRW(:) - ZWORK3(:) ) ) + ZT(:) = ( PTHL(:) + PRC(:) * PLV(:) + PRI(:) * PLS(:) - ZWORK1(:) ) & + / PCPH(:) + PT(:) = PT(:) + ( ZT(:) - PT(:) ) * 0.4 ! force convergence + PT(:) = MAX( 175., MIN( 330., PT(:) ) ) +END DO +! +! +END SUBROUTINE CONVECT_CONDENS diff --git a/src/mesonh/conv/convect_downdraft.f90 b/src/mesonh/conv/convect_downdraft.f90 new file mode 100644 index 000000000..814455eb9 --- /dev/null +++ b/src/mesonh/conv/convect_downdraft.f90 @@ -0,0 +1,505 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 conv 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ################# + MODULE MODI_CONVECT_DOWNDRAFT +! ################# +! +INTERFACE +! + SUBROUTINE CONVECT_DOWNDRAFT( KLON, KLEV, & + KICE, PPRES, PDPRES, PZ, PTH, PTHES, & + PRW, PRC, PRI, & + PPREF, KLCL, KCTL, KETL, & + PUTHL, PURW, PURC, PURI, & + PDMF, PDER, PDDR, PDTHL, PDRW, & + PMIXF, PDTEVR, KLFS, KDBL, KML, & + PDTEVRF ) +! +INTEGER, INTENT(IN) :: KLON ! horizontal dimension +INTEGER, INTENT(IN) :: KLEV ! vertical dimension +INTEGER, INTENT(IN) :: KICE ! flag for ice ( 1 = yes, + ! 0 = no ice ) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PTH ! grid scale theta +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PTHES ! grid scale saturated theta_e +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PRW ! grid scale total water + ! mixing ratio +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PRC ! grid scale r_c (cloud water) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PRI ! grid scale r_i (cloud ice) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PPRES ! pressure (Pa) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PDPRES! pressure difference between + ! bottom and top of layer (Pa) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PZ ! level height (m) +INTEGER, DIMENSION(KLON), INTENT(IN) :: KLCL ! contains vert. index of LCL +INTEGER, DIMENSION(KLON), INTENT(IN) :: KCTL ! contains vert. index of CTL +INTEGER, DIMENSION(KLON), INTENT(IN) :: KETL ! contains vert. index of + ! equilibrium (zero buoyancy) level +INTEGER, DIMENSION(KLON), INTENT(IN) :: KML ! " vert. index of melting level +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PUTHL ! updraft enthalpy (J/kg) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PURW ! updraft total water (kg/kg) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PURC ! updraft r_c (kg/kg) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PURI ! updraft r_i (kg/kg) +REAL, DIMENSION(KLON), INTENT(IN) :: PPREF ! precipitation efficiency +! +! +REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PDMF ! downdraft mass flux (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PDER ! downdraft entrainment (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PDDR ! downdraft detrainment (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PDTHL ! downdraft enthalpy (J/kg) +REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PDRW ! downdraft total water (kg/kg) +REAL, DIMENSION(KLON), INTENT(OUT):: PMIXF ! mixed fraction at LFS +REAL, DIMENSION(KLON), INTENT(OUT):: PDTEVR ! total downdraft evaporation + ! rate at LFS (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PDTEVRF! downdraft evaporation rate +INTEGER, DIMENSION(KLON), INTENT(OUT):: KLFS ! contains vert. index of LFS +INTEGER, DIMENSION(KLON), INTENT(OUT):: KDBL ! contains vert. index of DBL +! +END SUBROUTINE CONVECT_DOWNDRAFT +! +END INTERFACE +! +END MODULE MODI_CONVECT_DOWNDRAFT +! ########################################################################## + SUBROUTINE CONVECT_DOWNDRAFT( KLON, KLEV, & + KICE, PPRES, PDPRES, PZ, PTH, PTHES, & + PRW, PRC, PRI, & + PPREF, KLCL, KCTL, KETL, & + PUTHL, PURW, PURC, PURI, & + PDMF, PDER, PDDR, PDTHL, PDRW, & + PMIXF, PDTEVR, KLFS, KDBL, KML, & + PDTEVRF ) +! ########################################################################## +! +!!**** Compute downdraft properties from LFS to DBL. +!! +!! +!! PDRPOSE +!! ------- +!! The purpose of this routine is to determine downdraft properties +!! ( mass flux, thermodynamics ) +!! +!! +!!** METHOD +!! ------ +!! Computations are done at every model level starting from top. +!! The use of masks allows to optimise the inner loops (horizontal loops). +!! +!! +!! +!! EXTERNAL +!! -------- +!! Routine CONVECT_SATMIXRATIO +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! Module MODD_CST +!! XG ! gravity constant +!! XPI ! Pi +!! XP00 ! reference pressure +!! XRD, XRV ! gaz constants for dry air and water vapor +!! XCPD ! Cpd (dry air) +!! XCPV, XCL, XCI ! Cp of water vapor, liquid water and ice +!! XTT ! triple point temperature +!! XLVTT, XLSTT ! vaporisation/sublimation heat at XTT +!! +!! Module MODD_CONVPAR +!! XCRAD ! cloud radius +!! XZPBL ! thickness of downdraft detrainment layer +!! XENTR ! entrainment constant in pressure coordinates +!! XRHDBC ! relative humidity in downdraft below cloud +!! +!! Module MODD_CONVPAREXT +!! JCVEXB, JCVEXT ! extra levels on the vertical boundaries +!! +!! REFERENCE +!! --------- +!! +!! Book1,2 of documentation ( routine CONVECT_DOWNDRAFT) +!! Kain and Fritsch, 1993, Meteor. Monographs, Vol. +!! +!! AUTHOR +!! ------ +!! P. BECHTOLD * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original 07/11/95 +!! Last modified 04/10/97 +!! C.Lac 27/09/10 modification loop index for reproducibility +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_CONVPAR +USE MODD_CONVPAREXT +! +USE MODI_CONVECT_SATMIXRATIO +! +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +! +INTEGER, INTENT(IN) :: KLON ! horizontal dimension +INTEGER, INTENT(IN) :: KLEV ! vertical dimension +INTEGER, INTENT(IN) :: KICE ! flag for ice ( 1 = yes, + ! 0 = no ice ) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PTH ! grid scale theta +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PTHES ! grid scale saturated theta_e +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PRW ! grid scale total water + ! mixing ratio +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PRC ! grid scale r_c (cloud water) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PRI ! grid scale r_i (cloud ice) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PPRES ! pressure (Pa) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PDPRES! pressure difference between + ! bottom and top of layer (Pa) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PZ ! level height (m) +INTEGER, DIMENSION(KLON), INTENT(IN) :: KLCL ! contains vert. index of LCL +INTEGER, DIMENSION(KLON), INTENT(IN) :: KCTL ! contains vert. index of CTL +INTEGER, DIMENSION(KLON), INTENT(IN) :: KETL ! contains vert. index of + ! equilibrium (zero buoyancy) level +INTEGER, DIMENSION(KLON), INTENT(IN) :: KML ! " vert. index of melting level +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PUTHL ! updraft enthalpy (J/kg) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PURW ! updraft total water (kg/kg) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PURC ! updraft r_c (kg/kg) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PURI ! updraft r_i (kg/kg) +REAL, DIMENSION(KLON), INTENT(IN) :: PPREF ! precipitation efficiency +! +! +REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PDMF ! downdraft mass flux (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PDER ! downdraft entrainment (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PDDR ! downdraft detrainment (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PDTHL ! downdraft enthalpy (J/kg) +REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PDRW ! downdraft total water (kg/kg) +REAL, DIMENSION(KLON), INTENT(OUT):: PMIXF ! mixed fraction at LFS +REAL, DIMENSION(KLON), INTENT(OUT):: PDTEVR ! total downdraft evaporation + ! rate at LFS (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PDTEVRF! downdraft evaporation rate +INTEGER, DIMENSION(KLON), INTENT(OUT):: KLFS ! contains vert. index of LFS +INTEGER, DIMENSION(KLON), INTENT(OUT):: KDBL ! contains vert. index of DBL +! +!* 0.2 Declarations of local variables : +! +INTEGER :: IIE, IKB, IKE ! horizontal + vertical loop bounds +INTEGER :: JK, JKP, JKM, JKT ! vertical loop index +INTEGER :: JI, JL ! horizontal loop index +INTEGER :: JITER ! iteration loop index +REAL :: ZRDOCP ! R_d / C_pd +REAL :: ZEPS ! R_d / R_v +! +INTEGER, DIMENSION(KLON) :: IDDT ! top level of detrainm. layer +REAL, DIMENSION(KLON) :: ZTHE ! environm. theta_e (K) +REAL, DIMENSION(KLON) :: ZDT, ZDTP ! downdraft temperature (K) +REAL, DIMENSION(KLON) :: ZCPH ! specific heat C_ph +REAL, DIMENSION(KLON) :: ZLV, ZLS ! latent heat of vaporis., sublim. +REAL, DIMENSION(KLON) :: ZDDT ! thickness (hPa) of detrainm. layer +REAL, DIMENSION(KLON) :: ZPI ! Pi=(P0/P)**(Rd/Cpd) +REAL, DIMENSION(KLON) :: ZWORK1, ZWORK2, ZWORK3, ZWORK4 ! work arrays +LOGICAL, DIMENSION(KLON) :: GWORK1 ! work array +! +! +!------------------------------------------------------------------------------- +! +! 0.3 Set loop bounds +! --------------- +! +IIE = KLON +IKB = 1 + JCVEXB +IKE = KLEV - JCVEXT +! +! +!* 1. Initialize downdraft properties +! ------------------------------- +! +ZRDOCP = XRD / XCPD +ZEPS = XRD / XRV +PDMF(:,:) = 0. +PDER(:,:) = 0. +PDDR(:,:) = 0. +PDRW(:,:) = 0. +PDTHL(:,:) = 0. +PDTEVR(:) = 0. +PMIXF(:) = 0. +ZTHE(:) = 0. +ZDDT(:) = PDPRES(:,IKB+2) +KDBL(:) = IKB + 1 +KLFS(:) = IKB + 1 +IDDT(:) = KDBL(:) + 1 +! +! +!* 2. Determine the LFS by looking for minimum of environmental +! saturated theta_e +! ---------------------------------------------------------- +! +ZWORK1(:) = 900. ! starting value for search of minimum envir. theta_e +DO JK = MINVAL( KLCL(:) ) + 2, MAXVAL( KETL(:) ) + DO JI = 1, IIE + GWORK1(JI) = JK >= KLCL(JI) + 2 .AND. JK < KETL(JI) + IF ( GWORK1(JI) .AND. ZWORK1(JI) > PTHES(JI,JK) ) THEN + KLFS(JI) = JK + ZWORK1(JI) = MIN( ZWORK1(JI), PTHES(JI,JK) ) + END IF + END DO +END DO +! +! +!* 3. Determine the mixed fraction using environmental and updraft +! values of theta_e at LFS +! --------------------------------------------------------- +! +DO JI = 1, IIE + JK = KLFS(JI) + ZPI(JI) = ( XP00 / PPRES(JI,JK) ) ** ZRDOCP + ! compute updraft theta_e + ZWORK3(JI) = PURW(JI,JK) - PURC(JI,JK) - PURI(JI,JK) + ZDT(JI) = PTH(JI,JK) / ZPI(JI) + ZLV(JI) = XLVTT + ( XCPV - XCL ) * ( ZDT(JI) - XTT ) + ZLS(JI) = XLSTT + ( XCPV - XCI ) * ( ZDT(JI) - XTT ) + ZCPH(JI) = XCPD + XCPV * PURW(JI,JK) + ZDT(JI) = ( PUTHL(JI,JK) - ( 1. + PURW(JI,JK) ) * XG * PZ(JI,JK) & + + ZLV(JI) * PURC(JI,JK) + ZLS(JI) * PURI(JI,JK) ) / ZCPH(JI) + ZWORK1(JI) = ZDT(JI) * ZPI(JI) ** ( 1. - 0.28 * ZWORK3(JI) ) & + * EXP( ( 3374.6525 / ZDT(JI) - 2.5403 ) & + * ZWORK3(JI) * ( 1. + 0.81 * ZWORK3(JI) ) ) + ! compute environmental theta_e + ZDT(JI) = PTH(JI,JK) / ZPI(JI) + ZLV(JI) = XLVTT + ( XCPV - XCL ) * ( ZDT(JI) - XTT ) + ZLS(JI) = XLSTT + ( XCPV - XCI ) * ( ZDT(JI) - XTT ) + ZWORK3(JI) = PRW(JI,JK) - PRC(JI,JK) - PRI(JI,JK) + ZCPH(JI) = XCPD + XCPV * PRW(JI,JK) + ZWORK2(JI) = ZDT(JI) * ZPI(JI) ** ( 1. - 0.28 * ZWORK3(JI) ) & + * EXP( ( 3374.6525 / ZDT(JI) - 2.5403 ) & + * ZWORK3(JI) * ( 1. + 0.81 * ZWORK3(JI) ) ) + ! compute mixed fraction + PMIXF(JI) = MAX( 0., ( ZWORK1(JI) - PTHES(JI,JK) ) ) & + / ( ZWORK1(JI) - ZWORK2(JI) + 1.E-10 ) + PMIXF(JI) = MAX(0., MIN( 1., PMIXF(JI) ) ) + ZWORK4(JI) = PPRES(JI,JK) +END DO +! +! +!* 4. Estimate the effect of melting on the downdraft +! --------------------------------------------- +! +ZWORK1(:) = 0. + ! use total solid precipitation +!DO JK = IKB + 1, IKE +! ZWORK1(:) = ZWORK1(:) + PURS(:,JK) ! total snow/hail content +!END DO +! +DO JI = 1, IIE + JK = KLCL(JI) + JKP = KCTL(JI) + ZWORK1(JI) = 0.5 * ( PURW(JI,JK) - PURW(JI,JKP) ) +END DO +! + ! temperature perturbation due to melting at LFS +ZWORK3(:) = 0. +WHERE( KML(:) > IKB + 2 ) + ZWORK3(:) = ZWORK1(:) * ( ZLS(:) - ZLV(:) ) / ZCPH(:) + ZDT(:) = ZDT(:) - ZWORK3(:) * REAL(KICE) +END WHERE +! +! +!* 5. Initialize humidity at LFS as a saturated mixture of +! updraft and environmental air +! ----------------------------------------------------- +! +DO JI = 1, IIE + JK = KLFS(JI) + PDRW(JI,JK) = PMIXF(JI) * PRW(JI,JK) + ( 1. - PMIXF(JI) ) * PURW(JI,JK) + ZWORK2(JI) = PDRW(JI,JK) - ( 1. - PMIXF(JI) ) & + * ( PURC(JI,JK) + PURI(JI,JK) ) +END DO +! +! +!* 6.1 Determine the DBL by looking for level where the envir. +! theta_es at the LFS corrected by melting effects becomes +! larger than envir. value +! --------------------------------------------------------- +! + ! compute satur. mixing ratio for melting corrected temperature +CALL CONVECT_SATMIXRATIO( KLON, ZWORK4, ZDT, ZWORK3, ZLV, ZLS, ZCPH ) +! + ! compute envir. saturated theta_e for melting corrected temperature + ZWORK1(:) = MIN( ZWORK2(:), ZWORK3(:) ) + ZWORK3(:) = ZWORK3(:) * ZWORK4(:) / ( ZWORK3(:) + ZEPS ) ! sat. pressure + ZWORK3(:) = ALOG( ZWORK3(:) / 613.3 ) + ! dewp point temperature + ZWORK3(:) = ( 4780.8 - 32.19 * ZWORK3(:) ) / ( 17.502 - ZWORK3(:) ) + ! adiabatic saturation temperature + ZWORK3(:) = ZWORK3(:) - ( .212 + 1.571E-3 * ( ZWORK3(:) - XTT ) & + - 4.36E-4 * ( ZDT(:) - XTT ) ) * ( ZDT(:) - ZWORK3(:) ) + ZWORK4(:) = SIGN(0.5, ZWORK2(:) - ZWORK3(:) ) + ZDT(:) = ZDT(:) * ( .5 + ZWORK4(:) ) + ( .5 - ZWORK4(:) ) * ZWORK3(:) + ZWORK2(:) = ZDT(:) * ZPI(:) ** ( 1. - 0.28 * ZWORK2(:) ) & + * EXP( ( 3374.6525 / ZDT(:) - 2.5403 ) & + * ZWORK1(:) * ( 1. + 0.81 * ZWORK1(:) ) ) +! +GWORK1(:) = .TRUE. +JKM = MAXVAL( KLFS(:) ) +DO JK = JKM - 1, IKB + 1, -1 + DO JI = 1, IIE + IF ( JK < KLFS(JI) .AND. ZWORK2(JI) > PTHES(JI,JK) .AND. GWORK1(JI) ) THEN + KDBL(JI) = JK + GWORK1(JI) = .FALSE. + END IF + END DO +END DO +! +! +!* 7. Define mass flux and entr/detr. rates at LFS +! ------------------------------------------- +! +DO JI = 1, IIE + JK = KLFS(JI) + ZWORK1(JI) = PPRES(JI,JK) / & + ( XRD * ZDT(JI) * ( 1. + ZEPS * ZWORK1(JI) ) ) ! density + PDMF(JI,JK) = - ( 1. - PPREF(JI) ) * ZWORK1(JI) * XPI * XCRAD * XCRAD + PDTHL(JI,JK)= ZWORK2(JI) ! theta_l is here actually theta_e + ZWORK2(JI) = PDMF(JI,JK) + PDDR(JI,JK) = 0. + PDER(JI,JK) = - PMIXF(JI) * PDMF(JI,JK) +END DO +! +! +! 7.1 Downdraft detrainment is assumed to occur in a layer +! of 60 hPa, determine top level IDDT of this layer +! --------------------------------------------------------- +! +ZWORK1(:) = 0. +DO JK = IKB + 2, JKM + ZWORK1(:) = ZWORK1(:) + PDPRES(:,JK) + !WHERE ( JK > KDBL(:) .AND. ZWORK1(:) <= XZPBL ) + WHERE ( JK > KDBL(:) .AND. JK <= KLCL(:) ) + ZDDT(:) = ZWORK1(:) + IDDT(:) = JK + END WHERE +END DO +! +! +!* 8. Enter loop for downdraft computations. Make a first guess +! of initial downdraft mass flux. +! In the downdraft computations we use theta_es instead of +! enthalpy as it allows to better take into account evaporation +! effects. As the downdraft detrainment rate is zero apart +! from the detrainment layer, we just compute enthalpy +! downdraft from theta_es in this layer. +! ---------------------------------------------------------- +! +! +! +DO JK = JKM - 1, IKB + 1, -1 + JKP = JK + 1 + DO JI = 1, IIE + IF ( JK < KLFS(JI) .AND. JK >= IDDT(JI) ) THEN + PDER(JI,JK) = - ZWORK2(JI) * XENTR * PDPRES(JI,JKP) / XCRAD + ! DER and DPRES are positive + PDMF(JI,JK) = PDMF(JI,JKP) - PDER(JI,JK) + ZPI(JI) = ( XP00 / PPRES(JI,JK) ) ** ZRDOCP + ZDT(JI) = PTH(JI,JK) / ZPI(JI) + ZWORK1(JI) = PRW(JI,JK) - PRC(JI,JK) - PRI(JI,JK) + ZTHE(JI) = ZDT(JI) * ZPI(JI) ** ( 1. - 0.28 * ZWORK1(JI) ) & + * EXP( ( 3374.6525 / ZDT(JI) - 2.5403 ) & + * ZWORK1(JI) * ( 1. + 0.81 * ZWORK1(JI) ) ) + ! PDTHL is here theta_es, later on in this routine this table is + ! reskipped to enthalpy + PDTHL(JI,JK) = ( PDTHL(JI,JKP) * PDMF(JI,JKP) - ZTHE(JI) * PDER(JI,JK) & + ) / ( PDMF(JI,JK) - 1.E-7 ) + PDRW(JI,JK) = ( PDRW(JI,JKP) * PDMF(JI,JKP) - PRW(JI,JK) * PDER(JI,JK) & + ) / ( PDMF(JI,JK) - 1.E-7 ) + END IF + IF ( JK < IDDT(JI) .AND. JK >= KDBL(JI) ) THEN + JL = IDDT(JI) + PDDR(JI,JK) = - PDMF(JI,JL) * PDPRES(JI,JKP) / ZDDT(JI) + PDMF(JI,JK) = PDMF(JI,JKP) + PDDR(JI,JK) + PDTHL(JI,JK) = PDTHL(JI,JKP) + PDRW(JI,JK) = PDRW(JI,JKP) + END IF + END DO +END DO +! +! +!* 9. Calculate total downdraft evaporation +! rate for given mass flux (between DBL and IDDT) +! ----------------------------------------------- +! +PDTEVRF(:,:) = 0. +! Reproducibility +!JKT = MAXVAL( IDDT(:) ) +!DO JK = IKB + 1, JKT +DO JK = IKB + 1, IKE +! + ZPI(:) = ( XP00 / PPRES(:,JK) ) ** ZRDOCP + ZDT(:) = PTH(:,JK) / ZPI(:) +! +!* 9.1 Determine wet bulb temperature at DBL from theta_e. +! The iteration algoritm is similar to that used in +! routine CONVECT_CONDENS +! -------------------------------------------------- +! + DO JITER = 1, 4 + CALL CONVECT_SATMIXRATIO( KLON, PPRES(:,JK), ZDT, ZWORK1, ZLV, ZLS, ZCPH ) + ZDTP(:) = PDTHL(:,JK) / ( ZPI(:) ** ( 1. - 0.28 * ZWORK1(:) ) & + * EXP( ( 3374.6525 / ZDT(:) - 2.5403 ) & + * ZWORK1(:) * ( 1. + 0.81 * ZWORK1(:) ) ) ) + ZDT(:) = 0.4 * ZDTP(:) + 0.6 * ZDT(:) ! force convergence + END DO +! +! +!* 9.2 Sum total downdraft evaporation rate. No evaporation +! if actual humidity is larger than specified one. +! ----------------------------------------------------- +! + ZWORK2(:) = ZWORK1(:) / ZDT(:) * ( XBETAW / ZDT(:) - XGAMW ) ! dr_sat/dT + ZWORK2(:) = ZLV(:) / ZCPH(:) * ZWORK1(:) * ( 1. - XRHDBC ) / & + ( 1. + ZLV(:) / ZCPH(:) * ZWORK2(:) ) ! temperature perturb ! due to evaporation + ZDT(:) = ZDT(:) + ZWORK2(:) +! + CALL CONVECT_SATMIXRATIO( KLON, PPRES(:,JK), ZDT, ZWORK3, ZLV, ZLS, ZCPH ) +! + ZWORK3(:) = ZWORK3(:) * XRHDBC + ZWORK1(:) = MAX( 0., ZWORK3(:) - PDRW(:,JK) ) + PDTEVR(:) = PDTEVR(:) + ZWORK1(:) * PDDR(:,JK) + PDTEVRF(:,JK)= PDTEVRF(:,JK) + ZWORK1(:) * PDDR(:,JK) + ! compute enthalpie and humidity in the detrainment layer + PDRW(:,JK) = MAX( PDRW(:,JK), ZWORK3(:) ) + PDTHL(:,JK) = ( ( XCPD + PDRW(:,JK) * XCPV ) * ZDT(:) & + + ( 1. + PDRW(:,JK) ) * XG * PZ(:,JK) ) +! +END DO +! +! +!* 12. If downdraft does not evaporate any water for specified +! relative humidity, no downdraft is allowed +! --------------------------------------------------------- +! +ZWORK2(:) = 1. +WHERE ( PDTEVR(:) < 1. .OR. KLFS(:) == IKB + 1 ) ZWORK2(:) = 0. +DO JK = IKB, JKM + KDBL(:) = KDBL(:) * INT( ZWORK2(:) ) + ( 1 - INT( ZWORK2(:) ) ) * IKB + KLFS(:) = KLFS(:) * INT( ZWORK2(:) ) + ( 1 - INT( ZWORK2(:) ) ) * IKB + PDMF(:,JK) = PDMF(:,JK) * ZWORK2(:) + PDER(:,JK) = PDER(:,JK) * ZWORK2(:) + PDDR(:,JK) = PDDR(:,JK) * ZWORK2(:) + ZWORK1(:) = REAL( KLFS(:) - JK ) ! use this to reset thl_d + ZWORK1(:) = MAX( 0.,MIN(1.,ZWORK1(:) ) ) ! and rv_d to zero above LFS + PDTHL(:,JK) = PDTHL(:,JK) * ZWORK2(:) * ZWORK1(:) + PDRW(:,JK) = PDRW(:,JK) * ZWORK2(:) * ZWORK1(:) + PDTEVR(:) = PDTEVR(:) * ZWORK2(:) + PDTEVRF(:,JK)= PDTEVRF(:,JK) * ZWORK2(:) +END DO +! +END SUBROUTINE CONVECT_DOWNDRAFT diff --git a/src/mesonh/conv/convect_mixing_funct.f90 b/src/mesonh/conv/convect_mixing_funct.f90 new file mode 100644 index 000000000..ebf25507e --- /dev/null +++ b/src/mesonh/conv/convect_mixing_funct.f90 @@ -0,0 +1,151 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 conv 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ################# + MODULE MODI_CONVECT_MIXING_FUNCT +! ################# +! +INTERFACE +! + SUBROUTINE CONVECT_MIXING_FUNCT( KLON, & + PMIXC, KMF, PER, PDR ) +! +INTEGER, INTENT(IN) :: KLON ! horizontal dimension +INTEGER, INTENT(IN) :: KMF ! switch for dist. function +REAL, DIMENSION(KLON), INTENT(IN) :: PMIXC ! critical mixed fraction +! +REAL, DIMENSION(KLON), INTENT(OUT):: PER ! normalized entrainment rate +REAL, DIMENSION(KLON), INTENT(OUT):: PDR ! normalized detrainment rate +! +END SUBROUTINE CONVECT_MIXING_FUNCT +! +END INTERFACE +! +END MODULE MODI_CONVECT_MIXING_FUNCT +! ######spl + SUBROUTINE CONVECT_MIXING_FUNCT( KLON, & + PMIXC, KMF, PER, PDR ) +! ####################################################### +! +!!**** Determine the area under the distribution function +!! KMF = 1 : gaussian KMF = 2 : triangular distribution function +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to determine the entrainment and +!! detrainment rate by evaluating the are under the distribution +!! function. The integration interval is limited by the critical +!! mixed fraction PMIXC +!! +!! +!! +!!** METHOD +!! ------ +!! Use handbook of mathemat. functions by Abramowitz and Stegun, 1968 +!! +!! +!! +!! EXTERNAL +!! -------- +!! None +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! +!! REFERENCE +!! --------- +!! +!! Book2 of documentation ( routine MIXING_FUNCT) +!! Abramovitz and Stegun (1968), handbook of math. functions +!! +!! AUTHOR +!! ------ +!! P. BECHTOLD * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original 07/11/95 +!! Last modified 04/10/97 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +INTEGER, INTENT(IN) :: KLON ! horizontal dimension +INTEGER, INTENT(IN) :: KMF ! switch for dist. function +REAL, DIMENSION(KLON), INTENT(IN) :: PMIXC ! critical mixed fraction +! +REAL, DIMENSION(KLON), INTENT(OUT):: PER ! normalized entrainment rate +REAL, DIMENSION(KLON), INTENT(OUT):: PDR ! normalized detrainment rate +! +!* 0.2 Declarations of local variables : +! +REAL :: ZSIGMA = 0.166666667 ! standard deviation +REAL :: ZFE = 4.931813949 ! integral normalization +REAL :: ZSQRTP = 2.506628, ZP = 0.33267 ! constants +REAL :: ZA1 = 0.4361836, ZA2 =-0.1201676 ! constants +REAL :: ZA3 = 0.9372980, ZT1 = 0.500498 ! constants +REAL :: ZE45 = 0.01111 ! constant +! +REAL, DIMENSION(KLON) :: ZX, ZY, ZW1, ZW2 ! work variables +REAL :: ZW11 +! +! +!------------------------------------------------------------------------------- +! +! 1. Use gaussian function for KMF=1 +! ------------------------------- +! +IF( KMF == 1 ) THEN + ! ZX(:) = ( PMIXC(:) - 0.5 ) / ZSIGMA + ZX(:) = 6. * PMIXC(:) - 3. + ZW1(:) = 1. / ( 1.+ ZP * ABS ( ZX(:) ) ) + ZY(:) = EXP( -0.5 * ZX(:) * ZX(:) ) + ZW2(:) = ZA1 * ZW1(:) + ZA2 * ZW1(:) * ZW1(:) + & + ZA3 * ZW1(:) * ZW1(:) * ZW1(:) + ZW11 = ZA1 * ZT1 + ZA2 * ZT1 * ZT1 + ZA3 * ZT1 * ZT1 * ZT1 +ENDIF +! +WHERE ( KMF == 1 .AND. ZX(:) >= 0. ) + PER(:) = ZSIGMA * ( 0.5 * ( ZSQRTP - ZE45 * ZW11 & + - ZY(:) * ZW2(:) ) + ZSIGMA * ( ZE45 - ZY(:) ) ) & + - 0.5 * ZE45 * PMIXC(:) * PMIXC(:) + PDR(:) = ZSIGMA*( 0.5 * ( ZY(:) * ZW2(:) - ZE45 * ZW11 ) & + + ZSIGMA * ( ZE45 - ZY(:) ) ) & + - ZE45 * ( 0.5 + 0.5 * PMIXC(:) * PMIXC(:) - PMIXC(:) ) +END WHERE +WHERE ( KMF == 1 .AND. ZX(:) < 0. ) + PER(:) = ZSIGMA*( 0.5 * ( ZY(:) * ZW2(:) - ZE45 * ZW11 ) & + + ZSIGMA * ( ZE45 - ZY(:) ) ) & + - 0.5 * ZE45 * PMIXC(:) * PMIXC(:) + PDR(:) = ZSIGMA * ( 0.5 * ( ZSQRTP - ZE45 * ZW11 - ZY(:) & + * ZW2(:) ) + ZSIGMA * ( ZE45 - ZY(:) ) ) & + - ZE45 * ( 0.5 + 0.5 * PMIXC(:) * PMIXC(:) - PMIXC(:) ) +END WHERE +! + PER(:) = PER(:) * ZFE + PDR(:) = PDR(:) * ZFE +! +! +! 2. Use triangular function KMF=2 +! ------------------------------- +! +! not yet released +! +! +END SUBROUTINE CONVECT_MIXING_FUNCT diff --git a/src/mesonh/conv/convect_precip_adjust.f90 b/src/mesonh/conv/convect_precip_adjust.f90 new file mode 100644 index 000000000..1c32f4d4d --- /dev/null +++ b/src/mesonh/conv/convect_precip_adjust.f90 @@ -0,0 +1,337 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 conv 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ################# + MODULE MODI_CONVECT_PRECIP_ADJUST +! ################# +! +INTERFACE +! + SUBROUTINE CONVECT_PRECIP_ADJUST( KLON, KLEV, & + PPRES, PUMF, PUER, PUDR, & + PUPR, PUTPR, PURW, & + PDMF, PDER, PDDR, PDTHL, PDRW, & + PPREF, PTPR, PMIXF, PDTEVR, & + KLFS, KDBL, KLCL, KCTL, KETL, & + PDTEVRF ) + +! +INTEGER, INTENT(IN) :: KLON ! horizontal dimension +INTEGER, INTENT(IN) :: KLEV ! vertical dimension +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PPRES ! pressure (Pa) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PURW ! updraft total water (kg/kg) +REAL, DIMENSION(KLON), INTENT(IN) :: PUTPR ! updraft total precipit. (kg/s +REAL, DIMENSION(KLON), INTENT(IN) :: PPREF ! precipitation efficiency +REAL, DIMENSION(KLON), INTENT(IN) :: PMIXF ! critical mixed fraction at LCL +INTEGER, DIMENSION(KLON), INTENT(IN) :: KLCL ! contains vert. index of LCL +INTEGER, DIMENSION(KLON), INTENT(IN) :: KCTL ! contains vert. index of CTL +INTEGER, DIMENSION(KLON), INTENT(IN) :: KETL ! contains vert. index of equilibrium + ! (zero buoyancy) level +INTEGER, DIMENSION(KLON), INTENT(INOUT) :: KLFS ! contains vert. index of LFS +INTEGER, DIMENSION(KLON), INTENT(INOUT) :: KDBL ! contains vert. index of DBL +! +REAL, DIMENSION(KLON), INTENT(INOUT) :: PDTEVR ! total downdraft evaporation + ! rate at LFS +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PDTEVRF! downdraft evaporation rate +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PUMF ! updraft mass flux (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PUER ! updraft entrainment (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PUDR ! updraft detrainment (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PUPR ! updraft precipit. (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PDMF ! downdraft mass flux (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PDER ! downdraft entrainment (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PDDR ! downdraft detrainment (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PDTHL ! downdraft enthalpy (J/kg) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PDRW ! downdraft total water (kg/kg) +! +REAL, DIMENSION(KLON), INTENT(OUT) :: PTPR ! total precipitation (kg/s) + ! = downdraft precipitation +! +END SUBROUTINE CONVECT_PRECIP_ADJUST +! +END INTERFACE +! +END MODULE MODI_CONVECT_PRECIP_ADJUST +! ###################################################################### + SUBROUTINE CONVECT_PRECIP_ADJUST( KLON, KLEV, & + PPRES, PUMF, PUER, PUDR, & + PUPR, PUTPR, PURW, & + PDMF, PDER, PDDR, PDTHL, PDRW, & + PPREF, PTPR, PMIXF, PDTEVR, & + KLFS, KDBL, KLCL, KCTL, KETL, & + PDTEVRF ) +! ###################################################################### +! +!!**** Adjust up- and downdraft mass fluxes to be consistent with the +!! mass transport at the LFS given by the precipitation efficiency +!! relation. +!! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to adjust up- and downdraft mass +!! fluxes below the LFS to be consistent with the precipitation +!! efficiency relation +!! +!! +!! +!!** METHOD +!! ------ +!! +!! +!! EXTERNAL +!! -------- +!! None +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! Module MODD_CONVPAREXT +!! JCVEXB, JCVEXT ! extra levels on the vertical boundaries +!! +!! Module MODD_CONVPAR +!! XUSRDPTH ! pressure depth to compute updraft humidity +!! ! supply rate for downdraft +!! +!! REFERENCE +!! --------- +!! +!! Book1,2 of documentation ( routine CONVECT_PRECIP_ADJUST) +!! +!! AUTHOR +!! ------ +!! P. BECHTOLD * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original 07/11/95 +!! Last modified 04/10/97 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CONVPAREXT +USE MODD_CONVPAR +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +! +INTEGER, INTENT(IN) :: KLON ! horizontal dimension +INTEGER, INTENT(IN) :: KLEV ! vertical dimension +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PPRES ! pressure (Pa) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PURW ! updraft total water (kg/kg) +REAL, DIMENSION(KLON), INTENT(IN) :: PUTPR ! updraft total precipit. (kg/s +REAL, DIMENSION(KLON), INTENT(IN) :: PPREF ! precipitation efficiency +REAL, DIMENSION(KLON), INTENT(IN) :: PMIXF ! critical mixed fraction at LCL +INTEGER, DIMENSION(KLON), INTENT(IN) :: KLCL ! contains vert. index of LCL +INTEGER, DIMENSION(KLON), INTENT(IN) :: KCTL ! contains vert. index of CTL +INTEGER, DIMENSION(KLON), INTENT(IN) :: KETL ! contains vert. index of equilibrium + ! (zero buoyancy) level +INTEGER, DIMENSION(KLON), INTENT(INOUT) :: KLFS ! contains vert. index of LFS +INTEGER, DIMENSION(KLON), INTENT(INOUT) :: KDBL ! contains vert. index of DBL +! +REAL, DIMENSION(KLON), INTENT(INOUT) :: PDTEVR ! total downdraft evaporation + ! rate at LFS +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PDTEVRF! downdraft evaporation rate +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PUMF ! updraft mass flux (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PUER ! updraft entrainment (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PUDR ! updraft detrainment (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PUPR ! updraft precipit. (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PDMF ! downdraft mass flux (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PDER ! downdraft entrainment (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PDDR ! downdraft detrainment (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PDTHL ! downdraft enthalpy (J/kg) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT) :: PDRW ! downdraft total water (kg/kg) +! +REAL, DIMENSION(KLON), INTENT(OUT) :: PTPR ! total precipitation (kg/s) + ! = downdraft precipitation +! +!* 0.2 Declarations of local variables : +! +INTEGER :: IIE, IKB, IKE ! horizontal + vertical loop bounds +INTEGER :: JK, JKT1, JKT2, JKT3 ! vertical loop index +INTEGER :: JI ! horizontal loop index +! +INTEGER, DIMENSION(KLON) :: IPRL +REAL, DIMENSION(KLON) :: ZWORK1, ZWORK2, ZWORK3, & + ZWORK4, ZWORK5, ZWORK6 ! work arrays +! +! +!------------------------------------------------------------------------------- +! +! 0.3 Set loop bounds +! --------------- +! +IKB = 1 + JCVEXB +IKE = KLEV - JCVEXT +IIE = KLON +JKT1 = MAXVAL( KLFS(:) ) +JKT2 = MAXVAL( KCTL(:) ) +JKT3 = MINVAL( KLCL(:) ) +! +! +! 1. Set some output variables for columns where no downdraft +! exists. Exit if there is no downdraft at all. +! -------------------------------------------------------- +! +IPRL(:) = IKB +PTPR(:) = 0. +! +WHERE ( PDTEVR(:) == 0. ) + PTPR(:) = PUTPR(:) ! no downdraft evaporation => no downdraft, all + ! precipitation occurs in updraft +END WHERE +IF ( COUNT( PDTEVR(:) > 0. ) == 0 ) THEN ! exit routine if no downdraft exists + RETURN +ENDIF +! +!* 2. The total mass transported from the updraft to the down- +! draft at the LFS must be consistent with the three water +! budget terms : +! --------------------------------------------------------- +! +!* 2.1 Downdraft evaporation rate at the DBL. The evaporation +! rate in downdraft must be consistent with precipitation +! efficiency relation. +! -------------------------------------------------------- +! +! +DO JI = 1, IIE + JK = KLFS(JI) + ZWORK1(JI) = PDTEVR(JI) / MIN( -1.E-1, PDMF(JI,JK) ) + ZWORK6(JI) = PDMF(JI,JK) +END DO +! +!* 2.2 Some preliminar computations for downdraft = total +! precipitation rate. The precipitation is evaluated in +! a layer thickness DP=XUSRDPTH=165 hPa above the LCL. +! The difference between updraft precipitation and downdraft +! precipitation (updraft supply rate) is used to drive the +! downdraft through evaporational cooling. +! -------------------------------------------------------- +! +DO JI = 1, IIE + JK = KLCL(JI) + ZWORK5(JI) = PPRES(JI,JK) +END DO +! +PTPR(:) = 0. +DO JK = JKT3, JKT2 + WHERE ( JK >= KLCL(:) .AND. PPRES(:,JK) >= ZWORK5(:) - XUSRDPTH ) + PTPR(:) = PTPR(:) + PUPR(:,JK) + IPRL(:) = JK + END WHERE +END DO +IPRL(:) = MIN( KETL(:), IPRL(:) ) +! +DO JI = 1, IIE + JK = IPRL(JI) + PTPR(JI) = PUMF(JI,JK+1) * PURW(JI,JK+1) + PTPR(JI) +END DO +! +PTPR(:) = PPREF(:) * MIN( PUTPR(:), PTPR(:) ) +ZWORK4(:) = PUTPR(:) - PTPR(:) +! +! +!* 2.3 Total amount of precipitation that falls out of the up- +! draft between the LCL and the LFS. +! Condensate transfer from up to downdraft at LFS +! --------------------------------------------------------- +! +ZWORK5(:) = 0. +DO JK = JKT3, JKT1 + WHERE ( JK >= KLCL(:) .AND. JK <= KLFS(:) ) + ZWORK5(:) = ZWORK5(:) + PUPR(:,JK) + END WHERE +END DO +! +DO JI = 1, IIE + JK = KLFS(JI) + ZWORK2(JI) = ( 1. - PPREF(JI) ) * ZWORK5(JI) * & + ( 1. - PMIXF(JI) ) / MAX( 1.E-1, PUMF(JI,JK) ) +END DO +! +! +!* 2.4 Increase the first guess downdraft mass flux to satisfy +! precipitation efficiency relation. +! If downdraft does not evaporate any water at the DBL for +! the specified relative humidity, or if the corrected mass +! flux at the LFS is positive no downdraft is allowed +! --------------------------------------------------------- +! +! +!ZWORK1(:) = ZWORK4(:) / ( ZWORK1(:) + ZWORK2(:) + 1.E-8 ) +ZWORK1(:) = -ZWORK4(:) / ( -ZWORK1(:) + ZWORK2(:) + 1.E-8 ) +ZWORK2(:) = ZWORK1(:) / MIN( -1.E-1, ZWORK6(:) ) ! ratio of budget consistent to actual DMF +! +ZWORK3(:) = 1. +ZWORK6(:) = 1. +WHERE ( ZWORK1(:) > 0. .OR. PDTEVR(:) < 1. ) + KDBL(:) = IKB + KLFS(:) = IKB + PDTEVR(:) = 0. + ZWORK2(:) = 0. + ZWORK3(:) = 0. + ZWORK6(:) = 0. +END WHERE +! +DO JK = IKB, JKT1 + PDMF(:,JK) = PDMF(:,JK) * ZWORK2(:) + PDER(:,JK) = PDER(:,JK) * ZWORK2(:) + PDDR(:,JK) = PDDR(:,JK) * ZWORK2(:) + PDTEVRF(:,JK) = PDTEVRF(:,JK)* ZWORK2(:) + PDRW(:,JK) = PDRW(:,JK) * ZWORK3(:) + PDTHL(:,JK) = PDTHL(:,JK) * ZWORK3(:) +END DO +ZWORK4(:) = ZWORK2(:) +! +! +!* 3. Increase updraft mass flux, mass detrainment rate, and water +! substance detrainment rates to be consistent with the transfer +! of the estimated mass from the up- to the downdraft at the LFS +! -------------------------------------------------------------- +! +DO JI = 1, IIE + JK = KLFS(JI) + ZWORK2(JI) = ( 1. - ZWORK6(JI) ) + ZWORK6(JI) * & + ( PUMF(JI,JK) - ( 1. - PMIXF(JI) ) * ZWORK1(JI) ) / & + MAX( 1.E-1, PUMF(JI,JK) ) +END DO +! +! +JKT1 = MAXVAL( KLFS(:) ) ! value of KLFS might have been reset to IKB above +DO JK = IKB, JKT1 + DO JI = 1, IIE + IF ( JK <= KLFS(JI) ) THEN + PUMF(JI,JK) = PUMF(JI,JK) * ZWORK2(JI) + PUER(JI,JK) = PUER(JI,JK) * ZWORK2(JI) + PUDR(JI,JK) = PUDR(JI,JK) * ZWORK2(JI) + PUPR(JI,JK) = PUPR(JI,JK) * ZWORK2(JI) + END IF + END DO +END DO +! +! +!* 4. Increase total = downdraft precipitation and evaporation rate +! ------------------------------------------------------------- +! +WHERE ( PDTEVR(:) > 0. ) + PTPR(:) = PTPR(:) + PPREF(:) * ZWORK5(:) * ( ZWORK2(:) - 1. ) + PDTEVR(:) = PUTPR(:) - PTPR(:) + PDTEVRF(:,IKB+1) = PDTEVR(:) +ELSEWHERE + PTPR(:) = PUTPR(:) +END WHERE +! +! +END SUBROUTINE CONVECT_PRECIP_ADJUST diff --git a/src/mesonh/conv/convect_satmixratio.f90 b/src/mesonh/conv/convect_satmixratio.f90 new file mode 100644 index 000000000..c6f4e5475 --- /dev/null +++ b/src/mesonh/conv/convect_satmixratio.f90 @@ -0,0 +1,122 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 conv 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ################# + MODULE MODI_CONVECT_SATMIXRATIO +! ################# +! +INTERFACE +! + SUBROUTINE CONVECT_SATMIXRATIO( KLON, & + PPRES, PT, PEW, PLV, PLS, PCPH ) +! +INTEGER, INTENT(IN) :: KLON ! horizontal loop index +REAL, DIMENSION(KLON), INTENT(IN) :: PPRES ! pressure +REAL, DIMENSION(KLON), INTENT(IN) :: PT ! temperature +! +REAL, DIMENSION(KLON), INTENT(OUT):: PEW ! vapor saturation mixing ratio +REAL, DIMENSION(KLON), INTENT(OUT):: PLV ! latent heat L_v +REAL, DIMENSION(KLON), INTENT(OUT):: PLS ! latent heat L_s +REAL, DIMENSION(KLON), INTENT(OUT):: PCPH ! specific heat C_ph +! +END SUBROUTINE CONVECT_SATMIXRATIO +! +END INTERFACE +! +END MODULE MODI_CONVECT_SATMIXRATIO +! ######spl + SUBROUTINE CONVECT_SATMIXRATIO( KLON, & + PPRES, PT, PEW, PLV, PLS, PCPH ) +! ################################################################ +! +!!**** Compute vapor saturation mixing ratio over liquid water +!! +!! +!! PDRPOSE +!! ------- +!! The purpose of this routine is to determine saturation mixing ratio +!! and to return values for L_v L_s and C_ph +!! +!! +!!** METHOD +!! ------ +!! +!! +!! EXTERNAL +!! -------- +!! None +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST +!! XALPW, XBETAW, XGAMW ! constants for water saturation pressure +!! XRD, XRV ! gaz constants for dry air and water vapor +!! XCPD, XCPV ! specific heat for dry air and water vapor +!! XCL, XCI ! specific heat for liquid water and ice +!! XTT ! triple point temperature +!! XLVTT, XLSTT ! vaporization, sublimation heat constant +!! +!! +!! REFERENCE +!! --------- +!! +!! Book1,2 of documentation ( routine CONVECT_SATMIXRATIO) +!! +!! AUTHOR +!! ------ +!! P. BECHTOLD * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original 07/11/95 +!! Last modified 04/10/97 +!------------------------- ------------------------------------------------------ +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +! +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +! +INTEGER, INTENT(IN) :: KLON ! horizontal loop index +REAL, DIMENSION(KLON), INTENT(IN) :: PPRES ! pressure +REAL, DIMENSION(KLON), INTENT(IN) :: PT ! temperature +! +REAL, DIMENSION(KLON), INTENT(OUT):: PEW ! vapor saturation mixing ratio +REAL, DIMENSION(KLON), INTENT(OUT):: PLV ! latent heat L_v +REAL, DIMENSION(KLON), INTENT(OUT):: PLS ! latent heat L_s +REAL, DIMENSION(KLON), INTENT(OUT):: PCPH ! specific heat C_ph +! +!* 0.2 Declarations of local variables : +! +REAL, DIMENSION(KLON) :: ZT ! temperature +REAL :: ZEPS ! R_d / R_v +! +! +!------------------------------------------------------------------------------- +! + ZEPS = XRD / XRV +! + ZT(:) = MIN( 400., MAX( PT(:), 10. ) ) ! overflow bound + PEW(:) = EXP( XALPW - XBETAW / ZT(:) - XGAMW * ALOG( ZT(:) ) ) + PEW(:) = ZEPS * PEW(:) / ( PPRES(:) - PEW(:) ) +! + PLV(:) = XLVTT + ( XCPV - XCL ) * ( ZT(:) - XTT ) ! compute L_v + PLS(:) = XLSTT + ( XCPV - XCI ) * ( ZT(:) - XTT ) ! compute L_i +! + PCPH(:) = XCPD + XCPV * PEW(:) ! compute C_ph +! +END SUBROUTINE CONVECT_SATMIXRATIO diff --git a/src/mesonh/conv/convect_trigger_funct.f90 b/src/mesonh/conv/convect_trigger_funct.f90 new file mode 100644 index 000000000..39ee732ff --- /dev/null +++ b/src/mesonh/conv/convect_trigger_funct.f90 @@ -0,0 +1,454 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 conv 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ################# + MODULE MODI_CONVECT_TRIGGER_FUNCT +! ################# +! +INTERFACE +! + SUBROUTINE CONVECT_TRIGGER_FUNCT( KLON, KLEV, & + PPRES, PTH, PTHV, PTHES, & + PRV, PW, PZ, PDXDY, & + PTHLCL, PTLCL, PRVLCL, PWLCL, PZLCL, & + PTHVELCL, KLCL, KDPL, KPBL, OTRIG, & + PCAPE ) +! +INTEGER, INTENT(IN) :: KLON ! horizontal loop index +INTEGER, INTENT(IN) :: KLEV ! vertical loop index +REAL, DIMENSION(KLON), INTENT(IN) :: PDXDY ! grid area +REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PTH, PTHV ! theta, theta_v +REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PTHES ! envir. satur. theta_e +REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PRV ! vapor mixing ratio +REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PPRES ! pressure +REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PZ ! height of grid point (m) +REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PW ! vertical velocity +! +REAL, DIMENSION(KLON), INTENT(OUT):: PTHLCL ! theta at LCL +REAL, DIMENSION(KLON), INTENT(OUT):: PTLCL ! temp. at LCL +REAL, DIMENSION(KLON), INTENT(OUT):: PRVLCL ! vapor mixing ratio at LCL +REAL, DIMENSION(KLON), INTENT(OUT):: PWLCL ! parcel velocity at LCL +REAL, DIMENSION(KLON), INTENT(OUT):: PZLCL ! height at LCL (m) +REAL, DIMENSION(KLON), INTENT(OUT):: PTHVELCL ! environm. theta_v at LCL (K) +LOGICAL, DIMENSION(KLON), INTENT(OUT):: OTRIG ! logical mask for convection +INTEGER, DIMENSION(KLON), INTENT(INOUT):: KLCL ! contains vert. index of LCL +INTEGER, DIMENSION(KLON), INTENT(INOUT):: KDPL ! contains vert. index of DPL +INTEGER, DIMENSION(KLON), INTENT(INOUT):: KPBL ! contains index of source layer top +REAL, DIMENSION(KLON), INTENT(OUT):: PCAPE ! CAPE (J/kg) for diagnostics +! +END SUBROUTINE CONVECT_TRIGGER_FUNCT +! +END INTERFACE +! +END MODULE MODI_CONVECT_TRIGGER_FUNCT +! ######################################################################### + SUBROUTINE CONVECT_TRIGGER_FUNCT( KLON, KLEV, & + PPRES, PTH, PTHV, PTHES, & + PRV, PW, PZ, PDXDY, & + PTHLCL, PTLCL, PRVLCL, PWLCL, PZLCL, & + PTHVELCL, KLCL, KDPL, KPBL, OTRIG, & + PCAPE ) +! ######################################################################### +! +!!**** Determine convective columns as well as the cloudy values of theta, +!! and qv at the lifting condensation level (LCL) +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to determine convective columns +!! +!! +!! +!!** METHOD +!! ------ +!! Computations are done at every model level starting from bottom. +!! The use of masks allows to optimise the inner loops (horizontal loops). +!! What we look for is the undermost unstable level at each grid point. +!! +!! +!! +!! EXTERNAL +!! -------- +!! Routine CONVECT_SATMIXRATIO +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST +!! XG ! gravity constant +!! XP00 ! Reference pressure +!! XRD, XRV ! Gaz constants for dry air and water vapor +!! XCPD ! Cpd (dry air) +!! XTT ! triple point temperature +!! XBETAW, XGAMW ! constants for vapor saturation pressure +!! +!! Module MODD_CONVPAR +!! XA25 ! reference grid area +!! XZLCL ! maximum height difference between +!! ! the surface and the DPL +!! XZPBL ! minimum mixed layer depth to sustain convection +!! XWTRIG ! constant in vertical velocity trigger +!! XCDEPTH ! minimum necessary cloud depth +!! XNHGAM ! coefficient for buoyancy term in w eq. +!! ! accounting for nh-pressure +!! +!! Module MODD_CONVPAREXT +!! JCVEXB, JCVEXT ! extra levels on the vertical boundaries +!! +!! REFERENCE +!! --------- +!! +!! Book2 of documentation ( routine TRIGGER_FUNCT) +!! Fritsch and Chappell (1980), J. Atm. Sci., Vol. 37, 1722-1761. +!! +!! AUTHOR +!! ------ +!! P. BECHTOLD * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original 07/11/95 +!! Last modified 20/03/97 Select first departure level +!! that produces a cloud thicker than XCDEPTH +!! Last modified 12/12/97 add small perturbation +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_CONVPAR +USE MODD_CONVPAREXT +USE MODI_CONVECT_SATMIXRATIO +! +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +INTEGER, INTENT(IN) :: KLON ! horizontal loop index +INTEGER, INTENT(IN) :: KLEV ! vertical loop index +REAL, DIMENSION(KLON), INTENT(IN) :: PDXDY ! grid area +REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PTH, PTHV ! theta, theta_v +REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PTHES ! envir. satur. theta_e +REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PRV ! vapor mixing ratio +REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PPRES ! pressure +REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PZ ! height of grid point (m) +REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PW ! vertical velocity +! +REAL, DIMENSION(KLON), INTENT(OUT):: PTHLCL ! theta at LCL +REAL, DIMENSION(KLON), INTENT(OUT):: PTLCL ! temp. at LCL +REAL, DIMENSION(KLON), INTENT(OUT):: PRVLCL ! vapor mixing ratio at LCL +REAL, DIMENSION(KLON), INTENT(OUT):: PWLCL ! parcel velocity at LCL +REAL, DIMENSION(KLON), INTENT(OUT):: PZLCL ! height at LCL (m) +REAL, DIMENSION(KLON), INTENT(OUT):: PTHVELCL ! environm. theta_v at LCL (K) +LOGICAL, DIMENSION(KLON), INTENT(OUT):: OTRIG ! logical mask for convection +INTEGER, DIMENSION(KLON), INTENT(INOUT):: KLCL ! contains vert. index of LCL +INTEGER, DIMENSION(KLON), INTENT(INOUT):: KDPL ! contains vert. index of DPL +INTEGER, DIMENSION(KLON), INTENT(INOUT):: KPBL ! contains index of source layer top +REAL, DIMENSION(KLON), INTENT(OUT):: PCAPE ! CAPE (J/kg) for diagnostics +! +!* 0.2 Declarations of local variables : +! +INTEGER :: JKK, JK, JKP, JKM, JKDL, JL, JKT, JT! vertical loop index +INTEGER :: JI ! horizontal loop index +INTEGER :: IIE, IKB, IKE ! horizontal + vertical loop bounds +REAL :: ZEPS, ZEPSA ! R_d / R_v, R_v / R_d +REAL :: ZCPORD, ZRDOCP ! C_pd / R_d, R_d / C_pd +! +REAL, DIMENSION(KLON) :: ZTHLCL, ZTLCL, ZRVLCL, & ! locals for PTHLCL,PTLCL + ZWLCL, ZZLCL, ZTHVELCL ! PRVLCL, .... +INTEGER, DIMENSION(KLON) :: IDPL, IPBL, ILCL ! locals for KDPL, ... +REAL, DIMENSION(KLON) :: ZPLCL ! pressure at LCL +REAL, DIMENSION(KLON) :: ZZDPL ! height of DPL +REAL, DIMENSION(KLON) :: ZTHVLCL ! theta_v at LCL = mixed layer value +REAL, DIMENSION(KLON) :: ZTMIX ! mixed layer temperature +REAL, DIMENSION(KLON) :: ZEVMIX ! mixed layer water vapor pressure +REAL, DIMENSION(KLON) :: ZDPTHMIX, ZPRESMIX ! mixed layer depth and pressure +REAL, DIMENSION(KLON) :: ZCAPE ! convective available energy (m^2/s^2/g) +REAL, DIMENSION(KLON) :: ZTHEUL ! updraft equiv. pot. temperature (K) +REAL, DIMENSION(KLON) :: ZLV, ZCPH! specific heats of vaporisation, dry air +REAL, DIMENSION(KLON) :: ZDP ! pressure between LCL and model layer +REAL, DIMENSION(KLON) :: ZTOP ! estimated cloud top (m) +REAL, DIMENSION(KLON,KLEV):: ZCAP ! CAPE at every level for diagnostics +REAL, DIMENSION(KLON) :: ZWORK1, ZWORK2, ZWORK3 ! work arrays +LOGICAL, DIMENSION(KLON) :: GTRIG, GTRIG2 ! local arrays for OTRIG +LOGICAL, DIMENSION(KLON) :: GWORK1 ! work array +! +! +!------------------------------------------------------------------------------- +! +!* 0.3 Compute array bounds +! -------------------- +! +IIE = KLON +IKB = 1 + JCVEXB +IKE = KLEV - JCVEXT +! +! +!* 1. Initialize local variables +! -------------------------- +! +ZEPS = XRD / XRV +ZEPSA = XRV / XRD +ZCPORD = XCPD / XRD +ZRDOCP = XRD / XCPD +OTRIG(:) = .FALSE. +IDPL(:) = KDPL(:) +IPBL(:) = KPBL(:) +ILCL(:) = KLCL(:) +PWLCL(:) = 0. +ZWLCL(:) = 0. +PTHLCL(:) = 1. +PTHVELCL(:)= 1. +PTLCL(:) = 1. +PRVLCL(:) = 0. +PWLCL(:) = 0. +PZLCL(:) = PZ(:,IKB) +ZZDPL(:) = PZ(:,IKB) +GTRIG2(:) = .TRUE. +ZCAP(:,:) = 0. +! +! +! +! 1. Determine highest necessary loop test layer +! ------------------------------------------- +! +JT = IKE - 2 +DO JK = IKB + 1, IKE - 2 + IF ( PZ(1,JK) - PZ(1,IKB) < 12.E3 ) JT = JK +END DO +! +! +!* 2. Enter loop for convection test +! ------------------------------ +! +JKP = MINVAL( IDPL(:) ) + 1 +JKT = JT +DO JKK = JKP, JKT +! + GWORK1(:) = ZZDPL(:) - PZ(:,IKB) < XZLCL + ! we exit the trigger test when the center of the mixed layer is more + ! than 3500 m above soil level. + WHERE ( GWORK1(:) ) + ZDPTHMIX(:) = 0. + ZPRESMIX(:) = 0. + ZTHLCL(:) = 0. + ZRVLCL(:) = 0. + ZZDPL(:) = PZ(:,JKK) + IDPL(:) = JKK + END WHERE +! +! +!* 3. Construct a mixed layer of at least 60 hPa (XZPBL) +! ------------------------------------------ +! + DO JK = JKK, IKE - 1 + JKM = JK + 1 + DO JI = 1, IIE + IF ( GWORK1(JI) .AND. ZDPTHMIX(JI) < XZPBL ) THEN + IPBL(JI) = JK + ZWORK1(JI) = PPRES(JI,JK) - PPRES(JI,JKM) + ZDPTHMIX(JI) = ZDPTHMIX(JI) + ZWORK1(JI) + ZPRESMIX(JI) = ZPRESMIX(JI) + PPRES(JI,JK) * ZWORK1(JI) + ZTHLCL(JI) = ZTHLCL(JI) + PTH(JI,JK) * ZWORK1(JI) + ZRVLCL(JI) = ZRVLCL(JI) + PRV(JI,JK) * ZWORK1(JI) + END IF + END DO + IF ( MINVAL ( ZDPTHMIX(:) ) >= XZPBL ) EXIT + END DO +! +! + WHERE ( GWORK1(:) ) +! + ZPRESMIX(:) = ZPRESMIX(:) / ZDPTHMIX(:) + ZTHLCL(:) = ZTHLCL(:) / ZDPTHMIX(:) +.3 ! add small perturbation + ZRVLCL(:) = ZRVLCL(:) / ZDPTHMIX(:) +1.e-4 + ZTHVLCL(:) = ZTHLCL(:) * ( 1. + ZEPSA * ZRVLCL(:) ) & + / ( 1. + ZRVLCL(:) ) +! +!* 4.1 Use an empirical direct solution ( Bolton formula ) +! to determine temperature and pressure at LCL. +! Nota: the adiabatic saturation temperature is not +! equal to the dewpoint temperature +! ---------------------------------------------------- +! +! + ZTMIX(:) = ZTHLCL(:) * ( ZPRESMIX(:) / XP00 ) ** ZRDOCP + ZEVMIX(:) = ZRVLCL(:) * ZPRESMIX(:) / ( ZRVLCL(:) + ZEPS ) + ZEVMIX(:) = MAX( 1.E-8, ZEVMIX(:) ) + ZWORK1(:) = LOG( ZEVMIX(:) / 613.3 ) + ! dewpoint temperature + ZWORK1(:) = ( 4780.8 - 32.19 * ZWORK1(:) ) / ( 17.502 - ZWORK1(:) ) + ! adiabatic saturation temperature + ZTLCL(:) = ZWORK1(:) - ( .212 + 1.571E-3 * ( ZWORK1(:) - XTT ) & + - 4.36E-4 * ( ZTMIX(:) - XTT ) ) * ( ZTMIX(:) - ZWORK1(:) ) + ZTLCL(:) = MIN( ZTLCL(:), ZTMIX(:) ) + ZPLCL(:) = XP00 * ( ZTLCL(:) / ZTHLCL(:) ) ** ZCPORD +! + END WHERE +! +! +!* 4.2 Correct ZTLCL in order to be completely consistent +! with MNH saturation formula +! --------------------------------------------- +! + CALL CONVECT_SATMIXRATIO( KLON, ZPLCL, ZTLCL, ZWORK1, ZLV, ZWORK2, ZCPH ) + WHERE( GWORK1(:) ) + ZWORK2(:) = ZWORK1(:) / ZTLCL(:) * ( XBETAW / ZTLCL(:) - XGAMW ) ! dr_sat/dT + ZWORK2(:) = ( ZWORK1(:) - ZRVLCL(:) ) / & + ( 1. + ZLV(:) / ZCPH(:) * ZWORK2(:) ) + ZTLCL(:) = ZTLCL(:) - ZLV(:) / ZCPH(:) * ZWORK2(:) +! + END WHERE +! +! +!* 4.3 If ZRVLCL = PRVMIX is oversaturated set humidity +! and temperature to saturation values. +! --------------------------------------------- +! + CALL CONVECT_SATMIXRATIO( KLON, ZPRESMIX, ZTMIX, ZWORK1, ZLV, ZWORK2, ZCPH ) + WHERE( GWORK1(:) .AND. ZRVLCL(:) > ZWORK1(:) ) + ZWORK2(:) = ZWORK1(:) / ZTMIX(:) * ( XBETAW / ZTMIX(:) - XGAMW ) ! dr_sat/dT + ZWORK2(:) = ( ZWORK1(:) - ZRVLCL(:) ) / & + ( 1. + ZLV(:) / ZCPH(:) * ZWORK2(:) ) + ZTLCL(:) = ZTMIX(:) - ZLV(:) / ZCPH(:) * ZWORK2(:) + ZRVLCL(:) = ZRVLCL(:) - ZWORK2(:) + ZPLCL(:) = ZPRESMIX(:) + ZTHLCL(:) = ZTLCL(:) * ( XP00 / ZPLCL(:) ) ** ZRDOCP + ZTHVLCL(:)= ZTHLCL(:) * ( 1. + ZEPSA * ZRVLCL(:) ) & + / ( 1. + ZRVLCL(:) ) + END WHERE +! +! +!* 5.1 Determine vertical loop index at the LCL and DPL +! -------------------------------------------------- +! + DO JK = JKK, IKE - 1 + DO JI = 1, IIE + IF ( ZPLCL(JI) <= PPRES(JI,JK) .AND. GWORK1(JI) ) ILCL(JI) = JK + 1 + END DO + END DO +! +! +!* 5.2 Estimate height and environm. theta_v at LCL +! -------------------------------------------------- +! + DO JI = 1, IIE + JK = ILCL(JI) + JKM = JK - 1 + ZDP(JI) = LOG( ZPLCL(JI) / PPRES(JI,JKM) ) / & + LOG( PPRES(JI,JK) / PPRES(JI,JKM) ) + ZWORK1(JI) = PTHV(JI,JKM) + ( PTHV(JI,JK) - PTHV(JI,JKM) ) * ZDP(JI) + ! we compute the precise value of the LCL + ! The precise height is between the levels ILCL and ILCL-1. + ZWORK2(JI) = PZ(JI,JKM) + ( PZ(JI,JK) - PZ(JI,JKM) ) * ZDP(JI) + END DO + WHERE( GWORK1(:) ) + ZTHVELCL(:) = ZWORK1(:) + ZZLCL(:) = ZWORK2(:) + END WHERE +! +! +!* 6. Check to see if cloud is bouyant +! -------------------------------- +! +!* 6.1 Compute grid scale vertical velocity perturbation term ZWORK1 +! ------------------------------------------------------------- +! + ! normalize w grid scale to a 25 km refer. grid + DO JI = 1, IIE + JK = ILCL(JI) + JKM = JK - 1 + JKDL= IDPL(JI) + !ZWORK1(JI) = ( PW(JI,JKM) + ( PW(JI,JK) - PW(JI,JKM) ) * ZDP(JI) ) & + ZWORK1(JI) = ( PW(JI,JK) + PW(JI,JKDL)*ZZLCL(JI)/PZ(JI,JKDL) ) * .5 & + * SQRT( PDXDY(JI) / XA25 ) +! - 0.02 * ZZLCL(JI) / XZLCL ! avoid spurious convection + END DO + ! compute sign of normalized grid scale w + ZWORK2(:) = SIGN( 1., ZWORK1(:) ) + ZWORK1(:) = XWTRIG * ZWORK2(:) * ABS( ZWORK1(:) ) ** 0.333 & + * ( XP00 / ZPLCL(:) ) ** ZRDOCP +! +!* 6.2 Compute parcel vertical velocity at LCL +! --------------------------------------- +! + DO JI = 1, IIE + JKDL = IDPL(JI) + ZWORK3(JI) = XG * ZWORK1(JI) * ( ZZLCL(JI) - PZ(JI,JKDL) ) & + / ( PTHV(JI,JKDL) + ZTHVELCL(JI) ) + END DO + WHERE( GWORK1(:) ) + ZWLCL(:) = 1. + .5 * ZWORK2(:) * SQRT( ABS( ZWORK3(:) ) ) + GTRIG(:) = ZTHVLCL(:) - ZTHVELCL(:) + ZWORK1(:) > 0. .AND. & + ZWLCL(:) > 0. + END WHERE +! +! +!* 6.3 Look for parcel that produces sufficient cloud depth. +! The cloud top is estimated as the level where the CAPE +! is smaller than a given value (based on vertical velocity eq.) +! -------------------------------------------------------------- +! + ZTHEUL(:) = ZTLCL(:) * ( ZTHLCL(:) / ZTLCL(:) ) & + ** ( 1. - 0.28 * ZRVLCL(:) ) & + * EXP( ( 3374.6525 / ZTLCL(:) - 2.5403 ) * & + ZRVLCL(:) * ( 1. + 0.81 * ZRVLCL(:) ) ) +! + ZCAPE(:) = 0. + ZTOP(:) = 0. + ZWORK3(:)= 0. + JKM = MINVAL( ILCL(:) ) + DO JL = JKM, JT + JK = JL + 1 + DO JI = 1, IIE + ZWORK1(JI) = ( 2. * ZTHEUL(JI) / & + ( PTHES(JI,JK) + PTHES(JI,JL) ) - 1. ) * ( PZ(JI,JK) - PZ(JI,JL) ) + IF ( JL < ILCL(JI) ) ZWORK1(JI) = 0. + ! IF ( JL <= ILCL(JI) ) ZWORK1(JI) = 0. + ZCAPE(JI) = ZCAPE(JI) + ZWORK1(JI) + ZCAP(JI,JKK) = ZCAP(JI,JKK) + XG * MAX( 0., ZWORK1(JI) ) ! actual CAPE + ZWORK2(JI) = XNHGAM * XG * ZCAPE(JI) + 1.05 * ZWLCL(JI) * ZWLCL(JI) + ! the factor 1.05 takes entrainment into account + ZWORK2(JI) = SIGN( 1., ZWORK2(JI) ) + ZWORK3(JI) = ZWORK3(JI) + MIN(0., ZWORK2(JI) ) + ZWORK3(JI) = MAX( -1., ZWORK3(JI) ) + ! Nota, the factors ZWORK2 and ZWORK3 are only used to avoid + ! if and goto statements, the difficulty is to extract only + ! the level where the criterium is first fullfilled + ZTOP(JI) = PZ(JI,JL) * .5 * ( 1. + ZWORK2(JI) ) * ( 1. + ZWORK3(JI) ) + & + ZTOP(JI) * .5 * ( 1. - ZWORK2(JI) ) + END DO + END DO +! +! + WHERE( ZTOP(:) - ZZLCL(:) .GE. XCDEPTH .AND. GTRIG(:) .AND. GTRIG2(:) ) + GTRIG2(:) = .FALSE. + OTRIG(:) = GTRIG(:) ! we select the first departure level + PTHLCL(:) = ZTHLCL(:) ! that gives sufficient cloud depth + PRVLCL(:) = ZRVLCL(:) + PTLCL(:) = ZTLCL(:) + PWLCL(:) = ZWLCL(:) + PZLCL(:) = ZZLCL(:) + PTHVELCL(:) = ZTHVELCL(:) + KDPL(:) = IDPL(:) + KPBL(:) = IPBL(:) + KLCL(:) = ILCL(:) + END WHERE +! +END DO +! + DO JI = 1, IIE + PCAPE(JI) = MAXVAL( ZCAP(JI,:) ) ! maximum CAPE for diagnostics + END DO +! +! +END SUBROUTINE CONVECT_TRIGGER_FUNCT diff --git a/src/mesonh/conv/convect_trigger_shal.f90 b/src/mesonh/conv/convect_trigger_shal.f90 new file mode 100644 index 000000000..d99b011a2 --- /dev/null +++ b/src/mesonh/conv/convect_trigger_shal.f90 @@ -0,0 +1,461 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 conv 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ################# + MODULE MODI_CONVECT_TRIGGER_SHAL +! ################# +! +INTERFACE +! + SUBROUTINE CONVECT_TRIGGER_SHAL( KLON, KLEV, & + PPRES, PTH, PTHV, PTHES, & + PRV, PW, PZ, PDXDY,PTKECLS, & + PTHLCL, PTLCL, PRVLCL, PWLCL, PZLCL, & + PTHVELCL, KLCL, KDPL, KPBL, OTRIG ) +! +INTEGER, INTENT(IN) :: KLON ! horizontal loop index +INTEGER, INTENT(IN) :: KLEV ! vertical loop index +REAL, DIMENSION(KLON), INTENT(IN) :: PDXDY ! grid area +REAL, DIMENSION(KLON), INTENT(IN) :: PTKECLS ! TKE CLS +REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PTH, PTHV ! theta, theta_v +REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PTHES ! envir. satur. theta_e +REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PRV ! vapor mixing ratio +REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PPRES ! pressure +REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PZ ! height of grid point (m) +REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PW ! vertical velocity +! +REAL, DIMENSION(KLON), INTENT(OUT):: PTHLCL ! theta at LCL +REAL, DIMENSION(KLON), INTENT(OUT):: PTLCL ! temp. at LCL +REAL, DIMENSION(KLON), INTENT(OUT):: PRVLCL ! vapor mixing ratio at LCL +REAL, DIMENSION(KLON), INTENT(OUT):: PWLCL ! parcel velocity at LCL +REAL, DIMENSION(KLON), INTENT(OUT):: PZLCL ! height at LCL (m) +REAL, DIMENSION(KLON), INTENT(OUT):: PTHVELCL ! environm. theta_v at LCL (K) +LOGICAL, DIMENSION(KLON), INTENT(OUT):: OTRIG ! logical mask for convection +INTEGER, DIMENSION(KLON), INTENT(INOUT):: KLCL ! contains vert. index of LCL +INTEGER, DIMENSION(KLON), INTENT(INOUT):: KDPL ! contains vert. index of DPL +INTEGER, DIMENSION(KLON), INTENT(INOUT):: KPBL ! contains index of source layer top +! +END SUBROUTINE CONVECT_TRIGGER_SHAL +! +END INTERFACE +! +END MODULE MODI_CONVECT_TRIGGER_SHAL +! ######################################################################## + SUBROUTINE CONVECT_TRIGGER_SHAL( KLON, KLEV, & + PPRES, PTH, PTHV, PTHES, & + PRV, PW, PZ, PDXDY,PTKECLS, & + PTHLCL, PTLCL, PRVLCL, PWLCL, PZLCL, & + PTHVELCL, KLCL, KDPL, KPBL, OTRIG ) +! ######################################################################## +! +!!**** Determine convective columns as well as the cloudy values of theta, +!! and qv at the lifting condensation level (LCL) +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to determine convective columns +!! +!! +!! +!!** METHOD +!! ------ +!! Computations are done at every model level starting from bottom. +!! The use of masks allows to optimise the inner loops (horizontal loops). +!! What we look for is the undermost unstable level at each grid point. +!! +!! +!! +!! EXTERNAL +!! -------- +!! Routine CONVECT_SATMIXRATIO +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST +!! XG ! gravity constant +!! XP00 ! Reference pressure +!! XRD, XRV ! Gaz constants for dry air and water vapor +!! XCPD ! Cpd (dry air) +!! XTT ! triple point temperature +!! XBETAW, XGAMW ! constants for vapor saturation pressure +!! +!! Module MODD_CONVPAR +!! XA25 ! reference grid area +!! XZLCL ! maximum height difference between +!! ! the surface and the DPL +!! XZPBL ! minimum mixed layer depth to sustain convection +!! XCDEPTH ! minimum necessary cloud depth +!! XCDEPTH_D ! maximum allowed cloud depth +!! XDTPERT ! add small Temp peturbation +!! XNHGAM ! coefficient for buoyancy term in w eq. +!! ! accounting for nh-pressure +!! XAW, XBW, XATPERT, XBTPERT +!! +!! Module MODD_CONVPAREXT +!! JCVEXB, JCVEXT ! extra levels on the vertical boundaries +!! +!! REFERENCE +!! --------- +!! +!! Book2 of documentation ( routine TRIGGER_FUNCT) +!! Fritsch and Chappell (1980), J. Atm. Sci., Vol. 37, 1722-1761. +!! +!! AUTHOR +!! ------ +!! P. BECHTOLD * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original 07/11/95 +!! Last modified 20/03/97 Select first departure level +!! that produces a cloud thicker than XCDEPTH +!! F. Bouyssel 05/11/08 Modifications for reproductibility +!! E. Bazile 05/05/09 Modifications for using really W and the tempe. +!! perturbation function of the TKE. +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_CONVPAR_SHAL +USE MODD_CONVPAREXT +USE MODI_CONVECT_SATMIXRATIO +! +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +INTEGER, INTENT(IN) :: KLON ! horizontal loop index +INTEGER, INTENT(IN) :: KLEV ! vertical loop index +REAL, DIMENSION(KLON), INTENT(IN) :: PDXDY ! grid area +REAL, DIMENSION(KLON), INTENT(IN) :: PTKECLS ! TKE CLS +REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PTH, PTHV ! theta, theta_v +REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PTHES ! envir. satur. theta_e +REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PRV ! vapor mixing ratio +REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PPRES ! pressure +REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PZ ! height of grid point (m) +REAL, DIMENSION(KLON,KLEV),INTENT(IN) :: PW ! vertical velocity +! +REAL, DIMENSION(KLON), INTENT(OUT):: PTHLCL ! theta at LCL +REAL, DIMENSION(KLON), INTENT(OUT):: PTLCL ! temp. at LCL +REAL, DIMENSION(KLON), INTENT(OUT):: PRVLCL ! vapor mixing ratio at LCL +REAL, DIMENSION(KLON), INTENT(OUT):: PWLCL ! parcel velocity at LCL +REAL, DIMENSION(KLON), INTENT(OUT):: PZLCL ! height at LCL (m) +REAL, DIMENSION(KLON), INTENT(OUT):: PTHVELCL ! environm. theta_v at LCL (K) +LOGICAL, DIMENSION(KLON), INTENT(OUT):: OTRIG ! logical mask for convection +INTEGER, DIMENSION(KLON), INTENT(INOUT):: KLCL ! contains vert. index of LCL +INTEGER, DIMENSION(KLON), INTENT(INOUT):: KDPL ! contains vert. index of DPL +INTEGER, DIMENSION(KLON), INTENT(INOUT):: KPBL ! contains index of source layer top +! +!* 0.2 Declarations of local variables : +! +INTEGER :: JKK, JK, JKP, JKM, JKDL, JL, JKT, JT! vertical loop index +INTEGER :: JI ! horizontal loop index +INTEGER :: IIE, IKB, IKE ! horizontal + vertical loop bounds +REAL :: ZEPS, ZEPSA ! R_d / R_v, R_v / R_d +REAL :: ZCPORD, ZRDOCP ! C_pd / R_d, R_d / C_pd +! +REAL, DIMENSION(KLON) :: ZTHLCL, ZTLCL, ZRVLCL, & ! locals for PTHLCL,PTLCL + ZWLCL, ZZLCL, ZTHVELCL ! PRVLCL, .... +INTEGER, DIMENSION(KLON) :: IDPL, IPBL, ILCL ! locals for KDPL, ... +REAL, DIMENSION(KLON) :: ZPLCL ! pressure at LCL +REAL, DIMENSION(KLON) :: ZZDPL ! height of DPL +REAL, DIMENSION(KLON) :: ZTHVLCL ! theta_v at LCL = mixed layer value +REAL, DIMENSION(KLON) :: ZTMIX ! mixed layer temperature +REAL, DIMENSION(KLON) :: ZEVMIX ! mixed layer water vapor pressure +REAL, DIMENSION(KLON) :: ZDPTHMIX, ZPRESMIX ! mixed layer depth and pressure +REAL, DIMENSION(KLON) :: ZCAPE ! convective available energy (m^2/s^2/g) +REAL, DIMENSION(KLON) :: ZCAP ! pseudo fro CAPE +REAL, DIMENSION(KLON) :: ZTHEUL ! updraft equiv. pot. temperature (K) +REAL, DIMENSION(KLON) :: ZLV, ZCPH! specific heats of vaporisation, dry air +REAL, DIMENSION(KLON) :: ZDP ! pressure between LCL and model layer +REAL, DIMENSION(KLON) :: ZTOP,ZTOPP ! estimated cloud top (m) +REAL, DIMENSION(KLON) :: ZWORK1, ZWORK2, ZWORK3 ! work arrays +LOGICAL, DIMENSION(KLON) :: GTRIG, GTRIG2 ! local arrays for OTRIG +LOGICAL, DIMENSION(KLON) :: GWORK1 ! work array +! +! +!------------------------------------------------------------------------------- +! +!* 0.3 Compute array bounds +! -------------------- +! +IIE = KLON +IKB = 1 + JCVEXB +IKE = KLEV - JCVEXT +! +! +!* 1. Initialize local variables +! -------------------------- +! +ZEPS = XRD / XRV +ZEPSA = XRV / XRD +ZCPORD = XCPD / XRD +ZRDOCP = XRD / XCPD +OTRIG(:) = .FALSE. +IDPL(:) = KDPL(:) +IPBL(:) = KPBL(:) +ILCL(:) = KLCL(:) +PWLCL(:) = 0. +ZWLCL(:) = 0. +PTHLCL(:) = 1. +PTHVELCL(:)= 1. +PTLCL(:) = 1. +PRVLCL(:) = 0. +PWLCL(:) = 0. +PZLCL(:) = PZ(:,IKB) +ZZDPL(:) = PZ(:,IKB) +GTRIG2(:) = .TRUE. +! +! +! +! 1. Determine highest necessary loop test layer +! ------------------------------------------- +! +JT = IKE - 2 +! FBy +!DO JK = IKB + 1, IKE - 2 +! IF ( PZ(1,JK) - PZ(1,IKB) < 5.E3 ) JT = JK +!END DO +! +! +!* 2. Enter loop for convection test +! ------------------------------ +! +JKP = MINVAL( IDPL(:) ) + 1 +JKT = JT +JKT = JKP ! do not allow for looping anymore, test only for surface mixed layer +DO JKK = JKP, JKT +! + GWORK1(:) = ZZDPL(:) - PZ(:,IKB) < XZLCL + ! we exit the trigger test when the center of the mixed layer is more + ! than 1500 m above soil level. + WHERE ( GWORK1(:) ) + ZDPTHMIX(:) = 0. + ZPRESMIX(:) = 0. + ZTHLCL(:) = 0. + ZRVLCL(:) = 0. + ZZDPL(:) = PZ(:,JKK) + IDPL(:) = JKK + END WHERE +! +! +!* 3. Construct a mixed layer of at least 50 hPa (XZPBL) +! ------------------------------------------ +! + DO JK = JKK, IKE - 1 + JKM = JK + 1 + DO JI = 1, IIE + IF ( GWORK1(JI) .AND. ZDPTHMIX(JI) < XZPBL ) THEN + IPBL(JI) = JK + ZWORK1(JI) = PPRES(JI,JK) - PPRES(JI,JKM) + ZDPTHMIX(JI) = ZDPTHMIX(JI) + ZWORK1(JI) + ZPRESMIX(JI) = ZPRESMIX(JI) + PPRES(JI,JK) * ZWORK1(JI) + ZTHLCL(JI) = ZTHLCL(JI) + PTH(JI,JK) * ZWORK1(JI) + ZRVLCL(JI) = ZRVLCL(JI) + PRV(JI,JK) * ZWORK1(JI) + END IF + END DO + IF ( MINVAL ( ZDPTHMIX(:) ) >= XZPBL ) EXIT + END DO +! +! + WHERE ( GWORK1(:) ) +! + ZPRESMIX(:) = ZPRESMIX(:) / ZDPTHMIX(:) + ZTHLCL(:) = ZTHLCL(:) / ZDPTHMIX(:) + & + & (XATPERT * MAX(3.,PTKECLS(:))/XCPD +XBTPERT) * XDTPERT ! add small Temp Perturb. + ZRVLCL(:) = ZRVLCL(:) / ZDPTHMIX(:) + ZTHVLCL(:) = ZTHLCL(:) * ( 1. + ZEPSA * ZRVLCL(:) ) & + / ( 1. + ZRVLCL(:) ) +! +!* 4.1 Use an empirical direct solution ( Bolton formula ) +! to determine temperature and pressure at LCL. +! Nota: the adiabatic saturation temperature is not +! equal to the dewpoint temperature +! ---------------------------------------------------- +! +! + ZTMIX(:) = ZTHLCL(:) * ( ZPRESMIX(:) / XP00 ) ** ZRDOCP + ZEVMIX(:) = ZRVLCL(:) * ZPRESMIX(:) / ( ZRVLCL(:) + ZEPS ) + ZEVMIX(:) = MAX( 1.E-8, ZEVMIX(:) ) + ZWORK1(:) = LOG( ZEVMIX(:) / 613.3 ) + ! dewpoint temperature + ZWORK1(:) = ( 4780.8 - 32.19 * ZWORK1(:) ) / ( 17.502 - ZWORK1(:) ) + ! adiabatic saturation temperature + ZTLCL(:) = ZWORK1(:) - ( .212 + 1.571E-3 * ( ZWORK1(:) - XTT ) & + - 4.36E-4 * ( ZTMIX(:) - XTT ) ) * ( ZTMIX(:) - ZWORK1(:) ) + ZTLCL(:) = MIN( ZTLCL(:), ZTMIX(:) ) + ZPLCL(:) = XP00 * ( ZTLCL(:) / ZTHLCL(:) ) ** ZCPORD +! + END WHERE +! +! +!* 4.2 Correct ZTLCL in order to be completely consistent +! with MNH saturation formula +! --------------------------------------------- +! + CALL CONVECT_SATMIXRATIO( KLON, ZPLCL, ZTLCL, ZWORK1, ZLV, ZWORK2, ZCPH ) + WHERE( GWORK1(:) ) + ZWORK2(:) = ZWORK1(:) / ZTLCL(:) * ( XBETAW / ZTLCL(:) - XGAMW ) ! dr_sat/dT + ZWORK2(:) = ( ZWORK1(:) - ZRVLCL(:) ) / & + ( 1. + ZLV(:) / ZCPH(:) * ZWORK2(:) ) + ZTLCL(:) = ZTLCL(:) - ZLV(:) / ZCPH(:) * ZWORK2(:) +! + END WHERE +! +! +!* 4.3 If ZRVLCL = PRVMIX is oversaturated set humidity +! and temperature to saturation values. +! --------------------------------------------- +! + CALL CONVECT_SATMIXRATIO( KLON, ZPRESMIX, ZTMIX, ZWORK1, ZLV, ZWORK2, ZCPH ) + WHERE( GWORK1(:) .AND. ZRVLCL(:) > ZWORK1(:) ) + ZWORK2(:) = ZWORK1(:) / ZTMIX(:) * ( XBETAW / ZTMIX(:) - XGAMW ) ! dr_sat/dT + ZWORK2(:) = ( ZWORK1(:) - ZRVLCL(:) ) / & + ( 1. + ZLV(:) / ZCPH(:) * ZWORK2(:) ) + ZTLCL(:) = ZTMIX(:) - ZLV(:) / ZCPH(:) * ZWORK2(:) + ZRVLCL(:) = ZRVLCL(:) - ZWORK2(:) + ZPLCL(:) = ZPRESMIX(:) + ZTHLCL(:) = ZTLCL(:) * ( XP00 / ZPLCL(:) ) ** ZRDOCP + ZTHVLCL(:)= ZTHLCL(:) * ( 1. + ZEPSA * ZRVLCL(:) ) & + / ( 1. + ZRVLCL(:) ) + END WHERE +! +! +!* 5.1 Determine vertical loop index at the LCL and DPL +! -------------------------------------------------- +! + DO JK = JKK, IKE - 1 + DO JI = 1, IIE + IF ( ZPLCL(JI) <= PPRES(JI,JK) .AND. GWORK1(JI) ) ILCL(JI) = JK + 1 + END DO + END DO +! +! +!* 5.2 Estimate height and environm. theta_v at LCL +! -------------------------------------------------- +! + DO JI = 1, IIE + JK = ILCL(JI) + JKM = JK - 1 + ZDP(JI) = LOG( ZPLCL(JI) / PPRES(JI,JKM) ) / & + LOG( PPRES(JI,JK) / PPRES(JI,JKM) ) + ZWORK1(JI) = PTHV(JI,JKM) + ( PTHV(JI,JK) - PTHV(JI,JKM) ) * ZDP(JI) + ! we compute the precise value of the LCL + ! The precise height is between the levels ILCL and ILCL-1. + ZWORK2(JI) = PZ(JI,JKM) + ( PZ(JI,JK) - PZ(JI,JKM) ) * ZDP(JI) + END DO + WHERE( GWORK1(:) ) + ZTHVELCL(:) = ZWORK1(:) + ZZLCL(:) = ZWORK2(:) + END WHERE +! +! +!* 6. Check to see if cloud is bouyant +! -------------------------------- +! +!* 6.1 Compute grid scale vertical velocity perturbation term ZWORK1 +! ------------------------------------------------------------- +! +! ! normalize w grid scale to a 25 km refer. grid +! DO JI = 1, IIE +! JK = ILCL(JI) +! JKM = JK - 1 +! ZWORK1(JI) = ( PW(JI,JKM) + ( PW(JI,JK) - PW(JI,JKM) ) * ZDP(JI) ) & +! * SQRT( PDXDY(JI) / XA25 ) +! - 0.02 * ZZLCL(JI) / XZLCL ! avoid spurious convection +! END DO +! ! compute sign of normalized grid scale w +! ZWORK2(:) = SIGN( 1., ZWORK1(:) ) +! ZWORK1(:) = XWTRIG * ZWORK2(:) * ABS( ZWORK1(:) ) ** 0.333 & +! * ( XP00 / ZPLCL(:) ) ** ZRDOCP +! +!* 6.2 Compute parcel vertical velocity at LCL +! --------------------------------------- +! +! DO JI = 1, IIE +! JKDL = IDPL(JI) +! ZWORK3(JI) = XG * ZWORK1(JI) * ( ZZLCL(JI) - PZ(JI,JKDL) ) & +! / ( PTHV(JI,JKDL) + ZTHVELCL(JI) ) +! END DO +! WHERE( GWORK1(:) ) +! ZWLCL(:) = 1. + .5 * ZWORK2(:) * SQRT( ABS( ZWORK3(:) ) ) +! GTRIG(:) = ZTHVLCL(:) - ZTHVELCL(:) + ZWORK1(:) > 0. .AND. & +! ZWLCL(:) > 0. +! END WHERE + ZWLCL(:) = XAW * MAX(0.,PW(:,IKB)) + XBW +! +! +!* 6.3 Look for parcel that produces sufficient cloud depth. +! The cloud top is estimated as the level where the CAPE +! is smaller than a given value (based on vertical velocity eq.) +! -------------------------------------------------------------- +! + ZTHEUL(:) = ZTLCL(:) * ( ZTHLCL(:) / ZTLCL(:) ) & + ** ( 1. - 0.28 * ZRVLCL(:) ) & + * EXP( ( 3374.6525 / ZTLCL(:) - 2.5403 ) * & + ZRVLCL(:) * ( 1. + 0.81 * ZRVLCL(:) ) ) +! + ZCAPE(:) = 0. + ZCAP(:) = 0. + ZTOP(:) = 0. + ZTOPP(:) = 0. + ZWORK3(:)= 0. + JKM = MINVAL( ILCL(:) ) + DO JL = JKM, JT + JK = JL + 1 + DO JI = 1, IIE + ZWORK1(JI) = ( 2. * ZTHEUL(JI) / & + ( PTHES(JI,JK) + PTHES(JI,JL) ) - 1. ) * ( PZ(JI,JK) - PZ(JI,JL) ) + IF ( JL < ILCL(JI) ) ZWORK1(JI) = 0. + ZCAPE(JI) = ZCAPE(JI) + XG * MAX( 1., ZWORK1(JI) ) + ZCAP(JI) = ZCAP(JI) + ZWORK1(JI) + ZWORK2(JI) = XNHGAM * XG * ZCAP(JI) + 1.05 * ZWLCL(JI) * ZWLCL(JI) + ! the factor 1.05 takes entrainment into account + ZWORK2(JI) = SIGN( 1., ZWORK2(JI) ) + ZWORK3(JI) = ZWORK3(JI) + MIN(0., ZWORK2(JI) ) + ZWORK3(JI) = MAX( -1., ZWORK3(JI) ) + ! Nota, the factors ZWORK2 and ZWORK3 are only used to avoid + ! if and goto statements, the difficulty is to extract only + ! the level where the criterium is first fullfilled + ZTOPP(JI)=ZTOP(JI) + ZTOP(JI) = PZ(JI,JL) * .5 * ( 1. + ZWORK2(JI) ) * ( 1. + ZWORK3(JI) ) + & + ZTOP(JI) * .5 * ( 1. - ZWORK2(JI) ) + ZTOP(JI)=MAX(ZTOP(JI),ZTOPP(JI)) + ZTOPP(JI)=ZTOP(JI) + END DO + END DO +! +! + ZWORK2(:) = ZTOP(:) - ZZLCL(:) + ! WHERE( ZWORK2(:) .GE. XCDEPTH .AND. ZWORK2(:) < XCDEPTH_D .AND. GTRIG2(:) & + WHERE( ZWORK2(:) .GE. XCDEPTH .AND. GTRIG2(:) & + .AND. ZCAPE(:) > 10. ) + GTRIG2(:) = .FALSE. + OTRIG(:) = .TRUE. + ! OTRIG(:) = GTRIG(:) ! we select the first departure level + PTHLCL(:) = ZTHLCL(:) ! that gives sufficient cloud depth + PRVLCL(:) = ZRVLCL(:) + PTLCL(:) = ZTLCL(:) + PWLCL(:) = ZWLCL(:) + PZLCL(:) = ZZLCL(:) + PTHVELCL(:) = ZTHVELCL(:) + KDPL(:) = IDPL(:) + KPBL(:) = IPBL(:) + KLCL(:) = ILCL(:) + END WHERE +! +END DO +! +! +END SUBROUTINE CONVECT_TRIGGER_SHAL diff --git a/src/mesonh/conv/convect_tstep_pref.f90 b/src/mesonh/conv/convect_tstep_pref.f90 new file mode 100644 index 000000000..718da2b7b --- /dev/null +++ b/src/mesonh/conv/convect_tstep_pref.f90 @@ -0,0 +1,206 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 conv 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ################# + MODULE MODI_CONVECT_TSTEP_PREF +! ################# +! +INTERFACE +! + SUBROUTINE CONVECT_TSTEP_PREF( KLON, KLEV, & + PU, PV, PPRES, PZ, PDXDY, KLCL, KCTL, & + PTIMEA, PPREF ) +! +INTEGER, INTENT(IN) :: KLON ! horizontal dimension +INTEGER, INTENT(IN) :: KLEV ! vertical dimension +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PPRES ! pressure (Pa) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PU ! grid scale horiz. wind u +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PV ! grid scale horiz. wind v +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PZ ! height of model layer (m) +REAL, DIMENSION(KLON), INTENT(IN) :: PDXDY ! grid area (m^2) +INTEGER, DIMENSION(KLON), INTENT(IN) :: KLCL ! lifting condensation level index +INTEGER, DIMENSION(KLON), INTENT(IN) :: KCTL ! cloud top level index +! +REAL, DIMENSION(KLON), INTENT(OUT):: PTIMEA ! advective time period +REAL, DIMENSION(KLON), INTENT(OUT):: PPREF ! precipitation efficiency +! +END SUBROUTINE CONVECT_TSTEP_PREF +! +END INTERFACE +! +END MODULE MODI_CONVECT_TSTEP_PREF +! ###################################################################### + SUBROUTINE CONVECT_TSTEP_PREF( KLON, KLEV, & + PU, PV, PPRES, PZ, PDXDY, KLCL, KCTL, & + PTIMEA, PPREF ) +! ###################################################################### +! +!!**** Routine to compute convective advection time step and precipitation +!! efficiency +!! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to determine the convective +!! advection time step PTIMEC as a function of the mean ambient +!! wind as well as the precipitation efficiency as a function +!! of wind shear and cloud base height. +!! +!! +!!** METHOD +!! ------ +!! +!! +!! EXTERNAL +!! -------- +!! None +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! Module MODD_CONVPAREXT +!! JCVEXB, JCVEXT ! extra levels on the vertical boundaries +!! +!! REFERENCE +!! --------- +!! +!! Book1,2 of documentation +!! Fritsch and Chappell, 1980, J. Atmos. Sci. +!! Kain and Fritsch, 1993, Meteor. Monographs, Vol. +!! +!! AUTHOR +!! ------ +!! P. BECHTOLD * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original 07/11/95 +!! Last modified 04/10/97 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CONVPAREXT +! +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +INTEGER, INTENT(IN) :: KLON ! horizontal dimension +INTEGER, INTENT(IN) :: KLEV ! vertical dimension +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PPRES ! pressure (Pa) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PU ! grid scale horiz. wind u +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PV ! grid scale horiz. wind v +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PZ ! height of model layer (m) +REAL, DIMENSION(KLON), INTENT(IN) :: PDXDY ! grid area (m^2) +INTEGER, DIMENSION(KLON), INTENT(IN) :: KLCL ! lifting condensation level index +INTEGER, DIMENSION(KLON), INTENT(IN) :: KCTL ! cloud top level index +! +REAL, DIMENSION(KLON), INTENT(OUT):: PTIMEA ! advective time period +REAL, DIMENSION(KLON), INTENT(OUT):: PPREF ! precipitation efficiency +! +! +!* 0.2 Declarations of local variables KLON +! +INTEGER :: IIE, IKB, IKE ! horizontal + vertical loop bounds +INTEGER :: JI ! horizontal loop index +INTEGER :: JK, JKLC, JKP5, JKCT ! vertical loop index +! +INTEGER, DIMENSION(KLON) :: IP500 ! index of 500 hPa levels +REAL, DIMENSION(KLON) :: ZCBH ! cloud base height +REAL, DIMENSION(KLON) :: ZWORK1, ZWORK2, ZWORK3 ! work arrays +! +! +!------------------------------------------------------------------------------- +! +! 0.3 Set loop bounds +! --------------- +! +IIE = KLON +IKB = 1 + JCVEXB +IKE = KLEV - JCVEXT +! +! +!* 1. Determine vertical index for 500 hPa levels +! ------------------------------------------ +! +! +IP500(:) = IKB +DO JK = IKB, IKE + WHERE ( PPRES(:,JK) >= 500.E2 ) IP500(:) = JK +END DO +! +! +!* 2. Compute convective time step +! ---------------------------- +! + ! compute wind speed at LCL, 500 hPa, CTL + +DO JI = 1, IIE + JKLC = KLCL(JI) + JKP5 = IP500(JI) + JKCT = KCTL(JI) + ZWORK1(JI) = SQRT( PU(JI,JKLC) * PU(JI,JKLC) + & + PV(JI,JKLC) * PV(JI,JKLC) ) + ZWORK2(JI) = SQRT( PU(JI,JKP5) * PU(JI,JKP5) + & + PV(JI,JKP5) * PV(JI,JKP5) ) + ZWORK3(JI) = SQRT( PU(JI,JKCT) * PU(JI,JKCT) + & + PV(JI,JKCT) * PV(JI,JKCT) ) +END DO +! +ZWORK2(:) = MAX( 0.1, 0.5 * ( ZWORK1(:) + ZWORK2(:) ) ) +! +PTIMEA(:) = SQRT( PDXDY(:) ) / ZWORK2(:) +! +! +!* 3. Compute precipitation efficiency +! ----------------------------------- +! +!* 3.1 Precipitation efficiency as a function of wind shear +! ---------------------------------------------------- +! +ZWORK2(:) = SIGN( 1., ZWORK3(:) - ZWORK1(:) ) +DO JI = 1, IIE + JKLC = KLCL(JI) + JKCT = KCTL(JI) + ZWORK1(JI) = ( PU(JI,JKCT) - PU(JI,JKLC) ) * & + ( PU(JI,JKCT) - PU(JI,JKLC) ) + & + ( PV(JI,JKCT) - PV(JI,JKLC) ) * & + ( PV(JI,JKCT) - PV(JI,JKLC) ) + ZWORK1(JI) = 1.E3 * ZWORK2(JI) * SQRT( ZWORK1(JI) ) / & + MAX( 1.E-2, PZ(JI,JKCT) - PZ(JI,JKLC) ) +END DO +! +PPREF(:) = 1.591 + ZWORK1(:) * ( -.639 + ZWORK1(:) * ( & + 9.53E-2 - ZWORK1(:) * 4.96E-3 ) ) +PPREF(:) = MAX( .4, MIN( PPREF(:), .9 ) ) +! +!* 3.2 Precipitation efficiency as a function of cloud base height +! ---------------------------------------------------------- +! +DO JI = 1, IIE + JKLC = KLCL(JI) + ZCBH(JI) = MAX( 3., ( PZ(JI,JKLC) - PZ(JI,IKB) ) * 3.281E-3 ) +END DO +ZWORK1(:) = .9673 + ZCBH(:) * ( -.7003 + ZCBH(:) * ( .1622 + & + ZCBH(:) * ( -1.2570E-2 + ZCBH(:) * ( 4.2772E-4 - & + ZCBH(:) * 5.44E-6 ) ) ) ) +ZWORK1(:) = MAX( .4, MIN( .9, 1./ ( 1. + ZWORK1(:) ) ) ) +! +!* 3.3 Mean precipitation efficiency is used to compute rainfall +! ---------------------------------------------------------- +! +PPREF(:) = 0.5 * ( PPREF(:) + ZWORK1(:) ) +! +! +END SUBROUTINE CONVECT_TSTEP_PREF diff --git a/src/mesonh/conv/convect_updraft.f90 b/src/mesonh/conv/convect_updraft.f90 new file mode 100644 index 000000000..d860b6240 --- /dev/null +++ b/src/mesonh/conv/convect_updraft.f90 @@ -0,0 +1,641 @@ +!MNH_LIC Copyright 1995-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ################# + MODULE MODI_CONVECT_UPDRAFT +! ################# +! +INTERFACE +! + SUBROUTINE CONVECT_UPDRAFT( KLON, KLEV, & + KICE, PPRES, PDPRES, PZ, PTHL, PTHV, PTHES, PRW, & + PTHLCL, PTLCL, PRVLCL, PWLCL, PZLCL, PTHVELCL, & + PMFLCL, OTRIG, KLCL, KDPL, KPBL, & + PUMF, PUER, PUDR, PUTHL, PUTHV, PURW, & + PURC, PURI, PURR, PURS, PUPR, & + PUTPR, PCAPE, KCTL, KETL, PUTT ) +! +INTEGER, INTENT(IN) :: KLON ! horizontal dimension +INTEGER, INTENT(IN) :: KLEV ! vertical dimension +INTEGER, INTENT(IN) :: KICE ! flag for ice ( 1 = yes, + ! 0 = no ice ) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PTHL ! grid scale enthalpy (J/kg) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PTHV ! grid scale theta_v +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PTHES ! grid scale saturated theta_e +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PRW ! grid scale total water + ! mixing ratio +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PPRES ! pressure (P) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PDPRES! pressure difference between + ! bottom and top of layer (Pa) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PZ ! height of model layer (m) +REAL, DIMENSION(KLON), INTENT(IN) :: PTHLCL ! theta at LCL +REAL, DIMENSION(KLON), INTENT(IN) :: PTLCL ! temp. at LCL +REAL, DIMENSION(KLON), INTENT(IN) :: PRVLCL ! vapor mixing ratio at LCL +REAL, DIMENSION(KLON), INTENT(IN) :: PWLCL ! parcel velocity at LCL (m/s) +REAL, DIMENSION(KLON), INTENT(IN) :: PMFLCL ! cloud base unit mass flux + ! (kg/s) +REAL, DIMENSION(KLON), INTENT(IN) :: PZLCL ! height at LCL (m) +REAL, DIMENSION(KLON), INTENT(IN) :: PTHVELCL ! environm. theta_v at LCL (K) +LOGICAL, DIMENSION(KLON), INTENT(INOUT):: OTRIG! logical mask for convection +INTEGER, DIMENSION(KLON), INTENT(IN) :: KLCL ! contains vert. index of LCL +INTEGER, DIMENSION(KLON), INTENT(IN) :: KDPL ! contains vert. index of DPL +INTEGER, DIMENSION(KLON), INTENT(IN) :: KPBL ! " vert. index of source layertop +! +! +INTEGER, DIMENSION(KLON), INTENT(OUT):: KCTL ! contains vert. index of CTL +INTEGER, DIMENSION(KLON), INTENT(OUT):: KETL ! contains vert. index of & + !equilibrium (zero buoyancy) level +REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PUMF ! updraft mass flux (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PUER ! updraft entrainment (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PUDR ! updraft detrainment (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PUTHL ! updraft enthalpy (J/kg) +REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PUTHV ! updraft theta_v (K) +REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PUTT ! updraft temperature(K) +REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PURW ! updraft total water (kg/kg) +REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PURC ! updraft cloud water (kg/kg) +REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PURI ! updraft cloud ice (kg/kg) +REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PURR ! liquid precipit. (kg/kg) + ! produced in model layer +REAL, DIMENSION(KLON,KLEV), INTENT(OUT)::PURS ! solid precipit. (kg/kg) + ! produced in model layer +REAL, DIMENSION(KLON,KLEV), INTENT(OUT)::PUPR ! updraft precipitation in + ! flux units (kg water / s) +REAL, DIMENSION(KLON), INTENT(OUT):: PUTPR ! total updraft precipitation + ! in flux units (kg water / s) +REAL, DIMENSION(KLON), INTENT(OUT):: PCAPE ! available potent. energy +! +END SUBROUTINE CONVECT_UPDRAFT +! +END INTERFACE +! +END MODULE MODI_CONVECT_UPDRAFT +! ########################################################################## + SUBROUTINE CONVECT_UPDRAFT( KLON, KLEV, & + KICE, PPRES, PDPRES, PZ, PTHL, PTHV, PTHES, PRW, & + PTHLCL, PTLCL, PRVLCL, PWLCL, PZLCL, PTHVELCL, & + PMFLCL, OTRIG, KLCL, KDPL, KPBL, & + PUMF, PUER, PUDR, PUTHL, PUTHV, PURW, & + PURC, PURI, PURR, PURS, PUPR, & + PUTPR, PCAPE, KCTL, KETL, PUTT ) +! ########################################################################## +! +!!**** Compute updraft properties from DPL to CTL. +!! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to determine updraft properties +!! ( mass flux, thermodynamics, precipitation ) +!! +!! +!!** METHOD +!! ------ +!! Computations are done at every model level starting from bottom. +!! The use of masks allows to optimise the inner loops (horizontal loops). +!! +!! +!! +!! EXTERNAL +!! -------- +!! Routine CONVECT_MIXING_FUNCT +!! Routine CONVECT_CONDENS +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST +!! XG ! gravity constant +!! XP00 ! reference pressure +!! XRD, XRV ! gaz constants for dry air and water vapor +!! XCPD, XCPV, XCL ! Cp of dry air, water vapor and liquid water +!! XTT ! triple point temperature +!! XLVTT ! vaporisation heat at XTT +!! +!! +!! Module MODD_CONVPAR +!! XA25 ! reference grid area +!! XCRAD ! cloud radius +!! XCDEPTH ! minimum necessary cloud depth +!! XENTR ! entrainment constant +!! XRCONV ! constant in precipitation conversion +!! XNHGAM ! coefficient for buoyancy term in w eq. +!! ! accounting for nh-pressure +!! XTFRZ1 ! begin of freezing interval +!! XTFRZ2 ! begin of freezing interval +!! +!! Module MODD_CONVPAREXT +!! JCVEXB, JCVEXT ! extra levels on the vertical boundaries +!! +!! REFERENCE +!! --------- +!! +!! Book1,2 of documentation ( routine CONVECT_UPDRAFT) +!! Kain and Fritsch, 1990, J. Atmos. Sci., Vol. +!! Kain and Fritsch, 1993, Meteor. Monographs, Vol. +!! +!! AUTHOR +!! ------ +!! P. BECHTOLD * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original 07/11/95 +!! Last modified 10/12/97 +!! V.Masson, C.Lac, Sept. 2010 : Correction of a loop for reproducibility +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_CONVPAR +USE MODD_CONVPAREXT +! +USE MODI_CONVECT_CONDENS +USE MODI_CONVECT_MIXING_FUNCT +! +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +INTEGER, INTENT(IN) :: KLON ! horizontal dimension +INTEGER, INTENT(IN) :: KLEV ! vertical dimension +INTEGER, INTENT(IN) :: KICE ! flag for ice ( 1 = yes, + ! 0 = no ice ) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PTHL ! grid scale enthalpy (J/kg) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PTHV ! grid scale theta_v +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PTHES ! grid scale saturated theta_e +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PRW ! grid scale total water + ! mixing ratio +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PPRES ! pressure (P) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PDPRES! pressure difference between + ! bottom and top of layer (Pa) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PZ ! height of model layer (m) +REAL, DIMENSION(KLON), INTENT(IN) :: PTHLCL ! theta at LCL +REAL, DIMENSION(KLON), INTENT(IN) :: PTLCL ! temp. at LCL +REAL, DIMENSION(KLON), INTENT(IN) :: PRVLCL ! vapor mixing ratio at LCL +REAL, DIMENSION(KLON), INTENT(IN) :: PWLCL ! parcel velocity at LCL (m/s) +REAL, DIMENSION(KLON), INTENT(IN) :: PMFLCL ! cloud base unit mass flux + ! (kg/s) +REAL, DIMENSION(KLON), INTENT(IN) :: PZLCL ! height at LCL (m) +REAL, DIMENSION(KLON), INTENT(IN) :: PTHVELCL ! environm. theta_v at LCL (K) +LOGICAL, DIMENSION(KLON), INTENT(INOUT):: OTRIG! logical mask for convection +INTEGER, DIMENSION(KLON), INTENT(IN) :: KLCL ! contains vert. index of LCL +INTEGER, DIMENSION(KLON), INTENT(IN) :: KDPL ! contains vert. index of DPL +INTEGER, DIMENSION(KLON), INTENT(IN) :: KPBL ! " vert. index of source layertop +! +! +INTEGER, DIMENSION(KLON), INTENT(OUT):: KCTL ! contains vert. index of CTL +INTEGER, DIMENSION(KLON), INTENT(OUT):: KETL ! contains vert. index of & + !equilibrium (zero buoyancy) level +REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PUMF ! updraft mass flux (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PUER ! updraft entrainment (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PUDR ! updraft detrainment (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PUTHL ! updraft enthalpy (J/kg) +REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PUTHV ! updraft theta_v (K) +REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PUTT ! updraft temperature(K) +REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PURW ! updraft total water (kg/kg) +REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PURC ! updraft cloud water (kg/kg) +REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PURI ! updraft cloud ice (kg/kg) +REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PURR ! liquid precipit. (kg/kg) + ! produced in model layer +REAL, DIMENSION(KLON,KLEV), INTENT(OUT)::PURS ! solid precipit. (kg/kg) + ! produced in model layer +REAL, DIMENSION(KLON,KLEV), INTENT(OUT)::PUPR ! updraft precipitation in + ! flux units (kg water / s) +REAL, DIMENSION(KLON), INTENT(OUT):: PUTPR ! total updraft precipitation + ! in flux units (kg water / s) +REAL, DIMENSION(KLON), INTENT(OUT):: PCAPE ! available potent. energy +! +!* 0.2 Declarations of local variables : +! +INTEGER :: IIE, IKB, IKE ! horizontal and vertical loop bounds +INTEGER :: JI ! horizontal loop index +INTEGER :: JK, JKP, JKM, JK1, JK2, JKMIN ! vertical loop index +REAL :: ZEPSA ! R_v / R_d, C_pv / C_pd +REAL :: ZRDOCP ! C_pd / R_d, R_d / C_pd +! +REAL, DIMENSION(KLON) :: ZUT ! updraft temperature (K) +REAL, DIMENSION(KLON) :: ZUW1, ZUW2 ! square of updraft vert. + ! velocity at levels k and k+1 +REAL, DIMENSION(KLON) :: ZE1,ZE2,ZD1,ZD2 ! fractional entrainm./detrain + ! rates at levels k and k+1 +REAL, DIMENSION(KLON) :: ZMIXF ! critical mixed fraction +REAL, DIMENSION(KLON) :: ZCPH ! specific heat C_ph +REAL, DIMENSION(KLON) :: ZLV, ZLS ! latent heat of vaporis., sublim. +REAL, DIMENSION(KLON) :: ZURV ! updraft water vapor at level k+1 +REAL, DIMENSION(KLON) :: ZPI ! Pi=(P0/P)**(Rd/Cpd) +REAL, DIMENSION(KLON) :: ZTHEUL ! theta_e for undilute ascent +REAL, DIMENSION(KLON) :: ZWORK1, ZWORK2, ZWORK3, ZWORK4, ZWORK5, & + ZWORK6 ! work arrays +INTEGER, DIMENSION(KLON) :: IWORK ! wok array +LOGICAL, DIMENSION(KLON) :: GWORK1, GWORK2, GWORK4 + ! work arrays +LOGICAL, DIMENSION(KLON,KLEV) :: GWORK6 ! work array +! +! +!------------------------------------------------------------------------------- +! +! 0.3 Set loop bounds +! --------------- +! +IKB = 1 + JCVEXB +IKE = KLEV - JCVEXT +IIE = KLON +! +! +!* 1. Initialize updraft properties and local variables +! ------------------------------------------------- +! +ZEPSA = XRV / XRD +ZRDOCP = XRD / XCPD +! +PUMF(:,:) = 0. +PUER(:,:) = 0. +PUDR(:,:) = 0. +PUTHL(:,:) = 0. +PUTHV(:,:) = 0. +PUTT(:,:) = 0. +PURW(:,:) = 0. +PURC(:,:) = 0. +PURI(:,:) = 0. +PUPR(:,:) = 0. +PURR(:,:) = 0. +PURS(:,:) = 0. +PUTPR(:) = 0. +ZUW1(:) = PWLCL(:) * PWLCL(:) +ZUW2(:) = 0. +ZE1(:) = 1. +ZD1(:) = 0. +PCAPE(:) = 0. +KCTL(:) = IKB +KETL(:) = KLCL(:) +GWORK2(:) = .TRUE. +ZPI(:) = 1. +ZWORK3(:) = 0. +ZWORK4(:) = 0. +ZWORK5(:) = 0. +ZWORK6(:) = 0. +GWORK1(:) = .FALSE. +GWORK4(:) = .FALSE. +! +! +!* 1.1 Compute undilute updraft theta_e for CAPE computations +! Bolton (1980) formula. +! Define accurate enthalpy for updraft +! ----------------------------------------------------- +! +ZTHEUL(:) = PTLCL(:) * ( PTHLCL(:) / PTLCL(:) ) ** ( 1. - 0.28 * PRVLCL(:) ) & + * EXP( ( 3374.6525 / PTLCL(:) - 2.5403 ) * & + PRVLCL(:) * ( 1. + 0.81 * PRVLCL(:) ) ) +! +! +ZWORK1(:) = ( XCPD + PRVLCL(:) * XCPV ) * PTLCL(:) & + + ( 1. + PRVLCL(:) ) * XG * PZLCL(:) +! +! +!* 2. Set updraft properties between DPL and LCL +! ------------------------------------------ +! +JKP = MAXVAL( KLCL(:) ) +JKM = MINVAL( KDPL(:) ) +DO JK = JKM, JKP + DO JI = 1, IIE + IF ( JK >= KDPL(JI) .AND. JK < KLCL(JI) ) THEN + PUMF(JI,JK) = PMFLCL(JI) + PUTHL(JI,JK) = ZWORK1(JI) + PUTHV(JI,JK) = PTHLCL(JI) * ( 1. + ZEPSA * PRVLCL(JI) ) / & + ( 1. + PRVLCL(JI) ) + PURW(JI,JK) = PRVLCL(JI) + END IF + END DO +END DO +! +! +!* 3. Enter loop for updraft computations +! ------------------------------------ +! +! Correction for reproduciblity +!JKMIN = MINVAL( KLCL(:) ) - 1 +JKMIN = MINVAL( KLCL(:) ) - 2 +DO JK = MAX( IKB + 1, JKMIN ), IKE - 1 + ZWORK6(:) = 1. + JKP = JK + 1 +! + GWORK4(:) = JK >= KLCL(:) - 1 + GWORK1(:) = GWORK4(:) .AND. GWORK2(:) ! this mask is used to confine + ! updraft computations between the LCL and the CTL +! + WHERE( JK == KLCL(:) - 1 ) ZWORK6(:) = 0. ! factor that is used in buoyancy + ! computation at first level above LCL +! +! +!* 4. Estimate condensate, L_v L_i, Cph and theta_v at level k+1 +! ---------------------------------------------------------- +! + ZWORK1(:) = PURC(:,JK) + PURR(:,JK) + ZWORK2(:) = PURI(:,JK) + PURS(:,JK) + CALL CONVECT_CONDENS( KLON, KICE, PPRES(:,JKP), PUTHL(:,JK), PURW(:,JK),& + ZWORK1, ZWORK2, PZ(:,JKP), GWORK1, ZUT, ZURV, & + PURC(:,JKP), PURI(:,JKP), ZLV, ZLS, ZCPH ) +! +! + ZPI(:) = ( XP00 / PPRES(:,JKP) ) ** ZRDOCP + WHERE ( GWORK1(:) ) +! + PUTHV(:,JKP) = ZPI(:) * ZUT(:) * ( 1. + ZEPSA * ZURV(:) ) & + / ( 1. + PURW(:,JK) ) + PUTT(:,JKP) = ZUT(:) +! +! +!* 5. Compute square of vertical velocity using entrainment +! at level k +! ----------------------------------------------------- +! + ZWORK3(:) = PZ(:,JKP) - PZ(:,JK) * ZWORK6(:) - & + ( 1. - ZWORK6(:) ) * PZLCL(:) ! level thickness + ZWORK4(:) = PTHV(:,JK) * ZWORK6(:) + & + ( 1. - ZWORK6(:) ) * PTHVELCL(:) + ZWORK5(:) = 2. * ZUW1(:) * PUER(:,JK) / MAX( .1, PUMF(:,JK) ) + ZUW2(:) = ZUW1(:) + ZWORK3(:) * XNHGAM * XG * & + ( ( PUTHV(:,JK) + PUTHV(:,JKP) ) / & + ( ZWORK4(:) + PTHV(:,JKP) ) - 1. ) & ! buoyancy term + - ZWORK5(:) ! entrainment term +! +! +!* 6. Update total precipitation: dr_r=(r_c+r_i)*exp(-rate*dz) +! -------------------------------------------------------- +! +! compute level mean vertical velocity + ZWORK2(:) = 0.5 * & + ( SQRT( MAX( 1.E-2, ZUW2(:) ) ) + & + SQRT( MAX( 1.E-2, ZUW1(:) ) ) ) + PURR(:,JKP) = 0.5 * ( PURC(:,JK) + PURC(:,JKP) + PURI(:,JK) + PURI(:,JKP) )& + * ( 1. - EXP( - XRCONV * ZWORK3(:) / ZWORK2(:) ) ) + PUPR(:,JKP) = PURR(:,JKP) * PUMF(:,JK) ! precipitation rate ( kg water / s) + PUTPR(:) = PUTPR(:) + PUPR(:,JKP) ! total precipitation rate + ZWORK2(:) = PURR(:,JKP) / MAX( 1.E-8, PURC(:,JKP) + PURI(:,JKP) ) + PURR(:,JKP) = ZWORK2(:) * PURC(:,JKP) ! liquid precipitation + PURS(:,JKP) = ZWORK2(:) * PURI(:,JKP) ! solid precipitation +! +! +!* 7. Update r_c, r_i, enthalpy, r_w for precipitation +! ------------------------------------------------------- +! + PURW(:,JKP) = PURW(:,JK) - PURR(:,JKP) - PURS(:,JKP) + PURC(:,JKP) = PURC(:,JKP) - PURR(:,JKP) + PURI(:,JKP) = PURI(:,JKP) - PURS(:,JKP) + PUTHL(:,JKP) = ( XCPD + PURW(:,JKP) * XCPV ) * ZUT(:) & + + ( 1. + PURW(:,JKP) ) * XG * PZ(:,JKP) & + - ZLV(:) * PURC(:,JKP) - ZLS(:) * PURI(:,JKP) +! + ZUW1(:) = ZUW2(:) +! + END WHERE +! +! +!* 8. Compute entrainment and detrainment using conservative +! variables adjusted for precipitation ( not for entrainment) +! ----------------------------------------------------------- +! +!* 8.1 Compute critical mixed fraction by estimating unknown +! T^mix r_c^mix and r_i^mix from enthalpy^mix and r_w^mix +! We determine the zero crossing of the linear curve +! evaluating the derivative using ZMIXF=0.1. +! ----------------------------------------------------- +! + ZMIXF(:) = 0.1 ! starting value for critical mixed fraction + ZWORK1(:) = ZMIXF(:) * PTHL(:,JKP) & + + ( 1. - ZMIXF(:) ) * PUTHL(:,JKP) ! mixed enthalpy + ZWORK2(:) = ZMIXF(:) * PRW(:,JKP) & + + ( 1. - ZMIXF(:) ) * PURW(:,JKP) ! mixed r_w +! + CALL CONVECT_CONDENS( KLON, KICE, PPRES(:,JKP), ZWORK1, ZWORK2, & + PURC(:,JKP), PURI(:,JKP), PZ(:,JKP), GWORK1, ZUT,& + ZWORK3, ZWORK4, ZWORK5, ZLV, ZLS, ZCPH ) +! put in enthalpy and r_w and get T r_c, r_i (ZUT, ZWORK4-5) +! + ! compute theta_v of mixture + ZWORK3(:) = ZUT(:) * ZPI(:) * ( 1. + ZEPSA * ( & + ZWORK2(:) - ZWORK4(:) - ZWORK5(:) ) ) / ( 1. + ZWORK2(:) ) + ! compute final value of critical mixed fraction using theta_v + ! of mixture, grid-scale and updraft + ZMIXF(:) = MAX( 0., PUTHV(:,JKP) - PTHV(:,JKP) ) * ZMIXF(:) / & + ( PUTHV(:,JKP) - ZWORK3(:) + 1.E-10 ) + ZMIXF(:) = MAX( 0., MIN( 1., ZMIXF(:) ) ) +! +! +!* 8.2 Compute final midlevel values for entr. and detrainment +! after call of distribution function +! ------------------------------------------------------- +! +! + CALL CONVECT_MIXING_FUNCT ( KLON, ZMIXF, 1, ZE2, ZD2 ) +! Note: routine MIXING_FUNCT returns fractional entrainm/detrainm. rates +! +! ZWORK1(:) = XENTR * PMFLCL(:) * PDPRES(:,JKP) / XCRAD ! rate of env. inflow +!*MOD + zwork1(:) = xentr * xg / xcrad * pumf(:,jk) * ( pz(:,jkp) - pz(:,jk) ) +! ZWORK1(:) = XENTR * pumf(:,jk) * PDPRES(:,JKP) / XCRAD ! rate of env. inflow +!*MOD + ZWORK2(:) = 0. + WHERE ( GWORK1(:) ) ZWORK2(:) = 1. + ZE2(:) = .5; ZD2(:) = .6 ! set entrainment=detrainment for better + ! mass flux profiles in deep continental convection + WHERE ( PUTHV(:,JKP) > PTHV(:,JKP) ) + PUER(:,JKP) = 0.5 * ZWORK1(:) * ( ZE1(:) + ZE2(:) ) * ZWORK2(:) + PUDR(:,JKP) = 0.5 * ZWORK1(:) * ( ZD1(:) + ZD2(:) ) * ZWORK2(:) + ELSEWHERE + PUER(:,JKP) = 0. + PUDR(:,JKP) = ZWORK1(:) * ZWORK2(:) + END WHERE +! +!* 8.3 Determine equilibrium temperature level +! -------------------------------------- +! + WHERE ( PUTHV(:,JKP) > PTHV(:,JKP) .AND. JK > KLCL(:) + 1 & + .AND. GWORK1(:) ) + KETL(:) = JKP ! equilibrium temperature level + END WHERE +! +!* 8.4 If the calculated detrained mass flux is greater than +! the total updraft mass flux, or vertical velocity is +! negative, all cloud mass detrains at previous model level, +! exit updraft calculations - CTL is attained +! ------------------------------------------------------- +! + WHERE( GWORK1(:) ) & + GWORK2(:) = PUMF(:,JK) - PUDR(:,JKP) > 10. .AND. ZUW2(:) > 0. + WHERE ( GWORK2(:) ) KCTL(:) = JKP ! cloud top level +!!!! Correction Bug C.Lac 30/10/08 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + KCTL(:) = MIN( KCTL(:), IKE-1 ) + GWORK1(:) = GWORK2(:) .AND. GWORK4(:) +! + IF ( COUNT( GWORK2(:) ) == 0 ) EXIT +! +! +!* 9. Compute CAPE for undilute ascent using theta_e and +! theta_es instead of theta_v. This estimation produces +! a significantly larger value for CAPE than the actual one. +! ---------------------------------------------------------- +! + WHERE ( GWORK1(:) ) +! + ZWORK3(:) = PZ(:,JKP) - PZ(:,JK) * ZWORK6(:) - & + ( 1. - ZWORK6(:) ) * PZLCL(:) ! level thickness + ZWORK2(:) = PTHES(:,JK) + ( 1. - ZWORK6(:) ) * & + ( PTHES(:,JKP) - PTHES(:,JK) ) / ( PZ(:,JKP) - PZ(:,JK) ) * & + ( PZLCL(:) - PZ(:,JK) ) ! linear interpolation for theta_es at LCL + ! ( this is only done for model level just above LCL +! + ZWORK1(:) = ( 2. * ZTHEUL(:) ) / ( ZWORK2(:) + PTHES(:,JKP) ) - 1. + PCAPE(:) = PCAPE(:) + XG * ZWORK3(:) * MAX( 0., ZWORK1(:) ) +! +! +!* 10. Compute final values of updraft mass flux, enthalpy, r_w +! at level k+1 +! -------------------------------------------------------- +! + PUMF(:,JKP) = PUMF(:,JK) - PUDR(:,JKP) + PUER(:,JKP) + PUMF(:,JKP) = MAX( PUMF(:,JKP), 0.1 ) + PUTHL(:,JKP) = ( PUMF(:,JK) * PUTHL(:,JK) + & + PUER(:,JKP) * PTHL(:,JK) - PUDR(:,JKP) * PUTHL(:,JK) ) & + / PUMF(:,JKP) + PUTHL(:,JKP) - PUTHL(:,JK) + PURW(:,JKP) = ( PUMF(:,JK) * PURW(:,JK) + & + PUER(:,JKP) * PRW(:,JK) - PUDR(:,JKP) * PURW(:,JK) ) & + / PUMF(:,JKP) - PURR(:,JKP) - PURS(:,JKP) +! +! + ZE1(:) = ZE2(:) ! update fractional entrainment/detrainment + ZD1(:) = ZD2(:) +! + END WHERE +! +END DO +! +!* 12.1 Set OTRIG to False if cloud thickness < XCDEPTH +! or CAPE < 1 +! ------------------------------------------------ +! + DO JI = 1, IIE + JK = KCTL(JI) + OTRIG(JI) = PZ(JI,JK) - PZLCL(JI) >= XCDEPTH & + .AND. PCAPE(JI) > 1. + END DO + WHERE( .NOT. OTRIG(:) ) + KCTL(:) = IKB + END WHERE +KETL(:) = MAX( KETL(:), KLCL(:) + 2 ) +KETL(:) = MIN( KETL(:), KCTL(:) ) +! +! +!* 12.2 If the ETL and CTL are the same detrain updraft mass +! flux at this level +! ------------------------------------------------------- +! +ZWORK1(:) = 0. +WHERE ( KETL(:) == KCTL(:) ) ZWORK1(:) = 1. +! +DO JI = 1, IIE + JK = KETL(JI) + PUDR(JI,JK) = PUDR(JI,JK) + & + ( PUMF(JI,JK) - PUER(JI,JK) ) * ZWORK1(JI) + PUER(JI,JK) = PUER(JI,JK) * ( 1. - ZWORK1(JI) ) + PUMF(JI,JK) = PUMF(JI,JK) * ( 1. - ZWORK1(JI) ) + JKP = KCTL(JI) + 1 + PUER(JI,JKP) = 0. ! entrainm/detr rates have been already computed + PUDR(JI,JKP) = 0. ! at level KCTL+1, set them to zero + PURW(JI,JKP) = 0. + PURC(JI,JKP) = 0. + PURI(JI,JKP) = 0. + PUTHL(JI,JKP) = 0. + PURI(JI,JKP+1)= 0. + PURC(JI,JKP+1)= 0. +END DO +! +!* 12.3 Adjust mass flux profiles, detrainment rates, and +! precipitation fallout rates to reflect linear decrease +! in mass flux between the ETL and CTL +! ------------------------------------------------------- +! +ZWORK1(:) = 0. +JK1 = MINVAL( KETL(:) ) +JK2 = MAXVAL( KCTL(:) ) +DO JK = JK1, JK2 + DO JI = 1, IIE + IF( JK > KETL(JI) .AND. JK <= KCTL(JI) ) THEN + ZWORK1(JI) = ZWORK1(JI) + PDPRES(JI,JK) + END IF + END DO +END DO +! +DO JI = 1, IIE + JK = KETL(JI) + ZWORK1(JI) = PUMF(JI,JK) / MAX( 1., ZWORK1(JI) ) +END DO +! +DO JK = JK1 + 1, JK2 + JKP = JK - 1 + DO JI = 1, IIE + IF ( JK > KETL(JI) .AND. JK <= KCTL(JI) ) THEN + ! PUTPR(JI) = PUTPR(JI) - ( PURR(JI,JK) + PURS(JI,JK) ) * PUMF(JI,JKP) + PUTPR(JI) = PUTPR(JI) - PUPR(JI,JK) + PUDR(JI,JK) = PDPRES(JI,JK) * ZWORK1(JI) + PUMF(JI,JK) = PUMF(JI,JKP) - PUDR(JI,JK) + PUPR(JI,JK) = PUMF(JI,JKP) * ( PURR(JI,JK) + PURS(JI,JK) ) + PUTPR(JI) = PUTPR(JI) + PUPR(JI,JK) + END IF + END DO +END DO +! +! 12.4 Set mass flux and entrainment in the source layer. +! Linear increase throughout the source layer. +! ------------------------------------------------------- +! +!IWORK(:) = MIN( KPBL(:), KLCL(:) - 1 ) +IWORK(:) = KPBL(:) +DO JI = 1, IIE + JK = KDPL(JI) + JKP = IWORK(JI) +! mixed layer depth + ZWORK2(JI) = PPRES(JI,JK) - PPRES(JI,JKP) + PDPRES(JI,JK) +END DO +! +JKP = MAXVAL( IWORK(:) ) +DO JK = JKM, JKP + DO JI = 1, IIE + IF ( JK >= KDPL(JI) .AND. JK <= IWORK(JI) ) THEN + PUER(JI,JK) = PUER(JI,JK) + PMFLCL(JI) * PDPRES(JI,JK) / ( ZWORK2(JI) + 0.1 ) + PUMF(JI,JK) = PUMF(JI,JK-1) + PUER(JI,JK) + END IF + END DO +END DO +! +! +!* 13. If cloud thickness is smaller than 3 km, no +! convection is allowed +! Nota: For technical reasons, we stop the convection +! computations in this case and do not go back to +! TRIGGER_FUNCT to look for the next unstable LCL +! which could produce a thicker cloud. +! --------------------------------------------------- +! +GWORK6(:,:) = SPREAD( OTRIG(:), DIM=2, NCOPIES=KLEV ) +WHERE ( .NOT. OTRIG(:) ) PUTPR(:) = 0. +WHERE ( .NOT. GWORK6(:,:) ) + PUMF(:,:) = 0. + PUDR(:,:) = 0. + PUER(:,:) = 0. + PUTHL(:,:) = PTHL(:,:) + PURW(:,:) = PRW(:,:) + PUPR(:,:) = 0. + PURC(:,:) = 0. + PURI(:,:) = 0. + PURR(:,:) = 0. + PURS(:,:) = 0. +END WHERE +! +END SUBROUTINE CONVECT_UPDRAFT diff --git a/src/mesonh/conv/convect_updraft_shal.f90 b/src/mesonh/conv/convect_updraft_shal.f90 new file mode 100644 index 000000000..c7e53eb86 --- /dev/null +++ b/src/mesonh/conv/convect_updraft_shal.f90 @@ -0,0 +1,598 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 conv 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ################# + MODULE MODI_CONVECT_UPDRAFT_SHAL +! ################# +! +INTERFACE +! + SUBROUTINE CONVECT_UPDRAFT_SHAL( KLON, KLEV, & + KICE, PPRES, PDPRES, PZ, PTHL, PTHV, PTHES, PRW,& + PTHLCL, PTLCL, PRVLCL, PWLCL, PZLCL, PTHVELCL, & + PMFLCL, OTRIG, KLCL, KDPL, KPBL, & + PUMF, PUER, PUDR, PUTHL, PUTHV, PURW, & + PURC, PURI, PCAPE, KCTL, KETL ) +! +INTEGER, INTENT(IN) :: KLON ! horizontal dimension +INTEGER, INTENT(IN) :: KLEV ! vertical dimension +INTEGER, INTENT(IN) :: KICE ! flag for ice ( 1 = yes, + ! 0 = no ice ) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PTHL ! grid scale enthalpy (J/kg) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PTHV ! grid scale theta_v +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PTHES ! grid scale saturated theta_e +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PRW ! grid scale total water + ! mixing ratio +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PPRES ! pressure (P) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PDPRES! pressure difference between + ! bottom and top of layer (Pa) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PZ ! height of model layer (m) +REAL, DIMENSION(KLON), INTENT(IN) :: PTHLCL ! theta at LCL +REAL, DIMENSION(KLON), INTENT(IN) :: PTLCL ! temp. at LCL +REAL, DIMENSION(KLON), INTENT(IN) :: PRVLCL ! vapor mixing ratio at LCL +REAL, DIMENSION(KLON), INTENT(IN) :: PWLCL ! parcel velocity at LCL (m/s) +REAL, DIMENSION(KLON), INTENT(IN) :: PMFLCL ! cloud base unit mass flux + ! (kg/s) +REAL, DIMENSION(KLON), INTENT(IN) :: PZLCL ! height at LCL (m) +REAL, DIMENSION(KLON), INTENT(IN) :: PTHVELCL ! environm. theta_v at LCL (K) +LOGICAL, DIMENSION(KLON), INTENT(INOUT):: OTRIG! logical mask for convection +INTEGER, DIMENSION(KLON), INTENT(IN) :: KLCL ! contains vert. index of LCL +INTEGER, DIMENSION(KLON), INTENT(IN) :: KDPL ! contains vert. index of DPL +INTEGER, DIMENSION(KLON), INTENT(IN) :: KPBL ! " vert. index of source layertop +! +! +INTEGER, DIMENSION(KLON), INTENT(OUT):: KCTL ! contains vert. index of CTL +INTEGER, DIMENSION(KLON), INTENT(OUT):: KETL ! contains vert. index of & + !equilibrium (zero buoyancy) level +REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PUMF ! updraft mass flux (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PUER ! updraft entrainment (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PUDR ! updraft detrainment (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PUTHL ! updraft enthalpy (J/kg) +REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PUTHV ! updraft theta_v (K) +REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PURW ! updraft total water (kg/kg) +REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PURC ! updraft cloud water (kg/kg) +REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PURI ! updraft cloud ice (kg/kg) +REAL, DIMENSION(KLON), INTENT(OUT):: PCAPE ! available potent. energy +! +END SUBROUTINE CONVECT_UPDRAFT_SHAL +! +END INTERFACE +! +END MODULE MODI_CONVECT_UPDRAFT_SHAL +! ############################################################################### + SUBROUTINE CONVECT_UPDRAFT_SHAL( KLON, KLEV, & + KICE, PPRES, PDPRES, PZ, PTHL, PTHV, PTHES, PRW,& + PTHLCL, PTLCL, PRVLCL, PWLCL, PZLCL, PTHVELCL, & + PMFLCL, OTRIG, KLCL, KDPL, KPBL, & + PUMF, PUER, PUDR, PUTHL, PUTHV, PURW, & + PURC, PURI, PCAPE, KCTL, KETL ) +! ############################################################################### +! +!!**** Compute updraft properties from DPL to CTL. +!! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to determine updraft properties +!! ( mass flux, thermodynamics, precipitation ) +!! +!! +!!** METHOD +!! ------ +!! Computations are done at every model level starting from bottom. +!! The use of masks allows to optimise the inner loops (horizontal loops). +!! +!! +!! +!! EXTERNAL +!! -------- +!! Routine CONVECT_MIXING_FUNCT +!! Routine CONVECT_CONDENS +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST +!! XG ! gravity constant +!! XP00 ! reference pressure +!! XRD, XRV ! gaz constants for dry air and water vapor +!! XCPD, XCPV, XCL ! Cp of dry air, water vapor and liquid water +!! XTT ! triple point temperature +!! XLVTT ! vaporisation heat at XTT +!! +!! +!! Module MODD_CONVPAR_SHAL +!! XA25 ! reference grid area +!! XCRAD ! cloud radius +!! XCDEPTH ! minimum necessary cloud depth +!! XENTR ! entrainment constant +!! XNHGAM ! coefficient for buoyancy term in w eq. +!! ! accounting for nh-pressure +!! XTFRZ1 ! begin of freezing interval +!! XTFRZ2 ! begin of freezing interval +!! +!! Module MODD_CONVPAREXT +!! JCVEXB, JCVEXT ! extra levels on the vertical boundaries +!! +!! REFERENCE +!! --------- +!! +!! Book1,2 of documentation ( routine CONVECT_UPDRAFT) +!! Kain and Fritsch, 1990, J. Atmos. Sci., Vol. +!! Kain and Fritsch, 1993, Meteor. Monographs, Vol. +!! +!! AUTHOR +!! ------ +!! P. BECHTOLD * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original 07/11/95 +!! Last modified 10/12/97 +!! F. Bouyssel 05/11/08 Modifications for reproductibility +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_CONVPAR_SHAL +USE MODD_CONVPAREXT +USE MODI_CONVECT_CONDENS +USE MODI_CONVECT_MIXING_FUNCT +! +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +INTEGER, INTENT(IN) :: KLON ! horizontal dimension +INTEGER, INTENT(IN) :: KLEV ! vertical dimension +INTEGER, INTENT(IN) :: KICE ! flag for ice ( 1 = yes, + ! 0 = no ice ) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PTHL ! grid scale enthalpy (J/kg) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PTHV ! grid scale theta_v +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PTHES ! grid scale saturated theta_e +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PRW ! grid scale total water + ! mixing ratio +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PPRES ! pressure (P) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PDPRES! pressure difference between + ! bottom and top of layer (Pa) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PZ ! height of model layer (m) +REAL, DIMENSION(KLON), INTENT(IN) :: PTHLCL ! theta at LCL +REAL, DIMENSION(KLON), INTENT(IN) :: PTLCL ! temp. at LCL +REAL, DIMENSION(KLON), INTENT(IN) :: PRVLCL ! vapor mixing ratio at LCL +REAL, DIMENSION(KLON), INTENT(IN) :: PWLCL ! parcel velocity at LCL (m/s) +REAL, DIMENSION(KLON), INTENT(IN) :: PMFLCL ! cloud base unit mass flux + ! (kg/s) +REAL, DIMENSION(KLON), INTENT(IN) :: PZLCL ! height at LCL (m) +REAL, DIMENSION(KLON), INTENT(IN) :: PTHVELCL ! environm. theta_v at LCL (K) +LOGICAL, DIMENSION(KLON), INTENT(INOUT):: OTRIG! logical mask for convection +INTEGER, DIMENSION(KLON), INTENT(IN) :: KLCL ! contains vert. index of LCL +INTEGER, DIMENSION(KLON), INTENT(IN) :: KDPL ! contains vert. index of DPL +INTEGER, DIMENSION(KLON), INTENT(IN) :: KPBL ! " vert. index of source layertop +! +! +INTEGER, DIMENSION(KLON), INTENT(OUT):: KCTL ! contains vert. index of CTL +INTEGER, DIMENSION(KLON), INTENT(OUT):: KETL ! contains vert. index of & + !equilibrium (zero buoyancy) level +REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PUMF ! updraft mass flux (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PUER ! updraft entrainment (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PUDR ! updraft detrainment (kg/s) +REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PUTHL ! updraft enthalpy (J/kg) +REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PUTHV ! updraft theta_v (K) +REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PURW ! updraft total water (kg/kg) +REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PURC ! updraft cloud water (kg/kg) +REAL, DIMENSION(KLON,KLEV), INTENT(OUT):: PURI ! updraft cloud ice (kg/kg) +REAL, DIMENSION(KLON), INTENT(OUT):: PCAPE ! available potent. energy +! +!* 0.2 Declarations of local variables : +! +INTEGER :: IIE, IKB, IKE ! horizontal and vertical loop bounds +INTEGER :: JI ! horizontal loop index +INTEGER :: JK, JKP, JKM, JK1, JK2 ! vertical loop index +REAL :: ZEPSA ! R_v / R_d, C_pv / C_pd +REAL :: ZRDOCP ! C_pd / R_d, R_d / C_pd +! +REAL, DIMENSION(KLON) :: ZUT ! updraft temperature (K) +REAL, DIMENSION(KLON) :: ZUW1, ZUW2 ! square of updraft vert. + ! velocity at levels k and k+1 +REAL, DIMENSION(KLON) :: ZE1,ZE2,ZD1,ZD2 ! fractional entrainm./detrain + ! rates at levels k and k+1 +REAL, DIMENSION(KLON) :: ZMIXF ! critical mixed fraction +REAL, DIMENSION(KLON) :: ZCPH ! specific heat C_ph +REAL, DIMENSION(KLON) :: ZLV, ZLS ! latent heat of vaporis., sublim. +REAL, DIMENSION(KLON) :: ZURV ! updraft water vapor at level k+1 +REAL, DIMENSION(KLON) :: ZPI ! Pi=(P0/P)**(Rd/Cpd) +REAL, DIMENSION(KLON) :: ZTHEUL ! theta_e for undilute ascent +REAL, DIMENSION(KLON) :: ZWORK1, ZWORK2, ZWORK3, ZWORK4, ZWORK5, & + ZWORK6 ! work arrays +INTEGER, DIMENSION(KLON) :: IWORK ! wok array +LOGICAL, DIMENSION(KLON) :: GWORK1, GWORK2, GWORK4, GWORK5 + ! work arrays +LOGICAL, DIMENSION(KLON,KLEV) :: GWORK6 ! work array +! +! +!------------------------------------------------------------------------------- +! +! 0.3 Set loop bounds +! --------------- +! +IKB = 1 + JCVEXB +IKE = KLEV - JCVEXT +IIE = KLON +! +! +!* 1. Initialize updraft properties and local variables +! ------------------------------------------------- +! +ZEPSA = XRV / XRD +ZRDOCP = XRD / XCPD +! +PUMF(:,:) = 0. +PUER(:,:) = 0. +PUDR(:,:) = 0. +PUTHL(:,:) = 0. +PUTHV(:,:) = 0. +PURW(:,:) = 0. +PURC(:,:) = 0. +PURI(:,:) = 0. +ZUW1(:) = PWLCL(:) * PWLCL(:) +ZUW2(:) = 0. +ZE1(:) = 0. +ZD1(:) = 0. +PCAPE(:) = 0. +KCTL(:) = IKB +KETL(:) = KLCL(:) +GWORK2(:) = .TRUE. +ZPI(:) = 1. +ZWORK3(:) = 0. +ZWORK4(:) = 0. +ZWORK5(:) = 0. +ZWORK6(:) = 0. +GWORK1(:) = .FALSE. +GWORK4(:) = .FALSE. +! +! +!* 1.1 Compute undilute updraft theta_e for CAPE computations +! Bolton (1980) formula. +! Define accurate enthalpy for updraft +! ----------------------------------------------------- +! +ZTHEUL(:) = PTLCL(:) * ( PTHLCL(:) / PTLCL(:) ) ** ( 1. - 0.28 * PRVLCL(:) ) & + * EXP( ( 3374.6525 / PTLCL(:) - 2.5403 ) * & + PRVLCL(:) * ( 1. + 0.81 * PRVLCL(:) ) ) +! +! +ZWORK1(:) = ( XCPD + PRVLCL(:) * XCPV ) * PTLCL(:) & + + ( 1. + PRVLCL(:) ) * XG * PZLCL(:) +! +! +!* 2. Set updraft properties between DPL and LCL +! ------------------------------------------ +! +JKP = MAXVAL( KLCL(:) ) +JKM = MINVAL( KDPL(:) ) +DO JK = JKM, JKP + DO JI = 1, IIE + IF ( JK >= KDPL(JI) .AND. JK < KLCL(JI) ) THEN + PUMF(JI,JK) = PMFLCL(JI) + PUTHL(JI,JK) = ZWORK1(JI) + PUTHV(JI,JK) = PTHLCL(JI) * ( 1. + ZEPSA * PRVLCL(JI) ) / & + ( 1. + PRVLCL(JI) ) + PURW(JI,JK) = PRVLCL(JI) + END IF + END DO +END DO +! +! +!* 3. Enter loop for updraft computations +! ------------------------------------ +! +DO JK = IKB + 1, IKE - 1 + ZWORK6(:) = 1. + JKP = JK + 1 +! + GWORK4(:) = JK >= KLCL(:) - 1 + GWORK1(:) = GWORK4(:) .AND. GWORK2(:) ! this mask is used to confine + ! updraft computations between the LCL and the CTL +! + WHERE( JK == KLCL(:) - 1 ) ZWORK6(:) = 0. ! factor that is used in buoyancy + ! computation at first level above LCL +! +! +!* 4. Estimate condensate, L_v L_i, Cph and theta_v at level k+1 +! ---------------------------------------------------------- +! + ZWORK1(:) = PURC(:,JK) + ZWORK2(:) = PURI(:,JK) + CALL CONVECT_CONDENS( KLON, KICE, PPRES(:,JKP), PUTHL(:,JK), PURW(:,JK),& + ZWORK1, ZWORK2, PZ(:,JKP), GWORK1, ZUT, ZURV, & + PURC(:,JKP), PURI(:,JKP), ZLV, ZLS, ZCPH ) +! +! + ZPI(:) = ( XP00 / PPRES(:,JKP) ) ** ZRDOCP + WHERE ( GWORK1(:) ) +! + PUTHV(:,JKP) = ZPI(:) * ZUT(:) * ( 1. + ZEPSA * ZURV(:) ) & + / ( 1. + PURW(:,JK) ) +! +! +!* 5. Compute square of vertical velocity using entrainment +! at level k +! ----------------------------------------------------- +! + ZWORK3(:) = PZ(:,JKP) - PZ(:,JK) * ZWORK6(:) - & + ( 1. - ZWORK6(:) ) * PZLCL(:) ! level thickness + ZWORK4(:) = PTHV(:,JK) * ZWORK6(:) + & + ( 1. - ZWORK6(:) ) * PTHVELCL(:) + ZWORK5(:) = 2. * ZUW1(:) * PUER(:,JK) / MAX( .1, PUMF(:,JK) ) + ZUW2(:) = ZUW1(:) + ZWORK3(:) * XNHGAM * XG * & + ( ( PUTHV(:,JK) + PUTHV(:,JKP) ) / & + ( ZWORK4(:) + PTHV(:,JKP) ) - 1. ) & ! buoyancy term + - ZWORK5(:) ! entrainment term +! +! +!* 6. Update total precipitation: dr_r=(r_c+r_i)*exp(-rate*dz) +! -------------------------------------------------------- +! +! compute level mean vertical velocity + ZWORK2(:) = 0.5 * & + ( SQRT( MAX( 1.E-2, ZUW2(:) ) ) + & + SQRT( MAX( 1.E-2, ZUW1(:) ) ) ) +! +! +!* 7. Update r_c, r_i, enthalpy, r_w for precipitation +! ------------------------------------------------------- +! + PURW(:,JKP) = PURW(:,JK) + PURC(:,JKP) = PURC(:,JKP) + PURI(:,JKP) = PURI(:,JKP) + PUTHL(:,JKP) = PUTHL(:,JK) +! + ZUW1(:) = ZUW2(:) +! + END WHERE +! +! +!* 8. Compute entrainment and detrainment using conservative +! variables adjusted for precipitation ( not for entrainment) +! ----------------------------------------------------------- +! +!* 8.1 Compute critical mixed fraction by estimating unknown +! T^mix r_c^mix and r_i^mix from enthalpy^mix and r_w^mix +! We determine the zero crossing of the linear curve +! evaluating the derivative using ZMIXF=0.1. +! ----------------------------------------------------- +! + ZMIXF(:) = 0.1 ! starting value for critical mixed fraction + ZWORK1(:) = ZMIXF(:) * PTHL(:,JKP) & + + ( 1. - ZMIXF(:) ) * PUTHL(:,JKP) ! mixed enthalpy + ZWORK2(:) = ZMIXF(:) * PRW(:,JKP) & + + ( 1. - ZMIXF(:) ) * PURW(:,JKP) ! mixed r_w +! + CALL CONVECT_CONDENS( KLON, KICE, PPRES(:,JKP), ZWORK1, ZWORK2, & + PURC(:,JKP), PURI(:,JKP), PZ(:,JKP), GWORK1, ZUT,& + ZWORK3, ZWORK4, ZWORK5, ZLV, ZLS, ZCPH ) +! put in enthalpy and r_w and get T r_c, r_i (ZUT, ZWORK4-5) +! + ! compute theta_v of mixture + ZWORK3(:) = ZUT(:) * ZPI(:) * ( 1. + ZEPSA * ( & + ZWORK2(:) - ZWORK4(:) - ZWORK5(:) ) ) / ( 1. + ZWORK2(:) ) + ! compute final value of critical mixed fraction using theta_v + ! of mixture, grid-scale and updraft + ZMIXF(:) = MAX( 0., PUTHV(:,JKP) - PTHV(:,JKP) ) * ZMIXF(:) / & + ( PUTHV(:,JKP) - ZWORK3(:) + 1.E-10 ) + ZMIXF(:) = MAX( 0., MIN( 1., ZMIXF(:) ) ) +! +! +!* 8.2 Compute final midlevel values for entr. and detrainment +! after call of distribution function +! ------------------------------------------------------- +! +! + CALL CONVECT_MIXING_FUNCT ( KLON, ZMIXF, 1, ZE2, ZD2 ) +! Note: routine MIXING_FUNCT returns fractional entrainm/detrainm. rates +! + ZE2=MIN(ZD2,MAX(.3,ZE2)) +! +! ZWORK1(:) = XENTR * PMFLCL(:) * PDPRES(:,JKP) / XCRAD ! rate of env. inflow +!*MOD + zwork1(:) = xentr * xg / xcrad * pumf(:,jk) * ( pz(:,jkp) - pz(:,jk) ) +! ZWORK1(:) = XENTR * pumf(:,jk) * PDPRES(:,JKP) / XCRAD ! rate of env. inflow +!*MOD + ZWORK2(:) = 0. + WHERE ( GWORK1(:) ) ZWORK2(:) = 1. + WHERE ( PUTHV(:,JKP) > PTHV(:,JKP) ) + PUER(:,JKP) = 0.5 * ZWORK1(:) * ( ZE1(:) + ZE2(:) ) * ZWORK2(:) + PUDR(:,JKP) = 0.5 * ZWORK1(:) * ( ZD1(:) + ZD2(:) ) * ZWORK2(:) + ELSEWHERE + PUER(:,JKP) = 0. + PUDR(:,JKP) = ZWORK1(:) * ZWORK2(:) + END WHERE +! +!* 8.3 Determine equilibrium temperature level +! -------------------------------------- +! + WHERE ( PUTHV(:,JKP) > PTHV(:,JKP) .AND. JK > KLCL(:) + 1 & + .AND. GWORK1(:) ) + KETL(:) = JKP ! equilibrium temperature level + END WHERE +! +!* 8.4 If the calculated detrained mass flux is greater than +! the total updraft mass flux, or vertical velocity is +! negative, all cloud mass detrains at previous model level, +! exit updraft calculations - CTL is attained +! ------------------------------------------------------- +! + WHERE( GWORK1(:) ) & + GWORK2(:) = PUMF(:,JK) - PUDR(:,JKP) > 10. .AND. ZUW2(:) > 0. + WHERE ( GWORK2(:) ) KCTL(:) = JKP ! cloud top level + GWORK1(:) = GWORK2(:) .AND. GWORK4(:) +! + IF ( COUNT( GWORK2(:) ) == 0 ) EXIT +! +! +!* 9. Compute CAPE for undilute ascent using theta_e and +! theta_es instead of theta_v. This estimation produces +! a significantly larger value for CAPE than the actual one. +! ---------------------------------------------------------- +! + WHERE ( GWORK1(:) ) +! + ZWORK3(:) = PZ(:,JKP) - PZ(:,JK) * ZWORK6(:) - & + ( 1. - ZWORK6(:) ) * PZLCL(:) ! level thickness + ZWORK2(:) = PTHES(:,JK) + ( 1. - ZWORK6(:) ) * & + ( PTHES(:,JKP) - PTHES(:,JK) ) / ( PZ(:,JKP) - PZ(:,JK) ) * & + ( PZLCL(:) - PZ(:,JK) ) ! linear interpolation for theta_es at LCL + ! ( this is only done for model level just above LCL +! + ZWORK1(:) = ( 2. * ZTHEUL(:) ) / ( ZWORK2(:) + PTHES(:,JKP) ) - 1. + PCAPE(:) = PCAPE(:) + XG * ZWORK3(:) * MAX( 0., ZWORK1(:) ) +! +! +!* 10. Compute final values of updraft mass flux, enthalpy, r_w +! at level k+1 +! -------------------------------------------------------- +! + PUMF(:,JKP) = PUMF(:,JK) - PUDR(:,JKP) + PUER(:,JKP) + PUMF(:,JKP) = MAX( PUMF(:,JKP), 0.1 ) + PUTHL(:,JKP) = ( PUMF(:,JK) * PUTHL(:,JK) + & + PUER(:,JKP) * PTHL(:,JK) - PUDR(:,JKP) * PUTHL(:,JK) ) & + / PUMF(:,JKP) + PURW(:,JKP) = ( PUMF(:,JK) * PURW(:,JK) + & + PUER(:,JKP) * PRW(:,JK) - PUDR(:,JKP) * PURW(:,JK) ) & + / PUMF(:,JKP) +! +! + ZE1(:) = ZE2(:) ! update fractional entrainment/detrainment + ZD1(:) = ZD2(:) +! + END WHERE +! +END DO +! +!* 12.1 Set OTRIG to False if cloud thickness < 0.5km +! or > 3km (deep convection) or CAPE < 1 +! ------------------------------------------------ +! + DO JI = 1, IIE + JK = KCTL(JI) + ZWORK1(JI) = PZ(JI,JK) - PZLCL(JI) + OTRIG(JI) = ZWORK1(JI) >= XCDEPTH .AND. ZWORK1(JI) < XCDEPTH_D & + .AND. PCAPE(JI) > 1. + END DO + WHERE( .NOT. OTRIG(:) ) + KCTL(:) = IKB + END WHERE +KETL(:) = MAX( KETL(:), KLCL(:) + 2 ) +KETL(:) = MIN( KETL(:), KCTL(:) ) +! +! +!* 12.2 If the ETL and CTL are the same detrain updraft mass +! flux at this level +! ------------------------------------------------------- +! +ZWORK1(:) = 0. +WHERE ( KETL(:) == KCTL(:) ) ZWORK1(:) = 1. +! +DO JI = 1, IIE + JK = KETL(JI) + PUDR(JI,JK) = PUDR(JI,JK) + & + ( PUMF(JI,JK) - PUER(JI,JK) ) * ZWORK1(JI) + PUER(JI,JK) = PUER(JI,JK) * ( 1. - ZWORK1(JI) ) + PUMF(JI,JK) = PUMF(JI,JK) * ( 1. - ZWORK1(JI) ) + JKP = KCTL(JI) + 1 + PUER(JI,JKP) = 0. ! entrainm/detr rates have been already computed + PUDR(JI,JKP) = 0. ! at level KCTL+1, set them to zero + PURW(JI,JKP) = 0. + PURC(JI,JKP) = 0. + PURI(JI,JKP) = 0. + PUTHL(JI,JKP) = 0. + PURC(JI,JKP+1)= 0. + PURI(JI,JKP+1)= 0. +END DO +! +!* 12.3 Adjust mass flux profiles, detrainment rates, and +! precipitation fallout rates to reflect linear decrease +! in mass flux between the ETL and CTL +! ------------------------------------------------------- +! +ZWORK1(:) = 0. +JK1 = MINVAL( KETL(:) ) +JK2 = MAXVAL( KCTL(:) ) + +DO JK = JK1, JK2 + DO JI = 1, IIE + IF( JK > KETL(JI) .AND. JK <= KCTL(JI) ) THEN + ZWORK1(JI) = ZWORK1(JI) + PDPRES(JI,JK) + END IF + END DO +END DO +! +DO JI = 1, IIE + JK = KETL(JI) + ZWORK1(JI) = PUMF(JI,JK) / MAX( 1., ZWORK1(JI) ) +END DO +! +DO JK = JK1 + 1, JK2 + JKP = JK - 1 + DO JI = 1, IIE + IF ( JK > KETL(JI) .AND. JK <= KCTL(JI) ) THEN + PUDR(JI,JK) = PDPRES(JI,JK) * ZWORK1(JI) + PUMF(JI,JK) = PUMF(JI,JKP) - PUDR(JI,JK) + END IF + END DO +END DO +! +! 12.4 Set mass flux and entrainment in the source layer. +! Linear increase throughout the source layer. +! ------------------------------------------------------- +! +!IWORK(:) = MIN( KPBL(:), KLCL(:) - 1 ) +IWORK(:) = KPBL(:) +DO JI = 1, IIE + JK = KDPL(JI) + JKP = IWORK(JI) +! mixed layer depth + ZWORK2(JI) = PPRES(JI,JK) - PPRES(JI,JKP) + PDPRES(JI,JK) +END DO +! +JKP = MAXVAL( IWORK(:) ) +DO JK = JKM, JKP + DO JI = 1, IIE + IF ( JK >= KDPL(JI) .AND. JK <= IWORK(JI) ) THEN + PUER(JI,JK) = PUER(JI,JK) + PMFLCL(JI) * PDPRES(JI,JK) / ( ZWORK2(JI) + 0.1 ) + PUMF(JI,JK) = PUMF(JI,JK-1) + PUER(JI,JK) + END IF + END DO +END DO +! +! +!* 13. If cloud thickness is smaller than .5 km or > 3 km +! no shallow convection is allowed +! Nota: For technical reasons, we stop the convection +! computations in this case and do not go back to +! TRIGGER_FUNCT to look for the next unstable LCL +! which could produce a thicker cloud. +! --------------------------------------------------- +! +GWORK6(:,:) = SPREAD( OTRIG(:), DIM=2, NCOPIES=KLEV ) +WHERE ( .NOT. GWORK6(:,:) ) + PUMF(:,:) = 0. + PUDR(:,:) = 0. + PUER(:,:) = 0. + PUTHL(:,:) = PTHL(:,:) + PURW(:,:) = PRW(:,:) + PURC(:,:) = 0. + PURI(:,:) = 0. +END WHERE +! +END SUBROUTINE CONVECT_UPDRAFT_SHAL diff --git a/src/mesonh/conv/deep_convection.f90 b/src/mesonh/conv/deep_convection.f90 new file mode 100644 index 000000000..2a6b30b55 --- /dev/null +++ b/src/mesonh/conv/deep_convection.f90 @@ -0,0 +1,1393 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +! ###################### + MODULE MODI_DEEP_CONVECTION +! ###################### +! +INTERFACE +! + SUBROUTINE DEEP_CONVECTION( KLON, KLEV, KIDIA, KFDIA, KBDIA, KTDIA, & + PDTCONV, KICE, OREFRESH, ODOWN, OSETTADJ, & + PPABST, PZZ, PDXDY, PTIMEC, & + PTT, PRVT, PRCT, PRIT, PUT, PVT, PWT, & + KCOUNT, PTTEN, PRVTEN, PRCTEN, PRITEN, & + PPRLTEN, PPRSTEN, & + KCLTOP, KCLBAS, PPRLFLX, PPRSFLX, & + PUMF, PDMF, PCAPE, & + OCH1CONV, KCH1, PCH1, PCH1TEN, & + OUSECHEM, OCH_CONV_SCAV, OCH_CONV_LINOX, & + ODUST, OSALT, PRHODREF, PIC_RATE, PCG_RATE ) + +INTEGER, INTENT(IN) :: KLON ! horizontal dimension +INTEGER, INTENT(IN) :: KLEV ! vertical dimension +INTEGER, INTENT(IN) :: KIDIA ! value of the first point in x +INTEGER, INTENT(IN) :: KFDIA ! value of the last point in x +INTEGER, INTENT(IN) :: KBDIA ! vertical computations start at +! ! KBDIA that is at least 1 +INTEGER, INTENT(IN) :: KTDIA ! vertical computations can be + ! limited to KLEV + 1 - KTDIA + ! default=1 +REAL, INTENT(IN) :: PDTCONV ! Interval of time between two + ! calls of the deep convection + ! scheme +INTEGER, INTENT(IN) :: KICE ! flag for ice ( 1 = yes, + ! 0 = no ice ) +LOGICAL, INTENT(IN) :: OREFRESH ! refresh or not tendencies + ! at every call +LOGICAL, INTENT(IN) :: ODOWN ! take or not convective + ! downdrafts into account +LOGICAL, INTENT(IN) :: OSETTADJ ! logical to set convective + ! adjustment time by user +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PTT ! grid scale temperature at t +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PRVT ! grid scale water vapor " +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PRCT ! grid scale r_c " +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PRIT ! grid scale r_i " +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PUT ! grid scale horiz. wind u " +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PVT ! grid scale horiz. wind v " +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PWT ! grid scale vertical + ! velocity (m/s) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PPABST ! grid scale pressure at t +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PZZ ! height of model layer (m) +REAL, DIMENSION(KLON), INTENT(IN) :: PDXDY ! horizontal grid area (m-a2) +REAL, DIMENSION(KLON), INTENT(IN) :: PTIMEC ! value of convective adjustment + ! time if OSETTADJ=.TRUE. +! +INTEGER, DIMENSION(KLON), INTENT(INOUT):: KCOUNT ! convective counter (recompute + ! tendency or keep it) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PTTEN ! convective temperature + ! tendency (K/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PRVTEN ! convective r_v tendency (1/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PRCTEN ! convective r_c tendency (1/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PRITEN ! convective r_i tendency (1/s) +REAL, DIMENSION(KLON), INTENT(INOUT):: PPRLTEN! liquid surf. precipitation + ! tendency (m/s) +REAL, DIMENSION(KLON), INTENT(INOUT):: PPRSTEN! solid surf. precipitation + ! tendency (m/s) +INTEGER, DIMENSION(KLON), INTENT(INOUT):: KCLTOP ! cloud top level +INTEGER, DIMENSION(KLON), INTENT(INOUT):: KCLBAS ! cloud base level + ! they are given a value of + ! 0 if no convection +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PPRLFLX! liquid precip flux (m/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PPRSFLX! solid precip flux (m/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PUMF ! updraft mass flux (kg/s m2) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PDMF ! downdraft mass flux (kg/s m2) +REAL, DIMENSION(KLON), INTENT(INOUT):: PCAPE ! maximum CAPE (J/kg) +! +LOGICAL, INTENT(IN) :: OCH1CONV ! include tracer transport +INTEGER, INTENT(IN) :: KCH1 ! number of species +REAL, DIMENSION(KLON,KLEV,KCH1), INTENT(IN) :: PCH1! grid scale chemical species +REAL, DIMENSION(KLON,KLEV,KCH1), INTENT(INOUT):: PCH1TEN! species conv. tendency (1/s) +LOGICAL, INTENT(IN) :: OUSECHEM ! flag for chemistry +LOGICAL, INTENT(IN) :: OCH_CONV_SCAV ! & scavenging +LOGICAL, INTENT(IN) :: OCH_CONV_LINOX ! & LiNOx +LOGICAL, INTENT(IN) :: ODUST ! flag for dust +LOGICAL, INTENT(IN) :: OSALT ! flag for sea salt +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PRHODREF ! grid scale density +REAL, DIMENSION(KLON), INTENT(INOUT) :: PIC_RATE ! IC lightning frequency +REAL, DIMENSION(KLON), INTENT(INOUT) :: PCG_RATE ! CG lightning frequency + +! +END SUBROUTINE DEEP_CONVECTION +! +END INTERFACE +! +END MODULE MODI_DEEP_CONVECTION +! +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 conv 2006/09/21 10:55:01 +!----------------------------------------------------------------- +! ############################################################################ + SUBROUTINE DEEP_CONVECTION( KLON, KLEV, KIDIA, KFDIA, KBDIA, KTDIA, & + PDTCONV, KICE, OREFRESH, ODOWN, OSETTADJ, & + PPABST, PZZ, PDXDY, PTIMEC, & + PTT, PRVT, PRCT, PRIT, PUT, PVT, PWT, & + KCOUNT, PTTEN, PRVTEN, PRCTEN, PRITEN, & + PPRLTEN, PPRSTEN, & + KCLTOP, KCLBAS, PPRLFLX, PPRSFLX, & + PUMF, PDMF, PCAPE, & + OCH1CONV, KCH1, PCH1, PCH1TEN, & + OUSECHEM, OCH_CONV_SCAV, OCH_CONV_LINOX, & + ODUST, OSALT, PRHODREF, PIC_RATE, PCG_RATE ) +! ############################################################################ +! +!!**** Monitor routine to compute all convective tendencies by calls +!! of several subroutines. +!! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to determine the convective +!! tendencies. The routine first prepares all necessary grid-scale +!! variables. The final convective tendencies are then computed by +!! calls of different subroutines. +!! +!! +!!** METHOD +!! ------ +!! We start by selecting convective columns in the model domain through +!! the call of routine TRIGGER_FUNCT. Then, we allocate memory for the +!! convection updraft and downdraft variables and gather the grid scale +!! variables in convective arrays. +!! The updraft and downdraft computations are done level by level starting +!! at the bottom and top of the domain, respectively. +!! All computations are done on MNH thermodynamic levels. The depth +!! of the current model layer k is defined by DP(k)=P(k-1)-P(k) +!! +!! +!! +!! EXTERNAL +!! -------- +!! CONVECT_TRIGGER_FUNCT +!! CONVECT_SATMIXRATIO +!! CONVECT_UPDRAFT +!! CONVECT_CONDENS +!! CONVECT_MIXING_FUNCT +!! CONVECT_TSTEP_PREF +!! CONVECT_DOWNDRAFT +!! CONVECT_PRECIP_ADJUST +!! CONVECT_CLOSURE +!! CONVECT_CLOSURE_THRVLCL +!! CONVECT_CLOSURE_ADJUST +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST +!! XG ! gravity constant +!! XPI ! number Pi +!! XP00 ! reference pressure +!! XRD, XRV ! gaz constants for dry air and water vapor +!! XCPD, XCPV ! specific heat for dry air and water vapor +!! XRHOLW ! density of liquid water +!! XALPW, XBETAW, XGAMW ! constants for water saturation pressure +!! XTT ! triple point temperature +!! XLVTT, XLSTT ! vaporization, sublimation heat constant +!! XCL, XCI ! specific heat for liquid water and ice +!! +!! Module MODD_CONVPAREXT +!! JCVEXB, JCVEXT ! extra levels on the vertical boundaries +!! +!! Module MODD_CONVPAR +!! XA25 ! reference grid area +!! XCRAD ! cloud radius +!! +!! +!! REFERENCE +!! --------- +!! +!! Bechtold, 1997 : Meso-NH scientific documentation (31 pp) +!! Bechtold et al., 2001, Quart. J. Roy. Met. Soc. +!! Kain and Fritsch, 1990, J. Atmos. Sci., Vol. 47, 2784-2801. +!! Kain and Fritsch, 1993, Meteor. Monographs, Vol. 24, 165-170. +!! +!! AUTHOR +!! ------ +!! P. BECHTOLD * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original 26/03/96 +!! Peter Bechtold 04/10/97 replace theta_il by enthalpy +!! " 10/12/98 changes for ARPEGE +!! " 12/12/00 add conservation correction +!! C. Mari 13/02/01 add scavenging of chemical species in updraft +!! P. Jabouille 02/07/01 case of lagragian variables +!! P. Tulet 02/03/05 update for dust +!! C.Lac 27/09/10 modification loop index for reproducibility +!! Juan 24/09/2012: for BUG Pgi rewrite PACK function on mode_pack_pgi +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_CONVPAREXT +USE MODD_CONVPAR +USE MODD_NSV, ONLY : NSV_LGBEG,NSV_LGEND, & + NSV_CHEMBEG,NSV_CHEMEND, & + NSV_LNOXBEG +USE MODD_CH_M9_n, ONLY : CNAMES +! +USE MODI_CH_CONVECT_LINOX +USE MODI_CONVECT_TRIGGER_FUNCT +USE MODI_CONVECT_UPDRAFT +USE MODI_CONVECT_TSTEP_PREF +USE MODI_CONVECT_DOWNDRAFT +USE MODI_CONVECT_PRECIP_ADJUST +USE MODI_CONVECT_CLOSURE +USE MODI_CH_CONVECT_SCAVENGING +USE MODI_CONVECT_CHEM_TRANSPORT +! +#ifdef MNH_PGI +USE MODE_PACK_PGI +#endif +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +! +INTEGER, INTENT(IN) :: KLON ! horizontal dimension +INTEGER, INTENT(IN) :: KLEV ! vertical dimension +INTEGER, INTENT(IN) :: KIDIA ! value of the first point in x +INTEGER, INTENT(IN) :: KFDIA ! value of the last point in x +INTEGER, INTENT(IN) :: KBDIA ! vertical computations start at +! ! KBDIA that is at least 1 +INTEGER, INTENT(IN) :: KTDIA ! vertical computations can be + ! limited to KLEV + 1 - KTDIA + ! default=1 +REAL, INTENT(IN) :: PDTCONV ! Interval of time between two + ! calls of the deep convection + ! scheme +INTEGER, INTENT(IN) :: KICE ! flag for ice ( 1 = yes, + ! 0 = no ice ) +LOGICAL, INTENT(IN) :: OREFRESH ! refresh or not tendencies + ! at every call +LOGICAL, INTENT(IN) :: ODOWN ! take or not convective + ! downdrafts into account +LOGICAL, INTENT(IN) :: OSETTADJ ! logical to set convective + ! adjustment time by user +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PTT ! grid scale temperature at t +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PRVT ! grid scale water vapor " +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PRCT ! grid scale r_c " +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PRIT ! grid scale r_i " +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PUT ! grid scale horiz. wind u " +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PVT ! grid scale horiz. wind v " +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PWT ! grid scale vertical + ! velocity (m/s) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PPABST ! grid scale pressure at t +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PZZ ! height of model layer (m) +REAL, DIMENSION(KLON), INTENT(IN) :: PDXDY ! horizontal grid area (m-a2) +REAL, DIMENSION(KLON), INTENT(IN) :: PTIMEC ! value of convective adjustment + ! time if OSETTADJ=.TRUE. +! +INTEGER, DIMENSION(KLON), INTENT(INOUT):: KCOUNT ! convective counter (recompute + ! tendency or keep it) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PTTEN ! convective temperature + ! tendency (K/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PRVTEN ! convective r_v tendency (1/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PRCTEN ! convective r_c tendency (1/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PRITEN ! convective r_i tendency (1/s) +REAL, DIMENSION(KLON), INTENT(INOUT):: PPRLTEN! liquid surf. precipitation + ! tendency (m/s) +REAL, DIMENSION(KLON), INTENT(INOUT):: PPRSTEN! solid surf. precipitation + ! tendency (m/s) +INTEGER, DIMENSION(KLON), INTENT(INOUT):: KCLTOP ! cloud top level +INTEGER, DIMENSION(KLON), INTENT(INOUT):: KCLBAS ! cloud base level + ! they are given a value of + ! 0 if no convection +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PPRLFLX! liquid precip flux (m/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PPRSFLX! solid precip flux (m/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PUMF ! updraft mass flux (kg/s m2) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PDMF ! downdraft mass flux (kg/s m2) +REAL, DIMENSION(KLON), INTENT(INOUT):: PCAPE ! maximum CAPE (J/kg) +! +LOGICAL, INTENT(IN) :: OCH1CONV ! include tracer transport +INTEGER, INTENT(IN) :: KCH1 ! number of species +REAL, DIMENSION(KLON,KLEV,KCH1), INTENT(IN) :: PCH1! grid scale chemical species +REAL, DIMENSION(KLON,KLEV,KCH1), INTENT(INOUT):: PCH1TEN! species conv. tendency (1/s) +LOGICAL, INTENT(IN) :: OUSECHEM ! flag for chemistry +LOGICAL, INTENT(IN) :: OCH_CONV_SCAV ! & scavenging +LOGICAL, INTENT(IN) :: OCH_CONV_LINOX ! & LiNOx +LOGICAL, INTENT(IN) :: ODUST ! flag for dust +LOGICAL, INTENT(IN) :: OSALT ! flag for sea salt +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PRHODREF ! grid scale density +REAL, DIMENSION(KLON), INTENT(INOUT) :: PIC_RATE ! IC lightning frequency +REAL, DIMENSION(KLON), INTENT(INOUT) :: PCG_RATE ! CG lightning frequency +! +! +!* 0.2 Declarations of local fixed memory variables : +! +INTEGER :: ITEST, ICONV, ICONV1 ! number of convective columns +INTEGER :: IIB, IIE ! horizontal loop bounds +INTEGER :: IKB, IKE ! vertical loop bounds +INTEGER :: IKS ! vertical dimension +INTEGER :: JI, JL, JJ ! horizontal loop index +INTEGER :: JN ! number of tracers +INTEGER :: JK, JKP, JKM ! vertical loop index +INTEGER :: IFTSTEPS ! only used for chemical tracers +REAL :: ZEPS, ZEPSA ! R_d / R_v, R_v / R_d +REAL :: ZRDOCP ! R_d/C_p +! +LOGICAL, DIMENSION(KLON, KLEV) :: GTRIG3 ! 3D logical mask for convection +LOGICAL, DIMENSION(KLON) :: GTRIG ! 2D logical mask for trigger test +REAL, DIMENSION(KLON,KLEV) :: ZTHT, ZSTHV, ZSTHES ! grid scale theta, + ! theta_v, theta_es +REAL, DIMENSION(KLON) :: ZTIME ! convective time period +REAL, DIMENSION(KLON) :: ZWORK2, ZWORK2B ! work array +REAL :: ZW1 ! work variable +! +! +!* 0.2 Declarations of local allocatable variables : +! +INTEGER, DIMENSION(:),ALLOCATABLE :: IDPL ! index for parcel departure level +INTEGER, DIMENSION(:),ALLOCATABLE :: IPBL ! index for source layer top +INTEGER, DIMENSION(:),ALLOCATABLE :: ILCL ! index for lifting condensation level +INTEGER, DIMENSION(:),ALLOCATABLE :: IETL ! index for zero buoyancy level +INTEGER, DIMENSION(:),ALLOCATABLE :: ICTL ! index for cloud top level +INTEGER, DIMENSION(:),ALLOCATABLE :: ILFS ! index for level of free sink +INTEGER, DIMENSION(:),ALLOCATABLE :: IDBL ! index for downdraft base level +INTEGER, DIMENSION(:),ALLOCATABLE :: IML ! melting level +! +INTEGER, DIMENSION(:), ALLOCATABLE :: ISDPL ! index for parcel departure level +INTEGER, DIMENSION(:),ALLOCATABLE :: ISPBL ! index for source layer top +INTEGER, DIMENSION(:), ALLOCATABLE :: ISLCL ! index for lifting condensation level +REAL, DIMENSION(:), ALLOCATABLE :: ZSTHLCL ! updraft theta at LCL +REAL, DIMENSION(:), ALLOCATABLE :: ZSTLCL ! updraft temp. at LCL +REAL, DIMENSION(:), ALLOCATABLE :: ZSRVLCL ! updraft rv at LCL +REAL, DIMENSION(:), ALLOCATABLE :: ZSWLCL ! updraft w at LCL +REAL, DIMENSION(:), ALLOCATABLE :: ZSZLCL ! LCL height +REAL, DIMENSION(:), ALLOCATABLE :: ZSTHVELCL! envir. theta_v at LCL +REAL, DIMENSION(:), ALLOCATABLE :: ZSDXDY ! grid area (m^2) +! +! grid scale variables +REAL, DIMENSION(:,:), ALLOCATABLE :: ZZ ! height of model layer (m) +REAL, DIMENSION(:,:), ALLOCATABLE :: ZPRES ! grid scale pressure +REAL, DIMENSION(:,:), ALLOCATABLE :: ZDPRES ! pressure difference between + ! bottom and top of layer (Pa) +REAL, DIMENSION(:,:), ALLOCATABLE :: ZU ! grid scale horiz. u component on theta grid +REAL, DIMENSION(:,:), ALLOCATABLE :: ZV ! grid scale horiz. v component on theta grid +REAL, DIMENSION(:,:), ALLOCATABLE :: ZW ! grid scale vertical velocity on theta grid +REAL, DIMENSION(:,:), ALLOCATABLE :: ZTT ! temperature +REAL, DIMENSION(:,:), ALLOCATABLE :: ZTH ! grid scale theta +REAL, DIMENSION(:,:), ALLOCATABLE :: ZTHV ! grid scale theta_v +REAL, DIMENSION(:,:), ALLOCATABLE :: ZTHL ! grid scale enthalpy (J/kg) +REAL, DIMENSION(:,:), ALLOCATABLE :: ZTHES, ZTHEST ! grid scale saturated theta_e +REAL, DIMENSION(:,:), ALLOCATABLE :: ZRW ! grid scale total water (kg/kg) +REAL, DIMENSION(:,:), ALLOCATABLE :: ZRV ! grid scale water vapor (kg/kg) +REAL, DIMENSION(:,:), ALLOCATABLE :: ZRC ! grid scale cloud water (kg/kg) +REAL, DIMENSION(:,:), ALLOCATABLE :: ZRI ! grid scale cloud ice (kg/kg) +REAL, DIMENSION(:), ALLOCATABLE :: ZDXDY ! grid area (m^2) +! +! updraft variables +REAL, DIMENSION(:,:), ALLOCATABLE :: ZUMF ! updraft mass flux (kg/s) +REAL, DIMENSION(:,:), ALLOCATABLE :: ZUER ! updraft entrainment (kg/s) +REAL, DIMENSION(:,:), ALLOCATABLE :: ZUDR ! updraft detrainment (kg/s) +REAL, DIMENSION(:,:), ALLOCATABLE :: ZUPR ! updraft precipitation in + ! flux units (kg water / s) +REAL, DIMENSION(:,:), ALLOCATABLE :: ZUTHL ! updraft enthalpy (J/kg) +REAL, DIMENSION(:,:), ALLOCATABLE :: ZUTHV ! updraft theta_v (K) +REAL, DIMENSION(:,:), ALLOCATABLE :: ZUTT ! updraft temperature (K) +REAL, DIMENSION(:,:), ALLOCATABLE :: ZURW ! updraft total water (kg/kg) +REAL, DIMENSION(:,:), ALLOCATABLE :: ZURC ! updraft cloud water (kg/kg) +REAL, DIMENSION(:,:), ALLOCATABLE :: ZURI ! updraft cloud ice (kg/kg) +REAL, DIMENSION(:,:), ALLOCATABLE :: ZURR ! liquid precipit. (kg/kg) + ! produced in model layer +REAL, DIMENSION(:,:), ALLOCATABLE :: ZURS ! solid precipit. (kg/kg) + ! produced in model layer +REAL, DIMENSION(:), ALLOCATABLE :: ZUTPR ! total updraft precipitation (kg/s) +REAL, DIMENSION(:), ALLOCATABLE :: ZMFLCL ! cloud base unit mass flux(kg/s) +REAL, DIMENSION(:), ALLOCATABLE :: ZCAPE ! available potent. energy +REAL, DIMENSION(:), ALLOCATABLE :: ZTHLCL ! updraft theta at LCL +REAL, DIMENSION(:), ALLOCATABLE :: ZTLCL ! updraft temp. at LCL +REAL, DIMENSION(:), ALLOCATABLE :: ZRVLCL ! updraft rv at LCL +REAL, DIMENSION(:), ALLOCATABLE :: ZWLCL ! updraft w at LCL +REAL, DIMENSION(:), ALLOCATABLE :: ZZLCL ! LCL height +REAL, DIMENSION(:), ALLOCATABLE :: ZTHVELCL! envir. theta_v at LCL +! +! downdraft variables +REAL, DIMENSION(:,:), ALLOCATABLE :: ZDMF ! downdraft mass flux (kg/s) +REAL, DIMENSION(:,:), ALLOCATABLE :: ZDER ! downdraft entrainment (kg/s) +REAL, DIMENSION(:,:), ALLOCATABLE :: ZDDR ! downdraft detrainment (kg/s) +REAL, DIMENSION(:,:), ALLOCATABLE :: ZDTHL ! downdraft enthalpy (J/kg) +REAL, DIMENSION(:,:), ALLOCATABLE :: ZDRW ! downdraft total water (kg/kg) +REAL, DIMENSION(:), ALLOCATABLE :: ZMIXF ! mixed fraction at LFS +REAL, DIMENSION(:), ALLOCATABLE :: ZTPR ! total surf precipitation (kg/s) +REAL, DIMENSION(:), ALLOCATABLE :: ZSPR ! solid surf precipitation (kg/s) +REAL, DIMENSION(:), ALLOCATABLE :: ZDTEVR ! donwndraft evapor. (kg/s) +REAL, DIMENSION(:), ALLOCATABLE :: ZPREF ! precipitation efficiency +REAL, DIMENSION(:,:), ALLOCATABLE :: ZDTEVRF ! donwndraft evapor. (kg/s) +REAL, DIMENSION(:,:), ALLOCATABLE :: ZPRLFLX ! liquid precip flux +REAL, DIMENSION(:,:), ALLOCATABLE :: ZPRSFLX ! solid precip flux +! +! closure variables +REAL, DIMENSION(:,:), ALLOCATABLE :: ZLMASS ! mass of model layer (kg) +REAL, DIMENSION(:), ALLOCATABLE :: ZTIMEA ! advective time period +REAL, DIMENSION(:), ALLOCATABLE :: ZTIMEC, ZTIMED! time during which convection is + ! active at grid point (as ZTIME) +! +REAL, DIMENSION(:,:), ALLOCATABLE :: ZTHC ! conv. adj. grid scale theta +REAL, DIMENSION(:,:), ALLOCATABLE :: ZRVC ! conv. adj. grid scale r_w +REAL, DIMENSION(:,:), ALLOCATABLE :: ZRCC ! conv. adj. grid scale r_c +REAL, DIMENSION(:,:), ALLOCATABLE :: ZRIC ! conv. adj. grid scale r_i +REAL, DIMENSION(:,:), ALLOCATABLE :: ZWSUB ! envir. compensating subsidence (Pa/s) +! +LOGICAL, DIMENSION(:),ALLOCATABLE :: GTRIG1 ! logical mask for convection +LOGICAL, DIMENSION(:),ALLOCATABLE :: GWORK ! logical work array +INTEGER, DIMENSION(:),ALLOCATABLE :: IINDEX, IJINDEX, IJSINDEX, IJPINDEX!hor.index +REAL, DIMENSION(:), ALLOCATABLE :: ZCPH ! specific heat C_ph +REAL, DIMENSION(:), ALLOCATABLE :: ZLV, ZLS! latent heat of vaporis., sublim. +REAL :: ZES ! saturation vapor mixng ratio +! +! Chemical Tracers: +REAL, DIMENSION(:,:,:), ALLOCATABLE:: ZCH1 ! grid scale chemical specy (kg/kg) +REAL, DIMENSION(:,:,:), ALLOCATABLE:: ZCH1C ! conv. adjust. chemical specy 1 +REAL, DIMENSION(:,:), ALLOCATABLE:: ZWORK3 ! work array +LOGICAL, DIMENSION(:,:,:),ALLOCATABLE::GTRIG4 ! logical mask +INTEGER :: JN_NO ! index of NO compound in PCH1 +REAL, DIMENSION(:,:),ALLOCATABLE :: ZWORK4, ZWORK4C + ! LiNOx conc. and tendency +REAL, DIMENSION(:,:),ALLOCATABLE :: ZZZ, ZRHODREF +REAL, DIMENSION(:),ALLOCATABLE :: ZIC_RATE,ZCG_RATE +! +!------------------------------------------------------------------------------- +! +! +!* 0.3 Compute loop bounds +! ------------------- +! +IIB = KIDIA +IIE = KFDIA +JCVEXB = MAX( 0, KBDIA - 1 ) +IKB = 1 + JCVEXB +IKS = KLEV +JCVEXT = MAX( 0, KTDIA - 1 ) +IKE = IKS - JCVEXT +! +! +!* 0.5 Update convective counter ( where KCOUNT > 0 +! convection is still active ). +! --------------------------------------------- +! +KCOUNT(IIB:IIE) = KCOUNT(IIB:IIE) - 1 +! +IF ( OREFRESH ) THEN + KCOUNT(:) = 1 + KCOUNT(IIB:IIE) = 0 ! refresh or not at every call +END IF +! +GTRIG(:) = KCOUNT(:) <= 0 +ITEST = COUNT( GTRIG(:) ) +IF ( ITEST == 0 ) THEN ! if convection is already active at every grid point + RETURN +ENDIF + ! exit DEEP_CONVECTION +! +! +!* 0.7 Reset convective tendencies to zero if convective +! counter becomes negative +! ------------------------------------------------- +! +DO JJ=1,KLEV ; DO JI=1,KLON + GTRIG3(JI,JJ)=GTRIG(JI) +ENDDO ; ENDDO +WHERE ( GTRIG3(:,:) ) + PTTEN(:,:) = 0. + PRVTEN(:,:) = 0. + PRCTEN(:,:) = 0. + PRITEN(:,:) = 0. + PPRLFLX(:,:)= 0. + PPRSFLX(:,:)= 0. +! PUTEN(:,:) = 0. +! PVTEN(:,:) = 0. + PUMF(:,:) = 0. + PDMF(:,:) = 0. +END WHERE +WHERE ( GTRIG(:) ) + PPRLTEN(:) = 0. + PPRSTEN(:) = 0. + KCLTOP(:) = 0 + KCLBAS(:) = 0 + PCAPE(:) = 0. +END WHERE +ALLOCATE( GTRIG4(KLON,KLEV,KCH1) ) +DO JK=1,KCH1; DO JJ=1,KLEV ; DO JI=1,KLON +!GTRIG4(:,:,:) = SPREAD( GTRIG3(:,:), DIM=3, NCOPIES=KCH1 ) + GTRIG4(JI,JJ,JK) = GTRIG3(JI,JJ) +ENDDO ; ENDDO ; ENDDO +WHERE( GTRIG4(:,:,:) ) PCH1TEN(:,:,:) = 0. +DEALLOCATE( GTRIG4 ) +! +!------------------------------------------------------------------------------- +! +!* 1. Initialize local variables +! ---------------------------- +! +ZEPS = XRD / XRV +ZEPSA = XRV / XRD +ZRDOCP = XRD / XCPD +! +! +!* 1.1 Set up grid scale theta, theta_v, theta_es +! ------------------------------------------ +! +ZTHT(:,:) = 300. +ZSTHV(:,:)= 300. +ZSTHES(:,:)=400. +DO JK = IKB, IKE +DO JI = IIB, IIE + IF ( PPABST(JI,JK) > 40.E2 ) THEN + ZTHT(JI,JK) = PTT(JI,JK) * ( XP00 / PPABST(JI,JK) ) ** ZRDOCP + ZSTHV(JI,JK) = ZTHT(JI,JK) * ( 1. + ZEPSA * PRVT(JI,JK) ) / & + ( 1. + PRVT(JI,JK) + PRCT(JI,JK) + PRIT(JI,JK) ) +! + ! use conservative Bolton (1980) formula for theta_e + ! it is used to compute CAPE for undilute parcel ascent + ! For economical reasons we do not use routine CONVECT_SATMIXRATIO here +! + ZES = EXP( XALPW - XBETAW / PTT(JI,JK) - XGAMW * LOG( PTT(JI,JK) ) ) + ZES = ZEPS * ZES / ( PPABST(JI,JK) - ZES ) + ZSTHES(JI,JK) = PTT(JI,JK) * ( ZTHT(JI,JK) / PTT(JI,JK) ) ** & + ( 1. - 0.28 * ZES ) * EXP( ( 3374.6525 / PTT(JI,JK) - 2.5403 ) & + * ZES * ( 1. + 0.81 * ZES ) ) + END IF +END DO +END DO +! +!------------------------------------------------------------------------------- +! +!* 2. Test for convective columns and determine properties at the LCL +! -------------------------------------------------------------- +! +!* 2.1 Allocate arrays depending on number of model columns that need +! to be tested for convection (i.e. where no convection is present +! at the moment. +! -------------------------------------------------------------- +! +ALLOCATE( ZPRES(ITEST,IKS) ) +ALLOCATE( ZZ(ITEST,IKS) ) +ALLOCATE( ZW(ITEST,IKS) ) +ALLOCATE( ZTH(ITEST,IKS) ) +ALLOCATE( ZTHV(ITEST,IKS) ) +ALLOCATE( ZTHEST(ITEST,IKS) ) +ALLOCATE( ZRV(ITEST,IKS) ) +ALLOCATE( ZSTHLCL(ITEST) ) +ALLOCATE( ZSTLCL(ITEST) ) +ALLOCATE( ZSRVLCL(ITEST) ) +ALLOCATE( ZSWLCL(ITEST) ) +ALLOCATE( ZSZLCL(ITEST) ) +ALLOCATE( ZSTHVELCL(ITEST) ) +ALLOCATE( ISDPL(ITEST) ) +ALLOCATE( ISPBL(ITEST) ) +ALLOCATE( ISLCL(ITEST) ) +ALLOCATE( ZSDXDY(ITEST) ) +ALLOCATE( GTRIG1(ITEST) ) +ALLOCATE( ZCAPE(ITEST) ) +ALLOCATE( IINDEX(KLON) ) +ALLOCATE( IJSINDEX(ITEST) ) +DO JI = 1, KLON + IINDEX(JI) = JI +END DO +IJSINDEX(:) = PACK( IINDEX(:), MASK=GTRIG(:) ) +! +ZPRES = 0. +ZZ = 0. +ZTH = 0. +ZTHV = 0. +ZTHEST = 0. +ZRV = 0. +ZW = 0. +! +DO JK = IKB, IKE +DO JI = 1, ITEST + JL = IJSINDEX(JI) + ZPRES(JI,JK) = PPABST(JL,JK) + ZZ(JI,JK) = PZZ(JL,JK) + ZTH(JI,JK) = ZTHT(JL,JK) + ZTHV(JI,JK) = ZSTHV(JL,JK) + ZTHEST(JI,JK) = ZSTHES(JL,JK) + ZRV(JI,JK) = MAX( 0., PRVT(JL,JK) ) + ZW(JI,JK) = PWT(JL,JK) +END DO +END DO +DO JI = 1, ITEST + JL = IJSINDEX(JI) + ZSDXDY(JI) = PDXDY(JL) +END DO +! +!* 2.2 Compute environm. enthalpy and total water = r_v + r_i + r_c +! and envir. saturation theta_e +! ------------------------------------------------------------ +! +! +!* 2.3 Test for convective columns and determine properties at the LCL +! -------------------------------------------------------------- +! +ISLCL(:) = MAX( IKB, 2 ) ! initialize DPL PBL and LCL +ISDPL(:) = IKB +ISPBL(:) = IKB +! +! +CALL CONVECT_TRIGGER_FUNCT( ITEST, KLEV, & + ZPRES, ZTH, ZTHV, ZTHEST, & + ZRV, ZW, ZZ, ZSDXDY, & + ZSTHLCL, ZSTLCL, ZSRVLCL, ZSWLCL, ZSZLCL, & + ZSTHVELCL, ISLCL, ISDPL, ISPBL, GTRIG1, & + ZCAPE ) +! +DO JI = 1, ITEST + JL = IJSINDEX(JI) + PCAPE(JL) = ZCAPE(JI) +END DO +! +DEALLOCATE( ZPRES ) +DEALLOCATE( ZZ ) +DEALLOCATE( ZTH ) +DEALLOCATE( ZTHV ) +DEALLOCATE( ZTHEST ) +DEALLOCATE( ZRV ) +DEALLOCATE( ZW ) +DEALLOCATE( ZCAPE ) +! +!------------------------------------------------------------------------------- +! +!* 3. After the call of TRIGGER_FUNCT we allocate all the dynamic +! arrays used in the convection scheme using the mask GTRIG, i.e. +! we do calculus only in convective columns. This corresponds to +! a GATHER operation. +! -------------------------------------------------------------- +! +ICONV = COUNT( GTRIG1(:) ) +IF ( ICONV == 0 ) THEN + DEALLOCATE( ZSTHLCL ) + DEALLOCATE( ZSTLCL ) + DEALLOCATE( ZSRVLCL ) + DEALLOCATE( ZSWLCL ) + DEALLOCATE( ZSZLCL ) + DEALLOCATE( ZSTHVELCL ) + DEALLOCATE( ZSDXDY ) + DEALLOCATE( ISLCL ) + DEALLOCATE( ISDPL ) + DEALLOCATE( ISPBL ) + DEALLOCATE( GTRIG1 ) + DEALLOCATE( IINDEX ) + DEALLOCATE( IJSINDEX ) + RETURN ! no convective column has been found, exit DEEP_CONVECTION + ENDIF +! + ! vertical index variables +! +ALLOCATE( IDPL(ICONV) ) +ALLOCATE( IPBL(ICONV) ) +ALLOCATE( ILCL(ICONV) ) +ALLOCATE( ICTL(ICONV) ) +ALLOCATE( IETL(ICONV) ) +! + ! grid scale variables +! +ALLOCATE( ZZ(ICONV,IKS) ) ; ZZ = 0.0 +ALLOCATE( ZPRES(ICONV,IKS) ) ; ZPRES = 0.0 +ALLOCATE( ZDPRES(ICONV,IKS) ) ; ZDPRES = 0.0 +ALLOCATE( ZU(ICONV,IKS) ) ; ZU = 0.0 +ALLOCATE( ZV(ICONV,IKS) ) ; ZV = 0.0 +ALLOCATE( ZTT(ICONV, IKS) ) ; ZTT = 0.0 +ALLOCATE( ZTH(ICONV,IKS) ) ; ZTH = 0.0 +ALLOCATE( ZTHV(ICONV,IKS) ) ; ZTHV = 0.0 +ALLOCATE( ZTHL(ICONV,IKS) ) ; ZTHL = 0.0 +ALLOCATE( ZTHES(ICONV,IKS) ) ; ZTHES = 0.0 +ALLOCATE( ZRV(ICONV,IKS) ) ; ZRV = 0.0 +ALLOCATE( ZRC(ICONV,IKS) ) ; ZRC = 0.0 +ALLOCATE( ZRI(ICONV,IKS) ) ; ZRI = 0.0 +ALLOCATE( ZRW(ICONV,IKS) ) ; ZRW = 0.0 +ALLOCATE( ZDXDY(ICONV) ) ; ZDXDY = 0.0 +! + ! updraft variables +! +ALLOCATE( ZUMF(ICONV,IKS) ) +ALLOCATE( ZUER(ICONV,IKS) ) +ALLOCATE( ZUDR(ICONV,IKS) ) +ALLOCATE( ZUPR(ICONV,IKS) ) +ALLOCATE( ZUTHL(ICONV,IKS) ) +ALLOCATE( ZUTHV(ICONV,IKS) ) +ALLOCATE( ZUTT(ICONV,IKS) ) +ALLOCATE( ZURW(ICONV,IKS) ) +ALLOCATE( ZURC(ICONV,IKS) ) +ALLOCATE( ZURI(ICONV,IKS) ) +ALLOCATE( ZURR(ICONV,IKS) ) +ALLOCATE( ZURS(ICONV,IKS) ) +ALLOCATE( ZUTPR(ICONV) ) +ALLOCATE( ZTHLCL(ICONV) ) +ALLOCATE( ZTLCL(ICONV) ) +ALLOCATE( ZRVLCL(ICONV) ) +ALLOCATE( ZWLCL(ICONV) ) +ALLOCATE( ZMFLCL(ICONV) ) +ALLOCATE( ZZLCL(ICONV) ) +ALLOCATE( ZTHVELCL(ICONV) ) +ALLOCATE( ZCAPE(ICONV) ) +! +! work variables +! +ALLOCATE( IJINDEX(ICONV) ) +ALLOCATE( IJPINDEX(ICONV) ) +ALLOCATE( ZCPH(ICONV) ) +ALLOCATE( ZLV(ICONV) ) +ALLOCATE( ZLS(ICONV) ) +! +! +!* 3.1 Gather grid scale and updraft base variables in +! arrays using mask GTRIG +! --------------------------------------------------- +! +GTRIG(:) = UNPACK( GTRIG1(:), MASK=GTRIG, FIELD=.FALSE. ) +IJINDEX(:) = PACK( IINDEX(:), MASK=GTRIG(:) ) +! +DO JK = IKB, IKE +DO JI = 1, ICONV + JL = IJINDEX(JI) + ZZ(JI,JK) = PZZ(JL,JK) + ZPRES(JI,JK) = PPABST(JL,JK) + ZTT(JI,JK) = PTT(JL,JK) + ZTH(JI,JK) = ZTHT(JL,JK) + ZTHES(JI,JK) = ZSTHES(JL,JK) + ZRV(JI,JK) = MAX( 0., PRVT(JL,JK) ) + ZRC(JI,JK) = MAX( 0., PRCT(JL,JK) ) + ZRI(JI,JK) = MAX( 0., PRIT(JL,JK) ) + ZTHV(JI,JK) = ZSTHV(JL,JK) + ZU(JI,JK) = PUT(JL,JK) + ZV(JI,JK) = PVT(JL,JK) +END DO +END DO +IF ( OSETTADJ ) THEN + ALLOCATE( ZTIMED(ICONV) ) + DO JI = 1, ICONV + JL = IJINDEX(JI) + ZTIMED(JI) = PTIMEC(JL) + END DO +END IF +! +DO JI = 1, ITEST + IJSINDEX(JI) = JI +END DO +IJPINDEX(:) = PACK( IJSINDEX(:), MASK=GTRIG1(:) ) +DO JI = 1, ICONV + JL = IJPINDEX(JI) + IDPL(JI) = ISDPL(JL) + IPBL(JI) = ISPBL(JL) + ILCL(JI) = ISLCL(JL) + ZTHLCL(JI) = ZSTHLCL(JL) + ZTLCL(JI) = ZSTLCL(JL) + ZRVLCL(JI) = ZSRVLCL(JL) + ZWLCL(JI) = ZSWLCL(JL) + ZZLCL(JI) = ZSZLCL(JL) + ZTHVELCL(JI) = ZSTHVELCL(JL) + ZDXDY(JI) = ZSDXDY(JL) +END DO +ALLOCATE( GWORK(ICONV) ) +GWORK(:) = PACK( GTRIG1(:), MASK=GTRIG1(:) ) +DEALLOCATE( GTRIG1 ) +ALLOCATE( GTRIG1(ICONV) ) +GTRIG1(:) = GWORK(:) +! +DEALLOCATE( GWORK ) +DEALLOCATE( IJPINDEX ) +DEALLOCATE( ISDPL ) +DEALLOCATE( ISPBL ) +DEALLOCATE( ISLCL ) +DEALLOCATE( ZSTHLCL ) +DEALLOCATE( ZSTLCL ) +DEALLOCATE( ZSRVLCL ) +DEALLOCATE( ZSWLCL ) +DEALLOCATE( ZSZLCL ) +DEALLOCATE( ZSTHVELCL ) +DEALLOCATE( ZSDXDY ) +! +! +!* 3.2 Compute pressure difference +! --------------------------------------------------- +! +ZDPRES(:,IKB) = 0. +DO JK = IKB + 1, IKE + ZDPRES(:,JK) = ZPRES(:,JK-1) - ZPRES(:,JK) +END DO +! +!* 3.3 Compute environm. enthalpy and total water = r_v + r_i + r_c +! ---------------------------------------------------------- +! +DO JK = IKB, IKE, 1 + ZRW(:,JK) = ZRV(:,JK) + ZRC(:,JK) + ZRI(:,JK) + ZCPH(:) = XCPD + XCPV * ZRW(:,JK) + ZLV(:) = XLVTT + ( XCPV - XCL ) * ( ZTT(:,JK) - XTT ) ! compute L_v + ZLS(:) = XLSTT + ( XCPV - XCI ) * ( ZTT(:,JK) - XTT ) ! compute L_i + ZTHL(:,JK) = ZCPH(:) * ZTT(:,JK) + ( 1. + ZRW(:,JK) ) * XG * ZZ(:,JK) & + - ZLV(:) * ZRC(:,JK) - ZLS(:) * ZRI(:,JK) +END DO +! +!------------------------------------------------------------------------------- +! +!* 4. Compute updraft properties +! ---------------------------- +! +!* 4.1 Set mass flux at LCL ( here a unit mass flux with w = 1 m/s ) +! ------------------------------------------------------------- +! +DO JI = 1, ICONV + JK = ILCL(JI) - 1 + ZMFLCL(JI) = ZPRES(JI,JK) / ( XRD * ZTT(JI,JK) * & + ( 1. + ZEPS * ZRVLCL(JI) ) ) * XPI * XCRAD * XCRAD & + * MAX ( 1., ZDXDY(JI)/XA25 ) +END DO +! +DEALLOCATE( ZCPH ) +DEALLOCATE( ZLV ) +DEALLOCATE( ZLS ) +! +! +CALL CONVECT_UPDRAFT( ICONV, KLEV, & + KICE, ZPRES, ZDPRES, ZZ, ZTHL, ZTHV, ZTHES, ZRW, & + ZTHLCL, ZTLCL, ZRVLCL, ZWLCL, ZZLCL, ZTHVELCL, & + ZMFLCL, GTRIG1, ILCL, IDPL, IPBL, & + ZUMF, ZUER, ZUDR, ZUTHL, ZUTHV, ZURW, & + ZURC, ZURI, ZURR, ZURS, ZUPR, & + ZUTPR, ZCAPE, ICTL, IETL, ZUTT ) +! +! +! +!* 4.2 In routine UPDRAFT GTRIG1 has been set to false when cloud +! thickness is smaller than 3 km +! ----------------------------------------------------------- +! +! +ICONV1 = COUNT(GTRIG1) +! +IF ( ICONV1 > 0 ) THEN +! +!* 4.3 Allocate memory for downdraft variables +! --------------------------------------- +! +! downdraft variables +! + ALLOCATE( ILFS(ICONV) ) + ALLOCATE( IDBL(ICONV) ) + ALLOCATE( IML(ICONV) ) + ALLOCATE( ZDMF(ICONV,IKS) ) + ALLOCATE( ZDER(ICONV,IKS) ) + ALLOCATE( ZDDR(ICONV,IKS) ) + ALLOCATE( ZDTHL(ICONV,IKS) ) + ALLOCATE( ZDRW(ICONV,IKS) ) + ALLOCATE( ZLMASS(ICONV,IKS) ) ; ZLMASS = 0.0 + DO JK = IKB, IKE + ZLMASS(:,JK) = ZDXDY(:) * ZDPRES(:,JK) / XG ! mass of model layer + END DO + ZLMASS(:,IKB) = ZLMASS(:,IKB+1) + ALLOCATE( ZMIXF(ICONV) ) + ALLOCATE( ZTPR(ICONV) ) + ALLOCATE( ZSPR(ICONV) ) + ALLOCATE( ZDTEVR(ICONV) ) + ALLOCATE( ZPREF(ICONV) ) + ALLOCATE( ZDTEVRF(ICONV,IKS) ) + ALLOCATE( ZPRLFLX(ICONV,IKS) ) + ALLOCATE( ZPRSFLX(ICONV,IKS) ) +! +! closure variables +! + ALLOCATE( ZTIMEA(ICONV) ) + ALLOCATE( ZTIMEC(ICONV) ) + ALLOCATE( ZTHC(ICONV,IKS) ) + ALLOCATE( ZRVC(ICONV,IKS) ) + ALLOCATE( ZRCC(ICONV,IKS) ) + ALLOCATE( ZRIC(ICONV,IKS) ) + ALLOCATE( ZWSUB(ICONV,IKS) ) +! +!------------------------------------------------------------------------------- +! +!* 5. Compute downdraft properties +! ---------------------------- +! +!* 5.1 Compute advective time period and precipitation +! efficiency as a function of mean ambient wind (shear) +! -------------------------------------------------------- +! + CALL CONVECT_TSTEP_PREF( ICONV, KLEV, & + ZU, ZV, ZPRES, ZZ, ZDXDY, ILCL, ICTL, & + ZTIMEA, ZPREF ) +! + ! exclude convective downdrafts if desired + IF ( .NOT. ODOWN ) ZPREF(:) = 1. +! +! Compute the period during which convection is active + ZTIMEC(:) = MAX( 1800., MIN( 3600., ZTIMEA(:) ) ) + ZTIMEC(:) = REAL( INT( ZTIMEC(:) / PDTCONV ) ) * PDTCONV + ZTIMEC(:) = MAX( PDTCONV, ZTIMEC(:) ) ! necessary if PDTCONV > 1800 + IF ( OSETTADJ ) THEN + ZTIMEC(:) = MAX( PDTCONV, ZTIMED(:) ) + END IF +! +! +!* 5.2 Compute melting level +! ---------------------- +! + IML(:) = IKB + DO JK = IKE, IKB, -1 + WHERE( ZTT(:,JK) <= XTT ) IML(:) = JK + END DO +! + CALL CONVECT_DOWNDRAFT( ICONV, KLEV, & + KICE, ZPRES, ZDPRES, ZZ, ZTH, ZTHES, & + ZRW, ZRC, ZRI, & + ZPREF, ILCL, ICTL, IETL, & + ZUTHL, ZURW, ZURC, ZURI, & + ZDMF, ZDER, ZDDR, ZDTHL, ZDRW, & + ZMIXF, ZDTEVR, ILFS, IDBL, IML, & + ZDTEVRF ) +! +!------------------------------------------------------------------------------- +! +!* 6. Adjust up and downdraft mass flux to be consistent +! with precipitation efficiency relation. +! --------------------------------------------------- +! + CALL CONVECT_PRECIP_ADJUST( ICONV, KLEV, & + ZPRES,ZUMF, ZUER, ZUDR, ZUPR, ZUTPR, ZURW,& + ZDMF, ZDER, ZDDR, ZDTHL, ZDRW, & + ZPREF, ZTPR, ZMIXF, ZDTEVR, & + ILFS, IDBL, ILCL, ICTL, IETL, & + ZDTEVRF ) +! +!------------------------------------------------------------------------------- +! +!* 7. Determine adjusted environmental values assuming +! that all available buoyant energy must be removed +! within an advective time step ZTIMEC. +! --------------------------------------------------- +! + CALL CONVECT_CLOSURE( ICONV, KLEV, & + ZPRES, ZDPRES, ZZ, ZDXDY, ZLMASS, & + ZTHL, ZTH, ZRW, ZRC, ZRI, GTRIG1, & + ZTHC, ZRVC, ZRCC, ZRIC, ZWSUB, & + ILCL, IDPL, IPBL, ILFS, ICTL, IML, & + ZUMF, ZUER, ZUDR, ZUTHL, ZURW, & + ZURC, ZURI, ZUPR, & + ZDMF, ZDER, ZDDR, ZDTHL, ZDRW, & + ZTPR, ZSPR, ZDTEVR, & + ZCAPE, ZTIMEC, & + IFTSTEPS, & + ZDTEVRF, ZPRLFLX, ZPRSFLX ) +! +!------------------------------------------------------------------------------- +! +!* 8. Determine the final grid-scale (environmental) convective +! tendencies and set convective counter +! -------------------------------------------------------- +! +! +!* 8.1 Grid scale tendencies +! --------------------- +! +! in order to save memory, the tendencies are temporarily stored +! in the tables for the adjusted grid-scale values +! + DO JK = IKB, IKE + ZTHC(:,JK) = ( ZTHC(:,JK) - ZTH(:,JK) ) / ZTIMEC(:) & + * ( ZPRES(:,JK) / XP00 ) ** ZRDOCP ! change theta in temperature + ZRVC(:,JK) = ( ZRVC(:,JK) - ZRW(:,JK) + ZRC(:,JK) + ZRI(:,JK) )/ ZTIMEC(:) + ZRCC(:,JK) = ( ZRCC(:,JK) - ZRC(:,JK) ) / ZTIMEC(:) + ZRIC(:,JK) = ( ZRIC(:,JK) - ZRI(:,JK) ) / ZTIMEC(:) +! + ZPRLFLX(:,JK) = ZPRLFLX(:,JK) / ( XRHOLW * ZDXDY(:) ) + ZPRSFLX(:,JK) = ZPRSFLX(:,JK) / ( XRHOLW * ZDXDY(:) ) +! + END DO +! + ZPRLFLX(:,IKB) = ZPRLFLX(:,IKB+1) + ZPRSFLX(:,IKB) = ZPRSFLX(:,IKB+1) +! +! +!* 8.2 Apply conservation correction +! ----------------------------- +! + ! Compute vertical integrals +! +! Reproducibility +! JKM = MAXVAL( ICTL(:) ) + JKM = IKE - 1 + ZWORK2(:) = 0. + ZWORK2B(:) = 0. + DO JK = IKB+1, JKM + JKP = JK + 1 + DO JI = 1, ICONV + ZW1 = .5 * (ZPRES(JI,JK-1) - ZPRES(JI,JKP)) / XG + ZWORK2(JI) = ZWORK2(JI) + ( ZRVC(JI,JK) + ZRCC(JI,JK) + ZRIC(JI,JK) ) * ZW1 ! moisture + ZWORK2B(JI) = ZWORK2B(JI) + ( ( XCPD + XCPV * ZRW(JI,JK) )* ZTHC(JI,JK) - & + ( XLVTT + ( XCPV - XCL ) * ( ZTT(JI,JK) - XTT ) ) * ZRCC(JI,JK) - & + ( XLSTT + ( XCPV - XCL ) * ( ZTT(JI,JK) - XTT ) ) * ZRIC(JI,JK) ) * & + ZW1 ! enthalpy + END DO + END DO +! + ! Budget error (compare integral to surface precip.) +! + DO JI = 1, ICONV + IF ( ZTPR(JI) > 0.) THEN + ZW1 = XG / ( ZPRES(JI,IKB) - ZPRES(JI,JKP) - .5 * ( & + ZDPRES(JI,IKB+1) - ZDPRES(JI,JKP+1) ) ) + ZWORK2(JI) = ( ZTPR(JI) / ZDXDY(JI) + ZWORK2(JI) ) * ZW1 + ZWORK2B(JI) = ( ZTPR(JI) / ZDXDY(JI) * & + ( XLVTT + ( XCPV - XCL ) * ( ZTT(JI,IKB) - XTT ) ) - ZWORK2B(JI) ) & + * ZW1 + END IF + END DO +! + ! Apply uniform correction +! + DO JK = JKM, IKB+1, -1 + DO JI = 1, ICONV + IF ( ZTPR(JI) > 0. .AND. JK <= ICTL(JI) ) THEN + ! ZW1 = ABS(ZRVC(JI,JK)) + ABS(ZRCC(JI,JK)) + ABS(ZRIC(JI,JK)) + 1.E-12 + ! ZRVC(JI,JK) = ZRVC(JI,JK) - ABS(ZRVC(JI,JK))/ZW1*ZWORK2(JI) ! moisture + ZRVC(JI,JK) = ZRVC(JI,JK) - ZWORK2(JI) ! moisture + ! ZRCC(JI,JK) = ZRCC(JI,JK) - ABS(ZRCC(JI,JK))/ZW1*ZWORK2(JI) + ! ZRIC(JI,JK) = ZRIC(JI,JK) - ABS(ZRIC(JI,JK))/ZW1*ZWORK2(JI) + ZTHC(JI,JK) = ZTHC(JI,JK) + ZWORK2B(JI) / ( XCPD + XCPV * ZRW(JI,JK) )! energy + END IF + END DO + END DO +! +! +! execute a "scatter"= pack command to store the tendencies in +! the final 2D tables +! + DO JK = IKB, IKE + DO JI = 1, ICONV + JL = IJINDEX(JI) + PTTEN(JL,JK) = ZTHC(JI,JK) + PRVTEN(JL,JK) = ZRVC(JI,JK) + PRCTEN(JL,JK) = ZRCC(JI,JK) + PRITEN(JL,JK) = ZRIC(JI,JK) +! + PPRLFLX(JL,JK) = ZPRLFLX(JI,JK) + PPRSFLX(JL,JK) = ZPRSFLX(JI,JK) + END DO + END DO +! +! +!* 8.3 Convective rainfall tendency +! ---------------------------- +! + ! liquid and solid surface rainfall tendency in m/s + ZTPR(:) = ZTPR(:) / ( XRHOLW * ZDXDY(:) ) ! total surf precip + ZSPR(:) = ZSPR(:) / ( XRHOLW * ZDXDY(:) ) ! solid surf precip + ZTPR(:) = ZTPR(:) - ZSPR(:) ! compute liquid part +! + DO JI = 1, ICONV + JL = IJINDEX(JI) + PPRLTEN(JL) = ZTPR(JI) + PPRSTEN(JL) = ZSPR(JI) + END DO +! +! +! Cloud base and top levels +! ------------------------- +! + ILCL(:) = MIN( ILCL(:), ICTL(:) ) + DO JI = 1, ICONV + JL = IJINDEX(JI) + KCLTOP(JL) = ICTL(JI) + KCLBAS(JL) = ILCL(JI) + END DO +! +! +!* 8.4 Set convective counter +! ---------------------- +! + ! compute convective counter for just activated convective + ! grid points + ! If the advective time period is less than specified + ! minimum for convective period, allow feedback to occur only + ! during advective time +! + ZTIME(:) = 1. + ZWORK2(:) = 0. + DO JI = 1, ICONV + JL = IJINDEX(JI) + ZTIME(JL) = ZTIMEC(JI) + ZWORK2(JL) = ZTIMEA(JI) + ZWORK2(JL) = MIN( ZWORK2(JL), ZTIME(JL) ) + ZWORK2(JL) = MAX( ZWORK2(JL), PDTCONV ) + IF ( GTRIG(JL) ) KCOUNT(JL) = INT( ZWORK2(JL) / PDTCONV ) + IF ( GTRIG(JL) .AND. PPRLTEN(JL)<1.E-14 ) KCOUNT(JL) = 0 + END DO +! +! +!* 8.7 Compute convective tendencies for Tracers +! ------------------------------------------ +! + IF ( OCH1CONV ) THEN +! + ALLOCATE( ZCH1(ICONV,IKS,KCH1) ) ; ZCH1 = 0.0 + ALLOCATE( ZCH1C(ICONV,IKS,KCH1) ) ; ZCH1C = 0.0 + ALLOCATE( ZWORK3(ICONV,KCH1) ) +! + ALLOCATE( ZRHODREF(ICONV,IKS) ) + ZRHODREF=0. + IF ( OCH_CONV_LINOX ) THEN + ALLOCATE( ZZZ(ICONV,IKS) ) + ALLOCATE( ZIC_RATE(ICONV) ) + ALLOCATE( ZCG_RATE(ICONV) ) + ALLOCATE( ZWORK4(ICONV,IKS) ) + ALLOCATE( ZWORK4C(ICONV,IKS) ) + ZZZ=0. + ZIC_RATE=0. + ZCG_RATE=0. + ZWORK4=0. + ZWORK4C=0. + END IF +! + DO JI = 1, ICONV + DO JK = IKB, IKE + JL = IJINDEX(JI) + ZCH1(JI,JK,:) = PCH1(JL,JK,:) + ZRHODREF(JI,JK)=PRHODREF(JL,JK) + END DO + ZRHODREF(JI,1) = PRHODREF(JL,IKB) + ZRHODREF(JI,IKS) = PRHODREF(JL,IKE) + END DO + ZCH1(:,1,:) = ZCH1(:,IKB,:) + ZCH1(:,IKS,:) = ZCH1(:,IKE,:) +! + JN_NO = 0 + IF ( OCH_CONV_LINOX ) THEN + DO JK = IKB, IKE + DO JI = 1, ICONV + JL = IJINDEX(JI) + ZZZ(JI,JK)=PZZ(JL,JK) + ZIC_RATE(JI)=PIC_RATE(JL) + ZCG_RATE(JI)=PCG_RATE(JL) + END DO + END DO + IF (OUSECHEM) THEN + DO JN = NSV_CHEMBEG,NSV_CHEMEND + IF (CNAMES(JN-NSV_CHEMBEG+1)=='NO') JN_NO = JN + END DO + ELSE + JN_NO = NSV_LNOXBEG + ENDIF + ZWORK4(:,:) = ZCH1(:,:,JN_NO) + CALL CH_CONVECT_LINOX( ICONV, KLEV, ZWORK4, ZWORK4C, & + IDPL, IPBL, ILCL, ICTL, ILFS, IDBL, & + ZUMF, ZUER, ZUDR, ZDMF, ZDER, ZDDR, & + ZTIMEC, ZDXDY, ZMIXF, ZLMASS, ZWSUB, & + IFTSTEPS, ZUTT, ZRHODREF, & + OUSECHEM, ZZZ, ZIC_RATE, ZCG_RATE ) + DO JI = 1, ICONV + JL = IJINDEX(JI) + PIC_RATE(JL)=ZIC_RATE(JI) + PCG_RATE(JL)=ZCG_RATE(JI) + ENDDO + ENDIF +! + IF ((OUSECHEM .AND. OCH_CONV_SCAV).OR.(ODUST .AND. OCH_CONV_SCAV).OR.& + (OSALT .AND. OCH_CONV_SCAV) ) THEN +! + CALL CH_CONVECT_SCAVENGING( ICONV, KLEV, KCH1, ZCH1, ZCH1C, & + IDPL, IPBL, ILCL, ICTL, ILFS, IDBL, & + ZUMF, ZUER, ZUDR, ZDMF, ZDER, ZDDR, & + ZTIMEC, ZDXDY, ZMIXF, ZLMASS, ZWSUB, & + IFTSTEPS, & + ZURC, ZURR, ZURI, ZURS, ZUTT, ZPRES, & + ZRHODREF, PPABST, ZTHT ) +! + IF (OCH_CONV_LINOX) THEN + ZCH1C(:,:,JN_NO) = ZWORK4C(:,:) + ENDIF +! no conservation correction for scavenging + DO JI = 1, ICONV + JL = IJINDEX(JI) + IF ( ZTPR(JI) > 0. ) THEN + DO JK = IKB, IKE + PCH1TEN(JL,JK,:) = (ZCH1C(JI,JK,:)- ZCH1(JI,JK,:)) /ZTIMEC(JI) + END DO + ELSE + DO JK = IKB, IKE + PCH1TEN(JL,JK,:) = 0. + END DO + ENDIF + END DO + +! + ELSE +! + CALL CONVECT_CHEM_TRANSPORT( ICONV, KLEV, KCH1, ZCH1, ZCH1C, & + IDPL, IPBL, ILCL, ICTL, ILFS, IDBL, & + ZUMF, ZUER, ZUDR, ZDMF, ZDER, ZDDR, & + ZTIMEC, ZDXDY, ZMIXF, ZLMASS, ZWSUB, & + IFTSTEPS ) +! + IF (OCH_CONV_LINOX) THEN + ZCH1C(:,:,JN_NO) = ZWORK4C(:,:) + ENDIF +! +!* 8.8 Apply conservation correction +! ----------------------------- +! + ! Compute vertical integrals +! +! Reproducibility +! JKM = MAXVAL( ICTL(:) ) + JKM = IKE - 1 + DO JN = 1, KCH1 + IF((JN < NSV_LGBEG .OR. JN>NSV_LGEND-1) .AND. JN .NE. JN_NO ) THEN + ! no correction for Lagrangian and LiNOx variables + ZWORK3(:,JN) = 0. + ZWORK2(:) = 0. + DO JK = IKB+1, JKM + JKP = JK + 1 + DO JI = 1, ICONV + ZW1 = .5 * (ZPRES(JI,JK-1) - ZPRES(JI,JKP)) + ZWORK3(JI,JN) = ZWORK3(JI,JN) + (ZCH1C(JI,JK,JN)-ZCH1(JI,JK,JN)) * ZW1 + ZWORK2(JI) = ZWORK2(JI) + ABS(ZCH1C(JI,JK,JN)) * ZW1 + END DO + END DO +! + ! Apply concentration weighted correction +! + DO JK = JKM, IKB+1, -1 + DO JI = 1, ICONV + IF ( ZTPR(JI) > 0. .AND. JK <= ICTL(JI) ) THEN + ZCH1C(JI,JK,JN) = ZCH1C(JI,JK,JN) - & + ZWORK3(JI,JN)*ABS(ZCH1C(JI,JK,JN))/MAX(1.E-30,ZWORK2(JI)) + ! ZCH1C(JI,JK,JN) = MAX( ZCH1C(JI,JK,JN), -ZCH1(JI,JK,JN)/ZTIMEC(JI) ) + END IF + END DO + END DO + END IF +! + DO JI = 1, ICONV + JL = IJINDEX(JI) + IF ( ZTPR(JI) > 0. ) THEN + DO JK = IKB, IKE + PCH1TEN(JL,JK,JN) = (ZCH1C(JI,JK,JN)-ZCH1(JI,JK,JN) ) /ZTIMEC(JI) + END DO + ELSE + DO JK = IKB, IKE + PCH1TEN(JL,JK,JN) = 0. + END DO + ENDIF + END DO + END DO + END IF + END IF +! +!------------------------------------------------------------------------------- +! +!* 9. Write up- and downdraft mass fluxes +! ------------------------------------ +! + DO JK = IKB, IKE + ZUMF(:,JK) = ZUMF(:,JK) / ZDXDY(:) ! Mass flux per unit area + ZDMF(:,JK) = ZDMF(:,JK) / ZDXDY(:) + END DO + ZWORK2(:) = 1. + WHERE ( PPRLTEN(:)<1.E-14 ) ZWORK2(:) = 0. + DO JK = IKB, IKE + DO JI = 1, ICONV + JL = IJINDEX(JI) + PUMF(JL,JK) = ZUMF(JI,JK) * ZWORK2(JL) + PDMF(JL,JK) = ZDMF(JI,JK) * ZWORK2(JL) + END DO + END DO +! +!------------------------------------------------------------------------------- +! +!* 10. Deallocate all local arrays +! --------------------------- +! +! downdraft variables +! + DEALLOCATE( ZDMF ) + DEALLOCATE( ZDER ) + DEALLOCATE( ZDDR ) + DEALLOCATE( ZDTHL ) + DEALLOCATE( ZDRW ) + DEALLOCATE( ZLMASS ) + DEALLOCATE( ZMIXF ) + DEALLOCATE( ZTPR ) + DEALLOCATE( ZSPR ) + DEALLOCATE( ZDTEVR ) + DEALLOCATE( ZPREF ) + DEALLOCATE( IML ) + DEALLOCATE( ILFS ) + DEALLOCATE( IDBL ) + DEALLOCATE( ZDTEVRF ) + DEALLOCATE( ZPRLFLX ) + DEALLOCATE( ZPRSFLX ) +! +! closure variables +! + DEALLOCATE( ZTIMEA ) + DEALLOCATE( ZTIMEC ) + DEALLOCATE( ZTHC ) + DEALLOCATE( ZRVC ) + DEALLOCATE( ZRCC ) + DEALLOCATE( ZRIC ) + DEALLOCATE( ZWSUB ) +! + IF ( OCH1CONV ) THEN + DEALLOCATE( ZCH1 ) + DEALLOCATE( ZCH1C ) + DEALLOCATE( ZWORK3 ) + DEALLOCATE( ZRHODREF ) + IF ( OCH_CONV_LINOX ) THEN + DEALLOCATE( ZZZ ) + DEALLOCATE( ZIC_RATE ) + DEALLOCATE( ZCG_RATE ) + DEALLOCATE( ZWORK4 ) + DEALLOCATE( ZWORK4C ) + END IF + END IF +! +ENDIF +! +! vertical index +! +DEALLOCATE( IDPL ) +DEALLOCATE( IPBL ) +DEALLOCATE( ILCL ) +DEALLOCATE( ICTL ) +DEALLOCATE( IETL ) +! +! grid scale variables +! +DEALLOCATE( ZZ ) +DEALLOCATE( ZPRES ) +DEALLOCATE( ZDPRES ) +DEALLOCATE( ZU ) +DEALLOCATE( ZV ) +DEALLOCATE( ZTT ) +DEALLOCATE( ZTH ) +DEALLOCATE( ZTHV ) +DEALLOCATE( ZTHL ) +DEALLOCATE( ZTHES ) +DEALLOCATE( ZRW ) +DEALLOCATE( ZRV ) +DEALLOCATE( ZRC ) +DEALLOCATE( ZRI ) +DEALLOCATE( ZDXDY ) +! +! updraft variables +! +DEALLOCATE( ZUMF ) +DEALLOCATE( ZUER ) +DEALLOCATE( ZUDR ) +DEALLOCATE( ZUTHL ) +DEALLOCATE( ZUTHV ) +DEALLOCATE( ZUTT ) +DEALLOCATE( ZURW ) +DEALLOCATE( ZURC ) +DEALLOCATE( ZURI ) +DEALLOCATE( ZURR ) +DEALLOCATE( ZURS ) +DEALLOCATE( ZUPR ) +DEALLOCATE( ZUTPR ) +DEALLOCATE( ZTHLCL ) +DEALLOCATE( ZTLCL ) +DEALLOCATE( ZRVLCL ) +DEALLOCATE( ZWLCL ) +DEALLOCATE( ZZLCL ) +DEALLOCATE( ZTHVELCL ) +DEALLOCATE( ZMFLCL ) +DEALLOCATE( ZCAPE ) +IF ( OSETTADJ ) DEALLOCATE( ZTIMED ) +! +! work arrays +! +DEALLOCATE( IINDEX ) +DEALLOCATE( IJINDEX ) +DEALLOCATE( IJSINDEX ) +DEALLOCATE( GTRIG1 ) +! +! +END SUBROUTINE DEEP_CONVECTION diff --git a/src/mesonh/conv/ini_convpar.f90 b/src/mesonh/conv/ini_convpar.f90 new file mode 100644 index 000000000..954b30c6c --- /dev/null +++ b/src/mesonh/conv/ini_convpar.f90 @@ -0,0 +1,111 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 init 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ##################### + MODULE MODI_INI_CONVPAR +! ##################### +! +INTERFACE +! +SUBROUTINE INI_CONVPAR +END SUBROUTINE INI_CONVPAR +! +END INTERFACE +! +END MODULE MODI_INI_CONVPAR +! +! +! +! ###################### + SUBROUTINE INI_CONVPAR +! ###################### +! +!!**** *INI_CONVPAR * - routine to initialize the constants modules +!! +!! PURPOSE +!! ------- +! The purpose of this routine is to initialize the constants +! stored in modules MODD_CONVPAR, MODD_CST, MODD_CONVPAREXT. +! +! +!!** METHOD +!! ------ +!! The deep convection constants are set to their numerical values +!! +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CONVPAR : contains deep convection constants +!! +!! REFERENCE +!! --------- +!! Book2 of the documentation (module MODD_CONVPAR, routine INI_CONVPAR) +!! +!! +!! AUTHOR +!! ------ +!! P. BECHTOLD * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original 26/03/96 +!! Last modified 15/04/98 adapted for ARPEGE +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CONVPAR +! +IMPLICIT NONE +! +!------------------------------------------------------------------------------- +! +!* 1. Set the thermodynamical and numerical constants for +! the deep convection parameterization +! --------------------------------------------------- +! +! +XA25 = 625.E6 ! 25 km x 25 km reference grid area +! +XCRAD = 1500. ! cloud radius +XCDEPTH = 2.5E3 ! minimum necessary cloud depth +XENTR = 0.03 ! entrainment constant (m/Pa) = 0.2 (m) +! +XZLCL = 3.5E3 ! maximum allowed allowed height + ! difference between the surface and the LCL +XZPBL = 60.E2 ! minimum mixed layer depth to sustain convection +XWTRIG = 6.00 ! constant in vertical velocity trigger +! +! +XNHGAM = 1.3333 ! accounts for non-hydrost. pressure + ! in buoyancy term of w equation + ! = 2 / (1+gamma) +XTFRZ1 = 268.16 ! begin of freezing interval +XTFRZ2 = 248.16 ! end of freezing interval +! +XRHDBC = 0.9 ! relative humidity below cloud in downdraft + +XRCONV = 0.015 ! constant in precipitation conversion +XSTABT = 0.75 ! factor to assure stability in fractional time + ! integration, routine CONVECT_CLOSURE +XSTABC = 0.95 ! factor to assure stability in CAPE adjustment, + ! routine CONVECT_CLOSURE +XUSRDPTH = 165.E2 ! pressure thickness used to compute updraft + ! moisture supply rate for downdraft +XMELDPTH = 100.E2 ! layer (Pa) through which precipitation melt is + ! allowed below downdraft +XUVDP = 0.7 ! constant for pressure perturb in momentum transport +! +! +END SUBROUTINE INI_CONVPAR diff --git a/src/mesonh/conv/ini_convpar_e1.f90 b/src/mesonh/conv/ini_convpar_e1.f90 new file mode 100644 index 000000000..c7b93ba29 --- /dev/null +++ b/src/mesonh/conv/ini_convpar_e1.f90 @@ -0,0 +1,111 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 conv 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ##################### + MODULE MODI_INI_CONVPAR_E1 +! ##################### +! +INTERFACE +! +SUBROUTINE INI_CONVPAR_E1 +END SUBROUTINE INI_CONVPAR_E1 +! +END INTERFACE +! +END MODULE MODI_INI_CONVPAR_E1 +! +! +! ######################### + SUBROUTINE INI_CONVPAR_E1 +! ######################### +! +!!**** *INI_CONVPAR * - routine to initialize the convective constants modules +!! with modifications for ensemble run. +!! +!! PURPOSE +!! ------- +! The purpose of this routine is to initialize the constants +! stored in modules MODD_CONVPAR, MODD_CST, MODD_CONVPAREXT. +! +! +!!** METHOD +!! ------ +!! The deep convection constants are set to their numerical values +!! +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CONVPAR : contains deep convection constants +!! +!! REFERENCE +!! --------- +!! Book2 of the documentation (module MODD_CONVPAR, routine INI_CONVPAR) +!! +!! +!! AUTHOR +!! ------ +!! P. BECHTOLD * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original 26/03/96 +!! Last modified 15/04/98 adapted for ARPEGE +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CONVPAR +! +IMPLICIT NONE +! +!------------------------------------------------------------------------------- +! +!* 1. Set the thermodynamical and numerical constants for +! the deep convection parameterization +! --------------------------------------------------- +! +! +XA25 = 625.E6 ! 25 km x 25 km reference grid area +! +XCRAD = 500. ! cloud radius +XCDEPTH = 3.E3 ! minimum necessary cloud depth +XENTR = 0.03 ! entrainment constant (m/Pa) = 0.2 (m) +! +XZLCL = 3.5E3 ! maximum allowed allowed height + ! difference between the surface and the LCL +XZPBL = 60.E2 ! minimum mixed layer depth to sustain convection +XWTRIG = 6.00 ! constant in vertical velocity trigger +! +! +XNHGAM = 1.3333 ! accounts for non-hydrost. pressure + ! in buoyancy term of w equation + ! = 2 / (1+gamma) +XTFRZ1 = 268.16 ! begin of freezing interval +XTFRZ2 = 248.16 ! end of freezing interval +! +XRHDBC = 0.9 ! relative humidity below cloud in downdraft + +XRCONV = 0.015 ! constant in precipitation conversion +XSTABT = 0.75 ! factor to assure stability in fractional time + ! integration, routine CONVECT_CLOSURE +XSTABC = 0.95 ! factor to assure stability in CAPE adjustment, + ! routine CONVECT_CLOSURE +XUSRDPTH = 165.E2 ! pressure thickness used to compute updraft + ! moisture supply rate for downdraft +XMELDPTH = 200.E2 ! layer (Pa) through which precipitation melt is + ! allowed below downdraft +XUVDP = 0.7 ! constant for pressure perturb in momentum transport +! +! +END SUBROUTINE INI_CONVPAR_E1 diff --git a/src/mesonh/conv/ini_convpar_shal.f90 b/src/mesonh/conv/ini_convpar_shal.f90 new file mode 100644 index 000000000..9914a8d65 --- /dev/null +++ b/src/mesonh/conv/ini_convpar_shal.f90 @@ -0,0 +1,112 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 init 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ##################### + MODULE MODI_INI_CONVPAR_SHAL +! ##################### +! +INTERFACE +! +SUBROUTINE INI_CONVPAR_SHAL +END SUBROUTINE INI_CONVPAR_SHAL +! +END INTERFACE +! +END MODULE MODI_INI_CONVPAR_SHAL +! +! +! ########################### + SUBROUTINE INI_CONVPAR_SHAL +! ########################### +! +!!**** *INI_CONVPAR * - routine to initialize the constants modules +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to initialize the constants +!! stored in modules MODD_CONVPAR_SHAL +!! +!! +!!** METHOD +!! ------ +!! The shallow convection constants are set to their numerical values +!! +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CONVPAR_SHAL : contains deep convection constants +!! +!! REFERENCE +!! --------- +!! Book2 of the documentation (module MODD_CONVPAR_SHAL, routine INI_CONVPAR) +!! +!! +!! AUTHOR +!! ------ +!! P. BECHTOLD * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original 26/03/96 +!! Last modified 15/04/98 adapted for ARPEGE +!! 05/05/09 E. Bazile +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CONVPAR_SHAL +! +IMPLICIT NONE +! +!------------------------------------------------------------------------------- +! +!* 1. Set the thermodynamical and numerical constants for +! the deep convection parameterization +! --------------------------------------------------- +! +! +XA25 = 625.E6 ! 25 km x 25 km reference grid area +! +XCRAD = 50. ! cloud radius +XCTIME_SHAL = 10800. ! convective adjustment time +XCDEPTH = 0.5E3 ! minimum necessary shallow cloud depth +XCDEPTH_D = 2.5E3 ! maximum allowed shallow cloud depth +XDTPERT = .2 ! add small Temp perturbation at LCL +XATPERT = 0. ! 0.=original scheme , recommended = 1000. +XBTPERT = 1. ! 1.=original scheme , recommended = 0. +! +XENTR = 0.02 ! entrainment constant (m/Pa) = 0.2 (m) +! +XZLCL = 0.5E3 ! maximum allowed allowed height + ! difference between the DPL and the surface +XZPBL = 40.E2 ! minimum mixed layer depth to sustain convection +! +! +XNHGAM = 1.3333 ! accounts for non-hydrost. pressure + ! in buoyancy term of w equation + ! = 2 / (1+gamma) +XTFRZ1 = 268.16 ! begin of freezing interval +XTFRZ2 = 248.16 ! end of freezing interval +! + +XSTABT = 0.75 ! factor to assure stability in fractional time + ! integration, routine CONVECT_CLOSURE +XSTABC = 0.95 ! factor to assure stability in CAPE adjustment, + ! routine CONVECT_CLOSURE +XAW = 0. ! 0.= Original scheme , 1 = recommended +XBW = 1. ! 1.= Original scheme , 0 = recommended +LLSMOOTH = .TRUE. +! +! +END SUBROUTINE INI_CONVPAR_SHAL diff --git a/src/mesonh/conv/modd_convpar.f90 b/src/mesonh/conv/modd_convpar.f90 new file mode 100644 index 000000000..19cf4725f --- /dev/null +++ b/src/mesonh/conv/modd_convpar.f90 @@ -0,0 +1,77 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 modd 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ######spl + MODULE MODD_CONVPAR +! ################### +! +!!**** *MODD_CONVPAR* - Declaration of convection constants +!! +!! PURPOSE +!! ------- +! The purpose of this declarative module is to declare the +! constants in the deep convection parameterization. +! +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (MODD_CONVPAR) +!! +!! AUTHOR +!! ------ +!! P. Bechtold *Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original 26/03/96 +!! Last modified 15/11/96 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +REAL, SAVE :: XA25 ! 25 km x 25 km reference grid area +! +REAL, SAVE :: XCRAD ! cloud radius +REAL, SAVE :: XCDEPTH ! minimum necessary cloud depth +REAL, SAVE :: XENTR ! entrainment constant (m/Pa) = 0.2 (m) +! +REAL, SAVE :: XZLCL ! maximum allowed allowed height + ! difference between departure level and surface +REAL, SAVE :: XZPBL ! minimum mixed layer depth to sustain convection +REAL, SAVE :: XWTRIG ! constant in vertical velocity trigger +! +! +REAL, SAVE :: XNHGAM ! accounts for non-hydrost. pressure + ! in buoyancy term of w equation + ! = 2 / (1+gamma) +REAL, SAVE :: XTFRZ1 ! begin of freezing interval +REAL, SAVE :: XTFRZ2 ! end of freezing interval +! +REAL, SAVE :: XRHDBC ! relative humidity below cloud in downdraft +! +REAL, SAVE :: XRCONV ! constant in precipitation conversion +REAL, SAVE :: XSTABT ! factor to assure stability in fractional time + ! integration, routine CONVECT_CLOSURE +REAL, SAVE :: XSTABC ! factor to assure stability in CAPE adjustment, + ! routine CONVECT_CLOSURE +REAL, SAVE :: XUSRDPTH ! pressure thickness used to compute updraft + ! moisture supply rate for downdraft +REAL, SAVE :: XMELDPTH ! layer (Pa) through which precipitation melt is + ! allowed below melting level +REAL, SAVE :: XUVDP ! constant for pressure perturb in momentum transport +! +END MODULE MODD_CONVPAR diff --git a/src/mesonh/conv/modd_convpar_shal.f90 b/src/mesonh/conv/modd_convpar_shal.f90 new file mode 100644 index 000000000..56abd00ba --- /dev/null +++ b/src/mesonh/conv/modd_convpar_shal.f90 @@ -0,0 +1,79 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 modd 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ######spl + MODULE MODD_CONVPAR_SHAL +! ######################## +! +!!**** *MODD_CONVPAR_SHAL* - Declaration of convection constants +!! +!! PURPOSE +!! ------- +!! The purpose of this declarative module is to declare the +!! constants in the deep convection parameterization. +!! +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (MODD_CONVPAR_SHAL) +!! +!! AUTHOR +!! ------ +!! P. Bechtold *Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original 26/03/96 +!! Last modified 04/10/98 +!! E. Bazile 05/05/09 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +REAL, SAVE :: XA25 ! 25 km x 25 km reference grid area +! +REAL, SAVE :: XCRAD ! cloud radius +REAL, SAVE :: XCTIME_SHAL ! convective adjustment time +REAL, SAVE :: XCDEPTH ! minimum necessary cloud depth +REAL, SAVE :: XCDEPTH_D ! maximum allowed cloud thickness +REAL, SAVE :: XDTPERT ! add small Temp perturb. at LCL +REAL, SAVE :: XATPERT ! Parameter for temp Perturb +REAL, SAVE :: XBTPERT ! Parameter for temp Perturb + ! (XATPERT* TKE/Cp + XBTPERT) * XDTPERT +REAL, SAVE :: XENTR ! entrainment constant (m/Pa) = 0.2 (m) +! +REAL, SAVE :: XZLCL ! maximum allowed allowed height + ! difference between departure level and surface +REAL, SAVE :: XZPBL ! minimum mixed layer depth to sustain convection +REAL, SAVE :: XWTRIG ! constant in vertical velocity trigger +! +! +REAL, SAVE :: XNHGAM ! accounts for non-hydrost. pressure + ! in buoyancy term of w equation + ! = 2 / (1+gamma) +REAL, SAVE :: XTFRZ1 ! begin of freezing interval +REAL, SAVE :: XTFRZ2 ! end of freezing interval +! +! +REAL, SAVE :: XSTABT ! factor to assure stability in fractional time + ! integration, routine CONVECT_CLOSURE +REAL, SAVE :: XSTABC ! factor to assure stability in CAPE adjustment, + ! routine CONVECT_CLOSURE +REAL, SAVE :: XAW,XBW ! Parameters for WLCL = XAW * W + XBW +LOGICAL, SAVE :: LLSMOOTH ! Default=TRUE but not necessary +! +END MODULE MODD_CONVPAR_SHAL diff --git a/src/mesonh/conv/modd_convparext.f90 b/src/mesonh/conv/modd_convparext.f90 new file mode 100644 index 000000000..9d6a4309e --- /dev/null +++ b/src/mesonh/conv/modd_convparext.f90 @@ -0,0 +1,22 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 modd 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ######spl + MODULE MODD_CONVPAREXT +! ###################### +! +IMPLICIT NONE +! +INTEGER, SAVE :: JCVEXB ! start vertical computations at + ! 1 + JCVEXB = 1 + ( KBDIA - 1 ) +INTEGER, SAVE :: JCVEXT ! limit vertical computations to + ! KLEV - JCVEXT = KLEV - ( KTDIA - 1 ) +! +END MODULE MODD_CONVPAREXT diff --git a/src/mesonh/conv/shallow_convection.f90 b/src/mesonh/conv/shallow_convection.f90 new file mode 100644 index 000000000..548e8bda5 --- /dev/null +++ b/src/mesonh/conv/shallow_convection.f90 @@ -0,0 +1,973 @@ +!MNH_LIC Copyright 1996-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ###################### + MODULE MODI_SHALLOW_CONVECTION +! ###################### +! +INTERFACE +! + SUBROUTINE SHALLOW_CONVECTION( KLON, KLEV, KIDIA, KFDIA, KBDIA, KTDIA, & + PDTCONV, KICE, OSETTADJ, PTADJS, & + PPABST, PZZ, PTKECLS, & + PTT, PRVT, PRCT, PRIT, PWT, & + PTTEN, PRVTEN, PRCTEN, PRITEN, & + KCLTOP, KCLBAS, PUMF, & + OCH1CONV, KCH1, PCH1, PCH1TEN ) +! +INTEGER, INTENT(IN) :: KLON ! horizontal dimension +INTEGER, INTENT(IN) :: KLEV ! vertical dimension +INTEGER, INTENT(IN) :: KIDIA ! value of the first point in x +INTEGER, INTENT(IN) :: KFDIA ! value of the last point in x +INTEGER, INTENT(IN) :: KBDIA ! vertical computations start at +! ! KBDIA that is at least 1 +INTEGER, INTENT(IN) :: KTDIA ! vertical computations can be + ! limited to KLEV + 1 - KTDIA + ! default=1 +REAL, INTENT(IN) :: PDTCONV ! Interval of time between two + ! calls of the deep convection + ! scheme +INTEGER, INTENT(IN) :: KICE ! flag for ice ( 1 = yes, + ! 0 = no ice ) +LOGICAL, INTENT(IN) :: OSETTADJ ! logical to set convective + ! adjustment time by user +REAL, INTENT(IN) :: PTADJS ! user defined adjustment time +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PTT ! grid scale temperature at t +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PRVT ! grid scale water vapor " +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PRCT ! grid scale r_c " +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PRIT ! grid scale r_i " +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PWT ! grid scale vertical + ! velocity (m/s) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PPABST ! grid scale pressure at t +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PZZ ! height of model layer (m) +REAL, DIMENSION(KLON), INTENT(IN) :: PTKECLS ! TKE in the CLS (m2/s2) +! +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PTTEN ! convective temperature + ! tendency (K/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PRVTEN ! convective r_v tendency (1/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PRCTEN ! convective r_c tendency (1/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PRITEN ! convective r_i tendency (1/s) +INTEGER, DIMENSION(KLON), INTENT(INOUT):: KCLTOP ! cloud top level +INTEGER, DIMENSION(KLON), INTENT(INOUT):: KCLBAS ! cloud base level + ! they are given a value of + ! 0 if no convection +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PUMF ! updraft mass flux (kg/s m2) +! +LOGICAL, INTENT(IN) :: OCH1CONV ! include tracer transport +INTEGER, INTENT(IN) :: KCH1 ! number of species +REAL, DIMENSION(KLON,KLEV,KCH1), INTENT(IN) :: PCH1! grid scale chemical species +REAL, DIMENSION(KLON,KLEV,KCH1), INTENT(INOUT):: PCH1TEN! species conv. tendency (1/s) +! +END SUBROUTINE SHALLOW_CONVECTION +! +END INTERFACE +! +END MODULE MODI_SHALLOW_CONVECTION +! ############################################################################### + SUBROUTINE SHALLOW_CONVECTION( KLON, KLEV, KIDIA, KFDIA, KBDIA, KTDIA, & + PDTCONV, KICE, OSETTADJ, PTADJS, & + PPABST, PZZ, PTKECLS, & + PTT, PRVT, PRCT, PRIT, PWT, & + PTTEN, PRVTEN, PRCTEN, PRITEN, & + KCLTOP, KCLBAS, PUMF, & + OCH1CONV, KCH1, PCH1, PCH1TEN ) +! ############################################################################### +! +!!**** Monitor routine to compute all convective tendencies by calls +!! of several subroutines. +!! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to determine the convective +!! tendencies. The routine first prepares all necessary grid-scale +!! variables. The final convective tendencies are then computed by +!! calls of different subroutines. +!! +!! +!!** METHOD +!! ------ +!! We start by selecting convective columns in the model domain through +!! the call of routine TRIGGER_FUNCT. Then, we allocate memory for the +!! convection updraft and downdraft variables and gather the grid scale +!! variables in convective arrays. +!! The updraft and downdraft computations are done level by level starting +!! at the bottom and top of the domain, respectively. +!! All computations are done on MNH thermodynamic levels. The depth +!! of the current model layer k is defined by DP(k)=P(k-1)-P(k) +!! +!! +!! +!! EXTERNAL +!! -------- +!! CONVECT_TRIGGER_SHAL +!! CONVECT_SATMIXRATIO +!! CONVECT_UPDRAFT_SHAL +!! CONVECT_CONDENS +!! CONVECT_MIXING_FUNCT +!! CONVECT_CLOSURE_SHAL +!! CONVECT_CLOSURE_THRVLCL +!! CONVECT_CLOSURE_ADJUST_SHAL +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST +!! XG ! gravity constant +!! XPI ! number Pi +!! XP00 ! reference pressure +!! XRD, XRV ! gaz constants for dry air and water vapor +!! XCPD, XCPV ! specific heat for dry air and water vapor +!! XRHOLW ! density of liquid water +!! XALPW, XBETAW, XGAMW ! constants for water saturation pressure +!! XTT ! triple point temperature +!! XLVTT, XLSTT ! vaporization, sublimation heat constant +!! XCL, XCI ! specific heat for liquid water and ice +!! +!! Module MODD_CONVPAREXT +!! JCVEXB, JCVEXT ! extra levels on the vertical boundaries +!! +!! Module MODD_CONVPAR +!! XA25 ! reference grid area +!! XCRAD ! cloud radius +!! +!! +!! REFERENCE +!! --------- +!! +!! Bechtold, 1997 : Meso-NH scientific documentation (31 pp) +!! Fritsch and Chappell, 1980, J. Atmos. Sci., Vol. 37, 1722-1761. +!! Kain and Fritsch, 1990, J. Atmos. Sci., Vol. 47, 2784-2801. +!! Kain and Fritsch, 1993, Meteor. Monographs, Vol. 24, 165-170. +!! +!! AUTHOR +!! ------ +!! P. BECHTOLD * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original 26/03/96 +!! Peter Bechtold 15/11/96 replace theta_il by enthalpy +!! " 10/12/98 changes for ARPEGE +!! " 01/01/02 Apply conservation correction +!! F Bouyssel 05/11/08 Modifications for reproductibility +!! E. Bazile 20/07/09 Input of TKECLS. +! P. Wautelet 03/06/2019: simplify code (remove always true masks) + replace PACK intrinsics +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_CONVPAREXT +USE MODD_CONVPAR_SHAL +USE MODD_NSV, ONLY : NSV_LGBEG,NSV_LGEND +! +USE MODI_CONVECT_TRIGGER_SHAL +USE MODI_CONVECT_UPDRAFT_SHAL +USE MODI_CONVECT_CLOSURE_SHAL +USE MODI_CONVECT_CHEM_TRANSPORT +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +! +INTEGER, INTENT(IN) :: KLON ! horizontal dimension +INTEGER, INTENT(IN) :: KLEV ! vertical dimension +INTEGER, INTENT(IN) :: KIDIA ! value of the first point in x +INTEGER, INTENT(IN) :: KFDIA ! value of the last point in x +INTEGER, INTENT(IN) :: KBDIA ! vertical computations start at +! ! KBDIA that is at least 1 +INTEGER, INTENT(IN) :: KTDIA ! vertical computations can be + ! limited to KLEV + 1 - KTDIA + ! default=1 +REAL, INTENT(IN) :: PDTCONV ! Interval of time between two + ! calls of the deep convection + ! scheme +INTEGER, INTENT(IN) :: KICE ! flag for ice ( 1 = yes, + ! 0 = no ice ) +LOGICAL, INTENT(IN) :: OSETTADJ ! logical to set convective + ! adjustment time by user +REAL, INTENT(IN) :: PTADJS ! user defined adjustment time +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PTT ! grid scale temperature at t +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PRVT ! grid scale water vapor " +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PRCT ! grid scale r_c " +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PRIT ! grid scale r_i " +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PWT ! grid scale vertical + ! velocity (m/s) +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PPABST ! grid scale pressure at t +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PZZ ! height of model layer (m) +REAL, DIMENSION(KLON), INTENT(IN) :: PTKECLS ! TKE in the CLS (m2/s2) +! +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PTTEN ! convective temperature + ! tendency (K/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PRVTEN ! convective r_v tendency (1/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PRCTEN ! convective r_c tendency (1/s) +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PRITEN ! convective r_i tendency (1/s) +INTEGER, DIMENSION(KLON), INTENT(INOUT):: KCLTOP ! cloud top level +INTEGER, DIMENSION(KLON), INTENT(INOUT):: KCLBAS ! cloud base level + ! they are given a value of + ! 0 if no convection +REAL, DIMENSION(KLON,KLEV), INTENT(INOUT):: PUMF ! updraft mass flux (kg/s m2) +! +LOGICAL, INTENT(IN) :: OCH1CONV ! include tracer transport +INTEGER, INTENT(IN) :: KCH1 ! number of species +REAL, DIMENSION(KLON,KLEV,KCH1), INTENT(IN) :: PCH1! grid scale chemical species +REAL, DIMENSION(KLON,KLEV,KCH1), INTENT(INOUT):: PCH1TEN! species conv. tendency (1/s) +! +! +!* 0.2 Declarations of local fixed memory variables : +! +INTEGER :: ICONV ! number of convective columns +INTEGER :: IIB, IIE ! horizontal loop bounds +INTEGER :: IKB, IKE ! vertical loop bounds +INTEGER :: IKS ! vertical dimension +INTEGER :: JI, JL ! horizontal loop index +INTEGER :: JN ! number of tracers +INTEGER :: JK, JKM, JKP ! vertical loop index +INTEGER :: IFTSTEPS ! only used for chemical tracers +REAL :: ZEPS, ZEPSA ! R_d / R_v, R_v / R_d +REAL :: ZRDOCP ! R_d/C_p +! +REAL, DIMENSION(KLON,KLEV) :: ZTHT, ZSTHV, ZSTHES ! grid scale theta, theta_v +REAL, DIMENSION(KLON) :: ZWORK2, ZWORK2B ! work array +REAL :: ZW1 ! work variable +! +! +!* 0.2 Declarations of local allocatable variables : +! +INTEGER, DIMENSION(:),ALLOCATABLE :: IDPL ! index for parcel departure level +INTEGER, DIMENSION(:),ALLOCATABLE :: IPBL ! index for source layer top +INTEGER, DIMENSION(:),ALLOCATABLE :: ILCL ! index for lifting condensation level +INTEGER, DIMENSION(:),ALLOCATABLE :: IETL ! index for zero buoyancy level +INTEGER, DIMENSION(:),ALLOCATABLE :: ICTL ! index for cloud top level +INTEGER, DIMENSION(:),ALLOCATABLE :: ILFS ! index for level of free sink +! +INTEGER, DIMENSION(:), ALLOCATABLE :: ISDPL ! index for parcel departure level +INTEGER, DIMENSION(:),ALLOCATABLE :: ISPBL ! index for source layer top +INTEGER, DIMENSION(:), ALLOCATABLE :: ISLCL ! index for lifting condensation level +REAL, DIMENSION(:), ALLOCATABLE :: ZSTHLCL ! updraft theta at LCL +REAL, DIMENSION(:), ALLOCATABLE :: ZSTLCL ! updraft temp. at LCL +REAL, DIMENSION(:), ALLOCATABLE :: ZSRVLCL ! updraft rv at LCL +REAL, DIMENSION(:), ALLOCATABLE :: ZSWLCL ! updraft w at LCL +REAL, DIMENSION(:), ALLOCATABLE :: ZSZLCL ! LCL height +REAL, DIMENSION(:), ALLOCATABLE :: ZSTHVELCL! envir. theta_v at LCL +REAL, DIMENSION(:), ALLOCATABLE :: ZSDXDY ! grid area (m^2) +! +! grid scale variables +REAL, DIMENSION(:,:), ALLOCATABLE :: ZZ ! height of model layer (m) +REAL, DIMENSION(:,:), ALLOCATABLE :: ZPRES ! grid scale pressure +REAL, DIMENSION(:,:), ALLOCATABLE :: ZDPRES ! pressure difference between + ! bottom and top of layer (Pa) +REAL, DIMENSION(:,:), ALLOCATABLE :: ZW ! grid scale vertical velocity on theta grid +REAL, DIMENSION(:,:), ALLOCATABLE :: ZTT ! temperature +REAL, DIMENSION(:,:), ALLOCATABLE :: ZTH ! grid scale theta +REAL, DIMENSION(:,:), ALLOCATABLE :: ZTHV ! grid scale theta_v +REAL, DIMENSION(:,:), ALLOCATABLE :: ZTHL ! grid scale enthalpy (J/kg) +REAL, DIMENSION(:,:), ALLOCATABLE :: ZTHES, ZTHEST ! grid scale saturated theta_e +REAL, DIMENSION(:,:), ALLOCATABLE :: ZRW ! grid scale total water (kg/kg) +REAL, DIMENSION(:,:), ALLOCATABLE :: ZRV ! grid scale water vapor (kg/kg) +REAL, DIMENSION(:,:), ALLOCATABLE :: ZRC ! grid scale cloud water (kg/kg) +REAL, DIMENSION(:,:), ALLOCATABLE :: ZRI ! grid scale cloud ice (kg/kg) +REAL, DIMENSION(:), ALLOCATABLE :: ZDXDY ! grid area (m^2) +! +! updraft variables +REAL, DIMENSION(:,:), ALLOCATABLE :: ZUMF ! updraft mass flux (kg/s) +REAL, DIMENSION(:,:), ALLOCATABLE :: ZUER ! updraft entrainment (kg/s) +REAL, DIMENSION(:,:), ALLOCATABLE :: ZUDR ! updraft detrainment (kg/s) +REAL, DIMENSION(:,:), ALLOCATABLE :: ZUTHL ! updraft enthalpy (J/kg) +REAL, DIMENSION(:,:), ALLOCATABLE :: ZUTHV ! updraft theta_v (K) +REAL, DIMENSION(:,:), ALLOCATABLE :: ZURW ! updraft total water (kg/kg) +REAL, DIMENSION(:,:), ALLOCATABLE :: ZURC ! updraft cloud water (kg/kg) +REAL, DIMENSION(:,:), ALLOCATABLE :: ZURI ! updraft cloud ice (kg/kg) +REAL, DIMENSION(:), ALLOCATABLE :: ZMFLCL ! cloud base unit mass flux(kg/s) +REAL, DIMENSION(:), ALLOCATABLE :: ZCAPE ! available potent. energy +REAL, DIMENSION(:), ALLOCATABLE :: ZTHLCL ! updraft theta at LCL +REAL, DIMENSION(:), ALLOCATABLE :: ZTLCL ! updraft temp. at LCL +REAL, DIMENSION(:), ALLOCATABLE :: ZRVLCL ! updraft rv at LCL +REAL, DIMENSION(:), ALLOCATABLE :: ZWLCL ! updraft w at LCL +REAL, DIMENSION(:), ALLOCATABLE :: ZZLCL ! LCL height +REAL, DIMENSION(:), ALLOCATABLE :: ZTHVELCL! envir. theta_v at LCL +! +! downdraft variables +REAL, DIMENSION(:,:), ALLOCATABLE :: ZDMF ! downdraft mass flux (kg/s) +REAL, DIMENSION(:,:), ALLOCATABLE :: ZDER ! downdraft entrainment (kg/s) +REAL, DIMENSION(:,:), ALLOCATABLE :: ZDDR ! downdraft detrainment (kg/s) +! +! closure variables +REAL, DIMENSION(:,:), ALLOCATABLE :: ZLMASS ! mass of model layer (kg) +REAL, DIMENSION(:), ALLOCATABLE :: ZTIMEC ! advective time period +! +REAL, DIMENSION(:,:), ALLOCATABLE :: ZTHC ! conv. adj. grid scale theta +REAL, DIMENSION(:,:), ALLOCATABLE :: ZRVC ! conv. adj. grid scale r_w +REAL, DIMENSION(:,:), ALLOCATABLE :: ZRCC ! conv. adj. grid scale r_c +REAL, DIMENSION(:,:), ALLOCATABLE :: ZRIC ! conv. adj. grid scale r_i +REAL, DIMENSION(:,:), ALLOCATABLE :: ZWSUB ! envir. compensating subsidence (Pa/s) +! +LOGICAL, DIMENSION(:),ALLOCATABLE :: GTRIG1 ! logical mask for convection +INTEGER, DIMENSION(:),ALLOCATABLE :: IJINDEX ! hor.index +REAL, DIMENSION(:), ALLOCATABLE :: ZCPH ! specific heat C_ph +REAL, DIMENSION(:), ALLOCATABLE :: ZLV, ZLS! latent heat of vaporis., sublim. +REAL :: ZES ! saturation vapor mixng ratio +! +! Chemical Tracers: +REAL, DIMENSION(:,:,:), ALLOCATABLE:: ZCH1 ! grid scale chemical specy (kg/kg) +REAL, DIMENSION(:,:,:), ALLOCATABLE:: ZCH1C ! conv. adjust. chemical specy 1 +REAL, DIMENSION(:,:), ALLOCATABLE:: ZWORK3 ! conv. adjust. chemical specy 1 +! +!------------------------------------------------------------------------------- +! +! +!* 0.3 Compute loop bounds +! ------------------- +! +IIB = KIDIA +IIE = KFDIA +JCVEXB = MAX( 0, KBDIA - 1 ) +IKB = 1 + JCVEXB +IKS = KLEV +JCVEXT = MAX( 0, KTDIA - 1) +IKE = IKS - JCVEXT +! +! +!* 0.7 Reset convective tendencies to zero if convective +! counter becomes negative +! ------------------------------------------------- +! +PTTEN(:,:) = 0. +PRVTEN(:,:) = 0. +PRCTEN(:,:) = 0. +PRITEN(:,:) = 0. +! PUTEN(:,:) = 0. +! PVTEN(:,:) = 0. +PUMF(:,:) = 0. +KCLTOP(:) = 0 +KCLBAS(:) = 0 +IF ( OCH1CONV ) THEN + PCH1TEN(:,:,:) = 0. +END IF +! +! +!* 1. Initialize local variables +! ---------------------------- +! +ZEPS = XRD / XRV +ZEPSA = XRV / XRD +ZRDOCP = XRD / XCPD +! +!------------------------------------------------------------------------------- +! +!* 1.1 Set up grid scale theta, theta_v, theta_es +! ------------------------------------------ +! +ZTHT(:,:) = 300. +ZSTHV(:,:)= 300. +ZSTHES(:,:)= 400. +DO JK = IKB, IKE +DO JI = IIB, IIE + IF ( PPABST(JI,JK) > 40.E2 ) THEN + ZTHT(JI,JK) = PTT(JI,JK) * ( XP00 / PPABST(JI,JK) ) ** ZRDOCP + ZSTHV(JI,JK) = ZTHT(JI,JK) * ( 1. + ZEPSA * PRVT(JI,JK) ) / & + ( 1. + PRVT(JI,JK) + PRCT(JI,JK) + PRIT(JI,JK) ) +! + ! use conservative Bolton (1980) formula for theta_e + ! it is used to compute CAPE for undilute parcel ascent + ! For economical reasons we do not use routine CONVECT_SATMIXRATIO here +! + ZES = EXP( XALPW - XBETAW / PTT(JI,JK) - XGAMW * LOG( PTT(JI,JK) ) ) + ZES = MIN( 1., ZEPS * ZES / ( PPABST(JI,JK) - ZES ) ) + ZSTHES(JI,JK) = PTT(JI,JK) * ( ZTHT(JI,JK) / PTT(JI,JK) ) ** & + ( 1. - 0.28 * ZES ) * EXP( ( 3374.6525 / PTT(JI,JK) - 2.5403 ) & + * ZES * ( 1. + 0.81 * ZES ) ) + END IF +END DO +END DO +! +!------------------------------------------------------------------------------- +! +!* 2. Test for convective columns and determine properties at the LCL +! -------------------------------------------------------------- +! +!* 2.1 Allocate arrays depending on number of model columns that need +! to be tested for convection (i.e. where no convection is present +! at the moment. +! -------------------------------------------------------------- +! +ALLOCATE( ZPRES(KLON,IKS) ) +ALLOCATE( ZZ(KLON,IKS) ) +ALLOCATE( ZW(KLON,IKS) ) +ALLOCATE( ZTH(KLON,IKS) ) +ALLOCATE( ZTHV(KLON,IKS) ) +ALLOCATE( ZTHEST(KLON,IKS) ) +ALLOCATE( ZRV(KLON,IKS) ) +ALLOCATE( ZSTHLCL(KLON) ) +ALLOCATE( ZSTLCL(KLON) ) +ALLOCATE( ZSRVLCL(KLON) ) +ALLOCATE( ZSWLCL(KLON) ) +ALLOCATE( ZSZLCL(KLON) ) +ALLOCATE( ZSTHVELCL(KLON) ) +ALLOCATE( ISDPL(KLON) ) +ALLOCATE( ISPBL(KLON) ) +ALLOCATE( ISLCL(KLON) ) +ALLOCATE( ZSDXDY(KLON) ) +ALLOCATE( GTRIG1(KLON) ) +! +DO JK = IKB, IKE +DO JI = 1, KLON + JL = JI + ZPRES(JI,JK) = PPABST(JI,JK) + ZZ(JI,JK) = PZZ(JI,JK) + ZTH(JI,JK) = ZTHT(JI,JK) + ZTHV(JI,JK) = ZSTHV(JI,JK) + ZTHEST(JI,JK) = ZSTHES(JI,JK) + ZRV(JI,JK) = MAX( 0., PRVT(JI,JK) ) + ZW(JI,JK) = PWT(JI,JK) +END DO +END DO +ZSDXDY(:) = XA25 +! +!* 2.2 Compute environm. enthalpy and total water = r_v + r_i + r_c +! and envir. saturation theta_e +! ------------------------------------------------------------ +! +! +!* 2.3 Test for convective columns and determine properties at the LCL +! -------------------------------------------------------------- +! +ISLCL(:) = MAX( IKB, 2 ) ! initialize DPL PBL and LCL +ISDPL(:) = IKB +ISPBL(:) = IKB +! +CALL CONVECT_TRIGGER_SHAL( KLON, KLEV, & + ZPRES, ZTH, ZTHV, ZTHEST, & + ZRV, ZW, ZZ, ZSDXDY, PTKECLS, & + ZSTHLCL, ZSTLCL, ZSRVLCL, ZSWLCL, ZSZLCL, & + ZSTHVELCL, ISLCL, ISDPL, ISPBL, GTRIG1 ) +! +DEALLOCATE( ZPRES ) +DEALLOCATE( ZZ ) +DEALLOCATE( ZTH ) +DEALLOCATE( ZTHV ) +DEALLOCATE( ZTHEST ) +DEALLOCATE( ZRV ) +DEALLOCATE( ZW ) +! +!------------------------------------------------------------------------------- +! +!* 3. After the call of TRIGGER_FUNCT we allocate all the dynamic +! arrays used in the convection scheme using the mask GTRIG, i.e. +! we do calculus only in convective columns. This corresponds to +! a GATHER operation. +! -------------------------------------------------------------- +! +ICONV = COUNT( GTRIG1(:) ) +IF ( ICONV == 0 ) THEN + DEALLOCATE( ZSTHLCL ) + DEALLOCATE( ZSTLCL ) + DEALLOCATE( ZSRVLCL ) + DEALLOCATE( ZSWLCL ) + DEALLOCATE( ZSZLCL ) + DEALLOCATE( ZSTHVELCL ) + DEALLOCATE( ZSDXDY ) + DEALLOCATE( ISLCL ) + DEALLOCATE( ISDPL ) + DEALLOCATE( ISPBL ) + DEALLOCATE( GTRIG1 ) + RETURN ! no convective column has been found, exit DEEP_CONVECTION +ENDIF +! + ! vertical index variables +! +ALLOCATE( IDPL(ICONV) ) +ALLOCATE( IPBL(ICONV) ) +ALLOCATE( ILCL(ICONV) ) +ALLOCATE( ICTL(ICONV) ) +ALLOCATE( IETL(ICONV) ) +! + ! grid scale variables +! +ALLOCATE( ZZ(ICONV,IKS) ) ; ZZ = 0.0 +ALLOCATE( ZPRES(ICONV,IKS) ); ZPRES = 0.0 +ALLOCATE( ZDPRES(ICONV,IKS) ) ; ZDPRES = 0.0 +ALLOCATE( ZTT(ICONV, IKS) ) ; ZTT = 0.0 +ALLOCATE( ZTH(ICONV,IKS) ) ; ZTH = 0.0 +ALLOCATE( ZTHV(ICONV,IKS) ) ; ZTHV = 0.0 +ALLOCATE( ZTHL(ICONV,IKS) ) ; ZTHL = 0.0 +ALLOCATE( ZTHES(ICONV,IKS) ) ; ZTHES = 0.0 +ALLOCATE( ZRV(ICONV,IKS) ) ; ZRV = 0.0 +ALLOCATE( ZRC(ICONV,IKS) ) ; ZRC = 0.0 +ALLOCATE( ZRI(ICONV,IKS) ) ; ZRI = 0.0 +ALLOCATE( ZRW(ICONV,IKS) ) ; ZRW = 0.0 +ALLOCATE( ZDXDY(ICONV) ) ; ZDXDY = 0.0 +! + ! updraft variables +! +ALLOCATE( ZUMF(ICONV,IKS) ) +ALLOCATE( ZUER(ICONV,IKS) ) +ALLOCATE( ZUDR(ICONV,IKS) ) +ALLOCATE( ZUTHL(ICONV,IKS) ) +ALLOCATE( ZUTHV(ICONV,IKS) ) +ALLOCATE( ZURW(ICONV,IKS) ) +ALLOCATE( ZURC(ICONV,IKS) ) +ALLOCATE( ZURI(ICONV,IKS) ) +ALLOCATE( ZTHLCL(ICONV) ) +ALLOCATE( ZTLCL(ICONV) ) +ALLOCATE( ZRVLCL(ICONV) ) +ALLOCATE( ZWLCL(ICONV) ) +ALLOCATE( ZMFLCL(ICONV) ) +ALLOCATE( ZZLCL(ICONV) ) +ALLOCATE( ZTHVELCL(ICONV) ) +ALLOCATE( ZCAPE(ICONV) ) +! + ! work variables +! +ALLOCATE( IJINDEX(ICONV) ) +ALLOCATE( ZCPH(ICONV) ) +ALLOCATE( ZLV(ICONV) ) +ALLOCATE( ZLS(ICONV) ) +! +! +!* 3.1 Gather grid scale and updraft base variables in +! arrays using mask GTRIG +! --------------------------------------------------- +! +JL = 1 +DO JI = 1, KLON + IF ( GTRIG1(JI) ) THEN + IJINDEX(JL) = JI + JL = JL +1 + END IF +END DO +! +DO JK = IKB, IKE +DO JI = 1, ICONV + JL = IJINDEX(JI) + ZZ(JI,JK) = PZZ(JL,JK) + ZPRES(JI,JK) = PPABST(JL,JK) + ZTT(JI,JK) = PTT(JL,JK) + ZTH(JI,JK) = ZTHT(JL,JK) + ZTHES(JI,JK) = ZSTHES(JL,JK) + ZRV(JI,JK) = MAX( 0., PRVT(JL,JK) ) + ZRC(JI,JK) = MAX( 0., PRCT(JL,JK) ) + ZRI(JI,JK) = MAX( 0., PRIT(JL,JK) ) + ZTHV(JI,JK) = ZSTHV(JL,JK) +END DO +END DO +! +DO JI = 1, ICONV + JL = IJINDEX(JI) + IDPL(JI) = ISDPL(JL) + IPBL(JI) = ISPBL(JL) + ILCL(JI) = ISLCL(JL) + ZTHLCL(JI) = ZSTHLCL(JL) + ZTLCL(JI) = ZSTLCL(JL) + ZRVLCL(JI) = ZSRVLCL(JL) + ZWLCL(JI) = ZSWLCL(JL) + ZZLCL(JI) = ZSZLCL(JL) + ZTHVELCL(JI) = ZSTHVELCL(JL) + ZDXDY(JI) = ZSDXDY(JL) +END DO + +DEALLOCATE( GTRIG1 ) +ALLOCATE( GTRIG1(ICONV) ) +GTRIG1(:) = .true. + +DEALLOCATE( ISDPL ) +DEALLOCATE( ISPBL ) +DEALLOCATE( ISLCL ) +DEALLOCATE( ZSTHLCL ) +DEALLOCATE( ZSTLCL ) +DEALLOCATE( ZSRVLCL ) +DEALLOCATE( ZSWLCL ) +DEALLOCATE( ZSZLCL ) +DEALLOCATE( ZSTHVELCL ) +DEALLOCATE( ZSDXDY ) +! +! +!* 3.2 Compute pressure difference +! --------------------------------------------------- +! +ZDPRES(:,IKB) = 0. +DO JK = IKB + 1, IKE + ZDPRES(:,JK) = ZPRES(:,JK-1) - ZPRES(:,JK) +END DO +! +!* 3.3 Compute environm. enthalpy and total water = r_v + r_i + r_c +! ---------------------------------------------------------- +! +DO JK = IKB, IKE, 1 + ZRW(:,JK) = ZRV(:,JK) + ZRC(:,JK) + ZRI(:,JK) + ZCPH(:) = XCPD + XCPV * ZRW(:,JK) + ZLV(:) = XLVTT + ( XCPV - XCL ) * ( ZTT(:,JK) - XTT ) ! compute L_v + ZLS(:) = XLSTT + ( XCPV - XCI ) * ( ZTT(:,JK) - XTT ) ! compute L_i + ZTHL(:,JK) = ZCPH(:) * ZTT(:,JK) + ( 1. + ZRW(:,JK) ) * XG * ZZ(:,JK) & + - ZLV(:) * ZRC(:,JK) - ZLS(:) * ZRI(:,JK) +END DO +! +DEALLOCATE( ZCPH ) +DEALLOCATE( ZLV ) +DEALLOCATE( ZLS ) +! +!------------------------------------------------------------------------------- +! +!* 4. Compute updraft properties +! ---------------------------- +! +!* 4.1 Set mass flux at LCL ( here a unit mass flux with w = 1 m/s ) +! ------------------------------------------------------------- +! +ZDXDY(:) = XA25 +ZMFLCL(:) = XA25 * 1.E-3 +! +! +! +CALL CONVECT_UPDRAFT_SHAL( ICONV, KLEV, & + KICE, ZPRES, ZDPRES, ZZ, ZTHL, ZTHV, ZTHES, ZRW, & + ZTHLCL, ZTLCL, ZRVLCL, ZWLCL, ZZLCL, ZTHVELCL, & + ZMFLCL, GTRIG1, ILCL, IDPL, IPBL, & + ZUMF, ZUER, ZUDR, ZUTHL, ZUTHV, ZURW, & + ZURC, ZURI, ZCAPE, ICTL, IETL ) +! +! +! +!* 4.2 In routine UPDRAFT GTRIG1 has been set to false when cloud +! thickness is smaller than 3 km +! ----------------------------------------------------------- +! +! +! +!* 4.3 Allocate memory for downdraft variables +! --------------------------------------- +! +! downdraft variables +! + ALLOCATE( ZDMF(ICONV,IKS) ) + ALLOCATE( ZDER(ICONV,IKS) ) + ALLOCATE( ZDDR(ICONV,IKS) ) + ALLOCATE( ILFS(ICONV) ) + ALLOCATE( ZLMASS(ICONV,IKS) ) + ZDMF(:,:) = 0. + ZDER(:,:) = 0. + ZDDR(:,:) = 0. + ILFS(:) = IKB + DO JK = IKB, IKE + ZLMASS(:,JK) = ZDXDY(:) * ZDPRES(:,JK) / XG ! mass of model layer + END DO + ZLMASS(:,IKB) = ZLMASS(:,IKB+1) +! +! closure variables +! + ALLOCATE( ZTIMEC(ICONV) ) + ALLOCATE( ZTHC(ICONV,IKS) ) + ALLOCATE( ZRVC(ICONV,IKS) ) + ALLOCATE( ZRCC(ICONV,IKS) ) + ALLOCATE( ZRIC(ICONV,IKS) ) + ALLOCATE( ZWSUB(ICONV,IKS) ) +! +!------------------------------------------------------------------------------- +! +!* 5. Compute downdraft properties +! ---------------------------- +! + ZTIMEC(:) = XCTIME_SHAL + IF ( OSETTADJ ) ZTIMEC(:) = PTADJS +! +!* 7. Determine adjusted environmental values assuming +! that all available buoyant energy must be removed +! within an advective time step ZTIMEC. +! --------------------------------------------------- +! + CALL CONVECT_CLOSURE_SHAL( ICONV, KLEV, & + ZPRES, ZDPRES, ZZ, ZDXDY, ZLMASS, & + ZTHL, ZTH, ZRW, ZRC, ZRI, GTRIG1, & + ZTHC, ZRVC, ZRCC, ZRIC, ZWSUB, & + ILCL, IDPL, IPBL, ICTL, & + ZUMF, ZUER, ZUDR, ZUTHL, ZURW, & + ZURC, ZURI, ZCAPE, ZTIMEC, IFTSTEPS ) +! +!------------------------------------------------------------------------------- +! +!* 8. Determine the final grid-scale (environmental) convective +! tendencies and set convective counter +! -------------------------------------------------------- +! +! +!* 8.1 Grid scale tendencies +! --------------------- +! + ! in order to save memory, the tendencies are temporarily stored + ! in the tables for the adjusted grid-scale values +! + DO JK = IKB, IKE + ZTHC(:,JK) = ( ZTHC(:,JK) - ZTH(:,JK) ) / ZTIMEC(:) & + * ( ZPRES(:,JK) / XP00 ) ** ZRDOCP ! change theta in temperature + ZRVC(:,JK) = ( ZRVC(:,JK) - ZRW(:,JK) + ZRC(:,JK) + ZRI(:,JK) ) & + / ZTIMEC(:) + + ZRCC(:,JK) = ( ZRCC(:,JK) - ZRC(:,JK) ) / ZTIMEC(:) + ZRIC(:,JK) = ( ZRIC(:,JK) - ZRI(:,JK) ) / ZTIMEC(:) +! + END DO +! +! +!* 8.2 Apply conservation correction +! ----------------------------- +! + ! adjustment at cloud top to smooth possible discontinuous profiles at PBL inversions + ! (+ - - tendencies for moisture ) +! +! +IF (LLSMOOTH) THEN + DO JI = 1, ICONV + JK = ICTL(JI) + JKM= MAX(2,ICTL(JI)-1) + JKP= MAX(2,ICTL(JI)-2) + ZRVC(JI,JKM) = ZRVC(JI,JKM) + .5 * ZRVC(JI,JK) + ZRCC(JI,JKM) = ZRCC(JI,JKM) + .5 * ZRCC(JI,JK) + ZRIC(JI,JKM) = ZRIC(JI,JKM) + .5 * ZRIC(JI,JK) + ZTHC(JI,JKM) = ZTHC(JI,JKM) + .5 * ZTHC(JI,JK) + ZRVC(JI,JKP) = ZRVC(JI,JKP) + .3 * ZRVC(JI,JK) + ZRCC(JI,JKP) = ZRCC(JI,JKP) + .3 * ZRCC(JI,JK) + ZRIC(JI,JKP) = ZRIC(JI,JKP) + .3 * ZRIC(JI,JK) + ZTHC(JI,JKP) = ZTHC(JI,JKP) + .3 * ZTHC(JI,JK) + ZRVC(JI,JK) = .2 * ZRVC(JI,JK) + ZRCC(JI,JK) = .2 * ZRCC(JI,JK) + ZRIC(JI,JK) = .2 * ZRIC(JI,JK) + ZTHC(JI,JK) = .2 * ZTHC(JI,JK) + END DO +ENDIF +! +! + ! Compute vertical integrals - Fluxes +! + JKM = MAXVAL( ICTL(:) ) + ZWORK2(:) = 0. + ZWORK2B(:) = 0. + DO JK = IKB+1, JKM + JKP = JK + 1 + DO JI = 1, ICONV + IF ( JK <= ICTL(JI) ) THEN + ZW1 = ZRVC(JI,JK) + ZRCC(JI,JK) + ZRIC(JI,JK) + ZWORK2(JI) = ZWORK2(JI) + ZW1 * & ! moisture + .5 * (ZPRES(JI,JK-1) - ZPRES(JI,JKP)) / XG + ZW1 = ( XCPD + XCPV * ZRW(JI,JK) )* ZTHC(JI,JK) - & + ( XLVTT + ( XCPV - XCL ) * ( ZTT(JI,JK) - XTT ) ) * ZRCC(JI,JK) - & + ( XLSTT + ( XCPV - XCL ) * ( ZTT(JI,JK) - XTT ) ) * ZRIC(JI,JK) + ZWORK2B(JI) = ZWORK2B(JI) + ZW1 * & ! energy + .5 * (ZPRES(JI,JK-1) - ZPRES(JI,JKP)) / XG + END IF + END DO + END DO +! + ! Budget error (integral must be zero) +! + DO JI = 1, ICONV + IF ( ICTL(JI) > IKB+1 ) THEN + JKP = ICTL(JI) + ZW1 = XG / ( ZPRES(JI,IKB) - ZPRES(JI,JKP) - & + .5 * (ZDPRES(JI,IKB+1) - ZDPRES(JI,JKP+1)) ) + ZWORK2(JI) = ZWORK2(JI) * ZW1 + ZWORK2B(JI) = ZWORK2B(JI)* ZW1 + END IF + END DO +! + ! Apply uniform correction +! + DO JK = JKM, IKB+1, -1 + DO JI = 1, ICONV + IF ( ICTL(JI) > IKB+1 .AND. JK <= ICTL(JI) ) THEN + ! ZW1 = ABS(ZRVC(JI,JK)) + ABS(ZRCC(JI,JK)) + ABS(ZRIC(JI,JK)) + 1.E-12 + ! ZRVC(JI,JK) = ZRVC(JI,JK) - ABS(ZRVC(JI,JK))/ZW1*ZWORK2(JI) ! moisture + ZRVC(JI,JK) = ZRVC(JI,JK) - ZWORK2(JI) ! moisture + ! ZRCC(JI,JK) = ZRCC(JI,JK) - ABS(ZRCC(JI,JK))/ZW1*ZWORK2(JI) + ! ZRIC(JI,JK) = ZRIC(JI,JK) - ABS(ZRIC(JI,JK))/ZW1*ZWORK2(JI) + ZTHC(JI,JK) = ZTHC(JI,JK) - ZWORK2B(JI) / XCPD ! enthalpy + END IF + END DO + END DO +! + ! execute a "scatter"= pack command to store the tendencies in + ! the final 2D tables +! + DO JK = IKB, IKE + DO JI = 1, ICONV + JL = IJINDEX(JI) + PTTEN(JL,JK) = ZTHC(JI,JK) + PRVTEN(JL,JK) = ZRVC(JI,JK) + PRCTEN(JL,JK) = ZRCC(JI,JK) + PRITEN(JL,JK) = ZRIC(JI,JK) + END DO + END DO +! +! +! Cloud base and top levels +! ------------------------- +! + ILCL(:) = MIN( ILCL(:), ICTL(:) ) + DO JI = 1, ICONV + JL = IJINDEX(JI) + KCLTOP(JL) = ICTL(JI) + KCLBAS(JL) = ILCL(JI) + END DO +! +! +!* 8.7 Compute convective tendencies for Tracers +! ------------------------------------------ +! + IF ( OCH1CONV ) THEN +! + ALLOCATE( ZCH1(ICONV,IKS,KCH1) ) + ALLOCATE( ZCH1C(ICONV,IKS,KCH1) ) + ALLOCATE( ZWORK3(ICONV,KCH1) ) +! + DO JK = IKB, IKE + DO JI = 1, ICONV + JL = IJINDEX(JI) + ZCH1(JI,JK,:) = PCH1(JL,JK,:) + END DO + END DO +! + CALL CONVECT_CHEM_TRANSPORT( ICONV, KLEV, KCH1, ZCH1, ZCH1C, & + IDPL, IPBL, ILCL, ICTL, ILFS, ILFS, & + ZUMF, ZUER, ZUDR, ZDMF, ZDER, ZDDR, & + ZTIMEC, ZDXDY, ZDMF(:,1), ZLMASS, ZWSUB, & + IFTSTEPS ) +! +! +!* 8.8 Apply conservation correction +! ----------------------------- +! + ! Compute vertical integrals +! + JKM = MAXVAL( ICTL(:) ) + DO JN = 1, KCH1 + IF(JN < NSV_LGBEG .OR. JN>NSV_LGEND-1) THEN ! no correction for xy lagrangian variables + ZWORK3(:,JN) = 0. + ZWORK2(:) = 0. + DO JK = IKB+1, JKM + JKP = JK + 1 + DO JI = 1, ICONV + ZW1 = .5 * (ZPRES(JI,JK-1) - ZPRES(JI,JKP)) + ZWORK3(JI,JN) = ZWORK3(JI,JN) + (ZCH1C(JI,JK,JN)-ZCH1(JI,JK,JN)) * ZW1 + ZWORK2(JI) = ZWORK2(JI) + ABS(ZCH1C(JI,JK,JN)) * ZW1 + END DO + END DO +! + ! Apply concentration weighted correction +! + DO JK = JKM, IKB+1, -1 + DO JI = 1, ICONV + IF ( ICTL(JI) > IKB+1 .AND. JK <= ICTL(JI) ) THEN + ZCH1C(JI,JK,JN) = ZCH1C(JI,JK,JN) - & + ZWORK3(JI,JN)*ABS(ZCH1C(JI,JK,JN))/MAX(1.E-30,ZWORK2(JI)) + END IF + END DO + END DO + END IF +! + DO JK = IKB, IKE + DO JI = 1, ICONV + JL = IJINDEX(JI) + PCH1TEN(JL,JK,JN) = (ZCH1C(JI,JK,JN)-ZCH1(JI,JK,JN) ) / ZTIMEC(JI) + END DO + END DO + END DO + END IF +! +!------------------------------------------------------------------------------- +! +!* 9. Write up- and downdraft mass fluxes +! ------------------------------------ +! + DO JK = IKB, IKE + ZUMF(:,JK) = ZUMF(:,JK) / ZDXDY(:) ! Mass flux per unit area + END DO + ZWORK2(:) = 1. + DO JK = IKB, IKE + DO JI = 1, ICONV + JL = IJINDEX(JI) + IF ( KCLTOP(JL) <= IKB+1 ) ZWORK2(JL) = 0. + PUMF(JL,JK) = ZUMF(JI,JK) * ZWORK2(JL) + END DO + END DO +! +!------------------------------------------------------------------------------- +! +!* 10. Deallocate all local arrays +! --------------------------- +! +! downdraft variables +! + DEALLOCATE( ZDMF ) + DEALLOCATE( ZDER ) + DEALLOCATE( ZDDR ) + DEALLOCATE( ILFS ) + DEALLOCATE( ZLMASS ) +! +! closure variables +! + DEALLOCATE( ZTIMEC ) + DEALLOCATE( ZTHC ) + DEALLOCATE( ZRVC ) + DEALLOCATE( ZRCC ) + DEALLOCATE( ZRIC ) + DEALLOCATE( ZWSUB ) +! + IF ( OCH1CONV ) THEN + DEALLOCATE( ZCH1 ) + DEALLOCATE( ZCH1C ) + DEALLOCATE( ZWORK3 ) + END IF +! +! vertical index +! +DEALLOCATE( IDPL ) +DEALLOCATE( IPBL ) +DEALLOCATE( ILCL ) +DEALLOCATE( ICTL ) +DEALLOCATE( IETL ) +! +! grid scale variables +! +DEALLOCATE( ZZ ) +DEALLOCATE( ZPRES ) +DEALLOCATE( ZDPRES ) +DEALLOCATE( ZTT ) +DEALLOCATE( ZTH ) +DEALLOCATE( ZTHV ) +DEALLOCATE( ZTHL ) +DEALLOCATE( ZTHES ) +DEALLOCATE( ZRW ) +DEALLOCATE( ZRV ) +DEALLOCATE( ZRC ) +DEALLOCATE( ZRI ) +DEALLOCATE( ZDXDY ) +! +! updraft variables +! +DEALLOCATE( ZUMF ) +DEALLOCATE( ZUER ) +DEALLOCATE( ZUDR ) +DEALLOCATE( ZUTHL ) +DEALLOCATE( ZUTHV ) +DEALLOCATE( ZURW ) +DEALLOCATE( ZURC ) +DEALLOCATE( ZURI ) +DEALLOCATE( ZTHLCL ) +DEALLOCATE( ZTLCL ) +DEALLOCATE( ZRVLCL ) +DEALLOCATE( ZWLCL ) +DEALLOCATE( ZZLCL ) +DEALLOCATE( ZTHVELCL ) +DEALLOCATE( ZMFLCL ) +DEALLOCATE( ZCAPE ) +! +! work arrays +! +DEALLOCATE( IJINDEX ) +DEALLOCATE( GTRIG1 ) +! +! +END SUBROUTINE SHALLOW_CONVECTION diff --git a/src/mesonh/micro/c2r2_adjust.f90 b/src/mesonh/micro/c2r2_adjust.f90 new file mode 100644 index 000000000..b97914d1a --- /dev/null +++ b/src/mesonh/micro/c2r2_adjust.f90 @@ -0,0 +1,440 @@ +!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ####################### + MODULE MODI_C2R2_ADJUST +! ####################### +! +INTERFACE +! + SUBROUTINE C2R2_ADJUST(KRR, TPFILE, HRAD, & + HTURBDIM, OSUBG_COND, PTSTEP, & + PRHODJ, PSIGS, PPABST, & + PTHS, PRVS, PRCS, PCNUCS, & + PCCS, PSRCS, PCLDFR, PRRS ) +! +USE MODD_IO, ONLY: TFILEDATA +! +INTEGER, INTENT(IN) :: KRR ! Number of moist variables +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! Dimensionality of the turbulence scheme +CHARACTER(len=4), INTENT(IN) :: HRAD ! Radiation scheme name +LOGICAL, INTENT(IN) :: OSUBG_COND ! Switch for Subgrid condensation +REAL, INTENT(IN) :: PTSTEP ! Double Time step (single if cold start) +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSIGS ! Sigma_s at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! Absolute Pressure at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVS ! Water vapor m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCNUCS ! Nucl. aero. conc. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCCS ! Cloud water conc. source +! +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSRCS ! Second-order flux s'rc'/2Sigma_s2 at time t+1 times Lambda_3 +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PCLDFR ! Cloud fraction +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PRRS ! Rain water m.r. source +! +END SUBROUTINE C2R2_ADJUST +! +END INTERFACE +! +END MODULE MODI_C2R2_ADJUST +! ########################################################################## + SUBROUTINE C2R2_ADJUST(KRR, TPFILE, HRAD, & + HTURBDIM, OSUBG_COND, PTSTEP, & + PRHODJ, PSIGS, PPABST, & + PTHS, PRVS, PRCS, PCNUCS, & + PCCS, PSRCS, PCLDFR, PRRS ) +! ########################################################################## +! +!!**** *C2R2_ADJUST* - compute the fast microphysical sources for C2R2 or KHKO scheme +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the fast microphysical sources +!! through a saturation ajustement procedure. +!! +!! +!!** METHOD +!! ------ +!! Langlois, Tellus, 1973 for the cloudless version. +!! When cloud water is taken into account, refer to book 1 of the +!! documentation. +!! +!! +!! +!! EXTERNAL +!! -------- +!! None +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST +!! XP00 ! Reference pressure +!! XMD,XMV ! Molar mass of dry air and molar mass of vapor +!! XRD,XRV ! Gaz constant for dry air, gaz constant for vapor +!! XCPD,XCPV ! Cpd (dry air), Cpv (vapor) +!! XCL ! Cl (liquid) +!! XTT ! Triple point temperature +!! XLVTT ! Vaporization heat constant +!! XALPW,XBETAW,XGAMW ! Constants for saturation vapor +!! ! pressure function +!! Module MODD_CONF +!! CCONF +!! Module MODD_BUDGET: +!! NBUMOD +!! CBUTYPE +!! LBU_RTH +!! LBU_RRV +!! LBU_RRC +!! Module MODD_LES : NCTR_LES,LTURB_LES,NMODNBR_LES +!! XNA declaration (cloud fraction as global var) +!! +!! REFERENCE +!! --------- +!! +!! Book 1 and Book2 of documentation ( routine FAST_TERMS ) +!! Langlois, Tellus, 1973 +!! AUTHOR +!! ------ +!! E. Richard * Laboratoire d'Aerologie* +!! +!! +!! MODIFICATIONS +!! ------------- +!! Original 20/12/94 +!! Modifications: March 1, 1995 (J.M. Carriere) +!! Introduction of cloud water with order 1 +!! formulation +!! Modifications: June 8, 1995 ( J.Stein ) +!! Cleaning +!! Modifications: August 30, 1995 ( J.Stein ) +!! add Lambda3 for the subgrid condensation +!! +!! October 16, 1995 (J. Stein) change the budget calls +!! March 16, 1996 (J. Stein) store the cloud fraction +!! April 03, 1996 (J. Stein) displace the nebulosity +!! computation in the all and nothing case +!! April 15, 1996 (J. Stein) displace the lambda 3 +!! multiplication and change the nebulosity threshold +!! September 16, 1996 (J. Stein) bug in the SG cond for +!! the M computation +!! October 10, 1996 (J. Stein) reformulate the Subgrid +!! condensation scheme +!! October 8, 1996 (Cuxart,Sanchez) Cloud frac. LES diag (XNA) +!! December 6, 1996 (J.-P. Pinty) correction of Delta_2 +!! November 5, 1996 (J. Stein) remove Rnp<0 values +!! November 13 1996 (V. Masson) add prints in test above +!! March 11, 1997 (J.-M. Cohard) C2R2 option +!! March 2006 (O.Geoffroy) Add KHKO scheme +!! October 2009 (G. Tanguy) add ILENCH=LEN(YCOMMENT) after +!! change of YCOMMENT +! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 02/2020: use the new data structures and subroutines for budgets +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +use modd_budget, only: lbudget_th, lbudget_rv, lbudget_rc, lbudget_sv, & + NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, NBUDGET_SV1, & + tbudgets +USE MODD_CONF +USE MODD_CST +USE MODD_FIELD, only: tfielddata, TYPEREAL +USE MODD_IO, ONLY: TFILEDATA +USE MODD_LUNIT_n, ONLY: TLUOUT +USE MODD_NSV, ONLY: NSV_C2R2BEG +USE MODD_PARAMETERS +! +use mode_budget, only: Budget_store_init, Budget_store_end +USE MODE_IO_FIELD_WRITE, only: IO_Field_write +USE MODE_MSG +! +USE MODI_CONDENS +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +INTEGER, INTENT(IN) :: KRR ! Number of moist variables +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! Dimensionality of the turbulence scheme +CHARACTER(len=4), INTENT(IN) :: HRAD ! Radiation scheme name +LOGICAL, INTENT(IN) :: OSUBG_COND ! Switch for Subgrid condensation +REAL, INTENT(IN) :: PTSTEP ! Double Time step (single if cold start) +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSIGS ! Sigma_s at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! Absolute Pressure at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVS ! Water vapor m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCNUCS ! Nucl. aero. conc. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCCS ! Cloud water conc. source +! +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSRCS ! Second-order flux s'rc'/2Sigma_s2 at time t+1 times Lambda_3 +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PCLDFR ! Cloud fraction +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PRRS ! Rain water m.r. source +! +!* 0.2 Declarations of local variables : +! +! +REAL :: ZEPS ! Mv/Md +REAL, DIMENSION(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3)) & + :: ZEXNS,& ! guess of the Exner function at t+1 + ZT, & ! guess of the temperature at t+1 + ZCPH, & ! guess of the CPh for the mixing + ZLV, & ! guess of the Lv at t+1 + ZW1,ZW2,ZW3 ! Work arrays for intermediate + ! fields +! +INTEGER :: IRESP ! Return code of FM routines +INTEGER :: JITER,ITERMAX ! iterative loop for first order adjustment +INTEGER :: ILUOUT ! Logical unit of output listing +TYPE(TFIELDDATA) :: TZFIELD +!------------------------------------------------------------------------------- +! +!* 1. PRELIMINARIES +! ------------- +! +if ( lbudget_rv ) call Budget_store_init( tbudgets(NBUDGET_RV), 'COND', prvs(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'COND', prcs(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'COND', pths(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_sv ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_c2r2beg ), 'CEVA', pcnucs(:, :, :) * prhodj(:, :, :) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_c2r2beg + 1), 'CEVA', pccs (:, :, :) * prhodj(:, :, :) ) +end if + +ILUOUT = TLUOUT%NLU +ZEPS= XMV / XMD +! +IF (OSUBG_COND) THEN + ITERMAX=2 +ELSE + ITERMAX=1 +END IF +! +! +!------------------------------------------------------------------------------- +! +!* 2. COMPUTE QUANTITIES WITH THE GUESS OF THE FUTURE INSTANT +! ------------------------------------------------------- +! +!* 2.1 remove negative non-precipitating negative water +! ------------------------------------------------ +! +IF (ANY(PRCS(:,:,:) < 0. .OR. PCCS(:,:,:) < 0.)) THEN + WRITE(ILUOUT,*) 'C2R2_ADJUST beginning: negative values of PRCS or PCCS' + WRITE(ILUOUT,*) ' location of minimum of PRCS:', MINLOC(PRCS(:,:,:)) + WRITE(ILUOUT,*) ' value of minimum :', MINVAL(PRCS(:,:,:)) + WRITE(ILUOUT,*) ' location of minimum of PCCS:', MINLOC(PCCS(:,:,:)) + WRITE(ILUOUT,*) ' value of minimum :', MINVAL(PCCS(:,:,:)) +END IF +! +IF (ANY(PRCS(:,:,:)+PRVS(:,:,:) < 0.) .AND. NVERB>5) THEN + WRITE(ILUOUT,*) 'C2R2_ADJUST: negative values of total water (reset to zero)' + WRITE(ILUOUT,*) ' location of minimum:', MINLOC(PRCS(:,:,:)+PRVS(:,:,:)) + WRITE(ILUOUT,*) ' value of minimum :', MINVAL(PRCS(:,:,:)+PRVS(:,:,:)) +!callabortstop + CALL PRINT_MSG(NVERB_FATAL,'GEN','C2R2_ADJUST','') +END IF +! +WHERE ( PRCS(:,:,:)+PRVS(:,:,:) < 0.) + PRVS(:,:,:) = - PRCS(:,:,:) +END WHERE +! +!* 2.2 estimate the Exner function at t+1 +! +ZEXNS(:,:,:) = ( PPABST(:,:,:) / XP00 ) ** (XRD/XCPD) +! +! beginning of the iterative loop +! +DO JITER =1,ITERMAX +! +!* 2.3 compute the intermediate temperature at t+1, T* +! + ZT(:,:,:) = ( PTHS(:,:,:) * PTSTEP ) * ZEXNS(:,:,:) +! +!* 2.4 compute the latent heat of vaporization Lv(T*) at t+1 +! + ZLV(:,:,:) = XLVTT + ( XCPV - XCL ) * ( ZT(:,:,:) -XTT ) +! +!* 2.5 compute the specific heat for moist air (Cph) at t+1 +! + IF ( KRR == 3 ) THEN + ZCPH(:,:,:) = XCPD + XCPV *PTSTEP* PRVS(:,:,:) & + + XCL *PTSTEP* ( PRCS(:,:,:) + PRRS(:,:,:) ) + ELSE IF( KRR == 2 ) THEN + ZCPH(:,:,:) = XCPD + XCPV *PTSTEP* PRVS(:,:,:) & + + XCL *PTSTEP* PRCS(:,:,:) + END IF +! +!* 2.6 compute the saturation vapor pressure at t+1 +! + ZW1(:,:,:) = EXP( XALPW - XBETAW/ZT(:,:,:) - XGAMW*ALOG( ZT(:,:,:) ) ) +! +!* 2.7 compute the saturation mixing ratio at t+1 +! + ZW2(:,:,:) = ZW1(:,:,:) * ZEPS / & + ( PPABST(:,:,:) - ZW1(:,:,:) ) +! +!* 2.8 compute the saturation mixing ratio derivative (rvs') +! + ZW1(:,:,:) = ( XBETAW / ZT(:,:,:) - XGAMW ) / ZT(:,:,:) & + * ZW2(:,:,:) * ( 1. + ZW2(:,:,:) / ZEPS ) +! +!* 2.9 compute Cph + Lv * rvs' +! + ZW3(:,:,:) = ZCPH(:,:,:) + ZLV(:,:,:) * ZW1(:,:,:) +! +! +!------------------------------------------------------------------------------- +! +!* 3. FIRST ORDER SUBGRID CONDENSATION SCHEME +! --------------------------------------- +! + IF ( OSUBG_COND ) THEN +! +!* 3.1 compute Q1 +! + ZW2(:,:,:) = ( ( PRVS(:,:,:)*PTSTEP - ZW2(:,:,:) ) * ZCPH(:,:,:) / ZW3(:,:,:) & + + PRCS(:,:,:)*PTSTEP & + ) / ( 2. * PSIGS(:,:,:) ) + +! +!* 3.2 compute s'rc'/2Sigma_s2, Rc and the nebolisity +! + CALL CONDENS(HTURBDIM, ZW2,ZW1,ZW3,PSRCS) ! ZW1 = Cloud fraction + ! PSRC = s'rc'/(2 Sigma_s**2) + ! ZW3 = Rc / (2 Sigma_s) + ZW3(:,:,:) = 2. * PSIGS(:,:,:) * ZW3(:,:,:) ! Rc +! +! multiply PSRCS by the lambda3 coefficient +! + IF ( HTURBDIM == '1DIM'.AND.JITER==ITERMAX ) THEN + PSRCS(:,:,:) = PSRCS(:,:,:) * MIN( 3. , MAX(1.,1.-ZW2(:,:,:)) ) + END IF ! in the 3D case lamda_3 = 1. +! +!* 3.3 compute the variation of mixing ratio +! + ! Rc - Rc* + ZW3(:,:,:) = (ZW3(:,:,:)/PTSTEP) - PRCS(:,:,:) ! Pcon = ---------- + ! 2 Delta t + ELSE +! +! +!* 4. SECOND ORDER ALL OR NOTHING CONDENSATION SCHEME +! ----------------------------------------------- +! +!* 4.1 compute Delta 2 +! + ZW1(:,:,:) = (ZW1(:,:,:) * ZLV(:,:,:) / ZW3(:,:,:) ) * & + ( ((-2.*XBETAW+XGAMW*ZT(:,:,:)) / (XBETAW-XGAMW*ZT(:,:,:)) & + + (XBETAW/ZT(:,:,:)-XGAMW)*(1.0+2.0*ZW2(:,:,:)/ZEPS))/ZT(:,:,:) ) +! +!* 4.2 compute Delta 1 +! + ZW2(:,:,:) = ZLV(:,:,:) / ZW3(:,:,:) * ( ZW2(:,:,:) - PRVS(:,:,:)*PTSTEP ) +! +!* 4.3 compute the variation of mixing ratio +! + ZW3(:,:,:) = - ZW2(:,:,:) * ( 1 + 0.5 * ZW2(:,:,:) * ZW1(:,:,:) ) & + * ZCPH(:,:,:) / ZLV(:,:,:) / PTSTEP +! +! end of the IF structure on the all or nothing or statistical condensation +! scheme +! + END IF +! +! +!* 5. COMPUTE THE SOURCES AND STORES THE CLOUD FRACTION +! ------------------------------------------------- +! +! +!* 5.1 compute the sources +! + ZW3(:,:,:) = MAX ( ZW3(:,:,:), -PRCS(:,:,:) ) + WHERE (ZW3(:,:,:) > 0.0) + ZW3(:,:,:) = MIN ( ZW3(:,:,:), PRVS(:,:,:) ) + END WHERE + WHERE (PCCS(:,:,:) > 0.0) + PRCS(:,:,:) = PRCS(:,:,:) + ZW3(:,:,:) + PRVS(:,:,:) = PRVS(:,:,:) - ZW3(:,:,:) + PTHS(:,:,:) = PTHS(:,:,:) + ZW3(:,:,:) * ZLV(:,:,:) / ZCPH(:,:,:) & + / ZEXNS(:,:,:) + END WHERE +! +! WHERE (PRCS(:,:,:) <= 0.0) ! full evaporation of the cloud droplets +! PCNUCS(:,:,:) = 0.0 +! PCCS(:,:,:) = 0.0 +! END WHERE + WHERE (PRCS(:,:,:) <= 1.E-7/ PTSTEP ) ! full evaporation of the cloud droplets (PRCS >=0) + PRVS(:,:,:) = PRVS(:,:,:) + PRCS(:,:,:) + PTHS(:,:,:) = PTHS(:,:,:) - PRCS(:,:,:) * ZLV(:,:,:) / ZCPH(:,:,:) & + / ZEXNS(:,:,:) + PRCS(:,:,:) = 0.0 + PCNUCS(:,:,:) = 0.0 + PCCS(:,:,:) = 0.0 + END WHERE +! end of the iterative loop +! +END DO +! +!* 5.2 compute the cloud fraction PCLDFR +! +IF ( .NOT. OSUBG_COND ) THEN + WHERE (PRCS(:,:,:) > 1.E-12 / PTSTEP) + ZW1(:,:,:) = 1. + ELSEWHERE + ZW1(:,:,:) = 0. + ENDWHERE + IF ( SIZE(PSRCS,3) /= 0 ) THEN + PSRCS(:,:,:) = ZW1(:,:,:) + END IF +END IF +! +IF ( HRAD /= 'NONE' ) THEN + PCLDFR(:,:,:) = ZW1(:,:,:) +END IF +! +IF ( tpfile%lopened ) THEN + TZFIELD%CMNHNAME = 'NEB' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'NEB' + TZFIELD%CUNITS = '1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_NEB' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZW1) +END IF +! +! +! 6. Horizontal mean Cloud fraction (for LES uses) +! --------------------------------------------- +! +! +!* 7. STORE THE BUDGET TERMS +! ---------------------- +! +if ( lbudget_rv ) call Budget_store_end( tbudgets(NBUDGET_RV), 'COND', prvs(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'COND', prcs(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'COND', pths(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_sv ) then + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_c2r2beg ), 'CEVA', pcnucs(:, :, :) * prhodj(:, :, :) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_c2r2beg + 1), 'CEVA', pccs (:, :, :) * prhodj(:, :, :) ) +end if + +!------------------------------------------------------------------------------ +! +! +END SUBROUTINE C2R2_ADJUST diff --git a/src/mesonh/micro/cart_compress.f90 b/src/mesonh/micro/cart_compress.f90 new file mode 100644 index 000000000..d1e922e9b --- /dev/null +++ b/src/mesonh/micro/cart_compress.f90 @@ -0,0 +1,170 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! masdev4_7 BUG2 2007/06/29 16:52:14 +!----------------------------------------------------------------- +!######################### + MODULE MODI_CART_COMPRESS +!######################### +! +INTERFACE +! +FUNCTION CART_COMPRESS(PVARS) RESULT(PCOMPRESS) +! +USE MODD_BUDGET +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PVARS ! Source +REAL, DIMENSION(NBUIMAX,NBUJMAX,NBUKMAX) :: PCOMPRESS ! result +! +END FUNCTION CART_COMPRESS +! +END INTERFACE +! +END MODULE MODI_CART_COMPRESS +! ############################################### + FUNCTION CART_COMPRESS(PVARS) RESULT(PCOMPRESS) +! ############################################### +! +!!**** *CART_COMPRESS* - function to compress the Source in CART case. +!! +!! +!! PURPOSE +!! ------- +! This function compresses or not the Source XVARS of the VARiable +! VAR whose budget is analysed. This compression is controlled by 3 +! logical switches for the budget in I,J and K directions (LBU_ICP, +! LBU_JCP, LBU_KCP), in the budget box described by the lowest and +! highest values of the I,J and K indices. +! +!!** METHOD +!! ------ +!! The source PVARS is first transfered in a local array whose +!! dimensions correspond to the budget box. Then compressions +!! are or aren't achieved depending on the logical switches. +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_BUDGET +!! LBU_ICP : switch for compression in I direction +!! LBU_JCP : switch for compression in J direction +!! LBU_KCP : switch for compression in K direction +!! NBUIL : lowest I indice value of the budget box +!! NBUJL : lowest J indice value of the budget box +!! NBUKL : lowest K indice value of the budget box +!! NBUIH : highest I indice value of the budget box +!! NBUJH : highest J indice value of the budget box +!! NBUKH : highest K indice value of the budget box +!! NBUIMAX : dimension along I of the budget tabular +!! NBUJMAX : dimension along J of the budget tabular +!! NBUKMAX : dimension along K of the budget tabular +!! +!! +!! +!! REFERENCE +!! --------- +!! Book2 of MESO-NH documentation (function CART_COMPRESS) +!! +!! +!! AUTHOR +!! ------ +!! J. Nicolau * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 27/02/95 +!! JP Pinty & J Escobar 12/10/98 Enable vectorization and remove +!! SUM functions +!! V. Ducrocq 4/06/99 // +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_BUDGET +USE MODD_PARAMETERS , ONLY : JPVEXT +! +! +IMPLICIT NONE +! +! +!* 0.1 Declarations of arguments and result : +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PVARS ! Source +REAL, DIMENSION(NBUIMAX,NBUJMAX,NBUKMAX) :: PCOMPRESS ! result +! +!* 0.2 Declarations of local variables : +! +! +REAL, DIMENSION (NBUSIH-NBUSIL+1,NBUSJH-NBUSJL+1,NBUKH-NBUKL+1) :: ZVARS ! 3D Work + ! array +REAL, DIMENSION (NBUSIH-NBUSIL+1,NBUKH-NBUKL+1) :: ZWORKIK ! 2D Work array +REAL, DIMENSION (NBUSJH-NBUSJL+1,NBUKH-NBUKL+1) :: ZWORKJK ! 2D Work array +REAL, DIMENSION (NBUSIH-NBUSIL+1,NBUSJH-NBUSJL+1) :: ZWORKIJ ! 2D Work array +! +INTEGER :: JJ,JK ! loop indexes +! +! +!------------------------------------------------------------------------------- +! +!* 1. SOURCE TRANSFERT IN A LOCAL ARRAY +! --------------------------------- +!JUAN +IF (SIZE (PCOMPRESS) .EQ. 0 ) RETURN +!JUAN +! +ZVARS(1:NBUSIH-NBUSIL+1,1:NBUSJH-NBUSJL+1,1:NBUKH-NBUKL+1) = & + PVARS(NBUSIL:NBUSIH,NBUSJL:NBUSJH,NBUKL+JPVEXT:NBUKH+JPVEXT) +! +!------------------------------------------------------------------------------- +! +!* 2. COMPRESSIONS IN I,J AND K DIRECTIONS +! ------------------------------------ +! +! +IF (LBU_ICP.AND.LBU_JCP.AND.LBU_KCP) THEN + PCOMPRESS(1,1,1)=SUM(ZVARS) +! +ELSE IF (LBU_ICP.AND.LBU_JCP.AND..NOT.LBU_KCP) THEN + ZWORKJK(:,:) =SUM(ZVARS,1) + PCOMPRESS(1,1,:)=SUM(ZWORKJK,1) +! +ELSE IF (LBU_ICP.AND..NOT.LBU_JCP.AND.LBU_KCP) THEN + ZWORKIJ(:,:)=0.0 + DO JK = 1,NBUKH-NBUKL+1 + ZWORKIJ(:,:) = ZWORKIJ(:,:) + ZVARS(:,:,JK) + END DO + PCOMPRESS(1,:,1)=SUM(ZWORKIJ,1) +! +ELSE IF (.NOT.LBU_ICP.AND.LBU_JCP.AND.LBU_KCP) THEN + ZWORKIK(:,:)=0.0 + DO JJ = 1,NBUSJH-NBUSJL+1 + ZWORKIK(:,:) = ZWORKIK(:,:) + ZVARS(:,JJ,:) + END DO + PCOMPRESS(:,1,1)=SUM(ZWORKIK,2) +! +ELSE IF (LBU_ICP.AND..NOT.LBU_JCP.AND..NOT.LBU_KCP) THEN + PCOMPRESS(1,:,:)=SUM(ZVARS,1) +! +ELSE IF (.NOT.LBU_ICP.AND.LBU_JCP.AND..NOT.LBU_KCP) THEN + PCOMPRESS(:,1,:)=SUM(ZVARS,2) +! +ELSE IF (.NOT.LBU_ICP.AND..NOT.LBU_JCP.AND.LBU_KCP) THEN + PCOMPRESS(:,:,1)=SUM(ZVARS,3) +! +ELSE + PCOMPRESS=ZVARS +! +END IF +! +! +END FUNCTION CART_COMPRESS diff --git a/src/mesonh/micro/condensation.f90 b/src/mesonh/micro/condensation.f90 new file mode 100644 index 000000000..ec60d4067 --- /dev/null +++ b/src/mesonh/micro/condensation.f90 @@ -0,0 +1,513 @@ +!MNH_LIC Copyright 2002-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ######spl + MODULE MODI_CONDENSATION +! ######################## +! +INTERFACE +! + SUBROUTINE CONDENSATION( KIU, KJU, KKU, KIB, KIE, KJB, KJE, KKB, KKE, KKL,& + HFRAC_ICE, HCONDENS, HLAMBDA3, & + PPABS, PZZ, PRHODREF, PT, PRV, PRC, PRI, PRS, PRG, PSIGS, PMFCONV, PCLDFR, PSIGRC, OUSERI,& + OSIGMAS, PSIGQSAT, PLV, PLS, PCPH, PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF) +! +INTEGER, INTENT(IN) :: KIU ! horizontal dimension in x +INTEGER, INTENT(IN) :: KJU ! horizontal dimension in y +INTEGER, INTENT(IN) :: KKU ! vertical dimension +INTEGER, INTENT(IN) :: KIB ! value of the first point in x +INTEGER, INTENT(IN) :: KIE ! value of the last point in x +INTEGER, INTENT(IN) :: KJB ! value of the first point in y +INTEGER, INTENT(IN) :: KJE ! value of the last point in y +INTEGER, INTENT(IN) :: KKB ! value of the first point in z +INTEGER, INTENT(IN) :: KKE ! value of the last point in z +INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +CHARACTER(len=1), INTENT(IN) :: HFRAC_ICE +CHARACTER(len=4), INTENT(IN) :: HCONDENS +CHARACTER(len=*), INTENT(IN) :: HLAMBDA3 ! formulation for lambda3 coeff +REAL, DIMENSION(KIU,KJU,KKU), INTENT(IN) :: PPABS ! pressure (Pa) +REAL, DIMENSION(KIU,KJU,KKU), INTENT(IN) :: PZZ ! height of model levels (m) +REAL, DIMENSION(KIU,KJU,KKU), INTENT(IN) :: PRHODREF +REAL, DIMENSION(KIU,KJU,KKU), INTENT(INOUT) :: PT ! grid scale T (K) +REAL, DIMENSION(KIU,KJU,KKU), INTENT(INOUT) :: PRV ! grid scale water vapor mixing ratio (kg/kg) +REAL, DIMENSION(KIU,KJU,KKU), INTENT(INOUT) :: PRC ! grid scale r_c mixing ratio (kg/kg) +REAL, DIMENSION(KIU,KJU,KKU), INTENT(INOUT) :: PRI ! grid scale r_i (kg/kg) +REAL, DIMENSION(KIU,KJU,KKU), INTENT(IN) :: PRS ! grid scale mixing ration of snow (kg/kg) +REAL, DIMENSION(KIU,KJU,KKU), INTENT(IN) :: PRG ! grid scale mixing ration of graupel (kg/kg) +REAL, DIMENSION(KIU,KJU,KKU), INTENT(IN) :: PSIGS ! Sigma_s from turbulence scheme +REAL, DIMENSION(:,:,:), INTENT(IN) :: PMFCONV! convective mass flux (kg /s m^2) +REAL, DIMENSION(KIU,KJU,KKU), INTENT(OUT) :: PCLDFR ! cloud fraction +REAL, DIMENSION(KIU,KJU,KKU), INTENT(OUT) :: PSIGRC ! s r_c / sig_s^2 +LOGICAL, INTENT(IN) :: OUSERI ! logical switch to compute both + ! liquid and solid condensate (OUSERI=.TRUE.) + ! or only solid condensate (OUSERI=.FALSE.) +LOGICAL, INTENT(IN) :: OSIGMAS! use present global Sigma_s values + ! or that from turbulence scheme +REAL, INTENT(IN) :: PSIGQSAT ! use an extra "qsat" variance contribution (OSIGMAS case) +REAL, DIMENSION(KIU,KJU,KKU), OPTIONAL, INTENT(IN) :: PLV +REAL, DIMENSION(KIU,KJU,KKU), OPTIONAL, INTENT(IN) :: PLS +REAL, DIMENSION(KIU,KJU,KKU), OPTIONAL, INTENT(IN) :: PCPH +REAL, DIMENSION(KIU,KJU,KKU), OPTIONAL, INTENT(OUT) :: PHLC_HRC !cloud water content in precipitating part +REAL, DIMENSION(KIU,KJU,KKU), OPTIONAL, INTENT(OUT) :: PHLC_HCF !precipitating part +REAL, DIMENSION(KIU,KJU,KKU), OPTIONAL, INTENT(OUT) :: PHLI_HRI ! +REAL, DIMENSION(KIU,KJU,KKU), OPTIONAL, INTENT(OUT) :: PHLI_HCF ! + +END SUBROUTINE CONDENSATION +! +END INTERFACE +! +END MODULE MODI_CONDENSATION +! ######spl + SUBROUTINE CONDENSATION( KIU, KJU, KKU, KIB, KIE, KJB, KJE, KKB, KKE, KKL, & + HFRAC_ICE, HCONDENS, HLAMBDA3, & + PPABS, PZZ, PRHODREF, PT, PRV, PRC, PRI, PRS, PRG, PSIGS, PMFCONV, PCLDFR, PSIGRC, OUSERI,& + OSIGMAS, PSIGQSAT, PLV, PLS, PCPH, PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF ) +! ################################################################################ +! +!! +!! PURPOSE +!! ------- +!!** Routine to diagnose cloud fraction, liquid and ice condensate mixing ratios +!! and s'rl'/sigs^2 +!! +!! +!!** METHOD +!! ------ +!! Based on the large-scale fields of temperature, water vapor, and possibly +!! liquid and solid condensate, the conserved quantities r_t and h_l are constructed +!! and then fractional cloudiness, liquid and solid condensate is diagnosed. +!! +!! The total variance is parameterized as the sum of stratiform/turbulent variance +!! and a convective variance. +!! The turbulent variance is parameterized as a function of first-order moments, and +!! the convective variance is modelled as a function of the convective mass flux +!! (units kg/s m^2) as provided by the mass flux convection scheme. +!! +!! Nota: if the host model does not use prognostic values for liquid and solid condensate +!! or does not provide a convective mass flux, put all these values to zero. +!! +!! +!! EXTERNAL +!! -------- +!! INI_CST +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST : contains physical constants +!! +!! REFERENCE +!! --------- +!! Chaboureau J.P. and P. Bechtold (J. Atmos. Sci. 2002) +!! +!! AUTHOR +!! ------ +!! P. BECHTOLD * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original: 31.1.2002 +!! modified : 21.3.2002 +!! S.Malardel : 05.2006 : Correction sur le calcul de la fonction de +!! Bougeault F2 +!! W. de Rooy: 06-06-2010: Modification in the statistical cloud scheme +!! more specifically adding a variance term +!! following ideas of Lenderink & Siebesma 2002 +!! and adding a height dependence +!! S. Riette, 18 May 2010 : PSIGQSAT is added +!! S. Riette, 11 Oct 2011 : MIN function in PDF for continuity +!! modification of minimum value for Rc+Ri to create cloud and minimum value for sigma +!! Use of guess point as a starting point instead of liquid point +!! Better computation of ZCPH and dRsat/dT +!! Set ZCOND to zero if PCLDFR==0 +!! Safety limitation to .99*Pressure for saturation vapour pressure +!! 2012-02 Y. Seity, add possibility to run with reversed vertical levels +!! 2015 C.Lac Change min value of ZSIGMA to be in agreement with AROME +!! 2016 G.Delautier Restore min value of ZSIGMA (instability) +!! 2016 S.Riette Change INQ1 +!! 2016-11 S. Riette: use HFRAC_ICE, output adjusted state +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_PARAMETERS +USE MODD_RAIN_ICE_PARAM, ONLY : XCRIAUTC, XCRIAUTI, XACRIAUTI, XBCRIAUTI +! +use mode_msg +! +USE MODI_COMPUTE_FRAC_ICE +! +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +! +INTEGER, INTENT(IN) :: KIU ! horizontal dimension in x +INTEGER, INTENT(IN) :: KJU ! horizontal dimension in y +INTEGER, INTENT(IN) :: KKU ! vertical dimension +INTEGER, INTENT(IN) :: KIB ! value of the first point in x +INTEGER, INTENT(IN) :: KIE ! value of the last point in x +INTEGER, INTENT(IN) :: KJB ! value of the first point in y +INTEGER, INTENT(IN) :: KJE ! value of the last point in y +INTEGER, INTENT(IN) :: KKB ! value of the first point in z +INTEGER, INTENT(IN) :: KKE ! value of the last point in z +INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +CHARACTER(len=1), INTENT(IN) :: HFRAC_ICE +CHARACTER(len=4), INTENT(IN) :: HCONDENS +CHARACTER(len=*), INTENT(IN) :: HLAMBDA3 ! formulation for lambda3 coeff +REAL, DIMENSION(KIU,KJU,KKU), INTENT(IN) :: PPABS ! pressure (Pa) +REAL, DIMENSION(KIU,KJU,KKU), INTENT(IN) :: PZZ ! height of model levels (m) +REAL, DIMENSION(KIU,KJU,KKU), INTENT(IN) :: PRHODREF +REAL, DIMENSION(KIU,KJU,KKU), INTENT(INOUT) :: PT ! grid scale T (K) +REAL, DIMENSION(KIU,KJU,KKU), INTENT(INOUT) :: PRV ! grid scale water vapor mixing ratio (kg/kg) +REAL, DIMENSION(KIU,KJU,KKU), INTENT(INOUT) :: PRC ! grid scale r_c mixing ratio (kg/kg) +REAL, DIMENSION(KIU,KJU,KKU), INTENT(INOUT) :: PRI ! grid scale r_i (kg/kg) +REAL, DIMENSION(KIU,KJU,KKU), INTENT(IN) :: PRS ! grid scale mixing ration of snow (kg/kg) +REAL, DIMENSION(KIU,KJU,KKU), INTENT(IN) :: PRG ! grid scale mixing ration of graupel (kg/kg) +REAL, DIMENSION(KIU,KJU,KKU), INTENT(IN) :: PSIGS ! Sigma_s from turbulence scheme +REAL, DIMENSION(:,:,:), INTENT(IN) :: PMFCONV! convective mass flux (kg /s m^2) +REAL, DIMENSION(KIU,KJU,KKU), INTENT(OUT) :: PCLDFR ! cloud fraction +REAL, DIMENSION(KIU,KJU,KKU), INTENT(OUT) :: PSIGRC ! s r_c / sig_s^2 + +REAL, DIMENSION(KIU,KJU,KKU), OPTIONAL, INTENT(IN) :: PLV ! Latent heat L_v +REAL, DIMENSION(KIU,KJU,KKU), OPTIONAL, INTENT(IN) :: PLS ! Latent heat L_s +REAL, DIMENSION(KIU,KJU,KKU), OPTIONAL, INTENT(IN) :: PCPH ! Specific heat C_ph +REAL, DIMENSION(KIU,KJU,KKU), OPTIONAL, INTENT(OUT) :: PHLC_HRC +REAL, DIMENSION(KIU,KJU,KKU), OPTIONAL, INTENT(OUT) :: PHLC_HCF ! cloud fraction +REAL, DIMENSION(KIU,KJU,KKU), OPTIONAL, INTENT(OUT) :: PHLI_HRI +REAL, DIMENSION(KIU,KJU,KKU), OPTIONAL, INTENT(OUT) :: PHLI_HCF +LOGICAL, INTENT(IN) :: OUSERI ! logical switch to compute both + ! liquid and solid condensate (OUSERI=.TRUE.) + ! or only solid condensate (OUSERI=.FALSE.) +LOGICAL, INTENT(IN) :: OSIGMAS! use present global Sigma_s values + ! or that from turbulence scheme +REAL, INTENT(IN) :: PSIGQSAT ! use an extra "qsat" variance contribution (OSIGMAS case) + +! +! +!* 0.2 Declarations of local variables : +! +INTEGER :: JI, JJ, JK, JKP, JKM, IKTB, IKTE ! loop index +REAL, DIMENSION(KIU,KJU,KKU) :: ZTLK, ZRT ! work arrays for T_l and total water mixing ratio +REAL, DIMENSION(KIU,KJU,KKU) :: ZL ! length scale +REAL, DIMENSION(KIU,KJU,KKU) :: ZFRAC ! Ice fraction +REAL, DIMENSION(KIU,KJU,KKU) :: ZCRIAUTI ! +INTEGER, DIMENSION(KIU,KJU) :: ITPL ! top levels of troposphere +REAL, DIMENSION(KIU,KJU) :: ZTMIN ! minimum Temp. related to ITPL +! +REAL, DIMENSION(KIU,KJU,KKU) :: ZLV, ZLS, ZCPD +REAL, DIMENSION(KIU,KJU,KKU) :: ZCOND +REAL :: ZGCOND, ZSBAR, ZSBARC, ZQ1, ZAUTC, ZAUTI, ZGAUV, ZGAUC, ZGAUI, ZGAUTC, ZGAUTI ! Used for integration in Gaussian Probability Density Function +REAL :: ZTEMP, ZPV, ZQSL, ZPIV, ZQSI, ZLVS ! thermodynamics +REAL :: ZLL, DZZ, ZZZ ! used for length scales +REAL :: ZAH, ZA, ZB, ZSIGMA, ZDRW, ZDTL, ZSIG_CONV ! related to computation of Sig_s +REAL :: ZRCOLD, ZRIOLD +INTEGER :: INQ1 +REAL :: ZINC +! +!* 0.3 Definition of constants : +! +!------------------------------------------------------------------------------- +! +REAL,PARAMETER :: ZL0 = 600. ! tropospheric length scale +REAL,PARAMETER :: ZCSIGMA = 0.2 ! constant in sigma_s parameterization +REAL,PARAMETER :: ZCSIG_CONV = 0.30E-2 ! scaling factor for ZSIG_CONV as function of mass flux +! + +REAL, DIMENSION(-22:11),PARAMETER :: ZSRC_1D =(/ & + 0. , 0. , 2.0094444E-04, 0.316670E-03, & + 4.9965648E-04, 0.785956E-03 , 1.2341294E-03, 0.193327E-02, & + 3.0190963E-03, 0.470144E-02 , 7.2950651E-03, 0.112759E-01, & + 1.7350994E-02, 0.265640E-01 , 4.0427860E-02, 0.610997E-01, & + 9.1578111E-02, 0.135888E+00 , 0.1991484 , 0.230756E+00, & + 0.2850565 , 0.375050E+00 , 0.5000000 , 0.691489E+00, & + 0.8413813 , 0.933222E+00 , 0.9772662 , 0.993797E+00, & + 0.9986521 , 0.999768E+00 , 0.9999684 , 0.999997E+00, & + 1.0000000 , 1.000000 /) +! +!------------------------------------------------------------------------------- +! +! + +IKTB=1+JPVEXT +IKTE=KKU-JPVEXT + +PCLDFR(:,:,:) = 0. ! Initialize values +PSIGRC(:,:,:) = 0. ! Initialize values +! +! +!------------------------------------------------------------------------------- +! store total water mixing ratio +DO JK=IKTB,IKTE + DO JJ=KJB,KJE + DO JI=KIB,KIE + ZRT(JI,JJ,JK) = PRV(JI,JJ,JK) + PRC(JI,JJ,JK) + PRI(JI,JJ,JK) + END DO + END DO +END DO +!------------------------------------------------------------------------------- +! Preliminary calculations +! latent heat of vaporisation/sublimation +IF(PRESENT(PLV) .AND. PRESENT(PLS)) THEN + ZLV(:,:,:)=PLV(:,:,:) + ZLS(:,:,:)=PLS(:,:,:) +ELSE + DO JK=IKTB,IKTE + DO JJ=KJB,KJE + DO JI=KIB,KIE + ZTEMP = PT(JI,JJ,JK) + ! latent heat of vaporisation/sublimation + ZLV(JI,JJ,JK) = XLVTT + ( XCPV - XCL ) * ( ZTEMP - XTT ) + ZLS(JI,JJ,JK) = XLSTT + ( XCPV - XCI ) * ( ZTEMP - XTT ) + ENDDO + ENDDO + ENDDO +ENDIF +IF(PRESENT(PCPH)) THEN + ZCPD(:,:,:)=PCPH(:,:,:) +ELSE + DO JK=IKTB,IKTE + DO JJ=KJB,KJE + DO JI=KIB,KIE + ZCPD(JI,JJ,JK) = XCPD + XCPV*PRV(JI,JJ,JK) + XCL*PRC(JI,JJ,JK) + XCI*PRI(JI,JJ,JK) + & + XCI*(PRS(JI,JJ,JK) + PRG(JI,JJ,JK) ) + ENDDO + ENDDO + ENDDO +ENDIF +!------------------------------------------------------------------------------- +! Preliminary calculations needed for computing the "turbulent part" of Sigma_s +IF ( .NOT. OSIGMAS ) THEN + DO JK=IKTB,IKTE + DO JJ=KJB,KJE + DO JI=KIB,KIE + ZTEMP = PT(JI,JJ,JK) + ! store temperature at saturation + ZTLK(JI,JJ,JK) = ZTEMP - ZLV(JI,JJ,JK)*PRC(JI,JJ,JK)/ZCPD(JI,JJ,JK) & + - ZLS(JI,JJ,JK)*PRI(JI,JJ,JK)/ZCPD(JI,JJ,JK) + END DO + END DO + END DO + ! Determine tropopause/inversion height from minimum temperature + ITPL(:,:) = KIB+1 + ZTMIN(:,:) = 400. + DO JK = IKTB+1,IKTE-1 + DO JJ=KJB,KJE + DO JI=KIB,KIE + IF ( PT(JI,JJ,JK) < ZTMIN(JI,JJ) ) THEN + ZTMIN(JI,JJ) = PT(JI,JJ,JK) + ITPL(JI,JJ) = JK + ENDIF + END DO + END DO + END DO + ! Set the mixing length scale + ZL(:,:,KKB) = 20. + DO JK = KKB+KKL,KKE,KKL + DO JJ=KJB,KJE + DO JI=KIB,KIE + ! free troposphere + ZL(JI,JJ,JK) = ZL0 + ZZZ = PZZ(JI,JJ,JK) - PZZ(JI,JJ,KKB) + JKP = ITPL(JI,JJ) + ! approximate length for boundary-layer + IF ( ZL0 > ZZZ ) ZL(JI,JJ,JK) = ZZZ + ! gradual decrease of length-scale near and above tropopause + IF ( ZZZ > 0.9*(PZZ(JI,JJ,JKP)-PZZ(JI,JJ,KKB)) ) & + ZL(JI,JJ,JK) = .6 * ZL(JI,JJ,JK-KKL) + END DO + END DO + END DO +END IF +!------------------------------------------------------------------------------- +! +! +!Ice fraction +ZFRAC(:,:,:) = 0. +IF (OUSERI) THEN + WHERE(PRC(:,:,:)+PRI(:,:,:) > 1.E-20) + ZFRAC(:,:,:) = PRI(:,:,:) / (PRC(:,:,:)+PRI(:,:,:)) + ENDWHERE + CALL COMPUTE_FRAC_ICE(HFRAC_ICE, ZFRAC, PT) +ENDIF +! +DO JK=IKTB,IKTE + JKP=MAX(MIN(JK+KKL,IKTE),IKTB) + JKM=MAX(MIN(JK-KKL,IKTE),IKTB) + DO JJ=KJB,KJE + DO JI=KIB,KIE + ! latent heats + ZTEMP = PT(JI,JJ,JK) + ! saturated water vapor mixing ratio over liquid water + ZPV = MIN(EXP( XALPW - XBETAW / ZTEMP - XGAMW * LOG( ZTEMP ) ), .99*PPABS(JI,JJ,JK)) + ZQSL = XRD / XRV * ZPV / ( PPABS(JI,JJ,JK) - ZPV ) + + ! saturated water vapor mixing ratio over ice + ZPIV = MIN(EXP( XALPI - XBETAI / ZTEMP - XGAMI * LOG( ZTEMP ) ), .99*PPABS(JI,JJ,JK)) + ZQSI = XRD / XRV * ZPIV / ( PPABS(JI,JJ,JK) - ZPIV ) + + ! interpolate between liquid and solid as function of temperature + ZQSL = (1. - ZFRAC(JI,JJ,JK)) * ZQSL + ZFRAC(JI,JJ,JK) * ZQSI + ZLVS = (1. - ZFRAC(JI,JJ,JK)) * ZLV(JI,JJ,JK) + & + & ZFRAC(JI,JJ,JK) * ZLS(JI,JJ,JK) + + ! coefficients a and b + ZAH = ZLVS * ZQSL / ( XRV * ZTEMP**2 ) * (XRV * ZQSL / XRD + 1.) + ZA = 1. / ( 1. + ZLVS/ZCPD(JI,JJ,JK) * ZAH ) + ZB = ZAH * ZA + + ZSBAR = ZA * ( ZRT(JI,JJ,JK) - ZQSL + & + & ZAH * ZLVS * (PRC(JI,JJ,JK)+PRI(JI,JJ,JK)) / ZCPD(JI,JJ,JK)) + + ! switch to take either present computed value of SIGMAS + ! or that of Meso-NH turbulence scheme + IF ( OSIGMAS ) THEN + IF (PSIGQSAT/=0.) THEN + ZSIGMA = SQRT((2*PSIGS(JI,JJ,JK))**2 + (PSIGQSAT*ZQSL*ZA)**2) + ELSE + ZSIGMA = 2*PSIGS(JI,JJ,JK) + END IF + ELSE + ! parameterize Sigma_s with first_order closure + DZZ = PZZ(JI,JJ,JKP) - PZZ(JI,JJ,JKM) + ZDRW = ZRT(JI,JJ,JKP) - ZRT(JI,JJ,JKM) + ZDTL = ZTLK(JI,JJ,JKP) - ZTLK(JI,JJ,JKM) + XG/ZCPD(JI,JJ,JK) * DZZ + ZLL = ZL(JI,JJ,JK) + ! standard deviation due to convection + ZSIG_CONV =0. + IF( SIZE(PMFCONV) /= 0) & + ZSIG_CONV = ZCSIG_CONV * PMFCONV(JI,JJ,JK) / ZA + ! zsigma should be of order 4.e-4 in lowest 5 km of atmosphere + ZSIGMA = SQRT( MAX( 1.E-25, ZCSIGMA * ZCSIGMA * ZLL*ZLL/(DZZ*DZZ)*(& + ZA*ZA*ZDRW*ZDRW - 2.*ZA*ZB*ZDRW*ZDTL + ZB*ZB*ZDTL*ZDTL) + & + ZSIG_CONV * ZSIG_CONV ) ) + END IF + ZSIGMA= MAX( 1.E-10, ZSIGMA ) +! ZSIGMA= MAX( 1.E-12, ZSIGMA ) + + ! normalized saturation deficit + ZQ1 = ZSBAR/ZSIGMA + + IF(HCONDENS == 'GAUS')THEN + ! Gaussian Probability Density Function around ZQ1 + ! Computation of ZG and ZGAM(=erf(ZG)) + ZGCOND = -ZQ1/SQRT(2.) + + !Approximation of erf function for Gaussian distribution + ZGAUV = 1 - SIGN(1., ZGCOND) * SQRT(1-EXP(-4*ZGCOND**2/XPI)) + + !Computation Cloud Fraction + PCLDFR(JI,JJ,JK) = MAX( 0., MIN(1.,0.5*ZGAUV)) + + !Computation of condensate + ZCOND(JI,JJ,JK) = (EXP(-ZGCOND**2)-ZGCOND*SQRT(XPI)*ZGAUV)*ZSIGMA/SQRT(2.*XPI) + ZCOND(JI,JJ,JK) = MAX(ZCOND(JI,JJ,JK), 0.) + + PSIGRC(JI,JJ,JK) = PCLDFR(JI,JJ,JK) + + !Computation warm/cold Cloud Fraction and content in high water content part + IF(PRESENT(PHLC_HCF) .AND. PRESENT(PHLC_HRC))THEN + IF(1-ZFRAC(JI,JJ,JK) > 1.E-20)THEN + ZAUTC = (ZSBAR - XCRIAUTC/(PRHODREF(JI,JJ,JK)*(1-ZFRAC(JI,JJ,JK))))/ZSIGMA + ZGAUTC = -ZAUTC/SQRT(2.) + !Approximation of erf function for Gaussian distribution + ZGAUC = 1 - SIGN(1., ZGAUTC) * SQRT(1-EXP(-4*ZGAUTC**2/XPI)) + PHLC_HCF(JI,JJ,JK) = MAX( 0., MIN(1.,0.5*ZGAUC)) + PHLC_HRC(JI,JJ,JK) = (1-ZFRAC(JI,JJ,JK))*(EXP(-ZGAUTC**2)-ZGAUTC*SQRT(XPI)*ZGAUC)*ZSIGMA/SQRT(2.*XPI) + PHLC_HRC(JI,JJ,JK) = PHLC_HRC(JI,JJ,JK) + XCRIAUTC/PRHODREF(JI,JJ,JK) * PHLC_HCF(JI,JJ,JK) + PHLC_HRC(JI,JJ,JK) = MAX(PHLC_HRC(JI,JJ,JK), 0.) + ELSE + PHLC_HCF(JI,JJ,JK)=0. + PHLC_HRC(JI,JJ,JK)=0. + ENDIF + ENDIF + + IF(PRESENT(PHLI_HCF) .AND. PRESENT(PHLI_HRI))THEN + IF(ZFRAC(JI,JJ,JK) > 1.E-20)THEN + ZCRIAUTI(JI,JJ,JK)=MIN(XCRIAUTI,10**(XACRIAUTI*(PT(JI,JJ,JK)-XTT)+XBCRIAUTI)) + ZAUTI = (ZSBAR - ZCRIAUTI(JI,JJ,JK)/ZFRAC(JI,JJ,JK))/ZSIGMA + ZGAUTI = -ZAUTI/SQRT(2.) + !Approximation of erf function for Gaussian distribution + ZGAUI = 1 - SIGN(1., ZGAUTI) * SQRT(1-EXP(-4*ZGAUTI**2/XPI)) + PHLI_HCF(JI,JJ,JK) = MAX( 0., MIN(1.,0.5*ZGAUI)) + PHLI_HRI(JI,JJ,JK) = ZFRAC(JI,JJ,JK)*(EXP(-ZGAUTI**2)-ZGAUTI*SQRT(XPI)*ZGAUI)*ZSIGMA/SQRT(2.*XPI) + PHLI_HRI(JI,JJ,JK) = PHLI_HRI(JI,JJ,JK) + ZCRIAUTI(JI,JJ,JK)*PHLI_HCF(JI,JJ,JK) + PHLI_HRI(JI,JJ,JK) = MAX(PHLI_HRI(JI,JJ,JK), 0.) + ELSE + PHLI_HCF(JI,JJ,JK)=0. + PHLI_HRI(JI,JJ,JK)=0. + ENDIF + ENDIF + + ELSEIF(HCONDENS == 'CB02')THEN + !Cloud fraction + PCLDFR(JI,JJ,JK) = MAX( 0., MIN(1.,0.5+0.36*ATAN(1.55*ZQ1)) ) + + !Total condensate + IF (ZQ1 > 0. .AND. ZQ1 <= 2) THEN + ZCOND(JI,JJ,JK) = MIN(EXP(-1.)+.66*ZQ1+.086*ZQ1**2, 2.) ! We use the MIN function for continuity + ELSE IF (ZQ1 > 2.) THEN + ZCOND(JI,JJ,JK) = ZQ1 + ELSE + ZCOND(JI,JJ,JK) = EXP( 1.2*ZQ1-1. ) + ENDIF + ZCOND(JI,JJ,JK) = ZCOND(JI,JJ,JK) * ZSIGMA + + INQ1 = MIN( MAX(-22,FLOOR(MIN(100., MAX(-100., 2*ZQ1))) ), 10) !inner min/max prevents sigfpe when 2*zq1 does not fit into an int + ZINC = 2.*ZQ1 - INQ1 + + PSIGRC(JI,JJ,JK) = MIN(1.,(1.-ZINC)*ZSRC_1D(INQ1)+ZINC*ZSRC_1D(INQ1+1)) + + IF(PRESENT(PHLC_HCF) .AND. PRESENT(PHLC_HRC))THEN + PHLC_HCF(JI,JJ,JK)=0. + PHLC_HRC(JI,JJ,JK)=0. + ENDIF + IF(PRESENT(PHLI_HCF) .AND. PRESENT(PHLI_HRI))THEN + PHLI_HCF(JI,JJ,JK)=0. + PHLI_HRI(JI,JJ,JK)=0. + ENDIF + ENDIF + + IF ( ZCOND(JI,JJ,JK) < 1.E-12 ) THEN + ZCOND(JI,JJ,JK) = 0. + PCLDFR(JI,JJ,JK) = 0. + ENDIF + IF (PCLDFR(JI,JJ,JK)==0.) THEN + ZCOND(JI,JJ,JK)=0. + ENDIF + + ZRCOLD=PRC(JI,JJ,JK) + ZRIOLD=PRI(JI,JJ,JK) + + PRC(JI,JJ,JK) = (1.-ZFRAC(JI,JJ,JK)) * ZCOND(JI,JJ,JK) ! liquid condensate + PRI(JI,JJ,JK) = ZFRAC(JI,JJ,JK) * ZCOND(JI,JJ,JK) ! solid condensate + + PT(JI,JJ,JK) = PT(JI,JJ,JK) + ((PRC(JI,JJ,JK)-ZRCOLD)*ZLV(JI,JJ,JK) + & + &(PRI(JI,JJ,JK)-ZRIOLD)*ZLS(JI,JJ,JK) ) & + & /ZCPD(JI,JJ,JK) + PRV(JI,JJ,JK) = ZRT(JI,JJ,JK) - PRC(JI,JJ,JK) - PRI(JI,JJ,JK) + +! s r_c/ sig_s^2 +! PSIGRC(JI,JJ,JK) = PCLDFR(JI,JJ,JK) ! use simple Gaussian relation +! +! multiply PSRCS by the lambda3 coefficient +! +! PSIGRC(JI,JJ,JK) = 2.*PCLDFR(JI,JJ,JK) * MIN( 3. , MAX(1.,1.-ZQ1) ) +! in the 3D case lambda_3 = 1. + + IF(HLAMBDA3=='CB')THEN + PSIGRC(JI,JJ,JK) = PSIGRC(JI,JJ,JK)* MIN( 3. , MAX(1.,1.-ZQ1) ) + ELSEIF(HLAMBDA3=='NONE') THEN + ELSE + call Print_msg( NVERB_FATAL, 'GEN', 'CONDENSATION', 'invalid value for HLAMBDA3: ' // TRIM( HLAMBDA3 ) ) + ENDIF + + END DO + END DO +END DO +! +END SUBROUTINE CONDENSATION diff --git a/src/mesonh/micro/gamma.f90 b/src/mesonh/micro/gamma.f90 new file mode 100644 index 000000000..cd7e04fbd --- /dev/null +++ b/src/mesonh/micro/gamma.f90 @@ -0,0 +1,224 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!######################## + MODULE MODI_GAMMA +!######################## +! +INTERFACE GAMMA +! +FUNCTION GAMMA_X0D(PX) RESULT(PGAMMA) +REAL, INTENT(IN) :: PX +REAL :: PGAMMA +END FUNCTION GAMMA_X0D +! +FUNCTION GAMMA_X1D(PX) RESULT(PGAMMA) +REAL, DIMENSION(:), INTENT(IN) :: PX +REAL, DIMENSION(SIZE(PX)) :: PGAMMA +END FUNCTION GAMMA_X1D +! +END INTERFACE +END MODULE MODI_GAMMA +! +!-------------------------------------------------------------------------- +! +! +!* 1. FUNCTION GAMMA FOR SCALAR VARIABLE +! +! +! ###################################### + FUNCTION GAMMA_X0D(PX) RESULT(PGAMMA) +! ###################################### +! +! +!!**** *GAMMA * - Gamma function +!! +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute the Generalized gamma +! function of its argument. +! +! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! Press, Teukolsky, Vetterling and Flannery: Numerical Recipes, 206-207 +!! +!! AUTHOR +!! ------ +!! Jean-Pierre Pinty *LA/OMP* +!! +!! MODIFICATIONS +!! ------------- +!! Original 7/11/95 +!! C. Barthe 9/11/09 add a function for 1D arguments +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +!* 0.1 declarations of arguments and result +! +REAL, INTENT(IN) :: PX +REAL :: PGAMMA +! +!* 0.2 declarations of local variables +! +INTEGER :: JJ ! Loop index +REAL :: ZSER,ZSTP,ZTMP,ZX,ZY,ZCOEF(6) +REAL :: ZPI +! +!------------------------------------------------------------------------------- +! +!* 1. SOME CONSTANTS +! -------------- +! +ZCOEF(1) = 76.18009172947146 +ZCOEF(2) =-86.50532032941677 +ZCOEF(3) = 24.01409824083091 +ZCOEF(4) = -1.231739572450155 +ZCOEF(5) = 0.1208650973866179E-2 +ZCOEF(6) = -0.5395239384953E-5 +ZSTP = 2.5066282746310005 +! +ZPI = 3.141592654 +! +!------------------------------------------------------------------------------- +! +!* 2. COMPUTE GAMMA +! ------------- +! +IF (PX .LT. 0.) THEN + ZX = 1. - PX +ELSE + ZX = PX +END IF +ZY = ZX +ZTMP = ZX + 5.5 +ZTMP = (ZX + 0.5) * ALOG(ZTMP) - ZTMP +ZSER = 1.000000000190015 +! +DO JJ = 1, 6 + ZY = ZY + 1.0 + ZSER = ZSER + ZCOEF(JJ) / ZY +END DO +! +IF (PX .LT. 0.) THEN + PGAMMA = ZPI / SIN(ZPI*PX) / EXP(ZTMP + ALOG(ZSTP*ZSER/ZX)) +ELSE + PGAMMA = EXP(ZTMP + ALOG(ZSTP*ZSER/ZX)) +END IF +RETURN +! +END FUNCTION GAMMA_X0D +! +!------------------------------------------------------------------------------- +! +! +!* 1. FUNCTION GAMMA FOR 1D ARRAY +! +! +! ###################################### + FUNCTION GAMMA_X1D(PX) RESULT(PGAMMA) +! ###################################### +! +! +!!**** *GAMMA * - Gamma function +!! +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute the Generalized gamma +! function of its argument. +! +! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! Press, Teukolsky, Vetterling and Flannery: Numerical Recipes, 206-207 +!! +!! AUTHOR +!! ------ +!! Jean-Pierre Pinty *LA/OMP* +!! +!! MODIFICATIONS +!! ------------- +!! Original 7/11/95 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +!* 0.1 declarations of arguments and result +! +REAL, DIMENSION(:), INTENT(IN) :: PX +REAL, DIMENSION(SIZE(PX)) :: PGAMMA +! +!* 0.2 declarations of local variables +! +INTEGER :: JJ ! Loop index +REAL, DIMENSION(SIZE(PX)) :: ZSER,ZSTP,ZTMP,ZX,ZY +REAL :: ZCOEF(6) +REAL :: ZPI +! +!------------------------------------------------------------------------------- +! +!* 1. SOME CONSTANTS +! -------------- +! +ZCOEF(1) = 76.18009172947146 +ZCOEF(2) =-86.50532032941677 +ZCOEF(3) = 24.01409824083091 +ZCOEF(4) = -1.231739572450155 +ZCOEF(5) = 0.1208650973866179E-2 +ZCOEF(6) = -0.5395239384953E-5 +ZSTP = 2.5066282746310005 +! +ZPI = 3.141592654 +ZX(:) = PX(:) +WHERE ( PX(:)<0.0 ) + ZX(:) = 1.- PX(:) +END WHERE +ZY(:) = ZX(:) +ZTMP(:) = ZX(:) + 5.5 +ZTMP(:) = (ZX(:) + 0.5)*ALOG(ZTMP(:)) - ZTMP(:) +ZSER(:) = 1.000000000190015 +! +DO JJ = 1 , 6 + ZY(:) = ZY(:) + 1.0 + ZSER(:) = ZSER(:) + ZCOEF(JJ)/ZY(:) +END DO +! +PGAMMA(:) = EXP( ZTMP(:) + ALOG( ZSTP*ZSER(:)/ZX(:) ) ) +WHERE ( PX(:)<0.0 ) + PGAMMA(:) = ZPI/SIN(ZPI*PX(:))/PGAMMA(:) +END WHERE +RETURN +! +END FUNCTION GAMMA_X1D diff --git a/src/mesonh/micro/gamma_inc.f90 b/src/mesonh/micro/gamma_inc.f90 new file mode 100644 index 000000000..93e6247d0 --- /dev/null +++ b/src/mesonh/micro/gamma_inc.f90 @@ -0,0 +1,148 @@ +!MNH_LIC Copyright 1995-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!#################### +MODULE MODI_GAMMA_INC +!#################### +! +INTERFACE +! +FUNCTION GAMMA_INC(PA,PX) RESULT(PGAMMA_INC) +REAL, INTENT(IN) :: PA +REAL, INTENT(IN) :: PX +REAL :: PGAMMA_INC +END FUNCTION GAMMA_INC +! +END INTERFACE +! +END MODULE MODI_GAMMA_INC +! ############################################# + FUNCTION GAMMA_INC(PA,PX) RESULT(PGAMMA_INC) +! ############################################# +! +! +!!**** *GAMMA_INC * - Generalized gamma function +!! +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute the generalized +!! incomplete Gamma function of its argument. +!! +!! /X +!! 1 | +!! GAMMA_INC(A,X)= -------- | Z**(A-1) EXP(-Z) dZ +!! GAMMA(A) | +!! /0 +!! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! MODULE MODI_GAMMA : computation of the Gamma function +!! +!! REFERENCE +!! --------- +!! Press, Teukolsky, Vetterling and Flannery: Numerical Recipes, 209-213 +!! +!! +!! AUTHOR +!! ------ +!! Jean-Pierre Pinty *LA/OMP* +!! +!! MODIFICATIONS +!! ------------- +!! Original 7/12/95 +! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg +! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! +!* 0. DECLARATIONS +! ------------ +! +use mode_msg +! +USE MODI_GAMMA +! +IMPLICIT NONE +! +!* 0.1 declarations of arguments and result +! +REAL, INTENT(IN) :: PA +REAL, INTENT(IN) :: PX +REAL :: PGAMMA_INC +! +!* 0.2 declarations of local variables +! +INTEGER :: JN +INTEGER :: ITMAX=100 +REAL :: ZEPS=3.E-7 +REAL :: ZFPMIN=1.E-30 +REAL :: ZAP,ZDEL,ZSUM +REAL :: ZAN,ZB,ZC,ZD,ZH +! +IF( PX<0.0 .OR. PA<=0.0 ) call Print_msg(NVERB_FATAL,'GEN','GAMMA_INC','invalid arguments: PX<0.0 .OR. PA<=0.0') +! +IF( (PX.LT.PA+1.0) ) THEN + ZAP = PA + ZSUM = 1.0/PA + ZDEL = ZSUM + JN = 1 +! + LOOP_SERIES: DO + ZAP = ZAP +1.0 + ZDEL = ZDEL*PX/ZAP + ZSUM = ZSUM + ZDEL + IF( ABS(ZDEL).LT.ABS(ZSUM)*ZEPS ) EXIT LOOP_SERIES + JN = JN + 1 + IF( JN.GT.ITMAX ) THEN + call Print_msg(NVERB_FATAL,'GEN','GAMMA_INC','PA argument is too large or ITMAX is too small,'// & + ' the incomplete GAMMA_INC function cannot be evaluated correctly'// & + ' by the series method') + END IF + END DO LOOP_SERIES + PGAMMA_INC = ZSUM * EXP( -PX+PA*ALOG(PX)-ALOG(GAMMA(PA)) ) +! + ELSE +! + ZB = PX + 1.0 - PA + ZC = 1.0/TINY(PX) + ZD = 1.0/ZB + ZH = ZD + JN = 1 +! + LOOP_FRACTION: DO + ZAN = -REAL(JN)*(REAL(JN)-PA) + ZB = ZB + 2.0 + ZD = ZAN*ZD + ZB + IF( ABS(ZD).LT.TINY(PX) ) THEN + ZD = ZFPMIN + END IF + ZC = ZB + ZAN/ZC + IF( ABS(ZC).LT.TINY(PX) ) THEN + ZC = ZFPMIN + END IF + ZD = 1.0/ZD + ZDEL = ZD*ZC + ZH = ZH*ZDEL + IF( ABS(ZDEL-1.0).LT.ZEPS ) EXIT LOOP_FRACTION + JN = JN + 1 + IF( JN.GT.ITMAX ) THEN + call Print_msg(NVERB_FATAL,'GEN','GAMMA_INC','PA argument is too large or ITMAX is too small,'// & + ' the incomplete GAMMA_INC function cannot be evaluated correctly'// & + ' by the continuous fraction method') + END IF + END DO LOOP_FRACTION + PGAMMA_INC = 1.0 - ZH*EXP( -PX+PA*ALOG(PX)-ALOG(GAMMA(PA)) ) +! +END IF +! +RETURN +! +END FUNCTION GAMMA_INC diff --git a/src/mesonh/micro/general_gamma.f90 b/src/mesonh/micro/general_gamma.f90 new file mode 100644 index 000000000..9aa715a3c --- /dev/null +++ b/src/mesonh/micro/general_gamma.f90 @@ -0,0 +1,91 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 operators 2006/05/18 13:07:25 +!----------------------------------------------------------------- +!######################## +MODULE MODI_GENERAL_GAMMA +!######################## +! +INTERFACE +! +FUNCTION GENERAL_GAMMA(PALPHA,PNU,PLBDA,PX) RESULT(PGENERAL_GAMMA) +REAL, INTENT(IN) :: PALPHA +REAL, INTENT(IN) :: PNU +REAL, INTENT(IN) :: PLBDA +REAL, INTENT(IN) :: PX +REAL :: PGENERAL_GAMMA +END FUNCTION GENERAL_GAMMA +! +END INTERFACE +! +END MODULE MODI_GENERAL_GAMMA +! ################################################################### + FUNCTION GENERAL_GAMMA(PALPHA,PNU,PLBDA,PX) RESULT(PGENERAL_GAMMA) +! ################################################################### +! +! +!!**** *GENERAL_GAMMA * - Generalized gamma function +!! +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute the Generalized gamma +! function of its argument. +! +! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! MODULE MODI_GAMMA : computation of the Gamma function +!! +!! REFERENCE +!! --------- +!! Book2 of documentation (routine CONDENS) +!! +!! +!! AUTHOR +!! ------ +!! Jean-Pierre Pinty *LA/OMP* +!! +!! MODIFICATIONS +!! ------------- +!! Original 7/11/95 +! +!* 0. DECLARATIONS +! ------------ +! +USE MODI_GAMMA +! +IMPLICIT NONE +! +!* 0.1 declarations of arguments and result +! +REAL, INTENT(IN) :: PALPHA +REAL, INTENT(IN) :: PNU +REAL, INTENT(IN) :: PLBDA +REAL, INTENT(IN) :: PX +REAL :: PGENERAL_GAMMA +! +!* 0.2 declarations of local variables +! +REAL :: ZARG,ZPOWER +! +ZARG = PLBDA*PX +ZPOWER = PALPHA*PNU - 1.0 +! +PGENERAL_GAMMA = (PALPHA/GAMMA(PNU))*(ZARG**ZPOWER)*PLBDA*EXP(-(ZARG**PALPHA)) +RETURN +! +END FUNCTION GENERAL_GAMMA diff --git a/src/mesonh/micro/hypgeo.f90 b/src/mesonh/micro/hypgeo.f90 new file mode 100644 index 000000000..0d3697f71 --- /dev/null +++ b/src/mesonh/micro/hypgeo.f90 @@ -0,0 +1,119 @@ +!MNH_LIC Copyright 1996-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!#################### +MODULE MODI_HYPGEO +!#################### +! +INTERFACE +! +FUNCTION HYPGEO(PA,PB,PC,PF,PX) RESULT(PHYPGEO) +REAL, INTENT(IN) :: PA,PB,PC,PF +REAL, INTENT(IN) :: PX +REAL :: PHYPGEO +END FUNCTION HYPGEO +! +END INTERFACE +! +END MODULE MODI_HYPGEO +! ############################################# + FUNCTION HYPGEO(PA,PB,PC,PF,PX) RESULT(PHYPGEO) +! ############################################# +! +! +!!**** *HYPGEO* - hypergeometric function +!! +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute the hypergeometric +!! function of its argument. +!! +!! +!! A*B (A+1)A*(B+1)B X^2 +!! HYPGEO(A,B,C,X)= 1 + ----- * X + ------------- * --- + ... + +!! C (C+1)C 2 +!! +!! (A+n)...A*(B+n)...B X^n +!! --------------------- * ----- + ... ... +!! (C+n)...C n! +!! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! HYPSER +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! Press, Teukolsky, Vetterling and Flannery: Numerical Recipes, 272 +!! +!! +!! AUTHOR +!! ------ +!! Jean-Martial Cohard *LA/OMP* +!! +!! MODIFICATIONS +!! ------------- +!! Original 31/12/96 +! +!------------------------------------------------------------------------------ +! +!* 0. DECLARATIONS +! +! +USE MODI_GAMMA +USE MODI_HYPSER +! +IMPLICIT NONE +! +!* 0.1 declarations of arguments and result +! +REAL, INTENT(IN) :: PA,PB,PC,PF +REAL, INTENT(IN) :: PX +REAL :: PHYPGEO +! +!* 0.2 declarations of local variables +! +! +INTEGER :: JN +INTEGER :: ITMAX=100 +REAL :: ZEPS,ZTEMP +REAL :: ZFPMIN=1.E-30 +REAL :: ZXH +REAL :: ZX0,ZX1,ZZA,ZZB,ZZC,ZZD,Y(2) +! +!------------------------------------------------------------------------------ +! +! +ZEPS = 4.E-2 +ZXH = PF * PX**2.0 +IF (ZXH.LT.(1-ZEPS)) THEN + CALL HYPSER(PA,PB,PC,-ZXH,PHYPGEO) +ELSE IF (ZXH.GT.(1.+ZEPS)) THEN + ZXH = 1./ZXH + CALL HYPSER(PA,PA-PC+1.,PA-PB+1.,-ZXH,PHYPGEO) + PHYPGEO = PHYPGEO*ZXH**(PA)* & + (GAMMA(PC)*GAMMA(PB-PA)/(GAMMA(PB)*GAMMA(PC-PA))) + CALL HYPSER(PB,PB-PC+1.,PB-PA+1.,-ZXH,ZTEMP) + PHYPGEO = PHYPGEO+ZTEMP*ZXH**(PB)* & + (GAMMA(PC)*GAMMA(PA-PB)/(GAMMA(PA)*GAMMA(PC-PB))) +ELSE + ZX0 = (1.-ZEPS) + ZX1 = 1./(1.+ZEPS) + CALL HYPSER(PA,PA-PC+1.,PA-PB+1.,-ZX1,PHYPGEO) + PHYPGEO = PHYPGEO*ZX1**(PA)* & + (GAMMA(PC)*GAMMA(PB-PA)/(GAMMA(PB)*GAMMA(PC-PA))) + CALL HYPSER(PB,PB-PC+1.,PB-PA+1.,-ZX1,ZTEMP) + PHYPGEO = PHYPGEO+ZTEMP*ZX1**(PB)* & + (GAMMA(PC)*GAMMA(PA-PB)/(GAMMA(PA)*GAMMA(PC-PB))) + CALL HYPSER(PA,PB,PC,-ZX0,ZTEMP) + PHYPGEO = ZTEMP + (ZXH-ZX0)*(PHYPGEO-ZTEMP)/(2.*ZEPS) +ENDIF +END diff --git a/src/mesonh/micro/hypser.f90 b/src/mesonh/micro/hypser.f90 new file mode 100644 index 000000000..3a8bed13e --- /dev/null +++ b/src/mesonh/micro/hypser.f90 @@ -0,0 +1,116 @@ +!MNH_LIC Copyright 1996-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!#################### +MODULE MODI_HYPSER +!#################### +! +INTERFACE +! +SUBROUTINE HYPSER(PA,PB,PC,PX,PHYP) +REAL, INTENT(IN) :: PA,PB,PC +REAL, INTENT(IN) :: PX +REAL, INTENT(INOUT) :: PHYP +END SUBROUTINE HYPSER +! +END INTERFACE +! +END MODULE MODI_HYPSER +! ############################################# + SUBROUTINE HYPSER(PA,PB,PC,PX,PHYP) +! ############################################# +! +! +!!**** *HYPSER* - hypergeometric function +!! +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute the hypergeometric +!! function of its argument. +!! +!! +!! A*B (A+1)A*(B+1)B X^2 +!! HYPSER(A,B,C,X)= 1 + ----- * X + ------------- * --- + ... + +!! C (C+1)C 2 +!! +!! (A+n)...A*(B+n)...B X^n +!! --------------------- * ----- + ... ... +!! (C+n)...C n! +!! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! HYPSER +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! Press, Teukolsky, Vetterling and Flannery: Numerical Recipes, 272 +!! +!! +!! AUTHOR +!! ------ +!! Jean-Martial Cohard *LA/OMP* +!! +!! MODIFICATIONS +!! ------------- +!! Original 31/12/96 +! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg +! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! +!------------------------------------------------------------------------------ +! +!* 0. DECLARATIONS +! +! +use mode_msg +! +IMPLICIT NONE +! +!* 0.1 declarations of arguments and result +! +REAL, INTENT(IN) :: PA,PB,PC +REAL, INTENT(IN) :: PX +REAL, INTENT(INOUT) :: PHYP +! +! +! +!* 0.2 declarations of local variables +! +INTEGER :: JN,JFLAG +REAL :: ZXH,ZZA,ZZB,ZZC,ZFAC,ZTEMP +REAL :: ZPREC +! +!------------------------------------------------------------------------------ +! +ZPREC = 1.0E-04 +ZXH = PX +ZFAC = 1.0 +ZTEMP = ZFAC +ZZA = PA +ZZB = PB +ZZC = PC +JFLAG = 0 +SERIE: DO JN = 1,5000 + ZFAC = ZFAC * ZZA * ZZB / ZZC + ZFAC = ZFAC * ZXH / REAL(JN) + PHYP = ZTEMP + ZFAC + IF (ABS(PHYP-ZTEMP).LE.ZPREC) THEN + JFLAG = 1 + EXIT SERIE + END IF + ZTEMP = PHYP + ZZA = ZZA + 1. + ZZB = ZZB + 1. + ZZC = ZZC + 1. +END DO SERIE +IF (JFLAG == 0) call Print_msg(NVERB_FATAL,'GEN','HYPSER','convergence failure') +! +END SUBROUTINE HYPSER diff --git a/src/mesonh/micro/ice4_compute_pdf.f90 b/src/mesonh/micro/ice4_compute_pdf.f90 new file mode 100644 index 000000000..bc465eb65 --- /dev/null +++ b/src/mesonh/micro/ice4_compute_pdf.f90 @@ -0,0 +1,324 @@ +!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +MODULE MODI_ICE4_COMPUTE_PDF +INTERFACE +SUBROUTINE ICE4_COMPUTE_PDF(KSIZE, HSUBG_AUCV_RC, HSUBG_AUCV_RI, HSUBG_PR_PDF, & + PRHODREF, PRCT, PRIT, PCF, PT, PSIGMA_RC,& + PHLC_HCF, PHLC_LCF, PHLC_HRC, PHLC_LRC, & + PHLI_HCF, PHLI_LCF, PHLI_HRI, PHLI_LRI, PRF) +IMPLICIT NONE +INTEGER, INTENT(IN) :: KSIZE +CHARACTER(LEN=4), INTENT(IN) :: HSUBG_AUCV_RC ! Kind of Subgrid autoconversion method +CHARACTER(LEN=80), INTENT(IN) :: HSUBG_AUCV_RI ! Kind of Subgrid autoconversion method +CHARACTER(LEN=80), INTENT(IN) :: HSUBG_PR_PDF ! pdf for subgrid precipitation +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRIT ! Ice Crystal m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PCF ! Cloud fraction +REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature +REAL, DIMENSION(KSIZE), INTENT(IN) :: PSIGMA_RC ! Standard deviation of rc at time t +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PHLC_HCF ! HLCLOUDS : fraction of High Cloud Fraction in grid +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PHLC_LCF ! HLCLOUDS : fraction of Low Cloud Fraction in grid + ! note that PCF = PHLC_HCF + PHLC_LCF +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PHLC_HRC ! HLCLOUDS : LWC that is High LWC in grid +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PHLC_LRC ! HLCLOUDS : LWC that is Low LWC in grid + ! note that PRC = PHLC_HRC + PHLC_LRC +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PHLI_HCF ! +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PHLI_LCF +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PHLI_HRI ! +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PHLI_LRI ! +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRF ! Rain fraction +END SUBROUTINE ICE4_COMPUTE_PDF +END INTERFACE +END MODULE MODI_ICE4_COMPUTE_PDF +SUBROUTINE ICE4_COMPUTE_PDF(KSIZE, HSUBG_AUCV_RC, HSUBG_AUCV_RI, HSUBG_PR_PDF, & + PRHODREF, PRCT, PRIT, PCF, PT, PSIGMA_RC,& + PHLC_HCF, PHLC_LCF, PHLC_HRC, PHLC_LRC, & + PHLI_HCF, PHLI_LCF, PHLI_HRI, PHLI_LRI, PRF) +!! +!!** PURPOSE +!! ------- +!! Computes the pdf used to split cloud into high and low content parts +!! +!! AUTHOR +!! ------ +!! S. Riette from the plitting of rain_ice source code (nov. 2014) +!! +!! MODIFICATIONS +!! ------------- +!! +! +! +!* 0. DECLARATIONS +! ------------ +! +! +USE MODD_RAIN_ICE_DESCR, ONLY: XRTMIN +USE MODD_RAIN_ICE_PARAM, ONLY: XCRIAUTC,XBCRIAUTI,XACRIAUTI,XCRIAUTI +USE MODD_CST, ONLY : XTT +! +USE MODE_MSG +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +INTEGER, INTENT(IN) :: KSIZE +CHARACTER(LEN=4), INTENT(IN) :: HSUBG_AUCV_RC ! Kind of Subgrid autoconversion method for cloud water +CHARACTER(LEN=80), INTENT(IN) :: HSUBG_AUCV_RI ! Kind of Subgrid autoconversion method for cloud water +CHARACTER(LEN=80), INTENT(IN) :: HSUBG_PR_PDF ! pdf for subgrid precipitation +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRIT ! Ice Crystal m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PCF ! Cloud fraction +REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature +REAL, DIMENSION(KSIZE), INTENT(IN) :: PSIGMA_RC ! Standard deviation of rc at time t +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PHLC_HCF ! HLCLOUDS : fraction of High Cloud Fraction in grid +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PHLC_LCF ! HLCLOUDS : fraction of Low Cloud Fraction in grid + ! note that PCF = PHLC_HCF + PHLC_LCF +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PHLC_HRC ! HLCLOUDS : LWC that is High LWC in grid +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PHLC_LRC ! HLCLOUDS : LWC that is Low LWC in grid + ! note that PRC = PHLC_HRC + PHLC_LRC +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PHLI_HCF +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PHLI_LCF +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PHLI_HRI +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PHLI_LRI +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRF ! Rain fraction +! +!* 0.2 declaration of local variables +! +REAL, DIMENSION(KSIZE) :: ZRCRAUTC, & !RC value to begin rain formation =XCRIAUTC/RHODREF + ZCRIAUTI, & !RI value to begin snow formation + ZHLC_RCMAX, & !HLCLOUDS : maximum value for RC in distribution + ZHLC_LRCLOCAL, & !HLCLOUDS : LWC that is Low LWC local in LCF + ZHLC_HRCLOCAL, & !HLCLOUDS : LWC that is High LWC local in HCF + ! note that ZRC/CF = ZHLC_HRCLOCAL+ ZHLC_LRCLOCAL + ! = PHLC_HRC/HCF+ PHLC_LRC/LCF + ZSUMRC, ZSUMRI +REAL :: ZCOEFFRCM +!------------------------------------------------------------------------------- +! +!Cloud water split between high and low content part is done according to autoconversion option +ZRCRAUTC(:)=XCRIAUTC/PRHODREF(:) ! Autoconversion rc threshold +IF(HSUBG_AUCV_RC=='NONE') THEN + !Cloud water is entirely in low or high part + WHERE(PRCT(:)>ZRCRAUTC(:)) + PHLC_HCF(:)=1. + PHLC_LCF(:)=0. + PHLC_HRC(:)=PRCT(:) + PHLC_LRC(:)=0. + ELSEWHERE(PRCT(:)>XRTMIN(2)) + PHLC_HCF(:)=0. + PHLC_LCF(:)=1. + PHLC_HRC(:)=0. + PHLC_LRC(:)=PRCT(:) + ELSEWHERE + PHLC_HCF(:)=0. + PHLC_LCF(:)=0. + PHLC_HRC(:)=0. + PHLC_LRC(:)=0. + END WHERE + +ELSEIF(HSUBG_AUCV_RC=='CLFR') THEN + !Cloud water is only in the cloudy part and entirely in low or high part + WHERE(PCF(:)>0. .AND. PRCT(:)>ZRCRAUTC(:)*PCF(:)) + PHLC_HCF(:)=PCF(:) + PHLC_LCF(:)=0. + PHLC_HRC(:)=PRCT(:) + PHLC_LRC(:)=0. + ELSEWHERE(PCF(:)>0. .AND. PRCT(:)>XRTMIN(2)) + PHLC_HCF(:)=0. + PHLC_LCF(:)=PCF(:) + PHLC_HRC(:)=0.0 + PHLC_LRC(:)=PRCT(:) + ELSEWHERE + PHLC_HCF(:)=0. + PHLC_LCF(:)=0. + PHLC_HRC(:)=0. + PHLC_LRC(:)=0. + END WHERE +ELSEIF(HSUBG_AUCV_RC=='ADJU') THEN + ZSUMRC(:)=PHLC_LRC(:)+PHLC_HRC(:) + WHERE(ZSUMRC .GT. 0.) + PHLC_LRC(:)=PHLC_LRC(:)*PRCT(:)/ZSUMRC(:) + PHLC_HRC(:)=PHLC_HRC(:)*PRCT(:)/ZSUMRC(:) + ELSEWHERE + PHLC_LRC(:)=0. + PHLC_HRC(:)=0. + ENDWHERE +ELSEIF(HSUBG_AUCV_RC=='PDF ') THEN + !Cloud water is split between high and low part according to a PDF + ! 'HLCRECTPDF' : rectangular PDF form + ! 'HLCTRIANGPDF' : triangular PDF form + ! 'HLCQUADRAPDF' : second order quadratic PDF form + ! 'HLCISOTRIPDF' : isocele triangular PDF + ! 'SIGM' : Redelsperger and Sommeria (1986) + IF(HSUBG_PR_PDF=='SIGM') THEN + ! Redelsperger and Sommeria (1986) but organised according to Turner (2011, 2012) + WHERE (PRCT(:)>ZRCRAUTC(:)+PSIGMA_RC(:)) + PHLC_HCF(:)=1. + PHLC_LCF(:)=0. + PHLC_HRC(:)=PRCT(:) + PHLC_LRC(:)=0. + ELSEWHERE(PRCT(:)> (ZRCRAUTC(:)-PSIGMA_RC(:)) .AND. & + & PRCT(:)<=(ZRCRAUTC(:)+PSIGMA_RC(:)) ) + PHLC_HCF(:)=(PRCT(:)+PSIGMA_RC(:)-ZRCRAUTC(:))/ & + &(2.*PSIGMA_RC(:)) + PHLC_LCF(:)=MAX(0., PCF(:)-PHLC_HCF(:)) + PHLC_HRC(:)=(PRCT(:)+PSIGMA_RC(:)-ZRCRAUTC(:))* & + &(PRCT(:)+PSIGMA_RC(:)+ZRCRAUTC(:))/ & + &(4.*PSIGMA_RC(:)) + PHLC_LRC(:)=MAX(0., PRCT(:)-PHLC_HRC(:)) + ELSEWHERE(PRCT(:)>XRTMIN(2) .AND. PCF(:)>0.) + PHLC_HCF(:)=0. + PHLC_LCF(:)=PCF(:) + PHLC_HRC(:)=0. + PHLC_LRC(:)=PRCT(:) + ELSEWHERE + PHLC_HCF(:)=0. + PHLC_LCF(:)=0. + PHLC_HRC(:)=0. + PHLC_LRC(:)=0. + END WHERE + ! Turner (2011, 2012) + ELSEIF(HSUBG_PR_PDF=='HLCRECTPDF' .OR. HSUBG_PR_PDF=='HLCISOTRIPDF' .OR. & + &HSUBG_PR_PDF=='HLCTRIANGPDF' .OR. HSUBG_PR_PDF=='HLCQUADRAPDF') THEN + ! Calculate maximum value r_cM from PDF forms + IF(HSUBG_PR_PDF=='HLCRECTPDF' .OR. HSUBG_PR_PDF=='HLCISOTRIPDF') THEN + ZCOEFFRCM=2. + ELSE IF(HSUBG_PR_PDF=='HLCTRIANGPDF') THEN + ZCOEFFRCM=3. + ELSE IF(HSUBG_PR_PDF=='HLCQUADRAPDF') THEN + ZCOEFFRCM=4. + END IF + WHERE(PRCT(:).GT.0. .AND. PCF(:).GT.0.) + ZHLC_RCMAX(:)=ZCOEFFRCM*PRCT(:)/PCF(:) + END WHERE + ! Split available water and cloud fraction in two parts + ! Calculate local mean values int he low and high parts for the 3 PDF forms: + IF(HSUBG_PR_PDF=='HLCRECTPDF') THEN + WHERE(PRCT(:).GT.0. .AND. PCF(:).GT.0. .AND. ZHLC_RCMAX(:).GT.ZRCRAUTC(:)) + ZHLC_LRCLOCAL(:)=0.5*ZRCRAUTC(:) + ZHLC_HRCLOCAL(:)=( ZHLC_RCMAX(:) + ZRCRAUTC(:))/2.0 + END WHERE + ELSE IF(HSUBG_PR_PDF=='HLCTRIANGPDF') THEN + WHERE(PRCT(:).GT.0. .AND. PCF(:).GT.0. .AND. ZHLC_RCMAX(:).GT.ZRCRAUTC(:)) + ZHLC_LRCLOCAL(:)=( ZRCRAUTC(:) *(3.0 * ZHLC_RCMAX(:) - 2.0 * ZRCRAUTC(:) ) ) & + / (3.0 * (2.0 * ZHLC_RCMAX(:) - ZRCRAUTC(:) ) ) + ZHLC_HRCLOCAL(:)=(ZHLC_RCMAX(:) + 2.0*ZRCRAUTC(:)) / 3.0 + END WHERE + ELSE IF(HSUBG_PR_PDF=='HLCQUADRAPDF') THEN + WHERE(PRCT(:).GT.0. .AND. PCF(:).GT.0. .AND. ZHLC_RCMAX(:).GT.ZRCRAUTC(:)) + ZHLC_LRCLOCAL(:)=(3.0 *ZRCRAUTC(:)**3 - 8.0 *ZRCRAUTC(:)**2 * ZHLC_RCMAX(:) & + + 6.0*ZRCRAUTC(:) *ZHLC_RCMAX(:)**2 ) & + / & + (4.0* ZRCRAUTC(:)**2 -12.0*ZRCRAUTC(:) *ZHLC_RCMAX(:) & + + 12.0 * ZHLC_RCMAX(:)**2 ) + ZHLC_HRCLOCAL(:)=(ZHLC_RCMAX(:) + 3.0*ZRCRAUTC(:))/4.0 + END WHERE + ELSE IF(HSUBG_PR_PDF=='HLCISOTRIPDF') THEN + WHERE(PRCT(:).GT.0. .AND. PCF(:).GT.0. .AND. ZHLC_RCMAX(:).GT.ZRCRAUTC(:)) + WHERE((PRCT(:) / PCF(:)).LE.ZRCRAUTC(:)) + ZHLC_LRCLOCAL(:)=( (ZHLC_RCMAX(:))**3 & + -(12.0 * (ZHLC_RCMAX(:))*(ZRCRAUTC(:))**2) & + +(8.0 * ZRCRAUTC(:)**3) ) & + /( (6.0 * (ZHLC_RCMAX(:))**2) & + -(24.0 * (ZHLC_RCMAX(:)) * ZRCRAUTC(:)) & + +(12.0 * ZRCRAUTC(:)**2) ) + ZHLC_HRCLOCAL(:)=( ZHLC_RCMAX(:) + 2.0 * ZRCRAUTC(:) )/3.0 + ELSEWHERE + ZHLC_LRCLOCAL(:)=(2.0/3.0) * ZRCRAUTC(:) + ZHLC_HRCLOCAL(:)=(3.0*ZHLC_RCMAX(:)**3 - 8.0*ZRCRAUTC(:)**3) & + / (6.0 * ZHLC_RCMAX(:)**2 - 12.0*ZRCRAUTC(:)**2) + END WHERE + END WHERE + END IF + ! Compare r_cM to r_cR to know if cloud water content is high enough to split in two parts or not + WHERE (PRCT(:).GT.0. .AND. PCF(:).GT.0. .AND. ZHLC_RCMAX(:).GT.ZRCRAUTC(:)) + ! Calculate final values for LCF and HCF: + PHLC_LCF(:)=PCF(:) & + *(ZHLC_HRCLOCAL- & + (PRCT(:) / PCF(:))) & + / (ZHLC_HRCLOCAL-ZHLC_LRCLOCAL) + PHLC_HCF(:)=MAX(0., PCF(:)-PHLC_LCF(:)) + ! + ! Calculate final values for LRC and HRC: + PHLC_LRC(:)=ZHLC_LRCLOCAL*PHLC_LCF(:) + PHLC_HRC(:)=MAX(0., PRCT(:)-PHLC_LRC(:)) + ELSEWHERE (PRCT(:).GT.0. .AND. PCF(:).GT.0. .AND. ZHLC_RCMAX(:).LE.ZRCRAUTC(:)) + ! Put all available cloud water and his fraction in the low part + PHLC_LCF(:)=PCF(:) + PHLC_HCF(:)=0. + PHLC_LRC(:)=PRCT(:) + PHLC_HRC(:)=0. + ELSEWHERE + PHLC_LCF(:)=0. + PHLC_HCF(:)=0. + PHLC_LRC(:)=0. + PHLC_HRC(:)=0. + END WHERE + ELSE + CALL PRINT_MSG(NVERB_FATAL,'GEN','ICE4_COMPUTE_PDF','wrong HSUBG_PR_PDF case') + ENDIF +ELSE + CALL PRINT_MSG(NVERB_FATAL,'GEN','ICE4_COMPUTE_PDF','wrong HSUBG_AUCV case') +ENDIF +! +!Ice water split between high and low content part is done according to autoconversion option +ZCRIAUTI(:)=MIN(XCRIAUTI,10**(XACRIAUTI*(PT(:)-XTT)+XBCRIAUTI)) ! Autoconversion ri threshold +IF(HSUBG_AUCV_RI=='NONE') THEN + !Cloud water is entirely in low or high part + WHERE(PRIT(:)>ZCRIAUTI(:)) + PHLI_HCF(:)=1. + PHLI_LCF(:)=0. + PHLI_HRI(:)=PRIT(:) + PHLI_LRI(:)=0. + ELSEWHERE(PRIT(:)>XRTMIN(2)) + PHLI_HCF(:)=0. + PHLI_LCF(:)=1. + PHLI_HRI(:)=0. + PHLI_LRI(:)=PRIT(:) + ELSEWHERE + PHLI_HCF(:)=0. + PHLI_LCF(:)=0. + PHLI_HRI(:)=0. + PHLI_LRI(:)=0. + END WHERE +ELSEIF(HSUBG_AUCV_RI=='CLFR') THEN + !Cloud water is only in the cloudy part and entirely in low or high part + WHERE(PCF(:)>0. .AND. PRIT(:)>ZCRIAUTI(:)*PCF(:)) + PHLI_HCF(:)=PCF(:) + PHLI_LCF(:)=0. + PHLI_HRI(:)=PRIT(:) + PHLI_LRI(:)=0. + ELSEWHERE(PCF(:)>0. .AND. PRIT(:)>XRTMIN(2)) + PHLI_HCF(:)=0. + PHLI_LCF(:)=PCF(:) + PHLI_HRI(:)=0.0 + PHLI_LRI(:)=PRIT(:) + ELSEWHERE + PHLI_HCF(:)=0. + PHLI_LCF(:)=0. + PHLI_HRI(:)=0. + PHLI_LRI(:)=0. + END WHERE +ELSEIF(HSUBG_AUCV_RI=='ADJU') THEN + ZSUMRI(:)=PHLI_LRI(:)+PHLI_HRI(:) + WHERE(ZSUMRI .GT. 0.) + PHLI_LRI(:)=PHLI_LRI(:)*PRIT(:)/ZSUMRI(:) + PHLI_HRI(:)=PHLI_HRI(:)*PRIT(:)/ZSUMRI(:) + ELSEWHERE + PHLI_LRI(:)=0. + PHLI_HRI(:)=0. + ENDWHERE +ELSE + !wrong HSUBG_AUCV_RI case + CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'ICE4_COMPUTE_PDF', 'wrong HSUBG_AUCV_RI case' ) +ENDIF +! +PRF=MAX(PHLC_HCF,PHLI_HCF) +! +END SUBROUTINE ICE4_COMPUTE_PDF diff --git a/src/mesonh/micro/ice4_fast_rg.f90 b/src/mesonh/micro/ice4_fast_rg.f90 new file mode 100644 index 000000000..b84dda857 --- /dev/null +++ b/src/mesonh/micro/ice4_fast_rg.f90 @@ -0,0 +1,582 @@ +!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +MODULE MODI_ICE4_FAST_RG +INTERFACE +SUBROUTINE ICE4_FAST_RG(KSIZE, LDSOFT, PCOMPUTE, KRR, & + &PRHODREF, PLVFACT, PLSFACT, PPRES, & + &PDV, PKA, PCJ, PCIT, & + &PLBDAR, PLBDAS, PLBDAG, & + &PT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & + &PRGSI, PRGSI_MR, & + &PWETG, & + &PRICFRRG, PRRCFRIG, PRICFRR, PRCWETG, PRIWETG, PRRWETG, PRSWETG, & + &PRCDRYG, PRIDRYG, PRRDRYG, PRSDRYG, PRWETGH, PRWETGH_MR, PRGMLTR, & + &PRG_TEND, & + &PA_TH, PA_RC, PA_RR, PA_RI, PA_RS, PA_RG, PA_RH, PB_RG, PB_RH) +IMPLICIT NONE +INTEGER, INTENT(IN) :: KSIZE +LOGICAL, INTENT(IN) :: LDSOFT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE +INTEGER, INTENT(IN) :: KRR ! Number of moist variable +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLVFACT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLSFACT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PPRES ! absolute pressure at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PDV ! Diffusivity of water vapor in the air +REAL, DIMENSION(KSIZE), INTENT(IN) :: PKA ! Thermal conductivity of the air +REAL, DIMENSION(KSIZE), INTENT(IN) :: PCJ ! Function to compute the ventilation coefficient +REAL, DIMENSION(KSIZE), INTENT(IN) :: PCIT ! Pristine ice conc. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAR ! Slope parameter of the raindrop distribution +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAS ! Slope parameter of the aggregate distribution +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAG ! Slope parameter of the graupel distribution +REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRIT ! Pristine ice m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRGT ! Graupel m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRGSI ! Graupel tendency by other processes +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRGSI_MR ! Graupel mr change by other processes +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PWETG ! 1. where graupel grows in wet mode, 0. elsewhere +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRICFRRG ! Rain contact freezing +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRRCFRIG ! Rain contact freezing +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRICFRR ! Rain contact freezing +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRCWETG ! Graupel wet growth +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRIWETG ! Graupel wet growth +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRRWETG ! Graupel wet growth +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRSWETG ! Graupel wet growth +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRCDRYG ! Graupel dry growth +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRIDRYG ! Graupel dry growth +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRRDRYG ! Graupel dry growth +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRSDRYG ! Graupel dry growth +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRWETGH ! Conversion of graupel into hail +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRWETGH_MR ! Conversion of graupel into hail, mr change +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRGMLTR ! Melting of the graupel +REAL, DIMENSION(KSIZE, 8), INTENT(INOUT) :: PRG_TEND ! Individual tendencies +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_TH +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RC +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RR +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RI +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RS +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RG +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RH +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RG +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RH +END SUBROUTINE ICE4_FAST_RG +END INTERFACE +END MODULE MODI_ICE4_FAST_RG +SUBROUTINE ICE4_FAST_RG(KSIZE, LDSOFT, PCOMPUTE, KRR, & + &PRHODREF, PLVFACT, PLSFACT, PPRES, & + &PDV, PKA, PCJ, PCIT, & + &PLBDAR, PLBDAS, PLBDAG, & + &PT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & + &PRGSI, PRGSI_MR, & + &PWETG, & + &PRICFRRG, PRRCFRIG, PRICFRR, PRCWETG, PRIWETG, PRRWETG, PRSWETG, & + &PRCDRYG, PRIDRYG, PRRDRYG, PRSDRYG, PRWETGH, PRWETGH_MR, PRGMLTR, & + &PRG_TEND, & + &PA_TH, PA_RC, PA_RR, PA_RI, PA_RS, PA_RG, PA_RH, PB_RG, PB_RH) +!! +!!** PURPOSE +!! ------- +!! Computes the fast rg processes +!! +!! AUTHOR +!! ------ +!! S. Riette from the splitting of rain_ice source code (nov. 2014) +!! +!! MODIFICATIONS +!! ------------- +!! +! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! P. Wautelet 29/05/2019: remove PACK/UNPACK intrinsics (to get more performance and better OpenACC support) +! +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST, ONLY: XALPI,XALPW,XBETAI,XBETAW,XGAMW,XCI,XCL,XCPV,XESTT,XGAMI,XLMTT,XLVTT,XMD,XMV,XRV,XTT, & + XEPSILO +USE MODD_PARAM_ICE, ONLY: LCRFLIMIT,LEVLIMIT,LNULLWETG,LWETGPOST +USE MODD_RAIN_ICE_DESCR, ONLY: XBS,XCEXVT,XCXG,XCXS,XDG,XRTMIN +USE MODD_RAIN_ICE_PARAM, ONLY: NDRYLBDAG,NDRYLBDAR,NDRYLBDAS,X0DEPG,X1DEPG,XCOLEXIG,XCOLEXSG,XCOLIG,XCOLSG,XDRYINTP1G, & + XDRYINTP1R,XDRYINTP1S,XDRYINTP2G,XDRYINTP2R,XDRYINTP2S,XEX0DEPG,XEX1DEPG,XEXICFRR, & + XEXRCFRI,XFCDRYG,XFIDRYG,XFRDRYG,XFSDRYG,XICFRR,XKER_RDRYG,XKER_SDRYG,XLBRDRYG1, & + XLBRDRYG2,XLBRDRYG3,XLBSDRYG1,XLBSDRYG2,XLBSDRYG3,XRCFRI +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +INTEGER, INTENT(IN) :: KSIZE +LOGICAL, INTENT(IN) :: LDSOFT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE +INTEGER, INTENT(IN) :: KRR ! Number of moist variable +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLVFACT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLSFACT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PPRES ! absolute pressure at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PDV ! Diffusivity of water vapor in the air +REAL, DIMENSION(KSIZE), INTENT(IN) :: PKA ! Thermal conductivity of the air +REAL, DIMENSION(KSIZE), INTENT(IN) :: PCJ ! Function to compute the ventilation coefficient +REAL, DIMENSION(KSIZE), INTENT(IN) :: PCIT ! Pristine ice conc. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAR ! Slope parameter of the raindrop distribution +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAS ! Slope parameter of the aggregate distribution +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAG ! Slope parameter of the graupel distribution +REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRIT ! Pristine ice m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRGT ! Graupel m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRGSI ! Graupel tendency by other processes +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRGSI_MR ! Graupel mr change by other processes +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PWETG ! 1. where graupel grows in wet mode, 0. elsewhere +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRICFRRG ! Rain contact freezing +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRRCFRIG ! Rain contact freezing +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRICFRR ! Rain contact freezing +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRCWETG ! Graupel wet growth +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRIWETG ! Graupel wet growth +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRRWETG ! Graupel wet growth +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRSWETG ! Graupel wet growth +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRCDRYG ! Graupel dry growth +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRIDRYG ! Graupel dry growth +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRRDRYG ! Graupel dry growth +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRSDRYG ! Graupel dry growth +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRWETGH ! Conversion of graupel into hail +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRWETGH_MR ! Conversion of graupel into hail, mr change +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRGMLTR ! Melting of the graupel +REAL, DIMENSION(KSIZE, 8), INTENT(INOUT) :: PRG_TEND ! Individual tendencies +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_TH +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RC +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RR +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RI +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RS +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RG +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RH +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RG +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RH +! +!* 0.2 declaration of local variables +! +INTEGER, PARAMETER :: IRCDRYG=1, IRIDRYG=2, IRIWETG=3, IRSDRYG=4, IRSWETG=5, IRRDRYG=6, & + & IFREEZ1=7, IFREEZ2=8 +! +LOGICAL, DIMENSION(KSIZE) :: GDRY +INTEGER, DIMENSION(KSIZE) :: I1 +REAL, DIMENSION(KSIZE) :: ZDRY, ZDRYG, ZMASK +INTEGER :: IGDRY +REAL, DIMENSION(KSIZE) :: ZVEC1, ZVEC2, ZVEC3 +INTEGER, DIMENSION(KSIZE) :: IVEC1, IVEC2 +REAL, DIMENSION(KSIZE) :: ZZW, & + ZRDRYG_INIT, & !Initial dry growth rate of the graupeln + ZRWETG_INIT !Initial wet growth rate of the graupeln +INTEGER :: JJ, JL +! +!------------------------------------------------------------------------------- +! +!* 6.1 rain contact freezing +! +DO JL=1, KSIZE + ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(4)-PRIT(JL))) * & ! WHERE(PRIT(:)>XRTMIN(4)) + &MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JL))) * & ! WHERE(PRRT(:)>XRTMIN(3)) + &PCOMPUTE(JL) +ENDDO +IF(LDSOFT) THEN + DO JL=1, KSIZE + PRICFRRG(JL)=ZMASK(JL) * PRICFRRG(JL) + PRRCFRIG(JL)=ZMASK(JL) * PRRCFRIG(JL) + PRICFRR(JL)=ZMASK(JL) * PRICFRR(JL) + ENDDO +ELSE + PRICFRRG(:)=0. + PRRCFRIG(:)=0. + WHERE(ZMASK(:)==1.) + PRICFRRG(:) = XICFRR*PRIT(:) & ! RICFRRG + *PLBDAR(:)**XEXICFRR & + *PRHODREF(:)**(-XCEXVT) + PRRCFRIG(:) = XRCFRI*PCIT(:) & ! RRCFRIG + * PLBDAR(:)**XEXRCFRI & + * PRHODREF(:)**(-XCEXVT-1.) + END WHERE + + IF(LCRFLIMIT) THEN + DO JL=1, KSIZE + !Comparison between heat to be released (to freeze rain) and heat sink (rain and ice temperature change) + !ZZW is the proportion of process that can take place + ZZW(JL)=(1.-ZMASK(JL)) + & ! 1. outside of mask + ZMASK(JL) * MAX(0., MIN(1., (PRICFRRG(JL)*XCI+PRRCFRIG(JL)*XCL)*(XTT-PT(JL)) / & + MAX(1.E-20, XLVTT*PRRCFRIG(JL)))) + ENDDO + ELSE + ZZW(:)=1. + ENDIF + DO JL=1, KSIZE + PRRCFRIG(JL) = ZZW(JL) * PRRCFRIG(JL) !Part of rain that can be freezed + PRICFRR(JL) = (1.-ZZW(JL)) * PRICFRRG(JL) !Part of collected pristine ice converted to rain + PRICFRRG(JL) = ZZW(JL) * PRICFRRG(JL) !Part of collected pristine ice that lead to graupel + ENDDO +ENDIF +DO JL=1, KSIZE + PA_RI(JL) = PA_RI(JL) - PRICFRRG(JL) - PRICFRR(JL) + PA_RR(JL) = PA_RR(JL) - PRRCFRIG(JL) + PRICFRR(JL) + PA_RG(JL) = PA_RG(JL) + PRICFRRG(JL) + PRRCFRIG(JL) + PA_TH(JL) = PA_TH(JL) + (PRRCFRIG(JL) - PRICFRR(JL))*(PLSFACT(JL)-PLVFACT(JL)) +ENDDO +! +! +!* 6.3 compute the graupel growth +! +! Wet and dry collection of rc and ri on graupel +DO JL=1, KSIZE + ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(6)-PRGT(JL))) * & ! WHERE(PRGT(:)>XRTMIN(6)) + &MAX(0., -SIGN(1., XRTMIN(2)-PRCT(JL))) * & ! WHERE(PRCT(:)>XRTMIN(2)) + &PCOMPUTE(JL) +ENDDO +IF(LDSOFT) THEN + DO JL=1, KSIZE + PRG_TEND(JL, IRCDRYG)=ZMASK(JL)*PRG_TEND(JL, IRCDRYG) + ENDDO +ELSE + ZZW(:)=0. + WHERE(ZMASK(:)==1.) + ZZW(:)=PLBDAG(:)**(XCXG-XDG-2.) * PRHODREF(:)**(-XCEXVT) + END WHERE + DO JL=1, KSIZE + PRG_TEND(JL, IRCDRYG)=ZMASK(JL)*XFCDRYG * PRCT(JL) * ZZW(JL) + ENDDO +ENDIF + +DO JL=1, KSIZE + ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(6)-PRGT(JL))) * & ! WHERE(PRGT(:)>XRTMIN(6)) + &MAX(0., -SIGN(1., XRTMIN(4)-PRIT(JL))) * & ! WHERE(PRIT(:)>XRTMIN(4)) + &PCOMPUTE(JL) +ENDDO +IF(LDSOFT) THEN + DO JL=1, KSIZE + PRG_TEND(JL, IRIDRYG)=ZMASK(JL) * PRG_TEND(JL, IRIDRYG) + PRG_TEND(JL, IRIWETG)=ZMASK(JL) * PRG_TEND(JL, IRIWETG) + ENDDO +ELSE + PRG_TEND(:, IRIDRYG)=0. + PRG_TEND(:, IRIWETG)=0. + WHERE(ZMASK(:)==1.) + ZZW(:)=PLBDAG(:)**(XCXG-XDG-2.) * PRHODREF(:)**(-XCEXVT) + PRG_TEND(:, IRIDRYG)=XFIDRYG*EXP(XCOLEXIG*(PT(:)-XTT))*PRIT(:)*ZZW(:) + PRG_TEND(:, IRIWETG)=PRG_TEND(:, IRIDRYG) / (XCOLIG*EXP(XCOLEXIG*(PT(:)-XTT))) + END WHERE +ENDIF + +! Wet and dry collection of rs on graupel (6.2.1) +IGDRY = 0 +DO JJ = 1, SIZE(GDRY) + ZDRY(JJ)=MAX(0., -SIGN(1., XRTMIN(5)-PRST(JJ))) * & ! WHERE(PRST(:)>XRTMIN(5)) + &MAX(0., -SIGN(1., XRTMIN(6)-PRGT(JJ))) * & ! WHERE(PRGT(:)>XRTMIN(6)) + &PCOMPUTE(JJ) + IF (ZDRY(JJ)>0) THEN + IGDRY = IGDRY + 1 + I1(IGDRY) = JJ + GDRY(JJ) = .TRUE. + ELSE + GDRY(JJ) = .FALSE. + END IF +END DO + +IF(LDSOFT) THEN + DO JL=1, KSIZE + PRG_TEND(JL, IRSDRYG)=ZDRY(JL) * PRG_TEND(JL, IRSDRYG) + PRG_TEND(JL, IRSWETG)=ZDRY(JL) * PRG_TEND(JL, IRSWETG) + ENDDO +ELSE + PRG_TEND(:, IRSDRYG)=0. + PRG_TEND(:, IRSWETG)=0. + IF(IGDRY>0)THEN + ! + !* 6.2.3 select the (PLBDAG,PLBDAS) couplet + ! + DO JJ = 1, IGDRY + ZVEC1(JJ) = PLBDAG(I1(JJ)) + ZVEC2(JJ) = PLBDAS(I1(JJ)) + END DO + ! + !* 6.2.4 find the next lower indice for the PLBDAG and for the PLBDAS + ! in the geometrical set of (Lbda_g,Lbda_s) couplet use to + ! tabulate the SDRYG-kernel + ! + ZVEC1(1:IGDRY)=MAX(1.00001, MIN(REAL(NDRYLBDAG)-0.00001, & + XDRYINTP1G*LOG(ZVEC1(1:IGDRY))+XDRYINTP2G)) + IVEC1(1:IGDRY)=INT(ZVEC1(1:IGDRY) ) + ZVEC1(1:IGDRY)=ZVEC1(1:IGDRY)-REAL(IVEC1(1:IGDRY)) + ! + ZVEC2(1:IGDRY)=MAX(1.00001, MIN( REAL(NDRYLBDAS)-0.00001, & + XDRYINTP1S*LOG(ZVEC2(1:IGDRY))+XDRYINTP2S)) + IVEC2(1:IGDRY)=INT(ZVEC2(1:IGDRY)) + ZVEC2(1:IGDRY)=ZVEC2(1:IGDRY)-REAL(IVEC2(1:IGDRY)) + ! + !* 6.2.5 perform the bilinear interpolation of the normalized + ! SDRYG-kernel + ! + DO JJ=1, IGDRY + ZVEC3(JJ) = ( XKER_SDRYG(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & + - XKER_SDRYG(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + * ZVEC1(JJ) & + - ( XKER_SDRYG(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & + - XKER_SDRYG(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + *(ZVEC1(JJ) - 1.0) + END DO + ZZW(:) = 0. + DO JJ = 1, IGDRY + ZZW(I1(JJ)) = ZVEC3(JJ) + END DO + ! + WHERE(GDRY(:)) + PRG_TEND(:, IRSWETG)=XFSDRYG*ZZW(:) & ! RSDRYG + / XCOLSG & + *(PLBDAS(:)**(XCXS-XBS))*( PLBDAG(:)**XCXG ) & + *(PRHODREF(:)**(-XCEXVT-1.)) & + *( XLBSDRYG1/( PLBDAG(:)**2 ) + & + XLBSDRYG2/( PLBDAG(:) * PLBDAS(:) ) + & + XLBSDRYG3/( PLBDAS(:)**2)) + PRG_TEND(:, IRSDRYG)=PRG_TEND(:, IRSWETG)*XCOLSG*EXP(XCOLEXSG*(PT(:)-XTT)) + END WHERE + ENDIF +ENDIF +! +!* 6.2.6 accretion of raindrops on the graupeln +! +IGDRY = 0 +DO JJ = 1, SIZE(GDRY) + ZDRY(JJ)=MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JJ))) * & ! WHERE(PRRT(:)>XRTMIN(3)) + &MAX(0., -SIGN(1., XRTMIN(6)-PRGT(JJ))) * & ! WHERE(PRGT(:)>XRTMIN(6)) + &PCOMPUTE(JJ) + IF (ZDRY(JJ)>0) THEN + IGDRY = IGDRY + 1 + I1(IGDRY) = JJ + GDRY(JJ) = .TRUE. + ELSE + GDRY(JJ) = .FALSE. + END IF +END DO + +IF(LDSOFT) THEN + DO JL=1, KSIZE + PRG_TEND(JL, IRRDRYG)=ZDRY(JL) * PRG_TEND(JL, IRRDRYG) + ENDDO +ELSE + PRG_TEND(:, IRRDRYG)=0. + ! + IF(IGDRY>0) THEN + ! + !* 6.2.8 select the (PLBDAG,PLBDAR) couplet + ! + DO JJ = 1, IGDRY + ZVEC1(JJ) = PLBDAG(I1(JJ)) + ZVEC2(JJ) = PLBDAR(I1(JJ)) + END DO + ! + !* 6.2.9 find the next lower indice for the PLBDAG and for the PLBDAR + ! in the geometrical set of (Lbda_g,Lbda_r) couplet use to + ! tabulate the RDRYG-kernel + ! + ZVEC1(1:IGDRY)=MAX(1.00001, MIN( REAL(NDRYLBDAG)-0.00001, & + XDRYINTP1G*LOG(ZVEC1(1:IGDRY))+XDRYINTP2G)) + IVEC1(1:IGDRY)=INT(ZVEC1(1:IGDRY)) + ZVEC1(1:IGDRY)=ZVEC1(1:IGDRY)-REAL(IVEC1(1:IGDRY)) + ! + ZVEC2(1:IGDRY)=MAX(1.00001, MIN( REAL(NDRYLBDAR)-0.00001, & + XDRYINTP1R*LOG(ZVEC2(1:IGDRY))+XDRYINTP2R)) + IVEC2(1:IGDRY)=INT(ZVEC2(1:IGDRY)) + ZVEC2(1:IGDRY)=ZVEC2(1:IGDRY)-REAL(IVEC2(1:IGDRY)) + ! + !* 6.2.10 perform the bilinear interpolation of the normalized + ! RDRYG-kernel + ! + DO JJ=1, IGDRY + ZVEC3(JJ)= ( XKER_RDRYG(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & + - XKER_RDRYG(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + * ZVEC1(JJ) & + - ( XKER_RDRYG(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & + - XKER_RDRYG(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + *(ZVEC1(JJ) - 1.0) + END DO + ZZW(:) = 0. + DO JJ = 1, IGDRY + ZZW(I1(JJ)) = ZVEC3(JJ) + END DO + ! + WHERE(GDRY(:)) + PRG_TEND(:, IRRDRYG) = XFRDRYG*ZZW(:) & ! RRDRYG + *( PLBDAR(:)**(-4) )*( PLBDAG(:)**XCXG ) & + *( PRHODREF(:)**(-XCEXVT-1.) ) & + *( XLBRDRYG1/( PLBDAG(:)**2 ) + & + XLBRDRYG2/( PLBDAG(:) * PLBDAR(:) ) + & + XLBRDRYG3/( PLBDAR(:)**2) ) + END WHERE + ENDIF +ENDIF + +DO JL=1, KSIZE + ZRDRYG_INIT(JL)=PRG_TEND(JL, IRCDRYG)+PRG_TEND(JL, IRIDRYG)+ & + &PRG_TEND(JL, IRSDRYG)+PRG_TEND(JL, IRRDRYG) +ENDDO + +!Freezing rate +DO JL=1, KSIZE + ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(6)-PRGT(JL))) * & ! WHERE(PRGT(:)>XRTMIN(6)) + &PCOMPUTE(JL) +ENDDO +IF(LDSOFT) THEN + DO JL=1, KSIZE + PRG_TEND(JL, IFREEZ1)=ZMASK(JL) * PRG_TEND(JL, IFREEZ1) + PRG_TEND(JL, IFREEZ2)=ZMASK(JL) * PRG_TEND(JL, IFREEZ2) + ENDDO +ELSE + DO JL=1, KSIZE + PRG_TEND(JL, IFREEZ1)=ZMASK(JL) * PRVT(JL)*PPRES(JL)/(XEPSILO+PRVT(JL)) ! Vapor pressure + ENDDO + IF(LEVLIMIT) THEN + WHERE(ZMASK(:)==1.) + PRG_TEND(:, IFREEZ1)=MIN(PRG_TEND(:, IFREEZ1), EXP(XALPI-XBETAI/PT(:)-XGAMI*ALOG(PT(:)))) ! min(ev, es_i(T)) + END WHERE + ENDIF + PRG_TEND(:, IFREEZ2)=0. + WHERE(ZMASK(:)==1.) + PRG_TEND(:, IFREEZ1)=PKA(:)*(XTT-PT(:)) + & + (PDV(:)*(XLVTT+(XCPV-XCL)*(PT(:)-XTT)) & + *(XESTT-PRG_TEND(:, IFREEZ1))/(XRV*PT(:)) ) + PRG_TEND(:, IFREEZ1)=PRG_TEND(:, IFREEZ1)* ( X0DEPG* PLBDAG(:)**XEX0DEPG + & + X1DEPG*PCJ(:)*PLBDAG(:)**XEX1DEPG )/ & + ( PRHODREF(:)*(XLMTT-XCL*(XTT-PT(:))) ) + PRG_TEND(:, IFREEZ2)=(PRHODREF(:)*(XLMTT+(XCI-XCL)*(XTT-PT(:))) ) / & + ( PRHODREF(:)*(XLMTT-XCL*(XTT-PT(:))) ) + END WHERE +ENDIF +DO JL=1, KSIZE + !We must agregate, at least, the cold species + ZRWETG_INIT(JL)=ZMASK(JL) * MAX(PRG_TEND(JL, IRIWETG)+PRG_TEND(JL, IRSWETG), & + &MAX(0., PRG_TEND(JL, IFREEZ1) + & + &PRG_TEND(JL, IFREEZ2) * ( & + &PRG_TEND(JL, IRIWETG)+PRG_TEND(JL, IRSWETG) ))) +ENDDO + +!Growth mode +DO JL=1, KSIZE + PWETG(JL) = ZMASK(JL) * & ! + & MAX(0., SIGN(1., MAX(0., ZRDRYG_INIT(JL)-PRG_TEND(JL, IRIDRYG)-PRG_TEND(JL, IRSDRYG)) - & + &MAX(0., ZRWETG_INIT(JL)-PRG_TEND(JL, IRIWETG)-PRG_TEND(JL, IRSWETG)))) +ENDDO +IF(LNULLWETG) THEN + DO JL=1, KSIZE + PWETG(JL) = PWETG(JL) * MAX(0., -SIGN(1., -ZRDRYG_INIT(JL))) + ENDDO +ELSE + DO JL=1, KSIZE + PWETG(JL) = PWETG(JL) * MAX(0., -SIGN(1., -ZRWETG_INIT(JL))) + ENDDO +ENDIF +IF(.NOT. LWETGPOST) THEN + DO JL=1, KSIZE + PWETG(JL) = PWETG(JL) * MAX(0., -SIGN(1., PT(JL)-XTT)) + ENDDO +ENDIF +DO JL=1, KSIZE + ZDRYG(JL) = ZMASK(JL) * & ! + & MAX(0., -SIGN(1., PT(JL)-XTT)) * & ! WHERE(PT(:)<XTT) + & MAX(0., -SIGN(1., 1.E-20-ZRDRYG_INIT(JL))) * & ! WHERE(ZRDRYG_INIT(:)>0.) + & MAX(0., -SIGN(1., MAX(0., ZRDRYG_INIT(JL)-PRG_TEND(JL, IRIDRYG)-PRG_TEND(JL, IRSDRYG)) - & + &MAX(0., ZRWETG_INIT(JL)-PRG_TEND(JL, IRIWETG)-PRG_TEND(JL, IRSWETG)))) +ENDDO + +! Part of ZRWETG to be converted into hail +! Graupel can be produced by other processes instantaneously (inducing a mixing ratio change, PRGSI_MR) or +! as a tendency (PRWETGH) +PRWETGH(:)=0. +PRWETGH_MR(:)=0. +IF(KRR==7) THEN + WHERE(PWETG(:)==1.) + !assume a linear percent of conversion of produced graupel into hail + PRWETGH(:)=(MAX(0., PRGSI(:)+PRICFRRG(:)+PRRCFRIG(:))+ZRWETG_INIT(:))*ZRDRYG_INIT(:)/(ZRWETG_INIT(:)+ZRDRYG_INIT(:)) + PRWETGH_MR(:)=MAX(0., PRGSI_MR(:))*ZRDRYG_INIT(:)/(ZRWETG_INIT(:)+ZRDRYG_INIT(:)) + END WHERE +ENDIF + +DO JL=1, KSIZE + !Aggregated minus collected + PRRWETG(JL)=-PWETG(JL) * (PRG_TEND(JL, IRIWETG)+PRG_TEND(JL, IRSWETG)+& + &PRG_TEND(JL, IRCDRYG)-ZRWETG_INIT(JL)) + PRCWETG(JL)=PWETG(JL) * PRG_TEND(JL, IRCDRYG) + PRIWETG(JL)=PWETG(JL) * PRG_TEND(JL, IRIWETG) + PRSWETG(JL)=PWETG(JL) * PRG_TEND(JL, IRSWETG) + + PRCDRYG(JL)=ZDRYG(JL) * PRG_TEND(JL, IRCDRYG) + PRRDRYG(JL)=ZDRYG(JL) * PRG_TEND(JL, IRRDRYG) + PRIDRYG(JL)=ZDRYG(JL) * PRG_TEND(JL, IRIDRYG) + PRSDRYG(JL)=ZDRYG(JL) * PRG_TEND(JL, IRSDRYG) + + PA_RC(JL) = PA_RC(JL) - PRCWETG(JL) + PA_RI(JL) = PA_RI(JL) - PRIWETG(JL) + PA_RS(JL) = PA_RS(JL) - PRSWETG(JL) + PA_RG(JL) = PA_RG(JL) + PRCWETG(JL) + PRIWETG(JL) + PRSWETG(JL) + PRRWETG(JL) + PA_RR(JL) = PA_RR(JL) - PRRWETG(JL) + PA_TH(JL) = PA_TH(JL) + (PRCWETG(JL) + PRRWETG(JL))*(PLSFACT(JL)-PLVFACT(JL)) + PA_RG(JL) = PA_RG(JL) - PRWETGH(JL) + PA_RH(JL) = PA_RH(JL) + PRWETGH(JL) + PB_RG(JL) = PB_RG(JL) - PRWETGH_MR(JL) + PB_RH(JL) = PB_RH(JL) + PRWETGH_MR(JL) + PA_RC(JL) = PA_RC(JL) - PRCDRYG(JL) + PA_RI(JL) = PA_RI(JL) - PRIDRYG(JL) + PA_RS(JL) = PA_RS(JL) - PRSDRYG(JL) + PA_RR(JL) = PA_RR(JL) - PRRDRYG(JL) + PA_RG(JL) = PA_RG(JL) + PRCDRYG(JL) + PRIDRYG(JL) + PRSDRYG(JL) + PRRDRYG(JL) + PA_TH(JL) = PA_TH(JL) + (PRCDRYG(JL)+PRRDRYG(JL))*(PLSFACT(JL)-PLVFACT(JL)) +ENDDO +! +!* 6.5 Melting of the graupeln +! +DO JL=1, KSIZE + ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(6)-PRGT(JL))) * & ! WHERE(PRGT(:)>XRTMIN(6)) + &MAX(0., -SIGN(1., XTT-PT(JL))) * & ! WHERE(PT(:)>XTT) + &PCOMPUTE(JL) +ENDDO +IF(LDSOFT) THEN + DO JL=1, KSIZE + PRGMLTR(JL)=ZMASK(JL) * PRGMLTR(JL) + ENDDO +ELSE + DO JL=1, KSIZE + PRGMLTR(JL)=ZMASK(JL) * PRVT(JL)*PPRES(JL)/(XEPSILO+PRVT(JL)) ! Vapor pressure + ENDDO + IF(LEVLIMIT) THEN + WHERE(ZMASK(:)==1.) + PRGMLTR(:)=MIN(PRGMLTR(:), EXP(XALPW-XBETAW/PT(:)-XGAMW*ALOG(PT(:)))) ! min(ev, es_w(T)) + END WHERE + ENDIF + DO JL=1, KSIZE + PRGMLTR(JL)=ZMASK(JL) * (PKA(JL)*(XTT-PT(JL)) + & + ( PDV(JL)*(XLVTT + ( XCPV - XCL ) * ( PT(JL) - XTT )) & + *(XESTT-PRGMLTR(JL))/(XRV*PT(JL)) )) + ENDDO + WHERE(ZMASK(:)==1.) + ! + ! compute RGMLTR + ! + PRGMLTR(:) = MAX( 0.0,( -PRGMLTR(:) * & + ( X0DEPG* PLBDAG(:)**XEX0DEPG + & + X1DEPG*PCJ(:)*PLBDAG(:)**XEX1DEPG ) - & + ( PRG_TEND(:, IRCDRYG)+PRG_TEND(:, IRRDRYG) ) * & + ( PRHODREF(:)*XCL*(XTT-PT(:))) ) / & + ( PRHODREF(:)*XLMTT ) ) + END WHERE +ENDIF +DO JL=1, KSIZE + PA_RR(JL) = PA_RR(JL) + PRGMLTR(JL) + PA_RG(JL) = PA_RG(JL) - PRGMLTR(JL) + PA_TH(JL) = PA_TH(JL) - PRGMLTR(JL)*(PLSFACT(JL)-PLVFACT(JL)) +ENDDO +! +END SUBROUTINE ICE4_FAST_RG diff --git a/src/mesonh/micro/ice4_fast_rh.f90 b/src/mesonh/micro/ice4_fast_rh.f90 new file mode 100644 index 000000000..fcac93748 --- /dev/null +++ b/src/mesonh/micro/ice4_fast_rh.f90 @@ -0,0 +1,593 @@ +!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +MODULE MODI_ICE4_FAST_RH +INTERFACE +SUBROUTINE ICE4_FAST_RH(KSIZE, LDSOFT, PCOMPUTE, PWETG, & + &PRHODREF, PLVFACT, PLSFACT, PPRES, & + &PDV, PKA, PCJ, & + &PLBDAS, PLBDAG, PLBDAR, PLBDAH, & + &PT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, PRHT, & + &PRCWETH, PRIWETH, PRSWETH, PRGWETH, PRRWETH, & + &PRCDRYH, PRIDRYH, PRSDRYH, PRRDRYH, PRGDRYH, PRDRYHG, PRHMLTR, & + &PRH_TEND, & + &PA_TH, PA_RC, PA_RR, PA_RI, PA_RS, PA_RG, PA_RH) +IMPLICIT NONE +INTEGER, INTENT(IN) :: KSIZE +LOGICAL, INTENT(IN) :: LDSOFT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE +REAL, DIMENSION(KSIZE), INTENT(IN) :: PWETG ! 1. where graupel grows in wet mode, 0. elsewhere +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLVFACT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLSFACT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PPRES ! absolute pressure at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PDV ! Diffusivity of water vapor in the air +REAL, DIMENSION(KSIZE), INTENT(IN) :: PKA ! Thermal conductivity of the air +REAL, DIMENSION(KSIZE), INTENT(IN) :: PCJ ! Function to compute the ventilation coefficient +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAS ! Slope parameter of the aggregate distribution +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAG ! Slope parameter of the graupel distribution +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAR ! Slope parameter of the rain distribution +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAH ! Slope parameter of the hail distribution +REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRRT ! Rain m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRIT ! Pristine ice m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRGT ! Graupel m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHT ! Hail m.r. at t +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRCWETH ! Dry growth of hailstone +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRIWETH ! Dry growth of hailstone +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRSWETH ! Dry growth of hailstone +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRGWETH ! Dry growth of hailstone +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRRWETH ! Dry growth of hailstone +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRCDRYH ! Wet growth of hailstone +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRIDRYH ! Wet growth of hailstone +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRSDRYH ! Wet growth of hailstone +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRRDRYH ! Wet growth of hailstone +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRGDRYH ! Wet growth of hailstone +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRDRYHG ! Conversion of hailstone into graupel +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRHMLTR ! Melting of the hailstones +REAL, DIMENSION(KSIZE, 10), INTENT(INOUT) :: PRH_TEND ! Individual tendencies +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_TH +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RC +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RR +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RI +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RS +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RG +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RH +END SUBROUTINE ICE4_FAST_RH +END INTERFACE +END MODULE MODI_ICE4_FAST_RH +SUBROUTINE ICE4_FAST_RH(KSIZE, LDSOFT, PCOMPUTE, PWETG, & + &PRHODREF, PLVFACT, PLSFACT, PPRES, & + &PDV, PKA, PCJ, & + &PLBDAS, PLBDAG, PLBDAR, PLBDAH, & + &PT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, PRHT, & + &PRCWETH, PRIWETH, PRSWETH, PRGWETH, PRRWETH, & + &PRCDRYH, PRIDRYH, PRSDRYH, PRRDRYH, PRGDRYH, PRDRYHG, PRHMLTR, & + &PRH_TEND, & + &PA_TH, PA_RC, PA_RR, PA_RI, PA_RS, PA_RG, PA_RH) +!! +!!** PURPOSE +!! ------- +!! Computes the fast rh process +!! +!! AUTHOR +!! ------ +!! S. Riette from the splitting of rain_ice source code (nov. 2014) +!! +!! MODIFICATIONS +!! ------------- +!! +! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! P. Wautelet 29/05/2019: remove PACK/UNPACK intrinsics (to get more performance and better OpenACC support) +! +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST, ONLY: XALPI,XALPW,XBETAI,XBETAW,XGAMW,XCI,XCL,XCPV,XESTT,XGAMI,XLMTT,XLVTT,XMD,XMV,XRV,XTT,XEPSILO +USE MODD_PARAM_ICE, ONLY: LCONVHG,LEVLIMIT,LNULLWETH,LWETHPOST +USE MODD_RAIN_ICE_DESCR, ONLY: XBG,XBS,XCEXVT,XCXG,XCXH,XCXS,XDH,XRTMIN +USE MODD_RAIN_ICE_PARAM, ONLY: NWETLBDAG,NWETLBDAH,NWETLBDAR,NWETLBDAS,X0DEPH,X1DEPH,XCOLEXGH,XCOLEXIH,XCOLGH,XCOLIH,XCOLEXSH, & + XCOLSH,XEX0DEPH,XEX1DEPH,XFGWETH,XFRWETH,XFSWETH,XFWETH,XKER_GWETH,XKER_RWETH,XKER_SWETH, & + XLBGWETH1,XLBGWETH2,XLBGWETH3,XLBRWETH1,XLBRWETH2,XLBRWETH3,XLBSWETH1,XLBSWETH2,XLBSWETH3, & + XWETINTP1G,XWETINTP1H,XWETINTP1R,XWETINTP1S,XWETINTP2G,XWETINTP2H,XWETINTP2R,XWETINTP2S +! +USE MODE_MPPDB +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +INTEGER, INTENT(IN) :: KSIZE +LOGICAL, INTENT(IN) :: LDSOFT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE +REAL, DIMENSION(KSIZE), INTENT(IN) :: PWETG ! 1. where graupel grows in wet mode, 0. elsewhere +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLVFACT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLSFACT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PPRES ! absolute pressure at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PDV ! Diffusivity of water vapor in the air +REAL, DIMENSION(KSIZE), INTENT(IN) :: PKA ! Thermal conductivity of the air +REAL, DIMENSION(KSIZE), INTENT(IN) :: PCJ ! Function to compute the ventilation coefficient +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAS ! Slope parameter of the aggregate distribution +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAG ! Slope parameter of the graupel distribution +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAR ! Slope parameter of the rain distribution +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAH ! Slope parameter of the hail distribution +REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRRT ! Rain m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRIT ! Pristine ice m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRGT ! Graupel m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHT ! Hail m.r. at t +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRCWETH ! Dry growth of hailstone +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRIWETH ! Dry growth of hailstone +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRSWETH ! Dry growth of hailstone +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRGWETH ! Dry growth of hailstone +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRRWETH ! Dry growth of hailstone +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRCDRYH ! Wet growth of hailstone +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRIDRYH ! Wet growth of hailstone +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRSDRYH ! Wet growth of hailstone +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRRDRYH ! Wet growth of hailstone +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRGDRYH ! Wet growth of hailstone +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRDRYHG ! Conversion of hailstone into graupel +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRHMLTR ! Melting of the hailstones +REAL, DIMENSION(KSIZE, 10), INTENT(INOUT) :: PRH_TEND ! Individual tendencies +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_TH +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RC +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RR +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RI +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RS +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RG +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RH +! +!* 0.2 declaration of local variables +! +INTEGER, PARAMETER :: IRCWETH=1, IRRWETH=2, IRIDRYH=3, IRIWETH=4, IRSDRYH=5, IRSWETH=6, IRGDRYH=7, IRGWETH=8, & + & IFREEZ1=9, IFREEZ2=10 +! +LOGICAL, DIMENSION(KSIZE) :: GWET +REAL, DIMENSION(KSIZE) :: ZHAIL, ZWET, ZMASK, ZWETH, ZDRYH +INTEGER :: IHAIL, IGWET +INTEGER, DIMENSION(KSIZE) :: I1 +REAL, DIMENSION(KSIZE) :: ZVEC1, ZVEC2, ZVEC3 +INTEGER, DIMENSION(KSIZE) :: IVEC1, IVEC2 +REAL, DIMENSION(KSIZE) :: ZZW, & + ZRDRYH_INIT, ZRWETH_INIT, & + ZRDRYHG +INTEGER :: JJ, JL +! +!------------------------------------------------------------------------------- +! +! +!* 7.2 compute the Wet and Dry growth of hail +! +DO JL=1, KSIZE + ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(7)-PRHT(JL))) * & ! WHERE(PRHT(:)>XRTMIN(7)) + &MAX(0., -SIGN(1., XRTMIN(2)-PRCT(JL))) * & ! WHERE(PRCT(:)>XRTMIN(2)) + &PCOMPUTE(JL) +ENDDO +IF(LDSOFT) THEN + DO JL=1, KSIZE + PRH_TEND(JL, IRCWETH)=ZMASK(JL) * PRH_TEND(JL, IRCWETH) + ENDDO +ELSE + PRH_TEND(:, IRCWETH)=0. + WHERE(ZMASK(:)==1.) + ZZW(:) = PLBDAH(:)**(XCXH-XDH-2.0) * PRHODREF(:)**(-XCEXVT) + PRH_TEND(:, IRCWETH)=XFWETH * PRCT(:) * ZZW(:) ! RCWETH + END WHERE +ENDIF +DO JL=1, KSIZE + ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(7)-PRHT(JL))) * & ! WHERE(PRHT(:)>XRTMIN(7)) + &MAX(0., -SIGN(1., XRTMIN(4)-PRIT(JL))) * & ! WHERE(PRIT(:)>XRTMIN(4)) + &PCOMPUTE(JL) +ENDDO +IF(LDSOFT) THEN + DO JL=1, KSIZE + PRH_TEND(JL, IRIWETH)=ZMASK(JL) * PRH_TEND(JL, IRIWETH) + PRH_TEND(JL, IRIDRYH)=ZMASK(JL) * PRH_TEND(JL, IRIDRYH) + ENDDO +ELSE + PRH_TEND(:, IRIWETH)=0. + PRH_TEND(:, IRIDRYH)=0. + WHERE(ZMASK(:)==1.) + ZZW(:) = PLBDAH(:)**(XCXH-XDH-2.0) * PRHODREF(:)**(-XCEXVT) + PRH_TEND(:, IRIWETH)=XFWETH * PRIT(:) * ZZW(:) ! RIWETH + PRH_TEND(:, IRIDRYH)=PRH_TEND(:, IRIWETH)*(XCOLIH*EXP(XCOLEXIH*(PT(:)-XTT))) ! RIDRYH + END WHERE +ENDIF + +! +!* 7.2.1 accretion of aggregates on the hailstones +! +IGWET = 0 +DO JJ = 1, SIZE(GWET) + ZWET(JJ) = MAX(0., -SIGN(1., XRTMIN(7)-PRHT(JJ))) * & ! WHERE(PRHT(:)>XRTMIN(7)) + &MAX(0., -SIGN(1., XRTMIN(5)-PRST(JJ))) * & ! WHERE(PRST(:)>XRTMIN(5)) + &PCOMPUTE(JJ) + IF (ZWET(JJ)>0) THEN + IGWET = IGWET + 1 + I1(IGWET) = JJ + GWET(JJ) = .TRUE. + ELSE + GWET(JJ) = .FALSE. + END IF +END DO + +IF(LDSOFT) THEN + DO JL=1, KSIZE + PRH_TEND(JL, IRSWETH)=ZWET(JL) * PRH_TEND(JL, IRSWETH) + PRH_TEND(JL, IRSDRYH)=ZWET(JL) * PRH_TEND(JL, IRSDRYH) + ENDDO +ELSE + PRH_TEND(:, IRSWETH)=0. + PRH_TEND(:, IRSDRYH)=0. + IF(IGWET>0)THEN + ! + !* 7.2.3 select the (PLBDAH,PLBDAS) couplet + ! + DO JJ = 1, IGWET + ZVEC1(JJ) = PLBDAH(I1(JJ)) + ZVEC2(JJ) = PLBDAS(I1(JJ)) + END DO + ! + !* 7.2.4 find the next lower indice for the PLBDAG and for the PLBDAS + ! in the geometrical set of (Lbda_h,Lbda_s) couplet use to + ! tabulate the SWETH-kernel + ! + ZVEC1(1:IGWET) = MAX( 1.00001, MIN( REAL(NWETLBDAH)-0.00001, & + XWETINTP1H * LOG( ZVEC1(1:IGWET) ) + XWETINTP2H ) ) + IVEC1(1:IGWET) = INT( ZVEC1(1:IGWET) ) + ZVEC1(1:IGWET) = ZVEC1(1:IGWET) - REAL( IVEC1(1:IGWET) ) + ! + ZVEC2(1:IGWET) = MAX( 1.00001, MIN( REAL(NWETLBDAS)-0.00001, & + XWETINTP1S * LOG( ZVEC2(1:IGWET) ) + XWETINTP2S ) ) + IVEC2(1:IGWET) = INT( ZVEC2(1:IGWET) ) + ZVEC2(1:IGWET) = ZVEC2(1:IGWET) - REAL( IVEC2(1:IGWET) ) + ! + !* 7.2.5 perform the bilinear interpolation of the normalized + ! SWETH-kernel + ! + DO JJ = 1,IGWET + ZVEC3(JJ) = ( XKER_SWETH(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & + - XKER_SWETH(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + * ZVEC1(JJ) & + - ( XKER_SWETH(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & + - XKER_SWETH(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + * (ZVEC1(JJ) - 1.0) + END DO + ZZW(:) = 0. + DO JJ = 1, IGWET + ZZW(I1(JJ)) = ZVEC3(JJ) + END DO + ! + WHERE(GWET(:)) + PRH_TEND(:, IRSWETH)=XFSWETH*ZZW(:) & ! RSWETH + *( PLBDAS(:)**(XCXS-XBS) )*( PLBDAH(:)**XCXH ) & + *( PRHODREF(:)**(-XCEXVT-1.) ) & + *( XLBSWETH1/( PLBDAH(:)**2 ) + & + XLBSWETH2/( PLBDAH(:) * PLBDAS(:) ) + & + XLBSWETH3/( PLBDAS(:)**2) ) + PRH_TEND(:, IRSDRYH)=PRH_TEND(:, IRSWETH)*(XCOLSH*EXP(XCOLEXSH*(PT(:)-XTT))) + END WHERE + ENDIF +ENDIF +! +!* 7.2.6 accretion of graupeln on the hailstones +! +IGWET = 0 +DO JJ = 1, SIZE(GWET) + ZWET(JJ)=MAX(0., -SIGN(1., XRTMIN(7)-PRHT(JJ))) * & ! WHERE(PRHT(:)>XRTMIN(7)) + &MAX(0., -SIGN(1., XRTMIN(6)-PRGT(JJ))) * & ! WHERE(PRGT(:)>XRTMIN(6)) + &PCOMPUTE(JJ) + IF (ZWET(JJ)>0) THEN + IGWET = IGWET + 1 + I1(IGWET) = JJ + GWET(JJ) = .TRUE. + ELSE + GWET(JJ) = .FALSE. + END IF +END DO + +IF(LDSOFT) THEN + DO JL=1, KSIZE + PRH_TEND(JL, IRGWETH)=ZWET(JL) * PRH_TEND(JL, IRGWETH) + PRH_TEND(JL, IRGDRYH)=ZWET(JL) * PRH_TEND(JL, IRGDRYH) + ENDDO +ELSE + PRH_TEND(:, IRGWETH)=0. + PRH_TEND(:, IRGDRYH)=0. + IF(IGWET>0)THEN + ! + !* 7.2.8 select the (PLBDAH,PLBDAG) couplet + ! + DO JJ = 1, IGWET + ZVEC1(JJ) = PLBDAH(I1(JJ)) + ZVEC2(JJ) = PLBDAG(I1(JJ)) + END DO + ! + !* 7.2.9 find the next lower indice for the PLBDAH and for the PLBDAG + ! in the geometrical set of (Lbda_h,Lbda_g) couplet use to + ! tabulate the GWETH-kernel + ! + ZVEC1(1:IGWET) = MAX( 1.00001, MIN( REAL(NWETLBDAG)-0.00001, & + XWETINTP1H * LOG( ZVEC1(1:IGWET) ) + XWETINTP2H ) ) + IVEC1(1:IGWET) = INT( ZVEC1(1:IGWET) ) + ZVEC1(1:IGWET) = ZVEC1(1:IGWET) - REAL( IVEC1(1:IGWET) ) + ! + ZVEC2(1:IGWET) = MAX( 1.00001, MIN( REAL(NWETLBDAG)-0.00001, & + XWETINTP1G * LOG( ZVEC2(1:IGWET) ) + XWETINTP2G ) ) + IVEC2(1:IGWET) = INT( ZVEC2(1:IGWET) ) + ZVEC2(1:IGWET) = ZVEC2(1:IGWET) - REAL( IVEC2(1:IGWET) ) + ! + !* 7.2.10 perform the bilinear interpolation of the normalized + ! GWETH-kernel + ! + DO JJ = 1,IGWET + ZVEC3(JJ) = ( XKER_GWETH(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & + - XKER_GWETH(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + * ZVEC1(JJ) & + - ( XKER_GWETH(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & + - XKER_GWETH(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + * (ZVEC1(JJ) - 1.0) + END DO + ZZW(:) = 0. + DO JJ = 1, IGWET + ZZW(I1(JJ)) = ZVEC3(JJ) + END DO + ! + WHERE(GWET(:)) + PRH_TEND(:, IRGWETH)=XFGWETH*ZZW(:) & ! RGWETH + *( PLBDAG(:)**(XCXG-XBG) )*( PLBDAH(:)**XCXH ) & + *( PRHODREF(:)**(-XCEXVT-1.) ) & + *( XLBGWETH1/( PLBDAH(:)**2 ) + & + XLBGWETH2/( PLBDAH(:) * PLBDAG(:) ) + & + XLBGWETH3/( PLBDAG(:)**2) ) + PRH_TEND(:, IRGDRYH)=PRH_TEND(:, IRGWETH) + END WHERE + !When graupel grows in wet mode, graupel is wet (!) and collection efficiency must remain the same + WHERE(GWET(:) .AND. .NOT. PWETG(:)==1.) + PRH_TEND(:, IRGDRYH)=PRH_TEND(:, IRGDRYH)*(XCOLGH*EXP(XCOLEXGH*(PT(:)-XTT))) + END WHERE + END IF +ENDIF +! +!* 7.2.11 accretion of raindrops on the hailstones +! +IGWET = 0 +DO JJ = 1, SIZE(GWET) + ZWET(JJ)=MAX(0., -SIGN(1., XRTMIN(7)-PRHT(JJ))) * & ! WHERE(PRHT(:)>XRTMIN(7)) + &MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JJ))) * & ! WHERE(PRRT(:)>XRTMIN(3)) + &PCOMPUTE(JJ) + IF (ZWET(JJ)>0) THEN + IGWET = IGWET + 1 + I1(IGWET) = JJ + GWET(JJ) = .TRUE. + ELSE + GWET(JJ) = .FALSE. + END IF +END DO + +IF(LDSOFT) THEN + DO JL=1, KSIZE + PRH_TEND(JL, IRRWETH)=ZWET(JL) * PRH_TEND(JL, IRRWETH) + ENDDO +ELSE + PRH_TEND(:, IRRWETH)=0. + IF(IGWET>0)THEN + ! + !* 7.2.12 select the (PLBDAH,PLBDAR) couplet + ! + DO JJ = 1, IGWET + ZVEC1(JJ) = PLBDAH(I1(JJ)) + ZVEC2(JJ) = PLBDAR(I1(JJ)) + END DO + ! + !* 7.2.13 find the next lower indice for the PLBDAH and for the PLBDAR + ! in the geometrical set of (Lbda_h,Lbda_r) couplet use to + ! tabulate the RWETH-kernel + ! + ZVEC1(1:IGWET)=MAX(1.00001, MIN( REAL(NWETLBDAH)-0.00001, & + XWETINTP1H*LOG(ZVEC1(1:IGWET))+XWETINTP2H)) + IVEC1(1:IGWET)=INT(ZVEC1(1:IGWET)) + ZVEC1(1:IGWET)=ZVEC1(1:IGWET)-REAL(IVEC1(1:IGWET)) + ! + ZVEC2(1:IGWET)=MAX(1.00001, MIN( REAL(NWETLBDAR)-0.00001, & + XWETINTP1R*LOG(ZVEC2(1:IGWET))+XWETINTP2R)) + IVEC2(1:IGWET)=INT(ZVEC2(1:IGWET)) + ZVEC2(1:IGWET)=ZVEC2(1:IGWET)-REAL(IVEC2(1:IGWET)) + ! + !* 7.2.14 perform the bilinear interpolation of the normalized + ! RWETH-kernel + ! + DO JJ=1, IGWET + ZVEC3(JJ)= ( XKER_RWETH(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & + - XKER_RWETH(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + * ZVEC1(JJ) & + - ( XKER_RWETH(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & + - XKER_RWETH(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + *(ZVEC1(JJ) - 1.0) + END DO + ZZW(:) = 0. + DO JJ = 1, IGWET + ZZW(I1(JJ)) = ZVEC3(JJ) + END DO + ! + WHERE(GWET(:)) + PRH_TEND(:, IRRWETH) = XFRWETH*ZZW(:) & ! RRWETH + *( PLBDAR(:)**(-4) )*( PLBDAH(:)**XCXH ) & + *( PRHODREF(:)**(-XCEXVT-1.) ) & + *( XLBRWETH1/( PLBDAH(:)**2 ) + & + XLBRWETH2/( PLBDAH(:) * PLBDAR(:) ) + & + XLBRWETH3/( PLBDAR(:)**2) ) + END WHERE + ENDIF +ENDIF +! +DO JL=1, KSIZE + ZRDRYH_INIT(JL)=PRH_TEND(JL, IRCWETH)+PRH_TEND(JL, IRIDRYH)+ & + &PRH_TEND(JL, IRSDRYH)+PRH_TEND(JL, IRRWETH)+PRH_TEND(JL, IRGDRYH) +ENDDO +! +!* 7.3 compute the Wet growth of hail +! +DO JL=1, KSIZE + ZHAIL(JL)=MAX(0., -SIGN(1., XRTMIN(7)-PRHT(JL))) * & ! WHERE(PRHT(:)>XRTMIN(7)) + &PCOMPUTE(JL) +ENDDO +IF(LDSOFT) THEN + DO JL=1, KSIZE + PRH_TEND(JL, IFREEZ1)=ZHAIL(JL) * PRH_TEND(JL, IFREEZ1) + PRH_TEND(JL, IFREEZ2)=ZHAIL(JL) * PRH_TEND(JL, IFREEZ2) + ENDDO +ELSE + DO JL=1, KSIZE + PRH_TEND(JL, IFREEZ1)=PRVT(JL)*PPRES(JL)/(XEPSILO+PRVT(JL)) ! Vapor pressure + ENDDO + IF(LEVLIMIT) THEN + WHERE(ZHAIL(:)==1.) + PRH_TEND(:, IFREEZ1)=MIN(PRH_TEND(:, IFREEZ1), EXP(XALPI-XBETAI/PT(:)-XGAMI*ALOG(PT(:)))) ! min(ev, es_i(T)) + END WHERE + ENDIF + PRH_TEND(:, IFREEZ2)=0. + WHERE(ZHAIL(:)==1.) + PRH_TEND(:, IFREEZ1)=PKA(:)*(XTT-PT(:)) + & + (PDV(:)*(XLVTT+(XCPV-XCL)*(PT(:)-XTT)) & + *(XESTT-PRH_TEND(:, IFREEZ1))/(XRV*PT(:)) ) + PRH_TEND(:, IFREEZ1)=PRH_TEND(:, IFREEZ1)* ( X0DEPH* PLBDAH(:)**XEX0DEPH + & + X1DEPH*PCJ(:)*PLBDAH(:)**XEX1DEPH )/ & + ( PRHODREF(:)*(XLMTT-XCL*(XTT-PT(:))) ) + PRH_TEND(:, IFREEZ2)=(PRHODREF(:)*(XLMTT+(XCI-XCL)*(XTT-PT(:))) ) / & + ( PRHODREF(:)*(XLMTT-XCL*(XTT-PT(:))) ) + END WHERE +ENDIF +DO JL=1, KSIZE + !We must agregate, at least, the cold species + ZRWETH_INIT(JL)=ZHAIL(JL) * MAX(PRH_TEND(JL, IRIWETH)+PRH_TEND(JL, IRSWETH)+PRH_TEND(JL, IRGWETH), & + &MAX(0., PRH_TEND(JL, IFREEZ1) + & + &PRH_TEND(JL, IFREEZ2) * ( & + &PRH_TEND(JL, IRIWETH)+PRH_TEND(JL, IRSWETH)+PRH_TEND(JL, IRGWETH) ))) +ENDDO +! +!* 7.4 Select Wet or Dry case +! +!Wet case +DO JL=1, KSIZE + ZWETH(JL) = ZHAIL(JL) * & + & MAX(0., SIGN(1., MAX(0., ZRDRYH_INIT(JL)-PRH_TEND(JL, IRIDRYH)-PRH_TEND(JL, IRSDRYH)-PRH_TEND(JL, IRGDRYH)) - & + &MAX(0., ZRWETH_INIT(JL)-PRH_TEND(JL, IRIWETH)-PRH_TEND(JL, IRSWETH)-PRH_TEND(JL, IRGWETH)))) +ENDDO +IF(LNULLWETH) THEN + DO JL=1, KSIZE + ZWETH(JL) = ZWETH(JL) * MAX(0., -SIGN(1., -ZRDRYH_INIT(JL))) ! WHERE(ZRDRYH_INIT(:)>0.) + ENDDO +ELSE + DO JL=1, KSIZE + ZWETH(JL) = ZWETH(JL) * MAX(0., -SIGN(1., -ZRWETH_INIT(JL))) ! WHERE(ZRWETH_INIT(:)>0.) + ENDDO +ENDIF +IF(.NOT. LWETHPOST) THEN + DO JL=1, KSIZE + ZWETH(JL) = ZWETH(JL) * MAX(0., -SIGN(1., PT(JL)-XTT)) ! WHERE(PT(:)<XTT) + ENDDO +ENDIF +DO JL=1, KSIZE + ZDRYH(JL) = ZHAIL(JL) * & + & MAX(0., -SIGN(1., PT(JL)-XTT)) * & ! WHERE(PT(:)<XTT) + & MAX(0., -SIGN(1., 1.E-20-ZRDRYH_INIT(JL))) * & !WHERE(ZRDRYH_INIT(:)>0.) + & MAX(0., -SIGN(1., MAX(0., ZRDRYH_INIT(JL)-PRH_TEND(JL, IRIDRYH)-PRH_TEND(JL, IRSDRYH)) - & + &MAX(0., ZRWETH_INIT(JL)-PRH_TEND(JL, IRIWETH)-PRH_TEND(JL, IRSWETH)))) +ENDDO +! +ZRDRYHG(:)=0. +IF(LCONVHG)THEN + WHERE(ZDRYH(:)==1.) + ZRDRYHG(:)=ZRDRYH_INIT(:)*ZRWETH_INIT(:)/(ZRDRYH_INIT(:)+ZRWETH_INIT(:)) + END WHERE +ENDIF +DO JL=1, KSIZE + PRCWETH(JL) = ZWETH(JL) * PRH_TEND(JL, IRCWETH) + PRIWETH(JL) = ZWETH(JL) * PRH_TEND(JL, IRIWETH) + PRSWETH(JL) = ZWETH(JL) * PRH_TEND(JL, IRSWETH) + PRGWETH(JL) = ZWETH(JL) * PRH_TEND(JL, IRGWETH) + !Collected minus aggregated + PRRWETH(JL) = ZWETH(JL) * (ZRWETH_INIT(JL) - PRH_TEND(JL, IRIWETH) - & + PRH_TEND(JL, IRSWETH) - PRH_TEND(JL, IRGWETH) - & + PRH_TEND(JL, IRCWETH)) + + PRCDRYH(JL) = ZDRYH(JL) * PRH_TEND(JL, IRCWETH) + PRIDRYH(JL) = ZDRYH(JL) * PRH_TEND(JL, IRIDRYH) + PRSDRYH(JL) = ZDRYH(JL) * PRH_TEND(JL, IRSDRYH) + PRRDRYH(JL) = ZDRYH(JL) * PRH_TEND(JL, IRRWETH) + PRGDRYH(JL) = ZDRYH(JL) * PRH_TEND(JL, IRGDRYH) + PRDRYHG(JL) = ZDRYH(JL) * ZRDRYHG(JL) + + PA_RC(JL) = PA_RC(JL) - PRCWETH(JL) + PA_RI(JL) = PA_RI(JL) - PRIWETH(JL) + PA_RS(JL) = PA_RS(JL) - PRSWETH(JL) + PA_RG(JL) = PA_RG(JL) - PRGWETH(JL) + PA_RH(JL) = PA_RH(JL) + PRCWETH(JL)+PRIWETH(JL)+PRSWETH(JL)+PRGWETH(JL)+PRRWETH(JL) + PA_RR(JL) = PA_RR(JL) - PRRWETH(JL) + PA_TH(JL) = PA_TH(JL) + (PRRWETH(JL)+PRCWETH(JL))*(PLSFACT(JL)-PLVFACT(JL)) + PA_RC(JL) = PA_RC(JL) - PRCDRYH(JL) + PA_RI(JL) = PA_RI(JL) - PRIDRYH(JL) + PA_RS(JL) = PA_RS(JL) - PRSDRYH(JL) + PA_RR(JL) = PA_RR(JL) - PRRDRYH(JL) + PA_RG(JL) = PA_RG(JL) - PRGDRYH(JL) + PRDRYHG(JL) + PA_RH(JL) = PA_RH(JL) + PRCDRYH(JL)+PRIDRYH(JL)+PRSDRYH(JL)+& + &PRRDRYH(JL)+PRGDRYH(JL) - PRDRYHG(JL) + PA_TH(JL) = PA_TH(JL) + (PRCDRYH(JL)+PRRDRYH(JL))*(PLSFACT(JL)-PLVFACT(JL)) +ENDDO +! +!* 7.5 Melting of the hailstones +! +DO JL=1, KSIZE + ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(7)-PRHT(JL))) * & ! WHERE(PRHT(:)>XRTMIN(7)) + &MAX(0., -SIGN(1., XTT-PT(JL))) * & ! WHERE(PT(:)>XTT) + &PCOMPUTE(JL) +ENDDO +IF(LDSOFT) THEN + DO JL=1, KSIZE + PRHMLTR(JL)=ZMASK(JL)*PRHMLTR(JL) + ENDDO +ELSE + DO JL=1, KSIZE + PRHMLTR(JL) = ZMASK(JL)* PRVT(JL)*PPRES(JL)/(XEPSILO+PRVT(JL)) ! Vapor pressure + ENDDO + IF(LEVLIMIT) THEN + WHERE(ZMASK(:)==1.) + PRHMLTR(:)=MIN(PRHMLTR(:), EXP(XALPW-XBETAW/PT(:)-XGAMW*ALOG(PT(:)))) ! min(ev, es_w(T)) + END WHERE + ENDIF + DO JL=1, KSIZE + PRHMLTR(JL) = ZMASK(JL)* (PKA(JL)*(XTT-PT(JL)) + & + ( PDV(JL)*(XLVTT + ( XCPV - XCL ) * ( PT(JL) - XTT )) & + *(XESTT-PRHMLTR(JL))/(XRV*PT(JL)) )) + ENDDO + WHERE(ZMASK(:)==1.) + ! + ! compute RHMLTR + ! + PRHMLTR(:) = MAX( 0.0,( -PRHMLTR(:) * & + ( X0DEPH* PLBDAH(:)**XEX0DEPH + & + X1DEPH*PCJ(:)*PLBDAH(:)**XEX1DEPH ) - & + ( PRH_TEND(:, IRCWETH)+PRH_TEND(:, IRRWETH) )* & + ( PRHODREF(:)*XCL*(XTT-PT(:))) ) / & + ( PRHODREF(:)*XLMTT ) ) + END WHERE +END IF +DO JL=1, KSIZE + PA_RR(JL) = PA_RR(JL) + PRHMLTR(JL) + PA_RH(JL) = PA_RH(JL) - PRHMLTR(JL) + PA_TH(JL) = PA_TH(JL) - PRHMLTR(JL)*(PLSFACT(JL)-PLVFACT(JL)) +ENDDO +! +! +END SUBROUTINE ICE4_FAST_RH diff --git a/src/mesonh/micro/ice4_fast_ri.f90 b/src/mesonh/micro/ice4_fast_ri.f90 new file mode 100644 index 000000000..bbe45f579 --- /dev/null +++ b/src/mesonh/micro/ice4_fast_ri.f90 @@ -0,0 +1,129 @@ +!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!------------------------------------------------------------------------------- +MODULE MODI_ICE4_FAST_RI +INTERFACE +SUBROUTINE ICE4_FAST_RI(KSIZE, LDSOFT, PCOMPUTE, & + &PRHODREF, PLVFACT, PLSFACT, & + &PAI, PCJ, PCIT, & + &PSSI, & + &PRCT, PRIT, & + &PRCBERI, PA_TH, PA_RC, PA_RI) +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_RAIN_ICE_PARAM +USE MODD_RAIN_ICE_DESCR +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +INTEGER, INTENT(IN) :: KSIZE +LOGICAL, INTENT(IN) :: LDSOFT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLVFACT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLSFACT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PAI ! Thermodynamical function +REAL, DIMENSION(KSIZE), INTENT(IN) :: PCJ ! Function to compute the ventilation coefficient +REAL, DIMENSION(KSIZE), INTENT(IN) :: PCIT ! Pristine ice conc. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PSSI ! Supersaturation over ice +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRIT ! Pristine ice m.r. at t +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCBERI ! Bergeron-Findeisen effect +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_TH +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RC +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RI +END SUBROUTINE ICE4_FAST_RI +END INTERFACE +END MODULE MODI_ICE4_FAST_RI +SUBROUTINE ICE4_FAST_RI(KSIZE, LDSOFT, PCOMPUTE, & + &PRHODREF, PLVFACT, PLSFACT, & + &PAI, PCJ, PCIT, & + &PSSI, & + &PRCT, PRIT, & + &PRCBERI, PA_TH, PA_RC, PA_RI) +!! +!!** PURPOSE +!! ------- +!! Computes the fast ri process +!! +!! AUTHOR +!! ------ +!! S. Riette from the splitting of rain_ice source code (nov. 2014) +!! +!! MODIFICATIONS +!! ------------- +!! +! +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_RAIN_ICE_DESCR, ONLY: XDI,XLBEXI,XLBI,XRTMIN +USE MODD_RAIN_ICE_PARAM, ONLY: X0DEPI,X2DEPI +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +INTEGER, INTENT(IN) :: KSIZE +LOGICAL, INTENT(IN) :: LDSOFT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLVFACT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLSFACT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PAI ! Thermodynamical function +REAL, DIMENSION(KSIZE), INTENT(IN) :: PCJ ! Function to compute the ventilation coefficient +REAL, DIMENSION(KSIZE), INTENT(IN) :: PCIT ! Pristine ice conc. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PSSI ! Supersaturation over ice +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRIT ! Pristine ice m.r. at t +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCBERI ! Bergeron-Findeisen effect +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_TH +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RC +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RI +! +!* 0.2 declaration of local variables +! +REAL, DIMENSION(KSIZE) :: ZMASK +INTEGER :: JL +! +!------------------------------------------------------------------------------- +! +!------------------------------------------------------------------------------- +! +!* 7.2 Bergeron-Findeisen effect: RCBERI +! +DO JL=1, KSIZE + ZMASK(JL)=MAX(0., -SIGN(1., -PSSI(JL))) * & ! PSSI(:)>0. + &MAX(0., -SIGN(1., XRTMIN(2)-PRCT(JL))) * & ! PRCT(:)>XRTMIN(2) + &MAX(0., -SIGN(1., XRTMIN(4)-PRIT(JL))) * & ! PRIT(:)>XRTMIN(4) + &MAX(0., -SIGN(1., 1.E-20-PCIT(JL))) * & ! PCIT(:)>0. + &PCOMPUTE(JL) +ENDDO +IF(LDSOFT) THEN + DO JL=1, KSIZE + PRCBERI(JL) = PRCBERI(JL) * ZMASK(JL) + ENDDO +ELSE + PRCBERI(:) = 0. + WHERE(ZMASK(:)==1.) + PRCBERI(:) = MIN(1.E8, XLBI*(PRHODREF(:)*PRIT(:)/PCIT(:))**XLBEXI) ! Lbda_i + PRCBERI(:) = ( PSSI(:) / (PRHODREF(:)*PAI(:)) ) * PCIT(:) * & + ( X0DEPI/PRCBERI(:) + X2DEPI*PCJ(:)*PCJ(:)/PRCBERI(:)**(XDI+2.0) ) + END WHERE +ENDIF +DO JL=1, KSIZE + PA_RC(JL) = PA_RC(JL) - PRCBERI(JL) + PA_RI(JL) = PA_RI(JL) + PRCBERI(JL) + PA_TH(JL) = PA_TH(JL) + PRCBERI(JL)*(PLSFACT(JL)-PLVFACT(JL)) +ENDDO +! +! +END SUBROUTINE ICE4_FAST_RI diff --git a/src/mesonh/micro/ice4_fast_rs.f90 b/src/mesonh/micro/ice4_fast_rs.f90 new file mode 100644 index 000000000..6d71c7b61 --- /dev/null +++ b/src/mesonh/micro/ice4_fast_rs.f90 @@ -0,0 +1,521 @@ +!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +MODULE MODI_ICE4_FAST_RS +INTERFACE +SUBROUTINE ICE4_FAST_RS(KSIZE, LDSOFT, PCOMPUTE, & + &PRHODREF, PLVFACT, PLSFACT, PPRES, & + &PDV, PKA, PCJ, & + &PLBDAR, PLBDAS, & + &PT, PRVT, PRCT, PRRT, PRST, & + &PRIAGGS, & + &PRCRIMSS, PRCRIMSG, PRSRIMCG, & + &PRRACCSS, PRRACCSG, PRSACCRG, PRSMLTG, & + &PRCMLTSR, & + &PRS_TEND, & + &PA_TH, PA_RC, PA_RR, PA_RS, PA_RG) +IMPLICIT NONE +INTEGER, INTENT(IN) :: KSIZE +LOGICAL, INTENT(IN) :: LDSOFT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLVFACT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLSFACT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PPRES ! absolute pressure at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PDV ! Diffusivity of water vapor in the air +REAL, DIMENSION(KSIZE), INTENT(IN) :: PKA ! Thermal conductivity of the air +REAL, DIMENSION(KSIZE), INTENT(IN) :: PCJ ! Function to compute the ventilation coefficient +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAR ! Slope parameter of the raindrop distribution +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAS ! Slope parameter of the aggregate distribution +REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRIAGGS ! r_i aggregation on r_s +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRCRIMSS ! Cloud droplet riming of the aggregates +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRCRIMSG ! Cloud droplet riming of the aggregates +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRSRIMCG ! Cloud droplet riming of the aggregates +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRRACCSS ! Rain accretion onto the aggregates +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRRACCSG ! Rain accretion onto the aggregates +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRSACCRG ! Rain accretion onto the aggregates +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRSMLTG ! Conversion-Melting of the aggregates +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCMLTSR ! Cloud droplet collection onto aggregates by positive temperature +REAL, DIMENSION(KSIZE, 8), INTENT(INOUT) :: PRS_TEND ! Individual tendencies +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_TH +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RC +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RR +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RS +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RG +END SUBROUTINE ICE4_FAST_RS +END INTERFACE +END MODULE MODI_ICE4_FAST_RS +SUBROUTINE ICE4_FAST_RS(KSIZE, LDSOFT, PCOMPUTE, & + &PRHODREF, PLVFACT, PLSFACT, PPRES, & + &PDV, PKA, PCJ, & + &PLBDAR, PLBDAS, & + &PT, PRVT, PRCT, PRRT, PRST, & + &PRIAGGS, & + &PRCRIMSS, PRCRIMSG, PRSRIMCG, & + &PRRACCSS, PRRACCSG, PRSACCRG, PRSMLTG, & + &PRCMLTSR, & + &PRS_TEND, & + &PA_TH, PA_RC, PA_RR, PA_RS, PA_RG) +!! +!!** PURPOSE +!! ------- +!! Computes the fast rs processes +!! +!! AUTHOR +!! ------ +!! S. Riette from the splitting of rain_ice source code (nov. 2014) +!! +!! MODIFICATIONS +!! ------------- +!! +! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! P. Wautelet 29/05/2019: remove PACK/UNPACK intrinsics (to get more performance and better OpenACC support) +! +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST, ONLY: XALPI,XALPW,XBETAI,XBETAW,XCI,XCL,XCPV,XESTT,XGAMI,XGAMW,XLMTT,XLVTT,XMD,XMV,XRV,XTT, & + XEPSILO +USE MODD_PARAM_ICE, ONLY: LEVLIMIT, CSNOWRIMING +USE MODD_RAIN_ICE_DESCR, ONLY: XBS,XCEXVT,XCXS,XRTMIN +USE MODD_RAIN_ICE_PARAM, ONLY: NACCLBDAR,NACCLBDAS,NGAMINC,X0DEPS,X1DEPS,XACCINTP1R,XACCINTP1S,XACCINTP2R,XACCINTP2S, & + XCRIMSG,XCRIMSS,XEX0DEPS,XEX1DEPS,XEXCRIMSG,XEXCRIMSS,XEXSRIMCG,XEXSRIMCG2,XFRACCSS, & + XFSACCRG,XFSCVMG,XGAMINC_RIM1,XGAMINC_RIM1,XGAMINC_RIM2,XGAMINC_RIM4,XKER_RACCS, & + XKER_RACCSS,XKER_SACCRG,XLBRACCS1,XLBRACCS2,XLBRACCS3,XLBSACCR1,XLBSACCR2,XLBSACCR3, & + XRIMINTP1,XRIMINTP2,XSRIMCG,XSRIMCG2,XSRIMCG3 +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +INTEGER, INTENT(IN) :: KSIZE +LOGICAL, INTENT(IN) :: LDSOFT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLVFACT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLSFACT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PPRES ! absolute pressure at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PDV ! Diffusivity of water vapor in the air +REAL, DIMENSION(KSIZE), INTENT(IN) :: PKA ! Thermal conductivity of the air +REAL, DIMENSION(KSIZE), INTENT(IN) :: PCJ ! Function to compute the ventilation coefficient +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAR ! Slope parameter of the raindrop distribution +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAS ! Slope parameter of the aggregate distribution +REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRIAGGS ! r_i aggregation on r_s +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRCRIMSS ! Cloud droplet riming of the aggregates +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRCRIMSG ! Cloud droplet riming of the aggregates +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRSRIMCG ! Cloud droplet riming of the aggregates +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRRACCSS ! Rain accretion onto the aggregates +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRRACCSG ! Rain accretion onto the aggregates +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRSACCRG ! Rain accretion onto the aggregates +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRSMLTG ! Conversion-Melting of the aggregates +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCMLTSR ! Cloud droplet collection onto aggregates by positive temperature +REAL, DIMENSION(KSIZE, 8), INTENT(INOUT) :: PRS_TEND ! Individual tendencies +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_TH +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RC +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RR +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RS +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RG +! +!* 0.2 declaration of local variables +! +INTEGER, PARAMETER :: IRCRIMS=1, IRCRIMSS=2, IRSRIMCG=3, IRRACCS=4, IRRACCSS=5, IRSACCRG=6, & + & IFREEZ1=7, IFREEZ2=8 +! +REAL, DIMENSION(KSIZE) :: ZRIM, ZACC, ZMASK +LOGICAL, DIMENSION(KSIZE) :: GRIM, GACC +INTEGER :: IGRIM, IGACC +INTEGER, DIMENSION(KSIZE) :: I1 +REAL, DIMENSION(KSIZE) :: ZVEC1, ZVEC2, ZVEC3 +INTEGER, DIMENSION(KSIZE) :: IVEC1, IVEC2 +REAL, DIMENSION(KSIZE) :: ZZW, ZZW2, ZZW6, ZFREEZ_RATE +INTEGER :: JJ, JL +!------------------------------------------------------------------------------- +! +! +!* 5.0 maximum freezing rate +! +DO JL=1, KSIZE + ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(5)-PRST(JL))) * & ! WHERE(PRST(:)>XRTMIN(5)) + &PCOMPUTE(JL) +ENDDO +IF(LDSOFT) THEN + DO JL=1, KSIZE + PRS_TEND(JL, IFREEZ1)=ZMASK(JL) * PRS_TEND(JL, IFREEZ1) + PRS_TEND(JL, IFREEZ2)=ZMASK(JL) * PRS_TEND(JL, IFREEZ2) + ENDDO +ELSE + DO JL=1, KSIZE + PRS_TEND(JL, IFREEZ1)=ZMASK(JL) * PRVT(JL)*PPRES(JL)/(XEPSILO+PRVT(JL)) ! Vapor pressure + ENDDO + IF(LEVLIMIT) THEN + WHERE(ZMASK(:)==1.) + PRS_TEND(:, IFREEZ1)=MIN(PRS_TEND(:, IFREEZ1), EXP(XALPI-XBETAI/PT(:)-XGAMI*ALOG(PT(:)))) ! min(ev, es_i(T)) + END WHERE + ENDIF + PRS_TEND(:, IFREEZ2)=0. + WHERE(ZMASK(:)==1.) + PRS_TEND(:, IFREEZ1)=PKA(:)*(XTT-PT(:)) + & + (PDV(:)*(XLVTT+(XCPV-XCL)*(PT(:)-XTT)) & + *(XESTT-PRS_TEND(:, IFREEZ1))/(XRV*PT(:)) ) + PRS_TEND(:, IFREEZ1)=PRS_TEND(:, IFREEZ1)* ( X0DEPS* PLBDAS(:)**XEX0DEPS + & + X1DEPS*PCJ(:)*PLBDAS(:)**XEX1DEPS )/ & + ( PRHODREF(:)*(XLMTT-XCL*(XTT-PT(:))) ) + PRS_TEND(:, IFREEZ2)=(PRHODREF(:)*(XLMTT+(XCI-XCL)*(XTT-PT(:))) ) / & + ( PRHODREF(:)*(XLMTT-XCL*(XTT-PT(:))) ) + END WHERE +ENDIF +DO JL=1, KSIZE + !We must agregate, at least, the cold species + !And we are only interested by the freezing rate of liquid species + ZFREEZ_RATE(JL)=ZMASK(JL) * MAX(0., MAX(0., PRS_TEND(JL, IFREEZ1) + & + &PRS_TEND(JL, IFREEZ2) * PRIAGGS(JL)) - & + PRIAGGS(JL)) +ENDDO +! +!* 5.1 cloud droplet riming of the aggregates +! +IGRIM = 0 +DO JJ = 1, SIZE(GRIM) + ZRIM(JJ)=MAX(0., -SIGN(1., XRTMIN(2)-PRCT(JJ))) * & !WHERE(PRCT(:)>XRTMIN(2)) + &MAX(0., -SIGN(1., XRTMIN(5)-PRST(JJ))) * & !WHERE(PRST(:)>XRTMIN(5)) + &PCOMPUTE(JJ) + IF (ZRIM(JJ)>0) THEN + IGRIM = IGRIM + 1 + I1(IGRIM) = JJ + GRIM(JJ) = .TRUE. + ELSE + GRIM(JJ) = .FALSE. + END IF +END DO +! +! Collection of cloud droplets by snow: this rate is used for riming (T<0) and for conversion/melting (T>0) +IF(LDSOFT) THEN + DO JL=1, KSIZE + PRS_TEND(JL, IRCRIMS)=ZRIM(JL) * PRS_TEND(JL, IRCRIMS) + PRS_TEND(JL, IRCRIMSS)=ZRIM(JL) * PRS_TEND(JL, IRCRIMSS) + PRS_TEND(JL, IRSRIMCG)=ZRIM(JL) * PRS_TEND(JL, IRSRIMCG) + ENDDO +ELSE + PRS_TEND(:, IRCRIMS)=0. + PRS_TEND(:, IRCRIMSS)=0. + PRS_TEND(:, IRSRIMCG)=0. + ! + IF(IGRIM>0) THEN + ! + ! 5.1.1 select the PLBDAS + ! + DO JJ = 1, IGRIM + ZVEC1(JJ) = PLBDAS(I1(JJ)) + END DO + ! + ! 5.1.2 find the next lower indice for the PLBDAS in the geometrical + ! set of Lbda_s used to tabulate some moments of the incomplete + ! gamma function + ! + ZVEC2(1:IGRIM) = MAX( 1.00001, MIN( REAL(NGAMINC)-0.00001, & + XRIMINTP1 * LOG( ZVEC1(1:IGRIM) ) + XRIMINTP2 ) ) + IVEC2(1:IGRIM) = INT( ZVEC2(1:IGRIM) ) + ZVEC2(1:IGRIM) = ZVEC2(1:IGRIM) - REAL( IVEC2(1:IGRIM) ) + ! + ! 5.1.3 perform the linear interpolation of the normalized + ! "2+XDS"-moment of the incomplete gamma function + ! + ZVEC1(1:IGRIM) = XGAMINC_RIM1( IVEC2(1:IGRIM)+1 )* ZVEC2(1:IGRIM) & + - XGAMINC_RIM1( IVEC2(1:IGRIM) )*(ZVEC2(1:IGRIM) - 1.0) + ZZW(:) = 0. + DO JJ = 1, IGRIM + ZZW(I1(JJ)) = ZVEC1(JJ) + END DO + ! + ! 5.1.4 riming of the small sized aggregates + ! + WHERE (GRIM(:)) + PRS_TEND(:, IRCRIMSS) = XCRIMSS * ZZW(:) * PRCT(:) & ! RCRIMSS + * PLBDAS(:)**XEXCRIMSS & + * PRHODREF(:)**(-XCEXVT) + END WHERE + ! + ! 5.1.5 perform the linear interpolation of the normalized + ! "XBS"-moment of the incomplete gamma function (XGAMINC_RIM2) and + ! "XBG"-moment of the incomplete gamma function (XGAMINC_RIM4) + ! + ZVEC1(1:IGRIM) = XGAMINC_RIM2( IVEC2(1:IGRIM)+1 )* ZVEC2(1:IGRIM) & + - XGAMINC_RIM2( IVEC2(1:IGRIM) )*(ZVEC2(1:IGRIM) - 1.0) + ZZW(:) = 0. + DO JJ = 1, IGRIM + ZZW(I1(JJ)) = ZVEC1(JJ) + END DO + + ZVEC1(1:IGRIM) = XGAMINC_RIM4( IVEC2(1:IGRIM)+1 )* ZVEC2(1:IGRIM) & + - XGAMINC_RIM4( IVEC2(1:IGRIM) )*(ZVEC2(1:IGRIM) - 1.0) + ZZW2(:) = 0. + DO JJ = 1, IGRIM + ZZW2(I1(JJ)) = ZVEC1(JJ) + END DO + ! + ! 5.1.6 riming-conversion of the large sized aggregates into graupeln + ! + ! + WHERE(GRIM(:)) + PRS_TEND(:, IRCRIMS)=XCRIMSG * PRCT(:) & ! RCRIMS + * PLBDAS(:)**XEXCRIMSG & + * PRHODREF(:)**(-XCEXVT) + ZZW6(:) = PRS_TEND(:, IRCRIMS) - PRS_TEND(:, IRCRIMSS) ! RCRIMSG + END WHERE + + IF(CSNOWRIMING=='M90 ')THEN + !Murakami 1990 + WHERE(GRIM(:)) + PRS_TEND(:, IRSRIMCG)=XSRIMCG * PLBDAS(:)**XEXSRIMCG*(1.0-ZZW(:)) + PRS_TEND(:, IRSRIMCG)=ZZW6(:)*PRS_TEND(:, IRSRIMCG)/ & + MAX(1.E-20, & + XSRIMCG3*XSRIMCG2*PLBDAS(:)**XEXSRIMCG2*(1.-ZZW2(:)) - & + XSRIMCG3*PRS_TEND(:, IRSRIMCG)) + END WHERE + ELSE + PRS_TEND(:, IRSRIMCG)=0. + END IF + ENDIF +ENDIF +! +DO JL=1, KSIZE + ! More restrictive RIM mask to be used for riming by negative temperature only + ZRIM(JL)=ZRIM(JL) * & + &MAX(0., -SIGN(1., PT(JL)-XTT)) ! WHERE(PT(:)<XTT) + PRCRIMSS(JL)=ZRIM(JL)*MIN(ZFREEZ_RATE(JL), PRS_TEND(JL, IRCRIMSS)) + ZFREEZ_RATE(JL)=MAX(0., ZFREEZ_RATE(JL)-PRCRIMSS(JL)) + ZZW(JL) = MIN(1., ZFREEZ_RATE(JL) / MAX(1.E-20, PRS_TEND(JL, IRCRIMS) - PRCRIMSS(JL))) ! proportion we are able to freeze + PRCRIMSG(JL) = ZRIM(JL) * ZZW(JL) * MAX(0., PRS_TEND(JL, IRCRIMS) - PRCRIMSS(JL)) ! RCRIMSG + ZFREEZ_RATE(JL)=MAX(0., ZFREEZ_RATE(JL)-PRCRIMSG(JL)) + PRSRIMCG(JL) = ZRIM(JL) * ZZW(JL) * PRS_TEND(JL, IRSRIMCG) + + PRSRIMCG(JL) = PRSRIMCG(JL) * MAX(0., -SIGN(1., -PRCRIMSG(JL))) + PRCRIMSG(JL)=MAX(0., PRCRIMSG(JL)) + + PA_RC(JL) = PA_RC(JL) - PRCRIMSS(JL) + PA_RS(JL) = PA_RS(JL) + PRCRIMSS(JL) + PA_TH(JL) = PA_TH(JL) + PRCRIMSS(JL)*(PLSFACT(JL)-PLVFACT(JL)) + PA_RC(JL) = PA_RC(JL) - PRCRIMSG(JL) + PA_RS(JL) = PA_RS(JL) - PRSRIMCG(JL) + PA_RG(JL) = PA_RG(JL) + PRCRIMSG(JL)+PRSRIMCG(JL) + PA_TH(JL) = PA_TH(JL) + PRCRIMSG(JL)*(PLSFACT(JL)-PLVFACT(JL)) +ENDDO +! +!* 5.2 rain accretion onto the aggregates +! +IGACC = 0 +DO JJ = 1, SIZE(GACC) + ZACC(JJ)=MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JJ))) * & !WHERE(PRRT(:)>XRTMIN(3)) + &MAX(0., -SIGN(1., XRTMIN(5)-PRST(JJ))) * & !WHERE(PRST(:)>XRTMIN(5)) + &PCOMPUTE(JJ) + IF (ZACC(JJ)>0) THEN + IGACC = IGACC + 1 + I1(IGACC) = JJ + GACC(JJ) = .TRUE. + ELSE + GACC(JJ) = .FALSE. + END IF +END DO + +IF(LDSOFT) THEN + DO JL=1, KSIZE + PRS_TEND(JL, IRRACCS)=ZACC(JL) * PRS_TEND(JL, IRRACCS) + PRS_TEND(JL, IRRACCSS)=ZACC(JL) * PRS_TEND(JL, IRRACCSS) + PRS_TEND(JL, IRSACCRG)=ZACC(JL) * PRS_TEND(JL, IRSACCRG) + ENDDO +ELSE + PRS_TEND(:, IRRACCS)=0. + PRS_TEND(:, IRRACCSS)=0. + PRS_TEND(:, IRSACCRG)=0. + IF(IGACC>0)THEN + ! + ! + ! 5.2.1 select the (PLBDAS,PLBDAR) couplet + ! + DO JJ = 1, IGACC + ZVEC1(JJ) = PLBDAS(I1(JJ)) + ZVEC2(JJ) = PLBDAR(I1(JJ)) + END DO + ! + ! 5.2.2 find the next lower indice for the PLBDAS and for the PLBDAR + ! in the geometrical set of (Lbda_s,Lbda_r) couplet use to + ! tabulate the RACCSS-kernel + ! + ZVEC1(1:IGACC) = MAX( 1.00001, MIN( REAL(NACCLBDAS)-0.00001, & + XACCINTP1S * LOG( ZVEC1(1:IGACC) ) + XACCINTP2S ) ) + IVEC1(1:IGACC) = INT( ZVEC1(1:IGACC) ) + ZVEC1(1:IGACC) = ZVEC1(1:IGACC) - REAL( IVEC1(1:IGACC) ) + ! + ZVEC2(1:IGACC) = MAX( 1.00001, MIN( REAL(NACCLBDAR)-0.00001, & + XACCINTP1R * LOG( ZVEC2(1:IGACC) ) + XACCINTP2R ) ) + IVEC2(1:IGACC) = INT( ZVEC2(1:IGACC) ) + ZVEC2(1:IGACC) = ZVEC2(1:IGACC) - REAL( IVEC2(1:IGACC) ) + ! + ! 5.2.3 perform the bilinear interpolation of the normalized + ! RACCSS-kernel + ! + DO JJ = 1, IGACC + ZVEC3(JJ) = ( XKER_RACCSS(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & + - XKER_RACCSS(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + * ZVEC1(JJ) & + - ( XKER_RACCSS(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & + - XKER_RACCSS(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + * (ZVEC1(JJ) - 1.0) + END DO + ZZW(:) = 0. + DO JJ = 1, IGACC + ZZW(I1(JJ)) = ZVEC3(JJ) + END DO + ! + ! 5.2.4 raindrop accretion on the small sized aggregates + ! + WHERE(GACC(:)) + ZZW6(:) = & !! coef of RRACCS + XFRACCSS*( PLBDAS(:)**XCXS )*( PRHODREF(:)**(-XCEXVT-1.) ) & + *( XLBRACCS1/((PLBDAS(:)**2) ) + & + XLBRACCS2/( PLBDAS(:) * PLBDAR(:) ) + & + XLBRACCS3/( (PLBDAR(:)**2)) )/PLBDAR(:)**4 + PRS_TEND(:, IRRACCSS) =ZZW(:)*ZZW6(:) + END WHERE + ! + ! 5.2.4b perform the bilinear interpolation of the normalized + ! RACCS-kernel + ! + DO JJ = 1, IGACC + ZVEC3(JJ) = ( XKER_RACCS(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & + - XKER_RACCS(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + * ZVEC1(JJ) & + - ( XKER_RACCS(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & + - XKER_RACCS(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + * (ZVEC1(JJ) - 1.0) + END DO + ZZW(:) = 0. + DO JJ = 1, IGACC + ZZW(I1(JJ)) = ZVEC3(JJ) + END DO + WHERE(GACC(:)) + PRS_TEND(:, IRRACCS) = ZZW(:)*ZZW6(:) + END WHERE + ! 5.2.5 perform the bilinear interpolation of the normalized + ! SACCRG-kernel + ! + DO JJ = 1, IGACC + ZVEC3(JJ) = ( XKER_SACCRG(IVEC2(JJ)+1,IVEC1(JJ)+1)* ZVEC1(JJ) & + - XKER_SACCRG(IVEC2(JJ)+1,IVEC1(JJ) )*(ZVEC1(JJ) - 1.0) ) & + * ZVEC2(JJ) & + - ( XKER_SACCRG(IVEC2(JJ) ,IVEC1(JJ)+1)* ZVEC1(JJ) & + - XKER_SACCRG(IVEC2(JJ) ,IVEC1(JJ) )*(ZVEC1(JJ) - 1.0) ) & + * (ZVEC2(JJ) - 1.0) + END DO + ZZW(:) = 0. + DO JJ = 1, IGACC + ZZW(I1(JJ)) = ZVEC3(JJ) + END DO + ! + ! 5.2.6 raindrop accretion-conversion of the large sized aggregates + ! into graupeln + ! + WHERE(GACC(:)) + PRS_TEND(:, IRSACCRG) = XFSACCRG*ZZW(:)* & ! RSACCRG + ( PLBDAS(:)**(XCXS-XBS) )*( PRHODREF(:)**(-XCEXVT-1.) ) & + *( XLBSACCR1/((PLBDAR(:)**2) ) + & + XLBSACCR2/( PLBDAR(:) * PLBDAS(:) ) + & + XLBSACCR3/( (PLBDAS(:)**2)) )/PLBDAR(:) + END WHERE + ENDIF +ENDIF +! +DO JL=1, KSIZE + ! More restrictive ACC mask to be used for accretion by negative temperature only + ZACC(JL) = ZACC(JL) * & + &MAX(0., -SIGN(1., PT(JL)-XTT)) ! WHERE(PT(:)<XTT) + PRRACCSS(JL)=ZACC(JL)*MIN(ZFREEZ_RATE(JL), PRS_TEND(JL, IRRACCSS)) + ZFREEZ_RATE(JL)=MAX(0., ZFREEZ_RATE(JL)-PRRACCSS(JL)) + ZZW(JL) = MIN(1., ZFREEZ_RATE(JL) / MAX(1.E-20, PRS_TEND(JL, IRRACCS)-PRRACCSS(JL))) ! proportion we are able to freeze + PRRACCSG(JL)=ZACC(JL)*ZZW(JL) * MAX(0., PRS_TEND(JL, IRRACCS)-PRRACCSS(JL)) + ZFREEZ_RATE(JL) = MAX(0., ZFREEZ_RATE(JL)-PRRACCSG(JL)) + PRSACCRG(JL)=ZACC(JL)*ZZW(JL) * PRS_TEND(JL, IRSACCRG) + + PRSACCRG(JL) = PRSACCRG(JL) * MAX(0., -SIGN(1., -PRRACCSG(JL))) + PRRACCSG(JL)=MAX(0., PRRACCSG(JL)) + + PA_RR(JL) = PA_RR(JL) - PRRACCSS(JL) + PA_RS(JL) = PA_RS(JL) + PRRACCSS(JL) + PA_TH(JL) = PA_TH(JL) + PRRACCSS(JL)*(PLSFACT(JL)-PLVFACT(JL)) + PA_RR(JL) = PA_RR(JL) - PRRACCSG(JL) + PA_RS(JL) = PA_RS(JL) - PRSACCRG(JL) + PA_RG(JL) = PA_RG(JL) + PRRACCSG(JL)+PRSACCRG(JL) + PA_TH(JL) = PA_TH(JL) + PRRACCSG(JL)*(PLSFACT(JL)-PLVFACT(JL)) +ENDDO +! +! +!* 5.3 Conversion-Melting of the aggregates +! +DO JL=1, KSIZE + ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(5)-PRST(JL))) * & ! WHERE(PRST(:)>XRTMIN(5)) + &MAX(0., -SIGN(1., XTT-PT(JL))) * & ! WHERE(PT(:)>XTT) + &PCOMPUTE(JL) +ENDDO +IF(LDSOFT) THEN + DO JL=1, KSIZE + PRSMLTG(JL)=ZMASK(JL)*PRSMLTG(JL) + PRCMLTSR(JL)=ZMASK(JL)*PRCMLTSR(JL) + ENDDO +ELSE + DO JL=1, KSIZE + PRSMLTG(JL)=ZMASK(JL)*PRVT(JL)*PPRES(JL)/(XEPSILO+PRVT(JL)) ! Vapor pressure + ENDDO + IF(LEVLIMIT) THEN + WHERE(ZMASK(:)==1.) + PRSMLTG(:)=MIN(PRSMLTG(:), EXP(XALPW-XBETAW/PT(:)-XGAMW*ALOG(PT(:)))) ! min(ev, es_w(T)) + END WHERE + ENDIF + DO JL=1, KSIZE + PRSMLTG(JL)=ZMASK(JL)*( & + & PKA(JL)*(XTT-PT(JL)) + & + & ( PDV(JL)*(XLVTT + ( XCPV - XCL ) * ( PT(JL) - XTT )) & + & *(XESTT-PRSMLTG(JL))/(XRV*PT(JL)) ) & + &) + ENDDO + PRCMLTSR(:) = 0. + WHERE(ZMASK(:)==1.) + ! + ! compute RSMLT + ! + PRSMLTG(:) = XFSCVMG*MAX( 0.0,( -PRSMLTG(:) * & + ( X0DEPS* PLBDAS(:)**XEX0DEPS + & + X1DEPS*PCJ(:)*PLBDAS(:)**XEX1DEPS ) - & + ( PRS_TEND(:, IRCRIMS) + PRS_TEND(:, IRRACCS) ) * & + ( PRHODREF(:)*XCL*(XTT-PT(:))) ) / & + ( PRHODREF(:)*XLMTT ) ) + ! When T < XTT, rc is collected by snow (riming) to produce snow and graupel + ! When T > XTT, if riming was still enabled, rc would produce snow and graupel with snow becomming graupel (conversion/melting) and graupel becomming rain (melting) + ! To insure consistency when crossing T=XTT, rc collected with T>XTT must be transformed in rain. + ! rc cannot produce iced species with a positive temperature but is still collected with a good efficiency by snow + PRCMLTSR(:) = PRS_TEND(:, IRCRIMS) ! both species are liquid, no heat is exchanged + END WHERE +ENDIF +DO JL=1, KSIZE + ! note that RSCVMG = RSMLT*XFSCVMG but no heat is exchanged (at the rate RSMLT) + ! because the graupeln produced by this process are still icy!!! + PA_RS(JL) = PA_RS(JL) - PRSMLTG(JL) + PA_RG(JL) = PA_RG(JL) + PRSMLTG(JL) + PA_RC(JL) = PA_RC(JL) - PRCMLTSR(JL) + PA_RR(JL) = PA_RR(JL) + PRCMLTSR(JL) +ENDDO + +! +END SUBROUTINE ICE4_FAST_RS diff --git a/src/mesonh/micro/ice4_nucleation.f90 b/src/mesonh/micro/ice4_nucleation.f90 new file mode 100644 index 000000000..98459b317 --- /dev/null +++ b/src/mesonh/micro/ice4_nucleation.f90 @@ -0,0 +1,152 @@ +!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +MODULE MODI_ICE4_NUCLEATION +INTERFACE +SUBROUTINE ICE4_NUCLEATION(KSIZE, ODSOFT, ODCOMPUTE, & + PTHT, PPABST, PRHODREF, PEXN, PLSFACT, PT, & + PRVT, & + PCIT, PRVHENI_MR, PB_TH, PB_RV, PB_RI) +IMPLICIT NONE +INTEGER, INTENT(IN) :: KSIZE +LOGICAL, INTENT(IN) :: ODSOFT +LOGICAL, DIMENSION(KSIZE),INTENT(IN) :: ODCOMPUTE +REAL, DIMENSION(KSIZE), INTENT(IN) :: PTHT ! Theta at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PPABST ! absolute pressure at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(KSIZE), INTENT(IN) :: PEXN ! Exner function +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLSFACT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature at time t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PCIT ! Pristine ice n.c. at t +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRVHENI_MR ! Mixing ratio change due to the heterogeneous nucleation +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_TH +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RV +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RI +END SUBROUTINE ICE4_NUCLEATION +END INTERFACE +END MODULE MODI_ICE4_NUCLEATION +SUBROUTINE ICE4_NUCLEATION(KSIZE, ODSOFT, ODCOMPUTE, & + PTHT, PPABST, PRHODREF, PEXN, PLSFACT, PT, & + PRVT, & + PCIT, PRVHENI_MR, PB_TH, PB_RV, PB_RI) +!! +!!** PURPOSE +!! ------- +!! Computes the nucleation +!! +!! AUTHOR +!! ------ +!! S. Riette from the splitting of rain_ice source code (nov. 2014) +!! +!! MODIFICATIONS +!! ------------- +!! +! +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST, ONLY: XALPI,XALPW,XBETAI,XBETAW,XGAMI,XGAMW,XMD,XMV,XTT,XEPSILO +USE MODD_PARAM_ICE, ONLY: LFEEDBACKT +USE MODD_RAIN_ICE_PARAM, ONLY: XALPHA1,XALPHA2,XBETA1,XBETA2,XMNU0,XNU10,XNU20 +USE MODD_RAIN_ICE_DESCR, ONLY: XRTMIN +! +USE MODE_MPPDB +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +INTEGER, INTENT(IN) :: KSIZE +LOGICAL, INTENT(IN) :: ODSOFT +LOGICAL, DIMENSION(KSIZE),INTENT(IN) :: ODCOMPUTE +REAL, DIMENSION(KSIZE), INTENT(IN) :: PTHT ! Theta at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PPABST ! absolute pressure at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(KSIZE), INTENT(IN) :: PEXN ! Exner function +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLSFACT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature at time t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PCIT ! Pristine ice n.c. at t +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRVHENI_MR ! Mixing ratio change due to the heterogeneous nucleation +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_TH +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RV +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RI +! +!* 0.2 declaration of local variables +! +REAL, DIMENSION(KSIZE) :: ZW ! work array +LOGICAL, DIMENSION(KSIZE) :: GNEGT ! Test where to compute the HEN process +REAL, DIMENSION(KSIZE) :: ZZW, & ! Work array + ZUSW, & ! Undersaturation over water + ZSSI ! Supersaturation over ice +!------------------------------------------------------------------------------- +! +! +PRVHENI_MR(:)=0. +IF(.NOT. ODSOFT) THEN + GNEGT(:)=PT(:)<XTT .AND. PRVT>XRTMIN(1) .AND. ODCOMPUTE(:) + PRVHENI_MR(:)=0. + ZSSI(:)=0. + ZUSW(:)=0. + ZZW(:)=0. + WHERE(GNEGT(:)) + ZZW(:)=ALOG(PT(:)) + ZUSW(:)=EXP(XALPW - XBETAW/PT(:) - XGAMW*ZZW(:)) ! es_w + ZZW(:)=EXP(XALPI - XBETAI/PT(:) - XGAMI*ZZW(:)) ! es_i + END WHERE + WHERE(GNEGT(:)) + ZZW(:)=MIN(PPABST(:)/2., ZZW(:)) ! safety limitation + ZSSI(:)=PRVT(:)*(PPABST(:)-ZZW(:)) / (XEPSILO*ZZW(:)) - 1.0 + ! Supersaturation over ice + ZUSW(:)=MIN(PPABST(:)/2., ZUSW(:)) ! safety limitation + ZUSW(:)=(ZUSW(:)/ZZW(:))*((PPABST(:)-ZZW(:))/(PPABST(:)-ZUSW(:))) - 1.0 + ! Supersaturation of saturated water vapor over ice + ! + !* 3.1 compute the heterogeneous nucleation source RVHENI + ! + !* 3.1.1 compute the cloud ice concentration + ! + ZSSI(:)=MIN(ZSSI(:), ZUSW(:)) ! limitation of SSi according to SSw=0 + END WHERE + ZZW(:)=0. + WHERE(GNEGT(:) .AND. PT(:)<XTT-5.0 .AND. ZSSI(:)>0.0 ) + ZZW(:)=XNU20*EXP(XALPHA2*ZSSI(:)-XBETA2) + ELSEWHERE(GNEGT(:) .AND. PT(:)<=XTT-2.0 .AND. PT(:)>=XTT-5.0 .AND. ZSSI(:)>0.0) + ZZW(:)=MAX(XNU20*EXP(-XBETA2 ), & + XNU10*EXP(-XBETA1*(PT(:)-XTT))*(ZSSI(:)/ZUSW(:))**XALPHA1) + END WHERE + WHERE(GNEGT(:)) + ZZW(:)=ZZW(:)-PCIT(:) + ZZW(:)=MIN(ZZW(:), 50.E3) ! limitation provisoire a 50 l^-1 + END WHERE + WHERE(GNEGT(:)) + ! + !* 3.1.2 update the r_i and r_v mixing ratios + ! + PRVHENI_MR(:)=MAX(ZZW(:), 0.0)*XMNU0/PRHODREF(:) + PRVHENI_MR(:)=MIN(PRVT(:), PRVHENI_MR(:)) + END WHERE + !Limitation due to 0 crossing of temperature + IF(LFEEDBACKT) THEN + ZW(:)=0. + WHERE(GNEGT(:)) + ZW(:)=MIN(PRVHENI_MR(:), & + MAX(0., (XTT/PEXN(:)-PTHT(:))/PLSFACT(:))) / & + MAX(PRVHENI_MR(:), 1.E-20) + END WHERE + ELSE + ZW(:)=1. + ENDIF + PRVHENI_MR(:)=PRVHENI_MR(:)*ZW(:) + PCIT(:)=MAX(ZZW(:)*ZW(:)+PCIT(:), PCIT(:)) + ! + PB_RI(:)=PB_RI(:) + PRVHENI_MR(:) + PB_RV(:)=PB_RV(:) - PRVHENI_MR(:) + PB_TH(:)=PB_TH(:) + PRVHENI_MR(:)*PLSFACT(:) +ENDIF +! +END SUBROUTINE ICE4_NUCLEATION diff --git a/src/mesonh/micro/ice4_nucleation_wrapper.f90 b/src/mesonh/micro/ice4_nucleation_wrapper.f90 new file mode 100644 index 000000000..2e08a2cd7 --- /dev/null +++ b/src/mesonh/micro/ice4_nucleation_wrapper.f90 @@ -0,0 +1,149 @@ +!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +MODULE MODI_ICE4_NUCLEATION_WRAPPER +INTERFACE +SUBROUTINE ICE4_NUCLEATION_WRAPPER(KIT, KJT,KKT, LDMASK, & + PTHT, PPABST, PRHODREF, PEXN, PLSFACT, PT, & + PRVT, & + PCIT, PRVHENI_MR) +IMPLICIT NONE +INTEGER, INTENT(IN) :: KIT, KJT, KKT +LOGICAL, DIMENSION(KIT,KJT,KKT),INTENT(IN) :: LDMASK +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PTHT ! Theta at t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PPABST ! absolute pressure at t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PEXN ! Exner function +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PLSFACT +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PT ! Temperature at time t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PCIT ! Pristine ice n.c. at t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(OUT) :: PRVHENI_MR ! Mixing ratio change due to the heterogeneous nucleation +END SUBROUTINE ICE4_NUCLEATION_WRAPPER +END INTERFACE +END MODULE MODI_ICE4_NUCLEATION_WRAPPER +SUBROUTINE ICE4_NUCLEATION_WRAPPER(KIT, KJT, KKT, LDMASK, & + PTHT, PPABST, PRHODREF, PEXN, PLSFACT, PT, & + PRVT, & + PCIT, PRVHENI_MR) +!! +!!** PURPOSE +!! ------- +!! Computes the nucleation +!! +!! AUTHOR +!! ------ +!! S. Riette from the splitting of rain_ice source code (nov. 2014) +!! +!! MODIFICATIONS +!! ------------- +! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 +! P. Wautelet 29/05/2019: remove PACK/UNPACK intrinsics (to get more performance and better OpenACC support) +! +! +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST, ONLY: XTT + +use mode_tools, only: Countjv + +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +INTEGER, INTENT(IN) :: KIT, KJT, KKT +LOGICAL, DIMENSION(KIT,KJT,KKT),INTENT(IN) :: LDMASK +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PTHT ! Theta at t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PPABST ! absolute pressure at t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PEXN ! Exner function +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PLSFACT +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PT ! Temperature at time t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PCIT ! Pristine ice n.c. at t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(OUT) :: PRVHENI_MR ! Mixing ratio change due to the heterogeneous nucleation +! +!* 0.2 declaration of local variables +! +INTEGER :: IDX, JI, JJ, JK +INTEGER :: JL +INTEGER :: INEGT, INEGT_TMP +INTEGER, DIMENSION(:), ALLOCATABLE :: I1,I2,I3 +LOGICAL :: GDSOFT +LOGICAL, DIMENSION(:), ALLOCATABLE :: GLDCOMPUTE +LOGICAL, DIMENSION(KIT,KJT,KKT) :: GNEGT ! Test where to compute the HEN process +REAL, DIMENSION(:), ALLOCATABLE :: ZZT, & ! Temperature + ZPRES, & ! Pressure + ZRVT, & ! Water vapor m.r. at t + ZCIT, & ! Pristine ice conc. at t + ZTHT, & ! Theta at t + ZRHODREF, & + ZEXN, & + ZLSFACT, & + ZRVHENI_MR, & + ZB_TH, ZB_RV, ZB_RI +! +!------------------------------------------------------------------------------- +! +! +! +! optimization by looking for locations where +! the temperature is negative only !!! +! +GNEGT(:,:,:)=PT(:,:,:)<XTT .AND. LDMASK +INEGT = COUNT(GNEGT(:,:,:)) +! +ALLOCATE(GLDCOMPUTE(INEGT)) +ALLOCATE(I1(INEGT),I2(INEGT),I3(INEGT)) +ALLOCATE(ZZT(INEGT)) +ALLOCATE(ZPRES(INEGT)) +ALLOCATE(ZRVT(INEGT)) +ALLOCATE(ZCIT(INEGT)) +ALLOCATE(ZTHT(INEGT)) +ALLOCATE(ZRHODREF(INEGT)) +ALLOCATE(ZEXN(INEGT)) +ALLOCATE(ZLSFACT(INEGT)) +ALLOCATE(ZRVHENI_MR(INEGT)) +ALLOCATE(ZB_TH(INEGT)) +ALLOCATE(ZB_RV(INEGT)) +ALLOCATE(ZB_RI(INEGT)) +! +IF(INEGT>0) INEGT_TMP=COUNTJV(GNEGT(:,:,:), I1(:), I2(:), I3(:)) +! +PRVHENI_MR(:,:,:)=0. +IF(INEGT>0) THEN + DO JL=1, INEGT + ZRVT(JL)=PRVT(I1(JL), I2(JL), I3(JL)) + ZCIT(JL)=PCIT(I1(JL), I2(JL), I3(JL)) + ZZT(JL)=PT(I1(JL), I2(JL), I3(JL)) + ZPRES(JL)=PPABST(I1(JL), I2(JL), I3(JL)) + ZTHT(JL)=PTHT(I1(JL), I2(JL), I3(JL)) + ZRHODREF(JL)=PRHODREF(I1(JL), I2(JL), I3(JL)) + ZEXN(JL)=PEXN(I1(JL), I2(JL), I3(JL)) + ZLSFACT(JL)=PLSFACT(I1(JL), I2(JL), I3(JL)) + ENDDO + GDSOFT = .FALSE. + GLDCOMPUTE(:) = ZZT(:)<XTT + ZB_TH(:) = 0. + ZB_RV(:) = 0. + ZB_RI(:) = 0. + CALL ICE4_NUCLEATION(INEGT, GDSOFT, GLDCOMPUTE, & + ZTHT, ZPRES, ZRHODREF, ZEXN, ZLSFACT, ZZT, & + ZRVT, & + ZCIT, ZRVHENI_MR, ZB_TH, ZB_RV, ZB_RI) + PRVHENI_MR(:,:,:)= 0.0 + DO JL=1, INEGT + PRVHENI_MR(I1(JL), I2(JL), I3(JL)) = ZRVHENI_MR(JL) + PCIT (I1(JL), I2(JL), I3(JL)) = ZCIT (JL) + END DO +END IF +! +DEALLOCATE(GLDCOMPUTE) +DEALLOCATE(I1,I2,I3) +DEALLOCATE(ZZT,ZPRES,ZRVT,ZCIT,ZTHT,ZRHODREF,ZEXN,ZLSFACT,ZRVHENI_MR,ZB_TH,ZB_RV,ZB_RI) +! +END SUBROUTINE ICE4_NUCLEATION_WRAPPER diff --git a/src/mesonh/micro/ice4_rainfr_vert.f90 b/src/mesonh/micro/ice4_rainfr_vert.f90 new file mode 100644 index 000000000..6e817fe76 --- /dev/null +++ b/src/mesonh/micro/ice4_rainfr_vert.f90 @@ -0,0 +1,83 @@ +!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +MODULE MODI_ICE4_RAINFR_VERT +INTERFACE +SUBROUTINE ICE4_RAINFR_VERT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKL, PPRFR, PRR, PRS, PRG, PRH) +IMPLICIT NONE +INTEGER, INTENT(IN) :: KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKL +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PPRFR !Precipitation fraction +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRR !Rain field +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRS !Snow field +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRG !Graupel field +REAL, DIMENSION(KIT,KJT,KKT), OPTIONAL,INTENT(IN) :: PRH !Hail field +END SUBROUTINE ICE4_RAINFR_VERT +END INTERFACE +END MODULE MODI_ICE4_RAINFR_VERT +SUBROUTINE ICE4_RAINFR_VERT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKL, PPRFR, PRR, PRS, PRG, PRH) +!! +!!** PURPOSE +!! ------- +!! Computes the rain fraction +!! +!! AUTHOR +!! ------ +!! S. Riette from the plitting of rain_ice source code (nov. 2014) +!! +!! MODIFICATIONS +!! ------------- +!! +! P. Wautelet 13/02/2019: bugfix: intent of PPRFR OUT->INOUT +! +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_RAIN_ICE_DESCR, ONLY : XRTMIN +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +INTEGER, INTENT(IN) :: KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKL +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PPRFR !Precipitation fraction +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRR !Rain field +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRS !Snow field +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRG !Graupel field +REAL, DIMENSION(KIT,KJT,KKT), OPTIONAL, INTENT(IN) :: PRH !Hail field +! +!* 0.2 declaration of local variables +! +INTEGER :: JI, JJ, JK +LOGICAL :: MASK +! +!------------------------------------------------------------------------------- +! +!------------------------------------------------------------------------------- +DO JI = KIB,KIE + DO JJ = KJB, KJE + PPRFR(JI,JJ,KKE)=0. + DO JK=KKE-KKL, KKB, -KKL + IF(PRESENT(PRH)) THEN + MASK=PRR(JI,JJ,JK) .GT. XRTMIN(3) .OR. PRS(JI,JJ,JK) .GT. XRTMIN(5) & + .OR. PRG(JI,JJ,JK) .GT. XRTMIN(6) .OR. PRH(JI,JJ,JK) .GT. XRTMIN(7) + ELSE + MASK=PRR(JI,JJ,JK) .GT. XRTMIN(3) .OR. PRS(JI,JJ,JK) .GT. XRTMIN(5) & + .OR. PRG(JI,JJ,JK) .GT. XRTMIN(6) + END IF + IF (MASK) THEN + PPRFR(JI,JJ,JK)=MAX(PPRFR(JI,JJ,JK),PPRFR(JI,JJ,JK+KKL)) + IF (PPRFR(JI,JJ,JK)==0) THEN + PPRFR(JI,JJ,JK)=1. + END IF + ELSE + PPRFR(JI,JJ,JK)=0. + END IF + END DO + END DO +END DO +! +! +END SUBROUTINE ICE4_RAINFR_VERT diff --git a/src/mesonh/micro/ice4_rimltc.f90 b/src/mesonh/micro/ice4_rimltc.f90 new file mode 100644 index 000000000..fc4e12986 --- /dev/null +++ b/src/mesonh/micro/ice4_rimltc.f90 @@ -0,0 +1,105 @@ +!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +MODULE MODI_ICE4_RIMLTC +INTERFACE +SUBROUTINE ICE4_RIMLTC(KSIZE, LDSOFT, PCOMPUTE, & + &PEXN, PLVFACT, PLSFACT, & + &PT, & + &PTHT, PRIT, & + &PRIMLTC_MR, PB_TH, PB_RC, PB_RI) +IMPLICIT NONE +INTEGER, INTENT(IN) :: KSIZE +LOGICAL, INTENT(IN) :: LDSOFT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE +REAL, DIMENSION(KSIZE), INTENT(IN) :: PEXN ! Exner function +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLVFACT ! L_v/(Pi_ref*C_ph) +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLSFACT ! L_s/(Pi_ref*C_ph) +REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature +REAL, DIMENSION(KSIZE), INTENT(IN) :: PTHT ! Theta at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRIT ! Cloud ice at t +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRIMLTC_MR ! Mixing ratio change due to cloud ice melting +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_TH +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RC +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RI +END SUBROUTINE ICE4_RIMLTC +END INTERFACE +END MODULE MODI_ICE4_RIMLTC +SUBROUTINE ICE4_RIMLTC(KSIZE, LDSOFT, PCOMPUTE, & + &PEXN, PLVFACT, PLSFACT, & + &PT, & + &PTHT, PRIT, & + &PRIMLTC_MR, PB_TH, PB_RC, PB_RI) +!! +!!** PURPOSE +!! ------- +!! Computes the RIMLTC process +!! +!! AUTHOR +!! ------ +!! S. Riette from the splitting of rain_ice source code (nov. 2014) +!! +!! MODIFICATIONS +!! ------------- +!! +! +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST, ONLY: XTT +USE MODD_PARAM_ICE, ONLY: LFEEDBACKT +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +INTEGER, INTENT(IN) :: KSIZE +LOGICAL, INTENT(IN) :: LDSOFT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE +REAL, DIMENSION(KSIZE), INTENT(IN) :: PEXN ! Exner function +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLVFACT ! L_v/(Pi_ref*C_ph) +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLSFACT ! L_s/(Pi_ref*C_ph) +REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature +REAL, DIMENSION(KSIZE), INTENT(IN) :: PTHT ! Theta at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRIT ! Cloud ice at t +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRIMLTC_MR ! Mixing ratio change due to cloud ice melting +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_TH +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RC +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RI +! +!* 0.2 declaration of local variables +! +REAL, DIMENSION(KSIZE) :: ZMASK +INTEGER :: JL +! +!------------------------------------------------------------------------------- +! +!* 7.1 cloud ice melting +! +PRIMLTC_MR(:)=0. +IF(.NOT. LDSOFT) THEN + DO JL=1, KSIZE + ZMASK(JL)=MAX(0., -SIGN(1., -PRIT(JL))) * & ! PRIT(:)>0. + &MAX(0., -SIGN(1., XTT-PT(JL))) * & ! PT(:)>XTT + &PCOMPUTE(JL) + PRIMLTC_MR(JL)=PRIT(JL) * ZMASK(JL) + ENDDO + + IF(LFEEDBACKT) THEN + !Limitation due to 0 crossing of temperature + DO JL=1, KSIZE + PRIMLTC_MR(JL)=MIN(PRIMLTC_MR(JL), MAX(0., (PTHT(JL)-XTT/PEXN(JL)) / (PLSFACT(JL)-PLVFACT(JL)))) + ENDDO + ENDIF +ENDIF +DO JL=1, KSIZE + PB_RC(JL) = PB_RC(JL) + PRIMLTC_MR(JL) + PB_RI(JL) = PB_RI(JL) - PRIMLTC_MR(JL) + PB_TH(JL) = PB_TH(JL) - PRIMLTC_MR(JL)*(PLSFACT(JL)-PLVFACT(JL)) +ENDDO +! +! +END SUBROUTINE ICE4_RIMLTC diff --git a/src/mesonh/micro/ice4_rrhong.f90 b/src/mesonh/micro/ice4_rrhong.f90 new file mode 100644 index 000000000..da2648947 --- /dev/null +++ b/src/mesonh/micro/ice4_rrhong.f90 @@ -0,0 +1,105 @@ +!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +MODULE MODI_ICE4_RRHONG +INTERFACE +SUBROUTINE ICE4_RRHONG(KSIZE, LDSOFT, PCOMPUTE, & + &PEXN, PLVFACT, PLSFACT, & + &PT, PRRT, & + &PTHT, & + &PRRHONG_MR, PB_TH, PB_RR, PB_RG) +IMPLICIT NONE +INTEGER, INTENT(IN) :: KSIZE +LOGICAL, INTENT(IN) :: LDSOFT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE +REAL, DIMENSION(KSIZE), INTENT(IN) :: PEXN ! Exner function +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLVFACT ! L_v/(Pi_ref*C_ph) +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLSFACT ! L_s/(Pi_ref*C_ph) +REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PTHT ! Theta at t +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRRHONG_MR ! Mixing ratio change due to spontaneous freezing +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_TH +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RR +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RG +END SUBROUTINE ICE4_RRHONG +END INTERFACE +END MODULE MODI_ICE4_RRHONG +SUBROUTINE ICE4_RRHONG(KSIZE, LDSOFT, PCOMPUTE, & + &PEXN, PLVFACT, PLSFACT, & + &PT, PRRT, & + &PTHT, & + &PRRHONG_MR, PB_TH, PB_RR, PB_RG) +!! +!!** PURPOSE +!! ------- +!! Computes the RRHONG process +!! +!! AUTHOR +!! ------ +!! S. Riette from the splitting of rain_ice source code (nov. 2014) +!! +!! MODIFICATIONS +!! ------------- +!! +! +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST, ONLY: XTT +USE MODD_RAIN_ICE_DESCR, ONLY: XRTMIN +USE MODD_PARAM_ICE, ONLY: LFEEDBACKT +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +INTEGER, INTENT(IN) :: KSIZE +LOGICAL, INTENT(IN) :: LDSOFT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE +REAL, DIMENSION(KSIZE), INTENT(IN) :: PEXN ! Exner function +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLVFACT ! L_v/(Pi_ref*C_ph) +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLSFACT ! L_s/(Pi_ref*C_ph) +REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PTHT ! Theta at t +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRRHONG_MR ! Mixing ratio change due to spontaneous freezing +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_TH +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RR +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RG +! +!* 0.2 declaration of local variables +! +REAL, DIMENSION(KSIZE) :: ZMASK +INTEGER :: JL +! +!------------------------------------------------------------------------------- +! +!* 3.3 compute the spontaneous freezing source: RRHONG +! +PRRHONG_MR(:) = 0. +IF(.NOT. LDSOFT) THEN + DO JL=1, KSIZE + ZMASK(JL)=MAX(0., -SIGN(1., PT(JL)-(XTT-35.0))) * & ! PT(:)<XTT-35.0 + &MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JL))) * & ! PRRT(:)>XRTMIN(3) + &PCOMPUTE(JL) + PRRHONG_MR(JL)=PRRT(JL) * ZMASK(JL) + ENDDO + IF(LFEEDBACKT) THEN + !Limitation due to -35 crossing of temperature + DO JL=1, KSIZE + PRRHONG_MR(JL)=MIN(PRRHONG_MR(JL), MAX(0., ((XTT-35.)/PEXN(JL)-PTHT(JL))/(PLSFACT(JL)-PLVFACT(JL)))) + ENDDO + ENDIF +ENDIF +DO JL=1, KSIZE + PB_RG(JL) = PB_RG(JL) + PRRHONG_MR(JL) + PB_RR(JL) = PB_RR(JL) - PRRHONG_MR(JL) + PB_TH(JL) = PB_TH(JL) + PRRHONG_MR(JL)*(PLSFACT(JL)-PLVFACT(JL)) +ENDDO +! +! +END SUBROUTINE ICE4_RRHONG diff --git a/src/mesonh/micro/ice4_rsrimcg_old.f90 b/src/mesonh/micro/ice4_rsrimcg_old.f90 new file mode 100644 index 000000000..cf88792b1 --- /dev/null +++ b/src/mesonh/micro/ice4_rsrimcg_old.f90 @@ -0,0 +1,144 @@ +!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +MODULE MODI_ICE4_RSRIMCG_OLD +INTERFACE +SUBROUTINE ICE4_RSRIMCG_OLD(KSIZE, ODSOFT, ODCOMPUTE, & + &PRHODREF, & + &PLBDAS, & + &PT, PRCT, PRST, & + &PRSRIMCG_MR, PB_RS, PB_RG) +IMPLICIT NONE +INTEGER, INTENT(IN) :: KSIZE +LOGICAL, INTENT(IN) :: ODSOFT +LOGICAL, DIMENSION(KSIZE), INTENT(IN) :: ODCOMPUTE +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAS ! Slope parameter of the aggregate distribution +REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRSRIMCG_MR ! Mr change due to cloud droplet riming of the aggregates +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RS +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RG +END SUBROUTINE ICE4_RSRIMCG_OLD +END INTERFACE +END MODULE MODI_ICE4_RSRIMCG_OLD +SUBROUTINE ICE4_RSRIMCG_OLD(KSIZE, ODSOFT, ODCOMPUTE, & + &PRHODREF, & + &PLBDAS, & + &PT, PRCT, PRST, & + &PRSRIMCG_MR, PB_RS, PB_RG) +!! +!!** PURPOSE +!! ------- +!! Computes the riming-conversion of the large sized aggregates into graupel +!! +!! AUTHOR +!! ------ +!! S. Riette from the splitting of rain_ice source code (nov. 2014) +!! +!! MODIFICATIONS +!! ------------- +!! +! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! P. Wautelet 29/05/2019: remove PACK/UNPACK intrinsics (to get more performance and better OpenACC support) +! +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST, ONLY: XTT +USE MODD_PARAM_ICE, ONLY: CSNOWRIMING +USE MODD_RAIN_ICE_DESCR, ONLY: XRTMIN +USE MODD_RAIN_ICE_PARAM, ONLY: NGAMINC,XEXSRIMCG,XGAMINC_RIM2,XRIMINTP1,XRIMINTP2,XSRIMCG +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +INTEGER, INTENT(IN) :: KSIZE +LOGICAL, INTENT(IN) :: ODSOFT +LOGICAL, DIMENSION(KSIZE), INTENT(IN) :: ODCOMPUTE +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAS ! Slope parameter of the aggregate distribution +REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRSRIMCG_MR ! Mr change due to cloud droplet riming of the aggregates +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RS +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RG +! +!* 0.2 declaration of local variables +! +LOGICAL, DIMENSION(KSIZE) :: GRIM +INTEGER :: IGRIM +REAL, DIMENSION(KSIZE) :: ZVEC1, ZVEC2 +INTEGER, DIMENSION(KSIZE) :: IVEC2, IVEC1 +REAL, DIMENSION(KSIZE) :: ZZW +INTEGER :: JL +!------------------------------------------------------------------------------- +! +! +!------------------------------------------------------------------------------- +! +!* 5.1 cloud droplet riming of the aggregates +! +PRSRIMCG_MR(:)=0. +! +IF(.NOT. ODSOFT) THEN + IGRIM = 0 + GRIM(:) = .FALSE. + DO JL = 1, SIZE(GRIM) + IF ( PRCT(JL)>XRTMIN(2) .AND. PRST(JL)>XRTMIN(5) .AND. ODCOMPUTE(JL) .AND. PT(JL)<XTT ) THEN + IGRIM = IGRIM + 1 + IVEC1(IGRIM) = Jl + GRIM(JL) = .TRUE. + END IF + END DO + ! + IF(IGRIM>0) THEN + ! + ! 5.1.1 select the PLBDAS + ! + DO JL = 1, IGRIM + ZVEC1(JL) = PLBDAS(IVEC1(JL)) + END DO + ! + ! 5.1.2 find the next lower indice for the PLBDAS in the geometrical + ! set of Lbda_s used to tabulate some moments of the incomplete + ! gamma function + ! + ZVEC2(1:IGRIM) = MAX( 1.00001, MIN( REAL(NGAMINC)-0.00001, & + XRIMINTP1 * LOG( ZVEC1(1:IGRIM) ) + XRIMINTP2 ) ) + IVEC2(1:IGRIM) = INT( ZVEC2(1:IGRIM) ) + ZVEC2(1:IGRIM) = ZVEC2(1:IGRIM) - REAL( IVEC2(1:IGRIM) ) + + ! + ! 5.1.5 perform the linear interpolation of the normalized + ! "XBS"-moment of the incomplete gamma function (XGAMINC_RIM2) + ! + ZVEC1(1:IGRIM) = XGAMINC_RIM2( IVEC2(1:IGRIM)+1 )* ZVEC2(1:IGRIM) & + - XGAMINC_RIM2( IVEC2(1:IGRIM) )*(ZVEC2(1:IGRIM) - 1.0) + ZZW(:) = 0. + DO JL = 1, IGRIM + ZZW(IVEC1(JL)) = ZVEC1(JL) + END DO + + ! + ! 5.1.6 riming-conversion of the large sized aggregates into graupeln + ! + ! + WHERE(GRIM(:)) + PRSRIMCG_MR(:) = XSRIMCG * PLBDAS(:)**XEXSRIMCG & ! RSRIMCG + * (1.0 - ZZW(:) )/PRHODREF(:) + PRSRIMCG_MR(:)=MIN(PRST(:), PRSRIMCG_MR(:)) + END WHERE + END IF +ENDIF +PB_RS(:) = PB_RS(:) - PRSRIMCG_MR(:) +PB_RG(:) = PB_RG(:) + PRSRIMCG_MR(:) +! +! +END SUBROUTINE ICE4_RSRIMCG_OLD diff --git a/src/mesonh/micro/ice4_sedimentation_split.f90 b/src/mesonh/micro/ice4_sedimentation_split.f90 new file mode 100644 index 000000000..cb0a147d0 --- /dev/null +++ b/src/mesonh/micro/ice4_sedimentation_split.f90 @@ -0,0 +1,494 @@ +!MNH_LIC Copyright 1994-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +MODULE MODI_ICE4_SEDIMENTATION_SPLIT +INTERFACE +SUBROUTINE ICE4_SEDIMENTATION_SPLIT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB, KKTE, KKT, KKL, & + &PTSTEP, KRR, OSEDIC, ODEPOSC, PVDEPOSC, PDZZ, & + &PRHODREF, PPABST, PTHT, PRHODJ, & + &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,& + &PINPRC, PINDEP, PINPRR, PINPRI, PINPRS, PINPRG, & + &PSEA, PTOWN, & + &PINPRH, PRHT, PRHS, PFPR) +IMPLICIT NONE +INTEGER, INTENT(IN) :: KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB, KKTE, KKT +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO +REAL, INTENT(IN) :: PTSTEP ! Double Time step (single if cold start) +INTEGER, INTENT(IN) :: KRR ! Number of moist variable +LOGICAL, INTENT(IN) :: OSEDIC ! Switch for droplet sedim. +LOGICAL, INTENT(IN) :: ODEPOSC ! Switch for droplet depos. +REAL, INTENT(IN) :: PVDEPOSC! Droplet deposition velocity +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PDZZ ! Layer thikness (m) +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PPABST ! absolute pressure at t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRRS ! Rain water m.r. source +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRIT ! Pristine ice m.r. at t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRSS ! Snow/aggregate m.r. source +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRGS ! Graupel m.r. source +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRGT ! Graupel/hail m.r. at t +REAL, DIMENSION(:,:), INTENT(OUT) :: PINPRC ! Cloud instant precip +REAL, DIMENSION(:,:), INTENT(OUT) :: PINDEP ! Cloud instant deposition +REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRR ! Rain instant precip +REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRI ! Pristine ice instant precip +REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRS ! Snow instant precip +REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRG ! Graupel instant precip +REAL, DIMENSION(KIT,KJT), OPTIONAL,INTENT(IN) :: PSEA ! Sea Mask +REAL, DIMENSION(KIT,KJT), OPTIONAL,INTENT(IN) :: PTOWN ! Fraction that is town +REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(OUT) :: PINPRH ! Hail instant precip +REAL, DIMENSION(KIT,KJT,KKT), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t +REAL, DIMENSION(KIT,KJT,KKT), OPTIONAL, INTENT(INOUT) :: PRHS ! Hail m.r. source +REAL, DIMENSION(KIT,KJT,KKT,KRR), OPTIONAL, INTENT(OUT) :: PFPR ! upper-air precipitation fluxes +END SUBROUTINE ICE4_SEDIMENTATION_SPLIT +END INTERFACE +END MODULE MODI_ICE4_SEDIMENTATION_SPLIT +SUBROUTINE ICE4_SEDIMENTATION_SPLIT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB, KKTE, KKT, KKL, & + &PTSTEP, KRR, OSEDIC, ODEPOSC, PVDEPOSC, PDZZ, & + &PRHODREF, PPABST, PTHT, PRHODJ, & + &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,& + &PINPRC, PINDEP, PINPRR, PINPRI, PINPRS, PINPRG, & + &PSEA, PTOWN, & + &PINPRH, PRHT, PRHS, PFPR) +!! +!!** PURPOSE +!! ------- +!! Computes the sedimentation +!! +!! AUTHOR +!! ------ +!! S. Riette from the plitting of rain_ice source code (nov. 2014) +!! and modified for optimisation +!! +!! MODIFICATIONS +!! ------------- +!! +! P. Wautelet 11/02/2019: dimensions of PINPRC and PINDEP not necessarily KIT,KJT +! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg +! +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST, ONLY: XRHOLW +USE MODD_PARAM_ICE, ONLY: XSPLIT_MAXCFL +USE MODD_RAIN_ICE_DESCR, ONLY: XALPHAC,XALPHAC2,XCONC_LAND,XCONC_SEA,XCONC_URBAN,XLBC,XNUC,XNUC2 +USE MODD_RAIN_ICE_PARAM, ONLY: XFSEDC +! +USE MODE_MSG +! +USE MODI_GAMMA +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +INTEGER, INTENT(IN) :: KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB, KKTE, KKT +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO +REAL, INTENT(IN) :: PTSTEP ! Double Time step (single if cold start) +INTEGER, INTENT(IN) :: KRR ! Number of moist variable +LOGICAL, INTENT(IN) :: OSEDIC ! Switch for droplet sedim. +LOGICAL, INTENT(IN) :: ODEPOSC ! Switch for droplet depos. +REAL, INTENT(IN) :: PVDEPOSC! Droplet deposition velocity +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PDZZ ! Layer thikness (m) +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PPABST ! absolute pressure at t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRRS ! Rain water m.r. source +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRIT ! Pristine ice m.r. at t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRSS ! Snow/aggregate m.r. source +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRGS ! Graupel m.r. source +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRGT ! Graupel/hail m.r. at t +REAL, DIMENSION(:,:), INTENT(OUT) :: PINPRC ! Cloud instant precip +REAL, DIMENSION(:,:), INTENT(OUT) :: PINDEP ! Cloud instant deposition +REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRR ! Rain instant precip +REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRI ! Pristine ice instant precip +REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRS ! Snow instant precip +REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRG ! Graupel instant precip +REAL, DIMENSION(KIT,KJT), OPTIONAL,INTENT(IN) :: PSEA ! Sea Mask +REAL, DIMENSION(KIT,KJT), OPTIONAL,INTENT(IN) :: PTOWN ! Fraction that is town +REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(OUT) :: PINPRH ! Hail instant precip +REAL, DIMENSION(KIT,KJT,KKT), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t +REAL, DIMENSION(KIT,KJT,KKT), OPTIONAL, INTENT(INOUT) :: PRHS ! Hail m.r. source +REAL, DIMENSION(KIT,KJT,KKT,KRR), OPTIONAL, INTENT(OUT) :: PFPR ! upper-air precipitation fluxes +! +!* 0.2 declaration of local variables +! +! +INTEGER :: JI,JJ,JK +INTEGER :: IRR !Workaround of PGI bug with OpenACC (at least up to 18.10 version) +LOGICAL :: GDEPOSC, GSEDIC !Workaround of PGI bug with OpenACC (at least up to 18.10 version) +LOGICAL :: GPRESENT_PFPR, GPRESENT_PSEA +REAL :: ZINVTSTEP +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2)) :: ZCONC_TMP ! Weighted concentration +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),KKTB:KKTE) :: ZW ! work array +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) :: ZCONC3D, & ! droplet condensation + & ZRAY, & ! Cloud Mean radius + & ZLBC, & ! XLBC weighted by sea fraction + & ZFSEDC, & + & ZPRCS,ZPRRS,ZPRIS,ZPRSS,ZPRGS,ZPRHS, & ! Mixing ratios created during the time step + & ZRCT, & + & ZRRT, & + & ZRIT, & + & ZRST, & + & ZRGT, & + & ZRHT +! +!------------------------------------------------------------------------------- +! +!------------------------------------------------------------------------------- +! +! +GDEPOSC = ODEPOSC +GSEDIC = OSEDIC +IRR = KRR +! +IF (PRESENT(PFPR)) THEN + GPRESENT_PFPR = .TRUE. +ELSE + GPRESENT_PFPR = .FALSE. +END IF +! +IF (PRESENT(PSEA)) THEN + GPRESENT_PSEA = .TRUE. +ELSE + GPRESENT_PSEA = .FALSE. +END IF +! +! O. Initialization of for sedimentation +! +ZINVTSTEP=1./PTSTEP +IF (GPRESENT_PFPR) THEN + PFPR(:,:,:,:) = 0. +END IF +! +!* 1. Parameters for cloud sedimentation +! +IF (GSEDIC) THEN + ZRAY(:,:,:) = 0. + ZLBC(:,:,:) = XLBC(1) + ZFSEDC(:,:,:) = XFSEDC(1) + ZCONC3D(:,:,:)= XCONC_LAND + ZCONC_TMP(:,:)= XCONC_LAND + IF (GPRESENT_PSEA) THEN + ZCONC_TMP(:,:)=PSEA(:,:)*XCONC_SEA+(1.-PSEA(:,:))*XCONC_LAND + DO JK=KKTB, KKTE + ZLBC(:,:,JK) = PSEA(:,:)*XLBC(2)+(1.-PSEA(:,:))*XLBC(1) + ZFSEDC(:,:,JK) = (PSEA(:,:)*XFSEDC(2)+(1.-PSEA(:,:))*XFSEDC(1)) + ZFSEDC(:,:,JK) = MAX(MIN(XFSEDC(1),XFSEDC(2)),ZFSEDC(:,:,JK)) + ZCONC3D(:,:,JK)= (1.-PTOWN(:,:))*ZCONC_TMP(:,:)+PTOWN(:,:)*XCONC_URBAN + ZRAY(:,:,JK) = 0.5*((1.-PSEA(:,:))*GAMMA(XNUC+1.0/XALPHAC)/(GAMMA(XNUC)) + & + PSEA(:,:)*GAMMA(XNUC2+1.0/XALPHAC2)/(GAMMA(XNUC2))) + END DO + ELSE + ZCONC3D(:,:,:) = XCONC_LAND + ZRAY(:,:,:) = 0.5*(GAMMA(XNUC+1.0/XALPHAC)/(GAMMA(XNUC))) + END IF + ZRAY(:,:,:) = MAX(1.,ZRAY(:,:,:)) + ZLBC(:,:,:) = MAX(MIN(XLBC(1),XLBC(2)),ZLBC(:,:,:)) +ENDIF +! +!* 2. compute the fluxes +! +! optimization by looking for locations where +! the precipitating fields are larger than a minimal value only !!! +! For optimization we consider each variable separately +! +! External tendecies +IF (GSEDIC) THEN + ZPRCS(:,:,:) = PRCS(:,:,:)-PRCT(:,:,:)*ZINVTSTEP +ENDIF +ZPRRS(:,:,:) = PRRS(:,:,:)-PRRT(:,:,:)*ZINVTSTEP +ZPRIS(:,:,:) = PRIS(:,:,:)-PRIT(:,:,:)*ZINVTSTEP +ZPRSS(:,:,:) = PRSS(:,:,:)-PRST(:,:,:)*ZINVTSTEP +ZPRGS(:,:,:) = PRGS(:,:,:)-PRGT(:,:,:)*ZINVTSTEP +IF ( IRR == 7 ) THEN + ZPRHS(:,:,:) = PRHS(:,:,:)-PRHT(:,:,:)*ZINVTSTEP +END IF +! +! mr values inside the time-splitting loop +ZRCT(:,:,:) = PRCT(:,:,:) +ZRRT(:,:,:) = PRRT(:,:,:) +ZRIT(:,:,:) = PRIT(:,:,:) +ZRST(:,:,:) = PRST(:,:,:) +ZRGT(:,:,:) = PRGT(:,:,:) +IF (IRR==7) THEN + ZRHT(:,:,:) = PRHT(:,:,:) +END IF +! +ZW(:,:,KKTB:KKTE) =1./(PRHODREF(:,:,KKTB:KKTE)* PDZZ(:,:,KKTB:KKTE)) +! +! +!* 2.1 for cloud +! +IF (GSEDIC) THEN + CALL INTERNAL_SEDIM_SPLI(KIB,KIE,KIT,KJB,KJE,KJT, KKB, KKTB, KKTE, KKT, KKL, KRR, & + &XSPLIT_MAXCFL, & + &PRHODREF, ZW, PDZZ, PPABST, PTHT, PTSTEP, & + &2, & + &ZRCT, PRCS, PINPRC, ZPRCS, & + &ZRAY, ZLBC, ZFSEDC, ZCONC3D, PFPR=PFPR) +ENDIF +! +! +!* 2.1bis DROPLET DEPOSITION AT THE 1ST LEVEL ABOVE GROUND +! +IF (GDEPOSC) THEN + PINDEP (:,:) = 0. + DO JJ=KJB,KJE + DO JI=KIB,KIE + IF (PRCS(JI,JJ,KKB)>0.) THEN + PRCS(JI,JJ,KKB) = PRCS(JI,JJ,KKB) - PVDEPOSC * PRCT(JI,JJ,KKB) / PDZZ(JI,JJ,KKB) + PINPRC(JI,JJ) = PINPRC(JI,JJ) + PVDEPOSC * PRCT(JI,JJ,KKB) * PRHODREF(JI,JJ,KKB) /XRHOLW + PINDEP(JI,JJ) = PVDEPOSC * PRCT(JI,JJ,KKB) * PRHODREF(JI,JJ,KKB) /XRHOLW + END IF + END DO + END DO +END IF +! +!* 2.2 for rain +! + CALL INTERNAL_SEDIM_SPLI(KIB,KIE,KIT,KJB,KJE,KJT, KKB, KKTB, KKTE, KKT, KKL, KRR, & + &XSPLIT_MAXCFL, & + &PRHODREF, ZW, PDZZ, PPABST, PTHT, PTSTEP, & + &3, & + &ZRRT, PRRS, PINPRR, ZPRRS, & + PFPR=PFPR) +! +!* 2.3 for pristine ice +! + CALL INTERNAL_SEDIM_SPLI(KIB,KIE,KIT,KJB,KJE,KJT, KKB, KKTB, KKTE, KKT, KKL, KRR, & + &XSPLIT_MAXCFL, & + &PRHODREF, ZW, PDZZ, PPABST, PTHT, PTSTEP, & + &4, & + &ZRIT, PRIS, PINPRI, ZPRIS, & + PFPR=PFPR) +! +!* 2.4 for aggregates/snow +! + CALL INTERNAL_SEDIM_SPLI(KIB,KIE,KIT,KJB,KJE,KJT, KKB, KKTB, KKTE, KKT, KKL, KRR, & + &XSPLIT_MAXCFL, & + &PRHODREF, ZW, PDZZ, PPABST, PTHT, PTSTEP, & + &5, & + &ZRST, PRSS, PINPRS, ZPRSS, & + PFPR=PFPR) +! +!* 2.5 for graupeln +! + CALL INTERNAL_SEDIM_SPLI(KIB,KIE,KIT,KJB,KJE,KJT, KKB, KKTB, KKTE, KKT, KKL, KRR, & + &XSPLIT_MAXCFL, & + &PRHODREF, ZW, PDZZ, PPABST, PTHT, PTSTEP, & + &6, & + &ZRGT, PRGS, PINPRG, ZPRGS, & + PFPR=PFPR) +! +!* 2.6 for hail +! +IF (IRR==7) THEN + CALL INTERNAL_SEDIM_SPLI(KIB,KIE,KIT,KJB,KJE,KJT, KKB, KKTB, KKTE, KKT, KKL, KRR, & + &XSPLIT_MAXCFL, & + &PRHODREF, ZW, PDZZ, PPABST, PTHT, PTSTEP, & + &7, & + &ZRHT, PRHS, PINPRH, ZPRHS, & + PFPR=PFPR) +ENDIF +! +! +CONTAINS +! +! +!------------------------------------------------------------------------------- +! +! +SUBROUTINE INTERNAL_SEDIM_SPLI(KIB,KIE,KIT,KJB,KJE,KJT,KKB,KKTB,KKTE,KKT,KKL,KRR, & + &PMAXCFL,PRHODREF,POORHODZ,PDZZ,PPABST,PTHT,PTSTEP, & + &KSPE,PRXT,PRXS,PINPRX,PPRXS, & + &PRAY,PLBC,PFSEDC,PCONC3D,PFPR) +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST, ONLY: XCPD,XP00,XRD +USE MODD_RAIN_ICE_DESCR, ONLY: XCC,XCEXVT,XDC,XLBEXC,XRTMIN +USE MODD_RAIN_ICE_PARAM, ONLY: XEXCSEDI,XEXSEDG,XEXSEDH,XEXSEDR,XEXSEDS,XFSEDG,XFSEDH,XFSEDI,XFSEDR,XFSEDS +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +INTEGER, INTENT(IN) :: KIB,KIE,KIT, KJB,KJE,KJT, KKB, KKTB, KKTE, KKT, KKL, KRR +REAL, INTENT(IN) :: PMAXCFL ! maximum CFL allowed +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(KIT,KJT,KKTB:KKTE), INTENT(IN) :: POORHODZ ! One Over (Rhodref times delta Z) +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PDZZ ! layer thikness (m) +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PPABST +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PTHT +REAL, INTENT(IN) :: PTSTEP ! total timestep +INTEGER, INTENT(IN) :: KSPE ! 1 for rc, 2 for rr... +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRXT ! mr of specy X +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRXS !Tendency of the specy KSPE +REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRX ! instant precip +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PPRXS ! external tendencie +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN), OPTIONAL :: PRAY, PLBC, PFSEDC, PCONC3D +REAL, DIMENSION(KIT,KJT,KKT,KRR), INTENT(INOUT), OPTIONAL :: PFPR ! upper-air precipitation fluxes +! +!* 0.2 declaration of local variables +! +character(len=10) :: yspe ! String for error message +INTEGER :: IDX, ISEDIM +INTEGER :: JI, JJ, JK, JL +INTEGER, DIMENSION(KIT*KJT*KKT) :: I1,I2,I3 ! Used to replace the COUNT +LOGICAL :: GPRESENT_PFPR +REAL :: ZINVTSTEP +REAL :: ZZWLBDC, ZRAY, ZZT, ZZWLBDA, ZZCC +REAL :: ZFSED, ZEXSED +REAL, DIMENSION(KIT, KJT) :: ZMRCHANGE +REAL, DIMENSION(KIT, KJT) :: ZMAX_TSTEP ! Maximum CFL in column +REAL, DIMENSION(SIZE(XRTMIN)) :: ZRSMIN +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2)) :: ZREMAINT ! Remaining time until the timestep end +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),0:SIZE(PRHODREF,3)+1) :: ZWSED ! Sedimentation fluxes +! +!------------------------------------------------------------------------------- +IF (KSPE<2 .OR. KSPE>7) CALL PRINT_MSG(NVERB_FATAL,'GEN','INTERNAL_SEDIM_SPLIT','invalid species (KSPE variable)') +! +IF (PRESENT(PFPR)) THEN + GPRESENT_PFPR = .TRUE. +ELSE + GPRESENT_PFPR = .FALSE. +END IF +! +PINPRX(:,:) = 0. +ZINVTSTEP=1./PTSTEP +ZRSMIN(:) = XRTMIN(:) * ZINVTSTEP +ZREMAINT(:,:) = PTSTEP +! +DO WHILE (ANY(ZREMAINT>0.)) + ISEDIM = 0 + DO JK = KKTB,KKTE + DO JJ = KJB,KJE + DO JI = KIB,KIE + IF( (PRXT (JI,JJ,JK)>XRTMIN(KSPE) .OR. & + PPRXS(JI,JJ,JK)>ZRSMIN(KSPE)) .AND. & + ZREMAINT(JI,JJ)>0. ) THEN + ISEDIM = ISEDIM + 1 + IDX = ISEDIM + I1(IDX) = JI + I2(IDX) = JJ + I3(IDX) = JK + END IF + END DO + END DO + END DO + ! + ! + !* 1. Parameters for cloud sedimentation + ! + ! + !* 2. compute the fluxes + ! + ! + IF(KSPE==2) THEN + !******* for cloud + ZWSED(:,:,:) = 0. + DO JL=1, ISEDIM + JI=I1(JL) + JJ=I2(JL) + JK=I3(JL) + IF(PRXT(JI,JJ,JK)>XRTMIN(KSPE)) THEN + ZZWLBDC = PLBC(JI,JJ,JK) * PCONC3D(JI,JJ,JK) / & + (PRHODREF(JI,JJ,JK) * PRXT(JI,JJ,JK)) + ZZWLBDC = ZZWLBDC**XLBEXC + ZRAY = PRAY(JI,JJ,JK) / ZZWLBDC + ZZT = PTHT(JI,JJ,JK) * (PPABST(JI,JJ,JK)/XP00)**(XRD/XCPD) + ZZWLBDA = 6.6E-8*(101325./PPABST(JI,JJ,JK))*(ZZT/293.15) + ZZCC = XCC*(1.+1.26*ZZWLBDA/ZRAY) + ZWSED(JI, JJ, JK) = PRHODREF(JI,JJ,JK)**(-XCEXVT +1 ) * & + ZZWLBDC**(-XDC)*ZZCC*PFSEDC(JI,JJ,JK) * PRXT(JI,JJ,JK) + ENDIF + ENDDO + ELSEIF(KSPE==4) THEN + ! ******* for pristine ice + ZWSED(:,:,:) = 0. + DO JL=1, ISEDIM + JI=I1(JL) + JJ=I2(JL) + JK=I3(JL) + IF(PRXT(JI, JJ, JK) .GT. MAX(XRTMIN(4), 1.0E-7)) THEN + ZWSED(JI, JJ, JK) = XFSEDI * PRXT(JI, JJ, JK) * & + & PRHODREF(JI,JJ,JK)**(1.-XCEXVT) * & ! McF&H + & MAX( 0.05E6,-0.15319E6-0.021454E6* & + & ALOG(PRHODREF(JI,JJ,JK)*PRXT(JI,JJ,JK)) )**XEXCSEDI + ENDIF + ENDDO + ELSE + ! ******* for other species + SELECT CASE(KSPE) + CASE(3) + ZFSED=XFSEDR + ZEXSED=XEXSEDR + CASE(5) + ZFSED=XFSEDS + ZEXSED=XEXSEDS + CASE(6) + ZFSED=XFSEDG + ZEXSED=XEXSEDG + CASE(7) + ZFSED=XFSEDH + ZEXSED=XEXSEDH + CASE DEFAULT + write( yspe, '( I10 )' ) kspe + call Print_msg( NVERB_FATAL, 'GEN', 'ICE4_SEDIMENTATION_SPLIT', 'no sedimentation parameter for KSPE='//trim(yspe) ) + END SELECT + ! + ZWSED(:,:,:) = 0. + DO JL=1, ISEDIM + JI=I1(JL) + JJ=I2(JL) + JK=I3(JL) + IF(PRXT(JI,JJ,JK)>XRTMIN(KSPE)) THEN + ZWSED(JI, JJ, JK) = ZFSED * PRXT(JI, JJ, JK)**ZEXSED & + * PRHODREF(JI, JJ, JK)**(ZEXSED-XCEXVT) + ENDIF + ENDDO + ENDIF + ZMAX_TSTEP(:,:) = ZREMAINT(:,:) + DO JL=1, ISEDIM + JI=I1(JL) + JJ=I2(JL) + JK=I3(JL) + IF(PRXT(JI,JJ,JK)>XRTMIN(KSPE) .AND. ZWSED(JI, JJ, JK)>1.E-20) THEN + ZMAX_TSTEP(JI, JJ) = MIN(ZMAX_TSTEP(JI, JJ), PMAXCFL * PRHODREF(JI, JJ, JK) * & + PRXT(JI, JJ, JK) * PDZZ(JI, JJ, JK) / ZWSED(JI, JJ, JK)) + ENDIF + ENDDO + ZREMAINT(:,:) = ZREMAINT(:,:) - ZMAX_TSTEP(:,:) + DO JK = KKTB , KKTE + ZMRCHANGE(:,:) = ZMAX_TSTEP(:,:) * POORHODZ(:,:,JK)*(ZWSED(:,:,JK+KKL)-ZWSED(:,:,JK)) + PRXT(:,:,JK) = PRXT(:,:,JK) + ZMRCHANGE(:,:) + PPRXS(:,:,JK) * ZMAX_TSTEP(:,:) + PRXS(:,:,JK) = PRXS(:,:,JK) + ZMRCHANGE(:,:) * ZINVTSTEP + ENDDO + PINPRX(:,:) = PINPRX(:,:) + ZWSED(:,:,KKB) / XRHOLW * (ZMAX_TSTEP(:,:) * ZINVTSTEP) + IF (GPRESENT_PFPR) THEN + DO JK = KKTB , KKTE + PFPR(:,:,JK,KSPE) = PFPR(:,:,JK,KSPE) + ZWSED(:,:,JK) * (ZMAX_TSTEP(:,:) * ZINVTSTEP) + ENDDO + ENDIF +! +END DO +! +END SUBROUTINE INTERNAL_SEDIM_SPLI +! +END SUBROUTINE ICE4_SEDIMENTATION_SPLIT diff --git a/src/mesonh/micro/ice4_sedimentation_split_momentum.f90 b/src/mesonh/micro/ice4_sedimentation_split_momentum.f90 new file mode 100644 index 000000000..927eb8ba5 --- /dev/null +++ b/src/mesonh/micro/ice4_sedimentation_split_momentum.f90 @@ -0,0 +1,577 @@ +!MNH_LIC Copyright 1994-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +MODULE MODI_ICE4_SEDIMENTATION_SPLIT_MOMENTUM +INTERFACE +SUBROUTINE ICE4_SEDIMENTATION_SPLIT_MOMENTUM(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB, KKTE, KKT, KKL, & + &PTSTEP, KRR, OSEDIC, OMOMENTUM, & + &PSEA, PTOWN, PDZZ, & + &PRHODREF, PPABST, PTHT, PRHODJ, & + &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,& + &PINPRC, PINPRR, PINPRI, PINPRS, PINPRG, & + &PINPRH, PRHT, PRHS, PFPR) +IMPLICIT NONE +INTEGER, INTENT(IN) :: KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB, KKTE, KKT +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO +REAL, INTENT(IN) :: PTSTEP ! Double Time step (single if cold start) +INTEGER, INTENT(IN) :: KRR ! Number of moist variable +LOGICAL, INTENT(IN) :: OSEDIC ! Switch for droplet sedim. +LOGICAL, INTENT(IN) :: OMOMENTUM ! Switch to use momentum flux +REAL, DIMENSION(KIT,KJT), INTENT(IN) :: PSEA ! Sea Mask +REAL, DIMENSION(KIT,KJT), INTENT(IN) :: PTOWN ! Fraction that is town +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PDZZ ! Layer thikness (m) +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PPABST ! absolute pressure at t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRRS ! Rain water m.r. source +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRIT ! Pristine ice m.r. at t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRSS ! Snow/aggregate m.r. source +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRGS ! Graupel m.r. source +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRGT ! Graupel/hail m.r. at t +REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRC ! Cloud instant precip +REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRR ! Rain instant precip +REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRI ! Pristine ice instant precip +REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRS ! Snow instant precip +REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRG ! Graupel instant precip +REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(OUT) :: PINPRH ! Hail instant precip +REAL, DIMENSION(KIT,KJT,KKT), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t +REAL, DIMENSION(KIT,KJT,KKT), OPTIONAL, INTENT(INOUT) :: PRHS ! Hail m.r. source +REAL, DIMENSION(KIT,KJT,KKT,KRR), OPTIONAL, INTENT(OUT) :: PFPR ! upper-air precipitation fluxes +END SUBROUTINE ICE4_SEDIMENTATION_SPLIT_MOMENTUM +END INTERFACE +END MODULE MODI_ICE4_SEDIMENTATION_SPLIT_MOMENTUM +SUBROUTINE ICE4_SEDIMENTATION_SPLIT_MOMENTUM(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB, KKTE, KKT, KKL, & + &PTSTEP, KRR, OSEDIC, OMOMENTUM, & + &PSEA, PTOWN, PDZZ, & + &PRHODREF, PPABST, PTHT, PRHODJ, & + &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,& + &PINPRC, PINPRR, PINPRI, PINPRS, PINPRG, & + &PINPRH, PRHT, PRHS, PFPR) +!! +!!** PURPOSE +!! ------- +!! Computes the sedimentation +!! +!! AUTHOR +!! ------ +!! S. Riette from the plitting of rain_ice source code (nov. 2014) +!! and modified to use momentum +!! +!! MODIFICATIONS +!! ------------- +!! +! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg +! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 +! +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_PARAM_ICE +USE MODD_RAIN_ICE_DESCR +USE MODD_RAIN_ICE_PARAM + +USE MODE_MSG +use mode_tools, only: Countjv + +USE MODI_GAMMA +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +INTEGER, INTENT(IN) :: KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB, KKTE, KKT +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO +REAL, INTENT(IN) :: PTSTEP ! Double Time step (single if cold start) +INTEGER, INTENT(IN) :: KRR ! Number of moist variable +LOGICAL, INTENT(IN) :: OSEDIC ! Switch for droplet sedim. +LOGICAL, INTENT(IN) :: OMOMENTUM ! Switch to use momentum flux +REAL, DIMENSION(KIT,KJT), INTENT(IN) :: PSEA ! Sea Mask +REAL, DIMENSION(KIT,KJT), INTENT(IN) :: PTOWN ! Fraction that is town +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PDZZ ! Layer thikness (m) +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PPABST ! absolute pressure at t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRRS ! Rain water m.r. source +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRIT ! Pristine ice m.r. at t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRSS ! Snow/aggregate m.r. source +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRGS ! Graupel m.r. source +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRGT ! Graupel/hail m.r. at t +REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRC ! Cloud instant precip +REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRR ! Rain instant precip +REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRI ! Pristine ice instant precip +REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRS ! Snow instant precip +REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRG ! Graupel instant precip +REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(OUT) :: PINPRH ! Hail instant precip +REAL, DIMENSION(KIT,KJT,KKT), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t +REAL, DIMENSION(KIT,KJT,KKT), OPTIONAL, INTENT(INOUT) :: PRHS ! Hail m.r. source +REAL, DIMENSION(KIT,KJT,KKT,KRR), OPTIONAL, INTENT(OUT) :: PFPR ! upper-air precipitation fluxes +! +!* 0.2 declaration of local variables +! +! +LOGICAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: GSEDIM ! Test where to compute the SED processes +INTEGER , DIMENSION(SIZE(GSEDIM)) :: I1,I2,I3 ! Used to replace the COUNT + +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) :: ZCONC3D, & ! droplet condensation + & ZRAY, & ! Cloud Mean radius + & ZLBC, & ! XLBC weighted by sea fraction + & ZFSEDC, & + & ZPRCS,ZPRRS,ZPRIS,ZPRSS,ZPRGS,ZPRHS, & ! Mixing ratios created during the time step + & ZW, & ! work array + & ZRCT, & + & ZRRT, & + & ZRIT, & + & ZRST, & + & ZRGT, & + & ZRHT +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) :: ZMOMC, ZMOMR, ZMOMI, ZMOMS, ZMOMG, ZMOMH ! momentum +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) :: ZMOMC_EXT, ZMOMR_EXT, ZMOMI_EXT, & + ZMOMS_EXT, ZMOMG_EXT, ZMOMH_EXT ! momentum tendencies +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),0:SIZE(PRHODREF,3)+1) :: ZWSED ! sedimentation fluxes +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2)) :: ZCONC_TMP ! Weighted concentration +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2)) :: ZREMAINT ! Remaining time until the timestep end +REAL :: ZINVTSTEP +INTEGER :: ISEDIM ! ! Case number of sedimentation +INTEGER :: JK +LOGICAL :: FIRST +REAL, DIMENSION(SIZE(XRTMIN)) :: ZRSMIN +!------------------------------------------------------------------------------- +! +!------------------------------------------------------------------------------- +! +! +! O. Initialization of for sedimentation +! +ZINVTSTEP=1./PTSTEP +ZRSMIN(:) = XRTMIN(:) * ZINVTSTEP +IF (OSEDIC) PINPRC (:,:) = 0. +PINPRR (:,:) = 0. +PINPRI (:,:) = 0. +PINPRS (:,:) = 0. +PINPRG (:,:) = 0. +IF ( KRR == 7 ) PINPRH (:,:) = 0. +IF (PRESENT(PFPR)) PFPR(:,:,:,:) = 0. +! +!* 1. Parameters for cloud sedimentation +! +IF (OSEDIC) THEN + ZRAY(:,:,:) = 0. + ZCONC_TMP(:,:)=PSEA(:,:)*XCONC_SEA+(1.-PSEA(:,:))*XCONC_LAND + + DO JK=KKTB, KKTE + ZLBC(:,:,JK) = PSEA(:,:)*XLBC(2)+(1.-PSEA(:,:))*XLBC(1) + ZFSEDC(:,:,JK) = (PSEA(:,:)*XFSEDC(2)+(1.-PSEA(:,:))*XFSEDC(1)) + ZFSEDC(:,:,JK) = MAX(MIN(XFSEDC(1),XFSEDC(2)),ZFSEDC(:,:,JK)) + ZCONC3D(:,:,JK)= (1.-PTOWN(:,:))*ZCONC_TMP(:,:)+PTOWN(:,:)*XCONC_URBAN + ZRAY(:,:,JK) = 0.5*((1.-PSEA(:,:))*GAMMA(XNUC+1.0/XALPHAC)/(GAMMA(XNUC)) + & + PSEA(:,:)*GAMMA(XNUC2+1.0/XALPHAC2)/(GAMMA(XNUC2))) + END DO + ZRAY(:,:,:) = MAX(1.,ZRAY(:,:,:)) + ZLBC(:,:,:) = MAX(MIN(XLBC(1),XLBC(2)),ZLBC(:,:,:)) +ENDIF +! +!* 2. compute the fluxes +! +! optimization by looking for locations where +! the precipitating fields are larger than a minimal value only !!! +! For optimization we consider each variable separately +! +! External tendecies +IF (OSEDIC) ZPRCS(:,:,:) = PRCS(:,:,:)-PRCT(:,:,:)*ZINVTSTEP +ZPRRS(:,:,:) = PRRS(:,:,:)-PRRT(:,:,:)*ZINVTSTEP +ZPRIS(:,:,:) = PRIS(:,:,:)-PRIT(:,:,:)*ZINVTSTEP +ZPRSS(:,:,:) = PRSS(:,:,:)-PRST(:,:,:)*ZINVTSTEP +ZPRGS(:,:,:) = PRGS(:,:,:)-PRGT(:,:,:)*ZINVTSTEP +IF ( KRR == 7 ) ZPRHS(:,:,:) = PRHS(:,:,:)-PRHT(:,:,:)*ZINVTSTEP +! +! mr values inside the time-splitting loop +ZRCT(:,:,:) = PRCT(:,:,:) +ZRRT(:,:,:) = PRRT(:,:,:) +ZRIT(:,:,:) = PRIT(:,:,:) +ZRST(:,:,:) = PRST(:,:,:) +ZRGT(:,:,:) = PRGT(:,:,:) +IF (KRR==7) ZRHT(:,:,:) = PRHT(:,:,:) +! +DO JK = KKTB , KKTE + ZW(:,:,JK) =1./(PRHODREF(:,:,JK)* PDZZ(:,:,JK)) +END DO +! +! +!* 2.1 for cloud +! +IF (OSEDIC) THEN + ZREMAINT(:,:) = PTSTEP + FIRST = .TRUE. + DO WHILE (ANY(ZREMAINT>0.)) + GSEDIM(:,:,:)=.FALSE. + DO JK = KKTB , KKTE + GSEDIM(KIB:KIE,KJB:KJE,JK) = & + (ZRCT(KIB:KIE,KJB:KJE,JK)>XRTMIN(2) .OR. & + ZPRCS(KIB:KIE,KJB:KJE,JK)>ZRSMIN(2)) .AND. & + ZREMAINT(KIB:KIE,KJB:KJE)>0. + ENDDO + ISEDIM = COUNTJV(GSEDIM(:,:,:),I1(:),I2(:),I3(:)) + CALL INTERNAL_SEDIM_SPLI(KIT, KJT, KKB, KKTB, KKTE, KKT, KKL, KRR, & + &OMOMENTUM, FIRST .AND. OMOMENTUM, & + &ISEDIM, GSEDIM, I1, I2, I3, XSPLIT_MAXCFL, ZREMAINT, & + &PRHODREF, ZW, PDZZ, PPABST, PTHT, PSEA, PTOWN, PTSTEP, & + &2, & + &ZRCT, PRCS, ZWSED, PINPRC, ZPRCS, ZMOMC, ZMOMC_EXT, & + &ZRAY, ZLBC, ZFSEDC, ZCONC3D, PFPR=PFPR) + FIRST = .FALSE. + ENDDO +ENDIF +! +!* 2.2 for rain +! +ZREMAINT(:,:) = PTSTEP +FIRST = .TRUE. +DO WHILE (ANY(ZREMAINT>0.)) + GSEDIM(:,:,:)=.FALSE. + DO JK = KKTB , KKTE + GSEDIM(KIB:KIE,KJB:KJE,JK) = & + (ZRRT(KIB:KIE,KJB:KJE,JK)>XRTMIN(3) .OR. & + ZPRRS(KIB:KIE,KJB:KJE,JK)>ZRSMIN(3)) .AND. & + ZREMAINT(KIB:KIE,KJB:KJE)>0. + ENDDO + ISEDIM = COUNTJV(GSEDIM(:,:,:),I1(:),I2(:),I3(:)) + CALL INTERNAL_SEDIM_SPLI(KIT, KJT, KKB, KKTB, KKTE, KKT, KKL, KRR, & + &OMOMENTUM, FIRST .AND. OMOMENTUM, & + &ISEDIM, GSEDIM, I1, I2, I3, XSPLIT_MAXCFL, ZREMAINT, & + &PRHODREF, ZW, PDZZ, PPABST, PTHT, PSEA, PTOWN, PTSTEP, & + &3, & + &ZRRT, PRRS, ZWSED, PINPRR, ZPRRS, ZMOMR, ZMOMR_EXT, & + &PFPR=PFPR) + FIRST = .FALSE. +ENDDO +! +!* 2.3 for pristine ice +! +ZREMAINT(:,:) = PTSTEP +FIRST = .TRUE. +DO WHILE (ANY(ZREMAINT>0.)) + GSEDIM(:,:,:)=.FALSE. + DO JK = KKTB , KKTE + GSEDIM(KIB:KIE,KJB:KJE,JK) = & + (ZRIT(KIB:KIE,KJB:KJE,JK)>XRTMIN(4) .OR. & + ZPRIS(KIB:KIE,KJB:KJE,JK)>ZRSMIN(4)) .AND. & + ZREMAINT(KIB:KIE,KJB:KJE)>0. + ENDDO + ISEDIM = COUNTJV(GSEDIM(:,:,:),I1(:),I2(:),I3(:)) + CALL INTERNAL_SEDIM_SPLI(KIT, KJT, KKB, KKTB, KKTE, KKT, KKL, KRR, & + &OMOMENTUM, FIRST .AND. OMOMENTUM, & + &ISEDIM, GSEDIM, I1, I2, I3, XSPLIT_MAXCFL, ZREMAINT, & + &PRHODREF, ZW, PDZZ, PPABST, PTHT, PSEA, PTOWN, PTSTEP, & + &4, & + &ZRIT, PRIS, ZWSED, PINPRI, ZPRIS, ZMOMI, ZMOMI_EXT, PFPR=PFPR) + FIRST = .FALSE. +ENDDO +! +!* 2.4 for aggregates/snow +! +ZREMAINT(:,:) = PTSTEP +FIRST = .TRUE. +DO WHILE (ANY(ZREMAINT>0.)) + GSEDIM(:,:,:)=.FALSE. + DO JK = KKTB , KKTE + GSEDIM(KIB:KIE,KJB:KJE,JK) = & + (ZRST(KIB:KIE,KJB:KJE,JK)>XRTMIN(5) .OR. & + ZPRSS(KIB:KIE,KJB:KJE,JK)>ZRSMIN(5)) .AND. & + ZREMAINT(KIB:KIE,KJB:KJE)>0. + ENDDO + ISEDIM = COUNTJV(GSEDIM(:,:,:),I1(:),I2(:),I3(:)) + CALL INTERNAL_SEDIM_SPLI(KIT, KJT, KKB, KKTB, KKTE, KKT, KKL, KRR, & + &OMOMENTUM, FIRST .AND. OMOMENTUM, & + &ISEDIM, GSEDIM, I1, I2, I3, XSPLIT_MAXCFL, ZREMAINT, & + &PRHODREF, ZW, PDZZ, PPABST, PTHT, PSEA, PTOWN, PTSTEP, & + &5, & + &ZRST, PRSS, ZWSED, PINPRS, ZPRSS, ZMOMS, ZMOMS_EXT, PFPR=PFPR) + FIRST = .FALSE. +ENDDO +! +!* 2.5 for graupeln +! +ZREMAINT(:,:) = PTSTEP +FIRST = .TRUE. +DO WHILE (ANY(ZREMAINT>0.)) + GSEDIM(:,:,:)=.FALSE. + DO JK = KKTB , KKTE + GSEDIM(KIB:KIE,KJB:KJE,JK) = & + (ZRGT(KIB:KIE,KJB:KJE,JK)>XRTMIN(6) .OR. & + ZPRGS(KIB:KIE,KJB:KJE,JK)>ZRSMIN(6)) .AND. & + ZREMAINT(KIB:KIE,KJB:KJE)>0. + ENDDO + ISEDIM = COUNTJV(GSEDIM(:,:,:),I1(:),I2(:),I3(:)) + CALL INTERNAL_SEDIM_SPLI(KIT, KJT, KKB, KKTB, KKTE, KKT, KKL, KRR, & + &OMOMENTUM, FIRST .AND. OMOMENTUM, & + &ISEDIM, GSEDIM, I1, I2, I3, XSPLIT_MAXCFL, ZREMAINT, & + &PRHODREF, ZW, PDZZ, PPABST, PTHT, PSEA, PTOWN, PTSTEP, & + &6, & + &ZRGT, PRGS, ZWSED, PINPRG, ZPRGS, ZMOMG, ZMOMG_EXT, PFPR=PFPR) + FIRST = .FALSE. +ENDDO +! +!* 2.6 for hail +! +IF (KRR==7) THEN + ZREMAINT(:,:) = PTSTEP + FIRST = .TRUE. + DO WHILE (ANY(ZREMAINT>0.)) + GSEDIM(:,:,:)=.FALSE. + DO JK = KKTB , KKTE + GSEDIM(KIB:KIE,KJB:KJE,JK) = & + (ZRHT(KIB:KIE,KJB:KJE,JK)>XRTMIN(7) .OR. & + ZPRHS(KIB:KIE,KJB:KJE,JK)>ZRSMIN(7)) .AND. & + ZREMAINT(KIB:KIE,KJB:KJE)>0. + ENDDO + ISEDIM = COUNTJV(GSEDIM(:,:,:),I1(:),I2(:),I3(:)) + CALL INTERNAL_SEDIM_SPLI(KIT, KJT, KKB, KKTB, KKTE, KKT, KKL, KRR, & + &OMOMENTUM, FIRST .AND. OMOMENTUM, & + &ISEDIM, GSEDIM, I1, I2, I3, XSPLIT_MAXCFL, ZREMAINT, & + &PRHODREF, ZW, PDZZ, PPABST, PTHT, PSEA, PTOWN, PTSTEP, & + &7, & + &ZRHT, PRHS, ZWSED, PINPRH, ZPRHS, ZMOMH, ZMOMH_EXT, PFPR=PFPR) + FIRST = .FALSE. + END DO +ENDIF +! +! +CONTAINS +! +! +!------------------------------------------------------------------------------- +! +! + SUBROUTINE INTERNAL_SEDIM_SPLI(KIT, KJT, KKB, KKTB, KKTE, KKT, KKL, KRR, & + &OMOMENTUM, OCOMPUTE_MOM, & + &KSEDIM, LDSEDIM, I1, I2, I3, PMAXCFL, PREMAINT, & + &PRHODREF, POORHODZ, PDZZ, PPABST, PTHT, PSEA, PTOWN, PTSTEP, & + &KSPE, & + &PRXT, PRXS, PWSED, PINPRX, PPRXS, PMOM, PMOM_EXT, & + &PRAY, PLBC, PFSEDC, PCONC3D, PFPR) + ! + !* 0. DECLARATIONS + ! ------------ + ! + USE MODD_RAIN_ICE_DESCR + USE MODD_RAIN_ICE_PARAM + ! + IMPLICIT NONE + ! + !* 0.1 Declarations of dummy arguments : + ! + INTEGER, INTENT(IN) :: KIT, KJT, KKB, KKTB, KKTE, KKT, KKL, KRR + LOGICAL, INTENT(IN) :: OMOMENTUM, OCOMPUTE_MOM + INTEGER, INTENT(IN) :: KSEDIM + LOGICAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: LDSEDIM + INTEGER, DIMENSION(KSEDIM), INTENT(IN) :: I1, I2, I3 + REAL, INTENT(IN) :: PMAXCFL ! maximum CFL allowed + REAL, DIMENSION(KIT,KJT), INTENT(INOUT) :: PREMAINT ! Time remaining until the end of the timestep + REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODREF ! Reference density + REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: POORHODZ ! One Over (Rhodref times delta Z) + REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PDZZ ! layer thikness (m) + REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PPABST + REAL, DIMENSION(KIT,KJT), INTENT(IN) :: PSEA ! Sea Mask + REAL, DIMENSION(KIT,KJT), INTENT(IN) :: PTOWN ! Fraction that is town + REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PTHT + REAL, INTENT(IN) :: PTSTEP ! total timestep + INTEGER, INTENT(IN) :: KSPE ! 1 for rc, 2 for rr... + REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRXT ! mr of specy X + REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRXS !Tendency of the specy KSPE + REAL, DIMENSION(KIT,KJT,0:KKT+1), INTENT(OUT) :: PWSED ! sedimentation flux + REAL, DIMENSION(KIT,KJT), INTENT(INOUT) :: PINPRX ! instant precip + REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PPRXS ! external tendencie + REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PMOM ! momentum associated to PRXT + REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PMOM_EXT ! momentum tendency associated to PPRXS + REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN), OPTIONAL :: PRAY, PLBC, PFSEDC, PCONC3D + REAL, DIMENSION(KIT,KJT,KKT,KRR), OPTIONAL, INTENT(INOUT) :: PFPR ! upper-air precipitation fluxes + ! + !* 0.2 declaration of local variables + ! + ! + character(len=10) :: yspe ! String for error message + INTEGER :: JK, JL, JI, JJ + REAL :: ZINVTSTEP + REAL :: ZZWLBDC, ZRAY, ZZT, ZZWLBDA, ZZCC + REAL :: ZFSED, ZEXSED + REAL, DIMENSION(KIT, KJT) :: ZMRCHANGE + REAL, DIMENSION(KIT, KJT) :: ZMAX_TSTEP ! Maximum CFL in column + REAL, DIMENSION(KIT,KJT,0:KKT+1) :: ZWSED_MOM ! Momentum flux + REAL, DIMENSION(SIZE(XRTMIN)) :: ZRSMIN + ! + !------------------------------------------------------------------------------- + ! + ! + !* 1. Parameters for cloud sedimentation + ! + ! + IF(OCOMPUTE_MOM .AND. .NOT. OMOMENTUM) THEN + call Print_msg( NVERB_FATAL, 'GEN', 'ICE4_SEDIMENTATION_SPLIT_MOMENTUM', & + 'OCOMPUTE_MOM cannot be .TRUE. if we do not use momentum' ) + ENDIF + !* 2. compute the fluxes + ! + ! + ZINVTSTEP = 1./PTSTEP + ZRSMIN(:) = XRTMIN(:) * ZINVTSTEP + IF(KSPE==2) THEN + !******* for cloud + IF(OCOMPUTE_MOM .OR. .NOT. OMOMENTUM) THEN + PWSED(:,:,:) = 0. + PMOM_EXT(:,:,:) = 0. + DO JL=1, KSEDIM + JI=I1(JL) + JJ=I2(JL) + JK=I3(JL) + IF(PRXT(JI,JJ,JK)>XRTMIN(KSPE)) THEN + ZZWLBDC = PLBC(JI,JJ,JK) * PCONC3D(JI,JJ,JK) / & + (PRHODREF(JI,JJ,JK) * PRXT(JI,JJ,JK)) + ZZWLBDC = ZZWLBDC**XLBEXC + ZRAY = PRAY(JI,JJ,JK) / ZZWLBDC + ZZT = PTHT(JI,JJ,JK) * (PPABST(JI,JJ,JK)/XP00)**(XRD/XCPD) + ZZWLBDA = 6.6E-8*(101325./PPABST(JI,JJ,JK))*(ZZT/293.15) + ZZCC = XCC*(1.+1.26*ZZWLBDA/ZRAY) + PWSED(JI, JJ, JK) = PRHODREF(JI,JJ,JK)**(-XCEXVT +1 ) * & + ZZWLBDC**(-XDC)*ZZCC*PFSEDC(JI,JJ,JK) * PRXT(JI,JJ,JK) + ENDIF + IF(PPRXS(JI,JJ,JK)>ZRSMIN(KSPE) .AND. OCOMPUTE_MOM) THEN + ZZWLBDC = PLBC(JI,JJ,JK) * PCONC3D(JI,JJ,JK) / & + (PRHODREF(JI,JJ,JK) * PPRXS(JI,JJ,JK) * PTSTEP) + ZZWLBDC = ZZWLBDC**XLBEXC + ZRAY = PRAY(JI,JJ,JK) / ZZWLBDC + ZZT = PTHT(JI,JJ,JK) * (PPABST(JI,JJ,JK)/XP00)**(XRD/XCPD) + ZZWLBDA = 6.6E-8*(101325./PPABST(JI,JJ,JK))*(ZZT/293.15) + ZZCC = XCC*(1.+1.26*ZZWLBDA/ZRAY) + PMOM_EXT(JI, JJ, JK) = PRHODREF(JI,JJ,JK)**(-XCEXVT +1 -1) * & + ZZWLBDC**(-XDC)*ZZCC*PFSEDC(JI,JJ,JK) * PPRXS(JI,JJ,JK) + ENDIF + ENDDO + IF(OCOMPUTE_MOM) PMOM(:, :, :)=PWSED(:, :, 1:KKT) + ENDIF + ELSEIF(KSPE==4) THEN + ! ******* for pristine ice + IF(OCOMPUTE_MOM .OR. .NOT. OMOMENTUM) THEN + PWSED(:,:,:) = 0. + PMOM_EXT(:,:,:) = 0. + DO JL=1, KSEDIM + JI=I1(JL) + JJ=I2(JL) + JK=I3(JL) + IF(PRXT(JI, JJ, JK) .GT. MAX(XRTMIN(4), 1.0E-7)) THEN + PWSED(JI, JJ, JK) = XFSEDI * PRXT(JI, JJ, JK) * & + & PRHODREF(JI,JJ,JK)**(1.-XCEXVT) * & ! McF&H + & MAX( 0.05E6,-0.15319E6-0.021454E6* & + & ALOG(PRHODREF(JI,JJ,JK)*PRXT(JI,JJ,JK)) )**XEXCSEDI + ENDIF + IF(PPRXS(JI,JJ,JK)>MAX(ZRSMIN(4), 1.0E-7/PTSTEP) .AND. OCOMPUTE_MOM) THEN + PMOM_EXT(JI, JJ, JK) = XFSEDI * PPRXS(JI, JJ, JK) * & + & PRHODREF(JI,JJ,JK)**(1.-XCEXVT-1) * & ! McF&H + & MAX( 0.05E6,-0.15319E6-0.021454E6* & + & ALOG(PRHODREF(JI,JJ,JK)*PPRXS(JI,JJ,JK)*PTSTEP) )**XEXCSEDI + ENDIF + ENDDO + IF(OCOMPUTE_MOM) PMOM(:, :, :)=PWSED(:, :, 1:KKT) + ENDIF + ELSE + ! ******* for other species + IF(KSPE==3) THEN + ZFSED=XFSEDR + ZEXSED=XEXSEDR + ELSEIF(KSPE==5) THEN + ZFSED=XFSEDS + ZEXSED=XEXSEDS + ELSEIF(KSPE==6) THEN + ZFSED=XFSEDG + ZEXSED=XEXSEDG + ELSEIF(KSPE==7) THEN + ZFSED=XFSEDH + ZEXSED=XEXSEDH + ELSE + write( yspe, '( I10 )' ) kspe + call Print_msg( NVERB_FATAL, 'GEN', 'ICE4_SEDIMENTATION_SPLIT_MOMENTUM', & + 'no sedimentation parameter for KSPE='//trim(yspe) ) + ENDIF + IF(OCOMPUTE_MOM .OR. .NOT. OMOMENTUM) THEN + !Momentum (per m3) and mass flux are given by the same formulae + PWSED(:,:,:) = 0. + PMOM_EXT(:,:,:) = 0. + DO JL=1, KSEDIM + JI=I1(JL) + JJ=I2(JL) + JK=I3(JL) + IF(PRXT(JI,JJ,JK)>XRTMIN(KSPE)) THEN + PWSED(JI, JJ, JK) = ZFSED * PRXT(JI, JJ, JK)**ZEXSED * & + PRHODREF(JI, JJ, JK)**(ZEXSED-XCEXVT) + ENDIF + IF(PPRXS(JI,JJ,JK)>ZRSMIN(KSPE) .AND. OCOMPUTE_MOM) THEN + PMOM_EXT(JI, JJ, JK) = ZFSED * (PPRXS(JI, JJ, JK)*PTSTEP)**ZEXSED * & + PRHODREF(JI, JJ, JK)**(ZEXSED-XCEXVT-1) * ZINVTSTEP + ENDIF + ENDDO + IF(OCOMPUTE_MOM) PMOM(:, :, :)=PWSED(:, :, 1:KKT) / PRHODREF(:, :, :) ! momentum per kg of dry air + ENDIF + ENDIF + IF(OMOMENTUM) THEN + PWSED(:,:,:) = 0. + ZWSED_MOM(:,:,:) = 0. + DO JL=1, KSEDIM + JI=I1(JL) + JJ=I2(JL) + JK=I3(JL) + IF(PRXT(JI,JJ,JK)>XRTMIN(KSPE)) THEN + ZWSED_MOM(JI, JJ, JK) = PMOM(JI, JJ, JK)**2 / PRXT(JI, JJ, JK) * PRHODREF(JI, JJ, JK) ! (kg*m/s)/(s*m**2) + ENDIF + ENDDO + PWSED(:, :, 1:KKT) = PMOM(:, :, :)*PRHODREF(:, :, :) !PMOM divided by r to get speed and multiply by rho*r to get flux + ENDIF + ZMAX_TSTEP(:,:) = PREMAINT(:,:) + DO JL=1, KSEDIM + JI=I1(JL) + JJ=I2(JL) + JK=I3(JL) + IF(PRXT(JI,JJ,JK)>XRTMIN(KSPE)) THEN + ZMAX_TSTEP(JI, JJ) = MIN(ZMAX_TSTEP(JI, JJ), PMAXCFL * PRHODREF(JI, JJ, JK) * & + PRXT(JI, JJ, JK) * PDZZ(JI, JJ, JK) / PWSED(JI, JJ, JK)) + ENDIF + ENDDO + ZMRCHANGE(:,:) = 0. + PREMAINT(:,:) = PREMAINT(:,:) - ZMAX_TSTEP(:,:) + DO JK = KKTB , KKTE + ZMRCHANGE(:,:) = ZMAX_TSTEP(:,:) * POORHODZ(:,:,JK)*(PWSED(:,:,JK+KKL)-PWSED(:,:,JK)) + PRXT(:,:,JK) = PRXT(:,:,JK) + ZMRCHANGE(:,:) + PPRXS(:,:,JK) * ZMAX_TSTEP(:,:) + PRXS(:,:,JK) = PRXS(:,:,JK) + ZMRCHANGE(:,:) * ZINVTSTEP + ENDDO + IF(OMOMENTUM) THEN + DO JK = KKTB , KKTE + PMOM(:,:,JK) = PMOM(:,:,JK) + ZMAX_TSTEP(:,:) * POORHODZ(:,:,JK) * (ZWSED_MOM(:,:,JK+KKL)-ZWSED_MOM(:,:,JK)) + PMOM(:,:,JK) = PMOM(:,:,JK) + ZMAX_TSTEP(:,:) * PMOM_EXT(:,:,JK) + PMOM(:,:,JK) = MAX(0., PMOM(:,:,JK)) + ENDDO + ENDIF + PINPRX(:,:) = PINPRX(:,:) + ZWSED(:,:,KKB) / XRHOLW * (ZMAX_TSTEP(:,:) * ZINVTSTEP) + IF (PRESENT(PFPR)) THEN + DO JK = KKTB , KKTE + PFPR(:,:,JK,KSPE) = PFPR(:,:,JK,KSPE) + ZWSED(:,:,JK) * (ZMAX_TSTEP(:,:) * ZINVTSTEP) + ENDDO + ENDIF + ! + END SUBROUTINE INTERNAL_SEDIM_SPLI + ! +END SUBROUTINE ICE4_SEDIMENTATION_SPLIT_MOMENTUM diff --git a/src/mesonh/micro/ice4_sedimentation_stat.f90 b/src/mesonh/micro/ice4_sedimentation_stat.f90 new file mode 100644 index 000000000..3cbb31493 --- /dev/null +++ b/src/mesonh/micro/ice4_sedimentation_stat.f90 @@ -0,0 +1,444 @@ +!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +MODULE MODI_ICE4_SEDIMENTATION_STAT +INTERFACE +SUBROUTINE ICE4_SEDIMENTATION_STAT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB, KKTE, KKT, KKL, & + &PTSTEP, KRR, OSEDIC, ODEPOSC, PVDEPOSC, PDZZ, & + &PRHODREF, PPABST, PTHT, PRHODJ, & + &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT,& + &PRSS, PRST, PRGS, PRGT,& + &PINPRC, PINDEP, PINPRR, PINPRI, PINPRS, PINPRG, & + &PSEA, PTOWN, & + &PINPRH, PRHT, PRHS, PFPR) +IMPLICIT NONE +INTEGER, INTENT(IN) :: KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB, KKTE, KKT +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO +REAL, INTENT(IN) :: PTSTEP ! Double Time step (single if cold start) +INTEGER, INTENT(IN) :: KRR ! Number of moist variable +LOGICAL, INTENT(IN) :: OSEDIC ! Switch for droplet sedim. +LOGICAL, INTENT(IN) :: ODEPOSC ! Switch for droplet depos. +REAL, INTENT(IN) :: PVDEPOSC! Droplet deposition velocity +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PDZZ ! Layer thikness (m) +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PPABST ! absolute pressure at t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRRS ! Rain water m.r. source +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRIT ! Pristine ice m.r. at t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRSS ! Snow/aggregate m.r. source +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRGS ! Graupel m.r. source +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRGT ! Graupel/hail m.r. at t +REAL, DIMENSION(:,:), INTENT(OUT) :: PINPRC ! Cloud instant precip +REAL, DIMENSION(:,:), INTENT(OUT) :: PINDEP ! Cloud instant deposition +REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRR ! Rain instant precip +REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRI ! Pristine ice instant precip +REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRS ! Snow instant precip +REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRG ! Graupel instant precip +REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(IN) :: PSEA ! Sea Mask +REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(IN) :: PTOWN ! Fraction that is town +REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(OUT) :: PINPRH ! Hail instant precip +REAL, DIMENSION(KIT,KJT,KKT), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t +REAL, DIMENSION(KIT,KJT,KKT), OPTIONAL, INTENT(INOUT) :: PRHS ! Hail m.r. source +REAL, DIMENSION(KIT,KJT,KKT,KRR), OPTIONAL, INTENT(OUT) :: PFPR ! upper-air precipitation fluxes +END SUBROUTINE ICE4_SEDIMENTATION_STAT +END INTERFACE +END MODULE MODI_ICE4_SEDIMENTATION_STAT +SUBROUTINE ICE4_SEDIMENTATION_STAT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB, KKTE, KKT, KKL, & + &PTSTEP, KRR, OSEDIC, ODEPOSC, PVDEPOSC, PDZZ, & + &PRHODREF, PPABST, PTHT, PRHODJ, & + &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, & + &PRSS, PRST, PRGS, PRGT,& + &PINPRC, PINDEP, PINPRR, PINPRI, PINPRS, PINPRG, & + &PSEA, PTOWN, & + &PINPRH, PRHT, PRHS, PFPR) + +!! +!!** PURPOSE +!! ------- +!! Computes the sedimentation +!! +!! AUTHOR +!! ------ +!! S. Riette from the plitting of rain_ice source code (nov. 2014) +!! +!! MODIFICATIONS +!! ------------- +!! +! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg +! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 +! P. Wautelet 21/01/2021: initialize untouched part of PFPR +! +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST + +USE MODE_MSG + +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +INTEGER, INTENT(IN) :: KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB, KKTE, KKT +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO +REAL, INTENT(IN) :: PTSTEP ! Double Time step (single if cold start) +INTEGER, INTENT(IN) :: KRR ! Number of moist variable +LOGICAL, INTENT(IN) :: OSEDIC ! Switch for droplet sedim. +LOGICAL, INTENT(IN) :: ODEPOSC ! Switch for droplet depos. +REAL, INTENT(IN) :: PVDEPOSC! Droplet deposition velocity +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PDZZ ! Layer thikness (m) +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PPABST ! absolute pressure at t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRRS ! Rain water m.r. source +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRIT ! Pristine ice m.r. at t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRSS ! Snow/aggregate m.r. source +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRGS ! Graupel m.r. source +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRGT ! Graupel/hail m.r. at t +REAL, DIMENSION(:,:), INTENT(OUT) :: PINPRC ! Cloud instant precip +REAL, DIMENSION(:,:), INTENT(OUT) :: PINDEP ! Cloud instant deposition +REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRR ! Rain instant precip +REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRI ! Pristine ice instant precip +REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRS ! Snow instant precip +REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRG ! Graupel instant precip +REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(IN) :: PSEA ! Sea Mask +REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(IN) :: PTOWN ! Fraction that is town +REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(OUT) :: PINPRH ! Hail instant precip +REAL, DIMENSION(KIT,KJT,KKT), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t +REAL, DIMENSION(KIT,KJT,KKT), OPTIONAL, INTENT(INOUT) :: PRHS ! Hail m.r. source +REAL, DIMENSION(KIT,KJT,KKT,KRR), OPTIONAL, INTENT(OUT) :: PFPR ! upper-air precipitation fluxes +! +!* 0.2 declaration of local variables +! +! +INTEGER :: JK +! +REAL :: ZINVTSTEP +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: ZW ! work array +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),0:SIZE(PRHODREF,3)+1) & + :: ZWSED ! sedimentation fluxes +LOGICAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2)):: GDEP +! +! +!------------------------------------------------------------------------------- +! +ZINVTSTEP=1./PTSTEP + +IF ( PRESENT( PFPR ) ) THEN + !Set to 0. to avoid undefined values (in files) + PFPR(:, :, : KKTB - 1, :) = 0. + PFPR(:, :, KKTE + 1 :, :) = 0. +END IF +!------------------------------------------------------------------------------- +! +!* 1. compute the fluxes +! +! +DO JK = KKTB , KKTE + ZW(:,:,JK) =PTSTEP/(PRHODREF(:,:,JK)* PDZZ(:,:,JK) ) +END DO +! +!* 2.1 for cloud +! +IF (OSEDIC) THEN + CALL INTERNAL_SEDIM_STAT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKTB, KKTE, KKL, & + &PRHODREF, PDZZ, ZW, PPABST, PTHT, PTSTEP, & + &2, & + &PRCT, PRCS, ZWSED, PSEA, PTOWN) + IF (PRESENT(PFPR)) THEN + DO JK = KKTB , KKTE + PFPR(:,:,JK,2)=ZWSED(:,:,JK) + ENDDO + ENDIF + PINPRC(:,:) = ZWSED(:,:,KKB)/XRHOLW ! in m/s +ENDIF +! +! +!* 2.1bis DROPLET DEPOSITION AT THE 1ST LEVEL ABOVE GROUND +! +IF (ODEPOSC) THEN + GDEP(:,:) = .FALSE. + GDEP(KIB:KIE,KJB:KJE) = PRCS(KIB:KIE,KJB:KJE,KKB) >0 + WHERE (GDEP) + PRCS(:,:,KKB) = PRCS(:,:,KKB) - PVDEPOSC * PRCT(:,:,KKB) / PDZZ(:,:,KKB) + PINPRC(:,:) = PINPRC(:,:) + PVDEPOSC * PRCT(:,:,KKB) * PRHODREF(:,:,KKB) /XRHOLW + PINDEP(:,:) = PVDEPOSC * PRCT(:,:,KKB) * PRHODREF(:,:,KKB) /XRHOLW + END WHERE +END IF +! +!* 2.2 for rain +! +CALL INTERNAL_SEDIM_STAT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKTB, KKTE, KKL, & + &PRHODREF, PDZZ, ZW, PPABST, PTHT, PTSTEP, & + &3, & + &PRRT, PRRS, ZWSED) +IF (PRESENT(PFPR)) THEN + DO JK = KKTB , KKTE + PFPR(:,:,JK,3)=ZWSED(:,:,JK) + ENDDO +ENDIF +PINPRR(:,:) = ZWSED(:,:,KKB)/XRHOLW ! in m/s +! +!* 2.3 for pristine ice +! +CALL INTERNAL_SEDIM_STAT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKTB, KKTE, KKL, & + &PRHODREF, PDZZ, ZW, PPABST, PTHT, PTSTEP, & + &4, & + &PRIT, PRIS, ZWSED) +IF (PRESENT(PFPR)) THEN + DO JK = KKTB , KKTE + PFPR(:,:,JK,4)=ZWSED(:,:,JK) + ENDDO +ENDIF +PINPRI(:,:) = ZWSED(:,:,KKB)/XRHOLW ! in m/s +! +!* 2.4 for aggregates/snow +! +CALL INTERNAL_SEDIM_STAT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKTB, KKTE, KKL, & + &PRHODREF, PDZZ, ZW, PPABST, PTHT, PTSTEP, & + &5, & + &PRST, PRSS, ZWSED) +IF (PRESENT(PFPR)) THEN + DO JK = KKTB , KKTE + PFPR(:,:,JK,5)=ZWSED(:,:,JK) + ENDDO +ENDIF +PINPRS(:,:) = ZWSED(:,:,KKB)/XRHOLW ! in m/s +! +!* 2.5 for graupeln +! +CALL INTERNAL_SEDIM_STAT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKTB, KKTE, KKL, & + &PRHODREF, PDZZ, ZW, PPABST, PTHT, PTSTEP, & + &6, & + &PRGT, PRGS, ZWSED) +IF (PRESENT(PFPR)) THEN + DO JK = KKTB , KKTE + PFPR(:,:,JK,6)=ZWSED(:,:,JK) + ENDDO +ENDIF +PINPRG(:,:) = ZWSED(:,:,KKB)/XRHOLW ! in m/s +! +!* 2.6 for hail +! +IF ( KRR == 7 ) THEN + CALL INTERNAL_SEDIM_STAT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKTB, KKTE, KKL, & + &PRHODREF, PDZZ, ZW, PPABST, PTHT, PTSTEP, & + &7, & + &PRHT, PRHS, ZWSED) + IF (PRESENT(PFPR)) THEN + DO JK = KKTB , KKTE + PFPR(:,:,JK,7)=ZWSED(:,:,JK) + ENDDO + ENDIF + PINPRH(:,:) = ZWSED(:,:,KKB)/XRHOLW ! in m/s +ENDIF +! +! +CONTAINS + SUBROUTINE INTERNAL_SEDIM_STAT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKTB, KKTE, KKL, & + &PRHODREF, PDZZ, PTSORHODZ, PPABST, PTHT, PTSTEP, & + &KSPE, & + &PRXT, PRXS, PWSED, PSEA, PTOWN) + ! + !* 0. DECLARATIONS + ! ------------ + ! + use mode_tools, only: Countjv + + USE MODD_RAIN_ICE_DESCR + USE MODD_RAIN_ICE_PARAM + + USE MODI_GAMMA + + IMPLICIT NONE + ! + !* 0.1 Declarations of dummy arguments : + ! + INTEGER, INTENT(IN) :: KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKT, KKE, KKTB, KKTE, KKL + REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODREF ! Reference density + REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PDZZ ! Layer thikness (m) + REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PTSORHODZ ! TimeStep Over (Rhodref times delta Z) + REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PPABST + REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PTHT + REAL, INTENT(IN) :: PTSTEP + INTEGER, INTENT(IN) :: KSPE ! 1 for rc, 2 for rr... + REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRXT ! mr of specy X + REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRXS !Tendency of the specy KSPE + REAL, DIMENSION(KIT,KJT,0:KKT+1), INTENT(OUT) :: PWSED ! sedimentation flux + REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(IN) :: PSEA ! Sea Mask + REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(IN) :: PTOWN ! Fraction that is town + ! + !* 0.2 declaration of local variables + ! + ! + character(len=10) :: yspe ! String for error message + INTEGER :: JK, JCOUNT, JL, JI, JJ + INTEGER, DIMENSION(SIZE(PRHODREF,1)*SIZE(PRHODREF,2)) :: I1, I2 + REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),0:SIZE(PRHODREF,3)+1) & + :: ZWSEDW1, ZWSEDW2 ! sedimentation speed + REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2)) :: ZQP + REAL :: ZINVTSTEP, ZH, ZP1, ZP2, ZZWLBDA, ZZWLBDC, ZZCC + REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) :: ZCONC3D ! droplet condensation + REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) :: & + ZRAY, & ! Cloud Mean radius + ZLBC, & ! XLBC weighted by sea fraction + ZFSEDC + REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2)) & + :: ZCONC_TMP ! Weighted concentration + REAL :: ZFSED, ZEXSED + ! + !------------------------------------------------------------------------------- + ! + ! + !* 1. Parameters for cloud sedimentation + ! + IF(KSPE==2) THEN + ZRAY(:,:,:) = 0. + ZLBC(:,:,:) = XLBC(1) + ZFSEDC(:,:,:) = XFSEDC(1) + ZCONC3D(:,:,:)= XCONC_LAND + ZCONC_TMP(:,:)= XCONC_LAND + IF (PRESENT(PSEA)) THEN + ZCONC_TMP(:,:)=PSEA(:,:)*XCONC_SEA+(1.-PSEA(:,:))*XCONC_LAND + DO JK=KKTB,KKTE + ZLBC(:,:,JK) = PSEA(:,:)*XLBC(2)+(1.-PSEA(:,:))*XLBC(1) + ZFSEDC(:,:,JK) = (PSEA(:,:)*XFSEDC(2)+(1.-PSEA(:,:))*XFSEDC(1)) + ZFSEDC(:,:,JK) = MAX(MIN(XFSEDC(1),XFSEDC(2)),ZFSEDC(:,:,JK)) + ZCONC3D(:,:,JK)= (1.-PTOWN(:,:))*ZCONC_TMP(:,:)+PTOWN(:,:)*XCONC_URBAN + ZRAY(:,:,JK) = 0.5*((1.-PSEA(:,:))*GAMMA(XNUC+1.0/XALPHAC)/(GAMMA(XNUC)) + & + PSEA(:,:)*GAMMA(XNUC2+1.0/XALPHAC2)/(GAMMA(XNUC2))) + END DO + ELSE + ZCONC3D(:,:,:) = XCONC_LAND + ZRAY(:,:,:) = 0.5*(GAMMA(XNUC+1.0/XALPHAC)/(GAMMA(XNUC))) + END IF + ZRAY(:,:,:) = MAX(1.,ZRAY(:,:,:)) + ZLBC(:,:,:) = MAX(MIN(XLBC(1),XLBC(2)),ZLBC(:,:,:)) + ENDIF + ! + !* 2. compute the fluxes + ! + ! + ZINVTSTEP = 1./PTSTEP + PWSED(:,:,:) = 0. + ZWSEDW1(:,:,:) = 0. + ZWSEDW2(:,:,:) = 0. + ! calculation of ZP1, ZP2 and sedimentation flux + DO JK = KKE , KKB, -1*KKL + !estimation of q' taking into account incomming PWSED + ZQP(:,:)=PWSED(:,:,JK+KKL)*PTSORHODZ(:,:,JK) + JCOUNT=COUNTJV( (PRXT(:,:,JK) > XRTMIN(KSPE)) .OR. (ZQP(:,:) > XRTMIN(KSPE)) ,I1(:),I2(:)) + IF(KSPE==2) THEN + !******* for cloud + DO JL=1, JCOUNT + JI=I1(JL) + JJ=I2(JL) + !calculation of w + IF(PRXT(JI,JJ,JK) > XRTMIN(KSPE)) THEN + ZZWLBDA=6.6E-8*(101325./PPABST(JI,JJ,JK))*(PTHT(JI,JJ,JK)/293.15) + ZZWLBDC=(ZLBC(JI,JJ,JK)*ZCONC3D(JI,JJ,JK) & + &/(PRHODREF(JI,JJ,JK)*PRXT(JI,JJ,JK)))**XLBEXC + ZZCC=XCC*(1.+1.26*ZZWLBDA*ZZWLBDC/ZRAY(JI,JJ,JK)) !! ZCC : Fall speed + ZWSEDW1 (JI,JJ,JK)=PRHODREF(JI,JJ,JK)**(-XCEXVT ) * & + & ZZWLBDC**(-XDC)*ZZCC*ZFSEDC(JI,JJ,JK) + ENDIF + IF ( ZQP(JI,JJ) > XRTMIN(KSPE) ) THEN + ZZWLBDA=6.6E-8*(101325./PPABST(JI,JJ,JK))*(PTHT(JI,JJ,JK)/293.15) + ZZWLBDC=(ZLBC(JI,JJ,JK)*ZCONC3D(JI,JJ,JK) & + &/(PRHODREF(JI,JJ,JK)*ZQP(JI,JJ)))**XLBEXC + ZZCC=XCC*(1.+1.26*ZZWLBDA*ZZWLBDC/ZRAY(JI,JJ,JK)) !! ZCC : Fall speed + ZWSEDW2 (JI,JJ,JK)=PRHODREF(JI,JJ,JK)**(-XCEXVT ) * & + & ZZWLBDC**(-XDC)*ZZCC*ZFSEDC(JI,JJ,JK) + ENDIF + ENDDO + ELSEIF(KSPE==4) THEN + ! ******* for pristine ice + DO JL=1, JCOUNT + JI=I1(JL) + JJ=I2(JL) + !calculation of w + IF ( PRXT(JI,JJ,JK) > MAX(XRTMIN(KSPE),1.0E-7 ) ) THEN + ZWSEDW1 (JI,JJ,JK)= XFSEDI * & + & PRHODREF(JI,JJ,JK)**(-XCEXVT) * & ! McF&H + & MAX( 0.05E6,-0.15319E6-0.021454E6* & + & ALOG(PRHODREF(JI,JJ,JK)*PRXT(JI,JJ,JK)) )**XEXCSEDI + ENDIF + IF ( ZQP(JI,JJ) > MAX(XRTMIN(KSPE),1.0E-7 ) ) THEN + ZWSEDW2 (JI,JJ,JK)= XFSEDI * & + & PRHODREF(JI,JJ,JK)**(-XCEXVT) * & ! McF&H + & MAX( 0.05E6,-0.15319E6-0.021454E6* & + & ALOG(PRHODREF(JI,JJ,JK)*ZQP(JI,JJ)) )**XEXCSEDI + ENDIF + ENDDO + ELSE + ! ******* for other species + IF(KSPE==3) THEN + ZFSED=XFSEDR + ZEXSED=XEXSEDR + ELSEIF(KSPE==5) THEN + ZFSED=XFSEDS + ZEXSED=XEXSEDS + ELSEIF(KSPE==6) THEN + ZFSED=XFSEDG + ZEXSED=XEXSEDG + ELSEIF(KSPE==7) THEN + ZFSED=XFSEDH + ZEXSED=XEXSEDH + ELSE + write( yspe, '( I10 )' ) kspe + call Print_msg( NVERB_FATAL, 'GEN', 'ICE4_SEDIMENTATION_STAT', & + 'no sedimentation parameter for KSPE='//trim(yspe) ) + ENDIF + DO JL=1, JCOUNT + JI=I1(JL) + JJ=I2(JL) + !calculation of w + IF ( PRXT(JI,JJ,JK) > XRTMIN(KSPE) ) THEN + ZWSEDW1 (JI,JJ,JK)= ZFSED *PRXT(JI,JJ,JK)**(ZEXSED-1)* & + PRHODREF(JI,JJ,JK)**(ZEXSED-XCEXVT-1) + ENDIF + IF ( ZQP(JI,JJ) > XRTMIN(KSPE) ) THEN + ZWSEDW2 (JI,JJ,JK)= ZFSED *ZQP(JI,JJ)**(ZEXSED-1)* & + PRHODREF(JI,JJ,JK)**(ZEXSED-XCEXVT-1) + ENDIF + ENDDO + ENDIF + DO JJ = KJB, KJE + DO JI = KIB, KIE + ZH=PDZZ(JI,JJ,JK) + ZP1 = MIN(1., ZWSEDW1(JI,JJ,JK) * PTSTEP / ZH ) + IF (ZWSEDW2(JI,JJ,JK) /= 0.) THEN + ZP2 = MAX(0.,1 - ZH & + & / (PTSTEP*ZWSEDW2(JI,JJ,JK)) ) + ELSE + ZP2 = 0. + ENDIF + PWSED (JI,JJ,JK)=ZP1*PRHODREF(JI,JJ,JK)*& + &ZH*PRXT(JI,JJ,JK)& + &* ZINVTSTEP+ ZP2 * PWSED (JI,JJ,JK+KKL) + ENDDO + ENDDO + ENDDO + DO JK = KKTB , KKTE + PRXS(:,:,JK) = PRXS(:,:,JK) + & + & PTSORHODZ(:,:,JK)*(PWSED(:,:,JK+KKL)-PWSED(:,:,JK))*ZINVTSTEP + ENDDO + END SUBROUTINE INTERNAL_SEDIM_STAT + ! +END SUBROUTINE ICE4_SEDIMENTATION_STAT diff --git a/src/mesonh/micro/ice4_slow.f90 b/src/mesonh/micro/ice4_slow.f90 new file mode 100644 index 000000000..15d0cd78e --- /dev/null +++ b/src/mesonh/micro/ice4_slow.f90 @@ -0,0 +1,263 @@ +!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +MODULE MODI_ICE4_SLOW +INTERFACE +SUBROUTINE ICE4_SLOW(KSIZE, LDSOFT, PCOMPUTE, PRHODREF, PT,& + &PSSI, PLVFACT, PLSFACT, & + &PRVT, PRCT, PRIT, PRST, PRGT,& + &PLBDAS, PLBDAG,& + &PAI, PCJ, PHLI_HCF, PHLI_HRI,& + &PRCHONI, PRVDEPS, PRIAGGS, PRIAUTS, PRVDEPG, & + &PA_TH, PA_RV, PA_RC, PA_RI, PA_RS, PA_RG) +IMPLICIT NONE +INTEGER, INTENT(IN) :: KSIZE +LOGICAL, INTENT(IN) :: LDSOFT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature +REAL, DIMENSION(KSIZE), INTENT(IN) :: PSSI ! Supersaturation over ice +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLVFACT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLSFACT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRVT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRIT ! Pristine ice m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRGT ! Graupel/hail m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAS ! Slope parameter of the aggregate distribution +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAG ! Slope parameter of the graupel distribution +REAL, DIMENSION(KSIZE), INTENT(IN) :: PAI ! Thermodynamical function +REAL, DIMENSION(KSIZE), INTENT(IN) :: PCJ ! Function to compute the ventilation coefficient +REAL, DIMENSION(KSIZE), INTENT(IN) :: PHLI_HCF ! +REAL, DIMENSION(KSIZE), INTENT(IN) :: PHLI_HRI ! +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCHONI ! Homogeneous nucleation +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRVDEPS ! Deposition on r_s +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRIAGGS ! Aggregation on r_s +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRIAUTS ! Autoconversion of r_i for r_s production +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRVDEPG ! Deposition on r_g +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_TH +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RV +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RC +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RI +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RS +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RG +END SUBROUTINE ICE4_SLOW +END INTERFACE +END MODULE MODI_ICE4_SLOW +SUBROUTINE ICE4_SLOW(KSIZE, LDSOFT, PCOMPUTE, PRHODREF, PT, & + &PSSI, PLVFACT, PLSFACT, & + &PRVT, PRCT, PRIT, PRST, PRGT, & + &PLBDAS, PLBDAG, & + &PAI, PCJ, PHLI_HCF, PHLI_HRI,& + &PRCHONI, PRVDEPS, PRIAGGS, PRIAUTS, PRVDEPG, & + &PA_TH, PA_RV, PA_RC, PA_RI, PA_RS, PA_RG) +!! +!!** PURPOSE +!! ------- +!! Computes the slow process +!! +!! AUTHOR +!! ------ +!! S. Riette from the splitting of rain_ice source code (nov. 2014) +!! +!! MODIFICATIONS +!! ------------- +!! +! +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST, ONLY: XTT +USE MODD_RAIN_ICE_DESCR, ONLY: XCEXVT,XRTMIN +USE MODD_RAIN_ICE_PARAM, ONLY: X0DEPG,X0DEPS,X1DEPG,X1DEPS,XACRIAUTI,XALPHA3,XBCRIAUTI,XBETA3,XCOLEXIS,XCRIAUTI, & + XEX0DEPG,XEX0DEPS,XEX1DEPG,XEX1DEPS,XEXIAGGS,XFIAGGS,XHON,XTEXAUTI,XTIMAUTI +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +INTEGER, INTENT(IN) :: KSIZE +LOGICAL, INTENT(IN) :: LDSOFT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature +REAL, DIMENSION(KSIZE), INTENT(IN) :: PSSI ! Supersaturation over ice +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLVFACT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLSFACT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRVT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRIT ! Pristine ice m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRGT ! Graupel/hail m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAS ! Slope parameter of the aggregate distribution +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAG ! Slope parameter of the graupel distribution +REAL, DIMENSION(KSIZE), INTENT(IN) :: PAI ! Thermodynamical function +REAL, DIMENSION(KSIZE), INTENT(IN) :: PCJ ! Function to compute the ventilation coefficient +REAL, DIMENSION(KSIZE), INTENT(IN) :: PHLI_HCF ! +REAL, DIMENSION(KSIZE), INTENT(IN) :: PHLI_HRI ! +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCHONI ! Homogeneous nucleation +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRVDEPS ! Deposition on r_s +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRIAGGS ! Aggregation on r_s +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRIAUTS ! Autoconversion of r_i for r_s production +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRVDEPG ! Deposition on r_g +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_TH +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RV +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RC +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RI +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RS +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RG +! +!* 0.2 declaration of local variables +! +REAL, DIMENSION(KSIZE) :: ZCRIAUTI, ZMASK +REAL :: ZTIMAUTIC +INTEGER :: JL +!------------------------------------------------------------------------------- +! +! +!------------------------------------------------------------------------------- +! +! +!* 3.2 compute the homogeneous nucleation source: RCHONI +! +DO JL=1, KSIZE + ZMASK(JL)=MAX(0., -SIGN(1., PT(JL)-(XTT-35.0))) * & ! PT(:)<XTT-35.0 + &MAX(0., -SIGN(1., XRTMIN(2)-PRCT(JL))) * & ! PRCT(:)>XRTMIN(2) + &PCOMPUTE(JL) +ENDDO +IF(LDSOFT) THEN + DO JL=1, KSIZE + PRCHONI(JL) = PRCHONI(JL) * ZMASK(JL) + ENDDO +ELSE + PRCHONI(:) = 0. + WHERE(ZMASK(:)==1.) + PRCHONI(:) = MIN(1000.,XHON*PRHODREF(:)*PRCT(:) & + *EXP( XALPHA3*(PT(:)-XTT)-XBETA3 )) + ENDWHERE +ENDIF +DO JL=1, KSIZE + PA_RI(JL) = PA_RI(JL) + PRCHONI(JL) + PA_RC(JL) = PA_RC(JL) - PRCHONI(JL) + PA_TH(JL) = PA_TH(JL) + PRCHONI(JL)*(PLSFACT(JL)-PLVFACT(JL)) +ENDDO +! +!* 3.4 compute the deposition, aggregation and autoconversion sources +! +! +!* 3.4.2 compute the riming-conversion of r_c for r_i production: RCAUTI +! +! ZZW(:) = 0.0 +! ZTIMAUTIC = SQRT( XTIMAUTI*XTIMAUTC ) +! WHERE ( (PRCT(:)>0.0) .AND. (PRIT(:)>0.0) .AND. (PRCS(:)>0.0) ) +! ZZW(:) = MIN( PRCS(:),ZTIMAUTIC * MAX( SQRT( PRIT(:)*PRCT(:) ),0.0 ) ) +! PRIS(:) = PRIS(:) + ZZW(:) +! PRCS(:) = PRCS(:) - ZZW(:) +! PTHS(:) = PTHS(:) + ZZW(:)*(PLSFACT(:)-PLVFACT(:)) ! f(L_f*(RCAUTI)) +! END WHERE +! +!* 3.4.3 compute the deposition on r_s: RVDEPS +! +DO JL=1, KSIZE + ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(1)-PRVT(JL))) * & !PRVT(:)>XRTMIN(1) + &MAX(0., -SIGN(1., XRTMIN(5)-PRST(JL))) * & !PRST(:)>XRTMIN(5) + &PCOMPUTE(JL) +ENDDO +IF(LDSOFT) THEN + DO JL=1, KSIZE + PRVDEPS(JL)=PRVDEPS(JL)*ZMASK(JL) + ENDDO +ELSE + PRVDEPS(:) = 0. + WHERE(ZMASK(:)==1.) + PRVDEPS(:) = ( PSSI(:)/(PRHODREF(:)*PAI(:)) ) * & + ( X0DEPS*PLBDAS(:)**XEX0DEPS + X1DEPS*PCJ(:)*PLBDAS(:)**XEX1DEPS ) + END WHERE +ENDIF +DO JL=1, KSIZE + PA_RS(JL) = PA_RS(JL) + PRVDEPS(JL) + PA_RV(JL) = PA_RV(JL) - PRVDEPS(JL) + PA_TH(JL) = PA_TH(JL) + PRVDEPS(JL)*PLSFACT(JL) +ENDDO +! +!* 3.4.4 compute the aggregation on r_s: RIAGGS +! +DO JL=1, KSIZE + ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(4)-PRIT(JL))) * & ! PRIT(:)>XRTMIN(4) + &MAX(0., -SIGN(1., XRTMIN(5)-PRST(JL))) * & ! PRST(:)>XRTMIN(5) + &PCOMPUTE(JL) +ENDDO +IF(LDSOFT) THEN + DO JL=1, KSIZE + PRIAGGS(JL)=PRIAGGS(JL) * ZMASK(JL) + ENDDO +ELSE + PRIAGGS(:) = 0. + WHERE(ZMASK(:)==1) + PRIAGGS(:) = XFIAGGS * EXP( XCOLEXIS*(PT(:)-XTT) ) & + * PRIT(:) & + * PLBDAS(:)**XEXIAGGS & + * PRHODREF(:)**(-XCEXVT) + END WHERE +ENDIF +DO JL=1, KSIZE + PA_RS(JL) = PA_RS(JL) + PRIAGGS(JL) + PA_RI(JL) = PA_RI(JL) - PRIAGGS(JL) +ENDDO +! +!* 3.4.5 compute the autoconversion of r_i for r_s production: RIAUTS +! +DO JL=1, KSIZE + ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(4)-PHLI_HRI(JL))) * & ! PHLI_HRI(:)>XRTMIN(4) + &MAX(0., -SIGN(1., 1.E-20-PHLI_HCF(JL))) * & ! PHLI_HCF(:) .GT. 0. + &PCOMPUTE(JL) +ENDDO +IF(LDSOFT) THEN + DO JL=1, KSIZE + PRIAUTS(JL) = PRIAUTS(JL) * ZMASK(JL) + ENDDO +ELSE + PRIAUTS(:) = 0. + !ZCRIAUTI(:)=MIN(XCRIAUTI,10**(0.06*(PT(:)-XTT)-3.5)) + ZCRIAUTI(:)=MIN(XCRIAUTI,10**(XACRIAUTI*(PT(:)-XTT)+XBCRIAUTI)) + WHERE(ZMASK(:)==1.) + PRIAUTS(:) = XTIMAUTI * EXP( XTEXAUTI*(PT(:)-XTT) ) & + * MAX( PHLI_HRI(:)/PHLI_HCF(:)-ZCRIAUTI(:),0.0 ) + PRIAUTS(:) = PHLI_HCF(:)*PRIAUTS(:) + END WHERE +ENDIF +DO JL=1, KSIZE + PA_RS(JL) = PA_RS(JL) + PRIAUTS(JL) + PA_RI(JL) = PA_RI(JL) - PRIAUTS(JL) +ENDDO +! +!* 3.4.6 compute the deposition on r_g: RVDEPG +! +! +DO JL=1, KSIZE + ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(1)-PRVT(JL))) * & ! PRVT(:)>XRTMIN(1) + &MAX(0., -SIGN(1., XRTMIN(6)-PRGT(JL))) * & ! PRGT(:)>XRTMIN(6) + &PCOMPUTE(JL) +ENDDO +IF(LDSOFT) THEN + DO JL=1, KSIZE + PRVDEPG(JL) = PRVDEPG(JL) * ZMASK(JL) + ENDDO +ELSE + PRVDEPG(:) = 0. + WHERE(ZMASK(:)==1.) + PRVDEPG(:) = ( PSSI(:)/(PRHODREF(:)*PAI(:)) ) * & + ( X0DEPG*PLBDAG(:)**XEX0DEPG + X1DEPG*PCJ(:)*PLBDAG(:)**XEX1DEPG ) + END WHERE +ENDIF +DO JL=1, KSIZE + PA_RG(JL) = PA_RG(JL) + PRVDEPG(JL) + PA_RV(JL) = PA_RV(JL) - PRVDEPG(JL) + PA_TH(JL) = PA_TH(JL) + PRVDEPG(JL)*PLSFACT(JL) +ENDDO +! +! +END SUBROUTINE ICE4_SLOW diff --git a/src/mesonh/micro/ice4_tendencies.f90 b/src/mesonh/micro/ice4_tendencies.f90 new file mode 100644 index 000000000..49cd59923 --- /dev/null +++ b/src/mesonh/micro/ice4_tendencies.f90 @@ -0,0 +1,620 @@ +!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +MODULE MODI_ICE4_TENDENCIES +INTERFACE +SUBROUTINE ICE4_TENDENCIES(KSIZE, KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKL, & + &KRR, ODSOFT, PCOMPUTE, & + &OWARM, HSUBG_RC_RR_ACCR, HSUBG_RR_EVAP, & + &HSUBG_AUCV_RC, HSUBG_AUCV_RI, HSUBG_PR_PDF, & + &PEXN, PRHODREF, PLVFACT, PLSFACT, K1, K2, K3, & + &PPRES, PCF, PSIGMA_RC, & + &PCIT, & + &PT, PTHT, & + &PRVT, PRCT, PRRT, PRIT, PRST, PRGT, PRHT, & + &PRVHENI_MR, PRRHONG_MR, PRIMLTC_MR, PRSRIMCG_MR, & + &PRCHONI, PRVDEPS, PRIAGGS, PRIAUTS, PRVDEPG, & + &PRCAUTR, PRCACCR, PRREVAV, & + &PRCRIMSS, PRCRIMSG, PRSRIMCG, PRRACCSS, PRRACCSG, PRSACCRG, PRSMLTG, PRCMLTSR, & + &PRICFRRG, PRRCFRIG, PRICFRR, PRCWETG, PRIWETG, PRRWETG, PRSWETG, & + &PRCDRYG, PRIDRYG, PRRDRYG, PRSDRYG, PRWETGH, PRWETGH_MR, PRGMLTR, & + &PRCWETH, PRIWETH, PRSWETH, PRGWETH, PRRWETH, & + &PRCDRYH, PRIDRYH, PRSDRYH, PRRDRYH, PRGDRYH, PRDRYHG, PRHMLTR, & + &PRCBERI, & + &PRS_TEND, PRG_TEND, PRH_TEND, PSSI, & + &PA_TH, PA_RV, PA_RC, PA_RR, PA_RI, PA_RS, PA_RG, PA_RH, & + &PB_TH, PB_RV, PB_RC, PB_RR, PB_RI, PB_RS, PB_RG, PB_RH, & + &PHLC_HCF, PHLC_LCF, PHLC_HRC, PHLC_LRC, & + &PHLI_HCF, PHLI_LCF, PHLI_HRI, PHLI_LRI, PRAINFR) +IMPLICIT NONE +INTEGER, INTENT(IN) :: KSIZE, KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKL +INTEGER, INTENT(IN) :: KRR +LOGICAL, INTENT(IN) :: ODSOFT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE +LOGICAL, INTENT(IN) :: OWARM +CHARACTER(len=80), INTENT(IN) :: HSUBG_RC_RR_ACCR +CHARACTER(len=80), INTENT(IN) :: HSUBG_RR_EVAP +CHARACTER(len=4), INTENT(IN) :: HSUBG_AUCV_RC +CHARACTER(len=80), INTENT(IN) :: HSUBG_AUCV_RI +CHARACTER(len=80), INTENT(IN) :: HSUBG_PR_PDF ! pdf for subgrid precipitation +REAL, DIMENSION(KSIZE), INTENT(IN) :: PEXN +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHODREF +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLVFACT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLSFACT +INTEGER, DIMENSION(KSIZE), INTENT(IN) :: K1 +INTEGER, DIMENSION(KSIZE), INTENT(IN) :: K2 +INTEGER, DIMENSION(KSIZE), INTENT(IN) :: K3 +REAL, DIMENSION(KSIZE), INTENT(IN) :: PPRES +REAL, DIMENSION(KSIZE), INTENT(IN) :: PCF +REAL, DIMENSION(KSIZE), INTENT(IN) :: PSIGMA_RC +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PCIT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PTHT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRVT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRCT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRRT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRIT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRST +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRGT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHT +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRVHENI_MR +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRRHONG_MR +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRIMLTC_MR +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRSRIMCG_MR +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCHONI +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRVDEPS +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRIAGGS +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRIAUTS +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRVDEPG +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCAUTR +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCACCR +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRREVAV +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRCRIMSS +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRCRIMSG +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRSRIMCG +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRRACCSS +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRRACCSG +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRSACCRG +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRSMLTG +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCMLTSR +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRICFRRG +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRRCFRIG +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRICFRR +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRCWETG +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRIWETG +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRRWETG +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRSWETG +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRCDRYG +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRIDRYG +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRRDRYG +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRSDRYG +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRWETGH +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRWETGH_MR +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRGMLTR +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRCWETH +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRIWETH +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRSWETH +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRGWETH +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRRWETH +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRCDRYH +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRIDRYH +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRSDRYH +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRRDRYH +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRGDRYH +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRDRYHG +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRHMLTR +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCBERI +REAL, DIMENSION(KSIZE, 8), INTENT(INOUT) :: PRS_TEND +REAL, DIMENSION(KSIZE, 8), INTENT(INOUT) :: PRG_TEND +REAL, DIMENSION(KSIZE, 10), INTENT(INOUT) :: PRH_TEND +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PSSI +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PA_TH +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PA_RV +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PA_RC +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PA_RR +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PA_RI +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PA_RS +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PA_RG +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PA_RH +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PB_TH +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PB_RV +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PB_RC +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PB_RR +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PB_RI +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PB_RS +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PB_RG +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PB_RH +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PHLC_HCF +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PHLC_LCF +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PHLC_HRC +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PHLC_LRC +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PHLI_HCF +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PHLI_LCF +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PHLI_HRI +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PHLI_LRI +REAL, DIMENSION(KIT,KJT,KKT), INTENT(OUT) :: PRAINFR ! Rain fraction +END SUBROUTINE ICE4_TENDENCIES +END INTERFACE +END MODULE MODI_ICE4_TENDENCIES +SUBROUTINE ICE4_TENDENCIES(KSIZE, KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKL, & + &KRR, ODSOFT, PCOMPUTE, & + &OWARM, HSUBG_RC_RR_ACCR, HSUBG_RR_EVAP, & + &HSUBG_AUCV_RC, HSUBG_AUCV_RI, HSUBG_PR_PDF, & + &PEXN, PRHODREF, PLVFACT, PLSFACT, K1, K2, K3, & + &PPRES, PCF, PSIGMA_RC, & + &PCIT, & + &PT, PTHT, & + &PRVT, PRCT, PRRT, PRIT, PRST, PRGT, PRHT, & + &PRVHENI_MR, PRRHONG_MR, PRIMLTC_MR, PRSRIMCG_MR, & + &PRCHONI, PRVDEPS, PRIAGGS, PRIAUTS, PRVDEPG, & + &PRCAUTR, PRCACCR, PRREVAV, & + &PRCRIMSS, PRCRIMSG, PRSRIMCG, PRRACCSS, PRRACCSG, PRSACCRG, PRSMLTG, PRCMLTSR, & + &PRICFRRG, PRRCFRIG, PRICFRR, PRCWETG, PRIWETG, PRRWETG, PRSWETG, & + &PRCDRYG, PRIDRYG, PRRDRYG, PRSDRYG, PRWETGH, PRWETGH_MR, PRGMLTR, & + &PRCWETH, PRIWETH, PRSWETH, PRGWETH, PRRWETH, & + &PRCDRYH, PRIDRYH, PRSDRYH, PRRDRYH, PRGDRYH, PRDRYHG, PRHMLTR, & + &PRCBERI, & + &PRS_TEND, PRG_TEND, PRH_TEND, PSSI, & + &PA_TH, PA_RV, PA_RC, PA_RR, PA_RI, PA_RS, PA_RG, PA_RH, & + &PB_TH, PB_RV, PB_RC, PB_RR, PB_RI, PB_RS, PB_RG, PB_RH, & + &PHLC_HCF, PHLC_LCF, PHLC_HRC, PHLC_LRC, & + &PHLI_HCF, PHLI_LCF, PHLI_HRI, PHLI_LRI, PRAINFR) +!! +!!** PURPOSE +!! ------- +!! Computes the tendencies +!! +!! AUTHOR +!! ------ +!! S. Riette from the splitting of rain_ice source code (nov. 2014) +!! +!! MODIFICATIONS +!! ------------- +! +! P. Wautelet 29/05/2019: remove PACK/UNPACK intrinsics (to get more performance and better OpenACC support) +! +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST, ONLY: XALPI,XBETAI,XCI,XCPV,XEPSILO,XGAMI,XLSTT,XMD,XMV,XP00,XRV,XTT +USE MODD_PARAM_ICE, ONLY: CSNOWRIMING +USE MODD_RAIN_ICE_DESCR, ONLY: XLBDAS_MAX,XLBEXG,XLBEXH,XLBEXR,XLBEXS,XLBG,XLBH,XLBR,XLBS,XRTMIN +USE MODD_RAIN_ICE_PARAM, ONLY: XSCFAC +! +USE MODI_ICE4_COMPUTE_PDF +USE MODI_ICE4_FAST_RG +USE MODI_ICE4_FAST_RH +USE MODI_ICE4_FAST_RI +USE MODI_ICE4_FAST_RS +USE MODI_ICE4_NUCLEATION +USE MODI_ICE4_RAINFR_VERT +USE MODI_ICE4_RIMLTC +USE MODI_ICE4_RRHONG +USE MODI_ICE4_RSRIMCG_OLD +USE MODI_ICE4_SLOW +USE MODI_ICE4_WARM +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +INTEGER, INTENT(IN) :: KSIZE, KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKL +INTEGER, INTENT(IN) :: KRR +LOGICAL, INTENT(IN) :: ODSOFT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE +LOGICAL, INTENT(IN) :: OWARM +CHARACTER(len=80), INTENT(IN) :: HSUBG_RC_RR_ACCR +CHARACTER(len=80), INTENT(IN) :: HSUBG_RR_EVAP +CHARACTER(len=4), INTENT(IN) :: HSUBG_AUCV_RC +CHARACTER(len=80), INTENT(IN) :: HSUBG_AUCV_RI +CHARACTER(len=80), INTENT(IN) :: HSUBG_PR_PDF ! pdf for subgrid precipitation +REAL, DIMENSION(KSIZE), INTENT(IN) :: PEXN +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHODREF +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLVFACT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLSFACT +INTEGER, DIMENSION(KSIZE), INTENT(IN) :: K1 +INTEGER, DIMENSION(KSIZE), INTENT(IN) :: K2 +INTEGER, DIMENSION(KSIZE), INTENT(IN) :: K3 +REAL, DIMENSION(KSIZE), INTENT(IN) :: PPRES +REAL, DIMENSION(KSIZE), INTENT(IN) :: PCF +REAL, DIMENSION(KSIZE), INTENT(IN) :: PSIGMA_RC +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PCIT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PTHT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRVT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRCT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRRT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRIT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRST +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRGT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHT +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRVHENI_MR +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRRHONG_MR +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRIMLTC_MR +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRSRIMCG_MR +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCHONI +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRVDEPS +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRIAGGS +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRIAUTS +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRVDEPG +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCAUTR +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCACCR +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRREVAV +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRCRIMSS +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRCRIMSG +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRSRIMCG +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRRACCSS +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRRACCSG +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRSACCRG +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRSMLTG +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCMLTSR +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRICFRRG +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRRCFRIG +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRICFRR +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRCWETG +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRIWETG +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRRWETG +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRSWETG +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRCDRYG +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRIDRYG +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRRDRYG +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRSDRYG +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRWETGH +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRWETGH_MR +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRGMLTR +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRCWETH +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRIWETH +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRSWETH +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRGWETH +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRRWETH +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRCDRYH +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRIDRYH +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRSDRYH +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRRDRYH +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRGDRYH +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRDRYHG +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRHMLTR +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCBERI +REAL, DIMENSION(KSIZE, 8), INTENT(INOUT) :: PRS_TEND +REAL, DIMENSION(KSIZE, 8), INTENT(INOUT) :: PRG_TEND +REAL, DIMENSION(KSIZE, 10), INTENT(INOUT) :: PRH_TEND +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PSSI +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PA_TH +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PA_RV +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PA_RC +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PA_RR +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PA_RI +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PA_RS +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PA_RG +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PA_RH +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PB_TH +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PB_RV +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PB_RC +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PB_RR +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PB_RI +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PB_RS +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PB_RG +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PB_RH +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PHLC_HCF +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PHLC_LCF +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PHLC_HRC +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PHLC_LRC +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PHLI_HCF +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PHLI_LCF +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PHLI_HRI +REAL, DIMENSION(KSIZE), INTENT(OUT) :: PHLI_LRI +REAL, DIMENSION(KIT,KJT,KKT), INTENT(OUT) :: PRAINFR ! Rain fraction +! +!* 0.2 declaration of local variables +! +REAL, DIMENSION(KSIZE) :: ZRVT, ZRCT, ZRRT, ZRIT, ZRST, ZRGT, & + & ZT, ZTHT, ZRHT, & + & ZZW, & + & ZKA, ZDV, ZAI, ZCJ, & + & ZRF, & + & ZLBDAR, ZLBDAS, ZLBDAG, ZLBDAH, ZLBDAR_RF, & + & ZRGSI, ZRGSI_MR +REAL, DIMENSION(KIT,KJT,KKT) :: ZRRT3D, ZRST3D, ZRGT3D, ZRHT3D +INTEGER :: JL +REAL, DIMENSION(KSIZE) :: ZWETG ! 1. if graupel growths in wet mode, 0. otherwise + +PA_TH(:)=0. +PA_RV(:)=0. +PA_RC(:)=0. +PA_RR(:)=0. +PA_RI(:)=0. +PA_RS(:)=0. +PA_RG(:)=0. +PA_RH(:)=0. +PB_TH(:)=0. +PB_RV(:)=0. +PB_RC(:)=0. +PB_RR(:)=0. +PB_RI(:)=0. +PB_RS(:)=0. +PB_RG(:)=0. +PB_RH(:)=0. +! +DO JL=1, KSIZE + ZRVT(JL)=PRVT(JL) + ZRCT(JL)=PRCT(JL) + ZRRT(JL)=PRRT(JL) + ZRIT(JL)=PRIT(JL) + ZRST(JL)=PRST(JL) + ZRGT(JL)=PRGT(JL) + ZTHT(JL)=PTHT(JL) + ZRHT(JL)=PRHT(JL) + ZT(JL)=PT(JL) +ENDDO +IF(ODSOFT) THEN + PRVHENI_MR(:)=0. + PRRHONG_MR(:)=0. + PRIMLTC_MR(:)=0. + PRSRIMCG_MR(:)=0. +ELSE + ! + !* 2. COMPUTES THE SLOW COLD PROCESS SOURCES + ! -------------------------------------- + CALL ICE4_NUCLEATION(KSIZE, ODSOFT, PCOMPUTE==1., & + ZTHT, PPRES, PRHODREF, PEXN, PLSFACT, ZT, & + ZRVT, & + PCIT, PRVHENI_MR, PB_TH, PB_RV, PB_RI) + DO JL=1, KSIZE + ZRIT(JL)=ZRIT(JL) + PRVHENI_MR(JL) + ZRVT(JL)=ZRVT(JL) - PRVHENI_MR(JL) + ZTHT(JL)=ZTHT(JL) + PRVHENI_MR(JL)*PLSFACT(JL) + ZT(JL) = ZTHT(JL) * PEXN(JL) + ENDDO + ! + !* 3.3 compute the spontaneous freezing source: RRHONG + ! + CALL ICE4_RRHONG(KSIZE, ODSOFT, PCOMPUTE, & + &PEXN, PLVFACT, PLSFACT, & + &ZT, ZRRT, & + &ZTHT, & + &PRRHONG_MR, PB_TH, PB_RR, PB_RG) + DO JL=1, KSIZE + ZRGT(JL) = ZRGT(JL) + PRRHONG_MR(JL) + ZRRT(JL) = ZRRT(JL) - PRRHONG_MR(JL) + ZTHT(JL) = ZTHT(JL) + PRRHONG_MR(JL)*(PLSFACT(JL)-PLVFACT(JL)) ! f(L_f*(RRHONG)) + ZT(JL) = ZTHT(JL) * PEXN(JL) + ENDDO + ! + !* 7.1 cloud ice melting + ! + CALL ICE4_RIMLTC(KSIZE, ODSOFT, PCOMPUTE, & + &PEXN, PLVFACT, PLSFACT, & + &ZT, & + &ZTHT, ZRIT, & + &PRIMLTC_MR, PB_TH, PB_RC, PB_RI) + DO JL=1, KSIZE + ZRCT(JL) = ZRCT(JL) + PRIMLTC_MR(JL) + ZRIT(JL) = ZRIT(JL) - PRIMLTC_MR(JL) + ZTHT(JL) = ZTHT(JL) - PRIMLTC_MR(JL)*(PLSFACT(JL)-PLVFACT(JL)) ! f(L_f*(-RIMLTC)) + ZT(JL) = ZTHT(JL) * PEXN(JL) + ENDDO + ! + ! 5.1.6 riming-conversion of the large sized aggregates into graupel (old parametrisation) + ! + IF(CSNOWRIMING=='OLD ') THEN + ZLBDAS(:)=0. + WHERE(ZRST(:)>0.) + ZLBDAS(:) = MIN(XLBDAS_MAX, XLBS*(PRHODREF(:)*MAX(ZRST(:), XRTMIN(5)))**XLBEXS) + END WHERE + CALL ICE4_RSRIMCG_OLD(KSIZE, ODSOFT, PCOMPUTE==1., & + &PRHODREF, & + &ZLBDAS, & + &ZT, ZRCT, ZRST, & + &PRSRIMCG_MR, PB_RS, PB_RG) + DO JL=1, KSIZE + ZRST(JL) = ZRST(JL) - PRSRIMCG_MR(JL) + ZRGT(JL) = ZRGT(JL) + PRSRIMCG_MR(JL) + ENDDO + ELSE + PRSRIMCG_MR(:) = 0. + ENDIF +ENDIF +! +!* Derived fields +! +IF(KSIZE>0) THEN + IF(.NOT. ODSOFT) THEN + ZZW(:) = EXP(XALPI-XBETAI/ZT(:)-XGAMI*ALOG(ZT(:))) + DO JL=1, KSIZE + PSSI(JL) = ZRVT(JL)*( PPRES(JL)-ZZW(JL) ) / ( XEPSILO * ZZW(JL) ) - 1.0 + ! Supersaturation over ice + ZKA(JL) = 2.38E-2 + 0.0071E-2*(ZT(JL)-XTT) ! k_a + ZDV(JL) = 0.211E-4*(ZT(JL)/XTT)**1.94 * (XP00/PPRES(JL)) ! D_v + ZAI(JL) = (XLSTT+(XCPV-XCI)*(ZT(JL)-XTT))**2 / (ZKA(JL)*XRV*ZT(JL)**2) & + + ( XRV*ZT(JL) ) / (ZDV(JL)*ZZW(JL)) + ZCJ(JL) = XSCFAC*PRHODREF(JL)**0.3 / SQRT(1.718E-5+0.0049E-5*(ZT(JL)-XTT)) + ENDDO + ENDIF + ! + !Cloud water split between high and low content part is done here + CALL ICE4_COMPUTE_PDF(KSIZE, HSUBG_AUCV_RC, HSUBG_AUCV_RI, HSUBG_PR_PDF,& + PRHODREF, ZRCT, ZRIT, PCF, ZT, PSIGMA_RC,& + PHLC_HCF, PHLC_LCF, PHLC_HRC, PHLC_LRC,& + PHLI_HCF, PHLI_LCF, PHLI_HRI, PHLI_LRI, ZRF) + IF(HSUBG_RC_RR_ACCR=='PRFR' .OR. HSUBG_RR_EVAP=='PRFR') THEN + !Diagnostic of precipitation fraction + PRAINFR(:,:,:) = 0. + ZRRT3D (:,:,:) = 0. + ZRST3D (:,:,:) = 0. + ZRGT3D (:,:,:) = 0. + ZRHT3D (:,:,:) = 0. + DO JL=1,KSIZE + PRAINFR(K1(JL), K2(JL), K3(JL)) = ZRF(JL) + ZRRT3D (K1(JL), K2(JL), K3(JL)) = ZRRT(JL) + ZRST3D (K1(JL), K2(JL), K3(JL)) = ZRST(JL) + ZRGT3D (K1(JL), K2(JL), K3(JL)) = ZRGT(JL) + END DO + IF (KRR==7) THEN + DO JL=1,KSIZE + ZRHT3D (K1(JL), K2(JL), K3(JL)) = ZRHT(JL) + ENDDO + ENDIF + CALL ICE4_RAINFR_VERT(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKL, PRAINFR(:,:,:), ZRRT3D(:,:,:), & + &ZRST3D(:,:,:), ZRGT3D(:,:,:), ZRHT3D(:,:,:)) + DO JL=1,KSIZE + ZRF(JL)=PRAINFR(K1(JL), K2(JL), K3(JL)) + END DO + ELSE + PRAINFR(:,:,:)=1. + ZRF(:)=1. + ENDIF + ! + !* compute the slope parameters + ! + ZLBDAS(:)=0. + WHERE(ZRST(:)>0.) + ZLBDAS(:) = MIN(XLBDAS_MAX, XLBS*(PRHODREF(:)*MAX(ZRST(:), XRTMIN(5)))**XLBEXS) + END WHERE + ZLBDAG(:)=0. + WHERE(ZRGT(:)>0.) + ZLBDAG(:) = XLBG*(PRHODREF(:)*MAX(ZRGT(:), XRTMIN(6)))**XLBEXG + END WHERE + !ZLBDAR will be used when we consider rain diluted over the grid box + ZLBDAR(:)=0. + WHERE(ZRRT(:)>0.) + ZLBDAR(:) = XLBR*( PRHODREF(:)*MAX( ZRRT(:), XRTMIN(3)))**XLBEXR + END WHERE + !ZLBDAR_RF is used when we consider rain concentrated in its fraction + IF (HSUBG_RC_RR_ACCR=='PRFR' .OR. HSUBG_RR_EVAP=='PRFR') THEN + ZLBDAR_RF(:)=0. + WHERE(ZRRT(:)>0. .AND. ZRF(:)>0.) + ZLBDAR_RF(:) = XLBR*( PRHODREF(:) *MAX( ZRRT(:)/ZRF(:) , XRTMIN(3)))**XLBEXR + END WHERE + ELSE + ZLBDAR_RF(:) = ZLBDAR(:) + ENDIF + IF(KRR==7) THEN + ZLBDAH(:)=0. + WHERE(PRHT(:)>0.) + ZLBDAH(:) = XLBH*(PRHODREF(:)*MAX(PRHT(:), XRTMIN(7)))**XLBEXH + END WHERE + ENDIF +ENDIF +! +! +CALL ICE4_SLOW(KSIZE, ODSOFT, PCOMPUTE, PRHODREF, ZT, & + &PSSI, PLVFACT, PLSFACT, & + &ZRVT, ZRCT, ZRIT, ZRST, ZRGT, & + &ZLBDAS, ZLBDAG, & + &ZAI, ZCJ, PHLI_HCF, PHLI_HRI, & + &PRCHONI, PRVDEPS, PRIAGGS, PRIAUTS, PRVDEPG, & + &PA_TH, PA_RV, PA_RC, PA_RI, PA_RS, PA_RG) +! +!------------------------------------------------------------------------------- +! +! +!* 3. COMPUTES THE SLOW WARM PROCESS SOURCES +! -------------------------------------- +! +! +IF(OWARM) THEN ! Check if the formation of the raindrops by the slow + ! warm processes is allowed + CALL ICE4_WARM(KSIZE, ODSOFT, PCOMPUTE, HSUBG_RC_RR_ACCR, HSUBG_RR_EVAP, & + &PRHODREF, PLVFACT, ZT, PPRES, ZTHT,& + &ZLBDAR, ZLBDAR_RF, ZKA, ZDV, ZCJ, & + &PHLC_LCF, PHLC_HCF, PHLC_LRC, PHLC_HRC, & + &PCF, ZRF, & + &ZRVT, ZRCT, ZRRT, & + &PRCAUTR, PRCACCR, PRREVAV, & + &PA_TH, PA_RV, PA_RC, PA_RR) +ELSE + PRCAUTR(:)=0. + PRCACCR(:)=0. + PRREVAV(:)=0. +END IF +! +!------------------------------------------------------------------------------- +! +! +!* 4. COMPUTES THE FAST COLD PROCESS SOURCES FOR r_s +! ---------------------------------------------- +! +CALL ICE4_FAST_RS(KSIZE, ODSOFT, PCOMPUTE, & + &PRHODREF, PLVFACT, PLSFACT, PPRES, & + &ZDV, ZKA, ZCJ, & + &ZLBDAR, ZLBDAS, & + &ZT, ZRVT, ZRCT, ZRRT, ZRST, & + &PRIAGGS, & + &PRCRIMSS, PRCRIMSG, PRSRIMCG, & + &PRRACCSS, PRRACCSG, PRSACCRG, PRSMLTG, & + &PRCMLTSR, & + &PRS_TEND, & + &PA_TH, PA_RC, PA_RR, PA_RS, PA_RG) +! +!------------------------------------------------------------------------------- +! +! +!* 5. COMPUTES THE FAST COLD PROCESS SOURCES FOR r_g +! ------------------------------------------------------ +! +DO JL=1, KSIZE + ZRGSI(JL) = PRVDEPG(JL) + PRSMLTG(JL) + PRRACCSG(JL) + & + & PRSACCRG(JL) + PRCRIMSG(JL) + PRSRIMCG(JL) + ZRGSI_MR(JL) = PRRHONG_MR(JL) + PRSRIMCG_MR(JL) +ENDDO +CALL ICE4_FAST_RG(KSIZE, ODSOFT, PCOMPUTE, KRR, & + &PRHODREF, PLVFACT, PLSFACT, PPRES, & + &ZDV, ZKA, ZCJ, PCIT, & + &ZLBDAR, ZLBDAS, ZLBDAG, & + &ZT, ZRVT, ZRCT, ZRRT, ZRIT, ZRST, ZRGT, & + &ZRGSI, ZRGSI_MR(:), & + &ZWETG, & + &PRICFRRG, PRRCFRIG, PRICFRR, PRCWETG, PRIWETG, PRRWETG, PRSWETG, & + &PRCDRYG, PRIDRYG, PRRDRYG, PRSDRYG, PRWETGH, PRWETGH_MR, PRGMLTR, & + &PRG_TEND, & + &PA_TH, PA_RC, PA_RR, PA_RI, PA_RS, PA_RG, PA_RH, PB_RG, PB_RH) +! +!------------------------------------------------------------------------------- +! +! +!* 6. COMPUTES THE FAST COLD PROCESS SOURCES FOR r_h +! ---------------------------------------------- +! +IF (KRR==7) THEN + CALL ICE4_FAST_RH(KSIZE, ODSOFT, PCOMPUTE, ZWETG, & + &PRHODREF, PLVFACT, PLSFACT, PPRES, & + &ZDV, ZKA, ZCJ, & + &ZLBDAS, ZLBDAG, ZLBDAR, ZLBDAH, & + &ZT, ZRVT, ZRCT, ZRRT, ZRIT, ZRST, ZRGT, PRHT, & + &PRCWETH, PRIWETH, PRSWETH, PRGWETH, PRRWETH, & + &PRCDRYH, PRIDRYH, PRSDRYH, PRRDRYH, PRGDRYH, PRDRYHG, PRHMLTR, & + &PRH_TEND, & + &PA_TH, PA_RC, PA_RR, PA_RI, PA_RS, PA_RG, PA_RH) +ELSE + PRCWETH(:)=0. + PRIWETH(:)=0. + PRSWETH(:)=0. + PRGWETH(:)=0. + PRRWETH(:)=0. + PRCDRYH(:)=0. + PRIDRYH(:)=0. + PRSDRYH(:)=0. + PRRDRYH(:)=0. + PRGDRYH(:)=0. + PRDRYHG(:)=0. + PRHMLTR(:)=0. +END IF +! +!------------------------------------------------------------------------------- +! +! +!* 7. COMPUTES SPECIFIC SOURCES OF THE WARM AND COLD CLOUDY SPECIES +! ------------------------------------------------------------- +! +CALL ICE4_FAST_RI(KSIZE, ODSOFT, PCOMPUTE, & + &PRHODREF, PLVFACT, PLSFACT, & + &ZAI, ZCJ, PCIT, & + &PSSI, & + &ZRCT, ZRIT, & + &PRCBERI, PA_TH, PA_RC, PA_RI) +! +! +END SUBROUTINE ICE4_TENDENCIES diff --git a/src/mesonh/micro/ice4_warm.f90 b/src/mesonh/micro/ice4_warm.f90 new file mode 100644 index 000000000..aa61b1dac --- /dev/null +++ b/src/mesonh/micro/ice4_warm.f90 @@ -0,0 +1,316 @@ +!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +MODULE MODI_ICE4_WARM +INTERFACE +SUBROUTINE ICE4_WARM(KSIZE, LDSOFT, PCOMPUTE, HSUBG_RC_RR_ACCR, HSUBG_RR_EVAP, & + PRHODREF, PLVFACT, PT, PPRES, PTHT, & + PLBDAR, PLBDAR_RF, PKA, PDV, PCJ, & + PHLC_LCF, PHLC_HCF, PHLC_LRC, PHLC_HRC, & + PCF, PRF, & + PRVT, PRCT, PRRT, & + PRCAUTR, PRCACCR, PRREVAV, & + PA_TH, PA_RV, PA_RC, PA_RR) +IMPLICIT NONE +INTEGER, INTENT(IN) :: KSIZE +LOGICAL, INTENT(IN) :: LDSOFT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE +CHARACTER(len=80), INTENT(IN) :: HSUBG_RC_RR_ACCR ! subgrid rc-rr accretion +CHARACTER(len=80), INTENT(IN) :: HSUBG_RR_EVAP ! subgrid rr evaporation +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLVFACT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature +REAL, DIMENSION(KSIZE), INTENT(IN) :: PPRES ! absolute pressure at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAR ! Slope parameter of the raindrop distribution +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAR_RF!like PLBDAR but for the Rain Fraction part +REAL, DIMENSION(KSIZE), INTENT(IN) :: PKA ! Thermal conductivity of the air +REAL, DIMENSION(KSIZE), INTENT(IN) :: PDV ! Diffusivity of water vapor in the air +REAL, DIMENSION(KSIZE), INTENT(IN) :: PCJ ! Function to compute the ventilation coefficient +REAL, DIMENSION(KSIZE), INTENT(IN) :: PHLC_HCF ! HLCLOUDS : fraction of High Cloud Fraction in grid +REAL, DIMENSION(KSIZE), INTENT(IN) :: PHLC_LCF ! HLCLOUDS : fraction of Low Cloud Fraction in grid +REAL, DIMENSION(KSIZE), INTENT(IN) :: PHLC_HRC ! HLCLOUDS : LWC that is High LWC in grid +REAL, DIMENSION(KSIZE), INTENT(IN) :: PHLC_LRC ! HLCLOUDS : LWC that is Low LWC in grid +REAL, DIMENSION(KSIZE), INTENT(IN) :: PCF ! Cloud fraction +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRF ! Rain fraction +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCAUTR ! Autoconversion of r_c for r_r production +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCACCR ! Accretion of r_c for r_r production +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRREVAV ! Evaporation of r_r +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_TH +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RV +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RC +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RR +END SUBROUTINE ICE4_WARM +END INTERFACE +END MODULE MODI_ICE4_WARM +SUBROUTINE ICE4_WARM(KSIZE, LDSOFT, PCOMPUTE, HSUBG_RC_RR_ACCR, HSUBG_RR_EVAP, & + PRHODREF, PLVFACT, PT, PPRES, PTHT, & + PLBDAR, PLBDAR_RF, PKA, PDV, PCJ, & + PHLC_LCF, PHLC_HCF, PHLC_LRC, PHLC_HRC, & + PCF, PRF, & + PRVT, PRCT, PRRT, & + PRCAUTR, PRCACCR, PRREVAV, & + PA_TH, PA_RV, PA_RC, PA_RR) +!! +!!** PURPOSE +!! ------- +!! Computes the warm process +!! +!! AUTHOR +!! ------ +!! S. Riette from the plitting of rain_ice source code (nov. 2014) +!! +!! MODIFICATIONS +!! ------------- +!! +! +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST, ONLY: XALPW,XBETAW,XCL,XCPD,XCPV,XGAMW,XLVTT,XMD,XMV,XRV,XTT,XEPSILO +USE MODD_RAIN_ICE_DESCR, ONLY: XCEXVT,XRTMIN +USE MODD_RAIN_ICE_PARAM, ONLY: X0EVAR,X1EVAR,XCRIAUTC,XEX0EVAR,XEX1EVAR,XEXCACCR,XFCACCR,XTIMAUTC +! +USE MODE_MSG +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +INTEGER, INTENT(IN) :: KSIZE +LOGICAL, INTENT(IN) :: LDSOFT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PCOMPUTE +CHARACTER(len=80), INTENT(IN) :: HSUBG_RC_RR_ACCR ! subgrid rc-rr accretion +CHARACTER(len=80), INTENT(IN) :: HSUBG_RR_EVAP ! subgrid rr evaporation +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLVFACT +REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature +REAL, DIMENSION(KSIZE), INTENT(IN) :: PPRES ! absolute pressure at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAR ! Slope parameter of the raindrop distribution +REAL, DIMENSION(KSIZE), INTENT(IN) :: PLBDAR_RF!like PLBDAR but for the Rain Fraction part +REAL, DIMENSION(KSIZE), INTENT(IN) :: PKA ! Thermal conductivity of the air +REAL, DIMENSION(KSIZE), INTENT(IN) :: PDV ! Diffusivity of water vapor in the air +REAL, DIMENSION(KSIZE), INTENT(IN) :: PCJ ! Function to compute the ventilation coefficient +REAL, DIMENSION(KSIZE), INTENT(IN) :: PHLC_HCF ! HLCLOUDS : fraction of High Cloud Fraction in grid +REAL, DIMENSION(KSIZE), INTENT(IN) :: PHLC_LCF ! HLCLOUDS : fraction of Low Cloud Fraction in grid +REAL, DIMENSION(KSIZE), INTENT(IN) :: PHLC_HRC ! HLCLOUDS : LWC that is High LWC in grid +REAL, DIMENSION(KSIZE), INTENT(IN) :: PHLC_LRC ! HLCLOUDS : LWC that is Low LWC in grid +REAL, DIMENSION(KSIZE), INTENT(IN) :: PCF ! Cloud fraction +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRF ! Rain fraction +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(KSIZE), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCAUTR ! Autoconversion of r_c for r_r production +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRCACCR ! Accretion of r_c for r_r production +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PRREVAV ! Evaporation of r_r +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_TH +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RV +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RC +REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RR +! +!* 0.2 declaration of local variables +! +REAL, DIMENSION(KSIZE) :: ZZW2, ZZW3, ZZW4 +REAL, DIMENSION(KSIZE) :: ZUSW ! Undersaturation over water +REAL, DIMENSION(KSIZE) :: ZTHLT ! Liquid potential temperature +REAL, DIMENSION(KSIZE) :: ZMASK, ZMASK1, ZMASK2 +INTEGER :: JL +!------------------------------------------------------------------------------- +! +! +! +!------------------------------------------------------------------------------- +! +!* 4.2 compute the autoconversion of r_c for r_r production: RCAUTR +! +DO JL=1, KSIZE + ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(2)-PHLC_HRC(JL))) * & ! PHLC_HRC(:)>XRTMIN(2) + &MAX(0., -SIGN(1., 1.E-20-PHLC_HCF(JL))) * & ! PHLC_HCF(:) .GT. 0. + &PCOMPUTE(JL) +ENDDO +IF(LDSOFT) THEN + DO JL=1, KSIZE + PRCAUTR(JL)=PRCAUTR(JL)*ZMASK(JL) + ENDDO +ELSE + PRCAUTR(:) = 0. + WHERE(ZMASK(:)==1.) + PRCAUTR(:) = XTIMAUTC*MAX(PHLC_HRC(:)/PHLC_HCF(:) - XCRIAUTC/PRHODREF(:), 0.0) + PRCAUTR(:) = PHLC_HCF(:)*PRCAUTR(:) + END WHERE +ENDIF +DO JL=1, KSIZE + PA_RC(JL) = PA_RC(JL) - PRCAUTR(JL) + PA_RR(JL) = PA_RR(JL) + PRCAUTR(JL) +ENDDO +! +! +!* 4.3 compute the accretion of r_c for r_r production: RCACCR +! +IF (HSUBG_RC_RR_ACCR=='NONE') THEN + !CLoud water and rain are diluted over the grid box + DO JL=1, KSIZE + ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(2)-PRCT(JL))) * & ! PRCT(:)>XRTMIN(2) + &MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JL))) * & ! PRRT(:)>XRTMIN(3) + &PCOMPUTE(JL) + ENDDO + IF(LDSOFT) THEN + DO JL=1, KSIZE + PRCACCR(JL)=PRCACCR(JL) * ZMASK(JL) + ENDDO + ELSE + PRCACCR(:) = 0. + WHERE(ZMASK(:)==1.) + PRCACCR(:) = XFCACCR * PRCT(:) & + * PLBDAR(:)**XEXCACCR & + * PRHODREF(:)**(-XCEXVT) + END WHERE + ENDIF + +ELSEIF (HSUBG_RC_RR_ACCR=='PRFR') THEN + !Cloud water is concentrated over its fraction with possibly to parts with high and low content as set for autoconversion + !Rain is concnetrated over its fraction + !Rain in high content area fraction: PHLC_HCF + !Rain in low content area fraction: + ! if PRF<PCF (rain is entirely falling in cloud): PRF-PHLC_HCF + ! if PRF>PCF (rain is falling in cloud and in clear sky): PCF-PHLC_HCF + ! => min(PCF, PRF)-PHLC_HCF + DO JL=1, KSIZE + ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(2)-PRCT(JL))) * & ! PRCT(:)>XRTMIN(2) + &MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JL))) * & ! PRRT(:)>XRTMIN(3) + &PCOMPUTE(JL) + ZMASK1(JL)=ZMASK(JL) * & + &MAX(0., -SIGN(1., XRTMIN(2)-PHLC_HRC(JL))) * & ! PHLC_HRC(:)>XRTMIN(2) + &MAX(0., -SIGN(1., 1.E-20-PHLC_HCF(JL))) ! PHLC_HCF(:)>0. + ZMASK2(JL)=ZMASK(JL) * & + &MAX(0., -SIGN(1., XRTMIN(2)-PHLC_LRC(JL))) * & ! PHLC_LRC(:)>XRTMIN(2) + &MAX(0., -SIGN(1., 1.E-20-PHLC_LCF(JL))) ! PHLC_LCF(:)>0. + ENDDO + IF(LDSOFT) THEN + DO JL=1, KSIZE + PRCACCR(JL)=PRCACCR(JL) * MIN(1., ZMASK1(JL)+ZMASK2(JL)) + ENDDO + ELSE + PRCACCR(:)=0. + WHERE(ZMASK1(:)==1.) + !Accretion due to rain falling in high cloud content + PRCACCR(:) = XFCACCR * ( PHLC_HRC(:)/PHLC_HCF(:) ) & + * PLBDAR_RF(:)**XEXCACCR & + * PRHODREF(:)**(-XCEXVT) & + * PHLC_HCF + END WHERE + WHERE(ZMASK2(:)==1.) + !We add acrretion due to rain falling in low cloud content + PRCACCR(:) = PRCACCR(:) + XFCACCR * ( PHLC_LRC(:)/PHLC_LCF(:) ) & + * PLBDAR_RF(:)**XEXCACCR & + * PRHODREF(:)**(-XCEXVT) & + * (MIN(PCF(:), PRF(:))-PHLC_HCF(:)) + END WHERE + ENDIF +ELSE + CALL PRINT_MSG(NVERB_FATAL,'GEN','ICE4_WARM','wrong HSUBG_RC_RR_ACCR case') +ENDIF +DO JL=1, KSIZE + PA_RC(JL) = PA_RC(JL) - PRCACCR(JL) + PA_RR(JL) = PA_RR(JL) + PRCACCR(JL) +ENDDO +! +!* 4.4 compute the evaporation of r_r: RREVAV +! +IF (HSUBG_RR_EVAP=='NONE') THEN + DO JL=1, KSIZE + ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JL))) * & ! PRRT(:)>XRTMIN(3) + &MAX(0., SIGN(1., XRTMIN(2)-PRCT(JL))) * & ! PRCT(:)<=XRTMIN(2) + &PCOMPUTE(JL) + ENDDO + IF(LDSOFT) THEN + DO JL=1, KSIZE + PRREVAV(JL)=PRREVAV(JL)*ZMASK(JL) + ENDDO + ELSE + PRREVAV(:) = 0. + !Evaporation only when there's no cloud (RC must be 0) + WHERE(ZMASK(:)==1.) + PRREVAV(:) = EXP( XALPW - XBETAW/PT(:) - XGAMW*ALOG(PT(:) ) ) ! es_w + ZUSW(:) = 1.0 - PRVT(:)*( PPRES(:)-PRREVAV(:) ) / ( XEPSILO * PRREVAV(:) ) + ! Undersaturation over water + PRREVAV(:) = ( XLVTT+(XCPV-XCL)*(PT(:)-XTT) )**2 / ( PKA(:)*XRV*PT(:)**2 ) & + + ( XRV*PT(:) ) / ( PDV(:)*PRREVAV(:) ) + PRREVAV(:) = ( MAX( 0.0,ZUSW(:) )/(PRHODREF(:)*PRREVAV(:)) ) * & + ( X0EVAR*PLBDAR(:)**XEX0EVAR+X1EVAR*PCJ(:)*PLBDAR(:)**XEX1EVAR ) + END WHERE + ENDIF + +ELSEIF (HSUBG_RR_EVAP=='CLFR' .OR. HSUBG_RR_EVAP=='PRFR') THEN + !Evaporation in clear sky part + !With CLFR, rain is diluted over the grid box + !With PRFR, rain is concentrated in its fraction + !Use temperature and humidity in clear sky part like Bechtold et al. (1993) + IF (HSUBG_RR_EVAP=='CLFR') THEN + ZZW4(:)=1. !Precipitation fraction + ZZW3(:)=PLBDAR(:) + ELSE + ZZW4(:)=PRF(:) !Precipitation fraction + ZZW3(:)=PLBDAR_RF(:) + ENDIF + + !ATTENTION + !Il faudrait recalculer les variables PKA, PDV, PCJ en tenant compte de la température T^u + !Ces variables devraient être sorties de rain_ice_slow et on mettrait le calcul de T^u, T^s + !et plusieurs versions (comme actuellement, en ciel clair, en ciel nuageux) de PKA, PDV, PCJ dans rain_ice + !On utiliserait la bonne version suivant l'option NONE, CLFR... dans l'évaporation et ailleurs + DO JL=1, KSIZE + ZMASK(JL)=MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JL))) * & ! PRRT(:)>XRTMIN(3) + &MAX(0., -SIGN(1., PCF(JL)-ZZW4(JL))) * & ! ZZW4(:) > PCF(:) + &PCOMPUTE(JL) + ENDDO + IF(LDSOFT) THEN + DO JL=1, KSIZE + PRREVAV(JL)=PRREVAV(JL)*ZMASK(JL) + ENDDO + ELSE + PRREVAV(:) = 0. + WHERE(ZMASK(:)==1) + ! outside the cloud (environment) the use of T^u (unsaturated) instead of T + ! Bechtold et al. 1993 + ! + ! T_l + ZTHLT(:) = PTHT(:) - XLVTT*PTHT(:)/XCPD/PT(:)*PRCT(:) + ! + ! T^u = T_l = theta_l * (T/theta) + ZZW2(:) = ZTHLT(:) * PT(:) / PTHT(:) + ! + ! es_w with new T^u + PRREVAV(:) = EXP( XALPW - XBETAW/ZZW2(:) - XGAMW*ALOG(ZZW2(:) ) ) + ! + ! S, Undersaturation over water (with new theta^u) + ZUSW(:) = 1.0 - PRVT(:)*( PPRES(:)-PRREVAV(:) ) / ( XEPSILO * PRREVAV(:) ) + ! + PRREVAV(:) = ( XLVTT+(XCPV-XCL)*(ZZW2(:)-XTT) )**2 / ( PKA(:)*XRV*ZZW2(:)**2 ) & + + ( XRV*ZZW2(:) ) / ( PDV(:)*PRREVAV(:) ) + ! + PRREVAV(:) = MAX( 0.0,ZUSW(:) )/(PRHODREF(:)*PRREVAV(:)) * & + ( X0EVAR*ZZW3(:)**XEX0EVAR+X1EVAR*PCJ(:)*ZZW3(:)**XEX1EVAR ) + ! + PRREVAV(:) = PRREVAV(:)*(ZZW4(:)-PCF(:)) + END WHERE + ENDIF + +ELSE + CALL PRINT_MSG(NVERB_FATAL,'GEN','ICE4_WARM','wrong HSUBG_RR_EVAP case') +END IF +DO JL=1, KSIZE + PA_RR(JL) = PA_RR(JL) - PRREVAV(JL) + PA_RV(JL) = PA_RV(JL) + PRREVAV(JL) + PA_TH(JL) = PA_TH(JL) - PRREVAV(JL)*PLVFACT(JL) +ENDDO +! +! +END SUBROUTINE ICE4_WARM diff --git a/src/mesonh/micro/ice_adjust.f90 b/src/mesonh/micro/ice_adjust.f90 new file mode 100644 index 000000000..8f5a8b35e --- /dev/null +++ b/src/mesonh/micro/ice_adjust.f90 @@ -0,0 +1,524 @@ +!MNH_LIC Copyright 1996-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ###################### + MODULE MODI_ICE_ADJUST +! ###################### +! +INTERFACE +! + SUBROUTINE ICE_ADJUST (KKA, KKU, KKL, KRR, HFRAC_ICE, HCONDENS, HLAMBDA3,& + HBUNAME, OSUBG_COND, OSIGMAS, HSUBG_MF_PDF, & + PTSTEP, PSIGQSAT, & + PRHODJ, PEXNREF, PRHODREF, PSIGS, PMFCONV, & + PPABST, PZZ, & + PEXN, PCF_MF, PRC_MF, PRI_MF, & + PRV, PRC, PRVS, PRCS, PTH, PTHS, PSRCS, PCLDFR, & + PRR, PRI, PRIS, PRS, PRG, PRH, & + POUT_RV, POUT_RC, POUT_RI, POUT_TH, & + PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF ) +! +INTEGER, INTENT(IN) :: KKA !near ground array index +INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO +INTEGER, INTENT(IN) :: KRR ! Number of moist variables +CHARACTER(len=1), INTENT(IN) :: HFRAC_ICE +CHARACTER(len=80), INTENT(IN) :: HCONDENS +CHARACTER(len=4), INTENT(IN) :: HLAMBDA3 ! formulation for lambda3 coeff +CHARACTER(len=*), INTENT(IN) :: HBUNAME ! Name of the budget +LOGICAL, INTENT(IN) :: OSUBG_COND ! Switch for Subgrid + ! Condensation +LOGICAL :: OSIGMAS ! Switch for Sigma_s: + ! use values computed in CONDENSATION + ! or that from turbulence scheme +CHARACTER(len=*), INTENT(IN) :: HSUBG_MF_PDF +REAL, INTENT(IN) :: PTSTEP ! Double Time step + ! (single if cold start) +REAL, INTENT(IN) :: PSIGQSAT ! coeff applied to qsat variance contribution +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSIGS ! Sigma_s at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PMFCONV ! convective mass flux +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! Absolute Pressure at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! height of model layer +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXN ! Exner function +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCF_MF! Convective Mass Flux Cloud fraction +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRI_MF! Convective Mass Flux ice mixing ratio +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRC_MF! Convective Mass Flux liquid mixing ratio +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRV ! Water vapor m.r. to adjust +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRC ! Cloud water m.r. to adjust +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVS ! Water vapor m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTH ! Theta to adjust +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSRCS ! Second-order flux + ! s'rc'/2Sigma_s2 at time t+1 + ! multiplied by Lambda_3 +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PCLDFR ! Cloud fraction +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRIS ! Cloud ice m.r. at t+1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRR ! Rain water m.r. to adjust +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRI ! Cloud ice m.r. to adjust +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRS ! Aggregate m.r. to adjust +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRG ! Graupel m.r. to adjust +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PRH ! Hail m.r. to adjust +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT) :: POUT_RV ! Adjusted value +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT) :: POUT_RC ! Adjusted value +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT) :: POUT_RI ! Adjusted value +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT) :: POUT_TH ! Adjusted value +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT) :: PHLC_HRC +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT) :: PHLC_HCF +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT) :: PHLI_HRI +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT) :: PHLI_HCF +! +! +END SUBROUTINE ICE_ADJUST +! +END INTERFACE +! +END MODULE MODI_ICE_ADJUST + +! ########################################################################## + SUBROUTINE ICE_ADJUST (KKA, KKU, KKL, KRR, HFRAC_ICE, HCONDENS, HLAMBDA3,& + HBUNAME, OSUBG_COND, OSIGMAS, HSUBG_MF_PDF, & + PTSTEP, PSIGQSAT, & + PRHODJ, PEXNREF, PRHODREF, PSIGS, PMFCONV, & + PPABST, PZZ, & + PEXN, PCF_MF, PRC_MF, PRI_MF, & + PRV, PRC, PRVS, PRCS, PTH, PTHS, PSRCS, PCLDFR, & + PRR, PRI, PRIS, PRS, PRG, PRH, & + POUT_RV, POUT_RC, POUT_RI, POUT_TH, & + PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF ) +! ######################################################################### +! +!!**** *ICE_ADJUST* - compute the ajustment of water vapor in mixed-phase +!! clouds +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the fast microphysical sources +!! through a saturation ajustement procedure in case of mixed-phase clouds. +!! +!! +!!** METHOD +!! ------ +!! Langlois, Tellus, 1973 for the cloudless version. +!! When cloud water is taken into account, refer to book 1 of the +!! documentation. +!! +!! +!! +!! EXTERNAL +!! -------- +!! None +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST +!! XP00 ! Reference pressure +!! XMD,XMV ! Molar mass of dry air and molar mass of vapor +!! XRD,XRV ! Gaz constant for dry air, gaz constant for vapor +!! XCPD,XCPV ! Cpd (dry air), Cpv (vapor) +!! XCL ! Cl (liquid) +!! XCI ! Ci (ice) +!! XTT ! Triple point temperature +!! XLVTT ! Vaporization heat constant +!! XLSTT ! Sublimation heat constant +!! XALPW,XBETAW,XGAMW ! Constants for saturation vapor over liquid +!! ! pressure function +!! XALPI,XBETAI,XGAMI ! Constants for saturation vapor over ice +!! ! pressure function +!! Module MODD_CONF +!! CCONF +!! Module MODD_BUDGET: +!! NBUMOD +!! CBUTYPE +!! LBU_RTH +!! LBU_RRV +!! LBU_RRC +!! LBU_RRI +!! +!! +!! REFERENCE +!! --------- +!! Book 1 and Book2 of documentation ( routine ICE_ADJUST ) +!! Langlois, Tellus, 1973 +!! +!! AUTHOR +!! ------ +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! +!! +!! MODIFICATIONS +!! ------------- +!! Original 06/12/96 +!! M. Tomasini 27/11/00 Change CND and DEP fct of the T instead of rc and ri +!! Avoid the sub- and super-saturation before the ajustment +!! Avoid rc>0 if T<T00 before the ajustment +!! P Bechtold 12/02/02 change subgrid condensation +!! JP Pinty 29/11/02 add ICE2 and IC4 cases +!! (P. Jabouille) 27/05/04 safety test for case where esw/i(T)> pabs (~Z>40km) +!! J.Pergaud and S.Malardel Add EDKF case +!! S. Riette ice for EDKF +!! 2012-02 Y. Seity, add possibility to run with reversed vertical levels +!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 +!! 2016-07 S. Riette: adjustement is now realized on state variables (PRV, PRC, PRI, PTH) +!! whereas tendencies are still applied on S variables. +!! This modification allows to call ice_adjust on T variable +!! or to call it on S variables +!! 2016-11 S. Riette: all-or-nothing adjustment now uses condensation +! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 02/2020: use the new data structures and subroutines for budgets +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +use modd_budget, only: lbudget_th, lbudget_rv, lbudget_rc, lbudget_ri, & + NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, NBUDGET_RI, & + tbudgets +USE MODD_CONF +USE MODD_CST +USE MODD_PARAMETERS + +use mode_budget, only: Budget_store_init, Budget_store_end +USE MODD_RAIN_ICE_PARAM, ONLY : XCRIAUTC, XCRIAUTI, XACRIAUTI, XBCRIAUTI +use mode_tools_ll, only: GET_INDICE_ll + +USE MODI_CONDENSATION +USE MODI_GET_HALO + +IMPLICIT NONE +! +! +!* 0.1 Declarations of dummy arguments : +! +! +INTEGER, INTENT(IN) :: KKA !near ground array index +INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO +INTEGER, INTENT(IN) :: KRR ! Number of moist variables +CHARACTER(len=1), INTENT(IN) :: HFRAC_ICE +CHARACTER(len=80), INTENT(IN) :: HCONDENS +CHARACTER(len=4), INTENT(IN) :: HLAMBDA3 ! formulation for lambda3 coeff +CHARACTER(len=*), INTENT(IN) :: HBUNAME ! Name of the budget +LOGICAL, INTENT(IN) :: OSUBG_COND ! Switch for Subgrid + ! Condensation +LOGICAL :: OSIGMAS ! Switch for Sigma_s: + ! use values computed in CONDENSATION + ! or that from turbulence scheme +CHARACTER(len=*), INTENT(IN) :: HSUBG_MF_PDF +REAL, INTENT(IN) :: PTSTEP ! Double Time step + ! (single if cold start) +REAL, INTENT(IN) :: PSIGQSAT ! coeff applied to qsat variance contribution +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSIGS ! Sigma_s at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PMFCONV ! convective mass flux +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! Absolute Pressure at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! height of model layer +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXN ! Exner function +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCF_MF! Convective Mass Flux Cloud fraction +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRC_MF! Convective Mass Flux liquid mixing ratio +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRI_MF! Convective Mass Flux ice mixing ratio +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRV ! Water vapor m.r. to adjust +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRC ! Cloud water m.r. to adjust +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVS ! Water vapor m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTH ! Theta to adjust +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSRCS ! Second-order flux + ! s'rc'/2Sigma_s2 at time t+1 + ! multiplied by Lambda_3 +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PCLDFR ! Cloud fraction +! +REAL, DIMENSION(:,:,:), INTENT(INOUT):: PRIS ! Cloud ice m.r. at t+1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRR ! Rain water m.r. to adjust +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRI ! Cloud ice m.r. to adjust +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRS ! Aggregate m.r. to adjust +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRG ! Graupel m.r. to adjust +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PRH ! Hail m.r. to adjust +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT) :: POUT_RV ! Adjusted value +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT) :: POUT_RC ! Adjusted value +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT) :: POUT_RI ! Adjusted value +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT) :: POUT_TH ! Adjusted value +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT) :: PHLC_HRC +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT) :: PHLC_HCF +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT) :: PHLI_HRI +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT) :: PHLI_HCF +! +!* 0.2 Declarations of local variables : +! +! +REAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) & + :: ZT, & ! adjusted temperature + ZRV, ZRC, ZRI, & ! adjusted state + ZCPH, & ! guess of the CPh for the mixing + ZLV, & ! guess of the Lv at t+1 + ZLS, & ! guess of the Ls at t+1 + ZW1,ZW2, & ! Work arrays for intermediate fields + ZCRIAUT, & ! Autoconversion thresholds + ZHCF, ZHR +! +INTEGER :: IIU,IJU,IKU! dimensions of dummy arrays +INTEGER :: IIB,IJB ! Horz index values of the first inner mass points +INTEGER :: IIE,IJE ! Horz index values of the last inner mass points +INTEGER :: IKB ! K index value of the first inner mass point +INTEGER :: IKE ! K index value of the last inner mass point +INTEGER :: JITER,ITERMAX ! iterative loop for first order adjustment +! +REAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) :: ZSIGS,ZSRCS +! +!------------------------------------------------------------------------------- +! +!* 1. PRELIMINARIES +! ------------- +! +if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), trim( hbuname ), pths(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_rv ) call Budget_store_init( tbudgets(NBUDGET_RV), trim( hbuname ), prvs(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), trim( hbuname ), prcs(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), trim( hbuname ), pris(:, :, :) * prhodj(:, :, :) ) + +IIU = SIZE(PEXNREF,1) +IJU = SIZE(PEXNREF,2) +IKU = SIZE(PEXNREF,3) +CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) +IKB=KKA+JPVEXT*KKL +IKE=KKU-JPVEXT*KKL +! +ITERMAX=1 +! +!------------------------------------------------------------------------------- +! +!* 2. COMPUTE QUANTITIES WITH THE GUESS OF THE FUTURE INSTANT +! ------------------------------------------------------- +! +! +! beginning of the iterative loop (to compute the adjusted state) +ZRV(:,:,:)=PRV(:,:,:) +ZRC(:,:,:)=PRC(:,:,:) +ZRI(:,:,:)=PRI(:,:,:) +ZT(:,:,:)=PTH(:,:,:) * PEXN(:,:,:) +! +DO JITER =1,ITERMAX + ! + !* 2.3 compute the latent heat of vaporization Lv(T*) at t+1 + ! and the latent heat of sublimation Ls(T*) at t+1 + ! + ZLV(:,:,:) = XLVTT + ( XCPV - XCL ) * ( ZT(:,:,:) -XTT ) + ZLS(:,:,:) = XLSTT + ( XCPV - XCI ) * ( ZT(:,:,:) -XTT ) + ! + !* 2.4 compute the specific heat for moist air (Cph) at t+1 + ! + IF ( KRR == 7 ) THEN + ZCPH(:,:,:) = XCPD + XCPV * ZRV(:,:,:) & + + XCL * (ZRC(:,:,:) + PRR(:,:,:)) & + + XCI * (ZRI(:,:,:) + PRS(:,:,:) + PRG(:,:,:) + PRH(:,:,:)) + ELSE IF( KRR == 6 ) THEN + ZCPH(:,:,:) = XCPD + XCPV * ZRV(:,:,:) & + + XCL * (ZRC(:,:,:) + PRR(:,:,:)) & + + XCI * (ZRI(:,:,:) + PRS(:,:,:) + PRG(:,:,:)) + ELSE IF( KRR == 5 ) THEN + ZCPH(:,:,:) = XCPD + XCPV * ZRV(:,:,:) & + + XCL * (ZRC(:,:,:) + PRR(:,:,:)) & + + XCI * (ZRI(:,:,:) + PRS(:,:,:)) + ELSE IF( KRR == 3 ) THEN + ZCPH(:,:,:) = XCPD + XCPV * ZRV(:,:,:) & + + XCL * (ZRC(:,:,:) + PRR(:,:,:)) + ELSE IF( KRR == 2 ) THEN + ZCPH(:,:,:) = XCPD + XCPV * ZRV(:,:,:) & + + XCL * ZRC(:,:,:) + END IF + ! + IF ( OSUBG_COND ) THEN + ! + !* 3. SUBGRID CONDENSATION SCHEME + ! --------------------------- + ! + ! PSRC= s'rci'/Sigma_s^2 + ! ZT, ZRV, ZRC and ZRI are INOUT + CALL CONDENSATION(IIU, IJU, IKU, IIB, IIE, IJB, IJE, IKB, IKE, KKL, & + HFRAC_ICE, HCONDENS, HLAMBDA3, & + PPABST, PZZ, PRHODREF, ZT, ZRV, ZRC, ZRI, PRS, PRG, PSIGS, PMFCONV, PCLDFR, & + PSRCS, .TRUE., OSIGMAS, & + PSIGQSAT, PLV=ZLV, PLS=ZLS, PCPH=ZCPH, PHLC_HRC=PHLC_HRC, PHLC_HCF=PHLC_HCF, PHLI_HRI=PHLI_HRI, PHLI_HCF=PHLI_HCF) + ELSE + ! + !* 4. ALL OR NOTHING CONDENSATION SCHEME + ! FOR MIXED-PHASE CLOUD + ! ----------------------------------------------- + ! + ! + ! ZT, ZRV, ZRC and ZRI are INOUT + ! + !CALL ADJUST_LANGLOIS(IIU, IJU, IKU, IIB, IIE, IJB, IJE, IKB, IKE, KKL, & + ! PPABST, ZT, ZRV, ZRC, ZRI, ZLV, ZLS, ZCPH) HFRAC_ICE must be implemented in Langlois before using it again + ZSIGS=0. + CALL CONDENSATION(IIU, IJU, IKU, IIB, IIE, IJB, IJE, IKB, IKE, KKL, & + HFRAC_ICE, HCONDENS, HLAMBDA3, & + PPABST, PZZ, PRHODREF, ZT, ZRV, ZRC, ZRI, PRS, PRG, ZSIGS, PMFCONV, PCLDFR, & + ZSRCS, .TRUE., OSIGMAS=.TRUE., & + PSIGQSAT=0., PLV=ZLV, PLS=ZLS, PHLC_HRC=PHLC_HRC, PHLC_HCF=PHLC_HCF, PHLI_HRI=PHLI_HRI, PHLI_HCF=PHLI_HCF) + ENDIF +ENDDO ! end of the iterative loop +! +!* 5. COMPUTE THE SOURCES AND STORES THE CLOUD FRACTION +! ------------------------------------------------- +! +! +!* 5.0 compute the variation of mixing ratio +! + ! Rc - Rc* +ZW1(:,:,:) = (ZRC(:,:,:) - PRC(:,:,:)) / PTSTEP ! Pcon = ---------- + ! 2 Delta t + +ZW2(:,:,:) = (ZRI(:,:,:) - PRI(:,:,:)) / PTSTEP ! idem ZW1 but for Ri +! +!* 5.1 compute the sources +! +WHERE( ZW1(:,:,:) < 0.0 ) + ZW1(:,:,:) = MAX ( ZW1(:,:,:), -PRCS(:,:,:) ) +ELSEWHERE + ZW1(:,:,:) = MIN ( ZW1(:,:,:), PRVS(:,:,:) ) +END WHERE +PRVS(:,:,:) = PRVS(:,:,:) - ZW1(:,:,:) +PRCS(:,:,:) = PRCS(:,:,:) + ZW1(:,:,:) +PTHS(:,:,:) = PTHS(:,:,:) + & + ZW1(:,:,:) * ZLV(:,:,:) / (ZCPH(:,:,:) * PEXNREF(:,:,:)) +! +WHERE( ZW2(:,:,:) < 0.0 ) + ZW2(:,:,:) = MAX ( ZW2(:,:,:), -PRIS(:,:,:) ) +ELSEWHERE + ZW2(:,:,:) = MIN ( ZW2(:,:,:), PRVS(:,:,:) ) +END WHERE +PRVS(:,:,:) = PRVS(:,:,:) - ZW2(:,:,:) +PRIS(:,:,:) = PRIS(:,:,:) + ZW2(:,:,:) +PTHS(:,:,:) = PTHS(:,:,:) + & + ZW2(:,:,:) * ZLS(:,:,:) / (ZCPH(:,:,:) * PEXNREF(:,:,:)) +! +! +!* 5.2 compute the cloud fraction PCLDFR +! +IF ( .NOT. OSUBG_COND ) THEN + WHERE (PRCS(:,:,:) + PRIS(:,:,:) > 1.E-12 / PTSTEP) + PCLDFR(:,:,:) = 1. + ELSEWHERE + PCLDFR(:,:,:) = 0. + ENDWHERE + IF ( SIZE(PSRCS,3) /= 0 ) THEN + PSRCS(:,:,:) = PCLDFR(:,:,:) + END IF +ELSE + !We limit PRC_MF+PRI_MF to PRVS*PTSTEP to avoid negative humidity + ZW1(:,:,:)=PRC_MF(:,:,:)/PTSTEP + ZW2(:,:,:)=PRI_MF(:,:,:)/PTSTEP + WHERE(ZW1(:,:,:)+ZW2(:,:,:)>PRVS(:,:,:)) + ZW1(:,:,:)=ZW1(:,:,:)*PRVS(:,:,:)/(ZW1(:,:,:)+ZW2(:,:,:)) + ZW2(:,:,:)=PRVS(:,:,:)-ZW1(:,:,:) + ENDWHERE + IF(PRESENT(PHLC_HRC) .AND. PRESENT(PHLC_HCF)) THEN + ZCRIAUT(:,:,:)=XCRIAUTC/PRHODREF + IF(HSUBG_MF_PDF=='NONE')THEN + WHERE(ZW1(:,:,:)*PTSTEP>PCF_MF * ZCRIAUT) + PHLC_HRC(:,:,:)=PHLC_HRC(:,:,:)+ZW1(:,:,:)*PTSTEP + PHLC_HCF(:,:,:)=MIN(1.,PHLC_HCF(:,:,:)+PCF_MF(:,:,:)) + ENDWHERE + ELSEIF(HSUBG_MF_PDF=='TRIANGLE')THEN + !ZHCF is the precipitating part of the *cloud* and not of the grid cell + WHERE(ZW1(:,:,:)*PTSTEP>PCF_MF*ZCRIAUT(:,:,:)) + ZHCF(:,:,:)=1.-.5*(ZCRIAUT(:,:,:)*PCF_MF(:,:,:) / MAX(1.E-20, ZW1(:,:,:)*PTSTEP))**2 + ZHR(:,:,:)=ZW1(:,:,:)*PTSTEP-(ZCRIAUT(:,:,:)*PCF_MF(:,:,:))**3 / & + &(3*MAX(1.E-20, ZW1(:,:,:)*PTSTEP)**2) + ELSEWHERE(2.*ZW1(:,:,:)*PTSTEP<=PCF_MF * ZCRIAUT(:,:,:)) + ZHCF(:,:,:)=0. + ZHR(:,:,:)=0. + ELSEWHERE + ZHCF(:,:,:)=(2.*ZW1(:,:,:)*PTSTEP-ZCRIAUT(:,:,:)*PCF_MF(:,:,:))**2 / & + &(2.*MAX(1.E-20, ZW1(:,:,:)*PTSTEP)**2) + ZHR(:,:,:)=(4.*(ZW1(:,:,:)*PTSTEP)**3-3.*ZW1(:,:,:)*PTSTEP*(ZCRIAUT(:,:,:)*PCF_MF(:,:,:))**2+& + (ZCRIAUT(:,:,:)*PCF_MF(:,:,:))**3) / & + &(3*MAX(1.E-20, ZW1(:,:,:)*PTSTEP)**2) + ENDWHERE + ZHCF(:,:,:)=ZHCF(:,:,:)*PCF_MF(:,:,:) !to retrieve the part of the grid cell + PHLC_HCF(:,:,:)=MIN(1.,PHLC_HCF(:,:,:)+ZHCF(:,:,:)) !total part of the grid cell that is precipitating + PHLC_HRC(:,:,:)=PHLC_HRC(:,:,:)+ZHR(:,:,:) + ENDIF + ENDIF + IF(PRESENT(PHLI_HRI) .AND. PRESENT(PHLI_HCF)) THEN + ZCRIAUT(:,:,:)=MIN(XCRIAUTI,10**(XACRIAUTI*(ZT(:,:,:)-XTT)+XBCRIAUTI)) + IF(HSUBG_MF_PDF=='NONE')THEN + WHERE(ZW2(:,:,:)*PTSTEP>PCF_MF * ZCRIAUT(:,:,:)) + PHLI_HRI(:,:,:)=PHLI_HRI(:,:,:)+ZW2(:,:,:)*PTSTEP + PHLI_HCF(:,:,:)=MIN(1.,PHLI_HCF(:,:,:)+PCF_MF(:,:,:)) + ENDWHERE + ELSEIF(HSUBG_MF_PDF=='TRIANGLE')THEN + !ZHCF is the precipitating part of the *cloud* and not of the grid cell + WHERE(ZW2(:,:,:)*PTSTEP>PCF_MF*ZCRIAUT) + ZHCF(:,:,:)=1.-.5*(ZCRIAUT*PCF_MF(:,:,:) / (ZW2(:,:,:)*PTSTEP))**2 + ZHR(:,:,:)=ZW2(:,:,:)*PTSTEP-(ZCRIAUT*PCF_MF(:,:,:))**3/(3*(ZW2(:,:,:)*PTSTEP)**2) + ELSEWHERE(2.*ZW2(:,:,:)*PTSTEP<=PCF_MF * ZCRIAUT) + ZHCF(:,:,:)=0. + ZHR(:,:,:)=0. + ELSEWHERE + ZHCF(:,:,:)=(2.*ZW2(:,:,:)*PTSTEP-ZCRIAUT*PCF_MF(:,:,:))**2 / (2.*(ZW2(:,:,:)*PTSTEP)**2) + ZHR(:,:,:)=(4.*(ZW2(:,:,:)*PTSTEP)**3-3.*ZW2(:,:,:)*PTSTEP*(ZCRIAUT*PCF_MF(:,:,:))**2+& + (ZCRIAUT*PCF_MF(:,:,:))**3)/(3*(ZW2(:,:,:)*PTSTEP)**2) + ENDWHERE + ZHCF(:,:,:)=ZHCF(:,:,:)*PCF_MF(:,:,:) !to retrieve the part of the grid cell + PHLI_HCF(:,:,:)=MIN(1.,PHLI_HCF(:,:,:)+ZHCF(:,:,:)) !total part of the grid cell that is precipitating + PHLI_HRI(:,:,:)=PHLI_HRI(:,:,:)+ZHR(:,:,:) + ENDIF + ENDIF + PCLDFR(:,:,:)=MIN(1.,PCLDFR(:,:,:)+PCF_MF(:,:,:)) + PRCS(:,:,:)=PRCS(:,:,:)+ZW1(:,:,:) + PRIS(:,:,:)=PRIS(:,:,:)+ZW2(:,:,:) + PRVS(:,:,:)=PRVS(:,:,:)-(ZW1(:,:,:)+ZW2(:,:,:)) + PTHS(:,:,:) = PTHS(:,:,:) + & + (ZW1 * ZLV(:,:,:) + ZW2 * ZLS(:,:,:)) / ZCPH(:,:,:) & + / PEXNREF(:,:,:) + IF(PRESENT(POUT_RV) .OR. PRESENT(POUT_RC) .OR. & + &PRESENT(POUT_RI) .OR. PRESENT(POUT_TH)) THEN + ZW1(:,:,:)=PRC_MF(:,:,:) + ZW2(:,:,:)=PRI_MF(:,:,:) + WHERE(ZW1(:,:,:)+ZW2(:,:,:)>ZRV(:,:,:)) + ZW1(:,:,:)=ZW1(:,:,:)*ZRV(:,:,:)/(ZW1(:,:,:)+ZW2(:,:,:)) + ZW2(:,:,:)=ZRV(:,:,:)-ZW1(:,:,:) + ENDWHERE + ZRC(:,:,:)=ZRC(:,:,:)+ZW1(:,:,:) + ZRI(:,:,:)=ZRI(:,:,:)+ZW2(:,:,:) + ZRV(:,:,:)=ZRV(:,:,:)-(ZW1(:,:,:)+ZW2(:,:,:)) + ZT(:,:,:) = ZT(:,:,:) + & + (ZW1 * ZLV(:,:,:) + ZW2 * ZLS(:,:,:)) / ZCPH(:,:,:) + ENDIF +ENDIF +! +IF(PRESENT(POUT_RV)) POUT_RV=ZRV +IF(PRESENT(POUT_RC)) POUT_RC=ZRC +IF(PRESENT(POUT_RI)) POUT_RI=ZRI +IF(PRESENT(POUT_TH)) POUT_TH=ZT / PEXN(:,:,:) +! +! +!* 6. STORE THE BUDGET TERMS +! ---------------------- +! +if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), trim( hbuname ), pths(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_rv ) call Budget_store_end( tbudgets(NBUDGET_RV), trim( hbuname ), prvs(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), trim( hbuname ), prcs(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), trim( hbuname ), pris(:, :, :) * prhodj(:, :, :) ) + +!------------------------------------------------------------------------------ +! +! +END SUBROUTINE ICE_ADJUST diff --git a/src/mesonh/micro/ini_cst.f90 b/src/mesonh/micro/ini_cst.f90 new file mode 100644 index 000000000..7c3170c4c --- /dev/null +++ b/src/mesonh/micro/ini_cst.f90 @@ -0,0 +1,197 @@ +!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ################### + MODULE MODI_INI_CST +! ################### +! +INTERFACE +! +SUBROUTINE INI_CST +END SUBROUTINE INI_CST +! +END INTERFACE +! +END MODULE MODI_INI_CST +! +! +! +! ################## + SUBROUTINE INI_CST +! ################## +! +!!**** *INI_CST * - routine to initialize the module MODD_CST +!! +!! PURPOSE +!! ------- +! The purpose of this routine is to initialize the physical constants +! stored in module MODD_CST. +! +! +!!** METHOD +!! ------ +!! The physical constants are set to their numerical values +!! +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST : contains physical constants +!! +!! REFERENCE +!! --------- +!! Book2 of the documentation (module MODD_CST, routine INI_CST) +!! +!! +!! AUTHOR +!! ------ +!! V. Ducrocq * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 18/05/94 +!! J. Stein 02/01/95 add the volumic mass of liquid water +!! J.-P. Pinty 13/12/95 add the water vapor pressure over solid ice +!! J. Stein 29/06/97 add XTH00 +!! V. Masson 05/10/98 add XRHOLI +!! C. Mari 31/10/00 add NDAYSEC +!! V. Masson 01/03/03 add XCONDI +!! J. Escobar 28/03/2014 for pb with emissivity/aerosol reset XMNH_TINY=1.0e-80 in real8 case +!! J.Escobar : 10/2017 : for real*4 , add XMNH_HUGE_12_LOG +!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +!! J.Escobar : 5/10/2018 : for real*4 ,higher value for XEPS_DT = 1.5e-4 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +use modd_precision, only: MNHREAL +! +IMPLICIT NONE +! +!------------------------------------------------------------------------------- +! +!* 1. FUNDAMENTAL CONSTANTS +! --------------------- +! +XPI = 2.*ASIN(1.) +XKARMAN = 0.4 +XLIGHTSPEED = 299792458. +XPLANCK = 6.6260755E-34 +XBOLTZ = 1.380658E-23 +XAVOGADRO = 6.0221367E+23 +! +!------------------------------------------------------------------------------- +! +!* 2. ASTRONOMICAL CONSTANTS +! ---------------------- +! +XDAY = 86400. +XSIYEA = 365.25*XDAY*2.*XPI/ 6.283076 +XSIDAY = XDAY/(1.+XDAY/XSIYEA) +XOMEGA = 2.*XPI/XSIDAY +NDAYSEC = 24*3600 ! Number of seconds in a day +! +!-------------------------------------------------------------------------------! +! +! +!* 3. TERRESTRIAL GEOIDE CONSTANTS +! ---------------------------- +! +XRADIUS = 6371229. +XG = 9.80665 +! +!------------------------------------------------------------------------------- +! +!* 4. REFERENCE PRESSURE +! ------------------- +! +! Ocean model cst same as in 1D/CMO SURFEX +! values used in ini_cst to overwrite XP00 and XTH00 +XRH00OCEAN =1024. +XTH00OCEAN = 286.65 +XSA00OCEAN= 32.6 +XP00OCEAN = 201.E5 +!Atmospheric model +XP00 = 1.E5 +XTH00 = 300. +!------------------------------------------------------------------------------- +! +!* 5. RADIATION CONSTANTS +! ------------------- +! +!JUAN OVERFLOW XSTEFAN = 2.* XPI**5 * XBOLTZ**4 / (15.* XLIGHTSPEED**2 * XPLANCK**3) +XSTEFAN = ( 2.* XPI**5 / 15. ) * ( (XBOLTZ / XPLANCK) * XBOLTZ ) * (XBOLTZ/(XLIGHTSPEED*XPLANCK))**2 +XI0 = 1370. +! +!------------------------------------------------------------------------------- +! +!* 6. THERMODYNAMIC CONSTANTS +! ----------------------- +! +XMD = 28.9644E-3 +XMV = 18.0153E-3 +XRD = XAVOGADRO * XBOLTZ / XMD +XRV = XAVOGADRO * XBOLTZ / XMV +XEPSILO= XMV/XMD +XCPD = 7.* XRD /2. +XCPV = 4.* XRV +XRHOLW = 1000. +XRHOLI = 900. +XCONDI = 2.22 +XCL = 4.218E+3 +XCI = 2.106E+3 +XTT = 273.16 +XLVTT = 2.5008E+6 +XLSTT = 2.8345E+6 +XLMTT = XLSTT - XLVTT +XESTT = 611.14 +XGAMW = (XCL - XCPV) / XRV +XBETAW = (XLVTT/XRV) + (XGAMW * XTT) +XALPW = LOG(XESTT) + (XBETAW /XTT) + (XGAMW *LOG(XTT)) +XGAMI = (XCI - XCPV) / XRV +XBETAI = (XLSTT/XRV) + (XGAMI * XTT) +XALPI = LOG(XESTT) + (XBETAI /XTT) + (XGAMI *LOG(XTT)) +! Values identical to ones used in CMO1D in SURFEX /could be modified +! Coefficient of thermal expansion of water (K-1) +XALPHAOC = 1.9E-4 +! Coeff of Haline contraction coeff (S-1) +XBETAOC= 7.7475E-4 +! +! Some machine precision value depending of real4/8 use +! + + +XMNH_EPSILON = EPSILON (XMNH_EPSILON ) +XMNH_HUGE = HUGE (XMNH_HUGE ) +XMNH_HUGE_12_LOG = LOG ( SQRT(XMNH_HUGE) ) + +#if (MNH_REAL == 8) +XMNH_TINY = 1.0e-80_MNHREAL +XEPS_DT = 1.0e-5_MNHREAL +XRES_FLAT_CART = 1.0e-12_MNHREAL +XRES_OTHER = 1.0e-9_MNHREAL +XRES_PREP = 1.0e-8_MNHREAL +#elif (MNH_REAL == 4) +XMNH_TINY = TINY (XMNH_TINY ) +XEPS_DT = 1.5e-4_MNHREAL +XRES_FLAT_CART = 1.0e-12_MNHREAL +XRES_OTHER = 1.0e-7_MNHREAL +XRES_PREP = 1.0e-4_MNHREAL +#else +#error "Invalid MNH_REAL" +#endif +XMNH_TINY_12 = SQRT (XMNH_TINY ) + + + +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE INI_CST diff --git a/src/mesonh/micro/ini_lima.f90 b/src/mesonh/micro/ini_lima.f90 new file mode 100644 index 000000000..d90f1e160 --- /dev/null +++ b/src/mesonh/micro/ini_lima.f90 @@ -0,0 +1,173 @@ +!MNH_LIC Copyright 2013-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! #################### + MODULE MODI_INI_LIMA +! #################### +! +INTERFACE + SUBROUTINE INI_LIMA (PTSTEP, PDZMIN, KSPLITR, KSPLITG) +! +INTEGER, INTENT(OUT):: KSPLITR ! Number of small time step + ! integration for rain + ! sedimendation +INTEGER, INTENT(OUT):: KSPLITG ! Number of small time step + ! integration for graupel + ! sedimendation +REAL, INTENT(IN) :: PTSTEP ! Effective Time step +REAL, INTENT(IN) :: PDZMIN ! minimun vertical mesh size +! +END SUBROUTINE INI_LIMA +! +END INTERFACE +! +END MODULE MODI_INI_LIMA +! ###################################################### + SUBROUTINE INI_LIMA (PTSTEP, PDZMIN, KSPLITR, KSPLITG) +! ###################################################### +! +!! PURPOSE +!! ------- +!! The purpose of this routine is to initialize the constants used in the +!! microphysical scheme LIMA. +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_REF +USE MODD_PARAM_LIMA +USE MODD_PARAMETERS +USE MODD_LUNIT, ONLY : TLUOUT0 +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +! +INTEGER, INTENT(OUT):: KSPLITR ! Number of small time step + ! integration for rain + ! sedimendation +INTEGER, INTENT(OUT):: KSPLITG ! Number of small time step + ! integration for graupel or hail + ! sedimendation +REAL, INTENT(IN) :: PTSTEP ! Effective Time step +REAL, INTENT(IN) :: PDZMIN ! minimun vertical mesh size +! +!* 0.2 Declarations of local variables : +! +REAL :: ZT ! Work variable +REAL, DIMENSION(7) :: ZVTRMAX +! +INTEGER :: JI +INTEGER :: ILUOUT0 ! Logical unit number for output-listing +INTEGER :: IRESP ! Return code of FM-routines +! +!------------------------------------------------------------------------------- +! +! +!* 1. INIT OUTPUT LISTING, COMPUTE KSPLITR AND KSPLITG +! ------------------------------------------------ +! +! +! Init output listing +ILUOUT0 = TLUOUT0%NLU +! +! +ZVTRMAX(2) = 0.3 ! Maximum cloud droplet fall speed +ZVTRMAX(3) = 15. ! Maximum rain drop fall speed +ZVTRMAX(4) = 1.5 ! Maximum ice crystal fall speed +ZVTRMAX(5) = 3.0 ! Maximum snow fall speed +ZVTRMAX(6) = 15. ! Maximum graupel fall speed +ZVTRMAX(7) = 30. ! Maximum hail fall speed +! +! NSPLITSED +! +DO JI=2,7 + NSPLITSED(JI) = 1 + SPLIT : DO + ZT = PTSTEP / REAL(NSPLITSED(JI)) + IF ( ZT * ZVTRMAX(JI) / PDZMIN < 1.0) EXIT SPLIT + NSPLITSED(JI) = NSPLITSED(JI) + 1 + END DO SPLIT +END DO +! +! KSPLITR +! +KSPLITR = 1 +SPLITR : DO + ZT = PTSTEP / REAL(KSPLITR) + IF ( ZT * ZVTRMAX(7) / PDZMIN < 1.0) EXIT SPLITR + KSPLITR = KSPLITR + 1 +END DO SPLITR +! +! +! KSPLITG +! +KSPLITG = 1 +SPLITG : DO + ZT = 2.* PTSTEP / REAL(KSPLITG) + IF ( ZT * ZVTRMAX(7) / PDZMIN .LT. 1.) EXIT SPLITG + KSPLITG = KSPLITG + 1 +END DO SPLITG +! +! +! +IF (ALLOCATED(XRTMIN)) RETURN ! In case of nesting microphysics, constants of + ! MODD_RAIN_C2R2_PARAM are computed only once. +! +! +! Set bounds for mixing ratios and concentrations +ALLOCATE( XRTMIN(7) ) +XRTMIN(1) = 1.0E-10 ! rv +XRTMIN(2) = 1.0E-10 ! rc +XRTMIN(3) = 1.0E-10 ! rr +XRTMIN(4) = 1.0E-10 ! ri +XRTMIN(5) = 1.0E-10 ! rs +XRTMIN(6) = 1.0E-10 ! rg +XRTMIN(7) = 1.0E-10 ! rh +ALLOCATE( XCTMIN(7) ) +XCTMIN(1) = 1.0 ! Not used +XCTMIN(2) = 1.0E-3 ! Nc +XCTMIN(3) = 1.0E-3 ! Nr +XCTMIN(4) = 1.0E-3 ! Ni +XCTMIN(5) = 1.0E-3 ! Not used +XCTMIN(6) = 1.0E-3 ! Not used +XCTMIN(7) = 1.0E-3 ! Not used +! +! +! Air density fall speed correction +XCEXVT = 0.4 +! +!------------------------------------------------------------------------------ +! +! +! +!* 2. DEFINE SPECIES CHARACTERISTICS AND PROCESSES CONSTANTS +! ------------------------------------------------------ +! +! +CALL INI_LIMA_WARM(PTSTEP, PDZMIN) +! +CALL INI_LIMA_COLD_MIXED(PTSTEP, PDZMIN) +! +!------------------------------------------------------------------------------ +! +END SUBROUTINE INI_LIMA diff --git a/src/mesonh/micro/ini_lima_cold_mixed.f90 b/src/mesonh/micro/ini_lima_cold_mixed.f90 new file mode 100644 index 000000000..cb427cdb4 --- /dev/null +++ b/src/mesonh/micro/ini_lima_cold_mixed.f90 @@ -0,0 +1,1348 @@ +!MNH_LIC Copyright 2013-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ############################### + MODULE MODI_INI_LIMA_COLD_MIXED +! ############################### +! +INTERFACE + SUBROUTINE INI_LIMA_COLD_MIXED (PTSTEP, PDZMIN) +! +REAL, INTENT(IN) :: PTSTEP ! Effective Time step +REAL, INTENT(IN) :: PDZMIN ! minimun vertical mesh size +! +END SUBROUTINE INI_LIMA_COLD_MIXED +! +END INTERFACE +! +END MODULE MODI_INI_LIMA_COLD_MIXED +! ############################################### + SUBROUTINE INI_LIMA_COLD_MIXED (PTSTEP, PDZMIN) +! ############################################### +! +!! PURPOSE +!! ------- +!! The purpose of this routine is to initialize the constants used in the +!! microphysical scheme LIMA for the cold and mixed phase variables +!! and processes. +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg +! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_LUNIT, ONLY: TLUOUT0 +USE MODD_PARAMETERS +USE MODD_PARAM_LIMA +USE MODD_PARAM_LIMA_WARM +USE MODD_PARAM_LIMA_COLD +USE MODD_PARAM_LIMA_MIXED +USE MODD_REF +! +use mode_msg +! +USE MODI_LIMA_FUNCTIONS +USE MODI_GAMMA +USE MODI_GAMMA_INC +USE MODI_RRCOLSS +USE MODI_RZCOLX +USE MODI_RSCOLRG +USE MODI_LIMA_READ_XKER_RACCS +USE MODI_LIMA_READ_XKER_SDRYG +USE MODI_LIMA_READ_XKER_RDRYG +USE MODI_LIMA_READ_XKER_SWETH +USE MODI_LIMA_READ_XKER_GWETH +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +REAL, INTENT(IN) :: PTSTEP ! Effective Time step +REAL, INTENT(IN) :: PDZMIN ! minimun vertical mesh size +! +!* 0.2 Declarations of local variables : +! +character(len=13) :: yval ! String for error message +INTEGER :: IKB ! Coordinates of the first physical + ! points along z +INTEGER :: J1,J2 ! Internal loop indexes +! +REAL, DIMENSION(8) :: ZGAMI ! parameters involving various moments +REAL, DIMENSION(2) :: ZGAMS ! of the generalized gamma law +! +REAL :: ZT ! Work variable +REAL :: ZVTRMAX ! Raindrop maximal fall velocity +REAL :: ZRHO00 ! Surface reference air density +REAL :: ZRATE ! Geometrical growth of Lbda in the tabulated + ! functions and kernels +REAL :: ZBOUND ! XDCSLIM*Lbda_s: upper bound for the partial + ! integration of the riming rate of the aggregates +REAL :: ZEGS, ZEGR, ZEHS, ZEHG! Bulk collection efficiencies +! +INTEGER :: IND ! Number of interval to integrate the kernels +REAL :: ZESR ! Mean efficiency of rain-aggregate collection +REAL :: ZFDINFTY ! Factor used to define the "infinite" diameter +! +! +INTEGER :: ILUOUT0 ! Logical unit number for output-listing +LOGICAL :: GFLAG ! Logical flag for printing the constatnts on the output + ! listing +REAL :: ZCONC_MAX ! Maximal concentration for snow +REAL :: ZFACT_NUCL! Amplification factor for the minimal ice concentration +! +INTEGER :: KND +INTEGER :: KACCLBDAS,KACCLBDAR,KDRYLBDAG,KDRYLBDAS,KDRYLBDAR +REAL :: PALPHAR,PALPHAS,PALPHAG,PALPHAH +REAL :: PNUR,PNUS,PNUG,PNUH +REAL :: PBR,PBS,PBG,PBH +REAL :: PCR,PCS,PCG,PCH +REAL :: PDR,PDS,PDG,PDH +REAL :: PESR,PEGS,PEGR,PEHS,PEHG +REAL :: PFDINFTY +REAL :: PACCLBDAS_MAX,PACCLBDAR_MAX,PACCLBDAS_MIN,PACCLBDAR_MIN +REAL :: PDRYLBDAG_MAX,PDRYLBDAS_MAX,PDRYLBDAG_MIN,PDRYLBDAS_MIN +REAL :: PDRYLBDAR_MAX,PDRYLBDAR_MIN +REAL :: PWETLBDAS_MAX,PWETLBDAG_MAX,PWETLBDAS_MIN,PWETLBDAG_MIN +REAL :: PWETLBDAH_MAX,PWETLBDAH_MIN +INTEGER :: KWETLBDAS,KWETLBDAG,KWETLBDAH +! +REAL :: ZFAC_ZRNIC ! Zrnic factor used to decrease Long Kernels +! +!------------------------------------------------------------------------------- +! +! +ILUOUT0 = TLUOUT0%NLU +! +! +!* 1. CHARACTERISTICS OF THE SPECIES +! ------------------------------ +! +! +!* 1.2 Ice crystal characteristics +! +SELECT CASE (CPRISTINE_ICE_LIMA) + CASE('PLAT') + XAI = 0.82 ! Plates + XBI = 2.5 ! Plates + XC_I = 747. ! Plates + XDI = 1.0 ! Plates + XC1I = 1./XPI ! Plates + CASE('COLU') + XAI = 2.14E-3 ! Columns + XBI = 1.7 ! Columns + XC_I = 1.96E5 ! Columns + XDI = 1.585 ! Columns + XC1I = 0.8 ! Columns + CASE('BURO') + XAI = 44.0 ! Bullet rosettes + XBI = 3.0 ! Bullet rosettes + XC_I = 4.E5 ! Bullet rosettes + XDI = 1.663 ! Bullet rosettes + XC1I = 0.5 ! Bullet rosettes +END SELECT +! +! Note that XCCI=N_i (a locally predicted value) and XCXI=0.0, implicitly +! +XF0I = 1.00 +! Correction BVIE XF2I from Pruppacher 1997 eq 13-88 +!XF2I = 0.103 +XF2I = 0.14 +XF0IS = 0.86 +XF1IS = 0.28 +! +!* 1.3 Snowflakes/aggregates characteristics +! +XAS = 0.02 +XBS = 1.9 +XCS = 5. +XDS = 0.27 +! +XCCS = 5.0 +XCXS = 1.0 +! +XF0S = 0.86 +XF1S = 0.28 +! +XC1S = 1./XPI +! +!* 1.4 Graupel characteristics +! +XAG = 19.6 ! Lump graupel case +XBG = 2.8 ! Lump graupel case +XCG = 122. ! Lump graupel case +XDG = 0.66 ! Lump graupel case +! +XCCG = 5.E5 +XCXG = -0.5 +! XCCG = 4.E4 ! Test of Ziegler (1988) +! XCXG = -1.0 ! Test of Ziegler (1988) +! +XF0G = 0.86 +XF1G = 0.28 +! +XC1G = 1./2. +! +!* 2.5 Hailstone characteristics +! +! +XAH = 470. +XBH = 3.0 +XCH = 201. +XDH = 0.64 +! +!XCCH = 5.E-4 +!XCXH = 2.0 +!!!!!!!!!!!! + XCCH = 4.E4 ! Test of Ziegler (1988) + XCXH = -1.0 ! Test of Ziegler (1988) +!!! XCCH = 5.E5 ! Graupel_like +!!! XCXH = -0.5 ! Graupel_like +!!!!!!!!!!!! +! +XF0H = 0.86 +XF1H = 0.28 +! +XC1H = 1./2. +! +!------------------------------------------------------------------------------- +! +! +!* 2. DIMENSIONAL DISTRIBUTIONS OF THE SPECIES +! ---------------------------------------- +! +! +!* 2.1 Ice, snow, graupel and hail distribution +! +! +XALPHAI = 3.0 ! Gamma law for the ice crystal volume +XNUI = 3.0 ! Gamma law with little dispersion +! +XALPHAS = 1.0 ! Exponential law +XNUS = 1.0 ! Exponential law +! +XALPHAG = 1.0 ! Exponential law +XNUG = 1.0 ! Exponential law +! +XALPHAH = 1.0 ! Gamma law +XNUH = 8.0 ! Gamma law with little dispersion +! +!* 2.2 Constants for shape parameter +! +XLBEXI = 1.0/XBI +XLBI = XAI*MOMG(XALPHAI,XNUI,XBI) +! +XLBEXS = 1.0/(XCXS-XBS) +XLBS = ( XAS*XCCS*MOMG(XALPHAS,XNUS,XBS) )**(-XLBEXS) +! +XLBEXG = 1.0/(XCXG-XBG) +XLBG = ( XAG*XCCG*MOMG(XALPHAG,XNUG,XBG))**(-XLBEXG) +! +XLBEXH = 1.0/(XCXH-XBH) +XLBH = ( XAH*XCCH*MOMG(XALPHAH,XNUH,XBH) )**(-XLBEXH) +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=ILUOUT0,FMT='(" Shape Parameters")') + WRITE(UNIT=ILUOUT0,FMT='(" XLBEXI =",E13.6," XLBI =",E13.6)') XLBEXI,XLBI + WRITE(UNIT=ILUOUT0,FMT='(" XLBEXS =",E13.6," XLBS =",E13.6)') XLBEXS,XLBS + WRITE(UNIT=ILUOUT0,FMT='(" XLBEXG =",E13.6," XLBG =",E13.6)') XLBEXG,XLBG + WRITE(UNIT=ILUOUT0,FMT='(" XLBEXH =",E13.6," XLBH =",E13.6)') XLBEXH,XLBH +END IF +! +XLBDAS_MAX = 500000 +XLBDAG_MAX = 100000.0 +! +ZCONC_MAX = 1.E6 ! Maximal concentration for falling particules set to 1 per cc +!XLBDAS_MAX = ( ZCONC_MAX/XCCS )**(1./XCXS) +!XLBDAG_MAX = ( ZCONC_MAX/XCCG )**(1./XCXG) +!XLBDAH_MAX = ( ZCONC_MAX/XCCH )**(1./XCXH) +! +!------------------------------------------------------------------------------- +! +! +!* 3. CONSTANTS FOR THE SEDIMENTATION +! ------------------------------- +! +! +!* 3.1 Exponent of the fall-speed air density correction +! +IKB = 1 + JPVEXT +! Correction +! ZRHO00 = XP00/(XRD*XTHVREFZ(IKB)) +ZRHO00 = 1.2041 ! at P=1013.25hPa and T=20°C +! +!* 3.2 Constants for sedimentation +! +!! XEXRSEDI = (XBI+XDI)/XBI +!! XEXCSEDI = 1.0-XEXRSEDI +!! XFSEDI = (4.*XPI*900.)**(-XEXCSEDI) * & +!! XC_I*XAI*MOMG(XALPHAI,XNUI,XBI+XDI) * & +!! ((XAI*MOMG(XALPHAI,XNUI,XBI)))**(-XEXRSEDI) * & +!! (ZRHO00)**XCEXVT +!! ! +!! ! Computations made for Columns +!! ! +!! XEXRSEDI = 1.9324 +!! XEXCSEDI =-0.9324 +!! XFSEDI = 3.89745E11*MOMG(XALPHAI,XNUI,3.285)* & +!! MOMG(XALPHAI,XNUI,1.7)**(-XEXRSEDI)*(ZRHO00)**XCEXVT +!! XEXCSEDI =-0.9324*3.0 +!! WRITE (ILUOUT0,FMT=*)' PRISTINE ICE SEDIMENTATION for columns XFSEDI=',XFSEDI +! +! +XFSEDRI = XC_I*GAMMA_X0D(XNUI+(XDI+XBI)/XALPHAI)/GAMMA_X0D(XNUI+XBI/XALPHAI)* & + (ZRHO00)**XCEXVT +XFSEDCI = XC_I*GAMMA_X0D(XNUI+XDI/XALPHAI)/GAMMA_X0D(XNUI)* & + (ZRHO00)**XCEXVT +! +XEXSEDS = (XBS+XDS-XCXS)/(XBS-XCXS) +XFSEDS = XCS*XAS*XCCS*MOMG(XALPHAS,XNUS,XBS+XDS)* & + (XAS*XCCS*MOMG(XALPHAS,XNUS,XBS))**(-XEXSEDS)*(ZRHO00)**XCEXVT +! +XEXSEDG = (XBG+XDG-XCXG)/(XBG-XCXG) +XFSEDG = XCG*XAG*XCCG*MOMG(XALPHAG,XNUG,XBG+XDG)* & + (XAG*XCCG*MOMG(XALPHAG,XNUG,XBG))**(-XEXSEDG)*(ZRHO00)**XCEXVT +! +XEXSEDH = (XBH+XDH-XCXH)/(XBH-XCXH) +XFSEDH = XCH*XAH*XCCH*MOMG(XALPHAH,XNUH,XBH+XDH)* & + (XAH*XCCH*MOMG(XALPHAH,XNUH,XBH))**(-XEXSEDH)*(ZRHO00)**XCEXVT +! +! +! +XLB(4) = XLBI +XLBEX(4) = XLBEXI +XD(4) = XDI +XFSEDR(4) = XFSEDRI +XFSEDC(4) = XFSEDCI +! +XLB(5) = XLBS +XLBEX(5) = XLBEXS +XD(5) = XDS +XFSEDR(5) = XCS*GAMMA_X0D(XNUS+(XDS+XBS)/XALPHAS)/GAMMA_X0D(XNUS+XBS/XALPHAS)* & + (ZRHO00)**XCEXVT +! +XLB(6) = XLBG +XLBEX(6) = XLBEXG +XD(6) = XDG +XFSEDR(6) = XCG*GAMMA_X0D(XNUG+(XDG+XBG)/XALPHAG)/GAMMA_X0D(XNUG+XBG/XALPHAG)* & + (ZRHO00)**XCEXVT +! +XLB(7) = XLBH +XLBEX(7) = XLBEXH +XD(7) = XDH +XFSEDR(7) = XCH*GAMMA_X0D(XNUH+(XDH+XBH)/XALPHAH)/GAMMA_X0D(XNUH+XBH/XALPHAH)* & + (ZRHO00)**XCEXVT +! +!------------------------------------------------------------------------------- +! +! +!* 4. CONSTANTS FOR HETEROGENEOUS NUCLEATION +! -------------------------------------- +! +! +! *************** +!* 4.1 LIMA_NUCLEATION +! *************** +!* 4.1.1 Constants for the computation of the number concentration +! of active IN +! +XRHO_CFDC = 0.76 +! +XGAMMA = 2. +! +IF (NPHILLIPS == 13) THEN + XAREA1(1) = 2.0E-6 !DM1 + XAREA1(2) = XAREA1(1) !DM2 + XAREA1(3) = 1.0E-7 !BC + XAREA1(4) = 8.9E-7 !BIO +ELSE IF (NPHILLIPS == 8) THEN + XAREA1(1) = 2.0E-6 !DM1 + XAREA1(2) = XAREA1(1) !DM2 + XAREA1(3) = 2.7E-7 !BC + XAREA1(4) = 9.1E-7 !BIO +ELSE + call Print_msg( NVERB_FATAL, 'GEN', 'INI_LIMA_COLD_MIXED', 'NPHILLIPS should be equal to 8 or 13' ) +END IF +! +!* 4.1.2 Constants for the computation of H_X (the fraction-redu- +! cing IN activity at low S_i and warm T) for X={DM1,DM2,BC,BIO} +! +! +IF (NPHILLIPS == 13) THEN + XDT0(1) = 5. +273.15 !DM1 + XDT0(2) = 5. +273.15 !DM2 + XDT0(3) = 10. +273.15 !BC + XDT0(4) = 5. +273.15 !BIOO +! + XT0(1) = -40. +273.15 !DM1 + XT0(2) = XT0(1) !DM2 + XT0(3) = -50. +273.15 !BC + XT0(4) = -20. +273.15 !BIO +! + XSW0 = 0.97 +! + XDSI0(1) = 0.1 !DM1 + XDSI0(2) = 0.1 !DM2 + XDSI0(3) = 0.1 !BC + XDSI0(4) = 0.2 !BIO +! + XH(1) = 0.15 !DM1 + XH(2) = 0.15 !DM2 + XH(3) = 0. !BC + XH(4) = 0. !O +! + XTX1(1) = -30. +273.15 !DM1 + XTX1(2) = XTX1(1) !DM2 + XTX1(3) = -25. +273.15 !BC + XTX1(4) = -5. +273.15 !BIO +! + XTX2(1) = -10. +273.15 !DM1 + XTX2(2) = XTX2(1) !DM2 + XTX2(3) = -15. +273.15 !BC + XTX2(4) = -2. +273.15 !BIO +ELSE IF (NPHILLIPS == 8) THEN + XDT0(1) = 5. +273.15 !DM1 + XDT0(2) = 5. +273.15 !DM2 + XDT0(3) = 5. +273.15 !BC + XDT0(4) = 5. +273.15 !O +! + XT0(1) = -40. +273.15 !DM1 + XT0(2) = XT0(1) !DM2 + XT0(3) = -50. +273.15 !BC + XT0(4) = -50. +273.15 !BIO +! + XSW0 = 0.97 +! + XDSI0(1) = 0.1 !DM1 + XDSI0(2) = 0.1 !DM2 + XDSI0(3) = 0.1 !BC + XDSI0(4) = 0.1 !BIO +! + XH(1) = 0.15 !DM1 + XH(2) = 0.15 !DM2 + XH(3) = 0. !BC + XH(4) = 0. !O +! + XTX1(1) = -5. +273.15 !DM1 + XTX1(2) = XTX1(1) !DM2 + XTX1(3) = -5. +273.15 !BC + XTX1(4) = -5. +273.15 !BIO +! + XTX2(1) = -2. +273.15 !DM1 + XTX2(2) = XTX2(1) !DM2 + XTX2(3) = -2. +273.15 !BC + XTX2(4) = -2. +273.15 !BIO +END IF +! +!* 4.1.3 Constants for the computation of the Gauss Hermitte +! quadrature method used for the integration of the total +! crystal number over T>-35°C +! +NDIAM = 70 +! +ALLOCATE(XABSCISS(NDIAM)) +ALLOCATE(XWEIGHT (NDIAM)) +! +CALL GAUHER(XABSCISS, XWEIGHT, NDIAM) +! +! ***************** +!* 4.2 MEYERS NUCLEATION +! ***************** +! +ZFACT_NUCL = 1.0 ! Plates, Columns and Bullet rosettes +! +!* 5.2.1 Constants for nucleation from ice nuclei +! +XNUC_DEP = XFACTNUC_DEP*1000.*ZFACT_NUCL +XEXSI_DEP = 12.96E-2 +XEX_DEP = -0.639 +! +XNUC_CON = XFACTNUC_CON*1000.*ZFACT_NUCL +XEXTT_CON = -0.262 +XEX_CON = -2.8 +! +XMNU0 = 6.88E-13 +! +IF (LMEYERS) THEN + WRITE(UNIT=ILUOUT0,FMT='(" Heterogeneous nucleation")') + WRITE(UNIT=ILUOUT0,FMT='(" XNUC_DEP=",E13.6," XEXSI=",E13.6," XEX=",E13.6)') & + XNUC_DEP,XEXSI_DEP,XEX_DEP + WRITE(UNIT=ILUOUT0,FMT='(" XNUC_CON=",E13.6," XEXTT=",E13.6," XEX=",E13.6)') & + XNUC_CON,XEXTT_CON,XEX_CON + WRITE(UNIT=ILUOUT0,FMT='(" mass of embryo XMNU0=",E13.6)') XMNU0 +END IF +! +!------------------------------------------------------------------------------- +! +! +!* 5. CONSTANTS FOR THE SLOW COLD PROCESSES +! ------------------------------------- +! +! +!* 5.1.2 Constants for homogeneous nucleation from haze particules +! +XRHOI_HONH = 925.0 +XCEXP_DIFVAP_HONH = 1.94 +XCOEF_DIFVAP_HONH = (2.0*XPI)*0.211E-4*XP00/XTT**XCEXP_DIFVAP_HONH +XCRITSAT1_HONH = 2.583 +XCRITSAT2_HONH = 207.83 +XTMIN_HONH = 180.0 +XTMAX_HONH = 240.0 +XDLNJODT1_HONH = 4.37 +XDLNJODT2_HONH = 0.03 +XC1_HONH = 100.0 +XC2_HONH = 22.6 +XC3_HONH = 0.1 +XRCOEF_HONH = (XPI/6.0)*XRHOI_HONH +! +! +!* 5.1.3 Constants for homogeneous nucleation from cloud droplets +! +XTEXP1_HONC = -606.3952*LOG(10.0) +XTEXP2_HONC = -52.6611*LOG(10.0) +XTEXP3_HONC = -1.7439*LOG(10.0) +XTEXP4_HONC = -0.0265*LOG(10.0) +XTEXP5_HONC = -1.536E-4*LOG(10.0) +IF (XALPHAC == 3.0) THEN + XC_HONC = XPI/6.0 + XR_HONC = XPI/6.0 +ELSE + write ( yval, '( E13.6 )' ) xalphac + call Print_msg( NVERB_FATAL, 'GEN', 'INI_LIMA_COLD_MIXED', 'homogeneous nucleation: XALPHAC='//trim(yval)// & + '/= 3. No algorithm developed for this case' ) +END IF +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=ILUOUT0,FMT='(" Homogeneous nucleation")') + WRITE(UNIT=ILUOUT0,FMT='(" XTEXP1_HONC=",E13.6)') XTEXP1_HONC + WRITE(UNIT=ILUOUT0,FMT='(" XTEXP2_HONC=",E13.6)') XTEXP2_HONC + WRITE(UNIT=ILUOUT0,FMT='(" XTEXP3_HONC=",E13.6)') XTEXP3_HONC + WRITE(UNIT=ILUOUT0,FMT='(" XTEXP4_HONC=",E13.6)') XTEXP4_HONC + WRITE(UNIT=ILUOUT0,FMT='(" XTEXP5_HONC=",E13.6)') XTEXP5_HONC + WRITE(UNIT=ILUOUT0,FMT='("XC_HONC=",E13.6," XR_HONC=",E13.6)') XC_HONC,XR_HONC +END IF +! +! +!* 5.2 Constants for vapor deposition on ice +! +XSCFAC = (0.63**(1./3.))*SQRT((ZRHO00)**XCEXVT) ! One assumes Sc=0.63 +! +X0DEPI = (4.0*XPI)*XC1I*XF0I*MOMG(XALPHAI,XNUI,1.) +X2DEPI = (4.0*XPI)*XC1I*XF2I*XC_I*MOMG(XALPHAI,XNUI,XDI+2.0) +! +! Harrington parameterization for ice to snow conversion +! +XDICNVS_LIM = 125.E-6 ! size in microns +XLBDAICNVS_LIM = (50.0**(1.0/(XALPHAI)))/XDICNVS_LIM ! ZLBDAI Limitation +XC0DEPIS = ((4.0*XPI)/(XAI*XBI))*XC1I*XF0IS* & + (XALPHAI/GAMMA_X0D(XNUI))*XDICNVS_LIM**(1.0-XBI) +XC1DEPIS = ((4.0*XPI)/(XAI*XBI))*XC1I*XF1IS*SQRT(XC_I)* & + (XALPHAI/GAMMA_X0D(XNUI))*XDICNVS_LIM**(1.0-XBI+(XDI+1.0)/2.0) +XR0DEPIS = XC0DEPIS *(XAI*XDICNVS_LIM**XBI) +XR1DEPIS = XC1DEPIS *(XAI*XDICNVS_LIM**XBI) +! +! Harrington parameterization for snow to ice conversion +! +XLBDASCNVI_MAX = 6000. ! lbdas max after Field (1999) +! +XDSCNVI_LIM = 125.E-6 ! size in microns +XLBDASCNVI_LIM = (50.0**(1.0/(XALPHAS)))/XDSCNVI_LIM ! ZLBDAS Limitation +XC0DEPSI = ((4.0*XPI)/(XAS*XBS))*XC1S*XF0IS* & + (XALPHAS/GAMMA_X0D(XNUS))*XDSCNVI_LIM**(1.0-XBS) +XC1DEPSI = ((4.0*XPI)/(XAS*XBS))*XC1S*XF1IS*SQRT(XCS)* & + (XALPHAS/GAMMA_X0D(XNUS))*XDSCNVI_LIM**(1.0-XBS+(XDS+1.0)/2.0) +XR0DEPSI = XC0DEPSI *(XAS*XDSCNVI_LIM**XBS) +XR1DEPSI = XC1DEPSI *(XAS*XDSCNVI_LIM**XBS) +! +! Vapor deposition on snow and graupel and hail +! +X0DEPS = (4.0*XPI)*XCCS*XC1S*XF0S*MOMG(XALPHAS,XNUS,1.) +X1DEPS = (4.0*XPI)*XCCS*XC1S*XF1S*SQRT(XCS)*MOMG(XALPHAS,XNUS,0.5*XDS+1.5) +XEX0DEPS = XCXS-1.0 +XEX1DEPS = XCXS-0.5*(XDS+3.0) +! +X0DEPG = (4.0*XPI)*XCCG*XC1G*XF0G*MOMG(XALPHAG,XNUG,1.) +X1DEPG = (4.0*XPI)*XCCG*XC1G*XF1G*SQRT(XCG)*MOMG(XALPHAG,XNUG,0.5*XDG+1.5) +XEX0DEPG = XCXG-1.0 +XEX1DEPG = XCXG-0.5*(XDG+3.0) +! +X0DEPH = (4.0*XPI)*XCCH*XC1H*XF0H*MOMG(XALPHAH,XNUH,1.) +X1DEPH = (4.0*XPI)*XCCH*XC1H*XF1H*SQRT(XCH)*MOMG(XALPHAH,XNUH,0.5*XDH+1.5) +XEX0DEPH = XCXH-1.0 +XEX1DEPH = XCXH-0.5*(XDH+3.0) +! +!------------------------------------------------------------------------------- +! +! +!* 6. CONSTANTS FOR THE COALESCENCE PROCESSES +! --------------------------------------- +! +! +!* 6.0 Precalculation of the gamma function momentum +! +ZGAMI(1) = GAMMA_X0D(XNUI) +ZGAMI(2) = MOMG(XALPHAI,XNUI,3.) +ZGAMI(3) = MOMG(XALPHAI,XNUI,6.) +ZGAMI(4) = ZGAMI(3)-ZGAMI(2)**2 ! useful for Sig_I +ZGAMI(5) = MOMG(XALPHAI,XNUI,9.) +ZGAMI(6) = MOMG(XALPHAI,XNUI,3.+XBI) +ZGAMI(7) = MOMG(XALPHAI,XNUI,XBI) +ZGAMI(8) = MOMG(XALPHAI,XNUI,3.)/MOMG(XALPHAI,XNUI,2.) +! +ZGAMS(1) = GAMMA_X0D(XNUS) +ZGAMS(2) = MOMG(XALPHAS,XNUS,3.) +! +! +!* 6.1 Csts for the coalescence processes +! +ZFAC_ZRNIC = 0.1 +XKER_ZRNIC_A1 = 2.59E15*ZFAC_ZRNIC**2! From Long a1=9.44E9 cm-3 + ! so XKERA1= 9.44E9*1E6*(PI/6)**2 +XKER_ZRNIC_A2 = 3.03E3*ZFAC_ZRNIC ! From Long a2=5.78E3 + ! so XKERA2= 5.78E3* (PI/6) +! +! +!* 6.2 Csts for the pristine ice selfcollection process +! +XSELFI = XKER_ZRNIC_A1*ZGAMI(3) +XCOLEXII = 0.025 ! Temperature factor of the I+I collection efficiency +! +! +!* 6.3 Constants for pristine ice autoconversion +! +XTEXAUTI = 0.025 ! Temperature factor of the I+I collection efficiency +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=ILUOUT0,FMT='(" pristine ice autoconversion")') + WRITE(UNIT=ILUOUT0,FMT='(" Temp. factor XTEXAUTI=",E13.6)') XTEXAUTI +END IF +! +XAUTO3 = 6.25E18*(ZGAMI(2))**(1./3.)*SQRT(ZGAMI(4)) +XAUTO4 = 0.5E6*(ZGAMI(4))**(1./6.) +XLAUTS = 2.7E-2 +XLAUTS_THRESHOLD = 0.4 +XITAUTS= 0.27 ! (Notice that T2 of BR74 is uncorrect and that 0.27=1./3.7 +XITAUTS_THRESHOLD = 7.5 +! +! +!* 6.4 Constants for snow aggregation +! +XCOLEXIS = 0.05 ! Temperature factor of the I+S collection efficiency +XAGGS_CLARGE1 = XKER_ZRNIC_A2*ZGAMI(2) +XAGGS_CLARGE2 = XKER_ZRNIC_A2*ZGAMS(2) +XAGGS_RLARGE1 = XKER_ZRNIC_A2*ZGAMI(6)*XAI +XAGGS_RLARGE2 = XKER_ZRNIC_A2*ZGAMI(7)*ZGAMS(2)*XAI +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=ILUOUT0,FMT='(" snow aggregation")') + WRITE(UNIT=ILUOUT0,FMT='(" Temp. factor XCOLEXIS=",E13.6)') XCOLEXIS +END IF +! +!------------------------------------------------------------------------------- +! +! +!* 7. CONSTANTS FOR THE FAST COLD PROCESSES FOR THE AGGREGATES +! -------------------------------------------------------- +! +! +!* 7.1 Constants for the riming of the aggregates +! +XDCSLIM = 0.007 ! D_cs^lim = 7 mm as suggested by Farley et al. (1989) +XCOLCS = 1.0 +XEXCRIMSS= XCXS-XDS-2.0 +XCRIMSS = (XPI/4.0)*XCOLCS*XCCS*XCS*(ZRHO00**XCEXVT)*MOMG(XALPHAS,XNUS,XDS+2.0) +XEXCRIMSG= XEXCRIMSS +XCRIMSG = XCRIMSS +XSRIMCG = XCCS*XAS*MOMG(XALPHAS,XNUS,XBS) +XEXSRIMCG= XCXS-XBS +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=ILUOUT0,FMT='(" riming of the aggregates")') + WRITE(UNIT=ILUOUT0,FMT='(" D_cs^lim (Farley et al.) XDCSLIM=",E13.6)') XDCSLIM + WRITE(UNIT=ILUOUT0,FMT='(" Coll. efficiency XCOLCS=",E13.6)') XCOLCS +END IF +! +NGAMINC = 80 +XGAMINC_BOUND_MIN = 1.0E-1 ! Minimal value of (Lbda * D_cs^lim)**alpha +XGAMINC_BOUND_MAX = 1.0E7 ! Maximal value of (Lbda * D_cs^lim)**alpha +ZRATE = EXP(LOG(XGAMINC_BOUND_MAX/XGAMINC_BOUND_MIN)/REAL(NGAMINC-1)) +! +ALLOCATE( XGAMINC_RIM1(NGAMINC) ) +ALLOCATE( XGAMINC_RIM2(NGAMINC) ) +! +DO J1=1,NGAMINC + ZBOUND = XGAMINC_BOUND_MIN*ZRATE**(J1-1) + XGAMINC_RIM1(J1) = GAMMA_INC(XNUS+(2.0+XDS)/XALPHAS,ZBOUND) + XGAMINC_RIM2(J1) = GAMMA_INC(XNUS+XBS/XALPHAS ,ZBOUND) +END DO +! +XRIMINTP1 = XALPHAS / LOG(ZRATE) +XRIMINTP2 = 1.0 + XRIMINTP1*LOG( XDCSLIM/(XGAMINC_BOUND_MIN)**(1.0/XALPHAS) ) +! +!* 7.1.1 Defining the constants for the Hallett-Mossop +! secondary ice nucleation process +! +XHMTMIN = XTT - 8.0 +XHMTMAX = XTT - 3.0 +XHM1 = 9.3E-3 ! Obsolete parameterization +XHM2 = 1.5E-3/LOG(10.0) ! from Ferrier (1995) +XHM_YIELD = 5.E-3 ! A splinter is produced after the riming of 200 droplets +XHM_COLLCS= 1.0 ! Collision efficiency snow/droplet (with Dc>25 microns) +XHM_FACTS = XHM_YIELD*(XHM_COLLCS/XCOLCS) +! +! Notice: One magnitude of lambda discretized over 10 points for the droplets +! +XGAMINC_HMC_BOUND_MIN = 1.0E-3 ! Min value of (Lbda * (12,25) microns)**alpha +XGAMINC_HMC_BOUND_MAX = 1.0E5 ! Max value of (Lbda * (12,25) microns)**alpha +ZRATE = EXP(LOG(XGAMINC_HMC_BOUND_MAX/XGAMINC_HMC_BOUND_MIN)/REAL(NGAMINC-1)) +! +ALLOCATE( XGAMINC_HMC(NGAMINC) ) +! +DO J1=1,NGAMINC + ZBOUND = XGAMINC_HMC_BOUND_MIN*ZRATE**(J1-1) + XGAMINC_HMC(J1) = GAMMA_INC(XNUC,ZBOUND) +END DO +! +XHMSINTP1 = XALPHAC / LOG(ZRATE) +XHMSINTP2 = 1.0 + XHMSINTP1*LOG( 12.E-6/(XGAMINC_HMC_BOUND_MIN)**(1.0/XALPHAC) ) +XHMLINTP1 = XALPHAC / LOG(ZRATE) +XHMLINTP2 = 1.0 + XHMLINTP1*LOG( 25.E-6/(XGAMINC_HMC_BOUND_MIN)**(1.0/XALPHAC) ) +! +! +!* 7.2 Constants for the accretion of raindrops onto aggregates +! +XFRACCSS = ((XPI**2)/24.0)*XCCS*XRHOLW*(ZRHO00**XCEXVT) +! +XLBRACCS1 = MOMG(XALPHAS,XNUS,2.)*MOMG(XALPHAR,XNUR,3.) +XLBRACCS2 = 2.*MOMG(XALPHAS,XNUS,1.)*MOMG(XALPHAR,XNUR,4.) +XLBRACCS3 = MOMG(XALPHAR,XNUR,5.) +! +XFSACCRG = (XPI/4.0)*XAS*XCCS*(ZRHO00**XCEXVT) +! +XLBSACCR1 = MOMG(XALPHAR,XNUR,2.)*MOMG(XALPHAS,XNUS,XBS) +XLBSACCR2 = 2.*MOMG(XALPHAR,XNUR,1.)*MOMG(XALPHAS,XNUS,XBS+1.) +XLBSACCR3 = MOMG(XALPHAS,XNUS,XBS+2.) +! +!* 7.2.1 Defining the ranges for the computation of the kernels +! +! Notice: One magnitude of lambda discretized over 10 points for rain +! Notice: One magnitude of lambda discretized over 10 points for snow +! +NACCLBDAS = 40 +XACCLBDAS_MIN = 5.0E1 ! Minimal value of Lbda_s to tabulate XKER_RACCS +XACCLBDAS_MAX = 5.0E5 ! Maximal value of Lbda_s to tabulate XKER_RACCS +ZRATE = LOG(XACCLBDAS_MAX/XACCLBDAS_MIN)/REAL(NACCLBDAS-1) +XACCINTP1S = 1.0 / ZRATE +XACCINTP2S = 1.0 - LOG( XACCLBDAS_MIN ) / ZRATE +NACCLBDAR = 40 +XACCLBDAR_MIN = 1.0E3 ! Minimal value of Lbda_r to tabulate XKER_RACCS +XACCLBDAR_MAX = 1.0E7 ! Maximal value of Lbda_r to tabulate XKER_RACCS +ZRATE = LOG(XACCLBDAR_MAX/XACCLBDAR_MIN)/REAL(NACCLBDAR-1) +XACCINTP1R = 1.0 / ZRATE +XACCINTP2R = 1.0 - LOG( XACCLBDAR_MIN ) / ZRATE +! +!* 7.2.2 Computations of the tabulated normalized kernels +! +IND = 50 ! Interval number, collection efficiency and infinite diameter +ZESR = 1.0 ! factor used to integrate the dimensional distributions when +ZFDINFTY = 20.0 ! computing the kernels XKER_RACCSS, XKER_RACCS and XKER_SACCRG +! +ALLOCATE( XKER_RACCSS(NACCLBDAS,NACCLBDAR) ) +ALLOCATE( XKER_RACCS (NACCLBDAS,NACCLBDAR) ) +ALLOCATE( XKER_SACCRG(NACCLBDAR,NACCLBDAS) ) +! +CALL LIMA_READ_XKER_RACCS (KACCLBDAS,KACCLBDAR,KND, & + PALPHAS,PNUS,PALPHAR,PNUR,PESR,PBS,PBR,PCS,PDS,PCR,PDR, & + PACCLBDAS_MAX,PACCLBDAR_MAX,PACCLBDAS_MIN,PACCLBDAR_MIN,& + PFDINFTY ) +IF( (KACCLBDAS/=NACCLBDAS) .OR. (KACCLBDAR/=NACCLBDAR) .OR. (KND/=IND) .OR. & + (PALPHAS/=XALPHAS) .OR. (PNUS/=XNUS) .OR. & + (PALPHAR/=XALPHAR) .OR. (PNUR/=XNUR) .OR. & + (PESR/=ZESR) .OR. (PBS/=XBS) .OR. (PBR/=XBR) .OR. & + (PCS/=XCS) .OR. (PDS/=XDS) .OR. (PCR/=XCR) .OR. (PDR/=XDR) .OR. & + (PACCLBDAS_MAX/=XACCLBDAS_MAX) .OR. (PACCLBDAR_MAX/=XACCLBDAR_MAX) .OR. & + (PACCLBDAS_MIN/=XACCLBDAS_MIN) .OR. (PACCLBDAR_MIN/=XACCLBDAR_MIN) .OR. & + (PFDINFTY/=ZFDINFTY) ) THEN + CALL RRCOLSS ( IND, XALPHAS, XNUS, XALPHAR, XNUR, & + ZESR, XBR, XCS, XDS, XCR, XDR, & + XACCLBDAS_MAX, XACCLBDAR_MAX, XACCLBDAS_MIN, XACCLBDAR_MIN, & + ZFDINFTY, XKER_RACCSS, XAG, XBS, XAS ) + CALL RZCOLX ( IND, XALPHAS, XNUS, XALPHAR, XNUR, & + ZESR, XBR, XCS, XDS, XCR, XDR, & + XACCLBDAS_MAX, XACCLBDAR_MAX, XACCLBDAS_MIN, XACCLBDAR_MIN, & + ZFDINFTY, XKER_RACCS ) + CALL RSCOLRG ( IND, XALPHAS, XNUS, XALPHAR, XNUR, & + ZESR, XBS, XCS, XDS, XCR, XDR, & + XACCLBDAS_MAX, XACCLBDAR_MAX, XACCLBDAS_MIN, XACCLBDAR_MIN, & + ZFDINFTY, XKER_SACCRG,XAG, XBS, XAS ) + WRITE(UNIT=ILUOUT0,FMT='("*****************************************")') + WRITE(UNIT=ILUOUT0,FMT='("**** UPDATE NEW SET OF RACSS KERNELS ****")') + WRITE(UNIT=ILUOUT0,FMT='("**** UPDATE NEW SET OF RACS KERNELS ****")') + WRITE(UNIT=ILUOUT0,FMT='("**** UPDATE NEW SET OF SACRG KERNELS ****")') + WRITE(UNIT=ILUOUT0,FMT='("*****************************************")') + WRITE(UNIT=ILUOUT0,FMT='("!")') + WRITE(UNIT=ILUOUT0,FMT='("KND=",I3)') IND + WRITE(UNIT=ILUOUT0,FMT='("KACCLBDAS=",I3)') NACCLBDAS + WRITE(UNIT=ILUOUT0,FMT='("KACCLBDAR=",I3)') NACCLBDAR + WRITE(UNIT=ILUOUT0,FMT='("PALPHAS=",E13.6)') XALPHAS + WRITE(UNIT=ILUOUT0,FMT='("PNUS=",E13.6)') XNUS + WRITE(UNIT=ILUOUT0,FMT='("PALPHAR=",E13.6)') XALPHAR + WRITE(UNIT=ILUOUT0,FMT='("PNUR=",E13.6)') XNUR + WRITE(UNIT=ILUOUT0,FMT='("PESR=",E13.6)') ZESR + WRITE(UNIT=ILUOUT0,FMT='("PBS=",E13.6)') XBS + WRITE(UNIT=ILUOUT0,FMT='("PBR=",E13.6)') XBR + WRITE(UNIT=ILUOUT0,FMT='("PCS=",E13.6)') XCS + WRITE(UNIT=ILUOUT0,FMT='("PDS=",E13.6)') XDS + WRITE(UNIT=ILUOUT0,FMT='("PCR=",E13.6)') XCR + WRITE(UNIT=ILUOUT0,FMT='("PDR=",E13.6)') XDR + WRITE(UNIT=ILUOUT0,FMT='("PACCLBDAS_MAX=",E13.6)') & + XACCLBDAS_MAX + WRITE(UNIT=ILUOUT0,FMT='("PACCLBDAR_MAX=",E13.6)') & + XACCLBDAR_MAX + WRITE(UNIT=ILUOUT0,FMT='("PACCLBDAS_MIN=",E13.6)') & + XACCLBDAS_MIN + WRITE(UNIT=ILUOUT0,FMT='("PACCLBDAR_MIN=",E13.6)') & + XACCLBDAR_MIN + WRITE(UNIT=ILUOUT0,FMT='("PFDINFTY=",E13.6)') ZFDINFTY + WRITE(UNIT=ILUOUT0,FMT='("!")') + WRITE(UNIT=ILUOUT0,FMT='("IF( PRESENT(PKER_RACCSS) ) THEN")') + DO J1 = 1 , NACCLBDAS + DO J2 = 1 , NACCLBDAR + WRITE(UNIT=ILUOUT0,FMT='(" PKER_RACCSS(",I3,",",I3,") = ",E13.6)') & + J1,J2,XKER_RACCSS(J1,J2) + END DO + END DO + WRITE(UNIT=ILUOUT0,FMT='("END IF")') + WRITE(UNIT=ILUOUT0,FMT='("!")') + WRITE(UNIT=ILUOUT0,FMT='("IF( PRESENT(PKER_RACCS ) ) THEN")') + DO J1 = 1 , NACCLBDAS + DO J2 = 1 , NACCLBDAR + WRITE(UNIT=ILUOUT0,FMT='(" PKER_RACCS (",I3,",",I3,") = ",E13.6)') & + J1,J2,XKER_RACCS (J1,J2) + END DO + END DO + WRITE(UNIT=ILUOUT0,FMT='("END IF")') + WRITE(UNIT=ILUOUT0,FMT='("!")') + WRITE(UNIT=ILUOUT0,FMT='("IF( PRESENT(PKER_SACCRG) ) THEN")') + DO J1 = 1 , NACCLBDAR + DO J2 = 1 , NACCLBDAS + WRITE(UNIT=ILUOUT0,FMT='(" PKER_SACCRG(",I3,",",I3,") = ",E13.6)') & + J1,J2,XKER_SACCRG(J1,J2) + END DO + END DO + WRITE(UNIT=ILUOUT0,FMT='("END IF")') + ELSE + CALL LIMA_READ_XKER_RACCS (KACCLBDAS,KACCLBDAR,KND, & + PALPHAS,PNUS,PALPHAR,PNUR,PESR,PBS,PBR,PCS,PDS,PCR,PDR, & + PACCLBDAS_MAX,PACCLBDAR_MAX,PACCLBDAS_MIN,PACCLBDAR_MIN,& + PFDINFTY,XKER_RACCSS,XKER_RACCS,XKER_SACCRG ) + WRITE(UNIT=ILUOUT0,FMT='(" Read XKER_RACCSS")') + WRITE(UNIT=ILUOUT0,FMT='(" Read XKER_RACCS ")') + WRITE(UNIT=ILUOUT0,FMT='(" Read XKER_SACCRG")') +END IF +! +! +!* 7.3 Constant for the conversion-melting rate +! +XFSCVMG = 2.0 +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=ILUOUT0,FMT='(" conversion-melting of the aggregates")') + WRITE(UNIT=ILUOUT0,FMT='(" Conv. factor XFSCVMG=",E13.6)') XFSCVMG +END IF +! +!------------------------------------------------------------------------------- +! +! +!* 8. CONSTANTS FOR THE FAST COLD PROCESSES FOR THE GRAUPELN +! -------------------------------------------------------- +! +! +!* 8.1 Constants for the rain contact freezing +! +XCOLIR = 1.0 +! +! values of these coeficients differ from the single-momemt rain_ice case +! +XEXRCFRI = -XDR-5.0 +XRCFRI = ((XPI**2)/24.0)*XRHOLW*XCOLIR*XCR*(ZRHO00**XCEXVT) & + *MOMG(XALPHAR,XNUR,XDR+5.0) +XEXICFRR = -XDR-2.0 +XICFRR = (XPI/4.0)*XCOLIR*XCR*(ZRHO00**XCEXVT) & + *MOMG(XALPHAR,XNUR,XDR+2.0) +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=ILUOUT0,FMT='(" rain contact freezing")') + WRITE(UNIT=ILUOUT0,FMT='(" Coll. efficiency XCOLIR=",E13.6)') XCOLIR +END IF +! +! +!* 8.2 Constants for the dry growth of the graupeln +! +!* 8.2.1 Constants for the cloud droplet collection by the graupeln +! and for the Hallett-Mossop process +! +XCOLCG = 0.6 ! Estimated from Cober and List (1993) +XFCDRYG = (XPI/4.0)*XCOLCG*XCCG*XCG*(ZRHO00**XCEXVT)*MOMG(XALPHAG,XNUG,XDG+2.0) +! +XHM_COLLCG= 0.9 ! Collision efficiency graupel/droplet (with Dc>25 microns) +XHM_FACTG = XHM_YIELD*(XHM_COLLCG/XCOLCG) +! +!* 8.2.2 Constants for the cloud ice collection by the graupeln +! +XCOLIG = 0.25 ! Collection efficiency of I+G +XCOLEXIG = 0.05 ! Temperature factor of the I+G collection efficiency +XCOLIG = 0.01 ! Collection efficiency of I+G +XCOLEXIG = 0.1 ! Temperature factor of the I+G collection efficiency +WRITE (ILUOUT0, FMT=*) ' NEW Constants for the cloud ice collection by the graupeln' +WRITE (ILUOUT0, FMT=*) ' XCOLIG, XCOLEXIG = ',XCOLIG,XCOLEXIG +XFIDRYG = (XPI/4.0)*XCOLIG*XCCG*XCG*(ZRHO00**XCEXVT)*MOMG(XALPHAG,XNUG,XDG+2.0) +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=ILUOUT0,FMT='(" cloud ice collection by the graupeln")') + WRITE(UNIT=ILUOUT0,FMT='(" Coll. efficiency XCOLIG=",E13.6)') XCOLIG + WRITE(UNIT=ILUOUT0,FMT='(" Temp. factor XCOLEXIG=",E13.6)') XCOLEXIG +END IF +! +!* 8.2.3 Constants for the aggregate collection by the graupeln +! +XCOLSG = 0.25 ! Collection efficiency of S+G +XCOLEXSG = 0.05 ! Temperature factor of the S+G collection efficiency +XCOLSG = 0.01 ! Collection efficiency of S+G +XCOLEXSG = 0.1 ! Temperature factor of the S+G collection efficiency +WRITE (ILUOUT0, FMT=*) ' NEW Constants for the aggregate collection by the graupeln' +WRITE (ILUOUT0, FMT=*) ' XCOLSG, XCOLEXSG = ',XCOLSG,XCOLEXSG +XFSDRYG = (XPI/4.0)*XCOLSG*XCCG*XCCS*XAS*(ZRHO00**XCEXVT) +! +XLBSDRYG1 = MOMG(XALPHAG,XNUG,2.)*MOMG(XALPHAS,XNUS,XBS) +XLBSDRYG2 = 2.*MOMG(XALPHAG,XNUG,1.)*MOMG(XALPHAS,XNUS,XBS+1.) +XLBSDRYG3 = MOMG(XALPHAS,XNUS,XBS+2.) +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=ILUOUT0,FMT='(" aggregate collection by the graupeln")') + WRITE(UNIT=ILUOUT0,FMT='(" Coll. efficiency XCOLSG=",E13.6)') XCOLSG + WRITE(UNIT=ILUOUT0,FMT='(" Temp. factor XCOLEXSG=",E13.6)') XCOLEXSG +END IF +! +!* 8.2.4 Constants for the raindrop collection by the graupeln +! +XFRDRYG = ((XPI**2)/24.0)*XCCG*XRHOLW*(ZRHO00**XCEXVT) +! +XLBRDRYG1 = MOMG(XALPHAG,XNUG,2.)*MOMG(XALPHAR,XNUR,3.) +XLBRDRYG2 = 2.*MOMG(XALPHAG,XNUG,1.)*MOMG(XALPHAR,XNUR,4.) +XLBRDRYG3 = MOMG(XALPHAR,XNUR,5.) +! +! Notice: One magnitude of lambda discretized over 10 points +! +NDRYLBDAR = 40 +XDRYLBDAR_MIN = 1.0E3 ! Minimal value of Lbda_r to tabulate XKER_RDRYG +XDRYLBDAR_MAX = 1.0E7 ! Maximal value of Lbda_r to tabulate XKER_RDRYG +ZRATE = LOG(XDRYLBDAR_MAX/XDRYLBDAR_MIN)/REAL(NDRYLBDAR-1) +XDRYINTP1R = 1.0 / ZRATE +XDRYINTP2R = 1.0 - LOG( XDRYLBDAR_MIN ) / ZRATE +NDRYLBDAS = 80 +XDRYLBDAS_MIN = 2.5E1 ! Minimal value of Lbda_s to tabulate XKER_SDRYG +XDRYLBDAS_MAX = 2.5E9 ! Maximal value of Lbda_s to tabulate XKER_SDRYG +ZRATE = LOG(XDRYLBDAS_MAX/XDRYLBDAS_MIN)/REAL(NDRYLBDAS-1) +XDRYINTP1S = 1.0 / ZRATE +XDRYINTP2S = 1.0 - LOG( XDRYLBDAS_MIN ) / ZRATE +NDRYLBDAG = 40 +XDRYLBDAG_MIN = 1.0E3 ! Min value of Lbda_g to tabulate XKER_SDRYG,XKER_RDRYG +XDRYLBDAG_MAX = 1.0E7 ! Max value of Lbda_g to tabulate XKER_SDRYG,XKER_RDRYG +ZRATE = LOG(XDRYLBDAG_MAX/XDRYLBDAG_MIN)/REAL(NDRYLBDAG-1) +XDRYINTP1G = 1.0 / ZRATE +XDRYINTP2G = 1.0 - LOG( XDRYLBDAG_MIN ) / ZRATE +! +!* 8.2.5 Computations of the tabulated normalized kernels +! +IND = 50 ! Interval number, collection efficiency and infinite diameter +ZEGS = 1.0 ! factor used to integrate the dimensional distributions when +ZFDINFTY = 20.0 ! computing the kernels XKER_SDRYG +! +ALLOCATE( XKER_SDRYG(NDRYLBDAG,NDRYLBDAS) ) +! +CALL LIMA_READ_XKER_SDRYG (KDRYLBDAG,KDRYLBDAS,KND, & + PALPHAG,PNUG,PALPHAS,PNUS,PEGS,PBS,PCG,PDG,PCS,PDS, & + PDRYLBDAG_MAX,PDRYLBDAS_MAX,PDRYLBDAG_MIN,PDRYLBDAS_MIN, & + PFDINFTY ) +IF( (KDRYLBDAG/=NDRYLBDAG) .OR. (KDRYLBDAS/=NDRYLBDAS) .OR. (KND/=IND) .OR. & + (PALPHAG/=XALPHAG) .OR. (PNUG/=XNUG) .OR. & + (PALPHAS/=XALPHAS) .OR. (PNUS/=XNUS) .OR. & + (PEGS/=ZEGS) .OR. (PBS/=XBS) .OR. & + (PCG/=XCG) .OR. (PDG/=XDG) .OR. (PCS/=XCS) .OR. (PDS/=XDS) .OR. & + (PDRYLBDAG_MAX/=XDRYLBDAG_MAX) .OR. (PDRYLBDAS_MAX/=XDRYLBDAS_MAX) .OR. & + (PDRYLBDAG_MIN/=XDRYLBDAG_MIN) .OR. (PDRYLBDAS_MIN/=XDRYLBDAS_MIN) .OR. & + (PFDINFTY/=ZFDINFTY) ) THEN + CALL RZCOLX ( IND, XALPHAG, XNUG, XALPHAS, XNUS, & + ZEGS, XBS, XCG, XDG, XCS, XDS, & + XDRYLBDAG_MAX, XDRYLBDAS_MAX, XDRYLBDAG_MIN, XDRYLBDAS_MIN, & + ZFDINFTY, XKER_SDRYG ) + WRITE(UNIT=ILUOUT0,FMT='("*****************************************")') + WRITE(UNIT=ILUOUT0,FMT='("**** UPDATE NEW SET OF SDRYG KERNELS ****")') + WRITE(UNIT=ILUOUT0,FMT='("*****************************************")') + WRITE(UNIT=ILUOUT0,FMT='("!")') + WRITE(UNIT=ILUOUT0,FMT='("KND=",I3)') IND + WRITE(UNIT=ILUOUT0,FMT='("KDRYLBDAG=",I3)') NDRYLBDAG + WRITE(UNIT=ILUOUT0,FMT='("KDRYLBDAS=",I3)') NDRYLBDAS + WRITE(UNIT=ILUOUT0,FMT='("PALPHAG=",E13.6)') XALPHAG + WRITE(UNIT=ILUOUT0,FMT='("PNUG=",E13.6)') XNUG + WRITE(UNIT=ILUOUT0,FMT='("PALPHAS=",E13.6)') XALPHAS + WRITE(UNIT=ILUOUT0,FMT='("PNUS=",E13.6)') XNUS + WRITE(UNIT=ILUOUT0,FMT='("PEGS=",E13.6)') ZEGS + WRITE(UNIT=ILUOUT0,FMT='("PBS=",E13.6)') XBS + WRITE(UNIT=ILUOUT0,FMT='("PCG=",E13.6)') XCG + WRITE(UNIT=ILUOUT0,FMT='("PDG=",E13.6)') XDG + WRITE(UNIT=ILUOUT0,FMT='("PCS=",E13.6)') XCS + WRITE(UNIT=ILUOUT0,FMT='("PDS=",E13.6)') XDS + WRITE(UNIT=ILUOUT0,FMT='("PDRYLBDAG_MAX=",E13.6)') & + XDRYLBDAG_MAX + WRITE(UNIT=ILUOUT0,FMT='("PDRYLBDAS_MAX=",E13.6)') & + XDRYLBDAS_MAX + WRITE(UNIT=ILUOUT0,FMT='("PDRYLBDAG_MIN=",E13.6)') & + XDRYLBDAG_MIN + WRITE(UNIT=ILUOUT0,FMT='("PDRYLBDAS_MIN=",E13.6)') & + XDRYLBDAS_MIN + WRITE(UNIT=ILUOUT0,FMT='("PFDINFTY=",E13.6)') ZFDINFTY + WRITE(UNIT=ILUOUT0,FMT='("!")') + WRITE(UNIT=ILUOUT0,FMT='("IF( PRESENT(PKER_SDRYG) ) THEN")') + DO J1 = 1 , NDRYLBDAG + DO J2 = 1 , NDRYLBDAS + WRITE(UNIT=ILUOUT0,FMT='("PKER_SDRYG(",I3,",",I3,") = ",E13.6)') & + J1,J2,XKER_SDRYG(J1,J2) + END DO + END DO + WRITE(UNIT=ILUOUT0,FMT='("END IF")') + ELSE + CALL LIMA_READ_XKER_SDRYG (KDRYLBDAG,KDRYLBDAS,KND, & + PALPHAG,PNUG,PALPHAS,PNUS,PEGS,PBS,PCG,PDG,PCS,PDS, & + PDRYLBDAG_MAX,PDRYLBDAS_MAX,PDRYLBDAG_MIN,PDRYLBDAS_MIN, & + PFDINFTY,XKER_SDRYG ) + WRITE(UNIT=ILUOUT0,FMT='(" Read XKER_SDRYG")') +END IF +! +! +IND = 50 ! Number of interval used to integrate the dimensional +ZEGR = 1.0 ! distributions when computing the kernel XKER_RDRYG +ZFDINFTY = 20.0 +! +ALLOCATE( XKER_RDRYG(NDRYLBDAG,NDRYLBDAR) ) +! +CALL LIMA_READ_XKER_RDRYG (KDRYLBDAG,KDRYLBDAR,KND, & + PALPHAG,PNUG,PALPHAR,PNUR,PEGR,PBR,PCG,PDG,PCR,PDR, & + PDRYLBDAG_MAX,PDRYLBDAR_MAX,PDRYLBDAG_MIN,PDRYLBDAR_MIN, & + PFDINFTY ) +IF( (KDRYLBDAG/=NDRYLBDAG) .OR. (KDRYLBDAR/=NDRYLBDAR) .OR. (KND/=IND) .OR. & + (PALPHAG/=XALPHAG) .OR. (PNUG/=XNUG) .OR. & + (PALPHAR/=XALPHAR) .OR. (PNUR/=XNUR) .OR. & + (PEGR/=ZEGR) .OR. (PBR/=XBR) .OR. & + (PCG/=XCG) .OR. (PDG/=XDG) .OR. (PCR/=XCR) .OR. (PDR/=XDR) .OR. & + (PDRYLBDAG_MAX/=XDRYLBDAG_MAX) .OR. (PDRYLBDAR_MAX/=XDRYLBDAR_MAX) .OR. & + (PDRYLBDAG_MIN/=XDRYLBDAG_MIN) .OR. (PDRYLBDAR_MIN/=XDRYLBDAR_MIN) .OR. & + (PFDINFTY/=ZFDINFTY) ) THEN + CALL RZCOLX ( IND, XALPHAG, XNUG, XALPHAR, XNUR, & + ZEGR, XBR, XCG, XDG, XCR, XDR, & + XDRYLBDAG_MAX, XDRYLBDAR_MAX, XDRYLBDAG_MIN, XDRYLBDAR_MIN, & + ZFDINFTY, XKER_RDRYG ) + WRITE(UNIT=ILUOUT0,FMT='("*****************************************")') + WRITE(UNIT=ILUOUT0,FMT='("**** UPDATE NEW SET OF RDRYG KERNELS ****")') + WRITE(UNIT=ILUOUT0,FMT='("*****************************************")') + WRITE(UNIT=ILUOUT0,FMT='("!")') + WRITE(UNIT=ILUOUT0,FMT='("KND=",I3)') IND + WRITE(UNIT=ILUOUT0,FMT='("KDRYLBDAG=",I3)') NDRYLBDAG + WRITE(UNIT=ILUOUT0,FMT='("KDRYLBDAR=",I3)') NDRYLBDAR + WRITE(UNIT=ILUOUT0,FMT='("PALPHAG=",E13.6)') XALPHAG + WRITE(UNIT=ILUOUT0,FMT='("PNUG=",E13.6)') XNUG + WRITE(UNIT=ILUOUT0,FMT='("PALPHAR=",E13.6)') XALPHAR + WRITE(UNIT=ILUOUT0,FMT='("PNUR=",E13.6)') XNUR + WRITE(UNIT=ILUOUT0,FMT='("PEGR=",E13.6)') ZEGR + WRITE(UNIT=ILUOUT0,FMT='("PBR=",E13.6)') XBR + WRITE(UNIT=ILUOUT0,FMT='("PCG=",E13.6)') XCG + WRITE(UNIT=ILUOUT0,FMT='("PDG=",E13.6)') XDG + WRITE(UNIT=ILUOUT0,FMT='("PCR=",E13.6)') XCR + WRITE(UNIT=ILUOUT0,FMT='("PDR=",E13.6)') XDR + WRITE(UNIT=ILUOUT0,FMT='("PDRYLBDAG_MAX=",E13.6)') & + XDRYLBDAG_MAX + WRITE(UNIT=ILUOUT0,FMT='("PDRYLBDAR_MAX=",E13.6)') & + XDRYLBDAR_MAX + WRITE(UNIT=ILUOUT0,FMT='("PDRYLBDAG_MIN=",E13.6)') & + XDRYLBDAG_MIN + WRITE(UNIT=ILUOUT0,FMT='("PDRYLBDAR_MIN=",E13.6)') & + XDRYLBDAR_MIN + WRITE(UNIT=ILUOUT0,FMT='("PFDINFTY=",E13.6)') ZFDINFTY + WRITE(UNIT=ILUOUT0,FMT='("!")') + WRITE(UNIT=ILUOUT0,FMT='("IF( PRESENT(PKER_RDRYG) ) THEN")') + DO J1 = 1 , NDRYLBDAG + DO J2 = 1 , NDRYLBDAR + WRITE(UNIT=ILUOUT0,FMT='("PKER_RDRYG(",I3,",",I3,") = ",E13.6)') & + J1,J2,XKER_RDRYG(J1,J2) + END DO + END DO + WRITE(UNIT=ILUOUT0,FMT='("END IF")') + ELSE + CALL LIMA_READ_XKER_RDRYG (KDRYLBDAG,KDRYLBDAR,KND, & + PALPHAG,PNUG,PALPHAR,PNUR,PEGR,PBR,PCG,PDG,PCR,PDR, & + PDRYLBDAG_MAX,PDRYLBDAR_MAX,PDRYLBDAG_MIN,PDRYLBDAR_MIN, & + PFDINFTY,XKER_RDRYG ) + WRITE(UNIT=ILUOUT0,FMT='(" Read XKER_RDRYG")') +END IF +! +!------------------------------------------------------------------------------- +! +!* 9. CONSTANTS FOR THE FAST COLD PROCESSES FOR THE HAILSTONES +! -------------------------------------------------------- +! +!* 9.2 Constants for the wet growth of the hailstones +! +! +!* 9.2.1 Constant for the cloud droplet and cloud ice collection +! by the hailstones +! +XFWETH = (XPI/4.0)*XCCH*XCH*(ZRHO00**XCEXVT)*MOMG(XALPHAH,XNUH,XDH+2.0) +! +!* 9.2.2 Constants for the aggregate collection by the hailstones +! +XFSWETH = (XPI/4.0)*XCCH*XCCS*XAS*(ZRHO00**XCEXVT) +! +XLBSWETH1 = MOMG(XALPHAH,XNUH,2.)*MOMG(XALPHAS,XNUS,XBS) +XLBSWETH2 = 2.*MOMG(XALPHAH,XNUH,1.)*MOMG(XALPHAS,XNUS,XBS+1.) +XLBSWETH3 = MOMG(XALPHAS,XNUS,XBS+2.) +! +!* 9.2.3 Constants for the graupel collection by the hailstones +! +XFGWETH = (XPI/4.0)*XCCH*XCCG*XAG*(ZRHO00**XCEXVT) +! +XLBGWETH1 = MOMG(XALPHAH,XNUH,2.)*MOMG(XALPHAG,XNUG,XBG) +XLBGWETH2 = 2.*MOMG(XALPHAH,XNUH,1.)*MOMG(XALPHAG,XNUG,XBG+1.) +XLBGWETH3 = MOMG(XALPHAG,XNUG,XBG+2.) +! +! Notice: One magnitude of lambda discretized over 10 points +! +NWETLBDAS = 80 +XWETLBDAS_MIN = 2.5E1 ! Minimal value of Lbda_s to tabulate XKER_SWETH +XWETLBDAS_MAX = 2.5E9 ! Maximal value of Lbda_s to tabulate XKER_SWETH +ZRATE = LOG(XWETLBDAS_MAX/XWETLBDAS_MIN)/REAL(NWETLBDAS-1) +XWETINTP1S = 1.0 / ZRATE +XWETINTP2S = 1.0 - LOG( XWETLBDAS_MIN ) / ZRATE +NWETLBDAG = 40 +XWETLBDAG_MIN = 1.0E3 ! Min value of Lbda_g to tabulate XKER_GWETH +XWETLBDAG_MAX = 1.0E7 ! Max value of Lbda_g to tabulate XKER_GWETH +ZRATE = LOG(XWETLBDAG_MAX/XWETLBDAG_MIN)/REAL(NWETLBDAG-1) +XWETINTP1G = 1.0 / ZRATE +XWETINTP2G = 1.0 - LOG( XWETLBDAG_MIN ) / ZRATE +NWETLBDAH = 40 +XWETLBDAH_MIN = 1.0E3 ! Min value of Lbda_h to tabulate XKER_SWETH,XKER_GWETH +XWETLBDAH_MAX = 1.0E7 ! Max value of Lbda_h to tabulate XKER_SWETH,XKER_GWETH +ZRATE = LOG(XWETLBDAH_MAX/XWETLBDAH_MIN)/REAL(NWETLBDAH-1) +XWETINTP1H = 1.0 / ZRATE +XWETINTP2H = 1.0 - LOG( XWETLBDAH_MIN ) / ZRATE +! +!* 9.2.4 Computations of the tabulated normalized kernels +! +IND = 50 ! Interval number, collection efficiency and infinite diameter +ZEHS = 1.0 ! factor used to integrate the dimensional distributions when +ZFDINFTY = 20.0 ! computing the kernels XKER_SWETH +! +IF( .NOT.ALLOCATED(XKER_SWETH) ) ALLOCATE( XKER_SWETH(NWETLBDAH,NWETLBDAS) ) +! +CALL LIMA_READ_XKER_SWETH (KWETLBDAH,KWETLBDAS,KND, & + PALPHAH,PNUH,PALPHAS,PNUS,PEHS,PBS,PCH,PDH,PCS,PDS, & + PWETLBDAH_MAX,PWETLBDAS_MAX,PWETLBDAH_MIN,PWETLBDAS_MIN, & + PFDINFTY ) +IF( (KWETLBDAH/=NWETLBDAH) .OR. (KWETLBDAS/=NWETLBDAS) .OR. (KND/=IND) .OR. & + (PALPHAH/=XALPHAH) .OR. (PNUH/=XNUH) .OR. & + (PALPHAS/=XALPHAS) .OR. (PNUS/=XNUS) .OR. & + (PEHS/=ZEHS) .OR. (PBS/=XBS) .OR. & + (PCH/=XCH) .OR. (PDH/=XDH) .OR. (PCS/=XCS) .OR. (PDS/=XDS) .OR. & + (PWETLBDAH_MAX/=XWETLBDAH_MAX) .OR. (PWETLBDAS_MAX/=XWETLBDAS_MAX) .OR. & + (PWETLBDAH_MIN/=XWETLBDAH_MIN) .OR. (PWETLBDAS_MIN/=XWETLBDAS_MIN) .OR. & + (PFDINFTY/=ZFDINFTY) ) THEN + CALL RZCOLX ( IND, XALPHAH, XNUH, XALPHAS, XNUS, & + ZEHS, XBS, XCH, XDH, XCS, XDS, & + XWETLBDAH_MAX, XWETLBDAS_MAX, XWETLBDAH_MIN, XWETLBDAS_MIN, & + ZFDINFTY, XKER_SWETH ) + WRITE(UNIT=ILUOUT0,FMT='("*****************************************")') + WRITE(UNIT=ILUOUT0,FMT='("**** UPDATE NEW SET OF SWETH KERNELS ****")') + WRITE(UNIT=ILUOUT0,FMT='("*****************************************")') + WRITE(UNIT=ILUOUT0,FMT='("!")') + WRITE(UNIT=ILUOUT0,FMT='("KND=",I3)') IND + WRITE(UNIT=ILUOUT0,FMT='("KWETLBDAH=",I3)') NWETLBDAH + WRITE(UNIT=ILUOUT0,FMT='("KWETLBDAS=",I3)') NWETLBDAS + WRITE(UNIT=ILUOUT0,FMT='("PALPHAH=",E13.6)') XALPHAH + WRITE(UNIT=ILUOUT0,FMT='("PNUH=",E13.6)') XNUH + WRITE(UNIT=ILUOUT0,FMT='("PALPHAS=",E13.6)') XALPHAS + WRITE(UNIT=ILUOUT0,FMT='("PNUS=",E13.6)') XNUS + WRITE(UNIT=ILUOUT0,FMT='("PEHS=",E13.6)') ZEHS + WRITE(UNIT=ILUOUT0,FMT='("PBS=",E13.6)') XBS + WRITE(UNIT=ILUOUT0,FMT='("PCH=",E13.6)') XCH + WRITE(UNIT=ILUOUT0,FMT='("PDH=",E13.6)') XDH + WRITE(UNIT=ILUOUT0,FMT='("PCS=",E13.6)') XCS + WRITE(UNIT=ILUOUT0,FMT='("PDS=",E13.6)') XDS + WRITE(UNIT=ILUOUT0,FMT='("PWETLBDAH_MAX=",E13.6)') & + XWETLBDAH_MAX + WRITE(UNIT=ILUOUT0,FMT='("PWETLBDAS_MAX=",E13.6)') & + XWETLBDAS_MAX + WRITE(UNIT=ILUOUT0,FMT='("PWETLBDAH_MIN=",E13.6)') & + XWETLBDAH_MIN + WRITE(UNIT=ILUOUT0,FMT='("PWETLBDAS_MIN=",E13.6)') & + XWETLBDAS_MIN + WRITE(UNIT=ILUOUT0,FMT='("PFDINFTY=",E13.6)') ZFDINFTY + WRITE(UNIT=ILUOUT0,FMT='("!")') + WRITE(UNIT=ILUOUT0,FMT='("IF( PRESENT(PKER_SWETH) ) THEN")') + DO J1 = 1 , NWETLBDAH + DO J2 = 1 , NWETLBDAS + WRITE(UNIT=ILUOUT0,FMT='("PKER_SWETH(",I3,",",I3,") = ",E13.6)') & + J1,J2,XKER_SWETH(J1,J2) + END DO + END DO + WRITE(UNIT=ILUOUT0,FMT='("END IF")') + ELSE + CALL LIMA_READ_XKER_SWETH (KWETLBDAH,KWETLBDAS,KND, & + PALPHAH,PNUH,PALPHAS,PNUS,PEHS,PBS,PCH,PDH,PCS,PDS, & + PWETLBDAH_MAX,PWETLBDAS_MAX,PWETLBDAH_MIN,PWETLBDAS_MIN, & + PFDINFTY,XKER_SWETH ) + WRITE(UNIT=ILUOUT0,FMT='(" Read XKER_SWETH")') +END IF +! +! +IND = 50 ! Number of interval used to integrate the dimensional +ZEHG = 1.0 ! distributions when computing the kernel XKER_GWETH +ZFDINFTY = 20.0 +! +IF( .NOT.ALLOCATED(XKER_GWETH) ) ALLOCATE( XKER_GWETH(NWETLBDAH,NWETLBDAG) ) +! +CALL LIMA_READ_XKER_GWETH (KWETLBDAH,KWETLBDAG,KND, & + PALPHAH,PNUH,PALPHAG,PNUG,PEHG,PBG,PCH,PDH,PCG,PDG, & + PWETLBDAH_MAX,PWETLBDAG_MAX,PWETLBDAH_MIN,PWETLBDAG_MIN, & + PFDINFTY ) +IF( (KWETLBDAH/=NWETLBDAH) .OR. (KWETLBDAG/=NWETLBDAG) .OR. (KND/=IND) .OR. & + (PALPHAH/=XALPHAH) .OR. (PNUH/=XNUH) .OR. & + (PALPHAG/=XALPHAG) .OR. (PNUG/=XNUG) .OR. & + (PEHG/=ZEHG) .OR. (PBG/=XBG) .OR. & + (PCH/=XCH) .OR. (PDH/=XDH) .OR. (PCG/=XCG) .OR. (PDG/=XDG) .OR. & + (PWETLBDAH_MAX/=XWETLBDAH_MAX) .OR. (PWETLBDAG_MAX/=XWETLBDAG_MAX) .OR. & + (PWETLBDAH_MIN/=XWETLBDAH_MIN) .OR. (PWETLBDAG_MIN/=XWETLBDAG_MIN) .OR. & + (PFDINFTY/=ZFDINFTY) ) THEN + CALL RZCOLX ( IND, XALPHAH, XNUH, XALPHAG, XNUG, & + ZEHG, XBG, XCH, XDH, XCG, XDG, & + XWETLBDAH_MAX, XWETLBDAG_MAX, XWETLBDAH_MIN, XWETLBDAG_MIN, & + ZFDINFTY, XKER_GWETH ) + WRITE(UNIT=ILUOUT0,FMT='("*****************************************")') + WRITE(UNIT=ILUOUT0,FMT='("**** UPDATE NEW SET OF GWETH KERNELS ****")') + WRITE(UNIT=ILUOUT0,FMT='("*****************************************")') + WRITE(UNIT=ILUOUT0,FMT='("!")') + WRITE(UNIT=ILUOUT0,FMT='("KND=",I3)') IND + WRITE(UNIT=ILUOUT0,FMT='("KWETLBDAH=",I3)') NWETLBDAH + WRITE(UNIT=ILUOUT0,FMT='("KWETLBDAG=",I3)') NWETLBDAG + WRITE(UNIT=ILUOUT0,FMT='("PALPHAH=",E13.6)') XALPHAH + WRITE(UNIT=ILUOUT0,FMT='("PNUH=",E13.6)') XNUH + WRITE(UNIT=ILUOUT0,FMT='("PALPHAG=",E13.6)') XALPHAG + WRITE(UNIT=ILUOUT0,FMT='("PNUG=",E13.6)') XNUG + WRITE(UNIT=ILUOUT0,FMT='("PEHG=",E13.6)') ZEHG + WRITE(UNIT=ILUOUT0,FMT='("PBG=",E13.6)') XBG + WRITE(UNIT=ILUOUT0,FMT='("PCH=",E13.6)') XCH + WRITE(UNIT=ILUOUT0,FMT='("PDH=",E13.6)') XDH + WRITE(UNIT=ILUOUT0,FMT='("PCG=",E13.6)') XCG + WRITE(UNIT=ILUOUT0,FMT='("PDG=",E13.6)') XDG + WRITE(UNIT=ILUOUT0,FMT='("PWETLBDAH_MAX=",E13.6)') & + XWETLBDAH_MAX + WRITE(UNIT=ILUOUT0,FMT='("PWETLBDAG_MAX=",E13.6)') & + XWETLBDAG_MAX + WRITE(UNIT=ILUOUT0,FMT='("PWETLBDAH_MIN=",E13.6)') & + XWETLBDAH_MIN + WRITE(UNIT=ILUOUT0,FMT='("PWETLBDAG_MIN=",E13.6)') & + XWETLBDAG_MIN + WRITE(UNIT=ILUOUT0,FMT='("PFDINFTY=",E13.6)') ZFDINFTY + WRITE(UNIT=ILUOUT0,FMT='("!")') + WRITE(UNIT=ILUOUT0,FMT='("IF( PRESENT(PKER_GWETH) ) THEN")') + DO J1 = 1 , NWETLBDAH + DO J2 = 1 , NWETLBDAG + WRITE(UNIT=ILUOUT0,FMT='("PKER_GWETH(",I3,",",I3,") = ",E13.6)') & + J1,J2,XKER_GWETH(J1,J2) + END DO + END DO + WRITE(UNIT=ILUOUT0,FMT='("END IF")') + ELSE + CALL LIMA_READ_XKER_GWETH (KWETLBDAH,KWETLBDAG,KND, & + PALPHAH,PNUH,PALPHAG,PNUG,PEHG,PBG,PCH,PDH,PCG,PDG, & + PWETLBDAH_MAX,PWETLBDAG_MAX,PWETLBDAH_MIN,PWETLBDAG_MIN, & + PFDINFTY,XKER_GWETH ) + WRITE(UNIT=ILUOUT0,FMT='(" Read XKER_GWETH")') +END IF +! +! +! +!------------------------------------------------------------------------------- +! +!* 10. SET-UP RADIATIVE PARAMETERS +! --------------------------- +! +! +! R_eff_i = XFREFFI * (rho*r_i/N_i)**(1/3) +! +XFREFFI = 0.5 * ZGAMI(8) * (1.0/XLBI)**XLBEXI +! +!------------------------------------------------------------------------------- +! +! +!* 11. SOME PRINTS FOR CONTROL +! ----------------------- +! +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=ILUOUT0,FMT='(" Summary of the ice particule characteristics")') + WRITE(UNIT=ILUOUT0,FMT='(" PRISTINE ICE")') + WRITE(UNIT=ILUOUT0,FMT='(" masse: A=",E13.6," B=",E13.6)') & + XAI,XBI + WRITE(UNIT=ILUOUT0,FMT='(" vitesse: C=",E13.6," D=",E13.6)') & + XC_I,XDI + WRITE(UNIT=ILUOUT0,FMT='(" distribution:AL=",E13.6,"NU=",E13.6)') & + XALPHAI,XNUI + WRITE(UNIT=ILUOUT0,FMT='(" SNOW")') + WRITE(UNIT=ILUOUT0,FMT='(" masse: A=",E13.6," B=",E13.6)') & + XAS,XBS + WRITE(UNIT=ILUOUT0,FMT='(" vitesse: C=",E13.6," D=",E13.6)') & + XCS,XDS + WRITE(UNIT=ILUOUT0,FMT='(" concentration:CC=",E13.6," x=",E13.6)') & + XCCS,XCXS + WRITE(UNIT=ILUOUT0,FMT='(" distribution:AL=",E13.6,"NU=",E13.6)') & + XALPHAS,XNUS + WRITE(UNIT=ILUOUT0,FMT='(" GRAUPEL")') + WRITE(UNIT=ILUOUT0,FMT='(" masse: A=",E13.6," B=",E13.6)') & + XAG,XBG + WRITE(UNIT=ILUOUT0,FMT='(" vitesse: C=",E13.6," D=",E13.6)') & + XCG,XDG + WRITE(UNIT=ILUOUT0,FMT='(" concentration:CC=",E13.6," x=",E13.6)') & + XCCG,XCXG + WRITE(UNIT=ILUOUT0,FMT='(" distribution:AL=",E13.6,"NU=",E13.6)') & + XALPHAG,XNUG +END IF +! +!------------------------------------------------------------------------------ +! +END SUBROUTINE INI_LIMA_COLD_MIXED diff --git a/src/mesonh/micro/ini_lima_warm.f90 b/src/mesonh/micro/ini_lima_warm.f90 new file mode 100644 index 000000000..3fac15aae --- /dev/null +++ b/src/mesonh/micro/ini_lima_warm.f90 @@ -0,0 +1,461 @@ +!MNH_LIC Copyright 2013-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ######################### + MODULE MODI_INI_LIMA_WARM +! ######################### +! +INTERFACE + SUBROUTINE INI_LIMA_WARM (PTSTEP, PDZMIN) +! +REAL, INTENT(IN) :: PTSTEP ! Effective Time step +REAL, INTENT(IN) :: PDZMIN ! minimun vertical mesh size +! +END SUBROUTINE INI_LIMA_WARM +! +END INTERFACE +! +END MODULE MODI_INI_LIMA_WARM +! ######################################### + SUBROUTINE INI_LIMA_WARM (PTSTEP, PDZMIN) +! ######################################### +! +!! PURPOSE +!! ------- +!! The purpose of this routine is to initialize the constants used in the +!! microphysical scheme LIMA for the warm phase species and processes. +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_REF +USE MODD_PARAM_LIMA +USE MODD_PARAM_LIMA_WARM +USE MODD_PARAMETERS +USE MODD_LUNIT, ONLY : TLUOUT0 +! +USE MODI_LIMA_FUNCTIONS +USE MODI_HYPGEO +USE MODI_GAMMA +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +REAL, INTENT(IN) :: PTSTEP ! Effective Time step +REAL, INTENT(IN) :: PDZMIN ! minimun vertical mesh size +! +!* 0.2 Declarations of local variables : +! +INTEGER :: IKB ! Coordinates of the first and last physical + ! points along z +INTEGER :: J1 ! Internal loop indexes +INTEGER :: JMOD ! Internal loop to index the CCN modes +! +REAL, DIMENSION(6) :: ZGAMC, ZGAMR ! parameters involving various moments of + ! the generalized gamma law +! +REAL :: ZTT ! Temperature in Celsius +REAL :: ZLV ! Latent heat of vaporization +REAL :: ZSS ! Supersaturation +REAL :: ZPSI1, ZG ! Psi1 and G functions +REAL :: ZAHENR ! r_star (FH92) +REAL :: ZVTRMAX ! Raindrop maximal fall velocity +REAL :: ZRHO00 ! Surface reference air density +REAL :: ZSURF_TEN ! Water drop surface tension +REAL :: ZSMIN, ZSMAX ! Minimal and maximal supersaturation used to + ! discretize the HYP functions +! +! +INTEGER :: ILUOUT0 ! Logical unit number for output-listing +INTEGER :: IRESP ! Return code of FM-routines +LOGICAL :: GFLAG ! Logical flag for printing the constatnts on the output + ! listing +! +!------------------------------------------------------------------------------- +! +! +!* 1. CHARACTERISTICS OF THE SPECIES +! ------------------------------ +! +! +!* 1.1 Cloud droplet characteristics +! +XAC = (XPI/6.0)*XRHOLW +XBC = 3.0 +XCC = XRHOLW*XG/(18.0*1.816E-5) ! Stokes flow (Pruppacher eq. 10-138 for T=293K) +!XCC = XRHOLW*XG/(18.0*1.7E-5) ! Stokes flow (Pruppacher eq. 10-138 for T=273K) +XDC = 2.0 +! +XF0C = 1.00 +XF2C = 0.108 +! +XC1C = 1./2. +! +!* 1.2 Raindrops characteristics +! +XAR = (XPI/6.0)*XRHOLW +XBR = 3.0 +XCR = 842. +XDR = 0.8 +! +XF0R = 0.780 +!Correction BVIE Pruppacher 1997 eq. 13-61 +!XF1R = 0.265 +XF1R = 0.308 +! +! +!------------------------------------------------------------------------------ +! +! +!* 2. DIMENSIONAL DISTRIBUTIONS OF THE SPECIES +! ---------------------------------------- +! +! +!* 2.1 Cloud droplet distribution +! +!XALPHAC = 3.0 ! Gamma law of the Cloud droplet (here volume-like distribution) +!XNUC = 3.0 ! Gamma law with little dispersion +! +!* 2.2 Raindrop distribution +! +!XALPHAR = 3.0 ! Gamma law of the raindrops (here volume-like distribution) +!XNUR = 3.0 ! Gamma law for the raindrops +!XNUR = 0.1 +! +!* 2.3 Precalculation of the gamma function momentum +! +! +ZGAMC(1) = GAMMA_X0D(XNUC) +ZGAMC(2) = MOMG(XALPHAC,XNUC,3.) +ZGAMC(3) = MOMG(XALPHAC,XNUC,6.) +ZGAMC(4) = ZGAMC(3)-ZGAMC(2)**2 ! useful for Sig_c +ZGAMC(5) = MOMG(XALPHAC,XNUC,9.) +ZGAMC(6) = MOMG(XALPHAC,XNUC,3.)**(2./3.)/MOMG(XALPHAC,XNUC,2.) +! +ZGAMR(1) = GAMMA_X0D(XNUR) +ZGAMR(2) = MOMG(XALPHAR,XNUR,3.) +ZGAMR(3) = MOMG(XALPHAR,XNUR,6.) +ZGAMR(4) = MOMG(XALPHAR,XNUR,6.) +ZGAMR(5) = MOMG(XALPHAR,XNUR,9.) +ZGAMR(6) = MOMG(XALPHAR,XNUR,3.)**(2./3.)/MOMG(XALPHAR,XNUR,2.) +! +!* 2.4 Csts for the shape parameter +! +XLBC = XAR*ZGAMC(2) +XLBEXC = 1.0/XBC +XLBR = XAR*ZGAMR(2) +XLBEXR = 1.0/XBR +! +! +!------------------------------------------------------------------------------ +! +! +!* 3. CONSTANTS FOR THE SEDIMENTATION +! ------------------------------- +! +! +!* 4.1 Exponent of the fall-speed air density correction +! +IKB = 1 + JPVEXT +! Correction +!ZRHO00 = XP00/(XRD*XTHVREFZ(IKB)) +ZRHO00 = 1.2041 ! at P=1013.25hPa and T=20°C +! +!* 4.2 Constants for sedimentation +! +XFSEDRR = XCR*GAMMA_X0D(XNUR+(XDR+3.)/XALPHAR)/GAMMA_X0D(XNUR+3./XALPHAR)* & + (ZRHO00)**XCEXVT +XFSEDCR = XCR*GAMMA_X0D(XNUR+XDR/XALPHAR)/GAMMA_X0D(XNUR)* & + (ZRHO00)**XCEXVT +XFSEDRC = XCC*GAMMA_X0D(XNUC+(XDC+3.)/XALPHAC)/GAMMA_X0D(XNUC+3./XALPHAC)* & + (ZRHO00)**XCEXVT +XFSEDCC = XCC*GAMMA_X0D(XNUC+XDC/XALPHAC)/GAMMA_X0D(XNUC)* & + (ZRHO00)**XCEXVT + +! +XLB(2) = XLBC +XLBEX(2) = XLBEXC +XD(2) = XDC +XFSEDR(2) = XFSEDRC +XFSEDC(2) = XFSEDCC +! +XLB(3) = XLBR +XLBEX(3) = XLBEXR +XD(3) = XDR +XFSEDR(3) = XFSEDRR +XFSEDC(3) = XFSEDCR +! +!------------------------------------------------------------------------------ +! +! +!* 4. CONSTANTS FOR THE NUCLEATION PROCESS +! ------------------------------------ +! +! +XWMIN = 0.01 ! Minimal positive vertical velocity required + ! for the activation process in Twomey and CPB scheme +XTMIN = -0.000278 ! Minimal cooling required 1K/h +! +XDIVA = 226.E-7 ! Diffusivity of water vapor in the air +XTHCO = 24.3E-3 ! Air thermal conductivity +! +! ( 8 Mw (Sigma)sw )3 Pi*Rho_l +! XCSTDCRIT = ( -------------- ) * -------- +! ( 3 Ra Rhow ) 6 +! +ZSURF_TEN = 76.1E-3 ! Surface tension of a water drop at T=0 C +XCSTDCRIT = (XPI/6.)*XRHOLW*( (8.0*ZSURF_TEN )/( 3.0*XRV*XRHOLW ) )**3 +! +! +! +! 4.1 Tabulation of the hypergeometric functions in 'no units' +! -------------------------------------------------------- +! +! In LIMA's nucleation parameterization, +! supersaturation is not in % : Smax=0.01 for a 1% supersaturation. +! This is accounted for in the modified Beta and C values. +! +! Here, we tabulate the +! F(mu,k/2, k/2+1 ,-Beta S**2) -> XHYPF12 +! F(mu,k/2,(k+3)/2,-Beta S**2) -> XHYPF32 functions +! using a logarithmic scale for S +! +NHYP = 500 ! Number of points for the tabulation +ALLOCATE (XHYPF12( NHYP, NMOD_CCN )) +ALLOCATE (XHYPF32( NHYP, NMOD_CCN )) +! +ZSMIN = 1.0E-5 ! Minimum supersaturation set at 0.001 % +ZSMAX = 5.0E-2 ! Maximum supersaturation set at 5 % +XHYPINTP1 = REAL(NHYP-1)/LOG(ZSMAX/ZSMIN) +XHYPINTP2 = REAL(NHYP)-XHYPINTP1*LOG(ZSMAX) +! +DO JMOD = 1,NMOD_CCN + DO J1 = 1,NHYP + ZSS =ZSMAX*(ZSMIN/ZSMAX)**(REAL(NHYP-J1)/REAL(NHYP-1)) + XHYPF12(J1,JMOD) = HYPGEO(XMUHEN_MULTI(JMOD),0.5*XKHEN_MULTI(JMOD),& + 0.5*XKHEN_MULTI(JMOD)+1.0,XBETAHEN_MULTI(JMOD),ZSS) + XHYPF32(J1,JMOD) = HYPGEO(XMUHEN_MULTI(JMOD),0.5*XKHEN_MULTI(JMOD),& + 0.5*XKHEN_MULTI(JMOD)+1.5,XBETAHEN_MULTI(JMOD),ZSS) + END DO +ENDDO +! +NAHEN = 81 ! Tabulation for each Kelvin degree in the range XTT-40 to XTT+40 +XAHENINTP1 = 1.0 +XAHENINTP2 = 0.5*REAL(NAHEN-1) - XTT +! +! Compute the tabulation of function of T : +! +! 1 +! XAHENG = ----------------------- +! XCSTHEN * G**(3/2) +! +! Compute constants for the calculation of Smax. +! XCSTHEN = 1/(rho_l 2 pi) +! PSI1 +! PSI3 +! T +! Lv +! G +! +ALLOCATE (XAHENG(NAHEN)) +ALLOCATE (XAHENG2(NAHEN)) +ALLOCATE (XAHENG3(NAHEN)) +ALLOCATE (XPSI1(NAHEN)) +ALLOCATE (XPSI3(NAHEN)) +XCSTHEN = 1.0 / ( XRHOLW*2.0*XPI ) +DO J1 = 1,NAHEN + ZTT = XTT + REAL(J1-(NAHEN-1)/2) ! T + ZLV = XLVTT+(XCPV-XCL)*(ZTT-XTT) ! Lv + XPSI1(J1) = (XG/(XRD*ZTT))*(XMV*ZLV/(XMD*XCPD*ZTT)-1.) ! Psi1 + XPSI3(J1) = -1*XMV*ZLV/(XMD*XRD*(ZTT**2)) ! Psi3 + ZG = 1./( XRHOLW*( (XRV*ZTT)/ & ! G + (XDIVA*EXP(XALPW-(XBETAW/ZTT)-(XGAMW*ALOG(ZTT)))) & + + (ZLV/ZTT)**2/(XTHCO*XRV) ) ) + XAHENG(J1) = XCSTHEN/(ZG)**(3./2.) + XAHENG2(J1) = 1/(ZG)**(1./2.) * GAMMA_X0D(XNUC+1./XALPHAC)/GAMMA_X0D(XNUC) + XAHENG3(J1) = (ZG) * GAMMA_X0D(XNUC+1./XALPHAC)/GAMMA_X0D(XNUC) +END DO +!------------------------------------------------------------------------------- +! +! Parameters used to initialise the droplet and drop concentration +! from the respective mixing ratios (used in RESTART_RAIN_C2R2) +! +! Droplet case +! +!!ALLOCATE(XCONCC_INI(SIZE(PNFS,1),SIZE(PNFS,2),SIZE(PNFS,3),SIZE(PNFS,4))) !NMOD_CCN)) +!! XCONCC_INI(:,:,:,:) = 0.8 * PNFS(:,:,:,:) ! 80% of the maximum CCN conc. is assumed +! +! Raindrop case +! +XCONCR_PARAM_INI = (1.E7)**3/(XPI*XRHOLW) ! MP law with N_O=1.E7 m-1 is assumed +! +! +!------------------------------------------------------------------------------ +! +! +!* 5. CONSTANTS FOR THE COALESCENCE PROCESSES +! --------------------------------------- +! +! +!* 6.1 Csts for the coalescence processes +! +XKERA1 = 2.59E15 ! From Long a1=9.44E9 cm-3 so XKERA1= 9.44E9*1E6*(PI/6)**2 +XKERA2 = 3.03E3 ! From Long a2=5.78E3 so XKERA2= 5.78E3* (PI/6) +! +! Cst for the cloud droplet selfcollection process +! +XSELFC = XKERA1*ZGAMC(3) +! +! Cst for the autoconversion process +! +XAUTO1 = 6.25E18*(ZGAMC(2))**(1./3.)*SQRT(ZGAMC(4)) +XAUTO2 = 0.5E6*(ZGAMC(4))**(1./6.) +XLAUTR = 2.7E-2 +XLAUTR_THRESHOLD = 0.4 +XITAUTR= 0.27 ! (Notice that T2 of BR74 is uncorrect and that 0.27=1./3.7 +XITAUTR_THRESHOLD = 7.5 +XCAUTR = 3.5E9 +! +! Cst for the accretion process +! +XACCR1 = ZGAMR(2)**(1./3.) +XACCR2 = 5.0E-6 +XACCR3 = 12.6E-4 +XACCR4 = XAUTO2 +XACCR5 = 3.5 +XACCR6 = 1.2*XCAUTR +XACCR_CLARGE1 = XKERA2*ZGAMC(2) +XACCR_CLARGE2 = XKERA2*ZGAMR(2) +XACCR_RLARGE1 = XKERA2*ZGAMC(3)*XRHOLW*(XPI/6.0) +XACCR_RLARGE2 = XKERA2*ZGAMC(2)*ZGAMR(2)*XRHOLW*(XPI/6.0) +XACCR_CSMALL1 = XKERA1*ZGAMC(3) +XACCR_CSMALL2 = XKERA1*ZGAMR(3) +XACCR_RSMALL1 = XKERA1*ZGAMC(5)*XRHOLW*(XPI/6.0) +XACCR_RSMALL2 = XKERA1*ZGAMC(2)*ZGAMR(3)*XRHOLW*(XPI/6.0) +! +! Cst for the raindrop self-collection/breakup process +! +XSCBU2 = XKERA2*ZGAMR(2) +XSCBU3 = XKERA1*ZGAMR(3) +XSCBU_EFF1 = 0.6E-3 +XSCBU_EFF2 = 2.0E-3 +XSCBUEXP1 = -2500.0 +! +! +!------------------------------------------------------------------------------ +! +! +!* 6. CONSTANTS FOR THE "SONTANEOUS" BREAK-UP +! --------------------------------------- +! +! +XSPONBUD1 = 3.0E-3 +XSPONBUD2 = 4.0E-3 +XSPONBUD3 = 5.0E-3 +XSPONCOEF2 = ((XSPONBUD3/XSPONBUD2)**3 - 1.0)/(XSPONBUD3-XSPONBUD1)**2 +! +! +!------------------------------------------------------------------------------ +! +! +!* 7. CONSTANTS FOR EVAPORATION PROCESS +! --------------------------------------- +! +! +X0CNDC = (4.0*XPI)*XC1C*XF0C*MOMG(XALPHAC,XNUC,1.) +X2CNDC = (4.0*XPI)*XC1C*XF2C*XCC*MOMG(XALPHAC,XNUC,XDC+2.0) +! +! Valeurs utiles pour le calcul de l'évaporation en fonction de N_r +! +!XEX0EVAR = -1.0 +!XEX1EVAR = -1.0 - (XDR+1.0)*0.5 +!XEX2EVAR = -0.5*XCEXVT +! +!X0EVAR = (2.0*XPI)*XF0R*GAMMA_X0D(XNUR+1./XALPHAR)/GAMMA_X0D(XNUR) +!X1EVAR = (2.0*XPI)*XF1R*((ZRHO00)**(XCEXVT)*(XCR/0.15E-4))**0.5* & +! GAMMA_X0D(XNUR+(XDR+3.0)/(2.0*XALPHAR))/GAMMA_X0D(XNUR) +! +! +! Valeurs utiles pour le calcul de l'évaporation en fonction de r_r +! +XEX0EVAR = 2.0 +XEX1EVAR = 2.0 - (XDR+1.0)*0.5 +XEX2EVAR = -0.5*XCEXVT +! +X0EVAR = (12.0)*XF0R*GAMMA_X0D(XNUR+1./XALPHAR)/GAMMA_X0D(XNUR+3./XALPHAR) +X1EVAR = (12.0)*XF1R*((ZRHO00)**(XCEXVT)*(XCR/0.15E-4))**0.5* & + GAMMA_X0D(XNUR+(XDR+3.0)/(2.0*XALPHAR))/GAMMA_X0D(XNUR+3./XALPHAR) +! +! +!------------------------------------------------------------------------------ +! +! +!* 8. SET-UP RADIATIVE PARAMETERS +! --------------------------- +! +! +! R_eff_c = XFREFFC * (rho*r_c/N_c)**(1/3) +! +! +XFREFFC = 0.5 * ZGAMC(6) * (1.0/XAC)**(1.0/3.0) +XFREFFR = 0.5 * ZGAMR(6) * (1.0/XAR)**(1.0/3.0) +! +! Coefficients used to compute reff when both cloud and rain are present +! +XCREC = 1.0/ (ZGAMC(6) * XAC**(2.0/3.0)) +XCRER = 1.0/ (ZGAMR(6) * XAR**(2.0/3.0)) +! +! +!------------------------------------------------------------------------------ +! +! +!* 9. SOME PRINTS FOR CONTROL +! ----------------------- +! +! +GFLAG = .TRUE. +IF (GFLAG) THEN + ILUOUT0 = TLUOUT0%NLU + WRITE(UNIT=ILUOUT0,FMT='(" Summary of the cloud particule characteristics")') + WRITE(UNIT=ILUOUT0,FMT='(" CLOUD")') + WRITE(UNIT=ILUOUT0,FMT='(" masse: A=",E13.6," B=",E13.6)') & + XAR,XBR + WRITE(UNIT=ILUOUT0,FMT='(" vitesse: C=",E13.6," D=",E13.6)') & + XCC,XDC + WRITE(UNIT=ILUOUT0,FMT='(" distribution:AL=",E13.6,"NU=",E13.6)') & + XALPHAC,XNUC + WRITE(UNIT=ILUOUT0,FMT='(" RAIN")') + WRITE(UNIT=ILUOUT0,FMT='(" masse: A=",E13.6," B=",E13.6)') & + XAR,XBR + WRITE(UNIT=ILUOUT0,FMT='(" vitesse: C=",E13.6," D=",E13.6)') & + XCR,XDR +!!$ WRITE(UNIT=ILUOUT0,FMT='(" distribution:AL=",E13.6,"NU=",E13.6)') & +!!$ XALPHAR,XNUR +!!$ WRITE(UNIT=ILUOUT0,FMT='(" Description of the nucleation spectrum")') +!!$ WRITE(UNIT=ILUOUT0,FMT='(" C=",E13.6," k=",E13.6)') XCHEN, XKHEN +!!$ WRITE(UNIT=ILUOUT0,FMT='(" Beta=",E13.6," MU=",E13.6)') XBETAHEN, XMUHEN +!!$ WRITE(UNIT=ILUOUT0,FMT='(" CCN max=",E13.6)') XCONC_CCN +END IF +! +!------------------------------------------------------------------------------ +! +END SUBROUTINE INI_LIMA_WARM diff --git a/src/mesonh/micro/ini_neb.f90 b/src/mesonh/micro/ini_neb.f90 new file mode 100644 index 000000000..6cb0efab6 --- /dev/null +++ b/src/mesonh/micro/ini_neb.f90 @@ -0,0 +1,72 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +! ######spl + MODULE MODI_INI_NEB +! ##################### +! +INTERFACE +! +SUBROUTINE INI_NEB +END SUBROUTINE INI_NEB +! +END INTERFACE +! +END MODULE MODI_INI_NEB +! ######spl + SUBROUTINE INI_NEB +! ####################### +! +!!**** *INI_NEB* - routine to initialize the nebulosity computation +!! constants. +!! +!! PURPOSE +!! ------- +! The purpose of this routine is to initialize +! constants used for nebulosity computation +! +!! METHOD +!! ------ +!! The constants are set to their numerical values +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_NEB +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! S. Riette (Meteo France) +!! +!! MODIFICATIONS +!! ------------- +!! Original 24 Aug 2011 +!! -------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_NEB +USE PARKIND1, ONLY : JPRB +USE YOMHOOK , ONLY : LHOOK, DR_HOOK +! +IMPLICIT NONE +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +! --------------------------------------------------------------------------- +! +! 1. SETTING THE NUMERICAL VALUES +! +IF (LHOOK) CALL DR_HOOK('INI_NEB',0,ZHOOK_HANDLE) +!Freezing between 0 and -20. Other possibilities are 0/-40 or -5/-25 +XTMAXMIX = 273.16 +XTMINMIX = 253.16 +IF (LHOOK) CALL DR_HOOK('INI_NEB',1,ZHOOK_HANDLE) +END SUBROUTINE INI_NEB diff --git a/src/mesonh/micro/ini_rain_c2r2.f90 b/src/mesonh/micro/ini_rain_c2r2.f90 new file mode 100644 index 000000000..b436b832d --- /dev/null +++ b/src/mesonh/micro/ini_rain_c2r2.f90 @@ -0,0 +1,637 @@ +!MNH_LIC Copyright 1996-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ######################### + MODULE MODI_INI_RAIN_C2R2 +! ######################### +! +INTERFACE + SUBROUTINE INI_RAIN_C2R2 ( PTSTEP, PDZMIN, KSPLITR, HCLOUD ) +! +INTEGER, INTENT(OUT):: KSPLITR ! Number of small time step + ! integration for rain + ! sedimendation +! +REAL, INTENT(IN) :: PTSTEP ! Effective Time step +! +REAL, INTENT(IN) :: PDZMIN ! minimun vertical mesh size +! +CHARACTER (LEN=4), INTENT(IN) :: HCLOUD ! Indicator of the cloud scheme +! +! +END SUBROUTINE INI_RAIN_C2R2 +! +END INTERFACE +! +END MODULE MODI_INI_RAIN_C2R2 +! #################################################### + SUBROUTINE INI_RAIN_C2R2 ( PTSTEP, PDZMIN, KSPLITR, HCLOUD ) +! #################################################### +! +!!**** *INI_RAIN_C2R2 * - initialize the constants for the two-moment scheme +!! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to initialize the constants used in the +!! warm microphysical scheme C2R2. The routine allows for the choice of +!! several activation schemes CPB, TFH and TWO. The CPB scheme can be +!! initialized either with a CCN shape function or directly from the +!! specification of aerosol properties. +!! The cloud droplets and rain drops are assumed to follow a generalized +!! gamma law. +!! +!!** METHOD +!! ------ +!! The constants are initialized to their numerical values and the number +!! of small time step in the sedimentation scheme is computed by dividing +!! the 2* Deltat time interval of the leap-frog scheme so that the stability +!! criterion for the rain sedimentation is fulfilled for a raindrop maximal +!! fall velocity equal VTRMAX. +!! +!! EXTERNAL +!! -------- +!! GAMMA : gamma function +!! HYPGEO : hypergeometric function +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST +!! XPI ! +!! XP00 ! Reference pressure +!! XRD ! Gaz constant for dry air +!! XRHOLW ! Liquid water density +!! Module MODD_REF +!! XTHVREFZ ! Reference virtual pot.temp. without orography +!! Module MODD_PARAMETERS +!! JPVEXT ! +!! Module MODD_RAIN_C2R2_DESCR +!! Module MODD_RAIN_C2R2_KHKO_PARAM +!! +!! REFERENCE +!! --------- +!! Book2 of documentation ( routine INI_RAIN_C2R2 ) +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original 31/12/96 +!! J.-P. Pinty 07/07/00 In revised form +!! J.-P. Pinty 05/04/02 Add computation of the effective radius +!! J.-P. Pinty 29/11/02 Add cloud doplet fall speed parameters +!! O.Geoffroy 03/2006 Add KHKO scheme +!! G.Delautier 09/2014 fusion MODD_RAIN_C2R2_PARAM et MODD_RAIN_KHKO_PARAM +!! M.Mazoyer 10/2016 Constants for Droplet sedimentation adapted to fog for KHKO +!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_LUNIT, ONLY: TLUOUT0 +USE MODD_PARAM_C2R2 +USE MODD_PARAMETERS +USE MODD_RAIN_C2R2_DESCR +USE MODD_RAIN_C2R2_KHKO_PARAM +USE MODD_REF +! +USE MODI_GAMMA +USE MODI_HYPGEO +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +! +INTEGER, INTENT(OUT):: KSPLITR ! Number of small time step + ! integration for rain + ! sedimendation +! +REAL, INTENT(IN) :: PTSTEP ! Effective Time step +! +REAL, INTENT(IN) :: PDZMIN ! minimun vertical mesh size +! +CHARACTER (LEN=4), INTENT(IN) :: HCLOUD ! Indicator of the cloud scheme +! +! +!* 0.2 Declarations of local variables : +! +INTEGER :: IKB ! Coordinates of the first and last physical + ! points along z +INTEGER :: J1 ! Internal loop indexes +! +REAL, DIMENSION(6) :: ZGAMC, ZGAMR ! parameters involving various moments of + ! the generalized gamma law +! +REAL :: ZT ! Work variable +REAL :: ZTT ! Temperature in Celsius +REAL :: ZLV ! Latent heat of vaporization +REAL :: ZSS ! Supersaturation +REAL :: ZPSI1, ZG ! Psi1 and G functions +REAL :: ZAHENR ! r_star (FH92) +REAL :: ZVTRMAX ! Raindrop maximal fall velocity +REAL :: ZRHO00 ! Surface reference air density +REAL :: ZSURF_TEN ! Water drop surface tension +REAL :: ZSMIN, ZSMAX ! Minimal and maximal supersaturation used to + ! discretize the HYP functions +! +! +INTEGER :: ILUOUT0 ! Logical unit number for output-listing +LOGICAL :: GFLAG ! Logical flag for printing the constatnts on the output + ! listing +! +!------------------------------------------------------------------------------- +! +! +!* 0. FUNCTION STATEMENTS +! ------------------- +! +! +!* 0.1 G(p) for p_moment of the Generalized GAMMA function +! +! +! recall that MOMG(ZALPHA,ZNU,ZP)=GAMMA(ZNU+ZP/ZALPHA)/GAMMA(ZNU) +! +! +! 1. INTIALIZE OUTPUT LISTING AND COMPUTE KSPLITR FOR EACH MODEL +! ----------------------------------------------------------- +! +ILUOUT0 = TLUOUT0%NLU +! +!* 1.1 Set the raindrop maximum fall velocity +! +ZVTRMAX = 30. +! +!* 1.2 Compute the number of small time step integration +! +KSPLITR = 1 +SPLIT : DO + ZT = PTSTEP / REAL(KSPLITR) + IF ( ZT * ZVTRMAX / PDZMIN < 1.0) EXIT SPLIT + KSPLITR = KSPLITR + 1 +END DO SPLIT +! +IF (ALLOCATED(XRTMIN)) RETURN ! In case of nesting microphysics constants of +! ! MODD_RAIN_C2R2_KHKO_PARAM are computed only once. +! +!------------------------------------------------------------------------------- +! +!* 2. CHARACTERISTICS OF THE SPECIES +! ------------------------------ +! +! +!* 2.1 Cloud droplet characteristics +! +XAC = (XPI/6.0)*XRHOLW +XBC = 3.0 +IF (HCLOUD=='KHKO') THEN + XCC = XRHOLW*XG/(18.0*1.816E-5) ! Stokes flow (Pruppacher p 322 for T=293K) +ELSE + XCC = XRHOLW*XG/(18.0*1.7E-5) ! Stokes flow (Pruppacher p 322 for T=273K) +ENDIF +XDC = 2.0 +! +XF0C = 1.00 +XF2C = 0.08 +! +XC1C = 1./2. +! +!* 2.2 Raindrops characteristics +! +XAR = (XPI/6.0)*XRHOLW +XBR = 3.0 +XCR = 842. +XDR = 0.8 +! +XF0R = 0.780 +XF1R = 0.265 +! +! +! +!------------------------------------------------------------------------------- +! +!* 3. DIMENSIONAL DISTRIBUTIONS OF THE SPECIES +! ---------------------------------------- +! +!* 3.1 Cloud droplet distribution +! +!XALPHAC = 3.0 ! Gamma law of the Cloud droplet (here volume-like distribution) +!XNUC = 3.0 ! Gamma law with little dispersion +! +!* 3.2 Raindrop distribution +! +!XALPHAR = 3.0 ! Gamma law of the raindrops (here volume-like distribution) +!XNUR = 3.0 ! Gamma law for the raindrops +!XNUR = 0.1 +! +!* 3.3 Precalculation of the gamma function momentum +! +! + ZGAMC(1) = GAMMA(XNUC) + ZGAMC(2) = MOMG(XALPHAC,XNUC,3.) + ZGAMC(3) = MOMG(XALPHAC,XNUC,6.) + ZGAMC(4) = ZGAMC(3)-ZGAMC(2)**2 ! useful for Sig_c + ZGAMC(5) = MOMG(XALPHAC,XNUC,9.) + ZGAMC(6) = MOMG(XALPHAC,XNUC,3.)**(2./3.)/MOMG(XALPHAC,XNUC,2.) +! + ZGAMR(1) = GAMMA(XNUR) + ZGAMR(2) = MOMG(XALPHAR,XNUR,3.) + ZGAMR(3) = MOMG(XALPHAR,XNUR,6.) + ZGAMR(4) = MOMG(XALPHAR,XNUR,6.) + ZGAMR(5) = MOMG(XALPHAR,XNUR,9.) + ZGAMR(6) = MOMG(XALPHAR,XNUR,3.)**(2./3.)/MOMG(XALPHAR,XNUR,2.) +! +! +!* 3.4 Set bounds +! +ALLOCATE( XRTMIN(3) ) +ALLOCATE( XCTMIN(3) ) +IF (HCLOUD == 'C2R2') THEN +XRTMIN(1) = 1.0E-20 +XRTMIN(2) = 1.0E-20 +XRTMIN(3) = 1.0E-17 +ELSE +XRTMIN(1) = 1.0E-20 +XRTMIN(2) = 1.E-7 +XRTMIN(3) = 1.E-8 +ENDIF +! +XCTMIN(1) = 1.0 +XCTMIN(2) = 1.0 +XCTMIN(3) = 1.0E-3 +! +!* 3.4 Csts for the shape parameter +! +XLBC = XAR*ZGAMC(2) +XLBEXC = 1.0/XBC +XLBR = XAR*ZGAMR(2) +XLBEXR = 1.0/XBR +! +!------------------------------------------------------------------------------- +! +!* 4. CONSTANTS FOR THE SEDIMENTATION +! ------------------------------- +! +!* 4.1 Exponent of the fall-speed air density correction +! +XCEXVT = 0.4 +! +IKB = 1 + JPVEXT +ZRHO00 = XP00/(XRD*XTHVREFZ(IKB)) +! +!* 4.2 Constants for sedimentation +! +XFSEDRR = XCR*GAMMA(XNUR+(XDR+3.)/XALPHAR)/GAMMA(XNUR+3./XALPHAR)* & + (ZRHO00)**XCEXVT +XFSEDCR = XCR*GAMMA(XNUR+XDR/XALPHAR)/GAMMA(XNUR)* & + (ZRHO00)**XCEXVT +XFSEDRC = XCC*GAMMA(XNUC+(XDC+3.)/XALPHAC)/GAMMA(XNUC+3./XALPHAC)* & + (ZRHO00)**XCEXVT +XFSEDCC = XCC*GAMMA(XNUC+XDC/XALPHAC)/GAMMA(XNUC)* & + (ZRHO00)**XCEXVT +! +! +!------------------------------------------------------------------------------- +! +!* 5. CONSTANTS FOR THE NUCLEATION PROCESS +! ------------------------------------- +! +! +! Compute CCN spectra parameters from CCN characteristics +! +IF (HPARAM_CCN == 'CPB' .AND. HINI_CCN == 'AER') THEN + SELECT CASE (HTYPE_CCN) + CASE('M') ! NaCl maritime case + XKHEN = 3.251*(XLOGSIG_CCN/0.4835)**(-1.297) + XMUHEN = 2.589*(XLOGSIG_CCN/0.4835)**(-1.511) + XBETAHEN = 621.689*(XR_MEAN_CCN/0.133E-6)**(3.002) & + *EXP(1.081*((XLOGSIG_CCN/0.4835)-1.)) & + *XFSOLUB_CCN & + *(XACTEMP_CCN/290.16)**(2.995) + CASE('C') ! (NH4)2SO4 continental case + XKHEN = 1.403*(XLOGSIG_CCN/1.16)**(-1.172) + XMUHEN = 0.834*(XLOGSIG_CCN/1.16)**(-1.350) + XBETAHEN = 25.499*(XR_MEAN_CCN/0.0218E-6)**(3.057) & + *EXP(4.092*((XLOGSIG_CCN/1.16)-1.)) & + *XFSOLUB_CCN**(1.011) & + *(XACTEMP_CCN/290.16)**(3.076) + END SELECT + XCHEN = XCONC_CCN*(XBETAHEN**(0.5*XKHEN)*GAMMA(XMUHEN)) & + /(GAMMA(0.5*XKHEN+1.)*GAMMA(XMUHEN-0.5*XKHEN)) +END IF +! +XWMIN = 0.01 ! Minimal positive vertical velocity required + ! for the activation process in Twomey and CPB scheme +XTMIN = -0.000278 ! Minimal cooling required 1K/h + +! +XDIVA = 226.E-7 ! Diffusivity of water vapor in the air +XTHCO = 24.3E-3 ! Air thermal conductivity +! +! ( 8 Mw (Sigma)sw )3 Pi*Rho_l +! XCSTDCRIT = ( -------------- ) * -------- +! ( 3 Ra Rhow ) 6 +! +ZSURF_TEN = 76.1E-3 ! Surface tension of a water drop at T=0 C +XCSTDCRIT = (XPI/6.)*XRHOLW*( (8.0*ZSURF_TEN )/( 3.0*XRV*XRHOLW ) )**3 +! +! Tabulation of the hypergeometric functions +! +! F(mu,k/2, k/2+1 ,-Beta s**2) and +! F(mu,k/2,(k+3)/2,-Beta s**2) as a function of s +! +NHYP = 200 +ALLOCATE (XHYPF12(NHYP)) +ALLOCATE (XHYPF32(NHYP)) +! +ZSMIN = 1.0E-5 ! soit Smin=0.001 % +ZSMAX = 1.0E-1 ! soit Smax= 10 % +XHYPINTP1 = REAL(NHYP-1)/LOG(ZSMAX/ZSMIN) +XHYPINTP2 = REAL(NHYP)-XHYPINTP1*LOG(ZSMAX) +IF (HPARAM_CCN == 'CPB') THEN ! CPB98's case + TAB_HYP : DO J1 = 1,NHYP ! tabulation using a logarithmic scale for the + ! supersaturations (0.00001<S<0.1 in "no unit") + ZSS =ZSMAX*(ZSMIN/ZSMAX)**(REAL(NHYP-J1)/REAL(NHYP-1)) + XHYPF12(J1) = HYPGEO(XMUHEN,XKHEN/2.0,(XKHEN+2.0)/2.0,XBETAHEN, & + 100.*ZSS) + XHYPF32(J1) = HYPGEO(XMUHEN,XKHEN/2.0,(XKHEN+3.0)/2.0,XBETAHEN*100**2, & + ZSS) + END DO TAB_HYP + IF (HINI_CCN == 'CCN') THEN + XCONC_CCN = XCHEN*(GAMMA(0.5*XKHEN+1.)*GAMMA(XMUHEN-0.5*XKHEN)) & + /(XBETAHEN**(0.5*XKHEN)*GAMMA(XMUHEN)) + END IF +ELSE ! other cases (but not used) + XHYPF12(:) = 1.0 + XHYPF32(:) = 1.0 +! XCONC_CCN = -1.0 ! Negative value to recall that CCN spectra, other than those + ! defined by CPB98, are unbounded +END IF +! +! Compute the tabulation of function of T : +! +! (Psi1)**(3/2) +! XAHENG = ----------------------- +! G**(3/2) +! +! XAHENY = a2 C**p k**q as given by Feingold +! +NAHEN = 81 ! Tabulation for each Kelvin degree in the range XTT-40 to XTT+40 +XAHENINTP1 = 1.0 +XAHENINTP2 = 0.5*REAL(NAHEN-1) - XTT +IF (HPARAM_CCN == 'TFH') THEN + ALLOCATE (XAHENY(NAHEN)) + ALLOCATE (XAHENF(NAHEN)) +! +! Compute constants for the calculation of Smax. +! XCSTHEN = 1/(rho_l 4 pi C (100)^k +! + XCSTHEN = 1.0 / ( XRHOLW*4.0*XPI*XCHEN*(100.0)**XKHEN ) + DO J1 = 1,NAHEN + ZTT = XTT + REAL(J1-(NAHEN-1)/2) ! T + ZLV = XLVTT+(XCPV-XCL)*(ZTT-XTT) ! Lv + ZPSI1 = (XG/(XRD*ZTT))*(XMV*ZLV/(XMD*XCPD*ZTT)-1.) ! Psi1 + ZG = 1.E-4*(6.224E-7 + 0.281E-7 * ZTT + 2.320E-10 * ZTT**2) * & ! G + XCHEN**(-0.127 + 2.668E-3 * ZTT + 7.583E-7 * ZTT**2) * & + XKHEN**(-0.214 + 9.416E-3 * ZTT - 1.173E-4 * ZTT**2) + ZAHENR = 1.E-2*(2.124E-3 + 3.373E-5 * ZTT + 9.632E-8 * ZTT**2) * & ! r_star + XCHEN**(-0.321 - 3.333E-4 * ZTT - 9.972E-6 * ZTT**2) * & + XKHEN**(-0.464 + 9.253E-3 * ZTT - 2.066E-5 * ZTT**2) + XAHENF(J1) = XCSTHEN*(ZPSI1/(ZG*ZAHENR)) +! + XAHENY(J1) = (7.128E-5 + 1.094E-6 * ZTT + 4.314E-9 * ZTT**2) * & ! y_bar + XCHEN**( 0.230 - 1.200E-4 * ZTT + 1.607E-5 * ZTT**2) * & + XKHEN**( 1.132 - 9.083E-3 * ZTT - 1.482E-5 * ZTT**2) + END DO +! +! Additional coefficients for the dependence on W +! + XWCOEF_F1 =-0.149 + XWCOEF_F2 = 1.514E-3 + XWCOEF_F3 = 4.375E-6 + XWCOEF_Y1 = 0.132 + XWCOEF_Y2 =-2.191E-3 + XWCOEF_Y3 = 3.934E-5 +ELSE + ALLOCATE (XAHENG(NAHEN)) + ALLOCATE (XPSI1(NAHEN)) + ALLOCATE (XPSI3(NAHEN)) +! +! Compute constants for the calculation of Smax. +! XCSTHEN = 1/(rho_l 2 pi k C B(k/2,3/2)) +! + XCSTHEN = 1.0 / ( XRHOLW*2.0*XPI*XKHEN*XCHEN*(100.0)**XKHEN * & + GAMMA(XKHEN/2.0)*GAMMA(3.0/2.0)/GAMMA((XKHEN+3.0)/2.0) ) + DO J1 = 1,NAHEN + ZTT = XTT + REAL(J1-(NAHEN-1)/2) ! T + ZLV = XLVTT+(XCPV-XCL)*(ZTT-XTT) ! Lv + XPSI1(J1) = (XG/(XRD*ZTT))*(XMV*ZLV/(XMD*XCPD*ZTT)-1.) ! Psi1 + XPSI3(J1) = -1*XMV*ZLV/(XMD*XRD*(ZTT**2)) ! Psi3 + ZG = 1./( XRHOLW*( (XRV*ZTT)/ & !G + (XDIVA*EXP(XALPW-(XBETAW/ZTT)-(XGAMW*ALOG(ZTT)))) & + + (ZLV/ZTT)**2/(XTHCO*XRV) ) ) + XAHENG(J1) = XCSTHEN/(ZG)**(3./2.) + END DO +END IF +! +! +!------------------------------------------------------------------------------- +! +! Parameters used to initialise the droplet and drop concentration +! from the respective mixing ratios (used in RESTART_RAIN_C2R2) +! +! Droplet case +! +IF( HPARAM_CCN=='CPB' ) THEN + XCONCC_INI = 0.8 * XCONC_CCN ! 80% of the maximum CCN conc. is assumed +ELSE + XCONCC_INI = XCHEN * (0.1)**XKHEN ! 0.1% supersaturation is assumed +END IF +! +! Raindrop case +! +XCONCR_PARAM_INI = (1.E7)**3/(XPI*XRHOLW) ! MP law with N_O=1.E7 m-1 is assumed +! +!------------------------------------------------------------------------------- +! +!* 6. CONSTANTS FOR THE COALESCENCE PROCESSES +! -------------------------------------- +! +! +!* 6.1 Csts for the coalescence processes +! +XKERA1 = 2.59E15 ! From Long a1=9.44E9 cm-3 so XKERA1= 9.44E9*1E6*(PI/6)**2 +XKERA2 = 3.03E3 ! From Long a2=5.78E3 so XKERA2= 5.78E3* (PI/6) +! +! Cst for the cloud droplet selfcollection process +! +XSELFC = XKERA1*ZGAMC(3) +! +! Cst for the autoconversion process +! +XAUTO1 = 6.25E18*(ZGAMC(2))**(1./3.)*SQRT(ZGAMC(4)) +XAUTO2 = 0.5E6*(ZGAMC(4))**(1./6.) +XLAUTR = 2.7E-2 +XLAUTR_THRESHOLD = 0.4 +XITAUTR= 0.27 ! (Notice that T2 of BR74 is uncorrect and that 0.27=1./3.7 +XITAUTR_THRESHOLD = 7.5 +XCAUTR = 3.5E9 +! +! Cst for the accretion process +! +XACCR1 = ZGAMR(2)**(1./3.) +XACCR2 = 5.0E-6 +XACCR3 = 12.6E-4 +XACCR4 = XAUTO2 +XACCR5 = 3.5 +XACCR6 = 1.2*XCAUTR +XACCR_CLARGE1 = XKERA2*ZGAMC(2) +XACCR_CLARGE2 = XKERA2*ZGAMR(2) +XACCR_RLARGE1 = XKERA2*ZGAMC(3)*XRHOLW*(XPI/6.0) +XACCR_RLARGE2 = XKERA2*ZGAMC(2)*ZGAMR(2)*XRHOLW*(XPI/6.0) +XACCR_CSMALL1 = XKERA1*ZGAMC(3) +XACCR_CSMALL2 = XKERA1*ZGAMR(3) +XACCR_RSMALL1 = XKERA1*ZGAMC(5)*XRHOLW*(XPI/6.0) +XACCR_RSMALL2 = XKERA1*ZGAMC(2)*ZGAMR(3)*XRHOLW*(XPI/6.0) +! +! Cst for the raindrop self-collection/breakup process +! +XSCBU2 = XKERA2*ZGAMR(2) +XSCBU3 = XKERA1*ZGAMR(3) +XSCBU_EFF1 = 0.6E-3 +XSCBU_EFF2 = 2.0E-3 +XSCBUEXP1 = -2500.0 +! +! +!------------------------------------------------------------------------------- +! +!* 7. CONSTANTS FOR THE "SONTANEOUS" BREAK-UP +! --------------------------------------- +! +XSPONBUD1 = 3.0E-3 +XSPONBUD2 = 4.0E-3 +XSPONBUD3 = 5.0E-3 +XSPONCOEF2 = ((XSPONBUD3/XSPONBUD2)**3 - 1.0)/(XSPONBUD3-XSPONBUD1)**2 +! +! +!------------------------------------------------------------------------------ +! +!* 8. CONSTANTS FOR EVAPORATION PROCESS +! --------------------------------- +! +X0CNDC = (4.0*XPI)*XC1C*XF0C*MOMG(XALPHAC,XNUC,1.) +X2CNDC = (4.0*XPI)*XC1C*XF2C*XCC*MOMG(XALPHAC,XNUC,XDC+2.0) +! +XEX0EVAR = -1.0 +XEX1EVAR = -1.0 - (XDR+1.0)*0.5 +XEX2EVAR = -0.5*XCEXVT +! +X0EVAR = (2.0*XPI)*XF0R*GAMMA(XNUR+1./XALPHAR)/GAMMA(XNUR) +X1EVAR = (2.0*XPI)*XF1R*((ZRHO00)**(XCEXVT)*(XCR/0.15E-4))**0.5* & + GAMMA(XNUR+(XDR+3.0)/(2.0*XALPHAR))/GAMMA(XNUR) +! +XEX0EVAR = 2.0 +XEX1EVAR = 2.0 - (XDR+1.0)*0.5 +XEX2EVAR = -0.5*XCEXVT +! +X0EVAR = (12.0)*XF0R*GAMMA(XNUR+1./XALPHAR)/GAMMA(XNUR+3./XALPHAR) +X1EVAR = (12.0)*XF1R*((ZRHO00)**(XCEXVT)*(XCR/0.15E-4))**0.5* & + GAMMA(XNUR+(XDR+3.0)/(2.0*XALPHAR))/GAMMA(XNUR+3./XALPHAR) +! +!------------------------------------------------------------------------------- +! +!* 9. SET-UP RADIATIVE PARAMETERS +! --------------------------- +! +! R_eff_c = XFREFFC * (rho*r_c/N_c)**(1/3) +! +! +XFREFFC = 0.5 * ZGAMC(6) * (1.0/XAC)**(1.0/3.0) +XFREFFR = 0.5 * ZGAMR(6) * (1.0/XAR)**(1.0/3.0) +! +! Coefficients used to compute reff when both cloud and rain are present +! +XCREC = 1.0/ (ZGAMC(6) * XAC**(2.0/3.0)) +XCRER = 1.0/ (ZGAMR(6) * XAR**(2.0/3.0)) +! +!------------------------------------------------------------------------------- +! +!* 10. SOME PRINTS FOR CONTROL +! ----------------------- +! +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=ILUOUT0,FMT='(" Summary of the cloud particule characteristics")') + WRITE(UNIT=ILUOUT0,FMT='(" CLOUD")') + WRITE(UNIT=ILUOUT0,FMT='(" masse: A=",E13.6," B=",E13.6)') & + XAR,XBR + WRITE(UNIT=ILUOUT0,FMT='(" vitesse: C=",E13.6," D=",E13.6)') & + XCC,XDC + WRITE(UNIT=ILUOUT0,FMT='(" distribution:AL=",E13.6,"NU=",E13.6)') & + XALPHAC,XNUC + WRITE(UNIT=ILUOUT0,FMT='(" RAIN")') + WRITE(UNIT=ILUOUT0,FMT='(" masse: A=",E13.6," B=",E13.6)') & + XAR,XBR + WRITE(UNIT=ILUOUT0,FMT='(" vitesse: C=",E13.6," D=",E13.6)') & + XCR,XDR + WRITE(UNIT=ILUOUT0,FMT='(" distribution:AL=",E13.6,"NU=",E13.6)') & + XALPHAR,XNUR + WRITE(UNIT=ILUOUT0,FMT='(" Description of the nucleation spectrum")') + WRITE(UNIT=ILUOUT0,FMT='(" C=",E13.6," k=",E13.6)') XCHEN, XKHEN + WRITE(UNIT=ILUOUT0,FMT='(" Beta=",E13.6," MU=",E13.6)') XBETAHEN, XMUHEN + WRITE(UNIT=ILUOUT0,FMT='(" CCN max=",E13.6)') XCONC_CCN +END IF +! +!------------------------------------------------------------------------------- +! +!* 11. Constants only for KHKO scheme +! --------------------------- +! +!* 11.1 Cst for the coalescence processes +! +XR0 = 25.0E-6 +! +!* 11.2 Cst for evaporation processes +! +XCEVAP = 0.86 +! +!------------------------------------------------------------------------------- +! +CONTAINS +! +!------------------------------------------------------------------------------ +! + FUNCTION MOMG (PALPHA,PNU,PP) RESULT (PMOMG) +! +! auxiliary routine used to compute the Pth moment order of the generalized +! gamma law +! + USE MODI_GAMMA +! + IMPLICIT NONE +! + REAL :: PALPHA ! first shape parameter of the dimensionnal distribution + REAL :: PNU ! second shape parameter of the dimensionnal distribution + REAL :: PP ! order of the moment + REAL :: PMOMG ! result: moment of order ZP +! +!------------------------------------------------------------------------------ +! +! + PMOMG = GAMMA(PNU+PP/PALPHA)/GAMMA(PNU) +! + END FUNCTION MOMG +! +!------------------------------------------------------------------------------ +! +! +END SUBROUTINE INI_RAIN_C2R2 diff --git a/src/mesonh/micro/ini_rain_ice.f90 b/src/mesonh/micro/ini_rain_ice.f90 new file mode 100644 index 000000000..62cabad5b --- /dev/null +++ b/src/mesonh/micro/ini_rain_ice.f90 @@ -0,0 +1,1408 @@ +!MNH_LIC Copyright 1995-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ######spl + MODULE MODI_INI_RAIN_ICE +! ######################## +! +INTERFACE + SUBROUTINE INI_RAIN_ICE ( KLUOUT, PTSTEP, PDZMIN, KSPLITR, HCLOUD ) +! +INTEGER, INTENT(IN) :: KLUOUT ! Logical unit number for prints +INTEGER, INTENT(OUT):: KSPLITR ! Number of small time step + ! integration for rain + ! sedimendation +! +REAL, INTENT(IN) :: PTSTEP ! Effective Time step +! +REAL, INTENT(IN) :: PDZMIN ! minimun vertical mesh size +! +CHARACTER (LEN=4), INTENT(IN) :: HCLOUD ! Indicator of the cloud scheme +! +END SUBROUTINE INI_RAIN_ICE +! +END INTERFACE +! +END MODULE MODI_INI_RAIN_ICE +! ######spl + SUBROUTINE INI_RAIN_ICE ( KLUOUT, PTSTEP, PDZMIN, KSPLITR, HCLOUD ) +! ########################################################### +! +!!**** *INI_RAIN_ICE * - initialize the constants necessary for the warm and +!! cold microphysical schemes. +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to initialize the constants used to +!! resolve the mixed phase microphysical scheme. The collection kernels of +!! the precipitating particles are recomputed if necessary if some parameters +!! defining the ice categories have been modified. The number of small +!! time steps leading to stable scheme for the rain, ice, snow and ggraupeln +!! sedimentation is also computed (time-splitting technique). +!! +!!** METHOD +!! ------ +!! The constants are initialized to their numerical values and the number +!! of small time step is computed by dividing the 2* Deltat time interval of +!! the Leap-frog scheme so that the stability criterion for the rain +!! sedimentation is fulfilled for a Raindrop maximal fall velocity equal +!! VTRMAX. The parameters defining the collection kernels are read and are +!! checked against the new ones. If any change occurs, these kernels are +!! recomputed and their numerical values are written in the output listing. +!! +!! EXTERNAL +!! -------- +!! GAMMA : gamma function +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST +!! XPI ! +!! XP00 ! Reference pressure +!! XRD ! Gaz constant for dry air +!! XRHOLW ! Liquid water density +!! Module MODD_REF +!! XTHVREFZ ! Reference virtual pot.temp. without orography +!! Module MODD_PARAMETERS +!! JPVEXT ! +!! Module MODD_RAIN_ICE_DESCR +!! Module MODD_RAIN_ICE_PARAM +!! +!! REFERENCE +!! --------- +!! Book2 of documentation ( routine INI_RAIN_ICE ) +!! +!! AUTHOR +!! ------ +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original 04/12/95 +!! J.-P. Pinty 05/04/96 Add automatic control and regeneration of the +!! collection kernels +!! J.-P. Pinty 10/05/96 Correction of ZRATE and computations of RIM +!! J.-P. Pinty 24/11/97 Sedimentation of ice made for Columns and bug for XAG +!! J.-P. Lafore 23/11/98 Back to Lin et al. 83 formulation for RIAUTS +!! with a Critical ice content set to .5 g/Kg +!! N. Asencio 13/08/98 parallel code: PDZMIN is computed outside in ini_modeln +!! J.-P. Lafore 12/8/98 In case of nesting microphysics constants of +!! MODD_RAIN_ICE_PARAM are computed only once. +!! Only KSPLTR is computed for each model. +!! J. Stein 20/04/99 remove 2 unused local variables +!! G Molinie 21/05/99 Bug in XEXRCFRI and XRCFRI +!! J.-P. Pinty 24/06/00 Bug in RCRIMS +!! J.-P. Pinty 24/12/00 Update hail case +!! J.-P. Chaboureau & J.-P. Pinty +!! 24/03/01 Update XCRIAUTI for cirrus cases +!! J.-P. Pinty 24/11/01 Update ICE3/ICE4 options +!! S. Riette 2016-11: new ICE3/ICE4 options +!! P. Wautelet 22/01/2019 bug correction: incorrect write +! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_LUNIT +USE MODD_PARAMETERS +USE MODD_PARAM_ICE +USE MODD_RAIN_ICE_DESCR +USE MODD_RAIN_ICE_PARAM +USE MODD_REF +! +USE MODI_GAMMA +USE MODI_GAMMA_INC +USE MODI_RRCOLSS +USE MODI_RZCOLX +USE MODI_RSCOLRG +USE MODI_READ_XKER_RACCS +USE MODI_READ_XKER_SDRYG +USE MODI_READ_XKER_RDRYG +USE MODI_READ_XKER_SWETH +USE MODI_READ_XKER_GWETH +USE MODI_READ_XKER_RWETH +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +! +INTEGER, INTENT(IN) :: KLUOUT ! Logical unit number for prints +INTEGER, INTENT(OUT):: KSPLITR ! Number of small time step + ! integration for rain + ! sedimendation +! +REAL, INTENT(IN) :: PTSTEP ! Effective Time step +! +REAL, INTENT(IN) :: PDZMIN ! minimun vertical mesh size +! +CHARACTER (LEN=4), INTENT(IN) :: HCLOUD ! Indicator of the cloud scheme +! +! +! +!* 0.2 Declarations of local variables : +! +INTEGER :: IKB ! Coordinates of the first physical + ! points along z +INTEGER :: J1,J2 ! Internal loop indexes +REAL :: ZT ! Work variable +REAL :: ZVTRMAX ! Raindrop maximal fall velocity +REAL :: ZRHO00 ! Surface reference air density +REAL :: ZE, ZRV ! Work array for ZRHO00 computation +REAL :: ZRATE ! Geometrical growth of Lbda in the tabulated + ! functions and kernels +REAL :: ZBOUND ! XDCSLIM*Lbda_s: upper bound for the partial + ! integration of the riming rate of the aggregates +REAL :: ZEGS, ZEGR, ZEHS, & ! Bulk collection efficiencies + & ZEHG, ZEHR +! +INTEGER :: IND ! Number of interval to integrate the kernels +REAL :: ZESR ! Mean efficiency of rain-aggregate collection +REAL :: ZFDINFTY ! Factor used to define the "infinite" diameter +! +! +! +LOGICAL :: GFLAG ! Logical flag for printing the constatnts on the output + ! listing +REAL :: ZCONC_MAX ! Maximal concentration for snow +REAL :: ZGAMC,ZGAMC2 ! parameters + ! involving various moments of the generalized gamma law +REAL :: ZFACT_NUCL! Amplification factor for the minimal ice concentration +REAL :: ZXR ! Value of x_r in N_r = C_r lambda_r ** x_r +! +INTEGER :: KND +INTEGER :: KACCLBDAS,KACCLBDAR,KDRYLBDAG,KDRYLBDAS,KDRYLBDAR +INTEGER :: KWETLBDAS,KWETLBDAG,KWETLBDAR,KWETLBDAH +REAL :: PALPHAR,PALPHAS,PALPHAG,PALPHAH +REAL :: PNUR,PNUS,PNUG,PNUH +REAL :: PBR,PBS,PBG +REAL :: PCR,PCS,PCG,PCH +REAL :: PDR,PDS,PDG,PDH +REAL :: PESR,PEGS,PEGR,PEHS,PEHG,PEHR +REAL :: PFDINFTY +REAL :: PACCLBDAS_MAX,PACCLBDAR_MAX,PACCLBDAS_MIN,PACCLBDAR_MIN +REAL :: PDRYLBDAG_MAX,PDRYLBDAS_MAX,PDRYLBDAG_MIN,PDRYLBDAS_MIN +REAL :: PDRYLBDAR_MAX,PDRYLBDAR_MIN +REAL :: PWETLBDAS_MAX,PWETLBDAG_MAX,PWETLBDAS_MIN,PWETLBDAG_MIN +REAL :: PWETLBDAR_MAX,PWETLBDAH_MAX,PWETLBDAR_MIN,PWETLBDAH_MIN +!------------------------------------------------------------------------------- +! +! +!* 0. FUNCTION STATEMENTS +! ------------------- +! +! +!* 0.1 p_moment of the Generalized GAMMA function +! +! +! +! 1. COMPUTE KSPLTR FOR EACH MODEL +! --------------------------------------------------------- +! +!* 1.1 Set the hailstones maximum fall velocity +! +IF (CSEDIM == 'SPLI' .AND. .NOT. LRED ) THEN + IF (HCLOUD == 'ICE4') THEN + ZVTRMAX = 40. + ELSE IF (HCLOUD == 'ICE3') THEN + ZVTRMAX = 10. + END IF +END IF +! +!* 1.2 Compute the number of small time step integration +! +KSPLITR = 1 +IF (CSEDIM == 'SPLI' .AND. .NOT. LRED ) THEN + SPLIT : DO + ZT = PTSTEP / REAL(KSPLITR) + IF ( ZT * ZVTRMAX / PDZMIN .LT. 1.) EXIT SPLIT + KSPLITR = KSPLITR + 1 + END DO SPLIT +END IF +! +IF (ALLOCATED(XRTMIN)) THEN ! In case of nesting microphysics constants of + ! MODD_RAIN_ICE_PARAM are computed only once, + ! but if INI_RAIN_ICE has been called already + ! one must change the XRTMIN size. + DEALLOCATE(XRTMIN) +END IF +! +!------------------------------------------------------------------------------- +! +!* 2. CHARACTERISTICS OF THE SPECIES +! ------------------------------ +! +! +!* 2.1 Cloud droplet and Raindrop characteristics +! +XAC = (XPI/6.0)*XRHOLW +XBC = 3.0 +XCC = XRHOLW*XG/(18.0*1.7E-5) ! Stokes flow (Pruppacher p 322 for T=273K) +XDC = 2.0 +! +! +XAR = (XPI/6.0)*XRHOLW +XBR = 3.0 +XCR = 842. +XDR = 0.8 +! +!XCCR = 1.E7 ! N0_r = XCXR * lambda_r ** ZXR +XCCR = 8.E6 ! N0_r = XCXR * lambda_r ** ZXR +ZXR = -1. ! +! +XF0R = 1.00 +XF1R = 0.26 +! +XC1R = 1./2. +! +! +!* 2.2 Ice crystal characteristics +! +! +SELECT CASE (CPRISTINE_ICE) + CASE('PLAT') + XAI = 0.82 ! Plates + XBI = 2.5 ! Plates + XC_I = 800. ! Plates + XDI = 1.0 ! Plates + XC1I = 1./XPI ! Plates + CASE('COLU') + XAI = 2.14E-3 ! Columns + XBI = 1.7 ! Columns + XC_I = 2.1E5 ! Columns + XDI = 1.585 ! Columns + XC1I = 0.8 ! Columns + CASE('BURO') + XAI = 44.0 ! Bullet rosettes + XBI = 3.0 ! Bullet rosettes + XC_I = 4.3E5 ! Bullet rosettes + XDI = 1.663 ! Bullet rosettes + XC1I = 0.5 ! Bullet rosettes +END SELECT +! +! Note that XCCI=N_i (a locally predicted value) and XCXI=0.0, implicitly +! +XF0I = 1.00 +XF2I = 0.14 +! +! +!* 2.3 Snowflakes/aggregates characteristics +! +! +XAS = 0.02 +XBS = 1.9 +XCS = 5.1 +XDS = 0.27 +! +XCCS = 5.0 +XCXS = 1.0 +! +XF0S = 0.86 +XF1S = 0.28 +! +XC1S = 1./XPI +! +! +!* 2.4 Graupel/Frozen drop characteristics +! +! +XAG = 19.6 ! Lump graupel case +XBG = 2.8 ! Lump graupel case +XCG = 124. ! Lump graupel case +XDG = 0.66 ! Lump graupel case +! +XCCG = 5.E5 +XCXG = -0.5 +! XCCG = 4.E4 ! Test of Ziegler (1988) +! XCXG = -1.0 ! Test of Ziegler (1988) +! +XF0G = 0.86 +XF1G = 0.28 +! +XC1G = 1./2. +! +! +!* 2.5 Hailstone characteristics +! +! +XAH = 470. +XBH = 3.0 +XCH = 207. +XDH = 0.64 +! +!XCCH = 5.E-4 +!XCXH = 2.0 +!!!!!!!!!!!! + XCCH = 4.E4 ! Test of Ziegler (1988) + XCXH = -1.0 ! Test of Ziegler (1988) +!!! XCCH = 5.E5 ! Graupel_like +!!! XCXH = -0.5 ! Graupel_like +!!!!!!!!!!!! +! +XF0H = 0.86 +XF1H = 0.28 +! +XC1H = 1./2. +! +!------------------------------------------------------------------------------- +! +!* 3. DIMENSIONAL DISTRIBUTIONS OF THE SPECIES +! ---------------------------------------- +! +! +! 3.1 Cloud droplet distribution +! +! Over land +XALPHAC = 1.0 ! Gamma law of the Cloud droplet (here volume-like distribution) +XNUC = 3.0 ! Gamma law with little dispersion +! +! +! Over sea +XALPHAC2 = 3.0 ! Gamma law of the Cloud droplet (here volume-like distribution) +XNUC2 = 1.0 ! Gamma law with little dispersion +! +!* 3.2 Raindrops distribution +! +XALPHAR = 1.0 ! Exponential law +XNUR = 1.0 ! Exponential law +! +!* 3.3 Ice crystal distribution +! +XALPHAI = 3.0 ! Gamma law for the ice crystal volume +XNUI = 3.0 ! Gamma law with little dispersion +! +XALPHAS = 1.0 ! Exponential law +XNUS = 1.0 ! Exponential law +! +XALPHAG = 1.0 ! Exponential law +XNUG = 1.0 ! Exponential law +! +XALPHAH = 1.0 ! Gamma law +XNUH = 8.0 ! Gamma law with little dispersion +! +!* 3.4 Constants for shape parameter +! +ZGAMC = MOMG(XALPHAC,XNUC,3.) +ZGAMC2 = MOMG(XALPHAC2,XNUC2,3.) +XLBC(1) = XAR*ZGAMC +XLBC(2) = XAR*ZGAMC2 +XLBEXC = 1.0/XBC +! +XLBEXR = 1.0/(-1.0-XBR) +XLBR = ( XAR*XCCR*MOMG(XALPHAR,XNUR,XBR) )**(-XLBEXR) +! +XLBEXI = 1.0/(-XBI) +XLBI = ( XAI*MOMG(XALPHAI,XNUI,XBI) )**(-XLBEXI) +! +XLBEXS = 1.0/(XCXS-XBS) +XLBS = ( XAS*XCCS*MOMG(XALPHAS,XNUS,XBS) )**(-XLBEXS) +! +XLBEXG = 1.0/(XCXG-XBG) +XLBG = ( XAG*XCCG*MOMG(XALPHAG,XNUG,XBG) )**(-XLBEXG) +! +XLBEXH = 1.0/(XCXH-XBH) +XLBH = ( XAH*XCCH*MOMG(XALPHAH,XNUH,XBH) )**(-XLBEXH) +! +!* 3.5 Minimal values allowed for the mixing ratios +! +XLBDAS_MAX = 100000.0 +! +ZCONC_MAX = 1.E6 ! Maximal concentration for falling particules set to 1 per cc +XLBDAS_MAX = ( ZCONC_MAX/XCCS )**(1./XCXS) +! +IF (HCLOUD == 'ICE4') THEN + ALLOCATE( XRTMIN(7) ) +ELSE IF (HCLOUD == 'ICE3') THEN + ALLOCATE( XRTMIN(6) ) +END IF +! +XRTMIN(1) = 1.0E-20 +XRTMIN(2) = 1.0E-20 +XRTMIN(3) = 1.0E-20 +XRTMIN(4) = 1.0E-20 +XRTMIN(5) = 1.0E-15 +XRTMIN(6) = 1.0E-15 +IF (HCLOUD == 'ICE4') XRTMIN(7) = 1.0E-15 +! +XCONC_SEA=1E8 ! 100/cm3 +XCONC_LAND=3E8 ! 300/cm3 +XCONC_URBAN=5E8 ! 500/cm3 +! +!------------------------------------------------------------------------------- +! +!* 4. CONSTANTS FOR THE SEDIMENTATION +! ------------------------------- +! +! +!* 4.1 Exponent of the fall-speed air density correction +! +XCEXVT = 0.4 +! +IKB = 1 + JPVEXT +!ZRHO00 = XP00/(XRD*XTHVREFZ(IKB)) +!According to Foote and Du Toit (1969) and List (1958), ZRHO00 must be computed for Hu=50%, P=101325Pa and T=293.15K +ZE = (50./100.) * EXP(XALPW-XBETAW/293.15-XGAMW*LOG(293.15)) +ZRV = (XRD/XRV) * ZE / (101325.-ZE) +ZRHO00 = 101325.*(1.+ZRV)/(XRD+ZRV*XRV)/293.15 +! +!* 4.2 Constants for sedimentation +! +XFSEDC(1) = GAMMA(XNUC+(XDC+3.)/XALPHAC)/GAMMA(XNUC+3./XALPHAC)* & + (ZRHO00)**XCEXVT +XFSEDC(2) = GAMMA(XNUC2+(XDC+3.)/XALPHAC2)/GAMMA(XNUC2+3./XALPHAC2)* & + (ZRHO00)**XCEXVT +! +XEXSEDR = (XBR+XDR+1.0)/(XBR+1.0) +XFSEDR = XCR*XAR*XCCR*MOMG(XALPHAR,XNUR,XBR+XDR)* & + (XAR*XCCR*MOMG(XALPHAR,XNUR,XBR))**(-XEXSEDR)*(ZRHO00)**XCEXVT +! +XEXRSEDI = (XBI+XDI)/XBI +XEXCSEDI = 1.0-XEXRSEDI +XFSEDI = (4.*XPI*900.)**(-XEXCSEDI) * & + XC_I*XAI*MOMG(XALPHAI,XNUI,XBI+XDI) * & + ((XAI*MOMG(XALPHAI,XNUI,XBI)))**(-XEXRSEDI) * & + (ZRHO00)**XCEXVT +!When we do not use computations for columns, I think we must uncomment line just below +!XEXCSEDI = XEXCSEDI * 3. to be checked +! +! Computations made for Columns +! +XEXRSEDI = 1.9324 +XEXCSEDI =-0.9324 +XFSEDI = 3.89745E11*MOMG(XALPHAI,XNUI,3.285)* & + MOMG(XALPHAI,XNUI,1.7)**(-XEXRSEDI)*(ZRHO00)**XCEXVT +XEXCSEDI =-0.9324*3.0 +WRITE (KLUOUT,FMT=*)' PRISTINE ICE SEDIMENTATION for columns XFSEDI =',XFSEDI +! +! +XEXSEDS = (XBS+XDS-XCXS)/(XBS-XCXS) +XFSEDS = XCS*XAS*XCCS*MOMG(XALPHAS,XNUS,XBS+XDS)* & + (XAS*XCCS*MOMG(XALPHAS,XNUS,XBS))**(-XEXSEDS)*(ZRHO00)**XCEXVT +! +XEXSEDG = (XBG+XDG-XCXG)/(XBG-XCXG) +XFSEDG = XCG*XAG*XCCG*MOMG(XALPHAG,XNUG,XBG+XDG)* & + (XAG*XCCG*MOMG(XALPHAG,XNUG,XBG))**(-XEXSEDG)*(ZRHO00)**XCEXVT +! +XEXSEDH = (XBH+XDH-XCXH)/(XBH-XCXH) +XFSEDH = XCH*XAH*XCCH*MOMG(XALPHAH,XNUH,XBH+XDH)* & + (XAH*XCCH*MOMG(XALPHAH,XNUH,XBH))**(-XEXSEDH)*(ZRHO00)**XCEXVT +! +! +!------------------------------------------------------------------------------- +! +!* 5. CONSTANTS FOR THE SLOW COLD PROCESSES +! ------------------------------------- +! +! +!* 5.1 Constants for ice nucleation +! +SELECT CASE (CPRISTINE_ICE) + CASE('PLAT') + ZFACT_NUCL = 1.0 ! Plates + CASE('COLU') + ZFACT_NUCL = 25.0 ! Columns + CASE('BURO') + ZFACT_NUCL = 17.0 ! Bullet rosettes +END SELECT +! +XNU10 = 50.*ZFACT_NUCL +XALPHA1 = 4.5 +XBETA1 = 0.6 +! +XNU20 = 1000.*ZFACT_NUCL +XALPHA2 = 12.96 +XBETA2 = 0.639 +! +XMNU0 = 6.88E-13 +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=KLUOUT,FMT='(" Heterogeneous nucleation")') + WRITE(UNIT=KLUOUT,FMT='(" NU10=",E13.6," ALPHA1=",E13.6," BETA1=",E13.6)') & + XNU10,XALPHA1,XBETA1 + WRITE(UNIT=KLUOUT,FMT='(" NU20=",E13.6," ALPHA2=",E13.6," BETA2=",E13.6)') & + XNU20,XALPHA2,XBETA2 + WRITE(UNIT=KLUOUT,FMT='(" mass of embryo XMNU0=",E13.6)') XMNU0 +END IF +! +XALPHA3 = -3.075 +XBETA3 = 81.00356 +XHON = (XPI/6.)*((2.0*3.0*4.0*5.0*6.0)/(2.0*3.0))*(1.1E5)**(-3.0) ! + ! Pi/6 * (G_c(6)/G_c(3)) * (1/Lbda_c**3) + ! avec Lbda_c=1.1E5 m^-1 + ! the formula is equivalent to + ! rho_dref * r_c G(6) + ! Pi/6 * -------------- * --------- + ! rho_lw * N_c G(3)*G(3) +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=KLUOUT,FMT='(" Homogeneous nucleation")') + WRITE(UNIT=KLUOUT,FMT='(" ALPHA3=",E13.6," BETA3=",E13.6)') XALPHA3,XBETA3 + WRITE(UNIT=KLUOUT,FMT='(" constant XHON=",E13.6)') XHON +END IF +! +! +!* 5.2 Constants for vapor deposition on ice +! +XSCFAC = (0.63**(1./3.))*SQRT((ZRHO00)**XCEXVT) ! One assumes Sc=0.63 +! +X0DEPI = (4.0*XPI)*XC1I*XF0I*MOMG(XALPHAI,XNUI,1.) +X2DEPI = (4.0*XPI)*XC1I*XF2I*XC_I*MOMG(XALPHAI,XNUI,XDI+2.0) +! +X0DEPS = (4.0*XPI)*XCCS*XC1S*XF0S*MOMG(XALPHAS,XNUS,1.) +X1DEPS = (4.0*XPI)*XCCS*XC1S*XF1S*SQRT(XCS)*MOMG(XALPHAS,XNUS,0.5*XDS+1.5) +XEX0DEPS = XCXS-1.0 +XEX1DEPS = XCXS-0.5*(XDS+3.0) +! +X0DEPG = (4.0*XPI)*XCCG*XC1G*XF0G*MOMG(XALPHAG,XNUG,1.) +X1DEPG = (4.0*XPI)*XCCG*XC1G*XF1G*SQRT(XCG)*MOMG(XALPHAG,XNUG,0.5*XDG+1.5) +XEX0DEPG = XCXG-1.0 +XEX1DEPG = XCXG-0.5*(XDG+3.0) +! +X0DEPH = (4.0*XPI)*XCCH*XC1H*XF0H*MOMG(XALPHAH,XNUH,1.) +X1DEPH = (4.0*XPI)*XCCH*XC1H*XF1H*SQRT(XCH)*MOMG(XALPHAH,XNUH,0.5*XDH+1.5) +XEX0DEPH = XCXH-1.0 +XEX1DEPH = XCXH-0.5*(XDH+3.0) +! +!* 5.3 Constants for pristine ice autoconversion +! +XTIMAUTI = 1.E-3 ! Time constant at T=T_t +XTEXAUTI = 0.015 ! Temperature factor of the I+I collection efficiency +!!XCRIAUTI = 0.25E-3 ! Critical ice content for the autoconversion to occur +XCRIAUTI = 0.2E-4 ! Critical ice content for the autoconversion to occur + ! Revised value by Chaboureau et al. (2001) +XACRIAUTI=0.06 +XBCRIAUTI=-3.5 +XT0CRIAUTI=(LOG10(XCRIAUTI)-XBCRIAUTI)/0.06 + +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=KLUOUT,FMT='(" pristine ice autoconversion")') + WRITE(UNIT=KLUOUT,FMT='(" Time constant XTIMAUTI=",E13.6)') XTIMAUTI + WRITE(UNIT=KLUOUT,FMT='(" Temp. factor XTEXAUTI=",E13.6)') XTEXAUTI + WRITE(UNIT=KLUOUT,FMT='(" Crit. ice cont. XCRIAUTI=",E13.6)') XCRIAUTI + WRITE(UNIT=KLUOUT,FMT='(" A Coef. for cirrus law XACRIAUTI=",E13.6)')XACRIAUTI + WRITE(UNIT=KLUOUT,FMT='(" B Coef. for cirrus law XBCRIAUTI=",E13.6)')XBCRIAUTI + WRITE(UNIT=KLUOUT,FMT='(" Temp degC at which cirrus law starts to be used=",E13.6)') XT0CRIAUTI +END IF +! +! +!* 5.4 Constants for snow aggregation +! +XCOLIS = 0.25 ! Collection efficiency of I+S +XCOLEXIS = 0.05 ! Temperature factor of the I+S collection efficiency +XFIAGGS = (XPI/4.0)*XCOLIS*XCCS*XCS*(ZRHO00**XCEXVT)*MOMG(XALPHAS,XNUS,XDS+2.0) +XEXIAGGS = XCXS-XDS-2.0 +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=KLUOUT,FMT='(" snow aggregation")') + WRITE(UNIT=KLUOUT,FMT='(" Coll. efficiency XCOLIS=",E13.6)') XCOLIS + WRITE(UNIT=KLUOUT,FMT='(" Temp. factor XCOLEXIS=",E13.6)') XCOLEXIS +END IF +! +! +!------------------------------------------------------------------------------- +! +!* 6. CONSTANTS FOR THE SLOW WARM PROCESSES +! ------------------------------------- +! +! +!* 6.1 Constants for the cloud droplets autoconversion +! +XTIMAUTC = 1.E-3 +XCRIAUTC = 0.5E-3 +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=KLUOUT,FMT='(" cloud droplets autoconversion")') + WRITE(UNIT=KLUOUT,FMT='(" Time constant XTIMAUTC=",E13.6)') XTIMAUTC + WRITE(UNIT=KLUOUT,FMT='(" Crit. ice cont. XCRIAUTC=",E13.6)') XCRIAUTC +END IF +! +!* 6.2 Constants for the accretion of cloud droplets by raindrops +! +XFCACCR = (XPI/4.0)*XCCR*XCR*(ZRHO00**XCEXVT)*MOMG(XALPHAR,XNUR,XDR+2.0) +XEXCACCR = -XDR-3.0 +! +!* 6.3 Constants for the evaporation of the raindrops +! +X0EVAR = (4.0*XPI)*XCCR*XC1R*XF0R*MOMG(XALPHAR,XNUR,1.) +X1EVAR = (4.0*XPI)*XCCR*XC1R*XF1R*SQRT(XCR)*MOMG(XALPHAR,XNUR,0.5*XDR+1.5) +XEX0EVAR = -2.0 +XEX1EVAR = -1.0-0.5*(XDR+3.0) +! +! +!------------------------------------------------------------------------------- +! +!* 7. CONSTANTS FOR THE FAST COLD PROCESSES FOR THE AGGREGATES +! -------------------------------------------------------- +! +! +!* 7.1 Constants for the riming of the aggregates +! +XDCSLIM = 0.007 ! D_cs^lim = 7 mm as suggested by Farley et al. (1989) +XCOLCS = 1.0 +XEXCRIMSS= XCXS-XDS-2.0 +XCRIMSS = (XPI/4.0)*XCOLCS*XCCS*XCS*(ZRHO00**XCEXVT)*MOMG(XALPHAS,XNUS,XDS+2.0) +XEXCRIMSG= XEXCRIMSS +XCRIMSG = XCRIMSS +XSRIMCG = XCCS*XAS*MOMG(XALPHAS,XNUS,XBS) +XEXSRIMCG= XCXS-XBS +XSRIMCG2 = XCCS*XAG*MOMG(XALPHAS,XNUS,XBG) +XSRIMCG3 = XFRACM90 +XEXSRIMCG2=XCXS-XBG +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=KLUOUT,FMT='(" riming of the aggregates")') + WRITE(UNIT=KLUOUT,FMT='(" D_cs^lim (Farley et al.) XDCSLIM=",E13.6)') XDCSLIM + WRITE(UNIT=KLUOUT,FMT='(" Coll. efficiency XCOLCS=",E13.6)') XCOLCS +END IF +! +NGAMINC = 80 +XGAMINC_BOUND_MIN = 1.0E-1 ! Minimal value of (Lbda * D_cs^lim)**alpha +XGAMINC_BOUND_MAX = 1.0E7 ! Maximal value of (Lbda * D_cs^lim)**alpha +ZRATE = EXP(LOG(XGAMINC_BOUND_MAX/XGAMINC_BOUND_MIN)/REAL(NGAMINC-1)) +! +IF( .NOT.ALLOCATED(XGAMINC_RIM1) ) ALLOCATE( XGAMINC_RIM1(NGAMINC) ) +IF( .NOT.ALLOCATED(XGAMINC_RIM2) ) ALLOCATE( XGAMINC_RIM2(NGAMINC) ) +IF( .NOT.ALLOCATED(XGAMINC_RIM4) ) ALLOCATE( XGAMINC_RIM4(NGAMINC) ) +! +DO J1=1,NGAMINC + ZBOUND = XGAMINC_BOUND_MIN*ZRATE**(J1-1) + XGAMINC_RIM1(J1) = GAMMA_INC(XNUS+(2.0+XDS)/XALPHAS,ZBOUND) + XGAMINC_RIM2(J1) = GAMMA_INC(XNUS+XBS/XALPHAS ,ZBOUND) + XGAMINC_RIM4(J1) = GAMMA_INC(XNUS+XBG/XALPHAS ,ZBOUND) +END DO +! +XRIMINTP1 = XALPHAS / LOG(ZRATE) +XRIMINTP2 = 1.0 + XRIMINTP1*LOG( XDCSLIM/(XGAMINC_BOUND_MIN)**(1.0/XALPHAS) ) +! +!* 7.2 Constants for the accretion of raindrops onto aggregates +! +XFRACCSS = ((XPI**2)/24.0)*XCCS*XCCR*XRHOLW*(ZRHO00**XCEXVT) +! +XLBRACCS1 = MOMG(XALPHAS,XNUS,2.)*MOMG(XALPHAR,XNUR,3.) +XLBRACCS2 = 2.*MOMG(XALPHAS,XNUS,1.)*MOMG(XALPHAR,XNUR,4.) +XLBRACCS3 = MOMG(XALPHAR,XNUR,5.) +! +XFSACCRG = (XPI/4.0)*XAS*XCCS*XCCR*(ZRHO00**XCEXVT) +! +XLBSACCR1 = MOMG(XALPHAR,XNUR,2.)*MOMG(XALPHAS,XNUS,XBS) +XLBSACCR2 = 2.*MOMG(XALPHAR,XNUR,1.)*MOMG(XALPHAS,XNUS,XBS+1.) +XLBSACCR3 = MOMG(XALPHAS,XNUS,XBS+2.) +! +!* 7.2.1 Defining the ranges for the computation of the kernels +! +! Notice: One magnitude of lambda discretized over 10 points for rain +! Notice: One magnitude of lambda discretized over 10 points for snow +! +NACCLBDAS = 40 +XACCLBDAS_MIN = 5.0E1 ! Minimal value of Lbda_s to tabulate XKER_RACCS +XACCLBDAS_MAX = 5.0E5 ! Maximal value of Lbda_s to tabulate XKER_RACCS +ZRATE = LOG(XACCLBDAS_MAX/XACCLBDAS_MIN)/REAL(NACCLBDAS-1) +XACCINTP1S = 1.0 / ZRATE +XACCINTP2S = 1.0 - LOG( XACCLBDAS_MIN ) / ZRATE +NACCLBDAR = 40 +XACCLBDAR_MIN = 1.0E3 ! Minimal value of Lbda_r to tabulate XKER_RACCS +XACCLBDAR_MAX = 1.0E7 ! Maximal value of Lbda_r to tabulate XKER_RACCS +ZRATE = LOG(XACCLBDAR_MAX/XACCLBDAR_MIN)/REAL(NACCLBDAR-1) +XACCINTP1R = 1.0 / ZRATE +XACCINTP2R = 1.0 - LOG( XACCLBDAR_MIN ) / ZRATE +! +!* 7.2.2 Computations of the tabulated normalized kernels +! +IND = 50 ! Interval number, collection efficiency and infinite diameter +ZESR = 1.0 ! factor used to integrate the dimensional distributions when +ZFDINFTY = 20.0 ! computing the kernels XKER_RACCSS, XKER_RACCS and XKER_SACCRG +! +IF( .NOT.ALLOCATED(XKER_RACCSS) ) ALLOCATE( XKER_RACCSS(NACCLBDAS,NACCLBDAR) ) +IF( .NOT.ALLOCATED(XKER_RACCS ) ) ALLOCATE( XKER_RACCS (NACCLBDAS,NACCLBDAR) ) +IF( .NOT.ALLOCATED(XKER_SACCRG) ) ALLOCATE( XKER_SACCRG(NACCLBDAR,NACCLBDAS) ) +! +CALL READ_XKER_RACCS (KACCLBDAS,KACCLBDAR,KND, & + PALPHAS,PNUS,PALPHAR,PNUR,PESR,PBS,PBR,PCS,PDS,PCR,PDR, & + PACCLBDAS_MAX,PACCLBDAR_MAX,PACCLBDAS_MIN,PACCLBDAR_MIN,& + PFDINFTY ) +IF( (KACCLBDAS/=NACCLBDAS) .OR. (KACCLBDAR/=NACCLBDAR) .OR. (KND/=IND) .OR. & + (PALPHAS/=XALPHAS) .OR. (PNUS/=XNUS) .OR. & + (PALPHAR/=XALPHAR) .OR. (PNUR/=XNUR) .OR. & + (PESR/=ZESR) .OR. (PBS/=XBS) .OR. (PBR/=XBR) .OR. & + (PCS/=XCS) .OR. (PDS/=XDS) .OR. (PCR/=XCR) .OR. (PDR/=XDR) .OR. & + (PACCLBDAS_MAX/=XACCLBDAS_MAX) .OR. (PACCLBDAR_MAX/=XACCLBDAR_MAX) .OR. & + (PACCLBDAS_MIN/=XACCLBDAS_MIN) .OR. (PACCLBDAR_MIN/=XACCLBDAR_MIN) .OR. & + (PFDINFTY/=ZFDINFTY) ) THEN + CALL RRCOLSS ( IND, XALPHAS, XNUS, XALPHAR, XNUR, & + ZESR, XBR, XCS, XDS, XCR, XDR, & + XACCLBDAS_MAX, XACCLBDAR_MAX, XACCLBDAS_MIN, XACCLBDAR_MIN, & + ZFDINFTY, XKER_RACCSS, XAG, XBS, XAS ) + CALL RZCOLX ( IND, XALPHAS, XNUS, XALPHAR, XNUR, & + ZESR, XBR, XCS, XDS, XCR, XDR, & + XACCLBDAS_MAX, XACCLBDAR_MAX, XACCLBDAS_MIN, XACCLBDAR_MIN, & + ZFDINFTY, XKER_RACCS ) + CALL RSCOLRG ( IND, XALPHAS, XNUS, XALPHAR, XNUR, & + ZESR, XBS, XCS, XDS, XCR, XDR, & + XACCLBDAS_MAX, XACCLBDAR_MAX, XACCLBDAS_MIN, XACCLBDAR_MIN, & + ZFDINFTY, XKER_SACCRG, XAG, XBS, XAS ) + WRITE(UNIT=KLUOUT,FMT='("*****************************************")') + WRITE(UNIT=KLUOUT,FMT='("**** UPDATE NEW SET OF RACSS KERNELS ****")') + WRITE(UNIT=KLUOUT,FMT='("**** UPDATE NEW SET OF RACS KERNELS ****")') + WRITE(UNIT=KLUOUT,FMT='("**** UPDATE NEW SET OF SACRG KERNELS ****")') + WRITE(UNIT=KLUOUT,FMT='("*****************************************")') + WRITE(UNIT=KLUOUT,FMT='("!")') + WRITE(UNIT=KLUOUT,FMT='("KND=",I3)') IND + WRITE(UNIT=KLUOUT,FMT='("KACCLBDAS=",I3)') NACCLBDAS + WRITE(UNIT=KLUOUT,FMT='("KACCLBDAR=",I3)') NACCLBDAR + WRITE(UNIT=KLUOUT,FMT='("PALPHAS=",E13.6)') XALPHAS + WRITE(UNIT=KLUOUT,FMT='("PNUS=",E13.6)') XNUS + WRITE(UNIT=KLUOUT,FMT='("PALPHAR=",E13.6)') XALPHAR + WRITE(UNIT=KLUOUT,FMT='("PNUR=",E13.6)') XNUR + WRITE(UNIT=KLUOUT,FMT='("PESR=",E13.6)') ZESR + WRITE(UNIT=KLUOUT,FMT='("PBS=",E13.6)') XBS + WRITE(UNIT=KLUOUT,FMT='("PBR=",E13.6)') XBR + WRITE(UNIT=KLUOUT,FMT='("PCS=",E13.6)') XCS + WRITE(UNIT=KLUOUT,FMT='("PDS=",E13.6)') XDS + WRITE(UNIT=KLUOUT,FMT='("PCR=",E13.6)') XCR + WRITE(UNIT=KLUOUT,FMT='("PDR=",E13.6)') XDR + WRITE(UNIT=KLUOUT,FMT='("PACCLBDAS_MAX=",E13.6)') & + XACCLBDAS_MAX + WRITE(UNIT=KLUOUT,FMT='("PACCLBDAR_MAX=",E13.6)') & + XACCLBDAR_MAX + WRITE(UNIT=KLUOUT,FMT='("PACCLBDAS_MIN=",E13.6)') & + XACCLBDAS_MIN + WRITE(UNIT=KLUOUT,FMT='("PACCLBDAR_MIN=",E13.6)') & + XACCLBDAR_MIN + WRITE(UNIT=KLUOUT,FMT='("PFDINFTY=",E13.6)') ZFDINFTY + WRITE(UNIT=KLUOUT,FMT='("!")') + WRITE(UNIT=KLUOUT,FMT='("IF( PRESENT(PKER_RACCSS) ) THEN")') + DO J1 = 1 , NACCLBDAS + DO J2 = 1 , NACCLBDAR + WRITE(UNIT=KLUOUT,FMT='(" PKER_RACCSS(",I3,",",I3,") = ",E13.6)') & + J1,J2,XKER_RACCSS(J1,J2) + END DO + END DO + WRITE(UNIT=KLUOUT,FMT='("END IF")') + WRITE(UNIT=KLUOUT,FMT='("!")') + WRITE(UNIT=KLUOUT,FMT='("IF( PRESENT(PKER_RACCS ) ) THEN")') + DO J1 = 1 , NACCLBDAS + DO J2 = 1 , NACCLBDAR + WRITE(UNIT=KLUOUT,FMT='(" PKER_RACCS (",I3,",",I3,") = ",E13.6)') & + J1,J2,XKER_RACCS (J1,J2) + END DO + END DO + WRITE(UNIT=KLUOUT,FMT='("END IF")') + WRITE(UNIT=KLUOUT,FMT='("!")') + WRITE(UNIT=KLUOUT,FMT='("IF( PRESENT(PKER_SACCRG) ) THEN")') + DO J1 = 1 , NACCLBDAR + DO J2 = 1 , NACCLBDAS + WRITE(UNIT=KLUOUT,FMT='(" PKER_SACCRG(",I3,",",I3,") = ",E13.6)') & + J1,J2,XKER_SACCRG(J1,J2) + END DO + END DO + WRITE(UNIT=KLUOUT,FMT='("END IF")') + ELSE + CALL READ_XKER_RACCS (KACCLBDAS,KACCLBDAR,KND, & + PALPHAS,PNUS,PALPHAR,PNUR,PESR,PBS,PBR,PCS,PDS,PCR,PDR, & + PACCLBDAS_MAX,PACCLBDAR_MAX,PACCLBDAS_MIN,PACCLBDAR_MIN,& + PFDINFTY,XKER_RACCSS,XKER_RACCS,XKER_SACCRG ) + WRITE(UNIT=KLUOUT,FMT='(" Read XKER_RACCSS")') + WRITE(UNIT=KLUOUT,FMT='(" Read XKER_RACCS ")') + WRITE(UNIT=KLUOUT,FMT='(" Read XKER_SACCRG")') +END IF +! +!* 7.3 Constant for the conversion-melting rate +! +XFSCVMG = 2.0 +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=KLUOUT,FMT='(" conversion-melting of the aggregates")') + WRITE(UNIT=KLUOUT,FMT='(" Conv. factor XFSCVMG=",E13.6)') XFSCVMG +END IF +! +! +!------------------------------------------------------------------------------- +! +!* 8. CONSTANTS FOR THE FAST COLD PROCESSES FOR THE GRAUPELN +! ------------------------------------------------------ +! +! +!* 8.1 Constants for the rain contact freezing +! +XCOLIR = 1.0 +! +XEXRCFRI = -XDR-5.0+ZXR +XRCFRI = ((XPI**2)/24.0)*XCCR*XRHOLW*XCOLIR*XCR*(ZRHO00**XCEXVT) & + *MOMG(XALPHAR,XNUR,XDR+5.0) +XEXICFRR = -XDR-2.0+ZXR +XICFRR = (XPI/4.0)*XCOLIR*XCR*(ZRHO00**XCEXVT) & + *XCCR*MOMG(XALPHAR,XNUR,XDR+2.0) +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=KLUOUT,FMT='(" rain contact freezing")') + WRITE(UNIT=KLUOUT,FMT='(" Coll. efficiency XCOLIR=",E13.6)') XCOLIR +END IF +! +! +!* 8.2 Constants for the dry growth of the graupeln +! +!* 8.2.1 Constants for the cloud droplet collection by the graupeln +! +XFCDRYG = (XPI/4.0)*XCCG*XCG*(ZRHO00**XCEXVT)*MOMG(XALPHAG,XNUG,XDG+2.0) +! +!* 8.2.2 Constants for the cloud ice collection by the graupeln +! +XCOLIG = 0.25 ! Collection efficiency of I+G +XCOLEXIG = 0.05 ! Temperature factor of the I+G collection efficiency +XCOLIG = 0.01 ! Collection efficiency of I+G +XCOLEXIG = 0.1 ! Temperature factor of the I+G collection efficiency +WRITE (KLUOUT, FMT=*) ' NEW Constants for the cloud ice collection by the graupeln' +WRITE (KLUOUT, FMT=*) ' XCOLIG, XCOLEXIG = ',XCOLIG,XCOLEXIG +XFIDRYG = (XPI/4.0)*XCOLIG*XCCG*XCG*(ZRHO00**XCEXVT)*MOMG(XALPHAG,XNUG,XDG+2.0) +XEXFIDRYG=(XCXG-XDG-2.)/(XCXG-XBG) +XFIDRYG2=XFIDRYG/XCOLIG*(XAG*XCCG*MOMG(XALPHAG,XNUG,XBG))**(-XEXFIDRYG) +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=KLUOUT,FMT='(" cloud ice collection by the graupeln")') + WRITE(UNIT=KLUOUT,FMT='(" Coll. efficiency XCOLIG=",E13.6)') XCOLIG + WRITE(UNIT=KLUOUT,FMT='(" Temp. factor XCOLEXIG=",E13.6)') XCOLEXIG +END IF +! +!* 8.2.3 Constants for the aggregate collection by the graupeln +! +XCOLSG = 0.25 ! Collection efficiency of S+G +XCOLEXSG = 0.05 ! Temperature factor of the S+G collection efficiency +XCOLSG = 0.01 ! Collection efficiency of S+G +XCOLEXSG = 0.1 ! Temperature factor of the S+G collection efficiency +WRITE (KLUOUT, FMT=*) ' NEW Constants for the aggregate collection by the graupeln' +WRITE (KLUOUT, FMT=*) ' XCOLSG, XCOLEXSG = ',XCOLSG,XCOLEXSG +XFSDRYG = (XPI/4.0)*XCOLSG*XCCG*XCCS*XAS*(ZRHO00**XCEXVT) +! +XLBSDRYG1 = MOMG(XALPHAG,XNUG,2.)*MOMG(XALPHAS,XNUS,XBS) +XLBSDRYG2 = 2.*MOMG(XALPHAG,XNUG,1.)*MOMG(XALPHAS,XNUS,XBS+1.) +XLBSDRYG3 = MOMG(XALPHAS,XNUS,XBS+2.) +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=KLUOUT,FMT='(" aggregate collection by the graupeln")') + WRITE(UNIT=KLUOUT,FMT='(" Coll. efficiency XCOLSG=",E13.6)') XCOLSG + WRITE(UNIT=KLUOUT,FMT='(" Temp. factor XCOLEXSG=",E13.6)') XCOLEXSG +END IF +! +!* 8.2.4 Constants for the raindrop collection by the graupeln +! +XFRDRYG = ((XPI**2)/24.0)*XCCG*XCCR*XRHOLW*(ZRHO00**XCEXVT) +! +XLBRDRYG1 = MOMG(XALPHAG,XNUG,2.)*MOMG(XALPHAR,XNUR,3.) +XLBRDRYG2 = 2.*MOMG(XALPHAG,XNUG,1.)*MOMG(XALPHAR,XNUR,4.) +XLBRDRYG3 = MOMG(XALPHAR,XNUR,5.) +! +! Notice: One magnitude of lambda discretized over 10 points +! +NDRYLBDAR = 40 +XDRYLBDAR_MIN = 1.0E3 ! Minimal value of Lbda_r to tabulate XKER_RDRYG +XDRYLBDAR_MAX = 1.0E7 ! Maximal value of Lbda_r to tabulate XKER_RDRYG +ZRATE = LOG(XDRYLBDAR_MAX/XDRYLBDAR_MIN)/REAL(NDRYLBDAR-1) +XDRYINTP1R = 1.0 / ZRATE +XDRYINTP2R = 1.0 - LOG( XDRYLBDAR_MIN ) / ZRATE +NDRYLBDAS = 80 +XDRYLBDAS_MIN = 2.5E1 ! Minimal value of Lbda_s to tabulate XKER_SDRYG +XDRYLBDAS_MAX = 2.5E9 ! Maximal value of Lbda_s to tabulate XKER_SDRYG +ZRATE = LOG(XDRYLBDAS_MAX/XDRYLBDAS_MIN)/REAL(NDRYLBDAS-1) +XDRYINTP1S = 1.0 / ZRATE +XDRYINTP2S = 1.0 - LOG( XDRYLBDAS_MIN ) / ZRATE +NDRYLBDAG = 40 +XDRYLBDAG_MIN = 1.0E3 ! Min value of Lbda_g to tabulate XKER_SDRYG,XKER_RDRYG +XDRYLBDAG_MAX = 1.0E7 ! Max value of Lbda_g to tabulate XKER_SDRYG,XKER_RDRYG +ZRATE = LOG(XDRYLBDAG_MAX/XDRYLBDAG_MIN)/REAL(NDRYLBDAG-1) +XDRYINTP1G = 1.0 / ZRATE +XDRYINTP2G = 1.0 - LOG( XDRYLBDAG_MIN ) / ZRATE +! +!* 8.2.5 Computations of the tabulated normalized kernels +! +IND = 50 ! Interval number, collection efficiency and infinite diameter +ZEGS = 1.0 ! factor used to integrate the dimensional distributions when +ZFDINFTY = 20.0 ! computing the kernels XKER_SDRYG +! +IF( .NOT.ALLOCATED(XKER_SDRYG) ) ALLOCATE( XKER_SDRYG(NDRYLBDAG,NDRYLBDAS) ) +! +CALL READ_XKER_SDRYG (KDRYLBDAG,KDRYLBDAS,KND, & + PALPHAG,PNUG,PALPHAS,PNUS,PEGS,PBS,PCG,PDG,PCS,PDS, & + PDRYLBDAG_MAX,PDRYLBDAS_MAX,PDRYLBDAG_MIN,PDRYLBDAS_MIN, & + PFDINFTY ) +IF( (KDRYLBDAG/=NDRYLBDAG) .OR. (KDRYLBDAS/=NDRYLBDAS) .OR. (KND/=IND) .OR. & + (PALPHAG/=XALPHAG) .OR. (PNUG/=XNUG) .OR. & + (PALPHAS/=XALPHAS) .OR. (PNUS/=XNUS) .OR. & + (PEGS/=ZEGS) .OR. (PBS/=XBS) .OR. & + (PCG/=XCG) .OR. (PDG/=XDG) .OR. (PCS/=XCS) .OR. (PDS/=XDS) .OR. & + (PDRYLBDAG_MAX/=XDRYLBDAG_MAX) .OR. (PDRYLBDAS_MAX/=XDRYLBDAS_MAX) .OR. & + (PDRYLBDAG_MIN/=XDRYLBDAG_MIN) .OR. (PDRYLBDAS_MIN/=XDRYLBDAS_MIN) .OR. & + (PFDINFTY/=ZFDINFTY) ) THEN + CALL RZCOLX ( IND, XALPHAG, XNUG, XALPHAS, XNUS, & + ZEGS, XBS, XCG, XDG, XCS, XDS, & + XDRYLBDAG_MAX, XDRYLBDAS_MAX, XDRYLBDAG_MIN, XDRYLBDAS_MIN, & + ZFDINFTY, XKER_SDRYG ) + WRITE(UNIT=KLUOUT,FMT='("*****************************************")') + WRITE(UNIT=KLUOUT,FMT='("**** UPDATE NEW SET OF SDRYG KERNELS ****")') + WRITE(UNIT=KLUOUT,FMT='("*****************************************")') + WRITE(UNIT=KLUOUT,FMT='("!")') + WRITE(UNIT=KLUOUT,FMT='("KND=",I3)') IND + WRITE(UNIT=KLUOUT,FMT='("KDRYLBDAG=",I3)') NDRYLBDAG + WRITE(UNIT=KLUOUT,FMT='("KDRYLBDAS=",I3)') NDRYLBDAS + WRITE(UNIT=KLUOUT,FMT='("PALPHAG=",E13.6)') XALPHAG + WRITE(UNIT=KLUOUT,FMT='("PNUG=",E13.6)') XNUG + WRITE(UNIT=KLUOUT,FMT='("PALPHAS=",E13.6)') XALPHAS + WRITE(UNIT=KLUOUT,FMT='("PNUS=",E13.6)') XNUS + WRITE(UNIT=KLUOUT,FMT='("PEGS=",E13.6)') ZEGS + WRITE(UNIT=KLUOUT,FMT='("PBS=",E13.6)') XBS + WRITE(UNIT=KLUOUT,FMT='("PCG=",E13.6)') XCG + WRITE(UNIT=KLUOUT,FMT='("PDG=",E13.6)') XDG + WRITE(UNIT=KLUOUT,FMT='("PCS=",E13.6)') XCS + WRITE(UNIT=KLUOUT,FMT='("PDS=",E13.6)') XDS + WRITE(UNIT=KLUOUT,FMT='("PDRYLBDAG_MAX=",E13.6)') & + XDRYLBDAG_MAX + WRITE(UNIT=KLUOUT,FMT='("PDRYLBDAS_MAX=",E13.6)') & + XDRYLBDAS_MAX + WRITE(UNIT=KLUOUT,FMT='("PDRYLBDAG_MIN=",E13.6)') & + XDRYLBDAG_MIN + WRITE(UNIT=KLUOUT,FMT='("PDRYLBDAS_MIN=",E13.6)') & + XDRYLBDAS_MIN + WRITE(UNIT=KLUOUT,FMT='("PFDINFTY=",E13.6)') ZFDINFTY + WRITE(UNIT=KLUOUT,FMT='("!")') + WRITE(UNIT=KLUOUT,FMT='("IF( PRESENT(PKER_SDRYG) ) THEN")') + DO J1 = 1 , NDRYLBDAG + DO J2 = 1 , NDRYLBDAS + WRITE(UNIT=KLUOUT,FMT='("PKER_SDRYG(",I3,",",I3,") = ",E13.6)') & + J1,J2,XKER_SDRYG(J1,J2) + END DO + END DO + WRITE(UNIT=KLUOUT,FMT='("END IF")') + ELSE + CALL READ_XKER_SDRYG (KDRYLBDAG,KDRYLBDAS,KND, & + PALPHAG,PNUG,PALPHAS,PNUS,PEGS,PBS,PCG,PDG,PCS,PDS, & + PDRYLBDAG_MAX,PDRYLBDAS_MAX,PDRYLBDAG_MIN,PDRYLBDAS_MIN, & + PFDINFTY,XKER_SDRYG ) + WRITE(UNIT=KLUOUT,FMT='(" Read XKER_SDRYG")') +END IF +! +! +IND = 50 ! Number of interval used to integrate the dimensional +ZEGR = 1.0 ! distributions when computing the kernel XKER_RDRYG +ZFDINFTY = 20.0 +! +IF( .NOT.ALLOCATED(XKER_RDRYG) ) ALLOCATE( XKER_RDRYG(NDRYLBDAG,NDRYLBDAR) ) +! +CALL READ_XKER_RDRYG (KDRYLBDAG,KDRYLBDAR,KND, & + PALPHAG,PNUG,PALPHAR,PNUR,PEGR,PBR,PCG,PDG,PCR,PDR, & + PDRYLBDAG_MAX,PDRYLBDAR_MAX,PDRYLBDAG_MIN,PDRYLBDAR_MIN, & + PFDINFTY ) +IF( (KDRYLBDAG/=NDRYLBDAG) .OR. (KDRYLBDAR/=NDRYLBDAR) .OR. (KND/=IND) .OR. & + (PALPHAG/=XALPHAG) .OR. (PNUG/=XNUG) .OR. & + (PALPHAR/=XALPHAR) .OR. (PNUR/=XNUR) .OR. & + (PEGR/=ZEGR) .OR. (PBR/=XBR) .OR. & + (PCG/=XCG) .OR. (PDG/=XDG) .OR. (PCR/=XCR) .OR. (PDR/=XDR) .OR. & + (PDRYLBDAG_MAX/=XDRYLBDAG_MAX) .OR. (PDRYLBDAR_MAX/=XDRYLBDAR_MAX) .OR. & + (PDRYLBDAG_MIN/=XDRYLBDAG_MIN) .OR. (PDRYLBDAR_MIN/=XDRYLBDAR_MIN) .OR. & + (PFDINFTY/=ZFDINFTY) ) THEN + CALL RZCOLX ( IND, XALPHAG, XNUG, XALPHAR, XNUR, & + ZEGR, XBR, XCG, XDG, XCR, XDR, & + XDRYLBDAG_MAX, XDRYLBDAR_MAX, XDRYLBDAG_MIN, XDRYLBDAR_MIN, & + ZFDINFTY, XKER_RDRYG ) + WRITE(UNIT=KLUOUT,FMT='("*****************************************")') + WRITE(UNIT=KLUOUT,FMT='("**** UPDATE NEW SET OF RDRYG KERNELS ****")') + WRITE(UNIT=KLUOUT,FMT='("*****************************************")') + WRITE(UNIT=KLUOUT,FMT='("!")') + WRITE(UNIT=KLUOUT,FMT='("KND=",I3)') IND + WRITE(UNIT=KLUOUT,FMT='("KDRYLBDAG=",I3)') NDRYLBDAG + WRITE(UNIT=KLUOUT,FMT='("KDRYLBDAR=",I3)') NDRYLBDAR + WRITE(UNIT=KLUOUT,FMT='("PALPHAG=",E13.6)') XALPHAG + WRITE(UNIT=KLUOUT,FMT='("PNUG=",E13.6)') XNUG + WRITE(UNIT=KLUOUT,FMT='("PALPHAR=",E13.6)') XALPHAR + WRITE(UNIT=KLUOUT,FMT='("PNUR=",E13.6)') XNUR + WRITE(UNIT=KLUOUT,FMT='("PEGR=",E13.6)') ZEGR + WRITE(UNIT=KLUOUT,FMT='("PBR=",E13.6)') XBR + WRITE(UNIT=KLUOUT,FMT='("PCG=",E13.6)') XCG + WRITE(UNIT=KLUOUT,FMT='("PDG=",E13.6)') XDG + WRITE(UNIT=KLUOUT,FMT='("PCR=",E13.6)') XCR + WRITE(UNIT=KLUOUT,FMT='("PDR=",E13.6)') XDR + WRITE(UNIT=KLUOUT,FMT='("PDRYLBDAG_MAX=",E13.6)') & + XDRYLBDAG_MAX + WRITE(UNIT=KLUOUT,FMT='("PDRYLBDAR_MAX=",E13.6)') & + XDRYLBDAR_MAX + WRITE(UNIT=KLUOUT,FMT='("PDRYLBDAG_MIN=",E13.6)') & + XDRYLBDAG_MIN + WRITE(UNIT=KLUOUT,FMT='("PDRYLBDAR_MIN=",E13.6)') & + XDRYLBDAR_MIN + WRITE(UNIT=KLUOUT,FMT='("PFDINFTY=",E13.6)') ZFDINFTY + WRITE(UNIT=KLUOUT,FMT='("!")') + WRITE(UNIT=KLUOUT,FMT='("IF( PRESENT(PKER_RDRYG) ) THEN")') + DO J1 = 1 , NDRYLBDAG + DO J2 = 1 , NDRYLBDAR + WRITE(UNIT=KLUOUT,FMT='("PKER_RDRYG(",I3,",",I3,") = ",E13.6)') & + J1,J2,XKER_RDRYG(J1,J2) + END DO + END DO + WRITE(UNIT=KLUOUT,FMT='("END IF")') + ELSE + CALL READ_XKER_RDRYG (KDRYLBDAG,KDRYLBDAR,KND, & + PALPHAG,PNUG,PALPHAR,PNUR,PEGR,PBR,PCG,PDG,PCR,PDR, & + PDRYLBDAG_MAX,PDRYLBDAR_MAX,PDRYLBDAG_MIN,PDRYLBDAR_MIN, & + PFDINFTY,XKER_RDRYG ) + WRITE(UNIT=KLUOUT,FMT='(" Read XKER_RDRYG")') +END IF +! +! +!------------------------------------------------------------------------------- +! +!* 9. CONSTANTS FOR THE FAST COLD PROCESSES FOR THE HAILSTONES +! -------------------------------------------------------- +! +!* 9.2 Constants for the wet growth of the hailstones +! +! +!* 9.2.1 Constant for the cloud droplet and cloud ice collection +! by the hailstones +! +XCOLIH = 0.01 ! Collection efficiency of I+H +XCOLEXIH = 0.1 ! Temperature factor of the I+H collection efficiency +XFWETH = (XPI/4.0)*XCCH*XCH*(ZRHO00**XCEXVT)*MOMG(XALPHAH,XNUH,XDH+2.0) +! +!* 9.2.2 Constants for the aggregate collection by the hailstones +! +XCOLSH = 0.01 ! Collection efficiency of S+H +XCOLEXSH = 0.1 ! Temperature factor of the S+H collection efficiency +XFSWETH = (XPI/4.0)*XCCH*XCCS*XAS*(ZRHO00**XCEXVT) +! +XLBSWETH1 = MOMG(XALPHAH,XNUH,2.)*MOMG(XALPHAS,XNUS,XBS) +XLBSWETH2 = 2.*MOMG(XALPHAH,XNUH,1.)*MOMG(XALPHAS,XNUS,XBS+1.) +XLBSWETH3 = MOMG(XALPHAS,XNUS,XBS+2.) +! +!* 9.2.3 Constants for the graupel collection by the hailstones +! +XCOLGH = 0.01 ! Collection efficiency of G+H +XCOLEXGH = 0.1 ! Temperature factor of the G+H collection efficiency +XFGWETH = (XPI/4.0)*XCCH*XCCG*XAG*(ZRHO00**XCEXVT) +! +XLBGWETH1 = MOMG(XALPHAH,XNUH,2.)*MOMG(XALPHAG,XNUG,XBG) +XLBGWETH2 = 2.*MOMG(XALPHAH,XNUH,1.)*MOMG(XALPHAG,XNUG,XBG+1.) +XLBGWETH3 = MOMG(XALPHAG,XNUG,XBG+2.) +! +!* 9.2.3 bis Constants for the rain collection by the hailstones +! +XFRWETH = (XPI/4.0)*XCCH*XCCR*XAR*(ZRHO00**XCEXVT) +! +XLBRWETH1 = MOMG(XALPHAH,XNUH,2.)*MOMG(XALPHAR,XNUR,XBR) +XLBRWETH2 = 2.*MOMG(XALPHAH,XNUH,1.)*MOMG(XALPHAR,XNUR,XBR+1.) +XLBRWETH3 = MOMG(XALPHAR,XNUR,XBR+2.) +! +! Notice: One magnitude of lambda discretized over 10 points +! +NWETLBDAS = 80 +XWETLBDAS_MIN = 2.5E1 ! Minimal value of Lbda_s to tabulate XKER_SWETH +XWETLBDAS_MAX = 2.5E9 ! Maximal value of Lbda_s to tabulate XKER_SWETH +ZRATE = LOG(XWETLBDAS_MAX/XWETLBDAS_MIN)/REAL(NWETLBDAS-1) +XWETINTP1S = 1.0 / ZRATE +XWETINTP2S = 1.0 - LOG( XWETLBDAS_MIN ) / ZRATE +NWETLBDAG = 40 +XWETLBDAG_MIN = 1.0E3 ! Min value of Lbda_g to tabulate XKER_GWETH +XWETLBDAG_MAX = 1.0E7 ! Max value of Lbda_g to tabulate XKER_GWETH +ZRATE = LOG(XWETLBDAG_MAX/XWETLBDAG_MIN)/REAL(NWETLBDAG-1) +XWETINTP1G = 1.0 / ZRATE +XWETINTP2G = 1.0 - LOG( XWETLBDAG_MIN ) / ZRATE +NWETLBDAR = 40 +XWETLBDAR_MIN = 1.0E3 ! Minimal value of Lbda_r to tabulate XKER_RWETH +XWETLBDAR_MAX = 1.0E7 ! Maximal value of Lbda_r to tabulate XKER_RWETH +ZRATE = LOG(XWETLBDAR_MAX/XWETLBDAR_MIN)/REAL(NWETLBDAR-1) +XWETINTP1R = 1.0 / ZRATE +XWETINTP2R = 1.0 - LOG( XWETLBDAR_MIN ) / ZRATE +NWETLBDAH = 40 +XWETLBDAH_MIN = 1.0E3 ! Min value of Lbda_h to tabulate XKER_SWETH,XKER_GWETH,XKER_RWETH +XWETLBDAH_MAX = 1.0E7 ! Max value of Lbda_h to tabulate XKER_SWETH,XKER_GWETH,XKER_RWETH +ZRATE = LOG(XWETLBDAH_MAX/XWETLBDAH_MIN)/REAL(NWETLBDAH-1) +XWETINTP1H = 1.0 / ZRATE +XWETINTP2H = 1.0 - LOG( XWETLBDAH_MIN ) / ZRATE +! +!* 9.2.4 Computations of the tabulated normalized kernels +! +IND = 50 ! Interval number, collection efficiency and infinite diameter +ZEHS = 1.0 ! factor used to integrate the dimensional distributions when +ZFDINFTY = 20.0 ! computing the kernels XKER_SWETH +! +IF( .NOT.ALLOCATED(XKER_SWETH) ) ALLOCATE( XKER_SWETH(NWETLBDAH,NWETLBDAS) ) +! +CALL READ_XKER_SWETH (KWETLBDAH,KWETLBDAS,KND, & + PALPHAH,PNUH,PALPHAS,PNUS,PEHS,PBS,PCH,PDH,PCS,PDS, & + PWETLBDAH_MAX,PWETLBDAS_MAX,PWETLBDAH_MIN,PWETLBDAS_MIN, & + PFDINFTY ) +IF( (KWETLBDAH/=NWETLBDAH) .OR. (KWETLBDAS/=NWETLBDAS) .OR. (KND/=IND) .OR. & + (PALPHAH/=XALPHAH) .OR. (PNUH/=XNUH) .OR. & + (PALPHAS/=XALPHAS) .OR. (PNUS/=XNUS) .OR. & + (PEHS/=ZEHS) .OR. (PBS/=XBS) .OR. & + (PCH/=XCH) .OR. (PDH/=XDH) .OR. (PCS/=XCS) .OR. (PDS/=XDS) .OR. & + (PWETLBDAH_MAX/=XWETLBDAH_MAX) .OR. (PWETLBDAS_MAX/=XWETLBDAS_MAX) .OR. & + (PWETLBDAH_MIN/=XWETLBDAH_MIN) .OR. (PWETLBDAS_MIN/=XWETLBDAS_MIN) .OR. & + (PFDINFTY/=ZFDINFTY) ) THEN + CALL RZCOLX ( IND, XALPHAH, XNUH, XALPHAS, XNUS, & + ZEHS, XBS, XCH, XDH, XCS, XDS, & + XWETLBDAH_MAX, XWETLBDAS_MAX, XWETLBDAH_MIN, XWETLBDAS_MIN, & + ZFDINFTY, XKER_SWETH ) + WRITE(UNIT=KLUOUT,FMT='("*****************************************")') + WRITE(UNIT=KLUOUT,FMT='("**** UPDATE NEW SET OF SWETH KERNELS ****")') + WRITE(UNIT=KLUOUT,FMT='("*****************************************")') + WRITE(UNIT=KLUOUT,FMT='("!")') + WRITE(UNIT=KLUOUT,FMT='("KND=",I3)') IND + WRITE(UNIT=KLUOUT,FMT='("KWETLBDAH=",I3)') NWETLBDAH + WRITE(UNIT=KLUOUT,FMT='("KWETLBDAS=",I3)') NWETLBDAS + WRITE(UNIT=KLUOUT,FMT='("PALPHAH=",E13.6)') XALPHAH + WRITE(UNIT=KLUOUT,FMT='("PNUH=",E13.6)') XNUH + WRITE(UNIT=KLUOUT,FMT='("PALPHAS=",E13.6)') XALPHAS + WRITE(UNIT=KLUOUT,FMT='("PNUS=",E13.6)') XNUS + WRITE(UNIT=KLUOUT,FMT='("PEHS=",E13.6)') ZEHS + WRITE(UNIT=KLUOUT,FMT='("PBS=",E13.6)') XBS + WRITE(UNIT=KLUOUT,FMT='("PCH=",E13.6)') XCH + WRITE(UNIT=KLUOUT,FMT='("PDH=",E13.6)') XDH + WRITE(UNIT=KLUOUT,FMT='("PCS=",E13.6)') XCS + WRITE(UNIT=KLUOUT,FMT='("PDS=",E13.6)') XDS + WRITE(UNIT=KLUOUT,FMT='("PWETLBDAH_MAX=",E13.6)') & + XWETLBDAH_MAX + WRITE(UNIT=KLUOUT,FMT='("PWETLBDAS_MAX=",E13.6)') & + XWETLBDAS_MAX + WRITE(UNIT=KLUOUT,FMT='("PWETLBDAH_MIN=",E13.6)') & + XWETLBDAH_MIN + WRITE(UNIT=KLUOUT,FMT='("PWETLBDAS_MIN=",E13.6)') & + XWETLBDAS_MIN + WRITE(UNIT=KLUOUT,FMT='("PFDINFTY=",E13.6)') ZFDINFTY + WRITE(UNIT=KLUOUT,FMT='("!")') + WRITE(UNIT=KLUOUT,FMT='("IF( PRESENT(PKER_SWETH) ) THEN")') + DO J1 = 1 , NWETLBDAH + DO J2 = 1 , NWETLBDAS + WRITE(UNIT=KLUOUT,FMT='("PKER_SWETH(",I3,",",I3,") = ",E13.6)') & + J1,J2,XKER_SWETH(J1,J2) + END DO + END DO + WRITE(UNIT=KLUOUT,FMT='("END IF")') + ELSE + CALL READ_XKER_SWETH (KWETLBDAH,KWETLBDAS,KND, & + PALPHAH,PNUH,PALPHAS,PNUS,PEHS,PBS,PCH,PDH,PCS,PDS, & + PWETLBDAH_MAX,PWETLBDAS_MAX,PWETLBDAH_MIN,PWETLBDAS_MIN, & + PFDINFTY,XKER_SWETH ) + WRITE(UNIT=KLUOUT,FMT='(" Read XKER_SWETH")') +END IF +! +! +IND = 50 ! Number of interval used to integrate the dimensional +ZEHG = 1.0 ! distributions when computing the kernel XKER_GWETH +ZFDINFTY = 20.0 +! +IF( .NOT.ALLOCATED(XKER_GWETH) ) ALLOCATE( XKER_GWETH(NWETLBDAH,NWETLBDAG) ) +! +CALL READ_XKER_GWETH (KWETLBDAH,KWETLBDAG,KND, & + PALPHAH,PNUH,PALPHAG,PNUG,PEHG,PBG,PCH,PDH,PCG,PDG, & + PWETLBDAH_MAX,PWETLBDAG_MAX,PWETLBDAH_MIN,PWETLBDAG_MIN, & + PFDINFTY ) +IF( (KWETLBDAH/=NWETLBDAH) .OR. (KWETLBDAG/=NWETLBDAG) .OR. (KND/=IND) .OR. & + (PALPHAH/=XALPHAH) .OR. (PNUH/=XNUH) .OR. & + (PALPHAG/=XALPHAG) .OR. (PNUG/=XNUG) .OR. & + (PEHG/=ZEHG) .OR. (PBG/=XBG) .OR. & + (PCH/=XCH) .OR. (PDH/=XDH) .OR. (PCG/=XCG) .OR. (PDG/=XDG) .OR. & + (PWETLBDAH_MAX/=XWETLBDAH_MAX) .OR. (PWETLBDAG_MAX/=XWETLBDAG_MAX) .OR. & + (PWETLBDAH_MIN/=XWETLBDAH_MIN) .OR. (PWETLBDAG_MIN/=XWETLBDAG_MIN) .OR. & + (PFDINFTY/=ZFDINFTY) ) THEN + CALL RZCOLX ( IND, XALPHAH, XNUH, XALPHAG, XNUG, & + ZEHG, XBG, XCH, XDH, XCG, XDG, & + XWETLBDAH_MAX, XWETLBDAG_MAX, XWETLBDAH_MIN, XWETLBDAG_MIN, & + ZFDINFTY, XKER_GWETH ) + WRITE(UNIT=KLUOUT,FMT='("*****************************************")') + WRITE(UNIT=KLUOUT,FMT='("**** UPDATE NEW SET OF GWETH KERNELS ****")') + WRITE(UNIT=KLUOUT,FMT='("*****************************************")') + WRITE(UNIT=KLUOUT,FMT='("!")') + WRITE(UNIT=KLUOUT,FMT='("KND=",I3)') IND + WRITE(UNIT=KLUOUT,FMT='("KWETLBDAH=",I3)') NWETLBDAH + WRITE(UNIT=KLUOUT,FMT='("KWETLBDAG=",I3)') NWETLBDAG + WRITE(UNIT=KLUOUT,FMT='("PALPHAH=",E13.6)') XALPHAH + WRITE(UNIT=KLUOUT,FMT='("PNUH=",E13.6)') XNUH + WRITE(UNIT=KLUOUT,FMT='("PALPHAG=",E13.6)') XALPHAG + WRITE(UNIT=KLUOUT,FMT='("PNUG=",E13.6)') XNUG + WRITE(UNIT=KLUOUT,FMT='("PEHG=",E13.6)') ZEHG + WRITE(UNIT=KLUOUT,FMT='("PBG=",E13.6)') XBG + WRITE(UNIT=KLUOUT,FMT='("PCH=",E13.6)') XCH + WRITE(UNIT=KLUOUT,FMT='("PDH=",E13.6)') XDH + WRITE(UNIT=KLUOUT,FMT='("PCG=",E13.6)') XCG + WRITE(UNIT=KLUOUT,FMT='("PDG=",E13.6)') XDG + WRITE(UNIT=KLUOUT,FMT='("PWETLBDAH_MAX=",E13.6)') & + XWETLBDAH_MAX + WRITE(UNIT=KLUOUT,FMT='("PWETLBDAG_MAX=",E13.6)') & + XWETLBDAG_MAX + WRITE(UNIT=KLUOUT,FMT='("PWETLBDAH_MIN=",E13.6)') & + XWETLBDAH_MIN + WRITE(UNIT=KLUOUT,FMT='("PWETLBDAG_MIN=",E13.6)') & + XWETLBDAG_MIN + WRITE(UNIT=KLUOUT,FMT='("PFDINFTY=",E13.6)') ZFDINFTY + WRITE(UNIT=KLUOUT,FMT='("!")') + WRITE(UNIT=KLUOUT,FMT='("IF( PRESENT(PKER_GWETH) ) THEN")') + DO J1 = 1 , NWETLBDAH + DO J2 = 1 , NWETLBDAG + WRITE(UNIT=KLUOUT,FMT='("PKER_GWETH(",I3,",",I3,") = ",E13.6)') & + J1,J2,XKER_GWETH(J1,J2) + END DO + END DO + WRITE(UNIT=KLUOUT,FMT='("END IF")') + ELSE + CALL READ_XKER_GWETH (KWETLBDAH,KWETLBDAG,KND, & + PALPHAH,PNUH,PALPHAG,PNUG,PEHG,PBG,PCH,PDH,PCG,PDG, & + PWETLBDAH_MAX,PWETLBDAG_MAX,PWETLBDAH_MIN,PWETLBDAG_MIN, & + PFDINFTY,XKER_GWETH ) + WRITE(UNIT=KLUOUT,FMT='(" Read XKER_GWETH")') +END IF +! +! +IND = 50 ! Number of interval used to integrate the dimensional +ZEHR = 1.0 ! distributions when computing the kernel XKER_RWETH +ZFDINFTY = 20.0 +! +IF( .NOT.ALLOCATED(XKER_RWETH) ) ALLOCATE( XKER_RWETH(NWETLBDAH,NWETLBDAR) ) +! +CALL READ_XKER_RWETH (KWETLBDAH,KWETLBDAR,KND, & + PALPHAH,PNUH,PALPHAR,PNUR,PEHR,PBR,PCH,PDH,PCR,PDR, & + PWETLBDAH_MAX,PWETLBDAR_MAX,PWETLBDAH_MIN,PWETLBDAR_MIN, & + PFDINFTY ) +IF( (KWETLBDAH/=NWETLBDAH) .OR. (KWETLBDAR/=NWETLBDAR) .OR. (KND/=IND) .OR. & + (PALPHAH/=XALPHAH) .OR. (PNUH/=XNUH) .OR. & + (PALPHAR/=XALPHAR) .OR. (PNUR/=XNUR) .OR. & + (PEHR/=ZEHR) .OR. (PBR/=XBR) .OR. & + (PCH/=XCH) .OR. (PDH/=XDH) .OR. (PCR/=XCR) .OR. (PDR/=XDR) .OR. & + (PWETLBDAH_MAX/=XWETLBDAH_MAX) .OR. (PWETLBDAR_MAX/=XWETLBDAR_MAX) .OR. & + (PWETLBDAH_MIN/=XWETLBDAH_MIN) .OR. (PWETLBDAR_MIN/=XWETLBDAR_MIN) .OR. & + (PFDINFTY/=ZFDINFTY) ) THEN + CALL RZCOLX ( IND, XALPHAH, XNUH, XALPHAR, XNUR, & + ZEHR, XBR, XCH, XDH, XCR, XDR, & + XWETLBDAH_MAX, XWETLBDAR_MAX, XWETLBDAH_MIN, XWETLBDAR_MIN, & + ZFDINFTY, XKER_RWETH ) + WRITE(UNIT=KLUOUT,FMT='("*****************************************")') + WRITE(UNIT=KLUOUT,FMT='("**** UPDATE NEW SET OF RWETH KERNELS ****")') + WRITE(UNIT=KLUOUT,FMT='("*****************************************")') + WRITE(UNIT=KLUOUT,FMT='("!")') + WRITE(UNIT=KLUOUT,FMT='("KND=",I3)') IND + WRITE(UNIT=KLUOUT,FMT='("KWETLBDAH=",I3)') NWETLBDAH + WRITE(UNIT=KLUOUT,FMT='("KWETLBDAR=",I3)') NWETLBDAR + WRITE(UNIT=KLUOUT,FMT='("PALPHAH=",E13.6)') XALPHAH + WRITE(UNIT=KLUOUT,FMT='("PNUH=",E13.6)') XNUH + WRITE(UNIT=KLUOUT,FMT='("PALPHAR=",E13.6)') XALPHAR + WRITE(UNIT=KLUOUT,FMT='("PNUR=",E13.6)') XNUR + WRITE(UNIT=KLUOUT,FMT='("PEHR=",E13.6)') ZEHR + WRITE(UNIT=KLUOUT,FMT='("PBR=",E13.6)') XBR + WRITE(UNIT=KLUOUT,FMT='("PCH=",E13.6)') XCH + WRITE(UNIT=KLUOUT,FMT='("PDH=",E13.6)') XDH + WRITE(UNIT=KLUOUT,FMT='("PCR=",E13.6)') XCR + WRITE(UNIT=KLUOUT,FMT='("PDR=",E13.6)') XDR + WRITE(UNIT=KLUOUT,FMT='("PWETLBDAH_MAX=",E13.6)') & + XWETLBDAH_MAX + WRITE(UNIT=KLUOUT,FMT='("PWETLBDAR_MAX=",E13.6)') & + XWETLBDAR_MAX + WRITE(UNIT=KLUOUT,FMT='("PWETLBDAH_MIN=",E13.6)') & + XWETLBDAH_MIN + WRITE(UNIT=KLUOUT,FMT='("PWETLBDAR_MIN=",E13.6)') & + XWETLBDAR_MIN + WRITE(UNIT=KLUOUT,FMT='("PFDINFTY=",E13.6)') ZFDINFTY + WRITE(UNIT=KLUOUT,FMT='("!")') + WRITE(UNIT=KLUOUT,FMT='("IF( PRESENT(PKER_RWETH) ) THEN")') + DO J1 = 1 , NWETLBDAH + DO J2 = 1 , NWETLBDAR + WRITE(UNIT=KLUOUT,FMT='("PKER_RWETH(",I3,",",I3,") = ",E13.6)') & + J1,J2,XKER_RWETH(J1,J2) + END DO + END DO + WRITE(UNIT=KLUOUT,FMT='("END IF")') + ELSE + CALL READ_XKER_RWETH (KWETLBDAH,KWETLBDAR,KND, & + PALPHAH,PNUH,PALPHAR,PNUR,PEHR,PBR,PCH,PDH,PCR,PDR, & + PWETLBDAH_MAX,PWETLBDAR_MAX,PWETLBDAH_MIN,PWETLBDAR_MIN, & + PFDINFTY,XKER_RWETH ) + WRITE(UNIT=KLUOUT,FMT='(" Read XKER_RWETH")') +END IF +! +! +!------------------------------------------------------------------------------- +! +!* 10. SOME PRINTS FOR CONTROL +! ----------------------- +! +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=KLUOUT,FMT='(" Summary of the ice particule characteristics")') + WRITE(UNIT=KLUOUT,FMT='(" PRISTINE ICE")') + WRITE(UNIT=KLUOUT,FMT='(" masse: A=",E13.6," B=",E13.6)') & + XAI,XBI + WRITE(UNIT=KLUOUT,FMT='(" vitesse: C=",E13.6," D=",E13.6)') & + XC_I,XDI + WRITE(UNIT=KLUOUT,FMT='(" distribution:AL=",E13.6,"NU=",E13.6)') & + XALPHAI,XNUI + WRITE(UNIT=KLUOUT,FMT='(" SNOW")') + WRITE(UNIT=KLUOUT,FMT='(" masse: A=",E13.6," B=",E13.6)') & + XAS,XBS + WRITE(UNIT=KLUOUT,FMT='(" vitesse: C=",E13.6," D=",E13.6)') & + XCS,XDS + WRITE(UNIT=KLUOUT,FMT='(" concentration:CC=",E13.6," x=",E13.6)') & + XCCS,XCXS + WRITE(UNIT=KLUOUT,FMT='(" distribution:AL=",E13.6,"NU=",E13.6)') & + XALPHAS,XNUS + WRITE(UNIT=KLUOUT,FMT='(" GRAUPEL")') + WRITE(UNIT=KLUOUT,FMT='(" masse: A=",E13.6," B=",E13.6)') & + XAG,XBG + WRITE(UNIT=KLUOUT,FMT='(" vitesse: C=",E13.6," D=",E13.6)') & + XCG,XDG + WRITE(UNIT=KLUOUT,FMT='(" concentration:CC=",E13.6," x=",E13.6)') & + XCCG,XCXG + WRITE(UNIT=KLUOUT,FMT='(" distribution:AL=",E13.6,"NU=",E13.6)') & + XALPHAG,XNUG + WRITE(UNIT=KLUOUT,FMT='(" HAIL")') + WRITE(UNIT=KLUOUT,FMT='(" masse: A=",E13.6," B=",E13.6)') & + XAH,XBH + WRITE(UNIT=KLUOUT,FMT='(" vitesse: C=",E13.6," D=",E13.6)') & + XCH,XDH + WRITE(UNIT=KLUOUT,FMT='(" concentration:CC=",E13.6," x=",E13.6)') & + XCCH,XCXH + WRITE(UNIT=KLUOUT,FMT='(" distribution:AL=",E13.6,"NU=",E13.6)') & + XALPHAH,XNUH +END IF +CONTAINS +! +!------------------------------------------------------------------------------ +! + FUNCTION MOMG(PALPHA,PNU,PP) RESULT (PMOMG) +! +! auxiliary routine used to compute the Pth moment order of the generalized +! gamma law +! + USE MODI_GAMMA +! + IMPLICIT NONE +! + REAL :: PALPHA ! first shape parameter of the dimensionnal distribution + REAL :: PNU ! second shape parameter of the dimensionnal distribution + REAL :: PP ! order of the moment + REAL :: PMOMG ! result: moment of order ZP +! +!------------------------------------------------------------------------------ +! +! + PMOMG = GAMMA(PNU+PP/PALPHA)/GAMMA(PNU) +! + END FUNCTION MOMG +! +!------------------------------------------------------------------------------- +! +! +END SUBROUTINE INI_RAIN_ICE diff --git a/src/mesonh/micro/ini_rain_ice_elec.f90 b/src/mesonh/micro/ini_rain_ice_elec.f90 new file mode 100644 index 000000000..940caeaee --- /dev/null +++ b/src/mesonh/micro/ini_rain_ice_elec.f90 @@ -0,0 +1,1255 @@ +!MNH_LIC Copyright 2002-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ############################# + MODULE MODI_INI_RAIN_ICE_ELEC +! ############################# +! +INTERFACE + SUBROUTINE INI_RAIN_ICE_ELEC (KLUOUT, PTSTEP, PDZMIN, KSPLITR, HCLOUD, & + KINTVL, PFDINFTY ) +! +INTEGER, INTENT(IN) :: KLUOUT ! Logical unit number for prints +INTEGER, INTENT(OUT):: KSPLITR ! Number of small time step + ! integration for rain + ! sedimendation +REAL, INTENT(IN) :: PTSTEP ! Effective Time step +REAL, INTENT(IN) :: PDZMIN ! minimun vertical mesh size +CHARACTER (LEN=4), INTENT(IN) :: HCLOUD ! Indicator of the cloud scheme +INTEGER, INTENT(INOUT) :: KINTVL ! Number of interval to integrate the kernels +REAL, INTENT(INOUT) :: PFDINFTY ! Factor used to define the "infinite" diameter +! +END SUBROUTINE INI_RAIN_ICE_ELEC +END INTERFACE +END MODULE MODI_INI_RAIN_ICE_ELEC +! +! ######################################################################## + SUBROUTINE INI_RAIN_ICE_ELEC (KLUOUT, PTSTEP, PDZMIN, KSPLITR, HCLOUD, & + KINTVL, PFDINFTY ) +! ######################################################################## +! +!!**** *INI_RAIN_ICE_ELEC * - initialize the constants necessary for the warm and +!! cold microphysical schemes, +!! and for the electrical scheme +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to initialize the constants used to +!! resolve the mixed phase microphysical scheme. The collection kernels of +!! the precipitating particles are recomputed if necessary if some parameters +!! defining the ice categories have been modified. The number of small +!! time steps leading to stable scheme for the rain, ice, snow and ggraupeln +!! sedimentation is also computed (time-splitting technique). +!! +!!** METHOD +!! ------ +!! The constants are initialized to their numerical values and the number +!! of small time step is computed by dividing the 2* Deltat time interval of +!! the Leap-frog scheme so that the stability criterion for the rain +!! sedimentation is fulfilled for a Raindrop maximal fall velocity equal +!! VTRMAX. The parameters defining the collection kernels are read and are +!! checked against the new ones. If any change occurs, these kernels are +!! recomputed and their numerical values are written in the output listiing. +!! +!! EXTERNAL +!! -------- +!! GAMMA : gamma function +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST +!! XPI ! +!! XP00 ! Reference pressure +!! XRD ! Gaz constant for dry air +!! XRHOLW ! Liquid water density +!! Module MODD_REF +!! XTHVREFZ ! Reference virtual pot.temp. without orography +!! Module MODD_PARAMETERS +!! JPVEXT ! +!! Module MODD_RAIN_ICE_DESCR +!! Module MODD_RAIN_ICE_PARAM +!! +!! REFERENCE +!! --------- +!! Book2 of documentation ( routine INI_RAIN_ICE ) +!! +!! AUTHOR +!! ------ +!! +!! * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original: 2002 +!! Modifications: +!! C. Barthe 20/11/09 update to version 4.8.1 +! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_LUNIT +USE MODD_PARAMETERS +USE MODD_PARAM_ICE +USE MODD_RAIN_ICE_DESCR +USE MODD_RAIN_ICE_PARAM +USE MODD_REF +USE MODD_ELEC_PARAM, ONLY : XGAMINC_RIM3, XFCI +USE MODD_ELEC_DESCR, ONLY : XFS +! +USE MODI_MOMG +USE MODI_GAMMA +USE MODI_GAMMA_INC +USE MODI_RRCOLSS +USE MODI_RZCOLX +USE MODI_RSCOLRG +USE MODI_READ_XKER_RACCS +USE MODI_READ_XKER_SDRYG +USE MODI_READ_XKER_RDRYG +USE MODI_READ_XKER_SWETH +USE MODI_READ_XKER_GWETH +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +INTEGER, INTENT(IN) :: KLUOUT ! Logical unit number for prints +INTEGER, INTENT(OUT):: KSPLITR ! Number of small time step + ! integration for rain + ! sedimendation +REAL, INTENT(IN) :: PTSTEP ! Effective Time step +REAL, INTENT(IN) :: PDZMIN ! minimun vertical mesh size +CHARACTER (LEN=4), INTENT(IN) :: HCLOUD ! Indicator of the cloud scheme +INTEGER, INTENT(INOUT) :: KINTVL ! Number of interval to integrate the kernels +REAL, INTENT(INOUT) :: PFDINFTY ! Factor used to define the "infinite" diameter +! +! +!* 0.2 Declarations of local variables : +! +REAL :: ZT ! Work variable +REAL :: ZVTRMAX ! Raindrop maximal fall velocity +REAL :: ZRHO00 ! Surface reference air density +REAL :: ZRATE ! Geometrical growth of Lbda in the tabulated + ! functions and kernels +REAL :: ZBOUND ! XDCSLIM*Lbda_s: upper bound for the partial + ! integration of the riming rate of the aggregates +REAL :: ZEGS, ZEGR, ZEHS, ZEHG! Bulk collection efficiencies +REAL :: ZALPHA, & ! Parameters to compute + ZNU, & ! the value of the p_moment + ZP ! of the generalized Gamma function +REAL :: ZESR ! Mean efficiency of rain-aggregate collection +REAL :: ZFDINFTY ! Factor used to define the "infinite" diameter +REAL :: ZCONC_MAX ! Maximal concentration for snow +REAL :: ZGAMC, ZGAMC2 ! parameters involving various moments of the generalized gamma law +REAL :: ZFACT_NUCL ! Amplification factor for the minimal ice concentration +REAL :: ZXR ! Value of x_r in N_r = C_r lambda_r ** x_r +! +INTEGER :: IKB ! Coordinates of the first physical points along z +INTEGER :: J1, J2 ! Internal loop indexes +INTEGER :: IND ! Number of interval to integrate the kernels +! +LOGICAL :: GFLAG ! Logical flag for printing the constatnts on the output + ! listing +! +INTEGER :: KND +INTEGER :: KACCLBDAS, KACCLBDAR, KDRYLBDAG, KDRYLBDAS, KDRYLBDAR +INTEGER :: KWETLBDAS, KWETLBDAG, KWETLBDAH +REAL :: PALPHAR, PALPHAS, PALPHAG, PALPHAH +REAL :: PNUR, PNUS, PNUG, PNUH +REAL :: PBR, PBS, PBG, PBH +REAL :: PCR, PCS, PCG, PCH +REAL :: PDR, PDS, PDG, PDH +REAL :: PESR, PEGS, PEGR, PEHS, PEHG +REAL :: PACCLBDAS_MAX, PACCLBDAR_MAX, PACCLBDAS_MIN, PACCLBDAR_MIN +REAL :: PDRYLBDAG_MAX, PDRYLBDAS_MAX, PDRYLBDAG_MIN, PDRYLBDAS_MIN +REAL :: PDRYLBDAR_MAX, PDRYLBDAR_MIN +REAL :: PWETLBDAS_MAX, PWETLBDAG_MAX, PWETLBDAS_MIN, PWETLBDAG_MIN +REAL :: PWETLBDAH_MAX, PWETLBDAH_MIN +! +!------------------------------------------------------------------------------- +! +!* 0. FUNCTION STATEMENTS +! ------------------- +! +!* 0.1 p_moment of the Generalized GAMMA function +! +! +! +! 1. COMPUTE KSPLTR FOR EACH MODEL +! ----------------------------- +! +!* 1.1 Set the hailstones maximum fall velocity +! +IF (CSEDIM == 'SPLI') THEN + IF (HCLOUD == 'ICE4') THEN + ZVTRMAX = 40. + ELSE IF (HCLOUD == 'ICE3') THEN + ZVTRMAX = 10. + END IF +END IF +! +!* 1.2 Compute the number of small time step integration +! +KSPLITR = 1 +IF (CSEDIM == 'SPLI') THEN + SPLIT : DO + ZT = PTSTEP / REAL(KSPLITR) + IF (ZT * ZVTRMAX / PDZMIN .LT. 1.) EXIT SPLIT + KSPLITR = KSPLITR + 1 + END DO SPLIT +END IF +! +IF (ALLOCATED(XRTMIN)) THEN ! In case of nesting microphysics constants of + ! MODD_RAIN_ICE_PARAM are computed only once, + ! but if INI_RAIN_ICE has been called already + ! one must change the XRTMIN size. + DEALLOCATE(XRTMIN) +END IF +! +!------------------------------------------------------------------------------- +! +!* 2. CHARACTERISTICS OF THE SPECIES +! ------------------------------ +! +!* 2.1 Cloud droplet and Raindrop characteristics +! +XAC = (XPI / 6.0) * XRHOLW +XBC = 3.0 +XCC = XRHOLW * XG / (18.0 * 1.7E-5) ! Stokes flow (Pruppacher p 322 for T=273K) +XDC = 2.0 +! +XAR = (XPI / 6.0) * XRHOLW +XBR = 3.0 +XCR = 842. +XDR = 0.8 +! +XCCR = 8.E6 ! N0_r = XCXR * lambda_r ** ZXR +ZXR = -1. ! +! +XF0R = 1.00 +XF1R = 0.26 +! +XC1R = 1. / 2. +! +! +!* 2.2 Ice crystal characteristics +! +SELECT CASE (CPRISTINE_ICE) + CASE('PLAT') + XAI = 0.82 ! Plates + XBI = 2.5 ! Plates + XC_I = 800. ! Plates + XDI = 1.0 ! Plates + XC1I = 1./XPI ! Plates + CASE('COLU') + XAI = 2.14E-3 ! Columns + XBI = 1.7 ! Columns + XC_I = 2.1E5 ! Columns + XDI = 1.585 ! Columns + XC1I = 0.8 ! Columns + CASE('BURO') + XAI = 44.0 ! Bullet rosettes + XBI = 3.0 ! Bullet rosettes + XC_I = 4.3E5 ! Bullet rosettes + XDI = 1.663 ! Bullet rosettes + XC1I = 0.5 ! Bullet rosettes +END SELECT +! +! Note that XCCI=N_i (a locally predicted value) and XCXI=0.0, implicitly +! +XF0I = 1.00 +XF2I = 0.14 +! +! +!* 2.3 Snowflakes/aggregates characteristics +! +XAS = 0.02 +XBS = 1.9 +XCS = 5.1 +XDS = 0.27 +! +XCCS = 5.0 +XCXS = 1.0 +! +XF0S = 0.86 +XF1S = 0.28 +! +XC1S = 1. / XPI +! +! +!* 2.4 Graupel/Frozen drop characteristics +! +XAG = 19.6 ! Lump graupel case +XBG = 2.8 ! Lump graupel case +XCG = 124. ! Lump graupel case +XDG = 0.66 ! Lump graupel case +! +XCCG = 5.E5 +XCXG = -0.5 +! XCCG = 4.E4 ! Test of Ziegler (1988) +! XCXG = -1.0 ! Test of Ziegler (1988) +! +XF0G = 0.86 +XF1G = 0.28 +! +XC1G = 1. / 2. +! +! +!* 2.5 Hailstone characteristics +! +XAH = 470. +XBH = 3.0 +XCH = 207. +XDH = 0.64 +! +XCCH = 4.E4 ! Test of Ziegler (1988) +XCXH = -1.0 ! Test of Ziegler (1988) +! +XF0H = 0.86 +XF1H = 0.28 +! +XC1H = 1./2. +! +!------------------------------------------------------------------------------- +! +!* 3. DIMENSIONAL DISTRIBUTIONS OF THE SPECIES +! ---------------------------------------- +! +! 3.1 Cloud droplet distribution +! +! Over land +XALPHAC = 1.0 ! Gamma law of the Cloud droplet (here volume-like distribution) +XNUC = 3.0 ! Gamma law with little dispersion +! +! +! Over sea +XALPHAC2 = 3.0 ! Gamma law of the Cloud droplet (here volume-like distribution) +XNUC2 = 1.0 ! Gamma law with little dispersion +! +!* 3.2 Raindrops distribution +! +XALPHAR = 1.0 ! Exponential law +XNUR = 1.0 ! Exponential law +! +!* 3.3 Ice crystal distribution +! +XALPHAI = 3.0 ! Gamma law for the ice crystal volume +XNUI = 3.0 ! Gamma law with little dispersion +! +XALPHAS = 1.0 ! Exponential law +XNUS = 1.0 ! Exponential law +! +XALPHAG = 1.0 ! Exponential law +XNUG = 1.0 ! Exponential law +! +XALPHAH = 1.0 ! Gamma law +XNUH = 8.0 ! Gamma law with little dispersion +! +!* 3.4 Constants for shape parameter +! +ZGAMC = MOMG(XALPHAC,XNUC,3.) +ZGAMC2 = MOMG(XALPHAC2,XNUC2,3.) +XLBC(1) = XAR * ZGAMC +XLBC(2) = XAR * ZGAMC2 +XLBEXC = 1.0 / XBC +! +XLBEXR = 1.0 / (-1.0 - XBR) +XLBR = (XAR * XCCR * MOMG(XALPHAR,XNUR,XBR))**(-XLBEXR) +! +XLBEXI = 1.0 / (-XBI) +XLBI = (XAI * MOMG(XALPHAI,XNUI,XBI))**(-XLBEXI) +! +XLBEXS = 1.0 / (XCXS - XBS) +XLBS = (XAS * XCCS * MOMG(XALPHAS,XNUS,XBS))**(-XLBEXS) +! +XLBEXG = 1.0 / (XCXG - XBG) +XLBG = (XAG * XCCG * MOMG(XALPHAG,XNUG,XBG))**(-XLBEXG) +! +XLBEXH = 1.0/(XCXH-XBH) +XLBH = (XAH * XCCH * MOMG(XALPHAH,XNUH,XBH))**(-XLBEXH) +! +!* 3.5 Minimal values allowed for the mixing ratios +! +XLBDAR_MAX = 100000.0 +XLBDAS_MAX = 100000.0 +XLBDAG_MAX = 100000.0 +! +ZCONC_MAX = 1.E6 ! Maximal concentration for falling particules set to 1 per cc +XLBDAS_MAX = (ZCONC_MAX / XCCS)**(1./XCXS) +! +IF (HCLOUD == 'ICE4') THEN + ALLOCATE( XRTMIN(7) ) +ELSE IF (HCLOUD == 'ICE3') THEN + ALLOCATE( XRTMIN(6) ) +END IF +! +XRTMIN(1) = 1.0E-20 +XRTMIN(2) = 1.0E-20 +XRTMIN(3) = 1.0E-20 +XRTMIN(4) = 1.0E-20 +XRTMIN(5) = 1.0E-15 +XRTMIN(6) = 1.0E-15 +IF (HCLOUD == 'ICE4') XRTMIN(7) = 1.0E-15 +! +XCONC_SEA = 1.E8 ! 100/cm3 +XCONC_LAND = 3.E8 ! 300/cm3 +XCONC_URBAN = 5.E8 ! 500/cm3 +! +!------------------------------------------------------------------------------- +! +!* 4. CONSTANTS FOR THE SEDIMENTATION +! ------------------------------- +! +!* 4.1 Exponent of the fall-speed air density correction +! +XCEXVT = 0.4 +! +IKB = 1 + JPVEXT +ZRHO00 = XP00 / (XRD * XTHVREFZ(IKB)) +! +!* 4.2 Constants for sedimentation +! +XFSEDC(1) = GAMMA(XNUC+(XDC+3.)/XALPHAC) / GAMMA(XNUC+3./XALPHAC) * & + (ZRHO00)**XCEXVT +XFSEDC(2) = GAMMA(XNUC2+(XDC+3.)/XALPHAC2) / GAMMA(XNUC2+3./XALPHAC2)* & + (ZRHO00)**XCEXVT +! +XEXSEDR = (XBR + XDR + 1.0) / (XBR + 1.0) +XFSEDR = XCR * XAR * XCCR * MOMG(XALPHAR,XNUR,XBR+XDR) * & + (XAR * XCCR * MOMG(XALPHAR,XNUR,XBR))**(-XEXSEDR) * (ZRHO00)**XCEXVT +! +XEXRSEDI = (XBI + XDI) / XBI +XEXCSEDI = 1.0 - XEXRSEDI +XFSEDI = (4. * XPI * 900.)**(-XEXCSEDI) * & + XC_I * XAI * MOMG(XALPHAI,XNUI,XBI+XDI) * & + ((XAI * MOMG(XALPHAI,XNUI,XBI)))**(-XEXRSEDI) * & + (ZRHO00)**XCEXVT +XFCI = (4. * XPI * 900.)**(-1) +! +! Computations made for Columns +! +XEXRSEDI = 1.9324 +XEXCSEDI =-0.9324 +XFSEDI = 3.89745E11 * MOMG(XALPHAI,XNUI,3.285) * & + MOMG(XALPHAI,XNUI,1.7)**(-XEXRSEDI)*(ZRHO00)**XCEXVT +XEXCSEDI =-0.9324 * 3.0 +WRITE (KLUOUT,FMT=*)' PRISTINE ICE SEDIMENTATION for columns XFSEDI =',XFSEDI +! +XEXSEDS = (XBS + XDS - XCXS) / (XBS - XCXS) +XFSEDS = XCS * XAS * XCCS * MOMG(XALPHAS,XNUS,XBS+XDS) * & + (XAS * XCCS * MOMG(XALPHAS,XNUS,XBS))**(-XEXSEDS) * (ZRHO00)**XCEXVT +! +XEXSEDG = (XBG + XDG - XCXG) / (XBG - XCXG) +XFSEDG = XCG * XAG * XCCG * MOMG(XALPHAG,XNUG,XBG+XDG) * & + (XAG * XCCG * MOMG(XALPHAG,XNUG,XBG))**(-XEXSEDG) * (ZRHO00)**XCEXVT +! +XEXSEDH = (XBH + XDH - XCXH) / (XBH - XCXH) +XFSEDH = XCH * XAH * XCCH * MOMG(XALPHAH,XNUH,XBH+XDH) * & + (XAH * XCCH * MOMG(XALPHAH,XNUH,XBH))**(-XEXSEDH) * (ZRHO00)**XCEXVT +! +! +!------------------------------------------------------------------------------- +! +!* 5. CONSTANTS FOR THE SLOW COLD PROCESSES +! ------------------------------------- +! +!* 5.1 Constants for ice nucleation +! +SELECT CASE (CPRISTINE_ICE) + CASE('PLAT') + ZFACT_NUCL = 1.0 ! Plates + CASE('COLU') + ZFACT_NUCL = 25.0 ! Columns + CASE('BURO') + ZFACT_NUCL = 17.0 ! Bullet rosettes +END SELECT +! +XNU10 = 50. * ZFACT_NUCL +XALPHA1 = 4.5 +XBETA1 = 0.6 +! +XNU20 = 1000. * ZFACT_NUCL +XALPHA2 = 12.96 +XBETA2 = 0.639 +! +XMNU0 = 6.88E-13 +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=KLUOUT,FMT='(" Heterogeneous nucleation")') + WRITE(UNIT=KLUOUT,FMT='(" NU10=",E13.6," ALPHA1=",E13.6," BETA1=",E13.6)') & + XNU10,XALPHA1,XBETA1 + WRITE(UNIT=KLUOUT,FMT='(" NU20=",E13.6," ALPHA2=",E13.6," BETA2=",E13.6)') & + XNU20,XALPHA2,XBETA2 + WRITE(UNIT=KLUOUT,FMT='(" mass of embryo XMNU0=",E13.6)') XMNU0 +END IF +! +XALPHA3 = -3.075 +XBETA3 = 81.00356 +XHON = (XPI / 6.) * ((2.0 * 3.0 * 4.0 * 5.0 * 6.0) / & + (2.0 * 3.0)) * (1.1E5)**(-3.0) + ! Pi/6 * (G_c(6)/G_c(3)) * (1/Lbda_c**3) + ! avec Lbda_c=1.1E5 m^-1 + ! the formula is equivalent to + ! rho_dref * r_c G(6) + ! Pi/6 * -------------- * --------- + ! rho_lw * N_c G(3)*G(3) +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=KLUOUT,FMT='(" Homogeneous nucleation")') + WRITE(UNIT=KLUOUT,FMT='(" ALPHA3=",E13.6," BETA3=",E13.6)') XALPHA3,XBETA3 + WRITE(UNIT=KLUOUT,FMT='(" constant XHON=",E13.6)') XHON +END IF +! +! +!* 5.2 Constants for vapor deposition on ice +! +XSCFAC = (0.63**(1./3.)) * SQRT((ZRHO00)**XCEXVT) ! One assumes Sc=0.63 +! +X0DEPI = (4.0 * XPI) * XC1I * XF0I * MOMG(XALPHAI,XNUI,1.) +X2DEPI = (4.0 * XPI) * XC1I * XF2I * XC_I * MOMG(XALPHAI,XNUI,XDI+2.0) +! +X0DEPS = (4.0 * XPI) * XCCS * XC1S * XF0S * MOMG(XALPHAS,XNUS,1.) +X1DEPS = (4.0 * XPI) * XCCS * XC1S * XF1S * SQRT(XCS) * MOMG(XALPHAS,XNUS,0.5*XDS+1.5) +XEX0DEPS = XCXS - 1.0 +XEX1DEPS = XCXS - 0.5 * (XDS + 3.0) +! +X0DEPG = (4.0 * XPI) * XCCG * XC1G * XF0G * MOMG(XALPHAG,XNUG,1.) +X1DEPG = (4.0 * XPI) * XCCG * XC1G * XF1G * SQRT(XCG) * MOMG(XALPHAG,XNUG,0.5*XDG+1.5) +XEX0DEPG = XCXG - 1.0 +XEX1DEPG = XCXG - 0.5 * (XDG + 3.0) +! +X0DEPH = (4.0 * XPI) * XCCH * XC1H * XF0H * MOMG(XALPHAH,XNUH,1.) +X1DEPH = (4.0 * XPI) * XCCH * XC1H * XF1H * SQRT(XCH) * MOMG(XALPHAH,XNUH,0.5*XDH+1.5) +XEX0DEPH = XCXH - 1.0 +XEX1DEPH = XCXH - 0.5 * (XDH + 3.0) +! +! +!* 5.3 Constants for pristine ice autoconversion +! +XTIMAUTI = 1.E-3 ! Time constant at T=T_t +XTEXAUTI = 0.015 ! Temperature factor of the I+I collection efficiency +XCRIAUTI = 0.2E-4 ! Critical ice content for the autoconversion to occur + ! Revised value by Chaboureau et al. (2001) +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=KLUOUT,FMT='(" pristine ice autoconversion")') + WRITE(UNIT=KLUOUT,FMT='(" Time constant XTIMAUTI=",E13.6)') XTIMAUTI + WRITE(UNIT=KLUOUT,FMT='(" Temp. factor XTEXAUTI=",E13.6)') XTEXAUTI + WRITE(UNIT=KLUOUT,FMT='(" Crit. ice cont. XCRIAUTI=",E13.6)') XCRIAUTI +END IF +! +! +!* 5.4 Constants for snow aggregation +! +XCOLIS = 0.25 ! Collection efficiency of I+S +XCOLEXIS = 0.05 ! Temperature factor of the I+S collection efficiency +XFIAGGS = (XPI / 4.0) * XCOLIS * XCCS * XCS * (ZRHO00**XCEXVT) * & + MOMG(XALPHAS,XNUS,XDS+2.0) +XEXIAGGS = XCXS - XDS - 2.0 +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=KLUOUT,FMT='(" snow aggregation")') + WRITE(UNIT=KLUOUT,FMT='(" Coll. efficiency XCOLIS=",E13.6)') XCOLIS + WRITE(UNIT=KLUOUT,FMT='(" Temp. factor XCOLEXIS=",E13.6)') XCOLEXIS +END IF +! +! +!------------------------------------------------------------------------------- +! +!* 6. CONSTANTS FOR THE SLOW WARM PROCESSES +! ------------------------------------- +! +!* 6.1 Constants for the cloud droplets autoconversion +! +XTIMAUTC = 1.E-3 +XCRIAUTC = 0.5E-3 +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=KLUOUT,FMT='(" cloud droplets autoconversion")') + WRITE(UNIT=KLUOUT,FMT='(" Time constant XTIMAUTC=",E13.6)') XTIMAUTC + WRITE(UNIT=KLUOUT,FMT='(" Crit. ice cont. XCRIAUTC=",E13.6)') XCRIAUTC +END IF +! +!* 6.2 Constants for the accretion of cloud droplets by raindrops +! +XFCACCR = (XPI / 4.0) * XCCR * XCR * (ZRHO00**XCEXVT) * MOMG(XALPHAR,XNUR,XDR+2.0) +XEXCACCR = -XDR - 3.0 +! +!* 6.3 Constants for the evaporation of the raindrops +! +X0EVAR = (4.0 * XPI) * XCCR * XC1R * XF0R * MOMG(XALPHAR,XNUR,1.) +X1EVAR = (4.0 * XPI) * XCCR * XC1R * XF1R * SQRT(XCR)*MOMG(XALPHAR,XNUR,0.5*XDR+1.5) +XEX0EVAR = -2.0 +XEX1EVAR = -1.0 - 0.5 * (XDR + 3.0) +! +! +!------------------------------------------------------------------------------- +! +!* 7. CONSTANTS FOR THE FAST COLD PROCESSES FOR THE AGGREGATES +! -------------------------------------------------------- +! +! +!* 7.1 Constants for the riming of the aggregates +! +XDCSLIM = 0.007 ! D_cs^lim = 7 mm as suggested by Farley et al. (1989) +XCOLCS = 1.0 +XEXCRIMSS= XCXS - XDS - 2.0 +XCRIMSS = (XPI / 4.0) * XCOLCS * XCCS * XCS * (ZRHO00**XCEXVT) * MOMG(XALPHAS,XNUS,XDS+2.0) +XEXCRIMSG= XEXCRIMSS +XCRIMSG = XCRIMSS +XSRIMCG = XCCS * XAS * MOMG(XALPHAS,XNUS,XBS) +XEXSRIMCG= XCXS - XBS +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=KLUOUT,FMT='(" riming of the aggregates")') + WRITE(UNIT=KLUOUT,FMT='(" D_cs^lim (Farley et al.) XDCSLIM=",E13.6)') XDCSLIM + WRITE(UNIT=KLUOUT,FMT='(" Coll. efficiency XCOLCS=",E13.6)') XCOLCS +END IF +! +NGAMINC = 80 +XGAMINC_BOUND_MIN = 1.0E-1 ! Minimal value of (Lbda * D_cs^lim)**alpha +XGAMINC_BOUND_MAX = 1.0E7 ! Maximal value of (Lbda * D_cs^lim)**alpha +ZRATE = EXP(LOG(XGAMINC_BOUND_MAX/XGAMINC_BOUND_MIN)/REAL(NGAMINC-1)) +! +IF( .NOT.ALLOCATED(XGAMINC_RIM1) ) ALLOCATE( XGAMINC_RIM1(NGAMINC) ) +IF( .NOT.ALLOCATED(XGAMINC_RIM2) ) ALLOCATE( XGAMINC_RIM2(NGAMINC) ) +IF( .NOT.ALLOCATED(XGAMINC_RIM3) ) ALLOCATE( XGAMINC_RIM3(NGAMINC) ) +! +DO J1 = 1, NGAMINC + ZBOUND = XGAMINC_BOUND_MIN * ZRATE**(J1-1) + XGAMINC_RIM1(J1) = GAMMA_INC(XNUS+(2.0+XDS)/XALPHAS,ZBOUND) + XGAMINC_RIM2(J1) = GAMMA_INC(XNUS+XBS/XALPHAS ,ZBOUND) + XFS = 1.3 ! cf values initiated in ini_param_elec + XGAMINC_RIM3(J1) = GAMMA_INC(XNUS+XFS/XALPHAS ,ZBOUND) +END DO +! +XRIMINTP1 = XALPHAS / LOG(ZRATE) +XRIMINTP2 = 1.0 + XRIMINTP1 * LOG(XDCSLIM/(XGAMINC_BOUND_MIN)**(1.0/XALPHAS)) +! +!* 7.2 Constants for the accretion of raindrops onto aggregates +! +XFRACCSS = ((XPI**2) / 24.0) * XCCS * XCCR * XRHOLW * (ZRHO00**XCEXVT) +! +XLBRACCS1 = MOMG(XALPHAS,XNUS,2.) * MOMG(XALPHAR,XNUR,3.) +XLBRACCS2 = 2. * MOMG(XALPHAS,XNUS,1.) * MOMG(XALPHAR,XNUR,4.) +XLBRACCS3 = MOMG(XALPHAR,XNUR,5.) +! +XFSACCRG = (XPI / 4.0) * XAS * XCCS * XCCR * (ZRHO00**XCEXVT) +! +XLBSACCR1 = MOMG(XALPHAR,XNUR,2.) * MOMG(XALPHAS,XNUS,XBS) +XLBSACCR2 = 2. * MOMG(XALPHAR,XNUR,1.) * MOMG(XALPHAS,XNUS,XBS+1.) +XLBSACCR3 = MOMG(XALPHAS,XNUS,XBS+2.) +! +!* 7.2.1 Defining the ranges for the computation of the kernels +! +! Notice: One magnitude of lambda discretized over 10 points for rain +! Notice: One magnitude of lambda discretized over 10 points for snow +! +NACCLBDAS = 40 +XACCLBDAS_MIN = 5.0E1 ! Minimal value of Lbda_s to tabulate XKER_RACCS +XACCLBDAS_MAX = 5.0E5 ! Maximal value of Lbda_s to tabulate XKER_RACCS +ZRATE = LOG(XACCLBDAS_MAX/XACCLBDAS_MIN)/REAL(NACCLBDAS-1) +XACCINTP1S = 1.0 / ZRATE +XACCINTP2S = 1.0 - LOG( XACCLBDAS_MIN ) / ZRATE +! +NACCLBDAR = 40 +XACCLBDAR_MIN = 1.0E3 ! Minimal value of Lbda_r to tabulate XKER_RACCS +XACCLBDAR_MAX = 1.0E7 ! Maximal value of Lbda_r to tabulate XKER_RACCS +ZRATE = LOG(XACCLBDAR_MAX/XACCLBDAR_MIN)/REAL(NACCLBDAR-1) +XACCINTP1R = 1.0 / ZRATE +XACCINTP2R = 1.0 - LOG( XACCLBDAR_MIN ) / ZRATE +! +!* 7.2.2 Computations of the tabulated normalized kernels +! +IND = 50 ! Interval number, collection efficiency and infinite diameter +ZESR = 1.0 ! factor used to integrate the dimensional distributions when +ZFDINFTY = 20.0 ! computing the kernels XKER_RACCSS, XKER_RACCS and XKER_SACCRG +! +IF( .NOT.ALLOCATED(XKER_RACCSS) ) ALLOCATE( XKER_RACCSS(NACCLBDAS,NACCLBDAR) ) +IF( .NOT.ALLOCATED(XKER_RACCS ) ) ALLOCATE( XKER_RACCS (NACCLBDAS,NACCLBDAR) ) +IF( .NOT.ALLOCATED(XKER_SACCRG) ) ALLOCATE( XKER_SACCRG(NACCLBDAR,NACCLBDAS) ) +! +CALL READ_XKER_RACCS (KACCLBDAS,KACCLBDAR,KND, & + PALPHAS,PNUS,PALPHAR,PNUR,PESR,PBS,PBR,PCS,PDS,PCR,PDR, & + PACCLBDAS_MAX,PACCLBDAR_MAX,PACCLBDAS_MIN,PACCLBDAR_MIN,& + PFDINFTY ) +IF( (KACCLBDAS/=NACCLBDAS) .OR. (KACCLBDAR/=NACCLBDAR) .OR. (KND/=IND) .OR. & + (PALPHAS/=XALPHAS) .OR. (PNUS/=XNUS) .OR. & + (PALPHAR/=XALPHAR) .OR. (PNUR/=XNUR) .OR. & + (PESR/=ZESR) .OR. (PBS/=XBS) .OR. (PBR/=XBR) .OR. & + (PCS/=XCS) .OR. (PDS/=XDS) .OR. (PCR/=XCR) .OR. (PDR/=XDR) .OR. & + (PACCLBDAS_MAX/=XACCLBDAS_MAX) .OR. (PACCLBDAR_MAX/=XACCLBDAR_MAX) .OR. & + (PACCLBDAS_MIN/=XACCLBDAS_MIN) .OR. (PACCLBDAR_MIN/=XACCLBDAR_MIN) .OR. & + (PFDINFTY/=ZFDINFTY) ) THEN + CALL RRCOLSS ( IND, XALPHAS, XNUS, XALPHAR, XNUR, & + ZESR, XBR, XCS, XDS, XCR, XDR, & + XACCLBDAS_MAX, XACCLBDAR_MAX, XACCLBDAS_MIN, XACCLBDAR_MIN, & + ZFDINFTY, XKER_RACCSS, XAG, XBS, XAS ) + CALL RZCOLX ( IND, XALPHAS, XNUS, XALPHAR, XNUR, & + ZESR, XBR, XCS, XDS, XCR, XDR, & + XACCLBDAS_MAX, XACCLBDAR_MAX, XACCLBDAS_MIN, XACCLBDAR_MIN, & + ZFDINFTY, XKER_RACCS ) + CALL RSCOLRG ( IND, XALPHAS, XNUS, XALPHAR, XNUR, & + ZESR, XBS, XCS, XDS, XCR, XDR, & + XACCLBDAS_MAX, XACCLBDAR_MAX, XACCLBDAS_MIN, XACCLBDAR_MIN, & + ZFDINFTY, XKER_SACCRG, XAG, XBS, XAS ) + WRITE(UNIT=KLUOUT,FMT='("*****************************************")') + WRITE(UNIT=KLUOUT,FMT='("**** UPDATE NEW SET OF RACSS KERNELS ****")') + WRITE(UNIT=KLUOUT,FMT='("**** UPDATE NEW SET OF RACS KERNELS ****")') + WRITE(UNIT=KLUOUT,FMT='("**** UPDATE NEW SET OF SACRG KERNELS ****")') + WRITE(UNIT=KLUOUT,FMT='("*****************************************")') + WRITE(UNIT=KLUOUT,FMT='("!")') + WRITE(UNIT=KLUOUT,FMT='("KND=",I3)') IND + WRITE(UNIT=KLUOUT,FMT='("KACCLBDAS=",I3)') NACCLBDAS + WRITE(UNIT=KLUOUT,FMT='("KACCLBDAR=",I3)') NACCLBDAR + WRITE(UNIT=KLUOUT,FMT='("PALPHAS=",E13.6)') XALPHAS + WRITE(UNIT=KLUOUT,FMT='("PNUS=",E13.6)') XNUS + WRITE(UNIT=KLUOUT,FMT='("PALPHAR=",E13.6)') XALPHAR + WRITE(UNIT=KLUOUT,FMT='("PNUR=",E13.6)') XNUR + WRITE(UNIT=KLUOUT,FMT='("PESR=",E13.6)') ZESR + WRITE(UNIT=KLUOUT,FMT='("PBS=",E13.6)') XBS + WRITE(UNIT=KLUOUT,FMT='("PBR=",E13.6)') XBR + WRITE(UNIT=KLUOUT,FMT='("PCS=",E13.6)') XCS + WRITE(UNIT=KLUOUT,FMT='("PDS=",E13.6)') XDS + WRITE(UNIT=KLUOUT,FMT='("PCR=",E13.6)') XCR + WRITE(UNIT=KLUOUT,FMT='("PDR=",E13.6)') XDR + WRITE(UNIT=KLUOUT,FMT='("PACCLBDAS_MAX=",E13.6)') & + XACCLBDAS_MAX + WRITE(UNIT=KLUOUT,FMT='("PACCLBDAR_MAX=",E13.6)') & + XACCLBDAR_MAX + WRITE(UNIT=KLUOUT,FMT='("PACCLBDAS_MIN=",E13.6)') & + XACCLBDAS_MIN + WRITE(UNIT=KLUOUT,FMT='("PACCLBDAR_MIN=",E13.6)') & + XACCLBDAR_MIN + WRITE(UNIT=KLUOUT,FMT='("PFDINFTY=",E13.6)') ZFDINFTY + WRITE(UNIT=KLUOUT,FMT='("!")') + WRITE(UNIT=KLUOUT,FMT='("IF( PRESENT(PKER_RACCSS) ) THEN")') + DO J1 = 1 , NACCLBDAS + DO J2 = 1 , NACCLBDAR + WRITE(UNIT=KLUOUT,FMT='(" PKER_RACCSS(",I3,",",I3,") = ",E13.6)') & + J1,J2,XKER_RACCSS(J1,J2) + END DO + END DO + WRITE(UNIT=KLUOUT,FMT='("END IF")') + WRITE(UNIT=KLUOUT,FMT='("!")') + WRITE(UNIT=KLUOUT,FMT='("IF( PRESENT(PKER_RACCS ) ) THEN")') + DO J1 = 1 , NACCLBDAS + DO J2 = 1 , NACCLBDAR + WRITE(UNIT=KLUOUT,FMT='(" PKER_RACCS (",I3,",",I3,") = ",E13.6)') & + J1,J2,XKER_RACCS (J1,J2) + END DO + END DO + WRITE(UNIT=KLUOUT,FMT='("END IF")') + WRITE(UNIT=KLUOUT,FMT='("!")') + WRITE(UNIT=KLUOUT,FMT='("IF( PRESENT(PKER_SACCRG) ) THEN")') + DO J1 = 1 , NACCLBDAR + DO J2 = 1 , NACCLBDAS + WRITE(UNIT=KLUOUT,FMT='(" PKER_SACCRG(",I3,",",I3,") = ",E13.6)') & + J1,J2,XKER_SACCRG(J1,J2) + END DO + END DO + WRITE(UNIT=KLUOUT,FMT='("END IF")') + ELSE + CALL READ_XKER_RACCS (KACCLBDAS,KACCLBDAR,KND, & + PALPHAS,PNUS,PALPHAR,PNUR,PESR,PBS,PBR,PCS,PDS,PCR,PDR, & + PACCLBDAS_MAX,PACCLBDAR_MAX,PACCLBDAS_MIN,PACCLBDAR_MIN,& + PFDINFTY,XKER_RACCSS,XKER_RACCS,XKER_SACCRG ) + WRITE(UNIT=KLUOUT,FMT='(" Read XKER_RACCSS")') + WRITE(UNIT=KLUOUT,FMT='(" Read XKER_RACCS ")') + WRITE(UNIT=KLUOUT,FMT='(" Read XKER_SACCRG")') +END IF +! +!* 7.3 Constant for the conversion-melting rate +! +XFSCVMG = 2.0 +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=KLUOUT,FMT='(" conversion-melting of the aggregates")') + WRITE(UNIT=KLUOUT,FMT='(" Conv. factor XFSCVMG=",E13.6)') XFSCVMG +END IF +! +! +!------------------------------------------------------------------------------- +! +!* 8. CONSTANTS FOR THE FAST COLD PROCESSES FOR THE GRAUPELN +! ------------------------------------------------------ +! +! +!* 8.1 Constants for the rain contact freezing +! +XCOLIR = 1.0 +! +XEXRCFRI = -XDR - 5.0 + ZXR +XRCFRI = ((XPI**2) / 24.0) * XCCR * XRHOLW * XCOLIR * XCR * & + (ZRHO00**XCEXVT) * MOMG(XALPHAR,XNUR,XDR+5.0) +XEXICFRR = -XDR - 2.0 + ZXR +XICFRR = (XPI / 4.0) * XCOLIR * XCR * (ZRHO00**XCEXVT) * & + XCCR * MOMG(XALPHAR,XNUR,XDR+2.0) +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=KLUOUT,FMT='(" rain contact freezing")') + WRITE(UNIT=KLUOUT,FMT='(" Coll. efficiency XCOLIR=",E13.6)') XCOLIR +END IF +! +! +!* 8.2 Constants for the dry growth of the graupeln +! +!* 8.2.1 Constants for the cloud droplet collection by the graupeln +! +XFCDRYG = (XPI / 4.0) * XCCG * XCG * (ZRHO00**XCEXVT) * MOMG(XALPHAG,XNUG,XDG+2.0) +! +!* 8.2.2 Constants for the cloud ice collection by the graupeln +! +XCOLIG = 0.25 ! Collection efficiency of I+G +XCOLEXIG = 0.05 ! Temperature factor of the I+G collection efficiency +XCOLIG = 0.01 ! Collection efficiency of I+G +XCOLEXIG = 0.1 ! Temperature factor of the I+G collection efficiency +WRITE (KLUOUT, FMT=*) ' NEW Constants for the cloud ice collection by the graupeln' +WRITE (KLUOUT, FMT=*) ' XCOLIG, XCOLEXIG = ',XCOLIG,XCOLEXIG +! +XFIDRYG = (XPI / 4.0) * XCOLIG * XCCG * XCG * (ZRHO00**XCEXVT) * & + MOMG(XALPHAG,XNUG,XDG+2.0) +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=KLUOUT,FMT='(" cloud ice collection by the graupeln")') + WRITE(UNIT=KLUOUT,FMT='(" Coll. efficiency XCOLIG=",E13.6)') XCOLIG + WRITE(UNIT=KLUOUT,FMT='(" Temp. factor XCOLEXIG=",E13.6)') XCOLEXIG +END IF +! +!* 8.2.3 Constants for the aggregate collection by the graupeln +! +XCOLSG = 0.25 ! Collection efficiency of S+G +XCOLEXSG = 0.05 ! Temperature factor of the S+G collection efficiency +XCOLSG = 0.01 ! Collection efficiency of S+G +XCOLEXSG = 0.1 ! Temperature factor of the S+G collection efficiency +WRITE (KLUOUT, FMT=*) ' NEW Constants for the aggregate collection by the graupeln' +WRITE (KLUOUT, FMT=*) ' XCOLSG, XCOLEXSG = ',XCOLSG,XCOLEXSG +! +XFSDRYG = (XPI / 4.0) * XCOLSG * XCCG * XCCS * XAS * (ZRHO00**XCEXVT) +! +XLBSDRYG1 = MOMG(XALPHAG,XNUG,2.) * MOMG(XALPHAS,XNUS,XBS) +XLBSDRYG2 = 2. * MOMG(XALPHAG,XNUG,1.) * MOMG(XALPHAS,XNUS,XBS+1.) +XLBSDRYG3 = MOMG(XALPHAS,XNUS,XBS+2.) +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=KLUOUT,FMT='(" aggregate collection by the graupeln")') + WRITE(UNIT=KLUOUT,FMT='(" Coll. efficiency XCOLSG=",E13.6)') XCOLSG + WRITE(UNIT=KLUOUT,FMT='(" Temp. factor XCOLEXSG=",E13.6)') XCOLEXSG +END IF +! +!* 8.2.4 Constants for the raindrop collection by the graupeln +! +XFRDRYG = ((XPI**2) / 24.0) * XCCG * XCCR * XRHOLW * (ZRHO00**XCEXVT) +! +XLBRDRYG1 = MOMG(XALPHAG,XNUG,2.) * MOMG(XALPHAR,XNUR,3.) +XLBRDRYG2 = 2. * MOMG(XALPHAG,XNUG,1.) * MOMG(XALPHAR,XNUR,4.) +XLBRDRYG3 = MOMG(XALPHAR,XNUR,5.) +! +! Notice: One magnitude of lambda discretized over 10 points +! +NDRYLBDAR = 40 +XDRYLBDAR_MIN = 1.0E3 ! Minimal value of Lbda_r to tabulate XKER_RDRYG +XDRYLBDAR_MAX = 1.0E7 ! Maximal value of Lbda_r to tabulate XKER_RDRYG +ZRATE = LOG(XDRYLBDAR_MAX/XDRYLBDAR_MIN) / REAL(NDRYLBDAR-1) +XDRYINTP1R = 1.0 / ZRATE +XDRYINTP2R = 1.0 - LOG( XDRYLBDAR_MIN ) / ZRATE +! +NDRYLBDAS = 80 +XDRYLBDAS_MIN = 2.5E1 ! Minimal value of Lbda_s to tabulate XKER_SDRYG +XDRYLBDAS_MAX = 2.5E9 ! Maximal value of Lbda_s to tabulate XKER_SDRYG +ZRATE = LOG(XDRYLBDAS_MAX/XDRYLBDAS_MIN) / REAL(NDRYLBDAS-1) +XDRYINTP1S = 1.0 / ZRATE +XDRYINTP2S = 1.0 - LOG( XDRYLBDAS_MIN ) / ZRATE +! +NDRYLBDAG = 40 +XDRYLBDAG_MIN = 1.0E3 ! Min value of Lbda_g to tabulate XKER_SDRYG,XKER_RDRYG +XDRYLBDAG_MAX = 1.0E7 ! Max value of Lbda_g to tabulate XKER_SDRYG,XKER_RDRYG +ZRATE = LOG(XDRYLBDAG_MAX/XDRYLBDAG_MIN) / REAL(NDRYLBDAG-1) +XDRYINTP1G = 1.0 / ZRATE +XDRYINTP2G = 1.0 - LOG( XDRYLBDAG_MIN ) / ZRATE +! +!* 8.2.5 Computations of the tabulated normalized kernels +! +IND = 50 ! Interval number, collection efficiency and infinite diameter +ZEGS = 1.0 ! factor used to integrate the dimensional distributions when +ZFDINFTY = 20.0 ! computing the kernels XKER_SDRYG +! +IF( .NOT.ALLOCATED(XKER_SDRYG) ) ALLOCATE( XKER_SDRYG(NDRYLBDAG,NDRYLBDAS) ) +! +CALL READ_XKER_SDRYG (KDRYLBDAG,KDRYLBDAS,KND, & + PALPHAG,PNUG,PALPHAS,PNUS,PEGS,PBS,PCG,PDG,PCS,PDS, & + PDRYLBDAG_MAX,PDRYLBDAS_MAX,PDRYLBDAG_MIN,PDRYLBDAS_MIN, & + PFDINFTY ) +IF( (KDRYLBDAG/=NDRYLBDAG) .OR. (KDRYLBDAS/=NDRYLBDAS) .OR. (KND/=IND) .OR. & + (PALPHAG/=XALPHAG) .OR. (PNUG/=XNUG) .OR. & + (PALPHAS/=XALPHAS) .OR. (PNUS/=XNUS) .OR. & + (PEGS/=ZEGS) .OR. (PBS/=XBS) .OR. & + (PCG/=XCG) .OR. (PDG/=XDG) .OR. (PCS/=XCS) .OR. (PDS/=XDS) .OR. & + (PDRYLBDAG_MAX/=XDRYLBDAG_MAX) .OR. (PDRYLBDAS_MAX/=XDRYLBDAS_MAX) .OR. & + (PDRYLBDAG_MIN/=XDRYLBDAG_MIN) .OR. (PDRYLBDAS_MIN/=XDRYLBDAS_MIN) .OR. & + (PFDINFTY/=ZFDINFTY) ) THEN + CALL RZCOLX ( IND, XALPHAG, XNUG, XALPHAS, XNUS, & + ZEGS, XBS, XCG, XDG, XCS, XDS, & + XDRYLBDAG_MAX, XDRYLBDAS_MAX, XDRYLBDAG_MIN, XDRYLBDAS_MIN, & + ZFDINFTY, XKER_SDRYG ) + WRITE(UNIT=KLUOUT,FMT='("*****************************************")') + WRITE(UNIT=KLUOUT,FMT='("**** UPDATE NEW SET OF SDRYG KERNELS ****")') + WRITE(UNIT=KLUOUT,FMT='("*****************************************")') + WRITE(UNIT=KLUOUT,FMT='("!")') + WRITE(UNIT=KLUOUT,FMT='("KND=",I3)') IND + WRITE(UNIT=KLUOUT,FMT='("KDRYLBDAG=",I3)') NDRYLBDAG + WRITE(UNIT=KLUOUT,FMT='("KDRYLBDAS=",I3)') NDRYLBDAS + WRITE(UNIT=KLUOUT,FMT='("PALPHAG=",E13.6)') XALPHAG + WRITE(UNIT=KLUOUT,FMT='("PNUG=",E13.6)') XNUG + WRITE(UNIT=KLUOUT,FMT='("PALPHAS=",E13.6)') XALPHAS + WRITE(UNIT=KLUOUT,FMT='("PNUS=",E13.6)') XNUS + WRITE(UNIT=KLUOUT,FMT='("PEGS=",E13.6)') ZEGS + WRITE(UNIT=KLUOUT,FMT='("PBS=",E13.6)') XBS + WRITE(UNIT=KLUOUT,FMT='("PCG=",E13.6)') XCG + WRITE(UNIT=KLUOUT,FMT='("PDG=",E13.6)') XDG + WRITE(UNIT=KLUOUT,FMT='("PCS=",E13.6)') XCS + WRITE(UNIT=KLUOUT,FMT='("PDS=",E13.6)') XDS + WRITE(UNIT=KLUOUT,FMT='("PDRYLBDAG_MAX=",E13.6)') & + XDRYLBDAG_MAX + WRITE(UNIT=KLUOUT,FMT='("PDRYLBDAS_MAX=",E13.6)') & + XDRYLBDAS_MAX + WRITE(UNIT=KLUOUT,FMT='("PDRYLBDAG_MIN=",E13.6)') & + XDRYLBDAG_MIN + WRITE(UNIT=KLUOUT,FMT='("PDRYLBDAS_MIN=",E13.6)') & + XDRYLBDAS_MIN + WRITE(UNIT=KLUOUT,FMT='("PFDINFTY=",E13.6)') ZFDINFTY + WRITE(UNIT=KLUOUT,FMT='("!")') + WRITE(UNIT=KLUOUT,FMT='("IF( PRESENT(PKER_SDRYG) ) THEN")') + DO J1 = 1 , NDRYLBDAG + DO J2 = 1 , NDRYLBDAS + WRITE(UNIT=KLUOUT,FMT='("PKER_SDRYG(",I3,",",I3,") = ",E13.6)') & + J1,J2,XKER_SDRYG(J1,J2) + END DO + END DO + WRITE(UNIT=KLUOUT,FMT='("END IF")') + ELSE + CALL READ_XKER_SDRYG (KDRYLBDAG,KDRYLBDAS,KND, & + PALPHAG,PNUG,PALPHAS,PNUS,PEGS,PBS,PCG,PDG,PCS,PDS, & + PDRYLBDAG_MAX,PDRYLBDAS_MAX,PDRYLBDAG_MIN,PDRYLBDAS_MIN, & + PFDINFTY,XKER_SDRYG ) + WRITE(UNIT=KLUOUT,FMT='(" Read XKER_SDRYG")') +END IF +! +! +IND = 50 ! Number of interval used to integrate the dimensional +ZEGR = 1.0 ! distributions when computing the kernel XKER_RDRYG +ZFDINFTY = 20.0 +! +IF( .NOT.ALLOCATED(XKER_RDRYG) ) ALLOCATE( XKER_RDRYG(NDRYLBDAG,NDRYLBDAR) ) +! +CALL READ_XKER_RDRYG (KDRYLBDAG,KDRYLBDAR,KND, & + PALPHAG,PNUG,PALPHAR,PNUR,PEGR,PBR,PCG,PDG,PCR,PDR, & + PDRYLBDAG_MAX,PDRYLBDAR_MAX,PDRYLBDAG_MIN,PDRYLBDAR_MIN, & + PFDINFTY ) +IF( (KDRYLBDAG/=NDRYLBDAG) .OR. (KDRYLBDAR/=NDRYLBDAR) .OR. (KND/=IND) .OR. & + (PALPHAG/=XALPHAG) .OR. (PNUG/=XNUG) .OR. & + (PALPHAR/=XALPHAR) .OR. (PNUR/=XNUR) .OR. & + (PEGR/=ZEGR) .OR. (PBR/=XBR) .OR. & + (PCG/=XCG) .OR. (PDG/=XDG) .OR. (PCR/=XCR) .OR. (PDR/=XDR) .OR. & + (PDRYLBDAG_MAX/=XDRYLBDAG_MAX) .OR. (PDRYLBDAR_MAX/=XDRYLBDAR_MAX) .OR. & + (PDRYLBDAG_MIN/=XDRYLBDAG_MIN) .OR. (PDRYLBDAR_MIN/=XDRYLBDAR_MIN) .OR. & + (PFDINFTY/=ZFDINFTY) ) THEN + CALL RZCOLX ( IND, XALPHAG, XNUG, XALPHAR, XNUR, & + ZEGR, XBR, XCG, XDG, XCR, XDR, & + XDRYLBDAG_MAX, XDRYLBDAR_MAX, XDRYLBDAG_MIN, XDRYLBDAR_MIN, & + ZFDINFTY, XKER_RDRYG ) + WRITE(UNIT=KLUOUT,FMT='("*****************************************")') + WRITE(UNIT=KLUOUT,FMT='("**** UPDATE NEW SET OF RDRYG KERNELS ****")') + WRITE(UNIT=KLUOUT,FMT='("*****************************************")') + WRITE(UNIT=KLUOUT,FMT='("!")') + WRITE(UNIT=KLUOUT,FMT='("KND=",I3)') IND + WRITE(UNIT=KLUOUT,FMT='("KDRYLBDAG=",I3)') NDRYLBDAG + WRITE(UNIT=KLUOUT,FMT='("KDRYLBDAR=",I3)') NDRYLBDAR + WRITE(UNIT=KLUOUT,FMT='("PALPHAG=",E13.6)') XALPHAG + WRITE(UNIT=KLUOUT,FMT='("PNUG=",E13.6)') XNUG + WRITE(UNIT=KLUOUT,FMT='("PALPHAR=",E13.6)') XALPHAR + WRITE(UNIT=KLUOUT,FMT='("PNUR=",E13.6)') XNUR + WRITE(UNIT=KLUOUT,FMT='("PEGR=",E13.6)') ZEGR + WRITE(UNIT=KLUOUT,FMT='("PBR=",E13.6)') XBR + WRITE(UNIT=KLUOUT,FMT='("PCG=",E13.6)') XCG + WRITE(UNIT=KLUOUT,FMT='("PDG=",E13.6)') XDG + WRITE(UNIT=KLUOUT,FMT='("PCR=",E13.6)') XCR + WRITE(UNIT=KLUOUT,FMT='("PDR=",E13.6)') XDR + WRITE(UNIT=KLUOUT,FMT='("PDRYLBDAG_MAX=",E13.6)') & + XDRYLBDAG_MAX + WRITE(UNIT=KLUOUT,FMT='("PDRYLBDAR_MAX=",E13.6)') & + XDRYLBDAR_MAX + WRITE(UNIT=KLUOUT,FMT='("PDRYLBDAG_MIN=",E13.6)') & + XDRYLBDAG_MIN + WRITE(UNIT=KLUOUT,FMT='("PDRYLBDAR_MIN=",E13.6)') & + XDRYLBDAR_MIN + WRITE(UNIT=KLUOUT,FMT='("PFDINFTY=",E13.6)') ZFDINFTY + WRITE(UNIT=KLUOUT,FMT='("!")') + WRITE(UNIT=KLUOUT,FMT='("IF( PRESENT(PKER_RDRYG) ) THEN")') + DO J1 = 1 , NDRYLBDAG + DO J2 = 1 , NDRYLBDAR + WRITE(UNIT=KLUOUT,FMT='("PKER_RDRYG(",I3,",",I3,") = ",E13.6)') & + J1,J2,XKER_RDRYG(J1,J2) + END DO + END DO + WRITE(UNIT=KLUOUT,FMT='("END IF")') + ELSE + CALL READ_XKER_RDRYG (KDRYLBDAG,KDRYLBDAR,KND, & + PALPHAG,PNUG,PALPHAR,PNUR,PEGR,PBR,PCG,PDG,PCR,PDR, & + PDRYLBDAG_MAX,PDRYLBDAR_MAX,PDRYLBDAG_MIN,PDRYLBDAR_MIN, & + PFDINFTY,XKER_RDRYG ) + WRITE(UNIT=KLUOUT,FMT='(" Read XKER_RDRYG")') +END IF +! +! +!------------------------------------------------------------------------------- +! +!* 9. CONSTANTS FOR THE FAST COLD PROCESSES FOR THE HAILSTONES +! -------------------------------------------------------- +! +!* 9.2 Constants for the wet growth of the hailstones +! +! +!* 9.2.1 Constant for the cloud droplet and cloud ice collection +! by the hailstones +! +XFWETH = (XPI / 4.0) * XCCH * XCH * (ZRHO00**XCEXVT) * MOMG(XALPHAH,XNUH,XDH+2.0) +! +!* 9.2.2 Constants for the aggregate collection by the hailstones +! +XFSWETH = (XPI/4.0) * XCCH * XCCS * XAS * (ZRHO00**XCEXVT) +! +XLBSWETH1 = MOMG(XALPHAH,XNUH,2.) * MOMG(XALPHAS,XNUS,XBS) +XLBSWETH2 = 2. * MOMG(XALPHAH,XNUH,1.) * MOMG(XALPHAS,XNUS,XBS+1.) +XLBSWETH3 = MOMG(XALPHAS,XNUS,XBS+2.) +! +!* 9.2.3 Constants for the graupel collection by the hailstones +! +XFGWETH = (XPI / 4.0) * XCCH * XCCG * XAG * (ZRHO00**XCEXVT) +! +XLBGWETH1 = MOMG(XALPHAH,XNUH,2.) * MOMG(XALPHAG,XNUG,XBG) +XLBGWETH2 = 2. * MOMG(XALPHAH,XNUH,1.) * MOMG(XALPHAG,XNUG,XBG+1.) +XLBGWETH3 = MOMG(XALPHAG,XNUG,XBG+2.) +! +! Notice: One magnitude of lambda discretized over 10 points +! +NWETLBDAS = 80 +XWETLBDAS_MIN = 2.5E1 ! Minimal value of Lbda_s to tabulate XKER_SWETH +XWETLBDAS_MAX = 2.5E9 ! Maximal value of Lbda_s to tabulate XKER_SWETH +ZRATE = LOG(XWETLBDAS_MAX/XWETLBDAS_MIN) / REAL(NWETLBDAS-1) +XWETINTP1S = 1.0 / ZRATE +XWETINTP2S = 1.0 - LOG( XWETLBDAS_MIN ) / ZRATE +NWETLBDAG = 40 +XWETLBDAG_MIN = 1.0E3 ! Min value of Lbda_g to tabulate XKER_GWETH +XWETLBDAG_MAX = 1.0E7 ! Max value of Lbda_g to tabulate XKER_GWETH +ZRATE = LOG(XWETLBDAG_MAX/XWETLBDAG_MIN) / REAL(NWETLBDAG-1) +XWETINTP1G = 1.0 / ZRATE +XWETINTP2G = 1.0 - LOG( XWETLBDAG_MIN ) / ZRATE +NWETLBDAH = 40 +XWETLBDAH_MIN = 1.0E3 ! Min value of Lbda_h to tabulate XKER_SWETH,XKER_GWETH +XWETLBDAH_MAX = 1.0E7 ! Max value of Lbda_h to tabulate XKER_SWETH,XKER_GWETH +ZRATE = LOG(XWETLBDAH_MAX/XWETLBDAH_MIN) / REAL(NWETLBDAH-1) +XWETINTP1H = 1.0 / ZRATE +XWETINTP2H = 1.0 - LOG( XWETLBDAH_MIN ) / ZRATE +! +!* 9.2.4 Computations of the tabulated normalized kernels +! +IND = 50 ! Interval number, collection efficiency and infinite diameter +ZEHS = 1.0 ! factor used to integrate the dimensional distributions when +ZFDINFTY = 20.0 ! computing the kernels XKER_SWETH +! +IF( .NOT.ALLOCATED(XKER_SWETH) ) ALLOCATE( XKER_SWETH(NWETLBDAH,NWETLBDAS) ) +! +CALL READ_XKER_SWETH (KWETLBDAH,KWETLBDAS,KND, & + PALPHAH,PNUH,PALPHAS,PNUS,PEHS,PBS,PCH,PDH,PCS,PDS, & + PWETLBDAH_MAX,PWETLBDAS_MAX,PWETLBDAH_MIN,PWETLBDAS_MIN, & + PFDINFTY ) +IF( (KWETLBDAH/=NWETLBDAH) .OR. (KWETLBDAS/=NWETLBDAS) .OR. (KND/=IND) .OR. & + (PALPHAH/=XALPHAH) .OR. (PNUH/=XNUH) .OR. & + (PALPHAS/=XALPHAS) .OR. (PNUS/=XNUS) .OR. & + (PEHS/=ZEHS) .OR. (PBS/=XBS) .OR. & + (PCH/=XCH) .OR. (PDH/=XDH) .OR. (PCS/=XCS) .OR. (PDS/=XDS) .OR. & + (PWETLBDAH_MAX/=XWETLBDAH_MAX) .OR. (PWETLBDAS_MAX/=XWETLBDAS_MAX) .OR. & + (PWETLBDAH_MIN/=XWETLBDAH_MIN) .OR. (PWETLBDAS_MIN/=XWETLBDAS_MIN) .OR. & + (PFDINFTY/=ZFDINFTY) ) THEN + CALL RZCOLX ( IND, XALPHAH, XNUH, XALPHAS, XNUS, & + ZEHS, XBS, XCH, XDH, XCS, XDS, & + XWETLBDAH_MAX, XWETLBDAS_MAX, XWETLBDAH_MIN, XWETLBDAS_MIN, & + ZFDINFTY, XKER_SWETH ) + WRITE(UNIT=KLUOUT,FMT='("*****************************************")') + WRITE(UNIT=KLUOUT,FMT='("**** UPDATE NEW SET OF SWETH KERNELS ****")') + WRITE(UNIT=KLUOUT,FMT='("*****************************************")') + WRITE(UNIT=KLUOUT,FMT='("!")') + WRITE(UNIT=KLUOUT,FMT='("KND=",I3)') IND + WRITE(UNIT=KLUOUT,FMT='("KWETLBDAH=",I3)') NWETLBDAH + WRITE(UNIT=KLUOUT,FMT='("KWETLBDAS=",I3)') NWETLBDAS + WRITE(UNIT=KLUOUT,FMT='("PALPHAH=",E13.6)') XALPHAH + WRITE(UNIT=KLUOUT,FMT='("PNUH=",E13.6)') XNUH + WRITE(UNIT=KLUOUT,FMT='("PALPHAS=",E13.6)') XALPHAS + WRITE(UNIT=KLUOUT,FMT='("PNUS=",E13.6)') XNUS + WRITE(UNIT=KLUOUT,FMT='("PEHS=",E13.6)') ZEHS + WRITE(UNIT=KLUOUT,FMT='("PBS=",E13.6)') XBS + WRITE(UNIT=KLUOUT,FMT='("PCH=",E13.6)') XCH + WRITE(UNIT=KLUOUT,FMT='("PDH=",E13.6)') XDH + WRITE(UNIT=KLUOUT,FMT='("PCS=",E13.6)') XCS + WRITE(UNIT=KLUOUT,FMT='("PDS=",E13.6)') XDS + WRITE(UNIT=KLUOUT,FMT='("PWETLBDAH_MAX=",E13.6)') & + XWETLBDAH_MAX + WRITE(UNIT=KLUOUT,FMT='("PWETLBDAS_MAX=",E13.6)') & + XWETLBDAS_MAX + WRITE(UNIT=KLUOUT,FMT='("PWETLBDAH_MIN=",E13.6)') & + XWETLBDAH_MIN + WRITE(UNIT=KLUOUT,FMT='("PWETLBDAS_MIN=",E13.6)') & + XWETLBDAS_MIN + WRITE(UNIT=KLUOUT,FMT='("PFDINFTY=",E13.6)') ZFDINFTY + WRITE(UNIT=KLUOUT,FMT='("!")') + WRITE(UNIT=KLUOUT,FMT='("IF( PRESENT(PKER_SWETH) ) THEN")') + DO J1 = 1 , NWETLBDAH + DO J2 = 1 , NWETLBDAS + WRITE(UNIT=KLUOUT,FMT='("PKER_SWETH(",I3,",",I3,") = ",E13.6)') & + J1,J2,XKER_SWETH(J1,J2) + END DO + END DO + WRITE(UNIT=KLUOUT,FMT='("END IF")') + ELSE + CALL READ_XKER_SWETH (KWETLBDAH,KWETLBDAS,KND, & + PALPHAH,PNUH,PALPHAS,PNUS,PEHS,PBS,PCH,PDH,PCS,PDS, & + PWETLBDAH_MAX,PWETLBDAS_MAX,PWETLBDAH_MIN,PWETLBDAS_MIN, & + PFDINFTY,XKER_SWETH ) + WRITE(UNIT=KLUOUT,FMT='(" Read XKER_SWETH")') +END IF +! +! +IND = 50 ! Number of interval used to integrate the dimensional +ZEHG = 1.0 ! distributions when computing the kernel XKER_GWETH +ZFDINFTY = 20.0 +! +IF( .NOT.ALLOCATED(XKER_GWETH) ) ALLOCATE( XKER_GWETH(NWETLBDAH,NWETLBDAG) ) +! +CALL READ_XKER_GWETH (KWETLBDAH,KWETLBDAG,KND, & + PALPHAH,PNUH,PALPHAG,PNUG,PEHG,PBG,PCH,PDH,PCG,PDG, & + PWETLBDAH_MAX,PWETLBDAG_MAX,PWETLBDAH_MIN,PWETLBDAG_MIN, & + PFDINFTY ) +IF( (KWETLBDAH/=NWETLBDAH) .OR. (KWETLBDAG/=NWETLBDAG) .OR. (KND/=IND) .OR. & + (PALPHAH/=XALPHAH) .OR. (PNUH/=XNUH) .OR. & + (PALPHAG/=XALPHAG) .OR. (PNUG/=XNUG) .OR. & + (PEHG/=ZEHG) .OR. (PBG/=XBG) .OR. & + (PCH/=XCH) .OR. (PDH/=XDH) .OR. (PCG/=XCG) .OR. (PDG/=XDG) .OR. & + (PWETLBDAH_MAX/=XWETLBDAH_MAX) .OR. (PWETLBDAG_MAX/=XWETLBDAG_MAX) .OR. & + (PWETLBDAH_MIN/=XWETLBDAH_MIN) .OR. (PWETLBDAG_MIN/=XWETLBDAG_MIN) .OR. & + (PFDINFTY/=ZFDINFTY) ) THEN + CALL RZCOLX ( IND, XALPHAH, XNUH, XALPHAG, XNUG, & + ZEHG, XBG, XCH, XDH, XCG, XDG, & + XWETLBDAH_MAX, XWETLBDAG_MAX, XWETLBDAH_MIN, XWETLBDAG_MIN, & + ZFDINFTY, XKER_GWETH ) + WRITE(UNIT=KLUOUT,FMT='("*****************************************")') + WRITE(UNIT=KLUOUT,FMT='("**** UPDATE NEW SET OF GWETH KERNELS ****")') + WRITE(UNIT=KLUOUT,FMT='("*****************************************")') + WRITE(UNIT=KLUOUT,FMT='("!")') + WRITE(UNIT=KLUOUT,FMT='("KND=",I3)') IND + WRITE(UNIT=KLUOUT,FMT='("KWETLBDAH=",I3)') NWETLBDAH + WRITE(UNIT=KLUOUT,FMT='("KWETLBDAG=",I3)') NWETLBDAG + WRITE(UNIT=KLUOUT,FMT='("PALPHAH=",E13.6)') XALPHAH + WRITE(UNIT=KLUOUT,FMT='("PNUH=",E13.6)') XNUH + WRITE(UNIT=KLUOUT,FMT='("PALPHAG=",E13.6)') XALPHAG + WRITE(UNIT=KLUOUT,FMT='("PNUG=",E13.6)') XNUG + WRITE(UNIT=KLUOUT,FMT='("PEHG=",E13.6)') ZEHG + WRITE(UNIT=KLUOUT,FMT='("PBG=",E13.6)') XBG + WRITE(UNIT=KLUOUT,FMT='("PCH=",E13.6)') XCH + WRITE(UNIT=KLUOUT,FMT='("PDH=",E13.6)') XDH + WRITE(UNIT=KLUOUT,FMT='("PCG=",E13.6)') XCG + WRITE(UNIT=KLUOUT,FMT='("PDG=",E13.6)') XDG + WRITE(UNIT=KLUOUT,FMT='("PWETLBDAH_MAX=",E13.6)') & + XWETLBDAH_MAX + WRITE(UNIT=KLUOUT,FMT='("PWETLBDAG_MAX=",E13.6)') & + XWETLBDAG_MAX + WRITE(UNIT=KLUOUT,FMT='("PWETLBDAH_MIN=",E13.6)') & + XWETLBDAH_MIN + WRITE(UNIT=KLUOUT,FMT='("PWETLBDAG_MIN=",E13.6)') & + XWETLBDAG_MIN + WRITE(UNIT=KLUOUT,FMT='("PFDINFTY=",E13.6)') ZFDINFTY + WRITE(UNIT=KLUOUT,FMT='("!")') + WRITE(UNIT=KLUOUT,FMT='("IF( PRESENT(PKER_GWETH) ) THEN")') + DO J1 = 1 , NWETLBDAH + DO J2 = 1 , NWETLBDAG + WRITE(UNIT=KLUOUT,FMT='("PKER_GWETH(",I3,",",I3,") = ",E13.6)') & + J1,J2,XKER_GWETH(J1,J2) + END DO + END DO + WRITE(UNIT=KLUOUT,FMT='("END IF")') + ELSE + CALL READ_XKER_GWETH (KWETLBDAH,KWETLBDAG,KND, & + PALPHAH,PNUH,PALPHAG,PNUG,PEHG,PBG,PCH,PDH,PCG,PDG, & + PWETLBDAH_MAX,PWETLBDAG_MAX,PWETLBDAH_MIN,PWETLBDAG_MIN, & + PFDINFTY,XKER_GWETH ) + WRITE(UNIT=KLUOUT,FMT='(" Read XKER_GWETH")') +END IF +! +! +!------------------------------------------------------------------------------- +! +!* 10. SOME PRINTS FOR CONTROL +! ----------------------- +! +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=KLUOUT,FMT='(" Summary of the ice particule characteristics")') + WRITE(UNIT=KLUOUT,FMT='(" PRISTINE ICE")') + WRITE(UNIT=KLUOUT,FMT='(" masse: A=",E13.6," B=",E13.6)') & + XAI,XBI + WRITE(UNIT=KLUOUT,FMT='(" vitesse: C=",E13.6," D=",E13.6)') & + XC_I,XDI + WRITE(UNIT=KLUOUT,FMT='(" distribution:AL=",E13.6,"NU=",E13.6)') & + XALPHAI,XNUI + WRITE(UNIT=KLUOUT,FMT='(" SNOW")') + WRITE(UNIT=KLUOUT,FMT='(" masse: A=",E13.6," B=",E13.6)') & + XAS,XBS + WRITE(UNIT=KLUOUT,FMT='(" vitesse: C=",E13.6," D=",E13.6)') & + XCS,XDS + WRITE(UNIT=KLUOUT,FMT='(" concentration:CC=",E13.6," x=",E13.6)') & + XCCS,XCXS + WRITE(UNIT=KLUOUT,FMT='(" distribution:AL=",E13.6,"NU=",E13.6)') & + XALPHAS,XNUS + WRITE(UNIT=KLUOUT,FMT='(" GRAUPEL")') + WRITE(UNIT=KLUOUT,FMT='(" masse: A=",E13.6," B=",E13.6)') & + XAG,XBG + WRITE(UNIT=KLUOUT,FMT='(" vitesse: C=",E13.6," D=",E13.6)') & + XCG,XDG + WRITE(UNIT=KLUOUT,FMT='(" concentration:CC=",E13.6," x=",E13.6)') & + XCCG,XCXG + WRITE(UNIT=KLUOUT,FMT='(" distribution:AL=",E13.6,"NU=",E13.6)') & + XALPHAG,XNUG + WRITE(UNIT=KLUOUT,FMT='(" HAIL")') + WRITE(UNIT=KLUOUT,FMT='(" masse: A=",E13.6," B=",E13.6)') & + XAH,XBH + WRITE(UNIT=KLUOUT,FMT='(" vitesse: C=",E13.6," D=",E13.6)') & + XCH,XDH + WRITE(UNIT=KLUOUT,FMT='(" concentration:CC=",E13.6," x=",E13.6)') & + XCCH,XCXH + WRITE(UNIT=KLUOUT,FMT='(" distribution:AL=",E13.6,"NU=",E13.6)') & + XALPHAH,XNUH +END IF +! +KINTVL = IND +PFDINFTY = ZFDINFTY +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE INI_RAIN_ICE_ELEC diff --git a/src/mesonh/micro/init_aerosol_properties.f90 b/src/mesonh/micro/init_aerosol_properties.f90 new file mode 100644 index 000000000..52f7ddc88 --- /dev/null +++ b/src/mesonh/micro/init_aerosol_properties.f90 @@ -0,0 +1,436 @@ +!MNH_LIC Copyright 2013-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! #################### + MODULE MODI_INIT_AEROSOL_PROPERTIES +INTERFACE + SUBROUTINE INIT_AEROSOL_PROPERTIES + END SUBROUTINE INIT_AEROSOL_PROPERTIES +END INTERFACE +END MODULE MODI_INIT_AEROSOL_PROPERTIES +! #################### +! +! ############################################################# + SUBROUTINE INIT_AEROSOL_PROPERTIES +! ############################################################# + +!! +!! +!! PURPOSE +!! ------- +!! +!! Define the aerosol properties +!! +!! +!! AUTHOR +!! ------ +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +!! Philippe Wautelet: 22/01/2019: bugs correction: incorrect writes + unauthorized goto +! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg +! P. Wautelet 30/03/2021: move NINDICE_CCN_IMM and NIMM initializations from init_aerosol_properties to ini_nsv +! B. Vié 06/2021: kappa-kohler CCN activation parameters +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_LUNIT, ONLY : TLUOUT0 +USE MODD_PARAM_LIMA, ONLY : NMOD_CCN, HINI_CCN, HTYPE_CCN, & + XR_MEAN_CCN, XLOGSIG_CCN, XRHO_CCN, & + XKHEN_MULTI, XMUHEN_MULTI, XBETAHEN_MULTI, & + XLIMIT_FACTOR, CCCN_MODES, LSCAV, & + XACTEMP_CCN, XFSOLUB_CCN, & + NMOD_IFN, NSPECIE, CIFN_SPECIES, & + XMDIAM_IFN, XSIGMA_IFN, XRHO_IFN, XFRAC, XFRAC_REF, & + CINT_MIXING, NPHILLIPS +! +use mode_msg +! +USE MODI_GAMMA +USE MODI_LIMA_INIT_CCN_ACTIVATION_SPECTRUM +! +IMPLICIT NONE +! +REAL :: XKHEN0 +REAL :: XLOGSIG0 +REAL :: XALPHA1 +REAL :: XMUHEN0 +REAL :: XALPHA2 +REAL :: XBETAHEN0 +REAL :: XR_MEAN0 +REAL :: XALPHA3 +REAL :: XALPHA4 +REAL :: XALPHA5 +REAL :: XACTEMP0 +REAL :: XALPHA6 +! +REAL, DIMENSION(6) :: XKHEN_TMP = (/1.56, 1.56, 1.56, 1.56, 1.56, 1.56 /) +REAL, DIMENSION(6) :: XMUHEN_TMP = (/0.80, 0.80, 0.80, 0.80, 0.80, 0.80 /) +REAL, DIMENSION(6) :: XBETAHEN_TMP= (/136., 136., 136., 136., 136., 136. /) +! +REAL, DIMENSION(3) :: RCCN +REAL, DIMENSION(3) :: LOGSIGCCN +REAL, DIMENSION(3) :: RHOCCN +! +INTEGER :: I,J,JMOD +! +INTEGER :: ILUOUT0 ! Logical unit number for output-listing +INTEGER :: IRESP ! Return code of FM-routines +! +REAL :: X1, X2, X3, X4, X5 +! REAL, DIMENSION(7) :: diameters=(/ 0.01E-6, 0.05E-6, 0.1E-6, 0.2E-6, 0.5E-6, 1.E-6, 2.E-6 /) +! REAL, DIMENSION(3) :: sigma=(/ 2., 2.5, 3. /) +! CHARACTER(LEN=7), DIMENSION(3) :: types=(/ 'NH42SO4', 'NaCl ', ' ' /) +!REAL, DIMENSION(1) :: diameters=(/ 0.25E-6 /) +!CHARACTER(LEN=7), DIMENSION(1) :: types=(/ ' ' /) +INTEGER :: II, IJ, IK +! +!------------------------------------------------------------------------------- +! +ILUOUT0 = TLUOUT0%NLU +! +!!!!!!!!!!!!!!!! +! CCN properties +!!!!!!!!!!!!!!!! +! +IF ( NMOD_CCN .GE. 1 ) THEN +! + IF (.NOT.(ALLOCATED(XR_MEAN_CCN))) ALLOCATE(XR_MEAN_CCN(NMOD_CCN)) + IF (.NOT.(ALLOCATED(XLOGSIG_CCN))) ALLOCATE(XLOGSIG_CCN(NMOD_CCN)) + IF (.NOT.(ALLOCATED(XRHO_CCN))) ALLOCATE(XRHO_CCN(NMOD_CCN)) +! + SELECT CASE (CCCN_MODES) + CASE ('JUNGFRAU') + RCCN(:) = (/ 0.02E-6 , 0.058E-6 , 0.763E-6 /) + LOGSIGCCN(:) = (/ 0.28 , 0.57 , 0.34 /) + RHOCCN(:) = (/ 1500. , 1500. , 1500. /) + CASE ('COPT') + RCCN(:) = (/ 0.125E-6 , 0.4E-6 , 1.0E-6 /) + LOGSIGCCN(:) = (/ 0.69 , 0.41 , 0.47 /) + RHOCCN(:) = (/ 1000. , 1000. , 1000. /) + CASE ('CAMS') + RCCN(:) = (/ 0.4E-6 , 0.25E-6 , 0.1E-6 /) + LOGSIGCCN(:) = (/ 0.64 , 0.47 , 0.47 /) + RHOCCN(:) = (/ 2160. , 2000. , 1750. /) + CASE ('CAMS_JPP') +! sea-salt, sulfate, hydrophilic (GADS data) + RCCN(:) = (/ 0.209E-6 , 0.0695E-6 , 0.0212E-6 /) + LOGSIGCCN(:) = (/ 0.708 , 0.708 , 0.806 /) + RHOCCN(:) = (/ 2200. , 1700. , 1800. /) + CASE ('CAMS_ACC') +! sea-salt, sulfate, hydrophilic (GADS data) + RCCN(:) = (/ 0.2E-6 , 0.5E-6 , 0.4E-6 /) + LOGSIGCCN(:) = (/ 0.693 , 0.476 , 0.788 /) + RHOCCN(:) = (/ 2200. , 1700. , 1800. /) + CASE ('CAMS_AIT') +! sea-salt, sulfate, hydrophilic (GADS data) + RCCN(:) = (/ 0.2E-6 , 0.05E-6 , 0.02E-6 /) + LOGSIGCCN(:) = (/ 0.693 , 0.693 , 0.788 /) + RHOCCN(:) = (/ 2200. , 1700. , 1800. /) + CASE ('SIRTA') + RCCN(:) = (/ 0.153E-6 , 0.058E-6 , 0.763E-6 /) + LOGSIGCCN(:) = (/ 0.846 , 0.57 , 0.34 /) + RHOCCN(:) = (/ 1500. , 1500. , 1500. /) + CASE ('CPS00') + RCCN(:) = (/ 0.0218E-6 , 0.058E-6 , 0.763E-6 /) + LOGSIGCCN(:) = (/ 1.16 , 0.57 , 0.34 /) + RHOCCN(:) = (/ 1500. , 1500. , 1500. /) + CASE ('MOCAGE') ! ordre : sulfates, sels marins, BC+O + RCCN(:) = (/ 0.01E-6 , 0.05E-6 , 0.008E-6 /) + LOGSIGCCN(:) = (/ 0.788 , 0.993 , 0.916 /) + RHOCCN(:) = (/ 1000. , 2200. , 1000. /) + CASE ('FREETROP') ! d'après Jaenicke 1993, aerosols troposphere libre, masse volumique typique + RCCN(:) = (/ 0.0035E-6 , 0.125E-6 , 0.26E-6 /) + LOGSIGCCN(:) = (/ 0.645 , 0.253 , 0.425 /) + RHOCCN(:) = (/ 1000. , 1000. , 1000. /) + CASE DEFAULT + call Print_msg(NVERB_FATAL,'GEN','INIT_AEROSOL_PROPERTIES','CCN_MODES must be JUNGFRAU, COPT, CAMS, CAMS_JPP,'// & + 'CAMS_ACC, CAMS_AIT, SIRTA, CPS00, MOCAGE or FREETROP') + ENDSELECT +! + DO I=1, MIN(NMOD_CCN,3) + XR_MEAN_CCN(I) = RCCN(I) + XLOGSIG_CCN(I) = LOGSIGCCN(I) + XRHO_CCN(I) = RHOCCN(I) + END DO +! + IF (NMOD_CCN .EQ. 4) THEN +! default values as coarse sea salt mode + XR_MEAN_CCN(4) = 1.75E-6 + XLOGSIG_CCN(4) = 0.708 + XRHO_CCN(4) = 2200. + END IF +! +! +! Compute CCN spectra parameters from CCN characteristics +! +!* INPUT : XBETAHEN_TEST is in 'percent' and XBETAHEN_MULTI in 'no units', +! XK... and XMU... are invariant +! + IF (.NOT.(ALLOCATED(XKHEN_MULTI))) ALLOCATE(XKHEN_MULTI(NMOD_CCN)) + IF (.NOT.(ALLOCATED(XMUHEN_MULTI))) ALLOCATE(XMUHEN_MULTI(NMOD_CCN)) + IF (.NOT.(ALLOCATED(XBETAHEN_MULTI))) ALLOCATE(XBETAHEN_MULTI(NMOD_CCN)) + IF (.NOT.(ALLOCATED(XLIMIT_FACTOR))) ALLOCATE(XLIMIT_FACTOR(NMOD_CCN)) +! + IF (HINI_CCN == 'CCN') THEN + IF (LSCAV) THEN +! Attention ! + WRITE(UNIT=ILUOUT0,FMT='("You are using a numerical initialization & + ¬ depending on the aerosol properties, however you need it for & + &scavenging. & + &With LSCAV = true, HINI_CCN should be set to AER for consistency")') + END IF +! Numerical initialization without dependence on AP physical properties + DO JMOD = 1, NMOD_CCN + XKHEN_MULTI(JMOD) = XKHEN_TMP(JMOD) + XMUHEN_MULTI(JMOD) = XMUHEN_TMP(JMOD) + XBETAHEN_MULTI(JMOD) = XBETAHEN_TMP(JMOD)*(100.)**2 +! no units relative to smax + XLIMIT_FACTOR(JMOD) = ( GAMMA_X0D(0.5*XKHEN_MULTI(JMOD)+1.)& + *GAMMA_X0D(XMUHEN_MULTI(JMOD)-0.5*XKHEN_MULTI(JMOD)) ) & + /( XBETAHEN_MULTI(JMOD)**(0.5*XKHEN_MULTI(JMOD)) & + *GAMMA_X0D(XMUHEN_MULTI(JMOD)) ) ! N/C + END DO + ELSE IF (HINI_CCN == 'AER') THEN +! +! Initialisation depending on aerosol physical properties +! +! First, computing k, mu, beta, and XLIMIT_FACTOR as in CPS2000 (eqs 9a-9c) +! +! XLIMIT_FACTOR replaces C, because C depends on the CCN number concentration +! which is therefore determined at each grid point and time step as +! Nccn / XLIMIT_FACTOR +! + DO JMOD = 1, NMOD_CCN +! +!!$ SELECT CASE (HTYPE_CCN(JMOD)) +!!$ CASE ('M') ! CCN marins +!!$ XKHEN0 = 3.251 +!!$ XLOGSIG0 = 0.4835 +!!$ XALPHA1 = -1.297 +!!$ XMUHEN0 = 2.589 +!!$ XALPHA2 = -1.511 +!!$ XBETAHEN0 = 621.689 +!!$ XR_MEAN0 = 0.133E-6 +!!$ XALPHA3 = 3.002 +!!$ XALPHA4 = 1.081 +!!$ XALPHA5 = 1.0 +!!$ XACTEMP0 = 290.16 +!!$ XALPHA6 = 2.995 +!!$ CASE ('C') ! CCN continentaux +!!$ XKHEN0 = 1.403 +!!$ XLOGSIG0 = 1.16 +!!$ XALPHA1 = -1.172 +!!$ XMUHEN0 = 0.834 +!!$ XALPHA2 = -1.350 +!!$ XBETAHEN0 = 25.499 +!!$ XR_MEAN0 = 0.0218E-6 +!!$ XALPHA3 = 3.057 +!!$ XALPHA4 = 4.092 +!!$ XALPHA5 = 1.011 +!!$ XACTEMP0 = 290.16 +!!$ XALPHA6 = 3.076 +!!$ CASE DEFAULT +!!$ call Print_msg(NVERB_FATAL,'GEN','INIT_AEROSOL_PROPERTIES','HTYPE_CNN(JMOD)=C or M must be specified'// & +!!$ ' in EXSEG1.nam for each CCN mode') +!!$ ENDSELECT +!!$! +!!$ XKHEN_MULTI(JMOD) = XKHEN0*(XLOGSIG_CCN(JMOD)/XLOGSIG0)**XALPHA1 +!!$ XMUHEN_MULTI(JMOD) = XMUHEN0*(XLOGSIG_CCN(JMOD)/XLOGSIG0)**XALPHA2 +!!$ XBETAHEN_MULTI(JMOD)=XBETAHEN0*(XR_MEAN_CCN(JMOD)/XR_MEAN0)**XALPHA3 & +!!$ * EXP( XALPHA4*((XLOGSIG_CCN(JMOD)/XLOGSIG0)-1.) ) & +!!$ * XFSOLUB_CCN**XALPHA5 & +!!$ * (XACTEMP_CCN/XACTEMP0)**XALPHA6 +!!$ XLIMIT_FACTOR(JMOD) = ( GAMMA_X0D(0.5*XKHEN_MULTI(JMOD)+1.) & +!!$ *GAMMA_X0D(XMUHEN_MULTI(JMOD)-0.5*XKHEN_MULTI(JMOD)) ) & +!!$ /( XBETAHEN_MULTI(JMOD)**(0.5*XKHEN_MULTI(JMOD)) & +!!$ *GAMMA_X0D(XMUHEN_MULTI(JMOD)) ) +!!$ +!!$ + CALL LIMA_INIT_CCN_ACTIVATION_SPECTRUM (HTYPE_CCN(JMOD),XR_MEAN_CCN(JMOD)*2.,EXP(XLOGSIG_CCN(JMOD)),X1,X2,X3,X4,X5) + ! + ! LIMA_INIT_CCN_ACTIVATION_SPECTRUM returns X1=C/Nccn (instead of XLIMIT_FACTOR), X2=k, X3=mu, X4=beta, X5=kappa + ! So XLIMIT_FACTOR = 1/X1 + ! Nc = Nccn/XLIMIT_FACTOR * S^k *F() = Nccn * X1 * S^k *F() + ! + XLIMIT_FACTOR(JMOD) = 1./X1 + XKHEN_MULTI(JMOD) = X2 + XMUHEN_MULTI(JMOD) = X3 + XBETAHEN_MULTI(JMOD)= X4 + ENDDO +! +! These parameters are correct for a nucleation spectra +! Nccn(Smax) = C Smax^k F(mu,k/2,1+k/2,-beta Smax^2) +! with Smax expressed in % (Smax=1 for a supersaturation of 1%). +! +! All the computations in LIMA are done for an adimensional Smax (Smax=0.01 for +! a 1% supersaturation). So beta and C (XLIMIT_FACTOR) are changed : +! new_beta = beta * 100^2 +! new_C = C * 100^k (ie XLIMIT_FACTOR = XLIMIT_FACTOR / 100^k) +! + XBETAHEN_MULTI(:) = XBETAHEN_MULTI(:) * 10000 + XLIMIT_FACTOR(:) = XLIMIT_FACTOR(:) / (100**XKHEN_MULTI(:)) + END IF +END IF ! NMOD_CCN > 0 +! +!!!!!!!!!!!!!!!! +! IFN properties +!!!!!!!!!!!!!!!! +! +IF ( NMOD_IFN .GE. 1 ) THEN + SELECT CASE (CIFN_SPECIES) + CASE ('MOCAGE') + NSPECIE = 4 + IF (.NOT.(ALLOCATED(XMDIAM_IFN))) ALLOCATE(XMDIAM_IFN(NSPECIE)) + IF (.NOT.(ALLOCATED(XSIGMA_IFN))) ALLOCATE(XSIGMA_IFN(NSPECIE)) + IF (.NOT.(ALLOCATED(XRHO_IFN))) ALLOCATE(XRHO_IFN(NSPECIE)) + XMDIAM_IFN = (/ 0.05E-6 , 3.E-6 , 0.016E-6 , 0.016E-6 /) + XSIGMA_IFN = (/ 2.4 , 1.6 , 2.5 , 2.5 /) + XRHO_IFN = (/ 2650. , 2650. , 1000. , 1000. /) + CASE ('CAMS_JPP') +! sea-salt, sulfate, hydrophilic (GADS data) +! 2 species, dust-metallic and hydrophobic (as BC) +! (Phillips et al. 2013 and GADS data) + NSPECIE = 4 ! DM1, DM2, BC, BIO+(O) + IF (.NOT.(ALLOCATED(XMDIAM_IFN))) ALLOCATE(XMDIAM_IFN(NSPECIE)) + IF (.NOT.(ALLOCATED(XSIGMA_IFN))) ALLOCATE(XSIGMA_IFN(NSPECIE)) + IF (.NOT.(ALLOCATED(XRHO_IFN))) ALLOCATE(XRHO_IFN(NSPECIE)) + XMDIAM_IFN = (/0.8E-6, 3.0E-6, 0.025E-6, 0.2E-6/) + XSIGMA_IFN = (/2.0, 2.15, 2.0, 1.6 /) + XRHO_IFN = (/2600., 2600., 1000., 1500./) + CASE ('CAMS_ACC') +! sea-salt, sulfate, hydrophilic (GADS data) +! 2 species, dust-metallic and hydrophobic (as BC) +! (Phillips et al. 2013 and GADS data) + NSPECIE = 4 ! DM1, DM2, BC, BIO+(O) + IF (.NOT.(ALLOCATED(XMDIAM_IFN))) ALLOCATE(XMDIAM_IFN(NSPECIE)) + IF (.NOT.(ALLOCATED(XSIGMA_IFN))) ALLOCATE(XSIGMA_IFN(NSPECIE)) + IF (.NOT.(ALLOCATED(XRHO_IFN))) ALLOCATE(XRHO_IFN(NSPECIE)) + XMDIAM_IFN = (/0.8E-6, 3.0E-6, 0.04E-6, 0.8E-6 /) + XSIGMA_IFN = (/2.0, 2.15, 2.0, 2.2 /) + XRHO_IFN = (/2600., 2600., 1000., 2000. /) + CASE ('CAMS_AIT') +! sea-salt, sulfate, hydrophilic (GADS data) +! 2 species, dust-metallic and hydrophobic (as BC) +! (Phillips et al. 2013 and GADS data) + NSPECIE = 4 ! DM1, DM2, BC, BIO+(O) + IF (.NOT.(ALLOCATED(XMDIAM_IFN))) ALLOCATE(XMDIAM_IFN(NSPECIE)) + IF (.NOT.(ALLOCATED(XSIGMA_IFN))) ALLOCATE(XSIGMA_IFN(NSPECIE)) + IF (.NOT.(ALLOCATED(XRHO_IFN))) ALLOCATE(XRHO_IFN(NSPECIE)) + XMDIAM_IFN = (/0.8E-6, 3.0E-6, 0.04E-6, 0.04E-6/) + XSIGMA_IFN = (/2.0, 2.15, 2.0, 2.2 /) + XRHO_IFN = (/2600., 2600., 1000., 1800./) + CASE DEFAULT + IF (NPHILLIPS == 8) THEN +! 4 species, according to Phillips et al. 2008 + NSPECIE = 4 + IF (.NOT.(ALLOCATED(XMDIAM_IFN))) ALLOCATE(XMDIAM_IFN(NSPECIE)) + IF (.NOT.(ALLOCATED(XSIGMA_IFN))) ALLOCATE(XSIGMA_IFN(NSPECIE)) + IF (.NOT.(ALLOCATED(XRHO_IFN))) ALLOCATE(XRHO_IFN(NSPECIE)) + XMDIAM_IFN = (/0.8E-6, 3.0E-6, 0.2E-6, 0.2E-6/) + XSIGMA_IFN = (/1.9, 1.6, 1.6, 1.6 /) + XRHO_IFN = (/2300., 2300., 1860., 1500./) + ELSE IF (NPHILLIPS == 13) THEN +! 4 species, according to Phillips et al. 2013 + NSPECIE = 4 + IF (.NOT.(ALLOCATED(XMDIAM_IFN))) ALLOCATE(XMDIAM_IFN(NSPECIE)) + IF (.NOT.(ALLOCATED(XSIGMA_IFN))) ALLOCATE(XSIGMA_IFN(NSPECIE)) + IF (.NOT.(ALLOCATED(XRHO_IFN))) ALLOCATE(XRHO_IFN(NSPECIE)) + XMDIAM_IFN = (/0.8E-6, 3.0E-6, 90.E-9, 0.163E-6/) + XSIGMA_IFN = (/1.9, 1.6, 1.6, 2.54 /) + XRHO_IFN = (/2300., 2300., 1860., 1000./) + END IF + ENDSELECT +! +! internal mixing +! + IF (.NOT.(ALLOCATED(XFRAC))) ALLOCATE(XFRAC(NSPECIE,NMOD_IFN)) + XFRAC(:,:)=0. + SELECT CASE (CINT_MIXING) + CASE ('DM1') + XFRAC(1,:)=1. + CASE ('DM2') + XFRAC(2,:)=1. + CASE ('BC') + XFRAC(3,:)=1. + CASE ('O') + XFRAC(4,:)=1. + CASE ('CAMS') + XFRAC(1,1)=0.99 + XFRAC(2,1)=0.01 + XFRAC(3,1)=0. + XFRAC(4,1)=0. + XFRAC(1,2)=0. + XFRAC(2,2)=0. + XFRAC(3,2)=0.5 + XFRAC(4,2)=0.5 + CASE ('CAMS_JPP') + XFRAC(1,1)=1.0 + XFRAC(2,1)=0.0 + XFRAC(3,1)=0.0 + XFRAC(4,1)=0.0 + XFRAC(1,2)=0.0 + XFRAC(2,2)=0.0 + XFRAC(3,2)=0.5 + XFRAC(4,2)=0.5 + CASE ('CAMS_ACC') + XFRAC(1,1)=1.0 + XFRAC(2,1)=0.0 + XFRAC(3,1)=0.0 + XFRAC(4,1)=0.0 + XFRAC(1,2)=0.0 + XFRAC(2,2)=0.0 + XFRAC(3,2)=0.0 + XFRAC(4,2)=1.0 + CASE ('CAMS_AIT') + XFRAC(1,1)=1.0 + XFRAC(2,1)=0.0 + XFRAC(3,1)=0.0 + XFRAC(4,1)=0.0 + XFRAC(1,2)=0.0 + XFRAC(2,2)=0.0 + XFRAC(3,2)=0.0 + XFRAC(4,2)=1.0 + CASE ('MOCAGE') + XFRAC(1,1)=1. + XFRAC(2,1)=0. + XFRAC(3,1)=0. + XFRAC(4,1)=0. + XFRAC(1,2)=0. + XFRAC(2,2)=0. + XFRAC(3,2)=0.7 + XFRAC(4,2)=0.3 + CASE DEFAULT + XFRAC(1,:)=0.6 + XFRAC(2,:)=0.009 + XFRAC(3,:)=0.33 + XFRAC(4,:)=0.06 + ENDSELECT +! +! Phillips 08 alpha (table 1) + IF (.NOT.(ALLOCATED(XFRAC_REF))) ALLOCATE(XFRAC_REF(4)) + IF (NPHILLIPS == 13) THEN + XFRAC_REF(1)=0.66 + XFRAC_REF(2)=0.66 + XFRAC_REF(3)=0.31 + XFRAC_REF(4)=0.03 + ELSE IF (NPHILLIPS == 8) THEN + XFRAC_REF(1)=0.66 + XFRAC_REF(2)=0.66 + XFRAC_REF(3)=0.28 + XFRAC_REF(4)=0.06 + END IF +! +END IF ! NMOD_IFN > 0 +! +END SUBROUTINE INIT_AEROSOL_PROPERTIES diff --git a/src/mesonh/micro/lima.f90 b/src/mesonh/micro/lima.f90 new file mode 100644 index 000000000..c248f1acf --- /dev/null +++ b/src/mesonh/micro/lima.f90 @@ -0,0 +1,1803 @@ +!MNH_LIC Copyright 2013-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ######spl +MODULE MODI_LIMA +! #################### +! +INTERFACE +! + SUBROUTINE LIMA ( KKA, KKU, KKL, & + PTSTEP, TPFILE, & + PRHODREF, PEXNREF, PDZZ, & + PRHODJ, PPABSM, PPABST, & + NCCN, NIFN, NIMM, & + PDTHRAD, PTHT, PRT, PSVT, PW_NU, & + PTHS, PRS, PSVS, & + PINPRC, PINDEP, PINPRR, PINPRI, PINPRS, PINPRG, PINPRH, & + PEVAP3D, PCLDFR, PICEFR, PPRCFR ) +! +USE MODD_IO, ONLY: TFILEDATA +USE MODD_NSV, only: NSV_LIMA_BEG +! +INTEGER, INTENT(IN) :: KKA !near ground array index +INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO +! +REAL, INTENT(IN) :: PTSTEP ! Time step +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! Layer thikness (m) +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! absolute pressure at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! absolute pressure at t +! +INTEGER, INTENT(IN) :: NCCN ! for array size declarations +INTEGER, INTENT(IN) :: NIFN ! for array size declarations +INTEGER, INTENT(IN) :: NIMM ! for array size declarations +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTHRAD ! dT/dt due to radiation +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! Mixing ratios at time t +REAL, DIMENSION(:,:,:,NSV_LIMA_BEG:), INTENT(IN) :: PSVT ! Concentrations at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PW_NU ! w for CCN activation +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRS ! Mixing ratios sources +REAL, DIMENSION(:,:,:,NSV_LIMA_BEG:), INTENT(INOUT) :: PSVS ! Concentration sources +! +REAL, DIMENSION(:,:), INTENT(OUT) :: PINPRC ! Cloud instant precip +REAL, DIMENSION(:,:), INTENT(OUT) :: PINDEP ! Cloud droplets deposition +REAL, DIMENSION(:,:), INTENT(OUT) :: PINPRR ! Rain instant precip +REAL, DIMENSION(:,:), INTENT(OUT) :: PINPRI ! Rain instant precip +REAL, DIMENSION(:,:), INTENT(OUT) :: PINPRS ! Snow instant precip +REAL, DIMENSION(:,:), INTENT(OUT) :: PINPRG ! Graupel instant precip +REAL, DIMENSION(:,:), INTENT(OUT) :: PINPRH ! Rain instant precip +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PEVAP3D ! Rain evap profile +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCLDFR ! Cloud fraction +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PICEFR ! Cloud fraction +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PPRCFR ! Cloud fraction +! +END SUBROUTINE LIMA +END INTERFACE +END MODULE MODI_LIMA +! +! +! ######spl + SUBROUTINE LIMA ( KKA, KKU, KKL, & + PTSTEP, TPFILE, & + PRHODREF, PEXNREF, PDZZ, & + PRHODJ, PPABSM, PPABST, & + NCCN, NIFN, NIMM, & + PDTHRAD, PTHT, PRT, PSVT, PW_NU, & + PTHS, PRS, PSVS, & + PINPRC, PINDEP, PINPRR, PINPRI, PINPRS, PINPRG, PINPRH, & + PEVAP3D, PCLDFR, PICEFR, PPRCFR ) +! ###################################################################### +! +!! PURPOSE +!! ------- +!! Compute explicit microphysical sources using the 2-moment scheme LIMA +!! using the time-splitting method +!! +!! REFERENCE +!! --------- +!! Vié et al. (GMD, 2016) +!! Meso-NH scientific documentation +!! +!! AUTHOR +!! ------ +!! S. Riette * CNRM * +!! B. Vié * CNRM * +!! +!! MODIFICATIONS +!! ------------- +!! Original 15/03/2018 +!! +! B. Vie 02/2019: minor correction on budget +! P. Wautelet 02/2020: use the new data structures and subroutines for budgets (no more budget calls in this subroutine) +! P. Wautelet 26/02/2020: bugfix: corrected condition to write budget CORR_BU_RRS +! B. Vie 03/03/2020: use DTHRAD instead of dT/dt in Smax diagnostic computation +! P. Wautelet 28/05/2020: bugfix: correct array start for PSVT and PSVS +! P. Wautelet 03/02/2021: budgets: add new source if LIMA splitting: CORR2 +! B. Vie 06/2021: add subgrid condensation with LIMA +!----------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +use modd_budget, only: lbu_enable, & + lbudget_th, lbudget_rv, lbudget_rc, lbudget_rr, lbudget_ri, & + lbudget_rs, lbudget_rg, lbudget_rh, lbudget_sv, & + NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, NBUDGET_RR, NBUDGET_RI, & + NBUDGET_RS, NBUDGET_RG, NBUDGET_RH, NBUDGET_SV1, & + tbudgets +USE MODD_CST, ONLY: XCI, XCL, XCPD, XCPV, XLSTT, XLVTT, XTT, XRHOLW, XP00, XRD +USE MODD_IO, ONLY: TFILEDATA +USE MODD_NSV, ONLY: NSV_LIMA_BEG, & + NSV_LIMA_NC, NSV_LIMA_NR, NSV_LIMA_CCN_FREE, NSV_LIMA_CCN_ACTI, & + NSV_LIMA_NI, NSV_LIMA_IFN_FREE, & + NSV_LIMA_IFN_NUCL, NSV_LIMA_IMM_NUCL, NSV_LIMA_HOM_HAZE +USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT +USE MODD_PARAM_LIMA, ONLY: LCOLD, LRAIN, LWARM, NMOD_CCN, NMOD_IFN, NMOD_IMM, LHHONI, & + LACTIT, LFEEDBACKT, NMAXITER, XMRSTEP, XTSTEP_TS, & + LSEDC, LSEDI, XRTMIN, XCTMIN, LDEPOC, XVDEPOC, & + LHAIL, LSNOW +USE MODD_PARAM_LIMA_COLD, ONLY: XAI, XBI +USE MODD_PARAM_LIMA_WARM, ONLY: XLBC, XLBEXC, XAC, XBC, XAR, XBR +USE MODD_TURB_n, ONLY: LSUBG_COND + +use mode_budget, only: Budget_store_add, Budget_store_init, Budget_store_end +use mode_tools, only: Countjv + +USE MODI_LIMA_COMPUTE_CLOUD_FRACTIONS +USE MODI_LIMA_DROPS_TO_DROPLETS_CONV +USE MODI_LIMA_INST_PROCS +USE MODI_LIMA_NUCLEATION_PROCS +USE MODI_LIMA_SEDIMENTATION +USE MODI_LIMA_TENDENCIES +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +INTEGER, INTENT(IN) :: KKA !near ground array index +INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO +! +REAL, INTENT(IN) :: PTSTEP ! Time step +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! Layer thikness (m) +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! absolute pressure at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! absolute pressure at t +! +INTEGER, INTENT(IN) :: NCCN ! for array size declarations +INTEGER, INTENT(IN) :: NIFN ! for array size declarations +INTEGER, INTENT(IN) :: NIMM ! for array size declarations +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTHRAD ! dT/dt due to radiation +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! Mixing ratios at time t +REAL, DIMENSION(:,:,:,NSV_LIMA_BEG:), INTENT(IN) :: PSVT ! Concentrations at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PW_NU ! w for CCN activation +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRS ! Mixing ratios sources +REAL, DIMENSION(:,:,:,NSV_LIMA_BEG:), INTENT(INOUT) :: PSVS ! Concentration sources +! +REAL, DIMENSION(:,:), INTENT(OUT) :: PINPRC ! Cloud instant precip +REAL, DIMENSION(:,:), INTENT(OUT) :: PINDEP ! Cloud droplets deposition +REAL, DIMENSION(:,:), INTENT(OUT) :: PINPRR ! Rain instant precip +REAL, DIMENSION(:,:), INTENT(OUT) :: PINPRI ! Rain instant precip +REAL, DIMENSION(:,:), INTENT(OUT) :: PINPRS ! Snow instant precip +REAL, DIMENSION(:,:), INTENT(OUT) :: PINPRG ! Graupel instant precip +REAL, DIMENSION(:,:), INTENT(OUT) :: PINPRH ! Rain instant precip +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PEVAP3D ! Rain evap profile +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCLDFR ! Cloud fraction +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PICEFR ! Cloud fraction +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PPRCFR ! Cloud fraction +! +!* 0.2 Declarations of local variables : +! +! +! Prognostic variables and sources +REAL, DIMENSION(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3)) :: ZTHT, ZRVT, ZRCT, ZRRT, ZRIT, ZRST, ZRGT, ZRHT +REAL, DIMENSION(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3)) :: ZCCT, ZCRT, ZCIT +REAL, DIMENSION(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3)) :: ZTHS, ZRVS, ZRCS, ZRRS, ZRIS, ZRSS, ZRGS, ZRHS +REAL, DIMENSION(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3)) :: ZCCS, ZCRS, ZCIS +REAL, DIMENSION(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3),NCCN) :: ZCCNFT, ZCCNAT +REAL, DIMENSION(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3),NCCN) :: ZCCNFS, ZCCNAS +REAL, DIMENSION(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3),NIFN) :: ZIFNFT, ZIFNNT +REAL, DIMENSION(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3),NIFN) :: ZIFNFS, ZIFNNS +REAL, DIMENSION(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3),NIMM) :: ZIMMNT +REAL, DIMENSION(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3),NIMM) :: ZIMMNS +REAL, DIMENSION(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3)) :: ZHOMFT +REAL, DIMENSION(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3)) :: ZHOMFS + +! +! Other 3D thermodynamical variables +REAL, DIMENSION(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3)) :: ZEXN, ZT + +! +! Packed prognostic & thermo variables +REAL, DIMENSION(:), ALLOCATABLE :: & + ZP1D, ZRHODREF1D, ZEXNREF1D, ZEXN1D, & + ZTHT1D, & + ZRVT1D, ZRCT1D, ZRRT1D, ZRIT1D, ZRST1D, ZRGT1D, ZRHT1D, & + ZCCT1D, ZCRT1D, ZCIT1D, & + ZEVAP1D +REAL, DIMENSION(:,:), ALLOCATABLE :: ZIFNN1D + +! +! for each process & species inside the loop, we need 1D packed variables to store instant tendencies for hydrometeors +REAL, DIMENSION(:), ALLOCATABLE :: & +! mixing ratio & concentration changes by instantaneous processes (kg/kg and #/kg) : + Z_CR_BRKU, & ! spontaneous break up of drops (BRKU) : Nr + Z_TH_HONR, Z_RR_HONR, Z_CR_HONR, & ! rain drops homogeneous freezing (HONR) : rr, Nr, rg=-rr, th + Z_TH_IMLT, Z_RC_IMLT, Z_CC_IMLT, & ! ice melting (IMLT) : rc, Nc, ri=-rc, Ni=-Nc, th, IFNF, IFNA +! mixing ratio & concentration tendencies by continuous processes (kg/kg/s and #/kg/s) : + Z_TH_HONC, Z_RC_HONC, Z_CC_HONC, & ! droplets homogeneous freezing (HONC) : rc, Nc, ri=-rc, Ni=-Nc, th + Z_CC_SELF, & ! self collection of droplets (SELF) : Nc + Z_RC_AUTO, Z_CC_AUTO, Z_CR_AUTO, & ! autoconversion of cloud droplets (AUTO) : rc, Nc, rr=-rc, Nr + Z_RC_ACCR, Z_CC_ACCR, & ! accretion of droplets by rain drops (ACCR) : rc, Nc, rr=-rr + Z_CR_SCBU, & ! self collectio break up of drops (SCBU) : Nr +! Z_TH_EVAP, Z_RC_EVAP, Z_CC_EVAP, Z_RR_EVAP, Z_CR_EVAP, & ! evaporation of rain drops (EVAP) : rv=-rr-rc, rc, Nc, rr, Nr, th + Z_TH_EVAP, Z_RR_EVAP, & ! evaporation of rain drops (EVAP) : rv=-rr-rc, rc, Nc, rr, Nr, th + Z_RI_CNVI, Z_CI_CNVI, & ! conversion snow -> ice (CNVI) : ri, Ni, rs=-ri + Z_TH_DEPS, Z_RS_DEPS, & ! deposition of vapor on snow (DEPS) : rv=-rs, rs, th + Z_TH_DEPI, Z_RI_DEPI, & ! deposition of vapor on ice (DEPI) : rv=-ri, ri, th + Z_RI_CNVS, Z_CI_CNVS, & ! conversion ice -> snow (CNVS) : ri, Ni, rs=-ri + Z_RI_AGGS, Z_CI_AGGS, & ! aggregation of ice on snow (AGGS) : ri, Ni, rs=-ri + Z_TH_DEPG, Z_RG_DEPG, & ! deposition of vapor on graupel (DEPG) : rv=-rg, rg, th + Z_TH_BERFI, Z_RC_BERFI, & ! Bergeron (BERFI) : rc, ri=-rc, th + Z_TH_RIM, Z_RC_RIM, Z_CC_RIM, Z_RS_RIM, Z_RG_RIM, & ! cloud droplet riming (RIM) : rc, Nc, rs, rg, th + Z_RI_HMS, Z_CI_HMS, Z_RS_HMS, & ! hallett mossop snow (HMS) : ri, Ni, rs + Z_TH_ACC, Z_RR_ACC, Z_CR_ACC, Z_RS_ACC, Z_RG_ACC, & ! rain accretion on aggregates (ACC) : rr, Nr, rs, rg, th + Z_RS_CMEL, & ! conversion-melting (CMEL) : rs, rg=-rs + Z_TH_CFRZ, Z_RR_CFRZ, Z_CR_CFRZ, Z_RI_CFRZ, Z_CI_CFRZ, & ! rain freezing (CFRZ) : rr, Nr, ri, Ni, rg=-rr-ri, th + Z_TH_WETG, Z_RC_WETG, Z_CC_WETG, Z_RR_WETG, Z_CR_WETG, & ! wet growth of graupel (WETG) : rc, NC, rr, Nr, ri, Ni, rs, rg, rh, th + Z_RI_WETG, Z_CI_WETG, Z_RS_WETG, Z_RG_WETG, Z_RH_WETG, & ! wet growth of graupel (WETG) : rc, NC, rr, Nr, ri, Ni, rs, rg, rh, th + Z_TH_DRYG, Z_RC_DRYG, Z_CC_DRYG, Z_RR_DRYG, Z_CR_DRYG, & ! dry growth of graupel (DRYG) : rc, Nc, rr, Nr, ri, Ni, rs, rg, th + Z_RI_DRYG, Z_CI_DRYG, Z_RS_DRYG, Z_RG_DRYG, & ! dry growth of graupel (DRYG) : rc, Nc, rr, Nr, ri, Ni, rs, rg, th + Z_RI_HMG, Z_CI_HMG, Z_RG_HMG, & ! hallett mossop graupel (HMG) : ri, Ni, rg + Z_TH_GMLT, Z_RR_GMLT, Z_CR_GMLT, & ! graupel melting (GMLT) : rr, Nr, rg=-rr, th +! Z_RC_WETH, Z_CC_WETH, Z_RR_WETH, Z_CR_WETH, & ! wet growth of hail (WETH) : rc, Nc, rr, Nr, ri, Ni, rs, rg, rh, th +! Z_RI_WETH, Z_CI_WETH, Z_RS_WETH, Z_RG_WETH, Z_RH_WETH, & ! wet growth of hail (WETH) : rc, Nc, rr, Nr, ri, Ni, rs, rg, rh, th +! Z_RG_COHG, & ! conversion of hail into graupel (COHG) : rg, rh +! Z_RR_HMLT, Z_CR_HMLT ! hail melting (HMLT) : rr, Nr, rh=-rr, th + Z_RV_CORR2, Z_RC_CORR2, Z_RR_CORR2, Z_RI_CORR2, & + Z_CC_CORR2, Z_CR_CORR2, Z_CI_CORR2 +! +! for the conversion from rain to cloud, we need a 3D variable instead of a 1D packed variable +REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: & + Z_RR_CVRC, Z_CR_CVRC ! conversion of rain into cloud droplets (CVRC) + +! +! Packed variables for total tendencies +REAL, DIMENSION(:), ALLOCATABLE :: & + ZA_TH, ZA_RV, ZA_RC, ZA_CC, ZA_RR, ZA_CR, ZA_RI, ZA_CI, ZA_RS, ZA_RG, ZA_RH, & ! ZA = continuous tendencies (kg/kg/s = S variable) + ZB_TH, ZB_RV, ZB_RC, ZB_CC, ZB_RR, ZB_CR, ZB_RI, ZB_CI, ZB_RS, ZB_RG, ZB_RH ! ZB = instant mixing ratio change (kg/kg = T variable) +REAL, DIMENSION(:,:), ALLOCATABLE :: ZB_IFNN + +! +! for each process & species, we need 3D variables to store total mmr and conc change (kg/kg and #/kg and theta) +REAL, DIMENSION(:,:,:), ALLOCATABLE :: & +! instantaneous processes : + ZTOT_CR_BRKU, & ! spontaneous break up of drops (BRKU) + ZTOT_TH_HONR, ZTOT_RR_HONR, ZTOT_CR_HONR, & ! rain drops homogeneous freezing (HONR) + ZTOT_TH_IMLT, ZTOT_RC_IMLT, ZTOT_CC_IMLT, & ! ice melting (IMLT) +! continuous processes : + ZTOT_TH_HONC, ZTOT_RC_HONC, ZTOT_CC_HONC, & ! droplets homogeneous freezing (HONC) + ZTOT_CC_SELF, & ! self collection of droplets (SELF) + ZTOT_RC_AUTO, ZTOT_CC_AUTO, ZTOT_CR_AUTO, & ! autoconversion of cloud droplets (AUTO) + ZTOT_RC_ACCR, ZTOT_CC_ACCR, & ! accretion of droplets by rain drops (ACCR) + ZTOT_CR_SCBU, & ! self collectio break up of drops (SCBU) +! ZTOT_TH_EVAP, ZTOT_RC_EVAP, ZTOT_CC_EVAP, ZTOT_RR_EVAP, ZTOT_CR_EVAP, & ! evaporation of rain drops (EVAP) + ZTOT_TH_EVAP, ZTOT_RR_EVAP, & ! evaporation of rain drops (EVAP) + ZTOT_RI_CNVI, ZTOT_CI_CNVI, & ! conversion snow -> ice (CNVI) + ZTOT_TH_DEPS, ZTOT_RS_DEPS, & ! deposition of vapor on snow (DEPS) + ZTOT_TH_DEPI, ZTOT_RI_DEPI, & ! deposition of vapor on ice (DEPI) + ZTOT_RI_CNVS, ZTOT_CI_CNVS, & ! conversion ice -> snow (CNVS) + ZTOT_RI_AGGS, ZTOT_CI_AGGS, & ! aggregation of ice on snow (AGGS) + ZTOT_TH_DEPG, ZTOT_RG_DEPG, & ! deposition of vapor on graupel (DEPG) + ZTOT_TH_BERFI, ZTOT_RC_BERFI, & ! Bergeron (BERFI) + ZTOT_TH_RIM, ZTOT_RC_RIM, ZTOT_CC_RIM, ZTOT_RS_RIM, ZTOT_RG_RIM, & ! cloud droplet riming (RIM) + ZTOT_RI_HMS, ZTOT_CI_HMS, ZTOT_RS_HMS, & ! hallett mossop snow (HMS) + ZTOT_TH_ACC, ZTOT_RR_ACC, ZTOT_CR_ACC, ZTOT_RS_ACC, ZTOT_RG_ACC, & ! rain accretion on aggregates (ACC) + ZTOT_RS_CMEL, & ! conversion-melting (CMEL) + ZTOT_TH_CFRZ, ZTOT_RR_CFRZ, ZTOT_CR_CFRZ, ZTOT_RI_CFRZ, ZTOT_CI_CFRZ, & ! rain freezing (CFRZ) + ZTOT_TH_WETG, ZTOT_RC_WETG, ZTOT_CC_WETG, ZTOT_RR_WETG, ZTOT_CR_WETG, & ! wet growth of graupel (WETG) + ZTOT_RI_WETG, ZTOT_CI_WETG, ZTOT_RS_WETG, ZTOT_RG_WETG, ZTOT_RH_WETG, & ! wet growth of graupel (WETG) + ZTOT_TH_DRYG, ZTOT_RC_DRYG, ZTOT_CC_DRYG, ZTOT_RR_DRYG, ZTOT_CR_DRYG, & ! dry growth of graupel (DRYG) + ZTOT_RI_DRYG, ZTOT_CI_DRYG, ZTOT_RS_DRYG, ZTOT_RG_DRYG, & ! dry growth of graupel (DRYG) + ZTOT_RI_HMG, ZTOT_CI_HMG, ZTOT_RG_HMG, & ! hallett mossop graupel (HMG) + ZTOT_TH_GMLT, ZTOT_RR_GMLT, ZTOT_CR_GMLT, & ! graupel melting (GMLT) +! ZTOT_RC_WETH, ZTOT_CC_WETH, ZTOT_RR_WETH, ZTOT_CR_WETH, & ! wet growth of hail (WETH) +! ZTOT_RI_WETH, ZTOT_CI_WETH, ZTOT_RS_WETH, ZTOT_RG_WETH, ZTOT_RH_WETH, & ! wet growth of hail (WETH) +! ZTOT_RG_COHG, & ! conversion of hail into graupel (COHG) +! ZTOT_RR_HMLT, ZTOT_CR_HMLT, & ! hail melting (HMLT) + ZTOT_RR_CVRC, ZTOT_CR_CVRC, & ! conversion of rain into cloud droplets if diameter too small + ZTOT_RV_CORR2, ZTOT_RC_CORR2, ZTOT_RR_CORR2, ZTOT_RI_CORR2, & + ZTOT_CC_CORR2, ZTOT_CR_CORR2, ZTOT_CI_CORR2 +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZTOT_IFNN_IMLT + +! +!For mixing-ratio splitting +REAL, DIMENSION(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3)) :: Z0RVT, Z0RCT, Z0RRT, Z0RIT, Z0RST, Z0RGT, Z0RHT +REAL, DIMENSION(:), ALLOCATABLE :: Z0RVT1D, Z0RCT1D, Z0RRT1D, Z0RIT1D, Z0RST1D, Z0RGT1D, Z0RHT1D + +! +! Loop control variables +REAL, DIMENSION(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3)) :: ZTIME, ZTIME_LASTCALL, IITER +REAL, DIMENSION(:), ALLOCATABLE :: ZTIME1D, ZTIME_LASTCALL1D, IITER1D, ZMAXTIME, ZTIME_THRESHOLD +LOGICAL, DIMENSION(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3)) :: LLCOMPUTE +LOGICAL, DIMENSION(:), ALLOCATABLE :: LLCOMPUTE1D +REAL :: ZTSTEP +INTEGER :: INB_ITER_MAX +! +!For subgrid clouds +REAL, DIMENSION(:), ALLOCATABLE :: ZCF1D, ZIF1D, ZPF1D ! 1D packed cloud, ice and precip. frac. + +! +! Various parameters +! domain size and levels (AROME compatibility) +INTEGER :: KRR +INTEGER :: IIB, IIE, IIT, IJB, IJE, IJT, IKB, IKE, IKT, IKTB, IKTE +! loops and packing +INTEGER :: II, IPACK, JI, JJ, JK +integer :: idx +INTEGER, DIMENSION(:), ALLOCATABLE :: I1, I2, I3 +! Inverse ov PTSTEP +REAL :: ZINV_TSTEP +! Work arrays +REAL, DIMENSION(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3)) :: ZW3D +REAL, DIMENSION(SIZE(PRT,1),SIZE(PRT,2)) :: ZW2D +REAL, DIMENSION(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3)) :: ZRT_SUM ! Total condensed water mr +REAL, DIMENSION(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3)) :: ZCPT ! Total condensed water mr +LOGICAL, DIMENSION(SIZE(PRT,1),SIZE(PRT,2)) :: GDEP +real, dimension(:,:,:), allocatable :: zrhodjontstep +! +!------------------------------------------------------------------------------- +! +!* 0. Init +! ---- +! +! +IIB=1+JPHEXT ! first physical point in i +IIT=SIZE(PDZZ,1) ! total number of points in i +IIE=IIT - JPHEXT ! last physical point in i +! +IJB=1+JPHEXT ! first physical point in j +IJT=SIZE(PDZZ,2) ! total number of points in j +IJE=IJT - JPHEXT ! last physical point in j +! +IKB=KKA+JPVEXT*KKL ! near ground physical point +IKE=KKU-JPVEXT*KKL ! near TOA physical point +IKT=SIZE(PDZZ,3) ! total number of points in k +! +IKTB=1+JPVEXT ! first index for a physical point in k +IKTE=IKT-JPVEXT ! last index for a physical point in k +! +ZTHS(:,:,:) = PTHS(:,:,:) +ZTHT(:,:,:) = PTHS(:,:,:) * PTSTEP +ZRVT(:,:,:) = 0. +ZRVS(:,:,:) = 0. +ZRCT(:,:,:) = 0. +ZRCS(:,:,:) = 0. +ZRRT(:,:,:) = 0. +ZRRS(:,:,:) = 0. +ZRIT(:,:,:) = 0. +ZRIS(:,:,:) = 0. +ZRST(:,:,:) = 0. +ZRSS(:,:,:) = 0. +ZRGT(:,:,:) = 0. +ZRGS(:,:,:) = 0. +ZRHT(:,:,:) = 0. +ZRHS(:,:,:) = 0. +ZRT_SUM(:,:,:) = 0. +ZCCT(:,:,:) = 0. +ZCCS(:,:,:) = 0. +ZCRT(:,:,:) = 0. +ZCRS(:,:,:) = 0. +ZCIT(:,:,:) = 0. +ZCIS(:,:,:) = 0. +ZCCNFT(:,:,:,:) = 0. +ZCCNAT(:,:,:,:) = 0. +ZCCNFS(:,:,:,:) = 0. +ZCCNAS(:,:,:,:) = 0. +ZIFNFT(:,:,:,:) = 0. +ZIFNNT(:,:,:,:) = 0. +ZIFNFS(:,:,:,:) = 0. +ZIFNNS(:,:,:,:) = 0. +ZIMMNT(:,:,:,:) = 0. +ZIMMNS(:,:,:,:) = 0. +ZHOMFT(:,:,:) = 0. +ZHOMFS(:,:,:) = 0. + +if ( lbu_enable ) then + allocate( ZTOT_CR_BRKU (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CR_BRKU(:,:,:) = 0. + allocate( ZTOT_TH_HONR (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_TH_HONR(:,:,:) = 0. + allocate( ZTOT_RR_HONR (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RR_HONR(:,:,:) = 0. + allocate( ZTOT_CR_HONR (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CR_HONR(:,:,:) = 0. + allocate( ZTOT_TH_IMLT (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_TH_IMLT(:,:,:) = 0. + allocate( ZTOT_RC_IMLT (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RC_IMLT(:,:,:) = 0. + allocate( ZTOT_CC_IMLT (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CC_IMLT(:,:,:) = 0. + allocate( ZTOT_IFNN_IMLT (size( ptht, 1), size( ptht, 2), size( ptht, 3), nmod_ifn ) ); ZTOT_IFNN_IMLT(:,:,:,:) = 0. + allocate( ZTOT_TH_HONC (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_TH_HONC(:,:,:) = 0. + allocate( ZTOT_RC_HONC (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RC_HONC(:,:,:) = 0. + allocate( ZTOT_CC_HONC (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CC_HONC(:,:,:) = 0. + allocate( ZTOT_CC_SELF (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CC_SELF(:,:,:) = 0. + allocate( ZTOT_RC_AUTO (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RC_AUTO(:,:,:) = 0. + allocate( ZTOT_CC_AUTO (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CC_AUTO(:,:,:) = 0. + allocate( ZTOT_CR_AUTO (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CR_AUTO(:,:,:) = 0. + allocate( ZTOT_RC_ACCR (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RC_ACCR(:,:,:) = 0. + allocate( ZTOT_CC_ACCR (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CC_ACCR(:,:,:) = 0. + allocate( ZTOT_CR_SCBU (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CR_SCBU(:,:,:) = 0. + allocate( ZTOT_TH_EVAP (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_TH_EVAP(:,:,:) = 0. +! allocate( ZTOT_RC_EVAP (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RC_EVAP(:,:,:) = 0. +! allocate( ZTOT_CC_EVAP (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CC_EVAP(:,:,:) = 0. + allocate( ZTOT_RR_EVAP (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RR_EVAP(:,:,:) = 0. +! allocate( ZTOT_CR_EVAP (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CR_EVAP(:,:,:) = 0. + allocate( ZTOT_RI_CNVI (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RI_CNVI(:,:,:) = 0. + allocate( ZTOT_CI_CNVI (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CI_CNVI(:,:,:) = 0. + allocate( ZTOT_TH_DEPS (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_TH_DEPS(:,:,:) = 0. + allocate( ZTOT_RS_DEPS (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RS_DEPS(:,:,:) = 0. + allocate( ZTOT_TH_DEPI (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_TH_DEPI(:,:,:) = 0. + allocate( ZTOT_RI_DEPI (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RI_DEPI(:,:,:) = 0. + allocate( ZTOT_RI_CNVS (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RI_CNVS(:,:,:) = 0. + allocate( ZTOT_CI_CNVS (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CI_CNVS(:,:,:) = 0. + allocate( ZTOT_RI_AGGS (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RI_AGGS(:,:,:) = 0. + allocate( ZTOT_CI_AGGS (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CI_AGGS(:,:,:) = 0. + allocate( ZTOT_TH_DEPG (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_TH_DEPG(:,:,:) = 0. + allocate( ZTOT_RG_DEPG (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RG_DEPG(:,:,:) = 0. + allocate( ZTOT_TH_BERFI(size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_TH_BERFI(:,:,:) = 0. + allocate( ZTOT_RC_BERFI(size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RC_BERFI(:,:,:) = 0. + allocate( ZTOT_TH_RIM (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_TH_RIM(:,:,:) = 0. + allocate( ZTOT_RC_RIM (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RC_RIM(:,:,:) = 0. + allocate( ZTOT_CC_RIM (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CC_RIM(:,:,:) = 0. + allocate( ZTOT_RS_RIM (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RS_RIM(:,:,:) = 0. + allocate( ZTOT_RG_RIM (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RG_RIM(:,:,:) = 0. + allocate( ZTOT_RI_HMS (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RI_HMS(:,:,:) = 0. + allocate( ZTOT_CI_HMS (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CI_HMS(:,:,:) = 0. + allocate( ZTOT_RS_HMS (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RS_HMS(:,:,:) = 0. + allocate( ZTOT_TH_ACC (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_TH_ACC(:,:,:) = 0. + allocate( ZTOT_RR_ACC (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RR_ACC(:,:,:) = 0. + allocate( ZTOT_CR_ACC (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CR_ACC(:,:,:) = 0. + allocate( ZTOT_RS_ACC (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RS_ACC(:,:,:) = 0. + allocate( ZTOT_RG_ACC (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RG_ACC(:,:,:) = 0. + allocate( ZTOT_RS_CMEL (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RS_CMEL(:,:,:) = 0. + allocate( ZTOT_TH_CFRZ (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_TH_CFRZ(:,:,:) = 0. + allocate( ZTOT_RR_CFRZ (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RR_CFRZ(:,:,:) = 0. + allocate( ZTOT_CR_CFRZ (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CR_CFRZ(:,:,:) = 0. + allocate( ZTOT_RI_CFRZ (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RI_CFRZ(:,:,:) = 0. + allocate( ZTOT_CI_CFRZ (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CI_CFRZ(:,:,:) = 0. + allocate( ZTOT_TH_WETG (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_TH_WETG(:,:,:) = 0. + allocate( ZTOT_RC_WETG (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RC_WETG(:,:,:) = 0. + allocate( ZTOT_CC_WETG (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CC_WETG(:,:,:) = 0. + allocate( ZTOT_RR_WETG (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RR_WETG(:,:,:) = 0. + allocate( ZTOT_CR_WETG (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CR_WETG(:,:,:) = 0. + allocate( ZTOT_RI_WETG (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RI_WETG(:,:,:) = 0. + allocate( ZTOT_CI_WETG (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CI_WETG(:,:,:) = 0. + allocate( ZTOT_RS_WETG (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RS_WETG(:,:,:) = 0. + allocate( ZTOT_RG_WETG (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RG_WETG(:,:,:) = 0. + allocate( ZTOT_RH_WETG (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RH_WETG(:,:,:) = 0. + allocate( ZTOT_TH_DRYG (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_TH_DRYG(:,:,:) = 0. + allocate( ZTOT_RC_DRYG (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RC_DRYG(:,:,:) = 0. + allocate( ZTOT_CC_DRYG (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CC_DRYG(:,:,:) = 0. + allocate( ZTOT_RR_DRYG (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RR_DRYG(:,:,:) = 0. + allocate( ZTOT_CR_DRYG (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CR_DRYG(:,:,:) = 0. + allocate( ZTOT_RI_DRYG (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RI_DRYG(:,:,:) = 0. + allocate( ZTOT_CI_DRYG (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CI_DRYG(:,:,:) = 0. + allocate( ZTOT_RS_DRYG (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RS_DRYG(:,:,:) = 0. + allocate( ZTOT_RG_DRYG (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RG_DRYG(:,:,:) = 0. + allocate( ZTOT_RI_HMG (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RI_HMG(:,:,:) = 0. + allocate( ZTOT_CI_HMG (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CI_HMG(:,:,:) = 0. + allocate( ZTOT_RG_HMG (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RG_HMG(:,:,:) = 0. + allocate( ZTOT_TH_GMLT (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_TH_GMLT(:,:,:) = 0. + allocate( ZTOT_RR_GMLT (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RR_GMLT(:,:,:) = 0. + allocate( ZTOT_CR_GMLT (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CR_GMLT(:,:,:) = 0. +! allocate( ZTOT_RC_WETH (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RC_WETH(:,:,:) = 0. +! allocate( ZTOT_CC_WETH (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CC_WETH(:,:,:) = 0. +! allocate( ZTOT_RR_WETH (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RR_WETH(:,:,:) = 0. +! allocate( ZTOT_CR_WETH (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CR_WETH(:,:,:) = 0. +! allocate( ZTOT_RI_WETH (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RI_WETH(:,:,:) = 0. +! allocate( ZTOT_CI_WETH (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CI_WETH(:,:,:) = 0. +! allocate( ZTOT_RS_WETH (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RS_WETH(:,:,:) = 0. +! allocate( ZTOT_RG_WETH (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RG_WETH(:,:,:) = 0. +! allocate( ZTOT_RH_WETH (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RH_WETH(:,:,:) = 0. +! allocate( ZTOT_RG_COHG (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RG_COHG(:,:,:) = 0. +! allocate( ZTOT_RR_HMLT (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RR_HMLT(:,:,:) = 0. +! allocate( ZTOT_CR_HMLT (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CR_HMLT(:,:,:) = 0. + allocate( ZTOT_RR_CVRC (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RR_CVRC(:,:,:) = 0. + allocate( ZTOT_CR_CVRC (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CR_CVRC(:,:,:) = 0. + + allocate( ZTOT_RV_CORR2 (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RV_CORR2(:,:,:) = 0. + allocate( ZTOT_RC_CORR2 (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RC_CORR2(:,:,:) = 0. + allocate( ZTOT_RR_CORR2 (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RR_CORR2(:,:,:) = 0. + allocate( ZTOT_RI_CORR2 (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_RI_CORR2(:,:,:) = 0. + allocate( ZTOT_CC_CORR2 (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CC_CORR2(:,:,:) = 0. + allocate( ZTOT_CR_CORR2 (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CR_CORR2(:,:,:) = 0. + allocate( ZTOT_CI_CORR2 (size( ptht, 1), size( ptht, 2), size( ptht, 3) ) ); ZTOT_CI_CORR2(:,:,:) = 0. +END IF +! +! Initial values computed as source * PTSTEP +! +! Mixing ratios +! +KRR=SIZE(PRT,4) +ZRVT(:,:,:) = PRS(:,:,:,1) * PTSTEP +ZRVS(:,:,:) = PRS(:,:,:,1) +IF ( KRR .GE. 2 ) ZRCT(:,:,:) = PRS(:,:,:,2) * PTSTEP +IF ( KRR .GE. 2 ) ZRCS(:,:,:) = PRS(:,:,:,2) +IF ( KRR .GE. 3 ) ZRRT(:,:,:) = PRS(:,:,:,3) * PTSTEP +IF ( KRR .GE. 3 ) ZRRS(:,:,:) = PRS(:,:,:,3) +IF ( KRR .GE. 4 ) ZRIT(:,:,:) = PRS(:,:,:,4) * PTSTEP +IF ( KRR .GE. 4 ) ZRIS(:,:,:) = PRS(:,:,:,4) +IF ( KRR .GE. 5 ) ZRST(:,:,:) = PRS(:,:,:,5) * PTSTEP +IF ( KRR .GE. 5 ) ZRSS(:,:,:) = PRS(:,:,:,5) +IF ( KRR .GE. 6 ) ZRGT(:,:,:) = PRS(:,:,:,6) * PTSTEP +IF ( KRR .GE. 6 ) ZRGS(:,:,:) = PRS(:,:,:,6) +IF ( KRR .GE. 7 ) ZRHT(:,:,:) = PRS(:,:,:,7) * PTSTEP +IF ( KRR .GE. 7 ) ZRHS(:,:,:) = PRS(:,:,:,7) +! +! Concentrations +! +IF ( LWARM ) ZCCT(:,:,:) = PSVS(:,:,:,NSV_LIMA_NC) * PTSTEP +IF ( LWARM ) ZCCS(:,:,:) = PSVS(:,:,:,NSV_LIMA_NC) +IF ( LWARM .AND. LRAIN ) ZCRT(:,:,:) = PSVS(:,:,:,NSV_LIMA_NR) * PTSTEP +IF ( LWARM .AND. LRAIN ) ZCRS(:,:,:) = PSVS(:,:,:,NSV_LIMA_NR) +IF ( LCOLD ) ZCIT(:,:,:) = PSVS(:,:,:,NSV_LIMA_NI) * PTSTEP +IF ( LCOLD ) ZCIS(:,:,:) = PSVS(:,:,:,NSV_LIMA_NI) +! +IF ( NMOD_CCN .GE. 1 ) ZCCNFT(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_CCN_FREE:NSV_LIMA_CCN_FREE+NMOD_CCN-1) * PTSTEP +IF ( NMOD_CCN .GE. 1 ) ZCCNAT(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_CCN_ACTI:NSV_LIMA_CCN_ACTI+NMOD_CCN-1) * PTSTEP +IF ( NMOD_CCN .GE. 1 ) ZCCNFS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_CCN_FREE:NSV_LIMA_CCN_FREE+NMOD_CCN-1) +IF ( NMOD_CCN .GE. 1 ) ZCCNAS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_CCN_ACTI:NSV_LIMA_CCN_ACTI+NMOD_CCN-1) +! +IF ( NMOD_IFN .GE. 1 ) ZIFNFT(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_IFN_FREE:NSV_LIMA_IFN_FREE+NMOD_IFN-1) * PTSTEP +IF ( NMOD_IFN .GE. 1 ) ZIFNNT(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_IFN_NUCL:NSV_LIMA_IFN_NUCL+NMOD_IFN-1) * PTSTEP +IF ( NMOD_IFN .GE. 1 ) ZIFNFS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_IFN_FREE:NSV_LIMA_IFN_FREE+NMOD_IFN-1) +IF ( NMOD_IFN .GE. 1 ) ZIFNNS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_IFN_NUCL:NSV_LIMA_IFN_NUCL+NMOD_IFN-1) +! +IF ( NMOD_IMM .GE. 1 ) ZIMMNT(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_IMM_NUCL:NSV_LIMA_IMM_NUCL+NMOD_IMM-1) * PTSTEP +IF ( NMOD_IMM .GE. 1 ) ZIMMNS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_IMM_NUCL:NSV_LIMA_IMM_NUCL+NMOD_IMM-1) +! +IF ( LCOLD .AND. LHHONI ) ZHOMFT(:,:,:) = PSVS(:,:,:,NSV_LIMA_HOM_HAZE) * PTSTEP +IF ( LCOLD .AND. LHHONI ) ZHOMFS(:,:,:) = PSVS(:,:,:,NSV_LIMA_HOM_HAZE) +! +ZINV_TSTEP = 1./PTSTEP +ZEXN(:,:,:) = (PPABST(:,:,:)/XP00)**(XRD/XCPD) +ZT(:,:,:) = ZTHT(:,:,:) * ZEXN(:,:,:) +! +!------------------------------------------------------------------------------- +! +!* 0. Check mean diameter for cloud, rain and ice +! -------------------------------------------- +! if ( lbu_enable ) then +! if ( lbudget_rc .and. lwarm .and. lrain ) call Budget_store_init( tbudgets(NBUDGET_RC), 'CORR', zrcs(:, :, :) * prhodj(:, :, :) ) +! if ( lbudget_rr .and. lwarm .and. lrain ) call Budget_store_init( tbudgets(NBUDGET_RR), 'CORR', zrrs(:, :, :) * prhodj(:, :, :) ) +! if ( lbudget_ri .and. lcold .and. lsnow ) call Budget_store_init( tbudgets(NBUDGET_RI), 'CORR', zris(:, :, :) * prhodj(:, :, :) ) +! if ( lbudget_rs .and. lcold .and. lsnow ) call Budget_store_init( tbudgets(NBUDGET_RS), 'CORR', zrss(:, :, :) * prhodj(:, :, :) ) +! if ( lbudget_sv ) then +! if ( lwarm .and. lrain ) & +! call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'CORR', zccs(:, :, :) * prhodj(:, :, :) ) +! if ( lwarm .and. lrain ) & +! call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nr), 'CORR', zcrs(:, :, :) * prhodj(:, :, :) ) +! if ( lcold .and. lsnow ) & +! call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'CORR', zcis(:, :, :) * prhodj(:, :, :) ) +! end if +! end if +!!$IF (LWARM .AND. LRAIN) THEN +!!$ WHERE( ZRCT>XRTMIN(2) .AND. ZCCT>XCTMIN(2) .AND. ZRCT>XAC*ZCCT*(100.E-6)**XBC ) +!!$ ZRRT=ZRRT+ZRCT +!!$ ZRRS=ZRRS+ZRCS +!!$ ZCRT=ZCRT+ZCCT +!!$ ZCRS=ZCRS+ZCCS +!!$ ZRCT=0. +!!$ ZCCT=0. +!!$ ZRCS=0. +!!$ ZCCS=0. +!!$ END WHERE +!!$END IF +!!$! +!!$IF (LWARM .AND. LRAIN) THEN +!!$ WHERE( ZRRT>XRTMIN(3) .AND. ZCRT>XCTMIN(3) .AND. ZRRT<XAR*ZCRT*(60.E-6)**XBR ) +!!$ ZRCT=ZRCT+ZRRT +!!$ ZRCS=ZRCS+ZRRS +!!$ ZCCT=ZCCT+ZCRT +!!$ ZCCS=ZCCS+ZCRS +!!$ ZRRT=0. +!!$ ZCRT=0. +!!$ ZRRS=0. +!!$ ZCRS=0. +!!$ END WHERE +!!$END IF +!!$! +!!$IF (LCOLD .AND. LSNOW) THEN +!!$ WHERE( ZRIT>XRTMIN(4) .AND. ZCIT>XCTMIN(4) .AND. ZRIT>XAI*ZCIT*(250.E-6)**XBI ) +!!$ ZRST=ZRST+ZRIT +!!$ ZRSS=ZRSS+ZRIS +!!$ ZRIT=0. +!!$ ZCIT=0. +!!$ ZRIS=0. +!!$ ZCIS=0. +!!$ END WHERE +!!$END IF +! +! if ( lbu_enable ) then +! if ( lbudget_rc .and. lwarm .and. lrain ) call Budget_store_end( tbudgets(NBUDGET_RC), 'CORR', zrcs(:, :, :) * prhodj(:, :, :) ) +! if ( lbudget_rr .and. lwarm .and. lrain ) call Budget_store_end( tbudgets(NBUDGET_RR), 'CORR', zrrs(:, :, :) * prhodj(:, :, :) ) +! if ( lbudget_ri .and. lcold .and. lsnow ) call Budget_store_end( tbudgets(NBUDGET_RI), 'CORR', zris(:, :, :) * prhodj(:, :, :) ) +! if ( lbudget_rs .and. lcold .and. lsnow ) call Budget_store_end( tbudgets(NBUDGET_RS), 'CORR', zrss(:, :, :) * prhodj(:, :, :) ) +! if ( lbudget_sv ) then +! if ( lwarm .and. lrain ) & +! call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'CORR', zccs(:, :, :) * prhodj(:, :, :) ) +! if ( lwarm .and. lrain ) & +! call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nr), 'CORR', zcrs(:, :, :) * prhodj(:, :, :) ) +! if ( lcold .and. lsnow ) & +! call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'CORR', zcis(:, :, :) * prhodj(:, :, :) ) +! end if +! end if +!------------------------------------------------------------------------------- +! +!* 1. Sedimentation +! ------------- +! +! +if ( lbu_enable ) then + if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'SEDI', zths(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rc .and. lwarm .and. lsedc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'SEDI', zrcs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rr .and. lwarm .and. lrain ) call Budget_store_init( tbudgets(NBUDGET_RR), 'SEDI', zrrs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_ri .and. lcold .and. lsedi ) call Budget_store_init( tbudgets(NBUDGET_RI), 'SEDI', zris(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rs .and. lcold .and. lsnow ) call Budget_store_init( tbudgets(NBUDGET_RS), 'SEDI', zrss(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rg .and. lcold .and. lsnow ) call Budget_store_init( tbudgets(NBUDGET_RG), 'SEDI', zrgs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rh .and. lcold .and. lhail ) call Budget_store_init( tbudgets(NBUDGET_RH), 'SEDI', zrhs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_sv ) then + if ( lwarm .and. lsedc ) & + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'SEDI', zccs(:, :, :) * prhodj(:, :, :) ) + if ( lwarm .and. lrain ) & + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nr), 'SEDI', zcrs(:, :, :) * prhodj(:, :, :) ) + if ( lcold .and. lsedi ) & + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'SEDI', zcis(:, :, :) * prhodj(:, :, :) ) + end if +end if + +ZRT_SUM = (ZRVS + ZRCS + ZRRS + ZRIS + ZRSS + ZRGS + ZRHS)*PTSTEP +ZCPT = XCPD + (XCPV * ZRVS + XCL * (ZRCS + ZRRS) + XCI * (ZRIS + ZRSS + ZRGS + ZRHS))*PTSTEP +IF (LWARM .AND. LSEDC) CALL LIMA_SEDIMENTATION(IIB, IIE, IIT, IJB, IJE, IJT, IKB, IKE, IKTB, IKTE, IKT, KKL, & + 'L', 2, 2, 1, PTSTEP, PDZZ, PRHODREF, PPABST, ZT, ZRT_SUM, ZCPT, ZRCS, ZCCS, PINPRC) +ZRT_SUM = (ZRVS + ZRCS + ZRRS + ZRIS + ZRSS + ZRGS + ZRHS)*PTSTEP +ZCPT = XCPD + (XCPV * ZRVS + XCL * (ZRCS + ZRRS) + XCI * (ZRIS + ZRSS + ZRGS + ZRHS))*PTSTEP +IF (LWARM .AND. LRAIN) CALL LIMA_SEDIMENTATION(IIB, IIE, IIT, IJB, IJE, IJT, IKB, IKE, IKTB, IKTE, IKT, KKL, & + 'L', 2, 3, 1, PTSTEP, PDZZ, PRHODREF, PPABST, ZT, ZRT_SUM, ZCPT, ZRRS, ZCRS, PINPRR) +ZRT_SUM = (ZRVS + ZRCS + ZRRS + ZRIS + ZRSS + ZRGS + ZRHS)*PTSTEP +ZCPT = XCPD + (XCPV * ZRVS + XCL * (ZRCS + ZRRS) + XCI * (ZRIS + ZRSS + ZRGS + ZRHS))*PTSTEP +IF (LCOLD .AND. LSEDI) CALL LIMA_SEDIMENTATION(IIB, IIE, IIT, IJB, IJE, IJT, IKB, IKE, IKTB, IKTE, IKT, KKL, & + 'I', 2, 4, 1, PTSTEP, PDZZ, PRHODREF, PPABST, ZT, ZRT_SUM, ZCPT, ZRIS, ZCIS, ZW2D) +ZRT_SUM = (ZRVS + ZRCS + ZRRS + ZRIS + ZRSS + ZRGS + ZRHS)*PTSTEP +ZCPT = XCPD + (XCPV * ZRVS + XCL * (ZRCS + ZRRS) + XCI * (ZRIS + ZRSS + ZRGS + ZRHS))*PTSTEP +IF (LCOLD .AND. LSNOW) CALL LIMA_SEDIMENTATION(IIB, IIE, IIT, IJB, IJE, IJT, IKB, IKE, IKTB, IKTE, IKT, KKL, & + 'I', 1, 5, 1, PTSTEP, PDZZ, PRHODREF, PPABST, ZT, ZRT_SUM, ZCPT, ZRSS, ZW3D, PINPRS) +ZRT_SUM = (ZRVS + ZRCS + ZRRS + ZRIS + ZRSS + ZRGS + ZRHS)*PTSTEP +ZCPT = XCPD + (XCPV * ZRVS + XCL * (ZRCS + ZRRS) + XCI * (ZRIS + ZRSS + ZRGS + ZRHS))*PTSTEP +IF (LCOLD .AND. LSNOW) CALL LIMA_SEDIMENTATION(IIB, IIE, IIT, IJB, IJE, IJT, IKB, IKE, IKTB, IKTE, IKT, KKL, & + 'I', 1, 6, 1, PTSTEP, PDZZ, PRHODREF, PPABST, ZT, ZRT_SUM, ZCPT, ZRGS, ZW3D, PINPRG) +ZRT_SUM = (ZRVS + ZRCS + ZRRS + ZRIS + ZRSS + ZRGS + ZRHS)*PTSTEP +ZCPT = XCPD + (XCPV * ZRVS + XCL * (ZRCS + ZRRS) + XCI * (ZRIS + ZRSS + ZRGS + ZRHS))*PTSTEP +IF (LCOLD .AND. LHAIL) CALL LIMA_SEDIMENTATION(IIB, IIE, IIT, IJB, IJE, IJT, IKB, IKE, IKTB, IKTE, IKT, KKL, & + 'I', 1, 7, 1, PTSTEP, PDZZ, PRHODREF, PPABST, ZT, ZRT_SUM, ZCPT, ZRHS, ZW3D, PINPRH) +! +ZTHS(:,:,:) = ZT(:,:,:) / ZEXN(:,:,:) * ZINV_TSTEP +! +! Call budgets +! +if ( lbu_enable ) then + if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'SEDI', zths(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rc .and. lwarm .and. lsedc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'SEDI', zrcs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rr .and. lwarm .and. lrain ) call Budget_store_end( tbudgets(NBUDGET_RR), 'SEDI', zrrs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_ri .and. lcold .and. lsedi ) call Budget_store_end( tbudgets(NBUDGET_RI), 'SEDI', zris(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rs .and. lcold .and. lsnow ) call Budget_store_end( tbudgets(NBUDGET_RS), 'SEDI', zrss(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rg .and. lcold .and. lsnow ) call Budget_store_end( tbudgets(NBUDGET_RG), 'SEDI', zrgs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rh .and. lcold .and. lhail ) call Budget_store_end( tbudgets(NBUDGET_RH), 'SEDI', zrhs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_sv ) then + if ( lwarm .and. lsedc ) & + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'SEDI', zccs(:, :, :) * prhodj(:, :, :) ) + if ( lwarm .and. lrain ) & + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nr), 'SEDI', zcrs(:, :, :) * prhodj(:, :, :) ) + if ( lcold .and. lsedi ) & + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'SEDI', zcis(:, :, :) * prhodj(:, :, :) ) + end if +end if +! +! 1.bis Deposition at 1st level above ground +! +IF (LWARM .AND. LDEPOC) THEN + if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'DEPO', zrcs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_sv ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'DEPO', zccs(:, :, :) * prhodj(:, :, :) ) + + PINDEP(:,:)=0. + GDEP(:,:) = .FALSE. + GDEP(:,:) = ZRCS(:,:,IKB) >0 .AND. ZCCS(:,:,IKB) >0 .AND. ZRCT(:,:,IKB) >0 .AND. ZCCT(:,:,IKB) >0 + WHERE (GDEP) + ZRCS(:,:,IKB) = ZRCS(:,:,IKB) - XVDEPOC * ZRCT(:,:,IKB) / PDZZ(:,:,IKB) + ZCCS(:,:,IKB) = ZCCS(:,:,IKB) - XVDEPOC * ZCCT(:,:,IKB) / PDZZ(:,:,IKB) + PINPRC(:,:) = PINPRC(:,:) + XVDEPOC * ZRCT(:,:,IKB) * PRHODREF(:,:,IKB) /XRHOLW + PINDEP(:,:) = XVDEPOC * ZRCT(:,:,IKB) * PRHODREF(:,:,IKB) /XRHOLW + END WHERE + + if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'DEPO', zrcs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_sv ) call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'DEPO', zccs(:, :, :) * prhodj(:, :, :) ) +END IF +! +! +Z_RR_CVRC(:,:,:) = 0. +Z_CR_CVRC(:,:,:) = 0. +IF (LWARM .AND. LRAIN) THEN + if( lbu_enable ) then + if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'R2C1', zrcs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_init( tbudgets(NBUDGET_RR), 'R2C1', zrrs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_sv ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'R2C1', zccs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_sv ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nr), 'R2C1', zcrs(:, :, :) * prhodj(:, :, :) ) + end if + + CALL LIMA_DROPS_TO_DROPLETS_CONV(PRHODREF, ZRCS*PTSTEP, ZRRS*PTSTEP, ZCCS*PTSTEP, ZCRS*PTSTEP, & + Z_RR_CVRC, Z_CR_CVRC) + ! + ZRCS(:,:,:) = ZRCS(:,:,:) - Z_RR_CVRC(:,:,:)/PTSTEP + ZRRS(:,:,:) = ZRRS(:,:,:) + Z_RR_CVRC(:,:,:)/PTSTEP + ZCCS(:,:,:) = ZCCS(:,:,:) - Z_CR_CVRC(:,:,:)/PTSTEP + ZCRS(:,:,:) = ZCRS(:,:,:) + Z_CR_CVRC(:,:,:)/PTSTEP + + if( lbu_enable ) then + if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'R2C1', zrcs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_end( tbudgets(NBUDGET_RR), 'R2C1', zrrs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_sv ) call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'R2C1', zccs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_sv ) call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nr), 'R2C1', zcrs(:, :, :) * prhodj(:, :, :) ) + end if +END IF +! +! Update variables +! +ZTHT(:,:,:) = ZTHS(:,:,:) * PTSTEP +ZT(:,:,:) = ZTHT(:,:,:) * ZEXN(:,:,:) +! +IF ( KRR .GE. 2 ) ZRCT(:,:,:) = ZRCS(:,:,:) * PTSTEP +IF ( KRR .GE. 3 ) ZRRT(:,:,:) = ZRRS(:,:,:) * PTSTEP +IF ( KRR .GE. 4 ) ZRIT(:,:,:) = ZRIS(:,:,:) * PTSTEP +IF ( KRR .GE. 5 ) ZRST(:,:,:) = ZRSS(:,:,:) * PTSTEP +IF ( KRR .GE. 6 ) ZRGT(:,:,:) = ZRGS(:,:,:) * PTSTEP +IF ( KRR .GE. 7 ) ZRHT(:,:,:) = ZRHS(:,:,:) * PTSTEP +! +IF ( LWARM ) ZCCT(:,:,:) = ZCCS(:,:,:) * PTSTEP +IF ( LWARM .AND. LRAIN ) ZCRT(:,:,:) = ZCRS(:,:,:) * PTSTEP +IF ( LCOLD ) ZCIT(:,:,:) = ZCIS(:,:,:) * PTSTEP +! +!------------------------------------------------------------------------------- +! +!* 2. Compute cloud, ice and precipitation fractions +! ---------------------------------------------- +! +IF (LSUBG_COND) THEN + CALL LIMA_COMPUTE_CLOUD_FRACTIONS (IIB, IIE, IJB, IJE, IKB, IKE, KKL, & + ZCCT, ZRCT, & + ZCRT, ZRRT, & + ZCIT, ZRIT, & + ZRST, ZRGT, ZRHT, & + PCLDFR, PICEFR, PPRCFR ) +ELSE + PCLDFR(:,:,:)=1. + PICEFR(:,:,:)=1. + PPRCFR(:,:,:)=1. +END IF +! +!------------------------------------------------------------------------------- +! +!* 2. Nucleation processes +! -------------------- +! +CALL LIMA_NUCLEATION_PROCS (PTSTEP, TPFILE, PRHODJ, & + PRHODREF, ZEXN, PPABST, ZT, PDTHRAD, PW_NU, & + ZTHT, ZRVT, ZRCT, ZRRT, ZRIT, ZRST, ZRGT, & + ZCCT, ZCRT, ZCIT, & + ZCCNFT, ZCCNAT, ZIFNFT, ZIFNNT, ZIMMNT, ZHOMFT, & + PCLDFR, PICEFR, PPRCFR ) +! +! Saving sources before microphysics time-splitting loop +! +ZRVS(:,:,:) = ZRVT(:,:,:) *ZINV_TSTEP +ZRCS(:,:,:) = ZRCT(:,:,:) *ZINV_TSTEP +ZRRS(:,:,:) = ZRRT(:,:,:) *ZINV_TSTEP +ZRIS(:,:,:) = ZRIT(:,:,:) *ZINV_TSTEP +ZRSS(:,:,:) = ZRST(:,:,:) *ZINV_TSTEP +ZRGS(:,:,:) = ZRGT(:,:,:) *ZINV_TSTEP +ZRHS(:,:,:) = ZRHT(:,:,:) *ZINV_TSTEP +! +ZCCS(:,:,:) = ZCCT(:,:,:) *ZINV_TSTEP +ZCRS(:,:,:) = ZCRT(:,:,:) *ZINV_TSTEP +ZCIS(:,:,:) = ZCIT(:,:,:) *ZINV_TSTEP +! +ZCCNFS(:,:,:,:) = ZCCNFT(:,:,:,:) *ZINV_TSTEP +ZCCNAS(:,:,:,:) = ZCCNAT(:,:,:,:) *ZINV_TSTEP +ZIFNFS(:,:,:,:) = ZIFNFT(:,:,:,:) *ZINV_TSTEP +ZIFNNS(:,:,:,:) = ZIFNNT(:,:,:,:) *ZINV_TSTEP +ZIMMNS(:,:,:,:) = ZIMMNT(:,:,:,:) *ZINV_TSTEP +ZHOMFS(:,:,:) = ZHOMFT(:,:,:) *ZINV_TSTEP +! +ZTHS(:,:,:) = ZTHT(:,:,:) *ZINV_TSTEP +ZT(:,:,:) = ZTHT(:,:,:) * ZEXN(:,:,:) +! +! +!------------------------------------------------------------------------------- +! +!* 2. LOOP +! ---- +! +! +! Maximum number of iterations +INB_ITER_MAX=NMAXITER +IF(XTSTEP_TS/=0.)THEN + INB_ITER_MAX=MAX(1, INT(PTSTEP/XTSTEP_TS)) !At least the number of iterations needed for the time-splitting + ZTSTEP=PTSTEP/INB_ITER_MAX + INB_ITER_MAX=MAX(NMAXITER, INB_ITER_MAX) !Fot the case XMRSTEP/=0. at the same time +ENDIF +IITER(:,:,:)=0 +ZTIME(:,:,:)=0. ! Current integration time (all points may have a different integration time) +! +! Begin the huge time splitting loop +! +ZRT_SUM(:,:,:) = ZRCT(:,:,:) + ZRRT(:,:,:) + ZRIT(:,:,:) + ZRST(:,:,:) + ZRGT(:,:,:) + ZRHT(:,:,:) +WHERE (ZRT_SUM(:,:,:)<XRTMIN(2)) ZTIME(:,:,:)=PTSTEP ! no need to treat hydrometeor-free point +! +DO WHILE(ANY(ZTIME(IIB:IIE,IJB:IJE,IKTB:IKTE)<PTSTEP)) + ! + IF(XMRSTEP/=0.) THEN + ! In this case we need to remember the mixing ratios used to compute the tendencies + ! because when mixing ratio has evolved more than a threshold, we must re-compute tendecies + Z0RVT(:,:,:)=ZRVT(:,:,:) + Z0RCT(:,:,:)=ZRCT(:,:,:) + Z0RRT(:,:,:)=ZRRT(:,:,:) + Z0RIT(:,:,:)=ZRIT(:,:,:) + Z0RST(:,:,:)=ZRST(:,:,:) + Z0RGT(:,:,:)=ZRGT(:,:,:) + Z0RHT(:,:,:)=ZRHT(:,:,:) + ENDIF + ! + IF(XTSTEP_TS/=0.) THEN + ! In this case we need to remember the time when tendencies were computed + ! because when time has evolved more than a limit, we must re-compute tendecies + ZTIME_LASTCALL(:,:,:)=ZTIME(:,:,:) + ENDIF + ! + LLCOMPUTE(:,:,:)=.FALSE. + LLCOMPUTE(IIB:IIE,IJB:IJE,IKTB:IKTE) = ZTIME(IIB:IIE,IJB:IJE,IKTB:IKTE)<PTSTEP ! Compuation only for points for which integration time has not reached the timestep + WHERE(LLCOMPUTE(:,:,:)) + IITER(:,:,:)=IITER(:,:,:)+1 + END WHERE + ! + DO WHILE(ANY(LLCOMPUTE(:,:,:))) ! Loop to adjust tendencies when we cross the 0°C or when a species disappears + + ! + ! Packing variables to run computations only where necessary + ! + IPACK = COUNT(LLCOMPUTE) + ALLOCATE(I1(IPACK)) + ALLOCATE(I2(IPACK)) + ALLOCATE(I3(IPACK)) + ALLOCATE(ZRHODREF1D(IPACK)) + ALLOCATE(ZEXNREF1D(IPACK)) + ALLOCATE(ZEXN1D(IPACK)) + ALLOCATE(ZP1D(IPACK)) + ALLOCATE(ZTHT1D(IPACK)) + ALLOCATE(ZRVT1D(IPACK)) + ALLOCATE(ZRCT1D(IPACK)) + ALLOCATE(ZRRT1D(IPACK)) + ALLOCATE(ZRIT1D(IPACK)) + ALLOCATE(ZRST1D(IPACK)) + ALLOCATE(ZRGT1D(IPACK)) + ALLOCATE(ZRHT1D(IPACK)) + ALLOCATE(ZCCT1D(IPACK)) + ALLOCATE(ZCRT1D(IPACK)) + ALLOCATE(ZCIT1D(IPACK)) + ALLOCATE(ZIFNN1D(IPACK,NMOD_IFN)) + ALLOCATE(ZEVAP1D(IPACK)) + ALLOCATE(ZTIME1D(IPACK)) + ALLOCATE(LLCOMPUTE1D(IPACK)) + ALLOCATE(IITER1D(IPACK)) + ALLOCATE(ZTIME_LASTCALL1D(IPACK)) + ALLOCATE(Z0RVT1D(IPACK)) + ALLOCATE(Z0RCT1D(IPACK)) + ALLOCATE(Z0RRT1D(IPACK)) + ALLOCATE(Z0RIT1D(IPACK)) + ALLOCATE(Z0RST1D(IPACK)) + ALLOCATE(Z0RGT1D(IPACK)) + ALLOCATE(Z0RHT1D(IPACK)) + ALLOCATE(ZCF1D(IPACK)) + ALLOCATE(ZIF1D(IPACK)) + ALLOCATE(ZPF1D(IPACK)) + IPACK = COUNTJV(LLCOMPUTE,I1,I2,I3) + DO II=1,IPACK + ZRHODREF1D(II) = PRHODREF(I1(II),I2(II),I3(II)) + ZEXNREF1D(II) = PEXNREF(I1(II),I2(II),I3(II)) + ZEXN1D(II) = ZEXN(I1(II),I2(II),I3(II)) + ZP1D(II) = PPABST(I1(II),I2(II),I3(II)) + ZTHT1D(II) = ZTHT(I1(II),I2(II),I3(II)) + ZRVT1D(II) = ZRVT(I1(II),I2(II),I3(II)) + ZRCT1D(II) = ZRCT(I1(II),I2(II),I3(II)) + ZRRT1D(II) = ZRRT(I1(II),I2(II),I3(II)) + ZRIT1D(II) = ZRIT(I1(II),I2(II),I3(II)) + ZRST1D(II) = ZRST(I1(II),I2(II),I3(II)) + ZRGT1D(II) = ZRGT(I1(II),I2(II),I3(II)) + ZRHT1D(II) = ZRHT(I1(II),I2(II),I3(II)) + ZCCT1D(II) = ZCCT(I1(II),I2(II),I3(II)) + ZCRT1D(II) = ZCRT(I1(II),I2(II),I3(II)) + ZCIT1D(II) = ZCIT(I1(II),I2(II),I3(II)) + ZIFNN1D(II,:) = ZIFNNT(I1(II),I2(II),I3(II),:) + ZEVAP1D(II) = PEVAP3D(I1(II),I2(II),I3(II)) + ZTIME1D(II) = ZTIME(I1(II),I2(II),I3(II)) + LLCOMPUTE1D(II) = LLCOMPUTE(I1(II),I2(II),I3(II)) + IITER1D(II) = IITER(I1(II),I2(II),I3(II)) + ZTIME_LASTCALL1D(II) = ZTIME_LASTCALL(I1(II),I2(II),I3(II)) + Z0RVT1D(II) = Z0RVT(I1(II),I2(II),I3(II)) + Z0RCT1D(II) = Z0RCT(I1(II),I2(II),I3(II)) + Z0RRT1D(II) = Z0RRT(I1(II),I2(II),I3(II)) + Z0RIT1D(II) = Z0RIT(I1(II),I2(II),I3(II)) + Z0RST1D(II) = Z0RST(I1(II),I2(II),I3(II)) + Z0RGT1D(II) = Z0RGT(I1(II),I2(II),I3(II)) + Z0RHT1D(II) = Z0RHT(I1(II),I2(II),I3(II)) + ZCF1D(II) = PCLDFR(I1(II),I2(II),I3(II)) + ZIF1D(II) = PICEFR(I1(II),I2(II),I3(II)) + ZPF1D(II) = PPRCFR(I1(II),I2(II),I3(II)) + END DO + ! + WHERE(ZCF1D(:)<1.E-10 .AND. ZRCT1D(:)>XRTMIN(2) .AND. ZCCT1D(:)>XCTMIN(2)) ZCF1D(:)=1. + WHERE(ZIF1D(:)<1.E-10 .AND. ZRIT1D(:)>XRTMIN(4) .AND. ZCIT1D(:)>XCTMIN(4)) ZIF1D(:)=1. + WHERE(ZPF1D(:)<1.E-10 .AND. (ZRRT1D(:)>XRTMIN(3) .OR. ZRST1D(:)>XRTMIN(5) & + .OR. ZRGT1D(:)>XRTMIN(6) .OR. ZRHT1D(:)>XRTMIN(7) ) ) ZPF1D(:)=1. + ! + ! Allocating 1D variables + ! + ALLOCATE(ZMAXTIME(IPACK)) ; ZMAXTIME(:) = 0. + ALLOCATE(ZTIME_THRESHOLD(IPACK)) ; ZTIME_THRESHOLD(:) = 0. + ! + ALLOCATE(ZA_TH(IPACK)) ; ZA_TH(:) = 0. + ALLOCATE(ZA_RV(IPACK)) ; ZA_RV(:) = 0. + ALLOCATE(ZA_RC(IPACK)) ; ZA_RC(:) = 0. + ALLOCATE(ZA_RR(IPACK)) ; ZA_RR(:) = 0. + ALLOCATE(ZA_RI(IPACK)) ; ZA_RI(:) = 0. + ALLOCATE(ZA_RS(IPACK)) ; ZA_RS(:) = 0. + ALLOCATE(ZA_RG(IPACK)) ; ZA_RG(:) = 0. + ALLOCATE(ZA_RH(IPACK)) ; ZA_RH(:) = 0. + ALLOCATE(ZA_CC(IPACK)) ; ZA_CC(:) = 0. + ALLOCATE(ZA_CR(IPACK)) ; ZA_CR(:) = 0. + ALLOCATE(ZA_CI(IPACK)) ; ZA_CI(:) = 0. + ! + ALLOCATE(ZB_TH(IPACK)) ; ZB_TH(:) = 0. + ALLOCATE(ZB_RV(IPACK)) ; ZB_RV(:) = 0. + ALLOCATE(ZB_RC(IPACK)) ; ZB_RC(:) = 0. + ALLOCATE(ZB_RR(IPACK)) ; ZB_RR(:) = 0. + ALLOCATE(ZB_RI(IPACK)) ; ZB_RI(:) = 0. + ALLOCATE(ZB_RS(IPACK)) ; ZB_RS(:) = 0. + ALLOCATE(ZB_RG(IPACK)) ; ZB_RG(:) = 0. + ALLOCATE(ZB_RH(IPACK)) ; ZB_RH(:) = 0. + ALLOCATE(ZB_CC(IPACK)) ; ZB_CC(:) = 0. + ALLOCATE(ZB_CR(IPACK)) ; ZB_CR(:) = 0. + ALLOCATE(ZB_CI(IPACK)) ; ZB_CI(:) = 0. + ALLOCATE(ZB_IFNN(IPACK,NMOD_IFN)) ; ZB_IFNN(:,:) = 0. + ! + ALLOCATE(Z_CR_BRKU(IPACK)) ; Z_CR_BRKU(:) = 0. + ALLOCATE(Z_TH_HONR(IPACK)) ; Z_TH_HONR(:) = 0. + ALLOCATE(Z_RR_HONR(IPACK)) ; Z_RR_HONR(:) = 0. + ALLOCATE(Z_CR_HONR(IPACK)) ; Z_CR_HONR(:) = 0. + ALLOCATE(Z_TH_IMLT(IPACK)) ; Z_TH_IMLT(:) = 0. + ALLOCATE(Z_RC_IMLT(IPACK)) ; Z_RC_IMLT(:) = 0. + ALLOCATE(Z_CC_IMLT(IPACK)) ; Z_CC_IMLT(:) = 0. + ALLOCATE(Z_TH_HONC(IPACK)) ; Z_TH_HONC(:) = 0. + ALLOCATE(Z_RC_HONC(IPACK)) ; Z_RC_HONC(:) = 0. + ALLOCATE(Z_CC_HONC(IPACK)) ; Z_CC_HONC(:) = 0. + ALLOCATE(Z_CC_SELF(IPACK)) ; Z_CC_SELF(:) = 0. + ALLOCATE(Z_RC_AUTO(IPACK)) ; Z_RC_AUTO(:) = 0. + ALLOCATE(Z_CC_AUTO(IPACK)) ; Z_CC_AUTO(:) = 0. + ALLOCATE(Z_CR_AUTO(IPACK)) ; Z_CR_AUTO(:) = 0. + ALLOCATE(Z_RC_ACCR(IPACK)) ; Z_RC_ACCR(:) = 0. + ALLOCATE(Z_CC_ACCR(IPACK)) ; Z_CC_ACCR(:) = 0. + ALLOCATE(Z_CR_SCBU(IPACK)) ; Z_CR_SCBU(:) = 0. + ALLOCATE(Z_TH_EVAP(IPACK)) ; Z_TH_EVAP(:) = 0. + ALLOCATE(Z_RR_EVAP(IPACK)) ; Z_RR_EVAP(:) = 0. + ALLOCATE(Z_RI_CNVI(IPACK)) ; Z_RI_CNVI(:) = 0. + ALLOCATE(Z_CI_CNVI(IPACK)) ; Z_CI_CNVI(:) = 0. + ALLOCATE(Z_TH_DEPS(IPACK)) ; Z_TH_DEPS(:) = 0. + ALLOCATE(Z_RS_DEPS(IPACK)) ; Z_RS_DEPS(:) = 0. + ALLOCATE(Z_TH_DEPI(IPACK)) ; Z_TH_DEPI(:) = 0. + ALLOCATE(Z_RI_DEPI(IPACK)) ; Z_RI_DEPI(:) = 0. + ALLOCATE(Z_RI_CNVS(IPACK)) ; Z_RI_CNVS(:) = 0. + ALLOCATE(Z_CI_CNVS(IPACK)) ; Z_CI_CNVS(:) = 0. + ALLOCATE(Z_RI_AGGS(IPACK)) ; Z_RI_AGGS(:) = 0. + ALLOCATE(Z_CI_AGGS(IPACK)) ; Z_CI_AGGS(:) = 0. + ALLOCATE(Z_TH_DEPG(IPACK)) ; Z_TH_DEPG(:) = 0. + ALLOCATE(Z_RG_DEPG(IPACK)) ; Z_RG_DEPG(:) = 0. + ALLOCATE(Z_TH_BERFI(IPACK)) ; Z_TH_BERFI(:) = 0. + ALLOCATE(Z_RC_BERFI(IPACK)) ; Z_RC_BERFI(:) = 0. + ALLOCATE(Z_TH_RIM(IPACK)) ; Z_TH_RIM = 0. + ALLOCATE(Z_RC_RIM(IPACK)) ; Z_RC_RIM = 0. + ALLOCATE(Z_CC_RIM(IPACK)) ; Z_CC_RIM = 0. + ALLOCATE(Z_RS_RIM(IPACK)) ; Z_RS_RIM = 0. + ALLOCATE(Z_RG_RIM(IPACK)) ; Z_RG_RIM = 0. + ALLOCATE(Z_RI_HMS(IPACK)) ; Z_RI_HMS = 0. + ALLOCATE(Z_CI_HMS(IPACK)) ; Z_CI_HMS = 0. + ALLOCATE(Z_RS_HMS(IPACK)) ; Z_RS_HMS = 0. + ALLOCATE(Z_TH_ACC(IPACK)) ; Z_TH_ACC = 0. + ALLOCATE(Z_RR_ACC(IPACK)) ; Z_RR_ACC = 0. + ALLOCATE(Z_CR_ACC(IPACK)) ; Z_CR_ACC = 0. + ALLOCATE(Z_RS_ACC(IPACK)) ; Z_RS_ACC = 0. + ALLOCATE(Z_RG_ACC(IPACK)) ; Z_RG_ACC = 0. + ALLOCATE(Z_RS_CMEL(IPACK)) ; Z_RS_CMEL = 0. + ALLOCATE(Z_TH_CFRZ(IPACK)) ; Z_TH_CFRZ = 0. + ALLOCATE(Z_RR_CFRZ(IPACK)) ; Z_RR_CFRZ = 0. + ALLOCATE(Z_CR_CFRZ(IPACK)) ; Z_CR_CFRZ = 0. + ALLOCATE(Z_RI_CFRZ(IPACK)) ; Z_RI_CFRZ = 0. + ALLOCATE(Z_CI_CFRZ(IPACK)) ; Z_CI_CFRZ = 0. + ALLOCATE(Z_TH_WETG(IPACK)) ; Z_TH_WETG = 0. + ALLOCATE(Z_RC_WETG(IPACK)) ; Z_RC_WETG = 0. + ALLOCATE(Z_CC_WETG(IPACK)) ; Z_CC_WETG = 0. + ALLOCATE(Z_RR_WETG(IPACK)) ; Z_RR_WETG = 0. + ALLOCATE(Z_CR_WETG(IPACK)) ; Z_CR_WETG = 0. + ALLOCATE(Z_RI_WETG(IPACK)) ; Z_RI_WETG = 0. + ALLOCATE(Z_CI_WETG(IPACK)) ; Z_CI_WETG = 0. + ALLOCATE(Z_RS_WETG(IPACK)) ; Z_RS_WETG = 0. + ALLOCATE(Z_RG_WETG(IPACK)) ; Z_RG_WETG = 0. + ALLOCATE(Z_RH_WETG(IPACK)) ; Z_RH_WETG = 0. + ALLOCATE(Z_TH_DRYG(IPACK)) ; Z_TH_DRYG = 0. + ALLOCATE(Z_RC_DRYG(IPACK)) ; Z_RC_DRYG = 0. + ALLOCATE(Z_CC_DRYG(IPACK)) ; Z_CC_DRYG = 0. + ALLOCATE(Z_RR_DRYG(IPACK)) ; Z_RR_DRYG = 0. + ALLOCATE(Z_CR_DRYG(IPACK)) ; Z_CR_DRYG = 0. + ALLOCATE(Z_RI_DRYG(IPACK)) ; Z_RI_DRYG = 0. + ALLOCATE(Z_CI_DRYG(IPACK)) ; Z_CI_DRYG = 0. + ALLOCATE(Z_RS_DRYG(IPACK)) ; Z_RS_DRYG = 0. + ALLOCATE(Z_RG_DRYG(IPACK)) ; Z_RG_DRYG = 0. + ALLOCATE(Z_RI_HMG(IPACK)) ; Z_RI_HMG = 0. + ALLOCATE(Z_CI_HMG(IPACK)) ; Z_CI_HMG = 0. + ALLOCATE(Z_RG_HMG(IPACK)) ; Z_RG_HMG = 0. + ALLOCATE(Z_TH_GMLT(IPACK)) ; Z_TH_GMLT = 0. + ALLOCATE(Z_RR_GMLT(IPACK)) ; Z_RR_GMLT = 0. + ALLOCATE(Z_CR_GMLT(IPACK)) ; Z_CR_GMLT = 0. + + ALLOCATE(Z_RV_CORR2(IPACK)) ; Z_RV_CORR2 = 0. + ALLOCATE(Z_RC_CORR2(IPACK)) ; Z_RC_CORR2 = 0. + ALLOCATE(Z_RR_CORR2(IPACK)) ; Z_RR_CORR2 = 0. + ALLOCATE(Z_RI_CORR2(IPACK)) ; Z_RI_CORR2 = 0. + ALLOCATE(Z_CC_CORR2(IPACK)) ; Z_CC_CORR2 = 0. + ALLOCATE(Z_CR_CORR2(IPACK)) ; Z_CR_CORR2 = 0. + ALLOCATE(Z_CI_CORR2(IPACK)) ; Z_CI_CORR2 = 0. + ! + !*** 4.1 Tendecies computation + ! + + CALL LIMA_INST_PROCS (PTSTEP, LLCOMPUTE1D, & + ZEXNREF1D, ZP1D, & + ZTHT1D, ZRVT1D, ZRCT1D, ZRRT1D, ZRIT1D, ZRST1D, ZRGT1D, & + ZCCT1D, ZCRT1D, ZCIT1D, & + ZIFNN1D, & + Z_CR_BRKU, & ! spontaneous break up of drops (BRKU) : Nr + Z_TH_HONR, Z_RR_HONR, Z_CR_HONR, & ! rain drops homogeneous freezing (HONR) : rr, Nr, rg=-rr, th + Z_TH_IMLT, Z_RC_IMLT, Z_CC_IMLT, & ! ice melting (IMLT) : rc, Nc, ri=-rc, Ni=-Nc, th, IFNF, IFNA + ZB_TH, ZB_RV, ZB_RC, ZB_RR, ZB_RI, ZB_RG, & + ZB_CC, ZB_CR, ZB_CI, & + ZB_IFNN, & + ZCF1D, ZIF1D, ZPF1D ) + + CALL LIMA_TENDENCIES (PTSTEP, LLCOMPUTE1D, & + ZEXNREF1D, ZRHODREF1D, ZP1D, ZTHT1D, & + ZRVT1D, ZRCT1D, ZRRT1D, ZRIT1D, ZRST1D, ZRGT1D, ZRHT1D,& + ZCCT1D, ZCRT1D, ZCIT1D, & + Z_TH_HONC, Z_RC_HONC, Z_CC_HONC, & + Z_CC_SELF, & + Z_RC_AUTO, Z_CC_AUTO, Z_CR_AUTO, & + Z_RC_ACCR, Z_CC_ACCR, & + Z_CR_SCBU, & + Z_TH_EVAP, Z_RR_EVAP, & + Z_RI_CNVI, Z_CI_CNVI, & + Z_TH_DEPS, Z_RS_DEPS, & + Z_TH_DEPI, Z_RI_DEPI, & + Z_RI_CNVS, Z_CI_CNVS, & + Z_RI_AGGS, Z_CI_AGGS, & + Z_TH_DEPG, Z_RG_DEPG, & + Z_TH_BERFI, Z_RC_BERFI, & + Z_TH_RIM, Z_RC_RIM, Z_CC_RIM, Z_RS_RIM, Z_RG_RIM, & + Z_RI_HMS, Z_CI_HMS, Z_RS_HMS, & + Z_TH_ACC, Z_RR_ACC, Z_CR_ACC, Z_RS_ACC, Z_RG_ACC, & + Z_RS_CMEL, & + Z_TH_CFRZ, Z_RR_CFRZ, Z_CR_CFRZ, Z_RI_CFRZ, Z_CI_CFRZ, & + Z_TH_WETG, Z_RC_WETG, Z_CC_WETG, Z_RR_WETG, Z_CR_WETG, & + Z_RI_WETG, Z_CI_WETG, Z_RS_WETG, Z_RG_WETG, Z_RH_WETG, & + Z_TH_DRYG, Z_RC_DRYG, Z_CC_DRYG, Z_RR_DRYG, Z_CR_DRYG, & + Z_RI_DRYG, Z_CI_DRYG, Z_RS_DRYG, Z_RG_DRYG, & + Z_RI_HMG, Z_CI_HMG, Z_RG_HMG, & + Z_TH_GMLT, Z_RR_GMLT, Z_CR_GMLT, & +!!! Z_RC_WETH, Z_CC_WETH, Z_RR_WETH, Z_CR_WETH, & ! wet growth of hail (WETH) : rc, Nc, rr, Nr, ri, Ni, rs, rg, rh, th +!!! Z_RI_WETH, Z_CI_WETH, Z_RS_WETH, Z_RG_WETH, Z_RH_WETH, & ! wet growth of hail (WETH) : rc, Nc, rr, Nr, ri, Ni, rs, rg, rh, th +!!! Z_RG_COHG, & ! conversion of hail into graupel (COHG) : rg, rh +!!! Z_RR_HMLT, Z_CR_HMLT ! hail melting (HMLT) : rr, Nr, rh=-rr, th + ZA_TH, ZA_RV, ZA_RC, ZA_CC, ZA_RR, ZA_CR, & + ZA_RI, ZA_CI, ZA_RS, ZA_RG, ZA_RH, & + ZEVAP1D, & + ZCF1D, ZIF1D, ZPF1D ) + + ! + !*** 4.2 Integration time + ! + ! If we can, we will use these tendecies until the end of the timestep + ZMAXTIME(:)=PTSTEP-ZTIME1D(:) ! Remaining time until the end of the timestep + + ! We need to adjust tendencies when temperature reaches 0 + IF(LFEEDBACKT) THEN + !Is ZB_TH enough to change temperature sign? + WHERE( ((ZTHT1D(:) - XTT/ZEXN1D(:)) * (ZTHT1D(:) + ZB_TH(:) - XTT/ZEXN1D(:))) < 0. ) + ZMAXTIME(:)=0. + ENDWHERE + !Can ZA_TH make temperature change of sign? + ZTIME_THRESHOLD(:)=-1. + WHERE(ABS(ZA_TH(:))>1.E-20) + ZTIME_THRESHOLD(:)=(XTT/ZEXN1D(:) - ZB_TH(:) - ZTHT1D(:))/ZA_TH(:) + ENDWHERE + WHERE(ZTIME_THRESHOLD(:)>0.) + ZMAXTIME(:)=MIN(ZMAXTIME(:), ZTIME_THRESHOLD(:)) + ENDWHERE + ENDIF + + ! We need to adjust tendencies when a species disappears + ! When a species is missing, only the external tendencies can be negative (and we must keep track of it) + WHERE(ZA_RV(:)<-1.E-20 .AND. ZRVT1D(:)>XRTMIN(1)) + ZMAXTIME(:)=MIN(ZMAXTIME(:), -(ZB_RV(:)+ZRVT1D(:))/ZA_RV(:)) + END WHERE + WHERE(ZA_RC(:)<-1.E-20 .AND. ZRCT1D(:)>XRTMIN(2)) + ZMAXTIME(:)=MIN(ZMAXTIME(:), -(ZB_RC(:)+ZRCT1D(:))/ZA_RC(:)) + END WHERE + WHERE(ZA_RR(:)<-1.E-20 .AND. ZRRT1D(:)>XRTMIN(3)) + ZMAXTIME(:)=MIN(ZMAXTIME(:), -(ZB_RR(:)+ZRRT1D(:))/ZA_RR(:)) + END WHERE + WHERE(ZA_RI(:)<-1.E-20 .AND. ZRIT1D(:)>XRTMIN(4)) + ZMAXTIME(:)=MIN(ZMAXTIME(:), -(ZB_RI(:)+ZRIT1D(:))/ZA_RI(:)) + END WHERE + WHERE(ZA_RS(:)<-1.E-20 .AND. ZRST1D(:)>XRTMIN(5)) + ZMAXTIME(:)=MIN(ZMAXTIME(:), -(ZB_RS(:)+ZRST1D(:))/ZA_RS(:)) + END WHERE + WHERE(ZA_RG(:)<-1.E-20 .AND. ZRGT1D(:)>XRTMIN(6)) + ZMAXTIME(:)=MIN(ZMAXTIME(:), -(ZB_RG(:)+ZRGT1D(:))/ZA_RG(:)) + END WHERE + WHERE(ZA_RH(:)<-1.E-20 .AND. ZRHT1D(:)>XRTMIN(7)) + ZMAXTIME(:)=MIN(ZMAXTIME(:), -(ZB_RH(:)+ZRHT1D(:))/ZA_RH(:)) + END WHERE + + ! We stop when the end of the timestep is reached + WHERE(PTSTEP-ZTIME1D(:)-ZMAXTIME(:)<=0.) + LLCOMPUTE1D(:)=.FALSE. + ENDWHERE + + ! We must recompute tendencies when the end of the sub-timestep is reached + IF(XTSTEP_TS/=0.) THEN + WHERE(IITER1D(:)<INB_ITER_MAX .AND. ZTIME1D(:)+ZMAXTIME(:)>ZTIME_LASTCALL1D(:)+ZTSTEP) + ZMAXTIME(:)=ZTIME_LASTCALL1D(:)-ZTIME1D(:)+ZTSTEP + LLCOMPUTE1D(:)=.FALSE. + ENDWHERE + ENDIF + + ! We must recompute tendencies when the maximum allowed change is reached + ! When a species is missing, only the external tendencies can be active and we do not want to recompute + ! the microphysical tendencies when external tendencies are negative (results won't change because species was already missing) + IF(XMRSTEP/=0.) THEN + ZTIME_THRESHOLD(:)=-1. + WHERE(IITER1D(:)<INB_ITER_MAX .AND. ABS(ZA_RV(:))>1.E-20) + ZTIME_THRESHOLD(:)=(SIGN(1., ZA_RV(:))*XMRSTEP+Z0RVT1D(:)-ZRVT1D(:)-ZB_RV(:))/ZA_RV(:) + ENDWHERE + WHERE(ZTIME_THRESHOLD(:)>=0. .AND. ZTIME_THRESHOLD(:)<ZMAXTIME(:) .AND. & + &(ZRVT1D(:)>XRTMIN(1) .OR. ZA_RV(:)>0.)) + ZMAXTIME(:)=MIN(ZMAXTIME(:), ZTIME_THRESHOLD(:)) + LLCOMPUTE1D(:)=.FALSE. + ENDWHERE + + ZTIME_THRESHOLD(:)=-1. + WHERE(IITER1D(:)<INB_ITER_MAX .AND. ABS(ZA_RC(:))>1.E-20) + ZTIME_THRESHOLD(:)=(SIGN(1., ZA_RC(:))*XMRSTEP+Z0RCT1D(:)-ZRCT1D(:)-ZB_RC(:))/ZA_RC(:) + ENDWHERE + WHERE(ZTIME_THRESHOLD(:)>=0. .AND. ZTIME_THRESHOLD(:)<ZMAXTIME(:) .AND. & + &(ZRCT1D(:)>XRTMIN(2) .OR. ZA_RC(:)>0.)) + ZMAXTIME(:)=MIN(ZMAXTIME(:), ZTIME_THRESHOLD(:)) + LLCOMPUTE1D(:)=.FALSE. + ENDWHERE + + ZTIME_THRESHOLD(:)=-1. + WHERE(IITER1D(:)<INB_ITER_MAX .AND. ABS(ZA_RR(:))>1.E-20) + ZTIME_THRESHOLD(:)=(SIGN(1., ZA_RR(:))*XMRSTEP+Z0RRT1D(:)-ZRRT1D(:)-ZB_RR(:))/ZA_RR(:) + ENDWHERE + WHERE(ZTIME_THRESHOLD(:)>=0. .AND. ZTIME_THRESHOLD(:)<ZMAXTIME(:) .AND. & + &(ZRRT1D(:)>XRTMIN(3) .OR. ZA_RR(:)>0.)) + ZMAXTIME(:)=MIN(ZMAXTIME(:), ZTIME_THRESHOLD(:)) + LLCOMPUTE1D(:)=.FALSE. + ENDWHERE + + ZTIME_THRESHOLD(:)=-1. + WHERE(IITER1D(:)<INB_ITER_MAX .AND. ABS(ZA_RI(:))>1.E-20) + ZTIME_THRESHOLD(:)=(SIGN(1., ZA_RI(:))*XMRSTEP+Z0RIT1D(:)-ZRIT1D(:)-ZB_RI(:))/ZA_RI(:) + ENDWHERE + WHERE(ZTIME_THRESHOLD(:)>=0. .AND. ZTIME_THRESHOLD(:)<ZMAXTIME(:) .AND. & + &(ZRIT1D(:)>XRTMIN(4) .OR. ZA_RI(:)>0.)) + ZMAXTIME(:)=MIN(ZMAXTIME(:), ZTIME_THRESHOLD(:)) + LLCOMPUTE1D(:)=.FALSE. + ENDWHERE + + ZTIME_THRESHOLD(:)=-1. + WHERE(IITER1D(:)<INB_ITER_MAX .AND. ABS(ZA_RS(:))>1.E-20) + ZTIME_THRESHOLD(:)=(SIGN(1., ZA_RS(:))*XMRSTEP+Z0RST1D(:)-ZRST1D(:)-ZB_RS(:))/ZA_RS(:) + ENDWHERE + WHERE(ZTIME_THRESHOLD(:)>=0. .AND. ZTIME_THRESHOLD(:)<ZMAXTIME(:) .AND. & + &(ZRST1D(:)>XRTMIN(5) .OR. ZA_RS(:)>0.)) + ZMAXTIME(:)=MIN(ZMAXTIME(:), ZTIME_THRESHOLD(:)) + LLCOMPUTE1D(:)=.FALSE. + ENDWHERE + + ZTIME_THRESHOLD(:)=-1. + WHERE(IITER1D(:)<INB_ITER_MAX .AND. ABS(ZA_RG(:))>1.E-20) + ZTIME_THRESHOLD(:)=(SIGN(1., ZA_RG(:))*XMRSTEP+Z0RGT1D(:)-ZRGT1D(:)-ZB_RG(:))/ZA_RG(:) + ENDWHERE + WHERE(ZTIME_THRESHOLD(:)>=0. .AND. ZTIME_THRESHOLD(:)<ZMAXTIME(:) .AND. & + &(ZRGT1D(:)>XRTMIN(6) .OR. ZA_RG(:)>0.)) + ZMAXTIME(:)=MIN(ZMAXTIME(:), ZTIME_THRESHOLD(:)) + LLCOMPUTE1D(:)=.FALSE. + ENDWHERE + + ZTIME_THRESHOLD(:)=-1. + WHERE(IITER1D(:)<INB_ITER_MAX .AND. ABS(ZA_RH(:))>1.E-20) + ZTIME_THRESHOLD(:)=(SIGN(1., ZA_RH(:))*XMRSTEP+Z0RHT1D(:)-ZRHT1D(:)-ZB_RH(:))/ZA_RH(:) + ENDWHERE + WHERE(ZTIME_THRESHOLD(:)>=0. .AND. ZTIME_THRESHOLD(:)<ZMAXTIME(:) .AND. & + &(ZRHT1D(:)>XRTMIN(7) .OR. ZA_RH(:)>0.)) + ZMAXTIME(:)=MIN(ZMAXTIME(:), ZTIME_THRESHOLD(:)) + LLCOMPUTE1D(:)=.FALSE. + ENDWHERE + + WHERE(IITER1D(:)<INB_ITER_MAX .AND. MAX(ABS(ZB_RV(:)), & + ABS(ZB_RC(:)), ABS(ZB_RR(:)), ABS(ZB_RI(:)), & + ABS(ZB_RS(:)), ABS(ZB_RG(:)), ABS(ZB_RH(:)))>XMRSTEP) + ZMAXTIME(:)=0. + LLCOMPUTE1D(:)=.FALSE. + ENDWHERE + ENDIF + ! + !*** 4.3 New values of variables for next iteration + ! + ZTHT1D = ZTHT1D + ZA_TH(:) * ZMAXTIME(:) + ZB_TH(:) + ZRVT1D = ZRVT1D + ZA_RV(:) * ZMAXTIME(:) + ZB_RV(:) + ZRCT1D = ZRCT1D + ZA_RC(:) * ZMAXTIME(:) + ZB_RC(:) + ZCCT1D = ZCCT1D + ZA_CC(:) * ZMAXTIME(:) + ZB_CC(:) + ZRRT1D = ZRRT1D + ZA_RR(:) * ZMAXTIME(:) + ZB_RR(:) + ZCRT1D = ZCRT1D + ZA_CR(:) * ZMAXTIME(:) + ZB_CR(:) + ZRIT1D = ZRIT1D + ZA_RI(:) * ZMAXTIME(:) + ZB_RI(:) + ZCIT1D = ZCIT1D + ZA_CI(:) * ZMAXTIME(:) + ZB_CI(:) + ZRST1D = ZRST1D + ZA_RS(:) * ZMAXTIME(:) + ZB_RS(:) + ZRGT1D = ZRGT1D + ZA_RG(:) * ZMAXTIME(:) + ZB_RG(:) + ZRHT1D = ZRHT1D + ZA_RH(:) * ZMAXTIME(:) + ZB_RH(:) + ! + DO II=1,NMOD_IFN + ZIFNN1D(:,II) = ZIFNN1D(:,II) + ZB_IFNN(:,II) + END DO + ! + !*** 4.5 + ! + WHERE (ZRCT1D .LE. XRTMIN(2)) + Z_RV_CORR2(:) = ZRCT1D(:) + Z_RC_CORR2(:) = -ZRCT1D(:) + Z_CC_CORR2(:) = -ZCCT1D(:) + + ZRVT1D = ZRVT1D + ZRCT1D + ZRCT1D = 0. + ZCCT1D = 0. + END WHERE + WHERE (ZRRT1D .LE. XRTMIN(3)) + Z_RV_CORR2(:) = Z_RV_CORR2(:) + ZRRT1D(:) + Z_RR_CORR2(:) = -ZRRT1D(:) + Z_CR_CORR2(:) = -ZCRT1D(:) + + ZRVT1D = ZRVT1D + ZRRT1D + ZRRT1D = 0. + ZCRT1D = 0. + END WHERE + WHERE (ZRIT1D .LE. XRTMIN(4)) + Z_RV_CORR2(:) = Z_RV_CORR2(:) + ZRIT1D(:) + Z_RI_CORR2(:) = -ZRIT1D(:) + Z_CI_CORR2(:) = -ZCIT1D(:) + + ZRVT1D = ZRVT1D + ZRIT1D + ZRIT1D = 0. + ZCIT1D = 0. + END WHERE + + ! + !*** 4.5 Next loop + ! + ZTIME1D(:)=ZTIME1D(:)+ZMAXTIME(:) + ! + !*** 4.4 Unpacking + ! + DO II=1,IPACK + ZTHT(I1(II),I2(II),I3(II)) = ZTHT1D(II) + ZRVT(I1(II),I2(II),I3(II)) = ZRVT1D(II) + ZRCT(I1(II),I2(II),I3(II)) = ZRCT1D(II) + ZRRT(I1(II),I2(II),I3(II)) = ZRRT1D(II) + ZRIT(I1(II),I2(II),I3(II)) = ZRIT1D(II) + ZRST(I1(II),I2(II),I3(II)) = ZRST1D(II) + ZRGT(I1(II),I2(II),I3(II)) = ZRGT1D(II) + ZRHT(I1(II),I2(II),I3(II)) = ZRHT1D(II) + ZCCT(I1(II),I2(II),I3(II)) = ZCCT1D(II) + ZCRT(I1(II),I2(II),I3(II)) = ZCRT1D(II) + ZCIT(I1(II),I2(II),I3(II)) = ZCIT1D(II) + ZIFNNT(I1(II),I2(II),I3(II),:) = ZIFNN1D(II,:) + PEVAP3D(I1(II),I2(II),I3(II)) = ZEVAP1D(II) + ZTIME(I1(II),I2(II),I3(II)) = ZTIME1D(II) + LLCOMPUTE(I1(II),I2(II),I3(II)) = LLCOMPUTE1D(II) + IITER(I1(II),I2(II),I3(II)) = IITER1D(II) + END DO + ! + CALL LIMA_DROPS_TO_DROPLETS_CONV(PRHODREF, ZRCT, ZRRT, ZCCT, ZCRT, & + Z_RR_CVRC, Z_CR_CVRC ) + ZRCT(:,:,:) = ZRCT(:,:,:) - Z_RR_CVRC(:,:,:) + ZRRT(:,:,:) = ZRRT(:,:,:) + Z_RR_CVRC(:,:,:) + ZCCT(:,:,:) = ZCCT(:,:,:) - Z_CR_CVRC(:,:,:) + ZCRT(:,:,:) = ZCRT(:,:,:) + Z_CR_CVRC(:,:,:) + ! + !*** 4.4 Unpacking for budgets + ! + IF(LBU_ENABLE) THEN + ZTOT_RR_CVRC(:,:,:) = ZTOT_RR_CVRC(:,:,:) + Z_RR_CVRC(:,:,:) + ZTOT_CR_CVRC(:,:,:) = ZTOT_CR_CVRC(:,:,:) + Z_CR_CVRC(:,:,:) + + DO II=1,IPACK + ! Instantaneous processes + ZTOT_CR_BRKU(I1(II),I2(II),I3(II)) = ZTOT_CR_BRKU(I1(II),I2(II),I3(II)) + Z_CR_BRKU(II) + ZTOT_TH_HONR(I1(II),I2(II),I3(II)) = ZTOT_TH_HONR(I1(II),I2(II),I3(II)) + Z_TH_HONR(II) + ZTOT_RR_HONR(I1(II),I2(II),I3(II)) = ZTOT_RR_HONR(I1(II),I2(II),I3(II)) + Z_RR_HONR(II) + ZTOT_CR_HONR(I1(II),I2(II),I3(II)) = ZTOT_CR_HONR(I1(II),I2(II),I3(II)) + Z_CR_HONR(II) + ZTOT_TH_IMLT(I1(II),I2(II),I3(II)) = ZTOT_TH_IMLT(I1(II),I2(II),I3(II)) + Z_TH_IMLT(II) + ZTOT_RC_IMLT(I1(II),I2(II),I3(II)) = ZTOT_RC_IMLT(I1(II),I2(II),I3(II)) + Z_RC_IMLT(II) + ZTOT_CC_IMLT(I1(II),I2(II),I3(II)) = ZTOT_CC_IMLT(I1(II),I2(II),I3(II)) + Z_CC_IMLT(II) + DO JI = 1, NMOD_IFN + ZTOT_IFNN_IMLT(I1(II),I2(II),I3(II),JI) = ZTOT_IFNN_IMLT(I1(II),I2(II),I3(II),JI) + ZB_IFNN(II,JI) + END DO + + ! Tendencies + ZTOT_TH_HONC(I1(II),I2(II),I3(II)) = ZTOT_TH_HONC(I1(II),I2(II),I3(II)) + Z_TH_HONC(II) * ZMAXTIME(II) + ZTOT_RC_HONC(I1(II),I2(II),I3(II)) = ZTOT_RC_HONC(I1(II),I2(II),I3(II)) + Z_RC_HONC(II) * ZMAXTIME(II) + ZTOT_CC_HONC(I1(II),I2(II),I3(II)) = ZTOT_CC_HONC(I1(II),I2(II),I3(II)) + Z_CC_HONC(II) * ZMAXTIME(II) + ZTOT_CC_SELF(I1(II),I2(II),I3(II)) = ZTOT_CC_SELF(I1(II),I2(II),I3(II)) + Z_CC_SELF(II) * ZMAXTIME(II) + ZTOT_RC_AUTO(I1(II),I2(II),I3(II)) = ZTOT_RC_AUTO(I1(II),I2(II),I3(II)) + Z_RC_AUTO(II) * ZMAXTIME(II) + ZTOT_CC_AUTO(I1(II),I2(II),I3(II)) = ZTOT_CC_AUTO(I1(II),I2(II),I3(II)) + Z_CC_AUTO(II) * ZMAXTIME(II) + ZTOT_CR_AUTO(I1(II),I2(II),I3(II)) = ZTOT_CR_AUTO(I1(II),I2(II),I3(II)) + Z_CR_AUTO(II) * ZMAXTIME(II) + ZTOT_RC_ACCR(I1(II),I2(II),I3(II)) = ZTOT_RC_ACCR(I1(II),I2(II),I3(II)) + Z_RC_ACCR(II) * ZMAXTIME(II) + ZTOT_CC_ACCR(I1(II),I2(II),I3(II)) = ZTOT_CC_ACCR(I1(II),I2(II),I3(II)) + Z_CC_ACCR(II) * ZMAXTIME(II) + ZTOT_CR_SCBU(I1(II),I2(II),I3(II)) = ZTOT_CR_SCBU(I1(II),I2(II),I3(II)) + Z_CR_SCBU(II) * ZMAXTIME(II) + ZTOT_TH_EVAP(I1(II),I2(II),I3(II)) = ZTOT_TH_EVAP(I1(II),I2(II),I3(II)) + Z_TH_EVAP(II) * ZMAXTIME(II) +!!$ ZTOT_RC_EVAP(I1(II),I2(II),I3(II)) = ZTOT_RC_EVAP(I1(II),I2(II),I3(II)) + Z_RC_EVAP(II) * ZMAXTIME(II) +!!$ ZTOT_CC_EVAP(I1(II),I2(II),I3(II)) = ZTOT_CC_EVAP(I1(II),I2(II),I3(II)) + Z_CC_EVAP(II) * ZMAXTIME(II) + ZTOT_RR_EVAP(I1(II),I2(II),I3(II)) = ZTOT_RR_EVAP(I1(II),I2(II),I3(II)) + Z_RR_EVAP(II) * ZMAXTIME(II) +!!$ ZTOT_CR_EVAP(I1(II),I2(II),I3(II)) = ZTOT_CR_EVAP(I1(II),I2(II),I3(II)) + Z_CR_EVAP(II) * ZMAXTIME(II) + ZTOT_RI_CNVI(I1(II),I2(II),I3(II)) = ZTOT_RI_CNVI(I1(II),I2(II),I3(II)) + Z_RI_CNVI(II) * ZMAXTIME(II) + ZTOT_CI_CNVI(I1(II),I2(II),I3(II)) = ZTOT_CI_CNVI(I1(II),I2(II),I3(II)) + Z_CI_CNVI(II) * ZMAXTIME(II) + ZTOT_TH_DEPS(I1(II),I2(II),I3(II)) = ZTOT_TH_DEPS(I1(II),I2(II),I3(II)) + Z_TH_DEPS(II) * ZMAXTIME(II) + ZTOT_RS_DEPS(I1(II),I2(II),I3(II)) = ZTOT_RS_DEPS(I1(II),I2(II),I3(II)) + Z_RS_DEPS(II) * ZMAXTIME(II) + ZTOT_TH_DEPI(I1(II),I2(II),I3(II)) = ZTOT_TH_DEPI(I1(II),I2(II),I3(II)) + Z_TH_DEPI(II) * ZMAXTIME(II) + ZTOT_RI_DEPI(I1(II),I2(II),I3(II)) = ZTOT_RI_DEPI(I1(II),I2(II),I3(II)) + Z_RI_DEPI(II) * ZMAXTIME(II) + ZTOT_RI_CNVS(I1(II),I2(II),I3(II)) = ZTOT_RI_CNVS(I1(II),I2(II),I3(II)) + Z_RI_CNVS(II) * ZMAXTIME(II) + ZTOT_CI_CNVS(I1(II),I2(II),I3(II)) = ZTOT_CI_CNVS(I1(II),I2(II),I3(II)) + Z_CI_CNVS(II) * ZMAXTIME(II) + ZTOT_RI_AGGS(I1(II),I2(II),I3(II)) = ZTOT_RI_AGGS(I1(II),I2(II),I3(II)) + Z_RI_AGGS(II) * ZMAXTIME(II) + ZTOT_CI_AGGS(I1(II),I2(II),I3(II)) = ZTOT_CI_AGGS(I1(II),I2(II),I3(II)) + Z_CI_AGGS(II) * ZMAXTIME(II) + ZTOT_TH_DEPG(I1(II),I2(II),I3(II)) = ZTOT_TH_DEPG(I1(II),I2(II),I3(II)) + Z_TH_DEPG(II) * ZMAXTIME(II) + ZTOT_RG_DEPG(I1(II),I2(II),I3(II)) = ZTOT_RG_DEPG(I1(II),I2(II),I3(II)) + Z_RG_DEPG(II) * ZMAXTIME(II) + ZTOT_TH_BERFI(I1(II),I2(II),I3(II))= ZTOT_TH_BERFI(I1(II),I2(II),I3(II)) + Z_TH_BERFI(II) * ZMAXTIME(II) + ZTOT_RC_BERFI(I1(II),I2(II),I3(II))= ZTOT_RC_BERFI(I1(II),I2(II),I3(II)) + Z_RC_BERFI(II) * ZMAXTIME(II) + ZTOT_TH_RIM(I1(II),I2(II),I3(II)) = ZTOT_TH_RIM(I1(II),I2(II),I3(II)) + Z_TH_RIM(II) * ZMAXTIME(II) + ZTOT_RC_RIM(I1(II),I2(II),I3(II)) = ZTOT_RC_RIM(I1(II),I2(II),I3(II)) + Z_RC_RIM(II) * ZMAXTIME(II) + ZTOT_CC_RIM(I1(II),I2(II),I3(II)) = ZTOT_CC_RIM(I1(II),I2(II),I3(II)) + Z_CC_RIM(II) * ZMAXTIME(II) + ZTOT_RS_RIM(I1(II),I2(II),I3(II)) = ZTOT_RS_RIM(I1(II),I2(II),I3(II)) + Z_RS_RIM(II) * ZMAXTIME(II) + ZTOT_RG_RIM(I1(II),I2(II),I3(II)) = ZTOT_RG_RIM(I1(II),I2(II),I3(II)) + Z_RG_RIM(II) * ZMAXTIME(II) + ZTOT_RI_HMS(I1(II),I2(II),I3(II)) = ZTOT_RI_HMS(I1(II),I2(II),I3(II)) + Z_RI_HMS(II) * ZMAXTIME(II) + ZTOT_CI_HMS(I1(II),I2(II),I3(II)) = ZTOT_CI_HMS(I1(II),I2(II),I3(II)) + Z_CI_HMS(II) * ZMAXTIME(II) + ZTOT_RS_HMS(I1(II),I2(II),I3(II)) = ZTOT_RS_HMS(I1(II),I2(II),I3(II)) + Z_RS_HMS(II) * ZMAXTIME(II) + ZTOT_TH_ACC(I1(II),I2(II),I3(II)) = ZTOT_TH_ACC(I1(II),I2(II),I3(II)) + Z_TH_ACC(II) * ZMAXTIME(II) + ZTOT_RR_ACC(I1(II),I2(II),I3(II)) = ZTOT_RR_ACC(I1(II),I2(II),I3(II)) + Z_RR_ACC(II) * ZMAXTIME(II) + ZTOT_CR_ACC(I1(II),I2(II),I3(II)) = ZTOT_CR_ACC(I1(II),I2(II),I3(II)) + Z_CR_ACC(II) * ZMAXTIME(II) + ZTOT_RS_ACC(I1(II),I2(II),I3(II)) = ZTOT_RS_ACC(I1(II),I2(II),I3(II)) + Z_RS_ACC(II) * ZMAXTIME(II) + ZTOT_RG_ACC(I1(II),I2(II),I3(II)) = ZTOT_RG_ACC(I1(II),I2(II),I3(II)) + Z_RG_ACC(II) * ZMAXTIME(II) + ZTOT_RS_CMEL(I1(II),I2(II),I3(II)) = ZTOT_RS_CMEL(I1(II),I2(II),I3(II)) + Z_RS_CMEL(II) * ZMAXTIME(II) + ZTOT_TH_CFRZ(I1(II),I2(II),I3(II)) = ZTOT_TH_CFRZ(I1(II),I2(II),I3(II)) + Z_TH_CFRZ(II) * ZMAXTIME(II) + ZTOT_RR_CFRZ(I1(II),I2(II),I3(II)) = ZTOT_RR_CFRZ(I1(II),I2(II),I3(II)) + Z_RR_CFRZ(II) * ZMAXTIME(II) + ZTOT_CR_CFRZ(I1(II),I2(II),I3(II)) = ZTOT_CR_CFRZ(I1(II),I2(II),I3(II)) + Z_CR_CFRZ(II) * ZMAXTIME(II) + ZTOT_RI_CFRZ(I1(II),I2(II),I3(II)) = ZTOT_RI_CFRZ(I1(II),I2(II),I3(II)) + Z_RI_CFRZ(II) * ZMAXTIME(II) + ZTOT_CI_CFRZ(I1(II),I2(II),I3(II)) = ZTOT_CI_CFRZ(I1(II),I2(II),I3(II)) + Z_CI_CFRZ(II) * ZMAXTIME(II) + ZTOT_TH_WETG(I1(II),I2(II),I3(II)) = ZTOT_TH_WETG(I1(II),I2(II),I3(II)) + Z_TH_WETG(II) * ZMAXTIME(II) + ZTOT_RC_WETG(I1(II),I2(II),I3(II)) = ZTOT_RC_WETG(I1(II),I2(II),I3(II)) + Z_RC_WETG(II) * ZMAXTIME(II) + ZTOT_CC_WETG(I1(II),I2(II),I3(II)) = ZTOT_CC_WETG(I1(II),I2(II),I3(II)) + Z_CC_WETG(II) * ZMAXTIME(II) + ZTOT_RR_WETG(I1(II),I2(II),I3(II)) = ZTOT_RR_WETG(I1(II),I2(II),I3(II)) + Z_RR_WETG(II) * ZMAXTIME(II) + ZTOT_CR_WETG(I1(II),I2(II),I3(II)) = ZTOT_CR_WETG(I1(II),I2(II),I3(II)) + Z_CR_WETG(II) * ZMAXTIME(II) + ZTOT_RI_WETG(I1(II),I2(II),I3(II)) = ZTOT_RI_WETG(I1(II),I2(II),I3(II)) + Z_RI_WETG(II) * ZMAXTIME(II) + ZTOT_CI_WETG(I1(II),I2(II),I3(II)) = ZTOT_CI_WETG(I1(II),I2(II),I3(II)) + Z_CI_WETG(II) * ZMAXTIME(II) + ZTOT_RS_WETG(I1(II),I2(II),I3(II)) = ZTOT_RS_WETG(I1(II),I2(II),I3(II)) + Z_RS_WETG(II) * ZMAXTIME(II) + ZTOT_RG_WETG(I1(II),I2(II),I3(II)) = ZTOT_RG_WETG(I1(II),I2(II),I3(II)) + Z_RG_WETG(II) * ZMAXTIME(II) + ZTOT_RH_WETG(I1(II),I2(II),I3(II)) = ZTOT_RH_WETG(I1(II),I2(II),I3(II)) + Z_RH_WETG(II) * ZMAXTIME(II) + ZTOT_TH_DRYG(I1(II),I2(II),I3(II)) = ZTOT_TH_DRYG(I1(II),I2(II),I3(II)) + Z_TH_DRYG(II) * ZMAXTIME(II) + ZTOT_RC_DRYG(I1(II),I2(II),I3(II)) = ZTOT_RC_DRYG(I1(II),I2(II),I3(II)) + Z_RC_DRYG(II) * ZMAXTIME(II) + ZTOT_CC_DRYG(I1(II),I2(II),I3(II)) = ZTOT_CC_DRYG(I1(II),I2(II),I3(II)) + Z_CC_DRYG(II) * ZMAXTIME(II) + ZTOT_RR_DRYG(I1(II),I2(II),I3(II)) = ZTOT_RR_DRYG(I1(II),I2(II),I3(II)) + Z_RR_DRYG(II) * ZMAXTIME(II) + ZTOT_CR_DRYG(I1(II),I2(II),I3(II)) = ZTOT_CR_DRYG(I1(II),I2(II),I3(II)) + Z_CR_DRYG(II) * ZMAXTIME(II) + ZTOT_RI_DRYG(I1(II),I2(II),I3(II)) = ZTOT_RI_DRYG(I1(II),I2(II),I3(II)) + Z_RI_DRYG(II) * ZMAXTIME(II) + ZTOT_CI_DRYG(I1(II),I2(II),I3(II)) = ZTOT_CI_DRYG(I1(II),I2(II),I3(II)) + Z_CI_DRYG(II) * ZMAXTIME(II) + ZTOT_RS_DRYG(I1(II),I2(II),I3(II)) = ZTOT_RS_DRYG(I1(II),I2(II),I3(II)) + Z_RS_DRYG(II) * ZMAXTIME(II) + ZTOT_RG_DRYG(I1(II),I2(II),I3(II)) = ZTOT_RG_DRYG(I1(II),I2(II),I3(II)) + Z_RG_DRYG(II) * ZMAXTIME(II) + ZTOT_RI_HMG(I1(II),I2(II),I3(II)) = ZTOT_RI_HMG(I1(II),I2(II),I3(II)) + Z_RI_HMG(II) * ZMAXTIME(II) + ZTOT_CI_HMG(I1(II),I2(II),I3(II)) = ZTOT_CI_HMG(I1(II),I2(II),I3(II)) + Z_CI_HMG(II) * ZMAXTIME(II) + ZTOT_RG_HMG(I1(II),I2(II),I3(II)) = ZTOT_RG_HMG(I1(II),I2(II),I3(II)) + Z_RG_HMG(II) * ZMAXTIME(II) + ZTOT_TH_GMLT(I1(II),I2(II),I3(II)) = ZTOT_TH_GMLT(I1(II),I2(II),I3(II)) + Z_TH_GMLT(II) * ZMAXTIME(II) + ZTOT_RR_GMLT(I1(II),I2(II),I3(II)) = ZTOT_RR_GMLT(I1(II),I2(II),I3(II)) + Z_RR_GMLT(II) * ZMAXTIME(II) + ZTOT_CR_GMLT(I1(II),I2(II),I3(II)) = ZTOT_CR_GMLT(I1(II),I2(II),I3(II)) + Z_CR_GMLT(II) * ZMAXTIME(II) +!!$ ZTOT_RC_WETH(I1(II),I2(II),I3(II)) = ZTOT_RC_WETH(I1(II),I2(II),I3(II)) + Z_RC_WETH(II) * ZMAXTIME(II) +!!$ ZTOT_CC_WETH(I1(II),I2(II),I3(II)) = ZTOT_CC_WETH(I1(II),I2(II),I3(II)) + Z_CC_WETH(II) * ZMAXTIME(II) +!!$ ZTOT_RR_WETH(I1(II),I2(II),I3(II)) = ZTOT_RR_WETH(I1(II),I2(II),I3(II)) + Z_RR_WETH(II) * ZMAXTIME(II) +!!$ ZTOT_CR_WETH(I1(II),I2(II),I3(II)) = ZTOT_CR_WETH(I1(II),I2(II),I3(II)) + Z_CR_WETH(II) * ZMAXTIME(II) +!!$ ZTOT_RI_WETH(I1(II),I2(II),I3(II)) = ZTOT_RI_WETH(I1(II),I2(II),I3(II)) + Z_RI_WETH(II) * ZMAXTIME(II) +!!$ ZTOT_CI_WETH(I1(II),I2(II),I3(II)) = ZTOT_CI_WETH(I1(II),I2(II),I3(II)) + Z_CI_WETH(II) * ZMAXTIME(II) +!!$ ZTOT_RS_WETH(I1(II),I2(II),I3(II)) = ZTOT_RS_WETH(I1(II),I2(II),I3(II)) + Z_RS_WETH(II) * ZMAXTIME(II) +!!$ ZTOT_RG_WETH(I1(II),I2(II),I3(II)) = ZTOT_RG_WETH(I1(II),I2(II),I3(II)) + Z_RG_WETH(II) * ZMAXTIME(II) +!!$ ZTOT_RH_WETH(I1(II),I2(II),I3(II)) = ZTOT_RH_WETH(I1(II),I2(II),I3(II)) + Z_RH_WETH(II) * ZMAXTIME(II) +!!$ ZTOT_RG_COHG(I1(II),I2(II),I3(II)) = ZTOT_RG_COHG(I1(II),I2(II),I3(II)) + Z_RG_COHG(II) * ZMAXTIME(II) +!!$ ZTOT_RR_HMLT(I1(II),I2(II),I3(II)) = ZTOT_RR_HMLT(I1(II),I2(II),I3(II)) + Z_RR_HMLT(II) * ZMAXTIME(II) +!!$ ZTOT_CR_HMLT(I1(II),I2(II),I3(II)) = ZTOT_CR_HMLT(I1(II),I2(II),I3(II)) + Z_CR_HMLT(II) * ZMAXTIME(II) + + !Correction term + ZTOT_RV_CORR2(I1(II),I2(II),I3(II)) = ZTOT_RV_CORR2(I1(II),I2(II),I3(II)) + Z_RV_CORR2(II) + ZTOT_RC_CORR2(I1(II),I2(II),I3(II)) = ZTOT_RC_CORR2(I1(II),I2(II),I3(II)) + Z_RC_CORR2(II) + ZTOT_RR_CORR2(I1(II),I2(II),I3(II)) = ZTOT_RR_CORR2(I1(II),I2(II),I3(II)) + Z_RR_CORR2(II) + ZTOT_RI_CORR2(I1(II),I2(II),I3(II)) = ZTOT_RI_CORR2(I1(II),I2(II),I3(II)) + Z_RI_CORR2(II) + ZTOT_CC_CORR2(I1(II),I2(II),I3(II)) = ZTOT_CC_CORR2(I1(II),I2(II),I3(II)) + Z_CC_CORR2(II) + ZTOT_CR_CORR2(I1(II),I2(II),I3(II)) = ZTOT_CR_CORR2(I1(II),I2(II),I3(II)) + Z_CR_CORR2(II) + ZTOT_CI_CORR2(I1(II),I2(II),I3(II)) = ZTOT_CI_CORR2(I1(II),I2(II),I3(II)) + Z_CI_CORR2(II) + END DO + ENDIF + ! + ! Deallocating variables + ! + DEALLOCATE(I1) + DEALLOCATE(I2) + DEALLOCATE(I3) + DEALLOCATE(ZRHODREF1D) + DEALLOCATE(ZEXNREF1D) + DEALLOCATE(ZEXN1D) + DEALLOCATE(ZP1D) + DEALLOCATE(ZTHT1D) + DEALLOCATE(ZRVT1D) + DEALLOCATE(ZRCT1D) + DEALLOCATE(ZRRT1D) + DEALLOCATE(ZRIT1D) + DEALLOCATE(ZRST1D) + DEALLOCATE(ZRGT1D) + DEALLOCATE(ZRHT1D) + DEALLOCATE(ZCCT1D) + DEALLOCATE(ZCRT1D) + DEALLOCATE(ZCIT1D) + DEALLOCATE(ZIFNN1D) + DEALLOCATE(ZEVAP1D) + DEALLOCATE(ZTIME1D) + DEALLOCATE(LLCOMPUTE1D) + DEALLOCATE(IITER1D) + DEALLOCATE(ZTIME_LASTCALL1D) + DEALLOCATE(Z0RVT1D) + DEALLOCATE(Z0RCT1D) + DEALLOCATE(Z0RRT1D) + DEALLOCATE(Z0RIT1D) + DEALLOCATE(Z0RST1D) + DEALLOCATE(Z0RGT1D) + DEALLOCATE(Z0RHT1D) + DEALLOCATE(ZCF1D) + DEALLOCATE(ZIF1D) + DEALLOCATE(ZPF1D) + ! + DEALLOCATE(ZMAXTIME) + DEALLOCATE(ZTIME_THRESHOLD) + ! + DEALLOCATE(ZA_TH) + DEALLOCATE(ZA_RV) + DEALLOCATE(ZA_RC) + DEALLOCATE(ZA_RR) + DEALLOCATE(ZA_RI) + DEALLOCATE(ZA_RS) + DEALLOCATE(ZA_RG) + DEALLOCATE(ZA_RH) + DEALLOCATE(ZA_CC) + DEALLOCATE(ZA_CR) + DEALLOCATE(ZA_CI) + ! + DEALLOCATE(ZB_TH) + DEALLOCATE(ZB_RV) + DEALLOCATE(ZB_RC) + DEALLOCATE(ZB_RR) + DEALLOCATE(ZB_RI) + DEALLOCATE(ZB_RS) + DEALLOCATE(ZB_RG) + DEALLOCATE(ZB_RH) + DEALLOCATE(ZB_CC) + DEALLOCATE(ZB_CR) + DEALLOCATE(ZB_CI) + DEALLOCATE(ZB_IFNN) + ! + DEALLOCATE(Z_CR_BRKU) + DEALLOCATE(Z_TH_HONR) + DEALLOCATE(Z_RR_HONR) + DEALLOCATE(Z_CR_HONR) + DEALLOCATE(Z_TH_IMLT) + DEALLOCATE(Z_RC_IMLT) + DEALLOCATE(Z_CC_IMLT) + DEALLOCATE(Z_TH_HONC) + DEALLOCATE(Z_RC_HONC) + DEALLOCATE(Z_CC_HONC) + DEALLOCATE(Z_CC_SELF) + DEALLOCATE(Z_RC_AUTO) + DEALLOCATE(Z_CC_AUTO) + DEALLOCATE(Z_CR_AUTO) + DEALLOCATE(Z_RC_ACCR) + DEALLOCATE(Z_CC_ACCR) + DEALLOCATE(Z_CR_SCBU) + DEALLOCATE(Z_TH_EVAP) + DEALLOCATE(Z_RR_EVAP) + DEALLOCATE(Z_RI_CNVI) + DEALLOCATE(Z_CI_CNVI) + DEALLOCATE(Z_TH_DEPS) + DEALLOCATE(Z_RS_DEPS) + DEALLOCATE(Z_TH_DEPI) + DEALLOCATE(Z_RI_DEPI) + DEALLOCATE(Z_RI_CNVS) + DEALLOCATE(Z_CI_CNVS) + DEALLOCATE(Z_RI_AGGS) + DEALLOCATE(Z_CI_AGGS) + DEALLOCATE(Z_TH_DEPG) + DEALLOCATE(Z_RG_DEPG) + DEALLOCATE(Z_TH_BERFI) + DEALLOCATE(Z_RC_BERFI) + DEALLOCATE(Z_TH_RIM) + DEALLOCATE(Z_RC_RIM) + DEALLOCATE(Z_CC_RIM) + DEALLOCATE(Z_RS_RIM) + DEALLOCATE(Z_RG_RIM) + DEALLOCATE(Z_RI_HMS) + DEALLOCATE(Z_CI_HMS) + DEALLOCATE(Z_RS_HMS) + DEALLOCATE(Z_TH_ACC) + DEALLOCATE(Z_RR_ACC) + DEALLOCATE(Z_CR_ACC) + DEALLOCATE(Z_RS_ACC) + DEALLOCATE(Z_RG_ACC) + DEALLOCATE(Z_RS_CMEL) + DEALLOCATE(Z_TH_CFRZ) + DEALLOCATE(Z_RR_CFRZ) + DEALLOCATE(Z_CR_CFRZ) + DEALLOCATE(Z_RI_CFRZ) + DEALLOCATE(Z_CI_CFRZ) + DEALLOCATE(Z_TH_WETG) + DEALLOCATE(Z_RC_WETG) + DEALLOCATE(Z_CC_WETG) + DEALLOCATE(Z_RR_WETG) + DEALLOCATE(Z_CR_WETG) + DEALLOCATE(Z_RI_WETG) + DEALLOCATE(Z_CI_WETG) + DEALLOCATE(Z_RS_WETG) + DEALLOCATE(Z_RG_WETG) + DEALLOCATE(Z_RH_WETG) + DEALLOCATE(Z_TH_DRYG) + DEALLOCATE(Z_RC_DRYG) + DEALLOCATE(Z_CC_DRYG) + DEALLOCATE(Z_RR_DRYG) + DEALLOCATE(Z_CR_DRYG) + DEALLOCATE(Z_RI_DRYG) + DEALLOCATE(Z_CI_DRYG) + DEALLOCATE(Z_RS_DRYG) + DEALLOCATE(Z_RG_DRYG) + DEALLOCATE(Z_RI_HMG) + DEALLOCATE(Z_CI_HMG) + DEALLOCATE(Z_RG_HMG) + DEALLOCATE(Z_TH_GMLT) + DEALLOCATE(Z_RR_GMLT) + DEALLOCATE(Z_CR_GMLT) + + DEALLOCATE(Z_RV_CORR2) + DEALLOCATE(Z_RC_CORR2) + DEALLOCATE(Z_RR_CORR2) + DEALLOCATE(Z_RI_CORR2) + DEALLOCATE(Z_CC_CORR2) + DEALLOCATE(Z_CR_CORR2) + DEALLOCATE(Z_CI_CORR2) + ! + ENDDO +ENDDO +! +!------------------------------------------------------------------------------- +! +!* 7. TOTAL TENDENCIES +! ---------------- +! +! Source at the end of microphysics = new state / PTSTEP +! +PTHS(:,:,:) = ZTHT(:,:,:) * ZINV_TSTEP +! +PRS(:,:,:,1) = ZRVT(:,:,:) *ZINV_TSTEP +IF ( KRR .GE. 2 ) PRS(:,:,:,2) = ZRCT(:,:,:) *ZINV_TSTEP +IF ( KRR .GE. 3 ) PRS(:,:,:,3) = ZRRT(:,:,:) *ZINV_TSTEP +IF ( KRR .GE. 4 ) PRS(:,:,:,4) = ZRIT(:,:,:) *ZINV_TSTEP +IF ( KRR .GE. 5 ) PRS(:,:,:,5) = ZRST(:,:,:) *ZINV_TSTEP +IF ( KRR .GE. 6 ) PRS(:,:,:,6) = ZRGT(:,:,:) *ZINV_TSTEP +IF ( KRR .GE. 7 ) PRS(:,:,:,7) = ZRHT(:,:,:) *ZINV_TSTEP +! +IF ( LWARM ) PSVS(:,:,:,NSV_LIMA_NC) = ZCCT(:,:,:) *ZINV_TSTEP +IF ( LWARM .AND. LRAIN ) PSVS(:,:,:,NSV_LIMA_NR) = ZCRT(:,:,:) *ZINV_TSTEP +IF ( LCOLD ) PSVS(:,:,:,NSV_LIMA_NI) = ZCIT(:,:,:) *ZINV_TSTEP +! +IF ( NMOD_CCN .GE. 1 ) PSVS(:,:,:,NSV_LIMA_CCN_FREE:NSV_LIMA_CCN_FREE+NMOD_CCN-1) = ZCCNFT(:,:,:,:) *ZINV_TSTEP +IF ( NMOD_CCN .GE. 1 ) PSVS(:,:,:,NSV_LIMA_CCN_ACTI:NSV_LIMA_CCN_ACTI+NMOD_CCN-1) = ZCCNAT(:,:,:,:) *ZINV_TSTEP +IF ( NMOD_IFN .GE. 1 ) PSVS(:,:,:,NSV_LIMA_IFN_FREE:NSV_LIMA_IFN_FREE+NMOD_IFN-1) = ZIFNFT(:,:,:,:) *ZINV_TSTEP +IF ( NMOD_IFN .GE. 1 ) PSVS(:,:,:,NSV_LIMA_IFN_NUCL:NSV_LIMA_IFN_NUCL+NMOD_IFN-1) = ZIFNNT(:,:,:,:) *ZINV_TSTEP +IF ( NMOD_IMM .GE. 1 ) PSVS(:,:,:,NSV_LIMA_IMM_NUCL:NSV_LIMA_IMM_NUCL+NMOD_IMM-1) = ZIMMNT(:,:,:,:) *ZINV_TSTEP +IF ( LCOLD .AND. LHHONI) PSVS(:,:,:,NSV_LIMA_HOM_HAZE) = ZHOMFT(:,:,:) *ZINV_TSTEP +! +! +! +! Call budgets +! +if ( lbu_enable ) then + allocate( zrhodjontstep(size( prhodj, 1), size( prhodj, 2), size( prhodj, 3) ) ) + zrhodjontstep(:, :, :) = zinv_tstep * prhodj(:, :, :) + + if ( lbudget_th ) then + call Budget_store_add( tbudgets(NBUDGET_TH), 'REVA', ztot_th_evap (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_TH), 'HONC', ztot_th_honc (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_TH), 'HONR', ztot_th_honr (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_TH), 'DEPS', ztot_th_deps (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_TH), 'DEPI', ztot_th_depi (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_TH), 'DEPG', ztot_th_depg (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_TH), 'IMLT', ztot_th_imlt (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_TH), 'BERFI', ztot_th_berfi(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_TH), 'RIM', ztot_th_rim (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_TH), 'ACC', ztot_th_acc (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_TH), 'CFRZ', ztot_th_cfrz (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_TH), 'WETG', ztot_th_wetg (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_TH), 'DRYG', ztot_th_dryg (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_TH), 'GMLT', ztot_th_gmlt (:, :, :) * zrhodjontstep(:, :, :) ) + end if + + if ( lbudget_rv ) then + call Budget_store_add( tbudgets(NBUDGET_RV), 'REVA', -ztot_rr_evap (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RV), 'DEPS', -ztot_rs_deps (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RV), 'DEPI', -ztot_ri_depi (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RV), 'DEPG', -ztot_rg_depg (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RV), 'CORR2', ztot_rv_corr2(:, :, :) * zrhodjontstep(:, :, :) ) + end if + + if ( lbudget_rc ) then + call Budget_store_add( tbudgets(NBUDGET_RC), 'AUTO', ztot_rc_auto (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RC), 'ACCR', ztot_rc_accr (:, :, :) * zrhodjontstep(:, :, :) ) + !call Budget_store_add( tbudgets(NBUDGET_RC), 'REVA', 0. ) + call Budget_store_add( tbudgets(NBUDGET_RC), 'HONC', ztot_rc_honc (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RC), 'IMLT', ztot_rc_imlt (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RC), 'BERFI', ztot_rc_berfi(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RC), 'RIM', ztot_rc_rim (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RC), 'WETG', ztot_rc_wetg (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RC), 'DRYG', ztot_rc_dryg (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RC), 'CVRC', -ztot_rr_cvrc (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RC), 'CORR2', ztot_rc_corr2(:, :, :) * zrhodjontstep(:, :, :) ) + end if + + if ( lbudget_rr ) then + call Budget_store_add( tbudgets(NBUDGET_RR), 'AUTO', -ztot_rc_auto(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RR), 'ACCR', -ztot_rc_accr(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RR), 'REVA', ztot_rr_evap(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RR), 'HONR', ztot_rr_honr(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RR), 'ACC', ztot_rr_acc (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RR), 'CFRZ', ztot_rr_cfrz(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RR), 'WETG', ztot_rr_wetg(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RR), 'DRYG', ztot_rr_dryg(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RR), 'GMLT', ztot_rr_gmlt(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RR), 'CVRC', ztot_rr_cvrc(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RR), 'CORR2', ztot_rr_corr2(:, :, :) * zrhodjontstep(:, :, :) ) + end if + + if ( lbudget_ri ) then + call Budget_store_add( tbudgets(NBUDGET_RI), 'HONC', -ztot_rc_honc (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RI), 'CNVI', ztot_ri_cnvi (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RI), 'CNVS', ztot_ri_cnvs (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RI), 'AGGS', ztot_ri_aggs (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RI), 'IMLT', -ztot_rc_imlt (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RI), 'BERFI', -ztot_rc_berfi(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RI), 'HMS', ztot_ri_hms (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RI), 'CFRZ', ztot_ri_cfrz (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RI), 'DEPI', ztot_ri_depi (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RI), 'WETG', ztot_ri_wetg (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RI), 'DRYG', ztot_ri_dryg (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RI), 'HMG', ztot_ri_hmg (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RI), 'CORR2', ztot_ri_corr2(:, :, :) * zrhodjontstep(:, :, :) ) + end if + + if ( lbudget_rs ) then + call Budget_store_add( tbudgets(NBUDGET_RS), 'CNVI', -ztot_ri_cnvi(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RS), 'DEPS', ztot_rs_deps(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RS), 'CNVS', -ztot_ri_cnvs(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RS), 'AGGS', -ztot_ri_aggs(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RS), 'RIM', ztot_rs_rim (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RS), 'HMS', ztot_rs_hms (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RS), 'ACC', ztot_rs_acc (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RS), 'CMEL', ztot_rs_cmel(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RS), 'WETG', ztot_rs_wetg(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RS), 'DRYG', ztot_rs_dryg(:, :, :) * zrhodjontstep(:, :, :) ) + end if + + if ( lbudget_rg ) then + call Budget_store_add( tbudgets(NBUDGET_RG), 'HONR', -ztot_rr_honr(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RG), 'DEPG', ztot_rg_depg(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RG), 'RIM', ztot_rg_rim (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RG), 'ACC', ztot_rg_acc (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RG), 'CMEL', -ztot_rs_cmel(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RG), 'CFRZ', ( -ztot_rr_cfrz(:, :, :) - ztot_ri_cfrz(:, :, :) ) & + * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RG), 'WETG', ztot_rg_wetg(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RG), 'DRYG', ztot_rg_dryg(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RG), 'HMG', ztot_rg_hmg (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(NBUDGET_RG), 'GMLT', -ztot_rr_gmlt(:, :, :) * zrhodjontstep(:, :, :) ) + end if + + if ( lbudget_rh ) then + call Budget_store_add( tbudgets(NBUDGET_RH), 'WETG', ztot_rh_wetg(:, :, :) * zrhodjontstep(:, :, :) ) + end if + + if ( lbudget_sv ) then + ! + ! Cloud droplets + ! + idx = NBUDGET_SV1 - 1 + nsv_lima_nc + call Budget_store_add( tbudgets(idx), 'SELF', ztot_cc_self (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(idx), 'AUTO', ztot_cc_auto (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(idx), 'ACCR', ztot_cc_accr (:, :, :) * zrhodjontstep(:, :, :) ) + !call Budget_store_add( tbudgets(idx), 'REVA', 0. ) + call Budget_store_add( tbudgets(idx), 'HONC', ztot_cc_honc (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(idx), 'IMLT', ztot_cc_imlt (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(idx), 'RIM', ztot_cc_rim (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(idx), 'WETG', ztot_cc_wetg (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(idx), 'DRYG', ztot_cc_dryg (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(idx), 'CVRC', -ztot_cr_cvrc (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(idx), 'CORR2', ztot_cc_corr2(:, :, :) * zrhodjontstep(:, :, :) ) + ! + ! Rain drops + ! + idx = NBUDGET_SV1 - 1 + nsv_lima_nr + call Budget_store_add( tbudgets(idx), 'AUTO', ztot_cr_auto(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(idx), 'SCBU', ztot_cr_scbu(:, :, :) * zrhodjontstep(:, :, :) ) + !call Budget_store_add( tbudgets(idx), 'REVA', 0. ) + call Budget_store_add( tbudgets(idx), 'BRKU', ztot_cr_brku(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(idx), 'HONR', ztot_cr_honr(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(idx), 'ACC', ztot_cr_acc (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(idx), 'CFRZ', ztot_cr_cfrz(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(idx), 'WETG', ztot_cr_wetg(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(idx), 'DRYG', ztot_cr_dryg(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(idx), 'GMLT', ztot_cr_gmlt(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(idx), 'CVRC', ztot_cr_cvrc(:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(idx), 'CORR2', ztot_cr_corr2(:, :, :) * zrhodjontstep(:, :, :) ) + ! + ! Ice crystals + ! + idx = NBUDGET_SV1 - 1 + nsv_lima_ni + call Budget_store_add( tbudgets(idx), 'HONC', -ztot_cc_honc (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(idx), 'CNVI', ztot_ci_cnvi (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(idx), 'CNVS', ztot_ci_cnvs (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(idx), 'AGGS', ztot_ci_aggs (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(idx), 'IMLT', -ztot_cc_imlt (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(idx), 'HMS', ztot_ci_hms (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(idx), 'CFRZ', ztot_ci_cfrz (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(idx), 'WETG', ztot_ci_wetg (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(idx), 'DRYG', ztot_ci_dryg (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(idx), 'HMG', ztot_ci_hmg (:, :, :) * zrhodjontstep(:, :, :) ) + call Budget_store_add( tbudgets(idx), 'CORR2', ztot_ci_corr2(:, :, :) * zrhodjontstep(:, :, :) ) + + do ii = 1, nmod_ifn + idx = nsv_lima_ifn_nucl + ii - 1 + call Budget_store_add( tbudgets(idx), 'IMLT', ztot_ifnn_imlt(:, :, :, ii) * zrhodjontstep(:, :, :) ) + end do + end if + + deallocate( zrhodjontstep ) +end if +! +END SUBROUTINE LIMA diff --git a/src/mesonh/micro/lima_adjust.f90 b/src/mesonh/micro/lima_adjust.f90 new file mode 100644 index 000000000..949fabf42 --- /dev/null +++ b/src/mesonh/micro/lima_adjust.f90 @@ -0,0 +1,1307 @@ +!MNH_LIC Copyright 2013-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ####################### + MODULE MODI_LIMA_ADJUST +! ####################### +! +INTERFACE +! + SUBROUTINE LIMA_ADJUST(KRR, KMI, TPFILE, & + OSUBG_COND, PTSTEP, & + PRHODREF, PRHODJ, PEXNREF, PPABSM, & + PPABST, & + PRT, PRS, PSVT, PSVS, & + PTHS, PSRCS, PCLDFR ) +! +USE MODD_IO, ONLY: TFILEDATA +USE MODD_NSV, only: NSV_LIMA_BEG +! +INTEGER, INTENT(IN) :: KRR ! Number of moist variables +INTEGER, INTENT(IN) :: KMI ! Model index +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +LOGICAL, INTENT(IN) :: OSUBG_COND ! Switch for Subgrid + ! Condensation +REAL, INTENT(IN) :: PTSTEP ! Time step +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Dry density of the + ! reference state +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! Absolute Pressure at t-dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! Absolute Pressure at t +! +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! m.r. at t +! +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRS ! m.r. source +! +REAL, DIMENSION(:,:,:,NSV_LIMA_BEG:), INTENT(IN) :: PSVT ! Concentrations at time t +! +REAL, DIMENSION(:,:,:,NSV_LIMA_BEG:), INTENT(INOUT) :: PSVS ! Concentration sources +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +! +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSRCS ! Second-order flux + ! s'rc'/2Sigma_s2 at time t+1 + ! multiplied by Lambda_3 +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCLDFR ! Cloud fraction +! +END SUBROUTINE LIMA_ADJUST +! +END INTERFACE +! +END MODULE MODI_LIMA_ADJUST +! +! ########################################################### + SUBROUTINE LIMA_ADJUST(KRR, KMI, TPFILE, & + OSUBG_COND, PTSTEP, & + PRHODREF, PRHODJ, PEXNREF, PPABSM, & + PPABST, & + PRT, PRS, PSVT, PSVS, & + PTHS, PSRCS, PCLDFR ) +! ########################################################### +! +!!**** *MIMA_ADJUST* - compute the fast microphysical sources +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the fast microphysical sources +!! through an explict scheme and a saturation ajustement procedure. +!! +!! +!!** METHOD +!! ------ +!! Reisin et al., 1996 for the explicit scheme when ice is present +!! Langlois, Tellus, 1973 for the implict adjustment for the cloud water +!! (refer also to book 1 of the documentation). +!! +!! Computations are done separately for three cases : +!! - ri>0 and rc=0 +!! - rc>0 and ri=0 +!! - ri>0 and rc>0 +!! +!! +!! EXTERNAL +!! -------- +!! None +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST +!! XP00 ! Reference pressure +!! XMD,XMV ! Molar mass of dry air and molar mass of vapor +!! XRD,XRV ! Gaz constant for dry air, gaz constant for vapor +!! XCPD,XCPV ! Cpd (dry air), Cpv (vapor) +!! XCL ! Cl (liquid) +!! XTT ! Triple point temperature +!! XLVTT ! Vaporization heat constant +!! XALPW,XBETAW,XGAMW ! Constants for saturation vapor +!! ! pressure function +!! Module MODD_CONF +!! CCONF +!! Module MODD_BUDGET: +!! NBUMOD +!! CBUTYPE +!! LBU_RTH +!! LBU_RRV +!! LBU_RRC +!! Module MODD_LES : NCTR_LES,LTURB_LES,NMODNBR_LES +!! XNA declaration (cloud fraction as global var) +!! +!! REFERENCE +!! --------- +!! +!! Book 1 and Book2 of documentation ( routine FAST_TERMS ) +!! Langlois, Tellus, 1973 +!! +!! AUTHOR +!! ------ +!! E. Richard * Laboratoire d'Aerologie* +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! C. Barthe * LACy* jan. 2014 add budgets +!! JP Chaboureau *LA* March 2014 fix the calculation of icy cloud fraction +! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 03/2020: use the new data structures and subroutines for budgets +! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg +! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 +! P. Wautelet 28/05/2020: bugfix: correct array start for PSVT and PSVS +! P. Wautelet 01/02/2021: bugfix: add missing CEDS source terms for SV budgets +! B. Vie 06/2020: fix PSRCS +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +use modd_budget, only: lbu_enable, nbumod, & + lbudget_th, lbudget_rv, lbudget_rc, lbudget_ri, lbudget_sv, & + NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, NBUDGET_RI, NBUDGET_SV1, & + tbudgets +USE MODD_CONF +USE MODD_CST +use modd_field, only: TFIELDDATA, TYPEREAL +USE MODD_IO, ONLY: TFILEDATA +USE MODD_LUNIT_n, ONLY: TLUOUT +USE MODD_NSV +USE MODD_PARAMETERS +USE MODD_PARAM_LIMA +USE MODD_PARAM_LIMA_COLD +USE MODD_PARAM_LIMA_MIXED +USE MODD_PARAM_LIMA_WARM +! +use mode_budget, only: Budget_store_init, Budget_store_end +USE MODE_IO_FIELD_WRITE, only: IO_Field_write +use mode_msg +use mode_tools, only: Countjv +! +USE MODI_CONDENS +USE MODI_CONDENSATION +USE MODI_LIMA_FUNCTIONS +USE MODI_LIMA_CCN_ACTIVATION +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +! +INTEGER, INTENT(IN) :: KRR ! Number of moist variables +INTEGER, INTENT(IN) :: KMI ! Model index +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +LOGICAL, INTENT(IN) :: OSUBG_COND ! Switch for Subgrid + ! Condensation +REAL, INTENT(IN) :: PTSTEP ! Time step +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Dry density of the + ! reference state +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! Absolute Pressure at t-dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! Absolute Pressure at t +! +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! m.r. at t +! +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRS ! m.r. source +! +REAL, DIMENSION(:,:,:,NSV_LIMA_BEG:), INTENT(IN) :: PSVT ! Concentrations at time t +! +REAL, DIMENSION(:,:,:,NSV_LIMA_BEG:), INTENT(INOUT) :: PSVS ! Concentration sources +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +! +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSRCS ! Second-order flux + ! s'rc'/2Sigma_s2 at time t+1 + ! multiplied by Lambda_3 +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCLDFR ! Cloud fraction +! +! +!* 0.2 Declarations of local variables : +! +! 3D Microphysical variables +REAL, DIMENSION(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3)) & + :: PRVT, & ! Water vapor m.r. at t + PRCT, & ! Cloud water m.r. at t + PRRT, & ! Rain water m.r. at t + PRIT, & ! Cloud ice m.r. at t + PRST, & ! Aggregate m.r. at t + PRGT, & ! Graupel m.r. at t +! + PRVS, & ! Water vapor m.r. source + PRCS, & ! Cloud water m.r. source + PRRS, & ! Rain water m.r. source + PRIS, & ! Cloud ice m.r. source + PRSS, & ! Aggregate m.r. source + PRGS, & ! Graupel m.r. source +! + PCCT, & ! Cloud water conc. at t + PCIT, & ! Cloud ice conc. at t +! + PCCS, & ! Cloud water C. source + PMAS, & ! Mass of scavenged AP + PCIS ! Ice crystal C. source +! +REAL, DIMENSION(:,:,:,:), ALLOCATABLE & + :: PNFS, & ! Free CCN C. source + PNAS, & ! Activated CCN C. source + PIFS, & ! Free IFN C. source + PINS, & ! Nucleated IFN C. source + PNIS ! Acti. IMM. nuclei C. source +! +! +! +REAL :: ZEPS ! Mv/Md +REAL :: ZDT ! Time increment (2*Delta t or Delta t if cold start) +REAL, DIMENSION(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3)) & + :: ZEXNS,& ! guess of the Exner function at t+1 + ZT, & ! guess of the temperature at t+1 + ZCPH, & ! guess of the CPh for the mixing + ZW, & + ZW1, & + ZW2, & + ZLV, & ! guess of the Lv at t+1 + ZLS, & ! guess of the Ls at t+1 + ZMASK +LOGICAL, DIMENSION(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3)) & + :: GMICRO, GMICRO_RI, GMICRO_RC ! Test where to compute cond/dep proc. +INTEGER :: IMICRO +REAL, DIMENSION(:), ALLOCATABLE & + :: ZRVT, ZRCT, ZRIT, ZRVS, ZRCS, ZRIS, ZTHS, & + ZCCT, ZCIT, ZCCS, ZCIS, & + ZRHODREF, ZZT, ZPRES, ZEXNREF, ZZCPH, & + ZZW, ZLVFACT, ZLSFACT, & + ZRVSATW, ZRVSATI, ZRVSATW_PRIME, ZRVSATI_PRIME, & + ZAW, ZAI, ZCJ, ZKA, ZDV, ZITW, ZITI, ZAWW, ZAIW, & + ZAWI, ZAII, ZFACT, ZDELTW, & + ZDELTI, ZDELT1, ZDELT2, ZCND, ZDEP, ZS, ZVEC1, ZZW2 +! +INTEGER, DIMENSION(:), ALLOCATABLE :: IVEC1 +! +INTEGER :: IRESP ! Return code of FM routines +INTEGER :: IIU,IJU,IKU! dimensions of dummy arrays +INTEGER :: IKB ! K index value of the first inner mass point +INTEGER :: IKE ! K index value of the last inner mass point +INTEGER :: IIB,IJB ! Horz index values of the first inner mass points +INTEGER :: IIE,IJE ! Horz index values of the last inner mass points +INTEGER :: JITER,ITERMAX ! iterative loop for first order adjustment +INTEGER :: ILUOUT ! Logical unit of output listing +! +INTEGER :: ISIZE +REAL, DIMENSION(:), ALLOCATABLE :: ZRTMIN +REAL, DIMENSION(:), ALLOCATABLE :: ZCTMIN +! +integer :: idx +INTEGER , DIMENSION(SIZE(GMICRO)) :: I1,I2,I3 ! Used to replace the COUNT +INTEGER :: JL ! and PACK intrinsics +INTEGER :: JMOD, JMOD_IFN, JMOD_IMM +! +INTEGER , DIMENSION(3) :: BV +TYPE(TFIELDDATA) :: TZFIELD +! +!------------------------------------------------------------------------------- +! +!* 1. PRELIMINARIES +! ------------- +! +ILUOUT = TLUOUT%NLU +! +IIU = SIZE(PEXNREF,1) +IJU = SIZE(PEXNREF,2) +IKU = SIZE(PEXNREF,3) +IIB = 1 + JPHEXT +IIE = SIZE(PRHODJ,1) - JPHEXT +IJB = 1 + JPHEXT +IJE = SIZE(PRHODJ,2) - JPHEXT +IKB = 1 + JPVEXT +IKE = SIZE(PRHODJ,3) - JPVEXT +! +ZEPS= XMV / XMD +! +IF (OSUBG_COND) THEN + ITERMAX=2 +ELSE + ITERMAX=1 +END IF +! +ZDT = PTSTEP +! +ISIZE = SIZE(XRTMIN) +ALLOCATE(ZRTMIN(ISIZE)) +ZRTMIN(:) = XRTMIN(:) / ZDT +ISIZE = SIZE(XCTMIN) +ALLOCATE(ZCTMIN(ISIZE)) +ZCTMIN(:) = XCTMIN(:) / ZDT +! +! Prepare 3D water mixing ratios +! +PRVT(:,:,:) = PRT(:,:,:,1) +PRVS(:,:,:) = PRS(:,:,:,1) +! +PRCT(:,:,:) = 0. +PRCS(:,:,:) = 0. +PRRT(:,:,:) = 0. +PRRS(:,:,:) = 0. +PRIT(:,:,:) = 0. +PRIS(:,:,:) = 0. +PRST(:,:,:) = 0. +PRSS(:,:,:) = 0. +PRGT(:,:,:) = 0. +PRGS(:,:,:) = 0. +! +IF ( KRR .GE. 2 ) PRCT(:,:,:) = PRT(:,:,:,2) +IF ( KRR .GE. 2 ) PRCS(:,:,:) = PRS(:,:,:,2) +IF ( KRR .GE. 3 ) PRRT(:,:,:) = PRT(:,:,:,3) +IF ( KRR .GE. 3 ) PRRS(:,:,:) = PRS(:,:,:,3) +IF ( KRR .GE. 4 ) PRIT(:,:,:) = PRT(:,:,:,4) +IF ( KRR .GE. 4 ) PRIS(:,:,:) = PRS(:,:,:,4) +IF ( KRR .GE. 5 ) PRST(:,:,:) = PRT(:,:,:,5) +IF ( KRR .GE. 5 ) PRSS(:,:,:) = PRS(:,:,:,5) +IF ( KRR .GE. 6 ) PRGT(:,:,:) = PRT(:,:,:,6) +IF ( KRR .GE. 6 ) PRGS(:,:,:) = PRS(:,:,:,6) +! +! Prepare 3D number concentrations +PCCT(:,:,:) = 0. +PCIT(:,:,:) = 0. +PCCS(:,:,:) = 0. +PCIS(:,:,:) = 0. +! +IF ( LWARM ) PCCT(:,:,:) = PSVT(:,:,:,NSV_LIMA_NC) +IF ( LCOLD ) PCIT(:,:,:) = PSVT(:,:,:,NSV_LIMA_NI) +! +IF ( LWARM ) PCCS(:,:,:) = PSVS(:,:,:,NSV_LIMA_NC) +IF ( LCOLD ) PCIS(:,:,:) = PSVS(:,:,:,NSV_LIMA_NI) +! +IF ( LSCAV .AND. LAERO_MASS ) PMAS(:,:,:) = PSVS(:,:,:,NSV_LIMA_SCAVMASS) +! +IF ( LWARM .AND. NMOD_CCN.GE.1 ) THEN + ALLOCATE( PNFS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),NMOD_CCN) ) + ALLOCATE( PNAS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),NMOD_CCN) ) + PNFS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_CCN_FREE:NSV_LIMA_CCN_FREE+NMOD_CCN-1) + PNAS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_CCN_ACTI:NSV_LIMA_CCN_ACTI+NMOD_CCN-1) +END IF +! +IF ( LCOLD .AND. NMOD_IFN .GE. 1 ) THEN + ALLOCATE( PIFS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),NMOD_IFN) ) + ALLOCATE( PINS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),NMOD_IFN) ) + PIFS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_IFN_FREE:NSV_LIMA_IFN_FREE+NMOD_IFN-1) + PINS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_IFN_NUCL:NSV_LIMA_IFN_NUCL+NMOD_IFN-1) +END IF +! +IF ( NMOD_IMM .GE. 1 ) THEN + ALLOCATE( PNIS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),NMOD_IMM) ) + PNIS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_IMM_NUCL:NSV_LIMA_IMM_NUCL+NMOD_IMM-1) +END IF + +if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'CEDS', pths(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rv ) call Budget_store_init( tbudgets(NBUDGET_RV), 'CEDS', prvs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'CEDS', prcs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), 'CEDS', pris(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_sv ) then + if ( lwarm ) & + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'CEDS', pccs(:, :, :) * prhodj(:, :, :) ) + if ( lcold ) & + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'CEDS', pcis(:, :, :) * prhodj(:, :, :) ) + if ( lscav .and. laero_mass ) & + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_scavmass), 'CEDS', pmas(:, :, :) * prhodj(:, :, :) ) + if ( lwarm ) then + do jl = 1, nmod_ccn + idx = NBUDGET_SV1 - 1 + nsv_lima_ccn_free - 1 + jl + call Budget_store_init( tbudgets(idx), 'CEDS', pnfs(:, :, :, jl) * prhodj(:, :, :) ) + idx = NBUDGET_SV1 - 1 + nsv_lima_ccn_acti - 1 + jl + call Budget_store_init( tbudgets(idx), 'CEDS', pnas(:, :, :, jl) * prhodj(:, :, :) ) + end do + end if + if ( lcold ) then + do jl = 1, nmod_ifn + idx = NBUDGET_SV1 - 1 + nsv_lima_ifn_free - 1 + jl + call Budget_store_init( tbudgets(idx), 'CEDS', pifs(:, :, :, jl) * prhodj(:, :, :) ) + idx = NBUDGET_SV1 - 1 + nsv_lima_ifn_nucl - 1 + jl + call Budget_store_init( tbudgets(idx), 'CEDS', pins(:, :, :, jl) * prhodj(:, :, :) ) + end do + do jl = 1, nmod_imm + idx = NBUDGET_SV1 - 1 + nsv_lima_imm_nucl - 1 + jl + call Budget_store_init( tbudgets(idx), 'CEDS', pnis(:, :, :, jl) * prhodj(:, :, :) ) + end do + end if + end if +end if + +!------------------------------------------------------------------------------- +! +! +!* 2. COMPUTE QUANTITIES WITH THE GUESS OF THE FUTURE INSTANT +! ------------------------------------------------------- +! +!* 2.1 remove negative non-precipitating negative water +! ------------------------------------------------ +! +IF (ANY(PRVS(:,:,:)+PRCS(:,:,:)+PRIS(:,:,:) < 0.) .AND. NVERB>5) THEN + WRITE(ILUOUT,*) 'LIMA_ADJUST: negative values of total water (reset to zero)' + WRITE(ILUOUT,*) ' location of minimum PRVS+PRCS+PRIS:',MINLOC(PRVS+PRCS+PRIS) + WRITE(ILUOUT,*) ' value of minimum PRVS+PRCS+PRIS:',MINVAL(PRVS+PRCS+PRIS) +END IF +! +WHERE ( PRVS(:,:,:)+PRCS(:,:,:)+PRIS(:,:,:) < 0.) + PRVS(:,:,:) = - PRCS(:,:,:) - PRIS(:,:,:) +END WHERE +! +!* 2.2 estimate the Exner function at t+1 +! +ZEXNS(:,:,:) = ( (2. * PPABST(:,:,:) - PPABSM(:,:,:)) / XP00 ) ** (XRD/XCPD) +! +! beginning of the iterative loop +! +DO JITER =1,ITERMAX +! +!* 2.3 compute the intermediate temperature at t+1, T* +! + ZT(:,:,:) = ( PTHS(:,:,:) * ZDT ) * ZEXNS(:,:,:) +! +!* 2.4 compute the specific heat for moist air (Cph) at t+1 +! + ZCPH(:,:,:) = XCPD + XCPV *ZDT* PRVS(:,:,:) & + + XCL *ZDT* ( PRCS(:,:,:) + PRRS(:,:,:) ) & + + XCI *ZDT* ( PRIS(:,:,:) + PRSS(:,:,:) + PRGS(:,:,:) ) +! +!* 2.5 compute the latent heat of vaporization Lv(T*) at t+1 +! and of sublimation Ls(T*) at t+1 +! + ZLV(:,:,:) = XLVTT + ( XCPV - XCL ) * ( ZT(:,:,:) -XTT ) + ZLS(:,:,:) = XLSTT + ( XCPV - XCI ) * ( ZT(:,:,:) -XTT ) +! +! +!------------------------------------------------------------------------------- +! +!* 3. FIRST ORDER SUBGRID CONDENSATION SCHEME +! --------------------------------------- +! + IF ( OSUBG_COND ) THEN + call Print_msg( NVERB_FATAL, 'GEN', 'LIMA_ADJUST', 'OSUBG_COND=.true. not yet developed' ) + ELSE +! +!------------------------------------------------------------------------------- +! +! +!* 4. FULLY EXPLICIT SCHEME FROM TZIVION et al. (1989) +! ----------------------------------------------- +! +!* select cases where r_i>0 and r_c=0 +! +GMICRO(:,:,:) = .FALSE. +GMICRO(IIB:IIE,IJB:IJE,IKB:IKE) = & + (PRIS(IIB:IIE,IJB:IJE,IKB:IKE)>ZRTMIN(4) .AND. & + PCIS(IIB:IIE,IJB:IJE,IKB:IKE)>ZCTMIN(4) ) & + .AND. .NOT. (PRCS(IIB:IIE,IJB:IJE,IKB:IKE)>ZRTMIN(2) .AND. & + PCCS(IIB:IIE,IJB:IJE,IKB:IKE)>ZCTMIN(2) ) +GMICRO_RI(:,:,:) = GMICRO(:,:,:) +IMICRO = COUNTJV( GMICRO(:,:,:),I1(:),I2(:),I3(:)) +IF( IMICRO >= 1 ) THEN + ALLOCATE(ZRVT(IMICRO)) + ALLOCATE(ZRIT(IMICRO)) + ALLOCATE(ZCIT(IMICRO)) +! + ALLOCATE(ZRVS(IMICRO)) + ALLOCATE(ZRIS(IMICRO)) + ALLOCATE(ZCIS(IMICRO)) !!!BVIE!!! + ALLOCATE(ZTHS(IMICRO)) +! + ALLOCATE(ZRHODREF(IMICRO)) + ALLOCATE(ZZT(IMICRO)) + ALLOCATE(ZPRES(IMICRO)) + ALLOCATE(ZEXNREF(IMICRO)) + ALLOCATE(ZZCPH(IMICRO)) + DO JL=1,IMICRO + ZRVT(JL) = PRVT(I1(JL),I2(JL),I3(JL)) + ZRIT(JL) = PRIT(I1(JL),I2(JL),I3(JL)) + ZCIT(JL) = PCIT(I1(JL),I2(JL),I3(JL)) +! + ZRVS(JL) = PRVS(I1(JL),I2(JL),I3(JL)) + ZRIS(JL) = PRIS(I1(JL),I2(JL),I3(JL)) + ZCIS(JL) = PCIS(I1(JL),I2(JL),I3(JL)) !!!BVIE!!! + ZTHS(JL) = PTHS(I1(JL),I2(JL),I3(JL)) +! + ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) + ZZT(JL) = ZT(I1(JL),I2(JL),I3(JL)) + ZPRES(JL) = 2.0*PPABST(I1(JL),I2(JL),I3(JL))-PPABSM(I1(JL),I2(JL),I3(JL)) + ZEXNREF(JL) = PEXNREF(I1(JL),I2(JL),I3(JL)) + ZZCPH(JL) = ZCPH(I1(JL),I2(JL),I3(JL)) + ENDDO + ALLOCATE(ZZW(IMICRO)) + ALLOCATE(ZLSFACT(IMICRO)) + ZLSFACT(:) = (XLSTT+(XCPV-XCI)*(ZZT(:)-XTT))/ZZCPH(:) ! L_s/C_ph + ALLOCATE(ZRVSATI(IMICRO)) + ALLOCATE(ZRVSATI_PRIME(IMICRO)) + ALLOCATE(ZDELTI(IMICRO)) + ALLOCATE(ZAI(IMICRO)) + ALLOCATE(ZCJ(IMICRO)) + ALLOCATE(ZKA(IMICRO)) + ALLOCATE(ZDV(IMICRO)) + ALLOCATE(ZITI(IMICRO)) +! + ZKA(:) = 2.38E-2 + 0.0071E-2 * ( ZZT(:) - XTT ) ! k_a + ZDV(:) = 0.211E-4 * (ZZT(:)/XTT)**1.94 * (XP00/ZPRES(:)) ! D_v + ZCJ(:) = XSCFAC * ZRHODREF(:)**0.3 / SQRT( 1.718E-5+0.0049E-5*(ZZT(:)-XTT) ) +! + ZZW(:) = EXP( XALPI - XBETAI/ZZT(:) - XGAMI*ALOG(ZZT(:) ) ) ! es_i + ZRVSATI(:) = ZEPS*ZZW(:) / ( ZPRES(:)-ZZW(:) ) ! r_si + ZRVSATI_PRIME(:) = (( XBETAI/ZZT(:) - XGAMI ) / ZZT(:)) & ! r'_si + * ZRVSATI(:) * ( 1. + ZRVSATI(:)/ZEPS ) +! + ZDELTI(:) = ZRVS(:)*ZDT - ZRVSATI(:) + ZAI(:) = ( XLSTT + (XCPV-XCI)*(ZZT(:)-XTT) )**2 / (ZKA(:)*XRV*ZZT(:)**2) & + + ( XRV*ZZT(:) ) / (ZDV(:)*ZZW(:)) + ZZW(:) = MIN(1.E8,( XLBI* MAX(ZCIT(:),XCTMIN(4)) & + /(MAX(ZRIT(:),XRTMIN(4))) )**XLBEXI) + ! Lbda_I + ZITI(:) = ZCIT(:) * (X0DEPI/ZZW(:) + X2DEPI*ZCJ(:)*ZCJ(:)/ZZW(:)**(XDI+2.0)) & + / (ZRVSATI(:)*ZAI(:)) +! + ALLOCATE(ZAII(IMICRO)) + ALLOCATE(ZDEP(IMICRO)) +! + ZAII(:) = 1.0 + ZRVSATI_PRIME(:)*ZLSFACT(:) + ZDEP(:) = 0.0 +! + ZZW(:) = ZAII(:)*ZITI(:)*ZDT ! R*delta_T + WHERE( ZZW(:)<1.0E-2 ) + ZDEP(:) = ZITI(:)*ZDELTI(:)*(1.0 - (ZZW(:)/2.0)*(1.0-ZZW(:)/3.0)) + ELSEWHERE + ZDEP(:) = ZITI(:)*ZDELTI(:)*(1.0 - EXP(-ZZW(:)))/ZZW(:) + END WHERE +! +! Integration +! + WHERE( ZDEP(:) < 0.0 ) + ZDEP(:) = MAX ( ZDEP(:), -ZRIS(:) ) + ELSEWHERE + ZDEP(:) = MIN ( ZDEP(:), ZRVS(:) ) +! ZDEP(:) = MIN ( ZDEP(:), ZCIS(:)*5.E-10 ) !!!BVIE!!! + END WHERE + WHERE( ZRIS(:) < ZRTMIN(4) ) + ZDEP(:) = 0.0 + END WHERE + ZRVS(:) = ZRVS(:) - ZDEP(:) + ZRIS(:) = ZRIS(:) + ZDEP(:) + ZTHS(:) = ZTHS(:) + ZDEP(:) * ZLSFACT(:) / ZEXNREF(:) +! +! Implicit ice crystal sublimation if ice saturated conditions are not met +! + ZZT(:) = ( ZTHS(:) * ZDT ) * ( ZPRES(:) / XP00 ) ** (XRD/XCPD) + ZZW(:) = EXP( XALPI - XBETAI/ZZT(:) - XGAMI*ALOG(ZZT(:) ) ) ! es_i + ZRVSATI(:) = ZEPS*ZZW(:) / ( ZPRES(:)-ZZW(:) ) ! r_si + WHERE( ZRVS(:)*ZDT<ZRVSATI(:) ) + ZZW(:) = ZRVS(:) + ZRIS(:) + ZRVS(:) = MIN( ZZW(:),ZRVSATI(:)/ZDT ) + ZTHS(:) = ZTHS(:) + ( MAX( 0.0,ZZW(:)-ZRVS(:) )-ZRIS(:) ) & + * ZLSFACT(:) / ZEXNREF(:) + ZRIS(:) = MAX( 0.0,ZZW(:)-ZRVS(:) ) + END WHERE +! +! + ZW(:,:,:) = PRVS(:,:,:) + PRVS(:,:,:) = UNPACK( ZRVS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PRIS(:,:,:) + PRIS(:,:,:) = UNPACK( ZRIS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PTHS(:,:,:) + PTHS(:,:,:) = UNPACK( ZTHS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) +! + DEALLOCATE(ZRVT) + DEALLOCATE(ZRIT) + DEALLOCATE(ZCIT) + DEALLOCATE(ZRVS) + DEALLOCATE(ZRIS) + DEALLOCATE(ZCIS) !!!BVIE!!! + DEALLOCATE(ZTHS) + DEALLOCATE(ZRHODREF) + DEALLOCATE(ZZT) + DEALLOCATE(ZPRES) + DEALLOCATE(ZEXNREF) + DEALLOCATE(ZZCPH) + DEALLOCATE(ZZW) + DEALLOCATE(ZLSFACT) + DEALLOCATE(ZRVSATI) + DEALLOCATE(ZRVSATI_PRIME) + DEALLOCATE(ZDELTI) + DEALLOCATE(ZAI) + DEALLOCATE(ZCJ) + DEALLOCATE(ZKA) + DEALLOCATE(ZDV) + DEALLOCATE(ZITI) + DEALLOCATE(ZAII) + DEALLOCATE(ZDEP) +END IF ! IMICRO +! +! +!------------------------------------------------------------------------------- +! +! +!* 5. FULLY IMPLICIT CONDENSATION SCHEME +! --------------------------------- +! +!* select cases where r_c>0 and r_i=0 +! +! +GMICRO(:,:,:) = .FALSE. +GMICRO(IIB:IIE,IJB:IJE,IKB:IKE) =( PRCS(IIB:IIE,IJB:IJE,IKB:IKE)>0. .AND. & + PCCS(IIB:IIE,IJB:IJE,IKB:IKE)>0. ) .AND. & + .NOT.GMICRO_RI(IIB:IIE,IJB:IJE,IKB:IKE) +GMICRO_RC(:,:,:) = GMICRO(:,:,:) +IMICRO = COUNTJV( GMICRO(:,:,:),I1(:),I2(:),I3(:)) +IF( IMICRO >= 1 ) THEN + ALLOCATE(ZRVT(IMICRO)) + ALLOCATE(ZRCT(IMICRO)) +! + ALLOCATE(ZRVS(IMICRO)) + ALLOCATE(ZRCS(IMICRO)) + ALLOCATE(ZCCS(IMICRO)) + ALLOCATE(ZTHS(IMICRO)) +! + ALLOCATE(ZRHODREF(IMICRO)) + ALLOCATE(ZZT(IMICRO)) + ALLOCATE(ZPRES(IMICRO)) + ALLOCATE(ZEXNREF(IMICRO)) + ALLOCATE(ZZCPH(IMICRO)) + DO JL=1,IMICRO + ZRVT(JL) = PRVT(I1(JL),I2(JL),I3(JL)) + ZRCT(JL) = PRCT(I1(JL),I2(JL),I3(JL)) +! + ZRVS(JL) = PRVS(I1(JL),I2(JL),I3(JL)) + ZRCS(JL) = PRCS(I1(JL),I2(JL),I3(JL)) + ZCCS(JL) = PCCS(I1(JL),I2(JL),I3(JL)) + ZTHS(JL) = PTHS(I1(JL),I2(JL),I3(JL)) +! + ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) + ZZT(JL) = ZT(I1(JL),I2(JL),I3(JL)) + ZPRES(JL) = 2.0*PPABST(I1(JL),I2(JL),I3(JL))-PPABSM(I1(JL),I2(JL),I3(JL)) + ZEXNREF(JL) = PEXNREF(I1(JL),I2(JL),I3(JL)) + ZZCPH(JL) = ZCPH(I1(JL),I2(JL),I3(JL)) + ENDDO + ALLOCATE(ZZW(IMICRO)) + ALLOCATE(ZLVFACT(IMICRO)) + ALLOCATE(ZCND(IMICRO)) + ALLOCATE(ZRVSATW(IMICRO)) + ZLVFACT(:) = (XLVTT+(XCPV-XCL)*(ZZT(:)-XTT))/ZZCPH(:) ! L_v/C_ph + ZZW(:) = EXP( XALPW - XBETAW/ZZT(:) - XGAMW*ALOG(ZZT(:) ) ) ! es_w + ZRVSATW(:) = ZEPS*ZZW(:) / ( ZPRES(:)-ZZW(:) ) ! r_sw + + IF (LADJ) THEN + ALLOCATE(ZRVSATW_PRIME(IMICRO)) + ALLOCATE(ZAWW(IMICRO)) + ALLOCATE(ZDELT1(IMICRO)) + ALLOCATE(ZDELT2(IMICRO)) + ZRVSATW_PRIME(:) = (( XBETAW/ZZT(:) - XGAMW ) / ZZT(:)) & ! r'_sw + * ZRVSATW(:) * ( 1. + ZRVSATW(:)/ZEPS ) + ZAWW(:) = 1.0 + ZRVSATW_PRIME(:)*ZLVFACT(:) + ZDELT2(:) = (ZRVSATW_PRIME(:)*ZLVFACT(:)/ZAWW(:)) * & + ( ((-2.*XBETAW+XGAMW*ZZT(:))/(XBETAW-XGAMW*ZZT(:)) & + + (XBETAW/ZZT(:)-XGAMW)*(1.0+2.0*ZRVSATW(:)/ZEPS))/ZZT(:) ) + ZDELT1(:) = (ZLVFACT(:)/ZAWW(:)) * ( ZRVSATW(:) - ZRVS(:)*ZDT ) + ZCND(:) = - ZDELT1(:)*( 1.0 + 0.5*ZDELT1(:)*ZDELT2(:) ) / (ZLVFACT(:)*ZDT) + DEALLOCATE(ZRVSATW_PRIME) + DEALLOCATE(ZAWW) + DEALLOCATE(ZDELT1) + DEALLOCATE(ZDELT2) + ELSE + ALLOCATE(ZS(IMICRO)) + ALLOCATE(ZZW2(IMICRO)) + ALLOCATE(ZVEC1(IMICRO)) + ALLOCATE(IVEC1(IMICRO)) + ZVEC1(:) = MAX( 1.0001, MIN( FLOAT(NAHEN)-0.0001, XAHENINTP1 * ZZT(:) + XAHENINTP2 ) ) + IVEC1(:) = INT( ZVEC1(:) ) + ZVEC1(:) = ZVEC1(:) - FLOAT( IVEC1(:) ) + ZS(:) = ZRVS(:)*PTSTEP / ZRVSATW(:) - 1. + ZZW(:) = ZCCS(:)*PTSTEP/(XLBC*ZCCS(:)/ZRCS(:))**XLBEXC + ZZW2(:) = XAHENG3(IVEC1(:)+1)*ZVEC1(:)-XAHENG3(IVEC1(:))*(ZVEC1(:)-1.) + ZCND(:) = 2.*3.14*1000.*ZZW2(:)*ZS(:)*ZZW(:) + DEALLOCATE(ZS) + DEALLOCATE(ZZW2) + DEALLOCATE(ZVEC1) + DEALLOCATE(IVEC1) + END IF + +! +! Integration +! + WHERE( ZCND(:) < 0.0 ) + ZCND(:) = MAX ( ZCND(:), -ZRCS(:) ) + ELSEWHERE + ZCND(:) = MIN ( ZCND(:), ZRVS(:) ) + END WHERE + ZRVS(:) = ZRVS(:) - ZCND(:) + ZRCS(:) = ZRCS(:) + ZCND(:) + ZTHS(:) = ZTHS(:) + ZCND(:) * ZLVFACT(:) / ZEXNREF(:) +! + ZW(:,:,:) = PRVS(:,:,:) + PRVS(:,:,:) = UNPACK( ZRVS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PRCS(:,:,:) + PRCS(:,:,:) = UNPACK( ZRCS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PTHS(:,:,:) + PTHS(:,:,:) = UNPACK( ZTHS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) +! + DEALLOCATE(ZRVT) + DEALLOCATE(ZRCT) + DEALLOCATE(ZRVS) + DEALLOCATE(ZRCS) + DEALLOCATE(ZCCS) + DEALLOCATE(ZTHS) + DEALLOCATE(ZRHODREF) + DEALLOCATE(ZZT) + DEALLOCATE(ZPRES) + DEALLOCATE(ZEXNREF) + DEALLOCATE(ZZCPH) + DEALLOCATE(ZZW) + DEALLOCATE(ZLVFACT) + DEALLOCATE(ZRVSATW) + DEALLOCATE(ZCND) +END IF ! IMICRO +! +! +!------------------------------------------------------------------------------- +! +! +!* 6. IMPLICIT-EXPLICIT SCHEME USING REISIN et al. (1996) +! --------------------------------------------------- +! +!* select cases where r_i>0 and r_c>0 (supercooled water) +! +! +GMICRO(IIB:IIE,IJB:IJE,IKB:IKE) = & + .NOT. GMICRO_RI(IIB:IIE,IJB:IJE,IKB:IKE) & + .AND. .NOT. GMICRO_RC(IIB:IIE,IJB:IJE,IKB:IKE) & + .AND. ( PRIS(IIB:IIE,IJB:IJE,IKB:IKE)>ZRTMIN(4) .AND. & + PCIS(IIB:IIE,IJB:IJE,IKB:IKE)>ZCTMIN(4) ) & + .AND. ( PRCS(IIB:IIE,IJB:IJE,IKB:IKE)>ZRTMIN(2) .AND. & + PCCS(IIB:IIE,IJB:IJE,IKB:IKE)>ZCTMIN(2) ) +IMICRO = COUNTJV( GMICRO(:,:,:),I1(:),I2(:),I3(:)) +IF( IMICRO >= 1 ) THEN + ALLOCATE(ZRVT(IMICRO)) + ALLOCATE(ZRCT(IMICRO)) + ALLOCATE(ZRIT(IMICRO)) + ALLOCATE(ZCCT(IMICRO)) + ALLOCATE(ZCIT(IMICRO)) +! + ALLOCATE(ZRVS(IMICRO)) + ALLOCATE(ZRCS(IMICRO)) + ALLOCATE(ZRIS(IMICRO)) + ALLOCATE(ZCCS(IMICRO)) + ALLOCATE(ZCIS(IMICRO)) + ALLOCATE(ZTHS(IMICRO)) +! + ALLOCATE(ZRHODREF(IMICRO)) + ALLOCATE(ZZT(IMICRO)) + ALLOCATE(ZPRES(IMICRO)) + ALLOCATE(ZEXNREF(IMICRO)) + ALLOCATE(ZZCPH(IMICRO)) + DO JL=1,IMICRO + ZRVT(JL) = PRVT(I1(JL),I2(JL),I3(JL)) + ZRCT(JL) = PRCT(I1(JL),I2(JL),I3(JL)) + ZRIT(JL) = PRIT(I1(JL),I2(JL),I3(JL)) + ZCCT(JL) = PCCT(I1(JL),I2(JL),I3(JL)) + ZCIT(JL) = PCIT(I1(JL),I2(JL),I3(JL)) +! + ZRVS(JL) = PRVS(I1(JL),I2(JL),I3(JL)) + ZRCS(JL) = PRCS(I1(JL),I2(JL),I3(JL)) + ZRIS(JL) = PRIS(I1(JL),I2(JL),I3(JL)) + ZCCS(JL) = PCCS(I1(JL),I2(JL),I3(JL)) + ZCIS(JL) = PCIS(I1(JL),I2(JL),I3(JL)) + ZTHS(JL) = PTHS(I1(JL),I2(JL),I3(JL)) +! + ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) + ZZT(JL) = ZT(I1(JL),I2(JL),I3(JL)) + ZPRES(JL) = 2.0*PPABST(I1(JL),I2(JL),I3(JL))-PPABSM(I1(JL),I2(JL),I3(JL)) + ZEXNREF(JL) = PEXNREF(I1(JL),I2(JL),I3(JL)) + ZZCPH(JL) = ZCPH(I1(JL),I2(JL),I3(JL)) + ENDDO + ALLOCATE(ZZW(IMICRO)) + ALLOCATE(ZLVFACT(IMICRO)) + ALLOCATE(ZLSFACT(IMICRO)) + ZLVFACT(:) = (XLVTT+(XCPV-XCL)*(ZZT(:)-XTT))/ZZCPH(:) ! L_v/C_ph + ZLSFACT(:) = (XLSTT+(XCPV-XCI)*(ZZT(:)-XTT))/ZZCPH(:) ! L_s/C_ph + ALLOCATE(ZRVSATW(IMICRO)) + ALLOCATE(ZRVSATI(IMICRO)) + ALLOCATE(ZRVSATW_PRIME(IMICRO)) + ALLOCATE(ZRVSATI_PRIME(IMICRO)) + ALLOCATE(ZDELTW(IMICRO)) + ALLOCATE(ZDELTI(IMICRO)) + ALLOCATE(ZAW(IMICRO)) + ALLOCATE(ZAI(IMICRO)) + ALLOCATE(ZCJ(IMICRO)) + ALLOCATE(ZKA(IMICRO)) + ALLOCATE(ZDV(IMICRO)) + ALLOCATE(ZITW(IMICRO)) + ALLOCATE(ZITI(IMICRO)) +! + ZKA(:) = 2.38E-2 + 0.0071E-2 * ( ZZT(:) - XTT ) ! k_a + ZDV(:) = 0.211E-4 * (ZZT(:)/XTT)**1.94 * (XP00/ZPRES(:)) ! D_v + ZCJ(:) = XSCFAC * ZRHODREF(:)**0.3 / SQRT( 1.718E-5+0.0049E-5*(ZZT(:)-XTT) ) +! +!* 6.2 implicit adjustment at water saturation +! + ZZW(:) = EXP( XALPW - XBETAW/ZZT(:) - XGAMW*ALOG(ZZT(:) ) ) ! es_w + ZRVSATW(:) = ZEPS*ZZW(:) / ( ZPRES(:)-ZZW(:) ) ! r_sw + ZRVSATW_PRIME(:) = (( XBETAW/ZZT(:) - XGAMW ) / ZZT(:)) & ! r'_sw + * ZRVSATW(:) * ( 1. + ZRVSATW(:)/ZEPS ) + ZDELTW(:) = ABS( ZRVS(:)*ZDT - ZRVSATW(:) ) + ZAW(:) = ( XLSTT + (XCPV-XCL)*(ZZT(:)-XTT) )**2 / (ZKA(:)*XRV*ZZT(:)**2) & + + ( XRV*ZZT(:) ) / (ZDV(:)*ZZW(:)) + ZZW(:) = EXP( XALPI - XBETAI/ZZT(:) - XGAMI*ALOG(ZZT(:) ) ) ! es_i + ZRVSATI(:) = ZEPS*ZZW(:) / ( ZPRES(:)-ZZW(:) ) ! r_si + ZRVSATI_PRIME(:) = (( XBETAI/ZZT(:) - XGAMI ) / ZZT(:)) & ! r'_si + * ZRVSATI(:) * ( 1. + ZRVSATI(:)/ZEPS ) + ZDELTI(:) = ABS( ZRVS(:)*ZDT - ZRVSATI(:) ) + ZAI(:) = ( XLSTT + (XCPV-XCI)*(ZZT(:)-XTT) )**2 / (ZKA(:)*XRV*ZZT(:)**2) & + + ( XRV*ZZT(:) ) / (ZDV(:)*ZZW(:)) +! + ZZW(:) = MIN(1.E8,( XLBC* MAX(ZCCT(:),XCTMIN(2)) & + /(MAX(ZRCT(:),XRTMIN(2))) )**XLBEXC) + ! Lbda_c + ZITW(:) = ZCCT(:) * (X0CNDC/ZZW(:) + X2CNDC*ZCJ(:)*ZCJ(:)/ZZW(:)**(XDC+2.0)) & + / (ZRVSATW(:)*ZAW(:)) + ZZW(:) = MIN(1.E8,( XLBI* MAX(ZCIT(:),XCTMIN(4)) & + /(MAX(ZRIT(:),XRTMIN(4))) )**XLBEXI) + ! Lbda_I + ZITI(:) = ZCIT(:) * (X0DEPI/ZZW(:) + X2DEPI*ZCJ(:)*ZCJ(:)/ZZW(:)**(XDI+2.0)) & + / (ZRVSATI(:)*ZAI(:)) +! + ALLOCATE(ZAWW(IMICRO)) + ALLOCATE(ZAIW(IMICRO)) + ALLOCATE(ZAWI(IMICRO)) + ALLOCATE(ZAII(IMICRO)) +! + ALLOCATE(ZFACT(IMICRO)) + ALLOCATE(ZDELT1(IMICRO)) + ALLOCATE(ZDELT2(IMICRO)) +! + ZAII(:) = ZITI(:)*ZDELTI(:) + WHERE( ZAII(:)<1.0E-15 ) + ZFACT(:) = ZLVFACT(:) + ELSEWHERE + ZFACT(:) = (ZLVFACT(:)*ZITW(:)*ZDELTW(:)+ZLSFACT(:)*ZITI(:)*ZDELTI(:)) & + / (ZITW(:)*ZDELTW(:)+ZITI(:)*ZDELTI(:)) + END WHERE + ZAWW(:) = 1.0 + ZRVSATW_PRIME(:)*ZFACT(:) +! + ZDELT2(:) = (ZRVSATW_PRIME(:)*ZFACT(:)/ZAWW(:)) * & + ( ((-2.*XBETAW+XGAMW*ZZT(:))/(XBETAW-XGAMW*ZZT(:)) & + + (XBETAW/ZZT(:)-XGAMW)*(1.0+2.0*ZRVSATW(:)/ZEPS))/ZZT(:) ) + ZDELT1(:) = (ZFACT(:)/ZAWW(:)) * ( ZRVSATW(:) - ZRVS(:)*ZDT ) +! + ALLOCATE(ZCND(IMICRO)) + ALLOCATE(ZDEP(IMICRO)) + ZCND(:) = 0.0 + ZDEP(:) = 0.0 +! + ZZW(:) = - ZDELT1(:)*( 1.0 + 0.5*ZDELT1(:)*ZDELT2(:) ) / (ZFACT(:)*ZDT) + WHERE( ZAII(:)<1.0E-15 ) + ZCND(:) = ZZW(:) + ZDEP(:) = 0.0 + ELSEWHERE + ZCND(:) = ZZW(:)*ZITW(:)*ZDELTW(:) / (ZITW(:)*ZDELTW(:)+ZITI(:)*ZDELTI(:)) + ZDEP(:) = ZZW(:)*ZITI(:)*ZDELTI(:) / (ZITW(:)*ZDELTW(:)+ZITI(:)*ZDELTI(:)) + END WHERE +! +! Integration +! + WHERE( ZCND(:) < 0.0 ) + ZCND(:) = MAX ( ZCND(:), -ZRCS(:) ) + ELSEWHERE + ZCND(:) = MIN ( ZCND(:), ZRVS(:) ) + END WHERE + ZRVS(:) = ZRVS(:) - ZCND(:) + ZRCS(:) = ZRCS(:) + ZCND(:) + ZTHS(:) = ZTHS(:) + ZCND(:) * ZLVFACT(:) / ZEXNREF(:) +! + WHERE( ZDEP(:) < 0.0 ) + ZDEP(:) = MAX ( ZDEP(:), -ZRIS(:) ) + ELSEWHERE + ZDEP(:) = MIN ( ZDEP(:), ZRVS(:) ) + END WHERE + ZRVS(:) = ZRVS(:) - ZDEP(:) + ZRIS(:) = ZRIS(:) + ZDEP(:) + ZTHS(:) = ZTHS(:) + ZDEP(:) * ZLSFACT(:) / ZEXNREF(:) +! +!* 6.3 explicit integration of the final eva/dep rates +! + ZZT(:) = ( ZTHS(:) * ZDT ) * ( ZPRES(:) / XP00 ) ** (XRD/XCPD) + ZZW(:) = EXP( XALPI - XBETAI/ZZT(:) - XGAMI*ALOG(ZZT(:) ) ) ! es_i + ZRVSATI(:) = ZEPS*ZZW(:) / ( ZPRES(:)-ZZW(:) ) ! r_si +! +! If Si < 0, implicit adjustment to Si=0 using ice only +! + WHERE( ZRVS(:)*ZDT<ZRVSATI(:) ) + ZZW(:) = ZRVS(:) + ZRIS(:) + ZRVS(:) = MIN( ZZW(:),ZRVSATI(:)/ZDT ) + ZTHS(:) = ZTHS(:) + ( MAX( 0.0,ZZW(:)-ZRVS(:) )-ZRIS(:) ) & + * ZLSFACT(:) / ZEXNREF(:) + ZRIS(:) = MAX( 0.0,ZZW(:)-ZRVS(:) ) + END WHERE +! +! Following the previous adjustment, the real procedure begins +! + ZZT(:) = ( ZTHS(:) * ZDT ) * ( ZPRES(:) / XP00 ) ** (XRD/XCPD) +! + ZLVFACT(:) = (XLVTT+(XCPV-XCL)*(ZZT(:)-XTT))/ZZCPH(:) ! L_v/C_ph + ZLSFACT(:) = (XLSTT+(XCPV-XCI)*(ZZT(:)-XTT))/ZZCPH(:) ! L_s/C_ph +! + ZKA(:) = 2.38E-2 + 0.0071E-2 * ( ZZT(:) - XTT ) ! k_a + ZDV(:) = 0.211E-4 * (ZZT(:)/XTT)**1.94 * (XP00/ZPRES(:)) ! D_v + ZCJ(:) = XSCFAC * ZRHODREF(:)**0.3 / SQRT( 1.718E-5+0.0049E-5*(ZZT(:)-XTT) ) +! + ZZW(:) = EXP( XALPW - XBETAW/ZZT(:) - XGAMW*ALOG(ZZT(:) ) ) ! es_w + ZRVSATW(:) = ZEPS*ZZW(:) / ( ZPRES(:)-ZZW(:) ) ! r_sw + ZRVSATW_PRIME(:) = (( XBETAW/ZZT(:) - XGAMW ) / ZZT(:)) & ! r'_sw + * ZRVSATW(:) * ( 1. + ZRVSATW(:)/ZEPS ) + ZDELTW(:) = ZRVS(:)*ZDT - ZRVSATW(:) + ZAW(:) = ( XLSTT + (XCPV-XCL)*(ZZT(:)-XTT) )**2 / (ZKA(:)*XRV*ZZT(:)**2) & + + ( XRV*ZZT(:) ) / (ZDV(:)*ZZW(:)) +! + ZZW(:) = EXP( XALPI - XBETAI/ZZT(:) - XGAMI*ALOG(ZZT(:) ) ) ! es_i + ZRVSATI(:) = ZEPS*ZZW(:) / ( ZPRES(:)-ZZW(:) ) ! r_si + ZRVSATI_PRIME(:) = (( XBETAI/ZZT(:) - XGAMI ) / ZZT(:)) & ! r'_si + * ZRVSATI(:) * ( 1. + ZRVSATI(:)/ZEPS ) + ZDELTI(:) = ZRVS(:)*ZDT - ZRVSATI(:) + ZAI(:) = ( XLSTT + (XCPV-XCI)*(ZZT(:)-XTT) )**2 / (ZKA(:)*XRV*ZZT(:)**2) & + + ( XRV*ZZT(:) ) / (ZDV(:)*ZZW(:)) +! + ZZW(:) = MIN(1.E8,( XLBC* MAX(ZCCS(:),ZCTMIN(2)) & + /(MAX(ZRCS(:),ZRTMIN(2))) )**XLBEXC) + ! Lbda_c + ZITW(:) = ZCCT(:) * (X0CNDC/ZZW(:) + X2CNDC*ZCJ(:)*ZCJ(:)/ZZW(:)**(XDC+2.0)) & + / (ZRVSATW(:)*ZAW(:)) + ZZW(:) = MIN(1.E8,( XLBI* MAX(ZCIS(:),ZCTMIN(4)) & + /(MAX(ZRIS(:),ZRTMIN(4))) )**XLBEXI) + ! Lbda_I + ZITI(:) = ZCIT(:) * (X0DEPI/ZZW(:) + X2DEPI*ZCJ(:)*ZCJ(:)/ZZW(:)**(XDI+2.0)) & + / (ZRVSATI(:)*ZAI(:)) +! + ZAWW(:) = 1.0 + ZRVSATW_PRIME(:)*ZLVFACT(:) + ZAIW(:) = 1.0 + ZRVSATI_PRIME(:)*ZLVFACT(:) + ZAWI(:) = 1.0 + ZRVSATW_PRIME(:)*ZLSFACT(:) + ZAII(:) = 1.0 + ZRVSATI_PRIME(:)*ZLSFACT(:) +! + ZCND(:) = 0.0 + ZDEP(:) = 0.0 + ZZW(:) = ZAWW(:)*ZITW(:) + ZAII(:)*ZITI(:) ! R + WHERE( ZZW(:)<1.0E-2 ) + ZFACT(:) = ZDT*(0.5 - (ZZW(:)*ZDT)/6.0) + ELSEWHERE + ZFACT(:) = (1.0/ZZW(:))*(1.0-(1.0-EXP(-ZZW(:)*ZDT))/(ZZW(:)*ZDT)) + END WHERE + ZCND(:) = ZITW(:)*(ZDELTW(:)-( ZAWW(:)*ZITW(:)*ZDELTW(:) & + + ZAWI(:)*ZITI(:)*ZDELTI(:) )*ZFACT(:)) + ZDEP(:) = ZITI(:)*(ZDELTI(:)-( ZAIW(:)*ZITW(:)*ZDELTW(:) & + + ZAII(:)*ZITI(:)*ZDELTI(:) )*ZFACT(:)) +! +! Integration +! + WHERE( ZCND(:) < 0.0 ) + ZCND(:) = MAX ( ZCND(:), -ZRCS(:) ) + ELSEWHERE + ZCND(:) = MIN ( ZCND(:), ZRVS(:) ) + END WHERE + WHERE( ZRCS(:) < ZRTMIN(2) ) + ZCND(:) = 0.0 + END WHERE + ZRVS(:) = ZRVS(:) - ZCND(:) + ZRCS(:) = ZRCS(:) + ZCND(:) + ZTHS(:) = ZTHS(:) + ZCND(:) * ZLVFACT(:) / ZEXNREF(:) +! + WHERE( ZDEP(:) < 0.0 ) + ZDEP(:) = MAX ( ZDEP(:), -ZRIS(:) ) + ELSEWHERE + ZDEP(:) = MIN ( ZDEP(:), ZRVS(:) ) + END WHERE + WHERE( ZRIS(:) < ZRTMIN(4) ) + ZDEP(:) = 0.0 + END WHERE + ZRVS(:) = ZRVS(:) - ZDEP(:) + ZRIS(:) = ZRIS(:) + ZDEP(:) + ZTHS(:) = ZTHS(:) + ZDEP(:) * ZLSFACT(:) / ZEXNREF(:) +! +! Implicit ice crystal sublimation if ice saturated conditions are not met +! + ZZT(:) = ( ZTHS(:) * ZDT ) * ( ZPRES(:) / XP00 ) ** (XRD/XCPD) + ZLVFACT(:) = (XLVTT+(XCPV-XCL)*(ZZT(:)-XTT))/ZZCPH(:) ! L_v/C_ph + ZLSFACT(:) = (XLSTT+(XCPV-XCI)*(ZZT(:)-XTT))/ZZCPH(:) ! L_s/C_ph + ZZW(:) = EXP( XALPI - XBETAI/ZZT(:) - XGAMI*ALOG(ZZT(:) ) ) ! es_i + ZRVSATI(:) = ZEPS*ZZW(:) / ( ZPRES(:)-ZZW(:) ) ! r_si + WHERE( ZRVS(:)*ZDT<ZRVSATI(:) ) + ZZW(:) = ZRVS(:) + ZRIS(:) + ZRVS(:) = MIN( ZZW(:),ZRVSATI(:)/ZDT ) + ZTHS(:) = ZTHS(:) + ( MAX( 0.0,ZZW(:)-ZRVS(:) )-ZRIS(:) ) & + * ZLSFACT(:) / ZEXNREF(:) + ZRIS(:) = MAX( 0.0,ZZW(:)-ZRVS(:) ) + END WHERE +! +! +! + ZW(:,:,:) = PRVS(:,:,:) + PRVS(:,:,:) = UNPACK( ZRVS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PRCS(:,:,:) + PRCS(:,:,:) = UNPACK( ZRCS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PRIS(:,:,:) + PRIS(:,:,:) = UNPACK( ZRIS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PTHS(:,:,:) + PTHS(:,:,:) = UNPACK( ZTHS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) +! + DEALLOCATE(ZRVT) + DEALLOCATE(ZRCT) + DEALLOCATE(ZRIT) + DEALLOCATE(ZCCT) + DEALLOCATE(ZCIT) + DEALLOCATE(ZRVS) + DEALLOCATE(ZRCS) + DEALLOCATE(ZRIS) + DEALLOCATE(ZCCS) + DEALLOCATE(ZCIS) + DEALLOCATE(ZTHS) + DEALLOCATE(ZRHODREF) + DEALLOCATE(ZZT) + DEALLOCATE(ZPRES) + DEALLOCATE(ZEXNREF) + DEALLOCATE(ZZCPH) + DEALLOCATE(ZZW) + DEALLOCATE(ZLVFACT) + DEALLOCATE(ZLSFACT) + DEALLOCATE(ZRVSATW) + DEALLOCATE(ZRVSATI) + DEALLOCATE(ZRVSATW_PRIME) + DEALLOCATE(ZRVSATI_PRIME) + DEALLOCATE(ZDELTW) + DEALLOCATE(ZDELTI) + DEALLOCATE(ZAW) + DEALLOCATE(ZAI) + DEALLOCATE(ZCJ) + DEALLOCATE(ZKA) + DEALLOCATE(ZDV) + DEALLOCATE(ZITW) + DEALLOCATE(ZITI) + DEALLOCATE(ZAWW) + DEALLOCATE(ZAIW) + DEALLOCATE(ZAWI) + DEALLOCATE(ZAII) + DEALLOCATE(ZFACT) + DEALLOCATE(ZDELT1) + DEALLOCATE(ZDELT2) + DEALLOCATE(ZCND) + DEALLOCATE(ZDEP) +END IF ! IMICRO +! +END IF ! OSUBG_COND +! +! full sublimation of the cloud ice crystals if there are few +! +IF ( .NOT. OSUBG_COND ) THEN + +ZMASK(:,:,:) = 0.0 +ZW(:,:,:) = 0. +WHERE (PRIS(:,:,:) <= ZRTMIN(4) .OR. PCIS(:,:,:) <= ZCTMIN(4)) + PRVS(:,:,:) = PRVS(:,:,:) + PRIS(:,:,:) + PTHS(:,:,:) = PTHS(:,:,:) - PRIS(:,:,:)*ZLS(:,:,:)/(ZCPH(:,:,:)*ZEXNS(:,:,:)) + PRIS(:,:,:) = 0.0 + ZW(:,:,:) = MAX(PCIS(:,:,:),0.) + PCIS(:,:,:) = 0.0 +END WHERE +! +IF (LCOLD .AND. (NMOD_IFN .GE. 1 .OR. NMOD_IMM .GE. 1)) THEN + ZW1(:,:,:) = 0. + IF (NMOD_IFN .GE. 1) ZW1(:,:,:) = ZW1(:,:,:) + SUM(PINS,DIM=4) + IF (NMOD_IMM .GE. 1) ZW1(:,:,:) = ZW1(:,:,:) + SUM(PNIS,DIM=4) + ZW (:,:,:) = MIN( ZW(:,:,:), ZW1(:,:,:) ) + ZW2(:,:,:) = 0. + WHERE ( ZW(:,:,:) > 0. ) + ZMASK(:,:,:) = 1.0 + ZW2(:,:,:) = ZW(:,:,:) / ZW1(:,:,:) + ENDWHERE +END IF +! +IF (LCOLD .AND. NMOD_IFN.GE.1) THEN + DO JMOD_IFN = 1, NMOD_IFN + PIFS(:,:,:,JMOD_IFN) = PIFS(:,:,:,JMOD_IFN) + & + ZMASK(:,:,:) * PINS(:,:,:,JMOD_IFN) * ZW2(:,:,:) + PINS(:,:,:,JMOD_IFN) = PINS(:,:,:,JMOD_IFN) - & + ZMASK(:,:,:) * PINS(:,:,:,JMOD_IFN) * ZW2(:,:,:) + PINS(:,:,:,JMOD_IFN) = MAX( 0.0 , PINS(:,:,:,JMOD_IFN) ) + ENDDO +END IF +! +IF (LCOLD .AND. NMOD_IMM.GE.1) THEN + JMOD_IMM = 0 + DO JMOD = 1, NMOD_CCN + IF (NIMM(JMOD) == 1) THEN + JMOD_IMM = JMOD_IMM + 1 + PNAS(:,:,:,JMOD) = PNAS(:,:,:,JMOD) + & + ZMASK(:,:,:) * PNIS(:,:,:,JMOD_IMM) * ZW2(:,:,:) + PNIS(:,:,:,JMOD_IMM) = PNIS(:,:,:,JMOD_IMM) - & + ZMASK(:,:,:) * PNIS(:,:,:,JMOD_IMM) * ZW2(:,:,:) + PNIS(:,:,:,JMOD_IMM) = MAX( 0.0 , PNIS(:,:,:,JMOD_IMM) ) + END IF + ENDDO +END IF +! +! complete evaporation of the cloud droplets if there are few +! +ZMASK(:,:,:) = 0.0 +ZW(:,:,:) = 0. +WHERE (PRCS(:,:,:) <= ZRTMIN(2) .OR. PCCS(:,:,:) <= ZCTMIN(2)) + PRVS(:,:,:) = PRVS(:,:,:) + PRCS(:,:,:) + PTHS(:,:,:) = PTHS(:,:,:) - PRCS(:,:,:)*ZLV(:,:,:)/(ZCPH(:,:,:)*ZEXNS(:,:,:)) + PRCS(:,:,:) = 0.0 + ZW(:,:,:) = MAX(PCCS(:,:,:),0.) + PCCS(:,:,:) = 0.0 +END WHERE +! +ZW1(:,:,:) = 0. +IF (LWARM .AND. NMOD_CCN.GE.1) ZW1(:,:,:) = SUM(PNAS,DIM=4) +ZW (:,:,:) = MIN( ZW(:,:,:), ZW1(:,:,:) ) +ZW2(:,:,:) = 0. +WHERE ( ZW(:,:,:) > 0. ) + ZMASK(:,:,:) = 1.0 + ZW2(:,:,:) = ZW(:,:,:) / ZW1(:,:,:) +ENDWHERE +! +IF (LWARM .AND. NMOD_CCN.GE.1) THEN + DO JMOD = 1, NMOD_CCN + PNFS(:,:,:,JMOD) = PNFS(:,:,:,JMOD) + & + ZMASK(:,:,:) * PNAS(:,:,:,JMOD) * ZW2(:,:,:) + PNAS(:,:,:,JMOD) = PNAS(:,:,:,JMOD) - & + ZMASK(:,:,:) * PNAS(:,:,:,JMOD) * ZW2(:,:,:) + PNAS(:,:,:,JMOD) = MAX( 0.0 , PNAS(:,:,:,JMOD) ) + ENDDO +END IF +! +IF (LSCAV .AND. LAERO_MASS) PMAS(:,:,:) = PMAS(:,:,:) * (1-ZMASK(:,:,:)) +! +! end of the iterative loop +! +END IF ! .NOT.OSUBG_COND + +END DO +! +! +!* 5.2 compute the cloud fraction PCLDFR (binary !!!!!!!) +! +IF ( .NOT. OSUBG_COND ) THEN + WHERE (PRCS(:,:,:) + PRIS(:,:,:) + PRSS(:,:,:) > 1.E-12 / ZDT) + PCLDFR(:,:,:) = 1. + ELSEWHERE + PCLDFR(:,:,:) = 0. + ENDWHERE +END IF +! +IF ( SIZE(PSRCS,3) /= 0 ) THEN + WHERE (PRCS(:,:,:) + PRIS(:,:,:) > 1.E-12 / ZDT) + PSRCS(:,:,:) = 1. + ELSEWHERE + PSRCS(:,:,:) = 0. + ENDWHERE +END IF +! +IF ( tpfile%lopened ) THEN + TZFIELD%CMNHNAME = 'NEB' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'NEB' + TZFIELD%CUNITS = '1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_NEB' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZW) +END IF +! +! +!* 6. SAVE CHANGES IN PRS AND PSVS +! ---------------------------- +! +! +! Prepare 3D water mixing ratios +PRS(:,:,:,1) = PRVS(:,:,:) +IF ( KRR .GE. 2 ) PRS(:,:,:,2) = PRCS(:,:,:) +IF ( KRR .GE. 3 ) PRS(:,:,:,3) = PRRS(:,:,:) +IF ( KRR .GE. 4 ) PRS(:,:,:,4) = PRIS(:,:,:) +IF ( KRR .GE. 5 ) PRS(:,:,:,5) = PRSS(:,:,:) +IF ( KRR .GE. 6 ) PRS(:,:,:,6) = PRGS(:,:,:) +! +! Prepare 3D number concentrations +! +IF ( LWARM ) PSVS(:,:,:,NSV_LIMA_NC) = PCCS(:,:,:) +IF ( LCOLD ) PSVS(:,:,:,NSV_LIMA_NI) = PCIS(:,:,:) +! +IF ( LSCAV .AND. LAERO_MASS ) PSVS(:,:,:,NSV_LIMA_SCAVMASS) = PMAS(:,:,:) +! +IF ( LWARM .AND. NMOD_CCN .GE. 1 ) THEN + PSVS(:,:,:,NSV_LIMA_CCN_FREE:NSV_LIMA_CCN_FREE+NMOD_CCN-1) = PNFS(:,:,:,:) + PSVS(:,:,:,NSV_LIMA_CCN_ACTI:NSV_LIMA_CCN_ACTI+NMOD_CCN-1) = PNAS(:,:,:,:) +END IF +! +IF ( LCOLD .AND. NMOD_IFN .GE. 1 ) THEN + PSVS(:,:,:,NSV_LIMA_IFN_FREE:NSV_LIMA_IFN_FREE+NMOD_IFN-1) = PIFS(:,:,:,:) + PSVS(:,:,:,NSV_LIMA_IFN_NUCL:NSV_LIMA_IFN_NUCL+NMOD_IFN-1) = PINS(:,:,:,:) +END IF +! +IF ( LCOLD .AND. NMOD_IMM .GE. 1 ) THEN + PSVS(:,:,:,NSV_LIMA_IMM_NUCL:NSV_LIMA_IMM_NUCL+NMOD_IMM-1) = PNIS(:,:,:,:) +END IF +! +! write SSI in LFI +! +IF ( tpfile%lopened ) THEN + ZT(:,:,:) = ( PTHS(:,:,:) * ZDT ) * ZEXNS(:,:,:) + ZW(:,:,:) = EXP( XALPI - XBETAI/ZT(:,:,:) - XGAMI*ALOG(ZT(:,:,:) ) ) + ZW1(:,:,:)= 2.0*PPABST(:,:,:)-PPABSM(:,:,:) + ZW(:,:,:) = PRVT(:,:,:)*( ZW1(:,:,:)-ZW(:,:,:) ) / ( (XMV/XMD) * ZW(:,:,:) ) - 1.0 + + TZFIELD%CMNHNAME = 'SSI' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'SSI' + TZFIELD%CUNITS = '' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_SSI' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZW) +END IF +! +! +!* 7. STORE THE BUDGET TERMS +! ---------------------- +! +if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'CEDS', pths(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rv ) call Budget_store_end( tbudgets(NBUDGET_RV), 'CEDS', prvs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'CEDS', prcs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'CEDS', pris(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_sv ) then + if ( lwarm ) & + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'CEDS', pccs(:, :, :) * prhodj(:, :, :) ) + if ( lcold ) & + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'CEDS', pcis(:, :, :) * prhodj(:, :, :) ) + if ( lscav .and. laero_mass ) & + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_scavmass), 'CEDS', pmas(:, :, :) * prhodj(:, :, :) ) + if ( lwarm ) then + do jl = 1, nmod_ccn + idx = NBUDGET_SV1 - 1 + nsv_lima_ccn_free - 1 + jl + call Budget_store_end( tbudgets(idx), 'CEDS', pnfs(:, :, :, jl) * prhodj(:, :, :) ) + idx = NBUDGET_SV1 - 1 + nsv_lima_ccn_acti - 1 + jl + call Budget_store_end( tbudgets(idx), 'CEDS', pnas(:, :, :, jl) * prhodj(:, :, :) ) + end do + end if + if ( lcold ) then + do jl = 1, nmod_ifn + idx = NBUDGET_SV1 - 1 + nsv_lima_ifn_free - 1 + jl + call Budget_store_end( tbudgets(idx), 'CEDS', pifs(:, :, :, jl) * prhodj(:, :, :) ) + idx = NBUDGET_SV1 - 1 + nsv_lima_ifn_nucl - 1 + jl + call Budget_store_end( tbudgets(idx), 'CEDS', pins(:, :, :, jl) * prhodj(:, :, :) ) + end do + do jl = 1, nmod_imm + idx = NBUDGET_SV1 - 1 + nsv_lima_imm_nucl - 1 + jl + call Budget_store_end( tbudgets(idx), 'CEDS', pnis(:, :, :, jl) * prhodj(:, :, :) ) + end do + end if + end if +end if +!++cb++ +DEALLOCATE(ZRTMIN) +DEALLOCATE(ZCTMIN) +IF (ALLOCATED(PNFS)) DEALLOCATE(PNFS) +IF (ALLOCATED(PNAS)) DEALLOCATE(PNAS) +IF (ALLOCATED(PIFS)) DEALLOCATE(PIFS) +IF (ALLOCATED(PINS)) DEALLOCATE(PINS) +IF (ALLOCATED(PNIS)) DEALLOCATE(PNIS) +!--cb-- +! +!------------------------------------------------------------------------------ +! +END SUBROUTINE LIMA_ADJUST diff --git a/src/mesonh/micro/lima_adjust_split.f90 b/src/mesonh/micro/lima_adjust_split.f90 new file mode 100644 index 000000000..edaeec820 --- /dev/null +++ b/src/mesonh/micro/lima_adjust_split.f90 @@ -0,0 +1,848 @@ +!MNH_LIC Copyright 2013-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ############################# + MODULE MODI_LIMA_ADJUST_SPLIT +! ############################# +! +INTERFACE +! + SUBROUTINE LIMA_ADJUST_SPLIT(KRR, KMI, TPFILE, HCONDENS, HLAMBDA3, & + OSUBG_COND, OSIGMAS, PTSTEP, PSIGQSAT, & + PRHODREF, PRHODJ, PEXNREF, PPABSM, PSIGS, PMFCONV, & + PPABST, PZZ, PDTHRAD, PW_NU, & + PRT, PRS, PSVT, PSVS, & + PTHS, PSRCS, PCLDFR, PRC_MF, PCF_MF ) +! +USE MODD_IO, ONLY: TFILEDATA +USE MODD_NSV, only: NSV_LIMA_BEG +! +INTEGER, INTENT(IN) :: KRR ! Number of moist variables +INTEGER, INTENT(IN) :: KMI ! Model index +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +CHARACTER(len=80), INTENT(IN) :: HCONDENS +CHARACTER(len=4), INTENT(IN) :: HLAMBDA3 ! formulation for lambda3 coeff +LOGICAL, INTENT(IN) :: OSUBG_COND ! Switch for Subgrid + ! Condensation +LOGICAL, INTENT(IN) :: OSIGMAS ! Switch for Sigma_s: + ! use values computed in CONDENSATION + ! or that from turbulence scheme +REAL, INTENT(IN) :: PTSTEP ! Time step +REAL, INTENT(IN) :: PSIGQSAT ! coeff applied to qsat variance contribution +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Dry density of the + ! reference state +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! Absolute Pressure at t-dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSIGS ! Sigma_s at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PMFCONV ! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! Absolute Pressure at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTHRAD ! Radiative temperature tendency +REAL, DIMENSION(:,:,:), INTENT(IN) :: PW_NU ! updraft velocity used for +! +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! m.r. at t +! +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRS ! m.r. source +! +REAL, DIMENSION(:,:,:,NSV_LIMA_BEG:), INTENT(IN) :: PSVT ! Concentrations at time t +! +REAL, DIMENSION(:,:,:,NSV_LIMA_BEG:), INTENT(INOUT) :: PSVS ! Concentration sources +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +! +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSRCS ! Second-order flux + ! s'rc'/2Sigma_s2 at time t+1 + ! multiplied by Lambda_3 +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCLDFR ! Cloud fraction +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRC_MF! Convective Mass Flux liquid mixing ratio +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCF_MF! Convective Mass Flux Cloud fraction +! +END SUBROUTINE LIMA_ADJUST_SPLIT +! +END INTERFACE +! +END MODULE MODI_LIMA_ADJUST_SPLIT +! +! ########################################################################### + SUBROUTINE LIMA_ADJUST_SPLIT(KRR, KMI, TPFILE, HCONDENS, HLAMBDA3, & + OSUBG_COND, OSIGMAS, PTSTEP, PSIGQSAT, & + PRHODREF, PRHODJ, PEXNREF, PPABSM, PSIGS, PMFCONV, & + PPABST, PZZ, PDTHRAD, PW_NU, & + PRT, PRS, PSVT, PSVS, & + PTHS, PSRCS, PCLDFR, PRC_MF, PCF_MF ) +! ########################################################################### +! +!!**** *MIMA_ADJUST* - compute the fast microphysical sources +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the fast microphysical sources +!! through an explict scheme and a saturation ajustement procedure. +!! +!! +!!** METHOD +!! ------ +!! Reisin et al., 1996 for the explicit scheme when ice is present +!! Langlois, Tellus, 1973 for the implict adjustment for the cloud water +!! (refer also to book 1 of the documentation). +!! +!! Computations are done separately for three cases : +!! - ri>0 and rc=0 +!! - rc>0 and ri=0 +!! - ri>0 and rc>0 +!! +!! +!! EXTERNAL +!! -------- +!! None +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST +!! XP00 ! Reference pressure +!! XMD,XMV ! Molar mass of dry air and molar mass of vapor +!! XRD,XRV ! Gaz constant for dry air, gaz constant for vapor +!! XCPD,XCPV ! Cpd (dry air), Cpv (vapor) +!! XCL ! Cl (liquid) +!! XTT ! Triple point temperature +!! XLVTT ! Vaporization heat constant +!! XALPW,XBETAW,XGAMW ! Constants for saturation vapor +!! ! pressure function +!! Module MODD_CONF +!! CCONF +!! Module MODD_BUDGET: +!! NBUMOD +!! CBUTYPE +!! LBU_RTH +!! LBU_RRV +!! LBU_RRC +!! Module MODD_LES : NCTR_LES,LTURB_LES,NMODNBR_LES +!! XNA declaration (cloud fraction as global var) +!! +!! REFERENCE +!! --------- +!! +!! Book 1 and Book2 of documentation ( routine FAST_TERMS ) +!! Langlois, Tellus, 1973 +!! +!! AUTHOR +!! ------ +!! E. Richard * Laboratoire d'Aerologie* +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original 06/2021 forked from lima_adjust.f90 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +use modd_budget, only: lbu_enable, nbumod, & + lbudget_th, lbudget_rv, lbudget_rc, lbudget_ri, lbudget_sv, & + NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, NBUDGET_RI, NBUDGET_SV1, & + tbudgets +USE MODD_CONF +USE MODD_CST +use modd_field, only: TFIELDDATA, TYPEREAL +USE MODD_IO, ONLY: TFILEDATA +USE MODD_LUNIT_n, ONLY: TLUOUT +USE MODD_NSV +USE MODD_PARAMETERS +USE MODD_PARAM_LIMA +USE MODD_PARAM_LIMA_COLD +USE MODD_PARAM_LIMA_MIXED +USE MODD_PARAM_LIMA_WARM +! +use mode_budget, only: Budget_store_init, Budget_store_end +USE MODE_IO_FIELD_WRITE, only: IO_Field_write +use mode_msg +use mode_tools, only: Countjv +! +USE MODI_CONDENS +USE MODI_CONDENSATION +USE MODI_LIMA_FUNCTIONS +USE MODI_LIMA_CCN_ACTIVATION +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +! +INTEGER, INTENT(IN) :: KRR ! Number of moist variables +INTEGER, INTENT(IN) :: KMI ! Model index +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +CHARACTER(len=80), INTENT(IN) :: HCONDENS +CHARACTER(len=4), INTENT(IN) :: HLAMBDA3 ! formulation for lambda3 coeff +LOGICAL, INTENT(IN) :: OSUBG_COND ! Switch for Subgrid + ! Condensation +LOGICAL, INTENT(IN) :: OSIGMAS ! Switch for Sigma_s: + ! use values computed in CONDENSATION + ! or that from turbulence scheme +REAL, INTENT(IN) :: PTSTEP ! Time step +REAL, INTENT(IN) :: PSIGQSAT ! coeff applied to qsat variance contribution +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Dry density of the + ! reference state +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! Absolute Pressure at t-dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSIGS ! Sigma_s at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PMFCONV ! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! Absolute Pressure at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTHRAD ! Radiative temperature tendency +REAL, DIMENSION(:,:,:), INTENT(IN) :: PW_NU ! updraft velocity used for +! +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! m.r. at t +! +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRS ! m.r. source +! +REAL, DIMENSION(:,:,:,NSV_LIMA_BEG:), INTENT(IN) :: PSVT ! Concentrations at time t +! +REAL, DIMENSION(:,:,:,NSV_LIMA_BEG:), INTENT(INOUT) :: PSVS ! Concentration sources +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +! +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSRCS ! Second-order flux + ! s'rc'/2Sigma_s2 at time t+1 + ! multiplied by Lambda_3 +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCLDFR ! Cloud fraction +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRC_MF! Convective Mass Flux liquid mixing ratio +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCF_MF! Convective Mass Flux Cloud fraction +! +! +!* 0.2 Declarations of local variables : +! +! 3D Microphysical variables +REAL, DIMENSION(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3)) & + :: PTHT, & + PRVT, & ! Water vapor m.r. at t + PRCT, & ! Cloud water m.r. at t + PRRT, & ! Rain water m.r. at t + PRIT, & ! Cloud ice m.r. at t + PRST, & ! Aggregate m.r. at t + PRGT, & ! Graupel m.r. at t +! + PRVS, & ! Water vapor m.r. source + PRCS, & ! Cloud water m.r. source + PRRS, & ! Rain water m.r. source + PRIS, & ! Cloud ice m.r. source + PRSS, & ! Aggregate m.r. source + PRGS, & ! Graupel m.r. source +! + PCCT, & ! Cloud water conc. at t + PCIT, & ! Cloud ice conc. at t +! + PCCS, & ! Cloud water C. source + PMAS, & ! Mass of scavenged AP + PCIS ! Ice crystal C. source +! +REAL, DIMENSION(:,:,:,:), ALLOCATABLE & + :: PNFS, & ! Free CCN C. source + PNAS, & ! Activated CCN C. source + PNFT, & ! Free CCN C. + PNAT ! Activated CCN C. +! PIFS, & ! Free IFN C. source +! PINS, & ! Nucleated IFN C. source +! PNIS ! Acti. IMM. nuclei C. source +! +! +! +REAL :: ZEPS ! Mv/Md +REAL :: ZDT ! Time increment (2*Delta t or Delta t if cold start) +REAL, DIMENSION(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3)) & + :: ZEXNS,& ! guess of the Exner function at t+1 + ZT, ZT2, & ! guess of the temperature at t+1 + ZCPH, & ! guess of the CPh for the mixing + ZW, & + ZW1, & + ZW2, & + ZLV, & ! guess of the Lv at t+1 + ZLS, & ! guess of the Ls at t+1 + ZMASK,& + ZRV, ZRV2, & + ZRC, ZRC2, & + ZRI, & + ZSIGS, & + ZW_MF +LOGICAL, DIMENSION(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3)) & + :: GMICRO ! Test where to compute cond/dep proc. +INTEGER :: IMICRO +REAL, DIMENSION(:), ALLOCATABLE & + :: ZRVT, ZRCT, ZRIT, ZRVS, ZRCS, ZRIS, ZTHS, & + ZCCT, ZCIT, ZCCS, ZCIS, & + ZRHODREF, ZZT, ZPRES, ZEXNREF, ZZCPH, & + ZZW, ZLVFACT, ZLSFACT, & + ZRVSATW, ZRVSATI, ZRVSATW_PRIME, ZRVSATI_PRIME, & + ZAW, ZAI, ZCJ, ZKA, ZDV, ZITW, ZITI, ZAWW, ZAIW, & + ZAWI, ZAII, ZFACT, ZDELTW, & + ZDELTI, ZDELT1, ZDELT2, ZCND, ZDEP, ZS, ZVEC1, ZZW2 +! +INTEGER, DIMENSION(:), ALLOCATABLE :: IVEC1 +! +INTEGER :: IRESP ! Return code of FM routines +INTEGER :: IIU,IJU,IKU! dimensions of dummy arrays +INTEGER :: IKB ! K index value of the first inner mass point +INTEGER :: IKE ! K index value of the last inner mass point +INTEGER :: IIB,IJB ! Horz index values of the first inner mass points +INTEGER :: IIE,IJE ! Horz index values of the last inner mass points +INTEGER :: JITER,ITERMAX ! iterative loop for first order adjustment +INTEGER :: ILUOUT ! Logical unit of output listing +! +INTEGER :: ISIZE +REAL, DIMENSION(:), ALLOCATABLE :: ZRTMIN +REAL, DIMENSION(:), ALLOCATABLE :: ZCTMIN +! +integer :: idx +INTEGER , DIMENSION(SIZE(GMICRO)) :: I1,I2,I3 ! Used to replace the COUNT +INTEGER :: JL ! and PACK intrinsics +INTEGER :: JMOD, JMOD_IFN, JMOD_IMM +! +INTEGER , DIMENSION(3) :: BV +TYPE(TFIELDDATA) :: TZFIELD +! +!------------------------------------------------------------------------------- +! +!* 1. PRELIMINARIES +! ------------- +! +ILUOUT = TLUOUT%NLU +! +IIU = SIZE(PEXNREF,1) +IJU = SIZE(PEXNREF,2) +IKU = SIZE(PEXNREF,3) +IIB = 1 + JPHEXT +IIE = SIZE(PRHODJ,1) - JPHEXT +IJB = 1 + JPHEXT +IJE = SIZE(PRHODJ,2) - JPHEXT +IKB = 1 + JPVEXT +IKE = SIZE(PRHODJ,3) - JPVEXT +! +ZEPS= XMV / XMD +! +IF (OSUBG_COND) THEN + ITERMAX=1 +ELSE + ITERMAX=1 +END IF +! +ZDT = PTSTEP +! +ISIZE = SIZE(XRTMIN) +ALLOCATE(ZRTMIN(ISIZE)) +ZRTMIN(:) = XRTMIN(:) / ZDT +ISIZE = SIZE(XCTMIN) +ALLOCATE(ZCTMIN(ISIZE)) +ZCTMIN(:) = XCTMIN(:) / ZDT +! +! Prepare 3D water mixing ratios +! +PTHT = PTHS*PTSTEP +! +PRVT(:,:,:) = PRS(:,:,:,1)*PTSTEP +PRVS(:,:,:) = PRS(:,:,:,1) +! +PRCT(:,:,:) = 0. +PRCS(:,:,:) = 0. +PRRT(:,:,:) = 0. +PRRS(:,:,:) = 0. +PRIT(:,:,:) = 0. +PRIS(:,:,:) = 0. +PRST(:,:,:) = 0. +PRSS(:,:,:) = 0. +PRGT(:,:,:) = 0. +PRGS(:,:,:) = 0. +! +IF ( KRR .GE. 2 ) PRCT(:,:,:) = PRS(:,:,:,2)*PTSTEP +IF ( KRR .GE. 2 ) PRCS(:,:,:) = PRS(:,:,:,2) +IF ( KRR .GE. 3 ) PRRT(:,:,:) = PRT(:,:,:,3) +IF ( KRR .GE. 3 ) PRRS(:,:,:) = PRS(:,:,:,3) +IF ( KRR .GE. 4 ) PRIT(:,:,:) = PRT(:,:,:,4) +IF ( KRR .GE. 4 ) PRIS(:,:,:) = PRS(:,:,:,4) +IF ( KRR .GE. 5 ) PRST(:,:,:) = PRT(:,:,:,5) +IF ( KRR .GE. 5 ) PRSS(:,:,:) = PRS(:,:,:,5) +IF ( KRR .GE. 6 ) PRGT(:,:,:) = PRT(:,:,:,6) +IF ( KRR .GE. 6 ) PRGS(:,:,:) = PRS(:,:,:,6) +! +! Prepare 3D number concentrations +PCCT(:,:,:) = 0. +PCIT(:,:,:) = 0. +PCCS(:,:,:) = 0. +! PCIS(:,:,:) = 0. +! +IF ( LWARM ) PCCT(:,:,:) = PSVS(:,:,:,NSV_LIMA_NC)*PTSTEP +IF ( LCOLD ) PCIT(:,:,:) = PSVT(:,:,:,NSV_LIMA_NI) +! +IF ( LWARM ) PCCS(:,:,:) = PSVS(:,:,:,NSV_LIMA_NC) +! IF ( LCOLD ) PCIS(:,:,:) = PSVS(:,:,:,NSV_LIMA_NI) +! +IF ( LSCAV .AND. LAERO_MASS ) PMAS(:,:,:) = PSVS(:,:,:,NSV_LIMA_SCAVMASS) +! +IF ( LWARM .AND. NMOD_CCN.GE.1 ) THEN + ALLOCATE( PNFS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),NMOD_CCN) ) + ALLOCATE( PNAS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),NMOD_CCN) ) + ALLOCATE( PNFT(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),NMOD_CCN) ) + ALLOCATE( PNAT(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),NMOD_CCN) ) + PNFS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_CCN_FREE:NSV_LIMA_CCN_FREE+NMOD_CCN-1) + PNAS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_CCN_ACTI:NSV_LIMA_CCN_ACTI+NMOD_CCN-1) + PNFT(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_CCN_FREE:NSV_LIMA_CCN_FREE+NMOD_CCN-1)*PTSTEP + PNAT(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_CCN_ACTI:NSV_LIMA_CCN_ACTI+NMOD_CCN-1)*PTSTEP +END IF +! +! IF ( LCOLD .AND. NMOD_IFN .GE. 1 ) THEN +! ALLOCATE( PIFS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),NMOD_IFN) ) +! ALLOCATE( PINS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),NMOD_IFN) ) +! PIFS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_IFN_FREE:NSV_LIMA_IFN_FREE+NMOD_IFN-1) +! PINS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_IFN_NUCL:NSV_LIMA_IFN_NUCL+NMOD_IFN-1) +! END IF +! +! IF ( NMOD_IMM .GE. 1 ) THEN +! ALLOCATE( PNIS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),NMOD_IMM) ) +! PNIS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_IMM_NUCL:NSV_LIMA_IMM_NUCL+NMOD_IMM-1) +! END IF +! +! +if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'CEDS', pths(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rv ) call Budget_store_init( tbudgets(NBUDGET_RV), 'CEDS', prvs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'CEDS', prcs(:, :, :) * prhodj(:, :, :) ) + !Remark: PRIS is not modified but source term kept for better coherence with lima_adjust and lima_notadjust + if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), 'CEDS', pris(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_sv ) then + if ( lwarm ) & + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'CEDS', pccs(:, :, :) * prhodj(:, :, :) ) + if ( lscav .and. laero_mass ) & + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_scavmass), 'CEDS', pmas(:, :, :) * prhodj(:, :, :) ) + if ( lwarm ) then + do jl = 1, nmod_ccn + idx = NBUDGET_SV1 - 1 + nsv_lima_ccn_free - 1 + jl + call Budget_store_init( tbudgets(idx), 'CEDS', pnfs(:, :, :, jl) * prhodj(:, :, :) ) + idx = NBUDGET_SV1 - 1 + nsv_lima_ccn_acti - 1 + jl + call Budget_store_init( tbudgets(idx), 'CEDS', pnas(:, :, :, jl) * prhodj(:, :, :) ) + end do + end if +! if ( lcold ) then +! call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'CEDS', pcis(:, :, :) * prhodj(:, :, :) ) +! do jl = 1, nmod_ifn +! idx = NBUDGET_SV1 - 1 + nsv_lima_ifn_free - 1 + jl +! call Budget_store_init( tbudgets(idx), 'CEDS', pifs(:, :, :, jl) * prhodj(:, :, :) ) +! idx = NBUDGET_SV1 - 1 + nsv_lima_ifn_nucl - 1 + jl +! call Budget_store_init( tbudgets(idx), 'CEDS', pins(:, :, :, jl) * prhodj(:, :, :) ) +! end do +! do jl = 1, nmod_imm +! idx = NBUDGET_SV1 - 1 + nsv_lima_imm_nucl - 1 + jl +! call Budget_store_init( tbudgets(idx), 'CEDS', pnis(:, :, :, jl) * prhodj(:, :, :) ) +! end do +! end if + end if +end if +! +!------------------------------------------------------------------------------- +! +! +!* 2. COMPUTE QUANTITIES WITH THE GUESS OF THE FUTURE INSTANT +! ------------------------------------------------------- +! +!* 2.1 remove negative non-precipitating negative water +! ------------------------------------------------ +! +IF (ANY(PRVS(:,:,:)+PRCS(:,:,:)+PRIS(:,:,:) < 0.) .AND. NVERB>5) THEN + WRITE(ILUOUT,*) 'LIMA_ADJUST: negative values of total water (reset to zero)' + WRITE(ILUOUT,*) ' location of minimum PRVS+PRCS+PRIS:',MINLOC(PRVS+PRCS+PRIS) + WRITE(ILUOUT,*) ' value of minimum PRVS+PRCS+PRIS:',MINVAL(PRVS+PRCS+PRIS) +END IF +! +WHERE ( PRVS(:,:,:)+PRCS(:,:,:)+PRIS(:,:,:) < 0.) + PRVS(:,:,:) = - PRCS(:,:,:) - PRIS(:,:,:) +END WHERE +! +!* 2.2 estimate the Exner function at t+1 +! +ZEXNS(:,:,:) = ( (2. * PPABST(:,:,:) - PPABSM(:,:,:)) / XP00 ) ** (XRD/XCPD) +! +! beginning of the iterative loop +! +DO JITER =1,ITERMAX +! +!* 2.3 compute the intermediate temperature at t+1, T* +! + ZT(:,:,:) = ( PTHS(:,:,:) * ZDT ) * ZEXNS(:,:,:) + ZT2(:,:,:) = ZT(:,:,:) +! +!* 2.4 compute the specific heat for moist air (Cph) at t+1 +! + ZCPH(:,:,:) = XCPD + XCPV *ZDT* PRVS(:,:,:) & + + XCL *ZDT* ( PRCS(:,:,:) + PRRS(:,:,:) ) & + + XCI *ZDT* ( PRIS(:,:,:) + PRSS(:,:,:) + PRGS(:,:,:) ) +! +!* 2.5 compute the latent heat of vaporization Lv(T*) at t+1 +! and of sublimation Ls(T*) at t+1 +! + ZLV(:,:,:) = XLVTT + ( XCPV - XCL ) * ( ZT(:,:,:) -XTT ) + ZLS(:,:,:) = XLSTT + ( XCPV - XCI ) * ( ZT(:,:,:) -XTT ) +! +! +!------------------------------------------------------------------------------- +! +!* 3. FIRST ORDER SUBGRID CONDENSATION SCHEME +! --------------------------------------- +! + IF ( OSUBG_COND ) THEN + ! + ZRV=PRVS*PTSTEP + ZRC=PRCS*PTSTEP + ZRV2=PRVT + ZRC2=PRCT + ZRI=0. + ZSIGS=PSIGS + CALL CONDENSATION(IIU, IJU, IKU, IIB, IIE, IJB, IJE, IKB, IKE, 1, 'S', & + HCONDENS, HLAMBDA3, & + PPABST, PZZ, PRHODREF, ZT, ZRV, ZRC, ZRI, PRSS*PTSTEP, PRGS*PTSTEP, & + ZSIGS, PMFCONV, PCLDFR, PSRCS, .FALSE., OSIGMAS, & + PSIGQSAT, PLV=ZLV, PLS=ZLS, PCPH=ZCPH ) + PCLDFR(:,:,:) = MIN(PCLDFR(:,:,:) + PCF_MF(:,:,:) , 1.) + ZRV(:,:,:) = ZRV(:,:,:) - MAX(MIN(PRC_MF(:,:,:), ZRV(:,:,:)),0.) + ZRC(:,:,:) = ZRC(:,:,:) + MAX(MIN(PRC_MF(:,:,:), ZRV(:,:,:)),0.) + ZW_MF=0. + CALL LIMA_CCN_ACTIVATION (TPFILE, & + PRHODREF, PEXNREF, PPABST, ZT2, PDTHRAD, PW_NU+ZW_MF, & + PTHT, ZRV2, ZRC2, PCCT, PRRT, PNFT, PNAT, & + PCLDFR ) +! + ELSE +! +!------------------------------------------------------------------------------- +! +! +! +!* FULLY IMPLICIT CONDENSATION SCHEME +! --------------------------------- +! +!* select cases where r_c>0 +! +! + GMICRO(:,:,:) = .FALSE. + GMICRO(IIB:IIE,IJB:IJE,IKB:IKE) =( PRCS(IIB:IIE,IJB:IJE,IKB:IKE)>0. .AND. & + PCCS(IIB:IIE,IJB:IJE,IKB:IKE)>0. ) + IMICRO = COUNTJV( GMICRO(:,:,:),I1(:),I2(:),I3(:)) + IF( IMICRO >= 1 ) THEN + ALLOCATE(ZRVT(IMICRO)) + ALLOCATE(ZRCT(IMICRO)) +! + ALLOCATE(ZRVS(IMICRO)) + ALLOCATE(ZRCS(IMICRO)) + ALLOCATE(ZCCS(IMICRO)) + ALLOCATE(ZTHS(IMICRO)) +! + ALLOCATE(ZRHODREF(IMICRO)) + ALLOCATE(ZZT(IMICRO)) + ALLOCATE(ZPRES(IMICRO)) + ALLOCATE(ZEXNREF(IMICRO)) + ALLOCATE(ZZCPH(IMICRO)) + DO JL=1,IMICRO + ZRVT(JL) = PRVT(I1(JL),I2(JL),I3(JL)) + ZRCT(JL) = PRCT(I1(JL),I2(JL),I3(JL)) + ! + ZRVS(JL) = PRVS(I1(JL),I2(JL),I3(JL)) + ZRCS(JL) = PRCS(I1(JL),I2(JL),I3(JL)) + ZCCS(JL) = PCCS(I1(JL),I2(JL),I3(JL)) + ZTHS(JL) = PTHS(I1(JL),I2(JL),I3(JL)) + ! + ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) + ZZT(JL) = ZT(I1(JL),I2(JL),I3(JL)) + ZPRES(JL) = 2.0*PPABST(I1(JL),I2(JL),I3(JL))-PPABSM(I1(JL),I2(JL),I3(JL)) + ZEXNREF(JL) = PEXNREF(I1(JL),I2(JL),I3(JL)) + ZZCPH(JL) = ZCPH(I1(JL),I2(JL),I3(JL)) + ENDDO + ALLOCATE(ZZW(IMICRO)) + ALLOCATE(ZLVFACT(IMICRO)) + ALLOCATE(ZRVSATW(IMICRO)) + ALLOCATE(ZCND(IMICRO)) + ZLVFACT(:) = (XLVTT+(XCPV-XCL)*(ZZT(:)-XTT))/ZZCPH(:) ! L_v/C_ph + ZZW(:) = EXP( XALPW - XBETAW/ZZT(:) - XGAMW*ALOG(ZZT(:) ) ) ! es_w + ZRVSATW(:) = ZEPS*ZZW(:) / ( ZPRES(:)-ZZW(:) ) ! r_sw + + IF (LADJ) THEN + ALLOCATE(ZRVSATW_PRIME(IMICRO)) + ALLOCATE(ZAWW(IMICRO)) + ALLOCATE(ZDELT1(IMICRO)) + ALLOCATE(ZDELT2(IMICRO)) + ZRVSATW_PRIME(:) = (( XBETAW/ZZT(:) - XGAMW ) / ZZT(:)) & ! r'_sw + * ZRVSATW(:) * ( 1. + ZRVSATW(:)/ZEPS ) + ZAWW(:) = 1.0 + ZRVSATW_PRIME(:)*ZLVFACT(:) + ZDELT2(:) = (ZRVSATW_PRIME(:)*ZLVFACT(:)/ZAWW(:)) * & + ( ((-2.*XBETAW+XGAMW*ZZT(:))/(XBETAW-XGAMW*ZZT(:)) & + + (XBETAW/ZZT(:)-XGAMW)*(1.0+2.0*ZRVSATW(:)/ZEPS))/ZZT(:) ) + ZDELT1(:) = (ZLVFACT(:)/ZAWW(:)) * ( ZRVSATW(:) - ZRVS(:)*ZDT ) + ZCND(:) = - ZDELT1(:)*( 1.0 + 0.5*ZDELT1(:)*ZDELT2(:) ) / (ZLVFACT(:)*ZDT) + DEALLOCATE(ZRVSATW_PRIME) + DEALLOCATE(ZAWW) + DEALLOCATE(ZDELT1) + DEALLOCATE(ZDELT2) + ELSE + ALLOCATE(ZS(IMICRO)) + ALLOCATE(ZZW2(IMICRO)) + ALLOCATE(ZVEC1(IMICRO)) + ALLOCATE(IVEC1(IMICRO)) + ZVEC1(:) = MAX( 1.0001, MIN( FLOAT(NAHEN)-0.0001, XAHENINTP1 * ZZT(:) + XAHENINTP2 ) ) + IVEC1(:) = INT( ZVEC1(:) ) + ZVEC1(:) = ZVEC1(:) - FLOAT( IVEC1(:) ) + ZS(:) = ZRVS(:)*PTSTEP / ZRVSATW(:) - 1. + ZZW(:) = ZCCS(:)*PTSTEP/(XLBC*ZCCS(:)/ZRCS(:))**XLBEXC + ZZW2(:) = XAHENG3(IVEC1(:)+1)*ZVEC1(:)-XAHENG3(IVEC1(:))*(ZVEC1(:)-1.) + ZCND(:) = 2.*3.14*1000.*ZZW2(:)*ZS(:)*ZZW(:) + DEALLOCATE(ZS) + DEALLOCATE(ZZW2) + DEALLOCATE(ZVEC1) + DEALLOCATE(IVEC1) + END IF +! +! +! Integration +! + WHERE( ZCND(:) < 0.0 ) + ZCND(:) = MAX ( ZCND(:), -ZRCS(:) ) + ELSEWHERE + ZCND(:) = MIN ( ZCND(:), ZRVS(:) ) + END WHERE + ZRVS(:) = ZRVS(:) - ZCND(:) + ZRCS(:) = ZRCS(:) + ZCND(:) + ZTHS(:) = ZTHS(:) + ZCND(:) * ZLVFACT(:) / ZEXNREF(:) +! + ZW(:,:,:) = PRVS(:,:,:) + PRVS(:,:,:) = UNPACK( ZRVS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PRCS(:,:,:) + PRCS(:,:,:) = UNPACK( ZRCS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PTHS(:,:,:) + PTHS(:,:,:) = UNPACK( ZTHS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) +! + DEALLOCATE(ZRVT) + DEALLOCATE(ZRCT) + DEALLOCATE(ZRVS) + DEALLOCATE(ZRCS) + DEALLOCATE(ZTHS) + DEALLOCATE(ZRHODREF) + DEALLOCATE(ZZT) + DEALLOCATE(ZPRES) + DEALLOCATE(ZEXNREF) + DEALLOCATE(ZZCPH) + DEALLOCATE(ZZW) + DEALLOCATE(ZLVFACT) + DEALLOCATE(ZRVSATW) + DEALLOCATE(ZCND) + END IF ! IMICRO +! + END IF ! end of adjustment procedure (test on OSUBG_COND) +! +! Remove cloud droplets if there are few + + ZMASK(:,:,:) = 0.0 + ZW(:,:,:) = 0. + WHERE (PRCS(:,:,:) <= ZRTMIN(2) .OR. PCCS(:,:,:) <= ZCTMIN(2)) + PRVS(:,:,:) = PRVS(:,:,:) + PRCS(:,:,:) + PTHS(:,:,:) = PTHS(:,:,:) - PRCS(:,:,:)*ZLV(:,:,:)/(ZCPH(:,:,:)*ZEXNS(:,:,:)) + PRCS(:,:,:) = 0.0 + ZW(:,:,:) = MAX(PCCS(:,:,:),0.) + PCCS(:,:,:) = 0.0 + END WHERE +! + ZW1(:,:,:) = 0. + IF (LWARM .AND. NMOD_CCN.GE.1) ZW1(:,:,:) = SUM(PNAS,DIM=4) + ZW (:,:,:) = MIN( ZW(:,:,:), ZW1(:,:,:) ) + ZW2(:,:,:) = 0. + WHERE ( ZW(:,:,:) > 0. ) + ZMASK(:,:,:) = 1.0 + ZW2(:,:,:) = ZW(:,:,:) / ZW1(:,:,:) + ENDWHERE +! + IF (LWARM .AND. NMOD_CCN.GE.1) THEN + DO JMOD = 1, NMOD_CCN + PNFS(:,:,:,JMOD) = PNFS(:,:,:,JMOD) + & + ZMASK(:,:,:) * PNAS(:,:,:,JMOD) * ZW2(:,:,:) + PNAS(:,:,:,JMOD) = PNAS(:,:,:,JMOD) - & + ZMASK(:,:,:) * PNAS(:,:,:,JMOD) * ZW2(:,:,:) + PNAS(:,:,:,JMOD) = MAX( 0.0 , PNAS(:,:,:,JMOD) ) + ENDDO + END IF +! + IF (LSCAV .AND. LAERO_MASS) PMAS(:,:,:) = PMAS(:,:,:) * (1-ZMASK(:,:,:)) +! +! +END DO ! end of the iterative loop +! +! +!* 5.2 compute the cloud fraction PCLDFR (binary !!!!!!!) +! +IF ( .NOT. OSUBG_COND ) THEN + WHERE (PRCS(:,:,:) + PRIS(:,:,:) + PRSS(:,:,:) > 1.E-12 / ZDT) + PCLDFR(:,:,:) = 1. + ELSEWHERE + PCLDFR(:,:,:) = 0. + ENDWHERE +END IF +! +IF ( SIZE(PSRCS,3) /= 0 ) THEN + WHERE (PRCS(:,:,:) + PRIS(:,:,:) > 1.E-12 / ZDT) + PSRCS(:,:,:) = 1. + ELSEWHERE + PSRCS(:,:,:) = 0. + ENDWHERE +END IF +! +IF ( OSUBG_COND ) THEN + ! + ! Mixing ratio change (cloud liquid water) + ! + ZW1(:,:,:) = (ZRC(:,:,:) - PRCS(:,:,:)*PTSTEP) / PTSTEP + WHERE( ZW1(:,:,:) < 0.0 ) + ZW1(:,:,:) = MAX ( ZW1(:,:,:), -PRCS(:,:,:) ) + ELSEWHERE + ZW1(:,:,:) = MIN ( ZW1(:,:,:), PRVS(:,:,:) ) + END WHERE + + WHERE (PCCT(:,:,:) < PCLDFR(:,:,:)*XCTMIN(2) .OR. ZRC(:,:,:)<PCLDFR(:,:,:)*XRTMIN(2)) + ZW1=-PRCS + PCCS=0. + PCLDFR=0. + END WHERE + + PRVS(:,:,:) = PRVS(:,:,:) - ZW1(:,:,:) + PRCS(:,:,:) = PRCS(:,:,:) + ZW1(:,:,:) + PCCS(:,:,:) = PCCT(:,:,:) / PTSTEP + PNFS(:,:,:,:) = PNFT(:,:,:,:) / PTSTEP + PNAS(:,:,:,:) = PNAT(:,:,:,:) / PTSTEP + PTHS(:,:,:) = PTHS(:,:,:) + & + ZW1(:,:,:) * ZLV(:,:,:) / (ZCPH(:,:,:) * PEXNREF(:,:,:)) +END IF ! fin test OSUBG_COND + +IF ( tpfile%lopened ) THEN + TZFIELD%CMNHNAME = 'NEB' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'NEB' + TZFIELD%CUNITS = '1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_NEB' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,PCLDFR) +END IF +! +! +!* 6. SAVE CHANGES IN PRS AND PSVS +! ---------------------------- +! +! +! Prepare 3D water mixing ratios +PRS(:,:,:,1) = PRVS(:,:,:) +IF ( KRR .GE. 2 ) PRS(:,:,:,2) = PRCS(:,:,:) +IF ( KRR .GE. 3 ) PRS(:,:,:,3) = PRRS(:,:,:) +IF ( KRR .GE. 4 ) PRS(:,:,:,4) = PRIS(:,:,:) +IF ( KRR .GE. 5 ) PRS(:,:,:,5) = PRSS(:,:,:) +IF ( KRR .GE. 6 ) PRS(:,:,:,6) = PRGS(:,:,:) +! +! Prepare 3D number concentrations +! +IF ( LWARM ) PSVS(:,:,:,NSV_LIMA_NC) = PCCS(:,:,:) +! IF ( LCOLD ) PSVS(:,:,:,NSV_LIMA_NI) = PCIS(:,:,:) +! +IF ( LSCAV .AND. LAERO_MASS ) PSVS(:,:,:,NSV_LIMA_SCAVMASS) = PMAS(:,:,:) +! +IF ( LWARM .AND. NMOD_CCN .GE. 1 ) THEN + PSVS(:,:,:,NSV_LIMA_CCN_FREE:NSV_LIMA_CCN_FREE+NMOD_CCN-1) = PNFS(:,:,:,:) + PSVS(:,:,:,NSV_LIMA_CCN_ACTI:NSV_LIMA_CCN_ACTI+NMOD_CCN-1) = PNAS(:,:,:,:) +END IF +! +! IF ( LCOLD .AND. NMOD_IFN .GE. 1 ) THEN +! PSVS(:,:,:,NSV_LIMA_IFN_FREE:NSV_LIMA_IFN_FREE+NMOD_IFN-1) = PIFS(:,:,:,:) +! PSVS(:,:,:,NSV_LIMA_IFN_NUCL:NSV_LIMA_IFN_NUCL+NMOD_IFN-1) = PINS(:,:,:,:) +! END IF +! +! IF ( LCOLD .AND. NMOD_IMM .GE. 1 ) THEN +! PSVS(:,:,:,NSV_LIMA_IMM_NUCL:NSV_LIMA_IMM_NUCL+NMOD_IMM-1) = PNIS(:,:,:,:) +! END IF +! +! write SSI in LFI +! +IF ( tpfile%lopened ) THEN + ZT(:,:,:) = ( PTHS(:,:,:) * ZDT ) * ZEXNS(:,:,:) + ZW(:,:,:) = EXP( XALPI - XBETAI/ZT(:,:,:) - XGAMI*ALOG(ZT(:,:,:) ) ) + ZW1(:,:,:)= 2.0*PPABST(:,:,:)-PPABSM(:,:,:) + ZW(:,:,:) = PRVT(:,:,:)*( ZW1(:,:,:)-ZW(:,:,:) ) / ( (XMV/XMD) * ZW(:,:,:) ) - 1.0 + + TZFIELD%CMNHNAME = 'SSI' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'SSI' + TZFIELD%CUNITS = '' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_SSI' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZW) +END IF +! +! +!* 7. STORE THE BUDGET TERMS +! ---------------------- +! +if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'CEDS', pths(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rv ) call Budget_store_end( tbudgets(NBUDGET_RV), 'CEDS', prvs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'CEDS', prcs(:, :, :) * prhodj(:, :, :) ) + !Remark: PRIS is not modified but source term kept for better coherence with lima_adjust and lima_notadjust + if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'CEDS', pris(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_sv ) then + if ( lwarm ) & + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'CEDS', pccs(:, :, :) * prhodj(:, :, :) ) + if ( lscav .and. laero_mass ) & + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_scavmass), 'CEDS', pmas(:, :, :) * prhodj(:, :, :) ) + if ( lwarm ) then + do jl = 1, nmod_ccn + idx = NBUDGET_SV1 - 1 + nsv_lima_ccn_free - 1 + jl + call Budget_store_end( tbudgets(idx), 'CEDS', pnfs(:, :, :, jl) * prhodj(:, :, :) ) + idx = NBUDGET_SV1 - 1 + nsv_lima_ccn_acti - 1 + jl + call Budget_store_end( tbudgets(idx), 'CEDS', pnas(:, :, :, jl) * prhodj(:, :, :) ) + end do + end if +! if ( lcold ) then +! call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'CEDS', pcis(:, :, :) * prhodj(:, :, :) ) +! do jl = 1, nmod_ifn +! idx = NBUDGET_SV1 - 1 + nsv_lima_ifn_free - 1 + jl +! call Budget_store_end( tbudgets(idx), 'CEDS', pifs(:, :, :, jl) * prhodj(:, :, :) ) +! idx = NBUDGET_SV1 - 1 + nsv_lima_ifn_nucl - 1 + jl +! call Budget_store_end( tbudgets(idx), 'CEDS', pins(:, :, :, jl) * prhodj(:, :, :) ) +! end do +! do jl = 1, nmod_imm +! idx = NBUDGET_SV1 - 1 + nsv_lima_imm_nucl - 1 + jl +! call Budget_store_init( tbudgets(idx), 'CEDS', pnis(:, :, :, jl) * prhodj(:, :, :) ) +! end do +! end if + end if +end if +!++cb++ +DEALLOCATE(ZRTMIN) +DEALLOCATE(ZCTMIN) +IF (ALLOCATED(PNFS)) DEALLOCATE(PNFS) +IF (ALLOCATED(PNAS)) DEALLOCATE(PNAS) +IF (ALLOCATED(PNFT)) DEALLOCATE(PNFT) +IF (ALLOCATED(PNAT)) DEALLOCATE(PNAT) +! IF (ALLOCATED(PIFS)) DEALLOCATE(PIFS) +! IF (ALLOCATED(PINS)) DEALLOCATE(PINS) +! IF (ALLOCATED(PNIS)) DEALLOCATE(PNIS) +!--cb-- +! +!------------------------------------------------------------------------------ +! +END SUBROUTINE LIMA_ADJUST_SPLIT diff --git a/src/mesonh/micro/lima_bergeron.f90 b/src/mesonh/micro/lima_bergeron.f90 new file mode 100644 index 000000000..9105c78d6 --- /dev/null +++ b/src/mesonh/micro/lima_bergeron.f90 @@ -0,0 +1,121 @@ +!MNH_LIC Copyright 2013-2018 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +! ################################# + MODULE MODI_LIMA_BERGERON +! ################################# +! +INTERFACE + SUBROUTINE LIMA_BERGERON (LDCOMPUTE, & + PRCT, PRIT, PCIT, PLBDI, & + PSSIW, PAI, PCJ, PLVFACT, PLSFACT, & + P_TH_BERFI, P_RC_BERFI, & + PA_TH, PA_RC, PA_RI ) +! +LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE +! +REAL, DIMENSION(:), INTENT(IN) :: PRCT ! Cloud water C. at t +REAL, DIMENSION(:), INTENT(IN) :: PRIT ! Cloud water C. at t +REAL, DIMENSION(:), INTENT(IN) :: PCIT ! Cloud water C. at t +REAL, DIMENSION(:), INTENT(IN) :: PLBDI ! +! +REAL, DIMENSION(:), INTENT(IN) :: PSSIW ! +REAL, DIMENSION(:), INTENT(IN) :: PAI ! +REAL, DIMENSION(:), INTENT(IN) :: PCJ ! +REAL, DIMENSION(:), INTENT(IN) :: PLVFACT ! +REAL, DIMENSION(:), INTENT(IN) :: PLSFACT ! +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_BERFI +REAL, DIMENSION(:), INTENT(INOUT) :: P_RC_BERFI +! +REAL, DIMENSION(:), INTENT(INOUT) :: PA_TH +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RC +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RI +!! +END SUBROUTINE LIMA_BERGERON +END INTERFACE +END MODULE MODI_LIMA_BERGERON +! +! ############################################################# + SUBROUTINE LIMA_BERGERON( LDCOMPUTE, & + PRCT, PRIT, PCIT, PLBDI, & + PSSIW, PAI, PCJ, PLVFACT, PLSFACT, & + P_TH_BERFI, P_RC_BERFI, & + PA_TH, PA_RC, PA_RI ) +! ############################################################# +! +!! PURPOSE +!! ------- +!! Compute the Bergeron-Findeisen process rate +!! +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * CNRM * +!! +!! MODIFICATIONS +!! ------------- +!! Original 15/03/2018 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCTMIN +USE MODD_PARAM_LIMA_COLD, ONLY : XDI, X0DEPI, X2DEPI +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE +! +REAL, DIMENSION(:), INTENT(IN) :: PRCT ! +REAL, DIMENSION(:), INTENT(IN) :: PRIT ! +REAL, DIMENSION(:), INTENT(IN) :: PCIT ! +REAL, DIMENSION(:), INTENT(IN) :: PLBDI ! +! +REAL, DIMENSION(:), INTENT(IN) :: PSSIW ! +REAL, DIMENSION(:), INTENT(IN) :: PAI ! +REAL, DIMENSION(:), INTENT(IN) :: PCJ ! +REAL, DIMENSION(:), INTENT(IN) :: PLVFACT ! +REAL, DIMENSION(:), INTENT(IN) :: PLSFACT ! +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_BERFI +REAL, DIMENSION(:), INTENT(INOUT) :: P_RC_BERFI +! +REAL, DIMENSION(:), INTENT(INOUT) :: PA_TH +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RC +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RI +! +!* 0.2 Declarations of local variables : +! +! +!------------------------------------------------------------------------------- +! +! +!* 1. Bergeron-Findeisen process +! -------------------------- +! +P_TH_BERFI(:) = 0.0 +P_RC_BERFI(:) = 0.0 +! +WHERE( (PRCT(:)>XRTMIN(2)) .AND. (PRIT(:)>XRTMIN(4)) .AND. (PCIT(:)>XCTMIN(4)) .AND. LDCOMPUTE(:)) + P_RC_BERFI(:) = - ( PSSIW(:) / PAI(:) ) * PCIT(:) * & + ( X0DEPI/PLBDI(:)+X2DEPI*PCJ(:)*PCJ(:)/PLBDI(:)**(XDI+2.0) ) + P_TH_BERFI(:) = - P_RC_BERFI(:)*(PLSFACT(:)-PLVFACT(:)) +END WHERE +! +PA_RC(:) = PA_RC(:) + P_RC_BERFI(:) +PA_RI(:) = PA_RI(:) - P_RC_BERFI(:) +PA_TH(:) = PA_TH(:) + P_TH_BERFI(:) +! +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE LIMA_BERGERON diff --git a/src/mesonh/micro/lima_ccn_activation.f90 b/src/mesonh/micro/lima_ccn_activation.f90 new file mode 100644 index 000000000..b7786ea4f --- /dev/null +++ b/src/mesonh/micro/lima_ccn_activation.f90 @@ -0,0 +1,835 @@ +!MNH_LIC Copyright 2013-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ############################### + MODULE MODI_LIMA_CCN_ACTIVATION +! ############################### +! +INTERFACE + SUBROUTINE LIMA_CCN_ACTIVATION (TPFILE, & + PRHODREF, PEXNREF, PPABST, PT, PDTHRAD, PW_NU, & + PTHT, PRVT, PRCT, PCCT, PRRT, PNFT, PNAT, & + PCLDFR ) +USE MODD_IO, ONLY: TFILEDATA +! +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PT ! Temperature +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTHRAD ! Radiative temperature tendency +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PW_NU ! updraft velocity used for + ! the nucleation param. +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHT ! Theta at t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PNFT ! CCN C. available at t +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PNAT ! CCN C. activated at t +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCLDFR ! Precipitation fraction +! +END SUBROUTINE LIMA_CCN_ACTIVATION +END INTERFACE +END MODULE MODI_LIMA_CCN_ACTIVATION +! ############################################################################# + SUBROUTINE LIMA_CCN_ACTIVATION (TPFILE, & + PRHODREF, PEXNREF, PPABST, PT, PDTHRAD, PW_NU, & + PTHT, PRVT, PRCT, PCCT, PRRT, PNFT, PNAT, & + PCLDFR ) +! ############################################################################# +! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the activation of CCN +!! according to Cohard and Pinty, QJRMS, 2000 +!! +!! +!!** METHOD +!! ------ +!! The activation of CCN is checked for quasi-saturated air parcels +!! to update the cloud droplet number concentration. +!! +!! Computation steps : +!! 1- Check where computations are necessary +!! 2- and 3- Compute the maximum of supersaturation using the iterative +!! Ridder algorithm +!! 4- Compute the nucleation source +!! 5- Deallocate local variables +!! +!! Contains : +!! 6- Functions : Ridder algorithm +!! +!! +!! REFERENCE +!! --------- +!! +!! Cohard, J.-M. and J.-P. Pinty, 2000: A comprehensive two-moment warm +!! microphysical bulk scheme. +!! Part I: Description and tests +!! Part II: 2D experiments with a non-hydrostatic model +!! Accepted for publication in Quart. J. Roy. Meteor. Soc. +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +! B. Vie 03/03/2020: use DTHRAD instead of dT/dt in Smax diagnostic computation +! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg +! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST, ONLY: XALPW, XBETAW, XCL, XCPD, XCPV, XGAMW, XLVTT, XMD, XMNH_EPSILON, XMV, XRV, XTT +use modd_field, only: TFIELDDATA, TYPEREAL +USE MODD_IO, ONLY: TFILEDATA +USE MODD_LUNIT_n, ONLY: TLUOUT +USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT +USE MODD_PARAM_LIMA, ONLY: LACTIT, NMOD_CCN, XCTMIN, XKHEN_MULTI, XRTMIN, XLIMIT_FACTOR +USE MODD_PARAM_LIMA_WARM, ONLY: XWMIN, NAHEN, NHYP, XAHENINTP1, XAHENINTP2, XCSTDCRIT, XHYPF12, & + XHYPINTP1, XHYPINTP2, XTMIN, XHYPF32, XPSI3, XAHENG, XAHENG2, XPSI1, & + XLBC, XLBEXC +USE MODD_TURB_n, ONLY: LSUBG_COND + +USE MODE_IO_FIELD_WRITE, only: IO_Field_write +use mode_tools, only: Countjv + +USE MODI_GAMMA + +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PT ! Temperature +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTHRAD ! Radiative temperature tendency +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PW_NU ! updraft velocity used for + ! the nucleation param. +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHT ! Theta at t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PNFT ! CCN C. available at t +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PNAT ! CCN C. activated at t +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCLDFR ! Precipitation fraction +! +!* 0.1 Declarations of local variables : +! +! Packing variables +LOGICAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) :: GNUCT +INTEGER :: INUCT +INTEGER , DIMENSION(SIZE(GNUCT)) :: I1,I2,I3 ! Used to replace the COUNT +INTEGER :: JL ! and PACK intrinsics +! +! Packed micophysical variables +REAL, DIMENSION(:) , ALLOCATABLE :: ZRCT ! cloud mr +REAL, DIMENSION(:) , ALLOCATABLE :: ZCCT ! cloud conc. +REAL, DIMENSION(:,:), ALLOCATABLE :: ZNFT ! available nucleus conc. +REAL, DIMENSION(:,:), ALLOCATABLE :: ZNAT ! activated nucleus conc. +! +! Other packed variables +REAL, DIMENSION(:) , ALLOCATABLE :: ZRHODREF ! RHO Dry REFerence +REAL, DIMENSION(:) , ALLOCATABLE :: ZEXNREF ! EXNer Pressure REFerence +REAL, DIMENSION(:) , ALLOCATABLE :: ZZT ! Temperature +! +! Work arrays +REAL, DIMENSION(:), ALLOCATABLE :: ZZW1, ZZW2, ZZW3, ZZW4, ZZW5, ZZW6, & + ZZTDT, & ! dT/dt + ZSW, & ! real supersaturation + ZSMAX, & ! Maximum supersaturation + ZVEC1 +! +REAL, DIMENSION(:,:), ALLOCATABLE :: ZTMP, ZCHEN_MULTI +! +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: ZTDT, ZDRC, ZRVSAT, ZW, ZW2 +REAL, DIMENSION(SIZE(PNFT,1),SIZE(PNFT,2),SIZE(PNFT,3)) & + :: ZCONC_TOT ! total CCN C. available +! +INTEGER, DIMENSION(:), ALLOCATABLE :: IVEC1 ! Vectors of indices for + ! interpolations +! +! +REAL :: ZEPS ! molar mass ratio +REAL :: ZS1, ZS2, ZXACC +INTEGER :: JMOD +INTEGER :: IIB, IIE, IJB, IJE, IKB, IKE ! Physical domain +! +INTEGER :: ILUOUT ! Logical unit of output listing +TYPE(TFIELDDATA) :: TZFIELD +!------------------------------------------------------------------------------- +! +ILUOUT = TLUOUT%NLU +! +!* 1. PREPARE COMPUTATIONS - PACK +! --------------------------- +! +IIB=1+JPHEXT +IIE=SIZE(PRHODREF,1) - JPHEXT +IJB=1+JPHEXT +IJE=SIZE(PRHODREF,2) - JPHEXT +IKB=1+JPVEXT +IKE=SIZE(PRHODREF,3) - JPVEXT +! +! Saturation vapor mixing ratio and radiative tendency +! +ZEPS= XMV / XMD +ZRVSAT(:,:,:) = ZEPS / (PPABST(:,:,:)*EXP(-XALPW+XBETAW/PT(:,:,:)+XGAMW*ALOG(PT(:,:,:))) - 1.0) +ZTDT(:,:,:) = 0. +IF (LACTIT .AND. SIZE(PDTHRAD).GT.0) ZTDT(:,:,:) = PDTHRAD(:,:,:) * PEXNREF(:,:,:) +! +! find locations where CCN are available +! +ZCONC_TOT(:,:,:) = 0.0 +DO JMOD = 1, NMOD_CCN + ZCONC_TOT(:,:,:) = ZCONC_TOT(:,:,:) + PNFT(:,:,:,JMOD) ! sum over the free CCN +ENDDO +! +! optimization by looking for locations where +! the updraft velocity is positive!!! +! +GNUCT(:,:,:) = .FALSE. +! +GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) = PW_NU(IIB:IIE,IJB:IJE,IKB:IKE)>XWMIN & + .OR. PRVT(IIB:IIE,IJB:IJE,IKB:IKE)>ZRVSAT(IIB:IIE,IJB:IJE,IKB:IKE) +IF (LACTIT) GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) = GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) & + .OR. ZTDT(IIB:IIE,IJB:IJE,IKB:IKE)<XTMIN +! +GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) = GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) & + .AND. PT(IIB:IIE,IJB:IJE,IKB:IKE)>(XTT-22.) & + .AND. ZCONC_TOT(IIB:IIE,IJB:IJE,IKB:IKE)>XCTMIN(2) +! +IF (LSUBG_COND) GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) = GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) & + .AND. PCLDFR(IIB:IIE,IJB:IJE,IKB:IKE)>0.01 +IF (.NOT. LSUBG_COND) GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) = GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) & + .AND. PRVT(IIB:IIE,IJB:IJE,IKB:IKE).GE.ZRVSAT(IIB:IIE,IJB:IJE,IKB:IKE) +! + + +INUCT = COUNTJV( GNUCT(:,:,:),I1(:),I2(:),I3(:)) +! +IF( INUCT >= 1 ) THEN +! + ALLOCATE(ZNFT(INUCT,NMOD_CCN)) + ALLOCATE(ZNAT(INUCT,NMOD_CCN)) + ALLOCATE(ZTMP(INUCT,NMOD_CCN)) + ALLOCATE(ZRCT(INUCT)) + ALLOCATE(ZCCT(INUCT)) + ALLOCATE(ZZT(INUCT)) + ALLOCATE(ZZTDT(INUCT)) + ALLOCATE(ZSW(INUCT)) + ALLOCATE(ZZW1(INUCT)) + ALLOCATE(ZZW2(INUCT)) + ALLOCATE(ZZW3(INUCT)) + ALLOCATE(ZZW4(INUCT)) + ALLOCATE(ZZW5(INUCT)) + ALLOCATE(ZZW6(INUCT)) + ALLOCATE(ZCHEN_MULTI(INUCT,NMOD_CCN)) + ALLOCATE(ZVEC1(INUCT)) + ALLOCATE(IVEC1(INUCT)) + ALLOCATE(ZRHODREF(INUCT)) + ALLOCATE(ZEXNREF(INUCT)) + DO JL=1,INUCT + ZRCT(JL) = PRCT(I1(JL),I2(JL),I3(JL))/PCLDFR(I1(JL),I2(JL),I3(JL)) + ZCCT(JL) = PCCT(I1(JL),I2(JL),I3(JL))/PCLDFR(I1(JL),I2(JL),I3(JL)) + ZZT(JL) = PT(I1(JL),I2(JL),I3(JL)) + ZZW1(JL) = ZRVSAT(I1(JL),I2(JL),I3(JL)) + ZZW2(JL) = PW_NU(I1(JL),I2(JL),I3(JL)) + ZZTDT(JL) = ZTDT(I1(JL),I2(JL),I3(JL)) + ZSW(JL) = PRVT(I1(JL),I2(JL),I3(JL))/ZRVSAT(I1(JL),I2(JL),I3(JL)) - 1. + ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) + ZEXNREF(JL) = PEXNREF(I1(JL),I2(JL),I3(JL)) + DO JMOD = 1,NMOD_CCN + ZNFT(JL,JMOD) = PNFT(I1(JL),I2(JL),I3(JL),JMOD) + ZNAT(JL,JMOD) = PNAT(I1(JL),I2(JL),I3(JL),JMOD) + ZCHEN_MULTI(JL,JMOD) = (ZNFT(JL,JMOD)+ZNAT(JL,JMOD))*ZRHODREF(JL) & + / XLIMIT_FACTOR(JMOD) + ENDDO + ENDDO +! + ZZW1(:) = 1.0/ZEPS + 1.0/ZZW1(:) & + + (((XLVTT+(XCPV-XCL)*(ZZT(:)-XTT))/ZZT(:))**2)/(XCPD*XRV) ! Psi2 +! +! +!------------------------------------------------------------------------------- +! +! +!* 2. compute the constant term (ZZW3) relative to smax +! ---------------------------------------------------- +! +! Remark : in LIMA's nucleation parameterization, Smax=0.01 for a supersaturation of 1% ! +! +! + ZVEC1(:) = MAX( 1.0001, MIN( REAL(NAHEN)-0.0001, XAHENINTP1 * ZZT(:) + XAHENINTP2 ) ) + IVEC1(:) = INT( ZVEC1(:) ) + ZVEC1(:) = ZVEC1(:) - REAL( IVEC1(:) ) + ALLOCATE(ZSMAX(INUCT)) +! +! + IF (LACTIT) THEN ! including a cooling rate +! +! Compute the tabulation of function of ZZW3 : +! +! (Psi1*w+Psi3*DT/Dt)**1.5 +! ZZW3 = XAHENG*(Psi1*w + Psi3*DT/Dt)**1.5 = ------------------------ +! 2*pi*rho_l*G**(3/2) +! +! + ZZW4(:)=XPSI1( IVEC1(:)+1)*ZZW2(:)+XPSI3(IVEC1(:)+1)*ZZTDT(:) + ZZW5(:)=XPSI1( IVEC1(:) )*ZZW2(:)+XPSI3(IVEC1(:) )*ZZTDT(:) + WHERE (ZZW4(:) < 0. .OR. ZZW5(:) < 0.) + ZZW4(:) = 0. + ZZW5(:) = 0. + END WHERE + ZZW3(:) = XAHENG( IVEC1(:)+1)*(ZZW4(:)**1.5)* ZVEC1(:) & + - XAHENG( IVEC1(:) )*(ZZW5(:)**1.5)*(ZVEC1(:) - 1.0) + ! Cste*((Psi1*w+Psi3*dT/dt)/(G))**1.5 + ZZW6(:) = XAHENG2( IVEC1(:)+1)*(ZZW4(:)**0.5)* ZVEC1(:) & + - XAHENG2( IVEC1(:) )*(ZZW5(:)**0.5)*(ZVEC1(:) - 1.0) +! +! + ELSE ! LACTIT , for clouds +! +! +! Compute the tabulation of function of ZZW3 : +! +! (Psi1 * w)**1.5 +! ZZW3 = XAHENG * (Psi1 * w)**1.5 = ------------------------- +! 2 pi rho_l * G**(3/2) +! +! + ZZW2(:)=MAX(ZZW2(:),0.) + ZZW3(:)=XAHENG(IVEC1(:)+1)*((XPSI1(IVEC1(:)+1)*ZZW2(:))**1.5)* ZVEC1(:) & + -XAHENG(IVEC1(:) )*((XPSI1(IVEC1(:) )*ZZW2(:))**1.5)*(ZVEC1(:)-1.0) +! + ZZW6(:)=XAHENG2(IVEC1(:)+1)*((XPSI1(IVEC1(:)+1)*ZZW2(:))**0.5)* ZVEC1(:) & + -XAHENG2(IVEC1(:) )*((XPSI1(IVEC1(:) )*ZZW2(:))**0.5)*(ZVEC1(:)-1.0) +! + END IF ! LACTIT +! +! +! (Psi1*w+Psi3*DT/Dt)**1.5 rho_air +! ZZW3 = ------------------------ * ------- +! 2*pi*rho_l*G**(3/2) Psi2 +! + ZZW5(:) = 1. + ZZW3(:) = (ZZW3(:)/ZZW1(:))*ZRHODREF(:) ! R.H.S. of Eq 9 of CPB 98 but + ! for multiple aerosol modes + WHERE (ZRCT(:) > XRTMIN(2) .AND. ZCCT(:) > XCTMIN(2)) + ZZW6(:) = ZZW6(:) * ZRHODREF(:) * ZCCT(:) / (XLBC*ZCCT(:)/ZRCT(:))**XLBEXC + ELSEWHERE + ZZW6(:)=0. + END WHERE + + WHERE (ZZW3(:) == 0. .AND. .NOT.(ZSW>0.)) + ZZW5(:) = -1. + END WHERE +! +!------------------------------------------------------------------------------- +! +! +!* 3. Compute the maximum of supersaturation +! ----------------------------------------- +! +! +! estimate S_max for the CPB98 parameterization with SEVERAL aerosols mode +! Reminder : Smax=0.01 for a 1% supersaturation +! +! Interval bounds to tabulate sursaturation Smax +! Check with values used for tabulation in ini_lima_warm.f90 + ZS1 = 1.0E-5 ! corresponds to 0.001% supersaturation + ZS2 = 5.0E-2 ! corresponds to 5.0% supersaturation + ZXACC = 1.0E-10 ! Accuracy needed for the search in [NO UNITS] +! + ZSMAX(:) = ZRIDDR(ZS1,ZS2,ZXACC,ZZW3(:),ZZW6(:),INUCT) ! ZSMAX(:) is in [NO UNITS] + ZSMAX(:) = MIN(MAX(ZSMAX(:), ZSW(:)),ZS2) +! +! +!------------------------------------------------------------------------------- +! +! +!* 4. Compute the nucleus source +! ----------------------------- +! +! +! Again : Smax=0.01 for a 1% supersaturation +! Modified values for Beta and C (see in init_aerosol_properties) account for that +! + WHERE (ZZW5(:) > 0. .AND. ZSMAX(:) > 0.) + ZVEC1(:) = MAX( 1.0001, MIN( REAL(NHYP)-0.0001, XHYPINTP1*LOG(ZSMAX(:))+XHYPINTP2 ) ) + IVEC1(:) = INT( ZVEC1(:) ) + ZVEC1(:) = ZVEC1(:) - REAL( IVEC1(:) ) + END WHERE + ZZW6(:) = 0. ! initialize the change of cloud droplet concentration +! + ZTMP(:,:)=0.0 +! +! Compute the concentration of activable aerosols for each mode +! based on the max of supersaturation ( -> ZTMP ) +! + DO JMOD = 1, NMOD_CCN ! iteration on mode number + ZZW1(:) = 0. + ZZW2(:) = 0. + ZZW3(:) = 0. + ! + WHERE( ZZW5(:) > 0. .AND. ZSMAX(:)>0.0 ) + ZZW2(:) = XHYPF12( IVEC1(:)+1,JMOD )* ZVEC1(:) & ! hypergeo function + - XHYPF12( IVEC1(:) ,JMOD )*(ZVEC1(:) - 1.0) ! XHYPF12 is tabulated + ! + ZTMP(:,JMOD) = ZCHEN_MULTI(:,JMOD)/ZRHODREF(:)*ZSMAX(:)**XKHEN_MULTI(JMOD)*ZZW2(:) + ENDWHERE + ENDDO +! +! Compute the concentration of aerosols activated at this time step +! as the difference between ZTMP and the aerosols already activated at t-dt (ZZW1) +! + DO JMOD = 1, NMOD_CCN ! iteration on mode number + ZZW1(:) = 0. + ZZW2(:) = 0. + ZZW3(:) = 0. + ! + WHERE( SUM(ZTMP(:,:),DIM=2) .GT. 0.01E6/ZRHODREF(:) ) + ZZW1(:) = MIN( ZNFT(:,JMOD),MAX( ZTMP(:,JMOD)- ZNAT(:,JMOD) , 0.0 ) ) + ENDWHERE + ! + !* update the concentration of activated CCN = Na + ! + PNAT(:,:,:,JMOD) = PNAT(:,:,:,JMOD) + PCLDFR(:,:,:) * UNPACK( ZZW1(:), MASK=GNUCT(:,:,:), FIELD=0.0 ) + ! + !* update the concentration of free CCN = Nf + ! + PNFT(:,:,:,JMOD) = PNFT(:,:,:,JMOD) - PCLDFR(:,:,:) * UNPACK( ZZW1(:), MASK=GNUCT(:,:,:), FIELD=0.0 ) + ! + !* prepare to update the cloud water concentration + ! + ZZW6(:) = ZZW6(:) + ZZW1(:) + ENDDO +! +! Output tendencies +! + ZZW1(:)=0. + WHERE (ZZW5(:)>0.0 .AND. ZSMAX(:)>0.0) ! ZZW1 is computed with ZSMAX [NO UNIT] + ZZW1(:) = MIN(XCSTDCRIT*ZZW6(:)/(((ZZT(:)*ZSMAX(:))**3)*ZRHODREF(:)),1.E-5) + END WHERE +! + IF (.NOT.LSUBG_COND) THEN + ZW(:,:,:) = MIN( UNPACK( ZZW1(:),MASK=GNUCT(:,:,:),FIELD=0.0 ),PRVT(:,:,:) ) + PTHT(:,:,:) = PTHT(:,:,:) + ZW(:,:,:) * (XLVTT+(XCPV-XCL)*(PT(:,:,:)-XTT))/ & + (PEXNREF(:,:,:)*(XCPD+XCPV*PRVT(:,:,:)+XCL*(PRCT(:,:,:)+PRRT(:,:,:)))) + PRVT(:,:,:) = PRVT(:,:,:) - ZW(:,:,:) + PRCT(:,:,:) = PRCT(:,:,:) + ZW(:,:,:) + PCCT(:,:,:) = PCCT(:,:,:) + UNPACK( ZZW6(:),MASK=GNUCT(:,:,:),FIELD=0. ) + ELSE + ZW(:,:,:) = MIN( PCLDFR(:,:,:) * UNPACK( ZZW1(:),MASK=GNUCT(:,:,:),FIELD=0.0 ),PRVT(:,:,:) ) + PCCT(:,:,:) = PCCT(:,:,:) + PCLDFR(:,:,:) * UNPACK( ZZW6(:),MASK=GNUCT(:,:,:),FIELD=0. ) + END IF +! + ZW(:,:,:) = UNPACK( 100.0*ZSMAX(:),MASK=GNUCT(:,:,:),FIELD=0.0 ) + ZW2(:,:,:) = PCLDFR(:,:,:) * UNPACK( ZZW6(:),MASK=GNUCT(:,:,:),FIELD=0.0 ) +! +! +!------------------------------------------------------------------------------- +! +! +!* 5. Cleaning +! ----------- +! +! + DEALLOCATE(IVEC1) + DEALLOCATE(ZVEC1) + DEALLOCATE(ZNFT) + DEALLOCATE(ZNAT) + DEALLOCATE(ZCCT) + DEALLOCATE(ZRCT) + DEALLOCATE(ZZT) + DEALLOCATE(ZSMAX) + DEALLOCATE(ZZW1) + DEALLOCATE(ZZW2) + DEALLOCATE(ZZW3) + DEALLOCATE(ZZW4) + DEALLOCATE(ZZW5) + DEALLOCATE(ZZW6) + DEALLOCATE(ZZTDT) + DEALLOCATE(ZSW) + DEALLOCATE(ZRHODREF) + DEALLOCATE(ZCHEN_MULTI) + DEALLOCATE(ZEXNREF) +! +END IF ! INUCT +! +IF ( tpfile%lopened ) THEN + IF ( INUCT == 0 ) THEN + ZW (:,:,:) = 0. + ZW2(:,:,:) = 0. + END IF + + TZFIELD%CMNHNAME ='SMAX' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CUNITS = '' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_SMAX' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZW) + ! + TZFIELD%CMNHNAME ='NACT' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CUNITS = 'kg-1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_NACT' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZW2) +END IF +! +! +!------------------------------------------------------------------------------- +! +! +!* 6. Functions used to compute the maximum of supersaturation +! ----------------------------------------------------------- +! +! +CONTAINS +!------------------------------------------------------------------------------ +! + FUNCTION ZRIDDR(PX1,PX2INIT,PXACC,PZZW3,PZZW6,NPTS) RESULT(PZRIDDR) +! +! +!!**** *ZRIDDR* - iterative algorithm to find root of a function +!! +!! +!! PURPOSE +!! ------- +!! The purpose of this function is to find the root of a given function +!! the arguments are the brackets bounds (the interval where to find the root) +!! the accuracy needed and the input parameters of the given function. +!! Using Ridders' method, return the root of a function known to lie between +!! PX1 and PX2. The root, returned as PZRIDDR, will be refined to an approximate +!! accuracy PXACC. +!! +!!** METHOD +!! ------ +!! Ridders' method +!! +!! EXTERNAL +!! -------- +!! FUNCSMAX +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! NUMERICAL RECIPES IN FORTRAN 77: THE ART OF SCIENTIFIC COMPUTING +!! (ISBN 0-521-43064-X) +!! Copyright (C) 1986-1992 by Cambridge University Press. +!! Programs Copyright (C) 1986-1992 by Numerical Recipes Software. +!! +!! AUTHOR +!! ------ +!! Frederick Chosson *CERFACS* +!! +!! MODIFICATIONS +!! ------------- +!! Original 12/07/07 +!! S.BERTHET 2008 vectorization +!------------------------------------------------------------------------------ +! +!* 0. DECLARATIONS +! +! +use mode_msg +! +IMPLICIT NONE +! +!* 0.1 declarations of arguments and result +! +INTEGER, INTENT(IN) :: NPTS +REAL, DIMENSION(:), INTENT(IN) :: PZZW3 +REAL, DIMENSION(:), INTENT(IN) :: PZZW6 +REAL, INTENT(IN) :: PX1, PX2INIT, PXACC +REAL, DIMENSION(:), ALLOCATABLE :: PZRIDDR +! +!* 0.2 declarations of local variables +! +! +INTEGER, PARAMETER :: MAXIT=60 +REAL, PARAMETER :: UNUSED=0.0 !-1.11e30 +REAL, DIMENSION(:), ALLOCATABLE :: fh,fl, fm,fnew +REAL :: s,xh,xl,xm,xnew +REAL :: PX2 +INTEGER :: j, JL +! +ALLOCATE( fh(NPTS)) +ALLOCATE( fl(NPTS)) +ALLOCATE( fm(NPTS)) +ALLOCATE(fnew(NPTS)) +ALLOCATE(PZRIDDR(NPTS)) +! +PZRIDDR(:)= UNUSED +PX2 = PX2INIT +fl(:) = FUNCSMAX(PX1,PZZW3(:),PZZW6(:),NPTS) +fh(:) = FUNCSMAX(PX2,PZZW3(:),PZZW6(:),NPTS) +! +DO JL = 1, NPTS + PX2 = PX2INIT +100 if ((fl(JL) > 0.0 .and. fh(JL) < 0.0) .or. (fl(JL) < 0.0 .and. fh(JL) > 0.0)) then + xl = PX1 + xh = PX2 + do j=1,MAXIT + xm = 0.5*(xl+xh) + fm(JL) = SINGL_FUNCSMAX(xm,PZZW3(JL),PZZW6(JL),JL) + s = sqrt(fm(JL)**2-fl(JL)*fh(JL)) + if (s == 0.0) then + GO TO 101 + endif + xnew = xm+(xm-xl)*(sign(1.0,fl(JL)-fh(JL))*fm(JL)/s) + if (abs(xnew - PZRIDDR(JL)) <= PXACC) then + GO TO 101 + endif + PZRIDDR(JL) = xnew + fnew(JL) = SINGL_FUNCSMAX(PZRIDDR(JL),PZZW3(JL),PZZW6(JL),JL) + if (fnew(JL) == 0.0) then + GO TO 101 + endif + if (sign(fm(JL),fnew(JL)) /= fm(JL)) then + xl =xm + fl(JL)=fm(JL) + xh =PZRIDDR(JL) + fh(JL)=fnew(JL) + else if (sign(fl(JL),fnew(JL)) /= fl(JL)) then + xh =PZRIDDR(JL) + fh(JL)=fnew(JL) + else if (sign(fh(JL),fnew(JL)) /= fh(JL)) then + xl =PZRIDDR(JL) + fl(JL)=fnew(JL) + else if (PX2 .lt. 0.05) then + PX2 = PX2 + 1.0E-2 + PRINT*, 'PX2 ALWAYS too small, we put a greater one : PX2 =',PX2 + fh(JL) = SINGL_FUNCSMAX(PX2,PZZW3(JL),PZZW6(JL),JL) + go to 100 + end if + if (abs(xh-xl) <= PXACC) then + GO TO 101 + endif +!!SB +!!$ if (j == MAXIT .and. (abs(xh-xl) > PXACC) ) then +!!$ PZRIDDR(JL)=0.0 +!!$ go to 101 +!!$ endif +!!SB + end do + call Print_msg( NVERB_FATAL, 'GEN', 'ZRIDDR', 'exceeded maximum iterations' ) + else if (fl(JL) == 0.0) then + PZRIDDR(JL)=PX1 + else if (fh(JL) == 0.0) then + PZRIDDR(JL)=PX2 + else if (PX2 .lt. 0.05) then + PX2 = PX2 + 1.0E-2 + PRINT*, 'PX2 too small, we put a greater one : PX2 =',PX2 + fh(JL) = SINGL_FUNCSMAX(PX2,PZZW3(JL),PZZW6(JL),JL) + go to 100 + else +!!$ print*, 'PZRIDDR: root must be bracketed' +!!$ print*,'npts ',NPTS,'jl',JL +!!$ print*, 'PX1,PX2,fl,fh',PX1,PX2,fl(JL),fh(JL) +!!$ print*, 'PX2 = 30 % of supersaturation, there is no solution for Smax' +!!$ print*, 'try to put greater PX2 (upper bound for Smax research)' +!!$ STOP + PZRIDDR(JL)=0.0 + go to 101 + end if +101 ENDDO +! +DEALLOCATE( fh) +DEALLOCATE( fl) +DEALLOCATE( fm) +DEALLOCATE(fnew) +! +END FUNCTION ZRIDDR +! +!------------------------------------------------------------------------------ +! + FUNCTION FUNCSMAX(PPZSMAX,PPZZW3,PPZZW6,NPTS) RESULT(PFUNCSMAX) +! +! +!!**** *FUNCSMAX* - function describing SMAX function that you want to find the root +!! +!! +!! PURPOSE +!! ------- +!! This function describe the equilibrium between Smax and two aerosol mode +!! acting as CCN. This function is derive from eq. (9) of CPB98 but for two +!! aerosols mode described by their respective parameters C, k, Mu, Beta. +!! the arguments are the supersaturation in "no unit" and the r.h.s. of this eq. +!! and the ratio of concentration of injected aerosols on maximum concentration +!! of injected aerosols ever. +!!** METHOD +!! ------ +!! This function is called by zriddr.f90 +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_PARAM_LIMA_WARM +!! XHYPF32 +!! +!! XHYPINTP1 +!! XHYPINTP2 +!! +!! Module MODD_PARAM_C2R2 +!! XKHEN_MULTI() +!! NMOD_CCN +!! +!! REFERENCE +!! --------- +!! Cohard, J.M., J.P.Pinty, K.Suhre, 2000:"On the parameterization of activation +!! spectra from cloud condensation nuclei microphysical properties", +!! J. Geophys. Res., Vol.105, N0.D9, pp. 11753-11766 +!! +!! AUTHOR +!! ------ +!! Frederick Chosson *CERFACS* +!! +!! MODIFICATIONS +!! ------------- +!! Original 12/07/07 +!! S.Berthet 19/03/08 Extension a une population multimodale d aerosols +! +!------------------------------------------------------------------------------ +! +!* 0. DECLARATIONS +! +IMPLICIT NONE +! +!* 0.1 declarations of arguments and result +! +INTEGER, INTENT(IN) :: NPTS +REAL, INTENT(IN) :: PPZSMAX ! supersaturation is already in no units +REAL, DIMENSION(:), INTENT(IN) :: PPZZW3 ! +REAL, DIMENSION(:), INTENT(IN) :: PPZZW6 ! +REAL, DIMENSION(:), ALLOCATABLE :: PFUNCSMAX ! +! +!* 0.2 declarations of local variables +! +REAL :: ZHYPF +! +REAL :: PZVEC1 +INTEGER :: PIVEC1 +! +ALLOCATE(PFUNCSMAX(NPTS)) +! +PFUNCSMAX(:) = 0. +PZVEC1 = MAX( ( 1.0 + 10.0 * XMNH_EPSILON ) ,MIN( REAL(NHYP)*( 1.0 - 10.0 * XMNH_EPSILON ) , & + XHYPINTP1*LOG(PPZSMAX)+XHYPINTP2 ) ) +PIVEC1 = INT( PZVEC1 ) +PZVEC1 = PZVEC1 - REAL( PIVEC1 ) +DO JMOD = 1, NMOD_CCN + ZHYPF = 0. ! XHYPF32 is tabulated with ZSMAX in [NO UNITS] + ZHYPF = XHYPF32( PIVEC1+1,JMOD ) * PZVEC1 & + - XHYPF32( PIVEC1 ,JMOD ) *(PZVEC1 - 1.0) + ! sum of s**(ki+2) * F32 * Ci * ki * beta(ki/2,3/2) + PFUNCSMAX(:) = PFUNCSMAX(:) + (PPZSMAX)**(XKHEN_MULTI(JMOD) + 2) & + * ZHYPF* XKHEN_MULTI(JMOD) * ZCHEN_MULTI(:,JMOD) & + * GAMMA_X0D( XKHEN_MULTI(JMOD)/2.0)*GAMMA_X0D(3.0/2.0) & + / GAMMA_X0D((XKHEN_MULTI(JMOD)+3.0)/2.0) +ENDDO +! function l.h.s. minus r.h.s. of eq. (9) of CPB98 but for NMOD_CCN aerosol mode +PFUNCSMAX(:) = PFUNCSMAX(:) + PPZZW6(:)*PPZSMAX - PPZZW3(:) +! +END FUNCTION FUNCSMAX +! +!------------------------------------------------------------------------------ +! + FUNCTION SINGL_FUNCSMAX(PPZSMAX,PPZZW3,PPZZW6,KINDEX) RESULT(PSINGL_FUNCSMAX) +! +! +!!**** *SINGL_FUNCSMAX* - same function as FUNCSMAX +!! +!! +!! PURPOSE +!! ------- +! As for FUNCSMAX but for a scalar +!! +!!** METHOD +!! ------ +!! This function is called by zriddr.f90 +!! +!------------------------------------------------------------------------------ +! +!* 0. DECLARATIONS +! +IMPLICIT NONE +! +!* 0.1 declarations of arguments and result +! +INTEGER, INTENT(IN) :: KINDEX +REAL, INTENT(IN) :: PPZSMAX ! supersaturation is "no unit" +REAL, INTENT(IN) :: PPZZW3 ! +REAL, INTENT(IN) :: PPZZW6 ! +REAL :: PSINGL_FUNCSMAX ! +! +!* 0.2 declarations of local variables +! +REAL :: ZHYPF +! +REAL :: PZVEC1 +INTEGER :: PIVEC1 +! +PSINGL_FUNCSMAX = 0. +PZVEC1 = MAX( 1.0001,MIN( REAL(NHYP)-0.0001, & + XHYPINTP1*LOG(PPZSMAX)+XHYPINTP2 ) ) +PIVEC1 = INT( PZVEC1 ) +PZVEC1 = PZVEC1 - REAL( PIVEC1 ) +DO JMOD = 1, NMOD_CCN + ZHYPF = 0. ! XHYPF32 is tabulated with ZSMAX in [NO UNITS] + ZHYPF = XHYPF32( PIVEC1+1,JMOD ) * PZVEC1 & + - XHYPF32( PIVEC1 ,JMOD ) *(PZVEC1 - 1.0) + ! sum of s**(ki+2) * F32 * Ci * ki * bêta(ki/2,3/2) + PSINGL_FUNCSMAX = PSINGL_FUNCSMAX + (PPZSMAX)**(XKHEN_MULTI(JMOD) + 2) & + * ZHYPF* XKHEN_MULTI(JMOD) * ZCHEN_MULTI(KINDEX,JMOD) & + * GAMMA_X0D( XKHEN_MULTI(JMOD)/2.0)*GAMMA_X0D(3.0/2.0) & + / GAMMA_X0D((XKHEN_MULTI(JMOD)+3.0)/2.0) +ENDDO +! function l.h.s. minus r.h.s. of eq. (9) of CPB98 but for NMOD_CCN aerosol mode +PSINGL_FUNCSMAX = PSINGL_FUNCSMAX + PPZZW6*PPZSMAX - PPZZW3 +! +END FUNCTION SINGL_FUNCSMAX +! +!----------------------------------------------------------------------------- +! +END SUBROUTINE LIMA_CCN_ACTIVATION diff --git a/src/mesonh/micro/lima_ccn_hom_freezing.f90 b/src/mesonh/micro/lima_ccn_hom_freezing.f90 new file mode 100644 index 000000000..86b7a9408 --- /dev/null +++ b/src/mesonh/micro/lima_ccn_hom_freezing.f90 @@ -0,0 +1,397 @@ +!MNH_LIC Copyright 2013-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!------------------------------------------------------------------------------- +! ################################# + MODULE MODI_LIMA_CCN_HOM_FREEZING +! ################################# +! +INTERFACE + SUBROUTINE LIMA_CCN_HOM_FREEZING (PRHODREF, PEXNREF, PPABST, PW_NU, & + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & + PCCT, PCRT, PCIT, PNFT, PNHT, & + PICEFR ) +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PW_NU ! updraft velocity used for + ! the nucleation param. +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHT ! Theta at time t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRIT ! Cloud ice m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGT ! Graupel m.r. at t +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCCT ! Cloud water C. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCRT ! Rain water C. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIT ! Ice crystal C. source +! +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PNFT ! Free CCN conc. +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PNHT ! haze homogeneous freezing +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PICEFR ! Ice fraction +! +END SUBROUTINE LIMA_CCN_HOM_FREEZING +END INTERFACE +END MODULE MODI_LIMA_CCN_HOM_FREEZING +! +! ########################################################################## + SUBROUTINE LIMA_CCN_HOM_FREEZING (PRHODREF, PEXNREF, PPABST, PW_NU, & + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & + PCCT, PCRT, PCIT, PNFT, PNHT , & + PICEFR ) +! ########################################################################## +! +!! PURPOSE +!! ------- +!! Compute the homogeneous freezing of CCN where T<-35°C +!! +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original 15/03/2018 +! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST, ONLY: XP00, XRD, XRV, XMV, XMD, XCPD, XCPV, XCL, XCI, & + XTT, XLSTT, XLVTT, XALPI, XBETAI, XGAMI, & + XG +USE MODD_NSV +USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT +USE MODD_PARAM_LIMA, ONLY: NMOD_CCN, NMOD_IMM, XRTMIN, XCTMIN, XNUC +USE MODD_PARAM_LIMA_COLD, ONLY: XRCOEF_HONH, XCEXP_DIFVAP_HONH, XCOEF_DIFVAP_HONH,& + XCRITSAT1_HONH, XCRITSAT2_HONH, XTMAX_HONH, & + XTMIN_HONH, XC1_HONH, XC2_HONH, XC3_HONH, & + XDLNJODT1_HONH, XDLNJODT2_HONH, XRHOI_HONH, & + XC_HONC, XTEXP1_HONC, XTEXP2_HONC, XTEXP3_HONC, & + XTEXP4_HONC, XTEXP5_HONC +USE MODD_PARAM_LIMA_WARM, ONLY: XLBC +! +use mode_tools, only: Countjv +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PW_NU ! updraft velocity used for + ! the nucleation param. +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHT ! Theta at time t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRIT ! Cloud ice m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGT ! Graupel m.r. at t +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCCT ! Cloud water C. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCRT ! Rain water C. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIT ! Ice crystal C. source +! +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PNFT ! Free CCN conc. +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PNHT ! haze homogeneous freezing +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PICEFR ! Ice fraction +! +!* 0.2 Declarations of local variables : +! +REAL, DIMENSION(:), ALLOCATABLE :: ZRVT ! Water vapor m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRCT ! Cloud water m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRRT ! Rain water m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRIT ! Pristine ice m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRGT ! Graupel/hail m.r. at t +! +REAL, DIMENSION(:), ALLOCATABLE :: ZTHT ! Theta source +! +REAL, DIMENSION(:), ALLOCATABLE :: ZCCT ! Cloud water conc. source +REAL, DIMENSION(:), ALLOCATABLE :: ZCRT ! Rain water conc. source +REAL, DIMENSION(:,:), ALLOCATABLE :: ZNFT ! available nucleus conc. source +REAL, DIMENSION(:), ALLOCATABLE :: ZCIT ! Pristine ice conc. source +REAL, DIMENSION(:), ALLOCATABLE :: ZZNHT ! Nucleated Ice nuclei conc. source + !by Homogeneous freezing +! +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: ZNHT ! Nucleated Ice nuclei conc. source + ! by Homogeneous freezing of haze +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: ZW, ZT ! work arrays +! +REAL, DIMENSION(:), ALLOCATABLE & + :: ZRHODREF, & ! RHO Dry REFerence + ZRHODJ, & ! RHO times Jacobian + ZZT, & ! Temperature + ZPRES, & ! Pressure + ZEXNREF, & ! EXNer Pressure REFerence + ZZW, & ! Work array + ZZX, & ! Work array + ZZY, & ! Work array + ZLSFACT, & ! L_s/(Pi_ref*C_ph) + ZLVFACT, & ! L_v/(Pi_ref*C_ph) + ZLBDAC, & ! Slope parameter of the cloud droplet distr. + ZSI, & ! Saturation over ice + ZTCELSIUS,& + ZLS, & + ZPSI1, & + ZPSI2, & + ZTAU, & + ZBFACT, & + ZW_NU, & + ZFREECCN, & + ZCCNFROZEN +! +INTEGER :: IIB, IIE, IJB, IJE, IKB, IKE ! Physical domain +INTEGER :: JL, JMOD_CCN, JMOD_IMM ! Loop index +! +INTEGER :: INEGT ! Case number of hom. nucleation +LOGICAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: GNEGT ! Test where to compute the hom. nucleation +INTEGER , DIMENSION(SIZE(GNEGT)) :: I1,I2,I3 ! Used to replace the COUNT +! +REAL :: ZEPS ! molar mass ratio +! +!------------------------------------------------------------------------------- +! +! +!* 1. Preliminary computations and packing +! ------------------------------------ +! +! +! Physical domain +IIB=1+JPHEXT +IIE=SIZE(PTHT,1) - JPHEXT +IJB=1+JPHEXT +IJE=SIZE(PTHT,2) - JPHEXT +IKB=1+JPVEXT +IKE=SIZE(PTHT,3) - JPVEXT +! +! Temperature +ZT(:,:,:) = PTHT(:,:,:) * ( PPABST(:,:,:)/XP00 ) ** (XRD/XCPD) +! +ZNHT(:,:,:) = PNHT(:,:,:) +! +! Computations only where the temperature is below -35°C +! PACK variables +! +GNEGT(:,:,:) = .FALSE. +GNEGT(IIB:IIE,IJB:IJE,IKB:IKE) = ZT(IIB:IIE,IJB:IJE,IKB:IKE)<XTT-35.0 +INEGT = COUNTJV( GNEGT(:,:,:),I1(:),I2(:),I3(:)) +! +IF (INEGT.GT.0) THEN + + ALLOCATE(ZRVT(INEGT)) + ALLOCATE(ZRCT(INEGT)) + ALLOCATE(ZRRT(INEGT)) + ALLOCATE(ZRIT(INEGT)) + ALLOCATE(ZRST(INEGT)) + ALLOCATE(ZRGT(INEGT)) + ! + ALLOCATE(ZTHT(INEGT)) + ! + ALLOCATE(ZCCT(INEGT)) + ALLOCATE(ZCRT(INEGT)) + ALLOCATE(ZCIT(INEGT)) + ! + ALLOCATE(ZNFT(INEGT,NMOD_CCN)) + ALLOCATE(ZZNHT(INEGT)) + ! + ALLOCATE(ZRHODREF(INEGT)) + ALLOCATE(ZZT(INEGT)) + ALLOCATE(ZPRES(INEGT)) + ALLOCATE(ZEXNREF(INEGT)) + ! + DO JL=1,INEGT + ZRVT(JL) = PRVT(I1(JL),I2(JL),I3(JL)) + ZRCT(JL) = PRCT(I1(JL),I2(JL),I3(JL)) + ZRRT(JL) = PRRT(I1(JL),I2(JL),I3(JL)) + ZRIT(JL) = PRIT(I1(JL),I2(JL),I3(JL)) + ZRST(JL) = PRST(I1(JL),I2(JL),I3(JL)) + ZRGT(JL) = PRGT(I1(JL),I2(JL),I3(JL)) + ! + ZTHT(JL) = PTHT(I1(JL),I2(JL),I3(JL)) + ! + ZCCT(JL) = PCCT(I1(JL),I2(JL),I3(JL)) + ZCRT(JL) = PCRT(I1(JL),I2(JL),I3(JL)) + ZCIT(JL) = PCIT(I1(JL),I2(JL),I3(JL)) + ! + DO JMOD_CCN = 1, NMOD_CCN + ZNFT(JL,JMOD_CCN) = PNFT(I1(JL),I2(JL),I3(JL),JMOD_CCN) + ENDDO + ZZNHT(JL) = ZNHT(I1(JL),I2(JL),I3(JL)) + ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) + ZZT(JL) = ZT(I1(JL),I2(JL),I3(JL)) + ZPRES(JL) = PPABST(I1(JL),I2(JL),I3(JL)) + ZEXNREF(JL) = PEXNREF(I1(JL),I2(JL),I3(JL)) + ENDDO +! +! PACK : done +! Prepare computations +! + ALLOCATE( ZLSFACT (INEGT) ) + ALLOCATE( ZLVFACT (INEGT) ) + ALLOCATE( ZSI (INEGT) ) + ALLOCATE( ZTCELSIUS (INEGT) ) + ALLOCATE( ZLBDAC (INEGT) ) +! + ALLOCATE( ZZW (INEGT) ) ; ZZW(:) = 0.0 + ALLOCATE( ZZX (INEGT) ) ; ZZX(:) = 0.0 + ALLOCATE( ZZY (INEGT) ) ; ZZY(:) = 0.0 +! + ZTCELSIUS(:) = ZZT(:)-XTT ! T [°C] + ZZW(:) = ZEXNREF(:)*( XCPD+XCPV*ZRVT(:)+XCL*(ZRCT(:)+ZRRT(:)) & + +XCI*(ZRIT(:)+ZRST(:)+ZRGT(:)) ) + ZLSFACT(:) = (XLSTT+(XCPV-XCI)*ZTCELSIUS(:))/ZZW(:) ! L_s/(Pi_ref*C_ph) + ZLVFACT(:) = (XLVTT+(XCPV-XCL)*ZTCELSIUS(:))/ZZW(:) ! L_v/(Pi_ref*C_ph) +! + ZZW(:) = EXP( XALPI - XBETAI/ZZT(:) - XGAMI*ALOG(ZZT(:) ) ) ! es_i + ZSI(:) = ZRVT(:)*(ZPRES(:)-ZZW(:))/((XMV/XMD)*ZZW(:)) ! Saturation over ice +! +! +!------------------------------------------------------------------------------- +! +! +!* 2. Haze homogeneous freezing +! ------------------------ +! +! +! Compute the haze homogeneous nucleation source: RHHONI +! + IF( NMOD_CCN.GT.0 ) THEN + +! Sum of the available CCN + ALLOCATE( ZFREECCN(INEGT) ) + ALLOCATE( ZCCNFROZEN(INEGT) ) + ZFREECCN(:)=0. + ZCCNFROZEN(:)=0. + DO JMOD_CCN = 1, NMOD_CCN + ZFREECCN(:) = ZFREECCN(:) + ZNFT(:,JMOD_CCN) + END DO +! + ALLOCATE(ZW_NU(INEGT)) + DO JL=1,INEGT + ZW_NU(JL) = PW_NU(I1(JL),I2(JL),I3(JL)) + END DO +! + ZZW(:) = 0.0 + ZZX(:) = 0.0 + ZEPS = XMV / XMD + ZZY(:) = XCRITSAT1_HONH - & ! Critical Sat. + (MIN( XTMAX_HONH,MAX( XTMIN_HONH,ZZT(:) ) )/XCRITSAT2_HONH) +! + ALLOCATE(ZLS(INEGT)) + ALLOCATE(ZPSI1(INEGT)) + ALLOCATE(ZPSI2(INEGT)) + ALLOCATE(ZTAU(INEGT)) + ALLOCATE(ZBFACT(INEGT)) +! + WHERE( (ZZT(:)<XTT-35.0) .AND. (ZSI(:)>ZZY(:)) ) + ZLS(:) = XLSTT+(XCPV-XCI)*ZTCELSIUS(:) ! Ls +! + ZPSI1(:) = ZZY(:) * (XG/(XRD*ZZT(:)))*(ZEPS*ZLS(:)/(XCPD*ZZT(:))-1.) +! ! Psi1 (a1*Scr in KL01) +! BV correction PSI2 enlever 1/ZEPS ? +! ZPSI2(:) = ZSI(:) * (1.0/ZEPS+1.0/ZRVT(:)) + & + ZPSI2(:) = ZSI(:) * (1.0/ZRVT(:)) + & + ZZY(:) * ((ZLS(:)/ZZT(:))**2)/(XCPD*XRV) +! ! Psi2 (a2+a3*Scr in KL01) + ZTAU(:) = 1.0 / ( MAX( XC1_HONH,XC1_HONH*(XC2_HONH-XC3_HONH*ZZT(:)) ) *& + ABS( (XDLNJODT1_HONH - XDLNJODT2_HONH*ZZT(:)) * & + ((ZPRES(:)/XP00)**(XRD/XCPD))*ZTHT(:) ) ) +! + ZBFACT(:) = (XRHOI_HONH/ZRHODREF(:)) * (ZSI(:)/(ZZY(:)-1.0)) & +! BV correction ZBFACT enlever 1/ZEPS ? +! * (1.0/ZRVT(:)+1.0/ZEPS) & + * (1.0/ZRVT(:)) & + / (XCOEF_DIFVAP_HONH*(ZZT(:)**XCEXP_DIFVAP_HONH /ZPRES(:))) +! +! BV correction ZZX rho_i{-1} ? +! ZZX(:) = MAX( MIN( XRHOI_HONH*ZBFACT(:)**1.5 * (ZPSI1(:)/ZPSI2(:)) & + ZZX(:) = MAX( MIN( (1/XRHOI_HONH)*ZBFACT(:)**1.5 * (ZPSI1(:)/ZPSI2(:)) & + * (ZW_NU(:)/SQRT(ZTAU(:))) , ZFREECCN(:) ) , 0.) +! + ZZW(:) = MIN( XRCOEF_HONH*ZZX(:)*(ZTAU(:)/ZBFACT(:))**1.5 , ZRVT(:) ) + END WHERE +! +! Apply the changes + DO JMOD_CCN = 1, NMOD_CCN + WHERE(ZFREECCN(:)>1.) + ZCCNFROZEN(:) = ZZX(:) * ZNFT(:,JMOD_CCN)/ZFREECCN(:) + END WHERE + PNFT(:,:,:,JMOD_CCN) = PNFT(:,:,:,JMOD_CCN) - UNPACK( ZCCNFROZEN(:), MASK=GNEGT(:,:,:),FIELD=0.) + END DO +! + PTHT(:,:,:) = PTHT(:,:,:) + UNPACK( ZZW(:)*(ZLSFACT(:)-ZLVFACT(:)), MASK=GNEGT(:,:,:),FIELD=0.) + PRVT(:,:,:) = PRVT(:,:,:) - UNPACK( ZZW(:), MASK=GNEGT(:,:,:),FIELD=0.) + PRIT(:,:,:) = PRIT(:,:,:) + UNPACK( ZZW(:), MASK=GNEGT(:,:,:),FIELD=0.) + PCIT(:,:,:) = PCIT(:,:,:) + UNPACK( ZZX(:), MASK=GNEGT(:,:,:),FIELD=0.) + PNHT(:,:,:) = PNHT(:,:,:) + UNPACK( ZZX(:), MASK=GNEGT(:,:,:),FIELD=0.) + + DEALLOCATE(ZFREECCN) + DEALLOCATE(ZCCNFROZEN) + DEALLOCATE(ZLS) + DEALLOCATE(ZPSI1) + DEALLOCATE(ZPSI2) + DEALLOCATE(ZTAU) + DEALLOCATE(ZBFACT) + DEALLOCATE(ZW_NU) +! + END IF +! +! + DEALLOCATE(ZRVT) + DEALLOCATE(ZRCT) + DEALLOCATE(ZRRT) + DEALLOCATE(ZRIT) + DEALLOCATE(ZRST) + DEALLOCATE(ZRGT) +! + DEALLOCATE(ZTHT) +! + DEALLOCATE(ZCCT) + DEALLOCATE(ZCRT) + DEALLOCATE(ZCIT) +! + DEALLOCATE(ZNFT) + DEALLOCATE(ZZNHT) +! + DEALLOCATE(ZRHODREF) + DEALLOCATE(ZZT) + DEALLOCATE(ZPRES) + DEALLOCATE(ZEXNREF) +! + DEALLOCATE(ZLSFACT) + DEALLOCATE(ZLVFACT) + DEALLOCATE(ZSI) + DEALLOCATE(ZTCELSIUS) + DEALLOCATE(ZLBDAC) +! + DEALLOCATE(ZZW) + DEALLOCATE(ZZX) + DEALLOCATE(ZZY) +! +! +END IF ! INEGT>0 +! +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE LIMA_CCN_HOM_FREEZING diff --git a/src/mesonh/micro/lima_cold.f90 b/src/mesonh/micro/lima_cold.f90 new file mode 100644 index 000000000..3e0a6b3e4 --- /dev/null +++ b/src/mesonh/micro/lima_cold.f90 @@ -0,0 +1,435 @@ +!MNH_LIC Copyright 2013-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ##################### + MODULE MODI_LIMA_COLD +! ##################### +! +INTERFACE + SUBROUTINE LIMA_COLD (OSEDI, OHHONI, KSPLITG, PTSTEP, KMI, & + KRR, PZZ, PRHODJ, & + PRHODREF, PEXNREF, PPABST, PW_NU, & + PTHM, PPABSM, & + PTHT, PRT, PSVT, & + PTHS, PRS, PSVS, & + PINPRS, PINPRG, PINPRH) +! +USE MODD_NSV, only: NSV_LIMA_BEG +! +LOGICAL, INTENT(IN) :: OSEDI ! switch to activate the + ! cloud ice sedimentation +LOGICAL, INTENT(IN) :: OHHONI ! enable haze freezing +INTEGER, INTENT(IN) :: KSPLITG ! Number of small time step + ! for ice sedimendation +REAL, INTENT(IN) :: PTSTEP ! Time step +INTEGER, INTENT(IN) :: KMI ! Model index +! +INTEGER, INTENT(IN) :: KRR ! Number of moist variables +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PW_NU ! updraft velocity used for + ! the nucleation param. +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHM ! Theta at time t-dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! abs. pressure at time t-dt +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! m.r. at t +REAL, DIMENSION(:,:,:,NSV_LIMA_BEG:), INTENT(IN) :: PSVT ! Concentrations at time t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRS ! m.r. source +REAL, DIMENSION(:,:,:,NSV_LIMA_BEG:), INTENT(INOUT) :: PSVS ! Concentration sources +! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRS ! Snow instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRG ! Graupel instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRH ! Hail instant precip +! +END SUBROUTINE LIMA_COLD +END INTERFACE +END MODULE MODI_LIMA_COLD +! +! ###################################################################### + SUBROUTINE LIMA_COLD (OSEDI, OHHONI, KSPLITG, PTSTEP, KMI, & + KRR, PZZ, PRHODJ, & + PRHODREF, PEXNREF, PPABST, PW_NU, & + PTHM, PPABSM, & + PTHT, PRT, PSVT, & + PTHS, PRS, PSVS, & + PINPRS, PINPRG, PINPRH) +! ###################################################################### +! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the cold-phase +!! microphysical sources involving only primary ice and snow, except for +!! the sedimentation which also includes graupelns, and the homogeneous +!! freezing of CCNs, cloud droplets and raindrops. +!! +!! +!!** METHOD +!! ------ +!! The nucleation of IFN is parameterized following either Meyers (1992) +!! or Phillips (2008, 2013). +!! +!! The sedimentation rates are computed with a time spliting technique: +!! an upstream scheme, written as a difference of non-advective fluxes. +!! This source term is added to the next coming time step (split-implicit +!! process). +!! +!! +!! REFERENCES +!! ---------- +!! +!! Cohard, J.-M. and J.-P. Pinty, 2000: A comprehensive two-moment warm +!! microphysical bulk scheme. +!! Part I: Description and tests +!! Part II: 2D experiments with a non-hydrostatic model +!! Accepted for publication in Quart. J. Roy. Meteor. Soc. +!! +!! Phillips et al., 2008: An empirical parameterization of heterogeneous +!! ice nucleation for multiple chemical species of aerosols, J. Atmos. Sci. +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 02/2020: use the new data structures and subroutines for budgets (no more budget calls in this subroutine) +! P. Wautelet 28/05/2020: bugfix: correct array start for PSVT and PSVS +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ + +use modd_budget, only: lbu_enable, & + lbudget_ri, lbudget_rs, lbudget_rg, lbudget_rh, lbudget_sv, & + NBUDGET_RI, NBUDGET_RS, NBUDGET_RG, NBUDGET_RH, NBUDGET_SV1, & + tbudgets +USE MODD_NSV +USE MODD_PARAM_LIMA + +use mode_budget, only: Budget_store_init, Budget_store_end + +USE MODI_LIMA_COLD_HOM_NUCL +USE MODI_LIMA_COLD_SEDIMENTATION +USE MODI_LIMA_COLD_SLOW_PROCESSES +USE MODI_LIMA_MEYERS +USE MODI_LIMA_PHILLIPS + +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +LOGICAL, INTENT(IN) :: OSEDI ! switch to activate the + ! cloud ice sedimentation +LOGICAL, INTENT(IN) :: OHHONI ! enable haze freezing +INTEGER, INTENT(IN) :: KSPLITG ! Number of small time step + ! for ice sedimendation +REAL, INTENT(IN) :: PTSTEP ! Time step +INTEGER, INTENT(IN) :: KMI ! Model index +! +INTEGER, INTENT(IN) :: KRR ! Number of moist variables +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PW_NU ! updraft velocity used for + ! the nucleation param. +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHM ! Theta at time t-dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! abs. pressure at time t-dt +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! m.r. at t +REAL, DIMENSION(:,:,:,NSV_LIMA_BEG:), INTENT(IN) :: PSVT ! Concentrations at time t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRS ! m.r. source +REAL, DIMENSION(:,:,:,NSV_LIMA_BEG:), INTENT(INOUT) :: PSVS ! Concentration sources +! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRS ! Snow instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRG ! Graupel instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRH ! Hail instant precip +! +!* 0.2 Declarations of local variables : +! +REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) & + :: PRVT, & ! Water vapor m.r. at t + PRCT, & ! Cloud water m.r. at t + PRRT, & ! Rain water m.r. at t + PRIT, & ! Cloud ice m.r. at t + PRST, & ! Snow/aggregate m.r. at t + PRGT, & ! Graupel m.r. at t + PRHT, & ! Graupel m.r. at t + ! + PRVS, & ! Water vapor m.r. source + PRCS, & ! Cloud water m.r. source + PRRS, & ! Rain water m.r. source + PRIS, & ! Pristine ice m.r. source + PRSS, & ! Snow/aggregate m.r. source + PRGS, & ! Graupel/hail m.r. source + PRHS, & ! Graupel/hail m.r. source + ! + PCCT, & ! Cloud water C. at t + PCRT, & ! Rain water C. at t + PCIT, & ! Ice crystal C. at t + ! + PCCS, & ! Cloud water C. source + PCRS, & ! Rain water C. source + PCIS ! Ice crystal C. source +! +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: PNFS ! CCN C. available source + !used as Free ice nuclei for + !HOMOGENEOUS nucleation of haze +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: PNAS ! Cloud C. nuclei C. source + !used as Free ice nuclei for + !IMMERSION freezing +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: PIFS ! Free ice nuclei C. source + !for DEPOSITION and CONTACT +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: PINS ! Activated ice nuclei C. source + !for DEPOSITION and CONTACT +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: PNIS ! Activated ice nuclei C. source + !for IMMERSION +REAL, DIMENSION(:,:,:), ALLOCATABLE :: PNHS ! Haze homogeneous activation +! +!------------------------------------------------------------------------------- +! +! +!* 0. 3D MICROPHYSCAL VARIABLES +! ------------------------- +! +! +! Prepare 3D water mixing ratios +PRVT(:,:,:) = PRT(:,:,:,1) +PRVS(:,:,:) = PRS(:,:,:,1) +! +PRCT(:,:,:) = 0. +PRCS(:,:,:) = 0. +PRRT(:,:,:) = 0. +PRRS(:,:,:) = 0. +PRIT(:,:,:) = 0. +PRIS(:,:,:) = 0. +PRST(:,:,:) = 0. +PRSS(:,:,:) = 0. +PRGT(:,:,:) = 0. +PRGS(:,:,:) = 0. +PRHT(:,:,:) = 0. +PRHS(:,:,:) = 0. +! +IF ( KRR .GE. 2 ) PRCT(:,:,:) = PRT(:,:,:,2) +IF ( KRR .GE. 2 ) PRCS(:,:,:) = PRS(:,:,:,2) +IF ( KRR .GE. 3 ) PRRT(:,:,:) = PRT(:,:,:,3) +IF ( KRR .GE. 3 ) PRRS(:,:,:) = PRS(:,:,:,3) +IF ( KRR .GE. 4 ) PRIT(:,:,:) = PRT(:,:,:,4) +IF ( KRR .GE. 4 ) PRIS(:,:,:) = PRS(:,:,:,4) +IF ( KRR .GE. 5 ) PRST(:,:,:) = PRT(:,:,:,5) +IF ( KRR .GE. 5 ) PRSS(:,:,:) = PRS(:,:,:,5) +IF ( KRR .GE. 6 ) PRGT(:,:,:) = PRT(:,:,:,6) +IF ( KRR .GE. 6 ) PRGS(:,:,:) = PRS(:,:,:,6) +IF ( KRR .GE. 7 ) PRHT(:,:,:) = PRT(:,:,:,7) +IF ( KRR .GE. 7 ) PRHS(:,:,:) = PRS(:,:,:,7) +! +! Prepare 3D number concentrations +PCCT(:,:,:) = 0. +PCRT(:,:,:) = 0. +PCIT(:,:,:) = 0. +PCCS(:,:,:) = 0. +PCRS(:,:,:) = 0. +PCIS(:,:,:) = 0. +! +IF ( LWARM ) PCCT(:,:,:) = PSVT(:,:,:,NSV_LIMA_NC) +IF ( LWARM .AND. LRAIN ) PCRT(:,:,:) = PSVT(:,:,:,NSV_LIMA_NR) +IF ( LCOLD ) PCIT(:,:,:) = PSVT(:,:,:,NSV_LIMA_NI) +! +IF ( LWARM ) PCCS(:,:,:) = PSVS(:,:,:,NSV_LIMA_NC) +IF ( LWARM .AND. LRAIN ) PCRS(:,:,:) = PSVS(:,:,:,NSV_LIMA_NR) +IF ( LCOLD ) PCIS(:,:,:) = PSVS(:,:,:,NSV_LIMA_NI) +! +IF ( NMOD_CCN .GE. 1 ) THEN + ALLOCATE( PNFS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),NMOD_CCN) ) + ALLOCATE( PNAS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),NMOD_CCN) ) + PNFS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_CCN_FREE:NSV_LIMA_CCN_FREE+NMOD_CCN-1) + PNAS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_CCN_ACTI:NSV_LIMA_CCN_ACTI+NMOD_CCN-1) +ELSE + ALLOCATE( PNFS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),1) ) + ALLOCATE( PNAS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),1) ) + PNFS(:,:,:,:) = 0. + PNAS(:,:,:,:) = 0. +END IF +! +IF ( NMOD_IFN .GE. 1 ) THEN + ALLOCATE( PIFS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),NMOD_IFN) ) + ALLOCATE( PINS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),NMOD_IFN) ) + PIFS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_IFN_FREE:NSV_LIMA_IFN_FREE+NMOD_IFN-1) + PINS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_IFN_NUCL:NSV_LIMA_IFN_NUCL+NMOD_IFN-1) +ELSE + ALLOCATE( PIFS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),1) ) + ALLOCATE( PINS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),1) ) + PIFS(:,:,:,:) = 0. + PINS(:,:,:,:) = 0. +END IF +! +IF ( NMOD_IMM .GE. 1 ) THEN + ALLOCATE( PNIS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),NMOD_IMM) ) + PNIS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_IMM_NUCL:NSV_LIMA_IMM_NUCL+NMOD_IMM-1) +ELSE + ALLOCATE( PNIS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),1) ) + PNIS(:,:,:,:) = 0.0 +END IF +! +IF ( OHHONI ) THEN + ALLOCATE( PNHS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3)) ) + PNHS(:,:,:) = PSVS(:,:,:,NSV_LIMA_HOM_HAZE) +ELSE + ALLOCATE( PNHS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3)) ) + PNHS(:,:,:) = 0.0 +END IF +! +!------------------------------------------------------------------------------- +! +! +!* 1. COMPUTE THE SEDIMENTATION (RS) SOURCE +! ------------------------------------- +! +if ( lbu_enable ) then + if ( lbudget_ri .and. osedi ) call Budget_store_init( tbudgets(NBUDGET_RI), 'SEDI', pris(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rs .and. lsnow ) call Budget_store_init( tbudgets(NBUDGET_RS), 'SEDI', prss(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rg .and. lsnow ) call Budget_store_init( tbudgets(NBUDGET_RG), 'SEDI', prgs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rh .and. lhail ) call Budget_store_init( tbudgets(NBUDGET_RH), 'SEDI', prhs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_sv .and. osedi ) & + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'SEDI', pcis(:, :, :) * prhodj(:, :, :) ) +end if + +CALL LIMA_COLD_SEDIMENTATION (OSEDI, KSPLITG, PTSTEP, KMI, & + PZZ, PRHODJ, PRHODREF, & + PRIT, PCIT, & + PRIS, PRSS, PRGS, PRHS, PCIS, & + PINPRS, PINPRG,& + PINPRH ) + +if ( lbu_enable ) then + if ( lbudget_ri .and. osedi ) call Budget_store_end( tbudgets(NBUDGET_RI), 'SEDI', pris(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rs .and. lsnow ) call Budget_store_end( tbudgets(NBUDGET_RS), 'SEDI', prss(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rg .and. lsnow ) call Budget_store_end( tbudgets(NBUDGET_RG), 'SEDI', prgs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rh .and. lhail ) call Budget_store_end( tbudgets(NBUDGET_RH), 'SEDI', prhs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_sv .and. osedi ) & + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'SEDI', pcis(:, :, :) * prhodj(:, :, :) ) +end if +!------------------------------------------------------------------------------- +! +! +! COMPUTE THE NUCLEATION PROCESS SOURCES +! -------------------------------------- +! +IF (LNUCL) THEN +! + IF ( LMEYERS ) THEN + PIFS(:,:,:,:) = 0.0 + PNIS(:,:,:,:) = 0.0 + CALL LIMA_MEYERS (OHHONI, PTSTEP, KMI, & + PZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, & + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, PCCT, & + PTHS, PRVS, PRCS, PRIS, & + PCCS, PCIS, PINS ) + ELSE + CALL LIMA_PHILLIPS (OHHONI, PTSTEP, KMI, & + PZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, & + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & + PTHS, PRVS, PRCS, PRIS, & + PCIT, PCCS, PCIS, & + PNAS, PIFS, PINS, PNIS ) + END IF +! + IF (LWARM .OR. (LHHONI .AND. NMOD_CCN.GE.1)) THEN + CALL LIMA_COLD_HOM_NUCL (OHHONI, PTSTEP, KMI, & + PZZ, PRHODJ, & + PRHODREF, PEXNREF, PPABST, PW_NU, & + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & + PTHS, PRVS, PRCS, PRRS, PRIS, PRGS, & + PCCT, & + PCCS, PCRS, PNFS, PCIS, PNHS ) + END IF +! +END IF +! +!------------------------------------------------------------------------------ +! +! +!* 4. SLOW PROCESSES: depositions, aggregation +! ---------------------------------------- +! +IF (LSNOW) THEN +! + CALL LIMA_COLD_SLOW_PROCESSES(PTSTEP, KMI, PZZ, PRHODJ, & + PRHODREF, PEXNREF, PPABST, & + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & + PTHS, PRVS, PRIS, PRSS, & + PCIT, PCIS ) +! +END IF +! +!------------------------------------------------------------------------------ +! +! +!* 4. REPORT 3D MICROPHYSICAL VARIABLES IN PRS AND PSVS +! ------------------------------------------------- +! +PRS(:,:,:,1) = PRVS(:,:,:) +IF ( KRR .GE. 2 ) PRS(:,:,:,2) = PRCS(:,:,:) +IF ( KRR .GE. 3 ) PRS(:,:,:,3) = PRRS(:,:,:) +IF ( KRR .GE. 4 ) PRS(:,:,:,4) = PRIS(:,:,:) +IF ( KRR .GE. 5 ) PRS(:,:,:,5) = PRSS(:,:,:) +IF ( KRR .GE. 6 ) PRS(:,:,:,6) = PRGS(:,:,:) +IF ( KRR .GE. 7 ) PRS(:,:,:,7) = PRHS(:,:,:) +! +! Prepare 3D number concentrations +! +IF ( LWARM ) PSVS(:,:,:,NSV_LIMA_NC) = PCCS(:,:,:) +IF ( LWARM .AND. LRAIN ) PSVS(:,:,:,NSV_LIMA_NR) = PCRS(:,:,:) +IF ( LCOLD ) PSVS(:,:,:,NSV_LIMA_NI) = PCIS(:,:,:) +! +IF ( NMOD_CCN .GE. 1 ) THEN + PSVS(:,:,:,NSV_LIMA_CCN_FREE:NSV_LIMA_CCN_FREE+NMOD_CCN-1) = PNFS(:,:,:,:) + PSVS(:,:,:,NSV_LIMA_CCN_ACTI:NSV_LIMA_CCN_ACTI+NMOD_CCN-1) = PNAS(:,:,:,:) +END IF +! +IF ( NMOD_IFN .GE. 1 ) THEN + PSVS(:,:,:,NSV_LIMA_IFN_FREE:NSV_LIMA_IFN_FREE+NMOD_IFN-1) = PIFS(:,:,:,:) + PSVS(:,:,:,NSV_LIMA_IFN_NUCL:NSV_LIMA_IFN_NUCL+NMOD_IFN-1) = PINS(:,:,:,:) +END IF +! +IF ( NMOD_IMM .GE. 1 ) THEN + PSVS(:,:,:,NSV_LIMA_IMM_NUCL:NSV_LIMA_IMM_NUCL+NMOD_IMM-1) = PNIS(:,:,:,:) +END IF + +IF ( OHHONI ) PSVS(:,:,:,NSV_LIMA_HOM_HAZE) = PNHS(:,:,:) +! +!++cb++ +IF (ALLOCATED(PNFS)) DEALLOCATE(PNFS) +IF (ALLOCATED(PNAS)) DEALLOCATE(PNAS) +IF (ALLOCATED(PIFS)) DEALLOCATE(PIFS) +IF (ALLOCATED(PINS)) DEALLOCATE(PINS) +IF (ALLOCATED(PNIS)) DEALLOCATE(PNIS) +IF (ALLOCATED(PNHS)) DEALLOCATE(PNHS) +!--cb-- +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE LIMA_COLD diff --git a/src/mesonh/micro/lima_cold_hom_nucl.f90 b/src/mesonh/micro/lima_cold_hom_nucl.f90 new file mode 100644 index 000000000..407ae868d --- /dev/null +++ b/src/mesonh/micro/lima_cold_hom_nucl.f90 @@ -0,0 +1,659 @@ +!MNH_LIC Copyright 2013-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ###################### + MODULE MODI_LIMA_COLD_HOM_NUCL +! ###################### +! +INTERFACE + SUBROUTINE LIMA_COLD_HOM_NUCL (OHHONI, PTSTEP, KMI, & + PZZ, PRHODJ, & + PRHODREF, PEXNREF, PPABST, PW_NU, & + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & + PTHS, PRVS, PRCS, PRRS, PRIS, PRGS, & + PCCT, & + PCCS, PCRS, PNFS, PCIS, PNHS ) +! +LOGICAL, INTENT(IN) :: OHHONI ! enable haze freezing +REAL, INTENT(IN) :: PTSTEP ! Time step +INTEGER, INTENT(IN) :: KMI ! Model index +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PW_NU ! updraft velocity used for + ! the nucleation param. +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRIT ! Cloud ice m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGT ! Graupel m.r. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVS ! Water vapor m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRRS ! Rain water m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRGS ! Graupel/hail m.r. source +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCCT ! Cloud water C. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCCS ! Cloud water C. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCRS ! Rain water C. source +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PNFS ! CCN C. available source + !used as Free ice nuclei for + !HOMOGENEOUS nucleation of haze +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIS ! Ice crystal C. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PNHS ! haze homogeneous freezing +! +END SUBROUTINE LIMA_COLD_HOM_NUCL +END INTERFACE +END MODULE MODI_LIMA_COLD_HOM_NUCL +! +! ###################################################################### + SUBROUTINE LIMA_COLD_HOM_NUCL (OHHONI, PTSTEP, KMI, & + PZZ, PRHODJ, & + PRHODREF, PEXNREF, PPABST, PW_NU, & + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & + PTHS, PRVS, PRCS, PRRS, PRIS, PRGS, & + PCCT, & + PCCS, PCRS, PNFS, PCIS, PNHS ) +! ###################################################################### +! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the cold-phase homogeneous +!! freezing of CCN, droplets and drops (T<-35°C) +!! +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! C. Barthe * LACy* jan. 2014 add budgets +!! B.Vie 10/2016 Bug zero division +! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O +! M. Leriche 05/2019: suppress unused actived coated IN (immersion) source +! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 +! P. Wautelet 03/2020: use the new data structures and subroutines for budgets +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +use modd_budget, only: lbu_enable, nbumod, & + lbudget_th, lbudget_rv, lbudget_rc, lbudget_rr, lbudget_ri, lbudget_rg, lbudget_sv, & + NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, NBUDGET_RR, NBUDGET_RI, NBUDGET_RG, NBUDGET_SV1, & + tbudgets +USE MODD_CST, ONLY: XP00, XRD, XRV, XMV, XMD, XCPD, XCPV, XCL, XCI, & + XTT, XLSTT, XLVTT, XALPI, XBETAI, XGAMI, & + XG +USE MODD_NSV +USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT +USE MODD_PARAM_LIMA, ONLY: NMOD_CCN, NMOD_IMM, XRTMIN, XCTMIN, XNUC, LWARM, LRAIN +USE MODD_PARAM_LIMA_COLD, ONLY: XRCOEF_HONH, XCEXP_DIFVAP_HONH, XCOEF_DIFVAP_HONH,& + XCRITSAT1_HONH, XCRITSAT2_HONH, XTMAX_HONH, & + XTMIN_HONH, XC1_HONH, XC2_HONH, XC3_HONH, & + XDLNJODT1_HONH, XDLNJODT2_HONH, XRHOI_HONH, & + XC_HONC, XTEXP1_HONC, XTEXP2_HONC, XTEXP3_HONC, & + XTEXP4_HONC, XTEXP5_HONC +USE MODD_PARAM_LIMA_WARM, ONLY: XLBC + +use mode_budget, only: Budget_store_init, Budget_store_end +use mode_tools, only: Countjv + +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +LOGICAL, INTENT(IN) :: OHHONI ! enable haze freezing +REAL, INTENT(IN) :: PTSTEP ! Time step +INTEGER, INTENT(IN) :: KMI ! Model index +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PW_NU ! updraft velocity used for + ! the nucleation param. +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRIT ! Cloud ice m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGT ! Graupel m.r. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVS ! Water vapor m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRRS ! Rain water m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRGS ! Graupel/hail m.r. source +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCCT ! Cloud water C. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCCS ! Cloud water C. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCRS ! Rain water C. source +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PNFS ! CCN C. available source + !used as Free ice nuclei for + !HOMOGENEOUS nucleation of haze +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIS ! Ice crystal C. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PNHS ! haze homogeneous freezing +! +!* 0.2 Declarations of local variables : +! +REAL, DIMENSION(:), ALLOCATABLE :: ZRVT ! Water vapor m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRCT ! Cloud water m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRRT ! Rain water m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRIT ! Pristine ice m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRGT ! Graupel/hail m.r. at t +! +REAL, DIMENSION(:), ALLOCATABLE :: ZCCT ! Cloud water conc. at t +! +REAL, DIMENSION(:), ALLOCATABLE :: ZTHS ! Theta source +! +REAL, DIMENSION(:), ALLOCATABLE :: ZRVS ! Water vapor m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRCS ! Cloud water m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRRS ! Rain water m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRIS ! Pristine ice m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRGS ! Graupel/hail m.r. source +! +REAL, DIMENSION(:), ALLOCATABLE :: ZCCS ! Cloud water conc. source +REAL, DIMENSION(:), ALLOCATABLE :: ZCRS ! Rain water conc. source +REAL, DIMENSION(:,:), ALLOCATABLE :: ZNFS ! available nucleus conc. source +REAL, DIMENSION(:), ALLOCATABLE :: ZCIS ! Pristine ice conc. source +REAL, DIMENSION(:), ALLOCATABLE :: ZZNHS ! Nucleated Ice nuclei conc. source + !by Homogeneous freezing +! +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: ZNHS ! Nucleated Ice nuclei conc. source + ! by Homogeneous freezing of haze +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: ZW, ZT ! work arrays +! +REAL, DIMENSION(:), ALLOCATABLE & + :: ZRHODREF, & ! RHO Dry REFerence + ZRHODJ, & ! RHO times Jacobian + ZZT, & ! Temperature + ZPRES, & ! Pressure + ZEXNREF, & ! EXNer Pressure REFerence + ZZW, & ! Work array + ZZX, & ! Work array + ZZY, & ! Work array + ZLSFACT, & ! L_s/(Pi_ref*C_ph) + ZLVFACT, & ! L_v/(Pi_ref*C_ph) + ZLBDAC, & ! Slope parameter of the cloud droplet distr. + ZSI, & ! Saturation over ice + ZTCELSIUS,& + ZLS, & + ZPSI1, & + ZPSI2, & + ZTAU, & + ZBFACT, & + ZW_NU, & + ZFREECCN, & + ZCCNFROZEN +! +INTEGER :: IIB, IIE, IJB, IJE, IKB, IKE ! Physical domain +INTEGER :: JL, JMOD_CCN, JMOD_IMM ! Loop index +! +INTEGER :: INEGT ! Case number of hom. nucleation +integer :: idx +LOGICAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: GNEGT ! Test where to compute the hom. nucleation +INTEGER , DIMENSION(SIZE(GNEGT)) :: I1,I2,I3 ! Used to replace the COUNT +! +REAL :: ZEPS ! molar mass ratio +! +!------------------------------------------------------------------------------- +! +! +!* 1. PRELIMINARY COMPUTATIONS +! ------------------------ +! +! +! Physical domain +IIB=1+JPHEXT +IIE=SIZE(PZZ,1) - JPHEXT +IJB=1+JPHEXT +IJE=SIZE(PZZ,2) - JPHEXT +IKB=1+JPVEXT +IKE=SIZE(PZZ,3) - JPVEXT +! +! Temperature +ZT(:,:,:) = PTHT(:,:,:) * ( PPABST(:,:,:)/XP00 ) ** (XRD/XCPD) +! +IF( OHHONI ) THEN + ZNHS(:,:,:) = PNHS(:,:,:) +ELSE + ZNHS(:,:,:) = 0.0 +END IF +! +! Computations only where the temperature is below -35°C +! PACK variables +! +GNEGT(:,:,:) = .FALSE. +GNEGT(IIB:IIE,IJB:IJE,IKB:IKE) = ZT(IIB:IIE,IJB:IJE,IKB:IKE)<XTT-35.0 +INEGT = COUNTJV( GNEGT(:,:,:),I1(:),I2(:),I3(:)) +! +IF (INEGT.GT.0) THEN + + ALLOCATE(ZRVT(INEGT)) + ALLOCATE(ZRCT(INEGT)) + ALLOCATE(ZRRT(INEGT)) + ALLOCATE(ZRIT(INEGT)) + ALLOCATE(ZRST(INEGT)) + ALLOCATE(ZRGT(INEGT)) + ! + ALLOCATE(ZCCT(INEGT)) + ! + ALLOCATE(ZRVS(INEGT)) + ALLOCATE(ZRCS(INEGT)) + ALLOCATE(ZRRS(INEGT)) + ALLOCATE(ZRIS(INEGT)) + ALLOCATE(ZRGS(INEGT)) + ! + ALLOCATE(ZTHS(INEGT)) + ! + ALLOCATE(ZCCS(INEGT)) + ALLOCATE(ZCRS(INEGT)) + ALLOCATE(ZCIS(INEGT)) + ! + ALLOCATE(ZNFS(INEGT,NMOD_CCN)) + ALLOCATE(ZZNHS(INEGT)) + ! + ALLOCATE(ZRHODREF(INEGT)) + ALLOCATE(ZZT(INEGT)) + ALLOCATE(ZPRES(INEGT)) + ALLOCATE(ZEXNREF(INEGT)) + ! + DO JL=1,INEGT + ZRVT(JL) = PRVT(I1(JL),I2(JL),I3(JL)) + ZRCT(JL) = PRCT(I1(JL),I2(JL),I3(JL)) + ZRRT(JL) = PRRT(I1(JL),I2(JL),I3(JL)) + ZRIT(JL) = PRIT(I1(JL),I2(JL),I3(JL)) + ZRST(JL) = PRST(I1(JL),I2(JL),I3(JL)) + ZRGT(JL) = PRGT(I1(JL),I2(JL),I3(JL)) + ! + ZCCT(JL) = PCCT(I1(JL),I2(JL),I3(JL)) + ! + ZRVS(JL) = PRVS(I1(JL),I2(JL),I3(JL)) + ZRCS(JL) = PRCS(I1(JL),I2(JL),I3(JL)) + ZRRS(JL) = PRRS(I1(JL),I2(JL),I3(JL)) + ZRIS(JL) = PRIS(I1(JL),I2(JL),I3(JL)) + ZRGS(JL) = PRGS(I1(JL),I2(JL),I3(JL)) + ! + ZTHS(JL) = PTHS(I1(JL),I2(JL),I3(JL)) + ! + ZCCS(JL) = PCCS(I1(JL),I2(JL),I3(JL)) + ZCRS(JL) = PCRS(I1(JL),I2(JL),I3(JL)) + ZCIS(JL) = PCIS(I1(JL),I2(JL),I3(JL)) + ! + DO JMOD_CCN = 1, NMOD_CCN + ZNFS(JL,JMOD_CCN) = PNFS(I1(JL),I2(JL),I3(JL),JMOD_CCN) + ENDDO + ZZNHS(JL) = ZNHS(I1(JL),I2(JL),I3(JL)) + ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) + ZZT(JL) = ZT(I1(JL),I2(JL),I3(JL)) + ZPRES(JL) = PPABST(I1(JL),I2(JL),I3(JL)) + ZEXNREF(JL) = PEXNREF(I1(JL),I2(JL),I3(JL)) + ENDDO +! +! PACK : done +! Prepare computations +! + ALLOCATE( ZLSFACT (INEGT) ) + ALLOCATE( ZLVFACT (INEGT) ) + ALLOCATE( ZSI (INEGT) ) + ALLOCATE( ZTCELSIUS (INEGT) ) + ALLOCATE( ZLBDAC (INEGT) ) +! + ALLOCATE( ZZW (INEGT) ) ; ZZW(:) = 0.0 + ALLOCATE( ZZX (INEGT) ) ; ZZX(:) = 0.0 + ALLOCATE( ZZY (INEGT) ) ; ZZY(:) = 0.0 +! + ZTCELSIUS(:) = ZZT(:)-XTT ! T [°C] + ZZW(:) = ZEXNREF(:)*( XCPD+XCPV*ZRVT(:)+XCL*(ZRCT(:)+ZRRT(:)) & + +XCI*(ZRIT(:)+ZRST(:)+ZRGT(:)) ) + ZLSFACT(:) = (XLSTT+(XCPV-XCI)*ZTCELSIUS(:))/ZZW(:) ! L_s/(Pi_ref*C_ph) + ZLVFACT(:) = (XLVTT+(XCPV-XCL)*ZTCELSIUS(:))/ZZW(:) ! L_v/(Pi_ref*C_ph) +! + ZZW(:) = EXP( XALPI - XBETAI/ZZT(:) - XGAMI*ALOG(ZZT(:) ) ) ! es_i + ZSI(:) = ZRVT(:)*(ZPRES(:)-ZZW(:))/((XMV/XMD)*ZZW(:)) ! Saturation over ice +! +! +!------------------------------------------------------------------------------- +! +! +!* 2. Haze homogeneous freezing +! ------------------------ +! + if ( nbumod == kmi .and. lbu_enable .and. ohhoni .and. nmod_ccn > 0 ) then + if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'HONH', pths(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rv ) call Budget_store_init( tbudgets(NBUDGET_RV), 'HONH', prvs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), 'HONH', pris(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_sv ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'HONH', pcis(:, :, :) * prhodj(:, :, :) ) + if ( nmod_ccn > 0 ) then + do jl = 1, nmod_ccn + idx = NBUDGET_SV1 - 1 + nsv_lima_ccn_free - 1 + jl + call Budget_store_init( tbudgets(idx), 'HONH', pnfs(:, :, :, jl) * prhodj(:, :, :) ) + end do + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_hom_haze), 'HONH', znhs(:, :, :) * prhodj(:, :, :) ) + end if + end if + end if +! +! Compute the haze homogeneous nucleation source: RHHONI +! + IF( OHHONI .AND. NMOD_CCN.GT.0 ) THEN + +! Sum of the available CCN + ALLOCATE( ZFREECCN(INEGT) ) + ALLOCATE( ZCCNFROZEN(INEGT) ) + ZFREECCN(:)=0. + ZCCNFROZEN(:)=0. + DO JMOD_CCN = 1, NMOD_CCN + ZFREECCN(:) = ZFREECCN(:) + ZNFS(:,JMOD_CCN) + END DO +! + ALLOCATE(ZW_NU(INEGT)) + DO JL=1,INEGT + ZW_NU(JL) = PW_NU(I1(JL),I2(JL),I3(JL)) + END DO +! + ZZW(:) = 0.0 + ZZX(:) = 0.0 + ZEPS = XMV / XMD + ZZY(:) = XCRITSAT1_HONH - & ! Critical Sat. + (MIN( XTMAX_HONH,MAX( XTMIN_HONH,ZZT(:) ) )/XCRITSAT2_HONH) +! + ALLOCATE(ZLS(INEGT)) + ALLOCATE(ZPSI1(INEGT)) + ALLOCATE(ZPSI2(INEGT)) + ALLOCATE(ZTAU(INEGT)) + ALLOCATE(ZBFACT(INEGT)) +! + WHERE( (ZZT(:)<XTT-35.0) .AND. (ZSI(:)>ZZY(:)) ) + ZLS(:) = XLSTT+(XCPV-XCI)*ZTCELSIUS(:) ! Ls +! + ZPSI1(:) = ZZY(:) * (XG/(XRD*ZZT(:)))*(ZEPS*ZLS(:)/(XCPD*ZZT(:))-1.) +! ! Psi1 (a1*Scr in KL01) +! BV correction PSI2 enlever 1/ZEPS ? +! ZPSI2(:) = ZSI(:) * (1.0/ZEPS+1.0/ZRVT(:)) + & + ZPSI2(:) = ZSI(:) * (1.0/ZRVT(:)) + & + ZZY(:) * ((ZLS(:)/ZZT(:))**2)/(XCPD*XRV) +! ! Psi2 (a2+a3*Scr in KL01) + ZTAU(:) = 1.0 / ( MAX( XC1_HONH,XC1_HONH*(XC2_HONH-XC3_HONH*ZZT(:)) ) *& + ABS( (XDLNJODT1_HONH - XDLNJODT2_HONH*ZZT(:)) * & + ((ZPRES(:)/XP00)**(XRD/XCPD))*ZTHS(:) ) ) +! + ZBFACT(:) = (XRHOI_HONH/ZRHODREF(:)) * (ZSI(:)/(ZZY(:)-1.0)) & +! BV correction ZBFACT enlever 1/ZEPS ? +! * (1.0/ZRVT(:)+1.0/ZEPS) & + * (1.0/ZRVT(:)) & + / (XCOEF_DIFVAP_HONH*(ZZT(:)**XCEXP_DIFVAP_HONH /ZPRES(:))) +! +! BV correction ZZX rho_i{-1} ? +! ZZX(:) = MAX( MIN( XRHOI_HONH*ZBFACT(:)**1.5 * (ZPSI1(:)/ZPSI2(:)) & + ZZX(:) = MAX( MIN( (1/XRHOI_HONH)*ZBFACT(:)**1.5 * (ZPSI1(:)/ZPSI2(:)) & +! BV correction ZZX PTSTEP wrong place ? +! * (ZW_NU(:)/SQRT(ZTAU(:))), ZNFS(:,JMOD_CCN) )/PTSTEP , 0.) + * (ZW_NU(:)/SQRT(ZTAU(:)))/PTSTEP , ZFREECCN(:) ) , 0.) +! + ZZW(:) = MIN( XRCOEF_HONH*ZZX(:)*(ZTAU(:)/ZBFACT(:))**1.5 , ZRVS(:) ) + END WHERE +! +! Apply the changes to ZNFS, + DO JMOD_CCN = 1, NMOD_CCN + WHERE(ZFREECCN(:)>1.) + ZCCNFROZEN(:) = ZZX(:) * ZNFS(:,JMOD_CCN)/ZFREECCN(:) + ZNFS(:,JMOD_CCN) = ZNFS(:,JMOD_CCN) - ZCCNFROZEN(:) + END WHERE + ZW(:,:,:) = PNFS(:,:,:,JMOD_CCN) + PNFS(:,:,:,JMOD_CCN)=UNPACK( ZNFS(:,JMOD_CCN), MASK=GNEGT(:,:,:),FIELD=ZW(:,:,:)) + END DO + ZZNHS(:) = ZZNHS(:) + ZZX(:) + ZNHS(:,:,:) = UNPACK( ZZNHS(:), MASK=GNEGT(:,:,:),FIELD=0.0) + PNHS(:,:,:) = ZNHS(:,:,:) +! + DEALLOCATE(ZFREECCN) + DEALLOCATE(ZCCNFROZEN) + DEALLOCATE(ZLS) + DEALLOCATE(ZPSI1) + DEALLOCATE(ZPSI2) + DEALLOCATE(ZTAU) + DEALLOCATE(ZBFACT) + DEALLOCATE(ZW_NU) +! + ZRVS(:) = ZRVS(:) - ZZW(:) + ZRIS(:) = ZRIS(:) + ZZW(:) + ZTHS(:) = ZTHS(:) + ZZW(:) * (ZLSFACT(:)-ZLVFACT(:)) ! f(L_s*(RHHONI)) + ZCIS(:) = ZCIS(:) + ZZX(:) +! + END IF ! OHHONI +! +! Budget storage + if ( nbumod == kmi .and. lbu_enable .and. ohhoni .and. nmod_ccn > 0 ) then + if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'HONH', & + Unpack( zths(:), mask = gnegt(:, :, :), field = pths(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rv ) call Budget_store_end( tbudgets(NBUDGET_RV), 'HONH', & + Unpack( zrvs(:), mask = gnegt(:, :, :), field = prvs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'HONH', & + Unpack( zris(:), mask = gnegt(:, :, :), field = pris(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_sv ) then + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'HONH', & + Unpack( zcis(:), mask = gnegt(:, :, :), field = pcis(:, :, :) ) * prhodj(:, :, :) ) + if ( nmod_ccn > 0 ) then + do jl = 1, nmod_ccn + idx = NBUDGET_SV1 - 1 + nsv_lima_ccn_free - 1 + jl + call Budget_store_end( tbudgets(idx), 'HONH', & + Unpack( znfs(:, jl), mask = gnegt(:, :, :), field = pnfs(:, :, :, jl) ) * prhodj(:, :, :) ) + end do + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_hom_haze), 'HONH', & + Unpack( zznhs(:), mask = gnegt(:, :, :), field = znhs(:, :, :) ) * prhodj(:, :, :) ) + end if + end if + end if +! +!------------------------------------------------------------------------------- +! +! +!* 3. Cloud droplets homogeneous freezing +! ----------------------------------- +! +! +! Compute the droplet homogeneous nucleation source: RCHONI +! -> Pruppacher(1995) +! +IF (LWARM) THEN + if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'HONC', & + Unpack( zths(:), mask = gnegt(:, :, :), field = pths(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'HONC', prcs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), 'HONC', & + Unpack( zris(:), mask = gnegt(:, :, :), field = pris(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_sv ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'HONC', pccs(:, :, :) * prhodj(:, :, :) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'HONC', & + Unpack( zcis(:), mask = gnegt(:, :, :), field = pcis(:, :, :) ) * prhodj(:, :, :) ) + end if + end if + + ZZW(:) = 0.0 + ZZX(:) = 0.0 + WHERE( (ZZT(:)<XTT-35.0) .AND. (ZCCT(:)>XCTMIN(2)) .AND. (ZRCT(:)>XRTMIN(2)) ) + ZLBDAC(:) = XLBC*ZCCT(:) / (ZRCT(:)) ! Lambda_c**3 + ZZX(:) = 1.0 / ( 1.0 + (XC_HONC/ZLBDAC(:))*PTSTEP* & + EXP( XTEXP1_HONC + ZTCELSIUS(:)*( & + XTEXP2_HONC + ZTCELSIUS(:)*( & + XTEXP3_HONC + ZTCELSIUS(:)*( & + XTEXP4_HONC + ZTCELSIUS(:)*XTEXP5_HONC))) ) )**XNUC + ZZW(:) = ZCCS(:) * (1.0 - ZZX(:)) ! CCHONI +! + ZCCS(:) = ZCCS(:) - ZZW(:) + ZCIS(:) = ZCIS(:) + ZZW(:) +! + ZZW(:) = ZRCS(:) * (1.0 - ZZX(:)) ! RCHONI +! + ZRCS(:) = ZRCS(:) - ZZW(:) + ZRIS(:) = ZRIS(:) + ZZW(:) + ZTHS(:) = ZTHS(:) + ZZW(:) * (ZLSFACT(:)-ZLVFACT(:)) ! f(L_f*(RCHONI)) + END WHERE +! +! Budget storage + if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'HONC', & + Unpack( zths(:), mask = gnegt(:, :, :), field = pths(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'HONC', & + Unpack( zrcs(:), mask = gnegt(:, :, :), field = prcs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'HONC', & + Unpack( zris(:), mask = gnegt(:, :, :), field = pris(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_sv ) then + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'HONC', & + Unpack( zccs(:), mask = gnegt(:, :, :), field = pccs(:, :, :) ) * prhodj(:, :, :) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'HONC', & + Unpack( zcis(:), mask = gnegt(:, :, :), field = pcis(:, :, :) ) * prhodj(:, :, :) ) + end if + end if +END IF +! +! +!------------------------------------------------------------------------------- +! +! +!* 4. Rain drops homogeneous freezing +! ------------------------------- +! +! +! Compute the drop homogeneous nucleation source: RRHONG +! +IF (LWARM .AND. LRAIN) THEN + if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'HONR', & + Unpack( zths(:), mask = gnegt(:, :, :), field = pths(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_init( tbudgets(NBUDGET_RR), 'HONR', prrs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rg ) call Budget_store_init( tbudgets(NBUDGET_RG), 'HONR', prgs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_sv ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nr), 'HONR', pcrs(:, :, :) * prhodj(:, :, :) ) + end if + end if + + ZZW(:) = 0.0 + WHERE( (ZZT(:)<XTT-35.0) .AND. (ZRRS(:)>XRTMIN(3)/PTSTEP) ) + ZZW(:) = ZRRS(:) ! Instantaneous freezing of the raindrops + ZRRS(:) = ZRRS(:) - ZZW(:) + ZRGS(:) = ZRGS(:) + ZZW(:) + ZTHS(:) = ZTHS(:) + ZZW(:)*(ZLSFACT(:)-ZLVFACT(:)) ! f(L_f*(RRHONG)) +! + ZCRS(:) = 0.0 ! No more raindrops when T<-35 C + ENDWHERE +! +! Budget storage + if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'HONR', & + Unpack( zths(:), mask = gnegt(:, :, :), field = pths(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_end( tbudgets(NBUDGET_RR), 'HONR', & + Unpack( zrrs(:), mask = gnegt(:, :, :), field = prrs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rg ) call Budget_store_end( tbudgets(NBUDGET_RG), 'HONR', & + Unpack( zrgs(:), mask = gnegt(:, :, :), field = prgs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_sv ) then + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nr), 'HONR', & + Unpack( zcrs(:), mask = gnegt(:, :, :), field = pcrs(:, :, :) ) * prhodj(:, :, :) ) + end if + end if +END IF +! +! +!------------------------------------------------------------------------------- +! +! +!* 4. Unpack variables, clean +! ----------------------- +! +! +! End of homogeneous nucleation processes +! + ZW(:,:,:) = PRVS(:,:,:) + PRVS(:,:,:) = UNPACK( ZRVS(:),MASK=GNEGT(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PRCS(:,:,:) + PRCS(:,:,:) = UNPACK( ZRCS(:),MASK=GNEGT(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PRRS(:,:,:) + PRRS(:,:,:) = UNPACK( ZRRS(:),MASK=GNEGT(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PRIS(:,:,:) + PRIS(:,:,:) = UNPACK( ZRIS(:),MASK=GNEGT(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PRGS(:,:,:) + PRGS(:,:,:) = UNPACK( ZRGS(:),MASK=GNEGT(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PTHS(:,:,:) + PTHS(:,:,:) = UNPACK( ZTHS(:),MASK=GNEGT(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PCCS(:,:,:) + PCCS(:,:,:) = UNPACK( ZCCS(:),MASK=GNEGT(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PCRS(:,:,:) + PCRS(:,:,:) = UNPACK( ZCRS(:),MASK=GNEGT(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PCIS(:,:,:) + PCIS(:,:,:) = UNPACK( ZCIS(:),MASK=GNEGT(:,:,:),FIELD=ZW(:,:,:) ) +! + DEALLOCATE(ZRVT) + DEALLOCATE(ZRCT) + DEALLOCATE(ZRRT) + DEALLOCATE(ZRIT) + DEALLOCATE(ZRST) + DEALLOCATE(ZRGT) +! + DEALLOCATE(ZCCT) +! + DEALLOCATE(ZRVS) + DEALLOCATE(ZRCS) + DEALLOCATE(ZRRS) + DEALLOCATE(ZRIS) + DEALLOCATE(ZRGS) +! + DEALLOCATE(ZTHS) +! + DEALLOCATE(ZCCS) + DEALLOCATE(ZCRS) + DEALLOCATE(ZCIS) +! + DEALLOCATE(ZNFS) + DEALLOCATE(ZZNHS) +! + DEALLOCATE(ZRHODREF) + DEALLOCATE(ZZT) + DEALLOCATE(ZPRES) + DEALLOCATE(ZEXNREF) +! + DEALLOCATE(ZLSFACT) + DEALLOCATE(ZLVFACT) + DEALLOCATE(ZSI) + DEALLOCATE(ZTCELSIUS) + DEALLOCATE(ZLBDAC) +! + DEALLOCATE(ZZW) + DEALLOCATE(ZZX) + DEALLOCATE(ZZY) +! +END IF ! INEGT>0 +! +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE LIMA_COLD_HOM_NUCL diff --git a/src/mesonh/micro/lima_cold_sedimentation.f90 b/src/mesonh/micro/lima_cold_sedimentation.f90 new file mode 100644 index 000000000..6a62652b7 --- /dev/null +++ b/src/mesonh/micro/lima_cold_sedimentation.f90 @@ -0,0 +1,354 @@ +!MNH_LIC Copyright 2013-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ################################### + MODULE MODI_LIMA_COLD_SEDIMENTATION +! ################################### +! +INTERFACE + SUBROUTINE LIMA_COLD_SEDIMENTATION (OSEDI, KSPLITG, PTSTEP, KMI, & + PZZ, PRHODJ, PRHODREF, & + PRIT, PCIT, & + PRIS, PRSS, PRGS, PRHS, PCIS, & + PINPRS, PINPRG, PINPRH ) +! +LOGICAL, INTENT(IN) :: OSEDI ! switch to activate the + ! cloud ice sedimentation +INTEGER, INTENT(IN) :: KSPLITG ! Number of small time step + ! for ice sedimendation +REAL, INTENT(IN) :: PTSTEP ! Time step +INTEGER, INTENT(IN) :: KMI ! Model index +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian (Budgets) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRIT ! Cloud ice m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIT ! Ice crystal C. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRSS ! Snow/aggregate m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRGS ! Graupel m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRHS ! Hail m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIS ! Ice crystal C. source +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRS ! Snow instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRG ! Graupel instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRH ! Hail instant precip + +! + END SUBROUTINE LIMA_COLD_SEDIMENTATION +END INTERFACE +END MODULE MODI_LIMA_COLD_SEDIMENTATION +! +! +! ###################################################################### + SUBROUTINE LIMA_COLD_SEDIMENTATION (OSEDI, KSPLITG, PTSTEP, KMI, & + PZZ, PRHODJ, PRHODREF, & + PRIT, PCIT, & + PRIS, PRSS, PRGS, PRHS, PCIS, & + PINPRS,PINPRG,& + PINPRH ) +! ###################################################################### +! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the sediimentation +!! of primary ice, snow and graupel. +!! +!! METHOD +!! ------ +!! The sedimentation rates are computed with a time spliting technique: +!! an upstream scheme, written as a difference of non-advective fluxes. +!! This source term is added to the next coming time step (split-implicit +!! process). +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! C. Barthe * LACy * jan. 2014 add budgets +!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST, ONLY : XRHOLW +USE MODD_NSV +USE MODD_PARAMETERS, ONLY : JPHEXT, JPVEXT +USE MODD_PARAM_LIMA, ONLY : XCEXVT, XRTMIN, XCTMIN +USE MODD_PARAM_LIMA_COLD, ONLY : XLBEXI, XLBI, XDI, & + XFSEDRI, XFSEDCI, XFSEDS, XEXSEDS +USE MODD_PARAM_LIMA_MIXED, ONLY : XFSEDG, XEXSEDG, XFSEDH, XEXSEDH +! +use mode_tools, only: Countjv +! +IMPLICIT NONE +! + +! +!* 0.1 Declarations of dummy arguments : +! +LOGICAL, INTENT(IN) :: OSEDI ! switch to activate the + ! cloud ice sedimentation +INTEGER, INTENT(IN) :: KSPLITG ! Number of small time step + ! for ice sedimendation +REAL, INTENT(IN) :: PTSTEP ! Time step +INTEGER, INTENT(IN) :: KMI ! Model index +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian (Budgets) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRIT ! Cloud ice m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIT ! Ice crystal C. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRSS ! Snow/aggregate m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRGS ! Graupel m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRHS ! Hail m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIS ! Ice crystal C. source +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRS ! Snow instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRG ! Graupel instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRH ! Hail instant precip + +! +!* 0.2 Declarations of local variables : +! +INTEGER :: JK, JL, JN ! Loop index +INTEGER :: IIB, IIE, IJB, IJE, IKB, IKE ! Physical domain +INTEGER :: ISEDIM ! Case number of sedimentation +! +LOGICAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: GSEDIM ! Test where to compute the SED processes +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: ZW, & ! Work array + ZWSEDR, & ! Sedimentation of MMR + ZWSEDC ! Sedimentation of number conc. +! +REAL, DIMENSION(:), ALLOCATABLE & + :: ZRIS, & ! Pristine ice m.r. source + ZCIS, & ! Pristine ice conc. source + ZRSS, & ! Snow/aggregate m.r. source + ZRGS, & ! Graupel/hail m.r. source + ZRHS, & ! Graupel/hail m.r. source + ZRIT, & ! Pristine ice m.r. at t + ZCIT, & ! Pristine ice conc. at t + ZRHODREF, & ! RHO Dry REFerence + ZRHODJ, & ! RHO times Jacobian + ZZW, & ! Work array + ZZX, & ! Work array + ZZY, & ! Work array + ZLBDAI, & ! Slope parameter of the ice crystal distr. + ZRTMIN +! +INTEGER , DIMENSION(SIZE(PRHODREF)) :: I1,I2,I3 ! Indexes for PACK replacement +! +REAL :: ZTSPLITG ! Small time step for rain sedimentation +! +! +!------------------------------------------------------------------------------- +! +! Physical domain +! +IIB=1+JPHEXT +IIE=SIZE(PZZ,1) - JPHEXT +IJB=1+JPHEXT +IJE=SIZE(PZZ,2) - JPHEXT +IKB=1+JPVEXT +IKE=SIZE(PZZ,3) - JPVEXT +! +! Time splitting and ZRTMIN +! +ALLOCATE(ZRTMIN(SIZE(XRTMIN))) +ZRTMIN(:) = XRTMIN(:) / PTSTEP +! +ZTSPLITG= PTSTEP / REAL(KSPLITG) +! +PINPRS(:,:) = 0. +PINPRG(:,:) = 0. +PINPRH(:,:) = 0. +! +! ################################ +! Compute the sedimentation fluxes +! ################################ +! +DO JN = 1 , KSPLITG + ! Computation only where enough ice, snow, graupel or hail + GSEDIM(:,:,:) = .FALSE. + GSEDIM(IIB:IIE,IJB:IJE,IKB:IKE) = PRSS(IIB:IIE,IJB:IJE,IKB:IKE)>ZRTMIN(5) & + .OR. PRGS(IIB:IIE,IJB:IJE,IKB:IKE)>ZRTMIN(6) & + .OR. PRHS(IIB:IIE,IJB:IJE,IKB:IKE)>ZRTMIN(7) + IF( OSEDI ) THEN + GSEDIM(IIB:IIE,IJB:IJE,IKB:IKE) = GSEDIM(IIB:IIE,IJB:IJE,IKB:IKE) & + .OR. PRIS(IIB:IIE,IJB:IJE,IKB:IKE)>ZRTMIN(4) + END IF +! + ISEDIM = COUNTJV( GSEDIM(:,:,:),I1(:),I2(:),I3(:)) + IF( ISEDIM >= 1 ) THEN +! + IF( JN==1 ) THEN + IF( OSEDI ) THEN + PCIS(:,:,:) = PCIS(:,:,:) * PTSTEP + PRIS(:,:,:) = PRIS(:,:,:) * PTSTEP + END IF + PRSS(:,:,:) = PRSS(:,:,:) * PTSTEP + PRGS(:,:,:) = PRGS(:,:,:) * PTSTEP + PRHS(:,:,:) = PRHS(:,:,:) * PTSTEP + DO JK = IKB , IKE + ZW(:,:,JK)=ZTSPLITG/(PZZ(:,:,JK+1)-PZZ(:,:,JK)) + END DO + END IF +! + ALLOCATE(ZRHODREF(ISEDIM)) + DO JL = 1,ISEDIM + ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) + END DO +! + ALLOCATE(ZZW(ISEDIM)) ; ZZW(:) = 0.0 + ALLOCATE(ZZX(ISEDIM)) ; ZZX(:) = 0.0 + ALLOCATE(ZZY(ISEDIM)) ; ZZY(:) = 0.0 +! +!* 2.21 for pristine ice +! + IF( OSEDI.AND.MAXVAL(PRIS(:,:,:))>ZRTMIN(4) ) THEN + ALLOCATE(ZRIS(ISEDIM)) + ALLOCATE(ZCIS(ISEDIM)) + ALLOCATE(ZRIT(ISEDIM)) + ALLOCATE(ZCIT(ISEDIM)) + ALLOCATE(ZLBDAI(ISEDIM)) + DO JL = 1,ISEDIM + ZRIS(JL) = PRIS(I1(JL),I2(JL),I3(JL)) + ZCIS(JL) = PCIS(I1(JL),I2(JL),I3(JL)) + ZRIT(JL) = PRIT(I1(JL),I2(JL),I3(JL)) + ZCIT(JL) = PCIT(I1(JL),I2(JL),I3(JL)) + END DO + ZLBDAI(:) = 1.E10 + WHERE (ZRIS(:)>XRTMIN(4) .AND. ZCIS(:)>XCTMIN(4)) + ZLBDAI(:) = ( XLBI*ZCIS(:) / ZRIS(:) )**XLBEXI + ZZY(:) = ZRHODREF(:)**(-XCEXVT) * ZLBDAI(:)**(-XDI) + ZZW(:) = XFSEDRI * ZRIS(:) * ZZY(:) * ZRHODREF(:) + ZZX(:) = XFSEDCI * ZCIS(:) * ZZY(:) * ZRHODREF(:) + END WHERE + ZWSEDR(:,:,:) = UNPACK( ZZW(:),MASK=GSEDIM(:,:,:),FIELD=0.0 ) + ZWSEDR(:,:,IKB:IKE) = MIN( ZWSEDR(:,:,IKB:IKE), PRIS(:,:,IKB:IKE) * PRHODREF(:,:,IKB:IKE) / ZW(:,:,IKB:IKE) ) + ZWSEDC(:,:,:) = UNPACK( ZZX(:),MASK=GSEDIM(:,:,:),FIELD=0.0 ) + ZWSEDC(:,:,IKB:IKE) = MIN( ZWSEDC(:,:,IKB:IKE), PCIS(:,:,IKB:IKE) * PRHODREF(:,:,IKB:IKE) / ZW(:,:,IKB:IKE) ) + DO JK = IKB , IKE + PRIS(:,:,JK) = PRIS(:,:,JK) + ZW(:,:,JK)* & + (ZWSEDR(:,:,JK+1)-ZWSEDR(:,:,JK))/PRHODREF(:,:,JK) + PCIS(:,:,JK) = PCIS(:,:,JK) + ZW(:,:,JK)* & + (ZWSEDC(:,:,JK+1)-ZWSEDC(:,:,JK))/PRHODREF(:,:,JK) + END DO + DEALLOCATE(ZRIS) + DEALLOCATE(ZCIS) + DEALLOCATE(ZRIT) + DEALLOCATE(ZCIT) + DEALLOCATE(ZLBDAI) + END IF +! +!* 2.22 for aggregates +! + ZZW(:) = 0. + IF( MAXVAL(PRSS(:,:,:))>XRTMIN(5) ) THEN + ALLOCATE(ZRSS(ISEDIM)) + DO JL = 1,ISEDIM + ZRSS(JL) = PRSS(I1(JL),I2(JL),I3(JL)) + END DO + WHERE( ZRSS(:)>XRTMIN(5) ) + ZZW(:) = XFSEDS * (ZRSS(:)*ZRHODREF(:))**XEXSEDS * ZRHODREF(:)**(-XCEXVT) + END WHERE + ZWSEDR(:,:,:) = UNPACK( ZZW(:),MASK=GSEDIM(:,:,:),FIELD=0.0 ) + ZWSEDR(:,:,IKB:IKE) = MIN( ZWSEDR(:,:,IKB:IKE), PRSS(:,:,IKB:IKE) * PRHODREF(:,:,IKB:IKE) / ZW(:,:,IKB:IKE) ) + DO JK = IKB , IKE + PRSS(:,:,JK) = PRSS(:,:,JK) + ZW(:,:,JK)* & + (ZWSEDR(:,:,JK+1)-ZWSEDR(:,:,JK))/PRHODREF(:,:,JK) + END DO + DEALLOCATE(ZRSS) + ELSE + ZWSEDR(:,:,IKB) = 0.0 + END IF +! + PINPRS(:,:) = PINPRS(:,:) + ZWSEDR(:,:,IKB)/XRHOLW/KSPLITG ! in m/s +! +!* 2.23 for graupeln +! + ZZW(:) = 0. + IF( MAXVAL(PRGS(:,:,:))>XRTMIN(6) ) THEN + ALLOCATE(ZRGS(ISEDIM)) + DO JL = 1,ISEDIM + ZRGS(JL) = PRGS(I1(JL),I2(JL),I3(JL)) + END DO + WHERE( ZRGS(:)>XRTMIN(6) ) + ZZW(:) = XFSEDG * (ZRGS(:)*ZRHODREF(:))**XEXSEDG * ZRHODREF(:)**(-XCEXVT) + END WHERE + ZWSEDR(:,:,:) = UNPACK( ZZW(:),MASK=GSEDIM(:,:,:),FIELD=0.0 ) + ZWSEDR(:,:,IKB:IKE) = MIN( ZWSEDR(:,:,IKB:IKE), PRGS(:,:,IKB:IKE) * PRHODREF(:,:,IKB:IKE) / ZW(:,:,IKB:IKE) ) + DO JK = IKB , IKE + PRGS(:,:,JK) = PRGS(:,:,JK) + ZW(:,:,JK)* & + (ZWSEDR(:,:,JK+1)-ZWSEDR(:,:,JK))/PRHODREF(:,:,JK) + END DO + DEALLOCATE(ZRGS) + ELSE + ZWSEDR(:,:,IKB) = 0.0 + END IF +! + PINPRG(:,:) = PINPRG(:,:) + ZWSEDR(:,:,IKB)/XRHOLW/KSPLITG ! in m/s +! +!* 2.23 for hail +! + ZZW(:) = 0. + IF( MAXVAL(PRHS(:,:,:))>XRTMIN(7) ) THEN + ALLOCATE(ZRHS(ISEDIM)) + DO JL = 1,ISEDIM + ZRHS(JL) = PRHS(I1(JL),I2(JL),I3(JL)) + END DO + WHERE( ZRHS(:)>XRTMIN(7) ) + ZZW(:) = XFSEDH * (ZRHS(:)*ZRHODREF(:))**XEXSEDH * ZRHODREF(:)**(-XCEXVT) + END WHERE + ZWSEDR(:,:,:) = UNPACK( ZZW(:),MASK=GSEDIM(:,:,:),FIELD=0.0 ) + ZWSEDR(:,:,IKB:IKE) = MIN( ZWSEDR(:,:,IKB:IKE), PRHS(:,:,IKB:IKE) * PRHODREF(:,:,IKB:IKE) / ZW(:,:,IKB:IKE) ) + DO JK = IKB , IKE + PRHS(:,:,JK) = PRHS(:,:,JK) + ZW(:,:,JK)* & + (ZWSEDR(:,:,JK+1)-ZWSEDR(:,:,JK))/PRHODREF(:,:,JK) + END DO + DEALLOCATE(ZRHS) + ELSE + ZWSEDR(:,:,IKB) = 0.0 + END IF +! + PINPRH(:,:) = PINPRH(:,:) + ZWSEDR(:,:,IKB)/XRHOLW/KSPLITG ! in m/s +! +!* 2.24 End of sedimentation +! + DEALLOCATE(ZRHODREF) + DEALLOCATE(ZZW) + DEALLOCATE(ZZX) + DEALLOCATE(ZZY) + IF( JN==KSPLITG ) THEN + IF( OSEDI ) THEN + PRIS(:,:,:) = PRIS(:,:,:) / PTSTEP + PCIS(:,:,:) = PCIS(:,:,:) / PTSTEP + END IF + PRSS(:,:,:) = PRSS(:,:,:) / PTSTEP + PRGS(:,:,:) = PRGS(:,:,:) / PTSTEP + PRHS(:,:,:) = PRHS(:,:,:) / PTSTEP + END IF + END IF +END DO +!++cb++ +DEALLOCATE(ZRTMIN) +!--cb-- +! +END SUBROUTINE LIMA_COLD_SEDIMENTATION +! +!------------------------------------------------------------------------------- diff --git a/src/mesonh/micro/lima_cold_slow_processes.f90 b/src/mesonh/micro/lima_cold_slow_processes.f90 new file mode 100644 index 000000000..9fcacdd5a --- /dev/null +++ b/src/mesonh/micro/lima_cold_slow_processes.f90 @@ -0,0 +1,537 @@ +!MNH_LIC Copyright 2013-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ##################### + MODULE MODI_LIMA_COLD_SLOW_PROCESSES +! ##################### +! +INTERFACE + SUBROUTINE LIMA_COLD_SLOW_PROCESSES (PTSTEP, KMI, PZZ, PRHODJ, & + PRHODREF, PEXNREF, PPABST, & + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & + PTHS, PRVS, PRIS, PRSS, & + PCIT, PCIS ) +! +REAL, INTENT(IN) :: PTSTEP ! Time step +INTEGER, INTENT(IN) :: KMI ! Model index +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRIT ! Cloud ice m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGT ! Graupel m.r. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVS ! Water vapor m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRSS ! Snow/aggregate m.r. source +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIT ! Ice crystal C. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIS ! Ice crystal C. source +! +END SUBROUTINE LIMA_COLD_SLOW_PROCESSES +END INTERFACE +END MODULE MODI_LIMA_COLD_SLOW_PROCESSES +! +! ################################################################################ + SUBROUTINE LIMA_COLD_SLOW_PROCESSES (PTSTEP, KMI, PZZ, PRHODJ, & + PRHODREF, PEXNREF, PPABST, & + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & + PTHS, PRVS, PRIS, PRSS, & + PCIT, PCIS ) +! ################################################################################ +! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the microphysical sources +!! for slow cold processes : +!! - conversion of snow to ice +!! - deposition of vapor on snow +!! - conversion of ice to snow (Harrington 1995) +!! - aggregation of ice on snow +!! +!! +!! REFERENCE +!! --------- +!! +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! C. Barthe * LACy * jan. 2014 add budgets +! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 +! P. Wautelet 03/2020: use the new data structures and subroutines for budgets +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +use modd_budget, only: lbu_enable, nbumod, & + lbudget_th, lbudget_rv, lbudget_ri, lbudget_rs, lbudget_sv, & + NBUDGET_TH, NBUDGET_RV, NBUDGET_RI, NBUDGET_RS, NBUDGET_SV1, & + tbudgets +USE MODD_CST, ONLY: XP00, XRD, XRV, XMV, XMD, XCPD, XCPV, & + XCL, XCI, XTT, XLSTT, XALPI, XBETAI, XGAMI +USE MODD_NSV, ONLY: NSV_LIMA_NI +USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT +USE MODD_PARAM_LIMA, ONLY: LSNOW, XRTMIN, XCTMIN, XALPHAI, XALPHAS, & + XNUI +USE MODD_PARAM_LIMA_COLD, ONLY: XLBI, XLBEXI, XLBS, XLBEXS, XBI, XCXS, XCCS, & + XLBDAS_MAX, XDSCNVI_LIM, XLBDASCNVI_MAX, & + XC0DEPSI, XC1DEPSI, XR0DEPSI, XR1DEPSI, & + XSCFAC, X1DEPS, X0DEPS, XEX1DEPS, XEX0DEPS, & + XDICNVS_LIM, XLBDAICNVS_LIM, & + XC0DEPIS, XC1DEPIS, XR0DEPIS, XR1DEPIS, & + XCOLEXIS, XAGGS_CLARGE1, XAGGS_CLARGE2, & + XAGGS_RLARGE1, XAGGS_RLARGE2 + +use mode_budget, only: Budget_store_init, Budget_store_end +use mode_tools, only: Countjv + +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +REAL, INTENT(IN) :: PTSTEP ! Time step +INTEGER, INTENT(IN) :: KMI ! Model index +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRIT ! Cloud ice m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGT ! Graupel m.r. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVS ! Water vapor m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRSS ! Snow/aggregate m.r. source +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIT ! Ice crystal C. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIS ! Ice crystal C. source +! +!* 0.2 Declarations of local variables : +! +LOGICAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: GMICRO ! Computations only where necessary +INTEGER :: IMICRO +INTEGER , DIMENSION(SIZE(GMICRO)) :: I1,I2,I3 ! Used to replace PACK +INTEGER :: JL ! and PACK intrinsics +! +REAL, DIMENSION(:), ALLOCATABLE :: ZRVT ! Water vapor m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRCT ! Cloud water m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRRT ! Rain water m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRIT ! Pristine ice m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRGT ! Graupel/hail m.r. at t +! +REAL, DIMENSION(:), ALLOCATABLE :: ZCIT ! Pristine ice conc. at t +! +REAL, DIMENSION(:), ALLOCATABLE :: ZRVS ! Water vapor m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRIS ! Pristine ice m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRSS ! Snow/aggregate m.r. source +! +REAL, DIMENSION(:), ALLOCATABLE :: ZTHS ! Theta source +! +REAL, DIMENSION(:), ALLOCATABLE :: ZCIS ! Pristine ice conc. source +! +REAL, DIMENSION(:), ALLOCATABLE & + :: ZRHODREF, & ! RHO Dry REFerence + ZRHODJ, & ! RHO times Jacobian + ZZT, & ! Temperature + ZPRES, & ! Pressure + ZEXNREF, & ! EXNer Pressure REFerence + ZZW, & ! Work array + ZZX, & ! Work array + ZLSFACT, & ! L_s/(Pi_ref*C_ph) + ZSSI, & ! Supersaturation over ice + ZLBDAI, & ! Slope parameter of the ice crystal distr. + ZLBDAS, & ! Slope parameter of the aggregate distr. + ZAI, & ! Thermodynamical function + ZCJ, & ! used to compute the ventilation coefficient + ZKA, & ! Thermal conductivity of the air + ZDV, & ! Diffusivity of water vapor in the air + ZVISCA ! Viscosity of air +! +REAL, DIMENSION(:,:), ALLOCATABLE :: ZZW1 ! Work arrays +! +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: ZT, ZW ! Temperature +! +INTEGER :: IIB, IIE, IJB, IJE, IKB, IKE ! Physical domain +! +REAL, DIMENSION(:), ALLOCATABLE :: ZRTMIN, ZCTMIN +! +!------------------------------------------------------------------------------- +! +! Physical domain +! +IIB=1+JPHEXT +IIE=SIZE(PZZ,1) - JPHEXT +IJB=1+JPHEXT +IJE=SIZE(PZZ,2) - JPHEXT +IKB=1+JPVEXT +IKE=SIZE(PZZ,3) - JPVEXT +! +! Physical limitations +! +ALLOCATE(ZRTMIN(SIZE(XRTMIN))) +ALLOCATE(ZCTMIN(SIZE(XCTMIN))) +ZRTMIN(:) = XRTMIN(:) / PTSTEP +ZCTMIN(:) = XCTMIN(:) / PTSTEP +! +! Temperature +ZT(:,:,:) = PTHT(:,:,:) * ( PPABST(:,:,:)/XP00 ) ** (XRD/XCPD) +! +! Looking for regions where computations are necessary +! +GMICRO(:,:,:) = .FALSE. +GMICRO(IIB:IIE,IJB:IJE,IKB:IKE) = & + PRIT(IIB:IIE,IJB:IJE,IKB:IKE)>XRTMIN(4) .OR. & + PRST(IIB:IIE,IJB:IJE,IKB:IKE)>XRTMIN(5) +! +IMICRO = COUNTJV( GMICRO(:,:,:),I1(:),I2(:),I3(:)) +! +IF( IMICRO >= 1 ) THEN +! +!------------------------------------------------------------------------------ +! +! +!* 1. Optimization : packing variables +! -------------------------------- +! +! +! + ALLOCATE(ZRVT(IMICRO)) + ALLOCATE(ZRCT(IMICRO)) + ALLOCATE(ZRRT(IMICRO)) + ALLOCATE(ZRIT(IMICRO)) + ALLOCATE(ZRST(IMICRO)) + ALLOCATE(ZRGT(IMICRO)) +! + ALLOCATE(ZCIT(IMICRO)) +! + ALLOCATE(ZRVS(IMICRO)) + ALLOCATE(ZRIS(IMICRO)) + ALLOCATE(ZRSS(IMICRO)) +! + ALLOCATE(ZTHS(IMICRO)) +! + ALLOCATE(ZCIS(IMICRO)) +! + ALLOCATE(ZRHODREF(IMICRO)) + ALLOCATE(ZZT(IMICRO)) + ALLOCATE(ZPRES(IMICRO)) + ALLOCATE(ZEXNREF(IMICRO)) + DO JL=1,IMICRO + ZRVT(JL) = PRVT(I1(JL),I2(JL),I3(JL)) + ZRCT(JL) = PRCT(I1(JL),I2(JL),I3(JL)) + ZRRT(JL) = PRRT(I1(JL),I2(JL),I3(JL)) + ZRIT(JL) = PRIT(I1(JL),I2(JL),I3(JL)) + ZRST(JL) = PRST(I1(JL),I2(JL),I3(JL)) + ZRGT(JL) = PRGT(I1(JL),I2(JL),I3(JL)) +! + ZCIT(JL) = PCIT(I1(JL),I2(JL),I3(JL)) +! + ZRVS(JL) = PRVS(I1(JL),I2(JL),I3(JL)) + ZRIS(JL) = PRIS(I1(JL),I2(JL),I3(JL)) + ZRSS(JL) = PRSS(I1(JL),I2(JL),I3(JL)) +! + ZTHS(JL) = PTHS(I1(JL),I2(JL),I3(JL)) +! + ZCIS(JL) = PCIS(I1(JL),I2(JL),I3(JL)) +! + ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) + ZZT(JL) = ZT(I1(JL),I2(JL),I3(JL)) + ZPRES(JL) = PPABST(I1(JL),I2(JL),I3(JL)) + ZEXNREF(JL) = PEXNREF(I1(JL),I2(JL),I3(JL)) + ENDDO +! + IF (NBUMOD==KMI .AND. LBU_ENABLE) THEN + ALLOCATE(ZRHODJ(IMICRO)) + ZRHODJ(:) = PACK( PRHODJ(:,:,:),MASK=GMICRO(:,:,:) ) + END IF +! +! +!------------------------------------------------------------------------------ +! +! +!* 2. Microphysical computations +! -------------------------- +! +! + ALLOCATE(ZZW(IMICRO)) + ALLOCATE(ZZX(IMICRO)) + ALLOCATE(ZLSFACT(IMICRO)) + ALLOCATE(ZSSI(IMICRO)) + ALLOCATE(ZLBDAI(IMICRO)) + ALLOCATE(ZLBDAS(IMICRO)) + ALLOCATE(ZAI(IMICRO)) + ALLOCATE(ZCJ(IMICRO)) + ALLOCATE(ZKA(IMICRO)) + ALLOCATE(ZDV(IMICRO)) + ALLOCATE(ZZW1(IMICRO,7)) +! +! Preliminary computations +! + ZZW(:) = ZEXNREF(:)*( XCPD+XCPV*ZRVT(:)+XCL*(ZRCT(:)+ZRRT(:)) & + +XCI*(ZRIT(:)+ZRST(:)+ZRGT(:)) ) +! + ZLSFACT(:) = (XLSTT+(XCPV-XCI)*(ZZT(:)-XTT))/ZZW(:) ! L_s/(Pi_ref*C_ph) +! + ZZW(:) = EXP( XALPI - XBETAI/ZZT(:) - XGAMI*ALOG(ZZT(:) ) ) + ZSSI(:) = ZRVT(:)*( ZPRES(:)-ZZW(:) ) / ( (XMV/XMD) * ZZW(:) ) - 1.0 + ! Supersaturation over ice +! Distribution parameters for ice and snow + ZLBDAI(:) = 1.E10 + WHERE (ZRIT(:)>XRTMIN(4) .AND. ZCIT(:)>XCTMIN(4)) + ZLBDAI(:) = ( XLBI*ZCIT(:) / ZRIT(:) )**XLBEXI + END WHERE + ZLBDAS(:) = 1.E10 + WHERE (ZRST(:)>XRTMIN(5) ) + ZLBDAS(:) = XLBS*( ZRHODREF(:)*ZRST(:) )**XLBEXS + END WHERE +! + ZKA(:) = 2.38E-2 + 0.0071E-2 * ( ZZT(:) - XTT ) ! k_a + ZDV(:) = 0.211E-4 * (ZZT(:)/XTT)**1.94 * (XP00/ZPRES(:)) ! D_v +! +! Thermodynamical function ZAI = A_i(T,P) + ZAI(:) = ( XLSTT + (XCPV-XCI)*(ZZT(:)-XTT) )**2 / (ZKA(:)*XRV*ZZT(:)**2) & + + ( XRV*ZZT(:) ) / (ZDV(:)*ZZW(:)) +! ZCJ = c^prime_j/c_i (in the ventilation factor) ( c_i from v(D)=c_i*D^(d_i) ) + ZCJ(:) = XSCFAC * ZRHODREF(:)**0.3 / SQRT( 1.718E-5+0.0049E-5*(ZZT(:)-XTT) ) +! +! +! +! +!* 2.1 Conversion of snow to r_i: RSCNVI +! ---------------------------------------- +! + if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), 'CNVI', pris(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rs ) call Budget_store_init( tbudgets(NBUDGET_RS), 'CNVI', prss(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_sv ) & + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'CNVI', pcis(:, :, :) * prhodj(:, :, :) ) + end if + + WHERE ( ZRST(:)>XRTMIN(5) ) + ZLBDAS(:) = MIN( XLBDAS_MAX, & + XLBS*( ZRHODREF(:)*MAX( ZRST(:),XRTMIN(5) ) )**XLBEXS ) + END WHERE + ZZW(:) = 0.0 + WHERE ( ZLBDAS(:)<XLBDASCNVI_MAX .AND. (ZRST(:)>XRTMIN(5)) & + .AND. (ZSSI(:)<0.0) ) + ZZW(:) = (ZLBDAS(:)*XDSCNVI_LIM)**(XALPHAS) + ZZX(:) = ( -ZSSI(:)/ZAI(:) ) * (XCCS*ZLBDAS(:)**XCXS)/ZRHODREF(:) * (ZZW(:)**XNUI) & + * EXP(-ZZW(:)) +! + ZZW(:) = MIN( ( XR0DEPSI+XR1DEPSI*ZCJ(:) )*ZZX(:),ZRSS(:) ) + ZRIS(:) = ZRIS(:) + ZZW(:) + ZRSS(:) = ZRSS(:) - ZZW(:) +! + ZZW(:) = ZZW(:)*( XC0DEPSI+XC1DEPSI*ZCJ(:) )/( XR0DEPSI+XR1DEPSI*ZCJ(:) ) + ZCIS(:) = ZCIS(:) + ZZW(:) + END WHERE +! +! Budget storage + if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'CNVI', & + Unpack( zris(:), mask = gmicro(:, :, :), field = pris(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rs ) call Budget_store_end( tbudgets(NBUDGET_RS), 'CNVI', & + Unpack( zrss(:), mask = gmicro(:, :, :), field = prss(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_sv ) call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'CNVI', & + Unpack( zcis(:), mask = gmicro(:, :, :), field = pcis(:, :, :) ) * prhodj(:, :, :) ) + end if +! +! +!* 2.2 Deposition of water vapor on r_s: RVDEPS +! ----------------------------------------------- +! + if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'DEPS', pths(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rv ) call Budget_store_init( tbudgets(NBUDGET_RV), 'DEPS', prvs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rs ) call Budget_store_init( tbudgets(NBUDGET_RS), 'DEPS', & + Unpack( zrss(:), mask = gmicro(:, :, :), field = prss(:, :, :) ) * prhodj(:, :, :) ) + end if + + ZZW(:) = 0.0 + WHERE ( (ZRST(:)>XRTMIN(5)) .AND. (ZRSS(:)>ZRTMIN(5)) ) + ZZW(:) = ( ZSSI(:)/(ZRHODREF(:)*ZAI(:)) ) * & + ( X0DEPS*ZLBDAS(:)**XEX0DEPS + X1DEPS*ZCJ(:)*ZLBDAS(:)**XEX1DEPS ) + ZZW(:) = MIN( ZRVS(:),ZZW(:) )*(0.5+SIGN(0.5,ZZW(:))) & + - MIN( ZRSS(:),ABS(ZZW(:)) )*(0.5-SIGN(0.5,ZZW(:))) + ZRSS(:) = ZRSS(:) + ZZW(:) + ZRVS(:) = ZRVS(:) - ZZW(:) + ZTHS(:) = ZTHS(:) + ZZW(:)*ZLSFACT(:) + END WHERE +! Budget storage + if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'DEPS', & + Unpack( zths(:), mask = gmicro(:, :, :), field = pths(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rv ) call Budget_store_end( tbudgets(NBUDGET_RV), 'DEPS', & + Unpack( zrvs(:), mask = gmicro(:, :, :), field = prvs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rs ) call Budget_store_end( tbudgets(NBUDGET_RS), 'DEPS', & + Unpack( zrss(:), mask = gmicro(:, :, :), field = prss(:, :, :) ) * prhodj(:, :, :) ) + end if +! +!* 2.3 Conversion of pristine ice to r_s: RICNVS +! ------------------------------------------------ +! + if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), 'CNVS', & + Unpack( zris(:), mask = gmicro(:, :, :), field = pris(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rs ) call Budget_store_init( tbudgets(NBUDGET_RS), 'CNVS', & + Unpack( zrss(:), mask = gmicro(:, :, :), field = prss(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_sv ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'CNVS', & + Unpack( zcis(:), mask = gmicro(:, :, :), field = pcis(:, :, :) ) * prhodj(:, :, :) ) + end if + + ZZW(:) = 0.0 + WHERE ( (ZLBDAI(:)<XLBDAICNVS_LIM) .AND. (ZCIT(:)>XCTMIN(4)) & + .AND. (ZSSI(:)>0.0) ) + ZZW(:) = (ZLBDAI(:)*XDICNVS_LIM)**(XALPHAI) + ZZX(:) = ( ZSSI(:)/ZAI(:) )*ZCIT(:) * (ZZW(:)**XNUI) *EXP(-ZZW(:)) +! +! Correction BVIE +! ZZW(:) = MAX( MIN( ( XR0DEPIS + XR1DEPIS*ZCJ(:) )*ZZX(:)/ZRHODREF(:) & + ZZW(:) = MAX( MIN( ( XR0DEPIS + XR1DEPIS*ZCJ(:) )*ZZX(:) & + ,ZRIS(:) ) + ZRTMIN(5), ZRTMIN(5) ) - ZRTMIN(5) + ZRIS(:) = ZRIS(:) - ZZW(:) + ZRSS(:) = ZRSS(:) + ZZW(:) +! + ZZW(:) = MIN( ZZW(:)*(( XC0DEPIS+XC1DEPIS*ZCJ(:) ) & + /( XR0DEPIS+XR1DEPIS*ZCJ(:) )),ZCIS(:) ) + ZCIS(:) = ZCIS(:) - ZZW(:) + END WHERE +! +! Budget storage + if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'CNVS', & + Unpack( zris(:), mask = gmicro(:, :, :), field = pris(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rs ) call Budget_store_end( tbudgets(NBUDGET_RS), 'CNVS', & + Unpack( zrss(:), mask = gmicro(:, :, :), field = prss(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_sv ) call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'CNVS', & + Unpack( zcis(:), mask = gmicro(:, :, :), field = pcis(:, :, :) ) * prhodj(:, :, :) ) + end if +! +! +!* 2.4 Aggregation of r_i on r_s: CIAGGS and RIAGGS +! --------------------------------------------------- +! + if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), 'AGGS', & + Unpack( zris(:), mask = gmicro(:, :, :), field = pris(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rs ) call Budget_store_init( tbudgets(NBUDGET_RS), 'AGGS', & + Unpack( zrss(:), mask = gmicro(:, :, :), field = prss(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_sv ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'AGGS', & + Unpack( zcis(:), mask = gmicro(:, :, :), field = pcis(:, :, :) ) * prhodj(:, :, :) ) + end if + + WHERE ( (ZRIT(:)>XRTMIN(4)) .AND. (ZRST(:)>XRTMIN(5)) .AND. (ZRIS(:)>ZRTMIN(4)) & + .AND. (ZCIS(:)>ZCTMIN(4)) ) + ZZW1(:,3) = (ZLBDAI(:) / ZLBDAS(:))**3 + ZZW1(:,1) = (ZCIT(:)*(XCCS*ZLBDAS(:)**XCXS)/ZRHODREF(:)*EXP( XCOLEXIS*(ZZT(:)-XTT) )) & + / (ZLBDAI(:)**3) + ZZW1(:,2) = MIN( ZZW1(:,1)*(XAGGS_CLARGE1+XAGGS_CLARGE2*ZZW1(:,3)),ZCIS(:) ) + ZCIS(:) = ZCIS(:) - ZZW1(:,2) +! + ZZW1(:,1) = ZZW1(:,1) / ZLBDAI(:)**XBI + ZZW1(:,2) = MIN( ZZW1(:,1)*(XAGGS_RLARGE1+XAGGS_RLARGE2*ZZW1(:,3)),ZRIS(:) ) + ZRIS(:) = ZRIS(:) - ZZW1(:,2) + ZRSS(:) = ZRSS(:) + ZZW1(:,2) + END WHERE +! Budget storage + if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'AGGS', & + Unpack( zris(:), mask = gmicro(:, :, :), field = pris(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rs ) call Budget_store_end( tbudgets(NBUDGET_RS), 'AGGS', & + Unpack( zrss(:), mask = gmicro(:, :, :), field = prss(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_sv ) call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'AGGS', & + Unpack( zcis(:), mask = gmicro(:, :, :), field = pcis(:, :, :) ) * prhodj(:, :, :) ) + end if +!------------------------------------------------------------------------------ +! +! +!* 3. Unpacking & Deallocating +! ------------------------ +! +! + ZW(:,:,:) = PRVS(:,:,:) + PRVS(:,:,:) = UNPACK( ZRVS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PRIS(:,:,:) + PRIS(:,:,:) = UNPACK( ZRIS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PRSS(:,:,:) + PRSS(:,:,:) = UNPACK( ZRSS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) +! + ZW(:,:,:) = PCIS(:,:,:) + PCIS(:,:,:) = UNPACK( ZCIS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) +! + ZW(:,:,:) = PTHS(:,:,:) + PTHS(:,:,:) = UNPACK( ZTHS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) +! + DEALLOCATE(ZRVT) + DEALLOCATE(ZRCT) + DEALLOCATE(ZRRT) + DEALLOCATE(ZRIT) + DEALLOCATE(ZRST) + DEALLOCATE(ZRGT) + DEALLOCATE(ZCIT) + DEALLOCATE(ZRVS) + DEALLOCATE(ZRIS) + DEALLOCATE(ZRSS) + DEALLOCATE(ZTHS) + DEALLOCATE(ZCIS) + DEALLOCATE(ZRHODREF) + DEALLOCATE(ZZT) + DEALLOCATE(ZPRES) + DEALLOCATE(ZEXNREF) + DEALLOCATE(ZZW) + DEALLOCATE(ZZX) + DEALLOCATE(ZLSFACT) + DEALLOCATE(ZSSI) + DEALLOCATE(ZLBDAI) + DEALLOCATE(ZLBDAS) + DEALLOCATE(ZAI) + DEALLOCATE(ZCJ) + DEALLOCATE(ZKA) + DEALLOCATE(ZDV) + DEALLOCATE(ZZW1) + IF (NBUMOD==KMI .AND. LBU_ENABLE) DEALLOCATE(ZRHODJ) +! +END IF +! +!++cb++ +DEALLOCATE(ZRTMIN) +DEALLOCATE(ZCTMIN) +!--cb-- +! +END SUBROUTINE LIMA_COLD_SLOW_PROCESSES + diff --git a/src/mesonh/micro/lima_compute_cloud_fractions.f90 b/src/mesonh/micro/lima_compute_cloud_fractions.f90 new file mode 100644 index 000000000..ce1cedeee --- /dev/null +++ b/src/mesonh/micro/lima_compute_cloud_fractions.f90 @@ -0,0 +1,173 @@ +!MNH_LIC Copyright 2019-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!------------------------------------------------------------------------------- +!####################################### +MODULE MODI_LIMA_COMPUTE_CLOUD_FRACTIONS +!####################################### + INTERFACE + SUBROUTINE LIMA_COMPUTE_CLOUD_FRACTIONS (KIB, KIE, KJB, KJE, KKB, KKE, KKL, & + PCCT, PRCT, & + PCRT, PRRT, & + PCIT, PRIT, & + PRST, PRGT, PRHT, & + PCLDFR, PICEFR, PPRCFR ) + INTEGER, INTENT(IN) :: KIB ! + INTEGER, INTENT(IN) :: KIE ! + INTEGER, INTENT(IN) :: KJB ! + INTEGER, INTENT(IN) :: KJE ! + INTEGER, INTENT(IN) :: KKB ! + INTEGER, INTENT(IN) :: KKE ! + INTEGER, INTENT(IN) :: KKL ! + ! + REAL, DIMENSION(:,:,:),INTENT(IN) :: PCCT ! + REAL, DIMENSION(:,:,:),INTENT(IN) :: PRCT ! + ! + REAL, DIMENSION(:,:,:),INTENT(IN) :: PCRT ! + REAL, DIMENSION(:,:,:),INTENT(IN) :: PRRT ! + ! + REAL, DIMENSION(:,:,:),INTENT(IN) :: PCIT ! + REAL, DIMENSION(:,:,:),INTENT(IN) :: PRIT ! + ! + REAL, DIMENSION(:,:,:),INTENT(IN) :: PRST ! + REAL, DIMENSION(:,:,:),INTENT(IN) :: PRGT ! + REAL, DIMENSION(:,:,:),INTENT(IN) :: PRHT ! + ! + REAL, DIMENSION(:,:,:),INTENT(INOUT) :: PCLDFR ! + REAL, DIMENSION(:,:,:),INTENT(INOUT) :: PICEFR ! + REAL, DIMENSION(:,:,:),INTENT(INOUT) :: PPRCFR ! + ! + END SUBROUTINE LIMA_COMPUTE_CLOUD_FRACTIONS + END INTERFACE +END MODULE MODI_LIMA_COMPUTE_CLOUD_FRACTIONS +! +! +!################################################################ +SUBROUTINE LIMA_COMPUTE_CLOUD_FRACTIONS (KIB, KIE, KJB, KJE, KKB, KKE, KKL, & + PCCT, PRCT, & + PCRT, PRRT, & + PCIT, PRIT, & + PRST, PRGT, PRHT, & + PCLDFR, PICEFR, PPRCFR ) +!################################################################ +! +!! +!! PURPOSE +!! ------- +!! Compute cloud, ice and precipitating fractions +!! +!! AUTHOR +!! ------ +!! B. Vié * CNRM * +!! +!! MODIFICATIONS +!! ------------- +!! Original 06/03/2019 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAM_LIMA, ONLY : XCTMIN, XRTMIN +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +INTEGER, INTENT(IN) :: KIB ! +INTEGER, INTENT(IN) :: KIE ! +INTEGER, INTENT(IN) :: KJB ! +INTEGER, INTENT(IN) :: KJE ! +INTEGER, INTENT(IN) :: KKB ! +INTEGER, INTENT(IN) :: KKE ! +INTEGER, INTENT(IN) :: KKL ! +! +REAL, DIMENSION(:,:,:),INTENT(IN) :: PCCT ! +REAL, DIMENSION(:,:,:),INTENT(IN) :: PRCT ! +! +REAL, DIMENSION(:,:,:),INTENT(IN) :: PCRT ! +REAL, DIMENSION(:,:,:),INTENT(IN) :: PRRT ! +! +REAL, DIMENSION(:,:,:),INTENT(IN) :: PCIT ! +REAL, DIMENSION(:,:,:),INTENT(IN) :: PRIT ! +! +REAL, DIMENSION(:,:,:),INTENT(IN) :: PRST ! +REAL, DIMENSION(:,:,:),INTENT(IN) :: PRGT ! +REAL, DIMENSION(:,:,:),INTENT(IN) :: PRHT ! +! +REAL, DIMENSION(:,:,:),INTENT(INOUT) :: PCLDFR ! +REAL, DIMENSION(:,:,:),INTENT(INOUT) :: PICEFR ! +REAL, DIMENSION(:,:,:),INTENT(INOUT) :: PPRCFR ! +! +!* 0.2 Declarations of local variables : +! +INTEGER :: JI, JJ, JK +! +!------------------------------------------------------------------------------- +! +! CLOUD FRACTIONS +! --------------- +! +! Liquid cloud fraction is kept from input data, except where PCLDFR=0 and rc>0 +WHERE(PCLDFR(:,:,:)<1.E-10 .AND. PRCT(:,:,:)>XRTMIN(2) .AND. PCCT(:,:,:)>XCTMIN(2)) PCLDFR(:,:,:)=1. +! +! Ice cloud fraction is currently 0 or 1 +PICEFR(:,:,:)=0. +WHERE(PICEFR(:,:,:)<1.E-10 .AND. PRIT(:,:,:)>XRTMIN(4) .AND. PCIT(:,:,:)>XCTMIN(4)) PICEFR(:,:,:)=1. +! +! Precipitation fraction +!!$PPRCFR(:,:,:) = MAX(PCLDFR(:,:,:),PICEFR(:,:,:)) +!!$DO JI = KIB,KIE +!!$ DO JJ = KJB, KJE +!!$ DO JK=KKE-KKL, KKB, -KKL +!!$ IF ( (PRRT(JI,JJ,JK).GT.XRTMIN(3) .AND. PCRT(JI,JJ,JK).GT.XCTMIN(3)) .OR. & +!!$ PRST(JI,JJ,JK).GT.XRTMIN(5) .OR. & +!!$ PRGT(JI,JJ,JK).GT.XRTMIN(6) .OR. & +!!$ PRHT(JI,JJ,JK).GT.XRTMIN(7) ) THEN +!!$ PPRCFR(JI,JJ,JK)=MAX(PPRCFR(JI,JJ,JK),PPRCFR(JI,JJ,JK+KKL)) +!!$ IF (PPRCFR(JI,JJ,JK)==0) THEN +!!$ PPRCFR(JI,JJ,JK)=1. +!!$ END IF +!!$ ELSE +!!$ !PPRCFR(JI,JJ,JK)=0. +!!$ END IF +!!$ END DO +!!$ END DO +!!$END DO +!!$ +!!$PPRCFR(:,:,:) = MAX(PCLDFR(:,:,:),PICEFR(:,:,:)) +!!$DO JI = KIB,KIE +!!$ DO JJ = KJB, KJE +!!$ DO JK=KKE-KKL, KKB, -KKL +!!$ IF ( (PRRT(JI,JJ,JK).GT.0. .AND. PCRT(JI,JJ,JK).GT.0.) .OR. & +!!$ PRST(JI,JJ,JK).GT.0. .OR. & +!!$ PRGT(JI,JJ,JK).GT.0. .OR. & +!!$ PRHT(JI,JJ,JK).GT.0. ) THEN +!!$ PPRCFR(JI,JJ,JK)=MAX(PPRCFR(JI,JJ,JK),PPRCFR(JI,JJ,JK+KKL)) +!!$ IF (PPRCFR(JI,JJ,JK)==0) THEN +!!$ PPRCFR(JI,JJ,JK)=1. +!!$ END IF +!!$ ELSE +!!$ !PPRCFR(JI,JJ,JK)=0. +!!$ END IF +!!$ END DO +!!$ END DO +!!$END DO +!!$ +!!$PPRCFR(:,:,:) = 0. +!!$WHERE ( (PRRT(:,:,:).GT.XRTMIN(3) .AND. PCRT(:,:,:).GT.XCTMIN(3)) .OR. & +!!$ PRST(:,:,:).GT.XRTMIN(5) .OR. & +!!$ PRGT(:,:,:).GT.XRTMIN(6) .OR. & +!!$ PRHT(:,:,:).GT.XRTMIN(7) ) PPRCFR(:,:,:) = 1. +!!$ +PPRCFR(:,:,:) = 0. +WHERE ( (PRRT(:,:,:).GT.0. .AND. PCRT(:,:,:).GT.0.) .OR. & + PRST(:,:,:).GT.0. .OR. & + PRGT(:,:,:).GT.0. .OR. & + PRHT(:,:,:).GT.0. ) PPRCFR(:,:,:) = 1. +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE LIMA_COMPUTE_CLOUD_FRACTIONS diff --git a/src/mesonh/micro/lima_conversion_melting_snow.f90 b/src/mesonh/micro/lima_conversion_melting_snow.f90 new file mode 100644 index 000000000..ff5a69146 --- /dev/null +++ b/src/mesonh/micro/lima_conversion_melting_snow.f90 @@ -0,0 +1,121 @@ +!MNH_LIC Copyright 2018-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!------------------------------------------------------------------------------- +! ################################# + MODULE MODI_LIMA_CONVERSION_MELTING_SNOW +! ################################# +! +INTERFACE + SUBROUTINE LIMA_CONVERSION_MELTING_SNOW (LDCOMPUTE, & + PRHODREF, PPRES, PT, PKA, PDV, PCJ, & + PRVT, PRST, PLBDS, & + P_RS_CMEL ) +! +LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE +! +REAL, DIMENSION(:), INTENT(IN) :: PRHODREF ! Reference Exner function +REAL, DIMENSION(:), INTENT(IN) :: PPRES ! +REAL, DIMENSION(:), INTENT(IN) :: PT ! +REAL, DIMENSION(:), INTENT(IN) :: PKA ! +REAL, DIMENSION(:), INTENT(IN) :: PDV ! +REAL, DIMENSION(:), INTENT(IN) :: PCJ ! +! +REAL, DIMENSION(:), INTENT(IN) :: PRVT ! +REAL, DIMENSION(:), INTENT(IN) :: PRST ! Cloud water C. at t +REAL, DIMENSION(:), INTENT(IN) :: PLBDS ! +! +REAL, DIMENSION(:), INTENT(OUT) :: P_RS_CMEL +! +END SUBROUTINE LIMA_CONVERSION_MELTING_SNOW +END INTERFACE +END MODULE MODI_LIMA_CONVERSION_MELTING_SNOW +! +! ############################################################################## + SUBROUTINE LIMA_CONVERSION_MELTING_SNOW (LDCOMPUTE, & + PRHODREF, PPRES, PT, PKA, PDV, PCJ, & + PRVT, PRST, PLBDS, & + P_RS_CMEL ) +! ############################################################################## +! +!! PURPOSE +!! ------- +!! Compute the conversion-melting of snow into graupel +!! +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * CNRM * +!! +!! MODIFICATIONS +!! ------------- +!! Original 15/03/2018 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST, ONLY : XTT, XMV, XMD, XLVTT, XCPV, XCL, XESTT, XRV +USE MODD_PARAM_LIMA, ONLY : XRTMIN +USE MODD_PARAM_LIMA_MIXED, ONLY : XFSCVMG +USE MODD_PARAM_LIMA_COLD, ONLY : X0DEPS, XEX0DEPS, X1DEPS, XEX1DEPS +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE +! +REAL, DIMENSION(:), INTENT(IN) :: PRHODREF ! Reference Exner function +REAL, DIMENSION(:), INTENT(IN) :: PPRES ! +REAL, DIMENSION(:), INTENT(IN) :: PT ! +REAL, DIMENSION(:), INTENT(IN) :: PKA ! +REAL, DIMENSION(:), INTENT(IN) :: PDV ! +REAL, DIMENSION(:), INTENT(IN) :: PCJ ! +! +REAL, DIMENSION(:), INTENT(IN) :: PRVT ! +REAL, DIMENSION(:), INTENT(IN) :: PRST ! Cloud water C. at t +REAL, DIMENSION(:), INTENT(IN) :: PLBDS ! +! +REAL, DIMENSION(:), INTENT(OUT) :: P_RS_CMEL +! +!* 0.2 Declarations of local variables : +! +REAL, DIMENSION(SIZE(PRST)) :: ZW ! work arrays +! +!------------------------------------------------------------------------------- +! +! +!* 1. Conversion-melting of snow +! -------------------------- +! +! +P_RS_CMEL(:)=0. +! +ZW(:) = 0.0 +WHERE( (PRST(:)>XRTMIN(5)) .AND. (PT(:)>XTT) .AND. LDCOMPUTE(:) ) + ZW(:) = PRVT(:)*PPRES(:)/((XMV/XMD)+PRVT(:)) ! Vapor pressure + ZW(:) = PKA(:)*(XTT-PT(:)) + & + ( PDV(:)*(XLVTT + ( XCPV - XCL ) * ( PT(:) - XTT )) & + *(XESTT-ZW(:))/(XRV*PT(:)) ) +! +! compute RSMLT +! + ZW(:) = XFSCVMG*MAX( 0.0,( -ZW(:) * & + ( X0DEPS* PLBDS(:)**XEX0DEPS + & + X1DEPS*PCJ(:)*PLBDS(:)**XEX1DEPS ) ))!- & +! On ne tient pas compte de la collection de pluie et gouttelettes par la neige si T>0 !!!! +! Note that no heat is exchanged because the graupeln produced are still icy!!! + P_RS_CMEL(:) = - ZW(:) +! +END WHERE +! +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE LIMA_CONVERSION_MELTING_SNOW diff --git a/src/mesonh/micro/lima_droplets_accretion.f90 b/src/mesonh/micro/lima_droplets_accretion.f90 new file mode 100644 index 000000000..8996b5425 --- /dev/null +++ b/src/mesonh/micro/lima_droplets_accretion.f90 @@ -0,0 +1,160 @@ +!MNH_LIC Copyright 2018-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!------------------------------------------------------------------------------- +! ################################# + MODULE MODI_LIMA_DROPLETS_ACCRETION +! ################################# +! +INTERFACE + SUBROUTINE LIMA_DROPLETS_ACCRETION (LDCOMPUTE, & + PRHODREF, & + PRCT, PRRT, PCCT, PCRT, & + PLBDC, PLBDC3, PLBDR, PLBDR3, & + P_RC_ACCR, P_CC_ACCR ) +! +LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE +! +REAL, DIMENSION(:), INTENT(IN) :: PRHODREF ! Reference Exner function +! +REAL, DIMENSION(:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: PRRT ! Rain m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: PCCT ! Cloud water conc. at t +REAL, DIMENSION(:), INTENT(IN) :: PCRT ! Rain conc. at t +REAL, DIMENSION(:), INTENT(IN) :: PLBDC ! +REAL, DIMENSION(:), INTENT(IN) :: PLBDC3 ! +REAL, DIMENSION(:), INTENT(IN) :: PLBDR ! +REAL, DIMENSION(:), INTENT(IN) :: PLBDR3 ! +! +REAL, DIMENSION(:), INTENT(OUT) :: P_RC_ACCR +REAL, DIMENSION(:), INTENT(OUT) :: P_CC_ACCR +! +END SUBROUTINE LIMA_DROPLETS_ACCRETION +END INTERFACE +END MODULE MODI_LIMA_DROPLETS_ACCRETION +! +! ##################################################################### + SUBROUTINE LIMA_DROPLETS_ACCRETION (LDCOMPUTE, & + PRHODREF, & + PRCT, PRRT, PCCT, PCRT, & + PLBDC, PLBDC3, PLBDR, PLBDR3, & + P_RC_ACCR, P_CC_ACCR ) +! ##################################################################### +! +!! PURPOSE +!! ------- +!! Compute the accretion of cloud droplets by rain drops +!! +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original 15/03/2018 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCTMIN +USE MODD_PARAM_LIMA_WARM, ONLY : XLAUTR, XAUTO1, XLAUTR_THRESHOLD, & + XACCR4, XACCR5, XACCR3, XACCR2, XACCR1, & + XACCR_CLARGE1, XACCR_CLARGE2, XACCR_RLARGE1, XACCR_RLARGE2, & + XACCR_CSMALL1, XACCR_CSMALL2, XACCR_RSMALL1, XACCR_RSMALL2 +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE +! +REAL, DIMENSION(:), INTENT(IN) :: PRHODREF ! Reference Exner function +! +REAL, DIMENSION(:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: PRRT ! Rain m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: PCCT ! Cloud water conc. at t +REAL, DIMENSION(:), INTENT(IN) :: PCRT ! Rain conc. at t +REAL, DIMENSION(:), INTENT(IN) :: PLBDC ! +REAL, DIMENSION(:), INTENT(IN) :: PLBDC3 ! +REAL, DIMENSION(:), INTENT(IN) :: PLBDR ! +REAL, DIMENSION(:), INTENT(IN) :: PLBDR3 ! +! +REAL, DIMENSION(:), INTENT(OUT) :: P_RC_ACCR +REAL, DIMENSION(:), INTENT(OUT) :: P_CC_ACCR +! +!* 0.2 Declarations of local variables : +! +REAL, DIMENSION(SIZE(PRCT)) :: ZW1, ZW2, ZW3, ZW4 ! work arrays +LOGICAL, DIMENSION(SIZE(PRCT)) :: GACCR +! +!------------------------------------------------------------------------------- +! +! +! +!* 1. Accretion of cloud droplets on rain drops +! -------------------------------------------- +! +P_RC_ACCR(:) = 0.0 +P_CC_ACCR(:) = 0.0 +! +ZW1(:) = 0.0 +ZW2(:) = 0.0 +ZW3(:) = 0.0 +ZW4(:) = 0.0 +! +WHERE( PRCT(:)>XRTMIN(2) .AND. PCCT(:)>XCTMIN(2) .AND. PRRT(:)>XRTMIN(3) .AND. PCRT(:)>XCTMIN(3) .AND. LDCOMPUTE(:) ) + ZW2(:) = MAX( 0.0,XLAUTR*PRHODREF(:)*PRCT(:)*(XAUTO1/PLBDC(:)**4-XLAUTR_THRESHOLD) ) ! L + ZW4(:) = XACCR1/PLBDR(:) +END WHERE +! +GACCR(:) = LDCOMPUTE(:) .AND. & + PRRT(:)>XRTMIN(3) .AND. & + PCRT(:)>XCTMIN(3) .AND. & + PRCT(:)>XRTMIN(2) .AND. & + PCCT(:)>XCTMIN(2) .AND. & + (PRRT(:)>1.2*ZW2(:)/PRHODREF(:) .OR. & + ZW4(:)>=MAX(XACCR2,XACCR3/(XACCR4/PLBDC(:)-XACCR5)) ) +! +! Accretion for D>100 10-6 m +WHERE( GACCR(:).AND.(ZW4(:)>1.E-4) ) + ZW3(:) = MIN(PLBDC3(:) / PLBDR3(:),1.E15) + ZW1(:) = ( PCCT(:)*PCRT(:) / PLBDC3(:) )*PRHODREF(:) + ZW2(:) = ZW1(:)*(XACCR_CLARGE1+XACCR_CLARGE2*ZW3(:)) +! + P_CC_ACCR(:) = - ZW2(:) +! + ZW1(:) = ( ZW1(:) / PLBDC3(:) ) + ZW2(:) = ZW1(:)*(XACCR_RLARGE1+XACCR_RLARGE2*ZW3(:)) +! + P_RC_ACCR(:) = - ZW2(:) +END WHERE +! +! Accretion for D<100 10-6 m +WHERE( GACCR(:).AND.(ZW4(:)<=1.E-4) ) + ZW3(:) = MIN(PLBDC3(:) / PLBDR3(:), 1.E8) + ZW1(:) = ( PCCT(:)*PCRT(:) / PLBDC3(:) )*PRHODREF(:) + ZW1(:) = ZW1(:)/PLBDC3(:) + + ZW3(:) = ZW3(:)**2 + ZW2(:) = ZW1(:)*(XACCR_CSMALL1+XACCR_CSMALL2*ZW3(:)) +! + P_CC_ACCR(:) = - ZW2(:) +! + ZW1(:) = ZW1(:) / PLBDC3(:) + ZW2(:) = ZW1(:)*(XACCR_RSMALL1+XACCR_RSMALL2*ZW3(:)) +! + P_RC_ACCR(:) = - ZW2(:) +END WHERE +! +! +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE LIMA_DROPLETS_ACCRETION diff --git a/src/mesonh/micro/lima_droplets_autoconversion.f90 b/src/mesonh/micro/lima_droplets_autoconversion.f90 new file mode 100644 index 000000000..044030f79 --- /dev/null +++ b/src/mesonh/micro/lima_droplets_autoconversion.f90 @@ -0,0 +1,127 @@ +!MNH_LIC Copyright 2018-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!------------------------------------------------------------------------------- +! ################################# + MODULE MODI_LIMA_DROPLETS_AUTOCONVERSION +! ################################# +! +INTERFACE + SUBROUTINE LIMA_DROPLETS_AUTOCONVERSION (LDCOMPUTE, & + PRHODREF, & + PRCT, PCCT, PLBDC, PLBDR, & + P_RC_AUTO, P_CC_AUTO, P_CR_AUTO ) +! +LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE +! +REAL, DIMENSION(:), INTENT(IN) :: PRHODREF ! Reference Exner function +! +REAL, DIMENSION(:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: PCCT ! Cloud water conc. at t +REAL, DIMENSION(:), INTENT(IN) :: PLBDC ! +REAL, DIMENSION(:), INTENT(IN) :: PLBDR ! +! +REAL, DIMENSION(:), INTENT(OUT) :: P_RC_AUTO +REAL, DIMENSION(:), INTENT(OUT) :: P_CC_AUTO +REAL, DIMENSION(:), INTENT(OUT) :: P_CR_AUTO +! +END SUBROUTINE LIMA_DROPLETS_AUTOCONVERSION +END INTERFACE +END MODULE MODI_LIMA_DROPLETS_AUTOCONVERSION +! +! ########################################################################## + SUBROUTINE LIMA_DROPLETS_AUTOCONVERSION (LDCOMPUTE, & + PRHODREF, & + PRCT, PCCT, PLBDC, PLBDR, & + P_RC_AUTO, P_CC_AUTO, P_CR_AUTO ) +! ########################################################################## +! +!! PURPOSE +!! ------- +!! Compute the autoconversion of cloud droplets +!! +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original 15/03/2018 +!! B. Vie 02/03/2020 : missing CC process +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCTMIN +USE MODD_PARAM_LIMA_WARM, ONLY : XLAUTR, XAUTO1, XLAUTR_THRESHOLD, & + XITAUTR, XAUTO2, XITAUTR_THRESHOLD, & + XACCR4, XACCR5, XACCR3, XACCR1, XAC +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE +! +REAL, DIMENSION(:), INTENT(IN) :: PRHODREF ! Reference Exner function +! +REAL, DIMENSION(:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: PCCT ! Cloud water conc. at t +REAL, DIMENSION(:), INTENT(IN) :: PLBDC ! +REAL, DIMENSION(:), INTENT(IN) :: PLBDR ! +! +REAL, DIMENSION(:), INTENT(OUT) :: P_RC_AUTO +REAL, DIMENSION(:), INTENT(OUT) :: P_CC_AUTO +REAL, DIMENSION(:), INTENT(OUT) :: P_CR_AUTO +! +!* 0.2 Declarations of local variables : +! +REAL, DIMENSION(SIZE(PRCT)) :: ZW1, ZW2, ZW3 ! work arrays +! +!------------------------------------------------------------------------------- +! +! +! +!* 1. Autoconversion of cloud droplets (Berry-Reinhardt parameterization) +! ---------------------------------------------------------------------- +! +! +! +P_RC_AUTO(:) = 0.0 +P_CC_AUTO(:) = 0.0 +P_CR_AUTO(:) = 0.0 +! +ZW3(:) = 0.0 +ZW2(:) = 0.0 +ZW1(:) = 0.0 +WHERE( PRCT(:)>XRTMIN(2) .AND. PCCT(:)>XCTMIN(2) .AND. PLBDC(:)>0. .AND. LDCOMPUTE(:) ) + ZW2(:) = MAX( 0.0, & + XLAUTR*PRHODREF(:)*PRCT(:)*(XAUTO1/min(PLBDC(:),1.e9)**4-XLAUTR_THRESHOLD) ) ! L +! + ZW3(:) = MAX( 0.0, & + XITAUTR*ZW2(:)*PRCT(:)*(XAUTO2/PLBDC(:)-XITAUTR_THRESHOLD) ) ! L/tau +! + P_RC_AUTO(:) = - ZW3(:) +! + ZW1(:) = MIN( MIN( 1.2E4, & + (XACCR4/PLBDC(:)-XACCR5)/XACCR3 ), & + PLBDR(:)/XACCR1 ) ! D**-1 threshold diameter for + ! switching the autoconversion regimes + ! min (80 microns, D_h, D_r) + ZW3(:) = ZW3(:) * MAX( 0.0,ZW1(:) )**3 / XAC +! + P_CC_AUTO(:) = -ZW3(:) + P_CR_AUTO(:) = ZW3(:) +! +END WHERE +! +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE LIMA_DROPLETS_AUTOCONVERSION diff --git a/src/mesonh/micro/lima_droplets_hom_freezing.f90 b/src/mesonh/micro/lima_droplets_hom_freezing.f90 new file mode 100644 index 000000000..db27f466e --- /dev/null +++ b/src/mesonh/micro/lima_droplets_hom_freezing.f90 @@ -0,0 +1,145 @@ +!MNH_LIC Copyright 2013-2018 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +! ################################# + MODULE MODI_LIMA_DROPLETS_HOM_FREEZING +! ################################# +! +INTERFACE + SUBROUTINE LIMA_DROPLETS_HOM_FREEZING (PTSTEP, LDCOMPUTE, & + PT, PLVFACT, PLSFACT, & + PRCT, PCCT, PLBDC, & + P_TH_HONC, P_RC_HONC, P_CC_HONC, & + PA_TH, PA_RC, PA_CC, PA_RI, PA_CI ) +! +REAL, INTENT(IN) :: PTSTEP +LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE +! +REAL, DIMENSION(:), INTENT(IN) :: PT ! +REAL, DIMENSION(:), INTENT(IN) :: PLVFACT ! +REAL, DIMENSION(:), INTENT(IN) :: PLSFACT ! +! +REAL, DIMENSION(:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: PCCT ! Cloud water C. at t +REAL, DIMENSION(:), INTENT(IN) :: PLBDC ! Cloud water lambda +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_HONC +REAL, DIMENSION(:), INTENT(INOUT) :: P_RC_HONC +REAL, DIMENSION(:), INTENT(INOUT) :: P_CC_HONC +! +REAL, DIMENSION(:), INTENT(INOUT) :: PA_TH +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RC +REAL, DIMENSION(:), INTENT(INOUT) :: PA_CC +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RI +REAL, DIMENSION(:), INTENT(INOUT) :: PA_CI +! +END SUBROUTINE LIMA_DROPLETS_HOM_FREEZING +END INTERFACE +END MODULE MODI_LIMA_DROPLETS_HOM_FREEZING +! +! ########################################################################## + SUBROUTINE LIMA_DROPLETS_HOM_FREEZING (PTSTEP, LDCOMPUTE, & + PT, PLVFACT, PLSFACT, & + PRCT, PCCT, PLBDC, & + P_TH_HONC, P_RC_HONC, P_CC_HONC, & + PA_TH, PA_RC, PA_CC, PA_RI, PA_CI ) +! ########################################################################## +! +!! PURPOSE +!! ------- +!! Compute the cloud droplets homogeneous freezing rate +!! +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * CNRM * +!! +!! MODIFICATIONS +!! ------------- +!! Original 15/03/2018 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST, ONLY : XTT +USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCTMIN, XNUC +USE MODD_PARAM_LIMA_COLD, ONLY : XC_HONC, XTEXP1_HONC, XTEXP2_HONC, XTEXP3_HONC, & + XTEXP4_HONC, XTEXP5_HONC +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +REAL, INTENT(IN) :: PTSTEP +LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE +! +REAL, DIMENSION(:), INTENT(IN) :: PT ! +REAL, DIMENSION(:), INTENT(IN) :: PLVFACT ! +REAL, DIMENSION(:), INTENT(IN) :: PLSFACT ! +! +REAL, DIMENSION(:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: PCCT ! Cloud water C. at t +REAL, DIMENSION(:), INTENT(IN) :: PLBDC ! Cloud water lambda +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_HONC +REAL, DIMENSION(:), INTENT(INOUT) :: P_RC_HONC +REAL, DIMENSION(:), INTENT(INOUT) :: P_CC_HONC +! +REAL, DIMENSION(:), INTENT(INOUT) :: PA_TH +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RC +REAL, DIMENSION(:), INTENT(INOUT) :: PA_CC +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RI +REAL, DIMENSION(:), INTENT(INOUT) :: PA_CI +! +!* 0.2 Declarations of local variables : +! +REAL, DIMENSION(SIZE(PT)) :: ZZW, ZZX, ZZY, ZTCELSIUS +! +!------------------------------------------------------------------------------- +! +! +!* 1. Cloud droplets homogeneous freezing +! ----------------------------------- +! +! +P_TH_HONC(:) = 0. +P_RC_HONC(:) = 0. +P_CC_HONC(:) = 0. +! +WHERE ( (PT(:)<XTT-35.0) .AND. (PCCT(:)>XCTMIN(2)) .AND. (PRCT(:)>XRTMIN(2)) ) + ZTCELSIUS(:) = PT(:)-XTT ! T [°C] + ! + ZZW(:) = 0.0 + ZZX(:) = 0.0 + ZZY(:) = 0.0 + + ZZX(:) = 1.0 / ( 1.0 + (XC_HONC/PLBDC(:))*PTSTEP* & + EXP( XTEXP1_HONC + ZTCELSIUS(:)*( & + XTEXP2_HONC + ZTCELSIUS(:)*( & + XTEXP3_HONC + ZTCELSIUS(:)*( & + XTEXP4_HONC + ZTCELSIUS(:)*XTEXP5_HONC))) ) )**XNUC +! + ZZW(:) = PCCT(:) * (1.0 - ZZX(:)) ! CCHONI + ZZY(:) = PRCT(:) * (1.0 - ZZX(:)) ! RCHONI +! + P_RC_HONC(:) = - ZZY(:)/PTSTEP + P_CC_HONC(:) = - ZZW(:)/PTSTEP + P_TH_HONC(:) = P_RC_HONC(:) * (PLSFACT(:)-PLVFACT(:)) +! + PA_TH(:) = PA_TH(:) + P_TH_HONC(:) + PA_RC(:) = PA_RC(:) + P_RC_HONC(:) + PA_CC(:) = PA_CC(:) + P_CC_HONC(:) + PA_RI(:) = PA_RI(:) - P_RC_HONC(:) + PA_CI(:) = PA_CI(:) - P_CC_HONC(:) +! +END WHERE +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE LIMA_DROPLETS_HOM_FREEZING diff --git a/src/mesonh/micro/lima_droplets_riming_snow.f90 b/src/mesonh/micro/lima_droplets_riming_snow.f90 new file mode 100644 index 000000000..6bef29df3 --- /dev/null +++ b/src/mesonh/micro/lima_droplets_riming_snow.f90 @@ -0,0 +1,226 @@ +!MNH_LIC Copyright 2018-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!------------------------------------------------------------------------------- +! ################################# + MODULE MODI_LIMA_DROPLETS_RIMING_SNOW +! ################################# +! +INTERFACE + SUBROUTINE LIMA_DROPLETS_RIMING_SNOW (PTSTEP, LDCOMPUTE, & + PRHODREF, PT, & + PRCT, PCCT, PRST, PLBDC, PLBDS, PLVFACT, PLSFACT, & + P_TH_RIM, P_RC_RIM, P_CC_RIM, P_RS_RIM, P_RG_RIM, & + P_RI_HMS, P_CI_HMS, P_RS_HMS ) +! +REAL, INTENT(IN) :: PTSTEP +LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE +! +REAL, DIMENSION(:), INTENT(IN) :: PRHODREF ! +REAL, DIMENSION(:), INTENT(IN) :: PT ! +! +REAL, DIMENSION(:), INTENT(IN) :: PRCT ! Cloud water C. at t +REAL, DIMENSION(:), INTENT(IN) :: PCCT ! Cloud water C. at t +REAL, DIMENSION(:), INTENT(IN) :: PRST ! Cloud water C. at t +REAL, DIMENSION(:), INTENT(IN) :: PLBDC ! +REAL, DIMENSION(:), INTENT(IN) :: PLBDS ! +REAL, DIMENSION(:), INTENT(IN) :: PLVFACT ! +REAL, DIMENSION(:), INTENT(IN) :: PLSFACT ! +! +REAL, DIMENSION(:), INTENT(OUT) :: P_TH_RIM +REAL, DIMENSION(:), INTENT(OUT) :: P_RC_RIM +REAL, DIMENSION(:), INTENT(OUT) :: P_CC_RIM +REAL, DIMENSION(:), INTENT(OUT) :: P_RS_RIM +REAL, DIMENSION(:), INTENT(OUT) :: P_RG_RIM +! +REAL, DIMENSION(:), INTENT(OUT) :: P_RI_HMS +REAL, DIMENSION(:), INTENT(OUT) :: P_CI_HMS +REAL, DIMENSION(:), INTENT(OUT) :: P_RS_HMS +! +END SUBROUTINE LIMA_DROPLETS_RIMING_SNOW +END INTERFACE +END MODULE MODI_LIMA_DROPLETS_RIMING_SNOW +! +! ######################################################################################### + SUBROUTINE LIMA_DROPLETS_RIMING_SNOW (PTSTEP, LDCOMPUTE, & + PRHODREF, PT, & + PRCT, PCCT, PRST, PLBDC, PLBDS, PLVFACT, PLSFACT, & + P_TH_RIM, P_RC_RIM, P_CC_RIM, P_RS_RIM, P_RG_RIM, & + P_RI_HMS, P_CI_HMS, P_RS_HMS ) +! ######################################################################################### +! +!! PURPOSE +!! ------- +!! Compute the cloud droplets riming of the aggregates rate, and the associated +!! Hallett-Mossop ice production rate +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * CNRM * +!! +!! MODIFICATIONS +!! ------------- +!! Original 15/03/2018 +! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST, ONLY : XTT +USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCEXVT +USE MODD_PARAM_LIMA_MIXED, ONLY : NGAMINC, XRIMINTP1, XRIMINTP2, XGAMINC_RIM1, XGAMINC_RIM2, & + XCRIMSS, XEXCRIMSS, XSRIMCG, XEXSRIMCG, & + XHMLINTP1, XHMLINTP2, XGAMINC_HMC, XHM_FACTS, XHMTMIN, XHMTMAX +USE MODD_PARAM_LIMA_COLD, ONLY : XMNU0 +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +REAL, INTENT(IN) :: PTSTEP +LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE +! +REAL, DIMENSION(:), INTENT(IN) :: PRHODREF ! +REAL, DIMENSION(:), INTENT(IN) :: PT ! +! +REAL, DIMENSION(:), INTENT(IN) :: PRCT ! +REAL, DIMENSION(:), INTENT(IN) :: PCCT ! +REAL, DIMENSION(:), INTENT(IN) :: PRST ! +REAL, DIMENSION(:), INTENT(IN) :: PLBDC ! +REAL, DIMENSION(:), INTENT(IN) :: PLBDS ! +REAL, DIMENSION(:), INTENT(IN) :: PLVFACT ! +REAL, DIMENSION(:), INTENT(IN) :: PLSFACT ! +! +REAL, DIMENSION(:), INTENT(OUT) :: P_RC_RIM +REAL, DIMENSION(:), INTENT(OUT) :: P_CC_RIM +REAL, DIMENSION(:), INTENT(OUT) :: P_RS_RIM +REAL, DIMENSION(:), INTENT(OUT) :: P_RG_RIM +! +REAL, DIMENSION(:), INTENT(OUT) :: P_TH_RIM +REAL, DIMENSION(:), INTENT(OUT) :: P_RI_HMS +REAL, DIMENSION(:), INTENT(OUT) :: P_CI_HMS +REAL, DIMENSION(:), INTENT(OUT) :: P_RS_HMS +! +!* 0.2 Declarations of local variables : +! +LOGICAL, DIMENSION(SIZE(PRCT)) :: GRIM +! +REAL, DIMENSION(SIZE(PRCT)) :: ZZW1, ZZW2, ZZW3, ZZW4 +! +INTEGER, DIMENSION(SIZE(PRCT)) :: IVEC1,IVEC2 ! Vectors of indices +REAL, DIMENSION(SIZE(PRCT)) :: ZVEC1,ZVEC2 ! Work vectors +! +!------------------------------------------------------------------------------- +! +! +P_TH_RIM(:) = 0. +P_RC_RIM(:) = 0. +P_CC_RIM(:) = 0. +P_RS_RIM(:) = 0. +P_RG_RIM(:) = 0. +! +P_RI_HMS(:) = 0. +P_CI_HMS(:) = 0. +P_RS_HMS(:) = 0. +! +ZZW1(:) = 0. +ZZW2(:) = 0. +ZZW3(:) = 0. +ZZW4(:) = 0. +! +!* Cloud droplet riming of the aggregates +! -------------------------------------- +! +! +GRIM(:) = .False. +GRIM(:) = (PRCT(:)>XRTMIN(2)) .AND. (PRST(:)>XRTMIN(5)) .AND. (PT(:)<XTT) .AND. LDCOMPUTE(:) +! +WHERE( GRIM ) +! + ZVEC1(:) = PLBDS(:) +! +! 1. find the next lower indice for the ZLBDAS in the geometrical +! set of Lbda_s used to tabulate some moments of the incomplete +! gamma function +! + ZVEC2(:) = MAX( 1.0001, MIN( REAL(NGAMINC)-0.0001, & + XRIMINTP1 * LOG( ZVEC1(:) ) + XRIMINTP2 ) ) + IVEC2(:) = INT( ZVEC2(:) ) + ZVEC2(:) = ZVEC2(:) - REAL( IVEC2(:) ) +! +! 2. perform the linear interpolation of the normalized +! "2+XDS"-moment of the incomplete gamma function +! + ZVEC1(:) = XGAMINC_RIM1( IVEC2(:)+1 )* ZVEC2(:) & + - XGAMINC_RIM1( IVEC2(:) )*(ZVEC2(:) - 1.0) + ZZW1(:) = ZVEC1(:) +! +! 3. perform the linear interpolation of the normalized +! "XBS"-moment of the incomplete gamma function +! + ZVEC1(:) = XGAMINC_RIM2( IVEC2(:)+1 )* ZVEC2(:) & + - XGAMINC_RIM2( IVEC2(:) )*(ZVEC2(:) - 1.0) + ZZW2(:) = ZVEC1(:) +! +! 4. riming +! + ! Cloud droplets collected + P_RC_RIM(:) = - XCRIMSS * PRCT(:) * PLBDS(:)**XEXCRIMSS * PRHODREF(:)**(-XCEXVT) + P_CC_RIM(:) = P_RC_RIM(:) *(PCCT(:)/PRCT(:)) ! Lambda_c**3 + ! + ! Cloud droplets collected on small aggregates add to snow + P_RS_RIM(:) = - P_RC_RIM(:) * ZZW1(:) + ! + ! Cloud droplets collected on large aggregates add to graupel + P_RG_RIM(:) = - P_RC_RIM(:) - P_RS_RIM(:) + ! + ! Large aggregates collecting droplets add to graupel (instant process ???) + ZZW3(:) = XSRIMCG * PLBDS(:)**XEXSRIMCG * (1.0 - ZZW2(:))/(PTSTEP*PRHODREF(:)) + P_RS_RIM(:) = P_RS_RIM(:) - ZZW3(:) + P_RG_RIM(:) = P_RG_RIM(:) + ZZW3(:) + ! + P_TH_RIM(:) = - P_RC_RIM(:)*(PLSFACT(:)-PLVFACT(:)) +END WHERE +! +! +!* Hallett-Mossop ice production (HMS) +! ----------------------------------- +! +! +GRIM(:) = .False. +GRIM(:) = (PT(:)<XHMTMAX) .AND. (PT(:)>XHMTMIN) .AND. & + (PRST(:)>XRTMIN(5)) .AND. (PRCT(:)>XRTMIN(2)) .AND. & + LDCOMPUTE(:) +! +WHERE ( GRIM ) +! + ZVEC1(:) = PLBDC(:) + ZVEC2(:) = MAX( 1.0001, MIN( REAL(NGAMINC)-0.0001, & + XHMLINTP1 * LOG( ZVEC1(:) ) + XHMLINTP2 ) ) + IVEC2(:) = INT( ZVEC2(:) ) + ZVEC2(:) = ZVEC2(:) - REAL( IVEC2(:) ) + ZVEC1(:) = XGAMINC_HMC( IVEC2(:)+1 )* ZVEC2(:) & + - XGAMINC_HMC( IVEC2(:) )*(ZVEC2(:) - 1.0) + ZZW4(:) = ZVEC1(:) ! Large droplets +! + WHERE ( ZZW4(:)<0.99 ) + P_CI_HMS(:) = - P_RC_RIM(:) * (PCCT(:)/PRCT(:)) * (1.0-ZZW4(:)) * XHM_FACTS * & + MAX( 0.0, MIN( (PT(:)-XHMTMIN)/3.0,(XHMTMAX-PT(:))/2.0 ) ) ! CCHMSI +! + P_RI_HMS(:) = P_CI_HMS(:) * XMNU0 ! RCHMSI + P_RS_HMS(:) = - P_RI_HMS(:) + END WHERE + +END WHERE +! +! +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE LIMA_DROPLETS_RIMING_SNOW diff --git a/src/mesonh/micro/lima_droplets_self_collection.f90 b/src/mesonh/micro/lima_droplets_self_collection.f90 new file mode 100644 index 000000000..79312e8cb --- /dev/null +++ b/src/mesonh/micro/lima_droplets_self_collection.f90 @@ -0,0 +1,94 @@ +!MNH_LIC Copyright 2018-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!------------------------------------------------------------------------------- +! ################################# + MODULE MODI_LIMA_DROPLETS_SELF_COLLECTION +! ################################# +! +INTERFACE + SUBROUTINE LIMA_DROPLETS_SELF_COLLECTION (LDCOMPUTE, & + PRHODREF, & + PCCT, PLBDC3, & + P_CC_SELF ) +! +LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE +! +REAL, DIMENSION(:), INTENT(IN) :: PRHODREF ! Reference Exner function +! +REAL, DIMENSION(:), INTENT(IN) :: PCCT ! Cloud water C. at t +REAL, DIMENSION(:), INTENT(IN) :: PLBDC3 ! +! +REAL, DIMENSION(:), INTENT(OUT) :: P_CC_SELF +! +END SUBROUTINE LIMA_DROPLETS_SELF_COLLECTION +END INTERFACE +END MODULE MODI_LIMA_DROPLETS_SELF_COLLECTION +! +! ###################################################################### + SUBROUTINE LIMA_DROPLETS_SELF_COLLECTION (LDCOMPUTE, & + PRHODREF, & + PCCT, PLBDC3, & + P_CC_SELF ) +! ###################################################################### +! +!! PURPOSE +!! ------- +!! Compute the self-collection of cloud droplets rate +!! +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * CNRM * +!! +!! MODIFICATIONS +!! ------------- +!! Original 15/03/2018 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAM_LIMA, ONLY : XCTMIN +USE MODD_PARAM_LIMA_WARM, ONLY : XSELFC +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE +! +REAL, DIMENSION(:), INTENT(IN) :: PRHODREF ! Reference Exner function +! +REAL, DIMENSION(:), INTENT(IN) :: PCCT ! Cloud water C. at t +REAL, DIMENSION(:), INTENT(IN) :: PLBDC3 ! +! +REAL, DIMENSION(:), INTENT(OUT) :: P_CC_SELF +! +!* 0.2 Declarations of local variables : +! +REAL, DIMENSION(SIZE(PCCT)) :: ZW ! work arrays +! +!------------------------------------------------------------------------------- +! +! +!* 1. Cloud droplets self collection +! ------------------------------ +! +! +P_CC_SELF(:)=0. +! +WHERE( PCCT(:)>XCTMIN(2) .AND. LDCOMPUTE(:) ) + ZW(:) = XSELFC*(PCCT(:)/PLBDC3(:))**2 * PRHODREF(:) ! analytical integration + P_CC_SELF(:) = - ZW(:) +END WHERE +! +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE LIMA_DROPLETS_SELF_COLLECTION diff --git a/src/mesonh/micro/lima_drops_break_up.f90 b/src/mesonh/micro/lima_drops_break_up.f90 new file mode 100644 index 000000000..697c68246 --- /dev/null +++ b/src/mesonh/micro/lima_drops_break_up.f90 @@ -0,0 +1,100 @@ +!MNH_LIC Copyright 2013-2018 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +! ############################### + MODULE MODI_LIMA_DROPS_BREAK_UP +! ############################### +! +INTERFACE + SUBROUTINE LIMA_DROPS_BREAK_UP (LDCOMPUTE, & + PCRT, PRRT, & + P_CR_BRKU, & + PB_CR ) + +! +LOGICAL, DIMENSION(:), INTENT(IN) :: LDCOMPUTE +! +REAL, DIMENSION(:), INTENT(IN) :: PCRT ! +REAL, DIMENSION(:), INTENT(IN) :: PRRT ! +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_BRKU ! Concentration change (#/kg) +REAL, DIMENSION(:), INTENT(INOUT) :: PB_CR ! Cumulated concentration change (#/kg) +! +END SUBROUTINE LIMA_DROPS_BREAK_UP +END INTERFACE +END MODULE MODI_LIMA_DROPS_BREAK_UP +! +! +! ########################################## + SUBROUTINE LIMA_DROPS_BREAK_UP (LDCOMPUTE, & + PCRT, PRRT, & + P_CR_BRKU, & + PB_CR ) + +! ########################################## +! +!! +!! PURPOSE +!! ------- +!! Numerical filter to prevent drops from growing too much +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * CNRM * +!! +!! +!! MODIFICATIONS +!! ------------- +!! Original 15/03/2018 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAM_LIMA, ONLY : XCTMIN, XRTMIN +USE MODD_PARAM_LIMA_WARM, ONLY : XACCR1, XLBEXR, XLBR, XSPONBUD1, XSPONBUD3, XSPONCOEF2 +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +LOGICAL, DIMENSION(:), INTENT(IN) :: LDCOMPUTE +! +REAL, DIMENSION(:), INTENT(IN) :: PCRT ! +REAL, DIMENSION(:), INTENT(IN) :: PRRT ! +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_BRKU ! Concentration change (#/kg) +REAL, DIMENSION(:), INTENT(INOUT) :: PB_CR ! Cumulated concentration change (#/kg) +! +!* 0.2 Declarations of local variables : +! +REAL, DIMENSION(SIZE(PCRT)) :: ZWLBDR,ZWLBDR3 +INTEGER :: JL +! +!------------------------------------------------------------------------------- +! +! SPONTANEOUS BREAK-UP (NUMERICAL FILTER) +! --------------------------------------- +! +P_CR_BRKU(:)=0. +! +ZWLBDR3(:) = 1.E30 +ZWLBDR(:) = 1.E10 +WHERE ( PRRT(:)>XRTMIN(3) .AND. PCRT(:)>XCTMIN(3) .AND. LDCOMPUTE(:) ) + ZWLBDR3(:) = XLBR * PCRT(:) / PRRT(:) + ZWLBDR(:) = ZWLBDR3(:)**XLBEXR +END WHERE +WHERE (ZWLBDR(:)<(XACCR1/XSPONBUD1) .AND. LDCOMPUTE(:)) + P_CR_BRKU(:) = PCRT(:)*( MAX((1.+XSPONCOEF2*(XACCR1/ZWLBDR(:)-XSPONBUD1)**2),& + (XACCR1/ZWLBDR(:)/XSPONBUD3)**3) -1. ) +END WHERE +! +PB_CR(:) = PB_CR(:) + P_CR_BRKU(:) +!------------------------------------------------------------------------------- +! +END SUBROUTINE LIMA_DROPS_BREAK_UP diff --git a/src/mesonh/micro/lima_drops_hom_freezing.f90 b/src/mesonh/micro/lima_drops_hom_freezing.f90 new file mode 100644 index 000000000..b8382155b --- /dev/null +++ b/src/mesonh/micro/lima_drops_hom_freezing.f90 @@ -0,0 +1,144 @@ +!MNH_LIC Copyright 2013-2018 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +! ################################# + MODULE MODI_LIMA_DROPS_HOM_FREEZING +! ################################# +! +INTERFACE + SUBROUTINE LIMA_DROPS_HOM_FREEZING (PTSTEP, LDCOMPUTE, & + PEXNREF, PPABST, & + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & + PCRT, & + P_TH_HONR, P_RR_HONR, P_CR_HONR, & + PB_TH, PB_RR, PB_CR, PB_RG ) +! +REAL, INTENT(IN) :: PTSTEP +LOGICAL, DIMENSION(:), INTENT(IN) :: LDCOMPUTE +! +REAL, DIMENSION(:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:), INTENT(IN) :: PPABST ! abs. pressure at time t +! +REAL, DIMENSION(:), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(:), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: PRIT ! Cloud ice m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: PRGT ! Graupel m.r. at t +! +REAL, DIMENSION(:), INTENT(IN) :: PCRT ! Rain water C. at t +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_HONR +REAL, DIMENSION(:), INTENT(INOUT) :: P_RR_HONR +REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_HONR +REAL, DIMENSION(:), INTENT(INOUT) :: PB_TH +REAL, DIMENSION(:), INTENT(INOUT) :: PB_RR +REAL, DIMENSION(:), INTENT(INOUT) :: PB_CR +REAL, DIMENSION(:), INTENT(INOUT) :: PB_RG +! +END SUBROUTINE LIMA_DROPS_HOM_FREEZING +END INTERFACE +END MODULE MODI_LIMA_DROPS_HOM_FREEZING +! +! ############################################################################### + SUBROUTINE LIMA_DROPS_HOM_FREEZING (PTSTEP, LDCOMPUTE, & + PEXNREF, PPABST, & + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & + PCRT, & + P_TH_HONR, P_RR_HONR, P_CR_HONR, & + PB_TH, PB_RR, PB_CR, PB_RG ) +! ############################################################################### +! +!! PURPOSE +!! ------- +!! Homogeneous freezing of rain drops below -35°C +!! +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * CNRM * +!! +!! MODIFICATIONS +!! ------------- +!! Original 15/03/2018 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST, ONLY : XP00, XRD, XCPD, XCPV, XCL, XCI, XTT, XLSTT, XLVTT +USE MODD_PARAM_LIMA, ONLY : XRTMIN +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +REAL, INTENT(IN) :: PTSTEP +LOGICAL, DIMENSION(:), INTENT(IN) :: LDCOMPUTE +! +REAL, DIMENSION(:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:), INTENT(IN) :: PPABST ! abs. pressure at time t +! +REAL, DIMENSION(:), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(:), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: PRIT ! Cloud ice m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: PRGT ! Graupel m.r. at t +! +REAL, DIMENSION(:), INTENT(IN) :: PCRT ! Rain water C. at t +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_HONR +REAL, DIMENSION(:), INTENT(INOUT) :: P_RR_HONR +REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_HONR +REAL, DIMENSION(:), INTENT(INOUT) :: PB_TH +REAL, DIMENSION(:), INTENT(INOUT) :: PB_RR +REAL, DIMENSION(:), INTENT(INOUT) :: PB_CR +REAL, DIMENSION(:), INTENT(INOUT) :: PB_RG +! +!* 0.2 Declarations of local variables : +! +REAL, DIMENSION(SIZE(PTHT)) :: & + ZW, & + ZT, & + ZLSFACT, & + ZLVFACT, & + ZTCELSIUS +! +!------------------------------------------------------------------------------- +! +P_TH_HONR(:) = 0. +P_RR_HONR(:) = 0. +P_CR_HONR(:) = 0. +! +! Temperature +ZT(:) = PTHT(:) * ( PPABST(:)/XP00 ) ** (XRD/XCPD) +ZTCELSIUS(:) = ZT(:)-XTT ! T [°C] +! +ZW(:) = PEXNREF(:)*( XCPD+XCPV*PRVT(:)+XCL*(PRCT(:)+PRRT(:)) & + +XCI*(PRIT(:)+PRST(:)+PRGT(:)) ) +ZLSFACT(:) = (XLSTT+(XCPV-XCI)*ZTCELSIUS(:))/ZW(:) ! L_s/(Pi_ref*C_ph) +ZLVFACT(:) = (XLVTT+(XCPV-XCL)*ZTCELSIUS(:))/ZW(:) ! L_v/(Pi_ref*C_ph) +! +ZW(:) = 0.0 +! +WHERE( (ZT(:)<XTT-35.0) .AND. (PRRT(:)>XRTMIN(3)) .AND. LDCOMPUTE(:) ) + P_TH_HONR(:) = PRRT(:)*(ZLSFACT(:)-ZLVFACT(:)) + P_RR_HONR(:) = - PRRT(:) + P_CR_HONR(:) = - PCRT(:) + PB_TH(:) = PB_TH(:) + P_TH_HONR(:) + PB_RR(:) = PB_RR(:) - PRRT(:) + PB_CR(:) = PB_CR(:) - PCRT(:) + PB_RG(:) = PB_RG(:) + PRRT(:) +ENDWHERE +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE LIMA_DROPS_HOM_FREEZING diff --git a/src/mesonh/micro/lima_drops_self_collection.f90 b/src/mesonh/micro/lima_drops_self_collection.f90 new file mode 100644 index 000000000..042cde084 --- /dev/null +++ b/src/mesonh/micro/lima_drops_self_collection.f90 @@ -0,0 +1,123 @@ +!MNH_LIC Copyright 2018-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!------------------------------------------------------------------------------- +! ################################# + MODULE MODI_LIMA_DROPS_SELF_COLLECTION +! ################################# +! +INTERFACE + SUBROUTINE LIMA_DROPS_SELF_COLLECTION (LDCOMPUTE, & + PRHODREF, & + PCRT, PLBDR, PLBDR3, & + P_CR_SCBU ) +! +LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE +! +REAL, DIMENSION(:), INTENT(IN) :: PRHODREF ! Reference Exner function +! +REAL, DIMENSION(:), INTENT(IN) :: PCRT ! Cloud water C. at t +REAL, DIMENSION(:), INTENT(IN) :: PLBDR ! +REAL, DIMENSION(:), INTENT(IN) :: PLBDR3 ! +! +REAL, DIMENSION(:), INTENT(OUT) :: P_CR_SCBU +! +END SUBROUTINE LIMA_DROPS_SELF_COLLECTION +END INTERFACE +END MODULE MODI_LIMA_DROPS_SELF_COLLECTION +! +! ############################################################# + SUBROUTINE LIMA_DROPS_SELF_COLLECTION (LDCOMPUTE, & + PRHODREF, & + PCRT, PLBDR, PLBDR3, & + P_CR_SCBU ) +! ############################################################# +! +!! PURPOSE +!! ------- +!! Compute the self-collection and physical break-up of rain drops +!! +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * CNRM * +!! +!! MODIFICATIONS +!! ------------- +!! Original 15/03/2018 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAM_LIMA, ONLY : XCTMIN +USE MODD_PARAM_LIMA_WARM, ONLY : XACCR1, XSCBUEXP1, XSCBU_EFF1, XSCBU_EFF2, & + XSCBU2, XSCBU3 +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE +! +REAL, DIMENSION(:), INTENT(IN) :: PRHODREF ! Reference Exner function +! +REAL, DIMENSION(:), INTENT(IN) :: PCRT ! Rain drops C. at t +REAL, DIMENSION(:), INTENT(IN) :: PLBDR ! +REAL, DIMENSION(:), INTENT(IN) :: PLBDR3 ! +! +REAL, DIMENSION(:), INTENT(OUT) :: P_CR_SCBU +! +!* 0.2 Declarations of local variables : +! +REAL, DIMENSION(SIZE(PCRT)) :: & + ZW1, & ! work arrays + ZW2, & + ZW3, & + ZW4, & + ZSCBU +! +!------------------------------------------------------------------------------- +! +! +!* 1. Rain drops self-collection and break-up +! --------------------------------------- +! +! +P_CR_SCBU(:)=0. +! +ZW4(:) =0. +! +WHERE( PCRT(:)>XCTMIN(3) .AND. LDCOMPUTE(:) ) + ZW4(:) = XACCR1 / PLBDR(:) ! Mean diameter +END WHERE +ZSCBU(:)=1. +WHERE (ZW4(:)>=XSCBU_EFF1 .AND. PCRT(:)>XCTMIN(3) .AND. LDCOMPUTE(:)) & + ZSCBU(:) = EXP(XSCBUEXP1*(ZW4(:)-XSCBU_EFF1)) ! coalescence efficiency +WHERE (ZW4(:)>=XSCBU_EFF2 .AND. LDCOMPUTE(:)) ZSCBU(:) = 0.0 ! Break-up +! +ZW1(:) = 0.0 +ZW2(:) = 0.0 +ZW3(:) = 0.0 +! +WHERE (PCRT(:)>XCTMIN(3) .AND. (ZW4(:)>1.E-4) .AND. LDCOMPUTE(:)) ! analytical integration + ZW1(:) = XSCBU2 * PCRT(:)**2 / PLBDR3(:) ! D>100 10-6 m + ZW3(:) = ZW1(:)*ZSCBU(:) +END WHERE +! +WHERE (PCRT(:)>XCTMIN(3) .AND. (ZW4(:)<=1.E-4) .AND. LDCOMPUTE(:)) + ZW2(:) = XSCBU3 *(PCRT(:) / PLBDR3(:))**2 ! D<100 10-6 m + ZW3(:) = ZW2(:) +END WHERE +! +P_CR_SCBU(:) = - ZW3(:) * PRHODREF(:) +! +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE LIMA_DROPS_SELF_COLLECTION diff --git a/src/mesonh/micro/lima_drops_to_droplets_conv.f90 b/src/mesonh/micro/lima_drops_to_droplets_conv.f90 new file mode 100644 index 000000000..b2c63fde2 --- /dev/null +++ b/src/mesonh/micro/lima_drops_to_droplets_conv.f90 @@ -0,0 +1,103 @@ +!MNH_LIC Copyright 2013-2018 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +! ################################# + MODULE MODI_LIMA_DROPS_TO_DROPLETS_CONV +! ################################# +! +INTERFACE + SUBROUTINE LIMA_DROPS_TO_DROPLETS_CONV (PRHODREF, PRCT, PRRT, PCCT, PCRT, & + P_RR_CVRC, P_CR_CVRC ) +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCCT ! Cloud water C. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCRT ! Rain water C. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: P_RR_CVRC +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: P_CR_CVRC +! +END SUBROUTINE LIMA_DROPS_TO_DROPLETS_CONV +END INTERFACE +END MODULE MODI_LIMA_DROPS_TO_DROPLETS_CONV +! +! ###################################################################### + SUBROUTINE LIMA_DROPS_TO_DROPLETS_CONV (PRHODREF, PRCT, PRRT, PCCT, PCRT, & + P_RR_CVRC, P_CR_CVRC ) +! ###################################################################### +! +!! PURPOSE +!! ------- +!! Conversion of rain drops into cloud droplets if mean volume diameter < 82µm +!! +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * CNRM * +!! +!! MODIFICATIONS +!! ------------- +!! Original 15/03/2018 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST, ONLY : XPI, XRHOLW +USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCTMIN +USE MODD_PARAM_LIMA_WARM, ONLY : XLBR, XLBEXR, XLBC, XLBEXC, & + XACCR1, XACCR3, XACCR4, XACCR5 +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCCT ! Cloud water C. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCRT ! Rain water C. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: P_RR_CVRC +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: P_CR_CVRC +! +!* 0.2 Declarations of local variables : +! +REAL, DIMENSION(SIZE(PRCT,1),SIZE(PRCT,2),SIZE(PRCT,3)) :: ZDR +! +LOGICAL, DIMENSION(SIZE(PRCT,1),SIZE(PRCT,2),SIZE(PRCT,3)) :: ZMASKR, ZMASKC +! +REAL :: ZFACT +! +! +! +!------------------------------------------------------------------------------- +! +P_RR_CVRC(:,:,:) = 0. +P_CR_CVRC(:,:,:) = 0. +! +ZDR(:,:,:) = 9999. +ZMASKR(:,:,:) = PRRT(:,:,:).GT.XRTMIN(3) .AND. PCRT(:,:,:).GT.XCTMIN(3) +ZMASKC(:,:,:) = PRCT(:,:,:).GT.XRTMIN(2) .AND. PCCT(:,:,:).GT.XCTMIN(2) +WHERE(ZMASKR(:,:,:)) + ZDR(:,:,:)=(6.*PRRT(:,:,:)/XPI/XRHOLW/PCRT(:,:,:))**0.33 +END WHERE +! +! Transfer all drops in droplets if out of cloud and Dr<82microns +! +WHERE( ZMASKR(:,:,:) .AND. .NOT.ZMASKC(:,:,:) .AND. ZDR(:,:,:).LT.82.E-6) + P_RR_CVRC(:,:,:) = -PRRT(:,:,:) + P_CR_CVRC(:,:,:) = -PCRT(:,:,:) +END WHERE +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE LIMA_DROPS_TO_DROPLETS_CONV diff --git a/src/mesonh/micro/lima_functions.f90 b/src/mesonh/micro/lima_functions.f90 new file mode 100644 index 000000000..b5a8f17d7 --- /dev/null +++ b/src/mesonh/micro/lima_functions.f90 @@ -0,0 +1,307 @@ +!MNH_LIC Copyright 2016-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! Modifications: +! P. Wautelet 22/01/2019: replace double precision declarations by real(kind(0.0d0)) (to allow compilation by NAG compiler) +! P. Wautelet 19/04/2019: use modd_precision kinds +! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 +!----------------------------------------------------------------- +!################################# + MODULE MODI_LIMA_FUNCTIONS +!################################# +! +INTERFACE +! +FUNCTION MOMG (PALPHA,PNU,PP) RESULT (PMOMG) + REAL, INTENT(IN) :: PALPHA + REAL, INTENT(IN) :: PNU + REAL, INTENT(IN) :: PP + REAL :: PMOMG +END FUNCTION MOMG +! +FUNCTION RECT(PA,PB,PX,PX1,PX2) RESULT(PRECT) + REAL, INTENT(IN) :: PA + REAL, INTENT(IN) :: PB + REAL, DIMENSION(:), INTENT(IN) :: PX + REAL, INTENT(IN) :: PX1 + REAL, INTENT(IN) :: PX2 + REAL, DIMENSION(SIZE(PX,1)) :: PRECT +END FUNCTION RECT +! +FUNCTION DELTA(PA,PB,PX,PX1,PX2) RESULT(PDELTA) + REAL, INTENT(IN) :: PA + REAL, INTENT(IN) :: PB + REAL, DIMENSION(:), INTENT(IN) :: PX + REAL, INTENT(IN) :: PX1 + REAL, INTENT(IN) :: PX2 + REAL, DIMENSION(SIZE(PX,1)) :: PDELTA +END FUNCTION DELTA +! +FUNCTION DELTA_VEC(PA,PB,PX,PX1,PX2) RESULT(PDELTA_VEC) + REAL, INTENT(IN) :: PA + REAL, INTENT(IN) :: PB + REAL, DIMENSION(:), INTENT(IN) :: PX + REAL, DIMENSION(:), INTENT(IN) :: PX1 + REAL, DIMENSION(:), INTENT(IN) :: PX2 + REAL, DIMENSION(SIZE(PX,1)) :: PDELTA_VEC +END FUNCTION DELTA_VEC +! +SUBROUTINE GAULAG(x,w,n,alf) + INTEGER, INTENT(IN) :: n + REAL, INTENT(IN) :: alf + REAL, DIMENSION(n), INTENT(INOUT) :: w, x +END SUBROUTINE GAULAG +! +SUBROUTINE GAUHER(x,w,n) + INTEGER, INTENT(IN) :: n + REAL, DIMENSION(n), INTENT(INOUT) :: w, x +END SUBROUTINE GAUHER +! +END INTERFACE +! +END MODULE MODI_LIMA_FUNCTIONS +! +!------------------------------------------------------------------------------ +! +!########################################### +FUNCTION MOMG (PALPHA,PNU,PP) RESULT (PMOMG) +!########################################### +! +! auxiliary routine used to compute the Pth moment order of the generalized +! gamma law +! + USE MODI_GAMMA +! + IMPLICIT NONE +! + REAL :: PALPHA ! first shape parameter of the dimensionnal distribution + REAL :: PNU ! second shape parameter of the dimensionnal distribution + REAL :: PP ! order of the moment + REAL :: PMOMG ! result: moment of order ZP +! + PMOMG = GAMMA_X0D(PNU+PP/PALPHA)/GAMMA_X0D(PNU) +! +END FUNCTION MOMG +! +!------------------------------------------------------------------------------ +! +!############################################# +FUNCTION RECT(PA,PB,PX,PX1,PX2) RESULT(PRECT) +!############################################# +! +! PRECT takes the value PA if PX1<=PX<PX2, and PB outside the [PX1;PX2[ interval +! + IMPLICIT NONE +! + REAL, INTENT(IN) :: PA + REAL, INTENT(IN) :: PB + REAL, DIMENSION(:), INTENT(IN) :: PX + REAL, INTENT(IN) :: PX1 + REAL, INTENT(IN) :: PX2 + REAL, DIMENSION(SIZE(PX,1)) :: PRECT +! + PRECT(:) = PB + WHERE (PX(:).GE.PX1 .AND. PX(:).LT.PX2) + PRECT(:) = PA + END WHERE + RETURN +! +END FUNCTION RECT +! +!------------------------------------------------------------------------------- +! +!############################################### +FUNCTION DELTA(PA,PB,PX,PX1,PX2) RESULT(PDELTA) +!############################################### +! +! PDELTA takes the value PA if PX<PX1, and PB if PX>=PX2 +! PDELTA is a cubic interpolation between PA and PB for PX between PX1 and PX2 +! + IMPLICIT NONE +! + REAL, INTENT(IN) :: PA + REAL, INTENT(IN) :: PB + REAL, DIMENSION(:), INTENT(IN) :: PX + REAL, INTENT(IN) :: PX1 + REAL, INTENT(IN) :: PX2 + REAL, DIMENSION(SIZE(PX,1)) :: PDELTA +! +!* local variable +! + REAL :: ZA +! + ZA = 6.0*(PA-PB)/(PX2-PX1)**3 + WHERE (PX(:).LT.PX1) + PDELTA(:) = PA + ELSEWHERE (PX(:).GE.PX2) + PDELTA(:) = PB + ELSEWHERE + PDELTA(:) = PA + ZA*PX1**2*(PX1/6.0 - 0.5*PX2) & + + ZA*PX1*PX2* (PX(:)) & + - (0.5*ZA*(PX1+PX2))* (PX(:)**2) & + + (ZA/3.0)* (PX(:)**3) + END WHERE + RETURN +! +END FUNCTION DELTA +! +!------------------------------------------------------------------------------- +! +!####################################################### +FUNCTION DELTA_VEC(PA,PB,PX,PX1,PX2) RESULT(PDELTA_VEC) +!####################################################### +! +! Same as DELTA for vectorized PX1 and PX2 arguments +! + IMPLICIT NONE +! + REAL, INTENT(IN) :: PA + REAL, INTENT(IN) :: PB + REAL, DIMENSION(:), INTENT(IN) :: PX + REAL, DIMENSION(:), INTENT(IN) :: PX1 + REAL, DIMENSION(:), INTENT(IN) :: PX2 + REAL, DIMENSION(SIZE(PX,1)) :: PDELTA_VEC +! +!* local variable +! + REAL, DIMENSION(SIZE(PX,1)) :: ZA +! + ZA(:) = 0.0 + wHERE (PX(:)<=PX1(:)) + PDELTA_VEC(:) = PA + ELSEWHERE (PX(:)>=PX2(:)) + PDELTA_VEC(:) = PB + ELSEWHERE + ZA(:) = 6.0*(PA-PB)/(PX2(:)-PX1(:))**3 + PDELTA_VEC(:) = PA + ZA(:)*PX1(:)**2*(PX1(:)/6.0 - 0.5*PX2(:)) & + + ZA(:)*PX1(:)*PX2(:)* (PX(:)) & + - (0.5*ZA(:)*(PX1(:)+PX2(:)))* (PX(:)**2) & + + (ZA(:)/3.0)* (PX(:)**3) + END WHERE + RETURN +! +END FUNCTION DELTA_VEC +! +!------------------------------------------------------------------------------- +! +!########################### +SUBROUTINE gaulag(x,w,n,alf) +!########################### + use modd_precision, only: MNHREAL64 + + INTEGER n,MAXIT + REAL alf,w(n),x(n) + REAL(kind=MNHREAL64) :: EPS + PARAMETER (EPS=3.D-14,MAXIT=10) + INTEGER i,its,j + REAL ai + REAL(kind=MNHREAL64) :: p1,p2,p3,pp,z,z1 +! + REAL SUMW +! + do 13 i=1,n + if(i.eq.1)then + z=(1.+alf)*(3.+.92*alf)/(1.+2.4*n+1.8*alf) + else if(i.eq.2)then + z=z+(15.+6.25*alf)/(1.+.9*alf+2.5*n) + else + ai=i-2 + z=z+((1.+2.55*ai)/(1.9*ai)+1.26*ai*alf/(1.+3.5*ai))* & + (z-x(i-2))/(1.+.3*alf) + endif + do 12 its=1,MAXIT + p1=1.d0 + p2=0.d0 + do 11 j=1,n + p3=p2 + p2=p1 + p1=((2*j-1+alf-z)*p2-(j-1+alf)*p3)/j +11 continue + pp=(n*p1-(n+alf)*p2)/z + z1=z + z=z1-p1/pp + if(abs(z-z1).le.EPS)goto 1 +12 continue +1 x(i)=z + w(i)=-exp(gammln(alf+n)-gammln(real(n)))/(pp*n*p2) +13 continue +! +! NORMALISATION +! + SUMW = 0.0 + DO 14 I=1,N + SUMW = SUMW + W(I) +14 CONTINUE + DO 15 I=1,N + W(I) = W(I)/SUMW +15 CONTINUE +! + return +END SUBROUTINE gaulag +! +!------------------------------------------------------------------------------ +! +!########################################## +SUBROUTINE gauher(x,w,n) +!########################################## + use modd_precision, only: MNHREAL64 + + INTEGER n,MAXIT + REAL w(n),x(n) + REAL(kind=MNHREAL64) :: EPS,PIM4 + PARAMETER (EPS=3.D-14,PIM4=.7511255444649425D0,MAXIT=10) + INTEGER i,its,j,m + REAL(kind=MNHREAL64) :: p1,p2,p3,pp,z,z1 +! + REAL SUMW +! + m=(n+1)/2 + do 13 i=1,m + if(i.eq.1)then + z=sqrt(real(2*n+1))-1.85575*(2*n+1)**(-.16667) + else if(i.eq.2)then + z=z-1.14*n**.426/z + else if (i.eq.3)then + z=1.86*z-.86*x(1) + else if (i.eq.4)then + z=1.91*z-.91*x(2) + else + z=2.*z-x(i-2) + endif + do 12 its=1,MAXIT + p1=PIM4 + p2=0.d0 + do 11 j=1,n + p3=p2 + p2=p1 + p1=z*sqrt(2.d0/j)*p2-sqrt(dble(j-1)/dble(j))*p3 +11 continue + pp=sqrt(2.d0*n)*p2 + z1=z + z=z1-p1/pp + if(abs(z-z1).le.EPS)goto 1 +12 continue +1 x(i)=z + x(n+1-i)=-z + pp=pp/PIM4 ! NORMALIZATION + w(i)=2.0/(pp*pp) + w(n+1-i)=w(i) +13 continue +! +! NORMALISATION +! + SUMW = 0.0 + DO 14 I=1,N + SUMW = SUMW + W(I) +14 CONTINUE + DO 15 I=1,N + W(I) = W(I)/SUMW +15 CONTINUE +! + return +END SUBROUTINE gauher +! +!------------------------------------------------------------------------------ diff --git a/src/mesonh/micro/lima_graupel.f90 b/src/mesonh/micro/lima_graupel.f90 new file mode 100644 index 000000000..ad114da36 --- /dev/null +++ b/src/mesonh/micro/lima_graupel.f90 @@ -0,0 +1,569 @@ +!MNH_LIC Copyright 2018-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ################################# + MODULE MODI_LIMA_GRAUPEL +! ################################# +! +INTERFACE + SUBROUTINE LIMA_GRAUPEL (PTSTEP, LDCOMPUTE, & + PRHODREF, PPRES, PT, PKA, PDV, PCJ, & + PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & + PCCT, PCRT, PCIT, & + PLBDC, PLBDR, PLBDS, PLBDG, & + PLVFACT, PLSFACT, & + P_TH_WETG, P_RC_WETG, P_CC_WETG, P_RR_WETG, P_CR_WETG, & + P_RI_WETG, P_CI_WETG, P_RS_WETG, P_RG_WETG, P_RH_WETG, & + P_TH_DRYG, P_RC_DRYG, P_CC_DRYG, P_RR_DRYG, P_CR_DRYG, & + P_RI_DRYG, P_CI_DRYG, P_RS_DRYG, P_RG_DRYG, & + P_RI_HMG, P_CI_HMG, P_RG_HMG, & + P_TH_GMLT, P_RR_GMLT, P_CR_GMLT, & + PA_TH, PA_RC, PA_CC, PA_RR, PA_CR, & + PA_RI, PA_CI, PA_RS, PA_RG, PA_RH ) +! +REAL, INTENT(IN) :: PTSTEP +LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE +! +REAL, DIMENSION(:), INTENT(IN) :: PRHODREF ! +REAL, DIMENSION(:), INTENT(IN) :: PPRES ! +REAL, DIMENSION(:), INTENT(IN) :: PT ! +REAL, DIMENSION(:), INTENT(IN) :: PKA ! +REAL, DIMENSION(:), INTENT(IN) :: PDV ! +REAL, DIMENSION(:), INTENT(IN) :: PCJ ! +! +REAL, DIMENSION(:), INTENT(IN) :: PRVT ! +REAL, DIMENSION(:), INTENT(IN) :: PRCT ! +REAL, DIMENSION(:), INTENT(IN) :: PRRT ! +REAL, DIMENSION(:), INTENT(IN) :: PRIT ! +REAL, DIMENSION(:), INTENT(IN) :: PRST ! +REAL, DIMENSION(:), INTENT(IN) :: PRGT ! +! +REAL, DIMENSION(:), INTENT(IN) :: PCCT ! +REAL, DIMENSION(:), INTENT(IN) :: PCRT ! +REAL, DIMENSION(:), INTENT(IN) :: PCIT ! +! +REAL, DIMENSION(:), INTENT(IN) :: PLBDC ! +REAL, DIMENSION(:), INTENT(IN) :: PLBDR ! +REAL, DIMENSION(:), INTENT(IN) :: PLBDS ! +REAL, DIMENSION(:), INTENT(IN) :: PLBDG ! +! +REAL, DIMENSION(:), INTENT(IN) :: PLVFACT ! +REAL, DIMENSION(:), INTENT(IN) :: PLSFACT ! +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_WETG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RC_WETG +REAL, DIMENSION(:), INTENT(INOUT) :: P_CC_WETG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RR_WETG +REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_WETG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_WETG +REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_WETG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RS_WETG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_WETG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RH_WETG +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_DRYG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RC_DRYG +REAL, DIMENSION(:), INTENT(INOUT) :: P_CC_DRYG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RR_DRYG +REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_DRYG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_DRYG +REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_DRYG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RS_DRYG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_DRYG +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_HMG +REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_HMG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_HMG +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_GMLT +REAL, DIMENSION(:), INTENT(INOUT) :: P_RR_GMLT +REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_GMLT +! +REAL, DIMENSION(:), INTENT(INOUT) :: PA_TH +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RC +REAL, DIMENSION(:), INTENT(INOUT) :: PA_CC +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RR +REAL, DIMENSION(:), INTENT(INOUT) :: PA_CR +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RI +REAL, DIMENSION(:), INTENT(INOUT) :: PA_CI +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RS +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RG +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RH +! +END SUBROUTINE LIMA_GRAUPEL +END INTERFACE +END MODULE MODI_LIMA_GRAUPEL +! +! ################################################################################# + SUBROUTINE LIMA_GRAUPEL (PTSTEP, LDCOMPUTE, & + PRHODREF, PPRES, PT, PKA, PDV, PCJ, & + PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & + PCCT, PCRT, PCIT, & + PLBDC, PLBDR, PLBDS, PLBDG, & + PLVFACT, PLSFACT, & + P_TH_WETG, P_RC_WETG, P_CC_WETG, P_RR_WETG, P_CR_WETG, & + P_RI_WETG, P_CI_WETG, P_RS_WETG, P_RG_WETG, P_RH_WETG, & + P_TH_DRYG, P_RC_DRYG, P_CC_DRYG, P_RR_DRYG, P_CR_DRYG, & + P_RI_DRYG, P_CI_DRYG, P_RS_DRYG, P_RG_DRYG, & + P_RI_HMG, P_CI_HMG, P_RG_HMG, & + P_TH_GMLT, P_RR_GMLT, P_CR_GMLT, & + PA_TH, PA_RC, PA_CC, PA_RR, PA_CR, & + PA_RI, PA_CI, PA_RS, PA_RG, PA_RH ) +! ################################################################################# +! +!! PURPOSE +!! ------- +!! Compute the wet/dry growth of graupel, associated Hallett-Mossop ice production, +!! and graupel melting rates +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * CNRM * +!! +!! MODIFICATIONS +!! ------------- +!! Original 15/03/2018 +! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST, ONLY : XTT, XMD, XMV, XRD, XRV, XLVTT, XLMTT, XESTT, XCL, XCI, XCPV +USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCEXVT, LHAIL +USE MODD_PARAM_LIMA_MIXED, ONLY : XCXG, XDG, X0DEPG, X1DEPG, NGAMINC, & + XFCDRYG, XFIDRYG, XCOLIG, XCOLSG, XCOLEXIG, XCOLEXSG, & + XFSDRYG, XLBSDRYG1, XLBSDRYG2, XLBSDRYG3, XKER_SDRYG, & + XFRDRYG, XLBRDRYG1, XLBRDRYG2, XLBRDRYG3, XKER_RDRYG, & + XHMTMIN, XHMTMAX, XHMLINTP1, XHMLINTP2, XHM_FACTG, XGAMINC_HMC, & + XEX0DEPG, XEX1DEPG, & + XDRYINTP1R, XDRYINTP1S, XDRYINTP1G, & + XDRYINTP2R, XDRYINTP2S, XDRYINTP2G, & + NDRYLBDAR, NDRYLBDAS, NDRYLBDAG +USE MODD_PARAM_LIMA_COLD, ONLY : XMNU0, XCXS, XBS +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +REAL, INTENT(IN) :: PTSTEP +LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE +! +REAL, DIMENSION(:), INTENT(IN) :: PRHODREF ! +REAL, DIMENSION(:), INTENT(IN) :: PPRES ! +REAL, DIMENSION(:), INTENT(IN) :: PT ! +REAL, DIMENSION(:), INTENT(IN) :: PKA ! +REAL, DIMENSION(:), INTENT(IN) :: PDV ! +REAL, DIMENSION(:), INTENT(IN) :: PCJ ! +! +REAL, DIMENSION(:), INTENT(IN) :: PRVT ! +REAL, DIMENSION(:), INTENT(IN) :: PRCT ! +REAL, DIMENSION(:), INTENT(IN) :: PRRT ! +REAL, DIMENSION(:), INTENT(IN) :: PRIT ! +REAL, DIMENSION(:), INTENT(IN) :: PRST ! +REAL, DIMENSION(:), INTENT(IN) :: PRGT ! +! +REAL, DIMENSION(:), INTENT(IN) :: PCCT ! +REAL, DIMENSION(:), INTENT(IN) :: PCRT ! +REAL, DIMENSION(:), INTENT(IN) :: PCIT ! +! +REAL, DIMENSION(:), INTENT(IN) :: PLBDC ! +REAL, DIMENSION(:), INTENT(IN) :: PLBDR ! +REAL, DIMENSION(:), INTENT(IN) :: PLBDS ! +REAL, DIMENSION(:), INTENT(IN) :: PLBDG ! +! +REAL, DIMENSION(:), INTENT(IN) :: PLVFACT ! +REAL, DIMENSION(:), INTENT(IN) :: PLSFACT ! +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_WETG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RC_WETG +REAL, DIMENSION(:), INTENT(INOUT) :: P_CC_WETG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RR_WETG +REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_WETG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_WETG +REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_WETG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RS_WETG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_WETG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RH_WETG +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_DRYG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RC_DRYG +REAL, DIMENSION(:), INTENT(INOUT) :: P_CC_DRYG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RR_DRYG +REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_DRYG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_DRYG +REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_DRYG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RS_DRYG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_DRYG +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_HMG +REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_HMG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_HMG +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_GMLT +REAL, DIMENSION(:), INTENT(INOUT) :: P_RR_GMLT +REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_GMLT +! +REAL, DIMENSION(:), INTENT(INOUT) :: PA_TH +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RC +REAL, DIMENSION(:), INTENT(INOUT) :: PA_CC +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RR +REAL, DIMENSION(:), INTENT(INOUT) :: PA_CR +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RI +REAL, DIMENSION(:), INTENT(INOUT) :: PA_CI +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RS +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RG +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RH +! +!* 0.2 Declarations of local variables : +! +LOGICAL, DIMENSION(SIZE(PRCT)) :: GDRY +INTEGER :: IGDRY +INTEGER :: JJ +! +REAL, DIMENSION(SIZE(PRCT)) :: Z1, Z2, Z3, Z4 +REAL, DIMENSION(SIZE(PRCT)) :: ZZX, ZZW, ZZW1, ZZW2, ZZW3, ZZW4, ZZW5, ZZW6, ZZW7 +REAL, DIMENSION(SIZE(PRCT)) :: ZRDRYG, ZRWETG +! +INTEGER, DIMENSION(SIZE(PRCT)) :: IVEC1,IVEC2 ! Vectors of indices +REAL, DIMENSION(SIZE(PRCT)) :: ZVEC1,ZVEC2, ZVEC3 ! Work vectors +! +INTEGER :: NHAIL +! +!------------------------------------------------------------------------------- +! +! +P_RC_WETG(:) = 0. +P_CC_WETG(:) = 0. +P_RR_WETG(:) = 0. +P_CR_WETG(:) = 0. +P_RI_WETG(:) = 0. +P_CI_WETG(:) = 0. +P_RS_WETG(:) = 0. +P_RG_WETG(:) = 0. +P_RH_WETG(:) = 0. +! +P_RC_DRYG(:) = 0. +P_CC_DRYG(:) = 0. +P_RR_DRYG(:) = 0. +P_CR_DRYG(:) = 0. +P_RI_DRYG(:) = 0. +P_CI_DRYG(:) = 0. +P_RS_DRYG(:) = 0. +P_RG_DRYG(:) = 0. +! +P_RI_HMG(:) = 0. +P_CI_HMG(:) = 0. +P_RG_HMG(:) = 0. +! +P_RR_GMLT(:) = 0. +P_CR_GMLT(:) = 0. +! +ZZW1(:) = 0. ! RCDRYG +ZZW2(:) = 0. ! RIDRYG +ZZW3(:) = 0. ! RSDRYG +ZZW4(:) = 0. ! RRDRYG +ZZW5(:) = 0. ! RIWETG +ZZW6(:) = 0. ! RSWETG +ZZW7(:) = 0. ! +! +ZRDRYG(:) = 0. +ZRWETG(:) = 0. +! +! +!* 1. Graupel growth by collection (dry or wet case) +! -------------------------------------------------- +! +! 1.a Collection of rc and ri in the dry mode +! -------------------------------------------- +! +WHERE( PRGT(:)>XRTMIN(6) .AND. LDCOMPUTE(:) ) + ZZW(:) = PLBDG(:)**(XCXG-XDG-2.0) * PRHODREF(:)**(-XCEXVT) + ZZW1(:) = XFCDRYG * PRCT(:) * ZZW(:) ! RCDRYG - rc collected by graupel in dry mode + ZZW2(:) = XFIDRYG * EXP( XCOLEXIG*(PT(:)-XTT) ) * PRIT(:) * ZZW(:) ! RIDRYG - ri collected by graupel in dry mode +END WHERE +! +!* 1.b Collection of rs in the dry mode +! ------------------------------------ +! +GDRY(:) = (PRST(:)>XRTMIN(5)) .AND. (PRGT(:)>XRTMIN(6)) .AND. LDCOMPUTE(:) +! +WHERE( GDRY ) +! +!* Select the (ZLBDAG,ZLBDAS) couplet +! + ZVEC1(:) = PLBDG(:) + ZVEC2(:) = PLBDS(:) +! +!* find the next lower indice for the ZLBDAG and for the ZLBDAS +! in the geometrical set of (Lbda_g,Lbda_s) couplet use to +! tabulate the SDRYG-kernel +! + ZVEC1(:) = MAX( 1.0001, MIN( REAL(NDRYLBDAG)-0.0001, & + XDRYINTP1G * LOG( ZVEC1(:) ) + XDRYINTP2G ) ) + IVEC1(:) = INT( ZVEC1(:) ) + ZVEC1(:) = ZVEC1(:) - REAL( IVEC1(:) ) +! + ZVEC2(:) = MAX( 1.0001, MIN( REAL(NDRYLBDAS)-0.0001, & + XDRYINTP1S * LOG( ZVEC2(:) ) + XDRYINTP2S ) ) + IVEC2(:) = INT( ZVEC2(:) ) + ZVEC2(:) = ZVEC2(:) - REAL( IVEC2(:) ) +! +!* perform the bilinear interpolation of the normalized +! SDRYG-kernel + ! + Z1(:) = GET_XKER_SDRYG(IVEC1(:)+1,IVEC2(:)+1) + Z2(:) = GET_XKER_SDRYG(IVEC1(:)+1,IVEC2(:) ) + Z3(:) = GET_XKER_SDRYG(IVEC1(:) ,IVEC2(:)+1) + Z4(:) = GET_XKER_SDRYG(IVEC1(:) ,IVEC2(:) ) + ZVEC3(:) = ( Z1(:)* ZVEC2(:) & + - Z2(:)*(ZVEC2(:) - 1.0) ) & + * ZVEC1(:) & + - ( Z3(:)* ZVEC2(:) & + - Z4(:)*(ZVEC2(:) - 1.0) ) & + * (ZVEC1(:) - 1.0) + ZZW(:) = ZVEC3(:) +! + ZZW3(:) = XFSDRYG * ZZW(:) * EXP( XCOLEXSG*(PT(:)-XTT) ) & ! RSDRYG - rs collected by graupel in dry mode + *( PLBDS(:)**(XCXS-XBS) )*( PLBDG(:)**XCXG ) & + *( PRHODREF(:)**(-XCEXVT-1.) ) & + *( XLBSDRYG1/( PLBDG(:)**2 ) + & + XLBSDRYG2/( PLBDG(:) * PLBDS(:) ) + & + XLBSDRYG3/( PLBDS(:)**2) ) +END WHERE +! +!* 1.c Collection of rr in the dry mode +! ------------------------------------- +! +GDRY(:) = (PRRT(:)>XRTMIN(3)) .AND. (PRGT(:)>XRTMIN(6)) .AND. LDCOMPUTE(:) +! +WHERE( GDRY ) +! +!* Select the (ZLBDAG,ZLBDAR) couplet +! + ZVEC1(:) = PLBDG(:) + ZVEC2(:) = PLBDR(:) +! +!* Find the next lower indice for the ZLBDAG and for the ZLBDAR +! in the geometrical set of (Lbda_g,Lbda_r) couplet use to +! tabulate the RDRYG-kernel +! + ZVEC1(:) = MAX( 1.0001, MIN( REAL(NDRYLBDAG)-0.0001, & + XDRYINTP1G * LOG( ZVEC1(:) ) + XDRYINTP2G ) ) + IVEC1(:) = INT( ZVEC1(:) ) + ZVEC1(:) = ZVEC1(:) - REAL( IVEC1(:) ) +! + ZVEC2(:) = MAX( 1.0001, MIN( REAL(NDRYLBDAR)-0.0001, & + XDRYINTP1R * LOG( ZVEC2(:) ) + XDRYINTP2R ) ) + IVEC2(:) = INT( ZVEC2(:) ) + ZVEC2(:) = ZVEC2(:) - REAL( IVEC2(:) ) +! +!* Perform the bilinear interpolation of the normalized +! RDRYG-kernel +! + Z1(:) = GET_XKER_RDRYG(IVEC1(:)+1,IVEC2(:)+1) + Z2(:) = GET_XKER_RDRYG(IVEC1(:)+1,IVEC2(:) ) + Z3(:) = GET_XKER_RDRYG(IVEC1(:) ,IVEC2(:)+1) + Z4(:) = GET_XKER_RDRYG(IVEC1(:) ,IVEC2(:) ) + ZVEC3(:) = ( Z1(:)* ZVEC2(:) & + - Z2(:)*(ZVEC2(:) - 1.0) ) & + * ZVEC1(:) & + - ( Z3(:)* ZVEC2(:) & + - Z4(:)*(ZVEC2(:) - 1.0) ) & + * (ZVEC1(:) - 1.0) + ZZW(:) = ZVEC3(:) +! +! BVIE manque PCRT ??????????????????????????????????? +! ZZW4(:) = XFRDRYG * ZZW(:) & ! RRDRYG + ZZW4(:) = XFRDRYG * ZZW(:) * PCRT(:) & ! RRDRYG + *( PLBDG(:)**XCXG ) * ( PRHODREF(:)**(-XCEXVT-1.) ) & + *( XLBRDRYG1/( PLBDG(:)**2 ) + & + XLBRDRYG2/( PLBDG(:) * PLBDR(:) ) + & + XLBRDRYG3/( PLBDR(:)**2) ) / PLBDR(:)**3 +END WHERE +! +! 1.d Total collection in the dry mode +! ------------------------------------ +! +ZRDRYG(:) = ZZW1(:) + ZZW2(:) + ZZW3(:) + ZZW4(:) +! +! 1.e Collection in the wet mode +! ------------------------------ +! +ZZW(:) = 0.0 +WHERE( PRGT(:)>XRTMIN(6) .AND. LDCOMPUTE(:) ) + ZZW5(:) = ZZW2(:) / (XCOLIG*EXP(XCOLEXIG*(PT(:)-XTT)) ) ! RIWETG + ZZW6(:) = ZZW3(:) / (XCOLSG*EXP(XCOLEXSG*(PT(:)-XTT)) ) ! RSWETG +! + ZZW(:) = PRVT(:)*PPRES(:)/((XMV/XMD)+PRVT(:)) ! Vapor pressure + ZZW(:) = PKA(:)*(XTT-PT(:)) + & + ( PDV(:)*(XLVTT + ( XCPV - XCL ) * ( PT(:) - XTT )) & + *(XESTT-ZZW(:))/(XRV*PT(:)) ) +! +! Total mass gained by graupel in wet mode + ZRWETG(:) = MAX( 0.0, & + ( ZZW(:) * ( X0DEPG* PLBDG(:)**XEX0DEPG + & + X1DEPG*PCJ(:)*PLBDG(:)**XEX1DEPG ) + & + ( ZZW5(:)+ZZW6(:) ) * & + ( PRHODREF(:)*(XLMTT+(XCI-XCL)*(XTT-PT(:))) ) ) / & + ( PRHODREF(:)*(XLMTT-XCL*(XTT-PT(:))) ) ) +END WHERE +! +! 1.f Wet mode and partial conversion to hail +! ------------------------------------------- +! +ZZW(:) = 0.0 +NHAIL = 0. +IF (LHAIL) NHAIL = 1. +WHERE( LDCOMPUTE(:) .AND. PRGT(:)>XRTMIN(6) .AND. PT(:)<XTT & + .AND. ZRDRYG(:)>=ZRWETG(:) .AND. ZRWETG(:)>0.0 ) +! +! Mass of rain and cloud droplets frozen by graupel in wet mode : RCWETG + RRWETG = RWETG - RIWETG - RSWETG + ZZW7(:) = ZRWETG(:) - ZZW5(:) - ZZW6(:) +! +! assume a linear percent of conversion of graupel into hail +! ZZW = percentage of graupel transformed +! + ZZW(:) = ZRDRYG(:)*NHAIL/(ZRWETG(:)+ZRDRYG(:)) +! + P_RC_WETG(:) = - ZZW1(:) + P_CC_WETG(:) = P_RC_WETG(:) * PCCT(:)/MAX(PRCT(:),XRTMIN(2)) + P_RR_WETG(:) = - ZZW7(:) + ZZW1(:) + P_CR_WETG(:) = P_RR_WETG(:) * PCRT(:)/MAX(PRRT(:),XRTMIN(3)) + P_RI_WETG(:) = - ZZW5(:) + P_CI_WETG(:) = P_RI_WETG(:) * PCIT(:)/MAX(PRIT(:),XRTMIN(4)) + P_RS_WETG(:) = - ZZW6(:) + P_RG_WETG(:) = - PRGT(:)/PTSTEP * ZZW(:) + ZRWETG(:) * (1.-ZZW(:)) + P_RH_WETG(:) = PRGT(:)/PTSTEP * ZZW(:) + ZRWETG(:) * ZZW(:) + ! + P_TH_WETG(:) = ZZW7(:) * (PLSFACT(:)-PLVFACT(:)) +END WHERE +! +! 1.g Dry mode +! ------------ +! +WHERE( LDCOMPUTE(:) .AND. PRGT(:)>XRTMIN(6) .AND. PT(:)<XTT & + .AND. ZRDRYG(:)<ZRWETG(:) .AND. ZRDRYG(:)>0.0 ) + ! + P_RC_DRYG(:) = - ZZW1(:) + P_CC_DRYG(:) = P_RC_DRYG(:) * PCCT(:)/MAX(PRCT(:),XRTMIN(2)) + P_RR_DRYG(:) = - ZZW4(:) + P_CR_DRYG(:) = P_RR_DRYG(:) * PCRT(:)/MAX(PRRT(:),XRTMIN(3)) + P_RI_DRYG(:) = - ZZW2(:) + P_CI_DRYG(:) = P_RI_DRYG(:) * PCIT(:)/MAX(PRIT(:),XRTMIN(4)) + P_RS_DRYG(:) = - ZZW3(:) + P_RG_DRYG(:) = ZRDRYG(:) + ! + P_TH_DRYG(:) = (ZZW1(:) + ZZW4(:)) * (PLSFACT(:)-PLVFACT(:)) +END WHERE +! +! +!* 2. Hallett-Mossop process (HMG) +! -------------------------------- +! +! BVIE test ZRDRYG<ZZW ????????????????????????? +!GDRY(:) = (PT(:)<XHMTMAX) .AND. (PT(:)>XHMTMIN) .AND. (ZRDRYG(:)<ZZW(:))& +GDRY(:) = (PT(:)<XHMTMAX) .AND. (PT(:)>XHMTMIN) .AND. (ZRDRYG(:)<ZRWETG(:))& + .AND. (PRGT(:)>XRTMIN(6)) .AND. (PRCT(:)>XRTMIN(2)) .AND. LDCOMPUTE(:) + +ZZX(:)=9999. +ZVEC1(:)=0. +ZVEC2(:)=0. +IVEC1(:)=0 +IVEC2(:)=0 +WHERE( GDRY(:) ) +! + ZVEC1(:) = PLBDC(:) + ZVEC2(:) = MAX( 1.0001, MIN( REAL(NGAMINC)-0.0001, & + XHMLINTP1 * LOG( ZVEC1(:) ) + XHMLINTP2 ) ) + IVEC2(:) = INT( ZVEC2(:) ) + ZVEC2(:) = ZVEC2(:) - REAL( IVEC2(:) ) + ZVEC1(:) = XGAMINC_HMC( IVEC2(:)+1 )* ZVEC2(:) & + - XGAMINC_HMC( IVEC2(:) )*(ZVEC2(:) - 1.0) + ZZX(:) = ZVEC1(:) ! Large droplets +! + WHERE ( ZZX(:)<0.99 ) ! Dry case + P_CI_HMG(:) = ZZW1(:)*(PCCT(:)/PRCT(:))*(1.0-ZZX(:))*XHM_FACTG* & + MAX( 0.0, MIN( (PT(:)-XHMTMIN)/3.0,(XHMTMAX-PT(:))/2.0 ) ) + P_RI_HMG(:) = P_CI_HMG(:) * XMNU0 + P_RG_HMG(:) = - P_RI_HMG(:) + END WHERE +END WHERE +! +! +!* 3. Graupel Melting +! ------------------- +! +ZZX(:) = 0.0 +WHERE( (PRGT(:)>XRTMIN(6)) .AND. (PT(:)>XTT) .AND. LDCOMPUTE(:) ) + ZZX(:) = PRVT(:)*PPRES(:)/((XMV/XMD)+PRVT(:)) ! Vapor pressure + ZZX(:) = PKA(:)*(XTT-PT(:)) + & + ( PDV(:)*(XLVTT + ( XCPV - XCL ) * ( PT(:) - XTT )) & + *(XESTT-ZZX(:))/(XRV*PT(:)) ) +! +! compute RGMLTR +! + ZZX(:) = MAX( 0.0,( -ZZX(:) * & + ( X0DEPG* PLBDG(:)**XEX0DEPG + & + X1DEPG*PCJ(:)*PLBDG(:)**XEX1DEPG ) - & + ( ZZW1(:)+ZZW4(:) ) * & + ( PRHODREF(:)*XCL*(XTT-PT(:))) ) / & + ( PRHODREF(:)*XLMTT ) ) + P_RR_GMLT(:) = ZZX(:) + P_CR_GMLT(:) = ZZX(:) * 5.0E6 ! obtained after averaging, Dshed=1mm and 500 microns + ! + P_TH_GMLT(:) = - P_RR_GMLT(:) * (PLSFACT(:)-PLVFACT(:)) +END WHERE +! +! +! +! +PA_RC(:) = PA_RC(:) + P_RC_WETG(:) + P_RC_DRYG(:) +PA_CC(:) = PA_CC(:) + P_CC_WETG(:) + P_CC_DRYG(:) +PA_RR(:) = PA_RR(:) + P_RR_WETG(:) + P_RR_DRYG(:) + P_RR_GMLT(:) +PA_CR(:) = PA_CR(:) + P_CR_WETG(:) + P_CR_DRYG(:) + P_CR_GMLT(:) +PA_RI(:) = PA_RI(:) + P_RI_WETG(:) + P_RI_DRYG(:) + P_RI_HMG(:) +PA_CI(:) = PA_CI(:) + P_CI_WETG(:) + P_CI_DRYG(:) + P_CI_HMG(:) +PA_RS(:) = PA_RS(:) + P_RS_WETG(:) + P_RS_DRYG(:) +PA_RG(:) = PA_RG(:) + P_RG_WETG(:) + P_RG_DRYG(:) + P_RG_HMG(:) - P_RR_GMLT(:) +PA_RH(:) = PA_RH(:) + P_RH_WETG(:) +PA_TH(:) = PA_TH(:) + P_TH_WETG(:) + P_TH_DRYG(:) + P_TH_GMLT(:) +! +!------------------------------------------------------------------------------- +! +CONTAINS + FUNCTION GET_XKER_SDRYG(GRAUPEL,SNOW) RESULT(RET) + INTEGER, DIMENSION(:) :: GRAUPEL + INTEGER, DIMENSION(:) :: SNOW + REAL, DIMENSION(SIZE(SNOW)) :: RET + ! + INTEGER I + ! + DO I=1,SIZE(GRAUPEL) + RET(I) = XKER_SDRYG(MAX(MIN(GRAUPEL(I),SIZE(XKER_SDRYG,1)),1),MAX(MIN(SNOW(I),SIZE(XKER_SDRYG,2)),1)) + END DO + END FUNCTION GET_XKER_SDRYG +! +!------------------------------------------------------------------------------- +! + FUNCTION GET_XKER_RDRYG(GRAUPEL,RAIN) RESULT(RET) + INTEGER, DIMENSION(:) :: GRAUPEL + INTEGER, DIMENSION(:) :: RAIN + REAL, DIMENSION(SIZE(RAIN)) :: RET + ! + INTEGER I + ! + DO I=1,SIZE(GRAUPEL) + RET(I) = XKER_RDRYG(MAX(MIN(GRAUPEL(I),SIZE(XKER_RDRYG,1)),1),MAX(MIN(RAIN(I),SIZE(XKER_RDRYG,2)),1)) + END DO + END FUNCTION GET_XKER_RDRYG +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE LIMA_GRAUPEL diff --git a/src/mesonh/micro/lima_graupel_deposition.f90 b/src/mesonh/micro/lima_graupel_deposition.f90 new file mode 100644 index 000000000..d283c9699 --- /dev/null +++ b/src/mesonh/micro/lima_graupel_deposition.f90 @@ -0,0 +1,97 @@ +!MNH_LIC Copyright 2018-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!------------------------------------------------------------------------------- +! ################################# + MODULE MODI_LIMA_GRAUPEL_DEPOSITION +! ################################# +! +INTERFACE + SUBROUTINE LIMA_GRAUPEL_DEPOSITION (LDCOMPUTE, PRHODREF, & + PRGT, PSSI, PLBDG, PAI, PCJ, PLSFACT, & + P_TH_DEPG, P_RG_DEPG ) +! +LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE +REAL, DIMENSION(:), INTENT(IN) :: PRHODREF ! +! +REAL, DIMENSION(:), INTENT(IN) :: PRGT ! Cloud water C. at t +REAL, DIMENSION(:), INTENT(IN) :: PSSI ! +REAL, DIMENSION(:), INTENT(IN) :: PLBDG ! +REAL, DIMENSION(:), INTENT(IN) :: PAI ! +REAL, DIMENSION(:), INTENT(IN) :: PCJ ! +REAL, DIMENSION(:), INTENT(IN) :: PLSFACT ! +! +REAL, DIMENSION(:), INTENT(OUT) :: P_TH_DEPG +REAL, DIMENSION(:), INTENT(OUT) :: P_RG_DEPG +!! +END SUBROUTINE LIMA_GRAUPEL_DEPOSITION +END INTERFACE +END MODULE MODI_LIMA_GRAUPEL_DEPOSITION +! +! ########################################################################### + SUBROUTINE LIMA_GRAUPEL_DEPOSITION (LDCOMPUTE, PRHODREF, & + PRGT, PSSI, PLBDG, PAI, PCJ, PLSFACT, & + P_TH_DEPG, P_RG_DEPG ) +! ########################################################################### +! +!! PURPOSE +!! ------- +!! Deposition of water vapour on graupel +!! +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * CNRM * +!! +!! MODIFICATIONS +!! ------------- +!! Original 15/03/2018 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAM_LIMA, ONLY : XRTMIN +USE MODD_PARAM_LIMA_MIXED, ONLY : X0DEPG, XEX0DEPG, X1DEPG, XEX1DEPG +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE +REAL, DIMENSION(:), INTENT(IN) :: PRHODREF ! +! +REAL, DIMENSION(:), INTENT(IN) :: PRGT ! Cloud water C. at t +REAL, DIMENSION(:), INTENT(IN) :: PSSI ! +REAL, DIMENSION(:), INTENT(IN) :: PLBDG ! +REAL, DIMENSION(:), INTENT(IN) :: PAI ! +REAL, DIMENSION(:), INTENT(IN) :: PCJ ! +REAL, DIMENSION(:), INTENT(IN) :: PLSFACT ! +! +REAL, DIMENSION(:), INTENT(OUT) :: P_TH_DEPG +REAL, DIMENSION(:), INTENT(OUT) :: P_RG_DEPG +! +! +!------------------------------------------------------------------------------- +! +! +!* 1. Deposition of vapour on graupel +! ------------------------------- +! +P_TH_DEPG(:) = 0.0 +P_RG_DEPG(:) = 0.0 +WHERE ( (PRGT(:)>XRTMIN(6)) .AND. LDCOMPUTE(:) ) + P_RG_DEPG(:) = ( PSSI(:)/PAI(:)/PRHODREF(:) ) * & + ( X0DEPG*PLBDG(:)**XEX0DEPG + X1DEPG*PCJ(:)*PLBDG(:)**XEX1DEPG ) + P_TH_DEPG(:) = P_RG_DEPG(:)*PLSFACT(:) +END WHERE +! +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE LIMA_GRAUPEL_DEPOSITION diff --git a/src/mesonh/micro/lima_ice_aggregation_snow.f90 b/src/mesonh/micro/lima_ice_aggregation_snow.f90 new file mode 100644 index 000000000..15e01ec84 --- /dev/null +++ b/src/mesonh/micro/lima_ice_aggregation_snow.f90 @@ -0,0 +1,119 @@ +!MNH_LIC Copyright 2018-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!------------------------------------------------------------------------------- +! ################################# + MODULE MODI_LIMA_ICE_AGGREGATION_SNOW +! ################################# +! +INTERFACE + SUBROUTINE LIMA_ICE_AGGREGATION_SNOW (LDCOMPUTE, & + PT, PRHODREF, & + PRIT, PRST, PCIT, PLBDI, PLBDS, & + P_RI_AGGS, P_CI_AGGS ) +! +LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE +! +REAL, DIMENSION(:), INTENT(IN) :: PT +REAL, DIMENSION(:), INTENT(IN) :: PRHODREF +! +REAL, DIMENSION(:), INTENT(IN) :: PRIT +REAL, DIMENSION(:), INTENT(IN) :: PRST +REAL, DIMENSION(:), INTENT(IN) :: PCIT +REAL, DIMENSION(:), INTENT(IN) :: PLBDI +REAL, DIMENSION(:), INTENT(IN) :: PLBDS +! +REAL, DIMENSION(:), INTENT(OUT) :: P_RI_AGGS +REAL, DIMENSION(:), INTENT(OUT) :: P_CI_AGGS +! +END SUBROUTINE LIMA_ICE_AGGREGATION_SNOW +END INTERFACE +END MODULE MODI_LIMA_ICE_AGGREGATION_SNOW +! +! ####################################################################### + SUBROUTINE LIMA_ICE_AGGREGATION_SNOW (LDCOMPUTE, & + PT, PRHODREF, & + PRIT, PRST, PCIT, PLBDI, PLBDS, & + P_RI_AGGS, P_CI_AGGS ) +! ####################################################################### +! +!! PURPOSE +!! ------- +!! Compute the aggregation of pristine ice on snow/aggregates +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * CNRM * +!! +!! MODIFICATIONS +!! ------------- +!! Original 15/03/2018 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST, ONLY : XTT +USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCTMIN +USE MODD_PARAM_LIMA_COLD, ONLY : XBI, XCCS, XCXS, XCOLEXIS, XAGGS_CLARGE1, XAGGS_CLARGE2, & + XAGGS_RLARGE1, XAGGS_RLARGE2 +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE +! +REAL, DIMENSION(:), INTENT(IN) :: PT +REAL, DIMENSION(:), INTENT(IN) :: PRHODREF +! +REAL, DIMENSION(:), INTENT(IN) :: PRIT +REAL, DIMENSION(:), INTENT(IN) :: PRST +REAL, DIMENSION(:), INTENT(IN) :: PCIT +REAL, DIMENSION(:), INTENT(IN) :: PLBDI +REAL, DIMENSION(:), INTENT(IN) :: PLBDS +! +REAL, DIMENSION(:), INTENT(OUT) :: P_RI_AGGS +REAL, DIMENSION(:), INTENT(OUT) :: P_CI_AGGS +! +!* 0.2 Declarations of local variables : +! +REAL, DIMENSION(SIZE(PRIT)) :: ZZW1, ZZW2, ZZW3 ! work arrays +! +!------------------------------------------------------------------------------- +! +! +!* 2.4 Aggregation of r_i on r_s: CIAGGS and RIAGGS +! --------------------------------------------------- +! +ZZW1(:) = 0. +ZZW2(:) = 0. +ZZW3(:) = 0. +! +P_RI_AGGS(:) = 0. +P_CI_AGGS(:) = 0. +! +! +WHERE ( (PRIT(:)>XRTMIN(4)) .AND. (PRST(:)>XRTMIN(5)) .AND. LDCOMPUTE(:) ) + ZZW1(:) = (PLBDI(:) / PLBDS(:))**3 + ZZW2(:) = (PCIT(:)*(XCCS*PLBDS(:)**XCXS)/PRHODREF(:)*EXP( XCOLEXIS*(PT(:)-XTT) )) & + / (PLBDI(:)**3) + ZZW3(:) = ZZW2(:)*(XAGGS_CLARGE1+XAGGS_CLARGE2*ZZW1(:)) +! + P_CI_AGGS(:) = - ZZW3(:) +! + ZZW2(:) = ZZW2(:) / PLBDI(:)**XBI + ZZW2(:) = ZZW2(:)*(XAGGS_RLARGE1+XAGGS_RLARGE2*ZZW1(:)) +! + P_RI_AGGS(:) = - ZZW2(:) +END WHERE +! +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE LIMA_ICE_AGGREGATION_SNOW diff --git a/src/mesonh/micro/lima_ice_deposition.f90 b/src/mesonh/micro/lima_ice_deposition.f90 new file mode 100644 index 000000000..8c7c57e40 --- /dev/null +++ b/src/mesonh/micro/lima_ice_deposition.f90 @@ -0,0 +1,175 @@ +!MNH_LIC Copyright 2018-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!------------------------------------------------------------------------------- +! ##################### + MODULE MODI_LIMA_ICE_DEPOSITION +! ##################### +! +INTERFACE + SUBROUTINE LIMA_ICE_DEPOSITION (PTSTEP, LDCOMPUTE, & + PRHODREF, PSSI, PAI, PCJ, PLSFACT, & + PRIT, PCIT, PLBDI, & + P_TH_DEPI, P_RI_DEPI, & + P_RI_CNVS, P_CI_CNVS ) +! +REAL, INTENT(IN) :: PTSTEP +LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE +! +REAL, DIMENSION(:), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(:), INTENT(IN) :: PSSI ! abs. pressure at time t +REAL, DIMENSION(:), INTENT(IN) :: PAI ! abs. pressure at time t +REAL, DIMENSION(:), INTENT(IN) :: PCJ ! abs. pressure at time t +REAL, DIMENSION(:), INTENT(IN) :: PLSFACT ! abs. pressure at time t +! +REAL, DIMENSION(:), INTENT(IN) :: PRIT ! Cloud ice m.r. at t +! +REAL, DIMENSION(:), INTENT(IN) :: PCIT ! Ice crystal C. at t +! +REAL, DIMENSION(:), INTENT(IN) :: PLBDI ! Graupel m.r. at t +! +REAL, DIMENSION(:), INTENT(OUT) :: P_TH_DEPI +REAL, DIMENSION(:), INTENT(OUT) :: P_RI_DEPI +REAL, DIMENSION(:), INTENT(OUT) :: P_RI_CNVS +REAL, DIMENSION(:), INTENT(OUT) :: P_CI_CNVS +! +END SUBROUTINE LIMA_ICE_DEPOSITION +END INTERFACE +END MODULE MODI_LIMA_ICE_DEPOSITION +! +! ########################################################################## +SUBROUTINE LIMA_ICE_DEPOSITION (PTSTEP, LDCOMPUTE, & + PRHODREF, PSSI, PAI, PCJ, PLSFACT, & + PRIT, PCIT, PLBDI, & + P_TH_DEPI, P_RI_DEPI, & + P_RI_CNVS, P_CI_CNVS ) +! ########################################################################## +! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the microphysical sources +!! for slow cold processes : +!! - conversion of snow to ice +!! - deposition of vapor on snow +!! - conversion of ice to snow (Harrington 1995) +!! +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * CNRM * +!! +!! MODIFICATIONS +!! ------------- +!! Original 15/03/2018 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCTMIN, XALPHAI, XALPHAS, XNUI, XNUS +USE MODD_PARAM_LIMA_COLD, ONLY : XCXS, XCCS, & + XLBDAS_MAX, XDSCNVI_LIM, XLBDASCNVI_MAX, & + XC0DEPSI, XC1DEPSI, XR0DEPSI, XR1DEPSI, & + XSCFAC, X1DEPS, X0DEPS, XEX1DEPS, XEX0DEPS, & + XDICNVS_LIM, XLBDAICNVS_LIM, & + XC0DEPIS, XC1DEPIS, XR0DEPIS, XR1DEPIS, & + XCOLEXIS, XAGGS_CLARGE1, XAGGS_CLARGE2, & + XAGGS_RLARGE1, XAGGS_RLARGE2, & + XDI, X0DEPI, X2DEPI + +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +REAL, INTENT(IN) :: PTSTEP +LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE +! +REAL, DIMENSION(:), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(:), INTENT(IN) :: PSSI ! abs. pressure at time t +REAL, DIMENSION(:), INTENT(IN) :: PAI ! abs. pressure at time t +REAL, DIMENSION(:), INTENT(IN) :: PCJ ! abs. pressure at time t +REAL, DIMENSION(:), INTENT(IN) :: PLSFACT ! abs. pressure at time t +! +REAL, DIMENSION(:), INTENT(IN) :: PRIT ! Cloud ice m.r. at t +! +REAL, DIMENSION(:), INTENT(IN) :: PCIT ! Ice crystal C. at t +! +REAL, DIMENSION(:), INTENT(IN) :: PLBDI ! Graupel m.r. at t +! +REAL, DIMENSION(:), INTENT(OUT) :: P_TH_DEPI +REAL, DIMENSION(:), INTENT(OUT) :: P_RI_DEPI +REAL, DIMENSION(:), INTENT(OUT) :: P_RI_CNVS +REAL, DIMENSION(:), INTENT(OUT) :: P_CI_CNVS +! +!* 0.2 Declarations of local variables : +! +LOGICAL, DIMENSION(SIZE(PRHODREF)) :: GMICRO ! Computations only where necessary +REAL, DIMENSION(SIZE(PRHODREF)) :: ZZW, ZZW2, ZZX ! Work array +! +! +!------------------------------------------------------------------------------- +! +P_TH_DEPI(:) = 0. +P_RI_DEPI(:) = 0. +P_RI_CNVS(:) = 0. +P_CI_CNVS(:) = 0. +! +! Physical limitations +! +! +! Looking for regions where computations are necessary +! +GMICRO(:) = LDCOMPUTE(:) .AND. PRIT(:)>XRTMIN(4) +! +! +WHERE( GMICRO ) +! +! +!* 2.2 Deposition of water vapor on r_i: RVDEPI +! ----------------------------------------------- +! +! + ZZW(:) = 0.0 + WHERE ( (PRIT(:)>XRTMIN(4)) .AND. (PCIT(:)>XCTMIN(4)) ) + ZZW(:) = ( PSSI(:) / PAI(:) ) * PCIT(:) * & + ( X0DEPI/PLBDI(:)+X2DEPI*PCJ(:)*PCJ(:)/PLBDI(:)**(XDI+2.0) ) + END WHERE +! + P_RI_DEPI(:) = ZZW(:) +!!$ P_TH_DEPI(:) = P_RI_DEPI(:) * PLSFACT(:) +! +!!$ PA_TH(:) = PA_TH(:) + P_TH_DEPI(:) +!!$ PA_RV(:) = PA_RV(:) - P_RI_DEPI(:) +!!$ PA_RI(:) = PA_RI(:) + P_RI_DEPI(:) +! +! +!* 2.3 Conversion of pristine ice to r_s: RICNVS +! ------------------------------------------------ +! +! + ZZW(:) = 0.0 + ZZW2(:) = 0.0 + WHERE ( (PLBDI(:)<XLBDAICNVS_LIM) .AND. (PCIT(:)>XCTMIN(4)) & + .AND. (PSSI(:)>0.0) ) + ZZW(:) = (PLBDI(:)*XDICNVS_LIM)**(XALPHAI) + ZZX(:) = ( PSSI(:)/PAI(:) )*PCIT(:) * (ZZW(:)**XNUI) *EXP(-ZZW(:)) +! + ZZW(:) = ( XR0DEPIS + XR1DEPIS*PCJ(:) )*ZZX(:) +! + ZZW2(:) = ZZW(:) * (XC0DEPIS+XC1DEPIS*PCJ(:)) / (XR0DEPIS+XR1DEPIS*PCJ(:)) + END WHERE +! +P_RI_CNVS(:) = - ZZW(:) +P_CI_CNVS(:) = - ZZW2(:) +! +! +END WHERE +! +! +END SUBROUTINE LIMA_ICE_DEPOSITION diff --git a/src/mesonh/micro/lima_ice_melting.f90 b/src/mesonh/micro/lima_ice_melting.f90 new file mode 100644 index 000000000..a95f45044 --- /dev/null +++ b/src/mesonh/micro/lima_ice_melting.f90 @@ -0,0 +1,164 @@ +!MNH_LIC Copyright 2013-2018 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +! ################################# + MODULE MODI_LIMA_ICE_MELTING +! ################################# +! +INTERFACE + SUBROUTINE LIMA_ICE_MELTING (PTSTEP, LDCOMPUTE, & + PEXNREF, PPABST, & + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & + PCIT, PINT, & + P_TH_IMLT, P_RC_IMLT, P_CC_IMLT, & + PB_TH, PB_RC, PB_CC, PB_RI, PB_CI, PB_IFNN) +! +REAL, INTENT(IN) :: PTSTEP +LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE +! +REAL, DIMENSION(:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:), INTENT(IN) :: PPABST ! abs. pressure at time t +! +REAL, DIMENSION(:), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(:), INTENT(IN) :: PRVT ! +REAL, DIMENSION(:), INTENT(IN) :: PRCT ! +REAL, DIMENSION(:), INTENT(IN) :: PRRT ! +REAL, DIMENSION(:), INTENT(IN) :: PRIT ! Cloud ice m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: PRST ! +REAL, DIMENSION(:), INTENT(IN) :: PRGT ! +! +REAL, DIMENSION(:), INTENT(IN) :: PCIT ! Rain water C. at t +REAL, DIMENSION(:,:), INTENT(IN) :: PINT ! Nucleated IFN C. at t +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_IMLT +REAL, DIMENSION(:), INTENT(INOUT) :: P_RC_IMLT +REAL, DIMENSION(:), INTENT(INOUT) :: P_CC_IMLT +REAL, DIMENSION(:), INTENT(INOUT) :: PB_TH +REAL, DIMENSION(:), INTENT(INOUT) :: PB_RC +REAL, DIMENSION(:), INTENT(INOUT) :: PB_CC +REAL, DIMENSION(:), INTENT(INOUT) :: PB_RI +REAL, DIMENSION(:), INTENT(INOUT) :: PB_CI +REAL, DIMENSION(:,:), INTENT(INOUT) :: PB_IFNN +! +END SUBROUTINE LIMA_ICE_MELTING +END INTERFACE +END MODULE MODI_LIMA_ICE_MELTING +! +! ######################################################################## + SUBROUTINE LIMA_ICE_MELTING (PTSTEP, LDCOMPUTE, & + PEXNREF, PPABST, & + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & + PCIT, PINT, & + P_TH_IMLT, P_RC_IMLT, P_CC_IMLT, & + PB_TH, PB_RC, PB_CC, PB_RI, PB_CI, PB_IFNN) +! ######################################################################## +! +!! PURPOSE +!! ------- +!! Melting of pristine ice crystals +!! +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * CNRM * +!! +!! MODIFICATIONS +!! ------------- +!! Original 15/03/2018 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST, ONLY : XP00, XRD, XCPD, XCPV, XCL, XCI, XTT, XLSTT, XLVTT +USE MODD_PARAM_LIMA, ONLY : XRTMIN, NMOD_IFN +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +REAL, INTENT(IN) :: PTSTEP +LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE +! +REAL, DIMENSION(:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:), INTENT(IN) :: PPABST ! abs. pressure at time t +! +REAL, DIMENSION(:), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(:), INTENT(IN) :: PRVT ! +REAL, DIMENSION(:), INTENT(IN) :: PRCT ! +REAL, DIMENSION(:), INTENT(IN) :: PRRT ! +REAL, DIMENSION(:), INTENT(IN) :: PRIT ! Cloud ice m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: PRST ! +REAL, DIMENSION(:), INTENT(IN) :: PRGT ! +! +REAL, DIMENSION(:), INTENT(IN) :: PCIT ! Rain water C. at t +REAL, DIMENSION(:,:), INTENT(IN) :: PINT ! Nucleated IFN C. at t +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_IMLT +REAL, DIMENSION(:), INTENT(INOUT) :: P_RC_IMLT +REAL, DIMENSION(:), INTENT(INOUT) :: P_CC_IMLT +REAL, DIMENSION(:), INTENT(INOUT) :: PB_TH +REAL, DIMENSION(:), INTENT(INOUT) :: PB_RC +REAL, DIMENSION(:), INTENT(INOUT) :: PB_CC +REAL, DIMENSION(:), INTENT(INOUT) :: PB_RI +REAL, DIMENSION(:), INTENT(INOUT) :: PB_CI +REAL, DIMENSION(:,:), INTENT(INOUT) :: PB_IFNN +! +!* 0.2 Declarations of local variables : +! +REAL, DIMENSION(SIZE(PTHT)) :: & + ZW, & + ZT, & + ZTCELSIUS,& + ZLSFACT, & + ZLVFACT, & + ZMASK +! +INTEGER :: JMOD_IFN +! +! +! +!------------------------------------------------------------------------------- +! +P_TH_IMLT(:) = 0. +P_RC_IMLT(:) = 0. +P_CC_IMLT(:) = 0. +! +! Temperature +ZT(:) = PTHT(:) * ( PPABST(:)/XP00 ) ** (XRD/XCPD) +ZTCELSIUS(:) = ZT(:)-XTT +! +ZW(:) = PEXNREF(:)*( XCPD+XCPV*PRVT(:)+XCL*(PRCT(:)+PRRT(:)) & + +XCI*(PRIT(:)+PRST(:)+PRGT(:)) ) +ZLSFACT(:) = (XLSTT+(XCPV-XCI)*ZTCELSIUS(:))/ZW(:) ! L_s/(Pi_ref*C_ph) +ZLVFACT(:) = (XLVTT+(XCPV-XCL)*ZTCELSIUS(:))/ZW(:) ! L_v/(Pi_ref*C_ph) +! +ZW(:) = 0.0 +! +ZMASK(:) = 0. +! +WHERE( (ZT(:)>XTT) .AND. (PRIT(:)>XRTMIN(4)) .AND. LDCOMPUTE(:) ) + P_TH_IMLT(:) = - PRIT(:)*(ZLSFACT(:)-ZLVFACT(:)) + P_RC_IMLT(:) = PRIT(:) + P_CC_IMLT(:) = PCIT(:) + PB_TH(:) = PB_TH(:) + P_TH_IMLT(:) + PB_RC(:) = PB_RC(:) + PRIT(:) + PB_CC(:) = PB_CC(:) + PCIT(:) + PB_RI(:) = PB_RI(:) - PRIT(:) + PB_CI(:) = PB_CI(:) - PCIT(:) + ZMASK(:) = 1. +ENDWHERE +! +DO JMOD_IFN = 1,NMOD_IFN + PB_IFNN(:,JMOD_IFN) = PB_IFNN(:,JMOD_IFN) - PINT(:,JMOD_IFN)* ZMASK(:) +ENDDO +! +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE LIMA_ICE_MELTING diff --git a/src/mesonh/micro/lima_ice_snow_deposition.f90 b/src/mesonh/micro/lima_ice_snow_deposition.f90 new file mode 100644 index 000000000..4d92b528a --- /dev/null +++ b/src/mesonh/micro/lima_ice_snow_deposition.f90 @@ -0,0 +1,230 @@ +!MNH_LIC Copyright 2013-2018 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +! ##################### + MODULE MODI_LIMA_ICE_SNOW_DEPOSITION +! ##################### +! +INTERFACE + SUBROUTINE LIMA_ICE_SNOW_DEPOSITION (PTSTEP, LDCOMPUTE, & + PRHODREF, PSSI, PAI, PCJ, PLSFACT, & + PRIT, PRST, PCIT, PLBDI, PLBDS, & + P_RI_CNVI, P_CI_CNVI, & + P_TH_DEPS, P_RS_DEPS, & + P_RI_CNVS, P_CI_CNVS, & + PA_TH, PA_RV, PA_RI, PA_CI, PA_RS ) +! +REAL, INTENT(IN) :: PTSTEP +LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE +! +REAL, DIMENSION(:), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(:), INTENT(IN) :: PSSI ! abs. pressure at time t +REAL, DIMENSION(:), INTENT(IN) :: PAI ! abs. pressure at time t +REAL, DIMENSION(:), INTENT(IN) :: PCJ ! abs. pressure at time t +REAL, DIMENSION(:), INTENT(IN) :: PLSFACT ! abs. pressure at time t +! +REAL, DIMENSION(:), INTENT(IN) :: PRIT ! Cloud ice m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +! +REAL, DIMENSION(:), INTENT(IN) :: PCIT ! Ice crystal C. at t +! +REAL, DIMENSION(:), INTENT(IN) :: PLBDI ! Graupel m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: PLBDS ! Graupel m.r. at t +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_CNVI +REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_CNVI +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_DEPS +REAL, DIMENSION(:), INTENT(INOUT) :: P_RS_DEPS +REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_CNVS +REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_CNVS +! +REAL, DIMENSION(:), INTENT(INOUT) :: PA_TH +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RV +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RI +REAL, DIMENSION(:), INTENT(INOUT) :: PA_CI +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RS +! +END SUBROUTINE LIMA_ICE_SNOW_DEPOSITION +END INTERFACE +END MODULE MODI_LIMA_ICE_SNOW_DEPOSITION +! +! ########################################################################## +SUBROUTINE LIMA_ICE_SNOW_DEPOSITION (PTSTEP, LDCOMPUTE, & + PRHODREF, PSSI, PAI, PCJ, PLSFACT, & + PRIT, PRST, PCIT, PLBDI, PLBDS, & + P_RI_CNVI, P_CI_CNVI, & + P_TH_DEPS, P_RS_DEPS, & + P_RI_CNVS, P_CI_CNVS, & + PA_TH, PA_RV, PA_RI, PA_CI, PA_RS ) +! ########################################################################## +! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the microphysical sources +!! for slow cold processes : +!! - conversion of snow to ice +!! - deposition of vapor on snow +!! - conversion of ice to snow (Harrington 1995) +!! +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * CNRM * +!! +!! MODIFICATIONS +!! ------------- +!! Original 15/03/2018 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCTMIN, XALPHAI, XALPHAS, XNUI, XNUS +USE MODD_PARAM_LIMA_COLD, ONLY : XCXS, XCCS, & + XLBDAS_MAX, XDSCNVI_LIM, XLBDASCNVI_MAX, & + XC0DEPSI, XC1DEPSI, XR0DEPSI, XR1DEPSI, & + XSCFAC, X1DEPS, X0DEPS, XEX1DEPS, XEX0DEPS, & + XDICNVS_LIM, XLBDAICNVS_LIM, & + XC0DEPIS, XC1DEPIS, XR0DEPIS, XR1DEPIS, & + XCOLEXIS, XAGGS_CLARGE1, XAGGS_CLARGE2, & + XAGGS_RLARGE1, XAGGS_RLARGE2 + +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +REAL, INTENT(IN) :: PTSTEP +LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE +! +REAL, DIMENSION(:), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(:), INTENT(IN) :: PSSI ! abs. pressure at time t +REAL, DIMENSION(:), INTENT(IN) :: PAI ! abs. pressure at time t +REAL, DIMENSION(:), INTENT(IN) :: PCJ ! abs. pressure at time t +REAL, DIMENSION(:), INTENT(IN) :: PLSFACT ! abs. pressure at time t +! +REAL, DIMENSION(:), INTENT(IN) :: PRIT ! Cloud ice m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +! +REAL, DIMENSION(:), INTENT(IN) :: PCIT ! Ice crystal C. at t +! +REAL, DIMENSION(:), INTENT(IN) :: PLBDI ! Graupel m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: PLBDS ! Graupel m.r. at t +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_CNVI +REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_CNVI +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_DEPS +REAL, DIMENSION(:), INTENT(INOUT) :: P_RS_DEPS +REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_CNVS +REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_CNVS +! +REAL, DIMENSION(:), INTENT(INOUT) :: PA_TH +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RV +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RI +REAL, DIMENSION(:), INTENT(INOUT) :: PA_CI +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RS +! +!* 0.2 Declarations of local variables : +! +LOGICAL, DIMENSION(SIZE(PRHODREF)) :: GMICRO ! Computations only where necessary +REAL, DIMENSION(SIZE(PRHODREF)) :: ZZW, ZZW2, ZZX ! Work array +! +! +!------------------------------------------------------------------------------- +! +P_RI_CNVI(:) = 0. +P_CI_CNVI(:) = 0. +P_TH_DEPS(:) = 0. +P_RS_DEPS(:) = 0. +P_RI_CNVS(:) = 0. +P_CI_CNVS(:) = 0. +! +! Physical limitations +! +! +! Looking for regions where computations are necessary +! +GMICRO(:) = .FALSE. +GMICRO(:) = LDCOMPUTE(:) .AND. & + (PRIT(:)>XRTMIN(4) .OR. & + PRST(:)>XRTMIN(5)) +! +! +WHERE( GMICRO ) +! +!* 2.1 Conversion of snow to r_i: RSCNVI +! ---------------------------------------- +! +! + ZZW2(:) = 0.0 + ZZW(:) = 0.0 + WHERE ( PLBDS(:)<XLBDASCNVI_MAX .AND. (PRST(:)>XRTMIN(5)) & + .AND. (PSSI(:)<0.0) ) + ZZW(:) = (PLBDS(:)*XDSCNVI_LIM)**(XALPHAS) + ZZX(:) = ( -PSSI(:)/PAI(:) ) * (XCCS*PLBDS(:)**XCXS)/PRHODREF(:) * (ZZW(:)**XNUS) * EXP(-ZZW(:)) +! + ZZW(:) = ( XR0DEPSI+XR1DEPSI*PCJ(:) )*ZZX(:) +! + ZZW2(:) = ZZW(:)*( XC0DEPSI+XC1DEPSI*PCJ(:) )/( XR0DEPSI+XR1DEPSI*PCJ(:) ) + END WHERE +! + P_RI_CNVI(:) = ZZW(:) + P_CI_CNVI(:) = ZZW2(:) +! + PA_RI(:) = PA_RI(:) + P_RI_CNVI(:) + PA_CI(:) = PA_CI(:) + P_CI_CNVI(:) + PA_RS(:) = PA_RS(:) - P_RI_CNVI(:) +! +! +!* 2.2 Deposition of water vapor on r_s: RVDEPS +! ----------------------------------------------- +! +! + ZZW(:) = 0.0 + WHERE ( (PRST(:)>XRTMIN(5)) ) + ZZW(:) = ( PSSI(:)/(PAI(:))/PRHODREF(:) ) * & + ( X0DEPS*PLBDS(:)**XEX0DEPS + X1DEPS*PCJ(:)*PLBDS(:)**XEX1DEPS ) + ZZW(:) = ZZW(:)*(0.5+SIGN(0.5,ZZW(:))) - ABS(ZZW(:))*(0.5-SIGN(0.5,ZZW(:))) + END WHERE +! + P_RS_DEPS(:) = ZZW(:) + P_TH_DEPS(:) = P_RS_DEPS(:) * PLSFACT(:) +! + PA_TH(:) = PA_TH(:) + P_TH_DEPS(:) + PA_RV(:) = PA_RV(:) - P_RS_DEPS(:) + PA_RS(:) = PA_RS(:) + P_RS_DEPS(:) +! +! +!* 2.3 Conversion of pristine ice to r_s: RICNVS +! ------------------------------------------------ +! +! + ZZW(:) = 0.0 + ZZW2(:) = 0.0 + WHERE ( (PLBDI(:)<XLBDAICNVS_LIM) .AND. (PCIT(:)>XCTMIN(4)) & + .AND. (PSSI(:)>0.0) ) + ZZW(:) = (PLBDI(:)*XDICNVS_LIM)**(XALPHAI) + ZZX(:) = ( PSSI(:)/PAI(:) )*PCIT(:) * (ZZW(:)**XNUI) *EXP(-ZZW(:)) +! + ZZW(:) = ( XR0DEPIS + XR1DEPIS*PCJ(:) )*ZZX(:) +! + ZZW2(:) = ZZW(:) * (XC0DEPIS+XC1DEPIS*PCJ(:)) / (XR0DEPIS+XR1DEPIS*PCJ(:)) + END WHERE +! +P_RI_CNVS(:) = - ZZW(:) +P_CI_CNVS(:) = - ZZW2(:) +! +PA_RI(:) = PA_RI(:) + P_RI_CNVS(:) +PA_CI(:) = PA_CI(:) + P_CI_CNVS(:) +PA_RS(:) = PA_RS(:) - P_RI_CNVS(:) +! +! +END WHERE +! +! +END SUBROUTINE LIMA_ICE_SNOW_DEPOSITION diff --git a/src/mesonh/micro/lima_init_ccn_activation_spectrum.f90 b/src/mesonh/micro/lima_init_ccn_activation_spectrum.f90 new file mode 100644 index 000000000..16a561740 --- /dev/null +++ b/src/mesonh/micro/lima_init_ccn_activation_spectrum.f90 @@ -0,0 +1,458 @@ +!MNH_LIC Copyright 2007-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!------------------------------------------------------------------------------- +! #################### + MODULE MODI_LIMA_INIT_CCN_ACTIVATION_SPECTRUM +INTERFACE + SUBROUTINE LIMA_INIT_CCN_ACTIVATION_SPECTRUM (CTYPE_CCN,XD,XSIGMA,XLIMIT_FACTOR,XK,XMU,XBETA,XKAPPA) + ! + CHARACTER(LEN=*), INTENT(IN) :: CTYPE_CCN ! Aerosol type + REAL, INTENT(IN) :: XD ! Aerosol PSD modal diameter + REAL, INTENT(IN) :: XSIGMA ! Aerosol PSD width + REAL, INTENT(OUT) :: XLIMIT_FACTOR ! C/Naer + REAL, INTENT(OUT) :: XK ! k + REAL, INTENT(OUT) :: XMU ! mu + REAL, INTENT(OUT) :: XBETA ! beta + REAL, INTENT(OUT) :: XKAPPA ! kappa +! + END SUBROUTINE LIMA_INIT_CCN_ACTIVATION_SPECTRUM +END INTERFACE +END MODULE MODI_LIMA_INIT_CCN_ACTIVATION_SPECTRUM +! #################### +! +! ############################################################# + SUBROUTINE LIMA_INIT_CCN_ACTIVATION_SPECTRUM (CTYPE_CCN,XD,XSIGMA,XLIMIT_FACTOR,XK,XMU,XBETA,XKAPPA) +! ############################################################# + +!! +!! +!! PURPOSE +!! ------- +!! +!! Compute mu, k and beta parameters of the activation spectrum based on CCN +!! characteristics (type and PSD) +!! +!! +!! AUTHOR +!! ------ +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST, ONLY : XMV, XAVOGADRO, XBOLTZ, XRHOLW +! +USE MODI_GAMMA_INC +USE MODI_HYPGEO +USE MODI_HYPSER +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +CHARACTER(LEN=*), INTENT(IN) :: CTYPE_CCN ! Aerosol type +REAL, INTENT(IN) :: XD ! Aerosol PSD modal diameter +REAL, INTENT(IN) :: XSIGMA ! Aerosol PSD width +REAL, INTENT(OUT) :: XLIMIT_FACTOR ! C/Naer +REAL, INTENT(OUT) :: XK ! k +REAL, INTENT(OUT) :: XMU ! mu +REAL, INTENT(OUT) :: XBETA ! beta +REAL, INTENT(OUT) :: XKAPPA ! kappa +! +!* 0.2 Declarations of local variables : +! +INTEGER, PARAMETER :: M = 1000 ! Number of points (S,Nccn) used to fit the spectra +INTEGER, PARAMETER :: N = 3 ! Number of parameters to adjust +REAL, DIMENSION(N) :: PARAMS ! Parameters to adjust by the LM algorithm (k, mu, beta) +REAL, DIMENSION(M) :: FVEC ! Array to store the distance between theoretical and fitted spectra +INTEGER :: IFLAG ! +INTEGER :: INFO ! +REAL :: TOL = 1.E-16 ! Fit precision required +! +INTEGER :: II, IJ ! Loop indices +! +REAL :: XW ! +REAL :: XDDRY = 0.1E-6 ! Dry diameter for which to compute Scrit +REAL :: XSCRIT ! Scrit for dry diameter XDDRY +REAL :: XMIN = 0.1E-6 ! minimum diameter for root search (m) +REAL :: XMAX = 10.E-6 ! maximum diameter for root search (m) +REAL :: XPREC = 1.E-8 ! precision wanted for root (m) +! +!REAL :: XKAPPA ! kappa coefficient +REAL, DIMENSION(M) :: XS ! saturation ratio (S=1.01 for a 1% supersaturation) +REAL, DIMENSION(M) :: XDCRIT ! critical diameters (m) for the chosen S values +REAL, DIMENSION(M) :: XNCCN ! fraction of the aerosols larger than XDCRIT (ie activable) +REAL, DIMENSION(1) :: XT ! temperature +! +! +!------------------------------------------------------------------------------- +! +!* 1. Select kappa value based on CTYPE_CCN +! --------------------------------- +! +! Kappa values are from Petters and Kreidenweis (2007), table 1. +! +SELECT CASE (CTYPE_CCN) +CASE('NH42SO4','C') ! Ammonium sulfate + XKAPPA = 0.61 +CASE('NH4NO3') ! Ammonium nitrate + XKAPPA = 0.67 +CASE('NaCl','M') ! Sea Salt + XKAPPA = 1.28 +CASE('H2SO4') ! Sulfuric acid + XKAPPA = 0.90 +CASE('NaNO3') ! Sodium nitrate + XKAPPA = 0.88 +CASE('NaHSO4') ! Sodium bisulfate + XKAPPA = 0.91 +CASE('Na2SO4') ! Sodium sulfate + XKAPPA = 0.80 +CASE('NH43HSO42') ! Letovicite (rare ammonium sulfate mineral) + XKAPPA = 0.65 +CASE('SOA') ! Secondary organic aerosol (alpha-pinene, beta-pinene) + XKAPPA = 0.1 +CASE DEFAULT + XKAPPA = 1. +END SELECT +! +!XT = (/ 270., 271., 272., 273., 274., 275., 276., 277., 278., 279., 280., 281., 282., 283., 284., 285., 286., 287., 288., 289. /) +XT = (/ 280. /) + +! +! Initialize supersaturation values (in %) +! +DO II=1, SIZE(XS) + XS(II)=EXP( LOG(10.**(-3.)) + REAL(II) / REAL(SIZE(XS)) * (LOG(10.**2.)-LOG(10.**(-3.))) ) +END DO + +DO IJ=1, SIZE(XT) +! +!* 2. Compute Nccn(s) for several supersaturation values +! -------------------------------------------------- +! +! Get the value of Scrit at Ddry=0.1 micron +! + XDDRY = XD + XMIN = XD + XMAX = XD*10. + XPREC = XD/100. + XW = 4 * 0.072 * XMV / XAVOGADRO / XBOLTZ / XT(IJ) / XRHOLW + XSCRIT = ZRIDDR(XMIN,XMAX,XPREC,XDDRY,XKAPPA,XT(IJ)) ! wet diameter at Scrit + XSCRIT = (XSCRIT**3-XDDRY**3) * EXP(XW/XSCRIT) / (XSCRIT**3-(1-XKAPPA)*XDDRY**3) ! Saturation ratio at Scrit + XSCRIT = (XSCRIT - 1.) * 100. ! Scrit (in %) +! +! Get the XDCRIT values for XS using the approx. +! ln(100*(Sw))~Dcrit^(-3/2) where Sw is in % (Sw=1 for a 1% supersaturation) +! + XW = XDDRY * XSCRIT**0.66 ! "a" factor in Ddry_crit = a*S**-0.66 + XDCRIT(:) = XW * XS(:)**(-0.66) ! Ddry_crit for each value of S +! +! Compute Nccn(S) as the incomplete integral of n(D) from 0 to Ddry_crit(S) +! + DO II=1, SIZE(XS) + XNCCN(II) = 1- ( 0.5 + SIGN(0.5,XDCRIT(II)-XD) * GAMMA_INC(0.5,(LOG(XDCRIT(II)/XD)/SQRT(2.)/LOG(XSIGMA))**2) ) + END DO +! +!------------------------------------------------------------------------------- +! +!* 3. Compute C, k, mu, beta, using the Levenberg-Marquardt algorithm +! --------------------------------------------------------------- +! + PARAMS(1:3) = (/ 1., 1., 1000. /) + IFLAG = 1 + call lmdif1 ( DISTANCE, M, N, PARAMS, FVEC, TOL, INFO ) +! + XLIMIT_FACTOR = gamma(PARAMS(2))*PARAMS(3)**(PARAMS(1)/2)/gamma(1+PARAMS(1)/2)/gamma(PARAMS(2)-PARAMS(1)/2) + XK = PARAMS(1) + XMU = PARAMS(2) + XBETA = PARAMS(3) +! +END DO ! loop on temperatures +! +!------------------------------------------------------------------------------- +! +!* 6. Functions used to compute Scrit at Ddry=0.1 micron +! -------------------------------------------------- +! +CONTAINS +! +!------------------------------------------------------------------------------ +! + FUNCTION ZRIDDR(PX1,PX2,PXACC,XDDRY,XKAPPA,XT) RESULT(PZRIDDR) +! +! +!!**** *ZRIDDR* - iterative algorithm to find root of a function +!! +!! +!! PURPOSE +!! ------- +!! The purpose of this function is to find the root of a given function +!! the arguments are the brackets bounds (the interval where to find the root) +!! the accuracy needed and the input parameters of the given function. +!! Using Ridders' method, return the root of a function known to lie between +!! PX1 and PX2. The root, returned as PZRIDDR, will be refined to an approximate +!! accuracy PXACC. +!! +!!** METHOD +!! ------ +!! Ridders' method +!! +!! EXTERNAL +!! -------- +!! FUNCSMAX +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! NUMERICAL RECIPES IN FORTRAN 77: THE ART OF SCIENTIFIC COMPUTING +!! (ISBN 0-521-43064-X) +!! Copyright (C) 1986-1992 by Cambridge University Press. +!! Programs Copyright (C) 1986-1992 by Numerical Recipes Software. +!! +!! AUTHOR +!! ------ +!! Frederick Chosson *CERFACS* +!! +!! MODIFICATIONS +!! ------------- +!! Original 12/07/07 +!! S.BERTHET 2008 vectorization +!------------------------------------------------------------------------------ +! +!* 0. DECLARATIONS +! +! +IMPLICIT NONE +! +!* 0.1 declarations of arguments and result +! +REAL, INTENT(INOUT) :: PX1, PX2, PXACC +REAL, INTENT(IN) :: XDDRY, XKAPPA, XT +REAL :: PZRIDDR +! +!* 0.2 declarations of local variables +! +! +INTEGER, PARAMETER :: MAXIT=60 +REAL, PARAMETER :: UNUSED=0.0 !-1.11e30 +REAL :: fh,fl, fm,fnew +REAL :: s,xh,xl,xm,xnew +INTEGER :: j, JL +! +PZRIDDR= 999999. +fl = DSDD(PX1,XDDRY,XKAPPA,XT) +fh = DSDD(PX2,XDDRY,XKAPPA,XT) +! +100 if ((fl > 0.0 .and. fh < 0.0) .or. (fl < 0.0 .and. fh > 0.0)) then + xl = PX1 + xh = PX2 + do j=1,MAXIT + xm = 0.5*(xl+xh) + fm = DSDD(xm,XDDRY,XKAPPA,XT) + s = sqrt(fm**2-fl*fh) + if (s == 0.0) then + GO TO 101 + endif + xnew = xm+(xm-xl)*(sign(1.0,fl-fh)*fm/s) + if (abs(xnew - PZRIDDR) <= PXACC) then + GO TO 101 + endif + PZRIDDR = xnew + fnew = DSDD(PZRIDDR,XDDRY,XKAPPA,XT) + if (fnew == 0.0) then + GO TO 101 + endif + if (sign(fm,fnew) /= fm) then + xl =xm + fl=fm + xh =PZRIDDR + fh=fnew + else if (sign(fl,fnew) /= fl) then + xh =PZRIDDR + fh=fnew + else if (sign(fh,fnew) /= fh) then + xl =PZRIDDR + fl=fnew + else if (PX2 .lt. 0.05) then + PX2 = PX2 + 1.0E-2 + PRINT*, 'PX2 ALWAYS too small, we put a greater one : PX2 =',PX2 + fh = DSDD(PX2,XDDRY,XKAPPA,XT) + go to 100 + STOP + end if + if (abs(xh-xl) <= PXACC) then + GO TO 101 + endif + end do + STOP + else if (fl == 0.0) then + PZRIDDR=PX1 + else if (fh == 0.0) then + PZRIDDR=PX2 + else if (PX2 .lt. 0.05) then + PX2 = PX2 + 1.0E-2 + PRINT*, 'PX2 too small, we put a greater one : PX2 =',PX2 + fh = DSDD(PX2,XDDRY,XKAPPA,XT) + go to 100 + else + PZRIDDR=0.0 + go to 101 + end if +! +101 END FUNCTION ZRIDDR +! +!------------------------------------------------------------------------------ +! + FUNCTION DSDD(XD,XDDRY,XKAPPA, XT) RESULT(DS) +!! +!! PURPOSE +!! ------- +!! Derivative of S(D) from Petters and Kreidenweis 2007 (eq. 6) to get Dcrit and Scrit +!! +!!** METHOD +!! ------ +!! This function is called by zriddr +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! Petters and Kreidenweis, 2007: "A single parameter representation of hygroscopic +!! growth and cloud condensation nucleus activity", +!! ACP, 7, 1961-1971 +!! +!! AUTHOR +!! ------ +!! Benoit Vie *CNRM* +!! +!! MODIFICATIONS +!! ------------- +!! Original 13/11/17 +!! +!------------------------------------------------------------------------------ +! +!* 0. DECLARATIONS +! + USE MODD_CST, ONLY : XMV, XAVOGADRO, XBOLTZ, XRHOLW +! + IMPLICIT NONE +! +!* 0.1 declarations of arguments and result +! + REAL, INTENT(IN) :: XD ! supersaturation is already in no units + REAL, INTENT(IN) :: XDDRY ! supersaturation is already in no units + REAL, INTENT(IN) :: XKAPPA ! supersaturation is already in no units + REAL, INTENT(IN) :: XT ! supersaturation is already in no units +! + REAL :: DS ! result +! +!* 0.2 declarations of local variables +! + REAL :: XA ! factor inside the exponential +! + XA = 4 * 0.072 * XMV / XAVOGADRO / XBOLTZ / XT / XRHOLW + DS = (XD**3-XDDRY**3) * (XD**3-(1-XKAPPA)*XDDRY**3) * XA - 3. * XKAPPA * XD**4 * XDDRY**3 + DS = DS * EXP(XA/XD) / (XD**3-(1-XKAPPA)*XDDRY**3)**2 +! +END FUNCTION DSDD +! +!------------------------------------------------------------------------------- +! +!* 7. Functions used to fit the CCN activation spectra with C s**k F() +! ---------------------------------------------------------------- +! + SUBROUTINE DISTANCE(M,N,X,FVEC,IFLAG) +!! +!! PURPOSE +!! ------- +!! Derivative of S(D) from Petters and Kreidenweis 2007 (eq. 6) to get Dcrit and Scrit +!! +!!** METHOD +!! ------ +!! This function is called by zriddr +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! Petters and Kreidenweis, 2007: "A single parameter representation of hygroscopic +!! growth and cloud condensation nucleus activity", +!! ACP, 7, 1961-1971 +!! +!! AUTHOR +!! ------ +!! Benoit Vie *CNRM* +!! +!! MODIFICATIONS +!! ------------- +!! Original 13/11/17 +!! +!------------------------------------------------------------------------------ +! +!* 0. DECLARATIONS +! +!* 0.1 declarations of arguments and result +! + integer M + integer N + real X(N) + real FVEC(M) + integer IFLAG +! +!* 0.2 declarations of local variables +! + integer I + real C + real ZW, ZW2 +! + ! print *, "X = ", X + IF ( ANY(X .LT.0.) .OR. X(1).gt.2*X(2)) THEN + FVEC(:) = 999999. + ELSE + C=gamma(X(2))*X(3)**(X(1)/2)/gamma(1+X(1)/2)/gamma(X(2)-X(1)/2) + DO I=1, M + ! XS in "no units", ie XS=0.01 for a 1% suersaturation + ! ZW= C * (XS(I)/100)**X(1) * HYPGEO(X(2),X(1)/2,X(1)/2+1,X(3),XS(I)/100) + ZW= C * (XS(I))**X(1) * HYPGEO(X(2),X(1)/2,X(1)/2+1,X(3),XS(I)) +!!$ IF (X(3)*(XS(I)/100)**2 .LT. 0.98) THEN +!!$ CALL HYPSER(X(2),X(1)/2,X(1)/2+1,-X(3)*(XS(I)/100)**2,ZW2) +!!$ print *, "args= ", X(2), X(1)/2, X(1)/2+1, -X(3)*(XS(I)/100)**2, " hypser = ", ZW2 +!!$ CALL HYPSER(27.288,0.82/2,0.82/2+1,-38726*(0.5/100)**2,ZW2) +!!$ print *, "args= ", 27.288, 0.82/2, 0.82/2+1, -38726*(0.5/100)**2, " hypser = ", ZW2 +!!$ END IF + ! print *, I, XS(I), C, ZW, XNCCN(I) + IF ( ZW.GT.0. .AND. XNCCN(I).GT.0.) THEN + FVEC(I) = LOG(ZW) - LOG(XNCCN(I)) + ELSE + FVEC(I) = 0. + END IF + !FVEC(I) = LOG(MAX(ZW,1.E-24)) - LOG(MAX(XNCCN(I),1.E-24)) + !FVEC(I) = ZW - XNCCN(I) + END DO + END IF +! print *, "distance : ", SUM(FVEC*FVEC) +! + END SUBROUTINE DISTANCE +! +!------------------------------------------------------------------------------ +END SUBROUTINE LIMA_INIT_CCN_ACTIVATION_SPECTRUM diff --git a/src/mesonh/micro/lima_inst_procs.f90 b/src/mesonh/micro/lima_inst_procs.f90 new file mode 100644 index 000000000..ce7a12781 --- /dev/null +++ b/src/mesonh/micro/lima_inst_procs.f90 @@ -0,0 +1,197 @@ +!MNH_LIC Copyright 2018-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!------------------------------------------------------------------------------- +! ############################### + MODULE MODI_LIMA_INST_PROCS +! ############################### +! +INTERFACE + SUBROUTINE LIMA_INST_PROCS (PTSTEP, LDCOMPUTE, & + PEXNREF, PPABST, & + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & + PCCT, PCRT, PCIT, & + PINT, & + P_CR_BRKU, & ! spontaneous break up of drops (BRKU) : Nr + P_TH_HONR, P_RR_HONR, P_CR_HONR, & ! rain drops homogeneous freezing (HONR) : rr, Nr, rg=-rr, th + P_TH_IMLT, P_RC_IMLT, P_CC_IMLT, & ! ice melting (IMLT) : rc, Nc, ri=-rc, Ni=-Nc, th, IFNF, IFNA + PB_TH, PB_RV, PB_RC, PB_RR, PB_RI, PB_RG, & + PB_CC, PB_CR, PB_CI, & + PB_IFNN, & + PCF1D, PIF1D, PPF1D ) +! +REAL, INTENT(IN) :: PTSTEP ! Time step +LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE +! +REAL, DIMENSION(:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:), INTENT(IN) :: PPABST ! abs. pressure at time t +! +REAL, DIMENSION(:), INTENT(IN) :: PTHT ! Theta at t +REAL, DIMENSION(:), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: PRIT ! Rain water m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: PRST ! Rain water m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: PRGT ! Rain water m.r. at t +! +REAL, DIMENSION(:), INTENT(IN) :: PCCT ! Cloud water conc. at t +REAL, DIMENSION(:), INTENT(IN) :: PCRT ! Rain water conc. at t +REAL, DIMENSION(:), INTENT(IN) :: PCIT ! Prinstine ice conc. at t +! +REAL, DIMENSION(:,:), INTENT(IN) :: PINT ! IFN C. activated at t +! +REAL, DIMENSION(:) , INTENT(INOUT) :: P_CR_BRKU ! Concentration change (#/kg) +REAL, DIMENSION(:) , INTENT(INOUT) :: P_TH_HONR ! +REAL, DIMENSION(:) , INTENT(INOUT) :: P_RR_HONR ! mr change (kg/kg) +REAL, DIMENSION(:) , INTENT(INOUT) :: P_CR_HONR ! Concentration change (#/kg) +REAL, DIMENSION(:) , INTENT(INOUT) :: P_TH_IMLT ! +REAL, DIMENSION(:) , INTENT(INOUT) :: P_RC_IMLT ! mr change (kg/kg) +REAL, DIMENSION(:) , INTENT(INOUT) :: P_CC_IMLT ! Concentration change (#/kg) +! +REAL, DIMENSION(:) , INTENT(INOUT) :: PB_TH ! Cumulated theta change +REAL, DIMENSION(:) , INTENT(INOUT) :: PB_RV ! Cumulated mr change (kg/kg) +REAL, DIMENSION(:) , INTENT(INOUT) :: PB_RC ! Cumulated mr change (kg/kg) +REAL, DIMENSION(:) , INTENT(INOUT) :: PB_RR ! Cumulated mr change (kg/kg) +REAL, DIMENSION(:) , INTENT(INOUT) :: PB_RI ! Cumulated mr change (kg/kg) +REAL, DIMENSION(:) , INTENT(INOUT) :: PB_RG ! Cumulated mr change (kg/kg) +! +REAL, DIMENSION(:) , INTENT(INOUT) :: PB_CC ! Cumulated concentration change (#/kg) +REAL, DIMENSION(:) , INTENT(INOUT) :: PB_CR ! Cumulated concentration change (#/kg) +REAL, DIMENSION(:) , INTENT(INOUT) :: PB_CI ! Cumulated concentration change (#/kg) +! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PB_IFNN ! Cumulated concentration change (#/kg) +! +REAL, DIMENSION(:) , INTENT(INOUT) :: PCF1D ! Liquid cloud fraction +REAL, DIMENSION(:) , INTENT(INOUT) :: PIF1D ! Ice cloud fraction +REAL, DIMENSION(:) , INTENT(INOUT) :: PPF1D ! Precipitation fraction +! + END SUBROUTINE LIMA_INST_PROCS +END INTERFACE +END MODULE MODI_LIMA_INST_PROCS +! +! +! ########################################################################### +SUBROUTINE LIMA_INST_PROCS (PTSTEP, LDCOMPUTE, & + PEXNREF, PPABST, & + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & + PCCT, PCRT, PCIT, & + PINT, & + P_CR_BRKU, & ! spontaneous break up of drops (BRKU) : Nr + P_TH_HONR, P_RR_HONR, P_CR_HONR, & ! rain drops homogeneous freezing (HONR) : rr, Nr, rg=-rr, th + P_TH_IMLT, P_RC_IMLT, P_CC_IMLT, & ! ice melting (IMLT) : rc, Nc, ri=-rc, Ni=-Nc, th, IFNF, IFNA + PB_TH, PB_RV, PB_RC, PB_RR, PB_RI, PB_RG, & + PB_CC, PB_CR, PB_CI, & + PB_IFNN, & + PCF1D, PIF1D, PPF1D ) +! ########################################################################### +! +!! PURPOSE +!! ------- +!! Compute sources of instantaneous microphysical processes for the +!! time-split version of LIMA +!! +!! AUTHOR +!! ------ +!! B. Vié * CNRM * +!! +!! MODIFICATIONS +!! ------------- +!! Original 15/03/2018 +!! +!------------------------------------------------------------------------------- +! +! +USE MODD_PARAM_LIMA, ONLY : LCOLD, LWARM, LRAIN +! +USE MODI_LIMA_DROPS_BREAK_UP +USE MODI_LIMA_DROPS_HOM_FREEZING +USE MODI_LIMA_ICE_MELTING + +IMPLICIT NONE + + + +REAL, INTENT(IN) :: PTSTEP ! Time step +LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE +! +REAL, DIMENSION(:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:), INTENT(IN) :: PPABST ! abs. pressure at time t +! +REAL, DIMENSION(:), INTENT(IN) :: PTHT ! Theta at t +REAL, DIMENSION(:), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: PRIT ! Rain water m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: PRST ! Rain water m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: PRGT ! Rain water m.r. at t +! +REAL, DIMENSION(:), INTENT(IN) :: PCCT ! Cloud water conc. at t +REAL, DIMENSION(:), INTENT(IN) :: PCRT ! Rain water conc. at t +REAL, DIMENSION(:), INTENT(IN) :: PCIT ! Prinstine ice conc. at t +! +REAL, DIMENSION(:,:), INTENT(IN) :: PINT ! IFN C. activated at t +! +REAL, DIMENSION(:) , INTENT(INOUT) :: P_CR_BRKU ! Concentration change (#/kg) +REAL, DIMENSION(:) , INTENT(INOUT) :: P_TH_HONR ! +REAL, DIMENSION(:) , INTENT(INOUT) :: P_RR_HONR ! mr change (kg/kg) +REAL, DIMENSION(:) , INTENT(INOUT) :: P_CR_HONR ! Concentration change (#/kg) +REAL, DIMENSION(:) , INTENT(INOUT) :: P_TH_IMLT ! +REAL, DIMENSION(:) , INTENT(INOUT) :: P_RC_IMLT ! mr change (kg/kg) +REAL, DIMENSION(:) , INTENT(INOUT) :: P_CC_IMLT ! Concentration change (#/kg) +! +REAL, DIMENSION(:) , INTENT(INOUT) :: PB_TH ! Cumulated theta change +REAL, DIMENSION(:) , INTENT(INOUT) :: PB_RV ! Cumulated mr change (kg/kg) +REAL, DIMENSION(:) , INTENT(INOUT) :: PB_RC ! Cumulated mr change (kg/kg) +REAL, DIMENSION(:) , INTENT(INOUT) :: PB_RR ! Cumulated mr change (kg/kg) +REAL, DIMENSION(:) , INTENT(INOUT) :: PB_RI ! Cumulated mr change (kg/kg) +REAL, DIMENSION(:) , INTENT(INOUT) :: PB_RG ! Cumulated mr change (kg/kg) +! +REAL, DIMENSION(:) , INTENT(INOUT) :: PB_CC ! Cumulated concentration change (#/kg) +REAL, DIMENSION(:) , INTENT(INOUT) :: PB_CR ! Cumulated concentration change (#/kg) +REAL, DIMENSION(:) , INTENT(INOUT) :: PB_CI ! Cumulated concentration change (#/kg) +! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PB_IFNN ! Cumulated concentration change (#/kg) +! +REAL, DIMENSION(:) , INTENT(INOUT) :: PCF1D ! Liquid cloud fraction +REAL, DIMENSION(:) , INTENT(INOUT) :: PIF1D ! Ice cloud fraction +REAL, DIMENSION(:) , INTENT(INOUT) :: PPF1D ! Precipitation fraction +! +!------------------------------------------------------------------------------- +! +IF (LWARM .AND. LRAIN) THEN + CALL LIMA_DROPS_BREAK_UP (LDCOMPUTE, & ! no dependance on CF, IF or PF + PCRT, PRRT, & + P_CR_BRKU, & + PB_CR ) +END IF +! +!------------------------------------------------------------------------------- +! +IF (LCOLD .AND. LWARM .AND. LRAIN) THEN + CALL LIMA_DROPS_HOM_FREEZING (PTSTEP, LDCOMPUTE, & ! no dependance on CF, IF or PF + PEXNREF, PPABST, & + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & + PCRT, & + P_TH_HONR, P_RR_HONR, P_CR_HONR, & + PB_TH, PB_RR, PB_CR, PB_RG ) +END IF +! +!------------------------------------------------------------------------------- +! +IF (LCOLD .AND. LWARM) THEN + CALL LIMA_ICE_MELTING (PTSTEP, LDCOMPUTE, & ! no dependance on CF, IF or PF + PEXNREF, PPABST, & ! but ice fraction becomes cloud fraction + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & ! -> where ? + PCIT, PINT, & + P_TH_IMLT, P_RC_IMLT, P_CC_IMLT, & + PB_TH, PB_RC, PB_CC, PB_RI, PB_CI, PB_IFNN) + ! + !PCF1D(:)=MAX(PCF1D(:),PIF1D(:)) + !PIF1D(:)=0. + ! +END IF +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE LIMA_INST_PROCS diff --git a/src/mesonh/micro/lima_meyers.f90 b/src/mesonh/micro/lima_meyers.f90 new file mode 100644 index 000000000..7e55e1ab7 --- /dev/null +++ b/src/mesonh/micro/lima_meyers.f90 @@ -0,0 +1,466 @@ +!MNH_LIC Copyright 2013-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ####################### + MODULE MODI_LIMA_MEYERS +! ####################### +! +INTERFACE + SUBROUTINE LIMA_MEYERS (OHHONI, PTSTEP, KMI, & + PZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, & + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, PCCT, & + PTHS, PRVS, PRCS, PRIS, & + PCCS, PCIS, PINS ) +! +LOGICAL, INTENT(IN) :: OHHONI ! enable haze freezing +REAL, INTENT(IN) :: PTSTEP ! Time step +INTEGER, INTENT(IN) :: KMI ! Model index +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRIT ! Cloud ice m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGT ! Graupel m.r. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCCT ! Cloud water C. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVS ! Water vapor m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCCS ! Cloud water C. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIS ! Ice crystal C. source +! +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PINS ! Activated ice nuclei C. source + !for DEPOSITION and CONTACT + !for IMMERSION +! +END SUBROUTINE LIMA_MEYERS +END INTERFACE +END MODULE MODI_LIMA_MEYERS +! +! ########################################################################### + SUBROUTINE LIMA_MEYERS (OHHONI, PTSTEP, KMI, & + PZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, & + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, PCCT, & + PTHS, PRVS, PRCS, PRIS, & + PCCS, PCIS, PINS ) +! ########################################################################### +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the heterogeneous nucleation +!! following Phillips (2008). +!! +!! +!!** METHOD +!! ------ +!! The parameterization of Phillips (2008) is based on observed nucleation +!! in the CFDC for a range of T and Si values. Phillips therefore defines a +!! reference activity spectrum, that is, for given T and Si values, the +!! reference concentration of primary ice crystals. +!! +!! The activation of IFN is closely related to their total surface. Thus, +!! the activable fraction of each IFN specie is determined by an integration +!! over the particle size distributions. +!! +!! Subroutine organisation : +!! +!! 1- Preliminary computations +!! 2- Check where computations are necessary, and pack variables +!! 3- Compute the saturation over water and ice +!! 4- Compute the reference activity spectrum +!! -> CALL LIMA_PHILLIPS_REF_SPECTRUM +!! Integrate over the size distributions to compute the IFN activable fraction +!! -> CALL LIMA_PHILLIPS_INTEG +!! 5- Heterogeneous nucleation of insoluble IFN +!! 6- Heterogeneous nucleation of coated IFN +!! 7- Unpack variables & deallocations +!! +!! +!! REFERENCE +!! --------- +!! +!! Phillips et al., 2008: An empirical parameterization of heterogeneous +!! ice nucleation for multiple chemical species of aerosols, J. Atmos. Sci. +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! C. Barthe * LACy * jan. 2014 add budgets +! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 +! P. Wautelet 02/2020: use the new data structures and subroutines for budgets +! P. Wautelet 02/02/2021: budgets: add missing source terms for SV budgets in LIMA +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +use modd_budget, only: lbu_enable, nbumod, & + lbudget_th, lbudget_rv, lbudget_rc, lbudget_ri, lbudget_sv, & + NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, NBUDGET_RI, NBUDGET_SV1, & + tbudgets +USE MODD_CST +USE MODD_NSV, ONLY: NSV_LIMA_NC, NSV_LIMA_NI, NSV_LIMA_IFN_NUCL +USE MODD_PARAMETERS +USE MODD_PARAM_LIMA +USE MODD_PARAM_LIMA_COLD + +use mode_budget, only: Budget_store_init, Budget_store_end +use mode_tools, only: Countjv + +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +LOGICAL, INTENT(IN) :: OHHONI ! enable haze freezing +REAL, INTENT(IN) :: PTSTEP ! Time step +INTEGER, INTENT(IN) :: KMI ! Model index +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRIT ! Cloud ice m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGT ! Graupel m.r. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCCT ! Cloud water C. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVS ! Water vapor m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCCS ! Cloud water C. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIS ! Ice crystal C. source +! +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PINS ! Activated ice nuclei C. source + !for DEPOSITION and CONTACT +! +! +!* 0.2 Declarations of local variables : +! +! +INTEGER :: IIB, IIE, IJB, IJE, IKB, IKE ! Physical domain +INTEGER :: JL ! Loop index +INTEGER :: INEGT ! Case number of nucleation +! +LOGICAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: GNEGT ! Test where to compute the nucleation +! +INTEGER, DIMENSION(SIZE(PRHODREF)) :: I1,I2,I3 ! Indexes for PACK replacement +! +REAL, DIMENSION(:), ALLOCATABLE :: ZRVT ! Water vapor m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRCT ! Cloud water m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRRT ! Rain water m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRIT ! Pristine ice m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRGT ! Graupel/hail m.r. at t +! +REAL, DIMENSION(:), ALLOCATABLE :: ZCCT ! Cloud water conc. at t +! +REAL, DIMENSION(:), ALLOCATABLE :: ZRVS ! Water vapor m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRCS ! Cloud water m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRIS ! Pristine ice m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZCCS ! Cloud water conc. source +REAL, DIMENSION(:), ALLOCATABLE :: ZCIS ! Pristine ice conc. source +! +REAL, DIMENSION(:), ALLOCATABLE :: ZTHS ! Theta source +! +REAL, DIMENSION(:,:), ALLOCATABLE :: ZINS ! Nucleated Ice nuclei conc. source + ! by Deposition/Contact +! +REAL, DIMENSION(:), ALLOCATABLE & + :: ZRHODREF, & ! RHO Dry REFerence + ZRHODJ, & ! RHO times Jacobian + ZZT, & ! Temperature + ZPRES, & ! Pressure + ZEXNREF, & ! EXNer Pressure REFerence + ZZW, & ! Work array + ZZX, & ! Work array + ZZY, & ! Work array + ZLSFACT, & ! L_s/(Pi_ref*C_ph) + ZLVFACT, & ! L_v/(Pi_ref*C_ph) + ZSSI +! +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: ZW, ZT ! work arrays +! +REAL, DIMENSION(:), ALLOCATABLE :: ZTCELSIUS +! +!------------------------------------------------------------------------------- +! +! +!* 1. PRELIMINARY COMPUTATIONS +! ------------------------ +! +! +! Physical domain +! +IIB=1+JPHEXT +IIE=SIZE(PZZ,1) - JPHEXT +IJB=1+JPHEXT +IJE=SIZE(PZZ,2) - JPHEXT +IKB=1+JPVEXT +IKE=SIZE(PZZ,3) - JPVEXT +! +! Temperature +! +ZT(:,:,:) = PTHT(:,:,:) * ( PPABST(:,:,:)/XP00 ) ** (XRD/XCPD) +! +! Saturation over ice +! +ZW(:,:,:) = EXP( XALPI - XBETAI/ZT(:,:,:) - XGAMI*ALOG(ZT(:,:,:) ) ) +ZW(:,:,:) = PRVT(:,:,:)*( PPABST(:,:,:)-ZW(:,:,:) ) / ( (XMV/XMD) * ZW(:,:,:) ) +! +! +!------------------------------------------------------------------------------- +! +! optimization by looking for locations where +! the temperature is negative only !!! +! +GNEGT(:,:,:) = .FALSE. +GNEGT(IIB:IIE,IJB:IJE,IKB:IKE) = ZT(IIB:IIE,IJB:IJE,IKB:IKE)<XTT .AND. & + ZW(IIB:IIE,IJB:IJE,IKB:IKE)>0.8 +INEGT = COUNTJV( GNEGT(:,:,:),I1(:),I2(:),I3(:)) +IF( INEGT >= 1 ) THEN + ALLOCATE(ZRVT(INEGT)) + ALLOCATE(ZRCT(INEGT)) + ALLOCATE(ZRRT(INEGT)) + ALLOCATE(ZRIT(INEGT)) + ALLOCATE(ZRST(INEGT)) + ALLOCATE(ZRGT(INEGT)) +! + ALLOCATE(ZCCT(INEGT)) +! + ALLOCATE(ZRVS(INEGT)) + ALLOCATE(ZRCS(INEGT)) + ALLOCATE(ZRIS(INEGT)) +! + ALLOCATE(ZTHS(INEGT)) +! + ALLOCATE(ZCCS(INEGT)) + ALLOCATE(ZINS(INEGT,1)) + ALLOCATE(ZCIS(INEGT)) +! + ALLOCATE(ZRHODREF(INEGT)) + ALLOCATE(ZZT(INEGT)) + ALLOCATE(ZPRES(INEGT)) + ALLOCATE(ZEXNREF(INEGT)) + DO JL=1,INEGT + ZRVT(JL) = PRVT(I1(JL),I2(JL),I3(JL)) + ZRCT(JL) = PRCT(I1(JL),I2(JL),I3(JL)) + ZRRT(JL) = PRRT(I1(JL),I2(JL),I3(JL)) + ZRIT(JL) = PRIT(I1(JL),I2(JL),I3(JL)) + ZRST(JL) = PRST(I1(JL),I2(JL),I3(JL)) + ZRGT(JL) = PRGT(I1(JL),I2(JL),I3(JL)) +! + ZCCT(JL) = PCCT(I1(JL),I2(JL),I3(JL)) +! + ZRVS(JL) = PRVS(I1(JL),I2(JL),I3(JL)) + ZRCS(JL) = PRCS(I1(JL),I2(JL),I3(JL)) + ZRIS(JL) = PRIS(I1(JL),I2(JL),I3(JL)) +! + ZTHS(JL) = PTHS(I1(JL),I2(JL),I3(JL)) +! + ZCCS(JL) = PCCS(I1(JL),I2(JL),I3(JL)) + ZCIS(JL) = PCIS(I1(JL),I2(JL),I3(JL)) +! + ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) + ZZT(JL) = ZT(I1(JL),I2(JL),I3(JL)) + ZPRES(JL) = PPABST(I1(JL),I2(JL),I3(JL)) + ZEXNREF(JL) = PEXNREF(I1(JL),I2(JL),I3(JL)) + ENDDO + ALLOCATE(ZZW(INEGT)) + ALLOCATE(ZZX(INEGT)) + ALLOCATE(ZZY(INEGT)) + ALLOCATE(ZLSFACT(INEGT)) + ALLOCATE(ZLVFACT(INEGT)) + ALLOCATE(ZSSI(INEGT)) + ALLOCATE(ZTCELSIUS(INEGT)) +! + ZZW(:) = ZEXNREF(:)*( XCPD+XCPV*ZRVT(:)+XCL*(ZRCT(:)+ZRRT(:)) & + +XCI*(ZRIT(:)+ZRST(:)+ZRGT(:)) ) + ZTCELSIUS(:) = MAX( ZZT(:)-XTT,-50.0 ) + ZLSFACT(:) = (XLSTT+(XCPV-XCI)*ZTCELSIUS(:))/ZZW(:) ! L_s/(Pi_ref*C_ph) + ZLVFACT(:) = (XLVTT+(XCPV-XCL)*ZTCELSIUS(:))/ZZW(:) ! L_v/(Pi_ref*C_ph) +! + ZZW(:) = EXP( XALPI - XBETAI/ZZT(:) - XGAMI*ALOG(ZZT(:)) ) ! es_i + ZSSI(:) = ZRVT(:)*(ZPRES(:)-ZZW(:))/((XMV/XMD)*ZZW(:)) - 1.0 + ! Supersaturation over ice +! +!* compute the heterogeneous nucleation by deposition: RVHNDI +! + if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'HIND', pths(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rv ) call Budget_store_init( tbudgets(NBUDGET_RV), 'HIND', prvs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), 'HIND', pris(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_sv ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'HIND', pcis(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_sv .and. nmod_ifn > 0) & + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ifn_nucl), 'HIND', pins(:, :, :, 1) * prhodj(:, :, :) ) + end if + + DO JL=1,INEGT + ZINS(JL,1) = PINS(I1(JL),I2(JL),I3(JL),1) + END DO + ZZW(:) = 0.0 + ZZX(:) = 0.0 + ZZY(:) = 0.0 +! + WHERE( ZZT(:)<XTT-5.0 .AND. ZSSI(:)>0.0 ) + ZZY(:) = XNUC_DEP*EXP( XEXSI_DEP*100.*MIN(1.,ZSSI(:))+XEX_DEP)/(PTSTEP*ZRHODREF(:)) + ZZX(:) = MAX( ZZY(:)-ZINS(:,1) , 0.0 ) + ZZW(:) = MIN( XMNU0*ZZX(:) , ZRVS(:) ) + END WHERE +! + ZINS(:,1) = ZINS(:,1) + ZZX(:) +! + ZRVS(:) = ZRVS(:) - ZZW(:) + ZRIS(:) = ZRIS(:) + ZZW(:) + ZTHS(:) = ZTHS(:) + ZZW(:) * (ZLSFACT(:)-ZLVFACT(:)) ! f(L_s*(RVHNDI)) + ZCIS(:) = ZCIS(:) + ZZX(:) +! +! +! Budget storage + if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'HIND', & + Unpack ( zths(:), mask = gnegt(:, :, :), field = pths(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rv ) call Budget_store_end( tbudgets(NBUDGET_RV), 'HIND', & + Unpack ( zrvs(:), mask = gnegt(:, :, :), field = prvs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'HIND', & + Unpack ( zris(:), mask = gnegt(:, :, :), field = pris(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_sv ) call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'HIND', & + Unpack ( zcis(:), mask = gnegt(:, :, :), field = pcis(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_sv .and. nmod_ifn > 0 ) call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ifn_nucl), 'HIND', & + Unpack ( zins(:, 1), mask = gnegt(:, :, :), field = pins(:, :, :, 1) ) * prhodj(:, :, :) ) + end if +! +!* compute the heterogeneous nucleation by contact: RVHNCI +! + if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'HINC', & + Unpack ( zths(:), mask = gnegt(:, :, :), field = pths(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'HINC', prcs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), 'HINC', & + Unpack ( zris(:), mask = gnegt(:, :, :), field = pris(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_sv ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'HINC', pccs(:, :, :) * prhodj(:, :, :) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'HINC', & + Unpack ( zcis(:), mask = gnegt(:, :, :), field = pcis(:, :, :) ) * prhodj(:, :, :) ) + if ( nmod_ifn > 0 ) & + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ifn_nucl), 'HINC', & + Unpack ( zins(:, 1), mask = gnegt(:, :, :), field = pins(:, :, :, 1) ) * prhodj(:, :, :) ) + end if + end if + + ZZW(:) = 0.0 + ZZX(:) = 0.0 + ZZY(:) = 0.0 +! + WHERE( ZZT(:)<XTT-2.0 .AND. ZCCT(:)>XCTMIN(2) .AND. ZRCT(:)>XRTMIN(2) ) + ZZY(:) = MIN( XNUC_CON * EXP( XEXTT_CON*ZTCELSIUS(:)+XEX_CON ) & + /(PTSTEP*ZRHODREF(:)) , ZCCS(:) ) + ZZX(:) = MAX( ZZY(:)-ZINS(:,1),0.0 ) + ZZW(:) = MIN( (ZRCT(:)/ZCCT(:))*ZZX(:),ZRCS(:) ) + END WHERE +! + ZINS(:,1) = ZINS(:,1) + ZZX(:) + ZW(:,:,:) = PINS(:,:,:,1) + PINS(:,:,:,1) = UNPACK( ZINS(:,1), MASK=GNEGT(:,:,:), FIELD=ZW(:,:,:) ) +! + ZRCS(:) = ZRCS(:) - ZZW(:) + ZRIS(:) = ZRIS(:) + ZZW(:) + ZTHS(:) = ZTHS(:) + ZZW(:)*(ZLSFACT(:)-ZLVFACT(:)) ! f(L_s*(RVHNCI)) + ZCCS(:) = ZCCS(:) - ZZX(:) + ZCIS(:) = ZCIS(:) + ZZX(:) +! +!* unpack variables +! + ZW(:,:,:) = PRVS(:,:,:) + PRVS(:,:,:) = UNPACK( ZRVS(:),MASK=GNEGT(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PRCS(:,:,:) + PRCS(:,:,:) = UNPACK( ZRCS(:),MASK=GNEGT(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PRIS(:,:,:) + PRIS(:,:,:) = UNPACK( ZRIS(:),MASK=GNEGT(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PTHS(:,:,:) + PTHS(:,:,:) = UNPACK( ZTHS(:),MASK=GNEGT(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PCCS(:,:,:) + PCCS(:,:,:) = UNPACK( ZCCS(:),MASK=GNEGT(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PCIS(:,:,:) + PCIS(:,:,:) = UNPACK( ZCIS(:),MASK=GNEGT(:,:,:),FIELD=ZW(:,:,:) ) +! +! Budget storage + if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'HINC', pths(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'HINC', prcs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'HINC', pris(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_sv ) then + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'HINC', pccs(:, :, :) * prhodj(:, :, :) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'HINC', pcis(:, :, :) * prhodj(:, :, :) ) + if ( nmod_ifn > 0 ) & + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ifn_nucl), 'HINC', pins(:, :, :, 1) * prhodj(:, :, :) ) + end if + end if + + DEALLOCATE(ZRVT) + DEALLOCATE(ZRCT) + DEALLOCATE(ZRRT) + DEALLOCATE(ZRIT) + DEALLOCATE(ZRST) + DEALLOCATE(ZRGT) +! + DEALLOCATE(ZCCT) +! + DEALLOCATE(ZRVS) + DEALLOCATE(ZRCS) + DEALLOCATE(ZRIS) +! + DEALLOCATE(ZTHS) +! + DEALLOCATE(ZCCS) + DEALLOCATE(ZINS) + DEALLOCATE(ZCIS) +! + DEALLOCATE(ZRHODREF) + DEALLOCATE(ZZT) + DEALLOCATE(ZTCELSIUS) + DEALLOCATE(ZPRES) + DEALLOCATE(ZEXNREF) + DEALLOCATE(ZSSI) + DEALLOCATE(ZZW) + DEALLOCATE(ZZX) + DEALLOCATE(ZZY) + DEALLOCATE(ZLSFACT) + DEALLOCATE(ZLVFACT) +! +END IF +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE LIMA_MEYERS diff --git a/src/mesonh/micro/lima_meyers_nucleation.f90 b/src/mesonh/micro/lima_meyers_nucleation.f90 new file mode 100644 index 000000000..f0c38fd6a --- /dev/null +++ b/src/mesonh/micro/lima_meyers_nucleation.f90 @@ -0,0 +1,348 @@ +!MNH_LIC Copyright 2018-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ################################## + MODULE MODI_LIMA_MEYERS_NUCLEATION +! ################################## +! +INTERFACE + SUBROUTINE LIMA_MEYERS_NUCLEATION (PTSTEP, & + PRHODREF, PEXNREF, PPABST, & + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & + PCCT, PCIT, PINT, & + P_TH_HIND, P_RI_HIND, P_CI_HIND, & + P_TH_HINC, P_RC_HINC, P_CC_HINC, & + PICEFR ) +! +REAL, INTENT(IN) :: PTSTEP +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHT ! Theta at time t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRIT ! Cloud ice m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGT ! Graupel m.r. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCCT ! Cloud water C. at t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIT ! Ice crystal C. source +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PINT ! Activated ice nuclei C. +! +REAL, DIMENSION(:,:,:), INTENT(OUT) :: P_TH_HIND +REAL, DIMENSION(:,:,:), INTENT(OUT) :: P_RI_HIND +REAL, DIMENSION(:,:,:), INTENT(OUT) :: P_CI_HIND +REAL, DIMENSION(:,:,:), INTENT(OUT) :: P_TH_HINC +REAL, DIMENSION(:,:,:), INTENT(OUT) :: P_RC_HINC +REAL, DIMENSION(:,:,:), INTENT(OUT) :: P_CC_HINC +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PICEFR +! +END SUBROUTINE LIMA_MEYERS_NUCLEATION +END INTERFACE +END MODULE MODI_LIMA_MEYERS_NUCLEATION +! +! ############################################################################# + SUBROUTINE LIMA_MEYERS_NUCLEATION (PTSTEP, & + PRHODREF, PEXNREF, PPABST, & + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & + PCCT, PCIT, PINT, & + P_TH_HIND, P_RI_HIND, P_CI_HIND, & + P_TH_HINC, P_RC_HINC, P_CC_HINC, & + PICEFR ) +! ############################################################################# +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the heterogeneous nucleation +!! following Meyers (1992). +!! +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * CNRM * +!! +!! MODIFICATIONS +!! ------------- +!! Original 15/03/2018 +! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 +! P. Wautelet 27/02/2020: add P_TH_HINC dummy argument + change intent of *_HIND and *_HINC dummy arguments (INOUT->OUT) +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_NSV, ONLY: NSV_LIMA_NC, NSV_LIMA_NI +USE MODD_PARAMETERS +USE MODD_PARAM_LIMA +USE MODD_PARAM_LIMA_COLD + +use mode_tools, only: Countjv + +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +REAL, INTENT(IN) :: PTSTEP +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHT ! Theta at time t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRIT ! Cloud ice m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGT ! Graupel m.r. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCCT ! Cloud water C. at t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIT ! Ice crystal C. source +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PINT ! Activated ice nuclei C. +! +REAL, DIMENSION(:,:,:), INTENT(OUT) :: P_TH_HIND +REAL, DIMENSION(:,:,:), INTENT(OUT) :: P_RI_HIND +REAL, DIMENSION(:,:,:), INTENT(OUT) :: P_CI_HIND +REAL, DIMENSION(:,:,:), INTENT(OUT) :: P_TH_HINC +REAL, DIMENSION(:,:,:), INTENT(OUT) :: P_RC_HINC +REAL, DIMENSION(:,:,:), INTENT(OUT) :: P_CC_HINC +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PICEFR +! +! +!* 0.2 Declarations of local variables : +! +! +INTEGER :: IIB, IIE, IJB, IJE, IKB, IKE ! Physical domain +INTEGER :: JL ! Loop index +INTEGER :: INEGT ! Case number of nucleation +! +LOGICAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: GNEGT ! Test where to compute the nucleation +! +INTEGER, DIMENSION(SIZE(PRHODREF)) :: I1,I2,I3 ! Indexes for PACK replacement +! +REAL, DIMENSION(:), ALLOCATABLE :: ZRVT ! Water vapor m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRCT ! Cloud water m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRRT ! Rain water m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRIT ! Pristine ice m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRGT ! Graupel/hail m.r. at t +! +REAL, DIMENSION(:), ALLOCATABLE :: ZCCT ! Cloud water conc. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZCIT ! Pristine ice conc. source +! +REAL, DIMENSION(:), ALLOCATABLE :: ZTHT ! Theta source +! +REAL, DIMENSION(:,:), ALLOCATABLE :: ZINT ! Nucleated Ice nuclei conc. source + ! by Deposition/Contact +! +REAL, DIMENSION(:), ALLOCATABLE & + :: ZRHODREF, & ! RHO Dry REFerence + ZZT, & ! Temperature + ZPRES, & ! Pressure + ZEXNREF, & ! EXNer Pressure REFerence + ZZW, & ! Work array + ZZX, & ! Work array + ZZY, & ! Work array + ZLSFACT, & ! L_s/(Pi_ref*C_ph) + ZLVFACT, & ! L_v/(Pi_ref*C_ph) + ZSSI +! +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: ZW, ZT ! work arrays +! +REAL, DIMENSION(:), ALLOCATABLE :: ZTCELSIUS +! +!------------------------------------------------------------------------------- +! +! +!* 1. PRELIMINARY COMPUTATIONS +! ------------------------ +! +P_TH_HIND(:,:,:) = 0. +P_RI_HIND(:,:,:) = 0. +P_CI_HIND(:,:,:) = 0. +P_TH_HINC(:,:,:) = 0. +P_RC_HINC(:,:,:) = 0. +P_CC_HINC(:,:,:) = 0. +! +! Physical domain +! +IIB=1+JPHEXT +IIE=SIZE(PTHT,1) - JPHEXT +IJB=1+JPHEXT +IJE=SIZE(PTHT,2) - JPHEXT +IKB=1+JPVEXT +IKE=SIZE(PTHT,3) - JPVEXT +! +! Temperature +! +ZT(:,:,:) = PTHT(:,:,:) * ( PPABST(:,:,:)/XP00 ) ** (XRD/XCPD) +! +! Saturation over ice +! +ZW(:,:,:) = EXP( XALPI - XBETAI/ZT(:,:,:) - XGAMI*ALOG(ZT(:,:,:) ) ) +ZW(:,:,:) = PRVT(:,:,:)*( PPABST(:,:,:)-ZW(:,:,:) ) / ( (XMV/XMD) * ZW(:,:,:) ) +! +! +!------------------------------------------------------------------------------- +! +! optimization by looking for locations where +! the temperature is negative only !!! +! +GNEGT(:,:,:) = .FALSE. +GNEGT(IIB:IIE,IJB:IJE,IKB:IKE) = ZT(IIB:IIE,IJB:IJE,IKB:IKE)<XTT .AND. & + ZW(IIB:IIE,IJB:IJE,IKB:IKE)>0.8 +INEGT = COUNTJV( GNEGT(:,:,:),I1(:),I2(:),I3(:)) +IF( INEGT >= 1 ) THEN + ALLOCATE(ZRVT(INEGT)) + ALLOCATE(ZRCT(INEGT)) + ALLOCATE(ZRRT(INEGT)) + ALLOCATE(ZRIT(INEGT)) + ALLOCATE(ZRST(INEGT)) + ALLOCATE(ZRGT(INEGT)) +! + ALLOCATE(ZTHT(INEGT)) +! + ALLOCATE(ZCCT(INEGT)) + ALLOCATE(ZINT(INEGT,1)) + ALLOCATE(ZCIT(INEGT)) +! + ALLOCATE(ZRHODREF(INEGT)) + ALLOCATE(ZZT(INEGT)) + ALLOCATE(ZPRES(INEGT)) + ALLOCATE(ZEXNREF(INEGT)) + DO JL=1,INEGT + ZRVT(JL) = PRVT(I1(JL),I2(JL),I3(JL)) + ZRCT(JL) = PRCT(I1(JL),I2(JL),I3(JL)) + ZRRT(JL) = PRRT(I1(JL),I2(JL),I3(JL)) + ZRIT(JL) = PRIT(I1(JL),I2(JL),I3(JL)) + ZRST(JL) = PRST(I1(JL),I2(JL),I3(JL)) + ZRGT(JL) = PRGT(I1(JL),I2(JL),I3(JL)) +! + ZCCT(JL) = PCCT(I1(JL),I2(JL),I3(JL)) +! + ZTHT(JL) = PTHT(I1(JL),I2(JL),I3(JL)) +! + ZCCT(JL) = PCCT(I1(JL),I2(JL),I3(JL)) + ZCIT(JL) = PCIT(I1(JL),I2(JL),I3(JL)) +! + ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) + ZZT(JL) = ZT(I1(JL),I2(JL),I3(JL)) + ZPRES(JL) = PPABST(I1(JL),I2(JL),I3(JL)) + ZEXNREF(JL) = PEXNREF(I1(JL),I2(JL),I3(JL)) + ENDDO + ALLOCATE(ZZW(INEGT)) + ALLOCATE(ZZX(INEGT)) + ALLOCATE(ZZY(INEGT)) + ALLOCATE(ZLSFACT(INEGT)) + ALLOCATE(ZLVFACT(INEGT)) + ALLOCATE(ZSSI(INEGT)) + ALLOCATE(ZTCELSIUS(INEGT)) +! + ZZW(:) = ZEXNREF(:)*( XCPD+XCPV*ZRVT(:)+XCL*(ZRCT(:)+ZRRT(:)) & + +XCI*(ZRIT(:)+ZRST(:)+ZRGT(:)) ) + ZTCELSIUS(:) = MAX( ZZT(:)-XTT,-50.0 ) + ZLSFACT(:) = (XLSTT+(XCPV-XCI)*ZTCELSIUS(:))/ZZW(:) ! L_s/(Pi_ref*C_ph) + ZLVFACT(:) = (XLVTT+(XCPV-XCL)*ZTCELSIUS(:))/ZZW(:) ! L_v/(Pi_ref*C_ph) +! + ZZW(:) = EXP( XALPI - XBETAI/ZZT(:) - XGAMI*ALOG(ZZT(:)) ) ! es_i + ZSSI(:) = ZRVT(:)*(ZPRES(:)-ZZW(:))/((XMV/XMD)*ZZW(:)) - 1.0 + ! Supersaturation over ice +! +!--------------------------------------------------------------------------- +! +!* compute the heterogeneous nucleation by deposition: RVHNDI +! + DO JL=1,INEGT + ZINT(JL,1) = PINT(I1(JL),I2(JL),I3(JL),1) + END DO + ZZW(:) = 0.0 + ZZX(:) = 0.0 + ZZY(:) = 0.0 +! + WHERE( ZZT(:)<XTT-5.0 .AND. ZSSI(:)>0.0 ) + ZZY(:) = XNUC_DEP*EXP( XEXSI_DEP*100.*MIN(1.,ZSSI(:))+XEX_DEP)/ZRHODREF(:) + ZZX(:) = MAX( ZZY(:)-ZINT(:,1) , 0.0 ) ! number of ice crystals formed at this time step #/kg + ZZW(:) = MIN( XMNU0*ZZX(:) , ZRVT(:) ) ! mass of ice formed at this time step (kg/kg) + END WHERE + ! + P_CI_HIND(:,:,:) = UNPACK( ZZX(:), MASK=GNEGT(:,:,:), FIELD=0. ) + P_RI_HIND(:,:,:) = UNPACK( ZZW(:), MASK=GNEGT(:,:,:), FIELD=0. ) + P_TH_HIND(:,:,:) = UNPACK( ZZW(:)*(ZLSFACT(:)-ZLVFACT(:)), MASK=GNEGT(:,:,:), FIELD=0. ) + PTHT(:,:,:) = PTHT(:,:,:) + P_TH_HIND(:,:,:) + PRVT(:,:,:) = PRVT(:,:,:) - P_RI_HIND(:,:,:) + PRIT(:,:,:) = PRIT(:,:,:) + P_RI_HIND(:,:,:) + PCIT(:,:,:) = PCIT(:,:,:) + P_CI_HIND(:,:,:) + PINT(:,:,:,1) = PINT(:,:,:,1) + P_CI_HIND(:,:,:) +! +!--------------------------------------------------------------------------- +! +!* compute the heterogeneous nucleation by contact: RVHNCI +! +! + DO JL=1,INEGT + ZINT(JL,1) = PINT(I1(JL),I2(JL),I3(JL),1) + END DO + ZZW(:) = 0.0 + ZZX(:) = 0.0 + ZZY(:) = 0.0 +! + WHERE( ZZT(:)<XTT-2.0 .AND. ZCCT(:)>XCTMIN(2) .AND. ZRCT(:)>XRTMIN(2) ) + ZZY(:) = MIN( XNUC_CON * EXP( XEXTT_CON*ZTCELSIUS(:)+XEX_CON ) & + /ZRHODREF(:) , ZCCT(:) ) + ZZX(:) = MAX( ZZY(:)-ZINT(:,1),0.0 ) + ZZW(:) = MIN( (ZRCT(:)/ZCCT(:))*ZZX(:),ZRCT(:) ) + END WHERE +! + P_RC_HINC(:,:,:) = - UNPACK( ZZW(:), MASK=GNEGT(:,:,:), FIELD=0. ) + P_CC_HINC(:,:,:) = - UNPACK( ZZX(:), MASK=GNEGT(:,:,:), FIELD=0. ) + P_TH_HINC(:,:,:) = UNPACK( ZZW(:)*(ZLSFACT(:)-ZLVFACT(:)), MASK=GNEGT(:,:,:), FIELD=0. ) + PTHT(:,:,:) = PTHT(:,:,:) + P_TH_HINC(:,:,:) + PRCT(:,:,:) = PRCT(:,:,:) + P_RC_HINC(:,:,:) + PRIT(:,:,:) = PRIT(:,:,:) - P_RC_HINC(:,:,:) + PCCT(:,:,:) = PCCT(:,:,:) + P_CC_HINC(:,:,:) + PCIT(:,:,:) = PCIT(:,:,:) - P_CC_HINC(:,:,:) + PINT(:,:,:,1) = PINT(:,:,:,1) - P_CC_HINC(:,:,:) +! + DEALLOCATE(ZRVT) + DEALLOCATE(ZRCT) + DEALLOCATE(ZRRT) + DEALLOCATE(ZRIT) + DEALLOCATE(ZRST) + DEALLOCATE(ZRGT) +! + DEALLOCATE(ZTHT) +! + DEALLOCATE(ZCCT) + DEALLOCATE(ZINT) + DEALLOCATE(ZCIT) +! + DEALLOCATE(ZRHODREF) + DEALLOCATE(ZZT) + DEALLOCATE(ZTCELSIUS) + DEALLOCATE(ZPRES) + DEALLOCATE(ZEXNREF) + DEALLOCATE(ZSSI) + DEALLOCATE(ZZW) + DEALLOCATE(ZZX) + DEALLOCATE(ZZY) + DEALLOCATE(ZLSFACT) + DEALLOCATE(ZLVFACT) +! +END IF +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE LIMA_MEYERS_NUCLEATION diff --git a/src/mesonh/micro/lima_mixed.f90 b/src/mesonh/micro/lima_mixed.f90 new file mode 100644 index 000000000..49024b7b5 --- /dev/null +++ b/src/mesonh/micro/lima_mixed.f90 @@ -0,0 +1,643 @@ +!MNH_LIC Copyright 2013-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ###################### + MODULE MODI_LIMA_MIXED +! ###################### +! +INTERFACE + SUBROUTINE LIMA_MIXED (OSEDI, OHHONI, KSPLITG, PTSTEP, KMI, & + KRR, PZZ, PRHODJ, & + PRHODREF, PEXNREF, PPABST, PW_NU, & + PTHM, PPABSM, & + PTHT, PRT, PSVT, & + PTHS, PRS, PSVS) +! +USE MODD_NSV, only: NSV_LIMA_BEG +! +LOGICAL, INTENT(IN) :: OSEDI ! switch to activate the + ! cloud ice sedimentation +LOGICAL, INTENT(IN) :: OHHONI ! enable haze freezing +INTEGER, INTENT(IN) :: KSPLITG ! Number of small time step + ! integration for ice sedimendation +REAL, INTENT(IN) :: PTSTEP ! Time step +INTEGER, INTENT(IN) :: KMI ! Model index +! +INTEGER, INTENT(IN) :: KRR ! Number of moist variables +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PW_NU ! updraft velocity used for + ! the nucleation param. +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHM ! Theta at time t-dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! abs. pressure at time t-dt +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! m.r. at t +REAL, DIMENSION(:,:,:,NSV_LIMA_BEG:), INTENT(IN) :: PSVT ! Concentrations at time t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRS ! m.r. source +REAL, DIMENSION(:,:,:,NSV_LIMA_BEG:), INTENT(INOUT) :: PSVS ! Concentration sources +! +END SUBROUTINE LIMA_MIXED +END INTERFACE +END MODULE MODI_LIMA_MIXED +! +! ####################################################################### + SUBROUTINE LIMA_MIXED (OSEDI, OHHONI, KSPLITG, PTSTEP, KMI, & + KRR, PZZ, PRHODJ, & + PRHODREF, PEXNREF, PPABST, PW_NU, & + PTHM, PPABSM, & + PTHT, PRT, PSVT, & + PTHS, PRS, PSVS ) +! ####################################################################### +! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the mixed-phase +!! microphysical processes +!! +!! +!!** METHOD +!! ------ +!! +!! REFERENCE +!! --------- +!! +!! Most of the parameterizations come from the ICE3 scheme, described in +!! the MESO-NH scientific documentation. +!! +!! Cohard, J.-M. and J.-P. Pinty, 2000: A comprehensive two-moment warm +!! microphysical bulk scheme. +!! Part I: Description and tests +!! Part II: 2D experiments with a non-hydrostatic model +!! Accepted for publication in Quart. J. Roy. Meteor. Soc. +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! C. Barthe * LACy * jan. 2014 add budgets +! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 03/2020: use the new data structures and subroutines for budgets (no more call to budget in this subroutine) +! P. Wautelet 28/05/2020: bugfix: correct array start for PSVT and PSVS +! P. Wautelet 02/02/2021: budgets: add missing source terms for SV budgets in LIMA +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +use modd_budget, only: lbu_enable, nbumod +USE MODD_CST, ONLY: XP00, XRD, XRV, XMV, XMD, XCPD, XCPV, & + XCL, XCI, XTT, XLSTT, XLVTT, & + XALPI, XBETAI, XGAMI +USE MODD_NSV +USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT +USE MODD_PARAM_LIMA, ONLY: NMOD_IFN, XRTMIN, XCTMIN, LWARM, LCOLD, & + NMOD_CCN, NMOD_IMM, LRAIN, LSNOW, LHAIL +USE MODD_PARAM_LIMA_WARM, ONLY: XLBC, XLBEXC, XLBR, XLBEXR +USE MODD_PARAM_LIMA_COLD, ONLY: XLBI, XLBEXI, XLBS, XLBEXS, XSCFAC +USE MODD_PARAM_LIMA_MIXED, ONLY: XLBG, XLBEXG, XLBH, XLBEXH + +use mode_tools, only: Countjv + +USE MODI_LIMA_MIXED_FAST_PROCESSES +USE MODI_LIMA_MIXED_SLOW_PROCESSES + +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +LOGICAL, INTENT(IN) :: OSEDI ! switch to activate the + ! cloud ice sedimentation +LOGICAL, INTENT(IN) :: OHHONI ! enable haze freezing +INTEGER, INTENT(IN) :: KSPLITG ! Number of small time step + ! integration for ice sedimendation +REAL, INTENT(IN) :: PTSTEP ! Time step +INTEGER, INTENT(IN) :: KMI ! Model index +! +INTEGER, INTENT(IN) :: KRR ! Number of moist variables +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PW_NU ! updraft velocity used for + ! the nucleation param. +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHM ! Theta at time t-dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! abs. pressure at time t-dt +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! m.r. at t +REAL, DIMENSION(:,:,:,NSV_LIMA_BEG:), INTENT(IN) :: PSVT ! Concentrations at time t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRS ! m.r. source +REAL, DIMENSION(:,:,:,NSV_LIMA_BEG:), INTENT(INOUT) :: PSVS ! Concentration sources +! +!* 0.2 Declarations of local variables : +! +!3D microphysical variables +REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) & + :: PRVT, & ! Water vapor m.r. at t + PRCT, & ! Cloud water m.r. at t + PRRT, & ! Rain water m.r. at t + PRIT, & ! Cloud ice m.r. at t + PRST, & ! Snow/aggregate m.r. at t + PRGT, & ! Graupel m.r. at t + PRHT, & ! Hail m.r. at t + ! + PRVS, & ! Water vapor m.r. source + PRCS, & ! Cloud water m.r. source + PRRS, & ! Rain water m.r. source + PRIS, & ! Pristine ice m.r. source + PRSS, & ! Snow/aggregate m.r. source + PRGS, & ! Graupel m.r. source + PRHS, & ! Hail m.r. source + ! + PCCT, & ! Cloud water C. at t + PCRT, & ! Rain water C. at t + PCIT, & ! Ice crystal C. at t + ! + PCCS, & ! Cloud water C. source + PCRS, & ! Rain water C. source + PCIS ! Ice crystal C. source +! +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: PIFS ! Free ice nuclei C. source + !for DEPOSITION and CONTACT +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: PINS ! Activated ice nuclei C. source + !for DEPOSITION and CONTACT +! +! Replace PACK +LOGICAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) :: GMICRO +INTEGER :: IMICRO +INTEGER , DIMENSION(SIZE(GMICRO)) :: I1,I2,I3 ! Used to replace the COUNT +INTEGER :: JL ! and PACK intrinsics +! +! Packed microphysical variables +REAL, DIMENSION(:), ALLOCATABLE :: ZRVT ! Water vapor m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRCT ! Cloud water m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRRT ! Rain water m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRIT ! Pristine ice m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRGT ! Graupel m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRHT ! Hail m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZCCT ! Cloud water conc. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZCRT ! Rain water conc. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZCIT ! Pristine ice conc. at t +! +REAL, DIMENSION(:), ALLOCATABLE :: ZRVS ! Water vapor m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRCS ! Cloud water m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRRS ! Rain water m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRIS ! Pristine ice m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRSS ! Snow/aggregate m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRGS ! Graupel m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRHS ! Hail m.r. source +! +REAL, DIMENSION(:), ALLOCATABLE :: ZTHS ! Theta source +! +REAL, DIMENSION(:), ALLOCATABLE :: ZCCS ! Cloud water conc. source +REAL, DIMENSION(:), ALLOCATABLE :: ZCRS ! Rain water conc. source +REAL, DIMENSION(:), ALLOCATABLE :: ZCIS ! Pristine ice conc. source +! +REAL, DIMENSION(:,:), ALLOCATABLE :: ZIFS ! Free Ice nuclei conc. source +REAL, DIMENSION(:,:), ALLOCATABLE :: ZINS ! Nucleated Ice nuclei conc. source +! +! Other packed variables +REAL, DIMENSION(:), ALLOCATABLE & + :: ZRHODREF, & ! RHO Dry REFerence + ZRHODJ, & ! RHO times Jacobian + ZZT, & ! Temperature + ZPRES, & ! Pressure + ZEXNREF, & ! EXNer Pressure REFerence + ZZW, & ! Work array + ZLSFACT, & ! L_s/(Pi_ref*C_ph) + ZLVFACT, & ! L_v/(Pi_ref*C_ph) + ZSSI, & ! Supersaturation over ice + ZLBDAC, & ! Slope parameter of the cloud droplet distr. + ZLBDAR, & ! Slope parameter of the raindrop distr. + ZLBDAI, & ! Slope parameter of the ice crystal distr. + ZLBDAS, & ! Slope parameter of the aggregate distr. + ZLBDAG, & ! Slope parameter of the graupel distr. + ZLBDAH, & ! Slope parameter of the hail distr. + ZAI, & ! Thermodynamical function + ZCJ, & ! used to compute the ventilation coefficient + ZKA, & ! Thermal conductivity of the air + ZDV ! Diffusivity of water vapor in the air +! +! 3D Temperature +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) :: ZT, ZW +! +! +INTEGER :: IIB, IIE, IJB, IJE, IKB, IKE ! Physical domain +INTEGER :: JMOD_IFN ! Loop index +! +!------------------------------------------------------------------------------- +! +! +!* 0. 3D MICROPHYSCAL VARIABLES +! ------------------------- +! +! +! Prepare 3D water mixing ratios +PRVT(:,:,:) = PRT(:,:,:,1) +PRVS(:,:,:) = PRS(:,:,:,1) +! +PRCT(:,:,:) = 0. +PRCS(:,:,:) = 0. +PRRT(:,:,:) = 0. +PRRS(:,:,:) = 0. +PRIT(:,:,:) = 0. +PRIS(:,:,:) = 0. +PRST(:,:,:) = 0. +PRSS(:,:,:) = 0. +PRGT(:,:,:) = 0. +PRGS(:,:,:) = 0. +PRHT(:,:,:) = 0. +PRHS(:,:,:) = 0. +! +IF ( KRR .GE. 2 ) PRCT(:,:,:) = PRT(:,:,:,2) +IF ( KRR .GE. 2 ) PRCS(:,:,:) = PRS(:,:,:,2) +IF ( KRR .GE. 3 ) PRRT(:,:,:) = PRT(:,:,:,3) +IF ( KRR .GE. 3 ) PRRS(:,:,:) = PRS(:,:,:,3) +IF ( KRR .GE. 4 ) PRIT(:,:,:) = PRT(:,:,:,4) +IF ( KRR .GE. 4 ) PRIS(:,:,:) = PRS(:,:,:,4) +IF ( KRR .GE. 5 ) PRST(:,:,:) = PRT(:,:,:,5) +IF ( KRR .GE. 5 ) PRSS(:,:,:) = PRS(:,:,:,5) +IF ( KRR .GE. 6 ) PRGT(:,:,:) = PRT(:,:,:,6) +IF ( KRR .GE. 6 ) PRGS(:,:,:) = PRS(:,:,:,6) +IF ( KRR .GE. 7 ) PRHT(:,:,:) = PRT(:,:,:,7) +IF ( KRR .GE. 7 ) PRHS(:,:,:) = PRS(:,:,:,7) +! +! Prepare 3D number concentrations +PCCT(:,:,:) = 0. +PCRT(:,:,:) = 0. +PCIT(:,:,:) = 0. +PCCS(:,:,:) = 0. +PCRS(:,:,:) = 0. +PCIS(:,:,:) = 0. +! +IF ( LWARM ) PCCT(:,:,:) = PSVT(:,:,:,NSV_LIMA_NC) +IF ( LWARM .AND. LRAIN ) PCRT(:,:,:) = PSVT(:,:,:,NSV_LIMA_NR) +IF ( LCOLD ) PCIT(:,:,:) = PSVT(:,:,:,NSV_LIMA_NI) +! +IF ( LWARM ) PCCS(:,:,:) = PSVS(:,:,:,NSV_LIMA_NC) +IF ( LWARM .AND. LRAIN ) PCRS(:,:,:) = PSVS(:,:,:,NSV_LIMA_NR) +IF ( LCOLD ) PCIS(:,:,:) = PSVS(:,:,:,NSV_LIMA_NI) +! +IF ( NMOD_IFN .GE. 1 ) THEN + ALLOCATE( PIFS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),NMOD_IFN) ) + ALLOCATE( PINS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),NMOD_IFN) ) + PIFS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_IFN_FREE:NSV_LIMA_IFN_FREE+NMOD_IFN-1) + PINS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_IFN_NUCL:NSV_LIMA_IFN_NUCL+NMOD_IFN-1) +ELSE + ALLOCATE( PIFS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),1) ) + ALLOCATE( PINS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),1) ) + PIFS(:,:,:,:) = 0. + PINS(:,:,:,:) = 0. +END IF +! +!------------------------------------------------------------------------------- +! +! +!* 1. Pack variables, computations only where necessary +! ------------------------------------------------- +! +! Physical domain +! +IIB=1+JPHEXT +IIE=SIZE(PZZ,1) - JPHEXT +IJB=1+JPHEXT +IJE=SIZE(PZZ,2) - JPHEXT +IKB=1+JPVEXT +IKE=SIZE(PZZ,3) - JPVEXT +! +! Temperature +ZT(:,:,:) = PTHT(:,:,:) * ( PPABST(:,:,:)/XP00 ) ** (XRD/XCPD) +! +! Looking for regions where computations are necessary +GMICRO(:,:,:) = .FALSE. +GMICRO(IIB:IIE,IJB:IJE,IKB:IKE) = PRCT(IIB:IIE,IJB:IJE,IKB:IKE)>XRTMIN(2) .OR. & + PRRT(IIB:IIE,IJB:IJE,IKB:IKE)>XRTMIN(3) .OR. & + PRIT(IIB:IIE,IJB:IJE,IKB:IKE)>XRTMIN(4) .OR. & + PRST(IIB:IIE,IJB:IJE,IKB:IKE)>XRTMIN(5) .OR. & + PRGT(IIB:IIE,IJB:IJE,IKB:IKE)>XRTMIN(6) .OR. & + PRHT(IIB:IIE,IJB:IJE,IKB:IKE)>XRTMIN(7) +! +IMICRO = COUNTJV( GMICRO(:,:,:),I1(:),I2(:),I3(:)) +! +IF( IMICRO >= 1 ) THEN +! + ALLOCATE(ZRVT(IMICRO)) + ALLOCATE(ZRCT(IMICRO)) + ALLOCATE(ZRRT(IMICRO)) + ALLOCATE(ZRIT(IMICRO)) + ALLOCATE(ZRST(IMICRO)) + ALLOCATE(ZRGT(IMICRO)) + ALLOCATE(ZRHT(IMICRO)) + ! + ALLOCATE(ZCCT(IMICRO)) + ALLOCATE(ZCRT(IMICRO)) + ALLOCATE(ZCIT(IMICRO)) + ! + ALLOCATE(ZRVS(IMICRO)) + ALLOCATE(ZRCS(IMICRO)) + ALLOCATE(ZRRS(IMICRO)) + ALLOCATE(ZRIS(IMICRO)) + ALLOCATE(ZRSS(IMICRO)) + ALLOCATE(ZRGS(IMICRO)) + ALLOCATE(ZRHS(IMICRO)) + ALLOCATE(ZTHS(IMICRO)) + ! + ALLOCATE(ZCCS(IMICRO)) + ALLOCATE(ZCRS(IMICRO)) + ALLOCATE(ZCIS(IMICRO)) + ALLOCATE(ZIFS(IMICRO,NMOD_IFN)) + ALLOCATE(ZINS(IMICRO,NMOD_IFN)) + ! + ALLOCATE(ZRHODREF(IMICRO)) + ALLOCATE(ZZT(IMICRO)) + ALLOCATE(ZPRES(IMICRO)) + ALLOCATE(ZEXNREF(IMICRO)) + DO JL=1,IMICRO + ZRVT(JL) = PRVT(I1(JL),I2(JL),I3(JL)) + ZRCT(JL) = PRCT(I1(JL),I2(JL),I3(JL)) + ZRRT(JL) = PRRT(I1(JL),I2(JL),I3(JL)) + ZRIT(JL) = PRIT(I1(JL),I2(JL),I3(JL)) + ZRST(JL) = PRST(I1(JL),I2(JL),I3(JL)) + ZRGT(JL) = PRGT(I1(JL),I2(JL),I3(JL)) + ZRHT(JL) = PRHT(I1(JL),I2(JL),I3(JL)) + ! + ZCCT(JL) = PCCT(I1(JL),I2(JL),I3(JL)) + ZCRT(JL) = PCRT(I1(JL),I2(JL),I3(JL)) + ZCIT(JL) = PCIT(I1(JL),I2(JL),I3(JL)) + ! + ZRVS(JL) = PRVS(I1(JL),I2(JL),I3(JL)) + ZRCS(JL) = PRCS(I1(JL),I2(JL),I3(JL)) + ZRRS(JL) = PRRS(I1(JL),I2(JL),I3(JL)) + ZRIS(JL) = PRIS(I1(JL),I2(JL),I3(JL)) + ZRSS(JL) = PRSS(I1(JL),I2(JL),I3(JL)) + ZRGS(JL) = PRGS(I1(JL),I2(JL),I3(JL)) + ZRHS(JL) = PRHS(I1(JL),I2(JL),I3(JL)) + ZTHS(JL) = PTHS(I1(JL),I2(JL),I3(JL)) + ! + ZCCS(JL) = PCCS(I1(JL),I2(JL),I3(JL)) + ZCRS(JL) = PCRS(I1(JL),I2(JL),I3(JL)) + ZCIS(JL) = PCIS(I1(JL),I2(JL),I3(JL)) + DO JMOD_IFN = 1, NMOD_IFN + ZIFS(JL,JMOD_IFN) = PIFS(I1(JL),I2(JL),I3(JL),JMOD_IFN) + ZINS(JL,JMOD_IFN) = PINS(I1(JL),I2(JL),I3(JL),JMOD_IFN) + ENDDO + ! + ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) + ZZT(JL) = ZT(I1(JL),I2(JL),I3(JL)) + ZPRES(JL) = PPABST(I1(JL),I2(JL),I3(JL)) + ZEXNREF(JL) = PEXNREF(I1(JL),I2(JL),I3(JL)) + ENDDO + IF (NBUMOD==KMI .AND. LBU_ENABLE) THEN + ALLOCATE(ZRHODJ(IMICRO)) + ZRHODJ(:) = PACK( PRHODJ(:,:,:),MASK=GMICRO(:,:,:) ) + END IF +! +! Atmospheric parameters +! + ALLOCATE(ZZW(IMICRO)) + ALLOCATE(ZLSFACT(IMICRO)) + ALLOCATE(ZLVFACT(IMICRO)) + ALLOCATE(ZSSI(IMICRO)) + ALLOCATE(ZAI(IMICRO)) + ALLOCATE(ZCJ(IMICRO)) + ALLOCATE(ZKA(IMICRO)) + ALLOCATE(ZDV(IMICRO)) +! + ZZW(:) = ZEXNREF(:)*( XCPD+XCPV*ZRVT(:)+XCL*(ZRCT(:)+ZRRT(:)) & + +XCI*(ZRIT(:)+ZRST(:)+ZRGT(:)) ) +! + ZLSFACT(:) = (XLSTT+(XCPV-XCI)*(ZZT(:)-XTT))/ZZW(:) ! L_s/(Pi_ref*C_ph) + ZLVFACT(:) = (XLVTT+(XCPV-XCL)*(ZZT(:)-XTT))/ZZW(:) ! L_v/(Pi_ref*C_ph) +! + ZZW(:) = EXP( XALPI - XBETAI/ZZT(:) - XGAMI*ALOG(ZZT(:) ) ) + ZSSI(:) = ZRVT(:)*( ZPRES(:)-ZZW(:) ) / ( (XMV/XMD) * ZZW(:) ) - 1.0 + ! Supersaturation over ice +! + ZKA(:) = 2.38E-2 + 0.0071E-2 * ( ZZT(:) - XTT ) ! k_a + ZDV(:) = 0.211E-4 * (ZZT(:)/XTT)**1.94 * (XP00/ZPRES(:)) ! D_v +! +! Thermodynamical function ZAI = A_i(T,P) + ZAI(:) = ( XLSTT + (XCPV-XCI)*(ZZT(:)-XTT) )**2 / (ZKA(:)*XRV*ZZT(:)**2) & + + ( XRV*ZZT(:) ) / (ZDV(:)*ZZW(:)) +! ZCJ = c^prime_j (in the ventilation factor) + ZCJ(:) = XSCFAC * ZRHODREF(:)**0.3 / SQRT( 1.718E-5+0.0049E-5*(ZZT(:)-XTT) ) +! +! +! Particle distribution parameters +! + ALLOCATE(ZLBDAC(IMICRO)) + ALLOCATE(ZLBDAR(IMICRO)) + ALLOCATE(ZLBDAI(IMICRO)) + ALLOCATE(ZLBDAS(IMICRO)) + ALLOCATE(ZLBDAG(IMICRO)) + ALLOCATE(ZLBDAH(IMICRO)) + ZLBDAC(:) = 1.E10 + WHERE (ZRCT(:)>XRTMIN(2) .AND. ZCCT(:)>XCTMIN(2)) + ZLBDAC(:) = ( XLBC*ZCCT(:) / ZRCT(:) )**XLBEXC + END WHERE + ZLBDAR(:) = 1.E10 + WHERE (ZRRT(:)>XRTMIN(3) .AND. ZCRT(:)>XCTMIN(3)) + ZLBDAR(:) = ( XLBR*ZCRT(:) / ZRRT(:) )**XLBEXR + END WHERE + ZLBDAI(:) = 1.E10 + WHERE (ZRIT(:)>XRTMIN(4) .AND. ZCIT(:)>XCTMIN(4)) + ZLBDAI(:) = ( XLBI*ZCIT(:) / ZRIT(:) )**XLBEXI + END WHERE + ZLBDAS(:) = 1.E10 + WHERE (ZRST(:)>XRTMIN(5) ) + ZLBDAS(:) = XLBS*( ZRHODREF(:)*ZRST(:) )**XLBEXS + END WHERE + ZLBDAG(:) = 1.E10 + WHERE (ZRGT(:)>XRTMIN(6) ) + ZLBDAG(:) = XLBG*( ZRHODREF(:)*ZRGT(:) )**XLBEXG + END WHERE + ZLBDAH(:) = 1.E10 + WHERE (ZRHT(:)>XRTMIN(7) ) + ZLBDAH(:) = XLBH*( ZRHODREF(:)*ZRHT(:) )**XLBEXH + END WHERE +! +!------------------------------------------------------------------------------- +! +! +!* 2. Compute the slow processes involving cloud water and graupel +! ------------------------------------------------------------ +! + CALL LIMA_MIXED_SLOW_PROCESSES(ZRHODREF, ZZT, ZSSI, PTSTEP, & + ZLSFACT, ZLVFACT, ZAI, ZCJ, & + ZRGT, ZCIT, & + ZRVS, ZRCS, ZRIS, ZRGS, ZTHS, & + ZCCS, ZCIS, ZIFS, ZINS, & + ZLBDAI, ZLBDAG, & + ZRHODJ, GMICRO, PRHODJ, KMI, & + PTHS, PRVS, PRCS, PRIS, PRGS, & + PCCS, PCIS, PINS ) +! +!------------------------------------------------------------------------------- +! +! +! 3. Compute the fast RS and RG processes +! ------------------------------------ +! +IF (LSNOW) THEN + CALL LIMA_MIXED_FAST_PROCESSES(ZRHODREF, ZZT, ZPRES, PTSTEP, & + ZLSFACT, ZLVFACT, ZKA, ZDV, ZCJ, & + ZRVT, ZRCT, ZRRT, ZRIT, ZRST, ZRGT, & + ZRHT, ZCCT, ZCRT, ZCIT, & + ZRCS, ZRRS, ZRIS, ZRSS, ZRGS, ZRHS, & + ZTHS, ZCCS, ZCRS, ZCIS, & + ZLBDAC, ZLBDAR, ZLBDAS, ZLBDAG, ZLBDAH, & + ZRHODJ, GMICRO, PRHODJ, KMI, PTHS, & + PRCS, PRRS, PRIS, PRSS, PRGS, PRHS, & + PCCS, PCRS, PCIS ) +END IF +! +!------------------------------------------------------------------------------- +! +! +! +! 4. Unpack variables +! ---------------- +! +! + ZW(:,:,:) = PRVS(:,:,:) + PRVS(:,:,:) = UNPACK( ZRVS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PRCS(:,:,:) + PRCS(:,:,:) = UNPACK( ZRCS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PRRS(:,:,:) + PRRS(:,:,:) = UNPACK( ZRRS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PRIS(:,:,:) + PRIS(:,:,:) = UNPACK( ZRIS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PRSS(:,:,:) + PRSS(:,:,:) = UNPACK( ZRSS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PRGS(:,:,:) + PRGS(:,:,:) = UNPACK( ZRGS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PRHS(:,:,:) + PRHS(:,:,:) = UNPACK( ZRHS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) +! + ZW(:,:,:) = PTHS(:,:,:) + PTHS(:,:,:) = UNPACK( ZTHS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) +! + ZW(:,:,:) = PCCS(:,:,:) + PCCS(:,:,:) = UNPACK( ZCCS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PCRS(:,:,:) + PCRS(:,:,:) = UNPACK( ZCRS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PCIS(:,:,:) + PCIS(:,:,:) = UNPACK( ZCIS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) +! + DO JMOD_IFN = 1, NMOD_IFN + ZW(:,:,:) = PIFS(:,:,:,JMOD_IFN) + PIFS(:,:,:,JMOD_IFN) = UNPACK( ZIFS(:,JMOD_IFN),MASK=GMICRO(:,:,:), & + FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PINS(:,:,:,JMOD_IFN) + PINS(:,:,:,JMOD_IFN) = UNPACK( ZINS(:,JMOD_IFN),MASK=GMICRO(:,:,:), & + FIELD=ZW(:,:,:) ) + ENDDO +! + DEALLOCATE(ZRVT) + DEALLOCATE(ZRCT) + DEALLOCATE(ZRRT) + DEALLOCATE(ZRIT) + DEALLOCATE(ZRST) + DEALLOCATE(ZRGT) + DEALLOCATE(ZRHT) +! + DEALLOCATE(ZCCT) + DEALLOCATE(ZCRT) + DEALLOCATE(ZCIT) +! + DEALLOCATE(ZRVS) + DEALLOCATE(ZRCS) + DEALLOCATE(ZRRS) + DEALLOCATE(ZRIS) + DEALLOCATE(ZRSS) + DEALLOCATE(ZRGS) + DEALLOCATE(ZRHS) + DEALLOCATE(ZTHS) +! + DEALLOCATE(ZCCS) + DEALLOCATE(ZCRS) + DEALLOCATE(ZCIS) + DEALLOCATE(ZIFS) + DEALLOCATE(ZINS) +! + DEALLOCATE(ZRHODREF) + DEALLOCATE(ZZT) + DEALLOCATE(ZPRES) + DEALLOCATE(ZEXNREF) +! + DEALLOCATE(ZZW) + DEALLOCATE(ZLSFACT) + DEALLOCATE(ZLVFACT) + DEALLOCATE(ZSSI) + DEALLOCATE(ZAI) + DEALLOCATE(ZCJ) + DEALLOCATE(ZKA) + DEALLOCATE(ZDV) +! + DEALLOCATE(ZLBDAC) + DEALLOCATE(ZLBDAR) + DEALLOCATE(ZLBDAI) + DEALLOCATE(ZLBDAS) + DEALLOCATE(ZLBDAG) + DEALLOCATE(ZLBDAH) +! + IF (NBUMOD==KMI .AND. LBU_ENABLE) DEALLOCATE(ZRHODJ) +! +END IF ! IMICRO >= 1 +! +!------------------------------------------------------------------------------ +! +! +!* 5. REPORT 3D MICROPHYSICAL VARIABLES IN PRS AND PSVS +! ------------------------------------------------- +! +PRS(:,:,:,1) = PRVS(:,:,:) +IF ( KRR .GE. 2 ) PRS(:,:,:,2) = PRCS(:,:,:) +IF ( KRR .GE. 3 ) PRS(:,:,:,3) = PRRS(:,:,:) +IF ( KRR .GE. 4 ) PRS(:,:,:,4) = PRIS(:,:,:) +IF ( KRR .GE. 5 ) PRS(:,:,:,5) = PRSS(:,:,:) +IF ( KRR .GE. 6 ) PRS(:,:,:,6) = PRGS(:,:,:) +IF ( KRR .GE. 7 ) PRS(:,:,:,7) = PRHS(:,:,:) +! +! Prepare 3D number concentrations +! +PSVS(:,:,:,NSV_LIMA_NC) = PCCS(:,:,:) +IF ( LRAIN ) PSVS(:,:,:,NSV_LIMA_NR) = PCRS(:,:,:) +PSVS(:,:,:,NSV_LIMA_NI) = PCIS(:,:,:) +! +IF ( NMOD_IFN .GE. 1 ) THEN + PSVS(:,:,:,NSV_LIMA_IFN_FREE:NSV_LIMA_IFN_FREE+NMOD_IFN-1) = PIFS(:,:,:,:) + PSVS(:,:,:,NSV_LIMA_IFN_NUCL:NSV_LIMA_IFN_NUCL+NMOD_IFN-1) = PINS(:,:,:,:) +END IF +! +!++cb++ +IF (ALLOCATED(PIFS)) DEALLOCATE(PIFS) +IF (ALLOCATED(PINS)) DEALLOCATE(PINS) +!--cb-- +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE LIMA_MIXED diff --git a/src/mesonh/micro/lima_mixed_fast_processes.f90 b/src/mesonh/micro/lima_mixed_fast_processes.f90 new file mode 100644 index 000000000..09c86c8a2 --- /dev/null +++ b/src/mesonh/micro/lima_mixed_fast_processes.f90 @@ -0,0 +1,1426 @@ +!MNH_LIC Copyright 2013-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ##################################### + MODULE MODI_LIMA_MIXED_FAST_PROCESSES +! ##################################### +! +INTERFACE + SUBROUTINE LIMA_MIXED_FAST_PROCESSES (ZRHODREF, ZZT, ZPRES, PTSTEP, & + ZLSFACT, ZLVFACT, ZKA, ZDV, ZCJ, & + ZRVT, ZRCT, ZRRT, ZRIT, ZRST, ZRGT, & + ZRHT, ZCCT, ZCRT, ZCIT, & + ZRCS, ZRRS, ZRIS, ZRSS, ZRGS, ZRHS, & + ZTHS, ZCCS, ZCRS, ZCIS, & + ZLBDAC, ZLBDAR, ZLBDAS, ZLBDAG, ZLBDAH, & + PRHODJ1D, GMICRO, PRHODJ, KMI, PTHS, & + PRCS, PRRS, PRIS, PRSS, PRGS, PRHS, & + PCCS, PCRS, PCIS ) +! +REAL, DIMENSION(:), INTENT(IN) :: ZRHODREF ! RHO Dry REFerence +REAL, DIMENSION(:), INTENT(IN) :: ZZT ! Temperature +REAL, DIMENSION(:), INTENT(IN) :: ZPRES ! Pressure +REAL, INTENT(IN) :: PTSTEP ! Time step +! +REAL, DIMENSION(:), INTENT(IN) :: ZLSFACT ! L_s/(Pi_ref*C_ph) +REAL, DIMENSION(:), INTENT(IN) :: ZLVFACT ! L_v/(Pi_ref*C_ph) +REAL, DIMENSION(:), INTENT(IN) :: ZKA ! Thermal conductivity of the air +REAL, DIMENSION(:), INTENT(IN) :: ZDV ! Diffusivity of water vapor in the air +REAL, DIMENSION(:), INTENT(IN) :: ZCJ ! Ventilation coefficient ? +! +REAL, DIMENSION(:), INTENT(IN) :: ZRVT ! Water vapor m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: ZRCT ! Cloud water m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: ZRRT ! Rain water m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: ZRIT ! Pristine ice m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: ZRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: ZRGT ! Graupel m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: ZRHT ! Hail m.r. at t +! +REAL, DIMENSION(:), INTENT(IN) :: ZCCT ! Cloud water conc. at t +REAL, DIMENSION(:), INTENT(IN) :: ZCRT ! Rain water conc. at t +REAL, DIMENSION(:), INTENT(IN) :: ZCIT ! Pristine ice conc. at t +! +REAL, DIMENSION(:), INTENT(INOUT) :: ZRCS ! Cloud water m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZRRS ! Rain water m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZRIS ! Pristine ice m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZRSS ! Snow/aggregate m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZRGS ! Graupel/hail m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZRHS ! Hail m.r. source +! +REAL, DIMENSION(:), INTENT(INOUT) :: ZTHS ! Theta source +! +REAL, DIMENSION(:), INTENT(INOUT) :: ZCCS ! Cloud water conc. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZCRS ! Rain water conc. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZCIS ! Pristine ice conc. source +! +REAL, DIMENSION(:), INTENT(IN) :: ZLBDAC ! Slope param of the cloud droplet distr. +REAL, DIMENSION(:), INTENT(IN) :: ZLBDAR ! Slope param of the raindrop distr +REAL, DIMENSION(:), INTENT(IN) :: ZLBDAS ! Slope param of the aggregate distr. +REAL, DIMENSION(:), INTENT(IN) :: ZLBDAG ! Slope param of the graupel distr. +REAL, DIMENSION(:), INTENT(IN) :: ZLBDAH ! Slope param of the hail distr. +! +! used for budget storage +REAL, DIMENSION(:), INTENT(IN) :: PRHODJ1D +LOGICAL, DIMENSION(:,:,:), INTENT(IN) :: GMICRO +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ +INTEGER, INTENT(IN) :: KMI +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRIS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRSS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCCS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCRS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIS +! +END SUBROUTINE LIMA_MIXED_FAST_PROCESSES +END INTERFACE +END MODULE MODI_LIMA_MIXED_FAST_PROCESSES +! +! ####################################################################### + SUBROUTINE LIMA_MIXED_FAST_PROCESSES (ZRHODREF, ZZT, ZPRES, PTSTEP, & + ZLSFACT, ZLVFACT, ZKA, ZDV, ZCJ, & + ZRVT, ZRCT, ZRRT, ZRIT, ZRST, ZRGT, & + ZRHT, ZCCT, ZCRT, ZCIT, & + ZRCS, ZRRS, ZRIS, ZRSS, ZRGS, ZRHS, & + ZTHS, ZCCS, ZCRS, ZCIS, & + ZLBDAC, ZLBDAR, ZLBDAS, ZLBDAG, ZLBDAH, & + PRHODJ1D, GMICRO, PRHODJ, KMI, PTHS, & + PRCS, PRRS, PRIS, PRSS, PRGS, PRHS, & + PCCS, PCRS, PCIS ) +! ####################################################################### +! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the mixed-phase +!! fast processes : +!! +!! - Fast RS processes : +!! - Cloud droplet riming of the aggregates +!! - Hallett-Mossop ice multiplication process due to snow riming +!! - Rain accretion onto the aggregates +!! - Conversion-Melting of the aggregates +!! +!! - Fast RG processes : +!! - Rain contact freezing +!! - Wet/Dry growth of the graupel +!! - Hallett-Mossop ice multiplication process due to graupel riming +!! - Melting of the graupeln +!! +!! +!!** METHOD +!! ------ +!! +!! +!! REFERENCE +!! --------- +!! +!! Most of the parameterizations come from the ICE3 scheme, described in +!! the MESO-NH scientific documentation. +!! +!! Cohard, J.-M. and J.-P. Pinty, 2000: A comprehensive two-moment warm +!! microphysical bulk scheme. +!! Part I: Description and tests +!! Part II: 2D experiments with a non-hydrostatic model +!! Accepted for publication in Quart. J. Roy. Meteor. Soc. +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! C. Barthe * LACy * jan. 2014 add budgets +! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! P. Wautelet 03/2020: use the new data structures and subroutines for budgets +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +use modd_budget, only: lbu_enable, nbumod, & + lbudget_th, lbudget_rc, lbudget_rr, lbudget_ri, lbudget_rs, lbudget_rg, lbudget_rh, lbudget_sv, & + NBUDGET_TH, NBUDGET_RC, NBUDGET_RR, NBUDGET_RI, NBUDGET_RS, NBUDGET_RG, NBUDGET_RH, NBUDGET_SV1, & + tbudgets +USE MODD_CST +USE MODD_NSV +USE MODD_PARAM_LIMA +USE MODD_PARAM_LIMA_COLD +USE MODD_PARAM_LIMA_MIXED + +use mode_budget, only: Budget_store_init, Budget_store_end + +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +REAL, DIMENSION(:), INTENT(IN) :: ZRHODREF ! RHO Dry REFerence +REAL, DIMENSION(:), INTENT(IN) :: ZZT ! Temperature +REAL, DIMENSION(:), INTENT(IN) :: ZPRES ! Pressure +REAL, INTENT(IN) :: PTSTEP ! Time step +! +REAL, DIMENSION(:), INTENT(IN) :: ZLSFACT ! L_s/(Pi_ref*C_ph) +REAL, DIMENSION(:), INTENT(IN) :: ZLVFACT ! L_v/(Pi_ref*C_ph) +REAL, DIMENSION(:), INTENT(IN) :: ZKA ! Thermal conductivity of the air +REAL, DIMENSION(:), INTENT(IN) :: ZDV ! Diffusivity of water vapor in the air +REAL, DIMENSION(:), INTENT(IN) :: ZCJ ! Ventilation coefficient ? +! +REAL, DIMENSION(:), INTENT(IN) :: ZRVT ! Water vapor m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: ZRCT ! Cloud water m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: ZRRT ! Rain water m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: ZRIT ! Pristine ice m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: ZRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: ZRGT ! Graupel/hail m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: ZRHT ! Hail m.r. at t +! +REAL, DIMENSION(:), INTENT(IN) :: ZCCT ! Cloud water conc. at t +REAL, DIMENSION(:), INTENT(IN) :: ZCRT ! Rain water conc. at t +REAL, DIMENSION(:), INTENT(IN) :: ZCIT ! Pristine ice conc. at t +! +REAL, DIMENSION(:), INTENT(INOUT) :: ZRCS ! Cloud water m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZRRS ! Rain water m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZRIS ! Pristine ice m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZRSS ! Snow/aggregate m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZRGS ! Graupel/hail m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZRHS ! Hail m.r. source +! +REAL, DIMENSION(:), INTENT(INOUT) :: ZTHS ! Theta source +! +REAL, DIMENSION(:), INTENT(INOUT) :: ZCCS ! Cloud water conc. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZCRS ! Rain water conc. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZCIS ! Pristine ice conc. source +! +REAL, DIMENSION(:), INTENT(IN) :: ZLBDAC ! Slope param of the cloud droplet distr. +REAL, DIMENSION(:), INTENT(IN) :: ZLBDAR ! Slope param of the raindrop distr +REAL, DIMENSION(:), INTENT(IN) :: ZLBDAS ! Slope param of the aggregate distr. +REAL, DIMENSION(:), INTENT(IN) :: ZLBDAG ! Slope param of the graupel distr. +REAL, DIMENSION(:), INTENT(IN) :: ZLBDAH ! Slope param of the hail distr. +! +! used for budget storage +REAL, DIMENSION(:), INTENT(IN) :: PRHODJ1D +LOGICAL, DIMENSION(:,:,:), INTENT(IN) :: GMICRO +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ +INTEGER, INTENT(IN) :: KMI +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRIS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRSS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCCS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCRS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIS + +! +!* 0.2 Declarations of local variables : +! +LOGICAL, DIMENSION(SIZE(ZZT)) :: GRIM, GACC, GDRY, GWET, GHAIL ! Test where to compute +INTEGER :: IGRIM, IGACC, IGDRY, IGWET, IHAIL +INTEGER :: JJ +INTEGER, DIMENSION(:), ALLOCATABLE :: IVEC1,IVEC2 ! Vectors of indices +REAL, DIMENSION(:), ALLOCATABLE :: ZVEC1,ZVEC2, ZVEC3 ! Work vectors +REAL, DIMENSION(SIZE(ZZT)) :: ZZW, ZZX +REAL, DIMENSION(SIZE(ZZT)) :: ZRDRYG, ZRWETG +REAL, DIMENSION(SIZE(ZZT),7) :: ZZW1 +REAL :: NHAIL +REAL :: ZTHRH, ZTHRC +! +!------------------------------------------------------------------------------- +! +! ################# +! FAST RS PROCESSES +! ################# +! +SNOW: IF (LSNOW) THEN +! +! +!* 1.1 Cloud droplet riming of the aggregates +! ------------------------------------------- +! +ZZW1(:,:) = 0.0 +! +GRIM(:) = (ZRCT(:)>XRTMIN(2)) .AND. (ZRST(:)>XRTMIN(5)) .AND. (ZRCS(:)>XRTMIN(2)/PTSTEP) .AND. (ZZT(:)<XTT) +IGRIM = COUNT( GRIM(:) ) +! +IF( IGRIM>0 ) THEN + if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'RIM', & + Unpack( zths(:), mask = gmicro(:, :, :), field = pths(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'RIM', & + Unpack( zrcs(:), mask = gmicro(:, :, :), field = prcs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rs ) call Budget_store_init( tbudgets(NBUDGET_RS), 'RIM', & + Unpack( zrss(:), mask = gmicro(:, :, :), field = prss(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rg ) call Budget_store_init( tbudgets(NBUDGET_RG), 'RIM', & + Unpack( zrgs(:), mask = gmicro(:, :, :), field = prgs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_sv ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'RIM', & + Unpack( zccs(:), mask = gmicro(:, :, :), field = pccs(:, :, :) ) * prhodj(:, :, :) ) + end if +! +! 1.1.0 allocations +! + ALLOCATE(ZVEC1(IGRIM)) + ALLOCATE(ZVEC2(IGRIM)) + ALLOCATE(IVEC1(IGRIM)) + ALLOCATE(IVEC2(IGRIM)) +! +! 1.1.1 select the ZLBDAS +! + ZVEC1(:) = PACK( ZLBDAS(:),MASK=GRIM(:) ) +! +! 1.1.2 find the next lower indice for the ZLBDAS in the geometrical +! set of Lbda_s used to tabulate some moments of the incomplete +! gamma function +! + ZVEC2(1:IGRIM) = MAX( 1.0001, MIN( REAL(NGAMINC)-0.0001, & + XRIMINTP1 * LOG( ZVEC1(1:IGRIM) ) + XRIMINTP2 ) ) + IVEC2(1:IGRIM) = INT( ZVEC2(1:IGRIM) ) + ZVEC2(1:IGRIM) = ZVEC2(1:IGRIM) - REAL( IVEC2(1:IGRIM) ) +! +! 1.1.3 perform the linear interpolation of the normalized +! "2+XDS"-moment of the incomplete gamma function +! + ZVEC1(1:IGRIM) = XGAMINC_RIM1( IVEC2(1:IGRIM)+1 )* ZVEC2(1:IGRIM) & + - XGAMINC_RIM1( IVEC2(1:IGRIM) )*(ZVEC2(1:IGRIM) - 1.0) + ZZW(:) = UNPACK( VECTOR=ZVEC1(:),MASK=GRIM,FIELD=0.0 ) +! +! 1.1.4 riming of the small sized aggregates +! + WHERE ( GRIM(:) ) + ZZW1(:,1) = MIN( ZRCS(:), & + XCRIMSS * ZZW(:) * ZRCT(:) & ! RCRIMSS + * ZLBDAS(:)**XEXCRIMSS & + * ZRHODREF(:)**(-XCEXVT) ) + ZRCS(:) = ZRCS(:) - ZZW1(:,1) + ZRSS(:) = ZRSS(:) + ZZW1(:,1) + ZTHS(:) = ZTHS(:) + ZZW1(:,1)*(ZLSFACT(:)-ZLVFACT(:)) ! f(L_f*(RCRIMSS)) +! + ZCCS(:) = MAX( ZCCS(:)-ZZW1(:,1)*(ZCCT(:)/ZRCT(:)),0.0 ) ! Lambda_c**3 + END WHERE +! +! 1.1.5 perform the linear interpolation of the normalized +! "XBS"-moment of the incomplete gamma function +! + ZVEC1(1:IGRIM) = XGAMINC_RIM2( IVEC2(1:IGRIM)+1 )* ZVEC2(1:IGRIM) & + - XGAMINC_RIM2( IVEC2(1:IGRIM) )*(ZVEC2(1:IGRIM) - 1.0) + ZZW(:) = UNPACK( VECTOR=ZVEC1(:),MASK=GRIM,FIELD=0.0 ) +! +! 1.1.6 riming-conversion of the large sized aggregates into graupeln +! +! + WHERE ( GRIM(:) .AND. (ZRSS(:)>XRTMIN(5)/PTSTEP) ) + ZZW1(:,2) = MIN( ZRCS(:), & + XCRIMSG * ZRCT(:) & ! RCRIMSG + * ZLBDAS(:)**XEXCRIMSG & + * ZRHODREF(:)**(-XCEXVT) & + - ZZW1(:,1) ) + ZZW1(:,3) = MIN( ZRSS(:), & + XSRIMCG * ZLBDAS(:)**XEXSRIMCG & ! RSRIMCG + * (1.0 - ZZW(:) )/(PTSTEP*ZRHODREF(:))) + ZRCS(:) = ZRCS(:) - ZZW1(:,2) + ZRSS(:) = ZRSS(:) - ZZW1(:,3) + ZRGS(:) = ZRGS(:) + ZZW1(:,2) + ZZW1(:,3) + ZTHS(:) = ZTHS(:) + ZZW1(:,2)*(ZLSFACT(:)-ZLVFACT(:)) ! f(L_f*(RCRIMSG)) +! + ZCCS(:) = MAX( ZCCS(:)-ZZW1(:,2)*(ZCCT(:)/ZRCT(:)),0.0 ) ! Lambda_c**3 + END WHERE + DEALLOCATE(IVEC2) + DEALLOCATE(IVEC1) + DEALLOCATE(ZVEC2) + DEALLOCATE(ZVEC1) + + ! Budget storage + if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'RIM', & + Unpack( zths(:), mask = gmicro(:, :, :), field = pths(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'RIM', & + Unpack( zrcs(:), mask = gmicro(:, :, :), field = prcs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rs ) call Budget_store_end( tbudgets(NBUDGET_RS), 'RIM', & + Unpack( zrss(:), mask = gmicro(:, :, :), field = prss(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rg ) call Budget_store_end( tbudgets(NBUDGET_RG), 'RIM', & + Unpack( zrgs(:), mask = gmicro(:, :, :), field = prgs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_sv ) call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'RIM', & + Unpack( zccs(:), mask = gmicro(:, :, :), field = pccs(:, :, :) ) * prhodj(:, :, :) ) + end if +END IF +! +!* 1.2 Hallett-Mossop ice multiplication process due to snow riming +! ----------------------------------------------------------------- +! +! +GRIM(:) = (ZZT(:)<XHMTMAX) .AND. (ZZT(:)>XHMTMIN) & + .AND. (ZRST(:)>XRTMIN(5)) .AND. (ZRCT(:)>XRTMIN(2)) +IGRIM = COUNT( GRIM(:) ) +IF( IGRIM>0 ) THEN + ! Budget storage + if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), 'HMS', & + Unpack( zris(:), mask = gmicro(:, :, :), field = pris(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rs ) call Budget_store_init( tbudgets(NBUDGET_RS), 'HMS', & + Unpack( zrss(:), mask = gmicro(:, :, :), field = prss(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_sv ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'HMS', & + Unpack( zcis(:), mask = gmicro(:, :, :), field = pcis(:, :, :) ) * prhodj(:, :, :) ) + end if + + ALLOCATE(ZVEC1(IGRIM)) + ALLOCATE(ZVEC2(IGRIM)) + ALLOCATE(IVEC2(IGRIM)) +! + ZVEC1(:) = PACK( ZLBDAC(:),MASK=GRIM(:) ) + ZVEC2(1:IGRIM) = MAX( 1.0001, MIN( REAL(NGAMINC)-0.0001, & + XHMLINTP1 * LOG( ZVEC1(1:IGRIM) ) + XHMLINTP2 ) ) + IVEC2(1:IGRIM) = INT( ZVEC2(1:IGRIM) ) + ZVEC2(1:IGRIM) = ZVEC2(1:IGRIM) - REAL( IVEC2(1:IGRIM) ) + ZVEC1(1:IGRIM) = XGAMINC_HMC( IVEC2(1:IGRIM)+1 )* ZVEC2(1:IGRIM) & + - XGAMINC_HMC( IVEC2(1:IGRIM) )*(ZVEC2(1:IGRIM) - 1.0) + ZZX(:) = UNPACK( VECTOR=ZVEC1(:),MASK=GRIM,FIELD=0.0 ) ! Large droplets +! + WHERE ( GRIM(:) .AND. ZZX(:)<0.99 ) + ZZW1(:,5) = (ZZW1(:,1)+ZZW1(:,2))*(ZCCT(:)/ZRCT(:))*(1.0-ZZX(:))* & + XHM_FACTS* & + MAX( 0.0, MIN( (ZZT(:)-XHMTMIN)/3.0,(XHMTMAX-ZZT(:))/2.0 ) ) ! CCHMSI + ZCIS(:) = ZCIS(:) + ZZW1(:,5) +! + ZZW1(:,6) = ZZW1(:,5) * XMNU0 ! RCHMSI + ZRIS(:) = ZRIS(:) + ZZW1(:,6) + ZRSS(:) = ZRSS(:) - ZZW1(:,6) + END WHERE + DEALLOCATE(IVEC2) + DEALLOCATE(ZVEC2) + DEALLOCATE(ZVEC1) + + ! Budget storage + if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'HMS', & + Unpack( zris(:), mask = gmicro(:, :, :), field = pris(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rs ) call Budget_store_end( tbudgets(NBUDGET_RS), 'HMS', & + Unpack( zrss(:), mask = gmicro(:, :, :), field = prss(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_sv ) call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'HMS', & + Unpack( zcis(:), mask = gmicro(:, :, :), field = pcis(:, :, :) ) * prhodj(:, :, :) ) + end if +END IF +! +! +!* 1.3 Rain accretion onto the aggregates +! --------------------------------------- +! +! +ZZW1(:,2:3) = 0.0 +GACC(:) = (ZRRT(:)>XRTMIN(3)) .AND. (ZRST(:)>XRTMIN(5)) .AND. (ZRRS(:)>XRTMIN(3)/PTSTEP) .AND. (ZZT(:)<XTT) +IGACC = COUNT( GACC(:) ) +! +IF( IGACC>0 .AND. LRAIN) THEN + ! Budget storage + if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'ACC', & + Unpack( zths(:), mask = gmicro(:, :, :), field = pths(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_init( tbudgets(NBUDGET_RR), 'ACC', & + Unpack( zrrs(:), mask = gmicro(:, :, :), field = prrs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rs ) call Budget_store_init( tbudgets(NBUDGET_RS), 'ACC', & + Unpack( zrss(:), mask = gmicro(:, :, :), field = prss(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rg ) call Budget_store_init( tbudgets(NBUDGET_RG), 'ACC', & + Unpack( zrgs(:), mask = gmicro(:, :, :), field = prgs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_sv ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nr), 'ACC', & + Unpack( zcrs(:), mask = gmicro(:, :, :), field = pcrs(:, :, :) ) * prhodj(:, :, :) ) + end if +! +! 1.3.0 allocations +! + ALLOCATE(ZVEC1(IGACC)) + ALLOCATE(ZVEC2(IGACC)) + ALLOCATE(ZVEC3(IGACC)) + ALLOCATE(IVEC1(IGACC)) + ALLOCATE(IVEC2(IGACC)) +! +! 1.3.1 select the (ZLBDAS,ZLBDAR) couplet +! + ZVEC1(:) = PACK( ZLBDAS(:),MASK=GACC(:) ) + ZVEC2(:) = PACK( ZLBDAR(:),MASK=GACC(:) ) +! +! 1.3.2 find the next lower indice for the ZLBDAS and for the ZLBDAR +! in the geometrical set of (Lbda_s,Lbda_r) couplet use to +! tabulate the RACCSS-kernel +! + ZVEC1(1:IGACC) = MAX( 1.0001, MIN( REAL(NACCLBDAS)-0.0001, & + XACCINTP1S * LOG( ZVEC1(1:IGACC) ) + XACCINTP2S ) ) + IVEC1(1:IGACC) = INT( ZVEC1(1:IGACC) ) + ZVEC1(1:IGACC) = ZVEC1(1:IGACC) - REAL( IVEC1(1:IGACC) ) +! + ZVEC2(1:IGACC) = MAX( 1.0001, MIN( REAL(NACCLBDAR)-0.0001, & + XACCINTP1R * LOG( ZVEC2(1:IGACC) ) + XACCINTP2R ) ) + IVEC2(1:IGACC) = INT( ZVEC2(1:IGACC) ) + ZVEC2(1:IGACC) = ZVEC2(1:IGACC) - REAL( IVEC2(1:IGACC) ) +! +! 1.3.3 perform the bilinear interpolation of the normalized +! RACCSS-kernel +! + DO JJ = 1,IGACC + ZVEC3(JJ) = ( XKER_RACCSS(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & + - XKER_RACCSS(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + * ZVEC1(JJ) & + - ( XKER_RACCSS(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & + - XKER_RACCSS(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + * (ZVEC1(JJ) - 1.0) + END DO + ZZW(:) = UNPACK( VECTOR=ZVEC3(:),MASK=GACC,FIELD=0.0 ) +! +! 1.3.4 raindrop accretion on the small sized aggregates +! + WHERE ( GACC(:) ) + ZZW1(:,2) = ZCRT(:) * & !! coef of RRACCS + XFRACCSS*( ZLBDAS(:)**XCXS )*( ZRHODREF(:)**(-XCEXVT-1.) ) & + *( XLBRACCS1/((ZLBDAS(:)**2) ) + & + XLBRACCS2/( ZLBDAS(:) * ZLBDAR(:) ) + & + XLBRACCS3/( (ZLBDAR(:)**2)) )/ZLBDAR(:)**3 + ZZW1(:,4) = MIN( ZRRS(:),ZZW1(:,2)*ZZW(:) ) ! RRACCSS + ZRRS(:) = ZRRS(:) - ZZW1(:,4) + ZRSS(:) = ZRSS(:) + ZZW1(:,4) + ZTHS(:) = ZTHS(:) + ZZW1(:,4)*(ZLSFACT(:)-ZLVFACT(:)) ! f(L_f*(RRACCSS)) +! + ZCRS(:) = MAX( ZCRS(:)-ZZW1(:,4)*(ZCRT(:)/ZRRT(:)),0.0 ) ! Lambda_r**3 + END WHERE +! +! 1.3.4b perform the bilinear interpolation of the normalized +! RACCS-kernel +! + DO JJ = 1,IGACC + ZVEC3(JJ) = ( XKER_RACCS(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & + - XKER_RACCS(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + * ZVEC1(JJ) & + - ( XKER_RACCS(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & + - XKER_RACCS(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + * (ZVEC1(JJ) - 1.0) + END DO + ZZW1(:,2) = ZZW1(:,2)*UNPACK( VECTOR=ZVEC3(:),MASK=GACC(:),FIELD=0.0 ) !! RRACCS +! +! 1.3.5 perform the bilinear interpolation of the normalized +! SACCRG-kernel +! + DO JJ = 1,IGACC + ZVEC3(JJ) = ( XKER_SACCRG(IVEC2(JJ)+1,IVEC1(JJ)+1)* ZVEC1(JJ) & + - XKER_SACCRG(IVEC2(JJ)+1,IVEC1(JJ) )*(ZVEC1(JJ) - 1.0) ) & + * ZVEC2(JJ) & + - ( XKER_SACCRG(IVEC2(JJ) ,IVEC1(JJ)+1)* ZVEC1(JJ) & + - XKER_SACCRG(IVEC2(JJ) ,IVEC1(JJ) )*(ZVEC1(JJ) - 1.0) ) & + * (ZVEC2(JJ) - 1.0) + END DO + ZZW(:) = UNPACK( VECTOR=ZVEC3(:),MASK=GACC,FIELD=0.0 ) +! +! 1.3.6 raindrop accretion-conversion of the large sized aggregates +! into graupeln +! + WHERE ( GACC(:) .AND. (ZRSS(:)>XRTMIN(5)/PTSTEP) ) + ZZW1(:,2) = MAX( MIN( ZRRS(:),ZZW1(:,2)-ZZW1(:,4) ) , 0. ) ! RRACCSG + ZZW1(:,3) = MIN( ZRSS(:),XFSACCRG*ZZW(:)* & ! RSACCRG + ( ZLBDAS(:)**(XCXS-XBS) )*( ZRHODREF(:)**(-XCEXVT-1.) ) & + *( XLBSACCR1/((ZLBDAR(:)**2) ) + & + XLBSACCR2/( ZLBDAR(:) * ZLBDAS(:) ) + & + XLBSACCR3/( (ZLBDAS(:)**2)) ) ) + ZRRS(:) = ZRRS(:) - ZZW1(:,2) + ZRSS(:) = ZRSS(:) - ZZW1(:,3) + ZRGS(:) = ZRGS(:) + ZZW1(:,2)+ZZW1(:,3) + ZTHS(:) = ZTHS(:) + ZZW1(:,2)*(ZLSFACT(:)-ZLVFACT(:)) ! f(L_f*(RRACCSG)) +! + ZCRS(:) = MAX( ZCRS(:)-ZZW1(:,2)*(ZCRT(:)/ZRRT(:)),0.0 ) ! Lambda_r**3 + END WHERE + DEALLOCATE(IVEC2) + DEALLOCATE(IVEC1) + DEALLOCATE(ZVEC3) + DEALLOCATE(ZVEC2) + DEALLOCATE(ZVEC1) + + ! Budget storage + if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'ACC', & + Unpack( zths(:), mask = gmicro(:, :, :), field = pths(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_end( tbudgets(NBUDGET_RR), 'ACC', & + Unpack( zrrs(:), mask = gmicro(:, :, :), field = prrs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rs ) call Budget_store_end( tbudgets(NBUDGET_RS), 'ACC', & + Unpack( zrss(:), mask = gmicro(:, :, :), field = prss(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rg ) call Budget_store_end( tbudgets(NBUDGET_RG), 'ACC', & + Unpack( zrgs(:), mask = gmicro(:, :, :), field = prgs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_sv ) call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nr), 'ACC', & + Unpack( zcrs(:), mask = gmicro(:, :, :), field = pcrs(:, :, :) ) * prhodj(:, :, :) ) + end if +END IF +! +!* 1.4 Conversion-Melting of the aggregates +! ----------------------------------------- +! +if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_rs ) call Budget_store_init( tbudgets(NBUDGET_RS), 'CMEL', & + Unpack( zrss(:), mask = gmicro(:, :, :), field = prss(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rg ) call Budget_store_init( tbudgets(NBUDGET_RG), 'CMEL', & + Unpack( zrgs(:), mask = gmicro(:, :, :), field = prgs(:, :, :) ) * prhodj(:, :, :) ) +end if + +ZZW(:) = 0.0 +WHERE( (ZRST(:)>XRTMIN(5)) .AND. (ZRSS(:)>XRTMIN(5)/PTSTEP) .AND. (ZZT(:)>XTT) ) + ZZW(:) = ZRVT(:)*ZPRES(:)/((XMV/XMD)+ZRVT(:)) ! Vapor pressure + ZZW(:) = ZKA(:)*(XTT-ZZT(:)) + & + ( ZDV(:)*(XLVTT + ( XCPV - XCL ) * ( ZZT(:) - XTT )) & + *(XESTT-ZZW(:))/(XRV*ZZT(:)) ) +! +! compute RSMLT +! + ZZW(:) = MIN( ZRSS(:), XFSCVMG*MAX( 0.0,( -ZZW(:) * & + ( X0DEPS* ZLBDAS(:)**XEX0DEPS + & + X1DEPS*ZCJ(:)*ZLBDAS(:)**XEX1DEPS ) - & + ( ZZW1(:,1)+ZZW1(:,4) ) * & + ( ZRHODREF(:)*XCL*(XTT-ZZT(:))) ) / & + ( ZRHODREF(:)*XLMTT ) ) ) +! +! note that RSCVMG = RSMLT*XFSCVMG but no heat is exchanged (at the rate RSMLT) +! because the graupeln produced by this process are still icy!!! +! + ZRSS(:) = ZRSS(:) - ZZW(:) + ZRGS(:) = ZRGS(:) + ZZW(:) +END WHERE +! +! Budget storage +if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_rs ) call Budget_store_end( tbudgets(NBUDGET_RS), 'CMEL', & + Unpack( zrss(:), mask = gmicro(:, :, :), field = prss(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rg ) call Budget_store_end( tbudgets(NBUDGET_RG), 'CMEL', & + Unpack( zrgs(:), mask = gmicro(:, :, :), field = prgs(:, :, :) ) * prhodj(:, :, :) ) +end if + +END IF SNOW +! +!------------------------------------------------------------------------------ +! +! ################# +! FAST RG PROCESSES +! ################# +! +! +!* 2.1 Rain contact freezing +! -------------------------- +! +if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'CFRZ', & + Unpack( zths(:), mask = gmicro(:, :, :), field = pths(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_init( tbudgets(NBUDGET_RR), 'CFRZ', & + Unpack( zrrs(:), mask = gmicro(:, :, :), field = prrs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), 'CFRZ', & + Unpack( zris(:), mask = gmicro(:, :, :), field = pris(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rg ) call Budget_store_init( tbudgets(NBUDGET_RG), 'CFRZ', & + Unpack( zrgs(:), mask = gmicro(:, :, :), field = prgs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_sv ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nr), 'CFRZ', & + Unpack( zcrs(:), mask = gmicro(:, :, :), field = pcrs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_sv ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'CFRZ', & + Unpack( zcis(:), mask = gmicro(:, :, :), field = pcis(:, :, :) ) * prhodj(:, :, :) ) +end if + +ZZW1(:,3:4) = 0.0 +WHERE( (ZRIT(:)>XRTMIN(4)) .AND. (ZRRT(:)>XRTMIN(3)) .AND. (ZRIS(:)>XRTMIN(4)/PTSTEP) .AND. (ZRRS(:)>XRTMIN(3)/PTSTEP) ) + ZZW1(:,3) = MIN( ZRIS(:),XICFRR * ZRIT(:) * ZCRT(:) & ! RICFRRG + * ZLBDAR(:)**XEXICFRR & + * ZRHODREF(:)**(-XCEXVT-1.0) ) +! + ZZW1(:,4) = MIN( ZRRS(:),XRCFRI * ZCIT(:) * ZCRT(:) & ! RRCFRIG + * ZLBDAR(:)**XEXRCFRI & + * ZRHODREF(:)**(-XCEXVT-2.0) ) + ZRIS(:) = ZRIS(:) - ZZW1(:,3) + ZRRS(:) = ZRRS(:) - ZZW1(:,4) + ZRGS(:) = ZRGS(:) + ZZW1(:,3)+ZZW1(:,4) + ZTHS(:) = ZTHS(:) + ZZW1(:,4)*(ZLSFACT(:)-ZLVFACT(:)) ! f(L_f*RRCFRIG) +! + ZCIS(:) = MAX( ZCIS(:)-ZZW1(:,3)*(ZCIT(:)/ZRIT(:)),0.0 ) ! CICFRRG + ZCRS(:) = MAX( ZCRS(:)-ZZW1(:,4)*(ZCRT(:)/ZRRT(:)),0.0 ) ! CRCFRIG +END WHERE + +if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'CFRZ', & + Unpack( zths(:), mask = gmicro(:, :, :), field = pths(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_end( tbudgets(NBUDGET_RR), 'CFRZ', & + Unpack( zrrs(:), mask = gmicro(:, :, :), field = prrs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'CFRZ', & + Unpack( zris(:), mask = gmicro(:, :, :), field = pris(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rg ) call Budget_store_end( tbudgets(NBUDGET_RG), 'CFRZ', & + Unpack( zrgs(:), mask = gmicro(:, :, :), field = prgs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_sv ) call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nr), 'CFRZ', & + Unpack( zcrs(:), mask = gmicro(:, :, :), field = pcrs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_sv ) call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'CFRZ', & + Unpack( zcis(:), mask = gmicro(:, :, :), field = pcis(:, :, :) ) * prhodj(:, :, :) ) +end if +! +!* 2.2 Compute the Dry growth case +! -------------------------------- +if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'WETG', & + Unpack( zths(:), mask = gmicro(:, :, :), field = pths(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'WETG', & + Unpack( zrcs(:), mask = gmicro(:, :, :), field = prcs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_init( tbudgets(NBUDGET_RR), 'WETG', & + Unpack( zrrs(:), mask = gmicro(:, :, :), field = prrs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), 'WETG', & + Unpack( zris(:), mask = gmicro(:, :, :), field = pris(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rs ) call Budget_store_init( tbudgets(NBUDGET_RS), 'WETG', & + Unpack( zrss(:), mask = gmicro(:, :, :), field = prss(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rg ) call Budget_store_init( tbudgets(NBUDGET_RG), 'WETG', & + Unpack( zrgs(:), mask = gmicro(:, :, :), field = prgs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rh ) call Budget_store_init( tbudgets(NBUDGET_RH), 'WETG', & + Unpack( zrhs(:), mask = gmicro(:, :, :), field = prgs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_sv ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'WETG', & + Unpack( zccs(:), mask = gmicro(:, :, :), field = pccs(:, :, :) ) * prhodj(:, :, :) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nr), 'WETG', & + Unpack( zcrs(:), mask = gmicro(:, :, :), field = pcrs(:, :, :) ) * prhodj(:, :, :) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'WETG', & + Unpack( zcis(:), mask = gmicro(:, :, :), field = pcis(:, :, :) ) * prhodj(:, :, :) ) + end if +end if +! +ZZW1(:,:) = 0.0 +WHERE( ((ZRCT(:)>XRTMIN(2)) .AND. (ZRGT(:)>XRTMIN(6)) .AND. (ZRCS(:)>XRTMIN(2)/PTSTEP)) .OR. & + ((ZRIT(:)>XRTMIN(4)) .AND. (ZRGT(:)>XRTMIN(6)) .AND. (ZRIS(:)>XRTMIN(4)/PTSTEP)) ) + ZZW(:) = ZLBDAG(:)**(XCXG-XDG-2.0) * ZRHODREF(:)**(-XCEXVT) + ZZW1(:,1) = MIN( ZRCS(:),XFCDRYG * ZRCT(:) * ZZW(:) ) ! RCDRYG + ZZW1(:,2) = MIN( ZRIS(:),XFIDRYG * EXP( XCOLEXIG*(ZZT(:)-XTT) ) & + * ZRIT(:) * ZZW(:) ) ! RIDRYG +END WHERE +! +!* 2.2.1 accretion of aggregates on the graupeln +! ---------------------------------------------- +! +GDRY(:) = (ZRST(:)>XRTMIN(5)) .AND. (ZRGT(:)>XRTMIN(6)) .AND. (ZRSS(:)>XRTMIN(5)/PTSTEP) +IGDRY = COUNT( GDRY(:) ) +! +IF( IGDRY>0 ) THEN +! +!* 2.2.2 allocations +! + ALLOCATE(ZVEC1(IGDRY)) + ALLOCATE(ZVEC2(IGDRY)) + ALLOCATE(ZVEC3(IGDRY)) + ALLOCATE(IVEC1(IGDRY)) + ALLOCATE(IVEC2(IGDRY)) +! +!* 2.2.3 select the (ZLBDAG,ZLBDAS) couplet +! + ZVEC1(:) = PACK( ZLBDAG(:),MASK=GDRY(:) ) + ZVEC2(:) = PACK( ZLBDAS(:),MASK=GDRY(:) ) +! +!* 2.2.4 find the next lower indice for the ZLBDAG and for the ZLBDAS +! in the geometrical set of (Lbda_g,Lbda_s) couplet use to +! tabulate the SDRYG-kernel +! + ZVEC1(1:IGDRY) = MAX( 1.0001, MIN( REAL(NDRYLBDAG)-0.0001, & + XDRYINTP1G * LOG( ZVEC1(1:IGDRY) ) + XDRYINTP2G ) ) + IVEC1(1:IGDRY) = INT( ZVEC1(1:IGDRY) ) + ZVEC1(1:IGDRY) = ZVEC1(1:IGDRY) - REAL( IVEC1(1:IGDRY) ) +! + ZVEC2(1:IGDRY) = MAX( 1.0001, MIN( REAL(NDRYLBDAS)-0.0001, & + XDRYINTP1S * LOG( ZVEC2(1:IGDRY) ) + XDRYINTP2S ) ) + IVEC2(1:IGDRY) = INT( ZVEC2(1:IGDRY) ) + ZVEC2(1:IGDRY) = ZVEC2(1:IGDRY) - REAL( IVEC2(1:IGDRY) ) +! +!* 2.2.5 perform the bilinear interpolation of the normalized +! SDRYG-kernel +! + DO JJ = 1,IGDRY + ZVEC3(JJ) = ( XKER_SDRYG(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & + - XKER_SDRYG(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + * ZVEC1(JJ) & + - ( XKER_SDRYG(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & + - XKER_SDRYG(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + * (ZVEC1(JJ) - 1.0) + END DO + ZZW(:) = UNPACK( VECTOR=ZVEC3(:),MASK=GDRY,FIELD=0.0 ) +! + WHERE( GDRY(:) ) + ZZW1(:,3) = MIN( ZRSS(:),XFSDRYG*ZZW(:) & ! RSDRYG + * EXP( XCOLEXSG*(ZZT(:)-XTT) ) & + *( ZLBDAS(:)**(XCXS-XBS) )*( ZLBDAG(:)**XCXG ) & + *( ZRHODREF(:)**(-XCEXVT-1.) ) & + *( XLBSDRYG1/( ZLBDAG(:)**2 ) + & + XLBSDRYG2/( ZLBDAG(:) * ZLBDAS(:) ) + & + XLBSDRYG3/( ZLBDAS(:)**2) ) ) + END WHERE + DEALLOCATE(IVEC2) + DEALLOCATE(IVEC1) + DEALLOCATE(ZVEC3) + DEALLOCATE(ZVEC2) + DEALLOCATE(ZVEC1) +END IF +! +!* 2.2.6 accretion of raindrops on the graupeln +! --------------------------------------------- +! +GDRY(:) = (ZRRT(:)>XRTMIN(3)) .AND. (ZRGT(:)>XRTMIN(6)) .AND. (ZRRS(:)>XRTMIN(3)) +IGDRY = COUNT( GDRY(:) ) +! +IF( IGDRY>0 ) THEN +! +!* 2.2.7 allocations +! + ALLOCATE(ZVEC1(IGDRY)) + ALLOCATE(ZVEC2(IGDRY)) + ALLOCATE(ZVEC3(IGDRY)) + ALLOCATE(IVEC1(IGDRY)) + ALLOCATE(IVEC2(IGDRY)) +! +!* 2.2.8 select the (ZLBDAG,ZLBDAR) couplet +! + ZVEC1(:) = PACK( ZLBDAG(:),MASK=GDRY(:) ) + ZVEC2(:) = PACK( ZLBDAR(:),MASK=GDRY(:) ) +! +!* 2.2.9 find the next lower indice for the ZLBDAG and for the ZLBDAR +! in the geometrical set of (Lbda_g,Lbda_r) couplet use to +! tabulate the RDRYG-kernel +! + ZVEC1(1:IGDRY) = MAX( 1.0001, MIN( REAL(NDRYLBDAG)-0.0001, & + XDRYINTP1G * LOG( ZVEC1(1:IGDRY) ) + XDRYINTP2G ) ) + IVEC1(1:IGDRY) = INT( ZVEC1(1:IGDRY) ) + ZVEC1(1:IGDRY) = ZVEC1(1:IGDRY) - REAL( IVEC1(1:IGDRY) ) +! + ZVEC2(1:IGDRY) = MAX( 1.0001, MIN( REAL(NDRYLBDAR)-0.0001, & + XDRYINTP1R * LOG( ZVEC2(1:IGDRY) ) + XDRYINTP2R ) ) + IVEC2(1:IGDRY) = INT( ZVEC2(1:IGDRY) ) + ZVEC2(1:IGDRY) = ZVEC2(1:IGDRY) - REAL( IVEC2(1:IGDRY) ) +! +!* 2.2.10 perform the bilinear interpolation of the normalized +! RDRYG-kernel +! + DO JJ = 1,IGDRY + ZVEC3(JJ) = ( XKER_RDRYG(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & + - XKER_RDRYG(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + * ZVEC1(JJ) & + - ( XKER_RDRYG(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & + - XKER_RDRYG(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + * (ZVEC1(JJ) - 1.0) + END DO + ZZW(:) = UNPACK( VECTOR=ZVEC3(:),MASK=GDRY,FIELD=0.0 ) +! + WHERE( GDRY(:) ) + ZZW1(:,4) = MIN( ZRRS(:),XFRDRYG*ZZW(:) * ZCRT(:) & ! RRDRYG + *( ZLBDAR(:)**(-3) )*( ZLBDAG(:)**XCXG ) & + *( ZRHODREF(:)**(-XCEXVT-1.) ) & + *( XLBRDRYG1/( ZLBDAG(:)**2 ) + & + XLBRDRYG2/( ZLBDAG(:) * ZLBDAR(:) ) + & + XLBRDRYG3/( ZLBDAR(:)**2) ) ) + END WHERE + DEALLOCATE(IVEC2) + DEALLOCATE(IVEC1) + DEALLOCATE(ZVEC3) + DEALLOCATE(ZVEC2) + DEALLOCATE(ZVEC1) +END IF +! +ZRDRYG(:) = ZZW1(:,1) + ZZW1(:,2) + ZZW1(:,3) + ZZW1(:,4) +! +! +!* 2.3 Compute the Wet growth case +! -------------------------------- +! +! +ZZW(:) = 0.0 +ZRWETG(:) = 0.0 +WHERE( ZRGT(:)>XRTMIN(6) ) + ZZW1(:,5) = MIN( ZRIS(:), & + ZZW1(:,2) / (XCOLIG*EXP(XCOLEXIG*(ZZT(:)-XTT)) ) ) ! RIWETG + ZZW1(:,6) = MIN( ZRSS(:), & + ZZW1(:,3) / (XCOLSG*EXP(XCOLEXSG*(ZZT(:)-XTT)) ) ) ! RSWETG +! + ZZW(:) = ZRVT(:)*ZPRES(:)/((XMV/XMD)+ZRVT(:)) ! Vapor pressure + ZZW(:) = ZKA(:)*(XTT-ZZT(:)) + & + ( ZDV(:)*(XLVTT + ( XCPV - XCL ) * ( ZZT(:) - XTT )) & + *(XESTT-ZZW(:))/(XRV*ZZT(:)) ) +! +! compute RWETG +! + ZRWETG(:) = MAX( 0.0, & + ( ZZW(:) * ( X0DEPG* ZLBDAG(:)**XEX0DEPG + & + X1DEPG*ZCJ(:)*ZLBDAG(:)**XEX1DEPG ) + & + ( ZZW1(:,5)+ZZW1(:,6) ) * & + ( ZRHODREF(:)*(XLMTT+(XCI-XCL)*(XTT-ZZT(:))) ) ) / & + ( ZRHODREF(:)*(XLMTT-XCL*(XTT-ZZT(:))) ) ) +END WHERE +! +! +!* 2.4 Select Wet or Dry case +! --------------------------- +! +! +! Wet case and partial conversion to hail +! +ZZW(:) = 0.0 +NHAIL = 0. +IF (LHAIL) NHAIL = 1. +WHERE( ZRGT(:)>XRTMIN(6) .AND. ZZT(:)<XTT & + .AND. ZRDRYG(:)>=ZRWETG(:) .AND. ZRWETG(:)>0.0 ) +! + ZZW(:) = ZRWETG(:) - ZZW1(:,5) - ZZW1(:,6) ! RCWETG+RRWETG +! +! limitation of the available rainwater mixing ratio (RRWETH < RRS !) +! + ZZW1(:,7) = MAX( 0.0,MIN( ZZW(:),ZRRS(:)+ZZW1(:,1) ) ) + ZZX(:) = ZZW1(:,7) / ZZW(:) + ZZW1(:,5) = ZZW1(:,5)*ZZX(:) + ZZW1(:,6) = ZZW1(:,6)*ZZX(:) + ZRWETG(:) = ZZW1(:,7) + ZZW1(:,5) + ZZW1(:,6) +! + ZRCS(:) = ZRCS(:) - ZZW1(:,1) + ZRIS(:) = ZRIS(:) - ZZW1(:,5) + ZRSS(:) = ZRSS(:) - ZZW1(:,6) +! +! assume a linear percent of conversion of graupel into hail +! + ZRGS(:) = ZRGS(:) + ZRWETG(:) + ZZW(:) = ZRGS(:)*ZRDRYG(:)*NHAIL/(ZRWETG(:)+ZRDRYG(:)) + ZRGS(:) = ZRGS(:) - ZZW(:) + ZRHS(:) = ZRHS(:) + ZZW(:) + ZRRS(:) = MAX( 0.0,ZRRS(:) - ZZW1(:,7) + ZZW1(:,1) ) + ZTHS(:) = ZTHS(:) + ZZW1(:,7)*(ZLSFACT(:)-ZLVFACT(:)) + ! f(L_f*(RCWETG+RRWETG)) +! + ZCCS(:) = MAX( ZCCS(:)-ZZW1(:,1)*(ZCCT(:)/MAX(ZRCT(:),XRTMIN(2))),0.0 ) + ZCIS(:) = MAX( ZCIS(:)-ZZW1(:,5)*(ZCIT(:)/MAX(ZRIT(:),XRTMIN(4))),0.0 ) + ZCRS(:) = MAX( ZCRS(:)-MAX( ZZW1(:,7)-ZZW1(:,1),0.0 ) & + *(ZCRT(:)/MAX(ZRRT(:),XRTMIN(3))),0.0 ) +END WHERE +! +! Budget storage +if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'WETG', & + Unpack( zths(:), mask = gmicro(:, :, :), field = pths(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'WETG', & + Unpack( zrcs(:), mask = gmicro(:, :, :), field = prcs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_end( tbudgets(NBUDGET_RR), 'WETG', & + Unpack( zrrs(:), mask = gmicro(:, :, :), field = prrs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'WETG', & + Unpack( zris(:), mask = gmicro(:, :, :), field = pris(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rs ) call Budget_store_end( tbudgets(NBUDGET_RS), 'WETG', & + Unpack( zrss(:), mask = gmicro(:, :, :), field = prss(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rg ) call Budget_store_end( tbudgets(NBUDGET_RG), 'WETG', & + Unpack( zrgs(:), mask = gmicro(:, :, :), field = prgs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rh ) call Budget_store_end( tbudgets(NBUDGET_RH), 'WETG', & + Unpack( zrhs(:), mask = gmicro(:, :, :), field = prhs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_sv ) then + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'WETG', & + Unpack( zccs(:), mask = gmicro(:, :, :), field = pccs(:, :, :) ) * prhodj(:, :, :) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nr), 'WETG', & + Unpack( zcrs(:), mask = gmicro(:, :, :), field = pcrs(:, :, :) ) * prhodj(:, :, :) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'WETG', & + Unpack( zcis(:), mask = gmicro(:, :, :), field = pcis(:, :, :) ) * prhodj(:, :, :) ) + end if +end if +! +! Dry case +! +if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'DRYG', & + Unpack( zths(:), mask = gmicro(:, :, :), field = pths(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'DRYG', & + Unpack( zrcs(:), mask = gmicro(:, :, :), field = prcs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_init( tbudgets(NBUDGET_RR), 'DRYG', & + Unpack( zrrs(:), mask = gmicro(:, :, :), field = prrs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), 'DRYG', & + Unpack( zris(:), mask = gmicro(:, :, :), field = pris(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rs ) call Budget_store_init( tbudgets(NBUDGET_RS), 'DRYG', & + Unpack( zrss(:), mask = gmicro(:, :, :), field = prss(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rg ) call Budget_store_init( tbudgets(NBUDGET_RG), 'DRYG', & + Unpack( zrgs(:), mask = gmicro(:, :, :), field = prgs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_sv ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'DRYG', & + Unpack( zccs(:), mask = gmicro(:, :, :), field = pccs(:, :, :) ) * prhodj(:, :, :) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nr), 'DRYG', & + Unpack( zcrs(:), mask = gmicro(:, :, :), field = pcrs(:, :, :) ) * prhodj(:, :, :) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'DRYG', & + Unpack( zcis(:), mask = gmicro(:, :, :), field = pcis(:, :, :) ) * prhodj(:, :, :) ) + end if +end if + +WHERE( ZRGT(:)>XRTMIN(6) .AND. ZZT(:)<XTT & + .AND. ZRDRYG(:)<ZRWETG(:) .AND. ZRDRYG(:)>0.0 ) ! case + ZRCS(:) = ZRCS(:) - ZZW1(:,1) + ZRIS(:) = ZRIS(:) - ZZW1(:,2) + ZRSS(:) = ZRSS(:) - ZZW1(:,3) + ZRRS(:) = ZRRS(:) - ZZW1(:,4) + ZRGS(:) = ZRGS(:) + ZRDRYG(:) + ZTHS(:) = ZTHS(:) + (ZZW1(:,1)+ZZW1(:,4))*(ZLSFACT(:)-ZLVFACT(:)) ! + ! f(L_f*(RCDRYG+RRDRYG)) +! + ZCCS(:) = MAX( ZCCS(:)-ZZW1(:,1)*(ZCCT(:)/MAX(ZRCT(:),XRTMIN(2))),0.0 ) + ZCIS(:) = MAX( ZCIS(:)-ZZW1(:,2)*(ZCIT(:)/MAX(ZRIT(:),XRTMIN(4))),0.0 ) + ZCRS(:) = MAX( ZCRS(:)-ZZW1(:,4)*(ZCRT(:)/MAX(ZRRT(:),XRTMIN(3))),0.0 ) + ! Approximate rates +END WHERE +! +! Budget storage +if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'DRYG', & + Unpack( zths(:), mask = gmicro(:, :, :), field = pths(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'DRYG', & + Unpack( zrcs(:), mask = gmicro(:, :, :), field = prcs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_end( tbudgets(NBUDGET_RR), 'DRYG', & + Unpack( zrrs(:), mask = gmicro(:, :, :), field = prrs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'DRYG', & + Unpack( zris(:), mask = gmicro(:, :, :), field = pris(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rs ) call Budget_store_end( tbudgets(NBUDGET_RS), 'DRYG', & + Unpack( zrss(:), mask = gmicro(:, :, :), field = prss(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rg ) call Budget_store_end( tbudgets(NBUDGET_RG), 'DRYG', & + Unpack( zrgs(:), mask = gmicro(:, :, :), field = prgs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_sv ) then + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'DRYG', & + Unpack( zccs(:), mask = gmicro(:, :, :), field = pccs(:, :, :) ) * prhodj(:, :, :) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nr), 'DRYG', & + Unpack( zcrs(:), mask = gmicro(:, :, :), field = pcrs(:, :, :) ) * prhodj(:, :, :) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'DRYG', & + Unpack( zcis(:), mask = gmicro(:, :, :), field = pcis(:, :, :) ) * prhodj(:, :, :) ) + end if +end if +! +! +!* 2.5 Hallett-Mossop ice multiplication process due to graupel riming +! -------------------------------------------------------------------- +! +if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), 'HMG', & + Unpack( zris(:), mask = gmicro(:, :, :), field = pris(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rg ) call Budget_store_init( tbudgets(NBUDGET_RG), 'HMG', & + Unpack( zrgs(:), mask = gmicro(:, :, :), field = prgs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_sv ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'HMG', & + Unpack( zcis(:), mask = gmicro(:, :, :), field = pcis(:, :, :) ) * prhodj(:, :, :) ) +end if + +GDRY(:) = (ZZT(:)<XHMTMAX) .AND. (ZZT(:)>XHMTMIN) .AND. (ZRDRYG(:)<ZZW(:))& + .AND. (ZRGT(:)>XRTMIN(6)) .AND. (ZRCT(:)>XRTMIN(2)) +IGDRY = COUNT( GDRY(:) ) +IF( IGDRY>0 ) THEN + ALLOCATE(ZVEC1(IGDRY)) + ALLOCATE(ZVEC2(IGDRY)) + ALLOCATE(IVEC2(IGDRY)) +! + ZVEC1(:) = PACK( ZLBDAC(:),MASK=GDRY(:) ) + ZVEC2(1:IGDRY) = MAX( 1.0001, MIN( REAL(NGAMINC)-0.0001, & + XHMLINTP1 * LOG( ZVEC1(1:IGDRY) ) + XHMLINTP2 ) ) + IVEC2(1:IGDRY) = INT( ZVEC2(1:IGDRY) ) + ZVEC2(1:IGDRY) = ZVEC2(1:IGDRY) - REAL( IVEC2(1:IGDRY) ) + ZVEC1(1:IGDRY) = XGAMINC_HMC( IVEC2(1:IGDRY)+1 )* ZVEC2(1:IGDRY) & + - XGAMINC_HMC( IVEC2(1:IGDRY) )*(ZVEC2(1:IGDRY) - 1.0) + ZZX(:) = UNPACK( VECTOR=ZVEC1(:),MASK=GDRY,FIELD=0.0 ) ! Large droplets +! + WHERE ( GDRY(:) .AND. ZZX(:)<0.99 ) ! Dry case + ZZW1(:,5) = ZZW1(:,1)*(ZCCT(:)/ZRCT(:))*(1.0-ZZX(:))*XHM_FACTG* & + MAX( 0.0, MIN( (ZZT(:)-XHMTMIN)/3.0,(XHMTMAX-ZZT(:))/2.0 ) ) ! CCHMGI + ZCIS(:) = ZCIS(:) + ZZW1(:,5) +! + ZZW1(:,6) = ZZW1(:,5) * XMNU0 ! RCHMGI + ZRIS(:) = ZRIS(:) + ZZW1(:,6) + ZRGS(:) = ZRGS(:) - ZZW1(:,6) + END WHERE + DEALLOCATE(IVEC2) + DEALLOCATE(ZVEC2) + DEALLOCATE(ZVEC1) +END IF +! +! Budget storage +if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'HMG', & + Unpack( zris(:), mask = gmicro(:, :, :), field = pris(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rg ) call Budget_store_end( tbudgets(NBUDGET_RG), 'HMG', & + Unpack( zrgs(:), mask = gmicro(:, :, :), field = prgs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_sv ) call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'HMG', & + Unpack( zcis(:), mask = gmicro(:, :, :), field = pcis(:, :, :) ) * prhodj(:, :, :) ) +end if +! +!* 2.6 Melting of the graupeln +! ---------------------------- +! +if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'GMLT', & + Unpack( zths(:), mask = gmicro(:, :, :), field = pths(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_init( tbudgets(NBUDGET_RR), 'GMLT', & + Unpack( zrrs(:), mask = gmicro(:, :, :), field = prrs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rg ) call Budget_store_init( tbudgets(NBUDGET_RG), 'GMLT', & + Unpack( zrgs(:), mask = gmicro(:, :, :), field = prgs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_sv ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nr), 'GMLT', & + Unpack( zcrs(:), mask = gmicro(:, :, :), field = pcrs(:, :, :) ) * prhodj(:, :, :) ) +end if + +ZZW(:) = 0.0 +WHERE( (ZRGT(:)>XRTMIN(6)) .AND. (ZRGS(:)>XRTMIN(6)/PTSTEP) .AND. (ZZT(:)>XTT) ) + ZZW(:) = ZRVT(:)*ZPRES(:)/((XMV/XMD)+ZRVT(:)) ! Vapor pressure + ZZW(:) = ZKA(:)*(XTT-ZZT(:)) + & + ( ZDV(:)*(XLVTT + ( XCPV - XCL ) * ( ZZT(:) - XTT )) & + *(XESTT-ZZW(:))/(XRV*ZZT(:)) ) +! +! compute RGMLTR +! + ZZW(:) = MIN( ZRGS(:), MAX( 0.0,( -ZZW(:) * & + ( X0DEPG* ZLBDAG(:)**XEX0DEPG + & + X1DEPG*ZCJ(:)*ZLBDAG(:)**XEX1DEPG ) - & + ( ZZW1(:,1)+ZZW1(:,4) ) * & + ( ZRHODREF(:)*XCL*(XTT-ZZT(:))) ) / & + ( ZRHODREF(:)*XLMTT ) ) ) + ZRRS(:) = ZRRS(:) + ZZW(:) + ZRGS(:) = ZRGS(:) - ZZW(:) + ZTHS(:) = ZTHS(:) - ZZW(:)*(ZLSFACT(:)-ZLVFACT(:)) ! f(L_f*(-RGMLTR)) +! +! ZCRS(:) = MAX( ZCRS(:) + ZZW(:)*(XCCG*ZLBDAG(:)**XCXG/ZRGT(:)),0.0 ) + ZCRS(:) = ZCRS(:) + ZZW(:)*5.0E6 ! obtained after averaging + ! Dshed=1mm and 500 microns +END WHERE +! +if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'GMLT', & + Unpack( zths(:), mask = gmicro(:, :, :), field = pths(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_end( tbudgets(NBUDGET_RR), 'GMLT', & + Unpack( zrrs(:), mask = gmicro(:, :, :), field = prrs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rg ) call Budget_store_end( tbudgets(NBUDGET_RG), 'GMLT', & + Unpack( zrgs(:), mask = gmicro(:, :, :), field = prgs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_sv ) call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nr), 'GMLT', & + Unpack( zcrs(:), mask = gmicro(:, :, :), field = pcrs(:, :, :) ) * prhodj(:, :, :) ) +end if +! +! +!------------------------------------------------------------------------------ +! +! ################# +! FAST RH PROCESSES +! ################# +! +! +HAIL: IF (LHAIL) THEN +! +GHAIL(:) = ZRHT(:)>XRTMIN(7) +IHAIL = COUNT(GHAIL(:)) +! +IF( IHAIL>0 ) THEN +! +!* 3.1 Wet growth of hail +! ---------------------------- +! + if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'WETH', & + Unpack( zths(:), mask = gmicro(:, :, :), field = pths(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'WETH', & + Unpack( zrcs(:), mask = gmicro(:, :, :), field = prcs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_init( tbudgets(NBUDGET_RR), 'WETH', & + Unpack( zrrs(:), mask = gmicro(:, :, :), field = prrs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), 'WETH', & + Unpack( zris(:), mask = gmicro(:, :, :), field = pris(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rs ) call Budget_store_init( tbudgets(NBUDGET_RS), 'WETH', & + Unpack( zrss(:), mask = gmicro(:, :, :), field = prss(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rg ) call Budget_store_init( tbudgets(NBUDGET_RG), 'WETH', & + Unpack( zrgs(:), mask = gmicro(:, :, :), field = prgs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rh ) call Budget_store_init( tbudgets(NBUDGET_RH), 'WETH', & + Unpack( zrhs(:), mask = gmicro(:, :, :), field = prhs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_sv ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'WETH', & + Unpack( zccs(:), mask = gmicro(:, :, :), field = pccs(:, :, :) ) * prhodj(:, :, :) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nr), 'WETH', & + Unpack( zcrs(:), mask = gmicro(:, :, :), field = pcrs(:, :, :) ) * prhodj(:, :, :) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'WETH', & + Unpack( zcis(:), mask = gmicro(:, :, :), field = pcis(:, :, :) ) * prhodj(:, :, :) ) + end if + end if + + ZZW1(:,:) = 0.0 + WHERE( GHAIL(:) .AND. ( (ZRCT(:)>XRTMIN(2) .AND. ZRCS(:)>XRTMIN(2)/PTSTEP) .OR. & + (ZRIT(:)>XRTMIN(4) .AND. ZRIS(:)>XRTMIN(4)/PTSTEP) ) ) + ZZW(:) = ZLBDAH(:)**(XCXH-XDH-2.0) * ZRHODREF(:)**(-XCEXVT) + ZZW1(:,1) = MIN( ZRCS(:),XFWETH * ZRCT(:) * ZZW(:) ) ! RCWETH + ZZW1(:,2) = MIN( ZRIS(:),XFWETH * ZRIT(:) * ZZW(:) ) ! RIWETH + END WHERE +! +!* 3.1.1 accretion of aggregates on the hailstones +! ------------------------------------------------ +! + GWET(:) = GHAIL(:) .AND. (ZRST(:)>XRTMIN(5) .AND. ZRSS(:)>XRTMIN(5)/PTSTEP) + IGWET = COUNT( GWET(:) ) +! + IF( IGWET>0 ) THEN +! +!* 3.1.2 allocations +! + ALLOCATE(ZVEC1(IGWET)) + ALLOCATE(ZVEC2(IGWET)) + ALLOCATE(ZVEC3(IGWET)) + ALLOCATE(IVEC1(IGWET)) + ALLOCATE(IVEC2(IGWET)) +! +!* 3.1.3 select the (ZLBDAH,ZLBDAS) couplet +! + ZVEC1(:) = PACK( ZLBDAH(:),MASK=GWET(:) ) + ZVEC2(:) = PACK( ZLBDAS(:),MASK=GWET(:) ) +! +!* 3.1.4 find the next lower indice for the ZLBDAG and for the ZLBDAS +! in the geometrical set of (Lbda_h,Lbda_s) couplet use to +! tabulate the SWETH-kernel +! + ZVEC1(1:IGWET) = MAX( 1.0001, MIN( REAL(NWETLBDAH)-0.0001, & + XWETINTP1H * LOG( ZVEC1(1:IGWET) ) + XWETINTP2H ) ) + IVEC1(1:IGWET) = INT( ZVEC1(1:IGWET) ) + ZVEC1(1:IGWET) = ZVEC1(1:IGWET) - REAL( IVEC1(1:IGWET) ) +! + ZVEC2(1:IGWET) = MAX( 1.0001, MIN( REAL(NWETLBDAS)-0.0001, & + XWETINTP1S * LOG( ZVEC2(1:IGWET) ) + XWETINTP2S ) ) + IVEC2(1:IGWET) = INT( ZVEC2(1:IGWET) ) + ZVEC2(1:IGWET) = ZVEC2(1:IGWET) - REAL( IVEC2(1:IGWET) ) +! +!* 3.1.5 perform the bilinear interpolation of the normalized +! SWETH-kernel +! + DO JJ = 1,IGWET + ZVEC3(JJ) = ( XKER_SWETH(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & + - XKER_SWETH(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + * ZVEC1(JJ) & + - ( XKER_SWETH(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & + - XKER_SWETH(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + * (ZVEC1(JJ) - 1.0) + END DO + ZZW(:) = UNPACK( VECTOR=ZVEC3(:),MASK=GWET,FIELD=0.0 ) +! + WHERE( GWET(:) ) + ZZW1(:,3) = MIN( ZRSS(:),XFSWETH*ZZW(:) & ! RSWETH + *( ZLBDAS(:)**(XCXS-XBS) )*( ZLBDAH(:)**XCXH ) & + *( ZRHODREF(:)**(-XCEXVT-1.) ) & + *( XLBSWETH1/( ZLBDAH(:)**2 ) + & + XLBSWETH2/( ZLBDAH(:) * ZLBDAS(:) ) + & + XLBSWETH3/( ZLBDAS(:)**2) ) ) + END WHERE + DEALLOCATE(IVEC2) + DEALLOCATE(IVEC1) + DEALLOCATE(ZVEC3) + DEALLOCATE(ZVEC2) + DEALLOCATE(ZVEC1) + END IF +! +!* 3.1.6 accretion of graupeln on the hailstones +! ---------------------------------------------- +! + GWET(:) = GHAIL(:) .AND. (ZRGT(:)>XRTMIN(6) .AND. ZRGS(:)>XRTMIN(6)/PTSTEP) + IGWET = COUNT( GWET(:) ) +! + IF( IGWET>0 ) THEN +! +!* 3.1.7 allocations +! + ALLOCATE(ZVEC1(IGWET)) + ALLOCATE(ZVEC2(IGWET)) + ALLOCATE(ZVEC3(IGWET)) + ALLOCATE(IVEC1(IGWET)) + ALLOCATE(IVEC2(IGWET)) +! +!* 3.1.8 select the (ZLBDAH,ZLBDAG) couplet +! + ZVEC1(:) = PACK( ZLBDAH(:),MASK=GWET(:) ) + ZVEC2(:) = PACK( ZLBDAG(:),MASK=GWET(:) ) +! +!* 3.1.9 find the next lower indice for the ZLBDAH and for the ZLBDAG +! in the geometrical set of (Lbda_h,Lbda_g) couplet use to +! tabulate the GWETH-kernel +! + ZVEC1(1:IGWET) = MAX( 1.0001, MIN( REAL(NWETLBDAG)-0.0001, & + XWETINTP1H * LOG( ZVEC1(1:IGWET) ) + XWETINTP2H ) ) + IVEC1(1:IGWET) = INT( ZVEC1(1:IGWET) ) + ZVEC1(1:IGWET) = ZVEC1(1:IGWET) - REAL( IVEC1(1:IGWET) ) +! + ZVEC2(1:IGWET) = MAX( 1.0001, MIN( REAL(NWETLBDAG)-0.0001, & + XWETINTP1G * LOG( ZVEC2(1:IGWET) ) + XWETINTP2G ) ) + IVEC2(1:IGWET) = INT( ZVEC2(1:IGWET) ) + ZVEC2(1:IGWET) = ZVEC2(1:IGWET) - REAL( IVEC2(1:IGWET) ) +! +!* 3.1.10 perform the bilinear interpolation of the normalized +! GWETH-kernel +! + DO JJ = 1,IGWET + ZVEC3(JJ) = ( XKER_GWETH(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & + - XKER_GWETH(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + * ZVEC1(JJ) & + - ( XKER_GWETH(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & + - XKER_GWETH(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + * (ZVEC1(JJ) - 1.0) + END DO + ZZW(:) = UNPACK( VECTOR=ZVEC3(:),MASK=GWET,FIELD=0.0 ) +! + WHERE( GWET(:) ) + ZZW1(:,5) = MAX(MIN( ZRGS(:),XFGWETH*ZZW(:) & ! RGWETH + *( ZLBDAG(:)**(XCXG-XBG) )*( ZLBDAH(:)**XCXH ) & + *( ZRHODREF(:)**(-XCEXVT-1.) ) & + *( XLBGWETH1/( ZLBDAH(:)**2 ) + & + XLBGWETH2/( ZLBDAH(:) * ZLBDAG(:) ) + & + XLBGWETH3/( ZLBDAG(:)**2) ) ),0. ) + END WHERE + DEALLOCATE(IVEC2) + DEALLOCATE(IVEC1) + DEALLOCATE(ZVEC3) + DEALLOCATE(ZVEC2) + DEALLOCATE(ZVEC1) + END IF +! +!* 3.2 compute the Wet growth of hail +! ------------------------------------- +! + ZZW(:) = 0.0 + WHERE( GHAIL(:) .AND. ZZT(:)<XTT ) + ZZW(:) = ZRVT(:)*ZPRES(:)/((XMV/XMD)+ZRVT(:)) ! Vapor pressure + ZZW(:) = ZKA(:)*(XTT-ZZT(:)) + & + ( ZDV(:)*(XLVTT + ( XCPV - XCL ) * ( ZZT(:) - XTT )) & + *(XESTT-ZZW(:))/(XRV*ZZT(:)) ) +! +! compute RWETH +! + ZZW(:) = MAX(0., ( ZZW(:) * ( X0DEPH* ZLBDAH(:)**XEX0DEPH + & + X1DEPH*ZCJ(:)*ZLBDAH(:)**XEX1DEPH ) + & + ( ZZW1(:,2)+ZZW1(:,3)+ZZW1(:,5) ) * & + ( ZRHODREF(:)*(XLMTT+(XCI-XCL)*(XTT-ZZT(:))) ) ) / & + ( ZRHODREF(:)*(XLMTT-XCL*(XTT-ZZT(:))) ) ) +! + ZZW1(:,6) = MAX( ZZW(:) - ZZW1(:,2) - ZZW1(:,3) - ZZW1(:,5),0.) ! RCWETH+RRWETH + END WHERE + WHERE ( GHAIL(:) .AND. ZZT(:)<XTT .AND. ZZW1(:,6)/=0.) +! +! limitation of the available rainwater mixing ratio (RRWETH < RRS !) +! + ZZW1(:,4) = MAX( 0.0,MIN( ZZW1(:,6),ZRRS(:)+ZZW1(:,1) ) ) + ZZX(:) = ZZW1(:,4) / ZZW1(:,6) + ZZW1(:,2) = ZZW1(:,2)*ZZX(:) + ZZW1(:,3) = ZZW1(:,3)*ZZX(:) + ZZW1(:,5) = ZZW1(:,5)*ZZX(:) + ZZW(:) = ZZW1(:,4) + ZZW1(:,2) + ZZW1(:,3) + ZZW1(:,5) +! +!* 3.2.1 integrate the Wet growth of hail +! + ZRCS(:) = ZRCS(:) - ZZW1(:,1) + ZRIS(:) = ZRIS(:) - ZZW1(:,2) + ZRSS(:) = ZRSS(:) - ZZW1(:,3) + ZRGS(:) = ZRGS(:) - ZZW1(:,5) + ZRHS(:) = ZRHS(:) + ZZW(:) + ZRRS(:) = MAX( 0.0,ZRRS(:) - ZZW1(:,4) + ZZW1(:,1) ) + ZTHS(:) = ZTHS(:) + ZZW1(:,4)*(ZLSFACT(:)-ZLVFACT(:)) + ! f(L_f*(RCWETH+RRWETH)) +! + ZCCS(:) = MAX( ZCCS(:)-ZZW1(:,1)*(ZCCT(:)/MAX(ZRCT(:),XRTMIN(2))),0.0 ) + ZCIS(:) = MAX( ZCIS(:)-ZZW1(:,2)*(ZCIT(:)/MAX(ZRIT(:),XRTMIN(4))),0.0 ) + ZCRS(:) = MAX( ZCRS(:)-MAX( ZZW1(:,4)-ZZW1(:,1),0.0 ) & + *(ZCRT(:)/MAX(ZRRT(:),XRTMIN(3))),0.0 ) + END WHERE + + if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'WETH', & + Unpack( zths(:), mask = gmicro(:, :, :), field = pths(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'WETH', & + Unpack( zrcs(:), mask = gmicro(:, :, :), field = prcs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_end( tbudgets(NBUDGET_RR), 'WETH', & + Unpack( zrrs(:), mask = gmicro(:, :, :), field = prrs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'WETH', & + Unpack( zris(:), mask = gmicro(:, :, :), field = pris(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rs ) call Budget_store_end( tbudgets(NBUDGET_RS), 'WETH', & + Unpack( zrss(:), mask = gmicro(:, :, :), field = prss(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rg ) call Budget_store_end( tbudgets(NBUDGET_RG), 'WETH', & + Unpack( zrgs(:), mask = gmicro(:, :, :), field = prgs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rh ) call Budget_store_end( tbudgets(NBUDGET_RH), 'WETH', & + Unpack( zrhs(:), mask = gmicro(:, :, :), field = prhs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_sv ) then + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'WETH', & + Unpack( zccs(:), mask = gmicro(:, :, :), field = pccs(:, :, :) ) * prhodj(:, :, :) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nr), 'WETH', & + Unpack( zcrs(:), mask = gmicro(:, :, :), field = pcrs(:, :, :) ) * prhodj(:, :, :) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'WETH', & + Unpack( zcis(:), mask = gmicro(:, :, :), field = pcis(:, :, :) ) * prhodj(:, :, :) ) + end if + end if +END IF ! IHAIL>0 +! +! Partial reconversion of hail to graupel when rc and rh are small +! +! +!* 3.3 Conversion of the hailstones into graupel +! ----------------------------------------------- +! +IF ( IHAIL>0 ) THEN + if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_rg ) call Budget_store_init( tbudgets(NBUDGET_RG), 'COHG', & + Unpack( zrgs(:), mask = gmicro(:, :, :), field = prgs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rh ) call Budget_store_init( tbudgets(NBUDGET_RH), 'COHG', & + Unpack( zrhs(:), mask = gmicro(:, :, :), field = prhs(:, :, :) ) * prhodj(:, :, :) ) + end if + + ZTHRH=0.01E-3 + ZTHRC=0.001E-3 + ZZW(:) = 0.0 + WHERE( ZRHT(:)<ZTHRH .AND. ZRCT(:)<ZTHRC .AND. ZZT(:)<XTT ) + ZZW(:) = MIN( 1.0,MAX( 0.0,1.0-(ZRCT(:)/ZTHRC) ) ) +! +! assume a linear percent conversion rate of hail into graupel +! + ZZW(:) = ZRHS(:)*ZZW(:) + ZRGS(:) = ZRGS(:) + ZZW(:) ! partial conversion + ZRHS(:) = ZRHS(:) - ZZW(:) ! of hail into graupel +! + END WHERE + + if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_rg ) call Budget_store_end( tbudgets(NBUDGET_RG), 'COHG', & + Unpack( zrgs(:), mask = gmicro(:, :, :), field = prgs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rh ) call Budget_store_end( tbudgets(NBUDGET_RH), 'COHG', & + Unpack( zrhs(:), mask = gmicro(:, :, :), field = prhs(:, :, :) ) * prhodj(:, :, :) ) + end if +END IF +! +!* 3.4 Melting of the hailstones +! +IF ( IHAIL>0 ) THEN + if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'HMLT', & + Unpack( zths(:), mask = gmicro(:, :, :), field = pths(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_init( tbudgets(NBUDGET_RR), 'HMLT', & + Unpack( zrrs(:), mask = gmicro(:, :, :), field = prrs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rh ) call Budget_store_init( tbudgets(NBUDGET_RH), 'HMLT', & + Unpack( zrhs(:), mask = gmicro(:, :, :), field = prhs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_sv ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nr), 'HMLT', & + Unpack( zcrs(:), mask = gmicro(:, :, :), field = pcrs(:, :, :) ) * prhodj(:, :, :) ) + end if + + ZZW(:) = 0.0 + WHERE( GHAIL(:) .AND. (ZRHS(:)>XRTMIN(7)/PTSTEP) .AND. (ZRHT(:)>XRTMIN(7)) .AND. (ZZT(:)>XTT) ) + ZZW(:) = ZRVT(:)*ZPRES(:)/((XMV/XMD)+ZRVT(:)) ! Vapor pressure + ZZW(:) = ZKA(:)*(XTT-ZZT(:)) + & + ( ZDV(:)*(XLVTT + ( XCPV - XCL ) * ( ZZT(:) - XTT )) & + *(XESTT-ZZW(:))/(XRV*ZZT(:)) ) +! +! compute RHMLTR +! + ZZW(:) = MIN( ZRHS(:), MAX( 0.0,( -ZZW(:) * & + ( X0DEPH* ZLBDAH(:)**XEX0DEPH + & + X1DEPH*ZCJ(:)*ZLBDAH(:)**XEX1DEPH ) - & + ZZW1(:,6)*( ZRHODREF(:)*XCL*(XTT-ZZT(:))) ) / & + ( ZRHODREF(:)*XLMTT ) ) ) + ZRRS(:) = ZRRS(:) + ZZW(:) + ZRHS(:) = ZRHS(:) - ZZW(:) + ZTHS(:) = ZTHS(:) - ZZW(:)*(ZLSFACT(:)-ZLVFACT(:)) ! f(L_f*(-RHMLTR)) +! + ZCRS(:) = MAX( ZCRS(:) + ZZW(:)*(XCCH*ZLBDAH(:)**XCXH/ZRHT(:)),0.0 ) +! + END WHERE + + if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'HMLT', & + Unpack( zths(:), mask = gmicro(:, :, :), field = pths(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_end( tbudgets(NBUDGET_RR), 'HMLT', & + Unpack( zrrs(:), mask = gmicro(:, :, :), field = prrs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rh ) call Budget_store_end( tbudgets(NBUDGET_RH), 'HMLT', & + Unpack( zrhs(:), mask = gmicro(:, :, :), field = prhs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_sv ) call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nr), 'HMLT', & + Unpack( zcrs(:), mask = gmicro(:, :, :), field = pcrs(:, :, :) ) * prhodj(:, :, :) ) + end if +END IF + +END IF HAIL +! +!------------------------------------------------------------------------------ +! +END SUBROUTINE LIMA_MIXED_FAST_PROCESSES diff --git a/src/mesonh/micro/lima_mixed_slow_processes.f90 b/src/mesonh/micro/lima_mixed_slow_processes.f90 new file mode 100644 index 000000000..6ef9b55f5 --- /dev/null +++ b/src/mesonh/micro/lima_mixed_slow_processes.f90 @@ -0,0 +1,304 @@ +!MNH_LIC Copyright 2013-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ##################################### + MODULE MODI_LIMA_MIXED_SLOW_PROCESSES +! ##################################### +! +INTERFACE + SUBROUTINE LIMA_MIXED_SLOW_PROCESSES(ZRHODREF, ZZT, ZSSI, PTSTEP, & + ZLSFACT, ZLVFACT, ZAI, ZCJ, & + ZRGT, ZCIT, & + ZRVS, ZRCS, ZRIS, ZRGS, ZTHS, & + ZCCS, ZCIS, ZIFS, ZINS, & + ZLBDAI, ZLBDAG, & + PRHODJ1D, GMICRO, PRHODJ, KMI,& + PTHS, PRVS, PRCS, PRIS, PRGS, & + PCCS, PCIS, PINS ) +! +REAL, DIMENSION(:), INTENT(IN) :: ZRHODREF ! RHO Dry REFerence +REAL, DIMENSION(:), INTENT(IN) :: ZZT ! Temperature +REAL, DIMENSION(:), INTENT(IN) :: ZSSI ! Supersaturation over ice +REAL, INTENT(IN) :: PTSTEP ! Time-step +! +REAL, DIMENSION(:), INTENT(IN) :: ZLSFACT ! L_s/(Pi_ref*C_ph) +REAL, DIMENSION(:), INTENT(IN) :: ZLVFACT ! L_v/(Pi_ref*C_ph) +REAL, DIMENSION(:), INTENT(IN) :: ZAI ! Thermodynamical function +REAL, DIMENSION(:), INTENT(IN) :: ZCJ ! for the ventilation coefficient +! +REAL, DIMENSION(:), INTENT(IN) :: ZRGT ! Graupel/hail m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: ZCIT ! Pristine ice conc. at t +! +REAL, DIMENSION(:), INTENT(INOUT) :: ZRVS ! Water vapor m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZRCS ! Cloud water m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZRIS ! Pristine ice m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZRGS ! Graupel/hail m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZTHS ! Theta source +! +REAL, DIMENSION(:), INTENT(INOUT) :: ZCCS ! Cloud water conc. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZCIS ! Pristine ice conc. source +REAL, DIMENSION(:,:), INTENT(INOUT) :: ZIFS ! Free Ice nuclei conc. source +REAL, DIMENSION(:,:), INTENT(INOUT) :: ZINS ! Nucleated Ice nuclei conc. source +! +REAL, DIMENSION(:), INTENT(IN) :: ZLBDAI ! Slope parameter of the ice crystal distr. +REAL, DIMENSION(:), INTENT(IN) :: ZLBDAG ! Slope parameter of the graupel distr. +! +! used for budget storage +REAL, DIMENSION(:), INTENT(IN) :: PRHODJ1D +LOGICAL, DIMENSION(:,:,:), INTENT(IN) :: GMICRO +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ +INTEGER, INTENT(IN) :: KMI +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRIS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCCS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIS +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PINS +! +END SUBROUTINE LIMA_MIXED_SLOW_PROCESSES +END INTERFACE +END MODULE MODI_LIMA_MIXED_SLOW_PROCESSES +! +! ####################################################################### + SUBROUTINE LIMA_MIXED_SLOW_PROCESSES(ZRHODREF, ZZT, ZSSI, PTSTEP, & + ZLSFACT, ZLVFACT, ZAI, ZCJ, & + ZRGT, ZCIT, & + ZRVS, ZRCS, ZRIS, ZRGS, ZTHS, & + ZCCS, ZCIS, ZIFS, ZINS, & + ZLBDAI, ZLBDAG, & + PRHODJ1D, GMICRO, PRHODJ, KMI,& + PTHS, PRVS, PRCS, PRIS, PRGS, & + PCCS, PCIS, PINS ) +! ####################################################################### +! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the mixed-phase +!! slow processes : +!! +!! Deposition of water vapor on graupeln +!! Cloud ice Melting +!! Bergeron-Findeisen effect +!! +!!** METHOD +!! ------ +!! +!! REFERENCE +!! --------- +!! +!! Most of the parameterizations come from the ICE3 scheme, described in +!! the MESO-NH scientific documentation. +!! +!! Cohard, J.-M. and J.-P. Pinty, 2000: A comprehensive two-moment warm +!! microphysical bulk scheme. +!! Part I: Description and tests +!! Part II: 2D experiments with a non-hydrostatic model +!! Accepted for publication in Quart. J. Roy. Meteor. Soc. +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! C. Barthe * LACy * jan. 2014 add budgets +! P. Wautelet 03/2020: use the new data structures and subroutines for budgets +! P. Wautelet 02/02/2021: budgets: add missing source terms for SV budgets in LIMA +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +use modd_budget, only: lbu_enable, nbumod, & + lbudget_th, lbudget_rv, lbudget_rc, lbudget_rc, lbudget_ri, lbudget_rg, lbudget_sv, & + NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, NBUDGET_RC, NBUDGET_RI, NBUDGET_RG, NBUDGET_SV1, & + tbudgets +USE MODD_CST, ONLY : XTT, XALPI, XBETAI, XGAMI, & + XALPW, XBETAW, XGAMW +USE MODD_NSV +USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCTMIN, NMOD_IFN, LSNOW +USE MODD_PARAM_LIMA_COLD, ONLY : XDI, X0DEPI, X2DEPI, XSCFAC +USE MODD_PARAM_LIMA_MIXED, ONLY : XLBG, XLBEXG, XLBDAG_MAX, & + X0DEPG, XEX0DEPG, X1DEPG, XEX1DEPG +use mode_budget, only: Budget_store_add, Budget_store_init, Budget_store_end + +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +REAL, DIMENSION(:), INTENT(IN) :: ZRHODREF ! RHO Dry REFerence +REAL, DIMENSION(:), INTENT(IN) :: ZZT ! Temperature +REAL, DIMENSION(:), INTENT(IN) :: ZSSI ! Supersaturation over ice +REAL, INTENT(IN) :: PTSTEP ! Time-step +! +REAL, DIMENSION(:), INTENT(IN) :: ZLSFACT ! L_s/(Pi_ref*C_ph) +REAL, DIMENSION(:), INTENT(IN) :: ZLVFACT ! L_v/(Pi_ref*C_ph) +REAL, DIMENSION(:), INTENT(IN) :: ZAI ! Thermodynamical function +REAL, DIMENSION(:), INTENT(IN) :: ZCJ ! for the ventilation coefficient +! +REAL, DIMENSION(:), INTENT(IN) :: ZRGT ! Graupel/hail m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: ZCIT ! Pristine ice conc. at t +! +REAL, DIMENSION(:), INTENT(INOUT) :: ZRVS ! Water vapor m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZRCS ! Cloud water m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZRIS ! Pristine ice m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZRGS ! Graupel/hail m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZTHS ! Theta source +! +REAL, DIMENSION(:), INTENT(INOUT) :: ZCCS ! Cloud water conc. source +REAL, DIMENSION(:), INTENT(INOUT) :: ZCIS ! Pristine ice conc. source +REAL, DIMENSION(:,:), INTENT(INOUT) :: ZIFS ! Free Ice nuclei conc. source +REAL, DIMENSION(:,:), INTENT(INOUT) :: ZINS ! Nucleated Ice nuclei conc. source +! +REAL, DIMENSION(:), INTENT(IN) :: ZLBDAI ! Slope parameter of the ice crystal distr. +REAL, DIMENSION(:), INTENT(IN) :: ZLBDAG ! Slope parameter of the graupel distr. +! +! used for budget storage +REAL, DIMENSION(:), INTENT(IN) :: PRHODJ1D +LOGICAL, DIMENSION(:,:,:), INTENT(IN) :: GMICRO +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ +INTEGER, INTENT(IN) :: KMI +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRIS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCCS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIS +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PINS +! +!* 0.2 Declarations of local variables : +! +REAL, DIMENSION(SIZE(ZZT)) :: ZZW, ZMASK ! Work vectors +! +INTEGER :: JMOD_IFN +! +!------------------------------------------------------------------------------- +! +!* 1 Deposition of water vapor on r_g: RVDEPG +! --------------------------------------------- +! +! +IF (LSNOW) THEN + ZZW(:) = 0.0 + WHERE ( (ZRGT(:)>XRTMIN(6)) .AND. (ZRGS(:)>XRTMIN(6)/PTSTEP) ) + ZZW(:) = ( ZSSI(:)/ZAI(:)/ZRHODREF(:) ) * & + ( X0DEPG*ZLBDAG(:)**XEX0DEPG + X1DEPG*ZCJ(:)*ZLBDAG(:)**XEX1DEPG ) + ZZW(:) = MIN( ZRVS(:),ZZW(:) )*(0.5+SIGN(0.5,ZZW(:))) & + - MIN( ZRGS(:),ABS(ZZW(:)) )*(0.5-SIGN(0.5,ZZW(:))) + ZRGS(:) = ZRGS(:) + ZZW(:) + ZRVS(:) = ZRVS(:) - ZZW(:) + ZTHS(:) = ZTHS(:) + ZZW(:)*ZLSFACT(:) + END WHERE +! +! Budget storage + if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_th ) call Budget_store_add( tbudgets(NBUDGET_TH), 'DEPG', & + Unpack( zzw(:) * zlsfact(:) * prhodj1d(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rv ) call Budget_store_add( tbudgets(NBUDGET_RV), 'DEPG', & + Unpack( -zzw(:) * prhodj1d(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rg ) call Budget_store_add( tbudgets(NBUDGET_RG), 'DEPG', & + Unpack( zzw(:) * prhodj1d(:), mask = gmicro(:, :, :), field = 0. ) ) + end if +END IF +! +! +!* 2 cloud ice Melting: RIMLTC and CIMLTC +! ----------------------------------------- +! + if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'IMLT', & + Unpack( zths(:), mask = gmicro(:, :, :), field = pths(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'IMLT', prcs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), 'IMLT', pris(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_sv ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'IMLT', pccs(:, :, :) * prhodj(:, :, :) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'IMLT', pcis(:, :, :) * prhodj(:, :, :) ) + do jmod_ifn = 1,nmod_ifn + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ifn_nucl + jmod_ifn - 1), 'IMLT', & + pins(:, :, :, jmod_ifn) * prhodj(:, :, :) ) + enddo + end if + end if + + ZMASK(:) = 1.0 + WHERE( (ZRIS(:)>XRTMIN(4)/PTSTEP) .AND. (ZZT(:)>XTT) ) + ZRCS(:) = ZRCS(:) + ZRIS(:) + ZTHS(:) = ZTHS(:) - ZRIS(:)*(ZLSFACT(:)-ZLVFACT(:)) ! f(L_f*(-RIMLTC)) + ZRIS(:) = 0.0 +! + ZCCS(:) = ZCCS(:) + ZCIS(:) + ZCIS(:) = 0.0 + ZMASK(:)= 0.0 + END WHERE + DO JMOD_IFN = 1,NMOD_IFN +! Correction BVIE aerosols not released but in droplets +! ZIFS(:,JMOD_IFN) = ZIFS(:,JMOD_IFN) + ZINS(:,JMOD_IFN)*(1.-ZMASK(:)) + ZINS(:,JMOD_IFN) = ZINS(:,JMOD_IFN) * ZMASK(:) + ENDDO +! +! Budget storage + if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'IMLT', & + Unpack( zths(:), mask = gmicro(:, :, :), field = pths(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'IMLT', & + Unpack( zrcs(:), mask = gmicro(:, :, :), field = prcs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'IMLT', & + Unpack( zris(:), mask = gmicro(:, :, :), field = pris(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_sv ) then + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'IMLT', & + Unpack( zccs(:), mask = gmicro(:, :, :), field = pccs(:, :, :) ) * prhodj(:, :, :) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'IMLT', & + Unpack( zcis(:), mask = gmicro(:, :, :), field = pcis(:, :, :) ) * prhodj(:, :, :) ) + do jmod_ifn = 1,nmod_ifn + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ifn_nucl + jmod_ifn - 1), 'IMLT', & + Unpack( zins(:, jmod_ifn), mask = gmicro(:, :, :), field = pins(:, :, :, jmod_ifn) ) * prhodj(:, :, :) ) + enddo + end if + end if +! +!* 3 Bergeron-Findeisen effect: RCBERI +! -------------------------------------- +! + if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'BERFI', & + Unpack( zths(:), mask = gmicro(:, :, :), field = pths(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'BERFI', & + Unpack( zrcs(:), mask = gmicro(:, :, :), field = prcs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), 'BERFI', & + Unpack( zris(:), mask = gmicro(:, :, :), field = pris(:, :, :) ) * prhodj(:, :, :) ) + end if + + ZZW(:) = 0.0 + WHERE( (ZRCS(:)>XRTMIN(2)/PTSTEP) .AND. (ZRIS(:)>XRTMIN(4)/PTSTEP) .AND. (ZCIT(:)>XCTMIN(4)) ) + ZZW(:) = EXP( (XALPW-XALPI) - (XBETAW-XBETAI)/ZZT(:) & + - (XGAMW-XGAMI)*ALOG(ZZT(:)) ) -1.0 + ! supersaturation of saturated water over ice + ZZW(:) = MIN( ZRCS(:),( ZZW(:) / ZAI(:) ) * ZCIT(:) * & + ( X0DEPI/ZLBDAI(:)+X2DEPI*ZCJ(:)*ZCJ(:)/ZLBDAI(:)**(XDI+2.0) ) ) + ZRCS(:) = ZRCS(:) - ZZW(:) + ZRIS(:) = ZRIS(:) + ZZW(:) + ZTHS(:) = ZTHS(:) + ZZW(:)*(ZLSFACT(:)-ZLVFACT(:)) ! f(L_f*(RCBERI)) + END WHERE +! +! Budget storage + if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'BERFI', & + Unpack( zths(:), mask = gmicro(:, :, :), field = pths(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'BERFI', & + Unpack( zrcs(:), mask = gmicro(:, :, :), field = prcs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'BERFI', & + Unpack( zris(:), mask = gmicro(:, :, :), field = pris(:, :, :) ) * prhodj(:, :, :) ) + end if +!------------------------------------------------------------------------------ +! +END SUBROUTINE LIMA_MIXED_SLOW_PROCESSES diff --git a/src/mesonh/micro/lima_mixrat_to_nconc.f90 b/src/mesonh/micro/lima_mixrat_to_nconc.f90 new file mode 100644 index 000000000..f21a1afe2 --- /dev/null +++ b/src/mesonh/micro/lima_mixrat_to_nconc.f90 @@ -0,0 +1,192 @@ +!MNH_LIC Copyright 2016-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ################################ + MODULE MODI_LIMA_MIXRAT_TO_NCONC +! ################################ +INTERFACE +SUBROUTINE LIMA_MIXRAT_TO_NCONC(PPABST, PTHT, PRVT, PSVT) +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! Absolute pressure +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Potential temperature +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVT ! Water Vapor mix. ratio +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT ! Mixing ratios IN, conc. OUT +! +END SUBROUTINE LIMA_MIXRAT_TO_NCONC +END INTERFACE +END MODULE MODI_LIMA_MIXRAT_TO_NCONC +! +! ######################################################## + SUBROUTINE LIMA_MIXRAT_TO_NCONC(PPABST, PTHT, PRVT, PSVT) +! ######################################################## +! +! +!!**** *LIMA_MIXRAT_TO_NCONC* - converts CAMS aerosol mixing ratios into +!! number concentrations +!! +!! PURPOSE +!! ------- +!! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! MODIFICATIONS +!! ------------- +!! Original 23/01/16 (J.-P. Pinty) +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! +USE MODD_CST, ONLY : XP00, XMD, XMV, XRD, XCPD, XTT, XPI, XRHOLW, & + XALPW, XBETAW, XGAMW, XALPI, XBETAI, XGAMI +USE MODD_NSV, ONLY : NSV_LIMA_CCN_FREE, NSV_LIMA_IFN_FREE +USE MODD_PARAM_LIMA, ONLY : NMOD_CCN, NMOD_IFN, & + XR_MEAN_CCN, XLOGSIG_CCN, XRHO_CCN, & + XMDIAM_IFN, XSIGMA_IFN, XRHO_IFN, & + NSPECIE, XFRAC, & + CCCN_MODES, CIFN_SPECIES +! +IMPLICIT NONE +! +!* 0.1. Declaration of arguments +! ------------------------ +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! Absolute pressure +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Potential temperature +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVT ! Water Vapor mix. ratio +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT ! Mixing ratios IN, conc. OUT +! +!* 0.2 Declaration of local variables +! ------------------------------ +! +REAL,DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: ZT ! Temperature +REAL,DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: ZREHU ! Relat. Humid. +REAL,DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: ZGROWTH_FACT +REAL,DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: ZRHO_CCN_WET +REAL,DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: ZWORK +! +INTEGER :: JLOC, JCCN, JIFN, JSPECIE +REAL :: ZFACT_CCN, ZFACT_IFN +! +!---------------------------------------------------------------------- +! +! Temperature to compute the relative humidity +! +ZT(:,:,:) = PTHT(:,:,:)*(PPABST(:,:,:)/XP00)**(XRD/XCPD) +ZWORK(:,:,:) = PRVT(:,:,:)*PPABST(:,:,:)/((XMV/XMD)+PRVT(:,:,:)) + ! water vapor partial pressure +ZREHU(:,:,:) = ZWORK(:,:,:)/EXP( XALPW-XBETAW/ZT(:,:,:)-XGAMW*ALOG(ZT(:,:,:)) ) + ! saturation over water +WHERE ( ZT(:,:,:)<XTT ) + ZREHU(:,:,:) = ZWORK(:,:,:)/EXP(XALPI-XBETAI/ZT(:,:,:)-XGAMI*ALOG(ZT(:,:,:))) + ! saturation over ice +END WHERE +ZREHU(:,:,:) = MIN( 0.99, MAX( 0.01,ZREHU(:,:,:) ) ) +! +! All size distribution parameters are XLOGSIG_CCN and XR_MEAN_CCN (radii) +! Treatment of the soluble aerosols (CCN) +! +! All CAMS aerosol mr are given for dry particles, except for sea-salt (given at Hu=80%) +! +! + +!IF( NAERO_TYPE=="CCN" ) THEN +! +! sea-salt, sulfate, hydrophilic (GADS data) +! +! NMOD_CCN=3 + IF (.NOT.(ALLOCATED(XR_MEAN_CCN))) ALLOCATE(XR_MEAN_CCN(NMOD_CCN)) + IF (.NOT.(ALLOCATED(XLOGSIG_CCN))) ALLOCATE(XLOGSIG_CCN(NMOD_CCN)) + IF (.NOT.(ALLOCATED(XRHO_CCN))) ALLOCATE(XRHO_CCN(NMOD_CCN)) + IF( CCCN_MODES=='CAMS_ACC') THEN + XR_MEAN_CCN(:) = (/ 0.2E-6 , 0.5E-6 , 0.4E-6 /) + XLOGSIG_CCN(:) = (/ 0.693 , 0.476 , 0.788 /) + XRHO_CCN(:) = (/ 2200. , 1700. , 1800. /) + END IF +! + IF( CCCN_MODES=='CAMS_AIT') THEN + XR_MEAN_CCN(:) = (/ 0.2E-6 , 0.05E-6 , 0.02E-6 /) + XLOGSIG_CCN(:) = (/ 0.693 , 0.693 , 0.788 /) + XRHO_CCN(:) = (/ 2200. , 1700. , 1800. /) + END IF +! +DO JCCN = 1,NMOD_CCN +! + JLOC = NSV_LIMA_CCN_FREE + JCCN-1 ! CCN free then CCN acti +! + ZFACT_CCN = ( (0.75/XPI)*EXP(-4.5*(XLOGSIG_CCN(JCCN))**2) )/XR_MEAN_CCN(JCCN)**3 +! +! JCCN=1 is for Sea Salt +! JCCN=2 is for Sulphate +! JCCN=3 is for Hydrophilic OC and BC (sulphate coating) +! + IF( JCCN==1 ) THEN ! Sea salt : convert mass at Hu=80% to dry mass + PSVT(:,:,:,JLOC) = PSVT(:,:,:,JLOC) / 4.302 + END IF +! +! compute the CCN number concentration +! +! Pourquoi 0.5* ? +! PSVT(:,:,:,JLOC) =0.5* ZFACT_CCN*(PSVT(:,:,:,JLOC)/XRHO_CCN(JCCN)) ! Result + PSVT(:,:,:,JLOC) = ZFACT_CCN*(PSVT(:,:,:,JLOC)/XRHO_CCN(JCCN)) ! Result + ! is in #/Kg of dry air +END DO +! +! All size distribution parameters are XSIGMA_IFN and XMDIAM_IFN (diameters) +! Treatment of the insoluble aerosols (IFN) +! +!ELSE IF( NAERO_TYPE=="IFN" ) THEN +! +! dust, hydrophobic BIO+ORGA (GADS data) +! +! NMOD_IFN=2 + NSPECIE=4 + IF (.NOT.(ALLOCATED(XMDIAM_IFN))) ALLOCATE(XMDIAM_IFN(NSPECIE)) + IF (.NOT.(ALLOCATED(XSIGMA_IFN))) ALLOCATE(XSIGMA_IFN(NSPECIE)) + IF (.NOT.(ALLOCATED(XRHO_IFN))) ALLOCATE(XRHO_IFN(NSPECIE)) + IF( CIFN_SPECIES=='CAMS_ACC') THEN + XMDIAM_IFN = (/0.8E-6, 3.0E-6, 0.04E-6, 0.8E-6 /) + XSIGMA_IFN = (/2.0, 2.15, 2.0, 2.2 /) + XRHO_IFN = (/2600., 2600., 1000., 2000. /) + END IF + IF( CIFN_SPECIES=='CAMS_AIT') THEN + XMDIAM_IFN = (/0.8E-6, 3.0E-6, 0.04E-6, 0.04E-6/) + XSIGMA_IFN = (/2.0, 2.15, 2.0, 2.2 /) + XRHO_IFN = (/2600., 2600., 1000., 1800./) + END IF + IF (.NOT.(ALLOCATED(XFRAC))) ALLOCATE(XFRAC(NSPECIE,NMOD_IFN)) + XFRAC(1,1)=1.0 + XFRAC(2,1)=0.0 + XFRAC(3,1)=0.0 + XFRAC(4,1)=0.0 + XFRAC(1,2)=0.0 + XFRAC(2,2)=0.0 + XFRAC(3,2)=0.0 + XFRAC(4,2)=1.0 +! +DO JIFN = 1,NMOD_IFN +! +! compute the number concentration assuming no deposition of water +! IFN are considered as insoluble dry aerosols +! + ZFACT_IFN = 0.0 + DO JSPECIE = 1,NSPECIE ! Conversion factor is weighted by XFRAC + ZFACT_IFN = ZFACT_IFN + XFRAC(JSPECIE,JIFN)* & + ( (6/XPI)*EXP(-(9.0/2.0)*LOG(XSIGMA_IFN(JSPECIE))**2) ) / & + ( XRHO_IFN(JSPECIE)*XMDIAM_IFN(JSPECIE)**3 ) + END DO + JLOC = NSV_LIMA_IFN_FREE + JIFN-1 ! IFN free then IFN nucl +! Pourquoi 0.5* ? +! PSVT(:,:,:,JLOC) = 0.5* ZFACT_IFN*PSVT(:,:,:,JLOC) ! Result is in #/Kg of dry air + PSVT(:,:,:,JLOC) = ZFACT_IFN*PSVT(:,:,:,JLOC) ! Result is in #/Kg of dry air +END DO +! +END SUBROUTINE LIMA_MIXRAT_TO_NCONC diff --git a/src/mesonh/micro/lima_notadjust.f90 b/src/mesonh/micro/lima_notadjust.f90 new file mode 100644 index 000000000..94ea1f4fd --- /dev/null +++ b/src/mesonh/micro/lima_notadjust.f90 @@ -0,0 +1,624 @@ +!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ########################## + MODULE MODI_LIMA_NOTADJUST +! ########################## +! +INTERFACE +! + SUBROUTINE LIMA_NOTADJUST(KMI, TPFILE, HRAD, & + PTSTEP, PRHODJ, PPABSM, PPABST, PRHODREF, PEXNREF, PZZ, & + PTHT,PRT, PSVT, PTHS, PRS,PSVS, PCLDFR, PSRCS ) +! +USE MODD_IO, ONLY: TFILEDATA +! +INTEGER, INTENT(IN) :: KMI ! Model index +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +CHARACTER(len=4), INTENT(IN) :: HRAD ! Radiation scheme name +REAL, INTENT(IN) :: PTSTEP ! Double Time step + ! (single if cold start) +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! Absolute Pressure at t-dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! Absolute Pressure at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Reference density +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! m.r. at t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT ! Concentrations source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRS ! m.r. source +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVS ! Concentrations source +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSRCS ! Second-order flux + ! s'rc'/2Sigma_s2 at time t+1 + ! multiplied by Lambda_3 +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PCLDFR ! Cloud fraction +! +! +END SUBROUTINE LIMA_NOTADJUST +! +END INTERFACE +! +END MODULE MODI_LIMA_NOTADJUST +! +! #################################################################################### + SUBROUTINE LIMA_NOTADJUST(KMI, TPFILE, HRAD, & + PTSTEP, PRHODJ, PPABSM, PPABST, PRHODREF, PEXNREF, PZZ, & + PTHT,PRT, PSVT, PTHS, PRS,PSVS, PCLDFR, PSRCS ) +! #################################################################################### +! +!!**** * - compute pseudo-prognostic of supersaturation according to Thouron +! et al. 2012 +!! PURPOSE +!! ------- +!! +!!** METHOD +!! +!! REFERENCE +!! --------- +!! +!! Thouron, O., J.-L. Brenguier, and F. Burnet, Supersaturation calculation +!! in large eddy simulation models for prediction of the droplet number +!! concentration, Geosci. Model Dev., 5, 761-772, 2012. +!! +!! AUTHOR +!! ------ +!! B.Vie forked from lima_adjust.f90 +!! +!! MODIFICATIONS +!! ------------- +! +!* 0. DECLARATIONS +! +use modd_budget, only: lbu_enable, nbumod, & + lbudget_th, lbudget_rv, lbudget_rc, lbudget_ri, lbudget_sv, & + NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, NBUDGET_RI, NBUDGET_SV1, & + tbudgets +USE MODD_CONF +USE MODD_CST +USE MODD_FIELD, ONLY: TFIELDDATA,TYPEREAL +USE MODD_IO, ONLY: TFILEDATA +USE MODD_LUNIT_n, ONLY: TLUOUT +USE MODD_NSV +USE MODD_PARAMETERS +USE MODD_PARAM_LIMA +USE MODD_PARAM_LIMA_COLD + +! +use mode_budget, only: Budget_store_init, Budget_store_end +USE MODE_IO_FIELD_WRITE, only: IO_Field_write +USE MODE_MSG +use mode_tools, only: Countjv +use mode_tools_ll, only: GET_INDICE_ll +! +USE MODI_PROGNOS_LIMA +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +! +INTEGER, INTENT(IN) :: KMI ! Model index +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +CHARACTER(len=4), INTENT(IN) :: HRAD ! Radiation scheme name +REAL, INTENT(IN) :: PTSTEP ! Double Time step + ! (single if cold start) +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! Absolute Pressure at t-dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! Absolute Pressure at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Reference density +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! m.r. at t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT ! Concentrations source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRS ! m.r. source +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVS ! Concentrations source +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSRCS ! Second-order flux + ! s'rc'/2Sigma_s2 at time t+1 + ! multiplied by Lambda_3 +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PCLDFR ! Cloud fraction +! +! +!* 0.2 Declarations of local variables : +! +! +! +INTEGER :: IRESP ! Return code of FM routines +INTEGER :: ILUOUT ! Logical unit of output listing + +! For Activation : +LOGICAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: GNUCT, GMICRO ! Test where to compute the HEN process +INTEGER , DIMENSION(SIZE(GNUCT)) :: I1,I2,I3 ! Used to replace the COUNT +INTEGER :: JL, JMOD ! and PACK intrinsics +REAL, DIMENSION(:), ALLOCATABLE ::ZPRES,ZRHOD,ZRR,ZTT,ZRV,ZRC,ZS0,ZCCL, & + ZZDZ, ZZLV, ZZCPH, & + ZRVT, ZRIT, ZCIT, ZRVS, ZRIS, ZCIS, & + ZTHS, ZRHODREF, ZZT, ZEXNREF, ZZW, & + ZLSFACT, ZRVSATI, ZRVSATI_PRIME, & + ZDELTI, ZAI, ZKA, ZDV, ZITI, ZAII, ZDEP, & + ZCJ +! +INTEGER :: INUCT +INTEGER :: IMICRO +INTEGER :: IIB ! Define the domain where +INTEGER :: IIE ! the microphysical sources have to be computed +INTEGER :: IJB ! +INTEGER :: IJE ! +INTEGER :: IKB ! +INTEGER :: IKE ! + +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) ::& + ZEXNT,ZEXNS,ZT,ZRVSAT,ZWORK,ZLV,ZLS,ZCPH, ZW1, & + ZDZ, ZW +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) ::& + ZSAT,ZCCS +INTEGER :: JK ! For loop +integer :: idx +TYPE(TFIELDDATA) :: TZFIELD +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZNFS ! CCN C. available source +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZNAS ! Cloud C. nuclei C. source +REAL, DIMENSION(:,:), ALLOCATABLE :: ZZNFS ! CCN C. available source +REAL, DIMENSION(:,:), ALLOCATABLE :: ZZNAS ! Cloud C. nuclei C. source +REAL :: ZEPS + +!------------------------------------------------------------------------------- +! +!* 1. PRELIMINARIES +! ------------- +! +ILUOUT = TLUOUT%NLU +CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) +IKB=1+JPVEXT +IKE=SIZE(PZZ,3) - JPVEXT +! +!------------------------------------------------------------------------------- +if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'CEDS', pths(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rv ) call Budget_store_init( tbudgets(NBUDGET_RV), 'CEDS', prs(:, :, :, 1) * prhodj(:, :, :) ) + if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'CEDS', prs(:, :, :, 2) * prhodj(:, :, :) ) + if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), 'CEDS', prs(:, :, :, 4) * prhodj(:, :, :) ) + if ( lbudget_sv ) then + if ( lwarm ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'CEDS', psvs(:, :, :, nsv_lima_nc) * prhodj(:, :, :) ) + do jl = nsv_lima_ccn_free, nsv_lima_ccn_free + nmod_ccn - 1 + idx = NBUDGET_SV1 - 1 + jl + call Budget_store_init( tbudgets(idx), 'CEDS', psvs(:, :, :, jl) * prhodj(:, :, :) ) + end do + do jl = nsv_lima_ccn_acti, nsv_lima_ccn_acti + nmod_ccn - 1 + idx = NBUDGET_SV1 - 1 + jl + call Budget_store_init( tbudgets(idx), 'CEDS', psvs(:, :, :, jl) * prhodj(:, :, :) ) + end do + end if +! if ( lscav .and. laero_mass ) & +! call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_scavmass), 'CEDS', psvs(:, :, :, nsv_lima_scavmass) & +! * prhodj(:, :, :) ) +! if ( lcold ) then +! call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'CEDS', psvs(:, :, :, nsv_lima_ni) * prhodj(:, :, :) ) +! do jl = 1, nsv_lima_ifn_free, nsv_lima_ifn_free + nmod_ifn - 1 +! idx = NBUDGET_SV1 - 1 + jl +! call Budget_store_init( tbudgets(idx), 'CEDS', psvs(:, :, :, jl) * prhodj(:, :, :) ) +! end do +! do jl = 1, nsv_lima_ifn_nucl, nsv_lima_ifn_nucl + nmod_ifn - 1 +! idx = NBUDGET_SV1 - 1 + jl +! call Budget_store_init( tbudgets(idx), 'CEDS', psvs(:, :, :, jl) * prhodj(:, :, :) ) +! end do +! do jl = 1, nsv_lima_imm_nucl, nsv_lima_imm_nucl + nmod_ifn - 1 +! idx = NBUDGET_SV1 - 1 + jl +! call Budget_store_init( tbudgets(idx), 'CEDS', psvs(:, :, :, jl) * prhodj(:, :, :) ) +! end do +! end if + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_spro), 'CEDS', psvs(:, :, :, nsv_lima_spro) * prhodj(:, :, :) ) + end if +end if +! +!* 2. COMPUTE QUANTITIES WITH THE GUESS OF THE FUTURE INSTANT +! ------------------------------------------------------- +! +!* 2.1 remove negative non-precipitating negative water +! ------------------------------------------------ +! +IF (ANY(PRS(:,:,:,2) < 0. .OR. PSVS(:,:,:,NSV_LIMA_NC) < 0.)) THEN + WRITE(ILUOUT,*) 'LIMA_NOTADJUST beginning: negative values of PRCS or PCCS' + WRITE(ILUOUT,*) ' location of minimum of PRCS:', MINLOC(PRS(:,:,:,2)) + WRITE(ILUOUT,*) ' value of minimum :', MINVAL(PRS(:,:,:,2)) + WRITE(ILUOUT,*) ' location of minimum of PCCS:', MINLOC(PSVS(:,:,:,NSV_LIMA_NC)) + WRITE(ILUOUT,*) ' value of minimum :', MINVAL(PSVS(:,:,:,NSV_LIMA_NC)) +END IF +! +IF (ANY(PRS(:,:,:,2)+PRS(:,:,:,1) < 0.) .AND. NVERB>5) THEN + WRITE(ILUOUT,*) 'LIMA_NOT_ADJUST: negative values of total water (reset to zero)' + WRITE(ILUOUT,*) ' location of minimum:', MINLOC(PRS(:,:,:,2)+PRS(:,:,:,1)) + WRITE(ILUOUT,*) ' value of minimum :', MINVAL(PRS(:,:,:,2)+PRS(:,:,:,1)) +!callabortstop + CALL PRINT_MSG(NVERB_FATAL,'GEN','LIMA_NOTADJUST','') +END IF +! +! +!* 2.2 estimate the Exner function at t+1 and t respectively +! +ZEXNS(:,:,:)=((2.* PPABST(:,:,:)-PPABSM(:,:,:))/XP00 )**(XRD/XCPD) +ZEXNT(:,:,:)=(PPABST(:,:,:)/XP00 )**(XRD/XCPD) +!sources terms *dt +PRS(:,:,:,:) = PRS(:,:,:,:) * PTSTEP +PSVS(:,:,:,:) = PSVS(:,:,:,:) * PTSTEP +ZSAT(:,:,:) = PSVS(:,:,:,NSV_LIMA_SPRO)-1.0 +ZCCS(:,:,:) = PSVS(:,:,:,NSV_LIMA_NC) +IF ( NMOD_CCN .GE. 1 ) THEN + ALLOCATE( ZNFS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),NMOD_CCN) ) + ALLOCATE( ZNAS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),NMOD_CCN) ) + ZNFS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_CCN_FREE:NSV_LIMA_CCN_FREE+NMOD_CCN-1) + ZNAS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_CCN_ACTI:NSV_LIMA_CCN_ACTI+NMOD_CCN-1) +ELSE + ALLOCATE( ZNFS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),1) ) + ALLOCATE( ZNAS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),1) ) + ZNFS(:,:,:,:) = 0. + ZNAS(:,:,:,:) = 0. +END IF +ZW(:,:,:)=SUM(ZNAS,4) +! +!state temperature at t+dt +PTHS(:,:,:) = PTHS(:,:,:) * PTSTEP * ZEXNS(:,:,:) + +!state temperature at t +ZT(:,:,:)=PTHT(:,:,:)*ZEXNT(:,:,:) +!Lv and Cph at t +ZLV(:,:,:) = XLVTT+(XCPV-XCL)*(ZT(:,:,:)-XTT) +ZLS(:,:,:) = XLSTT + ( XCPV - XCI ) * ( ZT(:,:,:) -XTT ) +ZCPH(:,:,:)= XCPD+XCPV*PRT(:,:,:,1)+XCL*(PRT(:,:,:,2)+PRT(:,:,:,3)) & + +XCI*(PRT(:,:,:,4)+PRT(:,:,:,5)+PRT(:,:,:,6)) +!dz +DO JK=1,IKE + ZDZ(:,:,JK)=PZZ(:,:,JK+1)-PZZ(:,:,JK) +END DO +! +!* 2.3 compute the latent heat of vaporization Lv(T*) at t+1 +! +!Removed negligible values +! +WHERE ( ((PRS(:,:,:,2).LT.XRTMIN(2)) .AND. (ZSAT(:,:,:).LT.0.0)) .OR. & + ((PRS(:,:,:,2).GT.0.0) .AND. (ZCCS(:,:,:).LE.0.0)) ) + PTHS(:,:,:) = PTHS(:,:,:)-(ZLV(:,:,:)/ZCPH(:,:,:))*PRS(:,:,:,2) + PRS(:,:,:,1) = PRS(:,:,:,1)+PRS(:,:,:,2) + PRS(:,:,:,2) = 0.0 +!ZSAT(:,:,:) = 0.0 + ZCCS(:,:,:) = 0.0 +!ZNFS(:,:,:,1:NMOD_CCN) = ZNFS(:,:,:,1:NMOD_CCN) + ZNAS(:,:,:,1:NMOD_CCN) +!ZNAS(:,:,:,1:NMOD_CCN) = 0. +END WHERE +! + + +! +! Ice deposition/sublimation +! +ZEPS= XMV / XMD +GMICRO(:,:,:)=.FALSE. +GMICRO(IIB:IIE,IJB:IJE,IKB:IKE) = (PRS(IIB:IIE,IJB:IJE,IKB:IKE,4)>XRTMIN(4)/PTSTEP .AND. & + PSVS(IIB:IIE,IJB:IJE,IKB:IKE,NSV_LIMA_NI)>XCTMIN(4)/PTSTEP ) +IMICRO = COUNTJV( GMICRO(:,:,:),I1(:),I2(:),I3(:)) +IF( IMICRO >= 1 .AND. .NOT.LPTSPLIT) THEN + ALLOCATE(ZRVT(IMICRO)) + ALLOCATE(ZRIT(IMICRO)) + ALLOCATE(ZCIT(IMICRO)) +! + ALLOCATE(ZRVS(IMICRO)) + ALLOCATE(ZRIS(IMICRO)) + ALLOCATE(ZCIS(IMICRO)) !!!BVIE!!! + ALLOCATE(ZTHS(IMICRO)) +! + ALLOCATE(ZRHODREF(IMICRO)) + ALLOCATE(ZZT(IMICRO)) + ALLOCATE(ZPRES(IMICRO)) + ALLOCATE(ZEXNREF(IMICRO)) + ALLOCATE(ZZCPH(IMICRO)) + DO JL=1,IMICRO + ZRVT(JL) = PRT(I1(JL),I2(JL),I3(JL),1) + ZRIT(JL) = PRT(I1(JL),I2(JL),I3(JL),4) + ZCIT(JL) = PSVT(I1(JL),I2(JL),I3(JL),NSV_LIMA_NI) +! + ZRVS(JL) = PRS(I1(JL),I2(JL),I3(JL),1) + ZRIS(JL) = PRS(I1(JL),I2(JL),I3(JL),4) + ZCIS(JL) = PSVS(I1(JL),I2(JL),I3(JL),NSV_LIMA_NI) !!!BVIE!!! + ZTHS(JL) = PTHS(I1(JL),I2(JL),I3(JL)) +! + ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) + ZZT(JL) = ZT(I1(JL),I2(JL),I3(JL)) + ZPRES(JL) = 2.0*PPABST(I1(JL),I2(JL),I3(JL))-PPABSM(I1(JL),I2(JL),I3(JL)) + ZEXNREF(JL) = PEXNREF(I1(JL),I2(JL),I3(JL)) + ZZCPH(JL) = ZCPH(I1(JL),I2(JL),I3(JL)) + ENDDO + ALLOCATE(ZZW(IMICRO)) + ALLOCATE(ZLSFACT(IMICRO)) + ZLSFACT(:) = (XLSTT+(XCPV-XCI)*(ZZT(:)-XTT))/ZZCPH(:) ! L_s/C_ph + ALLOCATE(ZRVSATI(IMICRO)) + ALLOCATE(ZRVSATI_PRIME(IMICRO)) + ALLOCATE(ZDELTI(IMICRO)) + ALLOCATE(ZAI(IMICRO)) + ALLOCATE(ZCJ(IMICRO)) + ALLOCATE(ZKA(IMICRO)) + ALLOCATE(ZDV(IMICRO)) + ALLOCATE(ZITI(IMICRO)) +! + ZKA(:) = 2.38E-2 + 0.0071E-2 * ( ZZT(:) - XTT ) ! k_a + ZDV(:) = 0.211E-4 * (ZZT(:)/XTT)**1.94 * (XP00/ZPRES(:)) ! D_v + ZCJ(:) = XSCFAC * ZRHODREF(:)**0.3 / SQRT( 1.718E-5+0.0049E-5*(ZZT(:)-XTT) ) +! + ZZW(:) = EXP( XALPI - XBETAI/ZZT(:) - XGAMI*ALOG(ZZT(:) ) ) ! es_i + ZRVSATI(:) = ZEPS*ZZW(:) / ( ZPRES(:)-ZZW(:) ) ! r_si + ZRVSATI_PRIME(:) = (( XBETAI/ZZT(:) - XGAMI ) / ZZT(:)) & ! r'_si + * ZRVSATI(:) * ( 1. + ZRVSATI(:)/ZEPS ) +! + ZDELTI(:) = ZRVS(:)*PTSTEP - ZRVSATI(:) + ZAI(:) = ( XLSTT + (XCPV-XCI)*(ZZT(:)-XTT) )**2 / (ZKA(:)*XRV*ZZT(:)**2) & + + ( XRV*ZZT(:) ) / (ZDV(:)*ZZW(:)) + ZZW(:) = MIN(1.E8,( XLBI* MAX(ZCIT(:),XCTMIN(4)) & + /(MAX(ZRIT(:),XRTMIN(4))) )**XLBEXI) + ! Lbda_I + ZITI(:) = ZCIT(:) * (X0DEPI/ZZW(:) + X2DEPI*ZCJ(:)*ZCJ(:)/ZZW(:)**(XDI+2.0)) & + / (ZRVSATI(:)*ZAI(:)) +! + ALLOCATE(ZAII(IMICRO)) + ALLOCATE(ZDEP(IMICRO)) +! + ZAII(:) = 1.0 + ZRVSATI_PRIME(:)*ZLSFACT(:) + ZDEP(:) = 0.0 +! + ZZW(:) = ZAII(:)*ZITI(:)*PTSTEP ! R*delta_T + WHERE( ZZW(:)<1.0E-2 ) + ZDEP(:) = ZITI(:)*ZDELTI(:)*(1.0 - (ZZW(:)/2.0)*(1.0-ZZW(:)/3.0)) + ELSEWHERE + ZDEP(:) = ZITI(:)*ZDELTI(:)*(1.0 - EXP(-ZZW(:)))/ZZW(:) + END WHERE +! +! Integration +! + WHERE( ZDEP(:) < 0.0 ) + ZDEP(:) = MAX ( ZDEP(:), -ZRIS(:) ) + ELSEWHERE + ZDEP(:) = MIN ( ZDEP(:), ZRVS(:) ) +! ZDEP(:) = MIN ( ZDEP(:), ZCIS(:)*5.E-10 ) !!!BVIE!!! + END WHERE + WHERE( ZRIS(:) < XRTMIN(4)/PTSTEP ) + ZDEP(:) = 0.0 + END WHERE + ZRVS(:) = ZRVS(:) - ZDEP(:) + ZRIS(:) = ZRIS(:) + ZDEP(:) + ZTHS(:) = ZTHS(:) + ZDEP(:) * ZLSFACT(:) / ZEXNREF(:) +! +! Implicit ice crystal sublimation if ice saturated conditions are not met +! + ZZT(:) = ( ZTHS(:) * PTSTEP ) * ( ZPRES(:) / XP00 ) ** (XRD/XCPD) + ZZW(:) = EXP( XALPI - XBETAI/ZZT(:) - XGAMI*ALOG(ZZT(:) ) ) ! es_i + ZRVSATI(:) = ZEPS*ZZW(:) / ( ZPRES(:)-ZZW(:) ) ! r_si + WHERE( ZRVS(:)*PTSTEP<ZRVSATI(:) ) + ZZW(:) = ZRVS(:) + ZRIS(:) + ZRVS(:) = MIN( ZZW(:),ZRVSATI(:)/PTSTEP ) + ZTHS(:) = ZTHS(:) + ( MAX( 0.0,ZZW(:)-ZRVS(:) )-ZRIS(:) ) & + * ZLSFACT(:) / ZEXNREF(:) + ZRIS(:) = MAX( 0.0,ZZW(:)-ZRVS(:) ) + END WHERE +! +! + ZW(:,:,:) = PRS(:,:,:,1) + PRS(:,:,:,1) = UNPACK( ZRVS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PRS(:,:,:,4) + PRS(:,:,:,4) = UNPACK( ZRIS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PTHS(:,:,:) + PTHS(:,:,:) = UNPACK( ZTHS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) +! + DEALLOCATE(ZRVT) + DEALLOCATE(ZRIT) + DEALLOCATE(ZCIT) + DEALLOCATE(ZRVS) + DEALLOCATE(ZRIS) + DEALLOCATE(ZCIS) !!!BVIE!!! + DEALLOCATE(ZTHS) + DEALLOCATE(ZRHODREF) + DEALLOCATE(ZZT) + DEALLOCATE(ZPRES) + DEALLOCATE(ZEXNREF) + DEALLOCATE(ZZCPH) + DEALLOCATE(ZZW) + DEALLOCATE(ZLSFACT) + DEALLOCATE(ZRVSATI) + DEALLOCATE(ZRVSATI_PRIME) + DEALLOCATE(ZDELTI) + DEALLOCATE(ZAI) + DEALLOCATE(ZCJ) + DEALLOCATE(ZKA) + DEALLOCATE(ZDV) + DEALLOCATE(ZITI) + DEALLOCATE(ZAII) + DEALLOCATE(ZDEP) +END IF ! IMICRO +! +!selection of mesh where condensation/evaportion/activation is performed +GNUCT(:,:,:) = .FALSE. +!GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) = ZSAT(IIB:IIE,IJB:IJE,IKB:IKE)>0.0 .OR. & +! ZCCS(IIB:IIE,IJB:IJE,IKB:IKE)>0.0 +!GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) = ZSAT(IIB:IIE,IJB:IJE,IKB:IKE)>0.0 +GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) = ZSAT(IIB:IIE,IJB:IJE,IKB:IKE)>0.0 .OR. & +! ZCCS(IIB:IIE,IJB:IJE,IKB:IKE)>1.E+05 + ZCCS(IIB:IIE,IJB:IJE,IKB:IKE)>XCTMIN(2) +INUCT = COUNTJV( GNUCT(:,:,:),I1(:),I2(:),I3(:)) +!3D array to 1D array +! +IF( INUCT >= 1 ) THEN + ALLOCATE(ZZNFS(INUCT,NMOD_CCN)) + ALLOCATE(ZZNAS(INUCT,NMOD_CCN)) + ALLOCATE(ZPRES(INUCT)) + ALLOCATE(ZRHOD(INUCT)) + ALLOCATE(ZRR(INUCT)) + ALLOCATE(ZTT(INUCT)) + ALLOCATE(ZRV(INUCT)) + ALLOCATE(ZRC(INUCT)) + ALLOCATE(ZS0(INUCT)) + ALLOCATE(ZCCL(INUCT)) + ALLOCATE(ZZDZ(INUCT)) + ALLOCATE(ZZLV(INUCT)) + ALLOCATE(ZZCPH(INUCT)) + DO JL=1,INUCT + ZPRES(JL) = 2. * PPABST(I1(JL),I2(JL),I3(JL)) - PPABSM(I1(JL),I2(JL),I3(JL)) + ZRHOD(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) + ZRR(JL) = PRS(I1(JL),I2(JL),I3(JL),3) + ZTT(JL) = PTHS(I1(JL),I2(JL),I3(JL)) + ZRV(JL) = PRS(I1(JL),I2(JL),I3(JL),1) + ZRC(JL) = PRS(I1(JL),I2(JL),I3(JL),2) + ZS0(JL) = ZSAT(I1(JL),I2(JL),I3(JL)) + DO JMOD = 1,NMOD_CCN + ZZNFS(JL,JMOD) = ZNFS(I1(JL),I2(JL),I3(JL),JMOD) + ZZNAS(JL,JMOD) = ZNAS(I1(JL),I2(JL),I3(JL),JMOD) + ENDDO + ZCCL(JL) = ZCCS(I1(JL),I2(JL),I3(JL)) + ZZDZ(JL)=ZDZ(I1(JL),I2(JL),I3(JL)) + ZZLV(JL)=ZLV(I1(JL),I2(JL),I3(JL)) + ZZCPH(JL)=ZCPH(I1(JL),I2(JL),I3(JL)) + ENDDO + ! + !Evaporation/Condensation/activation + CALL PROGNOS_LIMA(PTSTEP,ZZDZ,ZZLV,ZZCPH,ZPRES,ZRHOD, & + ZRR,ZTT,ZRV,ZRC,ZS0,ZZNAS,ZCCL,ZZNFS) + ! +!1D array to 3D array + DO JMOD = 1, NMOD_CCN + ZWORK(:,:,:) = ZNAS(:,:,:,JMOD) + ZNAS(:,:,:,JMOD) = UNPACK( ZZNAS(:,JMOD) ,MASK=GNUCT(:,:,:),FIELD=ZWORK(:,:,:) ) + ZWORK(:,:,:) = ZNFS(:,:,:,JMOD) + ZNFS(:,:,:,JMOD) = UNPACK( ZZNFS(:,JMOD) ,MASK=GNUCT(:,:,:),FIELD=ZWORK(:,:,:) ) + END DO + PSVS(:,:,:,NSV_LIMA_CCN_FREE:NSV_LIMA_CCN_FREE+NMOD_CCN-1) = ZNFS(:,:,:,:) + PSVS(:,:,:,NSV_LIMA_CCN_ACTI:NSV_LIMA_CCN_ACTI+NMOD_CCN-1) = ZNAS(:,:,:,:) + ! + ZWORK(:,:,:) = ZCCS(:,:,:) + ZCCS(:,:,:) = UNPACK( ZCCL(:),MASK=GNUCT(:,:,:),FIELD=ZWORK(:,:,:) ) + PSVS(:,:,:,NSV_LIMA_NC) = ZCCS(:,:,:) + ! + ZWORK(:,:,:) = PTHS(:,:,:) + PTHS(:,:,:) = UNPACK( ZTT(:),MASK=GNUCT(:,:,:),FIELD=ZWORK(:,:,:) ) + ZWORK(:,:,:) = PRS(:,:,:,1) + PRS(:,:,:,1) = UNPACK( ZRV(:),MASK=GNUCT(:,:,:),FIELD=ZWORK(:,:,:) ) + ZWORK(:,:,:) = PRS(:,:,:,2) + PRS(:,:,:,2) = UNPACK( ZRC(:),MASK=GNUCT(:,:,:),FIELD=ZWORK(:,:,:) ) + ZWORK(:,:,:) = ZSAT(:,:,:) + ZSAT(:,:,:) = UNPACK( ZS0(:),MASK=GNUCT(:,:,:),FIELD=ZWORK(:,:,:) ) + ! + DEALLOCATE(ZPRES) + DEALLOCATE(ZRHOD) + DEALLOCATE(ZRR) + DEALLOCATE(ZTT) + DEALLOCATE(ZRV) + DEALLOCATE(ZRC) + DEALLOCATE(ZS0) + DEALLOCATE(ZZNFS) + DEALLOCATE(ZZNAS) + DEALLOCATE(ZCCL) + DEALLOCATE(ZZDZ) +! +ENDIF +! +!Computation of saturation in the meshes where there is no +!condensation/evaporation/activation +WHERE(.NOT.GNUCT(:,:,:) ) + ZRVSAT(:,:,:) = EXP(XALPW-XBETAW/PTHS(:,:,:)-XGAMW*ALOG(PTHS(:,:,:))) + !rvsat + ZRVSAT(:,:,:) = (XMV / XMD)*ZRVSAT(:,:,:)/((2.* PPABST(:,:,:)-PPABSM(:,:,:))-ZRVSAT(:,:,:)) + ZSAT(:,:,:) = (PRS(:,:,:,1)/ZRVSAT(:,:,:))-1D0 +ENDWHERE +! +!source terms /dt +PRS(:,:,:,:) = PRS(:,:,:,:)/PTSTEP +PTHS(:,:,:) = PTHS(:,:,:)/PTSTEP/ZEXNS(:,:,:) +ZSAT(:,:,:) = ZSAT(:,:,:)+1.0 +PSVS(:,:,:,NSV_LIMA_SPRO) = ZSAT(:,:,:) +PSVS(:,:,:,:) = PSVS(:,:,:,:)/PTSTEP +! +IF (ANY(PRS(:,:,:,2)+PRS(:,:,:,1) < 0.) .AND. NVERB>5) THEN + WRITE(*,*) 'LIMA_NOTADJUST: negative values of total water (reset to zero)' + WRITE(*,*) ' location of minimum:', MINLOC(PRS(:,:,:,2)+PRS(:,:,:,1)) + WRITE(*,*) ' value of minimum :', MINVAL(PRS(:,:,:,2)+PRS(:,:,:,1)) + CALL PRINT_MSG(NVERB_FATAL,'GEN','LIMA_NOTADJUST','') +END IF +! +!* compute the cloud fraction PCLDFR +! +WHERE (PRS(:,:,:,2) > 0. ) + ZW1(:,:,:) = 1. +ELSEWHERE + ZW1(:,:,:) = 0. +ENDWHERE +IF ( SIZE(PSRCS,3) /= 0 ) THEN + PSRCS(:,:,:) = ZW1(:,:,:) +END IF +! +IF ( HRAD /= 'NONE' ) THEN + PCLDFR(:,:,:) = ZW1(:,:,:) +END IF +! +IF ( tpfile%lopened ) THEN + ZW(:,:,:)=SUM(ZNAS,4)-ZW(:,:,:) + TZFIELD%CMNHNAME = 'NACT' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'NACT' + TZFIELD%CUNITS = '' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_NACT' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZW) +END IF +! +!* 7. STORE THE BUDGET TERMS +! ---------------------- +! +if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'CEDS', pths(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rv ) call Budget_store_end( tbudgets(NBUDGET_RV), 'CEDS', prs(:, :, :, 1) * prhodj(:, :, :) ) + if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'CEDS', prs(:, :, :, 2) * prhodj(:, :, :) ) + if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'CEDS', prs(:, :, :, 4) * prhodj(:, :, :) ) + if ( lbudget_sv ) then + if ( lwarm ) then + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'CEDS', psvs(:, :, :, nsv_lima_nc) * prhodj(:, :, :) ) + do jl = nsv_lima_ccn_free, nsv_lima_ccn_free + nmod_ccn - 1 + idx = NBUDGET_SV1 - 1 + jl + call Budget_store_end( tbudgets(idx), 'CEDS', psvs(:, :, :, jl) * prhodj(:, :, :) ) + end do + do jl = nsv_lima_ccn_acti, nsv_lima_ccn_acti + nmod_ccn - 1 + idx = NBUDGET_SV1 - 1 + jl + call Budget_store_end( tbudgets(idx), 'CEDS', psvs(:, :, :, jl) * prhodj(:, :, :) ) + end do + end if +! if ( lscav .and. laero_mass ) & +! call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_scavmass), 'CEDS', psvs(:, :, :, nsv_lima_scavmass) & +! * prhodj(:, :, :) ) +! if ( lcold ) then +! call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'CEDS', psvs(:, :, :, nsv_lima_ni) * prhodj(:, :, :) ) +! do jl = 1, nsv_lima_ifn_free, nsv_lima_ifn_free + nmod_ifn - 1 +! idx = NBUDGET_SV1 - 1 + jl +! call Budget_store_end( tbudgets(idx), 'CEDS', psvs(:, :, :, jl) * prhodj(:, :, :) ) +! end do +! do jl = 1, nsv_lima_ifn_nucl, nsv_lima_ifn_nucl + nmod_ifn - 1 +! idx = NBUDGET_SV1 - 1 + jl +! call Budget_store_end( tbudgets(idx), 'CEDS', psvs(:, :, :, jl) * prhodj(:, :, :) ) +! end do +! do jl = 1, nsv_lima_imm_nucl, nsv_lima_imm_nucl + nmod_ifn - 1 +! idx = NBUDGET_SV1 - 1 + jl +! call Budget_store_end( tbudgets(idx), 'CEDS', psvs(:, :, :, jl) * prhodj(:, :, :) ) +! end do +! end if + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_spro), 'CEDS', psvs(:, :, :, nsv_lima_spro) * prhodj(:, :, :) ) + end if +end if +! +END SUBROUTINE LIMA_NOTADJUST diff --git a/src/mesonh/micro/lima_nucleation_procs.f90 b/src/mesonh/micro/lima_nucleation_procs.f90 new file mode 100644 index 000000000..122d4b3c8 --- /dev/null +++ b/src/mesonh/micro/lima_nucleation_procs.f90 @@ -0,0 +1,334 @@ +!MNH_LIC Copyright 2018-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!------------------------------------------------------------------------------- +! ############################### + MODULE MODI_LIMA_NUCLEATION_PROCS +! ############################### +! +INTERFACE + SUBROUTINE LIMA_NUCLEATION_PROCS (PTSTEP, TPFILE, PRHODJ, & + PRHODREF, PEXNREF, PPABST, PT, PDTHRAD, PW_NU,& + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & + PCCT, PCRT, PCIT, & + PNFT, PNAT, PIFT, PINT, PNIT, PNHT, & + PCLDFR, PICEFR, PPRCFR ) +! +USE MODD_IO, ONLY: TFILEDATA +! +REAL, INTENT(IN) :: PTSTEP ! Double Time step +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PT ! Temperature +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTHRAD ! Radiative temperature tendency +REAL, DIMENSION(:,:,:), INTENT(IN) :: PW_NU ! updraft velocity used for +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHT ! Theta at t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRIT ! Pristine ice m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRST ! Snow m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGT ! Graupel m.r. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCCT ! Cloud water conc. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCRT ! Rain water conc. at t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIT ! Prinstine ice conc. at t +! +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PNFT ! CCN C. available at t +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PNAT ! CCN C. activated at t +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PIFT ! IFN C. available at t +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PINT ! IFN C. activated at t +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PNIT ! Coated IFN activated at t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PNHT ! CCN hom freezing +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCLDFR ! Cloud fraction +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PICEFR ! Ice fraction +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PPRCFR ! Precipitation fraction +! +END SUBROUTINE LIMA_NUCLEATION_PROCS +END INTERFACE +END MODULE MODI_LIMA_NUCLEATION_PROCS +! ############################################################################# +SUBROUTINE LIMA_NUCLEATION_PROCS (PTSTEP, TPFILE, PRHODJ, & + PRHODREF, PEXNREF, PPABST, PT, PDTHRAD, PW_NU,& + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & + PCCT, PCRT, PCIT, & + PNFT, PNAT, PIFT, PINT, PNIT, PNHT, & + PCLDFR, PICEFR, PPRCFR ) +! ############################################################################# +! +!! PURPOSE +!! ------- +!! Compute nucleation processes for the time-split version of LIMA +!! +!! AUTHOR +!! ------ +!! B. Vié * CNRM * +!! +!! MODIFICATIONS +!! ------------- +!! Original 15/03/2018 +! M. Leriche 06/2019: missing update of PNFT after CCN hom. ncl. +! P. Wautelet 27/02/2020: bugfix: PNFT was not updated after LIMA_CCN_HOM_FREEZING +! P. Wautelet 27/02/2020: add Z_TH_HINC variable (for budgets) +! P. Wautelet 02/2020: use the new data structures and subroutines for budgets +! B. Vie 03/03/2020: use DTHRAD instead of dT/dt in Smax diagnostic computation +!------------------------------------------------------------------------------- +! +use modd_budget, only: lbu_enable, lbudget_th, lbudget_rv, lbudget_rc, lbudget_rr, & + lbudget_ri, lbudget_rs, lbudget_rg, lbudget_rh, lbudget_sv, & + NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, NBUDGET_RI, NBUDGET_SV1, & + tbudgets +USE MODD_IO, ONLY: TFILEDATA +USE MODD_NSV, ONLY : NSV_LIMA_NC, NSV_LIMA_NR, NSV_LIMA_CCN_FREE, NSV_LIMA_CCN_ACTI, & + NSV_LIMA_NI, NSV_LIMA_IFN_FREE, NSV_LIMA_IFN_NUCL, NSV_LIMA_IMM_NUCL, NSV_LIMA_HOM_HAZE +USE MODD_PARAM_LIMA, ONLY : LCOLD, LNUCL, LMEYERS, LSNOW, LWARM, LACTI, LRAIN, LHHONI, & + NMOD_CCN, NMOD_IFN, NMOD_IMM, XCTMIN, XRTMIN, LSPRO +USE MODD_TURB_n, ONLY : LSUBG_COND + +use mode_budget, only: Budget_store_add, Budget_store_init, Budget_store_end + +USE MODI_LIMA_CCN_ACTIVATION +USE MODI_LIMA_CCN_HOM_FREEZING +USE MODI_LIMA_MEYERS_NUCLEATION +USE MODI_LIMA_PHILLIPS_IFN_NUCLEATION +! +!------------------------------------------------------------------------------- +! +IMPLICIT NONE +! +!------------------------------------------------------------------------------- +! +REAL, INTENT(IN) :: PTSTEP ! Double Time step +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PT ! Temperature +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTHRAD ! Radiative temperature tendency +REAL, DIMENSION(:,:,:), INTENT(IN) :: PW_NU ! updraft velocity used for +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHT ! Theta at t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRIT ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRST ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGT ! Rain water m.r. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCCT ! Cloud water conc. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCRT ! Rain water conc. at t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIT ! Prinstine ice conc. at t +! +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PNFT ! CCN C. available at t +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PNAT ! CCN C. activated at t +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PIFT ! IFN C. available at t +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PINT ! IFN C. activated at t +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PNIT ! Coated IFN activated at t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PNHT ! CCN hom. freezing +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCLDFR ! Cloud fraction +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PICEFR ! Ice fraction +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PPRCFR ! Precipitation fraction +! +!------------------------------------------------------------------------------- +! +REAL, DIMENSION(SIZE(PT,1),SIZE(PT,2),SIZE(PT,3)) :: Z_TH_HIND, Z_RI_HIND, Z_CI_HIND, Z_TH_HINC, Z_RC_HINC, Z_CC_HINC +! +integer :: idx +INTEGER :: JL +! +!------------------------------------------------------------------------------- +! +IF ( LWARM .AND. LACTI .AND. NMOD_CCN >=1 ) THEN + + IF (.NOT.LSUBG_COND .AND. .NOT.LSPRO) THEN + + if ( lbu_enable ) then + if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'HENU', ptht(:, :, :) * prhodj(:, :, :) / ptstep ) + if ( lbudget_rv ) call Budget_store_init( tbudgets(NBUDGET_RV), 'HENU', prvt(:, :, :) * prhodj(:, :, :) / ptstep ) + if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'HENU', prct(:, :, :) * prhodj(:, :, :) / ptstep ) + if ( lbudget_sv ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'HENU', pcct(:, :, :) * prhodj(:, :, :) / ptstep ) + do jl = 1, nmod_ccn + idx = NBUDGET_SV1 - 1 + nsv_lima_ccn_free - 1 + jl + call Budget_store_init( tbudgets(idx), 'HENU', pnft(:, :, :, jl) * prhodj(:, :, :) / ptstep ) + idx = NBUDGET_SV1 - 1 + nsv_lima_ccn_acti - 1 + jl + call Budget_store_init( tbudgets(idx), 'HENU', pnat(:, :, :, jl) * prhodj(:, :, :) / ptstep ) + end do + end if + end if + + CALL LIMA_CCN_ACTIVATION( TPFILE, & + PRHODREF, PEXNREF, PPABST, PT, PDTHRAD, PW_NU, & + PTHT, PRVT, PRCT, PCCT, PRRT, PNFT, PNAT, PCLDFR ) + if ( lbu_enable ) then + if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'HENU', ptht(:, :, :) * prhodj(:, :, :) / ptstep ) + if ( lbudget_rv ) call Budget_store_end( tbudgets(NBUDGET_RV), 'HENU', prvt(:, :, :) * prhodj(:, :, :) / ptstep ) + if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'HENU', prct(:, :, :) * prhodj(:, :, :) / ptstep ) + if ( lbudget_sv ) then + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'HENU', pcct(:, :, :) * prhodj(:, :, :) / ptstep ) + do jl = 1, nmod_ccn + idx = NBUDGET_SV1 - 1 + nsv_lima_ccn_free - 1 + jl + call Budget_store_end( tbudgets(idx), 'HENU', pnft(:, :, :, jl) * prhodj(:, :, :) / ptstep ) + idx = NBUDGET_SV1 - 1 + nsv_lima_ccn_acti - 1 + jl + call Budget_store_end( tbudgets(idx), 'HENU', pnat(:, :, :, jl) * prhodj(:, :, :) / ptstep ) + end do + end if + end if + + END IF + + WHERE(PCLDFR(:,:,:)<1.E-10 .AND. PRCT(:,:,:)>XRTMIN(2) .AND. PCCT(:,:,:)>XCTMIN(2)) PCLDFR(:,:,:)=1. + +END IF +! +!------------------------------------------------------------------------------- +! +IF ( LCOLD .AND. LNUCL .AND. .NOT.LMEYERS .AND. NMOD_IFN >= 1 ) THEN + if ( lbu_enable ) then + if ( lbudget_sv ) then + do jl = 1, nmod_ifn + idx = NBUDGET_SV1 - 1 + nsv_lima_ifn_free - 1 + jl + call Budget_store_init( tbudgets(idx), 'HIND', pift(:, :, :, jl) * prhodj(:, :, :) / ptstep ) + idx = NBUDGET_SV1 - 1 + nsv_lima_ifn_nucl - 1 + jl + call Budget_store_init( tbudgets(idx), 'HIND', pint(:, :, :, jl) * prhodj(:, :, :) / ptstep ) + end do + + do jl = 1, nmod_ccn + idx = NBUDGET_SV1 - 1 + nsv_lima_ccn_acti - 1 + jl + call Budget_store_init( tbudgets(idx), 'HINC', pnat(:, :, :, jl) * prhodj(:, :, :) / ptstep ) + end do + do jl = 1, nmod_imm + idx = NBUDGET_SV1 - 1 + nsv_lima_imm_nucl - 1 + jl + call Budget_store_init( tbudgets(idx), 'HINC', pnit(:, :, :, jl) * prhodj(:, :, :) / ptstep ) + end do + end if + end if + + CALL LIMA_PHILLIPS_IFN_NUCLEATION (PTSTEP, & + PRHODREF, PEXNREF, PPABST, & + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & + PCCT, PCIT, PNAT, PIFT, PINT, PNIT, & + Z_TH_HIND, Z_RI_HIND, Z_CI_HIND, & + Z_TH_HINC, Z_RC_HINC, Z_CC_HINC, & + PICEFR ) + WHERE(PICEFR(:,:,:)<1.E-10 .AND. PRIT(:,:,:)>XRTMIN(4) .AND. PCIT(:,:,:)>XCTMIN(4)) PICEFR(:,:,:)=1. +! + if ( lbu_enable ) then + if ( lbudget_th ) call Budget_store_add( tbudgets(NBUDGET_TH), 'HIND', z_th_hind(:, :, :) * prhodj(:, :, :) / ptstep ) + if ( lbudget_rv ) call Budget_store_add( tbudgets(NBUDGET_RV), 'HIND', -z_ri_hind(:, :, :) * prhodj(:, :, :) / ptstep ) + if ( lbudget_ri ) call Budget_store_add( tbudgets(NBUDGET_RI), 'HIND', z_ri_hind(:, :, :) * prhodj(:, :, :) / ptstep ) + if ( lbudget_sv ) then + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'HIND', z_ci_hind(:, :, :) * prhodj(:, :, :) / ptstep ) + do jl = 1, nmod_ifn + idx = NBUDGET_SV1 - 1 + nsv_lima_ifn_free - 1 + jl + call Budget_store_end( tbudgets(idx), 'HIND', pift(:, :, :, jl) * prhodj(:, :, :) / ptstep ) + idx = NBUDGET_SV1 - 1 + nsv_lima_ifn_nucl - 1 + jl + call Budget_store_end( tbudgets(idx), 'HIND', pint(:, :, :, jl) * prhodj(:, :, :) / ptstep ) + end do + end if + + if ( lbudget_th ) call Budget_store_add( tbudgets(NBUDGET_TH), 'HINC', z_th_hinc(:, :, :) * prhodj(:, :, :) / ptstep ) + if ( lbudget_rc ) call Budget_store_add( tbudgets(NBUDGET_RC), 'HINC', z_rc_hinc(:, :, :) * prhodj(:, :, :) / ptstep ) + if ( lbudget_ri ) call Budget_store_add( tbudgets(NBUDGET_RI), 'HINC', -z_rc_hinc(:, :, :) * prhodj(:, :, :) / ptstep ) + if ( lbudget_sv ) then + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'HINC', z_cc_hinc(:, :, :) * prhodj(:, :, :) / ptstep ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'HINC', -z_cc_hinc(:, :, :) * prhodj(:, :, :) / ptstep ) + do jl = 1, nmod_ccn + idx = NBUDGET_SV1 - 1 + nsv_lima_ccn_acti - 1 + jl + call Budget_store_end( tbudgets(idx), 'HINC', pnat(:, :, :, jl) * prhodj(:, :, :) / ptstep ) + end do + do jl = 1, nmod_imm + idx = NBUDGET_SV1 - 1 + nsv_lima_imm_nucl - 1 + jl + call Budget_store_end( tbudgets(idx), 'HINC', pnit(:, :, :, jl) * prhodj(:, :, :) / ptstep ) + end do + end if + end if +END IF +! +!------------------------------------------------------------------------------- +! +IF (LCOLD .AND. LNUCL .AND. LMEYERS) THEN + CALL LIMA_MEYERS_NUCLEATION (PTSTEP, & + PRHODREF, PEXNREF, PPABST, & + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & + PCCT, PCIT, PINT, & + Z_TH_HIND, Z_RI_HIND, Z_CI_HIND, & + Z_TH_HINC, Z_RC_HINC, Z_CC_HINC, & + PICEFR ) + WHERE(PICEFR(:,:,:)<1.E-10 .AND. PRIT(:,:,:)>XRTMIN(4) .AND. PCIT(:,:,:)>XCTMIN(4)) PICEFR(:,:,:)=1. +! + if ( lbu_enable ) then + if ( lbudget_th ) call Budget_store_add( tbudgets(NBUDGET_TH), 'HIND', z_th_hind(:, :, :) * prhodj(:, :, :) / ptstep ) + if ( lbudget_rv ) call Budget_store_add( tbudgets(NBUDGET_RV), 'HIND', -z_ri_hind(:, :, :) * prhodj(:, :, :) / ptstep ) + if ( lbudget_ri ) call Budget_store_add( tbudgets(NBUDGET_RI), 'HIND', z_ri_hind(:, :, :) * prhodj(:, :, :) / ptstep ) + if ( lbudget_sv ) then + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'HIND', z_ci_hind(:, :, :) * prhodj(:, :, :) / ptstep ) + if (nmod_ifn > 0 ) & + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ifn_nucl), 'HIND', & + z_ci_hind(:, :, :) * prhodj(:, :, :) / ptstep ) + end if + + if ( lbudget_th ) call Budget_store_add( tbudgets(NBUDGET_TH), 'HINC', z_th_hinc(:, :, :) * prhodj(:, :, :) / ptstep ) + if ( lbudget_rc ) call Budget_store_add( tbudgets(NBUDGET_RC), 'HINC', z_rc_hinc(:, :, :) * prhodj(:, :, :) / ptstep ) + if ( lbudget_ri ) call Budget_store_add( tbudgets(NBUDGET_RI), 'HINC', -z_rc_hinc(:, :, :) * prhodj(:, :, :) / ptstep ) + if ( lbudget_sv ) then + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'HINC', z_cc_hinc(:, :, :) * prhodj(:, :, :) / ptstep ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'HINC', -z_cc_hinc(:, :, :) * prhodj(:, :, :) / ptstep ) + if (nmod_ifn > 0 ) & + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ifn_nucl), 'HINC', & + -z_cc_hinc(:, :, :) * prhodj(:, :, :) / ptstep ) + end if + end if +END IF +! +!------------------------------------------------------------------------------- +! +IF ( LCOLD .AND. LNUCL .AND. LHHONI .AND. NMOD_CCN >= 1) THEN + if ( lbu_enable ) then + if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'HONH', PTHT(:, :, :) * prhodj(:, :, :) / ptstep ) + if ( lbudget_rv ) call Budget_store_init( tbudgets(NBUDGET_RV), 'HONH', PRVT(:, :, :) * prhodj(:, :, :) / ptstep ) + if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), 'HONH', PRIT(:, :, :) * prhodj(:, :, :) / ptstep ) + if ( lbudget_sv ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'HONH', PCIT(:, :, :) * prhodj(:, :, :) / ptstep ) + do jl = 1, nmod_ccn + idx = NBUDGET_SV1 - 1 + nsv_lima_ccn_free - 1 + jl + call Budget_store_init( tbudgets(idx), 'HONH', PNFT(:, :, :, jl) * prhodj(:, :, :) / ptstep ) + end do + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_hom_haze), 'HONH', PNHT(:, :, :) * prhodj(:, :, :) / ptstep ) + end if + end if + + CALL LIMA_CCN_HOM_FREEZING (PRHODREF, PEXNREF, PPABST, PW_NU, & + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & + PCCT, PCRT, PCIT, PNFT, PNHT, & + PICEFR ) + WHERE(PICEFR(:,:,:)<1.E-10 .AND. PRIT(:,:,:)>XRTMIN(4) .AND. PCIT(:,:,:)>XCTMIN(4)) PICEFR(:,:,:)=1. +! + if ( lbu_enable ) then + if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'HONH', PTHT(:, :, :) * prhodj(:, :, :) / ptstep ) + if ( lbudget_rv ) call Budget_store_end( tbudgets(NBUDGET_RV), 'HONH', PRVT(:, :, :) * prhodj(:, :, :) / ptstep ) + if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'HONH', PRIT(:, :, :) * prhodj(:, :, :) / ptstep ) + if ( lbudget_sv ) then + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'HONH', PCIT(:, :, :) * prhodj(:, :, :) / ptstep ) + do jl = 1, nmod_ccn + idx = NBUDGET_SV1 - 1 + nsv_lima_ccn_free - 1 + jl + call Budget_store_end( tbudgets(idx), 'HONH', PNFT(:, :, :, jl) * prhodj(:, :, :) / ptstep ) + end do + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_hom_haze), 'HONH', PNHT(:, :, :) * prhodj(:, :, :) / ptstep ) + end if + end if +ENDIF +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE LIMA_NUCLEATION_PROCS diff --git a/src/mesonh/micro/lima_phillips.f90 b/src/mesonh/micro/lima_phillips.f90 new file mode 100644 index 000000000..1ca330e35 --- /dev/null +++ b/src/mesonh/micro/lima_phillips.f90 @@ -0,0 +1,663 @@ +!MNH_LIC Copyright 2013-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ######################### + MODULE MODI_LIMA_PHILLIPS +! ######################### +! +INTERFACE + SUBROUTINE LIMA_PHILLIPS (OHHONI, PTSTEP, KMI, & + PZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, & + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & + PTHS, PRVS, PRCS, PRIS, & + PCIT, PCCS, PCIS, & + PNAS, PIFS, PINS, PNIS ) +! +LOGICAL, INTENT(IN) :: OHHONI ! enable haze freezing +REAL, INTENT(IN) :: PTSTEP ! Time step +INTEGER, INTENT(IN) :: KMI ! Model index +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRIT ! Cloud ice m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGT ! Graupel m.r. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVS ! Water vapor m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIT ! Ice crystal C. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCCS ! Cloud water C. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIS ! Ice crystal C. source +! +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PNAS ! Cloud C. nuclei C. source + !used as Free ice nuclei for + !IMMERSION freezing +! +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PIFS ! Free ice nuclei C. source + !for DEPOSITION and CONTACT +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PINS ! Activated ice nuclei C. source + !for DEPOSITION and CONTACT +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PNIS ! Activated ice nuclei C. source + !for IMMERSION +! +END SUBROUTINE LIMA_PHILLIPS +END INTERFACE +END MODULE MODI_LIMA_PHILLIPS +! +! ##################################################################### + SUBROUTINE LIMA_PHILLIPS (OHHONI, PTSTEP, KMI, & + PZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, & + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & + PTHS, PRVS, PRCS, PRIS, & + PCIT, PCCS, PCIS, & + PNAS, PIFS, PINS, PNIS ) +! ##################################################################### +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the heterogeneous nucleation +!! following Phillips (2008). +!! +!! +!!** METHOD +!! ------ +!! The parameterization of Phillips (2008) is based on observed nucleation +!! in the CFDC for a range of T and Si values. Phillips therefore defines a +!! reference activity spectrum, that is, for given T and Si values, the +!! reference concentration of primary ice crystals. +!! +!! The activation of IFN is closely related to their total surface. Thus, +!! the activable fraction of each IFN specie is determined by an integration +!! over the particle size distributions. +!! +!! Subroutine organisation : +!! +!! 1- Preliminary computations +!! 2- Check where computations are necessary, and pack variables +!! 3- Compute the saturation over water and ice +!! 4- Compute the reference activity spectrum +!! -> CALL LIMA_PHILLIPS_REF_SPECTRUM +!! Integrate over the size distributions to compute the IFN activable fraction +!! -> CALL LIMA_PHILLIPS_INTEG +!! 5- Heterogeneous nucleation of insoluble IFN +!! 6- Heterogeneous nucleation of coated IFN +!! 7- Unpack variables & deallocations +!! +!! +!! REFERENCE +!! --------- +!! +!! Phillips et al., 2008: An empirical parameterization of heterogeneous +!! ice nucleation for multiple chemical species of aerosols, J. Atmos. Sci. +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! C. Barthe * LACy * jan. 2014 add budgets +! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 +! P. Wautelet 03/2020: use the new data structures and subroutines for budgets +! P. Wautelet 02/02/2021: budgets: add missing source terms for SV budgets in LIMA +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +use modd_budget, only: lbu_enable, nbumod, & + lbudget_th, lbudget_rv, lbudget_rc, lbudget_ri, lbudget_sv, & + NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, NBUDGET_RI, NBUDGET_SV1, & + tbudgets +USE MODD_CST, ONLY : XP00, XRD, XMV, XMD, XCPD, XCPV, XCL, XCI, & + XTT, XLSTT, XLVTT, XALPI, XBETAI, XGAMI, & + XALPW, XBETAW, XGAMW, XPI +USE MODD_NSV, ONLY : NSV_LIMA_NC, NSV_LIMA_NI, NSV_LIMA_CCN_ACTI, NSV_LIMA_IFN_FREE, NSV_LIMA_IFN_NUCL, NSV_LIMA_IMM_NUCL +USE MODD_PARAMETERS, ONLY : JPHEXT, JPVEXT +USE MODD_PARAM_LIMA, ONLY : NMOD_IFN, NSPECIE, XFRAC, & + NMOD_CCN, NMOD_IMM, NIND_SPECIE, NINDICE_CCN_IMM, & + XDSI0, XRTMIN, XCTMIN, NPHILLIPS +USE MODD_PARAM_LIMA_COLD, ONLY : XMNU0 + +use mode_budget, only: Budget_store_init, Budget_store_end +use mode_tools, only: Countjv + +USE MODI_LIMA_PHILLIPS_INTEG +USE MODI_LIMA_PHILLIPS_REF_SPECTRUM + +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +LOGICAL, INTENT(IN) :: OHHONI ! enable haze freezing +REAL, INTENT(IN) :: PTSTEP ! Time step +INTEGER, INTENT(IN) :: KMI ! Model index +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRIT ! Cloud ice m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGT ! Graupel m.r. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVS ! Water vapor m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIT ! Ice crystal C. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCCS ! Cloud water C. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIS ! Ice crystal C. source +! +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PNAS ! Cloud C. nuclei C. source + !used as Free ice nuclei for + !IMMERSION freezing +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PIFS ! Free ice nuclei C. source + !for DEPOSITION and CONTACT +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PINS ! Activated ice nuclei C. source + !for DEPOSITION and CONTACT +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PNIS ! Activated ice nuclei C. source + !for IMMERSION +! +! +!* 0.2 Declarations of local variables : +! +! +INTEGER :: IIB, IIE, IJB, IJE, IKB, IKE ! Physical domain +INTEGER :: JL, JMOD_CCN, JMOD_IFN, JSPECIE, JMOD_IMM ! Loop index +INTEGER :: INEGT ! Case number of sedimentation, nucleation, +integer :: idx +! +LOGICAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: GNEGT ! Test where to compute the nucleation +! +INTEGER, DIMENSION(SIZE(PRHODREF)) :: I1,I2,I3 ! Indexes for PACK replacement +! +REAL, DIMENSION(:), ALLOCATABLE :: ZRVT ! Water vapor m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRCT ! Cloud water m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRRT ! Rain water m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRIT ! Pristine ice m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRGT ! Graupel/hail m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZCIT ! Pristine ice conc. at t +! +REAL, DIMENSION(:), ALLOCATABLE :: ZRVS ! Water vapor m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRCS ! Cloud water m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRIS ! Pristine ice m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZCCS ! Cloud water conc. source +REAL, DIMENSION(:), ALLOCATABLE :: ZCIS ! Pristine ice conc. source +! +REAL, DIMENSION(:), ALLOCATABLE :: ZTHS ! Theta source +! +REAL, DIMENSION(:,:), ALLOCATABLE :: ZNAS ! Cloud Cond. nuclei conc. source +REAL, DIMENSION(:,:), ALLOCATABLE :: ZIFS ! Free Ice nuclei conc. source +REAL, DIMENSION(:,:), ALLOCATABLE :: ZINS ! Nucleated Ice nuclei conc. source + !by Deposition/Contact +REAL, DIMENSION(:,:), ALLOCATABLE :: ZNIS ! Nucleated Ice nuclei conc. source + !by Immersion +! +REAL, DIMENSION(:), ALLOCATABLE & + :: ZRHODREF, & ! RHO Dry REFerence + ZRHODJ, & ! RHO times Jacobian + ZZT, & ! Temperature + ZPRES, & ! Pressure + ZEXNREF, & ! EXNer Pressure REFerence + ZZW, & ! Work array + ZZX, & ! Work array + ZZY, & ! Work array + ZLSFACT, & ! L_s/(Pi_ref*C_ph) + ZLVFACT, & ! L_v/(Pi_ref*C_ph) + ZLBDAC, & ! Slope parameter of the cloud droplet distr. + ZSI, & + ZSW, & + ZSI_W +! +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: ZW, ZT ! work arrays +! +REAL, DIMENSION(:), ALLOCATABLE :: ZRTMIN, ZCTMIN +! +REAL, DIMENSION(:,:), ALLOCATABLE :: ZSI0, & ! Si threshold in H_X for X={DM,BC,O} + Z_FRAC_ACT ! Activable frac. of each AP species +REAL, DIMENSION(:), ALLOCATABLE :: ZTCELSIUS, ZZT_SI0_BC +! +!------------------------------------------------------------------------------- +! +! +!* 1. PRELIMINARY COMPUTATIONS +! ------------------------ +! +! +! Physical domain +! +IIB=1+JPHEXT +IIE=SIZE(PZZ,1) - JPHEXT +IJB=1+JPHEXT +IJE=SIZE(PZZ,2) - JPHEXT +IKB=1+JPVEXT +IKE=SIZE(PZZ,3) - JPVEXT +! +! Physical limitations +! +ALLOCATE(ZRTMIN(SIZE(XRTMIN))) +ALLOCATE(ZCTMIN(SIZE(XCTMIN))) +ZRTMIN(:) = XRTMIN(:) / PTSTEP +ZCTMIN(:) = XCTMIN(:) / PTSTEP +! +! Temperature +! +ZT(:,:,:) = PTHT(:,:,:) * ( PPABST(:,:,:)/XP00 ) ** (XRD/XCPD) +! +! Saturation over ice +! +ZW(:,:,:) = EXP( XALPI - XBETAI/ZT(:,:,:) - XGAMI*ALOG(ZT(:,:,:) ) ) +ZW(:,:,:) = PRVT(:,:,:)*( PPABST(:,:,:)-ZW(:,:,:) ) / ( (XMV/XMD) * ZW(:,:,:) ) +! +! +!------------------------------------------------------------------------------- +! +! +!* 2. COMPUTATIONS ONLY WHERE NECESSARY : PACK +! ---------------------------------------- +! +! +GNEGT(:,:,:) = .FALSE. +GNEGT(IIB:IIE,IJB:IJE,IKB:IKE) = ZT(IIB:IIE,IJB:IJE,IKB:IKE)<XTT-2.0 .AND. & + ZW(IIB:IIE,IJB:IJE,IKB:IKE)>0.95 +INEGT = COUNTJV( GNEGT(:,:,:),I1(:),I2(:),I3(:)) +! +IF (INEGT > 0) THEN +! +ALLOCATE(ZRVT(INEGT)) +ALLOCATE(ZRCT(INEGT)) +ALLOCATE(ZRRT(INEGT)) +ALLOCATE(ZRIT(INEGT)) +ALLOCATE(ZRST(INEGT)) +ALLOCATE(ZRGT(INEGT)) +! +ALLOCATE(ZCIT(INEGT)) +! +ALLOCATE(ZRVS(INEGT)) +ALLOCATE(ZRCS(INEGT)) +ALLOCATE(ZRIS(INEGT)) +! +ALLOCATE(ZTHS(INEGT)) +! +ALLOCATE(ZCCS(INEGT)) +ALLOCATE(ZCIS(INEGT)) +! +ALLOCATE(ZNAS(INEGT,NMOD_CCN)) +ALLOCATE(ZIFS(INEGT,NMOD_IFN)) +ALLOCATE(ZINS(INEGT,NMOD_IFN)) +ALLOCATE(ZNIS(INEGT,NMOD_IMM)) +! +ALLOCATE(ZRHODREF(INEGT)) +ALLOCATE(ZZT(INEGT)) +ALLOCATE(ZPRES(INEGT)) +ALLOCATE(ZEXNREF(INEGT)) +! +DO JL=1,INEGT + ZRVT(JL) = PRVT(I1(JL),I2(JL),I3(JL)) + ZRCT(JL) = PRCT(I1(JL),I2(JL),I3(JL)) + ZRRT(JL) = PRRT(I1(JL),I2(JL),I3(JL)) + ZRIT(JL) = PRIT(I1(JL),I2(JL),I3(JL)) + ZRST(JL) = PRST(I1(JL),I2(JL),I3(JL)) + ZRGT(JL) = PRGT(I1(JL),I2(JL),I3(JL)) +! + ZCIT(JL) = PCIT(I1(JL),I2(JL),I3(JL)) +! + ZRVS(JL) = PRVS(I1(JL),I2(JL),I3(JL)) + ZRCS(JL) = PRCS(I1(JL),I2(JL),I3(JL)) + ZRIS(JL) = PRIS(I1(JL),I2(JL),I3(JL)) +! + ZTHS(JL) = PTHS(I1(JL),I2(JL),I3(JL)) +! + ZCCS(JL) = PCCS(I1(JL),I2(JL),I3(JL)) + ZCIS(JL) = PCIS(I1(JL),I2(JL),I3(JL)) +! + DO JMOD_CCN = 1, NMOD_CCN + ZNAS(JL,JMOD_CCN) = PNAS(I1(JL),I2(JL),I3(JL),JMOD_CCN) + ENDDO + DO JMOD_IFN = 1, NMOD_IFN + ZIFS(JL,JMOD_IFN) = PIFS(I1(JL),I2(JL),I3(JL),JMOD_IFN) + ZINS(JL,JMOD_IFN) = PINS(I1(JL),I2(JL),I3(JL),JMOD_IFN) + ENDDO + DO JMOD_IMM = 1, NMOD_IMM + ZNIS(JL,JMOD_IMM) = PNIS(I1(JL),I2(JL),I3(JL),JMOD_IMM) + ENDDO + ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) + ZZT(JL) = ZT(I1(JL),I2(JL),I3(JL)) + ZPRES(JL) = PPABST(I1(JL),I2(JL),I3(JL)) + ZEXNREF(JL) = PEXNREF(I1(JL),I2(JL),I3(JL)) +ENDDO +! +! PACK : done +! Prepare computations +! +ALLOCATE( ZLSFACT (INEGT) ) +ALLOCATE( ZLVFACT (INEGT) ) +ALLOCATE( ZSI (INEGT) ) +ALLOCATE( ZTCELSIUS (INEGT) ) +ALLOCATE( ZZT_SI0_BC (INEGT) ) +ALLOCATE( ZLBDAC (INEGT) ) +ALLOCATE( ZSI0 (INEGT,NSPECIE) ) +ALLOCATE( Z_FRAC_ACT (INEGT,NSPECIE) ) ; Z_FRAC_ACT(:,:) = 0.0 +ALLOCATE( ZSW (INEGT) ) +ALLOCATE( ZSI_W (INEGT) ) +! +ALLOCATE( ZZW (INEGT) ) ; ZZW(:) = 0.0 +ALLOCATE( ZZX (INEGT) ) ; ZZX(:) = 0.0 +ALLOCATE( ZZY (INEGT) ) ; ZZY(:) = 0.0 +! +! +!------------------------------------------------------------------------------- +! +! +!* 3. COMPUTE THE SATURATION OVER WATER AND ICE +! ----------------------------------------- +! +! +ZTCELSIUS(:) = ZZT(:)-XTT ! T [°C] +ZZW(:) = ZEXNREF(:)*( XCPD+XCPV*ZRVT(:)+XCL*(ZRCT(:)+ZRRT(:)) & + +XCI*(ZRIT(:)+ZRST(:)+ZRGT(:)) ) +ZLSFACT(:) = (XLSTT+(XCPV-XCI)*ZTCELSIUS(:))/ZZW(:) ! L_s/(Pi_ref*C_ph) +ZLVFACT(:) = (XLVTT+(XCPV-XCL)*ZTCELSIUS(:))/ZZW(:) ! L_v/(Pi_ref*C_ph) +! +ZZW(:) = EXP( XALPI - XBETAI/ZZT(:) - XGAMI*ALOG(ZZT(:) ) ) ! es_i +ZSI(:) = ZRVT(:)*(ZPRES(:)-ZZW(:))/((XMV/XMD)*ZZW(:)) ! Saturation over ice +! +ZZY(:) = EXP( XALPW - XBETAW/ZZT(:) - XGAMW*ALOG(ZZT(:) ) ) ! es_w +ZSW(:) = ZRVT(:)*(ZPRES(:)-ZZY(:))/((XMV/XMD)*ZZY(:)) ! Saturation over water +! +ZSI_W(:)= ZZY(:)/ZZW(:) ! Saturation over ice at water saturation: es_w/es_i +! +! Saturation parameters for H_X, with X={Dust/Metallic (2 modes), Black Carbon, Organic} +! +ZSI0(:,1) = 1.0 + 10.0**( -1.0261 + 3.1656E-3* ZTCELSIUS(:) & + + 5.3938E-4*(ZTCELSIUS(:)**2) & + + 8.2584E-6*(ZTCELSIUS(:)**3) ) ! with T [°C] +ZSI0(:,2) = ZSI0(:,1) ! DM2 = DM1 +ZSI0(:,3) = 0.0 ! BC +ZZT_SI0_BC(:) = MAX( 198.0, MIN( 239.0,ZZT(:) ) ) +ZSI0(:,3) = (-3.118E-5*ZZT_SI0_BC(:)+1.085E-2)*ZZT_SI0_BC(:)+0.5652 - XDSI0(3) +IF (NPHILLIPS == 8) THEN + ZSI0(:,4) = ZSI0(:,3) ! O = BC +ELSE IF (NPHILLIPS == 13) THEN + ZSI0(:,4) = 1.15 ! BIO +END IF +! +! +!------------------------------------------------------------------------------- +! +! +!* 4. COMPUTE THE ACTIVABLE FRACTION OF EACH IFN SPECIE +! ------------------------------------------------- +! +! +! Computation of the reference activity spectrum ( ZZY = N_{IN,1,*} ) +! +CALL LIMA_PHILLIPS_REF_SPECTRUM(ZZT, ZSI, ZSI_W, ZZY) +! +! For each aerosol species (DM1, DM2, BC, O), compute the fraction that may be activated +! Z_FRAC_ACT(INEGT,NSPECIE) = fraction of each species that may be activated +! +CALL LIMA_PHILLIPS_INTEG(ZZT, ZSI, ZSI0, ZSW, ZZY, Z_FRAC_ACT) +! +! +!------------------------------------------------------------------------------- +! +! +!* 5. COMPUTE THE HETEROGENEOUS NUCLEATION OF INSOLUBLE IFN +! ----------------------------------------------------- +! +if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'HIND', pths(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rv ) call Budget_store_init( tbudgets(NBUDGET_RV), 'HIND', prvs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), 'HIND', pris(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_sv ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'HIND', pcis(:, :, :) * prhodj(:, :, :) ) + do jl = 1, nmod_ifn + idx = NBUDGET_SV1 - 1 + nsv_lima_ifn_free -1 + jl + call Budget_store_init( tbudgets(idx), 'HIND', pifs(:, :, :, jl) * prhodj(:, :, :) ) + idx = NBUDGET_SV1 - 1 + nsv_lima_ifn_nucl -1 + jl + call Budget_store_init( tbudgets(idx), 'HIND', pins(:, :, :, jl) * prhodj(:, :, :) ) + end do + end if +end if + +DO JMOD_IFN = 1,NMOD_IFN ! IFN modes + ZZX(:)=0. + DO JSPECIE = 1, NSPECIE ! Each IFN mode is mixed with DM1, DM2, BC, O + ZZX(:)=ZZX(:)+XFRAC(JSPECIE,JMOD_IFN)*(ZIFS(:,JMOD_IFN)+ZINS(:,JMOD_IFN))* & + Z_FRAC_ACT(:,JSPECIE) + END DO +! Now : ZZX(:) = number of activable AP. +! Activated AP at this time step = activable AP - already activated AP + ZZX(:) = MIN( ZIFS(:,JMOD_IFN), MAX( (ZZX(:)-ZINS(:,JMOD_IFN)),0.0 )) +! Correction BVIE division by PTSTEP ? +! ZZW(:) = MIN( XMNU0*ZZX(:) / PTSTEP , ZRVS(:) ) + ZZW(:) = MIN( XMNU0*ZZX(:), ZRVS(:) ) +! +! Update the concentrations and MMR +! + ZIFS(:,JMOD_IFN) = ZIFS(:,JMOD_IFN) - ZZX(:) + ZW(:,:,:) = PIFS(:,:,:,JMOD_IFN) + PIFS(:,:,:,JMOD_IFN) = UNPACK( ZIFS(:,JMOD_IFN), MASK=GNEGT(:,:,:), & + FIELD=ZW(:,:,:) ) +! + ZINS(:,JMOD_IFN) = ZINS(:,JMOD_IFN) + ZZX(:) + ZW(:,:,:) = PINS(:,:,:,JMOD_IFN) + PINS(:,:,:,JMOD_IFN) = UNPACK( ZINS(:,JMOD_IFN), MASK=GNEGT(:,:,:), & + FIELD=ZW(:,:,:) ) +! + ZRVS(:) = ZRVS(:) - ZZW(:) + ZRIS(:) = ZRIS(:) + ZZW(:) + ZTHS(:) = ZTHS(:) + ZZW(:)*ZLSFACT(:) !-ZLVFACT(:)) ! f(L_s*(RVHNDI)) + ZCIS(:) = ZCIS(:) + ZZX(:) +END DO +! +! +! Budget storage +if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'HIND', & + Unpack ( zths(:), mask = gnegt(:, :, :), field = pths(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rv ) call Budget_store_end( tbudgets(NBUDGET_RV), 'HIND', & + Unpack ( zrvs(:), mask = gnegt(:, :, :), field = prvs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'HIND', & + Unpack ( zris(:), mask = gnegt(:, :, :), field = pris(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_sv ) then + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'HIND', & + Unpack ( zcis(:), mask = gnegt(:, :, :), field = pcis(:, :, :) ) * prhodj(:, :, :) ) + do jl = 1, nmod_ifn + idx = NBUDGET_SV1 - 1 + nsv_lima_ifn_free -1 + jl + call Budget_store_end( tbudgets(idx), 'HIND', pifs(:, :, :, jl) * prhodj(:, :, :) ) + idx = NBUDGET_SV1 - 1 + nsv_lima_ifn_nucl -1 + jl + call Budget_store_end( tbudgets(idx), 'HIND', pins(:, :, :, jl) * prhodj(:, :, :) ) + end do + end if +end if +!------------------------------------------------------------------------------- +! +! +!* 6. COMPUTE THE HETEROGENEOUS NUCLEATION OF COATED IFN +! -------------------------------------------------- +! +if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'HINC', & + Unpack ( zths(:), mask = gnegt(:, :, :), field = pths(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'HINC', prcs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), 'HINC', & + Unpack ( zris(:), mask = gnegt(:, :, :), field = pris(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_sv ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'HINC', pccs(:, :, :) * prhodj(:, :, :) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'HINC', & + Unpack ( zcis(:), mask = gnegt(:, :, :), field = pcis(:, :, :) ) * prhodj(:, :, :) ) + do jl = 1, nmod_ccn + idx = NBUDGET_SV1 - 1 + nsv_lima_ccn_acti - 1 + jl + call Budget_store_init( tbudgets(idx), 'HINC', pnas(:, :, :, jl) * prhodj(:, :, :) ) + end do + do jl = 1, nmod_imm + idx = NBUDGET_SV1 - 1 + nsv_lima_imm_nucl - 1 + jl + call Budget_store_init( tbudgets(idx), 'HINC', pnis(:, :, :, jl) * prhodj(:, :, :) ) + end do + end if +end if +! +! Heterogeneous nucleation by immersion of the activated CCN +! Currently, we represent coated IFN as a pure aerosol type (NIND_SPECIE) +! +! +DO JMOD_IMM = 1,NMOD_IMM ! Coated IFN modes + JMOD_CCN = NINDICE_CCN_IMM(JMOD_IMM) ! Corresponding CCN mode + IF (JMOD_CCN .GT. 0) THEN +! +! OLD LIMA : Compute the appropriate mean diameter and sigma +! XMDIAM_IMM = MIN( XMDIAM_IFN(NIND_SPECIE) , XR_MEAN_CCN(JMOD_CCN)*2. ) +! XSIGMA_IMM = MIN( XSIGMA_IFN(JSPECIE) , EXP(XLOGSIG_CCN(JMOD_CCN)) ) +! + ZZW(:) = MIN( ZCCS(:) , ZNAS(:,JMOD_CCN) ) + ZZX(:)= ( ZZW(:)+ZNIS(:,JMOD_IMM) ) * Z_FRAC_ACT(:,NIND_SPECIE) +! Now : ZZX(:) = number of activable AP. +! Activated AP at this time step = activable AP - already activated AP + ZZX(:) = MIN( ZZW(:), MAX( (ZZX(:)-ZNIS(:,JMOD_IMM)),0.0 ) ) +! Correction BVIE division by PTSTEP ? +! ZZY(:) = MIN( XMNU0*ZZX(:) / PTSTEP , ZRVS(:) ) + ZZY(:) = MIN( XMNU0*ZZX(:) , ZRVS(:) ) +! +! Update the concentrations and MMR +! + ZNAS(:,JMOD_CCN) = ZNAS(:,JMOD_CCN) - ZZX(:) + ZW(:,:,:) = PNAS(:,:,:,JMOD_CCN) + PNAS(:,:,:,JMOD_CCN) = UNPACK(ZNAS(:,JMOD_CCN),MASK=GNEGT(:,:,:), & + FIELD=ZW(:,:,:)) + ZNIS(:,JMOD_IMM) = ZNIS(:,JMOD_IMM) + ZZX(:) + ZW(:,:,:) = PNIS(:,:,:,JMOD_IMM) + PNIS(:,:,:,JMOD_IMM) = UNPACK(ZNIS(:,JMOD_IMM),MASK=GNEGT(:,:,:), & + FIELD=ZW(:,:,:)) +! + ZRCS(:) = ZRCS(:) - ZZY(:) + ZRIS(:) = ZRIS(:) + ZZY(:) + ZTHS(:) = ZTHS(:) + ZZY(:)*ZLSFACT(:) !-ZLVFACT(:)) ! f(L_s*(RVHNCI)) + ZCCS(:) = ZCCS(:) - ZZX(:) + ZCIS(:) = ZCIS(:) + ZZX(:) + END IF +END DO +! +! Budget storage +if ( nbumod == kmi .and. lbu_enable ) then + if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'HINC', & + Unpack ( zths(:), mask = gnegt(:, :, :), field = pths(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'HINC', & + Unpack ( zrcs(:), mask = gnegt(:, :, :), field = prcs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'HINC', & + Unpack ( zris(:), mask = gnegt(:, :, :), field = pris(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_sv ) then + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'HINC', & + Unpack ( zccs(:), mask = gnegt(:, :, :), field = pccs(:, :, :) ) * prhodj(:, :, :) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_ni), 'HINC', & + Unpack ( zcis(:), mask = gnegt(:, :, :), field = pcis(:, :, :) ) * prhodj(:, :, :) ) + do jl = 1, nmod_ccn + idx = NBUDGET_SV1 - 1 + nsv_lima_ccn_acti - 1 + jl + call Budget_store_end( tbudgets(idx), 'HINC', pnas(:, :, :, jl) * prhodj(:, :, :) ) + end do + do jl = 1, nmod_imm + idx = NBUDGET_SV1 - 1 + nsv_lima_imm_nucl - 1 + jl + call Budget_store_end( tbudgets(idx), 'HINC', pnis(:, :, :, jl) * prhodj(:, :, :) ) + end do + end if +end if +!------------------------------------------------------------------------------- +! +! +!* 7. UNPACK VARIABLES AND CLEAN +! -------------------------- +! +! +! End of the heterogeneous nucleation following Phillips 08 +! Unpack variables, deallocate... +! +! +ZW(:,:,:) = PRVS(:,:,:) +PRVS(:,:,:) = UNPACK( ZRVS(:),MASK=GNEGT(:,:,:),FIELD=ZW(:,:,:) ) +ZW(:,:,:) = PRCS(:,:,:) +PRCS(:,:,:) = UNPACK( ZRCS(:),MASK=GNEGT(:,:,:),FIELD=ZW(:,:,:) ) +ZW(:,:,:) = PRIS(:,:,:) +PRIS(:,:,:) = UNPACK( ZRIS(:),MASK=GNEGT(:,:,:),FIELD=ZW(:,:,:) ) +ZW(:,:,:) = PTHS(:,:,:) +PTHS(:,:,:) = UNPACK( ZTHS(:),MASK=GNEGT(:,:,:),FIELD=ZW(:,:,:) ) +ZW(:,:,:) = PCCS(:,:,:) +PCCS(:,:,:) = UNPACK( ZCCS(:),MASK=GNEGT(:,:,:),FIELD=ZW(:,:,:) ) +ZW(:,:,:) = PCIS(:,:,:) +PCIS(:,:,:) = UNPACK( ZCIS(:),MASK=GNEGT(:,:,:),FIELD=ZW(:,:,:) ) +! +DEALLOCATE(ZRTMIN) +DEALLOCATE(ZCTMIN) +DEALLOCATE(ZRVT) +DEALLOCATE(ZRCT) +DEALLOCATE(ZRRT) +DEALLOCATE(ZRIT) +DEALLOCATE(ZRST) +DEALLOCATE(ZRGT) +DEALLOCATE(ZCIT) +DEALLOCATE(ZRVS) +DEALLOCATE(ZRCS) +DEALLOCATE(ZRIS) +DEALLOCATE(ZTHS) +DEALLOCATE(ZCCS) +DEALLOCATE(ZCIS) +DEALLOCATE(ZNAS) +DEALLOCATE(ZIFS) +DEALLOCATE(ZINS) +DEALLOCATE(ZNIS) +DEALLOCATE(ZRHODREF) +DEALLOCATE(ZZT) +DEALLOCATE(ZPRES) +DEALLOCATE(ZEXNREF) +DEALLOCATE(ZLSFACT) +DEALLOCATE(ZLVFACT) +DEALLOCATE(ZSI) +DEALLOCATE(ZTCELSIUS) +DEALLOCATE(ZZT_SI0_BC) +DEALLOCATE(ZLBDAC) +DEALLOCATE(ZSI0) +DEALLOCATE(Z_FRAC_ACT) +DEALLOCATE(ZSW) +DEALLOCATE(ZZW) +DEALLOCATE(ZZX) +DEALLOCATE(ZZY) +!++cb++ + DEALLOCATE(ZSI_W) +!--cb-- +! +END IF ! INEGT > 0 +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE LIMA_PHILLIPS diff --git a/src/mesonh/micro/lima_phillips_ifn_nucleation.f90 b/src/mesonh/micro/lima_phillips_ifn_nucleation.f90 new file mode 100644 index 000000000..1010555ff --- /dev/null +++ b/src/mesonh/micro/lima_phillips_ifn_nucleation.f90 @@ -0,0 +1,512 @@ +!MNH_LIC Copyright 2018-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ######################################## + MODULE MODI_LIMA_PHILLIPS_IFN_NUCLEATION +! ######################################## +! +INTERFACE + SUBROUTINE LIMA_PHILLIPS_IFN_NUCLEATION (PTSTEP, & + PRHODREF, PEXNREF, PPABST, & + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & + PCCT, PCIT, PNAT, PIFT, PINT, PNIT, & + P_TH_HIND, P_RI_HIND, P_CI_HIND, & + P_TH_HINC, P_RC_HINC, P_CC_HINC, & + PICEFR ) +! +REAL, INTENT(IN) :: PTSTEP +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHT ! Theta at time t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRIT ! Cloud ice m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGT ! Graupel m.r. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCCT ! Cloud water conc. at t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIT ! Cloud water conc. at t +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PNAT ! CCN conc. used for immersion nucl. +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PIFT ! Free IFN conc. +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PINT ! Nucleated IFN conc. +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PNIT ! Nucleated (by immersion) CCN conc. +! +REAL, DIMENSION(:,:,:), INTENT(OUT) :: P_TH_HIND +REAL, DIMENSION(:,:,:), INTENT(OUT) :: P_RI_HIND +REAL, DIMENSION(:,:,:), INTENT(OUT) :: P_CI_HIND +REAL, DIMENSION(:,:,:), INTENT(OUT) :: P_TH_HINC +REAL, DIMENSION(:,:,:), INTENT(OUT) :: P_RC_HINC +REAL, DIMENSION(:,:,:), INTENT(OUT) :: P_CC_HINC +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PICEFR +! +END SUBROUTINE LIMA_PHILLIPS_IFN_NUCLEATION +END INTERFACE +END MODULE MODI_LIMA_PHILLIPS_IFN_NUCLEATION +! +! ################################################################################# + SUBROUTINE LIMA_PHILLIPS_IFN_NUCLEATION (PTSTEP, & + PRHODREF, PEXNREF, PPABST, & + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & + PCCT, PCIT, PNAT, PIFT, PINT, PNIT, & + P_TH_HIND, P_RI_HIND, P_CI_HIND, & + P_TH_HINC, P_RC_HINC, P_CC_HINC, & + PICEFR ) +! ################################################################################# +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the heterogeneous nucleation +!! following Phillips (2008) for the time-split version of LIMA +!! +!! +!!** METHOD +!! ------ +!! The parameterization of Phillips (2008) is based on observed nucleation +!! in the CFDC for a range of T and Si values. Phillips therefore defines a +!! reference activity spectrum, that is, for given T and Si values, the +!! reference concentration of primary ice crystals. +!! +!! The activation of IFN is closely related to their total surface. Thus, +!! the activable fraction of each IFN specie is determined by an integration +!! over the particle size distributions. +!! +!! Subroutine organisation : +!! +!! 1- Preliminary computations +!! 2- Check where computations are necessary, and pack variables +!! 3- Compute the saturation over water and ice +!! 4- Compute the reference activity spectrum +!! -> CALL LIMA_PHILLIPS_REF_SPECTRUM +!! Integrate over the size distributions to compute the IFN activable fraction +!! -> CALL LIMA_PHILLIPS_INTEG +!! 5- Heterogeneous nucleation of insoluble IFN +!! 6- Heterogeneous nucleation of coated IFN +!! 7- Unpack variables & deallocations +!! +!! +!! REFERENCE +!! --------- +!! +!! Phillips et al., 2008: An empirical parameterization of heterogeneous +!! ice nucleation for multiple chemical species of aerosols, J. Atmos. Sci. +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original 15/03/2018 +! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 +! P. Wautelet 27/02/2020: bugfix: P_TH_HIND was not accumulated (will affect budgets) + add P_TH_HINC dummy argument +! + change intent of *_HIND and *_HINC dummy arguments (INOUT->OUT) +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST, ONLY : XP00, XRD, XMV, XMD, XCPD, XCPV, XCL, XCI, & + XTT, XLSTT, XLVTT, XALPI, XBETAI, XGAMI, & + XALPW, XBETAW, XGAMW, XPI +USE MODD_NSV, ONLY : NSV_LIMA_NC, NSV_LIMA_NI, NSV_LIMA_IFN_FREE +USE MODD_PARAMETERS, ONLY : JPHEXT, JPVEXT +USE MODD_PARAM_LIMA, ONLY : NMOD_IFN, NSPECIE, XFRAC, & + NMOD_CCN, NMOD_IMM, NIND_SPECIE, NINDICE_CCN_IMM, & + XDSI0, XRTMIN, XCTMIN, NPHILLIPS +USE MODD_PARAM_LIMA_COLD, ONLY : XMNU0 + +use mode_tools, only: Countjv + +USE MODI_LIMA_PHILLIPS_INTEG +USE MODI_LIMA_PHILLIPS_REF_SPECTRUM + +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +REAL, INTENT(IN) :: PTSTEP +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHT ! Theta at time t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRIT ! Cloud ice m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGT ! Graupel m.r. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCCT ! Cloud water conc. at t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIT ! Cloud water conc. at t +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PNAT ! CCN conc. used for immersion nucl. +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PIFT ! Free IFN conc. +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PINT ! Nucleated IFN conc. +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PNIT ! Nucleated (by immersion) CCN conc. +! +REAL, DIMENSION(:,:,:), INTENT(OUT) :: P_TH_HIND +REAL, DIMENSION(:,:,:), INTENT(OUT) :: P_RI_HIND +REAL, DIMENSION(:,:,:), INTENT(OUT) :: P_CI_HIND +REAL, DIMENSION(:,:,:), INTENT(OUT) :: P_TH_HINC +REAL, DIMENSION(:,:,:), INTENT(OUT) :: P_RC_HINC +REAL, DIMENSION(:,:,:), INTENT(OUT) :: P_CC_HINC +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PICEFR +! +! +!* 0.2 Declarations of local variables : +! +! +INTEGER :: IIB, IIE, IJB, IJE, IKB, IKE ! Physical domain +INTEGER :: JL, JMOD_CCN, JMOD_IFN, JSPECIE, JMOD_IMM ! Loop index +INTEGER :: INEGT ! Case number of sedimentation, nucleation, +! +LOGICAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: GNEGT ! Test where to compute the nucleation +! +INTEGER, DIMENSION(SIZE(PRHODREF)) :: I1,I2,I3 ! Indexes for PACK replacement +! +REAL, DIMENSION(:), ALLOCATABLE :: ZRVT ! Water vapor m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRCT ! Cloud water m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRRT ! Rain water m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRIT ! Pristine ice m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRGT ! Graupel/hail m.r. at t +! +REAL, DIMENSION(:), ALLOCATABLE :: ZCCT ! Cloud water conc. at t +! +REAL, DIMENSION(:,:), ALLOCATABLE :: ZNAT ! Cloud Cond. nuclei conc. source +REAL, DIMENSION(:,:), ALLOCATABLE :: ZIFT ! Free Ice nuclei conc. source +REAL, DIMENSION(:,:), ALLOCATABLE :: ZINT ! Nucleated Ice nuclei conc. source + !by Deposition/Contact +REAL, DIMENSION(:,:), ALLOCATABLE :: ZNIT ! Nucleated Ice nuclei conc. source + !by Immersion +! +REAL, DIMENSION(:), ALLOCATABLE & + :: ZRHODREF, & ! RHO Dry REFerence + ZRHODJ, & ! RHO times Jacobian + ZZT, & ! Temperature + ZPRES, & ! Pressure + ZEXNREF, & ! EXNer Pressure REFerence + ZZW, & ! Work array + ZZX, & ! Work array + ZZY, & ! Work array + ZLSFACT, & ! L_s/(Pi_ref*C_ph) + ZLVFACT, & ! L_v/(Pi_ref*C_ph) + ZLBDAC, & ! Slope parameter of the cloud droplet distr. + ZSI, & + ZSW, & + ZSI_W +! +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: ZW, ZT ! work arrays +! +REAL, DIMENSION(:,:), ALLOCATABLE :: ZSI0, & ! Si threshold in H_X for X={DM,BC,O} + Z_FRAC_ACT ! Activable frac. of each AP species +REAL, DIMENSION(:), ALLOCATABLE :: ZTCELSIUS, ZZT_SI0_BC +! +!------------------------------------------------------------------------------- +! +! +!* 1. PRELIMINARY COMPUTATIONS +! ------------------------ +! +P_TH_HIND(:,:,:) = 0. +P_RI_HIND(:,:,:) = 0. +P_CI_HIND(:,:,:) = 0. +P_TH_HINC(:,:,:) = 0. +P_RC_HINC(:,:,:) = 0. +P_CC_HINC(:,:,:) = 0. +! +! Physical domain +! +IIB=1+JPHEXT +IIE=SIZE(PTHT,1) - JPHEXT +IJB=1+JPHEXT +IJE=SIZE(PTHT,2) - JPHEXT +IKB=1+JPVEXT +IKE=SIZE(PTHT,3) - JPVEXT +! +! Temperature +! +ZT(:,:,:) = PTHT(:,:,:) * ( PPABST(:,:,:)/XP00 ) ** (XRD/XCPD) +! +! Saturation over ice +! +ZW(:,:,:) = EXP( XALPI - XBETAI/ZT(:,:,:) - XGAMI*ALOG(ZT(:,:,:) ) ) +ZW(:,:,:) = PRVT(:,:,:)*( PPABST(:,:,:)-ZW(:,:,:) ) / ( (XMV/XMD) * ZW(:,:,:) ) +! +! +!------------------------------------------------------------------------------- +! +! +!* 2. COMPUTATIONS ONLY WHERE NECESSARY : PACK +! ---------------------------------------- +! +! +GNEGT(:,:,:) = .FALSE. +GNEGT(IIB:IIE,IJB:IJE,IKB:IKE) = ZT(IIB:IIE,IJB:IJE,IKB:IKE)<XTT-2.0 .AND. & + ZW(IIB:IIE,IJB:IJE,IKB:IKE)>0.95 +! +INEGT = COUNTJV( GNEGT(:,:,:),I1(:),I2(:),I3(:)) +! +IF (INEGT > 0) THEN +! + ALLOCATE(ZRVT(INEGT)) + ALLOCATE(ZRCT(INEGT)) + ALLOCATE(ZRRT(INEGT)) + ALLOCATE(ZRIT(INEGT)) + ALLOCATE(ZRST(INEGT)) + ALLOCATE(ZRGT(INEGT)) +! + ALLOCATE(ZCCT(INEGT)) +! + ALLOCATE(ZNAT(INEGT,NMOD_CCN)) + ALLOCATE(ZIFT(INEGT,NMOD_IFN)) + ALLOCATE(ZINT(INEGT,NMOD_IFN)) + ALLOCATE(ZNIT(INEGT,NMOD_IMM)) +! + ALLOCATE(ZRHODREF(INEGT)) + ALLOCATE(ZZT(INEGT)) + ALLOCATE(ZPRES(INEGT)) + ALLOCATE(ZEXNREF(INEGT)) +! + DO JL=1,INEGT + ZRVT(JL) = PRVT(I1(JL),I2(JL),I3(JL)) + ZRCT(JL) = PRCT(I1(JL),I2(JL),I3(JL)) + ZRRT(JL) = PRRT(I1(JL),I2(JL),I3(JL)) + ZRIT(JL) = PRIT(I1(JL),I2(JL),I3(JL)) + ZRST(JL) = PRST(I1(JL),I2(JL),I3(JL)) + ZRGT(JL) = PRGT(I1(JL),I2(JL),I3(JL)) +! + ZCCT(JL) = PCCT(I1(JL),I2(JL),I3(JL)) +! + DO JMOD_CCN = 1, NMOD_CCN + ZNAT(JL,JMOD_CCN) = PNAT(I1(JL),I2(JL),I3(JL),JMOD_CCN) + ENDDO + DO JMOD_IFN = 1, NMOD_IFN + ZIFT(JL,JMOD_IFN) = PIFT(I1(JL),I2(JL),I3(JL),JMOD_IFN) + ZINT(JL,JMOD_IFN) = PINT(I1(JL),I2(JL),I3(JL),JMOD_IFN) + ENDDO + DO JMOD_IMM = 1, NMOD_IMM + ZNIT(JL,JMOD_IMM) = PNIT(I1(JL),I2(JL),I3(JL),JMOD_IMM) + ENDDO + ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) + ZZT(JL) = ZT(I1(JL),I2(JL),I3(JL)) + ZPRES(JL) = PPABST(I1(JL),I2(JL),I3(JL)) + ZEXNREF(JL) = PEXNREF(I1(JL),I2(JL),I3(JL)) + ENDDO +! +! PACK : done +! Prepare computations +! + ALLOCATE( ZLSFACT (INEGT) ) + ALLOCATE( ZLVFACT (INEGT) ) + ALLOCATE( ZSI (INEGT) ) + ALLOCATE( ZTCELSIUS (INEGT) ) + ALLOCATE( ZZT_SI0_BC (INEGT) ) + ALLOCATE( ZLBDAC (INEGT) ) + ALLOCATE( ZSI0 (INEGT,NSPECIE) ) + ALLOCATE( Z_FRAC_ACT (INEGT,NSPECIE) ) ; Z_FRAC_ACT(:,:) = 0.0 + ALLOCATE( ZSW (INEGT) ) + ALLOCATE( ZSI_W (INEGT) ) +! + ALLOCATE( ZZW (INEGT) ) ; ZZW(:) = 0.0 + ALLOCATE( ZZX (INEGT) ) ; ZZX(:) = 0.0 + ALLOCATE( ZZY (INEGT) ) ; ZZY(:) = 0.0 +! +! +!------------------------------------------------------------------------------- +! +! +!* 3. COMPUTE THE SATURATION OVER WATER AND ICE +! ----------------------------------------- +! +! + ZTCELSIUS(:) = ZZT(:)-XTT ! T [°C] + ZZW(:) = ZEXNREF(:)*( XCPD+XCPV*ZRVT(:)+XCL*(ZRCT(:)+ZRRT(:)) & + +XCI*(ZRIT(:)+ZRST(:)+ZRGT(:)) ) + ZLSFACT(:) = (XLSTT+(XCPV-XCI)*ZTCELSIUS(:))/ZZW(:) ! L_s/(Pi_ref*C_ph) + ZLVFACT(:) = (XLVTT+(XCPV-XCL)*ZTCELSIUS(:))/ZZW(:) ! L_v/(Pi_ref*C_ph) +! + ZZW(:) = EXP( XALPI - XBETAI/ZZT(:) - XGAMI*ALOG(ZZT(:) ) ) ! es_i + ZSI(:) = ZRVT(:)*(ZPRES(:)-ZZW(:))/((XMV/XMD)*ZZW(:)) ! Saturation over ice +! + ZZY(:) = EXP( XALPW - XBETAW/ZZT(:) - XGAMW*ALOG(ZZT(:) ) ) ! es_w + ZSW(:) = ZRVT(:)*(ZPRES(:)-ZZY(:))/((XMV/XMD)*ZZY(:)) ! Saturation over water +! + ZSI_W(:)= ZZY(:)/ZZW(:) ! Saturation over ice at water saturation: es_w/es_i +! +! Saturation parameters for H_X, with X={Dust/Metallic (2 modes), Black Carbon, Organic} +! + ZSI0(:,1) = 1.0 + 10.0**( -1.0261 + 3.1656E-3* ZTCELSIUS(:) & + + 5.3938E-4*(ZTCELSIUS(:)**2) & + + 8.2584E-6*(ZTCELSIUS(:)**3) ) ! with T [°C] + ZSI0(:,2) = ZSI0(:,1) ! DM2 = DM1 + ZSI0(:,3) = 0.0 ! BC + ZZT_SI0_BC(:) = MAX( 198.0, MIN( 239.0,ZZT(:) ) ) + ZSI0(:,3) = (-3.118E-5*ZZT_SI0_BC(:)+1.085E-2)*ZZT_SI0_BC(:)+0.5652 - XDSI0(3) + IF (NPHILLIPS == 8) THEN + ZSI0(:,4) = ZSI0(:,3) ! O = BC + ELSE IF (NPHILLIPS == 13) THEN + ZSI0(:,4) = 1.15 ! BIO + END IF +! +! +!------------------------------------------------------------------------------- +! +! +!* 4. COMPUTE THE ACTIVABLE FRACTION OF EACH IFN SPECIE +! ------------------------------------------------- +! +! +! Computation of the reference activity spectrum ( ZZY = N_{IN,1,*} ) +! + CALL LIMA_PHILLIPS_REF_SPECTRUM(ZZT, ZSI, ZSI_W, ZZY) +! +! For each aerosol species (DM1, DM2, BC, O), compute the fraction that may be activated +! Z_FRAC_ACT(INEGT,NSPECIE) = fraction of each species that may be activated +! + CALL LIMA_PHILLIPS_INTEG(ZZT, ZSI, ZSI0, ZSW, ZZY, Z_FRAC_ACT) +! +! +!------------------------------------------------------------------------------- +! +! +!* 5. COMPUTE THE HETEROGENEOUS NUCLEATION OF INSOLUBLE IFN +! ----------------------------------------------------- +! +! +! + DO JMOD_IFN = 1,NMOD_IFN ! IFN modes + ZZX(:)=0. + DO JSPECIE = 1, NSPECIE ! Each IFN mode is mixed with DM1, DM2, BC, O + ZZX(:)=ZZX(:)+XFRAC(JSPECIE,JMOD_IFN)*(ZIFT(:,JMOD_IFN)+ZINT(:,JMOD_IFN))* & + Z_FRAC_ACT(:,JSPECIE) + END DO +! Now : ZZX(:) = number conc. of activable AP. +! Activated AP at this time step = activable AP - already activated AP + ZZX(:) = MIN( ZIFT(:,JMOD_IFN), MAX( (ZZX(:)-ZINT(:,JMOD_IFN)),0.0 )) + ZZW(:) = MIN( XMNU0*ZZX(:), ZRVT(:) ) +! Now : ZZX(:) = number conc. of AP activated at this time step (#/kg) from IFN mode JMOD_IFN +! Now : ZZW(:) = mmr of ice nucleated at this time step (kg/kg) from IFN mode JMOD_IFN +! +! Update the concentrations and MMR +! + ZW(:,:,:) = UNPACK( ZZX(:), MASK=GNEGT(:,:,:), FIELD=0. ) + PIFT(:,:,:,JMOD_IFN) = PIFT(:,:,:,JMOD_IFN) - ZW(:,:,:) + PINT(:,:,:,JMOD_IFN) = PINT(:,:,:,JMOD_IFN) + ZW(:,:,:) +! + P_CI_HIND(:,:,:) = P_CI_HIND(:,:,:) + ZW(:,:,:) + PCIT(:,:,:) = PCIT(:,:,:) + ZW(:,:,:) +! + ZW(:,:,:) = UNPACK( ZZW(:), MASK=GNEGT(:,:,:), FIELD=0. ) + P_RI_HIND(:,:,:) = P_RI_HIND(:,:,:) + ZW(:,:,:) + PRVT(:,:,:) = PRVT(:,:,:) - ZW(:,:,:) + PRIT(:,:,:) = PRIT(:,:,:) + ZW(:,:,:) +! + ZW(:,:,:) = UNPACK( ZZW(:)*ZLSFACT(:), MASK=GNEGT(:,:,:), FIELD=0. ) + P_TH_HIND(:,:,:) = P_TH_HIND(:,:,:) + ZW(:,:,:) + PTHT(:,:,:) = PTHT(:,:,:) + ZW(:,:,:) + END DO +! +! +!------------------------------------------------------------------------------- +! +! +!* 6. COMPUTE THE HETEROGENEOUS NUCLEATION OF COATED IFN +! -------------------------------------------------- +! +! +! Heterogeneous nucleation by immersion of the activated CCN +! Currently, we represent coated IFN as a pure aerosol type (NIND_SPECIE) +! +! + DO JMOD_IMM = 1,NMOD_IMM ! Coated IFN modes + JMOD_CCN = NINDICE_CCN_IMM(JMOD_IMM) ! Corresponding CCN mode + IF (JMOD_CCN .GT. 0) THEN +! +! OLD LIMA : Compute the appropriate mean diameter and sigma +! XMDIAM_IMM = MIN( XMDIAM_IFN(NIND_SPECIE) , XR_MEAN_CCN(JMOD_CCN)*2. ) +! XSIGMA_IMM = MIN( XSIGMA_IFN(JSPECIE) , EXP(XLOGSIG_CCN(JMOD_CCN)) ) +! + ZZW(:) = MIN( ZCCT(:) , ZNAT(:,JMOD_CCN) ) + ZZX(:)= ( ZZW(:)+ZNIT(:,JMOD_IMM) ) * Z_FRAC_ACT(:,NIND_SPECIE) +! Now : ZZX(:) = number of activable AP. +! Activated AP at this time step = activable AP - already activated AP + ZZX(:) = MIN( ZZW(:), MAX( (ZZX(:)-ZNIT(:,JMOD_IMM)),0.0 ) ) + ZZY(:) = MIN( XMNU0*ZZX(:) , ZRVT(:), ZRCT(:) ) +! +! Update the concentrations and MMR +! + ZW(:,:,:) = UNPACK( ZZX(:), MASK=GNEGT(:,:,:), FIELD=0. ) + PNIT(:,:,:,JMOD_IMM) = PNIT(:,:,:,JMOD_IMM) + ZW(:,:,:) + PNAT(:,:,:,JMOD_CCN) = PNAT(:,:,:,JMOD_CCN) - ZW(:,:,:) +! + P_CC_HINC(:,:,:) = P_CC_HINC(:,:,:) - ZW(:,:,:) + PCCT(:,:,:) = PCCT(:,:,:) - ZW(:,:,:) + PCIT(:,:,:) = PCIT(:,:,:) + ZW(:,:,:) +! + ZW(:,:,:) = UNPACK( ZZY(:), MASK=GNEGT(:,:,:), FIELD=0. ) + P_RC_HINC(:,:,:) = P_RC_HINC(:,:,:) - ZW(:,:,:) + PRCT(:,:,:) = PRCT(:,:,:) - ZW(:,:,:) + PRIT(:,:,:) = PRIT(:,:,:) + ZW(:,:,:) +! + ZW(:,:,:) = UNPACK( ZZY(:)*ZLSFACT(:), MASK=GNEGT(:,:,:), FIELD=0. ) + P_TH_HINC(:,:,:) = P_TH_HINC(:,:,:) + ZW(:,:,:) + PTHT(:,:,:) = PTHT(:,:,:) + ZW(:,:,:) + END IF + END DO +! +!------------------------------------------------------------------------------- +! +! +!* 7. CLEAN +! ----- +! +! + DEALLOCATE(ZRVT) + DEALLOCATE(ZRCT) + DEALLOCATE(ZRRT) + DEALLOCATE(ZRIT) + DEALLOCATE(ZRST) + DEALLOCATE(ZRGT) + DEALLOCATE(ZCCT) + DEALLOCATE(ZNAT) + DEALLOCATE(ZIFT) + DEALLOCATE(ZINT) + DEALLOCATE(ZNIT) + DEALLOCATE(ZRHODREF) + DEALLOCATE(ZZT) + DEALLOCATE(ZPRES) + DEALLOCATE(ZEXNREF) + DEALLOCATE(ZLSFACT) + DEALLOCATE(ZLVFACT) + DEALLOCATE(ZSI) + DEALLOCATE(ZTCELSIUS) + DEALLOCATE(ZZT_SI0_BC) + DEALLOCATE(ZLBDAC) + DEALLOCATE(ZSI0) + DEALLOCATE(Z_FRAC_ACT) + DEALLOCATE(ZSW) + DEALLOCATE(ZZW) + DEALLOCATE(ZZX) + DEALLOCATE(ZZY) + DEALLOCATE(ZSI_W) +! +END IF ! INEGT > 0 +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE LIMA_PHILLIPS_IFN_NUCLEATION diff --git a/src/mesonh/micro/lima_phillips_integ.f90 b/src/mesonh/micro/lima_phillips_integ.f90 new file mode 100644 index 000000000..3af3048c6 --- /dev/null +++ b/src/mesonh/micro/lima_phillips_integ.f90 @@ -0,0 +1,163 @@ +! ############################### + MODULE MODI_LIMA_PHILLIPS_INTEG +! ############################### +! +INTERFACE + SUBROUTINE LIMA_PHILLIPS_INTEG (ZZT, ZSI, ZSI0, ZSW, ZZY, Z_FRAC_ACT) +! +REAL, DIMENSION(:), INTENT(IN) :: ZZT +REAL, DIMENSION(:), INTENT(IN) :: ZSI +REAL, DIMENSION(:,:), INTENT(IN) :: ZSI0 +REAL, DIMENSION(:), INTENT(IN) :: ZSW +REAL, DIMENSION(:), INTENT(IN) :: ZZY +REAL, DIMENSION(:,:), INTENT(INOUT) :: Z_FRAC_ACT +! +END SUBROUTINE LIMA_PHILLIPS_INTEG +END INTERFACE +END MODULE MODI_LIMA_PHILLIPS_INTEG +! +! ###################################################################### + SUBROUTINE LIMA_PHILLIPS_INTEG (ZZT, ZSI, ZSI0, ZSW, ZZY, Z_FRAC_ACT) +! ###################################################################### +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the fraction of each aerosol +!! species (DM1, DM2, BC, O) that may be activated, following Phillips (2008) +!! +!! +!! REFERENCE +!! --------- +!! +!! Phillips et al., 2008: An empirical parameterization of heterogeneous +!! ice nucleation for multiple chemical species of aerosols, J. Atmos. Sci. +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST, ONLY : XTT, XPI +USE MODD_PARAM_LIMA, ONLY : XMDIAM_IFN, XSIGMA_IFN, NSPECIE, XFRAC_REF, & + XH, XAREA1, XGAMMA, XABSCISS, XWEIGHT, NDIAM, & + XT0, XDT0, XDSI0, XSW0, XTX1, XTX2 +USE MODI_LIMA_FUNCTIONS, ONLY : DELTA, DELTA_VEC +USE MODI_GAMMA_INC +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +REAL, DIMENSION(:), INTENT(IN) :: ZZT +REAL, DIMENSION(:), INTENT(IN) :: ZSI +REAL, DIMENSION(:,:), INTENT(IN) :: ZSI0 +REAL, DIMENSION(:), INTENT(IN) :: ZSW +REAL, DIMENSION(:), INTENT(IN) :: ZZY +REAL, DIMENSION(:,:), INTENT(INOUT) :: Z_FRAC_ACT +! +!* 0.2 Declarations of local variables : +! +INTEGER :: JSPECIE, JL, JL2 +REAL :: XB +! +REAL, DIMENSION(:), ALLOCATABLE :: ZZX, & ! Work array + ZFACTOR, & + ZSUBSAT, & + ZEMBRYO +! +LOGICAL, DIMENSION(:), ALLOCATABLE :: GINTEG ! Mask to integrate over the + ! AP size spectrum +! +! +!------------------------------------------------------------------------------- +! +! +DO JSPECIE = 1, NSPECIE ! = 4 = {DM1, DM2, BC, O} respectively +! + ALLOCATE(ZZX (SIZE(ZZT)) ) ; ZZX(:) = 0.0 + ALLOCATE(ZFACTOR (SIZE(ZZT)) ) + ALLOCATE(ZSUBSAT (SIZE(ZZT)) ) + ALLOCATE(ZEMBRYO (SIZE(ZZT)) ) + ALLOCATE(GINTEG (SIZE(ZZT)) ) + +! Compute log in advance for efficiency + XB = LOG(0.1E-6/XMDIAM_IFN(JSPECIE))/(SQRT(2.0)*LOG(XSIGMA_IFN(JSPECIE))) +! ZFACTOR = f_c + ZFACTOR(:) = DELTA(1.,XH(JSPECIE),ZZT(:),XT0(JSPECIE),XT0(JSPECIE)+XDT0(JSPECIE)) & + * DELTA_VEC(0.,1.,ZSI(:),ZSI0(:,JSPECIE),ZSI0(:,JSPECIE)+XDSI0(JSPECIE)) / XGAMMA +! ZSUBSAT = H_X + ZSUBSAT(:) = MIN(ZFACTOR(:)+(1.0-ZFACTOR(:))*DELTA(0.,1.,ZSW(:),XSW0,1.) , 1.0) +! ZEMBRYO = µ_X/(pi*(D_X)**2) = A + ZEMBRYO(:) = ZSUBSAT(:)*DELTA(1.,0.,ZZT(:),XTX1(JSPECIE),XTX2(JSPECIE)) & + * XFRAC_REF(JSPECIE)*ZZY(:)/XAREA1(JSPECIE) +! +! For T warmer than -35°C, the integration is approximated with µ_X << 1 +! Error function : GAMMA_INC(1/2, x**2) = ERF(x) !!! for x>=0 !!! +! +! WHERE (ZZT(:)>(XTT-35.) .AND. ZEMBRYO(:)>1.0E-8) +! ZZX(:) = ZZX(:) + ZEMBRYO(:) * XPI * (XMDIAM_IFN(JSPECIE))**2 / 2.0 & +! * EXP(2*(LOG(XSIGMA_IFN(JSPECIE)))**2) & +! * (1.0+GAMMA_INC(0.5,(SQRT(2.0)*LOG(XSIGMA_IFN(JSPECIE))-XB)**2)) +! END WHERE + + DO JL = 1, SIZE(ZZT) + IF (ZZT(JL)>(XTT-35.) .AND. ZEMBRYO(JL)>1.0E-8) THEN + ZZX(JL) = ZZX(JL) + ZEMBRYO(JL) * XPI * (XMDIAM_IFN(JSPECIE))**2 / 2.0 & + * EXP(2*(LOG(XSIGMA_IFN(JSPECIE)))**2) & + * (1.0+SIGN(1.,SQRT(2.0)*LOG(XSIGMA_IFN(JSPECIE))-XB)*GAMMA_INC(0.5,(SQRT(2.0)*LOG(XSIGMA_IFN(JSPECIE))-XB)**2)) + END IF + ENDDO + +! +! For other T, integration between 0 and infinity is made with a Gauss-Hermite +! quadrature method and integration between 0 and 0.1 uses e(x) ~ 1+x+O(x**2) +! Beware : here, weights are normalized : XWEIGHT = wi/sqrt(pi) +! + GINTEG(:) = ZZT(:)<=(XTT-35.) .AND. ZSI(:)>1.0 .AND. ZEMBRYO(:)>1.0E-8 +! + DO JL = 1, NDIAM + DO JL2 = 1, SIZE(GINTEG) + IF (GINTEG(JL2)) THEN + ZZX(JL2) = ZZX(JL2) - XWEIGHT(JL)*EXP(-ZEMBRYO(JL2)*XPI*(XMDIAM_IFN(JSPECIE))**2 & + * EXP(2.0*SQRT(2.0)*LOG(XSIGMA_IFN(JSPECIE)) * XABSCISS(JL)) ) + END IF + ENDDO + ENDDO +! +! DO JL2 = 1, SIZE(GINTEG) +! IF (GINTEG(JL2)) THEN +! ZZX(JL2) = ZZX(JL2) + 0.5* XPI*ZEMBRYO(JL2)*(XMDIAM_IFN(JSPECIE))**2 & +! * (1.0-( 1.0-GAMMA_INC(0.5,(SQRT(2.0)*LOG(XSIGMA_IFN(JSPECIE))-XB)**2)) & +! * EXP( 2.0*(LOG(XSIGMA_IFN(JSPECIE)))**2) ) +! END IF +! ENDDO + DO JL2 = 1, SIZE(GINTEG) + IF (GINTEG(JL2)) THEN + ZZX(JL2) = 1 + ZZX(JL2) & + - ( 0.5* XPI*ZEMBRYO(JL2)*(XMDIAM_IFN(JSPECIE))**2 * EXP( 2.0*(LOG(XSIGMA_IFN(JSPECIE)))**2) & + * ( 1.0-SIGN(1.,SQRT(2.0)*LOG(XSIGMA_IFN(JSPECIE))-XB)*GAMMA_INC(0.5,(SQRT(2.0)*LOG(XSIGMA_IFN(JSPECIE))-XB)**2)) ) + END IF + ENDDO +! + Z_FRAC_ACT(:,JSPECIE)=ZZX(:) +! + DEALLOCATE(ZZX) + DEALLOCATE(ZFACTOR) + DEALLOCATE(ZSUBSAT) + DEALLOCATE(ZEMBRYO) + DEALLOCATE(GINTEG) +! +ENDDO +! +END SUBROUTINE LIMA_PHILLIPS_INTEG diff --git a/src/mesonh/micro/lima_phillips_ref_spectrum.f90 b/src/mesonh/micro/lima_phillips_ref_spectrum.f90 new file mode 100644 index 000000000..d549d7051 --- /dev/null +++ b/src/mesonh/micro/lima_phillips_ref_spectrum.f90 @@ -0,0 +1,140 @@ +! ###################################### + MODULE MODI_LIMA_PHILLIPS_REF_SPECTRUM +! ###################################### +! +INTERFACE + SUBROUTINE LIMA_PHILLIPS_REF_SPECTRUM (ZZT, ZSI, ZSI_W, ZZY) +! +REAL, DIMENSION(:), INTENT(IN) :: ZZT ! Temperature +REAL, DIMENSION(:), INTENT(IN) :: ZSI ! Saturation over ice +REAL, DIMENSION(:), INTENT(IN) :: ZSI_W ! Saturation over ice at water sat. +REAL, DIMENSION(:), INTENT(INOUT) :: ZZY ! Reference activity spectrum +! +END SUBROUTINE LIMA_PHILLIPS_REF_SPECTRUM +END INTERFACE +END MODULE MODI_LIMA_PHILLIPS_REF_SPECTRUM +! +! ###################################################################### + SUBROUTINE LIMA_PHILLIPS_REF_SPECTRUM (ZZT, ZSI, ZSI_W, ZZY) +! ###################################################################### +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the reference activation spectrum +!! described by Phillips (2008) +!! +!! +!! REFERENCE +!! --------- +!! +!! Phillips et al., 2008: An empirical parameterization of heterogeneous +!! ice nucleation for multiple chemical species of aerosols, J. Atmos. Sci. +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST, ONLY : XTT +USE MODD_PARAM_LIMA, ONLY : XGAMMA, XRHO_CFDC +USE MODI_LIMA_FUNCTIONS, ONLY : RECT, DELTA +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +REAL, DIMENSION(:), INTENT(IN) :: ZZT ! Temperature +REAL, DIMENSION(:), INTENT(IN) :: ZSI ! Saturation over ice +REAL, DIMENSION(:), INTENT(IN) :: ZSI_W ! Saturation over ice at water sat. +REAL, DIMENSION(:), INTENT(INOUT) :: ZZY ! Reference activity spectrum +! +!* 0.2 Declarations of local variables : +! +REAL, DIMENSION(:), ALLOCATABLE :: ZMAX, & + ZMOY, & + ZZY1, & + ZZY2, & + Z1, & + Z2, & + ZSI2 +! +REAL :: XPSI +! +!------------------------------------------------------------------------------- +! +ALLOCATE(ZMAX(SIZE(ZZT))) ; ZMAX(:)= 0.0 +ALLOCATE(ZMOY(SIZE(ZZT))) ; ZMOY(:)= 0.0 +ALLOCATE(ZZY1(SIZE(ZZT))) ; ZZY1(:)= 0.0 +ALLOCATE(ZZY2(SIZE(ZZT))) ; ZZY2(:)= 0.0 +ALLOCATE(Z1(SIZE(ZZT))) ; Z1(:) = 0.0 +ALLOCATE(Z2(SIZE(ZZT))) ; Z2(:) = 0.0 +ALLOCATE(ZSI2(SIZE(ZZT))) ; ZSI2(:)= 0.0 +! +ZZY(:) = 0.0 +! +XPSI = 0.058707*XGAMMA/XRHO_CFDC +! +ZSI2(:)=min(ZSI(:),ZSI_W(:)) +! +WHERE( ZSI(:)>1.0 ) +! +!* T <= -35 C +! + ZZY(:) =1000.*XGAMMA/XRHO_CFDC & + * ( EXP(12.96*(MIN(ZSI2(:),7.)-1.1)) )**0.3 & + * RECT(1.,0.,ZZT(:),(XTT-80.),(XTT-35.)) +! +!* -35 C < T <= -25 C (in Appendix A) +! + ZZY1(:) =1000.*XGAMMA/XRHO_CFDC & + * ( EXP(12.96*(MIN(ZSI2(:),7.)-1.1)) )**0.3 + ZZY2(:) =1000.*XPSI & + * EXP(12.96*(MIN(ZSI2(:),7.)-1.0)-0.639) +! +!* -35 C < T <= -30 C +! + ZMAX(:) =1000.*XGAMMA/XRHO_CFDC & + * ( EXP(12.96*(ZSI_W(:)-1.1)) )**0.3 & + * RECT(1.,0.,ZZT(:),(XTT-35.),(XTT-30.)) +! +!* -30 C < T <= -25 C +! + ZMAX(:) = ZMAX(:) +1000.*XPSI & + * EXP( 12.96*(ZSI_W(:)-1.0)-0.639 ) & + * RECT(1.,0.,ZZT(:),(XTT-30.),(XTT-25.)) + Z1(:) = MIN(ZZY1(:), ZMAX(:)) + Z2(:) = MIN(ZZY2(:), ZMAX(:)) +! +!* T > -25 C +! + ZZY(:) = ZZY(:) + 1000.*XPSI & + * EXP( 12.96*(MIN(ZSI2(:),7.)-1.0)-0.639 ) & + * RECT(1.,0.,ZZT(:),(XTT-25.),(XTT-2.)) +END WHERE +! +WHERE (Z2(:)>0.0 .AND. Z1(:)>0.0) + ZMOY(:) = Z2(:)*(Z1(:)/Z2(:))**DELTA(1.,0.,ZZT(:),(XTT-35.),(XTT-25.)) + ZZY(:) = ZZY(:) + MIN(ZMOY(:),ZMAX(:)) ! N_{IN,1,*} +END WHERE +! +!++cb++ +DEALLOCATE(ZMAX) +DEALLOCATE(ZMOY) +DEALLOCATE(ZZY1) +DEALLOCATE(ZZY2) +DEALLOCATE(Z1) +DEALLOCATE(Z2) +!--cb-- +! +END SUBROUTINE LIMA_PHILLIPS_REF_SPECTRUM diff --git a/src/mesonh/micro/lima_precip_scavenging.f90 b/src/mesonh/micro/lima_precip_scavenging.f90 new file mode 100644 index 000000000..aaabf3f29 --- /dev/null +++ b/src/mesonh/micro/lima_precip_scavenging.f90 @@ -0,0 +1,856 @@ +!MNH_LIC Copyright 2013-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ################################## + MODULE MODI_LIMA_PRECIP_SCAVENGING +! ################################## +! +INTERFACE + SUBROUTINE LIMA_PRECIP_SCAVENGING (HCLOUD, KLUOUT, KTCOUNT, PTSTEP, & + PRRT, PRHODREF, PRHODJ, PZZ, & + PPABST, PTHT, PSVT, PRSVS, PINPAP ) + +use modd_nsv, only: nsv_lima_beg + +CHARACTER(LEN=4), INTENT(IN) :: HCLOUD ! cloud paramerization +INTEGER, INTENT(IN) :: KLUOUT ! unit for output listing +INTEGER, INTENT(IN) :: KTCOUNT ! iteration count +REAL, INTENT(IN) :: PTSTEP ! Double timestep except + ! for the first time step +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain mixing ratio at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Air Density [kg/m**3] +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry Density [kg] +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Altitude +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! Absolute pressure at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t +! +REAL, DIMENSION(:,:,:,NSV_LIMA_BEG:), INTENT(IN) :: PSVT ! Particle Concentration [kg-1] +REAL, DIMENSION(:,:,:,NSV_LIMA_BEG:), INTENT(INOUT) :: PRSVS ! Total Number Scavenging Rate +! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPAP +! +END SUBROUTINE LIMA_PRECIP_SCAVENGING +END INTERFACE +END MODULE MODI_LIMA_PRECIP_SCAVENGING +! +!######################################################################## + SUBROUTINE LIMA_PRECIP_SCAVENGING (HCLOUD, KLUOUT, KTCOUNT, PTSTEP, & + PRRT, PRHODREF, PRHODJ, PZZ, & + PPABST, PTHT, PSVT, PRSVS, PINPAP ) +!########################################################################x +! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the total number +!! below-cloud scavenging rate. +!! +!! +!!** METHOD +!! ------ +!! We assume a generalized gamma distribution law for the raindrop. +!! The aerosols particles distribution follows a log-normal law. +!! First, we have to compute the Collision Efficiency, which takes +!! account of the three most important wet removal mechanism : +!! Brownian diffusion, interception and inertial impaction. +!! It is a function of several number (like Reynolds, Schmidt +!! or Stokes number for instance). Consequently, +!! we need first to calculate these numbers. +!! +!! Then the scavenging coefficient is deduced from the integration +!! of the droplet size distribution, the falling velocity of +!! raindrop and aerosol, their diameter, and the collision +!! (or collection) efficiency, over the spectrum of droplet +!! diameters. +!! +!! The total scavenging rate of aerosol is computed from the +!! integration, over all the spectrum of particles aerosols +!! diameters, of the scavenging coefficient. +!! +!! +!! EXTERNAL +!! -------- +!! Subroutine SCAV_MASS_SEDIMENTATION +!! +!! Function COLL_EFFIC : computes the collision efficiency +!! +!! Function CONTJV | +!! Function GAUHER | +!! Function GAULAG |-> in lima_functions.f90 +!! Function GAMMLN | +!! +!! +!! REFERENCES +!! ---------- +!! Seinfeld and Pandis +!! Andronache +!! +!! AUTHOR +!! ------ +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! +! P. Wautelet 28/05/2018: corrected truncated integer division (3/2 -> 1.5) +! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 +! P. Wautelet 03/2020: use the new data structures and subroutines for budgets +! P. Wautelet 03/06/2020: bugfix: correct array starts for PSVT and PRSVS +! P. Wautelet 11/02/2021: bugfix: ZRTMIN was of wrong size (replaced by a scalar) +! P. Wautelet 11/02/2021: budgets: add missing term SCAV for NSV_LIMA_SCAVMASS budget +!------------------------------------------------------------------------------- +! +!* 0.DECLARATIONS +! -------------- +! +use modd_budget, only: lbudget_sv, NBUDGET_SV1, tbudgets +USE MODD_CST +USE MODD_NSV +USE MODD_PARAMETERS +USE MODD_PARAM_LIMA, ONLY: NMOD_IFN, NSPECIE, XFRAC, & + XMDIAM_IFN, XSIGMA_IFN, XRHO_IFN, & + NMOD_CCN, XR_MEAN_CCN, XLOGSIG_CCN, XRHO_CCN, & + XALPHAR, XNUR, & + LAERO_MASS, NDIAMR, NDIAMP, XT0SCAV, XTREF, XNDO, & + XMUA0, XT_SUTH_A, XMFPA0, XVISCW, XRHO00, & + XRTMIN, XCTMIN +USE MODD_PARAM_LIMA_WARM, ONLY: XCR, XDR + +use mode_budget, only: Budget_store_init, Budget_store_end +use mode_tools, only: Countjv + +USE MODI_GAMMA +USE MODI_INI_NSV +USE MODI_LIMA_FUNCTIONS + +IMPLICIT NONE +! +!* 0.1 declarations of dummy arguments : +! +CHARACTER(LEN=4), INTENT(IN) :: HCLOUD ! cloud paramerization +INTEGER, INTENT(IN) :: KLUOUT ! unit for output listing +INTEGER, INTENT(IN) :: KTCOUNT ! iteration count +REAL, INTENT(IN) :: PTSTEP ! Double timestep except + ! for the first time step +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain mixing ratio at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Air Density [kg/m**3] +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry Density [kg] +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Altitude +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! Absolute pressure at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t +! +REAL, DIMENSION(:,:,:,NSV_LIMA_BEG:), INTENT(IN) :: PSVT ! Particle Concentration [/m**3] +REAL, DIMENSION(:,:,:,NSV_LIMA_BEG:), INTENT(INOUT) :: PRSVS ! Total Number Scavenging Rate +! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPAP +! +!* 0.2 Declarations of local variables : +! +INTEGER :: IIB ! Define the domain where is +INTEGER :: IIE ! the microphysical sources have to be computed +INTEGER :: IJB ! +INTEGER :: IJE ! +INTEGER :: IKB ! +INTEGER :: IKE ! +! +INTEGER :: JSV ! CCN or IFN mode +INTEGER :: J1, J2, IJ, JMOD +! +LOGICAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: GRAIN, &! Test where rain is present + GSCAV ! Test where rain is present +INTEGER , DIMENSION(SIZE(GSCAV)) :: I1,I2,I3 ! Used to replace the COUNT +INTEGER :: JL ! and PACK intrinsics +INTEGER :: ISCAV +! +REAL :: ZDENS_RATIO, & !density ratio + ZNUM, & !PNU-1. + ZSHAPE_FACTOR +! +REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) :: ZW ! work array +REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) :: PCRT ! cloud droplet conc. +! +REAL, DIMENSION(:), ALLOCATABLE :: ZLAMBDAR, & !slope parameter of the + ! generalized Gamma + !distribution law for the + !raindrop + ZVISC_RATIO, & !viscosity ratio + ZMFPA, & !Mean Free Path + ZRHODREF, & !Air Density [kg/m**3] + ZVISCA, & !Viscosity of Air [kg/(m*s)] + ZT, & !Absolute Temperature + ZPABST, & + ZRRT, & + ZCONCP, & + ZCONCR, & + ZTOT_SCAV_RATE,& + ZTOT_MASS_RATE,& + ZMEAN_SCAV_COEF +! +REAL, DIMENSION(:,:), ALLOCATABLE :: & + ZVOLDR, & !Mean volumic Raindrop diameter [m] + ZBC_SCAV_COEF, & + ZCUNSLIP, & !CUnningham SLIP correction factor + ZST_STAR, & !critical Stokes number for impaction + ZSC, & !aerosol particle Schmidt number + ZRE, & !raindrop Reynolds number (for radius) + ZFVELR, & !Falling VELocity of the Raindrop + ZRELT, & !RELaxation Time of the particle [s] + ZDIFF !Particle Diffusivity +! +REAL, DIMENSION(NDIAMP) :: ZVOLDP, & !Mean volumic diameter [m] + ZABSCISSP, & !Aerosol Abscisses + ZWEIGHTP !Aerosol Weights +REAL, DIMENSION(NDIAMR) :: ZABSCISSR, & !Raindrop Abscisses + ZWEIGHTR !Raindrop Weights +! +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZCOL_EF, &! Collision efficiency + ZSIZE_RATIO, &! Size Ratio + ZST ! Stokes number +! +REAL, DIMENSION(SIZE(PRRT,1),SIZE(PRRT,2),SIZE(PRRT,3)) :: ZRRS +! +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: PMEAN_SCAV_COEF, & !Mean Scavenging + ! Coefficient + PTOT_SCAV_RATE, & !Total Number + ! Scavenging Rate + PTOT_MASS_RATE !Total Mass + ! Scavenging Rate +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3),NDIAMP) & + ::PBC_SCAV_COEF !Scavenging Coefficient +REAL, DIMENSION(:), ALLOCATABLE :: ZKNUDSEN ! Knuudsen number +! +! Opt. BVIE +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: ZT_3D, ZCONCR_3D, ZVISCA_3D, ZMFPA_3D, & + ZVISC_RATIO_3D, ZLAMBDAR_3D, FACTOR_3D +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3),NDIAMP) & + :: ZVOLDR_3D, ZVOLDR_3D_INV, ZVOLDR_3D_POW, & + ZFVELR_3D, ZRE_3D, ZRE_3D_SQRT, ZST_STAR_3D +REAL, DIMENSION(:), ALLOCATABLE :: FACTOR +REAL, DIMENSION(:,:), ALLOCATABLE :: & + ZRE_SQRT, & ! SQRT of raindrop Reynolds number + ZRE_INV, & ! INV of raindrop Reynolds number + ZSC_INV, & ! INV of aerosol particle Schmidt number + ZSC_SQRT, & ! SQRT of aerosol particle Schmidt number + ZSC_3SQRT, & ! aerosol particle Schmidt number**(1./3.) + ZVOLDR_POW, & ! Mean volumic Raindrop diameter [m] **(2+ZDR) + ZVOLDR_INV ! INV of Mean volumic Raindrop diameter [m] +REAL :: ZDENS_RATIO_SQRT +INTEGER :: SV_VAR, NM, JM +integer :: idx +REAL :: XMDIAMP +REAL :: XSIGMAP +REAL :: XRHOP +REAL :: XFRACP +! +! +! +!------------------------------------------------------------------------------ + +if ( lbudget_sv ) then + do jl = 1, nmod_ccn + idx = nsv_lima_ccn_free - 1 + jl + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + idx), 'SCAV', prsvs(:, :, :, idx) ) + end do + do jl = 1, nmod_ifn + idx = nsv_lima_ifn_free - 1 + jl + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + idx), 'SCAV', prsvs(:, :, :, idx) ) + end do + if ( laero_mass ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_scavmass), 'SCAV', prsvs(:, :, :, nsv_lima_scavmass) ) + end if +end if +! +!* 1. PRELIMINARY COMPUTATIONS +! ------------------------ +! +! +IIB=1+JPHEXT +IIE=SIZE(PRHODREF,1) - JPHEXT +IJB=1+JPHEXT +IJE=SIZE(PRHODREF,2) - JPHEXT +IKB=1+JPVEXT +IKE=SIZE(PRHODREF,3) - JPVEXT +! +! PCRT +PCRT(:,:,:)=PSVT(:,:,:,NSV_LIMA_NR) +! +! Rain mask +GRAIN(:,:,:) = .FALSE. +GRAIN(IIB:IIE,IJB:IJE,IKB:IKE) = (PRRT(IIB:IIE,IJB:IJE,IKB:IKE)>XRTMIN(3) & + .AND. PCRT(IIB:IIE,IJB:IJE,IKB:IKE)>XCTMIN(3) ) +! +! Initialize the total mass scavenging rate if LAERO_MASS=T +IF (LAERO_MASS) PTOT_MASS_RATE(:,:,:) = 0. +! +! Quadrature method: compute absissae and weights +CALL GAUHER(ZABSCISSP,ZWEIGHTP,NDIAMP) +ZNUM = XNUR-1.0E0 +CALL GAULAG(ZABSCISSR,ZWEIGHTR,NDIAMR,ZNUM) +! +! +!------------------------------------------------------------------------------ +! +! +!* 2. NUMERICAL OPTIMIZATION +! ---------------------- +! +! +! Optimization : compute in advance parameters depending on rain particles and +! environment conditions only, to avoid multiple identical computations in loops +! +! +ZSHAPE_FACTOR = GAMMA_X0D(XNUR+3./XALPHAR)/GAMMA_X0D(XNUR) +! +WHERE ( GRAIN(:,:,:) ) + ! + ZT_3D(:,:,:) = PTHT(:,:,:) * ( PPABST(:,:,:)/XP00 )**(XRD/XCPD) + ZCONCR_3D(:,:,:) = PCRT(:,:,:) * PRHODREF(:,:,:) ![/m3] + ! Sutherland law for viscosity of air + ZVISCA_3D(:,:,:) = XMUA0*(ZT_3D(:,:,:)/XTREF)**1.5*(XTREF+XT_SUTH_A) & + /(XT_SUTH_A+ZT_3D(:,:,:)) + ! Air mean free path + ZMFPA_3D(:,:,:) = XMFPA0*(XP00*ZT_3D(:,:,:))/(PPABST(:,:,:)*XT0SCAV) + ! Viscosity ratio + ZVISC_RATIO_3D(:,:,:) = ZVISCA_3D(:,:,:)/XVISCW !!!!! inversé par rapport à orig. ! + ! Rain drops parameters + ZLAMBDAR_3D(:,:,:) = ( ((XPI/6.)*ZSHAPE_FACTOR*XRHOLW*ZCONCR_3D(:,:,:)) & + /(PRHODREF(:,:,:)*PRRT(:,:,:)) )**(1./3.) ![/m] + FACTOR_3D(:,:,:) = XPI*0.25*ZCONCR_3D(:,:,:)*XCR*(XRHO00/PRHODREF(:,:,:))**(0.4) + ! +END WHERE +! +DO J2=1,NDIAMR + WHERE ( GRAIN(:,:,:) ) + ! exchange of variables: [m] + ZVOLDR_3D(:,:,:,J2) = ZABSCISSR(J2)**(1./XALPHAR)/ZLAMBDAR_3D(:,:,:) + ZVOLDR_3D_INV(:,:,:,J2) = 1./ZVOLDR_3D(:,:,:,J2) + ZVOLDR_3D_POW(:,:,:,J2) = ZVOLDR_3D(:,:,:,J2)**(2.+XDR) + ! Raindrop Falling VELocity [m/s] + ZFVELR_3D(:,:,:,J2) = XCR*(ZVOLDR_3D(:,:,:,J2)**XDR)*(XRHO00/PRHODREF(:,:,:))**(0.4) + ! Reynolds number + ZRE_3D(:,:,:,J2) = ZVOLDR_3D(:,:,:,J2)*ZFVELR_3D(:,:,:,J2) & + *PRHODREF(:,:,:)/(2.0*ZVISCA_3D(:,:,:)) + ZRE_3D_SQRT(:,:,:,J2) = SQRT( ZRE_3D(:,:,:,J2) ) + ! Critical Stokes number + ZST_STAR_3D(:,:,:,J2) = (1.2+(LOG(1.+ZRE_3D(:,:,:,J2)))/12.) & + /(1.+LOG(1.+ZRE_3D(:,:,:,J2))) + END WHERE +END DO +! +! +!------------------------------------------------------------------------------ +! +! +!* 3. AEROSOL SCAVENGING +! ------------------ +! +! +! Iteration over the aerosol type and mode +! +DO JSV = 1, NMOD_CCN+NMOD_IFN +! + IF (JSV .LE. NMOD_CCN) THEN + JMOD = JSV + SV_VAR = NSV_LIMA_CCN_FREE -1 + JMOD ! Variable number in PSVT + NM = 1 ! Number of species (for IFN int. mixing) + ELSE + JMOD = JSV - NMOD_CCN + SV_VAR = NSV_LIMA_IFN_FREE -1 + JMOD + NM = NSPECIE + END IF +! + PBC_SCAV_COEF(:,:,:,:) = 0. + PMEAN_SCAV_COEF(:,:,:) = 0. + PTOT_SCAV_RATE(:,:,:) = 0. +! + GSCAV(:,:,:) = .FALSE. + GSCAV(IIB:IIE,IJB:IJE,IKB:IKE) =GRAIN(IIB:IIE,IJB:IJE,IKB:IKE) .AND. & + (PSVT(IIB:IIE,IJB:IJE,IKB:IKE,SV_VAR)>1.0E-2) + ISCAV = COUNTJV(GSCAV(:,:,:),I1(:),I2(:),I3(:)) +! + IF( ISCAV>=1 ) THEN + ALLOCATE(ZVISC_RATIO(ISCAV)) + ALLOCATE(ZRHODREF(ISCAV)) + ALLOCATE(ZVISCA(ISCAV)) + ALLOCATE(ZT(ISCAV)) + ALLOCATE(ZRRT(ISCAV)) + ALLOCATE(ZCONCR(ISCAV)) + ALLOCATE(ZLAMBDAR(ISCAV)) + ALLOCATE(ZCONCP(ISCAV)) + ALLOCATE(ZMFPA(ISCAV)) + ALLOCATE(ZTOT_SCAV_RATE(ISCAV)) + ALLOCATE(ZTOT_MASS_RATE(ISCAV)) + ALLOCATE(ZMEAN_SCAV_COEF(ISCAV)) + ALLOCATE(ZPABST(ISCAV)) + ALLOCATE(ZKNUDSEN(ISCAV)) + ALLOCATE(FACTOR(ISCAV)) +! + ALLOCATE(ZCUNSLIP(ISCAV,NDIAMP)) + ALLOCATE(ZBC_SCAV_COEF(ISCAV,NDIAMP)) + ALLOCATE(ZSC(ISCAV,NDIAMP)) + ALLOCATE(ZSC_INV(ISCAV,NDIAMP)) + ALLOCATE(ZSC_SQRT(ISCAV,NDIAMP)) + ALLOCATE(ZSC_3SQRT(ISCAV,NDIAMP)) + ALLOCATE(ZRELT(ISCAV,NDIAMP)) + ALLOCATE(ZDIFF(ISCAV,NDIAMP)) + ALLOCATE(ZVOLDR(ISCAV,NDIAMR)) + ALLOCATE(ZVOLDR_POW(ISCAV,NDIAMR)) + ALLOCATE(ZVOLDR_INV(ISCAV,NDIAMR)) + ALLOCATE(ZRE(ISCAV,NDIAMR)) + ALLOCATE(ZRE_INV(ISCAV,NDIAMR)) + ALLOCATE(ZRE_SQRT(ISCAV,NDIAMR)) + ALLOCATE(ZST_STAR(ISCAV,NDIAMR)) + ALLOCATE(ZFVELR(ISCAV,NDIAMR)) + ALLOCATE(ZST(ISCAV,NDIAMP,NDIAMR)) + ALLOCATE(ZCOL_EF(ISCAV,NDIAMP,NDIAMR)) + ALLOCATE(ZSIZE_RATIO(ISCAV,NDIAMP,NDIAMR)) +! + ZMEAN_SCAV_COEF(:)=0. + ZTOT_SCAV_RATE(:) =0. + ZTOT_MASS_RATE(:) =0. + DO JL=1,ISCAV + ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) + ZT(JL) = ZT_3D(I1(JL),I2(JL),I3(JL)) + ZRRT(JL) = PRRT(I1(JL),I2(JL),I3(JL)) + ZPABST(JL) = PPABST(I1(JL),I2(JL),I3(JL)) + ZCONCP(JL) = PSVT(I1(JL),I2(JL),I3(JL),SV_VAR)*ZRHODREF(JL)![/m3] + ZCONCR(JL) = ZCONCR_3D(I1(JL),I2(JL),I3(JL)) ![/m3] + ZVISCA(JL) = ZVISCA_3D(I1(JL),I2(JL),I3(JL)) + ZMFPA(JL) = ZMFPA_3D(I1(JL),I2(JL),I3(JL)) + ZVISC_RATIO(JL) = ZVISC_RATIO_3D(I1(JL),I2(JL),I3(JL)) + ZLAMBDAR(JL) = ZLAMBDAR_3D(I1(JL),I2(JL),I3(JL)) + FACTOR(JL) = FACTOR_3D(I1(JL),I2(JL),I3(JL)) + ZVOLDR(JL,:) = ZVOLDR_3D(I1(JL),I2(JL),I3(JL),:) + ZVOLDR_POW(JL,:) = ZVOLDR_3D_POW(I1(JL),I2(JL),I3(JL),:) + ZVOLDR_INV(JL,:) = ZVOLDR_3D_INV(I1(JL),I2(JL),I3(JL),:) + ZFVELR(JL,:) = ZFVELR_3D(I1(JL),I2(JL),I3(JL),:) + ZRE(JL,:) = ZRE_3D(I1(JL),I2(JL),I3(JL),:) + ZRE_SQRT(JL,:) = ZRE_3D_SQRT(I1(JL),I2(JL),I3(JL),:) + ZST_STAR(JL,:) = ZST_STAR_3D(I1(JL),I2(JL),I3(JL),:) + ENDDO + ZRE_INV(:,:) = 1./ZRE(:,:) + + IF (ANY(ZCONCR .eq. 0.)) print *, 'valeur nulle dans ZLAMBDAR !' + IF (ANY(ZLAMBDAR .eq. 0.)) print *, 'valeur nulle dans ZLAMBDAR !' +! +!------------------------------------------------------------------------------------ +! +! Loop over the different species (for IFN int. mixing) +! + DO JM = 1, NM ! species (DM1,DM2,BC,O) for IFN + IF ( JSV .LE. NMOD_CCN ) THEN ! CCN case + XRHOP = XRHO_CCN(JMOD) + XMDIAMP = 2*XR_MEAN_CCN(JMOD) + XSIGMAP = EXP(XLOGSIG_CCN(JMOD)) + XFRACP = 1.0 + ELSE ! IFN case + XRHOP = XRHO_IFN(JM) + XMDIAMP = XMDIAM_IFN(JM) + XSIGMAP = XSIGMA_IFN(JM) + XFRACP = XFRAC(JM,JMOD) + END IF + !----------------------------------------------------------------------------- + ! Loop over the aerosols particles diameters (log normal distribution law) : + ! + DO J1=1,NDIAMP + ! exchange of variables: [m] + ZVOLDP(J1) = XMDIAMP * EXP(ZABSCISSP(J1)*SQRT(2.)*LOG(XSIGMAP)) + ! Cunningham slip correction factor (1+alpha*Knudsen) + ZKNUDSEN(:) = MIN( 20.,ZVOLDP(J1)/ZMFPA(:) ) + ZCUNSLIP(:,J1) = 1.0+2.0/ZKNUDSEN(:)*(1.257+0.4*EXP(-0.55*ZKNUDSEN(:))) + ! Diffusion coefficient + ZDIFF(:,J1) = XBOLTZ*ZT(:)*ZCUNSLIP(:,J1)/(3.*XPI*ZVISCA(:)*ZVOLDP(J1)) + ! Schmidt number + ZSC(:,J1) = ZVISCA(:)/(ZRHODREF(:)*ZDIFF(:,J1)) + ZSC_INV(:,J1) = 1./ZSC(:,J1) + ZSC_SQRT(:,J1) = SQRT( ZSC(:,J1) ) + ZSC_3SQRT(:,J1) = ZSC(:,J1)**(1./3.) + ! Characteristic Time Required for reaching terminal velocity + ZRELT(:,J1) = (ZVOLDP(J1)**2)*ZCUNSLIP(:,J1)*XRHOP/(18.*ZVISCA(:)) + ! Density number + ZDENS_RATIO = XRHOP/XRHOLW + ZDENS_RATIO_SQRT = SQRT(ZDENS_RATIO) + ! Initialisation + ZBC_SCAV_COEF(:,J1)=0. + !------------------------------------------------------------------------- + ! Loop over the drops diameters (generalized Gamma distribution) : + ! + DO J2=1,NDIAMR + ! Stokes number + ZST(:,J1,J2) = 2.*ZRELT(:,J1)*(ZFVELR(:,J2)-ZRELT(1,J1)*XG) & + *ZVOLDR_INV(:,J2) + ! Size Ratio + ZSIZE_RATIO(:,J1,J2) = ZVOLDP(J1)*ZVOLDR_INV(:,J2) + ! Collision Efficiency + ZCOL_EF(:,J1,J2) = COLL_EFFI(ZRE, ZRE_INV, ZRE_SQRT, ZSC, ZSC_INV, & + ZSC_SQRT, ZSC_3SQRT, ZST, ZST_STAR, & + ZSIZE_RATIO, ZVISC_RATIO, ZDENS_RATIO_SQRT) + ! Below-Cloud Scavenging Coefficient for a fixed ZVOLDP: [/s] + ZBC_SCAV_COEF(:,J1) = ZBC_SCAV_COEF(:,J1) + & + ZCOL_EF(:,J1,J2) * ZWEIGHTR(J2) * FACTOR(:) * ZVOLDR_POW(:,J2) + END DO + ! End of the loop over the drops diameters + !-------------------------------------------------------------------------- + + ! Total NUMBER Scavenging Rate of aerosol [m**-3.s**-1] + ZTOT_SCAV_RATE(:) = ZTOT_SCAV_RATE(:) - & + ZWEIGHTP(J1)*XFRACP*ZCONCP(:)*ZBC_SCAV_COEF(:,J1) + ! Total MASS Scavenging Rate of aerosol [kg.m**-3.s**-1] + ZTOT_MASS_RATE(:) = ZTOT_MASS_RATE(:) + & + ZWEIGHTP(J1)*XFRACP*ZCONCP(:)*ZBC_SCAV_COEF(:,J1) & + *XPI/6.*XRHOP*(ZVOLDP(J1)**3) + END DO + ! End of the loop over the drops diameters + !-------------------------------------------------------------------------- + + ! Total NUMBER Scavenging Rate of aerosol [m**-3.s**-1] + PTOT_SCAV_RATE(:,:,:)=UNPACK(ZTOT_SCAV_RATE(:),MASK=GSCAV(:,:,:),FIELD=0.0) + ! Free particles (CCN or IFN) [/s]: + PRSVS(:,:,:,SV_VAR) = max(PRSVS(:,:,:,SV_VAR)+PTOT_SCAV_RATE(:,:,:) & + * PRHODJ(:,:,:)/PRHODREF(:,:,:) , 0.0 ) + ! Total MASS Scavenging Rate of aerosol which REACH THE FLOOR because of + ! rain sedimentation [kg.m**-3.s**-1] + IF (LAERO_MASS)THEN + PTOT_MASS_RATE(:,:,:) = PTOT_MASS_RATE(:,:,:) + & + UNPACK(ZTOT_MASS_RATE(:), MASK=GSCAV(:,:,:), FIELD=0.0) + CALL SCAV_MASS_SEDIMENTATION( HCLOUD, PTSTEP, KTCOUNT, PZZ, PRHODJ, & + PRHODREF, PRRT, PSVT(:,:,:,NSV_LIMA_SCAVMASS),& + PRSVS(:,:,:,NSV_LIMA_SCAVMASS), PINPAP ) + PRSVS(:,:,:,NSV_LIMA_SCAVMASS)=PRSVS(:,:,:,NSV_LIMA_SCAVMASS) + & + PTOT_MASS_RATE(:,:,:)*PRHODJ(:,:,:)/PRHODREF(:,:,:) + END IF + ENDDO +! End of the loop over the aerosol species +!-------------------------------------------------------------------------- +! +! +! + DEALLOCATE(FACTOR) + DEALLOCATE(ZSC_INV) + DEALLOCATE(ZSC_SQRT) + DEALLOCATE(ZSC_3SQRT) + DEALLOCATE(ZRE_INV) + DEALLOCATE(ZRE_SQRT) + DEALLOCATE(ZVOLDR_POW) + DEALLOCATE(ZVOLDR_INV) +! + DEALLOCATE(ZFVELR) + DEALLOCATE(ZRE) + DEALLOCATE(ZST_STAR) + DEALLOCATE(ZST) + DEALLOCATE(ZSIZE_RATIO) + DEALLOCATE(ZCOL_EF) + DEALLOCATE(ZVOLDR) + DEALLOCATE(ZDIFF) + DEALLOCATE(ZRELT) + DEALLOCATE(ZSC) + DEALLOCATE(ZCUNSLIP) + DEALLOCATE(ZBC_SCAV_COEF) +! + DEALLOCATE(ZTOT_SCAV_RATE) + DEALLOCATE(ZTOT_MASS_RATE) + DEALLOCATE(ZMEAN_SCAV_COEF) +! + DEALLOCATE(ZRRT) + DEALLOCATE(ZCONCR) + DEALLOCATE(ZLAMBDAR) + DEALLOCATE(ZCONCP) + DEALLOCATE(ZVISC_RATIO) + DEALLOCATE(ZRHODREF) + DEALLOCATE(ZVISCA) + DEALLOCATE(ZPABST) + DEALLOCATE(ZKNUDSEN) + DEALLOCATE(ZT) + DEALLOCATE(ZMFPA) + ENDIF +ENDDO +! +if ( lbudget_sv ) then + do jl = 1, nmod_ccn + idx = nsv_lima_ccn_free - 1 + jl + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + idx), 'SCAV', prsvs(:, :, :, idx) ) + end do + do jl = 1, nmod_ifn + idx = nsv_lima_ifn_free - 1 + jl + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + idx), 'SCAV', prsvs(:, :, :, idx) ) + end do + if ( laero_mass ) then + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_scavmass), 'SCAV', prsvs(:, :, :, nsv_lima_scavmass) ) + end if +end if +!------------------------------------------------------------------------------ +! +! +!* 3. SUBROUTINE AND FUNCTION +! ----------------------- +! +! +CONTAINS +! +!------------------------------------------------------------------------------ +! ########################################################################## + SUBROUTINE SCAV_MASS_SEDIMENTATION( HCLOUD, PTSTEP, KTCOUNT, PZZ, PRHODJ,& + PRHODREF, PRAIN, PSVT_MASS, PRSVS_MASS, PINPAP ) +! ########################################################################## +! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the total mass of aerosol +!! scavenged by precipitations +!! +!! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! None +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_PARAMETERS +!! JPHEXT : Horizontal external points number +!! JPVEXT : Vertical external points number +!! Module MODD_CONF : +!! CCONF configuration of the model for the first time step +!! +!! REFERENCE +!! --------- +!! Book1 of the documentation ( routine CH_AQUEOUS_SEDIMENTATION ) +!! +!! AUTHOR +!! ------ +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original 22/07/07 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAMETERS +USE MODD_CONF +! +USE MODD_PARAM_LIMA, ONLY : XCEXVT, XRTMIN +USE MODD_PARAM_LIMA_WARM, ONLY : XBR, XDR, XFSEDRR +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +! +CHARACTER (LEN=4), INTENT(IN) :: HCLOUD ! Cloud parameterization +REAL, INTENT(IN) :: PTSTEP ! Time step +INTEGER, INTENT(IN) :: KTCOUNT ! Current time step number +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry Density [kg] +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRAIN ! Rain water m.r. source +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSVT_MASS ! Precip. aerosols at t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRSVS_MASS ! Precip. aerosols source +! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPAP +! +!* 0.2 Declarations of local variables : +! +INTEGER :: JJ, JK, JN, JRR ! Loop indexes +INTEGER :: IIB, IIE, IJB, IJE, IKB, IKE ! Physical domain +! +REAL :: ZTSPLITR ! Small time step for rain sedimentation +REAL :: ZTSTEP ! Large time step for rain sedimentation +! +! +LOGICAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) & + :: GSEDIM ! where to compute the SED processes +INTEGER :: ISEDIM +INTEGER , DIMENSION(SIZE(GSEDIM)) :: I1,I2,I3 ! Used to replace the COUNT +INTEGER :: JL ! and PACK intrinsics +! +! +REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) & + :: ZW, & ! work array + ZWSED, & ! sedimentation fluxes + ZZS ! Rain water m.r. source +! +REAL, DIMENSION(:), ALLOCATABLE :: ZRRS, & ! Rain water m.r. source + ZRHODREF, & ! RHO Dry REFerence + ZZW ! Work array +! +REAL :: ZRTMIN3 +! +! +REAL :: ZVTRMAX, ZDZMIN, ZT +REAL, SAVE :: ZEXSEDR +LOGICAL, SAVE :: GSFIRSTCALL = .TRUE. +INTEGER, SAVE :: ISPLITR +! +!------------------------------------------------------------------------------- +! +!* 1. COMPUTE THE LOOP BOUNDS +! ----------------------- +! +IIB=1+JPHEXT +IIE=SIZE(PZZ,1) - JPHEXT +IJB=1+JPHEXT +IJE=SIZE(PZZ,2) - JPHEXT +IKB=1+JPVEXT +IKE=SIZE(PZZ,3) - JPVEXT +! +!------------------------------------------------------------------------------- +! +!* 2. COMPUTE THE SEDIMENTATION (RS) SOURCE +! ------------------------------------- +! +!* 2.1 splitting factor for high Courant number C=v_fall*(del_Z/del_T) +! +firstcall : IF (GSFIRSTCALL) THEN + GSFIRSTCALL = .FALSE. + ZVTRMAX = 10. + ZDZMIN = MINVAL(PZZ(IIB:IIE,IJB:IJE,IKB+1:IKE+1)-PZZ(IIB:IIE,IJB:IJE,IKB:IKE)) + ISPLITR = 1 + SPLIT : DO + ZT = 2.* PTSTEP / REAL(ISPLITR) + IF ( ZT * ZVTRMAX / ZDZMIN .LT. 1.) EXIT SPLIT + ISPLITR = ISPLITR + 1 + END DO SPLIT +! + ZEXSEDR = (XBR+XDR+1.0)/(XBR+1.0) +! +END IF firstcall +! +!* 2.2 time splitting loop initialization +! +IF( (KTCOUNT==1) .AND. (CCONF=='START') ) THEN + ZTSPLITR = PTSTEP / REAL(ISPLITR) ! Small time step + ZTSTEP = PTSTEP ! Large time step + ELSE + ZTSPLITR= 2. * PTSTEP / REAL(ISPLITR) + ZTSTEP = 2. * PTSTEP +END IF +! +!* 2.3 compute the fluxes +! +! optimization by looking for locations where +! the precipitating fields are larger than a minimal value only !!! +! +ZRTMIN3 = XRTMIN(3) / ZTSTEP +ZZS(:,:,:) = PRAIN(:,:,:) +DO JN = 1 , ISPLITR + GSEDIM(:,:,:) = .FALSE. + GSEDIM(IIB:IIE,IJB:IJE,IKB:IKE) = ZZS(IIB:IIE,IJB:IJE,IKB:IKE) > ZRTMIN3 +! + ISEDIM = COUNTJV( GSEDIM(:,:,:),I1(:),I2(:),I3(:)) + IF( ISEDIM >= 1 ) THEN + IF( JN==1 ) THEN + ZZS(:,:,:) = ZZS(:,:,:) * ZTSTEP + DO JK = IKB , IKE-1 + ZW(:,:,JK) =ZTSPLITR*2./(PRHODREF(:,:,JK)*(PZZ(:,:,JK+2)-PZZ(:,:,JK))) + END DO + ZW(:,:,IKE) =ZTSPLITR/(PRHODREF(:,:,IKE)*(PZZ(:,:,IKE+1)-PZZ(:,:,IKE))) + END IF + ALLOCATE(ZRRS(ISEDIM)) + ALLOCATE(ZRHODREF(ISEDIM)) + DO JL=1,ISEDIM + ZRRS(JL) = ZZS(I1(JL),I2(JL),I3(JL)) + ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) + ENDDO + ALLOCATE(ZZW(ISEDIM)) ; ZZW(:) = 0.0 +! +!* 2.2.1 for rain +! + ZZW(:) = XFSEDRR * ZRRS(:)**(ZEXSEDR) * ZRHODREF(:)**(ZEXSEDR-XCEXVT) + ZWSED(:,:,:) = UNPACK( ZZW(:),MASK=GSEDIM(:,:,:),FIELD=0.0 ) + DO JK = IKB , IKE + ZZS(:,:,JK) = ZZS(:,:,JK) + ZW(:,:,JK)*(ZWSED(:,:,JK+1)-ZWSED(:,:,JK)) + END DO + IF( JN==1 ) THEN + PINPAP(:,:) = ZWSED(:,:,IKB)* & + ( PSVT_MASS(:,:,IKB)/MAX(ZRTMIN3,PRRT(:,:,IKB)) ) + END IF + DEALLOCATE(ZRHODREF) + DEALLOCATE(ZRRS) + DEALLOCATE(ZZW) + IF( JN==ISPLITR ) THEN + GSEDIM(:,:,:) = .FALSE. + GSEDIM(IIB:IIE,IJB:IJE,IKB:IKE) = ZZS(IIB:IIE,IJB:IJE,IKB:IKE) > ZRTMIN3 + ZWSED(:,:,:) = 0.0 + WHERE( GSEDIM(:,:,:) ) + ZWSED(:,:,:) = 1.0/ZTSTEP - PRAIN(:,:,:)/ZZS(:,:,:) + END WHERE + END IF + END IF +END DO +! +! Apply the rain sedimentation rate to the WR_xxx aqueous species +! +PRSVS_MASS(:,:,:) = PRSVS_MASS(:,:,:) + ZWSED(:,:,:)*PSVT_MASS(:,:,:) +! +END SUBROUTINE SCAV_MASS_SEDIMENTATION +! +!------------------------------------------------------------------------------ +! +!################################################################### + FUNCTION COLL_EFFI (PRE, PRE_INV, PRE_SQRT, PSC, PSC_INV, PSC_SQRT, & + PSC_3SQRT, PST, PST_STAR, PSIZE_RATIO, & + PVISC_RATIO, PDENS_RATIO_SQRT) RESULT(PCOL_EF) +!################################################################### +! +!Compute the Raindrop-Aerosol Collision Efficiency +! +!* 0. DECLARATIONS +! --------------- +! + IMPLICIT NONE +! + INTEGER :: I +! + REAL, DIMENSION(:,:), INTENT(IN) :: PRE + REAL, DIMENSION(:,:), INTENT(IN) :: PRE_INV + REAL, DIMENSION(:,:), INTENT(IN) :: PRE_SQRT + REAL, DIMENSION(:,:), INTENT(IN) :: PSC + REAL, DIMENSION(:,:), INTENT(IN) :: PSC_INV + REAL, DIMENSION(:,:), INTENT(IN) :: PSC_SQRT + REAL, DIMENSION(:,:), INTENT(IN) :: PSC_3SQRT + REAL, DIMENSION(:,:), INTENT(IN) :: PST_STAR +! + REAL, DIMENSION(:,:,:), INTENT(IN) :: PST + REAL, DIMENSION(:,:,:), INTENT(IN) :: PSIZE_RATIO +! + REAL, DIMENSION(:), INTENT(IN) :: PVISC_RATIO + REAL, INTENT(IN) :: PDENS_RATIO_SQRT +! + REAL, DIMENSION(SIZE(ZRE,1)) :: PCOL_EF !result : collision efficiency +! +!------------------------------------------------------------------------------- +! + PCOL_EF(:) = (4.*PSC_INV(:,J1)*PRE_INV(:,J2)*(1.+0.4*PRE_SQRT(:,J2) & + *PSC_3SQRT(:,J1)+0.16*PRE_SQRT(:,J2)*PSC_SQRT(:,J1))) & + +(4.*PSIZE_RATIO(:,J1,J2)*(PVISC_RATIO(:) & + +(1.+2.*PRE_SQRT(:,J2))*PSIZE_RATIO(:,J1,J2))) + DO I=1,ISCAV + IF (PST(I,J1,J2)>PST_STAR(I,J2)) THEN + PCOL_EF(I) = PCOL_EF(I) & + +(PDENS_RATIO_SQRT*((PST(I,J1,J2)-PST_STAR(I,J2)) & + /(PST(I,J1,J2)-PST_STAR(I,J2)+2./3.))**(3./2.)) + ENDIF + ENDDO + END FUNCTION COLL_EFFI +! +!------------------------------------------------------------------------------ +! +END SUBROUTINE LIMA_PRECIP_SCAVENGING diff --git a/src/mesonh/micro/lima_rain_accr_snow.f90 b/src/mesonh/micro/lima_rain_accr_snow.f90 new file mode 100644 index 000000000..01c31afbe --- /dev/null +++ b/src/mesonh/micro/lima_rain_accr_snow.f90 @@ -0,0 +1,299 @@ +!MNH_LIC Copyright 2018-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ################################# + MODULE MODI_LIMA_RAIN_ACCR_SNOW +! ################################# +! +INTERFACE + SUBROUTINE LIMA_RAIN_ACCR_SNOW (PTSTEP, LDCOMPUTE, & + PRHODREF, PT, & + PRRT, PCRT, PRST, PLBDR, PLBDS, PLVFACT, PLSFACT, & + P_TH_ACC, P_RR_ACC, P_CR_ACC, P_RS_ACC, P_RG_ACC ) +! +REAL, INTENT(IN) :: PTSTEP +LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE +! +REAL, DIMENSION(:), INTENT(IN) :: PRHODREF ! +REAL, DIMENSION(:), INTENT(IN) :: PT ! +! +REAL, DIMENSION(:), INTENT(IN) :: PRRT ! Cloud water C. at t +REAL, DIMENSION(:), INTENT(IN) :: PCRT ! Cloud water C. at t +REAL, DIMENSION(:), INTENT(IN) :: PRST ! Cloud water C. at t +REAL, DIMENSION(:), INTENT(IN) :: PLBDR ! +REAL, DIMENSION(:), INTENT(IN) :: PLBDS ! +REAL, DIMENSION(:), INTENT(IN) :: PLVFACT ! +REAL, DIMENSION(:), INTENT(IN) :: PLSFACT ! +! +REAL, DIMENSION(:), INTENT(OUT) :: P_TH_ACC +REAL, DIMENSION(:), INTENT(OUT) :: P_RR_ACC +REAL, DIMENSION(:), INTENT(OUT) :: P_CR_ACC +REAL, DIMENSION(:), INTENT(OUT) :: P_RS_ACC +REAL, DIMENSION(:), INTENT(OUT) :: P_RG_ACC +! +END SUBROUTINE LIMA_RAIN_ACCR_SNOW +END INTERFACE +END MODULE MODI_LIMA_RAIN_ACCR_SNOW +! +! ################################################################################### + SUBROUTINE LIMA_RAIN_ACCR_SNOW (PTSTEP, LDCOMPUTE, & + PRHODREF, PT, & + PRRT, PCRT, PRST, PLBDR, PLBDS, PLVFACT, PLSFACT, & + P_TH_ACC, P_RR_ACC, P_CR_ACC, P_RS_ACC, P_RG_ACC ) +! ################################################################################### +! +!! PURPOSE +!! ------- +!! Compute the rain drops accretion on aggregates +!! +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * CNRM * +!! +!! MODIFICATIONS +!! ------------- +!! Original 15/03/2018 +! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST, ONLY : XTT +USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCEXVT +USE MODD_PARAM_LIMA_COLD, ONLY : XBS, XCXS +USE MODD_PARAM_LIMA_MIXED, ONLY : NACCLBDAS, XACCINTP1S, XACCINTP2S, & + NACCLBDAR, XACCINTP1R, XACCINTP2R, & + XKER_RACCSS, XKER_RACCS, XKER_SACCRG, & + XFRACCSS, XLBRACCS1, XLBRACCS2, XLBRACCS3, & + XFSACCRG, XLBSACCR1, XLBSACCR2, XLBSACCR3 +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +REAL, INTENT(IN) :: PTSTEP +LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE +! +REAL, DIMENSION(:), INTENT(IN) :: PRHODREF ! +REAL, DIMENSION(:), INTENT(IN) :: PT ! +! +REAL, DIMENSION(:), INTENT(IN) :: PRRT ! Cloud water C. at t +REAL, DIMENSION(:), INTENT(IN) :: PCRT ! Cloud water C. at t +REAL, DIMENSION(:), INTENT(IN) :: PRST ! Cloud water C. at t +REAL, DIMENSION(:), INTENT(IN) :: PLBDR ! +REAL, DIMENSION(:), INTENT(IN) :: PLBDS ! +REAL, DIMENSION(:), INTENT(IN) :: PLVFACT ! +REAL, DIMENSION(:), INTENT(IN) :: PLSFACT ! +! +REAL, DIMENSION(:), INTENT(OUT) :: P_TH_ACC +REAL, DIMENSION(:), INTENT(OUT) :: P_RR_ACC +REAL, DIMENSION(:), INTENT(OUT) :: P_CR_ACC +REAL, DIMENSION(:), INTENT(OUT) :: P_RS_ACC +REAL, DIMENSION(:), INTENT(OUT) :: P_RG_ACC +! +!* 0.2 Declarations of local variables : +! +LOGICAL, DIMENSION(SIZE(PRRT)) :: GACC +! +REAL, DIMENSION(SIZE(PRRT)) :: Z1, Z2, Z3, Z4 +REAL, DIMENSION(SIZE(PRRT)) :: ZZW1, ZZW2, ZZW3, ZZW4, ZZW5 +! +INTEGER, DIMENSION(SIZE(PRRT)) :: IVEC1,IVEC2 ! Vectors of indices +REAL, DIMENSION(SIZE(PRRT)) :: ZVEC1,ZVEC2,ZVEC3 ! Work vectors +! +!------------------------------------------------------------------------------- +! +! +P_TH_ACC(:) = 0. +P_RR_ACC(:) = 0. +P_CR_ACC(:) = 0. +P_RS_ACC(:) = 0. +P_RG_ACC(:) = 0. +! +ZZW1(:) = 0. +ZZW2(:) = 0. +ZZW3(:) = 0. +ZZW4(:) = 0. +ZZW5(:) = 0. +! +IVEC1(:) = 0 +IVEC2(:) = 0 +ZVEC1(:) = 0. +ZVEC2(:) = 0. +ZVEC3(:) = 0. +! +!* Cloud droplet riming of the aggregates +! ------------------------------------------- +! +! +GACC(:) = .False. +GACC(:) = (PRRT(:)>XRTMIN(3)) .AND. (PRST(:)>XRTMIN(5)) .AND. (PT(:)<XTT) .AND. LDCOMPUTE(:) +! +WHERE( GACC ) +! +! 1.3.1 select the (ZLBDAS,ZLBDAR) couplet + ! + ZVEC1(:) = MAX(MIN(PLBDS(:),5.E5),5.E1) + ZVEC2(:) = PLBDR(:) +! +! 1.3.2 find the next lower indice for the ZLBDAS and for the ZLBDAR +! in the geometrical set of (Lbda_s,Lbda_r) couplet use to +! tabulate the RACCSS-kernel +! + ZVEC1(:) = MAX( 1.0001, MIN( REAL(NACCLBDAS)-0.0001, & + XACCINTP1S * LOG( ZVEC1(:) ) + XACCINTP2S ) ) + IVEC1(:) = INT( ZVEC1(:) ) + ZVEC1(:) = ZVEC1(:) - REAL( IVEC1(:) ) +! + ZVEC2(:) = MAX( 1.0001, MIN( REAL(NACCLBDAR)-0.0001, & + XACCINTP1R * LOG( ZVEC2(:) ) + XACCINTP2R ) ) + IVEC2(:) = INT( ZVEC2(:) ) + ZVEC2(:) = ZVEC2(:) - REAL( IVEC2(:) ) +! +! 1.3.3 perform the bilinear interpolation of the normalized +! RACCSS-kernel : for small rain drops transformed into snow + ! + Z1(:) = GET_XKER_RACCSS(IVEC1(:)+1,IVEC2(:)+1) + Z2(:) = GET_XKER_RACCSS(IVEC1(:)+1,IVEC2(:) ) + Z3(:) = GET_XKER_RACCSS(IVEC1(:) ,IVEC2(:)+1) + Z4(:) = GET_XKER_RACCSS(IVEC1(:) ,IVEC2(:) ) + ZVEC3(:) = ( Z1(:)* ZVEC2(:) & + - Z2(:)*(ZVEC2(:) - 1.0) ) & + * ZVEC1(:) & + - ( Z3(:)* ZVEC2(:) & + - Z4(:)*(ZVEC2(:) - 1.0) ) & + * (ZVEC1(:) - 1.0) + ZZW1(:) = ZVEC3(:) +! +! 1.3.4b perform the bilinear interpolation of the normalized +! RACCS-kernel : total frozen rain drops +! + Z1(:) = GET_XKER_RACCS(IVEC1(:)+1,IVEC2(:)+1) + Z2(:) = GET_XKER_RACCS(IVEC1(:)+1,IVEC2(:) ) + Z3(:) = GET_XKER_RACCS(IVEC1(:) ,IVEC2(:)+1) + Z4(:) = GET_XKER_RACCS(IVEC1(:) ,IVEC2(:) ) + ZVEC3(:) = ( Z1(:)* ZVEC2(:) & + - Z2(:)*(ZVEC2(:) - 1.0) ) & + * ZVEC1(:) & + - ( Z3(:)* ZVEC2(:) & + - Z4(:)*(ZVEC2(:) - 1.0) ) & + * (ZVEC1(:) - 1.0) + ZZW2(:) = ZVEC3(:) +! +! Correction of ZZW1 to ensure that ZZW1 <= ZZW2 +! ie coll. of small drops <= coll. of all drops +! + ZZW1(:) = MIN(ZZW1(:),ZZW2(:)) +! +! 1.3.5 perform the bilinear interpolation of the normalized +! SACCRG-kernel : snow transformed into graupel +! + Z1(:) = GET_XKER_SACCRG(IVEC2(:)+1,IVEC1(:)+1) + Z2(:) = GET_XKER_SACCRG(IVEC2(:)+1,IVEC1(:) ) + Z3(:) = GET_XKER_SACCRG(IVEC2(:) ,IVEC1(:)+1) + Z4(:) = GET_XKER_SACCRG(IVEC2(:) ,IVEC1(:) ) + ZVEC3(:) = ( Z1(:)* ZVEC1(:) & + - Z2(:)*(ZVEC1(:) - 1.0) ) & + * ZVEC2(:) & + - ( Z3(:)* ZVEC1(:) & + - Z4(:)*(ZVEC1(:) - 1.0) ) & + * (ZVEC2(:) - 1.0) + ZZW3(:) = ZVEC3(:) +! +! 1.3.4 raindrop accretion on the small sized aggregates +! +! BVIE manque PCRT ??????????????????????????????????? +! ZZW4(:) = & !! coef of RRACCS and RRACCS + ZZW4(:) = PCRT(:) & !! coef of RRACCS and RRACCS + * XFRACCSS *( PLBDS(:)**XCXS )*( PRHODREF(:)**(-XCEXVT-1.) ) & + *( XLBRACCS1/( PLBDS(:)**2 ) + & + XLBRACCS2/( PLBDS(:) * PLBDR(:) ) + & + XLBRACCS3/( PLBDR(:)**2 ) ) / PLBDR(:)**3 + +! ZRRS(:) = ZRRS(:) - ZZW1(:,4) +! ZRSS(:) = ZRSS(:) + ZZW1(:,4) +! ZTHS(:) = ZTHS(:) + ZZW1(:,4)*(ZLSFACT(:)-ZLVFACT(:)) ! f(L_f*(RRACCSS)) +! +! ZCRS(:) = MAX( ZCRS(:)-ZZW1(:,4)*(ZCRT(:)/ZRRT(:)),0.0 ) ! Lambda_r**3 +! +! 1.3.6 raindrop accretion-conversion of the large sized aggregates +! into graupeln +! + ZZW5(:) = XFSACCRG*ZZW3(:) * & ! RSACCRG + ( PLBDS(:)**(XCXS-XBS) )*( PRHODREF(:)**(-XCEXVT-1.) ) & + *( XLBSACCR1/((PLBDR(:)**2) ) + & + XLBSACCR2/( PLBDR(:) * PLBDS(:) ) + & + XLBSACCR3/( (PLBDS(:)**2)) ) + ! +! P_RR_ACC(:) = - ZZW4(:) * ZZW1(:) ! RRACCSS +! P_CR_ACC(:) = P_RR_ACC(:) * PCRT(:)/PRRT(:) ! Lambda_r**3 +! P_RS_ACC(:) = - P_RR_ACC(:) + ! +! P_RR_ACC(:) = P_RR_ACC(:) - ( ZZW2(:)-P_RS_ACC(:) ) +! P_CR_ACC(:) = P_CR_ACC(:) - ( ZZW2(:)-P_RS_ACC(:) ) * PCRT(:)/PRRT(:) ! Lambda_r**3 +! P_RS_ACC(:) = P_RS_ACC(:) - ZZW5(:) +! P_RG_ACC(:) = ( ZZW2(:)-P_RS_ACC(:) ) + ZZW5(:) + ! + P_RR_ACC(:) = - ZZW4(:) * ZZW2(:) + P_CR_ACC(:) = P_RR_ACC(:) * PCRT(:)/PRRT(:) + P_RS_ACC(:) = ZZW4(:) * ZZW1(:) - ZZW5(:) + P_RG_ACC(:) = ZZW4(:) * ( ZZW2(:) - ZZW1(:) ) + ZZW5(:) + P_TH_ACC(:) = - P_RR_ACC(:) * (PLSFACT(:)-PLVFACT(:)) + ! +END WHERE +! +! +!------------------------------------------------------------------------------- +! +CONTAINS + FUNCTION GET_XKER_RACCSS(I1,I2) RESULT(RET) + INTEGER, DIMENSION(:) :: I1 + INTEGER, DIMENSION(:) :: I2 + REAL, DIMENSION(SIZE(I1)) :: RET + ! + INTEGER I + ! + DO I=1,SIZE(I1) + RET(I) = XKER_RACCSS(MAX(MIN(I1(I),SIZE(XKER_RACCSS,1)),1),MAX(MIN(I2(I),SIZE(XKER_RACCSS,2)),1)) + END DO + END FUNCTION GET_XKER_RACCSS +! +!------------------------------------------------------------------------------- +! + FUNCTION GET_XKER_RACCS(I1,I2) RESULT(RET) + INTEGER, DIMENSION(:) :: I1 + INTEGER, DIMENSION(:) :: I2 + REAL, DIMENSION(SIZE(I1)) :: RET + ! + INTEGER I + ! + DO I=1,SIZE(I1) + RET(I) = XKER_RACCS(MAX(MIN(I1(I),SIZE(XKER_RACCS,1)),1),MAX(MIN(I2(I),SIZE(XKER_RACCS,2)),1)) + END DO + END FUNCTION GET_XKER_RACCS +! +!------------------------------------------------------------------------------- +! + FUNCTION GET_XKER_SACCRG(I1,I2) RESULT(RET) + INTEGER, DIMENSION(:) :: I1 + INTEGER, DIMENSION(:) :: I2 + REAL, DIMENSION(SIZE(I1)) :: RET + ! + INTEGER I + ! + DO I=1,SIZE(I1) + RET(I) = XKER_SACCRG(MAX(MIN(I1(I),SIZE(XKER_SACCRG,1)),1),MAX(MIN(I2(I),SIZE(XKER_SACCRG,2)),1)) + END DO + END FUNCTION GET_XKER_SACCRG +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE LIMA_RAIN_ACCR_SNOW diff --git a/src/mesonh/micro/lima_rain_evaporation.f90 b/src/mesonh/micro/lima_rain_evaporation.f90 new file mode 100644 index 000000000..2970e027d --- /dev/null +++ b/src/mesonh/micro/lima_rain_evaporation.f90 @@ -0,0 +1,149 @@ +!MNH_LIC Copyright 2018-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ########################## + MODULE MODI_LIMA_RAIN_EVAPORATION +! ########################## +! +INTERFACE + SUBROUTINE LIMA_RAIN_EVAPORATION (PTSTEP, LDCOMPUTE, & + PRHODREF, PT, PLV, PLVFACT, PEVSAT, PRVSAT, & + PRVT, PRCT, PRRT, PLBDR, & + P_TH_EVAP, P_RR_EVAP, & + PEVAP3D ) +! +REAL, INTENT(IN) :: PTSTEP ! Time step +LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE ! +! +REAL, DIMENSION(:), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(:), INTENT(IN) :: PT ! Temperature +REAL, DIMENSION(:), INTENT(IN) :: PLV ! +REAL, DIMENSION(:), INTENT(IN) :: PLVFACT ! +REAL, DIMENSION(:), INTENT(IN) :: PEVSAT ! +REAL, DIMENSION(:), INTENT(IN) :: PRVSAT ! +! +REAL, DIMENSION(:), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: PLBDR ! Lambda(rain) +! +REAL, DIMENSION(:), INTENT(OUT) :: P_TH_EVAP +REAL, DIMENSION(:), INTENT(OUT) :: P_RR_EVAP +! +REAL, DIMENSION(:), INTENT(INOUT) :: PEVAP3D ! Rain evap profile +! +END SUBROUTINE LIMA_RAIN_EVAPORATION +END INTERFACE +END MODULE MODI_LIMA_RAIN_EVAPORATION +! ############################################################################### + SUBROUTINE LIMA_RAIN_EVAPORATION (PTSTEP, LDCOMPUTE, & + PRHODREF, PT, PLV, PLVFACT, PEVSAT, PRVSAT, & + PRVT, PRCT, PRRT, PLBDR, & + P_TH_EVAP, P_RR_EVAP, & + PEVAP3D ) +! ############################################################################### +! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the raindrop evaporation +!! +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * CNRM * +!! +!! +!! MODIFICATIONS +!! ------------- +!! Original 15/03/2018 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST, ONLY : XRHOLW, XRV +USE MODD_PARAM_LIMA, ONLY : XRTMIN +USE MODD_PARAM_LIMA_WARM, ONLY : X0EVAR, XEX0EVAR, X1EVAR, XEX2EVAR, XEX1EVAR, XTHCO, XDIVA +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +REAL, INTENT(IN) :: PTSTEP ! Time step +LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE ! +! +REAL, DIMENSION(:), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(:), INTENT(IN) :: PT ! Temperature +REAL, DIMENSION(:), INTENT(IN) :: PLV ! +REAL, DIMENSION(:), INTENT(IN) :: PLVFACT ! +REAL, DIMENSION(:), INTENT(IN) :: PEVSAT ! +REAL, DIMENSION(:), INTENT(IN) :: PRVSAT ! +! +REAL, DIMENSION(:), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:), INTENT(IN) :: PLBDR ! Lambda(rain) +! +REAL, DIMENSION(:), INTENT(OUT) :: P_TH_EVAP +REAL, DIMENSION(:), INTENT(OUT) :: P_RR_EVAP +! +REAL, DIMENSION(:), INTENT(INOUT) :: PEVAP3D ! Rain evap profile +! +!* 0.1 Declarations of local variables : +! +! +LOGICAL, DIMENSION(SIZE(PRHODREF)) :: GEVAP +REAL, DIMENSION(SIZE(PRHODREF)) :: ZZW1, ZZW2 +! +!------------------------------------------------------------------------------- +! +! +!* 1. PREPARE COMPUTATIONS - PACK +! --------------------------- +! +P_TH_EVAP(:) = 0. +P_RR_EVAP(:) = 0. +! +GEVAP(:) = .FALSE. +GEVAP(:) = LDCOMPUTE(:) .AND. & + PRRT(:)>XRTMIN(3) .AND. & + PRVT(:)<PRVSAT(:) +! +WHERE ( GEVAP ) +! +!------------------------------------------------------------------------------- +! +! +!* 2. compute the evaporation of rain drops +! ---------------------------------------- +! +! + ZZW1(:) = MAX((1.0 - PRVT(:)/PRVSAT(:)),0.0) ! Subsaturation +! +! Compute the function G(T) +! + ZZW2(:) = 1. / ( XRHOLW*((((PLV(:)/PT(:))**2)/(XTHCO*XRV)) + & ! G + (XRV*PT(:))/(XDIVA*PEVSAT(:)))) +! +! Compute the evaporation tendency +! + ZZW2(:) = ZZW2(:) * ZZW1(:) * PRRT(:) * & + (X0EVAR * PLBDR(:)**XEX0EVAR + X1EVAR * PRHODREF(:)**XEX2EVAR * PLBDR(:)**XEX1EVAR) + ZZW2(:) = MAX(ZZW2(:),0.0) +! + P_RR_EVAP(:) = - ZZW2(:) +! P_TH_EVAP(:) = P_RR_EVAP(:) * PLVFACT(:) +! PEVAP3D(:) = - P_RR_EVAP(:) +! +END WHERE +! +!----------------------------------------------------------------------------- +! +END SUBROUTINE LIMA_RAIN_EVAPORATION diff --git a/src/mesonh/micro/lima_rain_freezing.f90 b/src/mesonh/micro/lima_rain_freezing.f90 new file mode 100644 index 000000000..a5a9225bc --- /dev/null +++ b/src/mesonh/micro/lima_rain_freezing.f90 @@ -0,0 +1,134 @@ +!MNH_LIC Copyright 2018-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ################################# + MODULE MODI_LIMA_RAIN_FREEZING +! ################################# +! +INTERFACE + SUBROUTINE LIMA_RAIN_FREEZING (LDCOMPUTE, & + PRHODREF, PT, PLVFACT, PLSFACT, & + PRRT, PCRT, PRIT, PCIT, PLBDR, & + P_TH_CFRZ, P_RR_CFRZ, P_CR_CFRZ, P_RI_CFRZ, P_CI_CFRZ ) +! +LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE +! +REAL, DIMENSION(:), INTENT(IN) :: PRHODREF ! Reference Exner function +REAL, DIMENSION(:), INTENT(IN) :: PT ! +REAL, DIMENSION(:), INTENT(IN) :: PLVFACT ! +REAL, DIMENSION(:), INTENT(IN) :: PLSFACT ! +! +REAL, DIMENSION(:), INTENT(IN) :: PRRT ! +REAL, DIMENSION(:), INTENT(IN) :: PCRT ! +REAL, DIMENSION(:), INTENT(IN) :: PRIT ! +REAL, DIMENSION(:), INTENT(IN) :: PCIT ! +REAL, DIMENSION(:), INTENT(IN) :: PLBDR ! +! +REAL, DIMENSION(:), INTENT(OUT) :: P_TH_CFRZ +REAL, DIMENSION(:), INTENT(OUT) :: P_RR_CFRZ +REAL, DIMENSION(:), INTENT(OUT) :: P_CR_CFRZ +REAL, DIMENSION(:), INTENT(OUT) :: P_RI_CFRZ +REAL, DIMENSION(:), INTENT(OUT) :: P_CI_CFRZ +! +END SUBROUTINE LIMA_RAIN_FREEZING +END INTERFACE +END MODULE MODI_LIMA_RAIN_FREEZING +! +! ####################################################################################### + SUBROUTINE LIMA_RAIN_FREEZING (LDCOMPUTE, & + PRHODREF, PT, PLVFACT, PLSFACT, & + PRRT, PCRT, PRIT, PCIT, PLBDR, & + P_TH_CFRZ, P_RR_CFRZ, P_CR_CFRZ, P_RI_CFRZ, P_CI_CFRZ ) +! ####################################################################################### +! +!! PURPOSE +!! ------- +!! Compute the rain freezing by contact with an ice crystal +!! +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * CNRM * +!! +!! MODIFICATIONS +!! ------------- +!! Original 15/03/2018 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST, ONLY : XTT +USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCEXVT +USE MODD_PARAM_LIMA_MIXED, ONLY : XICFRR, XEXICFRR, XRCFRI, XEXRCFRI +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE +! +REAL, DIMENSION(:), INTENT(IN) :: PRHODREF ! Reference Exner function +REAL, DIMENSION(:), INTENT(IN) :: PT ! +REAL, DIMENSION(:), INTENT(IN) :: PLVFACT ! +REAL, DIMENSION(:), INTENT(IN) :: PLSFACT ! +! +REAL, DIMENSION(:), INTENT(IN) :: PRRT ! +REAL, DIMENSION(:), INTENT(IN) :: PCRT ! +REAL, DIMENSION(:), INTENT(IN) :: PRIT ! +REAL, DIMENSION(:), INTENT(IN) :: PCIT ! +REAL, DIMENSION(:), INTENT(IN) :: PLBDR ! +! +REAL, DIMENSION(:), INTENT(OUT) :: P_TH_CFRZ +REAL, DIMENSION(:), INTENT(OUT) :: P_RR_CFRZ +REAL, DIMENSION(:), INTENT(OUT) :: P_CR_CFRZ +REAL, DIMENSION(:), INTENT(OUT) :: P_RI_CFRZ +REAL, DIMENSION(:), INTENT(OUT) :: P_CI_CFRZ +! +!* 0.2 Declarations of local variables : +! +REAL, DIMENSION(SIZE(PRRT)) :: ZW1, ZW2 ! work arrays +! +!------------------------------------------------------------------------------- +! +! +!* 1. PRELIMINARY COMPUTATIONS +! ------------------------ +! +! +P_TH_CFRZ(:)=0. +P_RR_CFRZ(:)=0. +P_CR_CFRZ(:)=0. +P_RI_CFRZ(:)=0. +P_CI_CFRZ(:)=0. +! +ZW1(:)=0. +ZW2(:)=0. +! +WHERE( (PRIT(:)>XRTMIN(4)) .AND. (PRRT(:)>XRTMIN(3)) .AND. (PT(:)<XTT) .AND. LDCOMPUTE(:) ) +! + ZW1(:) = XICFRR * PRIT(:) * PCRT(:) & ! RICFRRG + * PLBDR(:)**XEXICFRR & + * PRHODREF(:)**(-XCEXVT-1.0) +! + ZW2(:) = XRCFRI * PCIT(:) * PCRT(:) & ! RRCFRIG + * PLBDR(:)**XEXRCFRI & + * PRHODREF(:)**(-XCEXVT-1.0) +! + P_RR_CFRZ(:) = - ZW2(:) + P_CR_CFRZ(:) = - ZW2(:) * (PCRT(:)/PRRT(:)) + P_RI_CFRZ(:) = - ZW1(:) + P_CI_CFRZ(:) = - ZW1(:) * (PCIT(:)/PRIT(:)) + P_TH_CFRZ(:) = - P_RR_CFRZ(:) * (PLSFACT(:)-PLVFACT(:)) +! +END WHERE +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE LIMA_RAIN_FREEZING diff --git a/src/mesonh/micro/lima_read_xker_gweth.f90 b/src/mesonh/micro/lima_read_xker_gweth.f90 new file mode 100644 index 000000000..25a567ec8 --- /dev/null +++ b/src/mesonh/micro/lima_read_xker_gweth.f90 @@ -0,0 +1,1737 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 microph 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ########################### + MODULE MODI_LIMA_READ_XKER_GWETH +! ########################### +! +INTERFACE + SUBROUTINE LIMA_READ_XKER_GWETH (KWETLBDAH,KWETLBDAG,KND, & + PALPHAH,PNUH,PALPHAG,PNUG,PEHG,PBG,PCH,PDH,PCG,PDG, & + PWETLBDAH_MAX,PWETLBDAG_MAX,PWETLBDAH_MIN,PWETLBDAG_MIN, & + PFDINFTY,PKER_GWETH ) +! +INTEGER, INTENT(OUT) :: KND,KWETLBDAH,KWETLBDAG +REAL, INTENT(OUT) :: PALPHAH +REAL, INTENT(OUT) :: PNUH +REAL, INTENT(OUT) :: PALPHAG +REAL, INTENT(OUT) :: PNUG +REAL, INTENT(OUT) :: PEHG +REAL, INTENT(OUT) :: PBG +REAL, INTENT(OUT) :: PCH +REAL, INTENT(OUT) :: PDH +REAL, INTENT(OUT) :: PCG +REAL, INTENT(OUT) :: PDG +REAL, INTENT(OUT) :: PWETLBDAH_MAX +REAL, INTENT(OUT) :: PWETLBDAG_MAX +REAL, INTENT(OUT) :: PWETLBDAH_MIN +REAL, INTENT(OUT) :: PWETLBDAG_MIN +REAL, INTENT(OUT) :: PFDINFTY +REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PKER_GWETH +! +END SUBROUTINE LIMA_READ_XKER_GWETH +! +END INTERFACE +! +END MODULE MODI_LIMA_READ_XKER_GWETH +! ######################################################################## + SUBROUTINE LIMA_READ_XKER_GWETH (KWETLBDAH,KWETLBDAG,KND, & + PALPHAH,PNUH,PALPHAG,PNUG,PEHG,PBG,PCH,PDH,PCG,PDG, & + PWETLBDAH_MAX,PWETLBDAG_MAX,PWETLBDAH_MIN,PWETLBDAG_MIN, & + PFDINFTY,PKER_GWETH ) +! ######################################################################## +! +!!**** * * - initialize the kernels for the graupel-hail wet growth process +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to initialize the kernels PKER_GWETH +!! prepared from a previous run of the routine INI_RAIN_ICE. The reading +!! of the kernels is optional after checking for the dimensions of the +!! arrays. +!! +!!** METHOD +!! ------ +!! +!! +!! EXTERNAL +!! -------- +!! None +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! Book2 of documentation ( routine READ_XKER_GWETH ) +!! +!! AUTHOR +!! ------ +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original 19/04/97 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +!* 0.2 Declarations of local variables : +! +! +INTEGER, INTENT(OUT) :: KND,KWETLBDAH,KWETLBDAG +REAL, INTENT(OUT) :: PALPHAH +REAL, INTENT(OUT) :: PNUH +REAL, INTENT(OUT) :: PALPHAG +REAL, INTENT(OUT) :: PNUG +REAL, INTENT(OUT) :: PEHG +REAL, INTENT(OUT) :: PBG +REAL, INTENT(OUT) :: PCH +REAL, INTENT(OUT) :: PDH +REAL, INTENT(OUT) :: PCG +REAL, INTENT(OUT) :: PDG +REAL, INTENT(OUT) :: PWETLBDAH_MAX +REAL, INTENT(OUT) :: PWETLBDAG_MAX +REAL, INTENT(OUT) :: PWETLBDAH_MIN +REAL, INTENT(OUT) :: PWETLBDAG_MIN +REAL, INTENT(OUT) :: PFDINFTY +REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PKER_GWETH +! +! ######################################################################## +! #INSERT HERE THE OUTPUT OF INI_RAIN_ICE_HAIL IF THE KERNELS ARE UPDATED# +! ######################################################################## +! +KND= 50 +KWETLBDAH= 40 +KWETLBDAG= 40 +PALPHAH= 0.100000E+01 +PNUH= 0.800000E+01 +PALPHAG= 0.100000E+01 +PNUG= 0.100000E+01 +PEHG= 0.100000E+01 +PBG= 0.280000E+01 +PCH= 0.201000E+03 +PDH= 0.640000E+00 +PCG= 0.122000E+03 +PDG= 0.660000E+00 +PWETLBDAH_MAX= 0.100000E+08 +PWETLBDAG_MAX= 0.100000E+08 +PWETLBDAH_MIN= 0.100000E+04 +PWETLBDAG_MIN= 0.100000E+04 +PFDINFTY= 0.200000E+02 +! +IF( PRESENT(PKER_GWETH) ) THEN +PKER_GWETH( 1, 1) = 0.662921E+01 +PKER_GWETH( 1, 2) = 0.722485E+01 +PKER_GWETH( 1, 3) = 0.772716E+01 +PKER_GWETH( 1, 4) = 0.814872E+01 +PKER_GWETH( 1, 5) = 0.850191E+01 +PKER_GWETH( 1, 6) = 0.879773E+01 +PKER_GWETH( 1, 7) = 0.904564E+01 +PKER_GWETH( 1, 8) = 0.925363E+01 +PKER_GWETH( 1, 9) = 0.942835E+01 +PKER_GWETH( 1, 10) = 0.957535E+01 +PKER_GWETH( 1, 11) = 0.969921E+01 +PKER_GWETH( 1, 12) = 0.980373E+01 +PKER_GWETH( 1, 13) = 0.989205E+01 +PKER_GWETH( 1, 14) = 0.996677E+01 +PKER_GWETH( 1, 15) = 0.100301E+02 +PKER_GWETH( 1, 16) = 0.100837E+02 +PKER_GWETH( 1, 17) = 0.101293E+02 +PKER_GWETH( 1, 18) = 0.101679E+02 +PKER_GWETH( 1, 19) = 0.102008E+02 +PKER_GWETH( 1, 20) = 0.102288E+02 +PKER_GWETH( 1, 21) = 0.102526E+02 +PKER_GWETH( 1, 22) = 0.102728E+02 +PKER_GWETH( 1, 23) = 0.102901E+02 +PKER_GWETH( 1, 24) = 0.103048E+02 +PKER_GWETH( 1, 25) = 0.103173E+02 +PKER_GWETH( 1, 26) = 0.103280E+02 +PKER_GWETH( 1, 27) = 0.103371E+02 +PKER_GWETH( 1, 28) = 0.103449E+02 +PKER_GWETH( 1, 29) = 0.103515E+02 +PKER_GWETH( 1, 30) = 0.103572E+02 +PKER_GWETH( 1, 31) = 0.103620E+02 +PKER_GWETH( 1, 32) = 0.103661E+02 +PKER_GWETH( 1, 33) = 0.103696E+02 +PKER_GWETH( 1, 34) = 0.103727E+02 +PKER_GWETH( 1, 35) = 0.103752E+02 +PKER_GWETH( 1, 36) = 0.103774E+02 +PKER_GWETH( 1, 37) = 0.103793E+02 +PKER_GWETH( 1, 38) = 0.103809E+02 +PKER_GWETH( 1, 39) = 0.103823E+02 +PKER_GWETH( 1, 40) = 0.103835E+02 +PKER_GWETH( 2, 1) = 0.511505E+01 +PKER_GWETH( 2, 2) = 0.571264E+01 +PKER_GWETH( 2, 3) = 0.622270E+01 +PKER_GWETH( 2, 4) = 0.665279E+01 +PKER_GWETH( 2, 5) = 0.701373E+01 +PKER_GWETH( 2, 6) = 0.731613E+01 +PKER_GWETH( 2, 7) = 0.756942E+01 +PKER_GWETH( 2, 8) = 0.778168E+01 +PKER_GWETH( 2, 9) = 0.795975E+01 +PKER_GWETH( 2, 10) = 0.810934E+01 +PKER_GWETH( 2, 11) = 0.823519E+01 +PKER_GWETH( 2, 12) = 0.834123E+01 +PKER_GWETH( 2, 13) = 0.843071E+01 +PKER_GWETH( 2, 14) = 0.850631E+01 +PKER_GWETH( 2, 15) = 0.857028E+01 +PKER_GWETH( 2, 16) = 0.862446E+01 +PKER_GWETH( 2, 17) = 0.867039E+01 +PKER_GWETH( 2, 18) = 0.870937E+01 +PKER_GWETH( 2, 19) = 0.874247E+01 +PKER_GWETH( 2, 20) = 0.877061E+01 +PKER_GWETH( 2, 21) = 0.879454E+01 +PKER_GWETH( 2, 22) = 0.881490E+01 +PKER_GWETH( 2, 23) = 0.883224E+01 +PKER_GWETH( 2, 24) = 0.884700E+01 +PKER_GWETH( 2, 25) = 0.885958E+01 +PKER_GWETH( 2, 26) = 0.887030E+01 +PKER_GWETH( 2, 27) = 0.887945E+01 +PKER_GWETH( 2, 28) = 0.888725E+01 +PKER_GWETH( 2, 29) = 0.889390E+01 +PKER_GWETH( 2, 30) = 0.889958E+01 +PKER_GWETH( 2, 31) = 0.890442E+01 +PKER_GWETH( 2, 32) = 0.890856E+01 +PKER_GWETH( 2, 33) = 0.891209E+01 +PKER_GWETH( 2, 34) = 0.891511E+01 +PKER_GWETH( 2, 35) = 0.891769E+01 +PKER_GWETH( 2, 36) = 0.891989E+01 +PKER_GWETH( 2, 37) = 0.892177E+01 +PKER_GWETH( 2, 38) = 0.892338E+01 +PKER_GWETH( 2, 39) = 0.892475E+01 +PKER_GWETH( 2, 40) = 0.892593E+01 +PKER_GWETH( 3, 1) = 0.382811E+01 +PKER_GWETH( 3, 2) = 0.441084E+01 +PKER_GWETH( 3, 3) = 0.492273E+01 +PKER_GWETH( 3, 4) = 0.535949E+01 +PKER_GWETH( 3, 5) = 0.572774E+01 +PKER_GWETH( 3, 6) = 0.603679E+01 +PKER_GWETH( 3, 7) = 0.629570E+01 +PKER_GWETH( 3, 8) = 0.651257E+01 +PKER_GWETH( 3, 9) = 0.669430E+01 +PKER_GWETH( 3, 10) = 0.684676E+01 +PKER_GWETH( 3, 11) = 0.697484E+01 +PKER_GWETH( 3, 12) = 0.708258E+01 +PKER_GWETH( 3, 13) = 0.717337E+01 +PKER_GWETH( 3, 14) = 0.724997E+01 +PKER_GWETH( 3, 15) = 0.731469E+01 +PKER_GWETH( 3, 16) = 0.736945E+01 +PKER_GWETH( 3, 17) = 0.741583E+01 +PKER_GWETH( 3, 18) = 0.745515E+01 +PKER_GWETH( 3, 19) = 0.748851E+01 +PKER_GWETH( 3, 20) = 0.751685E+01 +PKER_GWETH( 3, 21) = 0.754093E+01 +PKER_GWETH( 3, 22) = 0.756141E+01 +PKER_GWETH( 3, 23) = 0.757884E+01 +PKER_GWETH( 3, 24) = 0.759368E+01 +PKER_GWETH( 3, 25) = 0.760631E+01 +PKER_GWETH( 3, 26) = 0.761708E+01 +PKER_GWETH( 3, 27) = 0.762626E+01 +PKER_GWETH( 3, 28) = 0.763408E+01 +PKER_GWETH( 3, 29) = 0.764076E+01 +PKER_GWETH( 3, 30) = 0.764645E+01 +PKER_GWETH( 3, 31) = 0.765131E+01 +PKER_GWETH( 3, 32) = 0.765546E+01 +PKER_GWETH( 3, 33) = 0.765900E+01 +PKER_GWETH( 3, 34) = 0.766202E+01 +PKER_GWETH( 3, 35) = 0.766460E+01 +PKER_GWETH( 3, 36) = 0.766681E+01 +PKER_GWETH( 3, 37) = 0.766869E+01 +PKER_GWETH( 3, 38) = 0.767030E+01 +PKER_GWETH( 3, 39) = 0.767168E+01 +PKER_GWETH( 3, 40) = 0.767285E+01 +PKER_GWETH( 4, 1) = 0.276960E+01 +PKER_GWETH( 4, 2) = 0.330386E+01 +PKER_GWETH( 4, 3) = 0.380351E+01 +PKER_GWETH( 4, 4) = 0.424198E+01 +PKER_GWETH( 4, 5) = 0.461597E+01 +PKER_GWETH( 4, 6) = 0.493128E+01 +PKER_GWETH( 4, 7) = 0.519588E+01 +PKER_GWETH( 4, 8) = 0.541757E+01 +PKER_GWETH( 4, 9) = 0.560325E+01 +PKER_GWETH( 4, 10) = 0.575886E+01 +PKER_GWETH( 4, 11) = 0.588939E+01 +PKER_GWETH( 4, 12) = 0.599904E+01 +PKER_GWETH( 4, 13) = 0.609129E+01 +PKER_GWETH( 4, 14) = 0.616901E+01 +PKER_GWETH( 4, 15) = 0.623459E+01 +PKER_GWETH( 4, 16) = 0.629000E+01 +PKER_GWETH( 4, 17) = 0.633687E+01 +PKER_GWETH( 4, 18) = 0.637657E+01 +PKER_GWETH( 4, 19) = 0.641023E+01 +PKER_GWETH( 4, 20) = 0.643879E+01 +PKER_GWETH( 4, 21) = 0.646304E+01 +PKER_GWETH( 4, 22) = 0.648366E+01 +PKER_GWETH( 4, 23) = 0.650119E+01 +PKER_GWETH( 4, 24) = 0.651610E+01 +PKER_GWETH( 4, 25) = 0.652880E+01 +PKER_GWETH( 4, 26) = 0.653962E+01 +PKER_GWETH( 4, 27) = 0.654883E+01 +PKER_GWETH( 4, 28) = 0.655669E+01 +PKER_GWETH( 4, 29) = 0.656338E+01 +PKER_GWETH( 4, 30) = 0.656910E+01 +PKER_GWETH( 4, 31) = 0.657397E+01 +PKER_GWETH( 4, 32) = 0.657813E+01 +PKER_GWETH( 4, 33) = 0.658168E+01 +PKER_GWETH( 4, 34) = 0.658471E+01 +PKER_GWETH( 4, 35) = 0.658729E+01 +PKER_GWETH( 4, 36) = 0.658950E+01 +PKER_GWETH( 4, 37) = 0.659139E+01 +PKER_GWETH( 4, 38) = 0.659300E+01 +PKER_GWETH( 4, 39) = 0.659438E+01 +PKER_GWETH( 4, 40) = 0.659556E+01 +PKER_GWETH( 5, 1) = 0.195940E+01 +PKER_GWETH( 5, 2) = 0.239226E+01 +PKER_GWETH( 5, 3) = 0.285134E+01 +PKER_GWETH( 5, 4) = 0.327973E+01 +PKER_GWETH( 5, 5) = 0.365531E+01 +PKER_GWETH( 5, 6) = 0.397556E+01 +PKER_GWETH( 5, 7) = 0.424553E+01 +PKER_GWETH( 5, 8) = 0.447209E+01 +PKER_GWETH( 5, 9) = 0.466190E+01 +PKER_GWETH( 5, 10) = 0.482088E+01 +PKER_GWETH( 5, 11) = 0.495411E+01 +PKER_GWETH( 5, 12) = 0.506587E+01 +PKER_GWETH( 5, 13) = 0.515975E+01 +PKER_GWETH( 5, 14) = 0.523873E+01 +PKER_GWETH( 5, 15) = 0.530527E+01 +PKER_GWETH( 5, 16) = 0.536141E+01 +PKER_GWETH( 5, 17) = 0.540884E+01 +PKER_GWETH( 5, 18) = 0.544897E+01 +PKER_GWETH( 5, 19) = 0.548295E+01 +PKER_GWETH( 5, 20) = 0.551176E+01 +PKER_GWETH( 5, 21) = 0.553621E+01 +PKER_GWETH( 5, 22) = 0.555697E+01 +PKER_GWETH( 5, 23) = 0.557462E+01 +PKER_GWETH( 5, 24) = 0.558962E+01 +PKER_GWETH( 5, 25) = 0.560239E+01 +PKER_GWETH( 5, 26) = 0.561326E+01 +PKER_GWETH( 5, 27) = 0.562251E+01 +PKER_GWETH( 5, 28) = 0.563040E+01 +PKER_GWETH( 5, 29) = 0.563712E+01 +PKER_GWETH( 5, 30) = 0.564285E+01 +PKER_GWETH( 5, 31) = 0.564774E+01 +PKER_GWETH( 5, 32) = 0.565191E+01 +PKER_GWETH( 5, 33) = 0.565547E+01 +PKER_GWETH( 5, 34) = 0.565851E+01 +PKER_GWETH( 5, 35) = 0.566110E+01 +PKER_GWETH( 5, 36) = 0.566331E+01 +PKER_GWETH( 5, 37) = 0.566521E+01 +PKER_GWETH( 5, 38) = 0.566682E+01 +PKER_GWETH( 5, 39) = 0.566820E+01 +PKER_GWETH( 5, 40) = 0.566938E+01 +PKER_GWETH( 6, 1) = 0.142387E+01 +PKER_GWETH( 6, 2) = 0.169262E+01 +PKER_GWETH( 6, 3) = 0.206631E+01 +PKER_GWETH( 6, 4) = 0.246074E+01 +PKER_GWETH( 6, 5) = 0.282802E+01 +PKER_GWETH( 6, 6) = 0.314972E+01 +PKER_GWETH( 6, 7) = 0.342395E+01 +PKER_GWETH( 6, 8) = 0.365511E+01 +PKER_GWETH( 6, 9) = 0.384909E+01 +PKER_GWETH( 6, 10) = 0.401161E+01 +PKER_GWETH( 6, 11) = 0.414773E+01 +PKER_GWETH( 6, 12) = 0.426180E+01 +PKER_GWETH( 6, 13) = 0.435749E+01 +PKER_GWETH( 6, 14) = 0.443787E+01 +PKER_GWETH( 6, 15) = 0.450549E+01 +PKER_GWETH( 6, 16) = 0.456245E+01 +PKER_GWETH( 6, 17) = 0.461051E+01 +PKER_GWETH( 6, 18) = 0.465112E+01 +PKER_GWETH( 6, 19) = 0.468547E+01 +PKER_GWETH( 6, 20) = 0.471456E+01 +PKER_GWETH( 6, 21) = 0.473922E+01 +PKER_GWETH( 6, 22) = 0.476015E+01 +PKER_GWETH( 6, 23) = 0.477792E+01 +PKER_GWETH( 6, 24) = 0.479302E+01 +PKER_GWETH( 6, 25) = 0.480587E+01 +PKER_GWETH( 6, 26) = 0.481679E+01 +PKER_GWETH( 6, 27) = 0.482610E+01 +PKER_GWETH( 6, 28) = 0.483402E+01 +PKER_GWETH( 6, 29) = 0.484077E+01 +PKER_GWETH( 6, 30) = 0.484652E+01 +PKER_GWETH( 6, 31) = 0.485143E+01 +PKER_GWETH( 6, 32) = 0.485561E+01 +PKER_GWETH( 6, 33) = 0.485918E+01 +PKER_GWETH( 6, 34) = 0.486223E+01 +PKER_GWETH( 6, 35) = 0.486482E+01 +PKER_GWETH( 6, 36) = 0.486704E+01 +PKER_GWETH( 6, 37) = 0.486894E+01 +PKER_GWETH( 6, 38) = 0.487056E+01 +PKER_GWETH( 6, 39) = 0.487194E+01 +PKER_GWETH( 6, 40) = 0.487312E+01 +PKER_GWETH( 7, 1) = 0.116756E+01 +PKER_GWETH( 7, 2) = 0.122777E+01 +PKER_GWETH( 7, 3) = 0.146234E+01 +PKER_GWETH( 7, 4) = 0.178473E+01 +PKER_GWETH( 7, 5) = 0.212359E+01 +PKER_GWETH( 7, 6) = 0.243847E+01 +PKER_GWETH( 7, 7) = 0.271403E+01 +PKER_GWETH( 7, 8) = 0.294885E+01 +PKER_GWETH( 7, 9) = 0.314677E+01 +PKER_GWETH( 7, 10) = 0.331286E+01 +PKER_GWETH( 7, 11) = 0.345202E+01 +PKER_GWETH( 7, 12) = 0.356856E+01 +PKER_GWETH( 7, 13) = 0.366623E+01 +PKER_GWETH( 7, 14) = 0.374816E+01 +PKER_GWETH( 7, 15) = 0.381698E+01 +PKER_GWETH( 7, 16) = 0.387486E+01 +PKER_GWETH( 7, 17) = 0.392363E+01 +PKER_GWETH( 7, 18) = 0.396478E+01 +PKER_GWETH( 7, 19) = 0.399954E+01 +PKER_GWETH( 7, 20) = 0.402895E+01 +PKER_GWETH( 7, 21) = 0.405385E+01 +PKER_GWETH( 7, 22) = 0.407496E+01 +PKER_GWETH( 7, 23) = 0.409288E+01 +PKER_GWETH( 7, 24) = 0.410809E+01 +PKER_GWETH( 7, 25) = 0.412101E+01 +PKER_GWETH( 7, 26) = 0.413201E+01 +PKER_GWETH( 7, 27) = 0.414136E+01 +PKER_GWETH( 7, 28) = 0.414932E+01 +PKER_GWETH( 7, 29) = 0.415610E+01 +PKER_GWETH( 7, 30) = 0.416188E+01 +PKER_GWETH( 7, 31) = 0.416680E+01 +PKER_GWETH( 7, 32) = 0.417100E+01 +PKER_GWETH( 7, 33) = 0.417458E+01 +PKER_GWETH( 7, 34) = 0.417764E+01 +PKER_GWETH( 7, 35) = 0.418024E+01 +PKER_GWETH( 7, 36) = 0.418247E+01 +PKER_GWETH( 7, 37) = 0.418437E+01 +PKER_GWETH( 7, 38) = 0.418599E+01 +PKER_GWETH( 7, 39) = 0.418737E+01 +PKER_GWETH( 7, 40) = 0.418855E+01 +PKER_GWETH( 8, 1) = 0.115655E+01 +PKER_GWETH( 8, 2) = 0.100208E+01 +PKER_GWETH( 8, 3) = 0.105877E+01 +PKER_GWETH( 8, 4) = 0.126349E+01 +PKER_GWETH( 8, 5) = 0.154150E+01 +PKER_GWETH( 8, 6) = 0.183260E+01 +PKER_GWETH( 8, 7) = 0.210253E+01 +PKER_GWETH( 8, 8) = 0.233857E+01 +PKER_GWETH( 8, 9) = 0.253964E+01 +PKER_GWETH( 8, 10) = 0.270911E+01 +PKER_GWETH( 8, 11) = 0.285132E+01 +PKER_GWETH( 8, 12) = 0.297046E+01 +PKER_GWETH( 8, 13) = 0.307026E+01 +PKER_GWETH( 8, 14) = 0.315388E+01 +PKER_GWETH( 8, 15) = 0.322402E+01 +PKER_GWETH( 8, 16) = 0.328294E+01 +PKER_GWETH( 8, 17) = 0.333250E+01 +PKER_GWETH( 8, 18) = 0.337426E+01 +PKER_GWETH( 8, 19) = 0.340948E+01 +PKER_GWETH( 8, 20) = 0.343924E+01 +PKER_GWETH( 8, 21) = 0.346442E+01 +PKER_GWETH( 8, 22) = 0.348573E+01 +PKER_GWETH( 8, 23) = 0.350381E+01 +PKER_GWETH( 8, 24) = 0.351914E+01 +PKER_GWETH( 8, 25) = 0.353216E+01 +PKER_GWETH( 8, 26) = 0.354322E+01 +PKER_GWETH( 8, 27) = 0.355263E+01 +PKER_GWETH( 8, 28) = 0.356064E+01 +PKER_GWETH( 8, 29) = 0.356745E+01 +PKER_GWETH( 8, 30) = 0.357325E+01 +PKER_GWETH( 8, 31) = 0.357820E+01 +PKER_GWETH( 8, 32) = 0.358241E+01 +PKER_GWETH( 8, 33) = 0.358601E+01 +PKER_GWETH( 8, 34) = 0.358907E+01 +PKER_GWETH( 8, 35) = 0.359168E+01 +PKER_GWETH( 8, 36) = 0.359391E+01 +PKER_GWETH( 8, 37) = 0.359582E+01 +PKER_GWETH( 8, 38) = 0.359744E+01 +PKER_GWETH( 8, 39) = 0.359883E+01 +PKER_GWETH( 8, 40) = 0.360002E+01 +PKER_GWETH( 9, 1) = 0.132218E+01 +PKER_GWETH( 9, 2) = 0.987527E+00 +PKER_GWETH( 9, 3) = 0.860208E+00 +PKER_GWETH( 9, 4) = 0.913110E+00 +PKER_GWETH( 9, 5) = 0.109167E+01 +PKER_GWETH( 9, 6) = 0.133139E+01 +PKER_GWETH( 9, 7) = 0.158145E+01 +PKER_GWETH( 9, 8) = 0.181284E+01 +PKER_GWETH( 9, 9) = 0.201502E+01 +PKER_GWETH( 9, 10) = 0.218719E+01 +PKER_GWETH( 9, 11) = 0.233229E+01 +PKER_GWETH( 9, 12) = 0.245406E+01 +PKER_GWETH( 9, 13) = 0.255607E+01 +PKER_GWETH( 9, 14) = 0.264152E+01 +PKER_GWETH( 9, 15) = 0.271312E+01 +PKER_GWETH( 9, 16) = 0.277318E+01 +PKER_GWETH( 9, 17) = 0.282362E+01 +PKER_GWETH( 9, 18) = 0.286605E+01 +PKER_GWETH( 9, 19) = 0.290180E+01 +PKER_GWETH( 9, 20) = 0.293196E+01 +PKER_GWETH( 9, 21) = 0.295743E+01 +PKER_GWETH( 9, 22) = 0.297898E+01 +PKER_GWETH( 9, 23) = 0.299723E+01 +PKER_GWETH( 9, 24) = 0.301270E+01 +PKER_GWETH( 9, 25) = 0.302582E+01 +PKER_GWETH( 9, 26) = 0.303697E+01 +PKER_GWETH( 9, 27) = 0.304644E+01 +PKER_GWETH( 9, 28) = 0.305449E+01 +PKER_GWETH( 9, 29) = 0.306134E+01 +PKER_GWETH( 9, 30) = 0.306718E+01 +PKER_GWETH( 9, 31) = 0.307214E+01 +PKER_GWETH( 9, 32) = 0.307638E+01 +PKER_GWETH( 9, 33) = 0.307998E+01 +PKER_GWETH( 9, 34) = 0.308306E+01 +PKER_GWETH( 9, 35) = 0.308568E+01 +PKER_GWETH( 9, 36) = 0.308792E+01 +PKER_GWETH( 9, 37) = 0.308983E+01 +PKER_GWETH( 9, 38) = 0.309145E+01 +PKER_GWETH( 9, 39) = 0.309285E+01 +PKER_GWETH( 9, 40) = 0.309403E+01 +PKER_GWETH( 10, 1) = 0.158474E+01 +PKER_GWETH( 10, 2) = 0.112606E+01 +PKER_GWETH( 10, 3) = 0.843404E+00 +PKER_GWETH( 10, 4) = 0.738516E+00 +PKER_GWETH( 10, 5) = 0.787554E+00 +PKER_GWETH( 10, 6) = 0.943174E+00 +PKER_GWETH( 10, 7) = 0.114990E+01 +PKER_GWETH( 10, 8) = 0.136468E+01 +PKER_GWETH( 10, 9) = 0.156304E+01 +PKER_GWETH( 10, 10) = 0.173621E+01 +PKER_GWETH( 10, 11) = 0.188364E+01 +PKER_GWETH( 10, 12) = 0.200788E+01 +PKER_GWETH( 10, 13) = 0.211214E+01 +PKER_GWETH( 10, 14) = 0.219948E+01 +PKER_GWETH( 10, 15) = 0.227264E+01 +PKER_GWETH( 10, 16) = 0.233395E+01 +PKER_GWETH( 10, 17) = 0.238537E+01 +PKER_GWETH( 10, 18) = 0.242856E+01 +PKER_GWETH( 10, 19) = 0.246489E+01 +PKER_GWETH( 10, 20) = 0.249549E+01 +PKER_GWETH( 10, 21) = 0.252131E+01 +PKER_GWETH( 10, 22) = 0.254312E+01 +PKER_GWETH( 10, 23) = 0.256156E+01 +PKER_GWETH( 10, 24) = 0.257719E+01 +PKER_GWETH( 10, 25) = 0.259043E+01 +PKER_GWETH( 10, 26) = 0.260166E+01 +PKER_GWETH( 10, 27) = 0.261120E+01 +PKER_GWETH( 10, 28) = 0.261931E+01 +PKER_GWETH( 10, 29) = 0.262620E+01 +PKER_GWETH( 10, 30) = 0.263207E+01 +PKER_GWETH( 10, 31) = 0.263706E+01 +PKER_GWETH( 10, 32) = 0.264131E+01 +PKER_GWETH( 10, 33) = 0.264493E+01 +PKER_GWETH( 10, 34) = 0.264802E+01 +PKER_GWETH( 10, 35) = 0.265065E+01 +PKER_GWETH( 10, 36) = 0.265289E+01 +PKER_GWETH( 10, 37) = 0.265481E+01 +PKER_GWETH( 10, 38) = 0.265644E+01 +PKER_GWETH( 10, 39) = 0.265784E+01 +PKER_GWETH( 10, 40) = 0.265903E+01 +PKER_GWETH( 11, 1) = 0.187936E+01 +PKER_GWETH( 11, 2) = 0.134925E+01 +PKER_GWETH( 11, 3) = 0.959066E+00 +PKER_GWETH( 11, 4) = 0.720467E+00 +PKER_GWETH( 11, 5) = 0.634149E+00 +PKER_GWETH( 11, 6) = 0.679336E+00 +PKER_GWETH( 11, 7) = 0.814841E+00 +PKER_GWETH( 11, 8) = 0.993130E+00 +PKER_GWETH( 11, 9) = 0.117760E+01 +PKER_GWETH( 11, 10) = 0.134764E+01 +PKER_GWETH( 11, 11) = 0.149595E+01 +PKER_GWETH( 11, 12) = 0.162219E+01 +PKER_GWETH( 11, 13) = 0.172857E+01 +PKER_GWETH( 11, 14) = 0.181784E+01 +PKER_GWETH( 11, 15) = 0.189263E+01 +PKER_GWETH( 11, 16) = 0.195527E+01 +PKER_GWETH( 11, 17) = 0.200776E+01 +PKER_GWETH( 11, 18) = 0.205179E+01 +PKER_GWETH( 11, 19) = 0.208876E+01 +PKER_GWETH( 11, 20) = 0.211987E+01 +PKER_GWETH( 11, 21) = 0.214607E+01 +PKER_GWETH( 11, 22) = 0.216817E+01 +PKER_GWETH( 11, 23) = 0.218684E+01 +PKER_GWETH( 11, 24) = 0.220263E+01 +PKER_GWETH( 11, 25) = 0.221601E+01 +PKER_GWETH( 11, 26) = 0.222734E+01 +PKER_GWETH( 11, 27) = 0.223696E+01 +PKER_GWETH( 11, 28) = 0.224512E+01 +PKER_GWETH( 11, 29) = 0.225206E+01 +PKER_GWETH( 11, 30) = 0.225796E+01 +PKER_GWETH( 11, 31) = 0.226298E+01 +PKER_GWETH( 11, 32) = 0.226725E+01 +PKER_GWETH( 11, 33) = 0.227089E+01 +PKER_GWETH( 11, 34) = 0.227399E+01 +PKER_GWETH( 11, 35) = 0.227663E+01 +PKER_GWETH( 11, 36) = 0.227889E+01 +PKER_GWETH( 11, 37) = 0.228081E+01 +PKER_GWETH( 11, 38) = 0.228245E+01 +PKER_GWETH( 11, 39) = 0.228384E+01 +PKER_GWETH( 11, 40) = 0.228504E+01 +PKER_GWETH( 12, 1) = 0.216566E+01 +PKER_GWETH( 12, 2) = 0.160109E+01 +PKER_GWETH( 12, 3) = 0.114873E+01 +PKER_GWETH( 12, 4) = 0.816878E+00 +PKER_GWETH( 12, 5) = 0.615510E+00 +PKER_GWETH( 12, 6) = 0.544612E+00 +PKER_GWETH( 12, 7) = 0.586008E+00 +PKER_GWETH( 12, 8) = 0.703936E+00 +PKER_GWETH( 12, 9) = 0.857718E+00 +PKER_GWETH( 12, 10) = 0.101614E+01 +PKER_GWETH( 12, 11) = 0.116189E+01 +PKER_GWETH( 12, 12) = 0.128892E+01 +PKER_GWETH( 12, 13) = 0.139702E+01 +PKER_GWETH( 12, 14) = 0.148811E+01 +PKER_GWETH( 12, 15) = 0.156454E+01 +PKER_GWETH( 12, 16) = 0.162858E+01 +PKER_GWETH( 12, 17) = 0.168221E+01 +PKER_GWETH( 12, 18) = 0.172715E+01 +PKER_GWETH( 12, 19) = 0.176485E+01 +PKER_GWETH( 12, 20) = 0.179651E+01 +PKER_GWETH( 12, 21) = 0.182314E+01 +PKER_GWETH( 12, 22) = 0.184557E+01 +PKER_GWETH( 12, 23) = 0.186449E+01 +PKER_GWETH( 12, 24) = 0.188048E+01 +PKER_GWETH( 12, 25) = 0.189400E+01 +PKER_GWETH( 12, 26) = 0.190544E+01 +PKER_GWETH( 12, 27) = 0.191515E+01 +PKER_GWETH( 12, 28) = 0.192338E+01 +PKER_GWETH( 12, 29) = 0.193037E+01 +PKER_GWETH( 12, 30) = 0.193631E+01 +PKER_GWETH( 12, 31) = 0.194136E+01 +PKER_GWETH( 12, 32) = 0.194565E+01 +PKER_GWETH( 12, 33) = 0.194931E+01 +PKER_GWETH( 12, 34) = 0.195242E+01 +PKER_GWETH( 12, 35) = 0.195508E+01 +PKER_GWETH( 12, 36) = 0.195734E+01 +PKER_GWETH( 12, 37) = 0.195926E+01 +PKER_GWETH( 12, 38) = 0.196091E+01 +PKER_GWETH( 12, 39) = 0.196231E+01 +PKER_GWETH( 12, 40) = 0.196351E+01 +PKER_GWETH( 13, 1) = 0.242478E+01 +PKER_GWETH( 13, 2) = 0.184651E+01 +PKER_GWETH( 13, 3) = 0.136400E+01 +PKER_GWETH( 13, 4) = 0.978003E+00 +PKER_GWETH( 13, 5) = 0.695793E+00 +PKER_GWETH( 13, 6) = 0.525848E+00 +PKER_GWETH( 13, 7) = 0.467780E+00 +PKER_GWETH( 13, 8) = 0.505573E+00 +PKER_GWETH( 13, 9) = 0.608098E+00 +PKER_GWETH( 13, 10) = 0.740757E+00 +PKER_GWETH( 13, 11) = 0.876797E+00 +PKER_GWETH( 13, 12) = 0.100173E+01 +PKER_GWETH( 13, 13) = 0.111053E+01 +PKER_GWETH( 13, 14) = 0.120309E+01 +PKER_GWETH( 13, 15) = 0.128108E+01 +PKER_GWETH( 13, 16) = 0.134653E+01 +PKER_GWETH( 13, 17) = 0.140136E+01 +PKER_GWETH( 13, 18) = 0.144728E+01 +PKER_GWETH( 13, 19) = 0.148576E+01 +PKER_GWETH( 13, 20) = 0.151804E+01 +PKER_GWETH( 13, 21) = 0.154514E+01 +PKER_GWETH( 13, 22) = 0.156794E+01 +PKER_GWETH( 13, 23) = 0.158715E+01 +PKER_GWETH( 13, 24) = 0.160335E+01 +PKER_GWETH( 13, 25) = 0.161703E+01 +PKER_GWETH( 13, 26) = 0.162860E+01 +PKER_GWETH( 13, 27) = 0.163840E+01 +PKER_GWETH( 13, 28) = 0.164671E+01 +PKER_GWETH( 13, 29) = 0.165376E+01 +PKER_GWETH( 13, 30) = 0.165974E+01 +PKER_GWETH( 13, 31) = 0.166482E+01 +PKER_GWETH( 13, 32) = 0.166914E+01 +PKER_GWETH( 13, 33) = 0.167282E+01 +PKER_GWETH( 13, 34) = 0.167595E+01 +PKER_GWETH( 13, 35) = 0.167862E+01 +PKER_GWETH( 13, 36) = 0.168089E+01 +PKER_GWETH( 13, 37) = 0.168282E+01 +PKER_GWETH( 13, 38) = 0.168447E+01 +PKER_GWETH( 13, 39) = 0.168588E+01 +PKER_GWETH( 13, 40) = 0.168708E+01 +PKER_GWETH( 14, 1) = 0.265128E+01 +PKER_GWETH( 14, 2) = 0.206894E+01 +PKER_GWETH( 14, 3) = 0.157436E+01 +PKER_GWETH( 14, 4) = 0.116200E+01 +PKER_GWETH( 14, 5) = 0.832643E+00 +PKER_GWETH( 14, 6) = 0.592653E+00 +PKER_GWETH( 14, 7) = 0.449243E+00 +PKER_GWETH( 14, 8) = 0.401845E+00 +PKER_GWETH( 14, 9) = 0.436189E+00 +PKER_GWETH( 14, 10) = 0.525318E+00 +PKER_GWETH( 14, 11) = 0.639731E+00 +PKER_GWETH( 14, 12) = 0.756546E+00 +PKER_GWETH( 14, 13) = 0.863627E+00 +PKER_GWETH( 14, 14) = 0.956814E+00 +PKER_GWETH( 14, 15) = 0.103607E+01 +PKER_GWETH( 14, 16) = 0.110285E+01 +PKER_GWETH( 14, 17) = 0.115889E+01 +PKER_GWETH( 14, 18) = 0.120583E+01 +PKER_GWETH( 14, 19) = 0.124515E+01 +PKER_GWETH( 14, 20) = 0.127810E+01 +PKER_GWETH( 14, 21) = 0.130574E+01 +PKER_GWETH( 14, 22) = 0.132895E+01 +PKER_GWETH( 14, 23) = 0.134846E+01 +PKER_GWETH( 14, 24) = 0.136491E+01 +PKER_GWETH( 14, 25) = 0.137878E+01 +PKER_GWETH( 14, 26) = 0.139049E+01 +PKER_GWETH( 14, 27) = 0.140040E+01 +PKER_GWETH( 14, 28) = 0.140879E+01 +PKER_GWETH( 14, 29) = 0.141590E+01 +PKER_GWETH( 14, 30) = 0.142193E+01 +PKER_GWETH( 14, 31) = 0.142705E+01 +PKER_GWETH( 14, 32) = 0.143140E+01 +PKER_GWETH( 14, 33) = 0.143510E+01 +PKER_GWETH( 14, 34) = 0.143825E+01 +PKER_GWETH( 14, 35) = 0.144093E+01 +PKER_GWETH( 14, 36) = 0.144321E+01 +PKER_GWETH( 14, 37) = 0.144515E+01 +PKER_GWETH( 14, 38) = 0.144681E+01 +PKER_GWETH( 14, 39) = 0.144822E+01 +PKER_GWETH( 14, 40) = 0.144942E+01 +PKER_GWETH( 15, 1) = 0.284621E+01 +PKER_GWETH( 15, 2) = 0.226351E+01 +PKER_GWETH( 15, 3) = 0.176529E+01 +PKER_GWETH( 15, 4) = 0.134229E+01 +PKER_GWETH( 15, 5) = 0.989890E+00 +PKER_GWETH( 15, 6) = 0.708881E+00 +PKER_GWETH( 15, 7) = 0.504845E+00 +PKER_GWETH( 15, 8) = 0.383795E+00 +PKER_GWETH( 15, 9) = 0.345252E+00 +PKER_GWETH( 15, 10) = 0.376367E+00 +PKER_GWETH( 15, 11) = 0.453863E+00 +PKER_GWETH( 15, 12) = 0.552469E+00 +PKER_GWETH( 15, 13) = 0.652771E+00 +PKER_GWETH( 15, 14) = 0.744550E+00 +PKER_GWETH( 15, 15) = 0.824363E+00 +PKER_GWETH( 15, 16) = 0.892231E+00 +PKER_GWETH( 15, 17) = 0.949407E+00 +PKER_GWETH( 15, 18) = 0.997387E+00 +PKER_GWETH( 15, 19) = 0.103759E+01 +PKER_GWETH( 15, 20) = 0.107125E+01 +PKER_GWETH( 15, 21) = 0.109946E+01 +PKER_GWETH( 15, 22) = 0.112312E+01 +PKER_GWETH( 15, 23) = 0.114300E+01 +PKER_GWETH( 15, 24) = 0.115971E+01 +PKER_GWETH( 15, 25) = 0.117378E+01 +PKER_GWETH( 15, 26) = 0.118566E+01 +PKER_GWETH( 15, 27) = 0.119569E+01 +PKER_GWETH( 15, 28) = 0.120417E+01 +PKER_GWETH( 15, 29) = 0.121135E+01 +PKER_GWETH( 15, 30) = 0.121743E+01 +PKER_GWETH( 15, 31) = 0.122260E+01 +PKER_GWETH( 15, 32) = 0.122698E+01 +PKER_GWETH( 15, 33) = 0.123071E+01 +PKER_GWETH( 15, 34) = 0.123387E+01 +PKER_GWETH( 15, 35) = 0.123657E+01 +PKER_GWETH( 15, 36) = 0.123886E+01 +PKER_GWETH( 15, 37) = 0.124081E+01 +PKER_GWETH( 15, 38) = 0.124247E+01 +PKER_GWETH( 15, 39) = 0.124389E+01 +PKER_GWETH( 15, 40) = 0.124510E+01 +PKER_GWETH( 16, 1) = 0.301293E+01 +PKER_GWETH( 16, 2) = 0.243100E+01 +PKER_GWETH( 16, 3) = 0.193242E+01 +PKER_GWETH( 16, 4) = 0.150618E+01 +PKER_GWETH( 16, 5) = 0.114441E+01 +PKER_GWETH( 16, 6) = 0.843236E+00 +PKER_GWETH( 16, 7) = 0.603507E+00 +PKER_GWETH( 16, 8) = 0.430078E+00 +PKER_GWETH( 16, 9) = 0.327966E+00 +PKER_GWETH( 16, 10) = 0.296680E+00 +PKER_GWETH( 16, 11) = 0.324772E+00 +PKER_GWETH( 16, 12) = 0.392150E+00 +PKER_GWETH( 16, 13) = 0.477107E+00 +PKER_GWETH( 16, 14) = 0.563219E+00 +PKER_GWETH( 16, 15) = 0.641879E+00 +PKER_GWETH( 16, 16) = 0.710236E+00 +PKER_GWETH( 16, 17) = 0.768350E+00 +PKER_GWETH( 16, 18) = 0.817307E+00 +PKER_GWETH( 16, 19) = 0.858389E+00 +PKER_GWETH( 16, 20) = 0.892809E+00 +PKER_GWETH( 16, 21) = 0.921636E+00 +PKER_GWETH( 16, 22) = 0.945790E+00 +PKER_GWETH( 16, 23) = 0.966049E+00 +PKER_GWETH( 16, 24) = 0.983062E+00 +PKER_GWETH( 16, 25) = 0.997370E+00 +PKER_GWETH( 16, 26) = 0.100942E+01 +PKER_GWETH( 16, 27) = 0.101959E+01 +PKER_GWETH( 16, 28) = 0.102817E+01 +PKER_GWETH( 16, 29) = 0.103543E+01 +PKER_GWETH( 16, 30) = 0.104158E+01 +PKER_GWETH( 16, 31) = 0.104679E+01 +PKER_GWETH( 16, 32) = 0.105121E+01 +PKER_GWETH( 16, 33) = 0.105496E+01 +PKER_GWETH( 16, 34) = 0.105815E+01 +PKER_GWETH( 16, 35) = 0.106086E+01 +PKER_GWETH( 16, 36) = 0.106317E+01 +PKER_GWETH( 16, 37) = 0.106513E+01 +PKER_GWETH( 16, 38) = 0.106680E+01 +PKER_GWETH( 16, 39) = 0.106822E+01 +PKER_GWETH( 16, 40) = 0.106944E+01 +PKER_GWETH( 17, 1) = 0.315524E+01 +PKER_GWETH( 17, 2) = 0.257428E+01 +PKER_GWETH( 17, 3) = 0.207634E+01 +PKER_GWETH( 17, 4) = 0.164974E+01 +PKER_GWETH( 17, 5) = 0.128507E+01 +PKER_GWETH( 17, 6) = 0.975670E+00 +PKER_GWETH( 17, 7) = 0.718280E+00 +PKER_GWETH( 17, 8) = 0.513786E+00 +PKER_GWETH( 17, 9) = 0.366371E+00 +PKER_GWETH( 17, 10) = 0.280370E+00 +PKER_GWETH( 17, 11) = 0.254985E+00 +PKER_GWETH( 17, 12) = 0.280264E+00 +PKER_GWETH( 17, 13) = 0.338829E+00 +PKER_GWETH( 17, 14) = 0.412012E+00 +PKER_GWETH( 17, 15) = 0.485941E+00 +PKER_GWETH( 17, 16) = 0.553357E+00 +PKER_GWETH( 17, 17) = 0.611901E+00 +PKER_GWETH( 17, 18) = 0.661663E+00 +PKER_GWETH( 17, 19) = 0.703581E+00 +PKER_GWETH( 17, 20) = 0.738757E+00 +PKER_GWETH( 17, 21) = 0.768229E+00 +PKER_GWETH( 17, 22) = 0.792912E+00 +PKER_GWETH( 17, 23) = 0.813593E+00 +PKER_GWETH( 17, 24) = 0.830939E+00 +PKER_GWETH( 17, 25) = 0.845506E+00 +PKER_GWETH( 17, 26) = 0.857756E+00 +PKER_GWETH( 17, 27) = 0.868074E+00 +PKER_GWETH( 17, 28) = 0.876776E+00 +PKER_GWETH( 17, 29) = 0.884126E+00 +PKER_GWETH( 17, 30) = 0.890342E+00 +PKER_GWETH( 17, 31) = 0.895604E+00 +PKER_GWETH( 17, 32) = 0.900064E+00 +PKER_GWETH( 17, 33) = 0.903847E+00 +PKER_GWETH( 17, 34) = 0.907059E+00 +PKER_GWETH( 17, 35) = 0.909788E+00 +PKER_GWETH( 17, 36) = 0.912108E+00 +PKER_GWETH( 17, 37) = 0.914081E+00 +PKER_GWETH( 17, 38) = 0.915761E+00 +PKER_GWETH( 17, 39) = 0.917191E+00 +PKER_GWETH( 17, 40) = 0.918409E+00 +PKER_GWETH( 18, 1) = 0.327670E+01 +PKER_GWETH( 18, 2) = 0.269659E+01 +PKER_GWETH( 18, 3) = 0.219947E+01 +PKER_GWETH( 18, 4) = 0.177340E+01 +PKER_GWETH( 18, 5) = 0.140838E+01 +PKER_GWETH( 18, 6) = 0.109640E+01 +PKER_GWETH( 18, 7) = 0.831787E+00 +PKER_GWETH( 18, 8) = 0.611835E+00 +PKER_GWETH( 18, 9) = 0.437396E+00 +PKER_GWETH( 18, 10) = 0.312131E+00 +PKER_GWETH( 18, 11) = 0.239703E+00 +PKER_GWETH( 18, 12) = 0.219181E+00 +PKER_GWETH( 18, 13) = 0.241879E+00 +PKER_GWETH( 18, 14) = 0.292751E+00 +PKER_GWETH( 18, 15) = 0.355792E+00 +PKER_GWETH( 18, 16) = 0.419256E+00 +PKER_GWETH( 18, 17) = 0.477033E+00 +PKER_GWETH( 18, 18) = 0.527174E+00 +PKER_GWETH( 18, 19) = 0.569783E+00 +PKER_GWETH( 18, 20) = 0.605675E+00 +PKER_GWETH( 18, 21) = 0.635795E+00 +PKER_GWETH( 18, 22) = 0.661029E+00 +PKER_GWETH( 18, 23) = 0.682164E+00 +PKER_GWETH( 18, 24) = 0.699872E+00 +PKER_GWETH( 18, 25) = 0.714724E+00 +PKER_GWETH( 18, 26) = 0.727195E+00 +PKER_GWETH( 18, 27) = 0.737684E+00 +PKER_GWETH( 18, 28) = 0.746517E+00 +PKER_GWETH( 18, 29) = 0.753968E+00 +PKER_GWETH( 18, 30) = 0.760260E+00 +PKER_GWETH( 18, 31) = 0.765581E+00 +PKER_GWETH( 18, 32) = 0.770086E+00 +PKER_GWETH( 18, 33) = 0.773904E+00 +PKER_GWETH( 18, 34) = 0.777142E+00 +PKER_GWETH( 18, 35) = 0.779891E+00 +PKER_GWETH( 18, 36) = 0.782227E+00 +PKER_GWETH( 18, 37) = 0.784213E+00 +PKER_GWETH( 18, 38) = 0.785902E+00 +PKER_GWETH( 18, 39) = 0.787339E+00 +PKER_GWETH( 18, 40) = 0.788563E+00 +PKER_GWETH( 19, 1) = 0.338040E+01 +PKER_GWETH( 19, 2) = 0.280098E+01 +PKER_GWETH( 19, 3) = 0.230458E+01 +PKER_GWETH( 19, 4) = 0.187921E+01 +PKER_GWETH( 19, 5) = 0.151464E+01 +PKER_GWETH( 19, 6) = 0.120232E+01 +PKER_GWETH( 19, 7) = 0.935412E+00 +PKER_GWETH( 19, 8) = 0.709100E+00 +PKER_GWETH( 19, 9) = 0.521170E+00 +PKER_GWETH( 19, 10) = 0.372366E+00 +PKER_GWETH( 19, 11) = 0.265933E+00 +PKER_GWETH( 19, 12) = 0.204940E+00 +PKER_GWETH( 19, 13) = 0.188413E+00 +PKER_GWETH( 19, 14) = 0.208761E+00 +PKER_GWETH( 19, 15) = 0.252933E+00 +PKER_GWETH( 19, 16) = 0.307238E+00 +PKER_GWETH( 19, 17) = 0.361714E+00 +PKER_GWETH( 19, 18) = 0.411229E+00 +PKER_GWETH( 19, 19) = 0.454172E+00 +PKER_GWETH( 19, 20) = 0.490657E+00 +PKER_GWETH( 19, 21) = 0.521389E+00 +PKER_GWETH( 19, 22) = 0.547179E+00 +PKER_GWETH( 19, 23) = 0.568786E+00 +PKER_GWETH( 19, 24) = 0.586882E+00 +PKER_GWETH( 19, 25) = 0.602044E+00 +PKER_GWETH( 19, 26) = 0.614761E+00 +PKER_GWETH( 19, 27) = 0.625439E+00 +PKER_GWETH( 19, 28) = 0.634419E+00 +PKER_GWETH( 19, 29) = 0.641982E+00 +PKER_GWETH( 19, 30) = 0.648360E+00 +PKER_GWETH( 19, 31) = 0.653747E+00 +PKER_GWETH( 19, 32) = 0.658302E+00 +PKER_GWETH( 19, 33) = 0.662158E+00 +PKER_GWETH( 19, 34) = 0.665426E+00 +PKER_GWETH( 19, 35) = 0.668199E+00 +PKER_GWETH( 19, 36) = 0.670552E+00 +PKER_GWETH( 19, 37) = 0.672551E+00 +PKER_GWETH( 19, 38) = 0.674251E+00 +PKER_GWETH( 19, 39) = 0.675696E+00 +PKER_GWETH( 19, 40) = 0.676927E+00 +PKER_GWETH( 20, 1) = 0.346899E+01 +PKER_GWETH( 20, 2) = 0.289011E+01 +PKER_GWETH( 20, 3) = 0.239431E+01 +PKER_GWETH( 20, 4) = 0.196955E+01 +PKER_GWETH( 20, 5) = 0.160557E+01 +PKER_GWETH( 20, 6) = 0.129362E+01 +PKER_GWETH( 20, 7) = 0.102639E+01 +PKER_GWETH( 20, 8) = 0.798045E+00 +PKER_GWETH( 20, 9) = 0.604502E+00 +PKER_GWETH( 20, 10) = 0.443925E+00 +PKER_GWETH( 20, 11) = 0.317014E+00 +PKER_GWETH( 20, 12) = 0.226583E+00 +PKER_GWETH( 20, 13) = 0.175230E+00 +PKER_GWETH( 20, 14) = 0.161988E+00 +PKER_GWETH( 20, 15) = 0.180189E+00 +PKER_GWETH( 20, 16) = 0.218528E+00 +PKER_GWETH( 20, 17) = 0.265303E+00 +PKER_GWETH( 20, 18) = 0.312063E+00 +PKER_GWETH( 20, 19) = 0.354496E+00 +PKER_GWETH( 20, 20) = 0.391273E+00 +PKER_GWETH( 20, 21) = 0.422515E+00 +PKER_GWETH( 20, 22) = 0.448829E+00 +PKER_GWETH( 20, 23) = 0.470911E+00 +PKER_GWETH( 20, 24) = 0.489412E+00 +PKER_GWETH( 20, 25) = 0.504907E+00 +PKER_GWETH( 20, 26) = 0.517890E+00 +PKER_GWETH( 20, 27) = 0.528777E+00 +PKER_GWETH( 20, 28) = 0.537920E+00 +PKER_GWETH( 20, 29) = 0.545608E+00 +PKER_GWETH( 20, 30) = 0.552083E+00 +PKER_GWETH( 20, 31) = 0.557544E+00 +PKER_GWETH( 20, 32) = 0.562156E+00 +PKER_GWETH( 20, 33) = 0.566055E+00 +PKER_GWETH( 20, 34) = 0.569357E+00 +PKER_GWETH( 20, 35) = 0.572154E+00 +PKER_GWETH( 20, 36) = 0.574527E+00 +PKER_GWETH( 20, 37) = 0.576541E+00 +PKER_GWETH( 20, 38) = 0.578253E+00 +PKER_GWETH( 20, 39) = 0.579707E+00 +PKER_GWETH( 20, 40) = 0.580945E+00 +PKER_GWETH( 21, 1) = 0.354473E+01 +PKER_GWETH( 21, 2) = 0.296625E+01 +PKER_GWETH( 21, 3) = 0.247091E+01 +PKER_GWETH( 21, 4) = 0.204667E+01 +PKER_GWETH( 21, 5) = 0.168322E+01 +PKER_GWETH( 21, 6) = 0.137177E+01 +PKER_GWETH( 21, 7) = 0.110484E+01 +PKER_GWETH( 21, 8) = 0.876190E+00 +PKER_GWETH( 21, 9) = 0.680837E+00 +PKER_GWETH( 21, 10) = 0.515324E+00 +PKER_GWETH( 21, 11) = 0.378113E+00 +PKER_GWETH( 21, 12) = 0.269896E+00 +PKER_GWETH( 21, 13) = 0.193066E+00 +PKER_GWETH( 21, 14) = 0.149847E+00 +PKER_GWETH( 21, 15) = 0.139314E+00 +PKER_GWETH( 21, 16) = 0.155539E+00 +PKER_GWETH( 21, 17) = 0.188802E+00 +PKER_GWETH( 21, 18) = 0.229088E+00 +PKER_GWETH( 21, 19) = 0.269221E+00 +PKER_GWETH( 21, 20) = 0.305584E+00 +PKER_GWETH( 21, 21) = 0.337081E+00 +PKER_GWETH( 21, 22) = 0.363833E+00 +PKER_GWETH( 21, 23) = 0.386364E+00 +PKER_GWETH( 21, 24) = 0.405272E+00 +PKER_GWETH( 21, 25) = 0.421113E+00 +PKER_GWETH( 21, 26) = 0.434381E+00 +PKER_GWETH( 21, 27) = 0.445497E+00 +PKER_GWETH( 21, 28) = 0.454819E+00 +PKER_GWETH( 21, 29) = 0.462647E+00 +PKER_GWETH( 21, 30) = 0.469230E+00 +PKER_GWETH( 21, 31) = 0.474773E+00 +PKER_GWETH( 21, 32) = 0.479448E+00 +PKER_GWETH( 21, 33) = 0.483396E+00 +PKER_GWETH( 21, 34) = 0.486735E+00 +PKER_GWETH( 21, 35) = 0.489561E+00 +PKER_GWETH( 21, 36) = 0.491955E+00 +PKER_GWETH( 21, 37) = 0.493987E+00 +PKER_GWETH( 21, 38) = 0.495711E+00 +PKER_GWETH( 21, 39) = 0.497176E+00 +PKER_GWETH( 21, 40) = 0.498421E+00 +PKER_GWETH( 22, 1) = 0.360950E+01 +PKER_GWETH( 22, 2) = 0.303135E+01 +PKER_GWETH( 22, 3) = 0.253636E+01 +PKER_GWETH( 22, 4) = 0.211251E+01 +PKER_GWETH( 22, 5) = 0.174949E+01 +PKER_GWETH( 22, 6) = 0.143850E+01 +PKER_GWETH( 22, 7) = 0.117200E+01 +PKER_GWETH( 22, 8) = 0.943598E+00 +PKER_GWETH( 22, 9) = 0.747958E+00 +PKER_GWETH( 22, 10) = 0.580832E+00 +PKER_GWETH( 22, 11) = 0.439289E+00 +PKER_GWETH( 22, 12) = 0.322049E+00 +PKER_GWETH( 22, 13) = 0.229775E+00 +PKER_GWETH( 22, 14) = 0.164515E+00 +PKER_GWETH( 22, 15) = 0.128163E+00 +PKER_GWETH( 22, 16) = 0.119816E+00 +PKER_GWETH( 22, 17) = 0.134267E+00 +PKER_GWETH( 22, 18) = 0.163121E+00 +PKER_GWETH( 22, 19) = 0.197811E+00 +PKER_GWETH( 22, 20) = 0.232255E+00 +PKER_GWETH( 22, 21) = 0.263416E+00 +PKER_GWETH( 22, 22) = 0.290391E+00 +PKER_GWETH( 22, 23) = 0.313297E+00 +PKER_GWETH( 22, 24) = 0.332590E+00 +PKER_GWETH( 22, 25) = 0.348779E+00 +PKER_GWETH( 22, 26) = 0.362344E+00 +PKER_GWETH( 22, 27) = 0.373704E+00 +PKER_GWETH( 22, 28) = 0.383222E+00 +PKER_GWETH( 22, 29) = 0.391204E+00 +PKER_GWETH( 22, 30) = 0.397906E+00 +PKER_GWETH( 22, 31) = 0.403542E+00 +PKER_GWETH( 22, 32) = 0.408288E+00 +PKER_GWETH( 22, 33) = 0.412291E+00 +PKER_GWETH( 22, 34) = 0.415671E+00 +PKER_GWETH( 22, 35) = 0.418529E+00 +PKER_GWETH( 22, 36) = 0.420948E+00 +PKER_GWETH( 22, 37) = 0.422998E+00 +PKER_GWETH( 22, 38) = 0.424737E+00 +PKER_GWETH( 22, 39) = 0.426213E+00 +PKER_GWETH( 22, 40) = 0.427466E+00 +PKER_GWETH( 23, 1) = 0.366493E+01 +PKER_GWETH( 23, 2) = 0.308702E+01 +PKER_GWETH( 23, 3) = 0.259231E+01 +PKER_GWETH( 23, 4) = 0.216876E+01 +PKER_GWETH( 23, 5) = 0.180608E+01 +PKER_GWETH( 23, 6) = 0.149546E+01 +PKER_GWETH( 23, 7) = 0.122935E+01 +PKER_GWETH( 23, 8) = 0.100131E+01 +PKER_GWETH( 23, 9) = 0.805877E+00 +PKER_GWETH( 23, 10) = 0.638482E+00 +PKER_GWETH( 23, 11) = 0.495507E+00 +PKER_GWETH( 23, 12) = 0.374461E+00 +PKER_GWETH( 23, 13) = 0.274294E+00 +PKER_GWETH( 23, 14) = 0.195610E+00 +PKER_GWETH( 23, 15) = 0.140194E+00 +PKER_GWETH( 23, 16) = 0.109633E+00 +PKER_GWETH( 23, 17) = 0.103053E+00 +PKER_GWETH( 23, 18) = 0.115911E+00 +PKER_GWETH( 23, 19) = 0.140932E+00 +PKER_GWETH( 23, 20) = 0.170802E+00 +PKER_GWETH( 23, 21) = 0.200361E+00 +PKER_GWETH( 23, 22) = 0.227063E+00 +PKER_GWETH( 23, 23) = 0.250165E+00 +PKER_GWETH( 23, 24) = 0.269779E+00 +PKER_GWETH( 23, 25) = 0.286298E+00 +PKER_GWETH( 23, 26) = 0.300160E+00 +PKER_GWETH( 23, 27) = 0.311775E+00 +PKER_GWETH( 23, 28) = 0.321502E+00 +PKER_GWETH( 23, 29) = 0.329651E+00 +PKER_GWETH( 23, 30) = 0.336486E+00 +PKER_GWETH( 23, 31) = 0.342224E+00 +PKER_GWETH( 23, 32) = 0.347050E+00 +PKER_GWETH( 23, 33) = 0.351113E+00 +PKER_GWETH( 23, 34) = 0.354540E+00 +PKER_GWETH( 23, 35) = 0.357434E+00 +PKER_GWETH( 23, 36) = 0.359880E+00 +PKER_GWETH( 23, 37) = 0.361951E+00 +PKER_GWETH( 23, 38) = 0.363706E+00 +PKER_GWETH( 23, 39) = 0.365194E+00 +PKER_GWETH( 23, 40) = 0.366458E+00 +PKER_GWETH( 24, 1) = 0.371238E+01 +PKER_GWETH( 24, 2) = 0.313467E+01 +PKER_GWETH( 24, 3) = 0.264017E+01 +PKER_GWETH( 24, 4) = 0.221685E+01 +PKER_GWETH( 24, 5) = 0.185444E+01 +PKER_GWETH( 24, 6) = 0.154410E+01 +PKER_GWETH( 24, 7) = 0.127831E+01 +PKER_GWETH( 24, 8) = 0.105060E+01 +PKER_GWETH( 24, 9) = 0.855474E+00 +PKER_GWETH( 24, 10) = 0.688249E+00 +PKER_GWETH( 24, 11) = 0.545022E+00 +PKER_GWETH( 24, 12) = 0.422707E+00 +PKER_GWETH( 24, 13) = 0.319192E+00 +PKER_GWETH( 24, 14) = 0.233616E+00 +PKER_GWETH( 24, 15) = 0.166516E+00 +PKER_GWETH( 24, 16) = 0.119479E+00 +PKER_GWETH( 24, 17) = 0.937955E-01 +PKER_GWETH( 24, 18) = 0.886577E-01 +PKER_GWETH( 24, 19) = 0.100071E+00 +PKER_GWETH( 24, 20) = 0.121762E+00 +PKER_GWETH( 24, 21) = 0.147476E+00 +PKER_GWETH( 24, 22) = 0.172842E+00 +PKER_GWETH( 24, 23) = 0.195723E+00 +PKER_GWETH( 24, 24) = 0.215508E+00 +PKER_GWETH( 24, 25) = 0.232302E+00 +PKER_GWETH( 24, 26) = 0.246447E+00 +PKER_GWETH( 24, 27) = 0.258317E+00 +PKER_GWETH( 24, 28) = 0.268262E+00 +PKER_GWETH( 24, 29) = 0.276591E+00 +PKER_GWETH( 24, 30) = 0.283569E+00 +PKER_GWETH( 24, 31) = 0.289421E+00 +PKER_GWETH( 24, 32) = 0.294334E+00 +PKER_GWETH( 24, 33) = 0.298465E+00 +PKER_GWETH( 24, 34) = 0.301944E+00 +PKER_GWETH( 24, 35) = 0.304878E+00 +PKER_GWETH( 24, 36) = 0.307355E+00 +PKER_GWETH( 24, 37) = 0.309450E+00 +PKER_GWETH( 24, 38) = 0.311223E+00 +PKER_GWETH( 24, 39) = 0.312725E+00 +PKER_GWETH( 24, 40) = 0.313999E+00 +PKER_GWETH( 25, 1) = 0.375303E+01 +PKER_GWETH( 25, 2) = 0.317546E+01 +PKER_GWETH( 25, 3) = 0.268112E+01 +PKER_GWETH( 25, 4) = 0.225799E+01 +PKER_GWETH( 25, 5) = 0.189577E+01 +PKER_GWETH( 25, 6) = 0.158566E+01 +PKER_GWETH( 25, 7) = 0.132011E+01 +PKER_GWETH( 25, 8) = 0.109268E+01 +PKER_GWETH( 25, 9) = 0.897836E+00 +PKER_GWETH( 25, 10) = 0.730871E+00 +PKER_GWETH( 25, 11) = 0.587782E+00 +PKER_GWETH( 25, 12) = 0.465234E+00 +PKER_GWETH( 25, 13) = 0.360595E+00 +PKER_GWETH( 25, 14) = 0.272075E+00 +PKER_GWETH( 25, 15) = 0.198965E+00 +PKER_GWETH( 25, 16) = 0.141750E+00 +PKER_GWETH( 25, 17) = 0.101826E+00 +PKER_GWETH( 25, 18) = 0.802566E-01 +PKER_GWETH( 25, 19) = 0.762812E-01 +PKER_GWETH( 25, 20) = 0.864000E-01 +PKER_GWETH( 25, 21) = 0.105199E+00 +PKER_GWETH( 25, 22) = 0.127333E+00 +PKER_GWETH( 25, 23) = 0.149100E+00 +PKER_GWETH( 25, 24) = 0.168706E+00 +PKER_GWETH( 25, 25) = 0.185649E+00 +PKER_GWETH( 25, 26) = 0.200030E+00 +PKER_GWETH( 25, 27) = 0.212142E+00 +PKER_GWETH( 25, 28) = 0.222305E+00 +PKER_GWETH( 25, 29) = 0.230821E+00 +PKER_GWETH( 25, 30) = 0.237952E+00 +PKER_GWETH( 25, 31) = 0.243927E+00 +PKER_GWETH( 25, 32) = 0.248938E+00 +PKER_GWETH( 25, 33) = 0.253145E+00 +PKER_GWETH( 25, 34) = 0.256682E+00 +PKER_GWETH( 25, 35) = 0.259660E+00 +PKER_GWETH( 25, 36) = 0.262172E+00 +PKER_GWETH( 25, 37) = 0.264293E+00 +PKER_GWETH( 25, 38) = 0.266086E+00 +PKER_GWETH( 25, 39) = 0.267604E+00 +PKER_GWETH( 25, 40) = 0.268890E+00 +PKER_GWETH( 26, 1) = 0.378785E+01 +PKER_GWETH( 26, 2) = 0.321039E+01 +PKER_GWETH( 26, 3) = 0.271618E+01 +PKER_GWETH( 26, 4) = 0.229319E+01 +PKER_GWETH( 26, 5) = 0.193113E+01 +PKER_GWETH( 26, 6) = 0.162119E+01 +PKER_GWETH( 26, 7) = 0.135583E+01 +PKER_GWETH( 26, 8) = 0.112861E+01 +PKER_GWETH( 26, 9) = 0.934001E+00 +PKER_GWETH( 26, 10) = 0.767278E+00 +PKER_GWETH( 26, 11) = 0.624411E+00 +PKER_GWETH( 26, 12) = 0.501975E+00 +PKER_GWETH( 26, 13) = 0.397120E+00 +PKER_GWETH( 26, 14) = 0.307602E+00 +PKER_GWETH( 26, 15) = 0.231908E+00 +PKER_GWETH( 26, 16) = 0.169451E+00 +PKER_GWETH( 26, 17) = 0.120682E+00 +PKER_GWETH( 26, 18) = 0.867919E-01 +PKER_GWETH( 26, 19) = 0.686817E-01 +PKER_GWETH( 26, 20) = 0.656399E-01 +PKER_GWETH( 26, 21) = 0.746001E-01 +PKER_GWETH( 26, 22) = 0.908895E-01 +PKER_GWETH( 26, 23) = 0.109940E+00 +PKER_GWETH( 26, 24) = 0.128616E+00 +PKER_GWETH( 26, 25) = 0.145415E+00 +PKER_GWETH( 26, 26) = 0.159926E+00 +PKER_GWETH( 26, 27) = 0.172240E+00 +PKER_GWETH( 26, 28) = 0.182610E+00 +PKER_GWETH( 26, 29) = 0.191313E+00 +PKER_GWETH( 26, 30) = 0.198604E+00 +PKER_GWETH( 26, 31) = 0.204711E+00 +PKER_GWETH( 26, 32) = 0.209827E+00 +PKER_GWETH( 26, 33) = 0.214117E+00 +PKER_GWETH( 26, 34) = 0.217719E+00 +PKER_GWETH( 26, 35) = 0.220748E+00 +PKER_GWETH( 26, 36) = 0.223298E+00 +PKER_GWETH( 26, 37) = 0.225448E+00 +PKER_GWETH( 26, 38) = 0.227264E+00 +PKER_GWETH( 26, 39) = 0.228799E+00 +PKER_GWETH( 26, 40) = 0.230098E+00 +PKER_GWETH( 27, 1) = 0.381769E+01 +PKER_GWETH( 27, 2) = 0.324032E+01 +PKER_GWETH( 27, 3) = 0.274621E+01 +PKER_GWETH( 27, 4) = 0.232333E+01 +PKER_GWETH( 27, 5) = 0.196138E+01 +PKER_GWETH( 27, 6) = 0.165158E+01 +PKER_GWETH( 27, 7) = 0.138637E+01 +PKER_GWETH( 27, 8) = 0.115931E+01 +PKER_GWETH( 27, 9) = 0.964884E+00 +PKER_GWETH( 27, 10) = 0.798361E+00 +PKER_GWETH( 27, 11) = 0.655701E+00 +PKER_GWETH( 27, 12) = 0.533453E+00 +PKER_GWETH( 27, 13) = 0.428689E+00 +PKER_GWETH( 27, 14) = 0.338973E+00 +PKER_GWETH( 27, 15) = 0.262392E+00 +PKER_GWETH( 27, 16) = 0.197665E+00 +PKER_GWETH( 27, 17) = 0.144311E+00 +PKER_GWETH( 27, 18) = 0.102745E+00 +PKER_GWETH( 27, 19) = 0.739790E-01 +PKER_GWETH( 27, 20) = 0.587853E-01 +PKER_GWETH( 27, 21) = 0.564914E-01 +PKER_GWETH( 27, 22) = 0.644148E-01 +PKER_GWETH( 27, 23) = 0.785256E-01 +PKER_GWETH( 27, 24) = 0.949195E-01 +PKER_GWETH( 27, 25) = 0.110944E+00 +PKER_GWETH( 27, 26) = 0.125338E+00 +PKER_GWETH( 27, 27) = 0.137765E+00 +PKER_GWETH( 27, 28) = 0.148309E+00 +PKER_GWETH( 27, 29) = 0.157189E+00 +PKER_GWETH( 27, 30) = 0.164640E+00 +PKER_GWETH( 27, 31) = 0.170884E+00 +PKER_GWETH( 27, 32) = 0.176113E+00 +PKER_GWETH( 27, 33) = 0.180493E+00 +PKER_GWETH( 27, 34) = 0.184167E+00 +PKER_GWETH( 27, 35) = 0.187251E+00 +PKER_GWETH( 27, 36) = 0.189844E+00 +PKER_GWETH( 27, 37) = 0.192027E+00 +PKER_GWETH( 27, 38) = 0.193868E+00 +PKER_GWETH( 27, 39) = 0.195422E+00 +PKER_GWETH( 27, 40) = 0.196736E+00 +PKER_GWETH( 28, 1) = 0.384328E+01 +PKER_GWETH( 28, 2) = 0.326598E+01 +PKER_GWETH( 28, 3) = 0.277194E+01 +PKER_GWETH( 28, 4) = 0.234914E+01 +PKER_GWETH( 28, 5) = 0.198729E+01 +PKER_GWETH( 28, 6) = 0.167758E+01 +PKER_GWETH( 28, 7) = 0.141249E+01 +PKER_GWETH( 28, 8) = 0.118556E+01 +PKER_GWETH( 28, 9) = 0.991272E+00 +PKER_GWETH( 28, 10) = 0.824905E+00 +PKER_GWETH( 28, 11) = 0.682416E+00 +PKER_GWETH( 28, 12) = 0.560344E+00 +PKER_GWETH( 28, 13) = 0.455740E+00 +PKER_GWETH( 28, 14) = 0.366097E+00 +PKER_GWETH( 28, 15) = 0.289336E+00 +PKER_GWETH( 28, 16) = 0.223823E+00 +PKER_GWETH( 28, 17) = 0.168475E+00 +PKER_GWETH( 28, 18) = 0.122898E+00 +PKER_GWETH( 28, 19) = 0.874697E-01 +PKER_GWETH( 28, 20) = 0.630639E-01 +PKER_GWETH( 28, 21) = 0.503212E-01 +PKER_GWETH( 28, 22) = 0.486243E-01 +PKER_GWETH( 28, 23) = 0.556229E-01 +PKER_GWETH( 28, 24) = 0.678429E-01 +PKER_GWETH( 28, 25) = 0.819496E-01 +PKER_GWETH( 28, 26) = 0.956978E-01 +PKER_GWETH( 28, 27) = 0.108031E+00 +PKER_GWETH( 28, 28) = 0.118673E+00 +PKER_GWETH( 28, 29) = 0.127702E+00 +PKER_GWETH( 28, 30) = 0.135305E+00 +PKER_GWETH( 28, 31) = 0.141686E+00 +PKER_GWETH( 28, 32) = 0.147032E+00 +PKER_GWETH( 28, 33) = 0.151509E+00 +PKER_GWETH( 28, 34) = 0.155260E+00 +PKER_GWETH( 28, 35) = 0.158405E+00 +PKER_GWETH( 28, 36) = 0.161046E+00 +PKER_GWETH( 28, 37) = 0.163266E+00 +PKER_GWETH( 28, 38) = 0.165135E+00 +PKER_GWETH( 28, 39) = 0.166711E+00 +PKER_GWETH( 28, 40) = 0.168042E+00 +PKER_GWETH( 29, 1) = 0.386522E+01 +PKER_GWETH( 29, 2) = 0.328797E+01 +PKER_GWETH( 29, 3) = 0.279399E+01 +PKER_GWETH( 29, 4) = 0.237126E+01 +PKER_GWETH( 29, 5) = 0.200948E+01 +PKER_GWETH( 29, 6) = 0.169985E+01 +PKER_GWETH( 29, 7) = 0.143485E+01 +PKER_GWETH( 29, 8) = 0.120801E+01 +PKER_GWETH( 29, 9) = 0.101383E+01 +PKER_GWETH( 29, 10) = 0.847587E+00 +PKER_GWETH( 29, 11) = 0.705230E+00 +PKER_GWETH( 29, 12) = 0.583305E+00 +PKER_GWETH( 29, 13) = 0.478852E+00 +PKER_GWETH( 29, 14) = 0.389344E+00 +PKER_GWETH( 29, 15) = 0.312641E+00 +PKER_GWETH( 29, 16) = 0.246962E+00 +PKER_GWETH( 29, 17) = 0.190919E+00 +PKER_GWETH( 29, 18) = 0.143591E+00 +PKER_GWETH( 29, 19) = 0.104661E+00 +PKER_GWETH( 29, 20) = 0.744639E-01 +PKER_GWETH( 29, 21) = 0.537613E-01 +PKER_GWETH( 29, 22) = 0.430826E-01 +PKER_GWETH( 29, 23) = 0.418582E-01 +PKER_GWETH( 29, 24) = 0.480333E-01 +PKER_GWETH( 29, 25) = 0.586131E-01 +PKER_GWETH( 29, 26) = 0.707504E-01 +PKER_GWETH( 29, 27) = 0.825451E-01 +PKER_GWETH( 29, 28) = 0.931120E-01 +PKER_GWETH( 29, 29) = 0.102226E+00 +PKER_GWETH( 29, 30) = 0.109957E+00 +PKER_GWETH( 29, 31) = 0.116467E+00 +PKER_GWETH( 29, 32) = 0.121931E+00 +PKER_GWETH( 29, 33) = 0.126508E+00 +PKER_GWETH( 29, 34) = 0.130342E+00 +PKER_GWETH( 29, 35) = 0.133554E+00 +PKER_GWETH( 29, 36) = 0.136247E+00 +PKER_GWETH( 29, 37) = 0.138508E+00 +PKER_GWETH( 29, 38) = 0.140409E+00 +PKER_GWETH( 29, 39) = 0.142009E+00 +PKER_GWETH( 29, 40) = 0.143358E+00 +PKER_GWETH( 30, 1) = 0.388404E+01 +PKER_GWETH( 30, 2) = 0.330683E+01 +PKER_GWETH( 30, 3) = 0.281290E+01 +PKER_GWETH( 30, 4) = 0.239021E+01 +PKER_GWETH( 30, 5) = 0.202849E+01 +PKER_GWETH( 30, 6) = 0.171892E+01 +PKER_GWETH( 30, 7) = 0.145399E+01 +PKER_GWETH( 30, 8) = 0.122723E+01 +PKER_GWETH( 30, 9) = 0.103313E+01 +PKER_GWETH( 30, 10) = 0.866978E+00 +PKER_GWETH( 30, 11) = 0.724725E+00 +PKER_GWETH( 30, 12) = 0.602915E+00 +PKER_GWETH( 30, 13) = 0.498586E+00 +PKER_GWETH( 30, 14) = 0.409208E+00 +PKER_GWETH( 30, 15) = 0.332618E+00 +PKER_GWETH( 30, 16) = 0.266986E+00 +PKER_GWETH( 30, 17) = 0.210791E+00 +PKER_GWETH( 30, 18) = 0.162848E+00 +PKER_GWETH( 30, 19) = 0.122380E+00 +PKER_GWETH( 30, 20) = 0.891272E-01 +PKER_GWETH( 30, 21) = 0.633929E-01 +PKER_GWETH( 30, 22) = 0.458362E-01 +PKER_GWETH( 30, 23) = 0.368911E-01 +PKER_GWETH( 30, 24) = 0.360374E-01 +PKER_GWETH( 30, 25) = 0.414816E-01 +PKER_GWETH( 30, 26) = 0.506386E-01 +PKER_GWETH( 30, 27) = 0.610806E-01 +PKER_GWETH( 30, 28) = 0.711985E-01 +PKER_GWETH( 30, 29) = 0.802521E-01 +PKER_GWETH( 30, 30) = 0.880569E-01 +PKER_GWETH( 30, 31) = 0.946768E-01 +PKER_GWETH( 30, 32) = 0.100251E+00 +PKER_GWETH( 30, 33) = 0.104929E+00 +PKER_GWETH( 30, 34) = 0.108849E+00 +PKER_GWETH( 30, 35) = 0.112132E+00 +PKER_GWETH( 30, 36) = 0.114882E+00 +PKER_GWETH( 30, 37) = 0.117188E+00 +PKER_GWETH( 30, 38) = 0.119124E+00 +PKER_GWETH( 30, 39) = 0.120751E+00 +PKER_GWETH( 30, 40) = 0.122121E+00 +PKER_GWETH( 31, 1) = 0.390018E+01 +PKER_GWETH( 31, 2) = 0.332301E+01 +PKER_GWETH( 31, 3) = 0.282911E+01 +PKER_GWETH( 31, 4) = 0.240646E+01 +PKER_GWETH( 31, 5) = 0.204478E+01 +PKER_GWETH( 31, 6) = 0.173527E+01 +PKER_GWETH( 31, 7) = 0.147038E+01 +PKER_GWETH( 31, 8) = 0.124368E+01 +PKER_GWETH( 31, 9) = 0.104965E+01 +PKER_GWETH( 31, 10) = 0.883566E+00 +PKER_GWETH( 31, 11) = 0.741393E+00 +PKER_GWETH( 31, 12) = 0.619671E+00 +PKER_GWETH( 31, 13) = 0.515440E+00 +PKER_GWETH( 31, 14) = 0.426169E+00 +PKER_GWETH( 31, 15) = 0.349690E+00 +PKER_GWETH( 31, 16) = 0.284154E+00 +PKER_GWETH( 31, 17) = 0.227995E+00 +PKER_GWETH( 31, 18) = 0.179915E+00 +PKER_GWETH( 31, 19) = 0.138901E+00 +PKER_GWETH( 31, 20) = 0.104299E+00 +PKER_GWETH( 31, 21) = 0.758983E-01 +PKER_GWETH( 31, 22) = 0.539690E-01 +PKER_GWETH( 31, 23) = 0.390809E-01 +PKER_GWETH( 31, 24) = 0.315930E-01 +PKER_GWETH( 31, 25) = 0.310308E-01 +PKER_GWETH( 31, 26) = 0.358252E-01 +PKER_GWETH( 31, 27) = 0.437487E-01 +PKER_GWETH( 31, 28) = 0.527309E-01 +PKER_GWETH( 31, 29) = 0.614103E-01 +PKER_GWETH( 31, 30) = 0.691670E-01 +PKER_GWETH( 31, 31) = 0.758509E-01 +PKER_GWETH( 31, 32) = 0.815193E-01 +PKER_GWETH( 31, 33) = 0.862925E-01 +PKER_GWETH( 31, 34) = 0.902983E-01 +PKER_GWETH( 31, 35) = 0.936547E-01 +PKER_GWETH( 31, 36) = 0.964655E-01 +PKER_GWETH( 31, 37) = 0.988203E-01 +PKER_GWETH( 31, 38) = 0.100795E+00 +PKER_GWETH( 31, 39) = 0.102452E+00 +PKER_GWETH( 31, 40) = 0.103846E+00 +PKER_GWETH( 32, 1) = 0.391403E+01 +PKER_GWETH( 32, 2) = 0.333689E+01 +PKER_GWETH( 32, 3) = 0.284302E+01 +PKER_GWETH( 32, 4) = 0.242040E+01 +PKER_GWETH( 32, 5) = 0.205875E+01 +PKER_GWETH( 32, 6) = 0.174927E+01 +PKER_GWETH( 32, 7) = 0.148443E+01 +PKER_GWETH( 32, 8) = 0.125777E+01 +PKER_GWETH( 32, 9) = 0.106379E+01 +PKER_GWETH( 32, 10) = 0.897764E+00 +PKER_GWETH( 32, 11) = 0.755651E+00 +PKER_GWETH( 32, 12) = 0.633997E+00 +PKER_GWETH( 32, 13) = 0.529842E+00 +PKER_GWETH( 32, 14) = 0.440655E+00 +PKER_GWETH( 32, 15) = 0.364268E+00 +PKER_GWETH( 32, 16) = 0.298826E+00 +PKER_GWETH( 32, 17) = 0.242749E+00 +PKER_GWETH( 32, 18) = 0.194696E+00 +PKER_GWETH( 32, 19) = 0.153558E+00 +PKER_GWETH( 32, 20) = 0.118474E+00 +PKER_GWETH( 32, 21) = 0.888878E-01 +PKER_GWETH( 32, 22) = 0.646314E-01 +PKER_GWETH( 32, 23) = 0.459466E-01 +PKER_GWETH( 32, 24) = 0.333243E-01 +PKER_GWETH( 32, 25) = 0.270613E-01 +PKER_GWETH( 32, 26) = 0.267227E-01 +PKER_GWETH( 32, 27) = 0.309414E-01 +PKER_GWETH( 32, 28) = 0.377959E-01 +PKER_GWETH( 32, 29) = 0.455211E-01 +PKER_GWETH( 32, 30) = 0.529666E-01 +PKER_GWETH( 32, 31) = 0.596121E-01 +PKER_GWETH( 32, 32) = 0.653361E-01 +PKER_GWETH( 32, 33) = 0.701897E-01 +PKER_GWETH( 32, 34) = 0.742768E-01 +PKER_GWETH( 32, 35) = 0.777069E-01 +PKER_GWETH( 32, 36) = 0.805809E-01 +PKER_GWETH( 32, 37) = 0.829877E-01 +PKER_GWETH( 32, 38) = 0.850040E-01 +PKER_GWETH( 32, 39) = 0.866946E-01 +PKER_GWETH( 32, 40) = 0.881139E-01 +PKER_GWETH( 33, 1) = 0.392592E+01 +PKER_GWETH( 33, 2) = 0.334880E+01 +PKER_GWETH( 33, 3) = 0.285495E+01 +PKER_GWETH( 33, 4) = 0.243235E+01 +PKER_GWETH( 33, 5) = 0.207073E+01 +PKER_GWETH( 33, 6) = 0.176128E+01 +PKER_GWETH( 33, 7) = 0.149647E+01 +PKER_GWETH( 33, 8) = 0.126985E+01 +PKER_GWETH( 33, 9) = 0.107590E+01 +PKER_GWETH( 33, 10) = 0.909920E+00 +PKER_GWETH( 33, 11) = 0.767855E+00 +PKER_GWETH( 33, 12) = 0.646253E+00 +PKER_GWETH( 33, 13) = 0.542157E+00 +PKER_GWETH( 33, 14) = 0.453034E+00 +PKER_GWETH( 33, 15) = 0.376719E+00 +PKER_GWETH( 33, 16) = 0.311356E+00 +PKER_GWETH( 33, 17) = 0.255359E+00 +PKER_GWETH( 33, 18) = 0.207375E+00 +PKER_GWETH( 33, 19) = 0.166259E+00 +PKER_GWETH( 33, 20) = 0.131060E+00 +PKER_GWETH( 33, 21) = 0.101048E+00 +PKER_GWETH( 33, 22) = 0.757518E-01 +PKER_GWETH( 33, 23) = 0.550354E-01 +PKER_GWETH( 33, 24) = 0.391173E-01 +PKER_GWETH( 33, 25) = 0.284177E-01 +PKER_GWETH( 33, 26) = 0.231819E-01 +PKER_GWETH( 33, 27) = 0.230157E-01 +PKER_GWETH( 33, 28) = 0.267246E-01 +PKER_GWETH( 33, 29) = 0.326527E-01 +PKER_GWETH( 33, 30) = 0.392968E-01 +PKER_GWETH( 33, 31) = 0.456828E-01 +PKER_GWETH( 33, 32) = 0.513763E-01 +PKER_GWETH( 33, 33) = 0.562781E-01 +PKER_GWETH( 33, 34) = 0.604341E-01 +PKER_GWETH( 33, 35) = 0.639338E-01 +PKER_GWETH( 33, 36) = 0.668709E-01 +PKER_GWETH( 33, 37) = 0.693318E-01 +PKER_GWETH( 33, 38) = 0.713927E-01 +PKER_GWETH( 33, 39) = 0.731192E-01 +PKER_GWETH( 33, 40) = 0.745668E-01 +PKER_GWETH( 34, 1) = 0.393613E+01 +PKER_GWETH( 34, 2) = 0.335902E+01 +PKER_GWETH( 34, 3) = 0.286518E+01 +PKER_GWETH( 34, 4) = 0.244261E+01 +PKER_GWETH( 34, 5) = 0.208101E+01 +PKER_GWETH( 34, 6) = 0.177158E+01 +PKER_GWETH( 34, 7) = 0.150679E+01 +PKER_GWETH( 34, 8) = 0.128020E+01 +PKER_GWETH( 34, 9) = 0.108628E+01 +PKER_GWETH( 34, 10) = 0.920332E+00 +PKER_GWETH( 34, 11) = 0.778304E+00 +PKER_GWETH( 34, 12) = 0.656742E+00 +PKER_GWETH( 34, 13) = 0.552691E+00 +PKER_GWETH( 34, 14) = 0.463618E+00 +PKER_GWETH( 34, 15) = 0.387358E+00 +PKER_GWETH( 34, 16) = 0.322057E+00 +PKER_GWETH( 34, 17) = 0.266128E+00 +PKER_GWETH( 34, 18) = 0.218213E+00 +PKER_GWETH( 34, 19) = 0.177154E+00 +PKER_GWETH( 34, 20) = 0.141973E+00 +PKER_GWETH( 34, 21) = 0.111857E+00 +PKER_GWETH( 34, 22) = 0.861834E-01 +PKER_GWETH( 34, 23) = 0.645549E-01 +PKER_GWETH( 34, 24) = 0.468637E-01 +PKER_GWETH( 34, 25) = 0.333029E-01 +PKER_GWETH( 34, 26) = 0.242359E-01 +PKER_GWETH( 34, 27) = 0.198623E-01 +PKER_GWETH( 34, 28) = 0.198248E-01 +PKER_GWETH( 34, 29) = 0.230830E-01 +PKER_GWETH( 34, 30) = 0.282089E-01 +PKER_GWETH( 34, 31) = 0.339228E-01 +PKER_GWETH( 34, 32) = 0.393998E-01 +PKER_GWETH( 34, 33) = 0.442776E-01 +PKER_GWETH( 34, 34) = 0.484753E-01 +PKER_GWETH( 34, 35) = 0.520340E-01 +PKER_GWETH( 34, 36) = 0.550307E-01 +PKER_GWETH( 34, 37) = 0.575456E-01 +PKER_GWETH( 34, 38) = 0.596528E-01 +PKER_GWETH( 34, 39) = 0.614176E-01 +PKER_GWETH( 34, 40) = 0.628959E-01 +PKER_GWETH( 35, 1) = 0.394489E+01 +PKER_GWETH( 35, 2) = 0.336779E+01 +PKER_GWETH( 35, 3) = 0.287397E+01 +PKER_GWETH( 35, 4) = 0.245141E+01 +PKER_GWETH( 35, 5) = 0.208983E+01 +PKER_GWETH( 35, 6) = 0.178041E+01 +PKER_GWETH( 35, 7) = 0.151564E+01 +PKER_GWETH( 35, 8) = 0.128907E+01 +PKER_GWETH( 35, 9) = 0.109518E+01 +PKER_GWETH( 35, 10) = 0.929255E+00 +PKER_GWETH( 35, 11) = 0.787254E+00 +PKER_GWETH( 35, 12) = 0.665724E+00 +PKER_GWETH( 35, 13) = 0.561707E+00 +PKER_GWETH( 35, 14) = 0.472673E+00 +PKER_GWETH( 35, 15) = 0.396456E+00 +PKER_GWETH( 35, 16) = 0.331202E+00 +PKER_GWETH( 35, 17) = 0.275326E+00 +PKER_GWETH( 35, 18) = 0.227468E+00 +PKER_GWETH( 35, 19) = 0.186468E+00 +PKER_GWETH( 35, 20) = 0.151336E+00 +PKER_GWETH( 35, 21) = 0.121232E+00 +PKER_GWETH( 35, 22) = 0.954658E-01 +PKER_GWETH( 35, 23) = 0.735038E-01 +PKER_GWETH( 35, 24) = 0.550122E-01 +PKER_GWETH( 35, 25) = 0.399049E-01 +PKER_GWETH( 35, 26) = 0.283536E-01 +PKER_GWETH( 35, 27) = 0.206713E-01 +PKER_GWETH( 35, 28) = 0.170206E-01 +PKER_GWETH( 35, 29) = 0.170782E-01 +PKER_GWETH( 35, 30) = 0.199378E-01 +PKER_GWETH( 35, 31) = 0.243699E-01 +PKER_GWETH( 35, 32) = 0.292827E-01 +PKER_GWETH( 35, 33) = 0.339802E-01 +PKER_GWETH( 35, 34) = 0.381591E-01 +PKER_GWETH( 35, 35) = 0.417538E-01 +PKER_GWETH( 35, 36) = 0.448011E-01 +PKER_GWETH( 35, 37) = 0.473670E-01 +PKER_GWETH( 35, 38) = 0.495205E-01 +PKER_GWETH( 35, 39) = 0.513249E-01 +PKER_GWETH( 35, 40) = 0.528360E-01 +PKER_GWETH( 36, 1) = 0.395241E+01 +PKER_GWETH( 36, 2) = 0.337532E+01 +PKER_GWETH( 36, 3) = 0.288151E+01 +PKER_GWETH( 36, 4) = 0.245896E+01 +PKER_GWETH( 36, 5) = 0.209739E+01 +PKER_GWETH( 36, 6) = 0.178799E+01 +PKER_GWETH( 36, 7) = 0.152324E+01 +PKER_GWETH( 36, 8) = 0.129668E+01 +PKER_GWETH( 36, 9) = 0.110281E+01 +PKER_GWETH( 36, 10) = 0.936903E+00 +PKER_GWETH( 36, 11) = 0.794924E+00 +PKER_GWETH( 36, 12) = 0.673418E+00 +PKER_GWETH( 36, 13) = 0.569428E+00 +PKER_GWETH( 36, 14) = 0.480423E+00 +PKER_GWETH( 36, 15) = 0.404239E+00 +PKER_GWETH( 36, 16) = 0.339022E+00 +PKER_GWETH( 36, 17) = 0.283186E+00 +PKER_GWETH( 36, 18) = 0.235374E+00 +PKER_GWETH( 36, 19) = 0.194423E+00 +PKER_GWETH( 36, 20) = 0.159341E+00 +PKER_GWETH( 36, 21) = 0.129279E+00 +PKER_GWETH( 36, 22) = 0.103521E+00 +PKER_GWETH( 36, 23) = 0.814749E-01 +PKER_GWETH( 36, 24) = 0.626882E-01 +PKER_GWETH( 36, 25) = 0.468787E-01 +PKER_GWETH( 36, 26) = 0.339780E-01 +PKER_GWETH( 36, 27) = 0.241398E-01 +PKER_GWETH( 36, 28) = 0.176327E-01 +PKER_GWETH( 36, 29) = 0.145874E-01 +PKER_GWETH( 36, 30) = 0.147147E-01 +PKER_GWETH( 36, 31) = 0.172211E-01 +PKER_GWETH( 36, 32) = 0.210528E-01 +PKER_GWETH( 36, 33) = 0.252768E-01 +PKER_GWETH( 36, 34) = 0.293056E-01 +PKER_GWETH( 36, 35) = 0.328855E-01 +PKER_GWETH( 36, 36) = 0.359639E-01 +PKER_GWETH( 36, 37) = 0.385732E-01 +PKER_GWETH( 36, 38) = 0.407703E-01 +PKER_GWETH( 36, 39) = 0.426143E-01 +PKER_GWETH( 36, 40) = 0.441594E-01 +PKER_GWETH( 37, 1) = 0.395887E+01 +PKER_GWETH( 37, 2) = 0.338179E+01 +PKER_GWETH( 37, 3) = 0.288799E+01 +PKER_GWETH( 37, 4) = 0.246545E+01 +PKER_GWETH( 37, 5) = 0.210388E+01 +PKER_GWETH( 37, 6) = 0.179450E+01 +PKER_GWETH( 37, 7) = 0.152975E+01 +PKER_GWETH( 37, 8) = 0.130321E+01 +PKER_GWETH( 37, 9) = 0.110935E+01 +PKER_GWETH( 37, 10) = 0.943460E+00 +PKER_GWETH( 37, 11) = 0.801498E+00 +PKER_GWETH( 37, 12) = 0.680011E+00 +PKER_GWETH( 37, 13) = 0.576041E+00 +PKER_GWETH( 37, 14) = 0.487060E+00 +PKER_GWETH( 37, 15) = 0.410901E+00 +PKER_GWETH( 37, 16) = 0.345712E+00 +PKER_GWETH( 37, 17) = 0.289908E+00 +PKER_GWETH( 37, 18) = 0.242130E+00 +PKER_GWETH( 37, 19) = 0.201218E+00 +PKER_GWETH( 37, 20) = 0.166178E+00 +PKER_GWETH( 37, 21) = 0.136159E+00 +PKER_GWETH( 37, 22) = 0.110436E+00 +PKER_GWETH( 37, 23) = 0.883954E-01 +PKER_GWETH( 37, 24) = 0.695332E-01 +PKER_GWETH( 37, 25) = 0.534630E-01 +PKER_GWETH( 37, 26) = 0.399468E-01 +PKER_GWETH( 37, 27) = 0.289314E-01 +PKER_GWETH( 37, 28) = 0.205525E-01 +PKER_GWETH( 37, 29) = 0.150421E-01 +PKER_GWETH( 37, 30) = 0.125040E-01 +PKER_GWETH( 37, 31) = 0.126787E-01 +PKER_GWETH( 37, 32) = 0.148743E-01 +PKER_GWETH( 37, 33) = 0.181871E-01 +PKER_GWETH( 37, 34) = 0.218185E-01 +PKER_GWETH( 37, 35) = 0.252735E-01 +PKER_GWETH( 37, 36) = 0.283403E-01 +PKER_GWETH( 37, 37) = 0.309765E-01 +PKER_GWETH( 37, 38) = 0.332107E-01 +PKER_GWETH( 37, 39) = 0.350921E-01 +PKER_GWETH( 37, 40) = 0.366711E-01 +PKER_GWETH( 38, 1) = 0.396441E+01 +PKER_GWETH( 38, 2) = 0.338734E+01 +PKER_GWETH( 38, 3) = 0.289354E+01 +PKER_GWETH( 38, 4) = 0.247101E+01 +PKER_GWETH( 38, 5) = 0.210946E+01 +PKER_GWETH( 38, 6) = 0.180008E+01 +PKER_GWETH( 38, 7) = 0.153534E+01 +PKER_GWETH( 38, 8) = 0.130881E+01 +PKER_GWETH( 38, 9) = 0.111496E+01 +PKER_GWETH( 38, 10) = 0.949083E+00 +PKER_GWETH( 38, 11) = 0.807135E+00 +PKER_GWETH( 38, 12) = 0.685662E+00 +PKER_GWETH( 38, 13) = 0.581708E+00 +PKER_GWETH( 38, 14) = 0.492744E+00 +PKER_GWETH( 38, 15) = 0.416605E+00 +PKER_GWETH( 38, 16) = 0.351438E+00 +PKER_GWETH( 38, 17) = 0.295658E+00 +PKER_GWETH( 38, 18) = 0.247908E+00 +PKER_GWETH( 38, 19) = 0.207026E+00 +PKER_GWETH( 38, 20) = 0.172018E+00 +PKER_GWETH( 38, 21) = 0.142035E+00 +PKER_GWETH( 38, 22) = 0.116348E+00 +PKER_GWETH( 38, 23) = 0.943377E-01 +PKER_GWETH( 38, 24) = 0.754790E-01 +PKER_GWETH( 38, 25) = 0.593406E-01 +PKER_GWETH( 38, 26) = 0.455943E-01 +PKER_GWETH( 38, 27) = 0.340390E-01 +PKER_GWETH( 38, 28) = 0.246337E-01 +PKER_GWETH( 38, 29) = 0.174989E-01 +PKER_GWETH( 38, 30) = 0.128332E-01 +PKER_GWETH( 38, 31) = 0.107204E-01 +PKER_GWETH( 38, 32) = 0.109262E-01 +PKER_GWETH( 38, 33) = 0.128475E-01 +PKER_GWETH( 38, 34) = 0.157112E-01 +PKER_GWETH( 38, 35) = 0.188328E-01 +PKER_GWETH( 38, 36) = 0.217958E-01 +PKER_GWETH( 38, 37) = 0.244229E-01 +PKER_GWETH( 38, 38) = 0.266804E-01 +PKER_GWETH( 38, 39) = 0.285935E-01 +PKER_GWETH( 38, 40) = 0.302045E-01 +PKER_GWETH( 39, 1) = 0.396918E+01 +PKER_GWETH( 39, 2) = 0.339211E+01 +PKER_GWETH( 39, 3) = 0.289832E+01 +PKER_GWETH( 39, 4) = 0.247579E+01 +PKER_GWETH( 39, 5) = 0.211424E+01 +PKER_GWETH( 39, 6) = 0.180487E+01 +PKER_GWETH( 39, 7) = 0.154014E+01 +PKER_GWETH( 39, 8) = 0.131362E+01 +PKER_GWETH( 39, 9) = 0.111978E+01 +PKER_GWETH( 39, 10) = 0.953907E+00 +PKER_GWETH( 39, 11) = 0.811969E+00 +PKER_GWETH( 39, 12) = 0.690507E+00 +PKER_GWETH( 39, 13) = 0.586566E+00 +PKER_GWETH( 39, 14) = 0.497616E+00 +PKER_GWETH( 39, 15) = 0.421492E+00 +PKER_GWETH( 39, 16) = 0.356342E+00 +PKER_GWETH( 39, 17) = 0.300580E+00 +PKER_GWETH( 39, 18) = 0.252850E+00 +PKER_GWETH( 39, 19) = 0.211991E+00 +PKER_GWETH( 39, 20) = 0.177010E+00 +PKER_GWETH( 39, 21) = 0.147055E+00 +PKER_GWETH( 39, 22) = 0.121399E+00 +PKER_GWETH( 39, 23) = 0.994194E-01 +PKER_GWETH( 39, 24) = 0.805856E-01 +PKER_GWETH( 39, 25) = 0.644491E-01 +PKER_GWETH( 39, 26) = 0.506413E-01 +PKER_GWETH( 39, 27) = 0.388827E-01 +PKER_GWETH( 39, 28) = 0.290042E-01 +PKER_GWETH( 39, 29) = 0.209741E-01 +PKER_GWETH( 39, 30) = 0.148991E-01 +PKER_GWETH( 39, 31) = 0.109496E-01 +PKER_GWETH( 39, 32) = 0.919163E-02 +PKER_GWETH( 39, 33) = 0.941674E-02 +PKER_GWETH( 39, 34) = 0.110979E-01 +PKER_GWETH( 39, 35) = 0.135723E-01 +PKER_GWETH( 39, 36) = 0.162554E-01 +PKER_GWETH( 39, 37) = 0.187961E-01 +PKER_GWETH( 39, 38) = 0.210466E-01 +PKER_GWETH( 39, 39) = 0.229798E-01 +PKER_GWETH( 39, 40) = 0.246180E-01 +PKER_GWETH( 40, 1) = 0.397327E+01 +PKER_GWETH( 40, 2) = 0.339620E+01 +PKER_GWETH( 40, 3) = 0.290242E+01 +PKER_GWETH( 40, 4) = 0.247989E+01 +PKER_GWETH( 40, 5) = 0.211835E+01 +PKER_GWETH( 40, 6) = 0.180898E+01 +PKER_GWETH( 40, 7) = 0.154426E+01 +PKER_GWETH( 40, 8) = 0.131774E+01 +PKER_GWETH( 40, 9) = 0.112391E+01 +PKER_GWETH( 40, 10) = 0.958046E+00 +PKER_GWETH( 40, 11) = 0.816115E+00 +PKER_GWETH( 40, 12) = 0.694662E+00 +PKER_GWETH( 40, 13) = 0.590731E+00 +PKER_GWETH( 40, 14) = 0.501791E+00 +PKER_GWETH( 40, 15) = 0.425679E+00 +PKER_GWETH( 40, 16) = 0.360542E+00 +PKER_GWETH( 40, 17) = 0.304795E+00 +PKER_GWETH( 40, 18) = 0.257081E+00 +PKER_GWETH( 40, 19) = 0.216240E+00 +PKER_GWETH( 40, 20) = 0.181278E+00 +PKER_GWETH( 40, 21) = 0.151345E+00 +PKER_GWETH( 40, 22) = 0.125714E+00 +PKER_GWETH( 40, 23) = 0.103760E+00 +PKER_GWETH( 40, 24) = 0.849530E-01 +PKER_GWETH( 40, 25) = 0.688374E-01 +PKER_GWETH( 40, 26) = 0.550302E-01 +PKER_GWETH( 40, 27) = 0.432166E-01 +PKER_GWETH( 40, 28) = 0.331585E-01 +PKER_GWETH( 40, 29) = 0.247136E-01 +PKER_GWETH( 40, 30) = 0.178579E-01 +PKER_GWETH( 40, 31) = 0.126858E-01 +PKER_GWETH( 40, 32) = 0.934299E-02 +PKER_GWETH( 40, 33) = 0.788297E-02 +PKER_GWETH( 40, 34) = 0.811672E-02 +PKER_GWETH( 40, 35) = 0.958788E-02 +PKER_GWETH( 40, 36) = 0.117243E-01 +PKER_GWETH( 40, 37) = 0.140303E-01 +PKER_GWETH( 40, 38) = 0.162089E-01 +PKER_GWETH( 40, 39) = 0.181368E-01 +PKER_GWETH( 40, 40) = 0.197923E-01 +END IF +! +END SUBROUTINE LIMA_READ_XKER_GWETH diff --git a/src/mesonh/micro/lima_read_xker_raccs.f90 b/src/mesonh/micro/lima_read_xker_raccs.f90 new file mode 100644 index 000000000..d29ce6cb2 --- /dev/null +++ b/src/mesonh/micro/lima_read_xker_raccs.f90 @@ -0,0 +1,4951 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 init 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ########################### + MODULE MODI_LIMA_READ_XKER_RACCS +! ########################### +! +INTERFACE + SUBROUTINE LIMA_READ_XKER_RACCS (KACCLBDAS,KACCLBDAR,KND, & + PALPHAS,PNUS,PALPHAR,PNUR,PESR,PBS,PBR,PCS,PDS,PCR,PDR, & + PACCLBDAS_MAX,PACCLBDAR_MAX,PACCLBDAS_MIN,PACCLBDAR_MIN, & + PFDINFTY,PKER_RACCSS,PKER_RACCS,PKER_SACCRG ) +! +INTEGER, INTENT(OUT) :: KND,KACCLBDAS,KACCLBDAR +REAL, INTENT(OUT) :: PALPHAS +REAL, INTENT(OUT) :: PNUS +REAL, INTENT(OUT) :: PALPHAR +REAL, INTENT(OUT) :: PNUR +REAL, INTENT(OUT) :: PESR +REAL, INTENT(OUT) :: PBS +REAL, INTENT(OUT) :: PBR +REAL, INTENT(OUT) :: PCS +REAL, INTENT(OUT) :: PDS +REAL, INTENT(OUT) :: PCR +REAL, INTENT(OUT) :: PDR +REAL, INTENT(OUT) :: PACCLBDAS_MAX +REAL, INTENT(OUT) :: PACCLBDAR_MAX +REAL, INTENT(OUT) :: PACCLBDAS_MIN +REAL, INTENT(OUT) :: PACCLBDAR_MIN +REAL, INTENT(OUT) :: PFDINFTY +REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PKER_RACCSS +REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PKER_RACCS +REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PKER_SACCRG +! +END SUBROUTINE LIMA_READ_XKER_RACCS +! +END INTERFACE +! +END MODULE MODI_LIMA_READ_XKER_RACCS +! ########################################################################## + SUBROUTINE LIMA_READ_XKER_RACCS (KACCLBDAS,KACCLBDAR,KND, & + PALPHAS,PNUS,PALPHAR,PNUR,PESR,PBS,PBR,PCS,PDS,PCR,PDR, & + PACCLBDAS_MAX,PACCLBDAR_MAX,PACCLBDAS_MIN,PACCLBDAR_MIN, & + PFDINFTY,PKER_RACCSS,PKER_RACCS,PKER_SACCRG ) +! ########################################################################## +! +!!**** * * - initialize the kernels for the rain-snow accretion process +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to initialize the kernels PKER_RACCSS, +!! PKER_RACCS and PKER_SACCRG prepared from a previous run of the routine +!! INI_RAIN_ICE. The reading of the kernels is optional after checking for +!! the dimensions of the arrays. +!! +!!** METHOD +!! ------ +!! +!! +!! EXTERNAL +!! -------- +!! None +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! Book2 of documentation ( routine READ_XKER_RACCS ) +!! +!! AUTHOR +!! ------ +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original 09/04/96 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +!* 0.2 Declarations of local variables : +! +! +INTEGER, INTENT(OUT) :: KND,KACCLBDAS,KACCLBDAR +REAL, INTENT(OUT) :: PALPHAS +REAL, INTENT(OUT) :: PNUS +REAL, INTENT(OUT) :: PALPHAR +REAL, INTENT(OUT) :: PNUR +REAL, INTENT(OUT) :: PESR +REAL, INTENT(OUT) :: PBS +REAL, INTENT(OUT) :: PBR +REAL, INTENT(OUT) :: PCS +REAL, INTENT(OUT) :: PDS +REAL, INTENT(OUT) :: PCR +REAL, INTENT(OUT) :: PDR +REAL, INTENT(OUT) :: PACCLBDAS_MAX +REAL, INTENT(OUT) :: PACCLBDAR_MAX +REAL, INTENT(OUT) :: PACCLBDAS_MIN +REAL, INTENT(OUT) :: PACCLBDAR_MIN +REAL, INTENT(OUT) :: PFDINFTY +REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PKER_RACCSS +REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PKER_RACCS +REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PKER_SACCRG +! +! ################################################################### +! #INSERT HERE THE OUTPUT OF INI_RAIN_ICE IF THE KERNELS ARE UPDATED# +! ################################################################### +! +KND= 50 +KACCLBDAS= 40 +KACCLBDAR= 40 +PALPHAS= 0.100000E+01 +PNUS= 0.100000E+01 +PALPHAR= 0.100000E+01 +PNUR= 0.200000E+01 +PESR= 0.100000E+01 +PBS= 0.190000E+01 +PBR= 0.300000E+01 +PCS= 0.500000E+01 +PDS= 0.270000E+00 +PCR= 0.842000E+03 +PDR= 0.800000E+00 +PACCLBDAS_MAX= 0.500000E+06 +PACCLBDAR_MAX= 0.100000E+08 +PACCLBDAS_MIN= 0.500000E+02 +PACCLBDAR_MIN= 0.100000E+04 +PFDINFTY= 0.200000E+02 +! +IF( PRESENT(PKER_RACCSS) ) THEN + PKER_RACCSS( 1, 1) = 0.814109E+01 + PKER_RACCSS( 1, 2) = 0.692586E+01 + PKER_RACCSS( 1, 3) = 0.565192E+01 + PKER_RACCSS( 1, 4) = 0.444434E+01 + PKER_RACCSS( 1, 5) = 0.337172E+01 + PKER_RACCSS( 1, 6) = 0.246569E+01 + PKER_RACCSS( 1, 7) = 0.173757E+01 + PKER_RACCSS( 1, 8) = 0.119489E+01 + PKER_RACCSS( 1, 9) = 0.847828E+00 + PKER_RACCSS( 1, 10) = 0.697256E+00 + PKER_RACCSS( 1, 11) = 0.717816E+00 + PKER_RACCSS( 1, 12) = 0.854882E+00 + PKER_RACCSS( 1, 13) = 0.104470E+01 + PKER_RACCSS( 1, 14) = 0.123807E+01 + PKER_RACCSS( 1, 15) = 0.141081E+01 + PKER_RACCSS( 1, 16) = 0.155700E+01 + PKER_RACCSS( 1, 17) = 0.167856E+01 + PKER_RACCSS( 1, 18) = 0.177921E+01 + PKER_RACCSS( 1, 19) = 0.186250E+01 + PKER_RACCSS( 1, 20) = 0.193142E+01 + PKER_RACCSS( 1, 21) = 0.198845E+01 + PKER_RACCSS( 1, 22) = 0.203565E+01 + PKER_RACCSS( 1, 23) = 0.207472E+01 + PKER_RACCSS( 1, 24) = 0.210705E+01 + PKER_RACCSS( 1, 25) = 0.213381E+01 + PKER_RACCSS( 1, 26) = 0.215596E+01 + PKER_RACCSS( 1, 27) = 0.217429E+01 + PKER_RACCSS( 1, 28) = 0.218947E+01 + PKER_RACCSS( 1, 29) = 0.220203E+01 + PKER_RACCSS( 1, 30) = 0.221243E+01 + PKER_RACCSS( 1, 31) = 0.222103E+01 + PKER_RACCSS( 1, 32) = 0.222816E+01 + PKER_RACCSS( 1, 33) = 0.223406E+01 + PKER_RACCSS( 1, 34) = 0.223894E+01 + PKER_RACCSS( 1, 35) = 0.224298E+01 + PKER_RACCSS( 1, 36) = 0.224632E+01 + PKER_RACCSS( 1, 37) = 0.224909E+01 + PKER_RACCSS( 1, 38) = 0.225138E+01 + PKER_RACCSS( 1, 39) = 0.225328E+01 + PKER_RACCSS( 1, 40) = 0.225485E+01 + PKER_RACCSS( 2, 1) = 0.731793E+01 + PKER_RACCSS( 2, 2) = 0.650784E+01 + PKER_RACCSS( 2, 3) = 0.549484E+01 + PKER_RACCSS( 2, 4) = 0.443777E+01 + PKER_RACCSS( 2, 5) = 0.344045E+01 + PKER_RACCSS( 2, 6) = 0.256167E+01 + PKER_RACCSS( 2, 7) = 0.183252E+01 + PKER_RACCSS( 2, 8) = 0.126978E+01 + PKER_RACCSS( 2, 9) = 0.884187E+00 + PKER_RACCSS( 2, 10) = 0.682228E+00 + PKER_RACCSS( 2, 11) = 0.651607E+00 + PKER_RACCSS( 2, 12) = 0.749498E+00 + PKER_RACCSS( 2, 13) = 0.917050E+00 + PKER_RACCSS( 2, 14) = 0.110111E+01 + PKER_RACCSS( 2, 15) = 0.127111E+01 + PKER_RACCSS( 2, 16) = 0.141681E+01 + PKER_RACCSS( 2, 17) = 0.153841E+01 + PKER_RACCSS( 2, 18) = 0.163915E+01 + PKER_RACCSS( 2, 19) = 0.172252E+01 + PKER_RACCSS( 2, 20) = 0.179149E+01 + PKER_RACCSS( 2, 21) = 0.184857E+01 + PKER_RACCSS( 2, 22) = 0.189580E+01 + PKER_RACCSS( 2, 23) = 0.193488E+01 + PKER_RACCSS( 2, 24) = 0.196723E+01 + PKER_RACCSS( 2, 25) = 0.199401E+01 + PKER_RACCSS( 2, 26) = 0.201617E+01 + PKER_RACCSS( 2, 27) = 0.203451E+01 + PKER_RACCSS( 2, 28) = 0.204969E+01 + PKER_RACCSS( 2, 29) = 0.206226E+01 + PKER_RACCSS( 2, 30) = 0.207266E+01 + PKER_RACCSS( 2, 31) = 0.208127E+01 + PKER_RACCSS( 2, 32) = 0.208839E+01 + PKER_RACCSS( 2, 33) = 0.209429E+01 + PKER_RACCSS( 2, 34) = 0.209918E+01 + PKER_RACCSS( 2, 35) = 0.210322E+01 + PKER_RACCSS( 2, 36) = 0.210656E+01 + PKER_RACCSS( 2, 37) = 0.210933E+01 + PKER_RACCSS( 2, 38) = 0.211163E+01 + PKER_RACCSS( 2, 39) = 0.211352E+01 + PKER_RACCSS( 2, 40) = 0.211509E+01 + PKER_RACCSS( 3, 1) = 0.620923E+01 + PKER_RACCSS( 3, 2) = 0.585074E+01 + PKER_RACCSS( 3, 3) = 0.516881E+01 + PKER_RACCSS( 3, 4) = 0.432464E+01 + PKER_RACCSS( 3, 5) = 0.344908E+01 + PKER_RACCSS( 3, 6) = 0.262906E+01 + PKER_RACCSS( 3, 7) = 0.191653E+01 + PKER_RACCSS( 3, 8) = 0.134324E+01 + PKER_RACCSS( 3, 9) = 0.929224E+00 + PKER_RACCSS( 3, 10) = 0.684394E+00 + PKER_RACCSS( 3, 11) = 0.605038E+00 + PKER_RACCSS( 3, 12) = 0.661387E+00 + PKER_RACCSS( 3, 13) = 0.802622E+00 + PKER_RACCSS( 3, 14) = 0.974479E+00 + PKER_RACCSS( 3, 15) = 0.114040E+01 + PKER_RACCSS( 3, 16) = 0.128524E+01 + PKER_RACCSS( 3, 17) = 0.140682E+01 + PKER_RACCSS( 3, 18) = 0.150766E+01 + PKER_RACCSS( 3, 19) = 0.159112E+01 + PKER_RACCSS( 3, 20) = 0.166016E+01 + PKER_RACCSS( 3, 21) = 0.171729E+01 + PKER_RACCSS( 3, 22) = 0.176455E+01 + PKER_RACCSS( 3, 23) = 0.180367E+01 + PKER_RACCSS( 3, 24) = 0.183604E+01 + PKER_RACCSS( 3, 25) = 0.186283E+01 + PKER_RACCSS( 3, 26) = 0.188500E+01 + PKER_RACCSS( 3, 27) = 0.190335E+01 + PKER_RACCSS( 3, 28) = 0.191854E+01 + PKER_RACCSS( 3, 29) = 0.193111E+01 + PKER_RACCSS( 3, 30) = 0.194152E+01 + PKER_RACCSS( 3, 31) = 0.195013E+01 + PKER_RACCSS( 3, 32) = 0.195726E+01 + PKER_RACCSS( 3, 33) = 0.196316E+01 + PKER_RACCSS( 3, 34) = 0.196805E+01 + PKER_RACCSS( 3, 35) = 0.197209E+01 + PKER_RACCSS( 3, 36) = 0.197544E+01 + PKER_RACCSS( 3, 37) = 0.197821E+01 + PKER_RACCSS( 3, 38) = 0.198050E+01 + PKER_RACCSS( 3, 39) = 0.198240E+01 + PKER_RACCSS( 3, 40) = 0.198397E+01 + PKER_RACCSS( 4, 1) = 0.489412E+01 + PKER_RACCSS( 4, 2) = 0.496003E+01 + PKER_RACCSS( 4, 3) = 0.464691E+01 + PKER_RACCSS( 4, 4) = 0.407266E+01 + PKER_RACCSS( 4, 5) = 0.337005E+01 + PKER_RACCSS( 4, 6) = 0.264746E+01 + PKER_RACCSS( 4, 7) = 0.197888E+01 + PKER_RACCSS( 4, 8) = 0.141145E+01 + PKER_RACCSS( 4, 9) = 0.977676E+00 + PKER_RACCSS( 4, 10) = 0.697624E+00 + PKER_RACCSS( 4, 11) = 0.574725E+00 + PKER_RACCSS( 4, 12) = 0.590243E+00 + PKER_RACCSS( 4, 13) = 0.701865E+00 + PKER_RACCSS( 4, 14) = 0.858232E+00 + PKER_RACCSS( 4, 15) = 0.101841E+01 + PKER_RACCSS( 4, 16) = 0.116181E+01 + PKER_RACCSS( 4, 17) = 0.128324E+01 + PKER_RACCSS( 4, 18) = 0.138420E+01 + PKER_RACCSS( 4, 19) = 0.146776E+01 + PKER_RACCSS( 4, 20) = 0.153689E+01 + PKER_RACCSS( 4, 21) = 0.159407E+01 + PKER_RACCSS( 4, 22) = 0.164139E+01 + PKER_RACCSS( 4, 23) = 0.168054E+01 + PKER_RACCSS( 4, 24) = 0.171293E+01 + PKER_RACCSS( 4, 25) = 0.173974E+01 + PKER_RACCSS( 4, 26) = 0.176193E+01 + PKER_RACCSS( 4, 27) = 0.178029E+01 + PKER_RACCSS( 4, 28) = 0.179549E+01 + PKER_RACCSS( 4, 29) = 0.180807E+01 + PKER_RACCSS( 4, 30) = 0.181848E+01 + PKER_RACCSS( 4, 31) = 0.182709E+01 + PKER_RACCSS( 4, 32) = 0.183423E+01 + PKER_RACCSS( 4, 33) = 0.184013E+01 + PKER_RACCSS( 4, 34) = 0.184502E+01 + PKER_RACCSS( 4, 35) = 0.184906E+01 + PKER_RACCSS( 4, 36) = 0.185241E+01 + PKER_RACCSS( 4, 37) = 0.185518E+01 + PKER_RACCSS( 4, 38) = 0.185747E+01 + PKER_RACCSS( 4, 39) = 0.185937E+01 + PKER_RACCSS( 4, 40) = 0.186094E+01 + PKER_RACCSS( 5, 1) = 0.352472E+01 + PKER_RACCSS( 5, 2) = 0.390184E+01 + PKER_RACCSS( 5, 3) = 0.393452E+01 + PKER_RACCSS( 5, 4) = 0.366051E+01 + PKER_RACCSS( 5, 5) = 0.317719E+01 + PKER_RACCSS( 5, 6) = 0.259404E+01 + PKER_RACCSS( 5, 7) = 0.200191E+01 + PKER_RACCSS( 5, 8) = 0.146469E+01 + PKER_RACCSS( 5, 9) = 0.102673E+01 + PKER_RACCSS( 5, 10) = 0.718755E+00 + PKER_RACCSS( 5, 11) = 0.556693E+00 + PKER_RACCSS( 5, 12) = 0.533409E+00 + PKER_RACCSS( 5, 13) = 0.614372E+00 + PKER_RACCSS( 5, 14) = 0.752546E+00 + PKER_RACCSS( 5, 15) = 0.904981E+00 + PKER_RACCSS( 5, 16) = 0.104611E+01 + PKER_RACCSS( 5, 17) = 0.116720E+01 + PKER_RACCSS( 5, 18) = 0.126824E+01 + PKER_RACCSS( 5, 19) = 0.135194E+01 + PKER_RACCSS( 5, 20) = 0.142116E+01 + PKER_RACCSS( 5, 21) = 0.147842E+01 + PKER_RACCSS( 5, 22) = 0.152579E+01 + PKER_RACCSS( 5, 23) = 0.156498E+01 + PKER_RACCSS( 5, 24) = 0.159741E+01 + PKER_RACCSS( 5, 25) = 0.162424E+01 + PKER_RACCSS( 5, 26) = 0.164644E+01 + PKER_RACCSS( 5, 27) = 0.166482E+01 + PKER_RACCSS( 5, 28) = 0.168003E+01 + PKER_RACCSS( 5, 29) = 0.169261E+01 + PKER_RACCSS( 5, 30) = 0.170303E+01 + PKER_RACCSS( 5, 31) = 0.171165E+01 + PKER_RACCSS( 5, 32) = 0.171879E+01 + PKER_RACCSS( 5, 33) = 0.172469E+01 + PKER_RACCSS( 5, 34) = 0.172958E+01 + PKER_RACCSS( 5, 35) = 0.173363E+01 + PKER_RACCSS( 5, 36) = 0.173698E+01 + PKER_RACCSS( 5, 37) = 0.173975E+01 + PKER_RACCSS( 5, 38) = 0.174205E+01 + PKER_RACCSS( 5, 39) = 0.174395E+01 + PKER_RACCSS( 5, 40) = 0.174552E+01 + PKER_RACCSS( 6, 1) = 0.228210E+01 + PKER_RACCSS( 6, 2) = 0.280066E+01 + PKER_RACCSS( 6, 3) = 0.308657E+01 + PKER_RACCSS( 6, 4) = 0.309355E+01 + PKER_RACCSS( 6, 5) = 0.285370E+01 + PKER_RACCSS( 6, 6) = 0.244776E+01 + PKER_RACCSS( 6, 7) = 0.196661E+01 + PKER_RACCSS( 6, 8) = 0.148740E+01 + PKER_RACCSS( 6, 9) = 0.106708E+01 + PKER_RACCSS( 6, 10) = 0.746205E+00 + PKER_RACCSS( 6, 11) = 0.551114E+00 + PKER_RACCSS( 6, 12) = 0.488949E+00 + PKER_RACCSS( 6, 13) = 0.538117E+00 + PKER_RACCSS( 6, 14) = 0.656577E+00 + PKER_RACCSS( 6, 15) = 0.799740E+00 + PKER_RACCSS( 6, 16) = 0.937749E+00 + PKER_RACCSS( 6, 17) = 0.105821E+01 + PKER_RACCSS( 6, 18) = 0.115932E+01 + PKER_RACCSS( 6, 19) = 0.124316E+01 + PKER_RACCSS( 6, 20) = 0.131250E+01 + PKER_RACCSS( 6, 21) = 0.136985E+01 + PKER_RACCSS( 6, 22) = 0.141729E+01 + PKER_RACCSS( 6, 23) = 0.145653E+01 + PKER_RACCSS( 6, 24) = 0.148899E+01 + PKER_RACCSS( 6, 25) = 0.151585E+01 + PKER_RACCSS( 6, 26) = 0.153808E+01 + PKER_RACCSS( 6, 27) = 0.155647E+01 + PKER_RACCSS( 6, 28) = 0.157169E+01 + PKER_RACCSS( 6, 29) = 0.158429E+01 + PKER_RACCSS( 6, 30) = 0.159471E+01 + PKER_RACCSS( 6, 31) = 0.160334E+01 + PKER_RACCSS( 6, 32) = 0.161048E+01 + PKER_RACCSS( 6, 33) = 0.161639E+01 + PKER_RACCSS( 6, 34) = 0.162128E+01 + PKER_RACCSS( 6, 35) = 0.162533E+01 + PKER_RACCSS( 6, 36) = 0.162868E+01 + PKER_RACCSS( 6, 37) = 0.163145E+01 + PKER_RACCSS( 6, 38) = 0.163375E+01 + PKER_RACCSS( 6, 39) = 0.163565E+01 + PKER_RACCSS( 6, 40) = 0.163722E+01 + PKER_RACCSS( 7, 1) = 0.148782E+01 + PKER_RACCSS( 7, 2) = 0.200771E+01 + PKER_RACCSS( 7, 3) = 0.220555E+01 + PKER_RACCSS( 7, 4) = 0.241780E+01 + PKER_RACCSS( 7, 5) = 0.240508E+01 + PKER_RACCSS( 7, 6) = 0.219547E+01 + PKER_RACCSS( 7, 7) = 0.185621E+01 + PKER_RACCSS( 7, 8) = 0.146365E+01 + PKER_RACCSS( 7, 9) = 0.108448E+01 + PKER_RACCSS( 7, 10) = 0.770204E+00 + PKER_RACCSS( 7, 11) = 0.556115E+00 + PKER_RACCSS( 7, 12) = 0.459612E+00 + PKER_RACCSS( 7, 13) = 0.474417E+00 + PKER_RACCSS( 7, 14) = 0.568754E+00 + PKER_RACCSS( 7, 15) = 0.700250E+00 + PKER_RACCSS( 7, 16) = 0.834630E+00 + PKER_RACCSS( 7, 17) = 0.954778E+00 + PKER_RACCSS( 7, 18) = 0.105642E+01 + PKER_RACCSS( 7, 19) = 0.114078E+01 + PKER_RACCSS( 7, 20) = 0.121042E+01 + PKER_RACCSS( 7, 21) = 0.126792E+01 + PKER_RACCSS( 7, 22) = 0.131544E+01 + PKER_RACCSS( 7, 23) = 0.135474E+01 + PKER_RACCSS( 7, 24) = 0.138724E+01 + PKER_RACCSS( 7, 25) = 0.141414E+01 + PKER_RACCSS( 7, 26) = 0.143639E+01 + PKER_RACCSS( 7, 27) = 0.145480E+01 + PKER_RACCSS( 7, 28) = 0.147003E+01 + PKER_RACCSS( 7, 29) = 0.148264E+01 + PKER_RACCSS( 7, 30) = 0.149307E+01 + PKER_RACCSS( 7, 31) = 0.150171E+01 + PKER_RACCSS( 7, 32) = 0.150885E+01 + PKER_RACCSS( 7, 33) = 0.151477E+01 + PKER_RACCSS( 7, 34) = 0.151966E+01 + PKER_RACCSS( 7, 35) = 0.152372E+01 + PKER_RACCSS( 7, 36) = 0.152707E+01 + PKER_RACCSS( 7, 37) = 0.152984E+01 + PKER_RACCSS( 7, 38) = 0.153214E+01 + PKER_RACCSS( 7, 39) = 0.153404E+01 + PKER_RACCSS( 7, 40) = 0.153562E+01 + PKER_RACCSS( 8, 1) = 0.262435E+01 + PKER_RACCSS( 8, 2) = 0.238666E+01 + PKER_RACCSS( 8, 3) = 0.233673E+01 + PKER_RACCSS( 8, 4) = 0.234057E+01 + PKER_RACCSS( 8, 5) = 0.228742E+01 + PKER_RACCSS( 8, 6) = 0.212164E+01 + PKER_RACCSS( 8, 7) = 0.184665E+01 + PKER_RACCSS( 8, 8) = 0.150391E+01 + PKER_RACCSS( 8, 9) = 0.114827E+01 + PKER_RACCSS( 8, 10) = 0.831674E+00 + PKER_RACCSS( 8, 11) = 0.595148E+00 + PKER_RACCSS( 8, 12) = 0.463804E+00 + PKER_RACCSS( 8, 13) = 0.440716E+00 + PKER_RACCSS( 8, 14) = 0.503716E+00 + PKER_RACCSS( 8, 15) = 0.616434E+00 + PKER_RACCSS( 8, 16) = 0.742493E+00 + PKER_RACCSS( 8, 17) = 0.859895E+00 + PKER_RACCSS( 8, 18) = 0.960763E+00 + PKER_RACCSS( 8, 19) = 0.104493E+01 + PKER_RACCSS( 8, 20) = 0.111460E+01 + PKER_RACCSS( 8, 21) = 0.117219E+01 + PKER_RACCSS( 8, 22) = 0.121981E+01 + PKER_RACCSS( 8, 23) = 0.125918E+01 + PKER_RACCSS( 8, 24) = 0.129174E+01 + PKER_RACCSS( 8, 25) = 0.131868E+01 + PKER_RACCSS( 8, 26) = 0.134096E+01 + PKER_RACCSS( 8, 27) = 0.135939E+01 + PKER_RACCSS( 8, 28) = 0.137465E+01 + PKER_RACCSS( 8, 29) = 0.138727E+01 + PKER_RACCSS( 8, 30) = 0.139771E+01 + PKER_RACCSS( 8, 31) = 0.140635E+01 + PKER_RACCSS( 8, 32) = 0.141350E+01 + PKER_RACCSS( 8, 33) = 0.141942E+01 + PKER_RACCSS( 8, 34) = 0.142432E+01 + PKER_RACCSS( 8, 35) = 0.142838E+01 + PKER_RACCSS( 8, 36) = 0.143173E+01 + PKER_RACCSS( 8, 37) = 0.143451E+01 + PKER_RACCSS( 8, 38) = 0.143681E+01 + PKER_RACCSS( 8, 39) = 0.143871E+01 + PKER_RACCSS( 8, 40) = 0.144029E+01 + PKER_RACCSS( 9, 1) = 0.258564E+01 + PKER_RACCSS( 9, 2) = 0.212607E+01 + PKER_RACCSS( 9, 3) = 0.191008E+01 + PKER_RACCSS( 9, 4) = 0.184553E+01 + PKER_RACCSS( 9, 5) = 0.182496E+01 + PKER_RACCSS( 9, 6) = 0.176067E+01 + PKER_RACCSS( 9, 7) = 0.160989E+01 + PKER_RACCSS( 9, 8) = 0.137709E+01 + PKER_RACCSS( 9, 9) = 0.109833E+01 + PKER_RACCSS( 9, 10) = 0.821651E+00 + PKER_RACCSS( 9, 11) = 0.593004E+00 + PKER_RACCSS( 9, 12) = 0.447502E+00 + PKER_RACCSS( 9, 13) = 0.400378E+00 + PKER_RACCSS( 9, 14) = 0.440619E+00 + PKER_RACCSS( 9, 15) = 0.537296E+00 + PKER_RACCSS( 9, 16) = 0.655296E+00 + PKER_RACCSS( 9, 17) = 0.769925E+00 + PKER_RACCSS( 9, 18) = 0.870332E+00 + PKER_RACCSS( 9, 19) = 0.954640E+00 + PKER_RACCSS( 9, 20) = 0.102452E+01 + PKER_RACCSS( 9, 21) = 0.108227E+01 + PKER_RACCSS( 9, 22) = 0.113001E+01 + PKER_RACCSS( 9, 23) = 0.116947E+01 + PKER_RACCSS( 9, 24) = 0.120209E+01 + PKER_RACCSS( 9, 25) = 0.122908E+01 + PKER_RACCSS( 9, 26) = 0.125140E+01 + PKER_RACCSS( 9, 27) = 0.126986E+01 + PKER_RACCSS( 9, 28) = 0.128513E+01 + PKER_RACCSS( 9, 29) = 0.129777E+01 + PKER_RACCSS( 9, 30) = 0.130823E+01 + PKER_RACCSS( 9, 31) = 0.131688E+01 + PKER_RACCSS( 9, 32) = 0.132404E+01 + PKER_RACCSS( 9, 33) = 0.132996E+01 + PKER_RACCSS( 9, 34) = 0.133487E+01 + PKER_RACCSS( 9, 35) = 0.133892E+01 + PKER_RACCSS( 9, 36) = 0.134228E+01 + PKER_RACCSS( 9, 37) = 0.134506E+01 + PKER_RACCSS( 9, 38) = 0.134736E+01 + PKER_RACCSS( 9, 39) = 0.134927E+01 + PKER_RACCSS( 9, 40) = 0.135084E+01 + PKER_RACCSS( 10, 1) = 0.326941E+01 + PKER_RACCSS( 10, 2) = 0.247738E+01 + PKER_RACCSS( 10, 3) = 0.198894E+01 + PKER_RACCSS( 10, 4) = 0.173769E+01 + PKER_RACCSS( 10, 5) = 0.163096E+01 + PKER_RACCSS( 10, 6) = 0.156919E+01 + PKER_RACCSS( 10, 7) = 0.147478E+01 + PKER_RACCSS( 10, 8) = 0.119527E+01 + PKER_RACCSS( 10, 9) = 0.100108E+01 + PKER_RACCSS( 10, 10) = 0.781320E+00 + PKER_RACCSS( 10, 11) = 0.578296E+00 + PKER_RACCSS( 10, 12) = 0.430609E+00 + PKER_RACCSS( 10, 13) = 0.363116E+00 + PKER_RACCSS( 10, 14) = 0.377933E+00 + PKER_RACCSS( 10, 15) = 0.453999E+00 + PKER_RACCSS( 10, 16) = 0.559195E+00 + PKER_RACCSS( 10, 17) = 0.666791E+00 + PKER_RACCSS( 10, 18) = 0.764030E+00 + PKER_RACCSS( 10, 19) = 0.848611E+00 + PKER_RACCSS( 10, 20) = 0.922036E+00 + PKER_RACCSS( 10, 21) = 0.985589E+00 + PKER_RACCSS( 10, 22) = 0.103929E+01 + PKER_RACCSS( 10, 23) = 0.108289E+01 + PKER_RACCSS( 10, 24) = 0.111739E+01 + PKER_RACCSS( 10, 25) = 0.114490E+01 + PKER_RACCSS( 10, 26) = 0.116733E+01 + PKER_RACCSS( 10, 27) = 0.118583E+01 + PKER_RACCSS( 10, 28) = 0.120113E+01 + PKER_RACCSS( 10, 29) = 0.121379E+01 + PKER_RACCSS( 10, 30) = 0.122426E+01 + PKER_RACCSS( 10, 31) = 0.123292E+01 + PKER_RACCSS( 10, 32) = 0.124009E+01 + PKER_RACCSS( 10, 33) = 0.124602E+01 + PKER_RACCSS( 10, 34) = 0.125093E+01 + PKER_RACCSS( 10, 35) = 0.125500E+01 + PKER_RACCSS( 10, 36) = 0.125836E+01 + PKER_RACCSS( 10, 37) = 0.126114E+01 + PKER_RACCSS( 10, 38) = 0.126344E+01 + PKER_RACCSS( 10, 39) = 0.126535E+01 + PKER_RACCSS( 10, 40) = 0.126692E+01 + PKER_RACCSS( 11, 1) = 0.540047E+01 + PKER_RACCSS( 11, 2) = 0.406788E+01 + PKER_RACCSS( 11, 3) = 0.307616E+01 + PKER_RACCSS( 11, 4) = 0.238233E+01 + PKER_RACCSS( 11, 5) = 0.192893E+01 + PKER_RACCSS( 11, 6) = 0.164024E+01 + PKER_RACCSS( 11, 7) = 0.143525E+01 + PKER_RACCSS( 11, 8) = 0.124898E+01 + PKER_RACCSS( 11, 9) = 0.104781E+01 + PKER_RACCSS( 11, 10) = 0.832136E+00 + PKER_RACCSS( 11, 11) = 0.625559E+00 + PKER_RACCSS( 11, 12) = 0.461096E+00 + PKER_RACCSS( 11, 13) = 0.367093E+00 + PKER_RACCSS( 11, 14) = 0.353793E+00 + PKER_RACCSS( 11, 15) = 0.408329E+00 + PKER_RACCSS( 11, 16) = 0.502430E+00 + PKER_RACCSS( 11, 17) = 0.607438E+00 + PKER_RACCSS( 11, 18) = 0.705454E+00 + PKER_RACCSS( 11, 19) = 0.789792E+00 + PKER_RACCSS( 11, 20) = 0.860149E+00 + PKER_RACCSS( 11, 21) = 0.918336E+00 + PKER_RACCSS( 11, 22) = 0.966393E+00 + PKER_RACCSS( 11, 23) = 0.100609E+01 + PKER_RACCSS( 11, 24) = 0.103890E+01 + PKER_RACCSS( 11, 25) = 0.106601E+01 + PKER_RACCSS( 11, 26) = 0.108843E+01 + PKER_RACCSS( 11, 27) = 0.110696E+01 + PKER_RACCSS( 11, 28) = 0.112230E+01 + PKER_RACCSS( 11, 29) = 0.113498E+01 + PKER_RACCSS( 11, 30) = 0.114547E+01 + PKER_RACCSS( 11, 31) = 0.115414E+01 + PKER_RACCSS( 11, 32) = 0.116132E+01 + PKER_RACCSS( 11, 33) = 0.116726E+01 + PKER_RACCSS( 11, 34) = 0.117218E+01 + PKER_RACCSS( 11, 35) = 0.117625E+01 + PKER_RACCSS( 11, 36) = 0.117961E+01 + PKER_RACCSS( 11, 37) = 0.118240E+01 + PKER_RACCSS( 11, 38) = 0.118470E+01 + PKER_RACCSS( 11, 39) = 0.118661E+01 + PKER_RACCSS( 11, 40) = 0.118819E+01 + PKER_RACCSS( 12, 1) = 0.782212E+01 + PKER_RACCSS( 12, 2) = 0.599420E+01 + PKER_RACCSS( 12, 3) = 0.455236E+01 + PKER_RACCSS( 12, 4) = 0.345125E+01 + PKER_RACCSS( 12, 5) = 0.264475E+01 + PKER_RACCSS( 12, 6) = 0.207701E+01 + PKER_RACCSS( 12, 7) = 0.168031E+01 + PKER_RACCSS( 12, 8) = 0.138445E+01 + PKER_RACCSS( 12, 9) = 0.113395E+01 + PKER_RACCSS( 12, 10) = 0.900399E+00 + PKER_RACCSS( 12, 11) = 0.683291E+00 + PKER_RACCSS( 12, 12) = 0.501952E+00 + PKER_RACCSS( 12, 13) = 0.380903E+00 + PKER_RACCSS( 12, 14) = 0.335581E+00 + PKER_RACCSS( 12, 15) = 0.362162E+00 + PKER_RACCSS( 12, 16) = 0.438221E+00 + PKER_RACCSS( 12, 17) = 0.534996E+00 + PKER_RACCSS( 12, 18) = 0.630498E+00 + PKER_RACCSS( 12, 19) = 0.714544E+00 + PKER_RACCSS( 12, 20) = 0.785149E+00 + PKER_RACCSS( 12, 21) = 0.843614E+00 + PKER_RACCSS( 12, 22) = 0.891886E+00 + PKER_RACCSS( 12, 23) = 0.931743E+00 + PKER_RACCSS( 12, 24) = 0.964664E+00 + PKER_RACCSS( 12, 25) = 0.991866E+00 + PKER_RACCSS( 12, 26) = 0.101435E+01 + PKER_RACCSS( 12, 27) = 0.103293E+01 + PKER_RACCSS( 12, 28) = 0.104830E+01 + PKER_RACCSS( 12, 29) = 0.106101E+01 + PKER_RACCSS( 12, 30) = 0.107152E+01 + PKER_RACCSS( 12, 31) = 0.108022E+01 + PKER_RACCSS( 12, 32) = 0.108741E+01 + PKER_RACCSS( 12, 33) = 0.109336E+01 + PKER_RACCSS( 12, 34) = 0.109828E+01 + PKER_RACCSS( 12, 35) = 0.110236E+01 + PKER_RACCSS( 12, 36) = 0.110573E+01 + PKER_RACCSS( 12, 37) = 0.110852E+01 + PKER_RACCSS( 12, 38) = 0.111082E+01 + PKER_RACCSS( 12, 39) = 0.111273E+01 + PKER_RACCSS( 12, 40) = 0.111431E+01 + PKER_RACCSS( 13, 1) = 0.981788E+01 + PKER_RACCSS( 13, 2) = 0.766217E+01 + PKER_RACCSS( 13, 3) = 0.591544E+01 + PKER_RACCSS( 13, 4) = 0.452414E+01 + PKER_RACCSS( 13, 5) = 0.344339E+01 + PKER_RACCSS( 13, 6) = 0.262943E+01 + PKER_RACCSS( 13, 7) = 0.203218E+01 + PKER_RACCSS( 13, 8) = 0.159445E+01 + PKER_RACCSS( 13, 9) = 0.125920E+01 + PKER_RACCSS( 13, 10) = 0.982700E+00 + PKER_RACCSS( 13, 11) = 0.743668E+00 + PKER_RACCSS( 13, 12) = 0.544085E+00 + PKER_RACCSS( 13, 13) = 0.399552E+00 + PKER_RACCSS( 13, 14) = 0.325874E+00 + PKER_RACCSS( 13, 15) = 0.325287E+00 + PKER_RACCSS( 13, 16) = 0.381940E+00 + PKER_RACCSS( 13, 17) = 0.468486E+00 + PKER_RACCSS( 13, 18) = 0.560310E+00 + PKER_RACCSS( 13, 19) = 0.643677E+00 + PKER_RACCSS( 13, 20) = 0.714489E+00 + PKER_RACCSS( 13, 21) = 0.773275E+00 + PKER_RACCSS( 13, 22) = 0.821809E+00 + PKER_RACCSS( 13, 23) = 0.861858E+00 + PKER_RACCSS( 13, 24) = 0.894921E+00 + PKER_RACCSS( 13, 25) = 0.922229E+00 + PKER_RACCSS( 13, 26) = 0.944790E+00 + PKER_RACCSS( 13, 27) = 0.963435E+00 + PKER_RACCSS( 13, 28) = 0.978848E+00 + PKER_RACCSS( 13, 29) = 0.991591E+00 + PKER_RACCSS( 13, 30) = 0.100213E+01 + PKER_RACCSS( 13, 31) = 0.101084E+01 + PKER_RACCSS( 13, 32) = 0.101805E+01 + PKER_RACCSS( 13, 33) = 0.102401E+01 + PKER_RACCSS( 13, 34) = 0.102895E+01 + PKER_RACCSS( 13, 35) = 0.103303E+01 + PKER_RACCSS( 13, 36) = 0.103640E+01 + PKER_RACCSS( 13, 37) = 0.103920E+01 + PKER_RACCSS( 13, 38) = 0.104151E+01 + PKER_RACCSS( 13, 39) = 0.104342E+01 + PKER_RACCSS( 13, 40) = 0.104500E+01 + PKER_RACCSS( 14, 1) = 0.113567E+02 + PKER_RACCSS( 14, 2) = 0.899336E+01 + PKER_RACCSS( 14, 3) = 0.705312E+01 + PKER_RACCSS( 14, 4) = 0.547412E+01 + PKER_RACCSS( 14, 5) = 0.420687E+01 + PKER_RACCSS( 14, 6) = 0.320973E+01 + PKER_RACCSS( 14, 7) = 0.244303E+01 + PKER_RACCSS( 14, 8) = 0.186415E+01 + PKER_RACCSS( 14, 9) = 0.142646E+01 + PKER_RACCSS( 14, 10) = 0.108627E+01 + PKER_RACCSS( 14, 11) = 0.811450E+00 + PKER_RACCSS( 14, 12) = 0.588974E+00 + PKER_RACCSS( 14, 13) = 0.422701E+00 + PKER_RACCSS( 14, 14) = 0.323861E+00 + PKER_RACCSS( 14, 15) = 0.298012E+00 + PKER_RACCSS( 14, 16) = 0.334007E+00 + PKER_RACCSS( 14, 17) = 0.408204E+00 + PKER_RACCSS( 14, 18) = 0.494846E+00 + PKER_RACCSS( 14, 19) = 0.576947E+00 + PKER_RACCSS( 14, 20) = 0.647860E+00 + PKER_RACCSS( 14, 21) = 0.707002E+00 + PKER_RACCSS( 14, 22) = 0.755849E+00 + PKER_RACCSS( 14, 23) = 0.796134E+00 + PKER_RACCSS( 14, 24) = 0.829370E+00 + PKER_RACCSS( 14, 25) = 0.856805E+00 + PKER_RACCSS( 14, 26) = 0.879461E+00 + PKER_RACCSS( 14, 27) = 0.898178E+00 + PKER_RACCSS( 14, 28) = 0.913645E+00 + PKER_RACCSS( 14, 29) = 0.926429E+00 + PKER_RACCSS( 14, 30) = 0.936998E+00 + PKER_RACCSS( 14, 31) = 0.945737E+00 + PKER_RACCSS( 14, 32) = 0.952964E+00 + PKER_RACCSS( 14, 33) = 0.958941E+00 + PKER_RACCSS( 14, 34) = 0.963884E+00 + PKER_RACCSS( 14, 35) = 0.967974E+00 + PKER_RACCSS( 14, 36) = 0.971357E+00 + PKER_RACCSS( 14, 37) = 0.974155E+00 + PKER_RACCSS( 14, 38) = 0.976471E+00 + PKER_RACCSS( 14, 39) = 0.978386E+00 + PKER_RACCSS( 14, 40) = 0.979971E+00 + PKER_RACCSS( 15, 1) = 0.124924E+02 + PKER_RACCSS( 15, 2) = 0.100003E+02 + PKER_RACCSS( 15, 3) = 0.794169E+01 + PKER_RACCSS( 15, 4) = 0.624828E+01 + PKER_RACCSS( 15, 5) = 0.486528E+01 + PKER_RACCSS( 15, 6) = 0.374844E+01 + PKER_RACCSS( 15, 7) = 0.286039E+01 + PKER_RACCSS( 15, 8) = 0.216647E+01 + PKER_RACCSS( 15, 9) = 0.163111E+01 + PKER_RACCSS( 15, 10) = 0.121825E+01 + PKER_RACCSS( 15, 11) = 0.895737E+00 + PKER_RACCSS( 15, 12) = 0.642706E+00 + PKER_RACCSS( 15, 13) = 0.452742E+00 + PKER_RACCSS( 15, 14) = 0.330032E+00 + PKER_RACCSS( 15, 15) = 0.279351E+00 + PKER_RACCSS( 15, 16) = 0.294228E+00 + PKER_RACCSS( 15, 17) = 0.354314E+00 + PKER_RACCSS( 15, 18) = 0.434176E+00 + PKER_RACCSS( 15, 19) = 0.514178E+00 + PKER_RACCSS( 15, 20) = 0.584975E+00 + PKER_RACCSS( 15, 21) = 0.644491E+00 + PKER_RACCSS( 15, 22) = 0.693710E+00 + PKER_RACCSS( 15, 23) = 0.734280E+00 + PKER_RACCSS( 15, 24) = 0.767726E+00 + PKER_RACCSS( 15, 25) = 0.795316E+00 + PKER_RACCSS( 15, 26) = 0.818088E+00 + PKER_RACCSS( 15, 27) = 0.836891E+00 + PKER_RACCSS( 15, 28) = 0.852423E+00 + PKER_RACCSS( 15, 29) = 0.865256E+00 + PKER_RACCSS( 15, 30) = 0.875863E+00 + PKER_RACCSS( 15, 31) = 0.884631E+00 + PKER_RACCSS( 15, 32) = 0.891880E+00 + PKER_RACCSS( 15, 33) = 0.897874E+00 + PKER_RACCSS( 15, 34) = 0.902831E+00 + PKER_RACCSS( 15, 35) = 0.906930E+00 + PKER_RACCSS( 15, 36) = 0.910321E+00 + PKER_RACCSS( 15, 37) = 0.913126E+00 + PKER_RACCSS( 15, 38) = 0.915447E+00 + PKER_RACCSS( 15, 39) = 0.917366E+00 + PKER_RACCSS( 15, 40) = 0.918954E+00 + PKER_RACCSS( 16, 1) = 0.136907E+02 + PKER_RACCSS( 16, 2) = 0.110657E+02 + PKER_RACCSS( 16, 3) = 0.889092E+01 + PKER_RACCSS( 16, 4) = 0.709169E+01 + PKER_RACCSS( 16, 5) = 0.560750E+01 + PKER_RACCSS( 16, 6) = 0.438940E+01 + PKER_RACCSS( 16, 7) = 0.339760E+01 + PKER_RACCSS( 16, 8) = 0.259872E+01 + PKER_RACCSS( 16, 9) = 0.196266E+01 + PKER_RACCSS( 16, 10) = 0.146081E+01 + PKER_RACCSS( 16, 11) = 0.106641E+01 + PKER_RACCSS( 16, 12) = 0.758348E+00 + PKER_RACCSS( 16, 13) = 0.524888E+00 + PKER_RACCSS( 16, 14) = 0.364964E+00 + PKER_RACCSS( 16, 15) = 0.280630E+00 + PKER_RACCSS( 16, 16) = 0.267498E+00 + PKER_RACCSS( 16, 17) = 0.308591E+00 + PKER_RACCSS( 16, 18) = 0.378682E+00 + PKER_RACCSS( 16, 19) = 0.455284E+00 + PKER_RACCSS( 16, 20) = 0.525585E+00 + PKER_RACCSS( 16, 21) = 0.585451E+00 + PKER_RACCSS( 16, 22) = 0.635103E+00 + PKER_RACCSS( 16, 23) = 0.676018E+00 + PKER_RACCSS( 16, 24) = 0.709719E+00 + PKER_RACCSS( 16, 25) = 0.737497E+00 + PKER_RACCSS( 16, 26) = 0.760408E+00 + PKER_RACCSS( 16, 27) = 0.779316E+00 + PKER_RACCSS( 16, 28) = 0.794926E+00 + PKER_RACCSS( 16, 29) = 0.807819E+00 + PKER_RACCSS( 16, 30) = 0.818471E+00 + PKER_RACCSS( 16, 31) = 0.827273E+00 + PKER_RACCSS( 16, 32) = 0.834549E+00 + PKER_RACCSS( 16, 33) = 0.840564E+00 + PKER_RACCSS( 16, 34) = 0.845537E+00 + PKER_RACCSS( 16, 35) = 0.849649E+00 + PKER_RACCSS( 16, 36) = 0.853049E+00 + PKER_RACCSS( 16, 37) = 0.855862E+00 + PKER_RACCSS( 16, 38) = 0.858188E+00 + PKER_RACCSS( 16, 39) = 0.860112E+00 + PKER_RACCSS( 16, 40) = 0.861704E+00 + PKER_RACCSS( 17, 1) = 0.143219E+02 + PKER_RACCSS( 17, 2) = 0.116425E+02 + PKER_RACCSS( 17, 3) = 0.942087E+01 + PKER_RACCSS( 17, 4) = 0.757943E+01 + PKER_RACCSS( 17, 5) = 0.605456E+01 + PKER_RACCSS( 17, 6) = 0.479437E+01 + PKER_RACCSS( 17, 7) = 0.375669E+01 + PKER_RACCSS( 17, 8) = 0.290705E+01 + PKER_RACCSS( 17, 9) = 0.221663E+01 + PKER_RACCSS( 17, 10) = 0.166050E+01 + PKER_RACCSS( 17, 11) = 0.121648E+01 + PKER_RACCSS( 17, 12) = 0.866211E+00 + PKER_RACCSS( 17, 13) = 0.597261E+00 + PKER_RACCSS( 17, 14) = 0.405300E+00 + PKER_RACCSS( 17, 15) = 0.290505E+00 + PKER_RACCSS( 17, 16) = 0.250047E+00 + PKER_RACCSS( 17, 17) = 0.270435E+00 + PKER_RACCSS( 17, 18) = 0.328579E+00 + PKER_RACCSS( 17, 19) = 0.400271E+00 + PKER_RACCSS( 17, 20) = 0.469487E+00 + PKER_RACCSS( 17, 21) = 0.529608E+00 + PKER_RACCSS( 17, 22) = 0.579747E+00 + PKER_RACCSS( 17, 23) = 0.621077E+00 + PKER_RACCSS( 17, 24) = 0.655088E+00 + PKER_RACCSS( 17, 25) = 0.683095E+00 + PKER_RACCSS( 17, 26) = 0.706175E+00 + PKER_RACCSS( 17, 27) = 0.725209E+00 + PKER_RACCSS( 17, 28) = 0.740914E+00 + PKER_RACCSS( 17, 29) = 0.753878E+00 + PKER_RACCSS( 17, 30) = 0.764585E+00 + PKER_RACCSS( 17, 31) = 0.773429E+00 + PKER_RACCSS( 17, 32) = 0.780736E+00 + PKER_RACCSS( 17, 33) = 0.786775E+00 + PKER_RACCSS( 17, 34) = 0.791767E+00 + PKER_RACCSS( 17, 35) = 0.795894E+00 + PKER_RACCSS( 17, 36) = 0.799306E+00 + PKER_RACCSS( 17, 37) = 0.802128E+00 + PKER_RACCSS( 17, 38) = 0.804461E+00 + PKER_RACCSS( 17, 39) = 0.806391E+00 + PKER_RACCSS( 17, 40) = 0.807987E+00 + PKER_RACCSS( 18, 1) = 0.147209E+02 + PKER_RACCSS( 18, 2) = 0.120131E+02 + PKER_RACCSS( 18, 3) = 0.976801E+01 + PKER_RACCSS( 18, 4) = 0.790632E+01 + PKER_RACCSS( 18, 5) = 0.636267E+01 + PKER_RACCSS( 18, 6) = 0.508334E+01 + PKER_RACCSS( 18, 7) = 0.402439E+01 + PKER_RACCSS( 18, 8) = 0.314991E+01 + PKER_RACCSS( 18, 9) = 0.243053E+01 + PKER_RACCSS( 18, 10) = 0.184200E+01 + PKER_RACCSS( 18, 11) = 0.136420E+01 + PKER_RACCSS( 18, 12) = 0.980889E+00 + PKER_RACCSS( 18, 13) = 0.680705E+00 + PKER_RACCSS( 18, 14) = 0.458391E+00 + PKER_RACCSS( 18, 15) = 0.313204E+00 + PKER_RACCSS( 18, 16) = 0.244163E+00 + PKER_RACCSS( 18, 17) = 0.241397E+00 + PKER_RACCSS( 18, 18) = 0.284627E+00 + PKER_RACCSS( 18, 19) = 0.349372E+00 + PKER_RACCSS( 18, 20) = 0.416570E+00 + PKER_RACCSS( 18, 21) = 0.476717E+00 + PKER_RACCSS( 18, 22) = 0.527374E+00 + PKER_RACCSS( 18, 23) = 0.569195E+00 + PKER_RACCSS( 18, 24) = 0.603582E+00 + PKER_RACCSS( 18, 25) = 0.631866E+00 + PKER_RACCSS( 18, 26) = 0.655151E+00 + PKER_RACCSS( 18, 27) = 0.674337E+00 + PKER_RACCSS( 18, 28) = 0.690157E+00 + PKER_RACCSS( 18, 29) = 0.703207E+00 + PKER_RACCSS( 18, 30) = 0.713979E+00 + PKER_RACCSS( 18, 31) = 0.722873E+00 + PKER_RACCSS( 18, 32) = 0.730219E+00 + PKER_RACCSS( 18, 33) = 0.736287E+00 + PKER_RACCSS( 18, 34) = 0.741302E+00 + PKER_RACCSS( 18, 35) = 0.745447E+00 + PKER_RACCSS( 18, 36) = 0.748872E+00 + PKER_RACCSS( 18, 37) = 0.751705E+00 + PKER_RACCSS( 18, 38) = 0.754046E+00 + PKER_RACCSS( 18, 39) = 0.755982E+00 + PKER_RACCSS( 18, 40) = 0.757584E+00 + PKER_RACCSS( 19, 1) = 0.149183E+02 + PKER_RACCSS( 19, 2) = 0.122030E+02 + PKER_RACCSS( 19, 3) = 0.994164E+01 + PKER_RACCSS( 19, 4) = 0.807634E+01 + PKER_RACCSS( 19, 5) = 0.652942E+01 + PKER_RACCSS( 19, 6) = 0.524643E+01 + PKER_RACCSS( 19, 7) = 0.418260E+01 + PKER_RACCSS( 19, 8) = 0.330120E+01 + PKER_RACCSS( 19, 9) = 0.257220E+01 + PKER_RACCSS( 19, 10) = 0.197109E+01 + PKER_RACCSS( 19, 11) = 0.147799E+01 + PKER_RACCSS( 19, 12) = 0.107723E+01 + PKER_RACCSS( 19, 13) = 0.757647E+00 + PKER_RACCSS( 19, 14) = 0.513325E+00 + PKER_RACCSS( 19, 15) = 0.343389E+00 + PKER_RACCSS( 19, 16) = 0.247854E+00 + PKER_RACCSS( 19, 17) = 0.221083E+00 + PKER_RACCSS( 19, 18) = 0.247150E+00 + PKER_RACCSS( 19, 19) = 0.302778E+00 + PKER_RACCSS( 19, 20) = 0.366775E+00 + PKER_RACCSS( 19, 21) = 0.426568E+00 + PKER_RACCSS( 19, 22) = 0.477725E+00 + PKER_RACCSS( 19, 23) = 0.520116E+00 + PKER_RACCSS( 19, 24) = 0.554956E+00 + PKER_RACCSS( 19, 25) = 0.583576E+00 + PKER_RACCSS( 19, 26) = 0.607109E+00 + PKER_RACCSS( 19, 27) = 0.626480E+00 + PKER_RACCSS( 19, 28) = 0.642437E+00 + PKER_RACCSS( 19, 29) = 0.655592E+00 + PKER_RACCSS( 19, 30) = 0.666442E+00 + PKER_RACCSS( 19, 31) = 0.675396E+00 + PKER_RACCSS( 19, 32) = 0.682788E+00 + PKER_RACCSS( 19, 33) = 0.688892E+00 + PKER_RACCSS( 19, 34) = 0.693934E+00 + PKER_RACCSS( 19, 35) = 0.698099E+00 + PKER_RACCSS( 19, 36) = 0.701541E+00 + PKER_RACCSS( 19, 37) = 0.704386E+00 + PKER_RACCSS( 19, 38) = 0.706738E+00 + PKER_RACCSS( 19, 39) = 0.708682E+00 + PKER_RACCSS( 19, 40) = 0.710289E+00 + PKER_RACCSS( 20, 1) = 0.149148E+02 + PKER_RACCSS( 20, 2) = 0.121968E+02 + PKER_RACCSS( 20, 3) = 0.994688E+01 + PKER_RACCSS( 20, 4) = 0.808241E+01 + PKER_RACCSS( 20, 5) = 0.653732E+01 + PKER_RACCSS( 20, 6) = 0.525704E+01 + PKER_RACCSS( 20, 7) = 0.419660E+01 + PKER_RACCSS( 20, 8) = 0.331897E+01 + PKER_RACCSS( 20, 9) = 0.259370E+01 + PKER_RACCSS( 20, 10) = 0.199579E+01 + PKER_RACCSS( 20, 11) = 0.150482E+01 + PKER_RACCSS( 20, 12) = 0.110452E+01 + PKER_RACCSS( 20, 13) = 0.783023E+00 + PKER_RACCSS( 20, 14) = 0.533371E+00 + PKER_RACCSS( 20, 15) = 0.353809E+00 + PKER_RACCSS( 20, 16) = 0.245035E+00 + PKER_RACCSS( 20, 17) = 0.204243E+00 + PKER_RACCSS( 20, 18) = 0.219182E+00 + PKER_RACCSS( 20, 19) = 0.268663E+00 + PKER_RACCSS( 20, 20) = 0.330431E+00 + PKER_RACCSS( 20, 21) = 0.389684E+00 + PKER_RACCSS( 20, 22) = 0.440619E+00 + PKER_RACCSS( 20, 23) = 0.482783E+00 + PKER_RACCSS( 20, 24) = 0.517411E+00 + PKER_RACCSS( 20, 25) = 0.545855E+00 + PKER_RACCSS( 20, 26) = 0.569246E+00 + PKER_RACCSS( 20, 27) = 0.588502E+00 + PKER_RACCSS( 20, 28) = 0.604366E+00 + PKER_RACCSS( 20, 29) = 0.617445E+00 + PKER_RACCSS( 20, 30) = 0.628235E+00 + PKER_RACCSS( 20, 31) = 0.637140E+00 + PKER_RACCSS( 20, 32) = 0.644493E+00 + PKER_RACCSS( 20, 33) = 0.650566E+00 + PKER_RACCSS( 20, 34) = 0.655583E+00 + PKER_RACCSS( 20, 35) = 0.659729E+00 + PKER_RACCSS( 20, 36) = 0.663155E+00 + PKER_RACCSS( 20, 37) = 0.665988E+00 + PKER_RACCSS( 20, 38) = 0.668329E+00 + PKER_RACCSS( 20, 39) = 0.670265E+00 + PKER_RACCSS( 20, 40) = 0.671867E+00 + PKER_RACCSS( 21, 1) = 0.150013E+02 + PKER_RACCSS( 21, 2) = 0.122869E+02 + PKER_RACCSS( 21, 3) = 0.100382E+02 + PKER_RACCSS( 21, 4) = 0.817497E+01 + PKER_RACCSS( 21, 5) = 0.663057E+01 + PKER_RACCSS( 21, 6) = 0.535086E+01 + PKER_RACCSS( 21, 7) = 0.429034E+01 + PKER_RACCSS( 21, 8) = 0.341176E+01 + PKER_RACCSS( 21, 9) = 0.268444E+01 + PKER_RACCSS( 21, 10) = 0.208320E+01 + PKER_RACCSS( 21, 11) = 0.158747E+01 + PKER_RACCSS( 21, 12) = 0.118074E+01 + PKER_RACCSS( 21, 13) = 0.850535E+00 + PKER_RACCSS( 21, 14) = 0.588897E+00 + PKER_RACCSS( 21, 15) = 0.392828E+00 + PKER_RACCSS( 21, 16) = 0.262954E+00 + PKER_RACCSS( 21, 17) = 0.199389E+00 + PKER_RACCSS( 21, 18) = 0.194569E+00 + PKER_RACCSS( 21, 19) = 0.231063E+00 + PKER_RACCSS( 21, 20) = 0.286983E+00 + PKER_RACCSS( 21, 21) = 0.344860E+00 + PKER_RACCSS( 21, 22) = 0.396111E+00 + PKER_RACCSS( 21, 23) = 0.438868E+00 + PKER_RACCSS( 21, 24) = 0.473989E+00 + PKER_RACCSS( 21, 25) = 0.502799E+00 + PKER_RACCSS( 21, 26) = 0.526459E+00 + PKER_RACCSS( 21, 27) = 0.545913E+00 + PKER_RACCSS( 21, 28) = 0.561925E+00 + PKER_RACCSS( 21, 29) = 0.575114E+00 + PKER_RACCSS( 21, 30) = 0.585987E+00 + PKER_RACCSS( 21, 31) = 0.594955E+00 + PKER_RACCSS( 21, 32) = 0.602355E+00 + PKER_RACCSS( 21, 33) = 0.608464E+00 + PKER_RACCSS( 21, 34) = 0.613509E+00 + PKER_RACCSS( 21, 35) = 0.617676E+00 + PKER_RACCSS( 21, 36) = 0.621119E+00 + PKER_RACCSS( 21, 37) = 0.623965E+00 + PKER_RACCSS( 21, 38) = 0.626316E+00 + PKER_RACCSS( 21, 39) = 0.628260E+00 + PKER_RACCSS( 21, 40) = 0.629867E+00 + PKER_RACCSS( 22, 1) = 0.150720E+02 + PKER_RACCSS( 22, 2) = 0.123594E+02 + PKER_RACCSS( 22, 3) = 0.101123E+02 + PKER_RACCSS( 22, 4) = 0.825051E+01 + PKER_RACCSS( 22, 5) = 0.670778E+01 + PKER_RACCSS( 22, 6) = 0.542920E+01 + PKER_RACCSS( 22, 7) = 0.436946E+01 + PKER_RACCSS( 22, 8) = 0.349113E+01 + PKER_RACCSS( 22, 9) = 0.276334E+01 + PKER_RACCSS( 22, 10) = 0.216073E+01 + PKER_RACCSS( 22, 11) = 0.166252E+01 + PKER_RACCSS( 22, 12) = 0.125192E+01 + PKER_RACCSS( 22, 13) = 0.915920E+00 + PKER_RACCSS( 22, 14) = 0.645535E+00 + PKER_RACCSS( 22, 15) = 0.436397E+00 + PKER_RACCSS( 22, 16) = 0.288654E+00 + PKER_RACCSS( 22, 17) = 0.203659E+00 + PKER_RACCSS( 22, 18) = 0.178071E+00 + PKER_RACCSS( 22, 19) = 0.199311E+00 + PKER_RACCSS( 22, 20) = 0.247192E+00 + PKER_RACCSS( 22, 21) = 0.302537E+00 + PKER_RACCSS( 22, 22) = 0.353781E+00 + PKER_RACCSS( 22, 23) = 0.397157E+00 + PKER_RACCSS( 22, 24) = 0.432857E+00 + PKER_RACCSS( 22, 25) = 0.462108E+00 + PKER_RACCSS( 22, 26) = 0.486096E+00 + PKER_RACCSS( 22, 27) = 0.505793E+00 + PKER_RACCSS( 22, 28) = 0.521983E+00 + PKER_RACCSS( 22, 29) = 0.535306E+00 + PKER_RACCSS( 22, 30) = 0.546278E+00 + PKER_RACCSS( 22, 31) = 0.555321E+00 + PKER_RACCSS( 22, 32) = 0.562778E+00 + PKER_RACCSS( 22, 33) = 0.568931E+00 + PKER_RACCSS( 22, 34) = 0.574009E+00 + PKER_RACCSS( 22, 35) = 0.578202E+00 + PKER_RACCSS( 22, 36) = 0.581665E+00 + PKER_RACCSS( 22, 37) = 0.584526E+00 + PKER_RACCSS( 22, 38) = 0.586889E+00 + PKER_RACCSS( 22, 39) = 0.588843E+00 + PKER_RACCSS( 22, 40) = 0.590457E+00 + PKER_RACCSS( 23, 1) = 0.150726E+02 + PKER_RACCSS( 23, 2) = 0.123607E+02 + PKER_RACCSS( 23, 3) = 0.101143E+02 + PKER_RACCSS( 23, 4) = 0.825344E+01 + PKER_RACCSS( 23, 5) = 0.671177E+01 + PKER_RACCSS( 23, 6) = 0.543448E+01 + PKER_RACCSS( 23, 7) = 0.437621E+01 + PKER_RACCSS( 23, 8) = 0.349956E+01 + PKER_RACCSS( 23, 9) = 0.277362E+01 + PKER_RACCSS( 23, 10) = 0.217295E+01 + PKER_RACCSS( 23, 11) = 0.167667E+01 + PKER_RACCSS( 23, 12) = 0.126773E+01 + PKER_RACCSS( 23, 13) = 0.932718E+00 + PKER_RACCSS( 23, 14) = 0.661907E+00 + PKER_RACCSS( 23, 15) = 0.449897E+00 + PKER_RACCSS( 23, 16) = 0.295961E+00 + PKER_RACCSS( 23, 17) = 0.201862E+00 + PKER_RACCSS( 23, 18) = 0.166501E+00 + PKER_RACCSS( 23, 19) = 0.180054E+00 + PKER_RACCSS( 23, 20) = 0.223817E+00 + PKER_RACCSS( 23, 21) = 0.277646E+00 + PKER_RACCSS( 23, 22) = 0.328410E+00 + PKER_RACCSS( 23, 23) = 0.371512E+00 + PKER_RACCSS( 23, 24) = 0.406971E+00 + PKER_RACCSS( 23, 25) = 0.436013E+00 + PKER_RACCSS( 23, 26) = 0.459823E+00 + PKER_RACCSS( 23, 27) = 0.479372E+00 + PKER_RACCSS( 23, 28) = 0.495442E+00 + PKER_RACCSS( 23, 29) = 0.508667E+00 + PKER_RACCSS( 23, 30) = 0.519559E+00 + PKER_RACCSS( 23, 31) = 0.528537E+00 + PKER_RACCSS( 23, 32) = 0.535942E+00 + PKER_RACCSS( 23, 33) = 0.542053E+00 + PKER_RACCSS( 23, 34) = 0.547098E+00 + PKER_RACCSS( 23, 35) = 0.551263E+00 + PKER_RACCSS( 23, 36) = 0.554705E+00 + PKER_RACCSS( 23, 37) = 0.557548E+00 + PKER_RACCSS( 23, 38) = 0.559898E+00 + PKER_RACCSS( 23, 39) = 0.561840E+00 + PKER_RACCSS( 23, 40) = 0.563446E+00 + PKER_RACCSS( 24, 1) = 0.151324E+02 + PKER_RACCSS( 24, 2) = 0.124216E+02 + PKER_RACCSS( 24, 3) = 0.101765E+02 + PKER_RACCSS( 24, 4) = 0.831675E+01 + PKER_RACCSS( 24, 5) = 0.677615E+01 + PKER_RACCSS( 24, 6) = 0.549978E+01 + PKER_RACCSS( 24, 7) = 0.444223E+01 + PKER_RACCSS( 24, 8) = 0.356597E+01 + PKER_RACCSS( 24, 9) = 0.284002E+01 + PKER_RACCSS( 24, 10) = 0.223881E+01 + PKER_RACCSS( 24, 11) = 0.174131E+01 + PKER_RACCSS( 24, 12) = 0.133030E+01 + PKER_RACCSS( 24, 13) = 0.992011E+00 + PKER_RACCSS( 24, 14) = 0.716009E+00 + PKER_RACCSS( 24, 15) = 0.495767E+00 + PKER_RACCSS( 24, 16) = 0.329155E+00 + PKER_RACCSS( 24, 17) = 0.217613E+00 + PKER_RACCSS( 24, 18) = 0.162580E+00 + PKER_RACCSS( 24, 19) = 0.158691E+00 + PKER_RACCSS( 24, 20) = 0.191157E+00 + PKER_RACCSS( 24, 21) = 0.240223E+00 + PKER_RACCSS( 24, 22) = 0.290187E+00 + PKER_RACCSS( 24, 23) = 0.333776E+00 + PKER_RACCSS( 24, 24) = 0.369843E+00 + PKER_RACCSS( 24, 25) = 0.399359E+00 + PKER_RACCSS( 24, 26) = 0.423520E+00 + PKER_RACCSS( 24, 27) = 0.443327E+00 + PKER_RACCSS( 24, 28) = 0.459588E+00 + PKER_RACCSS( 24, 29) = 0.472953E+00 + PKER_RACCSS( 24, 30) = 0.483950E+00 + PKER_RACCSS( 24, 31) = 0.493007E+00 + PKER_RACCSS( 24, 32) = 0.500470E+00 + PKER_RACCSS( 24, 33) = 0.506625E+00 + PKER_RACCSS( 24, 34) = 0.511703E+00 + PKER_RACCSS( 24, 35) = 0.515895E+00 + PKER_RACCSS( 24, 36) = 0.519356E+00 + PKER_RACCSS( 24, 37) = 0.522215E+00 + PKER_RACCSS( 24, 38) = 0.524576E+00 + PKER_RACCSS( 24, 39) = 0.526528E+00 + PKER_RACCSS( 24, 40) = 0.528140E+00 + PKER_RACCSS( 25, 1) = 0.151432E+02 + PKER_RACCSS( 25, 2) = 0.124328E+02 + PKER_RACCSS( 25, 3) = 0.101882E+02 + PKER_RACCSS( 25, 4) = 0.832899E+01 + PKER_RACCSS( 25, 5) = 0.678899E+01 + PKER_RACCSS( 25, 6) = 0.551328E+01 + PKER_RACCSS( 25, 7) = 0.445646E+01 + PKER_RACCSS( 25, 8) = 0.358099E+01 + PKER_RACCSS( 25, 9) = 0.285587E+01 + PKER_RACCSS( 25, 10) = 0.225550E+01 + PKER_RACCSS( 25, 11) = 0.175879E+01 + PKER_RACCSS( 25, 12) = 0.134845E+01 + PKER_RACCSS( 25, 13) = 0.101050E+01 + PKER_RACCSS( 25, 14) = 0.734111E+00 + PKER_RACCSS( 25, 15) = 0.512093E+00 + PKER_RACCSS( 25, 16) = 0.341419E+00 + PKER_RACCSS( 25, 17) = 0.223087E+00 + PKER_RACCSS( 25, 18) = 0.159345E+00 + PKER_RACCSS( 25, 19) = 0.147102E+00 + PKER_RACCSS( 25, 20) = 0.173839E+00 + PKER_RACCSS( 25, 21) = 0.220264E+00 + PKER_RACCSS( 25, 22) = 0.269389E+00 + PKER_RACCSS( 25, 23) = 0.312757E+00 + PKER_RACCSS( 25, 24) = 0.348700E+00 + PKER_RACCSS( 25, 25) = 0.378105E+00 + PKER_RACCSS( 25, 26) = 0.402161E+00 + PKER_RACCSS( 25, 27) = 0.421874E+00 + PKER_RACCSS( 25, 28) = 0.438052E+00 + PKER_RACCSS( 25, 29) = 0.451345E+00 + PKER_RACCSS( 25, 30) = 0.462282E+00 + PKER_RACCSS( 25, 31) = 0.471288E+00 + PKER_RACCSS( 25, 32) = 0.478709E+00 + PKER_RACCSS( 25, 33) = 0.484830E+00 + PKER_RACCSS( 25, 34) = 0.489880E+00 + PKER_RACCSS( 25, 35) = 0.494049E+00 + PKER_RACCSS( 25, 36) = 0.497492E+00 + PKER_RACCSS( 25, 37) = 0.500336E+00 + PKER_RACCSS( 25, 38) = 0.502685E+00 + PKER_RACCSS( 25, 39) = 0.504627E+00 + PKER_RACCSS( 25, 40) = 0.506233E+00 + PKER_RACCSS( 26, 1) = 0.151604E+02 + PKER_RACCSS( 26, 2) = 0.124505E+02 + PKER_RACCSS( 26, 3) = 0.102063E+02 + PKER_RACCSS( 26, 4) = 0.834759E+01 + PKER_RACCSS( 26, 5) = 0.680810E+01 + PKER_RACCSS( 26, 6) = 0.553290E+01 + PKER_RACCSS( 26, 7) = 0.447661E+01 + PKER_RACCSS( 26, 8) = 0.360165E+01 + PKER_RACCSS( 26, 9) = 0.287702E+01 + PKER_RACCSS( 26, 10) = 0.227707E+01 + PKER_RACCSS( 26, 11) = 0.178069E+01 + PKER_RACCSS( 26, 12) = 0.137049E+01 + PKER_RACCSS( 26, 13) = 0.103238E+01 + PKER_RACCSS( 26, 14) = 0.755232E+00 + PKER_RACCSS( 26, 15) = 0.531299E+00 + PKER_RACCSS( 26, 16) = 0.356723E+00 + PKER_RACCSS( 26, 17) = 0.231969E+00 + PKER_RACCSS( 26, 18) = 0.159466E+00 + PKER_RACCSS( 26, 19) = 0.138275E+00 + PKER_RACCSS( 26, 20) = 0.158408E+00 + PKER_RACCSS( 26, 21) = 0.201507E+00 + PKER_RACCSS( 26, 22) = 0.249601E+00 + PKER_RACCSS( 26, 23) = 0.292817E+00 + PKER_RACCSS( 26, 24) = 0.328766E+00 + PKER_RACCSS( 26, 25) = 0.358167E+00 + PKER_RACCSS( 26, 26) = 0.382203E+00 + PKER_RACCSS( 26, 27) = 0.401886E+00 + PKER_RACCSS( 26, 28) = 0.418030E+00 + PKER_RACCSS( 26, 29) = 0.431290E+00 + PKER_RACCSS( 26, 30) = 0.442195E+00 + PKER_RACCSS( 26, 31) = 0.451173E+00 + PKER_RACCSS( 26, 32) = 0.458570E+00 + PKER_RACCSS( 26, 33) = 0.464669E+00 + PKER_RACCSS( 26, 34) = 0.469702E+00 + PKER_RACCSS( 26, 35) = 0.473856E+00 + PKER_RACCSS( 26, 36) = 0.477287E+00 + PKER_RACCSS( 26, 37) = 0.480121E+00 + PKER_RACCSS( 26, 38) = 0.482463E+00 + PKER_RACCSS( 26, 39) = 0.484399E+00 + PKER_RACCSS( 26, 40) = 0.485999E+00 + PKER_RACCSS( 27, 1) = 0.151814E+02 + PKER_RACCSS( 27, 2) = 0.124719E+02 + PKER_RACCSS( 27, 3) = 0.102281E+02 + PKER_RACCSS( 27, 4) = 0.836990E+01 + PKER_RACCSS( 27, 5) = 0.683086E+01 + PKER_RACCSS( 27, 6) = 0.555611E+01 + PKER_RACCSS( 27, 7) = 0.450023E+01 + PKER_RACCSS( 27, 8) = 0.362567E+01 + PKER_RACCSS( 27, 9) = 0.290135E+01 + PKER_RACCSS( 27, 10) = 0.230164E+01 + PKER_RACCSS( 27, 11) = 0.180536E+01 + PKER_RACCSS( 27, 12) = 0.139509E+01 + PKER_RACCSS( 27, 13) = 0.105660E+01 + PKER_RACCSS( 27, 14) = 0.778555E+00 + PKER_RACCSS( 27, 15) = 0.552744E+00 + PKER_RACCSS( 27, 16) = 0.374600E+00 + PKER_RACCSS( 27, 17) = 0.243637E+00 + PKER_RACCSS( 27, 18) = 0.162579E+00 + PKER_RACCSS( 27, 19) = 0.131954E+00 + PKER_RACCSS( 27, 20) = 0.144584E+00 + PKER_RACCSS( 27, 21) = 0.183443E+00 + PKER_RACCSS( 27, 22) = 0.230184E+00 + PKER_RACCSS( 27, 23) = 0.273243E+00 + PKER_RACCSS( 27, 24) = 0.309289E+00 + PKER_RACCSS( 27, 25) = 0.338774E+00 + PKER_RACCSS( 27, 26) = 0.362856E+00 + PKER_RACCSS( 27, 27) = 0.382560E+00 + PKER_RACCSS( 27, 28) = 0.398710E+00 + PKER_RACCSS( 27, 29) = 0.411966E+00 + PKER_RACCSS( 27, 30) = 0.422862E+00 + PKER_RACCSS( 27, 31) = 0.431828E+00 + PKER_RACCSS( 27, 32) = 0.439214E+00 + PKER_RACCSS( 27, 33) = 0.445302E+00 + PKER_RACCSS( 27, 34) = 0.450325E+00 + PKER_RACCSS( 27, 35) = 0.454471E+00 + PKER_RACCSS( 27, 36) = 0.457894E+00 + PKER_RACCSS( 27, 37) = 0.460722E+00 + PKER_RACCSS( 27, 38) = 0.463059E+00 + PKER_RACCSS( 27, 39) = 0.464990E+00 + PKER_RACCSS( 27, 40) = 0.466587E+00 + PKER_RACCSS( 28, 1) = 0.151833E+02 + PKER_RACCSS( 28, 2) = 0.124739E+02 + PKER_RACCSS( 28, 3) = 0.102303E+02 + PKER_RACCSS( 28, 4) = 0.837216E+01 + PKER_RACCSS( 28, 5) = 0.683329E+01 + PKER_RACCSS( 28, 6) = 0.555874E+01 + PKER_RACCSS( 28, 7) = 0.450309E+01 + PKER_RACCSS( 28, 8) = 0.362879E+01 + PKER_RACCSS( 28, 9) = 0.290477E+01 + PKER_RACCSS( 28, 10) = 0.230538E+01 + PKER_RACCSS( 28, 11) = 0.180946E+01 + PKER_RACCSS( 28, 12) = 0.139955E+01 + PKER_RACCSS( 28, 13) = 0.106140E+01 + PKER_RACCSS( 28, 14) = 0.783576E+00 + PKER_RACCSS( 28, 15) = 0.557673E+00 + PKER_RACCSS( 28, 16) = 0.378779E+00 + PKER_RACCSS( 28, 17) = 0.246210E+00 + PKER_RACCSS( 28, 18) = 0.162452E+00 + PKER_RACCSS( 28, 19) = 0.128861E+00 + PKER_RACCSS( 28, 20) = 0.138936E+00 + PKER_RACCSS( 28, 21) = 0.176459E+00 + PKER_RACCSS( 28, 22) = 0.222625E+00 + PKER_RACCSS( 28, 23) = 0.265456E+00 + PKER_RACCSS( 28, 24) = 0.301332E+00 + PKER_RACCSS( 28, 25) = 0.330667E+00 + PKER_RACCSS( 28, 26) = 0.354619E+00 + PKER_RACCSS( 28, 27) = 0.374211E+00 + PKER_RACCSS( 28, 28) = 0.390266E+00 + PKER_RACCSS( 28, 29) = 0.403443E+00 + PKER_RACCSS( 28, 30) = 0.414273E+00 + PKER_RACCSS( 28, 31) = 0.423185E+00 + PKER_RACCSS( 28, 32) = 0.430527E+00 + PKER_RACCSS( 28, 33) = 0.436580E+00 + PKER_RACCSS( 28, 34) = 0.441573E+00 + PKER_RACCSS( 28, 35) = 0.445696E+00 + PKER_RACCSS( 28, 36) = 0.449101E+00 + PKER_RACCSS( 28, 37) = 0.451914E+00 + PKER_RACCSS( 28, 38) = 0.454239E+00 + PKER_RACCSS( 28, 39) = 0.456161E+00 + PKER_RACCSS( 28, 40) = 0.457750E+00 + PKER_RACCSS( 29, 1) = 0.151936E+02 + PKER_RACCSS( 29, 2) = 0.124845E+02 + PKER_RACCSS( 29, 3) = 0.102410E+02 + PKER_RACCSS( 29, 4) = 0.838316E+01 + PKER_RACCSS( 29, 5) = 0.684451E+01 + PKER_RACCSS( 29, 6) = 0.557018E+01 + PKER_RACCSS( 29, 7) = 0.451475E+01 + PKER_RACCSS( 29, 8) = 0.364064E+01 + PKER_RACCSS( 29, 9) = 0.291680E+01 + PKER_RACCSS( 29, 10) = 0.231756E+01 + PKER_RACCSS( 29, 11) = 0.182172E+01 + PKER_RACCSS( 29, 12) = 0.141183E+01 + PKER_RACCSS( 29, 13) = 0.107359E+01 + PKER_RACCSS( 29, 14) = 0.795449E+00 + PKER_RACCSS( 29, 15) = 0.568820E+00 + PKER_RACCSS( 29, 16) = 0.388406E+00 + PKER_RACCSS( 29, 17) = 0.253055E+00 + PKER_RACCSS( 29, 18) = 0.165100E+00 + PKER_RACCSS( 29, 19) = 0.126486E+00 + PKER_RACCSS( 29, 20) = 0.132218E+00 + PKER_RACCSS( 29, 21) = 0.167127E+00 + PKER_RACCSS( 29, 22) = 0.212335E+00 + PKER_RACCSS( 29, 23) = 0.254984E+00 + PKER_RACCSS( 29, 24) = 0.290865E+00 + PKER_RACCSS( 29, 25) = 0.320207E+00 + PKER_RACCSS( 29, 26) = 0.344152E+00 + PKER_RACCSS( 29, 27) = 0.363727E+00 + PKER_RACCSS( 29, 28) = 0.379760E+00 + PKER_RACCSS( 29, 29) = 0.392914E+00 + PKER_RACCSS( 29, 30) = 0.403723E+00 + PKER_RACCSS( 29, 31) = 0.412615E+00 + PKER_RACCSS( 29, 32) = 0.419938E+00 + PKER_RACCSS( 29, 33) = 0.425976E+00 + PKER_RACCSS( 29, 34) = 0.430956E+00 + PKER_RACCSS( 29, 35) = 0.435068E+00 + PKER_RACCSS( 29, 36) = 0.438464E+00 + PKER_RACCSS( 29, 37) = 0.441269E+00 + PKER_RACCSS( 29, 38) = 0.443588E+00 + PKER_RACCSS( 29, 39) = 0.445506E+00 + PKER_RACCSS( 29, 40) = 0.447091E+00 + PKER_RACCSS( 30, 1) = 0.152092E+02 + PKER_RACCSS( 30, 2) = 0.125003E+02 + PKER_RACCSS( 30, 3) = 0.102571E+02 + PKER_RACCSS( 30, 4) = 0.839954E+01 + PKER_RACCSS( 30, 5) = 0.686114E+01 + PKER_RACCSS( 30, 6) = 0.558706E+01 + PKER_RACCSS( 30, 7) = 0.453184E+01 + PKER_RACCSS( 30, 8) = 0.365791E+01 + PKER_RACCSS( 30, 9) = 0.293420E+01 + PKER_RACCSS( 30, 10) = 0.233502E+01 + PKER_RACCSS( 30, 11) = 0.183917E+01 + PKER_RACCSS( 30, 12) = 0.142914E+01 + PKER_RACCSS( 30, 13) = 0.109060E+01 + PKER_RACCSS( 30, 14) = 0.811894E+00 + PKER_RACCSS( 30, 15) = 0.584240E+00 + PKER_RACCSS( 30, 16) = 0.401963E+00 + PKER_RACCSS( 30, 17) = 0.263204E+00 + PKER_RACCSS( 30, 18) = 0.170121E+00 + PKER_RACCSS( 30, 19) = 0.125069E+00 + PKER_RACCSS( 30, 20) = 0.124997E+00 + PKER_RACCSS( 30, 21) = 0.156156E+00 + PKER_RACCSS( 30, 22) = 0.199916E+00 + PKER_RACCSS( 30, 23) = 0.242350E+00 + PKER_RACCSS( 30, 24) = 0.278332E+00 + PKER_RACCSS( 30, 25) = 0.307780E+00 + PKER_RACCSS( 30, 26) = 0.331793E+00 + PKER_RACCSS( 30, 27) = 0.351410E+00 + PKER_RACCSS( 30, 28) = 0.367466E+00 + PKER_RACCSS( 30, 29) = 0.380631E+00 + PKER_RACCSS( 30, 30) = 0.391442E+00 + PKER_RACCSS( 30, 31) = 0.400333E+00 + PKER_RACCSS( 30, 32) = 0.407654E+00 + PKER_RACCSS( 30, 33) = 0.413687E+00 + PKER_RACCSS( 30, 34) = 0.418663E+00 + PKER_RACCSS( 30, 35) = 0.422770E+00 + PKER_RACCSS( 30, 36) = 0.426162E+00 + PKER_RACCSS( 30, 37) = 0.428964E+00 + PKER_RACCSS( 30, 38) = 0.431280E+00 + PKER_RACCSS( 30, 39) = 0.433195E+00 + PKER_RACCSS( 30, 40) = 0.434778E+00 + PKER_RACCSS( 31, 1) = 0.152168E+02 + PKER_RACCSS( 31, 2) = 0.125081E+02 + PKER_RACCSS( 31, 3) = 0.102650E+02 + PKER_RACCSS( 31, 4) = 0.840757E+01 + PKER_RACCSS( 31, 5) = 0.686932E+01 + PKER_RACCSS( 31, 6) = 0.559536E+01 + PKER_RACCSS( 31, 7) = 0.454028E+01 + PKER_RACCSS( 31, 8) = 0.366647E+01 + PKER_RACCSS( 31, 9) = 0.294286E+01 + PKER_RACCSS( 31, 10) = 0.234375E+01 + PKER_RACCSS( 31, 11) = 0.184793E+01 + PKER_RACCSS( 31, 12) = 0.143790E+01 + PKER_RACCSS( 31, 13) = 0.109928E+01 + PKER_RACCSS( 31, 14) = 0.820370E+00 + PKER_RACCSS( 31, 15) = 0.592284E+00 + PKER_RACCSS( 31, 16) = 0.409147E+00 + PKER_RACCSS( 31, 17) = 0.268707E+00 + PKER_RACCSS( 31, 18) = 0.172988E+00 + PKER_RACCSS( 31, 19) = 0.124548E+00 + PKER_RACCSS( 31, 20) = 0.121193E+00 + PKER_RACCSS( 31, 21) = 0.150187E+00 + PKER_RACCSS( 31, 22) = 0.193042E+00 + PKER_RACCSS( 31, 23) = 0.235298E+00 + PKER_RACCSS( 31, 24) = 0.271298E+00 + PKER_RACCSS( 31, 25) = 0.300774E+00 + PKER_RACCSS( 31, 26) = 0.324800E+00 + PKER_RACCSS( 31, 27) = 0.344418E+00 + PKER_RACCSS( 31, 28) = 0.360469E+00 + PKER_RACCSS( 31, 29) = 0.373626E+00 + PKER_RACCSS( 31, 30) = 0.384427E+00 + PKER_RACCSS( 31, 31) = 0.393308E+00 + PKER_RACCSS( 31, 32) = 0.400619E+00 + PKER_RACCSS( 31, 33) = 0.406643E+00 + PKER_RACCSS( 31, 34) = 0.411612E+00 + PKER_RACCSS( 31, 35) = 0.415713E+00 + PKER_RACCSS( 31, 36) = 0.419099E+00 + PKER_RACCSS( 31, 37) = 0.421897E+00 + PKER_RACCSS( 31, 38) = 0.424209E+00 + PKER_RACCSS( 31, 39) = 0.426121E+00 + PKER_RACCSS( 31, 40) = 0.427702E+00 + PKER_RACCSS( 32, 1) = 0.152212E+02 + PKER_RACCSS( 32, 2) = 0.125125E+02 + PKER_RACCSS( 32, 3) = 0.102696E+02 + PKER_RACCSS( 32, 4) = 0.841222E+01 + PKER_RACCSS( 32, 5) = 0.687405E+01 + PKER_RACCSS( 32, 6) = 0.560018E+01 + PKER_RACCSS( 32, 7) = 0.454517E+01 + PKER_RACCSS( 32, 8) = 0.367144E+01 + PKER_RACCSS( 32, 9) = 0.294789E+01 + PKER_RACCSS( 32, 10) = 0.234884E+01 + PKER_RACCSS( 32, 11) = 0.185306E+01 + PKER_RACCSS( 32, 12) = 0.144305E+01 + PKER_RACCSS( 32, 13) = 0.110439E+01 + PKER_RACCSS( 32, 14) = 0.825390E+00 + PKER_RACCSS( 32, 15) = 0.597084E+00 + PKER_RACCSS( 32, 16) = 0.413476E+00 + PKER_RACCSS( 32, 17) = 0.272077E+00 + PKER_RACCSS( 32, 18) = 0.174803E+00 + PKER_RACCSS( 32, 19) = 0.124293E+00 + PKER_RACCSS( 32, 20) = 0.118931E+00 + PKER_RACCSS( 32, 21) = 0.146554E+00 + PKER_RACCSS( 32, 22) = 0.188828E+00 + PKER_RACCSS( 32, 23) = 0.230954E+00 + PKER_RACCSS( 32, 24) = 0.266952E+00 + PKER_RACCSS( 32, 25) = 0.296435E+00 + PKER_RACCSS( 32, 26) = 0.320462E+00 + PKER_RACCSS( 32, 27) = 0.340075E+00 + PKER_RACCSS( 32, 28) = 0.356117E+00 + PKER_RACCSS( 32, 29) = 0.369263E+00 + PKER_RACCSS( 32, 30) = 0.380055E+00 + PKER_RACCSS( 32, 31) = 0.388926E+00 + PKER_RACCSS( 32, 32) = 0.396228E+00 + PKER_RACCSS( 32, 33) = 0.402245E+00 + PKER_RACCSS( 32, 34) = 0.407208E+00 + PKER_RACCSS( 32, 35) = 0.411303E+00 + PKER_RACCSS( 32, 36) = 0.414685E+00 + PKER_RACCSS( 32, 37) = 0.417479E+00 + PKER_RACCSS( 32, 38) = 0.419788E+00 + PKER_RACCSS( 32, 39) = 0.421697E+00 + PKER_RACCSS( 32, 40) = 0.423276E+00 + PKER_RACCSS( 33, 1) = 0.152252E+02 + PKER_RACCSS( 33, 2) = 0.125166E+02 + PKER_RACCSS( 33, 3) = 0.102737E+02 + PKER_RACCSS( 33, 4) = 0.841642E+01 + PKER_RACCSS( 33, 5) = 0.687832E+01 + PKER_RACCSS( 33, 6) = 0.560452E+01 + PKER_RACCSS( 33, 7) = 0.454958E+01 + PKER_RACCSS( 33, 8) = 0.367590E+01 + PKER_RACCSS( 33, 9) = 0.295241E+01 + PKER_RACCSS( 33, 10) = 0.235339E+01 + PKER_RACCSS( 33, 11) = 0.185763E+01 + PKER_RACCSS( 33, 12) = 0.144761E+01 + PKER_RACCSS( 33, 13) = 0.110891E+01 + PKER_RACCSS( 33, 14) = 0.829809E+00 + PKER_RACCSS( 33, 15) = 0.601298E+00 + PKER_RACCSS( 33, 16) = 0.417299E+00 + PKER_RACCSS( 33, 17) = 0.275084E+00 + PKER_RACCSS( 33, 18) = 0.176517E+00 + PKER_RACCSS( 33, 19) = 0.124255E+00 + PKER_RACCSS( 33, 20) = 0.117165E+00 + PKER_RACCSS( 33, 21) = 0.143564E+00 + PKER_RACCSS( 33, 22) = 0.185315E+00 + PKER_RACCSS( 33, 23) = 0.227330E+00 + PKER_RACCSS( 33, 24) = 0.263338E+00 + PKER_RACCSS( 33, 25) = 0.292840E+00 + PKER_RACCSS( 33, 26) = 0.316875E+00 + PKER_RACCSS( 33, 27) = 0.336491E+00 + PKER_RACCSS( 33, 28) = 0.352533E+00 + PKER_RACCSS( 33, 29) = 0.365676E+00 + PKER_RACCSS( 33, 30) = 0.376463E+00 + PKER_RACCSS( 33, 31) = 0.385329E+00 + PKER_RACCSS( 33, 32) = 0.392627E+00 + PKER_RACCSS( 33, 33) = 0.398639E+00 + PKER_RACCSS( 33, 34) = 0.403598E+00 + PKER_RACCSS( 33, 35) = 0.407690E+00 + PKER_RACCSS( 33, 36) = 0.411069E+00 + PKER_RACCSS( 33, 37) = 0.413860E+00 + PKER_RACCSS( 33, 38) = 0.416168E+00 + PKER_RACCSS( 33, 39) = 0.418075E+00 + PKER_RACCSS( 33, 40) = 0.419653E+00 + PKER_RACCSS( 34, 1) = 0.152248E+02 + PKER_RACCSS( 34, 2) = 0.125162E+02 + PKER_RACCSS( 34, 3) = 0.102733E+02 + PKER_RACCSS( 34, 4) = 0.841600E+01 + PKER_RACCSS( 34, 5) = 0.687791E+01 + PKER_RACCSS( 34, 6) = 0.560412E+01 + PKER_RACCSS( 34, 7) = 0.454919E+01 + PKER_RACCSS( 34, 8) = 0.367553E+01 + PKER_RACCSS( 34, 9) = 0.295206E+01 + PKER_RACCSS( 34, 10) = 0.235307E+01 + PKER_RACCSS( 34, 11) = 0.185734E+01 + PKER_RACCSS( 34, 12) = 0.144736E+01 + PKER_RACCSS( 34, 13) = 0.110872E+01 + PKER_RACCSS( 34, 14) = 0.829656E+00 + PKER_RACCSS( 34, 15) = 0.601205E+00 + PKER_RACCSS( 34, 16) = 0.417236E+00 + PKER_RACCSS( 34, 17) = 0.275045E+00 + PKER_RACCSS( 34, 18) = 0.176424E+00 + PKER_RACCSS( 34, 19) = 0.124044E+00 + PKER_RACCSS( 34, 20) = 0.116894E+00 + PKER_RACCSS( 34, 21) = 0.143258E+00 + PKER_RACCSS( 34, 22) = 0.184999E+00 + PKER_RACCSS( 34, 23) = 0.226991E+00 + PKER_RACCSS( 34, 24) = 0.262972E+00 + PKER_RACCSS( 34, 25) = 0.292447E+00 + PKER_RACCSS( 34, 26) = 0.316461E+00 + PKER_RACCSS( 34, 27) = 0.336058E+00 + PKER_RACCSS( 34, 28) = 0.352084E+00 + PKER_RACCSS( 34, 29) = 0.365214E+00 + PKER_RACCSS( 34, 30) = 0.375991E+00 + PKER_RACCSS( 34, 31) = 0.384849E+00 + PKER_RACCSS( 34, 32) = 0.392140E+00 + PKER_RACCSS( 34, 33) = 0.398147E+00 + PKER_RACCSS( 34, 34) = 0.403101E+00 + PKER_RACCSS( 34, 35) = 0.407190E+00 + PKER_RACCSS( 34, 36) = 0.410566E+00 + PKER_RACCSS( 34, 37) = 0.413355E+00 + PKER_RACCSS( 34, 38) = 0.415661E+00 + PKER_RACCSS( 34, 39) = 0.417567E+00 + PKER_RACCSS( 34, 40) = 0.419144E+00 + PKER_RACCSS( 35, 1) = 0.152287E+02 + PKER_RACCSS( 35, 2) = 0.125202E+02 + PKER_RACCSS( 35, 3) = 0.102773E+02 + PKER_RACCSS( 35, 4) = 0.842010E+01 + PKER_RACCSS( 35, 5) = 0.688207E+01 + PKER_RACCSS( 35, 6) = 0.560834E+01 + PKER_RACCSS( 35, 7) = 0.455346E+01 + PKER_RACCSS( 35, 8) = 0.367984E+01 + PKER_RACCSS( 35, 9) = 0.295641E+01 + PKER_RACCSS( 35, 10) = 0.235744E+01 + PKER_RACCSS( 35, 11) = 0.186171E+01 + PKER_RACCSS( 35, 12) = 0.145171E+01 + PKER_RACCSS( 35, 13) = 0.111300E+01 + PKER_RACCSS( 35, 14) = 0.833823E+00 + PKER_RACCSS( 35, 15) = 0.605161E+00 + PKER_RACCSS( 35, 16) = 0.420842E+00 + PKER_RACCSS( 35, 17) = 0.277903E+00 + PKER_RACCSS( 35, 18) = 0.178147E+00 + PKER_RACCSS( 35, 19) = 0.124171E+00 + PKER_RACCSS( 35, 20) = 0.115464E+00 + PKER_RACCSS( 35, 21) = 0.140674E+00 + PKER_RACCSS( 35, 22) = 0.181919E+00 + PKER_RACCSS( 35, 23) = 0.223809E+00 + PKER_RACCSS( 35, 24) = 0.259812E+00 + PKER_RACCSS( 35, 25) = 0.289318E+00 + PKER_RACCSS( 35, 26) = 0.313352E+00 + PKER_RACCSS( 35, 27) = 0.332962E+00 + PKER_RACCSS( 35, 28) = 0.348995E+00 + PKER_RACCSS( 35, 29) = 0.362129E+00 + PKER_RACCSS( 35, 30) = 0.372907E+00 + PKER_RACCSS( 35, 31) = 0.381764E+00 + PKER_RACCSS( 35, 32) = 0.389054E+00 + PKER_RACCSS( 35, 33) = 0.395060E+00 + PKER_RACCSS( 35, 34) = 0.400012E+00 + PKER_RACCSS( 35, 35) = 0.404099E+00 + PKER_RACCSS( 35, 36) = 0.407474E+00 + PKER_RACCSS( 35, 37) = 0.410263E+00 + PKER_RACCSS( 35, 38) = 0.412567E+00 + PKER_RACCSS( 35, 39) = 0.414473E+00 + PKER_RACCSS( 35, 40) = 0.416049E+00 + PKER_RACCSS( 36, 1) = 0.152383E+02 + PKER_RACCSS( 36, 2) = 0.125299E+02 + PKER_RACCSS( 36, 3) = 0.102873E+02 + PKER_RACCSS( 36, 4) = 0.843016E+01 + PKER_RACCSS( 36, 5) = 0.689226E+01 + PKER_RACCSS( 36, 6) = 0.561865E+01 + PKER_RACCSS( 36, 7) = 0.456388E+01 + PKER_RACCSS( 36, 8) = 0.369036E+01 + PKER_RACCSS( 36, 9) = 0.296698E+01 + PKER_RACCSS( 36, 10) = 0.236804E+01 + PKER_RACCSS( 36, 11) = 0.187228E+01 + PKER_RACCSS( 36, 12) = 0.146219E+01 + PKER_RACCSS( 36, 13) = 0.112330E+01 + PKER_RACCSS( 36, 14) = 0.843833E+00 + PKER_RACCSS( 36, 15) = 0.614630E+00 + PKER_RACCSS( 36, 16) = 0.429489E+00 + PKER_RACCSS( 36, 17) = 0.284782E+00 + PKER_RACCSS( 36, 18) = 0.182494E+00 + PKER_RACCSS( 36, 19) = 0.124882E+00 + PKER_RACCSS( 36, 20) = 0.112591E+00 + PKER_RACCSS( 36, 21) = 0.135019E+00 + PKER_RACCSS( 36, 22) = 0.174978E+00 + PKER_RACCSS( 36, 23) = 0.216615E+00 + PKER_RACCSS( 36, 24) = 0.252695E+00 + PKER_RACCSS( 36, 25) = 0.282303E+00 + PKER_RACCSS( 36, 26) = 0.306412E+00 + PKER_RACCSS( 36, 27) = 0.326073E+00 + PKER_RACCSS( 36, 28) = 0.342140E+00 + PKER_RACCSS( 36, 29) = 0.355295E+00 + PKER_RACCSS( 36, 30) = 0.366087E+00 + PKER_RACCSS( 36, 31) = 0.374952E+00 + PKER_RACCSS( 36, 32) = 0.382247E+00 + PKER_RACCSS( 36, 33) = 0.388255E+00 + PKER_RACCSS( 36, 34) = 0.393208E+00 + PKER_RACCSS( 36, 35) = 0.397296E+00 + PKER_RACCSS( 36, 36) = 0.400670E+00 + PKER_RACCSS( 36, 37) = 0.403458E+00 + PKER_RACCSS( 36, 38) = 0.405763E+00 + PKER_RACCSS( 36, 39) = 0.407668E+00 + PKER_RACCSS( 36, 40) = 0.409243E+00 + PKER_RACCSS( 37, 1) = 0.000000E+00 + PKER_RACCSS( 37, 2) = 0.000000E+00 + PKER_RACCSS( 37, 3) = 0.000000E+00 + PKER_RACCSS( 37, 4) = 0.000000E+00 + PKER_RACCSS( 37, 5) = 0.000000E+00 + PKER_RACCSS( 37, 6) = 0.000000E+00 + PKER_RACCSS( 37, 7) = 0.000000E+00 + PKER_RACCSS( 37, 8) = 0.000000E+00 + PKER_RACCSS( 37, 9) = 0.000000E+00 + PKER_RACCSS( 37, 10) = 0.000000E+00 + PKER_RACCSS( 37, 11) = 0.000000E+00 + PKER_RACCSS( 37, 12) = 0.000000E+00 + PKER_RACCSS( 37, 13) = 0.000000E+00 + PKER_RACCSS( 37, 14) = 0.000000E+00 + PKER_RACCSS( 37, 15) = 0.000000E+00 + PKER_RACCSS( 37, 16) = 0.000000E+00 + PKER_RACCSS( 37, 17) = 0.000000E+00 + PKER_RACCSS( 37, 18) = 0.000000E+00 + PKER_RACCSS( 37, 19) = 0.000000E+00 + PKER_RACCSS( 37, 20) = 0.000000E+00 + PKER_RACCSS( 37, 21) = 0.000000E+00 + PKER_RACCSS( 37, 22) = 0.000000E+00 + PKER_RACCSS( 37, 23) = 0.000000E+00 + PKER_RACCSS( 37, 24) = 0.000000E+00 + PKER_RACCSS( 37, 25) = 0.000000E+00 + PKER_RACCSS( 37, 26) = 0.000000E+00 + PKER_RACCSS( 37, 27) = 0.000000E+00 + PKER_RACCSS( 37, 28) = 0.000000E+00 + PKER_RACCSS( 37, 29) = 0.000000E+00 + PKER_RACCSS( 37, 30) = 0.000000E+00 + PKER_RACCSS( 37, 31) = 0.000000E+00 + PKER_RACCSS( 37, 32) = 0.000000E+00 + PKER_RACCSS( 37, 33) = 0.000000E+00 + PKER_RACCSS( 37, 34) = 0.000000E+00 + PKER_RACCSS( 37, 35) = 0.000000E+00 + PKER_RACCSS( 37, 36) = 0.000000E+00 + PKER_RACCSS( 37, 37) = 0.000000E+00 + PKER_RACCSS( 37, 38) = 0.000000E+00 + PKER_RACCSS( 37, 39) = 0.000000E+00 + PKER_RACCSS( 37, 40) = 0.000000E+00 + PKER_RACCSS( 38, 1) = 0.000000E+00 + PKER_RACCSS( 38, 2) = 0.000000E+00 + PKER_RACCSS( 38, 3) = 0.000000E+00 + PKER_RACCSS( 38, 4) = 0.000000E+00 + PKER_RACCSS( 38, 5) = 0.000000E+00 + PKER_RACCSS( 38, 6) = 0.000000E+00 + PKER_RACCSS( 38, 7) = 0.000000E+00 + PKER_RACCSS( 38, 8) = 0.000000E+00 + PKER_RACCSS( 38, 9) = 0.000000E+00 + PKER_RACCSS( 38, 10) = 0.000000E+00 + PKER_RACCSS( 38, 11) = 0.000000E+00 + PKER_RACCSS( 38, 12) = 0.000000E+00 + PKER_RACCSS( 38, 13) = 0.000000E+00 + PKER_RACCSS( 38, 14) = 0.000000E+00 + PKER_RACCSS( 38, 15) = 0.000000E+00 + PKER_RACCSS( 38, 16) = 0.000000E+00 + PKER_RACCSS( 38, 17) = 0.000000E+00 + PKER_RACCSS( 38, 18) = 0.000000E+00 + PKER_RACCSS( 38, 19) = 0.000000E+00 + PKER_RACCSS( 38, 20) = 0.000000E+00 + PKER_RACCSS( 38, 21) = 0.000000E+00 + PKER_RACCSS( 38, 22) = 0.000000E+00 + PKER_RACCSS( 38, 23) = 0.000000E+00 + PKER_RACCSS( 38, 24) = 0.000000E+00 + PKER_RACCSS( 38, 25) = 0.000000E+00 + PKER_RACCSS( 38, 26) = 0.000000E+00 + PKER_RACCSS( 38, 27) = 0.000000E+00 + PKER_RACCSS( 38, 28) = 0.000000E+00 + PKER_RACCSS( 38, 29) = 0.000000E+00 + PKER_RACCSS( 38, 30) = 0.000000E+00 + PKER_RACCSS( 38, 31) = 0.000000E+00 + PKER_RACCSS( 38, 32) = 0.000000E+00 + PKER_RACCSS( 38, 33) = 0.000000E+00 + PKER_RACCSS( 38, 34) = 0.000000E+00 + PKER_RACCSS( 38, 35) = 0.000000E+00 + PKER_RACCSS( 38, 36) = 0.000000E+00 + PKER_RACCSS( 38, 37) = 0.000000E+00 + PKER_RACCSS( 38, 38) = 0.000000E+00 + PKER_RACCSS( 38, 39) = 0.000000E+00 + PKER_RACCSS( 38, 40) = 0.000000E+00 + PKER_RACCSS( 39, 1) = 0.000000E+00 + PKER_RACCSS( 39, 2) = 0.000000E+00 + PKER_RACCSS( 39, 3) = 0.000000E+00 + PKER_RACCSS( 39, 4) = 0.000000E+00 + PKER_RACCSS( 39, 5) = 0.000000E+00 + PKER_RACCSS( 39, 6) = 0.000000E+00 + PKER_RACCSS( 39, 7) = 0.000000E+00 + PKER_RACCSS( 39, 8) = 0.000000E+00 + PKER_RACCSS( 39, 9) = 0.000000E+00 + PKER_RACCSS( 39, 10) = 0.000000E+00 + PKER_RACCSS( 39, 11) = 0.000000E+00 + PKER_RACCSS( 39, 12) = 0.000000E+00 + PKER_RACCSS( 39, 13) = 0.000000E+00 + PKER_RACCSS( 39, 14) = 0.000000E+00 + PKER_RACCSS( 39, 15) = 0.000000E+00 + PKER_RACCSS( 39, 16) = 0.000000E+00 + PKER_RACCSS( 39, 17) = 0.000000E+00 + PKER_RACCSS( 39, 18) = 0.000000E+00 + PKER_RACCSS( 39, 19) = 0.000000E+00 + PKER_RACCSS( 39, 20) = 0.000000E+00 + PKER_RACCSS( 39, 21) = 0.000000E+00 + PKER_RACCSS( 39, 22) = 0.000000E+00 + PKER_RACCSS( 39, 23) = 0.000000E+00 + PKER_RACCSS( 39, 24) = 0.000000E+00 + PKER_RACCSS( 39, 25) = 0.000000E+00 + PKER_RACCSS( 39, 26) = 0.000000E+00 + PKER_RACCSS( 39, 27) = 0.000000E+00 + PKER_RACCSS( 39, 28) = 0.000000E+00 + PKER_RACCSS( 39, 29) = 0.000000E+00 + PKER_RACCSS( 39, 30) = 0.000000E+00 + PKER_RACCSS( 39, 31) = 0.000000E+00 + PKER_RACCSS( 39, 32) = 0.000000E+00 + PKER_RACCSS( 39, 33) = 0.000000E+00 + PKER_RACCSS( 39, 34) = 0.000000E+00 + PKER_RACCSS( 39, 35) = 0.000000E+00 + PKER_RACCSS( 39, 36) = 0.000000E+00 + PKER_RACCSS( 39, 37) = 0.000000E+00 + PKER_RACCSS( 39, 38) = 0.000000E+00 + PKER_RACCSS( 39, 39) = 0.000000E+00 + PKER_RACCSS( 39, 40) = 0.000000E+00 + PKER_RACCSS( 40, 1) = 0.000000E+00 + PKER_RACCSS( 40, 2) = 0.000000E+00 + PKER_RACCSS( 40, 3) = 0.000000E+00 + PKER_RACCSS( 40, 4) = 0.000000E+00 + PKER_RACCSS( 40, 5) = 0.000000E+00 + PKER_RACCSS( 40, 6) = 0.000000E+00 + PKER_RACCSS( 40, 7) = 0.000000E+00 + PKER_RACCSS( 40, 8) = 0.000000E+00 + PKER_RACCSS( 40, 9) = 0.000000E+00 + PKER_RACCSS( 40, 10) = 0.000000E+00 + PKER_RACCSS( 40, 11) = 0.000000E+00 + PKER_RACCSS( 40, 12) = 0.000000E+00 + PKER_RACCSS( 40, 13) = 0.000000E+00 + PKER_RACCSS( 40, 14) = 0.000000E+00 + PKER_RACCSS( 40, 15) = 0.000000E+00 + PKER_RACCSS( 40, 16) = 0.000000E+00 + PKER_RACCSS( 40, 17) = 0.000000E+00 + PKER_RACCSS( 40, 18) = 0.000000E+00 + PKER_RACCSS( 40, 19) = 0.000000E+00 + PKER_RACCSS( 40, 20) = 0.000000E+00 + PKER_RACCSS( 40, 21) = 0.000000E+00 + PKER_RACCSS( 40, 22) = 0.000000E+00 + PKER_RACCSS( 40, 23) = 0.000000E+00 + PKER_RACCSS( 40, 24) = 0.000000E+00 + PKER_RACCSS( 40, 25) = 0.000000E+00 + PKER_RACCSS( 40, 26) = 0.000000E+00 + PKER_RACCSS( 40, 27) = 0.000000E+00 + PKER_RACCSS( 40, 28) = 0.000000E+00 + PKER_RACCSS( 40, 29) = 0.000000E+00 + PKER_RACCSS( 40, 30) = 0.000000E+00 + PKER_RACCSS( 40, 31) = 0.000000E+00 + PKER_RACCSS( 40, 32) = 0.000000E+00 + PKER_RACCSS( 40, 33) = 0.000000E+00 + PKER_RACCSS( 40, 34) = 0.000000E+00 + PKER_RACCSS( 40, 35) = 0.000000E+00 + PKER_RACCSS( 40, 36) = 0.000000E+00 + PKER_RACCSS( 40, 37) = 0.000000E+00 + PKER_RACCSS( 40, 38) = 0.000000E+00 + PKER_RACCSS( 40, 39) = 0.000000E+00 + PKER_RACCSS( 40, 40) = 0.000000E+00 +END IF +! +IF( PRESENT(PKER_RACCS ) ) THEN + PKER_RACCS ( 1, 1) = 0.102167E+02 + PKER_RACCS ( 1, 2) = 0.798984E+01 + PKER_RACCS ( 1, 3) = 0.617380E+01 + PKER_RACCS ( 1, 4) = 0.469167E+01 + PKER_RACCS ( 1, 5) = 0.348534E+01 + PKER_RACCS ( 1, 6) = 0.251422E+01 + PKER_RACCS ( 1, 7) = 0.175460E+01 + PKER_RACCS ( 1, 8) = 0.119906E+01 + PKER_RACCS ( 1, 9) = 0.848431E+00 + PKER_RACCS ( 1, 10) = 0.697315E+00 + PKER_RACCS ( 1, 11) = 0.717816E+00 + PKER_RACCS ( 1, 12) = 0.854882E+00 + PKER_RACCS ( 1, 13) = 0.104470E+01 + PKER_RACCS ( 1, 14) = 0.123807E+01 + PKER_RACCS ( 1, 15) = 0.141081E+01 + PKER_RACCS ( 1, 16) = 0.155700E+01 + PKER_RACCS ( 1, 17) = 0.167856E+01 + PKER_RACCS ( 1, 18) = 0.177921E+01 + PKER_RACCS ( 1, 19) = 0.186250E+01 + PKER_RACCS ( 1, 20) = 0.193142E+01 + PKER_RACCS ( 1, 21) = 0.198845E+01 + PKER_RACCS ( 1, 22) = 0.203565E+01 + PKER_RACCS ( 1, 23) = 0.207472E+01 + PKER_RACCS ( 1, 24) = 0.210705E+01 + PKER_RACCS ( 1, 25) = 0.213381E+01 + PKER_RACCS ( 1, 26) = 0.215596E+01 + PKER_RACCS ( 1, 27) = 0.217429E+01 + PKER_RACCS ( 1, 28) = 0.218947E+01 + PKER_RACCS ( 1, 29) = 0.220203E+01 + PKER_RACCS ( 1, 30) = 0.221243E+01 + PKER_RACCS ( 1, 31) = 0.222103E+01 + PKER_RACCS ( 1, 32) = 0.222816E+01 + PKER_RACCS ( 1, 33) = 0.223406E+01 + PKER_RACCS ( 1, 34) = 0.223894E+01 + PKER_RACCS ( 1, 35) = 0.224298E+01 + PKER_RACCS ( 1, 36) = 0.224632E+01 + PKER_RACCS ( 1, 37) = 0.224909E+01 + PKER_RACCS ( 1, 38) = 0.225138E+01 + PKER_RACCS ( 1, 39) = 0.225328E+01 + PKER_RACCS ( 1, 40) = 0.225485E+01 + PKER_RACCS ( 2, 1) = 0.104818E+02 + PKER_RACCS ( 2, 2) = 0.821523E+01 + PKER_RACCS ( 2, 3) = 0.637111E+01 + PKER_RACCS ( 2, 4) = 0.486846E+01 + PKER_RACCS ( 2, 5) = 0.364524E+01 + PKER_RACCS ( 2, 6) = 0.265651E+01 + PKER_RACCS ( 2, 7) = 0.187379E+01 + PKER_RACCS ( 2, 8) = 0.128476E+01 + PKER_RACCS ( 2, 9) = 0.888040E+00 + PKER_RACCS ( 2, 10) = 0.682820E+00 + PKER_RACCS ( 2, 11) = 0.651649E+00 + PKER_RACCS ( 2, 12) = 0.749498E+00 + PKER_RACCS ( 2, 13) = 0.917050E+00 + PKER_RACCS ( 2, 14) = 0.110111E+01 + PKER_RACCS ( 2, 15) = 0.127111E+01 + PKER_RACCS ( 2, 16) = 0.141681E+01 + PKER_RACCS ( 2, 17) = 0.153841E+01 + PKER_RACCS ( 2, 18) = 0.163915E+01 + PKER_RACCS ( 2, 19) = 0.172252E+01 + PKER_RACCS ( 2, 20) = 0.179149E+01 + PKER_RACCS ( 2, 21) = 0.184857E+01 + PKER_RACCS ( 2, 22) = 0.189580E+01 + PKER_RACCS ( 2, 23) = 0.193488E+01 + PKER_RACCS ( 2, 24) = 0.196723E+01 + PKER_RACCS ( 2, 25) = 0.199401E+01 + PKER_RACCS ( 2, 26) = 0.201617E+01 + PKER_RACCS ( 2, 27) = 0.203451E+01 + PKER_RACCS ( 2, 28) = 0.204969E+01 + PKER_RACCS ( 2, 29) = 0.206226E+01 + PKER_RACCS ( 2, 30) = 0.207266E+01 + PKER_RACCS ( 2, 31) = 0.208127E+01 + PKER_RACCS ( 2, 32) = 0.208839E+01 + PKER_RACCS ( 2, 33) = 0.209429E+01 + PKER_RACCS ( 2, 34) = 0.209918E+01 + PKER_RACCS ( 2, 35) = 0.210322E+01 + PKER_RACCS ( 2, 36) = 0.210656E+01 + PKER_RACCS ( 2, 37) = 0.210933E+01 + PKER_RACCS ( 2, 38) = 0.211163E+01 + PKER_RACCS ( 2, 39) = 0.211352E+01 + PKER_RACCS ( 2, 40) = 0.211509E+01 + PKER_RACCS ( 3, 1) = 0.107644E+02 + PKER_RACCS ( 3, 2) = 0.845121E+01 + PKER_RACCS ( 3, 3) = 0.657371E+01 + PKER_RACCS ( 3, 4) = 0.504697E+01 + PKER_RACCS ( 3, 5) = 0.380515E+01 + PKER_RACCS ( 3, 6) = 0.279922E+01 + PKER_RACCS ( 3, 7) = 0.199615E+01 + PKER_RACCS ( 3, 8) = 0.137873E+01 + PKER_RACCS ( 3, 9) = 0.942712E+00 + PKER_RACCS ( 3, 10) = 0.688122E+00 + PKER_RACCS ( 3, 11) = 0.605662E+00 + PKER_RACCS ( 3, 12) = 0.661434E+00 + PKER_RACCS ( 3, 13) = 0.802624E+00 + PKER_RACCS ( 3, 14) = 0.974479E+00 + PKER_RACCS ( 3, 15) = 0.114040E+01 + PKER_RACCS ( 3, 16) = 0.128524E+01 + PKER_RACCS ( 3, 17) = 0.140682E+01 + PKER_RACCS ( 3, 18) = 0.150766E+01 + PKER_RACCS ( 3, 19) = 0.159112E+01 + PKER_RACCS ( 3, 20) = 0.166016E+01 + PKER_RACCS ( 3, 21) = 0.171729E+01 + PKER_RACCS ( 3, 22) = 0.176455E+01 + PKER_RACCS ( 3, 23) = 0.180367E+01 + PKER_RACCS ( 3, 24) = 0.183604E+01 + PKER_RACCS ( 3, 25) = 0.186283E+01 + PKER_RACCS ( 3, 26) = 0.188500E+01 + PKER_RACCS ( 3, 27) = 0.190335E+01 + PKER_RACCS ( 3, 28) = 0.191854E+01 + PKER_RACCS ( 3, 29) = 0.193111E+01 + PKER_RACCS ( 3, 30) = 0.194152E+01 + PKER_RACCS ( 3, 31) = 0.195013E+01 + PKER_RACCS ( 3, 32) = 0.195726E+01 + PKER_RACCS ( 3, 33) = 0.196316E+01 + PKER_RACCS ( 3, 34) = 0.196805E+01 + PKER_RACCS ( 3, 35) = 0.197209E+01 + PKER_RACCS ( 3, 36) = 0.197544E+01 + PKER_RACCS ( 3, 37) = 0.197821E+01 + PKER_RACCS ( 3, 38) = 0.198050E+01 + PKER_RACCS ( 3, 39) = 0.198240E+01 + PKER_RACCS ( 3, 40) = 0.198397E+01 + PKER_RACCS ( 4, 1) = 0.110672E+02 + PKER_RACCS ( 4, 2) = 0.870087E+01 + PKER_RACCS ( 4, 3) = 0.678439E+01 + PKER_RACCS ( 4, 4) = 0.522941E+01 + PKER_RACCS ( 4, 5) = 0.396642E+01 + PKER_RACCS ( 4, 6) = 0.294262E+01 + PKER_RACCS ( 4, 7) = 0.212084E+01 + PKER_RACCS ( 4, 8) = 0.147885E+01 + PKER_RACCS ( 4, 9) = 0.100866E+01 + PKER_RACCS ( 4, 10) = 0.710145E+00 + PKER_RACCS ( 4, 11) = 0.578505E+00 + PKER_RACCS ( 4, 12) = 0.590976E+00 + PKER_RACCS ( 4, 13) = 0.701961E+00 + PKER_RACCS ( 4, 14) = 0.858251E+00 + PKER_RACCS ( 4, 15) = 0.101841E+01 + PKER_RACCS ( 4, 16) = 0.116181E+01 + PKER_RACCS ( 4, 17) = 0.128324E+01 + PKER_RACCS ( 4, 18) = 0.138420E+01 + PKER_RACCS ( 4, 19) = 0.146776E+01 + PKER_RACCS ( 4, 20) = 0.153689E+01 + PKER_RACCS ( 4, 21) = 0.159407E+01 + PKER_RACCS ( 4, 22) = 0.164139E+01 + PKER_RACCS ( 4, 23) = 0.168054E+01 + PKER_RACCS ( 4, 24) = 0.171293E+01 + PKER_RACCS ( 4, 25) = 0.173974E+01 + PKER_RACCS ( 4, 26) = 0.176193E+01 + PKER_RACCS ( 4, 27) = 0.178029E+01 + PKER_RACCS ( 4, 28) = 0.179549E+01 + PKER_RACCS ( 4, 29) = 0.180807E+01 + PKER_RACCS ( 4, 30) = 0.181848E+01 + PKER_RACCS ( 4, 31) = 0.182709E+01 + PKER_RACCS ( 4, 32) = 0.183423E+01 + PKER_RACCS ( 4, 33) = 0.184013E+01 + PKER_RACCS ( 4, 34) = 0.184502E+01 + PKER_RACCS ( 4, 35) = 0.184906E+01 + PKER_RACCS ( 4, 36) = 0.185241E+01 + PKER_RACCS ( 4, 37) = 0.185518E+01 + PKER_RACCS ( 4, 38) = 0.185747E+01 + PKER_RACCS ( 4, 39) = 0.185937E+01 + PKER_RACCS ( 4, 40) = 0.186094E+01 + PKER_RACCS ( 5, 1) = 0.113912E+02 + PKER_RACCS ( 5, 2) = 0.896656E+01 + PKER_RACCS ( 5, 3) = 0.700573E+01 + PKER_RACCS ( 5, 4) = 0.541800E+01 + PKER_RACCS ( 5, 5) = 0.413072E+01 + PKER_RACCS ( 5, 6) = 0.308761E+01 + PKER_RACCS ( 5, 7) = 0.224753E+01 + PKER_RACCS ( 5, 8) = 0.158389E+01 + PKER_RACCS ( 5, 9) = 0.108428E+01 + PKER_RACCS ( 5, 10) = 0.746312E+00 + PKER_RACCS ( 5, 11) = 0.568858E+00 + PKER_RACCS ( 5, 12) = 0.537607E+00 + PKER_RACCS ( 5, 13) = 0.615320E+00 + PKER_RACCS ( 5, 14) = 0.752699E+00 + PKER_RACCS ( 5, 15) = 0.904977E+00 + PKER_RACCS ( 5, 16) = 0.104611E+01 + PKER_RACCS ( 5, 17) = 0.116720E+01 + PKER_RACCS ( 5, 18) = 0.126824E+01 + PKER_RACCS ( 5, 19) = 0.135194E+01 + PKER_RACCS ( 5, 20) = 0.142116E+01 + PKER_RACCS ( 5, 21) = 0.147842E+01 + PKER_RACCS ( 5, 22) = 0.152579E+01 + PKER_RACCS ( 5, 23) = 0.156498E+01 + PKER_RACCS ( 5, 24) = 0.159741E+01 + PKER_RACCS ( 5, 25) = 0.162424E+01 + PKER_RACCS ( 5, 26) = 0.164644E+01 + PKER_RACCS ( 5, 27) = 0.166482E+01 + PKER_RACCS ( 5, 28) = 0.168003E+01 + PKER_RACCS ( 5, 29) = 0.169261E+01 + PKER_RACCS ( 5, 30) = 0.170303E+01 + PKER_RACCS ( 5, 31) = 0.171165E+01 + PKER_RACCS ( 5, 32) = 0.171879E+01 + PKER_RACCS ( 5, 33) = 0.172469E+01 + PKER_RACCS ( 5, 34) = 0.172958E+01 + PKER_RACCS ( 5, 35) = 0.173363E+01 + PKER_RACCS ( 5, 36) = 0.173698E+01 + PKER_RACCS ( 5, 37) = 0.173975E+01 + PKER_RACCS ( 5, 38) = 0.174205E+01 + PKER_RACCS ( 5, 39) = 0.174395E+01 + PKER_RACCS ( 5, 40) = 0.174552E+01 + PKER_RACCS ( 6, 1) = 0.117349E+02 + PKER_RACCS ( 6, 2) = 0.924914E+01 + PKER_RACCS ( 6, 3) = 0.723971E+01 + PKER_RACCS ( 6, 4) = 0.561487E+01 + PKER_RACCS ( 6, 5) = 0.429976E+01 + PKER_RACCS ( 6, 6) = 0.323520E+01 + PKER_RACCS ( 6, 7) = 0.237647E+01 + PKER_RACCS ( 6, 8) = 0.169289E+01 + PKER_RACCS ( 6, 9) = 0.116768E+01 + PKER_RACCS ( 6, 10) = 0.795704E+00 + PKER_RACCS ( 6, 11) = 0.576137E+00 + PKER_RACCS ( 6, 12) = 0.501314E+00 + PKER_RACCS ( 6, 13) = 0.543341E+00 + PKER_RACCS ( 6, 14) = 0.658228E+00 + PKER_RACCS ( 6, 15) = 0.800085E+00 + PKER_RACCS ( 6, 16) = 0.937788E+00 + PKER_RACCS ( 6, 17) = 0.105821E+01 + PKER_RACCS ( 6, 18) = 0.115932E+01 + PKER_RACCS ( 6, 19) = 0.124316E+01 + PKER_RACCS ( 6, 20) = 0.131250E+01 + PKER_RACCS ( 6, 21) = 0.136985E+01 + PKER_RACCS ( 6, 22) = 0.141729E+01 + PKER_RACCS ( 6, 23) = 0.145653E+01 + PKER_RACCS ( 6, 24) = 0.148899E+01 + PKER_RACCS ( 6, 25) = 0.151585E+01 + PKER_RACCS ( 6, 26) = 0.153808E+01 + PKER_RACCS ( 6, 27) = 0.155647E+01 + PKER_RACCS ( 6, 28) = 0.157169E+01 + PKER_RACCS ( 6, 29) = 0.158429E+01 + PKER_RACCS ( 6, 30) = 0.159471E+01 + PKER_RACCS ( 6, 31) = 0.160334E+01 + PKER_RACCS ( 6, 32) = 0.161048E+01 + PKER_RACCS ( 6, 33) = 0.161639E+01 + PKER_RACCS ( 6, 34) = 0.162128E+01 + PKER_RACCS ( 6, 35) = 0.162533E+01 + PKER_RACCS ( 6, 36) = 0.162868E+01 + PKER_RACCS ( 6, 37) = 0.163145E+01 + PKER_RACCS ( 6, 38) = 0.163375E+01 + PKER_RACCS ( 6, 39) = 0.163565E+01 + PKER_RACCS ( 6, 40) = 0.163722E+01 + PKER_RACCS ( 7, 1) = 0.120933E+02 + PKER_RACCS ( 7, 2) = 0.954726E+01 + PKER_RACCS ( 7, 3) = 0.748704E+01 + PKER_RACCS ( 7, 4) = 0.582164E+01 + PKER_RACCS ( 7, 5) = 0.447529E+01 + PKER_RACCS ( 7, 6) = 0.338667E+01 + PKER_RACCS ( 7, 7) = 0.250813E+01 + PKER_RACCS ( 7, 8) = 0.180540E+01 + PKER_RACCS ( 7, 9) = 0.125732E+01 + PKER_RACCS ( 7, 10) = 0.855207E+00 + PKER_RACCS ( 7, 11) = 0.597925E+00 + PKER_RACCS ( 7, 12) = 0.481149E+00 + PKER_RACCS ( 7, 13) = 0.486186E+00 + PKER_RACCS ( 7, 14) = 0.575287E+00 + PKER_RACCS ( 7, 15) = 0.703816E+00 + PKER_RACCS ( 7, 16) = 0.836624E+00 + PKER_RACCS ( 7, 17) = 0.955895E+00 + PKER_RACCS ( 7, 18) = 0.105696E+01 + PKER_RACCS ( 7, 19) = 0.114096E+01 + PKER_RACCS ( 7, 20) = 0.121046E+01 + PKER_RACCS ( 7, 21) = 0.126792E+01 + PKER_RACCS ( 7, 22) = 0.131544E+01 + PKER_RACCS ( 7, 23) = 0.135474E+01 + PKER_RACCS ( 7, 24) = 0.138724E+01 + PKER_RACCS ( 7, 25) = 0.141414E+01 + PKER_RACCS ( 7, 26) = 0.143639E+01 + PKER_RACCS ( 7, 27) = 0.145480E+01 + PKER_RACCS ( 7, 28) = 0.147003E+01 + PKER_RACCS ( 7, 29) = 0.148264E+01 + PKER_RACCS ( 7, 30) = 0.149307E+01 + PKER_RACCS ( 7, 31) = 0.150171E+01 + PKER_RACCS ( 7, 32) = 0.150885E+01 + PKER_RACCS ( 7, 33) = 0.151477E+01 + PKER_RACCS ( 7, 34) = 0.151966E+01 + PKER_RACCS ( 7, 35) = 0.152372E+01 + PKER_RACCS ( 7, 36) = 0.152707E+01 + PKER_RACCS ( 7, 37) = 0.152984E+01 + PKER_RACCS ( 7, 38) = 0.153214E+01 + PKER_RACCS ( 7, 39) = 0.153404E+01 + PKER_RACCS ( 7, 40) = 0.153562E+01 + PKER_RACCS ( 8, 1) = 0.124583E+02 + PKER_RACCS ( 8, 2) = 0.985684E+01 + PKER_RACCS ( 8, 3) = 0.774660E+01 + PKER_RACCS ( 8, 4) = 0.603889E+01 + PKER_RACCS ( 8, 5) = 0.465857E+01 + PKER_RACCS ( 8, 6) = 0.354333E+01 + PKER_RACCS ( 8, 7) = 0.264340E+01 + PKER_RACCS ( 8, 8) = 0.192140E+01 + PKER_RACCS ( 8, 9) = 0.135239E+01 + PKER_RACCS ( 8, 10) = 0.923762E+00 + PKER_RACCS ( 8, 11) = 0.632168E+00 + PKER_RACCS ( 8, 12) = 0.476040E+00 + PKER_RACCS ( 8, 13) = 0.443617E+00 + PKER_RACCS ( 8, 14) = 0.504159E+00 + PKER_RACCS ( 8, 15) = 0.616439E+00 + PKER_RACCS ( 8, 16) = 0.742493E+00 + PKER_RACCS ( 8, 17) = 0.859895E+00 + PKER_RACCS ( 8, 18) = 0.960763E+00 + PKER_RACCS ( 8, 19) = 0.104493E+01 + PKER_RACCS ( 8, 20) = 0.111460E+01 + PKER_RACCS ( 8, 21) = 0.117219E+01 + PKER_RACCS ( 8, 22) = 0.121981E+01 + PKER_RACCS ( 8, 23) = 0.125918E+01 + PKER_RACCS ( 8, 24) = 0.129174E+01 + PKER_RACCS ( 8, 25) = 0.131868E+01 + PKER_RACCS ( 8, 26) = 0.134096E+01 + PKER_RACCS ( 8, 27) = 0.135939E+01 + PKER_RACCS ( 8, 28) = 0.137465E+01 + PKER_RACCS ( 8, 29) = 0.138727E+01 + PKER_RACCS ( 8, 30) = 0.139771E+01 + PKER_RACCS ( 8, 31) = 0.140635E+01 + PKER_RACCS ( 8, 32) = 0.141350E+01 + PKER_RACCS ( 8, 33) = 0.141942E+01 + PKER_RACCS ( 8, 34) = 0.142432E+01 + PKER_RACCS ( 8, 35) = 0.142838E+01 + PKER_RACCS ( 8, 36) = 0.143173E+01 + PKER_RACCS ( 8, 37) = 0.143451E+01 + PKER_RACCS ( 8, 38) = 0.143681E+01 + PKER_RACCS ( 8, 39) = 0.143871E+01 + PKER_RACCS ( 8, 40) = 0.144029E+01 + PKER_RACCS ( 9, 1) = 0.128193E+02 + PKER_RACCS ( 9, 2) = 0.101710E+02 + PKER_RACCS ( 9, 3) = 0.801494E+01 + PKER_RACCS ( 9, 4) = 0.626567E+01 + PKER_RACCS ( 9, 5) = 0.485005E+01 + PKER_RACCS ( 9, 6) = 0.370613E+01 + PKER_RACCS ( 9, 7) = 0.278307E+01 + PKER_RACCS ( 9, 8) = 0.204116E+01 + PKER_RACCS ( 9, 9) = 0.145223E+01 + PKER_RACCS ( 9, 10) = 0.999910E+00 + PKER_RACCS ( 9, 11) = 0.678225E+00 + PKER_RACCS ( 9, 12) = 0.485619E+00 + PKER_RACCS ( 9, 13) = 0.415703E+00 + PKER_RACCS ( 9, 14) = 0.445551E+00 + PKER_RACCS ( 9, 15) = 0.538377E+00 + PKER_RACCS ( 9, 16) = 0.655431E+00 + PKER_RACCS ( 9, 17) = 0.769934E+00 + PKER_RACCS ( 9, 18) = 0.870332E+00 + PKER_RACCS ( 9, 19) = 0.954640E+00 + PKER_RACCS ( 9, 20) = 0.102452E+01 + PKER_RACCS ( 9, 21) = 0.108227E+01 + PKER_RACCS ( 9, 22) = 0.113001E+01 + PKER_RACCS ( 9, 23) = 0.116947E+01 + PKER_RACCS ( 9, 24) = 0.120209E+01 + PKER_RACCS ( 9, 25) = 0.122908E+01 + PKER_RACCS ( 9, 26) = 0.125140E+01 + PKER_RACCS ( 9, 27) = 0.126986E+01 + PKER_RACCS ( 9, 28) = 0.128513E+01 + PKER_RACCS ( 9, 29) = 0.129777E+01 + PKER_RACCS ( 9, 30) = 0.130823E+01 + PKER_RACCS ( 9, 31) = 0.131688E+01 + PKER_RACCS ( 9, 32) = 0.132404E+01 + PKER_RACCS ( 9, 33) = 0.132996E+01 + PKER_RACCS ( 9, 34) = 0.133487E+01 + PKER_RACCS ( 9, 35) = 0.133892E+01 + PKER_RACCS ( 9, 36) = 0.134228E+01 + PKER_RACCS ( 9, 37) = 0.134506E+01 + PKER_RACCS ( 9, 38) = 0.134736E+01 + PKER_RACCS ( 9, 39) = 0.134927E+01 + PKER_RACCS ( 9, 40) = 0.135084E+01 + PKER_RACCS ( 10, 1) = 0.131653E+02 + PKER_RACCS ( 10, 2) = 0.104811E+02 + PKER_RACCS ( 10, 3) = 0.828636E+01 + PKER_RACCS ( 10, 4) = 0.649911E+01 + PKER_RACCS ( 10, 5) = 0.504891E+01 + PKER_RACCS ( 10, 6) = 0.387538E+01 + PKER_RACCS ( 10, 7) = 0.292777E+01 + PKER_RACCS ( 10, 8) = 0.216507E+01 + PKER_RACCS ( 10, 9) = 0.155660E+01 + PKER_RACCS ( 10, 10) = 0.108253E+01 + PKER_RACCS ( 10, 11) = 0.733699E+00 + PKER_RACCS ( 10, 12) = 0.508107E+00 + PKER_RACCS ( 10, 13) = 0.401864E+00 + PKER_RACCS ( 10, 14) = 0.399605E+00 + PKER_RACCS ( 10, 15) = 0.470066E+00 + PKER_RACCS ( 10, 16) = 0.575534E+00 + PKER_RACCS ( 10, 17) = 0.685829E+00 + PKER_RACCS ( 10, 18) = 0.785326E+00 + PKER_RACCS ( 10, 19) = 0.869715E+00 + PKER_RACCS ( 10, 20) = 0.939821E+00 + PKER_RACCS ( 10, 21) = 0.997773E+00 + PKER_RACCS ( 10, 22) = 0.104565E+01 + PKER_RACCS ( 10, 23) = 0.108522E+01 + PKER_RACCS ( 10, 24) = 0.111793E+01 + PKER_RACCS ( 10, 25) = 0.114497E+01 + PKER_RACCS ( 10, 26) = 0.116733E+01 + PKER_RACCS ( 10, 27) = 0.118583E+01 + PKER_RACCS ( 10, 28) = 0.120113E+01 + PKER_RACCS ( 10, 29) = 0.121379E+01 + PKER_RACCS ( 10, 30) = 0.122426E+01 + PKER_RACCS ( 10, 31) = 0.123292E+01 + PKER_RACCS ( 10, 32) = 0.124009E+01 + PKER_RACCS ( 10, 33) = 0.124602E+01 + PKER_RACCS ( 10, 34) = 0.125093E+01 + PKER_RACCS ( 10, 35) = 0.125500E+01 + PKER_RACCS ( 10, 36) = 0.125836E+01 + PKER_RACCS ( 10, 37) = 0.126114E+01 + PKER_RACCS ( 10, 38) = 0.126344E+01 + PKER_RACCS ( 10, 39) = 0.126535E+01 + PKER_RACCS ( 10, 40) = 0.126692E+01 + PKER_RACCS ( 11, 1) = 0.134866E+02 + PKER_RACCS ( 11, 2) = 0.107778E+02 + PKER_RACCS ( 11, 3) = 0.855355E+01 + PKER_RACCS ( 11, 4) = 0.673440E+01 + PKER_RACCS ( 11, 5) = 0.525269E+01 + PKER_RACCS ( 11, 6) = 0.405032E+01 + PKER_RACCS ( 11, 7) = 0.307764E+01 + PKER_RACCS ( 11, 8) = 0.229345E+01 + PKER_RACCS ( 11, 9) = 0.166544E+01 + PKER_RACCS ( 11, 10) = 0.117103E+01 + PKER_RACCS ( 11, 11) = 0.797857E+00 + PKER_RACCS ( 11, 12) = 0.541886E+00 + PKER_RACCS ( 11, 13) = 0.401262E+00 + PKER_RACCS ( 11, 14) = 0.366324E+00 + PKER_RACCS ( 11, 15) = 0.411835E+00 + PKER_RACCS ( 11, 16) = 0.503075E+00 + PKER_RACCS ( 11, 17) = 0.607497E+00 + PKER_RACCS ( 11, 18) = 0.705455E+00 + PKER_RACCS ( 11, 19) = 0.789792E+00 + PKER_RACCS ( 11, 20) = 0.860149E+00 + PKER_RACCS ( 11, 21) = 0.918336E+00 + PKER_RACCS ( 11, 22) = 0.966393E+00 + PKER_RACCS ( 11, 23) = 0.100609E+01 + PKER_RACCS ( 11, 24) = 0.103890E+01 + PKER_RACCS ( 11, 25) = 0.106601E+01 + PKER_RACCS ( 11, 26) = 0.108843E+01 + PKER_RACCS ( 11, 27) = 0.110696E+01 + PKER_RACCS ( 11, 28) = 0.112229E+01 + PKER_RACCS ( 11, 29) = 0.113498E+01 + PKER_RACCS ( 11, 30) = 0.114547E+01 + PKER_RACCS ( 11, 31) = 0.115414E+01 + PKER_RACCS ( 11, 32) = 0.116132E+01 + PKER_RACCS ( 11, 33) = 0.116726E+01 + PKER_RACCS ( 11, 34) = 0.117218E+01 + PKER_RACCS ( 11, 35) = 0.117625E+01 + PKER_RACCS ( 11, 36) = 0.117961E+01 + PKER_RACCS ( 11, 37) = 0.118240E+01 + PKER_RACCS ( 11, 38) = 0.118470E+01 + PKER_RACCS ( 11, 39) = 0.118661E+01 + PKER_RACCS ( 11, 40) = 0.118819E+01 + PKER_RACCS ( 12, 1) = 0.137765E+02 + PKER_RACCS ( 12, 2) = 0.110532E+02 + PKER_RACCS ( 12, 3) = 0.880887E+01 + PKER_RACCS ( 12, 4) = 0.696546E+01 + PKER_RACCS ( 12, 5) = 0.545739E+01 + PKER_RACCS ( 12, 6) = 0.422884E+01 + PKER_RACCS ( 12, 7) = 0.323193E+01 + PKER_RACCS ( 12, 8) = 0.242617E+01 + PKER_RACCS ( 12, 9) = 0.177863E+01 + PKER_RACCS ( 12, 10) = 0.126480E+01 + PKER_RACCS ( 12, 11) = 0.869502E+00 + PKER_RACCS ( 12, 12) = 0.586444E+00 + PKER_RACCS ( 12, 13) = 0.413638E+00 + PKER_RACCS ( 12, 14) = 0.345906E+00 + PKER_RACCS ( 12, 15) = 0.364471E+00 + PKER_RACCS ( 12, 16) = 0.438529E+00 + PKER_RACCS ( 12, 17) = 0.535017E+00 + PKER_RACCS ( 12, 18) = 0.630497E+00 + PKER_RACCS ( 12, 19) = 0.714544E+00 + PKER_RACCS ( 12, 20) = 0.785149E+00 + PKER_RACCS ( 12, 21) = 0.843614E+00 + PKER_RACCS ( 12, 22) = 0.891886E+00 + PKER_RACCS ( 12, 23) = 0.931743E+00 + PKER_RACCS ( 12, 24) = 0.964664E+00 + PKER_RACCS ( 12, 25) = 0.991866E+00 + PKER_RACCS ( 12, 26) = 0.101435E+01 + PKER_RACCS ( 12, 27) = 0.103293E+01 + PKER_RACCS ( 12, 28) = 0.104830E+01 + PKER_RACCS ( 12, 29) = 0.106101E+01 + PKER_RACCS ( 12, 30) = 0.107152E+01 + PKER_RACCS ( 12, 31) = 0.108022E+01 + PKER_RACCS ( 12, 32) = 0.108741E+01 + PKER_RACCS ( 12, 33) = 0.109336E+01 + PKER_RACCS ( 12, 34) = 0.109828E+01 + PKER_RACCS ( 12, 35) = 0.110236E+01 + PKER_RACCS ( 12, 36) = 0.110573E+01 + PKER_RACCS ( 12, 37) = 0.110852E+01 + PKER_RACCS ( 12, 38) = 0.111082E+01 + PKER_RACCS ( 12, 39) = 0.111273E+01 + PKER_RACCS ( 12, 40) = 0.111431E+01 + PKER_RACCS ( 13, 1) = 0.140319E+02 + PKER_RACCS ( 13, 2) = 0.113018E+02 + PKER_RACCS ( 13, 3) = 0.904571E+01 + PKER_RACCS ( 13, 4) = 0.718591E+01 + PKER_RACCS ( 13, 5) = 0.565791E+01 + PKER_RACCS ( 13, 6) = 0.440756E+01 + PKER_RACCS ( 13, 7) = 0.338881E+01 + PKER_RACCS ( 13, 8) = 0.256245E+01 + PKER_RACCS ( 13, 9) = 0.189581E+01 + PKER_RACCS ( 13, 10) = 0.136334E+01 + PKER_RACCS ( 13, 11) = 0.947657E+00 + PKER_RACCS ( 13, 12) = 0.639932E+00 + PKER_RACCS ( 13, 13) = 0.437803E+00 + PKER_RACCS ( 13, 14) = 0.338008E+00 + PKER_RACCS ( 13, 15) = 0.328139E+00 + PKER_RACCS ( 13, 16) = 0.382351E+00 + PKER_RACCS ( 13, 17) = 0.468516E+00 + PKER_RACCS ( 13, 18) = 0.560309E+00 + PKER_RACCS ( 13, 19) = 0.643677E+00 + PKER_RACCS ( 13, 20) = 0.714489E+00 + PKER_RACCS ( 13, 21) = 0.773275E+00 + PKER_RACCS ( 13, 22) = 0.821808E+00 + PKER_RACCS ( 13, 23) = 0.861858E+00 + PKER_RACCS ( 13, 24) = 0.894921E+00 + PKER_RACCS ( 13, 25) = 0.922228E+00 + PKER_RACCS ( 13, 26) = 0.944789E+00 + PKER_RACCS ( 13, 27) = 0.963435E+00 + PKER_RACCS ( 13, 28) = 0.978847E+00 + PKER_RACCS ( 13, 29) = 0.991591E+00 + PKER_RACCS ( 13, 30) = 0.100213E+01 + PKER_RACCS ( 13, 31) = 0.101084E+01 + PKER_RACCS ( 13, 32) = 0.101805E+01 + PKER_RACCS ( 13, 33) = 0.102401E+01 + PKER_RACCS ( 13, 34) = 0.102895E+01 + PKER_RACCS ( 13, 35) = 0.103303E+01 + PKER_RACCS ( 13, 36) = 0.103640E+01 + PKER_RACCS ( 13, 37) = 0.103920E+01 + PKER_RACCS ( 13, 38) = 0.104151E+01 + PKER_RACCS ( 13, 39) = 0.104342E+01 + PKER_RACCS ( 13, 40) = 0.104500E+01 + PKER_RACCS ( 14, 1) = 0.142526E+02 + PKER_RACCS ( 14, 2) = 0.115209E+02 + PKER_RACCS ( 14, 3) = 0.925951E+01 + PKER_RACCS ( 14, 4) = 0.739026E+01 + PKER_RACCS ( 14, 5) = 0.584892E+01 + PKER_RACCS ( 14, 6) = 0.458219E+01 + PKER_RACCS ( 14, 7) = 0.354538E+01 + PKER_RACCS ( 14, 8) = 0.270063E+01 + PKER_RACCS ( 14, 9) = 0.201611E+01 + PKER_RACCS ( 14, 10) = 0.146603E+01 + PKER_RACCS ( 14, 11) = 0.103157E+01 + PKER_RACCS ( 14, 12) = 0.701686E+00 + PKER_RACCS ( 14, 13) = 0.472410E+00 + PKER_RACCS ( 14, 14) = 0.342083E+00 + PKER_RACCS ( 14, 15) = 0.303081E+00 + PKER_RACCS ( 14, 16) = 0.334956E+00 + PKER_RACCS ( 14, 17) = 0.408312E+00 + PKER_RACCS ( 14, 18) = 0.494848E+00 + PKER_RACCS ( 14, 19) = 0.576946E+00 + PKER_RACCS ( 14, 20) = 0.647859E+00 + PKER_RACCS ( 14, 21) = 0.707002E+00 + PKER_RACCS ( 14, 22) = 0.755849E+00 + PKER_RACCS ( 14, 23) = 0.796134E+00 + PKER_RACCS ( 14, 24) = 0.829370E+00 + PKER_RACCS ( 14, 25) = 0.856804E+00 + PKER_RACCS ( 14, 26) = 0.879461E+00 + PKER_RACCS ( 14, 27) = 0.898177E+00 + PKER_RACCS ( 14, 28) = 0.913644E+00 + PKER_RACCS ( 14, 29) = 0.926428E+00 + PKER_RACCS ( 14, 30) = 0.936997E+00 + PKER_RACCS ( 14, 31) = 0.945736E+00 + PKER_RACCS ( 14, 32) = 0.952963E+00 + PKER_RACCS ( 14, 33) = 0.958940E+00 + PKER_RACCS ( 14, 34) = 0.963884E+00 + PKER_RACCS ( 14, 35) = 0.967973E+00 + PKER_RACCS ( 14, 36) = 0.971356E+00 + PKER_RACCS ( 14, 37) = 0.974154E+00 + PKER_RACCS ( 14, 38) = 0.976470E+00 + PKER_RACCS ( 14, 39) = 0.978385E+00 + PKER_RACCS ( 14, 40) = 0.979971E+00 + PKER_RACCS ( 15, 1) = 0.144408E+02 + PKER_RACCS ( 15, 2) = 0.117106E+02 + PKER_RACCS ( 15, 3) = 0.944817E+01 + PKER_RACCS ( 15, 4) = 0.757478E+01 + PKER_RACCS ( 15, 5) = 0.602588E+01 + PKER_RACCS ( 15, 6) = 0.474829E+01 + PKER_RACCS ( 15, 7) = 0.369801E+01 + PKER_RACCS ( 15, 8) = 0.283819E+01 + PKER_RACCS ( 15, 9) = 0.213794E+01 + PKER_RACCS ( 15, 10) = 0.157180E+01 + PKER_RACCS ( 15, 11) = 0.112020E+01 + PKER_RACCS ( 15, 12) = 0.770447E+00 + PKER_RACCS ( 15, 13) = 0.516893E+00 + PKER_RACCS ( 15, 14) = 0.357861E+00 + PKER_RACCS ( 15, 15) = 0.289607E+00 + PKER_RACCS ( 15, 16) = 0.297216E+00 + PKER_RACCS ( 15, 17) = 0.354956E+00 + PKER_RACCS ( 15, 18) = 0.434258E+00 + PKER_RACCS ( 15, 19) = 0.514182E+00 + PKER_RACCS ( 15, 20) = 0.584974E+00 + PKER_RACCS ( 15, 21) = 0.644491E+00 + PKER_RACCS ( 15, 22) = 0.693710E+00 + PKER_RACCS ( 15, 23) = 0.734280E+00 + PKER_RACCS ( 15, 24) = 0.767726E+00 + PKER_RACCS ( 15, 25) = 0.795315E+00 + PKER_RACCS ( 15, 26) = 0.818087E+00 + PKER_RACCS ( 15, 27) = 0.836890E+00 + PKER_RACCS ( 15, 28) = 0.852422E+00 + PKER_RACCS ( 15, 29) = 0.865255E+00 + PKER_RACCS ( 15, 30) = 0.875862E+00 + PKER_RACCS ( 15, 31) = 0.884630E+00 + PKER_RACCS ( 15, 32) = 0.891879E+00 + PKER_RACCS ( 15, 33) = 0.897873E+00 + PKER_RACCS ( 15, 34) = 0.902830E+00 + PKER_RACCS ( 15, 35) = 0.906929E+00 + PKER_RACCS ( 15, 36) = 0.910320E+00 + PKER_RACCS ( 15, 37) = 0.913125E+00 + PKER_RACCS ( 15, 38) = 0.915446E+00 + PKER_RACCS ( 15, 39) = 0.917365E+00 + PKER_RACCS ( 15, 40) = 0.918953E+00 + PKER_RACCS ( 16, 1) = 0.146000E+02 + PKER_RACCS ( 16, 2) = 0.118728E+02 + PKER_RACCS ( 16, 3) = 0.961176E+01 + PKER_RACCS ( 16, 4) = 0.773776E+01 + PKER_RACCS ( 16, 5) = 0.618568E+01 + PKER_RACCS ( 16, 6) = 0.490207E+01 + PKER_RACCS ( 16, 7) = 0.384296E+01 + PKER_RACCS ( 16, 8) = 0.297203E+01 + PKER_RACCS ( 16, 9) = 0.225904E+01 + PKER_RACCS ( 16, 10) = 0.167906E+01 + PKER_RACCS ( 16, 11) = 0.121230E+01 + PKER_RACCS ( 16, 12) = 0.844921E+00 + PKER_RACCS ( 16, 13) = 0.569587E+00 + PKER_RACCS ( 16, 14) = 0.384481E+00 + PKER_RACCS ( 16, 15) = 0.287547E+00 + PKER_RACCS ( 16, 16) = 0.269381E+00 + PKER_RACCS ( 16, 17) = 0.308942E+00 + PKER_RACCS ( 16, 18) = 0.378718E+00 + PKER_RACCS ( 16, 19) = 0.455285E+00 + PKER_RACCS ( 16, 20) = 0.525584E+00 + PKER_RACCS ( 16, 21) = 0.585450E+00 + PKER_RACCS ( 16, 22) = 0.635102E+00 + PKER_RACCS ( 16, 23) = 0.676017E+00 + PKER_RACCS ( 16, 24) = 0.709718E+00 + PKER_RACCS ( 16, 25) = 0.737496E+00 + PKER_RACCS ( 16, 26) = 0.760407E+00 + PKER_RACCS ( 16, 27) = 0.779315E+00 + PKER_RACCS ( 16, 28) = 0.794925E+00 + PKER_RACCS ( 16, 29) = 0.807818E+00 + PKER_RACCS ( 16, 30) = 0.818470E+00 + PKER_RACCS ( 16, 31) = 0.827272E+00 + PKER_RACCS ( 16, 32) = 0.834548E+00 + PKER_RACCS ( 16, 33) = 0.840562E+00 + PKER_RACCS ( 16, 34) = 0.845535E+00 + PKER_RACCS ( 16, 35) = 0.849647E+00 + PKER_RACCS ( 16, 36) = 0.853048E+00 + PKER_RACCS ( 16, 37) = 0.855860E+00 + PKER_RACCS ( 16, 38) = 0.858187E+00 + PKER_RACCS ( 16, 39) = 0.860111E+00 + PKER_RACCS ( 16, 40) = 0.861703E+00 + PKER_RACCS ( 17, 1) = 0.147341E+02 + PKER_RACCS ( 17, 2) = 0.120103E+02 + PKER_RACCS ( 17, 3) = 0.975189E+01 + PKER_RACCS ( 17, 4) = 0.787932E+01 + PKER_RACCS ( 17, 5) = 0.632699E+01 + PKER_RACCS ( 17, 6) = 0.504099E+01 + PKER_RACCS ( 17, 7) = 0.397709E+01 + PKER_RACCS ( 17, 8) = 0.309897E+01 + PKER_RACCS ( 17, 9) = 0.237672E+01 + PKER_RACCS ( 17, 10) = 0.178573E+01 + PKER_RACCS ( 17, 11) = 0.130626E+01 + PKER_RACCS ( 17, 12) = 0.923760E+00 + PKER_RACCS ( 17, 13) = 0.629526E+00 + PKER_RACCS ( 17, 14) = 0.420645E+00 + PKER_RACCS ( 17, 15) = 0.296483E+00 + PKER_RACCS ( 17, 16) = 0.251869E+00 + PKER_RACCS ( 17, 17) = 0.270840E+00 + PKER_RACCS ( 17, 18) = 0.328636E+00 + PKER_RACCS ( 17, 19) = 0.400275E+00 + PKER_RACCS ( 17, 20) = 0.469486E+00 + PKER_RACCS ( 17, 21) = 0.529608E+00 + PKER_RACCS ( 17, 22) = 0.579747E+00 + PKER_RACCS ( 17, 23) = 0.621076E+00 + PKER_RACCS ( 17, 24) = 0.655088E+00 + PKER_RACCS ( 17, 25) = 0.683094E+00 + PKER_RACCS ( 17, 26) = 0.706174E+00 + PKER_RACCS ( 17, 27) = 0.725208E+00 + PKER_RACCS ( 17, 28) = 0.740913E+00 + PKER_RACCS ( 17, 29) = 0.753877E+00 + PKER_RACCS ( 17, 30) = 0.764583E+00 + PKER_RACCS ( 17, 31) = 0.773427E+00 + PKER_RACCS ( 17, 32) = 0.780735E+00 + PKER_RACCS ( 17, 33) = 0.786774E+00 + PKER_RACCS ( 17, 34) = 0.791766E+00 + PKER_RACCS ( 17, 35) = 0.795893E+00 + PKER_RACCS ( 17, 36) = 0.799305E+00 + PKER_RACCS ( 17, 37) = 0.802126E+00 + PKER_RACCS ( 17, 38) = 0.804459E+00 + PKER_RACCS ( 17, 39) = 0.806389E+00 + PKER_RACCS ( 17, 40) = 0.807985E+00 + PKER_RACCS ( 18, 1) = 0.148471E+02 + PKER_RACCS ( 18, 2) = 0.121265E+02 + PKER_RACCS ( 18, 3) = 0.987110E+01 + PKER_RACCS ( 18, 4) = 0.800089E+01 + PKER_RACCS ( 18, 5) = 0.644994E+01 + PKER_RACCS ( 18, 6) = 0.516395E+01 + PKER_RACCS ( 18, 7) = 0.409829E+01 + PKER_RACCS ( 18, 8) = 0.321639E+01 + PKER_RACCS ( 18, 9) = 0.248825E+01 + PKER_RACCS ( 18, 10) = 0.188937E+01 + PKER_RACCS ( 18, 11) = 0.140001E+01 + PKER_RACCS ( 18, 12) = 0.100512E+01 + PKER_RACCS ( 18, 13) = 0.694965E+00 + PKER_RACCS ( 18, 14) = 0.465425E+00 + PKER_RACCS ( 18, 15) = 0.316022E+00 + PKER_RACCS ( 18, 16) = 0.245025E+00 + PKER_RACCS ( 18, 17) = 0.241586E+00 + PKER_RACCS ( 18, 18) = 0.284650E+00 + PKER_RACCS ( 18, 19) = 0.349371E+00 + PKER_RACCS ( 18, 20) = 0.416569E+00 + PKER_RACCS ( 18, 21) = 0.476716E+00 + PKER_RACCS ( 18, 22) = 0.527374E+00 + PKER_RACCS ( 18, 23) = 0.569195E+00 + PKER_RACCS ( 18, 24) = 0.603581E+00 + PKER_RACCS ( 18, 25) = 0.631865E+00 + PKER_RACCS ( 18, 26) = 0.655150E+00 + PKER_RACCS ( 18, 27) = 0.674336E+00 + PKER_RACCS ( 18, 28) = 0.690155E+00 + PKER_RACCS ( 18, 29) = 0.703206E+00 + PKER_RACCS ( 18, 30) = 0.713977E+00 + PKER_RACCS ( 18, 31) = 0.722871E+00 + PKER_RACCS ( 18, 32) = 0.730217E+00 + PKER_RACCS ( 18, 33) = 0.736286E+00 + PKER_RACCS ( 18, 34) = 0.741300E+00 + PKER_RACCS ( 18, 35) = 0.745445E+00 + PKER_RACCS ( 18, 36) = 0.748871E+00 + PKER_RACCS ( 18, 37) = 0.751703E+00 + PKER_RACCS ( 18, 38) = 0.754044E+00 + PKER_RACCS ( 18, 39) = 0.755981E+00 + PKER_RACCS ( 18, 40) = 0.757582E+00 + PKER_RACCS ( 19, 1) = 0.149424E+02 + PKER_RACCS ( 19, 2) = 0.122248E+02 + PKER_RACCS ( 19, 3) = 0.997223E+01 + PKER_RACCS ( 19, 4) = 0.810461E+01 + PKER_RACCS ( 19, 5) = 0.655579E+01 + PKER_RACCS ( 19, 6) = 0.527114E+01 + PKER_RACCS ( 19, 7) = 0.420569E+01 + PKER_RACCS ( 19, 8) = 0.332252E+01 + PKER_RACCS ( 19, 9) = 0.259139E+01 + PKER_RACCS ( 19, 10) = 0.198760E+01 + PKER_RACCS ( 19, 11) = 0.149127E+01 + PKER_RACCS ( 19, 12) = 0.108695E+01 + PKER_RACCS ( 19, 13) = 0.763957E+00 + PKER_RACCS ( 19, 14) = 0.516893E+00 + PKER_RACCS ( 19, 15) = 0.345184E+00 + PKER_RACCS ( 19, 16) = 0.248721E+00 + PKER_RACCS ( 19, 17) = 0.221527E+00 + PKER_RACCS ( 19, 18) = 0.247368E+00 + PKER_RACCS ( 19, 19) = 0.302857E+00 + PKER_RACCS ( 19, 20) = 0.366792E+00 + PKER_RACCS ( 19, 21) = 0.426569E+00 + PKER_RACCS ( 19, 22) = 0.477725E+00 + PKER_RACCS ( 19, 23) = 0.520116E+00 + PKER_RACCS ( 19, 24) = 0.554955E+00 + PKER_RACCS ( 19, 25) = 0.583575E+00 + PKER_RACCS ( 19, 26) = 0.607108E+00 + PKER_RACCS ( 19, 27) = 0.626479E+00 + PKER_RACCS ( 19, 28) = 0.642436E+00 + PKER_RACCS ( 19, 29) = 0.655590E+00 + PKER_RACCS ( 19, 30) = 0.666441E+00 + PKER_RACCS ( 19, 31) = 0.675394E+00 + PKER_RACCS ( 19, 32) = 0.682786E+00 + PKER_RACCS ( 19, 33) = 0.688890E+00 + PKER_RACCS ( 19, 34) = 0.693932E+00 + PKER_RACCS ( 19, 35) = 0.698097E+00 + PKER_RACCS ( 19, 36) = 0.701540E+00 + PKER_RACCS ( 19, 37) = 0.704385E+00 + PKER_RACCS ( 19, 38) = 0.706736E+00 + PKER_RACCS ( 19, 39) = 0.708680E+00 + PKER_RACCS ( 19, 40) = 0.710287E+00 + PKER_RACCS ( 20, 1) = 0.150233E+02 + PKER_RACCS ( 20, 2) = 0.123081E+02 + PKER_RACCS ( 20, 3) = 0.100581E+02 + PKER_RACCS ( 20, 4) = 0.819292E+01 + PKER_RACCS ( 20, 5) = 0.664638E+01 + PKER_RACCS ( 20, 6) = 0.536365E+01 + PKER_RACCS ( 20, 7) = 0.429950E+01 + PKER_RACCS ( 20, 8) = 0.341669E+01 + PKER_RACCS ( 20, 9) = 0.268467E+01 + PKER_RACCS ( 20, 10) = 0.207848E+01 + PKER_RACCS ( 20, 11) = 0.157790E+01 + PKER_RACCS ( 20, 12) = 0.116706E+01 + PKER_RACCS ( 20, 13) = 0.834456E+00 + PKER_RACCS ( 20, 14) = 0.573438E+00 + PKER_RACCS ( 20, 15) = 0.382407E+00 + PKER_RACCS ( 20, 16) = 0.262345E+00 + PKER_RACCS ( 20, 17) = 0.211120E+00 + PKER_RACCS ( 20, 18) = 0.217516E+00 + PKER_RACCS ( 20, 19) = 0.261278E+00 + PKER_RACCS ( 20, 20) = 0.320279E+00 + PKER_RACCS ( 20, 21) = 0.379014E+00 + PKER_RACCS ( 20, 22) = 0.430562E+00 + PKER_RACCS ( 20, 23) = 0.473590E+00 + PKER_RACCS ( 20, 24) = 0.508970E+00 + PKER_RACCS ( 20, 25) = 0.537995E+00 + PKER_RACCS ( 20, 26) = 0.561829E+00 + PKER_RACCS ( 20, 27) = 0.581423E+00 + PKER_RACCS ( 20, 28) = 0.597547E+00 + PKER_RACCS ( 20, 29) = 0.610827E+00 + PKER_RACCS ( 20, 30) = 0.621772E+00 + PKER_RACCS ( 20, 31) = 0.630798E+00 + PKER_RACCS ( 20, 32) = 0.638244E+00 + PKER_RACCS ( 20, 33) = 0.644390E+00 + PKER_RACCS ( 20, 34) = 0.649465E+00 + PKER_RACCS ( 20, 35) = 0.653656E+00 + PKER_RACCS ( 20, 36) = 0.657117E+00 + PKER_RACCS ( 20, 37) = 0.659978E+00 + PKER_RACCS ( 20, 38) = 0.662341E+00 + PKER_RACCS ( 20, 39) = 0.664294E+00 + PKER_RACCS ( 20, 40) = 0.665909E+00 + PKER_RACCS ( 21, 1) = 0.150922E+02 + PKER_RACCS ( 21, 2) = 0.123791E+02 + PKER_RACCS ( 21, 3) = 0.101311E+02 + PKER_RACCS ( 21, 4) = 0.826818E+01 + PKER_RACCS ( 21, 5) = 0.672379E+01 + PKER_RACCS ( 21, 6) = 0.544309E+01 + PKER_RACCS ( 21, 7) = 0.438067E+01 + PKER_RACCS ( 21, 8) = 0.349910E+01 + PKER_RACCS ( 21, 9) = 0.276755E+01 + PKER_RACCS ( 21, 10) = 0.216074E+01 + PKER_RACCS ( 21, 11) = 0.165815E+01 + PKER_RACCS ( 21, 12) = 0.124340E+01 + PKER_RACCS ( 21, 13) = 0.904204E+00 + PKER_RACCS ( 21, 14) = 0.632746E+00 + PKER_RACCS ( 21, 15) = 0.426104E+00 + PKER_RACCS ( 21, 16) = 0.285124E+00 + PKER_RACCS ( 21, 17) = 0.210547E+00 + PKER_RACCS ( 21, 18) = 0.196012E+00 + PKER_RACCS ( 21, 19) = 0.225390E+00 + PKER_RACCS ( 21, 20) = 0.277352E+00 + PKER_RACCS ( 21, 21) = 0.334022E+00 + PKER_RACCS ( 21, 22) = 0.385682E+00 + PKER_RACCS ( 21, 23) = 0.429377E+00 + PKER_RACCS ( 21, 24) = 0.465390E+00 + PKER_RACCS ( 21, 25) = 0.494904E+00 + PKER_RACCS ( 21, 26) = 0.519101E+00 + PKER_RACCS ( 21, 27) = 0.538964E+00 + PKER_RACCS ( 21, 28) = 0.555290E+00 + PKER_RACCS ( 21, 29) = 0.568721E+00 + PKER_RACCS ( 21, 30) = 0.579780E+00 + PKER_RACCS ( 21, 31) = 0.588892E+00 + PKER_RACCS ( 21, 32) = 0.596405E+00 + PKER_RACCS ( 21, 33) = 0.602602E+00 + PKER_RACCS ( 21, 34) = 0.607715E+00 + PKER_RACCS ( 21, 35) = 0.611936E+00 + PKER_RACCS ( 21, 36) = 0.615421E+00 + PKER_RACCS ( 21, 37) = 0.618300E+00 + PKER_RACCS ( 21, 38) = 0.620677E+00 + PKER_RACCS ( 21, 39) = 0.622642E+00 + PKER_RACCS ( 21, 40) = 0.624265E+00 + PKER_RACCS ( 22, 1) = 0.151514E+02 + PKER_RACCS ( 22, 2) = 0.124399E+02 + PKER_RACCS ( 22, 3) = 0.101937E+02 + PKER_RACCS ( 22, 4) = 0.833253E+01 + PKER_RACCS ( 22, 5) = 0.679003E+01 + PKER_RACCS ( 22, 6) = 0.551121E+01 + PKER_RACCS ( 22, 7) = 0.445059E+01 + PKER_RACCS ( 22, 8) = 0.357060E+01 + PKER_RACCS ( 22, 9) = 0.284022E+01 + PKER_RACCS ( 22, 10) = 0.223394E+01 + PKER_RACCS ( 22, 11) = 0.173091E+01 + PKER_RACCS ( 22, 12) = 0.131432E+01 + PKER_RACCS ( 22, 13) = 0.971179E+00 + PKER_RACCS ( 22, 14) = 0.692512E+00 + PKER_RACCS ( 22, 15) = 0.473921E+00 + PKER_RACCS ( 22, 16) = 0.315613E+00 + PKER_RACCS ( 22, 17) = 0.219438E+00 + PKER_RACCS ( 22, 18) = 0.183228E+00 + PKER_RACCS ( 22, 19) = 0.195928E+00 + PKER_RACCS ( 22, 20) = 0.238467E+00 + PKER_RACCS ( 22, 21) = 0.291650E+00 + PKER_RACCS ( 22, 22) = 0.342933E+00 + PKER_RACCS ( 22, 23) = 0.387253E+00 + PKER_RACCS ( 22, 24) = 0.423987E+00 + PKER_RACCS ( 22, 25) = 0.454083E+00 + PKER_RACCS ( 22, 26) = 0.478717E+00 + PKER_RACCS ( 22, 27) = 0.498906E+00 + PKER_RACCS ( 22, 28) = 0.515474E+00 + PKER_RACCS ( 22, 29) = 0.529087E+00 + PKER_RACCS ( 22, 30) = 0.540283E+00 + PKER_RACCS ( 22, 31) = 0.549500E+00 + PKER_RACCS ( 22, 32) = 0.557092E+00 + PKER_RACCS ( 22, 33) = 0.563350E+00 + PKER_RACCS ( 22, 34) = 0.568510E+00 + PKER_RACCS ( 22, 35) = 0.572767E+00 + PKER_RACCS ( 22, 36) = 0.576280E+00 + PKER_RACCS ( 22, 37) = 0.579180E+00 + PKER_RACCS ( 22, 38) = 0.581575E+00 + PKER_RACCS ( 22, 39) = 0.583552E+00 + PKER_RACCS ( 22, 40) = 0.585186E+00 + PKER_RACCS ( 23, 1) = 0.152025E+02 + PKER_RACCS ( 23, 2) = 0.124923E+02 + PKER_RACCS ( 23, 3) = 0.102475E+02 + PKER_RACCS ( 23, 4) = 0.838786E+01 + PKER_RACCS ( 23, 5) = 0.684693E+01 + PKER_RACCS ( 23, 6) = 0.556974E+01 + PKER_RACCS ( 23, 7) = 0.451078E+01 + PKER_RACCS ( 23, 8) = 0.363239E+01 + PKER_RACCS ( 23, 9) = 0.290344E+01 + PKER_RACCS ( 23, 10) = 0.229827E+01 + PKER_RACCS ( 23, 11) = 0.179578E+01 + PKER_RACCS ( 23, 12) = 0.137880E+01 + PKER_RACCS ( 23, 13) = 0.103376E+01 + PKER_RACCS ( 23, 14) = 0.750698E+00 + PKER_RACCS ( 23, 15) = 0.523775E+00 + PKER_RACCS ( 23, 16) = 0.351748E+00 + PKER_RACCS ( 23, 17) = 0.236670E+00 + PKER_RACCS ( 23, 18) = 0.179378E+00 + PKER_RACCS ( 23, 19) = 0.173687E+00 + PKER_RACCS ( 23, 20) = 0.204334E+00 + PKER_RACCS ( 23, 21) = 0.252182E+00 + PKER_RACCS ( 23, 22) = 0.302250E+00 + PKER_RACCS ( 23, 23) = 0.347024E+00 + PKER_RACCS ( 23, 24) = 0.384540E+00 + PKER_RACCS ( 23, 25) = 0.415319E+00 + PKER_RACCS ( 23, 26) = 0.440475E+00 + PKER_RACCS ( 23, 27) = 0.461054E+00 + PKER_RACCS ( 23, 28) = 0.477914E+00 + PKER_RACCS ( 23, 29) = 0.491746E+00 + PKER_RACCS ( 23, 30) = 0.503108E+00 + PKER_RACCS ( 23, 31) = 0.512450E+00 + PKER_RACCS ( 23, 32) = 0.520137E+00 + PKER_RACCS ( 23, 33) = 0.526468E+00 + PKER_RACCS ( 23, 34) = 0.531684E+00 + PKER_RACCS ( 23, 35) = 0.535984E+00 + PKER_RACCS ( 23, 36) = 0.539531E+00 + PKER_RACCS ( 23, 37) = 0.542457E+00 + PKER_RACCS ( 23, 38) = 0.544872E+00 + PKER_RACCS ( 23, 39) = 0.546865E+00 + PKER_RACCS ( 23, 40) = 0.548511E+00 + PKER_RACCS ( 24, 1) = 0.152471E+02 + PKER_RACCS ( 24, 2) = 0.125379E+02 + PKER_RACCS ( 24, 3) = 0.102942E+02 + PKER_RACCS ( 24, 4) = 0.843571E+01 + PKER_RACCS ( 24, 5) = 0.689606E+01 + PKER_RACCS ( 24, 6) = 0.562023E+01 + PKER_RACCS ( 24, 7) = 0.456270E+01 + PKER_RACCS ( 24, 8) = 0.368577E+01 + PKER_RACCS ( 24, 9) = 0.295826E+01 + PKER_RACCS ( 24, 10) = 0.235439E+01 + PKER_RACCS ( 24, 11) = 0.185292E+01 + PKER_RACCS ( 24, 12) = 0.143643E+01 + PKER_RACCS ( 24, 13) = 0.109091E+01 + PKER_RACCS ( 24, 14) = 0.805605E+00 + PKER_RACCS ( 24, 15) = 0.573417E+00 + PKER_RACCS ( 24, 16) = 0.391471E+00 + PKER_RACCS ( 24, 17) = 0.260876E+00 + PKER_RACCS ( 24, 18) = 0.184180E+00 + PKER_RACCS ( 24, 19) = 0.159396E+00 + PKER_RACCS ( 24, 20) = 0.175814E+00 + PKER_RACCS ( 24, 21) = 0.216094E+00 + PKER_RACCS ( 24, 22) = 0.263726E+00 + PKER_RACCS ( 24, 23) = 0.308551E+00 + PKER_RACCS ( 24, 24) = 0.346845E+00 + PKER_RACCS ( 24, 25) = 0.378402E+00 + PKER_RACCS ( 24, 26) = 0.404175E+00 + PKER_RACCS ( 24, 27) = 0.425220E+00 + PKER_RACCS ( 24, 28) = 0.442431E+00 + PKER_RACCS ( 24, 29) = 0.456527E+00 + PKER_RACCS ( 24, 30) = 0.468088E+00 + PKER_RACCS ( 24, 31) = 0.477580E+00 + PKER_RACCS ( 24, 32) = 0.485382E+00 + PKER_RACCS ( 24, 33) = 0.491800E+00 + PKER_RACCS ( 24, 34) = 0.497083E+00 + PKER_RACCS ( 24, 35) = 0.501435E+00 + PKER_RACCS ( 24, 36) = 0.505022E+00 + PKER_RACCS ( 24, 37) = 0.507979E+00 + PKER_RACCS ( 24, 38) = 0.510418E+00 + PKER_RACCS ( 24, 39) = 0.512430E+00 + PKER_RACCS ( 24, 40) = 0.514090E+00 + PKER_RACCS ( 25, 1) = 0.152861E+02 + PKER_RACCS ( 25, 2) = 0.125778E+02 + PKER_RACCS ( 25, 3) = 0.103349E+02 + PKER_RACCS ( 25, 4) = 0.847739E+01 + PKER_RACCS ( 25, 5) = 0.693876E+01 + PKER_RACCS ( 25, 6) = 0.566404E+01 + PKER_RACCS ( 25, 7) = 0.460768E+01 + PKER_RACCS ( 25, 8) = 0.373200E+01 + PKER_RACCS ( 25, 9) = 0.300578E+01 + PKER_RACCS ( 25, 10) = 0.240320E+01 + PKER_RACCS ( 25, 11) = 0.190291E+01 + PKER_RACCS ( 25, 12) = 0.148735E+01 + PKER_RACCS ( 25, 13) = 0.114219E+01 + PKER_RACCS ( 25, 14) = 0.856136E+00 + PKER_RACCS ( 25, 15) = 0.621029E+00 + PKER_RACCS ( 25, 16) = 0.432440E+00 + PKER_RACCS ( 25, 17) = 0.290169E+00 + PKER_RACCS ( 25, 18) = 0.196768E+00 + PKER_RACCS ( 25, 19) = 0.153201E+00 + PKER_RACCS ( 25, 20) = 0.153672E+00 + PKER_RACCS ( 25, 21) = 0.184048E+00 + PKER_RACCS ( 25, 22) = 0.227585E+00 + PKER_RACCS ( 25, 23) = 0.271783E+00 + PKER_RACCS ( 25, 24) = 0.310728E+00 + PKER_RACCS ( 25, 25) = 0.343135E+00 + PKER_RACCS ( 25, 26) = 0.369625E+00 + PKER_RACCS ( 25, 27) = 0.391222E+00 + PKER_RACCS ( 25, 28) = 0.408850E+00 + PKER_RACCS ( 25, 29) = 0.423262E+00 + PKER_RACCS ( 25, 30) = 0.435061E+00 + PKER_RACCS ( 25, 31) = 0.444734E+00 + PKER_RACCS ( 25, 32) = 0.452673E+00 + PKER_RACCS ( 25, 33) = 0.459196E+00 + PKER_RACCS ( 25, 34) = 0.464560E+00 + PKER_RACCS ( 25, 35) = 0.468974E+00 + PKER_RACCS ( 25, 36) = 0.472608E+00 + PKER_RACCS ( 25, 37) = 0.475602E+00 + PKER_RACCS ( 25, 38) = 0.478070E+00 + PKER_RACCS ( 25, 39) = 0.480104E+00 + PKER_RACCS ( 25, 40) = 0.481782E+00 + PKER_RACCS ( 26, 1) = 0.153206E+02 + PKER_RACCS ( 26, 2) = 0.126129E+02 + PKER_RACCS ( 26, 3) = 0.103707E+02 + PKER_RACCS ( 26, 4) = 0.851394E+01 + PKER_RACCS ( 26, 5) = 0.697612E+01 + PKER_RACCS ( 26, 6) = 0.570228E+01 + PKER_RACCS ( 26, 7) = 0.464688E+01 + PKER_RACCS ( 26, 8) = 0.377223E+01 + PKER_RACCS ( 26, 9) = 0.304711E+01 + PKER_RACCS ( 26, 10) = 0.244567E+01 + PKER_RACCS ( 26, 11) = 0.194653E+01 + PKER_RACCS ( 26, 12) = 0.153202E+01 + PKER_RACCS ( 26, 13) = 0.118766E+01 + PKER_RACCS ( 26, 14) = 0.901746E+00 + PKER_RACCS ( 26, 15) = 0.665390E+00 + PKER_RACCS ( 26, 16) = 0.472866E+00 + PKER_RACCS ( 26, 17) = 0.322299E+00 + PKER_RACCS ( 26, 18) = 0.215438E+00 + PKER_RACCS ( 26, 19) = 0.154776E+00 + PKER_RACCS ( 26, 20) = 0.138541E+00 + PKER_RACCS ( 26, 21) = 0.156867E+00 + PKER_RACCS ( 26, 22) = 0.194320E+00 + PKER_RACCS ( 26, 23) = 0.236800E+00 + PKER_RACCS ( 26, 24) = 0.276076E+00 + PKER_RACCS ( 26, 25) = 0.309341E+00 + PKER_RACCS ( 26, 26) = 0.336639E+00 + PKER_RACCS ( 26, 27) = 0.358880E+00 + PKER_RACCS ( 26, 28) = 0.377001E+00 + PKER_RACCS ( 26, 29) = 0.391788E+00 + PKER_RACCS ( 26, 30) = 0.403872E+00 + PKER_RACCS ( 26, 31) = 0.413761E+00 + PKER_RACCS ( 26, 32) = 0.421865E+00 + PKER_RACCS ( 26, 33) = 0.428514E+00 + PKER_RACCS ( 26, 34) = 0.433974E+00 + PKER_RACCS ( 26, 35) = 0.438462E+00 + PKER_RACCS ( 26, 36) = 0.442154E+00 + PKER_RACCS ( 26, 37) = 0.445192E+00 + PKER_RACCS ( 26, 38) = 0.447694E+00 + PKER_RACCS ( 26, 39) = 0.449755E+00 + PKER_RACCS ( 26, 40) = 0.451454E+00 + PKER_RACCS ( 27, 1) = 0.153513E+02 + PKER_RACCS ( 27, 2) = 0.126440E+02 + PKER_RACCS ( 27, 3) = 0.104024E+02 + PKER_RACCS ( 27, 4) = 0.854622E+01 + PKER_RACCS ( 27, 5) = 0.700904E+01 + PKER_RACCS ( 27, 6) = 0.573589E+01 + PKER_RACCS ( 27, 7) = 0.468125E+01 + PKER_RACCS ( 27, 8) = 0.380743E+01 + PKER_RACCS ( 27, 9) = 0.308321E+01 + PKER_RACCS ( 27, 10) = 0.248274E+01 + PKER_RACCS ( 27, 11) = 0.198462E+01 + PKER_RACCS ( 27, 12) = 0.157114E+01 + PKER_RACCS ( 27, 13) = 0.122770E+01 + PKER_RACCS ( 27, 14) = 0.942392E+00 + PKER_RACCS ( 27, 15) = 0.705810E+00 + PKER_RACCS ( 27, 16) = 0.511279E+00 + PKER_RACCS ( 27, 17) = 0.355415E+00 + PKER_RACCS ( 27, 18) = 0.238463E+00 + PKER_RACCS ( 27, 19) = 0.163223E+00 + PKER_RACCS ( 27, 20) = 0.130700E+00 + PKER_RACCS ( 27, 21) = 0.135369E+00 + PKER_RACCS ( 27, 22) = 0.164571E+00 + PKER_RACCS ( 27, 23) = 0.203879E+00 + PKER_RACCS ( 27, 24) = 0.242868E+00 + PKER_RACCS ( 27, 25) = 0.276880E+00 + PKER_RACCS ( 27, 26) = 0.305049E+00 + PKER_RACCS ( 27, 27) = 0.328022E+00 + PKER_RACCS ( 27, 28) = 0.346718E+00 + PKER_RACCS ( 27, 29) = 0.361946E+00 + PKER_RACCS ( 27, 30) = 0.374368E+00 + PKER_RACCS ( 27, 31) = 0.384516E+00 + PKER_RACCS ( 27, 32) = 0.392817E+00 + PKER_RACCS ( 27, 33) = 0.399617E+00 + PKER_RACCS ( 27, 34) = 0.405192E+00 + PKER_RACCS ( 27, 35) = 0.409769E+00 + PKER_RACCS ( 27, 36) = 0.413529E+00 + PKER_RACCS ( 27, 37) = 0.416620E+00 + PKER_RACCS ( 27, 38) = 0.419163E+00 + PKER_RACCS ( 27, 39) = 0.421256E+00 + PKER_RACCS ( 27, 40) = 0.422980E+00 + PKER_RACCS ( 28, 1) = 0.153787E+02 + PKER_RACCS ( 28, 2) = 0.126718E+02 + PKER_RACCS ( 28, 3) = 0.104307E+02 + PKER_RACCS ( 28, 4) = 0.857492E+01 + PKER_RACCS ( 28, 5) = 0.703823E+01 + PKER_RACCS ( 28, 6) = 0.576563E+01 + PKER_RACCS ( 28, 7) = 0.471159E+01 + PKER_RACCS ( 28, 8) = 0.383843E+01 + PKER_RACCS ( 28, 9) = 0.311494E+01 + PKER_RACCS ( 28, 10) = 0.251526E+01 + PKER_RACCS ( 28, 11) = 0.201799E+01 + PKER_RACCS ( 28, 12) = 0.160542E+01 + PKER_RACCS ( 28, 13) = 0.126288E+01 + PKER_RACCS ( 28, 14) = 0.978347E+00 + PKER_RACCS ( 28, 15) = 0.742102E+00 + PKER_RACCS ( 28, 16) = 0.546792E+00 + PKER_RACCS ( 28, 17) = 0.387821E+00 + PKER_RACCS ( 28, 18) = 0.264011E+00 + PKER_RACCS ( 28, 19) = 0.177228E+00 + PKER_RACCS ( 28, 20) = 0.129810E+00 + PKER_RACCS ( 28, 21) = 0.120099E+00 + PKER_RACCS ( 28, 22) = 0.139117E+00 + PKER_RACCS ( 28, 23) = 0.173453E+00 + PKER_RACCS ( 28, 24) = 0.211216E+00 + PKER_RACCS ( 28, 25) = 0.245678E+00 + PKER_RACCS ( 28, 26) = 0.274712E+00 + PKER_RACCS ( 28, 27) = 0.298492E+00 + PKER_RACCS ( 28, 28) = 0.317842E+00 + PKER_RACCS ( 28, 29) = 0.333584E+00 + PKER_RACCS ( 28, 30) = 0.346404E+00 + PKER_RACCS ( 28, 31) = 0.356858E+00 + PKER_RACCS ( 28, 32) = 0.365393E+00 + PKER_RACCS ( 28, 33) = 0.372373E+00 + PKER_RACCS ( 28, 34) = 0.378086E+00 + PKER_RACCS ( 28, 35) = 0.382769E+00 + PKER_RACCS ( 28, 36) = 0.386611E+00 + PKER_RACCS ( 28, 37) = 0.389765E+00 + PKER_RACCS ( 28, 38) = 0.392357E+00 + PKER_RACCS ( 28, 39) = 0.394489E+00 + PKER_RACCS ( 28, 40) = 0.396242E+00 + PKER_RACCS ( 29, 1) = 0.154034E+02 + PKER_RACCS ( 29, 2) = 0.126968E+02 + PKER_RACCS ( 29, 3) = 0.104560E+02 + PKER_RACCS ( 29, 4) = 0.860059E+01 + PKER_RACCS ( 29, 5) = 0.706430E+01 + PKER_RACCS ( 29, 6) = 0.579212E+01 + PKER_RACCS ( 29, 7) = 0.473855E+01 + PKER_RACCS ( 29, 8) = 0.386591E+01 + PKER_RACCS ( 29, 9) = 0.314299E+01 + PKER_RACCS ( 29, 10) = 0.254395E+01 + PKER_RACCS ( 29, 11) = 0.204738E+01 + PKER_RACCS ( 29, 12) = 0.163556E+01 + PKER_RACCS ( 29, 13) = 0.129383E+01 + PKER_RACCS ( 29, 14) = 0.101007E+01 + PKER_RACCS ( 29, 15) = 0.774394E+00 + PKER_RACCS ( 29, 16) = 0.579032E+00 + PKER_RACCS ( 29, 17) = 0.418516E+00 + PKER_RACCS ( 29, 18) = 0.290262E+00 + PKER_RACCS ( 29, 19) = 0.194914E+00 + PKER_RACCS ( 29, 20) = 0.134958E+00 + PKER_RACCS ( 29, 21) = 0.111247E+00 + PKER_RACCS ( 29, 22) = 0.118691E+00 + PKER_RACCS ( 29, 23) = 0.146181E+00 + PKER_RACCS ( 29, 24) = 0.181396E+00 + PKER_RACCS ( 29, 25) = 0.215756E+00 + PKER_RACCS ( 29, 26) = 0.245535E+00 + PKER_RACCS ( 29, 27) = 0.270155E+00 + PKER_RACCS ( 29, 28) = 0.290229E+00 + PKER_RACCS ( 29, 29) = 0.306555E+00 + PKER_RACCS ( 29, 30) = 0.319836E+00 + PKER_RACCS ( 29, 31) = 0.330648E+00 + PKER_RACCS ( 29, 32) = 0.339462E+00 + PKER_RACCS ( 29, 33) = 0.346655E+00 + PKER_RACCS ( 29, 34) = 0.352533E+00 + PKER_RACCS ( 29, 35) = 0.357343E+00 + PKER_RACCS ( 29, 36) = 0.361282E+00 + PKER_RACCS ( 29, 37) = 0.364512E+00 + PKER_RACCS ( 29, 38) = 0.367163E+00 + PKER_RACCS ( 29, 39) = 0.369340E+00 + PKER_RACCS ( 29, 40) = 0.371129E+00 + PKER_RACCS ( 30, 1) = 0.154257E+02 + PKER_RACCS ( 30, 2) = 0.127194E+02 + PKER_RACCS ( 30, 3) = 0.104788E+02 + PKER_RACCS ( 30, 4) = 0.862370E+01 + PKER_RACCS ( 30, 5) = 0.708771E+01 + PKER_RACCS ( 30, 6) = 0.581587E+01 + PKER_RACCS ( 30, 7) = 0.476266E+01 + PKER_RACCS ( 30, 8) = 0.389043E+01 + PKER_RACCS ( 30, 9) = 0.316795E+01 + PKER_RACCS ( 30, 10) = 0.256941E+01 + PKER_RACCS ( 30, 11) = 0.207340E+01 + PKER_RACCS ( 30, 12) = 0.166220E+01 + PKER_RACCS ( 30, 13) = 0.132114E+01 + PKER_RACCS ( 30, 14) = 0.103807E+01 + PKER_RACCS ( 30, 15) = 0.803030E+00 + PKER_RACCS ( 30, 16) = 0.607970E+00 + PKER_RACCS ( 30, 17) = 0.446859E+00 + PKER_RACCS ( 30, 18) = 0.316050E+00 + PKER_RACCS ( 30, 19) = 0.214747E+00 + PKER_RACCS ( 30, 20) = 0.144869E+00 + PKER_RACCS ( 30, 21) = 0.108490E+00 + PKER_RACCS ( 30, 22) = 0.103788E+00 + PKER_RACCS ( 30, 23) = 0.122733E+00 + PKER_RACCS ( 30, 24) = 0.153869E+00 + PKER_RACCS ( 30, 25) = 0.187267E+00 + PKER_RACCS ( 30, 26) = 0.217494E+00 + PKER_RACCS ( 30, 27) = 0.242915E+00 + PKER_RACCS ( 30, 28) = 0.263753E+00 + PKER_RACCS ( 30, 29) = 0.280725E+00 + PKER_RACCS ( 30, 30) = 0.294528E+00 + PKER_RACCS ( 30, 31) = 0.305756E+00 + PKER_RACCS ( 30, 32) = 0.314894E+00 + PKER_RACCS ( 30, 33) = 0.322340E+00 + PKER_RACCS ( 30, 34) = 0.328414E+00 + PKER_RACCS ( 30, 35) = 0.333374E+00 + PKER_RACCS ( 30, 36) = 0.337431E+00 + PKER_RACCS ( 30, 37) = 0.340751E+00 + PKER_RACCS ( 30, 38) = 0.343472E+00 + PKER_RACCS ( 30, 39) = 0.345703E+00 + PKER_RACCS ( 30, 40) = 0.347534E+00 + PKER_RACCS ( 31, 1) = 0.154460E+02 + PKER_RACCS ( 31, 2) = 0.127399E+02 + PKER_RACCS ( 31, 3) = 0.104995E+02 + PKER_RACCS ( 31, 4) = 0.864461E+01 + PKER_RACCS ( 31, 5) = 0.710885E+01 + PKER_RACCS ( 31, 6) = 0.583727E+01 + PKER_RACCS ( 31, 7) = 0.478435E+01 + PKER_RACCS ( 31, 8) = 0.391243E+01 + PKER_RACCS ( 31, 9) = 0.319031E+01 + PKER_RACCS ( 31, 10) = 0.259216E+01 + PKER_RACCS ( 31, 11) = 0.209658E+01 + PKER_RACCS ( 31, 12) = 0.168588E+01 + PKER_RACCS ( 31, 13) = 0.134536E+01 + PKER_RACCS ( 31, 14) = 0.106288E+01 + PKER_RACCS ( 31, 15) = 0.828426E+00 + PKER_RACCS ( 31, 16) = 0.633811E+00 + PKER_RACCS ( 31, 17) = 0.472627E+00 + PKER_RACCS ( 31, 18) = 0.340455E+00 + PKER_RACCS ( 31, 19) = 0.235395E+00 + PKER_RACCS ( 31, 20) = 0.158197E+00 + PKER_RACCS ( 31, 21) = 0.111047E+00 + PKER_RACCS ( 31, 22) = 0.944902E-01 + PKER_RACCS ( 31, 23) = 0.103740E+00 + PKER_RACCS ( 31, 24) = 0.129188E+00 + PKER_RACCS ( 31, 25) = 0.160505E+00 + PKER_RACCS ( 31, 26) = 0.190663E+00 + PKER_RACCS ( 31, 27) = 0.216732E+00 + PKER_RACCS ( 31, 28) = 0.238325E+00 + PKER_RACCS ( 31, 29) = 0.255978E+00 + PKER_RACCS ( 31, 30) = 0.270357E+00 + PKER_RACCS ( 31, 31) = 0.282055E+00 + PKER_RACCS ( 31, 32) = 0.291568E+00 + PKER_RACCS ( 31, 33) = 0.299310E+00 + PKER_RACCS ( 31, 34) = 0.305614E+00 + PKER_RACCS ( 31, 35) = 0.310754E+00 + PKER_RACCS ( 31, 36) = 0.314949E+00 + PKER_RACCS ( 31, 37) = 0.318377E+00 + PKER_RACCS ( 31, 38) = 0.321181E+00 + PKER_RACCS ( 31, 39) = 0.323477E+00 + PKER_RACCS ( 31, 40) = 0.325358E+00 + PKER_RACCS ( 32, 1) = 0.154645E+02 + PKER_RACCS ( 32, 2) = 0.127586E+02 + PKER_RACCS ( 32, 3) = 0.105183E+02 + PKER_RACCS ( 32, 4) = 0.866361E+01 + PKER_RACCS ( 32, 5) = 0.712804E+01 + PKER_RACCS ( 32, 6) = 0.585666E+01 + PKER_RACCS ( 32, 7) = 0.480396E+01 + PKER_RACCS ( 32, 8) = 0.393229E+01 + PKER_RACCS ( 32, 9) = 0.321044E+01 + PKER_RACCS ( 32, 10) = 0.261259E+01 + PKER_RACCS ( 32, 11) = 0.211736E+01 + PKER_RACCS ( 32, 12) = 0.170704E+01 + PKER_RACCS ( 32, 13) = 0.136696E+01 + PKER_RACCS ( 32, 14) = 0.108496E+01 + PKER_RACCS ( 32, 15) = 0.851011E+00 + PKER_RACCS ( 32, 16) = 0.656851E+00 + PKER_RACCS ( 32, 17) = 0.495858E+00 + PKER_RACCS ( 32, 18) = 0.363104E+00 + PKER_RACCS ( 32, 19) = 0.255729E+00 + PKER_RACCS ( 32, 20) = 0.173391E+00 + PKER_RACCS ( 32, 21) = 0.117751E+00 + PKER_RACCS ( 32, 22) = 0.904719E-01 + PKER_RACCS ( 32, 23) = 0.895825E-01 + PKER_RACCS ( 32, 24) = 0.107971E+00 + PKER_RACCS ( 32, 25) = 0.135888E+00 + PKER_RACCS ( 32, 26) = 0.165226E+00 + PKER_RACCS ( 32, 27) = 0.191642E+00 + PKER_RACCS ( 32, 28) = 0.213902E+00 + PKER_RACCS ( 32, 29) = 0.232232E+00 + PKER_RACCS ( 32, 30) = 0.247217E+00 + PKER_RACCS ( 32, 31) = 0.259430E+00 + PKER_RACCS ( 32, 32) = 0.269367E+00 + PKER_RACCS ( 32, 33) = 0.277448E+00 + PKER_RACCS ( 32, 34) = 0.284022E+00 + PKER_RACCS ( 32, 35) = 0.289372E+00 + PKER_RACCS ( 32, 36) = 0.293732E+00 + PKER_RACCS ( 32, 37) = 0.297288E+00 + PKER_RACCS ( 32, 38) = 0.300191E+00 + PKER_RACCS ( 32, 39) = 0.302565E+00 + PKER_RACCS ( 32, 40) = 0.304507E+00 + PKER_RACCS ( 33, 1) = 0.154815E+02 + PKER_RACCS ( 33, 2) = 0.127757E+02 + PKER_RACCS ( 33, 3) = 0.105355E+02 + PKER_RACCS ( 33, 4) = 0.868096E+01 + PKER_RACCS ( 33, 5) = 0.714554E+01 + PKER_RACCS ( 33, 6) = 0.587431E+01 + PKER_RACCS ( 33, 7) = 0.482179E+01 + PKER_RACCS ( 33, 8) = 0.395030E+01 + PKER_RACCS ( 33, 9) = 0.322867E+01 + PKER_RACCS ( 33, 10) = 0.263106E+01 + PKER_RACCS ( 33, 11) = 0.213609E+01 + PKER_RACCS ( 33, 12) = 0.172607E+01 + PKER_RACCS ( 33, 13) = 0.138633E+01 + PKER_RACCS ( 33, 14) = 0.110471E+01 + PKER_RACCS ( 33, 15) = 0.871183E+00 + PKER_RACCS ( 33, 16) = 0.677438E+00 + PKER_RACCS ( 33, 17) = 0.516731E+00 + PKER_RACCS ( 33, 18) = 0.383819E+00 + PKER_RACCS ( 33, 19) = 0.275185E+00 + PKER_RACCS ( 33, 20) = 0.189408E+00 + PKER_RACCS ( 33, 21) = 0.127387E+00 + PKER_RACCS ( 33, 22) = 0.909968E-01 + PKER_RACCS ( 33, 23) = 0.802651E-01 + PKER_RACCS ( 33, 24) = 0.906465E-01 + PKER_RACCS ( 33, 25) = 0.113901E+00 + PKER_RACCS ( 33, 26) = 0.141477E+00 + PKER_RACCS ( 33, 27) = 0.167764E+00 + PKER_RACCS ( 33, 28) = 0.190502E+00 + PKER_RACCS ( 33, 29) = 0.209445E+00 + PKER_RACCS ( 33, 30) = 0.225030E+00 + PKER_RACCS ( 33, 31) = 0.237783E+00 + PKER_RACCS ( 33, 32) = 0.248183E+00 + PKER_RACCS ( 33, 33) = 0.256648E+00 + PKER_RACCS ( 33, 34) = 0.263530E+00 + PKER_RACCS ( 33, 35) = 0.269127E+00 + PKER_RACCS ( 33, 36) = 0.273680E+00 + PKER_RACCS ( 33, 37) = 0.277387E+00 + PKER_RACCS ( 33, 38) = 0.280409E+00 + PKER_RACCS ( 33, 39) = 0.282874E+00 + PKER_RACCS ( 33, 40) = 0.284888E+00 + PKER_RACCS ( 34, 1) = 0.154971E+02 + PKER_RACCS ( 34, 2) = 0.127914E+02 + PKER_RACCS ( 34, 3) = 0.105513E+02 + PKER_RACCS ( 34, 4) = 0.869687E+01 + PKER_RACCS ( 34, 5) = 0.716155E+01 + PKER_RACCS ( 34, 6) = 0.589045E+01 + PKER_RACCS ( 34, 7) = 0.483806E+01 + PKER_RACCS ( 34, 8) = 0.396672E+01 + PKER_RACCS ( 34, 9) = 0.324525E+01 + PKER_RACCS ( 34, 10) = 0.264782E+01 + PKER_RACCS ( 34, 11) = 0.215307E+01 + PKER_RACCS ( 34, 12) = 0.174328E+01 + PKER_RACCS ( 34, 13) = 0.140380E+01 + PKER_RACCS ( 34, 14) = 0.112249E+01 + PKER_RACCS ( 34, 15) = 0.889288E+00 + PKER_RACCS ( 34, 16) = 0.695896E+00 + PKER_RACCS ( 34, 17) = 0.535492E+00 + PKER_RACCS ( 34, 18) = 0.402635E+00 + PKER_RACCS ( 34, 19) = 0.293345E+00 + PKER_RACCS ( 34, 20) = 0.205473E+00 + PKER_RACCS ( 34, 21) = 0.138918E+00 + PKER_RACCS ( 34, 22) = 0.951741E-01 + PKER_RACCS ( 34, 23) = 0.754374E-01 + PKER_RACCS ( 34, 24) = 0.774875E-01 + PKER_RACCS ( 34, 25) = 0.949890E-01 + PKER_RACCS ( 34, 26) = 0.119774E+00 + PKER_RACCS ( 34, 27) = 0.145296E+00 + PKER_RACCS ( 34, 28) = 0.168211E+00 + PKER_RACCS ( 34, 29) = 0.187630E+00 + PKER_RACCS ( 34, 30) = 0.203759E+00 + PKER_RACCS ( 34, 31) = 0.217043E+00 + PKER_RACCS ( 34, 32) = 0.227927E+00 + PKER_RACCS ( 34, 33) = 0.236809E+00 + PKER_RACCS ( 34, 34) = 0.244039E+00 + PKER_RACCS ( 34, 35) = 0.249918E+00 + PKER_RACCS ( 34, 36) = 0.254696E+00 + PKER_RACCS ( 34, 37) = 0.258581E+00 + PKER_RACCS ( 34, 38) = 0.261742E+00 + PKER_RACCS ( 34, 39) = 0.264317E+00 + PKER_RACCS ( 34, 40) = 0.266416E+00 + PKER_RACCS ( 35, 1) = 0.155115E+02 + PKER_RACCS ( 35, 2) = 0.128058E+02 + PKER_RACCS ( 35, 3) = 0.105659E+02 + PKER_RACCS ( 35, 4) = 0.871149E+01 + PKER_RACCS ( 35, 5) = 0.717627E+01 + PKER_RACCS ( 35, 6) = 0.590526E+01 + PKER_RACCS ( 35, 7) = 0.485298E+01 + PKER_RACCS ( 35, 8) = 0.398175E+01 + PKER_RACCS ( 35, 9) = 0.326040E+01 + PKER_RACCS ( 35, 10) = 0.266312E+01 + PKER_RACCS ( 35, 11) = 0.216852E+01 + PKER_RACCS ( 35, 12) = 0.175891E+01 + PKER_RACCS ( 35, 13) = 0.141964E+01 + PKER_RACCS ( 35, 14) = 0.113856E+01 + PKER_RACCS ( 35, 15) = 0.905624E+00 + PKER_RACCS ( 35, 16) = 0.712519E+00 + PKER_RACCS ( 35, 17) = 0.552390E+00 + PKER_RACCS ( 35, 18) = 0.419682E+00 + PKER_RACCS ( 35, 19) = 0.310127E+00 + PKER_RACCS ( 35, 20) = 0.220956E+00 + PKER_RACCS ( 35, 21) = 0.151287E+00 + PKER_RACCS ( 35, 22) = 0.101963E+00 + PKER_RACCS ( 35, 23) = 0.745072E-01 + PKER_RACCS ( 35, 24) = 0.684396E-01 + PKER_RACCS ( 35, 25) = 0.794810E-01 + PKER_RACCS ( 35, 26) = 0.100476E+00 + PKER_RACCS ( 35, 27) = 0.124496E+00 + PKER_RACCS ( 35, 28) = 0.147175E+00 + PKER_RACCS ( 35, 29) = 0.166857E+00 + PKER_RACCS ( 35, 30) = 0.183413E+00 + PKER_RACCS ( 35, 31) = 0.197175E+00 + PKER_RACCS ( 35, 32) = 0.208532E+00 + PKER_RACCS ( 35, 33) = 0.217848E+00 + PKER_RACCS ( 35, 34) = 0.225456E+00 + PKER_RACCS ( 35, 35) = 0.231651E+00 + PKER_RACCS ( 35, 36) = 0.236687E+00 + PKER_RACCS ( 35, 37) = 0.240779E+00 + PKER_RACCS ( 35, 38) = 0.244104E+00 + PKER_RACCS ( 35, 39) = 0.246808E+00 + PKER_RACCS ( 35, 40) = 0.249007E+00 + PKER_RACCS ( 36, 1) = 0.155248E+02 + PKER_RACCS ( 36, 2) = 0.128192E+02 + PKER_RACCS ( 36, 3) = 0.105793E+02 + PKER_RACCS ( 36, 4) = 0.872498E+01 + PKER_RACCS ( 36, 5) = 0.718982E+01 + PKER_RACCS ( 36, 6) = 0.591889E+01 + PKER_RACCS ( 36, 7) = 0.486669E+01 + PKER_RACCS ( 36, 8) = 0.399555E+01 + PKER_RACCS ( 36, 9) = 0.327430E+01 + PKER_RACCS ( 36, 10) = 0.267713E+01 + PKER_RACCS ( 36, 11) = 0.218265E+01 + PKER_RACCS ( 36, 12) = 0.177318E+01 + PKER_RACCS ( 36, 13) = 0.143407E+01 + PKER_RACCS ( 36, 14) = 0.115317E+01 + PKER_RACCS ( 36, 15) = 0.920438E+00 + PKER_RACCS ( 36, 16) = 0.727562E+00 + PKER_RACCS ( 36, 17) = 0.567668E+00 + PKER_RACCS ( 36, 18) = 0.435133E+00 + PKER_RACCS ( 36, 19) = 0.325510E+00 + PKER_RACCS ( 36, 20) = 0.235636E+00 + PKER_RACCS ( 36, 21) = 0.163886E+00 + PKER_RACCS ( 36, 22) = 0.110458E+00 + PKER_RACCS ( 36, 23) = 0.766826E-01 + PKER_RACCS ( 36, 24) = 0.631683E-01 + PKER_RACCS ( 36, 25) = 0.674487E-01 + PKER_RACCS ( 36, 26) = 0.838666E-01 + PKER_RACCS ( 36, 27) = 0.105624E+00 + PKER_RACCS ( 36, 28) = 0.127576E+00 + PKER_RACCS ( 36, 29) = 0.147242E+00 + PKER_RACCS ( 36, 30) = 0.164054E+00 + PKER_RACCS ( 36, 31) = 0.178188E+00 + PKER_RACCS ( 36, 32) = 0.189965E+00 + PKER_RACCS ( 36, 33) = 0.199703E+00 + PKER_RACCS ( 36, 34) = 0.207702E+00 + PKER_RACCS ( 36, 35) = 0.214240E+00 + PKER_RACCS ( 36, 36) = 0.219565E+00 + PKER_RACCS ( 36, 37) = 0.223893E+00 + PKER_RACCS ( 36, 38) = 0.227409E+00 + PKER_RACCS ( 36, 39) = 0.230264E+00 + PKER_RACCS ( 36, 40) = 0.232583E+00 + PKER_RACCS ( 37, 1) = 0.155372E+02 + PKER_RACCS ( 37, 2) = 0.128316E+02 + PKER_RACCS ( 37, 3) = 0.105917E+02 + PKER_RACCS ( 37, 4) = 0.873745E+01 + PKER_RACCS ( 37, 5) = 0.720235E+01 + PKER_RACCS ( 37, 6) = 0.593147E+01 + PKER_RACCS ( 37, 7) = 0.487933E+01 + PKER_RACCS ( 37, 8) = 0.400827E+01 + PKER_RACCS ( 37, 9) = 0.328710E+01 + PKER_RACCS ( 37, 10) = 0.269001E+01 + PKER_RACCS ( 37, 11) = 0.219563E+01 + PKER_RACCS ( 37, 12) = 0.178626E+01 + PKER_RACCS ( 37, 13) = 0.144727E+01 + PKER_RACCS ( 37, 14) = 0.116651E+01 + PKER_RACCS ( 37, 15) = 0.933935E+00 + PKER_RACCS ( 37, 16) = 0.741238E+00 + PKER_RACCS ( 37, 17) = 0.581536E+00 + PKER_RACCS ( 37, 18) = 0.449170E+00 + PKER_RACCS ( 37, 19) = 0.339580E+00 + PKER_RACCS ( 37, 20) = 0.249319E+00 + PKER_RACCS ( 37, 21) = 0.176301E+00 + PKER_RACCS ( 37, 22) = 0.119980E+00 + PKER_RACCS ( 37, 23) = 0.812228E-01 + PKER_RACCS ( 37, 24) = 0.611617E-01 + PKER_RACCS ( 37, 25) = 0.588377E-01 + PKER_RACCS ( 37, 26) = 0.701370E-01 + PKER_RACCS ( 37, 27) = 0.889143E-01 + PKER_RACCS ( 37, 28) = 0.109599E+00 + PKER_RACCS ( 37, 29) = 0.128927E+00 + PKER_RACCS ( 37, 30) = 0.145782E+00 + PKER_RACCS ( 37, 31) = 0.160136E+00 + PKER_RACCS ( 37, 32) = 0.172235E+00 + PKER_RACCS ( 37, 33) = 0.182345E+00 + PKER_RACCS ( 37, 34) = 0.190722E+00 + PKER_RACCS ( 37, 35) = 0.197614E+00 + PKER_RACCS ( 37, 36) = 0.203250E+00 + PKER_RACCS ( 37, 37) = 0.207843E+00 + PKER_RACCS ( 37, 38) = 0.211576E+00 + PKER_RACCS ( 37, 39) = 0.214606E+00 + PKER_RACCS ( 37, 40) = 0.217065E+00 + PKER_RACCS ( 38, 1) = 0.155486E+02 + PKER_RACCS ( 38, 2) = 0.128431E+02 + PKER_RACCS ( 38, 3) = 0.106033E+02 + PKER_RACCS ( 38, 4) = 0.874901E+01 + PKER_RACCS ( 38, 5) = 0.721394E+01 + PKER_RACCS ( 38, 6) = 0.594312E+01 + PKER_RACCS ( 38, 7) = 0.489103E+01 + PKER_RACCS ( 38, 8) = 0.402001E+01 + PKER_RACCS ( 38, 9) = 0.329890E+01 + PKER_RACCS ( 38, 10) = 0.270188E+01 + PKER_RACCS ( 38, 11) = 0.220757E+01 + PKER_RACCS ( 38, 12) = 0.179829E+01 + PKER_RACCS ( 38, 13) = 0.145939E+01 + PKER_RACCS ( 38, 14) = 0.117873E+01 + PKER_RACCS ( 38, 15) = 0.946284E+00 + PKER_RACCS ( 38, 16) = 0.753726E+00 + PKER_RACCS ( 38, 17) = 0.594177E+00 + PKER_RACCS ( 38, 18) = 0.461958E+00 + PKER_RACCS ( 38, 19) = 0.352443E+00 + PKER_RACCS ( 38, 20) = 0.262014E+00 + PKER_RACCS ( 38, 21) = 0.188177E+00 + PKER_RACCS ( 38, 22) = 0.129859E+00 + PKER_RACCS ( 38, 23) = 0.873684E-01 + PKER_RACCS ( 38, 24) = 0.618482E-01 + PKER_RACCS ( 38, 25) = 0.533670E-01 + PKER_RACCS ( 38, 26) = 0.593061E-01 + PKER_RACCS ( 38, 27) = 0.745116E-01 + PKER_RACCS ( 38, 28) = 0.934019E-01 + PKER_RACCS ( 38, 29) = 0.112045E+00 + PKER_RACCS ( 38, 30) = 0.128716E+00 + PKER_RACCS ( 38, 31) = 0.143109E+00 + PKER_RACCS ( 38, 32) = 0.155390E+00 + PKER_RACCS ( 38, 33) = 0.165779E+00 + PKER_RACCS ( 38, 34) = 0.174487E+00 + PKER_RACCS ( 38, 35) = 0.181718E+00 + PKER_RACCS ( 38, 36) = 0.187676E+00 + PKER_RACCS ( 38, 37) = 0.192553E+00 + PKER_RACCS ( 38, 38) = 0.196528E+00 + PKER_RACCS ( 38, 39) = 0.199758E+00 + PKER_RACCS ( 38, 40) = 0.202379E+00 + PKER_RACCS ( 39, 1) = 0.155593E+02 + PKER_RACCS ( 39, 2) = 0.128537E+02 + PKER_RACCS ( 39, 3) = 0.106139E+02 + PKER_RACCS ( 39, 4) = 0.875973E+01 + PKER_RACCS ( 39, 5) = 0.722471E+01 + PKER_RACCS ( 39, 6) = 0.595391E+01 + PKER_RACCS ( 39, 7) = 0.490186E+01 + PKER_RACCS ( 39, 8) = 0.403089E+01 + PKER_RACCS ( 39, 9) = 0.330982E+01 + PKER_RACCS ( 39, 10) = 0.271285E+01 + PKER_RACCS ( 39, 11) = 0.221860E+01 + PKER_RACCS ( 39, 12) = 0.180938E+01 + PKER_RACCS ( 39, 13) = 0.147055E+01 + PKER_RACCS ( 39, 14) = 0.118998E+01 + PKER_RACCS ( 39, 15) = 0.957626E+00 + PKER_RACCS ( 39, 16) = 0.765175E+00 + PKER_RACCS ( 39, 17) = 0.605746E+00 + PKER_RACCS ( 39, 18) = 0.473650E+00 + PKER_RACCS ( 39, 19) = 0.364221E+00 + PKER_RACCS ( 39, 20) = 0.273730E+00 + PKER_RACCS ( 39, 21) = 0.199436E+00 + PKER_RACCS ( 39, 22) = 0.139756E+00 + PKER_RACCS ( 39, 23) = 0.945196E-01 + PKER_RACCS ( 39, 24) = 0.645897E-01 + PKER_RACCS ( 39, 25) = 0.506197E-01 + PKER_RACCS ( 39, 26) = 0.512198E-01 + PKER_RACCS ( 39, 27) = 0.624590E-01 + PKER_RACCS ( 39, 28) = 0.790782E-01 + PKER_RACCS ( 39, 29) = 0.966942E-01 + PKER_RACCS ( 39, 30) = 0.112959E+00 + PKER_RACCS ( 39, 31) = 0.127212E+00 + PKER_RACCS ( 39, 32) = 0.139513E+00 + PKER_RACCS ( 39, 33) = 0.150051E+00 + PKER_RACCS ( 39, 34) = 0.159002E+00 + PKER_RACCS ( 39, 35) = 0.166528E+00 + PKER_RACCS ( 39, 36) = 0.172792E+00 + PKER_RACCS ( 39, 37) = 0.177962E+00 + PKER_RACCS ( 39, 38) = 0.182197E+00 + PKER_RACCS ( 39, 39) = 0.185650E+00 + PKER_RACCS ( 39, 40) = 0.188455E+00 + PKER_RACCS ( 40, 1) = 0.155692E+02 + PKER_RACCS ( 40, 2) = 0.128637E+02 + PKER_RACCS ( 40, 3) = 0.106239E+02 + PKER_RACCS ( 40, 4) = 0.876971E+01 + PKER_RACCS ( 40, 5) = 0.723471E+01 + PKER_RACCS ( 40, 6) = 0.596394E+01 + PKER_RACCS ( 40, 7) = 0.491192E+01 + PKER_RACCS ( 40, 8) = 0.404098E+01 + PKER_RACCS ( 40, 9) = 0.331995E+01 + PKER_RACCS ( 40, 10) = 0.272302E+01 + PKER_RACCS ( 40, 11) = 0.222881E+01 + PKER_RACCS ( 40, 12) = 0.181964E+01 + PKER_RACCS ( 40, 13) = 0.148087E+01 + PKER_RACCS ( 40, 14) = 0.120036E+01 + PKER_RACCS ( 40, 15) = 0.968076E+00 + PKER_RACCS ( 40, 16) = 0.775708E+00 + PKER_RACCS ( 40, 17) = 0.616371E+00 + PKER_RACCS ( 40, 18) = 0.484375E+00 + PKER_RACCS ( 40, 19) = 0.375030E+00 + PKER_RACCS ( 40, 20) = 0.284536E+00 + PKER_RACCS ( 40, 21) = 0.209971E+00 + PKER_RACCS ( 40, 22) = 0.149448E+00 + PKER_RACCS ( 40, 23) = 0.102257E+00 + PKER_RACCS ( 40, 24) = 0.688589E-01 + PKER_RACCS ( 40, 25) = 0.501439E-01 + PKER_RACCS ( 40, 26) = 0.457017E-01 + PKER_RACCS ( 40, 27) = 0.527560E-01 + PKER_RACCS ( 40, 28) = 0.666825E-01 + PKER_RACCS ( 40, 29) = 0.829271E-01 + PKER_RACCS ( 40, 30) = 0.985768E-01 + PKER_RACCS ( 40, 31) = 0.112531E+00 + PKER_RACCS ( 40, 32) = 0.124696E+00 + PKER_RACCS ( 40, 33) = 0.135236E+00 + PKER_RACCS ( 40, 34) = 0.144309E+00 + PKER_RACCS ( 40, 35) = 0.152047E+00 + PKER_RACCS ( 40, 36) = 0.158575E+00 + PKER_RACCS ( 40, 37) = 0.164022E+00 + PKER_RACCS ( 40, 38) = 0.168524E+00 + PKER_RACCS ( 40, 39) = 0.172216E+00 + PKER_RACCS ( 40, 40) = 0.175226E+00 +END IF +! +IF( PRESENT(PKER_SACCRG) ) THEN + PKER_SACCRG( 1, 1) = 0.403346E-01 + PKER_SACCRG( 1, 2) = 0.679214E-01 + PKER_SACCRG( 1, 3) = 0.105303E+00 + PKER_SACCRG( 1, 4) = 0.191884E+00 + PKER_SACCRG( 1, 5) = 0.356499E+00 + PKER_SACCRG( 1, 6) = 0.645361E+00 + PKER_SACCRG( 1, 7) = 0.109656E+01 + PKER_SACCRG( 1, 8) = 0.172233E+01 + PKER_SACCRG( 1, 9) = 0.249565E+01 + PKER_SACCRG( 1, 10) = 0.335221E+01 + PKER_SACCRG( 1, 11) = 0.421020E+01 + PKER_SACCRG( 1, 12) = 0.500014E+01 + PKER_SACCRG( 1, 13) = 0.568528E+01 + PKER_SACCRG( 1, 14) = 0.626334E+01 + PKER_SACCRG( 1, 15) = 0.675253E+01 + PKER_SACCRG( 1, 16) = 0.717505E+01 + PKER_SACCRG( 1, 17) = 0.754648E+01 + PKER_SACCRG( 1, 18) = 0.787497E+01 + PKER_SACCRG( 1, 19) = 0.816359E+01 + PKER_SACCRG( 1, 20) = 0.839531E+01 + PKER_SACCRG( 1, 21) = 0.861132E+01 + PKER_SACCRG( 1, 22) = 0.879448E+01 + PKER_SACCRG( 1, 23) = 0.891918E+01 + PKER_SACCRG( 1, 24) = 0.905216E+01 + PKER_SACCRG( 1, 25) = 0.913347E+01 + PKER_SACCRG( 1, 26) = 0.920118E+01 + PKER_SACCRG( 1, 27) = 0.926006E+01 + PKER_SACCRG( 1, 28) = 0.928744E+01 + PKER_SACCRG( 1, 29) = 0.931698E+01 + PKER_SACCRG( 1, 30) = 0.934860E+01 + PKER_SACCRG( 1, 31) = 0.936637E+01 + PKER_SACCRG( 1, 32) = 0.937727E+01 + PKER_SACCRG( 1, 33) = 0.938596E+01 + PKER_SACCRG( 1, 34) = 0.938735E+01 + PKER_SACCRG( 1, 35) = 0.939455E+01 + PKER_SACCRG( 1, 36) = 0.940989E+01 + PKER_SACCRG( 1, 37) = 0.000000E+00 + PKER_SACCRG( 1, 38) = 0.000000E+00 + PKER_SACCRG( 1, 39) = 0.000000E+00 + PKER_SACCRG( 1, 40) = 0.000000E+00 + PKER_SACCRG( 2, 1) = 0.232705E-01 + PKER_SACCRG( 2, 2) = 0.335875E-01 + PKER_SACCRG( 2, 3) = 0.565187E-01 + PKER_SACCRG( 2, 4) = 0.875474E-01 + PKER_SACCRG( 2, 5) = 0.159343E+00 + PKER_SACCRG( 2, 6) = 0.295630E+00 + PKER_SACCRG( 2, 7) = 0.534289E+00 + PKER_SACCRG( 2, 8) = 0.906069E+00 + PKER_SACCRG( 2, 9) = 0.141997E+01 + PKER_SACCRG( 2, 10) = 0.205255E+01 + PKER_SACCRG( 2, 11) = 0.274997E+01 + PKER_SACCRG( 2, 12) = 0.344544E+01 + PKER_SACCRG( 2, 13) = 0.408314E+01 + PKER_SACCRG( 2, 14) = 0.463534E+01 + PKER_SACCRG( 2, 15) = 0.510239E+01 + PKER_SACCRG( 2, 16) = 0.550069E+01 + PKER_SACCRG( 2, 17) = 0.584817E+01 + PKER_SACCRG( 2, 18) = 0.615710E+01 + PKER_SACCRG( 2, 19) = 0.643286E+01 + PKER_SACCRG( 2, 20) = 0.665945E+01 + PKER_SACCRG( 2, 21) = 0.687323E+01 + PKER_SACCRG( 2, 22) = 0.705716E+01 + PKER_SACCRG( 2, 23) = 0.718460E+01 + PKER_SACCRG( 2, 24) = 0.732011E+01 + PKER_SACCRG( 2, 25) = 0.740395E+01 + PKER_SACCRG( 2, 26) = 0.747372E+01 + PKER_SACCRG( 2, 27) = 0.753430E+01 + PKER_SACCRG( 2, 28) = 0.756268E+01 + PKER_SACCRG( 2, 29) = 0.759307E+01 + PKER_SACCRG( 2, 30) = 0.762550E+01 + PKER_SACCRG( 2, 31) = 0.764373E+01 + PKER_SACCRG( 2, 32) = 0.765493E+01 + PKER_SACCRG( 2, 33) = 0.766384E+01 + PKER_SACCRG( 2, 34) = 0.766528E+01 + PKER_SACCRG( 2, 35) = 0.767265E+01 + PKER_SACCRG( 2, 36) = 0.768832E+01 + PKER_SACCRG( 2, 37) = 0.000000E+00 + PKER_SACCRG( 2, 38) = 0.000000E+00 + PKER_SACCRG( 2, 39) = 0.000000E+00 + PKER_SACCRG( 2, 40) = 0.000000E+00 + PKER_SACCRG( 3, 1) = 0.183931E-01 + PKER_SACCRG( 3, 2) = 0.194765E-01 + PKER_SACCRG( 3, 3) = 0.280964E-01 + PKER_SACCRG( 3, 4) = 0.472341E-01 + PKER_SACCRG( 3, 5) = 0.730819E-01 + PKER_SACCRG( 3, 6) = 0.132827E+00 + PKER_SACCRG( 3, 7) = 0.245992E+00 + PKER_SACCRG( 3, 8) = 0.443632E+00 + PKER_SACCRG( 3, 9) = 0.750424E+00 + PKER_SACCRG( 3, 10) = 0.117268E+01 + PKER_SACCRG( 3, 11) = 0.168954E+01 + PKER_SACCRG( 3, 12) = 0.225593E+01 + PKER_SACCRG( 3, 13) = 0.281701E+01 + PKER_SACCRG( 3, 14) = 0.332851E+01 + PKER_SACCRG( 3, 15) = 0.377021E+01 + PKER_SACCRG( 3, 16) = 0.414495E+01 + PKER_SACCRG( 3, 17) = 0.446759E+01 + PKER_SACCRG( 3, 18) = 0.475325E+01 + PKER_SACCRG( 3, 19) = 0.501103E+01 + PKER_SACCRG( 3, 20) = 0.522794E+01 + PKER_SACCRG( 3, 21) = 0.543570E+01 + PKER_SACCRG( 3, 22) = 0.561785E+01 + PKER_SACCRG( 3, 23) = 0.574685E+01 + PKER_SACCRG( 3, 24) = 0.588391E+01 + PKER_SACCRG( 3, 25) = 0.597001E+01 + PKER_SACCRG( 3, 26) = 0.604169E+01 + PKER_SACCRG( 3, 27) = 0.610387E+01 + PKER_SACCRG( 3, 28) = 0.613328E+01 + PKER_SACCRG( 3, 29) = 0.616451E+01 + PKER_SACCRG( 3, 30) = 0.619771E+01 + PKER_SACCRG( 3, 31) = 0.621641E+01 + PKER_SACCRG( 3, 32) = 0.622789E+01 + PKER_SACCRG( 3, 33) = 0.623702E+01 + PKER_SACCRG( 3, 34) = 0.623852E+01 + PKER_SACCRG( 3, 35) = 0.624605E+01 + PKER_SACCRG( 3, 36) = 0.626204E+01 + PKER_SACCRG( 3, 37) = 0.000000E+00 + PKER_SACCRG( 3, 38) = 0.000000E+00 + PKER_SACCRG( 3, 39) = 0.000000E+00 + PKER_SACCRG( 3, 40) = 0.000000E+00 + PKER_SACCRG( 4, 1) = 0.114393E-01 + PKER_SACCRG( 4, 2) = 0.155094E-01 + PKER_SACCRG( 4, 3) = 0.164106E-01 + PKER_SACCRG( 4, 4) = 0.236526E-01 + PKER_SACCRG( 4, 5) = 0.397213E-01 + PKER_SACCRG( 4, 6) = 0.613666E-01 + PKER_SACCRG( 4, 7) = 0.111326E+00 + PKER_SACCRG( 4, 8) = 0.205685E+00 + PKER_SACCRG( 4, 9) = 0.369928E+00 + PKER_SACCRG( 4, 10) = 0.623698E+00 + PKER_SACCRG( 4, 11) = 0.970783E+00 + PKER_SACCRG( 4, 12) = 0.139255E+01 + PKER_SACCRG( 4, 13) = 0.185072E+01 + PKER_SACCRG( 4, 14) = 0.230015E+01 + PKER_SACCRG( 4, 15) = 0.270627E+01 + PKER_SACCRG( 4, 16) = 0.305559E+01 + PKER_SACCRG( 4, 17) = 0.335340E+01 + PKER_SACCRG( 4, 18) = 0.361392E+01 + PKER_SACCRG( 4, 19) = 0.384970E+01 + PKER_SACCRG( 4, 20) = 0.405246E+01 + PKER_SACCRG( 4, 21) = 0.425002E+01 + PKER_SACCRG( 4, 22) = 0.442724E+01 + PKER_SACCRG( 4, 23) = 0.455616E+01 + PKER_SACCRG( 4, 24) = 0.469337E+01 + PKER_SACCRG( 4, 25) = 0.478122E+01 + PKER_SACCRG( 4, 26) = 0.485452E+01 + PKER_SACCRG( 4, 27) = 0.491813E+01 + PKER_SACCRG( 4, 28) = 0.494855E+01 + PKER_SACCRG( 4, 29) = 0.498058E+01 + PKER_SACCRG( 4, 30) = 0.501450E+01 + PKER_SACCRG( 4, 31) = 0.503365E+01 + PKER_SACCRG( 4, 32) = 0.504542E+01 + PKER_SACCRG( 4, 33) = 0.505475E+01 + PKER_SACCRG( 4, 34) = 0.505631E+01 + PKER_SACCRG( 4, 35) = 0.506399E+01 + PKER_SACCRG( 4, 36) = 0.508029E+01 + PKER_SACCRG( 4, 37) = 0.000000E+00 + PKER_SACCRG( 4, 38) = 0.000000E+00 + PKER_SACCRG( 4, 39) = 0.000000E+00 + PKER_SACCRG( 4, 40) = 0.000000E+00 + PKER_SACCRG( 5, 1) = 0.885989E-02 + PKER_SACCRG( 5, 2) = 0.975839E-02 + PKER_SACCRG( 5, 3) = 0.132035E-01 + PKER_SACCRG( 5, 4) = 0.139558E-01 + PKER_SACCRG( 5, 5) = 0.200916E-01 + PKER_SACCRG( 5, 6) = 0.296110E-01 + PKER_SACCRG( 5, 7) = 0.519536E-01 + PKER_SACCRG( 5, 8) = 0.940172E-01 + PKER_SACCRG( 5, 9) = 0.173205E+00 + PKER_SACCRG( 5, 10) = 0.310322E+00 + PKER_SACCRG( 5, 11) = 0.520780E+00 + PKER_SACCRG( 5, 12) = 0.806566E+00 + PKER_SACCRG( 5, 13) = 0.115020E+01 + PKER_SACCRG( 5, 14) = 0.151872E+01 + PKER_SACCRG( 5, 15) = 0.187497E+01 + PKER_SACCRG( 5, 16) = 0.219377E+01 + PKER_SACCRG( 5, 17) = 0.246641E+01 + PKER_SACCRG( 5, 18) = 0.270162E+01 + PKER_SACCRG( 5, 19) = 0.291200E+01 + PKER_SACCRG( 5, 20) = 0.309558E+01 + PKER_SACCRG( 5, 21) = 0.327751E+01 + PKER_SACCRG( 5, 22) = 0.344551E+01 + PKER_SACCRG( 5, 23) = 0.357190E+01 + PKER_SACCRG( 5, 24) = 0.370734E+01 + PKER_SACCRG( 5, 25) = 0.379614E+01 + PKER_SACCRG( 5, 26) = 0.387059E+01 + PKER_SACCRG( 5, 27) = 0.393531E+01 + PKER_SACCRG( 5, 28) = 0.396669E+01 + PKER_SACCRG( 5, 29) = 0.399944E+01 + PKER_SACCRG( 5, 30) = 0.403397E+01 + PKER_SACCRG( 5, 31) = 0.405353E+01 + PKER_SACCRG( 5, 32) = 0.406555E+01 + PKER_SACCRG( 5, 33) = 0.407508E+01 + PKER_SACCRG( 5, 34) = 0.407671E+01 + PKER_SACCRG( 5, 35) = 0.408453E+01 + PKER_SACCRG( 5, 36) = 0.410107E+01 + PKER_SACCRG( 5, 37) = 0.000000E+00 + PKER_SACCRG( 5, 38) = 0.000000E+00 + PKER_SACCRG( 5, 39) = 0.000000E+00 + PKER_SACCRG( 5, 40) = 0.000000E+00 + PKER_SACCRG( 6, 1) = 0.939278E-02 + PKER_SACCRG( 6, 2) = 0.770370E-02 + PKER_SACCRG( 6, 3) = 0.844219E-02 + PKER_SACCRG( 6, 4) = 0.113902E-01 + PKER_SACCRG( 6, 5) = 0.120225E-01 + PKER_SACCRG( 6, 6) = 0.172828E-01 + PKER_SACCRG( 6, 7) = 0.254190E-01 + PKER_SACCRG( 6, 8) = 0.444876E-01 + PKER_SACCRG( 6, 9) = 0.802697E-01 + PKER_SACCRG( 6, 10) = 0.147308E+00 + PKER_SACCRG( 6, 11) = 0.262153E+00 + PKER_SACCRG( 6, 12) = 0.437891E+00 + PKER_SACCRG( 6, 13) = 0.673319E+00 + PKER_SACCRG( 6, 14) = 0.951922E+00 + PKER_SACCRG( 6, 15) = 0.124486E+01 + PKER_SACCRG( 6, 16) = 0.152378E+01 + PKER_SACCRG( 6, 17) = 0.176859E+01 + PKER_SACCRG( 6, 18) = 0.197911E+01 + PKER_SACCRG( 6, 19) = 0.216406E+01 + PKER_SACCRG( 6, 20) = 0.232602E+01 + PKER_SACCRG( 6, 21) = 0.248802E+01 + PKER_SACCRG( 6, 22) = 0.264189E+01 + PKER_SACCRG( 6, 23) = 0.276205E+01 + PKER_SACCRG( 6, 24) = 0.289262E+01 + PKER_SACCRG( 6, 25) = 0.298091E+01 + PKER_SACCRG( 6, 26) = 0.305566E+01 + PKER_SACCRG( 6, 27) = 0.312099E+01 + PKER_SACCRG( 6, 28) = 0.315321E+01 + PKER_SACCRG( 6, 29) = 0.318651E+01 + PKER_SACCRG( 6, 30) = 0.322151E+01 + PKER_SACCRG( 6, 31) = 0.324141E+01 + PKER_SACCRG( 6, 32) = 0.325366E+01 + PKER_SACCRG( 6, 33) = 0.326335E+01 + PKER_SACCRG( 6, 34) = 0.326504E+01 + PKER_SACCRG( 6, 35) = 0.327297E+01 + PKER_SACCRG( 6, 36) = 0.328972E+01 + PKER_SACCRG( 6, 37) = 0.000000E+00 + PKER_SACCRG( 6, 38) = 0.000000E+00 + PKER_SACCRG( 6, 39) = 0.000000E+00 + PKER_SACCRG( 6, 40) = 0.000000E+00 + PKER_SACCRG( 7, 1) = 0.197193E-02 + PKER_SACCRG( 7, 2) = 0.840926E-02 + PKER_SACCRG( 7, 3) = 0.684203E-02 + PKER_SACCRG( 7, 4) = 0.744934E-02 + PKER_SACCRG( 7, 5) = 0.100142E-01 + PKER_SACCRG( 7, 6) = 0.105435E-01 + PKER_SACCRG( 7, 7) = 0.151114E-01 + PKER_SACCRG( 7, 8) = 0.221799E-01 + PKER_SACCRG( 7, 9) = 0.387273E-01 + PKER_SACCRG( 7, 10) = 0.696342E-01 + PKER_SACCRG( 7, 11) = 0.126786E+00 + PKER_SACCRG( 7, 12) = 0.224173E+00 + PKER_SACCRG( 7, 13) = 0.371284E+00 + PKER_SACCRG( 7, 14) = 0.564401E+00 + PKER_SACCRG( 7, 15) = 0.787177E+00 + PKER_SACCRG( 7, 16) = 0.101687E+01 + PKER_SACCRG( 7, 17) = 0.122807E+01 + PKER_SACCRG( 7, 18) = 0.141258E+01 + PKER_SACCRG( 7, 19) = 0.157270E+01 + PKER_SACCRG( 7, 20) = 0.171283E+01 + PKER_SACCRG( 7, 21) = 0.185341E+01 + PKER_SACCRG( 7, 22) = 0.199032E+01 + PKER_SACCRG( 7, 23) = 0.210129E+01 + PKER_SACCRG( 7, 24) = 0.222356E+01 + PKER_SACCRG( 7, 25) = 0.230903E+01 + PKER_SACCRG( 7, 26) = 0.238240E+01 + PKER_SACCRG( 7, 27) = 0.244719E+01 + PKER_SACCRG( 7, 28) = 0.247983E+01 + PKER_SACCRG( 7, 29) = 0.251337E+01 + PKER_SACCRG( 7, 30) = 0.254858E+01 + PKER_SACCRG( 7, 31) = 0.256871E+01 + PKER_SACCRG( 7, 32) = 0.258114E+01 + PKER_SACCRG( 7, 33) = 0.259094E+01 + PKER_SACCRG( 7, 34) = 0.259270E+01 + PKER_SACCRG( 7, 35) = 0.260070E+01 + PKER_SACCRG( 7, 36) = 0.261756E+01 + PKER_SACCRG( 7, 37) = 0.000000E+00 + PKER_SACCRG( 7, 38) = 0.000000E+00 + PKER_SACCRG( 7, 39) = 0.000000E+00 + PKER_SACCRG( 7, 40) = 0.000000E+00 + PKER_SACCRG( 8, 1) = 0.287028E-02 + PKER_SACCRG( 8, 2) = 0.183962E-02 + PKER_SACCRG( 8, 3) = 0.778156E-02 + PKER_SACCRG( 8, 4) = 0.626956E-02 + PKER_SACCRG( 8, 5) = 0.676623E-02 + PKER_SACCRG( 8, 6) = 0.546166E-02 + PKER_SACCRG( 8, 7) = 0.943103E-02 + PKER_SACCRG( 8, 8) = 0.135380E-01 + PKER_SACCRG( 8, 9) = 0.198532E-01 + PKER_SACCRG( 8, 10) = 0.345712E-01 + PKER_SACCRG( 8, 11) = 0.614306E-01 + PKER_SACCRG( 8, 12) = 0.111431E+00 + PKER_SACCRG( 8, 13) = 0.195294E+00 + PKER_SACCRG( 8, 14) = 0.318747E+00 + PKER_SACCRG( 8, 15) = 0.475607E+00 + PKER_SACCRG( 8, 16) = 0.653793E+00 + PKER_SACCRG( 8, 17) = 0.827434E+00 + PKER_SACCRG( 8, 18) = 0.984457E+00 + PKER_SACCRG( 8, 19) = 0.111823E+01 + PKER_SACCRG( 8, 20) = 0.123445E+01 + PKER_SACCRG( 8, 21) = 0.135038E+01 + PKER_SACCRG( 8, 22) = 0.146703E+01 + PKER_SACCRG( 8, 23) = 0.156617E+01 + PKER_SACCRG( 8, 24) = 0.167765E+01 + PKER_SACCRG( 8, 25) = 0.175863E+01 + PKER_SACCRG( 8, 26) = 0.182918E+01 + PKER_SACCRG( 8, 27) = 0.189212E+01 + PKER_SACCRG( 8, 28) = 0.192450E+01 + PKER_SACCRG( 8, 29) = 0.195757E+01 + PKER_SACCRG( 8, 30) = 0.199227E+01 + PKER_SACCRG( 8, 31) = 0.201226E+01 + PKER_SACCRG( 8, 32) = 0.202464E+01 + PKER_SACCRG( 8, 33) = 0.203441E+01 + PKER_SACCRG( 8, 34) = 0.203619E+01 + PKER_SACCRG( 8, 35) = 0.204416E+01 + PKER_SACCRG( 8, 36) = 0.206100E+01 + PKER_SACCRG( 8, 37) = 0.000000E+00 + PKER_SACCRG( 8, 38) = 0.000000E+00 + PKER_SACCRG( 8, 39) = 0.000000E+00 + PKER_SACCRG( 8, 40) = 0.000000E+00 + PKER_SACCRG( 9, 1) = 0.227973E-03 + PKER_SACCRG( 9, 2) = 0.282707E-02 + PKER_SACCRG( 9, 3) = 0.180146E-02 + PKER_SACCRG( 9, 4) = 0.195291E-02 + PKER_SACCRG( 9, 5) = 0.601462E-02 + PKER_SACCRG( 9, 6) = 0.639847E-02 + PKER_SACCRG( 9, 7) = 0.503409E-02 + PKER_SACCRG( 9, 8) = 0.874760E-02 + PKER_SACCRG( 9, 9) = 0.125924E-01 + PKER_SACCRG( 9, 10) = 0.187098E-01 + PKER_SACCRG( 9, 11) = 0.315437E-01 + PKER_SACCRG( 9, 12) = 0.563136E-01 + PKER_SACCRG( 9, 13) = 0.100517E+00 + PKER_SACCRG( 9, 14) = 0.173643E+00 + PKER_SACCRG( 9, 15) = 0.275822E+00 + PKER_SACCRG( 9, 16) = 0.405835E+00 + PKER_SACCRG( 9, 17) = 0.540959E+00 + PKER_SACCRG( 9, 18) = 0.670349E+00 + PKER_SACCRG( 9, 19) = 0.779801E+00 + PKER_SACCRG( 9, 20) = 0.873659E+00 + PKER_SACCRG( 9, 21) = 0.964651E+00 + PKER_SACCRG( 9, 22) = 0.105792E+01 + PKER_SACCRG( 9, 23) = 0.114069E+01 + PKER_SACCRG( 9, 24) = 0.123707E+01 + PKER_SACCRG( 9, 25) = 0.131072E+01 + PKER_SACCRG( 9, 26) = 0.137674E+01 + PKER_SACCRG( 9, 27) = 0.143675E+01 + PKER_SACCRG( 9, 28) = 0.146856E+01 + PKER_SACCRG( 9, 29) = 0.150083E+01 + PKER_SACCRG( 9, 30) = 0.153465E+01 + PKER_SACCRG( 9, 31) = 0.155430E+01 + PKER_SACCRG( 9, 32) = 0.156652E+01 + PKER_SACCRG( 9, 33) = 0.157614E+01 + PKER_SACCRG( 9, 34) = 0.157797E+01 + PKER_SACCRG( 9, 35) = 0.158578E+01 + PKER_SACCRG( 9, 36) = 0.160221E+01 + PKER_SACCRG( 9, 37) = 0.000000E+00 + PKER_SACCRG( 9, 38) = 0.000000E+00 + PKER_SACCRG( 9, 39) = 0.000000E+00 + PKER_SACCRG( 9, 40) = 0.000000E+00 + PKER_SACCRG( 10, 1) = 0.836884E-05 + PKER_SACCRG( 10, 2) = 0.241023E-03 + PKER_SACCRG( 10, 3) = 0.298555E-02 + PKER_SACCRG( 10, 4) = 0.189539E-02 + PKER_SACCRG( 10, 5) = 0.204013E-02 + PKER_SACCRG( 10, 6) = 0.618434E-02 + PKER_SACCRG( 10, 7) = 0.624911E-02 + PKER_SACCRG( 10, 8) = 0.493580E-02 + PKER_SACCRG( 10, 9) = 0.859150E-02 + PKER_SACCRG( 10, 10) = 0.132122E-01 + PKER_SACCRG( 10, 11) = 0.178104E-01 + PKER_SACCRG( 10, 12) = 0.313842E-01 + PKER_SACCRG( 10, 13) = 0.543137E-01 + PKER_SACCRG( 10, 14) = 0.957524E-01 + PKER_SACCRG( 10, 15) = 0.158366E+00 + PKER_SACCRG( 10, 16) = 0.250247E+00 + PKER_SACCRG( 10, 17) = 0.351339E+00 + PKER_SACCRG( 10, 18) = 0.455229E+00 + PKER_SACCRG( 10, 19) = 0.541376E+00 + PKER_SACCRG( 10, 20) = 0.613508E+00 + PKER_SACCRG( 10, 21) = 0.679512E+00 + PKER_SACCRG( 10, 22) = 0.748499E+00 + PKER_SACCRG( 10, 23) = 0.812917E+00 + PKER_SACCRG( 10, 24) = 0.891097E+00 + PKER_SACCRG( 10, 25) = 0.953782E+00 + PKER_SACCRG( 10, 26) = 0.101178E+01 + PKER_SACCRG( 10, 27) = 0.106610E+01 + PKER_SACCRG( 10, 28) = 0.109586E+01 + PKER_SACCRG( 10, 29) = 0.112638E+01 + PKER_SACCRG( 10, 30) = 0.115867E+01 + PKER_SACCRG( 10, 31) = 0.117769E+01 + PKER_SACCRG( 10, 32) = 0.118959E+01 + PKER_SACCRG( 10, 33) = 0.119896E+01 + PKER_SACCRG( 10, 34) = 0.120079E+01 + PKER_SACCRG( 10, 35) = 0.120838E+01 + PKER_SACCRG( 10, 36) = 0.122431E+01 + PKER_SACCRG( 10, 37) = 0.000000E+00 + PKER_SACCRG( 10, 38) = 0.000000E+00 + PKER_SACCRG( 10, 39) = 0.000000E+00 + PKER_SACCRG( 10, 40) = 0.000000E+00 + PKER_SACCRG( 11, 1) = 0.000000E+00 + PKER_SACCRG( 11, 2) = 0.984489E-05 + PKER_SACCRG( 11, 3) = 0.280498E-03 + PKER_SACCRG( 11, 4) = 0.349195E-02 + PKER_SACCRG( 11, 5) = 0.223140E-02 + PKER_SACCRG( 11, 6) = 0.240058E-02 + PKER_SACCRG( 11, 7) = 0.683543E-02 + PKER_SACCRG( 11, 8) = 0.692007E-02 + PKER_SACCRG( 11, 9) = 0.514199E-02 + PKER_SACCRG( 11, 10) = 0.114977E-01 + PKER_SACCRG( 11, 11) = 0.109728E-01 + PKER_SACCRG( 11, 12) = 0.211442E-01 + PKER_SACCRG( 11, 13) = 0.346586E-01 + PKER_SACCRG( 11, 14) = 0.591042E-01 + PKER_SACCRG( 11, 15) = 0.961841E-01 + PKER_SACCRG( 11, 16) = 0.162562E+00 + PKER_SACCRG( 11, 17) = 0.237843E+00 + PKER_SACCRG( 11, 18) = 0.321714E+00 + PKER_SACCRG( 11, 19) = 0.387542E+00 + PKER_SACCRG( 11, 20) = 0.440755E+00 + PKER_SACCRG( 11, 21) = 0.483048E+00 + PKER_SACCRG( 11, 22) = 0.527421E+00 + PKER_SACCRG( 11, 23) = 0.571319E+00 + PKER_SACCRG( 11, 24) = 0.628617E+00 + PKER_SACCRG( 11, 25) = 0.677728E+00 + PKER_SACCRG( 11, 26) = 0.725464E+00 + PKER_SACCRG( 11, 27) = 0.771793E+00 + PKER_SACCRG( 11, 28) = 0.798056E+00 + PKER_SACCRG( 11, 29) = 0.825035E+00 + PKER_SACCRG( 11, 30) = 0.853830E+00 + PKER_SACCRG( 11, 31) = 0.871001E+00 + PKER_SACCRG( 11, 32) = 0.881834E+00 + PKER_SACCRG( 11, 33) = 0.890401E+00 + PKER_SACCRG( 11, 34) = 0.892044E+00 + PKER_SACCRG( 11, 35) = 0.899026E+00 + PKER_SACCRG( 11, 36) = 0.913978E+00 + PKER_SACCRG( 11, 37) = 0.000000E+00 + PKER_SACCRG( 11, 38) = 0.000000E+00 + PKER_SACCRG( 11, 39) = 0.000000E+00 + PKER_SACCRG( 11, 40) = 0.000000E+00 + PKER_SACCRG( 12, 1) = 0.000000E+00 + PKER_SACCRG( 12, 2) = 0.000000E+00 + PKER_SACCRG( 12, 3) = 0.131525E-04 + PKER_SACCRG( 12, 4) = 0.376734E-03 + PKER_SACCRG( 12, 5) = 0.481352E-02 + PKER_SACCRG( 12, 6) = 0.318057E-02 + PKER_SACCRG( 12, 7) = 0.345470E-02 + PKER_SACCRG( 12, 8) = 0.420666E-02 + PKER_SACCRG( 12, 9) = 0.383001E-02 + PKER_SACCRG( 12, 10) = 0.110848E-01 + PKER_SACCRG( 12, 11) = 0.934829E-02 + PKER_SACCRG( 12, 12) = 0.183949E-01 + PKER_SACCRG( 12, 13) = 0.295675E-01 + PKER_SACCRG( 12, 14) = 0.470543E-01 + PKER_SACCRG( 12, 15) = 0.695886E-01 + PKER_SACCRG( 12, 16) = 0.122527E+00 + PKER_SACCRG( 12, 17) = 0.181754E+00 + PKER_SACCRG( 12, 18) = 0.253508E+00 + PKER_SACCRG( 12, 19) = 0.304324E+00 + PKER_SACCRG( 12, 20) = 0.342444E+00 + PKER_SACCRG( 12, 21) = 0.363399E+00 + PKER_SACCRG( 12, 22) = 0.384221E+00 + PKER_SACCRG( 12, 23) = 0.406941E+00 + PKER_SACCRG( 12, 24) = 0.441951E+00 + PKER_SACCRG( 12, 25) = 0.474892E+00 + PKER_SACCRG( 12, 26) = 0.509393E+00 + PKER_SACCRG( 12, 27) = 0.545053E+00 + PKER_SACCRG( 12, 28) = 0.566107E+00 + PKER_SACCRG( 12, 29) = 0.588592E+00 + PKER_SACCRG( 12, 30) = 0.613355E+00 + PKER_SACCRG( 12, 31) = 0.628544E+00 + PKER_SACCRG( 12, 32) = 0.638273E+00 + PKER_SACCRG( 12, 33) = 0.646003E+00 + PKER_SACCRG( 12, 34) = 0.647602E+00 + PKER_SACCRG( 12, 35) = 0.653888E+00 + PKER_SACCRG( 12, 36) = 0.667119E+00 + PKER_SACCRG( 12, 37) = 0.000000E+00 + PKER_SACCRG( 12, 38) = 0.000000E+00 + PKER_SACCRG( 12, 39) = 0.000000E+00 + PKER_SACCRG( 12, 40) = 0.000000E+00 + PKER_SACCRG( 13, 1) = 0.000000E+00 + PKER_SACCRG( 13, 2) = 0.000000E+00 + PKER_SACCRG( 13, 3) = 0.715754E-07 + PKER_SACCRG( 13, 4) = 0.213213E-04 + PKER_SACCRG( 13, 5) = 0.638125E-03 + PKER_SACCRG( 13, 6) = 0.842445E-03 + PKER_SACCRG( 13, 7) = 0.719221E-02 + PKER_SACCRG( 13, 8) = 0.932081E-02 + PKER_SACCRG( 13, 9) = 0.442957E-02 + PKER_SACCRG( 13, 10) = 0.154869E-01 + PKER_SACCRG( 13, 11) = 0.137909E-01 + PKER_SACCRG( 13, 12) = 0.248513E-01 + PKER_SACCRG( 13, 13) = 0.394496E-01 + PKER_SACCRG( 13, 14) = 0.513911E-01 + PKER_SACCRG( 13, 15) = 0.661668E-01 + PKER_SACCRG( 13, 16) = 0.115529E+00 + PKER_SACCRG( 13, 17) = 0.166381E+00 + PKER_SACCRG( 13, 18) = 0.234091E+00 + PKER_SACCRG( 13, 19) = 0.276281E+00 + PKER_SACCRG( 13, 20) = 0.304686E+00 + PKER_SACCRG( 13, 21) = 0.307989E+00 + PKER_SACCRG( 13, 22) = 0.307891E+00 + PKER_SACCRG( 13, 23) = 0.310412E+00 + PKER_SACCRG( 13, 24) = 0.323293E+00 + PKER_SACCRG( 13, 25) = 0.338766E+00 + PKER_SACCRG( 13, 26) = 0.358236E+00 + PKER_SACCRG( 13, 27) = 0.380952E+00 + PKER_SACCRG( 13, 28) = 0.395254E+00 + PKER_SACCRG( 13, 29) = 0.411396E+00 + PKER_SACCRG( 13, 30) = 0.429868E+00 + PKER_SACCRG( 13, 31) = 0.441480E+00 + PKER_SACCRG( 13, 32) = 0.449014E+00 + PKER_SACCRG( 13, 33) = 0.455042E+00 + PKER_SACCRG( 13, 34) = 0.456301E+00 + PKER_SACCRG( 13, 35) = 0.461238E+00 + PKER_SACCRG( 13, 36) = 0.471725E+00 + PKER_SACCRG( 13, 37) = 0.000000E+00 + PKER_SACCRG( 13, 38) = 0.000000E+00 + PKER_SACCRG( 13, 39) = 0.000000E+00 + PKER_SACCRG( 13, 40) = 0.000000E+00 + PKER_SACCRG( 14, 1) = 0.000000E+00 + PKER_SACCRG( 14, 2) = 0.000000E+00 + PKER_SACCRG( 14, 3) = 0.000000E+00 + PKER_SACCRG( 14, 4) = 0.381946E-06 + PKER_SACCRG( 14, 5) = 0.473573E-04 + PKER_SACCRG( 14, 6) = 0.165120E-02 + PKER_SACCRG( 14, 7) = 0.389733E-02 + PKER_SACCRG( 14, 8) = 0.389488E-01 + PKER_SACCRG( 14, 9) = 0.960356E-02 + PKER_SACCRG( 14, 10) = 0.289006E-01 + PKER_SACCRG( 14, 11) = 0.219911E-01 + PKER_SACCRG( 14, 12) = 0.526837E-01 + PKER_SACCRG( 14, 13) = 0.654887E-01 + PKER_SACCRG( 14, 14) = 0.683643E-01 + PKER_SACCRG( 14, 15) = 0.802145E-01 + PKER_SACCRG( 14, 16) = 0.134652E+00 + PKER_SACCRG( 14, 17) = 0.180678E+00 + PKER_SACCRG( 14, 18) = 0.248857E+00 + PKER_SACCRG( 14, 19) = 0.287693E+00 + PKER_SACCRG( 14, 20) = 0.311977E+00 + PKER_SACCRG( 14, 21) = 0.302501E+00 + PKER_SACCRG( 14, 22) = 0.285666E+00 + PKER_SACCRG( 14, 23) = 0.270663E+00 + PKER_SACCRG( 14, 24) = 0.263508E+00 + PKER_SACCRG( 14, 25) = 0.261858E+00 + PKER_SACCRG( 14, 26) = 0.265704E+00 + PKER_SACCRG( 14, 27) = 0.274260E+00 + PKER_SACCRG( 14, 28) = 0.280343E+00 + PKER_SACCRG( 14, 29) = 0.288745E+00 + PKER_SACCRG( 14, 30) = 0.299555E+00 + PKER_SACCRG( 14, 31) = 0.306742E+00 + PKER_SACCRG( 14, 32) = 0.311519E+00 + PKER_SACCRG( 14, 33) = 0.315446E+00 + PKER_SACCRG( 14, 34) = 0.316143E+00 + PKER_SACCRG( 14, 35) = 0.319453E+00 + PKER_SACCRG( 14, 36) = 0.326846E+00 + PKER_SACCRG( 14, 37) = 0.000000E+00 + PKER_SACCRG( 14, 38) = 0.000000E+00 + PKER_SACCRG( 14, 39) = 0.000000E+00 + PKER_SACCRG( 14, 40) = 0.000000E+00 + PKER_SACCRG( 15, 1) = 0.000000E+00 + PKER_SACCRG( 15, 2) = 0.000000E+00 + PKER_SACCRG( 15, 3) = 0.000000E+00 + PKER_SACCRG( 15, 4) = 0.000000E+00 + PKER_SACCRG( 15, 5) = 0.156840E-05 + PKER_SACCRG( 15, 6) = 0.190758E-03 + PKER_SACCRG( 15, 7) = 0.213304E-01 + PKER_SACCRG( 15, 8) = 0.441574E-01 + PKER_SACCRG( 15, 9) = 0.400468E-01 + PKER_SACCRG( 15, 10) = 0.704682E-01 + PKER_SACCRG( 15, 11) = 0.469944E-01 + PKER_SACCRG( 15, 12) = 0.981183E-01 + PKER_SACCRG( 15, 13) = 0.100527E+00 + PKER_SACCRG( 15, 14) = 0.109911E+00 + PKER_SACCRG( 15, 15) = 0.122766E+00 + PKER_SACCRG( 15, 16) = 0.166781E+00 + PKER_SACCRG( 15, 17) = 0.213821E+00 + PKER_SACCRG( 15, 18) = 0.285192E+00 + PKER_SACCRG( 15, 19) = 0.323590E+00 + PKER_SACCRG( 15, 20) = 0.348069E+00 + PKER_SACCRG( 15, 21) = 0.330921E+00 + PKER_SACCRG( 15, 22) = 0.302486E+00 + PKER_SACCRG( 15, 23) = 0.274134E+00 + PKER_SACCRG( 15, 24) = 0.250992E+00 + PKER_SACCRG( 15, 25) = 0.234616E+00 + PKER_SACCRG( 15, 26) = 0.224211E+00 + PKER_SACCRG( 15, 27) = 0.219091E+00 + PKER_SACCRG( 15, 28) = 0.216667E+00 + PKER_SACCRG( 15, 29) = 0.216954E+00 + PKER_SACCRG( 15, 30) = 0.219635E+00 + PKER_SACCRG( 15, 31) = 0.221903E+00 + PKER_SACCRG( 15, 32) = 0.223652E+00 + PKER_SACCRG( 15, 33) = 0.225260E+00 + PKER_SACCRG( 15, 34) = 0.225539E+00 + PKER_SACCRG( 15, 35) = 0.227017E+00 + PKER_SACCRG( 15, 36) = 0.230425E+00 + PKER_SACCRG( 15, 37) = 0.000000E+00 + PKER_SACCRG( 15, 38) = 0.000000E+00 + PKER_SACCRG( 15, 39) = 0.000000E+00 + PKER_SACCRG( 15, 40) = 0.000000E+00 + PKER_SACCRG( 16, 1) = 0.000000E+00 + PKER_SACCRG( 16, 2) = 0.000000E+00 + PKER_SACCRG( 16, 3) = 0.000000E+00 + PKER_SACCRG( 16, 4) = 0.000000E+00 + PKER_SACCRG( 16, 5) = 0.000000E+00 + PKER_SACCRG( 16, 6) = 0.119071E-04 + PKER_SACCRG( 16, 7) = 0.989929E-02 + PKER_SACCRG( 16, 8) = 0.528890E+00 + PKER_SACCRG( 16, 9) = 0.450696E-01 + PKER_SACCRG( 16, 10) = 0.655297E-01 + PKER_SACCRG( 16, 11) = 0.132187E+00 + PKER_SACCRG( 16, 12) = 0.215348E+00 + PKER_SACCRG( 16, 13) = 0.167588E+00 + PKER_SACCRG( 16, 14) = 0.216205E+00 + PKER_SACCRG( 16, 15) = 0.162196E+00 + PKER_SACCRG( 16, 16) = 0.244005E+00 + PKER_SACCRG( 16, 17) = 0.269648E+00 + PKER_SACCRG( 16, 18) = 0.340900E+00 + PKER_SACCRG( 16, 19) = 0.372264E+00 + PKER_SACCRG( 16, 20) = 0.398617E+00 + PKER_SACCRG( 16, 21) = 0.377733E+00 + PKER_SACCRG( 16, 22) = 0.342874E+00 + PKER_SACCRG( 16, 23) = 0.305984E+00 + PKER_SACCRG( 16, 24) = 0.271888E+00 + PKER_SACCRG( 16, 25) = 0.244614E+00 + PKER_SACCRG( 16, 26) = 0.222952E+00 + PKER_SACCRG( 16, 27) = 0.206393E+00 + PKER_SACCRG( 16, 28) = 0.196281E+00 + PKER_SACCRG( 16, 29) = 0.189043E+00 + PKER_SACCRG( 16, 30) = 0.183996E+00 + PKER_SACCRG( 16, 31) = 0.181421E+00 + PKER_SACCRG( 16, 32) = 0.180072E+00 + PKER_SACCRG( 16, 33) = 0.179344E+00 + PKER_SACCRG( 16, 34) = 0.178990E+00 + PKER_SACCRG( 16, 35) = 0.178753E+00 + PKER_SACCRG( 16, 36) = 0.178876E+00 + PKER_SACCRG( 16, 37) = 0.000000E+00 + PKER_SACCRG( 16, 38) = 0.000000E+00 + PKER_SACCRG( 16, 39) = 0.000000E+00 + PKER_SACCRG( 16, 40) = 0.000000E+00 + PKER_SACCRG( 17, 1) = 0.000000E+00 + PKER_SACCRG( 17, 2) = 0.000000E+00 + PKER_SACCRG( 17, 3) = 0.000000E+00 + PKER_SACCRG( 17, 4) = 0.000000E+00 + PKER_SACCRG( 17, 5) = 0.000000E+00 + PKER_SACCRG( 17, 6) = 0.284464E-06 + PKER_SACCRG( 17, 7) = 0.376463E-02 + PKER_SACCRG( 17, 8) = 0.586668E+00 + PKER_SACCRG( 17, 9) = 0.500034E-01 + PKER_SACCRG( 17, 10) = 0.220639E+00 + PKER_SACCRG( 17, 11) = 0.146258E+00 + PKER_SACCRG( 17, 12) = 0.237708E+00 + PKER_SACCRG( 17, 13) = 0.306782E+00 + PKER_SACCRG( 17, 14) = 0.354063E+00 + PKER_SACCRG( 17, 15) = 0.280860E+00 + PKER_SACCRG( 17, 16) = 0.308089E+00 + PKER_SACCRG( 17, 17) = 0.339505E+00 + PKER_SACCRG( 17, 18) = 0.414880E+00 + PKER_SACCRG( 17, 19) = 0.430629E+00 + PKER_SACCRG( 17, 20) = 0.452781E+00 + PKER_SACCRG( 17, 21) = 0.429564E+00 + PKER_SACCRG( 17, 22) = 0.392080E+00 + PKER_SACCRG( 17, 23) = 0.351048E+00 + PKER_SACCRG( 17, 24) = 0.310955E+00 + PKER_SACCRG( 17, 25) = 0.277207E+00 + PKER_SACCRG( 17, 26) = 0.248275E+00 + PKER_SACCRG( 17, 27) = 0.223790E+00 + PKER_SACCRG( 17, 28) = 0.208062E+00 + PKER_SACCRG( 17, 29) = 0.195017E+00 + PKER_SACCRG( 17, 30) = 0.183624E+00 + PKER_SACCRG( 17, 31) = 0.176886E+00 + PKER_SACCRG( 17, 32) = 0.172790E+00 + PKER_SACCRG( 17, 33) = 0.169882E+00 + PKER_SACCRG( 17, 34) = 0.169010E+00 + PKER_SACCRG( 17, 35) = 0.166994E+00 + PKER_SACCRG( 17, 36) = 0.163299E+00 + PKER_SACCRG( 17, 37) = 0.000000E+00 + PKER_SACCRG( 17, 38) = 0.000000E+00 + PKER_SACCRG( 17, 39) = 0.000000E+00 + PKER_SACCRG( 17, 40) = 0.000000E+00 + PKER_SACCRG( 18, 1) = 0.000000E+00 + PKER_SACCRG( 18, 2) = 0.000000E+00 + PKER_SACCRG( 18, 3) = 0.000000E+00 + PKER_SACCRG( 18, 4) = 0.000000E+00 + PKER_SACCRG( 18, 5) = 0.000000E+00 + PKER_SACCRG( 18, 6) = 0.000000E+00 + PKER_SACCRG( 18, 7) = 0.105382E-02 + PKER_SACCRG( 18, 8) = 0.635938E+00 + PKER_SACCRG( 18, 9) = 0.581236E+00 + PKER_SACCRG( 18, 10) = 0.175918E+00 + PKER_SACCRG( 18, 11) = 0.158333E+00 + PKER_SACCRG( 18, 12) = 0.645276E+00 + PKER_SACCRG( 18, 13) = 0.647795E+00 + PKER_SACCRG( 18, 14) = 0.383206E+00 + PKER_SACCRG( 18, 15) = 0.415829E+00 + PKER_SACCRG( 18, 16) = 0.392871E+00 + PKER_SACCRG( 18, 17) = 0.447385E+00 + PKER_SACCRG( 18, 18) = 0.473465E+00 + PKER_SACCRG( 18, 19) = 0.487585E+00 + PKER_SACCRG( 18, 20) = 0.505825E+00 + PKER_SACCRG( 18, 21) = 0.478975E+00 + PKER_SACCRG( 18, 22) = 0.440594E+00 + PKER_SACCRG( 18, 23) = 0.398291E+00 + PKER_SACCRG( 18, 24) = 0.355953E+00 + PKER_SACCRG( 18, 25) = 0.319332E+00 + PKER_SACCRG( 18, 26) = 0.286857E+00 + PKER_SACCRG( 18, 27) = 0.258053E+00 + PKER_SACCRG( 18, 28) = 0.239021E+00 + PKER_SACCRG( 18, 29) = 0.222386E+00 + PKER_SACCRG( 18, 30) = 0.206903E+00 + PKER_SACCRG( 18, 31) = 0.197361E+00 + PKER_SACCRG( 18, 32) = 0.191347E+00 + PKER_SACCRG( 18, 33) = 0.186901E+00 + PKER_SACCRG( 18, 34) = 0.185599E+00 + PKER_SACCRG( 18, 35) = 0.182341E+00 + PKER_SACCRG( 18, 36) = 0.176179E+00 + PKER_SACCRG( 18, 37) = 0.000000E+00 + PKER_SACCRG( 18, 38) = 0.000000E+00 + PKER_SACCRG( 18, 39) = 0.000000E+00 + PKER_SACCRG( 18, 40) = 0.000000E+00 + PKER_SACCRG( 19, 1) = 0.000000E+00 + PKER_SACCRG( 19, 2) = 0.000000E+00 + PKER_SACCRG( 19, 3) = 0.000000E+00 + PKER_SACCRG( 19, 4) = 0.000000E+00 + PKER_SACCRG( 19, 5) = 0.000000E+00 + PKER_SACCRG( 19, 6) = 0.000000E+00 + PKER_SACCRG( 19, 7) = 0.194865E-03 + PKER_SACCRG( 19, 8) = 0.676347E+00 + PKER_SACCRG( 19, 9) = 0.621969E+00 + PKER_SACCRG( 19, 10) = 0.131032E+00 + PKER_SACCRG( 19, 11) = 0.658583E+00 + PKER_SACCRG( 19, 12) = 0.685804E+00 + PKER_SACCRG( 19, 13) = 0.688335E+00 + PKER_SACCRG( 19, 14) = 0.677066E+00 + PKER_SACCRG( 19, 15) = 0.442768E+00 + PKER_SACCRG( 19, 16) = 0.511298E+00 + PKER_SACCRG( 19, 17) = 0.544390E+00 + PKER_SACCRG( 19, 18) = 0.574263E+00 + PKER_SACCRG( 19, 19) = 0.551361E+00 + PKER_SACCRG( 19, 20) = 0.554396E+00 + PKER_SACCRG( 19, 21) = 0.521768E+00 + PKER_SACCRG( 19, 22) = 0.483164E+00 + PKER_SACCRG( 19, 23) = 0.440915E+00 + PKER_SACCRG( 19, 24) = 0.398417E+00 + PKER_SACCRG( 19, 25) = 0.361201E+00 + PKER_SACCRG( 19, 26) = 0.327700E+00 + PKER_SACCRG( 19, 27) = 0.297381E+00 + PKER_SACCRG( 19, 28) = 0.276977E+00 + PKER_SACCRG( 19, 29) = 0.258775E+00 + PKER_SACCRG( 19, 30) = 0.241338E+00 + PKER_SACCRG( 19, 31) = 0.230370E+00 + PKER_SACCRG( 19, 32) = 0.223349E+00 + PKER_SACCRG( 19, 33) = 0.218072E+00 + PKER_SACCRG( 19, 34) = 0.216544E+00 + PKER_SACCRG( 19, 35) = 0.212586E+00 + PKER_SACCRG( 19, 36) = 0.204880E+00 + PKER_SACCRG( 19, 37) = 0.000000E+00 + PKER_SACCRG( 19, 38) = 0.000000E+00 + PKER_SACCRG( 19, 39) = 0.000000E+00 + PKER_SACCRG( 19, 40) = 0.000000E+00 + PKER_SACCRG( 20, 1) = 0.000000E+00 + PKER_SACCRG( 20, 2) = 0.000000E+00 + PKER_SACCRG( 20, 3) = 0.000000E+00 + PKER_SACCRG( 20, 4) = 0.000000E+00 + PKER_SACCRG( 20, 5) = 0.000000E+00 + PKER_SACCRG( 20, 6) = 0.000000E+00 + PKER_SACCRG( 20, 7) = 0.210974E-04 + PKER_SACCRG( 20, 8) = 0.709956E+00 + PKER_SACCRG( 20, 9) = 0.655815E+00 + PKER_SACCRG( 20, 10) = 0.956725E-01 + PKER_SACCRG( 20, 11) = 0.692386E+00 + PKER_SACCRG( 20, 12) = 0.719525E+00 + PKER_SACCRG( 20, 13) = 0.722068E+00 + PKER_SACCRG( 20, 14) = 0.710869E+00 + PKER_SACCRG( 20, 15) = 0.691117E+00 + PKER_SACCRG( 20, 16) = 0.690018E+00 + PKER_SACCRG( 20, 17) = 0.573065E+00 + PKER_SACCRG( 20, 18) = 0.605475E+00 + PKER_SACCRG( 20, 19) = 0.604580E+00 + PKER_SACCRG( 20, 20) = 0.595016E+00 + PKER_SACCRG( 20, 21) = 0.559020E+00 + PKER_SACCRG( 20, 22) = 0.519154E+00 + PKER_SACCRG( 20, 23) = 0.477263E+00 + PKER_SACCRG( 20, 24) = 0.435286E+00 + PKER_SACCRG( 20, 25) = 0.398364E+00 + PKER_SACCRG( 20, 26) = 0.364991E+00 + PKER_SACCRG( 20, 27) = 0.334611E+00 + PKER_SACCRG( 20, 28) = 0.313905E+00 + PKER_SACCRG( 20, 29) = 0.295342E+00 + PKER_SACCRG( 20, 30) = 0.277428E+00 + PKER_SACCRG( 20, 31) = 0.266023E+00 + PKER_SACCRG( 20, 32) = 0.258671E+00 + PKER_SACCRG( 20, 33) = 0.253118E+00 + PKER_SACCRG( 20, 34) = 0.251504E+00 + PKER_SACCRG( 20, 35) = 0.247323E+00 + PKER_SACCRG( 20, 36) = 0.239150E+00 + PKER_SACCRG( 20, 37) = 0.000000E+00 + PKER_SACCRG( 20, 38) = 0.000000E+00 + PKER_SACCRG( 20, 39) = 0.000000E+00 + PKER_SACCRG( 20, 40) = 0.000000E+00 + PKER_SACCRG( 21, 1) = 0.000000E+00 + PKER_SACCRG( 21, 2) = 0.000000E+00 + PKER_SACCRG( 21, 3) = 0.000000E+00 + PKER_SACCRG( 21, 4) = 0.000000E+00 + PKER_SACCRG( 21, 5) = 0.000000E+00 + PKER_SACCRG( 21, 6) = 0.000000E+00 + PKER_SACCRG( 21, 7) = 0.115787E-05 + PKER_SACCRG( 21, 8) = 0.737622E+00 + PKER_SACCRG( 21, 9) = 0.683641E+00 + PKER_SACCRG( 21, 10) = 0.742791E-01 + PKER_SACCRG( 21, 11) = 0.720196E+00 + PKER_SACCRG( 21, 12) = 0.747281E+00 + PKER_SACCRG( 21, 13) = 0.749836E+00 + PKER_SACCRG( 21, 14) = 0.738685E+00 + PKER_SACCRG( 21, 15) = 0.719015E+00 + PKER_SACCRG( 21, 16) = 0.717958E+00 + PKER_SACCRG( 21, 17) = 0.702249E+00 + PKER_SACCRG( 21, 18) = 0.688360E+00 + PKER_SACCRG( 21, 19) = 0.631563E+00 + PKER_SACCRG( 21, 20) = 0.632341E+00 + PKER_SACCRG( 21, 21) = 0.589665E+00 + PKER_SACCRG( 21, 22) = 0.548711E+00 + PKER_SACCRG( 21, 23) = 0.507170E+00 + PKER_SACCRG( 21, 24) = 0.465784E+00 + PKER_SACCRG( 21, 25) = 0.429322E+00 + PKER_SACCRG( 21, 26) = 0.396378E+00 + PKER_SACCRG( 21, 27) = 0.366391E+00 + PKER_SACCRG( 21, 28) = 0.345783E+00 + PKER_SACCRG( 21, 29) = 0.327346E+00 + PKER_SACCRG( 21, 30) = 0.309575E+00 + PKER_SACCRG( 21, 31) = 0.298199E+00 + PKER_SACCRG( 21, 32) = 0.290842E+00 + PKER_SACCRG( 21, 33) = 0.285284E+00 + PKER_SACCRG( 21, 34) = 0.283648E+00 + PKER_SACCRG( 21, 35) = 0.279467E+00 + PKER_SACCRG( 21, 36) = 0.271303E+00 + PKER_SACCRG( 21, 37) = 0.000000E+00 + PKER_SACCRG( 21, 38) = 0.000000E+00 + PKER_SACCRG( 21, 39) = 0.000000E+00 + PKER_SACCRG( 21, 40) = 0.000000E+00 + PKER_SACCRG( 22, 1) = 0.000000E+00 + PKER_SACCRG( 22, 2) = 0.000000E+00 + PKER_SACCRG( 22, 3) = 0.000000E+00 + PKER_SACCRG( 22, 4) = 0.000000E+00 + PKER_SACCRG( 22, 5) = 0.000000E+00 + PKER_SACCRG( 22, 6) = 0.000000E+00 + PKER_SACCRG( 22, 7) = 0.153493E-07 + PKER_SACCRG( 22, 8) = 0.760420E+00 + PKER_SACCRG( 22, 9) = 0.706545E+00 + PKER_SACCRG( 22, 10) = 0.650587E-01 + PKER_SACCRG( 22, 11) = 0.743098E+00 + PKER_SACCRG( 22, 12) = 0.770151E+00 + PKER_SACCRG( 22, 13) = 0.772714E+00 + PKER_SACCRG( 22, 14) = 0.761598E+00 + PKER_SACCRG( 22, 15) = 0.741985E+00 + PKER_SACCRG( 22, 16) = 0.740959E+00 + PKER_SACCRG( 22, 17) = 0.725323E+00 + PKER_SACCRG( 22, 18) = 0.711529E+00 + PKER_SACCRG( 22, 19) = 0.653730E+00 + PKER_SACCRG( 22, 20) = 0.655849E+00 + PKER_SACCRG( 22, 21) = 0.613326E+00 + PKER_SACCRG( 22, 22) = 0.573001E+00 + PKER_SACCRG( 22, 23) = 0.531612E+00 + PKER_SACCRG( 22, 24) = 0.490679E+00 + PKER_SACCRG( 22, 25) = 0.454592E+00 + PKER_SACCRG( 22, 26) = 0.422026E+00 + PKER_SACCRG( 22, 27) = 0.392436E+00 + PKER_SACCRG( 22, 28) = 0.371968E+00 + PKER_SACCRG( 22, 29) = 0.353731E+00 + PKER_SACCRG( 22, 30) = 0.336228E+00 + PKER_SACCRG( 22, 31) = 0.324990E+00 + PKER_SACCRG( 22, 32) = 0.317714E+00 + PKER_SACCRG( 22, 33) = 0.312229E+00 + PKER_SACCRG( 22, 34) = 0.310590E+00 + PKER_SACCRG( 22, 35) = 0.306480E+00 + PKER_SACCRG( 22, 36) = 0.298487E+00 + PKER_SACCRG( 22, 37) = 0.000000E+00 + PKER_SACCRG( 22, 38) = 0.000000E+00 + PKER_SACCRG( 22, 39) = 0.000000E+00 + PKER_SACCRG( 22, 40) = 0.000000E+00 + PKER_SACCRG( 23, 1) = 0.000000E+00 + PKER_SACCRG( 23, 2) = 0.000000E+00 + PKER_SACCRG( 23, 3) = 0.000000E+00 + PKER_SACCRG( 23, 4) = 0.000000E+00 + PKER_SACCRG( 23, 5) = 0.000000E+00 + PKER_SACCRG( 23, 6) = 0.000000E+00 + PKER_SACCRG( 23, 7) = 0.000000E+00 + PKER_SACCRG( 23, 8) = 0.779223E+00 + PKER_SACCRG( 23, 9) = 0.725418E+00 + PKER_SACCRG( 23, 10) = 0.629066E-01 + PKER_SACCRG( 23, 11) = 0.761978E+00 + PKER_SACCRG( 23, 12) = 0.789011E+00 + PKER_SACCRG( 23, 13) = 0.791581E+00 + PKER_SACCRG( 23, 14) = 0.780490E+00 + PKER_SACCRG( 23, 15) = 0.760916E+00 + PKER_SACCRG( 23, 16) = 0.759915E+00 + PKER_SACCRG( 23, 17) = 0.744331E+00 + PKER_SACCRG( 23, 18) = 0.730605E+00 + PKER_SACCRG( 23, 19) = 0.703564E+00 + PKER_SACCRG( 23, 20) = 0.675170E+00 + PKER_SACCRG( 23, 21) = 0.632741E+00 + PKER_SACCRG( 23, 22) = 0.592686E+00 + PKER_SACCRG( 23, 23) = 0.551579E+00 + PKER_SACCRG( 23, 24) = 0.510978E+00 + PKER_SACCRG( 23, 25) = 0.475153E+00 + PKER_SACCRG( 23, 26) = 0.442855E+00 + PKER_SACCRG( 23, 27) = 0.413554E+00 + PKER_SACCRG( 23, 28) = 0.393180E+00 + PKER_SACCRG( 23, 29) = 0.375093E+00 + PKER_SACCRG( 23, 30) = 0.357805E+00 + PKER_SACCRG( 23, 31) = 0.346682E+00 + PKER_SACCRG( 23, 32) = 0.339475E+00 + PKER_SACCRG( 23, 33) = 0.334055E+00 + PKER_SACCRG( 23, 34) = 0.332413E+00 + PKER_SACCRG( 23, 35) = 0.328367E+00 + PKER_SACCRG( 23, 36) = 0.320537E+00 + PKER_SACCRG( 23, 37) = 0.000000E+00 + PKER_SACCRG( 23, 38) = 0.000000E+00 + PKER_SACCRG( 23, 39) = 0.000000E+00 + PKER_SACCRG( 23, 40) = 0.000000E+00 + PKER_SACCRG( 24, 1) = 0.000000E+00 + PKER_SACCRG( 24, 2) = 0.000000E+00 + PKER_SACCRG( 24, 3) = 0.000000E+00 + PKER_SACCRG( 24, 4) = 0.000000E+00 + PKER_SACCRG( 24, 5) = 0.000000E+00 + PKER_SACCRG( 24, 6) = 0.000000E+00 + PKER_SACCRG( 24, 7) = 0.000000E+00 + PKER_SACCRG( 24, 8) = 0.794744E+00 + PKER_SACCRG( 24, 9) = 0.740984E+00 + PKER_SACCRG( 24, 10) = 0.633801E-01 + PKER_SACCRG( 24, 11) = 0.777556E+00 + PKER_SACCRG( 24, 12) = 0.804576E+00 + PKER_SACCRG( 24, 13) = 0.807152E+00 + PKER_SACCRG( 24, 14) = 0.796079E+00 + PKER_SACCRG( 24, 15) = 0.776533E+00 + PKER_SACCRG( 24, 16) = 0.775550E+00 + PKER_SACCRG( 24, 17) = 0.760004E+00 + PKER_SACCRG( 24, 18) = 0.746329E+00 + PKER_SACCRG( 24, 19) = 0.719365E+00 + PKER_SACCRG( 24, 20) = 0.691070E+00 + PKER_SACCRG( 24, 21) = 0.651450E+00 + PKER_SACCRG( 24, 22) = 0.608840E+00 + PKER_SACCRG( 24, 23) = 0.567932E+00 + PKER_SACCRG( 24, 24) = 0.527565E+00 + PKER_SACCRG( 24, 25) = 0.491917E+00 + PKER_SACCRG( 24, 26) = 0.459798E+00 + PKER_SACCRG( 24, 27) = 0.430691E+00 + PKER_SACCRG( 24, 28) = 0.410367E+00 + PKER_SACCRG( 24, 29) = 0.392372E+00 + PKER_SACCRG( 24, 30) = 0.375227E+00 + PKER_SACCRG( 24, 31) = 0.364178E+00 + PKER_SACCRG( 24, 32) = 0.357015E+00 + PKER_SACCRG( 24, 33) = 0.351637E+00 + PKER_SACCRG( 24, 34) = 0.349989E+00 + PKER_SACCRG( 24, 35) = 0.345989E+00 + PKER_SACCRG( 24, 36) = 0.338276E+00 + PKER_SACCRG( 24, 37) = 0.000000E+00 + PKER_SACCRG( 24, 38) = 0.000000E+00 + PKER_SACCRG( 24, 39) = 0.000000E+00 + PKER_SACCRG( 24, 40) = 0.000000E+00 + PKER_SACCRG( 25, 1) = 0.000000E+00 + PKER_SACCRG( 25, 2) = 0.000000E+00 + PKER_SACCRG( 25, 3) = 0.000000E+00 + PKER_SACCRG( 25, 4) = 0.000000E+00 + PKER_SACCRG( 25, 5) = 0.000000E+00 + PKER_SACCRG( 25, 6) = 0.000000E+00 + PKER_SACCRG( 25, 7) = 0.000000E+00 + PKER_SACCRG( 25, 8) = 0.807563E+00 + PKER_SACCRG( 25, 9) = 0.753833E+00 + PKER_SACCRG( 25, 10) = 0.643394E-01 + PKER_SACCRG( 25, 11) = 0.790417E+00 + PKER_SACCRG( 25, 12) = 0.817430E+00 + PKER_SACCRG( 25, 13) = 0.820012E+00 + PKER_SACCRG( 25, 14) = 0.808951E+00 + PKER_SACCRG( 25, 15) = 0.789425E+00 + PKER_SACCRG( 25, 16) = 0.788455E+00 + PKER_SACCRG( 25, 17) = 0.772937E+00 + PKER_SACCRG( 25, 18) = 0.759299E+00 + PKER_SACCRG( 25, 19) = 0.732392E+00 + PKER_SACCRG( 25, 20) = 0.704169E+00 + PKER_SACCRG( 25, 21) = 0.664647E+00 + PKER_SACCRG( 25, 22) = 0.622123E+00 + PKER_SACCRG( 25, 23) = 0.581352E+00 + PKER_SACCRG( 25, 24) = 0.541148E+00 + PKER_SACCRG( 25, 25) = 0.505619E+00 + PKER_SACCRG( 25, 26) = 0.473619E+00 + PKER_SACCRG( 25, 27) = 0.444639E+00 + PKER_SACCRG( 25, 28) = 0.424336E+00 + PKER_SACCRG( 25, 29) = 0.406394E+00 + PKER_SACCRG( 25, 30) = 0.389340E+00 + PKER_SACCRG( 25, 31) = 0.378332E+00 + PKER_SACCRG( 25, 32) = 0.371193E+00 + PKER_SACCRG( 25, 33) = 0.365840E+00 + PKER_SACCRG( 25, 34) = 0.364185E+00 + PKER_SACCRG( 25, 35) = 0.360213E+00 + PKER_SACCRG( 25, 36) = 0.352580E+00 + PKER_SACCRG( 25, 37) = 0.000000E+00 + PKER_SACCRG( 25, 38) = 0.000000E+00 + PKER_SACCRG( 25, 39) = 0.000000E+00 + PKER_SACCRG( 25, 40) = 0.000000E+00 + PKER_SACCRG( 26, 1) = 0.000000E+00 + PKER_SACCRG( 26, 2) = 0.000000E+00 + PKER_SACCRG( 26, 3) = 0.000000E+00 + PKER_SACCRG( 26, 4) = 0.000000E+00 + PKER_SACCRG( 26, 5) = 0.000000E+00 + PKER_SACCRG( 26, 6) = 0.000000E+00 + PKER_SACCRG( 26, 7) = 0.000000E+00 + PKER_SACCRG( 26, 8) = 0.818155E+00 + PKER_SACCRG( 26, 9) = 0.764445E+00 + PKER_SACCRG( 26, 10) = 0.652138E-01 + PKER_SACCRG( 26, 11) = 0.801042E+00 + PKER_SACCRG( 26, 12) = 0.828051E+00 + PKER_SACCRG( 26, 13) = 0.830636E+00 + PKER_SACCRG( 26, 14) = 0.819585E+00 + PKER_SACCRG( 26, 15) = 0.800072E+00 + PKER_SACCRG( 26, 16) = 0.799113E+00 + PKER_SACCRG( 26, 17) = 0.783616E+00 + PKER_SACCRG( 26, 18) = 0.770006E+00 + PKER_SACCRG( 26, 19) = 0.743140E+00 + PKER_SACCRG( 26, 20) = 0.714971E+00 + PKER_SACCRG( 26, 21) = 0.675519E+00 + PKER_SACCRG( 26, 22) = 0.633061E+00 + PKER_SACCRG( 26, 23) = 0.592381E+00 + PKER_SACCRG( 26, 24) = 0.552293E+00 + PKER_SACCRG( 26, 25) = 0.516845E+00 + PKER_SACCRG( 26, 26) = 0.484922E+00 + PKER_SACCRG( 26, 27) = 0.456026E+00 + PKER_SACCRG( 26, 28) = 0.435725E+00 + PKER_SACCRG( 26, 29) = 0.417811E+00 + PKER_SACCRG( 26, 30) = 0.400812E+00 + PKER_SACCRG( 26, 31) = 0.389826E+00 + PKER_SACCRG( 26, 32) = 0.382698E+00 + PKER_SACCRG( 26, 33) = 0.377358E+00 + PKER_SACCRG( 26, 34) = 0.375696E+00 + PKER_SACCRG( 26, 35) = 0.371742E+00 + PKER_SACCRG( 26, 36) = 0.364161E+00 + PKER_SACCRG( 26, 37) = 0.000000E+00 + PKER_SACCRG( 26, 38) = 0.000000E+00 + PKER_SACCRG( 26, 39) = 0.000000E+00 + PKER_SACCRG( 26, 40) = 0.000000E+00 + PKER_SACCRG( 27, 1) = 0.000000E+00 + PKER_SACCRG( 27, 2) = 0.000000E+00 + PKER_SACCRG( 27, 3) = 0.000000E+00 + PKER_SACCRG( 27, 4) = 0.000000E+00 + PKER_SACCRG( 27, 5) = 0.000000E+00 + PKER_SACCRG( 27, 6) = 0.000000E+00 + PKER_SACCRG( 27, 7) = 0.000000E+00 + PKER_SACCRG( 27, 8) = 0.826912E+00 + PKER_SACCRG( 27, 9) = 0.773214E+00 + PKER_SACCRG( 27, 10) = 0.722825E+00 + PKER_SACCRG( 27, 11) = 0.809822E+00 + PKER_SACCRG( 27, 12) = 0.836829E+00 + PKER_SACCRG( 27, 13) = 0.839417E+00 + PKER_SACCRG( 27, 14) = 0.828373E+00 + PKER_SACCRG( 27, 15) = 0.808870E+00 + PKER_SACCRG( 27, 16) = 0.807920E+00 + PKER_SACCRG( 27, 17) = 0.792438E+00 + PKER_SACCRG( 27, 18) = 0.778848E+00 + PKER_SACCRG( 27, 19) = 0.752014E+00 + PKER_SACCRG( 27, 20) = 0.723884E+00 + PKER_SACCRG( 27, 21) = 0.684484E+00 + PKER_SACCRG( 27, 22) = 0.642077E+00 + PKER_SACCRG( 27, 23) = 0.601458E+00 + PKER_SACCRG( 27, 24) = 0.561451E+00 + PKER_SACCRG( 27, 25) = 0.526058E+00 + PKER_SACCRG( 27, 26) = 0.494186E+00 + PKER_SACCRG( 27, 27) = 0.465344E+00 + PKER_SACCRG( 27, 28) = 0.445036E+00 + PKER_SACCRG( 27, 29) = 0.427133E+00 + PKER_SACCRG( 27, 30) = 0.410167E+00 + PKER_SACCRG( 27, 31) = 0.399191E+00 + PKER_SACCRG( 27, 32) = 0.392065E+00 + PKER_SACCRG( 27, 33) = 0.386731E+00 + PKER_SACCRG( 27, 34) = 0.385063E+00 + PKER_SACCRG( 27, 35) = 0.381119E+00 + PKER_SACCRG( 27, 36) = 0.373572E+00 + PKER_SACCRG( 27, 37) = 0.000000E+00 + PKER_SACCRG( 27, 38) = 0.000000E+00 + PKER_SACCRG( 27, 39) = 0.000000E+00 + PKER_SACCRG( 27, 40) = 0.000000E+00 + PKER_SACCRG( 28, 1) = 0.000000E+00 + PKER_SACCRG( 28, 2) = 0.000000E+00 + PKER_SACCRG( 28, 3) = 0.000000E+00 + PKER_SACCRG( 28, 4) = 0.000000E+00 + PKER_SACCRG( 28, 5) = 0.000000E+00 + PKER_SACCRG( 28, 6) = 0.000000E+00 + PKER_SACCRG( 28, 7) = 0.000000E+00 + PKER_SACCRG( 28, 8) = 0.834152E+00 + PKER_SACCRG( 28, 9) = 0.780463E+00 + PKER_SACCRG( 28, 10) = 0.730085E+00 + PKER_SACCRG( 28, 11) = 0.817081E+00 + PKER_SACCRG( 28, 12) = 0.844087E+00 + PKER_SACCRG( 28, 13) = 0.846678E+00 + PKER_SACCRG( 28, 14) = 0.835638E+00 + PKER_SACCRG( 28, 15) = 0.816143E+00 + PKER_SACCRG( 28, 16) = 0.815199E+00 + PKER_SACCRG( 28, 17) = 0.799728E+00 + PKER_SACCRG( 28, 18) = 0.786155E+00 + PKER_SACCRG( 28, 19) = 0.759343E+00 + PKER_SACCRG( 28, 20) = 0.731242E+00 + PKER_SACCRG( 28, 21) = 0.691881E+00 + PKER_SACCRG( 28, 22) = 0.649512E+00 + PKER_SACCRG( 28, 23) = 0.608935E+00 + PKER_SACCRG( 28, 24) = 0.568988E+00 + PKER_SACCRG( 28, 25) = 0.533631E+00 + PKER_SACCRG( 28, 26) = 0.501792E+00 + PKER_SACCRG( 28, 27) = 0.472984E+00 + PKER_SACCRG( 28, 28) = 0.452665E+00 + PKER_SACCRG( 28, 29) = 0.434765E+00 + PKER_SACCRG( 28, 30) = 0.417816E+00 + PKER_SACCRG( 28, 31) = 0.406842E+00 + PKER_SACCRG( 28, 32) = 0.399715E+00 + PKER_SACCRG( 28, 33) = 0.394383E+00 + PKER_SACCRG( 28, 34) = 0.392708E+00 + PKER_SACCRG( 28, 35) = 0.388770E+00 + PKER_SACCRG( 28, 36) = 0.381244E+00 + PKER_SACCRG( 28, 37) = 0.000000E+00 + PKER_SACCRG( 28, 38) = 0.000000E+00 + PKER_SACCRG( 28, 39) = 0.000000E+00 + PKER_SACCRG( 28, 40) = 0.000000E+00 + PKER_SACCRG( 29, 1) = 0.000000E+00 + PKER_SACCRG( 29, 2) = 0.000000E+00 + PKER_SACCRG( 29, 3) = 0.000000E+00 + PKER_SACCRG( 29, 4) = 0.000000E+00 + PKER_SACCRG( 29, 5) = 0.000000E+00 + PKER_SACCRG( 29, 6) = 0.000000E+00 + PKER_SACCRG( 29, 7) = 0.000000E+00 + PKER_SACCRG( 29, 8) = 0.840140E+00 + PKER_SACCRG( 29, 9) = 0.786456E+00 + PKER_SACCRG( 29, 10) = 0.736085E+00 + PKER_SACCRG( 29, 11) = 0.823083E+00 + PKER_SACCRG( 29, 12) = 0.850089E+00 + PKER_SACCRG( 29, 13) = 0.852682E+00 + PKER_SACCRG( 29, 14) = 0.841646E+00 + PKER_SACCRG( 29, 15) = 0.822156E+00 + PKER_SACCRG( 29, 16) = 0.821217E+00 + PKER_SACCRG( 29, 17) = 0.805755E+00 + PKER_SACCRG( 29, 18) = 0.792194E+00 + PKER_SACCRG( 29, 19) = 0.765399E+00 + PKER_SACCRG( 29, 20) = 0.737321E+00 + PKER_SACCRG( 29, 21) = 0.697987E+00 + PKER_SACCRG( 29, 22) = 0.655647E+00 + PKER_SACCRG( 29, 23) = 0.615100E+00 + PKER_SACCRG( 29, 24) = 0.575195E+00 + PKER_SACCRG( 29, 25) = 0.539863E+00 + PKER_SACCRG( 29, 26) = 0.508047E+00 + PKER_SACCRG( 29, 27) = 0.479260E+00 + PKER_SACCRG( 29, 28) = 0.458928E+00 + PKER_SACCRG( 29, 29) = 0.441026E+00 + PKER_SACCRG( 29, 30) = 0.424085E+00 + PKER_SACCRG( 29, 31) = 0.413109E+00 + PKER_SACCRG( 29, 32) = 0.405979E+00 + PKER_SACCRG( 29, 33) = 0.400646E+00 + PKER_SACCRG( 29, 34) = 0.398965E+00 + PKER_SACCRG( 29, 35) = 0.395030E+00 + PKER_SACCRG( 29, 36) = 0.387518E+00 + PKER_SACCRG( 29, 37) = 0.000000E+00 + PKER_SACCRG( 29, 38) = 0.000000E+00 + PKER_SACCRG( 29, 39) = 0.000000E+00 + PKER_SACCRG( 29, 40) = 0.000000E+00 + PKER_SACCRG( 30, 1) = 0.000000E+00 + PKER_SACCRG( 30, 2) = 0.000000E+00 + PKER_SACCRG( 30, 3) = 0.000000E+00 + PKER_SACCRG( 30, 4) = 0.000000E+00 + PKER_SACCRG( 30, 5) = 0.000000E+00 + PKER_SACCRG( 30, 6) = 0.000000E+00 + PKER_SACCRG( 30, 7) = 0.000000E+00 + PKER_SACCRG( 30, 8) = 0.845094E+00 + PKER_SACCRG( 30, 9) = 0.791414E+00 + PKER_SACCRG( 30, 10) = 0.741047E+00 + PKER_SACCRG( 30, 11) = 0.828048E+00 + PKER_SACCRG( 30, 12) = 0.855054E+00 + PKER_SACCRG( 30, 13) = 0.857648E+00 + PKER_SACCRG( 30, 14) = 0.846615E+00 + PKER_SACCRG( 30, 15) = 0.827129E+00 + PKER_SACCRG( 30, 16) = 0.826194E+00 + PKER_SACCRG( 30, 17) = 0.810738E+00 + PKER_SACCRG( 30, 18) = 0.797187E+00 + PKER_SACCRG( 30, 19) = 0.770405E+00 + PKER_SACCRG( 30, 20) = 0.742343E+00 + PKER_SACCRG( 30, 21) = 0.703031E+00 + PKER_SACCRG( 30, 22) = 0.660711E+00 + PKER_SACCRG( 30, 23) = 0.620186E+00 + PKER_SACCRG( 30, 24) = 0.580313E+00 + PKER_SACCRG( 30, 25) = 0.544997E+00 + PKER_SACCRG( 30, 26) = 0.513195E+00 + PKER_SACCRG( 30, 27) = 0.484422E+00 + PKER_SACCRG( 30, 28) = 0.464077E+00 + PKER_SACCRG( 30, 29) = 0.446170E+00 + PKER_SACCRG( 30, 30) = 0.429233E+00 + PKER_SACCRG( 30, 31) = 0.418253E+00 + PKER_SACCRG( 30, 32) = 0.411117E+00 + PKER_SACCRG( 30, 33) = 0.405783E+00 + PKER_SACCRG( 30, 34) = 0.404097E+00 + PKER_SACCRG( 30, 35) = 0.400163E+00 + PKER_SACCRG( 30, 36) = 0.392659E+00 + PKER_SACCRG( 30, 37) = 0.000000E+00 + PKER_SACCRG( 30, 38) = 0.000000E+00 + PKER_SACCRG( 30, 39) = 0.000000E+00 + PKER_SACCRG( 30, 40) = 0.000000E+00 + PKER_SACCRG( 31, 1) = 0.000000E+00 + PKER_SACCRG( 31, 2) = 0.000000E+00 + PKER_SACCRG( 31, 3) = 0.000000E+00 + PKER_SACCRG( 31, 4) = 0.000000E+00 + PKER_SACCRG( 31, 5) = 0.000000E+00 + PKER_SACCRG( 31, 6) = 0.000000E+00 + PKER_SACCRG( 31, 7) = 0.000000E+00 + PKER_SACCRG( 31, 8) = 0.849193E+00 + PKER_SACCRG( 31, 9) = 0.795515E+00 + PKER_SACCRG( 31, 10) = 0.745151E+00 + PKER_SACCRG( 31, 11) = 0.832155E+00 + PKER_SACCRG( 31, 12) = 0.859161E+00 + PKER_SACCRG( 31, 13) = 0.861757E+00 + PKER_SACCRG( 31, 14) = 0.850726E+00 + PKER_SACCRG( 31, 15) = 0.831243E+00 + PKER_SACCRG( 31, 16) = 0.830311E+00 + PKER_SACCRG( 31, 17) = 0.814860E+00 + PKER_SACCRG( 31, 18) = 0.801315E+00 + PKER_SACCRG( 31, 19) = 0.774544E+00 + PKER_SACCRG( 31, 20) = 0.746495E+00 + PKER_SACCRG( 31, 21) = 0.707199E+00 + PKER_SACCRG( 31, 22) = 0.665314E+00 + PKER_SACCRG( 31, 23) = 0.624385E+00 + PKER_SACCRG( 31, 24) = 0.584535E+00 + PKER_SACCRG( 31, 25) = 0.549231E+00 + PKER_SACCRG( 31, 26) = 0.517437E+00 + PKER_SACCRG( 31, 27) = 0.488673E+00 + PKER_SACCRG( 31, 28) = 0.468316E+00 + PKER_SACCRG( 31, 29) = 0.450402E+00 + PKER_SACCRG( 31, 30) = 0.433466E+00 + PKER_SACCRG( 31, 31) = 0.422481E+00 + PKER_SACCRG( 31, 32) = 0.415341E+00 + PKER_SACCRG( 31, 33) = 0.410003E+00 + PKER_SACCRG( 31, 34) = 0.408314E+00 + PKER_SACCRG( 31, 35) = 0.404379E+00 + PKER_SACCRG( 31, 36) = 0.396881E+00 + PKER_SACCRG( 31, 37) = 0.000000E+00 + PKER_SACCRG( 31, 38) = 0.000000E+00 + PKER_SACCRG( 31, 39) = 0.000000E+00 + PKER_SACCRG( 31, 40) = 0.000000E+00 + PKER_SACCRG( 32, 1) = 0.000000E+00 + PKER_SACCRG( 32, 2) = 0.000000E+00 + PKER_SACCRG( 32, 3) = 0.000000E+00 + PKER_SACCRG( 32, 4) = 0.000000E+00 + PKER_SACCRG( 32, 5) = 0.000000E+00 + PKER_SACCRG( 32, 6) = 0.000000E+00 + PKER_SACCRG( 32, 7) = 0.000000E+00 + PKER_SACCRG( 32, 8) = 0.852585E+00 + PKER_SACCRG( 32, 9) = 0.798908E+00 + PKER_SACCRG( 32, 10) = 0.748546E+00 + PKER_SACCRG( 32, 11) = 0.835553E+00 + PKER_SACCRG( 32, 12) = 0.862560E+00 + PKER_SACCRG( 32, 13) = 0.865156E+00 + PKER_SACCRG( 32, 14) = 0.854127E+00 + PKER_SACCRG( 32, 15) = 0.834646E+00 + PKER_SACCRG( 32, 16) = 0.833717E+00 + PKER_SACCRG( 32, 17) = 0.818269E+00 + PKER_SACCRG( 32, 18) = 0.804730E+00 + PKER_SACCRG( 32, 19) = 0.777966E+00 + PKER_SACCRG( 32, 20) = 0.749927E+00 + PKER_SACCRG( 32, 21) = 0.710643E+00 + PKER_SACCRG( 32, 22) = 0.668772E+00 + PKER_SACCRG( 32, 23) = 0.627853E+00 + PKER_SACCRG( 32, 24) = 0.588019E+00 + PKER_SACCRG( 32, 25) = 0.552723E+00 + PKER_SACCRG( 32, 26) = 0.520936E+00 + PKER_SACCRG( 32, 27) = 0.492177E+00 + PKER_SACCRG( 32, 28) = 0.471809E+00 + PKER_SACCRG( 32, 29) = 0.453889E+00 + PKER_SACCRG( 32, 30) = 0.436952E+00 + PKER_SACCRG( 32, 31) = 0.425962E+00 + PKER_SACCRG( 32, 32) = 0.418817E+00 + PKER_SACCRG( 32, 33) = 0.413477E+00 + PKER_SACCRG( 32, 34) = 0.411784E+00 + PKER_SACCRG( 32, 35) = 0.407849E+00 + PKER_SACCRG( 32, 36) = 0.400353E+00 + PKER_SACCRG( 32, 37) = 0.000000E+00 + PKER_SACCRG( 32, 38) = 0.000000E+00 + PKER_SACCRG( 32, 39) = 0.000000E+00 + PKER_SACCRG( 32, 40) = 0.000000E+00 + PKER_SACCRG( 33, 1) = 0.000000E+00 + PKER_SACCRG( 33, 2) = 0.000000E+00 + PKER_SACCRG( 33, 3) = 0.000000E+00 + PKER_SACCRG( 33, 4) = 0.000000E+00 + PKER_SACCRG( 33, 5) = 0.000000E+00 + PKER_SACCRG( 33, 6) = 0.000000E+00 + PKER_SACCRG( 33, 7) = 0.000000E+00 + PKER_SACCRG( 33, 8) = 0.855391E+00 + PKER_SACCRG( 33, 9) = 0.801716E+00 + PKER_SACCRG( 33, 10) = 0.751355E+00 + PKER_SACCRG( 33, 11) = 0.838364E+00 + PKER_SACCRG( 33, 12) = 0.865372E+00 + PKER_SACCRG( 33, 13) = 0.867969E+00 + PKER_SACCRG( 33, 14) = 0.856941E+00 + PKER_SACCRG( 33, 15) = 0.837462E+00 + PKER_SACCRG( 33, 16) = 0.836534E+00 + PKER_SACCRG( 33, 17) = 0.821090E+00 + PKER_SACCRG( 33, 18) = 0.807555E+00 + PKER_SACCRG( 33, 19) = 0.780797E+00 + PKER_SACCRG( 33, 20) = 0.752765E+00 + PKER_SACCRG( 33, 21) = 0.713491E+00 + PKER_SACCRG( 33, 22) = 0.671630E+00 + PKER_SACCRG( 33, 23) = 0.630717E+00 + PKER_SACCRG( 33, 24) = 0.590897E+00 + PKER_SACCRG( 33, 25) = 0.555606E+00 + PKER_SACCRG( 33, 26) = 0.523823E+00 + PKER_SACCRG( 33, 27) = 0.495067E+00 + PKER_SACCRG( 33, 28) = 0.474689E+00 + PKER_SACCRG( 33, 29) = 0.456764E+00 + PKER_SACCRG( 33, 30) = 0.439825E+00 + PKER_SACCRG( 33, 31) = 0.428830E+00 + PKER_SACCRG( 33, 32) = 0.421681E+00 + PKER_SACCRG( 33, 33) = 0.416338E+00 + PKER_SACCRG( 33, 34) = 0.414643E+00 + PKER_SACCRG( 33, 35) = 0.410707E+00 + PKER_SACCRG( 33, 36) = 0.403213E+00 + PKER_SACCRG( 33, 37) = 0.000000E+00 + PKER_SACCRG( 33, 38) = 0.000000E+00 + PKER_SACCRG( 33, 39) = 0.000000E+00 + PKER_SACCRG( 33, 40) = 0.000000E+00 + PKER_SACCRG( 34, 1) = 0.000000E+00 + PKER_SACCRG( 34, 2) = 0.000000E+00 + PKER_SACCRG( 34, 3) = 0.000000E+00 + PKER_SACCRG( 34, 4) = 0.000000E+00 + PKER_SACCRG( 34, 5) = 0.000000E+00 + PKER_SACCRG( 34, 6) = 0.000000E+00 + PKER_SACCRG( 34, 7) = 0.000000E+00 + PKER_SACCRG( 34, 8) = 0.857714E+00 + PKER_SACCRG( 34, 9) = 0.804039E+00 + PKER_SACCRG( 34, 10) = 0.753680E+00 + PKER_SACCRG( 34, 11) = 0.840691E+00 + PKER_SACCRG( 34, 12) = 0.867699E+00 + PKER_SACCRG( 34, 13) = 0.870297E+00 + PKER_SACCRG( 34, 14) = 0.859270E+00 + PKER_SACCRG( 34, 15) = 0.839792E+00 + PKER_SACCRG( 34, 16) = 0.838866E+00 + PKER_SACCRG( 34, 17) = 0.823423E+00 + PKER_SACCRG( 34, 18) = 0.809892E+00 + PKER_SACCRG( 34, 19) = 0.783139E+00 + PKER_SACCRG( 34, 20) = 0.755113E+00 + PKER_SACCRG( 34, 21) = 0.715845E+00 + PKER_SACCRG( 34, 22) = 0.673992E+00 + PKER_SACCRG( 34, 23) = 0.633085E+00 + PKER_SACCRG( 34, 24) = 0.593274E+00 + PKER_SACCRG( 34, 25) = 0.557987E+00 + PKER_SACCRG( 34, 26) = 0.526206E+00 + PKER_SACCRG( 34, 27) = 0.497452E+00 + PKER_SACCRG( 34, 28) = 0.477066E+00 + PKER_SACCRG( 34, 29) = 0.459136E+00 + PKER_SACCRG( 34, 30) = 0.442195E+00 + PKER_SACCRG( 34, 31) = 0.431196E+00 + PKER_SACCRG( 34, 32) = 0.424043E+00 + PKER_SACCRG( 34, 33) = 0.418698E+00 + PKER_SACCRG( 34, 34) = 0.417000E+00 + PKER_SACCRG( 34, 35) = 0.413064E+00 + PKER_SACCRG( 34, 36) = 0.405570E+00 + PKER_SACCRG( 34, 37) = 0.000000E+00 + PKER_SACCRG( 34, 38) = 0.000000E+00 + PKER_SACCRG( 34, 39) = 0.000000E+00 + PKER_SACCRG( 34, 40) = 0.000000E+00 + PKER_SACCRG( 35, 1) = 0.000000E+00 + PKER_SACCRG( 35, 2) = 0.000000E+00 + PKER_SACCRG( 35, 3) = 0.000000E+00 + PKER_SACCRG( 35, 4) = 0.000000E+00 + PKER_SACCRG( 35, 5) = 0.000000E+00 + PKER_SACCRG( 35, 6) = 0.000000E+00 + PKER_SACCRG( 35, 7) = 0.000000E+00 + PKER_SACCRG( 35, 8) = 0.859637E+00 + PKER_SACCRG( 35, 9) = 0.805962E+00 + PKER_SACCRG( 35, 10) = 0.755603E+00 + PKER_SACCRG( 35, 11) = 0.842616E+00 + PKER_SACCRG( 35, 12) = 0.869625E+00 + PKER_SACCRG( 35, 13) = 0.872223E+00 + PKER_SACCRG( 35, 14) = 0.861197E+00 + PKER_SACCRG( 35, 15) = 0.841720E+00 + PKER_SACCRG( 35, 16) = 0.840795E+00 + PKER_SACCRG( 35, 17) = 0.825354E+00 + PKER_SACCRG( 35, 18) = 0.811826E+00 + PKER_SACCRG( 35, 19) = 0.785076E+00 + PKER_SACCRG( 35, 20) = 0.757054E+00 + PKER_SACCRG( 35, 21) = 0.717792E+00 + PKER_SACCRG( 35, 22) = 0.675945E+00 + PKER_SACCRG( 35, 23) = 0.635042E+00 + PKER_SACCRG( 35, 24) = 0.595238E+00 + PKER_SACCRG( 35, 25) = 0.559954E+00 + PKER_SACCRG( 35, 26) = 0.528174E+00 + PKER_SACCRG( 35, 27) = 0.499421E+00 + PKER_SACCRG( 35, 28) = 0.479029E+00 + PKER_SACCRG( 35, 29) = 0.461094E+00 + PKER_SACCRG( 35, 30) = 0.444151E+00 + PKER_SACCRG( 35, 31) = 0.433148E+00 + PKER_SACCRG( 35, 32) = 0.425993E+00 + PKER_SACCRG( 35, 33) = 0.420646E+00 + PKER_SACCRG( 35, 34) = 0.418946E+00 + PKER_SACCRG( 35, 35) = 0.415009E+00 + PKER_SACCRG( 35, 36) = 0.407516E+00 + PKER_SACCRG( 35, 37) = 0.000000E+00 + PKER_SACCRG( 35, 38) = 0.000000E+00 + PKER_SACCRG( 35, 39) = 0.000000E+00 + PKER_SACCRG( 35, 40) = 0.000000E+00 + PKER_SACCRG( 36, 1) = 0.000000E+00 + PKER_SACCRG( 36, 2) = 0.000000E+00 + PKER_SACCRG( 36, 3) = 0.000000E+00 + PKER_SACCRG( 36, 4) = 0.000000E+00 + PKER_SACCRG( 36, 5) = 0.000000E+00 + PKER_SACCRG( 36, 6) = 0.000000E+00 + PKER_SACCRG( 36, 7) = 0.000000E+00 + PKER_SACCRG( 36, 8) = 0.861228E+00 + PKER_SACCRG( 36, 9) = 0.807554E+00 + PKER_SACCRG( 36, 10) = 0.757195E+00 + PKER_SACCRG( 36, 11) = 0.844210E+00 + PKER_SACCRG( 36, 12) = 0.871219E+00 + PKER_SACCRG( 36, 13) = 0.873817E+00 + PKER_SACCRG( 36, 14) = 0.862791E+00 + PKER_SACCRG( 36, 15) = 0.843315E+00 + PKER_SACCRG( 36, 16) = 0.842391E+00 + PKER_SACCRG( 36, 17) = 0.826952E+00 + PKER_SACCRG( 36, 18) = 0.813425E+00 + PKER_SACCRG( 36, 19) = 0.786678E+00 + PKER_SACCRG( 36, 20) = 0.758660E+00 + PKER_SACCRG( 36, 21) = 0.719402E+00 + PKER_SACCRG( 36, 22) = 0.677560E+00 + PKER_SACCRG( 36, 23) = 0.636660E+00 + PKER_SACCRG( 36, 24) = 0.596861E+00 + PKER_SACCRG( 36, 25) = 0.561579E+00 + PKER_SACCRG( 36, 26) = 0.529800E+00 + PKER_SACCRG( 36, 27) = 0.501048E+00 + PKER_SACCRG( 36, 28) = 0.480650E+00 + PKER_SACCRG( 36, 29) = 0.462712E+00 + PKER_SACCRG( 36, 30) = 0.445767E+00 + PKER_SACCRG( 36, 31) = 0.434761E+00 + PKER_SACCRG( 36, 32) = 0.427602E+00 + PKER_SACCRG( 36, 33) = 0.422254E+00 + PKER_SACCRG( 36, 34) = 0.420553E+00 + PKER_SACCRG( 36, 35) = 0.416615E+00 + PKER_SACCRG( 36, 36) = 0.409122E+00 + PKER_SACCRG( 36, 37) = 0.000000E+00 + PKER_SACCRG( 36, 38) = 0.000000E+00 + PKER_SACCRG( 36, 39) = 0.000000E+00 + PKER_SACCRG( 36, 40) = 0.000000E+00 + PKER_SACCRG( 37, 1) = 0.000000E+00 + PKER_SACCRG( 37, 2) = 0.000000E+00 + PKER_SACCRG( 37, 3) = 0.000000E+00 + PKER_SACCRG( 37, 4) = 0.000000E+00 + PKER_SACCRG( 37, 5) = 0.000000E+00 + PKER_SACCRG( 37, 6) = 0.000000E+00 + PKER_SACCRG( 37, 7) = 0.000000E+00 + PKER_SACCRG( 37, 8) = 0.862545E+00 + PKER_SACCRG( 37, 9) = 0.808871E+00 + PKER_SACCRG( 37, 10) = 0.758513E+00 + PKER_SACCRG( 37, 11) = 0.845529E+00 + PKER_SACCRG( 37, 12) = 0.872538E+00 + PKER_SACCRG( 37, 13) = 0.875137E+00 + PKER_SACCRG( 37, 14) = 0.864111E+00 + PKER_SACCRG( 37, 15) = 0.844636E+00 + PKER_SACCRG( 37, 16) = 0.843713E+00 + PKER_SACCRG( 37, 17) = 0.828275E+00 + PKER_SACCRG( 37, 18) = 0.814749E+00 + PKER_SACCRG( 37, 19) = 0.788004E+00 + PKER_SACCRG( 37, 20) = 0.759989E+00 + PKER_SACCRG( 37, 21) = 0.720734E+00 + PKER_SACCRG( 37, 22) = 0.678896E+00 + PKER_SACCRG( 37, 23) = 0.637998E+00 + PKER_SACCRG( 37, 24) = 0.598203E+00 + PKER_SACCRG( 37, 25) = 0.562923E+00 + PKER_SACCRG( 37, 26) = 0.531144E+00 + PKER_SACCRG( 37, 27) = 0.502392E+00 + PKER_SACCRG( 37, 28) = 0.481990E+00 + PKER_SACCRG( 37, 29) = 0.464049E+00 + PKER_SACCRG( 37, 30) = 0.447102E+00 + PKER_SACCRG( 37, 31) = 0.436093E+00 + PKER_SACCRG( 37, 32) = 0.428933E+00 + PKER_SACCRG( 37, 33) = 0.423583E+00 + PKER_SACCRG( 37, 34) = 0.421881E+00 + PKER_SACCRG( 37, 35) = 0.417942E+00 + PKER_SACCRG( 37, 36) = 0.410449E+00 + PKER_SACCRG( 37, 37) = 0.000000E+00 + PKER_SACCRG( 37, 38) = 0.000000E+00 + PKER_SACCRG( 37, 39) = 0.000000E+00 + PKER_SACCRG( 37, 40) = 0.000000E+00 + PKER_SACCRG( 38, 1) = 0.000000E+00 + PKER_SACCRG( 38, 2) = 0.000000E+00 + PKER_SACCRG( 38, 3) = 0.000000E+00 + PKER_SACCRG( 38, 4) = 0.000000E+00 + PKER_SACCRG( 38, 5) = 0.000000E+00 + PKER_SACCRG( 38, 6) = 0.000000E+00 + PKER_SACCRG( 38, 7) = 0.000000E+00 + PKER_SACCRG( 38, 8) = 0.864084E+00 + PKER_SACCRG( 38, 9) = 0.810382E+00 + PKER_SACCRG( 38, 10) = 0.759998E+00 + PKER_SACCRG( 38, 11) = 0.847060E+00 + PKER_SACCRG( 38, 12) = 0.874083E+00 + PKER_SACCRG( 38, 13) = 0.876684E+00 + PKER_SACCRG( 38, 14) = 0.865653E+00 + PKER_SACCRG( 38, 15) = 0.846168E+00 + PKER_SACCRG( 38, 16) = 0.845245E+00 + PKER_SACCRG( 38, 17) = 0.829800E+00 + PKER_SACCRG( 38, 18) = 0.816269E+00 + PKER_SACCRG( 38, 19) = 0.789511E+00 + PKER_SACCRG( 38, 20) = 0.761484E+00 + PKER_SACCRG( 38, 21) = 0.722211E+00 + PKER_SACCRG( 38, 22) = 0.680354E+00 + PKER_SACCRG( 38, 23) = 0.639436E+00 + PKER_SACCRG( 38, 24) = 0.599624E+00 + PKER_SACCRG( 38, 25) = 0.564327E+00 + PKER_SACCRG( 38, 26) = 0.532532E+00 + PKER_SACCRG( 38, 27) = 0.503764E+00 + PKER_SACCRG( 38, 28) = 0.483348E+00 + PKER_SACCRG( 38, 29) = 0.465395E+00 + PKER_SACCRG( 38, 30) = 0.448438E+00 + PKER_SACCRG( 38, 31) = 0.437422E+00 + PKER_SACCRG( 38, 32) = 0.430256E+00 + PKER_SACCRG( 38, 33) = 0.424902E+00 + PKER_SACCRG( 38, 34) = 0.423198E+00 + PKER_SACCRG( 38, 35) = 0.419256E+00 + PKER_SACCRG( 38, 36) = 0.411759E+00 + PKER_SACCRG( 38, 37) = 0.000000E+00 + PKER_SACCRG( 38, 38) = 0.000000E+00 + PKER_SACCRG( 38, 39) = 0.000000E+00 + PKER_SACCRG( 38, 40) = 0.000000E+00 + PKER_SACCRG( 39, 1) = 0.000000E+00 + PKER_SACCRG( 39, 2) = 0.000000E+00 + PKER_SACCRG( 39, 3) = 0.000000E+00 + PKER_SACCRG( 39, 4) = 0.000000E+00 + PKER_SACCRG( 39, 5) = 0.000000E+00 + PKER_SACCRG( 39, 6) = 0.000000E+00 + PKER_SACCRG( 39, 7) = 0.000000E+00 + PKER_SACCRG( 39, 8) = 0.864538E+00 + PKER_SACCRG( 39, 9) = 0.810864E+00 + PKER_SACCRG( 39, 10) = 0.760506E+00 + PKER_SACCRG( 39, 11) = 0.847524E+00 + PKER_SACCRG( 39, 12) = 0.874534E+00 + PKER_SACCRG( 39, 13) = 0.877133E+00 + PKER_SACCRG( 39, 14) = 0.866108E+00 + PKER_SACCRG( 39, 15) = 0.846633E+00 + PKER_SACCRG( 39, 16) = 0.845711E+00 + PKER_SACCRG( 39, 17) = 0.830275E+00 + PKER_SACCRG( 39, 18) = 0.816752E+00 + PKER_SACCRG( 39, 19) = 0.790009E+00 + PKER_SACCRG( 39, 20) = 0.761998E+00 + PKER_SACCRG( 39, 21) = 0.722748E+00 + PKER_SACCRG( 39, 22) = 0.680914E+00 + PKER_SACCRG( 39, 23) = 0.640019E+00 + PKER_SACCRG( 39, 24) = 0.600230E+00 + PKER_SACCRG( 39, 25) = 0.564952E+00 + PKER_SACCRG( 39, 26) = 0.533174E+00 + PKER_SACCRG( 39, 27) = 0.504421E+00 + PKER_SACCRG( 39, 28) = 0.484013E+00 + PKER_SACCRG( 39, 29) = 0.466067E+00 + PKER_SACCRG( 39, 30) = 0.449117E+00 + PKER_SACCRG( 39, 31) = 0.438105E+00 + PKER_SACCRG( 39, 32) = 0.430941E+00 + PKER_SACCRG( 39, 33) = 0.425589E+00 + PKER_SACCRG( 39, 34) = 0.423885E+00 + PKER_SACCRG( 39, 35) = 0.419946E+00 + PKER_SACCRG( 39, 36) = 0.412452E+00 + PKER_SACCRG( 39, 37) = 0.000000E+00 + PKER_SACCRG( 39, 38) = 0.000000E+00 + PKER_SACCRG( 39, 39) = 0.000000E+00 + PKER_SACCRG( 39, 40) = 0.000000E+00 + PKER_SACCRG( 40, 1) = 0.000000E+00 + PKER_SACCRG( 40, 2) = 0.000000E+00 + PKER_SACCRG( 40, 3) = 0.000000E+00 + PKER_SACCRG( 40, 4) = 0.000000E+00 + PKER_SACCRG( 40, 5) = 0.000000E+00 + PKER_SACCRG( 40, 6) = 0.000000E+00 + PKER_SACCRG( 40, 7) = 0.000000E+00 + PKER_SACCRG( 40, 8) = 0.865285E+00 + PKER_SACCRG( 40, 9) = 0.811611E+00 + PKER_SACCRG( 40, 10) = 0.761253E+00 + PKER_SACCRG( 40, 11) = 0.848272E+00 + PKER_SACCRG( 40, 12) = 0.875282E+00 + PKER_SACCRG( 40, 13) = 0.877881E+00 + PKER_SACCRG( 40, 14) = 0.866857E+00 + PKER_SACCRG( 40, 15) = 0.847382E+00 + PKER_SACCRG( 40, 16) = 0.846460E+00 + PKER_SACCRG( 40, 17) = 0.831024E+00 + PKER_SACCRG( 40, 18) = 0.817502E+00 + PKER_SACCRG( 40, 19) = 0.790761E+00 + PKER_SACCRG( 40, 20) = 0.762751E+00 + PKER_SACCRG( 40, 21) = 0.723502E+00 + PKER_SACCRG( 40, 22) = 0.681670E+00 + PKER_SACCRG( 40, 23) = 0.640776E+00 + PKER_SACCRG( 40, 24) = 0.600989E+00 + PKER_SACCRG( 40, 25) = 0.565711E+00 + PKER_SACCRG( 40, 26) = 0.533933E+00 + PKER_SACCRG( 40, 27) = 0.505180E+00 + PKER_SACCRG( 40, 28) = 0.484770E+00 + PKER_SACCRG( 40, 29) = 0.466822E+00 + PKER_SACCRG( 40, 30) = 0.449871E+00 + PKER_SACCRG( 40, 31) = 0.438858E+00 + PKER_SACCRG( 40, 32) = 0.431693E+00 + PKER_SACCRG( 40, 33) = 0.426340E+00 + PKER_SACCRG( 40, 34) = 0.424636E+00 + PKER_SACCRG( 40, 35) = 0.420696E+00 + PKER_SACCRG( 40, 36) = 0.413202E+00 + PKER_SACCRG( 40, 37) = 0.000000E+00 + PKER_SACCRG( 40, 38) = 0.000000E+00 + PKER_SACCRG( 40, 39) = 0.000000E+00 + PKER_SACCRG( 40, 40) = 0.000000E+00 +END IF + +! +END SUBROUTINE LIMA_READ_XKER_RACCS diff --git a/src/mesonh/micro/lima_read_xker_rdryg.f90 b/src/mesonh/micro/lima_read_xker_rdryg.f90 new file mode 100644 index 000000000..de1a42874 --- /dev/null +++ b/src/mesonh/micro/lima_read_xker_rdryg.f90 @@ -0,0 +1,1736 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 init 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ########################### + MODULE MODI_LIMA_READ_XKER_RDRYG +! ########################### +! +INTERFACE + SUBROUTINE LIMA_READ_XKER_RDRYG (KDRYLBDAG,KDRYLBDAR,KND, & + PALPHAG,PNUG,PALPHAR,PNUR,PEGR,PBR,PCG,PDG,PCR,PDR, & + PDRYLBDAG_MAX,PDRYLBDAR_MAX,PDRYLBDAG_MIN,PDRYLBDAR_MIN, & + PFDINFTY,PKER_RDRYG ) +! +INTEGER, INTENT(OUT) :: KND,KDRYLBDAG,KDRYLBDAR +REAL, INTENT(OUT) :: PALPHAG +REAL, INTENT(OUT) :: PNUG +REAL, INTENT(OUT) :: PALPHAR +REAL, INTENT(OUT) :: PNUR +REAL, INTENT(OUT) :: PEGR +REAL, INTENT(OUT) :: PBR +REAL, INTENT(OUT) :: PCG +REAL, INTENT(OUT) :: PDG +REAL, INTENT(OUT) :: PCR +REAL, INTENT(OUT) :: PDR +REAL, INTENT(OUT) :: PDRYLBDAG_MAX +REAL, INTENT(OUT) :: PDRYLBDAR_MAX +REAL, INTENT(OUT) :: PDRYLBDAG_MIN +REAL, INTENT(OUT) :: PDRYLBDAR_MIN +REAL, INTENT(OUT) :: PFDINFTY +REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PKER_RDRYG +! +END SUBROUTINE LIMA_READ_XKER_RDRYG +! +END INTERFACE +! +END MODULE MODI_LIMA_READ_XKER_RDRYG +! ######################################################################## + SUBROUTINE LIMA_READ_XKER_RDRYG (KDRYLBDAG,KDRYLBDAR,KND, & + PALPHAG,PNUG,PALPHAR,PNUR,PEGR,PBR,PCG,PDG,PCR,PDR, & + PDRYLBDAG_MAX,PDRYLBDAR_MAX,PDRYLBDAG_MIN,PDRYLBDAR_MIN, & + PFDINFTY,PKER_RDRYG ) +! ######################################################################## +! +!!**** * * - initialize the kernels for the snow-graupel dry growth process +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to initialize the kernels PKER_RDRYG +!! prepared from a previous run of the routine INI_RAIN_ICE. The reading of +!! the kernels is optional after checking for the dimensions of the arrays. +!! +!!** METHOD +!! ------ +!! +!! +!! EXTERNAL +!! -------- +!! None +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! Book2 of documentation ( routine READ_XKER_RDRYG ) +!! +!! AUTHOR +!! ------ +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original 09/04/96 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +!* 0.2 Declarations of local variables : +! +! +INTEGER, INTENT(OUT) :: KND,KDRYLBDAG,KDRYLBDAR +REAL, INTENT(OUT) :: PALPHAG +REAL, INTENT(OUT) :: PNUG +REAL, INTENT(OUT) :: PALPHAR +REAL, INTENT(OUT) :: PNUR +REAL, INTENT(OUT) :: PEGR +REAL, INTENT(OUT) :: PBR +REAL, INTENT(OUT) :: PCG +REAL, INTENT(OUT) :: PDG +REAL, INTENT(OUT) :: PCR +REAL, INTENT(OUT) :: PDR +REAL, INTENT(OUT) :: PDRYLBDAG_MAX +REAL, INTENT(OUT) :: PDRYLBDAR_MAX +REAL, INTENT(OUT) :: PDRYLBDAG_MIN +REAL, INTENT(OUT) :: PDRYLBDAR_MIN +REAL, INTENT(OUT) :: PFDINFTY +REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PKER_RDRYG +! +! ################################################################### +! #INSERT HERE THE OUTPUT OF INI_RAIN_ICE IF THE KERNELS ARE UPDATED# +! ################################################################### +! +KND= 50 +KDRYLBDAG= 40 +KDRYLBDAR= 40 +PALPHAG= 0.100000E+01 +PNUG= 0.100000E+01 +PALPHAR= 0.100000E+01 +PNUR= 0.200000E+01 +PEGR= 0.100000E+01 +PBR= 0.300000E+01 +PCG= 0.122000E+03 +PDG= 0.660000E+00 +PCR= 0.842000E+03 +PDR= 0.800000E+00 +PDRYLBDAG_MAX= 0.100000E+08 +PDRYLBDAR_MAX= 0.100000E+08 +PDRYLBDAG_MIN= 0.100000E+04 +PDRYLBDAR_MIN= 0.100000E+04 +PFDINFTY= 0.200000E+02 +! +IF( PRESENT(PKER_RDRYG) ) THEN +PKER_RDRYG( 1, 1) = 0.134210E+02 +PKER_RDRYG( 1, 2) = 0.106490E+02 +PKER_RDRYG( 1, 3) = 0.834292E+01 +PKER_RDRYG( 1, 4) = 0.642847E+01 +PKER_RDRYG( 1, 5) = 0.484974E+01 +PKER_RDRYG( 1, 6) = 0.356945E+01 +PKER_RDRYG( 1, 7) = 0.256678E+01 +PKER_RDRYG( 1, 8) = 0.183093E+01 +PKER_RDRYG( 1, 9) = 0.135156E+01 +PKER_RDRYG( 1, 10) = 0.110260E+01 +PKER_RDRYG( 1, 11) = 0.104070E+01 +PKER_RDRYG( 1, 12) = 0.110897E+01 +PKER_RDRYG( 1, 13) = 0.125122E+01 +PKER_RDRYG( 1, 14) = 0.142283E+01 +PKER_RDRYG( 1, 15) = 0.159456E+01 +PKER_RDRYG( 1, 16) = 0.175135E+01 +PKER_RDRYG( 1, 17) = 0.188742E+01 +PKER_RDRYG( 1, 18) = 0.200233E+01 +PKER_RDRYG( 1, 19) = 0.209795E+01 +PKER_RDRYG( 1, 20) = 0.217687E+01 +PKER_RDRYG( 1, 21) = 0.224175E+01 +PKER_RDRYG( 1, 22) = 0.229504E+01 +PKER_RDRYG( 1, 23) = 0.233883E+01 +PKER_RDRYG( 1, 24) = 0.237485E+01 +PKER_RDRYG( 1, 25) = 0.240449E+01 +PKER_RDRYG( 1, 26) = 0.242888E+01 +PKER_RDRYG( 1, 27) = 0.244897E+01 +PKER_RDRYG( 1, 28) = 0.246553E+01 +PKER_RDRYG( 1, 29) = 0.247917E+01 +PKER_RDRYG( 1, 30) = 0.249042E+01 +PKER_RDRYG( 1, 31) = 0.249970E+01 +PKER_RDRYG( 1, 32) = 0.250735E+01 +PKER_RDRYG( 1, 33) = 0.251366E+01 +PKER_RDRYG( 1, 34) = 0.251887E+01 +PKER_RDRYG( 1, 35) = 0.252317E+01 +PKER_RDRYG( 1, 36) = 0.252671E+01 +PKER_RDRYG( 1, 37) = 0.252964E+01 +PKER_RDRYG( 1, 38) = 0.253206E+01 +PKER_RDRYG( 1, 39) = 0.253406E+01 +PKER_RDRYG( 1, 40) = 0.253571E+01 +PKER_RDRYG( 2, 1) = 0.138258E+02 +PKER_RDRYG( 2, 2) = 0.110664E+02 +PKER_RDRYG( 2, 3) = 0.877034E+01 +PKER_RDRYG( 2, 4) = 0.686001E+01 +PKER_RDRYG( 2, 5) = 0.527438E+01 +PKER_RDRYG( 2, 6) = 0.396820E+01 +PKER_RDRYG( 2, 7) = 0.291168E+01 +PKER_RDRYG( 2, 8) = 0.208952E+01 +PKER_RDRYG( 2, 9) = 0.149350E+01 +PKER_RDRYG( 2, 10) = 0.111353E+01 +PKER_RDRYG( 2, 11) = 0.926786E+00 +PKER_RDRYG( 2, 12) = 0.892818E+00 +PKER_RDRYG( 2, 13) = 0.963446E+00 +PKER_RDRYG( 2, 14) = 0.109105E+01 +PKER_RDRYG( 2, 15) = 0.123930E+01 +PKER_RDRYG( 2, 16) = 0.138520E+01 +PKER_RDRYG( 2, 17) = 0.151708E+01 +PKER_RDRYG( 2, 18) = 0.163089E+01 +PKER_RDRYG( 2, 19) = 0.172673E+01 +PKER_RDRYG( 2, 20) = 0.180633E+01 +PKER_RDRYG( 2, 21) = 0.187195E+01 +PKER_RDRYG( 2, 22) = 0.192586E+01 +PKER_RDRYG( 2, 23) = 0.197013E+01 +PKER_RDRYG( 2, 24) = 0.200651E+01 +PKER_RDRYG( 2, 25) = 0.203642E+01 +PKER_RDRYG( 2, 26) = 0.206103E+01 +PKER_RDRYG( 2, 27) = 0.208129E+01 +PKER_RDRYG( 2, 28) = 0.209797E+01 +PKER_RDRYG( 2, 29) = 0.211172E+01 +PKER_RDRYG( 2, 30) = 0.212304E+01 +PKER_RDRYG( 2, 31) = 0.213238E+01 +PKER_RDRYG( 2, 32) = 0.214007E+01 +PKER_RDRYG( 2, 33) = 0.214642E+01 +PKER_RDRYG( 2, 34) = 0.215166E+01 +PKER_RDRYG( 2, 35) = 0.215598E+01 +PKER_RDRYG( 2, 36) = 0.215954E+01 +PKER_RDRYG( 2, 37) = 0.216249E+01 +PKER_RDRYG( 2, 38) = 0.216492E+01 +PKER_RDRYG( 2, 39) = 0.216692E+01 +PKER_RDRYG( 2, 40) = 0.216858E+01 +PKER_RDRYG( 3, 1) = 0.141567E+02 +PKER_RDRYG( 3, 2) = 0.114089E+02 +PKER_RDRYG( 3, 3) = 0.912360E+01 +PKER_RDRYG( 3, 4) = 0.722169E+01 +PKER_RDRYG( 3, 5) = 0.563921E+01 +PKER_RDRYG( 3, 6) = 0.432602E+01 +PKER_RDRYG( 3, 7) = 0.324547E+01 +PKER_RDRYG( 3, 8) = 0.237429E+01 +PKER_RDRYG( 3, 9) = 0.170066E+01 +PKER_RDRYG( 3, 10) = 0.121912E+01 +PKER_RDRYG( 3, 11) = 0.919677E+00 +PKER_RDRYG( 3, 12) = 0.780708E+00 +PKER_RDRYG( 3, 13) = 0.767737E+00 +PKER_RDRYG( 3, 14) = 0.837693E+00 +PKER_RDRYG( 3, 15) = 0.951377E+00 +PKER_RDRYG( 3, 16) = 0.107910E+01 +PKER_RDRYG( 3, 17) = 0.120275E+01 +PKER_RDRYG( 3, 18) = 0.131354E+01 +PKER_RDRYG( 3, 19) = 0.140872E+01 +PKER_RDRYG( 3, 20) = 0.148863E+01 +PKER_RDRYG( 3, 21) = 0.155489E+01 +PKER_RDRYG( 3, 22) = 0.160944E+01 +PKER_RDRYG( 3, 23) = 0.165424E+01 +PKER_RDRYG( 3, 24) = 0.169103E+01 +PKER_RDRYG( 3, 25) = 0.172125E+01 +PKER_RDRYG( 3, 26) = 0.174610E+01 +PKER_RDRYG( 3, 27) = 0.176654E+01 +PKER_RDRYG( 3, 28) = 0.178336E+01 +PKER_RDRYG( 3, 29) = 0.179721E+01 +PKER_RDRYG( 3, 30) = 0.180862E+01 +PKER_RDRYG( 3, 31) = 0.181802E+01 +PKER_RDRYG( 3, 32) = 0.182577E+01 +PKER_RDRYG( 3, 33) = 0.183215E+01 +PKER_RDRYG( 3, 34) = 0.183742E+01 +PKER_RDRYG( 3, 35) = 0.184177E+01 +PKER_RDRYG( 3, 36) = 0.184535E+01 +PKER_RDRYG( 3, 37) = 0.184831E+01 +PKER_RDRYG( 3, 38) = 0.185075E+01 +PKER_RDRYG( 3, 39) = 0.185277E+01 +PKER_RDRYG( 3, 40) = 0.185443E+01 +PKER_RDRYG( 4, 1) = 0.144269E+02 +PKER_RDRYG( 4, 2) = 0.116888E+02 +PKER_RDRYG( 4, 3) = 0.941339E+01 +PKER_RDRYG( 4, 4) = 0.752068E+01 +PKER_RDRYG( 4, 5) = 0.594528E+01 +PKER_RDRYG( 4, 6) = 0.463440E+01 +PKER_RDRYG( 4, 7) = 0.354694E+01 +PKER_RDRYG( 4, 8) = 0.265338E+01 +PKER_RDRYG( 4, 9) = 0.193548E+01 +PKER_RDRYG( 4, 10) = 0.138447E+01 +PKER_RDRYG( 4, 11) = 0.996309E+00 +PKER_RDRYG( 4, 12) = 0.761568E+00 +PKER_RDRYG( 4, 13) = 0.660627E+00 +PKER_RDRYG( 4, 14) = 0.661754E+00 +PKER_RDRYG( 4, 15) = 0.729010E+00 +PKER_RDRYG( 4, 16) = 0.829397E+00 +PKER_RDRYG( 4, 17) = 0.939122E+00 +PKER_RDRYG( 4, 18) = 0.104378E+01 +PKER_RDRYG( 4, 19) = 0.113682E+01 +PKER_RDRYG( 4, 20) = 0.121638E+01 +PKER_RDRYG( 4, 21) = 0.128300E+01 +PKER_RDRYG( 4, 22) = 0.133814E+01 +PKER_RDRYG( 4, 23) = 0.138351E+01 +PKER_RDRYG( 4, 24) = 0.142074E+01 +PKER_RDRYG( 4, 25) = 0.145131E+01 +PKER_RDRYG( 4, 26) = 0.147642E+01 +PKER_RDRYG( 4, 27) = 0.149706E+01 +PKER_RDRYG( 4, 28) = 0.151403E+01 +PKER_RDRYG( 4, 29) = 0.152800E+01 +PKER_RDRYG( 4, 30) = 0.153950E+01 +PKER_RDRYG( 4, 31) = 0.154897E+01 +PKER_RDRYG( 4, 32) = 0.155678E+01 +PKER_RDRYG( 4, 33) = 0.156321E+01 +PKER_RDRYG( 4, 34) = 0.156851E+01 +PKER_RDRYG( 4, 35) = 0.157288E+01 +PKER_RDRYG( 4, 36) = 0.157649E+01 +PKER_RDRYG( 4, 37) = 0.157946E+01 +PKER_RDRYG( 4, 38) = 0.158192E+01 +PKER_RDRYG( 4, 39) = 0.158394E+01 +PKER_RDRYG( 4, 40) = 0.158562E+01 +PKER_RDRYG( 5, 1) = 0.146477E+02 +PKER_RDRYG( 5, 2) = 0.119175E+02 +PKER_RDRYG( 5, 3) = 0.965028E+01 +PKER_RDRYG( 5, 4) = 0.776596E+01 +PKER_RDRYG( 5, 5) = 0.619837E+01 +PKER_RDRYG( 5, 6) = 0.489342E+01 +PKER_RDRYG( 5, 7) = 0.380757E+01 +PKER_RDRYG( 5, 8) = 0.290717E+01 +PKER_RDRYG( 5, 9) = 0.216844E+01 +PKER_RDRYG( 5, 10) = 0.157730E+01 +PKER_RDRYG( 5, 11) = 0.112773E+01 +PKER_RDRYG( 5, 12) = 0.815273E+00 +PKER_RDRYG( 5, 13) = 0.632305E+00 +PKER_RDRYG( 5, 14) = 0.560193E+00 +PKER_RDRYG( 5, 15) = 0.571354E+00 +PKER_RDRYG( 5, 16) = 0.634685E+00 +PKER_RDRYG( 5, 17) = 0.723003E+00 +PKER_RDRYG( 5, 18) = 0.816915E+00 +PKER_RDRYG( 5, 19) = 0.905398E+00 +PKER_RDRYG( 5, 20) = 0.983467E+00 +PKER_RDRYG( 5, 21) = 0.104994E+01 +PKER_RDRYG( 5, 22) = 0.110547E+01 +PKER_RDRYG( 5, 23) = 0.115137E+01 +PKER_RDRYG( 5, 24) = 0.118909E+01 +PKER_RDRYG( 5, 25) = 0.122003E+01 +PKER_RDRYG( 5, 26) = 0.124544E+01 +PKER_RDRYG( 5, 27) = 0.126630E+01 +PKER_RDRYG( 5, 28) = 0.128345E+01 +PKER_RDRYG( 5, 29) = 0.129755E+01 +PKER_RDRYG( 5, 30) = 0.130915E+01 +PKER_RDRYG( 5, 31) = 0.131870E+01 +PKER_RDRYG( 5, 32) = 0.132657E+01 +PKER_RDRYG( 5, 33) = 0.133305E+01 +PKER_RDRYG( 5, 34) = 0.133839E+01 +PKER_RDRYG( 5, 35) = 0.134279E+01 +PKER_RDRYG( 5, 36) = 0.134641E+01 +PKER_RDRYG( 5, 37) = 0.134941E+01 +PKER_RDRYG( 5, 38) = 0.135188E+01 +PKER_RDRYG( 5, 39) = 0.135391E+01 +PKER_RDRYG( 5, 40) = 0.135559E+01 +PKER_RDRYG( 6, 1) = 0.148285E+02 +PKER_RDRYG( 6, 2) = 0.121043E+02 +PKER_RDRYG( 6, 3) = 0.984376E+01 +PKER_RDRYG( 6, 4) = 0.796646E+01 +PKER_RDRYG( 6, 5) = 0.640602E+01 +PKER_RDRYG( 6, 6) = 0.510770E+01 +PKER_RDRYG( 6, 7) = 0.402676E+01 +PKER_RDRYG( 6, 8) = 0.312733E+01 +PKER_RDRYG( 6, 9) = 0.238192E+01 +PKER_RDRYG( 6, 10) = 0.177145E+01 +PKER_RDRYG( 6, 11) = 0.128511E+01 +PKER_RDRYG( 6, 12) = 0.918271E+00 +PKER_RDRYG( 6, 13) = 0.668096E+00 +PKER_RDRYG( 6, 14) = 0.526360E+00 +PKER_RDRYG( 6, 15) = 0.476580E+00 +PKER_RDRYG( 6, 16) = 0.494226E+00 +PKER_RDRYG( 6, 17) = 0.552847E+00 +PKER_RDRYG( 6, 18) = 0.630007E+00 +PKER_RDRYG( 6, 19) = 0.710312E+00 +PKER_RDRYG( 6, 20) = 0.784988E+00 +PKER_RDRYG( 6, 21) = 0.850444E+00 +PKER_RDRYG( 6, 22) = 0.905977E+00 +PKER_RDRYG( 6, 23) = 0.952261E+00 +PKER_RDRYG( 6, 24) = 0.990455E+00 +PKER_RDRYG( 6, 25) = 0.102182E+01 +PKER_RDRYG( 6, 26) = 0.104755E+01 +PKER_RDRYG( 6, 27) = 0.106866E+01 +PKER_RDRYG( 6, 28) = 0.108600E+01 +PKER_RDRYG( 6, 29) = 0.110024E+01 +PKER_RDRYG( 6, 30) = 0.111196E+01 +PKER_RDRYG( 6, 31) = 0.112160E+01 +PKER_RDRYG( 6, 32) = 0.112953E+01 +PKER_RDRYG( 6, 33) = 0.113606E+01 +PKER_RDRYG( 6, 34) = 0.114144E+01 +PKER_RDRYG( 6, 35) = 0.114587E+01 +PKER_RDRYG( 6, 36) = 0.114953E+01 +PKER_RDRYG( 6, 37) = 0.115254E+01 +PKER_RDRYG( 6, 38) = 0.115502E+01 +PKER_RDRYG( 6, 39) = 0.115707E+01 +PKER_RDRYG( 6, 40) = 0.115876E+01 +PKER_RDRYG( 7, 1) = 0.149770E+02 +PKER_RDRYG( 7, 2) = 0.122574E+02 +PKER_RDRYG( 7, 3) = 0.100019E+02 +PKER_RDRYG( 7, 4) = 0.813025E+01 +PKER_RDRYG( 7, 5) = 0.657577E+01 +PKER_RDRYG( 7, 6) = 0.528352E+01 +PKER_RDRYG( 7, 7) = 0.420821E+01 +PKER_RDRYG( 7, 8) = 0.331283E+01 +PKER_RDRYG( 7, 9) = 0.256784E+01 +PKER_RDRYG( 7, 10) = 0.195082E+01 +PKER_RDRYG( 7, 11) = 0.144657E+01 +PKER_RDRYG( 7, 12) = 0.104687E+01 +PKER_RDRYG( 7, 13) = 0.748356E+00 +PKER_RDRYG( 7, 14) = 0.548446E+00 +PKER_RDRYG( 7, 15) = 0.439652E+00 +PKER_RDRYG( 7, 16) = 0.406642E+00 +PKER_RDRYG( 7, 17) = 0.428019E+00 +PKER_RDRYG( 7, 18) = 0.481606E+00 +PKER_RDRYG( 7, 19) = 0.548855E+00 +PKER_RDRYG( 7, 20) = 0.617296E+00 +PKER_RDRYG( 7, 21) = 0.680279E+00 +PKER_RDRYG( 7, 22) = 0.735137E+00 +PKER_RDRYG( 7, 23) = 0.781510E+00 +PKER_RDRYG( 7, 24) = 0.820079E+00 +PKER_RDRYG( 7, 25) = 0.851863E+00 +PKER_RDRYG( 7, 26) = 0.877947E+00 +PKER_RDRYG( 7, 27) = 0.899335E+00 +PKER_RDRYG( 7, 28) = 0.916884E+00 +PKER_RDRYG( 7, 29) = 0.931293E+00 +PKER_RDRYG( 7, 30) = 0.943132E+00 +PKER_RDRYG( 7, 31) = 0.952865E+00 +PKER_RDRYG( 7, 32) = 0.960872E+00 +PKER_RDRYG( 7, 33) = 0.967460E+00 +PKER_RDRYG( 7, 34) = 0.972885E+00 +PKER_RDRYG( 7, 35) = 0.977352E+00 +PKER_RDRYG( 7, 36) = 0.981033E+00 +PKER_RDRYG( 7, 37) = 0.984066E+00 +PKER_RDRYG( 7, 38) = 0.986565E+00 +PKER_RDRYG( 7, 39) = 0.988627E+00 +PKER_RDRYG( 7, 40) = 0.990326E+00 +PKER_RDRYG( 8, 1) = 0.150992E+02 +PKER_RDRYG( 8, 2) = 0.123831E+02 +PKER_RDRYG( 8, 3) = 0.101315E+02 +PKER_RDRYG( 8, 4) = 0.826417E+01 +PKER_RDRYG( 8, 5) = 0.671445E+01 +PKER_RDRYG( 8, 6) = 0.542727E+01 +PKER_RDRYG( 8, 7) = 0.435711E+01 +PKER_RDRYG( 8, 8) = 0.346649E+01 +PKER_RDRYG( 8, 9) = 0.272482E+01 +PKER_RDRYG( 8, 10) = 0.210780E+01 +PKER_RDRYG( 8, 11) = 0.159717E+01 +PKER_RDRYG( 8, 12) = 0.118083E+01 +PKER_RDRYG( 8, 13) = 0.852650E+00 +PKER_RDRYG( 8, 14) = 0.610124E+00 +PKER_RDRYG( 8, 15) = 0.451060E+00 +PKER_RDRYG( 8, 16) = 0.368291E+00 +PKER_RDRYG( 8, 17) = 0.347823E+00 +PKER_RDRYG( 8, 18) = 0.371281E+00 +PKER_RDRYG( 8, 19) = 0.419706E+00 +PKER_RDRYG( 8, 20) = 0.477953E+00 +PKER_RDRYG( 8, 21) = 0.536200E+00 +PKER_RDRYG( 8, 22) = 0.589265E+00 +PKER_RDRYG( 8, 23) = 0.635216E+00 +PKER_RDRYG( 8, 24) = 0.673937E+00 +PKER_RDRYG( 8, 25) = 0.706074E+00 +PKER_RDRYG( 8, 26) = 0.732525E+00 +PKER_RDRYG( 8, 27) = 0.754218E+00 +PKER_RDRYG( 8, 28) = 0.772002E+00 +PKER_RDRYG( 8, 29) = 0.786590E+00 +PKER_RDRYG( 8, 30) = 0.798567E+00 +PKER_RDRYG( 8, 31) = 0.808406E+00 +PKER_RDRYG( 8, 32) = 0.816494E+00 +PKER_RDRYG( 8, 33) = 0.823145E+00 +PKER_RDRYG( 8, 34) = 0.828619E+00 +PKER_RDRYG( 8, 35) = 0.833124E+00 +PKER_RDRYG( 8, 36) = 0.836834E+00 +PKER_RDRYG( 8, 37) = 0.839890E+00 +PKER_RDRYG( 8, 38) = 0.842408E+00 +PKER_RDRYG( 8, 39) = 0.844484E+00 +PKER_RDRYG( 8, 40) = 0.846195E+00 +PKER_RDRYG( 9, 1) = 0.152001E+02 +PKER_RDRYG( 9, 2) = 0.124866E+02 +PKER_RDRYG( 9, 3) = 0.102380E+02 +PKER_RDRYG( 9, 4) = 0.837392E+01 +PKER_RDRYG( 9, 5) = 0.682786E+01 +PKER_RDRYG( 9, 6) = 0.554471E+01 +PKER_RDRYG( 9, 7) = 0.447886E+01 +PKER_RDRYG( 9, 8) = 0.359262E+01 +PKER_RDRYG( 9, 9) = 0.285496E+01 +PKER_RDRYG( 9, 10) = 0.224062E+01 +PKER_RDRYG( 9, 11) = 0.172961E+01 +PKER_RDRYG( 9, 12) = 0.130712E+01 +PKER_RDRYG( 9, 13) = 0.963568E+00 +PKER_RDRYG( 9, 14) = 0.694236E+00 +PKER_RDRYG( 9, 15) = 0.497828E+00 +PKER_RDRYG( 9, 16) = 0.371725E+00 +PKER_RDRYG( 9, 17) = 0.309284E+00 +PKER_RDRYG( 9, 18) = 0.298254E+00 +PKER_RDRYG( 9, 19) = 0.322338E+00 +PKER_RDRYG( 9, 20) = 0.365743E+00 +PKER_RDRYG( 9, 21) = 0.416082E+00 +PKER_RDRYG( 9, 22) = 0.465554E+00 +PKER_RDRYG( 9, 23) = 0.510205E+00 +PKER_RDRYG( 9, 24) = 0.548676E+00 +PKER_RDRYG( 9, 25) = 0.581002E+00 +PKER_RDRYG( 9, 26) = 0.607778E+00 +PKER_RDRYG( 9, 27) = 0.629790E+00 +PKER_RDRYG( 9, 28) = 0.647834E+00 +PKER_RDRYG( 9, 29) = 0.662622E+00 +PKER_RDRYG( 9, 30) = 0.674751E+00 +PKER_RDRYG( 9, 31) = 0.684707E+00 +PKER_RDRYG( 9, 32) = 0.692884E+00 +PKER_RDRYG( 9, 33) = 0.699606E+00 +PKER_RDRYG( 9, 34) = 0.705133E+00 +PKER_RDRYG( 9, 35) = 0.709680E+00 +PKER_RDRYG( 9, 36) = 0.713422E+00 +PKER_RDRYG( 9, 37) = 0.716504E+00 +PKER_RDRYG( 9, 38) = 0.719042E+00 +PKER_RDRYG( 9, 39) = 0.721132E+00 +PKER_RDRYG( 9, 40) = 0.722855E+00 +PKER_RDRYG( 10, 1) = 0.152836E+02 +PKER_RDRYG( 10, 2) = 0.125721E+02 +PKER_RDRYG( 10, 3) = 0.103257E+02 +PKER_RDRYG( 10, 4) = 0.846410E+01 +PKER_RDRYG( 10, 5) = 0.692082E+01 +PKER_RDRYG( 10, 6) = 0.564078E+01 +PKER_RDRYG( 10, 7) = 0.457835E+01 +PKER_RDRYG( 10, 8) = 0.369576E+01 +PKER_RDRYG( 10, 9) = 0.296182E+01 +PKER_RDRYG( 10, 10) = 0.235084E+01 +PKER_RDRYG( 10, 11) = 0.184198E+01 +PKER_RDRYG( 10, 12) = 0.141881E+01 +PKER_RDRYG( 10, 13) = 0.106933E+01 +PKER_RDRYG( 10, 14) = 0.786016E+00 +PKER_RDRYG( 10, 15) = 0.565474E+00 +PKER_RDRYG( 10, 16) = 0.406543E+00 +PKER_RDRYG( 10, 17) = 0.307053E+00 +PKER_RDRYG( 10, 18) = 0.260725E+00 +PKER_RDRYG( 10, 19) = 0.256389E+00 +PKER_RDRYG( 10, 20) = 0.280106E+00 +PKER_RDRYG( 10, 21) = 0.318661E+00 +PKER_RDRYG( 10, 22) = 0.362054E+00 +PKER_RDRYG( 10, 23) = 0.404004E+00 +PKER_RDRYG( 10, 24) = 0.441559E+00 +PKER_RDRYG( 10, 25) = 0.473763E+00 +PKER_RDRYG( 10, 26) = 0.500741E+00 +PKER_RDRYG( 10, 27) = 0.523049E+00 +PKER_RDRYG( 10, 28) = 0.541369E+00 +PKER_RDRYG( 10, 29) = 0.556378E+00 +PKER_RDRYG( 10, 30) = 0.568677E+00 +PKER_RDRYG( 10, 31) = 0.578762E+00 +PKER_RDRYG( 10, 32) = 0.587040E+00 +PKER_RDRYG( 10, 33) = 0.593837E+00 +PKER_RDRYG( 10, 34) = 0.599424E+00 +PKER_RDRYG( 10, 35) = 0.604017E+00 +PKER_RDRYG( 10, 36) = 0.607795E+00 +PKER_RDRYG( 10, 37) = 0.610904E+00 +PKER_RDRYG( 10, 38) = 0.613463E+00 +PKER_RDRYG( 10, 39) = 0.615571E+00 +PKER_RDRYG( 10, 40) = 0.617307E+00 +PKER_RDRYG( 11, 1) = 0.153530E+02 +PKER_RDRYG( 11, 2) = 0.126429E+02 +PKER_RDRYG( 11, 3) = 0.103982E+02 +PKER_RDRYG( 11, 4) = 0.853842E+01 +PKER_RDRYG( 11, 5) = 0.699724E+01 +PKER_RDRYG( 11, 6) = 0.571954E+01 +PKER_RDRYG( 11, 7) = 0.465974E+01 +PKER_RDRYG( 11, 8) = 0.378005E+01 +PKER_RDRYG( 11, 9) = 0.304921E+01 +PKER_RDRYG( 11, 10) = 0.244139E+01 +PKER_RDRYG( 11, 11) = 0.193535E+01 +PKER_RDRYG( 11, 12) = 0.151386E+01 +PKER_RDRYG( 11, 13) = 0.116347E+01 +PKER_RDRYG( 11, 14) = 0.874451E+00 +PKER_RDRYG( 11, 15) = 0.640975E+00 +PKER_RDRYG( 11, 16) = 0.460649E+00 +PKER_RDRYG( 11, 17) = 0.332340E+00 +PKER_RDRYG( 11, 18) = 0.254216E+00 +PKER_RDRYG( 11, 19) = 0.220358E+00 +PKER_RDRYG( 11, 20) = 0.220732E+00 +PKER_RDRYG( 11, 21) = 0.243530E+00 +PKER_RDRYG( 11, 22) = 0.277653E+00 +PKER_RDRYG( 11, 23) = 0.314885E+00 +PKER_RDRYG( 11, 24) = 0.350439E+00 +PKER_RDRYG( 11, 25) = 0.381996E+00 +PKER_RDRYG( 11, 26) = 0.408939E+00 +PKER_RDRYG( 11, 27) = 0.431452E+00 +PKER_RDRYG( 11, 28) = 0.450036E+00 +PKER_RDRYG( 11, 29) = 0.465283E+00 +PKER_RDRYG( 11, 30) = 0.477770E+00 +PKER_RDRYG( 11, 31) = 0.488000E+00 +PKER_RDRYG( 11, 32) = 0.496387E+00 +PKER_RDRYG( 11, 33) = 0.503270E+00 +PKER_RDRYG( 11, 34) = 0.508921E+00 +PKER_RDRYG( 11, 35) = 0.513565E+00 +PKER_RDRYG( 11, 36) = 0.517382E+00 +PKER_RDRYG( 11, 37) = 0.520521E+00 +PKER_RDRYG( 11, 38) = 0.523104E+00 +PKER_RDRYG( 11, 39) = 0.525230E+00 +PKER_RDRYG( 11, 40) = 0.526981E+00 +PKER_RDRYG( 12, 1) = 0.154107E+02 +PKER_RDRYG( 12, 2) = 0.127017E+02 +PKER_RDRYG( 12, 3) = 0.104582E+02 +PKER_RDRYG( 12, 4) = 0.859986E+01 +PKER_RDRYG( 12, 5) = 0.706024E+01 +PKER_RDRYG( 12, 6) = 0.578430E+01 +PKER_RDRYG( 12, 7) = 0.472649E+01 +PKER_RDRYG( 12, 8) = 0.384903E+01 +PKER_RDRYG( 12, 9) = 0.312065E+01 +PKER_RDRYG( 12, 10) = 0.251546E+01 +PKER_RDRYG( 12, 11) = 0.201208E+01 +PKER_RDRYG( 12, 12) = 0.159294E+01 +PKER_RDRYG( 12, 13) = 0.124384E+01 +PKER_RDRYG( 12, 14) = 0.953734E+00 +PKER_RDRYG( 12, 15) = 0.714822E+00 +PKER_RDRYG( 12, 16) = 0.522561E+00 +PKER_RDRYG( 12, 17) = 0.375074E+00 +PKER_RDRYG( 12, 18) = 0.271992E+00 +PKER_RDRYG( 12, 19) = 0.210994E+00 +PKER_RDRYG( 12, 20) = 0.186793E+00 +PKER_RDRYG( 12, 21) = 0.190524E+00 +PKER_RDRYG( 12, 22) = 0.211914E+00 +PKER_RDRYG( 12, 23) = 0.241853E+00 +PKER_RDRYG( 12, 24) = 0.273771E+00 +PKER_RDRYG( 12, 25) = 0.303824E+00 +PKER_RDRYG( 12, 26) = 0.330330E+00 +PKER_RDRYG( 12, 27) = 0.352868E+00 +PKER_RDRYG( 12, 28) = 0.371654E+00 +PKER_RDRYG( 12, 29) = 0.387136E+00 +PKER_RDRYG( 12, 30) = 0.399827E+00 +PKER_RDRYG( 12, 31) = 0.410216E+00 +PKER_RDRYG( 12, 32) = 0.418726E+00 +PKER_RDRYG( 12, 33) = 0.425702E+00 +PKER_RDRYG( 12, 34) = 0.431426E+00 +PKER_RDRYG( 12, 35) = 0.436125E+00 +PKER_RDRYG( 12, 36) = 0.439985E+00 +PKER_RDRYG( 12, 37) = 0.443157E+00 +PKER_RDRYG( 12, 38) = 0.445766E+00 +PKER_RDRYG( 12, 39) = 0.447913E+00 +PKER_RDRYG( 12, 40) = 0.449679E+00 +PKER_RDRYG( 13, 1) = 0.154588E+02 +PKER_RDRYG( 13, 2) = 0.127507E+02 +PKER_RDRYG( 13, 3) = 0.105081E+02 +PKER_RDRYG( 13, 4) = 0.865080E+01 +PKER_RDRYG( 13, 5) = 0.711233E+01 +PKER_RDRYG( 13, 6) = 0.583772E+01 +PKER_RDRYG( 13, 7) = 0.478139E+01 +PKER_RDRYG( 13, 8) = 0.390560E+01 +PKER_RDRYG( 13, 9) = 0.317911E+01 +PKER_RDRYG( 13, 10) = 0.257601E+01 +PKER_RDRYG( 13, 11) = 0.207487E+01 +PKER_RDRYG( 13, 12) = 0.165798E+01 +PKER_RDRYG( 13, 13) = 0.131083E+01 +PKER_RDRYG( 13, 14) = 0.102169E+01 +PKER_RDRYG( 13, 15) = 0.781536E+00 +PKER_RDRYG( 13, 16) = 0.584105E+00 +PKER_RDRYG( 13, 17) = 0.425921E+00 +PKER_RDRYG( 13, 18) = 0.305717E+00 +PKER_RDRYG( 13, 19) = 0.222926E+00 +PKER_RDRYG( 13, 20) = 0.175670E+00 +PKER_RDRYG( 13, 21) = 0.158795E+00 +PKER_RDRYG( 13, 22) = 0.164617E+00 +PKER_RDRYG( 13, 23) = 0.184416E+00 +PKER_RDRYG( 13, 24) = 0.210615E+00 +PKER_RDRYG( 13, 25) = 0.237900E+00 +PKER_RDRYG( 13, 26) = 0.263298E+00 +PKER_RDRYG( 13, 27) = 0.285545E+00 +PKER_RDRYG( 13, 28) = 0.304391E+00 +PKER_RDRYG( 13, 29) = 0.320063E+00 +PKER_RDRYG( 13, 30) = 0.332961E+00 +PKER_RDRYG( 13, 31) = 0.343525E+00 +PKER_RDRYG( 13, 32) = 0.352171E+00 +PKER_RDRYG( 13, 33) = 0.359251E+00 +PKER_RDRYG( 13, 34) = 0.365054E+00 +PKER_RDRYG( 13, 35) = 0.369814E+00 +PKER_RDRYG( 13, 36) = 0.373722E+00 +PKER_RDRYG( 13, 37) = 0.376931E+00 +PKER_RDRYG( 13, 38) = 0.379569E+00 +PKER_RDRYG( 13, 39) = 0.381737E+00 +PKER_RDRYG( 13, 40) = 0.383521E+00 +PKER_RDRYG( 14, 1) = 0.154991E+02 +PKER_RDRYG( 14, 2) = 0.127916E+02 +PKER_RDRYG( 14, 3) = 0.105497E+02 +PKER_RDRYG( 14, 4) = 0.869314E+01 +PKER_RDRYG( 14, 5) = 0.715554E+01 +PKER_RDRYG( 14, 6) = 0.588191E+01 +PKER_RDRYG( 14, 7) = 0.482668E+01 +PKER_RDRYG( 14, 8) = 0.395215E+01 +PKER_RDRYG( 14, 9) = 0.322708E+01 +PKER_RDRYG( 14, 10) = 0.262557E+01 +PKER_RDRYG( 14, 11) = 0.212620E+01 +PKER_RDRYG( 14, 12) = 0.171122E+01 +PKER_RDRYG( 14, 13) = 0.136596E+01 +PKER_RDRYG( 14, 14) = 0.107842E+01 +PKER_RDRYG( 14, 15) = 0.838958E+00 +PKER_RDRYG( 14, 16) = 0.640183E+00 +PKER_RDRYG( 14, 17) = 0.477107E+00 +PKER_RDRYG( 14, 18) = 0.347057E+00 +PKER_RDRYG( 14, 19) = 0.249165E+00 +PKER_RDRYG( 14, 20) = 0.183013E+00 +PKER_RDRYG( 14, 21) = 0.146601E+00 +PKER_RDRYG( 14, 22) = 0.135353E+00 +PKER_RDRYG( 14, 23) = 0.142468E+00 +PKER_RDRYG( 14, 24) = 0.160555E+00 +PKER_RDRYG( 14, 25) = 0.183354E+00 +PKER_RDRYG( 14, 26) = 0.206635E+00 +PKER_RDRYG( 14, 27) = 0.228070E+00 +PKER_RDRYG( 14, 28) = 0.246738E+00 +PKER_RDRYG( 14, 29) = 0.262495E+00 +PKER_RDRYG( 14, 30) = 0.275569E+00 +PKER_RDRYG( 14, 31) = 0.286313E+00 +PKER_RDRYG( 14, 32) = 0.295107E+00 +PKER_RDRYG( 14, 33) = 0.302303E+00 +PKER_RDRYG( 14, 34) = 0.308195E+00 +PKER_RDRYG( 14, 35) = 0.313023E+00 +PKER_RDRYG( 14, 36) = 0.316982E+00 +PKER_RDRYG( 14, 37) = 0.320232E+00 +PKER_RDRYG( 14, 38) = 0.322901E+00 +PKER_RDRYG( 14, 39) = 0.325094E+00 +PKER_RDRYG( 14, 40) = 0.326896E+00 +PKER_RDRYG( 15, 1) = 0.155328E+02 +PKER_RDRYG( 15, 2) = 0.128258E+02 +PKER_RDRYG( 15, 3) = 0.105844E+02 +PKER_RDRYG( 15, 4) = 0.872843E+01 +PKER_RDRYG( 15, 5) = 0.719148E+01 +PKER_RDRYG( 15, 6) = 0.591857E+01 +PKER_RDRYG( 15, 7) = 0.486417E+01 +PKER_RDRYG( 15, 8) = 0.399057E+01 +PKER_RDRYG( 15, 9) = 0.326656E+01 +PKER_RDRYG( 15, 10) = 0.266625E+01 +PKER_RDRYG( 15, 11) = 0.216823E+01 +PKER_RDRYG( 15, 12) = 0.175475E+01 +PKER_RDRYG( 15, 13) = 0.141110E+01 +PKER_RDRYG( 15, 14) = 0.112517E+01 +PKER_RDRYG( 15, 15) = 0.887014E+00 +PKER_RDRYG( 15, 16) = 0.688694E+00 +PKER_RDRYG( 15, 17) = 0.524210E+00 +PKER_RDRYG( 15, 18) = 0.389564E+00 +PKER_RDRYG( 15, 19) = 0.282710E+00 +PKER_RDRYG( 15, 20) = 0.203209E+00 +PKER_RDRYG( 15, 21) = 0.150500E+00 +PKER_RDRYG( 15, 22) = 0.122720E+00 +PKER_RDRYG( 15, 23) = 0.115684E+00 +PKER_RDRYG( 15, 24) = 0.123454E+00 +PKER_RDRYG( 15, 25) = 0.139800E+00 +PKER_RDRYG( 15, 26) = 0.159573E+00 +PKER_RDRYG( 15, 27) = 0.179400E+00 +PKER_RDRYG( 15, 28) = 0.197477E+00 +PKER_RDRYG( 15, 29) = 0.213128E+00 +PKER_RDRYG( 15, 30) = 0.226299E+00 +PKER_RDRYG( 15, 31) = 0.237204E+00 +PKER_RDRYG( 15, 32) = 0.246155E+00 +PKER_RDRYG( 15, 33) = 0.253478E+00 +PKER_RDRYG( 15, 34) = 0.259467E+00 +PKER_RDRYG( 15, 35) = 0.264371E+00 +PKER_RDRYG( 15, 36) = 0.268388E+00 +PKER_RDRYG( 15, 37) = 0.271682E+00 +PKER_RDRYG( 15, 38) = 0.274385E+00 +PKER_RDRYG( 15, 39) = 0.276605E+00 +PKER_RDRYG( 15, 40) = 0.278428E+00 +PKER_RDRYG( 16, 1) = 0.155611E+02 +PKER_RDRYG( 16, 2) = 0.128544E+02 +PKER_RDRYG( 16, 3) = 0.106134E+02 +PKER_RDRYG( 16, 4) = 0.875790E+01 +PKER_RDRYG( 16, 5) = 0.722144E+01 +PKER_RDRYG( 16, 6) = 0.594908E+01 +PKER_RDRYG( 16, 7) = 0.489528E+01 +PKER_RDRYG( 16, 8) = 0.402238E+01 +PKER_RDRYG( 16, 9) = 0.329915E+01 +PKER_RDRYG( 16, 10) = 0.269974E+01 +PKER_RDRYG( 16, 11) = 0.220274E+01 +PKER_RDRYG( 16, 12) = 0.179040E+01 +PKER_RDRYG( 16, 13) = 0.144802E+01 +PKER_RDRYG( 16, 14) = 0.116345E+01 +PKER_RDRYG( 16, 15) = 0.926641E+00 +PKER_RDRYG( 16, 16) = 0.729392E+00 +PKER_RDRYG( 16, 17) = 0.565165E+00 +PKER_RDRYG( 16, 18) = 0.429078E+00 +PKER_RDRYG( 16, 19) = 0.317968E+00 +PKER_RDRYG( 16, 20) = 0.230366E+00 +PKER_RDRYG( 16, 21) = 0.165832E+00 +PKER_RDRYG( 16, 22) = 0.123999E+00 +PKER_RDRYG( 16, 23) = 0.102998E+00 +PKER_RDRYG( 16, 24) = 0.991169E-01 +PKER_RDRYG( 16, 25) = 0.107099E+00 +PKER_RDRYG( 16, 26) = 0.121727E+00 +PKER_RDRYG( 16, 27) = 0.138829E+00 +PKER_RDRYG( 16, 28) = 0.155681E+00 +PKER_RDRYG( 16, 29) = 0.170911E+00 +PKER_RDRYG( 16, 30) = 0.184033E+00 +PKER_RDRYG( 16, 31) = 0.195040E+00 +PKER_RDRYG( 16, 32) = 0.204136E+00 +PKER_RDRYG( 16, 33) = 0.211593E+00 +PKER_RDRYG( 16, 34) = 0.217691E+00 +PKER_RDRYG( 16, 35) = 0.222677E+00 +PKER_RDRYG( 16, 36) = 0.226759E+00 +PKER_RDRYG( 16, 37) = 0.230102E+00 +PKER_RDRYG( 16, 38) = 0.232843E+00 +PKER_RDRYG( 16, 39) = 0.235091E+00 +PKER_RDRYG( 16, 40) = 0.236937E+00 +PKER_RDRYG( 17, 1) = 0.155848E+02 +PKER_RDRYG( 17, 2) = 0.128785E+02 +PKER_RDRYG( 17, 3) = 0.106378E+02 +PKER_RDRYG( 17, 4) = 0.878258E+01 +PKER_RDRYG( 17, 5) = 0.724648E+01 +PKER_RDRYG( 17, 6) = 0.597452E+01 +PKER_RDRYG( 17, 7) = 0.492118E+01 +PKER_RDRYG( 17, 8) = 0.404879E+01 +PKER_RDRYG( 17, 9) = 0.332615E+01 +PKER_RDRYG( 17, 10) = 0.272740E+01 +PKER_RDRYG( 17, 11) = 0.223115E+01 +PKER_RDRYG( 17, 12) = 0.181967E+01 +PKER_RDRYG( 17, 13) = 0.147827E+01 +PKER_RDRYG( 17, 14) = 0.119477E+01 +PKER_RDRYG( 17, 15) = 0.959115E+00 +PKER_RDRYG( 17, 16) = 0.762992E+00 +PKER_RDRYG( 17, 17) = 0.599624E+00 +PKER_RDRYG( 17, 18) = 0.463642E+00 +PKER_RDRYG( 17, 19) = 0.351078E+00 +PKER_RDRYG( 17, 20) = 0.259445E+00 +PKER_RDRYG( 17, 21) = 0.187672E+00 +PKER_RDRYG( 17, 22) = 0.135435E+00 +PKER_RDRYG( 17, 23) = 0.102368E+00 +PKER_RDRYG( 17, 24) = 0.867396E-01 +PKER_RDRYG( 17, 25) = 0.850688E-01 +PKER_RDRYG( 17, 26) = 0.929638E-01 +PKER_RDRYG( 17, 27) = 0.105991E+00 +PKER_RDRYG( 17, 28) = 0.120728E+00 +PKER_RDRYG( 17, 29) = 0.135039E+00 +PKER_RDRYG( 17, 30) = 0.147861E+00 +PKER_RDRYG( 17, 31) = 0.158856E+00 +PKER_RDRYG( 17, 32) = 0.168054E+00 +PKER_RDRYG( 17, 33) = 0.175640E+00 +PKER_RDRYG( 17, 34) = 0.181854E+00 +PKER_RDRYG( 17, 35) = 0.186932E+00 +PKER_RDRYG( 17, 36) = 0.191084E+00 +PKER_RDRYG( 17, 37) = 0.194481E+00 +PKER_RDRYG( 17, 38) = 0.197264E+00 +PKER_RDRYG( 17, 39) = 0.199545E+00 +PKER_RDRYG( 17, 40) = 0.201416E+00 +PKER_RDRYG( 18, 1) = 0.156048E+02 +PKER_RDRYG( 18, 2) = 0.128987E+02 +PKER_RDRYG( 18, 3) = 0.106582E+02 +PKER_RDRYG( 18, 4) = 0.880327E+01 +PKER_RDRYG( 18, 5) = 0.726745E+01 +PKER_RDRYG( 18, 6) = 0.599579E+01 +PKER_RDRYG( 18, 7) = 0.494280E+01 +PKER_RDRYG( 18, 8) = 0.407079E+01 +PKER_RDRYG( 18, 9) = 0.334857E+01 +PKER_RDRYG( 18, 10) = 0.275031E+01 +PKER_RDRYG( 18, 11) = 0.225462E+01 +PKER_RDRYG( 18, 12) = 0.184378E+01 +PKER_RDRYG( 18, 13) = 0.150310E+01 +PKER_RDRYG( 18, 14) = 0.122043E+01 +PKER_RDRYG( 18, 15) = 0.985691E+00 +PKER_RDRYG( 18, 16) = 0.790542E+00 +PKER_RDRYG( 18, 17) = 0.628114E+00 +PKER_RDRYG( 18, 18) = 0.492811E+00 +PKER_RDRYG( 18, 19) = 0.380219E+00 +PKER_RDRYG( 18, 20) = 0.287142E+00 +PKER_RDRYG( 18, 21) = 0.211629E+00 +PKER_RDRYG( 18, 22) = 0.152851E+00 +PKER_RDRYG( 18, 23) = 0.110724E+00 +PKER_RDRYG( 18, 24) = 0.847137E-01 +PKER_RDRYG( 18, 25) = 0.732323E-01 +PKER_RDRYG( 18, 26) = 0.732076E-01 +PKER_RDRYG( 18, 27) = 0.807748E-01 +PKER_RDRYG( 18, 28) = 0.922834E-01 +PKER_RDRYG( 18, 29) = 0.104948E+00 +PKER_RDRYG( 18, 30) = 0.117078E+00 +PKER_RDRYG( 18, 31) = 0.127868E+00 +PKER_RDRYG( 18, 32) = 0.137079E+00 +PKER_RDRYG( 18, 33) = 0.144764E+00 +PKER_RDRYG( 18, 34) = 0.151091E+00 +PKER_RDRYG( 18, 35) = 0.156269E+00 +PKER_RDRYG( 18, 36) = 0.160499E+00 +PKER_RDRYG( 18, 37) = 0.163956E+00 +PKER_RDRYG( 18, 38) = 0.166785E+00 +PKER_RDRYG( 18, 39) = 0.169102E+00 +PKER_RDRYG( 18, 40) = 0.171000E+00 +PKER_RDRYG( 19, 1) = 0.156217E+02 +PKER_RDRYG( 19, 2) = 0.129157E+02 +PKER_RDRYG( 19, 3) = 0.106754E+02 +PKER_RDRYG( 19, 4) = 0.882064E+01 +PKER_RDRYG( 19, 5) = 0.728503E+01 +PKER_RDRYG( 19, 6) = 0.601361E+01 +PKER_RDRYG( 19, 7) = 0.496087E+01 +PKER_RDRYG( 19, 8) = 0.408915E+01 +PKER_RDRYG( 19, 9) = 0.336725E+01 +PKER_RDRYG( 19, 10) = 0.276936E+01 +PKER_RDRYG( 19, 11) = 0.227408E+01 +PKER_RDRYG( 19, 12) = 0.186371E+01 +PKER_RDRYG( 19, 13) = 0.152357E+01 +PKER_RDRYG( 19, 14) = 0.124151E+01 +PKER_RDRYG( 19, 15) = 0.100747E+01 +PKER_RDRYG( 19, 16) = 0.813095E+00 +PKER_RDRYG( 19, 17) = 0.651490E+00 +PKER_RDRYG( 19, 18) = 0.516968E+00 +PKER_RDRYG( 19, 19) = 0.404911E+00 +PKER_RDRYG( 19, 20) = 0.311706E+00 +PKER_RDRYG( 19, 21) = 0.234763E+00 +PKER_RDRYG( 19, 22) = 0.172575E+00 +PKER_RDRYG( 19, 23) = 0.124563E+00 +PKER_RDRYG( 19, 24) = 0.906076E-01 +PKER_RDRYG( 19, 25) = 0.702940E-01 +PKER_RDRYG( 19, 26) = 0.620081E-01 +PKER_RDRYG( 19, 27) = 0.630865E-01 +PKER_RDRYG( 19, 28) = 0.702057E-01 +PKER_RDRYG( 19, 29) = 0.803254E-01 +PKER_RDRYG( 19, 30) = 0.911904E-01 +PKER_RDRYG( 19, 31) = 0.101465E+00 +PKER_RDRYG( 19, 32) = 0.110536E+00 +PKER_RDRYG( 19, 33) = 0.118251E+00 +PKER_RDRYG( 19, 34) = 0.124670E+00 +PKER_RDRYG( 19, 35) = 0.129948E+00 +PKER_RDRYG( 19, 36) = 0.134262E+00 +PKER_RDRYG( 19, 37) = 0.137786E+00 +PKER_RDRYG( 19, 38) = 0.140666E+00 +PKER_RDRYG( 19, 39) = 0.143022E+00 +PKER_RDRYG( 19, 40) = 0.144951E+00 +PKER_RDRYG( 20, 1) = 0.156359E+02 +PKER_RDRYG( 20, 2) = 0.129300E+02 +PKER_RDRYG( 20, 3) = 0.106899E+02 +PKER_RDRYG( 20, 4) = 0.883526E+01 +PKER_RDRYG( 20, 5) = 0.729981E+01 +PKER_RDRYG( 20, 6) = 0.602856E+01 +PKER_RDRYG( 20, 7) = 0.497602E+01 +PKER_RDRYG( 20, 8) = 0.410451E+01 +PKER_RDRYG( 20, 9) = 0.338285E+01 +PKER_RDRYG( 20, 10) = 0.278523E+01 +PKER_RDRYG( 20, 11) = 0.229026E+01 +PKER_RDRYG( 20, 12) = 0.188023E+01 +PKER_RDRYG( 20, 13) = 0.154049E+01 +PKER_RDRYG( 20, 14) = 0.125889E+01 +PKER_RDRYG( 20, 15) = 0.102536E+01 +PKER_RDRYG( 20, 16) = 0.831581E+00 +PKER_RDRYG( 20, 17) = 0.670632E+00 +PKER_RDRYG( 20, 18) = 0.536803E+00 +PKER_RDRYG( 20, 19) = 0.425393E+00 +PKER_RDRYG( 20, 20) = 0.332592E+00 +PKER_RDRYG( 20, 21) = 0.255441E+00 +PKER_RDRYG( 20, 22) = 0.191863E+00 +PKER_RDRYG( 20, 23) = 0.140678E+00 +PKER_RDRYG( 20, 24) = 0.101505E+00 +PKER_RDRYG( 20, 25) = 0.742493E-01 +PKER_RDRYG( 20, 26) = 0.584264E-01 +PKER_RDRYG( 20, 27) = 0.526432E-01 +PKER_RDRYG( 20, 28) = 0.544495E-01 +PKER_RDRYG( 20, 29) = 0.610513E-01 +PKER_RDRYG( 20, 30) = 0.699078E-01 +PKER_RDRYG( 20, 31) = 0.792045E-01 +PKER_RDRYG( 20, 32) = 0.878929E-01 +PKER_RDRYG( 20, 33) = 0.955190E-01 +PKER_RDRYG( 20, 34) = 0.101978E+00 +PKER_RDRYG( 20, 35) = 0.107340E+00 +PKER_RDRYG( 20, 36) = 0.111742E+00 +PKER_RDRYG( 20, 37) = 0.115338E+00 +PKER_RDRYG( 20, 38) = 0.118274E+00 +PKER_RDRYG( 20, 39) = 0.120673E+00 +PKER_RDRYG( 20, 40) = 0.122635E+00 +PKER_RDRYG( 21, 1) = 0.156479E+02 +PKER_RDRYG( 21, 2) = 0.129421E+02 +PKER_RDRYG( 21, 3) = 0.107021E+02 +PKER_RDRYG( 21, 4) = 0.884758E+01 +PKER_RDRYG( 21, 5) = 0.731225E+01 +PKER_RDRYG( 21, 6) = 0.604114E+01 +PKER_RDRYG( 21, 7) = 0.498874E+01 +PKER_RDRYG( 21, 8) = 0.411739E+01 +PKER_RDRYG( 21, 9) = 0.339591E+01 +PKER_RDRYG( 21, 10) = 0.279849E+01 +PKER_RDRYG( 21, 11) = 0.230374E+01 +PKER_RDRYG( 21, 12) = 0.189397E+01 +PKER_RDRYG( 21, 13) = 0.155452E+01 +PKER_RDRYG( 21, 14) = 0.127326E+01 +PKER_RDRYG( 21, 15) = 0.104012E+01 +PKER_RDRYG( 21, 16) = 0.846776E+00 +PKER_RDRYG( 21, 17) = 0.686327E+00 +PKER_RDRYG( 21, 18) = 0.553054E+00 +PKER_RDRYG( 21, 19) = 0.442227E+00 +PKER_RDRYG( 21, 20) = 0.349958E+00 +PKER_RDRYG( 21, 21) = 0.273107E+00 +PKER_RDRYG( 21, 22) = 0.209258E+00 +PKER_RDRYG( 21, 23) = 0.156741E+00 +PKER_RDRYG( 21, 24) = 0.114650E+00 +PKER_RDRYG( 21, 25) = 0.827499E-01 +PKER_RDRYG( 21, 26) = 0.609346E-01 +PKER_RDRYG( 21, 27) = 0.487447E-01 +PKER_RDRYG( 21, 28) = 0.448236E-01 +PKER_RDRYG( 21, 29) = 0.470754E-01 +PKER_RDRYG( 21, 30) = 0.531032E-01 +PKER_RDRYG( 21, 31) = 0.608204E-01 +PKER_RDRYG( 21, 32) = 0.687615E-01 +PKER_RDRYG( 21, 33) = 0.761062E-01 +PKER_RDRYG( 21, 34) = 0.825119E-01 +PKER_RDRYG( 21, 35) = 0.879190E-01 +PKER_RDRYG( 21, 36) = 0.923978E-01 +PKER_RDRYG( 21, 37) = 0.960692E-01 +PKER_RDRYG( 21, 38) = 0.990669E-01 +PKER_RDRYG( 21, 39) = 0.101514E+00 +PKER_RDRYG( 21, 40) = 0.103513E+00 +PKER_RDRYG( 22, 1) = 0.156580E+02 +PKER_RDRYG( 22, 2) = 0.129523E+02 +PKER_RDRYG( 22, 3) = 0.107124E+02 +PKER_RDRYG( 22, 4) = 0.885797E+01 +PKER_RDRYG( 22, 5) = 0.732273E+01 +PKER_RDRYG( 22, 6) = 0.605172E+01 +PKER_RDRYG( 22, 7) = 0.499943E+01 +PKER_RDRYG( 22, 8) = 0.412821E+01 +PKER_RDRYG( 22, 9) = 0.340686E+01 +PKER_RDRYG( 22, 10) = 0.280959E+01 +PKER_RDRYG( 22, 11) = 0.231501E+01 +PKER_RDRYG( 22, 12) = 0.190543E+01 +PKER_RDRYG( 22, 13) = 0.156620E+01 +PKER_RDRYG( 22, 14) = 0.128518E+01 +PKER_RDRYG( 22, 15) = 0.105232E+01 +PKER_RDRYG( 22, 16) = 0.859305E+00 +PKER_RDRYG( 22, 17) = 0.699230E+00 +PKER_RDRYG( 22, 18) = 0.566381E+00 +PKER_RDRYG( 22, 19) = 0.456024E+00 +PKER_RDRYG( 22, 20) = 0.364245E+00 +PKER_RDRYG( 22, 21) = 0.287830E+00 +PKER_RDRYG( 22, 22) = 0.224192E+00 +PKER_RDRYG( 22, 23) = 0.171359E+00 +PKER_RDRYG( 22, 24) = 0.128001E+00 +PKER_RDRYG( 22, 25) = 0.934489E-01 +PKER_RDRYG( 22, 26) = 0.674901E-01 +PKER_RDRYG( 22, 27) = 0.500882E-01 +PKER_RDRYG( 22, 28) = 0.407416E-01 +PKER_RDRYG( 22, 29) = 0.382527E-01 +PKER_RDRYG( 22, 30) = 0.407450E-01 +PKER_RDRYG( 22, 31) = 0.462007E-01 +PKER_RDRYG( 22, 32) = 0.529000E-01 +PKER_RDRYG( 22, 33) = 0.596709E-01 +PKER_RDRYG( 22, 34) = 0.658722E-01 +PKER_RDRYG( 22, 35) = 0.712512E-01 +PKER_RDRYG( 22, 36) = 0.757772E-01 +PKER_RDRYG( 22, 37) = 0.795178E-01 +PKER_RDRYG( 22, 38) = 0.825803E-01 +PKER_RDRYG( 22, 39) = 0.850795E-01 +PKER_RDRYG( 22, 40) = 0.871191E-01 +PKER_RDRYG( 23, 1) = 0.156666E+02 +PKER_RDRYG( 23, 2) = 0.129610E+02 +PKER_RDRYG( 23, 3) = 0.107211E+02 +PKER_RDRYG( 23, 4) = 0.886674E+01 +PKER_RDRYG( 23, 5) = 0.733158E+01 +PKER_RDRYG( 23, 6) = 0.606064E+01 +PKER_RDRYG( 23, 7) = 0.500844E+01 +PKER_RDRYG( 23, 8) = 0.413730E+01 +PKER_RDRYG( 23, 9) = 0.341606E+01 +PKER_RDRYG( 23, 10) = 0.281890E+01 +PKER_RDRYG( 23, 11) = 0.232445E+01 +PKER_RDRYG( 23, 12) = 0.191501E+01 +PKER_RDRYG( 23, 13) = 0.157594E+01 +PKER_RDRYG( 23, 14) = 0.129510E+01 +PKER_RDRYG( 23, 15) = 0.106245E+01 +PKER_RDRYG( 23, 16) = 0.869674E+00 +PKER_RDRYG( 23, 17) = 0.709873E+00 +PKER_RDRYG( 23, 18) = 0.577340E+00 +PKER_RDRYG( 23, 19) = 0.467343E+00 +PKER_RDRYG( 23, 20) = 0.375961E+00 +PKER_RDRYG( 23, 21) = 0.299956E+00 +PKER_RDRYG( 23, 22) = 0.236671E+00 +PKER_RDRYG( 23, 23) = 0.183979E+00 +PKER_RDRYG( 23, 24) = 0.140272E+00 +PKER_RDRYG( 23, 25) = 0.104494E+00 +PKER_RDRYG( 23, 26) = 0.761340E-01 +PKER_RDRYG( 23, 27) = 0.550738E-01 +PKER_RDRYG( 23, 28) = 0.412380E-01 +PKER_RDRYG( 23, 29) = 0.341626E-01 +PKER_RDRYG( 23, 30) = 0.327198E-01 +PKER_RDRYG( 23, 31) = 0.353014E-01 +PKER_RDRYG( 23, 32) = 0.401947E-01 +PKER_RDRYG( 23, 33) = 0.459971E-01 +PKER_RDRYG( 23, 34) = 0.517601E-01 +PKER_RDRYG( 23, 35) = 0.569916E-01 +PKER_RDRYG( 23, 36) = 0.615074E-01 +PKER_RDRYG( 23, 37) = 0.652947E-01 +PKER_RDRYG( 23, 38) = 0.684187E-01 +PKER_RDRYG( 23, 39) = 0.709735E-01 +PKER_RDRYG( 23, 40) = 0.730575E-01 +PKER_RDRYG( 24, 1) = 0.156739E+02 +PKER_RDRYG( 24, 2) = 0.129683E+02 +PKER_RDRYG( 24, 3) = 0.107284E+02 +PKER_RDRYG( 24, 4) = 0.887415E+01 +PKER_RDRYG( 24, 5) = 0.733905E+01 +PKER_RDRYG( 24, 6) = 0.606817E+01 +PKER_RDRYG( 24, 7) = 0.501603E+01 +PKER_RDRYG( 24, 8) = 0.414497E+01 +PKER_RDRYG( 24, 9) = 0.342381E+01 +PKER_RDRYG( 24, 10) = 0.282673E+01 +PKER_RDRYG( 24, 11) = 0.233237E+01 +PKER_RDRYG( 24, 12) = 0.192304E+01 +PKER_RDRYG( 24, 13) = 0.158408E+01 +PKER_RDRYG( 24, 14) = 0.130338E+01 +PKER_RDRYG( 24, 15) = 0.107089E+01 +PKER_RDRYG( 24, 16) = 0.878282E+00 +PKER_RDRYG( 24, 17) = 0.718684E+00 +PKER_RDRYG( 24, 18) = 0.586383E+00 +PKER_RDRYG( 24, 19) = 0.476653E+00 +PKER_RDRYG( 24, 20) = 0.385576E+00 +PKER_RDRYG( 24, 21) = 0.309906E+00 +PKER_RDRYG( 24, 22) = 0.246964E+00 +PKER_RDRYG( 24, 23) = 0.194554E+00 +PKER_RDRYG( 24, 24) = 0.150927E+00 +PKER_RDRYG( 24, 25) = 0.114779E+00 +PKER_RDRYG( 24, 26) = 0.852750E-01 +PKER_RDRYG( 24, 27) = 0.620279E-01 +PKER_RDRYG( 24, 28) = 0.449765E-01 +PKER_RDRYG( 24, 29) = 0.340278E-01 +PKER_RDRYG( 24, 30) = 0.287248E-01 +PKER_RDRYG( 24, 31) = 0.280506E-01 +PKER_RDRYG( 24, 32) = 0.306122E-01 +PKER_RDRYG( 24, 33) = 0.349754E-01 +PKER_RDRYG( 24, 34) = 0.399788E-01 +PKER_RDRYG( 24, 35) = 0.448785E-01 +PKER_RDRYG( 24, 36) = 0.492896E-01 +PKER_RDRYG( 24, 37) = 0.530789E-01 +PKER_RDRYG( 24, 38) = 0.562478E-01 +PKER_RDRYG( 24, 39) = 0.588567E-01 +PKER_RDRYG( 24, 40) = 0.609882E-01 +PKER_RDRYG( 25, 1) = 0.156801E+02 +PKER_RDRYG( 25, 2) = 0.129745E+02 +PKER_RDRYG( 25, 3) = 0.107347E+02 +PKER_RDRYG( 25, 4) = 0.888043E+01 +PKER_RDRYG( 25, 5) = 0.734536E+01 +PKER_RDRYG( 25, 6) = 0.607453E+01 +PKER_RDRYG( 25, 7) = 0.502245E+01 +PKER_RDRYG( 25, 8) = 0.415144E+01 +PKER_RDRYG( 25, 9) = 0.343033E+01 +PKER_RDRYG( 25, 10) = 0.283332E+01 +PKER_RDRYG( 25, 11) = 0.233903E+01 +PKER_RDRYG( 25, 12) = 0.192978E+01 +PKER_RDRYG( 25, 13) = 0.159091E+01 +PKER_RDRYG( 25, 14) = 0.131031E+01 +PKER_RDRYG( 25, 15) = 0.107793E+01 +PKER_RDRYG( 25, 16) = 0.885452E+00 +PKER_RDRYG( 25, 17) = 0.726001E+00 +PKER_RDRYG( 25, 18) = 0.593871E+00 +PKER_RDRYG( 25, 19) = 0.484338E+00 +PKER_RDRYG( 25, 20) = 0.393487E+00 +PKER_RDRYG( 25, 21) = 0.318075E+00 +PKER_RDRYG( 25, 22) = 0.255416E+00 +PKER_RDRYG( 25, 23) = 0.203291E+00 +PKER_RDRYG( 25, 24) = 0.159889E+00 +PKER_RDRYG( 25, 25) = 0.123773E+00 +PKER_RDRYG( 25, 26) = 0.938825E-01 +PKER_RDRYG( 25, 27) = 0.695667E-01 +PKER_RDRYG( 25, 28) = 0.505383E-01 +PKER_RDRYG( 25, 29) = 0.367602E-01 +PKER_RDRYG( 25, 30) = 0.281404E-01 +PKER_RDRYG( 25, 31) = 0.242165E-01 +PKER_RDRYG( 25, 32) = 0.240985E-01 +PKER_RDRYG( 25, 33) = 0.265682E-01 +PKER_RDRYG( 25, 34) = 0.304264E-01 +PKER_RDRYG( 25, 35) = 0.347350E-01 +PKER_RDRYG( 25, 36) = 0.388954E-01 +PKER_RDRYG( 25, 37) = 0.426118E-01 +PKER_RDRYG( 25, 38) = 0.457911E-01 +PKER_RDRYG( 25, 39) = 0.484422E-01 +PKER_RDRYG( 25, 40) = 0.506210E-01 +PKER_RDRYG( 26, 1) = 0.156853E+02 +PKER_RDRYG( 26, 2) = 0.129797E+02 +PKER_RDRYG( 26, 3) = 0.107400E+02 +PKER_RDRYG( 26, 4) = 0.888574E+01 +PKER_RDRYG( 26, 5) = 0.735071E+01 +PKER_RDRYG( 26, 6) = 0.607992E+01 +PKER_RDRYG( 26, 7) = 0.502787E+01 +PKER_RDRYG( 26, 8) = 0.415690E+01 +PKER_RDRYG( 26, 9) = 0.343584E+01 +PKER_RDRYG( 26, 10) = 0.283888E+01 +PKER_RDRYG( 26, 11) = 0.234464E+01 +PKER_RDRYG( 26, 12) = 0.193545E+01 +PKER_RDRYG( 26, 13) = 0.159665E+01 +PKER_RDRYG( 26, 14) = 0.131612E+01 +PKER_RDRYG( 26, 15) = 0.108382E+01 +PKER_RDRYG( 26, 16) = 0.891439E+00 +PKER_RDRYG( 26, 17) = 0.732097E+00 +PKER_RDRYG( 26, 18) = 0.600091E+00 +PKER_RDRYG( 26, 19) = 0.490702E+00 +PKER_RDRYG( 26, 20) = 0.400018E+00 +PKER_RDRYG( 26, 21) = 0.324798E+00 +PKER_RDRYG( 26, 22) = 0.262357E+00 +PKER_RDRYG( 26, 23) = 0.210471E+00 +PKER_RDRYG( 26, 24) = 0.167304E+00 +PKER_RDRYG( 26, 25) = 0.131363E+00 +PKER_RDRYG( 26, 26) = 0.101467E+00 +PKER_RDRYG( 26, 27) = 0.767609E-01 +PKER_RDRYG( 26, 28) = 0.567283E-01 +PKER_RDRYG( 26, 29) = 0.411794E-01 +PKER_RDRYG( 26, 30) = 0.300747E-01 +PKER_RDRYG( 26, 31) = 0.233080E-01 +PKER_RDRYG( 26, 32) = 0.204716E-01 +PKER_RDRYG( 26, 33) = 0.207372E-01 +PKER_RDRYG( 26, 34) = 0.230713E-01 +PKER_RDRYG( 26, 35) = 0.264699E-01 +PKER_RDRYG( 26, 36) = 0.301689E-01 +PKER_RDRYG( 26, 37) = 0.336958E-01 +PKER_RDRYG( 26, 38) = 0.368256E-01 +PKER_RDRYG( 26, 39) = 0.394921E-01 +PKER_RDRYG( 26, 40) = 0.417098E-01 +PKER_RDRYG( 27, 1) = 0.156897E+02 +PKER_RDRYG( 27, 2) = 0.129842E+02 +PKER_RDRYG( 27, 3) = 0.107444E+02 +PKER_RDRYG( 27, 4) = 0.889024E+01 +PKER_RDRYG( 27, 5) = 0.735524E+01 +PKER_RDRYG( 27, 6) = 0.608447E+01 +PKER_RDRYG( 27, 7) = 0.503245E+01 +PKER_RDRYG( 27, 8) = 0.416152E+01 +PKER_RDRYG( 27, 9) = 0.344049E+01 +PKER_RDRYG( 27, 10) = 0.284357E+01 +PKER_RDRYG( 27, 11) = 0.234937E+01 +PKER_RDRYG( 27, 12) = 0.194022E+01 +PKER_RDRYG( 27, 13) = 0.160147E+01 +PKER_RDRYG( 27, 14) = 0.132100E+01 +PKER_RDRYG( 27, 15) = 0.108876E+01 +PKER_RDRYG( 27, 16) = 0.896452E+00 +PKER_RDRYG( 27, 17) = 0.737189E+00 +PKER_RDRYG( 27, 18) = 0.605275E+00 +PKER_RDRYG( 27, 19) = 0.495991E+00 +PKER_RDRYG( 27, 20) = 0.405429E+00 +PKER_RDRYG( 27, 21) = 0.330350E+00 +PKER_RDRYG( 27, 22) = 0.268071E+00 +PKER_RDRYG( 27, 23) = 0.216369E+00 +PKER_RDRYG( 27, 24) = 0.173404E+00 +PKER_RDRYG( 27, 25) = 0.137657E+00 +PKER_RDRYG( 27, 26) = 0.107894E+00 +PKER_RDRYG( 27, 27) = 0.831508E-01 +PKER_RDRYG( 27, 28) = 0.627371E-01 +PKER_RDRYG( 27, 29) = 0.462532E-01 +PKER_RDRYG( 27, 30) = 0.335602E-01 +PKER_RDRYG( 27, 31) = 0.246352E-01 +PKER_RDRYG( 27, 32) = 0.193701E-01 +PKER_RDRYG( 27, 33) = 0.173556E-01 +PKER_RDRYG( 27, 34) = 0.178767E-01 +PKER_RDRYG( 27, 35) = 0.200407E-01 +PKER_RDRYG( 27, 36) = 0.230216E-01 +PKER_RDRYG( 27, 37) = 0.261908E-01 +PKER_RDRYG( 27, 38) = 0.291792E-01 +PKER_RDRYG( 27, 39) = 0.318140E-01 +PKER_RDRYG( 27, 40) = 0.340498E-01 +PKER_RDRYG( 28, 1) = 0.156935E+02 +PKER_RDRYG( 28, 2) = 0.129880E+02 +PKER_RDRYG( 28, 3) = 0.107482E+02 +PKER_RDRYG( 28, 4) = 0.889406E+01 +PKER_RDRYG( 28, 5) = 0.735908E+01 +PKER_RDRYG( 28, 6) = 0.608833E+01 +PKER_RDRYG( 28, 7) = 0.503634E+01 +PKER_RDRYG( 28, 8) = 0.416543E+01 +PKER_RDRYG( 28, 9) = 0.344443E+01 +PKER_RDRYG( 28, 10) = 0.284753E+01 +PKER_RDRYG( 28, 11) = 0.235337E+01 +PKER_RDRYG( 28, 12) = 0.194425E+01 +PKER_RDRYG( 28, 13) = 0.160554E+01 +PKER_RDRYG( 28, 14) = 0.132511E+01 +PKER_RDRYG( 28, 15) = 0.109292E+01 +PKER_RDRYG( 28, 16) = 0.900659E+00 +PKER_RDRYG( 28, 17) = 0.741455E+00 +PKER_RDRYG( 28, 18) = 0.609608E+00 +PKER_RDRYG( 28, 19) = 0.500400E+00 +PKER_RDRYG( 28, 20) = 0.409927E+00 +PKER_RDRYG( 28, 21) = 0.334951E+00 +PKER_RDRYG( 28, 22) = 0.272791E+00 +PKER_RDRYG( 28, 23) = 0.221227E+00 +PKER_RDRYG( 28, 24) = 0.178418E+00 +PKER_RDRYG( 28, 25) = 0.142839E+00 +PKER_RDRYG( 28, 26) = 0.113236E+00 +PKER_RDRYG( 28, 27) = 0.885917E-01 +PKER_RDRYG( 28, 28) = 0.681158E-01 +PKER_RDRYG( 28, 29) = 0.512555E-01 +PKER_RDRYG( 28, 30) = 0.377074E-01 +PKER_RDRYG( 28, 31) = 0.273581E-01 +PKER_RDRYG( 28, 32) = 0.202058E-01 +PKER_RDRYG( 28, 33) = 0.161272E-01 +PKER_RDRYG( 28, 34) = 0.147463E-01 +PKER_RDRYG( 28, 35) = 0.154299E-01 +PKER_RDRYG( 28, 36) = 0.174181E-01 +PKER_RDRYG( 28, 37) = 0.200165E-01 +PKER_RDRYG( 28, 38) = 0.227292E-01 +PKER_RDRYG( 28, 39) = 0.252583E-01 +PKER_RDRYG( 28, 40) = 0.274748E-01 +PKER_RDRYG( 29, 1) = 0.156967E+02 +PKER_RDRYG( 29, 2) = 0.129912E+02 +PKER_RDRYG( 29, 3) = 0.107515E+02 +PKER_RDRYG( 29, 4) = 0.889730E+01 +PKER_RDRYG( 29, 5) = 0.736233E+01 +PKER_RDRYG( 29, 6) = 0.609161E+01 +PKER_RDRYG( 29, 7) = 0.503963E+01 +PKER_RDRYG( 29, 8) = 0.416874E+01 +PKER_RDRYG( 29, 9) = 0.344776E+01 +PKER_RDRYG( 29, 10) = 0.285088E+01 +PKER_RDRYG( 29, 11) = 0.235675E+01 +PKER_RDRYG( 29, 12) = 0.194766E+01 +PKER_RDRYG( 29, 13) = 0.160897E+01 +PKER_RDRYG( 29, 14) = 0.132857E+01 +PKER_RDRYG( 29, 15) = 0.109641E+01 +PKER_RDRYG( 29, 16) = 0.904196E+00 +PKER_RDRYG( 29, 17) = 0.745035E+00 +PKER_RDRYG( 29, 18) = 0.613237E+00 +PKER_RDRYG( 29, 19) = 0.504086E+00 +PKER_RDRYG( 29, 20) = 0.413678E+00 +PKER_RDRYG( 29, 21) = 0.338776E+00 +PKER_RDRYG( 29, 22) = 0.276704E+00 +PKER_RDRYG( 29, 23) = 0.225241E+00 +PKER_RDRYG( 29, 24) = 0.182548E+00 +PKER_RDRYG( 29, 25) = 0.147101E+00 +PKER_RDRYG( 29, 26) = 0.117639E+00 +PKER_RDRYG( 29, 27) = 0.931243E-01 +PKER_RDRYG( 29, 28) = 0.727192E-01 +PKER_RDRYG( 29, 29) = 0.557785E-01 +PKER_RDRYG( 29, 30) = 0.418595E-01 +PKER_RDRYG( 29, 31) = 0.307224E-01 +PKER_RDRYG( 29, 32) = 0.223096E-01 +PKER_RDRYG( 29, 33) = 0.165947E-01 +PKER_RDRYG( 29, 34) = 0.134638E-01 +PKER_RDRYG( 29, 35) = 0.125669E-01 +PKER_RDRYG( 29, 36) = 0.133388E-01 +PKER_RDRYG( 29, 37) = 0.151398E-01 +PKER_RDRYG( 29, 38) = 0.174018E-01 +PKER_RDRYG( 29, 39) = 0.197163E-01 +PKER_RDRYG( 29, 40) = 0.218551E-01 +PKER_RDRYG( 30, 1) = 0.156994E+02 +PKER_RDRYG( 30, 2) = 0.129939E+02 +PKER_RDRYG( 30, 3) = 0.107542E+02 +PKER_RDRYG( 30, 4) = 0.890005E+01 +PKER_RDRYG( 30, 5) = 0.736510E+01 +PKER_RDRYG( 30, 6) = 0.609438E+01 +PKER_RDRYG( 30, 7) = 0.504242E+01 +PKER_RDRYG( 30, 8) = 0.417154E+01 +PKER_RDRYG( 30, 9) = 0.345058E+01 +PKER_RDRYG( 30, 10) = 0.285372E+01 +PKER_RDRYG( 30, 11) = 0.235960E+01 +PKER_RDRYG( 30, 12) = 0.195054E+01 +PKER_RDRYG( 30, 13) = 0.161187E+01 +PKER_RDRYG( 30, 14) = 0.133149E+01 +PKER_RDRYG( 30, 15) = 0.109936E+01 +PKER_RDRYG( 30, 16) = 0.907174E+00 +PKER_RDRYG( 30, 17) = 0.748046E+00 +PKER_RDRYG( 30, 18) = 0.616285E+00 +PKER_RDRYG( 30, 19) = 0.507176E+00 +PKER_RDRYG( 30, 20) = 0.416814E+00 +PKER_RDRYG( 30, 21) = 0.341968E+00 +PKER_RDRYG( 30, 22) = 0.279958E+00 +PKER_RDRYG( 30, 23) = 0.228569E+00 +PKER_RDRYG( 30, 24) = 0.185961E+00 +PKER_RDRYG( 30, 25) = 0.150613E+00 +PKER_RDRYG( 30, 26) = 0.121262E+00 +PKER_RDRYG( 30, 27) = 0.968655E-01 +PKER_RDRYG( 30, 28) = 0.765650E-01 +PKER_RDRYG( 30, 29) = 0.596711E-01 +PKER_RDRYG( 30, 30) = 0.456581E-01 +PKER_RDRYG( 30, 31) = 0.341736E-01 +PKER_RDRYG( 30, 32) = 0.250373E-01 +PKER_RDRYG( 30, 33) = 0.182029E-01 +PKER_RDRYG( 30, 34) = 0.136572E-01 +PKER_RDRYG( 30, 35) = 0.112718E-01 +PKER_RDRYG( 30, 36) = 0.107288E-01 +PKER_RDRYG( 30, 37) = 0.115403E-01 +PKER_RDRYG( 30, 38) = 0.131623E-01 +PKER_RDRYG( 30, 39) = 0.151226E-01 +PKER_RDRYG( 30, 40) = 0.170966E-01 +PKER_RDRYG( 31, 1) = 0.157017E+02 +PKER_RDRYG( 31, 2) = 0.129962E+02 +PKER_RDRYG( 31, 3) = 0.107565E+02 +PKER_RDRYG( 31, 4) = 0.890239E+01 +PKER_RDRYG( 31, 5) = 0.736744E+01 +PKER_RDRYG( 31, 6) = 0.609674E+01 +PKER_RDRYG( 31, 7) = 0.504479E+01 +PKER_RDRYG( 31, 8) = 0.417392E+01 +PKER_RDRYG( 31, 9) = 0.345297E+01 +PKER_RDRYG( 31, 10) = 0.285613E+01 +PKER_RDRYG( 31, 11) = 0.236203E+01 +PKER_RDRYG( 31, 12) = 0.195297E+01 +PKER_RDRYG( 31, 13) = 0.161433E+01 +PKER_RDRYG( 31, 14) = 0.133396E+01 +PKER_RDRYG( 31, 15) = 0.110185E+01 +PKER_RDRYG( 31, 16) = 0.909687E+00 +PKER_RDRYG( 31, 17) = 0.750583E+00 +PKER_RDRYG( 31, 18) = 0.618849E+00 +PKER_RDRYG( 31, 19) = 0.509771E+00 +PKER_RDRYG( 31, 20) = 0.419444E+00 +PKER_RDRYG( 31, 21) = 0.344637E+00 +PKER_RDRYG( 31, 22) = 0.282674E+00 +PKER_RDRYG( 31, 23) = 0.231338E+00 +PKER_RDRYG( 31, 24) = 0.188793E+00 +PKER_RDRYG( 31, 25) = 0.153517E+00 +PKER_RDRYG( 31, 26) = 0.124249E+00 +PKER_RDRYG( 31, 27) = 0.999464E-01 +PKER_RDRYG( 31, 28) = 0.797438E-01 +PKER_RDRYG( 31, 29) = 0.629334E-01 +PKER_RDRYG( 31, 30) = 0.489476E-01 +PKER_RDRYG( 31, 31) = 0.373591E-01 +PKER_RDRYG( 31, 32) = 0.278881E-01 +PKER_RDRYG( 31, 33) = 0.203979E-01 +PKER_RDRYG( 31, 34) = 0.148616E-01 +PKER_RDRYG( 31, 35) = 0.112574E-01 +PKER_RDRYG( 31, 36) = 0.946007E-02 +PKER_RDRYG( 31, 37) = 0.918277E-02 +PKER_RDRYG( 31, 38) = 0.999683E-02 +PKER_RDRYG( 31, 39) = 0.114431E-01 +PKER_RDRYG( 31, 40) = 0.131376E-01 +PKER_RDRYG( 32, 1) = 0.157037E+02 +PKER_RDRYG( 32, 2) = 0.129982E+02 +PKER_RDRYG( 32, 3) = 0.107585E+02 +PKER_RDRYG( 32, 4) = 0.890438E+01 +PKER_RDRYG( 32, 5) = 0.736944E+01 +PKER_RDRYG( 32, 6) = 0.609874E+01 +PKER_RDRYG( 32, 7) = 0.504680E+01 +PKER_RDRYG( 32, 8) = 0.417594E+01 +PKER_RDRYG( 32, 9) = 0.345501E+01 +PKER_RDRYG( 32, 10) = 0.285817E+01 +PKER_RDRYG( 32, 11) = 0.236408E+01 +PKER_RDRYG( 32, 12) = 0.195504E+01 +PKER_RDRYG( 32, 13) = 0.161640E+01 +PKER_RDRYG( 32, 14) = 0.133606E+01 +PKER_RDRYG( 32, 15) = 0.110396E+01 +PKER_RDRYG( 32, 16) = 0.911809E+00 +PKER_RDRYG( 32, 17) = 0.752724E+00 +PKER_RDRYG( 32, 18) = 0.621010E+00 +PKER_RDRYG( 32, 19) = 0.511954E+00 +PKER_RDRYG( 32, 20) = 0.421653E+00 +PKER_RDRYG( 32, 21) = 0.346876E+00 +PKER_RDRYG( 32, 22) = 0.284947E+00 +PKER_RDRYG( 32, 23) = 0.233649E+00 +PKER_RDRYG( 32, 24) = 0.191149E+00 +PKER_RDRYG( 32, 25) = 0.155926E+00 +PKER_RDRYG( 32, 26) = 0.126720E+00 +PKER_RDRYG( 32, 27) = 0.102487E+00 +PKER_RDRYG( 32, 28) = 0.823637E-01 +PKER_RDRYG( 32, 29) = 0.656344E-01 +PKER_RDRYG( 32, 30) = 0.517143E-01 +PKER_RDRYG( 32, 31) = 0.401375E-01 +PKER_RDRYG( 32, 32) = 0.305566E-01 +PKER_RDRYG( 32, 33) = 0.227484E-01 +PKER_RDRYG( 32, 34) = 0.166190E-01 +PKER_RDRYG( 32, 35) = 0.121425E-01 +PKER_RDRYG( 32, 36) = 0.929636E-02 +PKER_RDRYG( 32, 37) = 0.796211E-02 +PKER_RDRYG( 32, 38) = 0.787497E-02 +PKER_RDRYG( 32, 39) = 0.866604E-02 +PKER_RDRYG( 32, 40) = 0.994926E-02 +PKER_RDRYG( 33, 1) = 0.157053E+02 +PKER_RDRYG( 33, 2) = 0.129999E+02 +PKER_RDRYG( 33, 3) = 0.107602E+02 +PKER_RDRYG( 33, 4) = 0.890607E+01 +PKER_RDRYG( 33, 5) = 0.737114E+01 +PKER_RDRYG( 33, 6) = 0.610045E+01 +PKER_RDRYG( 33, 7) = 0.504851E+01 +PKER_RDRYG( 33, 8) = 0.417766E+01 +PKER_RDRYG( 33, 9) = 0.345673E+01 +PKER_RDRYG( 33, 10) = 0.285990E+01 +PKER_RDRYG( 33, 11) = 0.236582E+01 +PKER_RDRYG( 33, 12) = 0.195679E+01 +PKER_RDRYG( 33, 13) = 0.161816E+01 +PKER_RDRYG( 33, 14) = 0.133783E+01 +PKER_RDRYG( 33, 15) = 0.110574E+01 +PKER_RDRYG( 33, 16) = 0.913604E+00 +PKER_RDRYG( 33, 17) = 0.754532E+00 +PKER_RDRYG( 33, 18) = 0.622834E+00 +PKER_RDRYG( 33, 19) = 0.513795E+00 +PKER_RDRYG( 33, 20) = 0.423513E+00 +PKER_RDRYG( 33, 21) = 0.348758E+00 +PKER_RDRYG( 33, 22) = 0.286853E+00 +PKER_RDRYG( 33, 23) = 0.235584E+00 +PKER_RDRYG( 33, 24) = 0.193116E+00 +PKER_RDRYG( 33, 25) = 0.157931E+00 +PKER_RDRYG( 33, 26) = 0.128770E+00 +PKER_RDRYG( 33, 27) = 0.104589E+00 +PKER_RDRYG( 33, 28) = 0.845253E-01 +PKER_RDRYG( 33, 29) = 0.678623E-01 +PKER_RDRYG( 33, 30) = 0.540092E-01 +PKER_RDRYG( 33, 31) = 0.424830E-01 +PKER_RDRYG( 33, 32) = 0.329012E-01 +PKER_RDRYG( 33, 33) = 0.249827E-01 +PKER_RDRYG( 33, 34) = 0.185543E-01 +PKER_RDRYG( 33, 35) = 0.135404E-01 +PKER_RDRYG( 33, 36) = 0.993014E-02 +PKER_RDRYG( 33, 37) = 0.769477E-02 +PKER_RDRYG( 33, 38) = 0.672045E-02 +PKER_RDRYG( 33, 39) = 0.676668E-02 +PKER_RDRYG( 33, 40) = 0.751623E-02 +PKER_RDRYG( 34, 1) = 0.157068E+02 +PKER_RDRYG( 34, 2) = 0.130013E+02 +PKER_RDRYG( 34, 3) = 0.107616E+02 +PKER_RDRYG( 34, 4) = 0.890751E+01 +PKER_RDRYG( 34, 5) = 0.737258E+01 +PKER_RDRYG( 34, 6) = 0.610189E+01 +PKER_RDRYG( 34, 7) = 0.504996E+01 +PKER_RDRYG( 34, 8) = 0.417912E+01 +PKER_RDRYG( 34, 9) = 0.345819E+01 +PKER_RDRYG( 34, 10) = 0.286137E+01 +PKER_RDRYG( 34, 11) = 0.236730E+01 +PKER_RDRYG( 34, 12) = 0.195827E+01 +PKER_RDRYG( 34, 13) = 0.161965E+01 +PKER_RDRYG( 34, 14) = 0.133933E+01 +PKER_RDRYG( 34, 15) = 0.110725E+01 +PKER_RDRYG( 34, 16) = 0.915123E+00 +PKER_RDRYG( 34, 17) = 0.756062E+00 +PKER_RDRYG( 34, 18) = 0.624375E+00 +PKER_RDRYG( 34, 19) = 0.515349E+00 +PKER_RDRYG( 34, 20) = 0.425082E+00 +PKER_RDRYG( 34, 21) = 0.350342E+00 +PKER_RDRYG( 34, 22) = 0.288455E+00 +PKER_RDRYG( 34, 23) = 0.237207E+00 +PKER_RDRYG( 34, 24) = 0.194764E+00 +PKER_RDRYG( 34, 25) = 0.159606E+00 +PKER_RDRYG( 34, 26) = 0.130477E+00 +PKER_RDRYG( 34, 27) = 0.106334E+00 +PKER_RDRYG( 34, 28) = 0.863139E-01 +PKER_RDRYG( 34, 29) = 0.697015E-01 +PKER_RDRYG( 34, 30) = 0.559040E-01 +PKER_RDRYG( 34, 31) = 0.444327E-01 +PKER_RDRYG( 34, 32) = 0.348892E-01 +PKER_RDRYG( 34, 33) = 0.269596E-01 +PKER_RDRYG( 34, 34) = 0.204175E-01 +PKER_RDRYG( 34, 35) = 0.151283E-01 +PKER_RDRYG( 34, 36) = 0.110336E-01 +PKER_RDRYG( 34, 37) = 0.812881E-02 +PKER_RDRYG( 34, 38) = 0.638384E-02 +PKER_RDRYG( 34, 39) = 0.568390E-02 +PKER_RDRYG( 34, 40) = 0.582227E-02 +PKER_RDRYG( 35, 1) = 0.157080E+02 +PKER_RDRYG( 35, 2) = 0.130025E+02 +PKER_RDRYG( 35, 3) = 0.107628E+02 +PKER_RDRYG( 35, 4) = 0.890873E+01 +PKER_RDRYG( 35, 5) = 0.737381E+01 +PKER_RDRYG( 35, 6) = 0.610313E+01 +PKER_RDRYG( 35, 7) = 0.505120E+01 +PKER_RDRYG( 35, 8) = 0.418036E+01 +PKER_RDRYG( 35, 9) = 0.345944E+01 +PKER_RDRYG( 35, 10) = 0.286262E+01 +PKER_RDRYG( 35, 11) = 0.236855E+01 +PKER_RDRYG( 35, 12) = 0.195953E+01 +PKER_RDRYG( 35, 13) = 0.162092E+01 +PKER_RDRYG( 35, 14) = 0.134060E+01 +PKER_RDRYG( 35, 15) = 0.110853E+01 +PKER_RDRYG( 35, 16) = 0.916411E+00 +PKER_RDRYG( 35, 17) = 0.757357E+00 +PKER_RDRYG( 35, 18) = 0.625679E+00 +PKER_RDRYG( 35, 19) = 0.516663E+00 +PKER_RDRYG( 35, 20) = 0.426406E+00 +PKER_RDRYG( 35, 21) = 0.351679E+00 +PKER_RDRYG( 35, 22) = 0.289805E+00 +PKER_RDRYG( 35, 23) = 0.238572E+00 +PKER_RDRYG( 35, 24) = 0.196146E+00 +PKER_RDRYG( 35, 25) = 0.161009E+00 +PKER_RDRYG( 35, 26) = 0.131903E+00 +PKER_RDRYG( 35, 27) = 0.107787E+00 +PKER_RDRYG( 35, 28) = 0.877991E-01 +PKER_RDRYG( 35, 29) = 0.712238E-01 +PKER_RDRYG( 35, 30) = 0.574690E-01 +PKER_RDRYG( 35, 31) = 0.460443E-01 +PKER_RDRYG( 35, 32) = 0.365454E-01 +PKER_RDRYG( 35, 33) = 0.286436E-01 +PKER_RDRYG( 35, 34) = 0.220827E-01 +PKER_RDRYG( 35, 35) = 0.166801E-01 +PKER_RDRYG( 35, 36) = 0.123284E-01 +PKER_RDRYG( 35, 37) = 0.899312E-02 +PKER_RDRYG( 35, 38) = 0.666232E-02 +PKER_RDRYG( 35, 39) = 0.530804E-02 +PKER_RDRYG( 35, 40) = 0.482355E-02 +PKER_RDRYG( 36, 1) = 0.157090E+02 +PKER_RDRYG( 36, 2) = 0.130036E+02 +PKER_RDRYG( 36, 3) = 0.107639E+02 +PKER_RDRYG( 36, 4) = 0.890977E+01 +PKER_RDRYG( 36, 5) = 0.737485E+01 +PKER_RDRYG( 36, 6) = 0.610418E+01 +PKER_RDRYG( 36, 7) = 0.505225E+01 +PKER_RDRYG( 36, 8) = 0.418142E+01 +PKER_RDRYG( 36, 9) = 0.346050E+01 +PKER_RDRYG( 36, 10) = 0.286369E+01 +PKER_RDRYG( 36, 11) = 0.236962E+01 +PKER_RDRYG( 36, 12) = 0.196060E+01 +PKER_RDRYG( 36, 13) = 0.162200E+01 +PKER_RDRYG( 36, 14) = 0.134168E+01 +PKER_RDRYG( 36, 15) = 0.110962E+01 +PKER_RDRYG( 36, 16) = 0.917502E+00 +PKER_RDRYG( 36, 17) = 0.758455E+00 +PKER_RDRYG( 36, 18) = 0.626784E+00 +PKER_RDRYG( 36, 19) = 0.517775E+00 +PKER_RDRYG( 36, 20) = 0.427526E+00 +PKER_RDRYG( 36, 21) = 0.352807E+00 +PKER_RDRYG( 36, 22) = 0.290944E+00 +PKER_RDRYG( 36, 23) = 0.239723E+00 +PKER_RDRYG( 36, 24) = 0.197309E+00 +PKER_RDRYG( 36, 25) = 0.162187E+00 +PKER_RDRYG( 36, 26) = 0.133098E+00 +PKER_RDRYG( 36, 27) = 0.109002E+00 +PKER_RDRYG( 36, 28) = 0.890365E-01 +PKER_RDRYG( 36, 29) = 0.724882E-01 +PKER_RDRYG( 36, 30) = 0.587648E-01 +PKER_RDRYG( 36, 31) = 0.473761E-01 +PKER_RDRYG( 36, 32) = 0.379160E-01 +PKER_RDRYG( 36, 33) = 0.300505E-01 +PKER_RDRYG( 36, 34) = 0.235088E-01 +PKER_RDRYG( 36, 35) = 0.180811E-01 +PKER_RDRYG( 36, 36) = 0.136215E-01 +PKER_RDRYG( 36, 37) = 0.100480E-01 +PKER_RDRYG( 36, 38) = 0.733183E-02 +PKER_RDRYG( 36, 39) = 0.546978E-02 +PKER_RDRYG( 36, 40) = 0.442459E-02 +PKER_RDRYG( 37, 1) = 0.157099E+02 +PKER_RDRYG( 37, 2) = 0.130045E+02 +PKER_RDRYG( 37, 3) = 0.107648E+02 +PKER_RDRYG( 37, 4) = 0.891066E+01 +PKER_RDRYG( 37, 5) = 0.737574E+01 +PKER_RDRYG( 37, 6) = 0.610507E+01 +PKER_RDRYG( 37, 7) = 0.505315E+01 +PKER_RDRYG( 37, 8) = 0.418231E+01 +PKER_RDRYG( 37, 9) = 0.346140E+01 +PKER_RDRYG( 37, 10) = 0.286459E+01 +PKER_RDRYG( 37, 11) = 0.237053E+01 +PKER_RDRYG( 37, 12) = 0.196151E+01 +PKER_RDRYG( 37, 13) = 0.162291E+01 +PKER_RDRYG( 37, 14) = 0.134260E+01 +PKER_RDRYG( 37, 15) = 0.111054E+01 +PKER_RDRYG( 37, 16) = 0.918429E+00 +PKER_RDRYG( 37, 17) = 0.759387E+00 +PKER_RDRYG( 37, 18) = 0.627720E+00 +PKER_RDRYG( 37, 19) = 0.518717E+00 +PKER_RDRYG( 37, 20) = 0.428474E+00 +PKER_RDRYG( 37, 21) = 0.353762E+00 +PKER_RDRYG( 37, 22) = 0.291907E+00 +PKER_RDRYG( 37, 23) = 0.240693E+00 +PKER_RDRYG( 37, 24) = 0.198289E+00 +PKER_RDRYG( 37, 25) = 0.163177E+00 +PKER_RDRYG( 37, 26) = 0.134101E+00 +PKER_RDRYG( 37, 27) = 0.110019E+00 +PKER_RDRYG( 37, 28) = 0.900708E-01 +PKER_RDRYG( 37, 29) = 0.735419E-01 +PKER_RDRYG( 37, 30) = 0.598414E-01 +PKER_RDRYG( 37, 31) = 0.484792E-01 +PKER_RDRYG( 37, 32) = 0.390495E-01 +PKER_RDRYG( 37, 33) = 0.312163E-01 +PKER_RDRYG( 37, 34) = 0.247033E-01 +PKER_RDRYG( 37, 35) = 0.192878E-01 +PKER_RDRYG( 37, 36) = 0.147988E-01 +PKER_RDRYG( 37, 37) = 0.111191E-01 +PKER_RDRYG( 37, 38) = 0.818617E-02 +PKER_RDRYG( 37, 39) = 0.598058E-02 +PKER_RDRYG( 37, 40) = 0.449521E-02 +PKER_RDRYG( 38, 1) = 0.157107E+02 +PKER_RDRYG( 38, 2) = 0.130052E+02 +PKER_RDRYG( 38, 3) = 0.107655E+02 +PKER_RDRYG( 38, 4) = 0.891142E+01 +PKER_RDRYG( 38, 5) = 0.737650E+01 +PKER_RDRYG( 38, 6) = 0.610583E+01 +PKER_RDRYG( 38, 7) = 0.505391E+01 +PKER_RDRYG( 38, 8) = 0.418308E+01 +PKER_RDRYG( 38, 9) = 0.346217E+01 +PKER_RDRYG( 38, 10) = 0.286536E+01 +PKER_RDRYG( 38, 11) = 0.237130E+01 +PKER_RDRYG( 38, 12) = 0.196229E+01 +PKER_RDRYG( 38, 13) = 0.162369E+01 +PKER_RDRYG( 38, 14) = 0.134338E+01 +PKER_RDRYG( 38, 15) = 0.111132E+01 +PKER_RDRYG( 38, 16) = 0.919216E+00 +PKER_RDRYG( 38, 17) = 0.760177E+00 +PKER_RDRYG( 38, 18) = 0.628515E+00 +PKER_RDRYG( 38, 19) = 0.519516E+00 +PKER_RDRYG( 38, 20) = 0.429278E+00 +PKER_RDRYG( 38, 21) = 0.354571E+00 +PKER_RDRYG( 38, 22) = 0.292721E+00 +PKER_RDRYG( 38, 23) = 0.241514E+00 +PKER_RDRYG( 38, 24) = 0.199117E+00 +PKER_RDRYG( 38, 25) = 0.164013E+00 +PKER_RDRYG( 38, 26) = 0.134945E+00 +PKER_RDRYG( 38, 27) = 0.110874E+00 +PKER_RDRYG( 38, 28) = 0.909377E-01 +PKER_RDRYG( 38, 29) = 0.744229E-01 +PKER_RDRYG( 38, 30) = 0.607388E-01 +PKER_RDRYG( 38, 31) = 0.493960E-01 +PKER_RDRYG( 38, 32) = 0.399888E-01 +PKER_RDRYG( 38, 33) = 0.321810E-01 +PKER_RDRYG( 38, 34) = 0.256949E-01 +PKER_RDRYG( 38, 35) = 0.203021E-01 +PKER_RDRYG( 38, 36) = 0.158193E-01 +PKER_RDRYG( 38, 37) = 0.121074E-01 +PKER_RDRYG( 38, 38) = 0.907255E-02 +PKER_RDRYG( 38, 39) = 0.666890E-02 +PKER_RDRYG( 38, 40) = 0.488099E-02 +PKER_RDRYG( 39, 1) = 0.157113E+02 +PKER_RDRYG( 39, 2) = 0.130059E+02 +PKER_RDRYG( 39, 3) = 0.107662E+02 +PKER_RDRYG( 39, 4) = 0.891206E+01 +PKER_RDRYG( 39, 5) = 0.737715E+01 +PKER_RDRYG( 39, 6) = 0.610648E+01 +PKER_RDRYG( 39, 7) = 0.505456E+01 +PKER_RDRYG( 39, 8) = 0.418373E+01 +PKER_RDRYG( 39, 9) = 0.346282E+01 +PKER_RDRYG( 39, 10) = 0.286602E+01 +PKER_RDRYG( 39, 11) = 0.237195E+01 +PKER_RDRYG( 39, 12) = 0.196295E+01 +PKER_RDRYG( 39, 13) = 0.162435E+01 +PKER_RDRYG( 39, 14) = 0.134404E+01 +PKER_RDRYG( 39, 15) = 0.111199E+01 +PKER_RDRYG( 39, 16) = 0.919884E+00 +PKER_RDRYG( 39, 17) = 0.760849E+00 +PKER_RDRYG( 39, 18) = 0.629189E+00 +PKER_RDRYG( 39, 19) = 0.520193E+00 +PKER_RDRYG( 39, 20) = 0.429959E+00 +PKER_RDRYG( 39, 21) = 0.355256E+00 +PKER_RDRYG( 39, 22) = 0.293410E+00 +PKER_RDRYG( 39, 23) = 0.242208E+00 +PKER_RDRYG( 39, 24) = 0.199816E+00 +PKER_RDRYG( 39, 25) = 0.164718E+00 +PKER_RDRYG( 39, 26) = 0.135657E+00 +PKER_RDRYG( 39, 27) = 0.111594E+00 +PKER_RDRYG( 39, 28) = 0.916661E-01 +PKER_RDRYG( 39, 29) = 0.751615E-01 +PKER_RDRYG( 39, 30) = 0.614894E-01 +PKER_RDRYG( 39, 31) = 0.501605E-01 +PKER_RDRYG( 39, 32) = 0.407696E-01 +PKER_RDRYG( 39, 33) = 0.329808E-01 +PKER_RDRYG( 39, 34) = 0.265161E-01 +PKER_RDRYG( 39, 35) = 0.211454E-01 +PKER_RDRYG( 39, 36) = 0.166802E-01 +PKER_RDRYG( 39, 37) = 0.129700E-01 +PKER_RDRYG( 39, 38) = 0.990158E-02 +PKER_RDRYG( 39, 39) = 0.740159E-02 +PKER_RDRYG( 39, 40) = 0.543265E-02 +PKER_RDRYG( 40, 1) = 0.157118E+02 +PKER_RDRYG( 40, 2) = 0.130064E+02 +PKER_RDRYG( 40, 3) = 0.107667E+02 +PKER_RDRYG( 40, 4) = 0.891261E+01 +PKER_RDRYG( 40, 5) = 0.737770E+01 +PKER_RDRYG( 40, 6) = 0.610703E+01 +PKER_RDRYG( 40, 7) = 0.505511E+01 +PKER_RDRYG( 40, 8) = 0.418429E+01 +PKER_RDRYG( 40, 9) = 0.346338E+01 +PKER_RDRYG( 40, 10) = 0.286657E+01 +PKER_RDRYG( 40, 11) = 0.237251E+01 +PKER_RDRYG( 40, 12) = 0.196351E+01 +PKER_RDRYG( 40, 13) = 0.162491E+01 +PKER_RDRYG( 40, 14) = 0.134461E+01 +PKER_RDRYG( 40, 15) = 0.111256E+01 +PKER_RDRYG( 40, 16) = 0.920453E+00 +PKER_RDRYG( 40, 17) = 0.761419E+00 +PKER_RDRYG( 40, 18) = 0.629762E+00 +PKER_RDRYG( 40, 19) = 0.520769E+00 +PKER_RDRYG( 40, 20) = 0.430537E+00 +PKER_RDRYG( 40, 21) = 0.355837E+00 +PKER_RDRYG( 40, 22) = 0.293995E+00 +PKER_RDRYG( 40, 23) = 0.242796E+00 +PKER_RDRYG( 40, 24) = 0.200408E+00 +PKER_RDRYG( 40, 25) = 0.165315E+00 +PKER_RDRYG( 40, 26) = 0.136259E+00 +PKER_RDRYG( 40, 27) = 0.112201E+00 +PKER_RDRYG( 40, 28) = 0.922796E-01 +PKER_RDRYG( 40, 29) = 0.757823E-01 +PKER_RDRYG( 40, 30) = 0.621188E-01 +PKER_RDRYG( 40, 31) = 0.507999E-01 +PKER_RDRYG( 40, 32) = 0.414208E-01 +PKER_RDRYG( 40, 33) = 0.336459E-01 +PKER_RDRYG( 40, 34) = 0.271972E-01 +PKER_RDRYG( 40, 35) = 0.218444E-01 +PKER_RDRYG( 40, 36) = 0.173974E-01 +PKER_RDRYG( 40, 37) = 0.137005E-01 +PKER_RDRYG( 40, 38) = 0.106300E-01 +PKER_RDRYG( 40, 39) = 0.809434E-02 +PKER_RDRYG( 40, 40) = 0.603544E-02 +END IF +! +END SUBROUTINE LIMA_READ_XKER_RDRYG diff --git a/src/mesonh/micro/lima_read_xker_sdryg.f90 b/src/mesonh/micro/lima_read_xker_sdryg.f90 new file mode 100644 index 000000000..b47dc11a0 --- /dev/null +++ b/src/mesonh/micro/lima_read_xker_sdryg.f90 @@ -0,0 +1,3337 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 init 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ########################### + MODULE MODI_LIMA_READ_XKER_SDRYG +! ########################### +! +INTERFACE + SUBROUTINE LIMA_READ_XKER_SDRYG (KDRYLBDAG,KDRYLBDAS,KND, & + PALPHAG,PNUG,PALPHAS,PNUS,PEGS,PBS,PCG,PDG,PCS,PDS, & + PDRYLBDAG_MAX,PDRYLBDAS_MAX,PDRYLBDAG_MIN,PDRYLBDAS_MIN, & + PFDINFTY,PKER_SDRYG ) +! +INTEGER, INTENT(OUT) :: KND,KDRYLBDAG,KDRYLBDAS +REAL, INTENT(OUT) :: PALPHAG +REAL, INTENT(OUT) :: PNUG +REAL, INTENT(OUT) :: PALPHAS +REAL, INTENT(OUT) :: PNUS +REAL, INTENT(OUT) :: PEGS +REAL, INTENT(OUT) :: PBS +REAL, INTENT(OUT) :: PCG +REAL, INTENT(OUT) :: PDG +REAL, INTENT(OUT) :: PCS +REAL, INTENT(OUT) :: PDS +REAL, INTENT(OUT) :: PDRYLBDAG_MAX +REAL, INTENT(OUT) :: PDRYLBDAS_MAX +REAL, INTENT(OUT) :: PDRYLBDAG_MIN +REAL, INTENT(OUT) :: PDRYLBDAS_MIN +REAL, INTENT(OUT) :: PFDINFTY +REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PKER_SDRYG +! +END SUBROUTINE LIMA_READ_XKER_SDRYG +! +END INTERFACE +! +END MODULE MODI_LIMA_READ_XKER_SDRYG +! ######################################################################## + SUBROUTINE LIMA_READ_XKER_SDRYG (KDRYLBDAG,KDRYLBDAS,KND, & + PALPHAG,PNUG,PALPHAS,PNUS,PEGS,PBS,PCG,PDG,PCS,PDS, & + PDRYLBDAG_MAX,PDRYLBDAS_MAX,PDRYLBDAG_MIN,PDRYLBDAS_MIN, & + PFDINFTY,PKER_SDRYG ) +! ######################################################################## +! +!!**** * * - initialize the kernels for the snow-graupel dry growth process +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to initialize the kernels PKER_SDRYG +!! prepared from a previous run of the routine INI_RAIN_ICE. The reading +!! of the kernels is optional after checking for the dimensions of the +!! arrays. +!! +!!** METHOD +!! ------ +!! +!! +!! EXTERNAL +!! -------- +!! None +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! Book2 of documentation ( routine READ_XKER_SDRYG ) +!! +!! AUTHOR +!! ------ +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original 09/04/96 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +!* 0.2 Declarations of local variables : +! +! +INTEGER, INTENT(OUT) :: KND,KDRYLBDAG,KDRYLBDAS +REAL, INTENT(OUT) :: PALPHAG +REAL, INTENT(OUT) :: PNUG +REAL, INTENT(OUT) :: PALPHAS +REAL, INTENT(OUT) :: PNUS +REAL, INTENT(OUT) :: PEGS +REAL, INTENT(OUT) :: PBS +REAL, INTENT(OUT) :: PCG +REAL, INTENT(OUT) :: PDG +REAL, INTENT(OUT) :: PCS +REAL, INTENT(OUT) :: PDS +REAL, INTENT(OUT) :: PDRYLBDAG_MAX +REAL, INTENT(OUT) :: PDRYLBDAS_MAX +REAL, INTENT(OUT) :: PDRYLBDAG_MIN +REAL, INTENT(OUT) :: PDRYLBDAS_MIN +REAL, INTENT(OUT) :: PFDINFTY +REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PKER_SDRYG +! +! ################################################################### +! #INSERT HERE THE OUTPUT OF INI_RAIN_ICE IF THE KERNELS ARE UPDATED# +! ################################################################### +! +KND= 50 +KDRYLBDAG= 40 +KDRYLBDAS= 80 +PALPHAG= 0.100000E+01 +PNUG= 0.100000E+01 +PALPHAS= 0.100000E+01 +PNUS= 0.100000E+01 +PEGS= 0.100000E+01 +PBS= 0.190000E+01 +PCG= 0.122000E+03 +PDG= 0.660000E+00 +PCS= 0.500000E+01 +PDS= 0.270000E+00 +PDRYLBDAG_MAX= 0.100000E+08 +PDRYLBDAS_MAX= 0.250000E+10 +PDRYLBDAG_MIN= 0.100000E+04 +PDRYLBDAS_MIN= 0.250000E+02 +PFDINFTY= 0.200000E+02 +! +IF( PRESENT(PKER_SDRYG) ) THEN +PKER_SDRYG( 1, 1) = 0.181263E+01 +PKER_SDRYG( 1, 2) = 0.163147E+01 +PKER_SDRYG( 1, 3) = 0.146558E+01 +PKER_SDRYG( 1, 4) = 0.131501E+01 +PKER_SDRYG( 1, 5) = 0.117971E+01 +PKER_SDRYG( 1, 6) = 0.105940E+01 +PKER_SDRYG( 1, 7) = 0.954664E+00 +PKER_SDRYG( 1, 8) = 0.865241E+00 +PKER_SDRYG( 1, 9) = 0.791190E+00 +PKER_SDRYG( 1, 10) = 0.733135E+00 +PKER_SDRYG( 1, 11) = 0.691332E+00 +PKER_SDRYG( 1, 12) = 0.666135E+00 +PKER_SDRYG( 1, 13) = 0.658669E+00 +PKER_SDRYG( 1, 14) = 0.669468E+00 +PKER_SDRYG( 1, 15) = 0.699407E+00 +PKER_SDRYG( 1, 16) = 0.749020E+00 +PKER_SDRYG( 1, 17) = 0.817882E+00 +PKER_SDRYG( 1, 18) = 0.905102E+00 +PKER_SDRYG( 1, 19) = 0.100805E+01 +PKER_SDRYG( 1, 20) = 0.112208E+01 +PKER_SDRYG( 1, 21) = 0.124139E+01 +PKER_SDRYG( 1, 22) = 0.136056E+01 +PKER_SDRYG( 1, 23) = 0.147535E+01 +PKER_SDRYG( 1, 24) = 0.158271E+01 +PKER_SDRYG( 1, 25) = 0.168072E+01 +PKER_SDRYG( 1, 26) = 0.176838E+01 +PKER_SDRYG( 1, 27) = 0.184560E+01 +PKER_SDRYG( 1, 28) = 0.191298E+01 +PKER_SDRYG( 1, 29) = 0.197156E+01 +PKER_SDRYG( 1, 30) = 0.202257E+01 +PKER_SDRYG( 1, 31) = 0.206716E+01 +PKER_SDRYG( 1, 32) = 0.210638E+01 +PKER_SDRYG( 1, 33) = 0.214108E+01 +PKER_SDRYG( 1, 34) = 0.217197E+01 +PKER_SDRYG( 1, 35) = 0.219964E+01 +PKER_SDRYG( 1, 36) = 0.222456E+01 +PKER_SDRYG( 1, 37) = 0.224714E+01 +PKER_SDRYG( 1, 38) = 0.226768E+01 +PKER_SDRYG( 1, 39) = 0.228645E+01 +PKER_SDRYG( 1, 40) = 0.230366E+01 +PKER_SDRYG( 1, 41) = 0.231950E+01 +PKER_SDRYG( 1, 42) = 0.233413E+01 +PKER_SDRYG( 1, 43) = 0.234766E+01 +PKER_SDRYG( 1, 44) = 0.236020E+01 +PKER_SDRYG( 1, 45) = 0.237186E+01 +PKER_SDRYG( 1, 46) = 0.238271E+01 +PKER_SDRYG( 1, 47) = 0.239281E+01 +PKER_SDRYG( 1, 48) = 0.240224E+01 +PKER_SDRYG( 1, 49) = 0.241105E+01 +PKER_SDRYG( 1, 50) = 0.241928E+01 +PKER_SDRYG( 1, 51) = 0.242698E+01 +PKER_SDRYG( 1, 52) = 0.243418E+01 +PKER_SDRYG( 1, 53) = 0.244092E+01 +PKER_SDRYG( 1, 54) = 0.244724E+01 +PKER_SDRYG( 1, 55) = 0.245316E+01 +PKER_SDRYG( 1, 56) = 0.245871E+01 +PKER_SDRYG( 1, 57) = 0.246392E+01 +PKER_SDRYG( 1, 58) = 0.246880E+01 +PKER_SDRYG( 1, 59) = 0.247338E+01 +PKER_SDRYG( 1, 60) = 0.247767E+01 +PKER_SDRYG( 1, 61) = 0.248171E+01 +PKER_SDRYG( 1, 62) = 0.248549E+01 +PKER_SDRYG( 1, 63) = 0.248904E+01 +PKER_SDRYG( 1, 64) = 0.249237E+01 +PKER_SDRYG( 1, 65) = 0.249550E+01 +PKER_SDRYG( 1, 66) = 0.249843E+01 +PKER_SDRYG( 1, 67) = 0.250119E+01 +PKER_SDRYG( 1, 68) = 0.250377E+01 +PKER_SDRYG( 1, 69) = 0.250620E+01 +PKER_SDRYG( 1, 70) = 0.250848E+01 +PKER_SDRYG( 1, 71) = 0.251062E+01 +PKER_SDRYG( 1, 72) = 0.251263E+01 +PKER_SDRYG( 1, 73) = 0.251452E+01 +PKER_SDRYG( 1, 74) = 0.251629E+01 +PKER_SDRYG( 1, 75) = 0.251796E+01 +PKER_SDRYG( 1, 76) = 0.251952E+01 +PKER_SDRYG( 1, 77) = 0.252099E+01 +PKER_SDRYG( 1, 78) = 0.252236E+01 +PKER_SDRYG( 1, 79) = 0.252366E+01 +PKER_SDRYG( 1, 80) = 0.252487E+01 +PKER_SDRYG( 2, 1) = 0.199024E+01 +PKER_SDRYG( 2, 2) = 0.180156E+01 +PKER_SDRYG( 2, 3) = 0.162637E+01 +PKER_SDRYG( 2, 4) = 0.146459E+01 +PKER_SDRYG( 2, 5) = 0.131591E+01 +PKER_SDRYG( 2, 6) = 0.118046E+01 +PKER_SDRYG( 2, 7) = 0.105818E+01 +PKER_SDRYG( 2, 8) = 0.949189E+00 +PKER_SDRYG( 2, 9) = 0.853560E+00 +PKER_SDRYG( 2, 10) = 0.771539E+00 +PKER_SDRYG( 2, 11) = 0.703653E+00 +PKER_SDRYG( 2, 12) = 0.650109E+00 +PKER_SDRYG( 2, 13) = 0.611685E+00 +PKER_SDRYG( 2, 14) = 0.589133E+00 +PKER_SDRYG( 2, 15) = 0.583308E+00 +PKER_SDRYG( 2, 16) = 0.595133E+00 +PKER_SDRYG( 2, 17) = 0.625162E+00 +PKER_SDRYG( 2, 18) = 0.673359E+00 +PKER_SDRYG( 2, 19) = 0.738907E+00 +PKER_SDRYG( 2, 20) = 0.819564E+00 +PKER_SDRYG( 2, 21) = 0.912202E+00 +PKER_SDRYG( 2, 22) = 0.101189E+01 +PKER_SDRYG( 2, 23) = 0.111334E+01 +PKER_SDRYG( 2, 24) = 0.121202E+01 +PKER_SDRYG( 2, 25) = 0.130478E+01 +PKER_SDRYG( 2, 26) = 0.138982E+01 +PKER_SDRYG( 2, 27) = 0.146651E+01 +PKER_SDRYG( 2, 28) = 0.153473E+01 +PKER_SDRYG( 2, 29) = 0.159487E+01 +PKER_SDRYG( 2, 30) = 0.164760E+01 +PKER_SDRYG( 2, 31) = 0.169376E+01 +PKER_SDRYG( 2, 32) = 0.173428E+01 +PKER_SDRYG( 2, 33) = 0.177003E+01 +PKER_SDRYG( 2, 34) = 0.180176E+01 +PKER_SDRYG( 2, 35) = 0.183010E+01 +PKER_SDRYG( 2, 36) = 0.185555E+01 +PKER_SDRYG( 2, 37) = 0.187853E+01 +PKER_SDRYG( 2, 38) = 0.189939E+01 +PKER_SDRYG( 2, 39) = 0.191841E+01 +PKER_SDRYG( 2, 40) = 0.193583E+01 +PKER_SDRYG( 2, 41) = 0.195183E+01 +PKER_SDRYG( 2, 42) = 0.196657E+01 +PKER_SDRYG( 2, 43) = 0.198020E+01 +PKER_SDRYG( 2, 44) = 0.199282E+01 +PKER_SDRYG( 2, 45) = 0.200454E+01 +PKER_SDRYG( 2, 46) = 0.201543E+01 +PKER_SDRYG( 2, 47) = 0.202557E+01 +PKER_SDRYG( 2, 48) = 0.203503E+01 +PKER_SDRYG( 2, 49) = 0.204386E+01 +PKER_SDRYG( 2, 50) = 0.205211E+01 +PKER_SDRYG( 2, 51) = 0.205982E+01 +PKER_SDRYG( 2, 52) = 0.206703E+01 +PKER_SDRYG( 2, 53) = 0.207379E+01 +PKER_SDRYG( 2, 54) = 0.208011E+01 +PKER_SDRYG( 2, 55) = 0.208604E+01 +PKER_SDRYG( 2, 56) = 0.209159E+01 +PKER_SDRYG( 2, 57) = 0.209680E+01 +PKER_SDRYG( 2, 58) = 0.210169E+01 +PKER_SDRYG( 2, 59) = 0.210627E+01 +PKER_SDRYG( 2, 60) = 0.211056E+01 +PKER_SDRYG( 2, 61) = 0.211460E+01 +PKER_SDRYG( 2, 62) = 0.211838E+01 +PKER_SDRYG( 2, 63) = 0.212193E+01 +PKER_SDRYG( 2, 64) = 0.212526E+01 +PKER_SDRYG( 2, 65) = 0.212839E+01 +PKER_SDRYG( 2, 66) = 0.213133E+01 +PKER_SDRYG( 2, 67) = 0.213408E+01 +PKER_SDRYG( 2, 68) = 0.213667E+01 +PKER_SDRYG( 2, 69) = 0.213910E+01 +PKER_SDRYG( 2, 70) = 0.214138E+01 +PKER_SDRYG( 2, 71) = 0.214352E+01 +PKER_SDRYG( 2, 72) = 0.214553E+01 +PKER_SDRYG( 2, 73) = 0.214742E+01 +PKER_SDRYG( 2, 74) = 0.214919E+01 +PKER_SDRYG( 2, 75) = 0.215085E+01 +PKER_SDRYG( 2, 76) = 0.215242E+01 +PKER_SDRYG( 2, 77) = 0.215388E+01 +PKER_SDRYG( 2, 78) = 0.215526E+01 +PKER_SDRYG( 2, 79) = 0.215655E+01 +PKER_SDRYG( 2, 80) = 0.215777E+01 +PKER_SDRYG( 3, 1) = 0.215301E+01 +PKER_SDRYG( 3, 2) = 0.196106E+01 +PKER_SDRYG( 3, 3) = 0.178154E+01 +PKER_SDRYG( 3, 4) = 0.161399E+01 +PKER_SDRYG( 3, 5) = 0.145810E+01 +PKER_SDRYG( 3, 6) = 0.131365E+01 +PKER_SDRYG( 3, 7) = 0.118061E+01 +PKER_SDRYG( 3, 8) = 0.105881E+01 +PKER_SDRYG( 3, 9) = 0.948427E+00 +PKER_SDRYG( 3, 10) = 0.849613E+00 +PKER_SDRYG( 3, 11) = 0.762396E+00 +PKER_SDRYG( 3, 12) = 0.687541E+00 +PKER_SDRYG( 3, 13) = 0.625331E+00 +PKER_SDRYG( 3, 14) = 0.576279E+00 +PKER_SDRYG( 3, 15) = 0.541413E+00 +PKER_SDRYG( 3, 16) = 0.521621E+00 +PKER_SDRYG( 3, 17) = 0.517675E+00 +PKER_SDRYG( 3, 18) = 0.530574E+00 +PKER_SDRYG( 3, 19) = 0.560443E+00 +PKER_SDRYG( 3, 20) = 0.606854E+00 +PKER_SDRYG( 3, 21) = 0.668028E+00 +PKER_SDRYG( 3, 22) = 0.741035E+00 +PKER_SDRYG( 3, 23) = 0.822187E+00 +PKER_SDRYG( 3, 24) = 0.907057E+00 +PKER_SDRYG( 3, 25) = 0.991322E+00 +PKER_SDRYG( 3, 26) = 0.107147E+01 +PKER_SDRYG( 3, 27) = 0.114544E+01 +PKER_SDRYG( 3, 28) = 0.121245E+01 +PKER_SDRYG( 3, 29) = 0.127245E+01 +PKER_SDRYG( 3, 30) = 0.132580E+01 +PKER_SDRYG( 3, 31) = 0.137302E+01 +PKER_SDRYG( 3, 32) = 0.141473E+01 +PKER_SDRYG( 3, 33) = 0.145157E+01 +PKER_SDRYG( 3, 34) = 0.148421E+01 +PKER_SDRYG( 3, 35) = 0.151328E+01 +PKER_SDRYG( 3, 36) = 0.153931E+01 +PKER_SDRYG( 3, 37) = 0.156275E+01 +PKER_SDRYG( 3, 38) = 0.158397E+01 +PKER_SDRYG( 3, 39) = 0.160327E+01 +PKER_SDRYG( 3, 40) = 0.162090E+01 +PKER_SDRYG( 3, 41) = 0.163707E+01 +PKER_SDRYG( 3, 42) = 0.165195E+01 +PKER_SDRYG( 3, 43) = 0.166569E+01 +PKER_SDRYG( 3, 44) = 0.167839E+01 +PKER_SDRYG( 3, 45) = 0.169017E+01 +PKER_SDRYG( 3, 46) = 0.170112E+01 +PKER_SDRYG( 3, 47) = 0.171130E+01 +PKER_SDRYG( 3, 48) = 0.172079E+01 +PKER_SDRYG( 3, 49) = 0.172965E+01 +PKER_SDRYG( 3, 50) = 0.173791E+01 +PKER_SDRYG( 3, 51) = 0.174564E+01 +PKER_SDRYG( 3, 52) = 0.175287E+01 +PKER_SDRYG( 3, 53) = 0.175963E+01 +PKER_SDRYG( 3, 54) = 0.176596E+01 +PKER_SDRYG( 3, 55) = 0.177190E+01 +PKER_SDRYG( 3, 56) = 0.177746E+01 +PKER_SDRYG( 3, 57) = 0.178267E+01 +PKER_SDRYG( 3, 58) = 0.178755E+01 +PKER_SDRYG( 3, 59) = 0.179214E+01 +PKER_SDRYG( 3, 60) = 0.179644E+01 +PKER_SDRYG( 3, 61) = 0.180047E+01 +PKER_SDRYG( 3, 62) = 0.180425E+01 +PKER_SDRYG( 3, 63) = 0.180781E+01 +PKER_SDRYG( 3, 64) = 0.181114E+01 +PKER_SDRYG( 3, 65) = 0.181427E+01 +PKER_SDRYG( 3, 66) = 0.181720E+01 +PKER_SDRYG( 3, 67) = 0.181996E+01 +PKER_SDRYG( 3, 68) = 0.182255E+01 +PKER_SDRYG( 3, 69) = 0.182498E+01 +PKER_SDRYG( 3, 70) = 0.182726E+01 +PKER_SDRYG( 3, 71) = 0.182940E+01 +PKER_SDRYG( 3, 72) = 0.183141E+01 +PKER_SDRYG( 3, 73) = 0.183330E+01 +PKER_SDRYG( 3, 74) = 0.183507E+01 +PKER_SDRYG( 3, 75) = 0.183673E+01 +PKER_SDRYG( 3, 76) = 0.183829E+01 +PKER_SDRYG( 3, 77) = 0.183976E+01 +PKER_SDRYG( 3, 78) = 0.184114E+01 +PKER_SDRYG( 3, 79) = 0.184243E+01 +PKER_SDRYG( 3, 80) = 0.184365E+01 +PKER_SDRYG( 4, 1) = 0.229654E+01 +PKER_SDRYG( 4, 2) = 0.210356E+01 +PKER_SDRYG( 4, 3) = 0.192245E+01 +PKER_SDRYG( 4, 4) = 0.175260E+01 +PKER_SDRYG( 4, 5) = 0.159350E+01 +PKER_SDRYG( 4, 6) = 0.144476E+01 +PKER_SDRYG( 4, 7) = 0.130608E+01 +PKER_SDRYG( 4, 8) = 0.117720E+01 +PKER_SDRYG( 4, 9) = 0.105807E+01 +PKER_SDRYG( 4, 10) = 0.948604E+00 +PKER_SDRYG( 4, 11) = 0.849002E+00 +PKER_SDRYG( 4, 12) = 0.759416E+00 +PKER_SDRYG( 4, 13) = 0.680260E+00 +PKER_SDRYG( 4, 14) = 0.611882E+00 +PKER_SDRYG( 4, 15) = 0.554963E+00 +PKER_SDRYG( 4, 16) = 0.510479E+00 +PKER_SDRYG( 4, 17) = 0.479128E+00 +PKER_SDRYG( 4, 18) = 0.462033E+00 +PKER_SDRYG( 4, 19) = 0.460154E+00 +PKER_SDRYG( 4, 20) = 0.473966E+00 +PKER_SDRYG( 4, 21) = 0.503313E+00 +PKER_SDRYG( 4, 22) = 0.547021E+00 +PKER_SDRYG( 4, 23) = 0.602691E+00 +PKER_SDRYG( 4, 24) = 0.667130E+00 +PKER_SDRYG( 4, 25) = 0.736445E+00 +PKER_SDRYG( 4, 26) = 0.807101E+00 +PKER_SDRYG( 4, 27) = 0.875737E+00 +PKER_SDRYG( 4, 28) = 0.940003E+00 +PKER_SDRYG( 4, 29) = 0.998698E+00 +PKER_SDRYG( 4, 30) = 0.105152E+01 +PKER_SDRYG( 4, 31) = 0.109873E+01 +PKER_SDRYG( 4, 32) = 0.114082E+01 +PKER_SDRYG( 4, 33) = 0.117832E+01 +PKER_SDRYG( 4, 34) = 0.121173E+01 +PKER_SDRYG( 4, 35) = 0.124152E+01 +PKER_SDRYG( 4, 36) = 0.126818E+01 +PKER_SDRYG( 4, 37) = 0.129212E+01 +PKER_SDRYG( 4, 38) = 0.131373E+01 +PKER_SDRYG( 4, 39) = 0.133335E+01 +PKER_SDRYG( 4, 40) = 0.135123E+01 +PKER_SDRYG( 4, 41) = 0.136759E+01 +PKER_SDRYG( 4, 42) = 0.138262E+01 +PKER_SDRYG( 4, 43) = 0.139647E+01 +PKER_SDRYG( 4, 44) = 0.140927E+01 +PKER_SDRYG( 4, 45) = 0.142112E+01 +PKER_SDRYG( 4, 46) = 0.143212E+01 +PKER_SDRYG( 4, 47) = 0.144235E+01 +PKER_SDRYG( 4, 48) = 0.145188E+01 +PKER_SDRYG( 4, 49) = 0.146076E+01 +PKER_SDRYG( 4, 50) = 0.146905E+01 +PKER_SDRYG( 4, 51) = 0.147679E+01 +PKER_SDRYG( 4, 52) = 0.148403E+01 +PKER_SDRYG( 4, 53) = 0.149081E+01 +PKER_SDRYG( 4, 54) = 0.149715E+01 +PKER_SDRYG( 4, 55) = 0.150309E+01 +PKER_SDRYG( 4, 56) = 0.150865E+01 +PKER_SDRYG( 4, 57) = 0.151387E+01 +PKER_SDRYG( 4, 58) = 0.151876E+01 +PKER_SDRYG( 4, 59) = 0.152334E+01 +PKER_SDRYG( 4, 60) = 0.152764E+01 +PKER_SDRYG( 4, 61) = 0.153168E+01 +PKER_SDRYG( 4, 62) = 0.153546E+01 +PKER_SDRYG( 4, 63) = 0.153902E+01 +PKER_SDRYG( 4, 64) = 0.154235E+01 +PKER_SDRYG( 4, 65) = 0.154548E+01 +PKER_SDRYG( 4, 66) = 0.154842E+01 +PKER_SDRYG( 4, 67) = 0.155117E+01 +PKER_SDRYG( 4, 68) = 0.155376E+01 +PKER_SDRYG( 4, 69) = 0.155619E+01 +PKER_SDRYG( 4, 70) = 0.155847E+01 +PKER_SDRYG( 4, 71) = 0.156061E+01 +PKER_SDRYG( 4, 72) = 0.156262E+01 +PKER_SDRYG( 4, 73) = 0.156451E+01 +PKER_SDRYG( 4, 74) = 0.156628E+01 +PKER_SDRYG( 4, 75) = 0.156795E+01 +PKER_SDRYG( 4, 76) = 0.156951E+01 +PKER_SDRYG( 4, 77) = 0.157098E+01 +PKER_SDRYG( 4, 78) = 0.157235E+01 +PKER_SDRYG( 4, 79) = 0.157365E+01 +PKER_SDRYG( 4, 80) = 0.157486E+01 +PKER_SDRYG( 5, 1) = 0.242058E+01 +PKER_SDRYG( 5, 2) = 0.222747E+01 +PKER_SDRYG( 5, 3) = 0.204603E+01 +PKER_SDRYG( 5, 4) = 0.187558E+01 +PKER_SDRYG( 5, 5) = 0.171547E+01 +PKER_SDRYG( 5, 6) = 0.156517E+01 +PKER_SDRYG( 5, 7) = 0.142419E+01 +PKER_SDRYG( 5, 8) = 0.129215E+01 +PKER_SDRYG( 5, 9) = 0.116874E+01 +PKER_SDRYG( 5, 10) = 0.105374E+01 +PKER_SDRYG( 5, 11) = 0.947064E+00 +PKER_SDRYG( 5, 12) = 0.848754E+00 +PKER_SDRYG( 5, 13) = 0.758866E+00 +PKER_SDRYG( 5, 14) = 0.677714E+00 +PKER_SDRYG( 5, 15) = 0.605727E+00 +PKER_SDRYG( 5, 16) = 0.543389E+00 +PKER_SDRYG( 5, 17) = 0.491619E+00 +PKER_SDRYG( 5, 18) = 0.451355E+00 +PKER_SDRYG( 5, 19) = 0.423473E+00 +PKER_SDRYG( 5, 20) = 0.409129E+00 +PKER_SDRYG( 5, 21) = 0.409111E+00 +PKER_SDRYG( 5, 22) = 0.423458E+00 +PKER_SDRYG( 5, 23) = 0.451630E+00 +PKER_SDRYG( 5, 24) = 0.491797E+00 +PKER_SDRYG( 5, 25) = 0.541294E+00 +PKER_SDRYG( 5, 26) = 0.596703E+00 +PKER_SDRYG( 5, 27) = 0.654696E+00 +PKER_SDRYG( 5, 28) = 0.712443E+00 +PKER_SDRYG( 5, 29) = 0.767659E+00 +PKER_SDRYG( 5, 30) = 0.818920E+00 +PKER_SDRYG( 5, 31) = 0.865491E+00 +PKER_SDRYG( 5, 32) = 0.907343E+00 +PKER_SDRYG( 5, 33) = 0.944838E+00 +PKER_SDRYG( 5, 34) = 0.978432E+00 +PKER_SDRYG( 5, 35) = 0.100859E+01 +PKER_SDRYG( 5, 36) = 0.103569E+01 +PKER_SDRYG( 5, 37) = 0.106011E+01 +PKER_SDRYG( 5, 38) = 0.108214E+01 +PKER_SDRYG( 5, 39) = 0.110210E+01 +PKER_SDRYG( 5, 40) = 0.112025E+01 +PKER_SDRYG( 5, 41) = 0.113682E+01 +PKER_SDRYG( 5, 42) = 0.115202E+01 +PKER_SDRYG( 5, 43) = 0.116600E+01 +PKER_SDRYG( 5, 44) = 0.117890E+01 +PKER_SDRYG( 5, 45) = 0.119084E+01 +PKER_SDRYG( 5, 46) = 0.120190E+01 +PKER_SDRYG( 5, 47) = 0.121218E+01 +PKER_SDRYG( 5, 48) = 0.122174E+01 +PKER_SDRYG( 5, 49) = 0.123065E+01 +PKER_SDRYG( 5, 50) = 0.123897E+01 +PKER_SDRYG( 5, 51) = 0.124673E+01 +PKER_SDRYG( 5, 52) = 0.125398E+01 +PKER_SDRYG( 5, 53) = 0.126077E+01 +PKER_SDRYG( 5, 54) = 0.126712E+01 +PKER_SDRYG( 5, 55) = 0.127307E+01 +PKER_SDRYG( 5, 56) = 0.127864E+01 +PKER_SDRYG( 5, 57) = 0.128386E+01 +PKER_SDRYG( 5, 58) = 0.128875E+01 +PKER_SDRYG( 5, 59) = 0.129334E+01 +PKER_SDRYG( 5, 60) = 0.129764E+01 +PKER_SDRYG( 5, 61) = 0.130168E+01 +PKER_SDRYG( 5, 62) = 0.130547E+01 +PKER_SDRYG( 5, 63) = 0.130902E+01 +PKER_SDRYG( 5, 64) = 0.131236E+01 +PKER_SDRYG( 5, 65) = 0.131549E+01 +PKER_SDRYG( 5, 66) = 0.131842E+01 +PKER_SDRYG( 5, 67) = 0.132118E+01 +PKER_SDRYG( 5, 68) = 0.132377E+01 +PKER_SDRYG( 5, 69) = 0.132620E+01 +PKER_SDRYG( 5, 70) = 0.132848E+01 +PKER_SDRYG( 5, 71) = 0.133062E+01 +PKER_SDRYG( 5, 72) = 0.133263E+01 +PKER_SDRYG( 5, 73) = 0.133452E+01 +PKER_SDRYG( 5, 74) = 0.133629E+01 +PKER_SDRYG( 5, 75) = 0.133796E+01 +PKER_SDRYG( 5, 76) = 0.133952E+01 +PKER_SDRYG( 5, 77) = 0.134098E+01 +PKER_SDRYG( 5, 78) = 0.134236E+01 +PKER_SDRYG( 5, 79) = 0.134365E+01 +PKER_SDRYG( 5, 80) = 0.134487E+01 +PKER_SDRYG( 6, 1) = 0.252692E+01 +PKER_SDRYG( 6, 2) = 0.233392E+01 +PKER_SDRYG( 6, 3) = 0.215256E+01 +PKER_SDRYG( 6, 4) = 0.198212E+01 +PKER_SDRYG( 6, 5) = 0.182193E+01 +PKER_SDRYG( 6, 6) = 0.167134E+01 +PKER_SDRYG( 6, 7) = 0.152979E+01 +PKER_SDRYG( 6, 8) = 0.139676E+01 +PKER_SDRYG( 6, 9) = 0.127181E+01 +PKER_SDRYG( 6, 10) = 0.115455E+01 +PKER_SDRYG( 6, 11) = 0.104468E+01 +PKER_SDRYG( 6, 12) = 0.942046E+00 +PKER_SDRYG( 6, 13) = 0.846498E+00 +PKER_SDRYG( 6, 14) = 0.758078E+00 +PKER_SDRYG( 6, 15) = 0.676915E+00 +PKER_SDRYG( 6, 16) = 0.603393E+00 +PKER_SDRYG( 6, 17) = 0.537925E+00 +PKER_SDRYG( 6, 18) = 0.481299E+00 +PKER_SDRYG( 6, 19) = 0.434300E+00 +PKER_SDRYG( 6, 20) = 0.397962E+00 +PKER_SDRYG( 6, 21) = 0.373555E+00 +PKER_SDRYG( 6, 22) = 0.361810E+00 +PKER_SDRYG( 6, 23) = 0.363261E+00 +PKER_SDRYG( 6, 24) = 0.377804E+00 +PKER_SDRYG( 6, 25) = 0.404141E+00 +PKER_SDRYG( 6, 26) = 0.440111E+00 +PKER_SDRYG( 6, 27) = 0.482932E+00 +PKER_SDRYG( 6, 28) = 0.529526E+00 +PKER_SDRYG( 6, 29) = 0.577250E+00 +PKER_SDRYG( 6, 30) = 0.623904E+00 +PKER_SDRYG( 6, 31) = 0.668115E+00 +PKER_SDRYG( 6, 32) = 0.708971E+00 +PKER_SDRYG( 6, 33) = 0.746106E+00 +PKER_SDRYG( 6, 34) = 0.779586E+00 +PKER_SDRYG( 6, 35) = 0.809709E+00 +PKER_SDRYG( 6, 36) = 0.836864E+00 +PKER_SDRYG( 6, 37) = 0.861427E+00 +PKER_SDRYG( 6, 38) = 0.883701E+00 +PKER_SDRYG( 6, 39) = 0.903939E+00 +PKER_SDRYG( 6, 40) = 0.922359E+00 +PKER_SDRYG( 6, 41) = 0.939166E+00 +PKER_SDRYG( 6, 42) = 0.954549E+00 +PKER_SDRYG( 6, 43) = 0.968675E+00 +PKER_SDRYG( 6, 44) = 0.981689E+00 +PKER_SDRYG( 6, 45) = 0.993712E+00 +PKER_SDRYG( 6, 46) = 0.100485E+01 +PKER_SDRYG( 6, 47) = 0.101518E+01 +PKER_SDRYG( 6, 48) = 0.102479E+01 +PKER_SDRYG( 6, 49) = 0.103373E+01 +PKER_SDRYG( 6, 50) = 0.104207E+01 +PKER_SDRYG( 6, 51) = 0.104986E+01 +PKER_SDRYG( 6, 52) = 0.105713E+01 +PKER_SDRYG( 6, 53) = 0.106393E+01 +PKER_SDRYG( 6, 54) = 0.107029E+01 +PKER_SDRYG( 6, 55) = 0.107624E+01 +PKER_SDRYG( 6, 56) = 0.108182E+01 +PKER_SDRYG( 6, 57) = 0.108704E+01 +PKER_SDRYG( 6, 58) = 0.109194E+01 +PKER_SDRYG( 6, 59) = 0.109653E+01 +PKER_SDRYG( 6, 60) = 0.110084E+01 +PKER_SDRYG( 6, 61) = 0.110488E+01 +PKER_SDRYG( 6, 62) = 0.110866E+01 +PKER_SDRYG( 6, 63) = 0.111222E+01 +PKER_SDRYG( 6, 64) = 0.111556E+01 +PKER_SDRYG( 6, 65) = 0.111869E+01 +PKER_SDRYG( 6, 66) = 0.112162E+01 +PKER_SDRYG( 6, 67) = 0.112438E+01 +PKER_SDRYG( 6, 68) = 0.112697E+01 +PKER_SDRYG( 6, 69) = 0.112940E+01 +PKER_SDRYG( 6, 70) = 0.113168E+01 +PKER_SDRYG( 6, 71) = 0.113382E+01 +PKER_SDRYG( 6, 72) = 0.113583E+01 +PKER_SDRYG( 6, 73) = 0.113772E+01 +PKER_SDRYG( 6, 74) = 0.113949E+01 +PKER_SDRYG( 6, 75) = 0.114116E+01 +PKER_SDRYG( 6, 76) = 0.114272E+01 +PKER_SDRYG( 6, 77) = 0.114419E+01 +PKER_SDRYG( 6, 78) = 0.114556E+01 +PKER_SDRYG( 6, 79) = 0.114686E+01 +PKER_SDRYG( 6, 80) = 0.114807E+01 +PKER_SDRYG( 7, 1) = 0.261786E+01 +PKER_SDRYG( 7, 2) = 0.242499E+01 +PKER_SDRYG( 7, 3) = 0.224378E+01 +PKER_SDRYG( 7, 4) = 0.207350E+01 +PKER_SDRYG( 7, 5) = 0.191346E+01 +PKER_SDRYG( 7, 6) = 0.176300E+01 +PKER_SDRYG( 7, 7) = 0.162153E+01 +PKER_SDRYG( 7, 8) = 0.148846E+01 +PKER_SDRYG( 7, 9) = 0.136328E+01 +PKER_SDRYG( 7, 10) = 0.124549E+01 +PKER_SDRYG( 7, 11) = 0.113468E+01 +PKER_SDRYG( 7, 12) = 0.103050E+01 +PKER_SDRYG( 7, 13) = 0.932669E+00 +PKER_SDRYG( 7, 14) = 0.840960E+00 +PKER_SDRYG( 7, 15) = 0.755294E+00 +PKER_SDRYG( 7, 16) = 0.675723E+00 +PKER_SDRYG( 7, 17) = 0.602410E+00 +PKER_SDRYG( 7, 18) = 0.535732E+00 +PKER_SDRYG( 7, 19) = 0.476253E+00 +PKER_SDRYG( 7, 20) = 0.424743E+00 +PKER_SDRYG( 7, 21) = 0.382214E+00 +PKER_SDRYG( 7, 22) = 0.349787E+00 +PKER_SDRYG( 7, 23) = 0.328527E+00 +PKER_SDRYG( 7, 24) = 0.319129E+00 +PKER_SDRYG( 7, 25) = 0.321804E+00 +PKER_SDRYG( 7, 26) = 0.335925E+00 +PKER_SDRYG( 7, 27) = 0.359789E+00 +PKER_SDRYG( 7, 28) = 0.391183E+00 +PKER_SDRYG( 7, 29) = 0.427436E+00 +PKER_SDRYG( 7, 30) = 0.466046E+00 +PKER_SDRYG( 7, 31) = 0.504837E+00 +PKER_SDRYG( 7, 32) = 0.542368E+00 +PKER_SDRYG( 7, 33) = 0.577763E+00 +PKER_SDRYG( 7, 34) = 0.610469E+00 +PKER_SDRYG( 7, 35) = 0.640344E+00 +PKER_SDRYG( 7, 36) = 0.667411E+00 +PKER_SDRYG( 7, 37) = 0.691907E+00 +PKER_SDRYG( 7, 38) = 0.714147E+00 +PKER_SDRYG( 7, 39) = 0.734403E+00 +PKER_SDRYG( 7, 40) = 0.752915E+00 +PKER_SDRYG( 7, 41) = 0.769870E+00 +PKER_SDRYG( 7, 42) = 0.785417E+00 +PKER_SDRYG( 7, 43) = 0.799696E+00 +PKER_SDRYG( 7, 44) = 0.812835E+00 +PKER_SDRYG( 7, 45) = 0.824958E+00 +PKER_SDRYG( 7, 46) = 0.836170E+00 +PKER_SDRYG( 7, 47) = 0.846564E+00 +PKER_SDRYG( 7, 48) = 0.856219E+00 +PKER_SDRYG( 7, 49) = 0.865201E+00 +PKER_SDRYG( 7, 50) = 0.873570E+00 +PKER_SDRYG( 7, 51) = 0.881376E+00 +PKER_SDRYG( 7, 52) = 0.888666E+00 +PKER_SDRYG( 7, 53) = 0.895479E+00 +PKER_SDRYG( 7, 54) = 0.901851E+00 +PKER_SDRYG( 7, 55) = 0.907814E+00 +PKER_SDRYG( 7, 56) = 0.913398E+00 +PKER_SDRYG( 7, 57) = 0.918628E+00 +PKER_SDRYG( 7, 58) = 0.923530E+00 +PKER_SDRYG( 7, 59) = 0.928125E+00 +PKER_SDRYG( 7, 60) = 0.932433E+00 +PKER_SDRYG( 7, 61) = 0.936474E+00 +PKER_SDRYG( 7, 62) = 0.940264E+00 +PKER_SDRYG( 7, 63) = 0.943820E+00 +PKER_SDRYG( 7, 64) = 0.947157E+00 +PKER_SDRYG( 7, 65) = 0.950288E+00 +PKER_SDRYG( 7, 66) = 0.953227E+00 +PKER_SDRYG( 7, 67) = 0.955985E+00 +PKER_SDRYG( 7, 68) = 0.958574E+00 +PKER_SDRYG( 7, 69) = 0.961004E+00 +PKER_SDRYG( 7, 70) = 0.963286E+00 +PKER_SDRYG( 7, 71) = 0.965428E+00 +PKER_SDRYG( 7, 72) = 0.967438E+00 +PKER_SDRYG( 7, 73) = 0.969326E+00 +PKER_SDRYG( 7, 74) = 0.971099E+00 +PKER_SDRYG( 7, 75) = 0.972763E+00 +PKER_SDRYG( 7, 76) = 0.974325E+00 +PKER_SDRYG( 7, 77) = 0.975792E+00 +PKER_SDRYG( 7, 78) = 0.977169E+00 +PKER_SDRYG( 7, 79) = 0.978462E+00 +PKER_SDRYG( 7, 80) = 0.979677E+00 +PKER_SDRYG( 8, 1) = 0.269561E+01 +PKER_SDRYG( 8, 2) = 0.250283E+01 +PKER_SDRYG( 8, 3) = 0.232174E+01 +PKER_SDRYG( 8, 4) = 0.215161E+01 +PKER_SDRYG( 8, 5) = 0.199174E+01 +PKER_SDRYG( 8, 6) = 0.184149E+01 +PKER_SDRYG( 8, 7) = 0.170023E+01 +PKER_SDRYG( 8, 8) = 0.156739E+01 +PKER_SDRYG( 8, 9) = 0.144242E+01 +PKER_SDRYG( 8, 10) = 0.132479E+01 +PKER_SDRYG( 8, 11) = 0.121403E+01 +PKER_SDRYG( 8, 12) = 0.110969E+01 +PKER_SDRYG( 8, 13) = 0.101137E+01 +PKER_SDRYG( 8, 14) = 0.918736E+00 +PKER_SDRYG( 8, 15) = 0.831495E+00 +PKER_SDRYG( 8, 16) = 0.749451E+00 +PKER_SDRYG( 8, 17) = 0.672563E+00 +PKER_SDRYG( 8, 18) = 0.600835E+00 +PKER_SDRYG( 8, 19) = 0.534485E+00 +PKER_SDRYG( 8, 20) = 0.473951E+00 +PKER_SDRYG( 8, 21) = 0.419909E+00 +PKER_SDRYG( 8, 22) = 0.373149E+00 +PKER_SDRYG( 8, 23) = 0.334877E+00 +PKER_SDRYG( 8, 24) = 0.306095E+00 +PKER_SDRYG( 8, 25) = 0.287726E+00 +PKER_SDRYG( 8, 26) = 0.280481E+00 +PKER_SDRYG( 8, 27) = 0.283946E+00 +PKER_SDRYG( 8, 28) = 0.297076E+00 +PKER_SDRYG( 8, 29) = 0.318238E+00 +PKER_SDRYG( 8, 30) = 0.345049E+00 +PKER_SDRYG( 8, 31) = 0.375221E+00 +PKER_SDRYG( 8, 32) = 0.406792E+00 +PKER_SDRYG( 8, 33) = 0.438182E+00 +PKER_SDRYG( 8, 34) = 0.468400E+00 +PKER_SDRYG( 8, 35) = 0.496851E+00 +PKER_SDRYG( 8, 36) = 0.523262E+00 +PKER_SDRYG( 8, 37) = 0.547514E+00 +PKER_SDRYG( 8, 38) = 0.569649E+00 +PKER_SDRYG( 8, 39) = 0.589826E+00 +PKER_SDRYG( 8, 40) = 0.608254E+00 +PKER_SDRYG( 8, 41) = 0.625149E+00 +PKER_SDRYG( 8, 42) = 0.640693E+00 +PKER_SDRYG( 8, 43) = 0.655025E+00 +PKER_SDRYG( 8, 44) = 0.668253E+00 +PKER_SDRYG( 8, 45) = 0.680470E+00 +PKER_SDRYG( 8, 46) = 0.691766E+00 +PKER_SDRYG( 8, 47) = 0.702228E+00 +PKER_SDRYG( 8, 48) = 0.711935E+00 +PKER_SDRYG( 8, 49) = 0.720959E+00 +PKER_SDRYG( 8, 50) = 0.729360E+00 +PKER_SDRYG( 8, 51) = 0.737193E+00 +PKER_SDRYG( 8, 52) = 0.744502E+00 +PKER_SDRYG( 8, 53) = 0.751331E+00 +PKER_SDRYG( 8, 54) = 0.757715E+00 +PKER_SDRYG( 8, 55) = 0.763688E+00 +PKER_SDRYG( 8, 56) = 0.769279E+00 +PKER_SDRYG( 8, 57) = 0.774516E+00 +PKER_SDRYG( 8, 58) = 0.779422E+00 +PKER_SDRYG( 8, 59) = 0.784021E+00 +PKER_SDRYG( 8, 60) = 0.788332E+00 +PKER_SDRYG( 8, 61) = 0.792375E+00 +PKER_SDRYG( 8, 62) = 0.796167E+00 +PKER_SDRYG( 8, 63) = 0.799725E+00 +PKER_SDRYG( 8, 64) = 0.803062E+00 +PKER_SDRYG( 8, 65) = 0.806194E+00 +PKER_SDRYG( 8, 66) = 0.809134E+00 +PKER_SDRYG( 8, 67) = 0.811893E+00 +PKER_SDRYG( 8, 68) = 0.814482E+00 +PKER_SDRYG( 8, 69) = 0.816913E+00 +PKER_SDRYG( 8, 70) = 0.819194E+00 +PKER_SDRYG( 8, 71) = 0.821336E+00 +PKER_SDRYG( 8, 72) = 0.823347E+00 +PKER_SDRYG( 8, 73) = 0.825235E+00 +PKER_SDRYG( 8, 74) = 0.827008E+00 +PKER_SDRYG( 8, 75) = 0.828672E+00 +PKER_SDRYG( 8, 76) = 0.830234E+00 +PKER_SDRYG( 8, 77) = 0.831701E+00 +PKER_SDRYG( 8, 78) = 0.833078E+00 +PKER_SDRYG( 8, 79) = 0.834372E+00 +PKER_SDRYG( 8, 80) = 0.835586E+00 +PKER_SDRYG( 9, 1) = 0.276207E+01 +PKER_SDRYG( 9, 2) = 0.256937E+01 +PKER_SDRYG( 9, 3) = 0.238837E+01 +PKER_SDRYG( 9, 4) = 0.221834E+01 +PKER_SDRYG( 9, 5) = 0.205861E+01 +PKER_SDRYG( 9, 6) = 0.190852E+01 +PKER_SDRYG( 9, 7) = 0.176746E+01 +PKER_SDRYG( 9, 8) = 0.163486E+01 +PKER_SDRYG( 9, 9) = 0.151015E+01 +PKER_SDRYG( 9, 10) = 0.139283E+01 +PKER_SDRYG( 9, 11) = 0.128239E+01 +PKER_SDRYG( 9, 12) = 0.117836E+01 +PKER_SDRYG( 9, 13) = 0.108030E+01 +PKER_SDRYG( 9, 14) = 0.987804E+00 +PKER_SDRYG( 9, 15) = 0.900480E+00 +PKER_SDRYG( 9, 16) = 0.818006E+00 +PKER_SDRYG( 9, 17) = 0.740119E+00 +PKER_SDRYG( 9, 18) = 0.666640E+00 +PKER_SDRYG( 9, 19) = 0.597469E+00 +PKER_SDRYG( 9, 20) = 0.532692E+00 +PKER_SDRYG( 9, 21) = 0.472590E+00 +PKER_SDRYG( 9, 22) = 0.417593E+00 +PKER_SDRYG( 9, 23) = 0.368487E+00 +PKER_SDRYG( 9, 24) = 0.326216E+00 +PKER_SDRYG( 9, 25) = 0.291847E+00 +PKER_SDRYG( 9, 26) = 0.266518E+00 +PKER_SDRYG( 9, 27) = 0.250973E+00 +PKER_SDRYG( 9, 28) = 0.245401E+00 +PKER_SDRYG( 9, 29) = 0.249224E+00 +PKER_SDRYG( 9, 30) = 0.261135E+00 +PKER_SDRYG( 9, 31) = 0.279371E+00 +PKER_SDRYG( 9, 32) = 0.301823E+00 +PKER_SDRYG( 9, 33) = 0.326652E+00 +PKER_SDRYG( 9, 34) = 0.352342E+00 +PKER_SDRYG( 9, 35) = 0.377786E+00 +PKER_SDRYG( 9, 36) = 0.402202E+00 +PKER_SDRYG( 9, 37) = 0.425256E+00 +PKER_SDRYG( 9, 38) = 0.446772E+00 +PKER_SDRYG( 9, 39) = 0.466663E+00 +PKER_SDRYG( 9, 40) = 0.484977E+00 +PKER_SDRYG( 9, 41) = 0.501779E+00 +PKER_SDRYG( 9, 42) = 0.517214E+00 +PKER_SDRYG( 9, 43) = 0.531452E+00 +PKER_SDRYG( 9, 44) = 0.544618E+00 +PKER_SDRYG( 9, 45) = 0.556824E+00 +PKER_SDRYG( 9, 46) = 0.568153E+00 +PKER_SDRYG( 9, 47) = 0.578667E+00 +PKER_SDRYG( 9, 48) = 0.588428E+00 +PKER_SDRYG( 9, 49) = 0.597497E+00 +PKER_SDRYG( 9, 50) = 0.605935E+00 +PKER_SDRYG( 9, 51) = 0.613795E+00 +PKER_SDRYG( 9, 52) = 0.621127E+00 +PKER_SDRYG( 9, 53) = 0.627973E+00 +PKER_SDRYG( 9, 54) = 0.634371E+00 +PKER_SDRYG( 9, 55) = 0.640354E+00 +PKER_SDRYG( 9, 56) = 0.645954E+00 +PKER_SDRYG( 9, 57) = 0.651197E+00 +PKER_SDRYG( 9, 58) = 0.656109E+00 +PKER_SDRYG( 9, 59) = 0.660711E+00 +PKER_SDRYG( 9, 60) = 0.665026E+00 +PKER_SDRYG( 9, 61) = 0.669071E+00 +PKER_SDRYG( 9, 62) = 0.672865E+00 +PKER_SDRYG( 9, 63) = 0.676424E+00 +PKER_SDRYG( 9, 64) = 0.679763E+00 +PKER_SDRYG( 9, 65) = 0.682897E+00 +PKER_SDRYG( 9, 66) = 0.685837E+00 +PKER_SDRYG( 9, 67) = 0.688596E+00 +PKER_SDRYG( 9, 68) = 0.691186E+00 +PKER_SDRYG( 9, 69) = 0.693617E+00 +PKER_SDRYG( 9, 70) = 0.695899E+00 +PKER_SDRYG( 9, 71) = 0.698041E+00 +PKER_SDRYG( 9, 72) = 0.700052E+00 +PKER_SDRYG( 9, 73) = 0.701940E+00 +PKER_SDRYG( 9, 74) = 0.703713E+00 +PKER_SDRYG( 9, 75) = 0.705377E+00 +PKER_SDRYG( 9, 76) = 0.706940E+00 +PKER_SDRYG( 9, 77) = 0.708407E+00 +PKER_SDRYG( 9, 78) = 0.709784E+00 +PKER_SDRYG( 9, 79) = 0.711077E+00 +PKER_SDRYG( 9, 80) = 0.712292E+00 +PKER_SDRYG( 10, 1) = 0.281890E+01 +PKER_SDRYG( 10, 2) = 0.262625E+01 +PKER_SDRYG( 10, 3) = 0.244531E+01 +PKER_SDRYG( 10, 4) = 0.227537E+01 +PKER_SDRYG( 10, 5) = 0.211573E+01 +PKER_SDRYG( 10, 6) = 0.196576E+01 +PKER_SDRYG( 10, 7) = 0.182485E+01 +PKER_SDRYG( 10, 8) = 0.169243E+01 +PKER_SDRYG( 10, 9) = 0.156795E+01 +PKER_SDRYG( 10, 10) = 0.145089E+01 +PKER_SDRYG( 10, 11) = 0.134077E+01 +PKER_SDRYG( 10, 12) = 0.123711E+01 +PKER_SDRYG( 10, 13) = 0.113947E+01 +PKER_SDRYG( 10, 14) = 0.104741E+01 +PKER_SDRYG( 10, 15) = 0.960534E+00 +PKER_SDRYG( 10, 16) = 0.878447E+00 +PKER_SDRYG( 10, 17) = 0.800800E+00 +PKER_SDRYG( 10, 18) = 0.727272E+00 +PKER_SDRYG( 10, 19) = 0.657611E+00 +PKER_SDRYG( 10, 20) = 0.591632E+00 +PKER_SDRYG( 10, 21) = 0.529264E+00 +PKER_SDRYG( 10, 22) = 0.470668E+00 +PKER_SDRYG( 10, 23) = 0.416097E+00 +PKER_SDRYG( 10, 24) = 0.366106E+00 +PKER_SDRYG( 10, 25) = 0.321553E+00 +PKER_SDRYG( 10, 26) = 0.283464E+00 +PKER_SDRYG( 10, 27) = 0.252856E+00 +PKER_SDRYG( 10, 28) = 0.230814E+00 +PKER_SDRYG( 10, 29) = 0.217753E+00 +PKER_SDRYG( 10, 30) = 0.213511E+00 +PKER_SDRYG( 10, 31) = 0.217435E+00 +PKER_SDRYG( 10, 32) = 0.227916E+00 +PKER_SDRYG( 10, 33) = 0.243286E+00 +PKER_SDRYG( 10, 34) = 0.261931E+00 +PKER_SDRYG( 10, 35) = 0.282270E+00 +PKER_SDRYG( 10, 36) = 0.303153E+00 +PKER_SDRYG( 10, 37) = 0.323799E+00 +PKER_SDRYG( 10, 38) = 0.343682E+00 +PKER_SDRYG( 10, 39) = 0.362526E+00 +PKER_SDRYG( 10, 40) = 0.380218E+00 +PKER_SDRYG( 10, 41) = 0.396712E+00 +PKER_SDRYG( 10, 42) = 0.412002E+00 +PKER_SDRYG( 10, 43) = 0.426131E+00 +PKER_SDRYG( 10, 44) = 0.439189E+00 +PKER_SDRYG( 10, 45) = 0.451282E+00 +PKER_SDRYG( 10, 46) = 0.462518E+00 +PKER_SDRYG( 10, 47) = 0.472980E+00 +PKER_SDRYG( 10, 48) = 0.482733E+00 +PKER_SDRYG( 10, 49) = 0.491822E+00 +PKER_SDRYG( 10, 50) = 0.500291E+00 +PKER_SDRYG( 10, 51) = 0.508181E+00 +PKER_SDRYG( 10, 52) = 0.515537E+00 +PKER_SDRYG( 10, 53) = 0.522403E+00 +PKER_SDRYG( 10, 54) = 0.528816E+00 +PKER_SDRYG( 10, 55) = 0.534811E+00 +PKER_SDRYG( 10, 56) = 0.540420E+00 +PKER_SDRYG( 10, 57) = 0.545671E+00 +PKER_SDRYG( 10, 58) = 0.550588E+00 +PKER_SDRYG( 10, 59) = 0.555195E+00 +PKER_SDRYG( 10, 60) = 0.559513E+00 +PKER_SDRYG( 10, 61) = 0.563561E+00 +PKER_SDRYG( 10, 62) = 0.567358E+00 +PKER_SDRYG( 10, 63) = 0.570918E+00 +PKER_SDRYG( 10, 64) = 0.574259E+00 +PKER_SDRYG( 10, 65) = 0.577393E+00 +PKER_SDRYG( 10, 66) = 0.580334E+00 +PKER_SDRYG( 10, 67) = 0.583094E+00 +PKER_SDRYG( 10, 68) = 0.585685E+00 +PKER_SDRYG( 10, 69) = 0.588116E+00 +PKER_SDRYG( 10, 70) = 0.590398E+00 +PKER_SDRYG( 10, 71) = 0.592541E+00 +PKER_SDRYG( 10, 72) = 0.594552E+00 +PKER_SDRYG( 10, 73) = 0.596440E+00 +PKER_SDRYG( 10, 74) = 0.598213E+00 +PKER_SDRYG( 10, 75) = 0.599877E+00 +PKER_SDRYG( 10, 76) = 0.601440E+00 +PKER_SDRYG( 10, 77) = 0.602907E+00 +PKER_SDRYG( 10, 78) = 0.604284E+00 +PKER_SDRYG( 10, 79) = 0.605578E+00 +PKER_SDRYG( 10, 80) = 0.606792E+00 +PKER_SDRYG( 11, 1) = 0.286750E+01 +PKER_SDRYG( 11, 2) = 0.267488E+01 +PKER_SDRYG( 11, 3) = 0.249399E+01 +PKER_SDRYG( 11, 4) = 0.232410E+01 +PKER_SDRYG( 11, 5) = 0.216454E+01 +PKER_SDRYG( 11, 6) = 0.201465E+01 +PKER_SDRYG( 11, 7) = 0.187385E+01 +PKER_SDRYG( 11, 8) = 0.174156E+01 +PKER_SDRYG( 11, 9) = 0.161724E+01 +PKER_SDRYG( 11, 10) = 0.150038E+01 +PKER_SDRYG( 11, 11) = 0.139051E+01 +PKER_SDRYG( 11, 12) = 0.128715E+01 +PKER_SDRYG( 11, 13) = 0.118986E+01 +PKER_SDRYG( 11, 14) = 0.109824E+01 +PKER_SDRYG( 11, 15) = 0.101186E+01 +PKER_SDRYG( 11, 16) = 0.930332E+00 +PKER_SDRYG( 11, 17) = 0.853282E+00 +PKER_SDRYG( 11, 18) = 0.780348E+00 +PKER_SDRYG( 11, 19) = 0.711193E+00 +PKER_SDRYG( 11, 20) = 0.645511E+00 +PKER_SDRYG( 11, 21) = 0.583060E+00 +PKER_SDRYG( 11, 22) = 0.523685E+00 +PKER_SDRYG( 11, 23) = 0.467360E+00 +PKER_SDRYG( 11, 24) = 0.414210E+00 +PKER_SDRYG( 11, 25) = 0.364609E+00 +PKER_SDRYG( 11, 26) = 0.319253E+00 +PKER_SDRYG( 11, 27) = 0.278944E+00 +PKER_SDRYG( 11, 28) = 0.244812E+00 +PKER_SDRYG( 11, 29) = 0.217874E+00 +PKER_SDRYG( 11, 30) = 0.198828E+00 +PKER_SDRYG( 11, 31) = 0.187973E+00 +PKER_SDRYG( 11, 32) = 0.184872E+00 +PKER_SDRYG( 11, 33) = 0.188508E+00 +PKER_SDRYG( 11, 34) = 0.197506E+00 +PKER_SDRYG( 11, 35) = 0.210328E+00 +PKER_SDRYG( 11, 36) = 0.225647E+00 +PKER_SDRYG( 11, 37) = 0.242242E+00 +PKER_SDRYG( 11, 38) = 0.259254E+00 +PKER_SDRYG( 11, 39) = 0.276128E+00 +PKER_SDRYG( 11, 40) = 0.292461E+00 +PKER_SDRYG( 11, 41) = 0.308005E+00 +PKER_SDRYG( 11, 42) = 0.322690E+00 +PKER_SDRYG( 11, 43) = 0.336481E+00 +PKER_SDRYG( 11, 44) = 0.349355E+00 +PKER_SDRYG( 11, 45) = 0.361342E+00 +PKER_SDRYG( 11, 46) = 0.372471E+00 +PKER_SDRYG( 11, 47) = 0.382818E+00 +PKER_SDRYG( 11, 48) = 0.392468E+00 +PKER_SDRYG( 11, 49) = 0.401482E+00 +PKER_SDRYG( 11, 50) = 0.409913E+00 +PKER_SDRYG( 11, 51) = 0.417799E+00 +PKER_SDRYG( 11, 52) = 0.425169E+00 +PKER_SDRYG( 11, 53) = 0.432052E+00 +PKER_SDRYG( 11, 54) = 0.438481E+00 +PKER_SDRYG( 11, 55) = 0.444490E+00 +PKER_SDRYG( 11, 56) = 0.450109E+00 +PKER_SDRYG( 11, 57) = 0.455368E+00 +PKER_SDRYG( 11, 58) = 0.460292E+00 +PKER_SDRYG( 11, 59) = 0.464904E+00 +PKER_SDRYG( 11, 60) = 0.469226E+00 +PKER_SDRYG( 11, 61) = 0.473277E+00 +PKER_SDRYG( 11, 62) = 0.477076E+00 +PKER_SDRYG( 11, 63) = 0.480638E+00 +PKER_SDRYG( 11, 64) = 0.483980E+00 +PKER_SDRYG( 11, 65) = 0.487116E+00 +PKER_SDRYG( 11, 66) = 0.490058E+00 +PKER_SDRYG( 11, 67) = 0.492818E+00 +PKER_SDRYG( 11, 68) = 0.495409E+00 +PKER_SDRYG( 11, 69) = 0.497841E+00 +PKER_SDRYG( 11, 70) = 0.500124E+00 +PKER_SDRYG( 11, 71) = 0.502267E+00 +PKER_SDRYG( 11, 72) = 0.504278E+00 +PKER_SDRYG( 11, 73) = 0.506166E+00 +PKER_SDRYG( 11, 74) = 0.507939E+00 +PKER_SDRYG( 11, 75) = 0.509604E+00 +PKER_SDRYG( 11, 76) = 0.511166E+00 +PKER_SDRYG( 11, 77) = 0.512633E+00 +PKER_SDRYG( 11, 78) = 0.514011E+00 +PKER_SDRYG( 11, 79) = 0.515304E+00 +PKER_SDRYG( 11, 80) = 0.516519E+00 +PKER_SDRYG( 12, 1) = 0.290906E+01 +PKER_SDRYG( 12, 2) = 0.271647E+01 +PKER_SDRYG( 12, 3) = 0.253562E+01 +PKER_SDRYG( 12, 4) = 0.236577E+01 +PKER_SDRYG( 12, 5) = 0.220625E+01 +PKER_SDRYG( 12, 6) = 0.205643E+01 +PKER_SDRYG( 12, 7) = 0.191570E+01 +PKER_SDRYG( 12, 8) = 0.178350E+01 +PKER_SDRYG( 12, 9) = 0.165930E+01 +PKER_SDRYG( 12, 10) = 0.154259E+01 +PKER_SDRYG( 12, 11) = 0.143289E+01 +PKER_SDRYG( 12, 12) = 0.132974E+01 +PKER_SDRYG( 12, 13) = 0.123273E+01 +PKER_SDRYG( 12, 14) = 0.114144E+01 +PKER_SDRYG( 12, 15) = 0.105546E+01 +PKER_SDRYG( 12, 16) = 0.974419E+00 +PKER_SDRYG( 12, 17) = 0.897945E+00 +PKER_SDRYG( 12, 18) = 0.825675E+00 +PKER_SDRYG( 12, 19) = 0.757259E+00 +PKER_SDRYG( 12, 20) = 0.692357E+00 +PKER_SDRYG( 12, 21) = 0.630647E+00 +PKER_SDRYG( 12, 22) = 0.571852E+00 +PKER_SDRYG( 12, 23) = 0.515731E+00 +PKER_SDRYG( 12, 24) = 0.462161E+00 +PKER_SDRYG( 12, 25) = 0.411137E+00 +PKER_SDRYG( 12, 26) = 0.362843E+00 +PKER_SDRYG( 12, 27) = 0.317811E+00 +PKER_SDRYG( 12, 28) = 0.276701E+00 +PKER_SDRYG( 12, 29) = 0.240451E+00 +PKER_SDRYG( 12, 30) = 0.210140E+00 +PKER_SDRYG( 12, 31) = 0.186654E+00 +PKER_SDRYG( 12, 32) = 0.170411E+00 +PKER_SDRYG( 12, 33) = 0.161472E+00 +PKER_SDRYG( 12, 34) = 0.159162E+00 +PKER_SDRYG( 12, 35) = 0.162388E+00 +PKER_SDRYG( 12, 36) = 0.169994E+00 +PKER_SDRYG( 12, 37) = 0.180588E+00 +PKER_SDRYG( 12, 38) = 0.193112E+00 +PKER_SDRYG( 12, 39) = 0.206687E+00 +PKER_SDRYG( 12, 40) = 0.220641E+00 +PKER_SDRYG( 12, 41) = 0.234505E+00 +PKER_SDRYG( 12, 42) = 0.247994E+00 +PKER_SDRYG( 12, 43) = 0.260933E+00 +PKER_SDRYG( 12, 44) = 0.273225E+00 +PKER_SDRYG( 12, 45) = 0.284842E+00 +PKER_SDRYG( 12, 46) = 0.295768E+00 +PKER_SDRYG( 12, 47) = 0.305996E+00 +PKER_SDRYG( 12, 48) = 0.315542E+00 +PKER_SDRYG( 12, 49) = 0.324451E+00 +PKER_SDRYG( 12, 50) = 0.332775E+00 +PKER_SDRYG( 12, 51) = 0.340574E+00 +PKER_SDRYG( 12, 52) = 0.347888E+00 +PKER_SDRYG( 12, 53) = 0.354748E+00 +PKER_SDRYG( 12, 54) = 0.361176E+00 +PKER_SDRYG( 12, 55) = 0.367194E+00 +PKER_SDRYG( 12, 56) = 0.372824E+00 +PKER_SDRYG( 12, 57) = 0.378091E+00 +PKER_SDRYG( 12, 58) = 0.383022E+00 +PKER_SDRYG( 12, 59) = 0.387639E+00 +PKER_SDRYG( 12, 60) = 0.391966E+00 +PKER_SDRYG( 12, 61) = 0.396020E+00 +PKER_SDRYG( 12, 62) = 0.399822E+00 +PKER_SDRYG( 12, 63) = 0.403386E+00 +PKER_SDRYG( 12, 64) = 0.406730E+00 +PKER_SDRYG( 12, 65) = 0.409867E+00 +PKER_SDRYG( 12, 66) = 0.412810E+00 +PKER_SDRYG( 12, 67) = 0.415571E+00 +PKER_SDRYG( 12, 68) = 0.418163E+00 +PKER_SDRYG( 12, 69) = 0.420595E+00 +PKER_SDRYG( 12, 70) = 0.422878E+00 +PKER_SDRYG( 12, 71) = 0.425021E+00 +PKER_SDRYG( 12, 72) = 0.427033E+00 +PKER_SDRYG( 12, 73) = 0.428922E+00 +PKER_SDRYG( 12, 74) = 0.430695E+00 +PKER_SDRYG( 12, 75) = 0.432359E+00 +PKER_SDRYG( 12, 76) = 0.433922E+00 +PKER_SDRYG( 12, 77) = 0.435389E+00 +PKER_SDRYG( 12, 78) = 0.436767E+00 +PKER_SDRYG( 12, 79) = 0.438060E+00 +PKER_SDRYG( 12, 80) = 0.439274E+00 +PKER_SDRYG( 13, 1) = 0.294461E+01 +PKER_SDRYG( 13, 2) = 0.275204E+01 +PKER_SDRYG( 13, 3) = 0.257121E+01 +PKER_SDRYG( 13, 4) = 0.240139E+01 +PKER_SDRYG( 13, 5) = 0.224191E+01 +PKER_SDRYG( 13, 6) = 0.209213E+01 +PKER_SDRYG( 13, 7) = 0.195146E+01 +PKER_SDRYG( 13, 8) = 0.181933E+01 +PKER_SDRYG( 13, 9) = 0.169521E+01 +PKER_SDRYG( 13, 10) = 0.157859E+01 +PKER_SDRYG( 13, 11) = 0.146902E+01 +PKER_SDRYG( 13, 12) = 0.136604E+01 +PKER_SDRYG( 13, 13) = 0.126922E+01 +PKER_SDRYG( 13, 14) = 0.117816E+01 +PKER_SDRYG( 13, 15) = 0.109248E+01 +PKER_SDRYG( 13, 16) = 0.101180E+01 +PKER_SDRYG( 13, 17) = 0.935773E+00 +PKER_SDRYG( 13, 18) = 0.864045E+00 +PKER_SDRYG( 13, 19) = 0.796277E+00 +PKER_SDRYG( 13, 20) = 0.732136E+00 +PKER_SDRYG( 13, 21) = 0.671293E+00 +PKER_SDRYG( 13, 22) = 0.613429E+00 +PKER_SDRYG( 13, 23) = 0.558244E+00 +PKER_SDRYG( 13, 24) = 0.505468E+00 +PKER_SDRYG( 13, 25) = 0.454895E+00 +PKER_SDRYG( 13, 26) = 0.406428E+00 +PKER_SDRYG( 13, 27) = 0.360131E+00 +PKER_SDRYG( 13, 28) = 0.316299E+00 +PKER_SDRYG( 13, 29) = 0.275456E+00 +PKER_SDRYG( 13, 30) = 0.238374E+00 +PKER_SDRYG( 13, 31) = 0.206109E+00 +PKER_SDRYG( 13, 32) = 0.179451E+00 +PKER_SDRYG( 13, 33) = 0.159190E+00 +PKER_SDRYG( 13, 34) = 0.145545E+00 +PKER_SDRYG( 13, 35) = 0.138171E+00 +PKER_SDRYG( 13, 36) = 0.136403E+00 +PKER_SDRYG( 13, 37) = 0.139198E+00 +PKER_SDRYG( 13, 38) = 0.145447E+00 +PKER_SDRYG( 13, 39) = 0.154142E+00 +PKER_SDRYG( 13, 40) = 0.164364E+00 +PKER_SDRYG( 13, 41) = 0.175488E+00 +PKER_SDRYG( 13, 42) = 0.186961E+00 +PKER_SDRYG( 13, 43) = 0.198418E+00 +PKER_SDRYG( 13, 44) = 0.209659E+00 +PKER_SDRYG( 13, 45) = 0.220512E+00 +PKER_SDRYG( 13, 46) = 0.230875E+00 +PKER_SDRYG( 13, 47) = 0.240723E+00 +PKER_SDRYG( 13, 48) = 0.250043E+00 +PKER_SDRYG( 13, 49) = 0.258814E+00 +PKER_SDRYG( 13, 50) = 0.267045E+00 +PKER_SDRYG( 13, 51) = 0.274749E+00 +PKER_SDRYG( 13, 52) = 0.281964E+00 +PKER_SDRYG( 13, 53) = 0.288735E+00 +PKER_SDRYG( 13, 54) = 0.295096E+00 +PKER_SDRYG( 13, 55) = 0.301076E+00 +PKER_SDRYG( 13, 56) = 0.306693E+00 +PKER_SDRYG( 13, 57) = 0.311961E+00 +PKER_SDRYG( 13, 58) = 0.316898E+00 +PKER_SDRYG( 13, 59) = 0.321521E+00 +PKER_SDRYG( 13, 60) = 0.325852E+00 +PKER_SDRYG( 13, 61) = 0.329911E+00 +PKER_SDRYG( 13, 62) = 0.333715E+00 +PKER_SDRYG( 13, 63) = 0.337282E+00 +PKER_SDRYG( 13, 64) = 0.340628E+00 +PKER_SDRYG( 13, 65) = 0.343766E+00 +PKER_SDRYG( 13, 66) = 0.346710E+00 +PKER_SDRYG( 13, 67) = 0.349472E+00 +PKER_SDRYG( 13, 68) = 0.352064E+00 +PKER_SDRYG( 13, 69) = 0.354497E+00 +PKER_SDRYG( 13, 70) = 0.356781E+00 +PKER_SDRYG( 13, 71) = 0.358924E+00 +PKER_SDRYG( 13, 72) = 0.360936E+00 +PKER_SDRYG( 13, 73) = 0.362825E+00 +PKER_SDRYG( 13, 74) = 0.364598E+00 +PKER_SDRYG( 13, 75) = 0.366263E+00 +PKER_SDRYG( 13, 76) = 0.367826E+00 +PKER_SDRYG( 13, 77) = 0.369293E+00 +PKER_SDRYG( 13, 78) = 0.370671E+00 +PKER_SDRYG( 13, 79) = 0.371964E+00 +PKER_SDRYG( 13, 80) = 0.373178E+00 +PKER_SDRYG( 14, 1) = 0.297502E+01 +PKER_SDRYG( 14, 2) = 0.278247E+01 +PKER_SDRYG( 14, 3) = 0.260165E+01 +PKER_SDRYG( 14, 4) = 0.243185E+01 +PKER_SDRYG( 14, 5) = 0.227240E+01 +PKER_SDRYG( 14, 6) = 0.212265E+01 +PKER_SDRYG( 14, 7) = 0.198202E+01 +PKER_SDRYG( 14, 8) = 0.184993E+01 +PKER_SDRYG( 14, 9) = 0.172587E+01 +PKER_SDRYG( 14, 10) = 0.160933E+01 +PKER_SDRYG( 14, 11) = 0.149985E+01 +PKER_SDRYG( 14, 12) = 0.139698E+01 +PKER_SDRYG( 14, 13) = 0.130029E+01 +PKER_SDRYG( 14, 14) = 0.120941E+01 +PKER_SDRYG( 14, 15) = 0.112394E+01 +PKER_SDRYG( 14, 16) = 0.104352E+01 +PKER_SDRYG( 14, 17) = 0.967815E+00 +PKER_SDRYG( 14, 18) = 0.896486E+00 +PKER_SDRYG( 14, 19) = 0.829209E+00 +PKER_SDRYG( 14, 20) = 0.765666E+00 +PKER_SDRYG( 14, 21) = 0.705545E+00 +PKER_SDRYG( 14, 22) = 0.648535E+00 +PKER_SDRYG( 14, 23) = 0.594329E+00 +PKER_SDRYG( 14, 24) = 0.542628E+00 +PKER_SDRYG( 14, 25) = 0.493150E+00 +PKER_SDRYG( 14, 26) = 0.445651E+00 +PKER_SDRYG( 14, 27) = 0.399968E+00 +PKER_SDRYG( 14, 28) = 0.356041E+00 +PKER_SDRYG( 14, 29) = 0.314021E+00 +PKER_SDRYG( 14, 30) = 0.274267E+00 +PKER_SDRYG( 14, 31) = 0.237374E+00 +PKER_SDRYG( 14, 32) = 0.204260E+00 +PKER_SDRYG( 14, 33) = 0.175765E+00 +PKER_SDRYG( 14, 34) = 0.152637E+00 +PKER_SDRYG( 14, 35) = 0.135365E+00 +PKER_SDRYG( 14, 36) = 0.123949E+00 +PKER_SDRYG( 14, 37) = 0.117859E+00 +PKER_SDRYG( 14, 38) = 0.116422E+00 +PKER_SDRYG( 14, 39) = 0.118727E+00 +PKER_SDRYG( 14, 40) = 0.123806E+00 +PKER_SDRYG( 14, 41) = 0.130898E+00 +PKER_SDRYG( 14, 42) = 0.139254E+00 +PKER_SDRYG( 14, 43) = 0.148386E+00 +PKER_SDRYG( 14, 44) = 0.157857E+00 +PKER_SDRYG( 14, 45) = 0.167407E+00 +PKER_SDRYG( 14, 46) = 0.176814E+00 +PKER_SDRYG( 14, 47) = 0.185950E+00 +PKER_SDRYG( 14, 48) = 0.194744E+00 +PKER_SDRYG( 14, 49) = 0.203138E+00 +PKER_SDRYG( 14, 50) = 0.211120E+00 +PKER_SDRYG( 14, 51) = 0.218676E+00 +PKER_SDRYG( 14, 52) = 0.225795E+00 +PKER_SDRYG( 14, 53) = 0.232480E+00 +PKER_SDRYG( 14, 54) = 0.238754E+00 +PKER_SDRYG( 14, 55) = 0.244647E+00 +PKER_SDRYG( 14, 56) = 0.250193E+00 +PKER_SDRYG( 14, 57) = 0.255414E+00 +PKER_SDRYG( 14, 58) = 0.260327E+00 +PKER_SDRYG( 14, 59) = 0.264945E+00 +PKER_SDRYG( 14, 60) = 0.269277E+00 +PKER_SDRYG( 14, 61) = 0.273339E+00 +PKER_SDRYG( 14, 62) = 0.277147E+00 +PKER_SDRYG( 14, 63) = 0.280716E+00 +PKER_SDRYG( 14, 64) = 0.284064E+00 +PKER_SDRYG( 14, 65) = 0.287203E+00 +PKER_SDRYG( 14, 66) = 0.290149E+00 +PKER_SDRYG( 14, 67) = 0.292912E+00 +PKER_SDRYG( 14, 68) = 0.295505E+00 +PKER_SDRYG( 14, 69) = 0.297939E+00 +PKER_SDRYG( 14, 70) = 0.300223E+00 +PKER_SDRYG( 14, 71) = 0.302366E+00 +PKER_SDRYG( 14, 72) = 0.304379E+00 +PKER_SDRYG( 14, 73) = 0.306268E+00 +PKER_SDRYG( 14, 74) = 0.308041E+00 +PKER_SDRYG( 14, 75) = 0.309706E+00 +PKER_SDRYG( 14, 76) = 0.311269E+00 +PKER_SDRYG( 14, 77) = 0.312736E+00 +PKER_SDRYG( 14, 78) = 0.314114E+00 +PKER_SDRYG( 14, 79) = 0.315407E+00 +PKER_SDRYG( 14, 80) = 0.316622E+00 +PKER_SDRYG( 15, 1) = 0.300103E+01 +PKER_SDRYG( 15, 2) = 0.280849E+01 +PKER_SDRYG( 15, 3) = 0.262769E+01 +PKER_SDRYG( 15, 4) = 0.245790E+01 +PKER_SDRYG( 15, 5) = 0.229847E+01 +PKER_SDRYG( 15, 6) = 0.214875E+01 +PKER_SDRYG( 15, 7) = 0.200814E+01 +PKER_SDRYG( 15, 8) = 0.187609E+01 +PKER_SDRYG( 15, 9) = 0.175207E+01 +PKER_SDRYG( 15, 10) = 0.163559E+01 +PKER_SDRYG( 15, 11) = 0.152617E+01 +PKER_SDRYG( 15, 12) = 0.142337E+01 +PKER_SDRYG( 15, 13) = 0.132679E+01 +PKER_SDRYG( 15, 14) = 0.123602E+01 +PKER_SDRYG( 15, 15) = 0.115070E+01 +PKER_SDRYG( 15, 16) = 0.107047E+01 +PKER_SDRYG( 15, 17) = 0.994997E+00 +PKER_SDRYG( 15, 18) = 0.923952E+00 +PKER_SDRYG( 15, 19) = 0.857028E+00 +PKER_SDRYG( 15, 20) = 0.793920E+00 +PKER_SDRYG( 15, 21) = 0.734336E+00 +PKER_SDRYG( 15, 22) = 0.677982E+00 +PKER_SDRYG( 15, 23) = 0.624570E+00 +PKER_SDRYG( 15, 24) = 0.573810E+00 +PKER_SDRYG( 15, 25) = 0.525415E+00 +PKER_SDRYG( 15, 26) = 0.479106E+00 +PKER_SDRYG( 15, 27) = 0.434625E+00 +PKER_SDRYG( 15, 28) = 0.391766E+00 +PKER_SDRYG( 15, 29) = 0.350403E+00 +PKER_SDRYG( 15, 30) = 0.310560E+00 +PKER_SDRYG( 15, 31) = 0.272465E+00 +PKER_SDRYG( 15, 32) = 0.236568E+00 +PKER_SDRYG( 15, 33) = 0.203576E+00 +PKER_SDRYG( 15, 34) = 0.174281E+00 +PKER_SDRYG( 15, 35) = 0.149398E+00 +PKER_SDRYG( 15, 36) = 0.129630E+00 +PKER_SDRYG( 15, 37) = 0.114988E+00 +PKER_SDRYG( 15, 38) = 0.105420E+00 +PKER_SDRYG( 15, 39) = 0.100387E+00 +PKER_SDRYG( 15, 40) = 0.991260E-01 +PKER_SDRYG( 15, 41) = 0.100927E+00 +PKER_SDRYG( 15, 42) = 0.105008E+00 +PKER_SDRYG( 15, 43) = 0.110722E+00 +PKER_SDRYG( 15, 44) = 0.117557E+00 +PKER_SDRYG( 15, 45) = 0.125044E+00 +PKER_SDRYG( 15, 46) = 0.132897E+00 +PKER_SDRYG( 15, 47) = 0.140870E+00 +PKER_SDRYG( 15, 48) = 0.148774E+00 +PKER_SDRYG( 15, 49) = 0.156516E+00 +PKER_SDRYG( 15, 50) = 0.164008E+00 +PKER_SDRYG( 15, 51) = 0.171192E+00 +PKER_SDRYG( 15, 52) = 0.178051E+00 +PKER_SDRYG( 15, 53) = 0.184577E+00 +PKER_SDRYG( 15, 54) = 0.190747E+00 +PKER_SDRYG( 15, 55) = 0.196565E+00 +PKER_SDRYG( 15, 56) = 0.202034E+00 +PKER_SDRYG( 15, 57) = 0.207177E+00 +PKER_SDRYG( 15, 58) = 0.212021E+00 +PKER_SDRYG( 15, 59) = 0.216585E+00 +PKER_SDRYG( 15, 60) = 0.220887E+00 +PKER_SDRYG( 15, 61) = 0.224936E+00 +PKER_SDRYG( 15, 62) = 0.228741E+00 +PKER_SDRYG( 15, 63) = 0.232312E+00 +PKER_SDRYG( 15, 64) = 0.235662E+00 +PKER_SDRYG( 15, 65) = 0.238803E+00 +PKER_SDRYG( 15, 66) = 0.241750E+00 +PKER_SDRYG( 15, 67) = 0.244514E+00 +PKER_SDRYG( 15, 68) = 0.247108E+00 +PKER_SDRYG( 15, 69) = 0.249543E+00 +PKER_SDRYG( 15, 70) = 0.251827E+00 +PKER_SDRYG( 15, 71) = 0.253971E+00 +PKER_SDRYG( 15, 72) = 0.255984E+00 +PKER_SDRYG( 15, 73) = 0.257873E+00 +PKER_SDRYG( 15, 74) = 0.259647E+00 +PKER_SDRYG( 15, 75) = 0.261312E+00 +PKER_SDRYG( 15, 76) = 0.262875E+00 +PKER_SDRYG( 15, 77) = 0.264342E+00 +PKER_SDRYG( 15, 78) = 0.265720E+00 +PKER_SDRYG( 15, 79) = 0.267013E+00 +PKER_SDRYG( 15, 80) = 0.268228E+00 +PKER_SDRYG( 16, 1) = 0.302329E+01 +PKER_SDRYG( 16, 2) = 0.283075E+01 +PKER_SDRYG( 16, 3) = 0.264996E+01 +PKER_SDRYG( 16, 4) = 0.248019E+01 +PKER_SDRYG( 16, 5) = 0.232076E+01 +PKER_SDRYG( 16, 6) = 0.217106E+01 +PKER_SDRYG( 16, 7) = 0.203047E+01 +PKER_SDRYG( 16, 8) = 0.189845E+01 +PKER_SDRYG( 16, 9) = 0.177446E+01 +PKER_SDRYG( 16, 10) = 0.165801E+01 +PKER_SDRYG( 16, 11) = 0.154864E+01 +PKER_SDRYG( 16, 12) = 0.144590E+01 +PKER_SDRYG( 16, 13) = 0.134939E+01 +PKER_SDRYG( 16, 14) = 0.125871E+01 +PKER_SDRYG( 16, 15) = 0.117350E+01 +PKER_SDRYG( 16, 16) = 0.109340E+01 +PKER_SDRYG( 16, 17) = 0.101809E+01 +PKER_SDRYG( 16, 18) = 0.947248E+00 +PKER_SDRYG( 16, 19) = 0.880574E+00 +PKER_SDRYG( 16, 20) = 0.817777E+00 +PKER_SDRYG( 16, 21) = 0.758577E+00 +PKER_SDRYG( 16, 22) = 0.702699E+00 +PKER_SDRYG( 16, 23) = 0.649873E+00 +PKER_SDRYG( 16, 24) = 0.599828E+00 +PKER_SDRYG( 16, 25) = 0.552297E+00 +PKER_SDRYG( 16, 26) = 0.507010E+00 +PKER_SDRYG( 16, 27) = 0.463701E+00 +PKER_SDRYG( 16, 28) = 0.422113E+00 +PKER_SDRYG( 16, 29) = 0.382023E+00 +PKER_SDRYG( 16, 30) = 0.343269E+00 +PKER_SDRYG( 16, 31) = 0.305794E+00 +PKER_SDRYG( 16, 32) = 0.269715E+00 +PKER_SDRYG( 16, 33) = 0.235329E+00 +PKER_SDRYG( 16, 34) = 0.203179E+00 +PKER_SDRYG( 16, 35) = 0.173939E+00 +PKER_SDRYG( 16, 36) = 0.148290E+00 +PKER_SDRYG( 16, 37) = 0.126911E+00 +PKER_SDRYG( 16, 38) = 0.110074E+00 +PKER_SDRYG( 16, 39) = 0.977722E-01 +PKER_SDRYG( 16, 40) = 0.897236E-01 +PKER_SDRYG( 16, 41) = 0.854547E-01 +PKER_SDRYG( 16, 42) = 0.842616E-01 +PKER_SDRYG( 16, 43) = 0.855520E-01 +PKER_SDRYG( 16, 44) = 0.887781E-01 +PKER_SDRYG( 16, 45) = 0.933675E-01 +PKER_SDRYG( 16, 46) = 0.989218E-01 +PKER_SDRYG( 16, 47) = 0.105082E+00 +PKER_SDRYG( 16, 48) = 0.111617E+00 +PKER_SDRYG( 16, 49) = 0.118278E+00 +PKER_SDRYG( 16, 50) = 0.124959E+00 +PKER_SDRYG( 16, 51) = 0.131533E+00 +PKER_SDRYG( 16, 52) = 0.137923E+00 +PKER_SDRYG( 16, 53) = 0.144095E+00 +PKER_SDRYG( 16, 54) = 0.150006E+00 +PKER_SDRYG( 16, 55) = 0.155648E+00 +PKER_SDRYG( 16, 56) = 0.161010E+00 +PKER_SDRYG( 16, 57) = 0.166080E+00 +PKER_SDRYG( 16, 58) = 0.170856E+00 +PKER_SDRYG( 16, 59) = 0.175353E+00 +PKER_SDRYG( 16, 60) = 0.179587E+00 +PKER_SDRYG( 16, 61) = 0.183582E+00 +PKER_SDRYG( 16, 62) = 0.187351E+00 +PKER_SDRYG( 16, 63) = 0.190904E+00 +PKER_SDRYG( 16, 64) = 0.194247E+00 +PKER_SDRYG( 16, 65) = 0.197388E+00 +PKER_SDRYG( 16, 66) = 0.200335E+00 +PKER_SDRYG( 16, 67) = 0.203101E+00 +PKER_SDRYG( 16, 68) = 0.205696E+00 +PKER_SDRYG( 16, 69) = 0.208131E+00 +PKER_SDRYG( 16, 70) = 0.210416E+00 +PKER_SDRYG( 16, 71) = 0.212560E+00 +PKER_SDRYG( 16, 72) = 0.214573E+00 +PKER_SDRYG( 16, 73) = 0.216463E+00 +PKER_SDRYG( 16, 74) = 0.218237E+00 +PKER_SDRYG( 16, 75) = 0.219902E+00 +PKER_SDRYG( 16, 76) = 0.221465E+00 +PKER_SDRYG( 16, 77) = 0.222933E+00 +PKER_SDRYG( 16, 78) = 0.224310E+00 +PKER_SDRYG( 16, 79) = 0.225604E+00 +PKER_SDRYG( 16, 80) = 0.226819E+00 +PKER_SDRYG( 17, 1) = 0.304233E+01 +PKER_SDRYG( 17, 2) = 0.284980E+01 +PKER_SDRYG( 17, 3) = 0.266901E+01 +PKER_SDRYG( 17, 4) = 0.249924E+01 +PKER_SDRYG( 17, 5) = 0.233983E+01 +PKER_SDRYG( 17, 6) = 0.219014E+01 +PKER_SDRYG( 17, 7) = 0.204957E+01 +PKER_SDRYG( 17, 8) = 0.191757E+01 +PKER_SDRYG( 17, 9) = 0.179360E+01 +PKER_SDRYG( 17, 10) = 0.167718E+01 +PKER_SDRYG( 17, 11) = 0.156784E+01 +PKER_SDRYG( 17, 12) = 0.146515E+01 +PKER_SDRYG( 17, 13) = 0.136868E+01 +PKER_SDRYG( 17, 14) = 0.127807E+01 +PKER_SDRYG( 17, 15) = 0.119293E+01 +PKER_SDRYG( 17, 16) = 0.111293E+01 +PKER_SDRYG( 17, 17) = 0.103773E+01 +PKER_SDRYG( 17, 18) = 0.967037E+00 +PKER_SDRYG( 17, 19) = 0.900542E+00 +PKER_SDRYG( 17, 20) = 0.837966E+00 +PKER_SDRYG( 17, 21) = 0.779040E+00 +PKER_SDRYG( 17, 22) = 0.723501E+00 +PKER_SDRYG( 17, 23) = 0.671093E+00 +PKER_SDRYG( 17, 24) = 0.621566E+00 +PKER_SDRYG( 17, 25) = 0.574672E+00 +PKER_SDRYG( 17, 26) = 0.530159E+00 +PKER_SDRYG( 17, 27) = 0.487780E+00 +PKER_SDRYG( 17, 28) = 0.447283E+00 +PKER_SDRYG( 17, 29) = 0.408426E+00 +PKER_SDRYG( 17, 30) = 0.370984E+00 +PKER_SDRYG( 17, 31) = 0.334777E+00 +PKER_SDRYG( 17, 32) = 0.299703E+00 +PKER_SDRYG( 17, 33) = 0.265795E+00 +PKER_SDRYG( 17, 34) = 0.233237E+00 +PKER_SDRYG( 17, 35) = 0.202426E+00 +PKER_SDRYG( 17, 36) = 0.173914E+00 +PKER_SDRYG( 17, 37) = 0.148301E+00 +PKER_SDRYG( 17, 38) = 0.126202E+00 +PKER_SDRYG( 17, 39) = 0.107984E+00 +PKER_SDRYG( 17, 40) = 0.936873E-01 +PKER_SDRYG( 17, 41) = 0.833770E-01 +PKER_SDRYG( 17, 42) = 0.765063E-01 +PKER_SDRYG( 17, 43) = 0.727630E-01 +PKER_SDRYG( 17, 44) = 0.715986E-01 +PKER_SDRYG( 17, 45) = 0.724633E-01 +PKER_SDRYG( 17, 46) = 0.749323E-01 +PKER_SDRYG( 17, 47) = 0.785778E-01 +PKER_SDRYG( 17, 48) = 0.830719E-01 +PKER_SDRYG( 17, 49) = 0.881403E-01 +PKER_SDRYG( 17, 50) = 0.935486E-01 +PKER_SDRYG( 17, 51) = 0.991378E-01 +PKER_SDRYG( 17, 52) = 0.104781E+00 +PKER_SDRYG( 17, 53) = 0.110369E+00 +PKER_SDRYG( 17, 54) = 0.115842E+00 +PKER_SDRYG( 17, 55) = 0.121148E+00 +PKER_SDRYG( 17, 56) = 0.126252E+00 +PKER_SDRYG( 17, 57) = 0.131138E+00 +PKER_SDRYG( 17, 58) = 0.135801E+00 +PKER_SDRYG( 17, 59) = 0.140221E+00 +PKER_SDRYG( 17, 60) = 0.144398E+00 +PKER_SDRYG( 17, 61) = 0.148334E+00 +PKER_SDRYG( 17, 62) = 0.152044E+00 +PKER_SDRYG( 17, 63) = 0.155543E+00 +PKER_SDRYG( 17, 64) = 0.158847E+00 +PKER_SDRYG( 17, 65) = 0.161964E+00 +PKER_SDRYG( 17, 66) = 0.164902E+00 +PKER_SDRYG( 17, 67) = 0.167664E+00 +PKER_SDRYG( 17, 68) = 0.170259E+00 +PKER_SDRYG( 17, 69) = 0.172695E+00 +PKER_SDRYG( 17, 70) = 0.174981E+00 +PKER_SDRYG( 17, 71) = 0.177126E+00 +PKER_SDRYG( 17, 72) = 0.179139E+00 +PKER_SDRYG( 17, 73) = 0.181029E+00 +PKER_SDRYG( 17, 74) = 0.182803E+00 +PKER_SDRYG( 17, 75) = 0.184468E+00 +PKER_SDRYG( 17, 76) = 0.186032E+00 +PKER_SDRYG( 17, 77) = 0.187499E+00 +PKER_SDRYG( 17, 78) = 0.188877E+00 +PKER_SDRYG( 17, 79) = 0.190171E+00 +PKER_SDRYG( 17, 80) = 0.191386E+00 +PKER_SDRYG( 18, 1) = 0.305861E+01 +PKER_SDRYG( 18, 2) = 0.286609E+01 +PKER_SDRYG( 18, 3) = 0.268530E+01 +PKER_SDRYG( 18, 4) = 0.251555E+01 +PKER_SDRYG( 18, 5) = 0.235614E+01 +PKER_SDRYG( 18, 6) = 0.220646E+01 +PKER_SDRYG( 18, 7) = 0.206590E+01 +PKER_SDRYG( 18, 8) = 0.193391E+01 +PKER_SDRYG( 18, 9) = 0.180996E+01 +PKER_SDRYG( 18, 10) = 0.169356E+01 +PKER_SDRYG( 18, 11) = 0.158425E+01 +PKER_SDRYG( 18, 12) = 0.148158E+01 +PKER_SDRYG( 18, 13) = 0.138516E+01 +PKER_SDRYG( 18, 14) = 0.129459E+01 +PKER_SDRYG( 18, 15) = 0.120951E+01 +PKER_SDRYG( 18, 16) = 0.112957E+01 +PKER_SDRYG( 18, 17) = 0.105446E+01 +PKER_SDRYG( 18, 18) = 0.983869E+00 +PKER_SDRYG( 18, 19) = 0.917502E+00 +PKER_SDRYG( 18, 20) = 0.855084E+00 +PKER_SDRYG( 18, 21) = 0.796353E+00 +PKER_SDRYG( 18, 22) = 0.741055E+00 +PKER_SDRYG( 18, 23) = 0.688947E+00 +PKER_SDRYG( 18, 24) = 0.639789E+00 +PKER_SDRYG( 18, 25) = 0.593351E+00 +PKER_SDRYG( 18, 26) = 0.549400E+00 +PKER_SDRYG( 18, 27) = 0.507707E+00 +PKER_SDRYG( 18, 28) = 0.468042E+00 +PKER_SDRYG( 18, 29) = 0.430173E+00 +PKER_SDRYG( 18, 30) = 0.393871E+00 +PKER_SDRYG( 18, 31) = 0.358924E+00 +PKER_SDRYG( 18, 32) = 0.325148E+00 +PKER_SDRYG( 18, 33) = 0.292420E+00 +PKER_SDRYG( 18, 34) = 0.260716E+00 +PKER_SDRYG( 18, 35) = 0.230147E+00 +PKER_SDRYG( 18, 36) = 0.200989E+00 +PKER_SDRYG( 18, 37) = 0.173670E+00 +PKER_SDRYG( 18, 38) = 0.148685E+00 +PKER_SDRYG( 18, 39) = 0.126560E+00 +PKER_SDRYG( 18, 40) = 0.107668E+00 +PKER_SDRYG( 18, 41) = 0.921800E-01 +PKER_SDRYG( 18, 42) = 0.801537E-01 +PKER_SDRYG( 18, 43) = 0.713567E-01 +PKER_SDRYG( 18, 44) = 0.654782E-01 +PKER_SDRYG( 18, 45) = 0.621068E-01 +PKER_SDRYG( 18, 46) = 0.608901E-01 +PKER_SDRYG( 18, 47) = 0.613554E-01 +PKER_SDRYG( 18, 48) = 0.631511E-01 +PKER_SDRYG( 18, 49) = 0.660247E-01 +PKER_SDRYG( 18, 50) = 0.696433E-01 +PKER_SDRYG( 18, 51) = 0.737836E-01 +PKER_SDRYG( 18, 52) = 0.782701E-01 +PKER_SDRYG( 18, 53) = 0.829722E-01 +PKER_SDRYG( 18, 54) = 0.877276E-01 +PKER_SDRYG( 18, 55) = 0.924938E-01 +PKER_SDRYG( 18, 56) = 0.971825E-01 +PKER_SDRYG( 18, 57) = 0.101744E+00 +PKER_SDRYG( 18, 58) = 0.106160E+00 +PKER_SDRYG( 18, 59) = 0.110397E+00 +PKER_SDRYG( 18, 60) = 0.114449E+00 +PKER_SDRYG( 18, 61) = 0.118307E+00 +PKER_SDRYG( 18, 62) = 0.121962E+00 +PKER_SDRYG( 18, 63) = 0.125411E+00 +PKER_SDRYG( 18, 64) = 0.128663E+00 +PKER_SDRYG( 18, 65) = 0.131730E+00 +PKER_SDRYG( 18, 66) = 0.134628E+00 +PKER_SDRYG( 18, 67) = 0.137364E+00 +PKER_SDRYG( 18, 68) = 0.139945E+00 +PKER_SDRYG( 18, 69) = 0.142375E+00 +PKER_SDRYG( 18, 70) = 0.144660E+00 +PKER_SDRYG( 18, 71) = 0.146805E+00 +PKER_SDRYG( 18, 72) = 0.148819E+00 +PKER_SDRYG( 18, 73) = 0.150709E+00 +PKER_SDRYG( 18, 74) = 0.152483E+00 +PKER_SDRYG( 18, 75) = 0.154149E+00 +PKER_SDRYG( 18, 76) = 0.155712E+00 +PKER_SDRYG( 18, 77) = 0.157180E+00 +PKER_SDRYG( 18, 78) = 0.158558E+00 +PKER_SDRYG( 18, 79) = 0.159852E+00 +PKER_SDRYG( 18, 80) = 0.161067E+00 +PKER_SDRYG( 19, 1) = 0.307255E+01 +PKER_SDRYG( 19, 2) = 0.288003E+01 +PKER_SDRYG( 19, 3) = 0.269925E+01 +PKER_SDRYG( 19, 4) = 0.252949E+01 +PKER_SDRYG( 19, 5) = 0.237010E+01 +PKER_SDRYG( 19, 6) = 0.222042E+01 +PKER_SDRYG( 19, 7) = 0.207987E+01 +PKER_SDRYG( 19, 8) = 0.194789E+01 +PKER_SDRYG( 19, 9) = 0.182395E+01 +PKER_SDRYG( 19, 10) = 0.170757E+01 +PKER_SDRYG( 19, 11) = 0.159827E+01 +PKER_SDRYG( 19, 12) = 0.149563E+01 +PKER_SDRYG( 19, 13) = 0.139923E+01 +PKER_SDRYG( 19, 14) = 0.130869E+01 +PKER_SDRYG( 19, 15) = 0.122365E+01 +PKER_SDRYG( 19, 16) = 0.114377E+01 +PKER_SDRYG( 19, 17) = 0.106872E+01 +PKER_SDRYG( 19, 18) = 0.998202E+00 +PKER_SDRYG( 19, 19) = 0.931926E+00 +PKER_SDRYG( 19, 20) = 0.869623E+00 +PKER_SDRYG( 19, 21) = 0.811031E+00 +PKER_SDRYG( 19, 22) = 0.755906E+00 +PKER_SDRYG( 19, 23) = 0.704011E+00 +PKER_SDRYG( 19, 24) = 0.655117E+00 +PKER_SDRYG( 19, 25) = 0.609004E+00 +PKER_SDRYG( 19, 26) = 0.565455E+00 +PKER_SDRYG( 19, 27) = 0.524258E+00 +PKER_SDRYG( 19, 28) = 0.485199E+00 +PKER_SDRYG( 19, 29) = 0.448065E+00 +PKER_SDRYG( 19, 30) = 0.412644E+00 +PKER_SDRYG( 19, 31) = 0.378726E+00 +PKER_SDRYG( 19, 32) = 0.346109E+00 +PKER_SDRYG( 19, 33) = 0.314617E+00 +PKER_SDRYG( 19, 34) = 0.284120E+00 +PKER_SDRYG( 19, 35) = 0.254566E+00 +PKER_SDRYG( 19, 36) = 0.226009E+00 +PKER_SDRYG( 19, 37) = 0.198643E+00 +PKER_SDRYG( 19, 38) = 0.172786E+00 +PKER_SDRYG( 19, 39) = 0.148830E+00 +PKER_SDRYG( 19, 40) = 0.127216E+00 +PKER_SDRYG( 19, 41) = 0.108286E+00 +PKER_SDRYG( 19, 42) = 0.922237E-01 +PKER_SDRYG( 19, 43) = 0.791616E-01 +PKER_SDRYG( 19, 44) = 0.689769E-01 +PKER_SDRYG( 19, 45) = 0.613748E-01 +PKER_SDRYG( 19, 46) = 0.562746E-01 +PKER_SDRYG( 19, 47) = 0.531554E-01 +PKER_SDRYG( 19, 48) = 0.518361E-01 +PKER_SDRYG( 19, 49) = 0.519775E-01 +PKER_SDRYG( 19, 50) = 0.532667E-01 +PKER_SDRYG( 19, 51) = 0.554628E-01 +PKER_SDRYG( 19, 52) = 0.583379E-01 +PKER_SDRYG( 19, 53) = 0.617174E-01 +PKER_SDRYG( 19, 54) = 0.654271E-01 +PKER_SDRYG( 19, 55) = 0.693467E-01 +PKER_SDRYG( 19, 56) = 0.733724E-01 +PKER_SDRYG( 19, 57) = 0.774227E-01 +PKER_SDRYG( 19, 58) = 0.814369E-01 +PKER_SDRYG( 19, 59) = 0.853677E-01 +PKER_SDRYG( 19, 60) = 0.891824E-01 +PKER_SDRYG( 19, 61) = 0.928586E-01 +PKER_SDRYG( 19, 62) = 0.963820E-01 +PKER_SDRYG( 19, 63) = 0.997497E-01 +PKER_SDRYG( 19, 64) = 0.102946E+00 +PKER_SDRYG( 19, 65) = 0.105969E+00 +PKER_SDRYG( 19, 66) = 0.108823E+00 +PKER_SDRYG( 19, 67) = 0.111515E+00 +PKER_SDRYG( 19, 68) = 0.114057E+00 +PKER_SDRYG( 19, 69) = 0.116458E+00 +PKER_SDRYG( 19, 70) = 0.118726E+00 +PKER_SDRYG( 19, 71) = 0.120863E+00 +PKER_SDRYG( 19, 72) = 0.122875E+00 +PKER_SDRYG( 19, 73) = 0.124765E+00 +PKER_SDRYG( 19, 74) = 0.126539E+00 +PKER_SDRYG( 19, 75) = 0.128205E+00 +PKER_SDRYG( 19, 76) = 0.129769E+00 +PKER_SDRYG( 19, 77) = 0.131237E+00 +PKER_SDRYG( 19, 78) = 0.132615E+00 +PKER_SDRYG( 19, 79) = 0.133909E+00 +PKER_SDRYG( 19, 80) = 0.135123E+00 +PKER_SDRYG( 20, 1) = 0.308447E+01 +PKER_SDRYG( 20, 2) = 0.289195E+01 +PKER_SDRYG( 20, 3) = 0.271117E+01 +PKER_SDRYG( 20, 4) = 0.254143E+01 +PKER_SDRYG( 20, 5) = 0.238203E+01 +PKER_SDRYG( 20, 6) = 0.223236E+01 +PKER_SDRYG( 20, 7) = 0.209182E+01 +PKER_SDRYG( 20, 8) = 0.195984E+01 +PKER_SDRYG( 20, 9) = 0.183591E+01 +PKER_SDRYG( 20, 10) = 0.171954E+01 +PKER_SDRYG( 20, 11) = 0.161026E+01 +PKER_SDRYG( 20, 12) = 0.150763E+01 +PKER_SDRYG( 20, 13) = 0.141126E+01 +PKER_SDRYG( 20, 14) = 0.132074E+01 +PKER_SDRYG( 20, 15) = 0.123573E+01 +PKER_SDRYG( 20, 16) = 0.115588E+01 +PKER_SDRYG( 20, 17) = 0.108088E+01 +PKER_SDRYG( 20, 18) = 0.101042E+01 +PKER_SDRYG( 20, 19) = 0.944207E+00 +PKER_SDRYG( 20, 20) = 0.881986E+00 +PKER_SDRYG( 20, 21) = 0.823495E+00 +PKER_SDRYG( 20, 22) = 0.768494E+00 +PKER_SDRYG( 20, 23) = 0.716752E+00 +PKER_SDRYG( 20, 24) = 0.668047E+00 +PKER_SDRYG( 20, 25) = 0.622167E+00 +PKER_SDRYG( 20, 26) = 0.578906E+00 +PKER_SDRYG( 20, 27) = 0.538063E+00 +PKER_SDRYG( 20, 28) = 0.499440E+00 +PKER_SDRYG( 20, 29) = 0.462841E+00 +PKER_SDRYG( 20, 30) = 0.428070E+00 +PKER_SDRYG( 20, 31) = 0.394930E+00 +PKER_SDRYG( 20, 32) = 0.363228E+00 +PKER_SDRYG( 20, 33) = 0.332779E+00 +PKER_SDRYG( 20, 34) = 0.303417E+00 +PKER_SDRYG( 20, 35) = 0.275014E+00 +PKER_SDRYG( 20, 36) = 0.247503E+00 +PKER_SDRYG( 20, 37) = 0.220909E+00 +PKER_SDRYG( 20, 38) = 0.195362E+00 +PKER_SDRYG( 20, 39) = 0.171100E+00 +PKER_SDRYG( 20, 40) = 0.148434E+00 +PKER_SDRYG( 20, 41) = 0.127703E+00 +PKER_SDRYG( 20, 42) = 0.109201E+00 +PKER_SDRYG( 20, 43) = 0.931127E-01 +PKER_SDRYG( 20, 44) = 0.795450E-01 +PKER_SDRYG( 20, 45) = 0.684619E-01 +PKER_SDRYG( 20, 46) = 0.597138E-01 +PKER_SDRYG( 20, 47) = 0.531640E-01 +PKER_SDRYG( 20, 48) = 0.485713E-01 +PKER_SDRYG( 20, 49) = 0.457023E-01 +PKER_SDRYG( 20, 50) = 0.442778E-01 +PKER_SDRYG( 20, 51) = 0.441239E-01 +PKER_SDRYG( 20, 52) = 0.449550E-01 +PKER_SDRYG( 20, 53) = 0.465614E-01 +PKER_SDRYG( 20, 54) = 0.488440E-01 +PKER_SDRYG( 20, 55) = 0.515730E-01 +PKER_SDRYG( 20, 56) = 0.546214E-01 +PKER_SDRYG( 20, 57) = 0.578936E-01 +PKER_SDRYG( 20, 58) = 0.612990E-01 +PKER_SDRYG( 20, 59) = 0.647325E-01 +PKER_SDRYG( 20, 60) = 0.681741E-01 +PKER_SDRYG( 20, 61) = 0.715569E-01 +PKER_SDRYG( 20, 62) = 0.748508E-01 +PKER_SDRYG( 20, 63) = 0.780435E-01 +PKER_SDRYG( 20, 64) = 0.811089E-01 +PKER_SDRYG( 20, 65) = 0.840439E-01 +PKER_SDRYG( 20, 66) = 0.868407E-01 +PKER_SDRYG( 20, 67) = 0.894925E-01 +PKER_SDRYG( 20, 68) = 0.919967E-01 +PKER_SDRYG( 20, 69) = 0.943597E-01 +PKER_SDRYG( 20, 70) = 0.965903E-01 +PKER_SDRYG( 20, 71) = 0.986983E-01 +PKER_SDRYG( 20, 72) = 0.100690E+00 +PKER_SDRYG( 20, 73) = 0.102570E+00 +PKER_SDRYG( 20, 74) = 0.104341E+00 +PKER_SDRYG( 20, 75) = 0.106005E+00 +PKER_SDRYG( 20, 76) = 0.107569E+00 +PKER_SDRYG( 20, 77) = 0.109037E+00 +PKER_SDRYG( 20, 78) = 0.110416E+00 +PKER_SDRYG( 20, 79) = 0.111710E+00 +PKER_SDRYG( 20, 80) = 0.112924E+00 +PKER_SDRYG( 21, 1) = 0.309467E+01 +PKER_SDRYG( 21, 2) = 0.290215E+01 +PKER_SDRYG( 21, 3) = 0.272138E+01 +PKER_SDRYG( 21, 4) = 0.255163E+01 +PKER_SDRYG( 21, 5) = 0.239224E+01 +PKER_SDRYG( 21, 6) = 0.224257E+01 +PKER_SDRYG( 21, 7) = 0.210203E+01 +PKER_SDRYG( 21, 8) = 0.197007E+01 +PKER_SDRYG( 21, 9) = 0.184615E+01 +PKER_SDRYG( 21, 10) = 0.172978E+01 +PKER_SDRYG( 21, 11) = 0.162051E+01 +PKER_SDRYG( 21, 12) = 0.151789E+01 +PKER_SDRYG( 21, 13) = 0.142153E+01 +PKER_SDRYG( 21, 14) = 0.133104E+01 +PKER_SDRYG( 21, 15) = 0.124605E+01 +PKER_SDRYG( 21, 16) = 0.116623E+01 +PKER_SDRYG( 21, 17) = 0.109126E+01 +PKER_SDRYG( 21, 18) = 0.102083E+01 +PKER_SDRYG( 21, 19) = 0.954672E+00 +PKER_SDRYG( 21, 20) = 0.892510E+00 +PKER_SDRYG( 21, 21) = 0.834093E+00 +PKER_SDRYG( 21, 22) = 0.779182E+00 +PKER_SDRYG( 21, 23) = 0.727550E+00 +PKER_SDRYG( 21, 24) = 0.678981E+00 +PKER_SDRYG( 21, 25) = 0.633268E+00 +PKER_SDRYG( 21, 26) = 0.590214E+00 +PKER_SDRYG( 21, 27) = 0.549625E+00 +PKER_SDRYG( 21, 28) = 0.511316E+00 +PKER_SDRYG( 21, 29) = 0.475102E+00 +PKER_SDRYG( 21, 30) = 0.440802E+00 +PKER_SDRYG( 21, 31) = 0.408235E+00 +PKER_SDRYG( 21, 32) = 0.377220E+00 +PKER_SDRYG( 21, 33) = 0.347581E+00 +PKER_SDRYG( 21, 34) = 0.319145E+00 +PKER_SDRYG( 21, 35) = 0.291760E+00 +PKER_SDRYG( 21, 36) = 0.265305E+00 +PKER_SDRYG( 21, 37) = 0.239708E+00 +PKER_SDRYG( 21, 38) = 0.214974E+00 +PKER_SDRYG( 21, 39) = 0.191196E+00 +PKER_SDRYG( 21, 40) = 0.168553E+00 +PKER_SDRYG( 21, 41) = 0.147284E+00 +PKER_SDRYG( 21, 42) = 0.127658E+00 +PKER_SDRYG( 21, 43) = 0.109904E+00 +PKER_SDRYG( 21, 44) = 0.941689E-01 +PKER_SDRYG( 21, 45) = 0.805651E-01 +PKER_SDRYG( 21, 46) = 0.690716E-01 +PKER_SDRYG( 21, 47) = 0.595900E-01 +PKER_SDRYG( 21, 48) = 0.520709E-01 +PKER_SDRYG( 21, 49) = 0.463366E-01 +PKER_SDRYG( 21, 50) = 0.421453E-01 +PKER_SDRYG( 21, 51) = 0.394599E-01 +PKER_SDRYG( 21, 52) = 0.379410E-01 +PKER_SDRYG( 21, 53) = 0.375222E-01 +PKER_SDRYG( 21, 54) = 0.379878E-01 +PKER_SDRYG( 21, 55) = 0.391684E-01 +PKER_SDRYG( 21, 56) = 0.409134E-01 +PKER_SDRYG( 21, 57) = 0.430879E-01 +PKER_SDRYG( 21, 58) = 0.455943E-01 +PKER_SDRYG( 21, 59) = 0.483097E-01 +PKER_SDRYG( 21, 60) = 0.511611E-01 +PKER_SDRYG( 21, 61) = 0.540832E-01 +PKER_SDRYG( 21, 62) = 0.570182E-01 +PKER_SDRYG( 21, 63) = 0.599262E-01 +PKER_SDRYG( 21, 64) = 0.627739E-01 +PKER_SDRYG( 21, 65) = 0.655385E-01 +PKER_SDRYG( 21, 66) = 0.682053E-01 +PKER_SDRYG( 21, 67) = 0.707625E-01 +PKER_SDRYG( 21, 68) = 0.732087E-01 +PKER_SDRYG( 21, 69) = 0.755315E-01 +PKER_SDRYG( 21, 70) = 0.777294E-01 +PKER_SDRYG( 21, 71) = 0.798052E-01 +PKER_SDRYG( 21, 72) = 0.817651E-01 +PKER_SDRYG( 21, 73) = 0.836157E-01 +PKER_SDRYG( 21, 74) = 0.853654E-01 +PKER_SDRYG( 21, 75) = 0.870178E-01 +PKER_SDRYG( 21, 76) = 0.885760E-01 +PKER_SDRYG( 21, 77) = 0.900423E-01 +PKER_SDRYG( 21, 78) = 0.914203E-01 +PKER_SDRYG( 21, 79) = 0.927143E-01 +PKER_SDRYG( 21, 80) = 0.939293E-01 +PKER_SDRYG( 22, 1) = 0.310340E+01 +PKER_SDRYG( 22, 2) = 0.291088E+01 +PKER_SDRYG( 22, 3) = 0.273011E+01 +PKER_SDRYG( 22, 4) = 0.256036E+01 +PKER_SDRYG( 22, 5) = 0.240098E+01 +PKER_SDRYG( 22, 6) = 0.225131E+01 +PKER_SDRYG( 22, 7) = 0.211078E+01 +PKER_SDRYG( 22, 8) = 0.197881E+01 +PKER_SDRYG( 22, 9) = 0.185490E+01 +PKER_SDRYG( 22, 10) = 0.173854E+01 +PKER_SDRYG( 22, 11) = 0.162927E+01 +PKER_SDRYG( 22, 12) = 0.152667E+01 +PKER_SDRYG( 22, 13) = 0.143032E+01 +PKER_SDRYG( 22, 14) = 0.133984E+01 +PKER_SDRYG( 22, 15) = 0.125486E+01 +PKER_SDRYG( 22, 16) = 0.117506E+01 +PKER_SDRYG( 22, 17) = 0.110011E+01 +PKER_SDRYG( 22, 18) = 0.102972E+01 +PKER_SDRYG( 22, 19) = 0.963596E+00 +PKER_SDRYG( 22, 20) = 0.901477E+00 +PKER_SDRYG( 22, 21) = 0.843114E+00 +PKER_SDRYG( 22, 22) = 0.788268E+00 +PKER_SDRYG( 22, 23) = 0.736716E+00 +PKER_SDRYG( 22, 24) = 0.688246E+00 +PKER_SDRYG( 22, 25) = 0.642654E+00 +PKER_SDRYG( 22, 26) = 0.599749E+00 +PKER_SDRYG( 22, 27) = 0.559343E+00 +PKER_SDRYG( 22, 28) = 0.521260E+00 +PKER_SDRYG( 22, 29) = 0.485324E+00 +PKER_SDRYG( 22, 30) = 0.451364E+00 +PKER_SDRYG( 22, 31) = 0.419213E+00 +PKER_SDRYG( 22, 32) = 0.388704E+00 +PKER_SDRYG( 22, 33) = 0.359670E+00 +PKER_SDRYG( 22, 34) = 0.331948E+00 +PKER_SDRYG( 22, 35) = 0.305382E+00 +PKER_SDRYG( 22, 36) = 0.279831E+00 +PKER_SDRYG( 22, 37) = 0.255180E+00 +PKER_SDRYG( 22, 38) = 0.231361E+00 +PKER_SDRYG( 22, 39) = 0.208367E+00 +PKER_SDRYG( 22, 40) = 0.186266E+00 +PKER_SDRYG( 22, 41) = 0.165198E+00 +PKER_SDRYG( 22, 42) = 0.145353E+00 +PKER_SDRYG( 22, 43) = 0.126934E+00 +PKER_SDRYG( 22, 44) = 0.110117E+00 +PKER_SDRYG( 22, 45) = 0.950242E-01 +PKER_SDRYG( 22, 46) = 0.817187E-01 +PKER_SDRYG( 22, 47) = 0.701989E-01 +PKER_SDRYG( 22, 48) = 0.604077E-01 +PKER_SDRYG( 22, 49) = 0.522862E-01 +PKER_SDRYG( 22, 50) = 0.457355E-01 +PKER_SDRYG( 22, 51) = 0.406096E-01 +PKER_SDRYG( 22, 52) = 0.368134E-01 +PKER_SDRYG( 22, 53) = 0.342156E-01 +PKER_SDRYG( 22, 54) = 0.326793E-01 +PKER_SDRYG( 22, 55) = 0.320323E-01 +PKER_SDRYG( 22, 56) = 0.321937E-01 +PKER_SDRYG( 22, 57) = 0.329850E-01 +PKER_SDRYG( 22, 58) = 0.342698E-01 +PKER_SDRYG( 22, 59) = 0.360064E-01 +PKER_SDRYG( 22, 60) = 0.380365E-01 +PKER_SDRYG( 22, 61) = 0.402760E-01 +PKER_SDRYG( 22, 62) = 0.426662E-01 +PKER_SDRYG( 22, 63) = 0.451444E-01 +PKER_SDRYG( 22, 64) = 0.476417E-01 +PKER_SDRYG( 22, 65) = 0.501412E-01 +PKER_SDRYG( 22, 66) = 0.525978E-01 +PKER_SDRYG( 22, 67) = 0.549924E-01 +PKER_SDRYG( 22, 68) = 0.573119E-01 +PKER_SDRYG( 22, 69) = 0.595407E-01 +PKER_SDRYG( 22, 70) = 0.616759E-01 +PKER_SDRYG( 22, 71) = 0.637106E-01 +PKER_SDRYG( 22, 72) = 0.656407E-01 +PKER_SDRYG( 22, 73) = 0.674641E-01 +PKER_SDRYG( 22, 74) = 0.691851E-01 +PKER_SDRYG( 22, 75) = 0.708107E-01 +PKER_SDRYG( 22, 76) = 0.723473E-01 +PKER_SDRYG( 22, 77) = 0.737996E-01 +PKER_SDRYG( 22, 78) = 0.751703E-01 +PKER_SDRYG( 22, 79) = 0.764615E-01 +PKER_SDRYG( 22, 80) = 0.776757E-01 +PKER_SDRYG( 23, 1) = 0.311087E+01 +PKER_SDRYG( 23, 2) = 0.291835E+01 +PKER_SDRYG( 23, 3) = 0.273758E+01 +PKER_SDRYG( 23, 4) = 0.256784E+01 +PKER_SDRYG( 23, 5) = 0.240845E+01 +PKER_SDRYG( 23, 6) = 0.225879E+01 +PKER_SDRYG( 23, 7) = 0.211825E+01 +PKER_SDRYG( 23, 8) = 0.198629E+01 +PKER_SDRYG( 23, 9) = 0.186238E+01 +PKER_SDRYG( 23, 10) = 0.174603E+01 +PKER_SDRYG( 23, 11) = 0.163677E+01 +PKER_SDRYG( 23, 12) = 0.153417E+01 +PKER_SDRYG( 23, 13) = 0.143783E+01 +PKER_SDRYG( 23, 14) = 0.134736E+01 +PKER_SDRYG( 23, 15) = 0.126240E+01 +PKER_SDRYG( 23, 16) = 0.118261E+01 +PKER_SDRYG( 23, 17) = 0.110768E+01 +PKER_SDRYG( 23, 18) = 0.103731E+01 +PKER_SDRYG( 23, 19) = 0.971209E+00 +PKER_SDRYG( 23, 20) = 0.909123E+00 +PKER_SDRYG( 23, 21) = 0.850799E+00 +PKER_SDRYG( 23, 22) = 0.796001E+00 +PKER_SDRYG( 23, 23) = 0.744508E+00 +PKER_SDRYG( 23, 24) = 0.696109E+00 +PKER_SDRYG( 23, 25) = 0.650606E+00 +PKER_SDRYG( 23, 26) = 0.607808E+00 +PKER_SDRYG( 23, 27) = 0.567535E+00 +PKER_SDRYG( 23, 28) = 0.529615E+00 +PKER_SDRYG( 23, 29) = 0.493879E+00 +PKER_SDRYG( 23, 30) = 0.460166E+00 +PKER_SDRYG( 23, 31) = 0.428317E+00 +PKER_SDRYG( 23, 32) = 0.398176E+00 +PKER_SDRYG( 23, 33) = 0.369589E+00 +PKER_SDRYG( 23, 34) = 0.342402E+00 +PKER_SDRYG( 23, 35) = 0.316466E+00 +PKER_SDRYG( 23, 36) = 0.291637E+00 +PKER_SDRYG( 23, 37) = 0.267784E+00 +PKER_SDRYG( 23, 38) = 0.244803E+00 +PKER_SDRYG( 23, 39) = 0.222628E+00 +PKER_SDRYG( 23, 40) = 0.201247E+00 +PKER_SDRYG( 23, 41) = 0.180713E+00 +PKER_SDRYG( 23, 42) = 0.161137E+00 +PKER_SDRYG( 23, 43) = 0.142671E+00 +PKER_SDRYG( 23, 44) = 0.125476E+00 +PKER_SDRYG( 23, 45) = 0.109687E+00 +PKER_SDRYG( 23, 46) = 0.953871E-01 +PKER_SDRYG( 23, 47) = 0.826169E-01 +PKER_SDRYG( 23, 48) = 0.713617E-01 +PKER_SDRYG( 23, 49) = 0.615668E-01 +PKER_SDRYG( 23, 50) = 0.531991E-01 +PKER_SDRYG( 23, 51) = 0.461730E-01 +PKER_SDRYG( 23, 52) = 0.403882E-01 +PKER_SDRYG( 23, 53) = 0.358096E-01 +PKER_SDRYG( 23, 54) = 0.323398E-01 +PKER_SDRYG( 23, 55) = 0.298278E-01 +PKER_SDRYG( 23, 56) = 0.282645E-01 +PKER_SDRYG( 23, 57) = 0.274478E-01 +PKER_SDRYG( 23, 58) = 0.273472E-01 +PKER_SDRYG( 23, 59) = 0.278235E-01 +PKER_SDRYG( 23, 60) = 0.287808E-01 +PKER_SDRYG( 23, 61) = 0.301115E-01 +PKER_SDRYG( 23, 62) = 0.317312E-01 +PKER_SDRYG( 23, 63) = 0.335818E-01 +PKER_SDRYG( 23, 64) = 0.355711E-01 +PKER_SDRYG( 23, 65) = 0.376525E-01 +PKER_SDRYG( 23, 66) = 0.397832E-01 +PKER_SDRYG( 23, 67) = 0.419209E-01 +PKER_SDRYG( 23, 68) = 0.440372E-01 +PKER_SDRYG( 23, 69) = 0.461097E-01 +PKER_SDRYG( 23, 70) = 0.481216E-01 +PKER_SDRYG( 23, 71) = 0.500634E-01 +PKER_SDRYG( 23, 72) = 0.519255E-01 +PKER_SDRYG( 23, 73) = 0.537073E-01 +PKER_SDRYG( 23, 74) = 0.553996E-01 +PKER_SDRYG( 23, 75) = 0.570010E-01 +PKER_SDRYG( 23, 76) = 0.585138E-01 +PKER_SDRYG( 23, 77) = 0.599425E-01 +PKER_SDRYG( 23, 78) = 0.612921E-01 +PKER_SDRYG( 23, 79) = 0.625682E-01 +PKER_SDRYG( 23, 80) = 0.637735E-01 +PKER_SDRYG( 24, 1) = 0.311725E+01 +PKER_SDRYG( 24, 2) = 0.292474E+01 +PKER_SDRYG( 24, 3) = 0.274397E+01 +PKER_SDRYG( 24, 4) = 0.257423E+01 +PKER_SDRYG( 24, 5) = 0.241484E+01 +PKER_SDRYG( 24, 6) = 0.226518E+01 +PKER_SDRYG( 24, 7) = 0.212465E+01 +PKER_SDRYG( 24, 8) = 0.199269E+01 +PKER_SDRYG( 24, 9) = 0.186878E+01 +PKER_SDRYG( 24, 10) = 0.175243E+01 +PKER_SDRYG( 24, 11) = 0.164318E+01 +PKER_SDRYG( 24, 12) = 0.154059E+01 +PKER_SDRYG( 24, 13) = 0.144425E+01 +PKER_SDRYG( 24, 14) = 0.135379E+01 +PKER_SDRYG( 24, 15) = 0.126883E+01 +PKER_SDRYG( 24, 16) = 0.118906E+01 +PKER_SDRYG( 24, 17) = 0.111414E+01 +PKER_SDRYG( 24, 18) = 0.104379E+01 +PKER_SDRYG( 24, 19) = 0.977708E+00 +PKER_SDRYG( 24, 20) = 0.915646E+00 +PKER_SDRYG( 24, 21) = 0.857350E+00 +PKER_SDRYG( 24, 22) = 0.802588E+00 +PKER_SDRYG( 24, 23) = 0.751138E+00 +PKER_SDRYG( 24, 24) = 0.702792E+00 +PKER_SDRYG( 24, 25) = 0.657353E+00 +PKER_SDRYG( 24, 26) = 0.614634E+00 +PKER_SDRYG( 24, 27) = 0.574458E+00 +PKER_SDRYG( 24, 28) = 0.536656E+00 +PKER_SDRYG( 24, 29) = 0.501065E+00 +PKER_SDRYG( 24, 30) = 0.467530E+00 +PKER_SDRYG( 24, 31) = 0.435900E+00 +PKER_SDRYG( 24, 32) = 0.406028E+00 +PKER_SDRYG( 24, 33) = 0.377767E+00 +PKER_SDRYG( 24, 34) = 0.350976E+00 +PKER_SDRYG( 24, 35) = 0.325513E+00 +PKER_SDRYG( 24, 36) = 0.301240E+00 +PKER_SDRYG( 24, 37) = 0.278025E+00 +PKER_SDRYG( 24, 38) = 0.255748E+00 +PKER_SDRYG( 24, 39) = 0.234312E+00 +PKER_SDRYG( 24, 40) = 0.213656E+00 +PKER_SDRYG( 24, 41) = 0.193765E+00 +PKER_SDRYG( 24, 42) = 0.174681E+00 +PKER_SDRYG( 24, 43) = 0.156497E+00 +PKER_SDRYG( 24, 44) = 0.139338E+00 +PKER_SDRYG( 24, 45) = 0.123333E+00 +PKER_SDRYG( 24, 46) = 0.108586E+00 +PKER_SDRYG( 24, 47) = 0.951564E-01 +PKER_SDRYG( 24, 48) = 0.830549E-01 +PKER_SDRYG( 24, 49) = 0.722530E-01 +PKER_SDRYG( 24, 50) = 0.627027E-01 +PKER_SDRYG( 24, 51) = 0.543516E-01 +PKER_SDRYG( 24, 52) = 0.471379E-01 +PKER_SDRYG( 24, 53) = 0.410008E-01 +PKER_SDRYG( 24, 54) = 0.358942E-01 +PKER_SDRYG( 24, 55) = 0.317729E-01 +PKER_SDRYG( 24, 56) = 0.285445E-01 +PKER_SDRYG( 24, 57) = 0.261582E-01 +PKER_SDRYG( 24, 58) = 0.245542E-01 +PKER_SDRYG( 24, 59) = 0.236475E-01 +PKER_SDRYG( 24, 60) = 0.233281E-01 +PKER_SDRYG( 24, 61) = 0.235527E-01 +PKER_SDRYG( 24, 62) = 0.242044E-01 +PKER_SDRYG( 24, 63) = 0.251935E-01 +PKER_SDRYG( 24, 64) = 0.264894E-01 +PKER_SDRYG( 24, 65) = 0.279912E-01 +PKER_SDRYG( 24, 66) = 0.296368E-01 +PKER_SDRYG( 24, 67) = 0.313850E-01 +PKER_SDRYG( 24, 68) = 0.331947E-01 +PKER_SDRYG( 24, 69) = 0.350172E-01 +PKER_SDRYG( 24, 70) = 0.368385E-01 +PKER_SDRYG( 24, 71) = 0.386288E-01 +PKER_SDRYG( 24, 72) = 0.403749E-01 +PKER_SDRYG( 24, 73) = 0.420647E-01 +PKER_SDRYG( 24, 74) = 0.436892E-01 +PKER_SDRYG( 24, 75) = 0.452460E-01 +PKER_SDRYG( 24, 76) = 0.467291E-01 +PKER_SDRYG( 24, 77) = 0.481362E-01 +PKER_SDRYG( 24, 78) = 0.494656E-01 +PKER_SDRYG( 24, 79) = 0.507207E-01 +PKER_SDRYG( 24, 80) = 0.519066E-01 +PKER_SDRYG( 25, 1) = 0.312272E+01 +PKER_SDRYG( 25, 2) = 0.293021E+01 +PKER_SDRYG( 25, 3) = 0.274944E+01 +PKER_SDRYG( 25, 4) = 0.257970E+01 +PKER_SDRYG( 25, 5) = 0.242031E+01 +PKER_SDRYG( 25, 6) = 0.227065E+01 +PKER_SDRYG( 25, 7) = 0.213012E+01 +PKER_SDRYG( 25, 8) = 0.199817E+01 +PKER_SDRYG( 25, 9) = 0.187426E+01 +PKER_SDRYG( 25, 10) = 0.175791E+01 +PKER_SDRYG( 25, 11) = 0.164866E+01 +PKER_SDRYG( 25, 12) = 0.154607E+01 +PKER_SDRYG( 25, 13) = 0.144974E+01 +PKER_SDRYG( 25, 14) = 0.135928E+01 +PKER_SDRYG( 25, 15) = 0.127434E+01 +PKER_SDRYG( 25, 16) = 0.119457E+01 +PKER_SDRYG( 25, 17) = 0.111967E+01 +PKER_SDRYG( 25, 18) = 0.104932E+01 +PKER_SDRYG( 25, 19) = 0.983257E+00 +PKER_SDRYG( 25, 20) = 0.921213E+00 +PKER_SDRYG( 25, 21) = 0.862939E+00 +PKER_SDRYG( 25, 22) = 0.808203E+00 +PKER_SDRYG( 25, 23) = 0.756785E+00 +PKER_SDRYG( 25, 24) = 0.708478E+00 +PKER_SDRYG( 25, 25) = 0.663086E+00 +PKER_SDRYG( 25, 26) = 0.620425E+00 +PKER_SDRYG( 25, 27) = 0.580319E+00 +PKER_SDRYG( 25, 28) = 0.542604E+00 +PKER_SDRYG( 25, 29) = 0.507119E+00 +PKER_SDRYG( 25, 30) = 0.473714E+00 +PKER_SDRYG( 25, 31) = 0.442243E+00 +PKER_SDRYG( 25, 32) = 0.412566E+00 +PKER_SDRYG( 25, 33) = 0.384544E+00 +PKER_SDRYG( 25, 34) = 0.358043E+00 +PKER_SDRYG( 25, 35) = 0.332931E+00 +PKER_SDRYG( 25, 36) = 0.309077E+00 +PKER_SDRYG( 25, 37) = 0.286354E+00 +PKER_SDRYG( 25, 38) = 0.264640E+00 +PKER_SDRYG( 25, 39) = 0.243825E+00 +PKER_SDRYG( 25, 40) = 0.223821E+00 +PKER_SDRYG( 25, 41) = 0.204568E+00 +PKER_SDRYG( 25, 42) = 0.186052E+00 +PKER_SDRYG( 25, 43) = 0.168306E+00 +PKER_SDRYG( 25, 44) = 0.151409E+00 +PKER_SDRYG( 25, 45) = 0.135468E+00 +PKER_SDRYG( 25, 46) = 0.120590E+00 +PKER_SDRYG( 25, 47) = 0.106855E+00 +PKER_SDRYG( 25, 48) = 0.943025E-01 +PKER_SDRYG( 25, 49) = 0.829276E-01 +PKER_SDRYG( 25, 50) = 0.726914E-01 +PKER_SDRYG( 25, 51) = 0.635357E-01 +PKER_SDRYG( 25, 52) = 0.554038E-01 +PKER_SDRYG( 25, 53) = 0.482351E-01 +PKER_SDRYG( 25, 54) = 0.419759E-01 +PKER_SDRYG( 25, 55) = 0.365989E-01 +PKER_SDRYG( 25, 56) = 0.320611E-01 +PKER_SDRYG( 25, 57) = 0.283066E-01 +PKER_SDRYG( 25, 58) = 0.253217E-01 +PKER_SDRYG( 25, 59) = 0.230681E-01 +PKER_SDRYG( 25, 60) = 0.214485E-01 +PKER_SDRYG( 25, 61) = 0.204594E-01 +PKER_SDRYG( 25, 62) = 0.199802E-01 +PKER_SDRYG( 25, 63) = 0.199893E-01 +PKER_SDRYG( 25, 64) = 0.203928E-01 +PKER_SDRYG( 25, 65) = 0.211342E-01 +PKER_SDRYG( 25, 66) = 0.221323E-01 +PKER_SDRYG( 25, 67) = 0.233322E-01 +PKER_SDRYG( 25, 68) = 0.246954E-01 +PKER_SDRYG( 25, 69) = 0.261541E-01 +PKER_SDRYG( 25, 70) = 0.276764E-01 +PKER_SDRYG( 25, 71) = 0.292337E-01 +PKER_SDRYG( 25, 72) = 0.307948E-01 +PKER_SDRYG( 25, 73) = 0.323388E-01 +PKER_SDRYG( 25, 74) = 0.338507E-01 +PKER_SDRYG( 25, 75) = 0.353179E-01 +PKER_SDRYG( 25, 76) = 0.367344E-01 +PKER_SDRYG( 25, 77) = 0.380928E-01 +PKER_SDRYG( 25, 78) = 0.393925E-01 +PKER_SDRYG( 25, 79) = 0.406269E-01 +PKER_SDRYG( 25, 80) = 0.417949E-01 +PKER_SDRYG( 26, 1) = 0.312740E+01 +PKER_SDRYG( 26, 2) = 0.293488E+01 +PKER_SDRYG( 26, 3) = 0.275412E+01 +PKER_SDRYG( 26, 4) = 0.258438E+01 +PKER_SDRYG( 26, 5) = 0.242499E+01 +PKER_SDRYG( 26, 6) = 0.227533E+01 +PKER_SDRYG( 26, 7) = 0.213481E+01 +PKER_SDRYG( 26, 8) = 0.200285E+01 +PKER_SDRYG( 26, 9) = 0.187895E+01 +PKER_SDRYG( 26, 10) = 0.176260E+01 +PKER_SDRYG( 26, 11) = 0.165335E+01 +PKER_SDRYG( 26, 12) = 0.155077E+01 +PKER_SDRYG( 26, 13) = 0.145444E+01 +PKER_SDRYG( 26, 14) = 0.136398E+01 +PKER_SDRYG( 26, 15) = 0.127904E+01 +PKER_SDRYG( 26, 16) = 0.119928E+01 +PKER_SDRYG( 26, 17) = 0.112439E+01 +PKER_SDRYG( 26, 18) = 0.105405E+01 +PKER_SDRYG( 26, 19) = 0.987997E+00 +PKER_SDRYG( 26, 20) = 0.925966E+00 +PKER_SDRYG( 26, 21) = 0.867709E+00 +PKER_SDRYG( 26, 22) = 0.812992E+00 +PKER_SDRYG( 26, 23) = 0.761598E+00 +PKER_SDRYG( 26, 24) = 0.713319E+00 +PKER_SDRYG( 26, 25) = 0.667963E+00 +PKER_SDRYG( 26, 26) = 0.625344E+00 +PKER_SDRYG( 26, 27) = 0.585291E+00 +PKER_SDRYG( 26, 28) = 0.547639E+00 +PKER_SDRYG( 26, 29) = 0.512232E+00 +PKER_SDRYG( 26, 30) = 0.478922E+00 +PKER_SDRYG( 26, 31) = 0.447567E+00 +PKER_SDRYG( 26, 32) = 0.418032E+00 +PKER_SDRYG( 26, 33) = 0.390184E+00 +PKER_SDRYG( 26, 34) = 0.363896E+00 +PKER_SDRYG( 26, 35) = 0.339042E+00 +PKER_SDRYG( 26, 36) = 0.315501E+00 +PKER_SDRYG( 26, 37) = 0.293150E+00 +PKER_SDRYG( 26, 38) = 0.271872E+00 +PKER_SDRYG( 26, 39) = 0.251556E+00 +PKER_SDRYG( 26, 40) = 0.232100E+00 +PKER_SDRYG( 26, 41) = 0.213421E+00 +PKER_SDRYG( 26, 42) = 0.195465E+00 +PKER_SDRYG( 26, 43) = 0.178217E+00 +PKER_SDRYG( 26, 44) = 0.161705E+00 +PKER_SDRYG( 26, 45) = 0.145996E+00 +PKER_SDRYG( 26, 46) = 0.131182E+00 +PKER_SDRYG( 26, 47) = 0.117353E+00 +PKER_SDRYG( 26, 48) = 0.104576E+00 +PKER_SDRYG( 26, 49) = 0.928753E-01 +PKER_SDRYG( 26, 50) = 0.822363E-01 +PKER_SDRYG( 26, 51) = 0.726111E-01 +PKER_SDRYG( 26, 52) = 0.639383E-01 +PKER_SDRYG( 26, 53) = 0.561507E-01 +PKER_SDRYG( 26, 54) = 0.491858E-01 +PKER_SDRYG( 26, 55) = 0.429946E-01 +PKER_SDRYG( 26, 56) = 0.375430E-01 +PKER_SDRYG( 26, 57) = 0.327992E-01 +PKER_SDRYG( 26, 58) = 0.287370E-01 +PKER_SDRYG( 26, 59) = 0.253369E-01 +PKER_SDRYG( 26, 60) = 0.225882E-01 +PKER_SDRYG( 26, 61) = 0.204316E-01 +PKER_SDRYG( 26, 62) = 0.188398E-01 +PKER_SDRYG( 26, 63) = 0.177875E-01 +PKER_SDRYG( 26, 64) = 0.172085E-01 +PKER_SDRYG( 26, 65) = 0.170417E-01 +PKER_SDRYG( 26, 66) = 0.172497E-01 +PKER_SDRYG( 26, 67) = 0.177584E-01 +PKER_SDRYG( 26, 68) = 0.185080E-01 +PKER_SDRYG( 26, 69) = 0.194673E-01 +PKER_SDRYG( 26, 70) = 0.205752E-01 +PKER_SDRYG( 26, 71) = 0.217845E-01 +PKER_SDRYG( 26, 72) = 0.230647E-01 +PKER_SDRYG( 26, 73) = 0.243883E-01 +PKER_SDRYG( 26, 74) = 0.257208E-01 +PKER_SDRYG( 26, 75) = 0.270503E-01 +PKER_SDRYG( 26, 76) = 0.283574E-01 +PKER_SDRYG( 26, 77) = 0.296325E-01 +PKER_SDRYG( 26, 78) = 0.308653E-01 +PKER_SDRYG( 26, 79) = 0.320509E-01 +PKER_SDRYG( 26, 80) = 0.331872E-01 +PKER_SDRYG( 27, 1) = 0.313140E+01 +PKER_SDRYG( 27, 2) = 0.293889E+01 +PKER_SDRYG( 27, 3) = 0.275812E+01 +PKER_SDRYG( 27, 4) = 0.258838E+01 +PKER_SDRYG( 27, 5) = 0.242900E+01 +PKER_SDRYG( 27, 6) = 0.227934E+01 +PKER_SDRYG( 27, 7) = 0.213881E+01 +PKER_SDRYG( 27, 8) = 0.200686E+01 +PKER_SDRYG( 27, 9) = 0.188295E+01 +PKER_SDRYG( 27, 10) = 0.176661E+01 +PKER_SDRYG( 27, 11) = 0.165736E+01 +PKER_SDRYG( 27, 12) = 0.155478E+01 +PKER_SDRYG( 27, 13) = 0.145845E+01 +PKER_SDRYG( 27, 14) = 0.136800E+01 +PKER_SDRYG( 27, 15) = 0.128307E+01 +PKER_SDRYG( 27, 16) = 0.120331E+01 +PKER_SDRYG( 27, 17) = 0.112842E+01 +PKER_SDRYG( 27, 18) = 0.105809E+01 +PKER_SDRYG( 27, 19) = 0.992047E+00 +PKER_SDRYG( 27, 20) = 0.930026E+00 +PKER_SDRYG( 27, 21) = 0.871781E+00 +PKER_SDRYG( 27, 22) = 0.817079E+00 +PKER_SDRYG( 27, 23) = 0.765702E+00 +PKER_SDRYG( 27, 24) = 0.717445E+00 +PKER_SDRYG( 27, 25) = 0.672115E+00 +PKER_SDRYG( 27, 26) = 0.629528E+00 +PKER_SDRYG( 27, 27) = 0.589513E+00 +PKER_SDRYG( 27, 28) = 0.551908E+00 +PKER_SDRYG( 27, 29) = 0.516558E+00 +PKER_SDRYG( 27, 30) = 0.483318E+00 +PKER_SDRYG( 27, 31) = 0.452049E+00 +PKER_SDRYG( 27, 32) = 0.422618E+00 +PKER_SDRYG( 27, 33) = 0.394898E+00 +PKER_SDRYG( 27, 34) = 0.368766E+00 +PKER_SDRYG( 27, 35) = 0.344102E+00 +PKER_SDRYG( 27, 36) = 0.320791E+00 +PKER_SDRYG( 27, 37) = 0.298718E+00 +PKER_SDRYG( 27, 38) = 0.277772E+00 +PKER_SDRYG( 27, 39) = 0.257843E+00 +PKER_SDRYG( 27, 40) = 0.238828E+00 +PKER_SDRYG( 27, 41) = 0.220635E+00 +PKER_SDRYG( 27, 42) = 0.203186E+00 +PKER_SDRYG( 27, 43) = 0.186431E+00 +PKER_SDRYG( 27, 44) = 0.170354E+00 +PKER_SDRYG( 27, 45) = 0.154979E+00 +PKER_SDRYG( 27, 46) = 0.140365E+00 +PKER_SDRYG( 27, 47) = 0.126590E+00 +PKER_SDRYG( 27, 48) = 0.113733E+00 +PKER_SDRYG( 27, 49) = 0.101848E+00 +PKER_SDRYG( 27, 50) = 0.909527E-01 +PKER_SDRYG( 27, 51) = 0.810258E-01 +PKER_SDRYG( 27, 52) = 0.720165E-01 +PKER_SDRYG( 27, 53) = 0.638590E-01 +PKER_SDRYG( 27, 54) = 0.564823E-01 +PKER_SDRYG( 27, 55) = 0.498226E-01 +PKER_SDRYG( 27, 56) = 0.438282E-01 +PKER_SDRYG( 27, 57) = 0.384597E-01 +PKER_SDRYG( 27, 58) = 0.336864E-01 +PKER_SDRYG( 27, 59) = 0.294887E-01 +PKER_SDRYG( 27, 60) = 0.258548E-01 +PKER_SDRYG( 27, 61) = 0.227747E-01 +PKER_SDRYG( 27, 62) = 0.202164E-01 +PKER_SDRYG( 27, 63) = 0.181747E-01 +PKER_SDRYG( 27, 64) = 0.166401E-01 +PKER_SDRYG( 27, 65) = 0.155455E-01 +PKER_SDRYG( 27, 66) = 0.148848E-01 +PKER_SDRYG( 27, 67) = 0.145861E-01 +PKER_SDRYG( 27, 68) = 0.146311E-01 +PKER_SDRYG( 27, 69) = 0.149518E-01 +PKER_SDRYG( 27, 70) = 0.155127E-01 +PKER_SDRYG( 27, 71) = 0.162573E-01 +PKER_SDRYG( 27, 72) = 0.171427E-01 +PKER_SDRYG( 27, 73) = 0.181459E-01 +PKER_SDRYG( 27, 74) = 0.192163E-01 +PKER_SDRYG( 27, 75) = 0.203307E-01 +PKER_SDRYG( 27, 76) = 0.214704E-01 +PKER_SDRYG( 27, 77) = 0.226118E-01 +PKER_SDRYG( 27, 78) = 0.237398E-01 +PKER_SDRYG( 27, 79) = 0.248439E-01 +PKER_SDRYG( 27, 80) = 0.259151E-01 +PKER_SDRYG( 28, 1) = 0.313482E+01 +PKER_SDRYG( 28, 2) = 0.294231E+01 +PKER_SDRYG( 28, 3) = 0.276154E+01 +PKER_SDRYG( 28, 4) = 0.259180E+01 +PKER_SDRYG( 28, 5) = 0.243242E+01 +PKER_SDRYG( 28, 6) = 0.228277E+01 +PKER_SDRYG( 28, 7) = 0.214224E+01 +PKER_SDRYG( 28, 8) = 0.201029E+01 +PKER_SDRYG( 28, 9) = 0.188638E+01 +PKER_SDRYG( 28, 10) = 0.177004E+01 +PKER_SDRYG( 28, 11) = 0.166079E+01 +PKER_SDRYG( 28, 12) = 0.155821E+01 +PKER_SDRYG( 28, 13) = 0.146189E+01 +PKER_SDRYG( 28, 14) = 0.137144E+01 +PKER_SDRYG( 28, 15) = 0.128651E+01 +PKER_SDRYG( 28, 16) = 0.120676E+01 +PKER_SDRYG( 28, 17) = 0.113187E+01 +PKER_SDRYG( 28, 18) = 0.106155E+01 +PKER_SDRYG( 28, 19) = 0.995508E+00 +PKER_SDRYG( 28, 20) = 0.933495E+00 +PKER_SDRYG( 28, 21) = 0.875258E+00 +PKER_SDRYG( 28, 22) = 0.820568E+00 +PKER_SDRYG( 28, 23) = 0.769204E+00 +PKER_SDRYG( 28, 24) = 0.720964E+00 +PKER_SDRYG( 28, 25) = 0.675653E+00 +PKER_SDRYG( 28, 26) = 0.633090E+00 +PKER_SDRYG( 28, 27) = 0.593104E+00 +PKER_SDRYG( 28, 28) = 0.555533E+00 +PKER_SDRYG( 28, 29) = 0.520226E+00 +PKER_SDRYG( 28, 30) = 0.487038E+00 +PKER_SDRYG( 28, 31) = 0.455832E+00 +PKER_SDRYG( 28, 32) = 0.426477E+00 +PKER_SDRYG( 28, 33) = 0.398851E+00 +PKER_SDRYG( 28, 34) = 0.372833E+00 +PKER_SDRYG( 28, 35) = 0.348309E+00 +PKER_SDRYG( 28, 36) = 0.325168E+00 +PKER_SDRYG( 28, 37) = 0.303302E+00 +PKER_SDRYG( 28, 38) = 0.282604E+00 +PKER_SDRYG( 28, 39) = 0.262970E+00 +PKER_SDRYG( 28, 40) = 0.244301E+00 +PKER_SDRYG( 28, 41) = 0.226500E+00 +PKER_SDRYG( 28, 42) = 0.209481E+00 +PKER_SDRYG( 28, 43) = 0.193174E+00 +PKER_SDRYG( 28, 44) = 0.177531E+00 +PKER_SDRYG( 28, 45) = 0.162537E+00 +PKER_SDRYG( 28, 46) = 0.148212E+00 +PKER_SDRYG( 28, 47) = 0.134605E+00 +PKER_SDRYG( 28, 48) = 0.121788E+00 +PKER_SDRYG( 28, 49) = 0.109827E+00 +PKER_SDRYG( 28, 50) = 0.987695E-01 +PKER_SDRYG( 28, 51) = 0.886258E-01 +PKER_SDRYG( 28, 52) = 0.793726E-01 +PKER_SDRYG( 28, 53) = 0.709584E-01 +PKER_SDRYG( 28, 54) = 0.633172E-01 +PKER_SDRYG( 28, 55) = 0.563782E-01 +PKER_SDRYG( 28, 56) = 0.500750E-01 +PKER_SDRYG( 28, 57) = 0.443534E-01 +PKER_SDRYG( 28, 58) = 0.391703E-01 +PKER_SDRYG( 28, 59) = 0.344918E-01 +PKER_SDRYG( 28, 60) = 0.302964E-01 +PKER_SDRYG( 28, 61) = 0.265756E-01 +PKER_SDRYG( 28, 62) = 0.233172E-01 +PKER_SDRYG( 28, 63) = 0.205132E-01 +PKER_SDRYG( 28, 64) = 0.181605E-01 +PKER_SDRYG( 28, 65) = 0.162558E-01 +PKER_SDRYG( 28, 66) = 0.147609E-01 +PKER_SDRYG( 28, 67) = 0.136620E-01 +PKER_SDRYG( 28, 68) = 0.129448E-01 +PKER_SDRYG( 28, 69) = 0.125564E-01 +PKER_SDRYG( 28, 70) = 0.124665E-01 +PKER_SDRYG( 28, 71) = 0.126409E-01 +PKER_SDRYG( 28, 72) = 0.130274E-01 +PKER_SDRYG( 28, 73) = 0.135904E-01 +PKER_SDRYG( 28, 74) = 0.142998E-01 +PKER_SDRYG( 28, 75) = 0.151150E-01 +PKER_SDRYG( 28, 76) = 0.160038E-01 +PKER_SDRYG( 28, 77) = 0.169418E-01 +PKER_SDRYG( 28, 78) = 0.179108E-01 +PKER_SDRYG( 28, 79) = 0.188859E-01 +PKER_SDRYG( 28, 80) = 0.198573E-01 +PKER_SDRYG( 29, 1) = 0.313775E+01 +PKER_SDRYG( 29, 2) = 0.294524E+01 +PKER_SDRYG( 29, 3) = 0.276447E+01 +PKER_SDRYG( 29, 4) = 0.259474E+01 +PKER_SDRYG( 29, 5) = 0.243535E+01 +PKER_SDRYG( 29, 6) = 0.228570E+01 +PKER_SDRYG( 29, 7) = 0.214517E+01 +PKER_SDRYG( 29, 8) = 0.201322E+01 +PKER_SDRYG( 29, 9) = 0.188932E+01 +PKER_SDRYG( 29, 10) = 0.177297E+01 +PKER_SDRYG( 29, 11) = 0.166373E+01 +PKER_SDRYG( 29, 12) = 0.156115E+01 +PKER_SDRYG( 29, 13) = 0.146483E+01 +PKER_SDRYG( 29, 14) = 0.137438E+01 +PKER_SDRYG( 29, 15) = 0.128945E+01 +PKER_SDRYG( 29, 16) = 0.120970E+01 +PKER_SDRYG( 29, 17) = 0.113482E+01 +PKER_SDRYG( 29, 18) = 0.106450E+01 +PKER_SDRYG( 29, 19) = 0.998466E+00 +PKER_SDRYG( 29, 20) = 0.936458E+00 +PKER_SDRYG( 29, 21) = 0.878229E+00 +PKER_SDRYG( 29, 22) = 0.823547E+00 +PKER_SDRYG( 29, 23) = 0.772194E+00 +PKER_SDRYG( 29, 24) = 0.723965E+00 +PKER_SDRYG( 29, 25) = 0.678669E+00 +PKER_SDRYG( 29, 26) = 0.636124E+00 +PKER_SDRYG( 29, 27) = 0.596159E+00 +PKER_SDRYG( 29, 28) = 0.558615E+00 +PKER_SDRYG( 29, 29) = 0.523340E+00 +PKER_SDRYG( 29, 30) = 0.490190E+00 +PKER_SDRYG( 29, 31) = 0.459030E+00 +PKER_SDRYG( 29, 32) = 0.429733E+00 +PKER_SDRYG( 29, 33) = 0.402176E+00 +PKER_SDRYG( 29, 34) = 0.376242E+00 +PKER_SDRYG( 29, 35) = 0.351822E+00 +PKER_SDRYG( 29, 36) = 0.328807E+00 +PKER_SDRYG( 29, 37) = 0.307093E+00 +PKER_SDRYG( 29, 38) = 0.286580E+00 +PKER_SDRYG( 29, 39) = 0.267168E+00 +PKER_SDRYG( 29, 40) = 0.248763E+00 +PKER_SDRYG( 29, 41) = 0.231269E+00 +PKER_SDRYG( 29, 42) = 0.214600E+00 +PKER_SDRYG( 29, 43) = 0.198675E+00 +PKER_SDRYG( 29, 44) = 0.183429E+00 +PKER_SDRYG( 29, 45) = 0.168818E+00 +PKER_SDRYG( 29, 46) = 0.154826E+00 +PKER_SDRYG( 29, 47) = 0.141470E+00 +PKER_SDRYG( 29, 48) = 0.128793E+00 +PKER_SDRYG( 29, 49) = 0.116859E+00 +PKER_SDRYG( 29, 50) = 0.105725E+00 +PKER_SDRYG( 29, 51) = 0.954304E-01 +PKER_SDRYG( 29, 52) = 0.859836E-01 +PKER_SDRYG( 29, 53) = 0.773596E-01 +PKER_SDRYG( 29, 54) = 0.695082E-01 +PKER_SDRYG( 29, 55) = 0.623650E-01 +PKER_SDRYG( 29, 56) = 0.558611E-01 +PKER_SDRYG( 29, 57) = 0.499316E-01 +PKER_SDRYG( 29, 58) = 0.445208E-01 +PKER_SDRYG( 29, 59) = 0.395814E-01 +PKER_SDRYG( 29, 60) = 0.350788E-01 +PKER_SDRYG( 29, 61) = 0.309897E-01 +PKER_SDRYG( 29, 62) = 0.272977E-01 +PKER_SDRYG( 29, 63) = 0.239931E-01 +PKER_SDRYG( 29, 64) = 0.210731E-01 +PKER_SDRYG( 29, 65) = 0.185324E-01 +PKER_SDRYG( 29, 66) = 0.163751E-01 +PKER_SDRYG( 29, 67) = 0.145805E-01 +PKER_SDRYG( 29, 68) = 0.131445E-01 +PKER_SDRYG( 29, 69) = 0.120720E-01 +PKER_SDRYG( 29, 70) = 0.113116E-01 +PKER_SDRYG( 29, 71) = 0.108560E-01 +PKER_SDRYG( 29, 72) = 0.106640E-01 +PKER_SDRYG( 29, 73) = 0.107167E-01 +PKER_SDRYG( 29, 74) = 0.109632E-01 +PKER_SDRYG( 29, 75) = 0.113846E-01 +PKER_SDRYG( 29, 76) = 0.119375E-01 +PKER_SDRYG( 29, 77) = 0.125899E-01 +PKER_SDRYG( 29, 78) = 0.133280E-01 +PKER_SDRYG( 29, 79) = 0.141136E-01 +PKER_SDRYG( 29, 80) = 0.149298E-01 +PKER_SDRYG( 30, 1) = 0.314026E+01 +PKER_SDRYG( 30, 2) = 0.294775E+01 +PKER_SDRYG( 30, 3) = 0.276698E+01 +PKER_SDRYG( 30, 4) = 0.259724E+01 +PKER_SDRYG( 30, 5) = 0.243786E+01 +PKER_SDRYG( 30, 6) = 0.228821E+01 +PKER_SDRYG( 30, 7) = 0.214768E+01 +PKER_SDRYG( 30, 8) = 0.201573E+01 +PKER_SDRYG( 30, 9) = 0.189183E+01 +PKER_SDRYG( 30, 10) = 0.177549E+01 +PKER_SDRYG( 30, 11) = 0.166624E+01 +PKER_SDRYG( 30, 12) = 0.156366E+01 +PKER_SDRYG( 30, 13) = 0.146734E+01 +PKER_SDRYG( 30, 14) = 0.137690E+01 +PKER_SDRYG( 30, 15) = 0.129197E+01 +PKER_SDRYG( 30, 16) = 0.121222E+01 +PKER_SDRYG( 30, 17) = 0.113734E+01 +PKER_SDRYG( 30, 18) = 0.106702E+01 +PKER_SDRYG( 30, 19) = 0.100099E+01 +PKER_SDRYG( 30, 20) = 0.938991E+00 +PKER_SDRYG( 30, 21) = 0.880767E+00 +PKER_SDRYG( 30, 22) = 0.826092E+00 +PKER_SDRYG( 30, 23) = 0.774746E+00 +PKER_SDRYG( 30, 24) = 0.726527E+00 +PKER_SDRYG( 30, 25) = 0.681242E+00 +PKER_SDRYG( 30, 26) = 0.638710E+00 +PKER_SDRYG( 30, 27) = 0.598762E+00 +PKER_SDRYG( 30, 28) = 0.561237E+00 +PKER_SDRYG( 30, 29) = 0.525986E+00 +PKER_SDRYG( 30, 30) = 0.492864E+00 +PKER_SDRYG( 30, 31) = 0.461740E+00 +PKER_SDRYG( 30, 32) = 0.432485E+00 +PKER_SDRYG( 30, 33) = 0.404979E+00 +PKER_SDRYG( 30, 34) = 0.379109E+00 +PKER_SDRYG( 30, 35) = 0.354764E+00 +PKER_SDRYG( 30, 36) = 0.331842E+00 +PKER_SDRYG( 30, 37) = 0.310241E+00 +PKER_SDRYG( 30, 38) = 0.289866E+00 +PKER_SDRYG( 30, 39) = 0.270620E+00 +PKER_SDRYG( 30, 40) = 0.252414E+00 +PKER_SDRYG( 30, 41) = 0.235157E+00 +PKER_SDRYG( 30, 42) = 0.218763E+00 +PKER_SDRYG( 30, 43) = 0.203150E+00 +PKER_SDRYG( 30, 44) = 0.188244E+00 +PKER_SDRYG( 30, 45) = 0.173985E+00 +PKER_SDRYG( 30, 46) = 0.160331E+00 +PKER_SDRYG( 30, 47) = 0.147268E+00 +PKER_SDRYG( 30, 48) = 0.134807E+00 +PKER_SDRYG( 30, 49) = 0.122990E+00 +PKER_SDRYG( 30, 50) = 0.111870E+00 +PKER_SDRYG( 30, 51) = 0.101498E+00 +PKER_SDRYG( 30, 52) = 0.919089E-01 +PKER_SDRYG( 30, 53) = 0.831067E-01 +PKER_SDRYG( 30, 54) = 0.750668E-01 +PKER_SDRYG( 30, 55) = 0.677413E-01 +PKER_SDRYG( 30, 56) = 0.610688E-01 +PKER_SDRYG( 30, 57) = 0.549841E-01 +PKER_SDRYG( 30, 58) = 0.494242E-01 +PKER_SDRYG( 30, 59) = 0.443338E-01 +PKER_SDRYG( 30, 60) = 0.396667E-01 +PKER_SDRYG( 30, 61) = 0.353851E-01 +PKER_SDRYG( 30, 62) = 0.314617E-01 +PKER_SDRYG( 30, 63) = 0.278788E-01 +PKER_SDRYG( 30, 64) = 0.246216E-01 +PKER_SDRYG( 30, 65) = 0.216840E-01 +PKER_SDRYG( 30, 66) = 0.190676E-01 +PKER_SDRYG( 30, 67) = 0.167678E-01 +PKER_SDRYG( 30, 68) = 0.147843E-01 +PKER_SDRYG( 30, 69) = 0.131194E-01 +PKER_SDRYG( 30, 70) = 0.117708E-01 +PKER_SDRYG( 30, 71) = 0.107143E-01 +PKER_SDRYG( 30, 72) = 0.994008E-02 +PKER_SDRYG( 30, 73) = 0.944116E-02 +PKER_SDRYG( 30, 74) = 0.917473E-02 +PKER_SDRYG( 30, 75) = 0.912540E-02 +PKER_SDRYG( 30, 76) = 0.926519E-02 +PKER_SDRYG( 30, 77) = 0.955670E-02 +PKER_SDRYG( 30, 78) = 0.997708E-02 +PKER_SDRYG( 30, 79) = 0.105008E-01 +PKER_SDRYG( 30, 80) = 0.111005E-01 +PKER_SDRYG( 31, 1) = 0.314241E+01 +PKER_SDRYG( 31, 2) = 0.294989E+01 +PKER_SDRYG( 31, 3) = 0.276913E+01 +PKER_SDRYG( 31, 4) = 0.259939E+01 +PKER_SDRYG( 31, 5) = 0.244001E+01 +PKER_SDRYG( 31, 6) = 0.229035E+01 +PKER_SDRYG( 31, 7) = 0.214983E+01 +PKER_SDRYG( 31, 8) = 0.201788E+01 +PKER_SDRYG( 31, 9) = 0.189397E+01 +PKER_SDRYG( 31, 10) = 0.177763E+01 +PKER_SDRYG( 31, 11) = 0.166839E+01 +PKER_SDRYG( 31, 12) = 0.156581E+01 +PKER_SDRYG( 31, 13) = 0.146949E+01 +PKER_SDRYG( 31, 14) = 0.137905E+01 +PKER_SDRYG( 31, 15) = 0.129412E+01 +PKER_SDRYG( 31, 16) = 0.121438E+01 +PKER_SDRYG( 31, 17) = 0.113950E+01 +PKER_SDRYG( 31, 18) = 0.106918E+01 +PKER_SDRYG( 31, 19) = 0.100316E+01 +PKER_SDRYG( 31, 20) = 0.941157E+00 +PKER_SDRYG( 31, 21) = 0.882937E+00 +PKER_SDRYG( 31, 22) = 0.828266E+00 +PKER_SDRYG( 31, 23) = 0.776926E+00 +PKER_SDRYG( 31, 24) = 0.728714E+00 +PKER_SDRYG( 31, 25) = 0.683437E+00 +PKER_SDRYG( 31, 26) = 0.640916E+00 +PKER_SDRYG( 31, 27) = 0.600980E+00 +PKER_SDRYG( 31, 28) = 0.563470E+00 +PKER_SDRYG( 31, 29) = 0.528236E+00 +PKER_SDRYG( 31, 30) = 0.495137E+00 +PKER_SDRYG( 31, 31) = 0.464039E+00 +PKER_SDRYG( 31, 32) = 0.434815E+00 +PKER_SDRYG( 31, 33) = 0.407348E+00 +PKER_SDRYG( 31, 34) = 0.381525E+00 +PKER_SDRYG( 31, 35) = 0.357237E+00 +PKER_SDRYG( 31, 36) = 0.334384E+00 +PKER_SDRYG( 31, 37) = 0.312867E+00 +PKER_SDRYG( 31, 38) = 0.292593E+00 +PKER_SDRYG( 31, 39) = 0.273472E+00 +PKER_SDRYG( 31, 40) = 0.255415E+00 +PKER_SDRYG( 31, 41) = 0.238337E+00 +PKER_SDRYG( 31, 42) = 0.222155E+00 +PKER_SDRYG( 31, 43) = 0.206789E+00 +PKER_SDRYG( 31, 44) = 0.192162E+00 +PKER_SDRYG( 31, 45) = 0.178206E+00 +PKER_SDRYG( 31, 46) = 0.164865E+00 +PKER_SDRYG( 31, 47) = 0.152101E+00 +PKER_SDRYG( 31, 48) = 0.139898E+00 +PKER_SDRYG( 31, 49) = 0.128268E+00 +PKER_SDRYG( 31, 50) = 0.117245E+00 +PKER_SDRYG( 31, 51) = 0.106877E+00 +PKER_SDRYG( 31, 52) = 0.972093E-01 +PKER_SDRYG( 31, 53) = 0.882710E-01 +PKER_SDRYG( 31, 54) = 0.800646E-01 +PKER_SDRYG( 31, 55) = 0.725658E-01 +PKER_SDRYG( 31, 56) = 0.657293E-01 +PKER_SDRYG( 31, 57) = 0.594973E-01 +PKER_SDRYG( 31, 58) = 0.538082E-01 +PKER_SDRYG( 31, 59) = 0.486029E-01 +PKER_SDRYG( 31, 60) = 0.438281E-01 +PKER_SDRYG( 31, 61) = 0.394382E-01 +PKER_SDRYG( 31, 62) = 0.353958E-01 +PKER_SDRYG( 31, 63) = 0.316723E-01 +PKER_SDRYG( 31, 64) = 0.282443E-01 +PKER_SDRYG( 31, 65) = 0.250971E-01 +PKER_SDRYG( 31, 66) = 0.222220E-01 +PKER_SDRYG( 31, 67) = 0.196134E-01 +PKER_SDRYG( 31, 68) = 0.172700E-01 +PKER_SDRYG( 31, 69) = 0.151950E-01 +PKER_SDRYG( 31, 70) = 0.133842E-01 +PKER_SDRYG( 31, 71) = 0.118468E-01 +PKER_SDRYG( 31, 72) = 0.105682E-01 +PKER_SDRYG( 31, 73) = 0.954383E-02 +PKER_SDRYG( 31, 74) = 0.878311E-02 +PKER_SDRYG( 31, 75) = 0.824730E-02 +PKER_SDRYG( 31, 76) = 0.792838E-02 +PKER_SDRYG( 31, 77) = 0.780258E-02 +PKER_SDRYG( 31, 78) = 0.785165E-02 +PKER_SDRYG( 31, 79) = 0.803984E-02 +PKER_SDRYG( 31, 80) = 0.835401E-02 +PKER_SDRYG( 32, 1) = 0.314424E+01 +PKER_SDRYG( 32, 2) = 0.295173E+01 +PKER_SDRYG( 32, 3) = 0.277096E+01 +PKER_SDRYG( 32, 4) = 0.260122E+01 +PKER_SDRYG( 32, 5) = 0.244184E+01 +PKER_SDRYG( 32, 6) = 0.229219E+01 +PKER_SDRYG( 32, 7) = 0.215166E+01 +PKER_SDRYG( 32, 8) = 0.201971E+01 +PKER_SDRYG( 32, 9) = 0.189581E+01 +PKER_SDRYG( 32, 10) = 0.177947E+01 +PKER_SDRYG( 32, 11) = 0.167023E+01 +PKER_SDRYG( 32, 12) = 0.156765E+01 +PKER_SDRYG( 32, 13) = 0.147133E+01 +PKER_SDRYG( 32, 14) = 0.138089E+01 +PKER_SDRYG( 32, 15) = 0.129596E+01 +PKER_SDRYG( 32, 16) = 0.121622E+01 +PKER_SDRYG( 32, 17) = 0.114134E+01 +PKER_SDRYG( 32, 18) = 0.107103E+01 +PKER_SDRYG( 32, 19) = 0.100500E+01 +PKER_SDRYG( 32, 20) = 0.943008E+00 +PKER_SDRYG( 32, 21) = 0.884791E+00 +PKER_SDRYG( 32, 22) = 0.830124E+00 +PKER_SDRYG( 32, 23) = 0.778789E+00 +PKER_SDRYG( 32, 24) = 0.730582E+00 +PKER_SDRYG( 32, 25) = 0.685312E+00 +PKER_SDRYG( 32, 26) = 0.642798E+00 +PKER_SDRYG( 32, 27) = 0.602872E+00 +PKER_SDRYG( 32, 28) = 0.565373E+00 +PKER_SDRYG( 32, 29) = 0.530153E+00 +PKER_SDRYG( 32, 30) = 0.497070E+00 +PKER_SDRYG( 32, 31) = 0.465991E+00 +PKER_SDRYG( 32, 32) = 0.436792E+00 +PKER_SDRYG( 32, 33) = 0.409354E+00 +PKER_SDRYG( 32, 34) = 0.383565E+00 +PKER_SDRYG( 32, 35) = 0.359320E+00 +PKER_SDRYG( 32, 36) = 0.336518E+00 +PKER_SDRYG( 32, 37) = 0.315064E+00 +PKER_SDRYG( 32, 38) = 0.294866E+00 +PKER_SDRYG( 32, 39) = 0.275837E+00 +PKER_SDRYG( 32, 40) = 0.257892E+00 +PKER_SDRYG( 32, 41) = 0.240949E+00 +PKER_SDRYG( 32, 42) = 0.224929E+00 +PKER_SDRYG( 32, 43) = 0.209753E+00 +PKER_SDRYG( 32, 44) = 0.195347E+00 +PKER_SDRYG( 32, 45) = 0.181641E+00 +PKER_SDRYG( 32, 46) = 0.168572E+00 +PKER_SDRYG( 32, 47) = 0.156087E+00 +PKER_SDRYG( 32, 48) = 0.144150E+00 +PKER_SDRYG( 32, 49) = 0.132746E+00 +PKER_SDRYG( 32, 50) = 0.121885E+00 +PKER_SDRYG( 32, 51) = 0.111598E+00 +PKER_SDRYG( 32, 52) = 0.101925E+00 +PKER_SDRYG( 32, 53) = 0.929079E-01 +PKER_SDRYG( 32, 54) = 0.845713E-01 +PKER_SDRYG( 32, 55) = 0.769159E-01 +PKER_SDRYG( 32, 56) = 0.699183E-01 +PKER_SDRYG( 32, 57) = 0.635355E-01 +PKER_SDRYG( 32, 58) = 0.577136E-01 +PKER_SDRYG( 32, 59) = 0.523950E-01 +PKER_SDRYG( 32, 60) = 0.475243E-01 +PKER_SDRYG( 32, 61) = 0.430512E-01 +PKER_SDRYG( 32, 62) = 0.389325E-01 +PKER_SDRYG( 32, 63) = 0.351313E-01 +PKER_SDRYG( 32, 64) = 0.316183E-01 +PKER_SDRYG( 32, 65) = 0.283700E-01 +PKER_SDRYG( 32, 66) = 0.253685E-01 +PKER_SDRYG( 32, 67) = 0.226014E-01 +PKER_SDRYG( 32, 68) = 0.200616E-01 +PKER_SDRYG( 32, 69) = 0.177438E-01 +PKER_SDRYG( 32, 70) = 0.156482E-01 +PKER_SDRYG( 32, 71) = 0.137766E-01 +PKER_SDRYG( 32, 72) = 0.121294E-01 +PKER_SDRYG( 32, 73) = 0.107083E-01 +PKER_SDRYG( 32, 74) = 0.951507E-02 +PKER_SDRYG( 32, 75) = 0.854960E-02 +PKER_SDRYG( 32, 76) = 0.779589E-02 +PKER_SDRYG( 32, 77) = 0.724397E-02 +PKER_SDRYG( 32, 78) = 0.689318E-02 +PKER_SDRYG( 32, 79) = 0.670835E-02 +PKER_SDRYG( 32, 80) = 0.668173E-02 +PKER_SDRYG( 33, 1) = 0.314581E+01 +PKER_SDRYG( 33, 2) = 0.295330E+01 +PKER_SDRYG( 33, 3) = 0.277253E+01 +PKER_SDRYG( 33, 4) = 0.260280E+01 +PKER_SDRYG( 33, 5) = 0.244341E+01 +PKER_SDRYG( 33, 6) = 0.229376E+01 +PKER_SDRYG( 33, 7) = 0.215323E+01 +PKER_SDRYG( 33, 8) = 0.202128E+01 +PKER_SDRYG( 33, 9) = 0.189738E+01 +PKER_SDRYG( 33, 10) = 0.178104E+01 +PKER_SDRYG( 33, 11) = 0.167180E+01 +PKER_SDRYG( 33, 12) = 0.156922E+01 +PKER_SDRYG( 33, 13) = 0.147291E+01 +PKER_SDRYG( 33, 14) = 0.138246E+01 +PKER_SDRYG( 33, 15) = 0.129754E+01 +PKER_SDRYG( 33, 16) = 0.121780E+01 +PKER_SDRYG( 33, 17) = 0.114292E+01 +PKER_SDRYG( 33, 18) = 0.107261E+01 +PKER_SDRYG( 33, 19) = 0.100659E+01 +PKER_SDRYG( 33, 20) = 0.944590E+00 +PKER_SDRYG( 33, 21) = 0.886376E+00 +PKER_SDRYG( 33, 22) = 0.831711E+00 +PKER_SDRYG( 33, 23) = 0.780380E+00 +PKER_SDRYG( 33, 24) = 0.732177E+00 +PKER_SDRYG( 33, 25) = 0.686912E+00 +PKER_SDRYG( 33, 26) = 0.644404E+00 +PKER_SDRYG( 33, 27) = 0.604485E+00 +PKER_SDRYG( 33, 28) = 0.566995E+00 +PKER_SDRYG( 33, 29) = 0.531785E+00 +PKER_SDRYG( 33, 30) = 0.498715E+00 +PKER_SDRYG( 33, 31) = 0.467651E+00 +PKER_SDRYG( 33, 32) = 0.438470E+00 +PKER_SDRYG( 33, 33) = 0.411054E+00 +PKER_SDRYG( 33, 34) = 0.385291E+00 +PKER_SDRYG( 33, 35) = 0.361078E+00 +PKER_SDRYG( 33, 36) = 0.338315E+00 +PKER_SDRYG( 33, 37) = 0.316908E+00 +PKER_SDRYG( 33, 38) = 0.296767E+00 +PKER_SDRYG( 33, 39) = 0.277807E+00 +PKER_SDRYG( 33, 40) = 0.259946E+00 +PKER_SDRYG( 33, 41) = 0.243104E+00 +PKER_SDRYG( 33, 42) = 0.227205E+00 +PKER_SDRYG( 33, 43) = 0.212175E+00 +PKER_SDRYG( 33, 44) = 0.197941E+00 +PKER_SDRYG( 33, 45) = 0.184435E+00 +PKER_SDRYG( 33, 46) = 0.171590E+00 +PKER_SDRYG( 33, 47) = 0.159348E+00 +PKER_SDRYG( 33, 48) = 0.147660E+00 +PKER_SDRYG( 33, 49) = 0.136493E+00 +PKER_SDRYG( 33, 50) = 0.125832E+00 +PKER_SDRYG( 33, 51) = 0.115684E+00 +PKER_SDRYG( 33, 52) = 0.106078E+00 +PKER_SDRYG( 33, 53) = 0.970492E-01 +PKER_SDRYG( 33, 54) = 0.886343E-01 +PKER_SDRYG( 33, 55) = 0.808544E-01 +PKER_SDRYG( 33, 56) = 0.737092E-01 +PKER_SDRYG( 33, 57) = 0.671759E-01 +PKER_SDRYG( 33, 58) = 0.612140E-01 +PKER_SDRYG( 33, 59) = 0.557733E-01 +PKER_SDRYG( 33, 60) = 0.508001E-01 +PKER_SDRYG( 33, 61) = 0.462428E-01 +PKER_SDRYG( 33, 62) = 0.420544E-01 +PKER_SDRYG( 33, 63) = 0.381941E-01 +PKER_SDRYG( 33, 64) = 0.346270E-01 +PKER_SDRYG( 33, 65) = 0.313244E-01 +PKER_SDRYG( 33, 66) = 0.282623E-01 +PKER_SDRYG( 33, 67) = 0.254222E-01 +PKER_SDRYG( 33, 68) = 0.227902E-01 +PKER_SDRYG( 33, 69) = 0.203548E-01 +PKER_SDRYG( 33, 70) = 0.181098E-01 +PKER_SDRYG( 33, 71) = 0.160530E-01 +PKER_SDRYG( 33, 72) = 0.141818E-01 +PKER_SDRYG( 33, 73) = 0.124982E-01 +PKER_SDRYG( 33, 74) = 0.110068E-01 +PKER_SDRYG( 33, 75) = 0.970368E-02 +PKER_SDRYG( 33, 76) = 0.859751E-02 +PKER_SDRYG( 33, 77) = 0.767929E-02 +PKER_SDRYG( 33, 78) = 0.694381E-02 +PKER_SDRYG( 33, 79) = 0.639919E-02 +PKER_SDRYG( 33, 80) = 0.601899E-02 +PKER_SDRYG( 34, 1) = 0.314716E+01 +PKER_SDRYG( 34, 2) = 0.295464E+01 +PKER_SDRYG( 34, 3) = 0.277388E+01 +PKER_SDRYG( 34, 4) = 0.260414E+01 +PKER_SDRYG( 34, 5) = 0.244476E+01 +PKER_SDRYG( 34, 6) = 0.229510E+01 +PKER_SDRYG( 34, 7) = 0.215458E+01 +PKER_SDRYG( 34, 8) = 0.202263E+01 +PKER_SDRYG( 34, 9) = 0.189873E+01 +PKER_SDRYG( 34, 10) = 0.178239E+01 +PKER_SDRYG( 34, 11) = 0.167315E+01 +PKER_SDRYG( 34, 12) = 0.157057E+01 +PKER_SDRYG( 34, 13) = 0.147425E+01 +PKER_SDRYG( 34, 14) = 0.138381E+01 +PKER_SDRYG( 34, 15) = 0.129889E+01 +PKER_SDRYG( 34, 16) = 0.121914E+01 +PKER_SDRYG( 34, 17) = 0.114427E+01 +PKER_SDRYG( 34, 18) = 0.107396E+01 +PKER_SDRYG( 34, 19) = 0.100794E+01 +PKER_SDRYG( 34, 20) = 0.945943E+00 +PKER_SDRYG( 34, 21) = 0.887731E+00 +PKER_SDRYG( 34, 22) = 0.833069E+00 +PKER_SDRYG( 34, 23) = 0.781740E+00 +PKER_SDRYG( 34, 24) = 0.733540E+00 +PKER_SDRYG( 34, 25) = 0.688279E+00 +PKER_SDRYG( 34, 26) = 0.645776E+00 +PKER_SDRYG( 34, 27) = 0.605862E+00 +PKER_SDRYG( 34, 28) = 0.568379E+00 +PKER_SDRYG( 34, 29) = 0.533177E+00 +PKER_SDRYG( 34, 30) = 0.500116E+00 +PKER_SDRYG( 34, 31) = 0.469064E+00 +PKER_SDRYG( 34, 32) = 0.439896E+00 +PKER_SDRYG( 34, 33) = 0.412496E+00 +PKER_SDRYG( 34, 34) = 0.386754E+00 +PKER_SDRYG( 34, 35) = 0.362565E+00 +PKER_SDRYG( 34, 36) = 0.339831E+00 +PKER_SDRYG( 34, 37) = 0.318459E+00 +PKER_SDRYG( 34, 38) = 0.298361E+00 +PKER_SDRYG( 34, 39) = 0.279453E+00 +PKER_SDRYG( 34, 40) = 0.261654E+00 +PKER_SDRYG( 34, 41) = 0.244888E+00 +PKER_SDRYG( 34, 42) = 0.229081E+00 +PKER_SDRYG( 34, 43) = 0.214161E+00 +PKER_SDRYG( 34, 44) = 0.200059E+00 +PKER_SDRYG( 34, 45) = 0.186708E+00 +PKER_SDRYG( 34, 46) = 0.174043E+00 +PKER_SDRYG( 34, 47) = 0.162003E+00 +PKER_SDRYG( 34, 48) = 0.150534E+00 +PKER_SDRYG( 34, 49) = 0.139590E+00 +PKER_SDRYG( 34, 50) = 0.129139E+00 +PKER_SDRYG( 34, 51) = 0.119169E+00 +PKER_SDRYG( 34, 52) = 0.109684E+00 +PKER_SDRYG( 34, 53) = 0.100710E+00 +PKER_SDRYG( 34, 54) = 0.922778E-01 +PKER_SDRYG( 34, 55) = 0.844206E-01 +PKER_SDRYG( 34, 56) = 0.771566E-01 +PKER_SDRYG( 34, 57) = 0.704841E-01 +PKER_SDRYG( 34, 58) = 0.643812E-01 +PKER_SDRYG( 34, 59) = 0.588101E-01 +PKER_SDRYG( 34, 60) = 0.537237E-01 +PKER_SDRYG( 34, 61) = 0.490721E-01 +PKER_SDRYG( 34, 62) = 0.448073E-01 +PKER_SDRYG( 34, 63) = 0.408857E-01 +PKER_SDRYG( 34, 64) = 0.372690E-01 +PKER_SDRYG( 34, 65) = 0.339245E-01 +PKER_SDRYG( 34, 66) = 0.308247E-01 +PKER_SDRYG( 34, 67) = 0.279467E-01 +PKER_SDRYG( 34, 68) = 0.252716E-01 +PKER_SDRYG( 34, 69) = 0.227841E-01 +PKER_SDRYG( 34, 70) = 0.204724E-01 +PKER_SDRYG( 34, 71) = 0.183278E-01 +PKER_SDRYG( 34, 72) = 0.163442E-01 +PKER_SDRYG( 34, 73) = 0.145187E-01 +PKER_SDRYG( 34, 74) = 0.128499E-01 +PKER_SDRYG( 34, 75) = 0.113397E-01 +PKER_SDRYG( 34, 76) = 0.998905E-02 +PKER_SDRYG( 34, 77) = 0.880025E-02 +PKER_SDRYG( 34, 78) = 0.777536E-02 +PKER_SDRYG( 34, 79) = 0.691458E-02 +PKER_SDRYG( 34, 80) = 0.621944E-02 +PKER_SDRYG( 35, 1) = 0.314831E+01 +PKER_SDRYG( 35, 2) = 0.295579E+01 +PKER_SDRYG( 35, 3) = 0.277503E+01 +PKER_SDRYG( 35, 4) = 0.260529E+01 +PKER_SDRYG( 35, 5) = 0.244591E+01 +PKER_SDRYG( 35, 6) = 0.229625E+01 +PKER_SDRYG( 35, 7) = 0.215573E+01 +PKER_SDRYG( 35, 8) = 0.202378E+01 +PKER_SDRYG( 35, 9) = 0.189988E+01 +PKER_SDRYG( 35, 10) = 0.178354E+01 +PKER_SDRYG( 35, 11) = 0.167430E+01 +PKER_SDRYG( 35, 12) = 0.157172E+01 +PKER_SDRYG( 35, 13) = 0.147540E+01 +PKER_SDRYG( 35, 14) = 0.138496E+01 +PKER_SDRYG( 35, 15) = 0.130004E+01 +PKER_SDRYG( 35, 16) = 0.122030E+01 +PKER_SDRYG( 35, 17) = 0.114542E+01 +PKER_SDRYG( 35, 18) = 0.107511E+01 +PKER_SDRYG( 35, 19) = 0.100909E+01 +PKER_SDRYG( 35, 20) = 0.947100E+00 +PKER_SDRYG( 35, 21) = 0.888890E+00 +PKER_SDRYG( 35, 22) = 0.834229E+00 +PKER_SDRYG( 35, 23) = 0.782902E+00 +PKER_SDRYG( 35, 24) = 0.734705E+00 +PKER_SDRYG( 35, 25) = 0.689447E+00 +PKER_SDRYG( 35, 26) = 0.646947E+00 +PKER_SDRYG( 35, 27) = 0.607038E+00 +PKER_SDRYG( 35, 28) = 0.569560E+00 +PKER_SDRYG( 35, 29) = 0.534364E+00 +PKER_SDRYG( 35, 30) = 0.501310E+00 +PKER_SDRYG( 35, 31) = 0.470267E+00 +PKER_SDRYG( 35, 32) = 0.441110E+00 +PKER_SDRYG( 35, 33) = 0.413722E+00 +PKER_SDRYG( 35, 34) = 0.387995E+00 +PKER_SDRYG( 35, 35) = 0.363825E+00 +PKER_SDRYG( 35, 36) = 0.341113E+00 +PKER_SDRYG( 35, 37) = 0.319768E+00 +PKER_SDRYG( 35, 38) = 0.299702E+00 +PKER_SDRYG( 35, 39) = 0.280832E+00 +PKER_SDRYG( 35, 40) = 0.263081E+00 +PKER_SDRYG( 35, 41) = 0.246372E+00 +PKER_SDRYG( 35, 42) = 0.230634E+00 +PKER_SDRYG( 35, 43) = 0.215798E+00 +PKER_SDRYG( 35, 44) = 0.201796E+00 +PKER_SDRYG( 35, 45) = 0.188564E+00 +PKER_SDRYG( 35, 46) = 0.176039E+00 +PKER_SDRYG( 35, 47) = 0.164162E+00 +PKER_SDRYG( 35, 48) = 0.152875E+00 +PKER_SDRYG( 35, 49) = 0.142127E+00 +PKER_SDRYG( 35, 50) = 0.131877E+00 +PKER_SDRYG( 35, 51) = 0.122094E+00 +PKER_SDRYG( 35, 52) = 0.112767E+00 +PKER_SDRYG( 35, 53) = 0.103898E+00 +PKER_SDRYG( 35, 54) = 0.955102E-01 +PKER_SDRYG( 35, 55) = 0.876322E-01 +PKER_SDRYG( 35, 56) = 0.802923E-01 +PKER_SDRYG( 35, 57) = 0.735065E-01 +PKER_SDRYG( 35, 58) = 0.672725E-01 +PKER_SDRYG( 35, 59) = 0.615692E-01 +PKER_SDRYG( 35, 60) = 0.563610E-01 +PKER_SDRYG( 35, 61) = 0.516040E-01 +PKER_SDRYG( 35, 62) = 0.472519E-01 +PKER_SDRYG( 35, 63) = 0.432599E-01 +PKER_SDRYG( 35, 64) = 0.395875E-01 +PKER_SDRYG( 35, 65) = 0.361991E-01 +PKER_SDRYG( 35, 66) = 0.330642E-01 +PKER_SDRYG( 35, 67) = 0.301570E-01 +PKER_SDRYG( 35, 68) = 0.274555E-01 +PKER_SDRYG( 35, 69) = 0.249416E-01 +PKER_SDRYG( 35, 70) = 0.226001E-01 +PKER_SDRYG( 35, 71) = 0.204182E-01 +PKER_SDRYG( 35, 72) = 0.183863E-01 +PKER_SDRYG( 35, 73) = 0.164969E-01 +PKER_SDRYG( 35, 74) = 0.147442E-01 +PKER_SDRYG( 35, 75) = 0.131255E-01 +PKER_SDRYG( 35, 76) = 0.116402E-01 +PKER_SDRYG( 35, 77) = 0.102875E-01 +PKER_SDRYG( 35, 78) = 0.906989E-02 +PKER_SDRYG( 35, 79) = 0.799132E-02 +PKER_SDRYG( 35, 80) = 0.704902E-02 +PKER_SDRYG( 36, 1) = 0.314929E+01 +PKER_SDRYG( 36, 2) = 0.295678E+01 +PKER_SDRYG( 36, 3) = 0.277601E+01 +PKER_SDRYG( 36, 4) = 0.260627E+01 +PKER_SDRYG( 36, 5) = 0.244689E+01 +PKER_SDRYG( 36, 6) = 0.229724E+01 +PKER_SDRYG( 36, 7) = 0.215671E+01 +PKER_SDRYG( 36, 8) = 0.202476E+01 +PKER_SDRYG( 36, 9) = 0.190086E+01 +PKER_SDRYG( 36, 10) = 0.178452E+01 +PKER_SDRYG( 36, 11) = 0.167528E+01 +PKER_SDRYG( 36, 12) = 0.157271E+01 +PKER_SDRYG( 36, 13) = 0.147639E+01 +PKER_SDRYG( 36, 14) = 0.138595E+01 +PKER_SDRYG( 36, 15) = 0.130103E+01 +PKER_SDRYG( 36, 16) = 0.122128E+01 +PKER_SDRYG( 36, 17) = 0.114641E+01 +PKER_SDRYG( 36, 18) = 0.107610E+01 +PKER_SDRYG( 36, 19) = 0.101008E+01 +PKER_SDRYG( 36, 20) = 0.948090E+00 +PKER_SDRYG( 36, 21) = 0.889880E+00 +PKER_SDRYG( 36, 22) = 0.835221E+00 +PKER_SDRYG( 36, 23) = 0.783896E+00 +PKER_SDRYG( 36, 24) = 0.735701E+00 +PKER_SDRYG( 36, 25) = 0.690445E+00 +PKER_SDRYG( 36, 26) = 0.647948E+00 +PKER_SDRYG( 36, 27) = 0.608042E+00 +PKER_SDRYG( 36, 28) = 0.570567E+00 +PKER_SDRYG( 36, 29) = 0.535376E+00 +PKER_SDRYG( 36, 30) = 0.502328E+00 +PKER_SDRYG( 36, 31) = 0.471291E+00 +PKER_SDRYG( 36, 32) = 0.442142E+00 +PKER_SDRYG( 36, 33) = 0.414765E+00 +PKER_SDRYG( 36, 34) = 0.389049E+00 +PKER_SDRYG( 36, 35) = 0.364893E+00 +PKER_SDRYG( 36, 36) = 0.342198E+00 +PKER_SDRYG( 36, 37) = 0.320873E+00 +PKER_SDRYG( 36, 38) = 0.300831E+00 +PKER_SDRYG( 36, 39) = 0.281991E+00 +PKER_SDRYG( 36, 40) = 0.264276E+00 +PKER_SDRYG( 36, 41) = 0.247610E+00 +PKER_SDRYG( 36, 42) = 0.231924E+00 +PKER_SDRYG( 36, 43) = 0.217150E+00 +PKER_SDRYG( 36, 44) = 0.203224E+00 +PKER_SDRYG( 36, 45) = 0.190084E+00 +PKER_SDRYG( 36, 46) = 0.177667E+00 +PKER_SDRYG( 36, 47) = 0.165917E+00 +PKER_SDRYG( 36, 48) = 0.154777E+00 +PKER_SDRYG( 36, 49) = 0.144194E+00 +PKER_SDRYG( 36, 50) = 0.134122E+00 +PKER_SDRYG( 36, 51) = 0.124519E+00 +PKER_SDRYG( 36, 52) = 0.115360E+00 +PKER_SDRYG( 36, 53) = 0.106630E+00 +PKER_SDRYG( 36, 54) = 0.983351E-01 +PKER_SDRYG( 36, 55) = 0.904924E-01 +PKER_SDRYG( 36, 56) = 0.831287E-01 +PKER_SDRYG( 36, 57) = 0.762689E-01 +PKER_SDRYG( 36, 58) = 0.699271E-01 +PKER_SDRYG( 36, 59) = 0.641001E-01 +PKER_SDRYG( 36, 60) = 0.587680E-01 +PKER_SDRYG( 36, 61) = 0.538972E-01 +PKER_SDRYG( 36, 62) = 0.494467E-01 +PKER_SDRYG( 36, 63) = 0.453735E-01 +PKER_SDRYG( 36, 64) = 0.416358E-01 +PKER_SDRYG( 36, 65) = 0.381961E-01 +PKER_SDRYG( 36, 66) = 0.350213E-01 +PKER_SDRYG( 36, 67) = 0.320830E-01 +PKER_SDRYG( 36, 68) = 0.293569E-01 +PKER_SDRYG( 36, 69) = 0.268227E-01 +PKER_SDRYG( 36, 70) = 0.244628E-01 +PKER_SDRYG( 36, 71) = 0.222628E-01 +PKER_SDRYG( 36, 72) = 0.202100E-01 +PKER_SDRYG( 36, 73) = 0.182942E-01 +PKER_SDRYG( 36, 74) = 0.165070E-01 +PKER_SDRYG( 36, 75) = 0.148415E-01 +PKER_SDRYG( 36, 76) = 0.132934E-01 +PKER_SDRYG( 36, 77) = 0.118592E-01 +PKER_SDRYG( 36, 78) = 0.105376E-01 +PKER_SDRYG( 36, 79) = 0.932874E-02 +PKER_SDRYG( 36, 80) = 0.823481E-02 +PKER_SDRYG( 37, 1) = 0.315013E+01 +PKER_SDRYG( 37, 2) = 0.295762E+01 +PKER_SDRYG( 37, 3) = 0.277685E+01 +PKER_SDRYG( 37, 4) = 0.260712E+01 +PKER_SDRYG( 37, 5) = 0.244774E+01 +PKER_SDRYG( 37, 6) = 0.229808E+01 +PKER_SDRYG( 37, 7) = 0.215756E+01 +PKER_SDRYG( 37, 8) = 0.202561E+01 +PKER_SDRYG( 37, 9) = 0.190171E+01 +PKER_SDRYG( 37, 10) = 0.178537E+01 +PKER_SDRYG( 37, 11) = 0.167613E+01 +PKER_SDRYG( 37, 12) = 0.157355E+01 +PKER_SDRYG( 37, 13) = 0.147723E+01 +PKER_SDRYG( 37, 14) = 0.138679E+01 +PKER_SDRYG( 37, 15) = 0.130187E+01 +PKER_SDRYG( 37, 16) = 0.122213E+01 +PKER_SDRYG( 37, 17) = 0.114725E+01 +PKER_SDRYG( 37, 18) = 0.107695E+01 +PKER_SDRYG( 37, 19) = 0.101093E+01 +PKER_SDRYG( 37, 20) = 0.948936E+00 +PKER_SDRYG( 37, 21) = 0.890727E+00 +PKER_SDRYG( 37, 22) = 0.836069E+00 +PKER_SDRYG( 37, 23) = 0.784745E+00 +PKER_SDRYG( 37, 24) = 0.736552E+00 +PKER_SDRYG( 37, 25) = 0.691298E+00 +PKER_SDRYG( 37, 26) = 0.648803E+00 +PKER_SDRYG( 37, 27) = 0.608899E+00 +PKER_SDRYG( 37, 28) = 0.571428E+00 +PKER_SDRYG( 37, 29) = 0.536240E+00 +PKER_SDRYG( 37, 30) = 0.503196E+00 +PKER_SDRYG( 37, 31) = 0.472165E+00 +PKER_SDRYG( 37, 32) = 0.443022E+00 +PKER_SDRYG( 37, 33) = 0.415652E+00 +PKER_SDRYG( 37, 34) = 0.389946E+00 +PKER_SDRYG( 37, 35) = 0.365800E+00 +PKER_SDRYG( 37, 36) = 0.343117E+00 +PKER_SDRYG( 37, 37) = 0.321808E+00 +PKER_SDRYG( 37, 38) = 0.301785E+00 +PKER_SDRYG( 37, 39) = 0.282968E+00 +PKER_SDRYG( 37, 40) = 0.265279E+00 +PKER_SDRYG( 37, 41) = 0.248646E+00 +PKER_SDRYG( 37, 42) = 0.232999E+00 +PKER_SDRYG( 37, 43) = 0.218273E+00 +PKER_SDRYG( 37, 44) = 0.204405E+00 +PKER_SDRYG( 37, 45) = 0.191333E+00 +PKER_SDRYG( 37, 46) = 0.179000E+00 +PKER_SDRYG( 37, 47) = 0.167348E+00 +PKER_SDRYG( 37, 48) = 0.156324E+00 +PKER_SDRYG( 37, 49) = 0.145874E+00 +PKER_SDRYG( 37, 50) = 0.135951E+00 +PKER_SDRYG( 37, 51) = 0.126509E+00 +PKER_SDRYG( 37, 52) = 0.117512E+00 +PKER_SDRYG( 37, 53) = 0.108934E+00 +PKER_SDRYG( 37, 54) = 0.100762E+00 +PKER_SDRYG( 37, 55) = 0.930002E-01 +PKER_SDRYG( 37, 56) = 0.856646E-01 +PKER_SDRYG( 37, 57) = 0.787788E-01 +PKER_SDRYG( 37, 58) = 0.723653E-01 +PKER_SDRYG( 37, 59) = 0.664358E-01 +PKER_SDRYG( 37, 60) = 0.609872E-01 +PKER_SDRYG( 37, 61) = 0.560001E-01 +PKER_SDRYG( 37, 62) = 0.514432E-01 +PKER_SDRYG( 37, 63) = 0.472782E-01 +PKER_SDRYG( 37, 64) = 0.434648E-01 +PKER_SDRYG( 37, 65) = 0.399644E-01 +PKER_SDRYG( 37, 66) = 0.367420E-01 +PKER_SDRYG( 37, 67) = 0.337668E-01 +PKER_SDRYG( 37, 68) = 0.310124E-01 +PKER_SDRYG( 37, 69) = 0.284563E-01 +PKER_SDRYG( 37, 70) = 0.260793E-01 +PKER_SDRYG( 37, 71) = 0.238651E-01 +PKER_SDRYG( 37, 72) = 0.217997E-01 +PKER_SDRYG( 37, 73) = 0.198713E-01 +PKER_SDRYG( 37, 74) = 0.180696E-01 +PKER_SDRYG( 37, 75) = 0.163859E-01 +PKER_SDRYG( 37, 76) = 0.148129E-01 +PKER_SDRYG( 37, 77) = 0.133450E-01 +PKER_SDRYG( 37, 78) = 0.119777E-01 +PKER_SDRYG( 37, 79) = 0.107079E-01 +PKER_SDRYG( 37, 80) = 0.953408E-02 +PKER_SDRYG( 38, 1) = 0.315085E+01 +PKER_SDRYG( 38, 2) = 0.295834E+01 +PKER_SDRYG( 38, 3) = 0.277757E+01 +PKER_SDRYG( 38, 4) = 0.260784E+01 +PKER_SDRYG( 38, 5) = 0.244846E+01 +PKER_SDRYG( 38, 6) = 0.229880E+01 +PKER_SDRYG( 38, 7) = 0.215828E+01 +PKER_SDRYG( 38, 8) = 0.202633E+01 +PKER_SDRYG( 38, 9) = 0.190243E+01 +PKER_SDRYG( 38, 10) = 0.178609E+01 +PKER_SDRYG( 38, 11) = 0.167685E+01 +PKER_SDRYG( 38, 12) = 0.157427E+01 +PKER_SDRYG( 38, 13) = 0.147795E+01 +PKER_SDRYG( 38, 14) = 0.138751E+01 +PKER_SDRYG( 38, 15) = 0.130259E+01 +PKER_SDRYG( 38, 16) = 0.122285E+01 +PKER_SDRYG( 38, 17) = 0.114798E+01 +PKER_SDRYG( 38, 18) = 0.107767E+01 +PKER_SDRYG( 38, 19) = 0.101165E+01 +PKER_SDRYG( 38, 20) = 0.949660E+00 +PKER_SDRYG( 38, 21) = 0.891452E+00 +PKER_SDRYG( 38, 22) = 0.836795E+00 +PKER_SDRYG( 38, 23) = 0.785472E+00 +PKER_SDRYG( 38, 24) = 0.737279E+00 +PKER_SDRYG( 38, 25) = 0.692026E+00 +PKER_SDRYG( 38, 26) = 0.649533E+00 +PKER_SDRYG( 38, 27) = 0.609632E+00 +PKER_SDRYG( 38, 28) = 0.572163E+00 +PKER_SDRYG( 38, 29) = 0.536978E+00 +PKER_SDRYG( 38, 30) = 0.503937E+00 +PKER_SDRYG( 38, 31) = 0.472910E+00 +PKER_SDRYG( 38, 32) = 0.443772E+00 +PKER_SDRYG( 38, 33) = 0.416408E+00 +PKER_SDRYG( 38, 34) = 0.390708E+00 +PKER_SDRYG( 38, 35) = 0.366570E+00 +PKER_SDRYG( 38, 36) = 0.343898E+00 +PKER_SDRYG( 38, 37) = 0.322600E+00 +PKER_SDRYG( 38, 38) = 0.302592E+00 +PKER_SDRYG( 38, 39) = 0.283791E+00 +PKER_SDRYG( 38, 40) = 0.266123E+00 +PKER_SDRYG( 38, 41) = 0.249515E+00 +PKER_SDRYG( 38, 42) = 0.233898E+00 +PKER_SDRYG( 38, 43) = 0.219208E+00 +PKER_SDRYG( 38, 44) = 0.205383E+00 +PKER_SDRYG( 38, 45) = 0.192364E+00 +PKER_SDRYG( 38, 46) = 0.180094E+00 +PKER_SDRYG( 38, 47) = 0.168518E+00 +PKER_SDRYG( 38, 48) = 0.157584E+00 +PKER_SDRYG( 38, 49) = 0.147240E+00 +PKER_SDRYG( 38, 50) = 0.137437E+00 +PKER_SDRYG( 38, 51) = 0.128131E+00 +PKER_SDRYG( 38, 52) = 0.119279E+00 +PKER_SDRYG( 38, 53) = 0.110847E+00 +PKER_SDRYG( 38, 54) = 0.102812E+00 +PKER_SDRYG( 38, 55) = 0.951603E-01 +PKER_SDRYG( 38, 56) = 0.878956E-01 +PKER_SDRYG( 38, 57) = 0.810320E-01 +PKER_SDRYG( 38, 58) = 0.745909E-01 +PKER_SDRYG( 38, 59) = 0.685921E-01 +PKER_SDRYG( 38, 60) = 0.630462E-01 +PKER_SDRYG( 38, 61) = 0.579494E-01 +PKER_SDRYG( 38, 62) = 0.532834E-01 +PKER_SDRYG( 38, 63) = 0.490188E-01 +PKER_SDRYG( 38, 64) = 0.451197E-01 +PKER_SDRYG( 38, 65) = 0.415486E-01 +PKER_SDRYG( 38, 66) = 0.382697E-01 +PKER_SDRYG( 38, 67) = 0.352502E-01 +PKER_SDRYG( 38, 68) = 0.324616E-01 +PKER_SDRYG( 38, 69) = 0.298793E-01 +PKER_SDRYG( 38, 70) = 0.274823E-01 +PKER_SDRYG( 38, 71) = 0.252528E-01 +PKER_SDRYG( 38, 72) = 0.231754E-01 +PKER_SDRYG( 38, 73) = 0.212373E-01 +PKER_SDRYG( 38, 74) = 0.194269E-01 +PKER_SDRYG( 38, 75) = 0.177345E-01 +PKER_SDRYG( 38, 76) = 0.161517E-01 +PKER_SDRYG( 38, 77) = 0.146709E-01 +PKER_SDRYG( 38, 78) = 0.132861E-01 +PKER_SDRYG( 38, 79) = 0.119920E-01 +PKER_SDRYG( 38, 80) = 0.107845E-01 +PKER_SDRYG( 39, 1) = 0.315147E+01 +PKER_SDRYG( 39, 2) = 0.295896E+01 +PKER_SDRYG( 39, 3) = 0.277819E+01 +PKER_SDRYG( 39, 4) = 0.260845E+01 +PKER_SDRYG( 39, 5) = 0.244907E+01 +PKER_SDRYG( 39, 6) = 0.229942E+01 +PKER_SDRYG( 39, 7) = 0.215889E+01 +PKER_SDRYG( 39, 8) = 0.202694E+01 +PKER_SDRYG( 39, 9) = 0.190304E+01 +PKER_SDRYG( 39, 10) = 0.178670E+01 +PKER_SDRYG( 39, 11) = 0.167746E+01 +PKER_SDRYG( 39, 12) = 0.157489E+01 +PKER_SDRYG( 39, 13) = 0.147857E+01 +PKER_SDRYG( 39, 14) = 0.138813E+01 +PKER_SDRYG( 39, 15) = 0.130321E+01 +PKER_SDRYG( 39, 16) = 0.122347E+01 +PKER_SDRYG( 39, 17) = 0.114859E+01 +PKER_SDRYG( 39, 18) = 0.107829E+01 +PKER_SDRYG( 39, 19) = 0.101227E+01 +PKER_SDRYG( 39, 20) = 0.950279E+00 +PKER_SDRYG( 39, 21) = 0.892072E+00 +PKER_SDRYG( 39, 22) = 0.837415E+00 +PKER_SDRYG( 39, 23) = 0.786093E+00 +PKER_SDRYG( 39, 24) = 0.737901E+00 +PKER_SDRYG( 39, 25) = 0.692649E+00 +PKER_SDRYG( 39, 26) = 0.650158E+00 +PKER_SDRYG( 39, 27) = 0.610257E+00 +PKER_SDRYG( 39, 28) = 0.572790E+00 +PKER_SDRYG( 39, 29) = 0.537608E+00 +PKER_SDRYG( 39, 30) = 0.504570E+00 +PKER_SDRYG( 39, 31) = 0.473545E+00 +PKER_SDRYG( 39, 32) = 0.444411E+00 +PKER_SDRYG( 39, 33) = 0.417051E+00 +PKER_SDRYG( 39, 34) = 0.391357E+00 +PKER_SDRYG( 39, 35) = 0.367225E+00 +PKER_SDRYG( 39, 36) = 0.344561E+00 +PKER_SDRYG( 39, 37) = 0.323272E+00 +PKER_SDRYG( 39, 38) = 0.303274E+00 +PKER_SDRYG( 39, 39) = 0.284487E+00 +PKER_SDRYG( 39, 40) = 0.266835E+00 +PKER_SDRYG( 39, 41) = 0.250245E+00 +PKER_SDRYG( 39, 42) = 0.234652E+00 +PKER_SDRYG( 39, 43) = 0.219989E+00 +PKER_SDRYG( 39, 44) = 0.206198E+00 +PKER_SDRYG( 39, 45) = 0.193218E+00 +PKER_SDRYG( 39, 46) = 0.180996E+00 +PKER_SDRYG( 39, 47) = 0.169478E+00 +PKER_SDRYG( 39, 48) = 0.158613E+00 +PKER_SDRYG( 39, 49) = 0.148351E+00 +PKER_SDRYG( 39, 50) = 0.138645E+00 +PKER_SDRYG( 39, 51) = 0.129448E+00 +PKER_SDRYG( 39, 52) = 0.120720E+00 +PKER_SDRYG( 39, 53) = 0.112420E+00 +PKER_SDRYG( 39, 54) = 0.104517E+00 +PKER_SDRYG( 39, 55) = 0.969883E-01 +PKER_SDRYG( 39, 56) = 0.898223E-01 +PKER_SDRYG( 39, 57) = 0.830208E-01 +PKER_SDRYG( 39, 58) = 0.765970E-01 +PKER_SDRYG( 39, 59) = 0.705698E-01 +PKER_SDRYG( 39, 60) = 0.649571E-01 +PKER_SDRYG( 39, 61) = 0.597681E-01 +PKER_SDRYG( 39, 62) = 0.549988E-01 +PKER_SDRYG( 39, 63) = 0.506318E-01 +PKER_SDRYG( 39, 64) = 0.466394E-01 +PKER_SDRYG( 39, 65) = 0.429883E-01 +PKER_SDRYG( 39, 66) = 0.396433E-01 +PKER_SDRYG( 39, 67) = 0.365711E-01 +PKER_SDRYG( 39, 68) = 0.337413E-01 +PKER_SDRYG( 39, 69) = 0.311271E-01 +PKER_SDRYG( 39, 70) = 0.287058E-01 +PKER_SDRYG( 39, 71) = 0.264578E-01 +PKER_SDRYG( 39, 72) = 0.243664E-01 +PKER_SDRYG( 39, 73) = 0.224176E-01 +PKER_SDRYG( 39, 74) = 0.205989E-01 +PKER_SDRYG( 39, 75) = 0.188998E-01 +PKER_SDRYG( 39, 76) = 0.173110E-01 +PKER_SDRYG( 39, 77) = 0.158243E-01 +PKER_SDRYG( 39, 78) = 0.144326E-01 +PKER_SDRYG( 39, 79) = 0.131297E-01 +PKER_SDRYG( 39, 80) = 0.119101E-01 +PKER_SDRYG( 40, 1) = 0.315200E+01 +PKER_SDRYG( 40, 2) = 0.295948E+01 +PKER_SDRYG( 40, 3) = 0.277872E+01 +PKER_SDRYG( 40, 4) = 0.260898E+01 +PKER_SDRYG( 40, 5) = 0.244960E+01 +PKER_SDRYG( 40, 6) = 0.229994E+01 +PKER_SDRYG( 40, 7) = 0.215942E+01 +PKER_SDRYG( 40, 8) = 0.202747E+01 +PKER_SDRYG( 40, 9) = 0.190357E+01 +PKER_SDRYG( 40, 10) = 0.178723E+01 +PKER_SDRYG( 40, 11) = 0.167799E+01 +PKER_SDRYG( 40, 12) = 0.157542E+01 +PKER_SDRYG( 40, 13) = 0.147910E+01 +PKER_SDRYG( 40, 14) = 0.138866E+01 +PKER_SDRYG( 40, 15) = 0.130374E+01 +PKER_SDRYG( 40, 16) = 0.122400E+01 +PKER_SDRYG( 40, 17) = 0.114912E+01 +PKER_SDRYG( 40, 18) = 0.107882E+01 +PKER_SDRYG( 40, 19) = 0.101280E+01 +PKER_SDRYG( 40, 20) = 0.950809E+00 +PKER_SDRYG( 40, 21) = 0.892602E+00 +PKER_SDRYG( 40, 22) = 0.837945E+00 +PKER_SDRYG( 40, 23) = 0.786624E+00 +PKER_SDRYG( 40, 24) = 0.738433E+00 +PKER_SDRYG( 40, 25) = 0.693182E+00 +PKER_SDRYG( 40, 26) = 0.650691E+00 +PKER_SDRYG( 40, 27) = 0.610792E+00 +PKER_SDRYG( 40, 28) = 0.573327E+00 +PKER_SDRYG( 40, 29) = 0.538146E+00 +PKER_SDRYG( 40, 30) = 0.505110E+00 +PKER_SDRYG( 40, 31) = 0.474088E+00 +PKER_SDRYG( 40, 32) = 0.444957E+00 +PKER_SDRYG( 40, 33) = 0.417600E+00 +PKER_SDRYG( 40, 34) = 0.391910E+00 +PKER_SDRYG( 40, 35) = 0.367783E+00 +PKER_SDRYG( 40, 36) = 0.345124E+00 +PKER_SDRYG( 40, 37) = 0.323843E+00 +PKER_SDRYG( 40, 38) = 0.303853E+00 +PKER_SDRYG( 40, 39) = 0.285076E+00 +PKER_SDRYG( 40, 40) = 0.267436E+00 +PKER_SDRYG( 40, 41) = 0.250861E+00 +PKER_SDRYG( 40, 42) = 0.235285E+00 +PKER_SDRYG( 40, 43) = 0.220643E+00 +PKER_SDRYG( 40, 44) = 0.206877E+00 +PKER_SDRYG( 40, 45) = 0.193928E+00 +PKER_SDRYG( 40, 46) = 0.181743E+00 +PKER_SDRYG( 40, 47) = 0.170269E+00 +PKER_SDRYG( 40, 48) = 0.159457E+00 +PKER_SDRYG( 40, 49) = 0.149258E+00 +PKER_SDRYG( 40, 50) = 0.139627E+00 +PKER_SDRYG( 40, 51) = 0.130518E+00 +PKER_SDRYG( 40, 52) = 0.121890E+00 +PKER_SDRYG( 40, 53) = 0.113703E+00 +PKER_SDRYG( 40, 54) = 0.105920E+00 +PKER_SDRYG( 40, 55) = 0.985112E-01 +PKER_SDRYG( 40, 56) = 0.914559E-01 +PKER_SDRYG( 40, 57) = 0.847430E-01 +PKER_SDRYG( 40, 58) = 0.783738E-01 +PKER_SDRYG( 40, 59) = 0.723597E-01 +PKER_SDRYG( 40, 60) = 0.667182E-01 +PKER_SDRYG( 40, 61) = 0.614651E-01 +PKER_SDRYG( 40, 62) = 0.566085E-01 +PKER_SDRYG( 40, 63) = 0.521442E-01 +PKER_SDRYG( 40, 64) = 0.480558E-01 +PKER_SDRYG( 40, 65) = 0.443173E-01 +PKER_SDRYG( 40, 66) = 0.408974E-01 +PKER_SDRYG( 40, 67) = 0.377635E-01 +PKER_SDRYG( 40, 68) = 0.348844E-01 +PKER_SDRYG( 40, 69) = 0.322318E-01 +PKER_SDRYG( 40, 70) = 0.297808E-01 +PKER_SDRYG( 40, 71) = 0.275102E-01 +PKER_SDRYG( 40, 72) = 0.254017E-01 +PKER_SDRYG( 40, 73) = 0.234398E-01 +PKER_SDRYG( 40, 74) = 0.216113E-01 +PKER_SDRYG( 40, 75) = 0.199047E-01 +PKER_SDRYG( 40, 76) = 0.183101E-01 +PKER_SDRYG( 40, 77) = 0.168188E-01 +PKER_SDRYG( 40, 78) = 0.154231E-01 +PKER_SDRYG( 40, 79) = 0.141161E-01 +PKER_SDRYG( 40, 80) = 0.128918E-01 +END IF +! +END SUBROUTINE LIMA_READ_XKER_SDRYG diff --git a/src/mesonh/micro/lima_read_xker_sweth.f90 b/src/mesonh/micro/lima_read_xker_sweth.f90 new file mode 100644 index 000000000..cfc5ade58 --- /dev/null +++ b/src/mesonh/micro/lima_read_xker_sweth.f90 @@ -0,0 +1,3337 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 microph 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ########################### + MODULE MODI_LIMA_READ_XKER_SWETH +! ########################### +! +INTERFACE + SUBROUTINE LIMA_READ_XKER_SWETH (KWETLBDAH,KWETLBDAS,KND, & + PALPHAH,PNUH,PALPHAS,PNUS,PEHS,PBS,PCH,PDH,PCS,PDS, & + PWETLBDAH_MAX,PWETLBDAS_MAX,PWETLBDAH_MIN,PWETLBDAS_MIN, & + PFDINFTY,PKER_SWETH ) +! +INTEGER, INTENT(OUT) :: KND,KWETLBDAH,KWETLBDAS +REAL, INTENT(OUT) :: PALPHAH +REAL, INTENT(OUT) :: PNUH +REAL, INTENT(OUT) :: PALPHAS +REAL, INTENT(OUT) :: PNUS +REAL, INTENT(OUT) :: PEHS +REAL, INTENT(OUT) :: PBS +REAL, INTENT(OUT) :: PCH +REAL, INTENT(OUT) :: PDH +REAL, INTENT(OUT) :: PCS +REAL, INTENT(OUT) :: PDS +REAL, INTENT(OUT) :: PWETLBDAH_MAX +REAL, INTENT(OUT) :: PWETLBDAS_MAX +REAL, INTENT(OUT) :: PWETLBDAH_MIN +REAL, INTENT(OUT) :: PWETLBDAS_MIN +REAL, INTENT(OUT) :: PFDINFTY +REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PKER_SWETH +! +END SUBROUTINE LIMA_READ_XKER_SWETH +! +END INTERFACE +! +END MODULE MODI_LIMA_READ_XKER_SWETH +! ######################################################################## + SUBROUTINE LIMA_READ_XKER_SWETH (KWETLBDAH,KWETLBDAS,KND, & + PALPHAH,PNUH,PALPHAS,PNUS,PEHS,PBS,PCH,PDH,PCS,PDS, & + PWETLBDAH_MAX,PWETLBDAS_MAX,PWETLBDAH_MIN,PWETLBDAS_MIN, & + PFDINFTY,PKER_SWETH ) +! ######################################################################## +! +!!**** * * - initialize the kernels for the snow-hail wet growth process +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to initialize the kernels PKER_SWETH +!! prepared from a previous run of the routine INI_RAIN_ICE. The reading +!! of the kernels is optional after checking for the dimensions of the +!! arrays. +!! +!!** METHOD +!! ------ +!! +!! +!! EXTERNAL +!! -------- +!! None +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! Book2 of documentation ( routine READ_XKER_SWETH ) +!! +!! AUTHOR +!! ------ +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original 19/04/97 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +!* 0.2 Declarations of local variables : +! +! +INTEGER, INTENT(OUT) :: KND,KWETLBDAH,KWETLBDAS +REAL, INTENT(OUT) :: PALPHAH +REAL, INTENT(OUT) :: PNUH +REAL, INTENT(OUT) :: PALPHAS +REAL, INTENT(OUT) :: PNUS +REAL, INTENT(OUT) :: PEHS +REAL, INTENT(OUT) :: PBS +REAL, INTENT(OUT) :: PCH +REAL, INTENT(OUT) :: PDH +REAL, INTENT(OUT) :: PCS +REAL, INTENT(OUT) :: PDS +REAL, INTENT(OUT) :: PWETLBDAH_MAX +REAL, INTENT(OUT) :: PWETLBDAS_MAX +REAL, INTENT(OUT) :: PWETLBDAH_MIN +REAL, INTENT(OUT) :: PWETLBDAS_MIN +REAL, INTENT(OUT) :: PFDINFTY +REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PKER_SWETH +! +! ######################################################################## +! #INSERT HERE THE OUTPUT OF INI_RAIN_ICE_HAIL IF THE KERNELS ARE UPDATED# +! ######################################################################## +! +KND= 50 +KWETLBDAH= 40 +KWETLBDAS= 80 +PALPHAH= 0.100000E+01 +PNUH= 0.800000E+01 +PALPHAS= 0.100000E+01 +PNUS= 0.100000E+01 +PEHS= 0.100000E+01 +PBS= 0.190000E+01 +PCH= 0.201000E+03 +PDH= 0.640000E+00 +PCS= 0.500000E+01 +PDS= 0.270000E+00 +PWETLBDAH_MAX= 0.100000E+08 +PWETLBDAS_MAX= 0.250000E+10 +PWETLBDAH_MIN= 0.100000E+04 +PWETLBDAS_MIN= 0.250000E+02 +PFDINFTY= 0.200000E+02 +! +IF( PRESENT(PKER_SWETH) ) THEN +PKER_SWETH( 1, 1) = 0.594408E+01 +PKER_SWETH( 1, 2) = 0.615804E+01 +PKER_SWETH( 1, 3) = 0.636519E+01 +PKER_SWETH( 1, 4) = 0.656714E+01 +PKER_SWETH( 1, 5) = 0.676556E+01 +PKER_SWETH( 1, 6) = 0.696207E+01 +PKER_SWETH( 1, 7) = 0.715814E+01 +PKER_SWETH( 1, 8) = 0.735491E+01 +PKER_SWETH( 1, 9) = 0.755300E+01 +PKER_SWETH( 1, 10) = 0.775225E+01 +PKER_SWETH( 1, 11) = 0.795159E+01 +PKER_SWETH( 1, 12) = 0.814900E+01 +PKER_SWETH( 1, 13) = 0.834171E+01 +PKER_SWETH( 1, 14) = 0.852662E+01 +PKER_SWETH( 1, 15) = 0.870080E+01 +PKER_SWETH( 1, 16) = 0.886196E+01 +PKER_SWETH( 1, 17) = 0.900870E+01 +PKER_SWETH( 1, 18) = 0.914061E+01 +PKER_SWETH( 1, 19) = 0.925806E+01 +PKER_SWETH( 1, 20) = 0.936202E+01 +PKER_SWETH( 1, 21) = 0.945377E+01 +PKER_SWETH( 1, 22) = 0.953473E+01 +PKER_SWETH( 1, 23) = 0.960629E+01 +PKER_SWETH( 1, 24) = 0.966973E+01 +PKER_SWETH( 1, 25) = 0.972622E+01 +PKER_SWETH( 1, 26) = 0.977674E+01 +PKER_SWETH( 1, 27) = 0.982214E+01 +PKER_SWETH( 1, 28) = 0.986313E+01 +PKER_SWETH( 1, 29) = 0.990032E+01 +PKER_SWETH( 1, 30) = 0.993419E+01 +PKER_SWETH( 1, 31) = 0.996517E+01 +PKER_SWETH( 1, 32) = 0.999360E+01 +PKER_SWETH( 1, 33) = 0.100198E+02 +PKER_SWETH( 1, 34) = 0.100439E+02 +PKER_SWETH( 1, 35) = 0.100663E+02 +PKER_SWETH( 1, 36) = 0.100870E+02 +PKER_SWETH( 1, 37) = 0.101063E+02 +PKER_SWETH( 1, 38) = 0.101243E+02 +PKER_SWETH( 1, 39) = 0.101410E+02 +PKER_SWETH( 1, 40) = 0.101566E+02 +PKER_SWETH( 1, 41) = 0.101711E+02 +PKER_SWETH( 1, 42) = 0.101847E+02 +PKER_SWETH( 1, 43) = 0.101975E+02 +PKER_SWETH( 1, 44) = 0.102094E+02 +PKER_SWETH( 1, 45) = 0.102206E+02 +PKER_SWETH( 1, 46) = 0.102310E+02 +PKER_SWETH( 1, 47) = 0.102408E+02 +PKER_SWETH( 1, 48) = 0.102500E+02 +PKER_SWETH( 1, 49) = 0.102586E+02 +PKER_SWETH( 1, 50) = 0.102667E+02 +PKER_SWETH( 1, 51) = 0.102743E+02 +PKER_SWETH( 1, 52) = 0.102814E+02 +PKER_SWETH( 1, 53) = 0.102880E+02 +PKER_SWETH( 1, 54) = 0.102943E+02 +PKER_SWETH( 1, 55) = 0.103002E+02 +PKER_SWETH( 1, 56) = 0.103057E+02 +PKER_SWETH( 1, 57) = 0.103108E+02 +PKER_SWETH( 1, 58) = 0.103157E+02 +PKER_SWETH( 1, 59) = 0.103203E+02 +PKER_SWETH( 1, 60) = 0.103245E+02 +PKER_SWETH( 1, 61) = 0.103286E+02 +PKER_SWETH( 1, 62) = 0.103323E+02 +PKER_SWETH( 1, 63) = 0.103359E+02 +PKER_SWETH( 1, 64) = 0.103392E+02 +PKER_SWETH( 1, 65) = 0.103423E+02 +PKER_SWETH( 1, 66) = 0.103453E+02 +PKER_SWETH( 1, 67) = 0.103480E+02 +PKER_SWETH( 1, 68) = 0.103506E+02 +PKER_SWETH( 1, 69) = 0.103530E+02 +PKER_SWETH( 1, 70) = 0.103553E+02 +PKER_SWETH( 1, 71) = 0.103574E+02 +PKER_SWETH( 1, 72) = 0.103595E+02 +PKER_SWETH( 1, 73) = 0.103613E+02 +PKER_SWETH( 1, 74) = 0.103631E+02 +PKER_SWETH( 1, 75) = 0.103648E+02 +PKER_SWETH( 1, 76) = 0.103663E+02 +PKER_SWETH( 1, 77) = 0.103678E+02 +PKER_SWETH( 1, 78) = 0.103692E+02 +PKER_SWETH( 1, 79) = 0.103705E+02 +PKER_SWETH( 1, 80) = 0.103717E+02 +PKER_SWETH( 2, 1) = 0.465456E+01 +PKER_SWETH( 2, 2) = 0.486187E+01 +PKER_SWETH( 2, 3) = 0.506117E+01 +PKER_SWETH( 2, 4) = 0.525380E+01 +PKER_SWETH( 2, 5) = 0.544116E+01 +PKER_SWETH( 2, 6) = 0.562472E+01 +PKER_SWETH( 2, 7) = 0.580594E+01 +PKER_SWETH( 2, 8) = 0.598611E+01 +PKER_SWETH( 2, 9) = 0.616626E+01 +PKER_SWETH( 2, 10) = 0.634695E+01 +PKER_SWETH( 2, 11) = 0.652809E+01 +PKER_SWETH( 2, 12) = 0.670877E+01 +PKER_SWETH( 2, 13) = 0.688725E+01 +PKER_SWETH( 2, 14) = 0.706117E+01 +PKER_SWETH( 2, 15) = 0.722787E+01 +PKER_SWETH( 2, 16) = 0.738481E+01 +PKER_SWETH( 2, 17) = 0.753004E+01 +PKER_SWETH( 2, 18) = 0.766237E+01 +PKER_SWETH( 2, 19) = 0.778146E+01 +PKER_SWETH( 2, 20) = 0.788768E+01 +PKER_SWETH( 2, 21) = 0.798187E+01 +PKER_SWETH( 2, 22) = 0.806519E+01 +PKER_SWETH( 2, 23) = 0.813889E+01 +PKER_SWETH( 2, 24) = 0.820419E+01 +PKER_SWETH( 2, 25) = 0.826224E+01 +PKER_SWETH( 2, 26) = 0.831405E+01 +PKER_SWETH( 2, 27) = 0.836050E+01 +PKER_SWETH( 2, 28) = 0.840234E+01 +PKER_SWETH( 2, 29) = 0.844021E+01 +PKER_SWETH( 2, 30) = 0.847462E+01 +PKER_SWETH( 2, 31) = 0.850603E+01 +PKER_SWETH( 2, 32) = 0.853480E+01 +PKER_SWETH( 2, 33) = 0.856125E+01 +PKER_SWETH( 2, 34) = 0.858563E+01 +PKER_SWETH( 2, 35) = 0.860816E+01 +PKER_SWETH( 2, 36) = 0.862904E+01 +PKER_SWETH( 2, 37) = 0.864841E+01 +PKER_SWETH( 2, 38) = 0.866643E+01 +PKER_SWETH( 2, 39) = 0.868321E+01 +PKER_SWETH( 2, 40) = 0.869886E+01 +PKER_SWETH( 2, 41) = 0.871346E+01 +PKER_SWETH( 2, 42) = 0.872711E+01 +PKER_SWETH( 2, 43) = 0.873987E+01 +PKER_SWETH( 2, 44) = 0.875180E+01 +PKER_SWETH( 2, 45) = 0.876298E+01 +PKER_SWETH( 2, 46) = 0.877344E+01 +PKER_SWETH( 2, 47) = 0.878325E+01 +PKER_SWETH( 2, 48) = 0.879244E+01 +PKER_SWETH( 2, 49) = 0.880106E+01 +PKER_SWETH( 2, 50) = 0.880914E+01 +PKER_SWETH( 2, 51) = 0.881672E+01 +PKER_SWETH( 2, 52) = 0.882383E+01 +PKER_SWETH( 2, 53) = 0.883050E+01 +PKER_SWETH( 2, 54) = 0.883676E+01 +PKER_SWETH( 2, 55) = 0.884263E+01 +PKER_SWETH( 2, 56) = 0.884815E+01 +PKER_SWETH( 2, 57) = 0.885332E+01 +PKER_SWETH( 2, 58) = 0.885818E+01 +PKER_SWETH( 2, 59) = 0.886274E+01 +PKER_SWETH( 2, 60) = 0.886702E+01 +PKER_SWETH( 2, 61) = 0.887104E+01 +PKER_SWETH( 2, 62) = 0.887482E+01 +PKER_SWETH( 2, 63) = 0.887836E+01 +PKER_SWETH( 2, 64) = 0.888169E+01 +PKER_SWETH( 2, 65) = 0.888481E+01 +PKER_SWETH( 2, 66) = 0.888774E+01 +PKER_SWETH( 2, 67) = 0.889049E+01 +PKER_SWETH( 2, 68) = 0.889308E+01 +PKER_SWETH( 2, 69) = 0.889551E+01 +PKER_SWETH( 2, 70) = 0.889778E+01 +PKER_SWETH( 2, 71) = 0.889992E+01 +PKER_SWETH( 2, 72) = 0.890193E+01 +PKER_SWETH( 2, 73) = 0.890382E+01 +PKER_SWETH( 2, 74) = 0.890559E+01 +PKER_SWETH( 2, 75) = 0.890725E+01 +PKER_SWETH( 2, 76) = 0.890882E+01 +PKER_SWETH( 2, 77) = 0.891028E+01 +PKER_SWETH( 2, 78) = 0.891166E+01 +PKER_SWETH( 2, 79) = 0.891295E+01 +PKER_SWETH( 2, 80) = 0.891417E+01 +PKER_SWETH( 3, 1) = 0.355241E+01 +PKER_SWETH( 3, 2) = 0.375388E+01 +PKER_SWETH( 3, 3) = 0.394699E+01 +PKER_SWETH( 3, 4) = 0.413258E+01 +PKER_SWETH( 3, 5) = 0.431174E+01 +PKER_SWETH( 3, 6) = 0.448568E+01 +PKER_SWETH( 3, 7) = 0.465567E+01 +PKER_SWETH( 3, 8) = 0.482298E+01 +PKER_SWETH( 3, 9) = 0.498877E+01 +PKER_SWETH( 3, 10) = 0.515397E+01 +PKER_SWETH( 3, 11) = 0.531908E+01 +PKER_SWETH( 3, 12) = 0.548405E+01 +PKER_SWETH( 3, 13) = 0.564811E+01 +PKER_SWETH( 3, 14) = 0.580980E+01 +PKER_SWETH( 3, 15) = 0.596707E+01 +PKER_SWETH( 3, 16) = 0.611763E+01 +PKER_SWETH( 3, 17) = 0.625931E+01 +PKER_SWETH( 3, 18) = 0.639043E+01 +PKER_SWETH( 3, 19) = 0.650999E+01 +PKER_SWETH( 3, 20) = 0.661772E+01 +PKER_SWETH( 3, 21) = 0.671394E+01 +PKER_SWETH( 3, 22) = 0.679944E+01 +PKER_SWETH( 3, 23) = 0.687523E+01 +PKER_SWETH( 3, 24) = 0.694243E+01 +PKER_SWETH( 3, 25) = 0.700212E+01 +PKER_SWETH( 3, 26) = 0.705531E+01 +PKER_SWETH( 3, 27) = 0.710290E+01 +PKER_SWETH( 3, 28) = 0.714567E+01 +PKER_SWETH( 3, 29) = 0.718428E+01 +PKER_SWETH( 3, 30) = 0.721929E+01 +PKER_SWETH( 3, 31) = 0.725118E+01 +PKER_SWETH( 3, 32) = 0.728033E+01 +PKER_SWETH( 3, 33) = 0.730707E+01 +PKER_SWETH( 3, 34) = 0.733169E+01 +PKER_SWETH( 3, 35) = 0.735440E+01 +PKER_SWETH( 3, 36) = 0.737543E+01 +PKER_SWETH( 3, 37) = 0.739492E+01 +PKER_SWETH( 3, 38) = 0.741303E+01 +PKER_SWETH( 3, 39) = 0.742988E+01 +PKER_SWETH( 3, 40) = 0.744559E+01 +PKER_SWETH( 3, 41) = 0.746023E+01 +PKER_SWETH( 3, 42) = 0.747391E+01 +PKER_SWETH( 3, 43) = 0.748670E+01 +PKER_SWETH( 3, 44) = 0.749866E+01 +PKER_SWETH( 3, 45) = 0.750985E+01 +PKER_SWETH( 3, 46) = 0.752033E+01 +PKER_SWETH( 3, 47) = 0.753014E+01 +PKER_SWETH( 3, 48) = 0.753934E+01 +PKER_SWETH( 3, 49) = 0.754797E+01 +PKER_SWETH( 3, 50) = 0.755605E+01 +PKER_SWETH( 3, 51) = 0.756364E+01 +PKER_SWETH( 3, 52) = 0.757075E+01 +PKER_SWETH( 3, 53) = 0.757742E+01 +PKER_SWETH( 3, 54) = 0.758369E+01 +PKER_SWETH( 3, 55) = 0.758956E+01 +PKER_SWETH( 3, 56) = 0.759508E+01 +PKER_SWETH( 3, 57) = 0.760025E+01 +PKER_SWETH( 3, 58) = 0.760511E+01 +PKER_SWETH( 3, 59) = 0.760967E+01 +PKER_SWETH( 3, 60) = 0.761396E+01 +PKER_SWETH( 3, 61) = 0.761798E+01 +PKER_SWETH( 3, 62) = 0.762175E+01 +PKER_SWETH( 3, 63) = 0.762529E+01 +PKER_SWETH( 3, 64) = 0.762862E+01 +PKER_SWETH( 3, 65) = 0.763174E+01 +PKER_SWETH( 3, 66) = 0.763467E+01 +PKER_SWETH( 3, 67) = 0.763743E+01 +PKER_SWETH( 3, 68) = 0.764001E+01 +PKER_SWETH( 3, 69) = 0.764244E+01 +PKER_SWETH( 3, 70) = 0.764472E+01 +PKER_SWETH( 3, 71) = 0.764686E+01 +PKER_SWETH( 3, 72) = 0.764887E+01 +PKER_SWETH( 3, 73) = 0.765075E+01 +PKER_SWETH( 3, 74) = 0.765253E+01 +PKER_SWETH( 3, 75) = 0.765419E+01 +PKER_SWETH( 3, 76) = 0.765575E+01 +PKER_SWETH( 3, 77) = 0.765722E+01 +PKER_SWETH( 3, 78) = 0.765859E+01 +PKER_SWETH( 3, 79) = 0.765989E+01 +PKER_SWETH( 3, 80) = 0.766110E+01 +PKER_SWETH( 4, 1) = 0.261585E+01 +PKER_SWETH( 4, 2) = 0.280948E+01 +PKER_SWETH( 4, 3) = 0.299603E+01 +PKER_SWETH( 4, 4) = 0.317539E+01 +PKER_SWETH( 4, 5) = 0.334799E+01 +PKER_SWETH( 4, 6) = 0.351456E+01 +PKER_SWETH( 4, 7) = 0.367607E+01 +PKER_SWETH( 4, 8) = 0.383360E+01 +PKER_SWETH( 4, 9) = 0.398823E+01 +PKER_SWETH( 4, 10) = 0.414100E+01 +PKER_SWETH( 4, 11) = 0.429270E+01 +PKER_SWETH( 4, 12) = 0.444383E+01 +PKER_SWETH( 4, 13) = 0.459433E+01 +PKER_SWETH( 4, 14) = 0.474359E+01 +PKER_SWETH( 4, 15) = 0.489033E+01 +PKER_SWETH( 4, 16) = 0.503281E+01 +PKER_SWETH( 4, 17) = 0.516906E+01 +PKER_SWETH( 4, 18) = 0.529721E+01 +PKER_SWETH( 4, 19) = 0.541582E+01 +PKER_SWETH( 4, 20) = 0.552404E+01 +PKER_SWETH( 4, 21) = 0.562165E+01 +PKER_SWETH( 4, 22) = 0.570898E+01 +PKER_SWETH( 4, 23) = 0.578673E+01 +PKER_SWETH( 4, 24) = 0.585579E+01 +PKER_SWETH( 4, 25) = 0.591716E+01 +PKER_SWETH( 4, 26) = 0.597181E+01 +PKER_SWETH( 4, 27) = 0.602062E+01 +PKER_SWETH( 4, 28) = 0.606439E+01 +PKER_SWETH( 4, 29) = 0.610382E+01 +PKER_SWETH( 4, 30) = 0.613949E+01 +PKER_SWETH( 4, 31) = 0.617190E+01 +PKER_SWETH( 4, 32) = 0.620147E+01 +PKER_SWETH( 4, 33) = 0.622855E+01 +PKER_SWETH( 4, 34) = 0.625342E+01 +PKER_SWETH( 4, 35) = 0.627635E+01 +PKER_SWETH( 4, 36) = 0.629753E+01 +PKER_SWETH( 4, 37) = 0.631716E+01 +PKER_SWETH( 4, 38) = 0.633537E+01 +PKER_SWETH( 4, 39) = 0.635230E+01 +PKER_SWETH( 4, 40) = 0.636806E+01 +PKER_SWETH( 4, 41) = 0.638276E+01 +PKER_SWETH( 4, 42) = 0.639648E+01 +PKER_SWETH( 4, 43) = 0.640930E+01 +PKER_SWETH( 4, 44) = 0.642128E+01 +PKER_SWETH( 4, 45) = 0.643249E+01 +PKER_SWETH( 4, 46) = 0.644298E+01 +PKER_SWETH( 4, 47) = 0.645281E+01 +PKER_SWETH( 4, 48) = 0.646202E+01 +PKER_SWETH( 4, 49) = 0.647065E+01 +PKER_SWETH( 4, 50) = 0.647874E+01 +PKER_SWETH( 4, 51) = 0.648633E+01 +PKER_SWETH( 4, 52) = 0.649345E+01 +PKER_SWETH( 4, 53) = 0.650012E+01 +PKER_SWETH( 4, 54) = 0.650639E+01 +PKER_SWETH( 4, 55) = 0.651227E+01 +PKER_SWETH( 4, 56) = 0.651778E+01 +PKER_SWETH( 4, 57) = 0.652296E+01 +PKER_SWETH( 4, 58) = 0.652782E+01 +PKER_SWETH( 4, 59) = 0.653238E+01 +PKER_SWETH( 4, 60) = 0.653666E+01 +PKER_SWETH( 4, 61) = 0.654068E+01 +PKER_SWETH( 4, 62) = 0.654446E+01 +PKER_SWETH( 4, 63) = 0.654800E+01 +PKER_SWETH( 4, 64) = 0.655133E+01 +PKER_SWETH( 4, 65) = 0.655445E+01 +PKER_SWETH( 4, 66) = 0.655738E+01 +PKER_SWETH( 4, 67) = 0.656014E+01 +PKER_SWETH( 4, 68) = 0.656272E+01 +PKER_SWETH( 4, 69) = 0.656515E+01 +PKER_SWETH( 4, 70) = 0.656743E+01 +PKER_SWETH( 4, 71) = 0.656957E+01 +PKER_SWETH( 4, 72) = 0.657158E+01 +PKER_SWETH( 4, 73) = 0.657346E+01 +PKER_SWETH( 4, 74) = 0.657524E+01 +PKER_SWETH( 4, 75) = 0.657690E+01 +PKER_SWETH( 4, 76) = 0.657846E+01 +PKER_SWETH( 4, 77) = 0.657993E+01 +PKER_SWETH( 4, 78) = 0.658130E+01 +PKER_SWETH( 4, 79) = 0.658260E+01 +PKER_SWETH( 4, 80) = 0.658381E+01 +PKER_SWETH( 5, 1) = 0.183666E+01 +PKER_SWETH( 5, 2) = 0.201461E+01 +PKER_SWETH( 5, 3) = 0.219011E+01 +PKER_SWETH( 5, 4) = 0.236116E+01 +PKER_SWETH( 5, 5) = 0.252677E+01 +PKER_SWETH( 5, 6) = 0.268674E+01 +PKER_SWETH( 5, 7) = 0.284137E+01 +PKER_SWETH( 5, 8) = 0.299127E+01 +PKER_SWETH( 5, 9) = 0.313728E+01 +PKER_SWETH( 5, 10) = 0.328031E+01 +PKER_SWETH( 5, 11) = 0.342122E+01 +PKER_SWETH( 5, 12) = 0.356074E+01 +PKER_SWETH( 5, 13) = 0.369927E+01 +PKER_SWETH( 5, 14) = 0.383682E+01 +PKER_SWETH( 5, 15) = 0.397284E+01 +PKER_SWETH( 5, 16) = 0.410626E+01 +PKER_SWETH( 5, 17) = 0.423559E+01 +PKER_SWETH( 5, 18) = 0.435911E+01 +PKER_SWETH( 5, 19) = 0.447524E+01 +PKER_SWETH( 5, 20) = 0.458272E+01 +PKER_SWETH( 5, 21) = 0.468086E+01 +PKER_SWETH( 5, 22) = 0.476948E+01 +PKER_SWETH( 5, 23) = 0.484888E+01 +PKER_SWETH( 5, 24) = 0.491969E+01 +PKER_SWETH( 5, 25) = 0.498273E+01 +PKER_SWETH( 5, 26) = 0.503887E+01 +PKER_SWETH( 5, 27) = 0.508897E+01 +PKER_SWETH( 5, 28) = 0.513382E+01 +PKER_SWETH( 5, 29) = 0.517414E+01 +PKER_SWETH( 5, 30) = 0.521054E+01 +PKER_SWETH( 5, 31) = 0.524353E+01 +PKER_SWETH( 5, 32) = 0.527356E+01 +PKER_SWETH( 5, 33) = 0.530100E+01 +PKER_SWETH( 5, 34) = 0.532617E+01 +PKER_SWETH( 5, 35) = 0.534933E+01 +PKER_SWETH( 5, 36) = 0.537069E+01 +PKER_SWETH( 5, 37) = 0.539046E+01 +PKER_SWETH( 5, 38) = 0.540878E+01 +PKER_SWETH( 5, 39) = 0.542580E+01 +PKER_SWETH( 5, 40) = 0.544164E+01 +PKER_SWETH( 5, 41) = 0.545639E+01 +PKER_SWETH( 5, 42) = 0.547015E+01 +PKER_SWETH( 5, 43) = 0.548300E+01 +PKER_SWETH( 5, 44) = 0.549501E+01 +PKER_SWETH( 5, 45) = 0.550624E+01 +PKER_SWETH( 5, 46) = 0.551675E+01 +PKER_SWETH( 5, 47) = 0.552659E+01 +PKER_SWETH( 5, 48) = 0.553581E+01 +PKER_SWETH( 5, 49) = 0.554445E+01 +PKER_SWETH( 5, 50) = 0.555254E+01 +PKER_SWETH( 5, 51) = 0.556014E+01 +PKER_SWETH( 5, 52) = 0.556726E+01 +PKER_SWETH( 5, 53) = 0.557394E+01 +PKER_SWETH( 5, 54) = 0.558021E+01 +PKER_SWETH( 5, 55) = 0.558609E+01 +PKER_SWETH( 5, 56) = 0.559160E+01 +PKER_SWETH( 5, 57) = 0.559678E+01 +PKER_SWETH( 5, 58) = 0.560164E+01 +PKER_SWETH( 5, 59) = 0.560621E+01 +PKER_SWETH( 5, 60) = 0.561049E+01 +PKER_SWETH( 5, 61) = 0.561451E+01 +PKER_SWETH( 5, 62) = 0.561829E+01 +PKER_SWETH( 5, 63) = 0.562183E+01 +PKER_SWETH( 5, 64) = 0.562516E+01 +PKER_SWETH( 5, 65) = 0.562828E+01 +PKER_SWETH( 5, 66) = 0.563121E+01 +PKER_SWETH( 5, 67) = 0.563396E+01 +PKER_SWETH( 5, 68) = 0.563655E+01 +PKER_SWETH( 5, 69) = 0.563898E+01 +PKER_SWETH( 5, 70) = 0.564126E+01 +PKER_SWETH( 5, 71) = 0.564340E+01 +PKER_SWETH( 5, 72) = 0.564540E+01 +PKER_SWETH( 5, 73) = 0.564729E+01 +PKER_SWETH( 5, 74) = 0.564906E+01 +PKER_SWETH( 5, 75) = 0.565073E+01 +PKER_SWETH( 5, 76) = 0.565229E+01 +PKER_SWETH( 5, 77) = 0.565375E+01 +PKER_SWETH( 5, 78) = 0.565513E+01 +PKER_SWETH( 5, 79) = 0.565642E+01 +PKER_SWETH( 5, 80) = 0.565764E+01 +PKER_SWETH( 6, 1) = 0.122732E+01 +PKER_SWETH( 6, 2) = 0.137201E+01 +PKER_SWETH( 6, 3) = 0.152420E+01 +PKER_SWETH( 6, 4) = 0.167900E+01 +PKER_SWETH( 6, 5) = 0.183306E+01 +PKER_SWETH( 6, 6) = 0.198423E+01 +PKER_SWETH( 6, 7) = 0.213147E+01 +PKER_SWETH( 6, 8) = 0.227444E+01 +PKER_SWETH( 6, 9) = 0.241330E+01 +PKER_SWETH( 6, 10) = 0.254856E+01 +PKER_SWETH( 6, 11) = 0.268088E+01 +PKER_SWETH( 6, 12) = 0.281097E+01 +PKER_SWETH( 6, 13) = 0.293942E+01 +PKER_SWETH( 6, 14) = 0.306659E+01 +PKER_SWETH( 6, 15) = 0.319250E+01 +PKER_SWETH( 6, 16) = 0.331667E+01 +PKER_SWETH( 6, 17) = 0.343821E+01 +PKER_SWETH( 6, 18) = 0.355580E+01 +PKER_SWETH( 6, 19) = 0.366800E+01 +PKER_SWETH( 6, 20) = 0.377342E+01 +PKER_SWETH( 6, 21) = 0.387101E+01 +PKER_SWETH( 6, 22) = 0.396016E+01 +PKER_SWETH( 6, 23) = 0.404075E+01 +PKER_SWETH( 6, 24) = 0.411307E+01 +PKER_SWETH( 6, 25) = 0.417768E+01 +PKER_SWETH( 6, 26) = 0.423531E+01 +PKER_SWETH( 6, 27) = 0.428674E+01 +PKER_SWETH( 6, 28) = 0.433274E+01 +PKER_SWETH( 6, 29) = 0.437401E+01 +PKER_SWETH( 6, 30) = 0.441119E+01 +PKER_SWETH( 6, 31) = 0.444482E+01 +PKER_SWETH( 6, 32) = 0.447537E+01 +PKER_SWETH( 6, 33) = 0.450322E+01 +PKER_SWETH( 6, 34) = 0.452871E+01 +PKER_SWETH( 6, 35) = 0.455213E+01 +PKER_SWETH( 6, 36) = 0.457369E+01 +PKER_SWETH( 6, 37) = 0.459362E+01 +PKER_SWETH( 6, 38) = 0.461207E+01 +PKER_SWETH( 6, 39) = 0.462919E+01 +PKER_SWETH( 6, 40) = 0.464510E+01 +PKER_SWETH( 6, 41) = 0.465991E+01 +PKER_SWETH( 6, 42) = 0.467372E+01 +PKER_SWETH( 6, 43) = 0.468661E+01 +PKER_SWETH( 6, 44) = 0.469865E+01 +PKER_SWETH( 6, 45) = 0.470990E+01 +PKER_SWETH( 6, 46) = 0.472043E+01 +PKER_SWETH( 6, 47) = 0.473028E+01 +PKER_SWETH( 6, 48) = 0.473951E+01 +PKER_SWETH( 6, 49) = 0.474816E+01 +PKER_SWETH( 6, 50) = 0.475627E+01 +PKER_SWETH( 6, 51) = 0.476387E+01 +PKER_SWETH( 6, 52) = 0.477099E+01 +PKER_SWETH( 6, 53) = 0.477767E+01 +PKER_SWETH( 6, 54) = 0.478394E+01 +PKER_SWETH( 6, 55) = 0.478983E+01 +PKER_SWETH( 6, 56) = 0.479535E+01 +PKER_SWETH( 6, 57) = 0.480053E+01 +PKER_SWETH( 6, 58) = 0.480539E+01 +PKER_SWETH( 6, 59) = 0.480995E+01 +PKER_SWETH( 6, 60) = 0.481424E+01 +PKER_SWETH( 6, 61) = 0.481826E+01 +PKER_SWETH( 6, 62) = 0.482203E+01 +PKER_SWETH( 6, 63) = 0.482557E+01 +PKER_SWETH( 6, 64) = 0.482890E+01 +PKER_SWETH( 6, 65) = 0.483203E+01 +PKER_SWETH( 6, 66) = 0.483496E+01 +PKER_SWETH( 6, 67) = 0.483771E+01 +PKER_SWETH( 6, 68) = 0.484030E+01 +PKER_SWETH( 6, 69) = 0.484272E+01 +PKER_SWETH( 6, 70) = 0.484500E+01 +PKER_SWETH( 6, 71) = 0.484714E+01 +PKER_SWETH( 6, 72) = 0.484915E+01 +PKER_SWETH( 6, 73) = 0.485104E+01 +PKER_SWETH( 6, 74) = 0.485281E+01 +PKER_SWETH( 6, 75) = 0.485447E+01 +PKER_SWETH( 6, 76) = 0.485604E+01 +PKER_SWETH( 6, 77) = 0.485750E+01 +PKER_SWETH( 6, 78) = 0.485888E+01 +PKER_SWETH( 6, 79) = 0.486017E+01 +PKER_SWETH( 6, 80) = 0.486139E+01 +PKER_SWETH( 7, 1) = 0.820900E+00 +PKER_SWETH( 7, 2) = 0.905506E+00 +PKER_SWETH( 7, 3) = 0.101233E+01 +PKER_SWETH( 7, 4) = 0.113395E+01 +PKER_SWETH( 7, 5) = 0.126438E+01 +PKER_SWETH( 7, 6) = 0.139888E+01 +PKER_SWETH( 7, 7) = 0.153405E+01 +PKER_SWETH( 7, 8) = 0.166779E+01 +PKER_SWETH( 7, 9) = 0.179891E+01 +PKER_SWETH( 7, 10) = 0.192695E+01 +PKER_SWETH( 7, 11) = 0.205196E+01 +PKER_SWETH( 7, 12) = 0.217429E+01 +PKER_SWETH( 7, 13) = 0.229440E+01 +PKER_SWETH( 7, 14) = 0.241276E+01 +PKER_SWETH( 7, 15) = 0.252965E+01 +PKER_SWETH( 7, 16) = 0.264507E+01 +PKER_SWETH( 7, 17) = 0.275862E+01 +PKER_SWETH( 7, 18) = 0.286951E+01 +PKER_SWETH( 7, 19) = 0.297663E+01 +PKER_SWETH( 7, 20) = 0.307872E+01 +PKER_SWETH( 7, 21) = 0.317460E+01 +PKER_SWETH( 7, 22) = 0.326335E+01 +PKER_SWETH( 7, 23) = 0.334449E+01 +PKER_SWETH( 7, 24) = 0.341791E+01 +PKER_SWETH( 7, 25) = 0.348388E+01 +PKER_SWETH( 7, 26) = 0.354293E+01 +PKER_SWETH( 7, 27) = 0.359570E+01 +PKER_SWETH( 7, 28) = 0.364289E+01 +PKER_SWETH( 7, 29) = 0.368518E+01 +PKER_SWETH( 7, 30) = 0.372321E+01 +PKER_SWETH( 7, 31) = 0.375754E+01 +PKER_SWETH( 7, 32) = 0.378865E+01 +PKER_SWETH( 7, 33) = 0.381696E+01 +PKER_SWETH( 7, 34) = 0.384281E+01 +PKER_SWETH( 7, 35) = 0.386651E+01 +PKER_SWETH( 7, 36) = 0.388831E+01 +PKER_SWETH( 7, 37) = 0.390841E+01 +PKER_SWETH( 7, 38) = 0.392700E+01 +PKER_SWETH( 7, 39) = 0.394423E+01 +PKER_SWETH( 7, 40) = 0.396023E+01 +PKER_SWETH( 7, 41) = 0.397511E+01 +PKER_SWETH( 7, 42) = 0.398897E+01 +PKER_SWETH( 7, 43) = 0.400190E+01 +PKER_SWETH( 7, 44) = 0.401397E+01 +PKER_SWETH( 7, 45) = 0.402525E+01 +PKER_SWETH( 7, 46) = 0.403580E+01 +PKER_SWETH( 7, 47) = 0.404567E+01 +PKER_SWETH( 7, 48) = 0.405491E+01 +PKER_SWETH( 7, 49) = 0.406357E+01 +PKER_SWETH( 7, 50) = 0.407168E+01 +PKER_SWETH( 7, 51) = 0.407929E+01 +PKER_SWETH( 7, 52) = 0.408642E+01 +PKER_SWETH( 7, 53) = 0.409310E+01 +PKER_SWETH( 7, 54) = 0.409938E+01 +PKER_SWETH( 7, 55) = 0.410526E+01 +PKER_SWETH( 7, 56) = 0.411078E+01 +PKER_SWETH( 7, 57) = 0.411596E+01 +PKER_SWETH( 7, 58) = 0.412083E+01 +PKER_SWETH( 7, 59) = 0.412539E+01 +PKER_SWETH( 7, 60) = 0.412968E+01 +PKER_SWETH( 7, 61) = 0.413370E+01 +PKER_SWETH( 7, 62) = 0.413747E+01 +PKER_SWETH( 7, 63) = 0.414102E+01 +PKER_SWETH( 7, 64) = 0.414434E+01 +PKER_SWETH( 7, 65) = 0.414747E+01 +PKER_SWETH( 7, 66) = 0.415040E+01 +PKER_SWETH( 7, 67) = 0.415315E+01 +PKER_SWETH( 7, 68) = 0.415574E+01 +PKER_SWETH( 7, 69) = 0.415817E+01 +PKER_SWETH( 7, 70) = 0.416045E+01 +PKER_SWETH( 7, 71) = 0.416259E+01 +PKER_SWETH( 7, 72) = 0.416460E+01 +PKER_SWETH( 7, 73) = 0.416648E+01 +PKER_SWETH( 7, 74) = 0.416825E+01 +PKER_SWETH( 7, 75) = 0.416992E+01 +PKER_SWETH( 7, 76) = 0.417148E+01 +PKER_SWETH( 7, 77) = 0.417294E+01 +PKER_SWETH( 7, 78) = 0.417432E+01 +PKER_SWETH( 7, 79) = 0.417561E+01 +PKER_SWETH( 7, 80) = 0.417683E+01 +PKER_SWETH( 8, 1) = 0.649351E+00 +PKER_SWETH( 8, 2) = 0.650011E+00 +PKER_SWETH( 8, 3) = 0.685517E+00 +PKER_SWETH( 8, 4) = 0.749664E+00 +PKER_SWETH( 8, 5) = 0.835874E+00 +PKER_SWETH( 8, 6) = 0.937419E+00 +PKER_SWETH( 8, 7) = 0.104881E+01 +PKER_SWETH( 8, 8) = 0.116549E+01 +PKER_SWETH( 8, 9) = 0.128413E+01 +PKER_SWETH( 8, 10) = 0.140255E+01 +PKER_SWETH( 8, 11) = 0.151951E+01 +PKER_SWETH( 8, 12) = 0.163444E+01 +PKER_SWETH( 8, 13) = 0.174722E+01 +PKER_SWETH( 8, 14) = 0.185802E+01 +PKER_SWETH( 8, 15) = 0.196710E+01 +PKER_SWETH( 8, 16) = 0.207463E+01 +PKER_SWETH( 8, 17) = 0.218056E+01 +PKER_SWETH( 8, 18) = 0.228455E+01 +PKER_SWETH( 8, 19) = 0.238589E+01 +PKER_SWETH( 8, 20) = 0.248364E+01 +PKER_SWETH( 8, 21) = 0.257669E+01 +PKER_SWETH( 8, 22) = 0.266404E+01 +PKER_SWETH( 8, 23) = 0.274491E+01 +PKER_SWETH( 8, 24) = 0.281887E+01 +PKER_SWETH( 8, 25) = 0.288587E+01 +PKER_SWETH( 8, 26) = 0.294616E+01 +PKER_SWETH( 8, 27) = 0.300021E+01 +PKER_SWETH( 8, 28) = 0.304860E+01 +PKER_SWETH( 8, 29) = 0.309196E+01 +PKER_SWETH( 8, 30) = 0.313090E+01 +PKER_SWETH( 8, 31) = 0.316598E+01 +PKER_SWETH( 8, 32) = 0.319771E+01 +PKER_SWETH( 8, 33) = 0.322652E+01 +PKER_SWETH( 8, 34) = 0.325278E+01 +PKER_SWETH( 8, 35) = 0.327680E+01 +PKER_SWETH( 8, 36) = 0.329884E+01 +PKER_SWETH( 8, 37) = 0.331915E+01 +PKER_SWETH( 8, 38) = 0.333789E+01 +PKER_SWETH( 8, 39) = 0.335525E+01 +PKER_SWETH( 8, 40) = 0.337134E+01 +PKER_SWETH( 8, 41) = 0.338630E+01 +PKER_SWETH( 8, 42) = 0.340022E+01 +PKER_SWETH( 8, 43) = 0.341320E+01 +PKER_SWETH( 8, 44) = 0.342530E+01 +PKER_SWETH( 8, 45) = 0.343661E+01 +PKER_SWETH( 8, 46) = 0.344718E+01 +PKER_SWETH( 8, 47) = 0.345707E+01 +PKER_SWETH( 8, 48) = 0.346633E+01 +PKER_SWETH( 8, 49) = 0.347500E+01 +PKER_SWETH( 8, 50) = 0.348312E+01 +PKER_SWETH( 8, 51) = 0.349073E+01 +PKER_SWETH( 8, 52) = 0.349787E+01 +PKER_SWETH( 8, 53) = 0.350456E+01 +PKER_SWETH( 8, 54) = 0.351083E+01 +PKER_SWETH( 8, 55) = 0.351672E+01 +PKER_SWETH( 8, 56) = 0.352224E+01 +PKER_SWETH( 8, 57) = 0.352743E+01 +PKER_SWETH( 8, 58) = 0.353229E+01 +PKER_SWETH( 8, 59) = 0.353686E+01 +PKER_SWETH( 8, 60) = 0.354114E+01 +PKER_SWETH( 8, 61) = 0.354516E+01 +PKER_SWETH( 8, 62) = 0.354894E+01 +PKER_SWETH( 8, 63) = 0.355249E+01 +PKER_SWETH( 8, 64) = 0.355581E+01 +PKER_SWETH( 8, 65) = 0.355894E+01 +PKER_SWETH( 8, 66) = 0.356187E+01 +PKER_SWETH( 8, 67) = 0.356462E+01 +PKER_SWETH( 8, 68) = 0.356721E+01 +PKER_SWETH( 8, 69) = 0.356964E+01 +PKER_SWETH( 8, 70) = 0.357192E+01 +PKER_SWETH( 8, 71) = 0.357406E+01 +PKER_SWETH( 8, 72) = 0.357606E+01 +PKER_SWETH( 8, 73) = 0.357795E+01 +PKER_SWETH( 8, 74) = 0.357972E+01 +PKER_SWETH( 8, 75) = 0.358139E+01 +PKER_SWETH( 8, 76) = 0.358295E+01 +PKER_SWETH( 8, 77) = 0.358441E+01 +PKER_SWETH( 8, 78) = 0.358579E+01 +PKER_SWETH( 8, 79) = 0.358708E+01 +PKER_SWETH( 8, 80) = 0.358830E+01 +PKER_SWETH( 9, 1) = 0.702519E+00 +PKER_SWETH( 9, 2) = 0.616447E+00 +PKER_SWETH( 9, 3) = 0.568133E+00 +PKER_SWETH( 9, 4) = 0.555691E+00 +PKER_SWETH( 9, 5) = 0.575613E+00 +PKER_SWETH( 9, 6) = 0.622847E+00 +PKER_SWETH( 9, 7) = 0.691366E+00 +PKER_SWETH( 9, 8) = 0.775606E+00 +PKER_SWETH( 9, 9) = 0.870423E+00 +PKER_SWETH( 9, 10) = 0.971456E+00 +PKER_SWETH( 9, 11) = 0.107560E+01 +PKER_SWETH( 9, 12) = 0.118058E+01 +PKER_SWETH( 9, 13) = 0.128511E+01 +PKER_SWETH( 9, 14) = 0.138846E+01 +PKER_SWETH( 9, 15) = 0.149035E+01 +PKER_SWETH( 9, 16) = 0.159076E+01 +PKER_SWETH( 9, 17) = 0.168968E+01 +PKER_SWETH( 9, 18) = 0.178699E+01 +PKER_SWETH( 9, 19) = 0.188233E+01 +PKER_SWETH( 9, 20) = 0.197509E+01 +PKER_SWETH( 9, 21) = 0.206443E+01 +PKER_SWETH( 9, 22) = 0.214939E+01 +PKER_SWETH( 9, 23) = 0.222911E+01 +PKER_SWETH( 9, 24) = 0.230291E+01 +PKER_SWETH( 9, 25) = 0.237045E+01 +PKER_SWETH( 9, 26) = 0.243169E+01 +PKER_SWETH( 9, 27) = 0.248687E+01 +PKER_SWETH( 9, 28) = 0.253642E+01 +PKER_SWETH( 9, 29) = 0.258086E+01 +PKER_SWETH( 9, 30) = 0.262075E+01 +PKER_SWETH( 9, 31) = 0.265665E+01 +PKER_SWETH( 9, 32) = 0.268906E+01 +PKER_SWETH( 9, 33) = 0.271842E+01 +PKER_SWETH( 9, 34) = 0.274512E+01 +PKER_SWETH( 9, 35) = 0.276950E+01 +PKER_SWETH( 9, 36) = 0.279183E+01 +PKER_SWETH( 9, 37) = 0.281235E+01 +PKER_SWETH( 9, 38) = 0.283128E+01 +PKER_SWETH( 9, 39) = 0.284877E+01 +PKER_SWETH( 9, 40) = 0.286497E+01 +PKER_SWETH( 9, 41) = 0.288002E+01 +PKER_SWETH( 9, 42) = 0.289400E+01 +PKER_SWETH( 9, 43) = 0.290703E+01 +PKER_SWETH( 9, 44) = 0.291918E+01 +PKER_SWETH( 9, 45) = 0.293052E+01 +PKER_SWETH( 9, 46) = 0.294112E+01 +PKER_SWETH( 9, 47) = 0.295103E+01 +PKER_SWETH( 9, 48) = 0.296030E+01 +PKER_SWETH( 9, 49) = 0.296898E+01 +PKER_SWETH( 9, 50) = 0.297711E+01 +PKER_SWETH( 9, 51) = 0.298473E+01 +PKER_SWETH( 9, 52) = 0.299187E+01 +PKER_SWETH( 9, 53) = 0.299857E+01 +PKER_SWETH( 9, 54) = 0.300485E+01 +PKER_SWETH( 9, 55) = 0.301074E+01 +PKER_SWETH( 9, 56) = 0.301626E+01 +PKER_SWETH( 9, 57) = 0.302145E+01 +PKER_SWETH( 9, 58) = 0.302631E+01 +PKER_SWETH( 9, 59) = 0.303088E+01 +PKER_SWETH( 9, 60) = 0.303517E+01 +PKER_SWETH( 9, 61) = 0.303919E+01 +PKER_SWETH( 9, 62) = 0.304297E+01 +PKER_SWETH( 9, 63) = 0.304651E+01 +PKER_SWETH( 9, 64) = 0.304984E+01 +PKER_SWETH( 9, 65) = 0.305296E+01 +PKER_SWETH( 9, 66) = 0.305590E+01 +PKER_SWETH( 9, 67) = 0.305865E+01 +PKER_SWETH( 9, 68) = 0.306124E+01 +PKER_SWETH( 9, 69) = 0.306366E+01 +PKER_SWETH( 9, 70) = 0.306594E+01 +PKER_SWETH( 9, 71) = 0.306808E+01 +PKER_SWETH( 9, 72) = 0.307009E+01 +PKER_SWETH( 9, 73) = 0.307198E+01 +PKER_SWETH( 9, 74) = 0.307375E+01 +PKER_SWETH( 9, 75) = 0.307541E+01 +PKER_SWETH( 9, 76) = 0.307697E+01 +PKER_SWETH( 9, 77) = 0.307844E+01 +PKER_SWETH( 9, 78) = 0.307982E+01 +PKER_SWETH( 9, 79) = 0.308111E+01 +PKER_SWETH( 9, 80) = 0.308233E+01 +PKER_SWETH( 10, 1) = 0.910019E+00 +PKER_SWETH( 10, 2) = 0.761058E+00 +PKER_SWETH( 10, 3) = 0.642166E+00 +PKER_SWETH( 10, 4) = 0.555322E+00 +PKER_SWETH( 10, 5) = 0.501395E+00 +PKER_SWETH( 10, 6) = 0.479375E+00 +PKER_SWETH( 10, 7) = 0.486799E+00 +PKER_SWETH( 10, 8) = 0.519678E+00 +PKER_SWETH( 10, 9) = 0.573342E+00 +PKER_SWETH( 10, 10) = 0.642647E+00 +PKER_SWETH( 10, 11) = 0.723043E+00 +PKER_SWETH( 10, 12) = 0.810494E+00 +PKER_SWETH( 10, 13) = 0.901923E+00 +PKER_SWETH( 10, 14) = 0.995138E+00 +PKER_SWETH( 10, 15) = 0.108870E+01 +PKER_SWETH( 10, 16) = 0.118176E+01 +PKER_SWETH( 10, 17) = 0.127386E+01 +PKER_SWETH( 10, 18) = 0.136474E+01 +PKER_SWETH( 10, 19) = 0.145412E+01 +PKER_SWETH( 10, 20) = 0.154161E+01 +PKER_SWETH( 10, 21) = 0.162661E+01 +PKER_SWETH( 10, 22) = 0.170837E+01 +PKER_SWETH( 10, 23) = 0.178607E+01 +PKER_SWETH( 10, 24) = 0.185894E+01 +PKER_SWETH( 10, 25) = 0.192641E+01 +PKER_SWETH( 10, 26) = 0.198818E+01 +PKER_SWETH( 10, 27) = 0.204425E+01 +PKER_SWETH( 10, 28) = 0.209483E+01 +PKER_SWETH( 10, 29) = 0.214031E+01 +PKER_SWETH( 10, 30) = 0.218118E+01 +PKER_SWETH( 10, 31) = 0.221794E+01 +PKER_SWETH( 10, 32) = 0.225107E+01 +PKER_SWETH( 10, 33) = 0.228104E+01 +PKER_SWETH( 10, 34) = 0.230823E+01 +PKER_SWETH( 10, 35) = 0.233301E+01 +PKER_SWETH( 10, 36) = 0.235566E+01 +PKER_SWETH( 10, 37) = 0.237643E+01 +PKER_SWETH( 10, 38) = 0.239556E+01 +PKER_SWETH( 10, 39) = 0.241320E+01 +PKER_SWETH( 10, 40) = 0.242953E+01 +PKER_SWETH( 10, 41) = 0.244467E+01 +PKER_SWETH( 10, 42) = 0.245873E+01 +PKER_SWETH( 10, 43) = 0.247182E+01 +PKER_SWETH( 10, 44) = 0.248402E+01 +PKER_SWETH( 10, 45) = 0.249539E+01 +PKER_SWETH( 10, 46) = 0.250602E+01 +PKER_SWETH( 10, 47) = 0.251595E+01 +PKER_SWETH( 10, 48) = 0.252524E+01 +PKER_SWETH( 10, 49) = 0.253393E+01 +PKER_SWETH( 10, 50) = 0.254208E+01 +PKER_SWETH( 10, 51) = 0.254970E+01 +PKER_SWETH( 10, 52) = 0.255685E+01 +PKER_SWETH( 10, 53) = 0.256355E+01 +PKER_SWETH( 10, 54) = 0.256983E+01 +PKER_SWETH( 10, 55) = 0.257573E+01 +PKER_SWETH( 10, 56) = 0.258126E+01 +PKER_SWETH( 10, 57) = 0.258644E+01 +PKER_SWETH( 10, 58) = 0.259131E+01 +PKER_SWETH( 10, 59) = 0.259588E+01 +PKER_SWETH( 10, 60) = 0.260017E+01 +PKER_SWETH( 10, 61) = 0.260419E+01 +PKER_SWETH( 10, 62) = 0.260797E+01 +PKER_SWETH( 10, 63) = 0.261151E+01 +PKER_SWETH( 10, 64) = 0.261484E+01 +PKER_SWETH( 10, 65) = 0.261796E+01 +PKER_SWETH( 10, 66) = 0.262090E+01 +PKER_SWETH( 10, 67) = 0.262365E+01 +PKER_SWETH( 10, 68) = 0.262624E+01 +PKER_SWETH( 10, 69) = 0.262866E+01 +PKER_SWETH( 10, 70) = 0.263094E+01 +PKER_SWETH( 10, 71) = 0.263308E+01 +PKER_SWETH( 10, 72) = 0.263509E+01 +PKER_SWETH( 10, 73) = 0.263698E+01 +PKER_SWETH( 10, 74) = 0.263875E+01 +PKER_SWETH( 10, 75) = 0.264042E+01 +PKER_SWETH( 10, 76) = 0.264198E+01 +PKER_SWETH( 10, 77) = 0.264344E+01 +PKER_SWETH( 10, 78) = 0.264482E+01 +PKER_SWETH( 10, 79) = 0.264611E+01 +PKER_SWETH( 10, 80) = 0.264733E+01 +PKER_SWETH( 11, 1) = 0.117970E+01 +PKER_SWETH( 11, 2) = 0.999555E+00 +PKER_SWETH( 11, 3) = 0.839382E+00 +PKER_SWETH( 11, 4) = 0.701679E+00 +PKER_SWETH( 11, 5) = 0.588986E+00 +PKER_SWETH( 11, 6) = 0.503339E+00 +PKER_SWETH( 11, 7) = 0.446069E+00 +PKER_SWETH( 11, 8) = 0.417187E+00 +PKER_SWETH( 11, 9) = 0.414688E+00 +PKER_SWETH( 11, 10) = 0.436027E+00 +PKER_SWETH( 11, 11) = 0.477087E+00 +PKER_SWETH( 11, 12) = 0.533660E+00 +PKER_SWETH( 11, 13) = 0.601609E+00 +PKER_SWETH( 11, 14) = 0.677240E+00 +PKER_SWETH( 11, 15) = 0.757583E+00 +PKER_SWETH( 11, 16) = 0.840432E+00 +PKER_SWETH( 11, 17) = 0.924274E+00 +PKER_SWETH( 11, 18) = 0.100809E+01 +PKER_SWETH( 11, 19) = 0.109125E+01 +PKER_SWETH( 11, 20) = 0.117322E+01 +PKER_SWETH( 11, 21) = 0.125348E+01 +PKER_SWETH( 11, 22) = 0.133144E+01 +PKER_SWETH( 11, 23) = 0.140636E+01 +PKER_SWETH( 11, 24) = 0.147751E+01 +PKER_SWETH( 11, 25) = 0.154422E+01 +PKER_SWETH( 11, 26) = 0.160600E+01 +PKER_SWETH( 11, 27) = 0.166258E+01 +PKER_SWETH( 11, 28) = 0.171399E+01 +PKER_SWETH( 11, 29) = 0.176042E+01 +PKER_SWETH( 11, 30) = 0.180224E+01 +PKER_SWETH( 11, 31) = 0.183988E+01 +PKER_SWETH( 11, 32) = 0.187378E+01 +PKER_SWETH( 11, 33) = 0.190440E+01 +PKER_SWETH( 11, 34) = 0.193214E+01 +PKER_SWETH( 11, 35) = 0.195735E+01 +PKER_SWETH( 11, 36) = 0.198036E+01 +PKER_SWETH( 11, 37) = 0.200142E+01 +PKER_SWETH( 11, 38) = 0.202076E+01 +PKER_SWETH( 11, 39) = 0.203859E+01 +PKER_SWETH( 11, 40) = 0.205505E+01 +PKER_SWETH( 11, 41) = 0.207030E+01 +PKER_SWETH( 11, 42) = 0.208445E+01 +PKER_SWETH( 11, 43) = 0.209760E+01 +PKER_SWETH( 11, 44) = 0.210985E+01 +PKER_SWETH( 11, 45) = 0.212127E+01 +PKER_SWETH( 11, 46) = 0.213193E+01 +PKER_SWETH( 11, 47) = 0.214188E+01 +PKER_SWETH( 11, 48) = 0.215119E+01 +PKER_SWETH( 11, 49) = 0.215990E+01 +PKER_SWETH( 11, 50) = 0.216805E+01 +PKER_SWETH( 11, 51) = 0.217569E+01 +PKER_SWETH( 11, 52) = 0.218285E+01 +PKER_SWETH( 11, 53) = 0.218955E+01 +PKER_SWETH( 11, 54) = 0.219584E+01 +PKER_SWETH( 11, 55) = 0.220174E+01 +PKER_SWETH( 11, 56) = 0.220727E+01 +PKER_SWETH( 11, 57) = 0.221246E+01 +PKER_SWETH( 11, 58) = 0.221733E+01 +PKER_SWETH( 11, 59) = 0.222190E+01 +PKER_SWETH( 11, 60) = 0.222618E+01 +PKER_SWETH( 11, 61) = 0.223021E+01 +PKER_SWETH( 11, 62) = 0.223399E+01 +PKER_SWETH( 11, 63) = 0.223753E+01 +PKER_SWETH( 11, 64) = 0.224086E+01 +PKER_SWETH( 11, 65) = 0.224399E+01 +PKER_SWETH( 11, 66) = 0.224692E+01 +PKER_SWETH( 11, 67) = 0.224967E+01 +PKER_SWETH( 11, 68) = 0.225226E+01 +PKER_SWETH( 11, 69) = 0.225469E+01 +PKER_SWETH( 11, 70) = 0.225697E+01 +PKER_SWETH( 11, 71) = 0.225911E+01 +PKER_SWETH( 11, 72) = 0.226112E+01 +PKER_SWETH( 11, 73) = 0.226300E+01 +PKER_SWETH( 11, 74) = 0.226477E+01 +PKER_SWETH( 11, 75) = 0.226644E+01 +PKER_SWETH( 11, 76) = 0.226800E+01 +PKER_SWETH( 11, 77) = 0.226947E+01 +PKER_SWETH( 11, 78) = 0.227084E+01 +PKER_SWETH( 11, 79) = 0.227214E+01 +PKER_SWETH( 11, 80) = 0.227335E+01 +PKER_SWETH( 12, 1) = 0.144652E+01 +PKER_SWETH( 12, 2) = 0.125611E+01 +PKER_SWETH( 12, 3) = 0.107975E+01 +PKER_SWETH( 12, 4) = 0.918380E+00 +PKER_SWETH( 12, 5) = 0.773485E+00 +PKER_SWETH( 12, 6) = 0.647036E+00 +PKER_SWETH( 12, 7) = 0.541359E+00 +PKER_SWETH( 12, 8) = 0.458510E+00 +PKER_SWETH( 12, 9) = 0.399890E+00 +PKER_SWETH( 12, 10) = 0.366094E+00 +PKER_SWETH( 12, 11) = 0.356301E+00 +PKER_SWETH( 12, 12) = 0.368080E+00 +PKER_SWETH( 12, 13) = 0.398694E+00 +PKER_SWETH( 12, 14) = 0.444471E+00 +PKER_SWETH( 12, 15) = 0.501775E+00 +PKER_SWETH( 12, 16) = 0.567143E+00 +PKER_SWETH( 12, 17) = 0.637796E+00 +PKER_SWETH( 12, 18) = 0.711513E+00 +PKER_SWETH( 12, 19) = 0.786658E+00 +PKER_SWETH( 12, 20) = 0.862084E+00 +PKER_SWETH( 12, 21) = 0.936916E+00 +PKER_SWETH( 12, 22) = 0.101042E+01 +PKER_SWETH( 12, 23) = 0.108188E+01 +PKER_SWETH( 12, 24) = 0.115058E+01 +PKER_SWETH( 12, 25) = 0.121581E+01 +PKER_SWETH( 12, 26) = 0.127697E+01 +PKER_SWETH( 12, 27) = 0.133361E+01 +PKER_SWETH( 12, 28) = 0.138552E+01 +PKER_SWETH( 12, 29) = 0.143272E+01 +PKER_SWETH( 12, 30) = 0.147541E+01 +PKER_SWETH( 12, 31) = 0.151391E+01 +PKER_SWETH( 12, 32) = 0.154861E+01 +PKER_SWETH( 12, 33) = 0.157992E+01 +PKER_SWETH( 12, 34) = 0.160825E+01 +PKER_SWETH( 12, 35) = 0.163395E+01 +PKER_SWETH( 12, 36) = 0.165735E+01 +PKER_SWETH( 12, 37) = 0.167873E+01 +PKER_SWETH( 12, 38) = 0.169832E+01 +PKER_SWETH( 12, 39) = 0.171635E+01 +PKER_SWETH( 12, 40) = 0.173297E+01 +PKER_SWETH( 12, 41) = 0.174834E+01 +PKER_SWETH( 12, 42) = 0.176259E+01 +PKER_SWETH( 12, 43) = 0.177582E+01 +PKER_SWETH( 12, 44) = 0.178812E+01 +PKER_SWETH( 12, 45) = 0.179959E+01 +PKER_SWETH( 12, 46) = 0.181028E+01 +PKER_SWETH( 12, 47) = 0.182026E+01 +PKER_SWETH( 12, 48) = 0.182960E+01 +PKER_SWETH( 12, 49) = 0.183832E+01 +PKER_SWETH( 12, 50) = 0.184649E+01 +PKER_SWETH( 12, 51) = 0.185414E+01 +PKER_SWETH( 12, 52) = 0.186130E+01 +PKER_SWETH( 12, 53) = 0.186801E+01 +PKER_SWETH( 12, 54) = 0.187430E+01 +PKER_SWETH( 12, 55) = 0.188021E+01 +PKER_SWETH( 12, 56) = 0.188574E+01 +PKER_SWETH( 12, 57) = 0.189093E+01 +PKER_SWETH( 12, 58) = 0.189580E+01 +PKER_SWETH( 12, 59) = 0.190037E+01 +PKER_SWETH( 12, 60) = 0.190466E+01 +PKER_SWETH( 12, 61) = 0.190869E+01 +PKER_SWETH( 12, 62) = 0.191247E+01 +PKER_SWETH( 12, 63) = 0.191601E+01 +PKER_SWETH( 12, 64) = 0.191934E+01 +PKER_SWETH( 12, 65) = 0.192247E+01 +PKER_SWETH( 12, 66) = 0.192540E+01 +PKER_SWETH( 12, 67) = 0.192815E+01 +PKER_SWETH( 12, 68) = 0.193074E+01 +PKER_SWETH( 12, 69) = 0.193317E+01 +PKER_SWETH( 12, 70) = 0.193545E+01 +PKER_SWETH( 12, 71) = 0.193759E+01 +PKER_SWETH( 12, 72) = 0.193960E+01 +PKER_SWETH( 12, 73) = 0.194149E+01 +PKER_SWETH( 12, 74) = 0.194326E+01 +PKER_SWETH( 12, 75) = 0.194492E+01 +PKER_SWETH( 12, 76) = 0.194648E+01 +PKER_SWETH( 12, 77) = 0.194795E+01 +PKER_SWETH( 12, 78) = 0.194933E+01 +PKER_SWETH( 12, 79) = 0.195062E+01 +PKER_SWETH( 12, 80) = 0.195183E+01 +PKER_SWETH( 13, 1) = 0.168479E+01 +PKER_SWETH( 13, 2) = 0.149223E+01 +PKER_SWETH( 13, 3) = 0.131178E+01 +PKER_SWETH( 13, 4) = 0.114318E+01 +PKER_SWETH( 13, 5) = 0.986502E+00 +PKER_SWETH( 13, 6) = 0.842330E+00 +PKER_SWETH( 13, 7) = 0.711777E+00 +PKER_SWETH( 13, 8) = 0.596438E+00 +PKER_SWETH( 13, 9) = 0.498240E+00 +PKER_SWETH( 13, 10) = 0.419186E+00 +PKER_SWETH( 13, 11) = 0.360884E+00 +PKER_SWETH( 13, 12) = 0.324082E+00 +PKER_SWETH( 13, 13) = 0.308477E+00 +PKER_SWETH( 13, 14) = 0.312993E+00 +PKER_SWETH( 13, 15) = 0.335025E+00 +PKER_SWETH( 13, 16) = 0.371680E+00 +PKER_SWETH( 13, 17) = 0.419845E+00 +PKER_SWETH( 13, 18) = 0.476331E+00 +PKER_SWETH( 13, 19) = 0.538496E+00 +PKER_SWETH( 13, 20) = 0.604102E+00 +PKER_SWETH( 13, 21) = 0.671400E+00 +PKER_SWETH( 13, 22) = 0.739062E+00 +PKER_SWETH( 13, 23) = 0.806033E+00 +PKER_SWETH( 13, 24) = 0.871408E+00 +PKER_SWETH( 13, 25) = 0.934369E+00 +PKER_SWETH( 13, 26) = 0.994201E+00 +PKER_SWETH( 13, 27) = 0.105032E+01 +PKER_SWETH( 13, 28) = 0.110232E+01 +PKER_SWETH( 13, 29) = 0.115001E+01 +PKER_SWETH( 13, 30) = 0.119341E+01 +PKER_SWETH( 13, 31) = 0.123271E+01 +PKER_SWETH( 13, 32) = 0.126820E+01 +PKER_SWETH( 13, 33) = 0.130023E+01 +PKER_SWETH( 13, 34) = 0.132918E+01 +PKER_SWETH( 13, 35) = 0.135541E+01 +PKER_SWETH( 13, 36) = 0.137925E+01 +PKER_SWETH( 13, 37) = 0.140098E+01 +PKER_SWETH( 13, 38) = 0.142086E+01 +PKER_SWETH( 13, 39) = 0.143911E+01 +PKER_SWETH( 13, 40) = 0.145591E+01 +PKER_SWETH( 13, 41) = 0.147142E+01 +PKER_SWETH( 13, 42) = 0.148578E+01 +PKER_SWETH( 13, 43) = 0.149910E+01 +PKER_SWETH( 13, 44) = 0.151147E+01 +PKER_SWETH( 13, 45) = 0.152298E+01 +PKER_SWETH( 13, 46) = 0.153372E+01 +PKER_SWETH( 13, 47) = 0.154373E+01 +PKER_SWETH( 13, 48) = 0.155309E+01 +PKER_SWETH( 13, 49) = 0.156184E+01 +PKER_SWETH( 13, 50) = 0.157002E+01 +PKER_SWETH( 13, 51) = 0.157768E+01 +PKER_SWETH( 13, 52) = 0.158485E+01 +PKER_SWETH( 13, 53) = 0.159157E+01 +PKER_SWETH( 13, 54) = 0.159787E+01 +PKER_SWETH( 13, 55) = 0.160377E+01 +PKER_SWETH( 13, 56) = 0.160931E+01 +PKER_SWETH( 13, 57) = 0.161451E+01 +PKER_SWETH( 13, 58) = 0.161938E+01 +PKER_SWETH( 13, 59) = 0.162395E+01 +PKER_SWETH( 13, 60) = 0.162824E+01 +PKER_SWETH( 13, 61) = 0.163227E+01 +PKER_SWETH( 13, 62) = 0.163605E+01 +PKER_SWETH( 13, 63) = 0.163959E+01 +PKER_SWETH( 13, 64) = 0.164292E+01 +PKER_SWETH( 13, 65) = 0.164605E+01 +PKER_SWETH( 13, 66) = 0.164898E+01 +PKER_SWETH( 13, 67) = 0.165174E+01 +PKER_SWETH( 13, 68) = 0.165432E+01 +PKER_SWETH( 13, 69) = 0.165675E+01 +PKER_SWETH( 13, 70) = 0.165903E+01 +PKER_SWETH( 13, 71) = 0.166117E+01 +PKER_SWETH( 13, 72) = 0.166318E+01 +PKER_SWETH( 13, 73) = 0.166507E+01 +PKER_SWETH( 13, 74) = 0.166684E+01 +PKER_SWETH( 13, 75) = 0.166850E+01 +PKER_SWETH( 13, 76) = 0.167007E+01 +PKER_SWETH( 13, 77) = 0.167153E+01 +PKER_SWETH( 13, 78) = 0.167291E+01 +PKER_SWETH( 13, 79) = 0.167420E+01 +PKER_SWETH( 13, 80) = 0.167542E+01 +PKER_SWETH( 14, 1) = 0.189106E+01 +PKER_SWETH( 14, 2) = 0.169828E+01 +PKER_SWETH( 14, 3) = 0.151724E+01 +PKER_SWETH( 14, 4) = 0.134728E+01 +PKER_SWETH( 14, 5) = 0.118787E+01 +PKER_SWETH( 14, 6) = 0.103869E+01 +PKER_SWETH( 14, 7) = 0.899664E+00 +PKER_SWETH( 14, 8) = 0.771152E+00 +PKER_SWETH( 14, 9) = 0.653915E+00 +PKER_SWETH( 14, 10) = 0.549229E+00 +PKER_SWETH( 14, 11) = 0.458726E+00 +PKER_SWETH( 14, 12) = 0.384162E+00 +PKER_SWETH( 14, 13) = 0.327214E+00 +PKER_SWETH( 14, 14) = 0.288898E+00 +PKER_SWETH( 14, 15) = 0.269417E+00 +PKER_SWETH( 14, 16) = 0.268018E+00 +PKER_SWETH( 14, 17) = 0.283099E+00 +PKER_SWETH( 14, 18) = 0.312281E+00 +PKER_SWETH( 14, 19) = 0.352665E+00 +PKER_SWETH( 14, 20) = 0.401510E+00 +PKER_SWETH( 14, 21) = 0.456229E+00 +PKER_SWETH( 14, 22) = 0.514536E+00 +PKER_SWETH( 14, 23) = 0.574635E+00 +PKER_SWETH( 14, 24) = 0.635018E+00 +PKER_SWETH( 14, 25) = 0.694493E+00 +PKER_SWETH( 14, 26) = 0.752055E+00 +PKER_SWETH( 14, 27) = 0.806900E+00 +PKER_SWETH( 14, 28) = 0.858415E+00 +PKER_SWETH( 14, 29) = 0.906197E+00 +PKER_SWETH( 14, 30) = 0.950060E+00 +PKER_SWETH( 14, 31) = 0.990018E+00 +PKER_SWETH( 14, 32) = 0.102624E+01 +PKER_SWETH( 14, 33) = 0.105899E+01 +PKER_SWETH( 14, 34) = 0.108860E+01 +PKER_SWETH( 14, 35) = 0.111540E+01 +PKER_SWETH( 14, 36) = 0.113971E+01 +PKER_SWETH( 14, 37) = 0.116183E+01 +PKER_SWETH( 14, 38) = 0.118203E+01 +PKER_SWETH( 14, 39) = 0.120054E+01 +PKER_SWETH( 14, 40) = 0.121754E+01 +PKER_SWETH( 14, 41) = 0.123321E+01 +PKER_SWETH( 14, 42) = 0.124769E+01 +PKER_SWETH( 14, 43) = 0.126111E+01 +PKER_SWETH( 14, 44) = 0.127356E+01 +PKER_SWETH( 14, 45) = 0.128513E+01 +PKER_SWETH( 14, 46) = 0.129591E+01 +PKER_SWETH( 14, 47) = 0.130596E+01 +PKER_SWETH( 14, 48) = 0.131535E+01 +PKER_SWETH( 14, 49) = 0.132412E+01 +PKER_SWETH( 14, 50) = 0.133232E+01 +PKER_SWETH( 14, 51) = 0.133999E+01 +PKER_SWETH( 14, 52) = 0.134717E+01 +PKER_SWETH( 14, 53) = 0.135390E+01 +PKER_SWETH( 14, 54) = 0.136020E+01 +PKER_SWETH( 14, 55) = 0.136611E+01 +PKER_SWETH( 14, 56) = 0.137166E+01 +PKER_SWETH( 14, 57) = 0.137685E+01 +PKER_SWETH( 14, 58) = 0.138173E+01 +PKER_SWETH( 14, 59) = 0.138630E+01 +PKER_SWETH( 14, 60) = 0.139059E+01 +PKER_SWETH( 14, 61) = 0.139462E+01 +PKER_SWETH( 14, 62) = 0.139840E+01 +PKER_SWETH( 14, 63) = 0.140195E+01 +PKER_SWETH( 14, 64) = 0.140528E+01 +PKER_SWETH( 14, 65) = 0.140841E+01 +PKER_SWETH( 14, 66) = 0.141134E+01 +PKER_SWETH( 14, 67) = 0.141410E+01 +PKER_SWETH( 14, 68) = 0.141668E+01 +PKER_SWETH( 14, 69) = 0.141911E+01 +PKER_SWETH( 14, 70) = 0.142139E+01 +PKER_SWETH( 14, 71) = 0.142353E+01 +PKER_SWETH( 14, 72) = 0.142554E+01 +PKER_SWETH( 14, 73) = 0.142743E+01 +PKER_SWETH( 14, 74) = 0.142920E+01 +PKER_SWETH( 14, 75) = 0.143086E+01 +PKER_SWETH( 14, 76) = 0.143242E+01 +PKER_SWETH( 14, 77) = 0.143389E+01 +PKER_SWETH( 14, 78) = 0.143527E+01 +PKER_SWETH( 14, 79) = 0.143656E+01 +PKER_SWETH( 14, 80) = 0.143777E+01 +PKER_SWETH( 15, 1) = 0.206851E+01 +PKER_SWETH( 15, 2) = 0.187578E+01 +PKER_SWETH( 15, 3) = 0.169474E+01 +PKER_SWETH( 15, 4) = 0.152469E+01 +PKER_SWETH( 15, 5) = 0.136497E+01 +PKER_SWETH( 15, 6) = 0.121496E+01 +PKER_SWETH( 15, 7) = 0.107417E+01 +PKER_SWETH( 15, 8) = 0.942229E+00 +PKER_SWETH( 15, 9) = 0.818993E+00 +PKER_SWETH( 15, 10) = 0.704619E+00 +PKER_SWETH( 15, 11) = 0.599635E+00 +PKER_SWETH( 15, 12) = 0.505012E+00 +PKER_SWETH( 15, 13) = 0.422101E+00 +PKER_SWETH( 15, 14) = 0.352467E+00 +PKER_SWETH( 15, 15) = 0.297703E+00 +PKER_SWETH( 15, 16) = 0.258998E+00 +PKER_SWETH( 15, 17) = 0.236959E+00 +PKER_SWETH( 15, 18) = 0.231267E+00 +PKER_SWETH( 15, 19) = 0.240828E+00 +PKER_SWETH( 15, 20) = 0.263715E+00 +PKER_SWETH( 15, 21) = 0.297593E+00 +PKER_SWETH( 15, 22) = 0.339817E+00 +PKER_SWETH( 15, 23) = 0.387934E+00 +PKER_SWETH( 15, 24) = 0.439655E+00 +PKER_SWETH( 15, 25) = 0.493057E+00 +PKER_SWETH( 15, 26) = 0.546554E+00 +PKER_SWETH( 15, 27) = 0.598863E+00 +PKER_SWETH( 15, 28) = 0.648998E+00 +PKER_SWETH( 15, 29) = 0.696248E+00 +PKER_SWETH( 15, 30) = 0.740165E+00 +PKER_SWETH( 15, 31) = 0.780538E+00 +PKER_SWETH( 15, 32) = 0.817363E+00 +PKER_SWETH( 15, 33) = 0.850785E+00 +PKER_SWETH( 15, 34) = 0.881046E+00 +PKER_SWETH( 15, 35) = 0.908438E+00 +PKER_SWETH( 15, 36) = 0.933267E+00 +PKER_SWETH( 15, 37) = 0.955825E+00 +PKER_SWETH( 15, 38) = 0.976380E+00 +PKER_SWETH( 15, 39) = 0.995170E+00 +PKER_SWETH( 15, 40) = 0.101240E+01 +PKER_SWETH( 15, 41) = 0.102825E+01 +PKER_SWETH( 15, 42) = 0.104288E+01 +PKER_SWETH( 15, 43) = 0.105640E+01 +PKER_SWETH( 15, 44) = 0.106894E+01 +PKER_SWETH( 15, 45) = 0.108059E+01 +PKER_SWETH( 15, 46) = 0.109142E+01 +PKER_SWETH( 15, 47) = 0.110151E+01 +PKER_SWETH( 15, 48) = 0.111093E+01 +PKER_SWETH( 15, 49) = 0.111972E+01 +PKER_SWETH( 15, 50) = 0.112794E+01 +PKER_SWETH( 15, 51) = 0.113563E+01 +PKER_SWETH( 15, 52) = 0.114282E+01 +PKER_SWETH( 15, 53) = 0.114956E+01 +PKER_SWETH( 15, 54) = 0.115587E+01 +PKER_SWETH( 15, 55) = 0.116179E+01 +PKER_SWETH( 15, 56) = 0.116733E+01 +PKER_SWETH( 15, 57) = 0.117253E+01 +PKER_SWETH( 15, 58) = 0.117741E+01 +PKER_SWETH( 15, 59) = 0.118199E+01 +PKER_SWETH( 15, 60) = 0.118628E+01 +PKER_SWETH( 15, 61) = 0.119031E+01 +PKER_SWETH( 15, 62) = 0.119409E+01 +PKER_SWETH( 15, 63) = 0.119764E+01 +PKER_SWETH( 15, 64) = 0.120097E+01 +PKER_SWETH( 15, 65) = 0.120410E+01 +PKER_SWETH( 15, 66) = 0.120703E+01 +PKER_SWETH( 15, 67) = 0.120979E+01 +PKER_SWETH( 15, 68) = 0.121237E+01 +PKER_SWETH( 15, 69) = 0.121480E+01 +PKER_SWETH( 15, 70) = 0.121708E+01 +PKER_SWETH( 15, 71) = 0.121922E+01 +PKER_SWETH( 15, 72) = 0.122123E+01 +PKER_SWETH( 15, 73) = 0.122312E+01 +PKER_SWETH( 15, 74) = 0.122489E+01 +PKER_SWETH( 15, 75) = 0.122656E+01 +PKER_SWETH( 15, 76) = 0.122812E+01 +PKER_SWETH( 15, 77) = 0.122958E+01 +PKER_SWETH( 15, 78) = 0.123096E+01 +PKER_SWETH( 15, 79) = 0.123225E+01 +PKER_SWETH( 15, 80) = 0.123347E+01 +PKER_SWETH( 16, 1) = 0.222105E+01 +PKER_SWETH( 16, 2) = 0.202837E+01 +PKER_SWETH( 16, 3) = 0.184739E+01 +PKER_SWETH( 16, 4) = 0.167741E+01 +PKER_SWETH( 16, 5) = 0.151773E+01 +PKER_SWETH( 16, 6) = 0.136773E+01 +PKER_SWETH( 16, 7) = 0.122679E+01 +PKER_SWETH( 16, 8) = 0.109439E+01 +PKER_SWETH( 16, 9) = 0.970044E+00 +PKER_SWETH( 16, 10) = 0.853387E+00 +PKER_SWETH( 16, 11) = 0.744213E+00 +PKER_SWETH( 16, 12) = 0.642547E+00 +PKER_SWETH( 16, 13) = 0.548734E+00 +PKER_SWETH( 16, 14) = 0.463499E+00 +PKER_SWETH( 16, 15) = 0.387925E+00 +PKER_SWETH( 16, 16) = 0.323415E+00 +PKER_SWETH( 16, 17) = 0.271432E+00 +PKER_SWETH( 16, 18) = 0.233220E+00 +PKER_SWETH( 16, 19) = 0.209657E+00 +PKER_SWETH( 16, 20) = 0.200923E+00 +PKER_SWETH( 16, 21) = 0.206127E+00 +PKER_SWETH( 16, 22) = 0.223993E+00 +PKER_SWETH( 16, 23) = 0.252341E+00 +PKER_SWETH( 16, 24) = 0.288839E+00 +PKER_SWETH( 16, 25) = 0.331067E+00 +PKER_SWETH( 16, 26) = 0.376740E+00 +PKER_SWETH( 16, 27) = 0.423873E+00 +PKER_SWETH( 16, 28) = 0.470831E+00 +PKER_SWETH( 16, 29) = 0.516360E+00 +PKER_SWETH( 16, 30) = 0.559563E+00 +PKER_SWETH( 16, 31) = 0.599884E+00 +PKER_SWETH( 16, 32) = 0.637048E+00 +PKER_SWETH( 16, 33) = 0.671007E+00 +PKER_SWETH( 16, 34) = 0.701874E+00 +PKER_SWETH( 16, 35) = 0.729862E+00 +PKER_SWETH( 16, 36) = 0.755230E+00 +PKER_SWETH( 16, 37) = 0.778255E+00 +PKER_SWETH( 16, 38) = 0.799202E+00 +PKER_SWETH( 16, 39) = 0.818313E+00 +PKER_SWETH( 16, 40) = 0.835804E+00 +PKER_SWETH( 16, 41) = 0.851863E+00 +PKER_SWETH( 16, 42) = 0.866650E+00 +PKER_SWETH( 16, 43) = 0.880303E+00 +PKER_SWETH( 16, 44) = 0.892941E+00 +PKER_SWETH( 16, 45) = 0.904664E+00 +PKER_SWETH( 16, 46) = 0.915558E+00 +PKER_SWETH( 16, 47) = 0.925699E+00 +PKER_SWETH( 16, 48) = 0.935152E+00 +PKER_SWETH( 16, 49) = 0.943974E+00 +PKER_SWETH( 16, 50) = 0.952215E+00 +PKER_SWETH( 16, 51) = 0.959919E+00 +PKER_SWETH( 16, 52) = 0.967128E+00 +PKER_SWETH( 16, 53) = 0.973876E+00 +PKER_SWETH( 16, 54) = 0.980196E+00 +PKER_SWETH( 16, 55) = 0.986118E+00 +PKER_SWETH( 16, 56) = 0.991669E+00 +PKER_SWETH( 16, 57) = 0.996874E+00 +PKER_SWETH( 16, 58) = 0.100175E+01 +PKER_SWETH( 16, 59) = 0.100633E+01 +PKER_SWETH( 16, 60) = 0.101063E+01 +PKER_SWETH( 16, 61) = 0.101466E+01 +PKER_SWETH( 16, 62) = 0.101844E+01 +PKER_SWETH( 16, 63) = 0.102199E+01 +PKER_SWETH( 16, 64) = 0.102532E+01 +PKER_SWETH( 16, 65) = 0.102845E+01 +PKER_SWETH( 16, 66) = 0.103138E+01 +PKER_SWETH( 16, 67) = 0.103414E+01 +PKER_SWETH( 16, 68) = 0.103673E+01 +PKER_SWETH( 16, 69) = 0.103916E+01 +PKER_SWETH( 16, 70) = 0.104144E+01 +PKER_SWETH( 16, 71) = 0.104358E+01 +PKER_SWETH( 16, 72) = 0.104559E+01 +PKER_SWETH( 16, 73) = 0.104747E+01 +PKER_SWETH( 16, 74) = 0.104925E+01 +PKER_SWETH( 16, 75) = 0.105091E+01 +PKER_SWETH( 16, 76) = 0.105247E+01 +PKER_SWETH( 16, 77) = 0.105394E+01 +PKER_SWETH( 16, 78) = 0.105531E+01 +PKER_SWETH( 16, 79) = 0.105661E+01 +PKER_SWETH( 16, 80) = 0.105782E+01 +PKER_SWETH( 17, 1) = 0.235216E+01 +PKER_SWETH( 17, 2) = 0.215952E+01 +PKER_SWETH( 17, 3) = 0.197860E+01 +PKER_SWETH( 17, 4) = 0.180867E+01 +PKER_SWETH( 17, 5) = 0.164907E+01 +PKER_SWETH( 17, 6) = 0.149914E+01 +PKER_SWETH( 17, 7) = 0.135829E+01 +PKER_SWETH( 17, 8) = 0.122594E+01 +PKER_SWETH( 17, 9) = 0.110158E+01 +PKER_SWETH( 17, 10) = 0.984701E+00 +PKER_SWETH( 17, 11) = 0.874876E+00 +PKER_SWETH( 17, 12) = 0.771739E+00 +PKER_SWETH( 17, 13) = 0.675054E+00 +PKER_SWETH( 17, 14) = 0.584764E+00 +PKER_SWETH( 17, 15) = 0.501058E+00 +PKER_SWETH( 17, 16) = 0.424483E+00 +PKER_SWETH( 17, 17) = 0.355906E+00 +PKER_SWETH( 17, 18) = 0.296493E+00 +PKER_SWETH( 17, 19) = 0.247642E+00 +PKER_SWETH( 17, 20) = 0.210649E+00 +PKER_SWETH( 17, 21) = 0.186453E+00 +PKER_SWETH( 17, 22) = 0.175549E+00 +PKER_SWETH( 17, 23) = 0.177592E+00 +PKER_SWETH( 17, 24) = 0.191285E+00 +PKER_SWETH( 17, 25) = 0.215005E+00 +PKER_SWETH( 17, 26) = 0.246505E+00 +PKER_SWETH( 17, 27) = 0.283441E+00 +PKER_SWETH( 17, 28) = 0.323511E+00 +PKER_SWETH( 17, 29) = 0.364750E+00 +PKER_SWETH( 17, 30) = 0.405561E+00 +PKER_SWETH( 17, 31) = 0.444783E+00 +PKER_SWETH( 17, 32) = 0.481674E+00 +PKER_SWETH( 17, 33) = 0.515838E+00 +PKER_SWETH( 17, 34) = 0.547151E+00 +PKER_SWETH( 17, 35) = 0.575673E+00 +PKER_SWETH( 17, 36) = 0.601576E+00 +PKER_SWETH( 17, 37) = 0.625091E+00 +PKER_SWETH( 17, 38) = 0.646461E+00 +PKER_SWETH( 17, 39) = 0.665927E+00 +PKER_SWETH( 17, 40) = 0.683709E+00 +PKER_SWETH( 17, 41) = 0.700001E+00 +PKER_SWETH( 17, 42) = 0.714974E+00 +PKER_SWETH( 17, 43) = 0.728775E+00 +PKER_SWETH( 17, 44) = 0.741528E+00 +PKER_SWETH( 17, 45) = 0.753341E+00 +PKER_SWETH( 17, 46) = 0.764305E+00 +PKER_SWETH( 17, 47) = 0.774501E+00 +PKER_SWETH( 17, 48) = 0.783997E+00 +PKER_SWETH( 17, 49) = 0.792851E+00 +PKER_SWETH( 17, 50) = 0.801118E+00 +PKER_SWETH( 17, 51) = 0.808842E+00 +PKER_SWETH( 17, 52) = 0.816066E+00 +PKER_SWETH( 17, 53) = 0.822826E+00 +PKER_SWETH( 17, 54) = 0.829156E+00 +PKER_SWETH( 17, 55) = 0.835085E+00 +PKER_SWETH( 17, 56) = 0.840642E+00 +PKER_SWETH( 17, 57) = 0.845851E+00 +PKER_SWETH( 17, 58) = 0.850735E+00 +PKER_SWETH( 17, 59) = 0.855316E+00 +PKER_SWETH( 17, 60) = 0.859613E+00 +PKER_SWETH( 17, 61) = 0.863645E+00 +PKER_SWETH( 17, 62) = 0.867428E+00 +PKER_SWETH( 17, 63) = 0.870979E+00 +PKER_SWETH( 17, 64) = 0.874311E+00 +PKER_SWETH( 17, 65) = 0.877439E+00 +PKER_SWETH( 17, 66) = 0.880375E+00 +PKER_SWETH( 17, 67) = 0.883131E+00 +PKER_SWETH( 17, 68) = 0.885718E+00 +PKER_SWETH( 17, 69) = 0.888147E+00 +PKER_SWETH( 17, 70) = 0.890427E+00 +PKER_SWETH( 17, 71) = 0.892568E+00 +PKER_SWETH( 17, 72) = 0.894578E+00 +PKER_SWETH( 17, 73) = 0.896465E+00 +PKER_SWETH( 17, 74) = 0.898237E+00 +PKER_SWETH( 17, 75) = 0.899901E+00 +PKER_SWETH( 17, 76) = 0.901463E+00 +PKER_SWETH( 17, 77) = 0.902929E+00 +PKER_SWETH( 17, 78) = 0.904307E+00 +PKER_SWETH( 17, 79) = 0.905600E+00 +PKER_SWETH( 17, 80) = 0.906814E+00 +PKER_SWETH( 18, 1) = 0.246485E+01 +PKER_SWETH( 18, 2) = 0.227225E+01 +PKER_SWETH( 18, 3) = 0.209136E+01 +PKER_SWETH( 18, 4) = 0.192149E+01 +PKER_SWETH( 18, 5) = 0.176194E+01 +PKER_SWETH( 18, 6) = 0.161208E+01 +PKER_SWETH( 18, 7) = 0.147130E+01 +PKER_SWETH( 18, 8) = 0.133905E+01 +PKER_SWETH( 18, 9) = 0.121479E+01 +PKER_SWETH( 18, 10) = 0.109802E+01 +PKER_SWETH( 18, 11) = 0.988254E+00 +PKER_SWETH( 18, 12) = 0.885064E+00 +PKER_SWETH( 18, 13) = 0.788046E+00 +PKER_SWETH( 18, 14) = 0.696856E+00 +PKER_SWETH( 18, 15) = 0.611240E+00 +PKER_SWETH( 18, 16) = 0.531085E+00 +PKER_SWETH( 18, 17) = 0.456489E+00 +PKER_SWETH( 18, 18) = 0.387822E+00 +PKER_SWETH( 18, 19) = 0.325787E+00 +PKER_SWETH( 18, 20) = 0.271388E+00 +PKER_SWETH( 18, 21) = 0.225865E+00 +PKER_SWETH( 18, 22) = 0.190524E+00 +PKER_SWETH( 18, 23) = 0.166451E+00 +PKER_SWETH( 18, 24) = 0.154224E+00 +PKER_SWETH( 18, 25) = 0.153728E+00 +PKER_SWETH( 18, 26) = 0.164235E+00 +PKER_SWETH( 18, 27) = 0.184044E+00 +PKER_SWETH( 18, 28) = 0.211126E+00 +PKER_SWETH( 18, 29) = 0.243228E+00 +PKER_SWETH( 18, 30) = 0.278092E+00 +PKER_SWETH( 18, 31) = 0.313828E+00 +PKER_SWETH( 18, 32) = 0.348949E+00 +PKER_SWETH( 18, 33) = 0.382443E+00 +PKER_SWETH( 18, 34) = 0.413728E+00 +PKER_SWETH( 18, 35) = 0.442554E+00 +PKER_SWETH( 18, 36) = 0.468900E+00 +PKER_SWETH( 18, 37) = 0.492882E+00 +PKER_SWETH( 18, 38) = 0.514690E+00 +PKER_SWETH( 18, 39) = 0.534538E+00 +PKER_SWETH( 18, 40) = 0.552641E+00 +PKER_SWETH( 18, 41) = 0.569197E+00 +PKER_SWETH( 18, 42) = 0.584381E+00 +PKER_SWETH( 18, 43) = 0.598350E+00 +PKER_SWETH( 18, 44) = 0.611236E+00 +PKER_SWETH( 18, 45) = 0.623153E+00 +PKER_SWETH( 18, 46) = 0.634198E+00 +PKER_SWETH( 18, 47) = 0.644457E+00 +PKER_SWETH( 18, 48) = 0.654002E+00 +PKER_SWETH( 18, 49) = 0.662895E+00 +PKER_SWETH( 18, 50) = 0.671191E+00 +PKER_SWETH( 18, 51) = 0.678938E+00 +PKER_SWETH( 18, 52) = 0.686179E+00 +PKER_SWETH( 18, 53) = 0.692953E+00 +PKER_SWETH( 18, 54) = 0.699294E+00 +PKER_SWETH( 18, 55) = 0.705231E+00 +PKER_SWETH( 18, 56) = 0.710794E+00 +PKER_SWETH( 18, 57) = 0.716008E+00 +PKER_SWETH( 18, 58) = 0.720896E+00 +PKER_SWETH( 18, 59) = 0.725480E+00 +PKER_SWETH( 18, 60) = 0.729780E+00 +PKER_SWETH( 18, 61) = 0.733814E+00 +PKER_SWETH( 18, 62) = 0.737598E+00 +PKER_SWETH( 18, 63) = 0.741150E+00 +PKER_SWETH( 18, 64) = 0.744483E+00 +PKER_SWETH( 18, 65) = 0.747611E+00 +PKER_SWETH( 18, 66) = 0.750548E+00 +PKER_SWETH( 18, 67) = 0.753304E+00 +PKER_SWETH( 18, 68) = 0.755892E+00 +PKER_SWETH( 18, 69) = 0.758321E+00 +PKER_SWETH( 18, 70) = 0.760601E+00 +PKER_SWETH( 18, 71) = 0.762742E+00 +PKER_SWETH( 18, 72) = 0.764752E+00 +PKER_SWETH( 18, 73) = 0.766640E+00 +PKER_SWETH( 18, 74) = 0.768412E+00 +PKER_SWETH( 18, 75) = 0.770075E+00 +PKER_SWETH( 18, 76) = 0.771638E+00 +PKER_SWETH( 18, 77) = 0.773104E+00 +PKER_SWETH( 18, 78) = 0.774481E+00 +PKER_SWETH( 18, 79) = 0.775774E+00 +PKER_SWETH( 18, 80) = 0.776989E+00 +PKER_SWETH( 19, 1) = 0.256173E+01 +PKER_SWETH( 19, 2) = 0.236914E+01 +PKER_SWETH( 19, 3) = 0.218829E+01 +PKER_SWETH( 19, 4) = 0.201844E+01 +PKER_SWETH( 19, 5) = 0.185894E+01 +PKER_SWETH( 19, 6) = 0.170913E+01 +PKER_SWETH( 19, 7) = 0.156841E+01 +PKER_SWETH( 19, 8) = 0.143624E+01 +PKER_SWETH( 19, 9) = 0.131207E+01 +PKER_SWETH( 19, 10) = 0.119540E+01 +PKER_SWETH( 19, 11) = 0.108576E+01 +PKER_SWETH( 19, 12) = 0.982703E+00 +PKER_SWETH( 19, 13) = 0.885808E+00 +PKER_SWETH( 19, 14) = 0.794678E+00 +PKER_SWETH( 19, 15) = 0.708950E+00 +PKER_SWETH( 19, 16) = 0.628301E+00 +PKER_SWETH( 19, 17) = 0.552477E+00 +PKER_SWETH( 19, 18) = 0.481331E+00 +PKER_SWETH( 19, 19) = 0.414882E+00 +PKER_SWETH( 19, 20) = 0.353398E+00 +PKER_SWETH( 19, 21) = 0.297416E+00 +PKER_SWETH( 19, 22) = 0.247807E+00 +PKER_SWETH( 19, 23) = 0.205699E+00 +PKER_SWETH( 19, 24) = 0.172316E+00 +PKER_SWETH( 19, 25) = 0.148819E+00 +PKER_SWETH( 19, 26) = 0.135924E+00 +PKER_SWETH( 19, 27) = 0.133720E+00 +PKER_SWETH( 19, 28) = 0.141549E+00 +PKER_SWETH( 19, 29) = 0.158042E+00 +PKER_SWETH( 19, 30) = 0.181252E+00 +PKER_SWETH( 19, 31) = 0.208933E+00 +PKER_SWETH( 19, 32) = 0.239000E+00 +PKER_SWETH( 19, 33) = 0.269677E+00 +PKER_SWETH( 19, 34) = 0.299634E+00 +PKER_SWETH( 19, 35) = 0.328045E+00 +PKER_SWETH( 19, 36) = 0.354467E+00 +PKER_SWETH( 19, 37) = 0.378756E+00 +PKER_SWETH( 19, 38) = 0.400947E+00 +PKER_SWETH( 19, 39) = 0.421175E+00 +PKER_SWETH( 19, 40) = 0.439618E+00 +PKER_SWETH( 19, 41) = 0.456462E+00 +PKER_SWETH( 19, 42) = 0.471885E+00 +PKER_SWETH( 19, 43) = 0.486045E+00 +PKER_SWETH( 19, 44) = 0.499082E+00 +PKER_SWETH( 19, 45) = 0.511119E+00 +PKER_SWETH( 19, 46) = 0.522259E+00 +PKER_SWETH( 19, 47) = 0.532591E+00 +PKER_SWETH( 19, 48) = 0.542192E+00 +PKER_SWETH( 19, 49) = 0.551129E+00 +PKER_SWETH( 19, 50) = 0.559459E+00 +PKER_SWETH( 19, 51) = 0.567233E+00 +PKER_SWETH( 19, 52) = 0.574495E+00 +PKER_SWETH( 19, 53) = 0.581285E+00 +PKER_SWETH( 19, 54) = 0.587637E+00 +PKER_SWETH( 19, 55) = 0.593585E+00 +PKER_SWETH( 19, 56) = 0.599155E+00 +PKER_SWETH( 19, 57) = 0.604374E+00 +PKER_SWETH( 19, 58) = 0.609267E+00 +PKER_SWETH( 19, 59) = 0.613855E+00 +PKER_SWETH( 19, 60) = 0.618157E+00 +PKER_SWETH( 19, 61) = 0.622193E+00 +PKER_SWETH( 19, 62) = 0.625979E+00 +PKER_SWETH( 19, 63) = 0.629532E+00 +PKER_SWETH( 19, 64) = 0.632866E+00 +PKER_SWETH( 19, 65) = 0.635995E+00 +PKER_SWETH( 19, 66) = 0.638932E+00 +PKER_SWETH( 19, 67) = 0.641689E+00 +PKER_SWETH( 19, 68) = 0.644277E+00 +PKER_SWETH( 19, 69) = 0.646706E+00 +PKER_SWETH( 19, 70) = 0.648987E+00 +PKER_SWETH( 19, 71) = 0.651128E+00 +PKER_SWETH( 19, 72) = 0.653138E+00 +PKER_SWETH( 19, 73) = 0.655026E+00 +PKER_SWETH( 19, 74) = 0.656798E+00 +PKER_SWETH( 19, 75) = 0.658461E+00 +PKER_SWETH( 19, 76) = 0.660024E+00 +PKER_SWETH( 19, 77) = 0.661490E+00 +PKER_SWETH( 19, 78) = 0.662868E+00 +PKER_SWETH( 19, 79) = 0.664161E+00 +PKER_SWETH( 19, 80) = 0.665375E+00 +PKER_SWETH( 20, 1) = 0.264500E+01 +PKER_SWETH( 20, 2) = 0.245243E+01 +PKER_SWETH( 20, 3) = 0.227160E+01 +PKER_SWETH( 20, 4) = 0.210178E+01 +PKER_SWETH( 20, 5) = 0.194230E+01 +PKER_SWETH( 20, 6) = 0.179253E+01 +PKER_SWETH( 20, 7) = 0.165187E+01 +PKER_SWETH( 20, 8) = 0.151975E+01 +PKER_SWETH( 20, 9) = 0.139564E+01 +PKER_SWETH( 20, 10) = 0.127905E+01 +PKER_SWETH( 20, 11) = 0.116951E+01 +PKER_SWETH( 20, 12) = 0.106658E+01 +PKER_SWETH( 20, 13) = 0.969820E+00 +PKER_SWETH( 20, 14) = 0.878851E+00 +PKER_SWETH( 20, 15) = 0.793291E+00 +PKER_SWETH( 20, 16) = 0.712786E+00 +PKER_SWETH( 20, 17) = 0.637005E+00 +PKER_SWETH( 20, 18) = 0.565650E+00 +PKER_SWETH( 20, 19) = 0.498472E+00 +PKER_SWETH( 20, 20) = 0.435308E+00 +PKER_SWETH( 20, 21) = 0.376129E+00 +PKER_SWETH( 20, 22) = 0.321110E+00 +PKER_SWETH( 20, 23) = 0.270680E+00 +PKER_SWETH( 20, 24) = 0.225582E+00 +PKER_SWETH( 20, 25) = 0.186836E+00 +PKER_SWETH( 20, 26) = 0.155610E+00 +PKER_SWETH( 20, 27) = 0.133055E+00 +PKER_SWETH( 20, 28) = 0.119975E+00 +PKER_SWETH( 20, 29) = 0.116599E+00 +PKER_SWETH( 20, 30) = 0.122369E+00 +PKER_SWETH( 20, 31) = 0.136033E+00 +PKER_SWETH( 20, 32) = 0.155727E+00 +PKER_SWETH( 20, 33) = 0.179407E+00 +PKER_SWETH( 20, 34) = 0.205090E+00 +PKER_SWETH( 20, 35) = 0.231197E+00 +PKER_SWETH( 20, 36) = 0.256588E+00 +PKER_SWETH( 20, 37) = 0.280587E+00 +PKER_SWETH( 20, 38) = 0.302872E+00 +PKER_SWETH( 20, 39) = 0.323359E+00 +PKER_SWETH( 20, 40) = 0.342106E+00 +PKER_SWETH( 20, 41) = 0.359241E+00 +PKER_SWETH( 20, 42) = 0.374919E+00 +PKER_SWETH( 20, 43) = 0.389291E+00 +PKER_SWETH( 20, 44) = 0.402502E+00 +PKER_SWETH( 20, 45) = 0.414676E+00 +PKER_SWETH( 20, 46) = 0.425924E+00 +PKER_SWETH( 20, 47) = 0.436341E+00 +PKER_SWETH( 20, 48) = 0.446009E+00 +PKER_SWETH( 20, 49) = 0.454997E+00 +PKER_SWETH( 20, 50) = 0.463367E+00 +PKER_SWETH( 20, 51) = 0.471171E+00 +PKER_SWETH( 20, 52) = 0.478457E+00 +PKER_SWETH( 20, 53) = 0.485265E+00 +PKER_SWETH( 20, 54) = 0.491632E+00 +PKER_SWETH( 20, 55) = 0.497590E+00 +PKER_SWETH( 20, 56) = 0.503169E+00 +PKER_SWETH( 20, 57) = 0.508395E+00 +PKER_SWETH( 20, 58) = 0.513293E+00 +PKER_SWETH( 20, 59) = 0.517884E+00 +PKER_SWETH( 20, 60) = 0.522189E+00 +PKER_SWETH( 20, 61) = 0.526227E+00 +PKER_SWETH( 20, 62) = 0.530016E+00 +PKER_SWETH( 20, 63) = 0.533570E+00 +PKER_SWETH( 20, 64) = 0.536905E+00 +PKER_SWETH( 20, 65) = 0.540035E+00 +PKER_SWETH( 20, 66) = 0.542973E+00 +PKER_SWETH( 20, 67) = 0.545730E+00 +PKER_SWETH( 20, 68) = 0.548318E+00 +PKER_SWETH( 20, 69) = 0.550748E+00 +PKER_SWETH( 20, 70) = 0.553029E+00 +PKER_SWETH( 20, 71) = 0.555170E+00 +PKER_SWETH( 20, 72) = 0.557181E+00 +PKER_SWETH( 20, 73) = 0.559068E+00 +PKER_SWETH( 20, 74) = 0.560840E+00 +PKER_SWETH( 20, 75) = 0.562504E+00 +PKER_SWETH( 20, 76) = 0.564067E+00 +PKER_SWETH( 20, 77) = 0.565533E+00 +PKER_SWETH( 20, 78) = 0.566911E+00 +PKER_SWETH( 20, 79) = 0.568204E+00 +PKER_SWETH( 20, 80) = 0.569418E+00 +PKER_SWETH( 21, 1) = 0.271658E+01 +PKER_SWETH( 21, 2) = 0.252403E+01 +PKER_SWETH( 21, 3) = 0.234321E+01 +PKER_SWETH( 21, 4) = 0.217341E+01 +PKER_SWETH( 21, 5) = 0.201396E+01 +PKER_SWETH( 21, 6) = 0.186421E+01 +PKER_SWETH( 21, 7) = 0.172358E+01 +PKER_SWETH( 21, 8) = 0.159150E+01 +PKER_SWETH( 21, 9) = 0.146745E+01 +PKER_SWETH( 21, 10) = 0.135092E+01 +PKER_SWETH( 21, 11) = 0.124145E+01 +PKER_SWETH( 21, 12) = 0.113861E+01 +PKER_SWETH( 21, 13) = 0.104196E+01 +PKER_SWETH( 21, 14) = 0.951122E+00 +PKER_SWETH( 21, 15) = 0.865719E+00 +PKER_SWETH( 21, 16) = 0.785398E+00 +PKER_SWETH( 21, 17) = 0.709821E+00 +PKER_SWETH( 21, 18) = 0.638672E+00 +PKER_SWETH( 21, 19) = 0.571650E+00 +PKER_SWETH( 21, 20) = 0.508481E+00 +PKER_SWETH( 21, 21) = 0.448928E+00 +PKER_SWETH( 21, 22) = 0.392821E+00 +PKER_SWETH( 21, 23) = 0.340101E+00 +PKER_SWETH( 21, 24) = 0.290879E+00 +PKER_SWETH( 21, 25) = 0.245501E+00 +PKER_SWETH( 21, 26) = 0.204609E+00 +PKER_SWETH( 21, 27) = 0.169114E+00 +PKER_SWETH( 21, 28) = 0.140143E+00 +PKER_SWETH( 21, 29) = 0.118804E+00 +PKER_SWETH( 21, 30) = 0.105905E+00 +PKER_SWETH( 21, 31) = 0.101754E+00 +PKER_SWETH( 21, 32) = 0.105915E+00 +PKER_SWETH( 21, 33) = 0.117110E+00 +PKER_SWETH( 21, 34) = 0.133717E+00 +PKER_SWETH( 21, 35) = 0.153768E+00 +PKER_SWETH( 21, 36) = 0.175523E+00 +PKER_SWETH( 21, 37) = 0.197593E+00 +PKER_SWETH( 21, 38) = 0.219023E+00 +PKER_SWETH( 21, 39) = 0.239267E+00 +PKER_SWETH( 21, 40) = 0.258077E+00 +PKER_SWETH( 21, 41) = 0.275405E+00 +PKER_SWETH( 21, 42) = 0.291307E+00 +PKER_SWETH( 21, 43) = 0.305894E+00 +PKER_SWETH( 21, 44) = 0.319290E+00 +PKER_SWETH( 21, 45) = 0.331618E+00 +PKER_SWETH( 21, 46) = 0.342990E+00 +PKER_SWETH( 21, 47) = 0.353504E+00 +PKER_SWETH( 21, 48) = 0.363248E+00 +PKER_SWETH( 21, 49) = 0.372296E+00 +PKER_SWETH( 21, 50) = 0.380712E+00 +PKER_SWETH( 21, 51) = 0.388553E+00 +PKER_SWETH( 21, 52) = 0.395866E+00 +PKER_SWETH( 21, 53) = 0.402696E+00 +PKER_SWETH( 21, 54) = 0.409079E+00 +PKER_SWETH( 21, 55) = 0.415050E+00 +PKER_SWETH( 21, 56) = 0.420639E+00 +PKER_SWETH( 21, 57) = 0.425872E+00 +PKER_SWETH( 21, 58) = 0.430776E+00 +PKER_SWETH( 21, 59) = 0.435372E+00 +PKER_SWETH( 21, 60) = 0.439681E+00 +PKER_SWETH( 21, 61) = 0.443722E+00 +PKER_SWETH( 21, 62) = 0.447512E+00 +PKER_SWETH( 21, 63) = 0.451068E+00 +PKER_SWETH( 21, 64) = 0.454404E+00 +PKER_SWETH( 21, 65) = 0.457535E+00 +PKER_SWETH( 21, 66) = 0.460473E+00 +PKER_SWETH( 21, 67) = 0.463231E+00 +PKER_SWETH( 21, 68) = 0.465820E+00 +PKER_SWETH( 21, 69) = 0.468250E+00 +PKER_SWETH( 21, 70) = 0.470532E+00 +PKER_SWETH( 21, 71) = 0.472673E+00 +PKER_SWETH( 21, 72) = 0.474684E+00 +PKER_SWETH( 21, 73) = 0.476571E+00 +PKER_SWETH( 21, 74) = 0.478344E+00 +PKER_SWETH( 21, 75) = 0.480008E+00 +PKER_SWETH( 21, 76) = 0.481570E+00 +PKER_SWETH( 21, 77) = 0.483037E+00 +PKER_SWETH( 21, 78) = 0.484414E+00 +PKER_SWETH( 21, 79) = 0.485707E+00 +PKER_SWETH( 21, 80) = 0.486921E+00 +PKER_SWETH( 22, 1) = 0.277812E+01 +PKER_SWETH( 22, 2) = 0.258557E+01 +PKER_SWETH( 22, 3) = 0.240477E+01 +PKER_SWETH( 22, 4) = 0.223498E+01 +PKER_SWETH( 22, 5) = 0.207555E+01 +PKER_SWETH( 22, 6) = 0.192582E+01 +PKER_SWETH( 22, 7) = 0.178522E+01 +PKER_SWETH( 22, 8) = 0.165317E+01 +PKER_SWETH( 22, 9) = 0.152915E+01 +PKER_SWETH( 22, 10) = 0.141267E+01 +PKER_SWETH( 22, 11) = 0.130326E+01 +PKER_SWETH( 22, 12) = 0.120048E+01 +PKER_SWETH( 22, 13) = 0.110391E+01 +PKER_SWETH( 22, 14) = 0.101317E+01 +PKER_SWETH( 22, 15) = 0.927888E+00 +PKER_SWETH( 22, 16) = 0.847710E+00 +PKER_SWETH( 22, 17) = 0.772307E+00 +PKER_SWETH( 22, 18) = 0.701363E+00 +PKER_SWETH( 22, 19) = 0.634577E+00 +PKER_SWETH( 22, 20) = 0.571663E+00 +PKER_SWETH( 22, 21) = 0.512351E+00 +PKER_SWETH( 22, 22) = 0.456387E+00 +PKER_SWETH( 22, 23) = 0.403551E+00 +PKER_SWETH( 22, 24) = 0.353674E+00 +PKER_SWETH( 22, 25) = 0.306679E+00 +PKER_SWETH( 22, 26) = 0.262639E+00 +PKER_SWETH( 22, 27) = 0.221831E+00 +PKER_SWETH( 22, 28) = 0.184828E+00 +PKER_SWETH( 22, 29) = 0.152460E+00 +PKER_SWETH( 22, 30) = 0.125752E+00 +PKER_SWETH( 22, 31) = 0.105794E+00 +PKER_SWETH( 22, 32) = 0.933885E-01 +PKER_SWETH( 22, 33) = 0.887837E-01 +PKER_SWETH( 22, 34) = 0.916083E-01 +PKER_SWETH( 22, 35) = 0.100750E+00 +PKER_SWETH( 22, 36) = 0.114556E+00 +PKER_SWETH( 22, 37) = 0.131388E+00 +PKER_SWETH( 22, 38) = 0.149687E+00 +PKER_SWETH( 22, 39) = 0.168264E+00 +PKER_SWETH( 22, 40) = 0.186315E+00 +PKER_SWETH( 22, 41) = 0.203399E+00 +PKER_SWETH( 22, 42) = 0.219317E+00 +PKER_SWETH( 22, 43) = 0.234029E+00 +PKER_SWETH( 22, 44) = 0.247581E+00 +PKER_SWETH( 22, 45) = 0.260059E+00 +PKER_SWETH( 22, 46) = 0.271563E+00 +PKER_SWETH( 22, 47) = 0.282186E+00 +PKER_SWETH( 22, 48) = 0.292018E+00 +PKER_SWETH( 22, 49) = 0.301134E+00 +PKER_SWETH( 22, 50) = 0.309604E+00 +PKER_SWETH( 22, 51) = 0.317487E+00 +PKER_SWETH( 22, 52) = 0.324833E+00 +PKER_SWETH( 22, 53) = 0.331687E+00 +PKER_SWETH( 22, 54) = 0.338090E+00 +PKER_SWETH( 22, 55) = 0.344075E+00 +PKER_SWETH( 22, 56) = 0.349675E+00 +PKER_SWETH( 22, 57) = 0.354918E+00 +PKER_SWETH( 22, 58) = 0.359828E+00 +PKER_SWETH( 22, 59) = 0.364430E+00 +PKER_SWETH( 22, 60) = 0.368743E+00 +PKER_SWETH( 22, 61) = 0.372787E+00 +PKER_SWETH( 22, 62) = 0.376579E+00 +PKER_SWETH( 22, 63) = 0.380137E+00 +PKER_SWETH( 22, 64) = 0.383475E+00 +PKER_SWETH( 22, 65) = 0.386607E+00 +PKER_SWETH( 22, 66) = 0.389546E+00 +PKER_SWETH( 22, 67) = 0.392305E+00 +PKER_SWETH( 22, 68) = 0.394894E+00 +PKER_SWETH( 22, 69) = 0.397325E+00 +PKER_SWETH( 22, 70) = 0.399606E+00 +PKER_SWETH( 22, 71) = 0.401748E+00 +PKER_SWETH( 22, 72) = 0.403759E+00 +PKER_SWETH( 22, 73) = 0.405647E+00 +PKER_SWETH( 22, 74) = 0.407419E+00 +PKER_SWETH( 22, 75) = 0.409083E+00 +PKER_SWETH( 22, 76) = 0.410645E+00 +PKER_SWETH( 22, 77) = 0.412112E+00 +PKER_SWETH( 22, 78) = 0.413490E+00 +PKER_SWETH( 22, 79) = 0.414783E+00 +PKER_SWETH( 22, 80) = 0.415997E+00 +PKER_SWETH( 23, 1) = 0.283102E+01 +PKER_SWETH( 23, 2) = 0.263848E+01 +PKER_SWETH( 23, 3) = 0.245768E+01 +PKER_SWETH( 23, 4) = 0.228791E+01 +PKER_SWETH( 23, 5) = 0.212849E+01 +PKER_SWETH( 23, 6) = 0.197878E+01 +PKER_SWETH( 23, 7) = 0.183819E+01 +PKER_SWETH( 23, 8) = 0.170617E+01 +PKER_SWETH( 23, 9) = 0.158218E+01 +PKER_SWETH( 23, 10) = 0.146573E+01 +PKER_SWETH( 23, 11) = 0.135636E+01 +PKER_SWETH( 23, 12) = 0.125363E+01 +PKER_SWETH( 23, 13) = 0.115712E+01 +PKER_SWETH( 23, 14) = 0.106646E+01 +PKER_SWETH( 23, 15) = 0.981260E+00 +PKER_SWETH( 23, 16) = 0.901190E+00 +PKER_SWETH( 23, 17) = 0.825917E+00 +PKER_SWETH( 23, 18) = 0.755130E+00 +PKER_SWETH( 23, 19) = 0.688534E+00 +PKER_SWETH( 23, 20) = 0.625847E+00 +PKER_SWETH( 23, 21) = 0.566798E+00 +PKER_SWETH( 23, 22) = 0.511131E+00 +PKER_SWETH( 23, 23) = 0.458600E+00 +PKER_SWETH( 23, 24) = 0.408976E+00 +PKER_SWETH( 23, 25) = 0.362052E+00 +PKER_SWETH( 23, 26) = 0.317669E+00 +PKER_SWETH( 23, 27) = 0.275744E+00 +PKER_SWETH( 23, 28) = 0.236322E+00 +PKER_SWETH( 23, 29) = 0.199652E+00 +PKER_SWETH( 23, 30) = 0.166228E+00 +PKER_SWETH( 23, 31) = 0.136821E+00 +PKER_SWETH( 23, 32) = 0.112388E+00 +PKER_SWETH( 23, 33) = 0.939206E-01 +PKER_SWETH( 23, 34) = 0.821751E-01 +PKER_SWETH( 23, 35) = 0.773938E-01 +PKER_SWETH( 23, 36) = 0.791534E-01 +PKER_SWETH( 23, 37) = 0.864193E-01 +PKER_SWETH( 23, 38) = 0.978352E-01 +PKER_SWETH( 23, 39) = 0.111845E+00 +PKER_SWETH( 23, 40) = 0.127143E+00 +PKER_SWETH( 23, 41) = 0.142733E+00 +PKER_SWETH( 23, 42) = 0.157936E+00 +PKER_SWETH( 23, 43) = 0.172382E+00 +PKER_SWETH( 23, 44) = 0.185898E+00 +PKER_SWETH( 23, 45) = 0.198442E+00 +PKER_SWETH( 23, 46) = 0.210045E+00 +PKER_SWETH( 23, 47) = 0.220770E+00 +PKER_SWETH( 23, 48) = 0.230692E+00 +PKER_SWETH( 23, 49) = 0.239885E+00 +PKER_SWETH( 23, 50) = 0.248416E+00 +PKER_SWETH( 23, 51) = 0.256346E+00 +PKER_SWETH( 23, 52) = 0.263730E+00 +PKER_SWETH( 23, 53) = 0.270613E+00 +PKER_SWETH( 23, 54) = 0.277038E+00 +PKER_SWETH( 23, 55) = 0.283042E+00 +PKER_SWETH( 23, 56) = 0.288655E+00 +PKER_SWETH( 23, 57) = 0.293908E+00 +PKER_SWETH( 23, 58) = 0.298826E+00 +PKER_SWETH( 23, 59) = 0.303434E+00 +PKER_SWETH( 23, 60) = 0.307751E+00 +PKER_SWETH( 23, 61) = 0.311799E+00 +PKER_SWETH( 23, 62) = 0.315594E+00 +PKER_SWETH( 23, 63) = 0.319154E+00 +PKER_SWETH( 23, 64) = 0.322494E+00 +PKER_SWETH( 23, 65) = 0.325627E+00 +PKER_SWETH( 23, 66) = 0.328568E+00 +PKER_SWETH( 23, 67) = 0.331327E+00 +PKER_SWETH( 23, 68) = 0.333917E+00 +PKER_SWETH( 23, 69) = 0.336348E+00 +PKER_SWETH( 23, 70) = 0.338630E+00 +PKER_SWETH( 23, 71) = 0.340772E+00 +PKER_SWETH( 23, 72) = 0.342783E+00 +PKER_SWETH( 23, 73) = 0.344671E+00 +PKER_SWETH( 23, 74) = 0.346443E+00 +PKER_SWETH( 23, 75) = 0.348107E+00 +PKER_SWETH( 23, 76) = 0.349670E+00 +PKER_SWETH( 23, 77) = 0.351137E+00 +PKER_SWETH( 23, 78) = 0.352514E+00 +PKER_SWETH( 23, 79) = 0.353807E+00 +PKER_SWETH( 23, 80) = 0.355022E+00 +PKER_SWETH( 24, 1) = 0.287649E+01 +PKER_SWETH( 24, 2) = 0.268396E+01 +PKER_SWETH( 24, 3) = 0.250317E+01 +PKER_SWETH( 24, 4) = 0.233341E+01 +PKER_SWETH( 24, 5) = 0.217399E+01 +PKER_SWETH( 24, 6) = 0.202430E+01 +PKER_SWETH( 24, 7) = 0.188372E+01 +PKER_SWETH( 24, 8) = 0.175172E+01 +PKER_SWETH( 24, 9) = 0.162775E+01 +PKER_SWETH( 24, 10) = 0.151133E+01 +PKER_SWETH( 24, 11) = 0.140199E+01 +PKER_SWETH( 24, 12) = 0.129929E+01 +PKER_SWETH( 24, 13) = 0.120283E+01 +PKER_SWETH( 24, 14) = 0.111222E+01 +PKER_SWETH( 24, 15) = 0.102709E+01 +PKER_SWETH( 24, 16) = 0.947100E+00 +PKER_SWETH( 24, 17) = 0.871925E+00 +PKER_SWETH( 24, 18) = 0.801255E+00 +PKER_SWETH( 24, 19) = 0.734802E+00 +PKER_SWETH( 24, 20) = 0.672286E+00 +PKER_SWETH( 24, 21) = 0.613444E+00 +PKER_SWETH( 24, 22) = 0.558025E+00 +PKER_SWETH( 24, 23) = 0.505784E+00 +PKER_SWETH( 24, 24) = 0.456492E+00 +PKER_SWETH( 24, 25) = 0.409924E+00 +PKER_SWETH( 24, 26) = 0.365874E+00 +PKER_SWETH( 24, 27) = 0.324153E+00 +PKER_SWETH( 24, 28) = 0.284613E+00 +PKER_SWETH( 24, 29) = 0.247175E+00 +PKER_SWETH( 24, 30) = 0.211878E+00 +PKER_SWETH( 24, 31) = 0.178940E+00 +PKER_SWETH( 24, 32) = 0.148822E+00 +PKER_SWETH( 24, 33) = 0.122216E+00 +PKER_SWETH( 24, 34) = 0.100012E+00 +PKER_SWETH( 24, 35) = 0.831056E-01 +PKER_SWETH( 24, 36) = 0.721377E-01 +PKER_SWETH( 24, 37) = 0.673132E-01 +PKER_SWETH( 24, 38) = 0.682186E-01 +PKER_SWETH( 24, 39) = 0.739244E-01 +PKER_SWETH( 24, 40) = 0.832005E-01 +PKER_SWETH( 24, 41) = 0.947760E-01 +PKER_SWETH( 24, 42) = 0.107532E+00 +PKER_SWETH( 24, 43) = 0.120598E+00 +PKER_SWETH( 24, 44) = 0.133420E+00 +PKER_SWETH( 24, 45) = 0.145669E+00 +PKER_SWETH( 24, 46) = 0.157186E+00 +PKER_SWETH( 24, 47) = 0.167927E+00 +PKER_SWETH( 24, 48) = 0.177903E+00 +PKER_SWETH( 24, 49) = 0.187160E+00 +PKER_SWETH( 24, 50) = 0.195752E+00 +PKER_SWETH( 24, 51) = 0.203734E+00 +PKER_SWETH( 24, 52) = 0.211160E+00 +PKER_SWETH( 24, 53) = 0.218077E+00 +PKER_SWETH( 24, 54) = 0.224528E+00 +PKER_SWETH( 24, 55) = 0.230551E+00 +PKER_SWETH( 24, 56) = 0.236181E+00 +PKER_SWETH( 24, 57) = 0.241446E+00 +PKER_SWETH( 24, 58) = 0.246373E+00 +PKER_SWETH( 24, 59) = 0.250988E+00 +PKER_SWETH( 24, 60) = 0.255311E+00 +PKER_SWETH( 24, 61) = 0.259363E+00 +PKER_SWETH( 24, 62) = 0.263162E+00 +PKER_SWETH( 24, 63) = 0.266724E+00 +PKER_SWETH( 24, 64) = 0.270065E+00 +PKER_SWETH( 24, 65) = 0.273200E+00 +PKER_SWETH( 24, 66) = 0.276142E+00 +PKER_SWETH( 24, 67) = 0.278902E+00 +PKER_SWETH( 24, 68) = 0.281493E+00 +PKER_SWETH( 24, 69) = 0.283924E+00 +PKER_SWETH( 24, 70) = 0.286206E+00 +PKER_SWETH( 24, 71) = 0.288349E+00 +PKER_SWETH( 24, 72) = 0.290360E+00 +PKER_SWETH( 24, 73) = 0.292248E+00 +PKER_SWETH( 24, 74) = 0.294021E+00 +PKER_SWETH( 24, 75) = 0.295685E+00 +PKER_SWETH( 24, 76) = 0.297248E+00 +PKER_SWETH( 24, 77) = 0.298715E+00 +PKER_SWETH( 24, 78) = 0.300092E+00 +PKER_SWETH( 24, 79) = 0.301385E+00 +PKER_SWETH( 24, 80) = 0.302600E+00 +PKER_SWETH( 25, 1) = 0.291559E+01 +PKER_SWETH( 25, 2) = 0.272306E+01 +PKER_SWETH( 25, 3) = 0.254227E+01 +PKER_SWETH( 25, 4) = 0.237251E+01 +PKER_SWETH( 25, 5) = 0.221311E+01 +PKER_SWETH( 25, 6) = 0.206342E+01 +PKER_SWETH( 25, 7) = 0.192286E+01 +PKER_SWETH( 25, 8) = 0.179087E+01 +PKER_SWETH( 25, 9) = 0.166692E+01 +PKER_SWETH( 25, 10) = 0.155051E+01 +PKER_SWETH( 25, 11) = 0.144120E+01 +PKER_SWETH( 25, 12) = 0.133853E+01 +PKER_SWETH( 25, 13) = 0.124210E+01 +PKER_SWETH( 25, 14) = 0.115153E+01 +PKER_SWETH( 25, 15) = 0.106645E+01 +PKER_SWETH( 25, 16) = 0.986522E+00 +PKER_SWETH( 25, 17) = 0.911418E+00 +PKER_SWETH( 25, 18) = 0.840837E+00 +PKER_SWETH( 25, 19) = 0.774489E+00 +PKER_SWETH( 25, 20) = 0.712102E+00 +PKER_SWETH( 25, 21) = 0.653415E+00 +PKER_SWETH( 25, 22) = 0.598183E+00 +PKER_SWETH( 25, 23) = 0.546167E+00 +PKER_SWETH( 25, 24) = 0.497142E+00 +PKER_SWETH( 25, 25) = 0.450891E+00 +PKER_SWETH( 25, 26) = 0.407203E+00 +PKER_SWETH( 25, 27) = 0.365878E+00 +PKER_SWETH( 25, 28) = 0.326729E+00 +PKER_SWETH( 25, 29) = 0.289588E+00 +PKER_SWETH( 25, 30) = 0.254321E+00 +PKER_SWETH( 25, 31) = 0.220863E+00 +PKER_SWETH( 25, 32) = 0.189255E+00 +PKER_SWETH( 25, 33) = 0.159705E+00 +PKER_SWETH( 25, 34) = 0.132637E+00 +PKER_SWETH( 25, 35) = 0.108685E+00 +PKER_SWETH( 25, 36) = 0.886458E-01 +PKER_SWETH( 25, 37) = 0.733000E-01 +PKER_SWETH( 25, 38) = 0.631817E-01 +PKER_SWETH( 25, 39) = 0.584175E-01 +PKER_SWETH( 25, 40) = 0.586280E-01 +PKER_SWETH( 25, 41) = 0.629970E-01 +PKER_SWETH( 25, 42) = 0.704646E-01 +PKER_SWETH( 25, 43) = 0.799685E-01 +PKER_SWETH( 25, 44) = 0.905525E-01 +PKER_SWETH( 25, 45) = 0.101507E+00 +PKER_SWETH( 25, 46) = 0.112335E+00 +PKER_SWETH( 25, 47) = 0.122751E+00 +PKER_SWETH( 25, 48) = 0.132601E+00 +PKER_SWETH( 25, 49) = 0.141833E+00 +PKER_SWETH( 25, 50) = 0.150445E+00 +PKER_SWETH( 25, 51) = 0.158463E+00 +PKER_SWETH( 25, 52) = 0.165926E+00 +PKER_SWETH( 25, 53) = 0.172877E+00 +PKER_SWETH( 25, 54) = 0.179357E+00 +PKER_SWETH( 25, 55) = 0.185404E+00 +PKER_SWETH( 25, 56) = 0.191051E+00 +PKER_SWETH( 25, 57) = 0.196330E+00 +PKER_SWETH( 25, 58) = 0.201268E+00 +PKER_SWETH( 25, 59) = 0.205891E+00 +PKER_SWETH( 25, 60) = 0.210221E+00 +PKER_SWETH( 25, 61) = 0.214278E+00 +PKER_SWETH( 25, 62) = 0.218080E+00 +PKER_SWETH( 25, 63) = 0.221646E+00 +PKER_SWETH( 25, 64) = 0.224989E+00 +PKER_SWETH( 25, 65) = 0.228126E+00 +PKER_SWETH( 25, 66) = 0.231069E+00 +PKER_SWETH( 25, 67) = 0.233830E+00 +PKER_SWETH( 25, 68) = 0.236422E+00 +PKER_SWETH( 25, 69) = 0.238854E+00 +PKER_SWETH( 25, 70) = 0.241137E+00 +PKER_SWETH( 25, 71) = 0.243279E+00 +PKER_SWETH( 25, 72) = 0.245291E+00 +PKER_SWETH( 25, 73) = 0.247179E+00 +PKER_SWETH( 25, 74) = 0.248952E+00 +PKER_SWETH( 25, 75) = 0.250616E+00 +PKER_SWETH( 25, 76) = 0.252179E+00 +PKER_SWETH( 25, 77) = 0.253646E+00 +PKER_SWETH( 25, 78) = 0.255024E+00 +PKER_SWETH( 25, 79) = 0.256317E+00 +PKER_SWETH( 25, 80) = 0.257531E+00 +PKER_SWETH( 26, 1) = 0.294919E+01 +PKER_SWETH( 26, 2) = 0.275667E+01 +PKER_SWETH( 26, 3) = 0.257589E+01 +PKER_SWETH( 26, 4) = 0.240613E+01 +PKER_SWETH( 26, 5) = 0.224673E+01 +PKER_SWETH( 26, 6) = 0.209706E+01 +PKER_SWETH( 26, 7) = 0.195650E+01 +PKER_SWETH( 26, 8) = 0.182452E+01 +PKER_SWETH( 26, 9) = 0.170058E+01 +PKER_SWETH( 26, 10) = 0.158419E+01 +PKER_SWETH( 26, 11) = 0.147489E+01 +PKER_SWETH( 26, 12) = 0.137225E+01 +PKER_SWETH( 26, 13) = 0.127585E+01 +PKER_SWETH( 26, 14) = 0.118531E+01 +PKER_SWETH( 26, 15) = 0.110026E+01 +PKER_SWETH( 26, 16) = 0.102038E+01 +PKER_SWETH( 26, 17) = 0.945328E+00 +PKER_SWETH( 26, 18) = 0.874813E+00 +PKER_SWETH( 26, 19) = 0.808544E+00 +PKER_SWETH( 26, 20) = 0.746253E+00 +PKER_SWETH( 26, 21) = 0.687683E+00 +PKER_SWETH( 26, 22) = 0.632590E+00 +PKER_SWETH( 26, 23) = 0.580743E+00 +PKER_SWETH( 26, 24) = 0.531921E+00 +PKER_SWETH( 26, 25) = 0.485912E+00 +PKER_SWETH( 26, 26) = 0.442513E+00 +PKER_SWETH( 26, 27) = 0.401527E+00 +PKER_SWETH( 26, 28) = 0.362766E+00 +PKER_SWETH( 26, 29) = 0.326051E+00 +PKER_SWETH( 26, 30) = 0.291214E+00 +PKER_SWETH( 26, 31) = 0.258107E+00 +PKER_SWETH( 26, 32) = 0.226621E+00 +PKER_SWETH( 26, 33) = 0.196706E+00 +PKER_SWETH( 26, 34) = 0.168416E+00 +PKER_SWETH( 26, 35) = 0.141958E+00 +PKER_SWETH( 26, 36) = 0.117722E+00 +PKER_SWETH( 26, 37) = 0.962814E-01 +PKER_SWETH( 26, 38) = 0.783300E-01 +PKER_SWETH( 26, 39) = 0.645079E-01 +PKER_SWETH( 26, 40) = 0.552534E-01 +PKER_SWETH( 26, 41) = 0.506271E-01 +PKER_SWETH( 26, 42) = 0.502626E-01 +PKER_SWETH( 26, 43) = 0.534894E-01 +PKER_SWETH( 26, 44) = 0.594360E-01 +PKER_SWETH( 26, 45) = 0.671708E-01 +PKER_SWETH( 26, 46) = 0.759473E-01 +PKER_SWETH( 26, 47) = 0.851241E-01 +PKER_SWETH( 26, 48) = 0.942847E-01 +PKER_SWETH( 26, 49) = 0.103164E+00 +PKER_SWETH( 26, 50) = 0.111616E+00 +PKER_SWETH( 26, 51) = 0.119577E+00 +PKER_SWETH( 26, 52) = 0.127034E+00 +PKER_SWETH( 26, 53) = 0.134000E+00 +PKER_SWETH( 26, 54) = 0.140501E+00 +PKER_SWETH( 26, 55) = 0.146568E+00 +PKER_SWETH( 26, 56) = 0.152234E+00 +PKER_SWETH( 26, 57) = 0.157529E+00 +PKER_SWETH( 26, 58) = 0.162480E+00 +PKER_SWETH( 26, 59) = 0.167112E+00 +PKER_SWETH( 26, 60) = 0.171449E+00 +PKER_SWETH( 26, 61) = 0.175512E+00 +PKER_SWETH( 26, 62) = 0.179319E+00 +PKER_SWETH( 26, 63) = 0.182888E+00 +PKER_SWETH( 26, 64) = 0.186234E+00 +PKER_SWETH( 26, 65) = 0.189373E+00 +PKER_SWETH( 26, 66) = 0.192317E+00 +PKER_SWETH( 26, 67) = 0.195080E+00 +PKER_SWETH( 26, 68) = 0.197672E+00 +PKER_SWETH( 26, 69) = 0.200105E+00 +PKER_SWETH( 26, 70) = 0.202388E+00 +PKER_SWETH( 26, 71) = 0.204532E+00 +PKER_SWETH( 26, 72) = 0.206543E+00 +PKER_SWETH( 26, 73) = 0.208432E+00 +PKER_SWETH( 26, 74) = 0.210205E+00 +PKER_SWETH( 26, 75) = 0.211870E+00 +PKER_SWETH( 26, 76) = 0.213432E+00 +PKER_SWETH( 26, 77) = 0.214900E+00 +PKER_SWETH( 26, 78) = 0.216277E+00 +PKER_SWETH( 26, 79) = 0.217571E+00 +PKER_SWETH( 26, 80) = 0.218785E+00 +PKER_SWETH( 27, 1) = 0.297808E+01 +PKER_SWETH( 27, 2) = 0.278556E+01 +PKER_SWETH( 27, 3) = 0.260479E+01 +PKER_SWETH( 27, 4) = 0.243504E+01 +PKER_SWETH( 27, 5) = 0.227564E+01 +PKER_SWETH( 27, 6) = 0.212597E+01 +PKER_SWETH( 27, 7) = 0.198542E+01 +PKER_SWETH( 27, 8) = 0.185344E+01 +PKER_SWETH( 27, 9) = 0.172951E+01 +PKER_SWETH( 27, 10) = 0.161314E+01 +PKER_SWETH( 27, 11) = 0.150385E+01 +PKER_SWETH( 27, 12) = 0.140122E+01 +PKER_SWETH( 27, 13) = 0.130484E+01 +PKER_SWETH( 27, 14) = 0.121432E+01 +PKER_SWETH( 27, 15) = 0.112931E+01 +PKER_SWETH( 27, 16) = 0.104946E+01 +PKER_SWETH( 27, 17) = 0.974450E+00 +PKER_SWETH( 27, 18) = 0.903983E+00 +PKER_SWETH( 27, 19) = 0.837775E+00 +PKER_SWETH( 27, 20) = 0.775555E+00 +PKER_SWETH( 27, 21) = 0.717072E+00 +PKER_SWETH( 27, 22) = 0.662084E+00 +PKER_SWETH( 27, 23) = 0.610364E+00 +PKER_SWETH( 27, 24) = 0.561694E+00 +PKER_SWETH( 27, 25) = 0.515868E+00 +PKER_SWETH( 27, 26) = 0.472688E+00 +PKER_SWETH( 27, 27) = 0.431963E+00 +PKER_SWETH( 27, 28) = 0.393511E+00 +PKER_SWETH( 27, 29) = 0.357155E+00 +PKER_SWETH( 27, 30) = 0.322725E+00 +PKER_SWETH( 27, 31) = 0.290064E+00 +PKER_SWETH( 27, 32) = 0.259024E+00 +PKER_SWETH( 27, 33) = 0.229483E+00 +PKER_SWETH( 27, 34) = 0.201355E+00 +PKER_SWETH( 27, 35) = 0.174615E+00 +PKER_SWETH( 27, 36) = 0.149334E+00 +PKER_SWETH( 27, 37) = 0.125718E+00 +PKER_SWETH( 27, 38) = 0.104127E+00 +PKER_SWETH( 27, 39) = 0.850544E-01 +PKER_SWETH( 27, 40) = 0.690877E-01 +PKER_SWETH( 27, 41) = 0.567360E-01 +PKER_SWETH( 27, 42) = 0.483077E-01 +PKER_SWETH( 27, 43) = 0.438459E-01 +PKER_SWETH( 27, 44) = 0.430396E-01 +PKER_SWETH( 27, 45) = 0.452998E-01 +PKER_SWETH( 27, 46) = 0.499404E-01 +PKER_SWETH( 27, 47) = 0.562217E-01 +PKER_SWETH( 27, 48) = 0.634525E-01 +PKER_SWETH( 27, 49) = 0.711393E-01 +PKER_SWETH( 27, 50) = 0.788981E-01 +PKER_SWETH( 27, 51) = 0.864846E-01 +PKER_SWETH( 27, 52) = 0.937536E-01 +PKER_SWETH( 27, 53) = 0.100637E+00 +PKER_SWETH( 27, 54) = 0.107111E+00 +PKER_SWETH( 27, 55) = 0.113177E+00 +PKER_SWETH( 27, 56) = 0.118852E+00 +PKER_SWETH( 27, 57) = 0.124158E+00 +PKER_SWETH( 27, 58) = 0.129121E+00 +PKER_SWETH( 27, 59) = 0.133764E+00 +PKER_SWETH( 27, 60) = 0.138109E+00 +PKER_SWETH( 27, 61) = 0.142178E+00 +PKER_SWETH( 27, 62) = 0.145991E+00 +PKER_SWETH( 27, 63) = 0.149563E+00 +PKER_SWETH( 27, 64) = 0.152913E+00 +PKER_SWETH( 27, 65) = 0.156054E+00 +PKER_SWETH( 27, 66) = 0.159000E+00 +PKER_SWETH( 27, 67) = 0.161764E+00 +PKER_SWETH( 27, 68) = 0.164357E+00 +PKER_SWETH( 27, 69) = 0.166791E+00 +PKER_SWETH( 27, 70) = 0.169075E+00 +PKER_SWETH( 27, 71) = 0.171219E+00 +PKER_SWETH( 27, 72) = 0.173231E+00 +PKER_SWETH( 27, 73) = 0.175120E+00 +PKER_SWETH( 27, 74) = 0.176893E+00 +PKER_SWETH( 27, 75) = 0.178558E+00 +PKER_SWETH( 27, 76) = 0.180121E+00 +PKER_SWETH( 27, 77) = 0.181588E+00 +PKER_SWETH( 27, 78) = 0.182966E+00 +PKER_SWETH( 27, 79) = 0.184259E+00 +PKER_SWETH( 27, 80) = 0.185474E+00 +PKER_SWETH( 28, 1) = 0.300292E+01 +PKER_SWETH( 28, 2) = 0.281040E+01 +PKER_SWETH( 28, 3) = 0.262963E+01 +PKER_SWETH( 28, 4) = 0.245988E+01 +PKER_SWETH( 28, 5) = 0.230049E+01 +PKER_SWETH( 28, 6) = 0.215082E+01 +PKER_SWETH( 28, 7) = 0.201028E+01 +PKER_SWETH( 28, 8) = 0.187831E+01 +PKER_SWETH( 28, 9) = 0.175438E+01 +PKER_SWETH( 28, 10) = 0.163802E+01 +PKER_SWETH( 28, 11) = 0.152874E+01 +PKER_SWETH( 28, 12) = 0.142612E+01 +PKER_SWETH( 28, 13) = 0.132976E+01 +PKER_SWETH( 28, 14) = 0.123926E+01 +PKER_SWETH( 28, 15) = 0.115426E+01 +PKER_SWETH( 28, 16) = 0.107444E+01 +PKER_SWETH( 28, 17) = 0.999462E+00 +PKER_SWETH( 28, 18) = 0.929033E+00 +PKER_SWETH( 28, 19) = 0.862870E+00 +PKER_SWETH( 28, 20) = 0.800705E+00 +PKER_SWETH( 28, 21) = 0.742287E+00 +PKER_SWETH( 28, 22) = 0.687378E+00 +PKER_SWETH( 28, 23) = 0.635752E+00 +PKER_SWETH( 28, 24) = 0.587197E+00 +PKER_SWETH( 28, 25) = 0.541509E+00 +PKER_SWETH( 28, 26) = 0.498494E+00 +PKER_SWETH( 28, 27) = 0.457967E+00 +PKER_SWETH( 28, 28) = 0.419751E+00 +PKER_SWETH( 28, 29) = 0.383673E+00 +PKER_SWETH( 28, 30) = 0.349569E+00 +PKER_SWETH( 28, 31) = 0.317283E+00 +PKER_SWETH( 28, 32) = 0.286664E+00 +PKER_SWETH( 28, 33) = 0.257572E+00 +PKER_SWETH( 28, 34) = 0.229887E+00 +PKER_SWETH( 28, 35) = 0.203511E+00 +PKER_SWETH( 28, 36) = 0.178386E+00 +PKER_SWETH( 28, 37) = 0.154515E+00 +PKER_SWETH( 28, 38) = 0.131988E+00 +PKER_SWETH( 28, 39) = 0.111005E+00 +PKER_SWETH( 28, 40) = 0.918807E-01 +PKER_SWETH( 28, 41) = 0.750363E-01 +PKER_SWETH( 28, 42) = 0.609249E-01 +PKER_SWETH( 28, 43) = 0.499395E-01 +PKER_SWETH( 28, 44) = 0.423051E-01 +PKER_SWETH( 28, 45) = 0.380232E-01 +PKER_SWETH( 28, 46) = 0.368477E-01 +PKER_SWETH( 28, 47) = 0.383224E-01 +PKER_SWETH( 28, 48) = 0.418693E-01 +PKER_SWETH( 28, 49) = 0.468853E-01 +PKER_SWETH( 28, 50) = 0.528439E-01 +PKER_SWETH( 28, 51) = 0.592713E-01 +PKER_SWETH( 28, 52) = 0.658408E-01 +PKER_SWETH( 28, 53) = 0.723285E-01 +PKER_SWETH( 28, 54) = 0.785904E-01 +PKER_SWETH( 28, 55) = 0.845537E-01 +PKER_SWETH( 28, 56) = 0.901848E-01 +PKER_SWETH( 28, 57) = 0.954771E-01 +PKER_SWETH( 28, 58) = 0.100439E+00 +PKER_SWETH( 28, 59) = 0.105087E+00 +PKER_SWETH( 28, 60) = 0.109439E+00 +PKER_SWETH( 28, 61) = 0.113515E+00 +PKER_SWETH( 28, 62) = 0.117332E+00 +PKER_SWETH( 28, 63) = 0.120909E+00 +PKER_SWETH( 28, 64) = 0.124262E+00 +PKER_SWETH( 28, 65) = 0.127406E+00 +PKER_SWETH( 28, 66) = 0.130355E+00 +PKER_SWETH( 28, 67) = 0.133120E+00 +PKER_SWETH( 28, 68) = 0.135715E+00 +PKER_SWETH( 28, 69) = 0.138149E+00 +PKER_SWETH( 28, 70) = 0.140434E+00 +PKER_SWETH( 28, 71) = 0.142578E+00 +PKER_SWETH( 28, 72) = 0.144591E+00 +PKER_SWETH( 28, 73) = 0.146480E+00 +PKER_SWETH( 28, 74) = 0.148254E+00 +PKER_SWETH( 28, 75) = 0.149919E+00 +PKER_SWETH( 28, 76) = 0.151482E+00 +PKER_SWETH( 28, 77) = 0.152949E+00 +PKER_SWETH( 28, 78) = 0.154327E+00 +PKER_SWETH( 28, 79) = 0.155621E+00 +PKER_SWETH( 28, 80) = 0.156835E+00 +PKER_SWETH( 29, 1) = 0.302428E+01 +PKER_SWETH( 29, 2) = 0.283176E+01 +PKER_SWETH( 29, 3) = 0.265098E+01 +PKER_SWETH( 29, 4) = 0.248124E+01 +PKER_SWETH( 29, 5) = 0.232185E+01 +PKER_SWETH( 29, 6) = 0.217218E+01 +PKER_SWETH( 29, 7) = 0.203165E+01 +PKER_SWETH( 29, 8) = 0.189968E+01 +PKER_SWETH( 29, 9) = 0.177576E+01 +PKER_SWETH( 29, 10) = 0.165940E+01 +PKER_SWETH( 29, 11) = 0.155013E+01 +PKER_SWETH( 29, 12) = 0.144753E+01 +PKER_SWETH( 29, 13) = 0.135117E+01 +PKER_SWETH( 29, 14) = 0.126068E+01 +PKER_SWETH( 29, 15) = 0.117571E+01 +PKER_SWETH( 29, 16) = 0.109590E+01 +PKER_SWETH( 29, 17) = 0.102095E+01 +PKER_SWETH( 29, 18) = 0.950548E+00 +PKER_SWETH( 29, 19) = 0.884419E+00 +PKER_SWETH( 29, 20) = 0.822295E+00 +PKER_SWETH( 29, 21) = 0.763926E+00 +PKER_SWETH( 29, 22) = 0.709077E+00 +PKER_SWETH( 29, 23) = 0.657523E+00 +PKER_SWETH( 29, 24) = 0.609055E+00 +PKER_SWETH( 29, 25) = 0.563470E+00 +PKER_SWETH( 29, 26) = 0.520580E+00 +PKER_SWETH( 29, 27) = 0.480203E+00 +PKER_SWETH( 29, 28) = 0.442165E+00 +PKER_SWETH( 29, 29) = 0.406299E+00 +PKER_SWETH( 29, 30) = 0.372447E+00 +PKER_SWETH( 29, 31) = 0.340455E+00 +PKER_SWETH( 29, 32) = 0.310175E+00 +PKER_SWETH( 29, 33) = 0.281469E+00 +PKER_SWETH( 29, 34) = 0.254205E+00 +PKER_SWETH( 29, 35) = 0.228266E+00 +PKER_SWETH( 29, 36) = 0.203556E+00 +PKER_SWETH( 29, 37) = 0.180007E+00 +PKER_SWETH( 29, 38) = 0.157592E+00 +PKER_SWETH( 29, 39) = 0.136340E+00 +PKER_SWETH( 29, 40) = 0.116352E+00 +PKER_SWETH( 29, 41) = 0.978136E-01 +PKER_SWETH( 29, 42) = 0.809885E-01 +PKER_SWETH( 29, 43) = 0.662043E-01 +PKER_SWETH( 29, 44) = 0.538061E-01 +PKER_SWETH( 29, 45) = 0.440664E-01 +PKER_SWETH( 29, 46) = 0.371573E-01 +PKER_SWETH( 29, 47) = 0.330684E-01 +PKER_SWETH( 29, 48) = 0.315985E-01 +PKER_SWETH( 29, 49) = 0.324092E-01 +PKER_SWETH( 29, 50) = 0.350441E-01 +PKER_SWETH( 29, 51) = 0.390177E-01 +PKER_SWETH( 29, 52) = 0.438760E-01 +PKER_SWETH( 29, 53) = 0.492363E-01 +PKER_SWETH( 29, 54) = 0.548009E-01 +PKER_SWETH( 29, 55) = 0.603500E-01 +PKER_SWETH( 29, 56) = 0.657504E-01 +PKER_SWETH( 29, 57) = 0.709231E-01 +PKER_SWETH( 29, 58) = 0.758271E-01 +PKER_SWETH( 29, 59) = 0.804506E-01 +PKER_SWETH( 29, 60) = 0.847948E-01 +PKER_SWETH( 29, 61) = 0.888701E-01 +PKER_SWETH( 29, 62) = 0.926906E-01 +PKER_SWETH( 29, 63) = 0.962714E-01 +PKER_SWETH( 29, 64) = 0.996278E-01 +PKER_SWETH( 29, 65) = 0.102775E+00 +PKER_SWETH( 29, 66) = 0.105725E+00 +PKER_SWETH( 29, 67) = 0.108493E+00 +PKER_SWETH( 29, 68) = 0.111089E+00 +PKER_SWETH( 29, 69) = 0.113525E+00 +PKER_SWETH( 29, 70) = 0.115810E+00 +PKER_SWETH( 29, 71) = 0.117955E+00 +PKER_SWETH( 29, 72) = 0.119968E+00 +PKER_SWETH( 29, 73) = 0.121858E+00 +PKER_SWETH( 29, 74) = 0.123632E+00 +PKER_SWETH( 29, 75) = 0.125297E+00 +PKER_SWETH( 29, 76) = 0.126860E+00 +PKER_SWETH( 29, 77) = 0.128328E+00 +PKER_SWETH( 29, 78) = 0.129706E+00 +PKER_SWETH( 29, 79) = 0.130999E+00 +PKER_SWETH( 29, 80) = 0.132214E+00 +PKER_SWETH( 30, 1) = 0.304263E+01 +PKER_SWETH( 30, 2) = 0.285012E+01 +PKER_SWETH( 30, 3) = 0.266934E+01 +PKER_SWETH( 30, 4) = 0.249960E+01 +PKER_SWETH( 30, 5) = 0.234021E+01 +PKER_SWETH( 30, 6) = 0.219055E+01 +PKER_SWETH( 30, 7) = 0.205001E+01 +PKER_SWETH( 30, 8) = 0.191805E+01 +PKER_SWETH( 30, 9) = 0.179414E+01 +PKER_SWETH( 30, 10) = 0.167778E+01 +PKER_SWETH( 30, 11) = 0.156852E+01 +PKER_SWETH( 30, 12) = 0.146592E+01 +PKER_SWETH( 30, 13) = 0.136957E+01 +PKER_SWETH( 30, 14) = 0.127910E+01 +PKER_SWETH( 30, 15) = 0.119413E+01 +PKER_SWETH( 30, 16) = 0.111434E+01 +PKER_SWETH( 30, 17) = 0.103941E+01 +PKER_SWETH( 30, 18) = 0.969029E+00 +PKER_SWETH( 30, 19) = 0.902926E+00 +PKER_SWETH( 30, 20) = 0.840833E+00 +PKER_SWETH( 30, 21) = 0.782502E+00 +PKER_SWETH( 30, 22) = 0.727698E+00 +PKER_SWETH( 30, 23) = 0.676199E+00 +PKER_SWETH( 30, 24) = 0.627795E+00 +PKER_SWETH( 30, 25) = 0.582290E+00 +PKER_SWETH( 30, 26) = 0.539494E+00 +PKER_SWETH( 30, 27) = 0.499230E+00 +PKER_SWETH( 30, 28) = 0.461327E+00 +PKER_SWETH( 30, 29) = 0.425623E+00 +PKER_SWETH( 30, 30) = 0.391964E+00 +PKER_SWETH( 30, 31) = 0.360198E+00 +PKER_SWETH( 30, 32) = 0.330184E+00 +PKER_SWETH( 30, 33) = 0.301784E+00 +PKER_SWETH( 30, 34) = 0.274868E+00 +PKER_SWETH( 30, 35) = 0.249313E+00 +PKER_SWETH( 30, 36) = 0.225011E+00 +PKER_SWETH( 30, 37) = 0.201868E+00 +PKER_SWETH( 30, 38) = 0.179815E+00 +PKER_SWETH( 30, 39) = 0.158815E+00 +PKER_SWETH( 30, 40) = 0.138868E+00 +PKER_SWETH( 30, 41) = 0.120024E+00 +PKER_SWETH( 30, 42) = 0.102388E+00 +PKER_SWETH( 30, 43) = 0.861144E-01 +PKER_SWETH( 30, 44) = 0.714080E-01 +PKER_SWETH( 30, 45) = 0.585069E-01 +PKER_SWETH( 30, 46) = 0.476515E-01 +PKER_SWETH( 30, 47) = 0.390335E-01 +PKER_SWETH( 30, 48) = 0.327743E-01 +PKER_SWETH( 30, 49) = 0.288723E-01 +PKER_SWETH( 30, 50) = 0.271805E-01 +PKER_SWETH( 30, 51) = 0.274431E-01 +PKER_SWETH( 30, 52) = 0.293182E-01 +PKER_SWETH( 30, 53) = 0.324139E-01 +PKER_SWETH( 30, 54) = 0.363508E-01 +PKER_SWETH( 30, 55) = 0.408047E-01 +PKER_SWETH( 30, 56) = 0.455006E-01 +PKER_SWETH( 30, 57) = 0.502456E-01 +PKER_SWETH( 30, 58) = 0.549025E-01 +PKER_SWETH( 30, 59) = 0.593913E-01 +PKER_SWETH( 30, 60) = 0.636662E-01 +PKER_SWETH( 30, 61) = 0.677085E-01 +PKER_SWETH( 30, 62) = 0.715153E-01 +PKER_SWETH( 30, 63) = 0.750918E-01 +PKER_SWETH( 30, 64) = 0.784481E-01 +PKER_SWETH( 30, 65) = 0.815963E-01 +PKER_SWETH( 30, 66) = 0.845489E-01 +PKER_SWETH( 30, 67) = 0.873181E-01 +PKER_SWETH( 30, 68) = 0.899158E-01 +PKER_SWETH( 30, 69) = 0.923528E-01 +PKER_SWETH( 30, 70) = 0.946394E-01 +PKER_SWETH( 30, 71) = 0.967852E-01 +PKER_SWETH( 30, 72) = 0.987990E-01 +PKER_SWETH( 30, 73) = 0.100689E+00 +PKER_SWETH( 30, 74) = 0.102463E+00 +PKER_SWETH( 30, 75) = 0.104129E+00 +PKER_SWETH( 30, 76) = 0.105692E+00 +PKER_SWETH( 30, 77) = 0.107160E+00 +PKER_SWETH( 30, 78) = 0.108538E+00 +PKER_SWETH( 30, 79) = 0.109832E+00 +PKER_SWETH( 30, 80) = 0.111046E+00 +PKER_SWETH( 31, 1) = 0.305841E+01 +PKER_SWETH( 31, 2) = 0.286590E+01 +PKER_SWETH( 31, 3) = 0.268513E+01 +PKER_SWETH( 31, 4) = 0.251539E+01 +PKER_SWETH( 31, 5) = 0.235600E+01 +PKER_SWETH( 31, 6) = 0.220634E+01 +PKER_SWETH( 31, 7) = 0.206581E+01 +PKER_SWETH( 31, 8) = 0.193385E+01 +PKER_SWETH( 31, 9) = 0.180994E+01 +PKER_SWETH( 31, 10) = 0.169358E+01 +PKER_SWETH( 31, 11) = 0.158433E+01 +PKER_SWETH( 31, 12) = 0.148173E+01 +PKER_SWETH( 31, 13) = 0.138539E+01 +PKER_SWETH( 31, 14) = 0.129492E+01 +PKER_SWETH( 31, 15) = 0.120997E+01 +PKER_SWETH( 31, 16) = 0.113019E+01 +PKER_SWETH( 31, 17) = 0.105527E+01 +PKER_SWETH( 31, 18) = 0.984906E+00 +PKER_SWETH( 31, 19) = 0.918822E+00 +PKER_SWETH( 31, 20) = 0.856754E+00 +PKER_SWETH( 31, 21) = 0.798451E+00 +PKER_SWETH( 31, 22) = 0.743681E+00 +PKER_SWETH( 31, 23) = 0.692223E+00 +PKER_SWETH( 31, 24) = 0.643870E+00 +PKER_SWETH( 31, 25) = 0.598424E+00 +PKER_SWETH( 31, 26) = 0.555700E+00 +PKER_SWETH( 31, 27) = 0.515521E+00 +PKER_SWETH( 31, 28) = 0.477722E+00 +PKER_SWETH( 31, 29) = 0.442141E+00 +PKER_SWETH( 31, 30) = 0.408628E+00 +PKER_SWETH( 31, 31) = 0.377036E+00 +PKER_SWETH( 31, 32) = 0.347228E+00 +PKER_SWETH( 31, 33) = 0.319067E+00 +PKER_SWETH( 31, 34) = 0.292428E+00 +PKER_SWETH( 31, 35) = 0.267187E+00 +PKER_SWETH( 31, 36) = 0.243232E+00 +PKER_SWETH( 31, 37) = 0.220461E+00 +PKER_SWETH( 31, 38) = 0.198785E+00 +PKER_SWETH( 31, 39) = 0.178137E+00 +PKER_SWETH( 31, 40) = 0.158477E+00 +PKER_SWETH( 31, 41) = 0.139795E+00 +PKER_SWETH( 31, 42) = 0.122116E+00 +PKER_SWETH( 31, 43) = 0.105498E+00 +PKER_SWETH( 31, 44) = 0.900345E-01 +PKER_SWETH( 31, 45) = 0.758410E-01 +PKER_SWETH( 31, 46) = 0.630589E-01 +PKER_SWETH( 31, 47) = 0.518477E-01 +PKER_SWETH( 31, 48) = 0.423630E-01 +PKER_SWETH( 31, 49) = 0.347372E-01 +PKER_SWETH( 31, 50) = 0.290641E-01 +PKER_SWETH( 31, 51) = 0.253414E-01 +PKER_SWETH( 31, 52) = 0.234859E-01 +PKER_SWETH( 31, 53) = 0.233114E-01 +PKER_SWETH( 31, 54) = 0.245489E-01 +PKER_SWETH( 31, 55) = 0.269042E-01 +PKER_SWETH( 31, 56) = 0.300674E-01 +PKER_SWETH( 31, 57) = 0.337384E-01 +PKER_SWETH( 31, 58) = 0.376964E-01 +PKER_SWETH( 31, 59) = 0.417445E-01 +PKER_SWETH( 31, 60) = 0.457577E-01 +PKER_SWETH( 31, 61) = 0.496524E-01 +PKER_SWETH( 31, 62) = 0.533798E-01 +PKER_SWETH( 31, 63) = 0.569162E-01 +PKER_SWETH( 31, 64) = 0.602537E-01 +PKER_SWETH( 31, 65) = 0.633942E-01 +PKER_SWETH( 31, 66) = 0.663443E-01 +PKER_SWETH( 31, 67) = 0.691135E-01 +PKER_SWETH( 31, 68) = 0.717119E-01 +PKER_SWETH( 31, 69) = 0.741499E-01 +PKER_SWETH( 31, 70) = 0.764375E-01 +PKER_SWETH( 31, 71) = 0.785841E-01 +PKER_SWETH( 31, 72) = 0.805986E-01 +PKER_SWETH( 31, 73) = 0.824892E-01 +PKER_SWETH( 31, 74) = 0.842638E-01 +PKER_SWETH( 31, 75) = 0.859296E-01 +PKER_SWETH( 31, 76) = 0.874932E-01 +PKER_SWETH( 31, 77) = 0.889612E-01 +PKER_SWETH( 31, 78) = 0.903393E-01 +PKER_SWETH( 31, 79) = 0.916331E-01 +PKER_SWETH( 31, 80) = 0.928478E-01 +PKER_SWETH( 32, 1) = 0.307198E+01 +PKER_SWETH( 32, 2) = 0.287947E+01 +PKER_SWETH( 32, 3) = 0.269870E+01 +PKER_SWETH( 32, 4) = 0.252896E+01 +PKER_SWETH( 32, 5) = 0.236957E+01 +PKER_SWETH( 32, 6) = 0.221991E+01 +PKER_SWETH( 32, 7) = 0.207938E+01 +PKER_SWETH( 32, 8) = 0.194742E+01 +PKER_SWETH( 32, 9) = 0.182351E+01 +PKER_SWETH( 32, 10) = 0.170716E+01 +PKER_SWETH( 32, 11) = 0.159791E+01 +PKER_SWETH( 32, 12) = 0.149532E+01 +PKER_SWETH( 32, 13) = 0.139899E+01 +PKER_SWETH( 32, 14) = 0.130853E+01 +PKER_SWETH( 32, 15) = 0.122358E+01 +PKER_SWETH( 32, 16) = 0.114381E+01 +PKER_SWETH( 32, 17) = 0.106890E+01 +PKER_SWETH( 32, 18) = 0.998547E+00 +PKER_SWETH( 32, 19) = 0.932479E+00 +PKER_SWETH( 32, 20) = 0.870428E+00 +PKER_SWETH( 32, 21) = 0.812147E+00 +PKER_SWETH( 32, 22) = 0.757404E+00 +PKER_SWETH( 32, 23) = 0.705977E+00 +PKER_SWETH( 32, 24) = 0.657662E+00 +PKER_SWETH( 32, 25) = 0.612261E+00 +PKER_SWETH( 32, 26) = 0.569591E+00 +PKER_SWETH( 32, 27) = 0.529478E+00 +PKER_SWETH( 32, 28) = 0.491757E+00 +PKER_SWETH( 32, 29) = 0.456270E+00 +PKER_SWETH( 32, 30) = 0.422869E+00 +PKER_SWETH( 32, 31) = 0.391411E+00 +PKER_SWETH( 32, 32) = 0.361760E+00 +PKER_SWETH( 32, 33) = 0.333785E+00 +PKER_SWETH( 32, 34) = 0.307363E+00 +PKER_SWETH( 32, 35) = 0.282372E+00 +PKER_SWETH( 32, 36) = 0.258701E+00 +PKER_SWETH( 32, 37) = 0.236242E+00 +PKER_SWETH( 32, 38) = 0.214902E+00 +PKER_SWETH( 32, 39) = 0.194597E+00 +PKER_SWETH( 32, 40) = 0.175263E+00 +PKER_SWETH( 32, 41) = 0.156861E+00 +PKER_SWETH( 32, 42) = 0.139376E+00 +PKER_SWETH( 32, 43) = 0.122822E+00 +PKER_SWETH( 32, 44) = 0.107235E+00 +PKER_SWETH( 32, 45) = 0.926714E-01 +PKER_SWETH( 32, 46) = 0.791985E-01 +PKER_SWETH( 32, 47) = 0.668908E-01 +PKER_SWETH( 32, 48) = 0.558298E-01 +PKER_SWETH( 32, 49) = 0.461095E-01 +PKER_SWETH( 32, 50) = 0.378288E-01 +PKER_SWETH( 32, 51) = 0.310726E-01 +PKER_SWETH( 32, 52) = 0.259224E-01 +PKER_SWETH( 32, 53) = 0.223881E-01 +PKER_SWETH( 32, 54) = 0.204125E-01 +PKER_SWETH( 32, 55) = 0.198855E-01 +PKER_SWETH( 32, 56) = 0.206112E-01 +PKER_SWETH( 32, 57) = 0.223423E-01 +PKER_SWETH( 32, 58) = 0.248393E-01 +PKER_SWETH( 32, 59) = 0.278564E-01 +PKER_SWETH( 32, 60) = 0.311658E-01 +PKER_SWETH( 32, 61) = 0.346111E-01 +PKER_SWETH( 32, 62) = 0.380645E-01 +PKER_SWETH( 32, 63) = 0.414420E-01 +PKER_SWETH( 32, 64) = 0.446910E-01 +PKER_SWETH( 32, 65) = 0.477849E-01 +PKER_SWETH( 32, 66) = 0.507120E-01 +PKER_SWETH( 32, 67) = 0.534705E-01 +PKER_SWETH( 32, 68) = 0.560645E-01 +PKER_SWETH( 32, 69) = 0.585012E-01 +PKER_SWETH( 32, 70) = 0.607887E-01 +PKER_SWETH( 32, 71) = 0.629357E-01 +PKER_SWETH( 32, 72) = 0.649507E-01 +PKER_SWETH( 32, 73) = 0.668419E-01 +PKER_SWETH( 32, 74) = 0.686169E-01 +PKER_SWETH( 32, 75) = 0.702830E-01 +PKER_SWETH( 32, 76) = 0.718470E-01 +PKER_SWETH( 32, 77) = 0.733151E-01 +PKER_SWETH( 32, 78) = 0.746934E-01 +PKER_SWETH( 32, 79) = 0.759873E-01 +PKER_SWETH( 32, 80) = 0.772022E-01 +PKER_SWETH( 33, 1) = 0.308365E+01 +PKER_SWETH( 33, 2) = 0.289113E+01 +PKER_SWETH( 33, 3) = 0.271036E+01 +PKER_SWETH( 33, 4) = 0.254062E+01 +PKER_SWETH( 33, 5) = 0.238124E+01 +PKER_SWETH( 33, 6) = 0.223158E+01 +PKER_SWETH( 33, 7) = 0.209105E+01 +PKER_SWETH( 33, 8) = 0.195909E+01 +PKER_SWETH( 33, 9) = 0.183519E+01 +PKER_SWETH( 33, 10) = 0.171884E+01 +PKER_SWETH( 33, 11) = 0.160959E+01 +PKER_SWETH( 33, 12) = 0.150700E+01 +PKER_SWETH( 33, 13) = 0.141067E+01 +PKER_SWETH( 33, 14) = 0.132022E+01 +PKER_SWETH( 33, 15) = 0.123527E+01 +PKER_SWETH( 33, 16) = 0.115551E+01 +PKER_SWETH( 33, 17) = 0.108061E+01 +PKER_SWETH( 33, 18) = 0.101027E+01 +PKER_SWETH( 33, 19) = 0.944211E+00 +PKER_SWETH( 33, 20) = 0.882174E+00 +PKER_SWETH( 33, 21) = 0.823911E+00 +PKER_SWETH( 33, 22) = 0.769187E+00 +PKER_SWETH( 33, 23) = 0.717785E+00 +PKER_SWETH( 33, 24) = 0.669498E+00 +PKER_SWETH( 33, 25) = 0.624132E+00 +PKER_SWETH( 33, 26) = 0.581504E+00 +PKER_SWETH( 33, 27) = 0.541441E+00 +PKER_SWETH( 33, 28) = 0.503779E+00 +PKER_SWETH( 33, 29) = 0.468364E+00 +PKER_SWETH( 33, 30) = 0.435048E+00 +PKER_SWETH( 33, 31) = 0.403692E+00 +PKER_SWETH( 33, 32) = 0.374162E+00 +PKER_SWETH( 33, 33) = 0.346331E+00 +PKER_SWETH( 33, 34) = 0.320078E+00 +PKER_SWETH( 33, 35) = 0.295284E+00 +PKER_SWETH( 33, 36) = 0.271839E+00 +PKER_SWETH( 33, 37) = 0.249637E+00 +PKER_SWETH( 33, 38) = 0.228579E+00 +PKER_SWETH( 33, 39) = 0.208576E+00 +PKER_SWETH( 33, 40) = 0.189552E+00 +PKER_SWETH( 33, 41) = 0.171446E+00 +PKER_SWETH( 33, 42) = 0.154219E+00 +PKER_SWETH( 33, 43) = 0.137857E+00 +PKER_SWETH( 33, 44) = 0.122365E+00 +PKER_SWETH( 33, 45) = 0.107772E+00 +PKER_SWETH( 33, 46) = 0.941135E-01 +PKER_SWETH( 33, 47) = 0.814306E-01 +PKER_SWETH( 33, 48) = 0.697596E-01 +PKER_SWETH( 33, 49) = 0.591329E-01 +PKER_SWETH( 33, 50) = 0.495874E-01 +PKER_SWETH( 33, 51) = 0.411680E-01 +PKER_SWETH( 33, 52) = 0.339301E-01 +PKER_SWETH( 33, 53) = 0.279413E-01 +PKER_SWETH( 33, 54) = 0.232585E-01 +PKER_SWETH( 33, 55) = 0.199094E-01 +PKER_SWETH( 33, 56) = 0.178713E-01 +PKER_SWETH( 33, 57) = 0.170702E-01 +PKER_SWETH( 33, 58) = 0.173718E-01 +PKER_SWETH( 33, 59) = 0.185930E-01 +PKER_SWETH( 33, 60) = 0.205264E-01 +PKER_SWETH( 33, 61) = 0.229634E-01 +PKER_SWETH( 33, 62) = 0.257251E-01 +PKER_SWETH( 33, 63) = 0.286451E-01 +PKER_SWETH( 33, 64) = 0.316079E-01 +PKER_SWETH( 33, 65) = 0.345319E-01 +PKER_SWETH( 33, 66) = 0.373616E-01 +PKER_SWETH( 33, 67) = 0.400676E-01 +PKER_SWETH( 33, 68) = 0.426346E-01 +PKER_SWETH( 33, 69) = 0.450580E-01 +PKER_SWETH( 33, 70) = 0.473394E-01 +PKER_SWETH( 33, 71) = 0.494840E-01 +PKER_SWETH( 33, 72) = 0.514983E-01 +PKER_SWETH( 33, 73) = 0.533894E-01 +PKER_SWETH( 33, 74) = 0.551646E-01 +PKER_SWETH( 33, 75) = 0.568310E-01 +PKER_SWETH( 33, 76) = 0.583952E-01 +PKER_SWETH( 33, 77) = 0.598636E-01 +PKER_SWETH( 33, 78) = 0.612421E-01 +PKER_SWETH( 33, 79) = 0.625362E-01 +PKER_SWETH( 33, 80) = 0.637511E-01 +PKER_SWETH( 34, 1) = 0.309367E+01 +PKER_SWETH( 34, 2) = 0.290116E+01 +PKER_SWETH( 34, 3) = 0.272039E+01 +PKER_SWETH( 34, 4) = 0.255065E+01 +PKER_SWETH( 34, 5) = 0.239127E+01 +PKER_SWETH( 34, 6) = 0.224161E+01 +PKER_SWETH( 34, 7) = 0.210108E+01 +PKER_SWETH( 34, 8) = 0.196913E+01 +PKER_SWETH( 34, 9) = 0.184522E+01 +PKER_SWETH( 34, 10) = 0.172888E+01 +PKER_SWETH( 34, 11) = 0.161963E+01 +PKER_SWETH( 34, 12) = 0.151704E+01 +PKER_SWETH( 34, 13) = 0.142072E+01 +PKER_SWETH( 34, 14) = 0.133026E+01 +PKER_SWETH( 34, 15) = 0.124533E+01 +PKER_SWETH( 34, 16) = 0.116557E+01 +PKER_SWETH( 34, 17) = 0.109067E+01 +PKER_SWETH( 34, 18) = 0.102034E+01 +PKER_SWETH( 34, 19) = 0.954292E+00 +PKER_SWETH( 34, 20) = 0.892266E+00 +PKER_SWETH( 34, 21) = 0.834015E+00 +PKER_SWETH( 34, 22) = 0.779307E+00 +PKER_SWETH( 34, 23) = 0.727923E+00 +PKER_SWETH( 34, 24) = 0.679659E+00 +PKER_SWETH( 34, 25) = 0.634319E+00 +PKER_SWETH( 34, 26) = 0.591723E+00 +PKER_SWETH( 34, 27) = 0.551698E+00 +PKER_SWETH( 34, 28) = 0.514082E+00 +PKER_SWETH( 34, 29) = 0.478721E+00 +PKER_SWETH( 34, 30) = 0.445471E+00 +PKER_SWETH( 34, 31) = 0.414193E+00 +PKER_SWETH( 34, 32) = 0.384756E+00 +PKER_SWETH( 34, 33) = 0.357036E+00 +PKER_SWETH( 34, 34) = 0.330913E+00 +PKER_SWETH( 34, 35) = 0.306273E+00 +PKER_SWETH( 34, 36) = 0.283006E+00 +PKER_SWETH( 34, 37) = 0.261009E+00 +PKER_SWETH( 34, 38) = 0.240184E+00 +PKER_SWETH( 34, 39) = 0.220436E+00 +PKER_SWETH( 34, 40) = 0.201685E+00 +PKER_SWETH( 34, 41) = 0.183858E+00 +PKER_SWETH( 34, 42) = 0.166898E+00 +PKER_SWETH( 34, 43) = 0.150769E+00 +PKER_SWETH( 34, 44) = 0.135455E+00 +PKER_SWETH( 34, 45) = 0.120960E+00 +PKER_SWETH( 34, 46) = 0.107304E+00 +PKER_SWETH( 34, 47) = 0.945159E-01 +PKER_SWETH( 34, 48) = 0.826218E-01 +PKER_SWETH( 34, 49) = 0.716384E-01 +PKER_SWETH( 34, 50) = 0.615720E-01 +PKER_SWETH( 34, 51) = 0.524221E-01 +PKER_SWETH( 34, 52) = 0.441914E-01 +PKER_SWETH( 34, 53) = 0.368950E-01 +PKER_SWETH( 34, 54) = 0.305630E-01 +PKER_SWETH( 34, 55) = 0.252431E-01 +PKER_SWETH( 34, 56) = 0.209881E-01 +PKER_SWETH( 34, 57) = 0.178255E-01 +PKER_SWETH( 34, 58) = 0.157648E-01 +PKER_SWETH( 34, 59) = 0.147630E-01 +PKER_SWETH( 34, 60) = 0.147237E-01 +PKER_SWETH( 34, 61) = 0.155170E-01 +PKER_SWETH( 34, 62) = 0.169756E-01 +PKER_SWETH( 34, 63) = 0.189247E-01 +PKER_SWETH( 34, 64) = 0.212006E-01 +PKER_SWETH( 34, 65) = 0.236626E-01 +PKER_SWETH( 34, 66) = 0.261994E-01 +PKER_SWETH( 34, 67) = 0.287254E-01 +PKER_SWETH( 34, 68) = 0.311875E-01 +PKER_SWETH( 34, 69) = 0.335528E-01 +PKER_SWETH( 34, 70) = 0.358031E-01 +PKER_SWETH( 34, 71) = 0.379320E-01 +PKER_SWETH( 34, 72) = 0.399386E-01 +PKER_SWETH( 34, 73) = 0.418263E-01 +PKER_SWETH( 34, 74) = 0.436002E-01 +PKER_SWETH( 34, 75) = 0.452662E-01 +PKER_SWETH( 34, 76) = 0.468304E-01 +PKER_SWETH( 34, 77) = 0.482989E-01 +PKER_SWETH( 34, 78) = 0.496775E-01 +PKER_SWETH( 34, 79) = 0.509718E-01 +PKER_SWETH( 34, 80) = 0.521868E-01 +PKER_SWETH( 35, 1) = 0.310229E+01 +PKER_SWETH( 35, 2) = 0.290978E+01 +PKER_SWETH( 35, 3) = 0.272901E+01 +PKER_SWETH( 35, 4) = 0.255927E+01 +PKER_SWETH( 35, 5) = 0.239989E+01 +PKER_SWETH( 35, 6) = 0.225023E+01 +PKER_SWETH( 35, 7) = 0.210971E+01 +PKER_SWETH( 35, 8) = 0.197775E+01 +PKER_SWETH( 35, 9) = 0.185385E+01 +PKER_SWETH( 35, 10) = 0.173750E+01 +PKER_SWETH( 35, 11) = 0.162826E+01 +PKER_SWETH( 35, 12) = 0.152568E+01 +PKER_SWETH( 35, 13) = 0.142935E+01 +PKER_SWETH( 35, 14) = 0.133890E+01 +PKER_SWETH( 35, 15) = 0.125397E+01 +PKER_SWETH( 35, 16) = 0.117421E+01 +PKER_SWETH( 35, 17) = 0.109932E+01 +PKER_SWETH( 35, 18) = 0.102899E+01 +PKER_SWETH( 35, 19) = 0.962954E+00 +PKER_SWETH( 35, 20) = 0.900936E+00 +PKER_SWETH( 35, 21) = 0.842695E+00 +PKER_SWETH( 35, 22) = 0.787999E+00 +PKER_SWETH( 35, 23) = 0.736630E+00 +PKER_SWETH( 35, 24) = 0.688382E+00 +PKER_SWETH( 35, 25) = 0.643063E+00 +PKER_SWETH( 35, 26) = 0.600491E+00 +PKER_SWETH( 35, 27) = 0.560496E+00 +PKER_SWETH( 35, 28) = 0.522915E+00 +PKER_SWETH( 35, 29) = 0.487596E+00 +PKER_SWETH( 35, 30) = 0.454396E+00 +PKER_SWETH( 35, 31) = 0.423178E+00 +PKER_SWETH( 35, 32) = 0.393812E+00 +PKER_SWETH( 35, 33) = 0.366177E+00 +PKER_SWETH( 35, 34) = 0.340155E+00 +PKER_SWETH( 35, 35) = 0.315634E+00 +PKER_SWETH( 35, 36) = 0.292507E+00 +PKER_SWETH( 35, 37) = 0.270673E+00 +PKER_SWETH( 35, 38) = 0.250034E+00 +PKER_SWETH( 35, 39) = 0.230497E+00 +PKER_SWETH( 35, 40) = 0.211978E+00 +PKER_SWETH( 35, 41) = 0.194397E+00 +PKER_SWETH( 35, 42) = 0.177688E+00 +PKER_SWETH( 35, 43) = 0.161799E+00 +PKER_SWETH( 35, 44) = 0.146695E+00 +PKER_SWETH( 35, 45) = 0.132358E+00 +PKER_SWETH( 35, 46) = 0.118793E+00 +PKER_SWETH( 35, 47) = 0.106016E+00 +PKER_SWETH( 35, 48) = 0.940490E-01 +PKER_SWETH( 35, 49) = 0.829116E-01 +PKER_SWETH( 35, 50) = 0.726109E-01 +PKER_SWETH( 35, 51) = 0.631403E-01 +PKER_SWETH( 35, 52) = 0.544809E-01 +PKER_SWETH( 35, 53) = 0.466098E-01 +PKER_SWETH( 35, 54) = 0.395099E-01 +PKER_SWETH( 35, 55) = 0.331777E-01 +PKER_SWETH( 35, 56) = 0.276290E-01 +PKER_SWETH( 35, 57) = 0.228990E-01 +PKER_SWETH( 35, 58) = 0.190322E-01 +PKER_SWETH( 35, 59) = 0.160626E-01 +PKER_SWETH( 35, 60) = 0.140126E-01 +PKER_SWETH( 35, 61) = 0.128671E-01 +PKER_SWETH( 35, 62) = 0.125631E-01 +PKER_SWETH( 35, 63) = 0.130040E-01 +PKER_SWETH( 35, 64) = 0.140640E-01 +PKER_SWETH( 35, 65) = 0.155956E-01 +PKER_SWETH( 35, 66) = 0.174553E-01 +PKER_SWETH( 35, 67) = 0.195193E-01 +PKER_SWETH( 35, 68) = 0.216784E-01 +PKER_SWETH( 35, 69) = 0.238555E-01 +PKER_SWETH( 35, 70) = 0.259938E-01 +PKER_SWETH( 35, 71) = 0.280589E-01 +PKER_SWETH( 35, 72) = 0.300308E-01 +PKER_SWETH( 35, 73) = 0.319003E-01 +PKER_SWETH( 35, 74) = 0.336651E-01 +PKER_SWETH( 35, 75) = 0.353268E-01 +PKER_SWETH( 35, 76) = 0.368892E-01 +PKER_SWETH( 35, 77) = 0.383569E-01 +PKER_SWETH( 35, 78) = 0.397353E-01 +PKER_SWETH( 35, 79) = 0.410295E-01 +PKER_SWETH( 35, 80) = 0.422447E-01 +PKER_SWETH( 36, 1) = 0.310970E+01 +PKER_SWETH( 36, 2) = 0.291719E+01 +PKER_SWETH( 36, 3) = 0.273642E+01 +PKER_SWETH( 36, 4) = 0.256668E+01 +PKER_SWETH( 36, 5) = 0.240730E+01 +PKER_SWETH( 36, 6) = 0.225765E+01 +PKER_SWETH( 36, 7) = 0.211712E+01 +PKER_SWETH( 36, 8) = 0.198517E+01 +PKER_SWETH( 36, 9) = 0.186126E+01 +PKER_SWETH( 36, 10) = 0.174492E+01 +PKER_SWETH( 36, 11) = 0.163568E+01 +PKER_SWETH( 36, 12) = 0.153310E+01 +PKER_SWETH( 36, 13) = 0.143677E+01 +PKER_SWETH( 36, 14) = 0.134632E+01 +PKER_SWETH( 36, 15) = 0.126139E+01 +PKER_SWETH( 36, 16) = 0.118164E+01 +PKER_SWETH( 36, 17) = 0.110675E+01 +PKER_SWETH( 36, 18) = 0.103643E+01 +PKER_SWETH( 36, 19) = 0.970397E+00 +PKER_SWETH( 36, 20) = 0.908386E+00 +PKER_SWETH( 36, 21) = 0.850153E+00 +PKER_SWETH( 36, 22) = 0.795466E+00 +PKER_SWETH( 36, 23) = 0.744108E+00 +PKER_SWETH( 36, 24) = 0.695873E+00 +PKER_SWETH( 36, 25) = 0.650570E+00 +PKER_SWETH( 36, 26) = 0.608017E+00 +PKER_SWETH( 36, 27) = 0.568044E+00 +PKER_SWETH( 36, 28) = 0.530490E+00 +PKER_SWETH( 36, 29) = 0.495203E+00 +PKER_SWETH( 36, 30) = 0.462042E+00 +PKER_SWETH( 36, 31) = 0.430869E+00 +PKER_SWETH( 36, 32) = 0.401559E+00 +PKER_SWETH( 36, 33) = 0.373989E+00 +PKER_SWETH( 36, 34) = 0.348045E+00 +PKER_SWETH( 36, 35) = 0.323616E+00 +PKER_SWETH( 36, 36) = 0.300599E+00 +PKER_SWETH( 36, 37) = 0.278892E+00 +PKER_SWETH( 36, 38) = 0.258401E+00 +PKER_SWETH( 36, 39) = 0.239034E+00 +PKER_SWETH( 36, 40) = 0.220706E+00 +PKER_SWETH( 36, 41) = 0.203335E+00 +PKER_SWETH( 36, 42) = 0.186850E+00 +PKER_SWETH( 36, 43) = 0.171188E+00 +PKER_SWETH( 36, 44) = 0.156300E+00 +PKER_SWETH( 36, 45) = 0.142151E+00 +PKER_SWETH( 36, 46) = 0.128727E+00 +PKER_SWETH( 36, 47) = 0.116029E+00 +PKER_SWETH( 36, 48) = 0.104072E+00 +PKER_SWETH( 36, 49) = 0.928735E-01 +PKER_SWETH( 36, 50) = 0.824495E-01 +PKER_SWETH( 36, 51) = 0.728026E-01 +PKER_SWETH( 36, 52) = 0.639198E-01 +PKER_SWETH( 36, 53) = 0.557752E-01 +PKER_SWETH( 36, 54) = 0.483333E-01 +PKER_SWETH( 36, 55) = 0.415587E-01 +PKER_SWETH( 36, 56) = 0.354254E-01 +PKER_SWETH( 36, 57) = 0.299195E-01 +PKER_SWETH( 36, 58) = 0.250483E-01 +PKER_SWETH( 36, 59) = 0.208397E-01 +PKER_SWETH( 36, 60) = 0.173299E-01 +PKER_SWETH( 36, 61) = 0.145557E-01 +PKER_SWETH( 36, 62) = 0.125495E-01 +PKER_SWETH( 36, 63) = 0.113080E-01 +PKER_SWETH( 36, 64) = 0.108016E-01 +PKER_SWETH( 36, 65) = 0.109613E-01 +PKER_SWETH( 36, 66) = 0.116849E-01 +PKER_SWETH( 36, 67) = 0.128598E-01 +PKER_SWETH( 36, 68) = 0.143640E-01 +PKER_SWETH( 36, 69) = 0.160768E-01 +PKER_SWETH( 36, 70) = 0.179090E-01 +PKER_SWETH( 36, 71) = 0.197779E-01 +PKER_SWETH( 36, 72) = 0.216309E-01 +PKER_SWETH( 36, 73) = 0.234315E-01 +PKER_SWETH( 36, 74) = 0.251579E-01 +PKER_SWETH( 36, 75) = 0.267991E-01 +PKER_SWETH( 36, 76) = 0.283509E-01 +PKER_SWETH( 36, 77) = 0.298135E-01 +PKER_SWETH( 36, 78) = 0.311895E-01 +PKER_SWETH( 36, 79) = 0.324827E-01 +PKER_SWETH( 36, 80) = 0.336974E-01 +PKER_SWETH( 37, 1) = 0.311608E+01 +PKER_SWETH( 37, 2) = 0.292356E+01 +PKER_SWETH( 37, 3) = 0.274280E+01 +PKER_SWETH( 37, 4) = 0.257306E+01 +PKER_SWETH( 37, 5) = 0.241368E+01 +PKER_SWETH( 37, 6) = 0.226402E+01 +PKER_SWETH( 37, 7) = 0.212349E+01 +PKER_SWETH( 37, 8) = 0.199154E+01 +PKER_SWETH( 37, 9) = 0.186764E+01 +PKER_SWETH( 37, 10) = 0.175130E+01 +PKER_SWETH( 37, 11) = 0.164205E+01 +PKER_SWETH( 37, 12) = 0.153947E+01 +PKER_SWETH( 37, 13) = 0.144315E+01 +PKER_SWETH( 37, 14) = 0.135271E+01 +PKER_SWETH( 37, 15) = 0.126778E+01 +PKER_SWETH( 37, 16) = 0.118803E+01 +PKER_SWETH( 37, 17) = 0.111314E+01 +PKER_SWETH( 37, 18) = 0.104282E+01 +PKER_SWETH( 37, 19) = 0.976794E+00 +PKER_SWETH( 37, 20) = 0.914788E+00 +PKER_SWETH( 37, 21) = 0.856560E+00 +PKER_SWETH( 37, 22) = 0.801881E+00 +PKER_SWETH( 37, 23) = 0.750531E+00 +PKER_SWETH( 37, 24) = 0.702307E+00 +PKER_SWETH( 37, 25) = 0.657016E+00 +PKER_SWETH( 37, 26) = 0.614477E+00 +PKER_SWETH( 37, 27) = 0.574521E+00 +PKER_SWETH( 37, 28) = 0.536988E+00 +PKER_SWETH( 37, 29) = 0.501726E+00 +PKER_SWETH( 37, 30) = 0.468594E+00 +PKER_SWETH( 37, 31) = 0.437458E+00 +PKER_SWETH( 37, 32) = 0.408190E+00 +PKER_SWETH( 37, 33) = 0.380671E+00 +PKER_SWETH( 37, 34) = 0.354786E+00 +PKER_SWETH( 37, 35) = 0.330429E+00 +PKER_SWETH( 37, 36) = 0.307496E+00 +PKER_SWETH( 37, 37) = 0.285889E+00 +PKER_SWETH( 37, 38) = 0.265514E+00 +PKER_SWETH( 37, 39) = 0.246283E+00 +PKER_SWETH( 37, 40) = 0.228109E+00 +PKER_SWETH( 37, 41) = 0.210913E+00 +PKER_SWETH( 37, 42) = 0.194619E+00 +PKER_SWETH( 37, 43) = 0.179160E+00 +PKER_SWETH( 37, 44) = 0.164477E+00 +PKER_SWETH( 37, 45) = 0.150523E+00 +PKER_SWETH( 37, 46) = 0.137268E+00 +PKER_SWETH( 37, 47) = 0.124695E+00 +PKER_SWETH( 37, 48) = 0.112806E+00 +PKER_SWETH( 37, 49) = 0.101613E+00 +PKER_SWETH( 37, 50) = 0.911322E-01 +PKER_SWETH( 37, 51) = 0.813759E-01 +PKER_SWETH( 37, 52) = 0.723446E-01 +PKER_SWETH( 37, 53) = 0.640238E-01 +PKER_SWETH( 37, 54) = 0.563838E-01 +PKER_SWETH( 37, 55) = 0.493857E-01 +PKER_SWETH( 37, 56) = 0.429865E-01 +PKER_SWETH( 37, 57) = 0.371471E-01 +PKER_SWETH( 37, 58) = 0.318367E-01 +PKER_SWETH( 37, 59) = 0.270401E-01 +PKER_SWETH( 37, 60) = 0.227582E-01 +PKER_SWETH( 37, 61) = 0.190115E-01 +PKER_SWETH( 37, 62) = 0.158324E-01 +PKER_SWETH( 37, 63) = 0.132541E-01 +PKER_SWETH( 37, 64) = 0.113154E-01 +PKER_SWETH( 37, 65) = 0.100251E-01 +PKER_SWETH( 37, 66) = 0.936563E-02 +PKER_SWETH( 37, 67) = 0.929977E-02 +PKER_SWETH( 37, 68) = 0.975168E-02 +PKER_SWETH( 37, 69) = 0.106226E-01 +PKER_SWETH( 37, 70) = 0.118165E-01 +PKER_SWETH( 37, 71) = 0.132315E-01 +PKER_SWETH( 37, 72) = 0.147715E-01 +PKER_SWETH( 37, 73) = 0.163699E-01 +PKER_SWETH( 37, 74) = 0.179714E-01 +PKER_SWETH( 37, 75) = 0.195388E-01 +PKER_SWETH( 37, 76) = 0.210485E-01 +PKER_SWETH( 37, 77) = 0.224882E-01 +PKER_SWETH( 37, 78) = 0.238523E-01 +PKER_SWETH( 37, 79) = 0.251394E-01 +PKER_SWETH( 37, 80) = 0.263512E-01 +PKER_SWETH( 38, 1) = 0.312155E+01 +PKER_SWETH( 38, 2) = 0.292904E+01 +PKER_SWETH( 38, 3) = 0.274827E+01 +PKER_SWETH( 38, 4) = 0.257854E+01 +PKER_SWETH( 38, 5) = 0.241915E+01 +PKER_SWETH( 38, 6) = 0.226950E+01 +PKER_SWETH( 38, 7) = 0.212897E+01 +PKER_SWETH( 38, 8) = 0.199702E+01 +PKER_SWETH( 38, 9) = 0.187312E+01 +PKER_SWETH( 38, 10) = 0.175678E+01 +PKER_SWETH( 38, 11) = 0.164753E+01 +PKER_SWETH( 38, 12) = 0.154496E+01 +PKER_SWETH( 38, 13) = 0.144864E+01 +PKER_SWETH( 38, 14) = 0.135819E+01 +PKER_SWETH( 38, 15) = 0.127326E+01 +PKER_SWETH( 38, 16) = 0.119352E+01 +PKER_SWETH( 38, 17) = 0.111863E+01 +PKER_SWETH( 38, 18) = 0.104832E+01 +PKER_SWETH( 38, 19) = 0.982291E+00 +PKER_SWETH( 38, 20) = 0.920289E+00 +PKER_SWETH( 38, 21) = 0.862066E+00 +PKER_SWETH( 38, 22) = 0.807392E+00 +PKER_SWETH( 38, 23) = 0.756049E+00 +PKER_SWETH( 38, 24) = 0.707832E+00 +PKER_SWETH( 38, 25) = 0.662551E+00 +PKER_SWETH( 38, 26) = 0.620024E+00 +PKER_SWETH( 38, 27) = 0.580081E+00 +PKER_SWETH( 38, 28) = 0.542564E+00 +PKER_SWETH( 38, 29) = 0.507322E+00 +PKER_SWETH( 38, 30) = 0.474213E+00 +PKER_SWETH( 38, 31) = 0.443103E+00 +PKER_SWETH( 38, 32) = 0.413868E+00 +PKER_SWETH( 38, 33) = 0.386388E+00 +PKER_SWETH( 38, 34) = 0.360550E+00 +PKER_SWETH( 38, 35) = 0.336248E+00 +PKER_SWETH( 38, 36) = 0.313380E+00 +PKER_SWETH( 38, 37) = 0.291851E+00 +PKER_SWETH( 38, 38) = 0.271567E+00 +PKER_SWETH( 38, 39) = 0.252443E+00 +PKER_SWETH( 38, 40) = 0.234393E+00 +PKER_SWETH( 38, 41) = 0.217338E+00 +PKER_SWETH( 38, 42) = 0.201203E+00 +PKER_SWETH( 38, 43) = 0.185918E+00 +PKER_SWETH( 38, 44) = 0.171419E+00 +PKER_SWETH( 38, 45) = 0.157652E+00 +PKER_SWETH( 38, 46) = 0.144573E+00 +PKER_SWETH( 38, 47) = 0.132151E+00 +PKER_SWETH( 38, 48) = 0.120374E+00 +PKER_SWETH( 38, 49) = 0.109240E+00 +PKER_SWETH( 38, 50) = 0.987594E-01 +PKER_SWETH( 38, 51) = 0.889476E-01 +PKER_SWETH( 38, 52) = 0.798146E-01 +PKER_SWETH( 38, 53) = 0.713596E-01 +PKER_SWETH( 38, 54) = 0.635674E-01 +PKER_SWETH( 38, 55) = 0.564087E-01 +PKER_SWETH( 38, 56) = 0.498437E-01 +PKER_SWETH( 38, 57) = 0.438276E-01 +PKER_SWETH( 38, 58) = 0.383165E-01 +PKER_SWETH( 38, 59) = 0.332715E-01 +PKER_SWETH( 38, 60) = 0.286636E-01 +PKER_SWETH( 38, 61) = 0.244758E-01 +PKER_SWETH( 38, 62) = 0.207079E-01 +PKER_SWETH( 38, 63) = 0.173736E-01 +PKER_SWETH( 38, 64) = 0.144984E-01 +PKER_SWETH( 38, 65) = 0.121181E-01 +PKER_SWETH( 38, 66) = 0.102648E-01 +PKER_SWETH( 38, 67) = 0.895844E-02 +PKER_SWETH( 38, 68) = 0.819655E-02 +PKER_SWETH( 38, 69) = 0.795499E-02 +PKER_SWETH( 38, 70) = 0.818194E-02 +PKER_SWETH( 38, 71) = 0.880268E-02 +PKER_SWETH( 38, 72) = 0.973113E-02 +PKER_SWETH( 38, 73) = 0.108789E-01 +PKER_SWETH( 38, 74) = 0.121690E-01 +PKER_SWETH( 38, 75) = 0.135287E-01 +PKER_SWETH( 38, 76) = 0.149074E-01 +PKER_SWETH( 38, 77) = 0.162683E-01 +PKER_SWETH( 38, 78) = 0.175866E-01 +PKER_SWETH( 38, 79) = 0.188485E-01 +PKER_SWETH( 38, 80) = 0.200469E-01 +PKER_SWETH( 39, 1) = 0.312626E+01 +PKER_SWETH( 39, 2) = 0.293375E+01 +PKER_SWETH( 39, 3) = 0.275298E+01 +PKER_SWETH( 39, 4) = 0.258325E+01 +PKER_SWETH( 39, 5) = 0.242386E+01 +PKER_SWETH( 39, 6) = 0.227421E+01 +PKER_SWETH( 39, 7) = 0.213368E+01 +PKER_SWETH( 39, 8) = 0.200173E+01 +PKER_SWETH( 39, 9) = 0.187783E+01 +PKER_SWETH( 39, 10) = 0.176149E+01 +PKER_SWETH( 39, 11) = 0.165225E+01 +PKER_SWETH( 39, 12) = 0.154967E+01 +PKER_SWETH( 39, 13) = 0.145335E+01 +PKER_SWETH( 39, 14) = 0.136291E+01 +PKER_SWETH( 39, 15) = 0.127798E+01 +PKER_SWETH( 39, 16) = 0.119824E+01 +PKER_SWETH( 39, 17) = 0.112335E+01 +PKER_SWETH( 39, 18) = 0.105304E+01 +PKER_SWETH( 39, 19) = 0.987015E+00 +PKER_SWETH( 39, 20) = 0.925016E+00 +PKER_SWETH( 39, 21) = 0.866797E+00 +PKER_SWETH( 39, 22) = 0.812128E+00 +PKER_SWETH( 39, 23) = 0.760790E+00 +PKER_SWETH( 39, 24) = 0.712579E+00 +PKER_SWETH( 39, 25) = 0.667305E+00 +PKER_SWETH( 39, 26) = 0.624787E+00 +PKER_SWETH( 39, 27) = 0.584855E+00 +PKER_SWETH( 39, 28) = 0.547350E+00 +PKER_SWETH( 39, 29) = 0.512122E+00 +PKER_SWETH( 39, 30) = 0.479031E+00 +PKER_SWETH( 39, 31) = 0.447943E+00 +PKER_SWETH( 39, 32) = 0.418733E+00 +PKER_SWETH( 39, 33) = 0.391283E+00 +PKER_SWETH( 39, 34) = 0.365481E+00 +PKER_SWETH( 39, 35) = 0.341221E+00 +PKER_SWETH( 39, 36) = 0.318405E+00 +PKER_SWETH( 39, 37) = 0.296935E+00 +PKER_SWETH( 39, 38) = 0.276723E+00 +PKER_SWETH( 39, 39) = 0.257682E+00 +PKER_SWETH( 39, 40) = 0.239730E+00 +PKER_SWETH( 39, 41) = 0.222789E+00 +PKER_SWETH( 39, 42) = 0.206783E+00 +PKER_SWETH( 39, 43) = 0.191643E+00 +PKER_SWETH( 39, 44) = 0.177303E+00 +PKER_SWETH( 39, 45) = 0.163704E+00 +PKER_SWETH( 39, 46) = 0.150794E+00 +PKER_SWETH( 39, 47) = 0.138532E+00 +PKER_SWETH( 39, 48) = 0.126891E+00 +PKER_SWETH( 39, 49) = 0.115856E+00 +PKER_SWETH( 39, 50) = 0.105427E+00 +PKER_SWETH( 39, 51) = 0.956115E-01 +PKER_SWETH( 39, 52) = 0.864237E-01 +PKER_SWETH( 39, 53) = 0.778719E-01 +PKER_SWETH( 39, 54) = 0.699550E-01 +PKER_SWETH( 39, 55) = 0.626577E-01 +PKER_SWETH( 39, 56) = 0.559517E-01 +PKER_SWETH( 39, 57) = 0.497985E-01 +PKER_SWETH( 39, 58) = 0.441542E-01 +PKER_SWETH( 39, 59) = 0.389738E-01 +PKER_SWETH( 39, 60) = 0.342166E-01 +PKER_SWETH( 39, 61) = 0.298469E-01 +PKER_SWETH( 39, 62) = 0.258389E-01 +PKER_SWETH( 39, 63) = 0.221768E-01 +PKER_SWETH( 39, 64) = 0.188576E-01 +PKER_SWETH( 39, 65) = 0.158916E-01 +PKER_SWETH( 39, 66) = 0.132994E-01 +PKER_SWETH( 39, 67) = 0.111114E-01 +PKER_SWETH( 39, 68) = 0.936006E-02 +PKER_SWETH( 39, 69) = 0.806501E-02 +PKER_SWETH( 39, 70) = 0.723816E-02 +PKER_SWETH( 39, 71) = 0.686650E-02 +PKER_SWETH( 39, 72) = 0.691235E-02 +PKER_SWETH( 39, 73) = 0.732242E-02 +PKER_SWETH( 39, 74) = 0.802562E-02 +PKER_SWETH( 39, 75) = 0.894621E-02 +PKER_SWETH( 39, 76) = 0.100126E-01 +PKER_SWETH( 39, 77) = 0.111624E-01 +PKER_SWETH( 39, 78) = 0.123458E-01 +PKER_SWETH( 39, 79) = 0.135242E-01 +PKER_SWETH( 39, 80) = 0.146735E-01 +PKER_SWETH( 40, 1) = 0.313031E+01 +PKER_SWETH( 40, 2) = 0.293780E+01 +PKER_SWETH( 40, 3) = 0.275703E+01 +PKER_SWETH( 40, 4) = 0.258729E+01 +PKER_SWETH( 40, 5) = 0.242791E+01 +PKER_SWETH( 40, 6) = 0.227826E+01 +PKER_SWETH( 40, 7) = 0.213773E+01 +PKER_SWETH( 40, 8) = 0.200578E+01 +PKER_SWETH( 40, 9) = 0.188188E+01 +PKER_SWETH( 40, 10) = 0.176554E+01 +PKER_SWETH( 40, 11) = 0.165630E+01 +PKER_SWETH( 40, 12) = 0.155372E+01 +PKER_SWETH( 40, 13) = 0.145740E+01 +PKER_SWETH( 40, 14) = 0.136696E+01 +PKER_SWETH( 40, 15) = 0.128203E+01 +PKER_SWETH( 40, 16) = 0.120229E+01 +PKER_SWETH( 40, 17) = 0.112741E+01 +PKER_SWETH( 40, 18) = 0.105710E+01 +PKER_SWETH( 40, 19) = 0.991076E+00 +PKER_SWETH( 40, 20) = 0.929079E+00 +PKER_SWETH( 40, 21) = 0.870863E+00 +PKER_SWETH( 40, 22) = 0.816197E+00 +PKER_SWETH( 40, 23) = 0.764863E+00 +PKER_SWETH( 40, 24) = 0.716657E+00 +PKER_SWETH( 40, 25) = 0.671389E+00 +PKER_SWETH( 40, 26) = 0.628877E+00 +PKER_SWETH( 40, 27) = 0.588953E+00 +PKER_SWETH( 40, 28) = 0.551458E+00 +PKER_SWETH( 40, 29) = 0.516242E+00 +PKER_SWETH( 40, 30) = 0.483165E+00 +PKER_SWETH( 40, 31) = 0.452093E+00 +PKER_SWETH( 40, 32) = 0.422902E+00 +PKER_SWETH( 40, 33) = 0.395476E+00 +PKER_SWETH( 40, 34) = 0.369701E+00 +PKER_SWETH( 40, 35) = 0.345475E+00 +PKER_SWETH( 40, 36) = 0.322698E+00 +PKER_SWETH( 40, 37) = 0.301275E+00 +PKER_SWETH( 40, 38) = 0.281119E+00 +PKER_SWETH( 40, 39) = 0.262143E+00 +PKER_SWETH( 40, 40) = 0.244268E+00 +PKER_SWETH( 40, 41) = 0.227416E+00 +PKER_SWETH( 40, 42) = 0.211515E+00 +PKER_SWETH( 40, 43) = 0.196493E+00 +PKER_SWETH( 40, 44) = 0.182286E+00 +PKER_SWETH( 40, 45) = 0.168832E+00 +PKER_SWETH( 40, 46) = 0.156075E+00 +PKER_SWETH( 40, 47) = 0.143968E+00 +PKER_SWETH( 40, 48) = 0.132471E+00 +PKER_SWETH( 40, 49) = 0.121560E+00 +PKER_SWETH( 40, 50) = 0.111219E+00 +PKER_SWETH( 40, 51) = 0.101447E+00 +PKER_SWETH( 40, 52) = 0.922530E-01 +PKER_SWETH( 40, 53) = 0.836474E-01 +PKER_SWETH( 40, 54) = 0.756380E-01 +PKER_SWETH( 40, 55) = 0.682230E-01 +PKER_SWETH( 40, 56) = 0.613879E-01 +PKER_SWETH( 40, 57) = 0.551058E-01 +PKER_SWETH( 40, 58) = 0.493398E-01 +PKER_SWETH( 40, 59) = 0.440480E-01 +PKER_SWETH( 40, 60) = 0.391874E-01 +PKER_SWETH( 40, 61) = 0.347167E-01 +PKER_SWETH( 40, 62) = 0.305992E-01 +PKER_SWETH( 40, 63) = 0.268049E-01 +PKER_SWETH( 40, 64) = 0.233110E-01 +PKER_SWETH( 40, 65) = 0.201033E-01 +PKER_SWETH( 40, 66) = 0.171779E-01 +PKER_SWETH( 40, 67) = 0.145412E-01 +PKER_SWETH( 40, 68) = 0.122100E-01 +PKER_SWETH( 40, 69) = 0.102095E-01 +PKER_SWETH( 40, 70) = 0.856828E-02 +PKER_SWETH( 40, 71) = 0.730855E-02 +PKER_SWETH( 40, 72) = 0.644644E-02 +PKER_SWETH( 40, 73) = 0.598027E-02 +PKER_SWETH( 40, 74) = 0.588539E-02 +PKER_SWETH( 40, 75) = 0.612142E-02 +PKER_SWETH( 40, 76) = 0.663468E-02 +PKER_SWETH( 40, 77) = 0.735968E-02 +PKER_SWETH( 40, 78) = 0.823287E-02 +PKER_SWETH( 40, 79) = 0.919883E-02 +PKER_SWETH( 40, 80) = 0.102081E-01 +END IF +! +END SUBROUTINE LIMA_READ_XKER_SWETH diff --git a/src/mesonh/micro/lima_sedimentation.f90 b/src/mesonh/micro/lima_sedimentation.f90 new file mode 100644 index 000000000..365ae0f23 --- /dev/null +++ b/src/mesonh/micro/lima_sedimentation.f90 @@ -0,0 +1,244 @@ +!MNH_LIC Copyright 2018-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ################################### + MODULE MODI_LIMA_SEDIMENTATION +! ################################### +! +INTERFACE + SUBROUTINE LIMA_SEDIMENTATION (KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB, KKTE, KKT, KKL, & + HPHASE, KMOMENTS, KID, KSPLITG, PTSTEP, PDZZ, PRHODREF, & + PPABST, PT, PRT_SUM, PCPT, PRS, PCS, PINPR ) +! +INTEGER, INTENT(IN) :: KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB, KKTE, KKT, KKL +CHARACTER(1), INTENT(IN) :: HPHASE ! Liquid or solid hydrometeors +INTEGER, INTENT(IN) :: KMOMENTS ! Number of moments +INTEGER, INTENT(IN) :: KID ! Hydrometeor ID +INTEGER, INTENT(IN) :: KSPLITG ! +REAL, INTENT(IN) :: PTSTEP ! Time step +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! Height (z) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PT ! Temperature +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRT_SUM ! total water mixing ratio +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCPT ! Cp +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRS ! m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCS ! C. source +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPR ! Instant precip rate +! +END SUBROUTINE LIMA_SEDIMENTATION +END INTERFACE +END MODULE MODI_LIMA_SEDIMENTATION +! +! +! ###################################################################### + SUBROUTINE LIMA_SEDIMENTATION (KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB, KKTE, KKT, KKL, & + HPHASE, KMOMENTS, KID, KSPLITG, PTSTEP, PDZZ, PRHODREF, & + PPABST, PT, PRT_SUM, PCPT, PRS, PCS, PINPR ) +! ###################################################################### +! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the sedimentation of any hydrometeor, +!! also accounting for the transport of heat +!! +!! METHOD +!! ------ +!! The sedimentation rates are computed with a time spliting technique: +!! an upstream scheme, written as a difference of non-advective fluxes. +!! This source term is added to the next coming time step (split-implicit +!! process). +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * CNRM * +!! +!! MODIFICATIONS +!! ------------- +!! Original 15/03/2018 +!! +!! B.Vie 02/2019 Desactivate (comment) the heat transport by droplets +! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 +! B. Vie 03/2020: disable temperature change of droplets by air temperature +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST, ONLY: XRHOLW, XCL, XCI +USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT +USE MODD_PARAM_LIMA, ONLY: XCEXVT, XRTMIN, XCTMIN, NSPLITSED, & + XLB, XLBEX, XD, XFSEDR, XFSEDC, & + XALPHAC, XNUC +USE MODD_PARAM_LIMA_COLD, ONLY: XLBEXI, XLBI, XDI + +use mode_tools, only: Countjv + +USE MODI_GAMMA, ONLY: GAMMA_X0D +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +INTEGER, INTENT(IN) :: KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB, KKTE, KKT, KKL +CHARACTER(1), INTENT(IN) :: HPHASE ! Liquid or solid hydrometeors +INTEGER, INTENT(IN) :: KMOMENTS ! Number of moments +INTEGER, INTENT(IN) :: KID ! Hydrometeor ID +INTEGER, INTENT(IN) :: KSPLITG ! +REAL, INTENT(IN) :: PTSTEP ! Time step +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! Height (z) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PT ! Temperature +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRT_SUM ! total water mixing ratio +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCPT ! Cp +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRS ! m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCS ! C. source +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPR ! Instant precip rate +! +!* 0.2 Declarations of local variables : +! +INTEGER :: JK, JL, JN ! Loop index +INTEGER :: ISEDIM ! Case number of sedimentation +! +LOGICAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: GSEDIM ! Test where to compute the SED processes +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: ZW, & ! Work array + ZWSEDR, & ! Sedimentation of MMR + ZWSEDC, & ! Sedimentation of number conc. + ZWDT ! Temperature change +! +REAL, DIMENSION(:), ALLOCATABLE & + :: ZRS, & ! m.r. source + ZCS, & ! conc. source + ZRHODREF, & ! RHO Dry REFerence + ZPABST, & ! Pressure + ZT, & ! Temperature + ZZW, & ! Work array + ZZX, & ! Work array + ZZY, & ! Work array + ZLBDA, & ! Slope parameter + ZCC ! Cunningham corrective term for droplets fall speed +! +INTEGER , DIMENSION(SIZE(PRHODREF)) :: I1,I2,I3 ! Indexes for PACK replacement +! +REAL :: ZTSPLITG ! Small time step for rain sedimentation +REAL :: ZC ! Cpl or Cpi +! +! +!------------------------------------------------------------------------------- +! +! Time splitting +! +ZTSPLITG= PTSTEP / REAL(NSPLITSED(KID)) +! +ZWDT=0. +PINPR(:,:) = 0. +! +PRS(:,:,:) = PRS(:,:,:) * PTSTEP +IF (KMOMENTS==2) PCS(:,:,:) = PCS(:,:,:) * PTSTEP +DO JK = KKTB , KKTE + ZW(:,:,JK)=ZTSPLITG/PDZZ(:,:,JK) +END DO +! +IF (HPHASE=='L') ZC=XCL +IF (HPHASE=='I') ZC=XCI +! +! ################################ +! Compute the sedimentation fluxes +! ################################ +! +DO JN = 1 , NSPLITSED(KID) + ! Computation only where enough ice, snow, graupel or hail + GSEDIM(:,:,:) = .FALSE. + GSEDIM(KIB:KIE,KJB:KJE,KKTB:KKTE) = PRS(KIB:KIE,KJB:KJE,KKTB:KKTE)>XRTMIN(KID) + IF (KMOMENTS==2) GSEDIM(:,:,:) = GSEDIM(:,:,:) .AND. PCS(:,:,:)>XCTMIN(KID) + ISEDIM = COUNTJV( GSEDIM(:,:,:),I1(:),I2(:),I3(:)) +! + IF( ISEDIM >= 1 ) THEN +! + ALLOCATE(ZRHODREF(ISEDIM)) + ALLOCATE(ZPABST(ISEDIM)) + ALLOCATE(ZT(ISEDIM)) + ALLOCATE(ZRS(ISEDIM)) + ALLOCATE(ZCS(ISEDIM)) + ALLOCATE(ZLBDA(ISEDIM)) ; ZLBDA(:) = 1.E10 + ALLOCATE(ZCC(ISEDIM)) ; ZCC(:) = 1.0 + ALLOCATE(ZZW(ISEDIM)) ; ZZW(:) = 0.0 + ALLOCATE(ZZX(ISEDIM)) ; ZZX(:) = 0.0 + ALLOCATE(ZZY(ISEDIM)) ; ZZY(:) = 0.0 +! + DO JL = 1,ISEDIM + ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) + ZPABST(JL) = PPABST(I1(JL),I2(JL),I3(JL)) + ZT(JL) = PT(I1(JL),I2(JL),I3(JL)) + ZRS(JL) = PRS(I1(JL),I2(JL),I3(JL)) + IF (KMOMENTS==2) ZCS(JL) = PCS(I1(JL),I2(JL),I3(JL)) + END DO +! + IF (KMOMENTS==1) ZLBDA(:) = XLB(KID) * ( ZRHODREF(:) * ZRS(:) )**XLBEX(KID) + IF (KMOMENTS==2) ZLBDA(:) = ( XLB(KID)*ZCS(:) / ZRS(:) )**XLBEX(KID) +! + ZZY(:) = ZRHODREF(:)**(-XCEXVT) * ZLBDA(:)**(-XD(KID)) + ZZW(:) = XFSEDR(KID) * ZRS(:) * ZZY(:) * ZRHODREF(:) + IF (KMOMENTS==2) ZZX(:) = XFSEDC(KID) * ZCS(:) * ZZY(:) * ZRHODREF(:) + + IF (KID==2) THEN + ZCC(:) = 0.5*GAMMA_X0D(XNUC+1./XALPHAC)/(GAMMA_X0D(XNUC)*ZLBDA(:)) + ZCC(:) = 1.+1.26*6.6E-8*(101325./ZPABST(:))*(ZT(:)/293.15)/ZCC(:) + ZZW(:) = ZCC(:) * ZZW(:) + ZZX(:) = ZCC(:) * ZZX(:) + END IF + + ZWSEDR(:,:,:) = UNPACK( ZZW(:),MASK=GSEDIM(:,:,:),FIELD=0.0 ) + ZWSEDR(:,:,KKTB:KKTE) = MIN( ZWSEDR(:,:,KKTB:KKTE), PRS(:,:,KKTB:KKTE) * PRHODREF(:,:,KKTB:KKTE) / ZW(:,:,KKTB:KKTE) ) + IF (KMOMENTS==2) THEN + ZWSEDC(:,:,:) = UNPACK( ZZX(:),MASK=GSEDIM(:,:,:),FIELD=0.0 ) + ZWSEDC(:,:,KKTB:KKTE) = MIN( ZWSEDC(:,:,KKTB:KKTE), PCS(:,:,KKTB:KKTE) * PRHODREF(:,:,KKTB:KKTE) / ZW(:,:,KKTB:KKTE) ) + END IF + + DO JK = KKTB , KKTE + PRS(:,:,JK) = PRS(:,:,JK) + ZW(:,:,JK)* & + (ZWSEDR(:,:,JK+KKL)-ZWSEDR(:,:,JK))/PRHODREF(:,:,JK) + IF (KMOMENTS==2) PCS(:,:,JK) = PCS(:,:,JK) + ZW(:,:,JK)* & + (ZWSEDC(:,:,JK+KKL)-ZWSEDC(:,:,JK))/PRHODREF(:,:,JK) + ! Heat transport + !PRT_SUM(:,:,JK-KKL) = PRT_SUM(:,:,JK-KKL) + ZW(:,:,JK-KKL)*ZWSEDR(:,:,JK)/PRHODREF(:,:,JK-KKL) + !PRT_SUM(:,:,JK) = PRT_SUM(:,:,JK) - ZW(:,:,JK)*ZWSEDR(:,:,JK)/PRHODREF(:,:,JK) + !PCPT(:,:,JK-KKL) = PCPT(:,:,JK-KKL) + ZC * (ZW(:,:,JK-KKL)*ZWSEDR(:,:,JK)/PRHODREF(:,:,JK-KKL)) + !PCPT(:,:,JK) = PCPT(:,:,JK) - ZC * (ZW(:,:,JK)*ZWSEDR(:,:,JK)/PRHODREF(:,:,JK)) + !ZWDT(:,:,JK) =(PRHODREF(:,:,JK+KKL)*(1.+PRT_SUM(:,:,JK))*PCPT(:,:,JK)*PT(:,:,JK) + & + ! ZW(:,:,JK)*ZWSEDR(:,:,JK+1)*ZC*PT(:,:,JK+KKL)) / & + ! (PRHODREF(:,:,JK+KKL)*(1.+PRT_SUM(:,:,JK))*PCPT(:,:,JK) + ZW(:,:,JK)*ZWSEDR(:,:,JK+KKL)*ZC) + !ZWDT(:,:,JK) = ZWDT(:,:,JK) - PT(:,:,JK) + END DO + DEALLOCATE(ZRHODREF) + DEALLOCATE(ZPABST) + DEALLOCATE(ZT) + DEALLOCATE(ZRS) + DEALLOCATE(ZCS) + DEALLOCATE(ZCC) + DEALLOCATE(ZLBDA) + DEALLOCATE(ZZW) + DEALLOCATE(ZZX) + DEALLOCATE(ZZY) + ! + PINPR(:,:) = PINPR(:,:) + ZWSEDR(:,:,KKB)/XRHOLW/NSPLITSED(KID) ! in m/s + !PT(:,:,:) = PT(:,:,:) + ZWDT(:,:,:) + + END IF +END DO +! +PRS(:,:,:) = PRS(:,:,:) / PTSTEP +IF (KMOMENTS==2) PCS(:,:,:) = PCS(:,:,:) / PTSTEP +! +END SUBROUTINE LIMA_SEDIMENTATION +! +!------------------------------------------------------------------------------- diff --git a/src/mesonh/micro/lima_snow_deposition.f90 b/src/mesonh/micro/lima_snow_deposition.f90 new file mode 100644 index 000000000..697f9ee74 --- /dev/null +++ b/src/mesonh/micro/lima_snow_deposition.f90 @@ -0,0 +1,163 @@ +!MNH_LIC Copyright 2018-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ##################### + MODULE MODI_LIMA_SNOW_DEPOSITION +! ##################### +! +INTERFACE + SUBROUTINE LIMA_SNOW_DEPOSITION (LDCOMPUTE, & + PRHODREF, PSSI, PAI, PCJ, PLSFACT, & + PRST, PLBDS, & + P_RI_CNVI, P_CI_CNVI, & + P_TH_DEPS, P_RS_DEPS ) +! +LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE +! +REAL, DIMENSION(:), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(:), INTENT(IN) :: PSSI ! abs. pressure at time t +REAL, DIMENSION(:), INTENT(IN) :: PAI ! abs. pressure at time t +REAL, DIMENSION(:), INTENT(IN) :: PCJ ! abs. pressure at time t +REAL, DIMENSION(:), INTENT(IN) :: PLSFACT ! abs. pressure at time t +! +REAL, DIMENSION(:), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +! +REAL, DIMENSION(:), INTENT(IN) :: PLBDS ! Graupel m.r. at t +! +REAL, DIMENSION(:), INTENT(OUT) :: P_RI_CNVI +REAL, DIMENSION(:), INTENT(OUT) :: P_CI_CNVI +REAL, DIMENSION(:), INTENT(OUT) :: P_TH_DEPS +REAL, DIMENSION(:), INTENT(OUT) :: P_RS_DEPS +! +END SUBROUTINE LIMA_SNOW_DEPOSITION +END INTERFACE +END MODULE MODI_LIMA_SNOW_DEPOSITION +! +! ########################################################################## +SUBROUTINE LIMA_SNOW_DEPOSITION (LDCOMPUTE, & + PRHODREF, PSSI, PAI, PCJ, PLSFACT, & + PRST, PLBDS, & + P_RI_CNVI, P_CI_CNVI, & + P_TH_DEPS, P_RS_DEPS ) +! ########################################################################## +! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the microphysical sources +!! for slow cold processes : +!! - conversion of snow to ice +!! - deposition of vapor on snow +!! - conversion of ice to snow (Harrington 1995) +!! +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * CNRM * +!! +!! MODIFICATIONS +!! ------------- +!! Original 15/03/2018 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCTMIN, XALPHAI, XALPHAS, XNUI, XNUS +USE MODD_PARAM_LIMA_COLD, ONLY : XCXS, XCCS, & + XLBDAS_MAX, XDSCNVI_LIM, XLBDASCNVI_MAX, & + XC0DEPSI, XC1DEPSI, XR0DEPSI, XR1DEPSI, & + XSCFAC, X1DEPS, X0DEPS, XEX1DEPS, XEX0DEPS, & + XDICNVS_LIM, XLBDAICNVS_LIM, & + XC0DEPIS, XC1DEPIS, XR0DEPIS, XR1DEPIS, & + XCOLEXIS, XAGGS_CLARGE1, XAGGS_CLARGE2, & + XAGGS_RLARGE1, XAGGS_RLARGE2 + +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE +! +REAL, DIMENSION(:), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(:), INTENT(IN) :: PSSI ! abs. pressure at time t +REAL, DIMENSION(:), INTENT(IN) :: PAI ! abs. pressure at time t +REAL, DIMENSION(:), INTENT(IN) :: PCJ ! abs. pressure at time t +REAL, DIMENSION(:), INTENT(IN) :: PLSFACT ! abs. pressure at time t +! +REAL, DIMENSION(:), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +! +REAL, DIMENSION(:), INTENT(IN) :: PLBDS ! Graupel m.r. at t +! +REAL, DIMENSION(:), INTENT(OUT) :: P_RI_CNVI +REAL, DIMENSION(:), INTENT(OUT) :: P_CI_CNVI +REAL, DIMENSION(:), INTENT(OUT) :: P_TH_DEPS +REAL, DIMENSION(:), INTENT(OUT) :: P_RS_DEPS +! +!* 0.2 Declarations of local variables : +! +LOGICAL, DIMENSION(SIZE(PRHODREF)) :: GMICRO ! Computations only where necessary +REAL, DIMENSION(SIZE(PRHODREF)) :: ZZW, ZZW2, ZZX ! Work array +! +! +!------------------------------------------------------------------------------- +! +P_RI_CNVI(:) = 0. +P_CI_CNVI(:) = 0. +P_TH_DEPS(:) = 0. +P_RS_DEPS(:) = 0. +! +! Physical limitations +! +! +! Looking for regions where computations are necessary +! +GMICRO(:) = LDCOMPUTE(:) .AND. PRST(:)>XRTMIN(5) +! +! +WHERE( GMICRO ) +! +!* 2.1 Conversion of snow to r_i: RSCNVI +! ---------------------------------------- +! +! + ZZW2(:) = 0.0 + ZZW(:) = 0.0 + WHERE ( PLBDS(:)<XLBDASCNVI_MAX .AND. (PRST(:)>XRTMIN(5)) & + .AND. (PSSI(:)<0.0) ) + ZZW(:) = (PLBDS(:)*XDSCNVI_LIM)**(XALPHAS) + ZZX(:) = ( -PSSI(:)/PAI(:) ) * (XCCS*PLBDS(:)**XCXS) * (ZZW(:)**XNUS) * EXP(-ZZW(:)) +! + ZZW(:) = ( XR0DEPSI+XR1DEPSI*PCJ(:) )*ZZX(:) +! + ZZW2(:) = ZZW(:)*( XC0DEPSI+XC1DEPSI*PCJ(:) )/( XR0DEPSI+XR1DEPSI*PCJ(:) ) + END WHERE +! + P_RI_CNVI(:) = ZZW(:) + P_CI_CNVI(:) = ZZW2(:) +! +! +!* 2.2 Deposition of water vapor on r_s: RVDEPS +! ----------------------------------------------- +! +! + ZZW(:) = 0.0 + WHERE ( (PRST(:)>XRTMIN(5)) ) + ZZW(:) = ( PSSI(:)/(PAI(:)) ) * & + ( X0DEPS*PLBDS(:)**XEX0DEPS + X1DEPS*PCJ(:)*PLBDS(:)**XEX1DEPS ) + ZZW(:) = ZZW(:)*(0.5+SIGN(0.5,ZZW(:))) - ABS(ZZW(:))*(0.5-SIGN(0.5,ZZW(:))) + END WHERE +! + P_RS_DEPS(:) = ZZW(:) +!!$ P_TH_DEPS(:) = P_RS_DEPS(:) * PLSFACT(:) +! +END WHERE +! +! +END SUBROUTINE LIMA_SNOW_DEPOSITION diff --git a/src/mesonh/micro/lima_tendencies.f90 b/src/mesonh/micro/lima_tendencies.f90 new file mode 100644 index 000000000..bd98d503c --- /dev/null +++ b/src/mesonh/micro/lima_tendencies.f90 @@ -0,0 +1,797 @@ +!MNH_LIC Copyright 2018-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!############################### +MODULE MODI_LIMA_TENDENCIES +!############################### + INTERFACE + SUBROUTINE LIMA_TENDENCIES (PTSTEP, LDCOMPUTE, & + PEXNREF, PRHODREF, PPABST, PTHT, & + PRVT, PRCT, PRRT, PRIT, PRST, PRGT, PRHT, & + PCCT, PCRT, PCIT, & + P_TH_HONC, P_RC_HONC, P_CC_HONC, & + P_CC_SELF, & + P_RC_AUTO, P_CC_AUTO, P_CR_AUTO, & + P_RC_ACCR, P_CC_ACCR, & + P_CR_SCBU, & + P_TH_EVAP, P_RR_EVAP, & + P_RI_CNVI, P_CI_CNVI, & + P_TH_DEPS, P_RS_DEPS, & + P_TH_DEPI, P_RI_DEPI, & + P_RI_CNVS, P_CI_CNVS, & + P_RI_AGGS, P_CI_AGGS, & + P_TH_DEPG, P_RG_DEPG, & + P_TH_BERFI, P_RC_BERFI, & + P_TH_RIM, P_RC_RIM, P_CC_RIM, P_RS_RIM, P_RG_RIM, & + P_RI_HMS, P_CI_HMS, P_RS_HMS, & + P_TH_ACC, P_RR_ACC, P_CR_ACC, P_RS_ACC, P_RG_ACC, & + P_RS_CMEL, & + P_TH_CFRZ, P_RR_CFRZ, P_CR_CFRZ, P_RI_CFRZ, P_CI_CFRZ, & + P_TH_WETG, P_RC_WETG, P_CC_WETG, P_RR_WETG, P_CR_WETG, & + P_RI_WETG, P_CI_WETG, P_RS_WETG, P_RG_WETG, P_RH_WETG, & + P_TH_DRYG, P_RC_DRYG, P_CC_DRYG, P_RR_DRYG, P_CR_DRYG, & + P_RI_DRYG, P_CI_DRYG, P_RS_DRYG, P_RG_DRYG, & + P_RI_HMG, P_CI_HMG, P_RG_HMG, & + P_TH_GMLT, P_RR_GMLT, P_CR_GMLT, & +!!! Z_RC_WETH, Z_CC_WETH, Z_RR_WETH, Z_CR_WETH, & ! wet growth of hail (WETH) : rc, Nc, rr, Nr, ri, Ni, rs, rg, rh, th +!!! Z_RI_WETH, Z_CI_WETH, Z_RS_WETH, Z_RG_WETH, Z_RH_WETH, & ! wet growth of hail (WETH) : rc, Nc, rr, Nr, ri, Ni, rs, rg, rh, th +!!! Z_RG_COHG, & ! conversion of hail into graupel (COHG) : rg, rh +!!! Z_RR_HMLT, Z_CR_HMLT ! hail melting (HMLT) : rr, Nr, rh=-rr, th + PA_TH, PA_RV, PA_RC, PA_CC, PA_RR, PA_CR, & + PA_RI, PA_CI, PA_RS, PA_RG, PA_RH, & + PEVAP3D, & + PCF1D, PIF1D, PPF1D ) +! +REAL, INTENT(IN) :: PTSTEP +LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE +! +REAL, DIMENSION(:), INTENT(IN) :: PEXNREF ! +REAL, DIMENSION(:), INTENT(IN) :: PRHODREF ! +REAL, DIMENSION(:), INTENT(IN) :: PPABST ! Pressure +REAL, DIMENSION(:), INTENT(IN) :: PTHT ! Potential temperature +! +REAL, DIMENSION(:), INTENT(IN) :: PRVT ! +REAL, DIMENSION(:), INTENT(IN) :: PRCT ! +REAL, DIMENSION(:), INTENT(IN) :: PRRT ! +REAL, DIMENSION(:), INTENT(IN) :: PRIT ! +REAL, DIMENSION(:), INTENT(IN) :: PRST ! +REAL, DIMENSION(:), INTENT(IN) :: PRGT ! +REAL, DIMENSION(:), INTENT(IN) :: PRHT ! Mixing ratios (kg/kg) +! +REAL, DIMENSION(:), INTENT(IN) :: PCCT ! +REAL, DIMENSION(:), INTENT(IN) :: PCRT ! +REAL, DIMENSION(:), INTENT(IN) :: PCIT ! Number concentrations (/kg) +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_HONC +REAL, DIMENSION(:), INTENT(INOUT) :: P_RC_HONC +REAL, DIMENSION(:), INTENT(INOUT) :: P_CC_HONC ! droplets homogeneous freezing (HONC) : rc, Nc, ri=-rc, Ni=-Nc, th +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_CC_SELF ! self collection of droplets (SELF) : Nc +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_RC_AUTO +REAL, DIMENSION(:), INTENT(INOUT) :: P_CC_AUTO +REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_AUTO ! autoconversion of cloud droplets (AUTO) : rc, Nc, rr=-rc, Nr +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_RC_ACCR +REAL, DIMENSION(:), INTENT(INOUT) :: P_CC_ACCR ! accretion of droplets by rain drops (ACCR) : rc, Nc, rr=-rr +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_SCBU ! self collectio break up of drops (SCBU) : Nr +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_EVAP +REAL, DIMENSION(:), INTENT(INOUT) :: P_RR_EVAP ! evaporation of rain drops (EVAP) : rr, rv=-rr +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_CNVI +REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_CNVI ! conversion snow -> ice (CNVI) : ri, Ni, rs=-ri +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_DEPS +REAL, DIMENSION(:), INTENT(INOUT) :: P_RS_DEPS ! deposition of vapor on snow (DEPS) : rv=-rs, rs, th +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_DEPI +REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_DEPI ! deposition of vapor on ice (DEPI) : rv=-ri, ri, th +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_CNVS +REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_CNVS ! conversion ice -> snow (CNVS) : ri, Ni, rs=-ri +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_AGGS +REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_AGGS ! aggregation of ice on snow (AGGS) : ri, Ni, rs=-ri +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_DEPG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_DEPG ! deposition of vapor on graupel (DEPG) : rv=-rg, rg, th +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_BERFI +REAL, DIMENSION(:), INTENT(INOUT) :: P_RC_BERFI ! Bergeron (BERFI) : rc, ri=-rc, th +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_RIM +REAL, DIMENSION(:), INTENT(INOUT) :: P_RC_RIM +REAL, DIMENSION(:), INTENT(INOUT) :: P_CC_RIM +REAL, DIMENSION(:), INTENT(INOUT) :: P_RS_RIM +REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_RIM ! cloud droplet riming (RIM) : rc, Nc, rs, rg, th +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_HMS +REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_HMS +REAL, DIMENSION(:), INTENT(INOUT) :: P_RS_HMS ! hallett mossop snow (HMS) : ri, Ni, rs +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_ACC +REAL, DIMENSION(:), INTENT(INOUT) :: P_RR_ACC +REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_ACC +REAL, DIMENSION(:), INTENT(INOUT) :: P_RS_ACC +REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_ACC ! rain accretion on aggregates (ACC) : rr, Nr, rs, rg, th +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_RS_CMEL ! conversion-melting (CMEL) : rs, rg=-rs +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_CFRZ +REAL, DIMENSION(:), INTENT(INOUT) :: P_RR_CFRZ +REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_CFRZ +REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_CFRZ +REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_CFRZ ! rain freezing (CFRZ) : rr, Nr, ri, Ni, rg=-rr-ri, th +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_WETG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RC_WETG +REAL, DIMENSION(:), INTENT(INOUT) :: P_CC_WETG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RR_WETG +REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_WETG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_WETG +REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_WETG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RS_WETG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_WETG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RH_WETG ! wet growth of graupel (WETG) : rc, NC, rr, Nr, ri, Ni, rs, rg, rh, th +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_DRYG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RC_DRYG +REAL, DIMENSION(:), INTENT(INOUT) :: P_CC_DRYG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RR_DRYG +REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_DRYG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_DRYG +REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_DRYG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RS_DRYG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_DRYG ! dry growth of graupel (DRYG) : rc, Nc, rr, Nr, ri, Ni, rs, rg, th +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_HMG +REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_HMG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_HMG ! hallett mossop graupel (HMG) : ri, Ni, rg +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_GMLT +REAL, DIMENSION(:), INTENT(INOUT) :: P_RR_GMLT +REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_GMLT ! graupel melting (GMLT) : rr, Nr, rg=-rr, th +! +REAL, DIMENSION(:), INTENT(INOUT) :: PA_TH +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RV +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RC +REAL, DIMENSION(:), INTENT(INOUT) :: PA_CC +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RR +REAL, DIMENSION(:), INTENT(INOUT) :: PA_CR +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RI +REAL, DIMENSION(:), INTENT(INOUT) :: PA_CI +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RS +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RG +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RH +! +REAL, DIMENSION(:), INTENT(INOUT) :: PEVAP3D +! +REAL, DIMENSION(:), INTENT(IN) :: PCF1D +REAL, DIMENSION(:), INTENT(IN) :: PIF1D +REAL, DIMENSION(:), INTENT(IN) :: PPF1D +! + END SUBROUTINE LIMA_TENDENCIES + END INTERFACE +END MODULE MODI_LIMA_TENDENCIES +!##################################################################### +! +!##################################################################### +SUBROUTINE LIMA_TENDENCIES (PTSTEP, LDCOMPUTE, & + PEXNREF, PRHODREF, PPABST, PTHT, & + PRVT, PRCT, PRRT, PRIT, PRST, PRGT, PRHT, & + PCCT, PCRT, PCIT, & + P_TH_HONC, P_RC_HONC, P_CC_HONC, & + P_CC_SELF, & + P_RC_AUTO, P_CC_AUTO, P_CR_AUTO, & + P_RC_ACCR, P_CC_ACCR, & + P_CR_SCBU, & + P_TH_EVAP, P_RR_EVAP, & + P_RI_CNVI, P_CI_CNVI, & + P_TH_DEPS, P_RS_DEPS, & + P_TH_DEPI, P_RI_DEPI, & + P_RI_CNVS, P_CI_CNVS, & + P_RI_AGGS, P_CI_AGGS, & + P_TH_DEPG, P_RG_DEPG, & + P_TH_BERFI, P_RC_BERFI, & + P_TH_RIM, P_RC_RIM, P_CC_RIM, P_RS_RIM, P_RG_RIM, & + P_RI_HMS, P_CI_HMS, P_RS_HMS, & + P_TH_ACC, P_RR_ACC, P_CR_ACC, P_RS_ACC, P_RG_ACC, & + P_RS_CMEL, & + P_TH_CFRZ, P_RR_CFRZ, P_CR_CFRZ, P_RI_CFRZ, P_CI_CFRZ, & + P_TH_WETG, P_RC_WETG, P_CC_WETG, P_RR_WETG, P_CR_WETG, & + P_RI_WETG, P_CI_WETG, P_RS_WETG, P_RG_WETG, P_RH_WETG, & + P_TH_DRYG, P_RC_DRYG, P_CC_DRYG, P_RR_DRYG, P_CR_DRYG, & + P_RI_DRYG, P_CI_DRYG, P_RS_DRYG, P_RG_DRYG, & + P_RI_HMG, P_CI_HMG, P_RG_HMG, & + P_TH_GMLT, P_RR_GMLT, P_CR_GMLT, & +!!! Z_RC_WETH, Z_CC_WETH, Z_RR_WETH, Z_CR_WETH, & ! wet growth of hail (WETH) : rc, Nc, rr, Nr, ri, Ni, rs, rg, rh, th +!!! Z_RI_WETH, Z_CI_WETH, Z_RS_WETH, Z_RG_WETH, Z_RH_WETH, & ! wet growth of hail (WETH) : rc, Nc, rr, Nr, ri, Ni, rs, rg, rh, th +!!! Z_RG_COHG, & ! conversion of hail into graupel (COHG) : rg, rh +!!! Z_RR_HMLT, Z_CR_HMLT ! hail melting (HMLT) : rr, Nr, rh=-rr, th + PA_TH, PA_RV, PA_RC, PA_CC, PA_RR, PA_CR, & + PA_RI, PA_CI, PA_RS, PA_RG, PA_RH, & + PEVAP3D, & + PCF1D, PIF1D, PPF1D ) +! ###################################################################### +!! +!! PURPOSE +!! ------- +!! Compute sources of non-instantaneous microphysical processes for the +!! time-split version of LIMA +!! +!! AUTHOR +!! ------ +!! B. Vié * CNRM * +!! +!! MODIFICATIONS +!! ------------- +!! Original 15/03/2018 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST, ONLY : XP00, XRD, XRV, XMD, XMV, XCPD, XCPV, XCL, XCI, XLVTT, XLSTT, XTT, & + XALPW, XBETAW, XGAMW, XALPI, XBETAI, XGAMI +USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCTMIN, & + LCOLD, LNUCL, LSNOW, LHAIL, LWARM, LACTI, LRAIN +USE MODD_PARAM_LIMA_WARM, ONLY : XLBC, XLBEXC, XLBR, XLBEXR +USE MODD_PARAM_LIMA_MIXED, ONLY : XLBG, XLBEXG, XLBH, XLBEXH, XLBDAG_MAX +USE MODD_PARAM_LIMA_COLD, ONLY : XSCFAC, XLBI, XLBEXI, XLBS, XLBEXS, XLBDAS_MAX +! +USE MODI_LIMA_DROPLETS_HOM_FREEZING +USE MODI_LIMA_DROPLETS_SELF_COLLECTION +USE MODI_LIMA_DROPLETS_AUTOCONVERSION +USE MODI_LIMA_DROPLETS_ACCRETION +USE MODI_LIMA_DROPS_SELF_COLLECTION +USE MODI_LIMA_RAIN_EVAPORATION +USE MODI_LIMA_ICE_DEPOSITION +USE MODI_LIMA_SNOW_DEPOSITION +USE MODI_LIMA_ICE_AGGREGATION_SNOW +USE MODI_LIMA_GRAUPEL_DEPOSITION +USE MODI_LIMA_DROPLETS_RIMING_SNOW +USE MODI_LIMA_RAIN_ACCR_SNOW +USE MODI_LIMA_CONVERSION_MELTING_SNOW +USE MODI_LIMA_RAIN_FREEZING +USE MODI_LIMA_GRAUPEL +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +REAL, INTENT(IN) :: PTSTEP +LOGICAL, DIMENSION(:),INTENT(IN) :: LDCOMPUTE +! +REAL, DIMENSION(:), INTENT(IN) :: PEXNREF ! +REAL, DIMENSION(:), INTENT(IN) :: PRHODREF ! +REAL, DIMENSION(:), INTENT(IN) :: PPABST ! Pressure +REAL, DIMENSION(:), INTENT(IN) :: PTHT ! Potential temperature +! +REAL, DIMENSION(:), INTENT(IN) :: PRVT ! +REAL, DIMENSION(:), INTENT(IN) :: PRCT ! +REAL, DIMENSION(:), INTENT(IN) :: PRRT ! +REAL, DIMENSION(:), INTENT(IN) :: PRIT ! +REAL, DIMENSION(:), INTENT(IN) :: PRST ! +REAL, DIMENSION(:), INTENT(IN) :: PRGT ! +REAL, DIMENSION(:), INTENT(IN) :: PRHT ! Mixing ratios (kg/kg) +! +REAL, DIMENSION(:), INTENT(IN) :: PCCT ! +REAL, DIMENSION(:), INTENT(IN) :: PCRT ! +REAL, DIMENSION(:), INTENT(IN) :: PCIT ! Number concentrations (/kg) +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_HONC +REAL, DIMENSION(:), INTENT(INOUT) :: P_RC_HONC +REAL, DIMENSION(:), INTENT(INOUT) :: P_CC_HONC ! droplets homogeneous freezing (HONC) : rc, Nc, ri=-rc, Ni=-Nc, th +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_CC_SELF ! self collection of droplets (SELF) : Nc +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_RC_AUTO +REAL, DIMENSION(:), INTENT(INOUT) :: P_CC_AUTO +REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_AUTO ! autoconversion of cloud droplets (AUTO) : rc, Nc, rr=-rc, Nr +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_RC_ACCR +REAL, DIMENSION(:), INTENT(INOUT) :: P_CC_ACCR ! accretion of droplets by rain drops (ACCR) : rc, Nc, rr=-rr +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_SCBU ! self collectio break up of drops (SCBU) : Nr +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_EVAP +REAL, DIMENSION(:), INTENT(INOUT) :: P_RR_EVAP ! evaporation of rain drops (EVAP) : rr, rv=-rr +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_CNVI +REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_CNVI ! conversion snow -> ice (CNVI) : ri, Ni, rs=-ri +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_DEPS +REAL, DIMENSION(:), INTENT(INOUT) :: P_RS_DEPS ! deposition of vapor on snow (DEPS) : rv=-rs, rs, th +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_DEPI +REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_DEPI ! deposition of vapor on ice (DEPI) : rv=-ri, ri, th +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_CNVS +REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_CNVS ! conversion ice -> snow (CNVS) : ri, Ni, rs=-ri +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_AGGS +REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_AGGS ! aggregation of ice on snow (AGGS) : ri, Ni, rs=-ri +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_DEPG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_DEPG ! deposition of vapor on graupel (DEPG) : rv=-rg, rg, th +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_BERFI +REAL, DIMENSION(:), INTENT(INOUT) :: P_RC_BERFI ! Bergeron (BERFI) : rc, ri=-rc, th +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_RIM +REAL, DIMENSION(:), INTENT(INOUT) :: P_RC_RIM +REAL, DIMENSION(:), INTENT(INOUT) :: P_CC_RIM +REAL, DIMENSION(:), INTENT(INOUT) :: P_RS_RIM +REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_RIM ! cloud droplet riming (RIM) : rc, Nc, rs, rg, th +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_HMS +REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_HMS +REAL, DIMENSION(:), INTENT(INOUT) :: P_RS_HMS ! hallett mossop snow (HMS) : ri, Ni, rs +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_ACC +REAL, DIMENSION(:), INTENT(INOUT) :: P_RR_ACC +REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_ACC +REAL, DIMENSION(:), INTENT(INOUT) :: P_RS_ACC +REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_ACC ! rain accretion on aggregates (ACC) : rr, Nr, rs, rg, th +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_RS_CMEL ! conversion-melting (CMEL) : rs, rg=-rs +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_CFRZ +REAL, DIMENSION(:), INTENT(INOUT) :: P_RR_CFRZ +REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_CFRZ +REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_CFRZ +REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_CFRZ ! rain freezing (CFRZ) : rr, Nr, ri, Ni, rg=-rr-ri, th +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_WETG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RC_WETG +REAL, DIMENSION(:), INTENT(INOUT) :: P_CC_WETG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RR_WETG +REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_WETG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_WETG +REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_WETG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RS_WETG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_WETG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RH_WETG ! wet growth of graupel (WETG) : rc, NC, rr, Nr, ri, Ni, rs, rg, rh, th +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_DRYG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RC_DRYG +REAL, DIMENSION(:), INTENT(INOUT) :: P_CC_DRYG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RR_DRYG +REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_DRYG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_DRYG +REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_DRYG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RS_DRYG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_DRYG ! dry growth of graupel (DRYG) : rc, Nc, rr, Nr, ri, Ni, rs, rg, th +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_RI_HMG +REAL, DIMENSION(:), INTENT(INOUT) :: P_CI_HMG +REAL, DIMENSION(:), INTENT(INOUT) :: P_RG_HMG ! hallett mossop graupel (HMG) : ri, Ni, rg +! +REAL, DIMENSION(:), INTENT(INOUT) :: P_TH_GMLT +REAL, DIMENSION(:), INTENT(INOUT) :: P_RR_GMLT +REAL, DIMENSION(:), INTENT(INOUT) :: P_CR_GMLT ! graupel melting (GMLT) : rr, Nr, rg=-rr, th +! +REAL, DIMENSION(:), INTENT(INOUT) :: PA_TH +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RV +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RC +REAL, DIMENSION(:), INTENT(INOUT) :: PA_CC +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RR +REAL, DIMENSION(:), INTENT(INOUT) :: PA_CR +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RI +REAL, DIMENSION(:), INTENT(INOUT) :: PA_CI +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RS +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RG +REAL, DIMENSION(:), INTENT(INOUT) :: PA_RH +! +REAL, DIMENSION(:), INTENT(INOUT) :: PEVAP3D +! +REAL, DIMENSION(:), INTENT(IN) :: PCF1D +REAL, DIMENSION(:), INTENT(IN) :: PIF1D +REAL, DIMENSION(:), INTENT(IN) :: PPF1D +! +!* 0.2 Declarations of local variables : +! +REAL, DIMENSION(SIZE(PRCT)) :: ZT + +REAL, DIMENSION(SIZE(PRCT)) :: ZLBDC +REAL, DIMENSION(SIZE(PRCT)) :: ZLBDC3 +REAL, DIMENSION(SIZE(PRCT)) :: ZLBDR +REAL, DIMENSION(SIZE(PRCT)) :: ZLBDR3 +REAL, DIMENSION(SIZE(PRCT)) :: ZLBDI +REAL, DIMENSION(SIZE(PRCT)) :: ZLBDS +REAL, DIMENSION(SIZE(PRCT)) :: ZLBDG +REAL, DIMENSION(SIZE(PRCT)) :: ZLBDH + +REAL, DIMENSION(SIZE(PRCT)) :: ZAI +REAL, DIMENSION(SIZE(PRCT)) :: ZKA +REAL, DIMENSION(SIZE(PRCT)) :: ZDV +REAL, DIMENSION(SIZE(PRCT)) :: ZCJ + +REAL, DIMENSION(SIZE(PRCT)) :: ZEPS +REAL, DIMENSION(SIZE(PRCT)) :: ZEVSAT +REAL, DIMENSION(SIZE(PRCT)) :: ZEISAT +REAL, DIMENSION(SIZE(PRCT)) :: ZRVSAT +REAL, DIMENSION(SIZE(PRCT)) :: ZRISAT +! +REAL, DIMENSION(SIZE(PRCT)) :: ZSSI +REAL, DIMENSION(SIZE(PRCT)) :: ZSSIW + +REAL, DIMENSION(SIZE(PRCT)) :: ZLV +REAL, DIMENSION(SIZE(PRCT)) :: ZLS +REAL, DIMENSION(SIZE(PRCT)) :: ZLVFACT +REAL, DIMENSION(SIZE(PRCT)) :: ZLSFACT +! +REAL, DIMENSION(SIZE(PRCT)) :: ZW +! +REAL, DIMENSION(SIZE(PRCT)) :: ZCF1D +REAL, DIMENSION(SIZE(PRCT)) :: ZIF1D +REAL, DIMENSION(SIZE(PRCT)) :: ZPF1D +! +!------------------------------------------------------------------------------- +! Pre-compute quantities +! +! Prevent fractions to reach 0 (divide by 0) +! +ZCF1D(:) = MAX(PCF1D(:),0.01) +ZIF1D(:) = MAX(PIF1D(:),0.01) +ZPF1D(:) = MAX(PPF1D(:),0.01) +! +! Is it necessary to compute the following quantities +! accounting for subgrig cloud fraction ? +! lambda does not depend on cloud fraction for 2-m species +! lambda depends on CF for 1-m species ? +! +! +! Is it necessary to change water vapour in cloudy / non cloudy parts ? +! +! +WHERE (LDCOMPUTE(:)) + ZT(:) = PTHT(:) * ( PPABST(:)/XP00 ) ** (XRD/XCPD) +! + ZW(:) = PEXNREF(:)*( XCPD & + +XCPV*PRVT(:) & + +XCL*(PRCT(:)+PRRT(:)) & + +XCI*(PRIT(:)+PRST(:)+PRGT(:)+PRHT(:)) ) +! + ZLV(:) = XLVTT + (XCPV-XCL)*(ZT(:)-XTT) + ZLVFACT(:) = ZLV(:)/ZW(:) ! L_v/(Pi_ref*C_ph) + ZLS(:) = XLSTT + (XCPV-XCI)*(ZT(:)-XTT) + ZLSFACT(:) = ZLS(:)/ZW(:) ! L_s/(Pi_ref*C_ph) +! + ZEVSAT(:) = EXP( XALPW - XBETAW/ZT(:) - XGAMW*ALOG(ZT(:) ) ) + ZEISAT(:) = EXP( XALPI - XBETAI/ZT(:) - XGAMI*ALOG(ZT(:) ) ) + ! + ZEPS= XMV / XMD + ZRVSAT(:) = ZEPS * ZEVSAT(:) / (PPABST(:) - ZEVSAT(:)) + ZRISAT(:) = ZEPS * ZEISAT(:) / (PPABST(:) - ZEISAT(:)) + ! + ZSSI(:) = PRVT(:)/ZRISAT(:) - 1.0 ! Si = rv/rsi - 1 + ZSSIW(:) = ZRVSAT(:)/ZRISAT(:) - 1.0 ! Siw = rsw/rsi - 1 +! + ZKA(:) = 2.38E-2 + 0.0071E-2 * ( ZT(:) - XTT ) +! + ZDV(:) = 0.211E-4 * (ZT(:)/XTT)**1.94 * (XP00/PPABST(:)) +! + ZAI(:) = ( XLSTT + (XCPV-XCI)*(ZT(:)-XTT) )**2 / (ZKA(:)*XRV*ZT(:)**2) & + + ( XRV*ZT(:) ) / (ZDV(:)*ZEISAT(:)) +! + ZCJ(:) = XSCFAC * PRHODREF(:)**0.3 / SQRT( 1.718E-5+0.0049E-5*(ZT(:)-XTT) ) +! +END WHERE +! +! +ZLBDC(:) = 1.E10 +ZLBDC3(:) = 1.E30 +WHERE (PRCT(:)>XRTMIN(2) .AND. PCCT(:)>XCTMIN(2) .AND. LDCOMPUTE(:)) + ZLBDC3(:) = XLBC*PCCT(:) / PRCT(:) + ZLBDC(:) = ZLBDC3(:)**XLBEXC +END WHERE +ZLBDR(:) = 1.E10 +ZLBDR3(:) = 1.E30 +WHERE (PRRT(:)>XRTMIN(3) .AND. PCRT(:)>XCTMIN(3) .AND. LDCOMPUTE(:)) + ZLBDR3(:) = XLBR*PCRT(:) / PRRT(:) + ZLBDR(:) = ZLBDR3(:)**XLBEXR +END WHERE +ZLBDI(:) = 1.E10 +WHERE (PRIT(:)>XRTMIN(4) .AND. PCIT(:)>XCTMIN(4) .AND. LDCOMPUTE(:)) + ZLBDI(:) = ( XLBI*PCIT(:) / PRIT(:) )**XLBEXI +END WHERE +ZLBDS(:) = 1.E10 +WHERE (PRST(:)>XRTMIN(5) .AND. LDCOMPUTE(:) ) + ZLBDS(:) = XLBS*( PRHODREF(:)*PRST(:) )**XLBEXS +END WHERE +ZLBDG(:) = 1.E10 +WHERE (PRGT(:)>XRTMIN(6) .AND. LDCOMPUTE(:) ) + ZLBDG(:) = XLBG*( PRHODREF(:)*PRGT(:) )**XLBEXG +END WHERE +ZLBDH(:) = 1.E10 +WHERE (PRHT(:)>XRTMIN(7) .AND. LDCOMPUTE(:) ) + ZLBDH(:) = XLBH*( PRHODREF(:)*PRHT(:) )**XLBEXH +END WHERE +! +!------------------------------------------------------------------------------- +! Call microphysical processes +! +IF (LCOLD .AND. LWARM) THEN + CALL LIMA_DROPLETS_HOM_FREEZING (PTSTEP, LDCOMPUTE, & ! independent from CF,IF,PF + ZT, ZLVFACT, ZLSFACT, & + PRCT, PCCT, ZLBDC, & + P_TH_HONC, P_RC_HONC, P_CC_HONC, & + PA_TH, PA_RC, PA_CC, PA_RI, PA_CI ) +END IF +! +IF (LWARM .AND. LRAIN) THEN + CALL LIMA_DROPLETS_SELF_COLLECTION (LDCOMPUTE, & ! depends on CF + PRHODREF, & + PCCT/ZCF1D, ZLBDC3, & + P_CC_SELF ) + P_CC_SELF(:) = P_CC_SELF(:) * ZCF1D(:) + PA_CC(:) = PA_CC(:) + P_CC_SELF(:) +END IF +! +IF (LWARM .AND. LRAIN) THEN + CALL LIMA_DROPLETS_AUTOCONVERSION (LDCOMPUTE, & ! depends on CF + PRHODREF, & + PRCT/ZCF1D, PCCT/ZCF1D, ZLBDC, ZLBDR, & + P_RC_AUTO, P_CC_AUTO, P_CR_AUTO ) + P_RC_AUTO(:) = P_RC_AUTO(:) * ZCF1D(:) + P_CC_AUTO(:) = P_CC_AUTO(:) * ZCF1D(:) + P_CR_AUTO(:) = P_CR_AUTO(:) * ZCF1D(:) + ! + PA_RC(:) = PA_RC(:) + P_RC_AUTO(:) + PA_CC(:) = PA_CC(:) + P_CC_AUTO(:) + PA_RR(:) = PA_RR(:) - P_RC_AUTO(:) + PA_CR(:) = PA_CR(:) + P_CR_AUTO(:) +END IF +! +IF (LWARM .AND. LRAIN) THEN + CALL LIMA_DROPLETS_ACCRETION (LDCOMPUTE, & ! depends on CF, PF + PRHODREF, & + PRCT/ZCF1D, PRRT/ZPF1D, PCCT/ZCF1D, PCRT/ZPF1D,& + ZLBDC, ZLBDC3, ZLBDR, ZLBDR3, & + P_RC_ACCR, P_CC_ACCR ) + ! + P_CC_ACCR(:) = P_CC_ACCR(:) * ZCF1D(:) + P_RC_ACCR(:) = P_RC_ACCR(:) * ZCF1D(:) + ! + PA_RC(:) = PA_RC(:) + P_RC_ACCR(:) + PA_CC(:) = PA_CC(:) + P_CC_ACCR(:) + PA_RR(:) = PA_RR(:) - P_RC_ACCR(:) +END IF +! +IF (LWARM .AND. LRAIN) THEN + CALL LIMA_DROPS_SELF_COLLECTION (LDCOMPUTE, & ! depends on PF + PRHODREF, & + PCRT/ZPF1D(:), ZLBDR, ZLBDR3, & + P_CR_SCBU ) + ! + P_CR_SCBU(:) = P_CR_SCBU(:) * ZPF1D(:) + ! + PA_CR(:) = PA_CR(:) + P_CR_SCBU(:) +END IF +! +IF (LWARM .AND. LRAIN) THEN + CALL LIMA_RAIN_EVAPORATION (PTSTEP, LDCOMPUTE, & ! depends on PF > CF + PRHODREF, ZT, ZLV, ZLVFACT, ZEVSAT, ZRVSAT, & + PRVT, PRCT/ZPF1D, PRRT/ZPF1D, ZLBDR, & + P_TH_EVAP, P_RR_EVAP, & + PEVAP3D ) + P_RR_EVAP(:) = P_RR_EVAP(:) * MAX((ZPF1D(:) - ZCF1D(:)),0.) + P_TH_EVAP(:) = P_RR_EVAP(:) * ZLVFACT(:) + PEVAP3D(:) = - P_RR_EVAP(:) + ! + PA_TH(:) = PA_TH(:) + P_TH_EVAP(:) + PA_RV(:) = PA_RV(:) - P_RR_EVAP(:) + PA_RR(:) = PA_RR(:) + P_RR_EVAP(:) +END IF +! +IF (LCOLD) THEN + ! + ! Includes vapour deposition on ice, ice -> snow conversion + ! + CALL LIMA_ICE_DEPOSITION (PTSTEP, LDCOMPUTE, & ! depends on IF, PF + PRHODREF, ZSSI, ZAI, ZCJ, ZLSFACT, & + PRIT/ZIF1D, PCIT/ZIF1D, ZLBDI, & + P_TH_DEPI, P_RI_DEPI, & + P_RI_CNVS, P_CI_CNVS ) + ! + P_RI_DEPI(:) = P_RI_DEPI(:) * ZIF1D(:) + P_RI_CNVS(:) = P_RI_CNVS(:) * ZIF1D(:) + P_CI_CNVS(:) = P_CI_CNVS(:) * ZIF1D(:) + P_TH_DEPI(:) = P_RI_DEPI(:) * ZLSFACT(:) + ! + PA_TH(:) = PA_TH(:) + P_TH_DEPI(:) + PA_RV(:) = PA_RV(:) - P_RI_DEPI(:) + PA_RI(:) = PA_RI(:) + P_RI_DEPI(:) + P_RI_CNVS(:) + PA_CI(:) = PA_CI(:) + P_CI_CNVS(:) + PA_RS(:) = PA_RS(:) - P_RI_CNVS(:) + +END IF +! +IF (LCOLD .AND. LSNOW) THEN + ! + ! Includes vapour deposition on snow, snow -> ice conversion + ! + CALL LIMA_SNOW_DEPOSITION (LDCOMPUTE, & ! depends on IF, PF + PRHODREF, ZSSI, ZAI, ZCJ, ZLSFACT, & + PRST/ZPF1D, ZLBDS, & + P_RI_CNVI, P_CI_CNVI, & + P_TH_DEPS, P_RS_DEPS ) + ! + P_RI_CNVI(:) = P_RI_CNVI(:) * ZPF1D(:) + P_CI_CNVI(:) = P_CI_CNVI(:) * ZPF1D(:) + P_RS_DEPS(:) = P_RS_DEPS(:) * ZPF1D(:) + P_TH_DEPS(:) = P_RS_DEPS(:) * ZLSFACT(:) + ! + PA_RI(:) = PA_RI(:) + P_RI_CNVI(:) + PA_CI(:) = PA_CI(:) + P_CI_CNVI(:) + PA_RS(:) = PA_RS(:) - P_RI_CNVI(:) + P_RS_DEPS(:) + PA_TH(:) = PA_TH(:) + P_TH_DEPS(:) + PA_RV(:) = PA_RV(:) - P_RS_DEPS(:) + +END IF +! +! Lambda_s limited for collection processes to prevent too high concentrations +! must be changed or removed if C and x modified +! +ZLBDS(:) = MIN( XLBDAS_MAX, ZLBDS(:)) +! +! +IF (LCOLD .AND. LSNOW) THEN + CALL LIMA_ICE_AGGREGATION_SNOW (LDCOMPUTE, & ! depends on IF, PF + ZT, PRHODREF, & + PRIT/ZIF1D, PRST/ZPF1D, PCIT/ZIF1D, ZLBDI, ZLBDS, & + P_RI_AGGS, P_CI_AGGS ) + P_CI_AGGS(:) = P_CI_AGGS(:) * ZIF1D(:) + P_RI_AGGS(:) = P_RI_AGGS(:) * ZIF1D(:) + ! + PA_RI(:) = PA_RI(:) + P_RI_AGGS(:) + PA_CI(:) = PA_CI(:) + P_CI_AGGS(:) + PA_RS(:) = PA_RS(:) - P_RI_AGGS(:) +END IF +! +IF (LWARM .AND. LCOLD) THEN + CALL LIMA_GRAUPEL_DEPOSITION (LDCOMPUTE, PRHODREF, & ! depends on PF ? + PRGT/ZPF1D, ZSSI, ZLBDG, ZAI, ZCJ, ZLSFACT, & + P_TH_DEPG, P_RG_DEPG ) + P_RG_DEPG(:) = P_RG_DEPG(:) * ZPF1D(:) + P_TH_DEPG(:) = P_RG_DEPG(:) * ZLSFACT(:) + ! + PA_RV(:) = PA_RV(:) - P_RG_DEPG(:) + PA_RG(:) = PA_RG(:) + P_RG_DEPG(:) + PA_TH(:) = PA_TH(:) + P_TH_DEPG(:) +END IF +! +!!$IF (LWARM .AND. LCOLD) THEN +!!$ CALL LIMA_BERGERON (LDCOMPUTE, & ! depends on CF, IF +!!$ PRCT, PRIT, PCIT, ZLBDI, & +!!$ ZSSIW, ZAI, ZCJ, ZLVFACT, ZLSFACT, & +!!$ P_TH_BERFI, P_RC_BERFI, & +!!$ PA_TH, PA_RC, PA_RI ) +!!$END IF +P_TH_BERFI(:) = 0. +P_RC_BERFI(:) = 0. +! +! +IF (LWARM .AND. LCOLD .AND. LSNOW) THEN + ! + ! Graupel production as tendency (or should be tendency + instant to stick to the previous version ?) + ! Includes the Hallett Mossop process for riming of droplets by snow (HMS) + ! + CALL LIMA_DROPLETS_RIMING_SNOW (PTSTEP, LDCOMPUTE, & ! depends on CF + PRHODREF, ZT, & + PRCT/ZCF1D, PCCT/ZCF1D, PRST/ZPF1D, ZLBDC, ZLBDS, ZLVFACT, ZLSFACT, & + P_TH_RIM, P_RC_RIM, P_CC_RIM, P_RS_RIM, P_RG_RIM, & + P_RI_HMS, P_CI_HMS, P_RS_HMS ) + P_RC_RIM(:) = P_RC_RIM(:) * ZCF1D(:) + P_CC_RIM(:) = P_CC_RIM(:) * ZCF1D(:) + P_RS_RIM(:) = P_RS_RIM(:) * ZCF1D(:) + P_RG_RIM(:) = P_RG_RIM(:) * ZCF1D(:) + P_TH_RIM(:) = - P_RC_RIM(:) * (ZLSFACT(:)-ZLVFACT(:)) + P_RI_HMS(:) = P_RI_HMS(:) * ZCF1D(:) + P_CI_HMS(:) = P_CI_HMS(:) * ZCF1D(:) + P_RS_HMS(:) = P_RS_HMS(:) * ZCF1D(:) + ! + PA_RC(:) = PA_RC(:) + P_RC_RIM(:) + PA_CC(:) = PA_CC(:) + P_CC_RIM(:) + PA_RI(:) = PA_RI(:) + P_RI_HMS(:) + PA_CI(:) = PA_CI(:) + P_CI_HMS(:) + PA_RS(:) = PA_RS(:) + P_RS_RIM(:) + P_RS_HMS(:) + PA_RG(:) = PA_RG(:) + P_RG_RIM(:) + PA_TH(:) = PA_TH(:) + P_TH_RIM(:) + +END IF +! +IF (LWARM .AND. LRAIN .AND. LCOLD .AND. LSNOW) THEN + CALL LIMA_RAIN_ACCR_SNOW (PTSTEP, LDCOMPUTE, & ! depends on PF + PRHODREF, ZT, & + PRRT/ZPF1D, PCRT/ZPF1D, PRST/ZPF1D, ZLBDR, ZLBDS, ZLVFACT, ZLSFACT, & + P_TH_ACC, P_RR_ACC, P_CR_ACC, P_RS_ACC, P_RG_ACC ) + P_RR_ACC(:) = P_RR_ACC(:) * ZPF1D(:) + P_CR_ACC(:) = P_CR_ACC(:) * ZPF1D(:) + P_RS_ACC(:) = P_RS_ACC(:) * ZPF1D(:) + P_RG_ACC(:) = P_RG_ACC(:) * ZPF1D(:) + P_TH_ACC(:) = - P_RR_ACC(:) * (ZLSFACT(:)-ZLVFACT(:)) + ! + PA_RR(:) = PA_RR(:) + P_RR_ACC(:) + PA_CR(:) = PA_CR(:) + P_CR_ACC(:) + PA_RS(:) = PA_RS(:) + P_RS_ACC(:) + PA_RG(:) = PA_RG(:) + P_RG_ACC(:) + PA_TH(:) = PA_TH(:) + P_TH_ACC(:) + +END IF +! +IF (LWARM .AND. LCOLD .AND. LSNOW) THEN + ! + ! Conversion melting of snow should account for collected droplets and drops where T>0C, but does not ! + ! Some thermodynamical computations inside, to externalize ? + ! + CALL LIMA_CONVERSION_MELTING_SNOW (LDCOMPUTE, & ! depends on PF + PRHODREF, PPABST, ZT, ZKA, ZDV, ZCJ, & + PRVT, PRST/ZPF1D, ZLBDS, & + P_RS_CMEL ) + P_RS_CMEL(:) = P_RS_CMEL(:) * ZPF1D(:) + ! + PA_RS(:) = PA_RS(:) + P_RS_CMEL(:) + PA_RG(:) = PA_RG(:) - P_RS_CMEL(:) + +END IF +! +IF (LWARM .AND. LRAIN .AND. LCOLD ) THEN + CALL LIMA_RAIN_FREEZING (LDCOMPUTE, & ! depends on PF, IF + PRHODREF, ZT, ZLVFACT, ZLSFACT, & + PRRT/ZPF1D, PCRT/ZPF1D, PRIT/ZIF1D, PCIT/ZIF1D, ZLBDR, & + P_TH_CFRZ, P_RR_CFRZ, P_CR_CFRZ, P_RI_CFRZ, P_CI_CFRZ ) + P_RR_CFRZ(:) = P_RR_CFRZ(:) * ZIF1D(:) + P_CR_CFRZ(:) = P_CR_CFRZ(:) * ZIF1D(:) + P_RI_CFRZ(:) = P_RI_CFRZ(:) * ZIF1D(:) + P_CI_CFRZ(:) = P_CI_CFRZ(:) * ZIF1D(:) + P_TH_CFRZ(:) = - P_RR_CFRZ(:) * (ZLSFACT(:)-ZLVFACT(:)) +! + PA_TH(:) = PA_TH(:) + P_TH_CFRZ(:) + PA_RR(:) = PA_RR(:) + P_RR_CFRZ(:) + PA_CR(:) = PA_CR(:) + P_CR_CFRZ(:) + PA_RI(:) = PA_RI(:) + P_RI_CFRZ(:) + PA_CI(:) = PA_CI(:) + P_CI_CFRZ(:) + PA_RG(:) = PA_RG(:) - P_RR_CFRZ(:) - P_RI_CFRZ(:) + +END IF +! +IF (LWARM .AND. LCOLD) THEN + ! + ! Melting of graupel should account for collected droplets and drops where T>0C, but does not ! + ! Collection and water shedding should also happen where T>0C, but do not ! + ! Hail production as tendency (should be instant to stick to the previous version ?) + ! Includes Hallett-Mossop process for riming of droplets by graupel (HMG) + ! Some thermodynamical computations inside, to externalize ? + ! + CALL LIMA_GRAUPEL (PTSTEP, LDCOMPUTE, & ! depends on PF, CF, IF + PRHODREF, PPABST, ZT, ZKA, ZDV, ZCJ, & + PRVT, PRCT, PRRT, PRIT, PRST, PRGT, & + PCCT, PCRT, PCIT, & + ZLBDC, ZLBDR, ZLBDS, ZLBDG, & + ZLVFACT, ZLSFACT, & + P_TH_WETG, P_RC_WETG, P_CC_WETG, P_RR_WETG, P_CR_WETG, & + P_RI_WETG, P_CI_WETG, P_RS_WETG, P_RG_WETG, P_RH_WETG, & + P_TH_DRYG, P_RC_DRYG, P_CC_DRYG, P_RR_DRYG, P_CR_DRYG, & + P_RI_DRYG, P_CI_DRYG, P_RS_DRYG, P_RG_DRYG, & + P_RI_HMG, P_CI_HMG, P_RG_HMG, & + P_TH_GMLT, P_RR_GMLT, P_CR_GMLT, & + PA_TH, PA_RC, PA_CC, PA_RR, PA_CR, & + PA_RI, PA_CI, PA_RS, PA_RG, PA_RH ) +END IF +! +IF (LWARM .AND. LCOLD .AND. LHAIL) THEN +! CALL LIMA_HAIL_GROWTH + +! CALL LIMA_HAIL_CONVERSION + +! CALL LIMA_HAIL_MELTING +END IF + ! +END SUBROUTINE LIMA_TENDENCIES diff --git a/src/mesonh/micro/lima_warm.f90 b/src/mesonh/micro/lima_warm.f90 new file mode 100644 index 000000000..14b1a09fc --- /dev/null +++ b/src/mesonh/micro/lima_warm.f90 @@ -0,0 +1,486 @@ +!MNH_LIC Copyright 2013-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ##################### + MODULE MODI_LIMA_WARM +! ##################### +! +INTERFACE + SUBROUTINE LIMA_WARM (OACTIT, OSEDC, ORAIN, KSPLITR, PTSTEP, KMI, & + TPFILE, KRR, PZZ, PRHODJ, & + PRHODREF, PEXNREF, PW_NU, PPABSM, PPABST, & + PTHM, PRCM, & + PTHT, PRT, PSVT, & + PTHS, PRS, PSVS, & + PINPRC, PINPRR, PINDEP, PINPRR3D, PEVAP3D ) +! +USE MODD_IO, ONLY: TFILEDATA +USE MODD_NSV, only: NSV_LIMA_BEG +! +LOGICAL, INTENT(IN) :: OACTIT ! Switch to activate the + ! activation by radiative + ! tendency +LOGICAL, INTENT(IN) :: OSEDC ! switch to activate the + ! cloud droplet sedimentation +LOGICAL, INTENT(IN) :: ORAIN ! switch to activate the + ! rain formation by coalescence +INTEGER, INTENT(IN) :: KSPLITR ! Number of small time step + ! for sedimendation +REAL, INTENT(IN) :: PTSTEP ! Double Time step + ! (single if cold start) +INTEGER, INTENT(IN) :: KMI ! Model index +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +INTEGER, INTENT(IN) :: KRR ! Number of moist variables +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PW_NU ! updraft velocity used for + ! the nucleation param. +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! abs. pressure at time t-dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHM ! Theta at time t-dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCM ! Cloud water m.r. at t-dt +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! m.r. at t +REAL, DIMENSION(:,:,:,NSV_LIMA_BEG:), INTENT(IN) :: PSVT ! Concentrations at time t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRS ! m.r. source +REAL, DIMENSION(:,:,:,NSV_LIMA_BEG:), INTENT(INOUT) :: PSVS ! Concentration sources +! +! +! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRC ! Cloud instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRR ! Rain instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINDEP ! Cloud droplets deposition +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRR3D ! Rain inst precip 3D +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEVAP3D ! Rain evap profile +! +END SUBROUTINE LIMA_WARM +END INTERFACE +END MODULE MODI_LIMA_WARM +! ##################################################################### + SUBROUTINE LIMA_WARM (OACTIT, OSEDC, ORAIN, KSPLITR, PTSTEP, KMI, & + TPFILE, KRR, PZZ, PRHODJ, & + PRHODREF, PEXNREF, PW_NU, PPABSM, PPABST, & + PTHM, PRCM, & + PTHT, PRT, PSVT, & + PTHS, PRS, PSVS, & + PINPRC, PINPRR, PINDEP, PINPRR3D, PEVAP3D ) +! ##################################################################### +! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the warm microphysical +!! sources: nucleation, sedimentation, autoconversion, accretion, +!! self-collection and vaporisation which are parameterized according +!! to Cohard and Pinty, QJRMS, 2000 +!! +!! +!!** METHOD +!! ------ +!! The activation of CCN is checked for quasi-saturated air parcels +!! to update the cloud droplet number concentration. Then assuming a +!! generalized gamma distribution law for the cloud droplets and the +!! raindrops, the zeroth and third order moments tendencies are evaluated +!! for all the coalescence terms by integrating the Stochastic Collection +!! Equation. As autoconversion is a process that cannot be resolved +!! analytically, the Berry-Reinhardt parameterisation is employed with +!! modifications to initiate the raindrop spectrum mode. The integration +!! of the raindrop evaporation below clouds is straightforward. +!! +!! The sedimentation rates are computed with a time spliting technique: +!! an upstream scheme, written as a difference of non-advective fluxes. +!! This source term is added to the next coming time step (split-implicit +!! process). +!! +!! REFERENCE +!! --------- +!! +!! Cohard, J.-M. and J.-P. Pinty, 2000: A comprehensive two-moment warm +!! microphysical bulk scheme. +!! Part I: Description and tests +!! Part II: 2D experiments with a non-hydrostatic model +!! Accepted for publication in Quart. J. Roy. Meteor. Soc. +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! C. Barthe * LACy * jan. 2014 add budgets +!! J. Escobar : for real*4 , use XMNH_HUGE +! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 02/2020: use the new data structures and subroutines for budgets (no more budget calls in this subroutine) +! B. Vie 03/02/2020: correction of activation of water deposition on the ground +! B. Vie 03/03/2020: use DTHRAD instead of dT/dt in Smax diagnostic computation +! P. Wautelet 28/05/2020: bugfix: correct array start for PSVT and PSVS +! P. Wautelet 02/02/2021: budgets: add missing source terms for SV budgets in LIMA +! B. Vie 06/2021 Add prognostic supersaturation for LIMA +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +use modd_budget, only: lbudget_th, lbudget_rv, lbudget_rc, lbudget_rr, lbudget_sv, & + NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, NBUDGET_RR, NBUDGET_SV1, & + tbudgets +USE MODD_CONF +USE MODD_CST +USE MODD_IO, ONLY: TFILEDATA +USE MODD_LUNIT_n, ONLY: TLUOUT +USE MODD_NSV +USE MODD_PARAMETERS +USE MODD_PARAM_LIMA +USE MODD_PARAM_LIMA_WARM + +use mode_budget, only: Budget_store_init, Budget_store_end + +USE MODI_LIMA_WARM_COAL +USE MODI_LIMA_WARM_EVAP +USE MODI_LIMA_WARM_NUCL +USE MODI_LIMA_WARM_SEDIMENTATION +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +LOGICAL, INTENT(IN) :: OACTIT ! Switch to activate the + ! activation by radiative + ! tendency +LOGICAL, INTENT(IN) :: OSEDC ! switch to activate the + ! cloud droplet sedimentation +LOGICAL, INTENT(IN) :: ORAIN ! switch to activate the + ! rain formation by coalescence +INTEGER, INTENT(IN) :: KSPLITR ! Number of small time step + ! for sedimendation +REAL, INTENT(IN) :: PTSTEP ! Double Time step + ! (single if cold start) +INTEGER, INTENT(IN) :: KMI ! Model index +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +INTEGER, INTENT(IN) :: KRR ! Number of moist variables +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PW_NU ! updraft velocity used for + ! the nucleation param. +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! abs. pressure at time t-dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHM ! Theta at time t-dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCM ! Cloud water m.r. at t-dt +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! m.r. at t +REAL, DIMENSION(:,:,:,NSV_LIMA_BEG:), INTENT(IN) :: PSVT ! Concentrations at time t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRS ! m.r. source +REAL, DIMENSION(:,:,:,NSV_LIMA_BEG:), INTENT(INOUT) :: PSVS ! Concentration sources +! +! +! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRC ! Cloud instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRR ! Rain instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINDEP ! Cloud droplets deposition +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRR3D ! Rain inst precip 3D +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEVAP3D ! Rain evap profile +! +!* 0.2 Declarations of local variables : +! +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: PRVT, & ! Water vapor m.r. at t + PRCT, & ! Cloud water m.r. at t + PRRT, & ! Rain water m.r. at t + ! + PRVS, & ! Water vapor m.r. source + PRCS, & ! Cloud water m.r. source + PRRS, & ! Rain water m.r. source + ! + PCCT, & ! Cloud water C. at t + PCRT, & ! Rain water C. at t + ! + PCCS, & ! Cloud water C. source + PCRS ! Rain water C. source +! +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZNFS ! CCN C. available source + !used as Free ice nuclei for + !HOMOGENEOUS nucleation of haze +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZNAS ! Cloud C. nuclei C. source + !used as Free ice nuclei for + !IMMERSION freezing +! +! +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: ZT +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: ZWLBDR,ZWLBDR3,ZWLBDC,ZWLBDC3 +integer :: idx +INTEGER :: JL +! +LOGICAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2)) :: GDEP +! +!------------------------------------------------------------------------------- +! +! +!* 0. 3D MICROPHYSCAL VARIABLES +! ------------------------- +! +! +! Prepare 3D water mixing ratios +PRVT(:,:,:) = PRT(:,:,:,1) +PRVS(:,:,:) = PRS(:,:,:,1) +! +PRCT(:,:,:) = 0. +PRCS(:,:,:) = 0. +PRRT(:,:,:) = 0. +PRRS(:,:,:) = 0. +! +IF ( KRR .GE. 2 ) PRCT(:,:,:) = PRT(:,:,:,2) +IF ( KRR .GE. 2 ) PRCS(:,:,:) = PRS(:,:,:,2) +IF ( KRR .GE. 3 ) PRRT(:,:,:) = PRT(:,:,:,3) +IF ( KRR .GE. 3 ) PRRS(:,:,:) = PRS(:,:,:,3) +! +! Prepare 3D number concentrations +PCCT(:,:,:) = 0. +PCRT(:,:,:) = 0. +PCCS(:,:,:) = 0. +PCRS(:,:,:) = 0. +! +IF ( LWARM ) PCCT(:,:,:) = PSVT(:,:,:,NSV_LIMA_NC) +IF ( LWARM .AND. LRAIN ) PCRT(:,:,:) = PSVT(:,:,:,NSV_LIMA_NR) +! +IF ( LWARM ) PCCS(:,:,:) = PSVS(:,:,:,NSV_LIMA_NC) +IF ( LWARM .AND. LRAIN ) PCRS(:,:,:) = PSVS(:,:,:,NSV_LIMA_NR) +! +IF ( NMOD_CCN .GE. 1 ) THEN + ALLOCATE( ZNFS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),NMOD_CCN) ) + ALLOCATE( ZNAS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),NMOD_CCN) ) + ZNFS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_CCN_FREE:NSV_LIMA_CCN_FREE+NMOD_CCN-1) + ZNAS(:,:,:,:) = PSVS(:,:,:,NSV_LIMA_CCN_ACTI:NSV_LIMA_CCN_ACTI+NMOD_CCN-1) +ELSE + ALLOCATE( ZNFS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),1) ) + ALLOCATE( ZNAS(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3),1) ) + ZNFS(:,:,:,:) = 0. + ZNAS(:,:,:,:) = 0. +END IF +! +!------------------------------------------------------------------------------- +! +! +!* 1. COMPUTE THE SLOPE PARAMETERS ZLBDC,ZLBDR +! ---------------------------------------- +! +! +ZWLBDC3(:,:,:) = XMNH_HUGE +ZWLBDC(:,:,:) = 1.E15 +! +WHERE (PRCT(:,:,:)>XRTMIN(2) .AND. PCCT(:,:,:)>XCTMIN(2)) + ZWLBDC3(:,:,:) = XLBC * PCCT(:,:,:) / PRCT(:,:,:) + ZWLBDC(:,:,:) = ZWLBDC3(:,:,:)**XLBEXC +END WHERE +! +ZWLBDR3(:,:,:) = 1.E30 +ZWLBDR(:,:,:) = 1.E10 +WHERE (PRRT(:,:,:)>XRTMIN(3) .AND. PCRT(:,:,:)>XCTMIN(3)) + ZWLBDR3(:,:,:) = XLBR * PCRT(:,:,:) / PRRT(:,:,:) + ZWLBDR(:,:,:) = ZWLBDR3(:,:,:)**XLBEXR +END WHERE +ZT(:,:,:) = PTHT(:,:,:) * (PPABST(:,:,:)/XP00)**(XRD/XCPD) +! +!------------------------------------------------------------------------------- +! +! +!* 2. COMPUTE THE SEDIMENTATION (RS) SOURCE +! ------------------------------------- +! +! +if ( lbudget_rc .and. osedc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'SEDI', prcs(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_rr .and. orain ) call Budget_store_init( tbudgets(NBUDGET_RR), 'SEDI', prrs(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_sv ) then + if ( osedc ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'SEDI', pccs(:, :, :) * prhodj(:, :, :) ) + if ( orain ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nr), 'SEDI', pcrs(:, :, :) * prhodj(:, :, :) ) +end if + +CALL LIMA_WARM_SEDIMENTATION (OSEDC, KSPLITR, PTSTEP, KMI, & + PZZ, PRHODREF, PPABST, ZT, & + ZWLBDC, & + PRCT, PRRT, PCCT, PCRT, & + PRCS, PRRS, PCCS, PCRS, & + PINPRC, PINPRR, & + PINPRR3D ) + +if ( lbudget_rc .and. osedc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'SEDI', prcs(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_rr .and. orain ) call Budget_store_end( tbudgets(NBUDGET_RR), 'SEDI', prrs(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_sv ) then + if ( osedc ) call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'SEDI', pccs(:, :, :) * prhodj(:, :, :) ) + if ( orain ) call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nr), 'SEDI', pcrs(:, :, :) * prhodj(:, :, :) ) +end if +! +! 2.bis Deposition at 1st level above ground +! +IF (LDEPOC) THEN + if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'DEPO', prcs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_sv ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'DEPO', pccs(:, :, :) * prhodj(:, :, :) ) + + PINDEP(:,:)=0. + GDEP(:,:) = .FALSE. + GDEP(:,:) = PRCS(:,:,2) >0 .AND. PCCS(:,:,2) >0 .AND. PRCT(:,:,2) >0 .AND. PCCT(:,:,2) >0 + WHERE (GDEP) + PRCS(:,:,2) = PRCS(:,:,2) - XVDEPOC * PRCT(:,:,2) / ( PZZ(:,:,3) - PZZ(:,:,2)) + PCCS(:,:,2) = PCCS(:,:,2) - XVDEPOC * PCCT(:,:,2) / ( PZZ(:,:,3) - PZZ(:,:,2)) + PINPRC(:,:) = PINPRC(:,:) + XVDEPOC * PRCT(:,:,2) * PRHODREF(:,:,2) /XRHOLW + PINDEP(:,:) = XVDEPOC * PRCT(:,:,2) * PRHODREF(:,:,2) /XRHOLW + END WHERE + + if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'DEPO', prcs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_sv ) call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'DEPO', pccs(:, :, :) * prhodj(:, :, :) ) +END IF +! +!------------------------------------------------------------------------------- +! +!* 2. COMPUTES THE NUCLEATION PROCESS SOURCES +! -------------------------------------- +! +! +IF ( LACTI .AND. NMOD_CCN > 0 .AND. .NOT. LSPRO ) THEN + if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'HENU', pths(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rv ) call Budget_store_init( tbudgets(NBUDGET_RV), 'HENU', prvs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'HENU', prcs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_sv ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'HENU', pccs(:, :, :) * prhodj(:, :, :) ) + do jl = 1, nmod_ccn + idx = NBUDGET_SV1 - 1 + nsv_lima_ccn_free - 1 + jl + call Budget_store_init( tbudgets(idx), 'HENU', znfs(:, :, :, jl) * prhodj(:, :, :) ) + idx = NBUDGET_SV1 - 1 + nsv_lima_ccn_acti - 1 + jl + call Budget_store_init( tbudgets(idx), 'HENU', znas(:, :, :, jl) * prhodj(:, :, :) ) + end do + end if + + CALL LIMA_WARM_NUCL( OACTIT, PTSTEP, KMI, TPFILE, & + PRHODREF, PEXNREF, PPABST, ZT, PTHM, PW_NU, & + PRCM, PRVT, PRCT, PRRT, & + PTHS, PRVS, PRCS, PCCS, ZNFS, ZNAS ) + + if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'HENU', pths(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rv ) call Budget_store_end( tbudgets(NBUDGET_RV), 'HENU', prvs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'HENU', prcs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_sv ) then + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'HENU', pccs(:, :, :) * prhodj(:, :, :) ) + do jl = 1, nmod_ccn + idx = NBUDGET_SV1 - 1 + nsv_lima_ccn_free - 1 + jl + call Budget_store_end( tbudgets(idx), 'HENU', znfs(:, :, :, jl) * prhodj(:, :, :) ) + idx = NBUDGET_SV1 - 1 + nsv_lima_ccn_acti - 1 + jl + call Budget_store_end( tbudgets(idx), 'HENU', znas(:, :, :, jl) * prhodj(:, :, :) ) + end do + end if +END IF ! LACTI +! +! +!------------------------------------------------------------------------------ +! +!* 3. COALESCENCE PROCESSES +! --------------------- +! +! + CALL LIMA_WARM_COAL (PTSTEP, KMI, & + PRHODREF, ZWLBDC3, ZWLBDC, ZWLBDR3, ZWLBDR, & + PRCT, PRRT, PCCT, PCRT, & + PRCS, PRRS, PCCS, PCRS, & + PRHODJ ) +! +! +!------------------------------------------------------------------------------- +! +! 4. EVAPORATION OF RAINDROPS +! ------------------------ +! +! +IF (ORAIN) THEN + + if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'REVA', pths(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rv ) call Budget_store_init( tbudgets(NBUDGET_RV), 'REVA', prvs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'REVA', prcs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_init( tbudgets(NBUDGET_RR), 'REVA', prrs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_sv ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'REVA', pccs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_sv ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nr), 'REVA', pcrs(:, :, :) * prhodj(:, :, :) ) + + CALL LIMA_WARM_EVAP (PTSTEP, KMI, & + PRHODREF, PEXNREF, PPABST, ZT, & + ZWLBDC3, ZWLBDC, ZWLBDR3, ZWLBDR, & + PRVT, PRCT, PRRT, PCRT, & + PRVS, PRCS, PRRS, PCCS, PCRS, PTHS, & + PEVAP3D ) + + if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'REVA', pths(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rv ) call Budget_store_end( tbudgets(NBUDGET_RV), 'REVA', prvs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'REVA', prcs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_end( tbudgets(NBUDGET_RR), 'REVA', prrs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_sv ) call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'REVA', pccs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_sv ) call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nr), 'REVA', pcrs(:, :, :) * prhodj(:, :, :) ) +!------------------------------------------------------------------------------- +! +! 5. SPONTANEOUS BREAK-UP (NUMERICAL FILTER) +! -------------------- +! + if ( lbudget_sv ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nr), 'BRKU', pcrs(:, :, :) * prhodj(:, :, :) ) + + ZWLBDR(:,:,:) = 1.E10 + WHERE (PRRS(:,:,:)>XRTMIN(3)/PTSTEP.AND.PCRS(:,:,:)>XCTMIN(3)/PTSTEP ) + ZWLBDR3(:,:,:) = XLBR * PCRS(:,:,:) / PRRS(:,:,:) + ZWLBDR(:,:,:) = ZWLBDR3(:,:,:)**XLBEXR + END WHERE + WHERE (ZWLBDR(:,:,:)<(XACCR1/XSPONBUD1)) + PCRS(:,:,:) = PCRS(:,:,:)*MAX((1.+XSPONCOEF2*(XACCR1/ZWLBDR(:,:,:)-XSPONBUD1)**2),& + (XACCR1/ZWLBDR(:,:,:)/XSPONBUD3)**3) + END WHERE +! +! Budget storage + if ( lbudget_sv ) call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nr), 'BRKU', pcrs(:, :, :) * prhodj(:, :, :) ) +ENDIF ! ORAIN +! +!------------------------------------------------------------------------------ +! +! +!* 6. REPORT 3D MICROPHYSICAL VARIABLES IN PRS AND PSVS +! ------------------------------------------------- +! +PRS(:,:,:,1) = PRVS(:,:,:) +IF ( KRR .GE. 2 ) PRS(:,:,:,2) = PRCS(:,:,:) +IF ( KRR .GE. 3 ) PRS(:,:,:,3) = PRRS(:,:,:) +! +! Prepare 3D number concentrations +! +IF ( LWARM ) PSVS(:,:,:,NSV_LIMA_NC) = PCCS(:,:,:) +IF ( LWARM .AND. LRAIN ) PSVS(:,:,:,NSV_LIMA_NR) = PCRS(:,:,:) +! +IF ( NMOD_CCN .GE. 1 ) THEN + PSVS(:,:,:,NSV_LIMA_CCN_FREE:NSV_LIMA_CCN_FREE+NMOD_CCN-1) = ZNFS(:,:,:,:) + PSVS(:,:,:,NSV_LIMA_CCN_ACTI:NSV_LIMA_CCN_ACTI+NMOD_CCN-1) = ZNAS(:,:,:,:) +END IF +! +IF (ALLOCATED(ZNFS)) DEALLOCATE(ZNFS) +IF (ALLOCATED(ZNAS)) DEALLOCATE(ZNAS) +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE LIMA_WARM diff --git a/src/mesonh/micro/lima_warm_coal.f90 b/src/mesonh/micro/lima_warm_coal.f90 new file mode 100644 index 000000000..4ec69ac58 --- /dev/null +++ b/src/mesonh/micro/lima_warm_coal.f90 @@ -0,0 +1,460 @@ +!MNH_LIC Copyright 2013-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ########################## + MODULE MODI_LIMA_WARM_COAL +! ########################## +! +INTERFACE + SUBROUTINE LIMA_WARM_COAL (PTSTEP, KMI, & + PRHODREF, ZWLBDC3, ZWLBDC, ZWLBDR3, ZWLBDR, & + PRCT, PRRT, PCCT, PCRT, & + PRCS, PRRS, PCCS, PCRS, & + PRHODJ ) +! +REAL, INTENT(IN) :: PTSTEP ! Double Time step + ! (single if cold start) +INTEGER, INTENT(IN) :: KMI ! Model index +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: ZWLBDC3 ! Lambda(cloud) **3 +REAL, DIMENSION(:,:,:), INTENT(IN) :: ZWLBDC ! Lambda(cloud) +REAL, DIMENSION(:,:,:), INTENT(IN) :: ZWLBDR3 ! Lambda(rain) **3 +REAL, DIMENSION(:,:,:), INTENT(IN) :: ZWLBDR ! Lambda(rain) +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCCT ! Cloud water C. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCRT ! Rain water C. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRRS ! Rain water m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCCS ! Cloud water C. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCRS ! Rain water C. source +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ +! + END SUBROUTINE LIMA_WARM_COAL +END INTERFACE +END MODULE MODI_LIMA_WARM_COAL +! ############################################################################# + SUBROUTINE LIMA_WARM_COAL (PTSTEP, KMI, & + PRHODREF, ZWLBDC3, ZWLBDC, ZWLBDR3, ZWLBDR, & + PRCT, PRRT, PCCT, PCRT, & + PRCS, PRRS, PCCS, PCRS, & + PRHODJ ) +! ############################################################################# +! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the microphysical sources: +!! nucleation, sedimentation, autoconversion, accretion, self-collection +!! and vaporisation which are parameterized according to Cohard and Pinty +!! QJRMS, 2000 +!! +!! +!!** METHOD +!! ------ +!! Assuming a generalized gamma distribution law for the cloud droplets +!! and the raindrops, the zeroth and third order moments tendencies +!! are evaluated for all the coalescence terms by integrating the +!! Stochastic Collection Equation. As autoconversion is a process that +!! cannot be resolved analytically, the Berry-Reinhardt parameterisation +!! is employed with modifications to initiate the raindrop spectrum mode. +!! +!! Computation steps : +!! 1- Check where computations are necessary, pack variables +!! 2- Self collection of cloud droplets +!! 3- Autoconversion of cloud droplets (Berry-Reinhardt parameterization) +!! 4- Accretion sources +!! 5- Self collection - Coalescence/Break-up +!! 6- Unpack variables, clean +!! +!! +!! REFERENCE +!! --------- +!! +!! Cohard, J.-M. and J.-P. Pinty, 2000: A comprehensive two-moment warm +!! microphysical bulk scheme. +!! Part I: Description and tests +!! Part II: 2D experiments with a non-hydrostatic model +!! Accepted for publication in Quart. J. Roy. Meteor. Soc. +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! C. Barthe * LACy * jan. 2014 add budgets +! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 +! P. Wautelet 02/2020: use the new data structures and subroutines for budgets (no more budget calls in this subroutine) +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +use modd_budget, only: lbudget_rc, lbudget_rr, lbudget_sv, NBUDGET_RC, NBUDGET_RR, NBUDGET_SV1, tbudgets +USE MODD_NSV, ONLY: NSV_LIMA_NC, NSV_LIMA_NR +USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT +USE MODD_PARAM_LIMA +USE MODD_PARAM_LIMA_WARM + +use mode_budget, only: Budget_store_init, Budget_store_end +use mode_tools, only: Countjv + +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +REAL, INTENT(IN) :: PTSTEP ! Double Time step + ! (single if cold start) +INTEGER, INTENT(IN) :: KMI ! Model index +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: ZWLBDC3 ! Lambda(cloud) **3 +REAL, DIMENSION(:,:,:), INTENT(IN) :: ZWLBDC ! Lambda(cloud) +REAL, DIMENSION(:,:,:), INTENT(IN) :: ZWLBDR3 ! Lambda(rain) **3 +REAL, DIMENSION(:,:,:), INTENT(IN) :: ZWLBDR ! Lambda(rain) +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCCT ! Cloud water C. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCRT ! Rain water C. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRRS ! Rain water m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCCS ! Cloud water C. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCRS ! Rain water C. source +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ +! +!* 0.1 Declarations of local variables : +! +! Packing variables +LOGICAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) :: GMICRO +INTEGER :: IMICRO +INTEGER , DIMENSION(SIZE(GMICRO)) :: I1,I2,I3 ! Used to replace the COUNT +INTEGER :: JL ! and PACK intrinsics +! +! Packed micophysical variables +REAL, DIMENSION(:) , ALLOCATABLE :: ZRCT ! Cloud water m.r. at t +REAL, DIMENSION(:) , ALLOCATABLE :: ZRRT ! Rain water m.r. at t +REAL, DIMENSION(:) , ALLOCATABLE :: ZCCT ! cloud conc. at t +REAL, DIMENSION(:) , ALLOCATABLE :: ZCRT ! rain conc. at t +! +REAL, DIMENSION(:) , ALLOCATABLE :: ZRCS ! Cloud water m.r. source +REAL, DIMENSION(:) , ALLOCATABLE :: ZRRS ! Rain water m.r. source +REAL, DIMENSION(:) , ALLOCATABLE :: ZCCS ! cloud conc. source +REAL, DIMENSION(:) , ALLOCATABLE :: ZCRS ! rain conc. source +! +! Other packed variables +REAL, DIMENSION(:) , ALLOCATABLE :: ZRHODREF ! RHO Dry REFerence +REAL, DIMENSION(:) , ALLOCATABLE :: ZLBDC3 +REAL, DIMENSION(:) , ALLOCATABLE :: ZLBDC +REAL, DIMENSION(:) , ALLOCATABLE :: ZLBDR3 +REAL, DIMENSION(:) , ALLOCATABLE :: ZLBDR +! +! Work arrays +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) :: ZW +! +REAL, DIMENSION(:), ALLOCATABLE :: ZZW1, ZZW2, ZZW3, ZZW4, ZSCBU +LOGICAL, DIMENSION(:), ALLOCATABLE :: GSELF, & + GACCR, & + GSCBU, & + GENABLE_ACCR_SCBU +! +! +INTEGER :: ISELF, IACCR, ISCBU +INTEGER :: IIB, IIE, IJB, IJE, IKB, IKE ! Physical domain +! +!------------------------------------------------------------------------------- +! +! +!* 1. PREPARE COMPUTATIONS - PACK +! --------------------------- +! +! +IIB=1+JPHEXT +IIE=SIZE(PRHODREF,1) - JPHEXT +IJB=1+JPHEXT +IJE=SIZE(PRHODREF,2) - JPHEXT +IKB=1+JPVEXT +IKE=SIZE(PRHODREF,3) - JPVEXT +! +GMICRO(:,:,:) = .FALSE. +GMICRO(IIB:IIE,IJB:IJE,IKB:IKE) = & + PRCT(IIB:IIE,IJB:IJE,IKB:IKE)>XRTMIN(2) .OR. & + PRRT(IIB:IIE,IJB:IJE,IKB:IKE)>XRTMIN(3) +! +IMICRO = COUNTJV( GMICRO(:,:,:),I1(:),I2(:),I3(:)) +! +IF( IMICRO >= 1 ) THEN + ALLOCATE(ZRCT(IMICRO)) + ALLOCATE(ZRRT(IMICRO)) + ALLOCATE(ZCCT(IMICRO)) + ALLOCATE(ZCRT(IMICRO)) +! + ALLOCATE(ZRCS(IMICRO)) + ALLOCATE(ZRRS(IMICRO)) + ALLOCATE(ZCCS(IMICRO)) + ALLOCATE(ZCRS(IMICRO)) +! + ALLOCATE(ZLBDC(IMICRO)) + ALLOCATE(ZLBDC3(IMICRO)) + ALLOCATE(ZLBDR(IMICRO)) + ALLOCATE(ZLBDR3(IMICRO)) +! + ALLOCATE(ZRHODREF(IMICRO)) + DO JL=1,IMICRO + ZCCT(JL) = PCCT(I1(JL),I2(JL),I3(JL)) + ZRCT(JL) = PRCT(I1(JL),I2(JL),I3(JL)) + ZRRT(JL) = PRRT(I1(JL),I2(JL),I3(JL)) + ZCRT(JL) = PCRT(I1(JL),I2(JL),I3(JL)) + ZCCS(JL) = PCCS(I1(JL),I2(JL),I3(JL)) + ZRCS(JL) = PRCS(I1(JL),I2(JL),I3(JL)) + ZRRS(JL) = PRRS(I1(JL),I2(JL),I3(JL)) + ZCRS(JL) = PCRS(I1(JL),I2(JL),I3(JL)) + ZLBDR(JL) = ZWLBDR(I1(JL),I2(JL),I3(JL)) + ZLBDR3(JL) = ZWLBDR3(I1(JL),I2(JL),I3(JL)) + ZLBDC(JL) = ZWLBDC(I1(JL),I2(JL),I3(JL)) + ZLBDC3(JL) = ZWLBDC3(I1(JL),I2(JL),I3(JL)) + ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) + END DO +! + ALLOCATE(GSELF(IMICRO)) + ALLOCATE(GACCR(IMICRO)) + ALLOCATE(GSCBU(IMICRO)) + ALLOCATE(ZZW1(IMICRO)) + ALLOCATE(ZZW2(IMICRO)) + ALLOCATE(ZZW3(IMICRO)) +! +! +!------------------------------------------------------------------------------- +! +IF (LRAIN) THEN +! +!* 2. Self-collection of cloud droplets +! ------------------------------------ +! +! + if ( lbudget_sv ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'SELF', pccs(:, :, :) * prhodj(:, :, :) ) + + GSELF(:) = ZCCT(:)>XCTMIN(2) + ISELF = COUNT(GSELF(:)) + IF( ISELF>0 ) THEN + ZZW1(:) = XSELFC*(ZCCT(:)/ZLBDC3(:))**2 * ZRHODREF(:) ! analytical integration + WHERE( GSELF(:) ) + ZCCS(:) = ZCCS(:) - MIN( ZCCS(:),ZZW1(:) ) + END WHERE + END IF + + if ( lbudget_sv ) call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'SELF', & + Unpack( zccs(:), mask = gmicro(:, :, :), field = pccs(:, :, :) ) * prhodj(:, :, :) ) + +!------------------------------------------------------------------------------- +! +! +!* 3. Autoconversion of cloud droplets (Berry-Reinhardt parameterization) +! ---------------------------------------------------------------------- +! +! +! + if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'AUTO', prcs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_init( tbudgets(NBUDGET_RR), 'AUTO', prrs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_sv ) then + !call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'AUTO', pccs(:, :, :) * prhodj(:, :, :) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nr), 'AUTO', pcrs(:, :, :) * prhodj(:, :, :) ) + end if + + ZZW2(:) = 0.0 + ZZW1(:) = 0.0 + WHERE( ZRCT(:)>XRTMIN(2) ) + ZZW2(:) = MAX( 0.0,XLAUTR*ZRHODREF(:)*ZRCT(:)* & + (XAUTO1/min(ZLBDC(:),1.e9)**4-XLAUTR_THRESHOLD) ) ! L +! + ZZW3(:) = MIN( ZRCS(:), MAX( 0.0,XITAUTR*ZZW2(:)*ZRCT(:)* & + (XAUTO2/ZLBDC(:)-XITAUTR_THRESHOLD) ) ) ! L/tau +! + ZRCS(:) = ZRCS(:) - ZZW3(:) + ZRRS(:) = ZRRS(:) + ZZW3(:) +! + ZZW1(:) = MIN( MIN( 1.2E4,(XACCR4/ZLBDC(:)-XACCR5)/XACCR3), & + ZLBDR(:)/XACCR1 ) ! D**-1 threshold diameter for + ! switching the autoconversion regimes + ! min (80 microns, D_h, D_r) + ZZW3(:) = ZZW3(:) * MAX( 0.0,ZZW1(:) )**3 / XAC + ZCRS(:) = ZCRS(:) + ZZW3(:) + END WHERE + + if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'AUTO', & + Unpack( zrcs(:), mask = gmicro(:, :, :), field = prcs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_end( tbudgets(NBUDGET_RR), 'AUTO', & + Unpack( zrrs(:), mask = gmicro(:, :, :), field = prrs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_sv ) then + !This budget is = 0 for nsv_lima_nc => not necessary to call it (ZCCS is not modified in this part) + !call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'AUTO', & + ! Unpack( zccs(:), mask = gmicro(:, :, :), field = pccs(:, :, :) ) * prhodj(:, :, :) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nr), 'AUTO', & + Unpack( zcrs(:), mask = gmicro(:, :, :), field = pcrs(:, :, :) ) * prhodj(:, :, :) ) + end if + +!------------------------------------------------------------------------------- +! +! +!* 4. Accretion sources +! -------------------- +! +! + GACCR(:) = ZRRT(:)>XRTMIN(3) .AND. ZCRT(:)>XCTMIN(3) + IACCR = COUNT(GACCR(:)) + IF( IACCR>0 ) THEN + ALLOCATE(ZZW4(IMICRO)); ZZW4(:) = XACCR1/ZLBDR(:) + ALLOCATE(GENABLE_ACCR_SCBU(IMICRO)) + GENABLE_ACCR_SCBU(:) = ZRRT(:)>1.2*ZZW2(:)/ZRHODREF(:) .OR. & + ZZW4(:)>=MAX( XACCR2,XACCR3/(XACCR4/ZLBDC(:)-XACCR5) ) + GACCR(:) = GACCR(:) .AND. ZRCT(:)>XRTMIN(2) .AND. ZCCT(:)>XCTMIN(2) .AND. GENABLE_ACCR_SCBU(:) + END IF +! + IACCR = COUNT(GACCR(:)) + IF( IACCR>0 ) THEN + if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'ACCR', & + Unpack( zrcs(:), mask = gmicro(:, :, :), field = prcs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_init( tbudgets(NBUDGET_RR), 'ACCR', & + Unpack( zrrs(:), mask = gmicro(:, :, :), field = prrs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_sv ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'ACCR', & + Unpack( zccs(:), mask = gmicro(:, :, :), field = pccs(:, :, :) ) * prhodj(:, :, :) ) + WHERE( GACCR(:).AND.(ZZW4(:)>1.E-4) ) ! Accretion for D>100 10-6 m + ZZW3(:) = ZLBDC3(:) / ZLBDR3(:) + ZZW1(:) = ( ZCCT(:)*ZCRT(:) / ZLBDC3(:) )*ZRHODREF(:) + ZZW2(:) = MIN( ZZW1(:)*(XACCR_CLARGE1+XACCR_CLARGE2*ZZW3(:)),ZCCS(:) ) + ZCCS(:) = ZCCS(:) - ZZW2(:) +! + ZZW1(:) = ( ZZW1(:) / ZLBDC3(:) ) + ZZW2(:) = MIN( ZZW1(:)*(XACCR_RLARGE1+XACCR_RLARGE2*ZZW3(:)),ZRCS(:) ) + ZRCS(:) = ZRCS(:) - ZZW2(:) + ZRRS(:) = ZRRS(:) + ZZW2(:) + END WHERE + WHERE( GACCR(:).AND.(ZZW4(:)<=1.E-4) ) ! Accretion for D<100 10-6 m + ZZW3(:) = MIN(ZLBDC3(:) / ZLBDR3(:), 1.E8) + ZZW1(:) = ( ZCCT(:)*ZCRT(:) / ZLBDC3(:) )*ZRHODREF(:) + ZZW1(:) = ZZW1(:) / ZLBDC3(:) + ZZW3(:) = ZZW3(:)**2 + ZZW2(:) = MIN( ZZW1(:)*(XACCR_CSMALL1+XACCR_CSMALL2*ZZW3(:)),ZCCS(:) ) + ZCCS(:) = ZCCS(:) - ZZW2(:) +! + ZZW1(:) = ZZW1(:) / ZLBDC3(:) + ZZW2(:) = MIN( ZZW1(:)*(XACCR_RSMALL1+XACCR_RSMALL2*ZZW3(:)) & + ,ZRCS(:) ) + ZRCS(:) = ZRCS(:) - ZZW2(:) + ZRRS(:) = ZRRS(:) + ZZW2(:) + END WHERE + + if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'ACCR', & + Unpack( zrcs(:), mask = gmicro(:, :, :), field = prcs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_end( tbudgets(NBUDGET_RR), 'ACCR', & + Unpack( zrrs(:), mask = gmicro(:, :, :), field = prrs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_sv ) call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nc), 'ACCR', & + Unpack( zccs(:), mask = gmicro(:, :, :), field = pccs(:, :, :) ) * prhodj(:, :, :) ) + END IF +!------------------------------------------------------------------------------- +! +! +!* 5. Self collection - Coalescence/Break-up +! ----------------------------------------- +! +! + IF( IACCR>0 ) THEN + GSCBU(:) = ZCRT(:)>XCTMIN(3) .AND. GENABLE_ACCR_SCBU(:) + ISCBU = COUNT(GSCBU(:)) + ELSE + ISCBU = 0.0 + END IF + IF( ISCBU>0 ) THEN + if ( lbudget_sv ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nr), 'SCBU', & + Unpack( zcrs(:), mask = gmicro(:, :, :), field = pcrs(:, :, :) ) * prhodj(:, :, :) ) +! +!* 5.1 efficiencies +! + IF (.NOT.ALLOCATED(ZZW4)) ALLOCATE(ZZW4(IMICRO)) + ZZW4(:) = XACCR1 / ZLBDR(:) ! Mean diameter + ALLOCATE(ZSCBU(IMICRO)) + ZSCBU(:) = 1.0 + WHERE (ZZW4(:)>=XSCBU_EFF1 .AND. GSCBU(:)) ZSCBU(:) = & ! Coalescence + EXP(XSCBUEXP1*(ZZW4(:)-XSCBU_EFF1)) ! efficiency + WHERE (ZZW4(:)>=XSCBU_EFF2) ZSCBU(:) = 0.0 ! Break-up +! +!* 5.2 integration +! + ZZW1(:) = 0.0 + ZZW2(:) = 0.0 + ZZW3(:) = 0.0 + ZZW4(:) = XACCR1 / ZLBDR(:) ! Mean volume drop diameter + WHERE (GSCBU(:).AND.(ZZW4(:)>1.E-4)) ! analytical integration + ZZW1(:) = XSCBU2 * ZCRT(:)**2 / ZLBDR3(:) ! D>100 10-6 m + ZZW3(:) = ZZW1(:)*ZSCBU(:) + END WHERE + WHERE (GSCBU(:).AND.(ZZW4(:)<=1.E-4)) + ZZW2(:) = XSCBU3 *(ZCRT(:) / ZLBDR3(:))**2 ! D<100 10-6 m + ZZW3(:) = ZZW2(:) + END WHERE + ZCRS(:) = ZCRS(:) - MIN( ZCRS(:),ZZW3(:) * ZRHODREF(:) ) + DEALLOCATE(ZSCBU) + if ( lbudget_sv ) call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_lima_nr), 'SCBU', & + Unpack( zcrs(:), mask = gmicro(:, :, :), field = pcrs(:, :, :) ) * prhodj(:, :, :) ) + END IF +END IF ! LRAIN +! +! +!------------------------------------------------------------------------------- +! +! +!* 6. Unpack and clean +! ------------------- +! +! + ZW(:,:,:) = PRCS(:,:,:) + PRCS(:,:,:) = UNPACK( ZRCS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PRRS(:,:,:) + PRRS(:,:,:) = UNPACK( ZRRS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PCCS(:,:,:) + PCCS(:,:,:) = UNPACK( ZCCS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PCRS(:,:,:) + PCRS(:,:,:) = UNPACK( ZCRS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) +! + DEALLOCATE(ZRCT) + DEALLOCATE(ZRRT) + DEALLOCATE(ZCCT) + DEALLOCATE(ZCRT) + DEALLOCATE(ZRCS) + DEALLOCATE(ZRRS) + DEALLOCATE(ZCRS) + DEALLOCATE(ZCCS) + DEALLOCATE(ZRHODREF) + DEALLOCATE(GSELF) + DEALLOCATE(GACCR) + DEALLOCATE(GSCBU) + IF( ALLOCATED(GENABLE_ACCR_SCBU) ) DEALLOCATE(GENABLE_ACCR_SCBU) + DEALLOCATE(ZZW1) + DEALLOCATE(ZZW2) + DEALLOCATE(ZZW3) + IF( ALLOCATED(ZZW4) ) DEALLOCATE(ZZW4) + DEALLOCATE(ZLBDR3) + DEALLOCATE(ZLBDC3) + DEALLOCATE(ZLBDR) + DEALLOCATE(ZLBDC) +END IF ! IMICRO +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE LIMA_WARM_COAL diff --git a/src/mesonh/micro/lima_warm_evap.f90 b/src/mesonh/micro/lima_warm_evap.f90 new file mode 100644 index 000000000..9a67a4b82 --- /dev/null +++ b/src/mesonh/micro/lima_warm_evap.f90 @@ -0,0 +1,353 @@ +!MNH_LIC Copyright 2013-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ########################## + MODULE MODI_LIMA_WARM_EVAP +! ########################## +! +INTERFACE + SUBROUTINE LIMA_WARM_EVAP (PTSTEP, KMI, & + PRHODREF, PEXNREF, PPABST, ZT, & + ZWLBDC3, ZWLBDC, ZWLBDR3, ZWLBDR, & + PRVT, PRCT, PRRT, PCRT, & + PRVS, PRCS, PRRS, PCCS, PCRS, PTHS, & + PEVAP3D) +! +REAL, INTENT(IN) :: PTSTEP ! Double Time step + ! (single if cold start) +INTEGER, INTENT(IN) :: KMI ! Model index +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: ZT ! Temperature +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: ZWLBDC3 ! Lambda(cloud) **3 +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: ZWLBDC ! Lambda(cloud) +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: ZWLBDR3 ! Lambda(rain) **3 +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: ZWLBDR ! Lambda(rain) +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCRT ! Rain water C. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVS ! Water vapor m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRRS ! Rain water m.r. source +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCCS ! Cloud water C. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCRS ! Rain water C. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEVAP3D ! Rain evap profile +! + END SUBROUTINE LIMA_WARM_EVAP +END INTERFACE +END MODULE MODI_LIMA_WARM_EVAP +! ############################################################################# + SUBROUTINE LIMA_WARM_EVAP (PTSTEP, KMI, & + PRHODREF, PEXNREF, PPABST, ZT, & + ZWLBDC3, ZWLBDC, ZWLBDR3, ZWLBDR, & + PRVT, PRCT, PRRT, PCRT, & + PRVS, PRCS, PRRS, PCCS, PCRS, PTHS, & + PEVAP3D) +! ############################################################################# +! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the raindrop evaporation +!! +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT +USE MODD_PARAM_LIMA +USE MODD_PARAM_LIMA_WARM +! +use mode_tools, only: Countjv +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +REAL, INTENT(IN) :: PTSTEP ! Double Time step + ! (single if cold start) +INTEGER, INTENT(IN) :: KMI ! Model index +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: ZT ! Temperature +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: ZWLBDC3 ! Lambda(cloud) **3 +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: ZWLBDC ! Lambda(cloud) +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: ZWLBDR3 ! Lambda(rain) **3 +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: ZWLBDR ! Lambda(rain) +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCRT ! Rain water C. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVS ! Water vapor m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRRS ! Rain water m.r. source +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCCS ! Cloud water C. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCRS ! Rain water C. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEVAP3D ! Rain evap profile +! +!* 0.1 Declarations of local variables : +! +! Packing variables +LOGICAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) :: GEVAP, GMICRO +INTEGER :: IEVAP, IMICRO +INTEGER , DIMENSION(SIZE(GEVAP)) :: I1,I2,I3 ! Used to replace the COUNT +INTEGER :: JL ! and PACK intrinsics +! +! Packed micophysical variables +REAL, DIMENSION(:) , ALLOCATABLE :: ZRVT ! Water vapor m.r. at t +REAL, DIMENSION(:) , ALLOCATABLE :: ZRCT ! Cloud water m.r. at t +REAL, DIMENSION(:) , ALLOCATABLE :: ZRRT ! Rain water m.r. at t +REAL, DIMENSION(:) , ALLOCATABLE :: ZCRT ! rain conc. at t +! +REAL, DIMENSION(:) , ALLOCATABLE :: ZRVS ! Water vapor m.r. source +REAL, DIMENSION(:) , ALLOCATABLE :: ZRRS ! Rain water m.r. source +REAL, DIMENSION(:) , ALLOCATABLE :: ZTHS ! Theta source +! +! Other packed variables +REAL, DIMENSION(:) , ALLOCATABLE :: ZRHODREF ! RHO Dry REFerence +REAL, DIMENSION(:) , ALLOCATABLE :: ZEXNREF ! EXNer Pressure REFerence +REAL, DIMENSION(:) , ALLOCATABLE :: ZZT ! Temperature +REAL, DIMENSION(:) , ALLOCATABLE :: ZLBDR ! Lambda(rain) +! +! Work arrays +REAL, DIMENSION(:), ALLOCATABLE :: ZZW1, ZZW2, ZZW3, & + ZRTMIN, ZCTMIN, & + ZZLV ! Latent heat of vaporization at T +! +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: ZW, ZW2, ZRVSAT, ZDR +! +! +REAL :: ZEPS, ZFACT +INTEGER :: IIB, IIE, IJB, IJE, IKB, IKE ! Physical domain +! +!------------------------------------------------------------------------------- +! +! +!* 1. PREPARE COMPUTATIONS - PACK +! --------------------------- +! +! +IIB=1+JPHEXT +IIE=SIZE(PRHODREF,1) - JPHEXT +IJB=1+JPHEXT +IJE=SIZE(PRHODREF,2) - JPHEXT +IKB=1+JPVEXT +IKE=SIZE(PRHODREF,3) - JPVEXT +! +ALLOCATE(ZRTMIN(SIZE(XRTMIN))) +ALLOCATE(ZCTMIN(SIZE(XCTMIN))) +ZRTMIN(:) = XRTMIN(:) / PTSTEP +ZCTMIN(:) = XCTMIN(:) / PTSTEP +! +ZEPS= XMV / XMD +ZRVSAT(:,:,:) = ZEPS / (PPABST(:,:,:) * & + EXP(-XALPW+XBETAW/ZT(:,:,:)+XGAMW*ALOG(ZT(:,:,:))) - 1.0) + +! +GEVAP(:,:,:) = .FALSE. +GEVAP(IIB:IIE,IJB:IJE,IKB:IKE) = & + PRRS(IIB:IIE,IJB:IJE,IKB:IKE)>ZRTMIN(3) .AND. & + PRVT(IIB:IIE,IJB:IJE,IKB:IKE)<ZRVSAT(IIB:IIE,IJB:IJE,IKB:IKE) +! +IEVAP = COUNTJV( GEVAP(:,:,:),I1(:),I2(:),I3(:)) +! +IF( IEVAP >= 1 ) THEN + ALLOCATE(ZRVT(IEVAP)) + ALLOCATE(ZRCT(IEVAP)) + ALLOCATE(ZRRT(IEVAP)) + ALLOCATE(ZCRT(IEVAP)) +! + ALLOCATE(ZRVS(IEVAP)) + ALLOCATE(ZRRS(IEVAP)) + ALLOCATE(ZTHS(IEVAP)) +! + ALLOCATE(ZLBDR(IEVAP)) +! + ALLOCATE(ZRHODREF(IEVAP)) + ALLOCATE(ZEXNREF(IEVAP)) +! + ALLOCATE(ZZT(IEVAP)) + ALLOCATE(ZZLV(IEVAP)) + ALLOCATE(ZZW1(IEVAP)) + DO JL=1,IEVAP + ZRVT(JL) = PRVT(I1(JL),I2(JL),I3(JL)) + ZRCT(JL) = PRCT(I1(JL),I2(JL),I3(JL)) + ZRRT(JL) = PRRT(I1(JL),I2(JL),I3(JL)) + ZCRT(JL) = PCRT(I1(JL),I2(JL),I3(JL)) + ZRRS(JL) = PRRS(I1(JL),I2(JL),I3(JL)) + ZRVS(JL) = PRVS(I1(JL),I2(JL),I3(JL)) + ZTHS(JL) = PTHS(I1(JL),I2(JL),I3(JL)) + ZZT(JL) = ZT(I1(JL),I2(JL),I3(JL)) + ZZW1(JL) = ZRVSAT(I1(JL),I2(JL),I3(JL)) + ZLBDR(JL) = ZWLBDR(I1(JL),I2(JL),I3(JL)) + ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) + ZEXNREF(JL) = PEXNREF(I1(JL),I2(JL),I3(JL)) + END DO + ZZLV(:) = XLVTT + (XCPV-XCL)*(ZZT(:)-XTT) +! + ALLOCATE(ZZW2(IEVAP)) + ALLOCATE(ZZW3(IEVAP)) +! +! +!------------------------------------------------------------------------------- +! +! +!* 2. compute the evaporation of rain drops +! ---------------------------------------- +! +! + ZZW3(:) = MAX((1.0 - ZRVT(:)/ZZW1(:)),0.0) ! Subsaturation +! +! Compute the function G(T) +! + ZZW2(:) = 1. / ( XRHOLW*((((ZZLV(:)/ZZT(:))**2)/(XTHCO*XRV)) + & ! G + (XRV*ZZT(:))/(XDIVA*EXP(XALPW-XBETAW/ZZT(:)-XGAMW*ALOG(ZZT(:)))))) +! +! Compute the evaporation tendency +! + ZZW2(:) = MIN( ZZW2(:) * ZZW3(:) * ZRRT(:) * & + (X0EVAR*ZLBDR(:)**XEX0EVAR + X1EVAR*ZRHODREF(:)**XEX2EVAR* & + ZLBDR(:)**XEX1EVAR),ZRRS(:) ) + ZZW2(:) = MAX(ZZW2(:),0.0) +! +! Adjust sources +! + ZRVS(:) = ZRVS(:) + ZZW2(:) + ZRRS(:) = ZRRS(:) - ZZW2(:) + ZTHS(:) = ZTHS(:) - ZZW2(:)*ZZLV(:) / & + ( ZEXNREF(:)*(XCPD + XCPV*ZRVT(:) + XCL*(ZRCT(:) + ZRRT(:)) ) ) +! +! +!------------------------------------------------------------------------------- +! +! +!* 3. Unpack and clean +! ------------------- +! +! + ZW(:,:,:) = PRVS(:,:,:) + PRVS(:,:,:) = UNPACK( ZRVS(:),MASK=GEVAP(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PRRS(:,:,:) + PRRS(:,:,:) = UNPACK( ZRRS(:),MASK=GEVAP(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PTHS(:,:,:) + PTHS(:,:,:) = UNPACK( ZTHS(:),MASK=GEVAP(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:)= PEVAP3D(:,:,:) + PEVAP3D(:,:,:) = UNPACK( ZZW2(:),MASK=GEVAP(:,:,:),FIELD=ZW(:,:,:) ) +! + DEALLOCATE(ZRCT) + DEALLOCATE(ZRRT) + DEALLOCATE(ZRVT) + DEALLOCATE(ZCRT) + DEALLOCATE(ZRVS) + DEALLOCATE(ZRRS) + DEALLOCATE(ZTHS) + DEALLOCATE(ZZLV) + DEALLOCATE(ZZT) + DEALLOCATE(ZRHODREF) + DEALLOCATE(ZEXNREF) + DEALLOCATE(ZZW1) + DEALLOCATE(ZZW2) + DEALLOCATE(ZZW3) + DEALLOCATE(ZLBDR) +! +! +!----------------------------------------------------------------------------- +! +! +!* 4. Update Nr if: 80 microns < Dr < D_h +! --------------------------------------- +! +! + GEVAP(:,:,:) = PRRS(:,:,:)>ZRTMIN(3) .AND. PCRS(:,:,:)>ZCTMIN(3) + ZDR(:,:,:) = 9999. + WHERE (GEVAP(:,:,:)) + ZDR(:,:,:)=(6.*PRRS(:,:,:)/XPI/XRHOLW/PCRS(:,:,:))**0.33 + ZWLBDR3(:,:,:) = XLBR * PCRS(:,:,:) / PRRS(:,:,:) + ZWLBDR(:,:,:) = ZWLBDR3(:,:,:)**XLBEXR + END WHERE + ! + WHERE (GEVAP(:,:,:) .AND. ZDR(:,:,:).LT.82.E-6) + PCCS(:,:,:) = PCCS(:,:,:)+PCRS(:,:,:) + PCRS(:,:,:) = 0. + PRCS(:,:,:) = PRCS(:,:,:)+PRRS(:,:,:) + PRRS(:,:,:) = 0. + END WHERE + +!!$ GMICRO(:,:,:) = GEVAP(:,:,:) .AND. ZWLBDR(:,:,:)/XACCR1>ZWLBDC3(:,:,:) +!!$ ! the raindrops are too small, that is lower than D_h +!!$ ZFACT = 1.2E4*XACCR1 +!!$ WHERE (GMICRO(:,:,:)) +!!$ ZWLBDC(:,:,:) = XLBR / MIN( ZFACT,ZWLBDC3(:,:,:) )**3 +!!$ ZW(:,:,:) = MIN( MAX( & +!!$ (PRHODREF(:,:,:)*PRRS(:,:,:) - ZWLBDC(:,:,:)*PCRS(:,:,:)) / & +!!$ (PRHODREF(:,:,:)*PRCS(:,:,:)/PCCS(:,:,:) - ZWLBDC(:,:,:)) , & +!!$ 0.0 ),PCRS(:,:,:), & +!!$ PCCS(:,:,:)*PRRS(:,:,:)/(PRCS(:,:,:))) +!!$! +!!$! Compute the percent (=1 if (ZWLBDR/XACCR1) >= 1.2E4 +!!$! of transfer with (=0 if (ZWLBDR/XACCR1) <= (XACCR4/ZWLBDC-XACCR5)/XACCR3 +!!$! +!!$ ZW(:,:,:) = ZW(:,:,:)*( (MIN(ZWLBDR(:,:,:),1.2E4*XACCR1)-ZWLBDC3(:,:,:)) / & +!!$ ( 1.2E4*XACCR1 -ZWLBDC3(:,:,:)) ) +!!$! +!!$ ZW2(:,:,:) = PCCS(:,:,:) !temporary storage +!!$ PCCS(:,:,:) = PCCS(:,:,:)+ZW(:,:,:) +!!$ PCRS(:,:,:) = PCRS(:,:,:)-ZW(:,:,:) +!!$ ZW(:,:,:) = ZW(:,:,:) * (PRHODREF(:,:,:)*PRCS(:,:,:)/ZW2(:,:,:)) +!!$ PRCS(:,:,:) = PRCS(:,:,:)+ZW(:,:,:) +!!$ PRRS(:,:,:) = PRRS(:,:,:)-ZW(:,:,:) +!!$ END WHERE +!!$! +!!$ GEVAP(:,:,:) = PRRS(:,:,:)<ZRTMIN(3) .OR. PCRS(:,:,:)<ZCTMIN(3) +!!$ WHERE (GEVAP(:,:,:)) +!!$ PCRS(:,:,:) = 0.0 +!!$ PRRS(:,:,:) = 0.0 +!!$ END WHERE +! +END IF ! IEVAP +! +!++cb++ +DEALLOCATE(ZRTMIN) +DEALLOCATE(ZCTMIN) +!--cb-- +! +!----------------------------------------------------------------------------- +! +END SUBROUTINE LIMA_WARM_EVAP diff --git a/src/mesonh/micro/lima_warm_nucl.f90 b/src/mesonh/micro/lima_warm_nucl.f90 new file mode 100644 index 000000000..549a5fc84 --- /dev/null +++ b/src/mesonh/micro/lima_warm_nucl.f90 @@ -0,0 +1,860 @@ +!MNH_LIC Copyright 2013-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ########################## + MODULE MODI_LIMA_WARM_NUCL +! ########################## +! +INTERFACE + SUBROUTINE LIMA_WARM_NUCL( OACTIT, PTSTEP, KMI, TPFILE, & + PRHODREF, PEXNREF, PPABST, PT, PTM, PW_NU, & + PRCM, PRVT, PRCT, PRRT, & + PTHS, PRVS, PRCS, PCCS, PNFS, PNAS ) +! +USE MODD_IO, ONLY: TFILEDATA +! +LOGICAL, INTENT(IN) :: OACTIT ! Switch to activate the + ! activation by radiative + ! tendency +REAL, INTENT(IN) :: PTSTEP ! Double Time step + ! (single if cold start) +INTEGER, INTENT(IN) :: KMI ! Model index +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PT ! Temperature +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTM ! Temperature at time t-dt +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PW_NU ! updraft velocity used for + ! the nucleation param. +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCM ! Cloud water m.r. at t-dt +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVS ! Water vapor m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +! +REAL, DIMENSION(:,:,:) , INTENT(INOUT) :: PCCS ! Cloud water C. source +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PNFS ! CCN C. available source +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PNAS ! CCN C. activated source +! +END SUBROUTINE LIMA_WARM_NUCL +END INTERFACE +END MODULE MODI_LIMA_WARM_NUCL +! ####################################################################### + SUBROUTINE LIMA_WARM_NUCL( OACTIT, PTSTEP, KMI, TPFILE, & + PRHODREF, PEXNREF, PPABST, PT, PTM, PW_NU, & + PRCM, PRVT, PRCT, PRRT, & + PTHS, PRVS, PRCS, PCCS, PNFS, PNAS ) +! ####################################################################### +! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the activation of CCN +!! according to Cohard and Pinty, QJRMS, 2000 +!! +!! +!!** METHOD +!! ------ +!! The activation of CCN is checked for quasi-saturated air parcels +!! to update the cloud droplet number concentration. +!! +!! Computation steps : +!! 1- Check where computations are necessary +!! 2- and 3- Compute the maximum of supersaturation using the iterative +!! Ridder algorithm +!! 4- Compute the nucleation source +!! 5- Deallocate local variables +!! +!! Contains : +!! 6- Functions : Ridder algorithm +!! +!! +!! REFERENCE +!! --------- +!! +!! Cohard, J.-M. and J.-P. Pinty, 2000: A comprehensive two-moment warm +!! microphysical bulk scheme. +!! Part I: Description and tests +!! Part II: 2D experiments with a non-hydrostatic model +!! Accepted for publication in Quart. J. Roy. Meteor. Soc. +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! J. Escobar : 10/2017 , for real*4 use XMNH_EPSILON +!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg +! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 +! B. Vie 03/03/2020: use DTHRAD instead of dT/dt in Smax diagnostic computation +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +use modd_field, only: TFIELDDATA, TYPEREAL +USE MODD_IO, ONLY: TFILEDATA +USE MODD_LUNIT_n, ONLY: TLUOUT +USE MODD_PARAMETERS, ONLY : JPHEXT, JPVEXT +USE MODD_PARAM_LIMA +USE MODD_PARAM_LIMA_WARM + +USE MODE_IO_FIELD_WRITE, only: IO_Field_write +use mode_tools, only: Countjv + +USE MODI_GAMMA + +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +LOGICAL, INTENT(IN) :: OACTIT ! Switch to activate the + ! activation by radiative + ! tendency +REAL, INTENT(IN) :: PTSTEP ! Double Time step + ! (single if cold start) +INTEGER, INTENT(IN) :: KMI ! Model index +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PT ! Temperature +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTM ! Temperature at time t-dt +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PW_NU ! updraft velocity used for + ! the nucleation param. +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCM ! Cloud water m.r. at t-dt +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVS ! Water vapor m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +! +REAL, DIMENSION(:,:,:) , INTENT(INOUT) :: PCCS ! Cloud water C. source +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PNFS ! CCN C. available source +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PNAS ! CCN C. activated source +! +! +!* 0.1 Declarations of local variables : +! +! Packing variables +LOGICAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) :: GNUCT +INTEGER :: INUCT +INTEGER , DIMENSION(SIZE(GNUCT)) :: I1,I2,I3 ! Used to replace the COUNT +INTEGER :: JL ! and PACK intrinsics +! +! Packed micophysical variables +REAL, DIMENSION(:) , ALLOCATABLE :: ZRCS ! cloud mr source +REAL, DIMENSION(:) , ALLOCATABLE :: ZCCS ! cloud conc. source +REAL, DIMENSION(:,:), ALLOCATABLE :: ZNFS ! available nucleus conc. source +REAL, DIMENSION(:,:), ALLOCATABLE :: ZNAS ! activated nucleus conc. source +! +! Other packed variables +REAL, DIMENSION(:) , ALLOCATABLE :: ZRHODREF ! RHO Dry REFerence +REAL, DIMENSION(:) , ALLOCATABLE :: ZEXNREF ! EXNer Pressure REFerence +REAL, DIMENSION(:) , ALLOCATABLE :: ZZT ! Temperature +! +! Work arrays +REAL, DIMENSION(:), ALLOCATABLE :: ZZW1, ZZW2, ZZW3, ZZW4, ZZW5, ZZW6, & + ZCTMIN, & + ZZTDT, & ! dT/dt + ZSW, & ! real supersaturation + ZSMAX, & ! Maximum supersaturation + ZVEC1 +! +REAL, DIMENSION(:,:), ALLOCATABLE :: ZTMP, ZCHEN_MULTI +! +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: ZTDT, ZDRC, ZRVSAT, ZW, ZW2 +REAL, DIMENSION(SIZE(PNFS,1),SIZE(PNFS,2),SIZE(PNFS,3)) & + :: ZCONC_TOT ! total CCN C. available +! +INTEGER, DIMENSION(:), ALLOCATABLE :: IVEC1 ! Vectors of indices for + ! interpolations +! +! +REAL :: ZEPS ! molar mass ratio +REAL :: ZS1, ZS2, ZXACC +INTEGER :: JMOD +INTEGER :: IIB, IIE, IJB, IJE, IKB, IKE ! Physical domain +! +INTEGER :: ILUOUT ! Logical unit of output listing +TYPE(TFIELDDATA) :: TZFIELD +!------------------------------------------------------------------------------- +! +ILUOUT = TLUOUT%NLU +! +!* 1. PREPARE COMPUTATIONS - PACK +! --------------------------- +! +! +IIB=1+JPHEXT +IIE=SIZE(PRHODREF,1) - JPHEXT +IJB=1+JPHEXT +IJE=SIZE(PRHODREF,2) - JPHEXT +IKB=1+JPVEXT +IKE=SIZE(PRHODREF,3) - JPVEXT +! +ALLOCATE(ZCTMIN(SIZE(XCTMIN))) +ZCTMIN(:) = XCTMIN(:) / PTSTEP +! +! Saturation vapor mixing ratio and radiative tendency +! +ZEPS= XMV / XMD +ZRVSAT(:,:,:) = ZEPS / (PPABST(:,:,:)*EXP(-XALPW+XBETAW/PT(:,:,:)+XGAMW*ALOG(PT(:,:,:))) - 1.0) +ZTDT(:,:,:) = 0. +IF (OACTIT .AND. SIZE(PTM).GT.0) ZTDT(:,:,:) = PTM(:,:,:) * PEXNREF(:,:,:) ! dThRad +! +! find locations where CCN are available +! +ZCONC_TOT(:,:,:) = 0.0 +DO JMOD = 1, NMOD_CCN + ZCONC_TOT(:,:,:) = ZCONC_TOT(:,:,:) + PNFS(:,:,:,JMOD) ! sum over the free CCN +ENDDO +! +! optimization by looking for locations where +! the updraft velocity is positive!!! +! +GNUCT(:,:,:) = .FALSE. +! +! NEW : -22°C = limit sup for condensation freezing in Fridlin et al., 2007 +IF( OACTIT ) THEN + GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) = (PW_NU(IIB:IIE,IJB:IJE,IKB:IKE)>XWMIN .OR. & + ZTDT(IIB:IIE,IJB:IJE,IKB:IKE)<XTMIN .OR. & + PRVT(IIB:IIE,IJB:IJE,IKB:IKE)>ZRVSAT(IIB:IIE,IJB:IJE,IKB:IKE) ) .AND.& + PRVT(IIB:IIE,IJB:IJE,IKB:IKE).GE.ZRVSAT(IIB:IIE,IJB:IJE,IKB:IKE)& + .AND. PT(IIB:IIE,IJB:IJE,IKB:IKE)>(XTT-22.) & + .AND. ZCONC_TOT(IIB:IIE,IJB:IJE,IKB:IKE)>ZCTMIN(2) +ELSE + GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) = (PW_NU(IIB:IIE,IJB:IJE,IKB:IKE)>XWMIN .OR. & + PRVT(IIB:IIE,IJB:IJE,IKB:IKE)>ZRVSAT(IIB:IIE,IJB:IJE,IKB:IKE) ) .AND.& + PRVT(IIB:IIE,IJB:IJE,IKB:IKE).GE.ZRVSAT(IIB:IIE,IJB:IJE,IKB:IKE)& + .AND. PT(IIB:IIE,IJB:IJE,IKB:IKE)>(XTT-22.) & + .AND. ZCONC_TOT(IIB:IIE,IJB:IJE,IKB:IKE)>ZCTMIN(2) +END IF +INUCT = COUNTJV( GNUCT(:,:,:),I1(:),I2(:),I3(:)) +! +IF( INUCT >= 1 ) THEN +! + ALLOCATE(ZNFS(INUCT,NMOD_CCN)) + ALLOCATE(ZNAS(INUCT,NMOD_CCN)) + ALLOCATE(ZTMP(INUCT,NMOD_CCN)) + ALLOCATE(ZRCS(INUCT)) + ALLOCATE(ZCCS(INUCT)) + ALLOCATE(ZZT(INUCT)) + ALLOCATE(ZZTDT(INUCT)) + ALLOCATE(ZSW(INUCT)) + ALLOCATE(ZZW1(INUCT)) + ALLOCATE(ZZW2(INUCT)) + ALLOCATE(ZZW3(INUCT)) + ALLOCATE(ZZW4(INUCT)) + ALLOCATE(ZZW5(INUCT)) + ALLOCATE(ZZW6(INUCT)) + ALLOCATE(ZCHEN_MULTI(INUCT,NMOD_CCN)) + ALLOCATE(ZVEC1(INUCT)) + ALLOCATE(IVEC1(INUCT)) + ALLOCATE(ZRHODREF(INUCT)) + ALLOCATE(ZEXNREF(INUCT)) + DO JL=1,INUCT + ZRCS(JL) = PRCS(I1(JL),I2(JL),I3(JL)) + ZCCS(JL) = PCCS(I1(JL),I2(JL),I3(JL)) + ZZT(JL) = PT(I1(JL),I2(JL),I3(JL)) + ZZW1(JL) = ZRVSAT(I1(JL),I2(JL),I3(JL)) + ZZW2(JL) = PW_NU(I1(JL),I2(JL),I3(JL)) + ZZTDT(JL) = ZTDT(I1(JL),I2(JL),I3(JL)) + ZSW(JL) = PRVT(I1(JL),I2(JL),I3(JL))/ZRVSAT(I1(JL),I2(JL),I3(JL)) - 1. + ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) + ZEXNREF(JL) = PEXNREF(I1(JL),I2(JL),I3(JL)) + DO JMOD = 1,NMOD_CCN + ZNFS(JL,JMOD) = PNFS(I1(JL),I2(JL),I3(JL),JMOD) + ZNAS(JL,JMOD) = PNAS(I1(JL),I2(JL),I3(JL),JMOD) + ZCHEN_MULTI(JL,JMOD) = (ZNFS(JL,JMOD)+ZNAS(JL,JMOD))*PTSTEP*ZRHODREF(JL) & + / XLIMIT_FACTOR(JMOD) + ENDDO + ENDDO +! + ZZW1(:) = 1.0/ZEPS + 1.0/ZZW1(:) & + + (((XLVTT+(XCPV-XCL)*(ZZT(:)-XTT))/ZZT(:))**2)/(XCPD*XRV) ! Psi2 +! +! +!------------------------------------------------------------------------------- +! +! +!* 2. compute the constant term (ZZW3) relative to smax +! ---------------------------------------------------- +! +! Remark : in LIMA's nucleation parameterization, Smax=0.01 for a supersaturation of 1% ! +! +! + ZVEC1(:) = MAX( 1.0001, MIN( REAL(NAHEN)-0.0001, XAHENINTP1 * ZZT(:) + XAHENINTP2 ) ) + IVEC1(:) = INT( ZVEC1(:) ) + ZVEC1(:) = ZVEC1(:) - REAL( IVEC1(:) ) + ALLOCATE(ZSMAX(INUCT)) +! +! + IF (OACTIT) THEN ! including a cooling rate +! +! Compute the tabulation of function of ZZW3 : +! +! (Psi1*w+Psi3*DT/Dt)**1.5 +! ZZW3 = XAHENG*(Psi1*w + Psi3*DT/Dt)**1.5 = ------------------------ +! 2*pi*rho_l*G**(3/2) +! +! + ZZW4(:)=XPSI1( IVEC1(:)+1)*ZZW2(:)+XPSI3(IVEC1(:)+1)*ZZTDT(:) + ZZW5(:)=XPSI1( IVEC1(:) )*ZZW2(:)+XPSI3(IVEC1(:) )*ZZTDT(:) + WHERE (ZZW4(:) < 0. .OR. ZZW5(:) < 0.) + ZZW4(:) = 0. + ZZW5(:) = 0. + END WHERE + ZZW3(:) = XAHENG( IVEC1(:)+1)*(ZZW4(:)**1.5)* ZVEC1(:) & + - XAHENG( IVEC1(:) )*(ZZW5(:)**1.5)*(ZVEC1(:) - 1.0) + ! Cste*((Psi1*w+Psi3*dT/dt)/(G))**1.5 + ZZW6(:) = XAHENG2( IVEC1(:)+1)*(ZZW4(:)**0.5)* ZVEC1(:) & + - XAHENG2( IVEC1(:) )*(ZZW5(:)**0.5)*(ZVEC1(:) - 1.0) +! +! + ELSE ! OACTIT , for clouds +! +! +! Compute the tabulation of function of ZZW3 : +! +! (Psi1 * w)**1.5 +! ZZW3 = XAHENG * (Psi1 * w)**1.5 = ------------------------- +! 2 pi rho_l * G**(3/2) +! +! + ZZW2(:)=MAX(ZZW2(:),0.) + ZZW3(:)=XAHENG(IVEC1(:)+1)*((XPSI1(IVEC1(:)+1)*ZZW2(:))**1.5)* ZVEC1(:) & + -XAHENG(IVEC1(:) )*((XPSI1(IVEC1(:) )*ZZW2(:))**1.5)*(ZVEC1(:)-1.0) +! + ZZW6(:)=XAHENG2(IVEC1(:)+1)*((XPSI1(IVEC1(:)+1)*ZZW2(:))**0.5)* ZVEC1(:) & + -XAHENG2(IVEC1(:) )*((XPSI1(IVEC1(:) )*ZZW2(:))**0.5)*(ZVEC1(:)-1.0) +! + END IF ! OACTIT +! +! +! (Psi1*w+Psi3*DT/Dt)**1.5 rho_air +! ZZW3 = ------------------------ * ------- +! 2*pi*rho_l*G**(3/2) Psi2 +! + ZZW5(:) = 1. + ZZW3(:) = (ZZW3(:)/ZZW1(:))*ZRHODREF(:) ! R.H.S. of Eq 9 of CPB 98 but + ! for multiple aerosol modes + WHERE (ZRCS(:) > XRTMIN(2) .AND. ZCCS(:) > XCTMIN(2)) + ZZW6(:) = ZZW6(:) * ZRHODREF(:) * ZCCS(:) * PTSTEP / (XLBC*ZCCS(:)/ZRCS(:))**XLBEXC + ELSEWHERE + ZZW6(:)=0. + END WHERE + + WHERE (ZZW3(:) == 0. .AND. .NOT.(ZSW>0.)) + ZZW5(:) = -1. + END WHERE +! +!------------------------------------------------------------------------------- +! +! +!* 3. Compute the maximum of supersaturation +! ----------------------------------------- +! +! +! estimate S_max for the CPB98 parameterization with SEVERAL aerosols mode +! Reminder : Smax=0.01 for a 1% supersaturation +! +! Interval bounds to tabulate sursaturation Smax +! Check with values used for tabulation in ini_lima_warm.f90 + ZS1 = 1.0E-5 ! corresponds to 0.001% supersaturation + ZS2 = 5.0E-2 ! corresponds to 5.0% supersaturation + ZXACC = 1.0E-10 ! Accuracy needed for the search in [NO UNITS] +! + ZSMAX(:) = ZRIDDR(ZS1,ZS2,ZXACC,ZZW3(:),ZZW6(:),INUCT) ! ZSMAX(:) is in [NO UNITS] + ZSMAX(:) = MIN(MAX(ZSMAX(:), ZSW(:)),ZS2) +! +! +!------------------------------------------------------------------------------- +! +! +!* 4. Compute the nucleus source +! ----------------------------- +! +! +! Again : Smax=0.01 for a 1% supersaturation +! Modified values for Beta and C (see in init_aerosol_properties) account for that +! + WHERE (ZZW5(:) > 0. .AND. ZSMAX(:) > 0.) + ZVEC1(:) = MAX( 1.0001, MIN( REAL(NHYP)-0.0001, XHYPINTP1*LOG(ZSMAX(:))+XHYPINTP2 ) ) + IVEC1(:) = INT( ZVEC1(:) ) + ZVEC1(:) = ZVEC1(:) - REAL( IVEC1(:) ) + END WHERE + ZZW6(:) = 0. ! initialize the change of cloud droplet concentration +! + ZTMP(:,:)=0.0 +! +! Compute the concentration of activable aerosols for each mode +! based on the max of supersaturation ( -> ZTMP ) +! + DO JMOD = 1, NMOD_CCN ! iteration on mode number + ZZW1(:) = 0. + ZZW2(:) = 0. + ZZW3(:) = 0. + ! + WHERE( ZZW5(:) > 0. .AND. ZSMAX(:)>0.0 ) + ZZW2(:) = XHYPF12( IVEC1(:)+1,JMOD )* ZVEC1(:) & ! hypergeo function + - XHYPF12( IVEC1(:) ,JMOD )*(ZVEC1(:) - 1.0) ! XHYPF12 is tabulated + ! + ZTMP(:,JMOD) = ZCHEN_MULTI(:,JMOD)/ZRHODREF(:)*ZSMAX(:)**XKHEN_MULTI(JMOD)*ZZW2(:)/PTSTEP + ENDWHERE + ENDDO +! +! Compute the concentration of aerosols activated at this time step +! as the difference between ZTMP and the aerosols already activated at t-dt (ZZW1) +! + DO JMOD = 1, NMOD_CCN ! iteration on mode number + ZZW1(:) = 0. + ZZW2(:) = 0. + ZZW3(:) = 0. + ! + WHERE( SUM(ZTMP(:,:),DIM=2)*PTSTEP .GT. 0.01E6/ZRHODREF(:) ) + ZZW1(:) = MIN( ZNFS(:,JMOD),MAX( ZTMP(:,JMOD)- ZNAS(:,JMOD) , 0.0 ) ) + ENDWHERE + ! + !* update the concentration of activated CCN = Na + ! + PNAS(:,:,:,JMOD) = PNAS(:,:,:,JMOD) + UNPACK( ZZW1(:), MASK=GNUCT(:,:,:), FIELD=0.0 ) + ! + !* update the concentration of free CCN = Nf + ! + PNFS(:,:,:,JMOD) = PNFS(:,:,:,JMOD) - UNPACK( ZZW1(:), MASK=GNUCT(:,:,:), FIELD=0.0 ) + ! + !* prepare to update the cloud water concentration + ! + ZZW6(:) = ZZW6(:) + ZZW1(:) + ENDDO +! +! Update PRVS, PRCS, PCCS, and PTHS +! + ZZW1(:)=0. + WHERE (ZZW5(:)>0.0 .AND. ZSMAX(:)>0.0) ! ZZW1 is computed with ZSMAX [NO UNIT] + ZZW1(:) = MIN(XCSTDCRIT*ZZW6(:)/(((ZZT(:)*ZSMAX(:))**3)*ZRHODREF(:)),1.E-5) + END WHERE + ZW(:,:,:) = MIN( UNPACK( ZZW1(:),MASK=GNUCT(:,:,:),FIELD=0.0 ),PRVS(:,:,:) ) +! + PRVS(:,:,:) = PRVS(:,:,:) - ZW(:,:,:) + PRCS(:,:,:) = PRCS(:,:,:) + ZW(:,:,:) + ZW(:,:,:) = ZW(:,:,:) * (XLVTT+(XCPV-XCL)*(PT(:,:,:)-XTT))/ & + (PEXNREF(:,:,:)*(XCPD+XCPV*PRVT(:,:,:)+XCL*(PRCT(:,:,:)+PRRT(:,:,:)))) + PTHS(:,:,:) = PTHS(:,:,:) + ZW(:,:,:) +! + ZW(:,:,:) = PCCS(:,:,:) + PCCS(:,:,:) = UNPACK( ZZW6(:)+ZCCS(:),MASK=GNUCT(:,:,:),FIELD=ZW(:,:,:) ) +! + ZW(:,:,:) = UNPACK( 100.0*ZSMAX(:),MASK=GNUCT(:,:,:),FIELD=0.0 ) + ZW2(:,:,:) = UNPACK( ZZW6(:),MASK=GNUCT(:,:,:),FIELD=0.0 ) +! +! +!------------------------------------------------------------------------------- +! +! +!* 5. Cleaning +! ----------- +! +! + DEALLOCATE(IVEC1) + DEALLOCATE(ZVEC1) + DEALLOCATE(ZNFS) + DEALLOCATE(ZNAS) + DEALLOCATE(ZCCS) + DEALLOCATE(ZRCS) + DEALLOCATE(ZZT) + DEALLOCATE(ZSMAX) + DEALLOCATE(ZZW1) + DEALLOCATE(ZZW2) + DEALLOCATE(ZZW3) + DEALLOCATE(ZZW4) + DEALLOCATE(ZZW5) + DEALLOCATE(ZZW6) + DEALLOCATE(ZZTDT) + DEALLOCATE(ZSW) + DEALLOCATE(ZRHODREF) + DEALLOCATE(ZCHEN_MULTI) + DEALLOCATE(ZEXNREF) +! +END IF ! INUCT +! +!++cb++ +DEALLOCATE(ZCTMIN) +!--cb-- +IF ( tpfile%lopened ) THEN + IF ( INUCT == 0 ) THEN + ZW (:,:,:) = 0. + ZW2(:,:,:) = 0. + END IF + + TZFIELD%CMNHNAME ='SMAX' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CUNITS = '' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_SMAX' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZW) + ! + TZFIELD%CMNHNAME ='NACT' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CUNITS = 'kg-1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_NACT' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZW2) +END IF +! +! +!------------------------------------------------------------------------------- +! +! +!* 6. Functions used to compute the maximum of supersaturation +! ----------------------------------------------------------- +! +! +CONTAINS +!------------------------------------------------------------------------------ +! + FUNCTION ZRIDDR(PX1,PX2INIT,PXACC,PZZW3,PZZW6,NPTS) RESULT(PZRIDDR) +! +! +!!**** *ZRIDDR* - iterative algorithm to find root of a function +!! +!! +!! PURPOSE +!! ------- +!! The purpose of this function is to find the root of a given function +!! the arguments are the brackets bounds (the interval where to find the root) +!! the accuracy needed and the input parameters of the given function. +!! Using Ridders' method, return the root of a function known to lie between +!! PX1 and PX2. The root, returned as PZRIDDR, will be refined to an approximate +!! accuracy PXACC. +!! +!!** METHOD +!! ------ +!! Ridders' method +!! +!! EXTERNAL +!! -------- +!! FUNCSMAX +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! NUMERICAL RECIPES IN FORTRAN 77: THE ART OF SCIENTIFIC COMPUTING +!! (ISBN 0-521-43064-X) +!! Copyright (C) 1986-1992 by Cambridge University Press. +!! Programs Copyright (C) 1986-1992 by Numerical Recipes Software. +!! +!! AUTHOR +!! ------ +!! Frederick Chosson *CERFACS* +!! +!! MODIFICATIONS +!! ------------- +!! Original 12/07/07 +!! S.BERTHET 2008 vectorization +!------------------------------------------------------------------------------ +! +!* 0. DECLARATIONS +! +! +use mode_msg +! +IMPLICIT NONE +! +!* 0.1 declarations of arguments and result +! +INTEGER, INTENT(IN) :: NPTS +REAL, DIMENSION(:), INTENT(IN) :: PZZW3 +REAL, DIMENSION(:), INTENT(IN) :: PZZW6 +REAL, INTENT(IN) :: PX1, PX2INIT, PXACC +REAL, DIMENSION(:), ALLOCATABLE :: PZRIDDR +! +!* 0.2 declarations of local variables +! +! +INTEGER, PARAMETER :: MAXIT=60 +REAL, PARAMETER :: UNUSED=0.0 !-1.11e30 +REAL, DIMENSION(:), ALLOCATABLE :: fh,fl, fm,fnew +REAL :: s,xh,xl,xm,xnew +REAL :: PX2 +INTEGER :: j, JL +! +ALLOCATE( fh(NPTS)) +ALLOCATE( fl(NPTS)) +ALLOCATE( fm(NPTS)) +ALLOCATE(fnew(NPTS)) +ALLOCATE(PZRIDDR(NPTS)) +! +PZRIDDR(:)= UNUSED +PX2 = PX2INIT +fl(:) = FUNCSMAX(PX1,PZZW3(:),PZZW6(:),NPTS) +fh(:) = FUNCSMAX(PX2,PZZW3(:),PZZW6(:),NPTS) +! +DO JL = 1, NPTS + PX2 = PX2INIT +100 if ((fl(JL) > 0.0 .and. fh(JL) < 0.0) .or. (fl(JL) < 0.0 .and. fh(JL) > 0.0)) then + xl = PX1 + xh = PX2 + do j=1,MAXIT + xm = 0.5*(xl+xh) + fm(JL) = SINGL_FUNCSMAX(xm,PZZW3(JL),PZZW6(JL),JL) + s = sqrt(fm(JL)**2-fl(JL)*fh(JL)) + if (s == 0.0) then + GO TO 101 + endif + xnew = xm+(xm-xl)*(sign(1.0,fl(JL)-fh(JL))*fm(JL)/s) + if (abs(xnew - PZRIDDR(JL)) <= PXACC) then + GO TO 101 + endif + PZRIDDR(JL) = xnew + fnew(JL) = SINGL_FUNCSMAX(PZRIDDR(JL),PZZW3(JL),PZZW6(JL),JL) + if (fnew(JL) == 0.0) then + GO TO 101 + endif + if (sign(fm(JL),fnew(JL)) /= fm(JL)) then + xl =xm + fl(JL)=fm(JL) + xh =PZRIDDR(JL) + fh(JL)=fnew(JL) + else if (sign(fl(JL),fnew(JL)) /= fl(JL)) then + xh =PZRIDDR(JL) + fh(JL)=fnew(JL) + else if (sign(fh(JL),fnew(JL)) /= fh(JL)) then + xl =PZRIDDR(JL) + fl(JL)=fnew(JL) + else if (PX2 .lt. 0.05) then + PX2 = PX2 + 1.0E-2 + PRINT*, 'PX2 ALWAYS too small, we put a greater one : PX2 =',PX2 + fh(JL) = SINGL_FUNCSMAX(PX2,PZZW3(JL),PZZW6(JL),JL) + go to 100 + end if + if (abs(xh-xl) <= PXACC) then + GO TO 101 + endif +!!SB +!!$ if (j == MAXIT .and. (abs(xh-xl) > PXACC) ) then +!!$ PZRIDDR(JL)=0.0 +!!$ go to 101 +!!$ endif +!!SB + end do + call Print_msg( NVERB_FATAL, 'GEN', 'ZRIDDR', 'exceeded maximum iterations' ) + else if (fl(JL) == 0.0) then + PZRIDDR(JL)=PX1 + else if (fh(JL) == 0.0) then + PZRIDDR(JL)=PX2 + else if (PX2 .lt. 0.05) then + PX2 = PX2 + 1.0E-2 + PRINT*, 'PX2 too small, we put a greater one : PX2 =',PX2 + fh(JL) = SINGL_FUNCSMAX(PX2,PZZW3(JL),PZZW6(JL),JL) + go to 100 + else +!!$ print*, 'PZRIDDR: root must be bracketed' +!!$ print*,'npts ',NPTS,'jl',JL +!!$ print*, 'PX1,PX2,fl,fh',PX1,PX2,fl(JL),fh(JL) +!!$ print*, 'PX2 = 30 % of supersaturation, there is no solution for Smax' +!!$ print*, 'try to put greater PX2 (upper bound for Smax research)' +!!$ STOP + PZRIDDR(JL)=0.0 + go to 101 + end if +101 ENDDO +! +DEALLOCATE( fh) +DEALLOCATE( fl) +DEALLOCATE( fm) +DEALLOCATE(fnew) +! +END FUNCTION ZRIDDR +! +!------------------------------------------------------------------------------ +! + FUNCTION FUNCSMAX(PPZSMAX,PPZZW3,PPZZW6,NPTS) RESULT(PFUNCSMAX) +! +! +!!**** *FUNCSMAX* - function describing SMAX function that you want to find the root +!! +!! +!! PURPOSE +!! ------- +!! This function describe the equilibrium between Smax and two aerosol mode +!! acting as CCN. This function is derive from eq. (9) of CPB98 but for two +!! aerosols mode described by their respective parameters C, k, Mu, Beta. +!! the arguments are the supersaturation in "no unit" and the r.h.s. of this eq. +!! and the ratio of concentration of injected aerosols on maximum concentration +!! of injected aerosols ever. +!!** METHOD +!! ------ +!! This function is called by zriddr.f90 +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_PARAM_LIMA_WARM +!! XHYPF32 +!! +!! XHYPINTP1 +!! XHYPINTP2 +!! +!! Module MODD_PARAM_C2R2 +!! XKHEN_MULTI() +!! NMOD_CCN +!! +!! REFERENCE +!! --------- +!! Cohard, J.M., J.P.Pinty, K.Suhre, 2000:"On the parameterization of activation +!! spectra from cloud condensation nuclei microphysical properties", +!! J. Geophys. Res., Vol.105, N0.D9, pp. 11753-11766 +!! +!! AUTHOR +!! ------ +!! Frederick Chosson *CERFACS* +!! +!! MODIFICATIONS +!! ------------- +!! Original 12/07/07 +!! S.Berthet 19/03/08 Extension a une population multimodale d aerosols +! +!------------------------------------------------------------------------------ +! +!* 0. DECLARATIONS +! +IMPLICIT NONE +! +!* 0.1 declarations of arguments and result +! +INTEGER, INTENT(IN) :: NPTS +REAL, INTENT(IN) :: PPZSMAX ! supersaturation is already in no units +REAL, DIMENSION(:), INTENT(IN) :: PPZZW3 ! +REAL, DIMENSION(:), INTENT(IN) :: PPZZW6 ! +REAL, DIMENSION(:), ALLOCATABLE :: PFUNCSMAX ! +! +!* 0.2 declarations of local variables +! +REAL :: ZHYPF +! +REAL :: PZVEC1 +INTEGER :: PIVEC1 +! +ALLOCATE(PFUNCSMAX(NPTS)) +! +PFUNCSMAX(:) = 0. +PZVEC1 = MAX( ( 1.0 + 10.0 * XMNH_EPSILON ) ,MIN( REAL(NHYP)*( 1.0 - 10.0 * XMNH_EPSILON ) , & + XHYPINTP1*LOG(PPZSMAX)+XHYPINTP2 ) ) +PIVEC1 = INT( PZVEC1 ) +PZVEC1 = PZVEC1 - REAL( PIVEC1 ) +DO JMOD = 1, NMOD_CCN + ZHYPF = 0. ! XHYPF32 is tabulated with ZSMAX in [NO UNITS] + ZHYPF = XHYPF32( PIVEC1+1,JMOD ) * PZVEC1 & + - XHYPF32( PIVEC1 ,JMOD ) *(PZVEC1 - 1.0) + ! sum of s**(ki+2) * F32 * Ci * ki * beta(ki/2,3/2) + PFUNCSMAX(:) = PFUNCSMAX(:) + (PPZSMAX)**(XKHEN_MULTI(JMOD) + 2) & + * ZHYPF* XKHEN_MULTI(JMOD) * ZCHEN_MULTI(:,JMOD) & + * GAMMA_X0D( XKHEN_MULTI(JMOD)/2.0)*GAMMA_X0D(3.0/2.0) & + / GAMMA_X0D((XKHEN_MULTI(JMOD)+3.0)/2.0) +ENDDO +! function l.h.s. minus r.h.s. of eq. (9) of CPB98 but for NMOD_CCN aerosol mode +PFUNCSMAX(:) = PFUNCSMAX(:) + PPZZW6(:)*PPZSMAX - PPZZW3(:) +! +END FUNCTION FUNCSMAX +! +!------------------------------------------------------------------------------ +! + FUNCTION SINGL_FUNCSMAX(PPZSMAX,PPZZW3,PPZZW6,KINDEX) RESULT(PSINGL_FUNCSMAX) +! +! +!!**** *SINGL_FUNCSMAX* - same function as FUNCSMAX +!! +!! +!! PURPOSE +!! ------- +! As for FUNCSMAX but for a scalar +!! +!!** METHOD +!! ------ +!! This function is called by zriddr.f90 +!! +!------------------------------------------------------------------------------ +! +!* 0. DECLARATIONS +! +IMPLICIT NONE +! +!* 0.1 declarations of arguments and result +! +INTEGER, INTENT(IN) :: KINDEX +REAL, INTENT(IN) :: PPZSMAX ! supersaturation is "no unit" +REAL, INTENT(IN) :: PPZZW3 ! +REAL, INTENT(IN) :: PPZZW6 ! +REAL :: PSINGL_FUNCSMAX ! +! +!* 0.2 declarations of local variables +! +REAL :: ZHYPF +! +REAL :: PZVEC1 +INTEGER :: PIVEC1 +! +PSINGL_FUNCSMAX = 0. +PZVEC1 = MAX( 1.0001,MIN( REAL(NHYP)-0.0001, & + XHYPINTP1*LOG(PPZSMAX)+XHYPINTP2 ) ) +PIVEC1 = INT( PZVEC1 ) +PZVEC1 = PZVEC1 - REAL( PIVEC1 ) +DO JMOD = 1, NMOD_CCN + ZHYPF = 0. ! XHYPF32 is tabulated with ZSMAX in [NO UNITS] + ZHYPF = XHYPF32( PIVEC1+1,JMOD ) * PZVEC1 & + - XHYPF32( PIVEC1 ,JMOD ) *(PZVEC1 - 1.0) + ! sum of s**(ki+2) * F32 * Ci * ki * bêta(ki/2,3/2) + PSINGL_FUNCSMAX = PSINGL_FUNCSMAX + (PPZSMAX)**(XKHEN_MULTI(JMOD) + 2) & + * ZHYPF* XKHEN_MULTI(JMOD) * ZCHEN_MULTI(KINDEX,JMOD) & + * GAMMA_X0D( XKHEN_MULTI(JMOD)/2.0)*GAMMA_X0D(3.0/2.0) & + / GAMMA_X0D((XKHEN_MULTI(JMOD)+3.0)/2.0) +ENDDO +! function l.h.s. minus r.h.s. of eq. (9) of CPB98 but for NMOD_CCN aerosol mode +PSINGL_FUNCSMAX = PSINGL_FUNCSMAX + PPZZW6*PPZSMAX - PPZZW3 +! +END FUNCTION SINGL_FUNCSMAX +! +!----------------------------------------------------------------------------- +! +END SUBROUTINE LIMA_WARM_NUCL diff --git a/src/mesonh/micro/lima_warm_sedimentation.f90 b/src/mesonh/micro/lima_warm_sedimentation.f90 new file mode 100644 index 000000000..f74899b38 --- /dev/null +++ b/src/mesonh/micro/lima_warm_sedimentation.f90 @@ -0,0 +1,396 @@ +!MNH_LIC Copyright 2013-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ################################### + MODULE MODI_LIMA_WARM_SEDIMENTATION +! ################################### +! +INTERFACE + SUBROUTINE LIMA_WARM_SEDIMENTATION (OSEDC, KSPLITR, PTSTEP, KMI, & + PZZ, PRHODREF, PPABST, ZT, & + ZWLBDC, & + PRCT, PRRT, PCCT, PCRT, & + PRCS, PRRS, PCCS, PCRS, & + PINPRC, PINPRR, PINPRR3D ) +! +LOGICAL, INTENT(IN) :: OSEDC ! switch to activate the + ! cloud droplet sedimentation +INTEGER, INTENT(IN) :: KSPLITR ! Number of small time step + ! for sedimendation +REAL, INTENT(IN) :: PTSTEP ! Double Time step + ! (single if cold start) +INTEGER, INTENT(IN) :: KMI ! Model index +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: ZT ! Temperature +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: ZWLBDC ! libre parcours moyen +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCCT ! Cloud water C. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCRT ! Rain water C. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRRS ! Rain water m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCCS ! Cloud water C. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCRS ! Rain water C. source +! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRC ! Cloud instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRR ! Rain instant precip +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRR3D ! Rain inst precip 3D +! +END SUBROUTINE LIMA_WARM_SEDIMENTATION +END INTERFACE +END MODULE MODI_LIMA_WARM_SEDIMENTATION +! ##################################################################### + SUBROUTINE LIMA_WARM_SEDIMENTATION (OSEDC, KSPLITR, PTSTEP, KMI, & + PZZ, PRHODREF, PPABST, ZT, & + ZWLBDC, & + PRCT, PRRT, PCCT, PCRT, & + PRCS, PRRS, PCCS, PCRS, & + PINPRC, PINPRR, PINPRR3D ) +! ##################################################################### +! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the sedimentation +!! of cloud droplets and rain drops +!! +!! +!!** METHOD +!! ------ +!! The sedimentation rates are computed with a time spliting technique: +!! an upstream scheme, written as a difference of non-advective fluxes. +!! This source term is added to the next coming time step (split-implicit +!! process). +!! +!! +!! REFERENCE +!! --------- +!! +!! Cohard, J.-M. and J.-P. Pinty, 2000: A comprehensive two-moment warm +!! microphysical bulk scheme. +!! Part I: Description and tests +!! Part II: 2D experiments with a non-hydrostatic model +!! Accepted for publication in Quart. J. Roy. Meteor. Soc. +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST, ONLY: XRHOLW +USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT +USE MODD_PARAM_LIMA, ONLY: XRTMIN, XCTMIN, XALPHAC, XNUC, XCEXVT +USE MODD_PARAM_LIMA_WARM, ONLY: XLBC, XLBEXC, XLBR, XLBEXR, & + XFSEDRC, XFSEDCC, XFSEDRR, XFSEDCR,& + XDC, XDR + +use mode_tools, only: Countjv + +USE MODI_GAMMA, ONLY: GAMMA_X0D + +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +LOGICAL, INTENT(IN) :: OSEDC ! switch to activate the + ! cloud droplet sedimentation +INTEGER, INTENT(IN) :: KSPLITR ! Number of small time step + ! for sedimendation +REAL, INTENT(IN) :: PTSTEP ! Double Time step + ! (single if cold start) +INTEGER, INTENT(IN) :: KMI ! Model index +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: ZT ! Temperature +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: ZWLBDC ! libre parcours moyen +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCCT ! Cloud water C. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCRT ! Rain water C. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRRS ! Rain water m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCCS ! Cloud water C. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCRS ! Rain water C. source +! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRC ! Cloud instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRR ! Rain instant precip +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRR3D ! Rain inst precip 3D +! +! +!* 0.2 Declarations of local variables : +! +! Packing variables +LOGICAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) :: GSEDIM +INTEGER :: ISEDIM +INTEGER , DIMENSION(SIZE(GSEDIM)) :: I1,I2,I3 ! Used to replace the COUNT +INTEGER :: JL ! and PACK intrinsics +! +! Packed micophysical variables +REAL, DIMENSION(:) , ALLOCATABLE :: ZRCT ! Cloud water m.r. at t +REAL, DIMENSION(:) , ALLOCATABLE :: ZRRT ! Rain water m.r. at t +REAL, DIMENSION(:) , ALLOCATABLE :: ZCCT ! cloud conc. at t +REAL, DIMENSION(:) , ALLOCATABLE :: ZCRT ! rain conc. at t +! +REAL, DIMENSION(:) , ALLOCATABLE :: ZRCS ! Cloud water m.r. source +REAL, DIMENSION(:) , ALLOCATABLE :: ZRRS ! Rain water m.r. source +REAL, DIMENSION(:) , ALLOCATABLE :: ZCCS ! cloud conc. source +REAL, DIMENSION(:) , ALLOCATABLE :: ZCRS ! rain conc. source +! +! Other packed variables +REAL, DIMENSION(:) , ALLOCATABLE :: ZRHODREF ! RHO Dry REFerence +REAL, DIMENSION(:) , ALLOCATABLE :: ZLBDC +REAL, DIMENSION(:) , ALLOCATABLE :: ZLBDR +! +! Work arrays +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: ZW, & + ZWLBDA, & ! Mean free path + ZWSEDR, ZWSEDC, & ! Sedim. fluxes + ZRAY, & ! Mean volumic radius + ZCC ! Terminal vertical velocity +! +REAL, DIMENSION(:), ALLOCATABLE :: ZZW1, ZZW2, ZZW3, & + ZTCC, & + ZRTMIN, ZCTMIN +! +! +INTEGER :: JK ! Vertical loop index for the rain sedimentation +INTEGER :: JN ! Temporal loop index for the rain sedimentation +INTEGER :: IIB, IIE, IJB, IJE, IKB, IKE ! Physical domain +REAL :: ZTSPLITR ! Small time step for rain sedimentation +! +!------------------------------------------------------------------------------- +! +! 0. Prepare computations +! ----------------------- +! +! +ALLOCATE(ZRTMIN(SIZE(XCTMIN))) +ALLOCATE(ZCTMIN(SIZE(XCTMIN))) +ZRTMIN(:) = XRTMIN(:) / PTSTEP +ZCTMIN(:) = XCTMIN(:) / PTSTEP +! +IIB=1+JPHEXT +IIE=SIZE(PZZ,1) - JPHEXT +IJB=1+JPHEXT +IJE=SIZE(PZZ,2) - JPHEXT +IKB=1+JPVEXT +IKE=SIZE(PZZ,3) - JPVEXT +! +ZTSPLITR= PTSTEP / REAL(KSPLITR) +! +PINPRC(:,:) = 0. +PINPRR(:,:) = 0. +PINPRR3D(:,:,:) = 0. +! +IF (OSEDC) THEN + ZWLBDA(:,:,:) = 0. + ZRAY(:,:,:) = 0. + ZCC(:,:,:) = 1. + DO JK=IKB,IKE + ZWLBDA(:,:,JK) = 6.6E-8*(101325./PPABST(:,:,JK))*(ZT(:,:,JK)/293.15) + END DO + WHERE (PRCT(:,:,:)>XRTMIN(2) .AND. PCCT(:,:,:)>XCTMIN(2)) + ZRAY(:,:,:) = 0.5*GAMMA_X0D(XNUC+1./XALPHAC)/(GAMMA_X0D(XNUC)*ZWLBDC(:,:,:)) + ! ZCC : Corrective Cunningham term for the terminal velocity + ZCC(:,:,:)=1.+1.26*ZWLBDA(:,:,:)/ZRAY(:,:,:) + END WHERE +END IF +! +!------------------------------------------------------------------------------- +! +! +! 1. Computations only where necessary +! ------------------------------------ +! +! +DO JN = 1 , KSPLITR + GSEDIM(:,:,:) = .FALSE. + GSEDIM(IIB:IIE,IJB:IJE,IKB:IKE) = PRRS(IIB:IIE,IJB:IJE,IKB:IKE)>ZRTMIN(3) & + .AND. PCRS(IIB:IIE,IJB:IJE,IKB:IKE)>ZCTMIN(3) + IF( OSEDC ) THEN + GSEDIM(IIB:IIE,IJB:IJE,IKB:IKE) = GSEDIM(IIB:IIE,IJB:IJE,IKB:IKE) .OR. & + (PRCS(IIB:IIE,IJB:IJE,IKB:IKE)>ZRTMIN(2) & + .AND. PCCS(IIB:IIE,IJB:IJE,IKB:IKE)>ZCTMIN(2) ) + END IF +! + ISEDIM = COUNTJV( GSEDIM(:,:,:),I1(:),I2(:),I3(:)) + IF( ISEDIM >= 1 ) THEN +! + IF( JN==1 ) THEN + IF( OSEDC ) THEN + PRCS(:,:,:) = PRCS(:,:,:) * PTSTEP + PCCS(:,:,:) = PCCS(:,:,:) * PTSTEP + END IF + PRRS(:,:,:) = PRRS(:,:,:) * PTSTEP + PCRS(:,:,:) = PCRS(:,:,:) * PTSTEP + DO JK = IKB , IKE + ZW(:,:,JK)=ZTSPLITR/(PZZ(:,:,JK+1)-PZZ(:,:,JK)) + END DO + END IF +! + ALLOCATE(ZRHODREF(ISEDIM)) + DO JL = 1,ISEDIM + ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) + END DO +! + ALLOCATE(ZZW1(ISEDIM)) + ALLOCATE(ZZW2(ISEDIM)) + ALLOCATE(ZZW3(ISEDIM)) +! +! +!------------------------------------------------------------------------------- +! +! +! 2. Cloud droplets sedimentation +! ------------------------------- +! +! + IF( OSEDC .AND. MAXVAL(PRCS(:,:,:))>ZRTMIN(2) ) THEN + ZZW1(:) = 0.0 + ZZW2(:) = 0.0 + ZZW3(:) = 0.0 + ALLOCATE(ZRCS(ISEDIM)) + ALLOCATE(ZCCS(ISEDIM)) + ALLOCATE(ZRCT(ISEDIM)) + ALLOCATE(ZCCT(ISEDIM)) + ALLOCATE(ZTCC(ISEDIM)) + ALLOCATE(ZLBDC(ISEDIM)) + DO JL = 1,ISEDIM + ZRCS(JL) = PRCS(I1(JL),I2(JL),I3(JL)) + ZCCS(JL) = PCCS(I1(JL),I2(JL),I3(JL)) + ZRCT(JL) = PRCT(I1(JL),I2(JL),I3(JL)) + ZCCT(JL) = PCCT(I1(JL),I2(JL),I3(JL)) + ZTCC(JL) = ZCC (I1(JL),I2(JL),I3(JL)) + END DO + ZLBDC(:) = 1.E15 + WHERE (ZRCS(:)>XRTMIN(2) .AND. ZCCS(:)>XCTMIN(2)) + ZLBDC(:) = ( XLBC*ZCCS(:) / ZRCS(:) )**XLBEXC + ZZW3(:) = ZRHODREF(:)**(-XCEXVT) * ZLBDC(:)**(-XDC) + ZZW1(:) = ZTCC(:) * XFSEDRC * ZRCS(:) * ZZW3(:) * ZRHODREF(:) + ZZW2(:) = ZTCC(:) * XFSEDCC * ZCCS(:) * ZZW3(:) * ZRHODREF(:) + END WHERE + ZWSEDR(:,:,:) = UNPACK( ZZW1(:),MASK=GSEDIM(:,:,:),FIELD=0.0 ) + ZWSEDR(:,:,IKB:IKE) = MIN( ZWSEDR(:,:,IKB:IKE), PRCS(:,:,IKB:IKE) * PRHODREF(:,:,IKB:IKE) / ZW(:,:,IKB:IKE) ) + ZWSEDC(:,:,:) = UNPACK( ZZW2(:),MASK=GSEDIM(:,:,:),FIELD=0.0 ) + ZWSEDC(:,:,IKB:IKE) = MIN( ZWSEDC(:,:,IKB:IKE), PCCS(:,:,IKB:IKE) * PRHODREF(:,:,IKB:IKE) / ZW(:,:,IKB:IKE) ) + DO JK = IKB , IKE + PRCS(:,:,JK) = PRCS(:,:,JK) + ZW(:,:,JK)* & + (ZWSEDR(:,:,JK+1)-ZWSEDR(:,:,JK))/PRHODREF(:,:,JK) + PCCS(:,:,JK) = PCCS(:,:,JK) + ZW(:,:,JK)* & + (ZWSEDC(:,:,JK+1)-ZWSEDC(:,:,JK))/PRHODREF(:,:,JK) + END DO + DEALLOCATE(ZRCS) + DEALLOCATE(ZCCS) + DEALLOCATE(ZRCT) + DEALLOCATE(ZCCT) + DEALLOCATE(ZTCC) + DEALLOCATE(ZLBDC) +! + PINPRC(:,:) = PINPRC(:,:) + ZWSEDR(:,:,IKB)/XRHOLW/KSPLITR ! in m/s + ELSE + ZWSEDR(:,:,IKB) = 0.0 + END IF ! OSEDC +! +! +!------------------------------------------------------------------------------- +! +! +! 2. Rain drops sedimentation +! --------------------------- +! +! + IF( MAXVAL(PRRS(:,:,:))>ZRTMIN(3) ) THEN + ZZW1(:) = 0.0 + ZZW2(:) = 0.0 + ZZW3(:) = 0.0 + ALLOCATE(ZRRS(ISEDIM)) + ALLOCATE(ZCRS(ISEDIM)) + ALLOCATE(ZRRT(ISEDIM)) + ALLOCATE(ZCRT(ISEDIM)) + ALLOCATE(ZLBDR(ISEDIM)) + DO JL = 1,ISEDIM + ZRRS(JL) = PRRS(I1(JL),I2(JL),I3(JL)) + ZCRS(JL) = PCRS(I1(JL),I2(JL),I3(JL)) + ZRRT(JL) = PRRT(I1(JL),I2(JL),I3(JL)) + ZCRT(JL) = PCRT(I1(JL),I2(JL),I3(JL)) + END DO + ZLBDR(:) = 1.E10 + WHERE (ZRRS(:)>XRTMIN(3) .AND. ZCRS(:)>XCTMIN(3)) + ZLBDR(:) = ( XLBR*ZCRS(:) / ZRRS(:) )**XLBEXR + ZZW3(:) = ZRHODREF(:)**(-XCEXVT) * (ZLBDR(:)**(-XDR)) + ZZW1(:) = XFSEDRR * ZRRS(:) * ZZW3(:) * ZRHODREF(:) + ZZW2(:) = XFSEDCR * ZCRS(:) * ZZW3(:) * ZRHODREF(:) + END WHERE + ZWSEDR(:,:,:) = UNPACK( ZZW1(:),MASK=GSEDIM(:,:,:),FIELD=0.0 ) + ZWSEDR(:,:,IKB:IKE) = MIN( ZWSEDR(:,:,IKB:IKE), PRRS(:,:,IKB:IKE) * PRHODREF(:,:,IKB:IKE) / ZW(:,:,IKB:IKE) ) + ZWSEDC(:,:,:) = UNPACK( ZZW2(:),MASK=GSEDIM(:,:,:),FIELD=0.0 ) + ZWSEDC(:,:,IKB:IKE) = MIN( ZWSEDC(:,:,IKB:IKE), PCRS(:,:,IKB:IKE) * PRHODREF(:,:,IKB:IKE) / ZW(:,:,IKB:IKE) ) + DO JK = IKB , IKE + PRRS(:,:,JK) = PRRS(:,:,JK) + ZW(:,:,JK)* & + (ZWSEDR(:,:,JK+1)-ZWSEDR(:,:,JK))/PRHODREF(:,:,JK) + PCRS(:,:,JK) = PCRS(:,:,JK) + ZW(:,:,JK)* & + (ZWSEDC(:,:,JK+1)-ZWSEDC(:,:,JK))/PRHODREF(:,:,JK) + END DO + DEALLOCATE(ZRRS) + DEALLOCATE(ZCRS) + DEALLOCATE(ZRRT) + DEALLOCATE(ZCRT) + DEALLOCATE(ZLBDR) + ELSE + ZWSEDR(:,:,IKB) = 0.0 + END IF ! max PRRS > ZRTMIN(3) +! + PINPRR(:,:) = PINPRR(:,:) + ZWSEDR(:,:,IKB)/XRHOLW/KSPLITR ! in m/s + PINPRR3D(:,:,:) = PINPRR3D(:,:,:) + ZWSEDR(:,:,:)/XRHOLW/KSPLITR ! in m/s +! + DEALLOCATE(ZRHODREF) + DEALLOCATE(ZZW1) + DEALLOCATE(ZZW2) + DEALLOCATE(ZZW3) + IF( JN==KSPLITR ) THEN + IF( OSEDC ) THEN + PRCS(:,:,:) = PRCS(:,:,:) / PTSTEP + PCCS(:,:,:) = PCCS(:,:,:) / PTSTEP + END IF + PRRS(:,:,:) = PRRS(:,:,:) / PTSTEP + PCRS(:,:,:) = PCRS(:,:,:) / PTSTEP + END IF + END IF ! ISEDIM +END DO ! KSPLITR +! +!++cb++ +DEALLOCATE(ZRTMIN) +DEALLOCATE(ZCTMIN) +!--cb-- + +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE LIMA_WARM_SEDIMENTATION diff --git a/src/mesonh/micro/modd_blankn.f90 b/src/mesonh/micro/modd_blankn.f90 new file mode 100644 index 000000000..642810313 --- /dev/null +++ b/src/mesonh/micro/modd_blankn.f90 @@ -0,0 +1,173 @@ +!MNH_LIC Copyright 1996-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ################# + MODULE MODD_BLANK_n +! ################# +! +!!**** *MODD_BLANK$n* - Declarative module for MesoNH developpers namelist +!! +!! PURPOSE +!! ------- +!! +!! Offer dummy real, integer, logical and character variables for +!! test and debugging purposes. +!! +!!** METHOD +!! ------ +!! +!! Eight dummy real, integer, logical and character*80 variables are +!! defined and passed through the namelist read operations. None of the +!! MesoNH routines uses any of those variables. When a developper choses +!! to introduce temporarily a parameter to some subroutine, he has to +!! introduce a USE MODD_BLANK statement into that subroutine. Then he +!! can use any of the variables defined here and change them easily via +!! the namelist input. +!! +!! REFERENCE +!! --------- +!! None +!! +!! AUTHOR +!! ------ +!! K. Suhre *Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! +!! Original 25/04/96 +!! updated 17/11/00 (P Jabouille) Use dummy array +!! updated 26/10/21 (Q.Rodier) Use for n model (grid-nesting) +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAMETERS, ONLY : JPDUMMY, JPMODELMAX +! +IMPLICIT NONE +! +TYPE BLANK_t +! + LOGICAL :: LDUMMY1 + LOGICAL :: LDUMMY2 + LOGICAL :: LDUMMY3 + LOGICAL :: LDUMMY4 + LOGICAL :: LDUMMY5 + LOGICAL :: LDUMMY6 + LOGICAL :: LDUMMY7 + LOGICAL :: LDUMMY8 +! + CHARACTER(len=80) :: CDUMMY1 + CHARACTER(len=80) :: CDUMMY2 + CHARACTER(len=80) :: CDUMMY3 + CHARACTER(len=80) :: CDUMMY4 + CHARACTER(len=80) :: CDUMMY5 + CHARACTER(len=80) :: CDUMMY6 + CHARACTER(len=80) :: CDUMMY7 + CHARACTER(len=80) :: CDUMMY8 +! + INTEGER :: NDUMMY1 + INTEGER :: NDUMMY2 + INTEGER :: NDUMMY3 + INTEGER :: NDUMMY4 + INTEGER :: NDUMMY5 + INTEGER :: NDUMMY6 + INTEGER :: NDUMMY7 + INTEGER :: NDUMMY8 +! + REAL :: XDUMMY1 + REAL :: XDUMMY2 + REAL :: XDUMMY3 + REAL :: XDUMMY4 + REAL :: XDUMMY5 + REAL :: XDUMMY6 + REAL :: XDUMMY7 + REAL :: XDUMMY8 +! +END TYPE BLANK_t +! +TYPE(BLANK_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: BLANK_MODEL +! +LOGICAL, POINTER :: LDUMMY1=>NULL() +LOGICAL, POINTER :: LDUMMY2=>NULL() +LOGICAL, POINTER :: LDUMMY3=>NULL() +LOGICAL, POINTER :: LDUMMY4=>NULL() +LOGICAL, POINTER :: LDUMMY5=>NULL() +LOGICAL, POINTER :: LDUMMY6=>NULL() +LOGICAL, POINTER :: LDUMMY7=>NULL() +LOGICAL, POINTER :: LDUMMY8=>NULL() +! +CHARACTER(len=80), POINTER :: CDUMMY1=>NULL() +CHARACTER(len=80), POINTER :: CDUMMY2=>NULL() +CHARACTER(len=80), POINTER :: CDUMMY3=>NULL() +CHARACTER(len=80), POINTER :: CDUMMY4=>NULL() +CHARACTER(len=80), POINTER :: CDUMMY5=>NULL() +CHARACTER(len=80), POINTER :: CDUMMY6=>NULL() +CHARACTER(len=80), POINTER :: CDUMMY7=>NULL() +CHARACTER(len=80), POINTER :: CDUMMY8=>NULL() +! +INTEGER, POINTER :: NDUMMY1=>NULL() +INTEGER, POINTER :: NDUMMY2=>NULL() +INTEGER, POINTER :: NDUMMY3=>NULL() +INTEGER, POINTER :: NDUMMY4=>NULL() +INTEGER, POINTER :: NDUMMY5=>NULL() +INTEGER, POINTER :: NDUMMY6=>NULL() +INTEGER, POINTER :: NDUMMY7=>NULL() +INTEGER, POINTER :: NDUMMY8=>NULL() +! +REAL, POINTER :: XDUMMY1=>NULL() +REAL, POINTER :: XDUMMY2=>NULL() +REAL, POINTER :: XDUMMY3=>NULL() +REAL, POINTER :: XDUMMY4=>NULL() +REAL, POINTER :: XDUMMY5=>NULL() +REAL, POINTER :: XDUMMY6=>NULL() +REAL, POINTER :: XDUMMY7=>NULL() +REAL, POINTER :: XDUMMY8=>NULL() +! +CONTAINS +! +SUBROUTINE BLANK_GOTO_MODEL(KFROM,KTO) +INTEGER, INTENT(IN) :: KFROM, KTO +! +LDUMMY1=>BLANK_MODEL(KTO)%LDUMMY1 +LDUMMY2=>BLANK_MODEL(KTO)%LDUMMY2 +LDUMMY3=>BLANK_MODEL(KTO)%LDUMMY3 +LDUMMY4=>BLANK_MODEL(KTO)%LDUMMY4 +LDUMMY5=>BLANK_MODEL(KTO)%LDUMMY5 +LDUMMY6=>BLANK_MODEL(KTO)%LDUMMY6 +LDUMMY7=>BLANK_MODEL(KTO)%LDUMMY7 +LDUMMY8=>BLANK_MODEL(KTO)%LDUMMY8 + +CDUMMY1=>BLANK_MODEL(KTO)%CDUMMY1 +CDUMMY2=>BLANK_MODEL(KTO)%CDUMMY2 +CDUMMY3=>BLANK_MODEL(KTO)%CDUMMY3 +CDUMMY4=>BLANK_MODEL(KTO)%CDUMMY4 +CDUMMY5=>BLANK_MODEL(KTO)%CDUMMY5 +CDUMMY6=>BLANK_MODEL(KTO)%CDUMMY6 +CDUMMY7=>BLANK_MODEL(KTO)%CDUMMY7 +CDUMMY8=>BLANK_MODEL(KTO)%CDUMMY8 +! +NDUMMY1=>BLANK_MODEL(KTO)%NDUMMY1 +NDUMMY2=>BLANK_MODEL(KTO)%NDUMMY2 +NDUMMY3=>BLANK_MODEL(KTO)%NDUMMY3 +NDUMMY4=>BLANK_MODEL(KTO)%NDUMMY4 +NDUMMY5=>BLANK_MODEL(KTO)%NDUMMY5 +NDUMMY6=>BLANK_MODEL(KTO)%NDUMMY6 +NDUMMY7=>BLANK_MODEL(KTO)%NDUMMY7 +NDUMMY8=>BLANK_MODEL(KTO)%NDUMMY8 +! +XDUMMY1=>BLANK_MODEL(KTO)%XDUMMY1 +XDUMMY2=>BLANK_MODEL(KTO)%XDUMMY2 +XDUMMY3=>BLANK_MODEL(KTO)%XDUMMY3 +XDUMMY4=>BLANK_MODEL(KTO)%XDUMMY4 +XDUMMY5=>BLANK_MODEL(KTO)%XDUMMY5 +XDUMMY6=>BLANK_MODEL(KTO)%XDUMMY6 +XDUMMY7=>BLANK_MODEL(KTO)%XDUMMY7 +XDUMMY8=>BLANK_MODEL(KTO)%XDUMMY8 +! +END SUBROUTINE BLANK_GOTO_MODEL +! +END MODULE MODD_BLANK_n diff --git a/src/mesonh/micro/modd_conf.f90 b/src/mesonh/micro/modd_conf.f90 new file mode 100644 index 000000000..a7995fec5 --- /dev/null +++ b/src/mesonh/micro/modd_conf.f90 @@ -0,0 +1,127 @@ +!MNH_LIC Copyright 1994-2018 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ################# + MODULE MODD_CONF +! ################# +! +!!**** *MODD_CONF* - declaration of configuration variables +!! +!! PURPOSE +!! ------- +! The purpose of this declarative module is to specify the variables +! which concern the configuration of all models. For exemple, +! the type of geometry (Cartesian or conformal projection plane). +! +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (module MODD_CONF) +!! Technical Specifications Report of the Meso-NH (chapters 2 and 3) +!! +!! AUTHOR +!! ------ +!! V. Ducrocq *Meteo France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 05/05/94 +!! J. Stein 09/01/95 add the 1D switch +!! J. Stein and P. Jabouille 30/04/96 add the storage type +!! J.-P. Pinty 13/02/96 add LFORCING switch +!! J. Stein 25/07/97 add the equation system switch +!! P. Jabouille 07/05/98 add LPACK +!! V. Masson 18/03/98 add the VERSION switch +!! V. Masson 15/03/99 add PROGRAM swith +!! P. Jabouille 21/07/99 add NHALO and CSPLIT +!! P. Jabouille 26/06/01 lagrangian variables +!! V. Masson 09/07/01 add LNEUTRAL switch +!! P. Jabouille 18/04/02 add NBUGFIX and CBIBUSER +!! C. Lac 01/04/14 add LCHECK +!! G. Tanguy 01/04/14 add LCOUPLING +!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 +!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +CHARACTER (LEN=5),SAVE :: CCONF ! Configuration of models + ! 'START' for start configuration + ! 'RESTART' for restart configuration +LOGICAL,SAVE :: LTHINSHELL ! Logical for thinshell approximation + ! .TRUE. = thinshell approximation + ! .FALSE. = no thinshell approximation +LOGICAL,SAVE :: LCARTESIAN ! Logical for cartesian geometry : + ! .TRUE. = cartesian geometry + ! .FALSE. = conformal projection +LOGICAL,SAVE :: L2D = .FALSE. ! Logical for 2D model version + ! .TRUE. = 2D model version + ! .FALSE. = 3D model version +LOGICAL,SAVE :: L1D ! Logical for 1D model version + ! .TRUE. = 1D model version + ! .FALSE. = 2D or 3D model version +LOGICAL,SAVE :: LFLAT ! Logical for zero ororography + ! .TRUE. = no orography (zs=0.) + ! .FALSE. = orography +INTEGER,SAVE :: NMODEL ! Number of nested models +INTEGER,SAVE :: NVERB ! Level of informations on output-listing + ! 0 for minimum of prints + ! 5 for intermediate level of prints + ! 10 for maximum of prints +CHARACTER (LEN=5),SAVE :: CEXP ! Experiment name +CHARACTER (LEN=5),SAVE :: CSEG ! name of segment +LOGICAL,SAVE :: LFORCING ! Logical for forcing sources + ! .TRUE. = add forcing sources + ! .FALSE. = no forcing fields +! +CHARACTER (LEN=3),SAVE :: CEQNSYS! EQuatioN SYStem resolved by the MESONH model + ! 'LHE' Lipps and HEmler anelastic system + ! 'DUR' approximated form of the DURran version + ! of the anelastic sytem + ! 'MAE' classical Modified Anelastic Equations + ! but with not any approximation in the + ! momentum equation + ! 'FCE' fully compressible equations ( not + ! yet developped ) +LOGICAL,SAVE :: LPACK ! Logical to compress 1D or 2D FM files +! +! +INTEGER,DIMENSION(3),SAVE :: NMNHVERSION ! Version of MesoNH +INTEGER,SAVE :: NMASDEV ! NMASDEV=XY corresponds to the masdevX_Y +INTEGER,SAVE :: NBUGFIX ! NBUGFIX=n corresponds to the BUGn of masdevX_Y +CHARACTER(LEN=10),SAVE :: CBIBUSER! CBIBUSER is the name of the user binary library +! +CHARACTER(LEN=6),SAVE :: CPROGRAM ! CPROGRAM is the program currently running: +! ! 'PGD ','ADVPGD','NESPGD','REAL ','IDEAL ' +! ! 'MESONH','SPAWN ','DIAG ','SPEC ' +! +INTEGER,SAVE :: NHALO ! Size of the halo for parallel distribution +! +!INTEGER,SAVE :: JPHEXT = 1 ! Horizontal External points number +! +CHARACTER (LEN=10),SAVE :: CSPLIT ! kind of domain splitting for parallel distribution + ! "BSPLITTING","XSPLITTING","YSPLITTING" +LOGICAL,SAVE :: LLG ! Logical to use lagrangian variables +LOGICAL,SAVE :: LINIT_LG ! to reinitialize lagrangian variables +CHARACTER (LEN=5),SAVE :: CINIT_LG ! to reinitialize LG variables at every output +LOGICAL,SAVE :: LNOMIXLG ! to use turbulence for lagrangian variables +! +LOGICAL,SAVE :: LNEUTRAL ! True if ref. theta field is uniform +! +LOGICAL,SAVE :: LCPL_AROME ! true if coupling file are issued from AROME +LOGICAL,SAVE :: LCOUPLING ! true if coupling file (and not intial file) + ! (with LCOUPLING=T in PREP_REAL_CASE) +! +LOGICAL,SAVE :: LCHECK ! To test reproducibility +! +END MODULE MODD_CONF diff --git a/src/mesonh/micro/modd_cst.f90 b/src/mesonh/micro/modd_cst.f90 new file mode 100644 index 000000000..73607888c --- /dev/null +++ b/src/mesonh/micro/modd_cst.f90 @@ -0,0 +1,116 @@ +!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ############### + MODULE MODD_CST +! ############### +! +!!**** *MODD_CST* - declaration of Physic constants +!! +!! PURPOSE +!! ------- +! The purpose of this declarative module is to declare the +! Physics constants. +! +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (MODD_CST) +!! +!! AUTHOR +!! ------ +!! V. Ducrocq *Meteo France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 16/05/94 +!! J. Stein 02/01/95 add xrholw +!! J.-P. Pinty 13/12/95 add XALPI,XBETAI,XGAMI +!! J. Stein 25/07/97 add XTH00 +!! V. Masson 05/10/98 add XRHOLI +!! C. Mari 31/10/00 add NDAYSEC +!! V. Masson 01/03/03 add conductivity of ice +!! J.Escobar : 10/2017 : for real*4 , add XMNH_HUGE_12_LOG +!! J.L. Redelsperger 03/2021 add constants for ocean penetrating solar +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +REAL,SAVE :: XPI ! Pi +! +REAL,SAVE :: XDAY,XSIYEA,XSIDAY ! day duration, sideral year duration, + ! sideral day duration +! +REAL,SAVE :: XKARMAN ! von karman constant +REAL,SAVE :: XLIGHTSPEED ! light speed +REAL,SAVE :: XPLANCK ! Planck constant +REAL,SAVE :: XBOLTZ ! Boltzman constant +REAL,SAVE :: XAVOGADRO ! Avogadro number +! +REAL,SAVE :: XRADIUS,XOMEGA ! Earth radius, earth rotation +REAL,SAVE :: XG ! Gravity constant +! +REAL,SAVE :: XP00 ! Reference pressure +REAL,SAVE :: XP00OCEAN ! Reference pressure for ocean model +REAL,SAVE :: XRH00OCEAN ! Reference density for ocean model +! +REAL,SAVE :: XSTEFAN,XI0 ! Stefan-Boltzman constant, solar constant +! +REAL,SAVE :: XMD,XMV ! Molar mass of dry air and molar mass of vapor +REAL,SAVE :: XRD,XRV ! Gaz constant for dry air, gaz constant for vapor +REAL,SAVE :: XEPSILO ! XMV/XMD +REAL,SAVE :: XCPD,XCPV ! Cpd (dry air), Cpv (vapor) +REAL,SAVE :: XRHOLW ! Volumic mass of liquid water +REAL,SAVE :: XCL,XCI ! Cl (liquid), Ci (ice) +REAL,SAVE :: XTT ! Triple point temperature +REAL,SAVE :: XLVTT ! Vaporization heat constant +REAL,SAVE :: XLSTT ! Sublimation heat constant +REAL,SAVE :: XLMTT ! Melting heat constant +REAL,SAVE :: XESTT ! Saturation vapor pressure at triple point + ! temperature +REAL,SAVE :: XALPW,XBETAW,XGAMW ! Constants for saturation vapor + ! pressure function +REAL,SAVE :: XALPI,XBETAI,XGAMI ! Constants for saturation vapor + ! pressure function over solid ice +REAL,SAVE :: XCONDI ! thermal conductivity of ice (W m-1 K-1) +REAL,SAVE :: XALPHAOC ! thermal expansion coefficient for ocean (K-1) +REAL,SAVE :: XBETAOC ! Haline contraction coeff for ocean (S-1) +REAL,SAVE :: XTH00 ! reference value for the potential temperature +REAL,SAVE :: XTH00OCEAN ! Ref value for pot temp in ocean model +REAL,SAVE :: XSA00OCEAN ! Ref value for SAlinity in ocean model +REAL,SAVE :: XROC=0.69! 3 coeffs for SW penetration in Ocean (Hoecker et al) +REAL,SAVE :: XD1=1.1 +REAL,SAVE :: XD2=23. +! Values used in SURFEX CMO +!REAL,SAVE :: XROC=0.58 +!REAL,SAVE :: XD1=0.35 +!REAL,SAVE :: XD2=23. + +REAL,SAVE :: XRHOLI ! Volumic mass of liquid water +! +INTEGER, SAVE :: NDAYSEC ! Number of seconds in a day +! +! +! Some machine precision value depending of real4/8 use +! +REAL,SAVE :: XMNH_TINY ! minimum real on this machine +REAL,SAVE :: XMNH_TINY_12 ! sqrt(minimum real on this machine) +REAL,SAVE :: XMNH_EPSILON ! minimum space with 1.0 +REAL,SAVE :: XMNH_HUGE ! maximum real on this machine +REAL,SAVE :: XMNH_HUGE_12_LOG ! maximum log(sqrt(real)) on this machine + +REAL,SAVE :: XEPS_DT ! default value for DT test +REAL,SAVE :: XRES_FLAT_CART ! default flat&cart residual tolerance +REAL,SAVE :: XRES_OTHER ! default not flat&cart residual tolerance +REAL,SAVE :: XRES_PREP ! default prep residual tolerance + +! +END MODULE MODD_CST diff --git a/src/mesonh/micro/modd_dyn.f90 b/src/mesonh/micro/modd_dyn.f90 new file mode 100644 index 000000000..244a67f95 --- /dev/null +++ b/src/mesonh/micro/modd_dyn.f90 @@ -0,0 +1,86 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ $Date$ +!----------------------------------------------------------------- +!----------------------------------------------------------------- +!----------------------------------------------------------------- +! ################ + MODULE MODD_DYN +! ################ +! +!!**** *MODD_DYN* - declaration of dynamic control variables +!! +!! PURPOSE +!! ------- +! The purpose of this declarative module is to declare the dynamic +! control variables for all models. +! +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_PARAMETERS : contains the maximum number of coupling files +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (module MODD_DYN) +!! Technical Specifications Report of the Meso-NH (chapters 2 and 3) +!! +!! AUTHOR +!! ------ +!! V. Ducrocq *Meteo France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 06/05/94 +!! Modifications 17/10/94 (Stein) For LCORIO +!! Modifications 12/12/94 (Stein) remove LABSLAYER + add XALZBOT +!! and XALKBOT +!! Modifications 10/03/95 (I.Mallet) add coupling variables +!! 04/05/07 (C.Lac) Separation of num.diffusion +!! between variables +!--------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAMETERS +! +IMPLICIT NONE +! +REAL ,SAVE :: XSEGLEN ! Duration of segment (in seconds) +REAL ,SAVE :: XASSELIN ! Asselin coefficient +REAL ,SAVE :: XASSELIN_SV! Asselin coefficient for tracer variables +LOGICAL,SAVE :: LCORIO ! Coriolis flag +LOGICAL,SAVE :: LNUMDIFU ! logical switch for the NUMerical DIFFusion: + ! .TRUE. active .FALSE. unactive + ! for momentum +LOGICAL,SAVE :: LNUMDIFTH ! For theta and mixing ratio +LOGICAL,SAVE :: LNUMDIFSV ! For scalar variables +LOGICAL,SAVE :: LSTEADYLS ! logical switch to remove all Larger Scale fields + ! evolution during the segment (the LS fields are + ! STEADY).TRUE. LS steady .FALSE. LS unsteady +REAL ,SAVE :: XALKTOP ! Damping coef. at the top of the absorbing + ! layer +REAL ,SAVE :: XALZBOT ! Height of the absorbing layer base +! +REAL ,SAVE :: XALKGRD ! Damping coef. at the top of the absorbing + ! layer (bottom layer) +REAL ,SAVE :: XALZBAS ! Height of the absorbing layer base (bottom layer) +! +INTEGER,SAVE :: NCPL_NBR ! NumBeR of CouPLing files +INTEGER,SAVE :: NCPL_CUR ! Number of CURrent CouPLing file +! +LOGICAL, SAVE, DIMENSION(JPMODELMAX) :: LUSERV_G, LUSERC_G, LUSERR_G, LUSERI_G +LOGICAL, SAVE, DIMENSION(JPMODELMAX) :: LUSERS_G, LUSERH_G, LUSERG_G +LOGICAL, SAVE, DIMENSION(JPMODELMAX) :: LUSETKE +LOGICAL, SAVE, DIMENSION(JPSVMAX,JPMODELMAX) :: LUSESV +REAL, SAVE, DIMENSION(JPCPLFILEMAX,JPMODELMAX) :: NCPL_TIMES ! array of + ! the number for the coupling instants of every nested model +REAL, SAVE :: XTSTEP_MODEL1 ! time step of the + ! outermost model +END MODULE MODD_DYN diff --git a/src/mesonh/micro/modd_elec_descr.f90 b/src/mesonh/micro/modd_elec_descr.f90 new file mode 100644 index 000000000..82d346588 --- /dev/null +++ b/src/mesonh/micro/modd_elec_descr.f90 @@ -0,0 +1,178 @@ +!MNH_LIC Copyright 2002-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ####################### + MODULE MODD_ELEC_DESCR +! ####################### +! +!!**** *MODD_ELEC_DESCR* - declaration of the electrical descriptive constants +!! +!! PURPOSE +!! ------- +! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! Gilles Molinie * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original 14/11/02 +!! M. Chong 26/01/10 Small ions parameters +!! +Option for Fair weather field from +!! Helsdon-Farley (JGR, 1987, 5661-5675) +!! Add "Beard" effect via sedimentation process +!! J.-P. Pinty 25/10/13 Add "Latham" effect via aggregation process +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAMETERS, ONLY: JPSVNAMELGTMAX + +IMPLICIT NONE +! +! Namelist +LOGICAL :: LOCG=.FALSE. ! .T.: only charge generation +LOGICAL :: LELEC_FIELD=.TRUE. ! .T.: the electric field is computed +LOGICAL :: LFW_HELFA=.FALSE. ! .T.: Helsdon-Farley Fair Weather field +LOGICAL :: LCOSMIC_APPROX=.FALSE. ! .T.: Neglecting height variations of fair + ! weather ion current in calculating ion + ! source (XIONSOURCEFW) from cosmic rays +LOGICAL :: LION_ATTACH = .TRUE. ! .T.: Ion attachment to hydrometeors +CHARACTER (LEN=3) :: CDRIFT = 'PPM' ! PPM (advection) or DIV (Divergence form) +LOGICAL :: LRELAX2FW_ION = .FALSE. ! .T.= Relaxation to fair weather ion + ! concentration in rim zone and top absorbing + ! layer +LOGICAL :: LFLASH_GEOM=.TRUE. ! .T.: the 'geometric' flash scheme is used +LOGICAL :: LSAVE_COORD=.FALSE. ! .T.: the flash coord are written in an ascii file +INTEGER :: NFLASH_WRITE = 1000 ! Number of flashes to be saved before writing + ! the diag and/or coordinates in ascii files +LOGICAL :: LINDUCTIVE=.FALSE. ! .T.: inductive process is taken into account +LOGICAL :: LLNOX_EXPLICIT=.FALSE. ! .T.: lnox production is computed +LOGICAL :: LSERIES_ELEC=.FALSE. ! .T.: looking for flash rate proxies +INTEGER :: NTSAVE_SERIES = 60 ! time interval at which data from + ! series_cloud_elec are written in an ascii file +! +CHARACTER (LEN=5) :: CNI_CHARGING='TAKAH' ! Choice of the charging process +REAL :: XQTC=263. ! temperature charge reversal for 'HELFA' +REAL :: XLIM_NI_IS=10.E-15 ! max magnitude of dq for I-S non-inductive charging (C) +REAL :: XLIM_NI_IG=30.E-15 ! max magnitude of dq for I-G non-inductive charging (C) +REAL :: XLIM_NI_SG=100.E-15 ! max magnitude of dq for S-G non-inductive charging (C) +! +CHARACTER (LEN=5) :: CLSOL='RICHA' ! Choice of the Laplace equation solver +INTEGER :: NLAPITR_ELEC=4 ! Nb of iteration for the elec field solveur +REAL :: XRELAX_ELEC=1 ! Relaxation factor for the elec field solveur +! +REAL :: XETRIG=200.E3 ! E threshold for lightning triggering +REAL :: XEBALANCE=0.1 ! Proportion of XETRIG that the lightning must reduce +REAL :: XEPROP=15.E3 ! E threshold for lightning propagation +! +REAL :: XQEXCES=2.E-10 ! Charge in excess of qexces => pt available for cell detection +REAL :: XQNEUT=1.E-10 ! Charge in excess of qneut is neutralized +REAL :: XDFRAC_ECLAIR=2.3 ! Fractal dimension of lightning flashes +REAL :: XDFRAC_L=1500. ! Linear coefficient for the branch number +! +REAL :: XWANG_A = 0.34E21 ! Wang eta al. parameters of +REAL :: XWANG_B = 1.3E16 ! LNOX production +! +! +REAL, DIMENSION(:), SAVE, ALLOCATABLE :: XQTMIN ! Min values allowed for the + ! volumetric charge +REAL, DIMENSION(:) , ALLOCATABLE :: XRTMIN_ELEC ! Limit value of R where charge is available +! +REAL, SAVE :: XCXR ! Exponent in the concentration-slope +REAL :: XEPSILON ! Dielectric permittivity of air (F/m) +REAL :: XECHARGE ! Elementary charge (C) +! +! charge-diameter relationship : e_x and f_x in q_x=e_xD^f_x +! +REAL, DIMENSION(:), SAVE, ALLOCATABLE :: XEC, XER, XEI, XES, XEG, XEH ! e_x +REAL, SAVE :: XFC, XFR, XFI, XFS, XFG, XFH ! f_x +! +! +! parameters relative to electrification +! +REAL :: XESR, & ! Mean collection efficiency for rain-aggregate, + XEGR, & ! graupel_rain, + XEGS ! graupel_snow +REAL :: XDELTATMIN ! Minimum temperature gap between ZTT(:) and XQTC +! +REAL :: XQINDIV_C_CST, & ! + XQINDIV_R_CST, & ! + XQINDIV_I_CST, & ! Constants for the individual charge + XQINDIV_I_EXP, & ! calculation + XQINDIV_S_CST, & ! + XQINDIV_G_CST ! +! +REAL, SAVE :: XLBDAR_MAXE, & ! Max values allowed for the shape + XLBDAS_MAXE, & ! when computation of charge separation + XLBDAG_MAXE, & ! and of lightning neutralisation + XLBDAH_MAXE ! +REAL :: XALPHACQ, XNUCQ, XLBDACQ +! +! +! parameters relative to the electric field +! +REAL :: XE_0, XKEF ! Constant for the fair weather electric field + +REAL, SAVE :: XE0_HF, XA1_HF, XB1_HF, XA2_HF, XB2_HF, XA3_HF, XB3_HF ! Coeffs. + ! Helsdon-Farley Fair Weather Electric Field +REAL, SAVE :: XIONCOMB ! Ionic recombination coefficient (m3/s) +REAL, SAVE :: XF_POS, XF_NEG ! Constant for positive/negative ion mobility + ! law (m2/V/s) +REAL, SAVE :: XEXPMOB ! Exponent of ion mobility law (m-1) + +REAL, SAVE :: XFCORONA ! Factor for corona current (A m /V3) +REAL, SAVE :: XECORONA ! Electric field threshold for corona (V/m) + +! Fair Weather electric property (Chiu, JGR 1978, 5025-5049) +! +REAL, SAVE :: XJCURR_FW ! Air-earth conduction current (A/m2) +! +! Lightning flashes +! +INTEGER :: NMAX_CELL ! max number of electrified cells in the domain +INTEGER :: NBRANCH_MAX ! max number of branches per flash +INTEGER :: NLEADER_MAX ! max number of segments in the bi-leader +REAL :: XE_THRESH ! electric field threshold for cell detection +! +INTEGER, PARAMETER :: NLGHTMAX = 5000, & ! Nb max of lightnings + NSEGMAX = 500 ! Nb max of segments +! +! Parameters relative to the lightning +! +INTEGER :: NNBLIGHT=0 ! Nb of lightning flashes +! +REAL, DIMENSION(:), ALLOCATABLE :: XNEUT_POS, XNEUT_NEG +INTEGER :: NNB_CG ! Nb of CG flashes +INTEGER :: NNB_CG_POS ! Nb of positive CG flashes +REAL :: XALT_CG ! Altitude (m) at which CG are detected +! +CHARACTER(LEN=JPSVNAMELGTMAX), DIMENSION(8) & + :: CELECNAMES=(/'QNIONP','QCELEC','QRELEC','QIELEC','QSELEC', & + 'QGELEC','QHELEC','QNIONN'/) +! QNIONP (QNIONN): Positive (Negative) ion concentration +! basenames of the SV articles stored in the binary files +! +REAL :: XLNOX_ECLAIR +! +REAL, DIMENSION(:,:), ALLOCATABLE :: XEPOTFW_TOP +! +! Parameters relative to the "Beard" effect ELEC=>MICROPHYS +! +LOGICAL :: LSEDIM_BEARD=.FALSE. ! .T.: to enable ELEC=>MICROPHYS via +! ! particule sedimentation rate +LOGICAL :: LIAGGS_LATHAM=.FALSE. ! .T.: to enable ELEC=>MICROPHYS via +! ! ice aggregation rate +! +END MODULE MODD_ELEC_DESCR diff --git a/src/mesonh/micro/modd_les.f90 b/src/mesonh/micro/modd_les.f90 new file mode 100644 index 000000000..db71d6f33 --- /dev/null +++ b/src/mesonh/micro/modd_les.f90 @@ -0,0 +1,458 @@ +!MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ############### + MODULE MODD_LES +! ############### +! +!!**** *MODD_LES* - declaration of prognostic variables +!! +!! PURPOSE +!! ------- +! The purpose of this declarative module is to specify the +! resolved fluxes and the spectra computed in LES mode +! +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (module MODD_LES) +!! Technical Specifications Report of the Meso-NH (chapters 2 and 3) +!! +!! +!! AUTHOR +!! ------ +!! J. Cuxart *INM and Meteo France* +!! +!! MODIFICATIONS +!! ------------- +!! Original March 10, 1995 +!! +!! (J.Stein) Sept. 25, 1995 add the model number in LES mode +!! J. Cuxart Oct. 4, 1996 New time series +!! V. Masson Jan. 20, 2000 New LES routines variables & // +!! V. Masson Nov. 6, 2002 LES budgets +!! F. Couvreux Oct 1, 2006 LES PDF +!! J.Pergaud Oct , 2007 MF LES +!! P. Aumond Oct ,2009 User multimaskS + 4th order +!! C.Lac Oct ,2014 Correction on user masks +! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management +! P. Wautelet 30/03/2021: budgets: LES cartesian subdomain limits are defined in the physical domain +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAMETERS +! +IMPLICIT NONE +! +!------------------------------------------------------------------------------- +! +!* namelist variables +! +LOGICAL :: LLES_MEAN ! flag to activate the mean computations +LOGICAL :: LLES_RESOLVED ! flag to activate the resolved var. computations +LOGICAL :: LLES_SUBGRID ! flag to activate the subgrid var. computations +LOGICAL :: LLES_UPDRAFT ! flag to activate the computations in updrafts +LOGICAL :: LLES_DOWNDRAFT ! flag to activate the computations in downdrafts +LOGICAL :: LLES_SPECTRA ! flag to activate the spectra computations +LOGICAL :: LLES_PDF ! flag to activate the pdf computations +! +INTEGER, DIMENSION(900) :: NLES_LEVELS ! physical model levels for LES comp. +REAL, DIMENSION(900) :: XLES_ALTITUDES ! alt. levels for LES comp. +INTEGER, DIMENSION(900) :: NSPECTRA_LEVELS ! physical model levels for spectra comp. +REAL, DIMENSION(900) :: XSPECTRA_ALTITUDES ! alt. levels for spectra comp. +! +INTEGER, DIMENSION( 10) :: NLES_TEMP_SERIE_I ! I, J and Z point +INTEGER, DIMENSION( 10) :: NLES_TEMP_SERIE_J ! localizations to +INTEGER, DIMENSION( 10) :: NLES_TEMP_SERIE_Z ! record temporal data + +CHARACTER(LEN=4) :: CLES_NORM_TYPE ! type of turbulence normalization +CHARACTER(LEN=3) :: CBL_HEIGHT_DEF ! definition of the boundary layer height + +REAL :: XLES_TEMP_SAMPLING ! temporal sampling between each computation +REAL :: XLES_TEMP_MEAN_START ! time (in s) from the beginning of the simulation +REAL :: XLES_TEMP_MEAN_END ! for start and end of the temporal averaged comp. +REAL :: XLES_TEMP_MEAN_STEP ! time step for each averaging + +LOGICAL :: LLES_CART_MASK ! flag to use a cartesian mask +INTEGER :: NLES_IINF ! definition of the cartesians mask in physical domain +INTEGER :: NLES_ISUP ! for NLES_CART_MODNBR model +INTEGER :: NLES_JINF ! " +INTEGER :: NLES_JSUP ! " +LOGICAL :: LLES_NEB_MASK ! flag to use a 2D nebulosity mask +LOGICAL :: LLES_CORE_MASK ! flag to use a 3D cloud core mask +LOGICAL :: LLES_MY_MASK ! flag to use its own mask (must be coded by user) +INTEGER :: NLES_MASKS_USER ! number of user masks for LES computations +LOGICAL :: LLES_CS_MASK ! flag to use conditional sampling mask +INTEGER :: NPDF ! number of pdf intervals +! +!------------------------------------------------------------------------------- +! +INTEGER, DIMENSION(JPMODELMAX) :: NLESn_IINF ! definition of the cartesians mask in physical domain +INTEGER, DIMENSION(JPMODELMAX) :: NLESn_ISUP ! for all models +INTEGER, DIMENSION(JPMODELMAX) :: NLESn_JINF ! " +INTEGER, DIMENSION(JPMODELMAX) :: NLESn_JSUP ! " +! +CHARACTER(LEN=4), DIMENSION(2,JPMODELMAX) :: CLES_LBCX +! X boundary conditions for 2 points correlations computations for all models +! +CHARACTER(LEN=4), DIMENSION(2,JPMODELMAX) :: CLES_LBCY +! Y boundary conditions for 2 points correlations computations for all models +! +!------------------------------------------------------------------------------- +! +LOGICAL :: LLES ! flag to compute the LES diagnostics +! +LOGICAL :: LLES_CALL ! flag to compute the LES diagnostics at current +! ! time step +! +! +LOGICAL, DIMENSION(:,:,:), ALLOCATABLE :: LLES_CURRENT_CART_MASK +! 2D cartesian mask of the current model +! +LOGICAL, DIMENSION(:,:,:), ALLOCATABLE :: LLES_CURRENT_NEB_MASK +! 2D nebulosity mask of the current model +! +LOGICAL, DIMENSION(:,:,:), ALLOCATABLE :: LLES_CURRENT_CORE_MASK +! 2D surface precipitations mask of the current model +! +! 2D owner mask of the current model +LOGICAL, DIMENSION(:,:,:,:), ALLOCATABLE :: LLES_CURRENT_MY_MASKS +! +LOGICAL, DIMENSION(:,:,:), ALLOCATABLE :: LLES_CURRENT_CS1_MASK +LOGICAL, DIMENSION(:,:,:), ALLOCATABLE :: LLES_CURRENT_CS2_MASK +LOGICAL, DIMENSION(:,:,:), ALLOCATABLE :: LLES_CURRENT_CS3_MASK +! 2D conditional sampling mask of the current model +! +INTEGER :: NLES_CURRENT_TCOUNT +! current model LES time counter +! +INTEGER :: NLES_CURRENT_TIMES +! current model NLES_TIMES (number of LES samplings) +! +INTEGER :: NLES_CURRENT_IINF, NLES_CURRENT_ISUP, NLES_CURRENT_JINF, NLES_CURRENT_JSUP +! coordinates (in physical domain) for write_diachro, set to NLESn_IINF(current model), etc... +! +REAL :: XLES_CURRENT_DOMEGAX, XLES_CURRENT_DOMEGAY +! minimum wavelength in spectra analysis +! +CHARACTER(LEN=4), DIMENSION(2) :: CLES_CURRENT_LBCX +! current model X boundary conditions for 2 points correlations computations +! +CHARACTER(LEN=4), DIMENSION(2) :: CLES_CURRENT_LBCY +! current model Y boundary conditions for 2 points correlations computations +! +REAL, DIMENSION(:), ALLOCATABLE :: XLES_CURRENT_Z +! altitudes for diachro +! +REAL :: XLES_CURRENT_ZS +! orography (used for normalization of altitudes) +! +INTEGER, DIMENSION(:,:,:), ALLOCATABLE :: NKLIN_CURRENT_LES +! levels for vertical interpolation +! +REAL, DIMENSION(:,:,:), ALLOCATABLE :: XCOEFLIN_CURRENT_LES +! coefficients for vertical interpolation +! +INTEGER, DIMENSION(:,:,:), ALLOCATABLE :: NKLIN_CURRENT_SPEC +! levels for vertical interpolation +! +REAL, DIMENSION(:,:,:), ALLOCATABLE :: XCOEFLIN_CURRENT_SPEC +! coefficients for vertical interpolation +! +REAL,DIMENSION(2) :: XTIME_LES +! time spent in subgrid LES computations in this time-step in TURB +! +!------------------------------------------------------------------------------- +! +!* normalization variables +! +REAL, DIMENSION(:), ALLOCATABLE :: XLES_NORM_M +! normalization coefficient for distances (Meters) +! +REAL, DIMENSION(:), ALLOCATABLE :: XLES_NORM_K +! normalization coefficient for temperatures (Kelvin) +! +REAL, DIMENSION(:), ALLOCATABLE :: XLES_NORM_S +! normalization coefficient for times (Seconds) +! +REAL, DIMENSION(:), ALLOCATABLE :: XLES_NORM_RHO +! normalization coefficient for densities +! +REAL, DIMENSION(:), ALLOCATABLE :: XLES_NORM_RV +! normalization coefficient for mixing ratio +! +REAL, DIMENSION(:,:), ALLOCATABLE :: XLES_NORM_SV +! normalization coefficient for scalar variables +! +REAL, DIMENSION(:), ALLOCATABLE :: XLES_NORM_P +! normalization coefficient for pressure +! +!------------------------------------------------------------------------------- +! +!* monitoring variables +! +INTEGER :: NLES_MASKS ! number of masks for LES computations +INTEGER :: NLES_K ! number of vertical levels for local diagnostics +INTEGER :: NSPECTRA_K ! number of vertical levels for spectra +! +CHARACTER(LEN=1) :: CLES_LEVEL_TYPE ! type of vertical levels for local diag. +CHARACTER(LEN=1) :: CSPECTRA_LEVEL_TYPE ! type of vertical levels for spectra +! +!------------------------------------------------------------------------------- +! +!* subgrid variables for current model +! +! ______ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_W_SBG_WThl ! <w'w'Thl'> +! _____ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_W_SBG_WRt ! <w'w'Rt'> +! _____ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_W_SBG_Thl2 ! <w'Thl'2> +! ____ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_W_SBG_Rt2 ! <w'Rt'2> +! _______ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_W_SBG_ThlRt! <w'Thl'Rt'> +! _____ +REAL, DIMENSION(:,:,:,:),ALLOCATABLE:: X_LES_RES_W_SBG_WSv ! <w'w'Sv'> +! ____ +REAL, DIMENSION(:,:,:,:),ALLOCATABLE:: X_LES_RES_W_SBG_Sv2 ! <w'Sv'2> +! +REAL, DIMENSION(:,:,:), ALLOCATABLE :: XLES_SUBGRID_RCSIGS ! rc sigmas +! +REAL, DIMENSION(:,:,:), ALLOCATABLE :: XLES_SUBGRID_RCSIGC ! rc sigmac +! _____ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_ddxa_U_SBG_UaU ! <du'/dxa ua'u'> +! _____ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_ddxa_V_SBG_UaV ! <dv'/dxa ua'v'> +! _____ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_ddxa_W_SBG_UaW ! <dw'/dxa ua'w'> +! _______ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_ddxa_W_SBG_UaThl ! <dw'/dxa ua'Thl'> +! _____ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_ddxa_Thl_SBG_UaW ! <dThl'/dxa ua'w'> +! ___ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_ddz_Thl_SBG_W2 ! <dThl'/dz w'2> +! ______ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_ddxa_W_SBG_UaRt ! <dw'/dxa ua'Rt'> +! _____ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_ddxa_Rt_SBG_UaW ! <dRt'/dxa ua'w'> +! ___ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_ddz_Rt_SBG_W2 ! <dRt'/dz w'2> +! ______ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_ddxa_Thl_SBG_UaRt! <dThl'/dxa ua'Rt'> +! _______ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_ddxa_Rt_SBG_UaThl! <dRt'/dxa ua'Thl'> +! _______ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_ddxa_Thl_SBG_UaThl! <dThl'/dxa ua'Thl'> +! ______ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_ddxa_Rt_SBG_UaRt ! <dRt'/dxa ua'Rt'> +! ______ +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: X_LES_RES_ddxa_W_SBG_UaSv ! <dw'/dxa ua'Sv'> +! _____ +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: X_LES_RES_ddxa_Sv_SBG_UaW ! <dSv'/dxa ua'w'> +! ___ +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: X_LES_RES_ddz_Sv_SBG_W2 ! <dSv'/dz w'2> +! ______ +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: X_LES_RES_ddxa_Sv_SBG_UaSv ! <dSv'/dxa ua'Sv'> +! +! ___ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_U2 ! <u'2> +! ___ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_V2 ! <v'2> +! ___ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_W2 ! <w'2> +! _____ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_Thl2 ! <Thl'2> +! ____ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_Rt2 ! <Rt'2> +! ____ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_Rc2 ! <Rc'2> +! ____ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_Ri2 ! <Ri'2> +! _______ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_ThlRt ! <Thl'Rt'> +! ____ +REAL, DIMENSION(:,:,:,:),ALLOCATABLE:: X_LES_SUBGRID_Sv2 ! <Sv'2> +! ____ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_UV ! <u'v'> +! ____ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WU ! <w'u'> +! ____ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WV ! <w'v'> +! ______ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_UThl ! <u'Thl'> +! ______ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_VThl ! <v'Thl'> +! ______ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WThl ! <w'Thl'> +! _____ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_URt ! <u'Rt'> +! _____ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_VRt ! <v'Rt'> +! _____ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WRt ! <w'Rt'> +! _____ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_URc ! <u'Rc'> +! _____ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_VRc ! <v'Rc'> +! _____ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WRc ! <w'Rc'> +! _____ +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: X_LES_SUBGRID_USv ! <u'Sv'> +! _____ +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: X_LES_SUBGRID_VSv ! <v'Sv'> +! _____ +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WSv ! <w'Sv'> +! ___ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_UTke ! <u'e> +! ___ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_VTke ! <v'e> +! ___ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WTke ! <w'e> +! ___ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_ddz_WTke ! <dw'e/dz> +! ______ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WThv ! <w'Thv'> +! ________ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_ThlThv ! <Thl'Thv'> +! _______ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_RtThv ! <Rt'Thv'> +! _______ +REAL, DIMENSION(:,:,:,:),ALLOCATABLE:: X_LES_SUBGRID_SvThv ! <Sv'Thv'> +! ______ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_W2Thl ! <w'2Thl> +! _____ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_W2Rt ! <w'2Rt> +! _____ +REAL, DIMENSION(:,:,:,:),ALLOCATABLE:: X_LES_SUBGRID_W2Sv ! <w'2Sv> +! _______ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WThlRt ! <w'ThlRt> +! ______ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WThl2 ! <w'Thl2> +! _____ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WRt2 ! <w'Rt2> +! _____ +REAL, DIMENSION(:,:,:,:),ALLOCATABLE:: X_LES_SUBGRID_WSv2 ! <w'Sv2> +! _______ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_DISS_Tke ! <epsilon> +! ____________ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_DISS_Thl2 ! <epsilon_Thl2> +! ___________ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_DISS_Rt2 ! <epsilon_Rt2> +! ______________ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_DISS_ThlRt! <epsilon_ThlRt> +! ___________ +REAL, DIMENSION(:,:,:,:),ALLOCATABLE:: X_LES_SUBGRID_DISS_Sv2 ! <epsilon_Sv2> +! +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WP ! <w'p'> +! +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_ThlPz ! <Thl'dp'/dz> +! +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_RtPz ! <Rt'dp'/dz> +! +REAL, DIMENSION(:,:,:,:),ALLOCATABLE:: X_LES_SUBGRID_SvPz ! <Sv'dp'/dz> +! +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_PHI3 ! phi3 +! +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_PSI3 ! psi3 +! +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_LMix ! mixing length +! +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_LDiss ! dissipative length +! +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_Km ! eddy diffusivity for momentum +! +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_Kh ! eddy diffusivity for heat +! +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_THLUP_MF ! Thl of the Updraft +! +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_RTUP_MF ! Rt of the Updraft +! +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_RVUP_MF ! Rv of the Updraft +! +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_RCUP_MF ! Rc of the Updraft +! +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_RIUP_MF ! Ri of the Updraft +! +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WUP_MF ! Thl of the Updraft +! +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_MASSFLUX ! Mass Flux +! +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_DETR ! Detrainment +! +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_ENTR ! Entrainment +! +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_FRACUP ! Updraft Fraction +! +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_THVUP_MF ! Thv of the Updraft +! +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WTHLMF ! Flux of thl +! +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WRTMF ! Flux of rt +! +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WTHVMF ! Flux of thv +! +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WUMF ! Flux of u +! +REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WVMF ! Flux of v +! +!* surface variables +! +REAL, DIMENSION(:), ALLOCATABLE :: X_LES_USTAR ! local u* temporal series +REAL, DIMENSION(:), ALLOCATABLE :: X_LES_UW0 ! uw temporal series +REAL, DIMENSION(:), ALLOCATABLE :: X_LES_VW0 ! vw temporal series +REAL, DIMENSION(:), ALLOCATABLE :: X_LES_Q0 ! Qo temporal series +REAL, DIMENSION(:), ALLOCATABLE :: X_LES_E0 ! Eo temporal series +REAL, DIMENSION(:,:), ALLOCATABLE :: X_LES_SV0 ! scalar surface fluxes +! +!* pdf variables +REAL :: XRV_PDF_MIN ! min of rv pdf +REAL :: XRV_PDF_MAX ! max of rv pdf +REAL :: XTH_PDF_MIN ! min of theta pdf +REAL :: XTH_PDF_MAX ! max of theta pdf +REAL :: XW_PDF_MIN ! min of w pdf +REAL :: XW_PDF_MAX ! max of w pdf +REAL :: XTHV_PDF_MIN ! min of thetav pdf +REAL :: XTHV_PDF_MAX ! max of thetav pdf +REAL :: XRC_PDF_MIN ! min of rc pdf +REAL :: XRC_PDF_MAX ! max of rc pdf +REAL :: XRR_PDF_MIN ! min of rr pdf +REAL :: XRR_PDF_MAX ! max of rr pdf +REAL :: XRI_PDF_MIN ! min of ri pdf +REAL :: XRI_PDF_MAX ! max of ri pdf +REAL :: XRS_PDF_MIN ! min of rs pdf +REAL :: XRS_PDF_MAX ! max of rs pdf +REAL :: XRG_PDF_MIN ! min of rg pdf +REAL :: XRG_PDF_MAX ! max of rg pdf +REAL :: XRT_PDF_MIN ! min of rt pdf +REAL :: XRT_PDF_MAX ! max of rt pdf +REAL :: XTHL_PDF_MIN ! min of thetal pdf +REAL :: XTHL_PDF_MAX ! max of thetal pdf +!------------------------------------------------------------------------------- +!* pdf distribution +! +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: XLES_PDF_RV ! rv pdf +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: XLES_PDF_TH ! theta pdf +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: XLES_PDF_W ! w pdf +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: XLES_PDF_THV ! thetav pdf +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: XLES_PDF_RC ! rc pdf +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: XLES_PDF_RR ! rr pdf +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: XLES_PDF_RI ! ri pdf +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: XLES_PDF_RS ! rs pdf +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: XLES_PDF_RG ! rg pdf +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: XLES_PDF_RT ! rt pdf +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: XLES_PDF_THL ! thetal pdf +! +! +!------------------------------------------------------------------------------- +! +END MODULE MODD_LES diff --git a/src/mesonh/micro/modd_lima_precip_scavengingn.f90 b/src/mesonh/micro/modd_lima_precip_scavengingn.f90 new file mode 100644 index 000000000..a5f30e7a2 --- /dev/null +++ b/src/mesonh/micro/modd_lima_precip_scavengingn.f90 @@ -0,0 +1,50 @@ +!MNH_LIC Copyright 2013-2018 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! #################################### + MODULE MODD_LIMA_PRECIP_SCAVENGING_n +! #################################### +! +!!**** *MODD_PRECIP_SCAVENGING$n* - declaration of scavenged aerosols +!! precipitating fields +!! +!! PURPOSE +!! ------- +! Stores the INstantaneous and ACcumulated PRecipitating fields of +!! scavenged aerosol by rain +!! +!! AUTHOR +!! ------ +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAMETERS, ONLY: JPMODELMAX +! +IMPLICIT NONE +! +REAL, DIMENSION(:,:), POINTER :: XINPAP=>NULL(), XACPAP=>NULL() + ! Instant and cumul of ground + ! precipitation fields of Scavenged + ! Aerosol Particles + +CONTAINS + +SUBROUTINE LIMA_PRECIP_SCAVENGING_GOTO_MODEL(KFROM, KTO) + INTEGER, INTENT(IN) :: KFROM, KTO +END SUBROUTINE LIMA_PRECIP_SCAVENGING_GOTO_MODEL +! +! +END MODULE MODD_LIMA_PRECIP_SCAVENGING_n diff --git a/src/mesonh/micro/modd_lunit.f90 b/src/mesonh/micro/modd_lunit.f90 new file mode 100644 index 000000000..d19cf3d35 --- /dev/null +++ b/src/mesonh/micro/modd_lunit.f90 @@ -0,0 +1,49 @@ +!MNH_LIC Copyright 1994-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ################# + MODULE MODD_LUNIT +! ################# +! +!!**** *MODD_LUNIT* - declaration of names and logical unit numbers of files +!! +!! PURPOSE +!! ------- +! The purpose of this declarative module is to declare the +! logical unit numbers of output file for all models. +! +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (MODD_LUNIT) +!! +!! AUTHOR +!! ------ +!! V. Ducrocq *Meteo France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 05/05/94 +!! V. Masson 01/2004 add file names for use in externalized surface +!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 14/02/2019: remove CLUOUT/CLUOUT0 and associated variables +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_IO, ONLY: TFILEDATA +! +IMPLICIT NONE +! +TYPE(TFILEDATA),POINTER :: TLUOUT0 => NULL() ! output_listing file +TYPE(TFILEDATA),POINTER :: TOUTDATAFILE => NULL() ! output data file being written +TYPE(TFILEDATA),POINTER :: TPGDFILE => NULL() ! PGD file +! +END MODULE MODD_LUNIT diff --git a/src/mesonh/micro/modd_neb.f90 b/src/mesonh/micro/modd_neb.f90 new file mode 100644 index 000000000..984059f43 --- /dev/null +++ b/src/mesonh/micro/modd_neb.f90 @@ -0,0 +1,43 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +! ######spl + MODULE MODD_NEB +! ############################# +! +!!**** *MODD_NEB* - Declaration of nebulosity constants +!! +!! PURPOSE +!! ------- +!! The purpose of this declarative module is to declare some +!! constants for nebulosity calculation +! +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! +!! +!! AUTHOR +!! ------ +!! S. Riette (Meteo France) +!! +!! MODIFICATIONS +!! ------------- +!! Original 24 Aug 2011 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +REAL,SAVE :: XTMINMIX ! minimum temperature of mixed phase +REAL,SAVE :: XTMAXMIX ! maximum temperature of mixed phase +! +! +END MODULE MODD_NEB diff --git a/src/mesonh/micro/modd_nsv.f90 b/src/mesonh/micro/modd_nsv.f90 new file mode 100644 index 000000000..7a842a5c1 --- /dev/null +++ b/src/mesonh/micro/modd_nsv.f90 @@ -0,0 +1,253 @@ +!MNH_LIC Copyright 2001-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!------------------------------------------------------------------------------- +! ############### + MODULE MODD_NSV +! ############### +! +!!**** *MODD_NSV* - declaration of scalar variables numbers +!! +!! PURPOSE +!! ------- +!! Arrays to store the per-model NSV_* values number (suffix _A denote an array) +!! +!! AUTHOR +!! ------ +!! D. Gazen L.A. +!! +!! MODIFICATIONS +!! ------------- +!! Original 01/02/01 +!! J.-P. Pinty 29/11/02 add C3R5, ELEC +!! V. Masson 01/2004 add scalar names +!! M. Leriche 12/04/07 add aqueous chemistry +!! M. Leriche 08/07/10 add ice phase chemistry +!! C.Lac 07/11 add conditional sampling +!! Pialat/Tulet 15/02/12 add ForeFire +!! Modification 01/2016 (JP Pinty) Add LIMA +!! V. Vionnet 07/17 add blowing snow +! P. Wautelet 10/03/2021: add CSVNAMES and CSVNAMES_A to store the name of all the scalar variables +! B. Vie 06/2021: add prognostic supersaturation for LIMA +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAMETERS, ONLY : JPMODELMAX, & ! Maximum allowed number of nested models + JPSVMAX, & ! Maximum number of scalar variables + JPSVNAMELGTMAX ! Maximum length of a scalar variable name +! +IMPLICIT NONE +SAVE +! +REAL,DIMENSION(JPSVMAX) :: XSVMIN ! minimum value for SV variables +! +LOGICAL :: LINI_NSV = .FALSE. ! becomes True when routine INI_NSV is called +! +CHARACTER(LEN=JPSVNAMELGTMAX), DIMENSION(:,:), ALLOCATABLE, TARGET :: CSVNAMES_A !Names of all the scalar variables + +INTEGER,DIMENSION(JPMODELMAX)::NSV_A = 0 ! total number of scalar variables + ! NSV_A = NSV_USER_A+NSV_C2R2_A+NSV_CHEM_A+.. +INTEGER,DIMENSION(JPMODELMAX)::NSV_USER_A = 0 ! number of user scalar variables with + ! indices in the range : 1...NSV_USER_A +! +INTEGER,DIMENSION(JPMODELMAX)::NSV_C2R2_A = 0 ! number of liq scalar in C2R2 + ! and in C3R5 +INTEGER,DIMENSION(JPMODELMAX)::NSV_C2R2BEG_A = 0 ! with indices in the range : +INTEGER,DIMENSION(JPMODELMAX)::NSV_C2R2END_A = 0 ! NSV_C2R2BEG_A...NSV_C2R2END_A +! +INTEGER,DIMENSION(JPMODELMAX)::NSV_C1R3_A = 0 ! number of ice scalar in C3R5 +INTEGER,DIMENSION(JPMODELMAX)::NSV_C1R3BEG_A = 0 ! with indices in the range : +INTEGER,DIMENSION(JPMODELMAX)::NSV_C1R3END_A = 0 ! NSV_C1R3BEG_A...NSV_C1R3END_A +! +INTEGER,DIMENSION(JPMODELMAX)::NSV_ELEC_A = 0 ! number of scalar in ELEC +INTEGER,DIMENSION(JPMODELMAX)::NSV_ELECBEG_A = 0 ! with indices in the range : +INTEGER,DIMENSION(JPMODELMAX)::NSV_ELECEND_A = 0 ! NSV_ELECBEG_A...NSV_ELECEND_A +! +INTEGER,DIMENSION(JPMODELMAX)::NSV_CHEM_A = 0 ! number of chemical scalar +INTEGER,DIMENSION(JPMODELMAX)::NSV_CHEMBEG_A = 0 ! with indices in the range : +INTEGER,DIMENSION(JPMODELMAX)::NSV_CHEMEND_A = 0 ! NSV_CHEMBEG_A...NSV_CHEMEND_A +! +INTEGER,DIMENSION(JPMODELMAX)::NSV_CHGS_A = 0 ! number of gaseous chemcial species +INTEGER,DIMENSION(JPMODELMAX)::NSV_CHGSBEG_A = 0 ! with indices +INTEGER,DIMENSION(JPMODELMAX)::NSV_CHGSEND_A = 0 ! NSV_CHGSBEG_ +! +INTEGER,DIMENSION(JPMODELMAX)::NSV_CHAC_A = 0 ! number of aqueous chemical species +INTEGER,DIMENSION(JPMODELMAX)::NSV_CHACBEG_A = 0 ! with indices +INTEGER,DIMENSION(JPMODELMAX)::NSV_CHACEND_A = 0 ! NSV_CHACBEG +! +INTEGER,DIMENSION(JPMODELMAX)::NSV_CHIC_A = 0 ! number of ice phase chemical species +INTEGER,DIMENSION(JPMODELMAX)::NSV_CHICBEG_A = 0 ! with indices +INTEGER,DIMENSION(JPMODELMAX)::NSV_CHICEND_A = 0 ! NSV_CHICBEG +! +INTEGER,DIMENSION(JPMODELMAX)::NSV_LG_A = 0 ! number of LaGrangian +INTEGER,DIMENSION(JPMODELMAX)::NSV_LGBEG_A = 0 ! with indices in the range : +INTEGER,DIMENSION(JPMODELMAX)::NSV_LGEND_A = 0 ! NSV_LGBEG_A...NSV_LGEND_A +! +INTEGER,DIMENSION(JPMODELMAX)::NSV_LNOX_A = 0 ! number of lightning NOx +INTEGER,DIMENSION(JPMODELMAX)::NSV_LNOXBEG_A = 0 ! with indices in the range : +INTEGER,DIMENSION(JPMODELMAX)::NSV_LNOXEND_A = 0 ! NSV_LNOXBEG_A...NSV_LNOXEND_A ! +INTEGER,DIMENSION(JPMODELMAX)::NSV_DST_A = 0 ! number of dust scalar +INTEGER,DIMENSION(JPMODELMAX)::NSV_DSTBEG_A = 0 ! with indices in the range : +INTEGER,DIMENSION(JPMODELMAX)::NSV_DSTEND_A = 0 ! NSV_DSTBEG_A...NSV_DSTEND_A +! +INTEGER,DIMENSION(JPMODELMAX)::NSV_SLT_A = 0 ! number of sea salt scalar +INTEGER,DIMENSION(JPMODELMAX)::NSV_SLTBEG_A = 0 ! with indices in the range : +INTEGER,DIMENSION(JPMODELMAX)::NSV_SLTEND_A = 0 ! NSV_SLTBEG_A...NSV_SLTEND_A +! +INTEGER,DIMENSION(JPMODELMAX)::NSV_AER_A = 0 ! number of aerosol scalar +INTEGER,DIMENSION(JPMODELMAX)::NSV_AERBEG_A = 0 ! with indices in the range : +INTEGER,DIMENSION(JPMODELMAX)::NSV_AEREND_A = 0 ! NSV_AERBEG_A...NSV_AEREND_A +! +INTEGER,DIMENSION(JPMODELMAX)::NSV_DSTDEP_A = 0 ! number of aerosol scalar +INTEGER,DIMENSION(JPMODELMAX)::NSV_DSTDEPBEG_A = 0 ! with indices in the range : +INTEGER,DIMENSION(JPMODELMAX)::NSV_DSTDEPEND_A = 0 ! NSV_AERBEG_A...NSV_AEREND_A +! +INTEGER,DIMENSION(JPMODELMAX)::NSV_AERDEP_A = 0 ! number of aerosol scalar +INTEGER,DIMENSION(JPMODELMAX)::NSV_AERDEPBEG_A = 0 ! with indices in the range : +INTEGER,DIMENSION(JPMODELMAX)::NSV_AERDEPEND_A = 0 ! NSV_AERBEG_A...NSV_AEREND_A +! +INTEGER,DIMENSION(JPMODELMAX)::NSV_SLTDEP_A = 0 ! number of aerosol scalar +INTEGER,DIMENSION(JPMODELMAX)::NSV_SLTDEPBEG_A = 0 ! with indices in the range : +INTEGER,DIMENSION(JPMODELMAX)::NSV_SLTDEPEND_A = 0 ! NSV_SLTBEG_A...NSV_SLTEND_A +! +INTEGER,DIMENSION(JPMODELMAX)::NSV_PP_A = 0 ! number of passive pol. +INTEGER,DIMENSION(JPMODELMAX)::NSV_PPBEG_A = 0 ! with indices in the range : +INTEGER,DIMENSION(JPMODELMAX)::NSV_PPEND_A = 0 ! NSV_PPBEG_A...NSV_PPEND_A +! +INTEGER,DIMENSION(JPMODELMAX)::NSV_CS_A = 0 ! number of condit.samplings +INTEGER,DIMENSION(JPMODELMAX)::NSV_CSBEG_A = 0 ! with indices in the range : +INTEGER,DIMENSION(JPMODELMAX)::NSV_CSEND_A = 0 ! NSV_CSBEG_A...NSV_CSEND_A +! +INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_A = 0 ! number of scalar in LIMA +INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_BEG_A = 0 ! with indices in the range : +INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_END_A = 0 ! NSV_LIMA_BEG_A...NSV_LIMA_END_A +INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_NC_A = 0 ! First Nc variable +INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_NR_A = 0 ! First Nr variable +INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_CCN_FREE_A = 0 ! First Free CCN conc. +INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_CCN_ACTI_A = 0 ! First Acti. CNN conc. +INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_SCAVMASS_A = 0 ! Scavenged mass variable +INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_NI_A = 0 ! First Ni var. +INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_IFN_FREE_A = 0 ! First Free IFN conc. +INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_IFN_NUCL_A = 0 ! First Nucl. IFN conc. +INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_IMM_NUCL_A = 0 ! First Nucl. IMM conc. +INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_HOM_HAZE_A = 0 ! Hom. freezing of CCN +INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_SPRO_A = 0 ! Supersaturation +! +#ifdef MNH_FOREFIRE +INTEGER,DIMENSION(JPMODELMAX)::NSV_FF_A = 0 ! number of ForeFire scalar variables +INTEGER,DIMENSION(JPMODELMAX)::NSV_FFBEG_A = 0 ! with indices in the range : +INTEGER,DIMENSION(JPMODELMAX)::NSV_FFEND_A = 0 ! NSV_FFBEG_A...NSV_FFEND_A +#endif +! +INTEGER,DIMENSION(JPMODELMAX)::NSV_SNW_A = 0 ! number of blowing snow scalar +INTEGER,DIMENSION(JPMODELMAX)::NSV_SNWBEG_A = 0 ! with indices in the range : +INTEGER,DIMENSION(JPMODELMAX)::NSV_SNWEND_A = 0 ! NSV_SNWBEG_A...NSV_SNWEND_A +! +!############################################################################### +! +! variables updated for the current model +! +CHARACTER(LEN=JPSVNAMELGTMAX), DIMENSION(:), POINTER :: CSVNAMES !Names of all the scalar variables +CHARACTER(LEN=6), DIMENSION(:), ALLOCATABLE :: CSV ! name of the scalar variables +INTEGER :: NSV = 0 ! total number of user scalar variables +! +INTEGER :: NSV_USER = 0 ! number of user scalar variables with indices + ! in the range : 1...NSV_USER +INTEGER :: NSV_C2R2 = 0 ! number of liq scalar used in C2R2 and in C3R5 +INTEGER :: NSV_C2R2BEG = 0 ! with indices in the range : +INTEGER :: NSV_C2R2END = 0 ! NSV_C2R2BEG...NSV_C2R2END +! +INTEGER :: NSV_C1R3 = 0 ! number of ice scalar used in C3R5 +INTEGER :: NSV_C1R3BEG = 0 ! with indices in the range : +INTEGER :: NSV_C1R3END = 0 ! NSV_C1R3BEG...NSV_C1R3END +! +INTEGER :: NSV_ELEC = 0 ! number of scalar variables used in ELEC +INTEGER :: NSV_ELECBEG = 0 ! with indices in the range : +INTEGER :: NSV_ELECEND = 0 ! NSV_ELECBEG...NSV_ELECEND +! +INTEGER :: NSV_CHEM = 0 ! number of chemical scalar variables +INTEGER :: NSV_CHEMBEG = 0 ! with indices in the range : +INTEGER :: NSV_CHEMEND = 0 ! NSV_CHEMBEG...NSV_CHEMEND +! +INTEGER :: NSV_CHGS = 0 ! number of gas-phase chemicals +INTEGER :: NSV_CHGSBEG = 0 ! with indices in the range : +INTEGER :: NSV_CHGSEND = 0 ! NSV_CHGSBEG...NSV_CHGSEND +! +INTEGER :: NSV_CHAC = 0 ! number of aqueous-phase chemicals +INTEGER :: NSV_CHACBEG = 0 ! with indices in the range : +INTEGER :: NSV_CHACEND = 0 ! NSV_CHACBEG...NSV_CHACEND +! +INTEGER :: NSV_CHIC = 0 ! number of ice-phase chemicals +INTEGER :: NSV_CHICBEG = 0 ! with indices in the range : +INTEGER :: NSV_CHICEND = 0 ! NSV_CHICBEG...NSV_CHICEND +! +INTEGER :: NSV_LG = 0 ! number of lagrangian +INTEGER :: NSV_LGBEG = 0 ! with indices in the range : +INTEGER :: NSV_LGEND = 0 ! NSV_LGBEG...NSV_LGEND +! +INTEGER :: NSV_LNOX = 0 ! number of lightning NOx variables +INTEGER :: NSV_LNOXBEG = 0 ! with indices in the range : +INTEGER :: NSV_LNOXEND = 0 ! NSV_LNOXBEG...NSV_LNOXEND +! +INTEGER :: NSV_DST = 0 ! number of dust scalar variables +INTEGER :: NSV_DSTBEG = 0 ! with indices in the range : +INTEGER :: NSV_DSTEND = 0 ! NSV_DSTBEG...NSV_DSTEND + +INTEGER :: NSV_SLT = 0 ! number of sea salt scalar variables +INTEGER :: NSV_SLTBEG = 0 ! with indices in the range : +INTEGER :: NSV_SLTEND = 0 ! NSV_SLTBEG...NSV_SLTEND + +INTEGER :: NSV_AER = 0 ! number of aerosol scalar variables +INTEGER :: NSV_AERBEG = 0 ! with indices in the range : +INTEGER :: NSV_AEREND = 0 ! NSV_AERBEG...NSV_AEREND + +INTEGER :: NSV_DSTDEP = 0 ! number of aerosol scalar variables +INTEGER :: NSV_DSTDEPBEG = 0 ! with indices in the range : +INTEGER :: NSV_DSTDEPEND = 0 ! NSV_AERBEG...NSV_AEREND +! +INTEGER :: NSV_AERDEP = 0 ! number of aerosol scalar variables +INTEGER :: NSV_AERDEPBEG = 0 ! with indices in the range : +INTEGER :: NSV_AERDEPEND = 0 ! NSV_AERBEG...NSV_AEREND + +INTEGER :: NSV_SLTDEP = 0 ! number of aerosol scalar variables +INTEGER :: NSV_SLTDEPBEG = 0 ! with indices in the range : +INTEGER :: NSV_SLTDEPEND = 0 ! NSV_AERBEG...NSV_AEREND +! +INTEGER :: NSV_PP = 0 ! number of passive pollutants +INTEGER :: NSV_PPBEG = 0 ! with indices in the range : +INTEGER :: NSV_PPEND = 0 ! NSV_PPBEG...NSV_PPEND +! +INTEGER :: NSV_CS = 0 ! number of condit.samplings +INTEGER :: NSV_CSBEG = 0 ! with indices in the range : +INTEGER :: NSV_CSEND = 0 ! NSV_CSBEG...NSV_CSEND +! +INTEGER :: NSV_LIMA ! number of scalar in LIMA +INTEGER :: NSV_LIMA_BEG ! with indices in the range : +INTEGER :: NSV_LIMA_END ! NSV_LIMA_BEG_A...NSV_LIMA_END_A +INTEGER :: NSV_LIMA_NC ! +INTEGER :: NSV_LIMA_NR ! +INTEGER :: NSV_LIMA_CCN_FREE ! +INTEGER :: NSV_LIMA_CCN_ACTI ! +INTEGER :: NSV_LIMA_SCAVMASS ! +INTEGER :: NSV_LIMA_NI ! +INTEGER :: NSV_LIMA_IFN_FREE ! +INTEGER :: NSV_LIMA_IFN_NUCL ! +INTEGER :: NSV_LIMA_IMM_NUCL ! +INTEGER :: NSV_LIMA_HOM_HAZE ! +INTEGER :: NSV_LIMA_SPRO ! +! +#ifdef MNH_FOREFIRE +INTEGER :: NSV_FF = 0 ! number of ForeFire scalar variables +INTEGER :: NSV_FFBEG = 0 ! with indices in the range : +INTEGER :: NSV_FFEND = 0 ! NSV_FFBEG...NSV_FFEND +#endif +! +INTEGER :: NSV_SNW = 0 ! number of blowing snow scalar variables +INTEGER :: NSV_SNWBEG = 0 ! with indices in the range : +INTEGER :: NSV_SNWEND = 0 ! NSV_SNWBEG...NSV_SNWEND + +END MODULE MODD_NSV diff --git a/src/mesonh/micro/modd_param_c1r3.f90 b/src/mesonh/micro/modd_param_c1r3.f90 new file mode 100644 index 000000000..700526c7a --- /dev/null +++ b/src/mesonh/micro/modd_param_c1r3.f90 @@ -0,0 +1,65 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 modd 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ###################### + MODULE MODD_PARAM_C1R3 +! ###################### +! +!!**** *MODD_PARAM_C1R3* - declaration of the control parameters +!! for use in the cold scheme. +!! +!! PURPOSE +!! ------- +! The purpose of this declarative module is to declare the microphysical +! constants. This includes the descriptive parameters for the raindrop +! and the parameters relevant of the dimensional distributions. +! +! +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (MODD_PARAM_C1R3) +!! +!! AUTHOR +!! ------ +!! J.-P. Pinty *Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original 04/04/2001 +!! Jean-Pierre PINTY 29/ 6/01 Add RHHONI process (freezing haze part.) +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +REAL,SAVE :: XALPHAI,XNUI, & ! Pristine ice distribution parameters + XALPHAS,XNUS, & ! Snow/aggregate distribution parameters + XALPHAG,XNUG ! Graupel distribution parameters +REAL,SAVE :: XFACTNUC_DEP,XFACTNUC_CON ! Amplification factor for IN conc. + ! DEP refers to DEPosition mode + ! CON refers to CONtact mode +! +LOGICAL, SAVE :: LSEDI ! TRUE to enable the pristine ice + ! sedimentation +LOGICAL, SAVE :: LHHONI ! TRUE to enable the freezing of haze + ! particules +! +CHARACTER(LEN=4), SAVE :: CPRISTINE_ICE_C1R3 ! Pristine type PLAT, COLU or BURO +CHARACTER(LEN=4), SAVE :: CHEVRIMED_ICE_C1R3 ! Heavily rimed type GRAU or HAIL +! +END MODULE MODD_PARAM_C1R3 +! +! diff --git a/src/mesonh/micro/modd_param_c2r2.f90 b/src/mesonh/micro/modd_param_c2r2.f90 new file mode 100644 index 000000000..83d7f5d1c --- /dev/null +++ b/src/mesonh/micro/modd_param_c2r2.f90 @@ -0,0 +1,80 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source: /home/cvsroot/MNH-VX-Y-Z/src/MNH/modd_param_c2r2.f90,v $ $Revision: 1.1.8.1.2.1.16.1.2.1 $ +! MASDEV4_7 modd 2006/10/16 14:23:23 +!----------------------------------------------------------------- +! ###################### + MODULE MODD_PARAM_C2R2 +! ###################### +! +!!**** *MODD_PARAM_C2R2* - declaration of the control parameters +!! for use in the warm scheme. +!! +!! PURPOSE +!! ------- +! The purpose of this declarative module is to declare the microphysical +! constants. This includes the descriptive parameters for the raindrop +! and the parameters relevant of the dimensional distributions. +! +! The four constants used to set the actiavtion spectrum are also +! defined +! +! N_activated = (C*S**k)*F_hypgeo(mu,k/2,k/2+1;-beta*S**2) +! DN_activated/DS = k*(C*S**(k-1))*(1+beta*S**2)**-mu +! +! +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (MODD_PARAM_C2R2) +!! +!! AUTHOR +!! ------ +!! J.-P. Pinty *Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original 04/11/2000 +!! 10/2016 (C.Lac) Add droplet deposition +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +REAL,SAVE :: XALPHAR,XNUR, & ! Raindrop distribution parameters + XALPHAC,XNUC ! Cloud droplet distribution parameters +! +LOGICAL, SAVE :: LRAIN ! TRUE to enable the formation of rain +LOGICAL, SAVE :: LSEDC ! TRUE to enable the droplet sedimentation +LOGICAL, SAVE :: LACTIT ! TRUE to enable the usage of + ! dT/dt in CCN activation (twomey and CPB98) +LOGICAL, SAVE :: LSUPSAT ! TRUE for prognostic supersaturation +LOGICAL, SAVE :: LDEPOC ! TRUE to enable cloud droplet deposition +LOGICAL, SAVE :: LACTTKE ! TRUE to take into account TKE in W for activation +! +REAL,SAVE :: XCHEN,XKHEN, & ! Parameters used to define the CCN + XMUHEN,XBETAHEN ! activation spectra (CPB or TWO) +REAL,SAVE :: XVDEPOC ! Droplet deposition velocity +! +CHARACTER(LEN=3),SAVE :: HPARAM_CCN ! Parameterization used for the CCN activation +CHARACTER(LEN=3),SAVE :: HINI_CCN ! Initialization type of the CCN activation +CHARACTER(LEN=1),SAVE :: HTYPE_CCN ! 'M' or 'C' standard type of CCN +REAL,SAVE :: XCONC_CCN, & ! Concentration of the CCN + XR_MEAN_CCN, & ! Geometric mean radius of the CCN + XLOGSIG_CCN, & ! Log of geometric dispersion of the CCN + XFSOLUB_CCN, & ! Fractionnal solubility of the CCN + XACTEMP_CCN, & ! Expected temperature of CCN activation + XAERDIFF, XAERHEIGHT ! For the vertical gradient of + ! aerosol distribution +END MODULE MODD_PARAM_C2R2 +! +! diff --git a/src/mesonh/micro/modd_param_ice.f90 b/src/mesonh/micro/modd_param_ice.f90 new file mode 100644 index 000000000..ddafd7516 --- /dev/null +++ b/src/mesonh/micro/modd_param_ice.f90 @@ -0,0 +1,83 @@ +!MNH_LIC Copyright 1995-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ######spl + MODULE MODD_PARAM_ICE +! ##################### +! +!!**** *MODD_PARAM_ICE* - declaration of the control parameters for the +!! mixed phase cloud parameterization +!! +!! PURPOSE +!! ------- +!! The purpose of this declarative module is to define the set of space +!! and time control parameters for the microphysics. +!! +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (module MODD_PARAM_ICE) +!! +!! AUTHOR +!! ------ +!! J.-P. Pinty *Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original 14/12/95 +!! Jan 2015 S. Riette: new ICE3/ICE4 parameters +!! 01/10/16 (C.Lac) Add droplet deposition for fog +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +LOGICAL, SAVE :: LWARM ! When .TRUE. activates the formation of rain by + ! the warm microphysical processes +LOGICAL, SAVE :: LSEDIC ! TRUE to enable the droplet sedimentation +LOGICAL, SAVE :: LDEPOSC ! TRUE to enable cloud droplet deposition +REAL, SAVE :: XVDEPOSC ! Droplet deposition velocity +! +CHARACTER(LEN=4), SAVE :: CPRISTINE_ICE ! Pristine ice type PLAT, COLU or BURO +CHARACTER(LEN=4), SAVE :: CSEDIM ! Sedimentation calculation mode +! +LOGICAL, SAVE :: LRED ! To use modified ICE3/ICE4 to reduce time step dependency +LOGICAL, SAVE :: LFEEDBACKT ! When .TRUE. feed back on temperature is taken into account +LOGICAL, SAVE :: LEVLIMIT ! When .TRUE. water vapour pressure is limited by saturation +LOGICAL, SAVE :: LNULLWETG ! When .TRUE. graupel wet growth is activated with null rate (to allow water shedding) +LOGICAL, SAVE :: LWETGPOST ! When .TRUE. graupel wet growth is activated with positive temperature (to allow water shedding) +LOGICAL, SAVE :: LNULLWETH ! Same as LNULLWETG but for hail +LOGICAL, SAVE :: LWETHPOST ! Same as LWETGPOST but for hail +CHARACTER(LEN=4), SAVE :: CSNOWRIMING ! OLD or M90 for Murakami 1990 formulation +REAL, SAVE :: XFRACM90 ! Fraction used for the Murakami 1990 formulation +INTEGER, SAVE :: NMAXITER ! Maximum number of iterations for mixing ratio or time splitting +REAL, SAVE :: XMRSTEP ! maximum mixing ratio step for mixing ratio splitting +LOGICAL, SAVE :: LCONVHG ! TRUE to allow the conversion from hail to graupel +LOGICAL, SAVE :: LCRFLIMIT !True to limit rain contact freezing to possible heat exchange +! +REAL, SAVE :: XTSTEP_TS ! Approximative time step for time-splitting (0 for no time-splitting) +! +CHARACTER(len=80), SAVE :: CSUBG_RC_RR_ACCR ! subgrid rc-rr accretion +CHARACTER(len=80), SAVE :: CSUBG_RR_EVAP ! subgrid rr evaporation +CHARACTER(len=80), SAVE :: CSUBG_PR_PDF ! pdf for subgrid precipitation +! +LOGICAL, SAVE :: LADJ_BEFORE ! must we perform an adjustment before rain_ice call +LOGICAL, SAVE :: LADJ_AFTER ! must we perform an adjustment after rain_ice call +CHARACTER(len=1), SAVE :: CFRAC_ICE_ADJUST ! ice fraction for adjustments +CHARACTER(len=1), SAVE :: CFRAC_ICE_SHALLOW_MF ! ice fraction for shallow_mf +LOGICAL, SAVE :: LSEDIM_AFTER ! sedimentation done before (.FALSE.) or after (.TRUE.) microphysics +! +REAL, SAVE :: XSPLIT_MAXCFL ! Maximum CFL number allowed for SPLIT scheme +! +!------------------------------------------------------------------------------- +! +END MODULE MODD_PARAM_ICE diff --git a/src/mesonh/micro/modd_param_lima.f90 b/src/mesonh/micro/modd_param_lima.f90 new file mode 100644 index 000000000..66156a056 --- /dev/null +++ b/src/mesonh/micro/modd_param_lima.f90 @@ -0,0 +1,216 @@ +!MNH_LIC Copyright 2013-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!------------------------------------------------------------------------------- +! ###################### + MODULE MODD_PARAM_LIMA +! ###################### +! +!!**** *MODD_PARAM_LIMA* - declaration of the control parameters +!! for use in the LIMA scheme. +!! +!! PURPOSE +!! ------- +!! The purpose of this declarative module is to declare the microphysical +!! constants. This includes the descriptive parameters for the raindrop +!! and the parameters relevant of the dimensional distributions. +!! +!! +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! AUTHOR +!! ------ +!! J.-P. Pinty *Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! +!------------------------------------------------------------------------------- +! +USE MODD_PARAMETERS, ONLY : JPLIMACCNMAX, JPLIMAIFNMAX +! +IMPLICIT NONE +! +LOGICAL, SAVE :: LLIMA_DIAG ! Compute diagnostics for concentration /m3 +! +LOGICAL, SAVE :: LPTSPLIT ! activate time-splitting technique by S. Riette +LOGICAL, SAVE :: LFEEDBACKT ! recompute tendencies if T changes sign +INTEGER, SAVE :: NMAXITER ! maximum number of iterations +REAL, SAVE :: XMRSTEP ! maximum change in mixing ratio allowed before recomputing tedencies +REAL, SAVE :: XTSTEP_TS ! maximum time for the sub-time-step +! +!* 1. COLD SCHEME +! ----------- +! +! 1.1 Cold scheme configuration +! +LOGICAL, SAVE :: LCOLD ! TRUE to enable the cold scheme +LOGICAL, SAVE :: LNUCL ! TRUE to enable ice nucleation +LOGICAL, SAVE :: LSEDI ! TRUE to enable pristine ice sedimentation +LOGICAL, SAVE :: LHHONI ! TRUE to enable freezing of haze particules +LOGICAL, SAVE :: LSNOW ! TRUE to enable snow and graupel +LOGICAL, SAVE :: LHAIL ! TRUE to enable hail +LOGICAL, SAVE :: LMEYERS ! TRUE to use Meyers nucleation +! +! 1.2 IFN initialisation +! +INTEGER, SAVE :: NMOD_IFN ! Number of IFN modes +REAL, DIMENSION(JPLIMAIFNMAX), SAVE :: XIFN_CONC ! Ref. concentration of IFN(#/L) +LOGICAL, SAVE :: LIFN_HOM ! True for z-homogeneous IFN concentrations +CHARACTER(LEN=8), SAVE :: CIFN_SPECIES ! Internal mixing species definitions +CHARACTER(LEN=8), SAVE :: CINT_MIXING ! Internal mixing type selection (pure DM1 ...) +INTEGER, SAVE :: NMOD_IMM ! Number of CCN modes acting by immersion +INTEGER, SAVE :: NIND_SPECIE ! CCN acting by immersion are considered pure + ! IFN of either DM = 1, BC = 2 or O = 3 +INTEGER, DIMENSION(:), SAVE, ALLOCATABLE :: NIMM ! Link between CCN and IMM modes +INTEGER, DIMENSION(:), SAVE, ALLOCATABLE :: NINDICE_CCN_IMM ! ?????????? +INTEGER, SAVE :: NSPECIE ! Internal mixing number of species +REAL, DIMENSION(:), SAVE, ALLOCATABLE :: XMDIAM_IFN ! Mean diameter of IFN modes +REAL, DIMENSION(:), SAVE, ALLOCATABLE :: XSIGMA_IFN ! Sigma of IFN modes +REAL, DIMENSION(:), SAVE, ALLOCATABLE :: XRHO_IFN ! Density of IFN modes +REAL, DIMENSION(:,:), SAVE, ALLOCATABLE :: XFRAC ! Composition of each IFN mode +REAL, DIMENSION(:), SAVE, ALLOCATABLE :: XFRAC_REF ! AP compostion in Phillips 08 +! +! 1.3 Ice characteristics +! +CHARACTER(LEN=4), SAVE :: CPRISTINE_ICE_LIMA ! Pristine type PLAT, COLU or BURO +CHARACTER(LEN=4), SAVE :: CHEVRIMED_ICE_LIMA ! Heavily rimed type GRAU or HAIL +REAL,SAVE :: XALPHAI,XNUI, & ! Pristine ice distribution parameters + XALPHAS,XNUS, & ! Snow/aggregate distribution parameters + XALPHAG,XNUG ! Graupel distribution parameters +! +! 1.4 Phillips (2013) nucleation parameterization +! +INTEGER, SAVE :: NPHILLIPS ! =8 for Phillips08, =13 for Phillips13 +! +REAL, DIMENSION(4), SAVE :: XT0 ! Threshold of T in H_X for X={DM1,DM2,BC,O} [K] +REAL, DIMENSION(4), SAVE :: XDT0 ! Range in T for transition of H_X near XT0 [K] +REAL, DIMENSION(4), SAVE :: XDSI0 ! Range in Si for transition of H_X near XSI0 +REAL, SAVE :: XSW0 ! Threshold of Sw in H_X +REAL, SAVE :: XRHO_CFDC ! Air density at which CFDC data were reported [kg m**3] +REAL, DIMENSION(4), SAVE :: XH ! Fraction<<1 of aerosol for X={DM,BC,O} +REAL, DIMENSION(4), SAVE :: XAREA1 ! Total surface of all aerosols in group X with + ! diameters between 0.1 and 1 µm, for X={DM1,DM2,BC,O} [m**2 kg**-1] +REAL, SAVE :: XGAMMA ! Factor boosting IN concentration due to + ! bulk-liquid modes +! +REAL, DIMENSION(4), SAVE :: XTX1 ! Threshold of T in Xi for X={DM1,DM2,BC,O} [K] +REAL, DIMENSION(4), SAVE :: XTX2 ! Threshold of T in Xi for X={DM1,DM2,BC,O} [K] +! +REAL,DIMENSION(:), SAVE, ALLOCATABLE :: XABSCISS, XWEIGHT ! Gauss quadrature method +INTEGER, SAVE :: NDIAM ! Gauss quadrature accuracy +! +! 1.5 Meyers (1992) nucleation parameterization +! +REAL,SAVE :: XFACTNUC_DEP,XFACTNUC_CON ! Amplification factor for IN conc. + ! DEP refers to DEPosition mode + ! CON refers to CONtact mode +! +!------------------------------------------------------------------------------- +! +! +!* 2. WARM SCHEME +! ----------- +! +! 2.1 Warm scheme configuration +! +LOGICAL, SAVE :: LWARM ! TRUE to enable the warm scheme +LOGICAL, SAVE :: LACTI ! TRUE to enable CCN activation +LOGICAL, SAVE :: LRAIN ! TRUE to enable the formation of rain +LOGICAL, SAVE :: LSEDC ! TRUE to enable the droplet sedimentation +LOGICAL, SAVE :: LACTIT ! TRUE to enable the usage of dT/dt in CCN activation +LOGICAL, SAVE :: LBOUND ! TRUE to enable the continuously replenishing + ! aerosol concentrations through the open + ! lateral boundaries -> boundaries.f90 +LOGICAL, SAVE :: LDEPOC ! Deposition of rc at 1st level above ground +LOGICAL, SAVE :: LACTTKE ! TRUE to take into account TKE in W for activation +LOGICAL, SAVE :: LADJ ! TRUE for adjustment procedure + Smax (false for diagnostic supersaturation) +LOGICAL, SAVE :: LSPRO ! TRUE for prognostic supersaturation +! +! 2.2 CCN initialisation +! +INTEGER, SAVE :: NMOD_CCN ! Number of CCN modes +REAL, DIMENSION(JPLIMACCNMAX), SAVE :: XCCN_CONC ! CCN conc. (#/cm3) +LOGICAL, SAVE :: LCCN_HOM ! True for z-homogeneous CCN concentrations +CHARACTER(LEN=8),SAVE :: CCCN_MODES ! CCN modes characteristics (Jungfraujoch ...) +REAL, DIMENSION(:), SAVE, ALLOCATABLE :: XR_MEAN_CCN, & ! Mean radius of CCN modes + XLOGSIG_CCN, & ! Log of geometric dispersion of the CCN modes + XRHO_CCN ! Density of the CCN modes +REAL, DIMENSION(:), SAVE, ALLOCATABLE :: XKHEN_MULTI, & ! Parameters defining the CCN activation + XMUHEN_MULTI, & ! spectra for a multimodal aerosol distribution + XBETAHEN_MULTI ! +REAL, DIMENSION(:,:,:) ,SAVE, ALLOCATABLE :: XCONC_CCN_TOT ! Total aerosol number concentration +REAL, DIMENSION(:), SAVE, ALLOCATABLE :: XLIMIT_FACTOR ! compute CHEN ???????????? +! +! 2.3 Water particles characteristics +! +REAL,SAVE :: XALPHAR,XNUR, & ! Raindrop distribution parameters + XALPHAC,XNUC ! Cloud droplet distribution parameters +! +! 2.4 CCN activation +! +CHARACTER(LEN=3),SAVE :: HPARAM_CCN = 'CPB' ! Parameterization of the CCN activation +CHARACTER(LEN=3),SAVE :: HINI_CCN ! Initialization type of CCN activation +CHARACTER(LEN=10),DIMENSION(JPLIMACCNMAX),SAVE :: HTYPE_CCN ! 'M' or 'C' CCN type +REAL,SAVE :: XFSOLUB_CCN, & ! Fractionnal solubility of the CCN + XACTEMP_CCN, & ! Expected temperature of CCN activation + XAERDIFF, XAERHEIGHT ! For the vertical gradient of aerosol distribution +! +! Cloud droplet deposition +! +REAL, SAVE :: XVDEPOC +! +!------------------------------------------------------------------------------- +! +! +!* 3. BELOW CLOUD SCAVENGING +! ---------------------- +! +LOGICAL, SAVE :: LSCAV ! TRUE for aerosol scavenging by precipitations +LOGICAL, SAVE :: LAERO_MASS ! TRUE to compute the total aerosol mass scavenging rate +! +INTEGER :: NDIAMR = 20 ! Max Number of droplet for quadrature method +INTEGER :: NDIAMP = 20 ! Max Number of aerosol particle for quadrature method +! +REAL, SAVE :: XT0SCAV = 293.15 ! [K] +REAL, SAVE :: XTREF = 273.15 ! [K] +REAL, SAVE :: XNDO = 8.*1.0E6 ! [/m**4] +! +!------------------------------------------------------------------------------- +! +! +!* 4. ATMOSPHERIC & OTHER PARAMETERS +! ------------------------------ +! +REAL, SAVE :: XMUA0 = 1.711E-05 ![Pa.s] Air Viscosity at T=273.15K +REAL, SAVE :: XT_SUTH_A = 110.4 ![K] Sutherland Temperature for Air +REAL, SAVE :: XMFPA0 = 6.6E-08 ![m] Mean Free Path of Air under standard conditions +! +REAL, SAVE :: XVISCW = 1.0E-3 ![Pa.s] water viscosity at 20°C +! Correction +!REAL, SAVE :: XRHO00 = 1.292 !rho on the floor [Kg/m**3] +REAL, SAVE :: XRHO00 = 1.2041 !rho at P=1013.25 and T=20°C +! +REAL,SAVE :: XCEXVT ! air density fall speed correction +! +REAL,DIMENSION(:),SAVE,ALLOCATABLE :: XRTMIN ! Min values of the mixing ratios +REAL,DIMENSION(:),SAVE,ALLOCATABLE :: XCTMIN ! Min values of the drop concentrations +! +! +! Sedimentation variables +! +INTEGER,DIMENSION(7),SAVE :: NSPLITSED +REAL,DIMENSION(7),SAVE :: XLB +REAL,DIMENSION(7),SAVE :: XLBEX +REAL,DIMENSION(7),SAVE :: XD +REAL,DIMENSION(7),SAVE :: XFSEDR +REAL,DIMENSION(7),SAVE :: XFSEDC +! +END MODULE MODD_PARAM_LIMA diff --git a/src/mesonh/micro/modd_param_lima_cold.f90 b/src/mesonh/micro/modd_param_lima_cold.f90 new file mode 100644 index 000000000..64494219e --- /dev/null +++ b/src/mesonh/micro/modd_param_lima_cold.f90 @@ -0,0 +1,128 @@ +!MNH_LIC Copyright 2013-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ########################### + MODULE MODD_PARAM_LIMA_COLD +! ########################### +! +!!**** *MODD_PARAM_LIMA_COLD* - declaration of some descriptive parameters and +!! microphysical factors extensively used in +!! the LIMA cold scheme. +!! AUTHOR +!! ------ +!! J.-P. Pinty *Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! +!------------------------------------------------------------------------------- +USE MODD_PARAMETERS, ONLY: JPSVNAMELGTMAX +! +IMPLICIT NONE +! +!* 1. DESCRIPTIVE PARAMETERS +! ---------------------- +! +! Declaration of microphysical constants, including the descriptive +! parameters for the raindrop and the ice crystal habits, and the +! parameters relevant of the dimensional distributions. +! +! m(D) = XAx * D**XBx : Mass-MaxDim relationship +! v(D) = XCx * D**XDx : Fallspeed-MaxDim relationship +! N(Lbda) = XCCx * Lbda**XCXx : NumberConc-Slopeparam relationship +! XF0x, XF1x, XF2x : Ventilation factors +! XC1x : Shape parameter for deposition +! +! and +! +! XALPHAx, XNUx : Generalized GAMMA law +! Lbda = XLBx * (r_x*rho_dref)**XLBEXx : Slope parameter of the +! distribution law +! +REAL,SAVE :: XLBEXI,XLBI ! Prist. ice distribution parameters +REAL,SAVE :: XLBEXS,XLBS ! Snow/agg. distribution parameters +! +REAL,SAVE :: XAI,XBI,XC_I,XDI ,XF0I,XF2I,XC1I ! Cloud ice charact. +REAL,SAVE :: XF0IS,XF1IS ! (large Di vent. coef.) +REAL,SAVE :: XAS,XBS,XCS,XDS,XCCS,XCXS,XF0S,XF1S,XC1S ! Snow/agg. charact. +! +REAL,SAVE :: XLBDAS_MAX ! Max values allowed for the shape + ! parameter of snow +! +CHARACTER(LEN=JPSVNAMELGTMAX),DIMENSION(5),PARAMETER & + :: CLIMA_COLD_NAMES=(/'CICE ','CIFNFREE','CIFNNUCL', & + 'CCNINIMM','CCCNNUCL'/) + ! basenames of the SV articles stored + ! in the binary files + !with IF:Ice-nuclei Free (nonactivated IFN by Dep/Cond) + ! IN:Ice-nuclei Nucleated (activated IFN by Dep/Cond) + ! NI:Nuclei Immersed (activated IFN by Imm) + ! HF:Homogeneous Freezing +CHARACTER(LEN=JPSVNAMELGTMAX),DIMENSION(5),PARAMETER & + :: CLIMA_COLD_CONC=(/'NI ','NIF','NIN','NNI','NNH'/)!for DIAG +! +!------------------------------------------------------------------------------- +! +!* 2. MICROPHYSICAL FACTORS +! --------------------- +! +REAL,SAVE :: XFSEDRI,XFSEDCI, & ! Constants for sedimentation + XFSEDS, XEXSEDS ! fluxes of ice and snow +! +REAL,SAVE :: XNUC_DEP,XEXSI_DEP,XEX_DEP, & ! Constants for heterogeneous + XNUC_CON,XEXTT_CON,XEX_CON, & ! ice nucleation : DEP et CON + XMNU0 ! mass of nucleated ice crystal +! +REAL,SAVE :: XRHOI_HONH,XCEXP_DIFVAP_HONH, & ! Constants for homogeneous + XCOEF_DIFVAP_HONH,XRCOEF_HONH, & ! haze freezing : HHONI + XCRITSAT1_HONH,XCRITSAT2_HONH, & + XTMIN_HONH,XTMAX_HONH, & + XDLNJODT1_HONH,XDLNJODT2_HONH, & + XC1_HONH,XC2_HONH,XC3_HONH +! +REAL,SAVE :: XC_HONC,XR_HONC, & ! Constants for homogeneous + XTEXP1_HONC,XTEXP2_HONC, & ! droplet freezing : CHONI + XTEXP3_HONC,XTEXP4_HONC, & + XTEXP5_HONC +! +REAL,SAVE :: XCSCNVI_MAX, XLBDASCNVI_MAX, & + XRHORSMIN, & + XDSCNVI_LIM, XLBDASCNVI_LIM, & ! Constants for snow + XC0DEPSI,XC1DEPSI, & ! sublimation conversion to + XR0DEPSI,XR1DEPSI ! pristine ice : SCNVI +! +REAL,SAVE :: XSCFAC, & ! Constants for the Bergeron + X0DEPI,X2DEPI, & ! Findeisen process and + X0DEPS,X1DEPS,XEX0DEPS,XEX1DEPS ! deposition +! +REAL,SAVE :: XDICNVS_LIM, XLBDAICNVS_LIM, & ! Constants for pristine ice + XC0DEPIS,XC1DEPIS, & ! deposition conversion to + XR0DEPIS,XR1DEPIS ! snow : ICNVS +! +REAL,SAVE :: XCOLEXIS, & ! Constants for snow + XAGGS_CLARGE1,XAGGS_CLARGE2, & ! aggregation : AGG + XAGGS_RLARGE1,XAGGS_RLARGE2 +! +!?????????????????? +REAL,SAVE :: XKER_ZRNIC_A1,XKER_ZRNIC_A2 ! Long-Zrnic Kernels (ini_ice_coma) +! +REAL,SAVE :: XSELFI,XCOLEXII ! Constants for pristine ice + ! self-collection (ini_ice_coma) +! +REAL,SAVE :: XAUTO3, XAUTO4, & ! Constants for pristine ice + XLAUTS, XLAUTS_THRESHOLD, & ! autoconversion : AUT + XITAUTS, XITAUTS_THRESHOLD, & ! (ini_ice_com) + XTEXAUTI +! +REAL,SAVE :: XCONCI_MAX ! Limitation of the pristine + ! ice concentration (init and grid-nesting) +REAL,SAVE :: XFREFFI ! Factor to compute the cloud ice effective radius +! +!------------------------------------------------------------------------------- +! +END MODULE MODD_PARAM_LIMA_COLD diff --git a/src/mesonh/micro/modd_param_lima_mixed.f90 b/src/mesonh/micro/modd_param_lima_mixed.f90 new file mode 100644 index 000000000..f13accfc6 --- /dev/null +++ b/src/mesonh/micro/modd_param_lima_mixed.f90 @@ -0,0 +1,169 @@ +! ############################ + MODULE MODD_PARAM_LIMA_MIXED +! ###########################{ +! +!!**** *MODD_PARAM_LIMA_MIXED* - declaration of some descriptive parameters and +!! microphysical factors extensively used in +!! the LIMA mixed scheme. +!! AUTHOR +!! ------ +!! J.-P. Pinty *Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! +!------------------------------------------------------------------------------- +! +IMPLICIT NONE +! +!* 1. DESCRIPTIVE PARAMETERS +! ---------------------- +! +! Declaration of microphysical constants, including the descriptive +! parameters for the raindrop and the ice crystal habits, and the +! parameters relevant of the dimensional distributions. +! +! m(D) = XAx * D**XBx : Mass-MaxDim relationship +! v(D) = XCx * D**XDx : Fallspeed-MaxDim relationship +! N(Lbda) = XCCx * Lbda**XCXx : NumberConc-Slopeparam relationship +! XF0x, XF1x, XF2x : Ventilation factors +! XC1x : Shape parameter for deposition +! +! and +! +! XALPHAx, XNUx : Generalized GAMMA law +! Lbda = XLBx * (r_x*rho_dref)**XLBEXx : Slope parameter of the +! distribution law +! +REAL,SAVE :: XAG,XBG,XCG,XDG,XCCG,XCXG,XF0G,XF1G,XC1G ! Graupel charact. +REAL,SAVE :: XLBEXG,XLBG ! Graupel distribution parameters +REAL,SAVE :: XLBDAG_MAX ! Max values allowed for the shape + ! parameter of graupeln +! +REAL,SAVE :: XAH,XBH,XCH,XDH,XCCH,XCXH,XF0H,XF1H,XC1H ! Hail charact. +REAL,SAVE :: XALPHAH,XNUH,XLBEXH,XLBH ! Hail distribution parameters +! +!------------------------------------------------------------------------------- +! +!* 2. MICROPHYSICAL FACTORS - Graupel +! ------------------------------- +! +REAL,SAVE :: XFSEDG, XEXSEDG ! Sedimentation fluxes of Graupel +! +REAL,SAVE :: X0DEPG,X1DEPG,XEX0DEPG,XEX1DEPG ! Deposition on graupel +! +REAL,SAVE :: XHMTMIN,XHMTMAX,XHM1,XHM2, & ! Constants for the + XHM_YIELD,XHM_COLLCS,XHM_FACTS, & ! revised + XHM_COLLCG,XHM_FACTG, & ! Hallett-Mossop process + XGAMINC_HMC_BOUND_MIN, & ! Min val. of Lbda_c for HMC + XGAMINC_HMC_BOUND_MAX, & ! Max val. of Lbda_c for HMC + XHMSINTP1,XHMSINTP2, & ! (this is no more used !) + XHMLINTP1,XHMLINTP2 +! +REAL,SAVE :: XDCSLIM,XCOLCS, & ! Constants for the riming of + XEXCRIMSS,XCRIMSS, & ! the aggregates : RIM + XEXCRIMSG,XCRIMSG, & ! + XEXSRIMCG,XSRIMCG, & ! + XGAMINC_BOUND_MIN, & ! Min val. of Lbda_s for RIM + XGAMINC_BOUND_MAX, & ! Max val. of Lbda_s for RIM + XRIMINTP1,XRIMINTP2 ! Csts for lin. interpol. of + ! the tab. incomplete Gamma law +INTEGER,SAVE :: NGAMINC ! Number of tab. Lbda_s +REAL, DIMENSION(:), SAVE, ALLOCATABLE & + :: XGAMINC_RIM1, & ! Tab. incomplete Gamma funct. + XGAMINC_RIM2, & ! for XDS+2 and for XBS + XGAMINC_HMC ! and for the HM process +! +REAL,SAVE :: XFRACCSS, & ! Constants for the accretion + XLBRACCS1,XLBRACCS2,XLBRACCS3, & ! raindrops onto the aggregates + XFSACCRG, & ! ACC (processes RACCSS and + XLBSACCR1,XLBSACCR2,XLBSACCR3, & ! SACCRG) + XACCLBDAS_MIN, & ! Min val. of Lbda_s for ACC + XACCLBDAS_MAX, & ! Max val. of Lbda_s for ACC + XACCLBDAR_MIN, & ! Min val. of Lbda_r for ACC + XACCLBDAR_MAX, & ! Max val. of Lbda_r for ACC + XACCINTP1S,XACCINTP2S, & ! Csts for bilin. interpol. of + XACCINTP1R,XACCINTP2R ! Lbda_s and Lbda_r in the + ! XKER_RACCSS and XKER_SACCRG + ! tables +INTEGER,SAVE :: NACCLBDAS, & ! Number of Lbda_s values and + NACCLBDAR ! of Lbda_r values in the + ! XKER_RACCSS and XKER_SACCRG + ! tables +REAL,DIMENSION(:,:), SAVE, ALLOCATABLE & + :: XKER_RACCSS, & ! Normalized kernel for RACCSS + XKER_RACCS, & ! Normalized kernel for RACCS + XKER_SACCRG ! Normalized kernel for SACCRG +REAL,SAVE :: XFSCVMG ! Melting-conversion factor of + ! the aggregates +! +REAL,SAVE :: XCOLIR, & ! Constants for rain contact + XEXRCFRI,XRCFRI, & ! freezing : CFR + XEXICFRR,XICFRR ! +! +REAL,SAVE :: XFCDRYG, & ! Constants for the dry growth + XCOLCG, & ! of the graupeln : + XCOLIG,XCOLEXIG,XFIDRYG, & ! + XCOLSG,XCOLEXSG,XFSDRYG, & ! RCDRYG + XLBSDRYG1,XLBSDRYG2,XLBSDRYG3, & ! RIDRYG + XFRDRYG, & ! RSDRYG + XLBRDRYG1,XLBRDRYG2,XLBRDRYG3, & ! RRDRYG + XDRYLBDAR_MIN, & ! Min val. of Lbda_r for DRY + XDRYLBDAR_MAX, & ! Max val. of Lbda_r for DRY + XDRYLBDAS_MIN, & ! Min val. of Lbda_s for DRY + XDRYLBDAS_MAX, & ! Max val. of Lbda_s for DRY + XDRYLBDAG_MIN, & ! Min val. of Lbda_g for DRY + XDRYLBDAG_MAX, & ! Max val. of Lbda_g for DRY + XDRYINTP1R,XDRYINTP2R, & ! Csts for bilin. interpol. of + XDRYINTP1S,XDRYINTP2S, & ! Lbda_r, Lbda_s and Lbda_g in + XDRYINTP1G,XDRYINTP2G ! the XKER_SDRYG and XKER_RDRYG + ! tables +INTEGER,SAVE :: NDRYLBDAR, & ! Number of Lbda_r, + NDRYLBDAS, & ! of Lbda_s and + NDRYLBDAG ! of Lbda_g values in + ! the XKER_SDRYG and XKER_RDRYG + ! tables +REAL,DIMENSION(:,:), SAVE, ALLOCATABLE & + :: XKER_SDRYG, & ! Normalized kernel for SDRYG + XKER_RDRYG ! Normalized kernel for RDRYG +! +!------------------------------------------------------------------------------- +! +!* 2. MICROPHYSICAL FACTORS - Hail +! ---------------------------- +! +REAL,SAVE :: XFSEDH,XEXSEDH ! Constants for sedimentation +! +! +REAL,SAVE :: X0DEPH,X1DEPH,XEX0DEPH,XEX1DEPH ! Constants for deposition +! +REAL,SAVE :: XFWETH,XFSWETH, & ! Constants for the wet growth + XLBSWETH1,XLBSWETH2,XLBSWETH3, & ! of the hailstones : WET + XFGWETH, & ! processes RSWETH + XLBGWETH1,XLBGWETH2,XLBGWETH3, & ! RGWETH + XWETLBDAS_MIN, & ! Min val. of Lbda_s for WET + XWETLBDAS_MAX, & ! Max val. of Lbda_s for WET + XWETLBDAG_MIN, & ! Min val. of Lbda_g for WET + XWETLBDAG_MAX, & ! Max val. of Lbda_g for WET + XWETLBDAH_MIN, & ! Min val. of Lbda_h for WET + XWETLBDAH_MAX, & ! Max val. of Lbda_h for WET + XWETINTP1S,XWETINTP2S, & ! Csts for bilin. interpol. of + XWETINTP1G,XWETINTP2G, & ! Lbda_r, Lbda_s and Lbda_g in + XWETINTP1H,XWETINTP2H ! the XKER_SWETH and XKER_GWETH + ! tables +INTEGER,SAVE :: NWETLBDAS, & ! Number of Lbda_s, + NWETLBDAG, & ! of Lbda_g and + NWETLBDAH ! of Lbda_h values in + ! the XKER_SWETH and XKER_GWETH + ! tables +REAL,DIMENSION(:,:), SAVE, ALLOCATABLE & + :: XKER_SWETH, & ! Normalized kernel for SWETH + XKER_GWETH ! Normalized kernel for GWETH + +! +!------------------------------------------------------------------------------- +! +END MODULE MODD_PARAM_LIMA_MIXED diff --git a/src/mesonh/micro/modd_param_lima_warm.f90 b/src/mesonh/micro/modd_param_lima_warm.f90 new file mode 100644 index 000000000..65a3d1027 --- /dev/null +++ b/src/mesonh/micro/modd_param_lima_warm.f90 @@ -0,0 +1,125 @@ +!MNH_LIC Copyright 2013-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ########################### + MODULE MODD_PARAM_LIMA_WARM +! ########################### +! +!!**** *MODD_PARAM_LIMA_WARM* - declaration of some descriptive parameters and +!! microphysical factors extensively used in +!! the LIMA warm scheme. +!! AUTHOR +!! ------ +!! J.-P. Pinty *Laboratoire d'Aerologie* +!! S. Berthet * Laboratoire d'Aerologie* +!! B. Vié * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original ??/??/13 +!! +!------------------------------------------------------------------------------- +USE MODD_PARAMETERS, ONLY: JPSVNAMELGTMAX +! +IMPLICIT NONE +! +!* 1. DESCRIPTIVE PARAMETERS +! ---------------------- +! +REAL,SAVE :: XLBC, XLBEXC, & ! shape parameters of the cloud droplets + XLBR, XLBEXR ! shape parameters of the raindrops +! +REAL,SAVE :: XAR,XBR,XCR,XDR,XF0R,XF1R, & ! Raindrop charact. + XCCR, & !For diagnostics + XAC,XBC,XCC,XDC,XF0C,XF2C,XC1C ! Cloud droplet charact. +! +! +CHARACTER(LEN=JPSVNAMELGTMAX),DIMENSION(5),PARAMETER & + :: CLIMA_WARM_NAMES=(/'CCLOUD ','CRAIN ','CCCNFREE','CCCNACTI','SPRO '/) + ! basenames of the SV articles stored + ! in the binary files +CHARACTER(LEN=JPSVNAMELGTMAX),DIMENSION(5),PARAMETER & + :: CLIMA_WARM_CONC=(/'NC ','NR ','NFREE','NCCN ','SS '/) +! ! basenames of the SV articles stored +! ! in the binary files for DIAG +! +!* Special issue for Below-Cloud SCAVenging of Aerosol particles +CHARACTER(LEN=JPSVNAMELGTMAX),DIMENSION(2) :: CAERO_MASS =(/'MASSAP', 'MAP '/) +! +!------------------------------------------------------------------------------- +! +!* 2. MICROPHYSICAL FACTORS +! --------------------- +! +REAL,SAVE :: XFSEDRR,XFSEDCR, & ! Constants for sedimentation + XFSEDRC,XFSEDCC ! fluxes of R, C +! +! +REAL,SAVE :: XDIVA, & ! Diffusivity of water vapor + XTHCO ! Thermal conductivity +REAL,SAVE :: XWMIN ! Min value of updraft velocity + ! to enable nucleation process +REAL,SAVE :: XTMIN ! Min value of + ! temperature evolution + ! to enable nucleation process +REAL,SAVE :: XCSTHEN,XCSTDCRIT ! Cst for HEN precalculations +INTEGER, SAVE :: NHYP ! Number of value of the HYP + ! functions +REAL,SAVE :: XHYPINTP1, XHYPINTP2 ! Factors defining the + ! supersaturation log scale +REAL, DIMENSION(:,:), SAVE, ALLOCATABLE & ! Tabulated HYPgeometric + :: XHYPF12, XHYPF32 ! functions used in HEN +INTEGER, SAVE :: NAHEN ! Number of value of the AHEN + ! functions +REAL,SAVE :: XAHENINTP1, XAHENINTP2 ! Factors defining the + ! temperatures in lin scale +REAL, DIMENSION(:), SAVE, ALLOCATABLE & ! + :: XAHENG,XAHENG2,XAHENG3,XPSI1, XPSI3, & ! Twomey-CPB98 and + XAHENF,XAHENY ! Feingold-Heymsfield + ! parameterization to compute Smax +REAL,SAVE :: XWCOEF_F1, XWCOEF_F2, XWCOEF_F3, & ! COEF_F of the polynomial temp. + XWCOEF_Y1, XWCOEF_Y2, XWCOEF_Y3 ! COEF_Y of the polynomial temp. + ! function powering W +! +! +REAL,SAVE :: XKERA1, XKERA2 ! Constants to define the lin + ! and parabolic kernel param. +REAL,SAVE :: XSELFC ! Constants for cloud droplet + ! selfcollection : SELF +! +REAL,SAVE :: XAUTO1, XAUTO2, XCAUTR, & ! Constants for cloud droplet + XLAUTR, XLAUTR_THRESHOLD, & ! autoconversion : AUT + XITAUTR, XITAUTR_THRESHOLD +! +REAL,SAVE :: XACCR1, XACCR2, XACCR3, & ! Constants for the accretion + XACCR4, XACCR5, XACCR6, & ! process + XACCR_CLARGE1, XACCR_CLARGE2, XACCR_RLARGE1, XACCR_RLARGE2, & + XACCR_CSMALL1, XACCR_CSMALL2, XACCR_RSMALL1, XACCR_RSMALL2 +! +REAL,SAVE :: XSCBU2, XSCBU3, & ! Constants for the raindrop + XSCBU_EFF1, XSCBU_EFF2, XSCBUEXP1 ! breakup-selfcollection: SCBU +! +REAL,SAVE :: XSPONBUD1,XSPONBUD2,XSPONBUD3, & ! Spontaneous Break-up + XSPONCOEF2 ! (drop size limiter) +! +REAL,SAVE :: X0EVAR, X1EVAR, & ! Constants for raindrop + XEX0EVAR, XEX1EVAR, XEX2EVAR ! evaporation: EVA +! +REAL,DIMENSION(:,:,:,:), SAVE, ALLOCATABLE :: XCONCC_INI +REAL,SAVE :: XCONCR_PARAM_INI + ! Used to initialize the + ! concentrations from mixing ratios + ! (init and grid-nesting from Kessler) +! +REAL,SAVE :: X0CNDC, X2CNDC ! Constants for cloud droplet + ! condensation/evaporation +REAL,SAVE :: XFREFFC ! Factor to compute the cloud droplet effective radius +REAL,SAVE :: XFREFFR ! Factor to compute the rain drop effective radius +REAL,SAVE :: XCREC, XCRER + ! Factors to compute reff when cloud and rain are present +! +!------------------------------------------------------------------------------- +! +END MODULE MODD_PARAM_LIMA_WARM diff --git a/src/mesonh/micro/modd_parameters.f90 b/src/mesonh/micro/modd_parameters.f90 new file mode 100644 index 000000000..c21c6e709 --- /dev/null +++ b/src/mesonh/micro/modd_parameters.f90 @@ -0,0 +1,98 @@ +!MNH_LIC Copyright 1994-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ###################### + MODULE MODD_PARAMETERS +! ###################### +! +!!**** *MODD_PARAMETERS* - declaration of parameter variables +!! +!! PURPOSE +!! ------- +! The purpose of this declarative module is to specify the variables +! which have the PARAMETER attribute +! +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (module MODD_PARAMETER) +!! +!! AUTHOR +!! ------ +!! V. Ducrocq *Meteo France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 4/07/94 +!! Modification 10/03/95 (I.Mallet) add the coupling files maximum number +!! Modification 10/04/95 (Ph. Hereil) add the budget related informations +!! Modification 15/03/99 (V. Masson) add default value +!! Modification 17/11/00 (P.Jabouille) add the dummy array size +!! Modification 22/01/01 (D.Gazen) change JPSVMAX from 100 to 200 +!! and JPBUMAX from 120 to 250 +!! Modification 17/05/04 (P.Jabouille) add JPOUTMAX +!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 +!! B.VIE 2016 LIMA +! P. Wautelet: 05/2016-04/2018: new data structures and calls for I/O +! Q. Rodier 29/03/2019: increase maximum number of outputs to 999 +! P. Wautelet 17/01/2020: add NBUNAMELGTMAX and NCOMMENTLGTMAX parameters +! P. Wautelet 13/03/2020: remove JPBUMAX and JPBUPROMAX +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +!JUAN CYCLK +!INTEGER, PARAMETER :: JPHEXT = 3 ! Horizontal External points number +INTEGER,SAVE :: JPHEXT = 1 ! Horizontal External points number +! +!JUAN CYCLK +INTEGER, PARAMETER :: JPVEXT = 1 ! Vertical External points number +INTEGER, PARAMETER :: JPVEXT_TURB = 1 ! Vertical External points number +INTEGER, PARAMETER :: JPMODELMAX = 8 ! Maximum allowed number of nested models +INTEGER, PARAMETER :: JPCPLFILEMAX = 24 ! Maximum allowed number of CouPLing FILEs +INTEGER, PARAMETER :: JPRIMMAX = 6 ! Maximum number of points for the + ! horizontal relaxation for the outermost verticals +INTEGER, PARAMETER :: JPSVMAX = 200 ! Maximum number of scalar variables +INTEGER, PARAMETER :: JPSVNAMELGTMAX = 10 ! Maximum length of a scalar variable name (do not set to less than 10) +! +! +REAL, PARAMETER :: XUNDEF = 999. ! default value for undefined or unused +! ! field. +REAL, PARAMETER :: XNEGUNDEF = -999. ! default value for undefined or unused +! ! field (negative value guaranteed) +INTEGER, PARAMETER :: NUNDEF = 999 ! default value for undefined or unused +! ! field. +INTEGER, PARAMETER :: NNEGUNDEF = -999 ! default value for undefined or unused +! ! field (negative value guaranteed) +INTEGER, PARAMETER :: JPDUMMY = 20 ! Size of dummy array +! +INTEGER, PARAMETER :: JPOUTMAX = 999 ! Maximum allowed number of OUTput files +INTEGER, PARAMETER :: JPOUTVARMAX = 192 ! Maximum allowed number of variables in an output file +! +INTEGER, PARAMETER :: NBUNAMELGTMAX = 32 ! Maximum length of a budget name +INTEGER, PARAMETER :: NCOMMENTLGTMAX = 100 ! Maximum length of a comment +INTEGER, PARAMETER :: NMNHNAMELGTMAX = 32 ! Maximum length of a MNH variable name +INTEGER, PARAMETER :: NSTDNAMELGTMAX = 64 ! Maximum length of the standard name of a variable (CF convention) +! +INTEGER, PARAMETER :: NDIRNAMELGTMAX = 512 ! Maximum length of a directory name +INTEGER, PARAMETER :: NFILENAMELGTMAX = 32 ! Maximum length of a file name (must be at least NFILENAMELGTMAXLFI) +INTEGER, PARAMETER :: NFILENAMELGTMAXLFI = 28 ! Maximum length of a file name in LFI file (this is necessary + ! to keep backward compatibility), MUST BE 28 +! +INTEGER, PARAMETER :: NLFIMAXCOMMENTLENGTH = 100 ! Length of comments in LFI files +! +INTEGER, PARAMETER :: JPLIMACCNMAX = 10 ! Maximum allowed number of CCN modes in LIMA +INTEGER, PARAMETER :: JPLIMAIFNMAX = 10 ! Maximum allowed number of IFN modes in LIMA +! +INTEGER, PARAMETER :: NGRIDUNKNOWN = -1 ! Unknown Arakawa grid number +! +END MODULE MODD_PARAMETERS diff --git a/src/mesonh/micro/modd_rain_c2r2_descr.f90 b/src/mesonh/micro/modd_rain_c2r2_descr.f90 new file mode 100644 index 000000000..82146aac4 --- /dev/null +++ b/src/mesonh/micro/modd_rain_c2r2_descr.f90 @@ -0,0 +1,72 @@ +!MNH_LIC Copyright 2000-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ########################### + MODULE MODD_RAIN_C2R2_DESCR +! ########################### +! +!!**** *MODD_RAIN_C2R2_DESCR* - declaration of the microphysical descriptive +!! constants for use in the warm scheme. +!! +!! PURPOSE +!! ------- +! The purpose of this declarative module is to declare the microphysical +! constants. This includes the descriptive parameters for the raindrop +! and the parameters relevant of the dimensional distributions. +! +! m(D) = XAx * D**XBx : Mass-MaxDim relationship +! v(D) = XCx * D**XDx : Fallspeed-MaxDim relationship +! XF0x, XF1x, XF2x : Ventilation factors +! +! and +! +! XALPHAx, XNUx : Generalized GAMMA law +! XLBx : Slope parameter of the +! distribution law +! +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (MODD_RAIN_C2R2_DESCR) +!! +!! AUTHOR +!! ------ +!! J.-P. Pinty *Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original 04/11/2000 +!! J.-P. Pinty 29/11/02 add cloud doplet fall speed parameters +!! +!------------------------------------------------------------------------------- +USE MODD_PARAMETERS, ONLY: JPSVNAMELGTMAX +! +!* 0. DECLARATIONS +! ------------ +! +REAL,SAVE :: XCEXVT ! air density fall speed correction +! +REAL,SAVE :: XAR,XBR,XCR,XDR,XF0R,XF1R, & ! Raindrop charact. + XAC,XBC,XCC,XDC,XF0C,XF2C,XC1C ! Cloud droplet charact. +! +REAL,DIMENSION(:),SAVE,ALLOCATABLE :: XRTMIN + ! Min values of the mixing ratios +REAL,DIMENSION(:),SAVE,ALLOCATABLE :: XCTMIN + ! Min values of the drop concentrations +REAL,SAVE :: XLBC, XLBEXC, & ! shape parameters of the cloud droplets + XLBR, XLBEXR ! shape parameters of the raindrops +! +CHARACTER(LEN=JPSVNAMELGTMAX),DIMENSION(4),PARAMETER & + :: C2R2NAMES=(/'CCCN ','CCLOUD','CRAIN ','SUPSAT'/) + ! basenames of the SV articles stored + ! in the binary files +! +END MODULE MODD_RAIN_C2R2_DESCR +! +! diff --git a/src/mesonh/micro/modd_rain_c2r2_khko_param.f90 b/src/mesonh/micro/modd_rain_c2r2_khko_param.f90 new file mode 100644 index 000000000..639abf3c1 --- /dev/null +++ b/src/mesonh/micro/modd_rain_c2r2_khko_param.f90 @@ -0,0 +1,120 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 modd 2006/10/16 14:23:23 +!----------------------------------------------------------------- +! ########################### + MODULE MODD_RAIN_C2R2_KHKO_PARAM +! ########################### +! +!!**** *MODD_RAIN_C2R2_KHKO_PARAM* - declaration of some microphysical factors +!! extensively used in the warm scheme. +!! +!! PURPOSE +!! ------- +! The purpose of this declarative module is to declare some precomputed +! microphysical paramters directly used in routine RAIN_C2R2_KHKO +! +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! J.-P. Pinty *Laboratoire d'Aerologie* +!! O.Geoffroy (GMEI) +!! +!! MODIFICATIONS +!! ------------- +!! Original 04/12/95 +!! J.-P. Pinty 29/11/02 add cloud droplet cond/eva parameters for C3R5 +!! G.Delautier 2014 : fusion MODD_RAIN_KHKO_PARAM et MODD_RAIN_C2R2_PARAM +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +REAL,SAVE :: XFSEDRR,XFSEDCR, & ! Constants for sedimentation + XFSEDRC,XFSEDCC ! fluxes of R, C +! +! +REAL,SAVE :: XDIVA, & ! Diffusivity of water vapor + XTHCO ! Thermal conductivity +REAL,SAVE :: XWMIN ! Min value of updraft velocity + ! to enable nucleation process +REAL,SAVE :: XTMIN ! Min value of + ! temperature evolution + ! to enable nucleation process +REAL,SAVE :: XCSTHEN,XCSTDCRIT ! Cst for HEN precalculations +INTEGER, SAVE :: NHYP ! Number of value of the HYP + ! functions +REAL,SAVE :: XHYPINTP1, XHYPINTP2 ! Factors defining the + ! supersaturation log scale +REAL, DIMENSION(:), SAVE, ALLOCATABLE & ! Tabulated HYPgeometric + :: XHYPF12, XHYPF32 ! functions used in HEN +INTEGER, SAVE :: NAHEN ! Number of value of the AHEN + ! functions +REAL,SAVE :: XAHENINTP1, XAHENINTP2 ! Factors defining the + ! temperatures in lin scale +REAL, DIMENSION(:), SAVE, ALLOCATABLE & ! + :: XAHENG,XPSI1, XPSI3, & ! Twomey-CPB98 and + XAHENF,XAHENY ! Feingold-Heymsfield + ! parameterization to compute Smax +REAL,SAVE :: XWCOEF_F1, XWCOEF_F2, XWCOEF_F3, & ! COEF_F of the polynomial temp. + XWCOEF_Y1, XWCOEF_Y2, XWCOEF_Y3 ! COEF_Y of the polynomial temp. + ! function powering W +! +! +REAL,SAVE :: XKERA1, XKERA2 ! Constants to define the lin + ! and parabolic kernel param. +REAL,SAVE :: XSELFC ! Constants for cloud droplet + ! selfcollection : SELF +! +REAL,SAVE :: XAUTO1, XAUTO2, XCAUTR, & ! Constants for cloud droplet + XLAUTR, XLAUTR_THRESHOLD, & ! autoconversion : AUT + XITAUTR, XITAUTR_THRESHOLD +! +REAL,SAVE :: XACCR1, XACCR2, XACCR3, & ! Constants for the accretion + XACCR4, XACCR5, XACCR6, & ! process + XACCR_CLARGE1, XACCR_CLARGE2, XACCR_RLARGE1, XACCR_RLARGE2, & + XACCR_CSMALL1, XACCR_CSMALL2, XACCR_RSMALL1, XACCR_RSMALL2 +! +REAL,SAVE :: XSCBU2, XSCBU3, & ! Constants for the raindrop + XSCBU_EFF1, XSCBU_EFF2, XSCBUEXP1 ! breakup-selfcollection: SCBU +! +REAL,SAVE :: XSPONBUD1,XSPONBUD2,XSPONBUD3, & ! Spontaneous Break-up + XSPONCOEF2 ! (drop size limiter) +! +REAL,SAVE :: X0EVAR, X1EVAR, & ! Constants for raindrop + XEX0EVAR, XEX1EVAR, XEX2EVAR ! evaporation: EVA +! +REAL,SAVE :: XCONCC_INI, XCONCR_PARAM_INI ! Used to initialize the + ! concentrations from mixing ratios + ! (init and grid-nesting from Kessler) +! +REAL,SAVE :: X0CNDC, X2CNDC ! Constants for cloud droplet + ! condensation/evaporation +REAL,SAVE :: XFREFFC ! Factor to compute the cloud droplet effective radius +REAL,SAVE :: XFREFFR ! Factor to compute the rain drop effective radius +REAL,SAVE :: XCREC, XCRER + ! Factors to compute reff when cloud and rain are present +! +REAL,SAVE :: XR0 ! new drizzle drops radius + ! autoconversion +! +REAL,SAVE :: XCEVAP ! Constants for raindrop + ! evaporation + +END MODULE MODD_RAIN_C2R2_KHKO_PARAM diff --git a/src/mesonh/micro/modd_rain_ice_descr.f90 b/src/mesonh/micro/modd_rain_ice_descr.f90 new file mode 100644 index 000000000..96295e4e7 --- /dev/null +++ b/src/mesonh/micro/modd_rain_ice_descr.f90 @@ -0,0 +1,87 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 modd 2006/10/16 14:23:23 +!----------------------------------------------------------------- +! ########################## + MODULE MODD_RAIN_ICE_DESCR +! ########################## +! +!!**** *MODD_RAIN_ICE_DESCR* - declaration of the microphysical descriptive +!! constants for use in the warm and cold schemes. +!! +!! PURPOSE +!! ------- +! The purpose of this declarative module is to declare the microphysical +! constants. This includes the descriptive parameters for the raindrop and +! the ice crystal habits and the parameters relevant of the dimensional +! distributions. +! +! m(D) = XAx * D**XBx : Mass-MaxDim relationship +! v(D) = XCx * D**XDx : Fallspeed-MaxDim relationship +! N(Lbda) = XCCx * Lbda**XCXx : NumberConc-Slopeparam relationship +! XF0x, XF1x, XF2x : Ventilation factors +! XC1x : Shape parameter for deposition +! +! and +! +! XALPHAx, XNUx : Generalized GAMMA law +! Lbda = XLBx * (r_x*rho_dref)**XLBEXx : Slope parameter of the +! distribution law +! +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (MODD_RAIN_ICE_DESCR) +!! +!! AUTHOR +!! ------ +!! J.-P. Pinty *Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original 04/12/95 +!! J.-P. Pinty 29/11/02 add ICE4 +!! C. LAC 26/01/2012 : suppression de XCONC qui n'était pas utilisé +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +REAL,SAVE :: XCEXVT ! air density fall speed correction +! +REAL,SAVE :: XAC,XBC,XCC,XDC ! Cloud droplet charact. +REAL,SAVE :: XAR,XBR,XCR,XDR,XCCR ,XF0R,XF1R,XC1R ! Raindrop charact. +REAL,SAVE :: XAI,XBI,XC_I,XDI ,XF0I,XF2I,XC1I ! Cloud ice charact. +REAL,SAVE :: XAS,XBS,XCS,XDS,XCCS,XCXS,XF0S,XF1S,XC1S ! Snow/agg. charact. +REAL,SAVE :: XAG,XBG,XCG,XDG,XCCG,XCXG,XF0G,XF1G,XC1G ! Graupel charact. +REAL,SAVE :: XAH,XBH,XCH,XDH,XCCH,XCXH,XF0H,XF1H,XC1H ! Hail charact. +! +REAL,SAVE :: XALPHAC,XNUC,XALPHAC2,XNUC2, XLBEXC ! Cloud droplet distribution parameters +REAL,DIMENSION(2), SAVE :: XLBC ! Cloud droplet distribution parameters +REAL,SAVE :: XALPHAR,XNUR,XLBEXR,XLBR ! Raindrop distribution parameters +REAL,SAVE :: XALPHAI,XNUI,XLBEXI,XLBI ! Cloud ice distribution parameters +REAL,SAVE :: XALPHAS,XNUS,XLBEXS,XLBS ! Snow/agg. distribution parameters +REAL,SAVE :: XALPHAG,XNUG,XLBEXG,XLBG ! Graupel distribution parameters +REAL,SAVE :: XALPHAH,XNUH,XLBEXH,XLBH ! Hail distribution parameters +! +REAL,SAVE :: XLBDAR_MAX,XLBDAS_MAX,XLBDAG_MAX ! Max values allowed for the shape + ! parameters (rain,snow,graupeln) +! +REAL,DIMENSION(:),SAVE,ALLOCATABLE :: XRTMIN ! Min values allowed for the mixing ratios +REAL,SAVE :: XCONC_SEA ! Diagnostic concentration of droplets over sea +REAL,SAVE :: XCONC_LAND ! Diagnostic concentration of droplets over land +REAL,SAVE :: XCONC_URBAN ! Diagnostic concentration of droplets over urban area +! +END MODULE MODD_RAIN_ICE_DESCR diff --git a/src/mesonh/micro/modd_rain_ice_param.f90 b/src/mesonh/micro/modd_rain_ice_param.f90 new file mode 100644 index 000000000..7568e2a68 --- /dev/null +++ b/src/mesonh/micro/modd_rain_ice_param.f90 @@ -0,0 +1,185 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +! ######spl + MODULE MODD_RAIN_ICE_PARAM +! ########################## +! +!!**** *MODD_RAIN_ICE_PARAM* - declaration of some microphysical factors +!! extensively used in the warm and cold schemes. +!! +!! PURPOSE +!! ------- +! The purpose of this declarative module is to declare some precomputed +! microphysical paramters directly used in routine RAIN_ICE. +! +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (MODD_RAIN_ICE_PARAM) +!! +!! AUTHOR +!! ------ +!! J.-P. Pinty *Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original 04/12/95 +!! J.-P. Pinty 29/11/02 add ICE4 +!! S. Riette 11/2016: new ICE3/ICE4 processes +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +REAL,DIMENSION(2),SAVE :: XFSEDC ! Constants for sedimentation fluxes of C +REAL,SAVE :: XFSEDR,XEXSEDR, & ! Constants for sedimentation + XFSEDI,XEXCSEDI,XEXRSEDI, & ! fluxes of R, I, S and G + XFSEDS,XEXSEDS, & + XFSEDG,XEXSEDG +! +REAL,SAVE :: XNU10,XALPHA1,XBETA1, & ! Constants for heterogeneous + XNU20,XALPHA2,XBETA2, & ! ice nucleation : HEN + XMNU0 ! mass of nucleated ice crystal +! +REAL,SAVE :: XALPHA3,XBETA3, & ! Constants for homogeneous + XHON ! ice nucleation : HON +! +REAL,SAVE :: XSCFAC, & ! Constants for raindrop + X0EVAR,X1EVAR,XEX0EVAR,XEX1EVAR, & ! evaporation: EVA and for + X0DEPI,X2DEPI, & ! deposition : DEP on I, + X0DEPS,X1DEPS,XEX0DEPS,XEX1DEPS, & ! on S and + X0DEPG,X1DEPG,XEX0DEPG,XEX1DEPG ! on G +! +REAL,SAVE :: XTIMAUTI,XTEXAUTI,XCRIAUTI, & ! Constants for pristine ice + XT0CRIAUTI,XACRIAUTI,XBCRIAUTI ! autoconversion : AUT +! +REAL,SAVE :: XCOLIS,XCOLEXIS, & ! Constants for snow + XFIAGGS, & ! aggregation : AGG + XEXIAGGS +! +REAL,SAVE :: XTIMAUTC, & ! Constants for cloud droplet + XCRIAUTC ! autoconversion : AUT +! +REAL,SAVE :: XFCACCR, & ! Constants for cloud droplet + XEXCACCR ! accretion on raindrops : ACC +! +REAL,SAVE :: XDCSLIM,XCOLCS, & ! Constants for the riming of + XEXCRIMSS,XCRIMSS, & ! the aggregates : RIM + XEXCRIMSG,XCRIMSG, & ! + XEXSRIMCG,XSRIMCG, & ! + XEXSRIMCG2,XSRIMCG2, & ! + XSRIMCG3, & ! + XGAMINC_BOUND_MIN, & ! Min val. of Lbda_s for RIM + XGAMINC_BOUND_MAX, & ! Max val. of Lbda_s for RIM + XRIMINTP1,XRIMINTP2 ! Csts for lin. interpol. of + ! the tab. incomplete Gamma law +INTEGER,SAVE :: NGAMINC ! Number of tab. Lbda_s +REAL, DIMENSION(:), SAVE, ALLOCATABLE & + :: XGAMINC_RIM1, & ! Tab. incomplete Gamma funct. + XGAMINC_RIM2, & ! for XDS+2 and for XBS + XGAMINC_RIM4 ! and for 2+XDS+XBS-XBG +! +REAL,SAVE :: XFRACCSS, & ! Constants for the accretion + XLBRACCS1,XLBRACCS2,XLBRACCS3, & ! raindrops onto the aggregates + XFSACCRG, & ! ACC (processes RACCSS and + XLBSACCR1,XLBSACCR2,XLBSACCR3, & ! SACCRG) + XACCLBDAS_MIN, & ! Min val. of Lbda_s for ACC + XACCLBDAS_MAX, & ! Max val. of Lbda_s for ACC + XACCLBDAR_MIN, & ! Min val. of Lbda_r for ACC + XACCLBDAR_MAX, & ! Max val. of Lbda_r for ACC + XACCINTP1S,XACCINTP2S, & ! Csts for bilin. interpol. of + XACCINTP1R,XACCINTP2R ! Lbda_s and Lbda_r in the + ! XKER_RACCSS and XKER_SACCRG + ! tables +INTEGER,SAVE :: NACCLBDAS, & ! Number of Lbda_s values and + NACCLBDAR ! of Lbda_r values in the + ! XKER_RACCSS and XKER_SACCRG + ! tables +REAL,DIMENSION(:,:), SAVE, ALLOCATABLE & + :: XKER_RACCSS, & ! Normalized kernel for RACCSS + XKER_RACCS, & ! Normalized kernel for RACCS + XKER_SACCRG ! Normalized kernel for SACCRG +REAL,SAVE :: XFSCVMG ! Melting-conversion factor of + ! the aggregates +! +REAL,SAVE :: XCOLIR, & ! Constants for rain contact + XEXRCFRI,XRCFRI, & ! freezing : CFR + XEXICFRR,XICFRR ! +! +REAL,SAVE :: XFCDRYG, & ! Constants for the dry growth + XCOLIG,XCOLEXIG,XFIDRYG, & ! of the graupeln : DRY + XFIDRYG2, XEXFIDRYG, & + XCOLSG,XCOLEXSG,XFSDRYG, & ! processes RCDRYG + XLBSDRYG1,XLBSDRYG2,XLBSDRYG3, & ! RIDRYG + XFRDRYG, & ! RSDRYG + XLBRDRYG1,XLBRDRYG2,XLBRDRYG3, & ! RRDRYG + XDRYLBDAR_MIN, & ! Min val. of Lbda_r for DRY + XDRYLBDAR_MAX, & ! Max val. of Lbda_r for DRY + XDRYLBDAS_MIN, & ! Min val. of Lbda_s for DRY + XDRYLBDAS_MAX, & ! Max val. of Lbda_s for DRY + XDRYLBDAG_MIN, & ! Min val. of Lbda_g for DRY + XDRYLBDAG_MAX, & ! Max val. of Lbda_g for DRY + XDRYINTP1R,XDRYINTP2R, & ! Csts for bilin. interpol. of + XDRYINTP1S,XDRYINTP2S, & ! Lbda_r, Lbda_s and Lbda_g in + XDRYINTP1G,XDRYINTP2G ! the XKER_SDRYG and XKER_RDRYG + ! tables +INTEGER,SAVE :: NDRYLBDAR, & ! Number of Lbda_r, + NDRYLBDAS, & ! of Lbda_s and + NDRYLBDAG ! of Lbda_g values in + ! the XKER_SDRYG and XKER_RDRYG + ! tables +REAL,DIMENSION(:,:), SAVE, ALLOCATABLE & + :: XKER_SDRYG, & ! Normalized kernel for SDRYG + XKER_RDRYG ! Normalized kernel for RDRYG +! +! addition of Hail category +! +REAL,SAVE :: XFSEDH,XEXSEDH ! Constants for sedimentation +! +! +REAL,SAVE :: X0DEPH,X1DEPH,XEX0DEPH,XEX1DEPH ! Constants for deposition +! +REAL,SAVE :: XCOLIH, XCOLEXIH, & ! Constants for the dry growth + & XCOLSH, XCOLEXSH, & ! of the hail + & XCOLGH, XCOLEXGH ! +! +REAL,SAVE :: XFWETH,XFSWETH, & ! Constants for the wet growth + XLBSWETH1,XLBSWETH2,XLBSWETH3, & ! of the hailstones : WET + XFGWETH, & ! processes RSWETH + XLBGWETH1,XLBGWETH2,XLBGWETH3, & ! RGWETH + XFRWETH, & ! RRWETH + XLBRWETH1,XLBRWETH2,XLBRWETH3, & ! + XWETLBDAS_MIN, & ! Min val. of Lbda_s for WET + XWETLBDAS_MAX, & ! Max val. of Lbda_s for WET + XWETLBDAG_MIN, & ! Min val. of Lbda_g for WET + XWETLBDAG_MAX, & ! Max val. of Lbda_g for WET + XWETLBDAR_MIN, & ! Min val. of Lbda_r for WET + XWETLBDAR_MAX, & ! Max val. of Lbda_r for WET + XWETLBDAH_MIN, & ! Min val. of Lbda_h for WET + XWETLBDAH_MAX, & ! Max val. of Lbda_h for WET + XWETINTP1S,XWETINTP2S, & ! Csts for bilin. interpol. of + XWETINTP1G,XWETINTP2G, & ! Lbda_r, Lbda_s, Lbda_g + XWETINTP1R,XWETINTP2R, & ! and Lbda_h in + XWETINTP1H,XWETINTP2H ! the XKER_SWETH, XKER_GWETH + ! and XKER_RWETH tables +INTEGER,SAVE :: NWETLBDAS, & ! Number of Lbda_s, + NWETLBDAG, & ! of Lbda_g, + NWETLBDAR, & ! of Lbda_r and + NWETLBDAH ! of Lbda_h values in + ! the XKER_SWETH, XKER_GWETH + ! and XKER_RWETH tables +REAL,DIMENSION(:,:), SAVE, ALLOCATABLE & + :: XKER_SWETH, & ! Normalized kernel for SWETH + XKER_GWETH, & ! Normalized kernel for GWETH + XKER_RWETH ! Normalized kernel for RWETH +! +END MODULE MODD_RAIN_ICE_PARAM diff --git a/src/mesonh/micro/modn_param_lima.f90 b/src/mesonh/micro/modn_param_lima.f90 new file mode 100644 index 000000000..f86b1add0 --- /dev/null +++ b/src/mesonh/micro/modn_param_lima.f90 @@ -0,0 +1,36 @@ +!MNH_LIC Copyright 2001-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!------------------------------------------------------------------------------- +! ###################### + MODULE MODN_PARAM_LIMA +! ###################### +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAM_LIMA +! +IMPLICIT NONE +! +! +NAMELIST/NAM_PARAM_LIMA/LCOLD, LNUCL, LSEDI, LSNOW, LHAIL, LHHONI, LMEYERS,& + NMOD_IFN, XIFN_CONC, LIFN_HOM, & + CIFN_SPECIES, CINT_MIXING, NMOD_IMM, NIND_SPECIE, & + CPRISTINE_ICE_LIMA, CHEVRIMED_ICE_LIMA, & + XALPHAI, XNUI, XALPHAS, XNUS, XALPHAG, XNUG, & + XFACTNUC_DEP, XFACTNUC_CON, NPHILLIPS, & +! + LWARM, LACTI, LRAIN, LSEDC, LACTIT, LBOUND, LSPRO, & + LADJ, & + NMOD_CCN, XCCN_CONC, & + LCCN_HOM, CCCN_MODES, HINI_CCN, HTYPE_CCN, & + XALPHAC, XNUC, XALPHAR, XNUR, & + XFSOLUB_CCN, XACTEMP_CCN, XAERDIFF, XAERHEIGHT, & + LSCAV, LAERO_MASS, LDEPOC, XVDEPOC, LACTTKE, & + LPTSPLIT, LFEEDBACKT, NMAXITER, XMRSTEP, XTSTEP_TS +! +END MODULE MODN_PARAM_LIMA diff --git a/src/mesonh/micro/prognos_lima.f90 b/src/mesonh/micro/prognos_lima.f90 new file mode 100644 index 000000000..648348502 --- /dev/null +++ b/src/mesonh/micro/prognos_lima.f90 @@ -0,0 +1,393 @@ +!MNH_LIC Copyright 2012-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ####################### + MODULE MODI_PROGNOS_LIMA +! ####################### +! +INTERFACE +! +SUBROUTINE PROGNOS_LIMA(PTSTEP,PDZ,PLV,PCPH,PPRES,PRHOD,PRR,PTT,PRV,PRC,PS0,PNAS,PCCS,PNFS) +! +REAL, INTENT(IN) :: PTSTEP +REAL, DIMENSION(:), INTENT(IN) :: PPRES +REAL, DIMENSION(:), INTENT(IN) :: PDZ +REAL, DIMENSION(:), INTENT(IN) :: PLV +REAL, DIMENSION(:), INTENT(IN) :: PCPH +REAL, DIMENSION(:), INTENT(IN) :: PRHOD +REAL, DIMENSION(:), INTENT(IN) :: PRR +REAL, DIMENSION(:), INTENT(INOUT) :: PTT ! PTHS +REAL, DIMENSION(:), INTENT(INOUT) :: PRV ! PRVS +REAL, DIMENSION(:), INTENT(INOUT) :: PRC ! PRCS +REAL, DIMENSION(:), INTENT(INOUT) :: PS0 ! PSVS sursat source +REAL, DIMENSION(:,:), INTENT(INOUT) :: PNAS ! PSVS activated aerosols source +REAL, DIMENSION(:), INTENT(INOUT) :: PCCS ! PSVS droplet concentration source +REAL, DIMENSION(:,:), INTENT(INOUT) :: PNFS ! PSVS free aerosol source +! +END SUBROUTINE PROGNOS_LIMA +! +END INTERFACE +! +END MODULE MODI_PROGNOS_LIMA +! +! ################################################################################### + SUBROUTINE PROGNOS_LIMA(PTSTEP,PDZ,PLV,PCPH,PPRES,PRHOD,PRR,PTT,PRV,PRC,PS0,PNAS,PCCS,PNFS) +! ################################################################################### +! +!!**** * - compute pseudo-prognostic of supersaturation according to Thouron +! et al. 2012 +!! PURPOSE +!! ------- +!! +!!** METHOD +!! +!! REFERENCE +!! --------- +!! +!! Thouron, O., J.-L. Brenguier, and F. Burnet, Supersaturation calculation +!! in large eddy simulation models for prediction of the droplet number +!! concentration, Geosci. Model Dev., 5, 761-772, 2012. +!! +!! AUTHOR +!! ------ +!! 06/2021 B. Vie forked from prognos.f90 +!! +!! MODIFICATIONS +!! ------------- +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! +USE MODD_CST +USE MODD_PARAM_LIMA +USE MODD_PARAM_LIMA_WARM +! +USE MODE_IO +USE MODE_MSG +! +USE MODI_GAMMA +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +! +! +REAL, INTENT(IN) :: PTSTEP +REAL, DIMENSION(:), INTENT(IN) :: PPRES +REAL, DIMENSION(:), INTENT(IN) :: PDZ +REAL, DIMENSION(:), INTENT(IN) :: PLV +REAL, DIMENSION(:), INTENT(IN) :: PCPH +REAL, DIMENSION(:), INTENT(IN) :: PRHOD +REAL, DIMENSION(:), INTENT(IN) :: PRR +REAL, DIMENSION(:), INTENT(INOUT) :: PTT ! PTHS +REAL, DIMENSION(:), INTENT(INOUT) :: PRV ! PRVS +REAL, DIMENSION(:), INTENT(INOUT) :: PRC ! PRCS +REAL, DIMENSION(:), INTENT(INOUT) :: PS0 ! PSVS sursat source +REAL, DIMENSION(:,:), INTENT(INOUT) :: PNAS ! PSVS activated aerosols source +REAL, DIMENSION(:), INTENT(INOUT) :: PCCS ! PSVS droplet concentration source +REAL, DIMENSION(:,:), INTENT(INOUT) :: PNFS ! PSVS free aerosol source +! +! +!* 0.2 Declarations of local variables : +! +! +REAL, DIMENSION(SIZE(PRHOD,1)) :: ZW1,ZW2,ZDZRC2,ZDZRC,ZCPH +REAL, DIMENSION(SIZE(PRHOD,1)) :: ZA1,ZA2,ZB,ZC,ZG +REAL, DIMENSION(SIZE(PRHOD,1)) :: ZLV,ZTT1,ZRT,ZTL,ZTT1_TEMP,ZTT2_TEMP +REAL, DIMENSION(SIZE(PRHOD,1)) :: ZRMOY,ZRVSAT1,ZRVSAT2 +REAL, DIMENSION(SIZE(PRHOD,1)) :: ZVEC2 ! Work vectors forinterpolations +INTEGER, DIMENSION(SIZE(PRHOD,1)):: IVEC2 ! Vectors of indices for interpolations +INTEGER :: J1,J2,JMOD,INUCT,JL +REAL,DIMENSION(SIZE(PS0,1)) ::MEM_PS0,ADJU2 +REAL::AER_RAD +REAL, DIMENSION(SIZE(PRHOD,1)) :: ZFLAG_ACT !Flag for activation +! +INTEGER :: IRESP ! Return code of FM routines +INTEGER :: ILUOUT ! Logical unit of output listing +CHARACTER(LEN=100) :: YMSG +! +REAL, DIMENSION(:,:), ALLOCATABLE :: ZCHEN_MULTI,ZTMP +REAL, DIMENSION(:), ALLOCATABLE :: ZZW1, ZZW2, ZZW6, ZVEC1 +INTEGER, DIMENSION(:), ALLOCATABLE :: IVEC1 ! Vectors of indices for + ! interpolations + +! +INUCT = SIZE(PTT,1) +! +! + ALLOCATE(ZZW1(INUCT)) + ALLOCATE(ZZW2(INUCT)) + ALLOCATE(ZZW6(INUCT)) + ALLOCATE(ZCHEN_MULTI(INUCT,NMOD_CCN)) + ALLOCATE(ZTMP(INUCT,NMOD_CCN)) + ALLOCATE(ZVEC1(INUCT)) + ALLOCATE(IVEC1(INUCT)) +! +! + DO JL=1,INUCT + DO JMOD = 1,NMOD_CCN + ZCHEN_MULTI(JL,JMOD) = (PNFS(JL,JMOD)+PNAS(JL,JMOD))*PRHOD(JL) & + / XLIMIT_FACTOR(JMOD) + ENDDO + END DO +!print*,'ZCHEN_MULTI=',MINVAL(ZCHEN_MULTI(:,1)), MAXVAL(ZCHEN_MULTI(:,1)), & +! 'ZCHEN_MULTI(1,1)=',ZCHEN_MULTI(1,1) +! +!* . Compute the nucleus source +! ----------------------------- +! +! +! Modified values for Beta and C (see in init_aerosol_properties) account for that +! + WHERE ( PS0(:) > 0.) + ZVEC1(:) = MAX( 1.0001, MIN( REAL(NHYP)-0.0001, & + XHYPINTP1*LOG(PS0(:))+XHYPINTP2 ) ) + IVEC1(:) = INT( ZVEC1(:) ) + ZVEC1(:) = ZVEC1(:) - REAL( IVEC1(:) ) + END WHERE +!print*,'ZVEC1=',MINVAL(ZVEC1), MAXVAL(ZVEC1) + ZZW6(:) = 0. ! initialize the change of cloud droplet concentration +! + ZTMP(:,:)=0.0 +! +! Compute the concentration of activable aerosols for each mode +! based on the supersaturation ( -> ZTMP ) +! + DO JMOD = 1, NMOD_CCN ! iteration on mode number + ZZW1(:) = 0. + ! + WHERE( PS0(:)>0.0 ) + ZZW1(:) = XHYPF12( IVEC1(:)+1,JMOD )* ZVEC1(:) & ! hypergeo function + - XHYPF12( IVEC1(:) ,JMOD )*(ZVEC1(:) - 1.0) ! XHYPF12 is tabulated + ! + ZTMP(:,JMOD) = (ZCHEN_MULTI(:,JMOD)/PRHOD(:))*PS0(:)**XKHEN_MULTI(JMOD) & + *ZZW1(:) + ! ZTMP(:,JMOD) = (ZCHEN_MULTI(:,JMOD)/PRHOD(:))*100*PS0(:)**XKHEN_MULTI(JMOD) & + ENDWHERE +!print*,'ZZW1=',MINVAL(ZZW1), MAXVAL(ZZW1) +!print*,'ZTMP=',MINVAL(ZTMP), MAXVAL(ZTMP) + ENDDO +! +! Compute the concentration of aerosols activated at this time step +! as the difference between ZTMP and the aerosols already activated at t-dt (ZZW1) +! + DO JMOD = 1, NMOD_CCN ! iteration on mode number + ZZW2(:) = 0. + ! +! WHERE( SUM(ZTMP(:,:),DIM=2)*PTSTEP .GT. 15.E6/PRHOD(:) ) + ZZW2(:) = MIN( PNFS(:,JMOD),MAX( ZTMP(:,JMOD)- PNAS(:,JMOD) , 0.0 ) ) +! ENDWHERE +!print*,'ZTMP=',ZTMP(:,1) +!print*,'PNAS=',PNAS(:,1) +!print*,'PNFS=',PNFS(:,1) +!print*,'ZZW2=',ZZW2(:) + ! + !* update the concentration of activated CCN = Na + ! + PNAS(:,JMOD) = (PNAS(:,JMOD) + ZZW2(:)) + ! + !* update the concentration of free CCN = Nf + ! + PNFS(:,JMOD) = (PNFS(:,JMOD) - ZZW2(:)) + ! + !* prepare to update the cloud water concentration + ! + ZZW6(:) = ZZW6(:) + ZZW2(:) +!print*,'ZZW6=',MINVAL(ZZW6), MAXVAL(ZZW6) + ENDDO +! +!FLAG ACTIVE A TRUE (1.0) si on active pas +ZFLAG_ACT(:)=0.0 +DO J2=1,SIZE(PRC,1) + IF (ZZW2(J2).EQ.0.0) THEN + ZFLAG_ACT(J2)=1.0 + ENDIF +!print*,'ZFLAG_ACT=',ZFLAG_ACT(J2) +ENDDO +! +! Mean radius +!minimum radius of cloud droplet +AER_RAD=1.0E-6 +ZRMOY(:)=0.0 +DO J2=1,SIZE(PRC,1) + IF ((PRC(J2).NE.0.) .AND. (PCCS(J2).NE.0.)) THEN + ZRMOY(J2)=(MOMG(XALPHAC,XNUC,3.0)*4.0*XPI*PCCS(J2)*XRHOLW/& + (3.0*PRC(J2)*PRHOD(J2)))**(1.0/3.0) + ZRMOY(J2)=(PCCS(J2)*MOMG(XALPHAC,XNUC,1.0)/ZRMOY(J2)) + ENDIF +!ZRMOY(J2)=ZRMOY(J2)+(ZZW2(J2)*AER_RAD) + ZRMOY(J2)=ZRMOY(J2)+(ZZW6(J2)*AER_RAD) +ENDDO + !print*,'prognos RMOY=',MINVAL(ZRMOY),MAXVAL(ZRMOY) +! +! PCCS(:) = ZZW6(:) * PTSTEP + PCCS(:) = PCCS(:) + ZZW6(:) + !print*,'prognos PCCS=',MINVAL(PCCS),MAXVAL(PCCS) +! +!CALCUL DE A1 => Estimation de (drs/dt)f +!T(=à determiner) avant forcage; T'(=PTT) apres forcage +!Calcul de ZTT1: calculé en inversant S0(T)jusqu'à T: +! l'erreur faite sur cette inversion est supérieur à la précision +! recherchée, on applique à rs(T') pour cxalculer le DT=T'-T qui +! correspond à la variation rs(T')-rs(T). Permet de recuperer une valeur +! correcte de DT et donc de determiner T comme T=T'-DT +!ZRVSAT1=rs(T) +! +!print*,'prognos : PS0=',MINVAL(PS0),MAXVAL(PS0) +ZRVSAT1(:)=PRV(:)/(PS0(:)+1.0) +!ZTT1<--es(T) de rs(T) +ZTT1_TEMP(:)=PPRES(:)*((((XMV / XMD)/ZRVSAT1(:))+1.0)**(-1D0)) +!ZTT1<--T de es(T) +ZTT1_TEMP(:)=LOG(ZTT1_TEMP(:)/610.8) +ZTT1_TEMP(:)=(31.25*ZTT1_TEMP(:) -17.5688*273.15)/(ZTT1_TEMP(:) - 17.5688) +!es(T') +ZW1(:)=EXP(XALPW-XBETAW/PTT(:)-XGAMW*LOG(PTT(:))) +!ZRVSAT2=rs(T') +ZRVSAT2(:)=(XMV / XMD)*ZW1(:)/(PPRES(:)-ZW1(:)) +!ZTT2<--es(T') de rs(T') +ZTT2_TEMP(:)=PPRES(:)*((((XMV / XMD)/ZRVSAT2(:))+1.0)**(-1D0)) +!ZTT2<--T' de es(T') +IF (MINVAL(ZTT2_TEMP).LT.0.0) THEN + WRITE(YMSG,*) 'ZTT2_TEMP',MINVAL(ZTT2_TEMP),MINLOC(ZTT2_TEMP) + CALL PRINT_MSG(NVERB_FATAL,'GEN','PROGNOS_LIMA',YMSG) +ENDIF +! +ZTT2_TEMP(:)=LOG(ZW1(:)/610.8) +ZTT2_TEMP(:)=(31.25*ZTT2_TEMP(:) -17.5688*273.15)/(ZTT2_TEMP(:) - 17.5688) +!ZTT1=T'-DT +ZTT1(:)=PTT(:)-(ZTT2_TEMP(:)-ZTT1_TEMP(:)) +!Lv(T) +ZLV(:) = XLVTT+(XCPV-XCL)*(ZTT1(:)-XTT) +! +ZA1(:)=-(((PS0(:)+1.0)**2.0)/PRV(:))*(ZRVSAT2(:)-(PRV(:)/(PS0(:)+1.0)))/PTSTEP +!G +ZG(:)= 1.0/(XRHOLW*((XRV*ZTT1(:)/(XDIVA*EXP(XALPW-(XBETAW/ZTT1(:))-(XGAMW*LOG(ZTT1(:)))))) & ++((ZLV(:)/(XTHCO*ZTT1(:)))*((ZLV(:)/(ZTT1(:)*XRV))-1.0)))) +! +ZC(:)=4.0*XPI*(XRHOLW/PRHOD(:))*ZG(:) +ZDZRC(:)=0.0 +ZDZRC(:)=ZC(:)*PS0(:)*ZRMOY(:) +MEM_PS0(:)=PS0(:) +!CALCUL DE B => Estimation de (drs/dT)ce +!T(=PTT) avant condensation; T'(=à determiner) apres condensation +!Lv(T),Cph(T) +ZLV(:) = XLVTT+(XCPV-XCL)*(PTT(:)-XTT) +ZCPH(:)= XCPD+XCPV*PRV(:)+XCL*(PRC(:)+PRR(:)) +!T'=T+(DT)ce +ZTT1(:)=PTT(:)+(ZDZRC(:)*PTSTEP*ZLV(:)/ZCPH(:)) +!es(T') +ZW1(:)=EXP(XALPW-XBETAW/PTT(:)-XGAMW*LOG(PTT(:))) +!rs(T') +ZW1(:)=(XMV / XMD)*ZW1(:)/(PPRES(:)-ZW1(:)) +!es(Tcond) +ZW2(:)=EXP(XALPW-XBETAW/ZTT1(:)-XGAMW*LOG(ZTT1(:))) +!rs(Tcond) +ZW2(:)=(XMV / XMD)*ZW2(:)/(PPRES(:)-ZW2(:)) +! +WHERE (ZTT1(:).NE.PTT(:)) + ZB(:)=(ZLV(:)/ZCPH(:))*((ZW2(:)-ZW1(:))/(ZTT1(:)-PTT(:))) +ELSEWHERE + ZB(:)=0.0 + ZDZRC(:)=0.0 +ENDWHERE +!Calcul de S+dS +PS0(:)=PS0(:)+((ZA1(:)-(((ZB(:)*(PS0(:)+1.0)+1.0)*ZDZRC(:))/ZRVSAT1(:)))*PTSTEP) +! +PS0=MAX(PS0,-0.98) +!Ajustement tel que rv=(s+1)*rvs +ZTL(:)=PTT(:)-(PLV(:)/PCPH(:))*PRC(:) +ZRT(:)=PRC(:)+PRV(:) +ZDZRC2(:)=PRC(:) +DO J2=1,SIZE(ZDZRC,1) + IF ((ZDZRC(J2).NE.0.0).OR.(ZDZRC2(J2).NE.0.0)) THEN + DO J1=1,5 + ZLV(J2) = XLVTT+(XCPV-XCL)*(PTT(J2)-XTT) + ZCPH(J2)=XCPD+XCPV*PRV(J2)+XCL*(PRC(J2)+PRR(J2)) + ZW1(J2)=EXP(XALPW-XBETAW/PTT(J2)-XGAMW*LOG(PTT(J2))) + ZRVSAT1(J2)=(XMV / XMD)*ZW1(J2)/(PPRES(J2)-ZW1(J2)) + PRV(J2)=MIN(ZRT(J2),(PS0(J2)+1.0)*ZRVSAT1(J2)) + PRC(J2)=MAX(ZRT(J2)-PRV(J2),0.0) + PTT(J2)=0.5*PTT(J2)+0.5*(ZTL(J2)+(ZLV(J2)*PRC(J2)/ZCPH(J2))) + ENDDO + ZLV(J2) = XLVTT+(XCPV-XCL)*(PTT(J2)-XTT) + ZCPH(J2)=XCPD+XCPV*PRV(J2)+XCL*(PRC(J2)+PRR(J2)) + PTT(J2)=ZTL(J2)+(ZLV(J2)*PRC(J2)/ZCPH(J2)) + ENDIF +ENDDO +ADJU2(:)=0.0 +! +!Correction dans les mailles où ds a été surestimée +ZDZRC2(:)=PRC(:)-ZDZRC2(:) +WHERE ((MEM_PS0(:).LE.0.0).AND.(PS0(:).GT.0.0).AND.(ZDZRC2(:).LT.0.0)) + PS0(:)=0.0 + ADJU2(:)=1.0 +ENDWHERE +! +WHERE ((MEM_PS0(:).GE.0.0).AND.(PS0(:).LT.0.0).AND.(ZDZRC2(:).GT.0.0)) + PS0(:)=0.0 + ADJU2(:)=1.0 +ENDWHERE +! +DO J2=1,SIZE(ADJU2,1) + IF (ADJU2(J2)==1) THEN + DO J1=1,5 + ZLV(J2) = XLVTT+(XCPV-XCL)*(PTT(J2)-XTT) + ZCPH(J2)=XCPD+XCPV*PRV(J2)+XCL*(PRC(J2)+PRR(J2)) + ZW1(J2)=EXP(XALPW-XBETAW/PTT(J2)-XGAMW*LOG(PTT(J2))) + ZRVSAT1(J2)=(XMV / XMD)*ZW1(J2)/(PPRES(J2)-ZW1(J2)) + PRV(J2)=MIN(ZRT(J2),(PS0(J2)+1.0)*ZRVSAT1(J2)) + PRC(J2)=MAX(ZRT(J2)-PRV(J2),0.0) + PTT(J2)=0.5*PTT(J2)+0.5*(ZTL(J2)+(ZLV(J2)*PRC(J2)/ZCPH(J2))) + ENDDO + ZLV(J2) = XLVTT+(XCPV-XCL)*(PTT(J2)-XTT) + ZCPH(J2)=XCPD+XCPV*PRV(J2)+XCL*(PRC(J2)+PRR(J2)) + PTT(J2)=ZTL(J2)+(ZLV(J2)*PRC(J2)/ZCPH(J2)) + ENDIF +ENDDO +! +!Elimination de l'eau liquide dans les mailles où le rayon des gouttelettes est +!inférieur à AER_RAD +ZRMOY(:)=0.0 +DO J2=1,SIZE(PRC,1) + IF ((PRC(J2).NE.0.) .AND. (PCCS(J2).NE.0.)) THEN + ZRMOY(J2)=(MOMG(XALPHAC,XNUC,3.0)*4.0*XPI*PCCS(J2)*XRHOLW/& + (3.0*PRC(J2)*PRHOD(J2)))**(1.0/3.0) + ZRMOY(J2)=MOMG(XALPHAC,XNUC,1.0)/ZRMOY(J2) + IF ((ZFLAG_ACT(J2).EQ.1.0).AND.(MEM_PS0(J2).LT.0.0).AND.(ZRMOY(J2).LT.AER_RAD)) THEN + PTT(J2)=ZTL(J2) + PRV(J2)=ZRT(J2) + PRC(J2)=0.0 + ENDIF + ENDIF +ENDDO +! +!Calcul de S au regard de T et rv en fin de pas de temps +ZW1=EXP(XALPW-XBETAW/PTT(:)-XGAMW*LOG(PTT(:))) + !rvsat +ZRVSAT1(:)=(XMV / XMD)*ZW1(:)/(PPRES-ZW1(:)) +! +WHERE (PRC(:)==0.0D0) + PS0(:)=(PRV(:)/ZRVSAT1(:))-1D0 +ENDWHERE +! + DEALLOCATE(ZZW1,ZZW2,ZZW6,ZCHEN_MULTI,ZTMP,ZVEC1,IVEC1) +! +! +CONTAINS +! +FUNCTION MOMG (PALPHA,PNU,PP) RESULT (PMOMG) +USE MODI_GAMMA +IMPLICIT NONE +REAL :: PALPHA ! first shape parameter of the DIMENSIONnal distribution +REAL :: PNU ! second shape parameter of the DIMENSIONnal distribution +REAL :: PP ! order of the moment +REAL :: PMOMG ! result: moment of order ZP +PMOMG = GAMMA(PNU+PP/PALPHA)/GAMMA(PNU) +! +END FUNCTION MOMG +! +END SUBROUTINE PROGNOS_LIMA diff --git a/src/mesonh/micro/radar_rain_ice.f90 b/src/mesonh/micro/radar_rain_ice.f90 new file mode 100644 index 000000000..eddac2294 --- /dev/null +++ b/src/mesonh/micro/radar_rain_ice.f90 @@ -0,0 +1,486 @@ +!MNH_LIC Copyright 1996-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. + +! ########################## + MODULE MODI_RADAR_RAIN_ICE +! ########################## +! +INTERFACE + SUBROUTINE RADAR_RAIN_ICE(PRT,PCIT,PRHODREF,PTEMP,PRARE,PVDOP,PRZDR,PRKDP,& + PCRT) +! +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! microphysical mix. ratios at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIT ! pristine ice concentration at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! density of the ref. state +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTEMP ! air temperature +! +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRARE! radar reflectivity in dBZ +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PVDOP! radar Doppler fall speed +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRZDR! radar differential reflectivity + ! H-V in dBZ +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRKDP! radar differential phase shift + ! H-V in degree/km +REAL, DIMENSION(:,:,:), INTENT(IN),OPTIONAL :: PCRT ! rain concentration at t + +! +END SUBROUTINE RADAR_RAIN_ICE +! +END INTERFACE +! +END MODULE MODI_RADAR_RAIN_ICE +! ######################################################################### + SUBROUTINE RADAR_RAIN_ICE(PRT,PCIT,PRHODREF,PTEMP,PRARE,PVDOP,PRZDR,PRKDP,PCRT) +! ######################################################################### +! +!!**** *RADAR_RAIN_ICE * - computes some pertinent radar parameters +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the equivalent reflectivity, +!! the Doppler reflectivity and the H and V polarized reflectivities of a +!! mixed phase cloud. +!! +!!** METHOD +!! ------ +!! The reflectivities are computed using the n(D) * D**6 formula. The +!! equivalent reflectiviy is the sum of the reflectivity produced by the +!! the raindrops and the equivalent reflectivities of the ice crystals. +!! The latter are computed using the melted diameter. The Doppler +!! reflectivity is the 'fall speed'-moment of individual particle +!! reflectivity. Ice crystal are assumed to have no preferred orientation. +!! the Z_VV formula is taken from Brandes et al. (MWR, 1995). +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST +!! XPI ! +!! XRHOLW ! Liquid water density +!! Module MODD_RAIN_ICE_DESCR +!! Module MODD_RAIN_ICE_PARAM +!! +!! REFERENCE +!! --------- +!! Book2 of documentation ( routine RADAR_RAIN_ICE ) +!! Smith P.L., 1984: Equivalent Radar Reflectivity Factors for Snow and +!! Ice Particles, JCAM, 23, 1258-1260. +!! Andsager K., K. V. Beard, and N. F. Laird, 1999: Laboratory Measurements +!! of Axis Ratio for Large Raindrops, JAS, 56, 2673-2683. +!! +!! AUTHOR +!! ------ +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original 04/05/96 +!! 03/12/96 change the arg. list +!! 15/12/00 change the reflectivity factor +!! 01/07/02 (E.Richard) bug in reflectivity formula +!! for graupeln when warmer than 0°C +!! 19/12/00 (JP Pinty) change the hailstone reflectivity +!! 19/05/04 (JP Pinty) add ZDR and KDP for raindops at 10.71 cm +!! J.-P. Chaboureau 17/06/10 bug correction in reflectivity calculation of icy hydrometeors +!! J.-P. Chaboureau 03/02/12 set undef values for radar reflectivities +!! O. Caumont 09/04/14 correction of ZDR calculation +!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_REF +USE MODD_RAIN_ICE_DESCR, ONLY: XALPHAR_I=>XALPHAR,XNUR_I=>XNUR,XLBEXR_I=>XLBEXR,& + XLBR_I=>XLBR,XCCR_I=>XCCR,XBR_I=>XBR,XAR_I=>XAR,& + XALPHAC_I=>XALPHAC,XNUC_I=>XNUC,& + XLBC_I=>XLBC,XBC_I=>XBC,XAC_I=>XAC,& + XALPHAC2_I=>XALPHAC2,XNUC2_I=>XNUC2,& + XALPHAS_I=>XALPHAS,XNUS_I=>XNUS,XLBEXS_I=>XLBEXS,& + XLBS_I=>XLBS,XCCS_I=>XCCS,XAS_I=>XAS,XBS_I=>XBS,XCXS_I=>XCXS,& + XALPHAG_I=>XALPHAG,XNUG_I=>XNUG,XDG_I=>XDG,XLBEXG_I=>XLBEXG,& + XLBG_I=>XLBG,XCCG_I=>XCCG,XAG_I=>XAG,XBG_I=>XBG,XCXG_I=>XCXG,XCG_I=>XCG,& + XALPHAI_I=>XALPHAI,XNUI_I=>XNUI,XDI_I=>XDI,XLBEXI_I=>XLBEXI,& + XLBI_I=>XLBI,XAI_I=>XAI,XBI_I=>XBI,XC_I_I=>XC_I,XCS_I=>XCS,XDS_I=>XDS,& + XRTMIN_I=>XRTMIN,XCONC_LAND,XCONC_SEA,XCR_I=>XCR,XDR_I=>XDR,& + XAH_I=>XAH,XLBH_I=>XLBH,XLBEXH_I=>XLBEXH,XCCH_I=>XCCH,& + XALPHAH_I=>XALPHAH,XNUH_I=>XNUH,XCXH_I=>XCXH,XDH_I=>XDH,XCH_I=>XCH,XBH_I=>XBH +USE MODD_PARAM_LIMA_WARM, ONLY: XLBEXR_L=>XLBEXR,XLBR_L=>XLBR,XBR_L=>XBR,XAR_L=>XAR,& + XBC_L=>XBC,XAC_L=>XAC,XCR_L=>XCR,XDR_L=>XDR +USE MODD_PARAM_LIMA_COLD, ONLY: XDI_L=>XDI,XLBEXI_L=>XLBEXI,XLBI_L=>XLBI,XAI_L=>XAI,XBI_L=>XBI,XC_I_L=>XC_I,& + XLBEXS_L=>XLBEXS,XLBS_L=>XLBS,XCCS_L=>XCCS,& + XAS_L=>XAS,XBS_L=>XBS,XCXS_L=>XCXS,XCS_L=>XCS,XDS_L=>XDS + +USE MODD_PARAM_LIMA_MIXED, ONLY:XDG_L=>XDG,XLBEXG_L=>XLBEXG,XLBG_L=>XLBG,XCCG_L=>XCCG,& + XAG_L=>XAG,XBG_L=>XBG,XCXG_L=>XCXG,XCG_L=>XCG,& + XAH_L=>XAH,XLBH_L=>XLBH,XLBEXH_L=>XLBEXH,XCCH_L=>XCCH,& + XCXH_L=>XCXH,XDH_L=>XDH,XCH_L=>XCH,XALPHAH_L=>XALPHAH,XNUH_L=>XNUH,XBH_L=>XBH + +USE MODD_PARAM_LIMA, ONLY: XALPHAR_L=>XALPHAR,XNUR_L=>XNUR,XALPHAS_L=>XALPHAS,XNUS_L=>XNUS,& + XALPHAG_L=>XALPHAG,XNUG_L=>XNUG, XALPHAI_L=>XALPHAI,XNUI_L=>XNUI,& + XRTMIN_L=>XRTMIN,XALPHAC_L=>XALPHAC,XNUC_L=>XNUC +USE MODD_PARAMETERS +USE MODD_PARAM_n, ONLY : CCLOUD +USE MODD_LUNIT +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +! +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! microphysical mix. ratios at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCIT ! pristine ice concentration at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! density of the ref. state +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTEMP ! air temperature +! +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRARE! radar reflectivity in dBZ +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PVDOP! radar Doppler fall speed +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRZDR! radar differential reflectivity + ! H-V in dBZ +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRKDP! radar differential phase shift + ! H-V in degree/km +REAL, DIMENSION(:,:,:), INTENT(IN),OPTIONAL :: PCRT ! rain concentration at t +! +!* 0.2 Declarations of local variables : +! +INTEGER :: IKB ! Coordinates of the first physical points along z +INTEGER :: IND ! Number of interval to integrate the kernels +REAL :: ZALPHA, ZNU, ZP ! Parameters to compute the value of the p_moment + ! of the generalized Gamma function +REAL :: ZDINFTY ! Factor used to define the "infinite" diameter +! +REAL :: ZCXR=-1.0 ! for rain N ~ 1/N_0 + ! (in Kessler parameterization) +REAL :: ZSLOPE, ZINTERCEPT, ZEXPONENT ! parameters defining the mean axis ratio + ! functionnal +REAL :: ZDMELT_FACT ! factor used to compute the equivalent + ! melted diameter +REAL :: ZEQICE ! factor used to convert the ice crystals + ! reflectivity into an equivalent liquid + ! water reflectivity (from Smith, JCAM 84) +REAL :: ZEXP ! anciliary parameter +REAL :: ZRHO00 ! Surface reference air density +! +LOGICAL, DIMENSION(SIZE(PTEMP,1),SIZE(PTEMP,2),SIZE(PTEMP,3)) :: GRAIN +REAL, DIMENSION(SIZE(PTEMP,1),SIZE(PTEMP,2),SIZE(PTEMP,3)) :: ZLBDA + ! slope distribution parameter +REAL, DIMENSION(SIZE(PTEMP,1),SIZE(PTEMP,2),SIZE(PTEMP,3)) :: ZW +REAL, DIMENSION(SIZE(PTEMP,1),SIZE(PTEMP,2),SIZE(PTEMP,3)) :: ZREFL_MELT_CONV +INTEGER :: JLBDA +REAL :: ZFRAC_WATER +! +LOGICAL :: GFLAG ! Logical flag for printing the constatnts on the output + ! listing +! +REAL :: ZR0, ZR1, ZR2 ! r(D) parameters +!REAL :: ZREXP, ZSCALE ! parameters to compute Zhh from Zvv +REAL :: Z1, Z2, Z3 ! expansion coefficients +! +INTEGER :: II, IJ, IK +! +!REAL :: ZA,ZB,ZCX,ZALPHA,ZNU,ZLB,ZLBEX,ZRHOHYD ! generic microphysical parameters +!REAL,DIMENSION(:),ALLOCATABLE :: ZRTMIN ! local values for XRTMIN + +REAL, DIMENSION(SIZE(PTEMP,1),SIZE(PTEMP,2),SIZE(PTEMP,3)) :: ZLB_L +REAL :: ZLB,ZLBEX , ZCC,ZCX,ZC,ZD + +!------------------------------------------------------------------------------- +! +! +!* 1. FUNCTION STATEMENTS +! ------------------- +! +! +!* 1.1 p_moment of the Generalized GAMMA function +! +! Recall that MOMG(ZALPHA,ZNU,ZP)=GAMMA(ZNU+ZP/ZALPHA)/GAMMA(ZNU) +! +! +!------------------------------------------------------------------------------- +! +! +! 2. INTIALIZE OUTPUT LISTING AND OTHER ARRAYS +! ----------------------------------------- +! +! +PRARE(:,:,:) = 0.0 ! radar reflectivity +PVDOP(:,:,:) = 0.0 ! radar Doppler fall speed +PRZDR(:,:,:) = 0.0 ! radar differential reflectivity +PRKDP(:,:,:) = 0.0 ! radar differential phase shift +! +!------------------------------------------------------------------------------- +! +! +!* 3. RAINDROPS +! --------- +! +IF (SIZE(PRT,4) >= 3) THEN + IND = 50 + ZSLOPE = 0.62 ! the mean axis ratio function writes as r**ZEXPONENT + ZINTERCEPT = 1.03 ! with + ZEXPONENT = 7.0/3.0 ! r = ZSLOPE*D+ZINTERCEPT where D is the drop diameter + ZDINFTY = 20.0 +! +! The raindrop aspect ratio is given by Andsager et al. (1999) +! r(D) = ZR0 + ZR1*D + ZR2*D**2 +! + ZR0 = 1.012 + ZR1 = -0.144E2 + ZR2 = -1.03E4 +! +! ZREXP = 7.0/3.0 +! ZSCALE = ZR0**ZREXP +! Z1 = ZREXP*(ZR1/ZR0) +! Z2 = ZREXP*(ZR2/ZR0)+ZREXP*(ZREXP-1.0)*0.5*(ZR1/ZR0)**2 + Z1=.97 + Z2=.64 + Z3=7.8 +! + ZLBDA(:,:,:) = 0.0 + IF (CCLOUD == 'LIMA') THEN + GRAIN(:,:,:) =( (PRT(:,:,:,3).GT.XRTMIN_L(3)).AND. PCRT(:,:,:).GT.0.0) + ZLBEX=1.0/(-XBR_L) + ZLB_L(:,:,:)=( XAR_L*PCRT(:,:,:)*PRHODREF(:,:,:)*MOMG(XALPHAR_L,XNUR_L,XBR_L) )**(-ZLBEX) + WHERE( GRAIN(:,:,:) ) + ZLBDA(:,:,:) =ZLB_L(:,:,:) *( PRHODREF(:,:,:)*PRT(:,:,:,3) )**(ZLBEX) + PRARE(:,:,:) = 1.E18*PCRT(:,:,:)*PRHODREF(:,:,:)*(ZLBDA(:,:,:)**(-6.0))*MOMG(XALPHAR_L,XNUR_L,6.0) + PVDOP(:,:,:) = 1.E18*PCRT(:,:,:)*PRHODREF(:,:,:)*XCR_L*(ZLBDA(:,:,:)**(-6.0-XDR_L)) & + *MOMG(XALPHAR_L,XNUR_L,6.0+XDR_L) + PRZDR(:,:,:) = Z1+Z2*(PRHODREF(:,:,:)*PRT(:,:,:,3))**(-ZLBEX)+Z3*(PRHODREF(:,:,:)*PRT(:,:,:,3))**(-2.*ZLBEX) + PRZDR(:,:,:) = 10.0*LOG10( PRZDR(:,:,:) ) ! now in dBZ + PRKDP(:,:,:) = 6.7E3*( PRHODREF(:,:,:)*PRT(:,:,:,3) )* & + (-ZR1*(MOMG(XALPHAR_L,XNUR_L,4.0)/MOMG(XALPHAR_L,XNUR_L,3.0))*(1.0/ZLBDA(:,:,:)) & + -ZR2*(MOMG(XALPHAR_L,XNUR_L,5.0)/MOMG(XALPHAR_L,XNUR_L,3.0))*(1.0/ZLBDA(:,:,:)**2)) + ! in degree/km + END WHERE + ELSE + IF( SIZE(PRT,4) == 3 ) THEN + GRAIN(:,:,:) = PRT(:,:,:,3).GT.1.0E-15 + ZCC = 1.E7; ZLBEX = -0.25 ! Marshall-Palmer law + ZALPHA = 1.0; ZNU = 1.0 ! Marshall-Palmer law + ZC = 842.; ZD = 0.8 ! Raindrop fall-speed + ZLB = (XPI*XRHOLW*ZCC)**(-XLBEXR_I) + ELSE + ZLB=XLBR_I + ZLBEX=XLBEXR_I + ZCC=XCCR_I + ZALPHA=XALPHAR_I + ZNU=XNUR_I + ZC=XCR_I + ZD=XDR_I + GRAIN(:,:,:) = PRT(:,:,:,3).GT.XRTMIN_I(3) + END IF + WHERE( GRAIN(:,:,:) ) + ZLBDA(:,:,:) = ZLB*( PRHODREF(:,:,:)*PRT(:,:,:,3) )**ZLBEX + PRARE(:,:,:) = 1.E18*ZCC*(ZLBDA(:,:,:)**(ZCXR-6.0))*MOMG(ZALPHA,ZNU,6.0) + PVDOP(:,:,:) = 1.E18*ZCC*ZC*(ZLBDA(:,:,:)**(ZCXR-6.0-ZD)) & + *MOMG(ZALPHA,ZNU,6.0+ZD) + PRZDR(:,:,:) = Z1+Z2*(PRHODREF(:,:,:)*PRT(:,:,:,3))**(-ZLBEX)+Z3*(PRHODREF(:,:,:)*PRT(:,:,:,3))**(-2.*ZLBEX) + PRZDR(:,:,:) = 10.0*LOG10( PRZDR(:,:,:) ) ! now in dBZ + PRKDP(:,:,:) = 6.7E3*( PRHODREF(:,:,:)*PRT(:,:,:,3) )* & + (-ZR1*(MOMG(ZALPHA,ZNU,4.0)/MOMG(ZALPHA,ZNU,3.0))*(1.0/ZLBDA(:,:,:)) & + -ZR2*(MOMG(ZALPHA,ZNU,5.0)/MOMG(ZALPHA,ZNU,3.0))*(1.0/ZLBDA(:,:,:)**2)) + ! in degree/km + END WHERE + ENDIF + +END IF + + +! +!* 4. PRISTINE ICE +! ------------ +! +IF (SIZE(PRT,4) >= 4) THEN + ZEQICE = 0.224 + IF (CCLOUD == 'LIMA') THEN + ZDMELT_FACT = ( (6.0*XAI_L)/(XPI*XRHOLW) )**(2.0) + ZEXP = 2.0*XBI_L + WHERE( PRT(:,:,:,4).GT.XRTMIN_L(4) .AND. PCIT(:,:,:).GT.0.0 ) + ZLBDA(:,:,:) = XLBI_L**(XLBEXI_L)* (PRT(:,:,:,4)/PCIT(:,:,:))**(-XLBEXI_L) + ZW(:,:,:) = ZEQICE*ZDMELT_FACT *1.E18*PRHODREF(:,:,:)*PCIT(:,:,:)*(ZLBDA(:,:,:)**(-ZEXP))*MOMG(XALPHAI_L,XNUI_L,ZEXP) + PVDOP(:,:,:) = PVDOP(:,:,:)+ZEQICE*ZDMELT_FACT*MOMG(XALPHAI_L,XNUI_L,ZEXP+XDI_L) & + *1.E18*PRHODREF(:,:,:)*PCIT(:,:,:)*XC_I_L*(ZLBDA(:,:,:)**(-ZEXP-XDI_L)) + PRARE(:,:,:) = PRARE(:,:,:) + ZW(:,:,:) + END WHERE + ELSE + ZDMELT_FACT = ( (6.0*XAI_I)/(XPI*XRHOLW) )**(2.0) + ZEXP = 2.0*XBI_I + WHERE( PRT(:,:,:,4).GT.XRTMIN_I(4) .AND. PCIT(:,:,:).GT.0.0 ) + ZLBDA(:,:,:) = XLBI_I*( PRHODREF(:,:,:)*PRT(:,:,:,4)/PCIT(:,:,:) )**XLBEXI_I + ZW(:,:,:) = ZEQICE*ZDMELT_FACT*1.E18*PCIT(:,:,:)*(ZLBDA(:,:,:)**(-ZEXP))*MOMG(XALPHAI_I,XNUI_I,ZEXP) + PVDOP(:,:,:) = PVDOP(:,:,:)+ZEQICE*ZDMELT_FACT*MOMG(XALPHAI_I,XNUI_I,ZEXP+XDI_I) & + *1.E18*PCIT(:,:,:)*XC_I_I*(ZLBDA(:,:,:)**(-ZEXP-XDI_I)) + PRARE(:,:,:) = PRARE(:,:,:) + ZW(:,:,:) + END WHERE + END IF +END IF +! +!* 5. SNOW/AGGREGATES +! --------------- +! +IF (SIZE(PRT,4) >= 5) THEN + IF (CCLOUD=='LIMA') THEN + ZDMELT_FACT = ( (6.0*XAS_L)/(XPI*XRHOLW) )**(2.0) + ZEXP = 2.0*XBS_L + WHERE( PRT(:,:,:,5).GT.XRTMIN_L(5) ) + ZLBDA(:,:,:) = XLBS_L*( PRHODREF(:,:,:)*PRT(:,:,:,5) )**XLBEXS_L + ZW(:,:,:) = ZEQICE*ZDMELT_FACT & + *1.E18*XCCS_L*(ZLBDA(:,:,:)**(XCXS_L-ZEXP))*MOMG(XALPHAS_L,XNUS_L,ZEXP) + PVDOP(:,:,:) = PVDOP(:,:,:)+ZEQICE*ZDMELT_FACT*MOMG(XALPHAS_L,XNUS_L,ZEXP+XDS_L) & + *1.E18*XCCS_L*XCS_L*(ZLBDA(:,:,:)**(XCXS_L-ZEXP-XDS_L)) + PRARE(:,:,:) = PRARE(:,:,:) + ZW(:,:,:) + END WHERE + ELSE + ZDMELT_FACT = ( (6.0*XAS_I)/(XPI*XRHOLW) )**(2.0) + ZEXP = 2.0*XBS_I + WHERE( PRT(:,:,:,5).GT.XRTMIN_I(5) ) + ZLBDA(:,:,:) = XLBS_I*( PRHODREF(:,:,:)*PRT(:,:,:,5) )**XLBEXS_I + ZW(:,:,:) = ZEQICE*ZDMELT_FACT & + *1.E18*XCCS_I*(ZLBDA(:,:,:)**(XCXS_I-ZEXP))*MOMG(XALPHAS_I,XNUS_I,ZEXP) + PVDOP(:,:,:) = PVDOP(:,:,:)+ZEQICE*ZDMELT_FACT*MOMG(XALPHAS_I,XNUS_I,ZEXP+XDS_I) & + *1.E18*XCCS_I*XCS_I*(ZLBDA(:,:,:)**(XCXS_I-ZEXP-XDS_I)) + PRARE(:,:,:) = PRARE(:,:,:) + ZW(:,:,:) + END WHERE + ENDIF +END IF +! +!* 6. GRAUPELN +! -------- +! +IF (SIZE(PRT,4) >= 6) THEN + IF (CCLOUD=='LIMA') THEN + ZFRAC_WATER = 0.14 + ZDMELT_FACT = ( (6.0*XAG_L)/(XPI*XRHOLW) )**(2.0) + WHERE( PTEMP(:,:,:).GT.XTT ) + ZREFL_MELT_CONV(:,:,:) = ((1.0-ZFRAC_WATER)*ZEQICE+ZFRAC_WATER)*ZDMELT_FACT + ELSEWHERE + ZREFL_MELT_CONV(:,:,:) = ZEQICE*ZDMELT_FACT + END WHERE +! + ZEXP = 2.0*XBG_L + WHERE( PRT(:,:,:,6).GT.XRTMIN_L(6) ) + ZLBDA(:,:,:) = XLBG_L*( PRHODREF(:,:,:)*PRT(:,:,:,6) )**XLBEXG_L + ZW(:,:,:) = ZREFL_MELT_CONV(:,:,:)*1.E18*XCCG_L* & + (ZLBDA(:,:,:)**(XCXG_L-ZEXP))*MOMG(XALPHAG_L,XNUG_L,ZEXP) + PVDOP(:,:,:) = PVDOP(:,:,:) + & + ZREFL_MELT_CONV(:,:,:)*1.E18*XCCG_L*XCG_L* & + (ZLBDA(:,:,:)**(XCXG_L-ZEXP-XDG_L))*MOMG(XALPHAG_L,XNUG_L,ZEXP+XDG_L) + PRARE(:,:,:) = PRARE(:,:,:) + ZW(:,:,:) + END WHERE + ELSE + ZFRAC_WATER = 0.14 + ZDMELT_FACT = ( (6.0*XAG_I)/(XPI*XRHOLW) )**(2.0) + WHERE( PTEMP(:,:,:).GT.XTT ) + ZREFL_MELT_CONV(:,:,:) = ((1.0-ZFRAC_WATER)*ZEQICE+ZFRAC_WATER)*ZDMELT_FACT + ELSEWHERE + ZREFL_MELT_CONV(:,:,:) = ZEQICE*ZDMELT_FACT + END WHERE +! + ZEXP = 2.0*XBG_I + WHERE( PRT(:,:,:,6).GT.XRTMIN_I(6) ) + ZLBDA(:,:,:) = XLBG_I*( PRHODREF(:,:,:)*PRT(:,:,:,6) )**XLBEXG_I + ZW(:,:,:) = ZREFL_MELT_CONV(:,:,:)*1.E18*XCCG_I* & + (ZLBDA(:,:,:)**(XCXG_I-ZEXP))*MOMG(XALPHAG_I,XNUG_I,ZEXP) + PVDOP(:,:,:) = PVDOP(:,:,:) + & + ZREFL_MELT_CONV(:,:,:)*1.E18*XCCG_I*XCG_I* & + (ZLBDA(:,:,:)**(XCXG_I-ZEXP-XDG_I))*MOMG(XALPHAG_I,XNUG_I,ZEXP+XDG_I) + PRARE(:,:,:) = PRARE(:,:,:) + ZW(:,:,:) + END WHERE + ENDIF +END IF +! +!* 7. HAILSTONES +! ---------- +!² +IF (SIZE(PRT,4) >= 7) THEN + IF (CCLOUD=='LIMA') THEN + ZFRAC_WATER = 1. + ZDMELT_FACT = ( (6.0*XAH_L)/(XPI*XRHOLW) )**(2.0) + ZREFL_MELT_CONV(:,:,:) = ((1.0-ZFRAC_WATER)*ZEQICE+ZFRAC_WATER)*ZDMELT_FACT +! + ZEXP = 2.0*XBH_L + WHERE( PRT(:,:,:,7).GT.XRTMIN_L(7) ) + ZLBDA(:,:,:) = XLBH_L*( PRHODREF(:,:,:)*PRT(:,:,:,7) )**XLBEXH_L + ZW(:,:,:) = ZREFL_MELT_CONV(:,:,:)*1.E18*XCCH_L* & + (ZLBDA(:,:,:)**(XCXH_L-ZEXP))*MOMG(XALPHAH_L,XNUH_L,ZEXP) + PVDOP(:,:,:) = PVDOP(:,:,:) + & + ZREFL_MELT_CONV(:,:,:)*1.E18*XCCH_L*XCH_L* & + (ZLBDA(:,:,:)**(XCXH_L-ZEXP-XDH_L))*MOMG(XALPHAH_L,XNUH_L,ZEXP+XDH_L) + PRARE(:,:,:) = PRARE(:,:,:) + ZW(:,:,:) + END WHERE + ELSE + ZFRAC_WATER = 1. + ZDMELT_FACT = ( (6.0*XAH_I)/(XPI*XRHOLW) )**(2.0) + ZREFL_MELT_CONV(:,:,:) = ((1.0-ZFRAC_WATER)*ZEQICE+ZFRAC_WATER)*ZDMELT_FACT +! + ZEXP = 2.0*XBH_I + WHERE( PRT(:,:,:,7).GT.XRTMIN_I(7) ) + ZLBDA(:,:,:) = XLBH_I*( PRHODREF(:,:,:)*PRT(:,:,:,7) )**XLBEXH_I + ZW(:,:,:) = ZREFL_MELT_CONV(:,:,:)*1.E18*XCCH_I* & + (ZLBDA(:,:,:)**(XCXH_I-ZEXP))*MOMG(XALPHAH_I,XNUH_I,ZEXP) + PVDOP(:,:,:) = PVDOP(:,:,:) + & + ZREFL_MELT_CONV(:,:,:)*1.E18*XCCH_I*XCH_I* & + (ZLBDA(:,:,:)**(XCXH_I-ZEXP-XDH_I))*MOMG(XALPHAH_I,XNUH_I,ZEXP+XDH_I) + PRARE(:,:,:) = PRARE(:,:,:) + ZW(:,:,:) + END WHERE + END IF +END IF +! +!* 8. UNIT CONVERSION +! --------------- +! +IKB = 1 + JPVEXT +ZRHO00 = XP00/(XRD*XTHVREFZ(IKB)) +WHERE( PRARE(:,:,:) >= 1.0 ) + PVDOP(:,:,:) = PVDOP(:,:,:)/PRARE(:,:,:) ! Doppler speed normalization in m/s + PVDOP(:,:,:) = PVDOP(:,:,:)*(ZRHO00/PRHODREF(:,:,:))**0.4 + ! air density correction +ELSEWHERE + PVDOP(:,:,:) = 0.0 +END WHERE +! +! MODIF FP FEB 2012 +!WHERE( PRARE(:,:,:) > 0.0 ) +WHERE( PRARE(:,:,:) > 1.E-3 ) +! END MODIF + PRARE(:,:,:) = 10.0*LOG10( PRARE(:,:,:) ) ! Z_equiv in dBZ +ELSEWHERE + PRARE(:,:,:) = XUNDEF +END WHERE + + +! +!------------------------------------------------------------------------------- +! +CONTAINS +! + FUNCTION MOMG (PALPHA,PNU,PP) RESULT (PMOMG) +! +! auxiliary routine used to compute the Pth moment order of the generalized +! gamma law +! + USE MODI_GAMMA +! + IMPLICIT NONE +! + REAL :: PALPHA ! first shape parameter of the dimensionnal distribution + REAL :: PNU ! second shape parameter of the dimensionnal distribution + REAL :: PP ! order of the moment + REAL :: PMOMG ! result: moment of order ZP +! +!------------------------------------------------------------------------------ +! +! + PMOMG = GAMMA(PNU+PP/PALPHA)/GAMMA(PNU) +! + END FUNCTION MOMG +! +!------------------------------------------------------------------------------ +! +END SUBROUTINE RADAR_RAIN_ICE diff --git a/src/mesonh/micro/rain_c2r2_khko.f90 b/src/mesonh/micro/rain_c2r2_khko.f90 new file mode 100644 index 000000000..5708c0d4c --- /dev/null +++ b/src/mesonh/micro/rain_c2r2_khko.f90 @@ -0,0 +1,1957 @@ +!MNH_LIC Copyright 1996-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ###################### + MODULE MODI_RAIN_C2R2_KHKO +! ###################### +! +INTERFACE + SUBROUTINE RAIN_C2R2_KHKO(HCLOUD,OACTIT, OSEDC, ORAIN, KSPLITR, PTSTEP, & + KMI,TPFILE, & + PZZ, PRHODJ, & + PRHODREF, PEXNREF, & + PPABST, PTHT, PRVT, PRCT, & + PRRT, PTHM, PRCM, PPABSM, & + PW_NU,PDTHRAD, PTHS, PRVS, PRCS, PRRS, & + PCNT, PCCT, PCRT, PCNS, PCCS, PCRS, & + PINPRC, PINPRR, PINPRR3D, PEVAP3D,PAEROT, & + PSOLORG, PMI, HACTCCN, & + PINDEP, PSUPSAT, PNACT ) +! +USE MODD_IO, ONLY: TFILEDATA +! +CHARACTER(LEN=*), INTENT(IN) :: HCLOUD ! kind of cloud + +LOGICAL, INTENT(IN) :: OACTIT ! Switch to activate the + ! activation by radiative + ! tendency +LOGICAL, INTENT(IN) :: OSEDC ! switch to activate the + ! cloud droplet sedimentation +LOGICAL, INTENT(IN) :: ORAIN ! switch to activate the + ! rain formation by coalescence +INTEGER, INTENT(IN) :: KSPLITR ! Number of small time step + ! integration for rain sedimendation +REAL, INTENT(IN) :: PTSTEP ! Time step :XTSTEP in namelist +INTEGER, INTENT(IN) :: KMI ! Model index +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +! +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHM ! Theta at time t-Dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! Pressure time t-Dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCM ! Cloud water m.r. at time t-Dt +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PW_NU ! updraft velocity used for + ! the nucleation param. +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTHRAD ! THeta RADiative Tendancy +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVS ! Water vapor m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRRS ! Rain water m.r. source +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCNT ! Water vapor C. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCCT ! Cloud water C. at t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCRT ! Rain water C. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCNS ! Water vapor C. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCCS ! Cloud water C. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCRS ! Rain water C. source +! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRC ! Cloud instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINDEP ! Cloud instant deposition +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRR ! Rain instant precip +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRR3D! Rain inst precip 3D +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEVAP3D! Rain evap profile +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PAEROT ! Aerosol concentration +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSOLORG ![%] solubility fraction of soa +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PMI +CHARACTER(LEN=4), INTENT(IN) :: HACTCCN ! kind of CCN activation scheme +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSUPSAT !sursat +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PNACT !concentrtaion d'aérosols activés au temps t +! +END SUBROUTINE RAIN_C2R2_KHKO +END INTERFACE +END MODULE MODI_RAIN_C2R2_KHKO +! ###################################################################### + SUBROUTINE RAIN_C2R2_KHKO (HCLOUD,OACTIT, OSEDC, ORAIN, KSPLITR, PTSTEP, & + KMI, TPFILE, PZZ, PRHODJ, & + PRHODREF, PEXNREF, & + PPABST, PTHT, PRVT, PRCT, & + PRRT, PTHM, PRCM, PPABSM, & + PW_NU,PDTHRAD, PTHS, PRVS, PRCS, PRRS, & + PCNT, PCCT, PCRT, PCNS, PCCS, PCRS, & + PINPRC, PINPRR, PINPRR3D, PEVAP3D,PAEROT, & + PSOLORG, PMI, HACTCCN, & + PINDEP, PSUPSAT, PNACT ) +! ###################################################################### +! +!!**** * - compute the explicit microphysical sources of cloud water and +!! rain water concentrations and mixing ratios +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the microphysical sources +!! for the two schemes C2R2 and KHKO +!! For C2R2 the microphysical sources are : +!! nucleation, sedimentation, autoconversion, accretion, self-collection +!! and vaporisation which are parameterized according to Cohard and Pinty +!! QJRMS, 2000 +!! For KHKO the microphysical sources are : +!! drizzle drops sedimentation, autoconversion, accretion and vaporisation +!! which are parameterized according to Khairoutdinov and Kogan 2000, +!! nucleation and cloud droplets sedimentation which are parameterized +!! according to Cohard and Pinty QJRMS, 2000 +!! +!!** METHOD +!! ------ +!! The activation of CCN is checked for quasi-saturated air parcels +!! to update the cloud droplet number concentration. Then assuming a +!! generalized gamma distribution law for the cloud droplets and the +!! raindrops, the zeroth and third order moments tendencies are evaluated +!! for all the coalescence terms by integrating the Stochastic Collection +!! Equation. As autoconversion is a process that cannot be resolved +!! analytically, the Berry-Reinhardt parameterisation is employed with +!! modifications to initiate the raindrop spectrum mode. The integration +!! of the raindrop evaporation of the raindrops below clouds is +!! straightformward. +!! +!! The sedimentation rates are computed with a time spliting technique: +!! an upstream scheme, written as a difference of non-advective fluxes. +!! This source term is added to the next coming time step (split-implicit +!! process). +!! +!! EXTERNAL +!! -------- +!! None +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_PARAMETERS +!! JPHEXT : Horizontal external points number +!! JPVEXT : Vertical external points number +!! Module MODD_CONF : +!! CCONF configuration of the model for the first time step +!! +!! Module MODD_CST +!! XP00 ! Reference pressure +!! XRD,XRV ! Gaz constant for dry air, vapor +!! XMD,XMV ! Molecular weight for dry air, vapor +!! XCPD ! Cpd (dry air) +!! XCL ! Cl (liquid) +!! XTT ! Triple point temperature +!! XLVTT ! Vaporization heat constant +!! XALPW,XBETAW,XGAMW ! Constants for saturation vapor pressure +!! ! function over liquid water +!! Module MODD_BUDGET: +!! NBUMOD : model in which budget is calculated +!! CBUTYPE : type of desired budget +!! 'CART' for cartesian box configuration +!! 'MASK' for budget zone defined by a mask +!! 'NONE' ' for no budget +!! LBU_RTH : logical for budget of RTH (potential temperature) +!! .TRUE. = budget of RTH +!! .FALSE. = no budget of RTH +!! LBU_RRV : logical for budget of RRV (water vapor) +!! .TRUE. = budget of RRV +!! .FALSE. = no budget of RRV +!! LBU_RRC : logical for budget of RRC (cloud water) +!! .TRUE. = budget of RRC +!! .FALSE. = no budget of RRC +!! LBU_RRR : logical for budget of RRR (rain water) +!! .TRUE. = budget of RRR +!! .FALSE. = no budget of RRR +!! +!! REFERENCE +!! --------- +!! +!! Cohard, J.-M. and J.-P. Pinty, 2000: A comprehensive two-moment warm +!! microphysical bulk scheme. +!! Part I: Description and tests +!! Part II: 2D experiments with a non-hydrostatic model +!! Accepted for publication in Quart. J. Roy. Meteor. Soc. +!! M. Khairoutdinov and Y. Kogan,"A new Cloud Physics Parametererization +!! in a Large-Eddy Simulation Model of Marine Stratocumulus" +!! Mon. Weather Rev.,128, 229-243-2000 +!! +!! AUTHOR +!! ------ +!! J.-M. Cohard * Laboratoire d'Aerologie* +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! O. Geoffroy * CNRM Meteo-France* : 07/2006 +!! +!! MODIFICATIONS +!! ------------- +!! Original 31/12/96 +!! Jean-Pierre PINTY 7/ 7/00 Code cleaning +!! Jean-Pierre PINTY 27/ 5/01 Review of rain transfer to cloud droplets +!! in the case of strong evaporation +!! C.Lac 11/09 Distinction of the TSTEPs +!! C.Lac, V.Masson 09/10 Corrections in sedimentation and +!! evaporation for reproducibility +!! C.Lac 06/14 C2R2_SEDIMENTATION replaced by +!! KHKO_SEDIMENTATION because of instability +!! G.Tanguy 07/14 FUSION C2R2 and KHKO +!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 +!! J.Escobar : 07/10/2015 , Bug in parallel run , => comment test on INUCT>1 containing GET_HALO +!! M.Mazoyer : 04/2016 : Temperature radiative tendency used for +!! activation by cooling (OACTIT : mis en commentaires) +!! M.Mazoyer : 04/2016 : Add supersaturation diagnostics +!! C.Lac : 07/2016 : Add droplet deposition +!! C.Lac : 01/2017 : Correction on droplet deposition +!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 +! P. Wautelet 02/2020: use the new data structures and subroutines for budgets +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +use modd_budget, only: lbudget_th, lbudget_rv, lbudget_rc, lbudget_rr, lbudget_sv, & + NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, NBUDGET_RR, NBUDGET_SV1, & + tbudgets +USE MODD_CH_AEROSOL +USE MODD_CONF +USE MODD_CST +USE MODD_DUST +use modd_field, only: tfielddata, TYPEREAL +USE MODD_IO, ONLY: TFILEDATA +USE MODD_NSV, ONLY : NSV_C2R2BEG +USE MODD_PARAM_C2R2 +USE MODD_PARAMETERS +USE MODD_RAIN_C2R2_DESCR +USE MODD_RAIN_C2R2_KHKO_PARAM +USE MODD_SALT + +use mode_budget, only: Budget_store_init, Budget_store_end +USE MODE_IO_FIELD_WRITE, only: IO_Field_write +USE MODE_ll +use mode_tools, only: Countjv + +USE MODI_GAMMA + +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +! +! +! +CHARACTER(LEN=*), INTENT(IN) :: HCLOUD ! kind of cloud + +LOGICAL, INTENT(IN) :: OACTIT ! Switch to activate the + ! activation by radiative + ! tendency +LOGICAL, INTENT(IN) :: OSEDC ! switch to activate the + ! cloud droplet sedimentation +LOGICAL, INTENT(IN) :: ORAIN ! switch to activate the + ! rain formation by coalescence +INTEGER, INTENT(IN) :: KSPLITR ! Number of small time step + ! integration for rain sedimendation +REAL, INTENT(IN) :: PTSTEP ! Time step :XTSTEP in namelist +INTEGER, INTENT(IN) :: KMI ! Model index +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +! +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHM ! Theta at time t-Dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! Pressure time t-Dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCM ! Cloud water m.r. at time t-Dt +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PW_NU ! updraft velocity used for + ! the nucleation param. +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTHRAD ! THeta RADiative Tendancy +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVS ! Water vapor m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRRS ! Rain water m.r. source +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCNT ! Water vapor C. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCCT ! Cloud water C. at t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCRT ! Rain water C. at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCNS ! Water vapor C. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCCS ! Cloud water C. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCRS ! Rain water C. source +! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRC ! Cloud instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINDEP ! Cloud instant deposition +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRR ! Rain instant precip +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRR3D! Rain inst precip 3D +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEVAP3D! Rain evap profile +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PAEROT ! Aerosol concentration +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSOLORG ![%] solubility fraction of soa +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PMI +CHARACTER(LEN=4), INTENT(IN) :: HACTCCN ! kind of CCN activation scheme +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSUPSAT !sursat +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PNACT !concentrtaion d'aérosols activés au temps t +! +!* 0.2 Declarations of local variables : +! +INTEGER :: JK ! Vertical loop index for the rain sedimentation +INTEGER :: JKBIS ! For spectrum +INTEGER :: JN ! Temporal loop index for the rain sedimentation +INTEGER :: IIB ! Define the domain where is +INTEGER :: IIE ! the microphysical sources have to be computed +INTEGER :: IJB ! +INTEGER :: IJE ! +INTEGER :: IKB ! +INTEGER :: IKE ! +INTEGER :: ISIZE ! +! +REAL :: ZTSPLITR ! Small time step for rain sedimentation +REAL :: ZEPS ! molar mass ratio +! +LOGICAL :: GBU ! General condition prior calling any BUDGET routine +! +! +INTEGER :: ISEDIM, INUCT, & ! Case number of sedimentation, nucleation, + IMICRO, IEVAP, & ! coalescence and rain_evaporation locations + ISELF, IACCR, ISCBU +LOGICAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: GSEDIM ! Test where to compute the SED processes +LOGICAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2)):: GDEP +LOGICAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: GNUCT ! Test where to compute the HEN process +LOGICAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: GMICRO ! Test where to compute coalescence proc. +LOGICAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: GEVAP ! Test where to compute rain_evap. proc. +INTEGER, DIMENSION(:), ALLOCATABLE :: IVEC1 ! Vectors of indices for + ! interpolations +REAL, DIMENSION(:), ALLOCATABLE :: ZVEC1 ! Work vectors for + ! interpolations +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: ZW ! work array +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: ZWSEDR, ZWSEDC, &! sedimentation fluxes + ZZW1LOG, & ! cloud sedimentation speed + ZWSEDLOGR, ZWSEDLOGC ! sedimentation fluxes +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: ZT, ZTM,ZTDT, ZDRC ! Temperature +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: ZZA,ZCHEN +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: ZRVSAT +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: ZLV !latent heat of vaporization +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: ZWLBDR,ZWLBDR3,ZWLBDC,ZWLBDC3, & + ZWLBDA, & !libre parcours moyen + ZRAY, & ! Mean volumic radius + ZCC ! Terminal vertical velocity +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: ZMVRR,ZVRR,ZVCR +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: ZPRCT, ZPCCT, ZPRRT, ZPCRT + ! For split sedimentation +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: ZMVRC !Cloud water mean volumic radius +REAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) & + :: ZPRRS,ZPCRS ! Rain and cloud source for sedim +REAL, DIMENSION(:), ALLOCATABLE :: ZRVT ! Water vapor m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRCT ! Cloud water m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRRT ! Rain water m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZCNT ! nucleus conc. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZCCT ! cloud conc. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZCRT ! rain conc. at t +! +REAL, DIMENSION(:), ALLOCATABLE :: ZRVS ! Water vapor m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRCS ! Cloud water m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRRS ! Rain water m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZCNS ! nucleus conc. source +REAL, DIMENSION(:), ALLOCATABLE :: ZCCS ! cloud conc. source +REAL, DIMENSION(:), ALLOCATABLE :: ZTCC ! Corrective factor for Terminal velocity +REAL, DIMENSION(:), ALLOCATABLE :: ZCRS ! rain conc. source +REAL, DIMENSION(:), ALLOCATABLE :: ZTHS ! Theta source +!------------------------------------------------------------------------------- +! Modification of XCHEN according to theta vertical gradient (J. Rangonio) +!REAL, DIMENSION(:), ALLOCATABLE :: ZCHEN_TMP +!REAL, DIMENSION(:), ALLOCATABLE :: ZCONC_CCN +!------------------------------------------------------------------------------- +! +REAL, DIMENSION(:), ALLOCATABLE :: ZZVRR !terminal velocity for drop concentration +REAL, DIMENSION(:), ALLOCATABLE :: ZZVCR !erminal velocity for rain water +! +LOGICAL, DIMENSION(:), ALLOCATABLE :: GSELF(:), GACCR(:), GSCBU(:) +LOGICAL, DIMENSION(:), ALLOCATABLE :: GENABLE_ACCR_SCBU(:) +REAL, DIMENSION(:), ALLOCATABLE :: & + ZRHODREF, & ! RHO Dry REFerence + ZZT, & ! Temperature + ZTDTBIS, & ! dT/dt + ZEXNREF, & ! EXNer Pressure REFerence + ZZW1, ZZW2, ZZW3, ZZW4, ZZW5, & ! Work array + ZZLV, & ! Latent heat of vaporization at T + ZSMAX, & ! Maximum supersaturation + ZSCBU, & ! optimisation mask + ZLBDC, ZLBDR, & ! Lambda parameter + ZLBDC3, ZLBDR3, & ! Lambda**3 + ZKA, & ! Thermal conductivity of the air + ZDV, & ! Diffusivity of water vapor in the air + ZPABST, ZNCN, ZMCN +REAL, DIMENSION(:), ALLOCATABLE :: ZDG3 +REAL, DIMENSION(:,:), ALLOCATABLE :: ZAERO, ZAEROS, ZSOLORG, ZMI +REAL :: ZFACT, JSV, ZMU, ZALPHA + +REAL, DIMENSION(:), ALLOCATABLE :: ZRTMIN +REAL, DIMENSION(:), ALLOCATABLE :: ZCTMIN +REAL :: ZTMP +TYPE(TFIELDDATA) :: TZFIELD +! +! +! +!------------------------------------------------------------------------------- +! +!* 1. COMPUTE THE SLOPE PARAMETERS ZLBDC,ZLBDR +! ---------------------------------------- +! +CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) +IKB=1+JPVEXT +IKE=SIZE(PZZ,3) - JPVEXT +! +ISIZE = SIZE(XRTMIN) +ISIZE = SIZE(XCTMIN) +ALLOCATE(ZCTMIN(ISIZE)) +ALLOCATE(ZRTMIN(ISIZE)) +ZRTMIN(:) = XRTMIN(:) / PTSTEP +ZCTMIN(:) = XCTMIN(:) / PTSTEP +! +ZWLBDC3(:,:,:) = 1.E30 +ZWLBDC(:,:,:) = 1.E10 +! +WHERE (PRCT(:,:,:)>XRTMIN(2) .AND. PCCT(:,:,:)>XCTMIN(2)) + ZWLBDC3(:,:,:) = XLBC * PCCT(:,:,:) / (PRHODREF(:,:,:) * PRCT(:,:,:)) + ZWLBDC(:,:,:) = ZWLBDC3(:,:,:)**XLBEXC +END WHERE +! +IF (HCLOUD=='C2R2'.OR. HCLOUD=='C3R5' ) THEN + ZWLBDR3(:,:,:) = 1.E30 + ZWLBDR(:,:,:) = 1.E10 + WHERE (PRRT(:,:,:)>XRTMIN(3) .AND. PCRT(:,:,:)>XCTMIN(3)) + ZWLBDR3(:,:,:) = XLBR * PCRT(:,:,:) / (PRHODREF(:,:,:) * PRRT(:,:,:)) + ZWLBDR(:,:,:) = ZWLBDR3(:,:,:)**XLBEXR + END WHERE +ENDIF +! +ZT(:,:,:) = PTHT(:,:,:) * (PPABST(:,:,:)/XP00)**(XRD/XCPD) + +! +!* 2. COMPUTES THE NUCLEATION PROCESS SOURCES +! -------------------------------------- +! +IF ((HACTCCN == 'ABRK').AND.((LORILAM).OR.(LDUST).OR.(LSALT))) THEN + CALL AER_NUCLEATION +ELSE + IF (.NOT. LSUPSAT) THEN + CALL C2R2_KHKO_NUCLEATION + ELSE + ZEPS= XMV / XMD + ZT(:,:,:) = PTHT(:,:,:) * (PPABST(:,:,:)/XP00)**(XRD/XCPD) +! + ZRVSAT(:,:,:) = ZEPS / (PPABST(:,:,:) * & + EXP(-XALPW+XBETAW/ZT(:,:,:)+XGAMW*LOG(ZT(:,:,:))) - 1.0) + ENDIF +ENDIF +! +!------------------------------------------------------------------------------ +! +!* 3. COALESCENCE PROCESSES +! --------------------- +! +IF (ORAIN) THEN +! +! optimization by looking for locations where +! the microphysical fields are larger than a minimal value only !!! +! + IF (HCLOUD=='C2R2'.OR. HCLOUD=='C3R5') THEN + CALL C2R2_COALESCENCE + ELSE ! KHKO + CALL KHKO_COALESCENCE + ENDIF +! +!------------------------------------------------------------------------------- +! +! 4. EVAPORATION OF RAINDROPS +! ------------------------ +! + CALL C2R2_KHKO_EVAPORATION +! +!------------------------------------------------------------------------------- +! +! 5. SPONTANEOUS BREAK-UP (NUMERICAL FILTER) +! -------------------- +! + if ( lbudget_sv ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_c2r2beg + 2), 'BRKU', pcrs(:, :, :) * prhodj(:, :, :) ) + + ZWLBDR(:,:,:) = 1.E10 + WHERE (PRRS(:,:,:)>0.0.AND.PCRS(:,:,:)>0.0 ) + ZWLBDR3(:,:,:) = XLBR * PCRS(:,:,:) / (PRHODREF(:,:,:) * PRRS(:,:,:)) + ZWLBDR(:,:,:) = ZWLBDR3(:,:,:)**XLBEXR + END WHERE + WHERE (ZWLBDR(:,:,:)<(XACCR1/XSPONBUD1)) + PCRS(:,:,:) = PCRS(:,:,:)*MAX((1.+XSPONCOEF2*(XACCR1/ZWLBDR(:,:,:)-XSPONBUD1)**2),& + (XACCR1/ZWLBDR(:,:,:)/XSPONBUD3)**3) + END WHERE + + if ( lbudget_sv ) call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_c2r2beg + 2), 'BRKU', pcrs(:, :, :) * prhodj(:, :, :) ) +ENDIF +!------------------------------------------------------------------------------- +!* 6. COMPUTE THE SEDIMENTATION (RS) SOURCE +! ------------------------------------- +! +!* 6.1 Calculation of the mean volumic radius (ZRAY) and +! the terminal vertical velocity ZCC for precipitating clouds +! +ZTSPLITR = PTSTEP / REAL(KSPLITR) ! Small time step +! +! +!* 6.2 compute the sedimentation velocities for rain +! -------------------------------------------- +! +ZMVRR(:,:,:) = 0. +ZVRR(:,:,:) = 0. +ZVCR(:,:,:) = 0. +WHERE (PCRT(:,:,:) > XCTMIN(3) .and. PRRT(:,:,:)>XRTMIN(3) ) + ZMVRR(:,:,:) = ((3. * PRHODREF(:,:,:)*PRRT(:,:,:))/ & + (4. * XPI *XRHOLW*PCRT(:,:,:)))**0.333 ! in m + ZVRR(:,:,:) = 0.012 * 1.0E6 * ZMVRR(:,:,:) - 0.2 ! velocity for mixing ratio + ZVCR(:,:,:) = 0.007 * 1.0E6 * ZMVRR(:,:,:) - 0.1 ! velocity for concentration +END WHERE +WHERE (ZVRR(:,:,:) .lt. 0.0 .OR. ZVCR(:,:,:) .lt. 0.0) + ZVRR(:,:,:) = 0.0 + ZVCR(:,:,:) = 0.0 +END WHERE +! +CALL C2R2_KHKO_SEDIMENTATION +! +DEALLOCATE(ZRTMIN) +DEALLOCATE(ZCTMIN) +! +!------------------------------------------------------------------------------ +! + + +!------------------------------------------------------------------------------ +CONTAINS +!------------------------------------------------------------------------------- +! + SUBROUTINE C2R2_KHKO_NUCLEATION +! +!* 0. DECLARATIONS +! ------------ +!JUAN +USE MODI_GET_HALO +! +IMPLICIT NONE +! +!* 0.2 declaration of local variables +! +REAL, DIMENSION(:), ALLOCATABLE :: ZTCELSIUS +INTEGER , DIMENSION(SIZE(GNUCT)) :: I1,I2,I3 ! Used to replace the COUNT +INTEGER :: JL ! and PACK intrinsics +INTEGER :: J1 +! +!------------------------------------------------------------------------------- + +if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'HENU', pths(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_rv ) call Budget_store_init( tbudgets(NBUDGET_RV), 'HENU', prvs(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'HENU', prcs(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_sv ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_c2r2beg ), 'HENU', pcns(:, :, :) * prhodj(:, :, :) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_c2r2beg + 1), 'HENU', pccs(:, :, :) * prhodj(:, :, :) ) +end if + +! Modification of XCHEN according to theta vertical gradient (J. Rangonio) +!ZZA(:,:,2) = 1. +!DO JK=IKB,IKE-1 +! WHERE (PZZ(:,:,JK+1) >= XAERHEIGHT) +! ZZA(:,:,JK+1) = ZZA(:,:,JK) +! ELSEWHERE +! ZZA(:,:,JK+1) = ZZA(:,:,JK)* & +! EXP(MIN(0.,-XAERDIFF*(PTHT(:,:,JK+1)-PTHT(:,:,JK))/(PZZ(:,:,JK+1)-PZZ(:,:,JK)))) +! END WHERE +! ZCHEN(:,:,JK) = XCHEN*ZZA(:,:,JK) +!END DO +!ZCHEN(:,:,IKE) = ZCHEN(:,:,IKE-1) +!! +!! +! IF ( tpfile%lopened ) THEN +! TZFIELD%CMNHNAME = 'ZCHEN' +! TZFIELD%CSTDNAME = '' +! TZFIELD%CLONGNAME = 'ZCHEN' +! TZFIELD%CUNITS = '' +! TZFIELD%CDIR = 'XY' +! TZFIELD%CCOMMENT = 'X_Y_Z_ZCHEN' +! TZFIELD%NGRID = 1 +! TZFIELD%NTYPE = TYPEREAL +! TZFIELD%NDIMS = 3 +! TZFIELD%LTIMEDEP = .TRUE. +! CALL IO_Field_write(TPFILE,TZFIELD,ZCHEN) +! END IF +! +!------------------------------------------------------------------------------- +! +! compute the saturation vapor mixing ratio and +! the radiative tendency and +! the latent heat of vaporization Lv(T) and +! the specific heat for moist air Cph +! +ZEPS= XMV / XMD +ZRVSAT(:,:,:) = ZEPS / (PPABST(:,:,:) * & + EXP(-XALPW+XBETAW/ZT(:,:,:)+XGAMW*ALOG(ZT(:,:,:))) - 1.0) +ZZW1LOG(:,:,:)= 0. ! supersaturation +ZTDT(:,:,:) = 0. +ZDRC(:,:,:) = 0. +IF (OACTIT) THEN + ZTM(:,:,:) = PTHM(:,:,:) * (PPABSM(:,:,:)/XP00)**(XRD/XCPD) + ZTDT(:,:,:) = (ZT(:,:,:)-ZTM(:,:,:))/PTSTEP ! dT/dt + ZDRC(:,:,:) = (PRCT(:,:,:)-PRCM(:,:,:))/PTSTEP ! drc/dt +! Modif M.Mazoyer +! ZTDT(:,:,:) = PDTHRAD(:,:,:)*(PPABST(:,:,:)/XP00)**(XRD/XCPD) +END IF +! +! optimization by looking for locations where +! the updraft velocity is positive!!! +! +GNUCT(:,:,:) = .FALSE. +IF( OACTIT ) THEN + GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) = (PW_NU(IIB:IIE,IJB:IJE,IKB:IKE)>XWMIN .OR. & + ZTDT(IIB:IIE,IJB:IJE,IKB:IKE)<XTMIN) .AND. & + PRVT(IIB:IIE,IJB:IJE,IKB:IKE)>(0.98*ZRVSAT(IIB:IIE,IJB:IJE,IKB:IKE)) +ELSE + GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) = PW_NU(IIB:IIE,IJB:IJE,IKB:IKE)>XWMIN .AND. & + PRVT(IIB:IIE,IJB:IJE,IKB:IKE)>(0.98*ZRVSAT(IIB:IIE,IJB:IJE,IKB:IKE)) +END IF +INUCT = COUNTJV( GNUCT(:,:,:),I1(:),I2(:),I3(:)) + +! IF( INUCT >= 1 ) THEN + ALLOCATE(ZRVT(INUCT)) + ALLOCATE(ZRCT(INUCT)) + ALLOCATE(ZRRT(INUCT)) + ALLOCATE(ZCNS(INUCT)) + ALLOCATE(ZCCS(INUCT)) + ALLOCATE(ZZT(INUCT)) + ALLOCATE(ZTDTBIS(INUCT)) + ALLOCATE(ZZW1(INUCT)) + ALLOCATE(ZZW2(INUCT)) + ALLOCATE(ZZW3(INUCT)) + ALLOCATE(ZZW4(INUCT)) + ALLOCATE(ZZW5(INUCT)) + ALLOCATE(ZVEC1(INUCT)) + ALLOCATE(IVEC1(INUCT)) + ALLOCATE(ZRHODREF(INUCT)) + ALLOCATE(ZEXNREF(INUCT)) +!------------------------------------------------------------------------------- +! Modification of XCHEN according to theta vertical gradient (J. Rangonio) +! ALLOCATE(ZCHEN_TMP(INUCT)) +! ALLOCATE(ZCONC_CCN(INUCT)) +!------------------------------------------------------------------------------- + DO JL=1,INUCT + ZRVT(JL) = PRVT(I1(JL),I2(JL),I3(JL)) + ZRCT(JL) = PRCT(I1(JL),I2(JL),I3(JL)) + ZRRT(JL) = PRRT(I1(JL),I2(JL),I3(JL)) + ZCNS(JL) = PCNS(I1(JL),I2(JL),I3(JL)) + ZCCS(JL) = PCCS(I1(JL),I2(JL),I3(JL)) + ZZT(JL) = ZT(I1(JL),I2(JL),I3(JL)) + ZZW1(JL) = ZRVSAT(I1(JL),I2(JL),I3(JL)) + ZZW2(JL) = PW_NU(I1(JL),I2(JL),I3(JL)) + ZTDTBIS(JL) = ZTDT(I1(JL),I2(JL),I3(JL)) + ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) + ZEXNREF(JL) = PEXNREF(I1(JL),I2(JL),I3(JL)) +!------------------------------------------------------------------------------- +! Modification of XCHEN according to theta vertical gradient (J. Rangonio) +! ZCHEN_TMP(JL)= ZCHEN(I1(JL),I2(JL),I3(JL)) +!------------------------------------------------------------------------------- + + ENDDO +!------------------------------------------------------------------------------- +! Modification of XCHEN according to theta vertical gradient (J. Rangonio) +! ZCONC_CCN(:)=XCONC_CCN*ZCHEN_TMP(:)/XCHEN +!------------------------------------------------------------------------------- + ZZW1(:) = 1.0/ZEPS + 1.0/ZZW1(:) & + + (((XLVTT+(XCPV-XCL)*(ZZT(:)-XTT))/ZZT(:))**2)/(XCPD*XRV) ! Psi2 +! +!* 3.1 compute the heterogeneous nucleation source: RVHENC, CVHENC +! +!* 3.1.1 compute the constant term (ZZW3) +! + ZVEC1(:) = MAX( 1.00001, MIN( REAL(NAHEN)-0.00001, & + XAHENINTP1 * ZZT(:) + XAHENINTP2 ) ) + IVEC1(:) = INT( ZVEC1(:) ) + ZVEC1(:) = ZVEC1(:) - REAL( IVEC1(:) ) + ALLOCATE(ZSMAX(INUCT)) +! +! + IF( HPARAM_CCN == 'TFH' ) THEN + ZZW2(:) = 100.*ZZW2(:) ! FH is in CGS units + ALLOCATE(ZTCELSIUS(INUCT)); ZTCELSIUS(:) = ZZT(:) - XTT + ZZW3(:) = XAHENF( IVEC1(:)+1 )* ZVEC1(:) & + - XAHENF( IVEC1(:) )*(ZVEC1(:) - 1.0) ! Cste*(Psi1/Gr) + ZZW3(:) = ZZW3(:)/ZZW2(:)**(XWCOEF_F1+ZTCELSIUS(:)* & + (XWCOEF_F2+XWCOEF_F3*ZTCELSIUS(:))) + ZZW3(:) = (ZZW3(:)/ZZW1(:)) * ZZW2(:) * ZRHODREF(:) ! R.H.S. of + ! Eq. (12) in FH92 +! +!* 3.1.1.1 compute the maximum fo supersaturation +! + ZSMAX(:) = ZZW3(:)**(1.0/(XKHEN+1.0)) ! first estimate (y_bar=0) +! +! 4 iterations to estimate S_max for the TFH parameterization +! + ZZW1(:) = XAHENY( IVEC1(:)+1 )* ZVEC1(:) & + - XAHENY( IVEC1(:) )*(ZVEC1(:) - 1.0) ! y_bar + ZZW1(:) = ZZW1(:)*ZZW2(:)** (XWCOEF_Y1+ZTCELSIUS(:)* & + (XWCOEF_Y2+XWCOEF_Y3*ZTCELSIUS(:))) + DO J1 = 1,4 + ZSMAX(:) = (ZZW1(:)*ZSMAX(:)**XKHEN + ZSMAX(:))**(1.0/(XKHEN+1.0)) + END DO + DEALLOCATE(ZTCELSIUS) + ZZW3(:) = 1.0 + ELSE + IF (OACTIT) THEN + ZZW4(:)=XPSI1( IVEC1(:)+1)*ZZW2(:)+XPSI3(IVEC1(:)+1)*ZTDTBIS(:) + ZZW5(:)=XPSI1( IVEC1(:))*ZZW2(:)+XPSI3(IVEC1(:))*ZTDTBIS(:) +! Modif M.Mazoyer +! ZZW4(:) =0.0 +! ZZW5(:) =0.0 +! WHERE (ZZW2(:)>= XWMIN .AND. ZTDTBIS(:) < XTMIN ) +! ZZW4(:)=XPSI1( IVEC1(:)+1)*ZZW2(:)+XPSI3(IVEC1(:)+1)*ZTDTBIS(:) +! ZZW5(:)=XPSI1( IVEC1(:))*ZZW2(:)+XPSI3(IVEC1(:))*ZTDTBIS(:) +! ELSEWHERE (ZZW2(:)< XWMIN .AND. ZTDTBIS(:) < XTMIN ) +! ZZW4(:)=XPSI3(IVEC1(:)+1)*ZTDTBIS(:) +! ZZW5(:)=XPSI3(IVEC1(:))*ZTDTBIS(:) +! ELSEWHERE (ZZW2(:)< XWMIN .AND. ZTDTBIS(:) >= XTMIN ) +! ZZW4(:)=0.0 +! ZZW5(:)=0.0 +! ELSEWHERE (ZZW2(:)>= XWMIN .AND. ZTDTBIS(:) >= XTMIN ) +! ZZW4(:)=XPSI1( IVEC1(:)+1)*ZZW2(:) +! ZZW5(:)=XPSI1( IVEC1(:))*ZZW2(:) +! END WHERE + WHERE (ZZW4(:) < 0. .OR. ZZW5(:) < 0.) + ZZW4(:) = 0. + ZZW5(:) = 0. + END WHERE + ZZW3(:) = XCHEN*XAHENG(IVEC1(:)+1)*(ZZW4(:)**1.5)*ZVEC1(:)/XCHEN & + - XCHEN*XAHENG( IVEC1(:))*(ZZW5(:)**1.5)*(ZVEC1(:) - 1.0)/XCHEN + ! Cste*((Psi1*w+Psi3*dT/dt)/(G))**1.5 +!------------------------------------------------------------------------------- +! Modification of XCHEN according to theta vertical gradient (J. Rangonio) +! ZZW3(:) = XCHEN*XAHENG(IVEC1(:)+1)*(ZZW4(:)**1.5)*ZVEC1(:)/ZCHEN_TMP(:) & +! - XCHEN*XAHENG( IVEC1(:))*(ZZW5(:)**1.5)*(ZVEC1(:) - 1.0)/ZCHEN_TMP(:) +! ! Cste*((Psi1*w+Psi3*dT/dt)/(G))**1.5 +!------------------------------------------------------------------------------- + ELSE + ZZW3(:) = XAHENG( IVEC1(:)+1)*((XPSI1( IVEC1(:)+1)*ZZW2(:))**1.5)* ZVEC1(:) & + - XAHENG( IVEC1(:))*((XPSI1(IVEC1(:))*ZZW2(:))**1.5)*(ZVEC1(:) - 1.0) + END IF + ZZW5(:) = 1. + ZZW3(:) = (ZZW3(:)/ZZW1(:))*ZRHODREF(:) ! R.H.S. of + ! Eq 9 of CPB 98 + WHERE (ZZW3(:) == 0.) + ZZW5(:)= -1. + END WHERE +! +!* 3.1.2.1 compute the maximum fo supersaturation +! + ZSMAX(:) = ZZW3(:)**(1.0/(XKHEN+2.0)) ! Smax has no unit +! +! 4 iterations to estimate S_max for the CPB98 parameterization +! + IF( HPARAM_CCN == 'CPB' ) THEN + DO J1 = 1,4 + WHERE (ZZW5(:) > 0.) + ZVEC1(:) = MAX( 1.00001, MIN( REAL(NHYP)-0.00001, & + XHYPINTP1*LOG(ZSMAX(:))+XHYPINTP2 ) ) + IVEC1(:) = INT( ZVEC1(:) ) + ZVEC1(:) = ZVEC1(:) - REAL( IVEC1(:) ) + ZZW2(:) = XHYPF32( IVEC1(:)+1 )* ZVEC1(:) & + - XHYPF32( IVEC1(:) )*(ZVEC1(:) - 1.0) + ZSMAX(:) = (ZZW3(:)/ZZW2(:))**(1.0/(XKHEN+2.0)) + ELSEWHERE + ZSMAX(:)=0. + END WHERE + END DO +! +!* 3.2 compute the nucleus source +! +! ZSMAX(:) is used in percent in the nucleation formula +! + ZZW3(:) = XHYPF12( IVEC1(:)+1 )* ZVEC1(:) & + - XHYPF12( IVEC1(:) )*(ZVEC1(:) - 1.0) + ELSE + ZZW3(:) = 1.0 + END IF + END IF + ZZW1LOG(:,:,:) = UNPACK( 100*ZSMAX(:),MASK=GNUCT(:,:,:),FIELD=0.0 ) + PSUPSAT(:,:,:) = 0.0 + PSUPSAT(:,:,:) = ZZW1LOG(:,:,:) +! +! the CCN spectra formula uses ZSMAX in percent +! + IF (XCONC_CCN > 0) THEN + ZZW1(:) = MIN( XCONC_CCN,XCHEN * (100.0*ZSMAX(:))**XKHEN * ZZW3(:) ) / PTSTEP + ELSE + ZZW1(:) = XCHEN * (100.0*ZSMAX(:))**XKHEN * ZZW3(:) / PTSTEP + ENDIF +!------------------------------------------------------------------------------- +! Modification of XCHEN according to theta vertical gradient (J. Rangonio) +! IF (XCONC_CCN > 0.) THEN +! ZZW1(:) = MIN( ZCONC_CCN(:),ZCHEN_TMP(:) * (100.0*ZSMAX(:))**XKHEN * ZZW3(:) ) / PTSTEP +! ELSE +! ZZW1(:) = ZCHEN_TMP(:) * (100.0*ZSMAX(:))**XKHEN * ZZW3(:) / PTSTEP +! ENDIF +!------------------------------------------------------------------------------- + ZW(:,:,:) = PCNS(:,:,:) + PCNS(:,:,:) = UNPACK( MAX( ZZW1(:),ZCNS(:) ),MASK=GNUCT(:,:,:), & + FIELD=ZW(:,:,:) ) +! + DEALLOCATE(IVEC1) + DEALLOCATE(ZVEC1) +! +!* 3.3 compute the cloud water concentration and mixing ratio sources +! + ZZW2(:) = MAX( (ZZW1(:)-ZCNS(:)),0.0 ) + + PNACT(:,:,:) = 0.0 + PNACT(:,:,:) = UNPACK(ZZW2(:)*PTSTEP,MASK=GNUCT(:,:,:),FIELD=0.) + + ZZW1(:)=0. + WHERE (ZZW5(:) > 0.) + ZZW1(:) = MIN( XCSTDCRIT * ZZW2(:) / ( ((ZZT(:)*ZSMAX(:))**3.)*ZRHODREF(:) ),& + 1.E-5 ) + END WHERE + CALL GET_HALO(PRVS) + ZW(:,:,:) = MIN( UNPACK( ZZW1(:),MASK=GNUCT(:,:,:),FIELD=0.0 ),PRVS(:,:,:) ) +! + PRVS(:,:,:) = PRVS(:,:,:) - ZW(:,:,:) + PRCS(:,:,:) = PRCS(:,:,:) + ZW(:,:,:) + ZW(:,:,:) = ZW(:,:,:)*(XLVTT+(XCPV-XCL)*(ZT(:,:,:)-XTT))/ & + (PEXNREF(:,:,:)*( XCPD+XCPV*PRVT(:,:,:)+XCL*(PRCT(:,:,:)+PRRT(:,:,:)))) + PTHS(:,:,:) = PTHS(:,:,:) + ZW(:,:,:) +!JUAN + CALL GET_HALO(PTHS) + CALL GET_HALO(PRCS) +! + ZW(:,:,:) = PCCS(:,:,:) + PCCS(:,:,:) = UNPACK( ZZW2(:)+ZCCS(:),MASK=GNUCT(:,:,:),FIELD=ZW(:,:,:) ) +! +! + DEALLOCATE(ZRVT) + DEALLOCATE(ZRCT) + DEALLOCATE(ZRRT) + DEALLOCATE(ZCNS) + DEALLOCATE(ZCCS) + DEALLOCATE(ZZT) + DEALLOCATE(ZSMAX) + DEALLOCATE(ZZW1) + DEALLOCATE(ZZW2) + DEALLOCATE(ZZW3) + DEALLOCATE(ZZW4) + DEALLOCATE(ZZW5) + DEALLOCATE(ZTDTBIS) + DEALLOCATE(ZRHODREF) + DEALLOCATE(ZEXNREF) +!------------------------------------------------------------------------------- +! Modification of XCHEN according to theta vertical gradient (J. Rangonio) +! DEALLOCATE(ZCHEN_TMP) +! DEALLOCATE(ZCONC_CCN) +!------------------------------------------------------------------------------- +! END IF +! +IF ( tpfile%lopened ) THEN + TZFIELD%CMNHNAME = 'SMAX' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'SMAX' + TZFIELD%CUNITS = '1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_SMAX' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZZW1LOG) +END IF +! +!* 3.4 budget storage +! +if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'HENU', pths(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_rv ) call Budget_store_end( tbudgets(NBUDGET_RV), 'HENU', prvs(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'HENU', prcs(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_sv ) then + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_c2r2beg ), 'HENU', pcns(:, :, :) * prhodj(:, :, :) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_c2r2beg + 1), 'HENU', pccs(:, :, :) * prhodj(:, :, :) ) +end if + +END SUBROUTINE C2R2_KHKO_NUCLEATION +! +!------------------------------------------------------------------------------- +! + SUBROUTINE AER_NUCLEATION +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_NSV +USE MODE_AERO_PSD +USE MODI_CH_AER_ACTIVATION + +IMPLICIT NONE +! +!* 0.2 declaration of local variables +! +REAL, DIMENSION(:), ALLOCATABLE :: ZTCELSIUS +INTEGER , DIMENSION(SIZE(GNUCT)) :: I1,I2,I3 ! Used to replace the COUNT +INTEGER :: JL ! and PACK intrinsics +INTEGER :: J1 +INTEGER :: JSV +! +!------------------------------------------------------------------------------- + +if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'HENU', pths(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_rv ) call Budget_store_init( tbudgets(NBUDGET_RV), 'HENU', prvs(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'HENU', prcs(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_sv ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_c2r2beg ), 'HENU', pcns(:, :, :) * prhodj(:, :, :) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_c2r2beg + 1), 'HENU', pccs(:, :, :) * prhodj(:, :, :) ) +end if +! +! compute the saturation vapor mixing ratio +! the radiative tendency +! +ZEPS= XMV / XMD +! +! +ZRVSAT(:,:,:) = ZEPS / (PPABST(:,:,:) * & + EXP(-XALPW+XBETAW/ZT(:,:,:)+XGAMW*ALOG(ZT(:,:,:))) - 1.0) +ZZW1LOG(:,:,:)= 0. ! supersaturation +ZTDT(:,:,:) = 0. +ZDRC(:,:,:) = 0. +IF (OACTIT) THEN + ZTM(:,:,:) = PTHM(:,:,:) * (PPABSM(:,:,:)/XP00)**(XRD/XCPD) + ZTDT(:,:,:) = (ZT(:,:,:)-ZTM(:,:,:))/PTSTEP ! dT/dt + ZDRC(:,:,:) = (PRCT(:,:,:)-PRCM(:,:,:))/PTSTEP ! drc/dt + ZTDT(:,:,:) = MIN(0.,ZTDT(:,:,:)+(XG*PW_NU(:,:,:))/XCPD- & + (XLVTT+(XCPV-XCL)*(ZT(:,:,:)-XTT))*ZDRC(:,:,:)/XCPD) +! Modif M.Mazoyer +! ZTDT(:,:,:) = PDTHRAD(:,:,:)*(PPABST(:,:,:)/XP00)**(XRD/XCPD) +END IF +! +! optimization by looking for locations where +! the updraft velocity is positive!!! +! +GNUCT(:,:,:) = .FALSE. +IF( OACTIT ) THEN + GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) = (PW_NU(IIB:IIE,IJB:IJE,IKB:IKE)>XWMIN .OR. & + ZTDT(IIB:IIE,IJB:IJE,IKB:IKE)<XTMIN) .AND. & + PRVT(IIB:IIE,IJB:IJE,IKB:IKE)>(0.98*ZRVSAT(IIB:IIE,IJB:IJE,IKB:IKE)) +ELSE + GNUCT(IIB:IIE,IJB:IJE,IKB:IKE) = PW_NU(IIB:IIE,IJB:IJE,IKB:IKE)>XWMIN .AND. & + PRVT(IIB:IIE,IJB:IJE,IKB:IKE)>(0.98*ZRVSAT(IIB:IIE,IJB:IJE,IKB:IKE)) +END IF +! +INUCT = COUNTJV(GNUCT(:,:,:),I1(:),I2(:),I3(:)) + +IF( INUCT >= 1 ) THEN + ALLOCATE(ZRVT(INUCT)) + ALLOCATE(ZRCT(INUCT)) + ALLOCATE(ZRRT(INUCT)) + ALLOCATE(ZZT(INUCT)) + ALLOCATE(ZTDTBIS(INUCT)) + ALLOCATE(ZZW1(INUCT)) + ALLOCATE(ZZW2(INUCT)) + ALLOCATE(ZZW3(INUCT)) + ALLOCATE(ZZW4(INUCT)) + ALLOCATE(ZZW5(INUCT)) + ALLOCATE(ZDG3(INUCT)) + ALLOCATE(ZCCS(INUCT)) + ALLOCATE(ZCNS(INUCT)) + ALLOCATE(ZRHODREF(INUCT)) + ALLOCATE(ZEXNREF(INUCT)) + ALLOCATE(ZPABST(INUCT)) + ALLOCATE(ZNCN(INUCT)) + ALLOCATE(ZMCN(INUCT)) + ALLOCATE(ZSMAX(INUCT)) + ALLOCATE(ZAERO(INUCT,SIZE(PAEROT,4))) + ALLOCATE(ZSOLORG(INUCT,SIZE(PSOLORG,4))) + ALLOCATE(ZMI(INUCT,SIZE(PMI,4))) + ALLOCATE(ZLBDC3(INUCT)) + + DO JL=1,INUCT + ZRVT(JL) = PRVT(I1(JL),I2(JL),I3(JL)) + ZRCT(JL) = PRCT(I1(JL),I2(JL),I3(JL)) + ZRRT(JL) = PRRT(I1(JL),I2(JL),I3(JL)) + ZCCS(JL) = PCCS(I1(JL),I2(JL),I3(JL)) + ZCNS(JL) = PCNS(I1(JL),I2(JL),I3(JL)) + ZZT(JL) = ZT(I1(JL),I2(JL),I3(JL)) + ZZW1(JL) = ZRVSAT(I1(JL),I2(JL),I3(JL)) + ZZW2(JL) = PW_NU(I1(JL),I2(JL),I3(JL)) + ZTDTBIS(JL) = ZTDT(I1(JL),I2(JL),I3(JL)) + ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) + ZEXNREF(JL) = PEXNREF(I1(JL),I2(JL),I3(JL)) + ZPABST(JL) = PPABST(I1(JL),I2(JL),I3(JL)) + ZAERO(JL,:) = PAEROT(I1(JL),I2(JL),I3(JL),:) + ZLBDC3(JL) = ZWLBDC3(I1(JL),I2(JL),I3(JL)) + + ENDDO +! + ZSMAX(:) = 0. + IF (LORILAM) THEN + DO JL=1,INUCT + ZSOLORG(JL,:) = PSOLORG(I1(JL),I2(JL),I3(JL),:) + ZMI(JL,:) = PMI(I1(JL),I2(JL),I3(JL),:) + ENDDO + ELSE + ZSOLORG(:,:) = 0. + ZMI(:,:) = 0. + END IF + + CALL CH_AER_ACTIVATION(ZAERO, ZZT, ZZW2, ZTDTBIS, ZRHODREF, ZPABST,& + ZNCN, ZMCN, ZSOLORG, ZMI, ZSMAX) + +! Nb de goutelettes activées + +!test + ZZW1(:) = MAX(ZNCN(:)/PTSTEP - ZCNS(:), 0.) +! + ZW(:,:,:) = UNPACK( ZZW1(:),MASK=GNUCT(:,:,:),FIELD=0.0 ) + PCNS(:,:,:) = PCNS(:,:,:) + ZW(:,:,:) +! +! Modification reservoir eau (gaz et liquide) +! +! valeur de petites goutelettes type brouillard (test) +! ZALPHA=0.8 +! ZMU=3. +! ZDG3(:) = 1./ZLBDC3(:) * GAMMA(ZMU + 3./ZALPHA) / GAMMA(ZMU) ! integrated cubic diameter +! ZZW2(:) = ZZW1(:) + ZCCS(:) +! ZZW1(:) = XPI/6. * ZDG3(:)**3 * (ZZW1(:)) * 1000. / ZRHODREF(:) +! ! +! ZW(:,:,:) = MIN( UNPACK( ZZW1(:),MASK=GNUCT(:,:,:),FIELD=0.0 ),PRVS(:,:,:) ) +! ! +! +! PRVS(:,:,:) = PRVS(:,:,:) - ZW(:,:,:) +! PRCS(:,:,:) = PRCS(:,:,:) + ZW(:,:,:) +! ! +! ! Modification temperature (diabatisme) +! ZZW1(:) = ZZW1(:)*(XLVTT+(XCPV-XCL)*(ZZT(:)-XTT))/ & +! (ZEXNREF(:)*( XCPD+XCPV*ZRVT(:)+XCL*(ZRCT(:)+ZRRT(:)))) +! ! +! ZW(:,:,:) = MIN( UNPACK( ZZW1(:),MASK=GNUCT(:,:,:),FIELD=0.0 ),PRVS(:,:,:) ) +! ! +! PTHS(:,:,:) = PTHS(:,:,:) + ZW(:,:,:) +! ! +! ! Modification gouttes nuages +! ZW(:,:,:) = PCCS(:,:,:) +! PCCS(:,:,:) = UNPACK(ZZW2(:),MASK=GNUCT(:,:,:),FIELD=ZW(:,:,:)) + ZZW2(:) = MAX(ZNCN(:)/PTSTEP - ZCNS(:), 0.) + ZZW1(:)=0. + WHERE(ZZW2(:).gt.0.0) + ZZW1(:)=MIN(XCSTDCRIT * ZZW2(:) / ( ((ZZT(:)*ZSMAX(:))**3.)& + *ZRHODREF(:) ) , 1.E-5 ) + END WHERE + ZW(:,:,:) = MIN( UNPACK( ZZW1(:),MASK=GNUCT(:,:,:),FIELD=0.0 ),PRVS(:,:,:) ) + PRVS(:,:,:) = PRVS(:,:,:) - ZW(:,:,:) + PRCS(:,:,:) = PRCS(:,:,:) + ZW(:,:,:) +! + DEALLOCATE(ZRVT) + DEALLOCATE(ZRCT) + DEALLOCATE(ZRRT) + DEALLOCATE(ZZT) + DEALLOCATE(ZTDTBIS) + DEALLOCATE(ZZW1) + DEALLOCATE(ZZW2) + DEALLOCATE(ZZW3) + DEALLOCATE(ZZW4) + DEALLOCATE(ZZW5) + DEALLOCATE(ZDG3) + DEALLOCATE(ZCCS) + DEALLOCATE(ZCNS) + DEALLOCATE(ZRHODREF) + DEALLOCATE(ZEXNREF) + DEALLOCATE(ZPABST) + DEALLOCATE(ZNCN) + DEALLOCATE(ZMCN) + DEALLOCATE(ZAERO) + DEALLOCATE(ZSMAX) + DEALLOCATE(ZSOLORG) + DEALLOCATE(ZMI) + DEALLOCATE(ZLBDC3) + +END IF +! +! +!* budget storage +! +! +if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'HENU', pths(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_rv ) call Budget_store_end( tbudgets(NBUDGET_RV), 'HENU', prvs(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'HENU', prcs(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_sv ) then + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_c2r2beg ), 'HENU', pcns(:, :, :) * prhodj(:, :, :) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_c2r2beg + 1), 'HENU', pccs(:, :, :) * prhodj(:, :, :) ) +end if + + END SUBROUTINE AER_NUCLEATION +! +!------------------------------------------------------------------------------- +! + SUBROUTINE C2R2_COALESCENCE +! +! +! ------------ +! +IMPLICIT NONE +! +!* 0.2 declaration of local variables +! +INTEGER , DIMENSION(SIZE(GNUCT)) :: I1,I2,I3 ! Used to replace the COUNT +INTEGER :: JL ! and PACK intrinsics +! +!------------------------------------------------------------------------------- +! +! +GMICRO(:,:,:) = .FALSE. +GMICRO(IIB:IIE,IJB:IJE,IKB:IKE) = & + PRCT(IIB:IIE,IJB:IJE,IKB:IKE)>XRTMIN(2) .OR. & + PRRT(IIB:IIE,IJB:IJE,IKB:IKE)>XRTMIN(3) +IMICRO = COUNTJV( GMICRO(:,:,:),I1(:),I2(:),I3(:)) +IF( IMICRO >= 1 ) THEN + ALLOCATE(ZRCT(IMICRO)) + ALLOCATE(ZRRT(IMICRO)) + ALLOCATE(ZCCT(IMICRO)) + ALLOCATE(ZCRT(IMICRO)) +! + ALLOCATE(ZRCS(IMICRO)) + ALLOCATE(ZRRS(IMICRO)) + ALLOCATE(ZCCS(IMICRO)) + ALLOCATE(ZCRS(IMICRO)) +! + ALLOCATE(ZLBDC(IMICRO)) + ALLOCATE(ZLBDC3(IMICRO)) + ALLOCATE(ZLBDR(IMICRO)) + ALLOCATE(ZLBDR3(IMICRO)) +! + ALLOCATE(ZRHODREF(IMICRO)) +! + DO JL=1,IMICRO + ZCCT(JL) = PCCT(I1(JL),I2(JL),I3(JL)) + ZRCT(JL) = PRCT(I1(JL),I2(JL),I3(JL)) + ZRRT(JL) = PRRT(I1(JL),I2(JL),I3(JL)) + ZCRT(JL) = PCRT(I1(JL),I2(JL),I3(JL)) + ZCCS(JL) = PCCS(I1(JL),I2(JL),I3(JL)) + ZRCS(JL) = PRCS(I1(JL),I2(JL),I3(JL)) + ZRRS(JL) = PRRS(I1(JL),I2(JL),I3(JL)) + ZCRS(JL) = PCRS(I1(JL),I2(JL),I3(JL)) + ZLBDR(JL) = ZWLBDR(I1(JL),I2(JL),I3(JL)) + ZLBDR3(JL) = ZWLBDR3(I1(JL),I2(JL),I3(JL)) + ZLBDC(JL) = ZWLBDC(I1(JL),I2(JL),I3(JL)) + ZLBDC3(JL) = ZWLBDC3(I1(JL),I2(JL),I3(JL)) + ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) + END DO +! + ALLOCATE(GSELF(IMICRO)) + ALLOCATE(GACCR(IMICRO)) + ALLOCATE(GSCBU(IMICRO)) + ALLOCATE(ZZW1(IMICRO)) + ALLOCATE(ZZW2(IMICRO)) + ALLOCATE(ZZW3(IMICRO)) +! +!* 4.1 Self-collection of cloud droplets +! + if ( lbudget_sv ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_c2r2beg + 1), 'SELF', pccs(:, :, :) * prhodj(:, :, :) ) + + GSELF(:) = ZCCT(:)>XCTMIN(2) + ISELF = COUNT(GSELF(:)) + IF( ISELF>0 ) THEN + ZZW1(:) = XSELFC*(ZCCT(:)/ZLBDC3(:))**2 ! analytical integration + WHERE( GSELF(:) ) + ZCCS(:) = ZCCS(:) - MIN( ZCCS(:),ZZW1(:) ) + END WHERE + END IF + + if ( lbudget_sv ) call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_c2r2beg + 1), 'SELF', & + Unpack( zccs(:), mask = gmicro(:, :, :), field = pccs(:, :, :) ) * prhodj(:, :, :) ) +! +!* 4.2 Autoconversion of cloud droplets +! using a Berry-Reinhardt parameterization +! + if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'AUTO', prcs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RR), 'AUTO', prrs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_sv ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_c2r2beg + 2), 'AUTO', pcrs(:, :, :) * prhodj(:, :, :) ) + + ZZW2(:) = 0.0 + ZZW1(:) = 0.0 + WHERE( ZRCT(:)>XRTMIN(2) ) + ZZW2(:) = MAX( 0.0,XLAUTR*ZRHODREF(:)*ZRCT(:)* & + (XAUTO1/ZLBDC(:)**4-XLAUTR_THRESHOLD) ) ! L +! + ZZW3(:) = MIN( ZRCS(:), MAX( 0.0,XITAUTR*ZZW2(:)*ZRCT(:)* & + (XAUTO2/ZLBDC(:)-XITAUTR_THRESHOLD) ) ) ! L/tau +! + ZRCS(:) = ZRCS(:) - ZZW3(:) + ZRRS(:) = ZRRS(:) + ZZW3(:) +! + ZZW1(:) = MIN( MIN( 1.2E4,(XACCR4/ZLBDC(:)-XACCR5)/XACCR3), & + ZLBDR(:)/XACCR1 ) ! D**-1 threshold diameter for + ! switching the autoconversion regimes + ! min (80 microns, D_h, D_r) + ZZW3(:) = ZZW3(:) * ZRHODREF(:)**2 * MAX( 0.0,ZZW1(:) )**3 / XAC + ZCRS(:) = ZCRS(:) + ZZW3(:) + END WHERE + + if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'AUTO', & + Unpack( zrcs(:), mask = gmicro(:, :, :), field = prcs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_end( tbudgets(NBUDGET_RR), 'AUTO', & + Unpack( zrrs(:), mask = gmicro(:, :, :), field = prrs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_sv ) call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_c2r2beg + 2), 'AUTO', & + Unpack( zcrs(:), mask = gmicro(:, :, :), field = pcrs(:, :, :) ) * prhodj(:, :, :) ) +! +! +!* 4.3 Accretion sources +! + if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'ACCR', & + Unpack( zrcs(:), mask = gmicro(:, :, :), field = prcs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_init( tbudgets(NBUDGET_RR), 'ACCR', & + Unpack( zrrs(:), mask = gmicro(:, :, :), field = prrs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_sv ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_c2r2beg + 1), 'ACCR', & + Unpack( zccs(:), mask = gmicro(:, :, :), field = pccs(:, :, :) ) * prhodj(:, :, :) ) +! +!* 4.31 test the criterium Df>Dh or Nr>Nrm +! + GACCR(:) = ZRRT(:)>XRTMIN(3) .AND. ZCRT(:)>XCTMIN(3) + IACCR = COUNT(GACCR(:)) + IF( IACCR>0 ) THEN + ALLOCATE(ZZW4(IMICRO)); ZZW4(:) = XACCR1/ZLBDR(:) + ALLOCATE(GENABLE_ACCR_SCBU(IMICRO)) + GENABLE_ACCR_SCBU(:) = ZRRT(:)>1.2*ZZW2(:)/ZRHODREF(:) .OR. & + ZZW4(:)>=MAX( XACCR2,XACCR3/(XACCR4/ZLBDC(:)-XACCR5) ) + GACCR(:) = GACCR(:) .AND. ZRCT(:)>XRTMIN(2) .AND. GENABLE_ACCR_SCBU(:) + END IF +! + IACCR = COUNT(GACCR(:)) + IF( IACCR>0 ) THEN + WHERE( GACCR(:).AND.(ZZW4(:)>1.E-4) ) ! Accretion for D>100 10-6 m + ZZW3(:) = ZLBDC3(:) / ZLBDR3(:) + ZZW1(:) = ZCCT(:)*ZCRT(:) / ZLBDC3(:) + ZZW2(:) = MIN( ZZW1(:)*(XACCR_CLARGE1+XACCR_CLARGE2*ZZW3(:)),ZCCS(:) ) + ZCCS(:) = ZCCS(:) - ZZW2(:) +! + ZZW1(:) = ZZW1(:) / ZLBDC3(:) + ZZW2(:) = MIN( ZZW1(:)*(XACCR_RLARGE1+XACCR_RLARGE2*ZZW3(:)) & + /ZRHODREF(:),ZRCS(:) ) + ZRCS(:) = ZRCS(:) - ZZW2(:) + ZRRS(:) = ZRRS(:) + ZZW2(:) + END WHERE + WHERE( GACCR(:).AND.(ZZW4(:)<=1.E-4) ) ! Accretion for D<100 10-6 m + ZZW3(:) = ZLBDC3(:) / ZLBDR3(:) + ZZW1(:) = ZCCT(:)*ZCRT(:) / ZLBDC3(:)**2 + ZZW3(:) = ZZW3(:)**2 + ZZW2(:) = MIN( ZZW1(:)*(XACCR_CSMALL1+XACCR_CSMALL2*ZZW3(:)),ZCCS(:) ) + ZCCS(:) = ZCCS(:) - ZZW2(:) +! + ZZW1(:) = ZZW1(:) / ZLBDC3(:) + ZZW2(:) = MIN( ZZW1(:)*(XACCR_RSMALL1+XACCR_RSMALL2*ZZW3(:)) & + /ZRHODREF(:),ZRCS(:) ) + ZRCS(:) = ZRCS(:) - ZZW2(:) + ZRRS(:) = ZRRS(:) + ZZW2(:) + END WHERE + END IF + + if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'ACCR', & + Unpack( zrcs(:), mask = gmicro(:, :, :), field = prcs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_end( tbudgets(NBUDGET_RR), 'ACCR', & + Unpack( zrrs(:), mask = gmicro(:, :, :), field = prrs(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_sv ) call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_c2r2beg + 1), 'ACCR', & + Unpack( zccs(:), mask = gmicro(:, :, :), field = pccs(:, :, :) ) * prhodj(:, :, :) ) +! +!* 4.4 Self collection - Coalescence/Break-up +! + if ( lbudget_sv ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_c2r2beg + 2), 'SCBU', & + Unpack( zcrs(:), mask = gmicro(:, :, :), field = pcrs(:, :, :) ) * prhodj(:, :, :) ) + + IF( IACCR>0 ) THEN + GSCBU(:) = ZCRT(:)>XCTMIN(3) .AND. GENABLE_ACCR_SCBU(:) + ISCBU = COUNT(GSCBU(:)) + ELSE + ISCBU = 0.0 + END IF + IF( ISCBU>0 ) THEN +! +!* 4.41 efficiencies +! + IF (.NOT.ALLOCATED(ZZW4)) ALLOCATE(ZZW4(IMICRO)) + ZZW4(:) = XACCR1 / ZLBDR(:) ! Mean diameter + ALLOCATE(ZSCBU(IMICRO)) + ZSCBU(:) = 1.0 + WHERE (ZZW4(:)>=XSCBU_EFF1 .AND. GSCBU(:)) ZSCBU(:) = & ! Coalescence + EXP(XSCBUEXP1*(ZZW4(:)-XSCBU_EFF1)) ! efficiency + WHERE (ZZW4(:)>=XSCBU_EFF2) ZSCBU(:) = 0.0 ! Break-up +! +!* 4.42 integration +! + ZZW1(:) = 0.0 + ZZW2(:) = 0.0 + ZZW3(:) = 0.0 + ZZW4(:) = XACCR1 / ZLBDR(:) ! Mean volume drop diameter + WHERE (GSCBU(:).AND.(ZZW4(:)>1.E-4)) ! analytical integration + ZZW1(:) = XSCBU2 * ZCRT(:)**2 / ZLBDR3(:) ! D>100 10-6 m + ZZW3(:) = ZZW1(:)*ZSCBU(:) + END WHERE + WHERE (GSCBU(:).AND.(ZZW4(:)<=1.E-4)) + ZZW2(:) = XSCBU3 * (ZCRT(:) / ZLBDR3(:))**2 ! D<100 10-6 m + ZZW3(:) = ZZW2(:) + END WHERE + ZCRS(:) = ZCRS(:) - MIN( ZCRS(:),ZZW3(:) ) + DEALLOCATE(ZSCBU) + END IF +! +! + ZW(:,:,:) = PRCS(:,:,:) + PRCS(:,:,:) = UNPACK( ZRCS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PRRS(:,:,:) + PRRS(:,:,:) = UNPACK( ZRRS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PCCS(:,:,:) + PCCS(:,:,:) = UNPACK( ZCCS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PCRS(:,:,:) + PCRS(:,:,:) = UNPACK( ZCRS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + + if ( lbudget_sv ) call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_c2r2beg + 2), 'SCBU', pcrs(:, :, :) * prhodj(:, :, :) ) + + DEALLOCATE(ZRCT) + DEALLOCATE(ZRRT) + DEALLOCATE(ZCCT) + DEALLOCATE(ZCRT) + DEALLOCATE(ZRCS) + DEALLOCATE(ZRRS) + DEALLOCATE(ZCRS) + DEALLOCATE(ZCCS) + DEALLOCATE(ZRHODREF) + DEALLOCATE(GSELF) + DEALLOCATE(GACCR) + DEALLOCATE(GSCBU) + IF( ALLOCATED(GENABLE_ACCR_SCBU) ) DEALLOCATE(GENABLE_ACCR_SCBU) + DEALLOCATE(ZZW1) + DEALLOCATE(ZZW2) + DEALLOCATE(ZZW3) + IF( ALLOCATED(ZZW4) ) DEALLOCATE(ZZW4) + DEALLOCATE(ZLBDR3) + DEALLOCATE(ZLBDC3) + DEALLOCATE(ZLBDR) + DEALLOCATE(ZLBDC) + IF( ALLOCATED(IVEC1) ) THEN + DEALLOCATE(IVEC1) + DEALLOCATE(ZVEC1) + END IF +END IF +! + END SUBROUTINE C2R2_COALESCENCE +! +!------------------------------------------------------------------------------- +! +SUBROUTINE KHKO_COALESCENCE +! +! ------------ +! +IMPLICIT NONE +! +!* 0.2 declaration of local variables +! +INTEGER , DIMENSION(SIZE(GNUCT)) :: I1,I2,I3 ! Used to replace the COUNT +INTEGER :: JL ! and PACK intrinsics +! +!------------------------------------------------------------------------------- +! +! +GMICRO(:,:,:) = .FALSE. +GMICRO(IIB:IIE,IJB:IJE,IKB:IKE) = & + PRCT(IIB:IIE,IJB:IJE,IKB:IKE)>XRTMIN(2) .OR. & + PRRT(IIB:IIE,IJB:IJE,IKB:IKE)>XRTMIN(3) +IMICRO = COUNTJV( GMICRO(:,:,:),I1(:),I2(:),I3(:)) +IF( IMICRO >= 1 ) THEN + ALLOCATE(ZRCT(IMICRO)) + ALLOCATE(ZRRT(IMICRO)) + ALLOCATE(ZCCT(IMICRO)) +! + ALLOCATE(ZRCS(IMICRO)) + ALLOCATE(ZRRS(IMICRO)) + ALLOCATE(ZCCS(IMICRO)) + ALLOCATE(ZCRS(IMICRO)) +! + ALLOCATE(ZRHODREF(IMICRO)) +! + DO JL=1,IMICRO + ZCCT(JL) = PCCT(I1(JL),I2(JL),I3(JL)) + ZRCT(JL) = PRCT(I1(JL),I2(JL),I3(JL)) + ZRRT(JL) = PRRT(I1(JL),I2(JL),I3(JL)) + ZCCS(JL) = PCCS(I1(JL),I2(JL),I3(JL)) + ZRCS(JL) = PRCS(I1(JL),I2(JL),I3(JL)) + ZRRS(JL) = PRRS(I1(JL),I2(JL),I3(JL)) + ZCRS(JL) = PCRS(I1(JL),I2(JL),I3(JL)) + ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) + END DO +! + ALLOCATE(ZZW1(IMICRO)) +! +!* 4.1.1 autoconversion +! + if ( lbudget_sv ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_c2r2beg + 1), 'SELF', pccs(:, :, :) * prhodj(:, :, :) ) + + if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'AUTO', prcs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_init( tbudgets(NBUDGET_RR), 'AUTO', prrs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_sv ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_c2r2beg + 2), 'AUTO', pcrs(:, :, :) * prhodj(:, :, :) ) + + WHERE ( ZRCT(:) .GT. XRTMIN(2) .AND. ZCCT(:) .GT. XCTMIN(2) & + .AND. (ZRCS(:) .GT. 0.0) .AND. (ZCCS(:) .GT. 0.0)) +! + ZZW1(:)= 1350.0 * ZRCT(:)**(2.47) * (ZCCT(:)/1.0E6)**(-1.79) ! ZCCT in cm-3 + ZZW1(:) = min (ZRCS(:), ZZW1(:)) + ZRCS(:) = ZRCS(:) - ZZW1(:) + ZRRS(:) = ZRRS(:) + ZZW1(:) +! + ZCRS(:) = ZCRS(:) + ZZW1(:) * 3. * ZRHODREF(:)/(4.*XPI*XRHOLW*(XR0)**(3.)) +! + ZZW1(:) = min ( ZCCS(:),ZZW1(:) * ZCCT(:) / ZRCT(:)) + ZCCS(:) = ZCCS(:) - ZZW1(:) +! + END WHERE +! + ZW(:,:,:) = PRCS(:,:,:) + PRCS(:,:,:) = UNPACK( ZRCS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PCCS(:,:,:) + PCCS(:,:,:) = UNPACK( ZCCS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PRRS(:,:,:) + PRRS(:,:,:) = UNPACK( ZRRS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PCRS(:,:,:) + PCRS(:,:,:) = UNPACK( ZCRS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) +! +!* 4.1.2 budget storage +! + if ( lbudget_sv ) call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_c2r2beg + 1), 'SELF', pccs(:, :, :) * prhodj(:, :, :) ) + + if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'AUTO', prcs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_end( tbudgets(NBUDGET_RR), 'AUTO', prrs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_sv ) call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_c2r2beg + 2), 'AUTO', pcrs(:, :, :) * prhodj(:, :, :) ) +! +!* 4.2.1 Accretion sources +! + if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'ACCR', prcs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_init( tbudgets(NBUDGET_RR), 'ACCR', prrs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_sv ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_c2r2beg + 1), 'ACCR', pccs(:, :, :) * prhodj(:, :, :) ) + + WHERE ( (ZRCT(:) .GT. XRTMIN(2)) .AND. (ZRRT(:) .GT. XRTMIN(3)) & + .AND. (ZRCS(:) .GT. 0.0) .AND. (ZCCS(:) .GT. 0.0)) + + ZZW1(:) = 67.0 * ( ZRCT(:) * ZRRT(:) )**1.15 + ZZW1(:) = MIN (ZRCS(:),ZZW1(:)) + ZRCS(:) = ZRCS(:) - ZZW1(:) + ZRRS(:) = ZRRS(:) + ZZW1(:) +! + ZZW1(:) = MIN (ZCCS(:),ZZW1(:) * ZCCT(:) / ZRCT(:)) + ZCCS(:) = ZCCS(:) - ZZW1(:) +! + END WHERE +! + ZW(:,:,:) = PRCS(:,:,:) + PRCS(:,:,:) = UNPACK( ZRCS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PCCS(:,:,:) + PCCS(:,:,:) = UNPACK( ZCCS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PRRS(:,:,:) + PRRS(:,:,:) = UNPACK( ZRRS(:),MASK=GMICRO(:,:,:),FIELD=ZW(:,:,:) ) +! + DEALLOCATE(ZRCT) + DEALLOCATE(ZRRT) + DEALLOCATE(ZCCT) + DEALLOCATE(ZRCS) + DEALLOCATE(ZRRS) + DEALLOCATE(ZCRS) + DEALLOCATE(ZCCS) + DEALLOCATE(ZRHODREF) + DEALLOCATE(ZZW1) +! +!* 4.2.2 budget storage +! + if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'ACCR', prcs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_end( tbudgets(NBUDGET_RR), 'ACCR', prrs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_sv ) call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_c2r2beg + 1), 'ACCR', pccs(:, :, :) * prhodj(:, :, :) ) +END IF +! + END SUBROUTINE KHKO_COALESCENCE +! +!------------------------------------------------------------------------------ +! + SUBROUTINE C2R2_KHKO_EVAPORATION +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +!* 0.2 declaration of local variables +! +INTEGER , DIMENSION(SIZE(GNUCT)) :: I1,I2,I3 ! Used to replace the COUNT +INTEGER :: JL ! and PACK intrinsics +! +!------------------------------------------------------------------------------- + +if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'REVA', pths(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_rv ) call Budget_store_init( tbudgets(NBUDGET_RV), 'REVA', prvs(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_rr ) call Budget_store_init( tbudgets(NBUDGET_RR), 'REVA', prrs(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_sv ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_c2r2beg + 2), 'REVA', pcrs(:, :, :) * prhodj(:, :, :) ) +! +! optimization by looking for locations where +! the raindrop mixing ratio is non-zero +! +ZW(:,:,:) = 0.0 +ZLV(:,:,:) = XLVTT + (XCPV-XCL)*(ZT(:,:,:)-XTT) !!!latent heat of vaporization +! +GEVAP(:,:,:) = .FALSE. +IF (HCLOUD=='C2R2'.OR. HCLOUD=='C3R5') THEN + GEVAP(IIB:IIE,IJB:IJE,IKB:IKE) = & + PRRS(IIB:IIE,IJB:IJE,IKB:IKE)> 0.0 .AND. & + PRVT(IIB:IIE,IJB:IJE,IKB:IKE)<ZRVSAT(IIB:IIE,IJB:IJE,IKB:IKE) +ELSE ! KHKO + GEVAP(IIB:IIE,IJB:IJE,IKB:IKE) = & + PRRS(IIB:IIE,IJB:IJE,IKB:IKE)> 0.0 .AND. & + PCRS(IIB:IIE,IJB:IJE,IKB:IKE)> 0.0 .AND. & + PRRT(IIB:IIE,IJB:IJE,IKB:IKE)> 0.0 .AND. & + PCRT(IIB:IIE,IJB:IJE,IKB:IKE)> 0.0 .AND. & + PRVT(IIB:IIE,IJB:IJE,IKB:IKE)<ZRVSAT(IIB:IIE,IJB:IJE,IKB:IKE) +ENDIF +IEVAP = COUNTJV( GEVAP(:,:,:),I1(:),I2(:),I3(:)) + +IF( IEVAP >= 1 ) THEN + ALLOCATE(ZRVT(IEVAP)) + ALLOCATE(ZRCT(IEVAP)) + ALLOCATE(ZRRT(IEVAP)) + ALLOCATE(ZCRT(IEVAP)) + ALLOCATE(ZRVS(IEVAP)) + ALLOCATE(ZRRS(IEVAP)) + ALLOCATE(ZCRS(IEVAP)) + ALLOCATE(ZTHS(IEVAP)) + ALLOCATE(ZLBDR(IEVAP)) + ALLOCATE(ZRHODREF(IEVAP)) + ALLOCATE(ZEXNREF(IEVAP)) + ALLOCATE(ZZT(IEVAP)) + ALLOCATE(ZZLV(IEVAP)) + ALLOCATE(ZZW1(IEVAP)) + ALLOCATE(ZZW2(IEVAP)) + ALLOCATE(ZZW3(IEVAP)) +! + DO JL=1,IEVAP + ZRVT(JL) = PRVT(I1(JL),I2(JL),I3(JL)) + ZRCT(JL) = PRCT(I1(JL),I2(JL),I3(JL)) + ZRRT(JL) = PRRT(I1(JL),I2(JL),I3(JL)) + ZCRT(JL) = PCRT(I1(JL),I2(JL),I3(JL)) + ZRRS(JL) = PRRS(I1(JL),I2(JL),I3(JL)) + ZRVS(JL) = PRVS(I1(JL),I2(JL),I3(JL)) + ZTHS(JL) = PTHS(I1(JL),I2(JL),I3(JL)) + ZCRS(JL) = PCRS(I1(JL),I2(JL),I3(JL)) + ZZT(JL) = ZT(I1(JL),I2(JL),I3(JL)) + ZZW1(JL) = ZRVSAT(I1(JL),I2(JL),I3(JL)) + ZLBDR(JL) = ZWLBDR(I1(JL),I2(JL),I3(JL)) + ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) + ZEXNREF(JL) = PEXNREF(I1(JL),I2(JL),I3(JL)) + ZZLV(JL) = ZLV(I1(JL),I2(JL),I3(JL)) + END DO +! +!* 5.1 Compute the intermediate supersaturation mixing ratio +! + ZZW3(:) = MAX((1.0 - ZRVT(:)/ZZW1(:)),0.0) ! Subsaturation +! +!* 5.2 Compute the function G(T) +! + ZZW2(:) = 1. / ( XRHOLW*((((ZZLV(:)/ZZT(:))**2)/(XTHCO*XRV)) + & ! G + (XRV*ZZT(:))/(XDIVA*EXP(XALPW-XBETAW/ZZT(:)-XGAMW*ALOG(ZZT(:)))))) +! +!* 5.3 Compute the evaporation tendency +! + IF (HCLOUD =='C2R2'.OR. HCLOUD=='C3R5') THEN + ZZW2(:) = MIN( ZZW2(:) * ZZW3(:) * ZRRT(:) * & + (X0EVAR*ZLBDR(:)**XEX0EVAR + X1EVAR*ZRHODREF(:)**XEX2EVAR* & + ZLBDR(:)**XEX1EVAR),ZRRS(:) ) + ZZW2(:) = MAX(ZZW2(:),0.0) + ELSE + ZZW2(:) = 3.0 * XCEVAP * ZZW2(:) * (4.*XPI*XRHOLW/(3.*ZRHODREF(:)))**(2./3.) * & + (ZRRT(:))**(1./3.) * (ZCRT(:))**(2./3.) * ZZW3(:) + ZZW2(:) = MIN(ZZW2(:),ZRRS(:)) + ENDIF +! +!* 5.4 Adjust sources +! + ZRVS(:) = ZRVS(:) + ZZW2(:) + ZRRS(:) = ZRRS(:) - ZZW2(:) + ZTHS(:) = ZTHS(:) - ZZW2(:) * ZZLV(:) / & + ( ZEXNREF(:)*(XCPD + XCPV*ZRVT(:) + XCL*(ZRCT(:) + ZRRT(:)) ) ) +! + ZW(:,:,:) = PRVS(:,:,:) + PRVS(:,:,:) = UNPACK( ZRVS(:),MASK=GEVAP(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PRRS(:,:,:) + PRRS(:,:,:) = UNPACK( ZRRS(:),MASK=GEVAP(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:) = PTHS(:,:,:) + PTHS(:,:,:) = UNPACK( ZTHS(:),MASK=GEVAP(:,:,:),FIELD=ZW(:,:,:) ) + ZW(:,:,:)= PEVAP3D(:,:,:) + PEVAP3D(:,:,:) = UNPACK( ZZW2(:),MASK=GEVAP(:,:,:),FIELD=ZW(:,:,:) ) +! + IF (HCLOUD == 'KHKO') THEN + ZZW2(:) = MIN(ZZW2(:) * ZCRT(:)/ZRRT(:),ZCRS(:)) + ZCRS(:) = ZCRS(:) - ZZW2(:) + ZW(:,:,:) = PCRS(:,:,:) + PCRS(:,:,:) = UNPACK( ZCRS(:),MASK=GEVAP(:,:,:),FIELD=ZW(:,:,:) ) + ENDIF + DEALLOCATE(ZRCT) + DEALLOCATE(ZRRT) + DEALLOCATE(ZRVT) + DEALLOCATE(ZCRT) + DEALLOCATE(ZRVS) + DEALLOCATE(ZRRS) + DEALLOCATE(ZTHS) + DEALLOCATE(ZCRS) + DEALLOCATE(ZZLV) + DEALLOCATE(ZZT) + DEALLOCATE(ZRHODREF) + DEALLOCATE(ZEXNREF) + DEALLOCATE(ZZW1) + DEALLOCATE(ZZW2) + DEALLOCATE(ZZW3) + DEALLOCATE(ZLBDR) +! +END IF + +IF (HCLOUD == 'C2R2'.OR. HCLOUD=='C3R5') THEN +!* 5.5 Update Nr if: 80 microns < Dr < D_h +! + GEVAP(:,:,:) = PRRS(:,:,:)>ZRTMIN(3) .AND. PCRS(:,:,:)>ZCTMIN(3) .AND. & + PRCS(:,:,:)>ZRTMIN(2) .AND. PCCS(:,:,:)>ZCTMIN(2) + WHERE (GEVAP(:,:,:)) + ZWLBDR3(:,:,:) = XLBR * PCRS(:,:,:) / (PRHODREF(:,:,:) * PRRS(:,:,:)) + ZWLBDR(:,:,:) = ZWLBDR3(:,:,:)**XLBEXR +! + ZWLBDC3(:,:,:) = XLBC * PCCS(:,:,:) / (PRHODREF(:,:,:) * PRCS(:,:,:)) + ZWLBDC(:,:,:) = ZWLBDC3(:,:,:)**XLBEXC + ZWLBDC3(:,:,:) = (XACCR1/XACCR3)*(XACCR4/ZWLBDC(:,:,:)-XACCR5) + ! "Lambda_h" + END WHERE +! + GMICRO(:,:,:) = GEVAP(:,:,:) .AND. ZWLBDR(:,:,:)>ZWLBDC3(:,:,:) + ! the raindrops are too small, that is lower than D_h + ZFACT = 1.2E4*XACCR1 + WHERE (GMICRO(:,:,:)) + ZWLBDC(:,:,:) = XLBR / MIN( ZFACT,ZWLBDC3(:,:,:) )**3 + ZW(:,:,:) = MIN( MAX( & + (PRHODREF(:,:,:)*PRRS(:,:,:) - ZWLBDC(:,:,:)*PCRS(:,:,:)) / & + (PRHODREF(:,:,:)*PRCS(:,:,:)/PCCS(:,:,:) - ZWLBDC(:,:,:)) , & + 0.0 ),PCRS(:,:,:), & + PCCS(:,:,:)*PRRS(:,:,:)/(PRHODREF(:,:,:)*PRCS(:,:,:))) +! +! Compute the percent (=1 if (ZWLBDR/XACCR1) >= 1.2E4 +! of transfer with (=0 if (ZWLBDR/XACCR1) <= (XACCR4/ZWLBDC-XACCR5)/XACCR3 +! + ZW(:,:,:) = ZW(:,:,:)*( (MIN(ZWLBDR(:,:,:),1.2E4*XACCR1)-ZWLBDC3(:,:,:)) / & + ( 1.2E4*XACCR1 -ZWLBDC3(:,:,:)) ) +! + ZWLBDC(:,:,:) = PCCS(:,:,:) !temporary storage + PCCS(:,:,:) = PCCS(:,:,:)+ZW(:,:,:) + PCRS(:,:,:) = PCRS(:,:,:)-ZW(:,:,:) + ZW(:,:,:) = ZW(:,:,:) * (PRHODREF(:,:,:)*PRCS(:,:,:)/ZWLBDC(:,:,:)) + PRCS(:,:,:) = PRCS(:,:,:)+ZW(:,:,:) + + PRRS(:,:,:) = PRRS(:,:,:)-ZW(:,:,:) + END WHERE +! + GEVAP(:,:,:) = PRRS(:,:,:)<ZRTMIN(3) .OR. PCRS(:,:,:)<ZCTMIN(3) + WHERE (GEVAP(:,:,:)) + PCRS(:,:,:) = 0.0 + PRRS(:,:,:) = 0.0 + END WHERE +! + +ELSE ! KHKO +!* correct negative values for rain +! -------------------------------- +! + WHERE (PRRS(:,:,:)<0.) + PRCS(:,:,:) = PRCS(:,:,:)+PRRS(:,:,:) + PRRS(:,:,:) = 0. + PCRS(:,:,:) = 0. + END WHERE +! +!* REMOVES NON-PHYSICAL LOW VALUES + GEVAP(:,:,:) = PRRS(:,:,:)<ZRTMIN(3) .AND. PCRS(:,:,:)< ZCTMIN(3) + WHERE (GEVAP(:,:,:)) + PRVS(:,:,:) = PRVS(:,:,:) + PRRS(:,:,:) + PTHS(:,:,:) = PTHS(:,:,:) - PRRS(:,:,:) * ZLV(:,:,:) / & + ( PEXNREF(:,:,:)*(XCPD + XCPV*PRVT(:,:,:) + XCL*(PRCT(:,:,:) + PRRT(:,:,:)) ) ) + PCRS(:,:,:) = 0.0 + PRRS(:,:,:) = 0.0 + END WHERE +ENDIF + +if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'REVA', pths(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_rv ) call Budget_store_end( tbudgets(NBUDGET_RV), 'REVA', prvs(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_rr ) call Budget_store_end( tbudgets(NBUDGET_RR), 'REVA', prrs(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_sv ) call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_c2r2beg + 2), 'REVA', pcrs(:, :, :) * prhodj(:, :, :) ) + + END SUBROUTINE C2R2_KHKO_EVAPORATION +! +!------------------------------------------------------------------------------- +! + SUBROUTINE C2R2_KHKO_SEDIMENTATION +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +!* 0.2 declaration of local variables +! +! +INTEGER , DIMENSION(SIZE(GSEDIM)) :: I1,I2,I3 ! Used to replace the COUNT +INTEGER :: JL ! and PACK intrinsics +! +!------------------------------------------------------------------------------- + +if ( lbudget_rc .and. osedc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'SEDI', prcs(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_rr ) call Budget_store_init( tbudgets(NBUDGET_RR), 'SEDI', prrs(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_sv ) then + if ( osedc ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_c2r2beg + 1), 'SEDI', pccs(:, :, :) * prhodj(:, :, :) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_c2r2beg + 2), 'SEDI', pcrs(:, :, :) * prhodj(:, :, :) ) +end if +! +!* 2.1 compute the fluxes +! +! optimization by looking for locations where +! the precipitating fields are larger than a minimal value only !!! +! +IF (OSEDC) PINPRC (:,:) = 0. +IF (LDEPOC) PINDEP (:,:) = 0. +! +DO JN = 1 , KSPLITR + GSEDIM(:,:,:) = .FALSE. + IF( OSEDC ) THEN + GSEDIM(IIB:IIE,IJB:IJE,IKB:IKE) = & + PRCT(IIB:IIE,IJB:IJE,IKB:IKE)/PTSTEP>ZRTMIN(2) .OR. & + (PRRT(IIB:IIE,IJB:IJE,IKB:IKE)/PTSTEP>ZRTMIN(3) .AND. & + PCRT(IIB:IIE,IJB:IJE,IKB:IKE)/PTSTEP>ZCTMIN(3)) + ELSE + GSEDIM(IIB:IIE,IJB:IJE,IKB:IKE) = & + PRRT(IIB:IIE,IJB:IJE,IKB:IKE)/PTSTEP>ZRTMIN(3) .AND. & + PCRT(IIB:IIE,IJB:IJE,IKB:IKE)/PTSTEP>ZCTMIN(3) + END IF +! + ISEDIM = COUNTJV( GSEDIM(:,:,:),I1(:),I2(:),I3(:)) +! + IF( JN==1 ) THEN + IF( OSEDC ) THEN + ZPCCT(:,:,:) = PCCT(:,:,:) + ZPRCT(:,:,:) = PRCT(:,:,:) + PCCS(:,:,:) = PCCS(:,:,:) * PTSTEP - PCCT(:,:,:) + PRCS(:,:,:) = PRCS(:,:,:) * PTSTEP - PRCT(:,:,:) + END IF + ZPCRT(:,:,:) = PCRT(:,:,:) + ZPRRT(:,:,:) = PRRT(:,:,:) + PCRS(:,:,:) = PCRS(:,:,:) * PTSTEP - PCRT(:,:,:) + PRRS(:,:,:) = PRRS(:,:,:) * PTSTEP - PRRT(:,:,:) + DO JK = IKB , IKE + ZW(:,:,JK) = ZTSPLITR/(PZZ(:,:,JK+1) -PZZ(:,:,JK)) + END DO + END IF +! + ZWSEDR(:,:,:) = 0.0 + ZWSEDC(:,:,:) = 0.0 +! + IF( ISEDIM >= 1 ) THEN +! + ALLOCATE(ZRHODREF(ISEDIM)) + DO JL = 1,ISEDIM + ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) + END DO +! + ALLOCATE(ZZW1(ISEDIM)) + ALLOCATE(ZZW2(ISEDIM)) + ALLOCATE(ZZW3(ISEDIM)) +! +!* 2.21 for cloud +! + ZZW1(:) = 0.0 + ZZW2(:) = 0.0 + ZZW3(:) = 0.0 +! + IF( OSEDC.AND.MAXVAL(PRCS(:,:,:))>0.0 ) THEN + ALLOCATE(ZRCT(ISEDIM)) + ALLOCATE(ZCCT(ISEDIM)) + ALLOCATE(ZLBDC(ISEDIM)) + DO JL = 1,ISEDIM + ZRCT(JL) = ZPRCT(I1(JL),I2(JL),I3(JL)) + ZCCT(JL) = ZPCCT(I1(JL),I2(JL),I3(JL)) + ZLBDC(JL) = ZWLBDC(I1(JL),I2(JL),I3(JL)) + END DO + WHERE( ZRCT(:)>XRTMIN(2) ) + ZZW3(:) = ZRHODREF(:)**(-XCEXVT) * ZLBDC(:)**(-XDC) + ZZW1(:) = XFSEDRC * ZRCT(:) * ZZW3(:) * ZRHODREF(:) + ZZW2(:) = XFSEDCC * ZCCT(:) * ZZW3(:) + END WHERE + ZWSEDR(:,:,:) = UNPACK( ZZW1(:),MASK=GSEDIM(:,:,:),FIELD=0.0 ) + ZWSEDC(:,:,:) = UNPACK( ZZW2(:),MASK=GSEDIM(:,:,:),FIELD=0.0 ) + DEALLOCATE(ZRCT) + DEALLOCATE(ZCCT) + DEALLOCATE(ZLBDC) + END IF +! + END IF +! + IF( OSEDC ) THEN + DO JK = IKB , IKE + ZPRCT(:,:,JK) = ZPRCT(:,:,JK) + ZW(:,:,JK)* & + (ZWSEDR(:,:,JK+1)-ZWSEDR(:,:,JK))/PRHODREF(:,:,JK) + ZPCCT(:,:,JK) = ZPCCT(:,:,JK) + ZW(:,:,JK)* & + (ZWSEDC(:,:,JK+1)-ZWSEDC(:,:,JK)) + END DO +! + IF( JN.EQ.1 ) THEN + PINPRC(:,:) = ZWSEDR(:,:,IKB)/XRHOLW ! in m/s + END IF + END IF +! +!* 2.22 for drizzle +! + ZWSEDR(:,:,:) = 0.0 + ZWSEDC(:,:,:) = 0.0 + IF( ISEDIM >= 1 ) THEN + ZZW1(:) = 0.0 + ZZW2(:) = 0.0 +! + IF( MAXVAL(PRRS(:,:,:))>0.0 ) THEN + ALLOCATE(ZRRT(ISEDIM)) + ALLOCATE(ZCRT(ISEDIM)) + ALLOCATE(ZZVRR(ISEDIM)) + ALLOCATE(ZZVCR(ISEDIM)) + DO JL = 1,ISEDIM + ZRRT(JL) = ZPRRT(I1(JL),I2(JL),I3(JL)) + ZCRT(JL) = ZPCRT(I1(JL),I2(JL),I3(JL)) + ZZVRR(JL) = ZVRR(I1(JL),I2(JL),I3(JL)) + ZZVCR(JL) = ZVCR(I1(JL),I2(JL),I3(JL)) + END DO + WHERE (ZRRT(:)>XRTMIN(3) ) + ZZW1(:) = ZZVRR(:) * ZRRT(:) * ZRHODREF(:) + ZZW2(:) = ZZVCR(:) * ZCRT(:) + END WHERE + ZWSEDR(:,:,:) = UNPACK( ZZW1(:),MASK=GSEDIM(:,:,:),FIELD=0.0 ) + ZWSEDC(:,:,:) = UNPACK( ZZW2(:),MASK=GSEDIM(:,:,:),FIELD=0.0 ) +! + DEALLOCATE(ZRRT) + DEALLOCATE(ZCRT) + DEALLOCATE(ZZVRR) + DEALLOCATE(ZZVCR) +! + END IF +! + DEALLOCATE(ZRHODREF) + DEALLOCATE(ZZW1) + DEALLOCATE(ZZW2) + DEALLOCATE(ZZW3) +! + END IF +! +!* 2.3 update the rain tendency +! + DO JK = IKB , IKE + ZPRRT(:,:,JK) = ZPRRT(:,:,JK) + ZW(:,:,JK)* & + (ZWSEDR(:,:,JK+1)-ZWSEDR(:,:,JK))/PRHODREF(:,:,JK) + ZPCRT(:,:,JK) = ZPCRT(:,:,JK) + ZW(:,:,JK)* & + (ZWSEDC(:,:,JK+1)-ZWSEDC(:,:,JK)) + END DO +! +!* 2.4 compute the explicit accumulated precipitations +! + IF( JN.EQ.1 ) THEN + PINPRR(:,:) = ZWSEDR(:,:,IKB)/XRHOLW ! in m/s + PINPRR3D(:,:,:) = ZWSEDR(:,:,:)/XRHOLW ! in m/s + END IF +! + IF( JN==KSPLITR ) THEN + IF( OSEDC ) THEN + PRCS(:,:,:) = ( PRCS(:,:,:) + ZPRCT(:,:,:) ) / PTSTEP + PCCS(:,:,:) = ( PCCS(:,:,:) + ZPCCT(:,:,:) ) / PTSTEP + END IF + PRRS(:,:,:) = ( PRRS(:,:,:) + ZPRRT(:,:,:) ) / PTSTEP + PCRS(:,:,:) = ( PCRS(:,:,:) + ZPCRT(:,:,:) ) / PTSTEP + END IF +! + IF ( OSEDC .AND. tpfile%lopened ) THEN + TZFIELD%CMNHNAME = 'SEDFLUXC' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'SEDFLUXC' + TZFIELD%CUNITS = '' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_SEDFLUXC' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZWSEDC) + ! + TZFIELD%CMNHNAME = 'SEDFLUXR' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'SEDFLUXR' + TZFIELD%CUNITS = '' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_SEDFLUXR' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZWSEDR) + END IF +END DO +! +!* 2.5 budget storage +! +if ( lbudget_rc .and. osedc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'SEDI', prcs(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_rr ) call Budget_store_end( tbudgets(NBUDGET_RR), 'SEDI', prrs(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_sv ) then + if ( osedc ) call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_c2r2beg + 1), 'SEDI', pccs(:, :, :) * prhodj(:, :, :) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_c2r2beg + 2), 'SEDI', pcrs(:, :, :) * prhodj(:, :, :) ) +end if +! +!* 2.6 DROPLET DEPOSITION AT THE 1ST LEVEL ABOVE GROUND +! +IF (LDEPOC) THEN + if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'DEPO', prcs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_sv ) call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_c2r2beg + 1), 'DEPO', pccs(:, :, :) * prhodj(:, :, :) ) + + GDEP(:,:) = .FALSE. + GDEP(IIB:IIE,IJB:IJE) = PRCS(IIB:IIE,IJB:IJE,2) >0 .AND. & + PCCS(IIB:IIE,IJB:IJE,2) >0 + WHERE (GDEP) + PRCS(:,:,2) = PRCS(:,:,2) - XVDEPOC * PRCT(:,:,2) / ( PZZ(:,:,3) - PZZ(:,:,2)) + PCCS(:,:,2) = PCCS(:,:,2) - XVDEPOC * PCCT(:,:,2) / ( PZZ(:,:,3) - PZZ(:,:,2)) + PINPRC(:,:) = PINPRC(:,:) + XVDEPOC * PRCT(:,:,2) * PRHODREF(:,:,2) /XRHOLW + PINDEP(:,:) = XVDEPOC * PRCT(:,:,2) * PRHODREF(:,:,2) /XRHOLW + END WHERE + + if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'DEPO', prcs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_sv ) call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_c2r2beg + 1), 'DEPO', pccs(:, :, :) * prhodj(:, :, :) ) +END IF + + END SUBROUTINE C2R2_KHKO_SEDIMENTATION +!------------------------------------------------------------------------------- +! +END SUBROUTINE RAIN_C2R2_KHKO diff --git a/src/mesonh/micro/rain_ice.f90 b/src/mesonh/micro/rain_ice.f90 new file mode 100644 index 000000000..d736f5a9c --- /dev/null +++ b/src/mesonh/micro/rain_ice.f90 @@ -0,0 +1,945 @@ +!MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ######spl + MODULE MODI_RAIN_ICE +! #################### +! +INTERFACE + SUBROUTINE RAIN_ICE ( OSEDIC,HSEDIM, HSUBG_AUCV, OWARM, KKA, KKU, KKL, & + KSPLITR, PTSTEP, KRR, & + PDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR,& + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, & + PRGT, PTHS, PRVS, PRCS, PRRS, PRIS, PRSS, PRGS, & + PINPRC,PINPRR, PINPRR3D, PEVAP3D, & + PINPRS, PINPRG, PSIGS, PINDEP, PRAINFR, PSEA, PTOWN, & + PRHT, PRHS, PINPRH, PFPR ) +! +! +LOGICAL, INTENT(IN) :: OSEDIC ! Switch for droplet sedim. +CHARACTER(LEN=4), INTENT(IN) :: HSEDIM ! Sedimentation scheme +CHARACTER(LEN=4), INTENT(IN) :: HSUBG_AUCV ! Switch for rc->rr Subgrid autoconversion + ! Kind of Subgrid autoconversion method +LOGICAL, INTENT(IN) :: OWARM ! .TRUE. allows raindrops to + ! form by warm processes + ! (Kessler scheme) +! +INTEGER, INTENT(IN) :: KKA !near ground array index +INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO +INTEGER, INTENT(IN) :: KSPLITR ! Number of small time step + ! integration for rain sedimendation +REAL, INTENT(IN) :: PTSTEP ! Double Time step + ! (single if cold start) +INTEGER, INTENT(IN) :: KRR ! Number of moist variable +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! Layer thikness (m) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! absolute pressure at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIT ! Pristine ice n.c. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCLDFR ! Cloud fraction +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRIT ! Pristine ice m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGT ! Graupel/hail m.r. at t +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSIGS ! Sigma_s at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVS ! Water vapor m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRRS ! Rain water m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRSS ! Snow/aggregate m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRGS ! Graupel m.r. source +! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRC! Cloud instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINDEP ! Cloud instant deposition +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRR! Rain instant precip +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PINPRR3D! Rain inst precip 3D +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEVAP3D! Rain evap profile +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRS! Snow instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRG! Graupel instant precip +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRAINFR! Rain fraction +REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! Sea Mask +REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN! Fraction that is town +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(INOUT) :: PRHS ! Hail m.r. source +REAL, DIMENSION(:,:), OPTIONAL, INTENT(INOUT) :: PINPRH! Hail instant precip +REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(OUT) :: PFPR ! upper-air precipitation fluxes +! +END SUBROUTINE RAIN_ICE +END INTERFACE +END MODULE MODI_RAIN_ICE +! ######spl + SUBROUTINE RAIN_ICE ( OSEDIC,HSEDIM, HSUBG_AUCV, OWARM, KKA, KKU, KKL, & + KSPLITR, PTSTEP, KRR, & + PDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR,& + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, & + PRGT, PTHS, PRVS, PRCS, PRRS, PRIS, PRSS, PRGS, & + PINPRC,PINPRR, PINPRR3D, PEVAP3D, & + PINPRS, PINPRG, PSIGS, PINDEP, PRAINFR, PSEA, PTOWN, & + PRHT, PRHS, PINPRH, PFPR ) +! ###################################################################### +! +!!**** * - compute the explicit microphysical sources +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the slow microphysical sources +!! which can be computed explicitly +!! +!! +!!** METHOD +!! ------ +!! The autoconversion computation follows Kessler (1969). +!! The sedimentation rate is computed with a time spliting technique and +!! an upstream scheme, written as a difference of non-advective fluxes. This +!! source term is added to the future instant ( split-implicit process ). +!! The others microphysical processes are evaluated at the central instant +!! (split-explicit process ): autoconversion, accretion and rain evaporation. +!! These last 3 terms are bounded in order not to create negative values +!! for the water species at the future instant. +!! +!! EXTERNAL +!! -------- +!! None +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_PARAMETERS +!! JPHEXT : Horizontal external points number +!! JPVEXT : Vertical external points number +!! Module MODD_CONF : +!! CCONF configuration of the model for the first time step +!! Module MODD_CST +!! XP00 ! Reference pressure +!! XRD,XRV ! Gaz constant for dry air, vapor +!! XMD,XMV ! Molecular weight for dry air, vapor +!! XCPD ! Cpd (dry air) +!! XCL ! Cl (liquid) +!! XCI ! Ci (solid) +!! XTT ! Triple point temperature +!! XLVTT ! Vaporization heat constant +!! XALPW,XBETAW,XGAMW ! Constants for saturation vapor pressure +!! function over liquid water +!! XALPI,XBETAI,XGAMI ! Constants for saturation vapor pressure +!! function over solid ice +!! +!! REFERENCE +!! --------- +!! +!! Book1 and Book2 of documentation ( routine RAIN_ICE ) +!! +!! AUTHOR +!! ------ +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original 02/11/95 +!! (J.Viviand) 04/02/97 debug accumulated prcipitation & convert +!! precipitation rate in m/s +!! (J.-P. Pinty) 17/02/97 add budget calls +!! (J.-P. Pinty) 17/11/97 set ice sedim. for cirrus ice, reset RCHONI +!! and RRHONG, reverse order for DEALLOCATE +!! (J.-P. Pinty) 11/02/98 correction of the air dynamical viscosity and +!! add advance of the budget calls +!! (J.-P. Pinty) 18/05/98 correction of the air density in the RIAUTS +!! process +!! (J.-P. Pinty) 18/11/98 split the main routine +!! (V. Masson) 18/11/98 bug in IVEC1 and IVEC2 upper limits +!! (J. Escobar & J.-P. Pinty) +!! 11/12/98 contains and rewrite count+pack +!! (J. Stein & J.-P. Pinty) +!! 14/10/99 correction for very small RIT +!! (J. Escobar & J.-P. Pinty) +!! 24/07/00 correction for very samll m.r. in +!! the sedimentation subroutine +!! (M. Tomasini) 11/05/01 Autoconversion of rc into rr modification to take +!! into account the subgrid variance +!! (cf Redelsperger & Sommeria JAS 86) +!! (G. Molinie) 21/05/99 bug in RRCFRIG process, RHODREF**(-1) missing +!! in RSRIMCG +!! (G. Molinie & J.-P. Pinty) +!! 21/06/99 bug in RACCS process +!! (P. Jabouille) 27/05/04 safety test for case where esw/i(T)> pabs (~Z>40km) +!! (J-.P. Chaboureau) 12/02/05 temperature depending ice-to-snow autocon- +! version threshold (Chaboureau and Pinty GRL 2006) +!! (J.-P. Pinty) 01/01/O1 add the hail category and correction of the +!! wet growth rate of the graupeln +!! (S.Remy & C.Lac) 06/06 Add the cloud sedimentation +!! (S.Remy & C.Lac) 06/06 Sedimentation becoming the last process +!! to settle the precipitating species created during the current time step +!! (S.Remy & C.Lac) 06/06 Modification of the algorithm of sedimentation +!! to settle n times the precipitating species created during Dt/n instead +!! of Dt +!! (C.Lac) 11/06 Optimization of the sedimentation loop for NEC +!! (J.Escobar) 18/01/2008 Parallel Bug in Budget when IMICRO >= 1 +!! --> Path inhibit this test by IMICRO >= 0 allway true +!! (Y.Seity) 03/2008 Add Statistic sedimentation +!! (Y.Seity) 10/2009 Added condition for the raindrop accretion of the aggregates +!! into graupeln process (5.2.6) to avoid negative graupel mixing ratio +!! (V.Masson, C.Lac) 09/2010 Correction in split sedimentation for +!! reproducibility +!! (S. Riette) Oct 2010 Better vectorisation of RAIN_ICE_SEDIMENTATION_STAT +!! (Y. Seity), 02-2012 add possibility to run with reversed vertical levels +!! (L. Bengtsson), 02-2013 Passing in land/sea mask and town fraction in +!! order to use different cloud droplet number conc. over +!! land, sea and urban areas in the cloud sedimentation. +!! (D. Degrauwe), 2013-11: Export upper-air precipitation fluxes PFPR. +!! (S. Riette) Nov 2013 Protection against null sigma +!! (C. Lac) FIT temporal scheme : instant M removed +!! (JP Pinty), 01-2014 : ICE4 : partial reconversion of hail to graupel +!! July, 2015 (O.Nuissier/F.Duffourg) Add microphysics diagnostic for +!! aircraft, ballon and profiler +!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 +!! C.Lac : 10/2016 : add droplet deposition +!! C.Lac : 01/2017 : correction on droplet deposition +!! J.Escobar : 10/2017 : for real*4 , limit exp() in RAIN_ICE_SLOW with XMNH_HUGE_12_LOG +!! (C. Abiven, Y. Léauté, V. Seigner, S. Riette) Phasing of Turner rain subgrid param +!! J.Escobar : 8/2018 : for real*4 , bis => limit exp() in RAIN_ICE_SLOW with XMNH_HUGE_12_LOG +!! P.Wautelet 01/02/2019: add missing initialization for PFPR +!! 02/2019 C.Lac add rain fraction as an output field +! P. Wautelet 25/02/2019: split rain_ice (cleaner and easier to maintain/debug) +! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg +! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 +! P. Wautelet 29/05/2019: remove PACK/UNPACK intrinsics (to get more performance and better OpenACC support) +! J. Escobar 09/07/2019: for reproductiblity MPPDB_CHECK, add missing LCHECK test in ZRHODJ de/allocate +! P. Wautelet 02/2020: use the new data structures and subroutines for budgets (no more budget calls in this subroutine) +!----------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +use modd_budget, only: lbu_enable +use MODD_CONF, only: LCHECK +use MODD_CST, only: XCI, XCL, XCPD, XCPV, XLSTT, XLVTT, XTT, & + XALPI, XBETAI, XGAMI, XMD, XMV, XTT +use MODD_LES, only: LLES_CALL +use MODD_PARAMETERS, only: JPVEXT +use MODD_PARAM_ICE, only: CSUBG_PR_PDF, LDEPOSC +use MODD_RAIN_ICE_DESCR, only: XLBEXR, XLBR, XRTMIN +use MODD_RAIN_ICE_PARAM, only: XCRIAUTC + +use MODE_MSG +use MODE_RAIN_ICE_FAST_RG, only: RAIN_ICE_FAST_RG +use MODE_RAIN_ICE_FAST_RH, only: RAIN_ICE_FAST_RH +use MODE_RAIN_ICE_FAST_RI, only: RAIN_ICE_FAST_RI +use MODE_RAIN_ICE_FAST_RS, only: RAIN_ICE_FAST_RS +use MODE_RAIN_ICE_NUCLEATION, only: RAIN_ICE_NUCLEATION +use MODE_RAIN_ICE_SEDIMENTATION_SPLIT, only: RAIN_ICE_SEDIMENTATION_SPLIT +use MODE_RAIN_ICE_SEDIMENTATION_STAT, only: RAIN_ICE_SEDIMENTATION_STAT +use MODE_RAIN_ICE_SLOW, only: RAIN_ICE_SLOW +use MODE_RAIN_ICE_WARM, only: RAIN_ICE_WARM +use mode_tools, only: Countjv +use mode_tools_ll, only: GET_INDICE_ll + +USE MODI_ICE4_RAINFR_VERT + +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +! +! +LOGICAL, INTENT(IN) :: OSEDIC ! Switch for droplet sedim. +CHARACTER(LEN=4), INTENT(IN) :: HSEDIM ! Sedimentation scheme +CHARACTER(LEN=4), INTENT(IN) :: HSUBG_AUCV ! Switch for rc->rr Subgrid autoconversion + ! Kind of Subgrid autoconversion method +LOGICAL, INTENT(IN) :: OWARM ! .TRUE. allows raindrops to + ! form by warm processes + ! (Kessler scheme) +! +INTEGER, INTENT(IN) :: KKA !near ground array index +INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO +INTEGER, INTENT(IN) :: KSPLITR ! Number of small time step + ! integration for rain sedimendation +REAL, INTENT(IN) :: PTSTEP ! Double Time step + ! (single if cold start) +INTEGER, INTENT(IN) :: KRR ! Number of moist variable +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! Layer thikness (m) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! absolute pressure at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIT ! Pristine ice n.c. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCLDFR ! Cloud fraction +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRIT ! Pristine ice m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGT ! Graupel/hail m.r. at t +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSIGS ! Sigma_s at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVS ! Water vapor m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRRS ! Rain water m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRSS ! Snow/aggregate m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRGS ! Graupel m.r. source +! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRC! Cloud instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINDEP ! Cloud instant deposition +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRR! Rain instant precip +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PINPRR3D! Rain inst precip 3D +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEVAP3D! Rain evap profile +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRS! Snow instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRG! Graupel instant precip +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRAINFR! Rain fraction +REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! Sea Mask +REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN! Fraction that is town +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(INOUT) :: PRHS ! Hail m.r. source +REAL, DIMENSION(:,:), OPTIONAL, INTENT(INOUT) :: PINPRH! Hail instant precip +REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(OUT) :: PFPR ! upper-air precipitation fluxes +! +!* 0.2 Declarations of local variables : +! +INTEGER :: IIB ! Define the domain where is +INTEGER :: IIE ! the microphysical sources have to be computed +INTEGER :: IIT ! +INTEGER :: IJB ! +INTEGER :: IJE ! +INTEGER :: IJT ! +INTEGER :: IKB,IKTB,IKT ! +INTEGER :: IKE,IKTE ! +! +INTEGER :: IMICRO +INTEGER, DIMENSION(SIZE(PEXNREF)) :: I1,I2,I3 ! Used to replace the COUNT +INTEGER :: JL ! and PACK intrinsics +LOGICAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) & + :: GMICRO ! Test where to compute all processes +REAL :: ZINVTSTEP +REAL :: ZCOEFFRCM +REAL, DIMENSION(:), ALLOCATABLE :: ZRVT ! Water vapor m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRCT ! Cloud water m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRRT ! Rain water m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRIT ! Pristine ice m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRGT ! Graupel m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRHT ! Hail m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZCIT ! Pristine ice conc. at t +! +REAL, DIMENSION(:), ALLOCATABLE :: ZRVS ! Water vapor m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRCS ! Cloud water m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRRS ! Rain water m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRIS ! Pristine ice m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRSS ! Snow/aggregate m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRGS ! Graupel m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRHS ! Hail m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZTHS ! Theta source +REAL, DIMENSION(:), ALLOCATABLE :: ZTHT ! Potential temperature +REAL, DIMENSION(:), ALLOCATABLE :: ZTHLT ! Liquid potential temperature +! +REAL, DIMENSION(:), ALLOCATABLE :: ZRHODREF, & ! RHO Dry REFerence + ZRHODJ, & ! RHO times Jacobian + ZZT, & ! Temperature + ZPRES, & ! Pressure + ZEXNREF, & ! EXNer Pressure REFerence + ZZW, & ! Work array + ZLSFACT, & ! L_s/(Pi_ref*C_ph) + ZLVFACT, & ! L_v/(Pi_ref*C_ph) + ZUSW, & ! Undersaturation over water + ZSSI, & ! Supersaturation over ice + ZLBDAR, & ! Slope parameter of the raindrop distribution + ZLBDAR_RF,& ! Slope parameter of the raindrop distribution + ! for the Rain Fraction part + ZLBDAS, & ! Slope parameter of the aggregate distribution + ZLBDAG, & ! Slope parameter of the graupel distribution + ZLBDAH, & ! Slope parameter of the hail distribution + ZRDRYG, & ! Dry growth rate of the graupeln + ZRWETG, & ! Wet growth rate of the graupeln + ZAI, & ! Thermodynamical function + ZCJ, & ! Function to compute the ventilation coefficient + ZKA, & ! Thermal conductivity of the air + ZDV, & ! Diffusivity of water vapor in the air + ZSIGMA_RC,& ! Standard deviation of rc at time t + ZCF, & ! Cloud fraction + ZRF, & ! Rain fraction + ZHLC_HCF, & ! HLCLOUDS : fraction of High Cloud Fraction in grid + ZHLC_LCF, & ! HLCLOUDS : fraction of Low Cloud Fraction in grid + ! note that ZCF = ZHLC_HCF + ZHLC_LCF + ZHLC_HRC, & ! HLCLOUDS : LWC that is High LWC in grid + ZHLC_LRC, & ! HLCLOUDS : LWC that is Low LWC in grid + ! note that ZRC = ZHLC_HRC + ZHLC_LRC + ZHLC_RCMAX, & ! HLCLOUDS : maximum value for RC in distribution + ZRCRAUTC, & ! RC value to begin rain formation =XCRIAUTC/RHODREF + ZHLC_HRCLOCAL, & ! HLCLOUDS : LWC that is High LWC local in HCF + ZHLC_LRCLOCAL ! HLCLOUDS : LWC that is Low LWC local in LCF + ! note that ZRC/CF = ZHLC_HRCLOCAL+ ZHLC_LRCLOCAL + ! = ZHLC_HRC/HCF+ ZHLC_LRC/LCF +REAL, DIMENSION(:,:), ALLOCATABLE :: ZZW1 ! Work arrays +REAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) & + :: ZW ! work array +REAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) & + :: ZT ! Temperature +! +!------------------------------------------------------------------------------- +! +!* 1. COMPUTE THE LOOP BOUNDS +! ----------------------- +! +CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) +IIT=SIZE(PDZZ,1) +IJT=SIZE(PDZZ,2) +IKB=KKA+JPVEXT*KKL +IKE=KKU-JPVEXT*KKL +IKT=SIZE(PDZZ,3) +IKTB=1+JPVEXT +IKTE=IKT-JPVEXT +! +! +ZINVTSTEP=1./PTSTEP +! +! +!* 2. COMPUTES THE SLOW COLD PROCESS SOURCES +! -------------------------------------- +! +CALL RAIN_ICE_NUCLEATION(IIB, IIE, IJB, IJE, IKTB, IKTE,KRR,PTSTEP,& + PTHT,PPABST,PRHODJ,PRHODREF,PRVT,PRCT,PRRT,PRIT,PRST,PRGT,& + PCIT,PEXNREF,PTHS,PRVS,PRIS,ZT,PRHT) +! +! +! optimization by looking for locations where +! the microphysical fields are larger than a minimal value only !!! +! +GMICRO(:,:,:) = .FALSE. + + IF ( KRR == 7 ) THEN + GMICRO(IIB:IIE,IJB:IJE,IKTB:IKTE) = & + PRCT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(2) .OR. & + PRRT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(3) .OR. & + PRIT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(4) .OR. & + PRST(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(5) .OR. & + PRGT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(6) .OR. & + PRHT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(7) + ELSE IF( KRR == 6 ) THEN + GMICRO(IIB:IIE,IJB:IJE,IKTB:IKTE) = & + PRCT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(2) .OR. & + PRRT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(3) .OR. & + PRIT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(4) .OR. & + PRST(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(5) .OR. & + PRGT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(6) + END IF + +IMICRO = COUNTJV( GMICRO(:,:,:),I1(:),I2(:),I3(:)) +IF( IMICRO >= 0 ) THEN + ALLOCATE(ZRVT(IMICRO)) + ALLOCATE(ZRCT(IMICRO)) + ALLOCATE(ZRRT(IMICRO)) + ALLOCATE(ZRIT(IMICRO)) + ALLOCATE(ZRST(IMICRO)) + ALLOCATE(ZRGT(IMICRO)) + IF ( KRR == 7 ) THEN + ALLOCATE(ZRHT(IMICRO)) + ELSE + ALLOCATE(ZRHT(0)) + END IF + ALLOCATE(ZCIT(IMICRO)) + ALLOCATE(ZRVS(IMICRO)) + ALLOCATE(ZRCS(IMICRO)) + ALLOCATE(ZRRS(IMICRO)) + ALLOCATE(ZRIS(IMICRO)) + ALLOCATE(ZRSS(IMICRO)) + ALLOCATE(ZRGS(IMICRO)) + IF ( KRR == 7 ) THEN + ALLOCATE(ZRHS(IMICRO)) + ELSE + ALLOCATE(ZRHS(0)) + END IF + ALLOCATE(ZTHS(IMICRO)) + ALLOCATE(ZTHT(IMICRO)) + ALLOCATE(ZTHLT(IMICRO)) + ALLOCATE(ZRHODREF(IMICRO)) + ALLOCATE(ZZT(IMICRO)) + ALLOCATE(ZPRES(IMICRO)) + ALLOCATE(ZEXNREF(IMICRO)) + ALLOCATE(ZSIGMA_RC(IMICRO)) + ALLOCATE(ZCF(IMICRO)) + ALLOCATE(ZRF(IMICRO)) + ALLOCATE(ZHLC_HCF(IMICRO)) + ALLOCATE(ZHLC_LCF(IMICRO)) + ALLOCATE(ZHLC_HRC(IMICRO)) + ALLOCATE(ZHLC_LRC(IMICRO)) + ALLOCATE(ZHLC_RCMAX(IMICRO)) + ALLOCATE(ZRCRAUTC(IMICRO)) + ALLOCATE(ZHLC_HRCLOCAL(IMICRO)) + ALLOCATE(ZHLC_LRCLOCAL(IMICRO)) + + DO JL=1,IMICRO + ZRVT(JL) = PRVT(I1(JL),I2(JL),I3(JL)) + ZRCT(JL) = PRCT(I1(JL),I2(JL),I3(JL)) + ZRRT(JL) = PRRT(I1(JL),I2(JL),I3(JL)) + ZRIT(JL) = PRIT(I1(JL),I2(JL),I3(JL)) + ZRST(JL) = PRST(I1(JL),I2(JL),I3(JL)) + ZRGT(JL) = PRGT(I1(JL),I2(JL),I3(JL)) + IF ( KRR == 7 ) ZRHT(JL) = PRHT(I1(JL),I2(JL),I3(JL)) + ZCIT(JL) = PCIT(I1(JL),I2(JL),I3(JL)) + ZCF(JL) = PCLDFR(I1(JL),I2(JL),I3(JL)) + IF ( HSUBG_AUCV == 'PDF ' .AND. CSUBG_PR_PDF == 'SIGM' ) THEN + ZSIGMA_RC(JL) = PSIGS(I1(JL),I2(JL),I3(JL)) * 2. +! ZSIGMA_RC(JL) = MAX(PSIGS(I1(JL),I2(JL),I3(JL)) * 2., 1.E-12) + END IF + ZRVS(JL) = PRVS(I1(JL),I2(JL),I3(JL)) + ZRCS(JL) = PRCS(I1(JL),I2(JL),I3(JL)) + ZRRS(JL) = PRRS(I1(JL),I2(JL),I3(JL)) + ZRIS(JL) = PRIS(I1(JL),I2(JL),I3(JL)) + ZRSS(JL) = PRSS(I1(JL),I2(JL),I3(JL)) + ZRGS(JL) = PRGS(I1(JL),I2(JL),I3(JL)) + IF ( KRR == 7 ) ZRHS(JL) = PRHS(I1(JL),I2(JL),I3(JL)) + ZTHS(JL) = PTHS(I1(JL),I2(JL),I3(JL)) +! + ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) + ZZT(JL) = ZT(I1(JL),I2(JL),I3(JL)) + ZTHT(JL) = PTHT(I1(JL),I2(JL),I3(JL)) + ZTHLT(JL) = ZTHT(JL) - XLVTT * ZTHT(JL) / XCPD / ZZT(JL) * ZRCT(JL) + ZPRES(JL) = PPABST(I1(JL),I2(JL),I3(JL)) + ZEXNREF(JL) = PEXNREF(I1(JL),I2(JL),I3(JL)) + ENDDO + ALLOCATE(ZZW(IMICRO)) + ALLOCATE(ZLSFACT(IMICRO)) + ALLOCATE(ZLVFACT(IMICRO)) + ZZW(:) = ZEXNREF(:)*( XCPD+XCPV*ZRVT(:)+XCL*(ZRCT(:)+ZRRT(:)) & + +XCI*(ZRIT(:)+ZRST(:)+ZRGT(:)) ) + ZLSFACT(:) = (XLSTT+(XCPV-XCI)*(ZZT(:)-XTT))/ZZW(:) ! L_s/(Pi_ref*C_ph) + ZLVFACT(:) = (XLVTT+(XCPV-XCL)*(ZZT(:)-XTT))/ZZW(:) ! L_v/(Pi_ref*C_ph) + ALLOCATE(ZUSW(IMICRO)) + ALLOCATE(ZSSI(IMICRO)) + ZZW(:) = EXP( XALPI - XBETAI/ZZT(:) - XGAMI*ALOG(ZZT(:) ) ) + ZSSI(:) = ZRVT(:)*( ZPRES(:)-ZZW(:) ) / ( (XMV/XMD) * ZZW(:) ) - 1.0 + ! Supersaturation over ice +! + ALLOCATE(ZLBDAR(IMICRO)) + ALLOCATE(ZLBDAR_RF(IMICRO)) + ALLOCATE(ZLBDAS(IMICRO)) + ALLOCATE(ZLBDAG(IMICRO)) + IF ( KRR == 7 ) THEN + ALLOCATE(ZLBDAH(IMICRO)) + ELSE + ALLOCATE(ZLBDAH(0)) + END IF + ALLOCATE(ZRDRYG(IMICRO)) + ALLOCATE(ZRWETG(IMICRO)) + ALLOCATE(ZAI(IMICRO)) + ALLOCATE(ZCJ(IMICRO)) + ALLOCATE(ZKA(IMICRO)) + ALLOCATE(ZDV(IMICRO)) +! + IF ( KRR == 7 ) THEN + ALLOCATE(ZZW1(IMICRO,7)) + ELSE IF( KRR == 6 ) THEN + ALLOCATE(ZZW1(IMICRO,6)) + ENDIF +! + IF (LBU_ENABLE .OR. LLES_CALL .OR. LCHECK ) THEN + ALLOCATE(ZRHODJ(IMICRO)) + DO JL=1,IMICRO + ZRHODJ(JL) = PRHODJ(I1(JL),I2(JL),I3(JL)) + END DO + ELSE + ALLOCATE(ZRHODJ(0)) + END IF +! + + !Cloud water split between high and low content part is done here + !according to autoconversion option + ZRCRAUTC(:) = XCRIAUTC/ZRHODREF(:) ! Autoconversion rc threshold + IF (HSUBG_AUCV == 'NONE') THEN + !Cloud water is entirely in low or high part + WHERE (ZRCT(:) > ZRCRAUTC(:)) + ZHLC_HCF(:) = 1. + ZHLC_LCF(:) = 0.0 + ZHLC_HRC(:) = ZRCT(:) + ZHLC_LRC(:) = 0.0 + ZRF(:) = 1. + ELSEWHERE (ZRCT(:) > XRTMIN(2)) + ZHLC_HCF(:) = 0.0 + ZHLC_LCF(:) = 1. + ZHLC_HRC(:) = 0.0 + ZHLC_LRC(:) = ZRCT(:) + ZRF(:) = 0. + ELSEWHERE + ZHLC_HCF(:) = 0.0 + ZHLC_LCF(:) = 0.0 + ZHLC_HRC(:) = 0.0 + ZHLC_LRC(:) = 0.0 + ZRF(:) = 0. + END WHERE + + ELSEIF (HSUBG_AUCV == 'CLFR') THEN + !Cloud water is only in the cloudy part and entirely in low or high part + WHERE (ZCF(:) > 0. .AND. ZRCT(:) > ZRCRAUTC(:)*ZCF(:)) + ZHLC_HCF(:) = ZCF(:) + ZHLC_LCF(:) = 0.0 + ZHLC_HRC(:) = ZRCT(:) + ZHLC_LRC(:) = 0.0 + ZRF(:) = ZCF(:) + ELSEWHERE (ZCF(:) > 0. .AND. ZRCT(:) > XRTMIN(2)) + ZHLC_HCF(:) = 0.0 + ZHLC_LCF(:) = ZCF(:) + ZHLC_HRC(:) = 0.0 + ZHLC_LRC(:) = ZRCT(:) + ZRF(:) = 0. + ELSEWHERE (ZCF(:) > 0.) + ZHLC_HCF(:) = 0.0 + ZHLC_LCF(:) = 0.0 + ZHLC_HRC(:) = 0.0 + ZHLC_LRC(:) = 0.0 + ZRF(:) = 0. + ELSEWHERE + ZHLC_HCF(:) = 0.0 + ZHLC_LCF(:) = 0.0 + ZHLC_HRC(:) = 0.0 + ZHLC_LRC(:) = 0.0 + ZRF(:) = 0. + END WHERE + + ELSEIF (HSUBG_AUCV == 'PDF ') THEN + !Cloud water is split between high and low part according to a PDF + ! 'HLCRECTPDF' : rectangular PDF form + ! 'HLCTRIANGPDF' : triangular PDF form + ! 'HLCQUADRAPDF' : second order quadratic PDF form + ! 'HLCISOTRIPDF' : isocele triangular PDF + ! 'SIGM' : Redelsperger and Sommeria (1986) + + IF ( CSUBG_PR_PDF == 'SIGM' ) THEN + ! Redelsperger and Sommeria (1986) but organised according to Turner (2011, 2012) + WHERE ( ZRCT(:) > ZRCRAUTC(:) + ZSIGMA_RC(:)) + ZHLC_HCF(:) = 1. + ZHLC_LCF(:) = 0.0 + ZHLC_HRC(:) = ZRCT(:) + ZHLC_LRC(:) = 0.0 + ZRF(:) = 1. + ELSEWHERE ( ZRCT(:) > ( ZRCRAUTC(:) - ZSIGMA_RC(:) ) .AND. & + & ZRCT(:) <= ( ZRCRAUTC(:) + ZSIGMA_RC(:) ) ) + ZHLC_HCF(:) = (ZRCT(:)+ZSIGMA_RC(:)-ZRCRAUTC(:))/ & + &(2.*ZSIGMA_RC(:)) + ZHLC_LCF(:) = MAX(0., ZCF(:)-ZHLC_HCF(:)) + ZHLC_HRC(:) = (ZRCT(:)+ZSIGMA_RC(:)-ZRCRAUTC(:))* & + &(ZRCT(:)+ZSIGMA_RC(:)+ZRCRAUTC(:))/ & + &(4.*ZSIGMA_RC(:)) + ZHLC_LRC(:) = MAX(0., ZRCT(:)-ZHLC_HRC(:)) + ZRF(:) = ZHLC_HCF(:) + ELSEWHERE ( ZRCT(:)>XRTMIN(2) .AND. ZCF(:)>0. ) + ZHLC_LCF(:) = 0.0 + ZHLC_LCF(:) = ZCF(:) + ZHLC_HRC(:) = 0.0 + ZHLC_LRC(:) = ZRCT(:) + ZRF(:) = 0. + ELSEWHERE + ZHLC_HCF(:) = 0.0 + ZHLC_LCF(:) = 0.0 + ZHLC_HRC(:) = 0.0 + ZHLC_LRC(:) = 0.0 + ZRF(:) = 0. + END WHERE + + ! Turner (2011, 2012) + ELSEIF ( CSUBG_PR_PDF== 'HLCRECTPDF' .OR. CSUBG_PR_PDF == 'HLCISOTRIPDF' .OR. & + & CSUBG_PR_PDF == 'HLCTRIANGPDF' .OR. CSUBG_PR_PDF == 'HLCQUADRAPDF' ) THEN + ! Calculate maximum value r_cM from PDF forms + IF ( CSUBG_PR_PDF == 'HLCRECTPDF' .OR. CSUBG_PR_PDF == 'HLCISOTRIPDF' ) THEN + ZCOEFFRCM = 2.0 + ELSE IF ( CSUBG_PR_PDF == 'HLCTRIANGPDF' ) THEN + ZCOEFFRCM = 3.0 + ELSE IF ( CSUBG_PR_PDF == 'HLCQUADRAPDF' ) THEN + ZCOEFFRCM = 4.0 + END IF + WHERE (ZRCT(:).GT.0. .AND. ZCF(:).GT.0.) + ZHLC_RCMAX(:) = ZCOEFFRCM * ZRCT(:) / ZCF(:) + END WHERE + + ! Split available water and cloud fraction in two parts + ! Calculate local mean values int he low and high parts for the 3 PDF forms: + IF ( CSUBG_PR_PDF == 'HLCRECTPDF' ) THEN + WHERE (ZRCT(:).GT.0. .AND. ZCF(:).GT.0. .AND. ZHLC_RCMAX(:).GT.ZRCRAUTC(:)) + ZHLC_LRCLOCAL(:) = 0.5*ZRCRAUTC(:) + ZHLC_HRCLOCAL(:) = ( ZHLC_RCMAX(:) + ZRCRAUTC(:)) / 2.0 + END WHERE + ELSE IF ( CSUBG_PR_PDF == 'HLCTRIANGPDF' ) THEN + WHERE (ZRCT(:).GT.0. .AND. ZCF(:).GT.0. .AND. ZHLC_RCMAX(:).GT.ZRCRAUTC(:)) + ZHLC_LRCLOCAL(:) = ( ZRCRAUTC(:) *(3.0 * ZHLC_RCMAX(:) - 2.0 * ZRCRAUTC(:) ) ) & + / (3.0 * (2.0 * ZHLC_RCMAX(:) - ZRCRAUTC(:) ) ) + ZHLC_HRCLOCAL(:) = (ZHLC_RCMAX(:) + 2.0*ZRCRAUTC(:)) / 3.0 + END WHERE + ELSE IF ( CSUBG_PR_PDF == 'HLCQUADRAPDF' ) THEN + WHERE (ZRCT(:).GT.0. .AND. ZCF(:).GT.0. .AND. ZHLC_RCMAX(:).GT.ZRCRAUTC(:)) + ZHLC_LRCLOCAL(:) = (3.0 *ZRCRAUTC(:)**3 - 8.0 *ZRCRAUTC(:)**2 * ZHLC_RCMAX(:) & + + 6.0*ZRCRAUTC(:) *ZHLC_RCMAX(:)**2 ) & + / & + (4.0* ZRCRAUTC(:)**2 -12.0*ZRCRAUTC(:) *ZHLC_RCMAX(:) & + + 12.0 * ZHLC_RCMAX(:)**2 ) + ZHLC_HRCLOCAL(:) = (ZHLC_RCMAX(:) + 3.0*ZRCRAUTC(:)) / 4.0 + END WHERE + ELSE IF ( CSUBG_PR_PDF == 'HLCISOTRIPDF' ) THEN + WHERE (ZRCT(:).GT.0. .AND. ZCF(:).GT.0. .AND. ZHLC_RCMAX(:).GT.ZRCRAUTC(:)) + WHERE ( (ZRCT(:) / ZCF(:)).LE.ZRCRAUTC(:) ) + ZHLC_LRCLOCAL(:) = ( (ZHLC_RCMAX(:))**3 & + - (12.0 * (ZHLC_RCMAX(:))*(ZRCRAUTC(:))**2) & + + (8.0 * ZRCRAUTC(:)**3) ) & + / ( (6.0 * (ZHLC_RCMAX(:))**2) & + - (24.0 * (ZHLC_RCMAX(:)) * ZRCRAUTC(:)) & + + (12.0 * ZRCRAUTC(:)**2) ) + ZHLC_HRCLOCAL(:) = ( ZHLC_RCMAX(:) + 2.0 * ZRCRAUTC(:) ) / 3.0 + ELSEWHERE + ZHLC_LRCLOCAL(:) = (2.0/3.0) * ZRCRAUTC(:) + ZHLC_HRCLOCAL(:) = (3.0*ZHLC_RCMAX(:)**3 - 8.0*ZRCRAUTC(:)**3) & + / (6.0 * ZHLC_RCMAX(:)**2 - 12.0*ZRCRAUTC(:)**2) + END WHERE + END WHERE + END IF + + ! Compare r_cM to r_cR to know if cloud water content is high enough to split in two parts or not + WHERE (ZRCT(:).GT.0. .AND. ZCF(:).GT.0. .AND. ZHLC_RCMAX(:).GT.ZRCRAUTC(:)) + ! Calculate final values for LCF and HCF: + ZHLC_LCF(:) = ZCF(:) & + * ( ZHLC_HRCLOCAL - & + ( ZRCT(:) / ZCF(:) ) ) & + / (ZHLC_HRCLOCAL - ZHLC_LRCLOCAL) + ZHLC_HCF(:) = MAX(0., ZCF(:) - ZHLC_LCF(:)) + ! + ! Calculate final values for LRC and HRC: + ZHLC_LRC(:) = ZHLC_LRCLOCAL * ZHLC_LCF(:) + ZHLC_HRC(:) = MAX(0., ZRCT(:) - ZHLC_LRC(:)) + ELSEWHERE (ZRCT(:).GT.0. .AND. ZCF(:).GT.0. .AND. ZHLC_RCMAX(:).LE.ZRCRAUTC(:)) + ! Put all available cloud water and his fraction in the low part + ZHLC_LCF(:) = ZCF(:) + ZHLC_HCF(:) = 0.0 + ZHLC_LRC(:) = ZRCT(:) + ZHLC_HRC(:) = 0.0 + ELSEWHERE + ZHLC_LCF(:) = 0. + ZHLC_HCF(:) = 0.0 + ZHLC_LRC(:) = 0. + ZHLC_HRC(:) = 0.0 + END WHERE + + ZRF(:)=ZHLC_HCF(:) !Precipitation fraction + + ELSE + !wrong CSUBG_PR_PDF case + WRITE(*,*) 'wrong CSUBG_PR_PDF case' + CALL PRINT_MSG(NVERB_FATAL,'GEN','RAIN_ICE','') + ENDIF + ELSE + !wrong HSUBG_AUCV case + WRITE(*,*)'wrong HSUBG_AUCV case' + CALL PRINT_MSG(NVERB_FATAL,'GEN','RAIN_ICE','') + ENDIF + + !Diagnostic of precipitation fraction + PRAINFR(:,:,:) = 0. + DO JL=1,IMICRO + PRAINFR(I1(JL),I2(JL),I3(JL)) = ZRF(JL) + END DO + CALL ICE4_RAINFR_VERT( IIB, IIE, IIT, IJB, IJE, IJT, IKB, IKE, IKT, KKL, PRAINFR, PRRT(:,:,:), & + RESHAPE( SOURCE = [ ( 0., JL = 1, SIZE( PRSS ) ) ], SHAPE = SHAPE( PRSS ) ), & + RESHAPE( SOURCE = [ ( 0., JL = 1, SIZE( PRGS ) ) ], SHAPE = SHAPE( PRGS ) ) ) + DO JL=1,IMICRO + ZRF(JL)=PRAINFR(I1(JL),I2(JL),I3(JL)) + END DO +! + CALL RAIN_ICE_SLOW(GMICRO, ZINVTSTEP, ZRHODREF, & + ZRCT, ZRRT, ZRIT, ZRST, ZRGT, ZRHODJ, ZZT, ZPRES, & + ZLSFACT, ZLVFACT, ZSSI, & + ZRVS, ZRCS, ZRRS, ZRIS, ZRSS, ZRGS, ZTHS, & + ZAI, ZCJ, ZKA, ZDV, ZLBDAS, ZLBDAG) +! +!------------------------------------------------------------------------------- +! +! +!* 3. COMPUTES THE SLOW WARM PROCESS SOURCES +! -------------------------------------- +! +!* 3.1 compute the slope parameter Lbda_r +! + !ZLBDAR will be used when we consider rain diluted over the grid box + WHERE( ZRRT(:)>0.0 ) + ZLBDAR(:) = XLBR*( ZRHODREF(:)*MAX( ZRRT(:),XRTMIN(3) ) )**XLBEXR + END WHERE + !ZLBDAR_RF will be used when we consider rain concentrated in its fraction + WHERE( ZRRT(:)>0.0 .AND. ZRF(:)>0.0 ) + ZLBDAR_RF(:) = XLBR*( ZRHODREF(:) *MAX( ZRRT(:)/ZRF(:) , XRTMIN(3) ) )**XLBEXR + ELSEWHERE + ZLBDAR_RF(:) = 0. + END WHERE +! + IF( OWARM ) THEN ! Check if the formation of the raindrops by the slow + ! warm processes is allowed + PEVAP3D(:,:,:)= 0. + CALL RAIN_ICE_WARM(GMICRO, IMICRO, I1, I2, I3, & + ZRHODREF, ZRVT, ZRCT, ZRRT, ZHLC_HCF, ZHLC_LCF, ZHLC_HRC, ZHLC_LRC, & + ZRHODJ, ZPRES, ZZT, ZLBDAR, ZLBDAR_RF, ZLVFACT, ZCJ, ZKA, ZDV, ZRF, ZCF, ZTHT, ZTHLT, & + ZRVS, ZRCS, ZRRS, ZTHS, ZUSW, PEVAP3D) + END IF +! +!------------------------------------------------------------------------------- +! +! +!* 4. COMPUTES THE FAST COLD PROCESS SOURCES FOR r_s +! ---------------------------------------------- +! + CALL RAIN_ICE_FAST_RS(PTSTEP, GMICRO, ZRHODREF, ZRVT, ZRCT, ZRRT, ZRST, ZRHODJ, ZPRES, ZZT, & + ZLBDAR, ZLBDAS, ZLSFACT, ZLVFACT, ZCJ, ZKA, ZDV, & + ZRCS, ZRRS, ZRSS, ZRGS, ZTHS) +! +!------------------------------------------------------------------------------- +! +! +!* 5. COMPUTES THE FAST COLD PROCESS SOURCES FOR r_g +! ---------------------------------------------- +! + CALL RAIN_ICE_FAST_RG(KRR, GMICRO, ZRHODREF, ZRVT, ZRCT, ZRRT, ZRIT, ZRST, ZRGT, ZCIT, & + ZRHODJ, ZPRES, ZZT, ZLBDAR, ZLBDAS, ZLBDAG, ZLSFACT, ZLVFACT, & + ZCJ, ZKA, ZDV, & + ZRCS, ZRRS, ZRIS, ZRSS, ZRGS, ZRHS, ZTHS, & + ZUSW, ZRDRYG, ZRWETG) +! +!------------------------------------------------------------------------------- +! +! +!* 6. COMPUTES THE FAST COLD PROCESS SOURCES FOR r_h +! ---------------------------------------------- +! + IF ( KRR == 7 ) THEN + CALL RAIN_ICE_FAST_RH(GMICRO, ZRHODREF, ZRVT, ZRCT, ZRIT, ZRST, ZRGT, ZRHT, ZRHODJ, ZPRES, & + ZZT, ZLBDAS, ZLBDAG, ZLBDAH, ZLSFACT, ZLVFACT, ZCJ, ZKA, ZDV, & + ZRCS, ZRRS, ZRIS, ZRSS, ZRGS, ZRHS, ZTHS, ZUSW) + END IF +! +!------------------------------------------------------------------------------- +! +! +!* 7. COMPUTES SPECIFIC SOURCES OF THE WARM AND COLD CLOUDY SPECIES +! ------------------------------------------------------------- +! + CALL RAIN_ICE_FAST_RI(GMICRO, ZRHODREF, ZRIT, ZRHODJ, ZZT, ZSSI, ZLSFACT, ZLVFACT, & + ZAI, ZCJ, ZCIT, ZRCS, ZRIS, ZTHS) +! +! +!------------------------------------------------------------------------------- +! +! +! + DO JL=1,IMICRO + PRVS(I1(JL),I2(JL),I3(JL)) = ZRVS(JL) + PRCS(I1(JL),I2(JL),I3(JL)) = ZRCS(JL) + PRRS(I1(JL),I2(JL),I3(JL)) = ZRRS(JL) + PRIS(I1(JL),I2(JL),I3(JL)) = ZRIS(JL) + PRSS(I1(JL),I2(JL),I3(JL)) = ZRSS(JL) + PRGS(I1(JL),I2(JL),I3(JL)) = ZRGS(JL) + PTHS(I1(JL),I2(JL),I3(JL)) = ZTHS(JL) + PCIT(I1(JL),I2(JL),I3(JL)) = ZCIT(JL) + ! + PRAINFR(I1(JL),I2(JL),I3(JL)) = ZRF(JL) + END DO + IF ( KRR == 7 ) THEN + DO JL=1,IMICRO + PRHS(I1(JL),I2(JL),I3(JL)) = ZRHS(JL) + END DO + END IF +! +! +! + DEALLOCATE(ZZW1) + DEALLOCATE(ZDV) + DEALLOCATE(ZCJ) + DEALLOCATE(ZRDRYG) + DEALLOCATE(ZRWETG) + DEALLOCATE(ZLBDAG) + DEALLOCATE(ZLBDAH) + DEALLOCATE(ZLBDAS) + DEALLOCATE(ZLBDAR) + DEALLOCATE(ZLBDAR_RF) + DEALLOCATE(ZSSI) + DEALLOCATE(ZUSW) + DEALLOCATE(ZLVFACT) + DEALLOCATE(ZLSFACT) + DEALLOCATE(ZZW) + DEALLOCATE(ZEXNREF) + DEALLOCATE(ZPRES) + DEALLOCATE(ZRHODREF) + DEALLOCATE(ZZT) + IF(LBU_ENABLE .OR. LLES_CALL .OR. LCHECK ) DEALLOCATE(ZRHODJ) + DEALLOCATE(ZTHS) + DEALLOCATE(ZTHT) + DEALLOCATE(ZTHLT) + DEALLOCATE(ZRHS) + DEALLOCATE(ZRGS) + DEALLOCATE(ZRSS) + DEALLOCATE(ZRIS) + DEALLOCATE(ZRRS) + DEALLOCATE(ZRCS) + DEALLOCATE(ZRVS) + DEALLOCATE(ZCIT) + DEALLOCATE(ZRGT) + DEALLOCATE(ZRHT) + DEALLOCATE(ZRST) + DEALLOCATE(ZRIT) + DEALLOCATE(ZRRT) + DEALLOCATE(ZAI) + DEALLOCATE(ZRCT) + DEALLOCATE(ZKA) + DEALLOCATE(ZRVT) + DEALLOCATE(ZSIGMA_RC) + DEALLOCATE(ZCF) + DEALLOCATE(ZRF) + DEALLOCATE(ZHLC_HCF) + DEALLOCATE(ZHLC_LCF) + DEALLOCATE(ZHLC_HRC) + DEALLOCATE(ZHLC_LRC) + DEALLOCATE(ZHLC_RCMAX) + DEALLOCATE(ZRCRAUTC) + DEALLOCATE(ZHLC_HRCLOCAL) + DEALLOCATE(ZHLC_LRCLOCAL) +END IF +! +!------------------------------------------------------------------------------- +! +!* 8. COMPUTE THE SEDIMENTATION (RS) SOURCE +! ------------------------------------- +! +!* 8.1 time splitting loop initialization +! +! +! +IF (HSEDIM == 'STAT') THEN + CALL RAIN_ICE_SEDIMENTATION_STAT( IIB, IIE, IJB, IJE, IKB, IKE, IKTB, IKTE, IKT, KKL, KRR, & + PTSTEP, OSEDIC, PINPRC, PINDEP, & + PINPRR, PINPRS, PINPRG, PDZZ, PRHODREF, PPABST, PTHT, PRHODJ, PINPRR3D, & + PRCS, PRCT, PRRS, PRRT, PRIS, PRSS, PRST, PRGS, PRGT, & + PSEA, PTOWN, PINPRH, PRHS, PRHT, PFPR ) +ELSEIF (HSEDIM == 'SPLI') THEN + CALL RAIN_ICE_SEDIMENTATION_SPLIT(IIB, IIE, IJB, IJE, IKB, IKE, IKTB, IKTE, IKT, KKL,& + KSPLITR,PTSTEP, & + KRR,OSEDIC,LDEPOSC,PINPRC,PINDEP,PINPRR,PINPRS,PINPRG,PDZZ,PRHODREF,PPABST,PTHT,PRHODJ,& + PINPRR3D,PRCS,PRCT,PRRS,PRRT,PRIS,PRIT,PRSS,PRST,PRGS,PRGT,PSEA,PTOWN,PINPRH,PRHS,PRHT,PFPR) +ELSE + call Print_msg( NVERB_FATAL, 'GEN', 'RAIN_ICE', 'no sedimentation scheme for HSEDIM='//HSEDIM ) +END IF +!sedimentation of rain fraction +CALL ICE4_RAINFR_VERT(IIB, IIE, IIT, IJB, IJE, IJT, IKB, IKE, IKT, KKL, PRAINFR, PRRS(:,:,:)*PTSTEP, & + PRSS(:,:,:)*PTSTEP, PRGS(:,:,:)*PTSTEP) +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE RAIN_ICE diff --git a/src/mesonh/micro/rain_ice_elec.f90 b/src/mesonh/micro/rain_ice_elec.f90 new file mode 100644 index 000000000..69721492d --- /dev/null +++ b/src/mesonh/micro/rain_ice_elec.f90 @@ -0,0 +1,5849 @@ +!MNH_LIC Copyright 2002-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ######################### + MODULE MODI_RAIN_ICE_ELEC +! ######################### +! +INTERFACE + SUBROUTINE RAIN_ICE_ELEC (OSEDIC, HSUBG_AUCV, OWARM, & + KSPLITR, PTSTEP, KMI, KRR, & + PZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR, & + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, & + PRGT, PTHS, PRVS, PRCS, PRRS, PRIS, PRSS, PRGS, & + PINPRC, PINPRR, PINPRR3D, PEVAP3D, & + PINPRS, PINPRG, PSIGS, & + PQPIT, PQCT, PQRT, PQIT, PQST, PQGT, PQNIT, & + PQPIS, PQCS, PQRS, PQIS, PQSS, PQGS, PQNIS, & + PSEA, PTOWN, & + PRHT, PRHS, PINPRH, PQHT, PQHS ) +! +! +LOGICAL, INTENT(IN) :: OSEDIC ! Switch for droplet sedim. +CHARACTER(LEN=4), INTENT(IN) :: HSUBG_AUCV + ! Kind of Subgrid autoconversion method +LOGICAL, INTENT(IN) :: OWARM ! .TRUE. allows raindrops to + ! form by warm processes + ! (Kessler scheme) +! +INTEGER, INTENT(IN) :: KSPLITR ! Number of small time step + ! integration for rain sedimendation +REAL, INTENT(IN) :: PTSTEP ! Double Time step + ! (single if cold start) +INTEGER, INTENT(IN) :: KMI ! Model index +INTEGER, INTENT(IN) :: KRR ! Number of moist variable +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! absolute pressure at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIT ! Pristine ice n.c. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCLDFR ! Cloud fraction +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRIT ! Pristine ice m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGT ! Graupel/hail m.r. at t +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSIGS ! Sigma_s at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVS ! Water vapor m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRRS ! Rain water m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRSS ! Snow/aggregate m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRGS ! Graupel m.r. source +! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRC ! Cloud instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRR ! Rain instant precip +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRR3D ! Rain inst precip 3D +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEVAP3D ! Rain evap profile +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRS ! Snow instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRG ! Graupel instant precip +! +! Charge Mixing Ratio (CMR) (C/kg) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PQPIT ! Positive ion (Nb/kg) at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PQNIT ! Negative ion (Nb/kg) at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PQCT ! Cloud water CMR at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PQRT ! Rain water CMR at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PQIT ! Pristine ice CMR at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PQST ! Snow/aggregate CMR at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PQGT ! Graupel CMR at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PQPIS ! Positive ion source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PQNIS ! Negative ion source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PQCS ! Cloud water CMR source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PQRS ! Rain water CMR source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PQIS ! Pristine ice CMR source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PQSS ! Snow/aggregate CMR source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PQGS ! Graupel CMR source +! +REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA +REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(INOUT) :: PRHS ! Hail m.r. source +REAL, DIMENSION(:,:), OPTIONAL, INTENT(INOUT) :: PINPRH ! Hail instant precip +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PQHT ! Hail CMR at t +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(INOUT) :: PQHS ! Hail CMR source +! +END SUBROUTINE RAIN_ICE_ELEC +END INTERFACE +END MODULE MODI_RAIN_ICE_ELEC +! +! ######spl + SUBROUTINE RAIN_ICE_ELEC (OSEDIC, HSUBG_AUCV, OWARM, & + KSPLITR, PTSTEP, KMI, KRR, & + PZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR, & + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, & + PRGT, PTHS, PRVS, PRCS, PRRS, PRIS, PRSS, PRGS, & + PINPRC, PINPRR, PINPRR3D, PEVAP3D, & + PINPRS, PINPRG, PSIGS, & + PQPIT, PQCT, PQRT, PQIT, PQST, PQGT, PQNIT, & + PQPIS, PQCS, PQRS, PQIS, PQSS, PQGS, PQNIS, & + PSEA, PTOWN, & + PRHT, PRHS, PINPRH, PQHT, PQHS ) +! ###################################################################### +! +!!**** * - compute the explicit microphysical sources +!! and the cloud electrification +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the slow microphysical sources +!! which can be computed explicitly +!! +!! +!!** METHOD +!! ------ +!! The autoconversion computation follows Kessler (1969). +!! The sedimentation rate is computed with a time spliting technique and +!! an upstream scheme, written as a difference of non-advective fluxes. This +!! source term is added to the future instant ( split-implicit process ). +!! The others microphysical processes are evaluated at the central instant +!! (split-explicit process ): autoconversion, accretion and rain evaporation. +!! These last 3 terms are bounded in order not to create negative values +!! for the water species at the future instant. +!! +!! EXTERNAL +!! -------- +!! None +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_PARAMETERS +!! JPHEXT : Horizontal external points number +!! JPVEXT : Vertical external points number +!! Module MODD_CONF : +!! CCONF configuration of the model for the first time step +!! Module MODD_CST +!! XP00 ! Reference pressure +!! XRD,XRV ! Gaz constant for dry air, vapor +!! XMD,XMV ! Molecular weight for dry air, vapor +!! XCPD ! Cpd (dry air) +!! XCL ! Cl (liquid) +!! XCI ! Ci (solid) +!! XTT ! Triple point temperature +!! XLVTT ! Vaporization heat constant +!! XALPW,XBETAW,XGAMW ! Constants for saturation vapor pressure +!! function over liquid water +!! XALPI,XBETAI,XGAMI ! Constants for saturation vapor pressure +!! function over solid ice +!! +!! REFERENCE +!! --------- +!! +!! +!! +!! AUTHOR +!! ------ +!! C. Barthe, G. Molinie, J.-P. Pinty * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original 2002 +!! Modifications +!! C. Barthe (LACy) Nov. 2009 : update to V4.8.1 +!! M. Chong 26/01/10 Add Small ions parameters +!! J-P Pinty 31/03/11 Add hail +!! C. Lac 2011 : Adaptation to FIT temporal scheme +!! B. Tsenova June 2012 Add new NI parameterizations +!! C. Barthe June 2012 Dependance of RAR on the RELATIVE terminal velocity +!! M. Chong 06/08/13 Add "Beard" effect (ELEC=>MICROPHYSICS) +!! J-P Pinty 21/08/13 Correction of the process limitation algo. +!! SIGN(MIN(ABS ... +!! Correction in elec_update_qd +!! Correction of hail charge transfer +!! Add hail growth charging processes +!! J-P Pinty 26/08/13 Add "Beard" effect control (ELEC=>MICROPHYS) +!! for sedimentation +!! J-P Pinty 26/09/13 Add tabulated treatment of SAUN1 and SAUN2 +!! J-P Pinty 30/09/13 Remove call to MOMG function +!! J-P Pinty 25/10/13 Add "Latham" effect for aggregation process +!! M. Chong 31/10/13 Add other tabulated treatment and recode +!! M. Chong 15/11/13 Bug in the computation of RGWETH (wrong sign) +!! J-P Pinty 25/04/14 Many bugs with ZWQ1(:,...) = 0.0 +!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 +!! J.Escobar : 10/2017 : for real*4 , limit exp() in RAIN_ICE_ELEC_SLOW with XMNH_HUGE_12_LOG +! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 +! P. Wautelet 03/2020: use the new data structures and subroutines for budgets +! P .Wautelet 09/03/2020: add missing budgets for electricity +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +use modd_budget, only: lbu_enable, & + lbudget_th, lbudget_rv, lbudget_rc, lbudget_rr, lbudget_ri, & + lbudget_rs, lbudget_rg, lbudget_rh, lbudget_sv, & + NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, NBUDGET_RR, NBUDGET_RI, & + NBUDGET_RS, NBUDGET_RG, NBUDGET_RH, NBUDGET_SV1, & + tbudgets +USE MODD_CONF +USE MODD_CST +USE MODD_ELEC_DESCR +USE MODD_ELEC_n +USE MODD_ELEC_PARAM +USE MODD_LES +USE MODE_ll +USE MODD_NSV, ONLY: NSV_ELECBEG, NSV_ELECEND ! Scalar variables for budgets +USE MODD_PARAMETERS +USE MODD_PARAM_ICE +USE MODD_RAIN_ICE_DESCR +USE MODD_RAIN_ICE_PARAM +USE MODD_REF, ONLY: XTHVREFZ + +use mode_budget, only: Budget_store_add, Budget_store_init, Budget_store_end +#ifdef MNH_PGI +USE MODE_PACK_PGI +#endif +use mode_tools, only: Countjv + +USE MODI_MOMG + +IMPLICIT NONE +! +! +!* 0.1 Declarations of dummy arguments : +! +LOGICAL, INTENT(IN) :: OSEDIC ! Switch for droplet sedim. +CHARACTER(LEN=4), INTENT(IN) :: HSUBG_AUCV + ! Kind of Subgrid autoconversion method +LOGICAL, INTENT(IN) :: OWARM ! .TRUE. allows raindrops to + ! form by warm processes + ! (Kessler scheme) +! +INTEGER, INTENT(IN) :: KSPLITR ! Number of small time step + ! integration for rain sedimendation +REAL, INTENT(IN) :: PTSTEP ! Double Time step + ! (single if cold start) +INTEGER, INTENT(IN) :: KMI ! Model index +INTEGER, INTENT(IN) :: KRR ! Number of moist variable +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! absolute pressure at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIT ! Pristine ice n.c. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCLDFR! Convective Mass Flux Cloud fraction +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRIT ! Pristine ice m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGT ! Graupel/hail m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSIGS ! Sigma_s at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVS ! Water vapor m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRRS ! Rain water m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRSS ! Snow/aggregate m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRGS ! Graupel m.r. source +! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRC ! Cloud instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRR ! Rain instant precip +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRR3D ! Rain inst precip 3D +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEVAP3D ! Rain evap profile +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRS ! Snow instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRG ! Graupel instant precip +! +! Charge Mixing Ratio (CMR) (C/kg) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PQPIT ! Positive ion (Nb/kg) at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PQNIT ! Negative ion (Nb/kg) at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PQCT ! Cloud water CMR at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PQRT ! Rain water CMR at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PQIT ! Pristine ice CMR at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PQST ! Snow/aggregate CMR at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PQGT ! Graupel CMR at t +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PQPIS ! Positive ion source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PQNIS ! Negative ion source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PQCS ! Cloud water CMR source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PQRS ! Rain water CMR source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PQIS ! Pristine ice CMR source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PQSS ! Snow/aggregate CMR source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PQGS ! Graupel CMR source +! +REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA +REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(INOUT) :: PRHS ! Hail m.r. source +REAL, DIMENSION(:,:), OPTIONAL, INTENT(INOUT) :: PINPRH ! Hail instant precip +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PQHT ! Hail CMR at t +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(INOUT) :: PQHS ! Hail CMR source +! +! +!* 0.2 Declarations of local variables : +! +INTEGER :: JK ! Vertical loop index for the rain sedimentation +INTEGER :: JN ! Temporal loop index for the rain sedimentation +INTEGER :: JJ ! Loop index for the interpolation +INTEGER :: JI ! Loop index for the interpolation +INTEGER :: IIB ! Define the domain where is +INTEGER :: IIE ! the microphysical sources have to be computed +INTEGER :: IJB ! +INTEGER :: IJE ! +INTEGER :: IKB ! +INTEGER :: IKE ! +! +REAL :: ZTSPLITR ! Small time step for rain sedimentation +! +! +INTEGER :: ISEDIMR,ISEDIMC, ISEDIMI, ISEDIMS, ISEDIMG, ISEDIMH, & + INEGT, IMICRO ! Case number of sedimentation, T>0 (for HEN) + ! and r_x>0 locations +INTEGER :: IGRIM, IGACC, IGDRY ! Case number of riming, accretion and dry growth + ! locations +INTEGER :: IGWET, IHAIL ! wet growth locations and case number +! +LOGICAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) & + :: GSEDIMR, GSEDIMC, GSEDIMI, GSEDIMS, GSEDIMG, GSEDIMH ! Test where to compute the SED processes +LOGICAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) & + :: GNEGT ! Test where to compute the HEN process +LOGICAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) & + :: GMICRO ! Test where to compute all processes +LOGICAL, DIMENSION(:), ALLOCATABLE :: GRIM ! Test where to compute riming +LOGICAL, DIMENSION(:), ALLOCATABLE :: GACC ! Test where to compute accretion +LOGICAL, DIMENSION(:), ALLOCATABLE :: GDRY ! Test where to compute dry growth +LOGICAL, DIMENSION(:), ALLOCATABLE :: GWET ! Test where to compute wet growth +LOGICAL, DIMENSION(:), ALLOCATABLE :: GHAIL ! Test where to compute hail growth +! +INTEGER, DIMENSION(:), ALLOCATABLE :: IVEC1,IVEC2 ! Vectors of indices for + ! interpolations +REAL, DIMENSION(:), ALLOCATABLE :: ZVEC1,ZVEC2,ZVEC3 ! Work vectors for + ! interpolations +REAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) & + :: ZW ! work array +REAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) & + :: ZPRCS, ZPRRS, ZPRSS, ZPRGS, ZPRHS ! Mixing ratios created during the time step +REAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) & + :: ZWSED ! sedimentation fluxes +REAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) & + :: ZWSEDW1 ! sedimentation speed +REAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) & + :: ZWSEDW2 ! sedimentation speed +REAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2)) & + :: ZCONC_TMP ! Weighted concentration +REAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) & + :: ZT ! Temperature +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) :: & + ZRAY, & ! Cloud Mean radius + ZLBC, & ! XLBC weighted by sea fraction + ZFSEDC +REAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) & + :: ZPQRS, ZPQSS, ZPQGS, ZPQHS ! Charge Mixing ratios created during the time step +REAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) & + :: ZWSEDQ ! sedimentation fluxes for charge +REAL, DIMENSION(:), ALLOCATABLE :: ZRVT ! Water vapor m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRCT ! Cloud water m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRRT ! Rain water m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRIT ! Pristine ice m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRGT ! Graupel m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRHT ! Hail m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZCIT ! Pristine ice conc. at t +! +REAL, DIMENSION(:), ALLOCATABLE :: ZRVS ! Water vapor m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRCS ! Cloud water m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRRS ! Rain water m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRIS ! Pristine ice m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRSS ! Snow/aggregate m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRGS ! Graupel m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRHS ! Hail m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZTHS ! Theta source +REAL, DIMENSION(:), ALLOCATABLE :: ZCRIAUTI ! Snow-to-ice autoconversion thres. +! +REAL, DIMENSION(:), ALLOCATABLE & + :: ZRHODREF, & ! RHO Dry REFerence + ZRHODREFC,& ! RHO Dry REFerence + ZRHODREFR,& ! RHO Dry REFerence + ZRHODREFI,& ! RHO Dry REFerence + ZRHODREFS,& ! RHO Dry REFerence + ZRHODREFG,& ! RHO Dry REFerence + ZRHODREFH,& ! RHO Dry REFerence + ZRHODJ, & ! RHO times Jacobian + ZZT, & ! Temperature + ZPRES, & ! Pressure + ZEXNREF, & ! EXNer Pressure REFerence + ZZW, & ! Work array + ZLSFACT, & ! L_s/(Pi_ref*C_ph) + ZLVFACT, & ! L_v/(Pi_ref*C_ph) + ZUSW, & ! Undersaturation over water + ZSSI, & ! Supersaturation over ice + ZLBDAI, & ! Slope parameter of the pristine ice distribution + ZLBDAR, & ! Slope parameter of the raindrop distribution + ZLBDAS, & ! Slope parameter of the aggregate distribution + ZLBDAG, & ! Slope parameter of the graupel distribution + ZLBDAH, & ! Slope parameter of the hail distribution + ZRDRYG, & ! Dry growth rate of the graupeln + ZRWETG, & ! Wet growth rate of the graupeln + ZAI, & ! Thermodynamical function + ZCJ, & ! Function to compute the ventilation coefficient + ZKA, & ! Thermal conductivity of the air + ZDV, & ! Diffusivity of water vapor in the air + ZSIGMA_RC,& ! Standard deviation of rc at time t + ZCF, & ! Cloud fraction + ZCC, & ! terminal velocity + ZFSEDC1D, & ! For cloud sedimentation + ZWLBDC, & ! Slope parameter of the droplet distribution + ZCONC, & ! Concentration des aérosols + ZRAY1D, & ! Mean radius + ZWLBDA ! Libre parcours moyen +REAL, DIMENSION(:,:), ALLOCATABLE :: ZZW1 ! Work arrays +REAL :: ZTIMAUTIC +REAL, DIMENSION(SIZE(XRTMIN)) :: ZRTMIN +! +INTEGER , DIMENSION(SIZE(GMICRO)) :: I1,I2,I3 ! Used to replace the COUNT +INTEGER :: JL ! and PACK intrinsics +! +LOGICAL, DIMENSION(:,:),ALLOCATABLE :: GELEC ! Logical of work for elec +REAL, DIMENSION(:), ALLOCATABLE :: ZRSMIN_ELEC ! Limit value of ZRXS where charge is available +REAL, DIMENSION(:), ALLOCATABLE :: ZVECQ4, & ! Work + ZVECQ5, & ! vectors for + ZVECQ6, & ! interpolations + ZVECQ7 ! (electrification) +REAL, DIMENSION(:,:), ALLOCATABLE :: ZWQ1 ! Work array for electrification +REAL, DIMENSION(:), ALLOCATABLE :: ZWQ3,ZWQ4 ! Work arrays for electrification + +REAL, DIMENSION(:), ALLOCATABLE :: ZQPIT ! Positive ion (kg^-1) at t +REAL, DIMENSION(:), ALLOCATABLE :: ZQNIT ! Negative ion (kg^-1) at t +REAL, DIMENSION(:), ALLOCATABLE :: ZQCT ! Cloud water CMR at t +REAL, DIMENSION(:), ALLOCATABLE :: ZQRT ! Rain water m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZQIT ! Pristine ice CMR at t +REAL, DIMENSION(:), ALLOCATABLE :: ZQST ! Snow/aggregate CMR at t +REAL, DIMENSION(:), ALLOCATABLE :: ZQGT ! Graupel CMR at t +REAL, DIMENSION(:), ALLOCATABLE :: ZQHT ! Hail CMR at t +! +REAL, DIMENSION(:), ALLOCATABLE :: ZQPIS ! Positive ion source +REAL, DIMENSION(:), ALLOCATABLE :: ZQNIS ! Negative ion source +REAL, DIMENSION(:), ALLOCATABLE :: ZQCS ! Cloud water CMR source +REAL, DIMENSION(:), ALLOCATABLE :: ZQRS ! Rain water CMR source +REAL, DIMENSION(:), ALLOCATABLE :: ZQIS ! Pristine ice CMR source +REAL, DIMENSION(:), ALLOCATABLE :: ZQSS ! Snow/aggregate CMR source +REAL, DIMENSION(:), ALLOCATABLE :: ZQGS ! Graupel CMR source +REAL, DIMENSION(:), ALLOCATABLE :: ZQHS ! Hail CMR source +! +! Charge diameter relation +REAL, DIMENSION(:), ALLOCATABLE :: ZECT ! Cloud water at t +REAL, DIMENSION(:), ALLOCATABLE :: ZERT ! Rain water at t +REAL, DIMENSION(:), ALLOCATABLE :: ZEIT ! Pristine ice at t +REAL, DIMENSION(:), ALLOCATABLE :: ZEST ! Snow/aggregate at t +REAL, DIMENSION(:), ALLOCATABLE :: ZEGT ! Graupel at t +REAL, DIMENSION(:), ALLOCATABLE :: ZEHT ! Hail at t +! +REAL, DIMENSION(:), ALLOCATABLE :: ZECS ! Cloud water at t+dt +REAL, DIMENSION(:), ALLOCATABLE :: ZERS ! Rain water at t+dt +REAL, DIMENSION(:), ALLOCATABLE :: ZEIS ! Pristine ice at t+dt +REAL, DIMENSION(:), ALLOCATABLE :: ZESS ! Snow/aggregate at t+dt +REAL, DIMENSION(:), ALLOCATABLE :: ZEGS ! Graupel at t+dt +REAL, DIMENSION(:), ALLOCATABLE :: ZEHS ! Hail at t+dt +! +REAL, DIMENSION(:), ALLOCATABLE :: ZDELTALWC ! Gap between LWC and a critical LWC +REAL, DIMENSION(:), ALLOCATABLE :: ZLWCC ! Critical LWC in NI charging +REAL, DIMENSION(:), ALLOCATABLE :: ZFT ! Fct depending on temperature +! +! Non-inductive charging process following Saunders et al. (1991) / EW +REAL, DIMENSION(:), ALLOCATABLE :: ZEW ! Effective liquid water content +REAL, DIMENSION(:), ALLOCATABLE :: ZSAUNSK ! constant B _______________________ +REAL, DIMENSION(:), ALLOCATABLE :: ZSAUNIM ! d_i exponent ____________________ +REAL, DIMENSION(:), ALLOCATABLE :: ZSAUNIN ! v_g/s-v_i________________________ +REAL, DIMENSION(:), ALLOCATABLE :: ZSAUNSM ! d_s exponent ____________________ +REAL, DIMENSION(:), ALLOCATABLE :: ZSAUNSN ! v_g-v_s _________________________ +REAL, DIMENSION(:), ALLOCATABLE :: ZFQIAGGS, ZFQIDRYGBS +REAL, DIMENSION(:), ALLOCATABLE :: ZLBQSDRYGB1S, ZLBQSDRYGB2S, ZLBQSDRYGB3S +! +! Non-inductive charging process following Saunders and Peck (1998) / RAR +REAL, DIMENSION(:), ALLOCATABLE :: ZVGMEAN ! Mean velocity of graupel +REAL, DIMENSION(:), ALLOCATABLE :: ZVSMEAN ! Mean velocity of snow +REAL, DIMENSION(:), ALLOCATABLE :: ZRHOCOR ! Density correction for fallspeed +REAL, DIMENSION(:), ALLOCATABLE :: ZRAR ! Rime accretion rate +REAL, DIMENSION(:), ALLOCATABLE :: ZRAR_CRIT ! Critical RAR +REAL, DIMENSION(:), ALLOCATABLE :: ZDQRAR_IS ! q= f(RAR,T) in Saunders and Peck's equation +REAL, DIMENSION(:), ALLOCATABLE :: ZSAUNIM_IS ! d_i exponent ____________________ +REAL, DIMENSION(:), ALLOCATABLE :: ZSAUNIN_IS ! v_g/s-v_i________________________ +REAL, DIMENSION(:), ALLOCATABLE :: ZDQRAR_IG ! q= f(RAR,T) in Saunders and Peck's equation +REAL, DIMENSION(:), ALLOCATABLE :: ZSAUNIM_IG ! d_i exponent ____________________ +REAL, DIMENSION(:), ALLOCATABLE :: ZSAUNIN_IG ! v_g/s-v_i________________________ +REAL, DIMENSION(:), ALLOCATABLE :: ZDQRAR_SG ! q= f(RAR,T) in Saunders and Peck's equation +REAL, DIMENSION(:), ALLOCATABLE :: ZSAUNSK_SG ! constant B _______________________ +REAL, DIMENSION(:), ALLOCATABLE :: ZSAUNSM_SG ! d_s exponent ____________________ +REAL, DIMENSION(:), ALLOCATABLE :: ZSAUNSN_SG ! v_g-v_s _________________________ +! +! Non-inductive charging process following Takahashi (1978) +INTEGER :: IGTAKA ! Case number of charge separation for Takahashi param. +LOGICAL, DIMENSION(:), ALLOCATABLE :: GTAKA ! Test where to compute charge + ! separation for Takahashi param. +REAL, DIMENSION(:), ALLOCATABLE :: ZDQTAKA_OPT ! Optimized array of separated charge +! +INTEGER :: IGSAUN ! Case number of charge separation for Saunders param. +LOGICAL, DIMENSION(:), ALLOCATABLE :: GSAUN ! Test where to compute charge + ! separation for Saunders param. +REAL, DIMENSION(:), ALLOCATABLE :: ZDQLWC_OPT ! Optimized array of separated charge +REAL, DIMENSION(:), ALLOCATABLE :: ZDQLWC ! q=f(LWC,T) +! +! Inductive charging process (Ziegler et al., 1991) +INTEGER :: IIND ! Case number of inductive process +LOGICAL, DIMENSION(:), ALLOCATABLE :: GIND ! Test where to compute inductive process +REAL, DIMENSION(:), ALLOCATABLE :: ZRATE_IND ! Charge transfer rate during inductive process +REAL, DIMENSION(:), ALLOCATABLE :: ZEFIELDW ! Vertical component of the electric field +! +! Latham's effect +REAL, DIMENSION(:), ALLOCATABLE :: ZLATHAMIAGGS ! E Function to simulate + ! enhancement of IAGGS +REAL, DIMENSION(:), ALLOCATABLE :: ZEFIELDU ! Horiz. component of the electric field +REAL, DIMENSION(:), ALLOCATABLE :: ZEFIELDV ! Horiz. component of the electric field +! +REAL, DIMENSION(:), ALLOCATABLE :: ZLIMIT, ZAUX, ZAUX1 +REAL, DIMENSION(:), ALLOCATABLE :: ZCOLIS ! Collection efficiency between ice and snow +REAL, DIMENSION(:), ALLOCATABLE :: ZCOLIG ! Collection efficiency between ice and graupeln +REAL, DIMENSION(:), ALLOCATABLE :: ZCOLSG ! Collection efficiency between snow and graupeln +REAL :: ZRHO00, ZCOR00 ! Surface reference air density +! +!------------------------------------------------------------------------------- +! +!* 1. COMPUTE THE LOOP BOUNDS +! ----------------------- +! +CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) +IKB = 1 + JPVEXT +IKE = SIZE(PZZ,3) - JPVEXT +! +ZRHO00 = XP00 / (XRD * XTHVREFZ(IKB)) +ZCOR00 = ZRHO00**XCEXVT +! +! +!* 2. COMPUTES THE SLOW COLD PROCESS SOURCES +! -------------------------------------- +! +!* 2.1 compute the ice nucleation +! +CALL RAIN_ICE_ELEC_NUCLEATION +! +! +!* 2.2 allocations +! +! optimization by looking for locations where +! the microphysical fields are larger than a minimal value only !!! +! +GMICRO(:,:,:) = .FALSE. + +IF ( KRR == 7 ) THEN + GMICRO(IIB:IIE,IJB:IJE,IKB:IKE) = & + PRCT(IIB:IIE,IJB:IJE,IKB:IKE) > XRTMIN(2) .OR. & + PRRT(IIB:IIE,IJB:IJE,IKB:IKE) > XRTMIN(3) .OR. & + PRIT(IIB:IIE,IJB:IJE,IKB:IKE) > XRTMIN(4) .OR. & + PRST(IIB:IIE,IJB:IJE,IKB:IKE) > XRTMIN(5) .OR. & + PRGT(IIB:IIE,IJB:IJE,IKB:IKE) > XRTMIN(6) .OR. & + PRHT(IIB:IIE,IJB:IJE,IKB:IKE) > XRTMIN(7) +ELSE IF( KRR == 6 ) THEN + GMICRO(IIB:IIE,IJB:IJE,IKB:IKE) = & + PRCT(IIB:IIE,IJB:IJE,IKB:IKE) > XRTMIN(2) .OR. & + PRRT(IIB:IIE,IJB:IJE,IKB:IKE) > XRTMIN(3) .OR. & + PRIT(IIB:IIE,IJB:IJE,IKB:IKE) > XRTMIN(4) .OR. & + PRST(IIB:IIE,IJB:IJE,IKB:IKE) > XRTMIN(5) .OR. & + PRGT(IIB:IIE,IJB:IJE,IKB:IKE) > XRTMIN(6) +END IF + +IMICRO = COUNTJV( GMICRO(:,:,:),I1(:),I2(:),I3(:)) +! +IF (IMICRO > 0) THEN + ALLOCATE(ZRVT(IMICRO)) + ALLOCATE(ZRCT(IMICRO)) + ALLOCATE(ZRRT(IMICRO)) + ALLOCATE(ZRIT(IMICRO)) + ALLOCATE(ZRST(IMICRO)) + ALLOCATE(ZRGT(IMICRO)) + IF (KRR == 7) ALLOCATE(ZRHT(IMICRO)) + ALLOCATE(ZCIT(IMICRO)) + ALLOCATE(ZRVS(IMICRO)) + ALLOCATE(ZRCS(IMICRO)) + ALLOCATE(ZRRS(IMICRO)) + ALLOCATE(ZRIS(IMICRO)) + ALLOCATE(ZRSS(IMICRO)) + ALLOCATE(ZRGS(IMICRO)) + IF (KRR == 7) ALLOCATE(ZRHS(IMICRO)) + ALLOCATE(ZTHS(IMICRO)) + ALLOCATE(ZRHODREF(IMICRO)) + ALLOCATE(ZZT(IMICRO)) + ALLOCATE(ZPRES(IMICRO)) + ALLOCATE(ZEXNREF(IMICRO)) + ALLOCATE(ZSIGMA_RC(IMICRO)) + ALLOCATE(ZCF(IMICRO)) + DO JL = 1, IMICRO + ZRVT(JL) = PRVT(I1(JL),I2(JL),I3(JL)) + ZRCT(JL) = PRCT(I1(JL),I2(JL),I3(JL)) + ZRRT(JL) = PRRT(I1(JL),I2(JL),I3(JL)) + ZRIT(JL) = PRIT(I1(JL),I2(JL),I3(JL)) + ZRST(JL) = PRST(I1(JL),I2(JL),I3(JL)) + ZRGT(JL) = PRGT(I1(JL),I2(JL),I3(JL)) + IF (KRR == 7) ZRHT(JL) = PRHT(I1(JL),I2(JL),I3(JL)) + ZCIT(JL) = PCIT(I1(JL),I2(JL),I3(JL)) + IF (HSUBG_AUCV == 'SIGM') THEN + ZSIGMA_RC(JL) = PSIGS(I1(JL),I2(JL),I3(JL)) * 2. + ELSE IF (HSUBG_AUCV == 'CLFR') THEN + ZCF(JL) = PCLDFR(I1(JL),I2(JL),I3(JL)) + END IF +! + ZRVS(JL) = PRVS(I1(JL),I2(JL),I3(JL)) + ZRCS(JL) = PRCS(I1(JL),I2(JL),I3(JL)) + ZRRS(JL) = PRRS(I1(JL),I2(JL),I3(JL)) + ZRIS(JL) = PRIS(I1(JL),I2(JL),I3(JL)) + ZRSS(JL) = PRSS(I1(JL),I2(JL),I3(JL)) + ZRGS(JL) = PRGS(I1(JL),I2(JL),I3(JL)) + IF (KRR == 7) ZRHS(JL) = PRHS(I1(JL),I2(JL),I3(JL)) + ZTHS(JL) = PTHS(I1(JL),I2(JL),I3(JL)) +! + ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) + ZZT(JL) = ZT(I1(JL),I2(JL),I3(JL)) + ZPRES(JL) = PPABST(I1(JL),I2(JL),I3(JL)) + ZEXNREF(JL) = PEXNREF(I1(JL),I2(JL),I3(JL)) + ENDDO +! + ALLOCATE(ZRHOCOR(IMICRO)) + ZRHOCOR(:) = (ZRHO00 / ZRHODREF(:))**XCEXVT +! + ALLOCATE(ZZW(IMICRO)) + ALLOCATE(ZLSFACT(IMICRO)) + ALLOCATE(ZLVFACT(IMICRO)) +! + ZZW(:) = ZEXNREF(:)*( XCPD+XCPV*ZRVT(:)+XCL*(ZRCT(:)+ZRRT(:)) & + +XCI*(ZRIT(:)+ZRST(:)+ZRGT(:)) ) + ZLSFACT(:) = (XLSTT+(XCPV-XCI)*(ZZT(:)-XTT))/ZZW(:) ! L_s/(Pi_ref*C_ph) + ZLVFACT(:) = (XLVTT+(XCPV-XCL)*(ZZT(:)-XTT))/ZZW(:) ! L_v/(Pi_ref*C_ph) +! + ALLOCATE(ZUSW(IMICRO)) + ALLOCATE(ZSSI(IMICRO)) +! + ZZW(:) = EXP( XALPI - XBETAI/ZZT(:) - XGAMI*ALOG(ZZT(:) ) ) + ZSSI(:) = ZRVT(:)*( ZPRES(:)-ZZW(:) ) / ( (XMV/XMD) * ZZW(:) ) - 1.0 + ! Supersaturation over ice +! + IF (KRR == 7) THEN + ALLOCATE(ZRSMIN_ELEC(7)) + ELSE + ALLOCATE(ZRSMIN_ELEC(6)) + END IF + ZRSMIN_ELEC(:) = XRTMIN_ELEC(:) / PTSTEP +! + ALLOCATE(ZLBDAR(IMICRO)) + ALLOCATE(ZLBDAS(IMICRO)) + ALLOCATE(ZLBDAG(IMICRO)) + IF (KRR == 7) ALLOCATE(ZLBDAH(IMICRO)) + ALLOCATE(ZRDRYG(IMICRO)) + ALLOCATE(ZRWETG(IMICRO)) + ALLOCATE(ZAI(IMICRO)) + ALLOCATE(ZCJ(IMICRO)) + ALLOCATE(ZKA(IMICRO)) + ALLOCATE(ZDV(IMICRO)) +! + IF (KRR == 7) THEN + ALLOCATE(ZZW1(IMICRO,7)) + ELSE IF(KRR == 6) THEN + ALLOCATE(ZZW1(IMICRO,6)) + ENDIF +! + IF (LBU_ENABLE .OR. LLES_CALL) THEN + ALLOCATE(ZRHODJ(IMICRO)) + DO JL=1,IMICRO + ZRHODJ(JL) = PRHODJ(I1(JL),I2(JL),I3(JL)) + END DO + END IF +! + ALLOCATE( ZECT(IMICRO) ) + ALLOCATE( ZERT(IMICRO) ) + ALLOCATE( ZEIT(IMICRO) ) + ALLOCATE( ZEST(IMICRO) ) + ALLOCATE( ZEGT(IMICRO) ) + IF ( KRR == 7 ) ALLOCATE(ZEHT(IMICRO)) + ALLOCATE( ZECS(IMICRO) ) + ALLOCATE( ZERS(IMICRO) ) + ALLOCATE( ZEIS(IMICRO) ) + ALLOCATE( ZESS(IMICRO) ) + ALLOCATE( ZEGS(IMICRO) ) + IF ( KRR == 7 ) ALLOCATE(ZEHS(IMICRO)) + ALLOCATE( ZQPIT(IMICRO) ) + ALLOCATE( ZQNIT(IMICRO) ) + ALLOCATE( ZQCT(IMICRO) ) + ALLOCATE( ZQRT(IMICRO) ) + ALLOCATE( ZQIT(IMICRO) ) + ALLOCATE( ZQST(IMICRO) ) + ALLOCATE( ZQGT(IMICRO) ) + IF ( KRR == 7 ) ALLOCATE(ZQHT(IMICRO)) + ALLOCATE( ZQPIS(IMICRO) ) + ALLOCATE( ZQNIS(IMICRO) ) + ALLOCATE( ZQCS(IMICRO) ) + ALLOCATE( ZQRS(IMICRO) ) + ALLOCATE( ZQIS(IMICRO) ) + ALLOCATE( ZQSS(IMICRO) ) + ALLOCATE( ZQGS(IMICRO) ) + IF ( KRR == 7 ) ALLOCATE(ZQHS(IMICRO)) +! + IF (CNI_CHARGING == 'GARDI') THEN + ALLOCATE( ZDELTALWC(IMICRO) ) + ALLOCATE( ZFT(IMICRO) ) + END IF +! + IF (CNI_CHARGING == 'SAUN1' .OR. CNI_CHARGING == 'SAUN2' .OR. & + CNI_CHARGING == 'TAKAH' .OR. & + CNI_CHARGING == 'BSMP1' .OR. CNI_CHARGING == 'BSMP2' .OR. & + CNI_CHARGING == 'TEEWC' .OR. CNI_CHARGING == 'TERAR') THEN + ALLOCATE( ZEW(IMICRO) ) + END IF + + IF (CNI_CHARGING == 'SAUN1' .OR. CNI_CHARGING == 'SAUN2') THEN + ALLOCATE( ZLWCC(IMICRO) ) + END IF +! + IF (CNI_CHARGING == 'SAUN1' .OR. CNI_CHARGING == 'SAUN2' .OR. & + CNI_CHARGING == 'TAKAH' .OR. CNI_CHARGING == 'TEEWC') THEN + ALLOCATE( ZDQLWC(IMICRO) ) + END IF +! + IF (CNI_CHARGING == 'SAUN1' .OR. CNI_CHARGING == 'SAUN2' .OR. & + CNI_CHARGING == 'TEEWC' ) THEN + ALLOCATE( ZSAUNSK(IMICRO) ) + ALLOCATE( ZSAUNIM(IMICRO) ) + ALLOCATE( ZSAUNIN(IMICRO) ) + ALLOCATE( ZSAUNSM(IMICRO) ) + ALLOCATE( ZSAUNSN(IMICRO) ) + END IF +! + IF (CNI_CHARGING == 'SAUN1' .OR. CNI_CHARGING == 'SAUN2' .OR. & + CNI_CHARGING == 'SAP98' .OR. & + CNI_CHARGING == 'BSMP1' .OR. CNI_CHARGING == 'BSMP2' .OR. & + CNI_CHARGING == 'TEEWC' .OR. CNI_CHARGING == 'TERAR') THEN + ALLOCATE( ZFQIAGGS(IMICRO) ) + ALLOCATE( ZFQIDRYGBS(IMICRO) ) + ALLOCATE( ZLBQSDRYGB1S(IMICRO) ) + ALLOCATE( ZLBQSDRYGB2S(IMICRO) ) + ALLOCATE( ZLBQSDRYGB3S(IMICRO) ) + END IF +! + IF (CNI_CHARGING == 'SAP98' .OR. & + CNI_CHARGING == 'BSMP1' .OR. CNI_CHARGING == 'BSMP2') THEN + ALLOCATE( ZRAR_CRIT(IMICRO) ) + END IF +! + IF (CNI_CHARGING == 'SAP98' .OR. CNI_CHARGING == 'TERAR' .OR. & + CNI_CHARGING == 'BSMP1' .OR. CNI_CHARGING == 'BSMP2') THEN + ALLOCATE( ZVGMEAN(IMICRO) ) + ALLOCATE( ZVSMEAN(IMICRO) ) + ALLOCATE( ZRAR(IMICRO) ) + ALLOCATE( ZDQRAR_IS(IMICRO) ) + ALLOCATE( ZDQRAR_IG(IMICRO) ) + ALLOCATE( ZDQRAR_SG(IMICRO) ) + ALLOCATE( ZSAUNIM_IS(IMICRO) ) + ALLOCATE( ZSAUNIN_IS(IMICRO) ) + ALLOCATE( ZSAUNIM_IG(IMICRO) ) + ALLOCATE( ZSAUNIN_IG(IMICRO) ) + ALLOCATE( ZSAUNSK_SG(IMICRO) ) + ALLOCATE( ZSAUNSM_SG(IMICRO) ) + ALLOCATE( ZSAUNSN_SG(IMICRO) ) + END IF +! + IF (CNI_CHARGING == 'TAKAH' .OR. CNI_CHARGING == 'SAP98' .OR. & + CNI_CHARGING == 'SAUN1' .OR. CNI_CHARGING == 'SAUN2' .OR. & + CNI_CHARGING == 'GARDI' .OR. CNI_CHARGING == 'BSMP1' .OR. & + CNI_CHARGING == 'BSMP2' .OR. CNI_CHARGING == 'TEEWC' .OR. & + CNI_CHARGING == 'TERAR') THEN + ALLOCATE( ZAUX1(IMICRO) ) + ALLOCATE( ZLIMIT(IMICRO) ) + END IF +! + IF (LINDUCTIVE) THEN + ALLOCATE( ZEFIELDW(IMICRO) ) + ALLOCATE( ZRATE_IND(IMICRO) ) + ALLOCATE( GIND(IMICRO) ) + END IF +! + IF (LIAGGS_LATHAM) THEN + ALLOCATE( ZEFIELDU(IMICRO) ) + ALLOCATE( ZEFIELDV(IMICRO) ) + IF (.NOT.ALLOCATED(ZEFIELDW)) ALLOCATE( ZEFIELDW(IMICRO) ) + END IF + ALLOCATE( ZLATHAMIAGGS(IMICRO) ) +! + ALLOCATE( ZWQ1(IMICRO,10) ) + ALLOCATE( ZWQ3(IMICRO) ) + ALLOCATE( ZWQ4(IMICRO) ) + ALLOCATE( ZCOLIS(IMICRO) ) + ALLOCATE( ZCOLIG(IMICRO) ) + ALLOCATE( ZCOLSG(IMICRO) ) + ALLOCATE( GELEC(IMICRO,4) ) + GELEC(:,:) = .FALSE. +! + DO JL = 1, IMICRO + IF (LINDUCTIVE) ZEFIELDW(JL) = XEFIELDW(I1(JL), I2(JL), I3(JL)) + IF (LIAGGS_LATHAM) THEN + ZEFIELDU(JL) = XEFIELDU(I1(JL), I2(JL), I3(JL)) + ZEFIELDV(JL) = XEFIELDV(I1(JL), I2(JL), I3(JL)) + IF (.NOT.LINDUCTIVE ) ZEFIELDW(JL) = XEFIELDW(I1(JL), I2(JL), I3(JL)) + END IF +! + ZQPIT(JL) = PQPIT(I1(JL), I2(JL), I3(JL)) + ZQNIT(JL) = PQNIT(I1(JL), I2(JL), I3(JL)) + ZQCT(JL) = PQCT(I1(JL), I2(JL), I3(JL)) + ZQRT(JL) = PQRT(I1(JL), I2(JL), I3(JL)) + ZQIT(JL) = PQIT(I1(JL), I2(JL), I3(JL)) + ZQST(JL) = PQST(I1(JL), I2(JL), I3(JL)) + ZQGT(JL) = PQGT(I1(JL), I2(JL), I3(JL)) + IF (KRR == 7) ZQHT(JL) = PQHT(I1(JL), I2(JL), I3(JL)) +! + ZQPIS(JL) = PQPIS(I1(JL), I2(JL), I3(JL)) + ZQNIS(JL) = PQNIS(I1(JL), I2(JL), I3(JL)) + ZQCS(JL) = PQCS(I1(JL), I2(JL), I3(JL)) + ZQRS(JL) = PQRS(I1(JL), I2(JL), I3(JL)) + ZQIS(JL) = PQIS(I1(JL), I2(JL), I3(JL)) + ZQSS(JL) = PQSS(I1(JL), I2(JL), I3(JL)) + ZQGS(JL) = PQGS(I1(JL), I2(JL), I3(JL)) + IF (KRR == 7) ZQHS(JL) = PQHS(I1(JL), I2(JL), I3(JL)) + ENDDO +! +! +!* 2.3 Update the parameter e in the charge-diameter relation +! + IF (KRR == 7) THEN + CALL COMPUTE_LBDA(ZRRT, ZRST, ZRGT, ZRH=ZRHT) + ZTSPLITR = 1. + CALL ELEC_UPDATE_QD(ZTSPLITR, ZERT, ZEIT, ZEST, ZEGT, ZQRT, ZQIT, ZQST, ZQGT, & + ZRRT, ZRIT, ZRST, ZRGT, & + ZEH=ZEHT, ZQH=ZQHT, ZRH=ZRHT, ZEC=ZECT, ZQC=ZQCT, ZRC=ZRCT) + ZTSPLITR = PTSTEP + CALL ELEC_UPDATE_QD(ZTSPLITR, ZERS, ZEIS, ZESS, ZEGS, ZQRS, ZQIS, ZQSS, ZQGS, & + ZRRS, ZRIS, ZRSS, ZRGS, & + ZEH=ZEHS, ZQH=ZQHS, ZRH=ZRHS, ZEC=ZECS, ZQC=ZQCS, ZRC=ZRCS) + ELSE + CALL COMPUTE_LBDA(ZRRT, ZRST, ZRGT) + ZTSPLITR = 1. + CALL ELEC_UPDATE_QD(ZTSPLITR, ZERT, ZEIT, ZEST, ZEGT, ZQRT, ZQIT, ZQST, ZQGT, & + ZRRT, ZRIT, ZRST, ZRGT, ZEC=ZECT, ZQC=ZQCT, ZRC=ZRCT) + ZTSPLITR = PTSTEP + CALL ELEC_UPDATE_QD(ZTSPLITR, ZERS, ZEIS, ZESS, ZEGS, ZQRS, ZQIS, ZQSS, ZQGS, & + ZRRS, ZRIS, ZRSS, ZRGS, ZEC=ZECS, ZQC=ZQCS, ZRC=ZRCS) + END IF +! +! +!* 2.4 Initialization for the non-inductive charging process +! + CALL ELEC_INI_NI_PROCESS +! +! +!* 2.5 Compute the slow cold process sources +! + CALL RAIN_ICE_ELEC_SLOW +! +!------------------------------------------------------------------------------- +! +!* 3. COMPUTES THE SLOW WARM PROCESS SOURCES +! -------------------------------------- +! + IF( OWARM ) THEN ! Check if the formation of the raindrops by the slow + ! warm processes is allowed + PEVAP3D(:,:,:)= 0. + CALL RAIN_ICE_ELEC_WARM + END IF +! +!------------------------------------------------------------------------------- +! +!* 4. COMPUTES THE FAST COLD PROCESS SOURCES FOR r_s +! ---------------------------------------------- +! + CALL RAIN_ICE_ELEC_FAST_RS +! +!------------------------------------------------------------------------------- +! +!* 5. COMPUTES THE FAST COLD PROCESS SOURCES FOR r_g +! ---------------------------------------------- +! + CALL RAIN_ICE_ELEC_FAST_RG +! +!------------------------------------------------------------------------------- +! +!* 6. COMPUTES THE FAST COLD PROCESS SOURCES FOR r_h +! ---------------------------------------------- +! + IF ( KRR == 7 ) THEN + CALL RAIN_ICE_ELEC_FAST_RH + END IF +! +!------------------------------------------------------------------------------- +! +!* 7. COMPUTES SPECIFIC SOURCES OF THE WARM AND COLD CLOUDY SPECIES +! ------------------------------------------------------------- +! + CALL RAIN_ICE_ELEC_FAST_RI +! +! +!------------------------------------------------------------------------------- +! +!* 8. UPDATE MIXING 3D RATIOS AND VOLUMETRIC CHARGE CONCENTRATIONS +! ------------------------------------------------------------ +! +!* 8.1 Update the mixing ratio +! + DO JL=1,IMICRO + PRVS(I1(JL),I2(JL),I3(JL)) = ZRVS(JL) + PRCS(I1(JL),I2(JL),I3(JL)) = ZRCS(JL) + PRRS(I1(JL),I2(JL),I3(JL)) = ZRRS(JL) + PRIS(I1(JL),I2(JL),I3(JL)) = ZRIS(JL) + PRSS(I1(JL),I2(JL),I3(JL)) = ZRSS(JL) + PRGS(I1(JL),I2(JL),I3(JL)) = ZRGS(JL) + PTHS(I1(JL),I2(JL),I3(JL)) = ZTHS(JL) + PCIT(I1(JL),I2(JL),I3(JL)) = ZCIT(JL) + END DO + IF ( KRR == 7 ) THEN + DO JL=1,IMICRO + PRHS(I1(JL),I2(JL),I3(JL)) = ZRHS(JL) + END DO + END IF +! +! +!* 8.2 Compute the volumetric charge concentration +! + DO JL=1,IMICRO + PQPIS(I1(JL),I2(JL),I3(JL)) = ZQPIS(JL) + PQNIS(I1(JL),I2(JL),I3(JL)) = ZQNIS(JL) + PQCS (I1(JL),I2(JL),I3(JL)) = ZQCS(JL) + PQRS (I1(JL),I2(JL),I3(JL)) = ZQRS(JL) + PQIS (I1(JL),I2(JL),I3(JL)) = ZQIS(JL) + PQSS (I1(JL),I2(JL),I3(JL)) = ZQSS(JL) + PQGS (I1(JL),I2(JL),I3(JL)) = ZQGS(JL) + END DO + IF ( KRR == 7 ) THEN + DO JL=1,IMICRO + PQHS(I1(JL),I2(JL),I3(JL)) = ZQHS(JL) + END DO + END IF +! +! +!* 8.3 Deallocate +! + DEALLOCATE(ZZW1) + DEALLOCATE(ZDV) + DEALLOCATE(ZCJ) + DEALLOCATE(ZRDRYG) + DEALLOCATE(ZRWETG) + DEALLOCATE(ZLBDAG) + IF ( KRR == 7 ) DEALLOCATE(ZLBDAH) + DEALLOCATE(ZLBDAS) + DEALLOCATE(ZLBDAR) + DEALLOCATE(ZSSI) + DEALLOCATE(ZUSW) + DEALLOCATE(ZLVFACT) + DEALLOCATE(ZLSFACT) + DEALLOCATE(ZZW) + DEALLOCATE(ZEXNREF) + DEALLOCATE(ZPRES) + DEALLOCATE(ZRHODREF) + DEALLOCATE(ZRHOCOR) + DEALLOCATE(ZZT) + IF(LBU_ENABLE .OR. LLES_CALL) DEALLOCATE(ZRHODJ) + DEALLOCATE(ZTHS) + IF ( KRR == 7 ) DEALLOCATE(ZRHS) + DEALLOCATE(ZRGS) + DEALLOCATE(ZRSS) + DEALLOCATE(ZRIS) + DEALLOCATE(ZRRS) + DEALLOCATE(ZRCS) + DEALLOCATE(ZRVS) + DEALLOCATE(ZCIT) + DEALLOCATE(ZRGT) + IF ( KRR == 7 ) DEALLOCATE(ZRHT) + DEALLOCATE(ZRST) + DEALLOCATE(ZRIT) + DEALLOCATE(ZRRT) + DEALLOCATE(ZAI) + DEALLOCATE(ZRCT) + DEALLOCATE(ZKA) + DEALLOCATE(ZRVT) + DEALLOCATE(ZSIGMA_RC) + DEALLOCATE(ZCF) +! + DEALLOCATE( ZECT ) + DEALLOCATE( ZERT ) + DEALLOCATE( ZEIT ) + DEALLOCATE( ZEST ) + DEALLOCATE( ZEGT ) + IF ( KRR == 7 ) DEALLOCATE(ZEHT) + DEALLOCATE( ZECS ) + DEALLOCATE( ZERS ) + DEALLOCATE( ZEIS ) + DEALLOCATE( ZESS ) + DEALLOCATE( ZEGS ) + IF ( KRR == 7 ) DEALLOCATE(ZEHS) + DEALLOCATE( ZQPIT ) + DEALLOCATE( ZQNIT ) + DEALLOCATE( ZQCT ) + DEALLOCATE( ZQRT ) + DEALLOCATE( ZQIT ) + DEALLOCATE( ZQST ) + DEALLOCATE( ZQGT ) + IF ( KRR == 7 ) DEALLOCATE(ZQHT) + DEALLOCATE( ZQPIS ) + DEALLOCATE( ZQNIS ) + DEALLOCATE( ZQCS ) + DEALLOCATE( ZQRS ) + DEALLOCATE( ZQIS ) + DEALLOCATE( ZQSS ) + DEALLOCATE( ZQGS ) + IF ( KRR == 7 ) DEALLOCATE(ZQHS) + DEALLOCATE( ZWQ1 ) + DEALLOCATE( ZWQ3 ) + DEALLOCATE( ZWQ4 ) + DEALLOCATE( ZCOLIS ) + DEALLOCATE( ZCOLIG ) + DEALLOCATE( ZCOLSG ) + DEALLOCATE( ZRSMIN_ELEC) + DEALLOCATE( GELEC ) + IF (ALLOCATED( ZDELTALWC )) DEALLOCATE( ZDELTALWC ) + IF (ALLOCATED( ZLWCC )) DEALLOCATE( ZLWCC ) + IF (ALLOCATED( ZFT )) DEALLOCATE( ZFT ) + IF (ALLOCATED( ZEW )) DEALLOCATE( ZEW ) + IF (ALLOCATED( ZSAUNSK )) DEALLOCATE( ZSAUNSK ) + IF (ALLOCATED( ZSAUNIM )) DEALLOCATE( ZSAUNIM ) + IF (ALLOCATED( ZSAUNIN )) DEALLOCATE( ZSAUNIN ) + IF (ALLOCATED( ZSAUNSM )) DEALLOCATE( ZSAUNSM ) + IF (ALLOCATED( ZSAUNSN )) DEALLOCATE( ZSAUNSN ) + IF (ALLOCATED( ZVGMEAN )) DEALLOCATE( ZVGMEAN ) + IF (ALLOCATED( ZRAR )) DEALLOCATE( ZRAR ) + IF (ALLOCATED( ZRAR_CRIT )) DEALLOCATE( ZRAR_CRIT ) + IF (ALLOCATED( ZSAUNIM_IS )) DEALLOCATE( ZSAUNIM_IS ) + IF (ALLOCATED( ZSAUNIN_IS )) DEALLOCATE( ZSAUNIN_IS ) + IF (ALLOCATED( ZFQIAGGS )) DEALLOCATE( ZFQIAGGS ) + IF (ALLOCATED( ZFQIDRYGBS )) DEALLOCATE( ZFQIDRYGBS ) + IF (ALLOCATED( ZLBQSDRYGB1S )) DEALLOCATE( ZLBQSDRYGB1S ) + IF (ALLOCATED( ZLBQSDRYGB2S )) DEALLOCATE( ZLBQSDRYGB2S ) + IF (ALLOCATED( ZLBQSDRYGB3S )) DEALLOCATE( ZLBQSDRYGB3S ) + IF (ALLOCATED( ZSAUNIM_IG )) DEALLOCATE( ZSAUNIM_IG ) + IF (ALLOCATED( ZSAUNIN_IG )) DEALLOCATE( ZSAUNIN_IG ) + IF (ALLOCATED( ZSAUNSK_SG )) DEALLOCATE( ZSAUNSK_SG ) + IF (ALLOCATED( ZSAUNSM_SG )) DEALLOCATE( ZSAUNSM_SG ) + IF (ALLOCATED( ZSAUNSN_SG )) DEALLOCATE( ZSAUNSN_SG ) + IF (ALLOCATED( ZDQLWC )) DEALLOCATE( ZDQLWC ) + IF (ALLOCATED( ZDQRAR_IS )) DEALLOCATE( ZDQRAR_IS ) + IF (ALLOCATED( ZDQRAR_IG )) DEALLOCATE( ZDQRAR_IG ) + IF (ALLOCATED( ZDQRAR_SG )) DEALLOCATE( ZDQRAR_SG ) + IF (ALLOCATED( ZAUX1 )) DEALLOCATE( ZAUX1 ) + IF (ALLOCATED( ZLIMIT )) DEALLOCATE( ZLIMIT ) + IF (ALLOCATED( ZEFIELDW )) DEALLOCATE( ZEFIELDW ) + IF (ALLOCATED( ZRATE_IND )) DEALLOCATE( ZRATE_IND ) + IF (ALLOCATED( GIND )) DEALLOCATE( GIND ) + IF (ALLOCATED( ZEFIELDU )) DEALLOCATE( ZEFIELDU ) + IF (ALLOCATED( ZEFIELDV )) DEALLOCATE( ZEFIELDV ) + DEALLOCATE( ZLATHAMIAGGS ) +! +END IF +! +!------------------------------------------------------------------------------- +! +!* 8. COMPUTE THE SEDIMENTATION (RS) SOURCE +! ------------------------------------- +! +!* 8.1 time splitting loop initialization +! +ZTSPLITR = PTSTEP / REAL(KSPLITR) +! +! +IF (CSEDIM == 'STAT') THEN +! not yet developped for electricity !!! + CALL RAIN_ICE_SEDIMENTATION_STAT +ELSE + CALL RAIN_ICE_ELEC_SEDIMENTATION_SPLIT +END IF +! +! +!------------------------------------------------------------------------------- +! +CONTAINS +! +!------------------------------------------------------------------------------- +! + SUBROUTINE RAIN_ICE_ELEC_SEDIMENTATION_SPLIT +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +!* 0.2 declaration of local variables +! +INTEGER , DIMENSION(SIZE(GSEDIMC)) :: IC1,IC2,IC3 ! Used to replace the COUNT +INTEGER , DIMENSION(SIZE(GSEDIMR)) :: IR1,IR2,IR3 ! Used to replace the COUNT +INTEGER , DIMENSION(SIZE(GSEDIMI)) :: II1,II2,II3 ! Used to replace the COUNT +INTEGER , DIMENSION(SIZE(GSEDIMS)) :: IS1,IS2,IS3 ! Used to replace the COUNT +INTEGER , DIMENSION(SIZE(GSEDIMG)) :: IG1,IG2,IG3 ! Used to replace the COUNT +INTEGER , DIMENSION(SIZE(GSEDIMH)) :: IH1,IH2,IH3 ! Used to replace the COUNT +INTEGER :: ILENALLOCC,ILENALLOCR,ILENALLOCI,ILENALLOCS,ILENALLOCG,ILENALLOCH +INTEGER :: ILISTLENC,ILISTLENR,ILISTLENI,ILISTLENS,ILISTLENG,ILISTLENH +INTEGER, ALLOCATABLE :: ILISTR(:),ILISTC(:),ILISTI(:),ILISTS(:),ILISTG(:),ILISTH(:) +! Optimization for NEC +!INTEGER, SAVE :: IOLDALLOCC = SIZE(PEXNREF,1)*SIZE(PEXNREF,2)*SIZE(PEXNREF,3)/10 +!INTEGER, SAVE :: IOLDALLOCR = SIZE(PEXNREF,1)*SIZE(PEXNREF,2)*SIZE(PEXNREF,3)/10 +!INTEGER, SAVE :: IOLDALLOCI = SIZE(PEXNREF,1)*SIZE(PEXNREF,2)*SIZE(PEXNREF,3)/10 +!INTEGER, SAVE :: IOLDALLOCS = SIZE(PEXNREF,1)*SIZE(PEXNREF,2)*SIZE(PEXNREF,3)/10 +!INTEGER, SAVE :: IOLDALLOCG = SIZE(PEXNREF,1)*SIZE(PEXNREF,2)*SIZE(PEXNREF,3)/10 +!INTEGER, SAVE :: IOLDALLOCH = SIZE(PEXNREF,1)*SIZE(PEXNREF,2)*SIZE(PEXNREF,3)/10 +INTEGER, SAVE :: IOLDALLOCC = 6000 +INTEGER, SAVE :: IOLDALLOCR = 6000 +INTEGER, SAVE :: IOLDALLOCI = 6000 +INTEGER, SAVE :: IOLDALLOCS = 6000 +INTEGER, SAVE :: IOLDALLOCG = 6000 +INTEGER, SAVE :: IOLDALLOCH = 6000 +! +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) :: ZCONC3D ! droplet condensation +INTEGER, DIMENSION(:), ALLOCATABLE :: ZCIS +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) :: ZF0, ZF1, ZCOR +REAL :: ZBEARDCOEFR, ZBEARDCOEFI, ZBEARDCOEFS, ZBEARDCOEFG +REAL :: ZVR, ZVI, ZVS, ZVG, ZETA0, ZK, ZRE0 +! For rain, ice, snow and graupel particles, Take into account the +! effects of altitude and electrical force on terminal fallspeed +! (from Beard, JAS 1980, 37,1363-1374) +! +!------------------------------------------------------------------------------- +! +! O. Initialization for sedimentation +! + if ( lbudget_rc .and. osedic ) & + call Budget_store_init( tbudgets(NBUDGET_RC), 'SEDI', prcs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_init( tbudgets(NBUDGET_RR), 'SEDI', prrs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), 'SEDI', pris(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rs ) call Budget_store_init( tbudgets(NBUDGET_RS), 'SEDI', prss(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rg ) call Budget_store_init( tbudgets(NBUDGET_RG), 'SEDI', prgs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rh ) call Budget_store_init( tbudgets(NBUDGET_RH), 'SEDI', prhs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_sv ) then + if ( osedic ) & + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'SEDI', pqcs(:, :, :) * prhodj(:, :, :) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'SEDI', pqrs(:, :, :) * prhodj(:, :, :) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'SEDI', pqis(:, :, :) * prhodj(:, :, :) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'SEDI', pqss(:, :, :) * prhodj(:, :, :) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'SEDI', pqgs(:, :, :) * prhodj(:, :, :) ) + if ( krr == 7 ) & + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 6 ), 'SEDI', pqhs(:, :, :) * prhodj(:, :, :) ) + end if + + IF (OSEDIC) PINPRC (:,:) = 0. + PINPRR (:,:) = 0. + PINPRR3D (:,:,:) = 0. + PINPRS (:,:) = 0. + PINPRG (:,:) = 0. + IF ( KRR == 7 ) PINPRH (:,:) = 0. +! + ZT (:,:,:) = ZT (:,:,:) - XTT !ZT from RAIN_ICE_ELEC_NUCLEATION + ZETA0 = (1.718 + 0.0049*(XTHVREFZ(IKB) -XTT)) + WHERE (ZT (:,:,:) >= 0.0) + ZF0(:,:,:) = ZETA0 / (1.718 + 0.0049*ZT(:,:,:)) + ELSEWHERE + ZF0(:,:,:) = ZETA0 / (1.718 + 0.0049*ZT(:,:,:) - 1.2E-5*ZT(:,:,:)*ZT(:,:,:)) + END WHERE +! + ZF1(:,:,:) = SQRT(ZRHO00/PRHODREF(:,:,:)) + ZCOR(:,:,:) = (PRHODREF(:,:,:)/ZRHO00)**XCEXVT ! to eliminate Foote-duToit correction +! + ZVR = (ZRHO00/ZETA0) * XCR * MOMG(XALPHAR,XNUR,XBR+XDR) / MOMG(XALPHAR,XNUR,XBR) + ZVI = (ZRHO00/ZETA0) * 2.1E5 * MOMG(XALPHAI,XNUI,3.285) / MOMG(XALPHAI,XNUI,1.7) ! Columns + ZVS = (ZRHO00/ZETA0) * XCS * MOMG(XALPHAS,XNUS,XBS+XDS) / MOMG(XALPHAS,XNUS,XBS) + ZVG = (ZRHO00/ZETA0) * XCG * MOMG(XALPHAG,XNUG,XBG+XDG) / MOMG(XALPHAG,XNUG,XBG) +! +!* 1. Parameters for cloud sedimentation +! + IF (OSEDIC) THEN + ZRAY(:,:,:) = 0. + ZLBC(:,:,:) = XLBC(1) + ZFSEDC(:,:,:) = XFSEDC(1) + ZCONC3D(:,:,:) = XCONC_LAND + ZCONC_TMP(:,:) = XCONC_LAND + IF (PRESENT(PSEA)) THEN + ZCONC_TMP(:,:) = PSEA(:,:) * XCONC_SEA + (1. - PSEA(:,:)) * XCONC_LAND + DO JK = IKB, IKE + ZLBC(:,:,JK) = PSEA(:,:) * XLBC(2) + (1. - PSEA(:,:)) * XLBC(1) + ZFSEDC(:,:,JK) = PSEA(:,:) * XFSEDC(2) + (1. - PSEA(:,:)) * XFSEDC(1) + ZFSEDC(:,:,JK) = MAX(MIN(XFSEDC(1),XFSEDC(2)),ZFSEDC(:,:,JK)) + ZCONC3D(:,:,JK) = (1. - PTOWN(:,:)) * ZCONC_TMP(:,:) + PTOWN(:,:) * XCONC_URBAN + ZRAY(:,:,JK) = 0.5 * ((1. - PSEA(:,:)) * MOMG(XALPHAC, XNUC, 1.0) + & + PSEA(:,:) * MOMG(XALPHAC2, XNUC2, 1.0) ) + END DO + ELSE + ZCONC3D(:,:,:) = XCONC_LAND + ZRAY(:,:,:) = 0.5 * MOMG(XALPHAC, XNUC, 1.0) + END IF + ZRAY(:,:,:) = MAX(1.,ZRAY(:,:,:)) + ZLBC(:,:,:) = MAX(MIN(XLBC(1),XLBC(2)),ZLBC(:,:,:)) + ENDIF +! +!* 2. compute the fluxes +! +! optimization by looking for locations where +! the precipitating fields are larger than a minimal value only !!! +! For optimization we consider each variable separately + + ZRTMIN(:) = XRTMIN(:) / PTSTEP + IF (OSEDIC) GSEDIMC(:,:,:) = .FALSE. + GSEDIMR(:,:,:) = .FALSE. + GSEDIMI(:,:,:) = .FALSE. + GSEDIMS(:,:,:) = .FALSE. + GSEDIMG(:,:,:) = .FALSE. + IF (KRR == 7) GSEDIMH(:,:,:) = .FALSE. +! + IF (OSEDIC) ILENALLOCC = 0 + ILENALLOCR = 0 + ILENALLOCI = 0 + ILENALLOCS = 0 + ILENALLOCG = 0 + IF ( KRR == 7 ) ILENALLOCH = 0 +! +! ZPiS = Specie i source creating during the current time step +! PRiS = Source of the previous time step +! + IF (OSEDIC) THEN + ZPRCS(:,:,:) = 0.0 + ZPRCS(:,:,:) = PRCS(:,:,:) - PRCT(:,:,:) / PTSTEP + PRCS(:,:,:) = PRCT(:,:,:) / PTSTEP + END IF + ZPRRS(:,:,:) = 0.0 + ZPRSS(:,:,:) = 0.0 + ZPRGS(:,:,:) = 0.0 + IF (KRR == 7) ZPRHS(:,:,:) = 0.0 +! + ZPRRS(:,:,:) = PRRS(:,:,:) - PRRT(:,:,:) / PTSTEP + ZPRSS(:,:,:) = PRSS(:,:,:) - PRST(:,:,:) / PTSTEP + ZPRGS(:,:,:) = PRGS(:,:,:) - PRGT(:,:,:) / PTSTEP + IF (KRR == 7) ZPRHS(:,:,:) = PRHS(:,:,:) - PRHT(:,:,:) / PTSTEP + PRRS(:,:,:) = PRRT(:,:,:) / PTSTEP + PRSS(:,:,:) = PRST(:,:,:) / PTSTEP + PRGS(:,:,:) = PRGT(:,:,:) / PTSTEP + IF (KRR == 7) PRHS(:,:,:) = PRHT(:,:,:) / PTSTEP + ZPQRS(:,:,:) = 0.0 + ZPQSS(:,:,:) = 0.0 + ZPQGS(:,:,:) = 0.0 + IF (KRR == 7) ZPQHS(:,:,:) = 0.0 +! + ZPQRS(:,:,:) = PQRS(:,:,:) - PQRT(:,:,:) / PTSTEP + ZPQSS(:,:,:) = PQSS(:,:,:) - PQST(:,:,:) / PTSTEP + ZPQGS(:,:,:) = PQGS(:,:,:) - PQGT(:,:,:) / PTSTEP + IF (KRR == 7) ZPQHS(:,:,:) = PQHS(:,:,:) - PQHT(:,:,:) / PTSTEP + PQRS(:,:,:) = PQRT(:,:,:) / PTSTEP + PQSS(:,:,:) = PQST(:,:,:) / PTSTEP + PQGS(:,:,:) = PQGT(:,:,:) / PTSTEP + IF (KRR == 7) PQHS(:,:,:) = PQHT(:,:,:) / PTSTEP +! +! PRiS = Source of the previous time step + source created during the subtime +! step +! + DO JN = 1, KSPLITR + IF(JN == 1) THEN + IF (OSEDIC) PRCS(:,:,:) = PRCS(:,:,:) + ZPRCS(:,:,:) / KSPLITR + PRRS(:,:,:) = PRRS(:,:,:) + ZPRRS(:,:,:) / KSPLITR + PRSS(:,:,:) = PRSS(:,:,:) + ZPRSS(:,:,:) / KSPLITR + PRGS(:,:,:) = PRGS(:,:,:) + ZPRGS(:,:,:) / KSPLITR + IF (KRR == 7) PRHS(:,:,:) = PRHS(:,:,:) + ZPRHS(:,:,:) / KSPLITR + PQRS(:,:,:) = PQRS(:,:,:) + ZPQRS(:,:,:) / KSPLITR + PQSS(:,:,:) = PQSS(:,:,:) + ZPQSS(:,:,:) / KSPLITR + PQGS(:,:,:) = PQGS(:,:,:) + ZPQGS(:,:,:) / KSPLITR + IF (KRR == 7) PQHS(:,:,:) = PQHS(:,:,:) + ZPQHS(:,:,:) / KSPLITR + DO JK = IKB, IKE + ZW(:,:,JK) = ZTSPLITR / (PRHODREF(:,:,JK) * (PZZ(:,:,JK+1) - PZZ(:,:,JK))) + END DO + ELSE + IF (OSEDIC) PRCS(:,:,:) = PRCS(:,:,:) + ZPRCS(:,:,:) * ZTSPLITR + PRRS(:,:,:) = PRRS(:,:,:) + ZPRRS(:,:,:) * ZTSPLITR + PRSS(:,:,:) = PRSS(:,:,:) + ZPRSS(:,:,:) * ZTSPLITR + PRGS(:,:,:) = PRGS(:,:,:) + ZPRGS(:,:,:) * ZTSPLITR + IF (KRR == 7) PRHS(:,:,:) = PRHS(:,:,:) + ZPRHS(:,:,:) * ZTSPLITR + PQRS(:,:,:) = PQRS(:,:,:) + ZPQRS(:,:,:) * ZTSPLITR + PQSS(:,:,:) = PQSS(:,:,:) + ZPQSS(:,:,:) * ZTSPLITR + PQGS(:,:,:) = PQGS(:,:,:) + ZPQGS(:,:,:) * ZTSPLITR + IF (KRR == 7) PQHS(:,:,:) = PQHS(:,:,:) + ZPQHS(:,:,:) * ZTSPLITR + END IF + ! + IF (OSEDIC) GSEDIMC(IIB:IIE,IJB:IJE,IKB:IKE) = & + PRCS(IIB:IIE,IJB:IJE,IKB:IKE) > ZRTMIN(2) + GSEDIMR(IIB:IIE,IJB:IJE,IKB:IKE) = & + PRRS(IIB:IIE,IJB:IJE,IKB:IKE) > ZRTMIN(3) + GSEDIMI(IIB:IIE,IJB:IJE,IKB:IKE) = & + PRIS(IIB:IIE,IJB:IJE,IKB:IKE) > ZRTMIN(4) + GSEDIMS(IIB:IIE,IJB:IJE,IKB:IKE) = & + PRSS(IIB:IIE,IJB:IJE,IKB:IKE) > ZRTMIN(5) + GSEDIMG(IIB:IIE,IJB:IJE,IKB:IKE) = & + PRGS(IIB:IIE,IJB:IJE,IKB:IKE) > ZRTMIN(6) + IF (KRR == 7) GSEDIMH(IIB:IIE,IJB:IJE,IKB:IKE) = & + PRHS(IIB:IIE,IJB:IJE,IKB:IKE) > ZRTMIN(7) +! + IF (OSEDIC) ISEDIMC = COUNTJV( GSEDIMC(:,:,:),IC1(:),IC2(:),IC3(:)) + ISEDIMR = COUNTJV( GSEDIMR(:,:,:),IR1(:),IR2(:),IR3(:)) + ISEDIMI = COUNTJV( GSEDIMI(:,:,:),II1(:),II2(:),II3(:)) + ISEDIMS = COUNTJV( GSEDIMS(:,:,:),IS1(:),IS2(:),IS3(:)) + ISEDIMG = COUNTJV( GSEDIMG(:,:,:),IG1(:),IG2(:),IG3(:)) + IF (KRR == 7) ISEDIMH = COUNTJV( GSEDIMH(:,:,:),IH1(:),IH2(:),IH3(:)) +! +!* 2.1 for cloud +! + IF (OSEDIC) THEN + ZWSED(:,:,:) = 0. + IF( JN==1 ) PRCS(:,:,:) = PRCS(:,:,:) * PTSTEP + IF(ISEDIMC >= 1) THEN + IF (ISEDIMC .GT. ILENALLOCC) THEN + IF (ILENALLOCC .GT. 0) THEN + DEALLOCATE (ZRCS, ZRHODREFC, ILISTC, ZWLBDC, ZCONC, ZRCT, & + ZZT, ZPRES, ZRAY1D, ZFSEDC1D, ZWLBDA, ZCC ) + END IF + ILENALLOCC = MAX (IOLDALLOCC, 2*ISEDIMC ) + IOLDALLOCC = ILENALLOCC + ALLOCATE(ZRCS(ILENALLOCC), ZRHODREFC(ILENALLOCC), ILISTC(ILENALLOCC), & + ZWLBDC(ILENALLOCC), ZCONC(ILENALLOCC), ZRCT(ILENALLOCC), ZZT(ILENALLOCC), & + ZPRES(ILENALLOCC), ZRAY1D(ILENALLOCC), ZFSEDC1D(ILENALLOCC), & + ZWLBDA(ILENALLOCC), ZCC(ILENALLOCC)) + END IF +! + DO JL = 1, ISEDIMC + ZRCS(JL) = PRCS(IC1(JL),IC2(JL),IC3(JL)) + ZRHODREFC(JL) = PRHODREF(IC1(JL),IC2(JL),IC3(JL)) + ZWLBDC(JL) = ZLBC(IC1(JL),IC2(JL),IC3(JL)) + ZCONC(JL) = ZCONC3D(IC1(JL),IC2(JL),IC3(JL)) + ZRCT(JL) = PRCT(IC1(JL),IC2(JL),IC3(JL)) + ZZT(JL) = PTHT(IC1(JL),IC2(JL),IC3(JL)) + ZPRES(JL) = PPABST(IC1(JL),IC2(JL),IC3(JL)) + ZRAY1D(JL) = ZRAY(IC1(JL),IC2(JL),IC3(JL)) + ZFSEDC1D(JL) = ZFSEDC(IC1(JL),IC2(JL),IC3(JL)) + END DO +! + ILISTLENC = 0 + DO JL = 1, ISEDIMC + IF(ZRCS(JL) .GT. ZRTMIN(2)) THEN + ILISTLENC = ILISTLENC + 1 + ILISTC(ILISTLENC) = JL + END IF + END DO + DO JJ = 1, ILISTLENC + JL = ILISTC(JJ) + IF (ZRCS(JL) .GT. ZRTMIN(2) .AND. ZRCT(JL) .GT. XRTMIN(2)) THEN + ZWLBDC(JL) = ZWLBDC(JL) * ZCONC(JL) / (ZRHODREFC(JL) * ZRCT(JL)) + ZWLBDC(JL) = ZWLBDC(JL)**XLBEXC + ZRAY1D(JL) = ZRAY1D(JL) / ZWLBDC(JL) !! ZRAY : mean diameter=M(1)/2 + ZZT(JL) = ZZT(JL) * (ZPRES(JL) / XP00)**(XRD/XCPD) + ZWLBDA(JL) = 6.6E-8 * (101325. / ZPRES(JL)) * (ZZT(JL) / 293.15) + ZCC(JL) = XCC * (1. + 1.26 * ZWLBDA(JL) / ZRAY1D(JL)) !! XCC modified for cloud + ZWSED (IC1(JL),IC2(JL),IC3(JL)) = ZRHODREFC(JL)**(-XCEXVT +1 ) * & + ZWLBDC(JL)**(-XDC) * ZCC(JL) * ZFSEDC1D(JL) * ZRCS(JL) + END IF + END DO + END IF + DO JK = IKB, IKE + PRCS(:,:,JK) = PRCS(:,:,JK) + ZW(:,:,JK) * (ZWSED(:,:,JK+1) - ZWSED(:,:,JK)) + END DO + PINPRC(:,:) = PINPRC(:,:) + ZWSED(:,:,IKB) / XRHOLW / KSPLITR + IF(JN == KSPLITR) THEN + PRCS(:,:,:) = PRCS(:,:,:) / PTSTEP + END IF + END IF +! +!* 2.2 for rain +! + IF( JN==1 ) PRRS(:,:,:) = PRRS(:,:,:) * PTSTEP + IF (JN == 1) PQRS(:,:,:) = PQRS(:,:,:) * PTSTEP + ZWSED(:,:,:) = 0. + ZWSEDQ(:,:,:) = 0. + IF( ISEDIMR >= 1 ) THEN + IF ( ISEDIMR .GT. ILENALLOCR ) THEN + IF ( ILENALLOCR .GT. 0 ) THEN + DEALLOCATE (ZRRS, ZRHODREFR, ILISTR) + DEALLOCATE (ZQRS, ZLBDAR, ZERS) + END IF + ILENALLOCR = MAX (IOLDALLOCR, 2*ISEDIMR ) + IOLDALLOCR = ILENALLOCR + ALLOCATE(ZRRS(ILENALLOCR), ZRHODREFR(ILENALLOCR), ILISTR(ILENALLOCR)) + ALLOCATE(ZQRS(ILENALLOCR), ZLBDAR(ILENALLOCR), ZERS(ILENALLOCR)) + END IF + ZERS(:) = 0. +! + DO JL = 1, ISEDIMR + ZRRS(JL) = PRRS(IR1(JL),IR2(JL),IR3(JL)) + ZRHODREFR(JL) = PRHODREF(IR1(JL),IR2(JL),IR3(JL)) + ZQRS(JL) = PQRS(IR1(JL),IR2(JL),IR3(JL)) +! compute lambda_r and e_r + IF (ZRRS(JL) > 0.) THEN + ZLBDAR(JL) = XLBR * (ZRHODREFR(JL) * MAX(ZRRS(JL), ZRTMIN(3)))**XLBEXR + END IF + IF (ZRRS(JL) > ZRTMIN(3) .AND. ZLBDAR(JL) > 0.) THEN + ZERS(JL) = ZRHODREFR(JL) * ZQRS(JL) / (XFQUPDR * ZLBDAR(JL)**(XCXR - XFR)) + ZERS(JL) = SIGN( MIN(ABS(ZERS(JL)), XERMAX), ZERS(JL)) + END IF + END DO +! + ILISTLENR = 0 + DO JL = 1, ISEDIMR + IF(ZRRS(JL) .GT. ZRTMIN(3)) THEN + ILISTLENR = ILISTLENR + 1 + ILISTR(ILISTLENR) = JL + END IF + END DO + DO JJ = 1, ILISTLENR + JL = ILISTR(JJ) + IF (ZRRS(JL) > 0. .AND. LSEDIM_BEARD) THEN + ZK = 1. - ZQRS(JL) * XEFIELDW(IR1(JL),IR2(JL),IR3(JL)) / (ZRRS(JL)*XG) + IF (ZK <= 0.0) THEN + ZBEARDCOEFR = 0. + ELSE + ZRE0 = ZVR / ZLBDAR(JL)**(1.+XDR) + IF (ZRE0 <= 0.2) THEN + ZBEARDCOEFR = ZF0(IR1(JL),IR2(JL),IR3(JL)) * ZK + ELSE IF (ZRE0 >= 1000.) THEN + ZBEARDCOEFR = ZF1(IR1(JL),IR2(JL),IR3(JL)) * SQRT(ZK) + ELSE + ZBEARDCOEFR = ZF0(IR1(JL),IR2(JL),IR3(JL)) * ZK + & + (ZF1(IR1(JL),IR2(JL),IR3(JL)) * & + SQRT(ZK)-ZF0(IR1(JL),IR2(JL),IR3(JL))*ZK) * & + (1.61+LOG(ZRE0)) / 8.52 + END IF + ZBEARDCOEFR = ZBEARDCOEFR * ZCOR(IR1(JL),IR2(JL),IR3(JL)) + END IF + ELSE + ZBEARDCOEFR = 1.0 ! No "Beard" effect + END IF +! + ZWSED(IR1(JL),IR2(JL),IR3(JL)) = ZBEARDCOEFR * & + XFSEDR * ZRRS(JL)**XEXSEDR * & + ZRHODREFR(JL)**(XEXSEDR-XCEXVT) +! + IF (ZRRS(JL) > ZRTMIN(3) .AND. ABS(ZERS(JL)) > XERMIN) THEN + ZWSEDQ(IR1(JL),IR2(JL),IR3(JL)) = ZBEARDCOEFR * & + XFQSEDR * ZERS(JL) * & + ZRRS(JL)**XEXQSEDR * & + ZRHODREFR(JL)**(XEXQSEDR-XCEXVT) + END IF + END DO + END IF + DO JK = IKB , IKE + PRRS(:,:,JK) = PRRS(:,:,JK) + ZW(:,:,JK) * (ZWSED(:,:,JK+1) - ZWSED(:,:,JK)) + PQRS(:,:,JK) = PQRS(:,:,JK) + ZW(:,:,JK) * (ZWSEDQ(:,:,JK+1) - ZWSEDQ(:,:,JK)) + END DO + PINPRR(:,:) = PINPRR(:,:) + ZWSED(:,:,IKB) / XRHOLW / KSPLITR + PINPRR3D(:,:,:) = PINPRR3D(:,:,:) + ZWSED(:,:,:) / XRHOLW / KSPLITR + IF (JN == KSPLITR) THEN + PRRS(:,:,:) = PRRS(:,:,:) / PTSTEP + PQRS(:,:,:) = PQRS(:,:,:) / PTSTEP + END IF +! +! +!* 2.3 for pristine ice +! + IF (JN == 1) PRIS(:,:,:) = PRIS(:,:,:) * PTSTEP + IF (JN == 1) PQIS(:,:,:) = PQIS(:,:,:) * PTSTEP + ZWSED(:,:,:) = 0. + ZWSEDQ(:,:,:) = 0. + IF( ISEDIMI >= 1 ) THEN + IF ( ISEDIMI .GT. ILENALLOCI ) THEN + IF ( ILENALLOCI .GT. 0 ) THEN + DEALLOCATE (ZRIS, ZRHODREFI, ILISTI) + DEALLOCATE (ZQIS, ZEIS, ZCIT, ZCIS, ZLBDAI) + END IF + ILENALLOCI = MAX (IOLDALLOCI, 2*ISEDIMI ) + IOLDALLOCI = ILENALLOCI + ALLOCATE(ZRIS(ILENALLOCI), ZRHODREFI(ILENALLOCI), ILISTI(ILENALLOCI)) + ALLOCATE(ZQIS(ILENALLOCI), & + ZEIS(ILENALLOCI), & + ZCIT(ILENALLOCI), & + ZCIS(ILENALLOCI), & + ZLBDAI(ILENALLOCI)) + END IF +! + DO JL = 1, ISEDIMI + ZRIS(JL) = PRIS(II1(JL),II2(JL),II3(JL)) + ZRHODREFI(JL) = PRHODREF(II1(JL),II2(JL),II3(JL)) + ZQIS(JL) = PQIS(II1(JL),II2(JL),II3(JL)) + ZCIT(JL) = PCIT(II1(JL),II2(JL),II3(JL)) + ZEIS(JL) = 0. +! compute e_i + IF (ZRIS(JL) > ZRTMIN(4) .AND. ZCIT(JL) > 0.0) THEN + ZEIS(JL) = ZRHODREFI(JL) * ZQIS(JL) / ((ZCIT(JL)**(1 - XEXFQUPDI)) * & + XFQUPDI * (ZRHODREFI(JL) * ZRIS(JL))**XEXFQUPDI) + ZEIS(JL) = SIGN( MIN(ABS(ZEIS(JL)), XEIMAX), ZEIS(JL)) + ZCIS(JL) = XFCI * ZRHODREFI(JL) * ZRIS(JL) * & + MAX(0.05E6, & + -0.15319E6 - 0.021454E6 * ALOG(ZRHODREFI(JL) * ZRIS(JL)))**3 + ZLBDAI(JL) = (2.14E-3 * MOMG(XALPHAI,XNUI,1.7) * & + ZCIS(JL) / (ZRHODREFI(JL) * ZRIS(JL)))**0.588235 + END IF + END DO +! + ILISTLENI = 0 + DO JL = 1, ISEDIMI + IF (ZRIS(JL) .GT. MAX(ZRTMIN(4),1.0E-7 )) THEN ! limitation of the McF&H formula + ILISTLENI = ILISTLENI + 1 + ILISTI(ILISTLENI) = JL + END IF + END DO + DO JJ = 1, ILISTLENI + JL = ILISTI(JJ) + IF (ZRIS(JL) > ZRTMIN(4) .AND. ZCIT(JL) > 0.0 .AND. LSEDIM_BEARD) THEN + ZK = 1. - ZQIS(JL) * XEFIELDW(II1(JL),II2(JL),II3(JL)) / (ZRIS(JL)*XG) + IF (ZK <= 0.0) THEN + ZBEARDCOEFI = 0. + ELSE + ZRE0 = ZVI / ZLBDAI(JL)**2.585 + IF (ZRE0 <= 0.2) THEN + ZBEARDCOEFI = ZF0(II1(JL),II2(JL),II3(JL)) * ZK + ELSE IF (ZRE0 >= 1000.) THEN + ZBEARDCOEFI = ZF1(II1(JL),II2(JL),II3(JL)) * SQRT(ZK) + ELSE + ZBEARDCOEFI = ZF0(II1(JL),II2(JL),II3(JL)) * ZK + & + (ZF1(II1(JL),II2(JL),II3(JL)) * & + SQRT(ZK) - ZF0(II1(JL),II2(JL),II3(JL)) * ZK) * & + (1.61 + LOG(ZRE0)) / 8.52 + END IF + ZBEARDCOEFI = ZBEARDCOEFI * ZCOR(II1(JL),II2(JL),II3(JL)) + END IF + ELSE + ZBEARDCOEFI = 1.0 ! No "Beard" effect + END IF +! + ZWSED(II1(JL),II2(JL),II3(JL))= ZBEARDCOEFI * & + XFSEDI * ZRIS(JL) * & + ZRHODREFI(JL)**(1.0-XCEXVT) * & ! McF&H + MAX( 0.05E6,-0.15319E6-0.021454E6* & + ALOG(ZRHODREFI(JL)*ZRIS(JL)) )**XEXCSEDI + IF (ZRIS(JL) .GT. MAX(ZRTMIN(4),1.0E-7) .AND. ABS(ZEIS(JL)) .GT. XEIMIN .AND. & + ZCIT(JL) .GT. 0. ) THEN + ZWSEDQ(II1(JL),II2(JL),II3(JL)) = ZBEARDCOEFI * & + ZCIS(JL)**(1 - XEXQSEDI) * XFQSEDI * & + ZRIS(JL)**XEXQSEDI * ZRHODREFI(JL)**(XEXQSEDI - XCEXVT) * & + ZEIS(JL) * (ZCIT(JL) / ZCIS(JL))**(1.-XFI/XBI) + END IF + END DO + END IF + DO JK = IKB, IKE + PRIS(:,:,JK) = PRIS(:,:,JK) + ZW(:,:,JK) * (ZWSED(:,:,JK+1) - ZWSED(:,:,JK)) + PQIS(:,:,JK) = PQIS(:,:,JK) + ZW(:,:,JK) * (ZWSEDQ(:,:,JK+1) - ZWSEDQ(:,:,JK)) + END DO + IF (JN == KSPLITR) THEN + PRIS(:,:,:) = PRIS(:,:,:) / PTSTEP + PQIS(:,:,:) = PQIS(:,:,:) / PTSTEP + END IF +! +! +!* 2.4 for aggregates/snow +! + IF( JN==1 ) PRSS(:,:,:) = PRSS(:,:,:) * PTSTEP + IF (JN == 1) PQSS(:,:,:) = PQSS(:,:,:) * PTSTEP + ZWSED(:,:,:) = 0. + ZWSEDQ(:,:,:) = 0. + IF( ISEDIMS >= 1 ) THEN + IF ( ISEDIMS .GT. ILENALLOCS ) THEN + IF ( ILENALLOCS .GT. 0 ) THEN + DEALLOCATE (ZRSS, ZRHODREFS, ILISTS) + DEALLOCATE (ZQSS, ZESS, ZLBDAS) + END IF + ILENALLOCS = MAX(IOLDALLOCS, 2*ISEDIMS ) + IOLDALLOCS = ILENALLOCS + ALLOCATE(ZRSS(ILENALLOCS), ZRHODREFS(ILENALLOCS), ILISTS(ILENALLOCS)) + ALLOCATE(ZQSS(ILENALLOCS), ZESS(ILENALLOCS), ZLBDAS(ILENALLOCS)) + END IF +! + DO JL = 1, ISEDIMS + ZRSS(JL) = PRSS(IS1(JL),IS2(JL),IS3(JL)) + ZRHODREFS(JL) = PRHODREF(IS1(JL),IS2(JL),IS3(JL)) + ZQSS(JL) = PQSS(IS1(JL),IS2(JL),IS3(JL)) + ZESS(JL) = 0. +! compute lambda_s and e_s + IF (ZRSS(JL) > 0.) THEN + ZLBDAS(JL) = MIN(XLBDAS_MAX, & + XLBS * (ZRHODREFS(JL) * MAX(ZRSS(JL), ZRTMIN(5)))**XLBEXS) + END IF + IF (ZRSS(JL) > ZRTMIN(5) .AND. ZLBDAS(JL) > 0.) THEN + ZESS(JL) = ZRHODREFS(JL) * ZQSS(JL) / (XFQUPDS * ZLBDAS(JL)**(XCXS - XFS)) + ZESS(JL) = SIGN( MIN(ABS(ZESS(JL)), XESMAX), ZESS(JL)) + END IF + END DO +! + ILISTLENS = 0 + DO JL = 1, ISEDIMS + IF (ZRSS(JL) .GT. ZRTMIN(5)) THEN + ILISTLENS = ILISTLENS + 1 + ILISTS(ILISTLENS) = JL + END IF + END DO + DO JJ = 1, ILISTLENS + JL = ILISTS(JJ) + IF (ZRSS(JL) > 0. .AND. LSEDIM_BEARD) THEN + ZK = 1. - ZQSS(JL) * XEFIELDW(IS1(JL),IS2(JL),IS3(JL)) / (ZRSS(JL)*XG) + IF (ZK <= 0.0) THEN + ZBEARDCOEFS = 0. + ELSE + ZRE0 = ZVS / ZLBDAS(JL)**(1.+XDS) + IF (ZRE0 <= 0.2) THEN + ZBEARDCOEFS = ZF0(IS1(JL),IS2(JL),IS3(JL)) * ZK + ELSE IF (ZRE0 >= 1000.) THEN + ZBEARDCOEFS = ZF1(IS1(JL),IS2(JL),IS3(JL)) * SQRT(ZK) + ELSE + ZBEARDCOEFS = ZF0(IS1(JL),IS2(JL),IS3(JL)) * ZK + & + (ZF1(IS1(JL),IS2(JL),IS3(JL)) * & + SQRT(ZK) -ZF0(IS1(JL),IS2(JL),IS3(JL)) * ZK) * & + (1.61 + LOG(ZRE0)) / 8.52 + END IF + ZBEARDCOEFS = ZBEARDCOEFS * ZCOR(IS1(JL),IS2(JL),IS3(JL)) + END IF + ELSE + ZBEARDCOEFS = 1.0 ! No "Beard" effect + END IF +! + ZWSED (IS1(JL),IS2(JL),IS3(JL)) = ZBEARDCOEFS * & + XFSEDS * ZRSS(JL)**XEXSEDS * & + ZRHODREFS(JL)**(XEXSEDS-XCEXVT) + IF (ZRSS(JL) .GT. ZRTMIN(5) .AND. ABS(ZESS(JL)) > XESMIN) THEN + ZWSEDQ(IS1(JL),IS2(JL),IS3(JL)) = ZBEARDCOEFS * & + XFQSEDS * ZESS(JL) * & + ZRSS(JL)**XEXQSEDS * & + ZRHODREFS(JL)**(XEXQSEDS - XCEXVT) + END IF + END DO + END IF + DO JK = IKB, IKE + PRSS(:,:,JK) = PRSS(:,:,JK) + ZW(:,:,JK) * (ZWSED(:,:,JK+1) - ZWSED(:,:,JK)) + PQSS(:,:,JK) = PQSS(:,:,JK) + ZW(:,:,JK) * (ZWSEDQ(:,:,JK+1) - ZWSEDQ(:,:,JK)) + END DO + PINPRS(:,:) = PINPRS(:,:) + ZWSED(:,:,IKB) / XRHOLW / KSPLITR + IF (JN == KSPLITR) THEN + PRSS(:,:,:) = PRSS(:,:,:) / PTSTEP + PQSS(:,:,:) = PQSS(:,:,:) / PTSTEP + END IF +! +! +!* 2.5 for graupeln +! + ZWSED(:,:,:) = 0. + ZWSEDQ(:,:,:) = 0. + IF( JN==1 ) PRGS(:,:,:) = PRGS(:,:,:) * PTSTEP + IF (JN == 1) PQGS(:,:,:) = PQGS(:,:,:) * PTSTEP + IF( ISEDIMG >= 1 ) THEN + IF ( ISEDIMG .GT. ILENALLOCG ) THEN + IF ( ILENALLOCG .GT. 0 ) THEN + DEALLOCATE (ZRGS, ZRHODREFG, ILISTG) + DEALLOCATE (ZQGS, ZEGS, ZLBDAG) + END IF + ILENALLOCG = MAX (IOLDALLOCG, 2*ISEDIMG ) + IOLDALLOCG = ILENALLOCG + ALLOCATE(ZRGS(ILENALLOCG), ZRHODREFG(ILENALLOCG), ILISTG(ILENALLOCG)) + ALLOCATE(ZQGS(ILENALLOCG), ZEGS(ILENALLOCG), ZLBDAG(ILENALLOCG)) + END IF +! + DO JL = 1, ISEDIMG + ZRGS(JL) = PRGS(IG1(JL),IG2(JL),IG3(JL)) + ZRHODREFG(JL) = PRHODREF(IG1(JL),IG2(JL),IG3(JL)) + ZQGS(JL) = PQGS(IG1(JL),IG2(JL),IG3(JL)) + ZEGS(JL) = 0. +! compute lambda_g and e_g + IF (ZRGS(JL) > 0.) THEN + ZLBDAG(JL) = XLBG * (ZRHODREFG(JL) * MAX(ZRGS(JL), ZRTMIN(6)))**XLBEXG + END IF + IF (ZRGS(JL) > ZRTMIN(6) .AND. ZLBDAG(JL) > 0.) THEN + ZEGS(JL) = ZRHODREFG(JL) * ZQGS(JL) / (XFQUPDG * ZLBDAG(JL)**(XCXG - XFG)) + ZEGS(JL) = SIGN( MIN(ABS(ZEGS(JL)), XEGMAX), ZEGS(JL)) + END IF + END DO +! + ILISTLENG = 0 + DO JL = 1, ISEDIMG + IF (ZRGS(JL) .GT. ZRTMIN(6)) THEN + ILISTLENG = ILISTLENG + 1 + ILISTG(ILISTLENG) = JL + END IF + END DO + DO JJ = 1, ILISTLENG + JL = ILISTG(JJ) + IF (ZRGS(JL) > 0. .AND. LSEDIM_BEARD) THEN + ZK = 1. - ZQGS(JL) * XEFIELDW(IG1(JL),IG2(JL),IG3(JL)) / (ZRGS(JL)*XG) + IF (ZK <= 0.0) THEN + ZBEARDCOEFG = 0. + ELSE + ZRE0 = ZVG / ZLBDAG(JL)**(1.+XDG) + IF (ZRE0 <= 0.2) THEN + ZBEARDCOEFG = ZF0(IG1(JL),IG2(JL),IG3(JL)) * ZK + ELSE IF (ZRE0 >= 1000.) THEN + ZBEARDCOEFG = ZF1(IG1(JL),IG2(JL),IG3(JL)) * SQRT(ZK) + ELSE + ZBEARDCOEFG = ZF0(IG1(JL),IG2(JL),IG3(JL)) * ZK + & + (ZF1(IG1(JL),IG2(JL),IG3(JL)) * & + SQRT(ZK) - ZF0(IG1(JL),IG2(JL),IG3(JL)) * ZK) * & + (1.61 + LOG(ZRE0)) / 8.52 + END IF + ZBEARDCOEFG = ZBEARDCOEFG * ZCOR(IG1(JL),IG2(JL),IG3(JL)) + END IF + ELSE + ZBEARDCOEFG = 1.0 ! No "Beard" effect + END IF +! + ZWSED (IG1(JL),IG2(JL),IG3(JL))= ZBEARDCOEFG * & + XFSEDG * ZRGS(JL)**XEXSEDG * & + ZRHODREFG(JL)**(XEXSEDG-XCEXVT) + IF (ZRGS(JL) .GT. ZRTMIN(6) .AND. ABS(ZEGS(JL)) > XEGMIN) THEN + ZWSEDQ(IG1(JL),IG2(JL),IG3(JL)) = ZBEARDCOEFG * & + XFQSEDG * ZEGS(JL) * & + ZRGS(JL)**XEXQSEDG * & + ZRHODREFG(JL)**(XEXQSEDG - XCEXVT) + END IF + END DO + END IF + DO JK = IKB, IKE + PRGS(:,:,JK) = PRGS(:,:,JK) + ZW(:,:,JK) * (ZWSED(:,:,JK+1) - ZWSED(:,:,JK)) + PQGS(:,:,JK) = PQGS(:,:,JK) + ZW(:,:,JK) * (ZWSEDQ(:,:,JK+1) - ZWSEDQ(:,:,JK)) + END DO + PINPRG(:,:) = PINPRG(:,:) + ZWSED(:,:,IKB) / XRHOLW / KSPLITR + IF (JN == KSPLITR) THEN + PRGS(:,:,:) = PRGS(:,:,:) / PTSTEP + PQGS(:,:,:) = PQGS(:,:,:) / PTSTEP + END IF +! +! +!* 2.6 for hail +! + IF ( KRR == 7 ) THEN + IF( JN==1 ) PRHS(:,:,:) = PRHS(:,:,:) * PTSTEP + IF (JN == 1) PQHS(:,:,:) = PQHS(:,:,:) * PTSTEP + ZWSED(:,:,:) = 0. + ZWSEDQ(:,:,:) = 0. + IF( ISEDIMH >= 1 ) THEN + IF ( ISEDIMH .GT. ILENALLOCH ) THEN + IF ( ILENALLOCH .GT. 0 ) THEN + DEALLOCATE (ZRHS, ZRHODREFH, ILISTH) + DEALLOCATE (ZQHS, ZEHS, ZLBDAH) + END IF + ILENALLOCH = MAX(IOLDALLOCH, 2*ISEDIMH ) + IOLDALLOCH = ILENALLOCH + ALLOCATE(ZRHS(ILENALLOCH), ZRHODREFH(ILENALLOCH), ILISTH(ILENALLOCH)) + ALLOCATE(ZQHS(ILENALLOCH), ZLBDAH(ILENALLOCH), ZEHS(ILENALLOCH)) + END IF +! + DO JL = 1, ISEDIMH + ZRHS(JL) = PRHS(IH1(JL),IH2(JL),IH3(JL)) + ZRHODREFH(JL) = PRHODREF(IH1(JL),IH2(JL),IH3(JL)) + ZQHS(JL) = PQHS(IH1(JL),IH2(JL),IH3(JL)) + ZEHS(JL) = 0. +! compute lambda_h and e_h + IF (ZRHS(JL) > 0.) THEN + ZLBDAH(JL) = XLBH * (ZRHODREFH(JL) * MAX(ZRHS(JL), ZRTMIN(7)))**XLBEXH + END IF + IF (ZRHS(JL) > ZRTMIN(7) .AND. ZLBDAH(JL) > 0.) THEN + ZEHS(JL) = ZRHODREFH(JL) * ZQHS(JL) / (XFQUPDH * ZLBDAH(JL)**(XCXH - XFH)) + ZEHS(JL) = SIGN( MIN(ABS(ZEHS(JL)), XEHMAX), ZEHS(JL)) + END IF + END DO +! + ILISTLENH = 0 + DO JL = 1, ISEDIMH + IF (ZRHS(JL) .GT. ZRTMIN(7)) THEN + ILISTLENH = ILISTLENH + 1 + ILISTH(ILISTLENH) = JL + END IF + END DO + DO JJ = 1, ILISTLENH + JL = ILISTH(JJ) + ZWSED (IH1(JL),IH2(JL),IH3(JL)) = XFSEDH * ZRHS(JL)**XEXSEDH * & + ZRHODREFH(JL)**(XEXSEDH-XCEXVT) + IF (ZRHS(JL) .GT. ZRTMIN(7) .AND. ABS(ZEHS(JL)) > XEHMIN) THEN + ZWSEDQ(IH1(JL),IH2(JL),IH3(JL)) = XFQSEDH * ZEHS(JL) * & + ZRHS(JL)**XEXQSEDH * & + ZRHODREFH(JL)**(XEXQSEDH - XCEXVT) + END IF + END DO + END IF + DO JK = IKB, IKE + PRHS(:,:,JK) = PRHS(:,:,JK) + ZW(:,:,JK) * (ZWSED(:,:,JK+1) - ZWSED(:,:,JK)) + PQHS(:,:,JK) = PQHS(:,:,JK) + ZW(:,:,JK) * (ZWSEDQ(:,:,JK+1) - ZWSEDQ(:,:,JK)) + END DO + PINPRH(:,:) = PINPRH(:,:) + ZWSED(:,:,IKB) / XRHOLW / KSPLITR + IF (JN == KSPLITR) THEN + PRHS(:,:,:) = PRHS(:,:,:) / PTSTEP + PQHS(:,:,:) = PQHS(:,:,:) / PTSTEP + END IF + END IF + END DO +! + IF (OSEDIC) THEN + IF (ILENALLOCC .GT. 0) DEALLOCATE (ZRCS, ZRHODREFC, & + ILISTC,ZWLBDC,ZCONC,ZRCT, ZZT,ZPRES,ZRAY1D,ZFSEDC1D, ZWLBDA,ZCC) + END IF + IF (ILENALLOCR .GT. 0 ) DEALLOCATE(ZRHODREFR,ZRRS,ILISTR) + IF (ILENALLOCI .GT. 0 ) DEALLOCATE(ZRHODREFI,ZRIS,ILISTI) + IF (ILENALLOCS .GT. 0 ) DEALLOCATE(ZRHODREFS,ZRSS,ILISTS) + IF (ILENALLOCG .GT. 0 ) DEALLOCATE(ZRHODREFG,ZRGS,ILISTG) + IF (KRR == 7 .AND. (ILENALLOCH .GT. 0 )) DEALLOCATE(ZRHODREFH,ZRHS,ILISTH) +! + IF (ILENALLOCR .GT. 0 ) DEALLOCATE(ZERS,ZQRS,ZLBDAR) + IF (ILENALLOCI .GT. 0 ) DEALLOCATE(ZEIS,ZQIS,ZCIS,ZCIT,ZLBDAI) + IF (ILENALLOCS .GT. 0 ) DEALLOCATE(ZESS,ZQSS,ZLBDAS) + IF (ILENALLOCG .GT. 0 ) DEALLOCATE(ZEGS,ZQGS,ZLBDAG) + IF (KRR == 7 .AND. (ILENALLOCH .GT. 0 )) DEALLOCATE(ZEHS,ZQHS,ZLBDAH) +! +! +!* 2.3 budget storage +! + if ( lbudget_rc .and. osedic ) & + call Budget_store_end( tbudgets(NBUDGET_RC), 'SEDI', prcs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_end( tbudgets(NBUDGET_RR), 'SEDI', prrs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'SEDI', pris(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rs ) call Budget_store_end( tbudgets(NBUDGET_RS), 'SEDI', prss(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rg ) call Budget_store_end( tbudgets(NBUDGET_RG), 'SEDI', prgs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rh ) call Budget_store_end( tbudgets(NBUDGET_RH), 'SEDI', prhs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_sv ) then + if ( osedic ) & + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'SEDI', pqcs(:, :, :) * prhodj(:, :, :) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'SEDI', pqrs(:, :, :) * prhodj(:, :, :) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'SEDI', pqis(:, :, :) * prhodj(:, :, :) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'SEDI', pqss(:, :, :) * prhodj(:, :, :) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'SEDI', pqgs(:, :, :) * prhodj(:, :, :) ) + if ( krr == 7 ) & + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 6 ), 'SEDI', pqhs(:, :, :) * prhodj(:, :, :) ) + end if +! + END SUBROUTINE RAIN_ICE_ELEC_SEDIMENTATION_SPLIT +! +!------------------------------------------------------------------------------- +! + SUBROUTINE RAIN_ICE_SEDIMENTATION_STAT +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +!* 0.2 declaration of local variables +! +! + +REAL :: ZP1,ZP2,ZQP,ZH,ZZWLBDA,ZZWLBDC,ZZCC +INTEGER :: JI,JJ,JK +! +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) :: ZCONC3D ! droplet condensation +! +!------------------------------------------------------------------------------- + if ( lbudget_rc .and. osedic ) & + call Budget_store_init( tbudgets(NBUDGET_RC), 'SEDI', prcs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_init( tbudgets(NBUDGET_RR), 'SEDI', prrs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), 'SEDI', pris(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rs ) call Budget_store_init( tbudgets(NBUDGET_RS), 'SEDI', prss(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rg ) call Budget_store_init( tbudgets(NBUDGET_RG), 'SEDI', prgs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rh ) call Budget_store_init( tbudgets(NBUDGET_RH), 'SEDI', prhs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_sv ) then + if ( osedic ) & + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'SEDI', pqcs(:, :, :) * prhodj(:, :, :) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'SEDI', pqrs(:, :, :) * prhodj(:, :, :) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'SEDI', pqis(:, :, :) * prhodj(:, :, :) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'SEDI', pqss(:, :, :) * prhodj(:, :, :) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'SEDI', pqgs(:, :, :) * prhodj(:, :, :) ) + if ( krr == 7 ) & + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 6 ), 'SEDI', pqhs(:, :, :) * prhodj(:, :, :) ) + end if +! +!* 1. Parameters for cloud sedimentation +! + IF (OSEDIC) THEN + ZRAY(:,:,:) = 0. + ZLBC(:,:,:) = XLBC(1) + ZFSEDC(:,:,:) = XFSEDC(1) + ZCONC3D(:,:,:) = XCONC_LAND + ZCONC_TMP(:,:) = XCONC_LAND + IF (PRESENT(PSEA)) THEN + ZCONC_TMP(:,:) = PSEA(:,:) * XCONC_SEA + (1. - PSEA(:,:)) * XCONC_LAND + DO JK = IKB, IKE + ZLBC(:,:,JK) = PSEA(:,:) * XLBC(2) + (1. - PSEA(:,:)) * XLBC(1) + ZFSEDC(:,:,JK) = (PSEA(:,:) * XFSEDC(2) + (1. - PSEA(:,:)) * XFSEDC(1)) + ZFSEDC(:,:,JK) = MAX(MIN(XFSEDC(1),XFSEDC(2)),ZFSEDC(:,:,JK)) + ZCONC3D(:,:,JK) = (1. - PTOWN(:,:)) * ZCONC_TMP(:,:) + PTOWN(:,:) * XCONC_URBAN + ZRAY(:,:,JK) = 0.5 * ((1. - PSEA(:,:)) * MOMG(XALPHAC, XNUC, 1.0) + & + PSEA(:,:) * MOMG(XALPHAC2, XNUC2, 1.0) ) + END DO + ELSE + ZCONC3D(:,:,:) = XCONC_LAND + ZRAY(:,:,:) = 0.5 * MOMG(XALPHAC, XNUC, 1.0) + END IF + ZRAY(:,:,:) = MAX(1.,ZRAY(:,:,:)) + ZLBC(:,:,:) = MAX(MIN(XLBC(1),XLBC(2)),ZLBC(:,:,:)) + ENDIF +! +! +!* 2. compute the fluxes +! + ZRTMIN(:) = XRTMIN(:) / PTSTEP +! + IF (OSEDIC) THEN + ZPRCS(:,:,:) = 0.0 + ZPRCS(:,:,:) = PRCS(:,:,:) - PRCT(:,:,:) / PTSTEP + PRCS(:,:,:) = PRCT(:,:,:) / PTSTEP + END IF + ZPRRS(:,:,:) = 0.0 + ZPRSS(:,:,:) = 0.0 + ZPRGS(:,:,:) = 0.0 + IF (KRR == 7) ZPRHS(:,:,:) = 0.0 +! + ZPRRS(:,:,:) = PRRS(:,:,:) - PRRT(:,:,:) / PTSTEP + ZPRSS(:,:,:) = PRSS(:,:,:) - PRST(:,:,:) / PTSTEP + ZPRGS(:,:,:) = PRGS(:,:,:) - PRGT(:,:,:) / PTSTEP + IF (KRR == 7) ZPRHS(:,:,:) = PRHS(:,:,:) - PRHT(:,:,:) / PTSTEP + PRRS(:,:,:) = PRRT(:,:,:) / PTSTEP + PRSS(:,:,:) = PRST(:,:,:) / PTSTEP + PRGS(:,:,:) = PRGT(:,:,:) / PTSTEP + IF (KRR == 7) PRHS(:,:,:) = PRHT(:,:,:) / PTSTEP +! + IF (OSEDIC) PRCS(:,:,:) = PRCS(:,:,:) + ZPRCS(:,:,:) + PRRS(:,:,:) = PRRS(:,:,:) + ZPRRS(:,:,:) + PRSS(:,:,:) = PRSS(:,:,:) + ZPRSS(:,:,:) + PRGS(:,:,:) = PRGS(:,:,:) + ZPRGS(:,:,:) + IF (KRR == 7) PRHS(:,:,:) = PRHS(:,:,:) + ZPRHS(:,:,:) + DO JK = IKB, IKE + ZW(:,:,JK) = ZTSPLITR / (PRHODREF(:,:,JK) * (PZZ(:,:,JK+1) - PZZ(:,:,JK))) + END DO +! +! +!* 2.1 for cloud +! + IF (OSEDIC) THEN + PRCS(:,:,:) = PRCS(:,:,:) * PTSTEP + ZWSED(:,:,:) = 0. + ZWSEDW1(:,:,:) = 0. + ZWSEDW2(:,:,:) = 0. + +! calculation of P1, P2 and sedimentation flux + DO JK = IKE , IKB, -1 + DO JJ = IJB, IJE + DO JI = IIB, IIE + ! estimation of q' taking into account incomming ZWSED + ZQP = ZWSED(JI,JJ,JK+1) * ZW(JI,JJ,JK) + ! calculation of w + ! mars 2009 : ajout d'un test + ! IF ( PRCS(JI,JJ,JK) > ZRTMIN(2) ) THEN + IF(PRCS(JI,JJ,JK) > ZRTMIN(2) .AND. PRCT(JI,JJ,JK) > ZRTMIN(2)) THEN + ZZWLBDA = 6.6E-8 * (101325. / PPABST(JI,JJ,JK)) * (PTHT(JI,JJ,JK) / 293.15) + ZZWLBDC = (ZLBC(JI,JJ,JK) * ZCONC3D(JI,JJ,JK) / & + (PRHODREF(JI,JJ,JK) * PRCT(JI,JJ,JK)))**XLBEXC + ZZCC = XCC * (1. + 1.26 * ZZWLBDA * ZZWLBDC / ZRAY(JI,JJ,JK)) ! ZCC: Fall speed + ZWSEDW1(JI,JJ,JK) = PRHODREF(JI,JJ,JK)**(-XCEXVT ) * & + ZZWLBDC**(-XDC) * ZZCC * ZFSEDC(JI,JJ,JK) + ENDIF + IF (ZQP > ZRTMIN(2)) THEN + ZZWLBDA = 6.6E-8 * (101325. / PPABST(JI,JJ,JK)) * (PTHT(JI,JJ,JK) / 293.15) + ZZWLBDC = (ZLBC(JI,JJ,JK) * ZCONC3D(JI,JJ,JK) / & + (PRHODREF(JI,JJ,JK) * ZQP))**XLBEXC + ZZCC = XCC * (1. + 1.26 * ZZWLBDA * ZZWLBDC / ZRAY(JI,JJ,JK)) ! ZCC: Fall speed + ZWSEDW2(JI,JJ,JK) = PRHODREF(JI,JJ,JK)**(-XCEXVT ) * & + ZZWLBDC**(-XDC) * ZZCC * ZFSEDC(JI,JJ,JK) + ENDIF + ENDDO + DO JI = IIB, IIE + ZH = PZZ(JI,JJ,JK+1) - PZZ(JI,JJ,JK) + ZP1 = MIN(1., ZWSEDW1(JI,JJ,JK) * PTSTEP / ZH) + ! mars 2009 : correction : ZWSEDW1 => ZWSEDW2 + !IF (ZWSEDW1(JI,JJ,JK) /= 0.) THEN + IF (ZWSEDW2(JI,JJ,JK) /= 0.) THEN + ZP2 = MAX(0., 1. - ZH / (PTSTEP * ZWSEDW2(JI,JJ,JK)) ) + ELSE + ZP2 = 0. + ENDIF + ZWSED(JI,JJ,JK) = ZP1 * PRHODREF(JI,JJ,JK) * & + (PZZ(JI,JJ,JK+1) - PZZ(JI,JJ,JK)) * PRCS(JI,JJ,JK) / & + PTSTEP + ZP2 * ZWSED (JI,JJ,JK+1) + ENDDO + ENDDO + ENDDO +! + DO JK = IKB , IKE + PRCS(:,:,JK) = PRCS(:,:,JK) + ZW(:,:,JK) * (ZWSED(:,:,JK+1) - ZWSED(:,:,JK)) + END DO + + PINPRC(:,:) = ZWSED(:,:,IKB) / XRHOLW ! in m/s + PRCS(:,:,:) = PRCS(:,:,:) / PTSTEP + ENDIF +! +! +!* 2.2 for rain +! + PRRS(:,:,:) = PRRS(:,:,:) * PTSTEP + ZWSED(:,:,:) = 0. + ZWSEDW1(:,:,:) = 0. + ZWSEDW2(:,:,:) = 0. +! +! calculation of ZP1, ZP2 and sedimentation flux + DO JK = IKE , IKB, -1 + DO JJ = IJB, IJE + DO JI = IIB, IIE + ! estimation of q' taking into account incomming ZWSED + ZQP = ZWSED(JI,JJ,JK+1) * ZW(JI,JJ,JK) + ! calculation of w + IF (PRRS(JI,JJ,JK) > ZRTMIN(3)) THEN + ZWSEDW1 (JI,JJ,JK) = XFSEDR * PRRS(JI,JJ,JK)**(XEXSEDR-1) * & + PRHODREF(JI,JJ,JK)**(XEXSEDR-XCEXVT-1) + ENDIF + IF (ZQP > ZRTMIN(3)) THEN + ZWSEDW2(JI,JJ,JK) = XFSEDR * (ZQP)**(XEXSEDR-1) * & + PRHODREF(JI,JJ,JK)**(XEXSEDR-XCEXVT-1) + ENDIF + ENDDO + DO JI = IIB, IIE + ZH = PZZ(JI,JJ,JK+1) - PZZ(JI,JJ,JK) + ZP1 = MIN(1., ZWSEDW1(JI,JJ,JK) * PTSTEP / ZH ) + IF (ZWSEDW2(JI,JJ,JK) /= 0.) THEN + ZP2 = MAX(0., 1 - ZH / (PTSTEP * ZWSEDW2(JI,JJ,JK)) ) + ELSE + ZP2 = 0. + ENDIF + ZWSED(JI,JJ,JK) = ZP1 * PRHODREF(JI,JJ,JK) * & + ZH * PRRS(JI,JJ,JK) / & + PTSTEP + ZP2 * ZWSED (JI,JJ,JK+1) + ENDDO + ENDDO + ENDDO + + DO JK = IKB , IKE + PRRS(:,:,JK) = PRRS(:,:,JK) + ZW(:,:,JK) * (ZWSED(:,:,JK+1) - ZWSED(:,:,JK)) + ENDDO + PINPRR(:,:) = ZWSED(:,:,IKB) / XRHOLW ! in m/s + PINPRR3D(:,:,:) = ZWSED(:,:,:) / XRHOLW ! in m/s + PRRS(:,:,:) = PRRS(:,:,:) / PTSTEP +! +! +!* 2.3 for pristine ice +! + PRIS(:,:,:) = PRIS(:,:,:) * PTSTEP + ZWSED(:,:,:) = 0. + ZWSEDW1(:,:,:) = 0. + ZWSEDW2(:,:,:) = 0. +! calculation of ZP1, ZP2 and sedimentation flux + DO JK = IKE , IKB, -1 + DO JJ = IJB, IJE + DO JI = IIB, IIE + ! estimation of q' taking into account incomming ZWSED + ZQP = ZWSED(JI,JJ,JK+1) * ZW(JI,JJ,JK) + ! calculation of w + IF (PRIS(JI,JJ,JK) > MAX(ZRTMIN(4),1.0E-7)) THEN + ZWSEDW1(JI,JJ,JK) = XFSEDI * & + PRHODREF(JI,JJ,JK)**(XCEXVT) * & ! McF&H + MAX(0.05E6,-0.15319E6-0.021454E6* & + ALOG(PRHODREF(JI,JJ,JK)*PRIS(JI,JJ,JK)))**XEXCSEDI + ENDIF + IF (ZQP > MAX(ZRTMIN(4),1.0E-7)) THEN + ZWSEDW2(JI,JJ,JK)= XFSEDI * & + PRHODREF(JI,JJ,JK)**(XCEXVT) * & ! McF&H + MAX( 0.05E6,-0.15319E6-0.021454E6* & + ALOG(PRHODREF(JI,JJ,JK)*ZQP) )**XEXCSEDI + ENDIF + ENDDO + DO JI = IIB, IIE + ZH = PZZ(JI,JJ,JK+1) - PZZ(JI,JJ,JK) + ZP1 = MIN(1., ZWSEDW1(JI,JJ,JK) * PTSTEP / ZH ) + IF (ZWSEDW2(JI,JJ,JK) /= 0.) THEN + ZP2 = MAX(0.,1 - ZH / (PTSTEP * ZWSEDW2(JI,JJ,JK))) + ELSE + ZP2 = 0. + ENDIF + ZWSED(JI,JJ,JK) = ZP1 * PRHODREF(JI,JJ,JK) * & + (PZZ(JI,JJ,JK+1) - PZZ(JI,JJ,JK)) * PRIS(JI,JJ,JK) / & + PTSTEP + ZP2 * ZWSED(JI,JJ,JK+1) + ENDDO + ENDDO + ENDDO +! + DO JK = IKB , IKE + PRIS(:,:,JK) = PRIS(:,:,JK) + ZW(:,:,JK) * (ZWSED(:,:,JK+1) - ZWSED(:,:,JK)) + ENDDO +! + PRIS(:,:,:) = PRIS(:,:,:) / PTSTEP +! +! +!* 2.4 for aggregates/snow +! + PRSS(:,:,:) = PRSS(:,:,:) * PTSTEP + ZWSED(:,:,:) = 0. + ZWSEDW1(:,:,:) = 0. + ZWSEDW2(:,:,:) = 0. + +! calculation of ZP1, ZP2 and sedimentation flux + DO JK = IKE , IKB, -1 + DO JJ = IJB, IJE + DO JI = IIB, IIE + ! estimation of q' taking into account incomming ZWSED + ZQP = ZWSED(JI,JJ,JK+1) * ZW(JI,JJ,JK) + ! calculation of w + IF (PRSS(JI,JJ,JK) > ZRTMIN(5)) THEN + ZWSEDW1(JI,JJ,JK) = XFSEDS * (PRSS(JI,JJ,JK))**(XEXSEDS-1) * & + PRHODREF(JI,JJ,JK)**(XEXSEDS-XCEXVT-1) + ENDIF + IF (ZQP > ZRTMIN(5)) THEN + ZWSEDW2(JI,JJ,JK) = XFSEDS * (ZQP)**(XEXSEDS-1) * & + PRHODREF(JI,JJ,JK)**(XEXSEDS-XCEXVT-1) + ENDIF + ENDDO + DO JI = IIB, IIE + ZH = PZZ(JI,JJ,JK+1) - PZZ(JI,JJ,JK) + ZP1 = MIN(1., ZWSEDW1(JI,JJ,JK) * PTSTEP / ZH ) + IF (ZWSEDW2(JI,JJ,JK) /= 0.) THEN + ZP2 = MAX(0.,1 - ZH / (PTSTEP * ZWSEDW2(JI,JJ,JK)) ) + ELSE + ZP2 = 0. + ENDIF + ZWSED(JI,JJ,JK) = ZP1 * PRHODREF(JI,JJ,JK) * & + ZH * PRSS(JI,JJ,JK) / & + PTSTEP + ZP2 * ZWSED(JI,JJ,JK+1) + ENDDO + ENDDO + ENDDO +! + DO JK = IKB , IKE + PRSS(:,:,JK) = PRSS(:,:,JK) + ZW(:,:,JK) * (ZWSED(:,:,JK+1) - ZWSED(:,:,JK)) + ENDDO +! + PINPRS(:,:) = ZWSED(:,:,IKB) / XRHOLW ! in m/s + PRSS(:,:,:) = PRSS(:,:,:) / PTSTEP +! +! +! +!* 2.5 for graupeln +! + PRGS(:,:,:) = PRGS(:,:,:) * PTSTEP + ZWSED(:,:,:) = 0. + ZWSEDW1(:,:,:) = 0. + ZWSEDW2(:,:,:) = 0. + +! calculation of ZP1, ZP2 and sedimentation flux + DO JK = IKE , IKB, -1 + DO JJ = IJB, IJE + DO JI = IIB, IIE + ! estimation of q' taking into account incomming ZWSED + ZQP = ZWSED(JI,JJ,JK+1) * ZW(JI,JJ,JK) + ! calculation of w + IF (PRGS(JI,JJ,JK) > ZRTMIN(6)) THEN + ZWSEDW1(JI,JJ,JK) = XFSEDG * (PRGS(JI,JJ,JK))**(XEXSEDG-1) * & + PRHODREF(JI,JJ,JK)**(XEXSEDG-XCEXVT-1) + ENDIF + IF (ZQP > ZRTMIN(6)) THEN + ZWSEDW2(JI,JJ,JK) = XFSEDG * (ZQP)**(XEXSEDG-1) * & + PRHODREF(JI,JJ,JK)**(XEXSEDG-XCEXVT-1) + ENDIF + ENDDO + DO JI = IIB, IIE + ZH = PZZ(JI,JJ,JK+1) - PZZ(JI,JJ,JK) + ZP1 = MIN(1., ZWSEDW1(JI,JJ,JK) * PTSTEP / ZH ) + IF (ZWSEDW2(JI,JJ,JK) /= 0.) THEN + ZP2 = MAX(0.,1 - ZH / (PTSTEP * ZWSEDW2(JI,JJ,JK)) ) + ELSE + ZP2 = 0. + ENDIF + ZWSED(JI,JJ,JK) = ZP1 * PRHODREF(JI,JJ,JK) * & + ZH * PRGS(JI,JJ,JK) / & + PTSTEP + ZP2 * ZWSED(JI,JJ,JK+1) + ENDDO + ENDDO + ENDDO +! + DO JK = IKB , IKE + PRGS(:,:,JK) = PRGS(:,:,JK) + ZW(:,:,JK) * (ZWSED(:,:,JK+1) - ZWSED(:,:,JK)) + ENDDO + + PINPRG(:,:) = ZWSED(:,:,IKB) / XRHOLW ! in m/s + PRGS(:,:,:) = PRGS(:,:,:) / PTSTEP +! +! +!* 2.6 for hail +! + IF (KRR == 7) THEN + PRHS(:,:,:) = PRHS(:,:,:) * PTSTEP + ZWSED(:,:,:) = 0. + ZWSEDW1(:,:,:) = 0. + ZWSEDW2(:,:,:) = 0. +! calculation of ZP1, ZP2 and sedimentation flux + DO JK = IKE , IKB, -1 + DO JJ = IJB, IJE + DO JI = IIB, IIE + ! estimation of q' taking into account incomming ZWSED + ZQP = ZWSED(JI,JJ,JK+1) * ZW(JI,JJ,JK) + ! calculation of w + IF ((PRHS(JI,JJ,JK)+ZQP) > ZRTMIN(7) ) THEN + ZWSEDW1 (JI,JJ,JK) = XFSEDH * (PRHS(JI,JJ,JK))**(XEXSEDH-1) * & + PRHODREF(JI,JJ,JK)**(XEXSEDH-XCEXVT-1) + ENDIF + IF (ZQP > ZRTMIN(7)) THEN + ZWSEDW2(JI,JJ,JK) = XFSEDH * ZQP**(XEXSEDH-1) * & + PRHODREF(JI,JJ,JK)**(XEXSEDH-XCEXVT-1) + ENDIF + ENDDO + DO JI = IIB, IIE + ZH = PZZ(JI,JJ,JK+1) - PZZ(JI,JJ,JK) + ZP1 = MIN(1., ZWSEDW1(JI,JJ,JK) * PTSTEP / ZH) + IF (ZWSEDW2(JI,JJ,JK) /= 0.) THEN + ZP2 = MAX(0.,1 - ZH / (PTSTEP*ZWSEDW2(JI,JJ,JK))) + ELSE + ZP2 = 0. + ENDIF + ZWSED(JI,JJ,JK) = ZP1 * PRHODREF(JI,JJ,JK) * & + ZH * PRHS(JI,JJ,JK) / & + PTSTEP + ZP2 * ZWSED(JI,JJ,JK+1) + ENDDO + ENDDO + ENDDO +! + DO JK = IKB , IKE + PRHS(:,:,JK) = PRHS(:,:,JK) + ZW(:,:,JK) * (ZWSED(:,:,JK+1) - ZWSED(:,:,JK)) + ENDDO +! + PINPRH(:,:) = ZWSED(:,:,IKB) / XRHOLW ! in m/s + PRHS(:,:,:) = PRHS(:,:,:) / PTSTEP + ENDIF +! +! +!* 2.3 budget storage +! + if ( lbudget_rc .and. osedic ) & + call Budget_store_end( tbudgets(NBUDGET_RC), 'SEDI', prcs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_end( tbudgets(NBUDGET_RR), 'SEDI', prrs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'SEDI', pris(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rs ) call Budget_store_end( tbudgets(NBUDGET_RS), 'SEDI', prss(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rg ) call Budget_store_end( tbudgets(NBUDGET_RG), 'SEDI', prgs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rh ) call Budget_store_end( tbudgets(NBUDGET_RH), 'SEDI', prhs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_sv ) then + if ( osedic ) & + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'SEDI', pqcs(:, :, :) * prhodj(:, :, :) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'SEDI', pqrs(:, :, :) * prhodj(:, :, :) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'SEDI', pqis(:, :, :) * prhodj(:, :, :) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'SEDI', pqss(:, :, :) * prhodj(:, :, :) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'SEDI', pqgs(:, :, :) * prhodj(:, :, :) ) + if ( krr == 7 ) & + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 6 ), 'SEDI', pqhs(:, :, :) * prhodj(:, :, :) ) + end if +! + END SUBROUTINE RAIN_ICE_SEDIMENTATION_STAT +! +!------------------------------------------------------------------------------- +! +! + SUBROUTINE RAIN_ICE_ELEC_NUCLEATION +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +!* 0.2 declaration of local variables +! +INTEGER , DIMENSION(SIZE(GNEGT)) :: I1,I2,I3 ! Used to replace the COUNT +INTEGER :: JL ! and PACK intrinsics +! +!------------------------------------------------------------------------------- +! +! compute the temperature and the pressure +! +ZT(:,:,:) = PTHT(:,:,:) * (PPABST(:,:,:) / XP00) ** (XRD / XCPD) +! +! optimization by looking for locations where +! the temperature is negative only !!! +! +GNEGT(:,:,:) = .FALSE. +GNEGT(IIB:IIE,IJB:IJE,IKB:IKE) = ZT(IIB:IIE,IJB:IJE,IKB:IKE) < XTT +INEGT = COUNTJV( GNEGT(:,:,:),I1(:),I2(:),I3(:)) +! +IF( INEGT >= 1 ) THEN + if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'HENU', pths(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rv ) call Budget_store_init( tbudgets(NBUDGET_RV), 'HENU', prvs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), 'HENU', pris(:, :, :) * prhodj(:, :, :) ) + + ALLOCATE(ZRVT(INEGT)) + ALLOCATE(ZCIT(INEGT)) + ALLOCATE(ZZT(INEGT)) + ALLOCATE(ZPRES(INEGT)) + DO JL = 1, INEGT + ZRVT(JL) = PRVT(I1(JL),I2(JL),I3(JL)) + ZCIT(JL) = PCIT(I1(JL),I2(JL),I3(JL)) + ZZT(JL) = ZT(I1(JL),I2(JL),I3(JL)) + ZPRES(JL) = PPABST(I1(JL),I2(JL),I3(JL)) + ENDDO + ALLOCATE(ZZW(INEGT)) + ALLOCATE(ZUSW(INEGT)) + ALLOCATE(ZSSI(INEGT)) + ZZW(:) = EXP(XALPI - XBETAI / ZZT(:) - XGAMI * ALOG(ZZT(:))) ! es_i + ZZW(:) = MIN(ZPRES(:) / 2., ZZW(:)) ! safety limitation + ZSSI(:) = ZRVT(:) * (ZPRES(:) - ZZW(:)) / ((XMV / XMD) * ZZW(:)) - 1.0 + ! Supersaturation over ice + ZUSW(:) = EXP(XALPW - XBETAW / ZZT(:) - XGAMW * ALOG(ZZT(:))) ! es_w + ZUSW(:) = MIN(ZPRES(:) / 2., ZUSW(:)) ! safety limitation + ZUSW(:) = (ZUSW(:) / ZZW(:)) * ((ZPRES(:) - ZZW(:)) / (ZPRES(:) - ZUSW(:))) - 1.0 + ! Supersaturation of saturated water vapor over ice +! +!* 3.1 compute the heterogeneous nucleation source: RVHENI +! +!* 3.1.1 compute the cloud ice concentration +! + ZZW(:) = 0.0 + ZSSI(:) = MIN( ZSSI(:), ZUSW(:) ) ! limitation of SSi according to SSw=0 +! + WHERE ((ZZT(:) < XTT-5.0) .AND. (ZSSI(:) > 0.0)) + ZZW(:) = XNU20 * EXP(XALPHA2 * ZSSI(:) - XBETA2) + END WHERE + WHERE ((ZZT(:) <= XTT-2.0) .AND. (ZZT(:) >= XTT-5.0) .AND. (ZSSI(:) > 0.0)) + ZZW(:) = MAX(XNU20 * EXP(-XBETA2), XNU10 * EXP(-XBETA1 * (ZZT(:) - XTT)) * & + (ZSSI(:) / ZUSW(:))**XALPHA1 ) + END WHERE + ZZW(:) = ZZW(:) - ZCIT(:) +! + IF( MAXVAL(ZZW(:)) > 0.0 ) THEN +! +!* 3.1.2 update the r_i and r_v mixing ratios +! + ZZW(:) = MIN(ZZW(:), 50.E3) ! limitation provisoire a 50 l^-1 + ZW(:,:,:) = UNPACK(ZZW(:), MASK=GNEGT(:,:,:), FIELD=0.0) + ZW(:,:,:) = MAX(ZW(:,:,:), 0.0) * XMNU0 / (PRHODREF(:,:,:) * PTSTEP) + PRIS(:,:,:) = PRIS(:,:,:) + ZW(:,:,:) + PRVS(:,:,:) = PRVS(:,:,:) - ZW(:,:,:) + IF (KRR == 7) THEN + PTHS(:,:,:) = PTHS(:,:,:) + & + ZW(:,:,:) * (XLSTT + (XCPV - XCI) * (ZT(:,:,:) - XTT)) / & + ((XCPD + XCPV * PRVT(:,:,:) + XCL * (PRCT(:,:,:) + PRRT(:,:,:)) + & + XCI * (PRIT(:,:,:) + PRST(:,:,:) + PRGT(:,:,:) + PRHT(:,:,:))) * & + PEXNREF(:,:,:)) + ELSE IF(KRR == 6) THEN + PTHS(:,:,:) = PTHS(:,:,:) + & + ZW(:,:,:) * (XLSTT + (XCPV - XCI) * (ZT(:,:,:) - XTT)) / & + ((XCPD + XCPV * PRVT(:,:,:) + XCL * (PRCT(:,:,:) + PRRT(:,:,:)) + & + XCI * (PRIT(:,:,:) + PRST(:,:,:) + PRGT(:,:,:))) * PEXNREF(:,:,:)) + END IF +! f(L_s*(RVHENI)) + ZZW(:) = MAX( ZZW(:)+ZCIT(:),ZCIT(:) ) + PCIT(:,:,:) = MAX( UNPACK( ZZW(:),MASK=GNEGT(:,:,:),FIELD=0.0 ) , & + PCIT(:,:,:) ) + END IF + DEALLOCATE(ZSSI) + DEALLOCATE(ZUSW) + DEALLOCATE(ZZW) + DEALLOCATE(ZPRES) + DEALLOCATE(ZZT) + DEALLOCATE(ZCIT) + DEALLOCATE(ZRVT) + + if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'HENU', pths(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rv ) call Budget_store_end( tbudgets(NBUDGET_RV), 'HENU', prvs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'HENU', pris(:, :, :) * prhodj(:, :, :) ) + +END IF + + END SUBROUTINE RAIN_ICE_ELEC_NUCLEATION +! +!------------------------------------------------------------------------------- +! + SUBROUTINE RAIN_ICE_ELEC_SLOW +! +!* 0. DECLARATIONS +! ------------ +USE MODD_CST, ONLY : XMNH_HUGE_12_LOG +! +IMPLICIT NONE +! +!------------------------------------------------------------------------------- +! +! +!* 3.5.1 compute the homogeneous nucleation source: RCHONI & QCHONI +! + if ( lbudget_sv ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'HON', & + Unpack( zqcs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'HON', & + Unpack( zqis(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + end if + + ZZW(:) = 0.0 + ZWQ1(:,1:7) = 0.0 +! + WHERE( ABS(ZECT(:)) <= XECMIN) + ZECT(:) = 0. + ENDWHERE +! + WHERE( (ZZT(:)<XTT-35.0) .AND. (ZRCT(:)>XRTMIN(2)) .AND. (ZRCS(:)>0.) ) + ZZW(:) = MIN( ZRCS(:),XHON*ZRHODREF(:)*ZRCT(:) & + *EXP( MIN(XMNH_HUGE_12_LOG,XALPHA3*(ZZT(:)-XTT)-XBETA3) ) ) + ZRIS(:) = ZRIS(:) + ZZW(:) + ZRCS(:) = ZRCS(:) - ZZW(:) + ZTHS(:) = ZTHS(:) + ZZW(:)*(ZLSFACT(:)-ZLVFACT(:)) ! f(L_f*(RCHONI)) + ZWQ1(:,1) = XQHON * ZECT(:) * ZZW(:) ! QCHONI + ENDWHERE +! + WHERE (ZZT(:) < (XTT - 35.) .AND. ZRIS(:) > ZRSMIN_ELEC(4) .AND. & + ZRCT(:) > XRTMIN_ELEC(2) .AND. ZRCS(:) > ZRSMIN_ELEC(2) .AND. & + ABS(ZQCS(:)) > XQTMIN(2) .AND. ABS(ZECT(:)) > XECMIN) + ZWQ1(:,1) = SIGN( MIN( ABS(ZQCS(:)),ABS(ZWQ1(:,1)) ),ZQCS(:) ) + ZQIS(:) = ZQIS(:) + ZWQ1(:,1) + ZQCS(:) = ZQCS(:) - ZWQ1(:,1) + END WHERE + + if ( lbudget_th ) call Budget_store_add( tbudgets(NBUDGET_TH), 'HON', Unpack( zzw(:) * ( zlsfact(:) - zlvfact(:) ) & + * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rc ) call Budget_store_add( tbudgets(NBUDGET_RC), 'HON', & + Unpack( -zzw(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_ri ) call Budget_store_add( tbudgets(NBUDGET_RI), 'HON', & + Unpack( zzw(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_sv ) then + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'HON', & + Unpack( zqcs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'HON', & + Unpack( zqis(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + end if +! +!* 3.5.2 compute the spontaneous freezing source: RRHONG & QRHONG +! + ZZW(:) = 0.0 +! + WHERE( (ZZT(:)<XTT-35.0) .AND. (ZRRT(:)>XRTMIN(3)) .AND. (ZRRS(:)>0.) ) + ZZW(:) = MIN( ZRRS(:),ZRRT(:)/PTSTEP ) + ZRGS(:) = ZRGS(:) + ZZW(:) + ZRRS(:) = ZRRS(:) - ZZW(:) + ZTHS(:) = ZTHS(:) + ZZW(:)*(ZLSFACT(:)-ZLVFACT(:)) ! f(L_f*(RRHONG)) + ENDWHERE +! + WHERE (ZZT(:) < (XTT - 35.) .AND. & + ZRRT(:) > XRTMIN_ELEC(3) .AND. ZRRS(:) > ZRSMIN_ELEC(3) .AND. & + ZRGS(:) > ZRSMIN_ELEC(6) .AND. ABS(ZQRT(:)) > XQTMIN(3)) + ZWQ1(:,2) = SIGN( MIN( ABS(ZQRS(:)),ABS(ZQRT(:)/PTSTEP) ),ZQRS(:) ) ! QRHONG + ZQGS(:) = ZQGS(:) + ZWQ1(:,2) + ZQRS(:) = ZQRS(:) - ZWQ1(:,2) + ENDWHERE + + if ( lbudget_th ) call Budget_store_add( tbudgets(NBUDGET_TH), 'SFR', Unpack( zzw(:) * ( zlsfact(:) - zlvfact(:) ) & + * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rr ) call Budget_store_add( tbudgets(NBUDGET_RR), 'SFR', & + Unpack( -zzw(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rg ) call Budget_store_add( tbudgets(NBUDGET_RG), 'SFR', & + Unpack( zzw(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_sv ) then + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'SFR', & + Unpack( -zwq1(:, 2) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'SFR', & + Unpack( zwq1(:, 2) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + end if +! +!* 3.5.3 compute the deposition, aggregation and autoconversion sources +! + ZKA(:) = 2.38E-2 + 0.0071E-2 * ( ZZT(:) - XTT ) ! k_a + ZDV(:) = 0.211E-4 * (ZZT(:)/XTT)**1.94 * (XP00/ZPRES(:)) ! D_v +! +!* 3.5.3.1 compute the thermodynamical function A_i(T,P) +!* and the c^prime_j (in the ventilation factor) +! + ZAI(:) = EXP( XALPI - XBETAI/ZZT(:) - XGAMI*ALOG(ZZT(:) ) ) ! es_i + ZAI(:) = ( XLSTT + (XCPV-XCI)*(ZZT(:)-XTT) )**2 / (ZKA(:)*XRV*ZZT(:)**2) & + + ( XRV*ZZT(:) ) / (ZDV(:)*ZAI(:)) + ZCJ(:) = XSCFAC * ZRHODREF(:)**0.3 / SQRT( 1.718E-5+0.0049E-5*(ZZT(:)-XTT) ) +! +!* 3.5.3.2 compute the riming-conversion of r_c for r_i production: RCAUTI +! + if ( lbudget_sv ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg ), 'DEPS', & + Unpack( zqpis(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecend ), 'DEPS', & + Unpack( zqnis(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'DEPS', & + Unpack( zqss(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + end if + + ZZW(:) = 0.0 +! + WHERE ((ZRST(:) > XRTMIN(5)) .AND. (ZRSS(:) > 0.0)) + ZZW(:) = ( ZSSI(:)/(ZRHODREF(:)*ZAI(:)) ) * & + ( X0DEPS*ZLBDAS(:)**XEX0DEPS + X1DEPS*ZCJ(:)*ZLBDAS(:)**XEX1DEPS ) + ZZW(:) = MIN( ZRVS(:),ZZW(:) ) * (0.5 + SIGN(0.5,ZZW(:))) & + - MIN( ZRSS(:),ABS(ZZW(:)) ) * (0.5 - SIGN(0.5,ZZW(:))) + ZRSS(:) = ZRSS(:) + ZZW(:) + ZRVS(:) = ZRVS(:) - ZZW(:) + ZTHS(:) = ZTHS(:) + ZZW(:)*ZLSFACT(:) + ZWQ1(:,5) = XCOEF_RQ_S * ZQST(:) * (-ZZW(:)) / ZRST(:) ! sublimation + END WHERE +! + WHERE (ZRST(:) > XRTMIN_ELEC(5) .AND. ZRSS(:) > ZRSMIN_ELEC(5) .AND. & + ZRVS(:) > ZRSMIN_ELEC(1) .AND. ABS(ZQST(:)) > XQTMIN(5) .AND. & + ZZW(:) < 0. .AND. (-ZZW(:) <= ZRSS(:))) + ZWQ1(:,5) = SIGN( MIN( ABS(ZQSS(:)),ABS(ZWQ1(:,5)) ),ZQSS(:) ) + ZQSS(:) = ZQSS(:) - ZWQ1(:,5) + ZQPIS(:) = ZQPIS(:) + MAX( 0.0,ZWQ1(:,5)/XECHARGE ) + ZQNIS(:) = ZQNIS(:) - MIN( 0.0,ZWQ1(:,5)/XECHARGE ) + ENDWHERE + + if ( lbudget_th ) call Budget_store_add( tbudgets(NBUDGET_TH), 'DEPS', Unpack( zzw(:) * zlsfact(:) & + * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rv ) call Budget_store_add( tbudgets(NBUDGET_RV), 'DEPS', & + Unpack( -zzw(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rs ) call Budget_store_add( tbudgets(NBUDGET_RS), 'DEPS', & + Unpack( zzw(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_sv ) then + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg ), 'DEPS', & + Unpack( zqpis(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecend ), 'DEPS', & + Unpack( zqnis(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'DEPS', & + Unpack( zqss(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + end if +! +!* 3.5.3.4 compute the aggregation on r_s: RIAGGS & QIAGGS +! + if ( lbudget_sv ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'AGGS', & + Unpack( zqis(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'AGGS', & + Unpack( zqss(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + end if + + ZZW(:) = 0.0 + ZLATHAMIAGGS(:) = 1.0 + IF (LIAGGS_LATHAM) THEN + ZLATHAMIAGGS(:) = 1.0 + 0.4E-10 * MIN( 2.25E10, & + ZEFIELDU(:)**2+ZEFIELDV(:)**2+ZEFIELDW(:)**2 ) + ENDIF +! + WHERE (ZRIT(:) > XRTMIN(4) .AND. ZRST(:) > XRTMIN(5) .AND. ZRIS(:) > 0.0) + ZZW(:) = MIN( ZRIS(:),XFIAGGS * EXP( XCOLEXIS*(ZZT(:)-XTT) ) & + * ZLATHAMIAGGS(:) & + * ZRIT(:) & + * ZLBDAS(:)**XEXIAGGS & + * ZRHOCOR(:) / ZCOR00 ) + ZRSS(:) = ZRSS(:) + ZZW(:) + ZRIS(:) = ZRIS(:) - ZZW(:) + ZWQ1(:,3) = XCOEF_RQ_I * ZZW(:) * ZQIT(:) / ZRIT(:) ! QIAGGS_coal + END WHERE +! + WHERE (ZRIT(:) > XRTMIN_ELEC(4) .AND. ZRIS(:) > ZRSMIN_ELEC(4) .AND. & + ZRSS(:) > ZRSMIN_ELEC(5) .AND. ABS(ZQIT(:)) > XQTMIN(4)) + ZWQ1(:,3) = SIGN( MIN( ABS(ZQIS(:)),ABS(ZWQ1(:,3)) ),ZQIS(:) ) + ZQSS(:) = ZQSS(:) + ZWQ1(:,3) + ZQIS(:) = ZQIS(:) - ZWQ1(:,3) + END WHERE + + if ( lbudget_ri ) call Budget_store_add( tbudgets(NBUDGET_RI), 'AGGS', & + Unpack( -zzw(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rs ) call Budget_store_add( tbudgets(NBUDGET_RS), 'AGGS', & + Unpack( zzw(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_sv ) then + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'AGGS', & + Unpack( zqis(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'AGGS', & + Unpack( zqss(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + end if + + if ( lbudget_sv ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'NIIS', & + Unpack( zqis(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'NIIS', & + Unpack( zqss(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + end if + + CALL ELEC_IAGGS_B() ! QIAGGS_boun + + if ( lbudget_sv ) then + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'NIIS', & + Unpack( zqis(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'NIIS', & + Unpack( zqss(:), mask = gmicro(:, :, :), field = 0. ) ) + end if + +! Save the NI charging rate for temporal series + XNI_IAGGS(:,:,:) = UNPACK(ZWQ1(:,7), MASK=GMICRO, FIELD=0.0) + XNI_IAGGS(:,:,:) = XNI_IAGGS(:,:,:) * PRHODREF(:,:,:) ! C/m3/s +! +!* 3.5.3.5 compute the autoconversion of r_i for r_s production: +! RIAUTS & QIAUTS +! + if ( lbudget_sv ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'AUTS', & + Unpack( zqis(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'AUTS', & + Unpack( zqss(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + end if + + ALLOCATE( ZCRIAUTI(IMICRO )) + ZCRIAUTI(:) = MIN(XCRIAUTI,10**(0.06*(ZZT(:)-XTT)-3.5)) + ZZW(:) = 0.0 +! + WHERE ((ZRIT(:) > XRTMIN(4)) .AND. (ZRIS(:) > 0.0)) + ZZW(:) = MIN( ZRIS(:),XTIMAUTI * EXP( XTEXAUTI*(ZZT(:)-XTT) ) & + * MAX( ZRIT(:)-ZCRIAUTI(:),0.0 ) ) + ZRSS(:) = ZRSS(:) + ZZW(:) + ZRIS(:) = ZRIS(:) - ZZW(:) + ZWQ1(:,4) = XCOEF_RQ_I * ZQIT(:) * ZZW(:) / ZRIT(:) ! QIAUTS + END WHERE +! + WHERE (ZRIT(:) > XRTMIN_ELEC(4) .AND. ZRIS(:) > ZRSMIN_ELEC(4) .AND. & + ZRSS(:) > ZRSMIN_ELEC(5) .AND. ABS(ZQIT(:)) > XQTMIN(4)) + ZWQ1(:,4) = SIGN( MIN( ABS(ZQIS(:)),ABS(ZWQ1(:,4)) ),ZQIS(:) ) + ZQSS(:) = ZQSS(:) + ZWQ1(:,4) + ZQIS(:) = ZQIS(:) - ZWQ1(:,4) + END WHERE +! + DEALLOCATE(ZCRIAUTI) + + if ( lbudget_ri ) call Budget_store_add( tbudgets(NBUDGET_RI), 'AUTS', & + Unpack( -zzw(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rs ) call Budget_store_add( tbudgets(NBUDGET_RS), 'AUTS', & + Unpack( zzw(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_sv ) then + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'AUTS', & + Unpack( zqis(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'AUTS', & + Unpack( zqss(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + end if +! +!* 3.5.3.6 compute the deposition on r_g: RVDEPG & QVDEPG +! + if ( lbudget_sv ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg ), 'DEPG', & + Unpack( zqpis(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecend ), 'DEPG', & + Unpack( zqnis(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'DEPG', & + Unpack( zqgs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + end if + + ZZW(:) = 0.0 +! + WHERE ((ZRGT(:) > XRTMIN(6)) .AND. (ZRGS(:) > 0.0)) + ZZW(:) = (ZSSI(:) / (ZRHODREF(:) * ZAI(:))) * & + (X0DEPG * ZLBDAG(:)**XEX0DEPG + X1DEPG * ZCJ(:) * ZLBDAG(:)**XEX1DEPG) + ZZW(:) = MIN( ZRVS(:),ZZW(:) )*(0.5+SIGN(0.5,ZZW(:))) & + - MIN( ZRGS(:),ABS(ZZW(:)) )*(0.5-SIGN(0.5,ZZW(:))) + ZRGS(:) = ZRGS(:) + ZZW(:) + ZRVS(:) = ZRVS(:) - ZZW(:) + ZTHS(:) = ZTHS(:) + ZZW(:)*ZLSFACT(:) + ZWQ1(:,6) = XCOEF_RQ_G * ZQGT(:) * (-ZZW(:)) / ZRGT(:) ! sublimation + END WHERE +! + WHERE (ZRGT(:) > XRTMIN_ELEC(6) .AND. ZRGS(:) > ZRSMIN_ELEC(6) .AND. & + ZRVS(:) > ZRSMIN_ELEC(1) .AND. ABS(ZQGT(:)) > XQTMIN(6) .AND. & + ZZW(:) < 0. .AND. (-ZZW(:)) <= ZRGS(:)) + ZWQ1(:,6) = SIGN( MIN( ABS(ZQGS(:)),ABS(ZWQ1(:,6)) ),ZQGS(:) ) + ZQGS(:) = ZQGS(:) - ZWQ1(:,6) + ZQPIS(:) = ZQPIS(:) + MAX( 0.0,ZWQ1(:,6)/XECHARGE ) + ZQNIS(:) = ZQNIS(:) - MIN( 0.0,ZWQ1(:,6)/XECHARGE ) + END WHERE + + if ( lbudget_th ) call Budget_store_add( tbudgets(NBUDGET_TH), 'DEPG', Unpack( zzw(:) * zlsfact(:) & + * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rv ) call Budget_store_add( tbudgets(NBUDGET_RV), 'DEPG', & + Unpack( -zzw(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rg ) call Budget_store_add( tbudgets(NBUDGET_RG), 'DEPG', & + Unpack( zzw(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_sv ) then + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg ), 'DEPG', & + Unpack( zqpis(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecend ), 'DEPG', & + Unpack( zqnis(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'DEPG', & + Unpack( zqgs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + end if + + END SUBROUTINE RAIN_ICE_ELEC_SLOW +! +!------------------------------------------------------------------------------- +! +! + SUBROUTINE RAIN_ICE_ELEC_WARM +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +REAL :: ZCRIAUTC ! Critical cloud mixing ratio +! +!------------------------------------------------------------------------------- +! +!* 4.1 compute the autoconversion of r_c for r_r production: +! RCAUTR & QCAUTR +! + if ( lbudget_sv ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'AUTO', & + Unpack( zqcs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'AUTO', & + Unpack( zqrs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + end if + + ZZW(:) = 0.0 + ZWQ1(:,1:3) = 0.0 +! + IF ( HSUBG_AUCV == 'CLFR' ) THEN + WHERE ((ZRCT(:) > 0.0) .AND. (ZRCS(:) > 0.0) .AND. (ZCF(:) > 0.0)) + ZZW(:) = XTIMAUTC * MAX( ZRCT(:)/(ZCF(:)) -XCRIAUTC/ZRHODREF(:),0.0) + ZZW(:) = MIN( ZRCS(:),(ZCF(:))*ZZW(:)) + ZRCS(:) = ZRCS(:) - ZZW(:) + ZRRS(:) = ZRRS(:) + ZZW(:) + ZWQ1(:,1) = XCOEF_RQ_C * ZQCT(:) * ZZW(:) / ZRCT(:) ! QCAUTR + END WHERE + ELSE IF (HSUBG_AUCV == 'SIGM') THEN + DO JL = 1, IMICRO + IF (ZRCS(JL) > 0.0) THEN + ZCRIAUTC = XCRIAUTC / ZRHODREF(JL) + IF (ZRCT(JL) > (ZCRIAUTC + ZSIGMA_RC(JL))) THEN + ZZW(JL) = MIN( ZRCS(JL) , XTIMAUTC* ( ZRCT(JL)-ZCRIAUTC ) ) + ELSEIF (ZRCT(JL) > (ZCRIAUTC - ZSIGMA_RC(JL)) .AND. & + ZRCT(JL) <= (ZCRIAUTC + ZSIGMA_RC(JL))) THEN + ZZW(JL) = MIN( ZRCS(JL) , XTIMAUTC*( ZRCT(JL)+ZSIGMA_RC(JL)-ZCRIAUTC )**2 & + /( 4. * ZSIGMA_RC(JL) ) ) + ENDIF + ZRCS(JL) = ZRCS(JL) - ZZW(JL) + ZRRS(JL) = ZRRS(JL) + ZZW(JL) + IF (ZRCT(JL) > 0.) THEN + ZWQ1(JL,1) = XCOEF_RQ_C * ZQCT(JL) * ZZW(JL) / ZRCT(JL) + END IF + ENDIF + END DO + ELSE + WHERE ((ZRCT(:) > XRTMIN(2)) .AND. (ZRCS(:) > 0.0)) + ZZW(:) = MIN( ZRCS(:),XTIMAUTC*MAX( ZRCT(:)-XCRIAUTC/ZRHODREF(:),0.0 ) ) + ZRCS(:) = ZRCS(:) - ZZW(:) + ZRRS(:) = ZRRS(:) + ZZW(:) + ZWQ1(:,1) = XCOEF_RQ_C * ZQCT(:) * ZZW(:) / ZRCT(:) ! QCAUTR + END WHERE + END IF +! + WHERE (ZRCT(:) > XRTMIN_ELEC(2) .AND. ZRCS(:) > ZRSMIN_ELEC(2) .AND. & + ZRRS(:) > ZRSMIN_ELEC(3) .AND. ABS(ZQCT(:)) > XQTMIN(2)) + ZWQ1(:,1) = SIGN( MIN( ABS(ZQCS(:)),ABS(ZWQ1(:,1)) ),ZQCS(:) ) + ZQCS(:) = ZQCS(:) - ZWQ1(:,1) + ZQRS(:) = ZQRS(:) + ZWQ1(:,1) + END WHERE + + if ( lbudget_rc ) call Budget_store_add( tbudgets(NBUDGET_RC), 'AUTO', & + Unpack( -zzw(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rr ) call Budget_store_add( tbudgets(NBUDGET_RR), 'AUTO', & + Unpack( zzw(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_sv ) then + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'AUTO', & + Unpack( zqcs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'AUTO', & + Unpack( zqrs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + end if +! +!* 4.2 compute the accretion of r_c for r_r production: RCACCR & QCACCR +! + if ( lbudget_sv ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'ACCR', & + Unpack( zqcs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'ACCR', & + Unpack( zqrs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + end if + + ZZW(:) = 0.0 + WHERE ((ZRCT(:) > XRTMIN(2)) .AND. (ZRRT(:) > XRTMIN(3)) .AND. (ZRCS(:) > 0.0)) + ZZW(:) = MIN( ZRCS(:),XFCACCR * ZRCT(:) & + * ZLBDAR(:)**XEXCACCR & + * ZRHOCOR(:)/ZCOR00 ) + ZRCS(:) = ZRCS(:) - ZZW(:) + ZRRS(:) = ZRRS(:) + ZZW(:) + ZWQ1(:,2) = XCOEF_RQ_C * ZQCT(:) * ZZW(:) / ZRCT(:) ! QCACCR + END WHERE +! + WHERE (ZRCT(:) > XRTMIN_ELEC(2) .AND. ZRRS(:) > ZRSMIN_ELEC(3) .AND. & + ZRCS(:) > ZRSMIN_ELEC(2) .AND. ABS(ZQCT(:)) > XQTMIN(2)) + ZWQ1(:,2) = SIGN( MIN( ABS(ZQCS(:)),ABS(ZWQ1(:,2)) ),ZQCS(:) ) + ZQCS(:) = ZQCS(:) - ZWQ1(:,2) + ZQRS(:) = ZQRS(:) + ZWQ1(:,2) + ENDWHERE + + if ( lbudget_rc ) call Budget_store_add( tbudgets(NBUDGET_RC), 'ACCR', & + Unpack( -zzw(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rr ) call Budget_store_add( tbudgets(NBUDGET_RR), 'ACCR', & + Unpack( zzw(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_sv ) then + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'ACCR', & + Unpack( zqcs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'ACCR', & + Unpack( zqrs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + end if +! +! +!* 4.3 compute the evaporation of r_r: RREVAV & QREVAV +! + if ( lbudget_sv ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg ), 'REVA', & + Unpack( zqpis(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecend ), 'REVA', & + Unpack( zqnis(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'REVA', & + Unpack( zqrs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + end if + + ZZW(:) = 0.0 + WHERE ((ZRRT(:) > XRTMIN(3)) .AND. (ZRCT(:) <= XRTMIN(2))) + ZZW(:) = EXP( XALPW - XBETAW/ZZT(:) - XGAMW*ALOG(ZZT(:) ) ) ! es_w + ZUSW(:) = 1.0 - ZRVT(:) * (ZPRES(:) - ZZW(:)) / ((XMV / XMD) * ZZW(:)) + ! Undersaturation over water + ZZW(:) = (XLVTT + (XCPV - XCL) * (ZZT(:) - XTT) )**2 / & + (ZKA(:) * XRV * ZZT(:)**2) + & + (XRV * ZZT(:)) / (ZDV(:) * ZZW(:)) + ZZW(:) = MIN( ZRRS(:),( MAX( 0.0,ZUSW(:) )/(ZRHODREF(:)*ZZW(:)) ) * & + ( X0EVAR*ZLBDAR(:)**XEX0EVAR+X1EVAR*ZCJ(:)*ZLBDAR(:)**XEX1EVAR ) ) + ZRRS(:) = ZRRS(:) - ZZW(:) + ZRVS(:) = ZRVS(:) + ZZW(:) + ZTHS(:) = ZTHS(:) - ZZW(:)*ZLVFACT(:) + ZWQ1(:,3) = XCOEF_RQ_R * ZQRT(:) * ZZW(:) / ZRRT(:) ! QREVAV + END WHERE +! + WHERE (ZRRT(:) > XRTMIN_ELEC(3) .AND. ZRRS(:) > ZRSMIN_ELEC(3) .AND. & + ZRVS(:) > ZRSMIN_ELEC(1) .AND. ZRCT(:) <= 0.0 .AND. & + ABS(ZQRT(:)) > XQTMIN(3)) + ZWQ1(:,3) = SIGN( MIN( ABS(ZQRS(:)),ABS(ZWQ1(:,3)) ),ZQRS(:) ) + ZQRS(:) = ZQRS(:) - ZWQ1(:,3) + ZQPIS(:) = ZQPIS(:) + MAX( 0.0,ZWQ1(:,3)/XECHARGE ) + ZQNIS(:) = ZQNIS(:) - MIN( 0.0,ZWQ1(:,3)/XECHARGE ) + ENDWHERE +! + PEVAP3D(:,:,:)=UNPACK(ZZW(:),MASK=GMICRO(:,:,:),FIELD=PEVAP3D(:,:,:)) + + if ( lbudget_th ) call Budget_store_add( tbudgets(NBUDGET_TH), 'REVA', & + Unpack( -zzw(:) * zlvfact(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rv ) call Budget_store_add( tbudgets(NBUDGET_RV), 'REVA', & + Unpack( zzw(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rr ) call Budget_store_add( tbudgets(NBUDGET_RR), 'REVA', & + Unpack( -zzw(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_sv ) then + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg ), 'REVA', & + Unpack( zqpis(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecend ), 'REVA', & + Unpack( zqnis(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'REVA', & + Unpack( zqrs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + end if + + END SUBROUTINE RAIN_ICE_ELEC_WARM +! +!------------------------------------------------------------------------------- +! + SUBROUTINE RAIN_ICE_ELEC_FAST_RS +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +!------------------------------------------------------------------------------- +! +!* 5.1 cloud droplet riming of the aggregates +! + ZZW1(:,:) = 0.0 + ZWQ1(:,1:7) = 0.0 +! + ALLOCATE( GRIM(IMICRO) ) + GRIM(:) = (ZRCT(:) > XRTMIN(2)) .AND. (ZRST(:) > XRTMIN(5)) .AND. & + (ZRCS(:) > 0.0) .AND. (ZZT(:) < XTT) + IGRIM = COUNT( GRIM(:) ) +! + IF (IGRIM > 0) THEN + if ( lbudget_sv ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'RIM', & + Unpack( zqcs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'RIM', & + Unpack( zqss(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'RIM', & + Unpack( zqgs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + end if +! +! 5.1.0 allocations +! + ALLOCATE( ZVEC1(IGRIM) ) + ALLOCATE( ZVEC2(IGRIM) ) + ALLOCATE( IVEC1(IGRIM) ) + ALLOCATE( IVEC2(IGRIM) ) +! +!* 5.1.1 select the ZLBDAS +! + ZVEC1(:) = PACK( ZLBDAS(:),MASK=GRIM(:) ) +! +!* 5.1.2 find the next lower indice for the ZLBDAS in the geometrical +!* set of Lbda_s used to tabulate some moments of the incomplete +! gamma function +! + ZVEC2(1:IGRIM) = MAX( 1.00001, MIN( REAL(NGAMINC)-0.00001, & + XRIMINTP1 * LOG( ZVEC1(1:IGRIM) ) + XRIMINTP2 ) ) + IVEC2(1:IGRIM) = INT( ZVEC2(1:IGRIM) ) + ZVEC2(1:IGRIM) = ZVEC2(1:IGRIM) - REAL( IVEC2(1:IGRIM) ) +! +!* 5.1.3 perform the linear interpolation of the normalized +!* "2+XDS"-moment of the incomplete gamma function +! + ZVEC1(1:IGRIM) = XGAMINC_RIM1( IVEC2(1:IGRIM)+1 )* ZVEC2(1:IGRIM) & + - XGAMINC_RIM1( IVEC2(1:IGRIM) )*(ZVEC2(1:IGRIM) - 1.0) + ZZW(:) = UNPACK( VECTOR=ZVEC1(:),MASK=GRIM,FIELD=0.0 ) +! +!* 5.1.4 riming of the small sized aggregates +! + WHERE (GRIM(:) .AND. ZRCS(:) > 0.0) + ZZW1(:,1) = MIN( ZRCS(:), & + XCRIMSS * ZZW(:) * ZRCT(:) * & ! RCRIMSS + ZLBDAS(:)**XEXCRIMSS * ZRHOCOR(:)/ZCOR00 ) + ZRCS(:) = ZRCS(:) - ZZW1(:,1) + ZRSS(:) = ZRSS(:) + ZZW1(:,1) + ZTHS(:) = ZTHS(:) + ZZW1(:,1) * (ZLSFACT(:) - ZLVFACT(:)) ! f(L_f*(RCRIMSS)) + ZWQ1(:,1) = XCOEF_RQ_C * ZQCT(:) * ZZW1(:,1) / ZRCT(:) ! QCRIMSS + END WHERE +! + WHERE (ZZT(:) < XTT .AND. & + ZRCT(:) > XRTMIN_ELEC(2) .AND. ZRSS(:) > ZRSMIN_ELEC(5) .AND. & + ABS(ZQCT(:)) > XQTMIN(2) .AND. ZRCS(:) > ZRSMIN_ELEC(2)) + ZWQ1(:,1) = SIGN( MIN( ABS(ZQCS(:)),ABS(ZWQ1(:,1)) ),ZQCS(:) ) + ZQCS(:) = ZQCS(:) - ZWQ1(:,1) + ZQSS(:) = ZQSS(:) + ZWQ1(:,1) + ENDWHERE +! +!* 5.1.5 perform the linear interpolation of the normalized +!* "XBS"-moment of the incomplete gamma function +! + ZVEC1(1:IGRIM) = XGAMINC_RIM2( IVEC2(1:IGRIM)+1 )* ZVEC2(1:IGRIM) & + - XGAMINC_RIM2( IVEC2(1:IGRIM) )*(ZVEC2(1:IGRIM) - 1.0) + ZZW(:) = UNPACK( VECTOR=ZVEC1(:),MASK=GRIM,FIELD=0.0 ) +! +! +!* 5.1.6 perform the linear interpolation of the normalized +!* "XFS"-moment of the incomplete gamma function +! + ZVEC1(1:IGRIM) = XGAMINC_RIM3( IVEC2(1:IGRIM)+1 ) * ZVEC2(1:IGRIM) & + - XGAMINC_RIM3( IVEC2(1:IGRIM) ) * (ZVEC2(1:IGRIM) - 1.0) + ZWQ1(:,3) = UNPACK( VECTOR=ZVEC1(:), MASK=GRIM, FIELD=0.0 ) +! +!* 5.1.7 riming-conversion of the large sized aggregates into graupeln: +!* RSRIMCG & QSRIMCG and RCRIMSG & QCRIMSG +! + WHERE (GRIM(:) .AND. ZRSS(:) > 0.0 .AND. ZRCS(:) > 0.0 .AND. ZZW(:) < 1.) + ZZW1(:,2) = MIN( ZRCS(:), & + XCRIMSG * ZRCT(:) & ! RCRIMSG + * ZLBDAS(:)**XEXCRIMSG & + * ZRHOCOR(:)/ZCOR00 - ZZW1(:,1) ) + ZZW1(:,3) = MIN( ZRSS(:), & + XSRIMCG * ZLBDAS(:)**XEXSRIMCG & ! RSRIMCG + * (1.0 - ZZW(:) )/(PTSTEP*ZRHODREF(:)) ) + ZRCS(:) = ZRCS(:) - ZZW1(:,2) + ZRSS(:) = ZRSS(:) - ZZW1(:,3) + ZRGS(:) = ZRGS(:) + ZZW1(:,2) + ZZW1(:,3) + ZTHS(:) = ZTHS(:) + ZZW1(:,2) * (ZLSFACT(:) - ZLVFACT(:)) ! f(L_f*(RCRIMSG)) + ZWQ1(:,2) = XCOEF_RQ_C * ZQCT(:) * ZZW1(:,2) / ZRCT(:) ! QCRIMSG + ZWQ1(:,3) = XQSRIMCG * ZEST(:) * & ! QSRIMCG + ZLBDAS(:)**XEXQSRIMCG * (1. - ZWQ1(:,3)) / & + (PTSTEP * ZRHODREF(:)) + END WHERE +! + WHERE (ZRCT(:) > XRTMIN_ELEC(2) .AND. ZRST(:) > XRTMIN_ELEC(5) .AND. & + ZRSS(:) > ZRSMIN_ELEC(5) .AND. ZRCS(:) > ZRSMIN_ELEC(2) .AND. & + ZZT(:) < XTT .AND. ABS(ZQCT(:)) > XQTMIN(2)) + ZWQ1(:,2) = SIGN( MIN( ABS(ZQCS(:)),ABS(ZWQ1(:,2)) ),ZQCS(:) ) + ZQGS(:) = ZQGS(:) + ZWQ1(:,2) + ZQCS(:) = ZQCS(:) - ZWQ1(:,2) + ENDWHERE +! + WHERE (ZRCT(:) > XRTMIN_ELEC(2) .AND. ZRST(:) > XRTMIN_ELEC(5) .AND. & + ZRSS(:) > ZRSMIN_ELEC(5) .AND. ZRCS(:) > ZRSMIN_ELEC(2) .AND. & + ZZT(:) < XTT .AND. ABS(ZQCT(:)) > XQTMIN(2) .AND. & + ABS(ZEST) > XESMIN) + ZWQ1(:,3) = SIGN( MIN( ABS(ZQSS(:)),ABS(ZWQ1(:,3)) ),ZQSS(:) ) + ZQGS(:) = ZQGS(:) + ZWQ1(:,3) + ZQSS(:) = ZQSS(:) - ZWQ1(:,3) + ENDWHERE +! + DEALLOCATE(IVEC2) + DEALLOCATE(IVEC1) + DEALLOCATE(ZVEC2) + DEALLOCATE(ZVEC1) + + if ( lbudget_th ) call Budget_store_add( tbudgets(NBUDGET_TH), 'RIM', Unpack( ( zzw1(:,1) + zzw1(:,2) ) & + * ( zlsfact(:) - zlvfact(:) ) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rc ) call Budget_store_add( tbudgets(NBUDGET_RC), 'RIM', & + Unpack( ( -zzw1(:,1) - zzw1(:,2) ) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rs ) call Budget_store_add( tbudgets(NBUDGET_RS), 'RIM', & + Unpack( ( zzw1(:,1) - zzw1(:,3) ) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rg ) call Budget_store_add( tbudgets(NBUDGET_RG), 'RIM', & + Unpack( ( zzw1(:,2) + zzw1(:,3) ) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_sv ) then + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'RIM', & + Unpack( zqcs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'RIM', & + Unpack( zqss(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'RIM', & + Unpack( zqgs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + end if + END IF +! + DEALLOCATE(GRIM) +! +! +!* 5.2 rain accretion onto the aggregates +! + ZZW1(:,2:3) = 0.0 + ZWQ4(:) = 0.0 +! + ALLOCATE(GACC(IMICRO)) + GACC(:) = ZRRT(:)>XRTMIN(3) .AND. ZRST(:)>XRTMIN(5) .AND. & + ZRRS(:) > 0.0 .AND. ZZT(:) < XTT + IGACC = COUNT( GACC(:) ) +! + IF( IGACC>0 ) THEN + if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'ACC', & + Unpack( zths(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rr ) call Budget_store_init( tbudgets(NBUDGET_RR), 'ACC', & + Unpack( zrrs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rs ) call Budget_store_init( tbudgets(NBUDGET_RS), 'ACC', & + Unpack( zrss(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rg ) call Budget_store_init( tbudgets(NBUDGET_RG), 'ACC', & + Unpack( zrgs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_sv ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'ACC', & + Unpack( zqrs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'ACC', & + Unpack( zqss(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'ACC', & + Unpack( zqgs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + end if +! +! 5.2.0 allocations +! + ALLOCATE(ZVEC1(IGACC)) + ALLOCATE(ZVEC2(IGACC)) + ALLOCATE(ZVEC3(IGACC)) + ALLOCATE(IVEC1(IGACC)) + ALLOCATE(IVEC2(IGACC)) +! + ALLOCATE( ZVECQ4(IGACC) ) + ALLOCATE( ZVECQ5(IGACC) ) + ALLOCATE( ZVECQ6(IGACC) ) +! +! +! 5.2.1 select the (ZLBDAS,ZLBDAR) couplet +! + ZVEC1(:) = PACK( ZLBDAS(:),MASK=GACC(:) ) + ZVEC2(:) = PACK( ZLBDAR(:),MASK=GACC(:) ) +! +! 5.2.2 find the next lower indice for the ZLBDAS and for the ZLBDAR +! in the geometrical set of (Lbda_s,Lbda_r) couplet use to +! tabulate the RACCSS-kernel +! + ZVEC1(1:IGACC) = MAX( 1.00001, MIN( REAL(NACCLBDAS)-0.00001, & + XACCINTP1S * LOG( ZVEC1(1:IGACC) ) + XACCINTP2S ) ) + IVEC1(1:IGACC) = INT( ZVEC1(1:IGACC) ) + ZVEC1(1:IGACC) = ZVEC1(1:IGACC) - REAL( IVEC1(1:IGACC) ) +! + ZVEC2(1:IGACC) = MAX( 1.00001, MIN( REAL(NACCLBDAR)-0.00001, & + XACCINTP1R * LOG( ZVEC2(1:IGACC) ) + XACCINTP2R ) ) + IVEC2(1:IGACC) = INT( ZVEC2(1:IGACC) ) + ZVEC2(1:IGACC) = ZVEC2(1:IGACC) - REAL( IVEC2(1:IGACC) ) +! +! 5.2.3 perform the bilinear interpolation of the normalized +! RACCSS-kernel +! + ZVEC3(:) = BI_LIN_INTP_V(XKER_RACCSS, IVEC1, IVEC2, ZVEC1, ZVEC2, IGACC) + ZZW(:) = UNPACK( VECTOR=ZVEC3(:),MASK=GACC,FIELD=0.0 ) +! + ZVECQ5(:) = BI_LIN_INTP_V(XKER_Q_RACCSS, IVEC1, IVEC2, ZVEC1, ZVEC2, IGACC) + ZWQ1(:,5) = UNPACK( VECTOR=ZVECQ5(:), MASK=GACC, FIELD=0.0 ) +! +! 5.2.4 raindrop accretion on the small sized aggregates: +! RRACCSS & QRACCSS +! + WHERE ( GACC(:) ) + ZZW1(:,2) = & !! coef of RRACCS + XFRACCSS*( ZLBDAS(:)**XCXS )*ZRHOCOR(:)/(ZCOR00* ZRHODREF(:)) & + *( XLBRACCS1/((ZLBDAS(:)**2) ) + & + XLBRACCS2/( ZLBDAS(:) * ZLBDAR(:) ) + & + XLBRACCS3/( (ZLBDAR(:)**2)) )/ZLBDAR(:)**4 + ZZW1(:,4) = MIN( ZRRS(:),ZZW1(:,2)*ZZW(:) ) ! RRACCSS + ZRRS(:) = ZRRS(:) - ZZW1(:,4) + ZRSS(:) = ZRSS(:) + ZZW1(:,4) + ZTHS(:) = ZTHS(:) + ZZW1(:,4)*(ZLSFACT(:)-ZLVFACT(:)) ! f(L_f*(RRACCSS)) + ZWQ4(:) = XFQRACCS * ZERT(:) * ZRHOCOR(:)/(ZCOR00* ZRHODREF(:)) * & + ZLBDAR(:)**XCXR * ZLBDAS(:)**XCXS * & + (XLBQRACCS1 * ZLBDAR(:)**(-2.0 - XFR) + & + XLBQRACCS2 * ZLBDAR(:)**(-1.0 - XFR) * ZLBDAS(:)**(-1.0) + & + XLBQRACCS3 * ZLBDAR(:)**(-XFR) * ZLBDAS(:)**(-2.0)) + ZWQ1(:,5) = ZWQ1(:,5) * ZWQ4(:) ! QRACCSS + END WHERE +! + WHERE (ZRRT(:) > XRTMIN_ELEC(3) .AND. ZRST(:) > XRTMIN_ELEC(5) .AND. & + ZRRS(:) > ZRSMIN_ELEC(3) .AND. ZZT(:) < XTT .AND. & + ABS(ZQRS(:)) > XQTMIN(3) .AND. ABS(ZERT) > XERMIN) + ZWQ1(:,5) = SIGN( MIN( ABS(ZQRS(:)),ABS(ZWQ1(:,5)) ),ZQRS(:) ) + ZQRS(:) = ZQRS(:) - ZWQ1(:,5) + ZQSS(:) = ZQSS(:) + ZWQ1(:,5) + ENDWHERE +! +! 5.2.5 perform the bilinear interpolation of the normalized +! RACCS-kernel +! + ZVEC3(:) = BI_LIN_INTP_V(XKER_RACCS, IVEC1, IVEC2, ZVEC1, ZVEC2, IGACC) + ZZW1(:,2) = ZZW1(:,2)*UNPACK( VECTOR=ZVEC3(:),MASK=GACC(:),FIELD=0.0 ) + !! RRACCS! +! + ZVECQ4(:) = BI_LIN_INTP_V(XKER_Q_RACCS, IVEC1, IVEC2, ZVEC1, ZVEC2, IGACC) + ZWQ1(:,4) = UNPACK( VECTOR=ZVECQ4(:), MASK=GACC, FIELD=0.0 ) +! +! 5.2.6 perform the bilinear interpolation of the normalized +! SACCRG-kernel +! + ZVEC3(:) = BI_LIN_INTP_V(XKER_SACCRG, IVEC2, IVEC1, ZVEC2, ZVEC1, IGACC) + ZZW(:) = UNPACK( VECTOR=ZVEC3(:),MASK=GACC,FIELD=0.0 ) +! + ZVECQ6(:) = BI_LIN_INTP_V(XKER_Q_SACCRG, IVEC2,IVEC1, ZVEC2, ZVEC1, IGACC) + ZWQ1(:,6) = UNPACK( VECTOR=ZVECQ6(:), MASK=GACC, FIELD=0.0 ) + ZWQ1(:,4) = ZWQ1(:,4) * ZWQ4(:) ! QRACCS +! +! 5.2.7 raindrop accretion-conversion of the large sized aggregates +! into graupeln: RRACCSG & QRACCSG and RSACCRG & QSACCRG +! + WHERE ( GACC(:) .AND. (ZRSS(:)>0.0) ) + ZZW1(:,2) = MIN( ZRRS(:),ZZW1(:,2)-ZZW1(:,4) ) ! RRACCSG + ZZW1(:,3) = MIN( ZRSS(:),XFSACCRG*ZZW(:)* & ! RSACCRG + ( ZLBDAS(:)**(XCXS-XBS) )*ZRHOCOR(:)/(ZCOR00* ZRHODREF(:)) & + *( XLBSACCR1/((ZLBDAR(:)**2) ) + & + XLBSACCR2/( ZLBDAR(:) * ZLBDAS(:) ) + & + XLBSACCR3/( (ZLBDAS(:)**2)) )/ZLBDAR(:) ) + ZRRS(:) = ZRRS(:) - ZZW1(:,2) + ZRSS(:) = ZRSS(:) - ZZW1(:,3) + ZRGS(:) = ZRGS(:) + ZZW1(:,2)+ZZW1(:,3) + ZTHS(:) = ZTHS(:) + ZZW1(:,2)*(ZLSFACT(:)-ZLVFACT(:)) ! f(L_f*(RRACCSG)) + ZWQ1(:,4) = ZWQ1(:,4) - ZWQ1(:,5) ! QRACCSG + ZWQ1(:,6) = ZWQ1(:,6) * XFQRACCS * ZEST(:) * & + ZRHOCOR(:) / (ZCOR00 * ZRHODREF(:)) * & + ZLBDAR(:)**XCXR * ZLBDAS(:)**XCXS * & + (XLBQSACCRG1 * ZLBDAS(:)**(-2.0 - XFS) + & + XLBQSACCRG2 * ZLBDAS(:)**(-1.0 - XFS) * ZLBDAR(:)**(-1.0) + & + XLBQSACCRG3 * ZLBDAS(:)**(-XFS) * ZLBDAR(:)**(-2.0)) ! QSACCR + END WHERE +! + WHERE (ZRRT(:) > XRTMIN_ELEC(3) .AND. ZRST(:) > XRTMIN_ELEC(5) .AND. & + ZRSS(:) > ZRSMIN_ELEC(5) .AND. ZRRS(:) > ZRSMIN_ELEC(3) .AND. & + ZZT(:) < XTT .AND. ABS(ZQGS(:)) > XQTMIN(6)) + ZWQ1(:,4) = SIGN( MIN( ABS(ZQRS(:)),ABS(ZWQ1(:,4)) ),ZQRS(:) ) + ZQRS(:) = ZQRS(:) - ZWQ1(:,4) + ZQGS(:) = ZQGS(:) + ZWQ1(:,4) + ENDWHERE +! + WHERE (ZRRT(:) > XRTMIN_ELEC(3) .AND. ZRST(:) > XRTMIN_ELEC(5) .AND. & + ZRSS(:) > ZRSMIN_ELEC(5) .AND. ZRRS(:) > ZRSMIN_ELEC(3) .AND. & + ZZT(:) < XTT .AND. ABS(ZQGS(:)) > XQTMIN(6) .AND. & + ABS(ZEST) > XESMIN) + ZWQ1(:,6) = SIGN( MIN( ABS(ZQSS(:)),ABS(ZWQ1(:,6)) ),ZQSS(:) ) + ZQSS(:) = ZQSS(:) - ZWQ1(:,6) + ZQGS(:) = ZQGS(:) + ZWQ1(:,6) + ENDWHERE +! + DEALLOCATE(IVEC2) + DEALLOCATE(IVEC1) + DEALLOCATE(ZVEC3) + DEALLOCATE(ZVEC2) + DEALLOCATE(ZVEC1) + DEALLOCATE( ZVECQ4 ) + DEALLOCATE( ZVECQ5 ) + DEALLOCATE( ZVECQ6 ) + + if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'ACC', & + Unpack( zths(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rr ) call Budget_store_end( tbudgets(NBUDGET_RR), 'ACC', & + Unpack( zrrs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rs ) call Budget_store_end( tbudgets(NBUDGET_RS), 'ACC', & + Unpack( zrss(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rg ) call Budget_store_end( tbudgets(NBUDGET_RG), 'ACC', & + Unpack( zrgs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_sv ) then + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'ACC', & + Unpack( zqrs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'ACC', & + Unpack( zqss(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'ACC', & + Unpack( zqgs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + end if + END IF + + DEALLOCATE(GACC) +! +!* 5.3 Conversion-Melting of the aggregates: RSMLT & QSMLT +! + if ( lbudget_sv ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'CMEL', & + Unpack( zqss(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'CMEL', & + Unpack( zqgs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + end if + + ZZW(:) = 0.0 + WHERE ((ZRST(:) > XRTMIN(5)) .AND. (ZRSS(:) > 0.0) .AND. (ZZT(:) > XTT)) + ZZW(:) = ZRVT(:) * ZPRES(:) / ((XMV / XMD) + ZRVT(:)) ! Vapor pressure + ZZW(:) = ZKA(:) * (XTT - ZZT(:)) + & + (ZDV(:) * (XLVTT + (XCPV - XCL) * (ZZT(:) - XTT)) * & + (XESTT - ZZW(:)) / (XRV * ZZT(:))) +! +! compute RSMLT +! + ZZW(:) = MIN( ZRSS(:), XFSCVMG * MAX( 0.0,( -ZZW(:) * & + (X0DEPS * ZLBDAS(:)**XEX0DEPS + & + X1DEPS * ZCJ(:) * ZLBDAS(:)**XEX1DEPS ) - & + (ZZW1(:,1) + ZZW1(:,4)) * & + (ZRHODREF(:) * XCL * (XTT - ZZT(:)))) / & + (ZRHODREF(:) * XLMTT))) +! +! note that RSCVMG = RSMLT*XFSCVMG but no heat is exchanged (at the rate RSMLT) +! because the graupeln produced by this process are still icy!!! +! + ZRSS(:) = ZRSS(:) - ZZW(:) + ZRGS(:) = ZRGS(:) + ZZW(:) + ZWQ1(:,7) = XCOEF_RQ_S * ZQST(:) * ZZW(:) / ZRST(:) ! QSMLT + END WHERE +! + WHERE (ZRST(:) > XRTMIN_ELEC(5) .AND. ZRSS(:) > ZRSMIN_ELEC(5) .AND. & + ZRGT(:) > XRTMIN_ELEC(6) .AND. ABS(ZQST(:)) > XQTMIN(5) .AND. & + ZZT(:) > XTT .AND. ZRHODREF(:)*XLMTT > 0.) + ZWQ1(:,7) = SIGN( MIN( ABS(ZQSS(:)),ABS(ZWQ1(:,7)) ),ZQSS(:) ) + ZQGS(:) = ZQGS(:) + ZWQ1(:,7) + ZQSS(:) = ZQSS(:) - ZWQ1(:,7) + ENDWHERE + + if ( lbudget_rs ) call Budget_store_add( tbudgets(NBUDGET_RS), 'CMEL', & + Unpack( -zzw(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rg ) call Budget_store_end( tbudgets(NBUDGET_RG), 'CMEL', & + Unpack( zzw(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_sv ) then + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'CMEL', & + Unpack( zqss(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'CMEL', & + Unpack( zqgs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + end if + + END SUBROUTINE RAIN_ICE_ELEC_FAST_RS +! +!------------------------------------------------------------------------------- +! +! + SUBROUTINE RAIN_ICE_ELEC_FAST_RG +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +!------------------------------------------------------------------------------- +! +!* 6.1 rain contact freezing: RICFRRG & QICFRRG and RRCFRIG & QRCFRIG +! + if ( lbudget_sv ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'CFRZ', & + Unpack( zqrs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'CFRZ', & + Unpack( zqis(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'CFRZ', & + Unpack( zqgs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + end if + + ZZW1(:,3:4) = 0.0 + ZWQ1(:,3:4) = 0.0 + WHERE ((ZRIT(:) > XRTMIN(4)) .AND. (ZRRT(:) > XRTMIN(3)) .AND. & + (ZRIS(:) > 0.0) .AND. (ZRRS(:) > 0.0)) + ZZW1(:,3) = MIN( ZRIS(:),XICFRR * ZRIT(:) & ! RICFRRG + * ZLBDAR(:)**XEXICFRR & + * ZRHOCOR(:) / ZCOR00 ) + ZZW1(:,4) = MIN( ZRRS(:),XRCFRI * ZCIT(:) & ! RRCFRIG + * ZLBDAR(:)**XEXRCFRI & + * ZRHOCOR(:) / (ZCOR00 * ZRHODREF(:)) ) + ZRIS(:) = ZRIS(:) - ZZW1(:,3) + ZRRS(:) = ZRRS(:) - ZZW1(:,4) + ZRGS(:) = ZRGS(:) + ZZW1(:,3) + ZZW1(:,4) + ZTHS(:) = ZTHS(:) + ZZW1(:,4) * (ZLSFACT(:) - ZLVFACT(:)) ! f(L_f*RRCFRIG) + ZWQ1(:,4) = XQRCFRIG * ZLBDAR(:)**XEXQRCFRIG * ZCIT(:) * & + ZERT(:) * ZRHOCOR(:) / (ZCOR00 * ZRHODREF(:)) ! QRCFRIG + ZWQ1(:,3) = XCOEF_RQ_I * ZQIT(:) * ZZW1(:,3) / ZRIT(:) ! QICFRRG + END WHERE +! + WHERE (ZRIT(:) > XRTMIN_ELEC(4) .AND. ZRRT(:) > XRTMIN_ELEC(3) .AND. & + ZRIS(:) > ZRSMIN_ELEC(4) .AND. ZRRS(:) > ZRSMIN_ELEC(3) .AND. & + ABS(ZERT) > XERMIN .AND. ABS(ZQRT(:)) > XQTMIN(3)) + ZWQ1(:,4) = SIGN( MIN( ABS(ZQRS(:)),ABS(ZWQ1(:,4)) ),ZQRS(:) ) + ZQGS(:) = ZQGS(:) + ZWQ1(:,4) + ZQRS(:) = ZQRS(:) - ZWQ1(:,4) + ENDWHERE +! + WHERE (ZRIT(:) > XRTMIN_ELEC(4) .AND. ZRRT(:) > XRTMIN_ELEC(3) .AND. & + ZRIS(:) > ZRSMIN_ELEC(4) .AND. ZRRS(:) > ZRSMIN_ELEC(3) .AND. & + ABS(ZQIT(:)) > XQTMIN(4)) + ZWQ1(:,3) = SIGN( MIN( ABS(ZQIS(:)),ABS(ZWQ1(:,3)) ),ZQIS(:) ) + ZQGS(:) = ZQGS(:) + ZWQ1(:,3) + ZQIS(:) = ZQIS(:) - ZWQ1(:,3) + ENDWHERE + + if ( lbudget_th ) call Budget_store_add( tbudgets(NBUDGET_TH), 'CFRZ', Unpack( zzw1(:,4) * ( zlsfact(:) - zlvfact(:) ) & + * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rr ) call Budget_store_add( tbudgets(NBUDGET_RR), 'CFRZ', & + Unpack( -zzw1(:, 4) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_ri ) call Budget_store_add( tbudgets(NBUDGET_RI), 'CFRZ', & + Unpack( -zzw1(:, 3) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rg ) call Budget_store_add( tbudgets(NBUDGET_RG), 'CFRZ', & + Unpack( ( zzw1(:, 3) + zzw1(:, 4) ) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_sv ) then + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'CFRZ', & + Unpack( zqrs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'CFRZ', & + Unpack( zqis(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'CFRZ', & + Unpack( zqgs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + end if +! +!* 6.2 compute the Dry growth case +! + if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'WETG', & + Unpack( zths(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'WETG', & + Unpack( zrcs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rr ) call Budget_store_init( tbudgets(NBUDGET_RR), 'WETG', & + Unpack( zrrs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), 'WETG', & + Unpack( zris(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rs ) call Budget_store_init( tbudgets(NBUDGET_RS), 'WETG', & + Unpack( zrss(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rg ) call Budget_store_init( tbudgets(NBUDGET_RG), 'WETG', & + Unpack( zrgs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rh ) call Budget_store_init( tbudgets(NBUDGET_RH), 'WETG', & + Unpack( zrhs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_sv ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'WETG', & + Unpack( zqcs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'WETG', & + Unpack( zqrs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'WETG', & + Unpack( zqis(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'WETG', & + Unpack( zqss(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'WETG', & + Unpack( zqgs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( krr == 7 ) & + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'WETG', & + Unpack( zqhs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + end if + + ZZW1(:,:) = 0.0 + ZWQ1(:,1:10) = 0.0 + ZWQ3(:) = 0.0 + ZWQ4(:) = 0.0 +! +!* 6.2.1 compute RCDRYG & QCDRYG +! + WHERE ((ZRGT(:) > XRTMIN(6)) .AND. ((ZRCT(:) > XRTMIN(2) .AND. ZRCS(:) > 0.0))) + ZZW(:) = ZLBDAG(:)**(XCXG-XDG-2.0) * ZRHOCOR(:) / ZCOR00 + ZZW1(:,1) = MIN( ZRCS(:),XFCDRYG * ZRCT(:) * ZZW(:) ) ! RCDRYG + ZWQ1(:,1) = XCOEF_RQ_C * ZQCT(:) * ZZW1(:,1) / ZRCT(:) ! QCDRYG + END WHERE +! + WHERE (ZRCT(:) > XRTMIN_ELEC(2) .AND. ZRGT(:) > XRTMIN_ELEC(6) .AND. & + ABS(ZQCT(:)) > XQTMIN(2) .AND. ZRCS(:) > ZRSMIN_ELEC(2)) + ZWQ1(:,1) = SIGN( MIN( ABS(ZQCS(:)),ABS(ZWQ1(:,1)) ),ZQCS(:) ) + ELSEWHERE + ZWQ1(:,1) = 0. + ENDWHERE +! +!* 6.2.2 compute RIDRYG & QIDRYG +! + WHERE ((ZRGT(:) > XRTMIN(6)) .AND. ((ZRIT(:) > XRTMIN(4) .AND. ZRIS(:) > 0.0)) ) + ZZW(:) = ZLBDAG(:)**(XCXG-XDG-2.0) * ZRHOCOR(:)/ZCOR00 + ZZW1(:,2) = MIN( ZRIS(:),XFIDRYG * EXP( XCOLEXIG*(ZZT(:)-XTT) ) & + * ZRIT(:) * ZZW(:) ) ! RIDRYG + ZWQ1(:,2) = XCOEF_RQ_I * ZQIT(:) * ZZW1(:,2) / ZRIT(:) ! QIDRYG_coal + END WHERE +! + WHERE (GELEC(:,2)) + ZWQ1(:,2) = SIGN( MIN( ABS(ZQIS(:)),ABS(ZWQ1(:,2)) ),ZQIS(:) ) + ELSEWHERE + ZWQ1(:,2) = 0. + ENDWHERE +! + CALL ELEC_IDRYG_B() ! QIDRYG_boun +! +! Save the NI charging rate for temporal series + XNI_IDRYG(:,:,:) = UNPACK(ZWQ1(:,3), MASK=GMICRO, FIELD=0.0) + XNI_IDRYG(:,:,:) = XNI_IDRYG(:,:,:) * PRHODREF(:,:,:) ! C/m3/s +! +!* 6.2.3 accretion of aggregates on the graupeln +! + ALLOCATE(GDRY(IMICRO)) + GDRY(:) = (ZRST(:)>XRTMIN(5)) .AND. (ZRGT(:)>XRTMIN(6)) .AND. (ZRSS(:)>0.0) + IGDRY = COUNT( GDRY(:) ) +! + IF( IGDRY>0 ) THEN +! +! 6.2.3.1 allocations +! + ALLOCATE(ZVEC1(IGDRY)) + ALLOCATE(ZVEC2(IGDRY)) + ALLOCATE(ZVEC3(IGDRY)) + ALLOCATE(IVEC1(IGDRY)) + ALLOCATE(IVEC2(IGDRY)) +! + ALLOCATE( ZVECQ4(IGDRY) ) + ALLOCATE( ZVECQ5(IGDRY) ) + ALLOCATE( ZVECQ6(IGDRY) ) +! + IF (CNI_CHARGING == 'TAKAH' .OR. CNI_CHARGING == 'SAUN1' .OR. & + CNI_CHARGING == 'SAUN2' .OR. CNI_CHARGING == 'SAP98' .OR. & + CNI_CHARGING == 'BSMP1' .OR. CNI_CHARGING == 'BSMP2' .OR. & + CNI_CHARGING == 'TEEWC' .OR. CNI_CHARGING == 'TERAR' .OR. & + CNI_CHARGING == 'GARDI') & +! + ALLOCATE( ZAUX(IGDRY) ) +! +! 6.2.3.2 select the (ZLBDAG,ZLBDAS) couplet +! + ZVEC1(:) = PACK( ZLBDAG(:),MASK=GDRY(:) ) + ZVEC2(:) = PACK( ZLBDAS(:),MASK=GDRY(:) ) +! +! 6.2.3.3 find the next lower indice for the ZLBDAG and for the ZLBDAS +! in the geometrical set of (Lbda_g,Lbda_s) couplet use to +! tabulate the SDRYG-kernel +! + ZVEC1(1:IGDRY) = MAX( 1.00001, MIN( REAL(NDRYLBDAG)-0.00001, & + XDRYINTP1G * LOG( ZVEC1(1:IGDRY) ) + XDRYINTP2G ) ) + IVEC1(1:IGDRY) = INT( ZVEC1(1:IGDRY) ) + ZVEC1(1:IGDRY) = ZVEC1(1:IGDRY) - REAL( IVEC1(1:IGDRY) ) +! + ZVEC2(1:IGDRY) = MAX( 1.00001, MIN( REAL(NDRYLBDAS)-0.00001, & + XDRYINTP1S * LOG( ZVEC2(1:IGDRY) ) + XDRYINTP2S ) ) + IVEC2(1:IGDRY) = INT( ZVEC2(1:IGDRY) ) + ZVEC2(1:IGDRY) = ZVEC2(1:IGDRY) - REAL( IVEC2(1:IGDRY) ) +! +! 6.2.3.4 perform the bilinear interpolation of the normalized +! SDRYG-kernel +! +! normalized SDRYG-kernel + ZVEC3(:) = BI_LIN_INTP_V(XKER_SDRYG, IVEC1, IVEC2, ZVEC1, ZVEC2, IGDRY) + ZZW(:) = UNPACK( VECTOR=ZVEC3(:),MASK=GDRY,FIELD=0.0 ) +! +! normalized Q-SDRYG-kernel + ZVECQ4(:) = BI_LIN_INTP_V(XKER_Q_SDRYG, IVEC1, IVEC2, ZVEC1, ZVEC2, IGDRY) + ZWQ1(:,4) = UNPACK( VECTOR=ZVECQ4(:), MASK=GDRY, FIELD=0.0 ) +! +! normalized Q-???-kernel + IF (CNI_CHARGING == 'TAKAH' .OR. CNI_CHARGING == 'SAUN1' .OR. & + CNI_CHARGING == 'SAUN2' .OR. CNI_CHARGING == 'SAP98' .OR. & + CNI_CHARGING == 'GARDI' .OR. & + CNI_CHARGING == 'BSMP1' .OR. CNI_CHARGING == 'BSMP2' .OR. & + CNI_CHARGING == 'TEEWC' .OR. CNI_CHARGING == 'TERAR') THEN + ZAUX(:) = BI_LIN_INTP_V(XKER_Q_LIMSG, IVEC1, IVEC2, ZVEC1, ZVEC2, IGDRY) + ZAUX1(:) = UNPACK( VECTOR=ZAUX(:), MASK=GDRY, FIELD=0.0 ) + END IF +! +! normalized Q-SDRYG-bouncing kernel + IF (CNI_CHARGING == 'TAKAH' .OR. CNI_CHARGING == 'HELFA' .OR. & + CNI_CHARGING == 'GARDI') THEN + ZVECQ5(:) = BI_LIN_INTP_V(XKER_Q_SDRYGB,IVEC1,IVEC2,ZVEC1,ZVEC2,IGDRY) + ZWQ1(:,10) = UNPACK( VECTOR=ZVECQ5(:), MASK=GDRY, FIELD=0.0 ) + ELSE + ZVECQ5(:) = BI_LIN_INTP_V(XKER_Q_SDRYGB1,IVEC1,IVEC2,ZVEC1,ZVEC2,IGDRY) + ZWQ3(:) = UNPACK( VECTOR=ZVECQ5(:), MASK=GDRY, FIELD=0.0 ) ! Dvqsgmn if charge>0 + ZVECQ6(:) = BI_LIN_INTP_V(XKER_Q_SDRYGB2,IVEC1,IVEC2,ZVEC1,ZVEC2,IGDRY) + ZWQ4(:) = UNPACK( VECTOR=ZVECQ6(:), MASK=GDRY, FIELD=0.0 ) ! Dvqsgmn if charge<0 + ENDIF +! +! 6.2.3.5 compute RSDRYG and QSDRYG = QSDRYG_coal + QSDRYG_boun +! + WHERE( GDRY(:) ) + ZZW1(:,3) = MIN( ZRSS(:),XFSDRYG*ZZW(:) & ! RSDRYG + * EXP( XCOLEXSG*(ZZT(:)-XTT) ) & + *( ZLBDAS(:)**(XCXS-XBS) )*( ZLBDAG(:)**XCXG ) & + * ZRHOCOR(:) / (ZCOR00 * ZRHODREF(:)) & + *( XLBSDRYG1/( ZLBDAG(:)**2 ) + & + XLBSDRYG2/( ZLBDAG(:) * ZLBDAS(:) ) + & + XLBSDRYG3/( ZLBDAS(:)**2) ) ) + ZWQ1(:,4) = ZWQ1(:,4) * XFQSDRYG * & + XCOLSG * EXP(XCOLEXSG * (ZZT(:) - XTT)) * & + ZEST(:) * ZRHOCOR(:) / (ZCOR00 * ZRHODREF(:)) * & + ZLBDAG(:)**XCXG * ZLBDAS(:)**XCXS * & + (XLBQSDRYG1 * ZLBDAS(:)**(-2.0-XFS) + & + XLBQSDRYG2 * ZLBDAS(:)**(-1.0-XFS) * ZLBDAG(:)**(-1.0) + & + XLBQSDRYG3 * ZLBDAS(:)**(-XFS) * ZLBDAG(:)**(-2.0)) ! QSDRYG_coal + END WHERE +! + WHERE (ZRSS(:) > ZRSMIN_ELEC(5) .AND. ZRST(:) > XRTMIN_ELEC(5) .AND. & + ZRGS(:) > ZRSMIN_ELEC(6) .AND. ABS(ZQST(:)) > XQTMIN(5) .AND. & + ABS(ZEST) > XESMIN) + ZWQ1(:,4) = SIGN( MIN( ABS(ZQSS(:)),ABS(ZWQ1(:,4)) ),ZQSS(:) ) + ELSEWHERE + ZWQ1(:,4) = 0. + END WHERE +! +! QSDRYG_boun + CALL ELEC_SDRYG_B() +! +! save the NI charging rate for temporal series + XNI_SDRYG(:,:,:) = UNPACK(ZWQ1(:,5), MASK=GMICRO, FIELD=0.0) + XNI_SDRYG(:,:,:) = XNI_SDRYG(:,:,:) * PRHODREF(:,:,:) ! C/m3/ +! + DEALLOCATE(IVEC2) + DEALLOCATE(IVEC1) + DEALLOCATE(ZVEC3) + DEALLOCATE(ZVEC2) + DEALLOCATE(ZVEC1) +! + DEALLOCATE( ZVECQ4 ) + DEALLOCATE( ZVECQ5 ) + DEALLOCATE( ZVECQ6 ) + IF (ALLOCATED(ZAUX)) DEALLOCATE( ZAUX ) + END IF +! +! +!* 6.2.4 accretion of raindrops on the graupeln +! + GDRY(:) = (ZRRT(:)>XRTMIN(3)) .AND. (ZRGT(:)>XRTMIN(6)) .AND. (ZRRS(:)>0.0) + IGDRY = COUNT( GDRY(:) ) +! + IF( IGDRY>0 ) THEN +! +! 6.2.4.1 allocations +! + ALLOCATE(ZVEC1(IGDRY)) + ALLOCATE(ZVEC2(IGDRY)) + ALLOCATE(ZVEC3(IGDRY)) + ALLOCATE(IVEC1(IGDRY)) + ALLOCATE(IVEC2(IGDRY)) + ALLOCATE(ZVECQ4(IGDRY)) +! +! 6.2.4.2 select the (ZLBDAG,ZLBDAR) couplet +! + ZVEC1(:) = PACK( ZLBDAG(:),MASK=GDRY(:) ) + ZVEC2(:) = PACK( ZLBDAR(:),MASK=GDRY(:) ) +! +! 6.2.4.3 find the next lower indice for the ZLBDAG and for the ZLBDAR +! in the geometrical set of (Lbda_g,Lbda_r) couplet use to +! tabulate the RDRYG-kernel +! + ZVEC1(1:IGDRY) = MAX( 1.00001, MIN( REAL(NDRYLBDAG)-0.00001, & + XDRYINTP1G * LOG( ZVEC1(1:IGDRY) ) + XDRYINTP2G ) ) + IVEC1(1:IGDRY) = INT( ZVEC1(1:IGDRY) ) + ZVEC1(1:IGDRY) = ZVEC1(1:IGDRY) - REAL( IVEC1(1:IGDRY) ) +! + ZVEC2(1:IGDRY) = MAX( 1.00001, MIN( REAL(NDRYLBDAR)-0.00001, & + XDRYINTP1R * LOG( ZVEC2(1:IGDRY) ) + XDRYINTP2R ) ) + IVEC2(1:IGDRY) = INT( ZVEC2(1:IGDRY) ) + ZVEC2(1:IGDRY) = ZVEC2(1:IGDRY) - REAL( IVEC2(1:IGDRY) ) +! +! 6.2.4.4 perform the bilinear interpolation of the normalized +! RDRYG-kernel +! + ZVEC3(:) = BI_LIN_INTP_V(XKER_RDRYG, IVEC1, IVEC2, ZVEC1, ZVEC2, IGDRY) + ZZW(:) = UNPACK( VECTOR=ZVEC3(:),MASK=GDRY,FIELD=0.0 ) +! + ZVECQ4(:) = BI_LIN_INTP_V(XKER_Q_RDRYG, IVEC1, IVEC2, ZVEC1, ZVEC2, IGDRY) + ZWQ1(:,6) = UNPACK( VECTOR=ZVECQ4(:), MASK=GDRY, FIELD=0.0 ) +! +! 6.2.4.5 compute RRDRYG and QRDRYG +! + WHERE( GDRY(:) ) + ZZW1(:,4) = MIN( ZRRS(:),XFRDRYG*ZZW(:) & ! RRDRYG + *( ZLBDAR(:)**(-4) )*( ZLBDAG(:)**XCXG ) & + * ZRHOCOR(:) / (ZCOR00 * ZRHODREF(:)) & + *( XLBRDRYG1/( ZLBDAG(:)**2 ) + & + XLBRDRYG2/( ZLBDAG(:) * ZLBDAR(:) ) + & + XLBRDRYG3/( ZLBDAR(:)**2) ) ) + ZWQ1(:,6) = ZWQ1(:,6) * XFQRDRYG * & + ZRHOCOR(:) / (ZCOR00 * ZRHODREF(:)) * & + ZERT(:) * ZLBDAG(:)**XCXG * ZLBDAR(:)**XCXR * & + (XLBQRDRYG1 * ZLBDAR(:)**(-2.0 - XFR) + & + XLBQRDRYG2 * ZLBDAR(:)**(-1.0 - XFR) * ZLBDAG(:)**(-1.0) + & + XLBQRDRYG3 * ZLBDAR(:)**(-XFR) * ZLBDAG(:)**(-2.0)) ! QRDRYG + END WHERE +! + WHERE (ZRRT(:) > XRTMIN_ELEC(3) .AND. ZRGT(:) > XRTMIN_ELEC(6) .AND. & + ZRRS(:) > ZRSMIN_ELEC(3).AND. ABS(ZERT) > XERMIN .AND. & + ABS(ZQRT(:)) > XQTMIN(3)) + ZWQ1(:,6) = SIGN( MIN( ABS(ZQRS(:)),ABS(ZWQ1(:,6)) ),ZQRS(:) ) + ELSEWHERE + ZWQ1(:,6) = 0. + ENDWHERE +! + DEALLOCATE(IVEC2) + DEALLOCATE(IVEC1) + DEALLOCATE(ZVEC3) + DEALLOCATE(ZVEC2) + DEALLOCATE(ZVEC1) + DEALLOCATE(ZVECQ4) + END IF +! + ZRDRYG(:) = ZZW1(:,1) + ZZW1(:,2) + ZZW1(:,3) + ZZW1(:,4) + DEALLOCATE(GDRY) +! +! +!* 6.3 compute the Wet growth case +! + ZZW(:) = 0.0 + ZRWETG(:) = 0.0 + ZWQ1(:,7:9) = 0.0 +! + WHERE (ZRGT(:) > XRTMIN(6)) + ZZW1(:,5) = MIN( ZRIS(:), & + ZZW1(:,2) / (XCOLIG*EXP(XCOLEXIG*(ZZT(:)-XTT)) ) ) ! RIWETG + ZZW1(:,6) = MIN( ZRSS(:), & + ZZW1(:,3) / (XCOLSG*EXP(XCOLEXSG*(ZZT(:)-XTT)) ) ) ! RSWETG +! + ZZW(:) = ZRVT(:) * ZPRES(:) / ((XMV / XMD) + ZRVT(:)) ! Vapor pressure + ZZW(:) = ZKA(:) * (XTT - ZZT(:)) + & + (ZDV(:) * (XLVTT + (XCPV - XCL) * (ZZT(:) - XTT)) * & + (XESTT - ZZW(:)) / (XRV * ZZT(:))) +! +! compute RWETG +! + ZRWETG(:) = MAX(0.0, & + (ZZW(:) * (X0DEPG * ZLBDAG(:)**XEX0DEPG + & + X1DEPG * ZCJ(:) * ZLBDAG(:)**XEX1DEPG) + & + (ZZW1(:,5) + ZZW1(:,6) ) * & + (ZRHODREF(:) * (XLMTT + (XCI - XCL) * (XTT - ZZT(:))))) / & + (ZRHODREF(:) * (XLMTT - XCL * (XTT - ZZT(:))))) + END WHERE +! + WHERE (ZRGT(:) > 0.0 .AND. ZRIT(:) > 0. .AND. ZRST(:) > 0.) + ZWQ1(:,7) = XCOEF_RQ_I * ZZW1(:,5) * ZQIT(:) / ZRIT(:) + ZWQ1(:,8) = XCOEF_RQ_S * ZZW1(:,6) * ZQST(:) / ZRST(:) + END WHERE +! + WHERE (ZRGT(:) > XRTMIN_ELEC(6) .AND. ZLBDAG(:) > 0. .AND. ZLBDAG(:) < XLBDAG_MAXE) + ZWQ1(:,7) = SIGN( MIN( ABS(ZQIS(:)),ABS(ZWQ1(:,7)) ),ZQIS(:) ) + ZWQ1(:,8) = SIGN( MIN( ABS(ZQSS(:)),ABS(ZWQ1(:,8)) ),ZQSS(:) ) + ELSEWHERE + ZWQ1(:,7) = 0. + ZWQ1(:,8) = 0. + ENDWHERE +! + WHERE (ZRGS(:) > ZRSMIN_ELEC(6) .AND. ABS(ZQRT(:)) > XQTMIN(3) .AND. & + ZRRT(:) > XRTMIN_ELEC(3)) + ZWQ1(:,9) = XCOEF_RQ_R * ZQRT(:) * & + (ZRWETG(:) - ZZW1(:,5) - ZZW1(:,6) - ZZW1(:,1)) / ZRRT(:) ! QRWETG + ZWQ1(:,9) = SIGN( MIN( ABS(ZQRS(:)),ABS(ZWQ1(:,9)) ),ZQRS(:) ) + ENDWHERE +! +! +!* 6.4 Select Wet or Dry case +! + ZZW(:) = 0.0 + IF (KRR == 7) THEN + WHERE( ZRGT(:) > XRTMIN(6) .AND. ZZT(:) < XTT .AND. & ! Wet + ZRDRYG(:) >= ZRWETG(:) .AND. ZRWETG(:) > 0.0 ) ! case + ZZW(:) = ZRWETG(:) - ZZW1(:,5) - ZZW1(:,6) ! RCWETG+RRWETG +! +! limitation of the available rainwater mixing ratio (RRWETH < RRS !) +! + ZZW1(:,7) = MAX( 0.0,MIN( ZZW(:),ZRRS(:)+ZZW1(:,1) ) ) + ZUSW(:) = ZZW1(:,7) / ZZW(:) + ZZW1(:,5) = ZZW1(:,5) * ZUSW(:) + ZZW1(:,6) = ZZW1(:,6) * ZUSW(:) + ZRWETG(:) = ZZW1(:,7) + ZZW1(:,5) + ZZW1(:,6) +! + ZRCS(:) = ZRCS(:) - ZZW1(:,1) + ZRIS(:) = ZRIS(:) - ZZW1(:,5) + ZRSS(:) = ZRSS(:) - ZZW1(:,6) +! +! assume a linear percent of conversion of graupel into hail +! + ZRGS(:) = ZRGS(:) + ZRWETG(:) ! Wet growth + ZZW(:) = ZRGS(:) * ZRDRYG(:) / (ZRWETG(:) + ZRDRYG(:)) ! and + ZRGS(:) = ZRGS(:) - ZZW(:) ! partial conversion + ZRHS(:) = ZRHS(:) + ZZW(:) ! of the graupel into hail +! + ZRRS(:) = MAX( 0.0,ZRRS(:) - ZZW1(:,7) + ZZW1(:,1) ) + ZTHS(:) = ZTHS(:) + ZZW1(:,7)*(ZLSFACT(:)-ZLVFACT(:)) + ! f(L_f*(RCWETG+RRWETG)) +! + ZQCS(:) = ZQCS(:) - ZWQ1(:,1) ! QCDRYG .equiv. QCWETG + ZQRS(:) = ZQRS(:) - ZWQ1(:,9) + ZQIS(:) = ZQIS(:) - ZWQ1(:,7) + ZQSS(:) = ZQSS(:) - ZWQ1(:,8) + ZQGS(:) = ZQGS(:) + ZWQ1(:,1) + ZWQ1(:,9) + ZWQ1(:,7) + ZWQ1(:,8) + ZZW(:) = ZQGS(:) * ZRDRYG(:) / (ZRWETG(:) + ZRDRYG(:)) ! partial graupel + ZQGS(:) = ZQGS(:) - ZZW(:) ! charge conversion + ZQHS(:) = ZQHS(:) + ZZW(:) ! into hail charge + END WHERE + ELSE IF( KRR == 6 ) THEN + WHERE (ZRGT(:) > XRTMIN(6) .AND. ZZT(:) < XTT .AND. & ! Wet + ZRDRYG(:) >= ZRWETG(:) .AND. ZRWETG(:) > 0.0) ! case + ZZW(:) = ZRWETG(:) + ZRCS(:) = ZRCS(:) - ZZW1(:,1) + ZRIS(:) = ZRIS(:) - ZZW1(:,5) + ZRSS(:) = ZRSS(:) - ZZW1(:,6) + ZRGS(:) = ZRGS(:) + ZZW(:) +! + ZRRS(:) = ZRRS(:) - ZZW(:) + ZZW1(:,5) + ZZW1(:,6) + ZZW1(:,1) + ZTHS(:) = ZTHS(:) + (ZZW(:)-ZZW1(:,5)-ZZW1(:,6))*(ZLSFACT(:)-ZLVFACT(:)) + ! f(L_f*(RCWETG+RRWETG)) +! + ZQCS(:) = ZQCS(:) - ZWQ1(:,1) ! QCDRYG .equiv. QCWETG + ZQRS(:) = ZQRS(:) - ZWQ1(:,9) + ZQIS(:) = ZQIS(:) - ZWQ1(:,7) + ZQSS(:) = ZQSS(:) - ZWQ1(:,8) + ZQGS(:) = ZQGS(:) + ZWQ1(:,1) + ZWQ1(:,9) + ZWQ1(:,7) + ZWQ1(:,8) + END WHERE + END IF + + if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'WETG', & + Unpack( zths(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'WETG', & + Unpack( zrcs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rr ) call Budget_store_end( tbudgets(NBUDGET_RR), 'WETG', & + Unpack( zrrs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'WETG', & + Unpack( zris(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rs ) call Budget_store_end( tbudgets(NBUDGET_RS), 'WETG', & + Unpack( zrss(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rg ) call Budget_store_end( tbudgets(NBUDGET_RG), 'WETG', & + Unpack( zrgs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rh ) call Budget_store_end( tbudgets(NBUDGET_RH), 'WETG', & + Unpack( zrhs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_sv ) then + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'WETG', & + Unpack( zqcs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'WETG', & + Unpack( zqrs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'WETG', & + Unpack( zqis(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'WETG', & + Unpack( zqss(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'WETG', & + Unpack( zqgs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( krr == 7 ) & + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 6 ), 'WETG', & + Unpack( zqhs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + end if + + if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'DRYG', & + Unpack( zths(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'DRYG', & + Unpack( zrcs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rr ) call Budget_store_init( tbudgets(NBUDGET_RR), 'DRYG', & + Unpack( zrrs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), 'DRYG', & + Unpack( zris(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rs ) call Budget_store_init( tbudgets(NBUDGET_RS), 'DRYG', & + Unpack( zrss(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rg ) call Budget_store_init( tbudgets(NBUDGET_RG), 'DRYG', & + Unpack( zrgs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_sv ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'DRYG', & + Unpack( zqcs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'DRYG', & + Unpack( zqrs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'DRYG', & + Unpack( zqis(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'DRYG', & + Unpack( zqss(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'DRYG', & + Unpack( zqgs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + end if + + WHERE (ZRGT(:) > XRTMIN(6) .AND. ZZT(:) < XTT .AND. & ! Dry + ZRDRYG(:) < ZRWETG(:) .AND. ZRDRYG(:) > 0.0) ! case + ZRCS(:) = ZRCS(:) - ZZW1(:,1) + ZRIS(:) = ZRIS(:) - ZZW1(:,2) + ZRSS(:) = ZRSS(:) - ZZW1(:,3) + ZRRS(:) = ZRRS(:) - ZZW1(:,4) + ZRGS(:) = ZRGS(:) + ZRDRYG(:) + ZTHS(:) = ZTHS(:) + (ZZW1(:,1) + ZZW1(:,4)) * (ZLSFACT(:) - ZLVFACT(:)) + ! f(L_f*(RCDRYG+RRDRYG)) +! + ZQCS(:) = ZQCS(:) - ZWQ1(:,1) + ZQRS(:) = ZQRS(:) - ZWQ1(:,6) + ZQIS(:) = ZQIS(:) - ZWQ1(:,2) - ZWQ1(:,3) + ZQSS(:) = ZQSS(:) - ZWQ1(:,4) - ZWQ1(:,5) + ZQGS(:) = ZQGS(:) + ZWQ1(:,1) + ZWQ1(:,2) + ZWQ1(:,3) + ZWQ1(:,4) & + + ZWQ1(:,5) + ZWQ1(:,6) + END WHERE + + if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'DRYG', & + Unpack( zths(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'DRYG', & + Unpack( zrcs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rr ) call Budget_store_end( tbudgets(NBUDGET_RR), 'DRYG', & + Unpack( zrrs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'DRYG', & + Unpack( zris(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rs ) call Budget_store_end( tbudgets(NBUDGET_RS), 'DRYG', & + Unpack( zrss(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rg ) call Budget_store_end( tbudgets(NBUDGET_RG), 'DRYG', & + Unpack( zrgs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_sv ) then + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'DRYG', & + Unpack( zqcs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'DRYG', & + Unpack( zqrs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'DRYG', & + Unpack( zqis(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'DRYG', & + Unpack( zqss(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'DRYG', & + Unpack( zqgs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + end if +! +! Inductive mecanism +! + IF (LINDUCTIVE) THEN + if ( lbudget_sv ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1), 'INCG', & + Unpack( zqcs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'INCG', & + Unpack( zqgs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + end if + + ZRATE_IND(:) = 0. + GIND(:) = ZRDRYG(:) > 0. .AND. ZRDRYG(:) < ZRWETG(:) .AND. ZZT(:) < XTT + IIND = COUNT(GIND(:)) +! + IF (IIND > 0) CALL INDUCTIVE_PROCESS +! + XIND_RATE(:,:,:) = 0. + XIND_RATE(:,:,:) = UNPACK(ZRATE_IND(:), MASK=GMICRO, FIELD=0.0) + XIND_RATE(:,:,:) = XIND_RATE(:,:,:) * PRHODREF(:,:,:) ! C/m3/s + + if ( lbudget_sv ) then + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1), 'INCG', & + Unpack( zqcs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'INCG', & + Unpack( zqgs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + end if + END IF +! +!* 6.5 Melting of the graupeln +! + if ( lbudget_sv ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2), 'GMLT', & + Unpack( zqrs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'GMLT', & + Unpack( zqgs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + end if + + ZZW(:) = 0.0 + ZWQ1(:,7) = 0.0 + WHERE ((ZRGT(:) > XRTMIN(6)) .AND. (ZRGS(:) > 0.0) .AND. (ZZT(:) > XTT)) + ZZW(:) = ZRVT(:) * ZPRES(:) / ((XMV / XMD) + ZRVT(:)) ! Vapor pressure + ZZW(:) = ZKA(:) * (XTT - ZZT(:)) + & + (ZDV(:) * (XLVTT + ( XCPV - XCL ) * (ZZT(:) - XTT)) * & + (XESTT - ZZW(:)) / (XRV * ZZT(:))) +! compute RGMLTR + ZZW(:) = MIN(ZRGS(:), MAX(0.0, (-ZZW(:) * & + (X0DEPG * ZLBDAG(:)**XEX0DEPG + & + X1DEPG * ZCJ(:) * ZLBDAG(:)**XEX1DEPG) - & + (ZZW1(:,1) + ZZW1(:,4)) * & + (ZRHODREF(:) * XCL * (XTT - ZZT(:)))) / & + (ZRHODREF(:) * XLMTT))) + ZRRS(:) = ZRRS(:) + ZZW(:) + ZRGS(:) = ZRGS(:) - ZZW(:) + ZTHS(:) = ZTHS(:) - ZZW(:) * (ZLSFACT(:) - ZLVFACT(:)) ! f(L_f*(-RGMLTR)) +! compute QGMLTR + ZWQ1(:,7) = XCOEF_RQ_G * ZQGT(:) * ZZW(:) / ZRGT(:) + END WHERE +! +! + WHERE (ZRGT(:) > XRTMIN_ELEC(6) .AND. ZRGS(:) > ZRSMIN_ELEC(6) .AND. & + ZZT(:) > XTT .AND. ABS(ZQGT(:)) > XQTMIN(6)) + ZWQ1(:,7) = SIGN( MIN( ABS(ZQGS(:)),ABS(ZWQ1(:,7)) ),ZQGS(:) ) + ZQRS(:) = ZQRS(:) + ZWQ1(:,7) + ZQGS(:) = ZQGS(:) - ZWQ1(:,7) + ENDWHERE + + if ( lbudget_th ) call Budget_store_add( tbudgets(NBUDGET_TH), 'GMLT', Unpack( -zzw(:) * ( zlsfact(:) - zlvfact(:) ) & + * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rr ) call Budget_store_add( tbudgets(NBUDGET_RR), 'GMLT', & + Unpack( zzw(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rg ) call Budget_store_add( tbudgets(NBUDGET_RG), 'GMLT', & + Unpack( -zzw(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_sv ) then + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2), 'GMLT', & + Unpack( zqrs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'GMLT', & + Unpack( zqgs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + end if + + END SUBROUTINE RAIN_ICE_ELEC_FAST_RG +! +!------------------------------------------------------------------------------- +! +! + SUBROUTINE RAIN_ICE_ELEC_FAST_RH +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +!------------------------------------------------------------------------------- +! + ALLOCATE( GHAIL(IMICRO) ) + GHAIL(:) = ZRHT(:) > XRTMIN(7) + IHAIL = COUNT(GHAIL(:)) +! + IF( IHAIL>0 ) THEN + if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'WETH', & + Unpack( zths(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'WETH', & + Unpack( zrcs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rr ) call Budget_store_init( tbudgets(NBUDGET_RR), 'WETH', & + Unpack( zrrs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), 'WETH', & + Unpack( zris(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rs ) call Budget_store_init( tbudgets(NBUDGET_RS), 'WETH', & + Unpack( zrss(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rg ) call Budget_store_init( tbudgets(NBUDGET_RG), 'WETH', & + Unpack( zrgs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rh ) call Budget_store_init( tbudgets(NBUDGET_RH), 'WETH', & + Unpack( zrhs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) +! +!* 7.2 compute the Wet growth of hail +! + WHERE (GHAIL(:)) + ZLBDAH(:) = XLBH * (ZRHODREF(:) * MAX(ZRHT(:), XRTMIN(7)))**XLBEXH + END WHERE +! + ZZW1(:,:) = 0.0 + WHERE (GHAIL(:) .AND. ((ZRCT(:) > XRTMIN(2) .AND. ZRCS(:) > 0.0))) + ZZW(:) = ZLBDAH(:)**(XCXH-XDH-2.0) * ZRHOCOR(:) / ZCOR00 + ZZW1(:,1) = MIN( ZRCS(:),XFWETH * ZRCT(:) * ZZW(:) ) ! RCWETH + END WHERE + WHERE (GHAIL(:) .AND. ((ZRIT(:) > XRTMIN(4) .AND. ZRIS(:) > 0.0))) + ZZW(:) = ZLBDAH(:)**(XCXH-XDH-2.0) * ZRHOCOR(:) / ZCOR00 + ZZW1(:,2) = MIN( ZRIS(:),XFWETH * ZRIT(:) * ZZW(:) ) ! RIWETH + END WHERE +! +!* 7.2.1 accretion of aggregates on the hailstones +! + ALLOCATE( GWET(IMICRO) ) + GWET(:) = GHAIL(:) .AND. (ZRST(:) > XRTMIN(5) .AND. ZRSS(:) > 0.0) + IGWET = COUNT( GWET(:) ) +! + IF (IGWET > 0) THEN +! +!* 7.2.2 allocations +! + ALLOCATE(ZVEC1(IGWET)) + ALLOCATE(ZVEC2(IGWET)) + ALLOCATE(ZVEC3(IGWET)) + ALLOCATE(IVEC1(IGWET)) + ALLOCATE(IVEC2(IGWET)) +! +!* 7.2.3 select the (ZLBDAH,ZLBDAS) couplet +! + ZVEC1(:) = PACK( ZLBDAH(:),MASK=GWET(:) ) + ZVEC2(:) = PACK( ZLBDAS(:),MASK=GWET(:) ) +! +!* 7.2.4 find the next lower indice for the ZLBDAG and for the ZLBDAS +! in the geometrical set of (Lbda_h,Lbda_s) couplet use to +! tabulate the SWETH-kernel +! + ZVEC1(1:IGWET) = MAX( 1.00001, MIN( REAL(NWETLBDAH)-0.00001, & + XWETINTP1H * LOG( ZVEC1(1:IGWET) ) + XWETINTP2H ) ) + IVEC1(1:IGWET) = INT( ZVEC1(1:IGWET) ) + ZVEC1(1:IGWET) = ZVEC1(1:IGWET) - REAL( IVEC1(1:IGWET) ) +! + ZVEC2(1:IGWET) = MAX( 1.00001, MIN( REAL(NWETLBDAS)-0.00001, & + XWETINTP1S * LOG( ZVEC2(1:IGWET) ) + XWETINTP2S ) ) + IVEC2(1:IGWET) = INT( ZVEC2(1:IGWET) ) + ZVEC2(1:IGWET) = ZVEC2(1:IGWET) - REAL( IVEC2(1:IGWET) ) +! +!* 7.2.5 perform the bilinear interpolation of the normalized +! SWETH-kernel +! + ZVEC3(:) = BI_LIN_INTP_V(XKER_SWETH, IVEC1, IVEC2, ZVEC1, ZVEC2, IGWET) + ZZW(:) = UNPACK( VECTOR=ZVEC3(:),MASK=GWET,FIELD=0.0 ) +! + WHERE( GWET(:) ) + ZZW1(:,3) = MIN( ZRSS(:), XFSWETH*ZZW(:) & ! RSWETH + *( ZLBDAS(:)**(XCXS-XBS) )*( ZLBDAH(:)**XCXH ) & + * ZRHOCOR(:)/(ZCOR00*ZRHODREF(:)) & + *( XLBSWETH1/( ZLBDAH(:)**2 ) + & + XLBSWETH2/( ZLBDAH(:) * ZLBDAS(:) ) + & + XLBSWETH3/( ZLBDAS(:)**2) ) ) + END WHERE + DEALLOCATE(IVEC2) + DEALLOCATE(IVEC1) + DEALLOCATE(ZVEC3) + DEALLOCATE(ZVEC2) + DEALLOCATE(ZVEC1) + END IF +! +!* 7.2.6 accretion of graupeln on the hailstones +! + GWET(:) = GHAIL(:) .AND. (ZRGT(:)>XRTMIN(6) .AND. ZRGS(:)>0.0) + IGWET = COUNT( GWET(:) ) +! + IF (IGWET > 0) THEN +! +!* 7.2.7 allocations +! + ALLOCATE( ZVEC1(IGWET) ) + ALLOCATE( ZVEC2(IGWET) ) + ALLOCATE( ZVEC3(IGWET) ) + ALLOCATE( IVEC1(IGWET) ) + ALLOCATE( IVEC2(IGWET) ) +! +!* 7.2.8 select the (ZLBDAH,ZLBDAG) couplet +! + ZVEC1(:) = PACK( ZLBDAH(:),MASK=GWET(:) ) + ZVEC2(:) = PACK( ZLBDAG(:),MASK=GWET(:) ) +! +!* 7.2.9 find the next lower indice for the ZLBDAH and for the ZLBDAG +! in the geometrical set of (Lbda_h,Lbda_g) couplet use to +! tabulate the GWETH-kernel +! + ZVEC1(1:IGWET) = MAX( 1.00001, MIN( REAL(NWETLBDAG)-0.00001, & + XWETINTP1H * LOG( ZVEC1(1:IGWET) ) + XWETINTP2H ) ) + IVEC1(1:IGWET) = INT( ZVEC1(1:IGWET) ) + ZVEC1(1:IGWET) = ZVEC1(1:IGWET) - REAL( IVEC1(1:IGWET) ) +! + ZVEC2(1:IGWET) = MAX( 1.00001, MIN( REAL(NWETLBDAG)-0.00001, & + XWETINTP1G * LOG( ZVEC2(1:IGWET) ) + XWETINTP2G ) ) + IVEC2(1:IGWET) = INT( ZVEC2(1:IGWET) ) + ZVEC2(1:IGWET) = ZVEC2(1:IGWET) - REAL( IVEC2(1:IGWET) ) +! +!* 7.2.10 perform the bilinear interpolation of the normalized +! GWETH-kernel +! + ZVEC3(:) = BI_LIN_INTP_V(XKER_GWETH, IVEC1, IVEC2, ZVEC1, ZVEC2, IGWET) + ZZW(:) = UNPACK( VECTOR=ZVEC3(:),MASK=GWET,FIELD=0.0 ) +! + WHERE (GWET(:)) + ZZW1(:,5) = MIN( ZRGS(:),XFGWETH*ZZW(:) & ! RGWETH + *( ZLBDAG(:)**(XCXG-XBG) )*( ZLBDAH(:)**XCXH ) & + * ZRHOCOR(:) / (ZCOR00 * ZRHODREF(:)) & + *( XLBGWETH1/( ZLBDAH(:)**2 ) + & + XLBGWETH2/( ZLBDAH(:) * ZLBDAG(:) ) + & + XLBGWETH3/( ZLBDAG(:)**2) ) ) + END WHERE + DEALLOCATE(IVEC2) + DEALLOCATE(IVEC1) + DEALLOCATE(ZVEC3) + DEALLOCATE(ZVEC2) + DEALLOCATE(ZVEC1) + END IF + DEALLOCATE(GWET) +! +!* 7.3 compute the Wet growth of hail +! + ZZW(:) = 0.0 + WHERE (GHAIL(:) .AND. ZZT(:) < XTT) + ZZW(:) = ZRVT(:) * ZPRES(:) / ((XMV / XMD) + ZRVT(:)) ! Vapor pressure + ZZW(:) = ZKA(:) * (XTT - ZZT(:)) + & + (ZDV(:) * (XLVTT + (XCPV - XCL) * (ZZT(:) - XTT)) * & + (XESTT - ZZW(:)) / (XRV * ZZT(:))) +! +! compute RWETH +! + ZZW(:) = MAX(0., (ZZW(:) * (X0DEPH * ZLBDAH(:)**XEX0DEPH + & + X1DEPH * ZCJ(:) * ZLBDAH(:)**XEX1DEPH) + & + (ZZW1(:,2) + ZZW1(:,3) + ZZW1(:,5) ) * & + (ZRHODREF(:) * (XLMTT + (XCI - XCL) * (XTT - ZZT(:))))) / & + (ZRHODREF(:) * (XLMTT - XCL * (XTT - ZZT(:))))) +! + ZZW1(:,6) = MAX( ZZW(:) - ZZW1(:,2) - ZZW1(:,3) - ZZW1(:,5), 0. ) ! RCWETH+RRWETH + END WHERE +! + ZUSW(:) = 0. +! + WHERE (GHAIL(:) .AND. ZZT(:) < XTT .AND. ZZW1(:,6) /= 0.0) +! +! limitation of the available rainwater mixing ratio (RRWETH < RRS !) +! + ZZW1(:,4) = MAX( 0.0,MIN( ZZW1(:,6),ZRRS(:)+ZZW1(:,1) ) ) + ZUSW(:) = ZZW1(:,4) / ZZW1(:,6) + ZZW1(:,2) = ZZW1(:,2)*ZUSW(:) + ZZW1(:,3) = ZZW1(:,3)*ZUSW(:) + ZZW1(:,5) = ZZW1(:,5)*ZUSW(:) + ZZW(:) = ZZW1(:,4) + ZZW1(:,2) + ZZW1(:,3) + ZZW1(:,5) +! +!* 7.1.6 integrate the Wet growth of hail +! + ZRCS(:) = ZRCS(:) - ZZW1(:,1) + ZRIS(:) = ZRIS(:) - ZZW1(:,2) + ZRSS(:) = ZRSS(:) - ZZW1(:,3) + ZRGS(:) = ZRGS(:) - ZZW1(:,5) + ZRHS(:) = ZRHS(:) + ZZW(:) + ZRRS(:) = MAX( 0.0,ZRRS(:) - ZZW1(:,4) + ZZW1(:,1) ) + ZRRS(:) = ZRRS(:) - ZZW1(:,4) + ZTHS(:) = ZTHS(:) + (ZZW1(:,4)+ZZW1(:,1))*(ZLSFACT(:)-ZLVFACT(:)) + ! f(L_f*(RCWETH+RRWETH)) + END WHERE +! + ZWQ1(:,:) = 0.0 + WHERE (GHAIL(:) .AND. ZZT(:) < XTT .AND. ZRCT(:) > XRTMIN_ELEC(2)) + ZWQ1(:,1) = XCOEF_RQ_C * ZQCT(:) * ZZW1(:,1) / ZRCT(:) + ZWQ1(:,1) = SIGN( MIN( ABS(ZQCS(:)),ABS(ZWQ1(:,1)) ),ZQCS(:) ) + END WHERE + WHERE (GHAIL(:) .AND. ZZT(:) < XTT .AND. ZRIT(:) > XRTMIN_ELEC(4)) + ZWQ1(:,2) = XCOEF_RQ_I * ZQIT(:) * ZZW1(:,2) / ZRIT(:) + ZWQ1(:,2) = SIGN( MIN( ABS(ZQIS(:)),ABS(ZWQ1(:,2)) ),ZQIS(:) ) + END WHERE + WHERE (GHAIL(:) .AND. ZZT(:) < XTT .AND. ZRST(:) > XRTMIN_ELEC(5)) + ZWQ1(:,3) = XCOEF_RQ_S * ZQST(:) * ZZW1(:,3) / ZRST(:) + ZWQ1(:,3) = SIGN( MIN( ABS(ZQSS(:)),ABS(ZWQ1(:,3)) ),ZQSS(:) ) + END WHERE + WHERE (GHAIL(:) .AND. ZZT(:) < XTT .AND. ZRGT(:) > XRTMIN_ELEC(6)) + ZWQ1(:,5) = XCOEF_RQ_G * ZQGT(:) * ZZW1(:,5) / ZRGT(:) + ZWQ1(:,5) = SIGN( MIN( ABS(ZQGS(:)),ABS(ZWQ1(:,5)) ),ZQGS(:) ) + END WHERE + WHERE (GHAIL(:) .AND. ZZT(:) < XTT .AND. ZRRT(:) > XRTMIN_ELEC(3)) + ZWQ1(:,4) = XCOEF_RQ_R * ZQRT(:) * ZZW1(:,4) / ZRRT(:) + ZWQ1(:,4) = SIGN( MIN( ABS(ZQRS(:)),ABS(ZWQ1(:,4)) ),ZQRS(:) ) + END WHERE +! + ZQCS(:) = ZQCS(:) - ZWQ1(:,1) + ZQIS(:) = ZQIS(:) - ZWQ1(:,2) + ZQSS(:) = ZQSS(:) - ZWQ1(:,3) + ZQGS(:) = ZQGS(:) - ZWQ1(:,5) + ZQRS(:) = ZQRS(:) - ZWQ1(:,4) + ZQHS(:) = ZQHS(:) + ZWQ1(:,1) + ZWQ1(:,2) + ZWQ1(:,3) + ZWQ1(:,4) + ZWQ1(:,5) + + if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'WETH', & + Unpack( zths(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'WETH', & + Unpack( zrcs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rr ) call Budget_store_end( tbudgets(NBUDGET_RR), 'WETH', & + Unpack( zrrs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'WETH', & + Unpack( zris(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rs ) call Budget_store_end( tbudgets(NBUDGET_RS), 'WETH', & + Unpack( zrss(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rg ) call Budget_store_end( tbudgets(NBUDGET_RG), 'WETH', & + Unpack( zrgs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rh ) call Budget_store_end( tbudgets(NBUDGET_RH), 'WETH', & + Unpack( zrhs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_sv ) then + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'WETH', & + Unpack( -zwq1(:, 1) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'WETH', & + Unpack( -zwq1(:, 4) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'WETH', & + Unpack( -zwq1(:, 2) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 4 ), 'WETH', & + Unpack( -zwq1(:, 3) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 5 ), 'WETH', & + Unpack( -zwq1(:, 5) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_add( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 6 ), 'WETH', & + Unpack( ( zwq1(:, 1) + zwq1(:, 2) + zwq1(:, 3) + zwq1(:, 4) + zwq1(:, 5) ) & + * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + end if + END IF +! + IF (IHAIL > 0) THEN +! +!* 7.5 Melting of the hailstones +! + if ( lbudget_sv ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'HMLT', & + Unpack( zqrs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 6 ), 'HMLT', & + Unpack( zqhs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + end if + + ZZW(:) = 0.0 + ZWQ1(:,7) = 0. +! + WHERE (GHAIL(:) .AND. (ZRHS(:) > 0.0) .AND. (ZZT(:) > XTT)) + ZZW(:) = ZRVT(:) * ZPRES(:) / ((XMV / XMD) + ZRVT(:)) ! Vapor pressure + ZZW(:) = ZKA(:) * (XTT - ZZT(:)) + & + ( ZDV(:) * (XLVTT + (XCPV - XCL) * (ZZT(:) - XTT)) * & + (XESTT - ZZW(:)) / (XRV * ZZT(:))) +! +! compute RHMLTR +! + ZZW(:) = MIN( ZRHS(:), MAX( 0.0,( -ZZW(:) * & + ( X0DEPH* ZLBDAH(:)**XEX0DEPH + & + X1DEPH*ZCJ(:)*ZLBDAH(:)**XEX1DEPH ) - & + ZZW1(:,6)*( ZRHODREF(:)*XCL*(XTT-ZZT(:))) ) / & + ( ZRHODREF(:)*XLMTT ) ) ) + ZRRS(:) = ZRRS(:) + ZZW(:) + ZRHS(:) = ZRHS(:) - ZZW(:) +! compute QHMLTR + ZWQ1(:,7) = XCOEF_RQ_H * ZQHT(:) * ZZW(:) / ZRHT(:) + ZTHS(:) = ZTHS(:) - ZZW(:) * (ZLSFACT(:) - ZLVFACT(:)) ! f(L_f*(-RHMLTR)) + END WHERE +! + WHERE (ZRHT(:) > XRTMIN_ELEC(7) .AND. ZRHS(:) > ZRSMIN_ELEC(7) .AND. & + ZZT(:) > XTT .AND. ABS(ZQHT(:)) > XQTMIN(7)) + ZWQ1(:,7) = SIGN( MIN( ABS(ZQHS(:)),ABS(ZWQ1(:,7)) ),ZQHS(:) ) + ZQRS(:) = ZQRS(:) + ZWQ1(:,7) + ZQHS(:) = ZQHS(:) - ZWQ1(:,7) + END WHERE + + if ( lbudget_th ) call Budget_store_add( tbudgets(NBUDGET_TH), 'HMLT', & + Unpack( -zzw(:) * ( zlsfact(:) - zlvfact(:) ) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rr ) call Budget_store_add( tbudgets(NBUDGET_RR), 'HMLT', & + Unpack( zzw(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rh ) call Budget_store_add( tbudgets(NBUDGET_RH), 'HMLT', & + Unpack( -zzw(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_sv ) then + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 2 ), 'HMLT', & + Unpack( zqrs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 6 ), 'HMLT', & + Unpack( zqhs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + end if + END IF +! + DEALLOCATE(GHAIL) +! + END SUBROUTINE RAIN_ICE_ELEC_FAST_RH +! +!------------------------------------------------------------------------------- +! +! + SUBROUTINE RAIN_ICE_ELEC_FAST_RI +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +!------------------------------------------------------------------------------- +! +!* 7.1 cloud ice melting +! + if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'IMLT', & + Unpack( zths(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'IMLT', & + Unpack( zrcs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), 'IMLT', & + Unpack( zris(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_sv ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'IMLT', & + Unpack( zqcs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'IMLT', & + Unpack( zqis(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + end if + + ZZW(:) = 0.0 + ZWQ1(:,1) = 0.0 + WHERE ((ZRIS(:) > 0.0) .AND. (ZZT(:) > XTT)) + ZZW(:) = ZRIS(:) + ZRCS(:) = ZRCS(:) + ZRIS(:) + ZTHS(:) = ZTHS(:) - ZRIS(:) * (ZLSFACT(:) - ZLVFACT(:)) ! f(L_f*(-RIMLTC)) + ZRIS(:) = 0.0 + ZCIT(:) = 0.0 + ZQCS(:) = ZQCS(:) + ZQIS(:) + ZQIS(:) = 0. + END WHERE + + if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'IMLT', & + Unpack( zths(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'IMLT', & + Unpack( zrcs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'IMLT', & + Unpack( zris(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_sv ) then + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'IMLT', & + Unpack( zqcs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'IMLT', & + Unpack( zqis(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + end if +! +!* 7.2 Bergeron-Findeisen effect: RCBERI +! + if ( lbudget_sv ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'BERFI', & + Unpack( zqcs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'BERFI', & + Unpack( zqis(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + end if + + ZZW(:) = 0.0 + ZWQ1(:,1) = 0.0 + WHERE ((ZRCS(:) > 0.0) .AND. (ZSSI(:) > 0.0) .AND. & + (ZRIT(:) > XRTMIN(4)) .AND. (ZCIT(:) > 0.0) .AND. & + ZRCT(:) > 0.) + ZZW(:) = MIN(1.E8,XLBI*( ZRHODREF(:)*ZRIT(:)/ZCIT(:) )**XLBEXI) ! Lbda_i + ZZW(:) = MIN( ZRCS(:),( ZSSI(:) / (ZRHODREF(:)*ZAI(:)) ) * ZCIT(:) * & + ( X0DEPI/ZZW(:) + X2DEPI*ZCJ(:)*ZCJ(:)/ZZW(:)**(XDI+2.0) ) ) + ZRCS(:) = ZRCS(:) - ZZW(:) + ZRIS(:) = ZRIS(:) + ZZW(:) + ZTHS(:) = ZTHS(:) + ZZW(:)*(ZLSFACT(:)-ZLVFACT(:)) ! f(L_f*(RCBERI)) +! + ZWQ1(:,1) = XCOEF_RQ_C * ZQCT(:) * ZZW(:) / ZRCT(:) + END WHERE +! + WHERE (ZRCS(:) > 0.0 .AND. ZSSI(:) > 0.0 .AND. & + ZRIT(:) > 0.0 .AND. ZCIT(:) > 0.0 .AND. & + ZRCT(:) > XRTMIN_ELEC(2) .AND. ABS(ZQCT(:)) > XQTMIN(2)) + ZWQ1(:,1) = SIGN( MIN( ABS(ZQCS(:)),ABS(ZWQ1(:,1)) ),ZQCS(:) ) + ZQIS(:) = ZQIS(:) + ZWQ1(:,1) + ZQCS(:) = ZQCS(:) - ZWQ1(:,1) + ENDWHERE + + if ( lbudget_th ) call Budget_store_add( tbudgets(NBUDGET_TH), 'BERFI', & + Unpack( zzw(:) * ( zlsfact(:) - zlvfact(:) ) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_rc ) call Budget_store_add( tbudgets(NBUDGET_RC), 'BERFI', & + Unpack( -zzw(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_ri ) call Budget_store_add( tbudgets(NBUDGET_RI), 'BERFI', & + Unpack( zzw(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + if ( lbudget_sv ) then + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'BERFI', & + Unpack( zqcs(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'BERFI', & + Unpack( zqis(:) * zrhodj(:), mask = gmicro(:, :, :), field = 0. ) ) + end if + + END SUBROUTINE RAIN_ICE_ELEC_FAST_RI +! +!------------------------------------------------------------------------------- +! + SUBROUTINE COMPUTE_LBDA(ZRR, ZRS, ZRG, ZRH) +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +REAL, DIMENSION(:), INTENT(IN) :: ZRR, ZRS, ZRG +REAL, DIMENSION(:), INTENT(IN), OPTIONAL :: ZRH +! +! +!* 1. COMPUTE LAMBDA +! -------------- +! + ZLBDAR(:) = 0.0 + ZLBDAS(:) = 0.0 + ZLBDAG(:) = 0.0 +! + WHERE( ZRR(:) > 0.0 ) + ZLBDAR(:) = XLBR * (ZRHODREF(:) * MAX(ZRR(:), XRTMIN(3)))**XLBEXR + END WHERE +! + WHERE ( ZRS(:) > 0.0 ) + ZLBDAS(:) = MIN( XLBDAS_MAX, & + XLBS * (ZRHODREF(:) * MAX(ZRS(:), XRTMIN(5)))**XLBEXS ) + END WHERE +! + WHERE ( ZRG(:) > 0.0 ) + ZLBDAG(:) = XLBG * (ZRHODREF(:) * MAX( ZRG(:), XRTMIN(6)))**XLBEXG + END WHERE +! + IF (PRESENT(ZRH)) THEN + ZLBDAH(:) = 0.0 + WHERE ( ZRH(:) > 0.0 ) + ZLBDAH(:) = XLBH * (ZRHODREF(:) * MAX( ZRH(:), XRTMIN(7)))**XLBEXH + END WHERE + END IF +! +END SUBROUTINE COMPUTE_LBDA +! +!------------------------------------------------------------------------------ +! +SUBROUTINE ELEC_UPDATE_QD(ZDUM, ZER, ZEI, ZES, ZEG, ZQR, ZQI, ZQS, ZQG, & + ZRR, ZRI, ZRS, ZRG, & + ZEH, ZQH, ZRH, ZEC, ZQC, ZRC) +! +! Purpose : update the parameter e_x in the relation q_x = e_x d**f_x +! e_x = q_x/(N_x * M(f_x)) +! +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +REAL, INTENT(IN) :: ZDUM ! =1. if mixing ratio + ! =timestep if source +REAL, DIMENSION(:), INTENT(IN) :: ZQR, ZQI, ZQS, ZQG ! V. C. +REAL, DIMENSION(:), INTENT(IN) :: ZRR, ZRI, ZRS, ZRG ! mixing ratio +REAL, DIMENSION(:), INTENT(OUT) :: ZER, ZEI, ZES, ZEG ! Coef of the charge diameter relation +REAL, DIMENSION(:), INTENT(IN), OPTIONAL :: ZQH ! hail +REAL, DIMENSION(:), INTENT(IN), OPTIONAL :: ZRH ! hail +REAL, DIMENSION(:), INTENT(OUT), OPTIONAL :: ZEH ! hail +! +REAL, DIMENSION(:), INTENT(IN), OPTIONAL :: ZQC ! V. C. for droplets +REAL, DIMENSION(:), INTENT(IN), OPTIONAL :: ZRC ! mixing ration for droplets +REAL, DIMENSION(:), INTENT(OUT), OPTIONAL :: ZEC ! Coef of the charge diameter relation for droplets +REAL, DIMENSION(SIZE(XRTMIN)) :: ZRTMIN_E +! +! +!* 1. UPDATE E_x +! ---------- +! +IF (PRESENT(ZEC)) ZEC(:) = 0. +ZER(:) = 0. +ZEI(:) = 0. +ZES(:) = 0. +ZEG(:) = 0. +ZRTMIN_E(:) = XRTMIN(:) / ZDUM +! +!* 1.1 for cloud droplets +! +IF (PRESENT(ZEC) .AND. PRESENT(ZQC) .AND. PRESENT(ZRC)) THEN + WHERE (ZRC(:) > ZRTMIN_E(2)) + ZEC(:) = ZDUM * ZRHODREF(:) * ZQC(:) / XFQUPDC + ZEC(:) = SIGN( MIN(ABS(ZEC(:)), XECMAX), ZEC(:)) + ENDWHERE +END IF +! +!* 1.2 for raindrops +! +WHERE (ZRR(:) > ZRTMIN_E(3) .AND. ZLBDAR(:) > 0.) + ZER(:) = ZDUM * ZRHODREF(:) * ZQR(:) / (XFQUPDR * ZLBDAR(:)**(XCXR - XFR)) + ZER(:) = SIGN( MIN(ABS(ZER(:)), XERMAX), ZER(:)) +ENDWHERE +! +!* 1.3 for ice crystals +! +WHERE (ZRI(:) > ZRTMIN_E(4) .AND. ZCIT(:) > 0.0) + ZEI(:) = ZDUM * ZRHODREF(:) * ZQI(:) / & + ((ZCIT**(1 - XEXFQUPDI)) * XFQUPDI * (ZRHODREF(:) * & + ZDUM * ZRI(:))**XEXFQUPDI) + ZEI(:) = SIGN( MIN(ABS(ZEI(:)), XEIMAX), ZEI(:)) +ENDWHERE +! +!* 1.4 for snow +! +WHERE (ZRS(:) > ZRTMIN_E(5) .AND. ZLBDAS(:) > 0.) + ZES(:) = ZDUM * ZRHODREF(:) * ZQS(:) / (XFQUPDS * ZLBDAS(:)**(XCXS - XFS)) + ZES(:) = SIGN( MIN(ABS(ZES(:)), XESMAX), ZES(:)) +ENDWHERE +! +!* 1.5 for graupel +! +WHERE (ZRG(:) > ZRTMIN_E(6).AND. ZLBDAG(:) > 0.) + ZEG(:) = ZDUM * ZRHODREF(:) * ZQG(:) / (XFQUPDG * ZLBDAG(:)**(XCXG - XFG)) + ZEG(:) = SIGN( MIN(ABS(ZEG(:)), XEGMAX), ZEG(:)) +ENDWHERE +! +!* 1.6 for hail +! +IF (PRESENT(ZEH) .AND. PRESENT(ZQH) .AND. PRESENT(ZRH)) THEN + ZEH(:) = 0. + WHERE (ZRH(:) > ZRTMIN_E(7).AND. ZLBDAH(:) > 0.) + ZEH(:) = ZDUM * ZRHODREF(:) * ZQH(:) / (XFQUPDH * ZLBDAH(:)**(XCXH - XFH)) + ZEH(:) = SIGN( MIN(ABS(ZEH(:)), XEHMAX), ZEH(:)) + ENDWHERE +END IF +! +END SUBROUTINE ELEC_UPDATE_QD +! +!------------------------------------------------------------------------------- +! + SUBROUTINE ELEC_INI_NI_PROCESS +! +! Purpose : initialization for the non-inductive charging process +! +! GELEC(:,1) : logical variable for Ice-Snow process --> ELEC_IAGGS_B +! from RAIN_ICE_ELEC_SLOW routine +! GELEC(:,2) : logical variable for Ice-Graupel process --> ELEC_IDRYG_B +! from RAIN_ICE_ELEC_FAST_RG +! GELEC(:,3) : logical variable for Snow-Graupel process --> ELEC_SDRYG_B +! from RAIN_ICE_ELEC_FAST_RG +! +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +! +!* 1. Gardiner et al. (1985) +! ---------------------- +! + IF (CNI_CHARGING == 'GARDI') THEN + ZDELTALWC(:) = 0. + ZFT(:) = 0. +! + GELEC(:,3) = ZZT(:) > (XTT - 40.) .AND. ZZT(:) < XTT + GELEC(:,1) = GELEC(:,3) .AND. & + ZRIT(:) > XRTMIN_ELEC(4) .AND. ZRST(:) > XRTMIN_ELEC(5) .AND. & + ZCIT(:) > 0.0 .AND. ZLBDAS(:) > 0. .AND. ZLBDAS(:) < XLBDAS_MAXE + GELEC(:,2) = GELEC(:,3) .AND. & + ZRIT(:) > XRTMIN_ELEC(4) .AND. ZRGT(:) > XRTMIN_ELEC(6) .AND. & + ZCIT(:) > 0.0 .AND. ZLBDAG(:) > 0. .AND. ZLBDAG(:) < XLBDAG_MAXE + GELEC(:,3) = GELEC(:,3) .AND. & + ZRST(:) > XRTMIN_ELEC(5) .AND. ZRGT(:) > XRTMIN_ELEC(6) .AND. & + ZLBDAS(:) > 0. .AND. ZLBDAS(:) < XLBDAS_MAXE .AND. & + ZLBDAG(:) > 0. .AND. ZLBDAG(:) < XLBDAG_MAXE + GELEC(:,4) = GELEC(:,1) .OR. GELEC(:,2) .OR. GELEC(:,3) +! + WHERE (GELEC(:,4)) + ZFT(:) = - 1.7E-5 * ((-21 / (XQTC - XTT)) * (ZZT(:) - XTT))**3 & + - 0.003 * ((-21 / (XQTC - XTT)) * (ZZT(:) - XTT))**2 & + - 0.05 * ((-21 / (XQTC - XTT)) * (ZZT(:) - XTT)) & + + 0.13 +! + ZDELTALWC(:) = (ZRCT(:) * ZRHODREF(:) * 1.E3) - XLWCC ! (g m^-3) + ENDWHERE + ENDIF +! +! +!* 2. Saunders et al. (1991) +! ---------------------- +! +!* 2.1 common to SAUN1 and SAUN2 +! + IF (CNI_CHARGING == 'SAUN1' .OR. CNI_CHARGING == 'SAUN2') THEN + ZDQLWC(:) = 0. + ZEW(:) = 0. +! +! positive case is the default value + ZFQIAGGS(:) = XFQIAGGSP + ZFQIDRYGBS(:) = XFQIDRYGBSP + ZLBQSDRYGB1S(:) = XLBQSDRYGB1SP + ZLBQSDRYGB2S(:) = XLBQSDRYGB2SP + ZLBQSDRYGB3S(:) = XLBQSDRYGB3SP + ZSAUNIM(:) = XIMP !3.76 + ZSAUNIN(:) = XINP !2.5 + ZSAUNSK(:) = XSKP !52.8 + ZSAUNSM(:) = XSMP !0.44 + ZSAUNSN(:) = XSNP !2.5 +! +! LWC_crit + ZLWCC(:) = MIN( MAX( -0.49 + 6.64E-2*(XTT-ZZT(:)),0.22 ),1.1 ) ! (g m^-3) +! +! Mansell et al. (2005, JGR): droplet collection efficiency of the graupel ~ 0.6-1.0 + ZEW(:) = 0.8 * ZRCT(:) * ZRHODREF(:) * 1.E3 ! (g m^-3) +! + GELEC(:,3) = ZZT(:) > (XTT - 40.) .AND. ZZT(:) <= XTT .AND. & + ZEW(:) >= 0.01 .AND. ZEW(:) <= 10. + GELEC(:,1) = GELEC(:,3) .AND. & + ZRIT(:) > XRTMIN_ELEC(4) .AND. ZRST(:) > XRTMIN_ELEC(5) .AND. & + ZCIT(:) > 0.0 .AND. ZLBDAS(:) > 0. .AND. ZLBDAS(:) < XLBDAS_MAXE + GELEC(:,2) = GELEC(:,3) .AND. & + ZRIT(:) > XRTMIN_ELEC(4) .AND. ZRGT(:) > XRTMIN_ELEC(6) .AND. & + ZCIT(:) > 0.0 .AND. ZLBDAG(:) > 0. .AND. ZLBDAG(:) < XLBDAG_MAXE + GELEC(:,3) = GELEC(:,3) .AND. & + ZRST(:) > XRTMIN_ELEC(5) .AND. ZRGT(:) > XRTMIN_ELEC(6) .AND. & + ZLBDAS(:) > 0. .AND. ZLBDAS(:) < XLBDAS_MAXE .AND. & + ZLBDAG(:) > 0. .AND. ZLBDAG(:) < XLBDAG_MAXE +! + ALLOCATE (GSAUN(IMICRO)) + GSAUN(:) = .FALSE. +! +! For temperature lower than -30C and higher than -40C, value of q at -30C + GSAUN(:) = GELEC(:,1) .OR. GELEC(:,2) .OR. GELEC(:,3) + IGSAUN = COUNT (GSAUN(:)) +! + IF (IGSAUN > 0) THEN + CALL ELEC_INI_NI_SAUNQ(ZEW, ZDQLWC) +! + WHERE (ZDQLWC(:) < 0.) + ZFQIAGGS(:) = XFQIAGGSN + ZFQIDRYGBS(:) = XFQIDRYGBSN + ZLBQSDRYGB1S(:) = XLBQSDRYGB1SN + ZLBQSDRYGB2S(:) = XLBQSDRYGB2SN + ZLBQSDRYGB3S(:) = XLBQSDRYGB3SN + ZSAUNIM(:) = XIMN !2.54 + ZSAUNIN(:) = XINN !2.8 + ZSAUNSK(:) = XSKN !24. + ZSAUNSM(:) = XSMN !0.5 + ZSAUNSN(:) = XSNN !2.8 + ENDWHERE + ENDIF +! + DEALLOCATE( GSAUN ) + END IF +! +! +!* 3. Saunders and Peck (1998) +! + IF (CNI_CHARGING == 'SAP98') THEN + ZRAR_CRIT(:) = 0. +! +! compute the critical rime accretion rate + WHERE (ZZT(:) <= XTT .AND. ZZT(:) >= (XTT - 23.7)) ! Original from SAP98 + ZRAR_CRIT(:) = 1.0 + 7.93E-2 * (ZZT(:) - XTT) + & + 4.48E-2 * (ZZT(:) - XTT)**2 + & + 7.48E-3 * (ZZT(:) - XTT)**3 + & + 5.47E-4 * (ZZT(:) - XTT)**4 + & + 1.67E-5 * (ZZT(:) - XTT)**5 + & + 1.76E-7 * (ZZT(:) - XTT)**6 + END WHERE +! + WHERE (ZZT(:) < (XTT - 23.7) .AND. ZZT(:) > (XTT - 40.)) ! Added by Mansell + ZRAR_CRIT(:) = 3.4 * (1.0 - (ABS(ZZT(:) - XTT + 23.7) / & ! et al. (2005) + (-23.7 + 40.))**3.) + END WHERE +! + GELEC(:,3) = ZZT(:) >= (XTT - 40.) .AND. ZZT(:) <= XTT + GELEC(:,1) = GELEC(:,3) .AND. & + ZRIT(:) > XRTMIN_ELEC(4) .AND. ZRST(:) > XRTMIN_ELEC(5) .AND. & + ZCIT(:) > 0.0 .AND. ZLBDAS(:) > 0. .AND. ZLBDAS(:) < XLBDAS_MAXE + GELEC(:,2) = GELEC(:,3) .AND. & + ZRIT(:) > XRTMIN_ELEC(4) .AND. ZRGT(:) > XRTMIN_ELEC(6) .AND. & + ZCIT(:) > 0.0 .AND. ZLBDAG(:) > 0. .AND. ZLBDAG(:) < XLBDAG_MAXE + GELEC(:,3) = GELEC(:,3) .AND. & + ZRST(:) > XRTMIN_ELEC(5) .AND. ZRGT(:) > XRTMIN_ELEC(6) .AND. & + ZLBDAS(:) > 0. .AND. ZLBDAS(:) < XLBDAS_MAXE .AND. & + ZLBDAG(:) > 0. .AND. ZLBDAG(:) < XLBDAG_MAXE +! +!+++++++++ I - G collisions +++++++++ + ZSAUNIM_IG(:) = 0. +! +! positive case is the default value + ZSAUNIM_IG(:) = XIMP + ZSAUNIN_IG(:) = XINP +! +! Compute the Rime Accretion Rate + ZRAR(:) = 0. + ZVGMEAN(:) = 0. + WHERE (ZLBDAG(:) > 0. .AND. ZRCT(:) > 0.) + ZVGMEAN(:) = XVGCOEF * ZRHOCOR(:) * ZLBDAG(:)**(-XDG) + ZRAR(:) = 0.8 * ZRHODREF(:) * ZRCT(:) * ZVGMEAN(:) * 1.E3 + END WHERE +! + GELEC(:,2) = GELEC(:,2) .AND. ZRAR(:) > 0.1 + GELEC(:,4) = GELEC(:,2) +! + IF (COUNT(GELEC(:,4)) .GT. 0) THEN +! +! compute the coefficients for I-G collisions + CALL ELEC_INI_NI_SAP98 (ZRAR, ZDQRAR_IG) +! + WHERE (ZDQRAR_IG(:) < 0.) + ZSAUNIM_IG(:) = XIMN + ZSAUNIN_IG(:) = XINN + ENDWHERE + ENDIF +! +!+++++++++ I - S collisions +++++++++ + ZDQRAR_IS(:) = 0. +! +! positive case is the default value + ZSAUNIM_IS(:) = XIMP + ZSAUNIN_IS(:) = XINP +! +! Compute the Rime Accretion Rate + ZRAR(:) = 0. + ZVSMEAN(:) = 0. +! + WHERE (ZLBDAS(:) > 0. .AND. ZRCT(:) > 0.) + ZVSMEAN(:) = XVSCOEF * ZRHOCOR(:) * ZLBDAS(:)**(-XDS) + ZRAR(:) = 0.8 * ZRHODREF(:) * ZRCT(:) * ZVSMEAN(:) * 1.E3 + END WHERE +! + GELEC(:,1) = GELEC(:,1) .AND. ZRAR(:) > 0.1 + GELEC(:,4) = GELEC(:,1) +! + IF (COUNT(GELEC(:,4)) .GT. 0) THEN +! compute the coefficients for I-S collisions + CALL ELEC_INI_NI_SAP98 (ZRAR, ZDQRAR_IS) +! + WHERE (ZDQRAR_IS(:) < 0.) + ZSAUNIM_IS(:) = XIMN + ZSAUNIN_IS(:) = XINN + ENDWHERE + ENDIF +! +!+++++++++ S - G collisions +++++++++ + ZDQRAR_SG(:) = 0. +! +! positive case is the default value + ZSAUNSK_SG(:) = XSKP + ZSAUNSM_SG(:) = XSMP + ZSAUNSN_SG(:) = XSNP +! +! Compute the Rime Accretion Rate + ZRAR(:) = 0. +! + WHERE (ZVSMEAN(:) > 0. .AND. ZVGMEAN(:) > 0.) + ZRAR(:) = 0.8 * ZRHODREF(:) * ZRCT(:) * ABS(ZVGMEAN(:) - ZVSMEAN(:)) * 1.E3 + END WHERE +! + GELEC(:,3) = GELEC(:,3) .AND. ZRAR(:) > 0.1 + GELEC(:,4) = GELEC(:,3) +! + IF( COUNT(GELEC(:,4)) .GT. 0) THEN +! +! compute the coefficients for S-G collisions + CALL ELEC_INI_NI_SAP98 (ZRAR, ZDQRAR_SG) +! + WHERE (ZDQRAR_SG(:) < 0.) + ZSAUNSK_SG(:) = XSKN + ZSAUNSM_SG(:) = XSMN + ZSAUNSN_SG(:) = XSNN + ENDWHERE + ENDIF + END IF +! +!* 4. Brooks et al. (1997) without / with anomalies +! + IF (CNI_CHARGING == 'BSMP1' .OR. CNI_CHARGING == 'BSMP2') THEN + + ALLOCATE (GSAUN(IMICRO)) +! +! compute the critical rime accretion rate + WHERE (ZZT(:) > (XTT - 10.7)) + ZRAR_CRIT(:) = 0.66 + END WHERE + WHERE (ZZT(:) <= (XTT - 10.7) .AND. ZZT(:) >= (XTT - 23.7)) + ZRAR_CRIT(:) = -1.47 - 0.2 * (ZZT(:) - XTT) + END WHERE + WHERE (ZZT(:) < (XTT - 23.7) .AND. ZZT(:) > (XTT - 40.)) + ZRAR_CRIT(:) = 3.3 + END WHERE +! + GELEC(:,3) = ZZT(:) > (XTT - 40.) .AND. ZZT(:) <= XTT .AND. & + ZEW(:) >= 0.01 .AND. ZEW(:) <= 10. + GELEC(:,1) = GELEC(:,3) .AND. & + ZRIT(:) > XRTMIN_ELEC(4) .AND. ZRST(:) > XRTMIN_ELEC(5) .AND. & + ZCIT(:) > 0.0 .AND. ZLBDAS(:) > 0. .AND. ZLBDAS(:) < XLBDAS_MAXE + GELEC(:,2) = GELEC(:,3) .AND. & + ZRIT(:) > XRTMIN_ELEC(4) .AND. ZRGT(:) > XRTMIN_ELEC(6) .AND. & + ZCIT(:) > 0.0 .AND. ZLBDAG(:) > 0. .AND. ZLBDAG(:) < XLBDAG_MAXE + GELEC(:,3) = GELEC(:,3) .AND. & + ZRST(:) > XRTMIN_ELEC(5) .AND. ZRGT(:) > XRTMIN_ELEC(6) .AND. & + ZLBDAS(:) > 0. .AND. ZLBDAS(:) < XLBDAS_MAXE .AND. & + ZLBDAG(:) > 0. .AND. ZLBDAG(:) < XLBDAG_MAXE +! +!+++++++++ I - S collisions +++++++++ + ZDQRAR_IS(:) = 0. +! +! positive case is the default value + ZSAUNIM_IS(:) = XIMP + ZSAUNIN_IS(:) = XINP +! + GSAUN(:) = .FALSE. +! +! Compute the Rime Accretion Rate + ZRAR(:) = 0. + ZVSMEAN(:) = 0. +! + WHERE (ZLBDAS(:) > 0. .AND. ZRCT(:) > 0.) + ZVSMEAN(:) = XVSCOEF * ZRHOCOR(:) * ZLBDAS(:)**(-XDS) + ZRAR(:) = 0.8 * ZRHODREF(:) * ZRCT(:) * ZVSMEAN(:) * 1.E3 + END WHERE +! + GELEC(:,1) = GELEC(:,1) .AND. ZRAR(:) > 0.1 + GSAUN(:) = GELEC(:,1) + IGSAUN = COUNT (GSAUN(:)) +! + IF (IGSAUN .GT. 0) THEN + ZEW(:) = ZRAR(:) / 3. +! + CALL ELEC_INI_NI_SAUNQ (ZEW, ZDQRAR_IS) +! + WHERE (ZDQRAR_IS(:) < 0.) + ZSAUNIM_IS(:) = XIMN + ZSAUNIN_IS(:) = XINN + ENDWHERE + ENDIF +! +!+++++++++ I - G collisions +++++++++ + ZDQRAR_IG(:) = 0. +! +! positive case is the default value + ZSAUNIM_IG(:) = XIMP + ZSAUNIN_IG(:) = XINP +! + GSAUN(:) = .FALSE. +! +! Compute the Rime Accretion Rate + ZRAR(:) = 0. + ZVGMEAN(:) = 0. +! + WHERE (ZLBDAG(:) > 0. .AND. ZRCT(:) > 0.) + ZVGMEAN(:) = XVGCOEF * ZRHOCOR(:) * ZLBDAG(:)**(-XDG) + ZRAR(:) = 0.8 * ZRHODREF(:) * ZRCT(:) * ZVGMEAN(:) * 1.E3 + END WHERE +! + GELEC(:,2) = GELEC(:,2) .AND. ZRAR(:) > 0.1 + GSAUN(:) = GELEC(:,2) + IGSAUN = COUNT (GSAUN(:)) +! + IF (IGSAUN .GT. 0) THEN + ZEW(:) = ZRAR(:) / 3. + CALL ELEC_INI_NI_SAUNQ (ZEW, ZDQRAR_IG) +! + WHERE (ZDQRAR_IG(:) < 0.) + ZSAUNIM_IG(:) = XIMN + ZSAUNIN_IG(:) = XINN + ENDWHERE + ENDIF +! +!+++++++++ S - G collisions +++++++++ + ZDQRAR_SG(:) = 0. +! +! positive case is the default value + ZSAUNSK_SG(:) = XSKP + ZSAUNSM_SG(:) = XSMP + ZSAUNSN_SG(:) = XSNP +! + GSAUN(:) = .FALSE. +! +! Compute the Rime Accretion Rate + ZRAR(:) = 0. +! + WHERE (ZVSMEAN(:) > 0. .AND. ZVGMEAN(:) > 0.) + ZRAR(:) = 0.8 * ZRHODREF(:) * ZRCT(:) * ABS(ZVGMEAN(:) - ZVSMEAN(:)) * 1.E3 + END WHERE +! + GELEC(:,3) = GELEC(:,3) .AND. ZRAR(:) > 0.1 + GSAUN(:) = GELEC(:,3) + IGSAUN = COUNT (GSAUN(:)) +! + IF (IGSAUN .GT. 0) THEN + ZEW(:) = ZRAR(:) / 3. + CALL ELEC_INI_NI_SAUNQ (ZEW, ZDQRAR_SG) +! + WHERE (ZDQRAR_SG(:) < 0.) + ZSAUNSK_SG(:) = XSKN + ZSAUNSM_SG(:) = XSMN + ZSAUNSN_SG(:) = XSNN + ENDWHERE + ENDIF +! + DEALLOCATE( GSAUN ) + END IF +! +! +!* 5. Takahashi (1978) +! + IF (CNI_CHARGING == 'TAKAH') THEN + ZDQLWC(:) = 0. +! + ZEW(:) = ZRCT(:) * ZRHODREF(:) * 1.E3 ! (g m^-3) +! + GELEC(:,3) = ZZT(:) > (XTT - 40.) .AND. ZZT(:) <= XTT .AND. & + ZEW(:) >= 0.01 .AND. ZEW(:) <= 10. + GELEC(:,1) = GELEC(:,3) .AND. & + ZRIT(:) > XRTMIN_ELEC(4) .AND. ZRST(:) > XRTMIN_ELEC(5) .AND. & + ZCIT(:) > 0.0 .AND. ZLBDAS(:) > 0. .AND. ZLBDAS(:) < XLBDAS_MAXE + GELEC(:,2) = GELEC(:,3) .AND. & + ZRIT(:) > XRTMIN_ELEC(4) .AND. ZRGT(:) > XRTMIN_ELEC(6) .AND. & + ZCIT(:) > 0.0 .AND. ZLBDAG(:) > 0. .AND. ZLBDAG(:) < XLBDAG_MAXE + GELEC(:,3) = GELEC(:,3) .AND. & + ZRST(:) > XRTMIN_ELEC(5) .AND. ZRGT(:) > XRTMIN_ELEC(6) .AND. & + ZLBDAS(:) > 0. .AND. ZLBDAS(:) < XLBDAS_MAXE .AND. & + ZLBDAG(:) > 0. .AND. ZLBDAG(:) < XLBDAG_MAXE +! + ALLOCATE (GTAKA(IMICRO)) + GTAKA(:) = .FALSE. +! +! For temperature lower than -30C and higher than -40C, value of q at -30C + GTAKA(:) = GELEC(:,1) .OR. GELEC(:,2) .OR. GELEC(:,3) + IGTAKA = COUNT (GTAKA(:)) +! + IF (IGTAKA > 0) THEN + CALL ELEC_INI_NI_TAKAH(ZEW, ZDQLWC, XMANSELL) + ENDIF +! + DEALLOCATE( GTAKA ) + ENDIF +! +! +!* 6. Takahashi with EW (Tsenova and Mitzeva, 2009) +! + IF (CNI_CHARGING == 'TEEWC') THEN + ZDQLWC(:) = 0. +! +! positive case is the default value + ZFQIAGGS(:) = XFQIAGGSP_TAK + ZFQIDRYGBS(:) = XFQIDRYGBSP_TAK + ZLBQSDRYGB1S(:) = XLBQSDRYGB1SP + ZLBQSDRYGB2S(:) = XLBQSDRYGB2SP + ZLBQSDRYGB3S(:) = XLBQSDRYGB3SP + ZSAUNIM(:) = XIMP !3.76 + ZSAUNIN(:) = XINP !2.5 + ZSAUNSK(:) = XSKP_TAK !6.5 + ZSAUNSM(:) = XSMP !0.44 + ZSAUNSN(:) = XSNP !2.5 +! +! Compute the effective water content + ZEW(:) = 0. +! + WHERE (ZLBDAG(:) > 0. .AND. ZRCT(:) > 0.) + ZEW(:) = 0.8 * ZRHODREF(:) * ZRCT(:) * 1.E3 + END WHERE +! + GELEC(:,3) = ZZT(:) >= (XTT - 40.) .AND. ZZT(:) <= XTT .AND. & + ZEW(:) >= 0.01 .AND. ZEW(:) <= 10. + GELEC(:,1) = GELEC(:,3) .AND. & + ZRIT(:) > XRTMIN_ELEC(4) .AND. ZRST(:) > XRTMIN_ELEC(5) .AND. & + ZCIT(:) > 0.0 .AND. ZLBDAS(:) > 0. .AND. ZLBDAS(:) < XLBDAS_MAXE + GELEC(:,2) = GELEC(:,3) .AND. & + ZRIT(:) > XRTMIN_ELEC(4) .AND. ZRGT(:) > XRTMIN_ELEC(6) .AND. & + ZCIT(:) > 0.0 .AND. ZLBDAG(:) > 0. .AND. ZLBDAG(:) < XLBDAG_MAXE + GELEC(:,3) = GELEC(:,3) .AND. & + ZRST(:) > XRTMIN_ELEC(5) .AND. ZRGT(:) > XRTMIN_ELEC(6) .AND. & + ZLBDAS(:) > 0. .AND. ZLBDAS(:) < XLBDAS_MAXE .AND. & + ZLBDAG(:) > 0. .AND. ZLBDAG(:) < XLBDAG_MAXE +! + ALLOCATE (GTAKA(IMICRO)) + GTAKA(:) = .FALSE. +! +! For temperature lower than -30C and higher than -40C, value of q at -30C + GTAKA(:) = GELEC(:,1) .OR. GELEC(:,2) .OR. GELEC(:,3) + IGTAKA = COUNT (GTAKA(:)) +! + IF (IGTAKA > 0) THEN + CALL ELEC_INI_NI_TAKAH(ZEW, ZDQLWC, XTAKA_TM) +! + WHERE (ZDQLWC(:) < 0.) + ZFQIAGGS(:) = XFQIAGGSN_TAK + ZFQIDRYGBS(:) = XFQIDRYGBSN_TAK + ZLBQSDRYGB1S(:) = XLBQSDRYGB1SN + ZLBQSDRYGB2S(:) = XLBQSDRYGB2SN + ZLBQSDRYGB3S(:) = XLBQSDRYGB3SN + ZSAUNIM(:) = XIMN !2.54 + ZSAUNIN(:) = XINN !2.8 + ZSAUNSK(:) = XSKN_TAK !2.0 + ZSAUNSM(:) = XSMN !0.5 + ZSAUNSN(:) = XSNN !2.8 + ENDWHERE + ENDIF +! + DEALLOCATE( GTAKA ) + ENDIF +! +! +!* 7. Takahashi with RAR (Tsenova and Mitzeva, 2011) +! + IF (CNI_CHARGING == 'TERAR') THEN +! + ALLOCATE (GTAKA(IMICRO)) +! + GELEC(:,3) = ZZT(:) >= (XTT - 40.) .AND. ZZT(:) <= XTT + GELEC(:,1) = GELEC(:,3) .AND. & + ZRIT(:) > XRTMIN_ELEC(4) .AND. ZRST(:) > XRTMIN_ELEC(5) .AND. & + ZCIT(:) > 0.0 .AND. ZLBDAS(:) > 0. .AND. ZLBDAS(:) < XLBDAS_MAXE + GELEC(:,2) = GELEC(:,3) .AND. & + ZRIT(:) > XRTMIN_ELEC(4) .AND. ZRGT(:) > XRTMIN_ELEC(6) .AND. & + ZCIT(:) > 0.0 .AND. ZLBDAG(:) > 0. .AND. ZLBDAG(:) < XLBDAG_MAXE + GELEC(:,3) = GELEC(:,3) .AND. & + ZRST(:) > XRTMIN_ELEC(5) .AND. ZRGT(:) > XRTMIN_ELEC(6) .AND. & + ZLBDAS(:) > 0. .AND. ZLBDAS(:) < XLBDAS_MAXE .AND. & + ZLBDAG(:) > 0. .AND. ZLBDAG(:) < XLBDAG_MAXE +! +!+++++++++ I - S collisions +++++++++ + ZDQRAR_IS(:) = 0. +! +! positive case is the default value + ZSAUNIM_IS(:) = XIMP + ZSAUNIN_IS(:) = XINP +! + GTAKA(:) = .FALSE. +! +! Compute the Rime Accretion Rate + ZRAR(:) = 0. + ZVSMEAN(:) = 0. +! + WHERE (ZLBDAS(:) > 0. .AND. ZRCT(:) > 0.) + ZVSMEAN(:) = XVSCOEF * ZRHOCOR(:) * ZLBDAS(:)**(-XDS) + ZRAR(:) = 0.8 * ZRHODREF(:) * ZRCT(:) * ZVSMEAN(:) * 1.E3 + END WHERE +! + GELEC(:,1) = GELEC(:,1) .AND. ZRAR(:) > 0.01 .AND. ZRAR(:) <= 80. + GTAKA(:) = GELEC(:,1) +! + IGTAKA = COUNT (GTAKA(:)) +! + IF (IGTAKA > 0) THEN + ZEW(:) = ZRAR(:) / 8. + CALL ELEC_INI_NI_TAKAH(ZEW, ZDQRAR_IS, XTAKA_TM) +! + WHERE (ZDQRAR_IS(:) < 0.) + ZSAUNIM_IS(:) = XIMN + ZSAUNIN_IS(:) = XINN + ENDWHERE + END IF +! +! +!+++++++++ I - G collisions +++++++++ + ZDQRAR_IG(:) = 0. +! +! positive case is the default value + ZSAUNIM_IG(:) = XIMP + ZSAUNIN_IG(:) = XINP +! + GTAKA(:) = .FALSE. +! +! Compute the Rime Accretion Rate + ZRAR(:) = 0. + ZVGMEAN(:) = 0. +! + WHERE (ZLBDAG(:) > 0. .AND. ZRCT(:) > 0.) + ZVGMEAN(:) = XVGCOEF * ZRHOCOR(:) * ZLBDAG(:)**(-XDG) + ZRAR(:) = 0.8 * ZRHODREF(:) * ZRCT(:) * ZVGMEAN(:) * 1.E3 + END WHERE +! + GELEC(:,2) = GELEC(:,2) .AND. ZRAR(:) > 0.01 .AND. ZRAR(:) <= 80. + GTAKA(:) = GELEC(:,2) +! + IGTAKA = COUNT (GTAKA(:)) +! + IF (IGTAKA > 0) THEN + ZEW(:) = ZRAR(:) / 8. + CALL ELEC_INI_NI_TAKAH(ZEW, ZDQRAR_IG, XTAKA_TM) +! + WHERE (ZDQRAR_IG(:) < 0.) + ZSAUNIM_IG(:) = XIMN + ZSAUNIN_IG(:) = XINN + ENDWHERE + ENDIF +! +!+++++++++ S - G collisions +++++++++ + ZDQRAR_SG(:) = 0. +! +! positive case is the default value + ZSAUNSK_SG(:) = XSKP_TAK + ZSAUNSM_SG(:) = XSMP + ZSAUNSN_SG(:) = XSNP +! + GTAKA(:) = .FALSE. +! +! Compute the Rime Accretion Rate + ZRAR(:) = 0. +! + WHERE (ZVSMEAN(:) > 0. .AND. ZVGMEAN(:) > 0.) + ZRAR(:) = 0.8 * ZRHODREF(:) * ZRCT(:) * ABS(ZVGMEAN(:) - ZVSMEAN(:)) * 1.E3 + END WHERE +! + GELEC(:,3) = GELEC(:,3) .AND. ZRAR(:) > 0.01 .AND. ZRAR(:) <= 80 + GTAKA(:) = GELEC(:,3) + IGTAKA = COUNT (GTAKA(:)) +! + IF (IGTAKA > 0) THEN + ZEW(:) = ZRAR(:) / 8. + CALL ELEC_INI_NI_TAKAH(ZEW, ZDQRAR_SG, XTAKA_TM) +! + WHERE (ZDQRAR_SG(:) < 0.) + ZSAUNSK_SG(:) = XSKN_TAK + ZSAUNSM_SG(:) = XSMN + ZSAUNSN_SG(:) = XSNN + ENDWHERE + ENDIF +! + DEALLOCATE( GTAKA ) + END IF +! +END SUBROUTINE ELEC_INI_NI_PROCESS +! +!------------------------------------------------------------------------------- +! + SUBROUTINE ELEC_INI_NI_SAP98(ZRAR, ZDQRAR_AUX) +! +IMPLICIT NONE +! +REAL, DIMENSION(:), INTENT(IN) :: ZRAR +REAL, DIMENSION(:), INTENT(INOUT) :: ZDQRAR_AUX ! q= f(RAR,T) in Saunders and + ! Peck's equation +! + ZDQRAR_AUX(:) = 0. +! +! positive region : Mansell et al., 2005 + WHERE (GELEC(:,4) .AND. ZRAR(:) > ZRAR_CRIT(:)) + ZDQRAR_AUX(:) = MAX(0., 6.74 * (ZRAR(:) - ZRAR_CRIT(:)) * 1.E-15) + ENDWHERE +! +! negative region : Mansell et al. 2005 + WHERE (GELEC(:,4) .AND. ZRAR(:) < ZRAR_CRIT(:)) + ZDQRAR_AUX(:) = MIN(0., 3.9 * (ZRAR_CRIT(:) - 0.1) * & + (4.0 * ((ZRAR(:) - (ZRAR_CRIT(:) + 0.1) / 2.) / & + (ZRAR_CRIT(:) - 0.1))**2 - 1.) * 1.E-15) + ENDWHERE +! +END SUBROUTINE ELEC_INI_NI_SAP98 +! +!------------------------------------------------------------------------------- +! + SUBROUTINE ELEC_INI_NI_SAUNQ(ZEW, ZDQLWC_AUX) +! +IMPLICIT NONE +! +REAL, DIMENSION(:), INTENT(IN) :: ZEW +REAL, DIMENSION(:), INTENT(INOUT) :: ZDQLWC_AUX ! q= f(RAR or EW,T) in Saunders + !... equation +! +! For temperature lower than -30C and higher than -40C, value of q at -30C +! + ALLOCATE ( IVEC1(IGSAUN) ) + ALLOCATE ( IVEC2(IGSAUN) ) + ALLOCATE ( ZVEC1(IGSAUN) ) + ALLOCATE ( ZVEC2(IGSAUN) ) + ALLOCATE ( ZDQLWC_OPT(IGSAUN) ) +! + ZDQLWC_OPT(:) = 0. + IVEC1(:) = 0 + IVEC2(:) = 0 +! + ZVEC1(:) = PACK( ZZT(:), MASK=GSAUN(:)) + ZVEC2(:) = PACK( ZEW(:), MASK=GSAUN(:)) + ZDQLWC_OPT(:) = PACK( ZDQLWC_AUX(:), MASK=GSAUN ) +! +! Temperature index (0C --> -40C) + ZVEC1(1:IGSAUN) = MAX( 1.00001, MIN( REAL(NIND_TEMP)-0.00001, & + (ZVEC1(1:IGSAUN) - XTT - 1.)/(-1.) ) ) + IVEC1(1:IGSAUN) = INT( ZVEC1(1:IGSAUN) ) + ZVEC1(1:IGSAUN) = ZVEC1(1:IGSAUN) - REAL(IVEC1(1:IGSAUN)) +! +! LWC index (0.01 g.m^-3 --> 10 g.m^-3) + WHERE (ZVEC2(:) >= 0.01 .AND. ZVEC2(:) < 0.1) + ZVEC2(:) = MAX( 1.00001, MIN( REAL(10)-0.00001, & + ZVEC2(:) * 100. )) + IVEC2(:) = INT(ZVEC2(:)) + ZVEC2(:) = ZVEC2(:) - REAL(IVEC2(:)) + ENDWHERE +! + WHERE (ZVEC2(:) >= 0.1 .AND. ZVEC2(:) < 1. .AND. IVEC2(:) == 0) + ZVEC2(:) = MAX( 10.00001, MIN( REAL(19)-0.00001, & + ZVEC2(:) * 10. + 9. ) ) + IVEC2(:) = INT(ZVEC2(:)) + ZVEC2(:) = ZVEC2(:) - REAL(IVEC2(:)) + ENDWHERE +! + WHERE ((ZVEC2(:) >= 1.) .AND. ZVEC2(:) <= 10.) + ZVEC2(:) = MAX( 19.00001, MIN( REAL(NIND_LWC)-0.00001, & + ZVEC2(:) + 18. ) ) + IVEC2(:) = INT(ZVEC2(:)) + ZVEC2(:) = ZVEC2(:) - REAL(IVEC2(:)) + ENDWHERE +! +! Interpolate XSAUNDER + ZDQLWC_OPT(:) = BI_LIN_INTP_V( XSAUNDER, IVEC2, IVEC1, ZVEC2, ZVEC1, & + IGSAUN ) + ZDQLWC_AUX(:) = UNPACK( ZDQLWC_OPT(:), MASK=GSAUN, FIELD=0.0 ) +! + DEALLOCATE( IVEC1 ) + DEALLOCATE( IVEC2 ) + DEALLOCATE( ZVEC1 ) + DEALLOCATE( ZVEC2 ) + DEALLOCATE( ZDQLWC_OPT ) +! +END SUBROUTINE ELEC_INI_NI_SAUNQ +! +!------------------------------------------------------------------------------- +! + SUBROUTINE ELEC_INI_NI_TAKAH(ZEW, ZDQTAKA_AUX, XTAKA_AUX) +! +IMPLICIT NONE +! +REAL, DIMENSION(IMICRO) :: ZEW +REAL, DIMENSION(IMICRO) :: ZDQTAKA_AUX +REAL, DIMENSION(NIND_LWC+1,NIND_TEMP+1) :: XTAKA_AUX !XMANSELL or XTAKA_TM) +! +! + ALLOCATE ( IVEC1(IGTAKA) ) + ALLOCATE ( IVEC2(IGTAKA) ) + ALLOCATE ( ZVEC1(IGTAKA) ) + ALLOCATE ( ZVEC2(IGTAKA) ) + ALLOCATE ( ZDQTAKA_OPT(IGTAKA) ) + + ZDQTAKA_OPT(:) = 0. + IVEC1(:) = 0 + IVEC2(:) = 0 +! + ZVEC1(:) = PACK( ZZT(:), MASK=GTAKA ) + ZVEC2(:) = PACK( ZEW(:), MASK=GTAKA ) + ZDQTAKA_OPT(:) = PACK( ZDQTAKA_AUX(:), MASK=GTAKA ) +! +! Temperature index (0C --> -40C) + ZVEC1(1:IGTAKA) = MAX( 1.00001, MIN( REAL(NIND_TEMP)-0.00001, & + (ZVEC1(1:IGTAKA) - XTT - 1.)/(-1.) ) ) + IVEC1(1:IGTAKA) = INT( ZVEC1(1:IGTAKA) ) + ZVEC1(1:IGTAKA) = ZVEC1(1:IGTAKA) - REAL(IVEC1(1:IGTAKA)) +! +! LWC index (0.01 g.m^-3 --> 10 g.m^-3) + WHERE (ZVEC2(:) >= 0.01 .AND. ZVEC2(:) < 0.1) + ZVEC2(:) = MAX( 1.00001, MIN( REAL(10)-0.00001, & + ZVEC2(:) * 100. )) + IVEC2(:) = INT(ZVEC2(:)) + ZVEC2(:) = ZVEC2(:) - REAL(IVEC2(:)) + ENDWHERE +! + WHERE (ZVEC2(:) >= 0.1 .AND. ZVEC2(:) < 1. .AND. IVEC2(:) == 0) + ZVEC2(:) = MAX( 10.00001, MIN( REAL(19)-0.00001, & + ZVEC2(:) * 10. + 9. ) ) + IVEC2(:) = INT(ZVEC2(:)) + ZVEC2(:) = ZVEC2(:) - REAL(IVEC2(:)) + ENDWHERE +! + WHERE (ZVEC2(:) >= 1. .AND. ZVEC2(:) <= 10.) + ZVEC2(:) = MAX( 19.00001, MIN( REAL(NIND_LWC)-0.00001, & + ZVEC2(:) + 18. ) ) + IVEC2(:) = INT(ZVEC2(:)) + ZVEC2(:) = ZVEC2(:) - REAL(IVEC2(:)) + ENDWHERE +! +! Interpolate XMANSELL or XTAKA_TM + ZDQTAKA_OPT(:) = BI_LIN_INTP_V( XTAKA_AUX, IVEC2, IVEC1, ZVEC2, ZVEC1, & + IGTAKA ) + ZDQTAKA_AUX(:) = UNPACK( ZDQTAKA_OPT(:), MASK=GTAKA, FIELD=0.0 ) +! + DEALLOCATE( IVEC1 ) + DEALLOCATE( IVEC2 ) + DEALLOCATE( ZVEC1 ) + DEALLOCATE( ZVEC2 ) + DEALLOCATE( ZDQTAKA_OPT ) +! +END SUBROUTINE ELEC_INI_NI_TAKAH +! +!------------------------------------------------------------------------------- +! + SUBROUTINE ELEC_IAGGS_B() +! +! Purpose : compute charge separation process during the collision +! between ice and snow +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +!* 1. Collision efficiency +! + ZCOLIS(:) = XCOLIS * EXP(XCOLEXIS * (ZZT(:) - XTT)) +! +!* 2. Charging process following Helsdon and Farley (1987) +! + IF (CNI_CHARGING == 'HELFA') THEN + ZWQ1(:,7) = 0. +! + WHERE (ZRIS(:) > XRTMIN_ELEC(4) .AND. ZCIT(:) > 0.0 .AND. & + ZRIT(:) > XRTMIN_ELEC(4) .AND. & + ZRST(:) > XRTMIN_ELEC(5)) + ZWQ1(:,7) = XFQIAGGSBH * ZZW(:) * ZCIT(:) / ZRIT(:) + ZWQ1(:,7) = ZWQ1(:,7) * (1. - ZCOLIS(:)) / ZCOLIS(:) +! +! Temperature dependance of the charge transferred + ZWQ1(:,7) = ZWQ1(:,7) * (ZZT(:) - XQTC) / ABS(ZZT(:) - XQTC) + ZWQ1(:,7) = ZWQ1(:,7) / ZRHODREF(:) +! + ZQSS(:) = ZQSS(:) + ZWQ1(:,7) + ZQIS(:) = ZQIS(:) - ZWQ1(:,7) + END WHERE + END IF +! +!* 3. Charging process following Gardiner et al. (1985) +! + IF (CNI_CHARGING == 'GARDI') THEN + ZWQ1(:,7) = 0. + WHERE (GELEC(:,1) .AND. ZDELTALWC(:) > 0. .AND. & + ZRIS(:) > ZRSMIN_ELEC(4) .AND. ZRSS(:) > ZRSMIN_ELEC(5)) + ZWQ1(:,7) = XFQIAGGSBG * (1 - ZCOLIS(:)) * & + ZRHODREF(:)**(-4. * XCEXVT + 4. / XBI) * & + ZCIT(:)**(1 - 4. / XBI) * & + ZDELTALWC(:) * ZFT(:) * & + ZLBDAS(:)**(XCXS - 2. - 4. * XDS) * & + (XAI * MOMG(XALPHAI, XNUI, XBI) / & + ZRIT(:))**(-4 / XBI) +! +! Dq is limited to XLIM_NI_IS + ZLIMIT(:) = XLIM_NI_IS * ZZW(:) * ZCIT(:) * & + (1 - ZCOLIS(:)) / (ZRIT(:) * ZCOLIS(:)) + ZWQ1(:,7) = SIGN( MIN( ABS(ZLIMIT(:)), ABS(ZWQ1(:,7)) ), ZWQ1(:,7) ) + ZWQ1(:,7) = ZWQ1(:,7) / ZRHODREF(:) + ENDWHERE +! +! For temperatures lower than -30C --> linear interpolation + WHERE (ZWQ1(:,7) /= 0. .AND. ZZT(:) < (XTT-30.) .AND. ZZT(:) >= (XTT-40.)) + ZWQ1(:,7) = ZWQ1(:,7) * (ZZT(:) - XTT + 40.) / 10. + ENDWHERE +! + ZQSS(:) = ZQSS(:) + ZWQ1(:,7) + ZQIS(:) = ZQIS(:) - ZWQ1(:,7) + END IF +! +!* 4. Charging process based on EW: SAUN1/SAUN2, TEEWC +!* following Saunders et al. (1991), Takahashi via Tsenova and Mitzeva (2009) +! + IF (CNI_CHARGING == 'SAUN1' .OR. CNI_CHARGING == 'SAUN2' .OR. & + CNI_CHARGING == 'TEEWC') THEN + ZWQ1(:,7) = 0. +! + WHERE (GELEC(:,1) .AND. ZRIS(:) > ZRSMIN_ELEC(4) .AND. & + ZRSS(:) > ZRSMIN_ELEC(5) .AND. ZDQLWC(:) /= 0.) + ZWQ1(:,7) = XFQIAGGSBS * (1 - ZCOLIS(:)) * & + ZRHOCOR(:)**(1 + ZSAUNIN(:)) * & + ZFQIAGGS(:) * ZDQLWC(:) * & + ZCIT(:)**(1 - ZSAUNIM(:) / XBI) * & + ZLBDAS(:)**(XCXS - 2.- XDS * (1. + ZSAUNIN(:))) * & + (ZRHODREF(:) * ZRIT(:) / XAIGAMMABI)**(ZSAUNIM(:) / XBI) +! +! Dq is limited to XLIM_NI_IS + ZLIMIT(:) = XLIM_NI_IS * ZZW(:) * ZCIT(:) * & + (1 - ZCOLIS(:)) / (ZRIT(:) * ZCOLIS(:)) + ZWQ1(:,7) = SIGN( MIN( ABS(ZLIMIT(:)), ABS(ZWQ1(:,7)) ), ZWQ1(:,7) ) + ZWQ1(:,7) = ZWQ1(:,7) / ZRHODREF(:) + ENDWHERE +! +! For temperatures lower than -30C --> linear interpolation + WHERE (ZWQ1(:,7) /= 0. .AND. ZZT(:) < (XTT-30.) .AND. ZZT(:) >= (XTT-40.)) + ZWQ1(:,7) = ZWQ1(:,7) * (ZZT(:) - XTT + 40.) / 10. + ENDWHERE +! + ZQSS(:) = ZQSS(:) + ZWQ1(:,7) + ZQIS(:) = ZQIS(:) - ZWQ1(:,7) +! + END IF +! +!* 5. Charging process based on RAR (=EW*V): SAP98, BSMP1/BSMP2, TERAR +!* following Saunders and Peck (1998) or +!* Brooks et al., 1997 (with/out anomalies) or +!* Takahashi via Tsenova and Mitzeva (2011) +! + IF (CNI_CHARGING == 'SAP98' .OR. CNI_CHARGING == 'BSMP1' .OR. & + CNI_CHARGING == 'BSMP2' .OR. CNI_CHARGING == 'TERAR') THEN +! + IF (CNI_CHARGING /= 'TERAR') THEN + ZFQIAGGS(:) = XFQIAGGSP + WHERE (ZDQRAR_IS(:) < 0.) + ZFQIAGGS(:) = XFQIAGGSN + ENDWHERE + ELSE + ZFQIAGGS(:) = XFQIAGGSP_TAK + WHERE (ZDQRAR_IS(:) <0.) + ZFQIAGGS(:) = XFQIAGGSN_TAK + ENDWHERE + ENDIF +! + ZWQ1(:,7) = 0. +! + WHERE (GELEC(:,1) .AND. ZDQRAR_IS(:) /= 0. .AND. & + ZRIS(:) > ZRSMIN_ELEC(4) .AND. ZRSS(:) > ZRSMIN_ELEC(5)) + ZWQ1(:,7) = XFQIAGGSBS * (1 - ZCOLIS(:)) * & + ZRHOCOR(:)**(1 + ZSAUNIN_IS(:)) * & + ZFQIAGGS(:) * ZDQRAR_IS(:) * & + ZCIT(:)**(1 - ZSAUNIM_IS(:) / XBI) * & + ZLBDAS(:)**(XCXS - 2.- XDS * (1. + ZSAUNIN_IS(:))) * & + (ZRHODREF(:) * ZRIT(:)/XAIGAMMABI)**(ZSAUNIM_IS(:) / XBI) +! +! Dq is limited to XLIM_NI_IS + ZLIMIT(:) = XLIM_NI_IS * ZZW(:) * ZCIT(:) * & + (1 - ZCOLIS(:)) / (ZRIT(:) * ZCOLIS(:)) + ZWQ1(:,7) = SIGN( MIN( ABS(ZLIMIT(:)), ABS(ZWQ1(:,7)) ), ZWQ1(:,7) ) + ZWQ1(:,7) = ZWQ1(:,7) / ZRHODREF(:) + ENDWHERE +! +! For temperatures lower than -30C --> linear interpolation + WHERE (ZWQ1(:,7) /= 0. .AND. ZZT(:) < (XTT-30.) .AND. ZZT(:) >= (XTT-40.)) + ZWQ1(:,7) = ZWQ1(:,7) * (ZZT(:) - XTT + 40.) / 10. + ENDWHERE +! + ZQSS(:) = ZQSS(:) + ZWQ1(:,7) + ZQIS(:) = ZQIS(:) - ZWQ1(:,7) + END IF +! +!* 6. Charging process following Takahashi (1978) +! + IF (CNI_CHARGING == 'TAKAH') THEN + ZWQ1(:,7) = 0. + ZLIMIT(:) = 0. +! + WHERE (GELEC(:,1) .AND. ZRIS(:) > ZRSMIN_ELEC(4) .AND. & + ZRSS(:) > ZRSMIN_ELEC(5) .AND. ZDQLWC(:) /= 0.) + ZWQ1(:,7) = XFQIAGGSBT1 * (1.0 - ZCOLIS(:)) * ZRHOCOR(:) * & + ZCIT(:) * ZLBDAS(:)**XCXS * ZDQLWC(:) * & + MIN( XFQIAGGSBT2 / (ZLBDAS(:)**(2. + XDS)) , & + XFQIAGGSBT3 * ZRHOCOR(:) * ZRHODREF(:)**(2./XBI) * & + ZRIT(:)**(2. / XBI) / & + (ZCIT(:)**(2. / XBI) * ZLBDAS(:)**(2. + 2. * XDS))) +! +! Dq is limited to XLIM_NI_IS + ZLIMIT(:) = XLIM_NI_IS * ZZW(:) * ZCIT(:) * & + (1 - ZCOLIS(:)) / (ZRIT(:) * ZCOLIS(:)) + ZWQ1(:,7) = SIGN( MIN( ABS(ZLIMIT(:)), ABS(ZWQ1(:,7)) ), ZWQ1(:,7) ) + ZWQ1(:,7) = ZWQ1(:,7) / ZRHODREF(:) + ENDWHERE +! +! For temperatures lower than -30C --> linear interpolation + WHERE (ZWQ1(:,7) /= 0. .AND. ZZT(:) < (XTT-30.) .AND. ZZT(:) >= (XTT-40.)) + ZWQ1(:,7) = ZWQ1(:,7) * (ZZT(:) - XTT + 40.) / 10. + ENDWHERE +! + ZQSS(:) = ZQSS(:) + ZWQ1(:,7) + ZQIS(:) = ZQIS(:) - ZWQ1(:,7) + END IF +! +! +END SUBROUTINE ELEC_IAGGS_B +! +!------------------------------------------------------------------------------- +! + SUBROUTINE ELEC_IDRYG_B() +! +! Purpose : compute charge separation process during the dry collision +! between ice and graupeln +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +! +!* 1. COMPUTE THE COLLECTION EFFICIENCY +! --------------------------------- +! + ZCOLIG(:) = XCOLIG * EXP(XCOLEXIG * (ZZT(:) - XTT)) +! +!* 2. COMPUTE THE CHARGE SEPARATION DURING IDRYG_BOUN +! ----------------------------------------------- +! +!* 2.1 Helsdon and Farley (1987) +! + IF (CNI_CHARGING == 'HELFA') THEN + ZWQ1(:,3) = 0. + WHERE (ZRIS(:) > ZRSMIN_ELEC(4) .AND. ZCIT(:) > 0.0 .AND. & + ZRIT(:) > XRTMIN_ELEC(4) .AND. ZRGT(:) > XRTMIN_ELEC(6) .AND. & + ZRGS(:) > ZRSMIN_ELEC(6)) + ZWQ1(:,3) = XHIDRYG * ZZW1(:,2) * ZCIT(:) / ZRIT(:) + ZWQ1(:,3) = ZWQ1(:,3) * (1. - ZCOLIG(:)) / ZCOLIG(:) ! QIDRYG_boun +! +! Temperature dependance of the charge transfered + ZWQ1(:,3) = ZWQ1(:,3) * (ZZT(:) - XQTC) / ABS(ZZT(:) - XQTC) + ZWQ1(:,3) = ZWQ1(:,3) / ZRHODREF(:) + END WHERE + END IF +! +! +!* 2.2 Gardiner et al. (1985) +! + IF (CNI_CHARGING == 'GARDI') THEN + ZWQ1(:,3) = 0. +! + WHERE (GELEC(:,2) .AND. ZRIS(:) > ZRSMIN_ELEC(4) .AND. & + ZRGS(:) > ZRSMIN_ELEC(6) .AND. ZDELTALWC(:) > 0.) + ZWQ1(:,3) = XFQIDRYGBG * XLBQIDRYGBG * (1 - ZCOLIG) * & + ZRHODREF(:)**(-4. * XCEXVT + 4. / XBI) * & + ZCIT(:)**(1 - 4. / XBI) * & + ZDELTALWC(:) * ZFT(:) * & + ZLBDAG(:)**(XCXG - 2. - 4. * XDG) * & + (XAI * MOMG(XALPHAI, XNUI, XBI) / & + ZRIT(:))**(-4 / XBI) +! +! Dq limited to XLIM_NI_IG + ZLIMIT(:) = XLIM_NI_IG * ZZW1(:,2) * ZCIT(:) * (1 - ZCOLIG(:)) / & + (ZRIT(:) * ZCOLIG(:)) + ZWQ1(:,3) = SIGN( MIN( ABS(ZLIMIT(:)), ABS(ZWQ1(:,3)) ), ZWQ1(:,3) ) + ZWQ1(:,3) = ZWQ1(:,3) / ZRHODREF(:) + ENDWHERE +! +! For temperatures lower than -30C --> linear interpolation +! + WHERE (ZWQ1(:,3) /= 0. .AND. ZZT(:) < (XTT-30.) .AND. ZZT(:) >= (XTT-40.)) + ZWQ1(:,3) = ZWQ1(:,3) * (ZZT(:) - XTT + 40.) / 10. + ENDWHERE +! + END IF +! +! +!* 2.3 Charging process based on EW: SAUN1/SAUN2, TEEWC +!* following Saunders et al. (1991), Takahashi via Tsenova and Mitzeva(2009) +! + IF (CNI_CHARGING == 'SAUN1' .OR. CNI_CHARGING == 'SAUN2' .OR. & + CNI_CHARGING == 'TEEWC') THEN + ZWQ1(:,3) = 0. +! + WHERE (GELEC(:,2) .AND. ZRIS(:) > ZRSMIN_ELEC(4) .AND. & + ZRGS(:) > ZRSMIN_ELEC(6) .AND. ZDQLWC(:) /= 0.) + ZWQ1(:,3) = XFQIDRYGBS * (1. - ZCOLIG(:)) * & + ZRHOCOR(:)**(1. + ZSAUNIN(:)) * & + ZFQIDRYGBS(:) * ZDQLWC(:) * & + ZCIT(:)**(1. - ZSAUNIM(:) / XBI) * & + ZLBDAG(:)**(XCXG - 2. - XDG * (1. + ZSAUNIN(:))) * & + (ZRHODREF(:) * ZRIT(:)/XAIGAMMABI)**(ZSAUNIM(:) / XBI) +! +! Dq is limited to XLIM_NI_IG + ZLIMIT(:) = XLIM_NI_IG * ZZW1(:,2) * ZCIT(:) * (1 - ZCOLIG(:)) / & + (ZRIT(:) * ZCOLIG(:)) + ZWQ1(:,3) = SIGN( MIN( ABS(ZLIMIT(:)), ABS(ZWQ1(:,3)) ), ZWQ1(:,3) ) + ZWQ1(:,3) = ZWQ1(:,3) / ZRHODREF(:) + ENDWHERE +! +! For temperatures lower than -30C --> linear interpolation + WHERE (ZWQ1(:,3) /= 0. .AND. ZZT(:) < (XTT-30.) .AND. ZZT(:) >= (XTT-40.)) + ZWQ1(:,3) = ZWQ1(:,3) * (ZZT(:) - XTT + 40.) / 10. + ENDWHERE +! + END IF +! +! +!* 2.4 Charging process based on RAR (=EW*V): SAP98, BSMP1/BSMP2, TERAR +!* following Saunders and Peck (1998) or +!* Brooks et al., 1997 (with/out anomalies) or +!* Takahashi via Tsenova and Mitzeva (2011) +! + IF (CNI_CHARGING == 'SAP98' .OR. CNI_CHARGING == 'BSMP1' .OR. & + CNI_CHARGING == 'BSMP2' .OR. CNI_CHARGING == 'TERAR') THEN +! + IF (CNI_CHARGING /= 'TERAR') THEN + ZFQIDRYGBS(:) = XFQIDRYGBSP + WHERE (ZDQRAR_IG(:) < 0.) + ZFQIDRYGBS(:) = XFQIDRYGBSN + ENDWHERE + ELSE + ZFQIDRYGBS(:) = XFQIDRYGBSP_TAK + WHERE (ZDQRAR_IG(:) <0.) + ZFQIDRYGBS(:) = XFQIDRYGBSN_TAK + ENDWHERE + END IF +! + ZWQ1(:,3) = 0. +! + WHERE (GELEC(:,2) .AND. ZDQRAR_IG(:) /= 0. .AND. & + ZRIS(:) > ZRSMIN_ELEC(4) .AND. ZRGS(:) > ZRSMIN_ELEC(6)) + ZWQ1(:,3) = XFQIDRYGBS * (1. - ZCOLIG(:)) * & + ZRHOCOR(:)**(1 + ZSAUNIN_IG(:)) * & + ZFQIDRYGBS(:) * ZDQRAR_IG(:) * & + ZCIT(:)**(1 - ZSAUNIM_IG(:) / XBI) * & + ZLBDAG(:)**(XCXG - 2. - XDG * (1. + ZSAUNIN_IG(:))) * & + (ZRHODREF(:) * ZRIT(:)/XAIGAMMABI)**(ZSAUNIM_IG(:) / XBI) +! +! Dq is limited to XLIM_NI_IG + ZLIMIT(:) = XLIM_NI_IG * ZZW1(:,2) * ZCIT(:) * (1 - ZCOLIG(:)) / & + (ZRIT(:) * ZCOLIG(:)) + ZWQ1(:,3) = SIGN( MIN( ABS(ZLIMIT(:)), ABS(ZWQ1(:,3)) ), ZWQ1(:,3) ) + ZWQ1(:,3) = ZWQ1(:,3) / ZRHODREF(:) + ENDWHERE +! +! For temperatures lower than -30C --> linear interpolation + WHERE (ZWQ1(:,3) /= 0. .AND. ZZT(:) < (XTT-30.) .AND. ZZT(:) >= (XTT-40.)) + ZWQ1(:,3) = ZWQ1(:,3) * (ZZT(:) - XTT + 40.) / 10. + ENDWHERE + END IF +! +! +!* 2.5 Takahashi (1978) +! + IF (CNI_CHARGING == 'TAKAH') THEN + ZWQ1(:,3) = 0. + ZLIMIT(:) = 0. +! + WHERE (GELEC(:,2) .AND. ZRIS(:) > ZRSMIN_ELEC(4) .AND. & + ZRGS(:) > ZRSMIN_ELEC(6) .AND. ZDQLWC(:) /= 0.) + ZWQ1(:,3) = XFQIDRYGBT1 * (1. - ZCOLIG(:)) * ZRHOCOR(:) * & + ZCIT(:) * ZLBDAG(:)**XCXG * ZDQLWC(:) * & + MIN( XFQIDRYGBT2 / (ZLBDAG(:)**(2. + XDG)), & + XFQIDRYGBT3 * ZRHOCOR(:) * ZRHODREF(:)**(2./XBI) * & + ZRIT(:)**(2. / XBI) / (ZCIT(:)**(2. / XBI) * & + ZLBDAG(:)**(2. + 2. * XDG)) ) +! +! Dq is limited to XLIM_NI_IG + ZLIMIT(:) = XLIM_NI_IG * ZZW1(:,2) * ZCIT(:) * (1 - ZCOLIG(:)) / & + (ZRIT(:) * ZCOLIG(:)) + ZWQ1(:,3) = SIGN( MIN( ABS(ZLIMIT(:)), ABS(ZWQ1(:,3)) ), ZWQ1(:,3) ) + ZWQ1(:,3) = ZWQ1(:,3) / ZRHODREF(:) + ENDWHERE +! +! For temperatures lower than -30C --> linear interpolation + WHERE (ZWQ1(:,3) /= 0. .AND. ZZT(:) < (XTT-30.) .AND. ZZT(:) >= (XTT-40.)) + ZWQ1(:,3) = ZWQ1(:,3) * (ZZT(:) - XTT + 40.) / 10. + ENDWHERE + END IF +! +! +END SUBROUTINE ELEC_IDRYG_B +! +!------------------------------------------------------------------------------- +! + SUBROUTINE ELEC_SDRYG_B() +! +! Purpose : compute the charge separation during the dry collision +! between snow and graupeln +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +! +!* 1. COMPUTE THE COLLECTION EFFICIENCY +! --------------------------------- +! + ZCOLSG(:) = XCOLSG * EXP (XCOLEXSG * (ZZT(:) - XTT)) +! +!* 2. COMPUTE THE CHARGE SEPARATION DURING SDRYG_BOUN +! ----------------------------------------------- +! +!* 2.1 Helsdon and Farley (1987) +! + IF (CNI_CHARGING == 'HELFA') THEN + ZWQ1(:,5) = 0. +! + WHERE (ZRGT(:) > XRTMIN_ELEC(6) .AND. ZRST(:) > XRTMIN_ELEC(5) .AND. & + ZRGS(:) > ZRSMIN_ELEC(6) .AND. ZRSS(:) > ZRSMIN_ELEC(5) .AND. & + ZLBDAS(:) > 0. .AND. ZLBDAG(:) > 0.) + ZWQ1(:,5) = ZWQ1(:,10) * XFQSDRYGBH * ZRHODREF(:)**(-XCEXVT) * & + (1. - ZCOLSG(:)) * & + ZLBDAS(:)**(XCXS) * ZLBDAG(:)**(XCXG) * & + (XLBQSDRYGB4H * ZLBDAS(:)**(-2.) + & + XLBQSDRYGB5H * ZLBDAS(:)**(-1.) * ZLBDAG(:)**(-1.) + & + XLBQSDRYGB6H * ZLBDAG(:)**(-2.)) +! +! Temperature dependance of the charge transfered + ZWQ1(:,5) = ZWQ1(:,5) * (ZZT(:) - XQTC) / ABS(ZZT(:) - XQTC) + ZWQ1(:,5) = ZWQ1(:,5) / ZRHODREF(:) + ENDWHERE + ENDIF +! +! +!* 2.2 Gardiner et al. (1985) +! + IF (CNI_CHARGING == 'GARDI') THEN + ZWQ1(:,5) = 0. + ZLIMIT(:) = 0. +! + WHERE (GELEC(:,3) .AND. ZRGS(:) > ZRSMIN_ELEC(6) .AND. & + ZRSS(:) > ZRSMIN_ELEC(5) .AND. ZDELTALWC(:) > 0.) + ZWQ1(:,5) = XFQSDRYGBG * (1. - ZCOLSG(:)) * & + ZRHODREF(:)**(-4. * XCEXVT) * & + ZFT(:) * ZDELTALWC(:) * & + ZLBDAG(:)**XCXG * ZLBDAS(:)**XCXS * & + (XLBQSDRYGB4G * ZLBDAS(:)**(-4.) * ZLBDAG(:)**(-2.) + & + XLBQSDRYGB5G * ZLBDAS(:)**(-5.) * ZLBDAG(:)**(-1.) + & + XLBQSDRYGB6G * ZLBDAS(:)**(-6.)) * & + ZWQ1(:,10) +! +! Dq is limited to XLIM_NI_SG + ZLIMIT(:) = XLIM_NI_SG * ZAUX1(:) * XAUX_LIM * & + ZRHOCOR(:) * (1. - ZCOLSG(:)) * & + ZLBDAS(:)**(XCXS) * ZLBDAG(:)**(XCXG) * & + (XAUX_LIM1 * ZLBDAS(:)**(-2.) + & + XAUX_LIM2 * ZLBDAS(:)**(-1.) * ZLBDAG(:)**(-1.) + & + XAUX_LIM3 * ZLBDAG(:)**(-2.)) + ZWQ1(:,5) = SIGN( MIN( ABS(ZLIMIT(:)), ABS(ZWQ1(:,5)) ), ZWQ1(:,5)) + ZWQ1(:,5) = ZWQ1(:,5) / ZRHODREF(:) + ENDWHERE +! +! For temperatures lower than -30C --> linear interpolation + WHERE (ZWQ1(:,5) /= 0. .AND. ZZT(:) < (XTT-30.) .AND. ZZT(:) >= (XTT-40.)) + ZWQ1(:,5) = ZWQ1(:,5) * (ZZT(:) - XTT + 40.) / 10. + ENDWHERE + END IF +! +!* 2.3 Charging process based on EW: SAUN1/SAUN2, TEEWC +!* following Saunders et al. (1991), Takahashi via Tsenova and Mitzeva(2009) +! + IF (CNI_CHARGING == 'SAUN1' .OR. CNI_CHARGING == 'SAUN2' .OR. & + CNI_CHARGING == 'TEEWC') THEN +! + ZWQ1(:,5) = 0. + ZLIMIT(:) = 0. +! + WHERE (GELEC(:,3) .AND. ZRGS(:) > ZRSMIN_ELEC(6) .AND. & + ZRSS(:) > ZRSMIN_ELEC(5) .AND. ZDQLWC(:) /= 0.) +! +! ZWQ1(:,5) = ZWQ3(:) If graupel gains positive charge ZDQLWC(:) > 0. +! ZWQ1(:,5) = ZWQ4(:) If graupel gains negative charge ZDQLWC(:) < 0. + ZWQ1(:,5) = ZWQ3(:) * (0.5 + SIGN(0.5,ZDQLWC(:))) + & + ZWQ4(:) * (0.5 - SIGN(0.5,ZDQLWC(:))) +! + ZWQ1(:,5) = ZWQ1(:,5) * XFQSDRYGBS * (1. - ZCOLSG(:)) * & + ZRHOCOR(:)**(1. + ZSAUNSN(:)) * & + ZSAUNSK(:) * ZDQLWC(:) * & + ZLBDAG(:)**XCXG * ZLBDAS(:)**XCXS * & + ( ZLBQSDRYGB1S(:) / (ZLBDAS(:)**ZSAUNSM(:) *ZLBDAG(:)**2) + & + ZLBQSDRYGB2S(:) / (ZLBDAS(:)**( 1.+ZSAUNSM(:))*ZLBDAG(:)) + & + ZLBQSDRYGB3S(:) / ZLBDAS(:)**(2.+ZSAUNSM(:)) ) +! +! Dq is limited to XLIM_NI_SG + ZLIMIT(:) = XLIM_NI_SG * ZAUX1(:) * XAUX_LIM * & + ZRHOCOR(:) * (1. - ZCOLSG(:)) * & + ZLBDAS(:)**(XCXS) * ZLBDAG(:)**(XCXG) * & + ( XAUX_LIM1 / ZLBDAS(:)**2 + & + XAUX_LIM2 /(ZLBDAS(:) * ZLBDAG(:)) + & + XAUX_LIM3 / ZLBDAG(:)**2 ) + ZWQ1(:,5) = SIGN( MIN( ABS(ZLIMIT(:)), ABS(ZWQ1(:,5)) ), ZWQ1(:,5)) + ZWQ1(:,5) = ZWQ1(:,5) / ZRHODREF(:) + ENDWHERE +! +! For temperatures lower than -30C --> linear interpolation + WHERE (ZWQ1(:,5) /= 0. .AND. ZZT(:) < (XTT-30.) .AND. ZZT(:) >= (XTT-40.)) + ZWQ1(:,5) = ZWQ1(:,5) * (ZZT(:) - XTT + 40.) / 10. + ENDWHERE +! + END IF +! +! +!* 2.4 Charging process based on RAR (=EW*V): SAP98, BSMP1/BSMP2, TERAR +!* following Saunders and Peck (1998) or +!* Brooks et al., 1997 (with/out anomalies) or +!* Takahashi via Tsenova and Mitzeva (2011) +! + IF (CNI_CHARGING == 'SAP98' .OR. CNI_CHARGING == 'BSMP1' .OR. & + CNI_CHARGING == 'BSMP2' .OR. CNI_CHARGING == 'TERAR') THEN +! + ZLBQSDRYGB1S(:) = XLBQSDRYGB1SP + ZLBQSDRYGB2S(:) = XLBQSDRYGB2SP + ZLBQSDRYGB3S(:) = XLBQSDRYGB3SP + WHERE (ZDQRAR_SG(:) < 0.) + ZLBQSDRYGB1S(:) = XLBQSDRYGB1SN + ZLBQSDRYGB2S(:) = XLBQSDRYGB2SN + ZLBQSDRYGB3S(:) = XLBQSDRYGB3SN + ENDWHERE +! + ZWQ1(:,5) = 0. + ZLIMIT(:) = 0. +! + WHERE (GELEC(:,3) .AND. ZDQRAR_SG(:) /= 0. .AND. & + ZRGS(:) > ZRSMIN_ELEC(6) .AND. ZRSS(:) > ZRSMIN_ELEC(5)) + ZWQ1(:,5) = ZWQ3(:) * (0.5+SIGN(0.5,ZDQRAR_SG(:))) + & + ZWQ4(:) * (0.5-SIGN(0.5,ZDQRAR_SG(:))) +! + ZWQ1(:,5) = ZWQ1(:,5) * XFQSDRYGBS * (1. - ZCOLSG(:)) * & + ZRHOCOR(:)**(1. + ZSAUNSN_SG(:)) * & + ZSAUNSK_SG(:) * ZDQRAR_SG(:) * & + ZLBDAG(:)**XCXG * ZLBDAS(:)**XCXS * & + (ZLBQSDRYGB1S(:)/(ZLBDAS(:)**ZSAUNSM_SG(:) * ZLBDAG(:)**2) + & + ZLBQSDRYGB2S(:)/(ZLBDAS(:)**(1.+ZSAUNSM_SG(:))*ZLBDAG(:)) + & + ZLBQSDRYGB3S(:)/ ZLBDAS(:)**(2.+ZSAUNSM_SG(:)) ) +! +! +! Dq is limited to XLIM_NI_SG + ZLIMIT(:) = XLIM_NI_SG * ZAUX1(:) * XAUX_LIM * & + ZRHOCOR(:) * (1. - ZCOLSG(:)) * & + ZLBDAS(:)**(XCXS) * ZLBDAG(:)**(XCXG) * & + ( XAUX_LIM1 / ZLBDAS(:)**2 + & + XAUX_LIM2 /(ZLBDAS(:) * ZLBDAG(:)) + & + XAUX_LIM3 / ZLBDAG(:)**2 ) + ZWQ1(:,5) = SIGN( MIN( ABS(ZLIMIT(:)), ABS(ZWQ1(:,5)) ), ZWQ1(:,5)) + ZWQ1(:,5) = ZWQ1(:,5) / ZRHODREF(:) + ENDWHERE +! +! For temperature lower than -30C --> linear interpolation + WHERE (ZWQ1(:,5) /= 0. .AND. ZZT(:) < (XTT-30.) .AND. ZZT(:) >= (XTT-40.)) + ZWQ1(:,5) = ZWQ1(:,5) * (ZZT(:) - XTT + 40.) / 10. + ENDWHERE + END IF +! +! +!* 2.5 Takahashi (1978) +! + IF (CNI_CHARGING == 'TAKAH') THEN + ZWQ1(:,5) = 0. + ZLIMIT(:) = 0. +! + WHERE (GELEC(:,3) .AND. ZRGS(:) > ZRSMIN_ELEC(6) .AND. & + ZRSS(:) > ZRSMIN_ELEC(5) .AND. ZDQLWC(:) /= 0.) + ZWQ1(:,5) = XFQSDRYGBT1 * (1. - ZCOLSG(:)) * ZRHOCOR(:) * & + ZLBDAG(:)**XCXG * ZLBDAS(:)**XCXS * ZDQLWC(:) * & + MIN(10. * ( & + ABS(XFQSDRYGBT2 / (ZLBDAG(:)**XDG * ZLBDAS(:)**2.) - & + XFQSDRYGBT3 / (ZLBDAS(:)**(2. + XDS))) + & + ABS(XFQSDRYGBT4 / (ZLBDAG(:)**(2.+XDG)) - & + XFQSDRYGBT5 / (ZLBDAS(:)**XDS * ZLBDAG(:)**2.)) + & + ABS(XFQSDRYGBT6 / (ZLBDAG(:)**(1. + XDG) * ZLBDAS(:)) - & + XFQSDRYGBT7 / (ZLBDAS(:)**(1. + XDS) * ZLBDAG(:)))), & + XFQSDRYGBT8 * ZRHOCOR(:) * ZWQ1(:,10) * & + (XFQSDRYGBT9 / (ZLBDAS(:)**2. * ZLBDAG(:)**2.) + & + XFQSDRYGBT10 / (ZLBDAS(:)**4.) + & + XFQSDRYGBT11 / (ZLBDAS(:)**3. * ZLBDAG(:)))) +! +! Dq is limited to XLIM_NI_SG + ZLIMIT(:) = XLIM_NI_SG * ZAUX1(:) * XAUX_LIM * & + ZRHOCOR(:) * (1. - ZCOLSG(:)) * & + ZLBDAS(:)**(XCXS) * ZLBDAG(:)**(XCXG) * & + ( XAUX_LIM1 / ZLBDAS(:)**2 + & + XAUX_LIM2 /(ZLBDAS(:) * ZLBDAG(:)) + & + XAUX_LIM3 / ZLBDAG(:)**2 ) + ZWQ1(:,5) = SIGN( MIN( ABS(ZLIMIT(:)), ABS(ZWQ1(:,5)) ), ZWQ1(:,5)) + ZWQ1(:,5) = ZWQ1(:,5) / ZRHODREF(:) + ENDWHERE +! +! For temperature lower than -30C --> linear interpolation + WHERE (ZWQ1(:,5) /= 0. .AND. ZZT(:) < (XTT-30.) .AND. ZZT(:) >= (XTT-40.)) + ZWQ1(:,5) = ZWQ1(:,5) * (ZZT(:) - XTT + 40.) / 10. + ENDWHERE + END IF +! +! +END SUBROUTINE ELEC_SDRYG_B +! +!------------------------------------------------------------------------------ +! + SUBROUTINE INDUCTIVE_PROCESS +! +! Computation of the charge transfer rate during inductive mechanism +! Only the bouncing droplet-graupel collision when the graupel is in the dry +! growth mode is considered +! The electric field is limited to 100 kV/m +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +! +!* 1. COMPUTE THE CHARGING RATE +! ------------------------- +! + ZRATE_IND(:) = 0. +! + WHERE (GIND(:) .AND. & + ZEFIELDW(:) /= 0. .AND. ABS(ZEGS(:)) > XEGMIN .AND. & + ZLBDAG(:) > 0. .AND. & + ZRGT(:) > XRTMIN_ELEC(6) .AND. ZRGS(:) > ZRSMIN_ELEC(6) .AND. & + ZRCT(:) > XRTMIN_ELEC(2) .AND. ZRCS(:) > ZRSMIN_ELEC(2)) + ZRATE_IND(:) = XIND1 * ZLBDAG(:)**XCXG * ZRHOCOR(:) * & + (XIND2 * SIGN(MIN(100.E3, ABS(ZEFIELDW(:))), ZEFIELDW(:)) * & + ZLBDAG(:) **(-2.-XDG) - & + XIND3 * ZEGS(:) * ZLBDAG(:)**(-XFG-XDG)) + ZRATE_IND(:) = ZRATE_IND(:) / ZRHODREF(:) + ZQGS(:) = ZQGS(:) + ZRATE_IND(:) + ZQCS(:) = ZQCS(:) - ZRATE_IND(:) + END WHERE +! +END SUBROUTINE INDUCTIVE_PROCESS +! +!------------------------------------------------------------------------------ +! +! + FUNCTION BI_LIN_INTP_V(ZT, KI, KJ, PDX, PDY, KN) RESULT(Y) +! +! | | +! ZT(KI(1),KJ(2))-|-------------------|-ZT(KI(2),KJ(2)) +! | | +! | | +! x2-|-------|y(x1,x2) | +! | | | +! PDY| | | +! | | | +! | | | +!ZT( KI(1),KJ(1))-|-------------------|-ZT(KI(2),KJ(1)) +! | PDX |x1 | +! | | +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +!* 0.2 Declaration of local variables +! +INTEGER :: KN ! Size of the result vector +INTEGER, DIMENSION(KN) :: KI ! Tabulated coordinate +INTEGER, DIMENSION(KN) :: KJ ! Tabulated coordinate +REAL, INTENT(IN), DIMENSION(:,:) :: ZT ! Tabulated data +REAL, INTENT(IN), DIMENSION(KN) :: PDX, PDY ! +REAL, DIMENSION(KN) :: Y ! Interpolated value +! +INTEGER :: JJ ! Loop index +! +!* 1. INTERPOLATION +! ------------- +! +DO JJ = 1, KN + Y(JJ) = (1.0 - PDX(JJ)) * (1.0 - PDY(JJ)) * ZT(KI(JJ), KJ(JJ)) + & + PDX(JJ) * (1.0 - PDY(JJ)) * ZT(KI(JJ)+1,KJ(JJ)) + & + PDX(JJ) * PDY(JJ) * ZT(KI(JJ)+1,KJ(JJ)+1) + & + (1.0 - PDX(JJ)) * PDY(JJ) * ZT(KI(JJ) ,KJ(JJ)+1) +ENDDO +! +END FUNCTION BI_LIN_INTP_V +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE RAIN_ICE_ELEC diff --git a/src/mesonh/micro/rain_ice_fast_rg.f90 b/src/mesonh/micro/rain_ice_fast_rg.f90 new file mode 100644 index 000000000..c3366b66a --- /dev/null +++ b/src/mesonh/micro/rain_ice_fast_rg.f90 @@ -0,0 +1,455 @@ +!MNH_LIC Copyright 1995-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! Modifications: +! P. Wautelet 25/02/2019: split rain_ice (cleaner and easier to maintain/debug) +! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! P. Wautelet 03/06/2019: remove PACK/UNPACK intrinsics (to get more performance and better OpenACC support) +! P. Wautelet 05/06/2019: optimisations +! P. Wautelet 02/2020: use the new data structures and subroutines for budgets +!----------------------------------------------------------------- +MODULE MODE_RAIN_ICE_FAST_RG + + IMPLICIT NONE + + PRIVATE + + PUBLIC :: RAIN_ICE_FAST_RG + +CONTAINS + +SUBROUTINE RAIN_ICE_FAST_RG(KRR, OMICRO, PRHODREF, PRVT, PRCT, PRRT, PRIT, PRST, PRGT, PCIT, & + PRHODJ, PPRES, PZT, PLBDAR, PLBDAS, PLBDAG, PLSFACT, PLVFACT, & + PCJ, PKA, PDV, & + PRCS, PRRS, PRIS, PRSS, PRGS, PRHS, PTHS, & + PUSW, PRDRYG, PRWETG) + +! +!* 0. DECLARATIONS +! ------------ +! +use modd_budget, only: lbudget_th, lbudget_rc, lbudget_rr, lbudget_ri, lbudget_rs, lbudget_rg, lbudget_rh, & + NBUDGET_TH, NBUDGET_RC, NBUDGET_RR, NBUDGET_RI, NBUDGET_RS, NBUDGET_RG, NBUDGET_RH, & + tbudgets +use MODD_CST, only: XCI, XCL, XCPV, XESTT, XLMTT, XLVTT, XMD, XMV, XRV, XTT +use MODD_RAIN_ICE_DESCR, only: XBS, XCEXVT, XCXG, XCXS, XDG, XRTMIN +use MODD_RAIN_ICE_PARAM, only: NDRYLBDAG, NDRYLBDAR, NDRYLBDAS, X0DEPG, X1DEPG, XCOLEXIG, XCOLEXSG, XCOLIG, XCOLSG, XDRYINTP1G, & + XDRYINTP1R, XDRYINTP1S, XDRYINTP2G, XDRYINTP2R, XDRYINTP2S, XEX0DEPG, XEX1DEPG, XEXICFRR, & + XEXRCFRI, XFCDRYG, XFIDRYG, XFRDRYG, XFSDRYG, XICFRR, XKER_RDRYG, XKER_SDRYG, XLBRDRYG1, & + XLBRDRYG2, XLBRDRYG3, XLBSDRYG1, XLBSDRYG2, XLBSDRYG3, XRCFRI + +use mode_budget, only: Budget_store_add, Budget_store_end, Budget_store_init + +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +INTEGER, INTENT(IN) :: KRR ! Number of moist variables +LOGICAL, DIMENSION(:,:,:), intent(in) :: OMICRO ! Test where to compute all processes +REAL, DIMENSION(:), intent(in) :: PRHODREF ! RHO Dry REFerence +REAL, DIMENSION(:), intent(in) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:), intent(in) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:), intent(in) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:), intent(in) :: PRIT ! Pristine ice m.r. at t +REAL, DIMENSION(:), intent(in) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:), intent(in) :: PRGT ! Graupel m.r. at t +REAL, DIMENSION(:), intent(in) :: PCIT ! Pristine ice conc. at t +REAL, DIMENSION(:), intent(in) :: PRHODJ ! RHO times Jacobian +REAL, DIMENSION(:), intent(in) :: PPRES ! Pressure +REAL, DIMENSION(:), intent(in) :: PZT ! Temperature +REAL, DIMENSION(:), intent(in) :: PLBDAR ! Slope parameter of the raindrop distribution +REAL, DIMENSION(:), intent(in) :: PLBDAS ! Slope parameter of the aggregate distribution +REAL, DIMENSION(:), intent(in) :: PLBDAG ! Slope parameter of the graupel distribution +REAL, DIMENSION(:), intent(in) :: PLSFACT ! L_s/(Pi_ref*C_ph) +REAL, DIMENSION(:), intent(in) :: PLVFACT ! L_v/(Pi_ref*C_ph) +REAL, DIMENSION(:), intent(in) :: PCJ ! Function to compute the ventilation coefficient +REAL, DIMENSION(:), intent(in) :: PKA ! Thermal conductivity of the air +REAL, DIMENSION(:), intent(in) :: PDV ! Diffusivity of water vapor in the air +REAL, DIMENSION(:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: PRRS ! Rain water m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: PRSS ! Snow/aggregate m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: PRGS ! Graupel m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: PRHS ! Hail m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:), intent(inout) :: PUSW ! Undersaturation over water +REAL, DIMENSION(:), intent(out) :: PRDRYG ! Dry growth rate of the graupeln +REAL, DIMENSION(:), intent(out) :: PRWETG ! Wet growth rate of the graupeln +! +!* 0.2 declaration of local variables +! +INTEGER :: IGDRY +INTEGER :: JJ, JL +INTEGER, DIMENSION(size(PRHODREF)) :: I1 +INTEGER, DIMENSION(:), ALLOCATABLE :: IVEC1, IVEC2 ! Vectors of indices for interpolations +REAL, DIMENSION(size(PRHODREF)) :: ZZW ! Work array +REAL, DIMENSION(:), ALLOCATABLE :: ZVEC1,ZVEC2,ZVEC3 ! Work vectors for interpolations +REAL, DIMENSION(:), ALLOCATABLE :: ZVECLBDAG, ZVECLBDAR, ZVECLBDAS +REAL, DIMENSION(size(PRHODREF),7) :: ZZW1 ! Work arrays +! +!------------------------------------------------------------------------------- +! +!* 6.1 rain contact freezing +! + ZZW1(:,:) = 0.0 + WHERE( (PRIT(:)>XRTMIN(4)) .AND. (PRRT(:)>XRTMIN(3)) .AND. & + (PRIS(:)>0.0) .AND. (PRRS(:)>0.0) ) + ZZW1(:,3) = MIN( PRIS(:),XICFRR * PRIT(:) & ! RICFRRG + * PLBDAR(:)**XEXICFRR & + * PRHODREF(:)**(-XCEXVT) ) + ZZW1(:,4) = MIN( PRRS(:),XRCFRI * PCIT(:) & ! RRCFRIG + * PLBDAR(:)**XEXRCFRI & + * PRHODREF(:)**(-XCEXVT-1.) ) + PRIS(:) = PRIS(:) - ZZW1(:,3) + PRRS(:) = PRRS(:) - ZZW1(:,4) + PRGS(:) = PRGS(:) + ZZW1(:,3)+ZZW1(:,4) + PTHS(:) = PTHS(:) + ZZW1(:,4)*(PLSFACT(:)-PLVFACT(:)) ! f(L_f*RRCFRIG) + END WHERE + + if ( lbudget_th ) call Budget_store_add( tbudgets(NBUDGET_TH), 'CFRZ', Unpack ( zzw1(:, 4) * ( plsfact(:) - plvfact(:) ) & + * prhodj(:), mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rr ) call Budget_store_add( tbudgets(NBUDGET_RR), 'CFRZ', Unpack ( -zzw1(:, 4) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_ri ) call Budget_store_add( tbudgets(NBUDGET_RI), 'CFRZ', Unpack ( -zzw1(:, 3) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rg ) call Budget_store_add( tbudgets(NBUDGET_RG), 'CFRZ', Unpack ( ( zzw1(:,3) + zzw1(:,4) ) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + +!PW:used init/end instead of add because zzw1 is produced with a where(...) and is used with other where(...) +! => can not use directly zzw1 in Budget_store_add + if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'WETG', Unpack ( pths(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'WETG', Unpack ( prcs(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rr ) call Budget_store_init( tbudgets(NBUDGET_RR), 'WETG', Unpack ( prrs(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), 'WETG', Unpack ( pris(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rs ) call Budget_store_init( tbudgets(NBUDGET_RS), 'WETG', Unpack ( prss(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rg ) call Budget_store_init( tbudgets(NBUDGET_RG), 'WETG', Unpack ( prgs(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rh ) call Budget_store_init( tbudgets(NBUDGET_RH), 'WETG', Unpack ( prhs(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) +! +!* 6.2 compute the Dry growth case +! + ZZW1(:,:) = 0.0 + WHERE( PRGT(:)>XRTMIN(6) .AND. PRCT(:)>XRTMIN(2) .AND. PRCS(:)>0.0 ) + ZZW(:) = PLBDAG(:)**(XCXG-XDG-2.0) * PRHODREF(:)**(-XCEXVT) + ZZW1(:,1) = MIN( PRCS(:),XFCDRYG * PRCT(:) * ZZW(:) ) ! RCDRYG + END WHERE + WHERE( (PRGT(:)>XRTMIN(6)) .AND. PRIT(:)>XRTMIN(4) .AND. PRIS(:)>0.0 ) + ZZW(:) = PLBDAG(:)**(XCXG-XDG-2.0) * PRHODREF(:)**(-XCEXVT) + ZZW1(:,2) = MIN( PRIS(:),XFIDRYG * EXP( XCOLEXIG*(PZT(:)-XTT) ) & + * PRIT(:) * ZZW(:) ) ! RIDRYG + END WHERE +! +!* 6.2.1 accretion of aggregates on the graupeln +! + IGDRY = 0 + DO JJ = 1, SIZE(PRST) + IF ( PRST(JJ)>XRTMIN(5) .AND. PRGT(JJ)>XRTMIN(6) .AND. PRSS(JJ)>0.0 ) THEN + IGDRY = IGDRY + 1 + I1(IGDRY) = JJ + END IF + END DO + + IF( IGDRY>0 ) THEN +! +!* 6.2.2 allocations +! + ALLOCATE(ZVECLBDAG(IGDRY)) + ALLOCATE(ZVECLBDAS(IGDRY)) + ALLOCATE(ZVEC1(IGDRY)) + ALLOCATE(ZVEC2(IGDRY)) + ALLOCATE(ZVEC3(IGDRY)) + ALLOCATE(IVEC1(IGDRY)) + ALLOCATE(IVEC2(IGDRY)) +! +!* 6.2.3 select the (PLBDAG,PLBDAS) couplet +! + ZVECLBDAG(1:IGDRY) = PLBDAG(I1(1:IGDRY)) + ZVECLBDAS(1:IGDRY) = PLBDAS(I1(1:IGDRY)) +! +!* 6.2.4 find the next lower indice for the PLBDAG and for the PLBDAS +! in the geometrical set of (Lbda_g,Lbda_s) couplet use to +! tabulate the SDRYG-kernel +! + ZVEC1(1:IGDRY) = MAX( 1.00001, MIN( REAL(NDRYLBDAG)-0.00001, & + XDRYINTP1G * LOG( ZVECLBDAG(1:IGDRY) ) + XDRYINTP2G ) ) + IVEC1(1:IGDRY) = INT( ZVEC1(1:IGDRY) ) + ZVEC1(1:IGDRY) = ZVEC1(1:IGDRY) - REAL( IVEC1(1:IGDRY) ) +! + ZVEC2(1:IGDRY) = MAX( 1.00001, MIN( REAL(NDRYLBDAS)-0.00001, & + XDRYINTP1S * LOG( ZVECLBDAS(1:IGDRY) ) + XDRYINTP2S ) ) + IVEC2(1:IGDRY) = INT( ZVEC2(1:IGDRY) ) + ZVEC2(1:IGDRY) = ZVEC2(1:IGDRY) - REAL( IVEC2(1:IGDRY) ) +! +!* 6.2.5 perform the bilinear interpolation of the normalized +! SDRYG-kernel +! + DO JJ = 1,IGDRY + ZVEC3(JJ) = ( XKER_SDRYG(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & + - XKER_SDRYG(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + * ZVEC1(JJ) & + - ( XKER_SDRYG(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & + - XKER_SDRYG(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + * (ZVEC1(JJ) - 1.0) + END DO +! + DO JJ = 1, IGDRY + JL = I1(JJ) + ZZW1(JL,3) = MIN( PRSS(JL),XFSDRYG*ZVEC3(JJ) & ! RSDRYG + * EXP( XCOLEXSG*(PZT(JL)-XTT) ) & + *( ZVECLBDAS(JJ)**(XCXS-XBS) )*( ZVECLBDAG(JJ)**XCXG ) & + *( PRHODREF(JL)**(-XCEXVT-1.) ) & + *( XLBSDRYG1/( ZVECLBDAG(JJ)**2 ) + & + XLBSDRYG2/( ZVECLBDAG(JJ) * ZVECLBDAS(JJ) ) + & + XLBSDRYG3/( ZVECLBDAS(JJ)**2) ) ) + END DO + DEALLOCATE(ZVECLBDAS) + DEALLOCATE(ZVECLBDAG) + DEALLOCATE(IVEC2) + DEALLOCATE(IVEC1) + DEALLOCATE(ZVEC3) + DEALLOCATE(ZVEC2) + DEALLOCATE(ZVEC1) + END IF +! +!* 6.2.6 accretion of raindrops on the graupeln +! + IGDRY = 0 + DO JJ = 1, SIZE(PRRT) + IF ( PRRT(JJ)>XRTMIN(3) .AND. PRGT(JJ)>XRTMIN(6) .AND. PRRS(JJ)>0.0 ) THEN + IGDRY = IGDRY + 1 + I1(IGDRY) = JJ + END IF + END DO +! + IF( IGDRY>0 ) THEN +! +!* 6.2.7 allocations +! + ALLOCATE(ZVECLBDAG(IGDRY)) + ALLOCATE(ZVECLBDAR(IGDRY)) + ALLOCATE(ZVEC1(IGDRY)) + ALLOCATE(ZVEC2(IGDRY)) + ALLOCATE(ZVEC3(IGDRY)) + ALLOCATE(IVEC1(IGDRY)) + ALLOCATE(IVEC2(IGDRY)) +! +!* 6.2.8 select the (PLBDAG,PLBDAR) couplet +! + ZVECLBDAG(1:IGDRY) = PLBDAG(I1(1:IGDRY)) + ZVECLBDAR(1:IGDRY) = PLBDAR(I1(1:IGDRY)) +! +!* 6.2.9 find the next lower indice for the PLBDAG and for the PLBDAR +! in the geometrical set of (Lbda_g,Lbda_r) couplet use to +! tabulate the RDRYG-kernel +! + ZVEC1(1:IGDRY) = MAX( 1.00001, MIN( REAL(NDRYLBDAG)-0.00001, & + XDRYINTP1G * LOG( ZVECLBDAG(1:IGDRY) ) + XDRYINTP2G ) ) + IVEC1(1:IGDRY) = INT( ZVEC1(1:IGDRY) ) + ZVEC1(1:IGDRY) = ZVEC1(1:IGDRY) - REAL( IVEC1(1:IGDRY) ) +! + ZVEC2(1:IGDRY) = MAX( 1.00001, MIN( REAL(NDRYLBDAR)-0.00001, & + XDRYINTP1R * LOG( ZVECLBDAR(1:IGDRY) ) + XDRYINTP2R ) ) + IVEC2(1:IGDRY) = INT( ZVEC2(1:IGDRY) ) + ZVEC2(1:IGDRY) = ZVEC2(1:IGDRY) - REAL( IVEC2(1:IGDRY) ) +! +!* 6.2.10 perform the bilinear interpolation of the normalized +! RDRYG-kernel +! + DO JJ = 1,IGDRY + ZVEC3(JJ) = ( XKER_RDRYG(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & + - XKER_RDRYG(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + * ZVEC1(JJ) & + - ( XKER_RDRYG(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & + - XKER_RDRYG(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + * (ZVEC1(JJ) - 1.0) + END DO +! + DO JJ = 1, IGDRY + JL = I1(JJ) + ZZW1(JL,4) = MIN( PRRS(JL),XFRDRYG*ZVEC3(JJ) & ! RRDRYG + *( ZVECLBDAR(JJ)**(-4) )*( ZVECLBDAG(JJ)**XCXG ) & + *( PRHODREF(JL)**(-XCEXVT-1.) ) & + *( XLBRDRYG1/( ZVECLBDAG(JJ)**2 ) + & + XLBRDRYG2/( ZVECLBDAG(JJ) * ZVECLBDAR(JJ) ) + & + XLBRDRYG3/( ZVECLBDAR(JJ)**2) ) ) + END DO + DEALLOCATE(ZVECLBDAR) + DEALLOCATE(ZVECLBDAG) + DEALLOCATE(IVEC2) + DEALLOCATE(IVEC1) + DEALLOCATE(ZVEC3) + DEALLOCATE(ZVEC2) + DEALLOCATE(ZVEC1) + END IF +! + PRDRYG(:) = ZZW1(:,1) + ZZW1(:,2) + ZZW1(:,3) + ZZW1(:,4) +! +!* 6.3 compute the Wet growth case +! + PRWETG(:) = 0.0 + WHERE( PRGT(:)>XRTMIN(6) ) + ZZW1(:,5) = MIN( PRIS(:), & + ZZW1(:,2) / (XCOLIG*EXP(XCOLEXIG*(PZT(:)-XTT)) ) ) ! RIWETG + ZZW1(:,6) = MIN( PRSS(:), & + ZZW1(:,3) / (XCOLSG*EXP(XCOLEXSG*(PZT(:)-XTT)) ) ) ! RSWETG +! + ZZW(:) = PRVT(:)*PPRES(:)/((XMV/XMD)+PRVT(:)) ! Vapor pressure + ZZW(:) = PKA(:)*(XTT-PZT(:)) + & + ( PDV(:)*(XLVTT + ( XCPV - XCL ) * ( PZT(:) - XTT )) & + *(XESTT-ZZW(:))/(XRV*PZT(:)) ) +! +! compute RWETG +! + PRWETG(:)=MAX( 0.0, & + ( ZZW(:) * ( X0DEPG* PLBDAG(:)**XEX0DEPG + & + X1DEPG*PCJ(:)*PLBDAG(:)**XEX1DEPG ) + & + ( ZZW1(:,5)+ZZW1(:,6) ) * & + ( PRHODREF(:)*(XLMTT+(XCI-XCL)*(XTT-PZT(:))) ) ) / & + ( PRHODREF(:)*(XLMTT-XCL*(XTT-PZT(:))) ) ) + END WHERE +! +!* 6.4 Select Wet or Dry case +! + IF ( KRR == 7 ) THEN + WHERE( PRGT(:)>XRTMIN(6) .AND. PZT(:)<XTT & + .AND. & ! Wet + PRDRYG(:)>=PRWETG(:) .AND. PRWETG(:)>0.0 ) ! case + ZZW(:) = PRWETG(:) - ZZW1(:,5) - ZZW1(:,6) ! RCWETG+RRWETG +! +! limitation of the available rainwater mixing ratio (RRWETH < RRS !) +! + ZZW1(:,7) = MAX( 0.0,MIN( ZZW(:),PRRS(:)+ZZW1(:,1) ) ) + PUSW(:) = ZZW1(:,7) / ZZW(:) + ZZW1(:,5) = ZZW1(:,5)*PUSW(:) + ZZW1(:,6) = ZZW1(:,6)*PUSW(:) + PRWETG(:) = ZZW1(:,7) + ZZW1(:,5) + ZZW1(:,6) +! + PRCS(:) = PRCS(:) - ZZW1(:,1) + PRIS(:) = PRIS(:) - ZZW1(:,5) + PRSS(:) = PRSS(:) - ZZW1(:,6) +! +! assume a linear percent of conversion of graupel into hail +! + PRGS(:) = PRGS(:) + PRWETG(:) ! Wet growth + ZZW(:) = PRGS(:)*PRDRYG(:)/(PRWETG(:)+PRDRYG(:)) ! and + PRGS(:) = PRGS(:) - ZZW(:) ! partial conversion + PRHS(:) = PRHS(:) + ZZW(:) ! of the graupel into hail +! + PRRS(:) = MAX( 0.0,PRRS(:) - ZZW1(:,7) + ZZW1(:,1) ) + PTHS(:) = PTHS(:) + ZZW1(:,7)*(PLSFACT(:)-PLVFACT(:)) + ! f(L_f*(RCWETG+RRWETG)) + END WHERE + ELSE IF( KRR == 6 ) THEN + WHERE( PRGT(:)>XRTMIN(6) .AND. PZT(:)<XTT & + .AND. & ! Wet + PRDRYG(:)>=PRWETG(:) .AND. PRWETG(:)>0.0 ) ! case + PRCS(:) = PRCS(:) - ZZW1(:,1) + PRIS(:) = PRIS(:) - ZZW1(:,5) + PRSS(:) = PRSS(:) - ZZW1(:,6) + PRGS(:) = PRGS(:) + PRWETG(:) +! + PRRS(:) = PRRS(:) - PRWETG(:) + ZZW1(:,5) + ZZW1(:,6) + ZZW1(:,1) + PTHS(:) = PTHS(:) + (PRWETG(:)-ZZW1(:,5)-ZZW1(:,6))*(PLSFACT(:)-PLVFACT(:)) + ! f(L_f*(RCWETG+RRWETG)) + END WHERE + END IF + + if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'WETG', Unpack ( pths(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'WETG', Unpack ( prcs(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rr ) call Budget_store_end( tbudgets(NBUDGET_RR), 'WETG', Unpack ( prrs(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'WETG', Unpack ( pris(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rs ) call Budget_store_end( tbudgets(NBUDGET_RS), 'WETG', Unpack ( prss(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rg ) call Budget_store_end( tbudgets(NBUDGET_RG), 'WETG', Unpack ( prgs(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rh ) call Budget_store_end( tbudgets(NBUDGET_RH), 'WETG', Unpack ( prhs(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + +!PW:used init/end instead of add because zzw1 is produced with a where(...) and is used with other where(...) +! => can not use directly zzw1 in Budget_store_add + if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'DRYG', Unpack ( pths(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'DRYG', Unpack ( prcs(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rr ) call Budget_store_init( tbudgets(NBUDGET_RR), 'DRYG', Unpack ( prrs(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), 'DRYG', Unpack ( pris(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rs ) call Budget_store_init( tbudgets(NBUDGET_RS), 'DRYG', Unpack ( prss(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rg ) call Budget_store_init( tbudgets(NBUDGET_RG), 'DRYG', Unpack ( prgs(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + + WHERE( PRGT(:)>XRTMIN(6) .AND. PZT(:)<XTT & + .AND. & + PRDRYG(:)<PRWETG(:) .AND. PRDRYG(:)>0.0 ) ! Dry + PRCS(:) = PRCS(:) - ZZW1(:,1) + PRIS(:) = PRIS(:) - ZZW1(:,2) + PRSS(:) = PRSS(:) - ZZW1(:,3) + PRRS(:) = PRRS(:) - ZZW1(:,4) + PRGS(:) = PRGS(:) + PRDRYG(:) + PTHS(:) = PTHS(:) + (ZZW1(:,1)+ZZW1(:,4))*(PLSFACT(:)-PLVFACT(:)) ! + ! f(L_f*(RCDRYG+RRDRYG)) + END WHERE + + if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'DRYG', Unpack ( pths(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'DRYG', Unpack ( prcs(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rr ) call Budget_store_end( tbudgets(NBUDGET_RR), 'DRYG', Unpack ( prrs(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'DRYG', Unpack ( pris(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rs ) call Budget_store_end( tbudgets(NBUDGET_RS), 'DRYG', Unpack ( prss(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rg ) call Budget_store_end( tbudgets(NBUDGET_RG), 'DRYG', Unpack ( prgs(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) +! +! WHERE ( PZT(:) > XTT ) ! RSWETG case only +! PRSS(:) = PRSS(:) - ZZW1(:,6) +! PRGS(:) = PRGS(:) + ZZW1(:,6) +! END WHERE +! +!* 6.5 Melting of the graupeln +! + zzw(:) = 0. !initialization necessary (for budgets) + WHERE( PRGT(:)>XRTMIN(6) .AND. PRGS(:)>0.0 .AND. PZT(:)>XTT ) + ZZW(:) = PRVT(:)*PPRES(:)/((XMV/XMD)+PRVT(:)) ! Vapor pressure + ZZW(:) = PKA(:)*(XTT-PZT(:)) + & + ( PDV(:)*(XLVTT + ( XCPV - XCL ) * ( PZT(:) - XTT )) & + *(XESTT-ZZW(:))/(XRV*PZT(:)) ) +! +! compute RGMLTR +! + ZZW(:) = MIN( PRGS(:), MAX( 0.0,( -ZZW(:) * & + ( X0DEPG* PLBDAG(:)**XEX0DEPG + & + X1DEPG*PCJ(:)*PLBDAG(:)**XEX1DEPG ) - & + ( ZZW1(:,1)+ZZW1(:,4) ) * & + ( PRHODREF(:)*XCL*(XTT-PZT(:))) ) / & + ( PRHODREF(:)*XLMTT ) ) ) + PRRS(:) = PRRS(:) + ZZW(:) + PRGS(:) = PRGS(:) - ZZW(:) + PTHS(:) = PTHS(:) - ZZW(:)*(PLSFACT(:)-PLVFACT(:)) ! f(L_f*(-RGMLTR)) + END WHERE + + if ( lbudget_th ) call Budget_store_add( tbudgets(NBUDGET_TH), 'GMLT', Unpack ( -zzw(:) * ( plsfact(:) - plvfact(:) ) & + * prhodj(:), mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rr ) call Budget_store_add( tbudgets(NBUDGET_RR), 'GMLT', Unpack ( zzw(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rg ) call Budget_store_add( tbudgets(NBUDGET_RG), 'GMLT', Unpack ( -zzw(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) +END SUBROUTINE RAIN_ICE_FAST_RG + +END MODULE MODE_RAIN_ICE_FAST_RG diff --git a/src/mesonh/micro/rain_ice_fast_rh.f90 b/src/mesonh/micro/rain_ice_fast_rh.f90 new file mode 100644 index 000000000..1710f8b15 --- /dev/null +++ b/src/mesonh/micro/rain_ice_fast_rh.f90 @@ -0,0 +1,403 @@ +!MNH_LIC Copyright 1995-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! Modifications: +! P. Wautelet 25/02/2019: split rain_ice (cleaner and easier to maintain/debug) +! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! P. Wautelet 03/06/2019: remove PACK/UNPACK intrinsics (to get more performance and better OpenACC support) +! P. Wautelet 05/06/2019: optimisations +! P. Wautelet 02/2020: use the new data structures and subroutines for budgets +!----------------------------------------------------------------- +MODULE MODE_RAIN_ICE_FAST_RH + + IMPLICIT NONE + + PRIVATE + + PUBLIC :: RAIN_ICE_FAST_RH + +CONTAINS + +SUBROUTINE RAIN_ICE_FAST_RH(OMICRO, PRHODREF, PRVT, PRCT, PRIT, PRST, PRGT, PRHT, PRHODJ, PPRES, & + PZT, PLBDAS, PLBDAG, PLBDAH, PLSFACT, PLVFACT, PCJ, PKA, PDV, & + PRCS, PRRS, PRIS, PRSS, PRGS, PRHS, PTHS, PUSW) +! +!* 0. DECLARATIONS +! ------------ +! +use modd_budget, only: lbudget_th, lbudget_rc, lbudget_rr, lbudget_ri, lbudget_rs, lbudget_rg, lbudget_rh, & + NBUDGET_TH, NBUDGET_RC, NBUDGET_RR, NBUDGET_RI, NBUDGET_RS, NBUDGET_RG, NBUDGET_RH, & + tbudgets +use MODD_CST, only: XCI, XCL, XCPV, XESTT, XLMTT, XLVTT, XMD, XMV, XRV, XTT +use MODD_RAIN_ICE_DESCR, only: XBG, XBS, XCEXVT, XCXG, XCXH, XCXS, XDH, XLBEXH, XLBH, XRTMIN +use MODD_RAIN_ICE_PARAM, only: NWETLBDAG, NWETLBDAH, NWETLBDAS, X0DEPH, X1DEPH, & + XEX0DEPH, XEX1DEPH, XFGWETH, XFSWETH, XFWETH, XKER_GWETH, XKER_SWETH, & + XLBGWETH1, XLBGWETH2, XLBGWETH3, XLBSWETH1, XLBSWETH2, XLBSWETH3, & + XWETINTP1G, XWETINTP1H, XWETINTP1S, XWETINTP2G, XWETINTP2H, XWETINTP2S + +use mode_budget, only: Budget_store_add, Budget_store_end, Budget_store_init + +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +LOGICAL, DIMENSION(:,:,:), intent(in) :: OMICRO ! Test where to compute all processes +REAL, DIMENSION(:), intent(in) :: PRHODREF ! RHO Dry REFerence +REAL, DIMENSION(:), intent(in) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:), intent(in) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:), intent(in) :: PRIT ! Pristine ice m.r. at t +REAL, DIMENSION(:), intent(in) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:), intent(in) :: PRGT ! Graupel m.r. at t +REAL, DIMENSION(:), intent(in) :: PRHT ! Hail m.r. at t +REAL, DIMENSION(:), intent(in) :: PRHODJ ! RHO times Jacobian +REAL, DIMENSION(:), intent(in) :: PPRES ! Pressure +REAL, DIMENSION(:), intent(in) :: PZT ! Temperature +REAL, DIMENSION(:), intent(in) :: PLBDAS ! Slope parameter of the aggregate distribution +REAL, DIMENSION(:), intent(in) :: PLBDAG ! Slope parameter of the graupel distribution +REAL, DIMENSION(:), intent(inout) :: PLBDAH ! Slope parameter of the hail distribution +REAL, DIMENSION(:), intent(in) :: PLSFACT ! L_s/(Pi_ref*C_ph) +REAL, DIMENSION(:), intent(in) :: PLVFACT ! L_v/(Pi_ref*C_ph) +REAL, DIMENSION(:), intent(in) :: PCJ ! Function to compute the ventilation coefficient +REAL, DIMENSION(:), intent(in) :: PKA ! Thermal conductivity of the air +REAL, DIMENSION(:), intent(in) :: PDV ! Diffusivity of water vapor in the air +REAL, DIMENSION(:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: PRRS ! Rain water m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: PRSS ! Snow/aggregate m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: PRGS ! Graupel m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: PRHS ! Hail m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:), intent(inout) :: PUSW ! Undersaturation over water +! +!* 0.2 declaration of local variables +! +INTEGER :: IHAIL, IGWET +INTEGER :: JJ, JL +INTEGER, DIMENSION(size(PRHODREF)) :: I1H, I1W +INTEGER, DIMENSION(:), ALLOCATABLE :: IVEC1, IVEC2 ! Vectors of indices for interpolations +REAL, DIMENSION(:), ALLOCATABLE :: ZVEC1,ZVEC2,ZVEC3 ! Work vectors for interpolations +REAL, DIMENSION(:), ALLOCATABLE :: ZVECLBDAG, ZVECLBDAH, ZVECLBDAS +REAL, DIMENSION(size(PRHODREF)) :: ZZW ! Work array +REAL, DIMENSION(size(PRHODREF),6) :: ZZW1 ! Work arrays +! +!------------------------------------------------------------------------------- +! + IHAIL = 0 + DO JJ = 1, SIZE(PRHT) + IF ( PRHT(JJ)>XRTMIN(7) ) THEN + IHAIL = IHAIL + 1 + I1H(IHAIL) = JJ + END IF + END DO +! + IF( IHAIL>0 ) THEN +!PW:used init/end instead of add because zzw1 is produced and used with different conditions +! => can not use directly zzw1 in Budget_store_add + if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'WETH', Unpack ( pths(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'WETH', Unpack ( prcs(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rr ) call Budget_store_init( tbudgets(NBUDGET_RR), 'WETH', Unpack ( prrs(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), 'WETH', Unpack ( pris(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rs ) call Budget_store_init( tbudgets(NBUDGET_RS), 'WETH', Unpack ( prss(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rg ) call Budget_store_init( tbudgets(NBUDGET_RG), 'WETH', Unpack ( prgs(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rh ) call Budget_store_init( tbudgets(NBUDGET_RH), 'WETH', Unpack ( prhs(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) +! +!* 7.2 compute the Wet growth of hail +! + ZZW1(:,:) = 0.0 +! + DO JJ = 1, IHAIL + JL = I1H(JJ) + PLBDAH(JL) = XLBH * ( PRHODREF(JL) * MAX( PRHT(JL), XRTMIN(7) ) )**XLBEXH + + IF ( PRCT(JL)>XRTMIN(2) .AND. PRCS(JL)>0.0 ) THEN + ZZW(JL) = PLBDAH(JL)**(XCXH-XDH-2.0) * PRHODREF(JL)**(-XCEXVT) + ZZW1(JL,1) = MIN( PRCS(JL),XFWETH * PRCT(JL) * ZZW(JL) ) ! RCWETH + END IF + + IF ( PRIT(JL)>XRTMIN(4) .AND. PRIS(JL)>0.0 ) THEN + ZZW(JL) = PLBDAH(JL)**(XCXH-XDH-2.0) * PRHODREF(JL)**(-XCEXVT) + ZZW1(JL,2) = MIN( PRIS(JL),XFWETH * PRIT(JL) * ZZW(JL) ) ! RIWETH + END IF + END DO +! +!* 7.2.1 accretion of aggregates on the hailstones +! + IGWET = 0 + DO JJ = 1, IHAIL + JL = I1H(JJ) + IF ( PRST(JL)>XRTMIN(5) .AND. PRSS(JL)>0.0 ) THEN + IGWET = IGWET + 1 + I1W(IGWET) = JL + END IF + END DO +! + IF( IGWET>0 ) THEN +! +!* 7.2.2 allocations +! + ALLOCATE(ZVECLBDAH(IGWET)) + ALLOCATE(ZVECLBDAS(IGWET)) + ALLOCATE(ZVEC1(IGWET)) + ALLOCATE(ZVEC2(IGWET)) + ALLOCATE(ZVEC3(IGWET)) + ALLOCATE(IVEC1(IGWET)) + ALLOCATE(IVEC2(IGWET)) +! +!* 7.2.3 select the (PLBDAH,PLBDAS) couplet +! + ZVECLBDAH(1:IGWET) = PLBDAH(I1W(1:IGWET)) + ZVECLBDAS(1:IGWET) = PLBDAS(I1W(1:IGWET)) +! +!* 7.2.4 find the next lower indice for the PLBDAG and for the PLBDAS +! in the geometrical set of (Lbda_h,Lbda_s) couplet use to +! tabulate the SWETH-kernel +! + ZVEC1(1:IGWET) = MAX( 1.00001, MIN( REAL(NWETLBDAH)-0.00001, & + XWETINTP1H * LOG( ZVECLBDAH(1:IGWET) ) + XWETINTP2H ) ) + IVEC1(1:IGWET) = INT( ZVEC1(1:IGWET) ) + ZVEC1(1:IGWET) = ZVEC1(1:IGWET) - REAL( IVEC1(1:IGWET) ) +! + ZVEC2(1:IGWET) = MAX( 1.00001, MIN( REAL(NWETLBDAS)-0.00001, & + XWETINTP1S * LOG( ZVECLBDAS(1:IGWET) ) + XWETINTP2S ) ) + IVEC2(1:IGWET) = INT( ZVEC2(1:IGWET) ) + ZVEC2(1:IGWET) = ZVEC2(1:IGWET) - REAL( IVEC2(1:IGWET) ) +! +!* 7.2.5 perform the bilinear interpolation of the normalized +! SWETH-kernel +! + DO JJ = 1,IGWET + ZVEC3(JJ) = ( XKER_SWETH(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & + - XKER_SWETH(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + * ZVEC1(JJ) & + - ( XKER_SWETH(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & + - XKER_SWETH(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + * (ZVEC1(JJ) - 1.0) + END DO +! + DO JJ = 1, IGWET + JL = I1W(JJ) + ZZW1(JL,3) = MIN( PRSS(JL),XFSWETH*ZVEC3(JJ) & ! RSWETH + *( ZVECLBDAS(JJ)**(XCXS-XBS) )*( ZVECLBDAH(JJ)**XCXH ) & + *( PRHODREF(JL)**(-XCEXVT-1.) ) & + *( XLBSWETH1/( ZVECLBDAH(JJ)**2 ) + & + XLBSWETH2/( ZVECLBDAH(JJ) * ZVECLBDAS(JJ) ) + & + XLBSWETH3/( ZVECLBDAS(JJ)**2) ) ) + END DO + DEALLOCATE(ZVECLBDAS) + DEALLOCATE(ZVECLBDAH) + DEALLOCATE(IVEC2) + DEALLOCATE(IVEC1) + DEALLOCATE(ZVEC3) + DEALLOCATE(ZVEC2) + DEALLOCATE(ZVEC1) + END IF +! +!* 7.2.6 accretion of graupeln on the hailstones +! + IGWET = 0 + DO JJ = 1, IHAIL + JL = I1H(JJ) + IF ( PRGT(JL)>XRTMIN(6) .AND. PRGS(JL)>0.0 ) THEN + IGWET = IGWET + 1 + I1W(IGWET) = JL + END IF + END DO +! + IF( IGWET>0 ) THEN +! +!* 7.2.7 allocations +! + ALLOCATE(ZVECLBDAG(IGWET)) + ALLOCATE(ZVECLBDAH(IGWET)) + ALLOCATE(ZVEC1(IGWET)) + ALLOCATE(ZVEC2(IGWET)) + ALLOCATE(ZVEC3(IGWET)) + ALLOCATE(IVEC1(IGWET)) + ALLOCATE(IVEC2(IGWET)) +! +!* 7.2.8 select the (PLBDAH,PLBDAG) couplet +! + ZVECLBDAG(1:IGWET) = PLBDAG(I1W(1:IGWET)) + ZVECLBDAH(1:IGWET) = PLBDAH(I1W(1:IGWET)) +! +!* 7.2.9 find the next lower indice for the PLBDAH and for the PLBDAG +! in the geometrical set of (Lbda_h,Lbda_g) couplet use to +! tabulate the GWETH-kernel +! + ZVEC1(1:IGWET) = MAX( 1.00001, MIN( REAL(NWETLBDAG)-0.00001, & + XWETINTP1H * LOG( ZVECLBDAH(1:IGWET) ) + XWETINTP2H ) ) + IVEC1(1:IGWET) = INT( ZVEC1(1:IGWET) ) + ZVEC1(1:IGWET) = ZVEC1(1:IGWET) - REAL( IVEC1(1:IGWET) ) +! + ZVEC2(1:IGWET) = MAX( 1.00001, MIN( REAL(NWETLBDAG)-0.00001, & + XWETINTP1G * LOG( ZVECLBDAG(1:IGWET) ) + XWETINTP2G ) ) + IVEC2(1:IGWET) = INT( ZVEC2(1:IGWET) ) + ZVEC2(1:IGWET) = ZVEC2(1:IGWET) - REAL( IVEC2(1:IGWET) ) +! +!* 7.2.10 perform the bilinear interpolation of the normalized +! GWETH-kernel +! + DO JJ = 1,IGWET + ZVEC3(JJ) = ( XKER_GWETH(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & + - XKER_GWETH(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + * ZVEC1(JJ) & + - ( XKER_GWETH(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & + - XKER_GWETH(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + * (ZVEC1(JJ) - 1.0) + END DO +! + DO JJ = 1, IGWET + JL = I1W(JJ) + ZZW1(JL,5) = MAX(MIN( PRGS(JL),XFGWETH*ZVEC3(JJ) & ! RGWETH + *( ZVECLBDAG(JJ)**(XCXG-XBG) )*( ZVECLBDAH(JJ)**XCXH ) & + *( PRHODREF(JL)**(-XCEXVT-1.) ) & + *( XLBGWETH1/( ZVECLBDAH(JJ)**2 ) + & + XLBGWETH2/( ZVECLBDAH(JJ) * ZVECLBDAG(JJ) ) + & + XLBGWETH3/( ZVECLBDAG(JJ)**2) ) ),0. ) + END DO + DEALLOCATE(ZVECLBDAH) + DEALLOCATE(ZVECLBDAG) + DEALLOCATE(IVEC2) + DEALLOCATE(IVEC1) + DEALLOCATE(ZVEC3) + DEALLOCATE(ZVEC2) + DEALLOCATE(ZVEC1) + END IF +! +!* 7.3 compute the Wet growth of hail +! + DO JJ = 1, IHAIL + JL = I1H(JJ) + IF ( PZT(JL)<XTT ) THEN + ZZW(JL) = PRVT(JL)*PPRES(JL)/((XMV/XMD)+PRVT(JL)) ! Vapor pressure + ZZW(JL) = PKA(JL)*(XTT-PZT(JL)) + & + ( PDV(JL)*(XLVTT + ( XCPV - XCL ) * ( PZT(JL) - XTT )) & + *(XESTT-ZZW(JL))/(XRV*PZT(JL)) ) +! +! compute RWETH +! + ZZW(JL) = MAX(0., ( ZZW(JL) * ( X0DEPH* PLBDAH(JL)**XEX0DEPH + & + X1DEPH*PCJ(JL)*PLBDAH(JL)**XEX1DEPH ) + & + ( ZZW1(JL,2)+ZZW1(JL,3)+ZZW1(JL,5) ) * & + ( PRHODREF(JL)*(XLMTT+(XCI-XCL)*(XTT-PZT(JL))) ) ) / & + ( PRHODREF(JL)*(XLMTT-XCL*(XTT-PZT(JL))) ) ) +! + ZZW1(JL,6) = MAX( ZZW(JL) - ZZW1(JL,2) - ZZW1(JL,3) - ZZW1(JL,5),0.) ! RCWETH+RRWETH + IF ( ZZW1(JL,6)/=0.) THEN +! +! limitation of the available rainwater mixing ratio (RRWETH < RRS !) +! + ZZW1(JL,4) = MAX( 0.0,MIN( ZZW1(JL,6),PRRS(JL)+ZZW1(JL,1) ) ) + PUSW(JL) = ZZW1(JL,4) / ZZW1(JL,6) + ZZW1(JL,2) = ZZW1(JL,2)*PUSW(JL) + ZZW1(JL,3) = ZZW1(JL,3)*PUSW(JL) + ZZW1(JL,5) = ZZW1(JL,5)*PUSW(JL) + ZZW(JL) = ZZW1(JL,4) + ZZW1(JL,2) + ZZW1(JL,3) + ZZW1(JL,5) +! +!* 7.1.6 integrate the Wet growth of hail +! + PRCS(JL) = PRCS(JL) - ZZW1(JL,1) + PRIS(JL) = PRIS(JL) - ZZW1(JL,2) + PRSS(JL) = PRSS(JL) - ZZW1(JL,3) + PRGS(JL) = PRGS(JL) - ZZW1(JL,5) + PRHS(JL) = PRHS(JL) + ZZW(JL) + PRRS(JL) = MAX( 0.0,PRRS(JL) - ZZW1(JL,4) + ZZW1(JL,1) ) + PTHS(JL) = PTHS(JL) + ZZW1(JL,4)*(PLSFACT(JL)-PLVFACT(JL)) + ! f(L_f*(RCWETH+RRWETH)) + END IF + END IF + END DO + + if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'WETH', Unpack ( pths(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'WETH', Unpack ( prcs(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rr ) call Budget_store_end( tbudgets(NBUDGET_RR), 'WETH', Unpack ( prrs(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'WETH', Unpack ( pris(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rs ) call Budget_store_end( tbudgets(NBUDGET_RS), 'WETH', Unpack ( prss(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rg ) call Budget_store_end( tbudgets(NBUDGET_RG), 'WETH', Unpack ( prgs(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rh ) call Budget_store_end( tbudgets(NBUDGET_RH), 'WETH', Unpack ( prhs(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) +! +! +! ici LRECONVH et un flag pour autoriser une reconversion partielle de +!la grele en gresil +! +! IF( IHAIL>0 ) THEN +! +!UPG_CD +! +! +!* 7.45 Conversion of the hailstones into graupel +! +! XDUMMY6=0.01E-3 +! XDUMMY7=0.001E-3 +! WHERE( PRHT(:)<XDUMMY6 .AND. PRCT(:)<XDUMMY7 .AND. PZT(:)<XTT ) +! ZZW(:) = MIN( 1.0,MAX( 0.0,1.0-(PRCT(:)/XDUMMY7) ) ) +! +! assume a linear percent conversion rate of hail into graupel +! +! ZZW(:) = PRHS(:)*ZZW(:) +! PRGS(:) = PRGS(:) + ZZW(:) ! partial conversion +! PRHS(:) = PRHS(:) - ZZW(:) ! of hail into graupel +! +! END WHERE +! END IF + + + + +! +!* 7.5 Melting of the hailstones +! + if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'HMLT', Unpack ( pths(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rr ) call Budget_store_init( tbudgets(NBUDGET_RR), 'HMLT', Unpack ( prrs(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rh ) call Budget_store_init( tbudgets(NBUDGET_RH), 'HMLT', Unpack ( prhs(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + + DO JJ = 1, IHAIL + JL = I1H(JJ) + IF( PRHS(JL)>0.0 .AND. PZT(JL)>XTT ) THEN + ZZW(JL) = PRVT(JL)*PPRES(JL)/((XMV/XMD)+PRVT(JL)) ! Vapor pressure + ZZW(JL) = PKA(JL)*(XTT-PZT(JL)) + & + ( PDV(JL)*(XLVTT + ( XCPV - XCL ) * ( PZT(JL) - XTT )) & + *(XESTT-ZZW(JL))/(XRV*PZT(JL)) ) +! +! compute RHMLTR +! + ZZW(JL) = MIN( PRHS(JL), MAX( 0.0,( -ZZW(JL) * & + ( X0DEPH* PLBDAH(JL)**XEX0DEPH + & + X1DEPH*PCJ(JL)*PLBDAH(JL)**XEX1DEPH ) ) / & + ( PRHODREF(JL)*XLMTT ) ) ) + PRRS(JL) = PRRS(JL) + ZZW(JL) + PRHS(JL) = PRHS(JL) - ZZW(JL) + PTHS(JL) = PTHS(JL) - ZZW(JL)*(PLSFACT(JL)-PLVFACT(JL)) ! f(L_f*(-RHMLTR)) + END IF + END DO + + if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'HMLT', Unpack ( pths(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rr ) call Budget_store_end( tbudgets(NBUDGET_RR), 'HMLT', Unpack ( prrs(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rh ) call Budget_store_end( tbudgets(NBUDGET_RH), 'HMLT', Unpack ( prhs(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + END IF +! +END SUBROUTINE RAIN_ICE_FAST_RH + +END MODULE MODE_RAIN_ICE_FAST_RH diff --git a/src/mesonh/micro/rain_ice_fast_ri.f90 b/src/mesonh/micro/rain_ice_fast_ri.f90 new file mode 100644 index 000000000..edb36a38b --- /dev/null +++ b/src/mesonh/micro/rain_ice_fast_ri.f90 @@ -0,0 +1,103 @@ +!MNH_LIC Copyright 1995-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! Modifications: +! P. Wautelet 25/02/2019: split rain_ice (cleaner and easier to maintain/debug) +! P. Wautelet 05/06/2019: optimisations +! P. Wautelet 02/2020: use the new data structures and subroutines for budgets +!----------------------------------------------------------------- +MODULE MODE_RAIN_ICE_FAST_RI + + IMPLICIT NONE + + PRIVATE + + PUBLIC :: RAIN_ICE_FAST_RI + +CONTAINS + +SUBROUTINE RAIN_ICE_FAST_RI(OMICRO, PRHODREF, PRIT, PRHODJ, PZT, PSSI, PLSFACT, PLVFACT, & + PAI, PCJ, PCIT, PRCS, PRIS, PTHS) +! +!* 0. DECLARATIONS +! ------------ +! +use modd_budget, only: lbudget_th, lbudget_rc, lbudget_ri, & + NBUDGET_TH, NBUDGET_RC, NBUDGET_RI, & + tbudgets +use MODD_CST, only: XTT +use MODD_RAIN_ICE_DESCR, only: XDI, XLBEXI, XLBI, XRTMIN +use MODD_RAIN_ICE_PARAM, only: X0DEPI, X2DEPI + +use mode_budget, only: Budget_store_add, Budget_store_end, Budget_store_init + +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +LOGICAL, DIMENSION(:,:,:), intent(in) :: OMICRO ! Test where to compute all processes +REAL, DIMENSION(:), intent(in) :: PRHODREF ! RHO Dry REFerence +REAL, DIMENSION(:), intent(in) :: PRIT ! Pristine ice m.r. at t +REAL, DIMENSION(:), intent(in) :: PRHODJ ! RHO times Jacobian +REAL, DIMENSION(:), intent(in) :: PZT ! Temperature +REAL, DIMENSION(:), intent(in) :: PSSI ! Supersaturation over ice +REAL, DIMENSION(:), intent(in) :: PLSFACT ! L_s/(Pi_ref*C_ph) +REAL, DIMENSION(:), intent(in) :: PLVFACT ! L_v/(Pi_ref*C_ph) +REAL, DIMENSION(:), intent(in) :: PAI ! Thermodynamical function +REAL, DIMENSION(:), intent(in) :: PCJ ! Function to compute the ventilation coefficient +REAL, DIMENSION(:), intent(inout) :: PCIT ! Pristine ice conc. at t +REAL, DIMENSION(:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: PTHS ! Theta source +! +!* 0.2 declaration of local variables +! +REAL, DIMENSION(size(PRHODREF)) :: ZZW ! Work array +!------------------------------------------------------------------------------- +! +!* 7.1 cloud ice melting +! + if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'IMLT', Unpack ( pths(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'IMLT', Unpack ( prcs(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), 'IMLT', Unpack ( pris(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + + WHERE( PRIS(:)>0.0 .AND. PZT(:)>XTT ) + PRCS(:) = PRCS(:) + PRIS(:) + PTHS(:) = PTHS(:) - PRIS(:)*(PLSFACT(:)-PLVFACT(:)) ! f(L_f*(-RIMLTC)) + PRIS(:) = 0.0 + PCIT(:) = 0.0 + END WHERE + + if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'IMLT', Unpack ( pths(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'IMLT', Unpack ( prcs(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'IMLT', Unpack ( pris(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) +! +!* 7.2 Bergeron-Findeisen effect: RCBERI +! + zzw(:) = 0. + WHERE( PRCS(:)>0.0 .AND. PSSI(:)>0.0 .AND. PRIT(:)>XRTMIN(4) .AND. PCIT(:)>0.0 ) + ZZW(:) = MIN(1.E8,XLBI*( PRHODREF(:)*PRIT(:)/PCIT(:) )**XLBEXI) ! Lbda_i + ZZW(:) = MIN( PRCS(:),( PSSI(:) / (PRHODREF(:)*PAI(:)) ) * PCIT(:) * & + ( X0DEPI/ZZW(:) + X2DEPI*PCJ(:)*PCJ(:)/ZZW(:)**(XDI+2.0) ) ) + PRCS(:) = PRCS(:) - ZZW(:) + PRIS(:) = PRIS(:) + ZZW(:) + PTHS(:) = PTHS(:) + ZZW(:)*(PLSFACT(:)-PLVFACT(:)) ! f(L_f*(RCBERI)) + END WHERE + + if ( lbudget_th ) call Budget_store_add( tbudgets(NBUDGET_TH), 'BERFI', Unpack ( zzw(:) * ( plsfact(:) - plvfact(:) ) & + * prhodj(:), mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rc ) call Budget_store_add( tbudgets(NBUDGET_RC), 'BERFI', Unpack ( -zzw(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_ri ) call Budget_store_add( tbudgets(NBUDGET_RI), 'BERFI', Unpack ( zzw(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) +END SUBROUTINE RAIN_ICE_FAST_RI + +END MODULE MODE_RAIN_ICE_FAST_RI diff --git a/src/mesonh/micro/rain_ice_fast_rs.f90 b/src/mesonh/micro/rain_ice_fast_rs.f90 new file mode 100644 index 000000000..a4750d01d --- /dev/null +++ b/src/mesonh/micro/rain_ice_fast_rs.f90 @@ -0,0 +1,375 @@ +!MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! Modifications: +! P. Wautelet 25/02/2019: split rain_ice (cleaner and easier to maintain/debug) +! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! P. Wautelet 03/06/2019: remove PACK/UNPACK intrinsics (to get more performance and better OpenACC support) +! P. Wautelet 05/06/2019: optimisations +! P. Wautelet 02/2020: use the new data structures and subroutines for budgets +! P. Wautelet 19/02/2021: bugfix: RIM and ACC terms for budgets are now correctly stored +!----------------------------------------------------------------- +MODULE MODE_RAIN_ICE_FAST_RS + + IMPLICIT NONE + + PRIVATE + + PUBLIC :: RAIN_ICE_FAST_RS + +CONTAINS + +SUBROUTINE RAIN_ICE_FAST_RS(PTSTEP, OMICRO, PRHODREF, PRVT, PRCT, PRRT, PRST, PRHODJ, PPRES, PZT, & + PLBDAR, PLBDAS, PLSFACT, PLVFACT, PCJ, PKA, PDV, & + PRCS, PRRS, PRSS, PRGS, PTHS) +! +!* 0. DECLARATIONS +! ------------ +! +use modd_budget, only: lbudget_th, lbudget_rc, lbudget_rr, lbudget_rs, lbudget_rg, & + NBUDGET_TH, NBUDGET_RC, NBUDGET_RR, NBUDGET_RS, NBUDGET_RG, & + tbudgets +use MODD_CST, only: XCL, XCPV, XESTT, XLMTT, XLVTT, XMD, XMV, XRV, XTT +use MODD_RAIN_ICE_DESCR, only: XBS, XCEXVT, XCXS, XRTMIN +use MODD_RAIN_ICE_PARAM, only: NACCLBDAR, NACCLBDAS, NGAMINC, X0DEPS, X1DEPS, XACCINTP1R, XACCINTP1S, XACCINTP2R, XACCINTP2S, & + XCRIMSG, XCRIMSS, XEX0DEPS, XEX1DEPS, XEXCRIMSG, XEXCRIMSS, XEXSRIMCG, XFRACCSS, & + XFSACCRG, XFSCVMG, XGAMINC_RIM1, XGAMINC_RIM1, XGAMINC_RIM2, XKER_RACCS, & + XKER_RACCSS, XKER_SACCRG, XLBRACCS1, XLBRACCS2, XLBRACCS3, XLBSACCR1, XLBSACCR2, XLBSACCR3, & + XRIMINTP1, XRIMINTP2, XSRIMCG + +use mode_budget, only: Budget_store_add, Budget_store_end, Budget_store_init + +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +REAL, intent(in) :: PTSTEP ! Double Time step + ! (single if cold start) +LOGICAL, DIMENSION(:,:,:), intent(in) :: OMICRO ! Test where to compute all processes +REAL, DIMENSION(:), intent(in) :: PRHODREF ! RHO Dry REFerence +REAL, DIMENSION(:), intent(in) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:), intent(in) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:), intent(in) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:), intent(in) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:), intent(in) :: PRHODJ ! RHO times Jacobian +REAL, DIMENSION(:), intent(in) :: PPRES ! Pressure +REAL, DIMENSION(:), intent(in) :: PZT ! Temperature +REAL, DIMENSION(:), intent(in) :: PLBDAR ! Slope parameter of the raindrop distribution +REAL, DIMENSION(:), intent(in) :: PLBDAS ! Slope parameter of the aggregate distribution +REAL, DIMENSION(:), intent(in) :: PLSFACT ! L_s/(Pi_ref*C_ph) +REAL, DIMENSION(:), intent(in) :: PLVFACT ! L_v/(Pi_ref*C_ph) +REAL, DIMENSION(:), intent(in) :: PCJ ! Function to compute the ventilation coefficient +REAL, DIMENSION(:), intent(in) :: PKA ! Thermal conductivity of the air +REAL, DIMENSION(:), intent(in) :: PDV ! Diffusivity of water vapor in the air +REAL, DIMENSION(:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: PRRS ! Rain water m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: PRSS ! Snow/aggregate m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: PRGS ! Graupel m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: PTHS ! Theta source +! +!* 0.2 declaration of local variables +! +INTEGER :: IGRIM, IGACC +INTEGER :: JJ, JL +INTEGER, DIMENSION(size(PRHODREF)) :: I1 +INTEGER, DIMENSION(:), ALLOCATABLE :: IVEC1, IVEC2 ! Vectors of indices for interpolations +REAL, DIMENSION(size(PRHODREF)) :: ZZW ! Work array +REAL, DIMENSION(:), ALLOCATABLE :: ZVEC1,ZVEC2,ZVEC3 ! Work vectors for interpolations +REAL, DIMENSION(:), ALLOCATABLE :: ZVECLBDAR, ZVECLBDAS +REAL, DIMENSION(:), ALLOCATABLE :: ZZW1, ZZW2, ZZW3, ZZW4 ! Work arrays +!------------------------------------------------------------------------------- +! +!* 5.1 cloud droplet riming of the aggregates +! + IGRIM = 0 + DO JJ = 1, SIZE(PRCT) + IF ( PRCT(JJ)>XRTMIN(2) .AND. PRST(JJ)>XRTMIN(5) .AND. PRCS(JJ)>0.0 .AND. PZT(JJ)<XTT ) THEN + IGRIM = IGRIM + 1 + I1(IGRIM) = JJ + END IF + END DO + ! + IF( IGRIM>0 ) THEN + if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'RIM', Unpack ( pths(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'RIM', Unpack ( prcs(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rs ) call Budget_store_init( tbudgets(NBUDGET_RS), 'RIM', Unpack ( prss(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rg ) call Budget_store_init( tbudgets(NBUDGET_RG), 'RIM', Unpack ( prgs(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + +! +! 5.1.0 allocations +! + ALLOCATE(ZVECLBDAS(IGRIM)) + ALLOCATE(ZVEC1(IGRIM)) + ALLOCATE(ZVEC2(IGRIM)) + ALLOCATE(IVEC2(IGRIM)) + ALLOCATE(ZZW1(IGRIM)) + ALLOCATE(ZZW2(IGRIM)) + ALLOCATE(ZZW3(IGRIM)) +! +! 5.1.1 select the PLBDAS +! + ZVECLBDAS(1:IGRIM) = PLBDAS(I1(1:IGRIM)) +! +! 5.1.2 find the next lower indice for the PLBDAS in the geometrical +! set of Lbda_s used to tabulate some moments of the incomplete +! gamma function +! + ZVEC2(1:IGRIM) = MAX( 1.00001, MIN( REAL(NGAMINC)-0.00001, & + XRIMINTP1 * LOG( ZVECLBDAS(1:IGRIM) ) + XRIMINTP2 ) ) + IVEC2(1:IGRIM) = INT( ZVEC2(1:IGRIM) ) + ZVEC2(1:IGRIM) = ZVEC2(1:IGRIM) - REAL( IVEC2(1:IGRIM) ) +! +! 5.1.3 perform the linear interpolation of the normalized +! "2+XDS"-moment of the incomplete gamma function +! + ZVEC1(1:IGRIM) = XGAMINC_RIM1( IVEC2(1:IGRIM)+1 )* ZVEC2(1:IGRIM) & + - XGAMINC_RIM1( IVEC2(1:IGRIM) )*(ZVEC2(1:IGRIM) - 1.0) +! +! 5.1.4 riming of the small sized aggregates +! + DO JJ = 1, IGRIM + JL = I1(JJ) + ZZW1(JJ) = MIN( PRCS(JL), & + XCRIMSS * ZVEC1(JJ) * PRCT(JL) & ! RCRIMSS + * ZVECLBDAS(JJ)**XEXCRIMSS & + * PRHODREF(JL)**(-XCEXVT) ) + PRCS(JL) = PRCS(JL) - ZZW1(JJ) + PRSS(JL) = PRSS(JL) + ZZW1(JJ) + PTHS(JL) = PTHS(JL) + ZZW1(JJ)*(PLSFACT(JL)-PLVFACT(JL)) ! f(L_f*(RCRIMSS)) + END DO +! +! 5.1.5 perform the linear interpolation of the normalized +! "XBS"-moment of the incomplete gamma function +! + ZVEC1(1:IGRIM) = XGAMINC_RIM2( IVEC2(1:IGRIM)+1 )* ZVEC2(1:IGRIM) & + - XGAMINC_RIM2( IVEC2(1:IGRIM) )*(ZVEC2(1:IGRIM) - 1.0) +! +! 5.1.6 riming-conversion of the large sized aggregates into graupeln +! +! + DO JJ = 1, IGRIM + JL = I1(JJ) + IF ( PRSS(JL) > 0.0 ) THEN + ZZW2(JJ) = MIN( PRCS(JL), & + XCRIMSG * PRCT(JL) & ! RCRIMSG + * ZVECLBDAS(JJ)**XEXCRIMSG & + * PRHODREF(JL)**(-XCEXVT) & + - ZZW1(JJ) ) + ZZW3(JJ) = MIN( PRSS(JL), & + XSRIMCG * ZVECLBDAS(JJ)**XEXSRIMCG & ! RSRIMCG + * (1.0 - ZVEC1(JJ) )/(PTSTEP*PRHODREF(JL)) ) + PRCS(JL) = PRCS(JL) - ZZW2(JJ) + PRSS(JL) = PRSS(JL) - ZZW3(JJ) + PRGS(JL) = PRGS(JL) + ZZW2(JJ)+ZZW3(JJ) + PTHS(JL) = PTHS(JL) + ZZW2(JJ)*(PLSFACT(JL)-PLVFACT(JL)) ! f(L_f*(RCRIMSG)) + END IF + END DO + + !Remark: not possible to use Budget_store_add here + ! because variables modified a second time but with a if on prss + jl/=jj + if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'RIM', Unpack ( pths(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'RIM', Unpack ( prcs(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rs ) call Budget_store_end( tbudgets(NBUDGET_RS), 'RIM', Unpack ( prss(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rg ) call Budget_store_end( tbudgets(NBUDGET_RG), 'RIM', Unpack ( prgs(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + + DEALLOCATE(ZZW3) + DEALLOCATE(ZZW2) + DEALLOCATE(ZZW1) + DEALLOCATE(IVEC2) + DEALLOCATE(ZVEC2) + DEALLOCATE(ZVEC1) + DEALLOCATE(ZVECLBDAS) + END IF +! +!* 5.2 rain accretion onto the aggregates +! + IGACC = 0 + DO JJ = 1, SIZE(PRRT) + IF ( PRRT(JJ)>XRTMIN(3) .AND. PRST(JJ)>XRTMIN(5) .AND. PRRS(JJ)>0.0 .AND. PZT(JJ)<XTT ) THEN + IGACC = IGACC + 1 + I1(IGACC) = JJ + END IF + END DO + ! + IF( IGACC>0 ) THEN + if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'ACC', Unpack ( pths(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rr ) call Budget_store_init( tbudgets(NBUDGET_RR), 'ACC', Unpack ( prrs(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rs ) call Budget_store_init( tbudgets(NBUDGET_RS), 'ACC', Unpack ( prss(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rg ) call Budget_store_init( tbudgets(NBUDGET_RG), 'ACC', Unpack ( prgs(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) +! +! 5.2.0 allocations +! + ALLOCATE(ZVECLBDAR(IGACC)) + ALLOCATE(ZVECLBDAS(IGACC)) + ALLOCATE(ZVEC1(IGACC)) + ALLOCATE(ZVEC2(IGACC)) + ALLOCATE(ZVEC3(IGACC)) + ALLOCATE(IVEC1(IGACC)) + ALLOCATE(IVEC2(IGACC)) + ALLOCATE(ZZW2(IGACC)) + ALLOCATE(ZZW3(IGACC)) + ALLOCATE(ZZW4(IGACC)) +! +! 5.2.1 select the (PLBDAS,PLBDAR) couplet +! + ZVECLBDAS(1:IGACC) = PLBDAS(I1(1:IGACC)) + ZVECLBDAR(1:IGACC) = PLBDAR(I1(1:IGACC)) +! +! 5.2.2 find the next lower indice for the PLBDAS and for the PLBDAR +! in the geometrical set of (Lbda_s,Lbda_r) couplet use to +! tabulate the RACCSS-kernel +! + ZVEC1(1:IGACC) = MAX( 1.00001, MIN( REAL(NACCLBDAS)-0.00001, & + XACCINTP1S * LOG( ZVECLBDAS(1:IGACC) ) + XACCINTP2S ) ) + IVEC1(1:IGACC) = INT( ZVEC1(1:IGACC) ) + ZVEC1(1:IGACC) = ZVEC1(1:IGACC) - REAL( IVEC1(1:IGACC) ) +! + ZVEC2(1:IGACC) = MAX( 1.00001, MIN( REAL(NACCLBDAR)-0.00001, & + XACCINTP1R * LOG( ZVECLBDAR(1:IGACC) ) + XACCINTP2R ) ) + IVEC2(1:IGACC) = INT( ZVEC2(1:IGACC) ) + ZVEC2(1:IGACC) = ZVEC2(1:IGACC) - REAL( IVEC2(1:IGACC) ) +! +! 5.2.3 perform the bilinear interpolation of the normalized +! RACCSS-kernel +! + DO JJ = 1,IGACC + ZVEC3(JJ) = ( XKER_RACCSS(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & + - XKER_RACCSS(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + * ZVEC1(JJ) & + - ( XKER_RACCSS(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & + - XKER_RACCSS(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & + * (ZVEC1(JJ) - 1.0) + END DO +! +! 5.2.4 raindrop accretion on the small sized aggregates +! + DO JJ = 1, IGACC + JL = I1(JJ) + ZZW2(JJ) = & !! coef of RRACCS + XFRACCSS*( ZVECLBDAS(JJ)**XCXS )*( PRHODREF(JL)**(-XCEXVT-1.) ) & + *( XLBRACCS1/((ZVECLBDAS(JJ)**2) ) + & + XLBRACCS2/( ZVECLBDAS(JJ) * ZVECLBDAR(JJ) ) + & + XLBRACCS3/( (ZVECLBDAR(JJ)**2)) )/ZVECLBDAR(JJ)**4 + ZZW4(JJ) = MIN( PRRS(JL),ZZW2(JJ)*ZVEC3(JJ) ) ! RRACCSS + PRRS(JL) = PRRS(JL) - ZZW4(JJ) + PRSS(JL) = PRSS(JL) + ZZW4(JJ) + PTHS(JL) = PTHS(JL) + ZZW4(JJ)*(PLSFACT(JL)-PLVFACT(JL)) ! f(L_f*(RRACCSS)) + END DO +! +! 5.2.4b perform the bilinear interpolation of the normalized +! RACCS-kernel +! + DO JJ = 1,IGACC + ZVEC3(JJ) = ( XKER_RACCS(IVEC2(JJ)+1,IVEC1(JJ)+1)* ZVEC1(JJ) & + - XKER_RACCS(IVEC2(JJ)+1,IVEC1(JJ) )*(ZVEC1(JJ) - 1.0) ) & + * ZVEC2(JJ) & + - ( XKER_RACCS(IVEC2(JJ) ,IVEC1(JJ)+1)* ZVEC1(JJ) & + - XKER_RACCS(IVEC2(JJ) ,IVEC1(JJ) )*(ZVEC1(JJ) - 1.0) ) & + * (ZVEC2(JJ) - 1.0) + END DO + DO JJ = 1, IGACC + ZZW2(JJ) = ZZW2(JJ) * ZVEC3(JJ) + END DO + !! RRACCS! +! 5.2.5 perform the bilinear interpolation of the normalized +! SACCRG-kernel +! + DO JJ = 1,IGACC + ZVEC3(JJ) = ( XKER_SACCRG(IVEC2(JJ)+1,IVEC1(JJ)+1)* ZVEC1(JJ) & + - XKER_SACCRG(IVEC2(JJ)+1,IVEC1(JJ) )*(ZVEC1(JJ) - 1.0) ) & + * ZVEC2(JJ) & + - ( XKER_SACCRG(IVEC2(JJ) ,IVEC1(JJ)+1)* ZVEC1(JJ) & + - XKER_SACCRG(IVEC2(JJ) ,IVEC1(JJ) )*(ZVEC1(JJ) - 1.0) ) & + * (ZVEC2(JJ) - 1.0) + END DO +! +! 5.2.6 raindrop accretion-conversion of the large sized aggregates +! into graupeln +! + DO JJ = 1, IGACC + JL = I1(JJ) + IF ( PRSS(JL) > 0.0 ) THEN + ZZW2(JJ) = MAX( MIN( PRRS(JL),ZZW2(JJ)-ZZW4(JJ) ),0.0 ) ! RRACCSG + IF ( ZZW2(JJ) > 0.0 ) THEN + ZZW3(JJ) = MIN( PRSS(JL),XFSACCRG*ZVEC3(JJ)* & ! RSACCRG + ( ZVECLBDAS(JJ)**(XCXS-XBS) )*( PRHODREF(JL)**(-XCEXVT-1.) ) & + *( XLBSACCR1/((ZVECLBDAR(JJ)**2) ) + & + XLBSACCR2/( ZVECLBDAR(JJ) * ZVECLBDAS(JJ) ) + & + XLBSACCR3/( (ZVECLBDAS(JJ)**2)) )/ZVECLBDAR(JJ) ) + PRRS(JL) = PRRS(JL) - ZZW2(JJ) + PRSS(JL) = PRSS(JL) - ZZW3(JJ) + PRGS(JL) = PRGS(JL) + ZZW2(JJ)+ZZW3(JJ) + PTHS(JL) = PTHS(JL) + ZZW2(JJ)*(PLSFACT(JL)-PLVFACT(JL)) ! + ! f(L_f*(RRACCSG)) + END IF + END IF + END DO + + !Remark: not possible to use Budget_store_add here + ! because variables modified a second time but with a if on prss + jl/=jj + if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'ACC', Unpack ( pths(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rr ) call Budget_store_end( tbudgets(NBUDGET_RR), 'ACC', Unpack ( prrs(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rs ) call Budget_store_end( tbudgets(NBUDGET_RS), 'ACC', Unpack ( prss(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rg ) call Budget_store_end( tbudgets(NBUDGET_RG), 'ACC', Unpack ( prgs(:) * prhodj(:), & + mask = omicro(:,:,:), field = 0. ) ) + + DEALLOCATE(ZZW4) + DEALLOCATE(ZZW3) + DEALLOCATE(ZZW2) + DEALLOCATE(IVEC2) + DEALLOCATE(IVEC1) + DEALLOCATE(ZVEC3) + DEALLOCATE(ZVEC2) + DEALLOCATE(ZVEC1) + DEALLOCATE(ZVECLBDAS) + DEALLOCATE(ZVECLBDAR) + END IF +! +!* 5.3 Conversion-Melting of the aggregates +! + zzw(:) = 0. + WHERE( PRST(:)>XRTMIN(5) .AND. PRSS(:)>0.0 .AND. PZT(:)>XTT ) + ZZW(:) = PRVT(:)*PPRES(:)/((XMV/XMD)+PRVT(:)) ! Vapor pressure + ZZW(:) = PKA(:)*(XTT-PZT(:)) + & + ( PDV(:)*(XLVTT + ( XCPV - XCL ) * ( PZT(:) - XTT )) & + *(XESTT-ZZW(:))/(XRV*PZT(:)) ) +! +! compute RSMLT +! + ZZW(:) = MIN( PRSS(:), XFSCVMG*MAX( 0.0,( -ZZW(:) * & + ( X0DEPS* PLBDAS(:)**XEX0DEPS + & + X1DEPS*PCJ(:)*PLBDAS(:)**XEX1DEPS ) ) / & + ( PRHODREF(:)*XLMTT ) ) ) +! +! note that RSCVMG = RSMLT*XFSCVMG but no heat is exchanged (at the rate RSMLT) +! because the graupeln produced by this process are still icy!!! +! + PRSS(:) = PRSS(:) - ZZW(:) + PRGS(:) = PRGS(:) + ZZW(:) + END WHERE + + if ( lbudget_rs ) call Budget_store_add( tbudgets(NBUDGET_RS), 'CMEL', & + Unpack ( -zzw(:) * prhodj(:), mask = omicro(:,:,:), field = 0. ) ) + if ( lbudget_rg ) call Budget_store_add( tbudgets(NBUDGET_RG), 'CMEL', & + Unpack ( zzw(:) * prhodj(:), mask = omicro(:,:,:), field = 0. ) ) + +END SUBROUTINE RAIN_ICE_FAST_RS + +END MODULE MODE_RAIN_ICE_FAST_RS diff --git a/src/mesonh/micro/rain_ice_nucleation.f90 b/src/mesonh/micro/rain_ice_nucleation.f90 new file mode 100644 index 000000000..97bfaf1f8 --- /dev/null +++ b/src/mesonh/micro/rain_ice_nucleation.f90 @@ -0,0 +1,180 @@ +!MNH_LIC Copyright 1995-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! Modifications: +! P. Wautelet 25/02/2019: split rain_ice (cleaner and easier to maintain/debug) +! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 +! P. Wautelet 29/05/2019: remove PACK/UNPACK intrinsics (to get more performance and better OpenACC support) +! P. Wautelet 02/2020: use the new data structures and subroutines for budgets +!----------------------------------------------------------------- +MODULE MODE_RAIN_ICE_NUCLEATION + + IMPLICIT NONE + + PRIVATE + + PUBLIC RAIN_ICE_NUCLEATION + +CONTAINS + +SUBROUTINE RAIN_ICE_NUCLEATION(KIB, KIE, KJB, KJE, KKTB, KKTE,KRR,PTSTEP,& + PTHT,PPABST,PRHODJ,PRHODREF,PRVT,PRCT,PRRT,PRIT,PRST,PRGT,& + PCIT,PEXNREF,PTHS,PRVS,PRIS,PT,PRHT) +! +!* 0. DECLARATIONS +! ------------ +! +use modd_budget, only: lbudget_th, lbudget_rv, lbudget_ri, & + NBUDGET_TH, NBUDGET_RV, NBUDGET_RI, & + tbudgets +use MODD_CST, only: XALPI, XALPW, XBETAI, XBETAW, XCI, XCL, XCPD, XCPV, XGAMI, XGAMW, & + XLSTT, XMD, XMV, XP00, XRD, XTT +use MODD_RAIN_ICE_PARAM, only: XALPHA1, XALPHA2, XBETA1, XBETA2, XMNU0, XNU10, XNU20 + +use mode_budget, only: Budget_store_init, Budget_store_end +use mode_tools, only: Countjv + +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +INTEGER, INTENT(IN) :: KIB, KIE, KJB, KJE, KKTB, KKTE +INTEGER, INTENT(IN) :: KRR ! Number of moist variable +REAL, INTENT(IN) :: PTSTEP ! Double Time step + ! (single if cold start) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! absolute pressure at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRIT ! Pristine ice m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGT ! Graupel/hail m.r. at t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIT ! Pristine ice n.c. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVS ! Water vapor m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PT ! Temperature +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t +! +!* 0.2 declaration of local variables +! +INTEGER :: INEGT +INTEGER :: JL ! and PACK intrinsics +INTEGER, DIMENSION(SIZE(PEXNREF)) :: I1,I2,I3 ! Used to replace the COUNT +LOGICAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) & + :: GNEGT ! Test where to compute the HEN process +REAL, DIMENSION(:), ALLOCATABLE :: ZRVT ! Water vapor m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZCIT ! Pristine ice conc. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZZT, & ! Temperature + ZPRES, & ! Pressure + ZZW, & ! Work array + ZUSW, & ! Undersaturation over water + ZSSI ! Supersaturation over ice +REAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) & + :: ZW ! work array +! +!------------------------------------------------------------------------------- + +if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'HENU', pths(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_rv ) call Budget_store_init( tbudgets(NBUDGET_RV), 'HENU', prvs(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), 'HENU', pris(:, :, :) * prhodj(:, :, :) ) +! +! compute the temperature and the pressure +! +PT(:,:,:) = PTHT(:,:,:) * ( PPABST(:,:,:) / XP00 ) ** (XRD/XCPD) +! +! optimization by looking for locations where +! the temperature is negative only !!! +! +GNEGT(:,:,:) = .FALSE. +GNEGT(KIB:KIE,KJB:KJE,KKTB:KKTE) = PT(KIB:KIE,KJB:KJE,KKTB:KKTE)<XTT +INEGT = COUNTJV( GNEGT(:,:,:),I1(:),I2(:),I3(:)) +IF( INEGT >= 1 ) THEN + ALLOCATE(ZRVT(INEGT)) ; + ALLOCATE(ZCIT(INEGT)) ; + ALLOCATE(ZZT(INEGT)) ; + ALLOCATE(ZPRES(INEGT)); + DO JL=1,INEGT + ZRVT(JL) = PRVT(I1(JL),I2(JL),I3(JL)) + ZCIT(JL) = PCIT(I1(JL),I2(JL),I3(JL)) + ZZT(JL) = PT(I1(JL),I2(JL),I3(JL)) + ZPRES(JL) = PPABST(I1(JL),I2(JL),I3(JL)) + ENDDO + ALLOCATE(ZZW(INEGT)) + ALLOCATE(ZUSW(INEGT)) + ALLOCATE(ZSSI(INEGT)) + ZZW(:) = EXP( XALPI - XBETAI/ZZT(:) - XGAMI*ALOG(ZZT(:) ) ) ! es_i + ZZW(:) = MIN(ZPRES(:)/2., ZZW(:)) ! safety limitation + ZSSI(:) = ZRVT(:)*( ZPRES(:)-ZZW(:) ) / ( (XMV/XMD) * ZZW(:) ) - 1.0 + ! Supersaturation over ice + ZUSW(:) = EXP( XALPW - XBETAW/ZZT(:) - XGAMW*ALOG(ZZT(:) ) ) ! es_w + ZUSW(:) = MIN(ZPRES(:)/2.,ZUSW(:)) ! safety limitation + ZUSW(:) = ( ZUSW(:)/ZZW(:) )*( (ZPRES(:)-ZZW(:))/(ZPRES(:)-ZUSW(:)) ) - 1.0 + ! Supersaturation of saturated water vapor over ice +! +!* 3.1 compute the heterogeneous nucleation source: RVHENI +! +!* 3.1.1 compute the cloud ice concentration +! + ZZW(:) = 0.0 + ZSSI(:) = MIN( ZSSI(:), ZUSW(:) ) ! limitation of SSi according to SSw=0 + WHERE( (ZZT(:)<XTT-5.0) .AND. (ZSSI(:)>0.0) ) + ZZW(:) = XNU20 * EXP( XALPHA2*ZSSI(:)-XBETA2 ) + END WHERE + WHERE( (ZZT(:)<=XTT-2.0) .AND. (ZZT(:)>=XTT-5.0) .AND. (ZSSI(:)>0.0) ) + ZZW(:) = MAX( XNU20 * EXP( -XBETA2 ),XNU10 * EXP( -XBETA1*(ZZT(:)-XTT) ) * & + ( ZSSI(:)/ZUSW(:) )**XALPHA1 ) + END WHERE + ZZW(:) = ZZW(:) - ZCIT(:) + IF( MAXVAL(ZZW(:)) > 0.0 ) THEN +! +!* 3.1.2 update the r_i and r_v mixing ratios +! + ZZW(:) = MIN( ZZW(:),50.E3 ) ! limitation provisoire a 50 l^-1 + ZW(:,:,:) = 0.0 + DO JL=1, INEGT + ZW(I1(JL), I2(JL), I3(JL)) = ZZW( JL ) + END DO + ZW(:,:,:) = MAX( ZW(:,:,:) ,0.0 ) *XMNU0/(PRHODREF(:,:,:)*PTSTEP) + PRIS(:,:,:) = PRIS(:,:,:) + ZW(:,:,:) + PRVS(:,:,:) = PRVS(:,:,:) - ZW(:,:,:) + IF ( KRR == 7 ) THEN + PTHS(:,:,:) = PTHS(:,:,:) + ZW(:,:,:)*(XLSTT+(XCPV-XCI)*(PT(:,:,:)-XTT)) & + /( (XCPD + XCPV*PRVT(:,:,:) + XCL*(PRCT(:,:,:)+PRRT(:,:,:)) & + + XCI*(PRIT(:,:,:)+PRST(:,:,:)+PRGT(:,:,:)+PRHT(:,:,:)))*PEXNREF(:,:,:) ) + ELSE IF( KRR == 6 ) THEN + PTHS(:,:,:) = PTHS(:,:,:) + ZW(:,:,:)*(XLSTT+(XCPV-XCI)*(PT(:,:,:)-XTT)) & + /( (XCPD + XCPV*PRVT(:,:,:) + XCL*(PRCT(:,:,:)+PRRT(:,:,:)) & + + XCI*(PRIT(:,:,:)+PRST(:,:,:)+PRGT(:,:,:)))*PEXNREF(:,:,:) ) + END IF + ! f(L_s*(RVHENI)) + ZZW(:) = MAX( ZZW(:)+ZCIT(:),ZCIT(:) ) + PCIT(:,:,:) = MAX( PCIT(:,:,:), 0.0 ) + DO JL=1, INEGT + PCIT(I1(JL), I2(JL), I3(JL)) = MAX( ZZW( JL ), PCIT(I1(JL), I2(JL), I3(JL)), 0.0 ) + END DO + END IF + DEALLOCATE(ZSSI) + DEALLOCATE(ZUSW) + DEALLOCATE(ZZW) + DEALLOCATE(ZPRES) + DEALLOCATE(ZZT) + DEALLOCATE(ZCIT) + DEALLOCATE(ZRVT) +END IF +! +!* 3.1.3 budget storage +! +if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'HENU', pths(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_rv ) call Budget_store_end( tbudgets(NBUDGET_RV), 'HENU', prvs(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'HENU', pris(:, :, :) * prhodj(:, :, :) ) + +END SUBROUTINE RAIN_ICE_NUCLEATION + +END MODULE MODE_RAIN_ICE_NUCLEATION diff --git a/src/mesonh/micro/rain_ice_red.f90 b/src/mesonh/micro/rain_ice_red.f90 new file mode 100644 index 000000000..241632665 --- /dev/null +++ b/src/mesonh/micro/rain_ice_red.f90 @@ -0,0 +1,1882 @@ +!MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ######spl + MODULE MODI_RAIN_ICE_RED +! ######################## +! +INTERFACE + SUBROUTINE RAIN_ICE_RED ( KIT, KJT, KKT, KSIZE, & + OSEDIC, HSEDIM, HSUBG_AUCV_RC, HSUBG_AUCV_RI, & + OWARM, KKA, KKU, KKL, & + PTSTEP, KRR, ODMICRO, PEXN, & + PDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR,& + PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF,& + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, & + PRGT, PTHS, PRVS, PRCS, PRRS, PRIS, PRSS, PRGS, & + PINPRC,PINPRR, PINPRR3D, PEVAP3D, & + PINPRS, PINPRG, PINDEP, PRAINFR, PSIGS, PSEA, PTOWN, & + PRHT, PRHS, PINPRH, PFPR ) +! +! +INTEGER, INTENT(IN) :: KIT, KJT, KKT ! arrays size +INTEGER, INTENT(IN) :: KSIZE +LOGICAL, INTENT(IN) :: OSEDIC ! Switch for droplet sedim. +CHARACTER(LEN=4), INTENT(IN) :: HSEDIM ! Sedimentation scheme +CHARACTER(LEN=4), INTENT(IN) :: HSUBG_AUCV_RC ! Switch for rc->rr Subgrid autoconversion + ! Kind of Subgrid autoconversion method +CHARACTER(LEN=80), INTENT(IN) :: HSUBG_AUCV_RI ! Switch for ri->rs Subgrid autoconversion + ! Kind of Subgrid autoconversion method +LOGICAL, INTENT(IN) :: OWARM ! .TRUE. allows raindrops to + ! form by warm processes + ! (Kessler scheme) +! +INTEGER, INTENT(IN) :: KKA !near ground array index +INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO +REAL, INTENT(IN) :: PTSTEP ! Double Time step + ! (single if cold start) +INTEGER, INTENT(IN) :: KRR ! Number of moist variable +LOGICAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: ODMICRO ! mask to limit computation +! +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PEXN ! Exner function +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PDZZ ! Layer thikness (m) +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PPABST ! absolute pressure at t +! +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PCIT ! Pristine ice n.c. at t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PCLDFR ! Cloud fraction +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PHLC_HRC +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PHLC_HCF +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PHLI_HRI +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PHLI_HCF +! +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRIT ! Pristine ice m.r. at t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRGT ! Graupel/hail m.r. at t +! +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRVS ! Water vapor m.r. source +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRRS ! Rain water m.r. source +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRSS ! Snow/aggregate m.r. source +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRGS ! Graupel m.r. source + +! +REAL, DIMENSION(:,:), INTENT(OUT) :: PINPRC! Cloud instant precip +REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRR! Rain instant precip +REAL, DIMENSION(KIT,KJT,KKT), INTENT(OUT) :: PINPRR3D! Rain inst precip 3D +REAL, DIMENSION(KIT,KJT,KKT), INTENT(OUT) :: PEVAP3D! Rain evap profile +REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRS! Snow instant precip +REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRG! Graupel instant precip +REAL, DIMENSION(:,:), INTENT(OUT) :: PINDEP ! Cloud instant deposition +REAL, DIMENSION(KIT,KJT,KKT), INTENT(OUT) :: PRAINFR +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSIGS ! Sigma_s at t +REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(IN) :: PSEA ! Sea Mask +REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(IN) :: PTOWN! Fraction that is town +REAL, DIMENSION(KIT,KJT,KKT), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t +REAL, DIMENSION(KIT,KJT,KKT), OPTIONAL, INTENT(INOUT) :: PRHS ! Hail m.r. source +REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(OUT) :: PINPRH! Hail instant precip +REAL, DIMENSION(KIT,KJT,KKT,KRR), OPTIONAL, INTENT(OUT) :: PFPR ! upper-air precipitation fluxes +! +END SUBROUTINE RAIN_ICE_RED +END INTERFACE +END MODULE MODI_RAIN_ICE_RED +! ######spl + SUBROUTINE RAIN_ICE_RED ( KIT, KJT, KKT, KSIZE, & + OSEDIC, HSEDIM, HSUBG_AUCV_RC, HSUBG_AUCV_RI, & + OWARM,KKA,KKU,KKL,& + PTSTEP, KRR, ODMICRO, PEXN, & + PDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR,& + PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF, & + PTHT, PRVT, PRCT, PRRT, PRIT, PRST, & + PRGT, PTHS, PRVS, PRCS, PRRS, PRIS, PRSS, PRGS, & + PINPRC,PINPRR, PINPRR3D, PEVAP3D, & + PINPRS, PINPRG, PINDEP, PRAINFR, PSIGS, PSEA, PTOWN, & + PRHT, PRHS, PINPRH, PFPR ) +! ###################################################################### +! +!!**** * - compute the explicit microphysical sources +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the slow microphysical sources +!! which can be computed explicitly +!! +!! +!!** METHOD +!! ------ +!! The autoconversion computation follows Kessler (1969). +!! The sedimentation rate is computed with a time spliting technique and +!! an upstream scheme, written as a difference of non-advective fluxes. This +!! source term is added to the future instant ( split-implicit process ). +!! The others microphysical processes are evaluated at the central instant +!! (split-explicit process ): autoconversion, accretion and rain evaporation. +!! These last 3 terms are bounded in order not to create negative values +!! for the water species at the future instant. +!! +!! EXTERNAL +!! -------- +!! None +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_PARAMETERS +!! JPHEXT : Horizontal external points number +!! JPVEXT : Vertical external points number +!! Module MODD_CONF : +!! CCONF configuration of the model for the first time step +!! Module MODD_CST +!! XP00 ! Reference pressure +!! XRD,XRV ! Gaz constant for dry air, vapor +!! XMD,XMV ! Molecular weight for dry air, vapor +!! XCPD ! Cpd (dry air) +!! XCL ! Cl (liquid) +!! XCI ! Ci (solid) +!! XTT ! Triple point temperature +!! XLVTT ! Vaporization heat constant +!! XALPW,XBETAW,XGAMW ! Constants for saturation vapor pressure +!! function over liquid water +!! XALPI,XBETAI,XGAMI ! Constants for saturation vapor pressure +!! function over solid ice +!! Module MODD_BUDGET: +!! NBUMOD : model in which budget is calculated +!! CBUTYPE : type of desired budget +!! 'CART' for cartesian box configuration +!! 'MASK' for budget zone defined by a mask +!! 'NONE' ' for no budget +!! LBU_RTH : logical for budget of RTH (potential temperature) +!! .TRUE. = budget of RTH +!! .FALSE. = no budget of RTH +!! LBU_RRV : logical for budget of RRV (water vapor) +!! .TRUE. = budget of RRV +!! .FALSE. = no budget of RRV +!! LBU_RRC : logical for budget of RRC (cloud water) +!! .TRUE. = budget of RRC +!! .FALSE. = no budget of RRC +!! LBU_RRI : logical for budget of RRI (cloud ice) +!! .TRUE. = budget of RRI +!! .FALSE. = no budget of RRI +!! LBU_RRR : logical for budget of RRR (rain water) +!! .TRUE. = budget of RRR +!! .FALSE. = no budget of RRR +!! LBU_RRS : logical for budget of RRS (aggregates) +!! .TRUE. = budget of RRS +!! .FALSE. = no budget of RRS +!! LBU_RRG : logical for budget of RRG (graupeln) +!! .TRUE. = budget of RRG +!! .FALSE. = no budget of RRG +!! +!! REFERENCE +!! --------- +!! +!! Book1 and Book2 of documentation ( routine RAIN_ICE ) +!! +!! AUTHOR +!! ------ +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original 02/11/95 +!! (J.Viviand) 04/02/97 debug accumulated prcipitation & convert +!! precipitation rate in m/s +!! (J.-P. Pinty) 17/02/97 add budget calls +!! (J.-P. Pinty) 17/11/97 set ice sedim. for cirrus ice, reset RCHONI +!! and RRHONG, reverse order for DEALLOCATE +!! (J.-P. Pinty) 11/02/98 correction of the air dynamical viscosity and +!! add advance of the budget calls +!! (J.-P. Pinty) 18/05/98 correction of the air density in the RIAUTS +!! process +!! (J.-P. Pinty) 18/11/98 split the main routine +!! (V. Masson) 18/11/98 bug in IVEC1 and IVEC2 upper limits +!! (J. Escobar & J.-P. Pinty) +!! 11/12/98 contains and rewrite count+pack +!! (J. Stein & J.-P. Pinty) +!! 14/10/99 correction for very small RIT +!! (J. Escobar & J.-P. Pinty) +!! 24/07/00 correction for very samll m.r. in +!! the sedimentation subroutine +!! (M. Tomasini) 11/05/01 Autoconversion of rc into rr modification to take +!! into account the subgrid variance +!! (cf Redelsperger & Sommeria JAS 86) +!! (G. Molinie) 21/05/99 bug in RRCFRIG process, RHODREF**(-1) missing +!! in RSRIMCG +!! (G. Molinie & J.-P. Pinty) +!! 21/06/99 bug in RACCS process +!! (P. Jabouille) 27/05/04 safety test for case where esw/i(T)> pabs (~Z>40km) +!! (J-.P. Chaboureau) 12/02/05 temperature depending ice-to-snow autocon- +! version threshold (Chaboureau and Pinty GRL 2006) +!! (J.-P. Pinty) 01/01/O1 add the hail category and correction of the +!! wet growth rate of the graupeln +!! (S.Remy & C.Lac) 06/06 Add the cloud sedimentation +!! (S.Remy & C.Lac) 06/06 Sedimentation becoming the last process +!! to settle the precipitating species created during the current time step +!! (S.Remy & C.Lac) 06/06 Modification of the algorithm of sedimentation +!! to settle n times the precipitating species created during Dt/n instead +!! of Dt +!! (C.Lac) 11/06 Optimization of the sedimentation loop for NEC +!! (J.Escobar) 18/01/2008 Parallel Bug in Budget when IMICRO >= 1 +!! --> Path inhibit this test by IMICRO >= 0 allway true +!! (Y.Seity) 03/2008 Add Statistic sedimentation +!! (Y.Seity) 10/2009 Added condition for the raindrop accretion of the aggregates +!! into graupeln process (5.2.6) to avoid negative graupel mixing ratio +!! (V.Masson, C.Lac) 09/2010 Correction in split sedimentation for +!! reproducibility +!! (S. Riette) Oct 2010 Better vectorisation of RAIN_ICE_SEDIMENTATION_STAT +!! (Y. Seity), 02-2012 add possibility to run with reversed vertical levels +!! (L. Bengtsson), 02-2013 Passing in land/sea mask and town fraction in +!! order to use different cloud droplet number conc. over +!! land, sea and urban areas in the cloud sedimentation. +!! (D. Degrauwe), 2013-11: Export upper-air precipitation fluxes PFPR. +!! (S. Riette) Nov 2013 Protection against null sigma +!! (C. Lac) FIT temporal scheme : instant M removed +!! (JP Pinty), 01-2014 : ICE4 : partial reconversion of hail to graupel +!! July, 2015 (O.Nuissier/F.Duffourg) Add microphysics diagnostic for +!! aircraft, ballon and profiler +!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 +!! C.Lac : 10/2016 : add droplet deposition +!! C.Lac : 01/2017 : correction on droplet deposition +!! J.Escobar : 10/2017 : for real*4 , limit exp() in RAIN_ICE_SLOW with XMNH_HUGE_12_LOG +!! (C. Abiven, Y. Léauté, V. Seigner, S. Riette) Phasing of Turner rain subgrid param +!! (S. Riette) Source code split into several files +!! 02/2019 C.Lac add rain fraction as an output field +! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg +! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 +! P. Wautelet 29/05/2019: remove PACK/UNPACK intrinsics (to get more performance and better OpenACC support) +! P. Wautelet 17/01/2020: move Quicksort to tools.f90 +! P. Wautelet 02/2020: use the new data structures and subroutines for budgets +! P. Wautelet 25/02/2020: bugfix: add missing budget: WETH_BU_RRG +!----------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE PARKIND1, ONLY : JPRB +USE YOMHOOK , ONLY : LHOOK, DR_HOOK + +use modd_budget, only: lbu_enable, & + lbudget_th, lbudget_rv, lbudget_rc, lbudget_rr, lbudget_ri, lbudget_rs, lbudget_rg, lbudget_rh, & + NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, NBUDGET_RR, NBUDGET_RI, NBUDGET_RS, NBUDGET_RG, NBUDGET_RH, & + tbudgets +USE MODD_CST, ONLY: XCI,XCL,XCPD,XCPV,XLSTT,XLVTT,XTT +USE MODD_PARAMETERS, ONLY: JPVEXT,XUNDEF +USE MODD_PARAM_ICE, ONLY: CSUBG_PR_PDF,CSUBG_RC_RR_ACCR,CSUBG_RR_EVAP,LDEPOSC,LFEEDBACKT,LSEDIM_AFTER, & + NMAXITER,XMRSTEP,XTSTEP_TS,XVDEPOSC +USE MODD_RAIN_ICE_DESCR, ONLY: XRTMIN +USE MODD_VAR_ll, ONLY: IP + +use mode_budget, only: Budget_store_add, Budget_store_init, Budget_store_end +USE MODE_ll +USE MODE_MSG +use mode_tools, only: Countjv + +USE MODI_ICE4_NUCLEATION_WRAPPER +USE MODI_ICE4_RAINFR_VERT +USE MODI_ICE4_SEDIMENTATION_STAT +USE MODI_ICE4_SEDIMENTATION_SPLIT +USE MODI_ICE4_TENDENCIES + +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +! +! +INTEGER, INTENT(IN) :: KIT, KJT, KKT ! arrays size +INTEGER, INTENT(IN) :: KSIZE +LOGICAL, INTENT(IN) :: OSEDIC ! Switch for droplet sedim. +CHARACTER(LEN=4), INTENT(IN) :: HSEDIM ! Sedimentation scheme +CHARACTER(LEN=4), INTENT(IN) :: HSUBG_AUCV_RC ! Kind of Subgrid autoconversion method +CHARACTER(LEN=80), INTENT(IN) :: HSUBG_AUCV_RI ! Kind of Subgrid autoconversion method +LOGICAL, INTENT(IN) :: OWARM ! .TRUE. allows raindrops to + ! form by warm processes + ! (Kessler scheme) +INTEGER, INTENT(IN) :: KKA !near ground array index +INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO +REAL, INTENT(IN) :: PTSTEP ! Double Time step (single if cold start) +INTEGER, INTENT(IN) :: KRR ! Number of moist variable +LOGICAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: ODMICRO ! mask to limit computation +! +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PEXN ! Exner function +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PDZZ ! Layer thikness (m) +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PPABST ! absolute pressure at t +! +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PCIT ! Pristine ice n.c. at t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PCLDFR ! Convective Mass Flux Cloud fraction +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PHLC_HRC +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PHLC_HCF +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PHLI_HRI +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PHLI_HCF +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRIT ! Pristine ice m.r. at t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRGT ! Graupel/hail m.r. at t +! +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRVS ! Water vapor m.r. source +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRRS ! Rain water m.r. source +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRSS ! Snow/aggregate m.r. source +REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRGS ! Graupel m.r. source +! +REAL, DIMENSION(:,:), INTENT(OUT) :: PINPRC! Cloud instant precip +REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRR! Rain instant precip +REAL, DIMENSION(KIT,KJT,KKT),INTENT(OUT) :: PINPRR3D! Rain inst precip 3D +REAL, DIMENSION(KIT,KJT,KKT), INTENT(OUT) :: PEVAP3D! Rain evap profile +REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRS! Snow instant precip +REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRG! Graupel instant precip +REAL, DIMENSION(:,:), INTENT(OUT) :: PINDEP ! Cloud instant deposition +REAL, DIMENSION(KIT,KJT,KKT), INTENT(OUT) :: PRAINFR +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSIGS ! Sigma_s at t +REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(IN) :: PSEA ! Sea Mask +REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(IN) :: PTOWN! Fraction that is town +REAL, DIMENSION(KIT,KJT,KKT), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t +REAL, DIMENSION(KIT,KJT,KKT), OPTIONAL, INTENT(INOUT) :: PRHS ! Hail m.r. source +REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(OUT) :: PINPRH! Hail instant precip +REAL, DIMENSION(KIT,KJT,KKT,KRR), OPTIONAL, INTENT(OUT) :: PFPR ! upper-air precipitation fluxes +! +!* 0.2 Declarations of local variables : +! +INTEGER :: IIB ! Define the domain where is +INTEGER :: IIE ! the microphysical sources have to be computed +INTEGER :: IJB ! +INTEGER :: IJE ! +INTEGER :: IKB, IKTB ! +INTEGER :: IKE, IKTE ! +! +INTEGER :: JI, JJ, JK +! +!For packing +INTEGER :: IMICRO ! Case r_x>0 locations +INTEGER, DIMENSION(KSIZE) :: I1,I2,I3 ! Used to replace the COUNT +INTEGER :: JL ! and PACK intrinsics +! +!Arrays for nucleation call outisde of LDMICRO points +REAL, DIMENSION(KIT, KJT, KKT) :: ZW ! work array +REAL, DIMENSION(KIT, KJT, KKT) :: ZT ! Temperature +REAL, DIMENSION(KIT, KJT, KKT) :: & + & ZZ_RVHENI_MR, & ! heterogeneous nucleation mixing ratio change + & ZZ_RVHENI ! heterogeneous nucleation +real, dimension(:,:,:), allocatable :: zw1, zw2, zw3, zw4, zw5, zw6 !Work arrays +real, dimension(:,:,:), allocatable :: zz_diff +REAL, DIMENSION(KIT, KJT, KKT) :: ZZ_LVFACT, ZZ_LSFACT +! +!Diagnostics +REAL, DIMENSION(KIT, KJT, KKT) :: & + & ZHLC_HCF3D,& ! HLCLOUDS cloud fraction in high water content part + & ZHLC_LCF3D,& ! HLCLOUDS cloud fraction in low water content part + & ZHLC_HRC3D,& ! HLCLOUDS cloud water content in high water content + & ZHLC_LRC3D,& ! HLCLOUDS cloud water content in low water content + & ZHLI_HCF3D,& ! HLCLOUDS cloud fraction in high ice content part + & ZHLI_LCF3D,& ! HLCLOUDS cloud fraction in low ice content part + & ZHLI_HRI3D,& ! HLCLOUDS cloud water content in high ice content + & ZHLI_LRI3D ! HLCLOUDS cloud water content in high ice content + +REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2)) :: ZINPRI ! Pristine ice instant precip +! +!Packed variables +REAL, DIMENSION(KSIZE) :: ZRVT, & ! Water vapor m.r. at t + & ZRCT, & ! Cloud water m.r. at t + & ZRRT, & ! Rain water m.r. at t + & ZRIT, & ! Pristine ice m.r. at t + & ZRST, & ! Snow/aggregate m.r. at t + & ZRGT, & ! Graupel m.r. at t + & ZRHT, & ! Hail m.r. at t + & ZCIT, & ! Pristine ice conc. at t + & ZTHT, & ! Potential temperature + & ZRHODREF, & ! RHO Dry REFerence + & ZZT, & ! Temperature + & ZPRES, & ! Pressure + & ZEXN, & ! EXNer Pressure + & ZLSFACT, & ! L_s/(Pi*C_ph) + & ZLVFACT, & ! L_v/(Pi*C_ph) + & ZSIGMA_RC,& ! Standard deviation of rc at time t + & ZCF, & ! Cloud fraction + & ZHLC_HCF, & ! HLCLOUDS : fraction of High Cloud Fraction in grid + & ZHLC_LCF, & ! HLCLOUDS : fraction of Low Cloud Fraction in grid + ! note that ZCF = ZHLC_HCF + ZHLC_LCF + & ZHLC_HRC, & ! HLCLOUDS : LWC that is High LWC in grid + & ZHLC_LRC, & ! HLCLOUDS : LWC that is Low LWC in grid + ! note that ZRC = ZHLC_HRC + ZHLC_LRC + & ZHLI_HCF, & + & ZHLI_LCF, & + & ZHLI_HRI, & + & ZHLI_LRI, & + & ZFRAC +! +!Output packed tendencies (for budgets only) +REAL, DIMENSION(KSIZE) :: ZRVHENI_MR, & ! heterogeneous nucleation mixing ratio change + & ZRCHONI, & ! Homogeneous nucleation + & ZRRHONG_MR, & ! Spontaneous freezing mixing ratio change + & ZRVDEPS, & ! Deposition on r_s, + & ZRIAGGS, & ! Aggregation on r_s + & ZRIAUTS, & ! Autoconversion of r_i for r_s production + & ZRVDEPG, & ! Deposition on r_g + & ZRCAUTR, & ! Autoconversion of r_c for r_r production + & ZRCACCR, & ! Accretion of r_c for r_r production + & ZRREVAV, & ! Evaporation of r_r + & ZRIMLTC_MR, & ! Cloud ice melting mixing ratio change + & ZRCBERI, & ! Bergeron-Findeisen effect + & ZRHMLTR, & ! Melting of the hailstones + & ZRSMLTG, & ! Conversion-Melting of the aggregates + & ZRCMLTSR, & ! Cloud droplet collection onto aggregates by positive temperature + & ZRRACCSS, ZRRACCSG, ZRSACCRG, & ! Rain accretion onto the aggregates + & ZRCRIMSS, ZRCRIMSG, ZRSRIMCG, ZRSRIMCG_MR, & ! Cloud droplet riming of the aggregates + & ZRICFRRG, ZRRCFRIG, ZRICFRR, & ! Rain contact freezing + & ZRCWETG, ZRIWETG, ZRRWETG, ZRSWETG, & ! Graupel wet growth + & ZRCDRYG, ZRIDRYG, ZRRDRYG, ZRSDRYG, & ! Graupel dry growth + & ZRWETGH, & ! Conversion of graupel into hail + & ZRWETGH_MR, & ! Conversion of graupel into hail, mr change + & ZRGMLTR, & ! Melting of the graupel + & ZRCWETH, ZRIWETH, ZRSWETH, ZRGWETH, ZRRWETH, & ! Dry growth of hailstone + & ZRCDRYH, ZRIDRYH, ZRSDRYH, ZRRDRYH, ZRGDRYH, & ! Wet growth of hailstone + & ZRDRYHG ! Conversion of hailstone into graupel +! +!Output packed total mixing ratio change (for budgets only) +REAL, DIMENSION(KSIZE) :: ZTOT_RVHENI, & ! heterogeneous nucleation mixing ratio change + & ZTOT_RCHONI, & ! Homogeneous nucleation + & ZTOT_RRHONG, & ! Spontaneous freezing mixing ratio change + & ZTOT_RVDEPS, & ! Deposition on r_s, + & ZTOT_RIAGGS, & ! Aggregation on r_s + & ZTOT_RIAUTS, & ! Autoconversion of r_i for r_s production + & ZTOT_RVDEPG, & ! Deposition on r_g + & ZTOT_RCAUTR, & ! Autoconversion of r_c for r_r production + & ZTOT_RCACCR, & ! Accretion of r_c for r_r production + & ZTOT_RREVAV, & ! Evaporation of r_r + & ZTOT_RCRIMSS, ZTOT_RCRIMSG, ZTOT_RSRIMCG, & ! Cloud droplet riming of the aggregates + & ZTOT_RIMLTC, & ! Cloud ice melting mixing ratio change + & ZTOT_RCBERI, & ! Bergeron-Findeisen effect + & ZTOT_RHMLTR, & ! Melting of the hailstones + & ZTOT_RSMLTG, & ! Conversion-Melting of the aggregates + & ZTOT_RCMLTSR, & ! Cloud droplet collection onto aggregates by positive temperature + & ZTOT_RRACCSS, ZTOT_RRACCSG, ZTOT_RSACCRG, & ! Rain accretion onto the aggregates + & ZTOT_RICFRRG, ZTOT_RRCFRIG, ZTOT_RICFRR, & ! Rain contact freezing + & ZTOT_RCWETG, ZTOT_RIWETG, ZTOT_RRWETG, ZTOT_RSWETG, & ! Graupel wet growth + & ZTOT_RCDRYG, ZTOT_RIDRYG, ZTOT_RRDRYG, ZTOT_RSDRYG, & ! Graupel dry growth + & ZTOT_RWETGH, & ! Conversion of graupel into hail + & ZTOT_RGMLTR, & ! Melting of the graupel + & ZTOT_RCWETH, ZTOT_RIWETH, ZTOT_RSWETH, ZTOT_RGWETH, ZTOT_RRWETH, & ! Dry growth of hailstone + & ZTOT_RCDRYH, ZTOT_RIDRYH, ZTOT_RSDRYH, ZTOT_RRDRYH, ZTOT_RGDRYH, & ! Wet growth of hailstone + & ZTOT_RDRYHG ! Conversion of hailstone into graupel +! +!For time- or mixing-ratio- splitting +REAL, DIMENSION(KSIZE) :: Z0RVT, & ! Water vapor m.r. at the beginig of the current loop + & Z0RCT, & ! Cloud water m.r. at the beginig of the current loop + & Z0RRT, & ! Rain water m.r. at the beginig of the current loop + & Z0RIT, & ! Pristine ice m.r. at the beginig of the current loop + & Z0RST, & ! Snow/aggregate m.r. at the beginig of the current loop + & Z0RGT, & ! Graupel m.r. at the beginig of the current loop + & Z0RHT, & ! Hail m.r. at the beginig of the current loop + & ZA_TH, ZA_RV, ZA_RC, ZA_RR, ZA_RI, ZA_RS, ZA_RG, ZA_RH, & + & ZB_TH, ZB_RV, ZB_RC, ZB_RR, ZB_RI, ZB_RS, ZB_RG, ZB_RH +! +!To take into acount external tendencies inside the splitting +REAL, DIMENSION(KSIZE) :: ZEXT_RV, & ! External tendencie for rv + & ZEXT_RC, & ! External tendencie for rc + & ZEXT_RR, & ! External tendencie for rr + & ZEXT_RI, & ! External tendencie for ri + & ZEXT_RS, & ! External tendencie for rs + & ZEXT_RG, & ! External tendencie for rg + & ZEXT_RH, & ! External tendencie for rh + & ZEXT_TH, & ! External tendencie for th + & ZEXT_WW ! Working array +LOGICAL :: GEXT_TEND +! +INTEGER, DIMENSION(KSIZE) :: IITER ! Number of iterations done (with real tendencies computation) +INTEGER :: INB_ITER_MAX ! Maximum number of iterations (with real tendencies computation) +REAL, DIMENSION(KSIZE) :: ZTIME, & ! Current integration time (starts with 0 and ends with PTSTEP) + & ZMAXTIME, & ! Time on which we can apply the current tendencies + & ZTIME_THRESHOLD, & ! Time to reach threshold + & ZTIME_LASTCALL ! Integration time when last tendecies call has been done +REAL, DIMENSION(KSIZE) :: ZW1D +REAL, DIMENSION(KSIZE) :: ZCOMPUTE ! 1. for points where we must compute tendencies, 0. elsewhere +LOGICAL :: LSOFT ! Must we really compute tendencies or only adjust them to new T variables +LOGICAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2)):: GDEP +REAL :: ZTSTEP ! length of sub-timestep in case of time splitting +REAL :: ZINV_TSTEP ! Inverse ov PTSTEP +REAL, DIMENSION(KSIZE, 8) :: ZRS_TEND +REAL, DIMENSION(KSIZE, 8) :: ZRG_TEND +REAL, DIMENSION(KSIZE, 10) :: ZRH_TEND +REAL, DIMENSION(KSIZE) :: ZSSI +! +!For total tendencies computation +REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: & + &ZW_RVS, ZW_RCS, ZW_RRS, ZW_RIS, ZW_RSS, ZW_RGS, ZW_RHS, ZW_THS +! +!------------------------------------------------------------------------------- +if ( lbu_enable ) then + if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'HENU', pths(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rv ) call Budget_store_init( tbudgets(NBUDGET_RV), 'HENU', prvs(:, :, :) * prhodj(:, :, :) ) +end if +!------------------------------------------------------------------------------- +! +!* 1. COMPUTE THE LOOP BOUNDS +! ----------------------- +! +CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) +IKB=KKA+JPVEXT*KKL +IKE=KKU-JPVEXT*KKL +IKTB=1+JPVEXT +IKTE=KKT-JPVEXT +! +ZINV_TSTEP=1./PTSTEP +GEXT_TEND=.TRUE. +! +! LSFACT and LVFACT without exner +IF(KRR==7) THEN + DO JK = 1, KKT + DO JJ = 1, KJT + DO JI = 1, KIT + ZT(JI,JJ,JK) = PTHT(JI,JJ,JK) * PEXN(JI,JJ,JK) + ZZ_LSFACT(JI,JJ,JK)=(XLSTT+(XCPV-XCI)*(ZT(JI,JJ,JK)-XTT)) & + /( XCPD + XCPV*PRVT(JI,JJ,JK) + XCL*(PRCT(JI,JJ,JK)+PRRT(JI,JJ,JK)) & + + XCI*(PRIT(JI,JJ,JK)+PRST(JI,JJ,JK)+PRGT(JI,JJ,JK)+PRHT(JI,JJ,JK))) + ZZ_LVFACT(JI,JJ,JK)=(XLVTT+(XCPV-XCL)*(ZT(JI,JJ,JK)-XTT)) & + /( XCPD + XCPV*PRVT(JI,JJ,JK) + XCL*(PRCT(JI,JJ,JK)+PRRT(JI,JJ,JK)) & + + XCI*(PRIT(JI,JJ,JK)+PRST(JI,JJ,JK)+PRGT(JI,JJ,JK)+PRHT(JI,JJ,JK))) + ENDDO + ENDDO + ENDDO +ELSE + DO JK = 1, KKT + DO JJ = 1, KJT + DO JI = 1, KIT + ZT(JI,JJ,JK) = PTHT(JI,JJ,JK) * PEXN(JI,JJ,JK) + ZZ_LSFACT(JI,JJ,JK)=(XLSTT+(XCPV-XCI)*(ZT(JI,JJ,JK)-XTT)) & + /( XCPD + XCPV*PRVT(JI,JJ,JK) + XCL*(PRCT(JI,JJ,JK)+PRRT(JI,JJ,JK)) & + + XCI*(PRIT(JI,JJ,JK)+PRST(JI,JJ,JK)+PRGT(JI,JJ,JK))) + ZZ_LVFACT(JI,JJ,JK)=(XLVTT+(XCPV-XCL)*(ZT(JI,JJ,JK)-XTT)) & + /( XCPD + XCPV*PRVT(JI,JJ,JK) + XCL*(PRCT(JI,JJ,JK)+PRRT(JI,JJ,JK)) & + + XCI*(PRIT(JI,JJ,JK)+PRST(JI,JJ,JK)+PRGT(JI,JJ,JK))) + ENDDO + ENDDO + ENDDO +ENDIF +! +!------------------------------------------------------------------------------- +! +!* 2. COMPUTE THE SEDIMENTATION (RS) SOURCE +! ------------------------------------- +! +IF(.NOT. LSEDIM_AFTER) THEN + ! + !* 2.1 sedimentation + ! + if ( lbudget_rc .and. osedic ) call Budget_store_init( tbudgets(NBUDGET_RC), 'SEDI', prcs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_init( tbudgets(NBUDGET_RR), 'SEDI', prrs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), 'SEDI', pris(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rs ) call Budget_store_init( tbudgets(NBUDGET_RS), 'SEDI', prss(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rg ) call Budget_store_init( tbudgets(NBUDGET_RG), 'SEDI', prgs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rh ) call Budget_store_init( tbudgets(NBUDGET_RH), 'SEDI', prhs(:, :, :) * prhodj(:, :, :) ) + + !Init only if not osedic (to prevent crash with double init) + !Remark: the 2 source terms SEDI and DEPO could be mixed and stored in the same source term (SEDI) + ! if osedic=T and ldeposc=T (a warning is printed in ini_budget in that case) + if ( lbudget_rc .and. ldeposc .and. .not.osedic ) & + call Budget_store_init( tbudgets(NBUDGET_RC), 'DEPO', prcs(:, :, :) * prhodj(:, :, :) ) + + IF(HSEDIM=='STAT') THEN + !SR: It *seems* that we must have two separate calls for ifort + IF(KRR==7) THEN + CALL ICE4_SEDIMENTATION_STAT(IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, IKTB, IKTE, KKT, KKL, & + &PTSTEP, KRR, OSEDIC, LDEPOSC, XVDEPOSC, PDZZ, & + &PRHODREF, PPABST, PTHT, PRHODJ, & + &PRCS, PRCS*PTSTEP, PRRS, PRRS*PTSTEP, PRIS, PRIS*PTSTEP,& + &PRSS, PRSS*PTSTEP, PRGS, PRGS*PTSTEP,& + &PINPRC, PINDEP, PINPRR, ZINPRI, PINPRS, PINPRG, & + &PSEA=PSEA, PTOWN=PTOWN, & + &PINPRH=PINPRH, PRHT=PRHS*PTSTEP, PRHS=PRHS, PFPR=PFPR) + ELSE + CALL ICE4_SEDIMENTATION_STAT(IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, IKTB, IKTE, KKT, KKL, & + &PTSTEP, KRR, OSEDIC, LDEPOSC, XVDEPOSC, PDZZ, & + &PRHODREF, PPABST, PTHT, PRHODJ, & + &PRCS, PRCS*PTSTEP, PRRS, PRRS*PTSTEP, PRIS, PRIS*PTSTEP,& + &PRSS, PRSS*PTSTEP, PRGS, PRGS*PTSTEP,& + &PINPRC, PINDEP, PINPRR, ZINPRI, PINPRS, PINPRG, & + &PSEA=PSEA, PTOWN=PTOWN, & + &PFPR=PFPR) + ENDIF + PINPRS(:,:) = PINPRS(:,:) + ZINPRI(:,:) + !No negativity correction here as we apply sedimentation on PR.S*PTSTEP variables + ELSEIF(HSEDIM=='SPLI') THEN + !SR: It *seems* that we must have two separate calls for ifort + IF(KRR==7) THEN + CALL ICE4_SEDIMENTATION_SPLIT(IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, IKTB, IKTE, KKT, KKL, & + &PTSTEP, KRR, OSEDIC, LDEPOSC, XVDEPOSC, PDZZ, & + &PRHODREF, PPABST, PTHT, PRHODJ, & + &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,& + &PINPRC, PINDEP, PINPRR, ZINPRI, PINPRS, PINPRG, & + &PSEA=PSEA, PTOWN=PTOWN, & + &PINPRH=PINPRH, PRHT=PRHT, PRHS=PRHS, PFPR=PFPR) + ELSE + CALL ICE4_SEDIMENTATION_SPLIT(IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, IKTB, IKTE, KKT, KKL, & + &PTSTEP, KRR, OSEDIC, LDEPOSC, XVDEPOSC, PDZZ, & + &PRHODREF, PPABST, PTHT, PRHODJ, & + &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,& + &PINPRC, PINDEP, PINPRR, ZINPRI, PINPRS, PINPRG, & + &PSEA=PSEA, PTOWN=PTOWN, & + &PFPR=PFPR) + ENDIF + PINPRS(:,:) = PINPRS(:,:) + ZINPRI(:,:) + !We correct negativities with conservation + !SPLI algorith uses a time-splitting. Inside the loop a temporary m.r. is used. + ! It is initialized with the m.r. at T and is modified by two tendencies: + ! sedimentation tendency and an external tendency which represents all other + ! processes (mainly advection and microphysical processes). If both tendencies + ! are negative, sedimentation can remove a specie at a given sub-timestep. From + ! this point sedimentation stops for the remaining sub-timesteps but the other tendency + ! will be still active and will lead to negative values. + ! We could prevent the algorithm to not consume too much a specie, instead we apply + ! a correction here. + CALL CORRECT_NEGATIVITIES(KIT, KJT, KKT, KRR, PRVS, PRCS, PRRS, & + &PRIS, PRSS, PRGS, & + &PTHS, ZZ_LVFACT, ZZ_LSFACT, PRHS) + ELSEIF(HSEDIM=='NONE') THEN + ELSE + call Print_msg( NVERB_FATAL, 'GEN', 'RAIN_ICE_RED', 'no sedimentation scheme for HSEDIM='//HSEDIM ) + END IF + ! + !* 2.2 budget storage + ! + if ( lbudget_rc .and. osedic ) call Budget_store_end( tbudgets(NBUDGET_RC), 'SEDI', prcs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_end( tbudgets(NBUDGET_RR), 'SEDI', prrs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'SEDI', pris(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rs ) call Budget_store_end( tbudgets(NBUDGET_RS), 'SEDI', prss(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rg ) call Budget_store_end( tbudgets(NBUDGET_RG), 'SEDI', prgs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rh ) call Budget_store_end( tbudgets(NBUDGET_RH), 'SEDI', prhs(:, :, :) * prhodj(:, :, :) ) + + !If osedic=T and ldeposc=T, DEPO is in fact mixed and stored with the SEDI source term + !(a warning is printed in ini_budget in that case) + if ( lbudget_rc .and. ldeposc .and. .not.osedic) & + call Budget_store_end( tbudgets(NBUDGET_RC), 'DEPO', prcs(:, :, :) * prhodj(:, :, :) ) +ENDIF +! +!------------------------------------------------------------------------------- +! +!* 3. PACKING +! -------- +! optimization by looking for locations where +! the microphysical fields are larger than a minimal value only !!! +! +IMICRO=0 +IF(KSIZE/=0) IMICRO=COUNTJV(ODMICRO(:,:,:), I1(:), I2(:), I3(:)) +!Packing +IF(IMICRO>0) THEN + DO JL=1, IMICRO + ZRVT(JL) = PRVT(I1(JL),I2(JL),I3(JL)) + ZRCT(JL) = PRCT(I1(JL),I2(JL),I3(JL)) + ZRRT(JL) = PRRT(I1(JL),I2(JL),I3(JL)) + ZRIT(JL) = PRIT(I1(JL),I2(JL),I3(JL)) + ZRST(JL) = PRST(I1(JL),I2(JL),I3(JL)) + ZRGT(JL) = PRGT(I1(JL),I2(JL),I3(JL)) + ZCIT(JL) = PCIT(I1(JL),I2(JL),I3(JL)) + ZCF(JL) = PCLDFR(I1(JL),I2(JL),I3(JL)) + ZRHODREF(JL) = PRHODREF(I1(JL),I2(JL),I3(JL)) + ZTHT(JL) = PTHT(I1(JL),I2(JL),I3(JL)) + ZPRES(JL) = PPABST(I1(JL),I2(JL),I3(JL)) + ZEXN(JL) = PEXN(I1(JL),I2(JL),I3(JL)) + ZHLC_HCF(JL) = PHLC_HCF(I1(JL),I2(JL),I3(JL)) + ZHLC_HRC(JL) = PHLC_HRC(I1(JL),I2(JL),I3(JL)) + ZHLC_LRC(JL) = ZRCT(JL) - ZHLC_HRC(JL) + ZHLI_HCF(JL) = PHLI_HCF(I1(JL),I2(JL),I3(JL)) + ZHLI_HRI(JL) = PHLI_HRI(I1(JL),I2(JL),I3(JL)) + ZHLI_LRI(JL) = ZRIT(JL) - ZHLI_HRI(JL) + IF(ZRCT(JL)>0.) THEN + ZHLC_LCF(JL) = ZCF(JL)- ZHLC_HCF(JL) + ELSE + ZHLC_LCF(JL)=0. + ENDIF + IF(ZRIT(JL)>0.) THEN + ZHLI_LCF(JL) = ZCF(JL)- ZHLI_HCF(JL) + ELSE + ZHLI_LCF(JL)=0. + ENDIF + ENDDO + IF(GEXT_TEND) THEN + DO JL=1, IMICRO + ZEXT_RV(JL) = PRVS(I1(JL),I2(JL),I3(JL)) - ZRVT(JL)*ZINV_TSTEP + ZEXT_RC(JL) = PRCS(I1(JL),I2(JL),I3(JL)) - ZRCT(JL)*ZINV_TSTEP + ZEXT_RR(JL) = PRRS(I1(JL),I2(JL),I3(JL)) - ZRRT(JL)*ZINV_TSTEP + ZEXT_RI(JL) = PRIS(I1(JL),I2(JL),I3(JL)) - ZRIT(JL)*ZINV_TSTEP + ZEXT_RS(JL) = PRSS(I1(JL),I2(JL),I3(JL)) - ZRST(JL)*ZINV_TSTEP + ZEXT_RG(JL) = PRGS(I1(JL),I2(JL),I3(JL)) - ZRGT(JL)*ZINV_TSTEP + ZEXT_TH(JL) = PTHS(I1(JL),I2(JL),I3(JL)) - ZTHT(JL)*ZINV_TSTEP + !The th tendency is not related to a mixing ratio change, there is no exn/exnref issue here + ENDDO + ENDIF + IF(HSUBG_AUCV_RC=='PDF ' .AND. CSUBG_PR_PDF=='SIGM') THEN + DO JL=1, IMICRO + ZSIGMA_RC(JL) = PSIGS(I1(JL),I2(JL),I3(JL))*2. + ENDDO + ENDIF + IF(KRR==7) THEN + DO JL=1, IMICRO + ZRHT(JL) = PRHT(I1(JL),I2(JL),I3(JL)) + ENDDO + IF(GEXT_TEND) THEN + DO JL=1, IMICRO + ZEXT_RH(JL) = PRHS(I1(JL),I2(JL),I3(JL)) - ZRHT(JL)*ZINV_TSTEP + ENDDO + ENDIF + ELSE + ZRHT(:)=0. + IF(GEXT_TEND) ZEXT_RH(:)=0. + ENDIF + IF(LBU_ENABLE) THEN + ZTOT_RVHENI(:)=0. + ZTOT_RCHONI(:)=0. + ZTOT_RRHONG(:)=0. + ZTOT_RVDEPS(:)=0. + ZTOT_RIAGGS(:)=0. + ZTOT_RIAUTS(:)=0. + ZTOT_RVDEPG(:)=0. + ZTOT_RCAUTR(:)=0. + ZTOT_RCACCR(:)=0. + ZTOT_RREVAV(:)=0. + ZTOT_RCRIMSS(:)=0. + ZTOT_RCRIMSG(:)=0. + ZTOT_RSRIMCG(:)=0. + ZTOT_RIMLTC(:)=0. + ZTOT_RCBERI(:)=0. + ZTOT_RHMLTR(:)=0. + ZTOT_RSMLTG(:)=0. + ZTOT_RCMLTSR(:)=0. + ZTOT_RRACCSS(:)=0. + ZTOT_RRACCSG(:)=0. + ZTOT_RSACCRG(:)=0. + ZTOT_RICFRRG(:)=0. + ZTOT_RRCFRIG(:)=0. + ZTOT_RICFRR(:)=0. + ZTOT_RCWETG(:)=0. + ZTOT_RIWETG(:)=0. + ZTOT_RRWETG(:)=0. + ZTOT_RSWETG(:)=0. + ZTOT_RCDRYG(:)=0. + ZTOT_RIDRYG(:)=0. + ZTOT_RRDRYG(:)=0. + ZTOT_RSDRYG(:)=0. + ZTOT_RWETGH(:)=0. + ZTOT_RGMLTR(:)=0. + ZTOT_RCWETH(:)=0. + ZTOT_RIWETH(:)=0. + ZTOT_RSWETH(:)=0. + ZTOT_RGWETH(:)=0. + ZTOT_RRWETH(:)=0. + ZTOT_RCDRYH(:)=0. + ZTOT_RIDRYH(:)=0. + ZTOT_RSDRYH(:)=0. + ZTOT_RRDRYH(:)=0. + ZTOT_RGDRYH(:)=0. + ZTOT_RDRYHG(:)=0. + ENDIF +ENDIF +!------------------------------------------------------------------------------- +! +!* 4. LOOP +! ---- +! +!Maximum number of iterations +!We only count real iterations (those for which we *compute* tendencies) +INB_ITER_MAX=NMAXITER +IF(XTSTEP_TS/=0.)THEN + INB_ITER_MAX=MAX(1, INT(PTSTEP/XTSTEP_TS)) !At least the number of iterations needed for the time-splitting + ZTSTEP=PTSTEP/INB_ITER_MAX + INB_ITER_MAX=MAX(NMAXITER, INB_ITER_MAX) !For the case XMRSTEP/=0. at the same time +ENDIF +IITER(:)=0 +ZTIME(:)=0. ! Current integration time (all points may have a different integration time) +DO WHILE(ANY(ZTIME(:)<PTSTEP)) ! Loop to *really* compute tendencies + IF(XMRSTEP/=0.) THEN + ! In this case we need to remember the mixing ratios used to compute the tendencies + ! because when mixing ratio has evolved more than a threshold, we must re-compute tendecies + DO JL=1, IMICRO + Z0RVT(JL)=ZRVT(JL) + Z0RCT(JL)=ZRCT(JL) + Z0RRT(JL)=ZRRT(JL) + Z0RIT(JL)=ZRIT(JL) + Z0RST(JL)=ZRST(JL) + Z0RGT(JL)=ZRGT(JL) + Z0RHT(JL)=ZRHT(JL) + ENDDO + ENDIF + IF(XTSTEP_TS/=0.) THEN + ! In this case we need to remember the time when tendencies were computed + ! because when time has evolved more than a limit, we must re-compute tendecies + ZTIME_LASTCALL(:)=ZTIME(:) + ENDIF + ZCOMPUTE(:)=MAX(0., -SIGN(1., ZTIME(:)-PTSTEP)) ! Compuation (1.) only for points for which integration time has not reached the timestep + LSOFT=.FALSE. ! We *really* compute the tendencies + IITER(:)=IITER(:)+INT(ZCOMPUTE(:)) + DO WHILE(SUM(ZCOMPUTE(:))>0.) ! Loop to adjust tendencies when we cross the 0°C or when a specie disappears + IF(KRR==7) THEN + DO JL=1, IMICRO + ZZT(JL) = ZTHT(JL) * ZEXN(JL) + ZLSFACT(JL)=(XLSTT+(XCPV-XCI)*(ZZT(JL)-XTT)) & + &/( (XCPD + XCPV*ZRVT(JL) + XCL*(ZRCT(JL)+ZRRT(JL)) & + &+ XCI*(ZRIT(JL)+ZRST(JL)+ZRGT(JL)+ZRHT(JL)))*ZEXN(JL) ) + ZLVFACT(JL)=(XLVTT+(XCPV-XCL)*(ZZT(JL)-XTT)) & + &/( (XCPD + XCPV*ZRVT(JL) + XCL*(ZRCT(JL)+ZRRT(JL)) & + &+ XCI*(ZRIT(JL)+ZRST(JL)+ZRGT(JL)+ZRHT(JL)))*ZEXN(JL) ) + ENDDO + ELSE + DO JL=1, IMICRO + ZZT(JL) = ZTHT(JL) * ZEXN(JL) + ZLSFACT(JL)=(XLSTT+(XCPV-XCI)*(ZZT(JL)-XTT)) & + &/( (XCPD + XCPV*ZRVT(JL) + XCL*(ZRCT(JL)+ZRRT(JL)) & + &+ XCI*(ZRIT(JL)+ZRST(JL)+ZRGT(JL)))*ZEXN(JL) ) + ZLVFACT(JL)=(XLVTT+(XCPV-XCL)*(ZZT(JL)-XTT)) & + &/( (XCPD + XCPV*ZRVT(JL) + XCL*(ZRCT(JL)+ZRRT(JL)) & + &+ XCI*(ZRIT(JL)+ZRST(JL)+ZRGT(JL)))*ZEXN(JL) ) + ENDDO + ENDIF + ! + !*** 4.1 Tendecies computation + ! + ! Tendencies are *really* computed when LSOFT==.FALSE. and only adjusted otherwise + CALL ICE4_TENDENCIES(IMICRO, IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, KKT, KKL, & + &KRR, LSOFT, ZCOMPUTE, & + &OWARM, CSUBG_RC_RR_ACCR, CSUBG_RR_EVAP, & + &HSUBG_AUCV_RC, HSUBG_AUCV_RI, CSUBG_PR_PDF, & + &ZEXN, ZRHODREF, ZLVFACT, ZLSFACT, I1, I2, I3, & + &ZPRES, ZCF, ZSIGMA_RC,& + &ZCIT, & + &ZZT, ZTHT, & + &ZRVT, ZRCT, ZRRT, ZRIT, ZRST, ZRGT, ZRHT, & + &ZRVHENI_MR, ZRRHONG_MR, ZRIMLTC_MR, ZRSRIMCG_MR, & + &ZRCHONI, ZRVDEPS, ZRIAGGS, ZRIAUTS, ZRVDEPG, & + &ZRCAUTR, ZRCACCR, ZRREVAV, & + &ZRCRIMSS, ZRCRIMSG, ZRSRIMCG, ZRRACCSS, ZRRACCSG, ZRSACCRG, ZRSMLTG, ZRCMLTSR, & + &ZRICFRRG, ZRRCFRIG, ZRICFRR, ZRCWETG, ZRIWETG, ZRRWETG, ZRSWETG, & + &ZRCDRYG, ZRIDRYG, ZRRDRYG, ZRSDRYG, ZRWETGH, ZRWETGH_MR, ZRGMLTR, & + &ZRCWETH, ZRIWETH, ZRSWETH, ZRGWETH, ZRRWETH, & + &ZRCDRYH, ZRIDRYH, ZRSDRYH, ZRRDRYH, ZRGDRYH, ZRDRYHG, ZRHMLTR, & + &ZRCBERI, & + &ZRS_TEND, ZRG_TEND, ZRH_TEND, ZSSI, & + &ZA_TH, ZA_RV, ZA_RC, ZA_RR, ZA_RI, ZA_RS, ZA_RG, ZA_RH, & + &ZB_TH, ZB_RV, ZB_RC, ZB_RR, ZB_RI, ZB_RS, ZB_RG, ZB_RH, & + &ZHLC_HCF, ZHLC_LCF, ZHLC_HRC, ZHLC_LRC, & + &ZHLI_HCF, ZHLI_LCF, ZHLI_HRI, ZHLI_LRI, PRAINFR) + ! External tendencies + IF(GEXT_TEND) THEN + DO JL=1, IMICRO + ZA_TH(JL) = ZA_TH(JL) + ZEXT_TH(JL) + ZA_RV(JL) = ZA_RV(JL) + ZEXT_RV(JL) + ZA_RC(JL) = ZA_RC(JL) + ZEXT_RC(JL) + ZA_RR(JL) = ZA_RR(JL) + ZEXT_RR(JL) + ZA_RI(JL) = ZA_RI(JL) + ZEXT_RI(JL) + ZA_RS(JL) = ZA_RS(JL) + ZEXT_RS(JL) + ZA_RG(JL) = ZA_RG(JL) + ZEXT_RG(JL) + ZA_RH(JL) = ZA_RH(JL) + ZEXT_RH(JL) + ENDDO + ENDIF + ! + !*** 4.2 Integration time + ! + ! If we can, we will use these tendencies until the end of the timestep + ZMAXTIME(:)=ZCOMPUTE(:) * (PTSTEP-ZTIME(:)) ! Remaining time until the end of the timestep + + !We need to adjust tendencies when temperature reaches 0 + IF(LFEEDBACKT) THEN + DO JL=1, IMICRO + !Is ZB_TH enough to change temperature sign? + ZW1D(JL)=(ZTHT(JL) - XTT/ZEXN(JL)) * (ZTHT(JL) + ZB_TH(JL) - XTT/ZEXN(JL)) + ZMAXTIME(JL)=ZMAXTIME(JL)*MAX(0., SIGN(1., ZW1D(JL))) + !Can ZA_TH make temperature change of sign? + ZW1D(JL)=MAX(0., -SIGN(1., 1.E-20 - ABS(ZA_TH(JL)))) ! WHERE(ABS(ZA_TH(:))>1.E-20) + ZTIME_THRESHOLD(JL)=(1. - ZW1D(JL))*(-1.) + & + ZW1D(JL) * & + (XTT/ZEXN(JL) - ZB_TH(JL) - ZTHT(JL))/ & + SIGN(MAX(ABS(ZA_TH(JL)), 1.E-20), ZA_TH(JL)) + ZW1D(JL)=MAX(0., -SIGN(1., 1.E-20 - ZTIME_THRESHOLD(JL))) ! WHERE(ZTIME_THRESHOLD(:)>1.E-20) + ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + & + ZW1D(JL) * MIN(ZMAXTIME(JL), ZTIME_THRESHOLD(JL)) + ENDDO + ENDIF + + !We need to adjust tendencies when a specy disappears + !When a species is missing, only the external tendencies can be negative (and we must keep track of it) + DO JL=1, IMICRO + ZW1D(JL)=MAX(0., -SIGN(1., ZA_RV(JL)+1.E-20)) * & ! WHERE(ZA_RV(:)<-1.E-20) + &MAX(0., -SIGN(1., XRTMIN(1)-ZRVT(JL))) ! WHERE(ZRVT(:)>XRTMIN(1)) + ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + & + &ZW1D(JL) * MIN(ZMAXTIME(JL), -(ZB_RV(JL)+ZRVT(JL))/MIN(ZA_RV(JL), -1.E-20)) + + ZW1D(JL)=MAX(0., -SIGN(1., ZA_RC(JL)+1.E-20)) * & ! WHERE(ZA_RC(:)<-1.E-20) + &MAX(0., -SIGN(1., XRTMIN(2)-ZRCT(JL))) ! WHERE(ZRCT(:)>XRTMIN(2)) + ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + & + &ZW1D(JL) * MIN(ZMAXTIME(JL), -(ZB_RC(JL)+ZRCT(JL))/MIN(ZA_RC(JL), -1.E-20)) + + ZW1D(JL)=MAX(0., -SIGN(1., ZA_RR(JL)+1.E-20)) * & ! WHERE(ZA_RR(:)<-1.E-20) + &MAX(0., -SIGN(1., XRTMIN(3)-ZRRT(JL))) ! WHERE(ZRRT(:)>XRTMIN(3)) + ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + & + &ZW1D(JL) * MIN(ZMAXTIME(JL), -(ZB_RR(JL)+ZRRT(JL))/MIN(ZA_RR(JL), -1.E-20)) + + ZW1D(JL)=MAX(0., -SIGN(1., ZA_RI(JL)+1.E-20)) * & ! WHERE(ZI_RV(:)<-1.E-20) + &MAX(0., -SIGN(1., XRTMIN(4)-ZRIT(JL))) ! WHERE(ZRIT(:)>XRTMIN(4)) + ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + & + &ZW1D(JL) * MIN(ZMAXTIME(JL), -(ZB_RI(JL)+ZRIT(JL))/MIN(ZA_RI(JL), -1.E-20)) + + ZW1D(JL)=MAX(0., -SIGN(1., ZA_RS(JL)+1.E-20)) * & ! WHERE(ZA_RS(:)<-1.E-20) + &MAX(0., -SIGN(1., XRTMIN(5)-ZRST(JL))) ! WHERE(ZRST(:)>XRTMIN(5)) + ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + & + &ZW1D(JL) * MIN(ZMAXTIME(JL), -(ZB_RS(JL)+ZRST(JL))/MIN(ZA_RS(JL), -1.E-20)) + + ZW1D(JL)=MAX(0., -SIGN(1., ZA_RG(JL)+1.E-20)) * & ! WHERE(ZA_RG(:)<-1.E-20) + &MAX(0., -SIGN(1., XRTMIN(6)-ZRGT(JL))) ! WHERE(ZRGT(:)>XRTMIN(6)) + ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + & + &ZW1D(JL) * MIN(ZMAXTIME(JL), -(ZB_RG(JL)+ZRGT(JL))/MIN(ZA_RG(JL), -1.E-20)) + ENDDO + + IF(KRR==7) THEN + DO JL=1, IMICRO + ZW1D(JL)=MAX(0., -SIGN(1., ZA_RH(JL)+1.E-20)) * & ! WHERE(ZA_RH(:)<-1.E-20) + &MAX(0., -SIGN(1., XRTMIN(7)-ZRHT(JL))) ! WHERE(ZRHT(:)>XRTMIN(7)) + ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + & + &ZW1D(JL) * MIN(ZMAXTIME(JL), -(ZB_RH(JL)+ZRHT(JL))/MIN(ZA_RH(JL), -1.E-20)) + ENDDO + ENDIF + + !We stop when the end of the timestep is reached + ZCOMPUTE(:)=ZCOMPUTE(:) * MAX(0., -SIGN(1., ZTIME(:)+ZMAXTIME(:)-PTSTEP)) + + !We must recompute tendencies when the end of the sub-timestep is reached + IF(XTSTEP_TS/=0.) THEN + DO JL=1, IMICRO + ZW1D(JL)=MAX(0., -SIGN(1., IITER(JL)-INB_ITER_MAX+0.)) * & ! WHERE(IITER(:)<INB_ITER_MAX) + &MAX(0., -SIGN(1., ZTIME_LASTCALL(JL)+ZTSTEP-ZTIME(JL)-ZMAXTIME(JL))) ! WHERE(ZTIME(:)+ZMAXTIME(:)>ZTIME_LASTCALL(:)+ZTSTEP) + ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + & + &ZW1D(JL) * (ZTIME_LASTCALL(JL)-ZTIME(JL)+ZTSTEP) + ZCOMPUTE(JL)=ZCOMPUTE(JL) * (1. - ZW1D(JL)) + ENDDO + ENDIF + + !We must recompute tendencies when the maximum allowed change is reached + !When a specy is missing, only the external tendencies can be active and we do not want to recompute + !the microphysical tendencies when external tendencies are negative (results won't change because specy was already missing) + IF(XMRSTEP/=0.) THEN + DO JL=1, IMICRO + ZW1D(JL)=MAX(0., -SIGN(1., IITER(JL)-INB_ITER_MAX+0.)) * & ! WHERE(IITER(:)<INB_ITER_MAX) + &MAX(0., -SIGN(1., 1.E-20-ABS(ZA_RV(JL)))) ! WHERE(ABS(ZA_RV(:))>1.E-20) + ZTIME_THRESHOLD(JL)=(1.-ZW1D(JL))*(-1.) + & + &ZW1D(JL)*(SIGN(1., ZA_RV(JL))*XMRSTEP+Z0RVT(JL)-ZRVT(JL)-ZB_RV(JL))/ & + &SIGN(MAX(ABS(ZA_RV(JL)), 1.E-20), ZA_RV(JL)) + ZW1D(JL)=MAX(0., SIGN(1., ZTIME_THRESHOLD(JL))) * & !WHERE(ZTIME_THRESHOLD(:)>=0.) + &MAX(0., -SIGN(1., ZTIME_THRESHOLD(JL)-ZMAXTIME(JL))) * & !WHERE(ZTIME_THRESHOLD(:)<ZMAXTIME(:)) + &MIN(1., MAX(0., -SIGN(1., XRTMIN(6)-ZRVT(JL))) + & !WHERE(ZRVT(:)>XRTMIN(6)) .OR. + &MAX(0., -SIGN(1., -ZA_RV(JL)))) !WHERE(ZA_RV(:)>0.) + ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + & + &ZW1D(JL)*MIN(ZMAXTIME(JL), ZTIME_THRESHOLD(JL)) + ZCOMPUTE(JL)=ZCOMPUTE(JL) * (1. - ZW1D(JL)) + + ZW1D(JL)=MAX(0., -SIGN(1., IITER(JL)-INB_ITER_MAX+0.)) * & ! WHERE(IITER(:)<INB_ITER_MAX) + &MAX(0., -SIGN(1., 1.E-20-ABS(ZA_RC(JL)))) ! WHERE(ABS(ZA_RC(:))>1.E-20) + ZTIME_THRESHOLD(JL)=(1.-ZW1D(JL))*(-1.) + & + &ZW1D(JL)*(SIGN(1., ZA_RC(JL))*XMRSTEP+Z0RCT(JL)-ZRCT(JL)-ZB_RC(JL))/ & + &SIGN(MAX(ABS(ZA_RC(JL)), 1.E-20), ZA_RC(JL)) + ZW1D(JL)=MAX(0., SIGN(1., ZTIME_THRESHOLD(JL))) * & !WHERE(ZTIME_THRESHOLD(:)>=0.) + &MAX(0., -SIGN(1., ZTIME_THRESHOLD(JL)-ZMAXTIME(JL))) * & !WHERE(ZTIME_THRESHOLD(:)<ZMAXTIME(:)) + &MIN(1., MAX(0., -SIGN(1., XRTMIN(6)-ZRCT(JL))) + & !WHERE(ZRCT(:)>XRTMIN(6)) .OR. + &MAX(0., -SIGN(1., -ZA_RC(JL)))) !WHERE(ZA_RC(:)>0.) + ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + & + &ZW1D(JL)*MIN(ZMAXTIME(JL), ZTIME_THRESHOLD(JL)) + ZCOMPUTE(JL)=ZCOMPUTE(JL) * (1. - ZW1D(JL)) + + ZW1D(JL)=MAX(0., -SIGN(1., IITER(JL)-INB_ITER_MAX+0.)) * & ! WHERE(IITER(:)<INB_ITER_MAX) + &MAX(0., -SIGN(1., 1.E-20-ABS(ZA_RR(JL)))) ! WHERE(ABS(ZA_RR(:))>1.E-20) + ZTIME_THRESHOLD(JL)=(1.-ZW1D(JL))*(-1.) + & + &ZW1D(JL)*(SIGN(1., ZA_RR(JL))*XMRSTEP+Z0RRT(JL)-ZRRT(JL)-ZB_RR(JL))/ & + &SIGN(MAX(ABS(ZA_RR(JL)), 1.E-20), ZA_RR(JL)) + ZW1D(JL)=MAX(0., SIGN(1., ZTIME_THRESHOLD(JL))) * & !WHERE(ZTIME_THRESHOLD(:)>=0.) + &MAX(0., -SIGN(1., ZTIME_THRESHOLD(JL)-ZMAXTIME(JL))) * & !WHERE(ZTIME_THRESHOLD(:)<ZMAXTIME(:)) + &MIN(1., MAX(0., -SIGN(1., XRTMIN(6)-ZRRT(JL))) + & !WHERE(ZRRT(:)>XRTMIN(6)) .OR. + &MAX(0., -SIGN(1., -ZA_RR(JL)))) !WHERE(ZA_RR(:)>0.) + ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + & + &ZW1D(JL)*MIN(ZMAXTIME(JL), ZTIME_THRESHOLD(JL)) + ZCOMPUTE(JL)=ZCOMPUTE(JL) * (1. - ZW1D(JL)) + + ZW1D(JL)=MAX(0., -SIGN(1., IITER(JL)-INB_ITER_MAX+0.)) * & ! WHERE(IITER(:)<INB_ITER_MAX) + &MAX(0., -SIGN(1., 1.E-20-ABS(ZA_RI(JL)))) ! WHERE(ABS(ZA_RI(:))>1.E-20) + ZTIME_THRESHOLD(JL)=(1.-ZW1D(JL))*(-1.) + & + &ZW1D(JL)*(SIGN(1., ZA_RI(JL))*XMRSTEP+Z0RIT(JL)-ZRIT(JL)-ZB_RI(JL))/ & + &SIGN(MAX(ABS(ZA_RI(JL)), 1.E-20), ZA_RI(JL)) + ZW1D(JL)=MAX(0., SIGN(1., ZTIME_THRESHOLD(JL))) * & !WHERE(ZTIME_THRESHOLD(:)>=0.) + &MAX(0., -SIGN(1., ZTIME_THRESHOLD(JL)-ZMAXTIME(JL))) * & !WHERE(ZTIME_THRESHOLD(:)<ZMAXTIME(:)) + &MIN(1., MAX(0., -SIGN(1., XRTMIN(6)-ZRIT(JL))) + & !WHERE(ZRIT(:)>XRTMIN(6)) .OR. + &MAX(0., -SIGN(1., -ZA_RI(JL)))) !WHERE(ZA_RI(:)>0.) + ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + & + &ZW1D(JL)*MIN(ZMAXTIME(JL), ZTIME_THRESHOLD(JL)) + ZCOMPUTE(JL)=ZCOMPUTE(JL) * (1. - ZW1D(JL)) + + ZW1D(JL)=MAX(0., -SIGN(1., IITER(JL)-INB_ITER_MAX+0.)) * & ! WHERE(IITER(:)<INB_ITER_MAX) + &MAX(0., -SIGN(1., 1.E-20-ABS(ZA_RS(JL)))) ! WHERE(ABS(ZA_RS(:))>1.E-20) + ZTIME_THRESHOLD(JL)=(1.-ZW1D(JL))*(-1.) + & + &ZW1D(JL)*(SIGN(1., ZA_RS(JL))*XMRSTEP+Z0RST(JL)-ZRST(JL)-ZB_RS(JL))/ & + &SIGN(MAX(ABS(ZA_RS(JL)), 1.E-20), ZA_RS(JL)) + ZW1D(JL)=MAX(0., SIGN(1., ZTIME_THRESHOLD(JL))) * & !WHERE(ZTIME_THRESHOLD(:)>=0.) + &MAX(0., -SIGN(1., ZTIME_THRESHOLD(JL)-ZMAXTIME(JL))) * & !WHERE(ZTIME_THRESHOLD(:)<ZMAXTIME(:)) + &MIN(1., MAX(0., -SIGN(1., XRTMIN(6)-ZRST(JL))) + & !WHERE(ZRST(:)>XRTMIN(6)) .OR. + &MAX(0., -SIGN(1., -ZA_RS(JL)))) !WHERE(ZA_RS(:)>0.) + ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + & + &ZW1D(JL)*MIN(ZMAXTIME(JL), ZTIME_THRESHOLD(JL)) + ZCOMPUTE(JL)=ZCOMPUTE(JL) * (1. - ZW1D(JL)) + + ZW1D(JL)=MAX(0., -SIGN(1., IITER(JL)-INB_ITER_MAX+0.)) * & ! WHERE(IITER(:)<INB_ITER_MAX) + &MAX(0., -SIGN(1., 1.E-20-ABS(ZA_RG(JL)))) ! WHERE(ABS(ZA_RG(:))>1.E-20) + ZTIME_THRESHOLD(JL)=(1.-ZW1D(JL))*(-1.) + & + &ZW1D(JL)*(SIGN(1., ZA_RG(JL))*XMRSTEP+Z0RGT(JL)-ZRGT(JL)-ZB_RG(JL))/ & + &SIGN(MAX(ABS(ZA_RG(JL)), 1.E-20), ZA_RG(JL)) + ZW1D(JL)=MAX(0., SIGN(1., ZTIME_THRESHOLD(JL))) * & !WHERE(ZTIME_THRESHOLD(:)>=0.) + &MAX(0., -SIGN(1., ZTIME_THRESHOLD(JL)-ZMAXTIME(JL))) * & !WHERE(ZTIME_THRESHOLD(:)<ZMAXTIME(:)) + &MIN(1., MAX(0., -SIGN(1., XRTMIN(6)-ZRGT(JL))) + & !WHERE(ZRGT(:)>XRTMIN(6)) .OR. + &MAX(0., -SIGN(1., -ZA_RG(JL)))) !WHERE(ZA_RG(:)>0.) + ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + & + &ZW1D(JL)*MIN(ZMAXTIME(JL), ZTIME_THRESHOLD(JL)) + ZCOMPUTE(JL)=ZCOMPUTE(JL) * (1. - ZW1D(JL)) + ENDDO + + IF(KRR==7) THEN + DO JL=1, IMICRO + ZW1D(JL)=MAX(0., -SIGN(1., IITER(JL)-INB_ITER_MAX+0.)) * & ! WHERE(IITER(:)<INB_ITER_MAX) + &MAX(0., -SIGN(1., 1.E-20-ABS(ZA_RH(JL)))) ! WHERE(ABS(ZA_RH(:))>1.E-20) + ZTIME_THRESHOLD(JL)=(1.-ZW1D(JL))*(-1.) + & + &ZW1D(JL)*(SIGN(1., ZA_RH(JL))*XMRSTEP+Z0RHT(JL)-ZRHT(JL)-ZB_RH(JL))/ & + &SIGN(MAX(ABS(ZA_RH(JL)), 1.E-20), ZA_RH(JL)) + ZW1D(JL)=MAX(0., SIGN(1., ZTIME_THRESHOLD(JL))) * & !WHERE(ZTIME_THRESHOLD(:)>=0.) + &MAX(0., -SIGN(1., ZTIME_THRESHOLD(JL)-ZMAXTIME(JL))) * & !WHERE(ZTIME_THRESHOLD(:)<ZMAXTIME(:)) + &MIN(1., MAX(0., -SIGN(1., XRTMIN(6)-ZRHT(JL))) + & !WHERE(ZRHT(:)>XRTMIN(6)) .OR. + &MAX(0., -SIGN(1., -ZA_RH(JL)))) !WHERE(ZA_RH(:)>0.) + ZMAXTIME(JL)=(1.-ZW1D(JL)) * ZMAXTIME(JL) + & + &ZW1D(JL)*MIN(ZMAXTIME(JL), ZTIME_THRESHOLD(JL)) + ZCOMPUTE(JL)=ZCOMPUTE(JL) * (1. - ZW1D(JL)) + ENDDO + ENDIF + + DO JL=1, IMICRO + ZW1D(JL)=MAX(ABS(ZB_RV(JL)), ABS(ZB_RC(JL)), ABS(ZB_RR(JL)), ABS(ZB_RI(JL)), & + &ABS(ZB_RS(JL)), ABS(ZB_RG(JL)), ABS(ZB_RH(JL))) + ZW1D(JL)=MAX(0., -SIGN(1., IITER(JL)-INB_ITER_MAX+0.)) * & !WHERE(IITER(:)<INB_ITER_MAX) + &MAX(0., -SIGN(1., XMRSTEP-ZW1D(JL))) !WHERE(ZW1D(:)>XMRSTEP) + ZMAXTIME(JL)=(1.-ZW1D(JL))*ZMAXTIME(JL) + ZCOMPUTE(JL)=ZCOMPUTE(JL) * (1. - ZW1D(JL)) + ENDDO + ENDIF + ! + !*** 4.3 New values of variables for next iteration + ! + DO JL=1, IMICRO + ZTHT(JL)=ZTHT(JL)+ZA_TH(JL)*ZMAXTIME(JL)+ZB_TH(JL) + ZRVT(JL)=ZRVT(JL)+ZA_RV(JL)*ZMAXTIME(JL)+ZB_RV(JL) + ZRCT(JL)=ZRCT(JL)+ZA_RC(JL)*ZMAXTIME(JL)+ZB_RC(JL) + ZRRT(JL)=ZRRT(JL)+ZA_RR(JL)*ZMAXTIME(JL)+ZB_RR(JL) + ZRIT(JL)=ZRIT(JL)+ZA_RI(JL)*ZMAXTIME(JL)+ZB_RI(JL) + ZRST(JL)=ZRST(JL)+ZA_RS(JL)*ZMAXTIME(JL)+ZB_RS(JL) + ZRGT(JL)=ZRGT(JL)+ZA_RG(JL)*ZMAXTIME(JL)+ZB_RG(JL) + ZCIT(JL)=ZCIT(JL) * MAX(0., -SIGN(1., -ZRIT(JL))) ! WHERE(ZRIT(:)==0.) ZCIT(:) = 0. + ENDDO + IF(KRR==7) ZRHT(:)=ZRHT(:)+ZA_RH(:)*ZMAXTIME(:)+ZB_RH(:) + ! + !*** 4.4 Mixing ratio change due to each process + ! + IF(LBU_ENABLE) THEN + ZTOT_RVHENI(:)= ZTOT_RVHENI(:) +ZRVHENI_MR(:) + ZTOT_RCHONI(:)= ZTOT_RCHONI(:) +ZRCHONI(:) *ZMAXTIME(:) + ZTOT_RRHONG(:)= ZTOT_RRHONG(:) +ZRRHONG_MR(:) + ZTOT_RVDEPS(:)= ZTOT_RVDEPS(:) +ZRVDEPS(:) *ZMAXTIME(:) + ZTOT_RIAGGS(:)= ZTOT_RIAGGS(:) +ZRIAGGS(:) *ZMAXTIME(:) + ZTOT_RIAUTS(:)= ZTOT_RIAUTS(:) +ZRIAUTS(:) *ZMAXTIME(:) + ZTOT_RVDEPG(:)= ZTOT_RVDEPG(:) +ZRVDEPG(:) *ZMAXTIME(:) + ZTOT_RCAUTR(:)= ZTOT_RCAUTR(:) +ZRCAUTR(:) *ZMAXTIME(:) + ZTOT_RCACCR(:)= ZTOT_RCACCR(:) +ZRCACCR(:) *ZMAXTIME(:) + ZTOT_RREVAV(:)= ZTOT_RREVAV(:) +ZRREVAV(:) *ZMAXTIME(:) + ZTOT_RCRIMSS(:)=ZTOT_RCRIMSS(:)+ZRCRIMSS(:)*ZMAXTIME(:) + ZTOT_RCRIMSG(:)=ZTOT_RCRIMSG(:)+ZRCRIMSG(:)*ZMAXTIME(:) + ZTOT_RSRIMCG(:)=ZTOT_RSRIMCG(:)+ZRSRIMCG(:)*ZMAXTIME(:)+ZRSRIMCG_MR(:) + ZTOT_RRACCSS(:)=ZTOT_RRACCSS(:)+ZRRACCSS(:)*ZMAXTIME(:) + ZTOT_RRACCSG(:)=ZTOT_RRACCSG(:)+ZRRACCSG(:)*ZMAXTIME(:) + ZTOT_RSACCRG(:)=ZTOT_RSACCRG(:)+ZRSACCRG(:)*ZMAXTIME(:) + ZTOT_RSMLTG(:)= ZTOT_RSMLTG(:) +ZRSMLTG(:) *ZMAXTIME(:) + ZTOT_RCMLTSR(:)=ZTOT_RCMLTSR(:)+ZRCMLTSR(:) *ZMAXTIME(:) + ZTOT_RICFRRG(:)=ZTOT_RICFRRG(:)+ZRICFRRG(:)*ZMAXTIME(:) + ZTOT_RRCFRIG(:)=ZTOT_RRCFRIG(:)+ZRRCFRIG(:)*ZMAXTIME(:) + ZTOT_RICFRR(:)= ZTOT_RICFRR(:) +ZRICFRR(:) *ZMAXTIME(:) + ZTOT_RCWETG(:)= ZTOT_RCWETG(:) +ZRCWETG(:) *ZMAXTIME(:) + ZTOT_RIWETG(:)= ZTOT_RIWETG(:) +ZRIWETG(:) *ZMAXTIME(:) + ZTOT_RRWETG(:)= ZTOT_RRWETG(:) +ZRRWETG(:) *ZMAXTIME(:) + ZTOT_RSWETG(:)= ZTOT_RSWETG(:) +ZRSWETG(:) *ZMAXTIME(:) + ZTOT_RWETGH(:)= ZTOT_RWETGH(:) +ZRWETGH(:) *ZMAXTIME(:)+ZRWETGH_MR(:) + ZTOT_RCDRYG(:)= ZTOT_RCDRYG(:) +ZRCDRYG(:) *ZMAXTIME(:) + ZTOT_RIDRYG(:)= ZTOT_RIDRYG(:) +ZRIDRYG(:) *ZMAXTIME(:) + ZTOT_RRDRYG(:)= ZTOT_RRDRYG(:) +ZRRDRYG(:) *ZMAXTIME(:) + ZTOT_RSDRYG(:)= ZTOT_RSDRYG(:) +ZRSDRYG(:) *ZMAXTIME(:) + ZTOT_RGMLTR(:)= ZTOT_RGMLTR(:) +ZRGMLTR(:) *ZMAXTIME(:) + ZTOT_RCWETH(:)= ZTOT_RCWETH(:) +ZRCWETH(:) *ZMAXTIME(:) + ZTOT_RIWETH(:)= ZTOT_RIWETH(:) +ZRIWETH(:) *ZMAXTIME(:) + ZTOT_RSWETH(:)= ZTOT_RSWETH(:) +ZRSWETH(:) *ZMAXTIME(:) + ZTOT_RGWETH(:)= ZTOT_RGWETH(:) +ZRGWETH(:) *ZMAXTIME(:) + ZTOT_RRWETH(:)= ZTOT_RRWETH(:) +ZRRWETH(:) *ZMAXTIME(:) + ZTOT_RCDRYH(:)= ZTOT_RCDRYH(:) +ZRCDRYH(:) *ZMAXTIME(:) + ZTOT_RIDRYH(:)= ZTOT_RIDRYH(:) +ZRIDRYH(:) *ZMAXTIME(:) + ZTOT_RSDRYH(:)= ZTOT_RSDRYH(:) +ZRSDRYH(:) *ZMAXTIME(:) + ZTOT_RRDRYH(:)= ZTOT_RRDRYH(:) +ZRRDRYH(:) *ZMAXTIME(:) + ZTOT_RGDRYH(:)= ZTOT_RGDRYH(:) +ZRGDRYH(:) *ZMAXTIME(:) + ZTOT_RDRYHG(:)= ZTOT_RDRYHG(:) +ZRDRYHG(:) *ZMAXTIME(:) + ZTOT_RHMLTR(:)= ZTOT_RHMLTR(:) +ZRHMLTR(:) *ZMAXTIME(:) + ZTOT_RIMLTC(:)= ZTOT_RIMLTC(:) +ZRIMLTC_MR(:) + ZTOT_RCBERI(:)= ZTOT_RCBERI(:) +ZRCBERI(:) *ZMAXTIME(:) + ENDIF + ! + !*** 4.5 Next loop + ! + LSOFT=.TRUE. ! We try to adjust tendencies (inner while loop) + ZTIME(:)=ZTIME(:)+ZMAXTIME(:) + ENDDO +ENDDO +!------------------------------------------------------------------------------- +! +!* 5. UNPACKING DIAGNOSTICS +! --------------------- +! +IF(IMICRO>0) THEN + ZHLC_HCF3D(:,:,:)=0. + ZHLC_LCF3D(:,:,:)=0. + ZHLC_HRC3D(:,:,:)=0. + ZHLC_LRC3D(:,:,:)=0. + ZHLI_HCF3D(:,:,:)=0. + ZHLI_LCF3D(:,:,:)=0. + ZHLI_HRI3D(:,:,:)=0. + ZHLI_LRI3D(:,:,:)=0. + DO JL=1,IMICRO + ZHLC_HCF3D(I1(JL), I2(JL), I3(JL)) = ZHLC_HCF(JL) + ZHLC_LCF3D(I1(JL), I2(JL), I3(JL)) = ZHLC_LCF(JL) + ZHLC_HRC3D(I1(JL), I2(JL), I3(JL)) = ZHLC_HRC(JL) + ZHLC_LRC3D(I1(JL), I2(JL), I3(JL)) = ZHLC_LRC(JL) + ZHLI_LCF3D(I1(JL), I2(JL), I3(JL)) = ZHLI_LCF(JL) + ZHLI_HCF3D(I1(JL), I2(JL), I3(JL)) = ZHLI_HCF(JL) + ZHLI_HRI3D(I1(JL), I2(JL), I3(JL)) = ZHLI_HRI(JL) + ZHLI_LRI3D(I1(JL), I2(JL), I3(JL)) = ZHLI_LRI(JL) + PCIT(I1(JL), I2(JL), I3(JL)) = ZCIT(JL) + END DO +ELSE + PRAINFR(:,:,:)=0. + ZHLC_HCF3D(:,:,:)=0. + ZHLC_LCF3D(:,:,:)=0. + ZHLC_HRC3D(:,:,:)=0. + ZHLC_LRC3D(:,:,:)=0. + ZHLI_HCF3D(:,:,:)=0. + ZHLI_LCF3D(:,:,:)=0. + ZHLI_HRI3D(:,:,:)=0. + ZHLI_LRI3D(:,:,:)=0. + PCIT(:,:,:) = 0. +ENDIF +IF(OWARM) THEN + PEVAP3D(:,:,:) = 0. + DO JL=1,IMICRO + PEVAP3D(I1(JL), I2(JL), I3(JL)) = ZRREVAV(JL) + END DO +ENDIF +! +! +!* 6. COMPUTES THE SLOW COLD PROCESS SOURCES OUTSIDE OF ODMICRO POINTS +! ---------------------------------------------------------------- +! +CALL ICE4_NUCLEATION_WRAPPER(KIT, KJT, KKT, .NOT. ODMICRO, & + PTHT, PPABST, PRHODREF, PEXN, ZZ_LSFACT/PEXN, ZT, & + PRVT, & + PCIT, ZZ_RVHENI_MR) +DO JK = 1, KKT + DO JJ = 1, KJT + DO JI = 1, KIT + ZZ_LSFACT(JI,JJ,JK)=ZZ_LSFACT(JI,JJ,JK)/PEXNREF(JI,JJ,JK) + ZZ_LVFACT(JI,JJ,JK)=ZZ_LVFACT(JI,JJ,JK)/PEXNREF(JI,JJ,JK) + ZZ_RVHENI(JI,JJ,JK) = MIN(PRVS(JI,JJ,JK), ZZ_RVHENI_MR(JI,JJ,JK)/PTSTEP) + PRIS(JI,JJ,JK)=PRIS(JI,JJ,JK)+ZZ_RVHENI(JI,JJ,JK) + PRVS(JI,JJ,JK)=PRVS(JI,JJ,JK)-ZZ_RVHENI(JI,JJ,JK) + PTHS(JI,JJ,JK)=PTHS(JI,JJ,JK) + ZZ_RVHENI(JI,JJ,JK)*ZZ_LSFACT(JI,JJ,JK) + ENDDO + ENDDO +ENDDO +! +if ( lbu_enable ) then + !Note: there is an other contribution for HENU later + if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'HENU', pths(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rv ) call Budget_store_end( tbudgets(NBUDGET_RV), 'HENU', prvs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_ri ) call Budget_store_add( tbudgets(NBUDGET_RI), 'HENU', zz_rvheni(:, :, :) * prhodj(:, :, :) ) +end if +!------------------------------------------------------------------------------- +! +!* 7. UNPACKING AND TOTAL TENDENCIES +! ------------------------------ +! +! +!*** 7.1 total tendencies limited by available species +! +! ZW_??S variables will contain the new S variables values +! +IF(GEXT_TEND) THEN + !Z..T variables contain the exeternal tendency, we substract it + DO JL=1, IMICRO + ZRVT(JL) = ZRVT(JL) - ZEXT_RV(JL) * PTSTEP + ZRCT(JL) = ZRCT(JL) - ZEXT_RC(JL) * PTSTEP + ZRRT(JL) = ZRRT(JL) - ZEXT_RR(JL) * PTSTEP + ZRIT(JL) = ZRIT(JL) - ZEXT_RI(JL) * PTSTEP + ZRST(JL) = ZRST(JL) - ZEXT_RS(JL) * PTSTEP + ZRGT(JL) = ZRGT(JL) - ZEXT_RG(JL) * PTSTEP + ZTHT(JL) = ZTHT(JL) - ZEXT_TH(JL) * PTSTEP + ENDDO + IF (KRR==7) ZRHT(:) = ZRHT(:) - ZEXT_RH(:) * PTSTEP +ENDIF +!Tendencies computed from difference between old state and new state (can be negative) + ZW_RVS(:,:,:) = 0. + ZW_RCS(:,:,:) = 0. + ZW_RRS(:,:,:) = 0. + ZW_RIS(:,:,:) = 0. + ZW_RSS(:,:,:) = 0. + ZW_RGS(:,:,:) = 0. + ZW_RHS(:,:,:) = 0. + DO JL=1,IMICRO + ZW_RVS(I1(JL), I2(JL), I3(JL)) = ( ZRVT(JL) - PRVT(I1(JL), I2(JL), I3(JL)) ) * ZINV_TSTEP + ZW_RCS(I1(JL), I2(JL), I3(JL)) = ( ZRCT(JL) - PRCT(I1(JL), I2(JL), I3(JL)) ) * ZINV_TSTEP + ZW_RRS(I1(JL), I2(JL), I3(JL)) = ( ZRRT(JL) - PRRT(I1(JL), I2(JL), I3(JL)) ) * ZINV_TSTEP + ZW_RIS(I1(JL), I2(JL), I3(JL)) = ( ZRIT(JL) - PRIT(I1(JL), I2(JL), I3(JL)) ) * ZINV_TSTEP + ZW_RSS(I1(JL), I2(JL), I3(JL)) = ( ZRST(JL) - PRST(I1(JL), I2(JL), I3(JL)) ) * ZINV_TSTEP + ZW_RGS(I1(JL), I2(JL), I3(JL)) = ( ZRGT(JL) - PRGT(I1(JL), I2(JL), I3(JL)) ) * ZINV_TSTEP + END DO + IF(KRR==7) THEN + DO JL=1,IMICRO + ZW_RHS(I1(JL), I2(JL), I3(JL)) = ( ZRHT(JL) - PRHT(I1(JL), I2(JL), I3(JL)) ) * ZINV_TSTEP + END DO +END IF +ZW_THS(:,:,:) = (ZW_RCS(:,:,:)+ZW_RRS(:,:,:) )*ZZ_LVFACT(:,:,:) + & + & (ZW_RIS(:,:,:)+ZW_RSS(:,:,:)+ZW_RGS(:,:,:)+ZW_RHS(:,:,:))*ZZ_LSFACT(:,:,:) +!We apply these tendencies to the S variables +ZW_RVS(:,:,:) = PRVS(:,:,:) + ZW_RVS(:,:,:) +ZW_RCS(:,:,:) = PRCS(:,:,:) + ZW_RCS(:,:,:) +ZW_RRS(:,:,:) = PRRS(:,:,:) + ZW_RRS(:,:,:) +ZW_RIS(:,:,:) = PRIS(:,:,:) + ZW_RIS(:,:,:) +ZW_RSS(:,:,:) = PRSS(:,:,:) + ZW_RSS(:,:,:) +ZW_RGS(:,:,:) = PRGS(:,:,:) + ZW_RGS(:,:,:) +IF(KRR==7) ZW_RHS(:,:,:) = PRHS(:,:,:) + ZW_RHS(:,:,:) +ZW_THS(:,:,:) = PTHS(:,:,:) + ZW_THS(:,:,:) + +if ( lbu_enable ) then + if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'CORR', zw_ths(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rv ) call Budget_store_init( tbudgets(NBUDGET_RV), 'CORR', zw_rvs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'CORR', zw_rcs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_init( tbudgets(NBUDGET_RR), 'CORR', zw_rrs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), 'CORR', zw_ris(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rs ) call Budget_store_init( tbudgets(NBUDGET_RS), 'CORR', zw_rss(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rg ) call Budget_store_init( tbudgets(NBUDGET_RG), 'CORR', zw_rgs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rh ) call Budget_store_init( tbudgets(NBUDGET_RH), 'CORR', zw_rhs(:, :, :) * prhodj(:, :, :) ) +end if + +!We correct negativities with conservation +CALL CORRECT_NEGATIVITIES(KIT, KJT, KKT, KRR, ZW_RVS, ZW_RCS, ZW_RRS, & + &ZW_RIS, ZW_RSS, ZW_RGS, & + &ZW_THS, ZZ_LVFACT, ZZ_LSFACT, ZW_RHS) + +if ( lbu_enable ) then + if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'CORR', zw_ths(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rv ) call Budget_store_end( tbudgets(NBUDGET_RV), 'CORR', zw_rvs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'CORR', zw_rcs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_end( tbudgets(NBUDGET_RR), 'CORR', zw_rrs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'CORR', zw_ris(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rs ) call Budget_store_end( tbudgets(NBUDGET_RS), 'CORR', zw_rss(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rg ) call Budget_store_end( tbudgets(NBUDGET_RG), 'CORR', zw_rgs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rh ) call Budget_store_end( tbudgets(NBUDGET_RH), 'CORR', zw_rhs(:, :, :) * prhodj(:, :, :) ) +end if +! +!*** 7.2 LBU_ENABLE case +! +IF(LBU_ENABLE) THEN + allocate( zw1( size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) ) + allocate( zw2( size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) ) + allocate( zw3( size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) ) + allocate( zw4( size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) ) + if ( krr == 7 ) then + allocate( zw5( size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) ) + allocate( zw6( size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) ) + end if + + if ( lbudget_th ) then + allocate( zz_diff( size( zz_lsfact, 1 ), size( zz_lsfact, 2 ), size( zz_lsfact, 3 ) ) ) + zz_diff(:, :, :) = zz_lsfact(:, :, :) - zz_lvfact(:, :, :) + end if + + ZW(:,:,:) = 0. + DO JL=1,IMICRO + ZW(I1(JL), I2(JL), I3(JL)) = ZTOT_RVHENI(JL) * ZINV_TSTEP + END DO + if ( lbudget_th ) call Budget_store_add( tbudgets(NBUDGET_TH), 'HENU', zw(:, :, :) * zz_lsfact(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rv ) call Budget_store_add( tbudgets(NBUDGET_RV), 'HENU', -zw(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_ri ) call Budget_store_add( tbudgets(NBUDGET_RI), 'HENU', zw(:, :, :) * prhodj(:, :, :) ) + + ZW(:,:,:) = 0. + DO JL=1,IMICRO + ZW(I1(JL), I2(JL), I3(JL)) = ZTOT_RCHONI(JL) * ZINV_TSTEP + END DO + if ( lbudget_th ) call Budget_store_add( tbudgets(NBUDGET_TH), 'HON', zw(:, :, :) * zz_diff(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rc ) call Budget_store_add( tbudgets(NBUDGET_RC), 'HON', -zw(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_ri ) call Budget_store_add( tbudgets(NBUDGET_RI), 'HON', zw(:, :, :) * prhodj(:, :, :) ) + + ZW(:,:,:) = 0. + DO JL=1,IMICRO + ZW(I1(JL), I2(JL), I3(JL)) = ZTOT_RRHONG(JL) * ZINV_TSTEP + END DO + if ( lbudget_th ) call Budget_store_add( tbudgets(NBUDGET_TH), 'SFR', zw(:, :, :) * zz_diff(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_add( tbudgets(NBUDGET_RR), 'SFR', -zw(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rg ) call Budget_store_add( tbudgets(NBUDGET_RG), 'SFR', zw(:, :, :) * prhodj(:, :, :) ) + + ZW(:,:,:) = 0. + DO JL=1,IMICRO + ZW(I1(JL), I2(JL), I3(JL)) = ZTOT_RVDEPS(JL) * ZINV_TSTEP + END DO + if ( lbudget_th ) call Budget_store_add( tbudgets(NBUDGET_TH), 'DEPS', zw(:, :, :) * zz_lsfact(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rv ) call Budget_store_add( tbudgets(NBUDGET_RV), 'DEPS', -zw(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rs ) call Budget_store_add( tbudgets(NBUDGET_RS), 'DEPS', zw(:, :, :) * prhodj(:, :, :) ) + + ZW(:,:,:) = 0. + DO JL=1,IMICRO + ZW(I1(JL), I2(JL), I3(JL)) = ZTOT_RIAGGS(JL) * ZINV_TSTEP + END DO + if ( lbudget_ri ) call Budget_store_add( tbudgets(NBUDGET_RI), 'AGGS', -zw(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rs ) call Budget_store_add( tbudgets(NBUDGET_RS), 'AGGS', zw(:, :, :) * prhodj(:, :, :) ) + + ZW(:,:,:) = 0. + DO JL=1,IMICRO + ZW(I1(JL), I2(JL), I3(JL)) = ZTOT_RIAUTS(JL) * ZINV_TSTEP + END DO + if ( lbudget_ri ) call Budget_store_add( tbudgets(NBUDGET_RI), 'AUTS', -zw(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rs ) call Budget_store_add( tbudgets(NBUDGET_RS), 'AUTS', zw(:, :, :) * prhodj(:, :, :) ) + + ZW(:,:,:) = 0. + DO JL=1,IMICRO + ZW(I1(JL), I2(JL), I3(JL)) = ZTOT_RVDEPG(JL) * ZINV_TSTEP + END DO + if ( lbudget_th ) call Budget_store_add( tbudgets(NBUDGET_TH), 'DEPG', zw(:, :, :) * zz_lsfact(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rv ) call Budget_store_add( tbudgets(NBUDGET_RV), 'DEPG', -zw(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rg ) call Budget_store_add( tbudgets(NBUDGET_RG), 'DEPG', zw(:, :, :) * prhodj(:, :, :) ) + + IF(OWARM) THEN + ZW(:,:,:) = 0. + DO JL=1,IMICRO + ZW(I1(JL), I2(JL), I3(JL)) = ZTOT_RCAUTR(JL) * ZINV_TSTEP + END DO + if ( lbudget_rc ) call Budget_store_add( tbudgets(NBUDGET_RC), 'AUTO', -zw(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_add( tbudgets(NBUDGET_RR), 'AUTO', zw(:, :, :) * prhodj(:, :, :) ) + + ZW(:,:,:) = 0. + DO JL=1,IMICRO + ZW(I1(JL), I2(JL), I3(JL)) = ZTOT_RCACCR(JL) * ZINV_TSTEP + END DO + if ( lbudget_rc ) call Budget_store_add( tbudgets(NBUDGET_RC), 'ACCR', -zw(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_add( tbudgets(NBUDGET_RR), 'ACCR', zw(:, :, :) * prhodj(:, :, :) ) + + ZW(:,:,:) = 0. + DO JL=1,IMICRO + ZW(I1(JL), I2(JL), I3(JL)) = ZTOT_RREVAV(JL) * ZINV_TSTEP + END DO + if ( lbudget_th ) call Budget_store_add( tbudgets(NBUDGET_TH), 'REVA', -zw(:, :, :) * zz_lvfact(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rv ) call Budget_store_add( tbudgets(NBUDGET_RV), 'REVA', zw(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_add( tbudgets(NBUDGET_RR), 'REVA', -zw(:, :, :) * prhodj(:, :, :) ) + ENDIF + + ZW1(:,:,:) = 0. + DO JL=1,IMICRO + ZW1(I1(JL), I2(JL), I3(JL)) = ZTOT_RCRIMSS(JL) * ZINV_TSTEP + END DO + ZW2(:,:,:) = 0. + DO JL=1,IMICRO + ZW2(I1(JL), I2(JL), I3(JL)) = ZTOT_RCRIMSG(JL) * ZINV_TSTEP + END DO + ZW3(:,:,:) = 0. + DO JL=1,IMICRO + ZW3(I1(JL), I2(JL), I3(JL)) = ZTOT_RSRIMCG(JL) * ZINV_TSTEP + END DO + if ( lbudget_th ) & + call Budget_store_add( tbudgets(NBUDGET_TH), 'RIM', ( zw1(:, :, :) + zw2(:, :, :) ) * zz_diff(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rc ) call Budget_store_add( tbudgets(NBUDGET_RC), 'RIM', ( -zw1(:, :, :) - zw2(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rs ) call Budget_store_add( tbudgets(NBUDGET_RS), 'RIM', ( zw1(:, :, :) - zw3(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rg ) call Budget_store_add( tbudgets(NBUDGET_RG), 'RIM', ( zw2(:, :, :) + zw3(:, :, :) ) * prhodj(:, :, :) ) + + ZW1(:,:,:) = 0. + DO JL=1,IMICRO + ZW1(I1(JL), I2(JL), I3(JL)) = ZTOT_RRACCSS(JL) * ZINV_TSTEP + END DO + ZW2(:,:,:) = 0. + DO JL=1,IMICRO + ZW2(I1(JL), I2(JL), I3(JL)) = ZTOT_RRACCSG(JL) * ZINV_TSTEP + END DO + ZW3(:,:,:) = 0. + DO JL=1,IMICRO + ZW3(I1(JL), I2(JL), I3(JL)) = ZTOT_RSACCRG(JL) * ZINV_TSTEP + END DO + if ( lbudget_th ) & + call Budget_store_add( tbudgets(NBUDGET_TH), 'ACC', ( zw1(:, :, :) + zw2(:, :, :) ) * zz_diff(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_add( tbudgets(NBUDGET_RR), 'ACC', ( -zw1(:, :, :) - zw2(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rs ) call Budget_store_add( tbudgets(NBUDGET_RS), 'ACC', ( zw1(:, :, :) - zw3(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rg ) call Budget_store_add( tbudgets(NBUDGET_RG), 'ACC', ( zw2(:, :, :) + zw3(:, :, :) ) * prhodj(:, :, :) ) + + ZW(:,:,:) = 0. + DO JL=1,IMICRO + ZW(I1(JL), I2(JL), I3(JL)) = ZTOT_RSMLTG(JL) * ZINV_TSTEP + END DO + if ( lbudget_rs ) call Budget_store_add( tbudgets(NBUDGET_RS), 'CMEL', -zw(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rg ) call Budget_store_add( tbudgets(NBUDGET_RG), 'CMEL', zw(:, :, :) * prhodj(:, :, :) ) + ZW(:,:,:) = 0. + DO JL=1,IMICRO + ZW(I1(JL), I2(JL), I3(JL)) = ZTOT_RCMLTSR(JL) * ZINV_TSTEP + END DO + if ( lbudget_rc ) call Budget_store_add( tbudgets(NBUDGET_RC), 'CMEL', -zw(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_add( tbudgets(NBUDGET_RR), 'CMEL', zw(:, :, :) * prhodj(:, :, :) ) + + ZW1(:,:,:) = 0. + DO JL=1,IMICRO + ZW1(I1(JL), I2(JL), I3(JL)) = ZTOT_RICFRRG(JL) * ZINV_TSTEP + END DO + ZW2(:,:,:) = 0. + DO JL=1,IMICRO + ZW2(I1(JL), I2(JL), I3(JL)) = ZTOT_RRCFRIG(JL) * ZINV_TSTEP + END DO + ZW3(:,:,:) = 0. + DO JL=1,IMICRO + ZW3(I1(JL), I2(JL), I3(JL)) = ZTOT_RICFRR(JL) * ZINV_TSTEP + END DO + if ( lbudget_th ) & + call Budget_store_add( tbudgets(NBUDGET_TH), 'CFRZ', zw2(:, :, :) * zz_diff(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_add( tbudgets(NBUDGET_RR), 'CFRZ', ( -zw2(:, :, :) + zw3(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_ri ) call Budget_store_add( tbudgets(NBUDGET_RI), 'CFRZ', ( -zw1(:, :, :) - zw3(:, :, :) ) * prhodj(:, :, :) ) + if ( lbudget_rg ) call Budget_store_add( tbudgets(NBUDGET_RG), 'CFRZ', ( zw1(:, :, :) + zw2(:, :, :) ) * prhodj(:, :, :) ) + + ZW1(:,:,:) = 0. + DO JL=1,IMICRO + ZW1(I1(JL), I2(JL), I3(JL)) = ZTOT_RCWETG(JL) * ZINV_TSTEP + END DO + ZW2(:,:,:) = 0. + DO JL=1,IMICRO + ZW2(I1(JL), I2(JL), I3(JL)) = ZTOT_RRWETG(JL) * ZINV_TSTEP + END DO + ZW3(:,:,:) = 0. + DO JL=1,IMICRO + ZW3(I1(JL), I2(JL), I3(JL)) = ZTOT_RIWETG(JL) * ZINV_TSTEP + END DO + ZW4(:,:,:) = 0. + DO JL=1,IMICRO + ZW4(I1(JL), I2(JL), I3(JL)) = ZTOT_RSWETG(JL) * ZINV_TSTEP + END DO + if ( lbudget_th ) & + call Budget_store_add( tbudgets(NBUDGET_TH), 'WETG', ( zw1(:, :, :) + zw2(:, :, :) ) * zz_diff(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rc ) call Budget_store_add( tbudgets(NBUDGET_RC), 'WETG', -zw1(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_add( tbudgets(NBUDGET_RR), 'WETG', -zw2(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_ri ) call Budget_store_add( tbudgets(NBUDGET_RI), 'WETG', -zw3(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rs ) call Budget_store_add( tbudgets(NBUDGET_RS), 'WETG', -zw4(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rg ) call Budget_store_add( tbudgets(NBUDGET_RG), 'WETG', ( zw1(:, :, :) + zw2(:, :, :) & + + zw3(:, :, :) + zw4(:, :, :) ) & + * prhodj(:, :, :) ) + + IF(KRR==7) THEN + ZW(:,:,:) = 0. + DO JL=1,IMICRO + ZW(I1(JL), I2(JL), I3(JL)) = ZTOT_RWETGH(JL) * ZINV_TSTEP + END DO + if ( lbudget_rg ) call Budget_store_add( tbudgets(NBUDGET_RG), 'GHCV', -zw(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rh ) call Budget_store_add( tbudgets(NBUDGET_RH), 'GHCV', zw(:, :, :) * prhodj(:, :, :) ) + END IF + + ZW1(:,:,:) = 0. + DO JL=1,IMICRO + ZW1(I1(JL), I2(JL), I3(JL)) = ZTOT_RCDRYG(JL) * ZINV_TSTEP + END DO + ZW2(:,:,:) = 0. + DO JL=1,IMICRO + ZW2(I1(JL), I2(JL), I3(JL)) = ZTOT_RRDRYG(JL) * ZINV_TSTEP + END DO + ZW3(:,:,:) = 0. + DO JL=1,IMICRO + ZW3(I1(JL), I2(JL), I3(JL)) = ZTOT_RIDRYG(JL) * ZINV_TSTEP + END DO + ZW4(:,:,:) = 0. + DO JL=1,IMICRO + ZW4(I1(JL), I2(JL), I3(JL)) = ZTOT_RSDRYG(JL) * ZINV_TSTEP + END DO + if ( lbudget_th ) & + call Budget_store_add( tbudgets(NBUDGET_TH), 'DRYG', ( zw1(:, :, :) + zw2(:, :, :) ) * zz_diff(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rc ) call Budget_store_add( tbudgets(NBUDGET_RC), 'DRYG', -zw1(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_add( tbudgets(NBUDGET_RR), 'DRYG', -zw2(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_ri ) call Budget_store_add( tbudgets(NBUDGET_RI), 'DRYG', -zw3(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rs ) call Budget_store_add( tbudgets(NBUDGET_RS), 'DRYG', -zw4(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rg ) call Budget_store_add( tbudgets(NBUDGET_RG), 'DRYG', ( zw1(:, :, :) + zw2(:, :, :) & + + zw3(:, :, :) + zw4(:, :, :) ) & + * prhodj(:, :, :) ) + + ZW(:,:,:) = 0. + DO JL=1,IMICRO + ZW(I1(JL), I2(JL), I3(JL)) = ZTOT_RGMLTR(JL) * ZINV_TSTEP + END DO + if ( lbudget_th ) call Budget_store_add( tbudgets(NBUDGET_TH), 'GMLT', -zw(:, :, :) * zz_diff(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_add( tbudgets(NBUDGET_RR), 'GMLT', zw(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rg ) call Budget_store_add( tbudgets(NBUDGET_RG), 'GMLT', -zw(:, :, :) * prhodj(:, :, :) ) + + IF(KRR==7) THEN + ZW1(:,:,:) = 0. + DO JL=1,IMICRO + ZW1(I1(JL), I2(JL), I3(JL)) = ZTOT_RCWETH(JL) * ZINV_TSTEP + END DO + ZW2(:,:,:) = 0. + DO JL=1,IMICRO + ZW2(I1(JL), I2(JL), I3(JL)) = ZTOT_RRWETH(JL) * ZINV_TSTEP + END DO + ZW3(:,:,:) = 0. + DO JL=1,IMICRO + ZW3(I1(JL), I2(JL), I3(JL)) = ZTOT_RIWETH(JL) * ZINV_TSTEP + END DO + ZW4(:,:,:) = 0. + DO JL=1,IMICRO + ZW4(I1(JL), I2(JL), I3(JL)) = ZTOT_RSWETH(JL) * ZINV_TSTEP + END DO + ZW5(:,:,:) = 0. + DO JL=1,IMICRO + ZW5(I1(JL), I2(JL), I3(JL)) = ZTOT_RGWETH(JL) * ZINV_TSTEP + END DO + if ( lbudget_th ) & + call Budget_store_add( tbudgets(NBUDGET_TH), 'WETH', ( zw1(:, :, :) + zw2(:, :, :) ) * zz_diff(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rc ) call Budget_store_add( tbudgets(NBUDGET_RC), 'WETH', -zw1(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_add( tbudgets(NBUDGET_RR), 'WETH', -zw2(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_ri ) call Budget_store_add( tbudgets(NBUDGET_RI), 'WETH', -zw3(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rs ) call Budget_store_add( tbudgets(NBUDGET_RS), 'WETH', -zw4(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rg ) call Budget_store_add( tbudgets(NBUDGET_RG), 'WETH', -zw5(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rh ) call Budget_store_add( tbudgets(NBUDGET_RH), 'WETH', ( zw1(:, :, :) + zw2(:, :, :) + zw3(:, :, :) & + + zw4(:, :, :) + zw5(:, :, : ) ) & + * prhodj(:, :, :) ) + + ZW(:,:,:) = 0. + DO JL=1,IMICRO + ZW(I1(JL), I2(JL), I3(JL)) = ZTOT_RGWETH(JL) * ZINV_TSTEP + END DO + if ( lbudget_rg ) call Budget_store_add( tbudgets(NBUDGET_RG), 'HGCV', -zw(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rh ) call Budget_store_add( tbudgets(NBUDGET_RH), 'HGCV', zw(:, :, :) * prhodj(:, :, :) ) + + ZW1(:,:,:) = 0. + DO JL=1,IMICRO + ZW1(I1(JL), I2(JL), I3(JL)) = ZTOT_RCDRYH(JL) * ZINV_TSTEP + END DO + ZW2(:,:,:) = 0. + DO JL=1,IMICRO + ZW2(I1(JL), I2(JL), I3(JL)) = ZTOT_RRDRYH(JL) * ZINV_TSTEP + END DO + ZW3(:,:,:) = 0. + DO JL=1,IMICRO + ZW3(I1(JL), I2(JL), I3(JL)) = ZTOT_RIDRYH(JL) * ZINV_TSTEP + END DO + ZW4(:,:,:) = 0. + DO JL=1,IMICRO + ZW4(I1(JL), I2(JL), I3(JL)) = ZTOT_RSDRYH(JL) * ZINV_TSTEP + END DO + ZW5(:,:,:) = 0. + DO JL=1,IMICRO + ZW5(I1(JL), I2(JL), I3(JL)) = ZTOT_RGDRYH(JL) * ZINV_TSTEP + END DO + ZW6(:,:,:) = 0. + DO JL=1,IMICRO + ZW6(I1(JL), I2(JL), I3(JL)) = ZTOT_RDRYHG(JL) * ZINV_TSTEP + END DO + if ( lbudget_th ) & + call Budget_store_add( tbudgets(NBUDGET_TH), 'DRYH', ( zw1(:, :, :) + zw2(:, :, :) ) * zz_diff(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rc ) call Budget_store_add( tbudgets(NBUDGET_RC), 'DRYH', -zw1(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_add( tbudgets(NBUDGET_RR), 'DRYH', -zw2(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_ri ) call Budget_store_add( tbudgets(NBUDGET_RI), 'DRYH', -zw3(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rs ) call Budget_store_add( tbudgets(NBUDGET_RS), 'DRYH', -zw4(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rg ) call Budget_store_add( tbudgets(NBUDGET_RG), 'DRYH', ( -zw5(:, :, :) + zw6(:, :, : ) ) * prhodj(:, :, :) ) + if ( lbudget_rh ) call Budget_store_add( tbudgets(NBUDGET_RH), 'DRYH', ( zw1(:, :, :) + zw2(:, :, :) + zw3(:, :, :) & + + zw4(:, :, :) + zw5(:, :, : )- zw6(:, :, :) ) & + * prhodj(:, :, :) ) + + ZW(:,:,:) = 0. + DO JL=1,IMICRO + ZW(I1(JL), I2(JL), I3(JL)) = ZTOT_RHMLTR(JL) * ZINV_TSTEP + END DO + if ( lbudget_th ) call Budget_store_add( tbudgets(NBUDGET_TH), 'HMLT', -zw(:, :, :) * zz_diff(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_add( tbudgets(NBUDGET_RR), 'HMLT', zw(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rh ) call Budget_store_add( tbudgets(NBUDGET_RH), 'HMLT', -zw(:, :, :) * prhodj(:, :, :) ) + ENDIF + + ZW(:,:,:) = 0. + DO JL=1,IMICRO + ZW(I1(JL), I2(JL), I3(JL)) = ZTOT_RIMLTC(JL) * ZINV_TSTEP + END DO + if ( lbudget_th ) call Budget_store_add( tbudgets(NBUDGET_TH), 'IMLT', -zw(:, :, :) * zz_diff(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rc ) call Budget_store_add( tbudgets(NBUDGET_RC), 'IMLT', zw(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_ri ) call Budget_store_add( tbudgets(NBUDGET_RI), 'IMLT', -zw(:, :, :) * prhodj(:, :, :) ) + + ZW(:,:,:) = 0. + DO JL=1,IMICRO + ZW(I1(JL), I2(JL), I3(JL)) = ZTOT_RCBERI(JL) * ZINV_TSTEP + END DO + if ( lbudget_th ) call Budget_store_add( tbudgets(NBUDGET_TH), 'BERFI', zw(:, :, :) * zz_diff(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rc ) call Budget_store_add( tbudgets(NBUDGET_RC), 'BERFI', -zw(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_ri ) call Budget_store_add( tbudgets(NBUDGET_RI), 'BERFI', zw(:, :, :) * prhodj(:, :, :) ) + + deallocate( zw1, zw2, zw3, zw4 ) + if ( krr == 7 ) deallocate( zw5, zw6 ) + if ( lbudget_th ) deallocate( zz_diff ) +ENDIF +! +!*** 7.3 Final tendencies +! +DO JK = 1, KKT + DO JJ = 1, KJT + DO JI = 1, KIT + PRVS(JI,JJ,JK) = ZW_RVS(JI,JJ,JK) + PRCS(JI,JJ,JK) = ZW_RCS(JI,JJ,JK) + PRRS(JI,JJ,JK) = ZW_RRS(JI,JJ,JK) + PRIS(JI,JJ,JK) = ZW_RIS(JI,JJ,JK) + PRSS(JI,JJ,JK) = ZW_RSS(JI,JJ,JK) + PRGS(JI,JJ,JK) = ZW_RGS(JI,JJ,JK) + PTHS(JI,JJ,JK) = ZW_THS(JI,JJ,JK) + ENDDO + ENDDO +ENDDO +IF (KRR==7) PRHS(:,:,:) = ZW_RHS(:,:,:) +! +!------------------------------------------------------------------------------- +! +!* 8. COMPUTE THE SEDIMENTATION (RS) SOURCE +! ------------------------------------- +! +IF(LSEDIM_AFTER) THEN + ! + !* 8.1 sedimentation + ! + if ( lbudget_rc .and. osedic ) call Budget_store_init( tbudgets(NBUDGET_RC), 'SEDI', prcs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_init( tbudgets(NBUDGET_RR), 'SEDI', prrs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), 'SEDI', pris(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rs ) call Budget_store_init( tbudgets(NBUDGET_RS), 'SEDI', prss(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rg ) call Budget_store_init( tbudgets(NBUDGET_RG), 'SEDI', prgs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rh ) call Budget_store_init( tbudgets(NBUDGET_RH), 'SEDI', prhs(:, :, :) * prhodj(:, :, :) ) + + !Init only if not osedic (to prevent crash with double init) + !Remark: the 2 source terms SEDI and DEPO could be mixed and stored in the same source term (SEDI) + ! if osedic=T and ldeposc=T (a warning is printed in ini_budget in that case) + if ( lbudget_rc .and. ldeposc .and. .not.osedic ) & + call Budget_store_init( tbudgets(NBUDGET_RC), 'DEPO', prcs(:, :, :) * prhodj(:, :, :) ) + + IF(HSEDIM=='STAT') THEN + !SR: It *seems* that we must have two separate calls for ifort + IF(KRR==7) THEN + CALL ICE4_SEDIMENTATION_STAT(IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, IKTB, IKTE, KKT, KKL, & + &PTSTEP, KRR, OSEDIC, LDEPOSC, XVDEPOSC, PDZZ, & + &PRHODREF, PPABST, PTHT, PRHODJ, & + &PRCS, PRCS*PTSTEP, PRRS, PRRS*PTSTEP, PRIS, PRIS*PTSTEP,& + &PRSS, PRSS*PTSTEP, PRGS, PRGS*PTSTEP,& + &PINPRC, PINDEP, PINPRR, ZINPRI, PINPRS, PINPRG, & + &PSEA=PSEA, PTOWN=PTOWN, & + &PINPRH=PINPRH, PRHT=PRHS*PTSTEP, PRHS=PRHS, PFPR=PFPR) + ELSE + CALL ICE4_SEDIMENTATION_STAT(IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, IKTB, IKTE, KKT, KKL, & + &PTSTEP, KRR, OSEDIC, LDEPOSC, XVDEPOSC, PDZZ,& + &PRHODREF, PPABST, PTHT, PRHODJ, & + &PRCS, PRCS*PTSTEP, PRRS, PRRS*PTSTEP, PRIS, PRIS*PTSTEP,& + &PRSS, PRSS*PTSTEP, PRGS, PRGS*PTSTEP,& + &PINPRC, PINDEP, PINPRR, ZINPRI, PINPRS, PINPRG, & + &PSEA=PSEA, PTOWN=PTOWN, & + &PFPR=PFPR) + ENDIF + PINPRS(:,:) = PINPRS(:,:) + ZINPRI(:,:) + !No negativity correction here as we apply sedimentation on PR.S*PTSTEP variables + ELSEIF(HSEDIM=='SPLI') THEN + !SR: It *seems* that we must have two separate calls for ifort + IF(KRR==7) THEN + CALL ICE4_SEDIMENTATION_SPLIT(IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, IKTB, IKTE, KKT, KKL, & + &PTSTEP, KRR, OSEDIC, LDEPOSC, XVDEPOSC, PDZZ, & + &PRHODREF, PPABST, PTHT, PRHODJ, & + &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,& + &PINPRC, PINDEP, PINPRR, ZINPRI, PINPRS, PINPRG, & + &PSEA=PSEA, PTOWN=PTOWN, & + &PINPRH=PINPRH, PRHT=PRHT, PRHS=PRHS, PFPR=PFPR) + ELSE + CALL ICE4_SEDIMENTATION_SPLIT(IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, IKTB, IKTE, KKT, KKL, & + &PTSTEP, KRR, OSEDIC, LDEPOSC, XVDEPOSC, PDZZ, & + &PRHODREF, PPABST, PTHT, PRHODJ, & + &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,& + &PINPRC, PINDEP, PINPRR, ZINPRI, PINPRS, PINPRG, & + &PSEA=PSEA, PTOWN=PTOWN, & + &PFPR=PFPR) + ENDIF + PINPRS(:,:) = PINPRS(:,:) + ZINPRI(:,:) + !We correct negativities with conservation + !SPLI algorith uses a time-splitting. Inside the loop a temporary m.r. is used. + ! It is initialized with the m.r. at T and is modified by two tendencies: + ! sedimentation tendency and an external tendency which represents all other + ! processes (mainly advection and microphysical processes). If both tendencies + ! are negative, sedimentation can remove a specie at a given sub-timestep. From + ! this point sedimentation stops for the remaining sub-timesteps but the other tendency + ! will be still active and will lead to negative values. + ! We could prevent the algorithm to not consume too much a specie, instead we apply + ! a correction here. + CALL CORRECT_NEGATIVITIES(KIT, KJT, KKT, KRR, PRVS, PRCS, PRRS, & + &PRIS, PRSS, PRGS, & + &PTHS, ZZ_LVFACT, ZZ_LSFACT, PRHS) + ELSE + call Print_msg( NVERB_FATAL, 'GEN', 'RAIN_ICE_RED', 'no sedimentation scheme for HSEDIM='//HSEDIM ) + END IF + ! + !* 8.2 budget storage + ! + if ( lbudget_rc .and. osedic ) call Budget_store_end( tbudgets(NBUDGET_RC), 'SEDI', prcs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rr ) call Budget_store_end( tbudgets(NBUDGET_RR), 'SEDI', prrs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'SEDI', pris(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rs ) call Budget_store_end( tbudgets(NBUDGET_RS), 'SEDI', prss(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rg ) call Budget_store_end( tbudgets(NBUDGET_RG), 'SEDI', prgs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rh ) call Budget_store_end( tbudgets(NBUDGET_RH), 'SEDI', prhs(:, :, :) * prhodj(:, :, :) ) + + !If osedic=T and ldeposc=T, DEPO is in fact mixed and stored with the SEDI source term + !(a warning is printed in ini_budget in that case) + if ( lbudget_rc .and. ldeposc .and. .not.osedic) & + call Budget_store_end( tbudgets(NBUDGET_RC), 'DEPO', prcs(:, :, :) * prhodj(:, :, :) ) + + !sedimentation of rain fraction + IF (PRESENT(PRHS)) THEN + CALL ICE4_RAINFR_VERT(IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, KKT, KKL, PRAINFR, PRRS(:,:,:)*PTSTEP, & + &PRSS(:,:,:)*PTSTEP, PRGS(:,:,:)*PTSTEP, PRHS(:,:,:)*PTSTEP) + ELSE + CALL ICE4_RAINFR_VERT(IIB, IIE, KIT, IJB, IJE, KJT, IKB, IKE, KKT, KKL, PRAINFR, PRRS(:,:,:)*PTSTEP, & + &PRSS(:,:,:)*PTSTEP, PRGS(:,:,:)*PTSTEP) + ENDIF +ENDIF +! +! +CONTAINS + ! + SUBROUTINE CORRECT_NEGATIVITIES(KIT, KJT, KKT, KRR, PRV, PRC, PRR, & + &PRI, PRS, PRG, & + &PTH, PLVFACT, PLSFACT, PRH) + ! + IMPLICIT NONE + ! + INTEGER, INTENT(IN) :: KIT, KJT, KKT, KRR + REAL, DIMENSION(KIT, KJT, KKT), INTENT(INOUT) :: PRV, PRC, PRR, PRI, PRS, PRG, PTH + REAL, DIMENSION(KIT, KJT, KKT), INTENT(IN) :: PLVFACT, PLSFACT + REAL, DIMENSION(KIT, KJT, KKT), OPTIONAL, INTENT(INOUT) :: PRH + ! + REAL, DIMENSION(KIT, KJT, KKT) :: ZW + INTEGER :: JI, JJ, JK + ! + ! + !We correct negativities with conservation + ! 1) deal with negative values for mixing ratio, except for vapor + DO JK = 1, KKT + DO JJ = 1, KJT + DO JI = 1, KIT + ZW(JI,JJ,JK) =PRC(JI,JJ,JK)-MAX(PRC(JI,JJ,JK), 0.) + PRV(JI,JJ,JK)=PRV(JI,JJ,JK)+ZW(JI,JJ,JK) + PTH(JI,JJ,JK)=PTH(JI,JJ,JK)-ZW(JI,JJ,JK)*PLVFACT(JI,JJ,JK) + PRC(JI,JJ,JK)=PRC(JI,JJ,JK)-ZW(JI,JJ,JK) + + ZW(JI,JJ,JK) =PRR(JI,JJ,JK)-MAX(PRR(JI,JJ,JK), 0.) + PRV(JI,JJ,JK)=PRV(JI,JJ,JK)+ZW(JI,JJ,JK) + PTH(JI,JJ,JK)=PTH(JI,JJ,JK)-ZW(JI,JJ,JK)*PLVFACT(JI,JJ,JK) + PRR(JI,JJ,JK)=PRR(JI,JJ,JK)-ZW(JI,JJ,JK) + + ZW(JI,JJ,JK) =PRI(JI,JJ,JK)-MAX(PRI(JI,JJ,JK), 0.) + PRV(JI,JJ,JK)=PRV(JI,JJ,JK)+ZW(JI,JJ,JK) + PTH(JI,JJ,JK)=PTH(JI,JJ,JK)-ZW(JI,JJ,JK)*PLSFACT(JI,JJ,JK) + PRI(JI,JJ,JK)=PRI(JI,JJ,JK)-ZW(JI,JJ,JK) + + ZW(JI,JJ,JK) =PRS(JI,JJ,JK)-MAX(PRS(JI,JJ,JK), 0.) + PRV(JI,JJ,JK)=PRV(JI,JJ,JK)+ZW(JI,JJ,JK) + PTH(JI,JJ,JK)=PTH(JI,JJ,JK)-ZW(JI,JJ,JK)*PLSFACT(JI,JJ,JK) + PRS(JI,JJ,JK)=PRS(JI,JJ,JK)-ZW(JI,JJ,JK) + + ZW(JI,JJ,JK) =PRG(JI,JJ,JK)-MAX(PRG(JI,JJ,JK), 0.) + PRV(JI,JJ,JK)=PRV(JI,JJ,JK)+ZW(JI,JJ,JK) + PTH(JI,JJ,JK)=PTH(JI,JJ,JK)-ZW(JI,JJ,JK)*PLSFACT(JI,JJ,JK) + PRG(JI,JJ,JK)=PRG(JI,JJ,JK)-ZW(JI,JJ,JK) + ENDDO + ENDDO + ENDDO + + IF(KRR==7) THEN + DO JK = 1, KKT + DO JJ = 1, KJT + DO JI = 1, KIT + ZW(JI,JJ,JK) =PRH(JI,JJ,JK)-MAX(PRH(JI,JJ,JK), 0.) + PRV(JI,JJ,JK)=PRV(JI,JJ,JK)+ZW(JI,JJ,JK) + PTH(JI,JJ,JK)=PTH(JI,JJ,JK)-ZW(JI,JJ,JK)*PLSFACT(JI,JJ,JK) + PRH(JI,JJ,JK)=PRH(JI,JJ,JK)-ZW(JI,JJ,JK) + ENDDO + ENDDO + ENDDO + ENDIF + + ! 2) deal with negative vapor mixing ratio + + DO JK = 1, KKT + DO JJ = 1, KJT + DO JI = 1, KIT + ! for rc and ri, we keep ice fraction constant + ZW(JI,JJ,JK)=MIN(1., MAX(XRTMIN(1)-PRV(JI,JJ,JK), 0.) / & + &MAX(PRC(JI,JJ,JK)+PRI(JI,JJ,JK), 1.E-20)) ! Proportion of rc+ri to convert into rv + PTH(JI,JJ,JK)=PTH(JI,JJ,JK)-ZW(JI,JJ,JK)* & + &(PRC(JI,JJ,JK)*PLVFACT(JI,JJ,JK)+PRI(JI,JJ,JK)*PLSFACT(JI,JJ,JK)) + PRV(JI,JJ,JK)=PRV(JI,JJ,JK)+ZW(JI,JJ,JK)*(PRC(JI,JJ,JK)+PRI(JI,JJ,JK)) + PRC(JI,JJ,JK)=(1.-ZW(JI,JJ,JK))*PRC(JI,JJ,JK) + PRI(JI,JJ,JK)=(1.-ZW(JI,JJ,JK))*PRI(JI,JJ,JK) + + ZW(JI,JJ,JK)=MIN(MAX(PRR(JI,JJ,JK), 0.), & + &MAX(XRTMIN(1)-PRV(JI,JJ,JK), 0.)) ! Quantity of rr to convert into rv + PRV(JI,JJ,JK)=PRV(JI,JJ,JK)+ZW(JI,JJ,JK) + PRR(JI,JJ,JK)=PRR(JI,JJ,JK)-ZW(JI,JJ,JK) + PTH(JI,JJ,JK)=PTH(JI,JJ,JK)-ZW(JI,JJ,JK)*PLVFACT(JI,JJ,JK) + + ZW(JI,JJ,JK)=MIN(MAX(PRS(JI,JJ,JK), 0.), & + &MAX(XRTMIN(1)-PRV(JI,JJ,JK), 0.)) ! Quantity of rs to convert into rv + PRV(JI,JJ,JK)=PRV(JI,JJ,JK)+ZW(JI,JJ,JK) + PRS(JI,JJ,JK)=PRS(JI,JJ,JK)-ZW(JI,JJ,JK) + PTH(JI,JJ,JK)=PTH(JI,JJ,JK)-ZW(JI,JJ,JK)*PLSFACT(JI,JJ,JK) + + ZW(JI,JJ,JK)=MIN(MAX(PRG(JI,JJ,JK), 0.), & + &MAX(XRTMIN(1)-PRV(JI,JJ,JK), 0.)) ! Quantity of rg to convert into rv + PRV(JI,JJ,JK)=PRV(JI,JJ,JK)+ZW(JI,JJ,JK) + PRG(JI,JJ,JK)=PRG(JI,JJ,JK)-ZW(JI,JJ,JK) + PTH(JI,JJ,JK)=PTH(JI,JJ,JK)-ZW(JI,JJ,JK)*PLSFACT(JI,JJ,JK) + ENDDO + ENDDO + ENDDO + + IF(KRR==7) THEN + DO JK = 1, KKT + DO JJ = 1, KJT + DO JI = 1, KIT + ZW(JI,JJ,JK)=MIN(MAX(PRH(JI,JJ,JK), 0.), & + &MAX(XRTMIN(1)-PRV(JI,JJ,JK), 0.)) ! Quantity of rh to convert into rv + PRV(JI,JJ,JK)=PRV(JI,JJ,JK)+ZW(JI,JJ,JK) + PRH(JI,JJ,JK)=PRH(JI,JJ,JK)-ZW(JI,JJ,JK) + PTH(JI,JJ,JK)=PTH(JI,JJ,JK)-ZW(JI,JJ,JK)*PLSFACT(JI,JJ,JK) + ENDDO + ENDDO + ENDDO + ENDIF + ! + ! + END SUBROUTINE CORRECT_NEGATIVITIES + +! +END SUBROUTINE RAIN_ICE_RED diff --git a/src/mesonh/micro/rain_ice_sedimentation_split.f90 b/src/mesonh/micro/rain_ice_sedimentation_split.f90 new file mode 100644 index 000000000..370cc07ef --- /dev/null +++ b/src/mesonh/micro/rain_ice_sedimentation_split.f90 @@ -0,0 +1,617 @@ +!MNH_LIC Copyright 1995-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! Modifications: +! P. Wautelet 25/02/2019: split rain_ice (cleaner and easier to maintain/debug) +! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 +! P. Wautelet 02/2020: use the new data structures and subroutines for budgets +!----------------------------------------------------------------- +MODULE MODE_RAIN_ICE_SEDIMENTATION_SPLIT + + IMPLICIT NONE + + PRIVATE + + PUBLIC RAIN_ICE_SEDIMENTATION_SPLIT + +CONTAINS + +SUBROUTINE RAIN_ICE_SEDIMENTATION_SPLIT(KIB, KIE, KJB, KJE, KKB, KKE, KKTB, KKTE, KKT, KKL,& + KSPLITR,PTSTEP, & + KRR,OSEDIC,ODEPOSC,PINPRC,PINDEP,PINPRR,PINPRS,PINPRG,PDZZ,PRHODREF,PPABST,PTHT,PRHODJ,& + PINPRR3D,PRCS,PRCT,PRRS,PRRT,PRIS,PRIT,PRSS,PRST,PRGS,PRGT,PSEA,PTOWN,PINPRH,PRHS,PRHT,PFPR) +! +!* 0. DECLARATIONS +! ------------ +! +use modd_budget, only: lbudget_rc, lbudget_rr, lbudget_ri, lbudget_rs, lbudget_rg, lbudget_rh, & + NBUDGET_RC, NBUDGET_RR, NBUDGET_RI, NBUDGET_RS, NBUDGET_RG, NBUDGET_RH, & + tbudgets +use MODD_CST, only: XCPD, XP00, XRD, XRHOLW +use MODD_PARAM_ICE, only: XVDEPOSC +use MODD_RAIN_ICE_DESCR, only: XCC, XCONC_LAND, xconc_sea, xconc_urban, XDC, XCEXVT, & + XALPHAC, XNUC, XALPHAC2, XNUC2, XLBEXC, XRTMIN, XLBEXC, XLBC +use MODD_RAIN_ICE_PARAM, only: XEXSEDG, XEXSEDH, XEXCSEDI, XEXSEDR, XEXSEDS, & + XFSEDG, XFSEDH, XFSEDI, XFSEDR, XFSEDS, XFSEDC + +use mode_budget, only: Budget_store_init, Budget_store_end +use mode_tools, only: Countjv + +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +INTEGER, INTENT(IN) :: KIB, KIE, KJB, KJE, KKB, KKE, KKTB, KKTE, KKT +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO +INTEGER, INTENT(IN) :: KSPLITR ! Number of small time step + ! integration for rain sedimendation +REAL, INTENT(IN) :: PTSTEP ! Double Time step + ! (single if cold start) +INTEGER, INTENT(IN) :: KRR ! Number of moist variable +LOGICAL, INTENT(IN) :: OSEDIC ! Switch for droplet sedim. +LOGICAL, INTENT(IN) :: ODEPOSC ! Switch for droplet depos. +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRC ! Cloud instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINDEP ! Cloud instant deposition +REAL, DIMENSION(:,:), INTENT(OUT) :: PINPRR ! Rain instant precip +REAL, DIMENSION(:,:), INTENT(OUT) :: PINPRS ! Snow instant precip +REAL, DIMENSION(:,:), INTENT(OUT) :: PINPRG ! Graupel instant precip +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! Layer thikness (m) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! absolute pressure at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PINPRR3D! Rain inst precip 3D +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRRS ! Rain water m.r. source +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRIT ! Pristine ice m.r. at t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRSS ! Snow/aggregate m.r. source +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRGS ! Graupel m.r. source +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGT ! Graupel/hail m.r. at t +REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! Sea Mask +REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN ! Fraction that is town +REAL, DIMENSION(:,:), OPTIONAL, INTENT(OUT) :: PINPRH ! Hail instant precip +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(INOUT) :: PRHS ! Hail m.r. source +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t +REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(OUT) :: PFPR ! upper-air precipitation fluxes +! +!* 0.2 declaration of local variables +! +! +INTEGER, SAVE :: IOLDALLOCC = 6000 +INTEGER, SAVE :: IOLDALLOCR = 6000 +INTEGER, SAVE :: IOLDALLOCI = 6000 +INTEGER, SAVE :: IOLDALLOCS = 6000 +INTEGER, SAVE :: IOLDALLOCG = 6000 +INTEGER, SAVE :: IOLDALLOCH = 6000 +INTEGER :: ILENALLOCC,ILENALLOCR,ILENALLOCI,ILENALLOCS,ILENALLOCG,ILENALLOCH +INTEGER :: ILISTLENC,ILISTLENR,ILISTLENI,ILISTLENS,ILISTLENG,ILISTLENH +INTEGER :: ISEDIMR,ISEDIMC, ISEDIMI, ISEDIMS, ISEDIMG, ISEDIMH +INTEGER :: JK ! Vertical loop index for the rain sedimentation +INTEGER :: JN ! Temporal loop index for the rain sedimentation +INTEGER :: JJ ! Loop index for the interpolation +INTEGER :: JL +INTEGER, DIMENSION(SIZE(PRCS)) :: IC1,IC2,IC3 ! Used to replace the COUNT +INTEGER, DIMENSION(SIZE(PRCS)) :: IR1,IR2,IR3 ! Used to replace the COUNT +INTEGER, DIMENSION(SIZE(PRCS)) :: IS1,IS2,IS3 ! Used to replace the COUNT +INTEGER, DIMENSION(SIZE(PRCS)) :: II1,II2,II3 ! Used to replace the COUNT +INTEGER, DIMENSION(SIZE(PRCS)) :: IG1,IG2,IG3 ! Used to replace the COUNT +INTEGER, DIMENSION(SIZE(PRCS)) :: IH1,IH2,IH3 ! Used to replace the COUNT +INTEGER, DIMENSION(:), ALLOCATABLE :: ILISTR,ILISTC,ILISTI,ILISTS,ILISTG,ILISTH +LOGICAL, DIMENSION(SIZE(PRCS,1),SIZE(PRCS,2)):: GDEP +LOGICAL, DIMENSION(SIZE(PRCS,1),SIZE(PRCS,2),SIZE(PRCS,3)) & + :: GSEDIMR,GSEDIMC, GSEDIMI, GSEDIMS, GSEDIMG, GSEDIMH ! Test where to compute the SED processes +REAL :: ZINVTSTEP +REAL :: ZTSPLITR ! Small time step for rain sedimentation +REAL, DIMENSION(SIZE(XRTMIN)) :: ZRTMIN +! XRTMIN = Minimum value for the mixing ratio +! ZRTMIN = Minimum value for the source (tendency) +REAL, DIMENSION(:), ALLOCATABLE :: ZRCS ! Cloud water m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRRS ! Rain water m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRIS ! Pristine ice m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRSS ! Snow/aggregate m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRGS ! Graupel m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRHS ! Hail m.r. source +REAL, DIMENSION(:), ALLOCATABLE :: ZRCT ! Cloud water m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZRHODREFC,& ! RHO Dry REFerence + ZRHODREFR,& ! RHO Dry REFerence + ZRHODREFI,& ! RHO Dry REFerence + ZRHODREFS,& ! RHO Dry REFerence + ZRHODREFG,& ! RHO Dry REFerence + ZRHODREFH,& ! RHO Dry REFerence + ZCC, & ! terminal velocity + ZFSEDC1D, & ! For cloud sedimentation + ZWLBDC, & ! Slope parameter of the droplet distribution + ZCONC, & ! Concentration des aerosols + ZRAY1D, & ! Mean radius + ZWLBDA, & ! Libre parcours moyen + ZZT, & ! Temperature + ZPRES ! Pressure +REAL, DIMENSION(SIZE(PRCS,1),SIZE(PRCS,2)) & + :: ZCONC_TMP ! Weighted concentration +REAL, DIMENSION(SIZE(PRCS,1),SIZE(PRCS,2),SIZE(PRCS,3)) :: ZCONC3D ! droplet condensation +REAL, DIMENSION(SIZE(PRCS,1),SIZE(PRCS,2),SIZE(PRCS,3)) :: & + ZRAY, & ! Cloud Mean radius + ZLBC, & ! XLBC weighted by sea fraction + ZFSEDC +REAL, DIMENSION(SIZE(PRCS,1),SIZE(PRCS,2),SIZE(PRCS,3)) & + :: ZPRCS,ZPRRS,ZPRSS,ZPRGS,ZPRHS ! Mixing ratios created during the time step +REAL, DIMENSION(SIZE(PRCS,1),SIZE(PRCS,2),SIZE(PRCS,3)) & + :: ZW ! work array +REAL, DIMENSION(SIZE(PRCS,1),SIZE(PRCS,2),0:SIZE(PRCS,3)+1) & + :: ZWSED ! sedimentation fluxes +!------------------------------------------------------------------------------- + +if ( lbudget_rc .and. osedic ) call Budget_store_init( tbudgets(NBUDGET_RC), 'SEDI', prcs(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_rr ) call Budget_store_init( tbudgets(NBUDGET_RR), 'SEDI', prrs(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), 'SEDI', pris(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_rs ) call Budget_store_init( tbudgets(NBUDGET_RS), 'SEDI', prss(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_rg ) call Budget_store_init( tbudgets(NBUDGET_RG), 'SEDI', prgs(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_rh ) call Budget_store_init( tbudgets(NBUDGET_RH), 'SEDI', prhs(:, :, :) * prhodj(:, :, :) ) +! +! O. Initialization of for sedimentation +! +ZINVTSTEP=1./PTSTEP +ZTSPLITR= PTSTEP / REAL(KSPLITR) +! +IF (OSEDIC) PINPRC (:,:) = 0. +IF (ODEPOSC) PINDEP (:,:) = 0. +PINPRR (:,:) = 0. +PINPRR3D (:,:,:) = 0. +PINPRS (:,:) = 0. +PINPRG (:,:) = 0. +IF ( KRR == 7 ) PINPRH (:,:) = 0. +IF (PRESENT(PFPR)) PFPR(:,:,:,:) = 0. +! +!* 1. Parameters for cloud sedimentation +! + IF (OSEDIC) THEN + ZRAY(:,:,:) = 0. + ZLBC(:,:,:) = XLBC(1) + ZFSEDC(:,:,:) = XFSEDC(1) + ZCONC3D(:,:,:)= XCONC_LAND + ZCONC_TMP(:,:)= XCONC_LAND + IF (PRESENT(PSEA)) THEN + ZCONC_TMP(:,:)=PSEA(:,:)*XCONC_SEA+(1.-PSEA(:,:))*XCONC_LAND + + DO JK=KKTB,KKTE + ZLBC(:,:,JK) = PSEA(:,:)*XLBC(2)+(1.-PSEA(:,:))*XLBC(1) + ZFSEDC(:,:,JK) = (PSEA(:,:)*XFSEDC(2)+(1.-PSEA(:,:))*XFSEDC(1)) + ZFSEDC(:,:,JK) = MAX(MIN(XFSEDC(1),XFSEDC(2)),ZFSEDC(:,:,JK)) + ZCONC3D(:,:,JK)= (1.-PTOWN(:,:))*ZCONC_TMP(:,:)+PTOWN(:,:)*XCONC_URBAN + ZRAY(:,:,JK) = 0.5*((1.-PSEA(:,:))*GAMMA(XNUC+1.0/XALPHAC)/(GAMMA(XNUC)) + & + PSEA(:,:)*GAMMA(XNUC2+1.0/XALPHAC2)/(GAMMA(XNUC2))) + END DO + ELSE + ZCONC3D(:,:,:) = XCONC_LAND + ZRAY(:,:,:) = 0.5*(GAMMA(XNUC+1.0/XALPHAC)/(GAMMA(XNUC))) + END IF + ZRAY(:,:,:) = MAX(1.,ZRAY(:,:,:)) + ZLBC(:,:,:) = MAX(MIN(XLBC(1),XLBC(2)),ZLBC(:,:,:)) + ENDIF +! +!* 2. compute the fluxes +! +! optimization by looking for locations where +! the precipitating fields are larger than a minimal value only !!! +! For optimization we consider each variable separately + +ZRTMIN(:) = XRTMIN(:) * ZINVTSTEP +IF (OSEDIC) GSEDIMC(:,:,:) = .FALSE. +GSEDIMR(:,:,:) = .FALSE. +GSEDIMI(:,:,:) = .FALSE. +GSEDIMS(:,:,:) = .FALSE. +GSEDIMG(:,:,:) = .FALSE. +IF ( KRR == 7 ) GSEDIMH(:,:,:) = .FALSE. +! +ILENALLOCR = 0 +IF (OSEDIC) ILENALLOCC = 0 +ILENALLOCI = 0 +ILENALLOCS = 0 +ILENALLOCG = 0 +IF ( KRR == 7 ) ILENALLOCH = 0 +! +! ZPiS = Specie i source creating during the current time step +! PRiS = Source of the previous time step +! +IF (OSEDIC) THEN + ZPRCS(:,:,:) = 0.0 + ZPRCS(:,:,:) = PRCS(:,:,:)-PRCT(:,:,:)* ZINVTSTEP + PRCS(:,:,:) = PRCT(:,:,:)* ZINVTSTEP +END IF +ZPRRS(:,:,:) = 0.0 +ZPRSS(:,:,:) = 0.0 +ZPRGS(:,:,:) = 0.0 +IF ( KRR == 7 ) ZPRHS(:,:,:) = 0.0 +! +ZPRRS(:,:,:) = PRRS(:,:,:)-PRRT(:,:,:)* ZINVTSTEP +ZPRSS(:,:,:) = PRSS(:,:,:)-PRST(:,:,:)* ZINVTSTEP +ZPRGS(:,:,:) = PRGS(:,:,:)-PRGT(:,:,:)* ZINVTSTEP +IF ( KRR == 7 ) ZPRHS(:,:,:) = PRHS(:,:,:)-PRHT(:,:,:)* ZINVTSTEP +PRRS(:,:,:) = PRRT(:,:,:)* ZINVTSTEP +PRSS(:,:,:) = PRST(:,:,:)* ZINVTSTEP +PRGS(:,:,:) = PRGT(:,:,:)* ZINVTSTEP +IF ( KRR == 7 ) PRHS(:,:,:) = PRHT(:,:,:)* ZINVTSTEP +! +! PRiS = Source of the previous time step + source created during the subtime +! step +! +DO JN = 1 , KSPLITR + IF( JN==1 ) THEN + IF (OSEDIC) PRCS(:,:,:) = PRCS(:,:,:) + ZPRCS(:,:,:)/KSPLITR + PRRS(:,:,:) = PRRS(:,:,:) + ZPRRS(:,:,:)/KSPLITR + PRSS(:,:,:) = PRSS(:,:,:) + ZPRSS(:,:,:)/KSPLITR + PRGS(:,:,:) = PRGS(:,:,:) + ZPRGS(:,:,:)/KSPLITR + IF ( KRR == 7 ) PRHS(:,:,:) = PRHS(:,:,:) + ZPRHS(:,:,:)/KSPLITR + DO JK = KKTB , KKTE + ZW(:,:,JK) =ZTSPLITR/(PRHODREF(:,:,JK)* PDZZ(:,:,JK)) + END DO + ELSE + IF (OSEDIC) PRCS(:,:,:) = PRCS(:,:,:) + ZPRCS(:,:,:)*ZTSPLITR + PRRS(:,:,:) = PRRS(:,:,:) + ZPRRS(:,:,:)*ZTSPLITR + PRSS(:,:,:) = PRSS(:,:,:) + ZPRSS(:,:,:)*ZTSPLITR + PRGS(:,:,:) = PRGS(:,:,:) + ZPRGS(:,:,:)*ZTSPLITR + IF ( KRR == 7 ) PRHS(:,:,:) = PRHS(:,:,:) + ZPRHS(:,:,:)*ZTSPLITR + END IF + ! + IF (OSEDIC) GSEDIMC(KIB:KIE,KJB:KJE,KKTB:KKTE) = & + PRCS(KIB:KIE,KJB:KJE,KKTB:KKTE)>ZRTMIN(2) + GSEDIMR(KIB:KIE,KJB:KJE,KKTB:KKTE) = & + PRRS(KIB:KIE,KJB:KJE,KKTB:KKTE)>ZRTMIN(3) + GSEDIMI(KIB:KIE,KJB:KJE,KKTB:KKTE) = & + PRIS(KIB:KIE,KJB:KJE,KKTB:KKTE)>ZRTMIN(4) + GSEDIMS(KIB:KIE,KJB:KJE,KKTB:KKTE) = & + PRSS(KIB:KIE,KJB:KJE,KKTB:KKTE)>ZRTMIN(5) + GSEDIMG(KIB:KIE,KJB:KJE,KKTB:KKTE) = & + PRGS(KIB:KIE,KJB:KJE,KKTB:KKTE)>ZRTMIN(6) + IF ( KRR == 7 ) GSEDIMH(KIB:KIE,KJB:KJE,KKTB:KKTE) = & + PRHS(KIB:KIE,KJB:KJE,KKTB:KKTE)>ZRTMIN(7) +! + IF (OSEDIC) ISEDIMC = COUNTJV( GSEDIMC(:,:,:),IC1(:),IC2(:),IC3(:)) + ISEDIMR = COUNTJV( GSEDIMR(:,:,:),IR1(:),IR2(:),IR3(:)) + ISEDIMI = COUNTJV( GSEDIMI(:,:,:),II1(:),II2(:),II3(:)) + ISEDIMS = COUNTJV( GSEDIMS(:,:,:),IS1(:),IS2(:),IS3(:)) + ISEDIMG = COUNTJV( GSEDIMG(:,:,:),IG1(:),IG2(:),IG3(:)) + IF ( KRR == 7 ) ISEDIMH = COUNTJV( GSEDIMH(:,:,:),IH1(:),IH2(:),IH3(:)) +! +!* 2.1 for cloud +! + IF (OSEDIC) THEN + ZWSED(:,:,:) = 0. + IF( JN==1 ) PRCS(:,:,:) = PRCS(:,:,:) * PTSTEP + IF( ISEDIMC >= 1 ) THEN + IF ( ISEDIMC .GT. ILENALLOCC ) THEN + IF ( ILENALLOCC .GT. 0 ) THEN + DEALLOCATE (ZRCS, ZRHODREFC, ILISTC,ZWLBDC,ZCONC,ZRCT, & + ZZT,ZPRES,ZRAY1D,ZFSEDC1D,ZWLBDA,ZCC ) + END IF + ILENALLOCC = MAX (IOLDALLOCC, 2*ISEDIMC ) + IOLDALLOCC = ILENALLOCC + ALLOCATE(ZRCS(ILENALLOCC), ZRHODREFC(ILENALLOCC), ILISTC(ILENALLOCC), & + ZWLBDC(ILENALLOCC), ZCONC(ILENALLOCC), ZRCT(ILENALLOCC), ZZT(ILENALLOCC), & + ZPRES(ILENALLOCC), ZRAY1D(ILENALLOCC), ZFSEDC1D(ILENALLOCC), & + ZWLBDA(ILENALLOCC), ZCC(ILENALLOCC) ) + END IF +! + DO JL=1,ISEDIMC + ZRCS(JL) = PRCS(IC1(JL),IC2(JL),IC3(JL)) + ZRHODREFC(JL) = PRHODREF(IC1(JL),IC2(JL),IC3(JL)) + ZWLBDC(JL) = ZLBC(IC1(JL),IC2(JL),IC3(JL)) + ZCONC(JL) = ZCONC3D(IC1(JL),IC2(JL),IC3(JL)) + ZRCT(JL) = PRCT(IC1(JL),IC2(JL),IC3(JL)) + ZZT(JL) = PTHT(IC1(JL),IC2(JL),IC3(JL)) + ZPRES(JL) = PPABST(IC1(JL),IC2(JL),IC3(JL)) + ZRAY1D(JL) = ZRAY(IC1(JL),IC2(JL),IC3(JL)) + ZFSEDC1D(JL) = ZFSEDC(IC1(JL),IC2(JL),IC3(JL)) + END DO +! + ILISTLENC = 0 + DO JL=1,ISEDIMC + IF( ZRCS(JL) .GT. ZRTMIN(2) ) THEN + ILISTLENC = ILISTLENC + 1 + ILISTC(ILISTLENC) = JL + END IF + END DO + DO JJ = 1, ILISTLENC + JL = ILISTC(JJ) + IF (ZRCS(JL) .GT. ZRTMIN(2) .AND. ZRCT(JL) .GT. XRTMIN(2)) THEN + ZWLBDC(JL) = ZWLBDC(JL) * ZCONC(JL) / (ZRHODREFC(JL) * ZRCT(JL)) + ZWLBDC(JL) = ZWLBDC(JL)**XLBEXC + ZRAY1D(JL) = ZRAY1D(JL) / ZWLBDC(JL) !! ZRAY : mean diameter=M(1)/2 + ZZT(JL) = ZZT(JL) * (ZPRES(JL)/XP00)**(XRD/XCPD) + ZWLBDA(JL) = 6.6E-8*(101325./ZPRES(JL))*(ZZT(JL)/293.15) + ZCC(JL) = XCC*(1.+1.26*ZWLBDA(JL)/ZRAY1D(JL)) !! XCC modified for cloud + ZWSED (IC1(JL),IC2(JL),IC3(JL))= ZRHODREFC(JL)**(-XCEXVT +1 ) * & + ZWLBDC(JL)**(-XDC)*ZCC(JL)*ZFSEDC1D(JL) * ZRCS(JL) + END IF + END DO + END IF + DO JK = KKTB , KKTE + PRCS(:,:,JK) = PRCS(:,:,JK) + ZW(:,:,JK)*(ZWSED(:,:,JK+KKL)-ZWSED(:,:,JK)) + END DO + IF (PRESENT(PFPR)) THEN + DO JK = KKTB , KKTE + PFPR(:,:,JK,2)=ZWSED(:,:,JK) + ENDDO + ENDIF + PINPRC(:,:) = PINPRC(:,:) + ZWSED(:,:,KKB) / XRHOLW / KSPLITR + IF( JN==KSPLITR ) THEN + PRCS(:,:,:) = PRCS(:,:,:) * ZINVTSTEP + END IF + END IF +! +!* 2.2 for rain +! + IF( JN==1 ) PRRS(:,:,:) = PRRS(:,:,:) * PTSTEP + ZWSED(:,:,:) = 0. + IF( ISEDIMR >= 1 ) THEN + IF ( ISEDIMR .GT. ILENALLOCR ) THEN + IF ( ILENALLOCR .GT. 0 ) THEN + DEALLOCATE (ZRRS, ZRHODREFR, ILISTR) + END IF + ILENALLOCR = MAX (IOLDALLOCR, 2*ISEDIMR ) + IOLDALLOCR = ILENALLOCR + ALLOCATE(ZRRS(ILENALLOCR), ZRHODREFR(ILENALLOCR), ILISTR(ILENALLOCR)) + END IF +! + DO JL=1,ISEDIMR + ZRRS(JL) = PRRS(IR1(JL),IR2(JL),IR3(JL)) + ZRHODREFR(JL) = PRHODREF(IR1(JL),IR2(JL),IR3(JL)) + END DO +! + ILISTLENR = 0 + DO JL=1,ISEDIMR + IF( ZRRS(JL) .GT. ZRTMIN(3) ) THEN + ILISTLENR = ILISTLENR + 1 + ILISTR(ILISTLENR) = JL + END IF + END DO + DO JJ = 1, ILISTLENR + JL = ILISTR(JJ) + ZWSED (IR1(JL),IR2(JL),IR3(JL))= XFSEDR * ZRRS(JL)**XEXSEDR * & + ZRHODREFR(JL)**(XEXSEDR-XCEXVT) + END DO + END IF + DO JK = KKTB , KKTE + PRRS(:,:,JK) = PRRS(:,:,JK) + ZW(:,:,JK)*(ZWSED(:,:,JK+KKL)-ZWSED(:,:,JK)) + END DO + IF (PRESENT(PFPR)) THEN + DO JK = KKTB , KKTE + PFPR(:,:,JK,3)=ZWSED(:,:,JK) + ENDDO + ENDIF + PINPRR(:,:) = PINPRR(:,:) + ZWSED(:,:,KKB)/XRHOLW/KSPLITR + PINPRR3D(:,:,:) = PINPRR3D(:,:,:) + ZWSED(:,:,1:KKT)/XRHOLW/KSPLITR + IF( JN==KSPLITR ) THEN + PRRS(:,:,:) = PRRS(:,:,:) * ZINVTSTEP + END IF +! +!* 2.3 for pristine ice +! + IF( JN==1 ) PRIS(:,:,:) = PRIS(:,:,:) * PTSTEP + ZWSED(:,:,:) = 0. + IF( ISEDIMI >= 1 ) THEN + IF ( ISEDIMI .GT. ILENALLOCI ) THEN + IF ( ILENALLOCI .GT. 0 ) THEN + DEALLOCATE (ZRIS, ZRHODREFI, ILISTI) + END IF + ILENALLOCI = MAX (IOLDALLOCI, 2*ISEDIMI ) + IOLDALLOCI = ILENALLOCI + ALLOCATE(ZRIS(ILENALLOCI), ZRHODREFI(ILENALLOCI), ILISTI(ILENALLOCI)) + END IF +! + DO JL=1,ISEDIMI + ZRIS(JL) = PRIS(II1(JL),II2(JL),II3(JL)) + ZRHODREFI(JL) = PRHODREF(II1(JL),II2(JL),II3(JL)) + END DO +! + ILISTLENI = 0 + DO JL=1,ISEDIMI + IF( ZRIS(JL) .GT. MAX(ZRTMIN(4),1.0E-7 )) THEN ! limitation of the McF&H formula + ILISTLENI = ILISTLENI + 1 + ILISTI(ILISTLENI) = JL + END IF + END DO + DO JJ = 1, ILISTLENI + JL = ILISTI(JJ) + ZWSED (II1(JL),II2(JL),II3(JL))= XFSEDI * ZRIS(JL) * & + ZRHODREFI(JL)**(1.0-XCEXVT) * & ! McF&H + MAX( 0.05E6,-0.15319E6-0.021454E6* & + ALOG(ZRHODREFI(JL)*ZRIS(JL)) )**XEXCSEDI + END DO + END IF + DO JK = KKTB , KKTE + PRIS(:,:,JK) = PRIS(:,:,JK) + ZW(:,:,JK)*(ZWSED(:,:,JK+KKL)-ZWSED(:,:,JK)) + END DO + IF (PRESENT(PFPR)) THEN + DO JK = KKTB , KKTE + PFPR(:,:,JK,4)=ZWSED(:,:,JK) + ENDDO + ENDIF + IF( JN==KSPLITR ) THEN + PRIS(:,:,:) = PRIS(:,:,:) * ZINVTSTEP + END IF +! +!* 2.4 for aggregates/snow +! + IF( JN==1 ) PRSS(:,:,:) = PRSS(:,:,:) * PTSTEP + ZWSED(:,:,:) = 0. + IF( ISEDIMS >= 1 ) THEN + IF ( ISEDIMS .GT. ILENALLOCS ) THEN + IF ( ILENALLOCS .GT. 0 ) THEN + DEALLOCATE (ZRSS, ZRHODREFS, ILISTS) + END IF + ILENALLOCS = MAX (IOLDALLOCS, 2*ISEDIMS ) + IOLDALLOCS = ILENALLOCS + ALLOCATE(ZRSS(ILENALLOCS), ZRHODREFS(ILENALLOCS), ILISTS(ILENALLOCS)) + END IF +! + DO JL=1,ISEDIMS + ZRSS(JL) = PRSS(IS1(JL),IS2(JL),IS3(JL)) + ZRHODREFS(JL) = PRHODREF(IS1(JL),IS2(JL),IS3(JL)) + END DO +! + ILISTLENS = 0 + DO JL=1,ISEDIMS + IF( ZRSS(JL) .GT. ZRTMIN(5) ) THEN + ILISTLENS = ILISTLENS + 1 + ILISTS(ILISTLENS) = JL + END IF + END DO + DO JJ = 1, ILISTLENS + JL = ILISTS(JJ) + ZWSED (IS1(JL),IS2(JL),IS3(JL))= XFSEDS * ZRSS(JL)**XEXSEDS * & + ZRHODREFS(JL)**(XEXSEDS-XCEXVT) + END DO + END IF + DO JK = KKTB , KKTE + PRSS(:,:,JK) = PRSS(:,:,JK) + ZW(:,:,JK)*(ZWSED(:,:,JK+KKL)-ZWSED(:,:,JK)) + END DO + IF (PRESENT(PFPR)) THEN + DO JK = KKTB , KKTE + PFPR(:,:,JK,5)=ZWSED(:,:,JK) + ENDDO + ENDIF + PINPRS(:,:) = PINPRS(:,:) + ZWSED(:,:,KKB)/XRHOLW/KSPLITR + IF( JN==KSPLITR ) THEN + PRSS(:,:,:) = PRSS(:,:,:) * ZINVTSTEP + END IF +! +!* 2.5 for graupeln +! + ZWSED(:,:,:) = 0. + IF( JN==1 ) PRGS(:,:,:) = PRGS(:,:,:) * PTSTEP + IF( ISEDIMG >= 1 ) THEN + IF ( ISEDIMG .GT. ILENALLOCG ) THEN + IF ( ILENALLOCG .GT. 0 ) THEN + DEALLOCATE (ZRGS, ZRHODREFG, ILISTG) + END IF + ILENALLOCG = MAX (IOLDALLOCG, 2*ISEDIMG ) + IOLDALLOCG = ILENALLOCG + ALLOCATE(ZRGS(ILENALLOCG), ZRHODREFG(ILENALLOCG), ILISTG(ILENALLOCG)) + END IF +! + DO JL=1,ISEDIMG + ZRGS(JL) = PRGS(IG1(JL),IG2(JL),IG3(JL)) + ZRHODREFG(JL) = PRHODREF(IG1(JL),IG2(JL),IG3(JL)) + END DO +! + ILISTLENG = 0 + DO JL=1,ISEDIMG + IF( ZRGS(JL) .GT. ZRTMIN(6) ) THEN + ILISTLENG = ILISTLENG + 1 + ILISTG(ILISTLENG) = JL + END IF + END DO + DO JJ = 1, ILISTLENG + JL = ILISTG(JJ) + ZWSED (IG1(JL),IG2(JL),IG3(JL))= XFSEDG * ZRGS(JL)**XEXSEDG * & + ZRHODREFG(JL)**(XEXSEDG-XCEXVT) + END DO +END IF + DO JK = KKTB , KKTE + PRGS(:,:,JK) = PRGS(:,:,JK) + ZW(:,:,JK)*(ZWSED(:,:,JK+KKL)-ZWSED(:,:,JK)) + END DO + IF (PRESENT(PFPR)) THEN + DO JK = KKTB , KKTE + PFPR(:,:,JK,6)=ZWSED(:,:,JK) + ENDDO + ENDIF + PINPRG(:,:) = PINPRG(:,:) + ZWSED(:,:,KKB)/XRHOLW/KSPLITR + IF( JN==KSPLITR ) THEN + PRGS(:,:,:) = PRGS(:,:,:) * ZINVTSTEP + END IF +! +!* 2.6 for hail +! + IF ( KRR == 7 ) THEN + IF( JN==1 ) PRHS(:,:,:) = PRHS(:,:,:) * PTSTEP + ZWSED(:,:,:) = 0. + IF( ISEDIMH >= 1 ) THEN + IF ( ISEDIMH .GT. ILENALLOCH ) THEN + IF ( ILENALLOCH .GT. 0 ) THEN + DEALLOCATE (ZRHS, ZRHODREFH, ILISTH) + END IF + ILENALLOCH = MAX (IOLDALLOCH, 2*ISEDIMH ) + IOLDALLOCH = ILENALLOCH + ALLOCATE(ZRHS(ILENALLOCH), ZRHODREFH(ILENALLOCH), ILISTH(ILENALLOCH)) + END IF +! + DO JL=1,ISEDIMH + ZRHS(JL) = PRHS(IH1(JL),IH2(JL),IH3(JL)) + ZRHODREFH(JL) = PRHODREF(IH1(JL),IH2(JL),IH3(JL)) + END DO +! + ILISTLENH = 0 + DO JL=1,ISEDIMH + IF( ZRHS(JL) .GT. ZRTMIN(7) ) THEN + ILISTLENH = ILISTLENH + 1 + ILISTH(ILISTLENH) = JL + END IF + END DO + DO JJ = 1, ILISTLENH + JL = ILISTH(JJ) + ZWSED (IH1(JL),IH2(JL),IH3(JL))= XFSEDH * ZRHS(JL)**XEXSEDH * & + ZRHODREFH(JL)**(XEXSEDH-XCEXVT) + END DO + END IF + DO JK = KKTB , KKTE + PRHS(:,:,JK) = PRHS(:,:,JK) + ZW(:,:,JK)*(ZWSED(:,:,JK+KKL)-ZWSED(:,:,JK)) + END DO + IF (PRESENT(PFPR)) THEN + DO JK = KKTB , KKTE + PFPR(:,:,JK,7)=ZWSED(:,:,JK) + ENDDO + ENDIF + PINPRH(:,:) = PINPRH(:,:) + ZWSED(:,:,KKB)/XRHOLW/KSPLITR + IF( JN==KSPLITR ) THEN + PRHS(:,:,:) = PRHS(:,:,:) * ZINVTSTEP + END IF + END IF +! +END DO +! +IF (OSEDIC) THEN + IF (ILENALLOCC .GT. 0) DEALLOCATE (ZRCS, ZRHODREFC, & + ILISTC,ZWLBDC,ZCONC,ZRCT, ZZT,ZPRES,ZRAY1D,ZFSEDC1D, ZWLBDA,ZCC) +END IF +IF (ILENALLOCR .GT. 0 ) DEALLOCATE(ZRHODREFR,ZRRS,ILISTR) +IF (ILENALLOCI .GT. 0 ) DEALLOCATE(ZRHODREFI,ZRIS,ILISTI) +IF (ILENALLOCS .GT. 0 ) DEALLOCATE(ZRHODREFS,ZRSS,ILISTS) +IF (ILENALLOCG .GT. 0 ) DEALLOCATE(ZRHODREFG,ZRGS,ILISTG) +IF (KRR == 7 .AND. (ILENALLOCH .GT. 0 )) DEALLOCATE(ZRHODREFH,ZRHS,ILISTH) +! +!* 2.3 budget storage +! +if ( lbudget_rc .and. osedic ) call Budget_store_end( tbudgets(NBUDGET_RC), 'SEDI', prcs(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_rr ) call Budget_store_end( tbudgets(NBUDGET_RR), 'SEDI', prrs(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'SEDI', pris(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_rs ) call Budget_store_end( tbudgets(NBUDGET_RS), 'SEDI', prss(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_rg ) call Budget_store_end( tbudgets(NBUDGET_RG), 'SEDI', prgs(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_rh ) call Budget_store_end( tbudgets(NBUDGET_RH), 'SEDI', prhs(:, :, :) * prhodj(:, :, :) ) +! +!* 2.4 DROPLET DEPOSITION AT THE 1ST LEVEL ABOVE GROUND +! +IF (ODEPOSC) THEN + if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'DEPO', prcs(:, :, :) * prhodj(:, :, :) ) + + GDEP(:,:) = .FALSE. + GDEP(KIB:KIE,KJB:KJE) = PRCS(KIB:KIE,KJB:KJE,KKB) >0 + WHERE (GDEP) + PRCS(:,:,KKB) = PRCS(:,:,KKB) - XVDEPOSC * PRCT(:,:,KKB) / PDZZ(:,:,KKB) + PINPRC(:,:) = PINPRC(:,:) + XVDEPOSC * PRCT(:,:,KKB) * PRHODREF(:,:,KKB) /XRHOLW + PINDEP(:,:) = XVDEPOSC * PRCT(:,:,KKB) * PRHODREF(:,:,KKB) /XRHOLW + END WHERE + + if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'DEPO', prcs(:, :, :) * prhodj(:, :, :) ) +END IF + +END SUBROUTINE RAIN_ICE_SEDIMENTATION_SPLIT + +END MODULE MODE_RAIN_ICE_SEDIMENTATION_SPLIT diff --git a/src/mesonh/micro/rain_ice_sedimentation_stat.f90 b/src/mesonh/micro/rain_ice_sedimentation_stat.f90 new file mode 100644 index 000000000..68eff90a2 --- /dev/null +++ b/src/mesonh/micro/rain_ice_sedimentation_stat.f90 @@ -0,0 +1,582 @@ +!MNH_LIC Copyright 1995-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! Modifications: +! P. Wautelet 25/02/2019: split rain_ice (cleaner and easier to maintain/debug) +! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 +! P. Wautelet 02/2020: use the new data structures and subroutines for budgets +!----------------------------------------------------------------- +MODULE MODE_RAIN_ICE_SEDIMENTATION_STAT + + IMPLICIT NONE + + PRIVATE + + PUBLIC :: RAIN_ICE_SEDIMENTATION_STAT + +CONTAINS + +SUBROUTINE RAIN_ICE_SEDIMENTATION_STAT( KIB, KIE, KJB, KJE, KKB, KKE, KKTB, KKTE, KKT, KKL, KRR, & + PTSTEP, OSEDIC, PINPRC, PINDEP, & + PINPRR, PINPRS, PINPRG, PDZZ, PRHODREF, PPABST, PTHT, PRHODJ, PINPRR3D, & + PRCS, PRCT, PRRS, PRRT, PRIS, PRSS, PRST, PRGS, PRGT, & + PSEA, PTOWN, PINPRH, PRHS, PRHT, PFPR ) +! +!* 0. DECLARATIONS +! ------------ +! +use modd_budget, only: lbudget_rc, lbudget_rr, lbudget_ri, lbudget_rs, lbudget_rg, lbudget_rh, & + NBUDGET_RC, NBUDGET_RR, NBUDGET_RI, NBUDGET_RS, NBUDGET_RG, NBUDGET_RH, & + tbudgets +use MODD_CST, only: XRHOLW +use MODD_PARAM_ICE, only: LDEPOSC, XVDEPOSC +use MODD_RAIN_ICE_PARAM, only: XEXSEDG, XEXSEDH, XEXCSEDI, XEXSEDR, XEXSEDS, & + XFSEDC, XFSEDG, XFSEDH, XFSEDI, XFSEDR, XFSEDS +use MODD_RAIN_ICE_DESCR, only: XALPHAC, XALPHAC2, XCC, XCEXVT, XCONC_LAND, XCONC_SEA, XCONC_URBAN, & + XDC, XLBC, XLBEXC, XNUC, XNUC2, XRTMIN + +use mode_budget, only: Budget_store_init, Budget_store_end +use mode_tools, only: Countjv + +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +INTEGER, INTENT(IN) :: KIB, KIE, KJB, KJE, KKB, KKE, KKTB, KKTE, KKT +INTEGER, INTENT(IN) :: KKL ! vert. levels type 1=MNH -1=ARO +INTEGER, INTENT(IN) :: KRR ! Number of moist variable +REAL, INTENT(IN) :: PTSTEP ! Double Time step + ! (single if cold start) +LOGICAL, INTENT(IN) :: OSEDIC ! Switch for droplet sedim. +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRC ! Cloud instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINDEP ! Cloud instant deposition +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRR ! Rain instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRS ! Snow instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRG ! Graupel instant precip +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! Layer thikness (m) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! absolute pressure at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PINPRR3D! Rain inst precip 3D +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRRS ! Rain water m.r. source +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRSS ! Snow/aggregate m.r. source +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRGS ! Graupel m.r. source +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGT ! Graupel/hail m.r. at t +REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! Sea Mask +REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN ! Fraction that is town +REAL, DIMENSION(:,:), OPTIONAL, INTENT(INOUT) :: PINPRH ! Hail instant precip +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(INOUT) :: PRHS ! Hail m.r. source +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t +REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(OUT) :: PFPR ! upper-air precipitation fluxes +! +!* 0.2 declaration of local variables +! +INTEGER :: JI,JJ,JK +INTEGER :: JCOUNT, JL +INTEGER, DIMENSION(SIZE(PRHODREF,1)*SIZE(PRHODREF,2)) :: I1, I2 +LOGICAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2)) :: GDEP +REAL :: ZINVTSTEP +REAL :: ZP1,ZP2,ZH,ZZWLBDA,ZZWLBDC,ZZCC +REAL, DIMENSION(SIZE(XRTMIN)) :: ZRTMIN +! XRTMIN = Minimum value for the mixing ratio +! ZRTMIN = Minimum value for the source (tendency) +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2)) :: ZQP +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2)) & + :: ZCONC_TMP ! Weighted concentration +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: ZPRCS,ZPRRS,ZPRSS,ZPRGS,ZPRHS ! Mixing ratios created during the time step +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) :: ZCONC3D ! droplet condensation +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) :: & + ZRAY, & ! Cloud Mean radius + ZLBC, & ! XLBC weighted by sea fraction + ZFSEDC +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & + :: ZW ! work array +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),0:SIZE(PRHODREF,3)+1) & + :: ZWSED ! sedimentation fluxes +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),0:SIZE(PRHODREF,3)+1) & + :: ZWSEDW1 ! sedimentation speed +REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),0:SIZE(PRHODREF,3)+1) & + :: ZWSEDW2 ! sedimentation speed +!------------------------------------------------------------------------------- + +if ( lbudget_rc .and. osedic ) call Budget_store_init( tbudgets(NBUDGET_RC), 'SEDI', prcs(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_rr ) call Budget_store_init( tbudgets(NBUDGET_RR), 'SEDI', prrs(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), 'SEDI', pris(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_rs ) call Budget_store_init( tbudgets(NBUDGET_RS), 'SEDI', prss(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_rg ) call Budget_store_init( tbudgets(NBUDGET_RG), 'SEDI', prgs(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_rh ) call Budget_store_init( tbudgets(NBUDGET_RH), 'SEDI', prhs(:, :, :) * prhodj(:, :, :) ) + +ZINVTSTEP=1./PTSTEP +! +!* 1. Parameters for cloud sedimentation +! + IF (OSEDIC) THEN + ZRAY(:,:,:) = 0. + ZLBC(:,:,:) = XLBC(1) + ZFSEDC(:,:,:) = XFSEDC(1) + ZCONC3D(:,:,:)= XCONC_LAND + ZCONC_TMP(:,:)= XCONC_LAND + IF (PRESENT(PSEA)) THEN + ZCONC_TMP(:,:)=PSEA(:,:)*XCONC_SEA+(1.-PSEA(:,:))*XCONC_LAND + + DO JK=KKTB,KKTE + ZLBC(:,:,JK) = PSEA(:,:)*XLBC(2)+(1.-PSEA(:,:))*XLBC(1) + ZFSEDC(:,:,JK) = (PSEA(:,:)*XFSEDC(2)+(1.-PSEA(:,:))*XFSEDC(1)) + ZFSEDC(:,:,JK) = MAX(MIN(XFSEDC(1),XFSEDC(2)),ZFSEDC(:,:,JK)) + ZCONC3D(:,:,JK)= (1.-PTOWN(:,:))*ZCONC_TMP(:,:)+PTOWN(:,:)*XCONC_URBAN + ZRAY(:,:,JK) = 0.5*((1.-PSEA(:,:))*GAMMA(XNUC+1.0/XALPHAC)/(GAMMA(XNUC)) + & + PSEA(:,:)*GAMMA(XNUC2+1.0/XALPHAC2)/(GAMMA(XNUC2))) + END DO + ELSE + ZCONC3D(:,:,:) = XCONC_LAND + ZRAY(:,:,:) = 0.5*(GAMMA(XNUC+1.0/XALPHAC)/(GAMMA(XNUC))) + END IF + ZRAY(:,:,:) = MAX(1.,ZRAY(:,:,:)) + ZLBC(:,:,:) = MAX(MIN(XLBC(1),XLBC(2)),ZLBC(:,:,:)) + ENDIF + IF (LDEPOSC) PINDEP (:,:) = 0. +! +!* 2. compute the fluxes +! + + +ZRTMIN(:) = XRTMIN(:) * ZINVTSTEP +! +IF (OSEDIC) THEN + ZPRCS(:,:,:) = 0.0 + ZPRCS(:,:,:) = PRCS(:,:,:)-PRCT(:,:,:)* ZINVTSTEP + PRCS(:,:,:) = PRCT(:,:,:)* ZINVTSTEP +END IF +ZPRRS(:,:,:) = 0.0 +ZPRSS(:,:,:) = 0.0 +ZPRGS(:,:,:) = 0.0 +IF ( KRR == 7 ) ZPRHS(:,:,:) = 0.0 +! +ZPRRS(:,:,:) = PRRS(:,:,:)-PRRT(:,:,:)* ZINVTSTEP +ZPRSS(:,:,:) = PRSS(:,:,:)-PRST(:,:,:)* ZINVTSTEP +ZPRGS(:,:,:) = PRGS(:,:,:)-PRGT(:,:,:)* ZINVTSTEP +IF ( KRR == 7 ) ZPRHS(:,:,:) = PRHS(:,:,:)-PRHT(:,:,:)* ZINVTSTEP +PRRS(:,:,:) = PRRT(:,:,:)* ZINVTSTEP +PRSS(:,:,:) = PRST(:,:,:)* ZINVTSTEP +PRGS(:,:,:) = PRGT(:,:,:)* ZINVTSTEP +IF ( KRR == 7 ) PRHS(:,:,:) = PRHT(:,:,:)* ZINVTSTEP +! +IF (OSEDIC) PRCS(:,:,:) = PRCS(:,:,:) + ZPRCS(:,:,:) +PRRS(:,:,:) = PRRS(:,:,:) + ZPRRS(:,:,:) +PRSS(:,:,:) = PRSS(:,:,:) + ZPRSS(:,:,:) +PRGS(:,:,:) = PRGS(:,:,:) + ZPRGS(:,:,:) +IF ( KRR == 7 ) PRHS(:,:,:) = PRHS(:,:,:) + ZPRHS(:,:,:) +IF (PRESENT(PFPR)) PFPR(:,:,:,:) = 0. +DO JK = KKTB , KKTE + ZW(:,:,JK) =PTSTEP/(PRHODREF(:,:,JK)* PDZZ(:,:,JK) ) +END DO +PINPRR3D (:,:,:) = 0. + +! +!* 2.1 for cloud +! + IF (OSEDIC) THEN + PRCS(:,:,:) = PRCS(:,:,:) * PTSTEP + ZWSED(:,:,:) = 0. + ZWSEDW1(:,:,:) = 0. + ZWSEDW2(:,:,:) = 0. + +! calculation of P1, P2 and sedimentation flux + DO JK = KKE , KKB, -1*KKL + !estimation of q' taking into account incomming ZWSED + ZQP(:,:)=ZWSED(:,:,JK+KKL)*ZW(:,:,JK) + + JCOUNT=COUNTJV((PRCS(:,:,JK) > ZRTMIN(2) .AND. PRCT(:,:,JK) > ZRTMIN(2)) .OR. & + (ZQP(:,:) > ZRTMIN(2)),I1(:),I2(:)) + DO JL=1, JCOUNT + JI=I1(JL) + JJ=I2(JL) + !calculation of w + ! mars 2009 : ajout d'un test + !IF ( PRCS(JI,JJ,JK) > ZRTMIN(2) ) THEN + IF(PRCS(JI,JJ,JK) > ZRTMIN(2) .AND. PRCT(JI,JJ,JK) > ZRTMIN(2)) THEN + ZZWLBDA=6.6E-8*(101325./PPABST(JI,JJ,JK))*(PTHT(JI,JJ,JK)/293.15) + ZZWLBDC=(ZLBC(JI,JJ,JK)*ZCONC3D(JI,JJ,JK) & + &/(PRHODREF(JI,JJ,JK)*PRCT(JI,JJ,JK)))**XLBEXC + ZZCC=XCC*(1.+1.26*ZZWLBDA*ZZWLBDC/ZRAY(JI,JJ,JK)) !! ZCC : Fall speed + ZWSEDW1 (JI,JJ,JK)=PRHODREF(JI,JJ,JK)**(-XCEXVT ) * & + & ZZWLBDC**(-XDC)*ZZCC*ZFSEDC(JI,JJ,JK) + ENDIF + IF ( ZQP(JI,JJ) > ZRTMIN(2) ) THEN + ZZWLBDA=6.6E-8*(101325./PPABST(JI,JJ,JK))*(PTHT(JI,JJ,JK)/293.15) + ZZWLBDC=(ZLBC(JI,JJ,JK)*ZCONC3D(JI,JJ,JK) & + &/(PRHODREF(JI,JJ,JK)*ZQP(JI,JJ)))**XLBEXC + ZZCC=XCC*(1.+1.26*ZZWLBDA*ZZWLBDC/ZRAY(JI,JJ,JK)) !! ZCC : Fall speed + ZWSEDW2 (JI,JJ,JK)=PRHODREF(JI,JJ,JK)**(-XCEXVT ) * & + & ZZWLBDC**(-XDC)*ZZCC*ZFSEDC(JI,JJ,JK) + ENDIF + ENDDO + + DO JJ = KJB, KJE + DO JI = KIB, KIE + ZH=PDZZ(JI,JJ,JK) + ZP1 = MIN(1., ZWSEDW1(JI,JJ,JK) * PTSTEP / ZH) + ! mars 2009 : correction : ZWSEDW1 => ZWSEDW2 + !IF (ZWSEDW1(JI,JJ,JK) /= 0.) THEN + IF (ZWSEDW2(JI,JJ,JK) /= 0.) THEN + ZP2 = MAX(0.,1 - ZH & + & / (PTSTEP*ZWSEDW2(JI,JJ,JK)) ) + ELSE + ZP2 = 0. + ENDIF + ZWSED (JI,JJ,JK)=ZP1*PRHODREF(JI,JJ,JK)*& + &ZH*PRCS(JI,JJ,JK)& + &* ZINVTSTEP+ ZP2 * ZWSED (JI,JJ,JK+KKL) + ENDDO + ENDDO + ENDDO + + DO JK = KKTB , KKTE + PRCS(:,:,JK) = PRCS(:,:,JK) + ZW(:,:,JK)*(ZWSED(:,:,JK+KKL)-ZWSED(:,:,JK)) + END DO + IF (PRESENT(PFPR)) THEN + DO JK = KKTB , KKTE + PFPR(:,:,JK,2)=ZWSED(:,:,JK) + ENDDO + ENDIF + + PINPRC(:,:) = ZWSED(:,:,KKB)/XRHOLW ! in m/s + PRCS(:,:,:) = PRCS(:,:,:) * ZINVTSTEP + ENDIF + +! +!* 2.2 for rain +! + + PRRS(:,:,:) = PRRS(:,:,:) * PTSTEP + ZWSED(:,:,:) = 0. + ZWSEDW1(:,:,:) = 0. + ZWSEDW2(:,:,:) = 0. + +! calculation of ZP1, ZP2 and sedimentation flux + DO JK = KKE , KKB, -1*KKL + !estimation of q' taking into account incomming ZWSED + ZQP(:,:)=ZWSED(:,:,JK+KKL)*ZW(:,:,JK) + + JCOUNT=COUNTJV((PRRS(:,:,JK) > ZRTMIN(3)) .OR. & + (ZQP(:,:) > ZRTMIN(3)),I1(:),I2(:)) + DO JL=1, JCOUNT + JI=I1(JL) + JJ=I2(JL) + !calculation of w + IF ( PRRS(JI,JJ,JK) > ZRTMIN(3) ) THEN + ZWSEDW1 (JI,JJ,JK)= XFSEDR *PRRS(JI,JJ,JK)**(XEXSEDR-1)* & + PRHODREF(JI,JJ,JK)**(XEXSEDR-XCEXVT-1) + ENDIF + IF ( ZQP(JI,JJ) > ZRTMIN(3) ) THEN + ZWSEDW2 (JI,JJ,JK)= XFSEDR *(ZQP(JI,JJ))**(XEXSEDR-1)* & + PRHODREF(JI,JJ,JK)**(XEXSEDR-XCEXVT-1) + ENDIF + ENDDO + DO JJ = KJB, KJE + DO JI = KIB, KIE + ZH=PDZZ(JI,JJ,JK) + ZP1 = MIN(1., ZWSEDW1(JI,JJ,JK) * PTSTEP / ZH ) + IF (ZWSEDW2(JI,JJ,JK) /= 0.) THEN + ZP2 = MAX(0.,1 - ZH & + & / (PTSTEP*ZWSEDW2(JI,JJ,JK)) ) + ELSE + ZP2 = 0. + ENDIF + ZWSED (JI,JJ,JK)=ZP1*PRHODREF(JI,JJ,JK)*& + &ZH*PRRS(JI,JJ,JK)& + &* ZINVTSTEP+ ZP2 * ZWSED (JI,JJ,JK+KKL) + ENDDO + ENDDO + ENDDO + + DO JK = KKTB , KKTE + PRRS(:,:,JK) = PRRS(:,:,JK) + ZW(:,:,JK)*(ZWSED(:,:,JK+KKL)-ZWSED(:,:,JK)) + ENDDO + IF (PRESENT(PFPR)) THEN + DO JK = KKTB , KKTE + PFPR(:,:,JK,3)=ZWSED(:,:,JK) + ENDDO + ENDIF + PINPRR(:,:) = ZWSED(:,:,KKB)/XRHOLW ! in m/s + PINPRR3D(:,:,:) = ZWSED(:,:,1:KKT)/XRHOLW ! in m/s + PRRS(:,:,:) = PRRS(:,:,:) * ZINVTSTEP + +! +!* 2.3 for pristine ice +! + + PRIS(:,:,:) = PRIS(:,:,:) * PTSTEP + ZWSED(:,:,:) = 0. + ZWSEDW1(:,:,:) = 0. + ZWSEDW2(:,:,:) = 0. +! calculation of ZP1, ZP2 and sedimentation flux + DO JK = KKE , KKB, -1*KKL + !estimation of q' taking into account incomming ZWSED + ZQP(:,:)=ZWSED(:,:,JK+KKL)*ZW(:,:,JK) + + JCOUNT=COUNTJV((PRIS(:,:,JK) > MAX(ZRTMIN(4),1.0E-7 )) .OR. & + (ZQP(:,:) > MAX(ZRTMIN(4),1.0E-7 )),I1(:),I2(:)) + DO JL=1, JCOUNT + JI=I1(JL) + JJ=I2(JL) + !calculation of w + IF ( PRIS(JI,JJ,JK) > MAX(ZRTMIN(4),1.0E-7 ) ) THEN + ZWSEDW1 (JI,JJ,JK)= XFSEDI * & + & PRHODREF(JI,JJ,JK)**(XCEXVT) * & ! McF&H + & MAX( 0.05E6,-0.15319E6-0.021454E6* & + & ALOG(PRHODREF(JI,JJ,JK)*PRIS(JI,JJ,JK)) )**XEXCSEDI + ENDIF + IF ( ZQP(JI,JJ) > MAX(ZRTMIN(4),1.0E-7 ) ) THEN + ZWSEDW2 (JI,JJ,JK)= XFSEDI * & + & PRHODREF(JI,JJ,JK)**(XCEXVT) * & ! McF&H + & MAX( 0.05E6,-0.15319E6-0.021454E6* & + & ALOG(PRHODREF(JI,JJ,JK)*ZQP(JI,JJ)) )**XEXCSEDI + ENDIF + ENDDO + DO JJ = KJB, KJE + DO JI = KIB, KIE + ZH=PDZZ(JI,JJ,JK) + ZP1 = MIN(1., ZWSEDW1(JI,JJ,JK) * PTSTEP / ZH ) + IF (ZWSEDW2(JI,JJ,JK) /= 0.) THEN + ZP2 = MAX(0.,1 - ZH & + & / (PTSTEP*ZWSEDW2(JI,JJ,JK)) ) + ELSE + ZP2 = 0. + ENDIF + ZWSED (JI,JJ,JK)=ZP1*PRHODREF(JI,JJ,JK)*& + &ZH*PRIS(JI,JJ,JK)& + &* ZINVTSTEP+ ZP2 * ZWSED (JI,JJ,JK+KKL) + ENDDO + ENDDO + ENDDO + + DO JK = KKTB , KKTE + PRIS(:,:,JK) = PRIS(:,:,JK) + ZW(:,:,JK)*(ZWSED(:,:,JK+KKL)-ZWSED(:,:,JK)) + ENDDO + IF (PRESENT(PFPR)) THEN + DO JK = KKTB , KKTE + PFPR(:,:,JK,4)=ZWSED(:,:,JK) + ENDDO + ENDIF + + PRIS(:,:,:) = PRIS(:,:,:) * ZINVTSTEP + + +! +!* 2.4 for aggregates/snow +! + + PRSS(:,:,:) = PRSS(:,:,:) * PTSTEP + ZWSED(:,:,:) = 0. + ZWSEDW1(:,:,:) = 0. + ZWSEDW2(:,:,:) = 0. + +! calculation of ZP1, ZP2 and sedimentation flux + DO JK = KKE , KKB, -1*KKL + !estimation of q' taking into account incomming ZWSED + ZQP(:,:)=ZWSED(:,:,JK+KKL)*ZW(:,:,JK) + + JCOUNT=COUNTJV((PRSS(:,:,JK) > ZRTMIN(5)) .OR. & + (ZQP(:,:) > ZRTMIN(5)),I1(:),I2(:)) + DO JL=1, JCOUNT + JI=I1(JL) + JJ=I2(JL) + !calculation of w + IF (PRSS(JI,JJ,JK) > ZRTMIN(5) ) THEN + ZWSEDW1(JI,JJ,JK)=XFSEDS*(PRSS(JI,JJ,JK))**(XEXSEDS-1)*& + PRHODREF(JI,JJ,JK)**(XEXSEDS-XCEXVT-1) + ENDIF + IF ( ZQP(JI,JJ) > ZRTMIN(5) ) THEN + ZWSEDW2(JI,JJ,JK)=XFSEDS*(ZQP(JI,JJ))**(XEXSEDS-1)*& + PRHODREF(JI,JJ,JK)**(XEXSEDS-XCEXVT-1) + ENDIF + ENDDO + DO JJ = KJB, KJE + DO JI = KIB, KIE + ZH=PDZZ(JI,JJ,JK) + ZP1 = MIN(1., ZWSEDW1(JI,JJ,JK) * PTSTEP / ZH ) + IF (ZWSEDW2(JI,JJ,JK) /= 0.) THEN + ZP2 = MAX(0.,1 - ZH& + / (PTSTEP*ZWSEDW2(JI,JJ,JK)) ) + ELSE + ZP2 = 0. + ENDIF + ZWSED (JI,JJ,JK)=ZP1*PRHODREF(JI,JJ,JK)*& + &ZH*PRSS(JI,JJ,JK)& + &* ZINVTSTEP+ ZP2 * ZWSED (JI,JJ,JK+KKL) + ENDDO + ENDDO + ENDDO + + DO JK = KKTB , KKTE + PRSS(:,:,JK) = PRSS(:,:,JK) + ZW(:,:,JK)*(ZWSED(:,:,JK+KKL)-ZWSED(:,:,JK)) + ENDDO + IF (PRESENT(PFPR)) THEN + DO JK = KKTB , KKTE + PFPR(:,:,JK,5)=ZWSED(:,:,JK) + ENDDO + ENDIF + + PINPRS(:,:) = ZWSED(:,:,KKB)/XRHOLW ! in m/s + + PRSS(:,:,:) = PRSS(:,:,:) * ZINVTSTEP + + +! +!* 2.5 for graupeln +! + + PRGS(:,:,:) = PRGS(:,:,:) * PTSTEP + ZWSED(:,:,:) = 0. + ZWSEDW1(:,:,:) = 0. + ZWSEDW2(:,:,:) = 0. + +! calculation of ZP1, ZP2 and sedimentation flux + DO JK = KKE, KKB, -1*KKL + !estimation of q' taking into account incomming ZWSED + ZQP(:,:)=ZWSED(:,:,JK+KKL)*ZW(:,:,JK) + + JCOUNT=COUNTJV((PRGS(:,:,JK) > ZRTMIN(6)) .OR. & + (ZQP(:,:) > ZRTMIN(6)),I1(:),I2(:)) + DO JL=1, JCOUNT + JI=I1(JL) + JJ=I2(JL) + !calculation of w + IF ( PRGS(JI,JJ,JK) > ZRTMIN(6) ) THEN + ZWSEDW1 (JI,JJ,JK)= XFSEDG*(PRGS(JI,JJ,JK))**(XEXSEDG-1) * & + PRHODREF(JI,JJ,JK)**(XEXSEDG-XCEXVT-1) + ENDIF + IF ( ZQP(JI,JJ) > ZRTMIN(6) ) THEN + ZWSEDW2 (JI,JJ,JK)= XFSEDG*(ZQP(JI,JJ))**(XEXSEDG-1) * & + PRHODREF(JI,JJ,JK)**(XEXSEDG-XCEXVT-1) + ENDIF + ENDDO + DO JJ = KJB, KJE + DO JI = KIB, KIE + ZH=PDZZ(JI,JJ,JK) + ZP1 = MIN(1., ZWSEDW1(JI,JJ,JK) * PTSTEP / ZH ) + IF (ZWSEDW2(JI,JJ,JK) /= 0.) THEN + ZP2 = MAX(0.,1 - ZH & + & / (PTSTEP*ZWSEDW2(JI,JJ,JK)) ) + ELSE + ZP2 = 0. + ENDIF + ZWSED (JI,JJ,JK)=ZP1*PRHODREF(JI,JJ,JK)*& + &ZH*PRGS(JI,JJ,JK)& + &* ZINVTSTEP+ ZP2 * ZWSED (JI,JJ,JK+KKL) + ENDDO + ENDDO + ENDDO + + DO JK = KKTB , KKTE + PRGS(:,:,JK) = PRGS(:,:,JK) + ZW(:,:,JK)*(ZWSED(:,:,JK+KKL)-ZWSED(:,:,JK)) + ENDDO + IF (PRESENT(PFPR)) THEN + DO JK = KKTB , KKTE + PFPR(:,:,JK,6)=ZWSED(:,:,JK) + ENDDO + ENDIF + + PINPRG(:,:) = ZWSED(:,:,KKB)/XRHOLW ! in m/s + + PRGS(:,:,:) = PRGS(:,:,:) * ZINVTSTEP + +! +!* 2.6 for hail +! + IF ( KRR == 7 ) THEN + PRHS(:,:,:) = PRHS(:,:,:) * PTSTEP + ZWSED(:,:,:) = 0. + ZWSEDW1(:,:,:) = 0. + ZWSEDW2(:,:,:) = 0. +! calculation of ZP1, ZP2 and sedimentation flux + DO JK = KKE , KKB, -1*KKL + !estimation of q' taking into account incomming ZWSED + ZQP(:,:)=ZWSED(:,:,JK+KKL)*ZW(:,:,JK) + + JCOUNT=COUNTJV((PRHS(:,:,JK)+ZQP(JI,JJ) > ZRTMIN(7)) .OR. & + (ZQP(:,:) > ZRTMIN(7)),I1(:),I2(:)) + DO JL=1, JCOUNT + JI=I1(JL) + JJ=I2(JL) + !calculation of w + IF ((PRHS(JI,JJ,JK)+ZQP(JI,JJ)) > ZRTMIN(7) ) THEN + ZWSEDW1 (JI,JJ,JK)= XFSEDH * (PRHS(JI,JJ,JK))**(XEXSEDH-1) * & + PRHODREF(JI,JJ,JK)**(XEXSEDH-XCEXVT-1) + ENDIF + IF ( ZQP(JI,JJ) > ZRTMIN(7) ) THEN + ZWSEDW2 (JI,JJ,JK)= XFSEDH * ZQP(JI,JJ)**(XEXSEDH-1) * & + PRHODREF(JI,JJ,JK)**(XEXSEDH-XCEXVT-1) + ENDIF + ENDDO + DO JJ = KJB, KJE + DO JI = KIB, KIE + ZH=PDZZ(JI,JJ,JK) + ZP1 = MIN(1., ZWSEDW1(JI,JJ,JK) * PTSTEP / ZH) + IF (ZWSEDW2(JI,JJ,JK) /= 0.) THEN + ZP2 = MAX(0.,1 - ZH & + & / (PTSTEP*ZWSEDW2(JI,JJ,JK)) ) + ELSE + ZP2 = 0. + ENDIF + ZWSED (JI,JJ,JK)=ZP1*PRHODREF(JI,JJ,JK)*& + &ZH*PRHS(JI,JJ,JK)& + &* ZINVTSTEP+ ZP2 * ZWSED (JI,JJ,JK+KKL) + ENDDO + ENDDO + ENDDO + + DO JK = KKTB , KKTE + PRHS(:,:,JK) = PRHS(:,:,JK) + ZW(:,:,JK)*(ZWSED(:,:,JK+KKL)-ZWSED(:,:,JK)) + ENDDO + IF (PRESENT(PFPR)) THEN + DO JK = KKTB , KKTE + PFPR(:,:,JK,7)=ZWSED(:,:,JK) + ENDDO + ENDIF + + PINPRH(:,:) = ZWSED(:,:,KKB)/XRHOLW ! in m/s + + PRHS(:,:,:) = PRHS(:,:,:) * ZINVTSTEP + + ENDIF +! +!* 2.3 budget storage +! +if ( lbudget_rc .and. osedic ) call Budget_store_end( tbudgets(NBUDGET_RC), 'SEDI', prcs(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_rr ) call Budget_store_end( tbudgets(NBUDGET_RR), 'SEDI', prrs(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'SEDI', pris(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_rs ) call Budget_store_end( tbudgets(NBUDGET_RS), 'SEDI', prss(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_rg ) call Budget_store_end( tbudgets(NBUDGET_RG), 'SEDI', prgs(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_rh ) call Budget_store_end( tbudgets(NBUDGET_RH), 'SEDI', prhs(:, :, :) * prhodj(:, :, :) ) +! +! +!* 2.4 DROPLET DEPOSITION AT THE 1ST LEVEL ABOVE GROUND +! +IF (LDEPOSC) THEN + if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'DEPO', prcs(:, :, :) * prhodj(:, :, :) ) + + GDEP(:,:) = .FALSE. + GDEP(KIB:KIE,KJB:KJE) = PRCS(KIB:KIE,KJB:KJE,KKB) >0 + WHERE (GDEP) + PRCS(:,:,KKB) = PRCS(:,:,KKB) - XVDEPOSC * PRCT(:,:,KKB) / PDZZ(:,:,KKB) + PINPRC(:,:) = PINPRC(:,:) + XVDEPOSC * PRCT(:,:,KKB) * PRHODREF(:,:,KKB) /XRHOLW + PINDEP(:,:) = XVDEPOSC * PRCT(:,:,KKB) * PRHODREF(:,:,KKB) /XRHOLW + END WHERE + + if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'DEPO', prcs(:, :, :) * prhodj(:, :, :) ) +END IF + +END SUBROUTINE RAIN_ICE_SEDIMENTATION_STAT + +END MODULE MODE_RAIN_ICE_SEDIMENTATION_STAT diff --git a/src/mesonh/micro/rain_ice_slow.f90 b/src/mesonh/micro/rain_ice_slow.f90 new file mode 100644 index 000000000..8ed0b10ac --- /dev/null +++ b/src/mesonh/micro/rain_ice_slow.f90 @@ -0,0 +1,225 @@ +!MNH_LIC Copyright 1995-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! Modifications: +! P. Wautelet 25/02/2019: split rain_ice (cleaner and easier to maintain/debug) +! P. Wautelet 02/2020: use the new data structures and subroutines for budgets +!----------------------------------------------------------------- +MODULE MODE_RAIN_ICE_SLOW + + IMPLICIT NONE + + PRIVATE + + PUBLIC :: RAIN_ICE_SLOW + +CONTAINS + +SUBROUTINE RAIN_ICE_SLOW(OMICRO, PINVTSTEP, PRHODREF, & + PRCT, PRRT, PRIT, PRST, PRGT, PRHODJ, PZT, PPRES, & + PLSFACT, PLVFACT, PSSI, & + PRVS, PRCS, PRRS, PRIS, PRSS, PRGS, PTHS, & + PAI, PCJ, PKA, PDV, PLBDAS, PLBDAG) +! +!* 0. DECLARATIONS +! ------------ +! +use modd_budget, only: lbudget_th, lbudget_rv, lbudget_rc, lbudget_rr, lbudget_ri, lbudget_rs, lbudget_rg, & + NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, NBUDGET_RR, NBUDGET_RI, NBUDGET_RS, NBUDGET_RG, & + tbudgets +use MODD_CST, only: XALPI, XBETAI, XCI, XCPV, XGAMI, XLSTT, XMNH_HUGE_12_LOG, XP00, XRV, XTT +use MODD_RAIN_ICE_DESCR, only: XCEXVT, XLBDAS_MAX, XLBEXG, XLBEXS, XLBG, XLBS, XRTMIN +use MODD_RAIN_ICE_PARAM, only: X0DEPG, X0DEPS, X1DEPG, X1DEPS, XACRIAUTI, XALPHA3, XBCRIAUTI, XBETA3, XCOLEXIS, XCRIAUTI, & + XEX0DEPG, XEX0DEPS, XEX1DEPG, XEX1DEPS, XEXIAGGS, XFIAGGS, XHON, XSCFAC, XTEXAUTI, XTIMAUTI + +use mode_budget, only: Budget_store_add + +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +LOGICAL, DIMENSION(:,:,:), intent(in) :: OMICRO ! Test where to compute all processes +REAL, intent(in) :: PINVTSTEP +REAL, DIMENSION(:), intent(in) :: PRHODREF ! RHO Dry REFerence +REAL, DIMENSION(:), intent(in) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:), intent(in) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:), intent(in) :: PRIT ! Pristine ice m.r. at t +REAL, DIMENSION(:), intent(in) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(:), intent(in) :: PRGT ! Graupel m.r. at t +REAL, DIMENSION(:), intent(in) :: PRHODJ ! RHO times Jacobian +REAL, DIMENSION(:), intent(in) :: PZT ! Temperature +REAL, DIMENSION(:), intent(in) :: PPRES ! Pressure +REAL, DIMENSION(:), intent(in) :: PLSFACT ! L_s/(Pi_ref*C_ph) +REAL, DIMENSION(:), intent(in) :: PLVFACT ! L_v/(Pi_ref*C_ph) +REAL, DIMENSION(:), intent(in) :: PSSI ! Supersaturation over ice +REAL, DIMENSION(:), INTENT(INOUT) :: PRVS ! Water vapor m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: PRRS ! Rain water m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: PRSS ! Snow/aggregate m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: PRGS ! Graupel m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:), intent(OUT) :: PAI ! Thermodynamical function +REAL, DIMENSION(:), intent(OUT) :: PCJ ! Function to compute the ventilation coefficient +REAL, DIMENSION(:), intent(OUT) :: PKA ! Thermal conductivity of the air +REAL, DIMENSION(:), intent(OUT) :: PDV ! Diffusivity of water vapor in the air +REAL, DIMENSION(:), intent(OUT) :: PLBDAS ! Slope parameter of the aggregate distribution +REAL, DIMENSION(:), intent(OUT) :: PLBDAG ! Slope parameter of the graupel distribution +! +!* 0.2 declaration of local variables +! +REAL, DIMENSION(size(PRHODREF)) :: ZZW ! Work array +REAL, DIMENSION(size(PRHODREF)) :: ZCRIAUTI ! Snow-to-ice autoconversion thres. +real, dimension(size(plsfact)) :: zz_diff +! +!------------------------------------------------------------------------------- + zz_diff(:) = plsfact(:) - plvfact(:) +! +! +!* 3.2 compute the homogeneous nucleation source: RCHONI +! + ZZW(:) = 0.0 + WHERE( (PZT(:)<XTT-35.0) .AND. (PRCT(:)>XRTMIN(2)) .AND. (PRCS(:)>0.) ) + ZZW(:) = MIN( PRCS(:),XHON*PRHODREF(:)*PRCT(:) & + *EXP( MIN(XMNH_HUGE_12_LOG,XALPHA3*(PZT(:)-XTT)-XBETA3) ) ) + ! *EXP( XALPHA3*(PZT(:)-XTT)-XBETA3 ) ) + PRIS(:) = PRIS(:) + ZZW(:) + PRCS(:) = PRCS(:) - ZZW(:) + PTHS(:) = PTHS(:) + ZZW(:) * zz_diff(:) ! f(L_f*(RCHONI)) + ENDWHERE + + if ( lbudget_th ) call Budget_store_add( tbudgets(NBUDGET_TH), 'HON', & + Unpack( zzw(:) * zz_diff(:) * prhodj(:), mask = omicro(:,:,:), field = 0.) ) + if ( lbudget_rc ) call Budget_store_add( tbudgets(NBUDGET_RC), 'HON', & + Unpack( -zzw(:) * prhodj(:), mask = omicro(:,:,:), field = 0.) ) + if ( lbudget_ri ) call Budget_store_add( tbudgets(NBUDGET_RI), 'HON', & + Unpack( zzw(:) * prhodj(:), mask = omicro(:,:,:), field = 0.) ) +! +!* 3.3 compute the spontaneous freezing source: RRHONG +! + ZZW(:) = 0.0 + WHERE( (PZT(:)<XTT-35.0) .AND. (PRRT(:)>XRTMIN(3)) .AND. (PRRS(:)>0.) ) + ZZW(:) = MIN( PRRS(:),PRRT(:)* PINVTSTEP ) + PRGS(:) = PRGS(:) + ZZW(:) + PRRS(:) = PRRS(:) - ZZW(:) + PTHS(:) = PTHS(:) + ZZW(:) * zz_diff(:) ! f(L_f*(RRHONG)) + ENDWHERE + + if ( lbudget_th ) call Budget_store_add( tbudgets(NBUDGET_TH), 'SFR', & + Unpack( zzw(:) * zz_diff(:) * prhodj(:), mask = omicro(:,:,:), field = 0.) ) + if ( lbudget_rr ) call Budget_store_add( tbudgets(NBUDGET_RR), 'SFR', & + Unpack( -zzw(:) * prhodj(:), mask = omicro(:,:,:), field = 0.) ) + if ( lbudget_rg ) call Budget_store_add( tbudgets(NBUDGET_RG), 'SFR', & + Unpack( zzw(:) * prhodj(:), mask = omicro(:,:,:), field = 0.) ) +! +!* 3.4 compute the deposition, aggregation and autoconversion sources +! + PKA(:) = 2.38E-2 + 0.0071E-2 * ( PZT(:) - XTT ) ! k_a + PDV(:) = 0.211E-4 * (PZT(:)/XTT)**1.94 * (XP00/PPRES(:)) ! D_v +! +!* 3.4.1 compute the thermodynamical function A_i(T,P) +!* and the c^prime_j (in the ventilation factor) +! + + PAI(:) = EXP( XALPI - XBETAI/PZT(:) - XGAMI*ALOG(PZT(:) ) ) ! es_i + PAI(:) = ( XLSTT + (XCPV-XCI)*(PZT(:)-XTT) )**2 / (PKA(:)*XRV*PZT(:)**2) & + + ( XRV*PZT(:) ) / (PDV(:)*PAI(:)) + PCJ(:) = XSCFAC * PRHODREF(:)**0.3 / SQRT( 1.718E-5+0.0049E-5*(PZT(:)-XTT) ) +! +!* 3.4.2 compute the riming-conversion of r_c for r_i production: RCAUTI +! +! ZZW(:) = 0.0 +! ZTIMAUTIC = SQRT( XTIMAUTI*XTIMAUTC ) +! WHERE ( (PRCT(:)>0.0) .AND. (PRIT(:)>0.0) .AND. (PRCS(:)>0.0) ) +! ZZW(:) = MIN( PRCS(:),ZTIMAUTIC * MAX( SQRT( PRIT(:)*PRCT(:) ),0.0 ) ) +! PRIS(:) = PRIS(:) + ZZW(:) +! PRCS(:) = PRCS(:) - ZZW(:) +! PTHS(:) = PTHS(:) + ZZW(:) * zz_diff(:) ! f(L_f*(RCAUTI)) +! END WHERE +! +!* 3.4.3 compute the deposition on r_s: RVDEPS +! + WHERE ( PRST(:)>0.0 ) + PLBDAS(:) = MIN( XLBDAS_MAX, & + XLBS*( PRHODREF(:)*MAX( PRST(:),XRTMIN(5) ) )**XLBEXS ) + END WHERE + ZZW(:) = 0.0 + WHERE ( (PRST(:)>XRTMIN(5)) .AND. (PRSS(:)>0.0) ) + ZZW(:) = ( PSSI(:)/(PRHODREF(:)*PAI(:)) ) * & + ( X0DEPS*PLBDAS(:)**XEX0DEPS + X1DEPS*PCJ(:)*PLBDAS(:)**XEX1DEPS ) + ZZW(:) = MIN( PRVS(:),ZZW(:) )*(0.5+SIGN(0.5,ZZW(:))) & + - MIN( PRSS(:),ABS(ZZW(:)) )*(0.5-SIGN(0.5,ZZW(:))) + PRSS(:) = PRSS(:) + ZZW(:) + PRVS(:) = PRVS(:) - ZZW(:) + PTHS(:) = PTHS(:) + ZZW(:)*PLSFACT(:) + END WHERE + + if ( lbudget_th ) call Budget_store_add( tbudgets(NBUDGET_TH), 'DEPS', & + Unpack( zzw(:) * plsfact(:) * prhodj(:), mask = omicro(:,:,:), field = 0.) ) + if ( lbudget_rv ) call Budget_store_add( tbudgets(NBUDGET_RV), 'DEPS', & + Unpack( -zzw(:) * prhodj(:), mask = omicro(:,:,:), field = 0.) ) + if ( lbudget_rs ) call Budget_store_add( tbudgets(NBUDGET_RS), 'DEPS', & + Unpack( zzw(:) * prhodj(:), mask = omicro(:,:,:), field = 0.) ) +! +!* 3.4.4 compute the aggregation on r_s: RIAGGS +! + ZZW(:) = 0.0 + WHERE ( (PRIT(:)>XRTMIN(4)) .AND. (PRST(:)>XRTMIN(5)) .AND. (PRIS(:)>0.0) ) + ZZW(:) = MIN( PRIS(:),XFIAGGS * EXP( XCOLEXIS*(PZT(:)-XTT) ) & + * PRIT(:) & + * PLBDAS(:)**XEXIAGGS & + * PRHODREF(:)**(-XCEXVT) ) + PRSS(:) = PRSS(:) + ZZW(:) + PRIS(:) = PRIS(:) - ZZW(:) + END WHERE + + if ( lbudget_ri ) call Budget_store_add( tbudgets(NBUDGET_RI), 'AGGS', & + Unpack( -zzw(:) * prhodj(:), mask = omicro(:,:,:), field = 0.) ) + if ( lbudget_rs ) call Budget_store_add( tbudgets(NBUDGET_RS), 'AGGS', & + Unpack( zzw(:) * prhodj(:), mask = omicro(:,:,:), field = 0.) ) +! +!* 3.4.5 compute the autoconversion of r_i for r_s production: RIAUTS +! +! ZCRIAUTI(:)=MIN(XCRIAUTI,10**(0.06*(PZT(:)-XTT)-3.5)) + ZCRIAUTI(:)=MIN(XCRIAUTI,10**(XACRIAUTI*(PZT(:)-XTT)+XBCRIAUTI)) + ZZW(:) = 0.0 + WHERE ( (PRIT(:)>XRTMIN(4)) .AND. (PRIS(:)>0.0) ) + ZZW(:) = MIN( PRIS(:),XTIMAUTI * EXP( XTEXAUTI*(PZT(:)-XTT) ) & + * MAX( PRIT(:)-ZCRIAUTI(:),0.0 ) ) + PRSS(:) = PRSS(:) + ZZW(:) + PRIS(:) = PRIS(:) - ZZW(:) + END WHERE + + if ( lbudget_ri ) call Budget_store_add( tbudgets(NBUDGET_RI), 'AUTS', & + Unpack( -zzw(:) * prhodj(:), mask = omicro(:,:,:), field = 0.) ) + if ( lbudget_rs ) call Budget_store_add( tbudgets(NBUDGET_RS), 'AUTS', & + Unpack( zzw(:) * prhodj(:), mask = omicro(:,:,:), field = 0.) ) +! +!* 3.4.6 compute the deposition on r_g: RVDEPG +! +! + WHERE ( PRGT(:)>0.0 ) + PLBDAG(:) = XLBG*( PRHODREF(:)*MAX( PRGT(:),XRTMIN(6) ) )**XLBEXG + END WHERE + ZZW(:) = 0.0 + WHERE ( (PRGT(:)>XRTMIN(6)) .AND. (PRGS(:)>0.0) ) + ZZW(:) = ( PSSI(:)/(PRHODREF(:)*PAI(:)) ) * & + ( X0DEPG*PLBDAG(:)**XEX0DEPG + X1DEPG*PCJ(:)*PLBDAG(:)**XEX1DEPG ) + ZZW(:) = MIN( PRVS(:),ZZW(:) )*(0.5+SIGN(0.5,ZZW(:))) & + - MIN( PRGS(:),ABS(ZZW(:)) )*(0.5-SIGN(0.5,ZZW(:))) + PRGS(:) = PRGS(:) + ZZW(:) + PRVS(:) = PRVS(:) - ZZW(:) + PTHS(:) = PTHS(:) + ZZW(:)*PLSFACT(:) + END WHERE + + if ( lbudget_th ) call Budget_store_add( tbudgets(NBUDGET_TH), 'DEPG', & + Unpack( zzw(:) * plsfact(:) * prhodj(:), mask = omicro(:,:,:), field = 0.) ) + if ( lbudget_rv ) call Budget_store_add( tbudgets(NBUDGET_RV), 'DEPG', & + Unpack( -zzw(:) * prhodj(:), mask = omicro(:,:,:), field = 0.) ) + if ( lbudget_rg ) call Budget_store_add( tbudgets(NBUDGET_RG), 'DEPG', & + Unpack( zzw(:) * prhodj(:), mask = omicro(:,:,:), field = 0.) ) +END SUBROUTINE RAIN_ICE_SLOW + +END MODULE MODE_RAIN_ICE_SLOW diff --git a/src/mesonh/micro/rain_ice_warm.f90 b/src/mesonh/micro/rain_ice_warm.f90 new file mode 100644 index 000000000..133dc888b --- /dev/null +++ b/src/mesonh/micro/rain_ice_warm.f90 @@ -0,0 +1,235 @@ +!MNH_LIC Copyright 1995-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! Modifications: +! P. Wautelet 25/02/2019: split rain_ice (cleaner and easier to maintain/debug) +! P. Wautelet 03/06/2019: remove PACK/UNPACK intrinsics (to get more performance and better OpenACC support) +! P. Wautelet 02/2020: use the new data structures and subroutines for budgets +!----------------------------------------------------------------- +MODULE MODE_RAIN_ICE_WARM + + IMPLICIT NONE + + PRIVATE + + PUBLIC :: RAIN_ICE_WARM + +CONTAINS + +SUBROUTINE RAIN_ICE_WARM(OMICRO, KMICRO, K1, K2, K3, & + PRHODREF, PRVT, PRCT, PRRT, PHLC_HCF, PHLC_LCF, PHLC_HRC, PHLC_LRC, & + PRHODJ, PPRES, PZT, PLBDAR, PLBDAR_RF, PLVFACT, PCJ, PKA, PDV, PRF, PCF, PTHT, PTHLT, & + PRVS, PRCS, PRRS, PTHS, PUSW, PEVAP3D) +! +!* 0. DECLARATIONS +! ------------ +! +use modd_budget, only: lbudget_th, lbudget_rv, lbudget_rc, lbudget_rr, & + NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, NBUDGET_RR, & + tbudgets +use MODD_CST, only: XALPW, XBETAW, XCL, XCPV, XGAMW, XLVTT, XMD, XMV, XRV, XTT +use MODD_PARAM_ICE, only: CSUBG_RC_RR_ACCR, CSUBG_RR_EVAP +use MODD_RAIN_ICE_DESCR, only: XCEXVT, XRTMIN +use MODD_RAIN_ICE_PARAM, only: X0EVAR, X1EVAR, XCRIAUTC, XEX0EVAR, XEX1EVAR, XEXCACCR, XFCACCR, XTIMAUTC + +use mode_budget, only: Budget_store_add +use MODE_MSG + +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +LOGICAL, DIMENSION(:,:,:), intent(in) :: OMICRO ! Test where to compute all processes +INTEGER, intent(in) :: KMICRO +INTEGER, DIMENSION(:), intent(in) :: K1 +INTEGER, DIMENSION(:), intent(in) :: K2 +INTEGER, DIMENSION(:), intent(in) :: K3 +REAL, DIMENSION(:), intent(in) :: PRHODREF ! RHO Dry REFerence +REAL, DIMENSION(:), intent(in) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:), intent(in) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:), intent(in) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:), intent(in) :: PHLC_HCF ! HLCLOUDS : fraction of High Cloud Fraction in grid +REAL, DIMENSION(:), intent(in) :: PHLC_LCF ! HLCLOUDS : fraction of Low Cloud Fraction in grid +REAL, DIMENSION(:), intent(in) :: PHLC_HRC ! HLCLOUDS : LWC that is High LWC in grid +REAL, DIMENSION(:), intent(in) :: PHLC_LRC ! HLCLOUDS : LWC that is Low LWC in grid +REAL, DIMENSION(:), intent(in) :: PRHODJ ! RHO times Jacobian +REAL, DIMENSION(:), intent(in) :: PPRES ! Pressure +REAL, DIMENSION(:), intent(in) :: PZT ! Temperature +REAL, DIMENSION(:), intent(in) :: PLBDAR ! Slope parameter of the raindrop distribution +REAL, DIMENSION(:), intent(in) :: PLBDAR_RF! Slope parameter of the raindrop distribution + ! for the Rain Fraction part +REAL, DIMENSION(:), intent(in) :: PLVFACT ! L_v/(Pi_ref*C_ph) +REAL, DIMENSION(:), intent(in) :: PCJ ! Function to compute the ventilation coefficient +REAL, DIMENSION(:), intent(in) :: PKA ! Thermal conductivity of the air +REAL, DIMENSION(:), intent(in) :: PDV ! Diffusivity of water vapor in the air +REAL, DIMENSION(:), intent(in) :: PRF ! Rain fraction +REAL, DIMENSION(:), intent(in) :: PCF ! Cloud fraction +REAL, DIMENSION(:), intent(in) :: PTHT ! Potential temperature +REAL, DIMENSION(:), intent(in) :: PTHLT ! Liquid potential temperature +REAL, DIMENSION(:), INTENT(INOUT) :: PRVS ! Water vapor m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: PRRS ! Rain water m.r. source +REAL, DIMENSION(:), INTENT(INOUT) :: PTHS ! Theta source +!PW: PUSW could be a purely local variable? +REAL, DIMENSION(:), INTENT(INOUT) :: PUSW ! Undersaturation over water +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEVAP3D ! Rain evap profile +! +!* 0.2 declaration of local variables +! +INTEGER :: JL +REAL, DIMENSION(size(PRHODREF)) :: ZZW ! Work array +REAL, DIMENSION(size(PRHODREF)) :: ZZW2 ! Work array +REAL, DIMENSION(size(PRHODREF)) :: ZZW3 ! Work array +REAL, DIMENSION(size(PRHODREF)) :: ZZW4 ! Work array +! +!------------------------------------------------------------------------------- +! +!* 4.2 compute the autoconversion of r_c for r_r production: RCAUTR +! + zzw(:) = 0. + WHERE( PRCS(:)>0.0 .AND. PHLC_HCF(:).GT.0.0 ) + ZZW(:) = XTIMAUTC*MAX( PHLC_HRC(:)/PHLC_HCF(:) - XCRIAUTC/PRHODREF(:),0.0) + ZZW(:) = MIN( PRCS(:),PHLC_HCF(:)*ZZW(:)) + PRCS(:) = PRCS(:) - ZZW(:) + PRRS(:) = PRRS(:) + ZZW(:) + END WHERE + + if ( lbudget_rc ) call Budget_store_add( tbudgets(NBUDGET_RC), 'AUTO', & + Unpack( -zzw(:) * prhodj(:), mask = omicro(:,:,:), field = 0.) ) + if ( lbudget_rr ) call Budget_store_add( tbudgets(NBUDGET_RR), 'AUTO', & + Unpack( zzw(:) * prhodj(:), mask = omicro(:,:,:), field = 0.) ) +! +!* 4.3 compute the accretion of r_c for r_r production: RCACCR +! + zzw(:) = 0. + IF (CSUBG_RC_RR_ACCR=='NONE') THEN + !CLoud water and rain are diluted over the grid box + WHERE( PRCT(:)>XRTMIN(2) .AND. PRRT(:)>XRTMIN(3) .AND. PRCS(:)>0.0 ) + ZZW(:) = MIN( PRCS(:), XFCACCR * PRCT(:) & + * PLBDAR(:)**XEXCACCR & + * PRHODREF(:)**(-XCEXVT) ) + PRCS(:) = PRCS(:) - ZZW(:) + PRRS(:) = PRRS(:) + ZZW(:) + END WHERE + + ELSEIF (CSUBG_RC_RR_ACCR=='PRFR') THEN + !Cloud water is concentrated over its fraction with possibly to parts with high and low content as set for autoconversion + !Rain is concnetrated over its fraction + !Rain in high content area fraction: PHLC_HCF + !Rain in low content area fraction: + ! if PRF<PCF (rain is entirely falling in cloud): PRF-PHLC_HCF + ! if PRF>PCF (rain is falling in cloud and in clear sky): PCF-PHLC_HCF + ! => min(PCF, PRF)-PHLC_HCF + WHERE( PHLC_HRC(:)>XRTMIN(2) .AND. PRRT(:)>XRTMIN(3) .AND. PRCS(:)>0.0 & + .AND. PHLC_HCF(:)>0 ) + !Accretion due to rain falling in high cloud content + ZZW(:) = XFCACCR * ( PHLC_HRC(:)/PHLC_HCF(:) ) & + * PLBDAR_RF(:)**XEXCACCR & + * PRHODREF(:)**(-XCEXVT) & + * PHLC_HCF + END WHERE + WHERE( PHLC_LRC(:)>XRTMIN(2) .AND. PRRT(:)>XRTMIN(3) .AND. PRCS(:)>0.0 & + .AND. PHLC_LCF(:)>0 ) + !We add acrretion due to rain falling in low cloud content + ZZW(:) = ZZW(:) + XFCACCR * ( PHLC_LRC(:)/PHLC_LCF(:) ) & + * PLBDAR_RF(:)**XEXCACCR & + * PRHODREF(:)**(-XCEXVT) & + * (MIN(PCF(:), PRF(:))-PHLC_HCF(:)) + END WHERE + ZZW(:)=MIN(PRCS(:), ZZW(:)) + PRCS(:) = PRCS(:) - ZZW(:) + PRRS(:) = PRRS(:) + ZZW(:) + + ELSE + call Print_msg( NVERB_FATAL, 'GEN', 'RAIN_ICE_WARM', 'invalid CSUBG_RC_RR_ACCR value: '//Trim(csubg_rc_rr_accr) ) + ENDIF + + if ( lbudget_rc ) call Budget_store_add( tbudgets(NBUDGET_RC), 'ACCR', & + Unpack( -zzw(:) * prhodj(:), mask = omicro(:,:,:), field = 0.) ) + if ( lbudget_rr ) call Budget_store_add( tbudgets(NBUDGET_RR), 'ACCR', & + Unpack( zzw(:) * prhodj(:), mask = omicro(:,:,:), field = 0.) ) +! +!* 4.4 compute the evaporation of r_r: RREVAV +! + ZZW(:) = 0.0 + + IF (CSUBG_RR_EVAP=='NONE') THEN + !Evaporation only when there's no cloud (RC must be 0) + WHERE( (PRRT(:)>XRTMIN(3)) .AND. (PRCT(:)<=XRTMIN(2)) ) + ZZW(:) = EXP( XALPW - XBETAW/PZT(:) - XGAMW*ALOG(PZT(:) ) ) ! es_w + PUSW(:) = 1.0 - PRVT(:)*( PPRES(:)-ZZW(:) ) / ( (XMV/XMD) * ZZW(:) ) + ! Undersaturation over water + ZZW(:) = ( XLVTT+(XCPV-XCL)*(PZT(:)-XTT) )**2 / ( PKA(:)*XRV*PZT(:)**2 ) & + + ( XRV*PZT(:) ) / ( PDV(:)*ZZW(:) ) + ZZW(:) = MIN( PRRS(:),( MAX( 0.0,PUSW(:) )/(PRHODREF(:)*ZZW(:)) ) * & + ( X0EVAR*PLBDAR(:)**XEX0EVAR+X1EVAR*PCJ(:)*PLBDAR(:)**XEX1EVAR ) ) + PRRS(:) = PRRS(:) - ZZW(:) + PRVS(:) = PRVS(:) + ZZW(:) + PTHS(:) = PTHS(:) - ZZW(:)*PLVFACT(:) + END WHERE + + ELSEIF (CSUBG_RR_EVAP=='CLFR' .OR. CSUBG_RR_EVAP=='PRFR') THEN + !Evaporation in clear sky part + !With CLFR, rain is diluted over the grid box + !With PRFR, rain is concentrated in its fraction + !Use temperature and humidity in clear sky part like Bechtold et al. (1993) + IF (CSUBG_RR_EVAP=='CLFR') THEN + ZZW4(:)=1. !Precipitation fraction + ZZW3(:)=PLBDAR(:) + ELSE + ZZW4(:)=PRF(:) !Precipitation fraction + ZZW3(:)=PLBDAR_RF(:) + ENDIF + + !ATTENTION + !Il faudrait recalculer les variables PKA, PDV, PCJ en tenant compte de la température T^u + !Ces variables devraient être sorties de rain_ice_slow et on mettrait le calcul de T^u, T^s + !et plusieurs versions (comme actuellement, en ciel clair, en ciel nuageux) de PKA, PDV, PCJ dans rain_ice + !On utiliserait la bonne version suivant l'option NONE, CLFR... dans l'évaporation et ailleurs + + WHERE( (PRRT(:)>XRTMIN(3)) .AND. ( ZZW4(:) > PCF(:) ) ) + ! outside the cloud (environment) the use of T^u (unsaturated) instead of T + ! Bechtold et al. 1993 + ! + ! T^u = T_l = theta_l * (T/theta) + ZZW2(:) = PTHLT(:) * PZT(:) / PTHT(:) + ! + ! es_w with new T^u + ZZW(:) = EXP( XALPW - XBETAW/ZZW2(:) - XGAMW*ALOG(ZZW2(:) ) ) + ! + ! S, Undersaturation over water (with new theta^u) + PUSW(:) = 1.0 - PRVT(:)*( PPRES(:)-ZZW(:) ) / ( (XMV/XMD) * ZZW(:) ) + ! + ZZW(:) = ( XLVTT+(XCPV-XCL)*(ZZW2(:)-XTT) )**2 / ( PKA(:)*XRV*ZZW2(:)**2 ) & + + ( XRV*ZZW2(:) ) / ( PDV(:)*ZZW(:) ) + ! + ZZW(:) = MAX( 0.0,PUSW(:) )/(PRHODREF(:)*ZZW(:)) * & + ( X0EVAR*ZZW3(:)**XEX0EVAR+X1EVAR*PCJ(:)*ZZW3(:)**XEX1EVAR ) + ! + ZZW(:) = MIN( PRRS(:), ZZW(:) *( ZZW4(:) - PCF(:) ) ) + ! + PRRS(:) = PRRS(:) - ZZW(:) + PRVS(:) = PRVS(:) + ZZW(:) + PTHS(:) = PTHS(:) - ZZW(:)*PLVFACT(:) + END WHERE + + ELSE + call Print_msg( NVERB_FATAL, 'GEN', 'RAIN_ICE_WARM', 'invalid CSUBG_RR_EVAP value: '//Trim( csubg_rr_evap ) ) + END IF + + if ( lbudget_th ) call Budget_store_add( tbudgets(NBUDGET_TH), 'REVA', & + Unpack( -zzw(:) * plvfact(:) * prhodj(:), mask = omicro(:,:,:), field = 0.) ) + if ( lbudget_rv ) call Budget_store_add( tbudgets(NBUDGET_RV), 'REVA', & + Unpack( zzw(:) * prhodj(:), mask = omicro(:,:,:), field = 0.) ) + if ( lbudget_rr ) call Budget_store_add( tbudgets(NBUDGET_RR), 'REVA', & + Unpack( -zzw(:) * prhodj(:), mask = omicro(:,:,:), field = 0.) ) + + DO JL = 1, KMICRO + PEVAP3D(K1(JL), K2(JL), K3(JL)) = ZZW( JL ) + END DO +! + END SUBROUTINE RAIN_ICE_WARM + +END MODULE MODE_RAIN_ICE_WARM diff --git a/src/mesonh/micro/read_xker_gweth.f90 b/src/mesonh/micro/read_xker_gweth.f90 new file mode 100644 index 000000000..c8f3fe40d --- /dev/null +++ b/src/mesonh/micro/read_xker_gweth.f90 @@ -0,0 +1,1737 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 microph 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ########################### + MODULE MODI_READ_XKER_GWETH +! ########################### +! +INTERFACE + SUBROUTINE READ_XKER_GWETH (KWETLBDAH,KWETLBDAG,KND, & + PALPHAH,PNUH,PALPHAG,PNUG,PEHG,PBG,PCH,PDH,PCG,PDG, & + PWETLBDAH_MAX,PWETLBDAG_MAX,PWETLBDAH_MIN,PWETLBDAG_MIN, & + PFDINFTY,PKER_GWETH ) +! +INTEGER, INTENT(OUT) :: KND,KWETLBDAH,KWETLBDAG +REAL, INTENT(OUT) :: PALPHAH +REAL, INTENT(OUT) :: PNUH +REAL, INTENT(OUT) :: PALPHAG +REAL, INTENT(OUT) :: PNUG +REAL, INTENT(OUT) :: PEHG +REAL, INTENT(OUT) :: PBG +REAL, INTENT(OUT) :: PCH +REAL, INTENT(OUT) :: PDH +REAL, INTENT(OUT) :: PCG +REAL, INTENT(OUT) :: PDG +REAL, INTENT(OUT) :: PWETLBDAH_MAX +REAL, INTENT(OUT) :: PWETLBDAG_MAX +REAL, INTENT(OUT) :: PWETLBDAH_MIN +REAL, INTENT(OUT) :: PWETLBDAG_MIN +REAL, INTENT(OUT) :: PFDINFTY +REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PKER_GWETH +! +END SUBROUTINE +! +END INTERFACE +! +END MODULE MODI_READ_XKER_GWETH +! ######################################################################## + SUBROUTINE READ_XKER_GWETH (KWETLBDAH,KWETLBDAG,KND, & + PALPHAH,PNUH,PALPHAG,PNUG,PEHG,PBG,PCH,PDH,PCG,PDG, & + PWETLBDAH_MAX,PWETLBDAG_MAX,PWETLBDAH_MIN,PWETLBDAG_MIN, & + PFDINFTY,PKER_GWETH ) +! ######################################################################## +! +!!**** * * - initialize the kernels for the graupel-hail wet growth process +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to initialize the kernels PKER_GWETH +!! prepared from a previous run of the routine INI_RAIN_ICE. The reading +!! of the kernels is optional after checking for the dimensions of the +!! arrays. +!! +!!** METHOD +!! ------ +!! +!! +!! EXTERNAL +!! -------- +!! None +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! Book2 of documentation ( routine READ_XKER_GWETH ) +!! +!! AUTHOR +!! ------ +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original 19/04/97 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +!* 0.2 Declarations of local variables : +! +! +INTEGER, INTENT(OUT) :: KND,KWETLBDAH,KWETLBDAG +REAL, INTENT(OUT) :: PALPHAH +REAL, INTENT(OUT) :: PNUH +REAL, INTENT(OUT) :: PALPHAG +REAL, INTENT(OUT) :: PNUG +REAL, INTENT(OUT) :: PEHG +REAL, INTENT(OUT) :: PBG +REAL, INTENT(OUT) :: PCH +REAL, INTENT(OUT) :: PDH +REAL, INTENT(OUT) :: PCG +REAL, INTENT(OUT) :: PDG +REAL, INTENT(OUT) :: PWETLBDAH_MAX +REAL, INTENT(OUT) :: PWETLBDAG_MAX +REAL, INTENT(OUT) :: PWETLBDAH_MIN +REAL, INTENT(OUT) :: PWETLBDAG_MIN +REAL, INTENT(OUT) :: PFDINFTY +REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PKER_GWETH +! +! ######################################################################## +! #INSERT HERE THE OUTPUT OF INI_RAIN_ICE_HAIL IF THE KERNELS ARE UPDATED# +! ######################################################################## +! +KND= 50 +KWETLBDAH= 40 +KWETLBDAG= 40 +PALPHAH= 0.100000E+01 +PNUH= 0.800000E+01 +PALPHAG= 0.100000E+01 +PNUG= 0.100000E+01 +PEHG= 0.100000E+01 +PBG= 0.280000E+01 +PCH= 0.207000E+03 +PDH= 0.640000E+00 +PCG= 0.124000E+03 +PDG= 0.660000E+00 +PWETLBDAH_MAX= 0.100000E+08 +PWETLBDAG_MAX= 0.100000E+08 +PWETLBDAH_MIN= 0.100000E+04 +PWETLBDAG_MIN= 0.100000E+04 +PFDINFTY= 0.200000E+02 +! +IF( PRESENT(PKER_GWETH) ) THEN + PKER_GWETH( 1, 1) = 0.687148E+01 + PKER_GWETH( 1, 2) = 0.747813E+01 + PKER_GWETH( 1, 3) = 0.798959E+01 + PKER_GWETH( 1, 4) = 0.841881E+01 + PKER_GWETH( 1, 5) = 0.877841E+01 + PKER_GWETH( 1, 6) = 0.907960E+01 + PKER_GWETH( 1, 7) = 0.933201E+01 + PKER_GWETH( 1, 8) = 0.954375E+01 + PKER_GWETH( 1, 9) = 0.972162E+01 + PKER_GWETH( 1, 10) = 0.987126E+01 + PKER_GWETH( 1, 11) = 0.999733E+01 + PKER_GWETH( 1, 12) = 0.101037E+02 + PKER_GWETH( 1, 13) = 0.101936E+02 + PKER_GWETH( 1, 14) = 0.102696E+02 + PKER_GWETH( 1, 15) = 0.103340E+02 + PKER_GWETH( 1, 16) = 0.103886E+02 + PKER_GWETH( 1, 17) = 0.104350E+02 + PKER_GWETH( 1, 18) = 0.104743E+02 + PKER_GWETH( 1, 19) = 0.105077E+02 + PKER_GWETH( 1, 20) = 0.105362E+02 + PKER_GWETH( 1, 21) = 0.105604E+02 + PKER_GWETH( 1, 22) = 0.105810E+02 + PKER_GWETH( 1, 23) = 0.105985E+02 + PKER_GWETH( 1, 24) = 0.106135E+02 + PKER_GWETH( 1, 25) = 0.106262E+02 + PKER_GWETH( 1, 26) = 0.106371E+02 + PKER_GWETH( 1, 27) = 0.106464E+02 + PKER_GWETH( 1, 28) = 0.106543E+02 + PKER_GWETH( 1, 29) = 0.106610E+02 + PKER_GWETH( 1, 30) = 0.106668E+02 + PKER_GWETH( 1, 31) = 0.106717E+02 + PKER_GWETH( 1, 32) = 0.106759E+02 + PKER_GWETH( 1, 33) = 0.106795E+02 + PKER_GWETH( 1, 34) = 0.106825E+02 + PKER_GWETH( 1, 35) = 0.106851E+02 + PKER_GWETH( 1, 36) = 0.106874E+02 + PKER_GWETH( 1, 37) = 0.106893E+02 + PKER_GWETH( 1, 38) = 0.106909E+02 + PKER_GWETH( 1, 39) = 0.106923E+02 + PKER_GWETH( 1, 40) = 0.106935E+02 + PKER_GWETH( 2, 1) = 0.531200E+01 + PKER_GWETH( 2, 2) = 0.592117E+01 + PKER_GWETH( 2, 3) = 0.644064E+01 + PKER_GWETH( 2, 4) = 0.687856E+01 + PKER_GWETH( 2, 5) = 0.724606E+01 + PKER_GWETH( 2, 6) = 0.755396E+01 + PKER_GWETH( 2, 7) = 0.781184E+01 + PKER_GWETH( 2, 8) = 0.802795E+01 + PKER_GWETH( 2, 9) = 0.820924E+01 + PKER_GWETH( 2, 10) = 0.836153E+01 + PKER_GWETH( 2, 11) = 0.848964E+01 + PKER_GWETH( 2, 12) = 0.859758E+01 + PKER_GWETH( 2, 13) = 0.868865E+01 + PKER_GWETH( 2, 14) = 0.876559E+01 + PKER_GWETH( 2, 15) = 0.883069E+01 + PKER_GWETH( 2, 16) = 0.888581E+01 + PKER_GWETH( 2, 17) = 0.893255E+01 + PKER_GWETH( 2, 18) = 0.897221E+01 + PKER_GWETH( 2, 19) = 0.900589E+01 + PKER_GWETH( 2, 20) = 0.903451E+01 + PKER_GWETH( 2, 21) = 0.905885E+01 + PKER_GWETH( 2, 22) = 0.907956E+01 + PKER_GWETH( 2, 23) = 0.909719E+01 + PKER_GWETH( 2, 24) = 0.911221E+01 + PKER_GWETH( 2, 25) = 0.912500E+01 + PKER_GWETH( 2, 26) = 0.913591E+01 + PKER_GWETH( 2, 27) = 0.914521E+01 + PKER_GWETH( 2, 28) = 0.915314E+01 + PKER_GWETH( 2, 29) = 0.915990E+01 + PKER_GWETH( 2, 30) = 0.916568E+01 + PKER_GWETH( 2, 31) = 0.917060E+01 + PKER_GWETH( 2, 32) = 0.917481E+01 + PKER_GWETH( 2, 33) = 0.917840E+01 + PKER_GWETH( 2, 34) = 0.918147E+01 + PKER_GWETH( 2, 35) = 0.918409E+01 + PKER_GWETH( 2, 36) = 0.918633E+01 + PKER_GWETH( 2, 37) = 0.918824E+01 + PKER_GWETH( 2, 38) = 0.918987E+01 + PKER_GWETH( 2, 39) = 0.919127E+01 + PKER_GWETH( 2, 40) = 0.919246E+01 + PKER_GWETH( 3, 1) = 0.398480E+01 + PKER_GWETH( 3, 2) = 0.458041E+01 + PKER_GWETH( 3, 3) = 0.510220E+01 + PKER_GWETH( 3, 4) = 0.554702E+01 + PKER_GWETH( 3, 5) = 0.592198E+01 + PKER_GWETH( 3, 6) = 0.623664E+01 + PKER_GWETH( 3, 7) = 0.650027E+01 + PKER_GWETH( 3, 8) = 0.672107E+01 + PKER_GWETH( 3, 9) = 0.690610E+01 + PKER_GWETH( 3, 10) = 0.706132E+01 + PKER_GWETH( 3, 11) = 0.719170E+01 + PKER_GWETH( 3, 12) = 0.730139E+01 + PKER_GWETH( 3, 13) = 0.739379E+01 + PKER_GWETH( 3, 14) = 0.747176E+01 + PKER_GWETH( 3, 15) = 0.753763E+01 + PKER_GWETH( 3, 16) = 0.759335E+01 + PKER_GWETH( 3, 17) = 0.764054E+01 + PKER_GWETH( 3, 18) = 0.768055E+01 + PKER_GWETH( 3, 19) = 0.771450E+01 + PKER_GWETH( 3, 20) = 0.774332E+01 + PKER_GWETH( 3, 21) = 0.776782E+01 + PKER_GWETH( 3, 22) = 0.778866E+01 + PKER_GWETH( 3, 23) = 0.780638E+01 + PKER_GWETH( 3, 24) = 0.782147E+01 + PKER_GWETH( 3, 25) = 0.783433E+01 + PKER_GWETH( 3, 26) = 0.784528E+01 + PKER_GWETH( 3, 27) = 0.785461E+01 + PKER_GWETH( 3, 28) = 0.786257E+01 + PKER_GWETH( 3, 29) = 0.786935E+01 + PKER_GWETH( 3, 30) = 0.787514E+01 + PKER_GWETH( 3, 31) = 0.788008E+01 + PKER_GWETH( 3, 32) = 0.788430E+01 + PKER_GWETH( 3, 33) = 0.788790E+01 + PKER_GWETH( 3, 34) = 0.789098E+01 + PKER_GWETH( 3, 35) = 0.789360E+01 + PKER_GWETH( 3, 36) = 0.789584E+01 + PKER_GWETH( 3, 37) = 0.789776E+01 + PKER_GWETH( 3, 38) = 0.789939E+01 + PKER_GWETH( 3, 39) = 0.790079E+01 + PKER_GWETH( 3, 40) = 0.790199E+01 + PKER_GWETH( 4, 1) = 0.288960E+01 + PKER_GWETH( 4, 2) = 0.343887E+01 + PKER_GWETH( 4, 3) = 0.394949E+01 + PKER_GWETH( 4, 4) = 0.439644E+01 + PKER_GWETH( 4, 5) = 0.477733E+01 + PKER_GWETH( 4, 6) = 0.509838E+01 + PKER_GWETH( 4, 7) = 0.536780E+01 + PKER_GWETH( 4, 8) = 0.559352E+01 + PKER_GWETH( 4, 9) = 0.578258E+01 + PKER_GWETH( 4, 10) = 0.594100E+01 + PKER_GWETH( 4, 11) = 0.607390E+01 + PKER_GWETH( 4, 12) = 0.618553E+01 + PKER_GWETH( 4, 13) = 0.627943E+01 + PKER_GWETH( 4, 14) = 0.635854E+01 + PKER_GWETH( 4, 15) = 0.642529E+01 + PKER_GWETH( 4, 16) = 0.648168E+01 + PKER_GWETH( 4, 17) = 0.652938E+01 + PKER_GWETH( 4, 18) = 0.656978E+01 + PKER_GWETH( 4, 19) = 0.660403E+01 + PKER_GWETH( 4, 20) = 0.663308E+01 + PKER_GWETH( 4, 21) = 0.665776E+01 + PKER_GWETH( 4, 22) = 0.667873E+01 + PKER_GWETH( 4, 23) = 0.669656E+01 + PKER_GWETH( 4, 24) = 0.671173E+01 + PKER_GWETH( 4, 25) = 0.672465E+01 + PKER_GWETH( 4, 26) = 0.673565E+01 + PKER_GWETH( 4, 27) = 0.674502E+01 + PKER_GWETH( 4, 28) = 0.675301E+01 + PKER_GWETH( 4, 29) = 0.675982E+01 + PKER_GWETH( 4, 30) = 0.676563E+01 + PKER_GWETH( 4, 31) = 0.677058E+01 + PKER_GWETH( 4, 32) = 0.677481E+01 + PKER_GWETH( 4, 33) = 0.677842E+01 + PKER_GWETH( 4, 34) = 0.678150E+01 + PKER_GWETH( 4, 35) = 0.678413E+01 + PKER_GWETH( 4, 36) = 0.678638E+01 + PKER_GWETH( 4, 37) = 0.678830E+01 + PKER_GWETH( 4, 38) = 0.678994E+01 + PKER_GWETH( 4, 39) = 0.679134E+01 + PKER_GWETH( 4, 40) = 0.679253E+01 + PKER_GWETH( 5, 1) = 0.204551E+01 + PKER_GWETH( 5, 2) = 0.249578E+01 + PKER_GWETH( 5, 3) = 0.296766E+01 + PKER_GWETH( 5, 4) = 0.340540E+01 + PKER_GWETH( 5, 5) = 0.378824E+01 + PKER_GWETH( 5, 6) = 0.411440E+01 + PKER_GWETH( 5, 7) = 0.438929E+01 + PKER_GWETH( 5, 8) = 0.461997E+01 + PKER_GWETH( 5, 9) = 0.481324E+01 + PKER_GWETH( 5, 10) = 0.497511E+01 + PKER_GWETH( 5, 11) = 0.511076E+01 + PKER_GWETH( 5, 12) = 0.522454E+01 + PKER_GWETH( 5, 13) = 0.532011E+01 + PKER_GWETH( 5, 14) = 0.540051E+01 + PKER_GWETH( 5, 15) = 0.546824E+01 + PKER_GWETH( 5, 16) = 0.552538E+01 + PKER_GWETH( 5, 17) = 0.557366E+01 + PKER_GWETH( 5, 18) = 0.561449E+01 + PKER_GWETH( 5, 19) = 0.564907E+01 + PKER_GWETH( 5, 20) = 0.567839E+01 + PKER_GWETH( 5, 21) = 0.570326E+01 + PKER_GWETH( 5, 22) = 0.572438E+01 + PKER_GWETH( 5, 23) = 0.574233E+01 + PKER_GWETH( 5, 24) = 0.575759E+01 + PKER_GWETH( 5, 25) = 0.577058E+01 + PKER_GWETH( 5, 26) = 0.578163E+01 + PKER_GWETH( 5, 27) = 0.579105E+01 + PKER_GWETH( 5, 28) = 0.579907E+01 + PKER_GWETH( 5, 29) = 0.580591E+01 + PKER_GWETH( 5, 30) = 0.581173E+01 + PKER_GWETH( 5, 31) = 0.581671E+01 + PKER_GWETH( 5, 32) = 0.582095E+01 + PKER_GWETH( 5, 33) = 0.582457E+01 + PKER_GWETH( 5, 34) = 0.582765E+01 + PKER_GWETH( 5, 35) = 0.583029E+01 + PKER_GWETH( 5, 36) = 0.583254E+01 + PKER_GWETH( 5, 37) = 0.583446E+01 + PKER_GWETH( 5, 38) = 0.583611E+01 + PKER_GWETH( 5, 39) = 0.583751E+01 + PKER_GWETH( 5, 40) = 0.583871E+01 + PKER_GWETH( 6, 1) = 0.147885E+01 + PKER_GWETH( 6, 2) = 0.176736E+01 + PKER_GWETH( 6, 3) = 0.215562E+01 + PKER_GWETH( 6, 4) = 0.256096E+01 + PKER_GWETH( 6, 5) = 0.293621E+01 + PKER_GWETH( 6, 6) = 0.326413E+01 + PKER_GWETH( 6, 7) = 0.354342E+01 + PKER_GWETH( 6, 8) = 0.377879E+01 + PKER_GWETH( 6, 9) = 0.397630E+01 + PKER_GWETH( 6, 10) = 0.414178E+01 + PKER_GWETH( 6, 11) = 0.428038E+01 + PKER_GWETH( 6, 12) = 0.439652E+01 + PKER_GWETH( 6, 13) = 0.449394E+01 + PKER_GWETH( 6, 14) = 0.457577E+01 + PKER_GWETH( 6, 15) = 0.464460E+01 + PKER_GWETH( 6, 16) = 0.470259E+01 + PKER_GWETH( 6, 17) = 0.475151E+01 + PKER_GWETH( 6, 18) = 0.479283E+01 + PKER_GWETH( 6, 19) = 0.482779E+01 + PKER_GWETH( 6, 20) = 0.485739E+01 + PKER_GWETH( 6, 21) = 0.488249E+01 + PKER_GWETH( 6, 22) = 0.490378E+01 + PKER_GWETH( 6, 23) = 0.492186E+01 + PKER_GWETH( 6, 24) = 0.493722E+01 + PKER_GWETH( 6, 25) = 0.495028E+01 + PKER_GWETH( 6, 26) = 0.496140E+01 + PKER_GWETH( 6, 27) = 0.497086E+01 + PKER_GWETH( 6, 28) = 0.497892E+01 + PKER_GWETH( 6, 29) = 0.498578E+01 + PKER_GWETH( 6, 30) = 0.499163E+01 + PKER_GWETH( 6, 31) = 0.499662E+01 + PKER_GWETH( 6, 32) = 0.500088E+01 + PKER_GWETH( 6, 33) = 0.500450E+01 + PKER_GWETH( 6, 34) = 0.500760E+01 + PKER_GWETH( 6, 35) = 0.501024E+01 + PKER_GWETH( 6, 36) = 0.501250E+01 + PKER_GWETH( 6, 37) = 0.501443E+01 + PKER_GWETH( 6, 38) = 0.501607E+01 + PKER_GWETH( 6, 39) = 0.501748E+01 + PKER_GWETH( 6, 40) = 0.501868E+01 + PKER_GWETH( 7, 1) = 0.119724E+01 + PKER_GWETH( 7, 2) = 0.127547E+01 + PKER_GWETH( 7, 3) = 0.152697E+01 + PKER_GWETH( 7, 4) = 0.186178E+01 + PKER_GWETH( 7, 5) = 0.220994E+01 + PKER_GWETH( 7, 6) = 0.253163E+01 + PKER_GWETH( 7, 7) = 0.281250E+01 + PKER_GWETH( 7, 8) = 0.305164E+01 + PKER_GWETH( 7, 9) = 0.325317E+01 + PKER_GWETH( 7, 10) = 0.342229E+01 + PKER_GWETH( 7, 11) = 0.356398E+01 + PKER_GWETH( 7, 12) = 0.368265E+01 + PKER_GWETH( 7, 13) = 0.378209E+01 + PKER_GWETH( 7, 14) = 0.386550E+01 + PKER_GWETH( 7, 15) = 0.393556E+01 + PKER_GWETH( 7, 16) = 0.399449E+01 + PKER_GWETH( 7, 17) = 0.404413E+01 + PKER_GWETH( 7, 18) = 0.408601E+01 + PKER_GWETH( 7, 19) = 0.412139E+01 + PKER_GWETH( 7, 20) = 0.415132E+01 + PKER_GWETH( 7, 21) = 0.417666E+01 + PKER_GWETH( 7, 22) = 0.419814E+01 + PKER_GWETH( 7, 23) = 0.421636E+01 + PKER_GWETH( 7, 24) = 0.423184E+01 + PKER_GWETH( 7, 25) = 0.424499E+01 + PKER_GWETH( 7, 26) = 0.425617E+01 + PKER_GWETH( 7, 27) = 0.426568E+01 + PKER_GWETH( 7, 28) = 0.427378E+01 + PKER_GWETH( 7, 29) = 0.428068E+01 + PKER_GWETH( 7, 30) = 0.428655E+01 + PKER_GWETH( 7, 31) = 0.429156E+01 + PKER_GWETH( 7, 32) = 0.429583E+01 + PKER_GWETH( 7, 33) = 0.429947E+01 + PKER_GWETH( 7, 34) = 0.430258E+01 + PKER_GWETH( 7, 35) = 0.430523E+01 + PKER_GWETH( 7, 36) = 0.430749E+01 + PKER_GWETH( 7, 37) = 0.430942E+01 + PKER_GWETH( 7, 38) = 0.431107E+01 + PKER_GWETH( 7, 39) = 0.431248E+01 + PKER_GWETH( 7, 40) = 0.431368E+01 + PKER_GWETH( 8, 1) = 0.116924E+01 + PKER_GWETH( 8, 2) = 0.102801E+01 + PKER_GWETH( 8, 3) = 0.110019E+01 + PKER_GWETH( 8, 4) = 0.131921E+01 + PKER_GWETH( 8, 5) = 0.160796E+01 + PKER_GWETH( 8, 6) = 0.190699E+01 + PKER_GWETH( 8, 7) = 0.218275E+01 + PKER_GWETH( 8, 8) = 0.242331E+01 + PKER_GWETH( 8, 9) = 0.262809E+01 + PKER_GWETH( 8, 10) = 0.280064E+01 + PKER_GWETH( 8, 11) = 0.294545E+01 + PKER_GWETH( 8, 12) = 0.306676E+01 + PKER_GWETH( 8, 13) = 0.316837E+01 + PKER_GWETH( 8, 14) = 0.325351E+01 + PKER_GWETH( 8, 15) = 0.332493E+01 + PKER_GWETH( 8, 16) = 0.338491E+01 + PKER_GWETH( 8, 17) = 0.343537E+01 + PKER_GWETH( 8, 18) = 0.347787E+01 + PKER_GWETH( 8, 19) = 0.351372E+01 + PKER_GWETH( 8, 20) = 0.354401E+01 + PKER_GWETH( 8, 21) = 0.356963E+01 + PKER_GWETH( 8, 22) = 0.359132E+01 + PKER_GWETH( 8, 23) = 0.360971E+01 + PKER_GWETH( 8, 24) = 0.362531E+01 + PKER_GWETH( 8, 25) = 0.363856E+01 + PKER_GWETH( 8, 26) = 0.364981E+01 + PKER_GWETH( 8, 27) = 0.365938E+01 + PKER_GWETH( 8, 28) = 0.366752E+01 + PKER_GWETH( 8, 29) = 0.367446E+01 + PKER_GWETH( 8, 30) = 0.368036E+01 + PKER_GWETH( 8, 31) = 0.368539E+01 + PKER_GWETH( 8, 32) = 0.368967E+01 + PKER_GWETH( 8, 33) = 0.369333E+01 + PKER_GWETH( 8, 34) = 0.369644E+01 + PKER_GWETH( 8, 35) = 0.369910E+01 + PKER_GWETH( 8, 36) = 0.370137E+01 + PKER_GWETH( 8, 37) = 0.370330E+01 + PKER_GWETH( 8, 38) = 0.370496E+01 + PKER_GWETH( 8, 39) = 0.370637E+01 + PKER_GWETH( 8, 40) = 0.370757E+01 + PKER_GWETH( 9, 1) = 0.132655E+01 + PKER_GWETH( 9, 2) = 0.998897E+00 + PKER_GWETH( 9, 3) = 0.882830E+00 + PKER_GWETH( 9, 4) = 0.949046E+00 + PKER_GWETH( 9, 5) = 0.113967E+01 + PKER_GWETH( 9, 6) = 0.138873E+01 + PKER_GWETH( 9, 7) = 0.164554E+01 + PKER_GWETH( 9, 8) = 0.188191E+01 + PKER_GWETH( 9, 9) = 0.208795E+01 + PKER_GWETH( 9, 10) = 0.226330E+01 + PKER_GWETH( 9, 11) = 0.241104E+01 + PKER_GWETH( 9, 12) = 0.253503E+01 + PKER_GWETH( 9, 13) = 0.263890E+01 + PKER_GWETH( 9, 14) = 0.272590E+01 + PKER_GWETH( 9, 15) = 0.279880E+01 + PKER_GWETH( 9, 16) = 0.285995E+01 + PKER_GWETH( 9, 17) = 0.291131E+01 + PKER_GWETH( 9, 18) = 0.295450E+01 + PKER_GWETH( 9, 19) = 0.299089E+01 + PKER_GWETH( 9, 20) = 0.302159E+01 + PKER_GWETH( 9, 21) = 0.304751E+01 + PKER_GWETH( 9, 22) = 0.306944E+01 + PKER_GWETH( 9, 23) = 0.308801E+01 + PKER_GWETH( 9, 24) = 0.310375E+01 + PKER_GWETH( 9, 25) = 0.311711E+01 + PKER_GWETH( 9, 26) = 0.312845E+01 + PKER_GWETH( 9, 27) = 0.313808E+01 + PKER_GWETH( 9, 28) = 0.314627E+01 + PKER_GWETH( 9, 29) = 0.315324E+01 + PKER_GWETH( 9, 30) = 0.315917E+01 + PKER_GWETH( 9, 31) = 0.316423E+01 + PKER_GWETH( 9, 32) = 0.316853E+01 + PKER_GWETH( 9, 33) = 0.317220E+01 + PKER_GWETH( 9, 34) = 0.317532E+01 + PKER_GWETH( 9, 35) = 0.317799E+01 + PKER_GWETH( 9, 36) = 0.318027E+01 + PKER_GWETH( 9, 37) = 0.318221E+01 + PKER_GWETH( 9, 38) = 0.318386E+01 + PKER_GWETH( 9, 39) = 0.318528E+01 + PKER_GWETH( 9, 40) = 0.318648E+01 + PKER_GWETH( 10, 1) = 0.158836E+01 + PKER_GWETH( 10, 2) = 0.112991E+01 + PKER_GWETH( 10, 3) = 0.853387E+00 + PKER_GWETH( 10, 4) = 0.758257E+00 + PKER_GWETH( 10, 5) = 0.818751E+00 + PKER_GWETH( 10, 6) = 0.984521E+00 + PKER_GWETH( 10, 7) = 0.119936E+01 + PKER_GWETH( 10, 8) = 0.141989E+01 + PKER_GWETH( 10, 9) = 0.162250E+01 + PKER_GWETH( 10, 10) = 0.179897E+01 + PKER_GWETH( 10, 11) = 0.194912E+01 + PKER_GWETH( 10, 12) = 0.207563E+01 + PKER_GWETH( 10, 13) = 0.218178E+01 + PKER_GWETH( 10, 14) = 0.227073E+01 + PKER_GWETH( 10, 15) = 0.234522E+01 + PKER_GWETH( 10, 16) = 0.240764E+01 + PKER_GWETH( 10, 17) = 0.245999E+01 + PKER_GWETH( 10, 18) = 0.250396E+01 + PKER_GWETH( 10, 19) = 0.254094E+01 + PKER_GWETH( 10, 20) = 0.257210E+01 + PKER_GWETH( 10, 21) = 0.259837E+01 + PKER_GWETH( 10, 22) = 0.262057E+01 + PKER_GWETH( 10, 23) = 0.263934E+01 + PKER_GWETH( 10, 24) = 0.265524E+01 + PKER_GWETH( 10, 25) = 0.266871E+01 + PKER_GWETH( 10, 26) = 0.268015E+01 + PKER_GWETH( 10, 27) = 0.268985E+01 + PKER_GWETH( 10, 28) = 0.269810E+01 + PKER_GWETH( 10, 29) = 0.270511E+01 + PKER_GWETH( 10, 30) = 0.271107E+01 + PKER_GWETH( 10, 31) = 0.271615E+01 + PKER_GWETH( 10, 32) = 0.272048E+01 + PKER_GWETH( 10, 33) = 0.272416E+01 + PKER_GWETH( 10, 34) = 0.272730E+01 + PKER_GWETH( 10, 35) = 0.272997E+01 + PKER_GWETH( 10, 36) = 0.273226E+01 + PKER_GWETH( 10, 37) = 0.273420E+01 + PKER_GWETH( 10, 38) = 0.273586E+01 + PKER_GWETH( 10, 39) = 0.273728E+01 + PKER_GWETH( 10, 40) = 0.273849E+01 + PKER_GWETH( 11, 1) = 0.188694E+01 + PKER_GWETH( 11, 2) = 0.135228E+01 + PKER_GWETH( 11, 3) = 0.962427E+00 + PKER_GWETH( 11, 4) = 0.729069E+00 + PKER_GWETH( 11, 5) = 0.651362E+00 + PKER_GWETH( 11, 6) = 0.706379E+00 + PKER_GWETH( 11, 7) = 0.850482E+00 + PKER_GWETH( 11, 8) = 0.103579E+01 + PKER_GWETH( 11, 9) = 0.122516E+01 + PKER_GWETH( 11, 10) = 0.139882E+01 + PKER_GWETH( 11, 11) = 0.154997E+01 + PKER_GWETH( 11, 12) = 0.167854E+01 + PKER_GWETH( 11, 13) = 0.178685E+01 + PKER_GWETH( 11, 14) = 0.187775E+01 + PKER_GWETH( 11, 15) = 0.195391E+01 + PKER_GWETH( 11, 16) = 0.201769E+01 + PKER_GWETH( 11, 17) = 0.207113E+01 + PKER_GWETH( 11, 18) = 0.211596E+01 + PKER_GWETH( 11, 19) = 0.215360E+01 + PKER_GWETH( 11, 20) = 0.218527E+01 + PKER_GWETH( 11, 21) = 0.221194E+01 + PKER_GWETH( 11, 22) = 0.223444E+01 + PKER_GWETH( 11, 23) = 0.225344E+01 + PKER_GWETH( 11, 24) = 0.226951E+01 + PKER_GWETH( 11, 25) = 0.228312E+01 + PKER_GWETH( 11, 26) = 0.229465E+01 + PKER_GWETH( 11, 27) = 0.230444E+01 + PKER_GWETH( 11, 28) = 0.231274E+01 + PKER_GWETH( 11, 29) = 0.231980E+01 + PKER_GWETH( 11, 30) = 0.232580E+01 + PKER_GWETH( 11, 31) = 0.233091E+01 + PKER_GWETH( 11, 32) = 0.233526E+01 + PKER_GWETH( 11, 33) = 0.233896E+01 + PKER_GWETH( 11, 34) = 0.234211E+01 + PKER_GWETH( 11, 35) = 0.234479E+01 + PKER_GWETH( 11, 36) = 0.234709E+01 + PKER_GWETH( 11, 37) = 0.234904E+01 + PKER_GWETH( 11, 38) = 0.235070E+01 + PKER_GWETH( 11, 39) = 0.235213E+01 + PKER_GWETH( 11, 40) = 0.235334E+01 + PKER_GWETH( 12, 1) = 0.217933E+01 + PKER_GWETH( 12, 2) = 0.160747E+01 + PKER_GWETH( 12, 3) = 0.115129E+01 + PKER_GWETH( 12, 4) = 0.819805E+00 + PKER_GWETH( 12, 5) = 0.622854E+00 + PKER_GWETH( 12, 6) = 0.559616E+00 + PKER_GWETH( 12, 7) = 0.609490E+00 + PKER_GWETH( 12, 8) = 0.734782E+00 + PKER_GWETH( 12, 9) = 0.894511E+00 + PKER_GWETH( 12, 10) = 0.105711E+01 + PKER_GWETH( 12, 11) = 0.120596E+01 + PKER_GWETH( 12, 12) = 0.133541E+01 + PKER_GWETH( 12, 13) = 0.144550E+01 + PKER_GWETH( 12, 14) = 0.153825E+01 + PKER_GWETH( 12, 15) = 0.161608E+01 + PKER_GWETH( 12, 16) = 0.168128E+01 + PKER_GWETH( 12, 17) = 0.173589E+01 + PKER_GWETH( 12, 18) = 0.178165E+01 + PKER_GWETH( 12, 19) = 0.182003E+01 + PKER_GWETH( 12, 20) = 0.185227E+01 + PKER_GWETH( 12, 21) = 0.187938E+01 + PKER_GWETH( 12, 22) = 0.190221E+01 + PKER_GWETH( 12, 23) = 0.192147E+01 + PKER_GWETH( 12, 24) = 0.193774E+01 + PKER_GWETH( 12, 25) = 0.195150E+01 + PKER_GWETH( 12, 26) = 0.196315E+01 + PKER_GWETH( 12, 27) = 0.197302E+01 + PKER_GWETH( 12, 28) = 0.198139E+01 + PKER_GWETH( 12, 29) = 0.198850E+01 + PKER_GWETH( 12, 30) = 0.199455E+01 + PKER_GWETH( 12, 31) = 0.199968E+01 + PKER_GWETH( 12, 32) = 0.200405E+01 + PKER_GWETH( 12, 33) = 0.200777E+01 + PKER_GWETH( 12, 34) = 0.201094E+01 + PKER_GWETH( 12, 35) = 0.201364E+01 + PKER_GWETH( 12, 36) = 0.201594E+01 + PKER_GWETH( 12, 37) = 0.201790E+01 + PKER_GWETH( 12, 38) = 0.201957E+01 + PKER_GWETH( 12, 39) = 0.202100E+01 + PKER_GWETH( 12, 40) = 0.202221E+01 + PKER_GWETH( 13, 1) = 0.244503E+01 + PKER_GWETH( 13, 2) = 0.185806E+01 + PKER_GWETH( 13, 3) = 0.136933E+01 + PKER_GWETH( 13, 4) = 0.980154E+00 + PKER_GWETH( 13, 5) = 0.698393E+00 + PKER_GWETH( 13, 6) = 0.532193E+00 + PKER_GWETH( 13, 7) = 0.480863E+00 + PKER_GWETH( 13, 8) = 0.525928E+00 + PKER_GWETH( 13, 9) = 0.634867E+00 + PKER_GWETH( 13, 10) = 0.772493E+00 + PKER_GWETH( 13, 11) = 0.912096E+00 + PKER_GWETH( 13, 12) = 0.103966E+01 + PKER_GWETH( 13, 13) = 0.115054E+01 + PKER_GWETH( 13, 14) = 0.124481E+01 + PKER_GWETH( 13, 15) = 0.132422E+01 + PKER_GWETH( 13, 16) = 0.139086E+01 + PKER_GWETH( 13, 17) = 0.144669E+01 + PKER_GWETH( 13, 18) = 0.149345E+01 + PKER_GWETH( 13, 19) = 0.153263E+01 + PKER_GWETH( 13, 20) = 0.156549E+01 + PKER_GWETH( 13, 21) = 0.159309E+01 + PKER_GWETH( 13, 22) = 0.161630E+01 + PKER_GWETH( 13, 23) = 0.163585E+01 + PKER_GWETH( 13, 24) = 0.165234E+01 + PKER_GWETH( 13, 25) = 0.166626E+01 + PKER_GWETH( 13, 26) = 0.167804E+01 + PKER_GWETH( 13, 27) = 0.168801E+01 + PKER_GWETH( 13, 28) = 0.169647E+01 + PKER_GWETH( 13, 29) = 0.170364E+01 + PKER_GWETH( 13, 30) = 0.170972E+01 + PKER_GWETH( 13, 31) = 0.171489E+01 + PKER_GWETH( 13, 32) = 0.171929E+01 + PKER_GWETH( 13, 33) = 0.172303E+01 + PKER_GWETH( 13, 34) = 0.172621E+01 + PKER_GWETH( 13, 35) = 0.172893E+01 + PKER_GWETH( 13, 36) = 0.173123E+01 + PKER_GWETH( 13, 37) = 0.173320E+01 + PKER_GWETH( 13, 38) = 0.173488E+01 + PKER_GWETH( 13, 39) = 0.173631E+01 + PKER_GWETH( 13, 40) = 0.173753E+01 + PKER_GWETH( 14, 1) = 0.267774E+01 + PKER_GWETH( 14, 2) = 0.208611E+01 + PKER_GWETH( 14, 3) = 0.158411E+01 + PKER_GWETH( 14, 4) = 0.116642E+01 + PKER_GWETH( 14, 5) = 0.834444E+00 + PKER_GWETH( 14, 6) = 0.594946E+00 + PKER_GWETH( 14, 7) = 0.454936E+00 + PKER_GWETH( 14, 8) = 0.413271E+00 + PKER_GWETH( 14, 9) = 0.453847E+00 + PKER_GWETH( 14, 10) = 0.548545E+00 + PKER_GWETH( 14, 11) = 0.667103E+00 + PKER_GWETH( 14, 12) = 0.786952E+00 + PKER_GWETH( 14, 13) = 0.896286E+00 + PKER_GWETH( 14, 14) = 0.991246E+00 + PKER_GWETH( 14, 15) = 0.107196E+01 + PKER_GWETH( 14, 16) = 0.113996E+01 + PKER_GWETH( 14, 17) = 0.119702E+01 + PKER_GWETH( 14, 18) = 0.124482E+01 + PKER_GWETH( 14, 19) = 0.128486E+01 + PKER_GWETH( 14, 20) = 0.131841E+01 + PKER_GWETH( 14, 21) = 0.134655E+01 + PKER_GWETH( 14, 22) = 0.137017E+01 + PKER_GWETH( 14, 23) = 0.139005E+01 + PKER_GWETH( 14, 24) = 0.140678E+01 + PKER_GWETH( 14, 25) = 0.142090E+01 + PKER_GWETH( 14, 26) = 0.143282E+01 + PKER_GWETH( 14, 27) = 0.144291E+01 + PKER_GWETH( 14, 28) = 0.145144E+01 + PKER_GWETH( 14, 29) = 0.145868E+01 + PKER_GWETH( 14, 30) = 0.146481E+01 + PKER_GWETH( 14, 31) = 0.147002E+01 + PKER_GWETH( 14, 32) = 0.147445E+01 + PKER_GWETH( 14, 33) = 0.147821E+01 + PKER_GWETH( 14, 34) = 0.148142E+01 + PKER_GWETH( 14, 35) = 0.148414E+01 + PKER_GWETH( 14, 36) = 0.148646E+01 + PKER_GWETH( 14, 37) = 0.148844E+01 + PKER_GWETH( 14, 38) = 0.149012E+01 + PKER_GWETH( 14, 39) = 0.149156E+01 + PKER_GWETH( 14, 40) = 0.149278E+01 + PKER_GWETH( 15, 1) = 0.287818E+01 + PKER_GWETH( 15, 2) = 0.228600E+01 + PKER_GWETH( 15, 3) = 0.177984E+01 + PKER_GWETH( 15, 4) = 0.135050E+01 + PKER_GWETH( 15, 5) = 0.993561E+00 + PKER_GWETH( 15, 6) = 0.710380E+00 + PKER_GWETH( 15, 7) = 0.506846E+00 + PKER_GWETH( 15, 8) = 0.388946E+00 + PKER_GWETH( 15, 9) = 0.355232E+00 + PKER_GWETH( 15, 10) = 0.391683E+00 + PKER_GWETH( 15, 11) = 0.473950E+00 + PKER_GWETH( 15, 12) = 0.576074E+00 + PKER_GWETH( 15, 13) = 0.678964E+00 + PKER_GWETH( 15, 14) = 0.772666E+00 + PKER_GWETH( 15, 15) = 0.853994E+00 + PKER_GWETH( 15, 16) = 0.923111E+00 + PKER_GWETH( 15, 17) = 0.981331E+00 + PKER_GWETH( 15, 18) = 0.103019E+01 + PKER_GWETH( 15, 19) = 0.107112E+01 + PKER_GWETH( 15, 20) = 0.110540E+01 + PKER_GWETH( 15, 21) = 0.113413E+01 + PKER_GWETH( 15, 22) = 0.115822E+01 + PKER_GWETH( 15, 23) = 0.117845E+01 + PKER_GWETH( 15, 24) = 0.119546E+01 + PKER_GWETH( 15, 25) = 0.120979E+01 + PKER_GWETH( 15, 26) = 0.122188E+01 + PKER_GWETH( 15, 27) = 0.123208E+01 + PKER_GWETH( 15, 28) = 0.124072E+01 + PKER_GWETH( 15, 29) = 0.124802E+01 + PKER_GWETH( 15, 30) = 0.125422E+01 + PKER_GWETH( 15, 31) = 0.125947E+01 + PKER_GWETH( 15, 32) = 0.126393E+01 + PKER_GWETH( 15, 33) = 0.126772E+01 + PKER_GWETH( 15, 34) = 0.127094E+01 + PKER_GWETH( 15, 35) = 0.127368E+01 + PKER_GWETH( 15, 36) = 0.127601E+01 + PKER_GWETH( 15, 37) = 0.127800E+01 + PKER_GWETH( 15, 38) = 0.127969E+01 + PKER_GWETH( 15, 39) = 0.128113E+01 + PKER_GWETH( 15, 40) = 0.128236E+01 + PKER_GWETH( 16, 1) = 0.304968E+01 + PKER_GWETH( 16, 2) = 0.245823E+01 + PKER_GWETH( 16, 3) = 0.195153E+01 + PKER_GWETH( 16, 4) = 0.151851E+01 + PKER_GWETH( 16, 5) = 0.115132E+01 + PKER_GWETH( 16, 6) = 0.846334E+00 + PKER_GWETH( 16, 7) = 0.604763E+00 + PKER_GWETH( 16, 8) = 0.431831E+00 + PKER_GWETH( 16, 9) = 0.332538E+00 + PKER_GWETH( 16, 10) = 0.305365E+00 + PKER_GWETH( 16, 11) = 0.338047E+00 + PKER_GWETH( 16, 12) = 0.409488E+00 + PKER_GWETH( 16, 13) = 0.497462E+00 + PKER_GWETH( 16, 14) = 0.585781E+00 + PKER_GWETH( 16, 15) = 0.666083E+00 + PKER_GWETH( 16, 16) = 0.735737E+00 + PKER_GWETH( 16, 17) = 0.794919E+00 + PKER_GWETH( 16, 18) = 0.844770E+00 + PKER_GWETH( 16, 19) = 0.886603E+00 + PKER_GWETH( 16, 20) = 0.921652E+00 + PKER_GWETH( 16, 21) = 0.951006E+00 + PKER_GWETH( 16, 22) = 0.975601E+00 + PKER_GWETH( 16, 23) = 0.996228E+00 + PKER_GWETH( 16, 24) = 0.101355E+01 + PKER_GWETH( 16, 25) = 0.102812E+01 + PKER_GWETH( 16, 26) = 0.104038E+01 + PKER_GWETH( 16, 27) = 0.105073E+01 + PKER_GWETH( 16, 28) = 0.105947E+01 + PKER_GWETH( 16, 29) = 0.106686E+01 + PKER_GWETH( 16, 30) = 0.107311E+01 + PKER_GWETH( 16, 31) = 0.107841E+01 + PKER_GWETH( 16, 32) = 0.108291E+01 + PKER_GWETH( 16, 33) = 0.108673E+01 + PKER_GWETH( 16, 34) = 0.108997E+01 + PKER_GWETH( 16, 35) = 0.109273E+01 + PKER_GWETH( 16, 36) = 0.109507E+01 + PKER_GWETH( 16, 37) = 0.109707E+01 + PKER_GWETH( 16, 38) = 0.109877E+01 + PKER_GWETH( 16, 39) = 0.110022E+01 + PKER_GWETH( 16, 40) = 0.110145E+01 + PKER_GWETH( 17, 1) = 0.319611E+01 + PKER_GWETH( 17, 2) = 0.260561E+01 + PKER_GWETH( 17, 3) = 0.209952E+01 + PKER_GWETH( 17, 4) = 0.166598E+01 + PKER_GWETH( 17, 5) = 0.129552E+01 + PKER_GWETH( 17, 6) = 0.981487E+00 + PKER_GWETH( 17, 7) = 0.720900E+00 + PKER_GWETH( 17, 8) = 0.514861E+00 + PKER_GWETH( 17, 9) = 0.367926E+00 + PKER_GWETH( 17, 10) = 0.284324E+00 + PKER_GWETH( 17, 11) = 0.262515E+00 + PKER_GWETH( 17, 12) = 0.291778E+00 + PKER_GWETH( 17, 13) = 0.353788E+00 + PKER_GWETH( 17, 14) = 0.429565E+00 + PKER_GWETH( 17, 15) = 0.505375E+00 + PKER_GWETH( 17, 16) = 0.574193E+00 + PKER_GWETH( 17, 17) = 0.633847E+00 + PKER_GWETH( 17, 18) = 0.684523E+00 + PKER_GWETH( 17, 19) = 0.727207E+00 + PKER_GWETH( 17, 20) = 0.763026E+00 + PKER_GWETH( 17, 21) = 0.793037E+00 + PKER_GWETH( 17, 22) = 0.818171E+00 + PKER_GWETH( 17, 23) = 0.839230E+00 + PKER_GWETH( 17, 24) = 0.856891E+00 + PKER_GWETH( 17, 25) = 0.871722E+00 + PKER_GWETH( 17, 26) = 0.884193E+00 + PKER_GWETH( 17, 27) = 0.894696E+00 + PKER_GWETH( 17, 28) = 0.903554E+00 + PKER_GWETH( 17, 29) = 0.911035E+00 + PKER_GWETH( 17, 30) = 0.917361E+00 + PKER_GWETH( 17, 31) = 0.922716E+00 + PKER_GWETH( 17, 32) = 0.927254E+00 + PKER_GWETH( 17, 33) = 0.931104E+00 + PKER_GWETH( 17, 34) = 0.934371E+00 + PKER_GWETH( 17, 35) = 0.937147E+00 + PKER_GWETH( 17, 36) = 0.939507E+00 + PKER_GWETH( 17, 37) = 0.941515E+00 + PKER_GWETH( 17, 38) = 0.943223E+00 + PKER_GWETH( 17, 39) = 0.944678E+00 + PKER_GWETH( 17, 40) = 0.945917E+00 + PKER_GWETH( 18, 1) = 0.332109E+01 + PKER_GWETH( 18, 2) = 0.273146E+01 + PKER_GWETH( 18, 3) = 0.222618E+01 + PKER_GWETH( 18, 4) = 0.179314E+01 + PKER_GWETH( 18, 5) = 0.142219E+01 + PKER_GWETH( 18, 6) = 0.110525E+01 + PKER_GWETH( 18, 7) = 0.836701E+00 + PKER_GWETH( 18, 8) = 0.614031E+00 + PKER_GWETH( 18, 9) = 0.438335E+00 + PKER_GWETH( 18, 10) = 0.313497E+00 + PKER_GWETH( 18, 11) = 0.243130E+00 + PKER_GWETH( 18, 12) = 0.225766E+00 + PKER_GWETH( 18, 13) = 0.251859E+00 + PKER_GWETH( 18, 14) = 0.305663E+00 + PKER_GWETH( 18, 15) = 0.370929E+00 + PKER_GWETH( 18, 16) = 0.435996E+00 + PKER_GWETH( 18, 17) = 0.494970E+00 + PKER_GWETH( 18, 18) = 0.546059E+00 + PKER_GWETH( 18, 19) = 0.589452E+00 + PKER_GWETH( 18, 20) = 0.626000E+00 + PKER_GWETH( 18, 21) = 0.656670E+00 + PKER_GWETH( 18, 22) = 0.682367E+00 + PKER_GWETH( 18, 23) = 0.703888E+00 + PKER_GWETH( 18, 24) = 0.721919E+00 + PKER_GWETH( 18, 25) = 0.737041E+00 + PKER_GWETH( 18, 26) = 0.749739E+00 + PKER_GWETH( 18, 27) = 0.760417E+00 + PKER_GWETH( 18, 28) = 0.769409E+00 + PKER_GWETH( 18, 29) = 0.776992E+00 + PKER_GWETH( 18, 30) = 0.783397E+00 + PKER_GWETH( 18, 31) = 0.788812E+00 + PKER_GWETH( 18, 32) = 0.793397E+00 + PKER_GWETH( 18, 33) = 0.797281E+00 + PKER_GWETH( 18, 34) = 0.800576E+00 + PKER_GWETH( 18, 35) = 0.803373E+00 + PKER_GWETH( 18, 36) = 0.805750E+00 + PKER_GWETH( 18, 37) = 0.807770E+00 + PKER_GWETH( 18, 38) = 0.809488E+00 + PKER_GWETH( 18, 39) = 0.810950E+00 + PKER_GWETH( 18, 40) = 0.812195E+00 + PKER_GWETH( 19, 1) = 0.342781E+01 + PKER_GWETH( 19, 2) = 0.283888E+01 + PKER_GWETH( 19, 3) = 0.233434E+01 + PKER_GWETH( 19, 4) = 0.190199E+01 + PKER_GWETH( 19, 5) = 0.153145E+01 + PKER_GWETH( 19, 6) = 0.121405E+01 + PKER_GWETH( 19, 7) = 0.942909E+00 + PKER_GWETH( 19, 8) = 0.713251E+00 + PKER_GWETH( 19, 9) = 0.522990E+00 + PKER_GWETH( 19, 10) = 0.373179E+00 + PKER_GWETH( 19, 11) = 0.267136E+00 + PKER_GWETH( 19, 12) = 0.207939E+00 + PKER_GWETH( 19, 13) = 0.194168E+00 + PKER_GWETH( 19, 14) = 0.217411E+00 + PKER_GWETH( 19, 15) = 0.264085E+00 + PKER_GWETH( 19, 16) = 0.320289E+00 + PKER_GWETH( 19, 17) = 0.376133E+00 + PKER_GWETH( 19, 18) = 0.426670E+00 + PKER_GWETH( 19, 19) = 0.470424E+00 + PKER_GWETH( 19, 20) = 0.507580E+00 + PKER_GWETH( 19, 21) = 0.538874E+00 + PKER_GWETH( 19, 22) = 0.565135E+00 + PKER_GWETH( 19, 23) = 0.587138E+00 + PKER_GWETH( 19, 24) = 0.605565E+00 + PKER_GWETH( 19, 25) = 0.621004E+00 + PKER_GWETH( 19, 26) = 0.633952E+00 + PKER_GWETH( 19, 27) = 0.644824E+00 + PKER_GWETH( 19, 28) = 0.653966E+00 + PKER_GWETH( 19, 29) = 0.661665E+00 + PKER_GWETH( 19, 30) = 0.668158E+00 + PKER_GWETH( 19, 31) = 0.673640E+00 + PKER_GWETH( 19, 32) = 0.678276E+00 + PKER_GWETH( 19, 33) = 0.682201E+00 + PKER_GWETH( 19, 34) = 0.685526E+00 + PKER_GWETH( 19, 35) = 0.688347E+00 + PKER_GWETH( 19, 36) = 0.690741E+00 + PKER_GWETH( 19, 37) = 0.692775E+00 + PKER_GWETH( 19, 38) = 0.694504E+00 + PKER_GWETH( 19, 39) = 0.695975E+00 + PKER_GWETH( 19, 40) = 0.697226E+00 + PKER_GWETH( 20, 1) = 0.351898E+01 + PKER_GWETH( 20, 2) = 0.293060E+01 + PKER_GWETH( 20, 3) = 0.242666E+01 + PKER_GWETH( 20, 4) = 0.199494E+01 + PKER_GWETH( 20, 5) = 0.162499E+01 + PKER_GWETH( 20, 6) = 0.130793E+01 + PKER_GWETH( 20, 7) = 0.103636E+01 + PKER_GWETH( 20, 8) = 0.804397E+00 + PKER_GWETH( 20, 9) = 0.607997E+00 + PKER_GWETH( 20, 10) = 0.445440E+00 + PKER_GWETH( 20, 11) = 0.317694E+00 + PKER_GWETH( 20, 12) = 0.227641E+00 + PKER_GWETH( 20, 13) = 0.177870E+00 + PKER_GWETH( 20, 14) = 0.166997E+00 + PKER_GWETH( 20, 15) = 0.187688E+00 + PKER_GWETH( 20, 16) = 0.228164E+00 + PKER_GWETH( 20, 17) = 0.276557E+00 + PKER_GWETH( 20, 18) = 0.324482E+00 + PKER_GWETH( 20, 19) = 0.367788E+00 + PKER_GWETH( 20, 20) = 0.405260E+00 + PKER_GWETH( 20, 21) = 0.437075E+00 + PKER_GWETH( 20, 22) = 0.463871E+00 + PKER_GWETH( 20, 23) = 0.486357E+00 + PKER_GWETH( 20, 24) = 0.505197E+00 + PKER_GWETH( 20, 25) = 0.520975E+00 + PKER_GWETH( 20, 26) = 0.534195E+00 + PKER_GWETH( 20, 27) = 0.545281E+00 + PKER_GWETH( 20, 28) = 0.554590E+00 + PKER_GWETH( 20, 29) = 0.562417E+00 + PKER_GWETH( 20, 30) = 0.569008E+00 + PKER_GWETH( 20, 31) = 0.574567E+00 + PKER_GWETH( 20, 32) = 0.579261E+00 + PKER_GWETH( 20, 33) = 0.583229E+00 + PKER_GWETH( 20, 34) = 0.586589E+00 + PKER_GWETH( 20, 35) = 0.589436E+00 + PKER_GWETH( 20, 36) = 0.591850E+00 + PKER_GWETH( 20, 37) = 0.593899E+00 + PKER_GWETH( 20, 38) = 0.595640E+00 + PKER_GWETH( 20, 39) = 0.597120E+00 + PKER_GWETH( 20, 40) = 0.598379E+00 + PKER_GWETH( 21, 1) = 0.359692E+01 + PKER_GWETH( 21, 2) = 0.300896E+01 + PKER_GWETH( 21, 3) = 0.250550E+01 + PKER_GWETH( 21, 4) = 0.207429E+01 + PKER_GWETH( 21, 5) = 0.170488E+01 + PKER_GWETH( 21, 6) = 0.138832E+01 + PKER_GWETH( 21, 7) = 0.111703E+01 + PKER_GWETH( 21, 8) = 0.884662E+00 + PKER_GWETH( 21, 9) = 0.686219E+00 + PKER_GWETH( 21, 10) = 0.518262E+00 + PKER_GWETH( 21, 11) = 0.379381E+00 + PKER_GWETH( 21, 12) = 0.270445E+00 + PKER_GWETH( 21, 13) = 0.194001E+00 + PKER_GWETH( 21, 14) = 0.152170E+00 + PKER_GWETH( 21, 15) = 0.143663E+00 + PKER_GWETH( 21, 16) = 0.162036E+00 + PKER_GWETH( 21, 17) = 0.197129E+00 + PKER_GWETH( 21, 18) = 0.238790E+00 + PKER_GWETH( 21, 19) = 0.279917E+00 + PKER_GWETH( 21, 20) = 0.317026E+00 + PKER_GWETH( 21, 21) = 0.349117E+00 + PKER_GWETH( 21, 22) = 0.376360E+00 + PKER_GWETH( 21, 23) = 0.399304E+00 + PKER_GWETH( 21, 24) = 0.418558E+00 + PKER_GWETH( 21, 25) = 0.434689E+00 + PKER_GWETH( 21, 26) = 0.448200E+00 + PKER_GWETH( 21, 27) = 0.459519E+00 + PKER_GWETH( 21, 28) = 0.469011E+00 + PKER_GWETH( 21, 29) = 0.476981E+00 + PKER_GWETH( 21, 30) = 0.483683E+00 + PKER_GWETH( 21, 31) = 0.489326E+00 + PKER_GWETH( 21, 32) = 0.494085E+00 + PKER_GWETH( 21, 33) = 0.498103E+00 + PKER_GWETH( 21, 34) = 0.501501E+00 + PKER_GWETH( 21, 35) = 0.504377E+00 + PKER_GWETH( 21, 36) = 0.506814E+00 + PKER_GWETH( 21, 37) = 0.508880E+00 + PKER_GWETH( 21, 38) = 0.510635E+00 + PKER_GWETH( 21, 39) = 0.512125E+00 + PKER_GWETH( 21, 40) = 0.513392E+00 + PKER_GWETH( 22, 1) = 0.366359E+01 + PKER_GWETH( 22, 2) = 0.307596E+01 + PKER_GWETH( 22, 3) = 0.257285E+01 + PKER_GWETH( 22, 4) = 0.214205E+01 + PKER_GWETH( 22, 5) = 0.177308E+01 + PKER_GWETH( 22, 6) = 0.145698E+01 + PKER_GWETH( 22, 7) = 0.118611E+01 + PKER_GWETH( 22, 8) = 0.953972E+00 + PKER_GWETH( 22, 9) = 0.755156E+00 + PKER_GWETH( 22, 10) = 0.585390E+00 + PKER_GWETH( 22, 11) = 0.441762E+00 + PKER_GWETH( 22, 12) = 0.323113E+00 + PKER_GWETH( 22, 13) = 0.230215E+00 + PKER_GWETH( 22, 14) = 0.165338E+00 + PKER_GWETH( 22, 15) = 0.130201E+00 + PKER_GWETH( 22, 16) = 0.123605E+00 + PKER_GWETH( 22, 17) = 0.139899E+00 + PKER_GWETH( 22, 18) = 0.170314E+00 + PKER_GWETH( 22, 19) = 0.206177E+00 + PKER_GWETH( 22, 20) = 0.241468E+00 + PKER_GWETH( 22, 21) = 0.273265E+00 + PKER_GWETH( 22, 22) = 0.300749E+00 + PKER_GWETH( 22, 23) = 0.324076E+00 + PKER_GWETH( 22, 24) = 0.343721E+00 + PKER_GWETH( 22, 25) = 0.360208E+00 + PKER_GWETH( 22, 26) = 0.374020E+00 + PKER_GWETH( 22, 27) = 0.385589E+00 + PKER_GWETH( 22, 28) = 0.395281E+00 + PKER_GWETH( 22, 29) = 0.403408E+00 + PKER_GWETH( 22, 30) = 0.410232E+00 + PKER_GWETH( 22, 31) = 0.415970E+00 + PKER_GWETH( 22, 32) = 0.420802E+00 + PKER_GWETH( 22, 33) = 0.424876E+00 + PKER_GWETH( 22, 34) = 0.428316E+00 + PKER_GWETH( 22, 35) = 0.431225E+00 + PKER_GWETH( 22, 36) = 0.433687E+00 + PKER_GWETH( 22, 37) = 0.435773E+00 + PKER_GWETH( 22, 38) = 0.437542E+00 + PKER_GWETH( 22, 39) = 0.439043E+00 + PKER_GWETH( 22, 40) = 0.440319E+00 + PKER_GWETH( 23, 1) = 0.372064E+01 + PKER_GWETH( 23, 2) = 0.313326E+01 + PKER_GWETH( 23, 3) = 0.263044E+01 + PKER_GWETH( 23, 4) = 0.219994E+01 + PKER_GWETH( 23, 5) = 0.183132E+01 + PKER_GWETH( 23, 6) = 0.151560E+01 + PKER_GWETH( 23, 7) = 0.124512E+01 + PKER_GWETH( 23, 8) = 0.101334E+01 + PKER_GWETH( 23, 9) = 0.814709E+00 + PKER_GWETH( 23, 10) = 0.644598E+00 + PKER_GWETH( 23, 11) = 0.499364E+00 + PKER_GWETH( 23, 12) = 0.376545E+00 + PKER_GWETH( 23, 13) = 0.275183E+00 + PKER_GWETH( 23, 14) = 0.195998E+00 + PKER_GWETH( 23, 15) = 0.140922E+00 + PKER_GWETH( 23, 16) = 0.111420E+00 + PKER_GWETH( 23, 17) = 0.106360E+00 + PKER_GWETH( 23, 18) = 0.120791E+00 + PKER_GWETH( 23, 19) = 0.147147E+00 + PKER_GWETH( 23, 20) = 0.178014E+00 + PKER_GWETH( 23, 21) = 0.208295E+00 + PKER_GWETH( 23, 22) = 0.235541E+00 + PKER_GWETH( 23, 23) = 0.259078E+00 + PKER_GWETH( 23, 24) = 0.279052E+00 + PKER_GWETH( 23, 25) = 0.295874E+00 + PKER_GWETH( 23, 26) = 0.309990E+00 + PKER_GWETH( 23, 27) = 0.321818E+00 + PKER_GWETH( 23, 28) = 0.331723E+00 + PKER_GWETH( 23, 29) = 0.340022E+00 + PKER_GWETH( 23, 30) = 0.346981E+00 + PKER_GWETH( 23, 31) = 0.352824E+00 + PKER_GWETH( 23, 32) = 0.357736E+00 + PKER_GWETH( 23, 33) = 0.361873E+00 + PKER_GWETH( 23, 34) = 0.365361E+00 + PKER_GWETH( 23, 35) = 0.368306E+00 + PKER_GWETH( 23, 36) = 0.370796E+00 + PKER_GWETH( 23, 37) = 0.372904E+00 + PKER_GWETH( 23, 38) = 0.374689E+00 + PKER_GWETH( 23, 39) = 0.376204E+00 + PKER_GWETH( 23, 40) = 0.377489E+00 + PKER_GWETH( 24, 1) = 0.376949E+01 + PKER_GWETH( 24, 2) = 0.318230E+01 + PKER_GWETH( 24, 3) = 0.267969E+01 + PKER_GWETH( 24, 4) = 0.224944E+01 + PKER_GWETH( 24, 5) = 0.188108E+01 + PKER_GWETH( 24, 6) = 0.156565E+01 + PKER_GWETH( 24, 7) = 0.129550E+01 + PKER_GWETH( 24, 8) = 0.106406E+01 + PKER_GWETH( 24, 9) = 0.865729E+00 + PKER_GWETH( 24, 10) = 0.695767E+00 + PKER_GWETH( 24, 11) = 0.550217E+00 + PKER_GWETH( 24, 12) = 0.425970E+00 + PKER_GWETH( 24, 13) = 0.320948E+00 + PKER_GWETH( 24, 14) = 0.234359E+00 + PKER_GWETH( 24, 15) = 0.166867E+00 + PKER_GWETH( 24, 16) = 0.120117E+00 + PKER_GWETH( 24, 17) = 0.953615E-01 + PKER_GWETH( 24, 18) = 0.915330E-01 + PKER_GWETH( 24, 19) = 0.104298E+00 + PKER_GWETH( 24, 20) = 0.127130E+00 + PKER_GWETH( 24, 21) = 0.153694E+00 + PKER_GWETH( 24, 22) = 0.179676E+00 + PKER_GWETH( 24, 23) = 0.203021E+00 + PKER_GWETH( 24, 24) = 0.223178E+00 + PKER_GWETH( 24, 25) = 0.240281E+00 + PKER_GWETH( 24, 26) = 0.254685E+00 + PKER_GWETH( 24, 27) = 0.266772E+00 + PKER_GWETH( 24, 28) = 0.276900E+00 + PKER_GWETH( 24, 29) = 0.285381E+00 + PKER_GWETH( 24, 30) = 0.292487E+00 + PKER_GWETH( 24, 31) = 0.298445E+00 + PKER_GWETH( 24, 32) = 0.303448E+00 + PKER_GWETH( 24, 33) = 0.307654E+00 + PKER_GWETH( 24, 34) = 0.311196E+00 + PKER_GWETH( 24, 35) = 0.314182E+00 + PKER_GWETH( 24, 36) = 0.316704E+00 + PKER_GWETH( 24, 37) = 0.318835E+00 + PKER_GWETH( 24, 38) = 0.320640E+00 + PKER_GWETH( 24, 39) = 0.322168E+00 + PKER_GWETH( 24, 40) = 0.323465E+00 + PKER_GWETH( 25, 1) = 0.381133E+01 + PKER_GWETH( 25, 2) = 0.322429E+01 + PKER_GWETH( 25, 3) = 0.272184E+01 + PKER_GWETH( 25, 4) = 0.229177E+01 + PKER_GWETH( 25, 5) = 0.192362E+01 + PKER_GWETH( 25, 6) = 0.160842E+01 + PKER_GWETH( 25, 7) = 0.133852E+01 + PKER_GWETH( 25, 8) = 0.110735E+01 + PKER_GWETH( 25, 9) = 0.909315E+00 + PKER_GWETH( 25, 10) = 0.739612E+00 + PKER_GWETH( 25, 11) = 0.594182E+00 + PKER_GWETH( 25, 12) = 0.469647E+00 + PKER_GWETH( 25, 13) = 0.363358E+00 + PKER_GWETH( 25, 14) = 0.273552E+00 + PKER_GWETH( 25, 15) = 0.199585E+00 + PKER_GWETH( 25, 16) = 0.142061E+00 + PKER_GWETH( 25, 17) = 0.102393E+00 + PKER_GWETH( 25, 18) = 0.816292E-01 + PKER_GWETH( 25, 19) = 0.787840E-01 + PKER_GWETH( 25, 20) = 0.900615E-01 + PKER_GWETH( 25, 21) = 0.109835E+00 + PKER_GWETH( 25, 22) = 0.132694E+00 + PKER_GWETH( 25, 23) = 0.154985E+00 + PKER_GWETH( 25, 24) = 0.174988E+00 + PKER_GWETH( 25, 25) = 0.192250E+00 + PKER_GWETH( 25, 26) = 0.206895E+00 + PKER_GWETH( 25, 27) = 0.219228E+00 + PKER_GWETH( 25, 28) = 0.229578E+00 + PKER_GWETH( 25, 29) = 0.238250E+00 + PKER_GWETH( 25, 30) = 0.245512E+00 + PKER_GWETH( 25, 31) = 0.251597E+00 + PKER_GWETH( 25, 32) = 0.256699E+00 + PKER_GWETH( 25, 33) = 0.260982E+00 + PKER_GWETH( 25, 34) = 0.264583E+00 + PKER_GWETH( 25, 35) = 0.267616E+00 + PKER_GWETH( 25, 36) = 0.270172E+00 + PKER_GWETH( 25, 37) = 0.272331E+00 + PKER_GWETH( 25, 38) = 0.274156E+00 + PKER_GWETH( 25, 39) = 0.275700E+00 + PKER_GWETH( 25, 40) = 0.277009E+00 + PKER_GWETH( 26, 1) = 0.384717E+01 + PKER_GWETH( 26, 2) = 0.326025E+01 + PKER_GWETH( 26, 3) = 0.275793E+01 + PKER_GWETH( 26, 4) = 0.232801E+01 + PKER_GWETH( 26, 5) = 0.196001E+01 + PKER_GWETH( 26, 6) = 0.164499E+01 + PKER_GWETH( 26, 7) = 0.137528E+01 + PKER_GWETH( 26, 8) = 0.114433E+01 + PKER_GWETH( 26, 9) = 0.946529E+00 + PKER_GWETH( 26, 10) = 0.777072E+00 + PKER_GWETH( 26, 11) = 0.631861E+00 + PKER_GWETH( 26, 12) = 0.507422E+00 + PKER_GWETH( 26, 13) = 0.400869E+00 + PKER_GWETH( 26, 14) = 0.309943E+00 + PKER_GWETH( 26, 15) = 0.233150E+00 + PKER_GWETH( 26, 16) = 0.169969E+00 + PKER_GWETH( 26, 17) = 0.120938E+00 + PKER_GWETH( 26, 18) = 0.872884E-01 + PKER_GWETH( 26, 19) = 0.698854E-01 + PKER_GWETH( 26, 20) = 0.678184E-01 + PKER_GWETH( 26, 21) = 0.777723E-01 + PKER_GWETH( 26, 22) = 0.948930E-01 + PKER_GWETH( 26, 23) = 0.114561E+00 + PKER_GWETH( 26, 24) = 0.133685E+00 + PKER_GWETH( 26, 25) = 0.150823E+00 + PKER_GWETH( 26, 26) = 0.165606E+00 + PKER_GWETH( 26, 27) = 0.178146E+00 + PKER_GWETH( 26, 28) = 0.188706E+00 + PKER_GWETH( 26, 29) = 0.197569E+00 + PKER_GWETH( 26, 30) = 0.204994E+00 + PKER_GWETH( 26, 31) = 0.211213E+00 + PKER_GWETH( 26, 32) = 0.216422E+00 + PKER_GWETH( 26, 33) = 0.220791E+00 + PKER_GWETH( 26, 34) = 0.224458E+00 + PKER_GWETH( 26, 35) = 0.227542E+00 + PKER_GWETH( 26, 36) = 0.230138E+00 + PKER_GWETH( 26, 37) = 0.232327E+00 + PKER_GWETH( 26, 38) = 0.234175E+00 + PKER_GWETH( 26, 39) = 0.235737E+00 + PKER_GWETH( 26, 40) = 0.237059E+00 + PKER_GWETH( 27, 1) = 0.387789E+01 + PKER_GWETH( 27, 2) = 0.329106E+01 + PKER_GWETH( 27, 3) = 0.278885E+01 + PKER_GWETH( 27, 4) = 0.235903E+01 + PKER_GWETH( 27, 5) = 0.199115E+01 + PKER_GWETH( 27, 6) = 0.167627E+01 + PKER_GWETH( 27, 7) = 0.140671E+01 + PKER_GWETH( 27, 8) = 0.117593E+01 + PKER_GWETH( 27, 9) = 0.978311E+00 + PKER_GWETH( 27, 10) = 0.809056E+00 + PKER_GWETH( 27, 11) = 0.664056E+00 + PKER_GWETH( 27, 12) = 0.539803E+00 + PKER_GWETH( 27, 13) = 0.433325E+00 + PKER_GWETH( 27, 14) = 0.342157E+00 + PKER_GWETH( 27, 15) = 0.264373E+00 + PKER_GWETH( 27, 16) = 0.198711E+00 + PKER_GWETH( 27, 17) = 0.144743E+00 + PKER_GWETH( 27, 18) = 0.102957E+00 + PKER_GWETH( 27, 19) = 0.744189E-01 + PKER_GWETH( 27, 20) = 0.598398E-01 + PKER_GWETH( 27, 21) = 0.583871E-01 + PKER_GWETH( 27, 22) = 0.671630E-01 + PKER_GWETH( 27, 23) = 0.819825E-01 + PKER_GWETH( 27, 24) = 0.989033E-01 + PKER_GWETH( 27, 25) = 0.115309E+00 + PKER_GWETH( 27, 26) = 0.129993E+00 + PKER_GWETH( 27, 27) = 0.142653E+00 + PKER_GWETH( 27, 28) = 0.153391E+00 + PKER_GWETH( 27, 29) = 0.162433E+00 + PKER_GWETH( 27, 30) = 0.170021E+00 + PKER_GWETH( 27, 31) = 0.176379E+00 + PKER_GWETH( 27, 32) = 0.181704E+00 + PKER_GWETH( 27, 33) = 0.186165E+00 + PKER_GWETH( 27, 34) = 0.189906E+00 + PKER_GWETH( 27, 35) = 0.193046E+00 + PKER_GWETH( 27, 36) = 0.195686E+00 + PKER_GWETH( 27, 37) = 0.197908E+00 + PKER_GWETH( 27, 38) = 0.199782E+00 + PKER_GWETH( 27, 39) = 0.201365E+00 + PKER_GWETH( 27, 40) = 0.202702E+00 + PKER_GWETH( 28, 1) = 0.390423E+01 + PKER_GWETH( 28, 2) = 0.331747E+01 + PKER_GWETH( 28, 3) = 0.281533E+01 + PKER_GWETH( 28, 4) = 0.238560E+01 + PKER_GWETH( 28, 5) = 0.201782E+01 + PKER_GWETH( 28, 6) = 0.170303E+01 + PKER_GWETH( 28, 7) = 0.143359E+01 + PKER_GWETH( 28, 8) = 0.120294E+01 + PKER_GWETH( 28, 9) = 0.100547E+01 + PKER_GWETH( 28, 10) = 0.836373E+00 + PKER_GWETH( 28, 11) = 0.691546E+00 + PKER_GWETH( 28, 12) = 0.567472E+00 + PKER_GWETH( 28, 13) = 0.461152E+00 + PKER_GWETH( 28, 14) = 0.370043E+00 + PKER_GWETH( 28, 15) = 0.292039E+00 + PKER_GWETH( 28, 16) = 0.225499E+00 + PKER_GWETH( 28, 17) = 0.169354E+00 + PKER_GWETH( 28, 18) = 0.123260E+00 + PKER_GWETH( 28, 19) = 0.876511E-01 + PKER_GWETH( 28, 20) = 0.634500E-01 + PKER_GWETH( 28, 21) = 0.512448E-01 + PKER_GWETH( 28, 22) = 0.502738E-01 + PKER_GWETH( 28, 23) = 0.580041E-01 + PKER_GWETH( 28, 24) = 0.708282E-01 + PKER_GWETH( 28, 25) = 0.853839E-01 + PKER_GWETH( 28, 26) = 0.994571E-01 + PKER_GWETH( 28, 27) = 0.112038E+00 + PKER_GWETH( 28, 28) = 0.122879E+00 + PKER_GWETH( 28, 29) = 0.132074E+00 + PKER_GWETH( 28, 30) = 0.139816E+00 + PKER_GWETH( 28, 31) = 0.146314E+00 + PKER_GWETH( 28, 32) = 0.151758E+00 + PKER_GWETH( 28, 33) = 0.156318E+00 + PKER_GWETH( 28, 34) = 0.160137E+00 + PKER_GWETH( 28, 35) = 0.163340E+00 + PKER_GWETH( 28, 36) = 0.166029E+00 + PKER_GWETH( 28, 37) = 0.168289E+00 + PKER_GWETH( 28, 38) = 0.170192E+00 + PKER_GWETH( 28, 39) = 0.171797E+00 + PKER_GWETH( 28, 40) = 0.173151E+00 + PKER_GWETH( 29, 1) = 0.392682E+01 + PKER_GWETH( 29, 2) = 0.334011E+01 + PKER_GWETH( 29, 3) = 0.283803E+01 + PKER_GWETH( 29, 4) = 0.240837E+01 + PKER_GWETH( 29, 5) = 0.204066E+01 + PKER_GWETH( 29, 6) = 0.172596E+01 + PKER_GWETH( 29, 7) = 0.145660E+01 + PKER_GWETH( 29, 8) = 0.122605E+01 + PKER_GWETH( 29, 9) = 0.102869E+01 + PKER_GWETH( 29, 10) = 0.859716E+00 + PKER_GWETH( 29, 11) = 0.715025E+00 + PKER_GWETH( 29, 12) = 0.591099E+00 + PKER_GWETH( 29, 13) = 0.484932E+00 + PKER_GWETH( 29, 14) = 0.393957E+00 + PKER_GWETH( 29, 15) = 0.315999E+00 + PKER_GWETH( 29, 16) = 0.249258E+00 + PKER_GWETH( 29, 17) = 0.192336E+00 + PKER_GWETH( 29, 18) = 0.144330E+00 + PKER_GWETH( 29, 19) = 0.104963E+00 + PKER_GWETH( 29, 20) = 0.746220E-01 + PKER_GWETH( 29, 21) = 0.541032E-01 + PKER_GWETH( 29, 22) = 0.438920E-01 + PKER_GWETH( 29, 23) = 0.432926E-01 + PKER_GWETH( 29, 24) = 0.500966E-01 + PKER_GWETH( 29, 25) = 0.611908E-01 + PKER_GWETH( 29, 26) = 0.737100E-01 + PKER_GWETH( 29, 27) = 0.857825E-01 + PKER_GWETH( 29, 28) = 0.965608E-01 + PKER_GWETH( 29, 29) = 0.105845E+00 + PKER_GWETH( 29, 30) = 0.113718E+00 + PKER_GWETH( 29, 31) = 0.120348E+00 + PKER_GWETH( 29, 32) = 0.125912E+00 + PKER_GWETH( 29, 33) = 0.130574E+00 + PKER_GWETH( 29, 34) = 0.134478E+00 + PKER_GWETH( 29, 35) = 0.137748E+00 + PKER_GWETH( 29, 36) = 0.140491E+00 + PKER_GWETH( 29, 37) = 0.142793E+00 + PKER_GWETH( 29, 38) = 0.144728E+00 + PKER_GWETH( 29, 39) = 0.146357E+00 + PKER_GWETH( 29, 40) = 0.147731E+00 + PKER_GWETH( 30, 1) = 0.394620E+01 + PKER_GWETH( 30, 2) = 0.335953E+01 + PKER_GWETH( 30, 3) = 0.285750E+01 + PKER_GWETH( 30, 4) = 0.242788E+01 + PKER_GWETH( 30, 5) = 0.206023E+01 + PKER_GWETH( 30, 6) = 0.174559E+01 + PKER_GWETH( 30, 7) = 0.147631E+01 + PKER_GWETH( 30, 8) = 0.124583E+01 + PKER_GWETH( 30, 9) = 0.104855E+01 + PKER_GWETH( 30, 10) = 0.879674E+00 + PKER_GWETH( 30, 11) = 0.735088E+00 + PKER_GWETH( 30, 12) = 0.611279E+00 + PKER_GWETH( 30, 13) = 0.505239E+00 + PKER_GWETH( 30, 14) = 0.414395E+00 + PKER_GWETH( 30, 15) = 0.336549E+00 + PKER_GWETH( 30, 16) = 0.269844E+00 + PKER_GWETH( 30, 17) = 0.212740E+00 + PKER_GWETH( 30, 18) = 0.164047E+00 + PKER_GWETH( 30, 19) = 0.123002E+00 + PKER_GWETH( 30, 20) = 0.893792E-01 + PKER_GWETH( 30, 21) = 0.635301E-01 + PKER_GWETH( 30, 22) = 0.461363E-01 + PKER_GWETH( 30, 23) = 0.375986E-01 + PKER_GWETH( 30, 24) = 0.372861E-01 + PKER_GWETH( 30, 25) = 0.432687E-01 + PKER_GWETH( 30, 26) = 0.528642E-01 + PKER_GWETH( 30, 27) = 0.636312E-01 + PKER_GWETH( 30, 28) = 0.739863E-01 + PKER_GWETH( 30, 29) = 0.832206E-01 + PKER_GWETH( 30, 30) = 0.911715E-01 + PKER_GWETH( 30, 31) = 0.979130E-01 + PKER_GWETH( 30, 32) = 0.103590E+00 + PKER_GWETH( 30, 33) = 0.108354E+00 + PKER_GWETH( 30, 34) = 0.112346E+00 + PKER_GWETH( 30, 35) = 0.115689E+00 + PKER_GWETH( 30, 36) = 0.118489E+00 + PKER_GWETH( 30, 37) = 0.120837E+00 + PKER_GWETH( 30, 38) = 0.122808E+00 + PKER_GWETH( 30, 39) = 0.124466E+00 + PKER_GWETH( 30, 40) = 0.125860E+00 + PKER_GWETH( 31, 1) = 0.396282E+01 + PKER_GWETH( 31, 2) = 0.337618E+01 + PKER_GWETH( 31, 3) = 0.287419E+01 + PKER_GWETH( 31, 4) = 0.244461E+01 + PKER_GWETH( 31, 5) = 0.207700E+01 + PKER_GWETH( 31, 6) = 0.176241E+01 + PKER_GWETH( 31, 7) = 0.149318E+01 + PKER_GWETH( 31, 8) = 0.126277E+01 + PKER_GWETH( 31, 9) = 0.106555E+01 + PKER_GWETH( 31, 10) = 0.896748E+00 + PKER_GWETH( 31, 11) = 0.752243E+00 + PKER_GWETH( 31, 12) = 0.628524E+00 + PKER_GWETH( 31, 13) = 0.522584E+00 + PKER_GWETH( 31, 14) = 0.431848E+00 + PKER_GWETH( 31, 15) = 0.354114E+00 + PKER_GWETH( 31, 16) = 0.287504E+00 + PKER_GWETH( 31, 17) = 0.230428E+00 + PKER_GWETH( 31, 18) = 0.181570E+00 + PKER_GWETH( 31, 19) = 0.139916E+00 + PKER_GWETH( 31, 20) = 0.104822E+00 + PKER_GWETH( 31, 21) = 0.761078E-01 + PKER_GWETH( 31, 22) = 0.540869E-01 + PKER_GWETH( 31, 23) = 0.393467E-01 + PKER_GWETH( 31, 24) = 0.322138E-01 + PKER_GWETH( 31, 25) = 0.321164E-01 + PKER_GWETH( 31, 26) = 0.373726E-01 + PKER_GWETH( 31, 27) = 0.456700E-01 + PKER_GWETH( 31, 28) = 0.549298E-01 + PKER_GWETH( 31, 29) = 0.638108E-01 + PKER_GWETH( 31, 30) = 0.717222E-01 + PKER_GWETH( 31, 31) = 0.785310E-01 + PKER_GWETH( 31, 32) = 0.843036E-01 + PKER_GWETH( 31, 33) = 0.891644E-01 + PKER_GWETH( 31, 34) = 0.932438E-01 + PKER_GWETH( 31, 35) = 0.966619E-01 + PKER_GWETH( 31, 36) = 0.995245E-01 + PKER_GWETH( 31, 37) = 0.101922E+00 + PKER_GWETH( 31, 38) = 0.103933E+00 + PKER_GWETH( 31, 39) = 0.105621E+00 + PKER_GWETH( 31, 40) = 0.107040E+00 + PKER_GWETH( 32, 1) = 0.397708E+01 + PKER_GWETH( 32, 2) = 0.339047E+01 + PKER_GWETH( 32, 3) = 0.288850E+01 + PKER_GWETH( 32, 4) = 0.245896E+01 + PKER_GWETH( 32, 5) = 0.209138E+01 + PKER_GWETH( 32, 6) = 0.177683E+01 + PKER_GWETH( 32, 7) = 0.150764E+01 + PKER_GWETH( 32, 8) = 0.127727E+01 + PKER_GWETH( 32, 9) = 0.108011E+01 + PKER_GWETH( 32, 10) = 0.911361E+00 + PKER_GWETH( 32, 11) = 0.766918E+00 + PKER_GWETH( 32, 12) = 0.643269E+00 + PKER_GWETH( 32, 13) = 0.537406E+00 + PKER_GWETH( 32, 14) = 0.446756E+00 + PKER_GWETH( 32, 15) = 0.369116E+00 + PKER_GWETH( 32, 16) = 0.302601E+00 + PKER_GWETH( 32, 17) = 0.245604E+00 + PKER_GWETH( 32, 18) = 0.196766E+00 + PKER_GWETH( 32, 19) = 0.154963E+00 + PKER_GWETH( 32, 20) = 0.119332E+00 + PKER_GWETH( 32, 21) = 0.893267E-01 + PKER_GWETH( 32, 22) = 0.648070E-01 + PKER_GWETH( 32, 23) = 0.460486E-01 + PKER_GWETH( 32, 24) = 0.335588E-01 + PKER_GWETH( 32, 25) = 0.276040E-01 + PKER_GWETH( 32, 26) = 0.276657E-01 + PKER_GWETH( 32, 27) = 0.322804E-01 + PKER_GWETH( 32, 28) = 0.394546E-01 + PKER_GWETH( 32, 29) = 0.474167E-01 + PKER_GWETH( 32, 30) = 0.550336E-01 + PKER_GWETH( 32, 31) = 0.618114E-01 + PKER_GWETH( 32, 32) = 0.676423E-01 + PKER_GWETH( 32, 33) = 0.725852E-01 + PKER_GWETH( 32, 34) = 0.767473E-01 + PKER_GWETH( 32, 35) = 0.802405E-01 + PKER_GWETH( 32, 36) = 0.831673E-01 + PKER_GWETH( 32, 37) = 0.856184E-01 + PKER_GWETH( 32, 38) = 0.876718E-01 + PKER_GWETH( 32, 39) = 0.893933E-01 + PKER_GWETH( 32, 40) = 0.908384E-01 + PKER_GWETH( 33, 1) = 0.398932E+01 + PKER_GWETH( 33, 2) = 0.340273E+01 + PKER_GWETH( 33, 3) = 0.290079E+01 + PKER_GWETH( 33, 4) = 0.247127E+01 + PKER_GWETH( 33, 5) = 0.210372E+01 + PKER_GWETH( 33, 6) = 0.178919E+01 + PKER_GWETH( 33, 7) = 0.152004E+01 + PKER_GWETH( 33, 8) = 0.128970E+01 + PKER_GWETH( 33, 9) = 0.109258E+01 + PKER_GWETH( 33, 10) = 0.923874E+00 + PKER_GWETH( 33, 11) = 0.779479E+00 + PKER_GWETH( 33, 12) = 0.655884E+00 + PKER_GWETH( 33, 13) = 0.550080E+00 + PKER_GWETH( 33, 14) = 0.459496E+00 + PKER_GWETH( 33, 15) = 0.381929E+00 + PKER_GWETH( 33, 16) = 0.315494E+00 + PKER_GWETH( 33, 17) = 0.258578E+00 + PKER_GWETH( 33, 18) = 0.209808E+00 + PKER_GWETH( 33, 19) = 0.168020E+00 + PKER_GWETH( 33, 20) = 0.132253E+00 + PKER_GWETH( 33, 21) = 0.101773E+00 + PKER_GWETH( 33, 22) = 0.761204E-01 + PKER_GWETH( 33, 23) = 0.551820E-01 + PKER_GWETH( 33, 24) = 0.392049E-01 + PKER_GWETH( 33, 25) = 0.286250E-01 + PKER_GWETH( 33, 26) = 0.236572E-01 + PKER_GWETH( 33, 27) = 0.238365E-01 + PKER_GWETH( 33, 28) = 0.278819E-01 + PKER_GWETH( 33, 29) = 0.340844E-01 + PKER_GWETH( 33, 30) = 0.409301E-01 + PKER_GWETH( 33, 31) = 0.474629E-01 + PKER_GWETH( 33, 32) = 0.532693E-01 + PKER_GWETH( 33, 33) = 0.582626E-01 + PKER_GWETH( 33, 34) = 0.624951E-01 + PKER_GWETH( 33, 35) = 0.660590E-01 + PKER_GWETH( 33, 36) = 0.690501E-01 + PKER_GWETH( 33, 37) = 0.715563E-01 + PKER_GWETH( 33, 38) = 0.736552E-01 + PKER_GWETH( 33, 39) = 0.754134E-01 + PKER_GWETH( 33, 40) = 0.768875E-01 + PKER_GWETH( 34, 1) = 0.399983E+01 + PKER_GWETH( 34, 2) = 0.341326E+01 + PKER_GWETH( 34, 3) = 0.291133E+01 + PKER_GWETH( 34, 4) = 0.248183E+01 + PKER_GWETH( 34, 5) = 0.211430E+01 + PKER_GWETH( 34, 6) = 0.179980E+01 + PKER_GWETH( 34, 7) = 0.153067E+01 + PKER_GWETH( 34, 8) = 0.130036E+01 + PKER_GWETH( 34, 9) = 0.110326E+01 + PKER_GWETH( 34, 10) = 0.934592E+00 + PKER_GWETH( 34, 11) = 0.790235E+00 + PKER_GWETH( 34, 12) = 0.666681E+00 + PKER_GWETH( 34, 13) = 0.560923E+00 + PKER_GWETH( 34, 14) = 0.470390E+00 + PKER_GWETH( 34, 15) = 0.392879E+00 + PKER_GWETH( 34, 16) = 0.326507E+00 + PKER_GWETH( 34, 17) = 0.269660E+00 + PKER_GWETH( 34, 18) = 0.220959E+00 + PKER_GWETH( 34, 19) = 0.179227E+00 + PKER_GWETH( 34, 20) = 0.143471E+00 + PKER_GWETH( 34, 21) = 0.112870E+00 + PKER_GWETH( 34, 22) = 0.867966E-01 + PKER_GWETH( 34, 23) = 0.648649E-01 + PKER_GWETH( 34, 24) = 0.469859E-01 + PKER_GWETH( 34, 25) = 0.333789E-01 + PKER_GWETH( 34, 26) = 0.244190E-01 + PKER_GWETH( 34, 27) = 0.202775E-01 + PKER_GWETH( 34, 28) = 0.205384E-01 + PKER_GWETH( 34, 29) = 0.240824E-01 + PKER_GWETH( 34, 30) = 0.294450E-01 + PKER_GWETH( 34, 31) = 0.353303E-01 + PKER_GWETH( 34, 32) = 0.409329E-01 + PKER_GWETH( 34, 33) = 0.459069E-01 + PKER_GWETH( 34, 34) = 0.501829E-01 + PKER_GWETH( 34, 35) = 0.538071E-01 + PKER_GWETH( 34, 36) = 0.568588E-01 + PKER_GWETH( 34, 37) = 0.594200E-01 + PKER_GWETH( 34, 38) = 0.615661E-01 + PKER_GWETH( 34, 39) = 0.633633E-01 + PKER_GWETH( 34, 40) = 0.648688E-01 + PKER_GWETH( 35, 1) = 0.400885E+01 + PKER_GWETH( 35, 2) = 0.342229E+01 + PKER_GWETH( 35, 3) = 0.292037E+01 + PKER_GWETH( 35, 4) = 0.249089E+01 + PKER_GWETH( 35, 5) = 0.212337E+01 + PKER_GWETH( 35, 6) = 0.180889E+01 + PKER_GWETH( 35, 7) = 0.153978E+01 + PKER_GWETH( 35, 8) = 0.130949E+01 + PKER_GWETH( 35, 9) = 0.111242E+01 + PKER_GWETH( 35, 10) = 0.943777E+00 + PKER_GWETH( 35, 11) = 0.799449E+00 + PKER_GWETH( 35, 12) = 0.675926E+00 + PKER_GWETH( 35, 13) = 0.570204E+00 + PKER_GWETH( 35, 14) = 0.479710E+00 + PKER_GWETH( 35, 15) = 0.402243E+00 + PKER_GWETH( 35, 16) = 0.335919E+00 + PKER_GWETH( 35, 17) = 0.279126E+00 + PKER_GWETH( 35, 18) = 0.230483E+00 + PKER_GWETH( 35, 19) = 0.188811E+00 + PKER_GWETH( 35, 20) = 0.153102E+00 + PKER_GWETH( 35, 21) = 0.122507E+00 + PKER_GWETH( 35, 22) = 0.963249E-01 + PKER_GWETH( 35, 23) = 0.740223E-01 + PKER_GWETH( 35, 24) = 0.552721E-01 + PKER_GWETH( 35, 25) = 0.400067E-01 + PKER_GWETH( 35, 26) = 0.284193E-01 + PKER_GWETH( 35, 27) = 0.208328E-01 + PKER_GWETH( 35, 28) = 0.173845E-01 + PKER_GWETH( 35, 29) = 0.176984E-01 + PKER_GWETH( 35, 30) = 0.208008E-01 + PKER_GWETH( 35, 31) = 0.254366E-01 + PKER_GWETH( 35, 32) = 0.304959E-01 + PKER_GWETH( 35, 33) = 0.353005E-01 + PKER_GWETH( 35, 34) = 0.395615E-01 + PKER_GWETH( 35, 35) = 0.432232E-01 + PKER_GWETH( 35, 36) = 0.463265E-01 + PKER_GWETH( 35, 37) = 0.489396E-01 + PKER_GWETH( 35, 38) = 0.511328E-01 + PKER_GWETH( 35, 39) = 0.529704E-01 + PKER_GWETH( 35, 40) = 0.545093E-01 + PKER_GWETH( 36, 1) = 0.401659E+01 + PKER_GWETH( 36, 2) = 0.343004E+01 + PKER_GWETH( 36, 3) = 0.292814E+01 + PKER_GWETH( 36, 4) = 0.249866E+01 + PKER_GWETH( 36, 5) = 0.213116E+01 + PKER_GWETH( 36, 6) = 0.181669E+01 + PKER_GWETH( 36, 7) = 0.154760E+01 + PKER_GWETH( 36, 8) = 0.131733E+01 + PKER_GWETH( 36, 9) = 0.112028E+01 + PKER_GWETH( 36, 10) = 0.951650E+00 + PKER_GWETH( 36, 11) = 0.807344E+00 + PKER_GWETH( 36, 12) = 0.683846E+00 + PKER_GWETH( 36, 13) = 0.578151E+00 + PKER_GWETH( 36, 14) = 0.487687E+00 + PKER_GWETH( 36, 15) = 0.410254E+00 + PKER_GWETH( 36, 16) = 0.343967E+00 + PKER_GWETH( 36, 17) = 0.287216E+00 + PKER_GWETH( 36, 18) = 0.238619E+00 + PKER_GWETH( 36, 19) = 0.196997E+00 + PKER_GWETH( 36, 20) = 0.161339E+00 + PKER_GWETH( 36, 21) = 0.130784E+00 + PKER_GWETH( 36, 22) = 0.104605E+00 + PKER_GWETH( 36, 23) = 0.822039E-01 + PKER_GWETH( 36, 24) = 0.631264E-01 + PKER_GWETH( 36, 25) = 0.470971E-01 + PKER_GWETH( 36, 26) = 0.340633E-01 + PKER_GWETH( 36, 27) = 0.241971E-01 + PKER_GWETH( 36, 28) = 0.177747E-01 + PKER_GWETH( 36, 29) = 0.149054E-01 + PKER_GWETH( 36, 30) = 0.152534E-01 + PKER_GWETH( 36, 31) = 0.179676E-01 + PKER_GWETH( 36, 32) = 0.219736E-01 + PKER_GWETH( 36, 33) = 0.263223E-01 + PKER_GWETH( 36, 34) = 0.304424E-01 + PKER_GWETH( 36, 35) = 0.340925E-01 + PKER_GWETH( 36, 36) = 0.372283E-01 + PKER_GWETH( 36, 37) = 0.398856E-01 + PKER_GWETH( 36, 38) = 0.421231E-01 + PKER_GWETH( 36, 39) = 0.440011E-01 + PKER_GWETH( 36, 40) = 0.455746E-01 + PKER_GWETH( 37, 1) = 0.402324E+01 + PKER_GWETH( 37, 2) = 0.343670E+01 + PKER_GWETH( 37, 3) = 0.293480E+01 + PKER_GWETH( 37, 4) = 0.250534E+01 + PKER_GWETH( 37, 5) = 0.213785E+01 + PKER_GWETH( 37, 6) = 0.182339E+01 + PKER_GWETH( 37, 7) = 0.155431E+01 + PKER_GWETH( 37, 8) = 0.132405E+01 + PKER_GWETH( 37, 9) = 0.112701E+01 + PKER_GWETH( 37, 10) = 0.958401E+00 + PKER_GWETH( 37, 11) = 0.814112E+00 + PKER_GWETH( 37, 12) = 0.690632E+00 + PKER_GWETH( 37, 13) = 0.584959E+00 + PKER_GWETH( 37, 14) = 0.494518E+00 + PKER_GWETH( 37, 15) = 0.417111E+00 + PKER_GWETH( 37, 16) = 0.350853E+00 + PKER_GWETH( 37, 17) = 0.294134E+00 + PKER_GWETH( 37, 18) = 0.245573E+00 + PKER_GWETH( 37, 19) = 0.203990E+00 + PKER_GWETH( 37, 20) = 0.168374E+00 + PKER_GWETH( 37, 21) = 0.137863E+00 + PKER_GWETH( 37, 22) = 0.111718E+00 + PKER_GWETH( 37, 23) = 0.893180E-01 + PKER_GWETH( 37, 24) = 0.701520E-01 + PKER_GWETH( 37, 25) = 0.538333E-01 + PKER_GWETH( 37, 26) = 0.401301E-01 + PKER_GWETH( 37, 27) = 0.290025E-01 + PKER_GWETH( 37, 28) = 0.206023E-01 + PKER_GWETH( 37, 29) = 0.151665E-01 + PKER_GWETH( 37, 30) = 0.127824E-01 + PKER_GWETH( 37, 31) = 0.131471E-01 + PKER_GWETH( 37, 32) = 0.155224E-01 + PKER_GWETH( 37, 33) = 0.189819E-01 + PKER_GWETH( 37, 34) = 0.227194E-01 + PKER_GWETH( 37, 35) = 0.262523E-01 + PKER_GWETH( 37, 36) = 0.293792E-01 + PKER_GWETH( 37, 37) = 0.320645E-01 + PKER_GWETH( 37, 38) = 0.343398E-01 + PKER_GWETH( 37, 39) = 0.362558E-01 + PKER_GWETH( 37, 40) = 0.378639E-01 + PKER_GWETH( 38, 1) = 0.402895E+01 + PKER_GWETH( 38, 2) = 0.344242E+01 + PKER_GWETH( 38, 3) = 0.294053E+01 + PKER_GWETH( 38, 4) = 0.251107E+01 + PKER_GWETH( 38, 5) = 0.214359E+01 + PKER_GWETH( 38, 6) = 0.182914E+01 + PKER_GWETH( 38, 7) = 0.156006E+01 + PKER_GWETH( 38, 8) = 0.132981E+01 + PKER_GWETH( 38, 9) = 0.113279E+01 + PKER_GWETH( 38, 10) = 0.964190E+00 + PKER_GWETH( 38, 11) = 0.819914E+00 + PKER_GWETH( 38, 12) = 0.696450E+00 + PKER_GWETH( 38, 13) = 0.590792E+00 + PKER_GWETH( 38, 14) = 0.500370E+00 + PKER_GWETH( 38, 15) = 0.422983E+00 + PKER_GWETH( 38, 16) = 0.356747E+00 + PKER_GWETH( 38, 17) = 0.300052E+00 + PKER_GWETH( 38, 18) = 0.251519E+00 + PKER_GWETH( 38, 19) = 0.209967E+00 + PKER_GWETH( 38, 20) = 0.174385E+00 + PKER_GWETH( 38, 21) = 0.143910E+00 + PKER_GWETH( 38, 22) = 0.117802E+00 + PKER_GWETH( 38, 23) = 0.954303E-01 + PKER_GWETH( 38, 24) = 0.762638E-01 + PKER_GWETH( 38, 25) = 0.598658E-01 + PKER_GWETH( 38, 26) = 0.459071E-01 + PKER_GWETH( 38, 27) = 0.341928E-01 + PKER_GWETH( 38, 28) = 0.246931E-01 + PKER_GWETH( 38, 29) = 0.175423E-01 + PKER_GWETH( 38, 30) = 0.129417E-01 + PKER_GWETH( 38, 31) = 0.109632E-01 + PKER_GWETH( 38, 32) = 0.113331E-01 + PKER_GWETH( 38, 33) = 0.134114E-01 + PKER_GWETH( 38, 34) = 0.163971E-01 + PKER_GWETH( 38, 35) = 0.196092E-01 + PKER_GWETH( 38, 36) = 0.226384E-01 + PKER_GWETH( 38, 37) = 0.253171E-01 + PKER_GWETH( 38, 38) = 0.276166E-01 + PKER_GWETH( 38, 39) = 0.295649E-01 + PKER_GWETH( 38, 40) = 0.312055E-01 + PKER_GWETH( 39, 1) = 0.403386E+01 + PKER_GWETH( 39, 2) = 0.344733E+01 + PKER_GWETH( 39, 3) = 0.294544E+01 + PKER_GWETH( 39, 4) = 0.251599E+01 + PKER_GWETH( 39, 5) = 0.214851E+01 + PKER_GWETH( 39, 6) = 0.183407E+01 + PKER_GWETH( 39, 7) = 0.156500E+01 + PKER_GWETH( 39, 8) = 0.133476E+01 + PKER_GWETH( 39, 9) = 0.113775E+01 + PKER_GWETH( 39, 10) = 0.969156E+00 + PKER_GWETH( 39, 11) = 0.824891E+00 + PKER_GWETH( 39, 12) = 0.701438E+00 + PKER_GWETH( 39, 13) = 0.595793E+00 + PKER_GWETH( 39, 14) = 0.505385E+00 + PKER_GWETH( 39, 15) = 0.428013E+00 + PKER_GWETH( 39, 16) = 0.361794E+00 + PKER_GWETH( 39, 17) = 0.305119E+00 + PKER_GWETH( 39, 18) = 0.256606E+00 + PKER_GWETH( 39, 19) = 0.215077E+00 + PKER_GWETH( 39, 20) = 0.179522E+00 + PKER_GWETH( 39, 21) = 0.149076E+00 + PKER_GWETH( 39, 22) = 0.122999E+00 + PKER_GWETH( 39, 23) = 0.100659E+00 + PKER_GWETH( 39, 24) = 0.815164E-01 + PKER_GWETH( 39, 25) = 0.651166E-01 + PKER_GWETH( 39, 26) = 0.510868E-01 + PKER_GWETH( 39, 27) = 0.391471E-01 + PKER_GWETH( 39, 28) = 0.291332E-01 + PKER_GWETH( 39, 29) = 0.210237E-01 + PKER_GWETH( 39, 30) = 0.149369E-01 + PKER_GWETH( 39, 31) = 0.110445E-01 + PKER_GWETH( 39, 32) = 0.940454E-02 + PKER_GWETH( 39, 33) = 0.977022E-02 + PKER_GWETH( 39, 34) = 0.115877E-01 + PKER_GWETH( 39, 35) = 0.141642E-01 + PKER_GWETH( 39, 36) = 0.169244E-01 + PKER_GWETH( 39, 37) = 0.195216E-01 + PKER_GWETH( 39, 38) = 0.218162E-01 + PKER_GWETH( 39, 39) = 0.237854E-01 + PKER_GWETH( 39, 40) = 0.254537E-01 + PKER_GWETH( 40, 1) = 0.403807E+01 + PKER_GWETH( 40, 2) = 0.345154E+01 + PKER_GWETH( 40, 3) = 0.294966E+01 + PKER_GWETH( 40, 4) = 0.252021E+01 + PKER_GWETH( 40, 5) = 0.215274E+01 + PKER_GWETH( 40, 6) = 0.183830E+01 + PKER_GWETH( 40, 7) = 0.156924E+01 + PKER_GWETH( 40, 8) = 0.133901E+01 + PKER_GWETH( 40, 9) = 0.114200E+01 + PKER_GWETH( 40, 10) = 0.973417E+00 + PKER_GWETH( 40, 11) = 0.829160E+00 + PKER_GWETH( 40, 12) = 0.705716E+00 + PKER_GWETH( 40, 13) = 0.600081E+00 + PKER_GWETH( 40, 14) = 0.509684E+00 + PKER_GWETH( 40, 15) = 0.432323E+00 + PKER_GWETH( 40, 16) = 0.366118E+00 + PKER_GWETH( 40, 17) = 0.309457E+00 + PKER_GWETH( 40, 18) = 0.260961E+00 + PKER_GWETH( 40, 19) = 0.219450E+00 + PKER_GWETH( 40, 20) = 0.183915E+00 + PKER_GWETH( 40, 21) = 0.153491E+00 + PKER_GWETH( 40, 22) = 0.127439E+00 + PKER_GWETH( 40, 23) = 0.105126E+00 + PKER_GWETH( 40, 24) = 0.860101E-01 + PKER_GWETH( 40, 25) = 0.696304E-01 + PKER_GWETH( 40, 26) = 0.555979E-01 + PKER_GWETH( 40, 27) = 0.435944E-01 + PKER_GWETH( 40, 28) = 0.333818E-01 + PKER_GWETH( 40, 29) = 0.248216E-01 + PKER_GWETH( 40, 30) = 0.178993E-01 + PKER_GWETH( 40, 31) = 0.127187E-01 + PKER_GWETH( 40, 32) = 0.942720E-02 + PKER_GWETH( 40, 33) = 0.806858E-02 + PKER_GWETH( 40, 34) = 0.842367E-02 + PKER_GWETH( 40, 35) = 0.100117E-01 + PKER_GWETH( 40, 36) = 0.122351E-01 + PKER_GWETH( 40, 37) = 0.146068E-01 + PKER_GWETH( 40, 38) = 0.168337E-01 + PKER_GWETH( 40, 39) = 0.187992E-01 + PKER_GWETH( 40, 40) = 0.204855E-01 +END IF +! +END SUBROUTINE READ_XKER_GWETH diff --git a/src/mesonh/micro/read_xker_raccs.f90 b/src/mesonh/micro/read_xker_raccs.f90 new file mode 100644 index 000000000..c7a7253cc --- /dev/null +++ b/src/mesonh/micro/read_xker_raccs.f90 @@ -0,0 +1,4950 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 init 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ########################### + MODULE MODI_READ_XKER_RACCS +! ########################### +! +INTERFACE + SUBROUTINE READ_XKER_RACCS (KACCLBDAS,KACCLBDAR,KND, & + PALPHAS,PNUS,PALPHAR,PNUR,PESR,PBS,PBR,PCS,PDS,PCR,PDR, & + PACCLBDAS_MAX,PACCLBDAR_MAX,PACCLBDAS_MIN,PACCLBDAR_MIN, & + PFDINFTY,PKER_RACCSS,PKER_RACCS,PKER_SACCRG ) +! +INTEGER, INTENT(OUT) :: KND,KACCLBDAS,KACCLBDAR +REAL, INTENT(OUT) :: PALPHAS +REAL, INTENT(OUT) :: PNUS +REAL, INTENT(OUT) :: PALPHAR +REAL, INTENT(OUT) :: PNUR +REAL, INTENT(OUT) :: PESR +REAL, INTENT(OUT) :: PBS +REAL, INTENT(OUT) :: PBR +REAL, INTENT(OUT) :: PCS +REAL, INTENT(OUT) :: PDS +REAL, INTENT(OUT) :: PCR +REAL, INTENT(OUT) :: PDR +REAL, INTENT(OUT) :: PACCLBDAS_MAX +REAL, INTENT(OUT) :: PACCLBDAR_MAX +REAL, INTENT(OUT) :: PACCLBDAS_MIN +REAL, INTENT(OUT) :: PACCLBDAR_MIN +REAL, INTENT(OUT) :: PFDINFTY +REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PKER_RACCSS +REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PKER_RACCS +REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PKER_SACCRG +! +END SUBROUTINE +! +END INTERFACE +! +END MODULE MODI_READ_XKER_RACCS +! ########################################################################## + SUBROUTINE READ_XKER_RACCS (KACCLBDAS,KACCLBDAR,KND, & + PALPHAS,PNUS,PALPHAR,PNUR,PESR,PBS,PBR,PCS,PDS,PCR,PDR, & + PACCLBDAS_MAX,PACCLBDAR_MAX,PACCLBDAS_MIN,PACCLBDAR_MIN, & + PFDINFTY,PKER_RACCSS,PKER_RACCS,PKER_SACCRG ) +! ########################################################################## +! +!!**** * * - initialize the kernels for the rain-snow accretion process +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to initialize the kernels PKER_RACCSS, +!! PKER_RACCS and PKER_SACCRG prepared from a previous run of the routine +!! INI_RAIN_ICE. The reading of the kernels is optional after checking for +!! the dimensions of the arrays. +!! +!!** METHOD +!! ------ +!! +!! +!! EXTERNAL +!! -------- +!! None +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! Book2 of documentation ( routine READ_XKER_RACCS ) +!! +!! AUTHOR +!! ------ +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original 09/04/96 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +!* 0.2 Declarations of local variables : +! +! +INTEGER, INTENT(OUT) :: KND,KACCLBDAS,KACCLBDAR +REAL, INTENT(OUT) :: PALPHAS +REAL, INTENT(OUT) :: PNUS +REAL, INTENT(OUT) :: PALPHAR +REAL, INTENT(OUT) :: PNUR +REAL, INTENT(OUT) :: PESR +REAL, INTENT(OUT) :: PBS +REAL, INTENT(OUT) :: PBR +REAL, INTENT(OUT) :: PCS +REAL, INTENT(OUT) :: PDS +REAL, INTENT(OUT) :: PCR +REAL, INTENT(OUT) :: PDR +REAL, INTENT(OUT) :: PACCLBDAS_MAX +REAL, INTENT(OUT) :: PACCLBDAR_MAX +REAL, INTENT(OUT) :: PACCLBDAS_MIN +REAL, INTENT(OUT) :: PACCLBDAR_MIN +REAL, INTENT(OUT) :: PFDINFTY +REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PKER_RACCSS +REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PKER_RACCS +REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PKER_SACCRG +! +! ################################################################### +! #INSERT HERE THE OUTPUT OF INI_RAIN_ICE IF THE KERNELS ARE UPDATED# +! ################################################################### +! +KND= 50 +KACCLBDAS= 40 +KACCLBDAR= 40 +PALPHAS= 0.100000E+01 +PNUS= 0.100000E+01 +PALPHAR= 0.100000E+01 +PNUR= 0.100000E+01 +PESR= 0.100000E+01 +PBS= 0.190000E+01 +PBR= 0.300000E+01 +PCS= 0.510000E+01 +PDS= 0.270000E+00 +PCR= 0.842000E+03 +PDR= 0.800000E+00 +PACCLBDAS_MAX= 0.500000E+06 +PACCLBDAR_MAX= 0.100000E+08 +PACCLBDAS_MIN= 0.500000E+02 +PACCLBDAR_MIN= 0.100000E+04 +PFDINFTY= 0.200000E+02 +! +IF( PRESENT(PKER_RACCSS) ) THEN + PKER_RACCSS( 1, 1) = 0.778513E+01 + PKER_RACCSS( 1, 2) = 0.611693E+01 + PKER_RACCSS( 1, 3) = 0.469673E+01 + PKER_RACCSS( 1, 4) = 0.351291E+01 + PKER_RACCSS( 1, 5) = 0.255165E+01 + PKER_RACCSS( 1, 6) = 0.180370E+01 + PKER_RACCSS( 1, 7) = 0.126294E+01 + PKER_RACCSS( 1, 8) = 0.924202E+00 + PKER_RACCSS( 1, 9) = 0.775231E+00 + PKER_RACCSS( 1, 10) = 0.787292E+00 + PKER_RACCSS( 1, 11) = 0.911536E+00 + PKER_RACCSS( 1, 12) = 0.109094E+01 + PKER_RACCSS( 1, 13) = 0.127926E+01 + PKER_RACCSS( 1, 14) = 0.145083E+01 + PKER_RACCSS( 1, 15) = 0.159745E+01 + PKER_RACCSS( 1, 16) = 0.171978E+01 + PKER_RACCSS( 1, 17) = 0.182114E+01 + PKER_RACCSS( 1, 18) = 0.190501E+01 + PKER_RACCSS( 1, 19) = 0.197441E+01 + PKER_RACCSS( 1, 20) = 0.203184E+01 + PKER_RACCSS( 1, 21) = 0.207937E+01 + PKER_RACCSS( 1, 22) = 0.211870E+01 + PKER_RACCSS( 1, 23) = 0.215125E+01 + PKER_RACCSS( 1, 24) = 0.217819E+01 + PKER_RACCSS( 1, 25) = 0.220049E+01 + PKER_RACCSS( 1, 26) = 0.221895E+01 + PKER_RACCSS( 1, 27) = 0.223423E+01 + PKER_RACCSS( 1, 28) = 0.224687E+01 + PKER_RACCSS( 1, 29) = 0.225734E+01 + PKER_RACCSS( 1, 30) = 0.226601E+01 + PKER_RACCSS( 1, 31) = 0.227318E+01 + PKER_RACCSS( 1, 32) = 0.227911E+01 + PKER_RACCSS( 1, 33) = 0.228403E+01 + PKER_RACCSS( 1, 34) = 0.228810E+01 + PKER_RACCSS( 1, 35) = 0.229146E+01 + PKER_RACCSS( 1, 36) = 0.229425E+01 + PKER_RACCSS( 1, 37) = 0.229656E+01 + PKER_RACCSS( 1, 38) = 0.229847E+01 + PKER_RACCSS( 1, 39) = 0.230005E+01 + PKER_RACCSS( 1, 40) = 0.230136E+01 + PKER_RACCSS( 2, 1) = 0.777519E+01 + PKER_RACCSS( 2, 2) = 0.620120E+01 + PKER_RACCSS( 2, 3) = 0.482130E+01 + PKER_RACCSS( 2, 4) = 0.365151E+01 + PKER_RACCSS( 2, 5) = 0.268556E+01 + PKER_RACCSS( 2, 6) = 0.191605E+01 + PKER_RACCSS( 2, 7) = 0.134047E+01 + PKER_RACCSS( 2, 8) = 0.956677E+00 + PKER_RACCSS( 2, 9) = 0.757265E+00 + PKER_RACCSS( 2, 10) = 0.720633E+00 + PKER_RACCSS( 2, 11) = 0.806882E+00 + PKER_RACCSS( 2, 12) = 0.963181E+00 + PKER_RACCSS( 2, 13) = 0.114076E+01 + PKER_RACCSS( 2, 14) = 0.130870E+01 + PKER_RACCSS( 2, 15) = 0.145451E+01 + PKER_RACCSS( 2, 16) = 0.157680E+01 + PKER_RACCSS( 2, 17) = 0.167825E+01 + PKER_RACCSS( 2, 18) = 0.176221E+01 + PKER_RACCSS( 2, 19) = 0.183168E+01 + PKER_RACCSS( 2, 20) = 0.188915E+01 + PKER_RACCSS( 2, 21) = 0.193671E+01 + PKER_RACCSS( 2, 22) = 0.197607E+01 + PKER_RACCSS( 2, 23) = 0.200864E+01 + PKER_RACCSS( 2, 24) = 0.203559E+01 + PKER_RACCSS( 2, 25) = 0.205790E+01 + PKER_RACCSS( 2, 26) = 0.207637E+01 + PKER_RACCSS( 2, 27) = 0.209165E+01 + PKER_RACCSS( 2, 28) = 0.210430E+01 + PKER_RACCSS( 2, 29) = 0.211478E+01 + PKER_RACCSS( 2, 30) = 0.212344E+01 + PKER_RACCSS( 2, 31) = 0.213062E+01 + PKER_RACCSS( 2, 32) = 0.213656E+01 + PKER_RACCSS( 2, 33) = 0.214147E+01 + PKER_RACCSS( 2, 34) = 0.214554E+01 + PKER_RACCSS( 2, 35) = 0.214891E+01 + PKER_RACCSS( 2, 36) = 0.215170E+01 + PKER_RACCSS( 2, 37) = 0.215401E+01 + PKER_RACCSS( 2, 38) = 0.215592E+01 + PKER_RACCSS( 2, 39) = 0.215750E+01 + PKER_RACCSS( 2, 40) = 0.215881E+01 + PKER_RACCSS( 3, 1) = 0.762215E+01 + PKER_RACCSS( 3, 2) = 0.621106E+01 + PKER_RACCSS( 3, 3) = 0.490698E+01 + PKER_RACCSS( 3, 4) = 0.376761E+01 + PKER_RACCSS( 3, 5) = 0.280896E+01 + PKER_RACCSS( 3, 6) = 0.202903E+01 + PKER_RACCSS( 3, 7) = 0.142689E+01 + PKER_RACCSS( 3, 8) = 0.100388E+01 + PKER_RACCSS( 3, 9) = 0.757013E+00 + PKER_RACCSS( 3, 10) = 0.673206E+00 + PKER_RACCSS( 3, 11) = 0.719335E+00 + PKER_RACCSS( 3, 12) = 0.849040E+00 + PKER_RACCSS( 3, 13) = 0.101307E+01 + PKER_RACCSS( 3, 14) = 0.117592E+01 + PKER_RACCSS( 3, 15) = 0.132041E+01 + PKER_RACCSS( 3, 16) = 0.144256E+01 + PKER_RACCSS( 3, 17) = 0.154410E+01 + PKER_RACCSS( 3, 18) = 0.162816E+01 + PKER_RACCSS( 3, 19) = 0.169770E+01 + PKER_RACCSS( 3, 20) = 0.175523E+01 + PKER_RACCSS( 3, 21) = 0.180284E+01 + PKER_RACCSS( 3, 22) = 0.184222E+01 + PKER_RACCSS( 3, 23) = 0.187482E+01 + PKER_RACCSS( 3, 24) = 0.190179E+01 + PKER_RACCSS( 3, 25) = 0.192411E+01 + PKER_RACCSS( 3, 26) = 0.194259E+01 + PKER_RACCSS( 3, 27) = 0.195788E+01 + PKER_RACCSS( 3, 28) = 0.197054E+01 + PKER_RACCSS( 3, 29) = 0.198101E+01 + PKER_RACCSS( 3, 30) = 0.198968E+01 + PKER_RACCSS( 3, 31) = 0.199686E+01 + PKER_RACCSS( 3, 32) = 0.200280E+01 + PKER_RACCSS( 3, 33) = 0.200772E+01 + PKER_RACCSS( 3, 34) = 0.201179E+01 + PKER_RACCSS( 3, 35) = 0.201516E+01 + PKER_RACCSS( 3, 36) = 0.201795E+01 + PKER_RACCSS( 3, 37) = 0.202026E+01 + PKER_RACCSS( 3, 38) = 0.202217E+01 + PKER_RACCSS( 3, 39) = 0.202375E+01 + PKER_RACCSS( 3, 40) = 0.202506E+01 + PKER_RACCSS( 4, 1) = 0.726688E+01 + PKER_RACCSS( 4, 2) = 0.610352E+01 + PKER_RACCSS( 4, 3) = 0.493154E+01 + PKER_RACCSS( 4, 4) = 0.385226E+01 + PKER_RACCSS( 4, 5) = 0.291497E+01 + PKER_RACCSS( 4, 6) = 0.213576E+01 + PKER_RACCSS( 4, 7) = 0.151726E+01 + PKER_RACCSS( 4, 8) = 0.106239E+01 + PKER_RACCSS( 4, 9) = 0.773458E+00 + PKER_RACCSS( 4, 10) = 0.643197E+00 + PKER_RACCSS( 4, 11) = 0.648455E+00 + PKER_RACCSS( 4, 12) = 0.748702E+00 + PKER_RACCSS( 4, 13) = 0.896286E+00 + PKER_RACCSS( 4, 14) = 0.105225E+01 + PKER_RACCSS( 4, 15) = 0.119469E+01 + PKER_RACCSS( 4, 16) = 0.131651E+01 + PKER_RACCSS( 4, 17) = 0.141813E+01 + PKER_RACCSS( 4, 18) = 0.150231E+01 + PKER_RACCSS( 4, 19) = 0.157195E+01 + PKER_RACCSS( 4, 20) = 0.162955E+01 + PKER_RACCSS( 4, 21) = 0.167720E+01 + PKER_RACCSS( 4, 22) = 0.171662E+01 + PKER_RACCSS( 4, 23) = 0.174924E+01 + PKER_RACCSS( 4, 24) = 0.177624E+01 + PKER_RACCSS( 4, 25) = 0.179858E+01 + PKER_RACCSS( 4, 26) = 0.181706E+01 + PKER_RACCSS( 4, 27) = 0.183237E+01 + PKER_RACCSS( 4, 28) = 0.184503E+01 + PKER_RACCSS( 4, 29) = 0.185551E+01 + PKER_RACCSS( 4, 30) = 0.186419E+01 + PKER_RACCSS( 4, 31) = 0.187137E+01 + PKER_RACCSS( 4, 32) = 0.187731E+01 + PKER_RACCSS( 4, 33) = 0.188223E+01 + PKER_RACCSS( 4, 34) = 0.188630E+01 + PKER_RACCSS( 4, 35) = 0.188967E+01 + PKER_RACCSS( 4, 36) = 0.189246E+01 + PKER_RACCSS( 4, 37) = 0.189477E+01 + PKER_RACCSS( 4, 38) = 0.189668E+01 + PKER_RACCSS( 4, 39) = 0.189826E+01 + PKER_RACCSS( 4, 40) = 0.189957E+01 + PKER_RACCSS( 5, 1) = 0.666156E+01 + PKER_RACCSS( 5, 2) = 0.583010E+01 + PKER_RACCSS( 5, 3) = 0.485991E+01 + PKER_RACCSS( 5, 4) = 0.388726E+01 + PKER_RACCSS( 5, 5) = 0.299622E+01 + PKER_RACCSS( 5, 6) = 0.223002E+01 + PKER_RACCSS( 5, 7) = 0.160523E+01 + PKER_RACCSS( 5, 8) = 0.112806E+01 + PKER_RACCSS( 5, 9) = 0.803444E+00 + PKER_RACCSS( 5, 10) = 0.630781E+00 + PKER_RACCSS( 5, 11) = 0.594728E+00 + PKER_RACCSS( 5, 12) = 0.662791E+00 + PKER_RACCSS( 5, 13) = 0.790719E+00 + PKER_RACCSS( 5, 14) = 0.937530E+00 + PKER_RACCSS( 5, 15) = 0.107695E+01 + PKER_RACCSS( 5, 16) = 0.119816E+01 + PKER_RACCSS( 5, 17) = 0.129982E+01 + PKER_RACCSS( 5, 18) = 0.138414E+01 + PKER_RACCSS( 5, 19) = 0.145388E+01 + PKER_RACCSS( 5, 20) = 0.151157E+01 + PKER_RACCSS( 5, 21) = 0.155928E+01 + PKER_RACCSS( 5, 22) = 0.159875E+01 + PKER_RACCSS( 5, 23) = 0.163140E+01 + PKER_RACCSS( 5, 24) = 0.165842E+01 + PKER_RACCSS( 5, 25) = 0.168078E+01 + PKER_RACCSS( 5, 26) = 0.169928E+01 + PKER_RACCSS( 5, 27) = 0.171459E+01 + PKER_RACCSS( 5, 28) = 0.172727E+01 + PKER_RACCSS( 5, 29) = 0.173775E+01 + PKER_RACCSS( 5, 30) = 0.174643E+01 + PKER_RACCSS( 5, 31) = 0.175362E+01 + PKER_RACCSS( 5, 32) = 0.175957E+01 + PKER_RACCSS( 5, 33) = 0.176449E+01 + PKER_RACCSS( 5, 34) = 0.176856E+01 + PKER_RACCSS( 5, 35) = 0.177193E+01 + PKER_RACCSS( 5, 36) = 0.177472E+01 + PKER_RACCSS( 5, 37) = 0.177703E+01 + PKER_RACCSS( 5, 38) = 0.177895E+01 + PKER_RACCSS( 5, 39) = 0.178053E+01 + PKER_RACCSS( 5, 40) = 0.178184E+01 + PKER_RACCSS( 6, 1) = 0.579411E+01 + PKER_RACCSS( 6, 2) = 0.535171E+01 + PKER_RACCSS( 6, 3) = 0.465234E+01 + PKER_RACCSS( 6, 4) = 0.384358E+01 + PKER_RACCSS( 6, 5) = 0.303756E+01 + PKER_RACCSS( 6, 6) = 0.230559E+01 + PKER_RACCSS( 6, 7) = 0.168583E+01 + PKER_RACCSS( 6, 8) = 0.119580E+01 + PKER_RACCSS( 6, 9) = 0.843934E+00 + PKER_RACCSS( 6, 10) = 0.633155E+00 + PKER_RACCSS( 6, 11) = 0.557339E+00 + PKER_RACCSS( 6, 12) = 0.591240E+00 + PKER_RACCSS( 6, 13) = 0.696457E+00 + PKER_RACCSS( 6, 14) = 0.831746E+00 + PKER_RACCSS( 6, 15) = 0.966879E+00 + PKER_RACCSS( 6, 16) = 0.108705E+01 + PKER_RACCSS( 6, 17) = 0.118868E+01 + PKER_RACCSS( 6, 18) = 0.127314E+01 + PKER_RACCSS( 6, 19) = 0.134302E+01 + PKER_RACCSS( 6, 20) = 0.140081E+01 + PKER_RACCSS( 6, 21) = 0.144859E+01 + PKER_RACCSS( 6, 22) = 0.148812E+01 + PKER_RACCSS( 6, 23) = 0.152081E+01 + PKER_RACCSS( 6, 24) = 0.154786E+01 + PKER_RACCSS( 6, 25) = 0.157025E+01 + PKER_RACCSS( 6, 26) = 0.158876E+01 + PKER_RACCSS( 6, 27) = 0.160409E+01 + PKER_RACCSS( 6, 28) = 0.161677E+01 + PKER_RACCSS( 6, 29) = 0.162727E+01 + PKER_RACCSS( 6, 30) = 0.163595E+01 + PKER_RACCSS( 6, 31) = 0.164314E+01 + PKER_RACCSS( 6, 32) = 0.164909E+01 + PKER_RACCSS( 6, 33) = 0.165402E+01 + PKER_RACCSS( 6, 34) = 0.165809E+01 + PKER_RACCSS( 6, 35) = 0.166147E+01 + PKER_RACCSS( 6, 36) = 0.166426E+01 + PKER_RACCSS( 6, 37) = 0.166657E+01 + PKER_RACCSS( 6, 38) = 0.166848E+01 + PKER_RACCSS( 6, 39) = 0.167007E+01 + PKER_RACCSS( 6, 40) = 0.167138E+01 + PKER_RACCSS( 7, 1) = 0.471256E+01 + PKER_RACCSS( 7, 2) = 0.465839E+01 + PKER_RACCSS( 7, 3) = 0.427722E+01 + PKER_RACCSS( 7, 4) = 0.368892E+01 + PKER_RACCSS( 7, 5) = 0.301520E+01 + PKER_RACCSS( 7, 6) = 0.234970E+01 + PKER_RACCSS( 7, 7) = 0.175327E+01 + PKER_RACCSS( 7, 8) = 0.126056E+01 + PKER_RACCSS( 7, 9) = 0.889610E+00 + PKER_RACCSS( 7, 10) = 0.648011E+00 + PKER_RACCSS( 7, 11) = 0.534534E+00 + PKER_RACCSS( 7, 12) = 0.533743E+00 + PKER_RACCSS( 7, 13) = 0.613806E+00 + PKER_RACCSS( 7, 14) = 0.735010E+00 + PKER_RACCSS( 7, 15) = 0.864301E+00 + PKER_RACCSS( 7, 16) = 0.982807E+00 + PKER_RACCSS( 7, 17) = 0.108425E+01 + PKER_RACCSS( 7, 18) = 0.116886E+01 + PKER_RACCSS( 7, 19) = 0.123890E+01 + PKER_RACCSS( 7, 20) = 0.129681E+01 + PKER_RACCSS( 7, 21) = 0.134469E+01 + PKER_RACCSS( 7, 22) = 0.138428E+01 + PKER_RACCSS( 7, 23) = 0.141702E+01 + PKER_RACCSS( 7, 24) = 0.144411E+01 + PKER_RACCSS( 7, 25) = 0.146652E+01 + PKER_RACCSS( 7, 26) = 0.148506E+01 + PKER_RACCSS( 7, 27) = 0.150040E+01 + PKER_RACCSS( 7, 28) = 0.151309E+01 + PKER_RACCSS( 7, 29) = 0.152360E+01 + PKER_RACCSS( 7, 30) = 0.153229E+01 + PKER_RACCSS( 7, 31) = 0.153949E+01 + PKER_RACCSS( 7, 32) = 0.154544E+01 + PKER_RACCSS( 7, 33) = 0.155037E+01 + PKER_RACCSS( 7, 34) = 0.155445E+01 + PKER_RACCSS( 7, 35) = 0.155782E+01 + PKER_RACCSS( 7, 36) = 0.156062E+01 + PKER_RACCSS( 7, 37) = 0.156293E+01 + PKER_RACCSS( 7, 38) = 0.156484E+01 + PKER_RACCSS( 7, 39) = 0.156643E+01 + PKER_RACCSS( 7, 40) = 0.156774E+01 + PKER_RACCSS( 8, 1) = 0.353255E+01 + PKER_RACCSS( 8, 2) = 0.378953E+01 + PKER_RACCSS( 8, 3) = 0.372636E+01 + PKER_RACCSS( 8, 4) = 0.339746E+01 + PKER_RACCSS( 8, 5) = 0.290255E+01 + PKER_RACCSS( 8, 6) = 0.234259E+01 + PKER_RACCSS( 8, 7) = 0.179670E+01 + PKER_RACCSS( 8, 8) = 0.131725E+01 + PKER_RACCSS( 8, 9) = 0.936217E+00 + PKER_RACCSS( 8, 10) = 0.670685E+00 + PKER_RACCSS( 8, 11) = 0.525055E+00 + PKER_RACCSS( 8, 12) = 0.490553E+00 + PKER_RACCSS( 8, 13) = 0.543364E+00 + PKER_RACCSS( 8, 14) = 0.647682E+00 + PKER_RACCSS( 8, 15) = 0.769109E+00 + PKER_RACCSS( 8, 16) = 0.885089E+00 + PKER_RACCSS( 8, 17) = 0.986107E+00 + PKER_RACCSS( 8, 18) = 0.107085E+01 + PKER_RACCSS( 8, 19) = 0.114108E+01 + PKER_RACCSS( 8, 20) = 0.119914E+01 + PKER_RACCSS( 8, 21) = 0.124712E+01 + PKER_RACCSS( 8, 22) = 0.128680E+01 + PKER_RACCSS( 8, 23) = 0.131960E+01 + PKER_RACCSS( 8, 24) = 0.134673E+01 + PKER_RACCSS( 8, 25) = 0.136917E+01 + PKER_RACCSS( 8, 26) = 0.138774E+01 + PKER_RACCSS( 8, 27) = 0.140310E+01 + PKER_RACCSS( 8, 28) = 0.141581E+01 + PKER_RACCSS( 8, 29) = 0.142633E+01 + PKER_RACCSS( 8, 30) = 0.143503E+01 + PKER_RACCSS( 8, 31) = 0.144223E+01 + PKER_RACCSS( 8, 32) = 0.144819E+01 + PKER_RACCSS( 8, 33) = 0.145312E+01 + PKER_RACCSS( 8, 34) = 0.145720E+01 + PKER_RACCSS( 8, 35) = 0.146058E+01 + PKER_RACCSS( 8, 36) = 0.146338E+01 + PKER_RACCSS( 8, 37) = 0.146569E+01 + PKER_RACCSS( 8, 38) = 0.146761E+01 + PKER_RACCSS( 8, 39) = 0.146919E+01 + PKER_RACCSS( 8, 40) = 0.147050E+01 + PKER_RACCSS( 9, 1) = 0.240807E+01 + PKER_RACCSS( 9, 2) = 0.283932E+01 + PKER_RACCSS( 9, 3) = 0.303178E+01 + PKER_RACCSS( 9, 4) = 0.296265E+01 + PKER_RACCSS( 9, 5) = 0.267871E+01 + PKER_RACCSS( 9, 6) = 0.226276E+01 + PKER_RACCSS( 9, 7) = 0.179979E+01 + PKER_RACCSS( 9, 8) = 0.135674E+01 + PKER_RACCSS( 9, 9) = 0.979933E+00 + PKER_RACCSS( 9, 10) = 0.698320E+00 + PKER_RACCSS( 9, 11) = 0.525242E+00 + PKER_RACCSS( 9, 12) = 0.460033E+00 + PKER_RACCSS( 9, 13) = 0.484763E+00 + PKER_RACCSS( 9, 14) = 0.569735E+00 + PKER_RACCSS( 9, 15) = 0.681283E+00 + PKER_RACCSS( 9, 16) = 0.793641E+00 + PKER_RACCSS( 9, 17) = 0.893878E+00 + PKER_RACCSS( 9, 18) = 0.978690E+00 + PKER_RACCSS( 9, 19) = 0.104914E+01 + PKER_RACCSS( 9, 20) = 0.110738E+01 + PKER_RACCSS( 9, 21) = 0.115550E+01 + PKER_RACCSS( 9, 22) = 0.119527E+01 + PKER_RACCSS( 9, 23) = 0.122815E+01 + PKER_RACCSS( 9, 24) = 0.125533E+01 + PKER_RACCSS( 9, 25) = 0.127782E+01 + PKER_RACCSS( 9, 26) = 0.129641E+01 + PKER_RACCSS( 9, 27) = 0.131179E+01 + PKER_RACCSS( 9, 28) = 0.132452E+01 + PKER_RACCSS( 9, 29) = 0.133505E+01 + PKER_RACCSS( 9, 30) = 0.134376E+01 + PKER_RACCSS( 9, 31) = 0.135097E+01 + PKER_RACCSS( 9, 32) = 0.135694E+01 + PKER_RACCSS( 9, 33) = 0.136188E+01 + PKER_RACCSS( 9, 34) = 0.136596E+01 + PKER_RACCSS( 9, 35) = 0.136934E+01 + PKER_RACCSS( 9, 36) = 0.137214E+01 + PKER_RACCSS( 9, 37) = 0.137446E+01 + PKER_RACCSS( 9, 38) = 0.137637E+01 + PKER_RACCSS( 9, 39) = 0.137796E+01 + PKER_RACCSS( 9, 40) = 0.137927E+01 + PKER_RACCSS( 10, 1) = 0.147671E+01 + PKER_RACCSS( 10, 2) = 0.193328E+01 + PKER_RACCSS( 10, 3) = 0.227014E+01 + PKER_RACCSS( 10, 4) = 0.241054E+01 + PKER_RACCSS( 10, 5) = 0.233821E+01 + PKER_RACCSS( 10, 6) = 0.209295E+01 + PKER_RACCSS( 10, 7) = 0.174482E+01 + PKER_RACCSS( 10, 8) = 0.136525E+01 + PKER_RACCSS( 10, 9) = 0.101239E+01 + PKER_RACCSS( 10, 10) = 0.726741E+00 + PKER_RACCSS( 10, 11) = 0.533079E+00 + PKER_RACCSS( 10, 12) = 0.439515E+00 + PKER_RACCSS( 10, 13) = 0.437071E+00 + PKER_RACCSS( 10, 14) = 0.501385E+00 + PKER_RACCSS( 10, 15) = 0.600980E+00 + PKER_RACCSS( 10, 16) = 0.708337E+00 + PKER_RACCSS( 10, 17) = 0.807233E+00 + PKER_RACCSS( 10, 18) = 0.892004E+00 + PKER_RACCSS( 10, 19) = 0.962681E+00 + PKER_RACCSS( 10, 20) = 0.102114E+01 + PKER_RACCSS( 10, 21) = 0.106943E+01 + PKER_RACCSS( 10, 22) = 0.110932E+01 + PKER_RACCSS( 10, 23) = 0.114228E+01 + PKER_RACCSS( 10, 24) = 0.116953E+01 + PKER_RACCSS( 10, 25) = 0.119207E+01 + PKER_RACCSS( 10, 26) = 0.121070E+01 + PKER_RACCSS( 10, 27) = 0.122611E+01 + PKER_RACCSS( 10, 28) = 0.123886E+01 + PKER_RACCSS( 10, 29) = 0.124940E+01 + PKER_RACCSS( 10, 30) = 0.125813E+01 + PKER_RACCSS( 10, 31) = 0.126535E+01 + PKER_RACCSS( 10, 32) = 0.127132E+01 + PKER_RACCSS( 10, 33) = 0.127626E+01 + PKER_RACCSS( 10, 34) = 0.128035E+01 + PKER_RACCSS( 10, 35) = 0.128374E+01 + PKER_RACCSS( 10, 36) = 0.128654E+01 + PKER_RACCSS( 10, 37) = 0.128886E+01 + PKER_RACCSS( 10, 38) = 0.129077E+01 + PKER_RACCSS( 10, 39) = 0.129236E+01 + PKER_RACCSS( 10, 40) = 0.129368E+01 + PKER_RACCSS( 11, 1) = 0.808661E+00 + PKER_RACCSS( 11, 2) = 0.118349E+01 + PKER_RACCSS( 11, 3) = 0.154344E+01 + PKER_RACCSS( 11, 4) = 0.180338E+01 + PKER_RACCSS( 11, 5) = 0.190224E+01 + PKER_RACCSS( 11, 6) = 0.182880E+01 + PKER_RACCSS( 11, 7) = 0.161765E+01 + PKER_RACCSS( 11, 8) = 0.132833E+01 + PKER_RACCSS( 11, 9) = 0.102209E+01 + PKER_RACCSS( 11, 10) = 0.749176E+00 + PKER_RACCSS( 11, 11) = 0.544780E+00 + PKER_RACCSS( 11, 12) = 0.428018E+00 + PKER_RACCSS( 11, 13) = 0.399615E+00 + PKER_RACCSS( 11, 14) = 0.442486E+00 + PKER_RACCSS( 11, 15) = 0.528291E+00 + PKER_RACCSS( 11, 16) = 0.629068E+00 + PKER_RACCSS( 11, 17) = 0.725892E+00 + PKER_RACCSS( 11, 18) = 0.810425E+00 + PKER_RACCSS( 11, 19) = 0.881336E+00 + PKER_RACCSS( 11, 20) = 0.940053E+00 + PKER_RACCSS( 11, 21) = 0.988540E+00 + PKER_RACCSS( 11, 22) = 0.102858E+01 + PKER_RACCSS( 11, 23) = 0.106165E+01 + PKER_RACCSS( 11, 24) = 0.108898E+01 + PKER_RACCSS( 11, 25) = 0.111157E+01 + PKER_RACCSS( 11, 26) = 0.113025E+01 + PKER_RACCSS( 11, 27) = 0.114569E+01 + PKER_RACCSS( 11, 28) = 0.115847E+01 + PKER_RACCSS( 11, 29) = 0.116903E+01 + PKER_RACCSS( 11, 30) = 0.117777E+01 + PKER_RACCSS( 11, 31) = 0.118500E+01 + PKER_RACCSS( 11, 32) = 0.119098E+01 + PKER_RACCSS( 11, 33) = 0.119593E+01 + PKER_RACCSS( 11, 34) = 0.120003E+01 + PKER_RACCSS( 11, 35) = 0.120342E+01 + PKER_RACCSS( 11, 36) = 0.120622E+01 + PKER_RACCSS( 11, 37) = 0.120854E+01 + PKER_RACCSS( 11, 38) = 0.121046E+01 + PKER_RACCSS( 11, 39) = 0.121205E+01 + PKER_RACCSS( 11, 40) = 0.121337E+01 + PKER_RACCSS( 12, 1) = 0.394253E+00 + PKER_RACCSS( 12, 2) = 0.646179E+00 + PKER_RACCSS( 12, 3) = 0.942558E+00 + PKER_RACCSS( 12, 4) = 0.122389E+01 + PKER_RACCSS( 12, 5) = 0.142127E+01 + PKER_RACCSS( 12, 6) = 0.148735E+01 + PKER_RACCSS( 12, 7) = 0.141473E+01 + PKER_RACCSS( 12, 8) = 0.123412E+01 + PKER_RACCSS( 12, 9) = 0.996999E+00 + PKER_RACCSS( 12, 10) = 0.756208E+00 + PKER_RACCSS( 12, 11) = 0.555253E+00 + PKER_RACCSS( 12, 12) = 0.422862E+00 + PKER_RACCSS( 12, 13) = 0.371247E+00 + PKER_RACCSS( 12, 14) = 0.392052E+00 + PKER_RACCSS( 12, 15) = 0.462634E+00 + PKER_RACCSS( 12, 16) = 0.555651E+00 + PKER_RACCSS( 12, 17) = 0.649618E+00 + PKER_RACCSS( 12, 18) = 0.733630E+00 + PKER_RACCSS( 12, 19) = 0.804744E+00 + PKER_RACCSS( 12, 20) = 0.863761E+00 + PKER_RACCSS( 12, 21) = 0.912491E+00 + PKER_RACCSS( 12, 22) = 0.952708E+00 + PKER_RACCSS( 12, 23) = 0.985912E+00 + PKER_RACCSS( 12, 24) = 0.101334E+01 + PKER_RACCSS( 12, 25) = 0.103600E+01 + PKER_RACCSS( 12, 26) = 0.105473E+01 + PKER_RACCSS( 12, 27) = 0.107022E+01 + PKER_RACCSS( 12, 28) = 0.108302E+01 + PKER_RACCSS( 12, 29) = 0.109361E+01 + PKER_RACCSS( 12, 30) = 0.110236E+01 + PKER_RACCSS( 12, 31) = 0.110961E+01 + PKER_RACCSS( 12, 32) = 0.111560E+01 + PKER_RACCSS( 12, 33) = 0.112056E+01 + PKER_RACCSS( 12, 34) = 0.112466E+01 + PKER_RACCSS( 12, 35) = 0.112805E+01 + PKER_RACCSS( 12, 36) = 0.113086E+01 + PKER_RACCSS( 12, 37) = 0.113319E+01 + PKER_RACCSS( 12, 38) = 0.113511E+01 + PKER_RACCSS( 12, 39) = 0.113670E+01 + PKER_RACCSS( 12, 40) = 0.113802E+01 + PKER_RACCSS( 13, 1) = 0.171360E+00 + PKER_RACCSS( 13, 2) = 0.313975E+00 + PKER_RACCSS( 13, 3) = 0.512870E+00 + PKER_RACCSS( 13, 4) = 0.744995E+00 + PKER_RACCSS( 13, 5) = 0.962081E+00 + PKER_RACCSS( 13, 6) = 0.110931E+01 + PKER_RACCSS( 13, 7) = 0.114976E+01 + PKER_RACCSS( 13, 8) = 0.107985E+01 + PKER_RACCSS( 13, 9) = 0.927521E+00 + PKER_RACCSS( 13, 10) = 0.737617E+00 + PKER_RACCSS( 13, 11) = 0.556237E+00 + PKER_RACCSS( 13, 12) = 0.420066E+00 + PKER_RACCSS( 13, 13) = 0.350230E+00 + PKER_RACCSS( 13, 14) = 0.349906E+00 + PKER_RACCSS( 13, 15) = 0.404063E+00 + PKER_RACCSS( 13, 16) = 0.487780E+00 + PKER_RACCSS( 13, 17) = 0.578111E+00 + PKER_RACCSS( 13, 18) = 0.661299E+00 + PKER_RACCSS( 13, 19) = 0.732568E+00 + PKER_RACCSS( 13, 20) = 0.791923E+00 + PKER_RACCSS( 13, 21) = 0.840945E+00 + PKER_RACCSS( 13, 22) = 0.881381E+00 + PKER_RACCSS( 13, 23) = 0.914745E+00 + PKER_RACCSS( 13, 24) = 0.942288E+00 + PKER_RACCSS( 13, 25) = 0.965037E+00 + PKER_RACCSS( 13, 26) = 0.983832E+00 + PKER_RACCSS( 13, 27) = 0.999365E+00 + PKER_RACCSS( 13, 28) = 0.101221E+01 + PKER_RACCSS( 13, 29) = 0.102282E+01 + PKER_RACCSS( 13, 30) = 0.103160E+01 + PKER_RACCSS( 13, 31) = 0.103886E+01 + PKER_RACCSS( 13, 32) = 0.104487E+01 + PKER_RACCSS( 13, 33) = 0.104983E+01 + PKER_RACCSS( 13, 34) = 0.105394E+01 + PKER_RACCSS( 13, 35) = 0.105734E+01 + PKER_RACCSS( 13, 36) = 0.106016E+01 + PKER_RACCSS( 13, 37) = 0.106248E+01 + PKER_RACCSS( 13, 38) = 0.106441E+01 + PKER_RACCSS( 13, 39) = 0.106600E+01 + PKER_RACCSS( 13, 40) = 0.106732E+01 + PKER_RACCSS( 14, 1) = 0.880495E-01 + PKER_RACCSS( 14, 2) = 0.175611E+00 + PKER_RACCSS( 14, 3) = 0.247975E+00 + PKER_RACCSS( 14, 4) = 0.403566E+00 + PKER_RACCSS( 14, 5) = 0.583307E+00 + PKER_RACCSS( 14, 6) = 0.748280E+00 + PKER_RACCSS( 14, 7) = 0.855344E+00 + PKER_RACCSS( 14, 8) = 0.876333E+00 + PKER_RACCSS( 14, 9) = 0.811263E+00 + PKER_RACCSS( 14, 10) = 0.685718E+00 + PKER_RACCSS( 14, 11) = 0.539707E+00 + PKER_RACCSS( 14, 12) = 0.412364E+00 + PKER_RACCSS( 14, 13) = 0.333785E+00 + PKER_RACCSS( 14, 14) = 0.315877E+00 + PKER_RACCSS( 14, 15) = 0.352939E+00 + PKER_RACCSS( 14, 16) = 0.425537E+00 + PKER_RACCSS( 14, 17) = 0.511002E+00 + PKER_RACCSS( 14, 18) = 0.593027E+00 + PKER_RACCSS( 14, 19) = 0.664451E+00 + PKER_RACCSS( 14, 20) = 0.724208E+00 + PKER_RACCSS( 14, 21) = 0.773584E+00 + PKER_RACCSS( 14, 22) = 0.814286E+00 + PKER_RACCSS( 14, 23) = 0.847845E+00 + PKER_RACCSS( 14, 24) = 0.875531E+00 + PKER_RACCSS( 14, 25) = 0.898385E+00 + PKER_RACCSS( 14, 26) = 0.917258E+00 + PKER_RACCSS( 14, 27) = 0.932850E+00 + PKER_RACCSS( 14, 28) = 0.945734E+00 + PKER_RACCSS( 14, 29) = 0.956384E+00 + PKER_RACCSS( 14, 30) = 0.965189E+00 + PKER_RACCSS( 14, 31) = 0.972469E+00 + PKER_RACCSS( 14, 32) = 0.978490E+00 + PKER_RACCSS( 14, 33) = 0.983469E+00 + PKER_RACCSS( 14, 34) = 0.987588E+00 + PKER_RACCSS( 14, 35) = 0.990995E+00 + PKER_RACCSS( 14, 36) = 0.993813E+00 + PKER_RACCSS( 14, 37) = 0.996145E+00 + PKER_RACCSS( 14, 38) = 0.998074E+00 + PKER_RACCSS( 14, 39) = 0.999670E+00 + PKER_RACCSS( 14, 40) = 0.100099E+01 + PKER_RACCSS( 15, 1) = 0.315291E-01 + PKER_RACCSS( 15, 2) = 0.693241E-01 + PKER_RACCSS( 15, 3) = 0.137798E+00 + PKER_RACCSS( 15, 4) = 0.193925E+00 + PKER_RACCSS( 15, 5) = 0.314161E+00 + PKER_RACCSS( 15, 6) = 0.451226E+00 + PKER_RACCSS( 15, 7) = 0.574319E+00 + PKER_RACCSS( 15, 8) = 0.649498E+00 + PKER_RACCSS( 15, 9) = 0.656529E+00 + PKER_RACCSS( 15, 10) = 0.598237E+00 + PKER_RACCSS( 15, 11) = 0.499202E+00 + PKER_RACCSS( 15, 12) = 0.394122E+00 + PKER_RACCSS( 15, 13) = 0.316374E+00 + PKER_RACCSS( 15, 14) = 0.287121E+00 + PKER_RACCSS( 15, 15) = 0.308960E+00 + PKER_RACCSS( 15, 16) = 0.369539E+00 + PKER_RACCSS( 15, 17) = 0.448627E+00 + PKER_RACCSS( 15, 18) = 0.528619E+00 + PKER_RACCSS( 15, 19) = 0.600043E+00 + PKER_RACCSS( 15, 20) = 0.660278E+00 + PKER_RACCSS( 15, 21) = 0.710095E+00 + PKER_RACCSS( 15, 22) = 0.751124E+00 + PKER_RACCSS( 15, 23) = 0.784920E+00 + PKER_RACCSS( 15, 24) = 0.812780E+00 + PKER_RACCSS( 15, 25) = 0.835762E+00 + PKER_RACCSS( 15, 26) = 0.854730E+00 + PKER_RACCSS( 15, 27) = 0.870393E+00 + PKER_RACCSS( 15, 28) = 0.883331E+00 + PKER_RACCSS( 15, 29) = 0.894022E+00 + PKER_RACCSS( 15, 30) = 0.902857E+00 + PKER_RACCSS( 15, 31) = 0.910161E+00 + PKER_RACCSS( 15, 32) = 0.916200E+00 + PKER_RACCSS( 15, 33) = 0.921193E+00 + PKER_RACCSS( 15, 34) = 0.925323E+00 + PKER_RACCSS( 15, 35) = 0.928738E+00 + PKER_RACCSS( 15, 36) = 0.931563E+00 + PKER_RACCSS( 15, 37) = 0.933900E+00 + PKER_RACCSS( 15, 38) = 0.935833E+00 + PKER_RACCSS( 15, 39) = 0.937432E+00 + PKER_RACCSS( 15, 40) = 0.938755E+00 + PKER_RACCSS( 16, 1) = 0.360358E+01 + PKER_RACCSS( 16, 2) = 0.281969E+01 + PKER_RACCSS( 16, 3) = 0.219170E+01 + PKER_RACCSS( 16, 4) = 0.170588E+01 + PKER_RACCSS( 16, 5) = 0.135069E+01 + PKER_RACCSS( 16, 6) = 0.110996E+01 + PKER_RACCSS( 16, 7) = 0.957328E+00 + PKER_RACCSS( 16, 8) = 0.855867E+00 + PKER_RACCSS( 16, 9) = 0.767727E+00 + PKER_RACCSS( 16, 10) = 0.667811E+00 + PKER_RACCSS( 16, 11) = 0.551774E+00 + PKER_RACCSS( 16, 12) = 0.434001E+00 + PKER_RACCSS( 16, 13) = 0.338225E+00 + PKER_RACCSS( 16, 14) = 0.285601E+00 + PKER_RACCSS( 16, 15) = 0.284136E+00 + PKER_RACCSS( 16, 16) = 0.326430E+00 + PKER_RACCSS( 16, 17) = 0.394397E+00 + PKER_RACCSS( 16, 18) = 0.469502E+00 + PKER_RACCSS( 16, 19) = 0.539605E+00 + PKER_RACCSS( 16, 20) = 0.599949E+00 + PKER_RACCSS( 16, 21) = 0.650193E+00 + PKER_RACCSS( 16, 22) = 0.691608E+00 + PKER_RACCSS( 16, 23) = 0.725693E+00 + PKER_RACCSS( 16, 24) = 0.753765E+00 + PKER_RACCSS( 16, 25) = 0.776902E+00 + PKER_RACCSS( 16, 26) = 0.795985E+00 + PKER_RACCSS( 16, 27) = 0.811734E+00 + PKER_RACCSS( 16, 28) = 0.824737E+00 + PKER_RACCSS( 16, 29) = 0.835476E+00 + PKER_RACCSS( 16, 30) = 0.844348E+00 + PKER_RACCSS( 16, 31) = 0.851681E+00 + PKER_RACCSS( 16, 32) = 0.857741E+00 + PKER_RACCSS( 16, 33) = 0.862751E+00 + PKER_RACCSS( 16, 34) = 0.866894E+00 + PKER_RACCSS( 16, 35) = 0.870319E+00 + PKER_RACCSS( 16, 36) = 0.873152E+00 + PKER_RACCSS( 16, 37) = 0.875495E+00 + PKER_RACCSS( 16, 38) = 0.877433E+00 + PKER_RACCSS( 16, 39) = 0.879036E+00 + PKER_RACCSS( 16, 40) = 0.880362E+00 + PKER_RACCSS( 17, 1) = 0.472676E+01 + PKER_RACCSS( 17, 2) = 0.370797E+01 + PKER_RACCSS( 17, 3) = 0.231793E+01 + PKER_RACCSS( 17, 4) = 0.179758E+01 + PKER_RACCSS( 17, 5) = 0.139358E+01 + PKER_RACCSS( 17, 6) = 0.109574E+01 + PKER_RACCSS( 17, 7) = 0.890250E+00 + PKER_RACCSS( 17, 8) = 0.755210E+00 + PKER_RACCSS( 17, 9) = 0.661386E+00 + PKER_RACCSS( 17, 10) = 0.579824E+00 + PKER_RACCSS( 17, 11) = 0.493157E+00 + PKER_RACCSS( 17, 12) = 0.401316E+00 + PKER_RACCSS( 17, 13) = 0.318099E+00 + PKER_RACCSS( 17, 14) = 0.264075E+00 + PKER_RACCSS( 17, 15) = 0.252206E+00 + PKER_RACCSS( 17, 16) = 0.282309E+00 + PKER_RACCSS( 17, 17) = 0.341880E+00 + PKER_RACCSS( 17, 18) = 0.413082E+00 + PKER_RACCSS( 17, 19) = 0.482222E+00 + PKER_RACCSS( 17, 20) = 0.542813E+00 + PKER_RACCSS( 17, 21) = 0.593576E+00 + PKER_RACCSS( 17, 22) = 0.635456E+00 + PKER_RACCSS( 17, 23) = 0.669894E+00 + PKER_RACCSS( 17, 24) = 0.698224E+00 + PKER_RACCSS( 17, 25) = 0.721550E+00 + PKER_RACCSS( 17, 26) = 0.740773E+00 + PKER_RACCSS( 17, 27) = 0.756626E+00 + PKER_RACCSS( 17, 28) = 0.769706E+00 + PKER_RACCSS( 17, 29) = 0.780504E+00 + PKER_RACCSS( 17, 30) = 0.789421E+00 + PKER_RACCSS( 17, 31) = 0.796788E+00 + PKER_RACCSS( 17, 32) = 0.802874E+00 + PKER_RACCSS( 17, 33) = 0.807905E+00 + PKER_RACCSS( 17, 34) = 0.812063E+00 + PKER_RACCSS( 17, 35) = 0.815500E+00 + PKER_RACCSS( 17, 36) = 0.818342E+00 + PKER_RACCSS( 17, 37) = 0.820693E+00 + PKER_RACCSS( 17, 38) = 0.822636E+00 + PKER_RACCSS( 17, 39) = 0.824244E+00 + PKER_RACCSS( 17, 40) = 0.825573E+00 + PKER_RACCSS( 18, 1) = 0.603863E+01 + PKER_RACCSS( 18, 2) = 0.389316E+01 + PKER_RACCSS( 18, 3) = 0.305031E+01 + PKER_RACCSS( 18, 4) = 0.236338E+01 + PKER_RACCSS( 18, 5) = 0.147231E+01 + PKER_RACCSS( 18, 6) = 0.113620E+01 + PKER_RACCSS( 18, 7) = 0.886115E+00 + PKER_RACCSS( 18, 8) = 0.710209E+00 + PKER_RACCSS( 18, 9) = 0.590674E+00 + PKER_RACCSS( 18, 10) = 0.504703E+00 + PKER_RACCSS( 18, 11) = 0.431038E+00 + PKER_RACCSS( 18, 12) = 0.358809E+00 + PKER_RACCSS( 18, 13) = 0.290844E+00 + PKER_RACCSS( 18, 14) = 0.240768E+00 + PKER_RACCSS( 18, 15) = 0.223220E+00 + PKER_RACCSS( 18, 16) = 0.243218E+00 + PKER_RACCSS( 18, 17) = 0.293836E+00 + PKER_RACCSS( 18, 18) = 0.360151E+00 + PKER_RACCSS( 18, 19) = 0.427795E+00 + PKER_RACCSS( 18, 20) = 0.488580E+00 + PKER_RACCSS( 18, 21) = 0.539954E+00 + PKER_RACCSS( 18, 22) = 0.582396E+00 + PKER_RACCSS( 18, 23) = 0.617263E+00 + PKER_RACCSS( 18, 24) = 0.645906E+00 + PKER_RACCSS( 18, 25) = 0.669463E+00 + PKER_RACCSS( 18, 26) = 0.688855E+00 + PKER_RACCSS( 18, 27) = 0.704834E+00 + PKER_RACCSS( 18, 28) = 0.718008E+00 + PKER_RACCSS( 18, 29) = 0.728877E+00 + PKER_RACCSS( 18, 30) = 0.737848E+00 + PKER_RACCSS( 18, 31) = 0.745255E+00 + PKER_RACCSS( 18, 32) = 0.751373E+00 + PKER_RACCSS( 18, 33) = 0.756428E+00 + PKER_RACCSS( 18, 34) = 0.760604E+00 + PKER_RACCSS( 18, 35) = 0.764056E+00 + PKER_RACCSS( 18, 36) = 0.766910E+00 + PKER_RACCSS( 18, 37) = 0.769269E+00 + PKER_RACCSS( 18, 38) = 0.771219E+00 + PKER_RACCSS( 18, 39) = 0.772832E+00 + PKER_RACCSS( 18, 40) = 0.774166E+00 + PKER_RACCSS( 19, 1) = 0.795385E+01 + PKER_RACCSS( 19, 2) = 0.638846E+01 + PKER_RACCSS( 19, 3) = 0.434595E+01 + PKER_RACCSS( 19, 4) = 0.343549E+01 + PKER_RACCSS( 19, 5) = 0.268818E+01 + PKER_RACCSS( 19, 6) = 0.208133E+01 + PKER_RACCSS( 19, 7) = 0.159740E+01 + PKER_RACCSS( 19, 8) = 0.122163E+01 + PKER_RACCSS( 19, 9) = 0.938335E+00 + PKER_RACCSS( 19, 10) = 0.728285E+00 + PKER_RACCSS( 19, 11) = 0.570145E+00 + PKER_RACCSS( 19, 12) = 0.445027E+00 + PKER_RACCSS( 19, 13) = 0.343893E+00 + PKER_RACCSS( 19, 14) = 0.268248E+00 + PKER_RACCSS( 19, 15) = 0.226350E+00 + PKER_RACCSS( 19, 16) = 0.224325E+00 + PKER_RACCSS( 19, 17) = 0.257856E+00 + PKER_RACCSS( 19, 18) = 0.313989E+00 + PKER_RACCSS( 19, 19) = 0.377472E+00 + PKER_RACCSS( 19, 20) = 0.437368E+00 + PKER_RACCSS( 19, 21) = 0.489118E+00 + PKER_RACCSS( 19, 22) = 0.532165E+00 + PKER_RACCSS( 19, 23) = 0.567544E+00 + PKER_RACCSS( 19, 24) = 0.596569E+00 + PKER_RACCSS( 19, 25) = 0.620406E+00 + PKER_RACCSS( 19, 26) = 0.640004E+00 + PKER_RACCSS( 19, 27) = 0.656135E+00 + PKER_RACCSS( 19, 28) = 0.669424E+00 + PKER_RACCSS( 19, 29) = 0.680378E+00 + PKER_RACCSS( 19, 30) = 0.689414E+00 + PKER_RACCSS( 19, 31) = 0.696870E+00 + PKER_RACCSS( 19, 32) = 0.703026E+00 + PKER_RACCSS( 19, 33) = 0.708109E+00 + PKER_RACCSS( 19, 34) = 0.712308E+00 + PKER_RACCSS( 19, 35) = 0.715777E+00 + PKER_RACCSS( 19, 36) = 0.718644E+00 + PKER_RACCSS( 19, 37) = 0.721014E+00 + PKER_RACCSS( 19, 38) = 0.722972E+00 + PKER_RACCSS( 19, 39) = 0.724592E+00 + PKER_RACCSS( 19, 40) = 0.725930E+00 + PKER_RACCSS( 20, 1) = 0.634781E+01 + PKER_RACCSS( 20, 2) = 0.508413E+01 + PKER_RACCSS( 20, 3) = 0.328893E+01 + PKER_RACCSS( 20, 4) = 0.259197E+01 + PKER_RACCSS( 20, 5) = 0.161527E+01 + PKER_RACCSS( 20, 6) = 0.125279E+01 + PKER_RACCSS( 20, 7) = 0.963381E+00 + PKER_RACCSS( 20, 8) = 0.738949E+00 + PKER_RACCSS( 20, 9) = 0.571583E+00 + PKER_RACCSS( 20, 10) = 0.451257E+00 + PKER_RACCSS( 20, 11) = 0.365125E+00 + PKER_RACCSS( 20, 12) = 0.299475E+00 + PKER_RACCSS( 20, 13) = 0.245596E+00 + PKER_RACCSS( 20, 14) = 0.203304E+00 + PKER_RACCSS( 20, 15) = 0.180537E+00 + PKER_RACCSS( 20, 16) = 0.185574E+00 + PKER_RACCSS( 20, 17) = 0.220030E+00 + PKER_RACCSS( 20, 18) = 0.275495E+00 + PKER_RACCSS( 20, 19) = 0.338734E+00 + PKER_RACCSS( 20, 20) = 0.398970E+00 + PKER_RACCSS( 20, 21) = 0.450959E+00 + PKER_RACCSS( 20, 22) = 0.493976E+00 + PKER_RACCSS( 20, 23) = 0.529200E+00 + PKER_RACCSS( 20, 24) = 0.558067E+00 + PKER_RACCSS( 20, 25) = 0.581769E+00 + PKER_RACCSS( 20, 26) = 0.601256E+00 + PKER_RACCSS( 20, 27) = 0.617297E+00 + PKER_RACCSS( 20, 28) = 0.630511E+00 + PKER_RACCSS( 20, 29) = 0.641405E+00 + PKER_RACCSS( 20, 30) = 0.650392E+00 + PKER_RACCSS( 20, 31) = 0.657810E+00 + PKER_RACCSS( 20, 32) = 0.663934E+00 + PKER_RACCSS( 20, 33) = 0.668992E+00 + PKER_RACCSS( 20, 34) = 0.673171E+00 + PKER_RACCSS( 20, 35) = 0.676624E+00 + PKER_RACCSS( 20, 36) = 0.679478E+00 + PKER_RACCSS( 20, 37) = 0.681837E+00 + PKER_RACCSS( 20, 38) = 0.683788E+00 + PKER_RACCSS( 20, 39) = 0.685401E+00 + PKER_RACCSS( 20, 40) = 0.686734E+00 + PKER_RACCSS( 21, 1) = 0.102443E+02 + PKER_RACCSS( 21, 2) = 0.752283E+01 + PKER_RACCSS( 21, 3) = 0.532770E+01 + PKER_RACCSS( 21, 4) = 0.425873E+01 + PKER_RACCSS( 21, 5) = 0.288056E+01 + PKER_RACCSS( 21, 6) = 0.226207E+01 + PKER_RACCSS( 21, 7) = 0.175652E+01 + PKER_RACCSS( 21, 8) = 0.134803E+01 + PKER_RACCSS( 21, 9) = 0.102375E+01 + PKER_RACCSS( 21, 10) = 0.771986E+00 + PKER_RACCSS( 21, 11) = 0.580680E+00 + PKER_RACCSS( 21, 12) = 0.436943E+00 + PKER_RACCSS( 21, 13) = 0.328804E+00 + PKER_RACCSS( 21, 14) = 0.249300E+00 + PKER_RACCSS( 21, 15) = 0.198560E+00 + PKER_RACCSS( 21, 16) = 0.180676E+00 + PKER_RACCSS( 21, 17) = 0.196350E+00 + PKER_RACCSS( 21, 18) = 0.238922E+00 + PKER_RACCSS( 21, 19) = 0.295536E+00 + PKER_RACCSS( 21, 20) = 0.353574E+00 + PKER_RACCSS( 21, 21) = 0.405455E+00 + PKER_RACCSS( 21, 22) = 0.448988E+00 + PKER_RACCSS( 21, 23) = 0.484753E+00 + PKER_RACCSS( 21, 24) = 0.514042E+00 + PKER_RACCSS( 21, 25) = 0.538053E+00 + PKER_RACCSS( 21, 26) = 0.557767E+00 + PKER_RACCSS( 21, 27) = 0.573974E+00 + PKER_RACCSS( 21, 28) = 0.587311E+00 + PKER_RACCSS( 21, 29) = 0.598297E+00 + PKER_RACCSS( 21, 30) = 0.607353E+00 + PKER_RACCSS( 21, 31) = 0.614822E+00 + PKER_RACCSS( 21, 32) = 0.620985E+00 + PKER_RACCSS( 21, 33) = 0.626073E+00 + PKER_RACCSS( 21, 34) = 0.630275E+00 + PKER_RACCSS( 21, 35) = 0.633746E+00 + PKER_RACCSS( 21, 36) = 0.636613E+00 + PKER_RACCSS( 21, 37) = 0.638983E+00 + PKER_RACCSS( 21, 38) = 0.640942E+00 + PKER_RACCSS( 21, 39) = 0.642561E+00 + PKER_RACCSS( 21, 40) = 0.643900E+00 + PKER_RACCSS( 22, 1) = 0.115320E+02 + PKER_RACCSS( 22, 2) = 0.885714E+01 + PKER_RACCSS( 22, 3) = 0.661944E+01 + PKER_RACCSS( 22, 4) = 0.533800E+01 + PKER_RACCSS( 22, 5) = 0.383246E+01 + PKER_RACCSS( 22, 6) = 0.304296E+01 + PKER_RACCSS( 22, 7) = 0.239235E+01 + PKER_RACCSS( 22, 8) = 0.185899E+01 + PKER_RACCSS( 22, 9) = 0.142556E+01 + PKER_RACCSS( 22, 10) = 0.107781E+01 + PKER_RACCSS( 22, 11) = 0.803526E+00 + PKER_RACCSS( 22, 12) = 0.590905E+00 + PKER_RACCSS( 22, 13) = 0.429091E+00 + PKER_RACCSS( 22, 14) = 0.309341E+00 + PKER_RACCSS( 22, 15) = 0.227914E+00 + PKER_RACCSS( 22, 16) = 0.184487E+00 + PKER_RACCSS( 22, 17) = 0.179339E+00 + PKER_RACCSS( 22, 18) = 0.207043E+00 + PKER_RACCSS( 22, 19) = 0.255369E+00 + PKER_RACCSS( 22, 20) = 0.310362E+00 + PKER_RACCSS( 22, 21) = 0.362024E+00 + PKER_RACCSS( 22, 22) = 0.406192E+00 + PKER_RACCSS( 22, 23) = 0.442617E+00 + PKER_RACCSS( 22, 24) = 0.472415E+00 + PKER_RACCSS( 22, 25) = 0.496799E+00 + PKER_RACCSS( 22, 26) = 0.516786E+00 + PKER_RACCSS( 22, 27) = 0.533194E+00 + PKER_RACCSS( 22, 28) = 0.546679E+00 + PKER_RACCSS( 22, 29) = 0.557776E+00 + PKER_RACCSS( 22, 30) = 0.566914E+00 + PKER_RACCSS( 22, 31) = 0.574445E+00 + PKER_RACCSS( 22, 32) = 0.580656E+00 + PKER_RACCSS( 22, 33) = 0.585779E+00 + PKER_RACCSS( 22, 34) = 0.590009E+00 + PKER_RACCSS( 22, 35) = 0.593501E+00 + PKER_RACCSS( 22, 36) = 0.596384E+00 + PKER_RACCSS( 22, 37) = 0.598767E+00 + PKER_RACCSS( 22, 38) = 0.600735E+00 + PKER_RACCSS( 22, 39) = 0.602362E+00 + PKER_RACCSS( 22, 40) = 0.603707E+00 + PKER_RACCSS( 23, 1) = 0.120552E+02 + PKER_RACCSS( 23, 2) = 0.943853E+01 + PKER_RACCSS( 23, 3) = 0.723099E+01 + PKER_RACCSS( 23, 4) = 0.538764E+01 + PKER_RACCSS( 23, 5) = 0.432828E+01 + PKER_RACCSS( 23, 6) = 0.309359E+01 + PKER_RACCSS( 23, 7) = 0.244279E+01 + PKER_RACCSS( 23, 8) = 0.190778E+01 + PKER_RACCSS( 23, 9) = 0.147059E+01 + PKER_RACCSS( 23, 10) = 0.111661E+01 + PKER_RACCSS( 23, 11) = 0.833900E+00 + PKER_RACCSS( 23, 12) = 0.611721E+00 + PKER_RACCSS( 23, 13) = 0.440899E+00 + PKER_RACCSS( 23, 14) = 0.313483E+00 + PKER_RACCSS( 23, 15) = 0.225201E+00 + PKER_RACCSS( 23, 16) = 0.175156E+00 + PKER_RACCSS( 23, 17) = 0.163153E+00 + PKER_RACCSS( 23, 18) = 0.185306E+00 + PKER_RACCSS( 23, 19) = 0.230283E+00 + PKER_RACCSS( 23, 20) = 0.284175E+00 + PKER_RACCSS( 23, 21) = 0.335712E+00 + PKER_RACCSS( 23, 22) = 0.379840E+00 + PKER_RACCSS( 23, 23) = 0.416119E+00 + PKER_RACCSS( 23, 24) = 0.445741E+00 + PKER_RACCSS( 23, 25) = 0.469966E+00 + PKER_RACCSS( 23, 26) = 0.489818E+00 + PKER_RACCSS( 23, 27) = 0.506111E+00 + PKER_RACCSS( 23, 28) = 0.519502E+00 + PKER_RACCSS( 23, 29) = 0.530519E+00 + PKER_RACCSS( 23, 30) = 0.539593E+00 + PKER_RACCSS( 23, 31) = 0.547072E+00 + PKER_RACCSS( 23, 32) = 0.553240E+00 + PKER_RACCSS( 23, 33) = 0.558330E+00 + PKER_RACCSS( 23, 34) = 0.562532E+00 + PKER_RACCSS( 23, 35) = 0.566002E+00 + PKER_RACCSS( 23, 36) = 0.568868E+00 + PKER_RACCSS( 23, 37) = 0.571236E+00 + PKER_RACCSS( 23, 38) = 0.573194E+00 + PKER_RACCSS( 23, 39) = 0.574812E+00 + PKER_RACCSS( 23, 40) = 0.576149E+00 + PKER_RACCSS( 24, 1) = 0.129576E+02 + PKER_RACCSS( 24, 2) = 0.102975E+02 + PKER_RACCSS( 24, 3) = 0.818920E+01 + PKER_RACCSS( 24, 4) = 0.640995E+01 + PKER_RACCSS( 24, 5) = 0.491149E+01 + PKER_RACCSS( 24, 6) = 0.394577E+01 + PKER_RACCSS( 24, 7) = 0.291637E+01 + PKER_RACCSS( 24, 8) = 0.230081E+01 + PKER_RACCSS( 24, 9) = 0.179410E+01 + PKER_RACCSS( 24, 10) = 0.137900E+01 + PKER_RACCSS( 24, 11) = 0.104163E+01 + PKER_RACCSS( 24, 12) = 0.770431E+00 + PKER_RACCSS( 24, 13) = 0.556107E+00 + PKER_RACCSS( 24, 14) = 0.391190E+00 + PKER_RACCSS( 24, 15) = 0.270786E+00 + PKER_RACCSS( 24, 16) = 0.192864E+00 + PKER_RACCSS( 24, 17) = 0.156677E+00 + PKER_RACCSS( 24, 18) = 0.159396E+00 + PKER_RACCSS( 24, 19) = 0.191937E+00 + PKER_RACCSS( 24, 20) = 0.240898E+00 + PKER_RACCSS( 24, 21) = 0.292797E+00 + PKER_RACCSS( 24, 22) = 0.339207E+00 + PKER_RACCSS( 24, 23) = 0.377404E+00 + PKER_RACCSS( 24, 24) = 0.408063E+00 + PKER_RACCSS( 24, 25) = 0.432806E+00 + PKER_RACCSS( 24, 26) = 0.452971E+00 + PKER_RACCSS( 24, 27) = 0.469485E+00 + PKER_RACCSS( 24, 28) = 0.483037E+00 + PKER_RACCSS( 24, 29) = 0.494174E+00 + PKER_RACCSS( 24, 30) = 0.503336E+00 + PKER_RACCSS( 24, 31) = 0.510880E+00 + PKER_RACCSS( 24, 32) = 0.517096E+00 + PKER_RACCSS( 24, 33) = 0.522223E+00 + PKER_RACCSS( 24, 34) = 0.526452E+00 + PKER_RACCSS( 24, 35) = 0.529943E+00 + PKER_RACCSS( 24, 36) = 0.532826E+00 + PKER_RACCSS( 24, 37) = 0.535207E+00 + PKER_RACCSS( 24, 38) = 0.537174E+00 + PKER_RACCSS( 24, 39) = 0.538799E+00 + PKER_RACCSS( 24, 40) = 0.540142E+00 + PKER_RACCSS( 25, 1) = 0.131514E+02 + PKER_RACCSS( 25, 2) = 0.106419E+02 + PKER_RACCSS( 25, 3) = 0.845868E+01 + PKER_RACCSS( 25, 4) = 0.672282E+01 + PKER_RACCSS( 25, 5) = 0.526076E+01 + PKER_RACCSS( 25, 6) = 0.423970E+01 + PKER_RACCSS( 25, 7) = 0.322433E+01 + PKER_RACCSS( 25, 8) = 0.255677E+01 + PKER_RACCSS( 25, 9) = 0.200589E+01 + PKER_RACCSS( 25, 10) = 0.155266E+01 + PKER_RACCSS( 25, 11) = 0.118171E+01 + PKER_RACCSS( 25, 12) = 0.880334E+00 + PKER_RACCSS( 25, 13) = 0.638726E+00 + PKER_RACCSS( 25, 14) = 0.449351E+00 + PKER_RACCSS( 25, 15) = 0.307558E+00 + PKER_RACCSS( 25, 16) = 0.211438E+00 + PKER_RACCSS( 25, 17) = 0.160608E+00 + PKER_RACCSS( 25, 18) = 0.152419E+00 + PKER_RACCSS( 25, 19) = 0.178285E+00 + PKER_RACCSS( 25, 20) = 0.223628E+00 + PKER_RACCSS( 25, 21) = 0.273609E+00 + PKER_RACCSS( 25, 22) = 0.318759E+00 + PKER_RACCSS( 25, 23) = 0.356134E+00 + PKER_RACCSS( 25, 24) = 0.386398E+00 + PKER_RACCSS( 25, 25) = 0.410983E+00 + PKER_RACCSS( 25, 26) = 0.431059E+00 + PKER_RACCSS( 25, 27) = 0.447500E+00 + PKER_RACCSS( 25, 28) = 0.460986E+00 + PKER_RACCSS( 25, 29) = 0.472065E+00 + PKER_RACCSS( 25, 30) = 0.481178E+00 + PKER_RACCSS( 25, 31) = 0.488681E+00 + PKER_RACCSS( 25, 32) = 0.494864E+00 + PKER_RACCSS( 25, 33) = 0.499963E+00 + PKER_RACCSS( 25, 34) = 0.504169E+00 + PKER_RACCSS( 25, 35) = 0.507642E+00 + PKER_RACCSS( 25, 36) = 0.510510E+00 + PKER_RACCSS( 25, 37) = 0.512879E+00 + PKER_RACCSS( 25, 38) = 0.514836E+00 + PKER_RACCSS( 25, 39) = 0.516454E+00 + PKER_RACCSS( 25, 40) = 0.517791E+00 + PKER_RACCSS( 26, 1) = 0.132742E+02 + PKER_RACCSS( 26, 2) = 0.108337E+02 + PKER_RACCSS( 26, 3) = 0.872586E+01 + PKER_RACCSS( 26, 4) = 0.703900E+01 + PKER_RACCSS( 26, 5) = 0.562634E+01 + PKER_RACCSS( 26, 6) = 0.444059E+01 + PKER_RACCSS( 26, 7) = 0.356562E+01 + PKER_RACCSS( 26, 8) = 0.274250E+01 + PKER_RACCSS( 26, 9) = 0.216207E+01 + PKER_RACCSS( 26, 10) = 0.168328E+01 + PKER_RACCSS( 26, 11) = 0.128971E+01 + PKER_RACCSS( 26, 12) = 0.967844E+00 + PKER_RACCSS( 26, 13) = 0.707228E+00 + PKER_RACCSS( 26, 14) = 0.499963E+00 + PKER_RACCSS( 26, 15) = 0.341292E+00 + PKER_RACCSS( 26, 16) = 0.229353E+00 + PKER_RACCSS( 26, 17) = 0.164063E+00 + PKER_RACCSS( 26, 18) = 0.143754E+00 + PKER_RACCSS( 26, 19) = 0.160834E+00 + PKER_RACCSS( 26, 20) = 0.201345E+00 + PKER_RACCSS( 26, 21) = 0.249884E+00 + PKER_RACCSS( 26, 22) = 0.295670E+00 + PKER_RACCSS( 26, 23) = 0.334320E+00 + PKER_RACCSS( 26, 24) = 0.365515E+00 + PKER_RACCSS( 26, 25) = 0.390474E+00 + PKER_RACCSS( 26, 26) = 0.410622E+00 + PKER_RACCSS( 26, 27) = 0.427051E+00 + PKER_RACCSS( 26, 28) = 0.440513E+00 + PKER_RACCSS( 26, 29) = 0.451566E+00 + PKER_RACCSS( 26, 30) = 0.460654E+00 + PKER_RACCSS( 26, 31) = 0.468135E+00 + PKER_RACCSS( 26, 32) = 0.474298E+00 + PKER_RACCSS( 26, 33) = 0.479380E+00 + PKER_RACCSS( 26, 34) = 0.483572E+00 + PKER_RACCSS( 26, 35) = 0.487033E+00 + PKER_RACCSS( 26, 36) = 0.489891E+00 + PKER_RACCSS( 26, 37) = 0.492252E+00 + PKER_RACCSS( 26, 38) = 0.494203E+00 + PKER_RACCSS( 26, 39) = 0.495815E+00 + PKER_RACCSS( 26, 40) = 0.497148E+00 + PKER_RACCSS( 27, 1) = 0.133097E+02 + PKER_RACCSS( 27, 2) = 0.109011E+02 + PKER_RACCSS( 27, 3) = 0.888269E+01 + PKER_RACCSS( 27, 4) = 0.719362E+01 + PKER_RACCSS( 27, 5) = 0.580985E+01 + PKER_RACCSS( 27, 6) = 0.465501E+01 + PKER_RACCSS( 27, 7) = 0.374781E+01 + PKER_RACCSS( 27, 8) = 0.294825E+01 + PKER_RACCSS( 27, 9) = 0.233507E+01 + PKER_RACCSS( 27, 10) = 0.182826E+01 + PKER_RACCSS( 27, 11) = 0.141027E+01 + PKER_RACCSS( 27, 12) = 0.106668E+01 + PKER_RACCSS( 27, 13) = 0.786260E+00 + PKER_RACCSS( 27, 14) = 0.560532E+00 + PKER_RACCSS( 27, 15) = 0.384455E+00 + PKER_RACCSS( 27, 16) = 0.256127E+00 + PKER_RACCSS( 27, 17) = 0.176040E+00 + PKER_RACCSS( 27, 18) = 0.143310E+00 + PKER_RACCSS( 27, 19) = 0.151524E+00 + PKER_RACCSS( 27, 20) = 0.186916E+00 + PKER_RACCSS( 27, 21) = 0.233004E+00 + PKER_RACCSS( 27, 22) = 0.277474E+00 + PKER_RACCSS( 27, 23) = 0.315252E+00 + PKER_RACCSS( 27, 24) = 0.345942E+00 + PKER_RACCSS( 27, 25) = 0.370729E+00 + PKER_RACCSS( 27, 26) = 0.390865E+00 + PKER_RACCSS( 27, 27) = 0.407311E+00 + PKER_RACCSS( 27, 28) = 0.420780E+00 + PKER_RACCSS( 27, 29) = 0.431832E+00 + PKER_RACCSS( 27, 30) = 0.440914E+00 + PKER_RACCSS( 27, 31) = 0.448386E+00 + PKER_RACCSS( 27, 32) = 0.454540E+00 + PKER_RACCSS( 27, 33) = 0.459613E+00 + PKER_RACCSS( 27, 34) = 0.463798E+00 + PKER_RACCSS( 27, 35) = 0.467251E+00 + PKER_RACCSS( 27, 36) = 0.470104E+00 + PKER_RACCSS( 27, 37) = 0.472459E+00 + PKER_RACCSS( 27, 38) = 0.474406E+00 + PKER_RACCSS( 27, 39) = 0.476015E+00 + PKER_RACCSS( 27, 40) = 0.477346E+00 + PKER_RACCSS( 28, 1) = 0.133115E+02 + PKER_RACCSS( 28, 2) = 0.109156E+02 + PKER_RACCSS( 28, 3) = 0.892137E+01 + PKER_RACCSS( 28, 4) = 0.726595E+01 + PKER_RACCSS( 28, 5) = 0.588073E+01 + PKER_RACCSS( 28, 6) = 0.474162E+01 + PKER_RACCSS( 28, 7) = 0.379341E+01 + PKER_RACCSS( 28, 8) = 0.303518E+01 + PKER_RACCSS( 28, 9) = 0.240761E+01 + PKER_RACCSS( 28, 10) = 0.188860E+01 + PKER_RACCSS( 28, 11) = 0.146011E+01 + PKER_RACCSS( 28, 12) = 0.110727E+01 + PKER_RACCSS( 28, 13) = 0.818541E+00 + PKER_RACCSS( 28, 14) = 0.585150E+00 + PKER_RACCSS( 28, 15) = 0.401892E+00 + PKER_RACCSS( 28, 16) = 0.266865E+00 + PKER_RACCSS( 28, 17) = 0.180994E+00 + PKER_RACCSS( 28, 18) = 0.143621E+00 + PKER_RACCSS( 28, 19) = 0.148709E+00 + PKER_RACCSS( 28, 20) = 0.182192E+00 + PKER_RACCSS( 28, 21) = 0.227050E+00 + PKER_RACCSS( 28, 22) = 0.270562E+00 + PKER_RACCSS( 28, 23) = 0.307571E+00 + PKER_RACCSS( 28, 24) = 0.337783E+00 + PKER_RACCSS( 28, 25) = 0.362333E+00 + PKER_RACCSS( 28, 26) = 0.382340E+00 + PKER_RACCSS( 28, 27) = 0.398692E+00 + PKER_RACCSS( 28, 28) = 0.412083E+00 + PKER_RACCSS( 28, 29) = 0.423069E+00 + PKER_RACCSS( 28, 30) = 0.432097E+00 + PKER_RACCSS( 28, 31) = 0.439525E+00 + PKER_RACCSS( 28, 32) = 0.445643E+00 + PKER_RACCSS( 28, 33) = 0.450687E+00 + PKER_RACCSS( 28, 34) = 0.454848E+00 + PKER_RACCSS( 28, 35) = 0.458283E+00 + PKER_RACCSS( 28, 36) = 0.461119E+00 + PKER_RACCSS( 28, 37) = 0.463463E+00 + PKER_RACCSS( 28, 38) = 0.465400E+00 + PKER_RACCSS( 28, 39) = 0.467002E+00 + PKER_RACCSS( 28, 40) = 0.468326E+00 + PKER_RACCSS( 29, 1) = 0.133215E+02 + PKER_RACCSS( 29, 2) = 0.109289E+02 + PKER_RACCSS( 29, 3) = 0.894604E+01 + PKER_RACCSS( 29, 4) = 0.730119E+01 + PKER_RACCSS( 29, 5) = 0.593124E+01 + PKER_RACCSS( 29, 6) = 0.480144E+01 + PKER_RACCSS( 29, 7) = 0.386406E+01 + PKER_RACCSS( 29, 8) = 0.309611E+01 + PKER_RACCSS( 29, 9) = 0.246034E+01 + PKER_RACCSS( 29, 10) = 0.193432E+01 + PKER_RACCSS( 29, 11) = 0.149394E+01 + PKER_RACCSS( 29, 12) = 0.113665E+01 + PKER_RACCSS( 29, 13) = 0.843665E+00 + PKER_RACCSS( 29, 14) = 0.605916E+00 + PKER_RACCSS( 29, 15) = 0.417943E+00 + PKER_RACCSS( 29, 16) = 0.277581E+00 + PKER_RACCSS( 29, 17) = 0.185747E+00 + PKER_RACCSS( 29, 18) = 0.142370E+00 + PKER_RACCSS( 29, 19) = 0.142343E+00 + PKER_RACCSS( 29, 20) = 0.172458E+00 + PKER_RACCSS( 29, 21) = 0.215669E+00 + PKER_RACCSS( 29, 22) = 0.258726E+00 + PKER_RACCSS( 29, 23) = 0.295879E+00 + PKER_RACCSS( 29, 24) = 0.326452E+00 + PKER_RACCSS( 29, 25) = 0.351334E+00 + PKER_RACCSS( 29, 26) = 0.371529E+00 + PKER_RACCSS( 29, 27) = 0.387939E+00 + PKER_RACCSS( 29, 28) = 0.401329E+00 + PKER_RACCSS( 29, 29) = 0.412300E+00 + PKER_RACCSS( 29, 30) = 0.421310E+00 + PKER_RACCSS( 29, 31) = 0.428722E+00 + PKER_RACCSS( 29, 32) = 0.434825E+00 + PKER_RACCSS( 29, 33) = 0.439856E+00 + PKER_RACCSS( 29, 34) = 0.444007E+00 + PKER_RACCSS( 29, 35) = 0.447433E+00 + PKER_RACCSS( 29, 36) = 0.450262E+00 + PKER_RACCSS( 29, 37) = 0.452600E+00 + PKER_RACCSS( 29, 38) = 0.454532E+00 + PKER_RACCSS( 29, 39) = 0.456130E+00 + PKER_RACCSS( 29, 40) = 0.457451E+00 + PKER_RACCSS( 30, 1) = 0.133375E+02 + PKER_RACCSS( 30, 2) = 0.109457E+02 + PKER_RACCSS( 30, 3) = 0.896468E+01 + PKER_RACCSS( 30, 4) = 0.732350E+01 + PKER_RACCSS( 30, 5) = 0.596323E+01 + PKER_RACCSS( 30, 6) = 0.483579E+01 + PKER_RACCSS( 30, 7) = 0.390254E+01 + PKER_RACCSS( 30, 8) = 0.313132E+01 + PKER_RACCSS( 30, 9) = 0.249276E+01 + PKER_RACCSS( 30, 10) = 0.196278E+01 + PKER_RACCSS( 30, 11) = 0.152606E+01 + PKER_RACCSS( 30, 12) = 0.116570E+01 + PKER_RACCSS( 30, 13) = 0.869566E+00 + PKER_RACCSS( 30, 14) = 0.628357E+00 + PKER_RACCSS( 30, 15) = 0.436329E+00 + PKER_RACCSS( 30, 16) = 0.290939E+00 + PKER_RACCSS( 30, 17) = 0.192920E+00 + PKER_RACCSS( 30, 18) = 0.142864E+00 + PKER_RACCSS( 30, 19) = 0.136857E+00 + PKER_RACCSS( 30, 20) = 0.162977E+00 + PKER_RACCSS( 30, 21) = 0.204357E+00 + PKER_RACCSS( 30, 22) = 0.246873E+00 + PKER_RACCSS( 30, 23) = 0.283849E+00 + PKER_RACCSS( 30, 24) = 0.314229E+00 + PKER_RACCSS( 30, 25) = 0.338918E+00 + PKER_RACCSS( 30, 26) = 0.359002E+00 + PKER_RACCSS( 30, 27) = 0.375384E+00 + PKER_RACCSS( 30, 28) = 0.388781E+00 + PKER_RACCSS( 30, 29) = 0.399761E+00 + PKER_RACCSS( 30, 30) = 0.408775E+00 + PKER_RACCSS( 30, 31) = 0.416186E+00 + PKER_RACCSS( 30, 32) = 0.422287E+00 + PKER_RACCSS( 30, 33) = 0.427315E+00 + PKER_RACCSS( 30, 34) = 0.431462E+00 + PKER_RACCSS( 30, 35) = 0.434884E+00 + PKER_RACCSS( 30, 36) = 0.437711E+00 + PKER_RACCSS( 30, 37) = 0.440046E+00 + PKER_RACCSS( 30, 38) = 0.441975E+00 + PKER_RACCSS( 30, 39) = 0.443571E+00 + PKER_RACCSS( 30, 40) = 0.444890E+00 + PKER_RACCSS( 31, 1) = 0.133457E+02 + PKER_RACCSS( 31, 2) = 0.109540E+02 + PKER_RACCSS( 31, 3) = 0.897333E+01 + PKER_RACCSS( 31, 4) = 0.733289E+01 + PKER_RACCSS( 31, 5) = 0.597403E+01 + PKER_RACCSS( 31, 6) = 0.484844E+01 + PKER_RACCSS( 31, 7) = 0.391622E+01 + PKER_RACCSS( 31, 8) = 0.314409E+01 + PKER_RACCSS( 31, 9) = 0.250503E+01 + PKER_RACCSS( 31, 10) = 0.197608E+01 + PKER_RACCSS( 31, 11) = 0.153866E+01 + PKER_RACCSS( 31, 12) = 0.117759E+01 + PKER_RACCSS( 31, 13) = 0.880647E+00 + PKER_RACCSS( 31, 14) = 0.638378E+00 + PKER_RACCSS( 31, 15) = 0.444889E+00 + PKER_RACCSS( 31, 16) = 0.297371E+00 + PKER_RACCSS( 31, 17) = 0.196420E+00 + PKER_RACCSS( 31, 18) = 0.142908E+00 + PKER_RACCSS( 31, 19) = 0.133631E+00 + PKER_RACCSS( 31, 20) = 0.157422E+00 + PKER_RACCSS( 31, 21) = 0.197662E+00 + PKER_RACCSS( 31, 22) = 0.239819E+00 + PKER_RACCSS( 31, 23) = 0.276723E+00 + PKER_RACCSS( 31, 24) = 0.307082E+00 + PKER_RACCSS( 31, 25) = 0.331764E+00 + PKER_RACCSS( 31, 26) = 0.351849E+00 + PKER_RACCSS( 31, 27) = 0.368231E+00 + PKER_RACCSS( 31, 28) = 0.381625E+00 + PKER_RACCSS( 31, 29) = 0.392598E+00 + PKER_RACCSS( 31, 30) = 0.401604E+00 + PKER_RACCSS( 31, 31) = 0.409008E+00 + PKER_RACCSS( 31, 32) = 0.415101E+00 + PKER_RACCSS( 31, 33) = 0.420122E+00 + PKER_RACCSS( 31, 34) = 0.424262E+00 + PKER_RACCSS( 31, 35) = 0.427680E+00 + PKER_RACCSS( 31, 36) = 0.430501E+00 + PKER_RACCSS( 31, 37) = 0.432833E+00 + PKER_RACCSS( 31, 38) = 0.434760E+00 + PKER_RACCSS( 31, 39) = 0.436352E+00 + PKER_RACCSS( 31, 40) = 0.437670E+00 + PKER_RACCSS( 32, 1) = 0.133505E+02 + PKER_RACCSS( 32, 2) = 0.109589E+02 + PKER_RACCSS( 32, 3) = 0.897836E+01 + PKER_RACCSS( 32, 4) = 0.733809E+01 + PKER_RACCSS( 32, 5) = 0.597956E+01 + PKER_RACCSS( 32, 6) = 0.485431E+01 + PKER_RACCSS( 32, 7) = 0.392231E+01 + PKER_RACCSS( 32, 8) = 0.315042E+01 + PKER_RACCSS( 32, 9) = 0.251126E+01 + PKER_RACCSS( 32, 10) = 0.198225E+01 + PKER_RACCSS( 32, 11) = 0.154473E+01 + PKER_RACCSS( 32, 12) = 0.118355E+01 + PKER_RACCSS( 32, 13) = 0.886389E+00 + PKER_RACCSS( 32, 14) = 0.643737E+00 + PKER_RACCSS( 32, 15) = 0.449607E+00 + PKER_RACCSS( 32, 16) = 0.300995E+00 + PKER_RACCSS( 32, 17) = 0.198415E+00 + PKER_RACCSS( 32, 18) = 0.142843E+00 + PKER_RACCSS( 32, 19) = 0.131565E+00 + PKER_RACCSS( 32, 20) = 0.153886E+00 + PKER_RACCSS( 32, 21) = 0.193406E+00 + PKER_RACCSS( 32, 22) = 0.235356E+00 + PKER_RACCSS( 32, 23) = 0.272245E+00 + PKER_RACCSS( 32, 24) = 0.302622E+00 + PKER_RACCSS( 32, 25) = 0.327315E+00 + PKER_RACCSS( 32, 26) = 0.347401E+00 + PKER_RACCSS( 32, 27) = 0.363781E+00 + PKER_RACCSS( 32, 28) = 0.377168E+00 + PKER_RACCSS( 32, 29) = 0.388134E+00 + PKER_RACCSS( 32, 30) = 0.397132E+00 + PKER_RACCSS( 32, 31) = 0.404527E+00 + PKER_RACCSS( 32, 32) = 0.410614E+00 + PKER_RACCSS( 32, 33) = 0.415629E+00 + PKER_RACCSS( 32, 34) = 0.419764E+00 + PKER_RACCSS( 32, 35) = 0.423177E+00 + PKER_RACCSS( 32, 36) = 0.425995E+00 + PKER_RACCSS( 32, 37) = 0.428323E+00 + PKER_RACCSS( 32, 38) = 0.430248E+00 + PKER_RACCSS( 32, 39) = 0.431839E+00 + PKER_RACCSS( 32, 40) = 0.433154E+00 + PKER_RACCSS( 33, 1) = 0.133549E+02 + PKER_RACCSS( 33, 2) = 0.109634E+02 + PKER_RACCSS( 33, 3) = 0.898293E+01 + PKER_RACCSS( 33, 4) = 0.734275E+01 + PKER_RACCSS( 33, 5) = 0.598430E+01 + PKER_RACCSS( 33, 6) = 0.485916E+01 + PKER_RACCSS( 33, 7) = 0.392725E+01 + PKER_RACCSS( 33, 8) = 0.315543E+01 + PKER_RACCSS( 33, 9) = 0.251634E+01 + PKER_RACCSS( 33, 10) = 0.198734E+01 + PKER_RACCSS( 33, 11) = 0.154980E+01 + PKER_RACCSS( 33, 12) = 0.118857E+01 + PKER_RACCSS( 33, 13) = 0.891252E+00 + PKER_RACCSS( 33, 14) = 0.648304E+00 + PKER_RACCSS( 33, 15) = 0.453668E+00 + PKER_RACCSS( 33, 16) = 0.304190E+00 + PKER_RACCSS( 33, 17) = 0.200247E+00 + PKER_RACCSS( 33, 18) = 0.142958E+00 + PKER_RACCSS( 33, 19) = 0.129943E+00 + PKER_RACCSS( 33, 20) = 0.150972E+00 + PKER_RACCSS( 33, 21) = 0.189862E+00 + PKER_RACCSS( 33, 22) = 0.231629E+00 + PKER_RACCSS( 33, 23) = 0.268519E+00 + PKER_RACCSS( 33, 24) = 0.298923E+00 + PKER_RACCSS( 33, 25) = 0.323635E+00 + PKER_RACCSS( 33, 26) = 0.343732E+00 + PKER_RACCSS( 33, 27) = 0.360115E+00 + PKER_RACCSS( 33, 28) = 0.373503E+00 + PKER_RACCSS( 33, 29) = 0.384466E+00 + PKER_RACCSS( 33, 30) = 0.393460E+00 + PKER_RACCSS( 33, 31) = 0.400852E+00 + PKER_RACCSS( 33, 32) = 0.406935E+00 + PKER_RACCSS( 33, 33) = 0.411946E+00 + PKER_RACCSS( 33, 34) = 0.416078E+00 + PKER_RACCSS( 33, 35) = 0.419488E+00 + PKER_RACCSS( 33, 36) = 0.422304E+00 + PKER_RACCSS( 33, 37) = 0.424631E+00 + PKER_RACCSS( 33, 38) = 0.426553E+00 + PKER_RACCSS( 33, 39) = 0.428143E+00 + PKER_RACCSS( 33, 40) = 0.429458E+00 + PKER_RACCSS( 34, 1) = 0.133545E+02 + PKER_RACCSS( 34, 2) = 0.109630E+02 + PKER_RACCSS( 34, 3) = 0.898249E+01 + PKER_RACCSS( 34, 4) = 0.734231E+01 + PKER_RACCSS( 34, 5) = 0.598387E+01 + PKER_RACCSS( 34, 6) = 0.485874E+01 + PKER_RACCSS( 34, 7) = 0.392685E+01 + PKER_RACCSS( 34, 8) = 0.315505E+01 + PKER_RACCSS( 34, 9) = 0.251599E+01 + PKER_RACCSS( 34, 10) = 0.198703E+01 + PKER_RACCSS( 34, 11) = 0.154953E+01 + PKER_RACCSS( 34, 12) = 0.118835E+01 + PKER_RACCSS( 34, 13) = 0.891084E+00 + PKER_RACCSS( 34, 14) = 0.648191E+00 + PKER_RACCSS( 34, 15) = 0.453598E+00 + PKER_RACCSS( 34, 16) = 0.304088E+00 + PKER_RACCSS( 34, 17) = 0.200150E+00 + PKER_RACCSS( 34, 18) = 0.142751E+00 + PKER_RACCSS( 34, 19) = 0.129699E+00 + PKER_RACCSS( 34, 20) = 0.150660E+00 + PKER_RACCSS( 34, 21) = 0.189538E+00 + PKER_RACCSS( 34, 22) = 0.231282E+00 + PKER_RACCSS( 34, 23) = 0.268145E+00 + PKER_RACCSS( 34, 24) = 0.298523E+00 + PKER_RACCSS( 34, 25) = 0.323213E+00 + PKER_RACCSS( 34, 26) = 0.343290E+00 + PKER_RACCSS( 34, 27) = 0.359658E+00 + PKER_RACCSS( 34, 28) = 0.373032E+00 + PKER_RACCSS( 34, 29) = 0.383985E+00 + PKER_RACCSS( 34, 30) = 0.392971E+00 + PKER_RACCSS( 34, 31) = 0.400356E+00 + PKER_RACCSS( 34, 32) = 0.406433E+00 + PKER_RACCSS( 34, 33) = 0.411440E+00 + PKER_RACCSS( 34, 34) = 0.415568E+00 + PKER_RACCSS( 34, 35) = 0.418976E+00 + PKER_RACCSS( 34, 36) = 0.421789E+00 + PKER_RACCSS( 34, 37) = 0.424114E+00 + PKER_RACCSS( 34, 38) = 0.426035E+00 + PKER_RACCSS( 34, 39) = 0.427624E+00 + PKER_RACCSS( 34, 40) = 0.428937E+00 + PKER_RACCSS( 35, 1) = 0.133588E+02 + PKER_RACCSS( 35, 2) = 0.109673E+02 + PKER_RACCSS( 35, 3) = 0.898695E+01 + PKER_RACCSS( 35, 4) = 0.734684E+01 + PKER_RACCSS( 35, 5) = 0.598848E+01 + PKER_RACCSS( 35, 6) = 0.486341E+01 + PKER_RACCSS( 35, 7) = 0.393158E+01 + PKER_RACCSS( 35, 8) = 0.315983E+01 + PKER_RACCSS( 35, 9) = 0.252079E+01 + PKER_RACCSS( 35, 10) = 0.199184E+01 + PKER_RACCSS( 35, 11) = 0.155430E+01 + PKER_RACCSS( 35, 12) = 0.119306E+01 + PKER_RACCSS( 35, 13) = 0.895641E+00 + PKER_RACCSS( 35, 14) = 0.652461E+00 + PKER_RACCSS( 35, 15) = 0.457402E+00 + PKER_RACCSS( 35, 16) = 0.307153E+00 + PKER_RACCSS( 35, 17) = 0.201981E+00 + PKER_RACCSS( 35, 18) = 0.143041E+00 + PKER_RACCSS( 35, 19) = 0.128393E+00 + PKER_RACCSS( 35, 20) = 0.148145E+00 + PKER_RACCSS( 35, 21) = 0.186428E+00 + PKER_RACCSS( 35, 22) = 0.228006E+00 + PKER_RACCSS( 35, 23) = 0.264882E+00 + PKER_RACCSS( 35, 24) = 0.295301E+00 + PKER_RACCSS( 35, 25) = 0.320021E+00 + PKER_RACCSS( 35, 26) = 0.340118E+00 + PKER_RACCSS( 35, 27) = 0.356498E+00 + PKER_RACCSS( 35, 28) = 0.369879E+00 + PKER_RACCSS( 35, 29) = 0.380835E+00 + PKER_RACCSS( 35, 30) = 0.389822E+00 + PKER_RACCSS( 35, 31) = 0.397206E+00 + PKER_RACCSS( 35, 32) = 0.403283E+00 + PKER_RACCSS( 35, 33) = 0.408288E+00 + PKER_RACCSS( 35, 34) = 0.412416E+00 + PKER_RACCSS( 35, 35) = 0.415822E+00 + PKER_RACCSS( 35, 36) = 0.418634E+00 + PKER_RACCSS( 35, 37) = 0.420958E+00 + PKER_RACCSS( 35, 38) = 0.422879E+00 + PKER_RACCSS( 35, 39) = 0.424467E+00 + PKER_RACCSS( 35, 40) = 0.425780E+00 + PKER_RACCSS( 36, 1) = 0.133693E+02 + PKER_RACCSS( 36, 2) = 0.109781E+02 + PKER_RACCSS( 36, 3) = 0.899787E+01 + PKER_RACCSS( 36, 4) = 0.735793E+01 + PKER_RACCSS( 36, 5) = 0.599972E+01 + PKER_RACCSS( 36, 6) = 0.487480E+01 + PKER_RACCSS( 36, 7) = 0.394309E+01 + PKER_RACCSS( 36, 8) = 0.317142E+01 + PKER_RACCSS( 36, 9) = 0.253243E+01 + PKER_RACCSS( 36, 10) = 0.200346E+01 + PKER_RACCSS( 36, 11) = 0.156582E+01 + PKER_RACCSS( 36, 12) = 0.120440E+01 + PKER_RACCSS( 36, 13) = 0.906578E+00 + PKER_RACCSS( 36, 14) = 0.662698E+00 + PKER_RACCSS( 36, 15) = 0.466524E+00 + PKER_RACCSS( 36, 16) = 0.314682E+00 + PKER_RACCSS( 36, 17) = 0.206574E+00 + PKER_RACCSS( 36, 18) = 0.144245E+00 + PKER_RACCSS( 36, 19) = 0.125763E+00 + PKER_RACCSS( 36, 20) = 0.142684E+00 + PKER_RACCSS( 36, 21) = 0.179440E+00 + PKER_RACCSS( 36, 22) = 0.220596E+00 + PKER_RACCSS( 36, 23) = 0.257524E+00 + PKER_RACCSS( 36, 24) = 0.288068E+00 + PKER_RACCSS( 36, 25) = 0.312888E+00 + PKER_RACCSS( 36, 26) = 0.333055E+00 + PKER_RACCSS( 36, 27) = 0.349481E+00 + PKER_RACCSS( 36, 28) = 0.362892E+00 + PKER_RACCSS( 36, 29) = 0.373867E+00 + PKER_RACCSS( 36, 30) = 0.382866E+00 + PKER_RACCSS( 36, 31) = 0.390258E+00 + PKER_RACCSS( 36, 32) = 0.396339E+00 + PKER_RACCSS( 36, 33) = 0.401346E+00 + PKER_RACCSS( 36, 34) = 0.405475E+00 + PKER_RACCSS( 36, 35) = 0.408881E+00 + PKER_RACCSS( 36, 36) = 0.411694E+00 + PKER_RACCSS( 36, 37) = 0.414017E+00 + PKER_RACCSS( 36, 38) = 0.415937E+00 + PKER_RACCSS( 36, 39) = 0.417525E+00 + PKER_RACCSS( 36, 40) = 0.418837E+00 + PKER_RACCSS( 37, 1) = 0.000000E+00 + PKER_RACCSS( 37, 2) = 0.000000E+00 + PKER_RACCSS( 37, 3) = 0.000000E+00 + PKER_RACCSS( 37, 4) = 0.000000E+00 + PKER_RACCSS( 37, 5) = 0.000000E+00 + PKER_RACCSS( 37, 6) = 0.000000E+00 + PKER_RACCSS( 37, 7) = 0.000000E+00 + PKER_RACCSS( 37, 8) = 0.000000E+00 + PKER_RACCSS( 37, 9) = 0.000000E+00 + PKER_RACCSS( 37, 10) = 0.000000E+00 + PKER_RACCSS( 37, 11) = 0.000000E+00 + PKER_RACCSS( 37, 12) = 0.000000E+00 + PKER_RACCSS( 37, 13) = 0.000000E+00 + PKER_RACCSS( 37, 14) = 0.000000E+00 + PKER_RACCSS( 37, 15) = 0.000000E+00 + PKER_RACCSS( 37, 16) = 0.000000E+00 + PKER_RACCSS( 37, 17) = 0.000000E+00 + PKER_RACCSS( 37, 18) = 0.000000E+00 + PKER_RACCSS( 37, 19) = 0.000000E+00 + PKER_RACCSS( 37, 20) = 0.000000E+00 + PKER_RACCSS( 37, 21) = 0.000000E+00 + PKER_RACCSS( 37, 22) = 0.000000E+00 + PKER_RACCSS( 37, 23) = 0.000000E+00 + PKER_RACCSS( 37, 24) = 0.000000E+00 + PKER_RACCSS( 37, 25) = 0.000000E+00 + PKER_RACCSS( 37, 26) = 0.000000E+00 + PKER_RACCSS( 37, 27) = 0.000000E+00 + PKER_RACCSS( 37, 28) = 0.000000E+00 + PKER_RACCSS( 37, 29) = 0.000000E+00 + PKER_RACCSS( 37, 30) = 0.000000E+00 + PKER_RACCSS( 37, 31) = 0.000000E+00 + PKER_RACCSS( 37, 32) = 0.000000E+00 + PKER_RACCSS( 37, 33) = 0.000000E+00 + PKER_RACCSS( 37, 34) = 0.000000E+00 + PKER_RACCSS( 37, 35) = 0.000000E+00 + PKER_RACCSS( 37, 36) = 0.000000E+00 + PKER_RACCSS( 37, 37) = 0.000000E+00 + PKER_RACCSS( 37, 38) = 0.000000E+00 + PKER_RACCSS( 37, 39) = 0.000000E+00 + PKER_RACCSS( 37, 40) = 0.000000E+00 + PKER_RACCSS( 38, 1) = 0.000000E+00 + PKER_RACCSS( 38, 2) = 0.000000E+00 + PKER_RACCSS( 38, 3) = 0.000000E+00 + PKER_RACCSS( 38, 4) = 0.000000E+00 + PKER_RACCSS( 38, 5) = 0.000000E+00 + PKER_RACCSS( 38, 6) = 0.000000E+00 + PKER_RACCSS( 38, 7) = 0.000000E+00 + PKER_RACCSS( 38, 8) = 0.000000E+00 + PKER_RACCSS( 38, 9) = 0.000000E+00 + PKER_RACCSS( 38, 10) = 0.000000E+00 + PKER_RACCSS( 38, 11) = 0.000000E+00 + PKER_RACCSS( 38, 12) = 0.000000E+00 + PKER_RACCSS( 38, 13) = 0.000000E+00 + PKER_RACCSS( 38, 14) = 0.000000E+00 + PKER_RACCSS( 38, 15) = 0.000000E+00 + PKER_RACCSS( 38, 16) = 0.000000E+00 + PKER_RACCSS( 38, 17) = 0.000000E+00 + PKER_RACCSS( 38, 18) = 0.000000E+00 + PKER_RACCSS( 38, 19) = 0.000000E+00 + PKER_RACCSS( 38, 20) = 0.000000E+00 + PKER_RACCSS( 38, 21) = 0.000000E+00 + PKER_RACCSS( 38, 22) = 0.000000E+00 + PKER_RACCSS( 38, 23) = 0.000000E+00 + PKER_RACCSS( 38, 24) = 0.000000E+00 + PKER_RACCSS( 38, 25) = 0.000000E+00 + PKER_RACCSS( 38, 26) = 0.000000E+00 + PKER_RACCSS( 38, 27) = 0.000000E+00 + PKER_RACCSS( 38, 28) = 0.000000E+00 + PKER_RACCSS( 38, 29) = 0.000000E+00 + PKER_RACCSS( 38, 30) = 0.000000E+00 + PKER_RACCSS( 38, 31) = 0.000000E+00 + PKER_RACCSS( 38, 32) = 0.000000E+00 + PKER_RACCSS( 38, 33) = 0.000000E+00 + PKER_RACCSS( 38, 34) = 0.000000E+00 + PKER_RACCSS( 38, 35) = 0.000000E+00 + PKER_RACCSS( 38, 36) = 0.000000E+00 + PKER_RACCSS( 38, 37) = 0.000000E+00 + PKER_RACCSS( 38, 38) = 0.000000E+00 + PKER_RACCSS( 38, 39) = 0.000000E+00 + PKER_RACCSS( 38, 40) = 0.000000E+00 + PKER_RACCSS( 39, 1) = 0.000000E+00 + PKER_RACCSS( 39, 2) = 0.000000E+00 + PKER_RACCSS( 39, 3) = 0.000000E+00 + PKER_RACCSS( 39, 4) = 0.000000E+00 + PKER_RACCSS( 39, 5) = 0.000000E+00 + PKER_RACCSS( 39, 6) = 0.000000E+00 + PKER_RACCSS( 39, 7) = 0.000000E+00 + PKER_RACCSS( 39, 8) = 0.000000E+00 + PKER_RACCSS( 39, 9) = 0.000000E+00 + PKER_RACCSS( 39, 10) = 0.000000E+00 + PKER_RACCSS( 39, 11) = 0.000000E+00 + PKER_RACCSS( 39, 12) = 0.000000E+00 + PKER_RACCSS( 39, 13) = 0.000000E+00 + PKER_RACCSS( 39, 14) = 0.000000E+00 + PKER_RACCSS( 39, 15) = 0.000000E+00 + PKER_RACCSS( 39, 16) = 0.000000E+00 + PKER_RACCSS( 39, 17) = 0.000000E+00 + PKER_RACCSS( 39, 18) = 0.000000E+00 + PKER_RACCSS( 39, 19) = 0.000000E+00 + PKER_RACCSS( 39, 20) = 0.000000E+00 + PKER_RACCSS( 39, 21) = 0.000000E+00 + PKER_RACCSS( 39, 22) = 0.000000E+00 + PKER_RACCSS( 39, 23) = 0.000000E+00 + PKER_RACCSS( 39, 24) = 0.000000E+00 + PKER_RACCSS( 39, 25) = 0.000000E+00 + PKER_RACCSS( 39, 26) = 0.000000E+00 + PKER_RACCSS( 39, 27) = 0.000000E+00 + PKER_RACCSS( 39, 28) = 0.000000E+00 + PKER_RACCSS( 39, 29) = 0.000000E+00 + PKER_RACCSS( 39, 30) = 0.000000E+00 + PKER_RACCSS( 39, 31) = 0.000000E+00 + PKER_RACCSS( 39, 32) = 0.000000E+00 + PKER_RACCSS( 39, 33) = 0.000000E+00 + PKER_RACCSS( 39, 34) = 0.000000E+00 + PKER_RACCSS( 39, 35) = 0.000000E+00 + PKER_RACCSS( 39, 36) = 0.000000E+00 + PKER_RACCSS( 39, 37) = 0.000000E+00 + PKER_RACCSS( 39, 38) = 0.000000E+00 + PKER_RACCSS( 39, 39) = 0.000000E+00 + PKER_RACCSS( 39, 40) = 0.000000E+00 + PKER_RACCSS( 40, 1) = 0.000000E+00 + PKER_RACCSS( 40, 2) = 0.000000E+00 + PKER_RACCSS( 40, 3) = 0.000000E+00 + PKER_RACCSS( 40, 4) = 0.000000E+00 + PKER_RACCSS( 40, 5) = 0.000000E+00 + PKER_RACCSS( 40, 6) = 0.000000E+00 + PKER_RACCSS( 40, 7) = 0.000000E+00 + PKER_RACCSS( 40, 8) = 0.000000E+00 + PKER_RACCSS( 40, 9) = 0.000000E+00 + PKER_RACCSS( 40, 10) = 0.000000E+00 + PKER_RACCSS( 40, 11) = 0.000000E+00 + PKER_RACCSS( 40, 12) = 0.000000E+00 + PKER_RACCSS( 40, 13) = 0.000000E+00 + PKER_RACCSS( 40, 14) = 0.000000E+00 + PKER_RACCSS( 40, 15) = 0.000000E+00 + PKER_RACCSS( 40, 16) = 0.000000E+00 + PKER_RACCSS( 40, 17) = 0.000000E+00 + PKER_RACCSS( 40, 18) = 0.000000E+00 + PKER_RACCSS( 40, 19) = 0.000000E+00 + PKER_RACCSS( 40, 20) = 0.000000E+00 + PKER_RACCSS( 40, 21) = 0.000000E+00 + PKER_RACCSS( 40, 22) = 0.000000E+00 + PKER_RACCSS( 40, 23) = 0.000000E+00 + PKER_RACCSS( 40, 24) = 0.000000E+00 + PKER_RACCSS( 40, 25) = 0.000000E+00 + PKER_RACCSS( 40, 26) = 0.000000E+00 + PKER_RACCSS( 40, 27) = 0.000000E+00 + PKER_RACCSS( 40, 28) = 0.000000E+00 + PKER_RACCSS( 40, 29) = 0.000000E+00 + PKER_RACCSS( 40, 30) = 0.000000E+00 + PKER_RACCSS( 40, 31) = 0.000000E+00 + PKER_RACCSS( 40, 32) = 0.000000E+00 + PKER_RACCSS( 40, 33) = 0.000000E+00 + PKER_RACCSS( 40, 34) = 0.000000E+00 + PKER_RACCSS( 40, 35) = 0.000000E+00 + PKER_RACCSS( 40, 36) = 0.000000E+00 + PKER_RACCSS( 40, 37) = 0.000000E+00 + PKER_RACCSS( 40, 38) = 0.000000E+00 + PKER_RACCSS( 40, 39) = 0.000000E+00 + PKER_RACCSS( 40, 40) = 0.000000E+00 +END IF +! +IF( PRESENT(PKER_RACCS ) ) THEN + PKER_RACCS ( 1, 1) = 0.810035E+01 + PKER_RACCS ( 1, 2) = 0.624606E+01 + PKER_RACCS ( 1, 3) = 0.474070E+01 + PKER_RACCS ( 1, 4) = 0.352376E+01 + PKER_RACCS ( 1, 5) = 0.255333E+01 + PKER_RACCS ( 1, 6) = 0.180384E+01 + PKER_RACCS ( 1, 7) = 0.126294E+01 + PKER_RACCS ( 1, 8) = 0.924202E+00 + PKER_RACCS ( 1, 9) = 0.775231E+00 + PKER_RACCS ( 1, 10) = 0.787292E+00 + PKER_RACCS ( 1, 11) = 0.911536E+00 + PKER_RACCS ( 1, 12) = 0.109094E+01 + PKER_RACCS ( 1, 13) = 0.127926E+01 + PKER_RACCS ( 1, 14) = 0.145083E+01 + PKER_RACCS ( 1, 15) = 0.159745E+01 + PKER_RACCS ( 1, 16) = 0.171978E+01 + PKER_RACCS ( 1, 17) = 0.182114E+01 + PKER_RACCS ( 1, 18) = 0.190501E+01 + PKER_RACCS ( 1, 19) = 0.197441E+01 + PKER_RACCS ( 1, 20) = 0.203184E+01 + PKER_RACCS ( 1, 21) = 0.207937E+01 + PKER_RACCS ( 1, 22) = 0.211870E+01 + PKER_RACCS ( 1, 23) = 0.215125E+01 + PKER_RACCS ( 1, 24) = 0.217819E+01 + PKER_RACCS ( 1, 25) = 0.220049E+01 + PKER_RACCS ( 1, 26) = 0.221895E+01 + PKER_RACCS ( 1, 27) = 0.223423E+01 + PKER_RACCS ( 1, 28) = 0.224687E+01 + PKER_RACCS ( 1, 29) = 0.225734E+01 + PKER_RACCS ( 1, 30) = 0.226601E+01 + PKER_RACCS ( 1, 31) = 0.227318E+01 + PKER_RACCS ( 1, 32) = 0.227911E+01 + PKER_RACCS ( 1, 33) = 0.228403E+01 + PKER_RACCS ( 1, 34) = 0.228810E+01 + PKER_RACCS ( 1, 35) = 0.229146E+01 + PKER_RACCS ( 1, 36) = 0.229425E+01 + PKER_RACCS ( 1, 37) = 0.229656E+01 + PKER_RACCS ( 1, 38) = 0.229847E+01 + PKER_RACCS ( 1, 39) = 0.230005E+01 + PKER_RACCS ( 1, 40) = 0.230136E+01 + PKER_RACCS ( 2, 1) = 0.835048E+01 + PKER_RACCS ( 2, 2) = 0.645953E+01 + PKER_RACCS ( 2, 3) = 0.492716E+01 + PKER_RACCS ( 2, 4) = 0.368761E+01 + PKER_RACCS ( 2, 5) = 0.269450E+01 + PKER_RACCS ( 2, 6) = 0.191744E+01 + PKER_RACCS ( 2, 7) = 0.134059E+01 + PKER_RACCS ( 2, 8) = 0.956675E+00 + PKER_RACCS ( 2, 9) = 0.757265E+00 + PKER_RACCS ( 2, 10) = 0.720633E+00 + PKER_RACCS ( 2, 11) = 0.806882E+00 + PKER_RACCS ( 2, 12) = 0.963181E+00 + PKER_RACCS ( 2, 13) = 0.114076E+01 + PKER_RACCS ( 2, 14) = 0.130870E+01 + PKER_RACCS ( 2, 15) = 0.145451E+01 + PKER_RACCS ( 2, 16) = 0.157680E+01 + PKER_RACCS ( 2, 17) = 0.167825E+01 + PKER_RACCS ( 2, 18) = 0.176221E+01 + PKER_RACCS ( 2, 19) = 0.183168E+01 + PKER_RACCS ( 2, 20) = 0.188915E+01 + PKER_RACCS ( 2, 21) = 0.193671E+01 + PKER_RACCS ( 2, 22) = 0.197607E+01 + PKER_RACCS ( 2, 23) = 0.200864E+01 + PKER_RACCS ( 2, 24) = 0.203559E+01 + PKER_RACCS ( 2, 25) = 0.205790E+01 + PKER_RACCS ( 2, 26) = 0.207637E+01 + PKER_RACCS ( 2, 27) = 0.209165E+01 + PKER_RACCS ( 2, 28) = 0.210430E+01 + PKER_RACCS ( 2, 29) = 0.211478E+01 + PKER_RACCS ( 2, 30) = 0.212344E+01 + PKER_RACCS ( 2, 31) = 0.213062E+01 + PKER_RACCS ( 2, 32) = 0.213656E+01 + PKER_RACCS ( 2, 33) = 0.214147E+01 + PKER_RACCS ( 2, 34) = 0.214554E+01 + PKER_RACCS ( 2, 35) = 0.214891E+01 + PKER_RACCS ( 2, 36) = 0.215170E+01 + PKER_RACCS ( 2, 37) = 0.215401E+01 + PKER_RACCS ( 2, 38) = 0.215592E+01 + PKER_RACCS ( 2, 39) = 0.215750E+01 + PKER_RACCS ( 2, 40) = 0.215881E+01 + PKER_RACCS ( 3, 1) = 0.861642E+01 + PKER_RACCS ( 3, 2) = 0.668233E+01 + PKER_RACCS ( 3, 3) = 0.511848E+01 + PKER_RACCS ( 3, 4) = 0.385427E+01 + PKER_RACCS ( 3, 5) = 0.283858E+01 + PKER_RACCS ( 3, 6) = 0.203643E+01 + PKER_RACCS ( 3, 7) = 0.142806E+01 + PKER_RACCS ( 3, 8) = 0.100397E+01 + PKER_RACCS ( 3, 9) = 0.757020E+00 + PKER_RACCS ( 3, 10) = 0.673206E+00 + PKER_RACCS ( 3, 11) = 0.719335E+00 + PKER_RACCS ( 3, 12) = 0.849040E+00 + PKER_RACCS ( 3, 13) = 0.101307E+01 + PKER_RACCS ( 3, 14) = 0.117592E+01 + PKER_RACCS ( 3, 15) = 0.132041E+01 + PKER_RACCS ( 3, 16) = 0.144256E+01 + PKER_RACCS ( 3, 17) = 0.154410E+01 + PKER_RACCS ( 3, 18) = 0.162816E+01 + PKER_RACCS ( 3, 19) = 0.169770E+01 + PKER_RACCS ( 3, 20) = 0.175523E+01 + PKER_RACCS ( 3, 21) = 0.180284E+01 + PKER_RACCS ( 3, 22) = 0.184222E+01 + PKER_RACCS ( 3, 23) = 0.187482E+01 + PKER_RACCS ( 3, 24) = 0.190179E+01 + PKER_RACCS ( 3, 25) = 0.192411E+01 + PKER_RACCS ( 3, 26) = 0.194259E+01 + PKER_RACCS ( 3, 27) = 0.195788E+01 + PKER_RACCS ( 3, 28) = 0.197054E+01 + PKER_RACCS ( 3, 29) = 0.198101E+01 + PKER_RACCS ( 3, 30) = 0.198968E+01 + PKER_RACCS ( 3, 31) = 0.199686E+01 + PKER_RACCS ( 3, 32) = 0.200280E+01 + PKER_RACCS ( 3, 33) = 0.200772E+01 + PKER_RACCS ( 3, 34) = 0.201179E+01 + PKER_RACCS ( 3, 35) = 0.201516E+01 + PKER_RACCS ( 3, 36) = 0.201795E+01 + PKER_RACCS ( 3, 37) = 0.202026E+01 + PKER_RACCS ( 3, 38) = 0.202217E+01 + PKER_RACCS ( 3, 39) = 0.202375E+01 + PKER_RACCS ( 3, 40) = 0.202506E+01 + PKER_RACCS ( 4, 1) = 0.890193E+01 + PKER_RACCS ( 4, 2) = 0.691781E+01 + PKER_RACCS ( 4, 3) = 0.531713E+01 + PKER_RACCS ( 4, 4) = 0.402519E+01 + PKER_RACCS ( 4, 5) = 0.298590E+01 + PKER_RACCS ( 4, 6) = 0.216006E+01 + PKER_RACCS ( 4, 7) = 0.152334E+01 + PKER_RACCS ( 4, 8) = 0.106334E+01 + PKER_RACCS ( 4, 9) = 0.773535E+00 + PKER_RACCS ( 4, 10) = 0.643200E+00 + PKER_RACCS ( 4, 11) = 0.648455E+00 + PKER_RACCS ( 4, 12) = 0.748702E+00 + PKER_RACCS ( 4, 13) = 0.896286E+00 + PKER_RACCS ( 4, 14) = 0.105225E+01 + PKER_RACCS ( 4, 15) = 0.119469E+01 + PKER_RACCS ( 4, 16) = 0.131651E+01 + PKER_RACCS ( 4, 17) = 0.141813E+01 + PKER_RACCS ( 4, 18) = 0.150231E+01 + PKER_RACCS ( 4, 19) = 0.157195E+01 + PKER_RACCS ( 4, 20) = 0.162955E+01 + PKER_RACCS ( 4, 21) = 0.167720E+01 + PKER_RACCS ( 4, 22) = 0.171662E+01 + PKER_RACCS ( 4, 23) = 0.174924E+01 + PKER_RACCS ( 4, 24) = 0.177624E+01 + PKER_RACCS ( 4, 25) = 0.179858E+01 + PKER_RACCS ( 4, 26) = 0.181706E+01 + PKER_RACCS ( 4, 27) = 0.183237E+01 + PKER_RACCS ( 4, 28) = 0.184503E+01 + PKER_RACCS ( 4, 29) = 0.185551E+01 + PKER_RACCS ( 4, 30) = 0.186419E+01 + PKER_RACCS ( 4, 31) = 0.187137E+01 + PKER_RACCS ( 4, 32) = 0.187731E+01 + PKER_RACCS ( 4, 33) = 0.188223E+01 + PKER_RACCS ( 4, 34) = 0.188630E+01 + PKER_RACCS ( 4, 35) = 0.188967E+01 + PKER_RACCS ( 4, 36) = 0.189246E+01 + PKER_RACCS ( 4, 37) = 0.189477E+01 + PKER_RACCS ( 4, 38) = 0.189668E+01 + PKER_RACCS ( 4, 39) = 0.189826E+01 + PKER_RACCS ( 4, 40) = 0.189957E+01 + PKER_RACCS ( 5, 1) = 0.920977E+01 + PKER_RACCS ( 5, 2) = 0.716900E+01 + PKER_RACCS ( 5, 3) = 0.552588E+01 + PKER_RACCS ( 5, 4) = 0.420224E+01 + PKER_RACCS ( 5, 5) = 0.313744E+01 + PKER_RACCS ( 5, 6) = 0.228804E+01 + PKER_RACCS ( 5, 7) = 0.162515E+01 + PKER_RACCS ( 5, 8) = 0.113305E+01 + PKER_RACCS ( 5, 9) = 0.804245E+00 + PKER_RACCS ( 5, 10) = 0.630831E+00 + PKER_RACCS ( 5, 11) = 0.594727E+00 + PKER_RACCS ( 5, 12) = 0.662791E+00 + PKER_RACCS ( 5, 13) = 0.790719E+00 + PKER_RACCS ( 5, 14) = 0.937530E+00 + PKER_RACCS ( 5, 15) = 0.107695E+01 + PKER_RACCS ( 5, 16) = 0.119816E+01 + PKER_RACCS ( 5, 17) = 0.129982E+01 + PKER_RACCS ( 5, 18) = 0.138414E+01 + PKER_RACCS ( 5, 19) = 0.145388E+01 + PKER_RACCS ( 5, 20) = 0.151157E+01 + PKER_RACCS ( 5, 21) = 0.155928E+01 + PKER_RACCS ( 5, 22) = 0.159875E+01 + PKER_RACCS ( 5, 23) = 0.163140E+01 + PKER_RACCS ( 5, 24) = 0.165842E+01 + PKER_RACCS ( 5, 25) = 0.168078E+01 + PKER_RACCS ( 5, 26) = 0.169928E+01 + PKER_RACCS ( 5, 27) = 0.171459E+01 + PKER_RACCS ( 5, 28) = 0.172727E+01 + PKER_RACCS ( 5, 29) = 0.173775E+01 + PKER_RACCS ( 5, 30) = 0.174643E+01 + PKER_RACCS ( 5, 31) = 0.175362E+01 + PKER_RACCS ( 5, 32) = 0.175957E+01 + PKER_RACCS ( 5, 33) = 0.176449E+01 + PKER_RACCS ( 5, 34) = 0.176856E+01 + PKER_RACCS ( 5, 35) = 0.177193E+01 + PKER_RACCS ( 5, 36) = 0.177472E+01 + PKER_RACCS ( 5, 37) = 0.177703E+01 + PKER_RACCS ( 5, 38) = 0.177895E+01 + PKER_RACCS ( 5, 39) = 0.178053E+01 + PKER_RACCS ( 5, 40) = 0.178184E+01 + PKER_RACCS ( 6, 1) = 0.954082E+01 + PKER_RACCS ( 6, 2) = 0.743810E+01 + PKER_RACCS ( 6, 3) = 0.574728E+01 + PKER_RACCS ( 6, 4) = 0.438753E+01 + PKER_RACCS ( 6, 5) = 0.329456E+01 + PKER_RACCS ( 6, 6) = 0.242082E+01 + PKER_RACCS ( 6, 7) = 0.173320E+01 + PKER_RACCS ( 6, 8) = 0.121220E+01 + PKER_RACCS ( 6, 9) = 0.848100E+00 + PKER_RACCS ( 6, 10) = 0.633831E+00 + PKER_RACCS ( 6, 11) = 0.557416E+00 + PKER_RACCS ( 6, 12) = 0.591242E+00 + PKER_RACCS ( 6, 13) = 0.696457E+00 + PKER_RACCS ( 6, 14) = 0.831746E+00 + PKER_RACCS ( 6, 15) = 0.966879E+00 + PKER_RACCS ( 6, 16) = 0.108705E+01 + PKER_RACCS ( 6, 17) = 0.118868E+01 + PKER_RACCS ( 6, 18) = 0.127314E+01 + PKER_RACCS ( 6, 19) = 0.134302E+01 + PKER_RACCS ( 6, 20) = 0.140081E+01 + PKER_RACCS ( 6, 21) = 0.144859E+01 + PKER_RACCS ( 6, 22) = 0.148812E+01 + PKER_RACCS ( 6, 23) = 0.152081E+01 + PKER_RACCS ( 6, 24) = 0.154786E+01 + PKER_RACCS ( 6, 25) = 0.157025E+01 + PKER_RACCS ( 6, 26) = 0.158876E+01 + PKER_RACCS ( 6, 27) = 0.160409E+01 + PKER_RACCS ( 6, 28) = 0.161677E+01 + PKER_RACCS ( 6, 29) = 0.162727E+01 + PKER_RACCS ( 6, 30) = 0.163595E+01 + PKER_RACCS ( 6, 31) = 0.164314E+01 + PKER_RACCS ( 6, 32) = 0.164909E+01 + PKER_RACCS ( 6, 33) = 0.165402E+01 + PKER_RACCS ( 6, 34) = 0.165809E+01 + PKER_RACCS ( 6, 35) = 0.166147E+01 + PKER_RACCS ( 6, 36) = 0.166426E+01 + PKER_RACCS ( 6, 37) = 0.166657E+01 + PKER_RACCS ( 6, 38) = 0.166848E+01 + PKER_RACCS ( 6, 39) = 0.167007E+01 + PKER_RACCS ( 6, 40) = 0.167138E+01 + PKER_RACCS ( 7, 1) = 0.989299E+01 + PKER_RACCS ( 7, 2) = 0.772578E+01 + PKER_RACCS ( 7, 3) = 0.598316E+01 + PKER_RACCS ( 7, 4) = 0.458298E+01 + PKER_RACCS ( 7, 5) = 0.345874E+01 + PKER_RACCS ( 7, 6) = 0.255904E+01 + PKER_RACCS ( 7, 7) = 0.184707E+01 + PKER_RACCS ( 7, 8) = 0.129931E+01 + PKER_RACCS ( 7, 9) = 0.903048E+00 + PKER_RACCS ( 7, 10) = 0.651461E+00 + PKER_RACCS ( 7, 11) = 0.535102E+00 + PKER_RACCS ( 7, 12) = 0.533793E+00 + PKER_RACCS ( 7, 13) = 0.613816E+00 + PKER_RACCS ( 7, 14) = 0.735010E+00 + PKER_RACCS ( 7, 15) = 0.864301E+00 + PKER_RACCS ( 7, 16) = 0.982807E+00 + PKER_RACCS ( 7, 17) = 0.108425E+01 + PKER_RACCS ( 7, 18) = 0.116886E+01 + PKER_RACCS ( 7, 19) = 0.123890E+01 + PKER_RACCS ( 7, 20) = 0.129681E+01 + PKER_RACCS ( 7, 21) = 0.134469E+01 + PKER_RACCS ( 7, 22) = 0.138428E+01 + PKER_RACCS ( 7, 23) = 0.141702E+01 + PKER_RACCS ( 7, 24) = 0.144411E+01 + PKER_RACCS ( 7, 25) = 0.146652E+01 + PKER_RACCS ( 7, 26) = 0.148506E+01 + PKER_RACCS ( 7, 27) = 0.150040E+01 + PKER_RACCS ( 7, 28) = 0.151309E+01 + PKER_RACCS ( 7, 29) = 0.152360E+01 + PKER_RACCS ( 7, 30) = 0.153229E+01 + PKER_RACCS ( 7, 31) = 0.153949E+01 + PKER_RACCS ( 7, 32) = 0.154544E+01 + PKER_RACCS ( 7, 33) = 0.155037E+01 + PKER_RACCS ( 7, 34) = 0.155445E+01 + PKER_RACCS ( 7, 35) = 0.155782E+01 + PKER_RACCS ( 7, 36) = 0.156062E+01 + PKER_RACCS ( 7, 37) = 0.156293E+01 + PKER_RACCS ( 7, 38) = 0.156484E+01 + PKER_RACCS ( 7, 39) = 0.156643E+01 + PKER_RACCS ( 7, 40) = 0.156774E+01 + PKER_RACCS ( 8, 1) = 0.102606E+02 + PKER_RACCS ( 8, 2) = 0.803025E+01 + PKER_RACCS ( 8, 3) = 0.623398E+01 + PKER_RACCS ( 8, 4) = 0.479013E+01 + PKER_RACCS ( 8, 5) = 0.363141E+01 + PKER_RACCS ( 8, 6) = 0.270370E+01 + PKER_RACCS ( 8, 7) = 0.196690E+01 + PKER_RACCS ( 8, 8) = 0.139353E+01 + PKER_RACCS ( 8, 9) = 0.967762E+00 + PKER_RACCS ( 8, 10) = 0.681746E+00 + PKER_RACCS ( 8, 11) = 0.527901E+00 + PKER_RACCS ( 8, 12) = 0.491036E+00 + PKER_RACCS ( 8, 13) = 0.543394E+00 + PKER_RACCS ( 8, 14) = 0.647673E+00 + PKER_RACCS ( 8, 15) = 0.769109E+00 + PKER_RACCS ( 8, 16) = 0.885089E+00 + PKER_RACCS ( 8, 17) = 0.986107E+00 + PKER_RACCS ( 8, 18) = 0.107085E+01 + PKER_RACCS ( 8, 19) = 0.114108E+01 + PKER_RACCS ( 8, 20) = 0.119914E+01 + PKER_RACCS ( 8, 21) = 0.124712E+01 + PKER_RACCS ( 8, 22) = 0.128680E+01 + PKER_RACCS ( 8, 23) = 0.131960E+01 + PKER_RACCS ( 8, 24) = 0.134673E+01 + PKER_RACCS ( 8, 25) = 0.136917E+01 + PKER_RACCS ( 8, 26) = 0.138774E+01 + PKER_RACCS ( 8, 27) = 0.140310E+01 + PKER_RACCS ( 8, 28) = 0.141581E+01 + PKER_RACCS ( 8, 29) = 0.142633E+01 + PKER_RACCS ( 8, 30) = 0.143503E+01 + PKER_RACCS ( 8, 31) = 0.144223E+01 + PKER_RACCS ( 8, 32) = 0.144819E+01 + PKER_RACCS ( 8, 33) = 0.145312E+01 + PKER_RACCS ( 8, 34) = 0.145720E+01 + PKER_RACCS ( 8, 35) = 0.146058E+01 + PKER_RACCS ( 8, 36) = 0.146338E+01 + PKER_RACCS ( 8, 37) = 0.146569E+01 + PKER_RACCS ( 8, 38) = 0.146761E+01 + PKER_RACCS ( 8, 39) = 0.146919E+01 + PKER_RACCS ( 8, 40) = 0.147050E+01 + PKER_RACCS ( 9, 1) = 0.106345E+02 + PKER_RACCS ( 9, 2) = 0.834678E+01 + PKER_RACCS ( 9, 3) = 0.649814E+01 + PKER_RACCS ( 9, 4) = 0.500932E+01 + PKER_RACCS ( 9, 5) = 0.381363E+01 + PKER_RACCS ( 9, 6) = 0.285581E+01 + PKER_RACCS ( 9, 7) = 0.209316E+01 + PKER_RACCS ( 9, 8) = 0.149490E+01 + PKER_RACCS ( 9, 9) = 0.104191E+01 + PKER_RACCS ( 9, 10) = 0.724098E+00 + PKER_RACCS ( 9, 11) = 0.534431E+00 + PKER_RACCS ( 9, 12) = 0.462476E+00 + PKER_RACCS ( 9, 13) = 0.485184E+00 + PKER_RACCS ( 9, 14) = 0.569779E+00 + PKER_RACCS ( 9, 15) = 0.681282E+00 + PKER_RACCS ( 9, 16) = 0.793641E+00 + PKER_RACCS ( 9, 17) = 0.893878E+00 + PKER_RACCS ( 9, 18) = 0.978690E+00 + PKER_RACCS ( 9, 19) = 0.104914E+01 + PKER_RACCS ( 9, 20) = 0.110738E+01 + PKER_RACCS ( 9, 21) = 0.115550E+01 + PKER_RACCS ( 9, 22) = 0.119527E+01 + PKER_RACCS ( 9, 23) = 0.122815E+01 + PKER_RACCS ( 9, 24) = 0.125533E+01 + PKER_RACCS ( 9, 25) = 0.127782E+01 + PKER_RACCS ( 9, 26) = 0.129641E+01 + PKER_RACCS ( 9, 27) = 0.131179E+01 + PKER_RACCS ( 9, 28) = 0.132452E+01 + PKER_RACCS ( 9, 29) = 0.133505E+01 + PKER_RACCS ( 9, 30) = 0.134376E+01 + PKER_RACCS ( 9, 31) = 0.135097E+01 + PKER_RACCS ( 9, 32) = 0.135694E+01 + PKER_RACCS ( 9, 33) = 0.136188E+01 + PKER_RACCS ( 9, 34) = 0.136596E+01 + PKER_RACCS ( 9, 35) = 0.136934E+01 + PKER_RACCS ( 9, 36) = 0.137214E+01 + PKER_RACCS ( 9, 37) = 0.137446E+01 + PKER_RACCS ( 9, 38) = 0.137637E+01 + PKER_RACCS ( 9, 39) = 0.137796E+01 + PKER_RACCS ( 9, 40) = 0.137927E+01 + PKER_RACCS ( 10, 1) = 0.110031E+02 + PKER_RACCS ( 10, 2) = 0.866775E+01 + PKER_RACCS ( 10, 3) = 0.677164E+01 + PKER_RACCS ( 10, 4) = 0.523918E+01 + PKER_RACCS ( 10, 5) = 0.400557E+01 + PKER_RACCS ( 10, 6) = 0.301605E+01 + PKER_RACCS ( 10, 7) = 0.222631E+01 + PKER_RACCS ( 10, 8) = 0.160312E+01 + PKER_RACCS ( 10, 9) = 0.112426E+01 + PKER_RACCS ( 10, 10) = 0.776925E+00 + PKER_RACCS ( 10, 11) = 0.554023E+00 + PKER_RACCS ( 10, 12) = 0.447142E+00 + PKER_RACCS ( 10, 13) = 0.439159E+00 + PKER_RACCS ( 10, 14) = 0.501788E+00 + PKER_RACCS ( 10, 15) = 0.601002E+00 + PKER_RACCS ( 10, 16) = 0.708335E+00 + PKER_RACCS ( 10, 17) = 0.807233E+00 + PKER_RACCS ( 10, 18) = 0.892004E+00 + PKER_RACCS ( 10, 19) = 0.962681E+00 + PKER_RACCS ( 10, 20) = 0.102114E+01 + PKER_RACCS ( 10, 21) = 0.106943E+01 + PKER_RACCS ( 10, 22) = 0.110932E+01 + PKER_RACCS ( 10, 23) = 0.114228E+01 + PKER_RACCS ( 10, 24) = 0.116953E+01 + PKER_RACCS ( 10, 25) = 0.119207E+01 + PKER_RACCS ( 10, 26) = 0.121070E+01 + PKER_RACCS ( 10, 27) = 0.122611E+01 + PKER_RACCS ( 10, 28) = 0.123886E+01 + PKER_RACCS ( 10, 29) = 0.124940E+01 + PKER_RACCS ( 10, 30) = 0.125813E+01 + PKER_RACCS ( 10, 31) = 0.126535E+01 + PKER_RACCS ( 10, 32) = 0.127132E+01 + PKER_RACCS ( 10, 33) = 0.127626E+01 + PKER_RACCS ( 10, 34) = 0.128035E+01 + PKER_RACCS ( 10, 35) = 0.128374E+01 + PKER_RACCS ( 10, 36) = 0.128654E+01 + PKER_RACCS ( 10, 37) = 0.128886E+01 + PKER_RACCS ( 10, 38) = 0.129077E+01 + PKER_RACCS ( 10, 39) = 0.129236E+01 + PKER_RACCS ( 10, 40) = 0.129368E+01 + PKER_RACCS ( 11, 1) = 0.113549E+02 + PKER_RACCS ( 11, 2) = 0.898364E+01 + PKER_RACCS ( 11, 3) = 0.704811E+01 + PKER_RACCS ( 11, 4) = 0.547629E+01 + PKER_RACCS ( 11, 5) = 0.420604E+01 + PKER_RACCS ( 11, 6) = 0.318436E+01 + PKER_RACCS ( 11, 7) = 0.236670E+01 + PKER_RACCS ( 11, 8) = 0.171835E+01 + PKER_RACCS ( 11, 9) = 0.121434E+01 + PKER_RACCS ( 11, 10) = 0.839328E+00 + PKER_RACCS ( 11, 11) = 0.585308E+00 + PKER_RACCS ( 11, 12) = 0.445062E+00 + PKER_RACCS ( 11, 13) = 0.405828E+00 + PKER_RACCS ( 11, 14) = 0.444237E+00 + PKER_RACCS ( 11, 15) = 0.528618E+00 + PKER_RACCS ( 11, 16) = 0.629105E+00 + PKER_RACCS ( 11, 17) = 0.725893E+00 + PKER_RACCS ( 11, 18) = 0.810425E+00 + PKER_RACCS ( 11, 19) = 0.881336E+00 + PKER_RACCS ( 11, 20) = 0.940053E+00 + PKER_RACCS ( 11, 21) = 0.988540E+00 + PKER_RACCS ( 11, 22) = 0.102858E+01 + PKER_RACCS ( 11, 23) = 0.106165E+01 + PKER_RACCS ( 11, 24) = 0.108898E+01 + PKER_RACCS ( 11, 25) = 0.111157E+01 + PKER_RACCS ( 11, 26) = 0.113025E+01 + PKER_RACCS ( 11, 27) = 0.114569E+01 + PKER_RACCS ( 11, 28) = 0.115847E+01 + PKER_RACCS ( 11, 29) = 0.116903E+01 + PKER_RACCS ( 11, 30) = 0.117777E+01 + PKER_RACCS ( 11, 31) = 0.118500E+01 + PKER_RACCS ( 11, 32) = 0.119098E+01 + PKER_RACCS ( 11, 33) = 0.119593E+01 + PKER_RACCS ( 11, 34) = 0.120003E+01 + PKER_RACCS ( 11, 35) = 0.120342E+01 + PKER_RACCS ( 11, 36) = 0.120622E+01 + PKER_RACCS ( 11, 37) = 0.120854E+01 + PKER_RACCS ( 11, 38) = 0.121046E+01 + PKER_RACCS ( 11, 39) = 0.121205E+01 + PKER_RACCS ( 11, 40) = 0.121337E+01 + PKER_RACCS ( 12, 1) = 0.116799E+02 + PKER_RACCS ( 12, 2) = 0.928469E+01 + PKER_RACCS ( 12, 3) = 0.731960E+01 + PKER_RACCS ( 12, 4) = 0.571522E+01 + PKER_RACCS ( 12, 5) = 0.441213E+01 + PKER_RACCS ( 12, 6) = 0.335956E+01 + PKER_RACCS ( 12, 7) = 0.251408E+01 + PKER_RACCS ( 12, 8) = 0.184047E+01 + PKER_RACCS ( 12, 9) = 0.131203E+01 + PKER_RACCS ( 12, 10) = 0.911145E+00 + PKER_RACCS ( 12, 11) = 0.627927E+00 + PKER_RACCS ( 12, 12) = 0.455629E+00 + PKER_RACCS ( 12, 13) = 0.385139E+00 + PKER_RACCS ( 12, 14) = 0.397299E+00 + PKER_RACCS ( 12, 15) = 0.464231E+00 + PKER_RACCS ( 12, 16) = 0.555964E+00 + PKER_RACCS ( 12, 17) = 0.649649E+00 + PKER_RACCS ( 12, 18) = 0.733631E+00 + PKER_RACCS ( 12, 19) = 0.804744E+00 + PKER_RACCS ( 12, 20) = 0.863761E+00 + PKER_RACCS ( 12, 21) = 0.912491E+00 + PKER_RACCS ( 12, 22) = 0.952708E+00 + PKER_RACCS ( 12, 23) = 0.985912E+00 + PKER_RACCS ( 12, 24) = 0.101334E+01 + PKER_RACCS ( 12, 25) = 0.103600E+01 + PKER_RACCS ( 12, 26) = 0.105473E+01 + PKER_RACCS ( 12, 27) = 0.107022E+01 + PKER_RACCS ( 12, 28) = 0.108302E+01 + PKER_RACCS ( 12, 29) = 0.109361E+01 + PKER_RACCS ( 12, 30) = 0.110236E+01 + PKER_RACCS ( 12, 31) = 0.110961E+01 + PKER_RACCS ( 12, 32) = 0.111560E+01 + PKER_RACCS ( 12, 33) = 0.112056E+01 + PKER_RACCS ( 12, 34) = 0.112466E+01 + PKER_RACCS ( 12, 35) = 0.112805E+01 + PKER_RACCS ( 12, 36) = 0.113086E+01 + PKER_RACCS ( 12, 37) = 0.113319E+01 + PKER_RACCS ( 12, 38) = 0.113511E+01 + PKER_RACCS ( 12, 39) = 0.113670E+01 + PKER_RACCS ( 12, 40) = 0.113802E+01 + PKER_RACCS ( 13, 1) = 0.119715E+02 + PKER_RACCS ( 13, 2) = 0.956269E+01 + PKER_RACCS ( 13, 3) = 0.757802E+01 + PKER_RACCS ( 13, 4) = 0.594935E+01 + PKER_RACCS ( 13, 5) = 0.461927E+01 + PKER_RACCS ( 13, 6) = 0.353911E+01 + PKER_RACCS ( 13, 7) = 0.266730E+01 + PKER_RACCS ( 13, 8) = 0.196897E+01 + PKER_RACCS ( 13, 9) = 0.141674E+01 + PKER_RACCS ( 13, 10) = 0.991267E+00 + PKER_RACCS ( 13, 11) = 0.680645E+00 + PKER_RACCS ( 13, 12) = 0.478159E+00 + PKER_RACCS ( 13, 13) = 0.376423E+00 + PKER_RACCS ( 13, 14) = 0.361128E+00 + PKER_RACCS ( 13, 15) = 0.408438E+00 + PKER_RACCS ( 13, 16) = 0.489166E+00 + PKER_RACCS ( 13, 17) = 0.578426E+00 + PKER_RACCS ( 13, 18) = 0.661345E+00 + PKER_RACCS ( 13, 19) = 0.732571E+00 + PKER_RACCS ( 13, 20) = 0.791923E+00 + PKER_RACCS ( 13, 21) = 0.840945E+00 + PKER_RACCS ( 13, 22) = 0.881381E+00 + PKER_RACCS ( 13, 23) = 0.914745E+00 + PKER_RACCS ( 13, 24) = 0.942288E+00 + PKER_RACCS ( 13, 25) = 0.965037E+00 + PKER_RACCS ( 13, 26) = 0.983832E+00 + PKER_RACCS ( 13, 27) = 0.999365E+00 + PKER_RACCS ( 13, 28) = 0.101221E+01 + PKER_RACCS ( 13, 29) = 0.102282E+01 + PKER_RACCS ( 13, 30) = 0.103160E+01 + PKER_RACCS ( 13, 31) = 0.103886E+01 + PKER_RACCS ( 13, 32) = 0.104487E+01 + PKER_RACCS ( 13, 33) = 0.104983E+01 + PKER_RACCS ( 13, 34) = 0.105394E+01 + PKER_RACCS ( 13, 35) = 0.105734E+01 + PKER_RACCS ( 13, 36) = 0.106016E+01 + PKER_RACCS ( 13, 37) = 0.106248E+01 + PKER_RACCS ( 13, 38) = 0.106441E+01 + PKER_RACCS ( 13, 39) = 0.106600E+01 + PKER_RACCS ( 13, 40) = 0.106732E+01 + PKER_RACCS ( 14, 1) = 0.122269E+02 + PKER_RACCS ( 14, 2) = 0.981222E+01 + PKER_RACCS ( 14, 3) = 0.781657E+01 + PKER_RACCS ( 14, 4) = 0.617190E+01 + PKER_RACCS ( 14, 5) = 0.482183E+01 + PKER_RACCS ( 14, 6) = 0.371915E+01 + PKER_RACCS ( 14, 7) = 0.282402E+01 + PKER_RACCS ( 14, 8) = 0.210269E+01 + PKER_RACCS ( 14, 9) = 0.152785E+01 + PKER_RACCS ( 14, 10) = 0.107897E+01 + PKER_RACCS ( 14, 11) = 0.742682E+00 + PKER_RACCS ( 14, 12) = 0.511717E+00 + PKER_RACCS ( 14, 13) = 0.379723E+00 + PKER_RACCS ( 14, 14) = 0.336223E+00 + PKER_RACCS ( 14, 15) = 0.361708E+00 + PKER_RACCS ( 14, 16) = 0.429063E+00 + PKER_RACCS ( 14, 17) = 0.512196E+00 + PKER_RACCS ( 14, 18) = 0.593334E+00 + PKER_RACCS ( 14, 19) = 0.664504E+00 + PKER_RACCS ( 14, 20) = 0.724213E+00 + PKER_RACCS ( 14, 21) = 0.773584E+00 + PKER_RACCS ( 14, 22) = 0.814286E+00 + PKER_RACCS ( 14, 23) = 0.847845E+00 + PKER_RACCS ( 14, 24) = 0.875531E+00 + PKER_RACCS ( 14, 25) = 0.898385E+00 + PKER_RACCS ( 14, 26) = 0.917258E+00 + PKER_RACCS ( 14, 27) = 0.932850E+00 + PKER_RACCS ( 14, 28) = 0.945734E+00 + PKER_RACCS ( 14, 29) = 0.956384E+00 + PKER_RACCS ( 14, 30) = 0.965189E+00 + PKER_RACCS ( 14, 31) = 0.972469E+00 + PKER_RACCS ( 14, 32) = 0.978490E+00 + PKER_RACCS ( 14, 33) = 0.983469E+00 + PKER_RACCS ( 14, 34) = 0.987588E+00 + PKER_RACCS ( 14, 35) = 0.990995E+00 + PKER_RACCS ( 14, 36) = 0.993813E+00 + PKER_RACCS ( 14, 37) = 0.996145E+00 + PKER_RACCS ( 14, 38) = 0.998074E+00 + PKER_RACCS ( 14, 39) = 0.999670E+00 + PKER_RACCS ( 14, 40) = 0.100099E+01 + PKER_RACCS ( 15, 1) = 0.124464E+02 + PKER_RACCS ( 15, 2) = 0.100310E+02 + PKER_RACCS ( 15, 3) = 0.803077E+01 + PKER_RACCS ( 15, 4) = 0.637725E+01 + PKER_RACCS ( 15, 5) = 0.501415E+01 + PKER_RACCS ( 15, 6) = 0.389492E+01 + PKER_RACCS ( 15, 7) = 0.298087E+01 + PKER_RACCS ( 15, 8) = 0.223947E+01 + PKER_RACCS ( 15, 9) = 0.164395E+01 + PKER_RACCS ( 15, 10) = 0.117348E+01 + PKER_RACCS ( 15, 11) = 0.813603E+00 + PKER_RACCS ( 15, 12) = 0.555940E+00 + PKER_RACCS ( 15, 13) = 0.394860E+00 + PKER_RACCS ( 15, 14) = 0.322907E+00 + PKER_RACCS ( 15, 15) = 0.324503E+00 + PKER_RACCS ( 15, 16) = 0.375896E+00 + PKER_RACCS ( 15, 17) = 0.451039E+00 + PKER_RACCS ( 15, 18) = 0.529435E+00 + PKER_RACCS ( 15, 19) = 0.600261E+00 + PKER_RACCS ( 15, 20) = 0.660320E+00 + PKER_RACCS ( 15, 21) = 0.710100E+00 + PKER_RACCS ( 15, 22) = 0.751124E+00 + PKER_RACCS ( 15, 23) = 0.784920E+00 + PKER_RACCS ( 15, 24) = 0.812780E+00 + PKER_RACCS ( 15, 25) = 0.835762E+00 + PKER_RACCS ( 15, 26) = 0.854730E+00 + PKER_RACCS ( 15, 27) = 0.870393E+00 + PKER_RACCS ( 15, 28) = 0.883331E+00 + PKER_RACCS ( 15, 29) = 0.894022E+00 + PKER_RACCS ( 15, 30) = 0.902857E+00 + PKER_RACCS ( 15, 31) = 0.910161E+00 + PKER_RACCS ( 15, 32) = 0.916200E+00 + PKER_RACCS ( 15, 33) = 0.921193E+00 + PKER_RACCS ( 15, 34) = 0.925323E+00 + PKER_RACCS ( 15, 35) = 0.928738E+00 + PKER_RACCS ( 15, 36) = 0.931563E+00 + PKER_RACCS ( 15, 37) = 0.933900E+00 + PKER_RACCS ( 15, 38) = 0.935833E+00 + PKER_RACCS ( 15, 39) = 0.937432E+00 + PKER_RACCS ( 15, 40) = 0.938755E+00 + PKER_RACCS ( 16, 1) = 0.126327E+02 + PKER_RACCS ( 16, 2) = 0.102194E+02 + PKER_RACCS ( 16, 3) = 0.821876E+01 + PKER_RACCS ( 16, 4) = 0.656171E+01 + PKER_RACCS ( 16, 5) = 0.519153E+01 + PKER_RACCS ( 16, 6) = 0.406164E+01 + PKER_RACCS ( 16, 7) = 0.313379E+01 + PKER_RACCS ( 16, 8) = 0.237630E+01 + PKER_RACCS ( 16, 9) = 0.176301E+01 + PKER_RACCS ( 16, 10) = 0.127321E+01 + PKER_RACCS ( 16, 11) = 0.891908E+00 + PKER_RACCS ( 16, 12) = 0.609619E+00 + PKER_RACCS ( 16, 13) = 0.421108E+00 + PKER_RACCS ( 16, 14) = 0.320728E+00 + PKER_RACCS ( 16, 15) = 0.297097E+00 + PKER_RACCS ( 16, 16) = 0.330361E+00 + PKER_RACCS ( 16, 17) = 0.395280E+00 + PKER_RACCS ( 16, 18) = 0.469630E+00 + PKER_RACCS ( 16, 19) = 0.539613E+00 + PKER_RACCS ( 16, 20) = 0.599949E+00 + PKER_RACCS ( 16, 21) = 0.650193E+00 + PKER_RACCS ( 16, 22) = 0.691608E+00 + PKER_RACCS ( 16, 23) = 0.725693E+00 + PKER_RACCS ( 16, 24) = 0.753765E+00 + PKER_RACCS ( 16, 25) = 0.776902E+00 + PKER_RACCS ( 16, 26) = 0.795985E+00 + PKER_RACCS ( 16, 27) = 0.811734E+00 + PKER_RACCS ( 16, 28) = 0.824737E+00 + PKER_RACCS ( 16, 29) = 0.835476E+00 + PKER_RACCS ( 16, 30) = 0.844348E+00 + PKER_RACCS ( 16, 31) = 0.851681E+00 + PKER_RACCS ( 16, 32) = 0.857741E+00 + PKER_RACCS ( 16, 33) = 0.862751E+00 + PKER_RACCS ( 16, 34) = 0.866894E+00 + PKER_RACCS ( 16, 35) = 0.870319E+00 + PKER_RACCS ( 16, 36) = 0.873152E+00 + PKER_RACCS ( 16, 37) = 0.875495E+00 + PKER_RACCS ( 16, 38) = 0.877433E+00 + PKER_RACCS ( 16, 39) = 0.879036E+00 + PKER_RACCS ( 16, 40) = 0.880362E+00 + PKER_RACCS ( 17, 1) = 0.127896E+02 + PKER_RACCS ( 17, 2) = 0.103796E+02 + PKER_RACCS ( 17, 3) = 0.838093E+01 + PKER_RACCS ( 17, 4) = 0.672380E+01 + PKER_RACCS ( 17, 5) = 0.535093E+01 + PKER_RACCS ( 17, 6) = 0.421538E+01 + PKER_RACCS ( 17, 7) = 0.327875E+01 + PKER_RACCS ( 17, 8) = 0.250965E+01 + PKER_RACCS ( 17, 9) = 0.188231E+01 + PKER_RACCS ( 17, 10) = 0.137624E+01 + PKER_RACCS ( 17, 11) = 0.976041E+00 + PKER_RACCS ( 17, 12) = 0.671601E+00 + PKER_RACCS ( 17, 13) = 0.457610E+00 + PKER_RACCS ( 17, 14) = 0.329677E+00 + PKER_RACCS ( 17, 15) = 0.280046E+00 + PKER_RACCS ( 17, 16) = 0.292981E+00 + PKER_RACCS ( 17, 17) = 0.345338E+00 + PKER_RACCS ( 17, 18) = 0.413953E+00 + PKER_RACCS ( 17, 19) = 0.482373E+00 + PKER_RACCS ( 17, 20) = 0.542827E+00 + PKER_RACCS ( 17, 21) = 0.593577E+00 + PKER_RACCS ( 17, 22) = 0.635456E+00 + PKER_RACCS ( 17, 23) = 0.669894E+00 + PKER_RACCS ( 17, 24) = 0.698224E+00 + PKER_RACCS ( 17, 25) = 0.721550E+00 + PKER_RACCS ( 17, 26) = 0.740773E+00 + PKER_RACCS ( 17, 27) = 0.756626E+00 + PKER_RACCS ( 17, 28) = 0.769706E+00 + PKER_RACCS ( 17, 29) = 0.780504E+00 + PKER_RACCS ( 17, 30) = 0.789421E+00 + PKER_RACCS ( 17, 31) = 0.796788E+00 + PKER_RACCS ( 17, 32) = 0.802874E+00 + PKER_RACCS ( 17, 33) = 0.807905E+00 + PKER_RACCS ( 17, 34) = 0.812063E+00 + PKER_RACCS ( 17, 35) = 0.815500E+00 + PKER_RACCS ( 17, 36) = 0.818342E+00 + PKER_RACCS ( 17, 37) = 0.820693E+00 + PKER_RACCS ( 17, 38) = 0.822636E+00 + PKER_RACCS ( 17, 39) = 0.824244E+00 + PKER_RACCS ( 17, 40) = 0.825573E+00 + PKER_RACCS ( 18, 1) = 0.129213E+02 + PKER_RACCS ( 18, 2) = 0.105149E+02 + PKER_RACCS ( 18, 3) = 0.851921E+01 + PKER_RACCS ( 18, 4) = 0.686389E+01 + PKER_RACCS ( 18, 5) = 0.549117E+01 + PKER_RACCS ( 18, 6) = 0.435362E+01 + PKER_RACCS ( 18, 7) = 0.341243E+01 + PKER_RACCS ( 18, 8) = 0.263602E+01 + PKER_RACCS ( 18, 9) = 0.199868E+01 + PKER_RACCS ( 18, 10) = 0.147991E+01 + PKER_RACCS ( 18, 11) = 0.106410E+01 + PKER_RACCS ( 18, 12) = 0.740604E+00 + PKER_RACCS ( 18, 13) = 0.503591E+00 + PKER_RACCS ( 18, 14) = 0.349646E+00 + PKER_RACCS ( 18, 15) = 0.273846E+00 + PKER_RACCS ( 18, 16) = 0.264450E+00 + PKER_RACCS ( 18, 17) = 0.301632E+00 + PKER_RACCS ( 18, 18) = 0.362584E+00 + PKER_RACCS ( 18, 19) = 0.428436E+00 + PKER_RACCS ( 18, 20) = 0.488711E+00 + PKER_RACCS ( 18, 21) = 0.539973E+00 + PKER_RACCS ( 18, 22) = 0.582398E+00 + PKER_RACCS ( 18, 23) = 0.617263E+00 + PKER_RACCS ( 18, 24) = 0.645906E+00 + PKER_RACCS ( 18, 25) = 0.669463E+00 + PKER_RACCS ( 18, 26) = 0.688855E+00 + PKER_RACCS ( 18, 27) = 0.704834E+00 + PKER_RACCS ( 18, 28) = 0.718008E+00 + PKER_RACCS ( 18, 29) = 0.728877E+00 + PKER_RACCS ( 18, 30) = 0.737848E+00 + PKER_RACCS ( 18, 31) = 0.745255E+00 + PKER_RACCS ( 18, 32) = 0.751373E+00 + PKER_RACCS ( 18, 33) = 0.756428E+00 + PKER_RACCS ( 18, 34) = 0.760604E+00 + PKER_RACCS ( 18, 35) = 0.764056E+00 + PKER_RACCS ( 18, 36) = 0.766910E+00 + PKER_RACCS ( 18, 37) = 0.769269E+00 + PKER_RACCS ( 18, 38) = 0.771219E+00 + PKER_RACCS ( 18, 39) = 0.772832E+00 + PKER_RACCS ( 18, 40) = 0.774166E+00 + PKER_RACCS ( 19, 1) = 0.130318E+02 + PKER_RACCS ( 19, 2) = 0.106289E+02 + PKER_RACCS ( 19, 3) = 0.863636E+01 + PKER_RACCS ( 19, 4) = 0.698365E+01 + PKER_RACCS ( 19, 5) = 0.561261E+01 + PKER_RACCS ( 19, 6) = 0.447539E+01 + PKER_RACCS ( 19, 7) = 0.353272E+01 + PKER_RACCS ( 19, 8) = 0.275260E+01 + PKER_RACCS ( 19, 9) = 0.210907E+01 + PKER_RACCS ( 19, 10) = 0.158135E+01 + PKER_RACCS ( 19, 11) = 0.115350E+01 + PKER_RACCS ( 19, 12) = 0.814363E+00 + PKER_RACCS ( 19, 13) = 0.557360E+00 + PKER_RACCS ( 19, 14) = 0.379586E+00 + PKER_RACCS ( 19, 15) = 0.278114E+00 + PKER_RACCS ( 19, 16) = 0.245146E+00 + PKER_RACCS ( 19, 17) = 0.264975E+00 + PKER_RACCS ( 19, 18) = 0.315944E+00 + PKER_RACCS ( 19, 19) = 0.377850E+00 + PKER_RACCS ( 19, 20) = 0.437417E+00 + PKER_RACCS ( 19, 21) = 0.489121E+00 + PKER_RACCS ( 19, 22) = 0.532165E+00 + PKER_RACCS ( 19, 23) = 0.567544E+00 + PKER_RACCS ( 19, 24) = 0.596569E+00 + PKER_RACCS ( 19, 25) = 0.620406E+00 + PKER_RACCS ( 19, 26) = 0.640004E+00 + PKER_RACCS ( 19, 27) = 0.656135E+00 + PKER_RACCS ( 19, 28) = 0.669424E+00 + PKER_RACCS ( 19, 29) = 0.680378E+00 + PKER_RACCS ( 19, 30) = 0.689414E+00 + PKER_RACCS ( 19, 31) = 0.696870E+00 + PKER_RACCS ( 19, 32) = 0.703026E+00 + PKER_RACCS ( 19, 33) = 0.708109E+00 + PKER_RACCS ( 19, 34) = 0.712308E+00 + PKER_RACCS ( 19, 35) = 0.715777E+00 + PKER_RACCS ( 19, 36) = 0.718644E+00 + PKER_RACCS ( 19, 37) = 0.721014E+00 + PKER_RACCS ( 19, 38) = 0.722972E+00 + PKER_RACCS ( 19, 39) = 0.724592E+00 + PKER_RACCS ( 19, 40) = 0.725930E+00 + PKER_RACCS ( 20, 1) = 0.131249E+02 + PKER_RACCS ( 20, 2) = 0.107250E+02 + PKER_RACCS ( 20, 3) = 0.873538E+01 + PKER_RACCS ( 20, 4) = 0.708543E+01 + PKER_RACCS ( 20, 5) = 0.571670E+01 + PKER_RACCS ( 20, 6) = 0.458105E+01 + PKER_RACCS ( 20, 7) = 0.363884E+01 + PKER_RACCS ( 20, 8) = 0.285761E+01 + PKER_RACCS ( 20, 9) = 0.221101E+01 + PKER_RACCS ( 20, 10) = 0.167782E+01 + PKER_RACCS ( 20, 11) = 0.124159E+01 + PKER_RACCS ( 20, 12) = 0.890407E+00 + PKER_RACCS ( 20, 13) = 0.616977E+00 + PKER_RACCS ( 20, 14) = 0.418242E+00 + PKER_RACCS ( 20, 15) = 0.292524E+00 + PKER_RACCS ( 20, 16) = 0.235581E+00 + PKER_RACCS ( 20, 17) = 0.235983E+00 + PKER_RACCS ( 20, 18) = 0.274591E+00 + PKER_RACCS ( 20, 19) = 0.330763E+00 + PKER_RACCS ( 20, 20) = 0.388819E+00 + PKER_RACCS ( 20, 21) = 0.440784E+00 + PKER_RACCS ( 20, 22) = 0.484500E+00 + PKER_RACCS ( 20, 23) = 0.520487E+00 + PKER_RACCS ( 20, 24) = 0.549976E+00 + PKER_RACCS ( 20, 25) = 0.574153E+00 + PKER_RACCS ( 20, 26) = 0.594001E+00 + PKER_RACCS ( 20, 27) = 0.610317E+00 + PKER_RACCS ( 20, 28) = 0.623744E+00 + PKER_RACCS ( 20, 29) = 0.634801E+00 + PKER_RACCS ( 20, 30) = 0.643915E+00 + PKER_RACCS ( 20, 31) = 0.651431E+00 + PKER_RACCS ( 20, 32) = 0.657631E+00 + PKER_RACCS ( 20, 33) = 0.662749E+00 + PKER_RACCS ( 20, 34) = 0.666975E+00 + PKER_RACCS ( 20, 35) = 0.670465E+00 + PKER_RACCS ( 20, 36) = 0.673348E+00 + PKER_RACCS ( 20, 37) = 0.675730E+00 + PKER_RACCS ( 20, 38) = 0.677698E+00 + PKER_RACCS ( 20, 39) = 0.679325E+00 + PKER_RACCS ( 20, 40) = 0.680670E+00 + PKER_RACCS ( 21, 1) = 0.132036E+02 + PKER_RACCS ( 21, 2) = 0.108062E+02 + PKER_RACCS ( 21, 3) = 0.881918E+01 + PKER_RACCS ( 21, 4) = 0.717177E+01 + PKER_RACCS ( 21, 5) = 0.580546E+01 + PKER_RACCS ( 21, 6) = 0.467187E+01 + PKER_RACCS ( 21, 7) = 0.373113E+01 + PKER_RACCS ( 21, 8) = 0.295042E+01 + PKER_RACCS ( 21, 9) = 0.230297E+01 + PKER_RACCS ( 21, 10) = 0.176711E+01 + PKER_RACCS ( 21, 11) = 0.132575E+01 + PKER_RACCS ( 21, 12) = 0.966211E+00 + PKER_RACCS ( 21, 13) = 0.680246E+00 + PKER_RACCS ( 21, 14) = 0.464064E+00 + PKER_RACCS ( 21, 15) = 0.316605E+00 + PKER_RACCS ( 21, 16) = 0.236157E+00 + PKER_RACCS ( 21, 17) = 0.215485E+00 + PKER_RACCS ( 21, 18) = 0.239150E+00 + PKER_RACCS ( 21, 19) = 0.287499E+00 + PKER_RACCS ( 21, 20) = 0.342900E+00 + PKER_RACCS ( 21, 21) = 0.394764E+00 + PKER_RACCS ( 21, 22) = 0.439154E+00 + PKER_RACCS ( 21, 23) = 0.475848E+00 + PKER_RACCS ( 21, 24) = 0.505894E+00 + PKER_RACCS ( 21, 25) = 0.530484E+00 + PKER_RACCS ( 21, 26) = 0.550636E+00 + PKER_RACCS ( 21, 27) = 0.567176E+00 + PKER_RACCS ( 21, 28) = 0.580769E+00 + PKER_RACCS ( 21, 29) = 0.591952E+00 + PKER_RACCS ( 21, 30) = 0.601159E+00 + PKER_RACCS ( 21, 31) = 0.608746E+00 + PKER_RACCS ( 21, 32) = 0.615001E+00 + PKER_RACCS ( 21, 33) = 0.620161E+00 + PKER_RACCS ( 21, 34) = 0.624418E+00 + PKER_RACCS ( 21, 35) = 0.627933E+00 + PKER_RACCS ( 21, 36) = 0.630835E+00 + PKER_RACCS ( 21, 37) = 0.633232E+00 + PKER_RACCS ( 21, 38) = 0.635212E+00 + PKER_RACCS ( 21, 39) = 0.636848E+00 + PKER_RACCS ( 21, 40) = 0.638199E+00 + PKER_RACCS ( 22, 1) = 0.132706E+02 + PKER_RACCS ( 22, 2) = 0.108752E+02 + PKER_RACCS ( 22, 3) = 0.889034E+01 + PKER_RACCS ( 22, 4) = 0.724514E+01 + PKER_RACCS ( 22, 5) = 0.588103E+01 + PKER_RACCS ( 22, 6) = 0.474956E+01 + PKER_RACCS ( 22, 7) = 0.381066E+01 + PKER_RACCS ( 22, 8) = 0.303131E+01 + PKER_RACCS ( 22, 9) = 0.238440E+01 + PKER_RACCS ( 22, 10) = 0.184783E+01 + PKER_RACCS ( 22, 11) = 0.140395E+01 + PKER_RACCS ( 22, 12) = 0.103925E+01 + PKER_RACCS ( 22, 13) = 0.744489E+00 + PKER_RACCS ( 22, 14) = 0.514665E+00 + PKER_RACCS ( 22, 15) = 0.348618E+00 + PKER_RACCS ( 22, 16) = 0.246213E+00 + PKER_RACCS ( 22, 17) = 0.203810E+00 + PKER_RACCS ( 22, 18) = 0.210527E+00 + PKER_RACCS ( 22, 19) = 0.248639E+00 + PKER_RACCS ( 22, 20) = 0.299821E+00 + PKER_RACCS ( 22, 21) = 0.350944E+00 + PKER_RACCS ( 22, 22) = 0.395903E+00 + PKER_RACCS ( 22, 23) = 0.433386E+00 + PKER_RACCS ( 22, 24) = 0.464095E+00 + PKER_RACCS ( 22, 25) = 0.489182E+00 + PKER_RACCS ( 22, 26) = 0.509702E+00 + PKER_RACCS ( 22, 27) = 0.526514E+00 + PKER_RACCS ( 22, 28) = 0.540309E+00 + PKER_RACCS ( 22, 29) = 0.551642E+00 + PKER_RACCS ( 22, 30) = 0.560963E+00 + PKER_RACCS ( 22, 31) = 0.568636E+00 + PKER_RACCS ( 22, 32) = 0.574956E+00 + PKER_RACCS ( 22, 33) = 0.580166E+00 + PKER_RACCS ( 22, 34) = 0.584462E+00 + PKER_RACCS ( 22, 35) = 0.588006E+00 + PKER_RACCS ( 22, 36) = 0.590931E+00 + PKER_RACCS ( 22, 37) = 0.593346E+00 + PKER_RACCS ( 22, 38) = 0.595339E+00 + PKER_RACCS ( 22, 39) = 0.596986E+00 + PKER_RACCS ( 22, 40) = 0.598346E+00 + PKER_RACCS ( 23, 1) = 0.133280E+02 + PKER_RACCS ( 23, 2) = 0.109343E+02 + PKER_RACCS ( 23, 3) = 0.895109E+01 + PKER_RACCS ( 23, 4) = 0.730772E+01 + PKER_RACCS ( 23, 5) = 0.594552E+01 + PKER_RACCS ( 23, 6) = 0.481597E+01 + PKER_RACCS ( 23, 7) = 0.387893E+01 + PKER_RACCS ( 23, 8) = 0.310124E+01 + PKER_RACCS ( 23, 9) = 0.245555E+01 + PKER_RACCS ( 23, 10) = 0.191949E+01 + PKER_RACCS ( 23, 11) = 0.147491E+01 + PKER_RACCS ( 23, 12) = 0.110760E+01 + PKER_RACCS ( 23, 13) = 0.807248E+00 + PKER_RACCS ( 23, 14) = 0.567629E+00 + PKER_RACCS ( 23, 15) = 0.386696E+00 + PKER_RACCS ( 23, 16) = 0.264772E+00 + PKER_RACCS ( 23, 17) = 0.201168E+00 + PKER_RACCS ( 23, 18) = 0.189359E+00 + PKER_RACCS ( 23, 19) = 0.214892E+00 + PKER_RACCS ( 23, 20) = 0.259902E+00 + PKER_RACCS ( 23, 21) = 0.309296E+00 + PKER_RACCS ( 23, 22) = 0.354562E+00 + PKER_RACCS ( 23, 23) = 0.392871E+00 + PKER_RACCS ( 23, 24) = 0.424352E+00 + PKER_RACCS ( 23, 25) = 0.450037E+00 + PKER_RACCS ( 23, 26) = 0.471000E+00 + PKER_RACCS ( 23, 27) = 0.488140E+00 + PKER_RACCS ( 23, 28) = 0.502179E+00 + PKER_RACCS ( 23, 29) = 0.513695E+00 + PKER_RACCS ( 23, 30) = 0.523153E+00 + PKER_RACCS ( 23, 31) = 0.530929E+00 + PKER_RACCS ( 23, 32) = 0.537328E+00 + PKER_RACCS ( 23, 33) = 0.542597E+00 + PKER_RACCS ( 23, 34) = 0.546939E+00 + PKER_RACCS ( 23, 35) = 0.550519E+00 + PKER_RACCS ( 23, 36) = 0.553471E+00 + PKER_RACCS ( 23, 37) = 0.555907E+00 + PKER_RACCS ( 23, 38) = 0.557917E+00 + PKER_RACCS ( 23, 39) = 0.559577E+00 + PKER_RACCS ( 23, 40) = 0.560947E+00 + PKER_RACCS ( 24, 1) = 0.133776E+02 + PKER_RACCS ( 24, 2) = 0.109851E+02 + PKER_RACCS ( 24, 3) = 0.900330E+01 + PKER_RACCS ( 24, 4) = 0.736141E+01 + PKER_RACCS ( 24, 5) = 0.600078E+01 + PKER_RACCS ( 24, 6) = 0.487288E+01 + PKER_RACCS ( 24, 7) = 0.393752E+01 + PKER_RACCS ( 24, 8) = 0.316146E+01 + PKER_RACCS ( 24, 9) = 0.251726E+01 + PKER_RACCS ( 24, 10) = 0.198229E+01 + PKER_RACCS ( 24, 11) = 0.153812E+01 + PKER_RACCS ( 24, 12) = 0.116995E+01 + PKER_RACCS ( 24, 13) = 0.866612E+00 + PKER_RACCS ( 24, 14) = 0.620643E+00 + PKER_RACCS ( 24, 15) = 0.428690E+00 + PKER_RACCS ( 24, 16) = 0.290707E+00 + PKER_RACCS ( 24, 17) = 0.207519E+00 + PKER_RACCS ( 24, 18) = 0.176401E+00 + PKER_RACCS ( 24, 19) = 0.187072E+00 + PKER_RACCS ( 24, 20) = 0.223666E+00 + PKER_RACCS ( 24, 21) = 0.269955E+00 + PKER_RACCS ( 24, 22) = 0.315007E+00 + PKER_RACCS ( 24, 23) = 0.354096E+00 + PKER_RACCS ( 24, 24) = 0.386445E+00 + PKER_RACCS ( 24, 25) = 0.412837E+00 + PKER_RACCS ( 24, 26) = 0.434333E+00 + PKER_RACCS ( 24, 27) = 0.451869E+00 + PKER_RACCS ( 24, 28) = 0.466202E+00 + PKER_RACCS ( 24, 29) = 0.477938E+00 + PKER_RACCS ( 24, 30) = 0.487561E+00 + PKER_RACCS ( 24, 31) = 0.495462E+00 + PKER_RACCS ( 24, 32) = 0.501955E+00 + PKER_RACCS ( 24, 33) = 0.507296E+00 + PKER_RACCS ( 24, 34) = 0.511693E+00 + PKER_RACCS ( 24, 35) = 0.515315E+00 + PKER_RACCS ( 24, 36) = 0.518300E+00 + PKER_RACCS ( 24, 37) = 0.520762E+00 + PKER_RACCS ( 24, 38) = 0.522792E+00 + PKER_RACCS ( 24, 39) = 0.524467E+00 + PKER_RACCS ( 24, 40) = 0.525849E+00 + PKER_RACCS ( 25, 1) = 0.134206E+02 + PKER_RACCS ( 25, 2) = 0.110292E+02 + PKER_RACCS ( 25, 3) = 0.904847E+01 + PKER_RACCS ( 25, 4) = 0.740776E+01 + PKER_RACCS ( 25, 5) = 0.604841E+01 + PKER_RACCS ( 25, 6) = 0.492186E+01 + PKER_RACCS ( 25, 7) = 0.398793E+01 + PKER_RACCS ( 25, 8) = 0.321335E+01 + PKER_RACCS ( 25, 9) = 0.257059E+01 + PKER_RACCS ( 25, 10) = 0.203693E+01 + PKER_RACCS ( 25, 11) = 0.159370E+01 + PKER_RACCS ( 25, 12) = 0.122575E+01 + PKER_RACCS ( 25, 13) = 0.921214E+00 + PKER_RACCS ( 25, 14) = 0.671617E+00 + PKER_RACCS ( 25, 15) = 0.472110E+00 + PKER_RACCS ( 25, 16) = 0.321676E+00 + PKER_RACCS ( 25, 17) = 0.221561E+00 + PKER_RACCS ( 25, 18) = 0.171605E+00 + PKER_RACCS ( 25, 19) = 0.166038E+00 + PKER_RACCS ( 25, 20) = 0.191877E+00 + PKER_RACCS ( 25, 21) = 0.233259E+00 + PKER_RACCS ( 25, 22) = 0.277238E+00 + PKER_RACCS ( 25, 23) = 0.316894E+00 + PKER_RACCS ( 25, 24) = 0.350169E+00 + PKER_RACCS ( 25, 25) = 0.377379E+00 + PKER_RACCS ( 25, 26) = 0.399506E+00 + PKER_RACCS ( 25, 27) = 0.417517E+00 + PKER_RACCS ( 25, 28) = 0.432204E+00 + PKER_RACCS ( 25, 29) = 0.444205E+00 + PKER_RACCS ( 25, 30) = 0.454027E+00 + PKER_RACCS ( 25, 31) = 0.462077E+00 + PKER_RACCS ( 25, 32) = 0.468684E+00 + PKER_RACCS ( 25, 33) = 0.474112E+00 + PKER_RACCS ( 25, 34) = 0.478576E+00 + PKER_RACCS ( 25, 35) = 0.482249E+00 + PKER_RACCS ( 25, 36) = 0.485273E+00 + PKER_RACCS ( 25, 37) = 0.487764E+00 + PKER_RACCS ( 25, 38) = 0.489818E+00 + PKER_RACCS ( 25, 39) = 0.491511E+00 + PKER_RACCS ( 25, 40) = 0.492908E+00 + PKER_RACCS ( 26, 1) = 0.134583E+02 + PKER_RACCS ( 26, 2) = 0.110677E+02 + PKER_RACCS ( 26, 3) = 0.908784E+01 + PKER_RACCS ( 26, 4) = 0.744807E+01 + PKER_RACCS ( 26, 5) = 0.608972E+01 + PKER_RACCS ( 26, 6) = 0.496427E+01 + PKER_RACCS ( 26, 7) = 0.403151E+01 + PKER_RACCS ( 26, 8) = 0.325817E+01 + PKER_RACCS ( 26, 9) = 0.261671E+01 + PKER_RACCS ( 26, 10) = 0.208432E+01 + PKER_RACCS ( 26, 11) = 0.164223E+01 + PKER_RACCS ( 26, 12) = 0.127505E+01 + PKER_RACCS ( 26, 13) = 0.970445E+00 + PKER_RACCS ( 26, 14) = 0.719103E+00 + PKER_RACCS ( 26, 15) = 0.514960E+00 + PKER_RACCS ( 26, 16) = 0.355619E+00 + PKER_RACCS ( 26, 17) = 0.241696E+00 + PKER_RACCS ( 26, 18) = 0.174597E+00 + PKER_RACCS ( 26, 19) = 0.152207E+00 + PKER_RACCS ( 26, 20) = 0.165325E+00 + PKER_RACCS ( 26, 21) = 0.199742E+00 + PKER_RACCS ( 26, 22) = 0.241398E+00 + PKER_RACCS ( 26, 23) = 0.281177E+00 + PKER_RACCS ( 26, 24) = 0.315343E+00 + PKER_RACCS ( 26, 25) = 0.343466E+00 + PKER_RACCS ( 26, 26) = 0.366332E+00 + PKER_RACCS ( 26, 27) = 0.384904E+00 + PKER_RACCS ( 26, 28) = 0.400015E+00 + PKER_RACCS ( 26, 29) = 0.412334E+00 + PKER_RACCS ( 26, 30) = 0.422395E+00 + PKER_RACCS ( 26, 31) = 0.430626E+00 + PKER_RACCS ( 26, 32) = 0.437370E+00 + PKER_RACCS ( 26, 33) = 0.442902E+00 + PKER_RACCS ( 26, 34) = 0.447445E+00 + PKER_RACCS ( 26, 35) = 0.451179E+00 + PKER_RACCS ( 26, 36) = 0.454250E+00 + PKER_RACCS ( 26, 37) = 0.456778E+00 + PKER_RACCS ( 26, 38) = 0.458860E+00 + PKER_RACCS ( 26, 39) = 0.460575E+00 + PKER_RACCS ( 26, 40) = 0.461988E+00 + PKER_RACCS ( 27, 1) = 0.134916E+02 + PKER_RACCS ( 27, 2) = 0.111016E+02 + PKER_RACCS ( 27, 3) = 0.912241E+01 + PKER_RACCS ( 27, 4) = 0.748337E+01 + PKER_RACCS ( 27, 5) = 0.612582E+01 + PKER_RACCS ( 27, 6) = 0.500123E+01 + PKER_RACCS ( 27, 7) = 0.406942E+01 + PKER_RACCS ( 27, 8) = 0.329710E+01 + PKER_RACCS ( 27, 9) = 0.265672E+01 + PKER_RACCS ( 27, 10) = 0.212547E+01 + PKER_RACCS ( 27, 11) = 0.168449E+01 + PKER_RACCS ( 27, 12) = 0.131827E+01 + PKER_RACCS ( 27, 13) = 0.101419E+01 + PKER_RACCS ( 27, 14) = 0.762350E+00 + PKER_RACCS ( 27, 15) = 0.555726E+00 + PKER_RACCS ( 27, 16) = 0.390561E+00 + PKER_RACCS ( 27, 17) = 0.266359E+00 + PKER_RACCS ( 27, 18) = 0.184682E+00 + PKER_RACCS ( 27, 19) = 0.145925E+00 + PKER_RACCS ( 27, 20) = 0.144842E+00 + PKER_RACCS ( 27, 21) = 0.170126E+00 + PKER_RACCS ( 27, 22) = 0.207837E+00 + PKER_RACCS ( 27, 23) = 0.246960E+00 + PKER_RACCS ( 27, 24) = 0.281834E+00 + PKER_RACCS ( 27, 25) = 0.310921E+00 + PKER_RACCS ( 27, 26) = 0.334627E+00 + PKER_RACCS ( 27, 27) = 0.353857E+00 + PKER_RACCS ( 27, 28) = 0.369470E+00 + PKER_RACCS ( 27, 29) = 0.382168E+00 + PKER_RACCS ( 27, 30) = 0.392516E+00 + PKER_RACCS ( 27, 31) = 0.400964E+00 + PKER_RACCS ( 27, 32) = 0.407872E+00 + PKER_RACCS ( 27, 33) = 0.413529E+00 + PKER_RACCS ( 27, 34) = 0.418167E+00 + PKER_RACCS ( 27, 35) = 0.421974E+00 + PKER_RACCS ( 27, 36) = 0.425101E+00 + PKER_RACCS ( 27, 37) = 0.427673E+00 + PKER_RACCS ( 27, 38) = 0.429788E+00 + PKER_RACCS ( 27, 39) = 0.431529E+00 + PKER_RACCS ( 27, 40) = 0.432963E+00 + PKER_RACCS ( 28, 1) = 0.135212E+02 + PKER_RACCS ( 28, 2) = 0.111316E+02 + PKER_RACCS ( 28, 3) = 0.915297E+01 + PKER_RACCS ( 28, 4) = 0.751450E+01 + PKER_RACCS ( 28, 5) = 0.615758E+01 + PKER_RACCS ( 28, 6) = 0.503368E+01 + PKER_RACCS ( 28, 7) = 0.410261E+01 + PKER_RACCS ( 28, 8) = 0.333111E+01 + PKER_RACCS ( 28, 9) = 0.269162E+01 + PKER_RACCS ( 28, 10) = 0.216132E+01 + PKER_RACCS ( 28, 11) = 0.172133E+01 + PKER_RACCS ( 28, 12) = 0.135607E+01 + PKER_RACCS ( 28, 13) = 0.105274E+01 + PKER_RACCS ( 28, 14) = 0.801085E+00 + PKER_RACCS ( 28, 15) = 0.593401E+00 + PKER_RACCS ( 28, 16) = 0.424717E+00 + PKER_RACCS ( 28, 17) = 0.293277E+00 + PKER_RACCS ( 28, 18) = 0.200068E+00 + PKER_RACCS ( 28, 19) = 0.146527E+00 + PKER_RACCS ( 28, 20) = 0.130912E+00 + PKER_RACCS ( 28, 21) = 0.145240E+00 + PKER_RACCS ( 28, 22) = 0.177100E+00 + PKER_RACCS ( 28, 23) = 0.214430E+00 + PKER_RACCS ( 28, 24) = 0.249591E+00 + PKER_RACCS ( 28, 25) = 0.279602E+00 + PKER_RACCS ( 28, 26) = 0.304226E+00 + PKER_RACCS ( 28, 27) = 0.324208E+00 + PKER_RACCS ( 28, 28) = 0.340405E+00 + PKER_RACCS ( 28, 29) = 0.353552E+00 + PKER_RACCS ( 28, 30) = 0.364242E+00 + PKER_RACCS ( 28, 31) = 0.372949E+00 + PKER_RACCS ( 28, 32) = 0.380054E+00 + PKER_RACCS ( 28, 33) = 0.385860E+00 + PKER_RACCS ( 28, 34) = 0.390613E+00 + PKER_RACCS ( 28, 35) = 0.394508E+00 + PKER_RACCS ( 28, 36) = 0.397703E+00 + PKER_RACCS ( 28, 37) = 0.400326E+00 + PKER_RACCS ( 28, 38) = 0.402482E+00 + PKER_RACCS ( 28, 39) = 0.404254E+00 + PKER_RACCS ( 28, 40) = 0.405713E+00 + PKER_RACCS ( 29, 1) = 0.135476E+02 + PKER_RACCS ( 29, 2) = 0.111584E+02 + PKER_RACCS ( 29, 3) = 0.918018E+01 + PKER_RACCS ( 29, 4) = 0.754216E+01 + PKER_RACCS ( 29, 5) = 0.618572E+01 + PKER_RACCS ( 29, 6) = 0.506235E+01 + PKER_RACCS ( 29, 7) = 0.413187E+01 + PKER_RACCS ( 29, 8) = 0.336101E+01 + PKER_RACCS ( 29, 9) = 0.272223E+01 + PKER_RACCS ( 29, 10) = 0.219271E+01 + PKER_RACCS ( 29, 11) = 0.175356E+01 + PKER_RACCS ( 29, 12) = 0.138915E+01 + PKER_RACCS ( 29, 13) = 0.108662E+01 + PKER_RACCS ( 29, 14) = 0.835482E+00 + PKER_RACCS ( 29, 15) = 0.627544E+00 + PKER_RACCS ( 29, 16) = 0.457003E+00 + PKER_RACCS ( 29, 17) = 0.320871E+00 + PKER_RACCS ( 29, 18) = 0.218993E+00 + PKER_RACCS ( 29, 19) = 0.153040E+00 + PKER_RACCS ( 29, 20) = 0.123480E+00 + PKER_RACCS ( 29, 21) = 0.125714E+00 + PKER_RACCS ( 29, 22) = 0.149873E+00 + PKER_RACCS ( 29, 23) = 0.183944E+00 + PKER_RACCS ( 29, 24) = 0.218688E+00 + PKER_RACCS ( 29, 25) = 0.249424E+00 + PKER_RACCS ( 29, 26) = 0.274989E+00 + PKER_RACCS ( 29, 27) = 0.295803E+00 + PKER_RACCS ( 29, 28) = 0.312668E+00 + PKER_RACCS ( 29, 29) = 0.326337E+00 + PKER_RACCS ( 29, 30) = 0.337429E+00 + PKER_RACCS ( 29, 31) = 0.346444E+00 + PKER_RACCS ( 29, 32) = 0.353785E+00 + PKER_RACCS ( 29, 33) = 0.359771E+00 + PKER_RACCS ( 29, 34) = 0.364661E+00 + PKER_RACCS ( 29, 35) = 0.368660E+00 + PKER_RACCS ( 29, 36) = 0.371936E+00 + PKER_RACCS ( 29, 37) = 0.374622E+00 + PKER_RACCS ( 29, 38) = 0.376826E+00 + PKER_RACCS ( 29, 39) = 0.378635E+00 + PKER_RACCS ( 29, 40) = 0.380123E+00 + PKER_RACCS ( 30, 1) = 0.135713E+02 + PKER_RACCS ( 30, 2) = 0.111824E+02 + PKER_RACCS ( 30, 3) = 0.920455E+01 + PKER_RACCS ( 30, 4) = 0.756688E+01 + PKER_RACCS ( 30, 5) = 0.621082E+01 + PKER_RACCS ( 30, 6) = 0.508787E+01 + PKER_RACCS ( 30, 7) = 0.415784E+01 + PKER_RACCS ( 30, 8) = 0.338749E+01 + PKER_RACCS ( 30, 9) = 0.274927E+01 + PKER_RACCS ( 30, 10) = 0.222037E+01 + PKER_RACCS ( 30, 11) = 0.178189E+01 + PKER_RACCS ( 30, 12) = 0.141821E+01 + PKER_RACCS ( 30, 13) = 0.111641E+01 + PKER_RACCS ( 30, 14) = 0.865882E+00 + PKER_RACCS ( 30, 15) = 0.658144E+00 + PKER_RACCS ( 30, 16) = 0.486803E+00 + PKER_RACCS ( 30, 17) = 0.347889E+00 + PKER_RACCS ( 30, 18) = 0.240079E+00 + PKER_RACCS ( 30, 19) = 0.164371E+00 + PKER_RACCS ( 30, 20) = 0.122278E+00 + PKER_RACCS ( 30, 21) = 0.112067E+00 + PKER_RACCS ( 30, 22) = 0.126909E+00 + PKER_RACCS ( 30, 23) = 0.156066E+00 + PKER_RACCS ( 30, 24) = 0.189340E+00 + PKER_RACCS ( 30, 25) = 0.220392E+00 + PKER_RACCS ( 30, 26) = 0.246822E+00 + PKER_RACCS ( 30, 27) = 0.268510E+00 + PKER_RACCS ( 30, 28) = 0.286117E+00 + PKER_RACCS ( 30, 29) = 0.300380E+00 + PKER_RACCS ( 30, 30) = 0.311940E+00 + PKER_RACCS ( 30, 31) = 0.321318E+00 + PKER_RACCS ( 30, 32) = 0.328937E+00 + PKER_RACCS ( 30, 33) = 0.335137E+00 + PKER_RACCS ( 30, 34) = 0.340191E+00 + PKER_RACCS ( 30, 35) = 0.344317E+00 + PKER_RACCS ( 30, 36) = 0.347689E+00 + PKER_RACCS ( 30, 37) = 0.350449E+00 + PKER_RACCS ( 30, 38) = 0.352711E+00 + PKER_RACCS ( 30, 39) = 0.354565E+00 + PKER_RACCS ( 30, 40) = 0.356087E+00 + PKER_RACCS ( 31, 1) = 0.135928E+02 + PKER_RACCS ( 31, 2) = 0.112041E+02 + PKER_RACCS ( 31, 3) = 0.922651E+01 + PKER_RACCS ( 31, 4) = 0.758911E+01 + PKER_RACCS ( 31, 5) = 0.623334E+01 + PKER_RACCS ( 31, 6) = 0.511071E+01 + PKER_RACCS ( 31, 7) = 0.418105E+01 + PKER_RACCS ( 31, 8) = 0.341109E+01 + PKER_RACCS ( 31, 9) = 0.277330E+01 + PKER_RACCS ( 31, 10) = 0.224489E+01 + PKER_RACCS ( 31, 11) = 0.180695E+01 + PKER_RACCS ( 31, 12) = 0.144386E+01 + PKER_RACCS ( 31, 13) = 0.114268E+01 + PKER_RACCS ( 31, 14) = 0.892748E+00 + PKER_RACCS ( 31, 15) = 0.685391E+00 + PKER_RACCS ( 31, 16) = 0.513859E+00 + PKER_RACCS ( 31, 17) = 0.373398E+00 + PKER_RACCS ( 31, 18) = 0.261665E+00 + PKER_RACCS ( 31, 19) = 0.178785E+00 + PKER_RACCS ( 31, 20) = 0.126188E+00 + PKER_RACCS ( 31, 21) = 0.104190E+00 + PKER_RACCS ( 31, 22) = 0.108781E+00 + PKER_RACCS ( 31, 23) = 0.131410E+00 + PKER_RACCS ( 31, 24) = 0.161929E+00 + PKER_RACCS ( 31, 25) = 0.192628E+00 + PKER_RACCS ( 31, 26) = 0.219702E+00 + PKER_RACCS ( 31, 27) = 0.242240E+00 + PKER_RACCS ( 31, 28) = 0.260630E+00 + PKER_RACCS ( 31, 29) = 0.275551E+00 + PKER_RACCS ( 31, 30) = 0.287642E+00 + PKER_RACCS ( 31, 31) = 0.297440E+00 + PKER_RACCS ( 31, 32) = 0.305387E+00 + PKER_RACCS ( 31, 33) = 0.311841E+00 + PKER_RACCS ( 31, 34) = 0.317090E+00 + PKER_RACCS ( 31, 35) = 0.321366E+00 + PKER_RACCS ( 31, 36) = 0.324854E+00 + PKER_RACCS ( 31, 37) = 0.327703E+00 + PKER_RACCS ( 31, 38) = 0.330033E+00 + PKER_RACCS ( 31, 39) = 0.331941E+00 + PKER_RACCS ( 31, 40) = 0.333505E+00 + PKER_RACCS ( 32, 1) = 0.136123E+02 + PKER_RACCS ( 32, 2) = 0.112238E+02 + PKER_RACCS ( 32, 3) = 0.924639E+01 + PKER_RACCS ( 32, 4) = 0.760920E+01 + PKER_RACCS ( 32, 5) = 0.625367E+01 + PKER_RACCS ( 32, 6) = 0.513129E+01 + PKER_RACCS ( 32, 7) = 0.420190E+01 + PKER_RACCS ( 32, 8) = 0.343225E+01 + PKER_RACCS ( 32, 9) = 0.279481E+01 + PKER_RACCS ( 32, 10) = 0.226677E+01 + PKER_RACCS ( 32, 11) = 0.182926E+01 + PKER_RACCS ( 32, 12) = 0.146664E+01 + PKER_RACCS ( 32, 13) = 0.116597E+01 + PKER_RACCS ( 32, 14) = 0.916557E+00 + PKER_RACCS ( 32, 15) = 0.709637E+00 + PKER_RACCS ( 32, 16) = 0.538201E+00 + PKER_RACCS ( 32, 17) = 0.397009E+00 + PKER_RACCS ( 32, 18) = 0.282874E+00 + PKER_RACCS ( 32, 19) = 0.194862E+00 + PKER_RACCS ( 32, 20) = 0.133999E+00 + PKER_RACCS ( 32, 21) = 0.101519E+00 + PKER_RACCS ( 32, 22) = 0.957088E-01 + PKER_RACCS ( 32, 23) = 0.110579E+00 + PKER_RACCS ( 32, 24) = 0.136947E+00 + PKER_RACCS ( 32, 25) = 0.166392E+00 + PKER_RACCS ( 32, 26) = 0.193693E+00 + PKER_RACCS ( 32, 27) = 0.216957E+00 + PKER_RACCS ( 32, 28) = 0.236123E+00 + PKER_RACCS ( 32, 29) = 0.251739E+00 + PKER_RACCS ( 32, 30) = 0.264414E+00 + PKER_RACCS ( 32, 31) = 0.274689E+00 + PKER_RACCS ( 32, 32) = 0.283015E+00 + PKER_RACCS ( 32, 33) = 0.289766E+00 + PKER_RACCS ( 32, 34) = 0.295246E+00 + PKER_RACCS ( 32, 35) = 0.299700E+00 + PKER_RACCS ( 32, 36) = 0.303326E+00 + PKER_RACCS ( 32, 37) = 0.306282E+00 + PKER_RACCS ( 32, 38) = 0.308695E+00 + PKER_RACCS ( 32, 39) = 0.310666E+00 + PKER_RACCS ( 32, 40) = 0.312279E+00 + PKER_RACCS ( 33, 1) = 0.136301E+02 + PKER_RACCS ( 33, 2) = 0.112418E+02 + PKER_RACCS ( 33, 3) = 0.926449E+01 + PKER_RACCS ( 33, 4) = 0.762746E+01 + PKER_RACCS ( 33, 5) = 0.627211E+01 + PKER_RACCS ( 33, 6) = 0.514993E+01 + PKER_RACCS ( 33, 7) = 0.422075E+01 + PKER_RACCS ( 33, 8) = 0.345134E+01 + PKER_RACCS ( 33, 9) = 0.281416E+01 + PKER_RACCS ( 33, 10) = 0.228641E+01 + PKER_RACCS ( 33, 11) = 0.184923E+01 + PKER_RACCS ( 33, 12) = 0.148699E+01 + PKER_RACCS ( 33, 13) = 0.118672E+01 + PKER_RACCS ( 33, 14) = 0.937747E+00 + PKER_RACCS ( 33, 15) = 0.731237E+00 + PKER_RACCS ( 33, 16) = 0.560038E+00 + PKER_RACCS ( 33, 17) = 0.418590E+00 + PKER_RACCS ( 33, 18) = 0.303093E+00 + PKER_RACCS ( 33, 19) = 0.211735E+00 + PKER_RACCS ( 33, 20) = 0.144709E+00 + PKER_RACCS ( 33, 21) = 0.103389E+00 + PKER_RACCS ( 33, 22) = 0.876948E-01 + PKER_RACCS ( 33, 23) = 0.940326E-01 + PKER_RACCS ( 33, 24) = 0.114972E+00 + PKER_RACCS ( 33, 25) = 0.142046E+00 + PKER_RACCS ( 33, 26) = 0.168966E+00 + PKER_RACCS ( 33, 27) = 0.192699E+00 + PKER_RACCS ( 33, 28) = 0.212559E+00 + PKER_RACCS ( 33, 29) = 0.228864E+00 + PKER_RACCS ( 33, 30) = 0.242156E+00 + PKER_RACCS ( 33, 31) = 0.252953E+00 + PKER_RACCS ( 33, 32) = 0.261707E+00 + PKER_RACCS ( 33, 33) = 0.268801E+00 + PKER_RACCS ( 33, 34) = 0.274551E+00 + PKER_RACCS ( 33, 35) = 0.279216E+00 + PKER_RACCS ( 33, 36) = 0.283006E+00 + PKER_RACCS ( 33, 37) = 0.286089E+00 + PKER_RACCS ( 33, 38) = 0.288600E+00 + PKER_RACCS ( 33, 39) = 0.290648E+00 + PKER_RACCS ( 33, 40) = 0.292320E+00 + PKER_RACCS ( 34, 1) = 0.136464E+02 + PKER_RACCS ( 34, 2) = 0.112582E+02 + PKER_RACCS ( 34, 3) = 0.928102E+01 + PKER_RACCS ( 34, 4) = 0.764412E+01 + PKER_RACCS ( 34, 5) = 0.628891E+01 + PKER_RACCS ( 34, 6) = 0.516688E+01 + PKER_RACCS ( 34, 7) = 0.423787E+01 + PKER_RACCS ( 34, 8) = 0.346865E+01 + PKER_RACCS ( 34, 9) = 0.283167E+01 + PKER_RACCS ( 34, 10) = 0.230415E+01 + PKER_RACCS ( 34, 11) = 0.186723E+01 + PKER_RACCS ( 34, 12) = 0.150527E+01 + PKER_RACCS ( 34, 13) = 0.120533E+01 + PKER_RACCS ( 34, 14) = 0.956703E+00 + PKER_RACCS ( 34, 15) = 0.750546E+00 + PKER_RACCS ( 34, 16) = 0.579618E+00 + PKER_RACCS ( 34, 17) = 0.438164E+00 + PKER_RACCS ( 34, 18) = 0.321920E+00 + PKER_RACCS ( 34, 19) = 0.228381E+00 + PKER_RACCS ( 34, 20) = 0.157004E+00 + PKER_RACCS ( 34, 21) = 0.108653E+00 + PKER_RACCS ( 34, 22) = 0.841812E-01 + PKER_RACCS ( 34, 23) = 0.818931E-01 + PKER_RACCS ( 34, 24) = 0.964120E-01 + PKER_RACCS ( 34, 25) = 0.120012E+00 + PKER_RACCS ( 34, 26) = 0.145780E+00 + PKER_RACCS ( 34, 27) = 0.169586E+00 + PKER_RACCS ( 34, 28) = 0.189966E+00 + PKER_RACCS ( 34, 29) = 0.206893E+00 + PKER_RACCS ( 34, 30) = 0.220793E+00 + PKER_RACCS ( 34, 31) = 0.232137E+00 + PKER_RACCS ( 34, 32) = 0.241360E+00 + PKER_RACCS ( 34, 33) = 0.248841E+00 + PKER_RACCS ( 34, 34) = 0.254902E+00 + PKER_RACCS ( 34, 35) = 0.259814E+00 + PKER_RACCS ( 34, 36) = 0.263797E+00 + PKER_RACCS ( 34, 37) = 0.267030E+00 + PKER_RACCS ( 34, 38) = 0.269658E+00 + PKER_RACCS ( 34, 39) = 0.271797E+00 + PKER_RACCS ( 34, 40) = 0.273540E+00 + PKER_RACCS ( 35, 1) = 0.136614E+02 + PKER_RACCS ( 35, 2) = 0.112733E+02 + PKER_RACCS ( 35, 3) = 0.929618E+01 + PKER_RACCS ( 35, 4) = 0.765939E+01 + PKER_RACCS ( 35, 5) = 0.630429E+01 + PKER_RACCS ( 35, 6) = 0.518237E+01 + PKER_RACCS ( 35, 7) = 0.425350E+01 + PKER_RACCS ( 35, 8) = 0.348441E+01 + PKER_RACCS ( 35, 9) = 0.284759E+01 + PKER_RACCS ( 35, 10) = 0.232025E+01 + PKER_RACCS ( 35, 11) = 0.188353E+01 + PKER_RACCS ( 35, 12) = 0.152179E+01 + PKER_RACCS ( 35, 13) = 0.122210E+01 + PKER_RACCS ( 35, 14) = 0.973753E+00 + PKER_RACCS ( 35, 15) = 0.767890E+00 + PKER_RACCS ( 35, 16) = 0.597225E+00 + PKER_RACCS ( 35, 17) = 0.455867E+00 + PKER_RACCS ( 35, 18) = 0.339275E+00 + PKER_RACCS ( 35, 19) = 0.244416E+00 + PKER_RACCS ( 35, 20) = 0.169957E+00 + PKER_RACCS ( 35, 21) = 0.116255E+00 + PKER_RACCS ( 35, 22) = 0.843838E-01 + PKER_RACCS ( 35, 23) = 0.739429E-01 + PKER_RACCS ( 35, 24) = 0.815390E-01 + PKER_RACCS ( 35, 25) = 0.100685E+00 + PKER_RACCS ( 35, 26) = 0.124455E+00 + PKER_RACCS ( 35, 27) = 0.147808E+00 + PKER_RACCS ( 35, 28) = 0.168434E+00 + PKER_RACCS ( 35, 29) = 0.185847E+00 + PKER_RACCS ( 35, 30) = 0.200294E+00 + PKER_RACCS ( 35, 31) = 0.212176E+00 + PKER_RACCS ( 35, 32) = 0.221887E+00 + PKER_RACCS ( 35, 33) = 0.229789E+00 + PKER_RACCS ( 35, 34) = 0.236201E+00 + PKER_RACCS ( 35, 35) = 0.241396E+00 + PKER_RACCS ( 35, 36) = 0.245605E+00 + PKER_RACCS ( 35, 37) = 0.249015E+00 + PKER_RACCS ( 35, 38) = 0.251782E+00 + PKER_RACCS ( 35, 39) = 0.254029E+00 + PKER_RACCS ( 35, 40) = 0.255856E+00 + PKER_RACCS ( 36, 1) = 0.136752E+02 + PKER_RACCS ( 36, 2) = 0.112871E+02 + PKER_RACCS ( 36, 3) = 0.931013E+01 + PKER_RACCS ( 36, 4) = 0.767342E+01 + PKER_RACCS ( 36, 5) = 0.631840E+01 + PKER_RACCS ( 36, 6) = 0.519658E+01 + PKER_RACCS ( 36, 7) = 0.426781E+01 + PKER_RACCS ( 36, 8) = 0.349883E+01 + PKER_RACCS ( 36, 9) = 0.286213E+01 + PKER_RACCS ( 36, 10) = 0.233493E+01 + PKER_RACCS ( 36, 11) = 0.189836E+01 + PKER_RACCS ( 36, 12) = 0.153679E+01 + PKER_RACCS ( 36, 13) = 0.123730E+01 + PKER_RACCS ( 36, 14) = 0.989170E+00 + PKER_RACCS ( 36, 15) = 0.783542E+00 + PKER_RACCS ( 36, 16) = 0.613107E+00 + PKER_RACCS ( 36, 17) = 0.471895E+00 + PKER_RACCS ( 36, 18) = 0.355181E+00 + PKER_RACCS ( 36, 19) = 0.259564E+00 + PKER_RACCS ( 36, 20) = 0.183119E+00 + PKER_RACCS ( 36, 21) = 0.125501E+00 + PKER_RACCS ( 36, 22) = 0.876130E-01 + PKER_RACCS ( 36, 23) = 0.698509E-01 + PKER_RACCS ( 36, 24) = 0.704131E-01 + PKER_RACCS ( 36, 25) = 0.843947E-01 + PKER_RACCS ( 36, 26) = 0.105303E+00 + PKER_RACCS ( 36, 27) = 0.127595E+00 + PKER_RACCS ( 36, 28) = 0.148112E+00 + PKER_RACCS ( 36, 29) = 0.165804E+00 + PKER_RACCS ( 36, 30) = 0.180678E+00 + PKER_RACCS ( 36, 31) = 0.193038E+00 + PKER_RACCS ( 36, 32) = 0.203226E+00 + PKER_RACCS ( 36, 33) = 0.211566E+00 + PKER_RACCS ( 36, 34) = 0.218358E+00 + PKER_RACCS ( 36, 35) = 0.223872E+00 + PKER_RACCS ( 36, 36) = 0.228339E+00 + PKER_RACCS ( 36, 37) = 0.231956E+00 + PKER_RACCS ( 36, 38) = 0.234886E+00 + PKER_RACCS ( 36, 39) = 0.237261E+00 + PKER_RACCS ( 36, 40) = 0.239188E+00 + PKER_RACCS ( 37, 1) = 0.136880E+02 + PKER_RACCS ( 37, 2) = 0.113000E+02 + PKER_RACCS ( 37, 3) = 0.932301E+01 + PKER_RACCS ( 37, 4) = 0.768635E+01 + PKER_RACCS ( 37, 5) = 0.633140E+01 + PKER_RACCS ( 37, 6) = 0.520966E+01 + PKER_RACCS ( 37, 7) = 0.428096E+01 + PKER_RACCS ( 37, 8) = 0.351207E+01 + PKER_RACCS ( 37, 9) = 0.287547E+01 + PKER_RACCS ( 37, 10) = 0.234837E+01 + PKER_RACCS ( 37, 11) = 0.191192E+01 + PKER_RACCS ( 37, 12) = 0.155048E+01 + PKER_RACCS ( 37, 13) = 0.125114E+01 + PKER_RACCS ( 37, 14) = 0.100318E+01 + PKER_RACCS ( 37, 15) = 0.797739E+00 + PKER_RACCS ( 37, 16) = 0.627493E+00 + PKER_RACCS ( 37, 17) = 0.486429E+00 + PKER_RACCS ( 37, 18) = 0.369711E+00 + PKER_RACCS ( 37, 19) = 0.273656E+00 + PKER_RACCS ( 37, 20) = 0.195887E+00 + PKER_RACCS ( 37, 21) = 0.135541E+00 + PKER_RACCS ( 37, 22) = 0.929713E-01 + PKER_RACCS ( 37, 23) = 0.689449E-01 + PKER_RACCS ( 37, 24) = 0.628067E-01 + PKER_RACCS ( 37, 25) = 0.712146E-01 + PKER_RACCS ( 37, 26) = 0.885642E-01 + PKER_RACCS ( 37, 27) = 0.109176E+00 + PKER_RACCS ( 37, 28) = 0.129175E+00 + PKER_RACCS ( 37, 29) = 0.146887E+00 + PKER_RACCS ( 37, 30) = 0.162013E+00 + PKER_RACCS ( 37, 31) = 0.174742E+00 + PKER_RACCS ( 37, 32) = 0.185350E+00 + PKER_RACCS ( 37, 33) = 0.194114E+00 + PKER_RACCS ( 37, 34) = 0.201300E+00 + PKER_RACCS ( 37, 35) = 0.207158E+00 + PKER_RACCS ( 37, 36) = 0.211915E+00 + PKER_RACCS ( 37, 37) = 0.215769E+00 + PKER_RACCS ( 37, 38) = 0.218888E+00 + PKER_RACCS ( 37, 39) = 0.221414E+00 + PKER_RACCS ( 37, 40) = 0.223459E+00 + PKER_RACCS ( 38, 1) = 0.136998E+02 + PKER_RACCS ( 38, 2) = 0.113118E+02 + PKER_RACCS ( 38, 3) = 0.933491E+01 + PKER_RACCS ( 38, 4) = 0.769831E+01 + PKER_RACCS ( 38, 5) = 0.634341E+01 + PKER_RACCS ( 38, 6) = 0.522172E+01 + PKER_RACCS ( 38, 7) = 0.429308E+01 + PKER_RACCS ( 38, 8) = 0.352426E+01 + PKER_RACCS ( 38, 9) = 0.288774E+01 + PKER_RACCS ( 38, 10) = 0.236072E+01 + PKER_RACCS ( 38, 11) = 0.192436E+01 + PKER_RACCS ( 38, 12) = 0.156302E+01 + PKER_RACCS ( 38, 13) = 0.126380E+01 + PKER_RACCS ( 38, 14) = 0.101597E+01 + PKER_RACCS ( 38, 15) = 0.810672E+00 + PKER_RACCS ( 38, 16) = 0.640582E+00 + PKER_RACCS ( 38, 17) = 0.499655E+00 + PKER_RACCS ( 38, 18) = 0.382979E+00 + PKER_RACCS ( 38, 19) = 0.286703E+00 + PKER_RACCS ( 38, 20) = 0.208118E+00 + PKER_RACCS ( 38, 21) = 0.145802E+00 + PKER_RACCS ( 38, 22) = 0.996958E-01 + PKER_RACCS ( 38, 23) = 0.705180E-01 + PKER_RACCS ( 38, 24) = 0.583121E-01 + PKER_RACCS ( 38, 25) = 0.611067E-01 + PKER_RACCS ( 38, 26) = 0.743784E-01 + PKER_RACCS ( 38, 27) = 0.927345E-01 + PKER_RACCS ( 38, 28) = 0.111788E+00 + PKER_RACCS ( 38, 29) = 0.129236E+00 + PKER_RACCS ( 38, 30) = 0.144407E+00 + PKER_RACCS ( 38, 31) = 0.157347E+00 + PKER_RACCS ( 38, 32) = 0.168273E+00 + PKER_RACCS ( 38, 33) = 0.177407E+00 + PKER_RACCS ( 38, 34) = 0.184972E+00 + PKER_RACCS ( 38, 35) = 0.191185E+00 + PKER_RACCS ( 38, 36) = 0.196255E+00 + PKER_RACCS ( 38, 37) = 0.200374E+00 + PKER_RACCS ( 38, 38) = 0.203711E+00 + PKER_RACCS ( 38, 39) = 0.206411E+00 + PKER_RACCS ( 38, 40) = 0.208595E+00 + PKER_RACCS ( 39, 1) = 0.137108E+02 + PKER_RACCS ( 39, 2) = 0.113228E+02 + PKER_RACCS ( 39, 3) = 0.934595E+01 + PKER_RACCS ( 39, 4) = 0.770939E+01 + PKER_RACCS ( 39, 5) = 0.635453E+01 + PKER_RACCS ( 39, 6) = 0.523288E+01 + PKER_RACCS ( 39, 7) = 0.430429E+01 + PKER_RACCS ( 39, 8) = 0.353552E+01 + PKER_RACCS ( 39, 9) = 0.289905E+01 + PKER_RACCS ( 39, 10) = 0.237210E+01 + PKER_RACCS ( 39, 11) = 0.193581E+01 + PKER_RACCS ( 39, 12) = 0.157455E+01 + PKER_RACCS ( 39, 13) = 0.127542E+01 + PKER_RACCS ( 39, 14) = 0.102769E+01 + PKER_RACCS ( 39, 15) = 0.822505E+00 + PKER_RACCS ( 39, 16) = 0.652537E+00 + PKER_RACCS ( 39, 17) = 0.511728E+00 + PKER_RACCS ( 39, 18) = 0.395120E+00 + PKER_RACCS ( 39, 19) = 0.298748E+00 + PKER_RACCS ( 39, 20) = 0.219673E+00 + PKER_RACCS ( 39, 21) = 0.156076E+00 + PKER_RACCS ( 39, 22) = 0.107363E+00 + PKER_RACCS ( 39, 23) = 0.740476E-01 + PKER_RACCS ( 39, 24) = 0.565449E-01 + PKER_RACCS ( 39, 25) = 0.539031E-01 + PKER_RACCS ( 39, 26) = 0.628068E-01 + PKER_RACCS ( 39, 27) = 0.783909E-01 + PKER_RACCS ( 39, 28) = 0.960758E-01 + PKER_RACCS ( 39, 29) = 0.112978E+00 + PKER_RACCS ( 39, 30) = 0.127980E+00 + PKER_RACCS ( 39, 31) = 0.140952E+00 + PKER_RACCS ( 39, 32) = 0.152050E+00 + PKER_RACCS ( 39, 33) = 0.161459E+00 + PKER_RACCS ( 39, 34) = 0.169352E+00 + PKER_RACCS ( 39, 35) = 0.175905E+00 + PKER_RACCS ( 39, 36) = 0.181296E+00 + PKER_RACCS ( 39, 37) = 0.185700E+00 + PKER_RACCS ( 39, 38) = 0.189279E+00 + PKER_RACCS ( 39, 39) = 0.192179E+00 + PKER_RACCS ( 39, 40) = 0.194525E+00 + PKER_RACCS ( 40, 1) = 0.137209E+02 + PKER_RACCS ( 40, 2) = 0.113330E+02 + PKER_RACCS ( 40, 3) = 0.935620E+01 + PKER_RACCS ( 40, 4) = 0.771967E+01 + PKER_RACCS ( 40, 5) = 0.636484E+01 + PKER_RACCS ( 40, 6) = 0.524323E+01 + PKER_RACCS ( 40, 7) = 0.431468E+01 + PKER_RACCS ( 40, 8) = 0.354595E+01 + PKER_RACCS ( 40, 9) = 0.290952E+01 + PKER_RACCS ( 40, 10) = 0.238262E+01 + PKER_RACCS ( 40, 11) = 0.194638E+01 + PKER_RACCS ( 40, 12) = 0.158519E+01 + PKER_RACCS ( 40, 13) = 0.128612E+01 + PKER_RACCS ( 40, 14) = 0.103847E+01 + PKER_RACCS ( 40, 15) = 0.833372E+00 + PKER_RACCS ( 40, 16) = 0.663500E+00 + PKER_RACCS ( 40, 17) = 0.522788E+00 + PKER_RACCS ( 40, 18) = 0.406248E+00 + PKER_RACCS ( 40, 19) = 0.309849E+00 + PKER_RACCS ( 40, 20) = 0.230469E+00 + PKER_RACCS ( 40, 21) = 0.165985E+00 + PKER_RACCS ( 40, 22) = 0.115455E+00 + PKER_RACCS ( 40, 23) = 0.789238E-01 + PKER_RACCS ( 40, 24) = 0.569440E-01 + PKER_RACCS ( 40, 25) = 0.492680E-01 + PKER_RACCS ( 40, 26) = 0.537042E-01 + PKER_RACCS ( 40, 27) = 0.661559E-01 + PKER_RACCS ( 40, 28) = 0.821048E-01 + PKER_RACCS ( 40, 29) = 0.981944E-01 + PKER_RACCS ( 40, 30) = 0.112835E+00 + PKER_RACCS ( 40, 31) = 0.125662E+00 + PKER_RACCS ( 40, 32) = 0.136771E+00 + PKER_RACCS ( 40, 33) = 0.146319E+00 + PKER_RACCS ( 40, 34) = 0.154449E+00 + PKER_RACCS ( 40, 35) = 0.161294E+00 + PKER_RACCS ( 40, 36) = 0.166991E+00 + PKER_RACCS ( 40, 37) = 0.171687E+00 + PKER_RACCS ( 40, 38) = 0.175527E+00 + PKER_RACCS ( 40, 39) = 0.178649E+00 + PKER_RACCS ( 40, 40) = 0.181179E+00 +END IF +! +IF( PRESENT(PKER_SACCRG) ) THEN + PKER_SACCRG( 1, 1) = 0.438311E-02 + PKER_SACCRG( 1, 2) = 0.641932E-02 + PKER_SACCRG( 1, 3) = 0.104323E-01 + PKER_SACCRG( 1, 4) = 0.135168E-01 + PKER_SACCRG( 1, 5) = 0.186190E-01 + PKER_SACCRG( 1, 6) = 0.326141E-01 + PKER_SACCRG( 1, 7) = 0.629897E-01 + PKER_SACCRG( 1, 8) = 0.120410E+00 + PKER_SACCRG( 1, 9) = 0.232733E+00 + PKER_SACCRG( 1, 10) = 0.430353E+00 + PKER_SACCRG( 1, 11) = 0.742288E+00 + PKER_SACCRG( 1, 12) = 0.118527E+01 + PKER_SACCRG( 1, 13) = 0.175377E+01 + PKER_SACCRG( 1, 14) = 0.241509E+01 + PKER_SACCRG( 1, 15) = 0.311676E+01 + PKER_SACCRG( 1, 16) = 0.380271E+01 + PKER_SACCRG( 1, 17) = 0.442968E+01 + PKER_SACCRG( 1, 18) = 0.497509E+01 + PKER_SACCRG( 1, 19) = 0.543503E+01 + PKER_SACCRG( 1, 20) = 0.579503E+01 + PKER_SACCRG( 1, 21) = 0.611243E+01 + PKER_SACCRG( 1, 22) = 0.637529E+01 + PKER_SACCRG( 1, 23) = 0.655579E+01 + PKER_SACCRG( 1, 24) = 0.674119E+01 + PKER_SACCRG( 1, 25) = 0.685610E+01 + PKER_SACCRG( 1, 26) = 0.695045E+01 + PKER_SACCRG( 1, 27) = 0.703114E+01 + PKER_SACCRG( 1, 28) = 0.706922E+01 + PKER_SACCRG( 1, 29) = 0.710917E+01 + PKER_SACCRG( 1, 30) = 0.715122E+01 + PKER_SACCRG( 1, 31) = 0.717481E+01 + PKER_SACCRG( 1, 32) = 0.718927E+01 + PKER_SACCRG( 1, 33) = 0.720073E+01 + PKER_SACCRG( 1, 34) = 0.720264E+01 + PKER_SACCRG( 1, 35) = 0.721205E+01 + PKER_SACCRG( 1, 36) = 0.723197E+01 + PKER_SACCRG( 1, 37) = 0.000000E+00 + PKER_SACCRG( 1, 38) = 0.000000E+00 + PKER_SACCRG( 1, 39) = 0.000000E+00 + PKER_SACCRG( 1, 40) = 0.000000E+00 + PKER_SACCRG( 2, 1) = 0.277360E-02 + PKER_SACCRG( 2, 2) = 0.359904E-02 + PKER_SACCRG( 2, 3) = 0.526623E-02 + PKER_SACCRG( 2, 4) = 0.855403E-02 + PKER_SACCRG( 2, 5) = 0.110798E-01 + PKER_SACCRG( 2, 6) = 0.152575E-01 + PKER_SACCRG( 2, 7) = 0.267157E-01 + PKER_SACCRG( 2, 8) = 0.515725E-01 + PKER_SACCRG( 2, 9) = 0.985371E-01 + PKER_SACCRG( 2, 10) = 0.190336E+00 + PKER_SACCRG( 2, 11) = 0.351702E+00 + PKER_SACCRG( 2, 12) = 0.606144E+00 + PKER_SACCRG( 2, 13) = 0.967078E+00 + PKER_SACCRG( 2, 14) = 0.142977E+01 + PKER_SACCRG( 2, 15) = 0.196754E+01 + PKER_SACCRG( 2, 16) = 0.253781E+01 + PKER_SACCRG( 2, 17) = 0.309551E+01 + PKER_SACCRG( 2, 18) = 0.360619E+01 + PKER_SACCRG( 2, 19) = 0.405195E+01 + PKER_SACCRG( 2, 20) = 0.441025E+01 + PKER_SACCRG( 2, 21) = 0.472710E+01 + PKER_SACCRG( 2, 22) = 0.499143E+01 + PKER_SACCRG( 2, 23) = 0.517586E+01 + PKER_SACCRG( 2, 24) = 0.536386E+01 + PKER_SACCRG( 2, 25) = 0.548206E+01 + PKER_SACCRG( 2, 26) = 0.557912E+01 + PKER_SACCRG( 2, 27) = 0.566202E+01 + PKER_SACCRG( 2, 28) = 0.570152E+01 + PKER_SACCRG( 2, 29) = 0.574264E+01 + PKER_SACCRG( 2, 30) = 0.578573E+01 + PKER_SACCRG( 2, 31) = 0.580997E+01 + PKER_SACCRG( 2, 32) = 0.582483E+01 + PKER_SACCRG( 2, 33) = 0.583658E+01 + PKER_SACCRG( 2, 34) = 0.583857E+01 + PKER_SACCRG( 2, 35) = 0.584821E+01 + PKER_SACCRG( 2, 36) = 0.586858E+01 + PKER_SACCRG( 2, 37) = 0.000000E+00 + PKER_SACCRG( 2, 38) = 0.000000E+00 + PKER_SACCRG( 2, 39) = 0.000000E+00 + PKER_SACCRG( 2, 40) = 0.000000E+00 + PKER_SACCRG( 3, 1) = 0.213410E-02 + PKER_SACCRG( 3, 2) = 0.228042E-02 + PKER_SACCRG( 3, 3) = 0.295439E-02 + PKER_SACCRG( 3, 4) = 0.431810E-02 + PKER_SACCRG( 3, 5) = 0.700935E-02 + PKER_SACCRG( 3, 6) = 0.907613E-02 + PKER_SACCRG( 3, 7) = 0.124938E-01 + PKER_SACCRG( 3, 8) = 0.218668E-01 + PKER_SACCRG( 3, 9) = 0.421887E-01 + PKER_SACCRG( 3, 10) = 0.805544E-01 + PKER_SACCRG( 3, 11) = 0.155474E+00 + PKER_SACCRG( 3, 12) = 0.287036E+00 + PKER_SACCRG( 3, 13) = 0.494206E+00 + PKER_SACCRG( 3, 14) = 0.787675E+00 + PKER_SACCRG( 3, 15) = 0.116334E+01 + PKER_SACCRG( 3, 16) = 0.159943E+01 + PKER_SACCRG( 3, 17) = 0.206153E+01 + PKER_SACCRG( 3, 18) = 0.251365E+01 + PKER_SACCRG( 3, 19) = 0.292842E+01 + PKER_SACCRG( 3, 20) = 0.327509E+01 + PKER_SACCRG( 3, 21) = 0.358546E+01 + PKER_SACCRG( 3, 22) = 0.384740E+01 + PKER_SACCRG( 3, 23) = 0.403374E+01 + PKER_SACCRG( 3, 24) = 0.422232E+01 + PKER_SACCRG( 3, 25) = 0.434292E+01 + PKER_SACCRG( 3, 26) = 0.444208E+01 + PKER_SACCRG( 3, 27) = 0.452673E+01 + PKER_SACCRG( 3, 28) = 0.456755E+01 + PKER_SACCRG( 3, 29) = 0.460968E+01 + PKER_SACCRG( 3, 30) = 0.465368E+01 + PKER_SACCRG( 3, 31) = 0.467850E+01 + PKER_SACCRG( 3, 32) = 0.469374E+01 + PKER_SACCRG( 3, 33) = 0.470577E+01 + PKER_SACCRG( 3, 34) = 0.470785E+01 + PKER_SACCRG( 3, 35) = 0.471769E+01 + PKER_SACCRG( 3, 36) = 0.473846E+01 + PKER_SACCRG( 3, 37) = 0.000000E+00 + PKER_SACCRG( 3, 38) = 0.000000E+00 + PKER_SACCRG( 3, 39) = 0.000000E+00 + PKER_SACCRG( 3, 40) = 0.000000E+00 + PKER_SACCRG( 4, 1) = 0.295930E-03 + PKER_SACCRG( 4, 2) = 0.175883E-02 + PKER_SACCRG( 4, 3) = 0.187537E-02 + PKER_SACCRG( 4, 4) = 0.242497E-02 + PKER_SACCRG( 4, 5) = 0.353954E-02 + PKER_SACCRG( 4, 6) = 0.574121E-02 + PKER_SACCRG( 4, 7) = 0.743054E-02 + PKER_SACCRG( 4, 8) = 0.102239E-01 + PKER_SACCRG( 4, 9) = 0.178843E-01 + PKER_SACCRG( 4, 10) = 0.344817E-01 + PKER_SACCRG( 4, 11) = 0.657827E-01 + PKER_SACCRG( 4, 12) = 0.126844E+00 + PKER_SACCRG( 4, 13) = 0.233919E+00 + PKER_SACCRG( 4, 14) = 0.402255E+00 + PKER_SACCRG( 4, 15) = 0.640286E+00 + PKER_SACCRG( 4, 16) = 0.944426E+00 + PKER_SACCRG( 4, 17) = 0.129689E+01 + PKER_SACCRG( 4, 18) = 0.167004E+01 + PKER_SACCRG( 4, 19) = 0.203514E+01 + PKER_SACCRG( 4, 20) = 0.235706E+01 + PKER_SACCRG( 4, 21) = 0.265244E+01 + PKER_SACCRG( 4, 22) = 0.290663E+01 + PKER_SACCRG( 4, 23) = 0.309194E+01 + PKER_SACCRG( 4, 24) = 0.327835E+01 + PKER_SACCRG( 4, 25) = 0.339993E+01 + PKER_SACCRG( 4, 26) = 0.350021E+01 + PKER_SACCRG( 4, 27) = 0.358586E+01 + PKER_SACCRG( 4, 28) = 0.362775E+01 + PKER_SACCRG( 4, 29) = 0.367067E+01 + PKER_SACCRG( 4, 30) = 0.371533E+01 + PKER_SACCRG( 4, 31) = 0.374064E+01 + PKER_SACCRG( 4, 32) = 0.375621E+01 + PKER_SACCRG( 4, 33) = 0.376848E+01 + PKER_SACCRG( 4, 34) = 0.377064E+01 + PKER_SACCRG( 4, 35) = 0.378066E+01 + PKER_SACCRG( 4, 36) = 0.380174E+01 + PKER_SACCRG( 4, 37) = 0.000000E+00 + PKER_SACCRG( 4, 38) = 0.000000E+00 + PKER_SACCRG( 4, 39) = 0.000000E+00 + PKER_SACCRG( 4, 40) = 0.000000E+00 + PKER_SACCRG( 5, 1) = 0.258805E-03 + PKER_SACCRG( 5, 2) = 0.244750E-03 + PKER_SACCRG( 5, 3) = 0.145106E-02 + PKER_SACCRG( 5, 4) = 0.154319E-02 + PKER_SACCRG( 5, 5) = 0.199078E-02 + PKER_SACCRG( 5, 6) = 0.290099E-02 + PKER_SACCRG( 5, 7) = 0.470103E-02 + PKER_SACCRG( 5, 8) = 0.608063E-02 + PKER_SACCRG( 5, 9) = 0.836193E-02 + PKER_SACCRG( 5, 10) = 0.146173E-01 + PKER_SACCRG( 5, 11) = 0.281586E-01 + PKER_SACCRG( 5, 12) = 0.536650E-01 + PKER_SACCRG( 5, 13) = 0.103352E+00 + PKER_SACCRG( 5, 14) = 0.190326E+00 + PKER_SACCRG( 5, 15) = 0.326791E+00 + PKER_SACCRG( 5, 16) = 0.519290E+00 + PKER_SACCRG( 5, 17) = 0.764650E+00 + PKER_SACCRG( 5, 18) = 0.104842E+01 + PKER_SACCRG( 5, 19) = 0.134831E+01 + PKER_SACCRG( 5, 20) = 0.163103E+01 + PKER_SACCRG( 5, 21) = 0.190095E+01 + PKER_SACCRG( 5, 22) = 0.214036E+01 + PKER_SACCRG( 5, 23) = 0.232046E+01 + PKER_SACCRG( 5, 24) = 0.250112E+01 + PKER_SACCRG( 5, 25) = 0.262167E+01 + PKER_SACCRG( 5, 26) = 0.272160E+01 + PKER_SACCRG( 5, 27) = 0.280712E+01 + PKER_SACCRG( 5, 28) = 0.284966E+01 + PKER_SACCRG( 5, 29) = 0.289298E+01 + PKER_SACCRG( 5, 30) = 0.293794E+01 + PKER_SACCRG( 5, 31) = 0.296358E+01 + PKER_SACCRG( 5, 32) = 0.297938E+01 + PKER_SACCRG( 5, 33) = 0.299183E+01 + PKER_SACCRG( 5, 34) = 0.299407E+01 + PKER_SACCRG( 5, 35) = 0.300421E+01 + PKER_SACCRG( 5, 36) = 0.302549E+01 + PKER_SACCRG( 5, 37) = 0.000000E+00 + PKER_SACCRG( 5, 38) = 0.000000E+00 + PKER_SACCRG( 5, 39) = 0.000000E+00 + PKER_SACCRG( 5, 40) = 0.000000E+00 + PKER_SACCRG( 6, 1) = 0.113399E-04 + PKER_SACCRG( 6, 2) = 0.215064E-03 + PKER_SACCRG( 6, 3) = 0.202732E-03 + PKER_SACCRG( 6, 4) = 0.119915E-02 + PKER_SACCRG( 6, 5) = 0.127127E-02 + PKER_SACCRG( 6, 6) = 0.163527E-02 + PKER_SACCRG( 6, 7) = 0.237805E-02 + PKER_SACCRG( 6, 8) = 0.384847E-02 + PKER_SACCRG( 6, 9) = 0.497431E-02 + PKER_SACCRG( 6, 10) = 0.683637E-02 + PKER_SACCRG( 6, 11) = 0.119405E-01 + PKER_SACCRG( 6, 12) = 0.229776E-01 + PKER_SACCRG( 6, 13) = 0.437340E-01 + PKER_SACCRG( 6, 14) = 0.840961E-01 + PKER_SACCRG( 6, 15) = 0.154590E+00 + PKER_SACCRG( 6, 16) = 0.264896E+00 + PKER_SACCRG( 6, 17) = 0.420012E+00 + PKER_SACCRG( 6, 18) = 0.617142E+00 + PKER_SACCRG( 6, 19) = 0.844302E+00 + PKER_SACCRG( 6, 20) = 0.107600E+01 + PKER_SACCRG( 6, 21) = 0.130965E+01 + PKER_SACCRG( 6, 22) = 0.152596E+01 + PKER_SACCRG( 6, 23) = 0.169541E+01 + PKER_SACCRG( 6, 24) = 0.186600E+01 + PKER_SACCRG( 6, 25) = 0.198276E+01 + PKER_SACCRG( 6, 26) = 0.208029E+01 + PKER_SACCRG( 6, 27) = 0.216408E+01 + PKER_SACCRG( 6, 28) = 0.220656E+01 + PKER_SACCRG( 6, 29) = 0.224971E+01 + PKER_SACCRG( 6, 30) = 0.229446E+01 + PKER_SACCRG( 6, 31) = 0.232020E+01 + PKER_SACCRG( 6, 32) = 0.233613E+01 + PKER_SACCRG( 6, 33) = 0.234866E+01 + PKER_SACCRG( 6, 34) = 0.235098E+01 + PKER_SACCRG( 6, 35) = 0.236115E+01 + PKER_SACCRG( 6, 36) = 0.238249E+01 + PKER_SACCRG( 6, 37) = 0.000000E+00 + PKER_SACCRG( 6, 38) = 0.000000E+00 + PKER_SACCRG( 6, 39) = 0.000000E+00 + PKER_SACCRG( 6, 40) = 0.000000E+00 + PKER_SACCRG( 7, 1) = 0.140987E-06 + PKER_SACCRG( 7, 2) = 0.947184E-05 + PKER_SACCRG( 7, 3) = 0.179369E-03 + PKER_SACCRG( 7, 4) = 0.168563E-03 + PKER_SACCRG( 7, 5) = 0.993006E-03 + PKER_SACCRG( 7, 6) = 0.104915E-02 + PKER_SACCRG( 7, 7) = 0.134474E-02 + PKER_SACCRG( 7, 8) = 0.195051E-02 + PKER_SACCRG( 7, 9) = 0.315182E-02 + PKER_SACCRG( 7, 10) = 0.406997E-02 + PKER_SACCRG( 7, 11) = 0.558802E-02 + PKER_SACCRG( 7, 12) = 0.975020E-02 + PKER_SACCRG( 7, 13) = 0.187363E-01 + PKER_SACCRG( 7, 14) = 0.356024E-01 + PKER_SACCRG( 7, 15) = 0.683270E-01 + PKER_SACCRG( 7, 16) = 0.125305E+00 + PKER_SACCRG( 7, 17) = 0.214147E+00 + PKER_SACCRG( 7, 18) = 0.338617E+00 + PKER_SACCRG( 7, 19) = 0.495951E+00 + PKER_SACCRG( 7, 20) = 0.671057E+00 + PKER_SACCRG( 7, 21) = 0.860119E+00 + PKER_SACCRG( 7, 22) = 0.104532E+01 + PKER_SACCRG( 7, 23) = 0.119790E+01 + PKER_SACCRG( 7, 24) = 0.135335E+01 + PKER_SACCRG( 7, 25) = 0.146305E+01 + PKER_SACCRG( 7, 26) = 0.155556E+01 + PKER_SACCRG( 7, 27) = 0.163553E+01 + PKER_SACCRG( 7, 28) = 0.167695E+01 + PKER_SACCRG( 7, 29) = 0.171904E+01 + PKER_SACCRG( 7, 30) = 0.176289E+01 + PKER_SACCRG( 7, 31) = 0.178841E+01 + PKER_SACCRG( 7, 32) = 0.180429E+01 + PKER_SACCRG( 7, 33) = 0.181678E+01 + PKER_SACCRG( 7, 34) = 0.181916E+01 + PKER_SACCRG( 7, 35) = 0.182927E+01 + PKER_SACCRG( 7, 36) = 0.185045E+01 + PKER_SACCRG( 7, 37) = 0.000000E+00 + PKER_SACCRG( 7, 38) = 0.000000E+00 + PKER_SACCRG( 7, 39) = 0.000000E+00 + PKER_SACCRG( 7, 40) = 0.000000E+00 + PKER_SACCRG( 8, 1) = 0.000000E+00 + PKER_SACCRG( 8, 2) = 0.120931E-06 + PKER_SACCRG( 8, 3) = 0.796677E-05 + PKER_SACCRG( 8, 4) = 0.150232E-03 + PKER_SACCRG( 8, 5) = 0.140781E-03 + PKER_SACCRG( 8, 6) = 0.825725E-03 + PKER_SACCRG( 8, 7) = 0.867958E-03 + PKER_SACCRG( 8, 8) = 0.110764E-02 + PKER_SACCRG( 8, 9) = 0.160165E-02 + PKER_SACCRG( 8, 10) = 0.258288E-02 + PKER_SACCRG( 8, 11) = 0.333132E-02 + PKER_SACCRG( 8, 12) = 0.456846E-02 + PKER_SACCRG( 8, 13) = 0.795989E-02 + PKER_SACCRG( 8, 14) = 0.152680E-01 + PKER_SACCRG( 8, 15) = 0.289527E-01 + PKER_SACCRG( 8, 16) = 0.554343E-01 + PKER_SACCRG( 8, 17) = 0.101328E+00 + PKER_SACCRG( 8, 18) = 0.172576E+00 + PKER_SACCRG( 8, 19) = 0.271870E+00 + PKER_SACCRG( 8, 20) = 0.392855E+00 + PKER_SACCRG( 8, 21) = 0.534703E+00 + PKER_SACCRG( 8, 22) = 0.683665E+00 + PKER_SACCRG( 8, 23) = 0.814385E+00 + PKER_SACCRG( 8, 24) = 0.950462E+00 + PKER_SACCRG( 8, 25) = 0.105116E+01 + PKER_SACCRG( 8, 26) = 0.113664E+01 + PKER_SACCRG( 8, 27) = 0.121103E+01 + PKER_SACCRG( 8, 28) = 0.125059E+01 + PKER_SACCRG( 8, 29) = 0.128945E+01 + PKER_SACCRG( 8, 30) = 0.132965E+01 + PKER_SACCRG( 8, 31) = 0.135316E+01 + PKER_SACCRG( 8, 32) = 0.136781E+01 + PKER_SACCRG( 8, 33) = 0.137937E+01 + PKER_SACCRG( 8, 34) = 0.138153E+01 + PKER_SACCRG( 8, 35) = 0.139094E+01 + PKER_SACCRG( 8, 36) = 0.141107E+01 + PKER_SACCRG( 8, 37) = 0.000000E+00 + PKER_SACCRG( 8, 38) = 0.000000E+00 + PKER_SACCRG( 8, 39) = 0.000000E+00 + PKER_SACCRG( 8, 40) = 0.000000E+00 + PKER_SACCRG( 9, 1) = 0.000000E+00 + PKER_SACCRG( 9, 2) = 0.000000E+00 + PKER_SACCRG( 9, 3) = 0.104997E-06 + PKER_SACCRG( 9, 4) = 0.675258E-05 + PKER_SACCRG( 9, 5) = 0.126824E-03 + PKER_SACCRG( 9, 6) = 0.118316E-03 + PKER_SACCRG( 9, 7) = 0.690238E-03 + PKER_SACCRG( 9, 8) = 0.721206E-03 + PKER_SACCRG( 9, 9) = 0.915100E-03 + PKER_SACCRG( 9, 10) = 0.131754E-02 + PKER_SACCRG( 9, 11) = 0.143784E-02 + PKER_SACCRG( 9, 12) = 0.272855E-02 + PKER_SACCRG( 9, 13) = 0.373587E-02 + PKER_SACCRG( 9, 14) = 0.649562E-02 + PKER_SACCRG( 9, 15) = 0.120098E-01 + PKER_SACCRG( 9, 16) = 0.235379E-01 + PKER_SACCRG( 9, 17) = 0.448605E-01 + PKER_SACCRG( 9, 18) = 0.816757E-01 + PKER_SACCRG( 9, 19) = 0.138586E+00 + PKER_SACCRG( 9, 20) = 0.214609E+00 + PKER_SACCRG( 9, 21) = 0.312274E+00 + PKER_SACCRG( 9, 22) = 0.423436E+00 + PKER_SACCRG( 9, 23) = 0.528300E+00 + PKER_SACCRG( 9, 24) = 0.641806E+00 + PKER_SACCRG( 9, 25) = 0.730809E+00 + PKER_SACCRG( 9, 26) = 0.808021E+00 + PKER_SACCRG( 9, 27) = 0.875899E+00 + PKER_SACCRG( 9, 28) = 0.913416E+00 + PKER_SACCRG( 9, 29) = 0.949497E+00 + PKER_SACCRG( 9, 30) = 0.986085E+00 + PKER_SACCRG( 9, 31) = 0.100768E+01 + PKER_SACCRG( 9, 32) = 0.102123E+01 + PKER_SACCRG( 9, 33) = 0.103190E+01 + PKER_SACCRG( 9, 34) = 0.103403E+01 + PKER_SACCRG( 9, 35) = 0.104270E+01 + PKER_SACCRG( 9, 36) = 0.106096E+01 + PKER_SACCRG( 9, 37) = 0.000000E+00 + PKER_SACCRG( 9, 38) = 0.000000E+00 + PKER_SACCRG( 9, 39) = 0.000000E+00 + PKER_SACCRG( 9, 40) = 0.000000E+00 + PKER_SACCRG( 10, 1) = 0.000000E+00 + PKER_SACCRG( 10, 2) = 0.000000E+00 + PKER_SACCRG( 10, 3) = 0.000000E+00 + PKER_SACCRG( 10, 4) = 0.925928E-07 + PKER_SACCRG( 10, 5) = 0.578353E-05 + PKER_SACCRG( 10, 6) = 0.108100E-03 + PKER_SACCRG( 10, 7) = 0.100301E-03 + PKER_SACCRG( 10, 8) = 0.581236E-03 + PKER_SACCRG( 10, 9) = 0.602709E-03 + PKER_SACCRG( 10, 10) = 0.759037E-03 + PKER_SACCRG( 10, 11) = 0.108651E-02 + PKER_SACCRG( 10, 12) = 0.118139E-02 + PKER_SACCRG( 10, 13) = 0.223637E-02 + PKER_SACCRG( 10, 14) = 0.305413E-02 + PKER_SACCRG( 10, 15) = 0.529953E-02 + PKER_SACCRG( 10, 16) = 0.980986E-02 + PKER_SACCRG( 10, 17) = 0.190727E-01 + PKER_SACCRG( 10, 18) = 0.361040E-01 + PKER_SACCRG( 10, 19) = 0.657489E-01 + PKER_SACCRG( 10, 20) = 0.108973E+00 + PKER_SACCRG( 10, 21) = 0.170419E+00 + PKER_SACCRG( 10, 22) = 0.246769E+00 + PKER_SACCRG( 10, 23) = 0.324574E+00 + PKER_SACCRG( 10, 24) = 0.413749E+00 + PKER_SACCRG( 10, 25) = 0.487749E+00 + PKER_SACCRG( 10, 26) = 0.555040E+00 + PKER_SACCRG( 10, 27) = 0.614174E+00 + PKER_SACCRG( 10, 28) = 0.647730E+00 + PKER_SACCRG( 10, 29) = 0.679592E+00 + PKER_SACCRG( 10, 30) = 0.711627E+00 + PKER_SACCRG( 10, 31) = 0.730757E+00 + PKER_SACCRG( 10, 32) = 0.742853E+00 + PKER_SACCRG( 10, 33) = 0.752426E+00 + PKER_SACCRG( 10, 34) = 0.754388E+00 + PKER_SACCRG( 10, 35) = 0.762180E+00 + PKER_SACCRG( 10, 36) = 0.778605E+00 + PKER_SACCRG( 10, 37) = 0.000000E+00 + PKER_SACCRG( 10, 38) = 0.000000E+00 + PKER_SACCRG( 10, 39) = 0.000000E+00 + PKER_SACCRG( 10, 40) = 0.000000E+00 + PKER_SACCRG( 11, 1) = 0.000000E+00 + PKER_SACCRG( 11, 2) = 0.000000E+00 + PKER_SACCRG( 11, 3) = 0.000000E+00 + PKER_SACCRG( 11, 4) = 0.000000E+00 + PKER_SACCRG( 11, 5) = 0.832906E-07 + PKER_SACCRG( 11, 6) = 0.502409E-05 + PKER_SACCRG( 11, 7) = 0.933604E-04 + PKER_SACCRG( 11, 8) = 0.860483E-04 + PKER_SACCRG( 11, 9) = 0.494464E-03 + PKER_SACCRG( 11, 10) = 0.507648E-03 + PKER_SACCRG( 11, 11) = 0.632846E-03 + PKER_SACCRG( 11, 12) = 0.898351E-03 + PKER_SACCRG( 11, 13) = 0.971535E-03 + PKER_SACCRG( 11, 14) = 0.183107E-02 + PKER_SACCRG( 11, 15) = 0.249471E-02 + PKER_SACCRG( 11, 16) = 0.439233E-02 + PKER_SACCRG( 11, 17) = 0.797693E-02 + PKER_SACCRG( 11, 18) = 0.152441E-01 + PKER_SACCRG( 11, 19) = 0.293789E-01 + PKER_SACCRG( 11, 20) = 0.515725E-01 + PKER_SACCRG( 11, 21) = 0.871846E-01 + PKER_SACCRG( 11, 22) = 0.135867E+00 + PKER_SACCRG( 11, 23) = 0.189869E+00 + PKER_SACCRG( 11, 24) = 0.256544E+00 + PKER_SACCRG( 11, 25) = 0.317064E+00 + PKER_SACCRG( 11, 26) = 0.373502E+00 + PKER_SACCRG( 11, 27) = 0.424161E+00 + PKER_SACCRG( 11, 28) = 0.454262E+00 + PKER_SACCRG( 11, 29) = 0.480107E+00 + PKER_SACCRG( 11, 30) = 0.504244E+00 + PKER_SACCRG( 11, 31) = 0.518345E+00 + PKER_SACCRG( 11, 32) = 0.527147E+00 + PKER_SACCRG( 11, 33) = 0.534136E+00 + PKER_SACCRG( 11, 34) = 0.535557E+00 + PKER_SACCRG( 11, 35) = 0.541319E+00 + PKER_SACCRG( 11, 36) = 0.553653E+00 + PKER_SACCRG( 11, 37) = 0.000000E+00 + PKER_SACCRG( 11, 38) = 0.000000E+00 + PKER_SACCRG( 11, 39) = 0.000000E+00 + PKER_SACCRG( 11, 40) = 0.000000E+00 + PKER_SACCRG( 12, 1) = 0.000000E+00 + PKER_SACCRG( 12, 2) = 0.000000E+00 + PKER_SACCRG( 12, 3) = 0.000000E+00 + PKER_SACCRG( 12, 4) = 0.000000E+00 + PKER_SACCRG( 12, 5) = 0.000000E+00 + PKER_SACCRG( 12, 6) = 0.773960E-07 + PKER_SACCRG( 12, 7) = 0.444316E-05 + PKER_SACCRG( 12, 8) = 0.820904E-04 + PKER_SACCRG( 12, 9) = 0.749946E-04 + PKER_SACCRG( 12, 10) = 0.426372E-03 + PKER_SACCRG( 12, 11) = 0.431983E-03 + PKER_SACCRG( 12, 12) = 0.530818E-03 + PKER_SACCRG( 12, 13) = 0.743872E-03 + PKER_SACCRG( 12, 14) = 0.796002E-03 + PKER_SACCRG( 12, 15) = 0.116910E-02 + PKER_SACCRG( 12, 16) = 0.216714E-02 + PKER_SACCRG( 12, 17) = 0.358946E-02 + PKER_SACCRG( 12, 18) = 0.644847E-02 + PKER_SACCRG( 12, 19) = 0.128412E-01 + PKER_SACCRG( 12, 20) = 0.229402E-01 + PKER_SACCRG( 12, 21) = 0.422368E-01 + PKER_SACCRG( 12, 22) = 0.714492E-01 + PKER_SACCRG( 12, 23) = 0.106564E+00 + PKER_SACCRG( 12, 24) = 0.153890E+00 + PKER_SACCRG( 12, 25) = 0.202266E+00 + PKER_SACCRG( 12, 26) = 0.249410E+00 + PKER_SACCRG( 12, 27) = 0.293259E+00 + PKER_SACCRG( 12, 28) = 0.320617E+00 + PKER_SACCRG( 12, 29) = 0.341855E+00 + PKER_SACCRG( 12, 30) = 0.359983E+00 + PKER_SACCRG( 12, 31) = 0.370284E+00 + PKER_SACCRG( 12, 32) = 0.376667E+00 + PKER_SACCRG( 12, 33) = 0.381816E+00 + PKER_SACCRG( 12, 34) = 0.382869E+00 + PKER_SACCRG( 12, 35) = 0.387206E+00 + PKER_SACCRG( 12, 36) = 0.396588E+00 + PKER_SACCRG( 12, 37) = 0.000000E+00 + PKER_SACCRG( 12, 38) = 0.000000E+00 + PKER_SACCRG( 12, 39) = 0.000000E+00 + PKER_SACCRG( 12, 40) = 0.000000E+00 + PKER_SACCRG( 13, 1) = 0.000000E+00 + PKER_SACCRG( 13, 2) = 0.000000E+00 + PKER_SACCRG( 13, 3) = 0.000000E+00 + PKER_SACCRG( 13, 4) = 0.000000E+00 + PKER_SACCRG( 13, 5) = 0.000000E+00 + PKER_SACCRG( 13, 6) = 0.000000E+00 + PKER_SACCRG( 13, 7) = 0.735833E-07 + PKER_SACCRG( 13, 8) = 0.403716E-05 + PKER_SACCRG( 13, 9) = 0.739090E-04 + PKER_SACCRG( 13, 10) = 0.668732E-04 + PKER_SACCRG( 13, 11) = 0.374752E-03 + PKER_SACCRG( 13, 12) = 0.372451E-03 + PKER_SACCRG( 13, 13) = 0.447074E-03 + PKER_SACCRG( 13, 14) = 0.610717E-03 + PKER_SACCRG( 13, 15) = 0.641614E-03 + PKER_SACCRG( 13, 16) = 0.119058E-02 + PKER_SACCRG( 13, 17) = 0.179867E-02 + PKER_SACCRG( 13, 18) = 0.291204E-02 + PKER_SACCRG( 13, 19) = 0.606676E-02 + PKER_SACCRG( 13, 20) = 0.100429E-01 + PKER_SACCRG( 13, 21) = 0.203541E-01 + PKER_SACCRG( 13, 22) = 0.377872E-01 + PKER_SACCRG( 13, 23) = 0.606389E-01 + PKER_SACCRG( 13, 24) = 0.937549E-01 + PKER_SACCRG( 13, 25) = 0.133605E+00 + PKER_SACCRG( 13, 26) = 0.174990E+00 + PKER_SACCRG( 13, 27) = 0.214629E+00 + PKER_SACCRG( 13, 28) = 0.241011E+00 + PKER_SACCRG( 13, 29) = 0.258073E+00 + PKER_SACCRG( 13, 30) = 0.269310E+00 + PKER_SACCRG( 13, 31) = 0.274592E+00 + PKER_SACCRG( 13, 32) = 0.277413E+00 + PKER_SACCRG( 13, 33) = 0.279664E+00 + PKER_SACCRG( 13, 34) = 0.280055E+00 + PKER_SACCRG( 13, 35) = 0.282059E+00 + PKER_SACCRG( 13, 36) = 0.286665E+00 + PKER_SACCRG( 13, 37) = 0.000000E+00 + PKER_SACCRG( 13, 38) = 0.000000E+00 + PKER_SACCRG( 13, 39) = 0.000000E+00 + PKER_SACCRG( 13, 40) = 0.000000E+00 + PKER_SACCRG( 14, 1) = 0.000000E+00 + PKER_SACCRG( 14, 2) = 0.000000E+00 + PKER_SACCRG( 14, 3) = 0.000000E+00 + PKER_SACCRG( 14, 4) = 0.000000E+00 + PKER_SACCRG( 14, 5) = 0.000000E+00 + PKER_SACCRG( 14, 6) = 0.000000E+00 + PKER_SACCRG( 14, 7) = 0.000000E+00 + PKER_SACCRG( 14, 8) = 0.728176E-07 + PKER_SACCRG( 14, 9) = 0.379948E-05 + PKER_SACCRG( 14, 10) = 0.688582E-04 + PKER_SACCRG( 14, 11) = 0.614350E-04 + PKER_SACCRG( 14, 12) = 0.337324E-03 + PKER_SACCRG( 14, 13) = 0.324899E-03 + PKER_SACCRG( 14, 14) = 0.371520E-03 + PKER_SACCRG( 14, 15) = 0.478804E-03 + PKER_SACCRG( 14, 16) = 0.101697E-02 + PKER_SACCRG( 14, 17) = 0.102728E-02 + PKER_SACCRG( 14, 18) = 0.147349E-02 + PKER_SACCRG( 14, 19) = 0.368922E-02 + PKER_SACCRG( 14, 20) = 0.484994E-02 + PKER_SACCRG( 14, 21) = 0.109319E-01 + PKER_SACCRG( 14, 22) = 0.222066E-01 + PKER_SACCRG( 14, 23) = 0.380174E-01 + PKER_SACCRG( 14, 24) = 0.622359E-01 + PKER_SACCRG( 14, 25) = 0.978747E-01 + PKER_SACCRG( 14, 26) = 0.135839E+00 + PKER_SACCRG( 14, 27) = 0.174342E+00 + PKER_SACCRG( 14, 28) = 0.201882E+00 + PKER_SACCRG( 14, 29) = 0.216326E+00 + PKER_SACCRG( 14, 30) = 0.222044E+00 + PKER_SACCRG( 14, 31) = 0.222867E+00 + PKER_SACCRG( 14, 32) = 0.222379E+00 + PKER_SACCRG( 14, 33) = 0.221925E+00 + PKER_SACCRG( 14, 34) = 0.221667E+00 + PKER_SACCRG( 14, 35) = 0.221502E+00 + PKER_SACCRG( 14, 36) = 0.221629E+00 + PKER_SACCRG( 14, 37) = 0.000000E+00 + PKER_SACCRG( 14, 38) = 0.000000E+00 + PKER_SACCRG( 14, 39) = 0.000000E+00 + PKER_SACCRG( 14, 40) = 0.000000E+00 + PKER_SACCRG( 15, 1) = 0.000000E+00 + PKER_SACCRG( 15, 2) = 0.000000E+00 + PKER_SACCRG( 15, 3) = 0.000000E+00 + PKER_SACCRG( 15, 4) = 0.000000E+00 + PKER_SACCRG( 15, 5) = 0.000000E+00 + PKER_SACCRG( 15, 6) = 0.000000E+00 + PKER_SACCRG( 15, 7) = 0.000000E+00 + PKER_SACCRG( 15, 8) = 0.000000E+00 + PKER_SACCRG( 15, 9) = 0.759585E-07 + PKER_SACCRG( 15, 10) = 0.374710E-05 + PKER_SACCRG( 15, 11) = 0.671091E-04 + PKER_SACCRG( 15, 12) = 0.588014E-04 + PKER_SACCRG( 15, 13) = 0.311989E-03 + PKER_SACCRG( 15, 14) = 0.280346E-03 + PKER_SACCRG( 15, 15) = 0.278888E-03 + PKER_SACCRG( 15, 16) = 0.181122E-02 + PKER_SACCRG( 15, 17) = 0.951550E-03 + PKER_SACCRG( 15, 18) = 0.874685E-03 + PKER_SACCRG( 15, 19) = 0.341647E-02 + PKER_SACCRG( 15, 20) = 0.313074E-02 + PKER_SACCRG( 15, 21) = 0.790628E-02 + PKER_SACCRG( 15, 22) = 0.167408E-01 + PKER_SACCRG( 15, 23) = 0.292368E-01 + PKER_SACCRG( 15, 24) = 0.493019E-01 + PKER_SACCRG( 15, 25) = 0.846089E-01 + PKER_SACCRG( 15, 26) = 0.122848E+00 + PKER_SACCRG( 15, 27) = 0.164348E+00 + PKER_SACCRG( 15, 28) = 0.195653E+00 + PKER_SACCRG( 15, 29) = 0.209699E+00 + PKER_SACCRG( 15, 30) = 0.212297E+00 + PKER_SACCRG( 15, 31) = 0.209959E+00 + PKER_SACCRG( 15, 32) = 0.206919E+00 + PKER_SACCRG( 15, 33) = 0.204381E+00 + PKER_SACCRG( 15, 34) = 0.203587E+00 + PKER_SACCRG( 15, 35) = 0.201798E+00 + PKER_SACCRG( 15, 36) = 0.198561E+00 + PKER_SACCRG( 15, 37) = 0.000000E+00 + PKER_SACCRG( 15, 38) = 0.000000E+00 + PKER_SACCRG( 15, 39) = 0.000000E+00 + PKER_SACCRG( 15, 40) = 0.000000E+00 + PKER_SACCRG( 16, 1) = 0.000000E+00 + PKER_SACCRG( 16, 2) = 0.000000E+00 + PKER_SACCRG( 16, 3) = 0.000000E+00 + PKER_SACCRG( 16, 4) = 0.000000E+00 + PKER_SACCRG( 16, 5) = 0.000000E+00 + PKER_SACCRG( 16, 6) = 0.000000E+00 + PKER_SACCRG( 16, 7) = 0.000000E+00 + PKER_SACCRG( 16, 8) = 0.000000E+00 + PKER_SACCRG( 16, 9) = 0.000000E+00 + PKER_SACCRG( 16, 10) = 0.844481E-07 + PKER_SACCRG( 16, 11) = 0.394811E-05 + PKER_SACCRG( 16, 12) = 0.696323E-04 + PKER_SACCRG( 16, 13) = 0.591332E-04 + PKER_SACCRG( 16, 14) = 0.289674E-03 + PKER_SACCRG( 16, 15) = 0.202537E-03 + PKER_SACCRG( 16, 16) = 0.336844E-02 + PKER_SACCRG( 16, 17) = 0.178312E-02 + PKER_SACCRG( 16, 18) = 0.868492E-03 + PKER_SACCRG( 16, 19) = 0.435445E-02 + PKER_SACCRG( 16, 20) = 0.306476E-02 + PKER_SACCRG( 16, 21) = 0.776119E-02 + PKER_SACCRG( 16, 22) = 0.161954E-01 + PKER_SACCRG( 16, 23) = 0.276331E-01 + PKER_SACCRG( 16, 24) = 0.458394E-01 + PKER_SACCRG( 16, 25) = 0.831396E-01 + PKER_SACCRG( 16, 26) = 0.123760E+00 + PKER_SACCRG( 16, 27) = 0.170508E+00 + PKER_SACCRG( 16, 28) = 0.207373E+00 + PKER_SACCRG( 16, 29) = 0.222851E+00 + PKER_SACCRG( 16, 30) = 0.224550E+00 + PKER_SACCRG( 16, 31) = 0.220359E+00 + PKER_SACCRG( 16, 32) = 0.215498E+00 + PKER_SACCRG( 16, 33) = 0.211386E+00 + PKER_SACCRG( 16, 34) = 0.210132E+00 + PKER_SACCRG( 16, 35) = 0.207094E+00 + PKER_SACCRG( 16, 36) = 0.201428E+00 + PKER_SACCRG( 16, 37) = 0.000000E+00 + PKER_SACCRG( 16, 38) = 0.000000E+00 + PKER_SACCRG( 16, 39) = 0.000000E+00 + PKER_SACCRG( 16, 40) = 0.000000E+00 + PKER_SACCRG( 17, 1) = 0.000000E+00 + PKER_SACCRG( 17, 2) = 0.000000E+00 + PKER_SACCRG( 17, 3) = 0.000000E+00 + PKER_SACCRG( 17, 4) = 0.000000E+00 + PKER_SACCRG( 17, 5) = 0.000000E+00 + PKER_SACCRG( 17, 6) = 0.000000E+00 + PKER_SACCRG( 17, 7) = 0.000000E+00 + PKER_SACCRG( 17, 8) = 0.000000E+00 + PKER_SACCRG( 17, 9) = 0.000000E+00 + PKER_SACCRG( 17, 10) = 0.000000E+00 + PKER_SACCRG( 17, 11) = 0.102418E-06 + PKER_SACCRG( 17, 12) = 0.455940E-05 + PKER_SACCRG( 17, 13) = 0.784312E-04 + PKER_SACCRG( 17, 14) = 0.614879E-04 + PKER_SACCRG( 17, 15) = 0.207160E-03 + PKER_SACCRG( 17, 16) = 0.889438E-02 + PKER_SACCRG( 17, 17) = 0.339624E-02 + PKER_SACCRG( 17, 18) = 0.106437E-02 + PKER_SACCRG( 17, 19) = 0.779689E-02 + PKER_SACCRG( 17, 20) = 0.404959E-02 + PKER_SACCRG( 17, 21) = 0.101250E-01 + PKER_SACCRG( 17, 22) = 0.196042E-01 + PKER_SACCRG( 17, 23) = 0.307730E-01 + PKER_SACCRG( 17, 24) = 0.480533E-01 + PKER_SACCRG( 17, 25) = 0.885797E-01 + PKER_SACCRG( 17, 26) = 0.132905E+00 + PKER_SACCRG( 17, 27) = 0.187039E+00 + PKER_SACCRG( 17, 28) = 0.231099E+00 + PKER_SACCRG( 17, 29) = 0.249500E+00 + PKER_SACCRG( 17, 30) = 0.252291E+00 + PKER_SACCRG( 17, 31) = 0.247487E+00 + PKER_SACCRG( 17, 32) = 0.241587E+00 + PKER_SACCRG( 17, 33) = 0.236485E+00 + PKER_SACCRG( 17, 34) = 0.234962E+00 + PKER_SACCRG( 17, 35) = 0.231075E+00 + PKER_SACCRG( 17, 36) = 0.223581E+00 + PKER_SACCRG( 17, 37) = 0.000000E+00 + PKER_SACCRG( 17, 38) = 0.000000E+00 + PKER_SACCRG( 17, 39) = 0.000000E+00 + PKER_SACCRG( 17, 40) = 0.000000E+00 + PKER_SACCRG( 18, 1) = 0.000000E+00 + PKER_SACCRG( 18, 2) = 0.000000E+00 + PKER_SACCRG( 18, 3) = 0.000000E+00 + PKER_SACCRG( 18, 4) = 0.000000E+00 + PKER_SACCRG( 18, 5) = 0.000000E+00 + PKER_SACCRG( 18, 6) = 0.000000E+00 + PKER_SACCRG( 18, 7) = 0.000000E+00 + PKER_SACCRG( 18, 8) = 0.000000E+00 + PKER_SACCRG( 18, 9) = 0.000000E+00 + PKER_SACCRG( 18, 10) = 0.000000E+00 + PKER_SACCRG( 18, 11) = 0.000000E+00 + PKER_SACCRG( 18, 12) = 0.140103E-06 + PKER_SACCRG( 18, 13) = 0.596643E-05 + PKER_SACCRG( 18, 14) = 0.955662E-04 + PKER_SACCRG( 18, 15) = 0.467666E-04 + PKER_SACCRG( 18, 16) = 0.950209E-02 + PKER_SACCRG( 18, 17) = 0.886291E-02 + PKER_SACCRG( 18, 18) = 0.338287E-02 + PKER_SACCRG( 18, 19) = 0.122056E-01 + PKER_SACCRG( 18, 20) = 0.719648E-02 + PKER_SACCRG( 18, 21) = 0.173349E-01 + PKER_SACCRG( 18, 22) = 0.268718E-01 + PKER_SACCRG( 18, 23) = 0.384549E-01 + PKER_SACCRG( 18, 24) = 0.531665E-01 + PKER_SACCRG( 18, 25) = 0.967650E-01 + PKER_SACCRG( 18, 26) = 0.143690E+00 + PKER_SACCRG( 18, 27) = 0.205036E+00 + PKER_SACCRG( 18, 28) = 0.256245E+00 + PKER_SACCRG( 18, 29) = 0.278068E+00 + PKER_SACCRG( 18, 30) = 0.283239E+00 + PKER_SACCRG( 18, 31) = 0.278809E+00 + PKER_SACCRG( 18, 32) = 0.272567E+00 + PKER_SACCRG( 18, 33) = 0.267046E+00 + PKER_SACCRG( 18, 34) = 0.265383E+00 + PKER_SACCRG( 18, 35) = 0.261124E+00 + PKER_SACCRG( 18, 36) = 0.252857E+00 + PKER_SACCRG( 18, 37) = 0.000000E+00 + PKER_SACCRG( 18, 38) = 0.000000E+00 + PKER_SACCRG( 18, 39) = 0.000000E+00 + PKER_SACCRG( 18, 40) = 0.000000E+00 + PKER_SACCRG( 19, 1) = 0.000000E+00 + PKER_SACCRG( 19, 2) = 0.000000E+00 + PKER_SACCRG( 19, 3) = 0.000000E+00 + PKER_SACCRG( 19, 4) = 0.000000E+00 + PKER_SACCRG( 19, 5) = 0.000000E+00 + PKER_SACCRG( 19, 6) = 0.000000E+00 + PKER_SACCRG( 19, 7) = 0.000000E+00 + PKER_SACCRG( 19, 8) = 0.000000E+00 + PKER_SACCRG( 19, 9) = 0.000000E+00 + PKER_SACCRG( 19, 10) = 0.000000E+00 + PKER_SACCRG( 19, 11) = 0.000000E+00 + PKER_SACCRG( 19, 12) = 0.000000E+00 + PKER_SACCRG( 19, 13) = 0.227778E-06 + PKER_SACCRG( 19, 14) = 0.900623E-05 + PKER_SACCRG( 19, 15) = 0.841460E-04 + PKER_SACCRG( 19, 16) = 0.386383E-01 + PKER_SACCRG( 19, 17) = 0.931861E-02 + PKER_SACCRG( 19, 18) = 0.873078E-02 + PKER_SACCRG( 19, 19) = 0.212263E-01 + PKER_SACCRG( 19, 20) = 0.110801E-01 + PKER_SACCRG( 19, 21) = 0.233312E-01 + PKER_SACCRG( 19, 22) = 0.377998E-01 + PKER_SACCRG( 19, 23) = 0.473076E-01 + PKER_SACCRG( 19, 24) = 0.634436E-01 + PKER_SACCRG( 19, 25) = 0.108864E+00 + PKER_SACCRG( 19, 26) = 0.154870E+00 + PKER_SACCRG( 19, 27) = 0.221137E+00 + PKER_SACCRG( 19, 28) = 0.278289E+00 + PKER_SACCRG( 19, 29) = 0.303277E+00 + PKER_SACCRG( 19, 30) = 0.311313E+00 + PKER_SACCRG( 19, 31) = 0.307763E+00 + PKER_SACCRG( 19, 32) = 0.301613E+00 + PKER_SACCRG( 19, 33) = 0.296055E+00 + PKER_SACCRG( 19, 34) = 0.294365E+00 + PKER_SACCRG( 19, 35) = 0.290056E+00 + PKER_SACCRG( 19, 36) = 0.281642E+00 + PKER_SACCRG( 19, 37) = 0.000000E+00 + PKER_SACCRG( 19, 38) = 0.000000E+00 + PKER_SACCRG( 19, 39) = 0.000000E+00 + PKER_SACCRG( 19, 40) = 0.000000E+00 + PKER_SACCRG( 20, 1) = 0.000000E+00 + PKER_SACCRG( 20, 2) = 0.000000E+00 + PKER_SACCRG( 20, 3) = 0.000000E+00 + PKER_SACCRG( 20, 4) = 0.000000E+00 + PKER_SACCRG( 20, 5) = 0.000000E+00 + PKER_SACCRG( 20, 6) = 0.000000E+00 + PKER_SACCRG( 20, 7) = 0.000000E+00 + PKER_SACCRG( 20, 8) = 0.000000E+00 + PKER_SACCRG( 20, 9) = 0.000000E+00 + PKER_SACCRG( 20, 10) = 0.000000E+00 + PKER_SACCRG( 20, 11) = 0.000000E+00 + PKER_SACCRG( 20, 12) = 0.000000E+00 + PKER_SACCRG( 20, 13) = 0.129560E-08 + PKER_SACCRG( 20, 14) = 0.461750E-06 + PKER_SACCRG( 20, 15) = 0.991868E-05 + PKER_SACCRG( 20, 16) = 0.404619E-01 + PKER_SACCRG( 20, 17) = 0.376740E-01 + PKER_SACCRG( 20, 18) = 0.912299E-02 + PKER_SACCRG( 20, 19) = 0.431984E-01 + PKER_SACCRG( 20, 20) = 0.191703E-01 + PKER_SACCRG( 20, 21) = 0.492406E-01 + PKER_SACCRG( 20, 22) = 0.618254E-01 + PKER_SACCRG( 20, 23) = 0.738280E-01 + PKER_SACCRG( 20, 24) = 0.817314E-01 + PKER_SACCRG( 20, 25) = 0.125224E+00 + PKER_SACCRG( 20, 26) = 0.171144E+00 + PKER_SACCRG( 20, 27) = 0.237848E+00 + PKER_SACCRG( 20, 28) = 0.298348E+00 + PKER_SACCRG( 20, 29) = 0.325776E+00 + PKER_SACCRG( 20, 30) = 0.336589E+00 + PKER_SACCRG( 20, 31) = 0.333991E+00 + PKER_SACCRG( 20, 32) = 0.328042E+00 + PKER_SACCRG( 20, 33) = 0.322558E+00 + PKER_SACCRG( 20, 34) = 0.320859E+00 + PKER_SACCRG( 20, 35) = 0.316600E+00 + PKER_SACCRG( 20, 36) = 0.308313E+00 + PKER_SACCRG( 20, 37) = 0.000000E+00 + PKER_SACCRG( 20, 38) = 0.000000E+00 + PKER_SACCRG( 20, 39) = 0.000000E+00 + PKER_SACCRG( 20, 40) = 0.000000E+00 + PKER_SACCRG( 21, 1) = 0.000000E+00 + PKER_SACCRG( 21, 2) = 0.000000E+00 + PKER_SACCRG( 21, 3) = 0.000000E+00 + PKER_SACCRG( 21, 4) = 0.000000E+00 + PKER_SACCRG( 21, 5) = 0.000000E+00 + PKER_SACCRG( 21, 6) = 0.000000E+00 + PKER_SACCRG( 21, 7) = 0.000000E+00 + PKER_SACCRG( 21, 8) = 0.000000E+00 + PKER_SACCRG( 21, 9) = 0.000000E+00 + PKER_SACCRG( 21, 10) = 0.000000E+00 + PKER_SACCRG( 21, 11) = 0.000000E+00 + PKER_SACCRG( 21, 12) = 0.000000E+00 + PKER_SACCRG( 21, 13) = 0.000000E+00 + PKER_SACCRG( 21, 14) = 0.944456E-08 + PKER_SACCRG( 21, 15) = 0.743621E-06 + PKER_SACCRG( 21, 16) = 0.442453E+00 + PKER_SACCRG( 21, 17) = 0.391188E-01 + PKER_SACCRG( 21, 18) = 0.365342E-01 + PKER_SACCRG( 21, 19) = 0.111999E+00 + PKER_SACCRG( 21, 20) = 0.388643E-01 + PKER_SACCRG( 21, 21) = 0.848382E-01 + PKER_SACCRG( 21, 22) = 0.875713E-01 + PKER_SACCRG( 21, 23) = 0.938496E-01 + PKER_SACCRG( 21, 24) = 0.107423E+00 + PKER_SACCRG( 21, 25) = 0.155062E+00 + PKER_SACCRG( 21, 26) = 0.191831E+00 + PKER_SACCRG( 21, 27) = 0.256278E+00 + PKER_SACCRG( 21, 28) = 0.316744E+00 + PKER_SACCRG( 21, 29) = 0.344380E+00 + PKER_SACCRG( 21, 30) = 0.357297E+00 + PKER_SACCRG( 21, 31) = 0.355528E+00 + PKER_SACCRG( 21, 32) = 0.349787E+00 + PKER_SACCRG( 21, 33) = 0.344401E+00 + PKER_SACCRG( 21, 34) = 0.342705E+00 + PKER_SACCRG( 21, 35) = 0.338523E+00 + PKER_SACCRG( 21, 36) = 0.330421E+00 + PKER_SACCRG( 21, 37) = 0.000000E+00 + PKER_SACCRG( 21, 38) = 0.000000E+00 + PKER_SACCRG( 21, 39) = 0.000000E+00 + PKER_SACCRG( 21, 40) = 0.000000E+00 + PKER_SACCRG( 22, 1) = 0.000000E+00 + PKER_SACCRG( 22, 2) = 0.000000E+00 + PKER_SACCRG( 22, 3) = 0.000000E+00 + PKER_SACCRG( 22, 4) = 0.000000E+00 + PKER_SACCRG( 22, 5) = 0.000000E+00 + PKER_SACCRG( 22, 6) = 0.000000E+00 + PKER_SACCRG( 22, 7) = 0.000000E+00 + PKER_SACCRG( 22, 8) = 0.000000E+00 + PKER_SACCRG( 22, 9) = 0.000000E+00 + PKER_SACCRG( 22, 10) = 0.000000E+00 + PKER_SACCRG( 22, 11) = 0.000000E+00 + PKER_SACCRG( 22, 12) = 0.000000E+00 + PKER_SACCRG( 22, 13) = 0.000000E+00 + PKER_SACCRG( 22, 14) = 0.000000E+00 + PKER_SACCRG( 22, 15) = 0.301594E-07 + PKER_SACCRG( 22, 16) = 0.458593E+00 + PKER_SACCRG( 22, 17) = 0.425018E+00 + PKER_SACCRG( 22, 18) = 0.376611E-01 + PKER_SACCRG( 22, 19) = 0.115562E+00 + PKER_SACCRG( 22, 20) = 0.101686E+00 + PKER_SACCRG( 22, 21) = 0.171258E+00 + PKER_SACCRG( 22, 22) = 0.133854E+00 + PKER_SACCRG( 22, 23) = 0.170618E+00 + PKER_SACCRG( 22, 24) = 0.159301E+00 + PKER_SACCRG( 22, 25) = 0.195009E+00 + PKER_SACCRG( 22, 26) = 0.229057E+00 + PKER_SACCRG( 22, 27) = 0.279005E+00 + PKER_SACCRG( 22, 28) = 0.335986E+00 + PKER_SACCRG( 22, 29) = 0.360465E+00 + PKER_SACCRG( 22, 30) = 0.374161E+00 + PKER_SACCRG( 22, 31) = 0.372873E+00 + PKER_SACCRG( 22, 32) = 0.367297E+00 + PKER_SACCRG( 22, 33) = 0.361988E+00 + PKER_SACCRG( 22, 34) = 0.360293E+00 + PKER_SACCRG( 22, 35) = 0.356173E+00 + PKER_SACCRG( 22, 36) = 0.348226E+00 + PKER_SACCRG( 22, 37) = 0.000000E+00 + PKER_SACCRG( 22, 38) = 0.000000E+00 + PKER_SACCRG( 22, 39) = 0.000000E+00 + PKER_SACCRG( 22, 40) = 0.000000E+00 + PKER_SACCRG( 23, 1) = 0.000000E+00 + PKER_SACCRG( 23, 2) = 0.000000E+00 + PKER_SACCRG( 23, 3) = 0.000000E+00 + PKER_SACCRG( 23, 4) = 0.000000E+00 + PKER_SACCRG( 23, 5) = 0.000000E+00 + PKER_SACCRG( 23, 6) = 0.000000E+00 + PKER_SACCRG( 23, 7) = 0.000000E+00 + PKER_SACCRG( 23, 8) = 0.000000E+00 + PKER_SACCRG( 23, 9) = 0.000000E+00 + PKER_SACCRG( 23, 10) = 0.000000E+00 + PKER_SACCRG( 23, 11) = 0.000000E+00 + PKER_SACCRG( 23, 12) = 0.000000E+00 + PKER_SACCRG( 23, 13) = 0.000000E+00 + PKER_SACCRG( 23, 14) = 0.000000E+00 + PKER_SACCRG( 23, 15) = 0.474816E-09 + PKER_SACCRG( 23, 16) = 0.471716E+00 + PKER_SACCRG( 23, 17) = 0.438382E+00 + PKER_SACCRG( 23, 18) = 0.385478E-01 + PKER_SACCRG( 23, 19) = 0.460661E+00 + PKER_SACCRG( 23, 20) = 0.104389E+00 + PKER_SACCRG( 23, 21) = 0.175908E+00 + PKER_SACCRG( 23, 22) = 0.228218E+00 + PKER_SACCRG( 23, 23) = 0.262318E+00 + PKER_SACCRG( 23, 24) = 0.210313E+00 + PKER_SACCRG( 23, 25) = 0.229302E+00 + PKER_SACCRG( 23, 26) = 0.277715E+00 + PKER_SACCRG( 23, 27) = 0.316637E+00 + PKER_SACCRG( 23, 28) = 0.358767E+00 + PKER_SACCRG( 23, 29) = 0.376353E+00 + PKER_SACCRG( 23, 30) = 0.388397E+00 + PKER_SACCRG( 23, 31) = 0.386871E+00 + PKER_SACCRG( 23, 32) = 0.381361E+00 + PKER_SACCRG( 23, 33) = 0.376104E+00 + PKER_SACCRG( 23, 34) = 0.374406E+00 + PKER_SACCRG( 23, 35) = 0.370329E+00 + PKER_SACCRG( 23, 36) = 0.362490E+00 + PKER_SACCRG( 23, 37) = 0.000000E+00 + PKER_SACCRG( 23, 38) = 0.000000E+00 + PKER_SACCRG( 23, 39) = 0.000000E+00 + PKER_SACCRG( 23, 40) = 0.000000E+00 + PKER_SACCRG( 24, 1) = 0.000000E+00 + PKER_SACCRG( 24, 2) = 0.000000E+00 + PKER_SACCRG( 24, 3) = 0.000000E+00 + PKER_SACCRG( 24, 4) = 0.000000E+00 + PKER_SACCRG( 24, 5) = 0.000000E+00 + PKER_SACCRG( 24, 6) = 0.000000E+00 + PKER_SACCRG( 24, 7) = 0.000000E+00 + PKER_SACCRG( 24, 8) = 0.000000E+00 + PKER_SACCRG( 24, 9) = 0.000000E+00 + PKER_SACCRG( 24, 10) = 0.000000E+00 + PKER_SACCRG( 24, 11) = 0.000000E+00 + PKER_SACCRG( 24, 12) = 0.000000E+00 + PKER_SACCRG( 24, 13) = 0.000000E+00 + PKER_SACCRG( 24, 14) = 0.000000E+00 + PKER_SACCRG( 24, 15) = 0.000000E+00 + PKER_SACCRG( 24, 16) = 0.482421E+00 + PKER_SACCRG( 24, 17) = 0.449246E+00 + PKER_SACCRG( 24, 18) = 0.418021E+00 + PKER_SACCRG( 24, 19) = 0.471528E+00 + PKER_SACCRG( 24, 20) = 0.106574E+00 + PKER_SACCRG( 24, 21) = 0.457583E+00 + PKER_SACCRG( 24, 22) = 0.457441E+00 + PKER_SACCRG( 24, 23) = 0.268282E+00 + PKER_SACCRG( 24, 24) = 0.295154E+00 + PKER_SACCRG( 24, 25) = 0.277246E+00 + PKER_SACCRG( 24, 26) = 0.318509E+00 + PKER_SACCRG( 24, 27) = 0.341083E+00 + PKER_SACCRG( 24, 28) = 0.383566E+00 + PKER_SACCRG( 24, 29) = 0.393965E+00 + PKER_SACCRG( 24, 30) = 0.400814E+00 + PKER_SACCRG( 24, 31) = 0.398325E+00 + PKER_SACCRG( 24, 32) = 0.392699E+00 + PKER_SACCRG( 24, 33) = 0.387475E+00 + PKER_SACCRG( 24, 34) = 0.385773E+00 + PKER_SACCRG( 24, 35) = 0.381723E+00 + PKER_SACCRG( 24, 36) = 0.373956E+00 + PKER_SACCRG( 24, 37) = 0.000000E+00 + PKER_SACCRG( 24, 38) = 0.000000E+00 + PKER_SACCRG( 24, 39) = 0.000000E+00 + PKER_SACCRG( 24, 40) = 0.000000E+00 + PKER_SACCRG( 25, 1) = 0.000000E+00 + PKER_SACCRG( 25, 2) = 0.000000E+00 + PKER_SACCRG( 25, 3) = 0.000000E+00 + PKER_SACCRG( 25, 4) = 0.000000E+00 + PKER_SACCRG( 25, 5) = 0.000000E+00 + PKER_SACCRG( 25, 6) = 0.000000E+00 + PKER_SACCRG( 25, 7) = 0.000000E+00 + PKER_SACCRG( 25, 8) = 0.000000E+00 + PKER_SACCRG( 25, 9) = 0.000000E+00 + PKER_SACCRG( 25, 10) = 0.000000E+00 + PKER_SACCRG( 25, 11) = 0.000000E+00 + PKER_SACCRG( 25, 12) = 0.000000E+00 + PKER_SACCRG( 25, 13) = 0.000000E+00 + PKER_SACCRG( 25, 14) = 0.000000E+00 + PKER_SACCRG( 25, 15) = 0.000000E+00 + PKER_SACCRG( 25, 16) = 0.493305E+00 + PKER_SACCRG( 25, 17) = 0.460084E+00 + PKER_SACCRG( 25, 18) = 0.428847E+00 + PKER_SACCRG( 25, 19) = 0.482480E+00 + PKER_SACCRG( 25, 20) = 0.457996E+00 + PKER_SACCRG( 25, 21) = 0.468489E+00 + PKER_SACCRG( 25, 22) = 0.468385E+00 + PKER_SACCRG( 25, 23) = 0.465913E+00 + PKER_SACCRG( 25, 24) = 0.302045E+00 + PKER_SACCRG( 25, 25) = 0.349681E+00 + PKER_SACCRG( 25, 26) = 0.375849E+00 + PKER_SACCRG( 25, 27) = 0.372009E+00 + PKER_SACCRG( 25, 28) = 0.404973E+00 + PKER_SACCRG( 25, 29) = 0.408427E+00 + PKER_SACCRG( 25, 30) = 0.413563E+00 + PKER_SACCRG( 25, 31) = 0.409638E+00 + PKER_SACCRG( 25, 32) = 0.403614E+00 + PKER_SACCRG( 25, 33) = 0.398367E+00 + PKER_SACCRG( 25, 34) = 0.396652E+00 + PKER_SACCRG( 25, 35) = 0.392598E+00 + PKER_SACCRG( 25, 36) = 0.384841E+00 + PKER_SACCRG( 25, 37) = 0.000000E+00 + PKER_SACCRG( 25, 38) = 0.000000E+00 + PKER_SACCRG( 25, 39) = 0.000000E+00 + PKER_SACCRG( 25, 40) = 0.000000E+00 + PKER_SACCRG( 26, 1) = 0.000000E+00 + PKER_SACCRG( 26, 2) = 0.000000E+00 + PKER_SACCRG( 26, 3) = 0.000000E+00 + PKER_SACCRG( 26, 4) = 0.000000E+00 + PKER_SACCRG( 26, 5) = 0.000000E+00 + PKER_SACCRG( 26, 6) = 0.000000E+00 + PKER_SACCRG( 26, 7) = 0.000000E+00 + PKER_SACCRG( 26, 8) = 0.000000E+00 + PKER_SACCRG( 26, 9) = 0.000000E+00 + PKER_SACCRG( 26, 10) = 0.000000E+00 + PKER_SACCRG( 26, 11) = 0.000000E+00 + PKER_SACCRG( 26, 12) = 0.000000E+00 + PKER_SACCRG( 26, 13) = 0.000000E+00 + PKER_SACCRG( 26, 14) = 0.000000E+00 + PKER_SACCRG( 26, 15) = 0.000000E+00 + PKER_SACCRG( 26, 16) = 0.498360E+00 + PKER_SACCRG( 26, 17) = 0.465358E+00 + PKER_SACCRG( 26, 18) = 0.434351E+00 + PKER_SACCRG( 26, 19) = 0.487671E+00 + PKER_SACCRG( 26, 20) = 0.463284E+00 + PKER_SACCRG( 26, 21) = 0.473752E+00 + PKER_SACCRG( 26, 22) = 0.473679E+00 + PKER_SACCRG( 26, 23) = 0.471200E+00 + PKER_SACCRG( 26, 24) = 0.305321E+00 + PKER_SACCRG( 26, 25) = 0.460272E+00 + PKER_SACCRG( 26, 26) = 0.380186E+00 + PKER_SACCRG( 26, 27) = 0.407235E+00 + PKER_SACCRG( 26, 28) = 0.425703E+00 + PKER_SACCRG( 26, 29) = 0.419464E+00 + PKER_SACCRG( 26, 30) = 0.420713E+00 + PKER_SACCRG( 26, 31) = 0.415965E+00 + PKER_SACCRG( 26, 32) = 0.409433E+00 + PKER_SACCRG( 26, 33) = 0.404156E+00 + PKER_SACCRG( 26, 34) = 0.402444E+00 + PKER_SACCRG( 26, 35) = 0.398420E+00 + PKER_SACCRG( 26, 36) = 0.390729E+00 + PKER_SACCRG( 26, 37) = 0.000000E+00 + PKER_SACCRG( 26, 38) = 0.000000E+00 + PKER_SACCRG( 26, 39) = 0.000000E+00 + PKER_SACCRG( 26, 40) = 0.000000E+00 + PKER_SACCRG( 27, 1) = 0.000000E+00 + PKER_SACCRG( 27, 2) = 0.000000E+00 + PKER_SACCRG( 27, 3) = 0.000000E+00 + PKER_SACCRG( 27, 4) = 0.000000E+00 + PKER_SACCRG( 27, 5) = 0.000000E+00 + PKER_SACCRG( 27, 6) = 0.000000E+00 + PKER_SACCRG( 27, 7) = 0.000000E+00 + PKER_SACCRG( 27, 8) = 0.000000E+00 + PKER_SACCRG( 27, 9) = 0.000000E+00 + PKER_SACCRG( 27, 10) = 0.000000E+00 + PKER_SACCRG( 27, 11) = 0.000000E+00 + PKER_SACCRG( 27, 12) = 0.000000E+00 + PKER_SACCRG( 27, 13) = 0.000000E+00 + PKER_SACCRG( 27, 14) = 0.000000E+00 + PKER_SACCRG( 27, 15) = 0.000000E+00 + PKER_SACCRG( 27, 16) = 0.504260E+00 + PKER_SACCRG( 27, 17) = 0.471302E+00 + PKER_SACCRG( 27, 18) = 0.440353E+00 + PKER_SACCRG( 27, 19) = 0.493636E+00 + PKER_SACCRG( 27, 20) = 0.469232E+00 + PKER_SACCRG( 27, 21) = 0.479719E+00 + PKER_SACCRG( 27, 22) = 0.479669E+00 + PKER_SACCRG( 27, 23) = 0.477177E+00 + PKER_SACCRG( 27, 24) = 0.464189E+00 + PKER_SACCRG( 27, 25) = 0.466286E+00 + PKER_SACCRG( 27, 26) = 0.385058E+00 + PKER_SACCRG( 27, 27) = 0.412596E+00 + PKER_SACCRG( 27, 28) = 0.452611E+00 + PKER_SACCRG( 27, 29) = 0.433046E+00 + PKER_SACCRG( 27, 30) = 0.428880E+00 + PKER_SACCRG( 27, 31) = 0.422050E+00 + PKER_SACCRG( 27, 32) = 0.415579E+00 + PKER_SACCRG( 27, 33) = 0.410255E+00 + PKER_SACCRG( 27, 34) = 0.408538E+00 + PKER_SACCRG( 27, 35) = 0.404518E+00 + PKER_SACCRG( 27, 36) = 0.396847E+00 + PKER_SACCRG( 27, 37) = 0.000000E+00 + PKER_SACCRG( 27, 38) = 0.000000E+00 + PKER_SACCRG( 27, 39) = 0.000000E+00 + PKER_SACCRG( 27, 40) = 0.000000E+00 + PKER_SACCRG( 28, 1) = 0.000000E+00 + PKER_SACCRG( 28, 2) = 0.000000E+00 + PKER_SACCRG( 28, 3) = 0.000000E+00 + PKER_SACCRG( 28, 4) = 0.000000E+00 + PKER_SACCRG( 28, 5) = 0.000000E+00 + PKER_SACCRG( 28, 6) = 0.000000E+00 + PKER_SACCRG( 28, 7) = 0.000000E+00 + PKER_SACCRG( 28, 8) = 0.000000E+00 + PKER_SACCRG( 28, 9) = 0.000000E+00 + PKER_SACCRG( 28, 10) = 0.000000E+00 + PKER_SACCRG( 28, 11) = 0.000000E+00 + PKER_SACCRG( 28, 12) = 0.000000E+00 + PKER_SACCRG( 28, 13) = 0.000000E+00 + PKER_SACCRG( 28, 14) = 0.000000E+00 + PKER_SACCRG( 28, 15) = 0.000000E+00 + PKER_SACCRG( 28, 16) = 0.511289E+00 + PKER_SACCRG( 28, 17) = 0.478218E+00 + PKER_SACCRG( 28, 18) = 0.447169E+00 + PKER_SACCRG( 28, 19) = 0.500667E+00 + PKER_SACCRG( 28, 20) = 0.476141E+00 + PKER_SACCRG( 28, 21) = 0.486690E+00 + PKER_SACCRG( 28, 22) = 0.486657E+00 + PKER_SACCRG( 28, 23) = 0.484143E+00 + PKER_SACCRG( 28, 24) = 0.471128E+00 + PKER_SACCRG( 28, 25) = 0.473232E+00 + PKER_SACCRG( 28, 26) = 0.467330E+00 + PKER_SACCRG( 28, 27) = 0.462303E+00 + PKER_SACCRG( 28, 28) = 0.459518E+00 + PKER_SACCRG( 28, 29) = 0.439730E+00 + PKER_SACCRG( 28, 30) = 0.435663E+00 + PKER_SACCRG( 28, 31) = 0.429350E+00 + PKER_SACCRG( 28, 32) = 0.422348E+00 + PKER_SACCRG( 28, 33) = 0.417002E+00 + PKER_SACCRG( 28, 34) = 0.415273E+00 + PKER_SACCRG( 28, 35) = 0.411238E+00 + PKER_SACCRG( 28, 36) = 0.403544E+00 + PKER_SACCRG( 28, 37) = 0.000000E+00 + PKER_SACCRG( 28, 38) = 0.000000E+00 + PKER_SACCRG( 28, 39) = 0.000000E+00 + PKER_SACCRG( 28, 40) = 0.000000E+00 + PKER_SACCRG( 29, 1) = 0.000000E+00 + PKER_SACCRG( 29, 2) = 0.000000E+00 + PKER_SACCRG( 29, 3) = 0.000000E+00 + PKER_SACCRG( 29, 4) = 0.000000E+00 + PKER_SACCRG( 29, 5) = 0.000000E+00 + PKER_SACCRG( 29, 6) = 0.000000E+00 + PKER_SACCRG( 29, 7) = 0.000000E+00 + PKER_SACCRG( 29, 8) = 0.000000E+00 + PKER_SACCRG( 29, 9) = 0.000000E+00 + PKER_SACCRG( 29, 10) = 0.000000E+00 + PKER_SACCRG( 29, 11) = 0.000000E+00 + PKER_SACCRG( 29, 12) = 0.000000E+00 + PKER_SACCRG( 29, 13) = 0.000000E+00 + PKER_SACCRG( 29, 14) = 0.000000E+00 + PKER_SACCRG( 29, 15) = 0.000000E+00 + PKER_SACCRG( 29, 16) = 0.515299E+00 + PKER_SACCRG( 29, 17) = 0.482248E+00 + PKER_SACCRG( 29, 18) = 0.451226E+00 + PKER_SACCRG( 29, 19) = 0.504714E+00 + PKER_SACCRG( 29, 20) = 0.480173E+00 + PKER_SACCRG( 29, 21) = 0.490737E+00 + PKER_SACCRG( 29, 22) = 0.490717E+00 + PKER_SACCRG( 29, 23) = 0.488194E+00 + PKER_SACCRG( 29, 24) = 0.475202E+00 + PKER_SACCRG( 29, 25) = 0.477303E+00 + PKER_SACCRG( 29, 26) = 0.471406E+00 + PKER_SACCRG( 29, 27) = 0.466391E+00 + PKER_SACCRG( 29, 28) = 0.463606E+00 + PKER_SACCRG( 29, 29) = 0.443703E+00 + PKER_SACCRG( 29, 30) = 0.442690E+00 + PKER_SACCRG( 29, 31) = 0.433456E+00 + PKER_SACCRG( 29, 32) = 0.426527E+00 + PKER_SACCRG( 29, 33) = 0.421106E+00 + PKER_SACCRG( 29, 34) = 0.419373E+00 + PKER_SACCRG( 29, 35) = 0.415340E+00 + PKER_SACCRG( 29, 36) = 0.407653E+00 + PKER_SACCRG( 29, 37) = 0.000000E+00 + PKER_SACCRG( 29, 38) = 0.000000E+00 + PKER_SACCRG( 29, 39) = 0.000000E+00 + PKER_SACCRG( 29, 40) = 0.000000E+00 + PKER_SACCRG( 30, 1) = 0.000000E+00 + PKER_SACCRG( 30, 2) = 0.000000E+00 + PKER_SACCRG( 30, 3) = 0.000000E+00 + PKER_SACCRG( 30, 4) = 0.000000E+00 + PKER_SACCRG( 30, 5) = 0.000000E+00 + PKER_SACCRG( 30, 6) = 0.000000E+00 + PKER_SACCRG( 30, 7) = 0.000000E+00 + PKER_SACCRG( 30, 8) = 0.000000E+00 + PKER_SACCRG( 30, 9) = 0.000000E+00 + PKER_SACCRG( 30, 10) = 0.000000E+00 + PKER_SACCRG( 30, 11) = 0.000000E+00 + PKER_SACCRG( 30, 12) = 0.000000E+00 + PKER_SACCRG( 30, 13) = 0.000000E+00 + PKER_SACCRG( 30, 14) = 0.000000E+00 + PKER_SACCRG( 30, 15) = 0.000000E+00 + PKER_SACCRG( 30, 16) = 0.518606E+00 + PKER_SACCRG( 30, 17) = 0.485568E+00 + PKER_SACCRG( 30, 18) = 0.454563E+00 + PKER_SACCRG( 30, 19) = 0.508049E+00 + PKER_SACCRG( 30, 20) = 0.483494E+00 + PKER_SACCRG( 30, 21) = 0.494070E+00 + PKER_SACCRG( 30, 22) = 0.494061E+00 + PKER_SACCRG( 30, 23) = 0.491531E+00 + PKER_SACCRG( 30, 24) = 0.478555E+00 + PKER_SACCRG( 30, 25) = 0.480655E+00 + PKER_SACCRG( 30, 26) = 0.474762E+00 + PKER_SACCRG( 30, 27) = 0.469755E+00 + PKER_SACCRG( 30, 28) = 0.466968E+00 + PKER_SACCRG( 30, 29) = 0.457637E+00 + PKER_SACCRG( 30, 30) = 0.446063E+00 + PKER_SACCRG( 30, 31) = 0.436830E+00 + PKER_SACCRG( 30, 32) = 0.429899E+00 + PKER_SACCRG( 30, 33) = 0.424476E+00 + PKER_SACCRG( 30, 34) = 0.422741E+00 + PKER_SACCRG( 30, 35) = 0.418708E+00 + PKER_SACCRG( 30, 36) = 0.411026E+00 + PKER_SACCRG( 30, 37) = 0.000000E+00 + PKER_SACCRG( 30, 38) = 0.000000E+00 + PKER_SACCRG( 30, 39) = 0.000000E+00 + PKER_SACCRG( 30, 40) = 0.000000E+00 + PKER_SACCRG( 31, 1) = 0.000000E+00 + PKER_SACCRG( 31, 2) = 0.000000E+00 + PKER_SACCRG( 31, 3) = 0.000000E+00 + PKER_SACCRG( 31, 4) = 0.000000E+00 + PKER_SACCRG( 31, 5) = 0.000000E+00 + PKER_SACCRG( 31, 6) = 0.000000E+00 + PKER_SACCRG( 31, 7) = 0.000000E+00 + PKER_SACCRG( 31, 8) = 0.000000E+00 + PKER_SACCRG( 31, 9) = 0.000000E+00 + PKER_SACCRG( 31, 10) = 0.000000E+00 + PKER_SACCRG( 31, 11) = 0.000000E+00 + PKER_SACCRG( 31, 12) = 0.000000E+00 + PKER_SACCRG( 31, 13) = 0.000000E+00 + PKER_SACCRG( 31, 14) = 0.000000E+00 + PKER_SACCRG( 31, 15) = 0.000000E+00 + PKER_SACCRG( 31, 16) = 0.521335E+00 + PKER_SACCRG( 31, 17) = 0.488306E+00 + PKER_SACCRG( 31, 18) = 0.457313E+00 + PKER_SACCRG( 31, 19) = 0.510799E+00 + PKER_SACCRG( 31, 20) = 0.486233E+00 + PKER_SACCRG( 31, 21) = 0.496818E+00 + PKER_SACCRG( 31, 22) = 0.496818E+00 + PKER_SACCRG( 31, 23) = 0.494282E+00 + PKER_SACCRG( 31, 24) = 0.481318E+00 + PKER_SACCRG( 31, 25) = 0.483417E+00 + PKER_SACCRG( 31, 26) = 0.477526E+00 + PKER_SACCRG( 31, 27) = 0.472527E+00 + PKER_SACCRG( 31, 28) = 0.469738E+00 + PKER_SACCRG( 31, 29) = 0.460409E+00 + PKER_SACCRG( 31, 30) = 0.448841E+00 + PKER_SACCRG( 31, 31) = 0.439607E+00 + PKER_SACCRG( 31, 32) = 0.432673E+00 + PKER_SACCRG( 31, 33) = 0.427249E+00 + PKER_SACCRG( 31, 34) = 0.425511E+00 + PKER_SACCRG( 31, 35) = 0.421478E+00 + PKER_SACCRG( 31, 36) = 0.413798E+00 + PKER_SACCRG( 31, 37) = 0.000000E+00 + PKER_SACCRG( 31, 38) = 0.000000E+00 + PKER_SACCRG( 31, 39) = 0.000000E+00 + PKER_SACCRG( 31, 40) = 0.000000E+00 + PKER_SACCRG( 32, 1) = 0.000000E+00 + PKER_SACCRG( 32, 2) = 0.000000E+00 + PKER_SACCRG( 32, 3) = 0.000000E+00 + PKER_SACCRG( 32, 4) = 0.000000E+00 + PKER_SACCRG( 32, 5) = 0.000000E+00 + PKER_SACCRG( 32, 6) = 0.000000E+00 + PKER_SACCRG( 32, 7) = 0.000000E+00 + PKER_SACCRG( 32, 8) = 0.000000E+00 + PKER_SACCRG( 32, 9) = 0.000000E+00 + PKER_SACCRG( 32, 10) = 0.000000E+00 + PKER_SACCRG( 32, 11) = 0.000000E+00 + PKER_SACCRG( 32, 12) = 0.000000E+00 + PKER_SACCRG( 32, 13) = 0.000000E+00 + PKER_SACCRG( 32, 14) = 0.000000E+00 + PKER_SACCRG( 32, 15) = 0.000000E+00 + PKER_SACCRG( 32, 16) = 0.521382E+00 + PKER_SACCRG( 32, 17) = 0.488500E+00 + PKER_SACCRG( 32, 18) = 0.457646E+00 + PKER_SACCRG( 32, 19) = 0.510908E+00 + PKER_SACCRG( 32, 20) = 0.486436E+00 + PKER_SACCRG( 32, 21) = 0.496984E+00 + PKER_SACCRG( 32, 22) = 0.496990E+00 + PKER_SACCRG( 32, 23) = 0.494461E+00 + PKER_SACCRG( 32, 24) = 0.481561E+00 + PKER_SACCRG( 32, 25) = 0.483650E+00 + PKER_SACCRG( 32, 26) = 0.477787E+00 + PKER_SACCRG( 32, 27) = 0.472813E+00 + PKER_SACCRG( 32, 28) = 0.470036E+00 + PKER_SACCRG( 32, 29) = 0.460747E+00 + PKER_SACCRG( 32, 30) = 0.449232E+00 + PKER_SACCRG( 32, 31) = 0.440036E+00 + PKER_SACCRG( 32, 32) = 0.433130E+00 + PKER_SACCRG( 32, 33) = 0.427727E+00 + PKER_SACCRG( 32, 34) = 0.425995E+00 + PKER_SACCRG( 32, 35) = 0.421979E+00 + PKER_SACCRG( 32, 36) = 0.414334E+00 + PKER_SACCRG( 32, 37) = 0.000000E+00 + PKER_SACCRG( 32, 38) = 0.000000E+00 + PKER_SACCRG( 32, 39) = 0.000000E+00 + PKER_SACCRG( 32, 40) = 0.000000E+00 + PKER_SACCRG( 33, 1) = 0.000000E+00 + PKER_SACCRG( 33, 2) = 0.000000E+00 + PKER_SACCRG( 33, 3) = 0.000000E+00 + PKER_SACCRG( 33, 4) = 0.000000E+00 + PKER_SACCRG( 33, 5) = 0.000000E+00 + PKER_SACCRG( 33, 6) = 0.000000E+00 + PKER_SACCRG( 33, 7) = 0.000000E+00 + PKER_SACCRG( 33, 8) = 0.000000E+00 + PKER_SACCRG( 33, 9) = 0.000000E+00 + PKER_SACCRG( 33, 10) = 0.000000E+00 + PKER_SACCRG( 33, 11) = 0.000000E+00 + PKER_SACCRG( 33, 12) = 0.000000E+00 + PKER_SACCRG( 33, 13) = 0.000000E+00 + PKER_SACCRG( 33, 14) = 0.000000E+00 + PKER_SACCRG( 33, 15) = 0.000000E+00 + PKER_SACCRG( 33, 16) = 0.523239E+00 + PKER_SACCRG( 33, 17) = 0.490361E+00 + PKER_SACCRG( 33, 18) = 0.459511E+00 + PKER_SACCRG( 33, 19) = 0.512778E+00 + PKER_SACCRG( 33, 20) = 0.488297E+00 + PKER_SACCRG( 33, 21) = 0.498852E+00 + PKER_SACCRG( 33, 22) = 0.498864E+00 + PKER_SACCRG( 33, 23) = 0.496331E+00 + PKER_SACCRG( 33, 24) = 0.483437E+00 + PKER_SACCRG( 33, 25) = 0.485525E+00 + PKER_SACCRG( 33, 26) = 0.479663E+00 + PKER_SACCRG( 33, 27) = 0.474693E+00 + PKER_SACCRG( 33, 28) = 0.471915E+00 + PKER_SACCRG( 33, 29) = 0.462627E+00 + PKER_SACCRG( 33, 30) = 0.451113E+00 + PKER_SACCRG( 33, 31) = 0.441917E+00 + PKER_SACCRG( 33, 32) = 0.435008E+00 + PKER_SACCRG( 33, 33) = 0.429604E+00 + PKER_SACCRG( 33, 34) = 0.427870E+00 + PKER_SACCRG( 33, 35) = 0.423853E+00 + PKER_SACCRG( 33, 36) = 0.416209E+00 + PKER_SACCRG( 33, 37) = 0.000000E+00 + PKER_SACCRG( 33, 38) = 0.000000E+00 + PKER_SACCRG( 33, 39) = 0.000000E+00 + PKER_SACCRG( 33, 40) = 0.000000E+00 + PKER_SACCRG( 34, 1) = 0.000000E+00 + PKER_SACCRG( 34, 2) = 0.000000E+00 + PKER_SACCRG( 34, 3) = 0.000000E+00 + PKER_SACCRG( 34, 4) = 0.000000E+00 + PKER_SACCRG( 34, 5) = 0.000000E+00 + PKER_SACCRG( 34, 6) = 0.000000E+00 + PKER_SACCRG( 34, 7) = 0.000000E+00 + PKER_SACCRG( 34, 8) = 0.000000E+00 + PKER_SACCRG( 34, 9) = 0.000000E+00 + PKER_SACCRG( 34, 10) = 0.000000E+00 + PKER_SACCRG( 34, 11) = 0.000000E+00 + PKER_SACCRG( 34, 12) = 0.000000E+00 + PKER_SACCRG( 34, 13) = 0.000000E+00 + PKER_SACCRG( 34, 14) = 0.000000E+00 + PKER_SACCRG( 34, 15) = 0.000000E+00 + PKER_SACCRG( 34, 16) = 0.526989E+00 + PKER_SACCRG( 34, 17) = 0.493974E+00 + PKER_SACCRG( 34, 18) = 0.462996E+00 + PKER_SACCRG( 34, 19) = 0.516493E+00 + PKER_SACCRG( 34, 20) = 0.491901E+00 + PKER_SACCRG( 34, 21) = 0.502507E+00 + PKER_SACCRG( 34, 22) = 0.502522E+00 + PKER_SACCRG( 34, 23) = 0.499975E+00 + PKER_SACCRG( 34, 24) = 0.487032E+00 + PKER_SACCRG( 34, 25) = 0.489128E+00 + PKER_SACCRG( 34, 26) = 0.483242E+00 + PKER_SACCRG( 34, 27) = 0.478253E+00 + PKER_SACCRG( 34, 28) = 0.475463E+00 + PKER_SACCRG( 34, 29) = 0.466135E+00 + PKER_SACCRG( 34, 30) = 0.454574E+00 + PKER_SACCRG( 34, 31) = 0.445337E+00 + PKER_SACCRG( 34, 32) = 0.438397E+00 + PKER_SACCRG( 34, 33) = 0.432968E+00 + PKER_SACCRG( 34, 34) = 0.431225E+00 + PKER_SACCRG( 34, 35) = 0.427191E+00 + PKER_SACCRG( 34, 36) = 0.419515E+00 + PKER_SACCRG( 34, 37) = 0.000000E+00 + PKER_SACCRG( 34, 38) = 0.000000E+00 + PKER_SACCRG( 34, 39) = 0.000000E+00 + PKER_SACCRG( 34, 40) = 0.000000E+00 + PKER_SACCRG( 35, 1) = 0.000000E+00 + PKER_SACCRG( 35, 2) = 0.000000E+00 + PKER_SACCRG( 35, 3) = 0.000000E+00 + PKER_SACCRG( 35, 4) = 0.000000E+00 + PKER_SACCRG( 35, 5) = 0.000000E+00 + PKER_SACCRG( 35, 6) = 0.000000E+00 + PKER_SACCRG( 35, 7) = 0.000000E+00 + PKER_SACCRG( 35, 8) = 0.000000E+00 + PKER_SACCRG( 35, 9) = 0.000000E+00 + PKER_SACCRG( 35, 10) = 0.000000E+00 + PKER_SACCRG( 35, 11) = 0.000000E+00 + PKER_SACCRG( 35, 12) = 0.000000E+00 + PKER_SACCRG( 35, 13) = 0.000000E+00 + PKER_SACCRG( 35, 14) = 0.000000E+00 + PKER_SACCRG( 35, 15) = 0.000000E+00 + PKER_SACCRG( 35, 16) = 0.526044E+00 + PKER_SACCRG( 35, 17) = 0.493170E+00 + PKER_SACCRG( 35, 18) = 0.462325E+00 + PKER_SACCRG( 35, 19) = 0.515600E+00 + PKER_SACCRG( 35, 20) = 0.491106E+00 + PKER_SACCRG( 35, 21) = 0.501671E+00 + PKER_SACCRG( 35, 22) = 0.501689E+00 + PKER_SACCRG( 35, 23) = 0.499151E+00 + PKER_SACCRG( 35, 24) = 0.486266E+00 + PKER_SACCRG( 35, 25) = 0.488354E+00 + PKER_SACCRG( 35, 26) = 0.482493E+00 + PKER_SACCRG( 35, 27) = 0.477528E+00 + PKER_SACCRG( 35, 28) = 0.474748E+00 + PKER_SACCRG( 35, 29) = 0.465460E+00 + PKER_SACCRG( 35, 30) = 0.453949E+00 + PKER_SACCRG( 35, 31) = 0.444750E+00 + PKER_SACCRG( 35, 32) = 0.437837E+00 + PKER_SACCRG( 35, 33) = 0.432431E+00 + PKER_SACCRG( 35, 34) = 0.430694E+00 + PKER_SACCRG( 35, 35) = 0.426676E+00 + PKER_SACCRG( 35, 36) = 0.419033E+00 + PKER_SACCRG( 35, 37) = 0.000000E+00 + PKER_SACCRG( 35, 38) = 0.000000E+00 + PKER_SACCRG( 35, 39) = 0.000000E+00 + PKER_SACCRG( 35, 40) = 0.000000E+00 + PKER_SACCRG( 36, 1) = 0.000000E+00 + PKER_SACCRG( 36, 2) = 0.000000E+00 + PKER_SACCRG( 36, 3) = 0.000000E+00 + PKER_SACCRG( 36, 4) = 0.000000E+00 + PKER_SACCRG( 36, 5) = 0.000000E+00 + PKER_SACCRG( 36, 6) = 0.000000E+00 + PKER_SACCRG( 36, 7) = 0.000000E+00 + PKER_SACCRG( 36, 8) = 0.000000E+00 + PKER_SACCRG( 36, 9) = 0.000000E+00 + PKER_SACCRG( 36, 10) = 0.000000E+00 + PKER_SACCRG( 36, 11) = 0.000000E+00 + PKER_SACCRG( 36, 12) = 0.000000E+00 + PKER_SACCRG( 36, 13) = 0.000000E+00 + PKER_SACCRG( 36, 14) = 0.000000E+00 + PKER_SACCRG( 36, 15) = 0.000000E+00 + PKER_SACCRG( 36, 16) = 0.527094E+00 + PKER_SACCRG( 36, 17) = 0.494221E+00 + PKER_SACCRG( 36, 18) = 0.463377E+00 + PKER_SACCRG( 36, 19) = 0.516656E+00 + PKER_SACCRG( 36, 20) = 0.492157E+00 + PKER_SACCRG( 36, 21) = 0.502726E+00 + PKER_SACCRG( 36, 22) = 0.502746E+00 + PKER_SACCRG( 36, 23) = 0.500207E+00 + PKER_SACCRG( 36, 24) = 0.487324E+00 + PKER_SACCRG( 36, 25) = 0.489412E+00 + PKER_SACCRG( 36, 26) = 0.483551E+00 + PKER_SACCRG( 36, 27) = 0.478587E+00 + PKER_SACCRG( 36, 28) = 0.475807E+00 + PKER_SACCRG( 36, 29) = 0.466519E+00 + PKER_SACCRG( 36, 30) = 0.455008E+00 + PKER_SACCRG( 36, 31) = 0.445809E+00 + PKER_SACCRG( 36, 32) = 0.438895E+00 + PKER_SACCRG( 36, 33) = 0.433487E+00 + PKER_SACCRG( 36, 34) = 0.431749E+00 + PKER_SACCRG( 36, 35) = 0.427731E+00 + PKER_SACCRG( 36, 36) = 0.420087E+00 + PKER_SACCRG( 36, 37) = 0.000000E+00 + PKER_SACCRG( 36, 38) = 0.000000E+00 + PKER_SACCRG( 36, 39) = 0.000000E+00 + PKER_SACCRG( 36, 40) = 0.000000E+00 + PKER_SACCRG( 37, 1) = 0.000000E+00 + PKER_SACCRG( 37, 2) = 0.000000E+00 + PKER_SACCRG( 37, 3) = 0.000000E+00 + PKER_SACCRG( 37, 4) = 0.000000E+00 + PKER_SACCRG( 37, 5) = 0.000000E+00 + PKER_SACCRG( 37, 6) = 0.000000E+00 + PKER_SACCRG( 37, 7) = 0.000000E+00 + PKER_SACCRG( 37, 8) = 0.000000E+00 + PKER_SACCRG( 37, 9) = 0.000000E+00 + PKER_SACCRG( 37, 10) = 0.000000E+00 + PKER_SACCRG( 37, 11) = 0.000000E+00 + PKER_SACCRG( 37, 12) = 0.000000E+00 + PKER_SACCRG( 37, 13) = 0.000000E+00 + PKER_SACCRG( 37, 14) = 0.000000E+00 + PKER_SACCRG( 37, 15) = 0.000000E+00 + PKER_SACCRG( 37, 16) = 0.527963E+00 + PKER_SACCRG( 37, 17) = 0.495090E+00 + PKER_SACCRG( 37, 18) = 0.464247E+00 + PKER_SACCRG( 37, 19) = 0.517529E+00 + PKER_SACCRG( 37, 20) = 0.493026E+00 + PKER_SACCRG( 37, 21) = 0.503598E+00 + PKER_SACCRG( 37, 22) = 0.503620E+00 + PKER_SACCRG( 37, 23) = 0.501079E+00 + PKER_SACCRG( 37, 24) = 0.488199E+00 + PKER_SACCRG( 37, 25) = 0.490286E+00 + PKER_SACCRG( 37, 26) = 0.484426E+00 + PKER_SACCRG( 37, 27) = 0.479463E+00 + PKER_SACCRG( 37, 28) = 0.476683E+00 + PKER_SACCRG( 37, 29) = 0.467394E+00 + PKER_SACCRG( 37, 30) = 0.455884E+00 + PKER_SACCRG( 37, 31) = 0.446684E+00 + PKER_SACCRG( 37, 32) = 0.439768E+00 + PKER_SACCRG( 37, 33) = 0.434360E+00 + PKER_SACCRG( 37, 34) = 0.432621E+00 + PKER_SACCRG( 37, 35) = 0.428603E+00 + PKER_SACCRG( 37, 36) = 0.420959E+00 + PKER_SACCRG( 37, 37) = 0.000000E+00 + PKER_SACCRG( 37, 38) = 0.000000E+00 + PKER_SACCRG( 37, 39) = 0.000000E+00 + PKER_SACCRG( 37, 40) = 0.000000E+00 + PKER_SACCRG( 38, 1) = 0.000000E+00 + PKER_SACCRG( 38, 2) = 0.000000E+00 + PKER_SACCRG( 38, 3) = 0.000000E+00 + PKER_SACCRG( 38, 4) = 0.000000E+00 + PKER_SACCRG( 38, 5) = 0.000000E+00 + PKER_SACCRG( 38, 6) = 0.000000E+00 + PKER_SACCRG( 38, 7) = 0.000000E+00 + PKER_SACCRG( 38, 8) = 0.000000E+00 + PKER_SACCRG( 38, 9) = 0.000000E+00 + PKER_SACCRG( 38, 10) = 0.000000E+00 + PKER_SACCRG( 38, 11) = 0.000000E+00 + PKER_SACCRG( 38, 12) = 0.000000E+00 + PKER_SACCRG( 38, 13) = 0.000000E+00 + PKER_SACCRG( 38, 14) = 0.000000E+00 + PKER_SACCRG( 38, 15) = 0.000000E+00 + PKER_SACCRG( 38, 16) = 0.530904E+00 + PKER_SACCRG( 38, 17) = 0.497893E+00 + PKER_SACCRG( 38, 18) = 0.466921E+00 + PKER_SACCRG( 38, 19) = 0.520430E+00 + PKER_SACCRG( 38, 20) = 0.495821E+00 + PKER_SACCRG( 38, 21) = 0.506439E+00 + PKER_SACCRG( 38, 22) = 0.506463E+00 + PKER_SACCRG( 38, 23) = 0.503910E+00 + PKER_SACCRG( 38, 24) = 0.490978E+00 + PKER_SACCRG( 38, 25) = 0.493073E+00 + PKER_SACCRG( 38, 26) = 0.487189E+00 + PKER_SACCRG( 38, 27) = 0.482206E+00 + PKER_SACCRG( 38, 28) = 0.479414E+00 + PKER_SACCRG( 38, 29) = 0.470086E+00 + PKER_SACCRG( 38, 30) = 0.458527E+00 + PKER_SACCRG( 38, 31) = 0.449287E+00 + PKER_SACCRG( 38, 32) = 0.442342E+00 + PKER_SACCRG( 38, 33) = 0.436910E+00 + PKER_SACCRG( 38, 34) = 0.435164E+00 + PKER_SACCRG( 38, 35) = 0.431128E+00 + PKER_SACCRG( 38, 36) = 0.423452E+00 + PKER_SACCRG( 38, 37) = 0.000000E+00 + PKER_SACCRG( 38, 38) = 0.000000E+00 + PKER_SACCRG( 38, 39) = 0.000000E+00 + PKER_SACCRG( 38, 40) = 0.000000E+00 + PKER_SACCRG( 39, 1) = 0.000000E+00 + PKER_SACCRG( 39, 2) = 0.000000E+00 + PKER_SACCRG( 39, 3) = 0.000000E+00 + PKER_SACCRG( 39, 4) = 0.000000E+00 + PKER_SACCRG( 39, 5) = 0.000000E+00 + PKER_SACCRG( 39, 6) = 0.000000E+00 + PKER_SACCRG( 39, 7) = 0.000000E+00 + PKER_SACCRG( 39, 8) = 0.000000E+00 + PKER_SACCRG( 39, 9) = 0.000000E+00 + PKER_SACCRG( 39, 10) = 0.000000E+00 + PKER_SACCRG( 39, 11) = 0.000000E+00 + PKER_SACCRG( 39, 12) = 0.000000E+00 + PKER_SACCRG( 39, 13) = 0.000000E+00 + PKER_SACCRG( 39, 14) = 0.000000E+00 + PKER_SACCRG( 39, 15) = 0.000000E+00 + PKER_SACCRG( 39, 16) = 0.531500E+00 + PKER_SACCRG( 39, 17) = 0.498490E+00 + PKER_SACCRG( 39, 18) = 0.467518E+00 + PKER_SACCRG( 39, 19) = 0.521029E+00 + PKER_SACCRG( 39, 20) = 0.496417E+00 + PKER_SACCRG( 39, 21) = 0.507037E+00 + PKER_SACCRG( 39, 22) = 0.507063E+00 + PKER_SACCRG( 39, 23) = 0.504509E+00 + PKER_SACCRG( 39, 24) = 0.491577E+00 + PKER_SACCRG( 39, 25) = 0.493673E+00 + PKER_SACCRG( 39, 26) = 0.487788E+00 + PKER_SACCRG( 39, 27) = 0.482807E+00 + PKER_SACCRG( 39, 28) = 0.480014E+00 + PKER_SACCRG( 39, 29) = 0.470686E+00 + PKER_SACCRG( 39, 30) = 0.459128E+00 + PKER_SACCRG( 39, 31) = 0.449887E+00 + PKER_SACCRG( 39, 32) = 0.442941E+00 + PKER_SACCRG( 39, 33) = 0.437508E+00 + PKER_SACCRG( 39, 34) = 0.435762E+00 + PKER_SACCRG( 39, 35) = 0.431726E+00 + PKER_SACCRG( 39, 36) = 0.424049E+00 + PKER_SACCRG( 39, 37) = 0.000000E+00 + PKER_SACCRG( 39, 38) = 0.000000E+00 + PKER_SACCRG( 39, 39) = 0.000000E+00 + PKER_SACCRG( 39, 40) = 0.000000E+00 + PKER_SACCRG( 40, 1) = 0.000000E+00 + PKER_SACCRG( 40, 2) = 0.000000E+00 + PKER_SACCRG( 40, 3) = 0.000000E+00 + PKER_SACCRG( 40, 4) = 0.000000E+00 + PKER_SACCRG( 40, 5) = 0.000000E+00 + PKER_SACCRG( 40, 6) = 0.000000E+00 + PKER_SACCRG( 40, 7) = 0.000000E+00 + PKER_SACCRG( 40, 8) = 0.000000E+00 + PKER_SACCRG( 40, 9) = 0.000000E+00 + PKER_SACCRG( 40, 10) = 0.000000E+00 + PKER_SACCRG( 40, 11) = 0.000000E+00 + PKER_SACCRG( 40, 12) = 0.000000E+00 + PKER_SACCRG( 40, 13) = 0.000000E+00 + PKER_SACCRG( 40, 14) = 0.000000E+00 + PKER_SACCRG( 40, 15) = 0.000000E+00 + PKER_SACCRG( 40, 16) = 0.531993E+00 + PKER_SACCRG( 40, 17) = 0.498983E+00 + PKER_SACCRG( 40, 18) = 0.468012E+00 + PKER_SACCRG( 40, 19) = 0.521524E+00 + PKER_SACCRG( 40, 20) = 0.496911E+00 + PKER_SACCRG( 40, 21) = 0.507532E+00 + PKER_SACCRG( 40, 22) = 0.507558E+00 + PKER_SACCRG( 40, 23) = 0.505004E+00 + PKER_SACCRG( 40, 24) = 0.492073E+00 + PKER_SACCRG( 40, 25) = 0.494169E+00 + PKER_SACCRG( 40, 26) = 0.488284E+00 + PKER_SACCRG( 40, 27) = 0.483303E+00 + PKER_SACCRG( 40, 28) = 0.480510E+00 + PKER_SACCRG( 40, 29) = 0.471182E+00 + PKER_SACCRG( 40, 30) = 0.459624E+00 + PKER_SACCRG( 40, 31) = 0.450383E+00 + PKER_SACCRG( 40, 32) = 0.443437E+00 + PKER_SACCRG( 40, 33) = 0.438004E+00 + PKER_SACCRG( 40, 34) = 0.436256E+00 + PKER_SACCRG( 40, 35) = 0.432220E+00 + PKER_SACCRG( 40, 36) = 0.424544E+00 + PKER_SACCRG( 40, 37) = 0.000000E+00 + PKER_SACCRG( 40, 38) = 0.000000E+00 + PKER_SACCRG( 40, 39) = 0.000000E+00 + PKER_SACCRG( 40, 40) = 0.000000E+00 +END IF +! +END SUBROUTINE READ_XKER_RACCS diff --git a/src/mesonh/micro/read_xker_rdryg.f90 b/src/mesonh/micro/read_xker_rdryg.f90 new file mode 100644 index 000000000..e0c67b505 --- /dev/null +++ b/src/mesonh/micro/read_xker_rdryg.f90 @@ -0,0 +1,1736 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 init 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ########################### + MODULE MODI_READ_XKER_RDRYG +! ########################### +! +INTERFACE + SUBROUTINE READ_XKER_RDRYG (KDRYLBDAG,KDRYLBDAR,KND, & + PALPHAG,PNUG,PALPHAR,PNUR,PEGR,PBR,PCG,PDG,PCR,PDR, & + PDRYLBDAG_MAX,PDRYLBDAR_MAX,PDRYLBDAG_MIN,PDRYLBDAR_MIN, & + PFDINFTY,PKER_RDRYG ) +! +INTEGER, INTENT(OUT) :: KND,KDRYLBDAG,KDRYLBDAR +REAL, INTENT(OUT) :: PALPHAG +REAL, INTENT(OUT) :: PNUG +REAL, INTENT(OUT) :: PALPHAR +REAL, INTENT(OUT) :: PNUR +REAL, INTENT(OUT) :: PEGR +REAL, INTENT(OUT) :: PBR +REAL, INTENT(OUT) :: PCG +REAL, INTENT(OUT) :: PDG +REAL, INTENT(OUT) :: PCR +REAL, INTENT(OUT) :: PDR +REAL, INTENT(OUT) :: PDRYLBDAG_MAX +REAL, INTENT(OUT) :: PDRYLBDAR_MAX +REAL, INTENT(OUT) :: PDRYLBDAG_MIN +REAL, INTENT(OUT) :: PDRYLBDAR_MIN +REAL, INTENT(OUT) :: PFDINFTY +REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PKER_RDRYG +! +END SUBROUTINE +! +END INTERFACE +! +END MODULE MODI_READ_XKER_RDRYG +! ######################################################################## + SUBROUTINE READ_XKER_RDRYG (KDRYLBDAG,KDRYLBDAR,KND, & + PALPHAG,PNUG,PALPHAR,PNUR,PEGR,PBR,PCG,PDG,PCR,PDR, & + PDRYLBDAG_MAX,PDRYLBDAR_MAX,PDRYLBDAG_MIN,PDRYLBDAR_MIN, & + PFDINFTY,PKER_RDRYG ) +! ######################################################################## +! +!!**** * * - initialize the kernels for the snow-graupel dry growth process +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to initialize the kernels PKER_RDRYG +!! prepared from a previous run of the routine INI_RAIN_ICE. The reading of +!! the kernels is optional after checking for the dimensions of the arrays. +!! +!!** METHOD +!! ------ +!! +!! +!! EXTERNAL +!! -------- +!! None +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! Book2 of documentation ( routine READ_XKER_RDRYG ) +!! +!! AUTHOR +!! ------ +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original 09/04/96 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +!* 0.2 Declarations of local variables : +! +! +INTEGER, INTENT(OUT) :: KND,KDRYLBDAG,KDRYLBDAR +REAL, INTENT(OUT) :: PALPHAG +REAL, INTENT(OUT) :: PNUG +REAL, INTENT(OUT) :: PALPHAR +REAL, INTENT(OUT) :: PNUR +REAL, INTENT(OUT) :: PEGR +REAL, INTENT(OUT) :: PBR +REAL, INTENT(OUT) :: PCG +REAL, INTENT(OUT) :: PDG +REAL, INTENT(OUT) :: PCR +REAL, INTENT(OUT) :: PDR +REAL, INTENT(OUT) :: PDRYLBDAG_MAX +REAL, INTENT(OUT) :: PDRYLBDAR_MAX +REAL, INTENT(OUT) :: PDRYLBDAG_MIN +REAL, INTENT(OUT) :: PDRYLBDAR_MIN +REAL, INTENT(OUT) :: PFDINFTY +REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PKER_RDRYG +! +! ################################################################### +! #INSERT HERE THE OUTPUT OF INI_RAIN_ICE IF THE KERNELS ARE UPDATED# +! ################################################################### +! +KND= 50 +KDRYLBDAG= 40 +KDRYLBDAR= 40 +PALPHAG= 0.100000E+01 +PNUG= 0.100000E+01 +PALPHAR= 0.100000E+01 +PNUR= 0.100000E+01 +PEGR= 0.100000E+01 +PBR= 0.300000E+01 +PCG= 0.124000E+03 +PDG= 0.660000E+00 +PCR= 0.842000E+03 +PDR= 0.800000E+00 +PDRYLBDAG_MAX= 0.100000E+08 +PDRYLBDAR_MAX= 0.100000E+08 +PDRYLBDAG_MIN= 0.100000E+04 +PDRYLBDAR_MIN= 0.100000E+04 +PFDINFTY= 0.200000E+02 +! +IF( PRESENT(PKER_RDRYG) ) THEN + PKER_RDRYG( 1, 1) = 0.113429E+02 + PKER_RDRYG( 1, 2) = 0.888532E+01 + PKER_RDRYG( 1, 3) = 0.684777E+01 + PKER_RDRYG( 1, 4) = 0.517128E+01 + PKER_RDRYG( 1, 5) = 0.381554E+01 + PKER_RDRYG( 1, 6) = 0.275614E+01 + PKER_RDRYG( 1, 7) = 0.197831E+01 + PKER_RDRYG( 1, 8) = 0.146495E+01 + PKER_RDRYG( 1, 9) = 0.118865E+01 + PKER_RDRYG( 1, 10) = 0.110504E+01 + PKER_RDRYG( 1, 11) = 0.115718E+01 + PKER_RDRYG( 1, 12) = 0.128948E+01 + PKER_RDRYG( 1, 13) = 0.145623E+01 + PKER_RDRYG( 1, 14) = 0.162671E+01 + PKER_RDRYG( 1, 15) = 0.178400E+01 + PKER_RDRYG( 1, 16) = 0.192135E+01 + PKER_RDRYG( 1, 17) = 0.203766E+01 + PKER_RDRYG( 1, 18) = 0.213454E+01 + PKER_RDRYG( 1, 19) = 0.221453E+01 + PKER_RDRYG( 1, 20) = 0.228027E+01 + PKER_RDRYG( 1, 21) = 0.233424E+01 + PKER_RDRYG( 1, 22) = 0.237855E+01 + PKER_RDRYG( 1, 23) = 0.241497E+01 + PKER_RDRYG( 1, 24) = 0.244492E+01 + PKER_RDRYG( 1, 25) = 0.246956E+01 + PKER_RDRYG( 1, 26) = 0.248985E+01 + PKER_RDRYG( 1, 27) = 0.250656E+01 + PKER_RDRYG( 1, 28) = 0.252033E+01 + PKER_RDRYG( 1, 29) = 0.253168E+01 + PKER_RDRYG( 1, 30) = 0.254104E+01 + PKER_RDRYG( 1, 31) = 0.254875E+01 + PKER_RDRYG( 1, 32) = 0.255512E+01 + PKER_RDRYG( 1, 33) = 0.256037E+01 + PKER_RDRYG( 1, 34) = 0.256470E+01 + PKER_RDRYG( 1, 35) = 0.256828E+01 + PKER_RDRYG( 1, 36) = 0.257123E+01 + PKER_RDRYG( 1, 37) = 0.257367E+01 + PKER_RDRYG( 1, 38) = 0.257568E+01 + PKER_RDRYG( 1, 39) = 0.257735E+01 + PKER_RDRYG( 1, 40) = 0.257872E+01 + PKER_RDRYG( 2, 1) = 0.117927E+02 + PKER_RDRYG( 2, 2) = 0.934446E+01 + PKER_RDRYG( 2, 3) = 0.730889E+01 + PKER_RDRYG( 2, 4) = 0.562152E+01 + PKER_RDRYG( 2, 5) = 0.423473E+01 + PKER_RDRYG( 2, 6) = 0.311610E+01 + PKER_RDRYG( 2, 7) = 0.224696E+01 + PKER_RDRYG( 2, 8) = 0.161553E+01 + PKER_RDRYG( 2, 9) = 0.120734E+01 + PKER_RDRYG( 2, 10) = 0.997308E+00 + PKER_RDRYG( 2, 11) = 0.945330E+00 + PKER_RDRYG( 2, 12) = 0.100270E+01 + PKER_RDRYG( 2, 13) = 0.112265E+01 + PKER_RDRYG( 2, 14) = 0.126742E+01 + PKER_RDRYG( 2, 15) = 0.141245E+01 + PKER_RDRYG( 2, 16) = 0.154497E+01 + PKER_RDRYG( 2, 17) = 0.165998E+01 + PKER_RDRYG( 2, 18) = 0.175705E+01 + PKER_RDRYG( 2, 19) = 0.183773E+01 + PKER_RDRYG( 2, 20) = 0.190425E+01 + PKER_RDRYG( 2, 21) = 0.195889E+01 + PKER_RDRYG( 2, 22) = 0.200372E+01 + PKER_RDRYG( 2, 23) = 0.204054E+01 + PKER_RDRYG( 2, 24) = 0.207079E+01 + PKER_RDRYG( 2, 25) = 0.209566E+01 + PKER_RDRYG( 2, 26) = 0.211612E+01 + PKER_RDRYG( 2, 27) = 0.213297E+01 + PKER_RDRYG( 2, 28) = 0.214684E+01 + PKER_RDRYG( 2, 29) = 0.215827E+01 + PKER_RDRYG( 2, 30) = 0.216769E+01 + PKER_RDRYG( 2, 31) = 0.217545E+01 + PKER_RDRYG( 2, 32) = 0.218186E+01 + PKER_RDRYG( 2, 33) = 0.218714E+01 + PKER_RDRYG( 2, 34) = 0.219150E+01 + PKER_RDRYG( 2, 35) = 0.219509E+01 + PKER_RDRYG( 2, 36) = 0.219806E+01 + PKER_RDRYG( 2, 37) = 0.220051E+01 + PKER_RDRYG( 2, 38) = 0.220253E+01 + PKER_RDRYG( 2, 39) = 0.220420E+01 + PKER_RDRYG( 2, 40) = 0.220558E+01 + PKER_RDRYG( 3, 1) = 0.121617E+02 + PKER_RDRYG( 3, 2) = 0.972447E+01 + PKER_RDRYG( 3, 3) = 0.769669E+01 + PKER_RDRYG( 3, 4) = 0.601068E+01 + PKER_RDRYG( 3, 5) = 0.461358E+01 + PKER_RDRYG( 3, 6) = 0.346650E+01 + PKER_RDRYG( 3, 7) = 0.254421E+01 + PKER_RDRYG( 3, 8) = 0.183189E+01 + PKER_RDRYG( 3, 9) = 0.131969E+01 + PKER_RDRYG( 3, 10) = 0.997188E+00 + PKER_RDRYG( 3, 11) = 0.839117E+00 + PKER_RDRYG( 3, 12) = 0.810553E+00 + PKER_RDRYG( 3, 13) = 0.869949E+00 + PKER_RDRYG( 3, 14) = 0.977509E+00 + PKER_RDRYG( 3, 15) = 0.110267E+01 + PKER_RDRYG( 3, 16) = 0.122591E+01 + PKER_RDRYG( 3, 17) = 0.133742E+01 + PKER_RDRYG( 3, 18) = 0.143367E+01 + PKER_RDRYG( 3, 19) = 0.151464E+01 + PKER_RDRYG( 3, 20) = 0.158182E+01 + PKER_RDRYG( 3, 21) = 0.163714E+01 + PKER_RDRYG( 3, 22) = 0.168256E+01 + PKER_RDRYG( 3, 23) = 0.171982E+01 + PKER_RDRYG( 3, 24) = 0.175040E+01 + PKER_RDRYG( 3, 25) = 0.177553E+01 + PKER_RDRYG( 3, 26) = 0.179619E+01 + PKER_RDRYG( 3, 27) = 0.181318E+01 + PKER_RDRYG( 3, 28) = 0.182717E+01 + PKER_RDRYG( 3, 29) = 0.183869E+01 + PKER_RDRYG( 3, 30) = 0.184817E+01 + PKER_RDRYG( 3, 31) = 0.185599E+01 + PKER_RDRYG( 3, 32) = 0.186244E+01 + PKER_RDRYG( 3, 33) = 0.186775E+01 + PKER_RDRYG( 3, 34) = 0.187213E+01 + PKER_RDRYG( 3, 35) = 0.187575E+01 + PKER_RDRYG( 3, 36) = 0.187873E+01 + PKER_RDRYG( 3, 37) = 0.188119E+01 + PKER_RDRYG( 3, 38) = 0.188322E+01 + PKER_RDRYG( 3, 39) = 0.188490E+01 + PKER_RDRYG( 3, 40) = 0.188628E+01 + PKER_RDRYG( 4, 1) = 0.124632E+02 + PKER_RDRYG( 4, 2) = 0.100363E+02 + PKER_RDRYG( 4, 3) = 0.801781E+01 + PKER_RDRYG( 4, 4) = 0.633828E+01 + PKER_RDRYG( 4, 5) = 0.494183E+01 + PKER_RDRYG( 4, 6) = 0.378510E+01 + PKER_RDRYG( 4, 7) = 0.283672E+01 + PKER_RDRYG( 4, 8) = 0.207666E+01 + PKER_RDRYG( 4, 9) = 0.149363E+01 + PKER_RDRYG( 4, 10) = 0.108052E+01 + PKER_RDRYG( 4, 11) = 0.825432E+00 + PKER_RDRYG( 4, 12) = 0.708049E+00 + PKER_RDRYG( 4, 13) = 0.696559E+00 + PKER_RDRYG( 4, 14) = 0.755465E+00 + PKER_RDRYG( 4, 15) = 0.851164E+00 + PKER_RDRYG( 4, 16) = 0.958922E+00 + PKER_RDRYG( 4, 17) = 0.106351E+01 + PKER_RDRYG( 4, 18) = 0.115725E+01 + PKER_RDRYG( 4, 19) = 0.123777E+01 + PKER_RDRYG( 4, 20) = 0.130532E+01 + PKER_RDRYG( 4, 21) = 0.136125E+01 + PKER_RDRYG( 4, 22) = 0.140726E+01 + PKER_RDRYG( 4, 23) = 0.144501E+01 + PKER_RDRYG( 4, 24) = 0.147597E+01 + PKER_RDRYG( 4, 25) = 0.150139E+01 + PKER_RDRYG( 4, 26) = 0.152226E+01 + PKER_RDRYG( 4, 27) = 0.153942E+01 + PKER_RDRYG( 4, 28) = 0.155353E+01 + PKER_RDRYG( 4, 29) = 0.156515E+01 + PKER_RDRYG( 4, 30) = 0.157471E+01 + PKER_RDRYG( 4, 31) = 0.158259E+01 + PKER_RDRYG( 4, 32) = 0.158908E+01 + PKER_RDRYG( 4, 33) = 0.159443E+01 + PKER_RDRYG( 4, 34) = 0.159884E+01 + PKER_RDRYG( 4, 35) = 0.160248E+01 + PKER_RDRYG( 4, 36) = 0.160548E+01 + PKER_RDRYG( 4, 37) = 0.160795E+01 + PKER_RDRYG( 4, 38) = 0.160999E+01 + PKER_RDRYG( 4, 39) = 0.161168E+01 + PKER_RDRYG( 4, 40) = 0.161307E+01 + PKER_RDRYG( 5, 1) = 0.127090E+02 + PKER_RDRYG( 5, 2) = 0.102910E+02 + PKER_RDRYG( 5, 3) = 0.828132E+01 + PKER_RDRYG( 5, 4) = 0.660967E+01 + PKER_RDRYG( 5, 5) = 0.521858E+01 + PKER_RDRYG( 5, 6) = 0.406200E+01 + PKER_RDRYG( 5, 7) = 0.310443E+01 + PKER_RDRYG( 5, 8) = 0.232064E+01 + PKER_RDRYG( 5, 9) = 0.169464E+01 + PKER_RDRYG( 5, 10) = 0.121813E+01 + PKER_RDRYG( 5, 11) = 0.885289E+00 + PKER_RDRYG( 5, 12) = 0.684884E+00 + PKER_RDRYG( 5, 13) = 0.598972E+00 + PKER_RDRYG( 5, 14) = 0.599848E+00 + PKER_RDRYG( 5, 15) = 0.656194E+00 + PKER_RDRYG( 5, 16) = 0.740930E+00 + PKER_RDRYG( 5, 17) = 0.833644E+00 + PKER_RDRYG( 5, 18) = 0.922189E+00 + PKER_RDRYG( 5, 19) = 0.100097E+01 + PKER_RDRYG( 5, 20) = 0.106830E+01 + PKER_RDRYG( 5, 21) = 0.112462E+01 + PKER_RDRYG( 5, 22) = 0.117119E+01 + PKER_RDRYG( 5, 23) = 0.120946E+01 + PKER_RDRYG( 5, 24) = 0.124084E+01 + PKER_RDRYG( 5, 25) = 0.126657E+01 + PKER_RDRYG( 5, 26) = 0.128769E+01 + PKER_RDRYG( 5, 27) = 0.130503E+01 + PKER_RDRYG( 5, 28) = 0.131929E+01 + PKER_RDRYG( 5, 29) = 0.133101E+01 + PKER_RDRYG( 5, 30) = 0.134066E+01 + PKER_RDRYG( 5, 31) = 0.134860E+01 + PKER_RDRYG( 5, 32) = 0.135514E+01 + PKER_RDRYG( 5, 33) = 0.136053E+01 + PKER_RDRYG( 5, 34) = 0.136497E+01 + PKER_RDRYG( 5, 35) = 0.136863E+01 + PKER_RDRYG( 5, 36) = 0.137165E+01 + PKER_RDRYG( 5, 37) = 0.137413E+01 + PKER_RDRYG( 5, 38) = 0.137619E+01 + PKER_RDRYG( 5, 39) = 0.137788E+01 + PKER_RDRYG( 5, 40) = 0.137928E+01 + PKER_RDRYG( 6, 1) = 0.129097E+02 + PKER_RDRYG( 6, 2) = 0.104988E+02 + PKER_RDRYG( 6, 3) = 0.849661E+01 + PKER_RDRYG( 6, 4) = 0.683241E+01 + PKER_RDRYG( 6, 5) = 0.544798E+01 + PKER_RDRYG( 6, 6) = 0.429580E+01 + PKER_RDRYG( 6, 7) = 0.333794E+01 + PKER_RDRYG( 6, 8) = 0.254535E+01 + PKER_RDRYG( 6, 9) = 0.189760E+01 + PKER_RDRYG( 6, 10) = 0.138256E+01 + PKER_RDRYG( 6, 11) = 0.993749E+00 + PKER_RDRYG( 6, 12) = 0.725579E+00 + PKER_RDRYG( 6, 13) = 0.569771E+00 + PKER_RDRYG( 6, 14) = 0.508215E+00 + PKER_RDRYG( 6, 15) = 0.517364E+00 + PKER_RDRYG( 6, 16) = 0.570603E+00 + PKER_RDRYG( 6, 17) = 0.645018E+00 + PKER_RDRYG( 6, 18) = 0.724433E+00 + PKER_RDRYG( 6, 19) = 0.799323E+00 + PKER_RDRYG( 6, 20) = 0.865437E+00 + PKER_RDRYG( 6, 21) = 0.921727E+00 + PKER_RDRYG( 6, 22) = 0.968693E+00 + PKER_RDRYG( 6, 23) = 0.100746E+01 + PKER_RDRYG( 6, 24) = 0.103929E+01 + PKER_RDRYG( 6, 25) = 0.106538E+01 + PKER_RDRYG( 6, 26) = 0.108677E+01 + PKER_RDRYG( 6, 27) = 0.110432E+01 + PKER_RDRYG( 6, 28) = 0.111873E+01 + PKER_RDRYG( 6, 29) = 0.113057E+01 + PKER_RDRYG( 6, 30) = 0.114031E+01 + PKER_RDRYG( 6, 31) = 0.114832E+01 + PKER_RDRYG( 6, 32) = 0.115492E+01 + PKER_RDRYG( 6, 33) = 0.116035E+01 + PKER_RDRYG( 6, 34) = 0.116482E+01 + PKER_RDRYG( 6, 35) = 0.116851E+01 + PKER_RDRYG( 6, 36) = 0.117155E+01 + PKER_RDRYG( 6, 37) = 0.117405E+01 + PKER_RDRYG( 6, 38) = 0.117612E+01 + PKER_RDRYG( 6, 39) = 0.117782E+01 + PKER_RDRYG( 6, 40) = 0.117923E+01 + PKER_RDRYG( 7, 1) = 0.130737E+02 + PKER_RDRYG( 7, 2) = 0.106684E+02 + PKER_RDRYG( 7, 3) = 0.867226E+01 + PKER_RDRYG( 7, 4) = 0.701442E+01 + PKER_RDRYG( 7, 5) = 0.563630E+01 + PKER_RDRYG( 7, 6) = 0.448972E+01 + PKER_RDRYG( 7, 7) = 0.353543E+01 + PKER_RDRYG( 7, 8) = 0.274218E+01 + PKER_RDRYG( 7, 9) = 0.208626E+01 + PKER_RDRYG( 7, 10) = 0.155134E+01 + PKER_RDRYG( 7, 11) = 0.112782E+01 + PKER_RDRYG( 7, 12) = 0.810984E+00 + PKER_RDRYG( 7, 13) = 0.596204E+00 + PKER_RDRYG( 7, 14) = 0.475108E+00 + PKER_RDRYG( 7, 15) = 0.432596E+00 + PKER_RDRYG( 7, 16) = 0.446915E+00 + PKER_RDRYG( 7, 17) = 0.496175E+00 + PKER_RDRYG( 7, 18) = 0.561308E+00 + PKER_RDRYG( 7, 19) = 0.629230E+00 + PKER_RDRYG( 7, 20) = 0.692507E+00 + PKER_RDRYG( 7, 21) = 0.747991E+00 + PKER_RDRYG( 7, 22) = 0.795023E+00 + PKER_RDRYG( 7, 23) = 0.834178E+00 + PKER_RDRYG( 7, 24) = 0.866452E+00 + PKER_RDRYG( 7, 25) = 0.892928E+00 + PKER_RDRYG( 7, 26) = 0.914619E+00 + PKER_RDRYG( 7, 27) = 0.932399E+00 + PKER_RDRYG( 7, 28) = 0.946986E+00 + PKER_RDRYG( 7, 29) = 0.958962E+00 + PKER_RDRYG( 7, 30) = 0.968803E+00 + PKER_RDRYG( 7, 31) = 0.976894E+00 + PKER_RDRYG( 7, 32) = 0.983549E+00 + PKER_RDRYG( 7, 33) = 0.989027E+00 + PKER_RDRYG( 7, 34) = 0.993537E+00 + PKER_RDRYG( 7, 35) = 0.997252E+00 + PKER_RDRYG( 7, 36) = 0.100031E+01 + PKER_RDRYG( 7, 37) = 0.100283E+01 + PKER_RDRYG( 7, 38) = 0.100491E+01 + PKER_RDRYG( 7, 39) = 0.100663E+01 + PKER_RDRYG( 7, 40) = 0.100804E+01 + PKER_RDRYG( 8, 1) = 0.132082E+02 + PKER_RDRYG( 8, 2) = 0.108071E+02 + PKER_RDRYG( 8, 3) = 0.881568E+01 + PKER_RDRYG( 8, 4) = 0.716294E+01 + PKER_RDRYG( 8, 5) = 0.579021E+01 + PKER_RDRYG( 8, 6) = 0.464898E+01 + PKER_RDRYG( 8, 7) = 0.369939E+01 + PKER_RDRYG( 8, 8) = 0.290901E+01 + PKER_RDRYG( 8, 9) = 0.225210E+01 + PKER_RDRYG( 8, 10) = 0.170938E+01 + PKER_RDRYG( 8, 11) = 0.126773E+01 + PKER_RDRYG( 8, 12) = 0.919865E+00 + PKER_RDRYG( 8, 13) = 0.661937E+00 + PKER_RDRYG( 8, 14) = 0.490415E+00 + PKER_RDRYG( 8, 15) = 0.397339E+00 + PKER_RDRYG( 8, 16) = 0.368774E+00 + PKER_RDRYG( 8, 17) = 0.386541E+00 + PKER_RDRYG( 8, 18) = 0.431586E+00 + PKER_RDRYG( 8, 19) = 0.488388E+00 + PKER_RDRYG( 8, 20) = 0.546326E+00 + PKER_RDRYG( 8, 21) = 0.599722E+00 + PKER_RDRYG( 8, 22) = 0.646234E+00 + PKER_RDRYG( 8, 23) = 0.685535E+00 + PKER_RDRYG( 8, 24) = 0.718173E+00 + PKER_RDRYG( 8, 25) = 0.745040E+00 + PKER_RDRYG( 8, 26) = 0.767064E+00 + PKER_RDRYG( 8, 27) = 0.785101E+00 + PKER_RDRYG( 8, 28) = 0.799883E+00 + PKER_RDRYG( 8, 29) = 0.812008E+00 + PKER_RDRYG( 8, 30) = 0.821962E+00 + PKER_RDRYG( 8, 31) = 0.830140E+00 + PKER_RDRYG( 8, 32) = 0.836862E+00 + PKER_RDRYG( 8, 33) = 0.842391E+00 + PKER_RDRYG( 8, 34) = 0.846941E+00 + PKER_RDRYG( 8, 35) = 0.850687E+00 + PKER_RDRYG( 8, 36) = 0.853771E+00 + PKER_RDRYG( 8, 37) = 0.856313E+00 + PKER_RDRYG( 8, 38) = 0.858406E+00 + PKER_RDRYG( 8, 39) = 0.860132E+00 + PKER_RDRYG( 8, 40) = 0.861555E+00 + PKER_RDRYG( 9, 1) = 0.133186E+02 + PKER_RDRYG( 9, 2) = 0.109208E+02 + PKER_RDRYG( 9, 3) = 0.893300E+01 + PKER_RDRYG( 9, 4) = 0.728424E+01 + PKER_RDRYG( 9, 5) = 0.591582E+01 + PKER_RDRYG( 9, 6) = 0.477915E+01 + PKER_RDRYG( 9, 7) = 0.383409E+01 + PKER_RDRYG( 9, 8) = 0.304764E+01 + PKER_RDRYG( 9, 9) = 0.239303E+01 + PKER_RDRYG( 9, 10) = 0.184909E+01 + PKER_RDRYG( 9, 11) = 0.140008E+01 + PKER_RDRYG( 9, 12) = 0.103570E+01 + PKER_RDRYG( 9, 13) = 0.750184E+00 + PKER_RDRYG( 9, 14) = 0.540583E+00 + PKER_RDRYG( 9, 15) = 0.404171E+00 + PKER_RDRYG( 9, 16) = 0.333201E+00 + PKER_RDRYG( 9, 17) = 0.315421E+00 + PKER_RDRYG( 9, 18) = 0.334832E+00 + PKER_RDRYG( 9, 19) = 0.375550E+00 + PKER_RDRYG( 9, 20) = 0.424785E+00 + PKER_RDRYG( 9, 21) = 0.474129E+00 + PKER_RDRYG( 9, 22) = 0.519143E+00 + PKER_RDRYG( 9, 23) = 0.558133E+00 + PKER_RDRYG( 9, 24) = 0.590954E+00 + PKER_RDRYG( 9, 25) = 0.618160E+00 + PKER_RDRYG( 9, 26) = 0.640526E+00 + PKER_RDRYG( 9, 27) = 0.658847E+00 + PKER_RDRYG( 9, 28) = 0.673848E+00 + PKER_RDRYG( 9, 29) = 0.686139E+00 + PKER_RDRYG( 9, 30) = 0.696219E+00 + PKER_RDRYG( 9, 31) = 0.704493E+00 + PKER_RDRYG( 9, 32) = 0.711289E+00 + PKER_RDRYG( 9, 33) = 0.716875E+00 + PKER_RDRYG( 9, 34) = 0.721469E+00 + PKER_RDRYG( 9, 35) = 0.725249E+00 + PKER_RDRYG( 9, 36) = 0.728360E+00 + PKER_RDRYG( 9, 37) = 0.730922E+00 + PKER_RDRYG( 9, 38) = 0.733032E+00 + PKER_RDRYG( 9, 39) = 0.734770E+00 + PKER_RDRYG( 9, 40) = 0.736203E+00 + PKER_RDRYG( 10, 1) = 0.134097E+02 + PKER_RDRYG( 10, 2) = 0.110143E+02 + PKER_RDRYG( 10, 3) = 0.902922E+01 + PKER_RDRYG( 10, 4) = 0.738349E+01 + PKER_RDRYG( 10, 5) = 0.601843E+01 + PKER_RDRYG( 10, 6) = 0.488542E+01 + PKER_RDRYG( 10, 7) = 0.394421E+01 + PKER_RDRYG( 10, 8) = 0.316159E+01 + PKER_RDRYG( 10, 9) = 0.251025E+01 + PKER_RDRYG( 10, 10) = 0.196809E+01 + PKER_RDRYG( 10, 11) = 0.151773E+01 + PKER_RDRYG( 10, 12) = 0.114640E+01 + PKER_RDRYG( 10, 13) = 0.845862E+00 + PKER_RDRYG( 10, 14) = 0.611819E+00 + PKER_RDRYG( 10, 15) = 0.442230E+00 + PKER_RDRYG( 10, 16) = 0.333761E+00 + PKER_RDRYG( 10, 17) = 0.280176E+00 + PKER_RDRYG( 10, 18) = 0.270205E+00 + PKER_RDRYG( 10, 19) = 0.290267E+00 + PKER_RDRYG( 10, 20) = 0.326785E+00 + PKER_RDRYG( 10, 21) = 0.369349E+00 + PKER_RDRYG( 10, 22) = 0.411304E+00 + PKER_RDRYG( 10, 23) = 0.449213E+00 + PKER_RDRYG( 10, 24) = 0.481873E+00 + PKER_RDRYG( 10, 25) = 0.509282E+00 + PKER_RDRYG( 10, 26) = 0.531958E+00 + PKER_RDRYG( 10, 27) = 0.550577E+00 + PKER_RDRYG( 10, 28) = 0.565820E+00 + PKER_RDRYG( 10, 29) = 0.578297E+00 + PKER_RDRYG( 10, 30) = 0.588518E+00 + PKER_RDRYG( 10, 31) = 0.596899E+00 + PKER_RDRYG( 10, 32) = 0.603778E+00 + PKER_RDRYG( 10, 33) = 0.609427E+00 + PKER_RDRYG( 10, 34) = 0.614069E+00 + PKER_RDRYG( 10, 35) = 0.617886E+00 + PKER_RDRYG( 10, 36) = 0.621027E+00 + PKER_RDRYG( 10, 37) = 0.623611E+00 + PKER_RDRYG( 10, 38) = 0.625739E+00 + PKER_RDRYG( 10, 39) = 0.627491E+00 + PKER_RDRYG( 10, 40) = 0.628935E+00 + PKER_RDRYG( 11, 1) = 0.134850E+02 + PKER_RDRYG( 11, 2) = 0.110914E+02 + PKER_RDRYG( 11, 3) = 0.910837E+01 + PKER_RDRYG( 11, 4) = 0.746493E+01 + PKER_RDRYG( 11, 5) = 0.610242E+01 + PKER_RDRYG( 11, 6) = 0.497224E+01 + PKER_RDRYG( 11, 7) = 0.403413E+01 + PKER_RDRYG( 11, 8) = 0.325477E+01 + PKER_RDRYG( 11, 9) = 0.260666E+01 + PKER_RDRYG( 11, 10) = 0.206723E+01 + PKER_RDRYG( 11, 11) = 0.161821E+01 + PKER_RDRYG( 11, 12) = 0.124536E+01 + PKER_RDRYG( 11, 13) = 0.938357E+00 + PKER_RDRYG( 11, 14) = 0.690647E+00 + PKER_RDRYG( 11, 15) = 0.499022E+00 + PKER_RDRYG( 11, 16) = 0.361814E+00 + PKER_RDRYG( 11, 17) = 0.276145E+00 + PKER_RDRYG( 11, 18) = 0.236136E+00 + PKER_RDRYG( 11, 19) = 0.232058E+00 + PKER_RDRYG( 11, 20) = 0.251803E+00 + PKER_RDRYG( 11, 21) = 0.284322E+00 + PKER_RDRYG( 11, 22) = 0.321029E+00 + PKER_RDRYG( 11, 23) = 0.356649E+00 + PKER_RDRYG( 11, 24) = 0.388551E+00 + PKER_RDRYG( 11, 25) = 0.415898E+00 + PKER_RDRYG( 11, 26) = 0.438783E+00 + PKER_RDRYG( 11, 27) = 0.457681E+00 + PKER_RDRYG( 11, 28) = 0.473182E+00 + PKER_RDRYG( 11, 29) = 0.485865E+00 + PKER_RDRYG( 11, 30) = 0.496243E+00 + PKER_RDRYG( 11, 31) = 0.504744E+00 + PKER_RDRYG( 11, 32) = 0.511714E+00 + PKER_RDRYG( 11, 33) = 0.517433E+00 + PKER_RDRYG( 11, 34) = 0.522129E+00 + PKER_RDRYG( 11, 35) = 0.525987E+00 + PKER_RDRYG( 11, 36) = 0.529160E+00 + PKER_RDRYG( 11, 37) = 0.531769E+00 + PKER_RDRYG( 11, 38) = 0.533916E+00 + PKER_RDRYG( 11, 39) = 0.535683E+00 + PKER_RDRYG( 11, 40) = 0.537138E+00 + PKER_RDRYG( 12, 1) = 0.135474E+02 + PKER_RDRYG( 12, 2) = 0.111552E+02 + PKER_RDRYG( 12, 3) = 0.917366E+01 + PKER_RDRYG( 12, 4) = 0.753194E+01 + PKER_RDRYG( 12, 5) = 0.617136E+01 + PKER_RDRYG( 12, 6) = 0.504334E+01 + PKER_RDRYG( 12, 7) = 0.410762E+01 + PKER_RDRYG( 12, 8) = 0.333087E+01 + PKER_RDRYG( 12, 9) = 0.268553E+01 + PKER_RDRYG( 12, 10) = 0.214881E+01 + PKER_RDRYG( 12, 11) = 0.170205E+01 + PKER_RDRYG( 12, 12) = 0.133020E+01 + PKER_RDRYG( 12, 13) = 0.102155E+01 + PKER_RDRYG( 12, 14) = 0.767749E+00 + PKER_RDRYG( 12, 15) = 0.563744E+00 + PKER_RDRYG( 12, 16) = 0.407094E+00 + PKER_RDRYG( 12, 17) = 0.296271E+00 + PKER_RDRYG( 12, 18) = 0.229046E+00 + PKER_RDRYG( 12, 19) = 0.199698E+00 + PKER_RDRYG( 12, 20) = 0.199640E+00 + PKER_RDRYG( 12, 21) = 0.218639E+00 + PKER_RDRYG( 12, 22) = 0.247374E+00 + PKER_RDRYG( 12, 23) = 0.278945E+00 + PKER_RDRYG( 12, 24) = 0.309121E+00 + PKER_RDRYG( 12, 25) = 0.335948E+00 + PKER_RDRYG( 12, 26) = 0.358842E+00 + PKER_RDRYG( 12, 27) = 0.377946E+00 + PKER_RDRYG( 12, 28) = 0.393696E+00 + PKER_RDRYG( 12, 29) = 0.406601E+00 + PKER_RDRYG( 12, 30) = 0.417155E+00 + PKER_RDRYG( 12, 31) = 0.425790E+00 + PKER_RDRYG( 12, 32) = 0.432861E+00 + PKER_RDRYG( 12, 33) = 0.438657E+00 + PKER_RDRYG( 12, 34) = 0.443413E+00 + PKER_RDRYG( 12, 35) = 0.447317E+00 + PKER_RDRYG( 12, 36) = 0.450524E+00 + PKER_RDRYG( 12, 37) = 0.453161E+00 + PKER_RDRYG( 12, 38) = 0.455329E+00 + PKER_RDRYG( 12, 39) = 0.457113E+00 + PKER_RDRYG( 12, 40) = 0.458581E+00 + PKER_RDRYG( 13, 1) = 0.135992E+02 + PKER_RDRYG( 13, 2) = 0.112081E+02 + PKER_RDRYG( 13, 3) = 0.922768E+01 + PKER_RDRYG( 13, 4) = 0.758724E+01 + PKER_RDRYG( 13, 5) = 0.622811E+01 + PKER_RDRYG( 13, 6) = 0.510171E+01 + PKER_RDRYG( 13, 7) = 0.416780E+01 + PKER_RDRYG( 13, 8) = 0.339309E+01 + PKER_RDRYG( 13, 9) = 0.274995E+01 + PKER_RDRYG( 13, 10) = 0.221557E+01 + PKER_RDRYG( 13, 11) = 0.177110E+01 + PKER_RDRYG( 13, 12) = 0.140110E+01 + PKER_RDRYG( 13, 13) = 0.109315E+01 + PKER_RDRYG( 13, 14) = 0.837695E+00 + PKER_RDRYG( 13, 15) = 0.628007E+00 + PKER_RDRYG( 13, 16) = 0.460064E+00 + PKER_RDRYG( 13, 17) = 0.332147E+00 + PKER_RDRYG( 13, 18) = 0.242993E+00 + PKER_RDRYG( 13, 19) = 0.190382E+00 + PKER_RDRYG( 13, 20) = 0.169340E+00 + PKER_RDRYG( 13, 21) = 0.172021E+00 + PKER_RDRYG( 13, 22) = 0.189920E+00 + PKER_RDRYG( 13, 23) = 0.215196E+00 + PKER_RDRYG( 13, 24) = 0.242255E+00 + PKER_RDRYG( 13, 25) = 0.267812E+00 + PKER_RDRYG( 13, 26) = 0.290361E+00 + PKER_RDRYG( 13, 27) = 0.309517E+00 + PKER_RDRYG( 13, 28) = 0.325465E+00 + PKER_RDRYG( 13, 29) = 0.338590E+00 + PKER_RDRYG( 13, 30) = 0.349335E+00 + PKER_RDRYG( 13, 31) = 0.358118E+00 + PKER_RDRYG( 13, 32) = 0.365303E+00 + PKER_RDRYG( 13, 33) = 0.371186E+00 + PKER_RDRYG( 13, 34) = 0.376007E+00 + PKER_RDRYG( 13, 35) = 0.379962E+00 + PKER_RDRYG( 13, 36) = 0.383208E+00 + PKER_RDRYG( 13, 37) = 0.385875E+00 + PKER_RDRYG( 13, 38) = 0.388066E+00 + PKER_RDRYG( 13, 39) = 0.389868E+00 + PKER_RDRYG( 13, 40) = 0.391351E+00 + PKER_RDRYG( 14, 1) = 0.136424E+02 + PKER_RDRYG( 14, 2) = 0.112520E+02 + PKER_RDRYG( 14, 3) = 0.927249E+01 + PKER_RDRYG( 14, 4) = 0.763302E+01 + PKER_RDRYG( 14, 5) = 0.627497E+01 + PKER_RDRYG( 14, 6) = 0.514978E+01 + PKER_RDRYG( 14, 7) = 0.421724E+01 + PKER_RDRYG( 14, 8) = 0.344405E+01 + PKER_RDRYG( 14, 9) = 0.280263E+01 + PKER_RDRYG( 14, 10) = 0.227012E+01 + PKER_RDRYG( 14, 11) = 0.182762E+01 + PKER_RDRYG( 14, 12) = 0.145954E+01 + PKER_RDRYG( 14, 13) = 0.115311E+01 + PKER_RDRYG( 14, 14) = 0.898099E+00 + PKER_RDRYG( 14, 15) = 0.686697E+00 + PKER_RDRYG( 14, 16) = 0.513492E+00 + PKER_RDRYG( 14, 17) = 0.375385E+00 + PKER_RDRYG( 14, 18) = 0.270975E+00 + PKER_RDRYG( 14, 19) = 0.199521E+00 + PKER_RDRYG( 14, 20) = 0.158655E+00 + PKER_RDRYG( 14, 21) = 0.143819E+00 + PKER_RDRYG( 14, 22) = 0.148448E+00 + PKER_RDRYG( 14, 23) = 0.165031E+00 + PKER_RDRYG( 14, 24) = 0.187175E+00 + PKER_RDRYG( 14, 25) = 0.210331E+00 + PKER_RDRYG( 14, 26) = 0.231936E+00 + PKER_RDRYG( 14, 27) = 0.250868E+00 + PKER_RDRYG( 14, 28) = 0.266895E+00 + PKER_RDRYG( 14, 29) = 0.280204E+00 + PKER_RDRYG( 14, 30) = 0.291143E+00 + PKER_RDRYG( 14, 31) = 0.300090E+00 + PKER_RDRYG( 14, 32) = 0.307401E+00 + PKER_RDRYG( 14, 33) = 0.313380E+00 + PKER_RDRYG( 14, 34) = 0.318275E+00 + PKER_RDRYG( 14, 35) = 0.322286E+00 + PKER_RDRYG( 14, 36) = 0.325575E+00 + PKER_RDRYG( 14, 37) = 0.328275E+00 + PKER_RDRYG( 14, 38) = 0.330492E+00 + PKER_RDRYG( 14, 39) = 0.332314E+00 + PKER_RDRYG( 14, 40) = 0.333811E+00 + PKER_RDRYG( 15, 1) = 0.136784E+02 + PKER_RDRYG( 15, 2) = 0.112886E+02 + PKER_RDRYG( 15, 3) = 0.930976E+01 + PKER_RDRYG( 15, 4) = 0.767102E+01 + PKER_RDRYG( 15, 5) = 0.631377E+01 + PKER_RDRYG( 15, 6) = 0.518948E+01 + PKER_RDRYG( 15, 7) = 0.425797E+01 + PKER_RDRYG( 15, 8) = 0.348593E+01 + PKER_RDRYG( 15, 9) = 0.284580E+01 + PKER_RDRYG( 15, 10) = 0.231474E+01 + PKER_RDRYG( 15, 11) = 0.187382E+01 + PKER_RDRYG( 15, 12) = 0.150740E+01 + PKER_RDRYG( 15, 13) = 0.120258E+01 + PKER_RDRYG( 15, 14) = 0.948799E+00 + PKER_RDRYG( 15, 15) = 0.737641E+00 + PKER_RDRYG( 15, 16) = 0.562720E+00 + PKER_RDRYG( 15, 17) = 0.419730E+00 + PKER_RDRYG( 15, 18) = 0.306247E+00 + PKER_RDRYG( 15, 19) = 0.221265E+00 + PKER_RDRYG( 15, 20) = 0.164088E+00 + PKER_RDRYG( 15, 21) = 0.132562E+00 + PKER_RDRYG( 15, 22) = 0.122598E+00 + PKER_RDRYG( 15, 23) = 0.128315E+00 + PKER_RDRYG( 15, 24) = 0.143469E+00 + PKER_RDRYG( 15, 25) = 0.162742E+00 + PKER_RDRYG( 15, 26) = 0.182528E+00 + PKER_RDRYG( 15, 27) = 0.200775E+00 + PKER_RDRYG( 15, 28) = 0.216671E+00 + PKER_RDRYG( 15, 29) = 0.230077E+00 + PKER_RDRYG( 15, 30) = 0.241184E+00 + PKER_RDRYG( 15, 31) = 0.250299E+00 + PKER_RDRYG( 15, 32) = 0.257750E+00 + PKER_RDRYG( 15, 33) = 0.263837E+00 + PKER_RDRYG( 15, 34) = 0.268813E+00 + PKER_RDRYG( 15, 35) = 0.272887E+00 + PKER_RDRYG( 15, 36) = 0.276224E+00 + PKER_RDRYG( 15, 37) = 0.278960E+00 + PKER_RDRYG( 15, 38) = 0.281205E+00 + PKER_RDRYG( 15, 39) = 0.283049E+00 + PKER_RDRYG( 15, 40) = 0.284564E+00 + PKER_RDRYG( 16, 1) = 0.137085E+02 + PKER_RDRYG( 16, 2) = 0.113192E+02 + PKER_RDRYG( 16, 3) = 0.934083E+01 + PKER_RDRYG( 16, 4) = 0.770263E+01 + PKER_RDRYG( 16, 5) = 0.634599E+01 + PKER_RDRYG( 16, 6) = 0.522238E+01 + PKER_RDRYG( 16, 7) = 0.429162E+01 + PKER_RDRYG( 16, 8) = 0.352045E+01 + PKER_RDRYG( 16, 9) = 0.288129E+01 + PKER_RDRYG( 16, 10) = 0.235131E+01 + PKER_RDRYG( 16, 11) = 0.191162E+01 + PKER_RDRYG( 16, 12) = 0.154654E+01 + PKER_RDRYG( 16, 13) = 0.124312E+01 + PKER_RDRYG( 16, 14) = 0.990681E+00 + PKER_RDRYG( 16, 15) = 0.780510E+00 + PKER_RDRYG( 16, 16) = 0.605678E+00 + PKER_RDRYG( 16, 17) = 0.460987E+00 + PKER_RDRYG( 16, 18) = 0.342972E+00 + PKER_RDRYG( 16, 19) = 0.249819E+00 + PKER_RDRYG( 16, 20) = 0.180844E+00 + PKER_RDRYG( 16, 21) = 0.135165E+00 + PKER_RDRYG( 16, 22) = 0.111031E+00 + PKER_RDRYG( 16, 23) = 0.104672E+00 + PKER_RDRYG( 16, 24) = 0.110998E+00 + PKER_RDRYG( 16, 25) = 0.124724E+00 + PKER_RDRYG( 16, 26) = 0.141478E+00 + PKER_RDRYG( 16, 27) = 0.158331E+00 + PKER_RDRYG( 16, 28) = 0.173737E+00 + PKER_RDRYG( 16, 29) = 0.187074E+00 + PKER_RDRYG( 16, 30) = 0.198283E+00 + PKER_RDRYG( 16, 31) = 0.207552E+00 + PKER_RDRYG( 16, 32) = 0.215149E+00 + PKER_RDRYG( 16, 33) = 0.221354E+00 + PKER_RDRYG( 16, 34) = 0.226422E+00 + PKER_RDRYG( 16, 35) = 0.230565E+00 + PKER_RDRYG( 16, 36) = 0.233955E+00 + PKER_RDRYG( 16, 37) = 0.236732E+00 + PKER_RDRYG( 16, 38) = 0.239008E+00 + PKER_RDRYG( 16, 39) = 0.240876E+00 + PKER_RDRYG( 16, 40) = 0.242409E+00 + PKER_RDRYG( 17, 1) = 0.137338E+02 + PKER_RDRYG( 17, 2) = 0.113448E+02 + PKER_RDRYG( 17, 3) = 0.936679E+01 + PKER_RDRYG( 17, 4) = 0.772900E+01 + PKER_RDRYG( 17, 5) = 0.637281E+01 + PKER_RDRYG( 17, 6) = 0.524971E+01 + PKER_RDRYG( 17, 7) = 0.431952E+01 + PKER_RDRYG( 17, 8) = 0.354898E+01 + PKER_RDRYG( 17, 9) = 0.291054E+01 + PKER_RDRYG( 17, 10) = 0.238139E+01 + PKER_RDRYG( 17, 11) = 0.194261E+01 + PKER_RDRYG( 17, 12) = 0.157857E+01 + PKER_RDRYG( 17, 13) = 0.127628E+01 + PKER_RDRYG( 17, 14) = 0.102502E+01 + PKER_RDRYG( 17, 15) = 0.815970E+00 + PKER_RDRYG( 17, 16) = 0.641917E+00 + PKER_RDRYG( 17, 17) = 0.497171E+00 + PKER_RDRYG( 17, 18) = 0.377507E+00 + PKER_RDRYG( 17, 19) = 0.280172E+00 + PKER_RDRYG( 17, 20) = 0.203787E+00 + PKER_RDRYG( 17, 21) = 0.147769E+00 + PKER_RDRYG( 17, 22) = 0.111528E+00 + PKER_RDRYG( 17, 23) = 0.932152E-01 + PKER_RDRYG( 17, 24) = 0.895799E-01 + PKER_RDRYG( 17, 25) = 0.961438E-01 + PKER_RDRYG( 17, 26) = 0.108454E+00 + PKER_RDRYG( 17, 27) = 0.122945E+00 + PKER_RDRYG( 17, 28) = 0.137295E+00 + PKER_RDRYG( 17, 29) = 0.150279E+00 + PKER_RDRYG( 17, 30) = 0.161465E+00 + PKER_RDRYG( 17, 31) = 0.170838E+00 + PKER_RDRYG( 17, 32) = 0.178572E+00 + PKER_RDRYG( 17, 33) = 0.184904E+00 + PKER_RDRYG( 17, 34) = 0.190073E+00 + PKER_RDRYG( 17, 35) = 0.194293E+00 + PKER_RDRYG( 17, 36) = 0.197742E+00 + PKER_RDRYG( 17, 37) = 0.200564E+00 + PKER_RDRYG( 17, 38) = 0.202875E+00 + PKER_RDRYG( 17, 39) = 0.204769E+00 + PKER_RDRYG( 17, 40) = 0.206323E+00 + PKER_RDRYG( 18, 1) = 0.137549E+02 + PKER_RDRYG( 18, 2) = 0.113662E+02 + PKER_RDRYG( 18, 3) = 0.938851E+01 + PKER_RDRYG( 18, 4) = 0.775103E+01 + PKER_RDRYG( 18, 5) = 0.639519E+01 + PKER_RDRYG( 18, 6) = 0.527247E+01 + PKER_RDRYG( 18, 7) = 0.434271E+01 + PKER_RDRYG( 18, 8) = 0.357264E+01 + PKER_RDRYG( 18, 9) = 0.293474E+01 + PKER_RDRYG( 18, 10) = 0.240619E+01 + PKER_RDRYG( 18, 11) = 0.196810E+01 + PKER_RDRYG( 18, 12) = 0.160484E+01 + PKER_RDRYG( 18, 13) = 0.130342E+01 + PKER_RDRYG( 18, 14) = 0.105312E+01 + PKER_RDRYG( 18, 15) = 0.845066E+00 + PKER_RDRYG( 18, 16) = 0.671939E+00 + PKER_RDRYG( 18, 17) = 0.527804E+00 + PKER_RDRYG( 18, 18) = 0.407977E+00 + PKER_RDRYG( 18, 19) = 0.309030E+00 + PKER_RDRYG( 18, 20) = 0.228800E+00 + PKER_RDRYG( 18, 21) = 0.166244E+00 + PKER_RDRYG( 18, 22) = 0.120903E+00 + PKER_RDRYG( 18, 23) = 0.922202E-01 + PKER_RDRYG( 18, 24) = 0.785293E-01 + PKER_RDRYG( 18, 25) = 0.768302E-01 + PKER_RDRYG( 18, 26) = 0.833242E-01 + PKER_RDRYG( 18, 27) = 0.942918E-01 + PKER_RDRYG( 18, 28) = 0.106809E+00 + PKER_RDRYG( 18, 29) = 0.119000E+00 + PKER_RDRYG( 18, 30) = 0.129941E+00 + PKER_RDRYG( 18, 31) = 0.139320E+00 + PKER_RDRYG( 18, 32) = 0.147155E+00 + PKER_RDRYG( 18, 33) = 0.153608E+00 + PKER_RDRYG( 18, 34) = 0.158885E+00 + PKER_RDRYG( 18, 35) = 0.163191E+00 + PKER_RDRYG( 18, 36) = 0.166706E+00 + PKER_RDRYG( 18, 37) = 0.169578E+00 + PKER_RDRYG( 18, 38) = 0.171928E+00 + PKER_RDRYG( 18, 39) = 0.173851E+00 + PKER_RDRYG( 18, 40) = 0.175428E+00 + PKER_RDRYG( 19, 1) = 0.137727E+02 + PKER_RDRYG( 19, 2) = 0.113842E+02 + PKER_RDRYG( 19, 3) = 0.940672E+01 + PKER_RDRYG( 19, 4) = 0.776948E+01 + PKER_RDRYG( 19, 5) = 0.641390E+01 + PKER_RDRYG( 19, 6) = 0.529147E+01 + PKER_RDRYG( 19, 7) = 0.436202E+01 + PKER_RDRYG( 19, 8) = 0.359232E+01 + PKER_RDRYG( 19, 9) = 0.295481E+01 + PKER_RDRYG( 19, 10) = 0.242671E+01 + PKER_RDRYG( 19, 11) = 0.198914E+01 + PKER_RDRYG( 19, 12) = 0.162645E+01 + PKER_RDRYG( 19, 13) = 0.132569E+01 + PKER_RDRYG( 19, 14) = 0.107613E+01 + PKER_RDRYG( 19, 15) = 0.868883E+00 + PKER_RDRYG( 19, 16) = 0.696595E+00 + PKER_RDRYG( 19, 17) = 0.553222E+00 + PKER_RDRYG( 19, 18) = 0.433861E+00 + PKER_RDRYG( 19, 19) = 0.334680E+00 + PKER_RDRYG( 19, 20) = 0.252894E+00 + PKER_RDRYG( 19, 21) = 0.186794E+00 + PKER_RDRYG( 19, 22) = 0.135613E+00 + PKER_RDRYG( 19, 23) = 0.990001E-01 + PKER_RDRYG( 19, 24) = 0.764111E-01 + PKER_RDRYG( 19, 25) = 0.663036E-01 + PKER_RDRYG( 19, 26) = 0.659987E-01 + PKER_RDRYG( 19, 27) = 0.722775E-01 + PKER_RDRYG( 19, 28) = 0.819918E-01 + PKER_RDRYG( 19, 29) = 0.927520E-01 + PKER_RDRYG( 19, 30) = 0.103099E+00 + PKER_RDRYG( 19, 31) = 0.112313E+00 + PKER_RDRYG( 19, 32) = 0.120174E+00 + PKER_RDRYG( 19, 33) = 0.126723E+00 + PKER_RDRYG( 19, 34) = 0.132108E+00 + PKER_RDRYG( 19, 35) = 0.136507E+00 + PKER_RDRYG( 19, 36) = 0.140095E+00 + PKER_RDRYG( 19, 37) = 0.143023E+00 + PKER_RDRYG( 19, 38) = 0.145415E+00 + PKER_RDRYG( 19, 39) = 0.147371E+00 + PKER_RDRYG( 19, 40) = 0.148972E+00 + PKER_RDRYG( 20, 1) = 0.137877E+02 + PKER_RDRYG( 20, 2) = 0.113993E+02 + PKER_RDRYG( 20, 3) = 0.942201E+01 + PKER_RDRYG( 20, 4) = 0.778496E+01 + PKER_RDRYG( 20, 5) = 0.642957E+01 + PKER_RDRYG( 20, 6) = 0.530736E+01 + PKER_RDRYG( 20, 7) = 0.437816E+01 + PKER_RDRYG( 20, 8) = 0.360871E+01 + PKER_RDRYG( 20, 9) = 0.297151E+01 + PKER_RDRYG( 20, 10) = 0.244375E+01 + PKER_RDRYG( 20, 11) = 0.200655E+01 + PKER_RDRYG( 20, 12) = 0.164429E+01 + PKER_RDRYG( 20, 13) = 0.134402E+01 + PKER_RDRYG( 20, 14) = 0.109502E+01 + PKER_RDRYG( 20, 15) = 0.888391E+00 + PKER_RDRYG( 20, 16) = 0.716785E+00 + PKER_RDRYG( 20, 17) = 0.574115E+00 + PKER_RDRYG( 20, 18) = 0.455384E+00 + PKER_RDRYG( 20, 19) = 0.356548E+00 + PKER_RDRYG( 20, 20) = 0.274459E+00 + PKER_RDRYG( 20, 21) = 0.206882E+00 + PKER_RDRYG( 20, 22) = 0.152466E+00 + PKER_RDRYG( 20, 23) = 0.110601E+00 + PKER_RDRYG( 20, 24) = 0.811506E-01 + PKER_RDRYG( 20, 25) = 0.634503E-01 + PKER_RDRYG( 20, 26) = 0.561009E-01 + PKER_RDRYG( 20, 27) = 0.568033E-01 + PKER_RDRYG( 20, 28) = 0.627284E-01 + PKER_RDRYG( 20, 29) = 0.712830E-01 + PKER_RDRYG( 20, 30) = 0.805234E-01 + PKER_RDRYG( 20, 31) = 0.892920E-01 + PKER_RDRYG( 20, 32) = 0.970435E-01 + PKER_RDRYG( 20, 33) = 0.103629E+00 + PKER_RDRYG( 20, 34) = 0.109103E+00 + PKER_RDRYG( 20, 35) = 0.113596E+00 + PKER_RDRYG( 20, 36) = 0.117263E+00 + PKER_RDRYG( 20, 37) = 0.120253E+00 + PKER_RDRYG( 20, 38) = 0.122692E+00 + PKER_RDRYG( 20, 39) = 0.124685E+00 + PKER_RDRYG( 20, 40) = 0.126314E+00 + PKER_RDRYG( 21, 1) = 0.138003E+02 + PKER_RDRYG( 21, 2) = 0.114121E+02 + PKER_RDRYG( 21, 3) = 0.943487E+01 + PKER_RDRYG( 21, 4) = 0.779796E+01 + PKER_RDRYG( 21, 5) = 0.644273E+01 + PKER_RDRYG( 21, 6) = 0.532068E+01 + PKER_RDRYG( 21, 7) = 0.439166E+01 + PKER_RDRYG( 21, 8) = 0.362242E+01 + PKER_RDRYG( 21, 9) = 0.298543E+01 + PKER_RDRYG( 21, 10) = 0.245792E+01 + PKER_RDRYG( 21, 11) = 0.202101E+01 + PKER_RDRYG( 21, 12) = 0.165907E+01 + PKER_RDRYG( 21, 13) = 0.135916E+01 + PKER_RDRYG( 21, 14) = 0.111057E+01 + PKER_RDRYG( 21, 15) = 0.904409E+00 + PKER_RDRYG( 21, 16) = 0.733329E+00 + PKER_RDRYG( 21, 17) = 0.591235E+00 + PKER_RDRYG( 21, 18) = 0.473092E+00 + PKER_RDRYG( 21, 19) = 0.374768E+00 + PKER_RDRYG( 21, 20) = 0.292928E+00 + PKER_RDRYG( 21, 21) = 0.224999E+00 + PKER_RDRYG( 21, 22) = 0.169182E+00 + PKER_RDRYG( 21, 23) = 0.124421E+00 + PKER_RDRYG( 21, 24) = 0.902987E-01 + PKER_RDRYG( 21, 25) = 0.666035E-01 + PKER_RDRYG( 21, 26) = 0.528135E-01 + PKER_RDRYG( 21, 27) = 0.476163E-01 + PKER_RDRYG( 21, 28) = 0.489721E-01 + PKER_RDRYG( 21, 29) = 0.544680E-01 + PKER_RDRYG( 21, 30) = 0.619547E-01 + PKER_RDRYG( 21, 31) = 0.698776E-01 + PKER_RDRYG( 21, 32) = 0.772992E-01 + PKER_RDRYG( 21, 33) = 0.838194E-01 + PKER_RDRYG( 21, 34) = 0.893378E-01 + PKER_RDRYG( 21, 35) = 0.939116E-01 + PKER_RDRYG( 21, 36) = 0.976604E-01 + PKER_RDRYG( 21, 37) = 0.100718E+00 + PKER_RDRYG( 21, 38) = 0.103210E+00 + PKER_RDRYG( 21, 39) = 0.105243E+00 + PKER_RDRYG( 21, 40) = 0.106903E+00 + PKER_RDRYG( 22, 1) = 0.138109E+02 + PKER_RDRYG( 22, 2) = 0.114228E+02 + PKER_RDRYG( 22, 3) = 0.944570E+01 + PKER_RDRYG( 22, 4) = 0.780889E+01 + PKER_RDRYG( 22, 5) = 0.645378E+01 + PKER_RDRYG( 22, 6) = 0.533186E+01 + PKER_RDRYG( 22, 7) = 0.440297E+01 + PKER_RDRYG( 22, 8) = 0.363389E+01 + PKER_RDRYG( 22, 9) = 0.299707E+01 + PKER_RDRYG( 22, 10) = 0.246974E+01 + PKER_RDRYG( 22, 11) = 0.203304E+01 + PKER_RDRYG( 22, 12) = 0.167134E+01 + PKER_RDRYG( 22, 13) = 0.137170E+01 + PKER_RDRYG( 22, 14) = 0.112341E+01 + PKER_RDRYG( 22, 15) = 0.917601E+00 + PKER_RDRYG( 22, 16) = 0.746917E+00 + PKER_RDRYG( 22, 17) = 0.605268E+00 + PKER_RDRYG( 22, 18) = 0.487610E+00 + PKER_RDRYG( 22, 19) = 0.389777E+00 + PKER_RDRYG( 22, 20) = 0.308353E+00 + PKER_RDRYG( 22, 21) = 0.240593E+00 + PKER_RDRYG( 22, 22) = 0.184395E+00 + PKER_RDRYG( 22, 23) = 0.138304E+00 + PKER_RDRYG( 22, 24) = 0.101518E+00 + PKER_RDRYG( 22, 25) = 0.737400E-01 + PKER_RDRYG( 22, 26) = 0.547362E-01 + PKER_RDRYG( 22, 27) = 0.440552E-01 + PKER_RDRYG( 22, 28) = 0.405040E-01 + PKER_RDRYG( 22, 29) = 0.422514E-01 + PKER_RDRYG( 22, 30) = 0.472981E-01 + PKER_RDRYG( 22, 31) = 0.538448E-01 + PKER_RDRYG( 22, 32) = 0.606126E-01 + PKER_RDRYG( 22, 33) = 0.668945E-01 + PKER_RDRYG( 22, 34) = 0.723746E-01 + PKER_RDRYG( 22, 35) = 0.769958E-01 + PKER_RDRYG( 22, 36) = 0.808177E-01 + PKER_RDRYG( 22, 37) = 0.839459E-01 + PKER_RDRYG( 22, 38) = 0.864957E-01 + PKER_RDRYG( 22, 39) = 0.885730E-01 + PKER_RDRYG( 22, 40) = 0.902671E-01 + PKER_RDRYG( 23, 1) = 0.138199E+02 + PKER_RDRYG( 23, 2) = 0.114318E+02 + PKER_RDRYG( 23, 3) = 0.945483E+01 + PKER_RDRYG( 23, 4) = 0.781810E+01 + PKER_RDRYG( 23, 5) = 0.646308E+01 + PKER_RDRYG( 23, 6) = 0.534126E+01 + PKER_RDRYG( 23, 7) = 0.441248E+01 + PKER_RDRYG( 23, 8) = 0.364351E+01 + PKER_RDRYG( 23, 9) = 0.300682E+01 + PKER_RDRYG( 23, 10) = 0.247963E+01 + PKER_RDRYG( 23, 11) = 0.204308E+01 + PKER_RDRYG( 23, 12) = 0.168156E+01 + PKER_RDRYG( 23, 13) = 0.138212E+01 + PKER_RDRYG( 23, 14) = 0.113405E+01 + PKER_RDRYG( 23, 15) = 0.928502E+00 + PKER_RDRYG( 23, 16) = 0.758112E+00 + PKER_RDRYG( 23, 17) = 0.616797E+00 + PKER_RDRYG( 23, 18) = 0.499515E+00 + PKER_RDRYG( 23, 19) = 0.402091E+00 + PKER_RDRYG( 23, 20) = 0.321077E+00 + PKER_RDRYG( 23, 21) = 0.253650E+00 + PKER_RDRYG( 23, 22) = 0.197550E+00 + PKER_RDRYG( 23, 23) = 0.151060E+00 + PKER_RDRYG( 23, 24) = 0.113025E+00 + PKER_RDRYG( 23, 25) = 0.828239E-01 + PKER_RDRYG( 23, 26) = 0.601986E-01 + PKER_RDRYG( 23, 27) = 0.450509E-01 + PKER_RDRYG( 23, 28) = 0.368416E-01 + PKER_RDRYG( 23, 29) = 0.345321E-01 + PKER_RDRYG( 23, 30) = 0.365251E-01 + PKER_RDRYG( 23, 31) = 0.410970E-01 + PKER_RDRYG( 23, 32) = 0.467824E-01 + PKER_RDRYG( 23, 33) = 0.525608E-01 + PKER_RDRYG( 23, 34) = 0.578657E-01 + PKER_RDRYG( 23, 35) = 0.624713E-01 + PKER_RDRYG( 23, 36) = 0.663413E-01 + PKER_RDRYG( 23, 37) = 0.695349E-01 + PKER_RDRYG( 23, 38) = 0.721454E-01 + PKER_RDRYG( 23, 39) = 0.742719E-01 + PKER_RDRYG( 23, 40) = 0.760039E-01 + PKER_RDRYG( 24, 1) = 0.138275E+02 + PKER_RDRYG( 24, 2) = 0.114395E+02 + PKER_RDRYG( 24, 3) = 0.946253E+01 + PKER_RDRYG( 24, 4) = 0.782587E+01 + PKER_RDRYG( 24, 5) = 0.647092E+01 + PKER_RDRYG( 24, 6) = 0.534917E+01 + PKER_RDRYG( 24, 7) = 0.442047E+01 + PKER_RDRYG( 24, 8) = 0.365159E+01 + PKER_RDRYG( 24, 9) = 0.301500E+01 + PKER_RDRYG( 24, 10) = 0.248792E+01 + PKER_RDRYG( 24, 11) = 0.205149E+01 + PKER_RDRYG( 24, 12) = 0.169009E+01 + PKER_RDRYG( 24, 13) = 0.139080E+01 + PKER_RDRYG( 24, 14) = 0.114290E+01 + PKER_RDRYG( 24, 15) = 0.937539E+00 + PKER_RDRYG( 24, 16) = 0.767365E+00 + PKER_RDRYG( 24, 17) = 0.626299E+00 + PKER_RDRYG( 24, 18) = 0.509299E+00 + PKER_RDRYG( 24, 19) = 0.412192E+00 + PKER_RDRYG( 24, 20) = 0.331522E+00 + PKER_RDRYG( 24, 21) = 0.264435E+00 + PKER_RDRYG( 24, 22) = 0.208600E+00 + PKER_RDRYG( 24, 23) = 0.162158E+00 + PKER_RDRYG( 24, 24) = 0.123712E+00 + PKER_RDRYG( 24, 25) = 0.923382E-01 + PKER_RDRYG( 24, 26) = 0.675660E-01 + PKER_RDRYG( 24, 27) = 0.492121E-01 + PKER_RDRYG( 24, 28) = 0.371392E-01 + PKER_RDRYG( 24, 29) = 0.309059E-01 + PKER_RDRYG( 24, 30) = 0.295040E-01 + PKER_RDRYG( 24, 31) = 0.315887E-01 + PKER_RDRYG( 24, 32) = 0.357033E-01 + PKER_RDRYG( 24, 33) = 0.406336E-01 + PKER_RDRYG( 24, 34) = 0.455581E-01 + PKER_RDRYG( 24, 35) = 0.500391E-01 + PKER_RDRYG( 24, 36) = 0.539067E-01 + PKER_RDRYG( 24, 37) = 0.571467E-01 + PKER_RDRYG( 24, 38) = 0.598152E-01 + PKER_RDRYG( 24, 39) = 0.619938E-01 + PKER_RDRYG( 24, 40) = 0.637676E-01 + PKER_RDRYG( 25, 1) = 0.138339E+02 + PKER_RDRYG( 25, 2) = 0.114460E+02 + PKER_RDRYG( 25, 3) = 0.946904E+01 + PKER_RDRYG( 25, 4) = 0.783243E+01 + PKER_RDRYG( 25, 5) = 0.647753E+01 + PKER_RDRYG( 25, 6) = 0.535584E+01 + PKER_RDRYG( 25, 7) = 0.442721E+01 + PKER_RDRYG( 25, 8) = 0.365839E+01 + PKER_RDRYG( 25, 9) = 0.302187E+01 + PKER_RDRYG( 25, 10) = 0.249487E+01 + PKER_RDRYG( 25, 11) = 0.205853E+01 + PKER_RDRYG( 25, 12) = 0.169723E+01 + PKER_RDRYG( 25, 13) = 0.139805E+01 + PKER_RDRYG( 25, 14) = 0.115028E+01 + PKER_RDRYG( 25, 15) = 0.945054E+00 + PKER_RDRYG( 25, 16) = 0.775040E+00 + PKER_RDRYG( 25, 17) = 0.634156E+00 + PKER_RDRYG( 25, 18) = 0.517365E+00 + PKER_RDRYG( 25, 19) = 0.420497E+00 + PKER_RDRYG( 25, 20) = 0.340095E+00 + PKER_RDRYG( 25, 21) = 0.273296E+00 + PKER_RDRYG( 25, 22) = 0.217743E+00 + PKER_RDRYG( 25, 23) = 0.171507E+00 + PKER_RDRYG( 25, 24) = 0.133065E+00 + PKER_RDRYG( 25, 25) = 0.101277E+00 + PKER_RDRYG( 25, 26) = 0.754131E-01 + PKER_RDRYG( 25, 27) = 0.551078E-01 + PKER_RDRYG( 25, 28) = 0.402423E-01 + PKER_RDRYG( 25, 29) = 0.306784E-01 + PKER_RDRYG( 25, 30) = 0.259723E-01 + PKER_RDRYG( 25, 31) = 0.252571E-01 + PKER_RDRYG( 25, 32) = 0.273487E-01 + PKER_RDRYG( 25, 33) = 0.310247E-01 + PKER_RDRYG( 25, 34) = 0.352825E-01 + PKER_RDRYG( 25, 35) = 0.394738E-01 + PKER_RDRYG( 25, 36) = 0.432539E-01 + PKER_RDRYG( 25, 37) = 0.465023E-01 + PKER_RDRYG( 25, 38) = 0.492145E-01 + PKER_RDRYG( 25, 39) = 0.514441E-01 + PKER_RDRYG( 25, 40) = 0.532625E-01 + PKER_RDRYG( 26, 1) = 0.138394E+02 + PKER_RDRYG( 26, 2) = 0.114514E+02 + PKER_RDRYG( 26, 3) = 0.947455E+01 + PKER_RDRYG( 26, 4) = 0.783798E+01 + PKER_RDRYG( 26, 5) = 0.648312E+01 + PKER_RDRYG( 26, 6) = 0.536147E+01 + PKER_RDRYG( 26, 7) = 0.443289E+01 + PKER_RDRYG( 26, 8) = 0.366412E+01 + PKER_RDRYG( 26, 9) = 0.302766E+01 + PKER_RDRYG( 26, 10) = 0.250072E+01 + PKER_RDRYG( 26, 11) = 0.206444E+01 + PKER_RDRYG( 26, 12) = 0.170322E+01 + PKER_RDRYG( 26, 13) = 0.140412E+01 + PKER_RDRYG( 26, 14) = 0.115644E+01 + PKER_RDRYG( 26, 15) = 0.951320E+00 + PKER_RDRYG( 26, 16) = 0.781424E+00 + PKER_RDRYG( 26, 17) = 0.640674E+00 + PKER_RDRYG( 26, 18) = 0.524038E+00 + PKER_RDRYG( 26, 19) = 0.427346E+00 + PKER_RDRYG( 26, 20) = 0.347145E+00 + PKER_RDRYG( 26, 21) = 0.280573E+00 + PKER_RDRYG( 26, 22) = 0.225261E+00 + PKER_RDRYG( 26, 23) = 0.179259E+00 + PKER_RDRYG( 26, 24) = 0.140975E+00 + PKER_RDRYG( 26, 25) = 0.109155E+00 + PKER_RDRYG( 26, 26) = 0.828827E-01 + PKER_RDRYG( 26, 27) = 0.615721E-01 + PKER_RDRYG( 26, 28) = 0.449413E-01 + PKER_RDRYG( 26, 29) = 0.329364E-01 + PKER_RDRYG( 26, 30) = 0.253888E-01 + PKER_RDRYG( 26, 31) = 0.218916E-01 + PKER_RDRYG( 26, 32) = 0.216696E-01 + PKER_RDRYG( 26, 33) = 0.236986E-01 + PKER_RDRYG( 26, 34) = 0.269569E-01 + PKER_RDRYG( 26, 35) = 0.306269E-01 + PKER_RDRYG( 26, 36) = 0.341888E-01 + PKER_RDRYG( 26, 37) = 0.373771E-01 + PKER_RDRYG( 26, 38) = 0.401030E-01 + PKER_RDRYG( 26, 39) = 0.423733E-01 + PKER_RDRYG( 26, 40) = 0.442362E-01 + PKER_RDRYG( 27, 1) = 0.138440E+02 + PKER_RDRYG( 27, 2) = 0.114560E+02 + PKER_RDRYG( 27, 3) = 0.947921E+01 + PKER_RDRYG( 27, 4) = 0.784267E+01 + PKER_RDRYG( 27, 5) = 0.648784E+01 + PKER_RDRYG( 27, 6) = 0.536623E+01 + PKER_RDRYG( 27, 7) = 0.443768E+01 + PKER_RDRYG( 27, 8) = 0.366895E+01 + PKER_RDRYG( 27, 9) = 0.303253E+01 + PKER_RDRYG( 27, 10) = 0.250564E+01 + PKER_RDRYG( 27, 11) = 0.206942E+01 + PKER_RDRYG( 27, 12) = 0.170825E+01 + PKER_RDRYG( 27, 13) = 0.140921E+01 + PKER_RDRYG( 27, 14) = 0.116160E+01 + PKER_RDRYG( 27, 15) = 0.956558E+00 + PKER_RDRYG( 27, 16) = 0.786749E+00 + PKER_RDRYG( 27, 17) = 0.646098E+00 + PKER_RDRYG( 27, 18) = 0.529575E+00 + PKER_RDRYG( 27, 19) = 0.433014E+00 + PKER_RDRYG( 27, 20) = 0.352962E+00 + PKER_RDRYG( 27, 21) = 0.286560E+00 + PKER_RDRYG( 27, 22) = 0.231439E+00 + PKER_RDRYG( 27, 23) = 0.185639E+00 + PKER_RDRYG( 27, 24) = 0.147545E+00 + PKER_RDRYG( 27, 25) = 0.115846E+00 + PKER_RDRYG( 27, 26) = 0.895139E-01 + PKER_RDRYG( 27, 27) = 0.678043E-01 + PKER_RDRYG( 27, 28) = 0.502589E-01 + PKER_RDRYG( 27, 29) = 0.366803E-01 + PKER_RDRYG( 27, 30) = 0.269840E-01 + PKER_RDRYG( 27, 31) = 0.210536E-01 + PKER_RDRYG( 27, 32) = 0.184920E-01 + PKER_RDRYG( 27, 33) = 0.186221E-01 + PKER_RDRYG( 27, 34) = 0.205486E-01 + PKER_RDRYG( 27, 35) = 0.234200E-01 + PKER_RDRYG( 27, 36) = 0.265772E-01 + PKER_RDRYG( 27, 37) = 0.296001E-01 + PKER_RDRYG( 27, 38) = 0.322869E-01 + PKER_RDRYG( 27, 39) = 0.345747E-01 + PKER_RDRYG( 27, 40) = 0.364748E-01 + PKER_RDRYG( 28, 1) = 0.138479E+02 + PKER_RDRYG( 28, 2) = 0.114600E+02 + PKER_RDRYG( 28, 3) = 0.948316E+01 + PKER_RDRYG( 28, 4) = 0.784664E+01 + PKER_RDRYG( 28, 5) = 0.649184E+01 + PKER_RDRYG( 28, 6) = 0.537025E+01 + PKER_RDRYG( 28, 7) = 0.444173E+01 + PKER_RDRYG( 28, 8) = 0.367304E+01 + PKER_RDRYG( 28, 9) = 0.303665E+01 + PKER_RDRYG( 28, 10) = 0.250979E+01 + PKER_RDRYG( 28, 11) = 0.207361E+01 + PKER_RDRYG( 28, 12) = 0.171248E+01 + PKER_RDRYG( 28, 13) = 0.141349E+01 + PKER_RDRYG( 28, 14) = 0.116593E+01 + PKER_RDRYG( 28, 15) = 0.960947E+00 + PKER_RDRYG( 28, 16) = 0.791203E+00 + PKER_RDRYG( 28, 17) = 0.650625E+00 + PKER_RDRYG( 28, 18) = 0.534185E+00 + PKER_RDRYG( 28, 19) = 0.437719E+00 + PKER_RDRYG( 28, 20) = 0.357777E+00 + PKER_RDRYG( 28, 21) = 0.291501E+00 + PKER_RDRYG( 28, 22) = 0.236523E+00 + PKER_RDRYG( 28, 23) = 0.190884E+00 + PKER_RDRYG( 28, 24) = 0.152959E+00 + PKER_RDRYG( 28, 25) = 0.121415E+00 + PKER_RDRYG( 28, 26) = 0.951696E-01 + PKER_RDRYG( 28, 27) = 0.733827E-01 + PKER_RDRYG( 28, 28) = 0.554501E-01 + PKER_RDRYG( 28, 29) = 0.410159E-01 + PKER_RDRYG( 28, 30) = 0.299322E-01 + PKER_RDRYG( 28, 31) = 0.221290E-01 + PKER_RDRYG( 28, 32) = 0.174911E-01 + PKER_RDRYG( 28, 33) = 0.156662E-01 + PKER_RDRYG( 28, 34) = 0.160216E-01 + PKER_RDRYG( 28, 35) = 0.178216E-01 + PKER_RDRYG( 28, 36) = 0.203456E-01 + PKER_RDRYG( 28, 37) = 0.230543E-01 + PKER_RDRYG( 28, 38) = 0.256182E-01 + PKER_RDRYG( 28, 39) = 0.278812E-01 + PKER_RDRYG( 28, 40) = 0.298004E-01 + PKER_RDRYG( 29, 1) = 0.138512E+02 + PKER_RDRYG( 29, 2) = 0.114633E+02 + PKER_RDRYG( 29, 3) = 0.948650E+01 + PKER_RDRYG( 29, 4) = 0.785000E+01 + PKER_RDRYG( 29, 5) = 0.649522E+01 + PKER_RDRYG( 29, 6) = 0.537366E+01 + PKER_RDRYG( 29, 7) = 0.444516E+01 + PKER_RDRYG( 29, 8) = 0.367649E+01 + PKER_RDRYG( 29, 9) = 0.304013E+01 + PKER_RDRYG( 29, 10) = 0.251330E+01 + PKER_RDRYG( 29, 11) = 0.207714E+01 + PKER_RDRYG( 29, 12) = 0.171605E+01 + PKER_RDRYG( 29, 13) = 0.141709E+01 + PKER_RDRYG( 29, 14) = 0.116957E+01 + PKER_RDRYG( 29, 15) = 0.964632E+00 + PKER_RDRYG( 29, 16) = 0.794935E+00 + PKER_RDRYG( 29, 17) = 0.654412E+00 + PKER_RDRYG( 29, 18) = 0.538034E+00 + PKER_RDRYG( 29, 19) = 0.441637E+00 + PKER_RDRYG( 29, 20) = 0.361775E+00 + PKER_RDRYG( 29, 21) = 0.295592E+00 + PKER_RDRYG( 29, 22) = 0.240721E+00 + PKER_RDRYG( 29, 23) = 0.195203E+00 + PKER_RDRYG( 29, 24) = 0.157413E+00 + PKER_RDRYG( 29, 25) = 0.126010E+00 + PKER_RDRYG( 29, 26) = 0.998897E-01 + PKER_RDRYG( 29, 27) = 0.781613E-01 + PKER_RDRYG( 29, 28) = 0.601349E-01 + PKER_RDRYG( 29, 29) = 0.453296E-01 + PKER_RDRYG( 29, 30) = 0.334668E-01 + PKER_RDRYG( 29, 31) = 0.244241E-01 + PKER_RDRYG( 29, 32) = 0.181733E-01 + PKER_RDRYG( 29, 33) = 0.145718E-01 + PKER_RDRYG( 29, 34) = 0.133001E-01 + PKER_RDRYG( 29, 35) = 0.138127E-01 + PKER_RDRYG( 29, 36) = 0.154662E-01 + PKER_RDRYG( 29, 37) = 0.176729E-01 + PKER_RDRYG( 29, 38) = 0.199915E-01 + PKER_RDRYG( 29, 39) = 0.221631E-01 + PKER_RDRYG( 29, 40) = 0.240688E-01 + PKER_RDRYG( 30, 1) = 0.138540E+02 + PKER_RDRYG( 30, 2) = 0.114661E+02 + PKER_RDRYG( 30, 3) = 0.948934E+01 + PKER_RDRYG( 30, 4) = 0.785286E+01 + PKER_RDRYG( 30, 5) = 0.649809E+01 + PKER_RDRYG( 30, 6) = 0.537654E+01 + PKER_RDRYG( 30, 7) = 0.444806E+01 + PKER_RDRYG( 30, 8) = 0.367941E+01 + PKER_RDRYG( 30, 9) = 0.304307E+01 + PKER_RDRYG( 30, 10) = 0.251626E+01 + PKER_RDRYG( 30, 11) = 0.208013E+01 + PKER_RDRYG( 30, 12) = 0.171906E+01 + PKER_RDRYG( 30, 13) = 0.142013E+01 + PKER_RDRYG( 30, 14) = 0.117264E+01 + PKER_RDRYG( 30, 15) = 0.967730E+00 + PKER_RDRYG( 30, 16) = 0.798070E+00 + PKER_RDRYG( 30, 17) = 0.657587E+00 + PKER_RDRYG( 30, 18) = 0.541254E+00 + PKER_RDRYG( 30, 19) = 0.444909E+00 + PKER_RDRYG( 30, 20) = 0.365106E+00 + PKER_RDRYG( 30, 21) = 0.298991E+00 + PKER_RDRYG( 30, 22) = 0.244198E+00 + PKER_RDRYG( 30, 23) = 0.198769E+00 + PKER_RDRYG( 30, 24) = 0.161082E+00 + PKER_RDRYG( 30, 25) = 0.129793E+00 + PKER_RDRYG( 30, 26) = 0.103790E+00 + PKER_RDRYG( 30, 27) = 0.821610E-01 + PKER_RDRYG( 30, 28) = 0.641734E-01 + PKER_RDRYG( 30, 29) = 0.492644E-01 + PKER_RDRYG( 30, 30) = 0.370449E-01 + PKER_RDRYG( 30, 31) = 0.273020E-01 + PKER_RDRYG( 30, 32) = 0.199464E-01 + PKER_RDRYG( 30, 33) = 0.149418E-01 + PKER_RDRYG( 30, 34) = 0.121711E-01 + PKER_RDRYG( 30, 35) = 0.113170E-01 + PKER_RDRYG( 30, 36) = 0.119183E-01 + PKER_RDRYG( 30, 37) = 0.134237E-01 + PKER_RDRYG( 30, 38) = 0.153458E-01 + PKER_RDRYG( 30, 39) = 0.173290E-01 + PKER_RDRYG( 30, 40) = 0.191677E-01 + PKER_RDRYG( 31, 1) = 0.138564E+02 + PKER_RDRYG( 31, 2) = 0.114685E+02 + PKER_RDRYG( 31, 3) = 0.949175E+01 + PKER_RDRYG( 31, 4) = 0.785528E+01 + PKER_RDRYG( 31, 5) = 0.650052E+01 + PKER_RDRYG( 31, 6) = 0.537899E+01 + PKER_RDRYG( 31, 7) = 0.445052E+01 + PKER_RDRYG( 31, 8) = 0.368188E+01 + PKER_RDRYG( 31, 9) = 0.304556E+01 + PKER_RDRYG( 31, 10) = 0.251877E+01 + PKER_RDRYG( 31, 11) = 0.208265E+01 + PKER_RDRYG( 31, 12) = 0.172160E+01 + PKER_RDRYG( 31, 13) = 0.142269E+01 + PKER_RDRYG( 31, 14) = 0.117522E+01 + PKER_RDRYG( 31, 15) = 0.970340E+00 + PKER_RDRYG( 31, 16) = 0.800707E+00 + PKER_RDRYG( 31, 17) = 0.660255E+00 + PKER_RDRYG( 31, 18) = 0.543956E+00 + PKER_RDRYG( 31, 19) = 0.447649E+00 + PKER_RDRYG( 31, 20) = 0.367889E+00 + PKER_RDRYG( 31, 21) = 0.301823E+00 + PKER_RDRYG( 31, 22) = 0.247087E+00 + PKER_RDRYG( 31, 23) = 0.201725E+00 + PKER_RDRYG( 31, 24) = 0.164114E+00 + PKER_RDRYG( 31, 25) = 0.132910E+00 + PKER_RDRYG( 31, 26) = 0.107003E+00 + PKER_RDRYG( 31, 27) = 0.854709E-01 + PKER_RDRYG( 31, 28) = 0.675620E-01 + PKER_RDRYG( 31, 29) = 0.526723E-01 + PKER_RDRYG( 31, 30) = 0.403428E-01 + PKER_RDRYG( 31, 31) = 0.302637E-01 + PKER_RDRYG( 31, 32) = 0.222653E-01 + PKER_RDRYG( 31, 33) = 0.162939E-01 + PKER_RDRYG( 31, 34) = 0.123058E-01 + PKER_RDRYG( 31, 35) = 0.101795E-01 + PKER_RDRYG( 31, 36) = 0.964983E-02 + PKER_RDRYG( 31, 37) = 0.102948E-01 + PKER_RDRYG( 31, 38) = 0.116552E-01 + PKER_RDRYG( 31, 39) = 0.133239E-01 + PKER_RDRYG( 31, 40) = 0.150165E-01 + PKER_RDRYG( 32, 1) = 0.138584E+02 + PKER_RDRYG( 32, 2) = 0.114706E+02 + PKER_RDRYG( 32, 3) = 0.949379E+01 + PKER_RDRYG( 32, 4) = 0.785733E+01 + PKER_RDRYG( 32, 5) = 0.650259E+01 + PKER_RDRYG( 32, 6) = 0.538106E+01 + PKER_RDRYG( 32, 7) = 0.445260E+01 + PKER_RDRYG( 32, 8) = 0.368398E+01 + PKER_RDRYG( 32, 9) = 0.304766E+01 + PKER_RDRYG( 32, 10) = 0.252089E+01 + PKER_RDRYG( 32, 11) = 0.208479E+01 + PKER_RDRYG( 32, 12) = 0.172375E+01 + PKER_RDRYG( 32, 13) = 0.142486E+01 + PKER_RDRYG( 32, 14) = 0.117741E+01 + PKER_RDRYG( 32, 15) = 0.972542E+00 + PKER_RDRYG( 32, 16) = 0.802930E+00 + PKER_RDRYG( 32, 17) = 0.662499E+00 + PKER_RDRYG( 32, 18) = 0.546226E+00 + PKER_RDRYG( 32, 19) = 0.449948E+00 + PKER_RDRYG( 32, 20) = 0.370220E+00 + PKER_RDRYG( 32, 21) = 0.304190E+00 + PKER_RDRYG( 32, 22) = 0.249496E+00 + PKER_RDRYG( 32, 23) = 0.204181E+00 + PKER_RDRYG( 32, 24) = 0.166626E+00 + PKER_RDRYG( 32, 25) = 0.135487E+00 + PKER_RDRYG( 32, 26) = 0.109652E+00 + PKER_RDRYG( 32, 27) = 0.882004E-01 + PKER_RDRYG( 32, 28) = 0.703714E-01 + PKER_RDRYG( 32, 29) = 0.555429E-01 + PKER_RDRYG( 32, 30) = 0.432184E-01 + PKER_RDRYG( 32, 31) = 0.330257E-01 + PKER_RDRYG( 32, 32) = 0.247158E-01 + PKER_RDRYG( 32, 33) = 0.181591E-01 + PKER_RDRYG( 32, 34) = 0.133191E-01 + PKER_RDRYG( 32, 35) = 0.101524E-01 + PKER_RDRYG( 32, 36) = 0.854593E-02 + PKER_RDRYG( 32, 37) = 0.824929E-02 + PKER_RDRYG( 32, 38) = 0.890385E-02 + PKER_RDRYG( 32, 39) = 0.101193E-01 + PKER_RDRYG( 32, 40) = 0.115645E-01 + PKER_RDRYG( 33, 1) = 0.138601E+02 + PKER_RDRYG( 33, 2) = 0.114723E+02 + PKER_RDRYG( 33, 3) = 0.949553E+01 + PKER_RDRYG( 33, 4) = 0.785908E+01 + PKER_RDRYG( 33, 5) = 0.650434E+01 + PKER_RDRYG( 33, 6) = 0.538282E+01 + PKER_RDRYG( 33, 7) = 0.445437E+01 + PKER_RDRYG( 33, 8) = 0.368576E+01 + PKER_RDRYG( 33, 9) = 0.304945E+01 + PKER_RDRYG( 33, 10) = 0.252268E+01 + PKER_RDRYG( 33, 11) = 0.208659E+01 + PKER_RDRYG( 33, 12) = 0.172557E+01 + PKER_RDRYG( 33, 13) = 0.142669E+01 + PKER_RDRYG( 33, 14) = 0.117925E+01 + PKER_RDRYG( 33, 15) = 0.974401E+00 + PKER_RDRYG( 33, 16) = 0.804805E+00 + PKER_RDRYG( 33, 17) = 0.664392E+00 + PKER_RDRYG( 33, 18) = 0.548137E+00 + PKER_RDRYG( 33, 19) = 0.451880E+00 + PKER_RDRYG( 33, 20) = 0.372176E+00 + PKER_RDRYG( 33, 21) = 0.306173E+00 + PKER_RDRYG( 33, 22) = 0.251510E+00 + PKER_RDRYG( 33, 23) = 0.206230E+00 + PKER_RDRYG( 33, 24) = 0.168715E+00 + PKER_RDRYG( 33, 25) = 0.137623E+00 + PKER_RDRYG( 33, 26) = 0.111843E+00 + PKER_RDRYG( 33, 27) = 0.904523E-01 + PKER_RDRYG( 33, 28) = 0.726902E-01 + PKER_RDRYG( 33, 29) = 0.579273E-01 + PKER_RDRYG( 33, 30) = 0.456499E-01 + PKER_RDRYG( 33, 31) = 0.354504E-01 + PKER_RDRYG( 33, 32) = 0.270255E-01 + PKER_RDRYG( 33, 33) = 0.201789E-01 + PKER_RDRYG( 33, 34) = 0.148159E-01 + PKER_RDRYG( 33, 35) = 0.108951E-01 + PKER_RDRYG( 33, 36) = 0.838982E-02 + PKER_RDRYG( 33, 37) = 0.718623E-02 + PKER_RDRYG( 33, 38) = 0.706271E-02 + PKER_RDRYG( 33, 39) = 0.770543E-02 + PKER_RDRYG( 33, 40) = 0.878717E-02 + PKER_RDRYG( 34, 1) = 0.138616E+02 + PKER_RDRYG( 34, 2) = 0.114738E+02 + PKER_RDRYG( 34, 3) = 0.949701E+01 + PKER_RDRYG( 34, 4) = 0.786056E+01 + PKER_RDRYG( 34, 5) = 0.650583E+01 + PKER_RDRYG( 34, 6) = 0.538432E+01 + PKER_RDRYG( 34, 7) = 0.445588E+01 + PKER_RDRYG( 34, 8) = 0.368726E+01 + PKER_RDRYG( 34, 9) = 0.305097E+01 + PKER_RDRYG( 34, 10) = 0.252421E+01 + PKER_RDRYG( 34, 11) = 0.208813E+01 + PKER_RDRYG( 34, 12) = 0.172711E+01 + PKER_RDRYG( 34, 13) = 0.142824E+01 + PKER_RDRYG( 34, 14) = 0.118081E+01 + PKER_RDRYG( 34, 15) = 0.975973E+00 + PKER_RDRYG( 34, 16) = 0.806389E+00 + PKER_RDRYG( 34, 17) = 0.665989E+00 + PKER_RDRYG( 34, 18) = 0.549748E+00 + PKER_RDRYG( 34, 19) = 0.453507E+00 + PKER_RDRYG( 34, 20) = 0.373821E+00 + PKER_RDRYG( 34, 21) = 0.307838E+00 + PKER_RDRYG( 34, 22) = 0.253197E+00 + PKER_RDRYG( 34, 23) = 0.207944E+00 + PKER_RDRYG( 34, 24) = 0.170458E+00 + PKER_RDRYG( 34, 25) = 0.139400E+00 + PKER_RDRYG( 34, 26) = 0.113659E+00 + PKER_RDRYG( 34, 27) = 0.923147E-01 + PKER_RDRYG( 34, 28) = 0.746045E-01 + PKER_RDRYG( 34, 29) = 0.598974E-01 + PKER_RDRYG( 34, 30) = 0.476733E-01 + PKER_RDRYG( 34, 31) = 0.375085E-01 + PKER_RDRYG( 34, 32) = 0.290687E-01 + PKER_RDRYG( 34, 33) = 0.221077E-01 + PKER_RDRYG( 34, 34) = 0.164706E-01 + PKER_RDRYG( 34, 35) = 0.120829E-01 + PKER_RDRYG( 34, 36) = 0.891924E-02 + PKER_RDRYG( 34, 37) = 0.694498E-02 + PKER_RDRYG( 34, 38) = 0.605978E-02 + PKER_RDRYG( 34, 39) = 0.605815E-02 + PKER_RDRYG( 34, 40) = 0.667329E-02 + PKER_RDRYG( 35, 1) = 0.138628E+02 + PKER_RDRYG( 35, 2) = 0.114750E+02 + PKER_RDRYG( 35, 3) = 0.949827E+01 + PKER_RDRYG( 35, 4) = 0.786182E+01 + PKER_RDRYG( 35, 5) = 0.650709E+01 + PKER_RDRYG( 35, 6) = 0.538559E+01 + PKER_RDRYG( 35, 7) = 0.445715E+01 + PKER_RDRYG( 35, 8) = 0.368855E+01 + PKER_RDRYG( 35, 9) = 0.305226E+01 + PKER_RDRYG( 35, 10) = 0.252550E+01 + PKER_RDRYG( 35, 11) = 0.208943E+01 + PKER_RDRYG( 35, 12) = 0.172842E+01 + PKER_RDRYG( 35, 13) = 0.142955E+01 + PKER_RDRYG( 35, 14) = 0.118213E+01 + PKER_RDRYG( 35, 15) = 0.977304E+00 + PKER_RDRYG( 35, 16) = 0.807728E+00 + PKER_RDRYG( 35, 17) = 0.667338E+00 + PKER_RDRYG( 35, 18) = 0.551109E+00 + PKER_RDRYG( 35, 19) = 0.454880E+00 + PKER_RDRYG( 35, 20) = 0.375207E+00 + PKER_RDRYG( 35, 21) = 0.309239E+00 + PKER_RDRYG( 35, 22) = 0.254615E+00 + PKER_RDRYG( 35, 23) = 0.209380E+00 + PKER_RDRYG( 35, 24) = 0.171916E+00 + PKER_RDRYG( 35, 25) = 0.140883E+00 + PKER_RDRYG( 35, 26) = 0.115171E+00 + PKER_RDRYG( 35, 27) = 0.938600E-01 + PKER_RDRYG( 35, 28) = 0.761883E-01 + PKER_RDRYG( 35, 29) = 0.615248E-01 + PKER_RDRYG( 35, 30) = 0.493472E-01 + PKER_RDRYG( 35, 31) = 0.392256E-01 + PKER_RDRYG( 35, 32) = 0.308103E-01 + PKER_RDRYG( 35, 33) = 0.238270E-01 + PKER_RDRYG( 35, 34) = 0.180779E-01 + PKER_RDRYG( 35, 35) = 0.134407E-01 + PKER_RDRYG( 35, 36) = 0.985642E-02 + PKER_RDRYG( 35, 37) = 0.730986E-02 + PKER_RDRYG( 35, 38) = 0.576437E-02 + PKER_RDRYG( 35, 39) = 0.512255E-02 + PKER_RDRYG( 35, 40) = 0.520497E-02 + PKER_RDRYG( 36, 1) = 0.138639E+02 + PKER_RDRYG( 36, 2) = 0.114761E+02 + PKER_RDRYG( 36, 3) = 0.949934E+01 + PKER_RDRYG( 36, 4) = 0.786289E+01 + PKER_RDRYG( 36, 5) = 0.650817E+01 + PKER_RDRYG( 36, 6) = 0.538667E+01 + PKER_RDRYG( 36, 7) = 0.445824E+01 + PKER_RDRYG( 36, 8) = 0.368964E+01 + PKER_RDRYG( 36, 9) = 0.305335E+01 + PKER_RDRYG( 36, 10) = 0.252660E+01 + PKER_RDRYG( 36, 11) = 0.209053E+01 + PKER_RDRYG( 36, 12) = 0.172953E+01 + PKER_RDRYG( 36, 13) = 0.143067E+01 + PKER_RDRYG( 36, 14) = 0.118326E+01 + PKER_RDRYG( 36, 15) = 0.978431E+00 + PKER_RDRYG( 36, 16) = 0.808862E+00 + PKER_RDRYG( 36, 17) = 0.668480E+00 + PKER_RDRYG( 36, 18) = 0.552259E+00 + PKER_RDRYG( 36, 19) = 0.456039E+00 + PKER_RDRYG( 36, 20) = 0.376376E+00 + PKER_RDRYG( 36, 21) = 0.310419E+00 + PKER_RDRYG( 36, 22) = 0.255807E+00 + PKER_RDRYG( 36, 23) = 0.210587E+00 + PKER_RDRYG( 36, 24) = 0.173139E+00 + PKER_RDRYG( 36, 25) = 0.142124E+00 + PKER_RDRYG( 36, 26) = 0.116433E+00 + PKER_RDRYG( 36, 27) = 0.951462E-01 + PKER_RDRYG( 36, 28) = 0.775028E-01 + PKER_RDRYG( 36, 29) = 0.628718E-01 + PKER_RDRYG( 36, 30) = 0.507309E-01 + PKER_RDRYG( 36, 31) = 0.406479E-01 + PKER_RDRYG( 36, 32) = 0.322672E-01 + PKER_RDRYG( 36, 33) = 0.253008E-01 + PKER_RDRYG( 36, 34) = 0.195243E-01 + PKER_RDRYG( 36, 35) = 0.147772E-01 + PKER_RDRYG( 36, 36) = 0.109648E-01 + PKER_RDRYG( 36, 37) = 0.804278E-02 + PKER_RDRYG( 36, 38) = 0.599708E-02 + PKER_RDRYG( 36, 39) = 0.479430E-02 + PKER_RDRYG( 36, 40) = 0.433950E-02 + PKER_RDRYG( 37, 1) = 0.138648E+02 + PKER_RDRYG( 37, 2) = 0.114770E+02 + PKER_RDRYG( 37, 3) = 0.950025E+01 + PKER_RDRYG( 37, 4) = 0.786381E+01 + PKER_RDRYG( 37, 5) = 0.650909E+01 + PKER_RDRYG( 37, 6) = 0.538759E+01 + PKER_RDRYG( 37, 7) = 0.445916E+01 + PKER_RDRYG( 37, 8) = 0.369056E+01 + PKER_RDRYG( 37, 9) = 0.305428E+01 + PKER_RDRYG( 37, 10) = 0.252753E+01 + PKER_RDRYG( 37, 11) = 0.209147E+01 + PKER_RDRYG( 37, 12) = 0.173047E+01 + PKER_RDRYG( 37, 13) = 0.143161E+01 + PKER_RDRYG( 37, 14) = 0.118421E+01 + PKER_RDRYG( 37, 15) = 0.979386E+00 + PKER_RDRYG( 37, 16) = 0.809823E+00 + PKER_RDRYG( 37, 17) = 0.669447E+00 + PKER_RDRYG( 37, 18) = 0.553232E+00 + PKER_RDRYG( 37, 19) = 0.457019E+00 + PKER_RDRYG( 37, 20) = 0.377364E+00 + PKER_RDRYG( 37, 21) = 0.311415E+00 + PKER_RDRYG( 37, 22) = 0.256813E+00 + PKER_RDRYG( 37, 23) = 0.211602E+00 + PKER_RDRYG( 37, 24) = 0.174166E+00 + PKER_RDRYG( 37, 25) = 0.143165E+00 + PKER_RDRYG( 37, 26) = 0.117489E+00 + PKER_RDRYG( 37, 27) = 0.962203E-01 + PKER_RDRYG( 37, 28) = 0.785973E-01 + PKER_RDRYG( 37, 29) = 0.639902E-01 + PKER_RDRYG( 37, 30) = 0.518768E-01 + PKER_RDRYG( 37, 31) = 0.418245E-01 + PKER_RDRYG( 37, 32) = 0.334758E-01 + PKER_RDRYG( 37, 33) = 0.265367E-01 + PKER_RDRYG( 37, 34) = 0.207701E-01 + PKER_RDRYG( 37, 35) = 0.159926E-01 + PKER_RDRYG( 37, 36) = 0.120751E-01 + PKER_RDRYG( 37, 37) = 0.894122E-02 + PKER_RDRYG( 37, 38) = 0.656445E-02 + PKER_RDRYG( 37, 39) = 0.492634E-02 + PKER_RDRYG( 37, 40) = 0.399357E-02 + PKER_RDRYG( 38, 1) = 0.138656E+02 + PKER_RDRYG( 38, 2) = 0.114778E+02 + PKER_RDRYG( 38, 3) = 0.950102E+01 + PKER_RDRYG( 38, 4) = 0.786459E+01 + PKER_RDRYG( 38, 5) = 0.650987E+01 + PKER_RDRYG( 38, 6) = 0.538837E+01 + PKER_RDRYG( 38, 7) = 0.445994E+01 + PKER_RDRYG( 38, 8) = 0.369135E+01 + PKER_RDRYG( 38, 9) = 0.305507E+01 + PKER_RDRYG( 38, 10) = 0.252833E+01 + PKER_RDRYG( 38, 11) = 0.209226E+01 + PKER_RDRYG( 38, 12) = 0.173127E+01 + PKER_RDRYG( 38, 13) = 0.143242E+01 + PKER_RDRYG( 38, 14) = 0.118501E+01 + PKER_RDRYG( 38, 15) = 0.980197E+00 + PKER_RDRYG( 38, 16) = 0.810638E+00 + PKER_RDRYG( 38, 17) = 0.670266E+00 + PKER_RDRYG( 38, 18) = 0.554056E+00 + PKER_RDRYG( 38, 19) = 0.457849E+00 + PKER_RDRYG( 38, 20) = 0.378199E+00 + PKER_RDRYG( 38, 21) = 0.312257E+00 + PKER_RDRYG( 38, 22) = 0.257661E+00 + PKER_RDRYG( 38, 23) = 0.212459E+00 + PKER_RDRYG( 38, 24) = 0.175032E+00 + PKER_RDRYG( 38, 25) = 0.144040E+00 + PKER_RDRYG( 38, 26) = 0.118376E+00 + PKER_RDRYG( 38, 27) = 0.971196E-01 + PKER_RDRYG( 38, 28) = 0.795116E-01 + PKER_RDRYG( 38, 29) = 0.649218E-01 + PKER_RDRYG( 38, 30) = 0.528285E-01 + PKER_RDRYG( 38, 31) = 0.427994E-01 + PKER_RDRYG( 38, 32) = 0.344764E-01 + PKER_RDRYG( 38, 33) = 0.275637E-01 + PKER_RDRYG( 38, 34) = 0.218184E-01 + PKER_RDRYG( 38, 35) = 0.170452E-01 + PKER_RDRYG( 38, 36) = 0.130949E-01 + PKER_RDRYG( 38, 37) = 0.986356E-02 + PKER_RDRYG( 38, 38) = 0.729306E-02 + PKER_RDRYG( 38, 39) = 0.536046E-02 + PKER_RDRYG( 38, 40) = 0.405286E-02 + PKER_RDRYG( 39, 1) = 0.138662E+02 + PKER_RDRYG( 39, 2) = 0.114784E+02 + PKER_RDRYG( 39, 3) = 0.950168E+01 + PKER_RDRYG( 39, 4) = 0.786525E+01 + PKER_RDRYG( 39, 5) = 0.651053E+01 + PKER_RDRYG( 39, 6) = 0.538904E+01 + PKER_RDRYG( 39, 7) = 0.446061E+01 + PKER_RDRYG( 39, 8) = 0.369202E+01 + PKER_RDRYG( 39, 9) = 0.305574E+01 + PKER_RDRYG( 39, 10) = 0.252900E+01 + PKER_RDRYG( 39, 11) = 0.209294E+01 + PKER_RDRYG( 39, 12) = 0.173195E+01 + PKER_RDRYG( 39, 13) = 0.143310E+01 + PKER_RDRYG( 39, 14) = 0.118570E+01 + PKER_RDRYG( 39, 15) = 0.980885E+00 + PKER_RDRYG( 39, 16) = 0.811330E+00 + PKER_RDRYG( 39, 17) = 0.670961E+00 + PKER_RDRYG( 39, 18) = 0.554755E+00 + PKER_RDRYG( 39, 19) = 0.458552E+00 + PKER_RDRYG( 39, 20) = 0.378906E+00 + PKER_RDRYG( 39, 21) = 0.312969E+00 + PKER_RDRYG( 39, 22) = 0.258379E+00 + PKER_RDRYG( 39, 23) = 0.213182E+00 + PKER_RDRYG( 39, 24) = 0.175762E+00 + PKER_RDRYG( 39, 25) = 0.144777E+00 + PKER_RDRYG( 39, 26) = 0.119121E+00 + PKER_RDRYG( 39, 27) = 0.978744E-01 + PKER_RDRYG( 39, 28) = 0.802773E-01 + PKER_RDRYG( 39, 29) = 0.657001E-01 + PKER_RDRYG( 39, 30) = 0.536215E-01 + PKER_RDRYG( 39, 31) = 0.436093E-01 + PKER_RDRYG( 39, 32) = 0.353058E-01 + PKER_RDRYG( 39, 33) = 0.284146E-01 + PKER_RDRYG( 39, 34) = 0.226909E-01 + PKER_RDRYG( 39, 35) = 0.179343E-01 + PKER_RDRYG( 39, 36) = 0.139841E-01 + PKER_RDRYG( 39, 37) = 0.107183E-01 + PKER_RDRYG( 39, 38) = 0.805446E-02 + PKER_RDRYG( 39, 39) = 0.594845E-02 + PKER_RDRYG( 39, 40) = 0.437943E-02 + PKER_RDRYG( 40, 1) = 0.138668E+02 + PKER_RDRYG( 40, 2) = 0.114790E+02 + PKER_RDRYG( 40, 3) = 0.950225E+01 + PKER_RDRYG( 40, 4) = 0.786581E+01 + PKER_RDRYG( 40, 5) = 0.651110E+01 + PKER_RDRYG( 40, 6) = 0.538960E+01 + PKER_RDRYG( 40, 7) = 0.446118E+01 + PKER_RDRYG( 40, 8) = 0.369259E+01 + PKER_RDRYG( 40, 9) = 0.305631E+01 + PKER_RDRYG( 40, 10) = 0.252958E+01 + PKER_RDRYG( 40, 11) = 0.209352E+01 + PKER_RDRYG( 40, 12) = 0.173253E+01 + PKER_RDRYG( 40, 13) = 0.143368E+01 + PKER_RDRYG( 40, 14) = 0.118628E+01 + PKER_RDRYG( 40, 15) = 0.981470E+00 + PKER_RDRYG( 40, 16) = 0.811917E+00 + PKER_RDRYG( 40, 17) = 0.671551E+00 + PKER_RDRYG( 40, 18) = 0.555348E+00 + PKER_RDRYG( 40, 19) = 0.459148E+00 + PKER_RDRYG( 40, 20) = 0.379506E+00 + PKER_RDRYG( 40, 21) = 0.313572E+00 + PKER_RDRYG( 40, 22) = 0.258986E+00 + PKER_RDRYG( 40, 23) = 0.213794E+00 + PKER_RDRYG( 40, 24) = 0.176378E+00 + PKER_RDRYG( 40, 25) = 0.145399E+00 + PKER_RDRYG( 40, 26) = 0.119749E+00 + PKER_RDRYG( 40, 27) = 0.985094E-01 + PKER_RDRYG( 40, 28) = 0.809202E-01 + PKER_RDRYG( 40, 29) = 0.663522E-01 + PKER_RDRYG( 40, 30) = 0.542842E-01 + PKER_RDRYG( 40, 31) = 0.442844E-01 + PKER_RDRYG( 40, 32) = 0.359952E-01 + PKER_RDRYG( 40, 33) = 0.291205E-01 + PKER_RDRYG( 40, 34) = 0.234148E-01 + PKER_RDRYG( 40, 35) = 0.186756E-01 + PKER_RDRYG( 40, 36) = 0.147376E-01 + PKER_RDRYG( 40, 37) = 0.114686E-01 + PKER_RDRYG( 40, 38) = 0.876977E-02 + PKER_RDRYG( 40, 39) = 0.657521E-02 + PKER_RDRYG( 40, 40) = 0.484891E-02 +END IF +! +END SUBROUTINE READ_XKER_RDRYG diff --git a/src/mesonh/micro/read_xker_rweth.f90 b/src/mesonh/micro/read_xker_rweth.f90 new file mode 100644 index 000000000..8093eeb0d --- /dev/null +++ b/src/mesonh/micro/read_xker_rweth.f90 @@ -0,0 +1,1733 @@ +!MNH_LIC Copyright 1994-2018 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +! ######spl + MODULE MODI_READ_XKER_RWETH +! ########################### +! +INTERFACE + SUBROUTINE READ_XKER_RWETH (KWETLBDAH,KWETLBDAR,KND, & + PALPHAH,PNUH,PALPHAR,PNUR,PEHR,PBR,PCH,PDH,PCR,PDR, & + PWETLBDAH_MAX,PWETLBDAR_MAX,PWETLBDAH_MIN,PWETLBDAR_MIN, & + PFDINFTY,PKER_RWETH ) +! +IMPLICIT NONE +INTEGER, INTENT(OUT) :: KND,KWETLBDAH,KWETLBDAR +REAL, INTENT(OUT) :: PALPHAH +REAL, INTENT(OUT) :: PNUH +REAL, INTENT(OUT) :: PALPHAR +REAL, INTENT(OUT) :: PNUR +REAL, INTENT(OUT) :: PEHR +REAL, INTENT(OUT) :: PBR +REAL, INTENT(OUT) :: PCH +REAL, INTENT(OUT) :: PDH +REAL, INTENT(OUT) :: PCR +REAL, INTENT(OUT) :: PDR +REAL, INTENT(OUT) :: PWETLBDAH_MAX +REAL, INTENT(OUT) :: PWETLBDAR_MAX +REAL, INTENT(OUT) :: PWETLBDAH_MIN +REAL, INTENT(OUT) :: PWETLBDAR_MIN +REAL, INTENT(OUT) :: PFDINFTY +REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PKER_RWETH +! +END SUBROUTINE +! +END INTERFACE +! +END MODULE MODI_READ_XKER_RWETH +! ######spl + SUBROUTINE READ_XKER_RWETH (KWETLBDAH,KWETLBDAR,KND, & + PALPHAH,PNUH,PALPHAR,PNUR,PEHR,PBR,PCH,PDH,PCR,PDR, & + PWETLBDAH_MAX,PWETLBDAR_MAX,PWETLBDAH_MIN,PWETLBDAR_MIN, & + PFDINFTY,PKER_RWETH ) +!DEC$ OPTIMIZE:0 +! ######################################################################## +! +!!**** * * - initialize the kernels for the rain-hail wet growth process +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to initialize the kernels PKER_RWETH +!! prepared from a previous run of the routine INI_RAIN_ICE. The reading of +!! the kernels is optional after checking for the dimensions of the arrays. +!! +!!** METHOD +!! ------ +!! +!! +!! EXTERNAL +!! -------- +!! None +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! Book2 of documentation ( routine READ_XKER_RWETH ) +!! +!! AUTHOR +!! ------ +!! S. Riette +!! +!! MODIFICATIONS +!! ------------- +!! Original 6 Mar 2015 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +!* 0.2 Declarations of local variables : +! +! +IMPLICIT NONE +INTEGER, INTENT(OUT) :: KND,KWETLBDAH,KWETLBDAR +REAL, INTENT(OUT) :: PALPHAH +REAL, INTENT(OUT) :: PNUH +REAL, INTENT(OUT) :: PALPHAR +REAL, INTENT(OUT) :: PNUR +REAL, INTENT(OUT) :: PEHR +REAL, INTENT(OUT) :: PBR +REAL, INTENT(OUT) :: PCH +REAL, INTENT(OUT) :: PDH +REAL, INTENT(OUT) :: PCR +REAL, INTENT(OUT) :: PDR +REAL, INTENT(OUT) :: PWETLBDAH_MAX +REAL, INTENT(OUT) :: PWETLBDAR_MAX +REAL, INTENT(OUT) :: PWETLBDAH_MIN +REAL, INTENT(OUT) :: PWETLBDAR_MIN +REAL, INTENT(OUT) :: PFDINFTY +REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PKER_RWETH +! +! ################################################################### +! #INSERT HERE THE OUTPUT OF INI_RAIN_ICE IF THE KERNELS ARE UPDATED# +! ################################################################### +! +KND= 50 +KWETLBDAH= 40 +KWETLBDAR= 40 +PALPHAH= 0.100000E+01 +PNUH= 0.800000E+01 +PALPHAR= 0.100000E+01 +PNUR= 0.100000E+01 +PEHR= 0.100000E+01 +PBR= 0.300000E+01 +PCH= 0.207000E+03 +PDH= 0.640000E+00 +PCR= 0.842000E+03 +PDR= 0.800000E+00 +PWETLBDAH_MAX= 0.100000E+08 +PWETLBDAR_MAX= 0.100000E+08 +PWETLBDAH_MIN= 0.100000E+04 +PWETLBDAR_MIN= 0.100000E+04 +PFDINFTY= 0.200000E+02 +! +IF( PRESENT(PKER_RWETH) ) THEN + PKER_RWETH( 1, 1) = 0.402762E+01 + PKER_RWETH( 1, 2) = 0.360940E+01 + PKER_RWETH( 1, 3) = 0.394235E+01 + PKER_RWETH( 1, 4) = 0.470822E+01 + PKER_RWETH( 1, 5) = 0.561595E+01 + PKER_RWETH( 1, 6) = 0.648059E+01 + PKER_RWETH( 1, 7) = 0.722764E+01 + PKER_RWETH( 1, 8) = 0.784765E+01 + PKER_RWETH( 1, 9) = 0.835593E+01 + PKER_RWETH( 1, 10) = 0.877187E+01 + PKER_RWETH( 1, 11) = 0.911259E+01 + PKER_RWETH( 1, 12) = 0.939210E+01 + PKER_RWETH( 1, 13) = 0.962170E+01 + PKER_RWETH( 1, 14) = 0.981053E+01 + PKER_RWETH( 1, 15) = 0.996598E+01 + PKER_RWETH( 1, 16) = 0.100940E+02 + PKER_RWETH( 1, 17) = 0.101996E+02 + PKER_RWETH( 1, 18) = 0.102867E+02 + PKER_RWETH( 1, 19) = 0.103586E+02 + PKER_RWETH( 1, 20) = 0.104179E+02 + PKER_RWETH( 1, 21) = 0.104669E+02 + PKER_RWETH( 1, 22) = 0.105074E+02 + PKER_RWETH( 1, 23) = 0.105409E+02 + PKER_RWETH( 1, 24) = 0.105685E+02 + PKER_RWETH( 1, 25) = 0.105914E+02 + PKER_RWETH( 1, 26) = 0.106103E+02 + PKER_RWETH( 1, 27) = 0.106259E+02 + PKER_RWETH( 1, 28) = 0.106388E+02 + PKER_RWETH( 1, 29) = 0.106494E+02 + PKER_RWETH( 1, 30) = 0.106583E+02 + PKER_RWETH( 1, 31) = 0.106656E+02 + PKER_RWETH( 1, 32) = 0.106716E+02 + PKER_RWETH( 1, 33) = 0.106766E+02 + PKER_RWETH( 1, 34) = 0.106807E+02 + PKER_RWETH( 1, 35) = 0.106842E+02 + PKER_RWETH( 1, 36) = 0.106870E+02 + PKER_RWETH( 1, 37) = 0.106893E+02 + PKER_RWETH( 1, 38) = 0.106913E+02 + PKER_RWETH( 1, 39) = 0.106929E+02 + PKER_RWETH( 1, 40) = 0.106942E+02 + PKER_RWETH( 2, 1) = 0.438807E+01 + PKER_RWETH( 2, 2) = 0.333752E+01 + PKER_RWETH( 2, 3) = 0.311028E+01 + PKER_RWETH( 2, 4) = 0.348499E+01 + PKER_RWETH( 2, 5) = 0.418314E+01 + PKER_RWETH( 2, 6) = 0.496720E+01 + PKER_RWETH( 2, 7) = 0.569617E+01 + PKER_RWETH( 2, 8) = 0.631912E+01 + PKER_RWETH( 2, 9) = 0.683403E+01 + PKER_RWETH( 2, 10) = 0.725566E+01 + PKER_RWETH( 2, 11) = 0.760059E+01 + PKER_RWETH( 2, 12) = 0.788312E+01 + PKER_RWETH( 2, 13) = 0.811488E+01 + PKER_RWETH( 2, 14) = 0.830526E+01 + PKER_RWETH( 2, 15) = 0.846182E+01 + PKER_RWETH( 2, 16) = 0.859069E+01 + PKER_RWETH( 2, 17) = 0.869686E+01 + PKER_RWETH( 2, 18) = 0.878439E+01 + PKER_RWETH( 2, 19) = 0.885658E+01 + PKER_RWETH( 2, 20) = 0.891616E+01 + PKER_RWETH( 2, 21) = 0.896534E+01 + PKER_RWETH( 2, 22) = 0.900596E+01 + PKER_RWETH( 2, 23) = 0.903951E+01 + PKER_RWETH( 2, 24) = 0.906722E+01 + PKER_RWETH( 2, 25) = 0.909013E+01 + PKER_RWETH( 2, 26) = 0.910906E+01 + PKER_RWETH( 2, 27) = 0.912471E+01 + PKER_RWETH( 2, 28) = 0.913765E+01 + PKER_RWETH( 2, 29) = 0.914834E+01 + PKER_RWETH( 2, 30) = 0.915719E+01 + PKER_RWETH( 2, 31) = 0.916450E+01 + PKER_RWETH( 2, 32) = 0.917055E+01 + PKER_RWETH( 2, 33) = 0.917555E+01 + PKER_RWETH( 2, 34) = 0.917969E+01 + PKER_RWETH( 2, 35) = 0.918311E+01 + PKER_RWETH( 2, 36) = 0.918594E+01 + PKER_RWETH( 2, 37) = 0.918828E+01 + PKER_RWETH( 2, 38) = 0.919022E+01 + PKER_RWETH( 2, 39) = 0.919182E+01 + PKER_RWETH( 2, 40) = 0.919315E+01 + PKER_RWETH( 3, 1) = 0.511774E+01 + PKER_RWETH( 3, 2) = 0.355317E+01 + PKER_RWETH( 3, 3) = 0.278395E+01 + PKER_RWETH( 3, 4) = 0.269701E+01 + PKER_RWETH( 3, 5) = 0.308711E+01 + PKER_RWETH( 3, 6) = 0.371510E+01 + PKER_RWETH( 3, 7) = 0.438830E+01 + PKER_RWETH( 3, 8) = 0.500120E+01 + PKER_RWETH( 3, 9) = 0.552011E+01 + PKER_RWETH( 3, 10) = 0.594762E+01 + PKER_RWETH( 3, 11) = 0.629736E+01 + PKER_RWETH( 3, 12) = 0.658342E+01 + PKER_RWETH( 3, 13) = 0.681772E+01 + PKER_RWETH( 3, 14) = 0.700990E+01 + PKER_RWETH( 3, 15) = 0.716776E+01 + PKER_RWETH( 3, 16) = 0.729757E+01 + PKER_RWETH( 3, 17) = 0.740442E+01 + PKER_RWETH( 3, 18) = 0.749244E+01 + PKER_RWETH( 3, 19) = 0.756500E+01 + PKER_RWETH( 3, 20) = 0.762484E+01 + PKER_RWETH( 3, 21) = 0.767423E+01 + PKER_RWETH( 3, 22) = 0.771499E+01 + PKER_RWETH( 3, 23) = 0.774866E+01 + PKER_RWETH( 3, 24) = 0.777646E+01 + PKER_RWETH( 3, 25) = 0.779943E+01 + PKER_RWETH( 3, 26) = 0.781841E+01 + PKER_RWETH( 3, 27) = 0.783410E+01 + PKER_RWETH( 3, 28) = 0.784707E+01 + PKER_RWETH( 3, 29) = 0.785779E+01 + PKER_RWETH( 3, 30) = 0.786665E+01 + PKER_RWETH( 3, 31) = 0.787398E+01 + PKER_RWETH( 3, 32) = 0.788004E+01 + PKER_RWETH( 3, 33) = 0.788505E+01 + PKER_RWETH( 3, 34) = 0.788919E+01 + PKER_RWETH( 3, 35) = 0.789262E+01 + PKER_RWETH( 3, 36) = 0.789545E+01 + PKER_RWETH( 3, 37) = 0.789780E+01 + PKER_RWETH( 3, 38) = 0.789974E+01 + PKER_RWETH( 3, 39) = 0.790134E+01 + PKER_RWETH( 3, 40) = 0.790267E+01 + PKER_RWETH( 4, 1) = 0.603974E+01 + PKER_RWETH( 4, 2) = 0.410879E+01 + PKER_RWETH( 4, 3) = 0.288715E+01 + PKER_RWETH( 4, 4) = 0.233851E+01 + PKER_RWETH( 4, 5) = 0.235142E+01 + PKER_RWETH( 4, 6) = 0.273888E+01 + PKER_RWETH( 4, 7) = 0.329704E+01 + PKER_RWETH( 4, 8) = 0.387228E+01 + PKER_RWETH( 4, 9) = 0.438639E+01 + PKER_RWETH( 4, 10) = 0.481827E+01 + PKER_RWETH( 4, 11) = 0.517314E+01 + PKER_RWETH( 4, 12) = 0.546325E+01 + PKER_RWETH( 4, 13) = 0.570050E+01 + PKER_RWETH( 4, 14) = 0.589481E+01 + PKER_RWETH( 4, 15) = 0.605418E+01 + PKER_RWETH( 4, 16) = 0.618508E+01 + PKER_RWETH( 4, 17) = 0.629272E+01 + PKER_RWETH( 4, 18) = 0.638131E+01 + PKER_RWETH( 4, 19) = 0.645429E+01 + PKER_RWETH( 4, 20) = 0.651445E+01 + PKER_RWETH( 4, 21) = 0.656406E+01 + PKER_RWETH( 4, 22) = 0.660500E+01 + PKER_RWETH( 4, 23) = 0.663879E+01 + PKER_RWETH( 4, 24) = 0.666669E+01 + PKER_RWETH( 4, 25) = 0.668973E+01 + PKER_RWETH( 4, 26) = 0.670877E+01 + PKER_RWETH( 4, 27) = 0.672450E+01 + PKER_RWETH( 4, 28) = 0.673750E+01 + PKER_RWETH( 4, 29) = 0.674825E+01 + PKER_RWETH( 4, 30) = 0.675713E+01 + PKER_RWETH( 4, 31) = 0.676447E+01 + PKER_RWETH( 4, 32) = 0.677054E+01 + PKER_RWETH( 4, 33) = 0.677556E+01 + PKER_RWETH( 4, 34) = 0.677972E+01 + PKER_RWETH( 4, 35) = 0.678315E+01 + PKER_RWETH( 4, 36) = 0.678599E+01 + PKER_RWETH( 4, 37) = 0.678834E+01 + PKER_RWETH( 4, 38) = 0.679028E+01 + PKER_RWETH( 4, 39) = 0.679189E+01 + PKER_RWETH( 4, 40) = 0.679321E+01 + PKER_RWETH( 5, 1) = 0.701523E+01 + PKER_RWETH( 5, 2) = 0.485290E+01 + PKER_RWETH( 5, 3) = 0.330114E+01 + PKER_RWETH( 5, 4) = 0.235568E+01 + PKER_RWETH( 5, 5) = 0.197832E+01 + PKER_RWETH( 5, 6) = 0.205971E+01 + PKER_RWETH( 5, 7) = 0.243216E+01 + PKER_RWETH( 5, 8) = 0.292372E+01 + PKER_RWETH( 5, 9) = 0.341291E+01 + PKER_RWETH( 5, 10) = 0.384329E+01 + PKER_RWETH( 5, 11) = 0.420248E+01 + PKER_RWETH( 5, 12) = 0.449701E+01 + PKER_RWETH( 5, 13) = 0.473767E+01 + PKER_RWETH( 5, 14) = 0.493445E+01 + PKER_RWETH( 5, 15) = 0.509560E+01 + PKER_RWETH( 5, 16) = 0.522777E+01 + PKER_RWETH( 5, 17) = 0.533633E+01 + PKER_RWETH( 5, 18) = 0.542559E+01 + PKER_RWETH( 5, 19) = 0.549905E+01 + PKER_RWETH( 5, 20) = 0.555956E+01 + PKER_RWETH( 5, 21) = 0.560943E+01 + PKER_RWETH( 5, 22) = 0.565056E+01 + PKER_RWETH( 5, 23) = 0.568450E+01 + PKER_RWETH( 5, 24) = 0.571251E+01 + PKER_RWETH( 5, 25) = 0.573564E+01 + PKER_RWETH( 5, 26) = 0.575474E+01 + PKER_RWETH( 5, 27) = 0.577052E+01 + PKER_RWETH( 5, 28) = 0.578355E+01 + PKER_RWETH( 5, 29) = 0.579433E+01 + PKER_RWETH( 5, 30) = 0.580323E+01 + PKER_RWETH( 5, 31) = 0.581059E+01 + PKER_RWETH( 5, 32) = 0.581668E+01 + PKER_RWETH( 5, 33) = 0.582171E+01 + PKER_RWETH( 5, 34) = 0.582587E+01 + PKER_RWETH( 5, 35) = 0.582931E+01 + PKER_RWETH( 5, 36) = 0.583215E+01 + PKER_RWETH( 5, 37) = 0.583450E+01 + PKER_RWETH( 5, 38) = 0.583645E+01 + PKER_RWETH( 5, 39) = 0.583806E+01 + PKER_RWETH( 5, 40) = 0.583939E+01 + PKER_RWETH( 6, 1) = 0.795455E+01 + PKER_RWETH( 6, 2) = 0.566068E+01 + PKER_RWETH( 6, 3) = 0.389662E+01 + PKER_RWETH( 6, 4) = 0.265525E+01 + PKER_RWETH( 6, 5) = 0.193212E+01 + PKER_RWETH( 6, 6) = 0.168546E+01 + PKER_RWETH( 6, 7) = 0.181153E+01 + PKER_RWETH( 6, 8) = 0.216086E+01 + PKER_RWETH( 6, 9) = 0.259008E+01 + PKER_RWETH( 6, 10) = 0.300451E+01 + PKER_RWETH( 6, 11) = 0.336420E+01 + PKER_RWETH( 6, 12) = 0.366278E+01 + PKER_RWETH( 6, 13) = 0.390721E+01 + PKER_RWETH( 6, 14) = 0.410685E+01 + PKER_RWETH( 6, 15) = 0.427007E+01 + PKER_RWETH( 6, 16) = 0.440373E+01 + PKER_RWETH( 6, 17) = 0.451336E+01 + PKER_RWETH( 6, 18) = 0.460339E+01 + PKER_RWETH( 6, 19) = 0.467741E+01 + PKER_RWETH( 6, 20) = 0.473833E+01 + PKER_RWETH( 6, 21) = 0.478850E+01 + PKER_RWETH( 6, 22) = 0.482985E+01 + PKER_RWETH( 6, 23) = 0.486395E+01 + PKER_RWETH( 6, 24) = 0.489209E+01 + PKER_RWETH( 6, 25) = 0.491531E+01 + PKER_RWETH( 6, 26) = 0.493448E+01 + PKER_RWETH( 6, 27) = 0.495031E+01 + PKER_RWETH( 6, 28) = 0.496339E+01 + PKER_RWETH( 6, 29) = 0.497420E+01 + PKER_RWETH( 6, 30) = 0.498312E+01 + PKER_RWETH( 6, 31) = 0.499050E+01 + PKER_RWETH( 6, 32) = 0.499660E+01 + PKER_RWETH( 6, 33) = 0.500165E+01 + PKER_RWETH( 6, 34) = 0.500581E+01 + PKER_RWETH( 6, 35) = 0.500926E+01 + PKER_RWETH( 6, 36) = 0.501211E+01 + PKER_RWETH( 6, 37) = 0.501447E+01 + PKER_RWETH( 6, 38) = 0.501641E+01 + PKER_RWETH( 6, 39) = 0.501803E+01 + PKER_RWETH( 6, 40) = 0.501936E+01 + PKER_RWETH( 7, 1) = 0.881081E+01 + PKER_RWETH( 7, 2) = 0.644923E+01 + PKER_RWETH( 7, 3) = 0.456302E+01 + PKER_RWETH( 7, 4) = 0.312729E+01 + PKER_RWETH( 7, 5) = 0.213937E+01 + PKER_RWETH( 7, 6) = 0.159348E+01 + PKER_RWETH( 7, 7) = 0.144580E+01 + PKER_RWETH( 7, 8) = 0.159857E+01 + PKER_RWETH( 7, 9) = 0.191990E+01 + PKER_RWETH( 7, 10) = 0.229195E+01 + PKER_RWETH( 7, 11) = 0.264196E+01 + PKER_RWETH( 7, 12) = 0.294215E+01 + PKER_RWETH( 7, 13) = 0.319025E+01 + PKER_RWETH( 7, 14) = 0.339309E+01 + PKER_RWETH( 7, 15) = 0.355870E+01 + PKER_RWETH( 7, 16) = 0.369410E+01 + PKER_RWETH( 7, 17) = 0.380497E+01 + PKER_RWETH( 7, 18) = 0.389590E+01 + PKER_RWETH( 7, 19) = 0.397057E+01 + PKER_RWETH( 7, 20) = 0.403196E+01 + PKER_RWETH( 7, 21) = 0.408248E+01 + PKER_RWETH( 7, 22) = 0.412408E+01 + PKER_RWETH( 7, 23) = 0.415837E+01 + PKER_RWETH( 7, 24) = 0.418665E+01 + PKER_RWETH( 7, 25) = 0.420997E+01 + PKER_RWETH( 7, 26) = 0.422922E+01 + PKER_RWETH( 7, 27) = 0.424512E+01 + PKER_RWETH( 7, 28) = 0.425824E+01 + PKER_RWETH( 7, 29) = 0.426908E+01 + PKER_RWETH( 7, 30) = 0.427804E+01 + PKER_RWETH( 7, 31) = 0.428544E+01 + PKER_RWETH( 7, 32) = 0.429155E+01 + PKER_RWETH( 7, 33) = 0.429661E+01 + PKER_RWETH( 7, 34) = 0.430079E+01 + PKER_RWETH( 7, 35) = 0.430424E+01 + PKER_RWETH( 7, 36) = 0.430710E+01 + PKER_RWETH( 7, 37) = 0.430946E+01 + PKER_RWETH( 7, 38) = 0.431141E+01 + PKER_RWETH( 7, 39) = 0.431302E+01 + PKER_RWETH( 7, 40) = 0.431436E+01 + PKER_RWETH( 8, 1) = 0.956627E+01 + PKER_RWETH( 8, 2) = 0.717320E+01 + PKER_RWETH( 8, 3) = 0.522361E+01 + PKER_RWETH( 8, 4) = 0.367446E+01 + PKER_RWETH( 8, 5) = 0.250914E+01 + PKER_RWETH( 8, 6) = 0.172781E+01 + PKER_RWETH( 8, 7) = 0.132243E+01 + PKER_RWETH( 8, 8) = 0.124848E+01 + PKER_RWETH( 8, 9) = 0.141419E+01 + PKER_RWETH( 8, 10) = 0.170540E+01 + PKER_RWETH( 8, 11) = 0.202584E+01 + PKER_RWETH( 8, 12) = 0.232058E+01 + PKER_RWETH( 8, 13) = 0.257083E+01 + PKER_RWETH( 8, 14) = 0.277692E+01 + PKER_RWETH( 8, 15) = 0.294524E+01 + PKER_RWETH( 8, 16) = 0.308264E+01 + PKER_RWETH( 8, 17) = 0.319496E+01 + PKER_RWETH( 8, 18) = 0.328694E+01 + PKER_RWETH( 8, 19) = 0.336236E+01 + PKER_RWETH( 8, 20) = 0.342430E+01 + PKER_RWETH( 8, 21) = 0.347521E+01 + PKER_RWETH( 8, 22) = 0.351711E+01 + PKER_RWETH( 8, 23) = 0.355161E+01 + PKER_RWETH( 8, 24) = 0.358005E+01 + PKER_RWETH( 8, 25) = 0.360349E+01 + PKER_RWETH( 8, 26) = 0.362283E+01 + PKER_RWETH( 8, 27) = 0.363879E+01 + PKER_RWETH( 8, 28) = 0.365197E+01 + PKER_RWETH( 8, 29) = 0.366285E+01 + PKER_RWETH( 8, 30) = 0.367183E+01 + PKER_RWETH( 8, 31) = 0.367926E+01 + PKER_RWETH( 8, 32) = 0.368539E+01 + PKER_RWETH( 8, 33) = 0.369046E+01 + PKER_RWETH( 8, 34) = 0.369465E+01 + PKER_RWETH( 8, 35) = 0.369811E+01 + PKER_RWETH( 8, 36) = 0.370097E+01 + PKER_RWETH( 8, 37) = 0.370334E+01 + PKER_RWETH( 8, 38) = 0.370530E+01 + PKER_RWETH( 8, 39) = 0.370691E+01 + PKER_RWETH( 8, 40) = 0.370825E+01 + PKER_RWETH( 9, 1) = 0.102200E+02 + PKER_RWETH( 9, 2) = 0.781427E+01 + PKER_RWETH( 9, 3) = 0.583508E+01 + PKER_RWETH( 9, 4) = 0.422651E+01 + PKER_RWETH( 9, 5) = 0.295601E+01 + PKER_RWETH( 9, 6) = 0.201318E+01 + PKER_RWETH( 9, 7) = 0.139951E+01 + PKER_RWETH( 9, 8) = 0.110495E+01 + PKER_RWETH( 9, 9) = 0.108447E+01 + PKER_RWETH( 9, 10) = 0.125349E+01 + PKER_RWETH( 9, 11) = 0.151396E+01 + PKER_RWETH( 9, 12) = 0.178854E+01 + PKER_RWETH( 9, 13) = 0.203611E+01 + PKER_RWETH( 9, 14) = 0.224455E+01 + PKER_RWETH( 9, 15) = 0.241570E+01 + PKER_RWETH( 9, 16) = 0.255537E+01 + PKER_RWETH( 9, 17) = 0.266938E+01 + PKER_RWETH( 9, 18) = 0.276256E+01 + PKER_RWETH( 9, 19) = 0.283887E+01 + PKER_RWETH( 9, 20) = 0.290144E+01 + PKER_RWETH( 9, 21) = 0.295281E+01 + PKER_RWETH( 9, 22) = 0.299504E+01 + PKER_RWETH( 9, 23) = 0.302979E+01 + PKER_RWETH( 9, 24) = 0.305841E+01 + PKER_RWETH( 9, 25) = 0.308199E+01 + PKER_RWETH( 9, 26) = 0.310143E+01 + PKER_RWETH( 9, 27) = 0.311747E+01 + PKER_RWETH( 9, 28) = 0.313070E+01 + PKER_RWETH( 9, 29) = 0.314162E+01 + PKER_RWETH( 9, 30) = 0.315064E+01 + PKER_RWETH( 9, 31) = 0.315809E+01 + PKER_RWETH( 9, 32) = 0.316424E+01 + PKER_RWETH( 9, 33) = 0.316933E+01 + PKER_RWETH( 9, 34) = 0.317353E+01 + PKER_RWETH( 9, 35) = 0.317700E+01 + PKER_RWETH( 9, 36) = 0.317987E+01 + PKER_RWETH( 9, 37) = 0.318224E+01 + PKER_RWETH( 9, 38) = 0.318420E+01 + PKER_RWETH( 9, 39) = 0.318582E+01 + PKER_RWETH( 9, 40) = 0.318716E+01 + PKER_RWETH( 10, 1) = 0.107794E+02 + PKER_RWETH( 10, 2) = 0.837003E+01 + PKER_RWETH( 10, 3) = 0.637887E+01 + PKER_RWETH( 10, 4) = 0.474241E+01 + PKER_RWETH( 10, 5) = 0.341615E+01 + PKER_RWETH( 10, 6) = 0.237589E+01 + PKER_RWETH( 10, 7) = 0.161585E+01 + PKER_RWETH( 10, 8) = 0.113766E+01 + PKER_RWETH( 10, 9) = 0.929743E+00 + PKER_RWETH( 10, 10) = 0.946883E+00 + PKER_RWETH( 10, 11) = 0.111245E+01 + PKER_RWETH( 10, 12) = 0.134310E+01 + PKER_RWETH( 10, 13) = 0.157719E+01 + PKER_RWETH( 10, 14) = 0.178469E+01 + PKER_RWETH( 10, 15) = 0.195816E+01 + PKER_RWETH( 10, 16) = 0.210028E+01 + PKER_RWETH( 10, 17) = 0.221619E+01 + PKER_RWETH( 10, 18) = 0.231078E+01 + PKER_RWETH( 10, 19) = 0.238810E+01 + PKER_RWETH( 10, 20) = 0.245141E+01 + PKER_RWETH( 10, 21) = 0.250332E+01 + PKER_RWETH( 10, 22) = 0.254594E+01 + PKER_RWETH( 10, 23) = 0.258097E+01 + PKER_RWETH( 10, 24) = 0.260979E+01 + PKER_RWETH( 10, 25) = 0.263353E+01 + PKER_RWETH( 10, 26) = 0.265308E+01 + PKER_RWETH( 10, 27) = 0.266921E+01 + PKER_RWETH( 10, 28) = 0.268250E+01 + PKER_RWETH( 10, 29) = 0.269348E+01 + PKER_RWETH( 10, 30) = 0.270253E+01 + PKER_RWETH( 10, 31) = 0.271001E+01 + PKER_RWETH( 10, 32) = 0.271618E+01 + PKER_RWETH( 10, 33) = 0.272129E+01 + PKER_RWETH( 10, 34) = 0.272550E+01 + PKER_RWETH( 10, 35) = 0.272898E+01 + PKER_RWETH( 10, 36) = 0.273186E+01 + PKER_RWETH( 10, 37) = 0.273424E+01 + PKER_RWETH( 10, 38) = 0.273620E+01 + PKER_RWETH( 10, 39) = 0.273783E+01 + PKER_RWETH( 10, 40) = 0.273917E+01 + PKER_RWETH( 11, 1) = 0.112547E+02 + PKER_RWETH( 11, 2) = 0.884593E+01 + PKER_RWETH( 11, 3) = 0.685131E+01 + PKER_RWETH( 11, 4) = 0.520348E+01 + PKER_RWETH( 11, 5) = 0.385081E+01 + PKER_RWETH( 11, 6) = 0.275817E+01 + PKER_RWETH( 11, 7) = 0.190805E+01 + PKER_RWETH( 11, 8) = 0.129789E+01 + PKER_RWETH( 11, 9) = 0.929130E+00 + PKER_RWETH( 11, 10) = 0.787911E+00 + PKER_RWETH( 11, 11) = 0.830555E+00 + PKER_RWETH( 11, 12) = 0.988070E+00 + PKER_RWETH( 11, 13) = 0.119042E+01 + PKER_RWETH( 11, 14) = 0.138918E+01 + PKER_RWETH( 11, 15) = 0.156279E+01 + PKER_RWETH( 11, 16) = 0.170708E+01 + PKER_RWETH( 11, 17) = 0.182507E+01 + PKER_RWETH( 11, 18) = 0.192127E+01 + PKER_RWETH( 11, 19) = 0.199976E+01 + PKER_RWETH( 11, 20) = 0.206392E+01 + PKER_RWETH( 11, 21) = 0.211645E+01 + PKER_RWETH( 11, 22) = 0.215952E+01 + PKER_RWETH( 11, 23) = 0.219488E+01 + PKER_RWETH( 11, 24) = 0.222394E+01 + PKER_RWETH( 11, 25) = 0.224785E+01 + PKER_RWETH( 11, 26) = 0.226753E+01 + PKER_RWETH( 11, 27) = 0.228375E+01 + PKER_RWETH( 11, 28) = 0.229712E+01 + PKER_RWETH( 11, 29) = 0.230815E+01 + PKER_RWETH( 11, 30) = 0.231725E+01 + PKER_RWETH( 11, 31) = 0.232476E+01 + PKER_RWETH( 11, 32) = 0.233096E+01 + PKER_RWETH( 11, 33) = 0.233608E+01 + PKER_RWETH( 11, 34) = 0.234031E+01 + PKER_RWETH( 11, 35) = 0.234380E+01 + PKER_RWETH( 11, 36) = 0.234669E+01 + PKER_RWETH( 11, 37) = 0.234907E+01 + PKER_RWETH( 11, 38) = 0.235104E+01 + PKER_RWETH( 11, 39) = 0.235267E+01 + PKER_RWETH( 11, 40) = 0.235402E+01 + PKER_RWETH( 12, 1) = 0.116571E+02 + PKER_RWETH( 12, 2) = 0.925058E+01 + PKER_RWETH( 12, 3) = 0.725629E+01 + PKER_RWETH( 12, 4) = 0.560505E+01 + PKER_RWETH( 12, 5) = 0.424152E+01 + PKER_RWETH( 12, 6) = 0.312383E+01 + PKER_RWETH( 12, 7) = 0.222456E+01 + PKER_RWETH( 12, 8) = 0.153134E+01 + PKER_RWETH( 12, 9) = 0.104379E+01 + PKER_RWETH( 12, 10) = 0.762641E+00 + PKER_RWETH( 12, 11) = 0.672444E+00 + PKER_RWETH( 12, 12) = 0.731332E+00 + PKER_RWETH( 12, 13) = 0.877846E+00 + PKER_RWETH( 12, 14) = 0.105398E+01 + PKER_RWETH( 12, 15) = 0.122217E+01 + PKER_RWETH( 12, 16) = 0.136721E+01 + PKER_RWETH( 12, 17) = 0.148718E+01 + PKER_RWETH( 12, 18) = 0.158513E+01 + PKER_RWETH( 12, 19) = 0.166497E+01 + PKER_RWETH( 12, 20) = 0.173011E+01 + PKER_RWETH( 12, 21) = 0.178335E+01 + PKER_RWETH( 12, 22) = 0.182694E+01 + PKER_RWETH( 12, 23) = 0.186268E+01 + PKER_RWETH( 12, 24) = 0.189201E+01 + PKER_RWETH( 12, 25) = 0.191613E+01 + PKER_RWETH( 12, 26) = 0.193596E+01 + PKER_RWETH( 12, 27) = 0.195229E+01 + PKER_RWETH( 12, 28) = 0.196574E+01 + PKER_RWETH( 12, 29) = 0.197683E+01 + PKER_RWETH( 12, 30) = 0.198598E+01 + PKER_RWETH( 12, 31) = 0.199352E+01 + PKER_RWETH( 12, 32) = 0.199975E+01 + PKER_RWETH( 12, 33) = 0.200489E+01 + PKER_RWETH( 12, 34) = 0.200914E+01 + PKER_RWETH( 12, 35) = 0.201264E+01 + PKER_RWETH( 12, 36) = 0.201554E+01 + PKER_RWETH( 12, 37) = 0.201793E+01 + PKER_RWETH( 12, 38) = 0.201991E+01 + PKER_RWETH( 12, 39) = 0.202154E+01 + PKER_RWETH( 12, 40) = 0.202289E+01 + PKER_RWETH( 13, 1) = 0.119970E+02 + PKER_RWETH( 13, 2) = 0.959324E+01 + PKER_RWETH( 13, 3) = 0.760081E+01 + PKER_RWETH( 13, 4) = 0.594970E+01 + PKER_RWETH( 13, 5) = 0.458280E+01 + PKER_RWETH( 13, 6) = 0.345469E+01 + PKER_RWETH( 13, 7) = 0.253159E+01 + PKER_RWETH( 13, 8) = 0.179227E+01 + PKER_RWETH( 13, 9) = 0.122838E+01 + PKER_RWETH( 13, 10) = 0.841004E+00 + PKER_RWETH( 13, 11) = 0.629650E+00 + PKER_RWETH( 13, 12) = 0.577924E+00 + PKER_RWETH( 13, 13) = 0.645898E+00 + PKER_RWETH( 13, 14) = 0.779895E+00 + PKER_RWETH( 13, 15) = 0.932147E+00 + PKER_RWETH( 13, 16) = 0.107403E+01 + PKER_RWETH( 13, 17) = 0.119506E+01 + PKER_RWETH( 13, 18) = 0.129476E+01 + PKER_RWETH( 13, 19) = 0.137609E+01 + PKER_RWETH( 13, 20) = 0.144235E+01 + PKER_RWETH( 13, 21) = 0.149642E+01 + PKER_RWETH( 13, 22) = 0.154060E+01 + PKER_RWETH( 13, 23) = 0.157677E+01 + PKER_RWETH( 13, 24) = 0.160643E+01 + PKER_RWETH( 13, 25) = 0.163077E+01 + PKER_RWETH( 13, 26) = 0.165078E+01 + PKER_RWETH( 13, 27) = 0.166723E+01 + PKER_RWETH( 13, 28) = 0.168078E+01 + PKER_RWETH( 13, 29) = 0.169194E+01 + PKER_RWETH( 13, 30) = 0.170114E+01 + PKER_RWETH( 13, 31) = 0.170872E+01 + PKER_RWETH( 13, 32) = 0.171498E+01 + PKER_RWETH( 13, 33) = 0.172014E+01 + PKER_RWETH( 13, 34) = 0.172441E+01 + PKER_RWETH( 13, 35) = 0.172792E+01 + PKER_RWETH( 13, 36) = 0.173083E+01 + PKER_RWETH( 13, 37) = 0.173323E+01 + PKER_RWETH( 13, 38) = 0.173522E+01 + PKER_RWETH( 13, 39) = 0.173685E+01 + PKER_RWETH( 13, 40) = 0.173821E+01 + PKER_RWETH( 14, 1) = 0.122839E+02 + PKER_RWETH( 14, 2) = 0.988280E+01 + PKER_RWETH( 14, 3) = 0.789268E+01 + PKER_RWETH( 14, 4) = 0.624309E+01 + PKER_RWETH( 14, 5) = 0.487613E+01 + PKER_RWETH( 14, 6) = 0.374467E+01 + PKER_RWETH( 14, 7) = 0.281151E+01 + PKER_RWETH( 14, 8) = 0.204951E+01 + PKER_RWETH( 14, 9) = 0.144246E+01 + PKER_RWETH( 14, 10) = 0.985100E+00 + PKER_RWETH( 14, 11) = 0.679232E+00 + PKER_RWETH( 14, 12) = 0.523227E+00 + PKER_RWETH( 14, 13) = 0.499857E+00 + PKER_RWETH( 14, 14) = 0.571812E+00 + PKER_RWETH( 14, 15) = 0.692570E+00 + PKER_RWETH( 14, 16) = 0.823458E+00 + PKER_RWETH( 14, 17) = 0.942830E+00 + PKER_RWETH( 14, 18) = 0.104371E+01 + PKER_RWETH( 14, 19) = 0.112656E+01 + PKER_RWETH( 14, 20) = 0.119407E+01 + PKER_RWETH( 14, 21) = 0.124908E+01 + PKER_RWETH( 14, 22) = 0.129395E+01 + PKER_RWETH( 14, 23) = 0.133063E+01 + PKER_RWETH( 14, 24) = 0.136065E+01 + PKER_RWETH( 14, 25) = 0.138526E+01 + PKER_RWETH( 14, 26) = 0.140546E+01 + PKER_RWETH( 14, 27) = 0.142206E+01 + PKER_RWETH( 14, 28) = 0.143571E+01 + PKER_RWETH( 14, 29) = 0.144695E+01 + PKER_RWETH( 14, 30) = 0.145621E+01 + PKER_RWETH( 14, 31) = 0.146384E+01 + PKER_RWETH( 14, 32) = 0.147013E+01 + PKER_RWETH( 14, 33) = 0.147532E+01 + PKER_RWETH( 14, 34) = 0.147960E+01 + PKER_RWETH( 14, 35) = 0.148314E+01 + PKER_RWETH( 14, 36) = 0.148605E+01 + PKER_RWETH( 14, 37) = 0.148846E+01 + PKER_RWETH( 14, 38) = 0.149045E+01 + PKER_RWETH( 14, 39) = 0.149210E+01 + PKER_RWETH( 14, 40) = 0.149346E+01 + PKER_RWETH( 15, 1) = 0.125259E+02 + PKER_RWETH( 15, 2) = 0.101272E+02 + PKER_RWETH( 15, 3) = 0.813939E+01 + PKER_RWETH( 15, 4) = 0.649175E+01 + PKER_RWETH( 15, 5) = 0.512603E+01 + PKER_RWETH( 15, 6) = 0.399434E+01 + PKER_RWETH( 15, 7) = 0.305783E+01 + PKER_RWETH( 15, 8) = 0.228610E+01 + PKER_RWETH( 15, 9) = 0.165747E+01 + PKER_RWETH( 15, 10) = 0.115978E+01 + PKER_RWETH( 15, 11) = 0.790048E+00 + PKER_RWETH( 15, 12) = 0.550236E+00 + PKER_RWETH( 15, 13) = 0.437781E+00 + PKER_RWETH( 15, 14) = 0.434801E+00 + PKER_RWETH( 15, 15) = 0.507067E+00 + PKER_RWETH( 15, 16) = 0.614692E+00 + PKER_RWETH( 15, 17) = 0.726597E+00 + PKER_RWETH( 15, 18) = 0.826793E+00 + PKER_RWETH( 15, 19) = 0.910816E+00 + PKER_RWETH( 15, 20) = 0.979641E+00 + PKER_RWETH( 15, 21) = 0.103570E+01 + PKER_RWETH( 15, 22) = 0.108136E+01 + PKER_RWETH( 15, 23) = 0.111861E+01 + PKER_RWETH( 15, 24) = 0.114905E+01 + PKER_RWETH( 15, 25) = 0.117397E+01 + PKER_RWETH( 15, 26) = 0.119439E+01 + PKER_RWETH( 15, 27) = 0.121116E+01 + PKER_RWETH( 15, 28) = 0.122493E+01 + PKER_RWETH( 15, 29) = 0.123626E+01 + PKER_RWETH( 15, 30) = 0.124559E+01 + PKER_RWETH( 15, 31) = 0.125327E+01 + PKER_RWETH( 15, 32) = 0.125960E+01 + PKER_RWETH( 15, 33) = 0.126482E+01 + PKER_RWETH( 15, 34) = 0.126912E+01 + PKER_RWETH( 15, 35) = 0.127267E+01 + PKER_RWETH( 15, 36) = 0.127560E+01 + PKER_RWETH( 15, 37) = 0.127802E+01 + PKER_RWETH( 15, 38) = 0.128002E+01 + PKER_RWETH( 15, 39) = 0.128167E+01 + PKER_RWETH( 15, 40) = 0.128303E+01 + PKER_RWETH( 16, 1) = 0.127300E+02 + PKER_RWETH( 16, 2) = 0.103335E+02 + PKER_RWETH( 16, 3) = 0.834773E+01 + PKER_RWETH( 16, 4) = 0.670202E+01 + PKER_RWETH( 16, 5) = 0.533793E+01 + PKER_RWETH( 16, 6) = 0.420722E+01 + PKER_RWETH( 16, 7) = 0.327032E+01 + PKER_RWETH( 16, 8) = 0.249524E+01 + PKER_RWETH( 16, 9) = 0.185719E+01 + PKER_RWETH( 16, 10) = 0.133896E+01 + PKER_RWETH( 16, 11) = 0.931613E+00 + PKER_RWETH( 16, 12) = 0.633849E+00 + PKER_RWETH( 16, 13) = 0.447566E+00 + PKER_RWETH( 16, 14) = 0.368904E+00 + PKER_RWETH( 16, 15) = 0.380168E+00 + PKER_RWETH( 16, 16) = 0.450172E+00 + PKER_RWETH( 16, 17) = 0.545119E+00 + PKER_RWETH( 16, 18) = 0.640376E+00 + PKER_RWETH( 16, 19) = 0.724315E+00 + PKER_RWETH( 16, 20) = 0.794253E+00 + PKER_RWETH( 16, 21) = 0.851423E+00 + PKER_RWETH( 16, 22) = 0.897965E+00 + PKER_RWETH( 16, 23) = 0.935873E+00 + PKER_RWETH( 16, 24) = 0.966798E+00 + PKER_RWETH( 16, 25) = 0.992069E+00 + PKER_RWETH( 16, 26) = 0.101275E+01 + PKER_RWETH( 16, 27) = 0.102971E+01 + PKER_RWETH( 16, 28) = 0.104362E+01 + PKER_RWETH( 16, 29) = 0.105506E+01 + PKER_RWETH( 16, 30) = 0.106446E+01 + PKER_RWETH( 16, 31) = 0.107219E+01 + PKER_RWETH( 16, 32) = 0.107857E+01 + PKER_RWETH( 16, 33) = 0.108382E+01 + PKER_RWETH( 16, 34) = 0.108815E+01 + PKER_RWETH( 16, 35) = 0.109172E+01 + PKER_RWETH( 16, 36) = 0.109466E+01 + PKER_RWETH( 16, 37) = 0.109709E+01 + PKER_RWETH( 16, 38) = 0.109910E+01 + PKER_RWETH( 16, 39) = 0.110076E+01 + PKER_RWETH( 16, 40) = 0.110213E+01 + PKER_RWETH( 17, 1) = 0.129024E+02 + PKER_RWETH( 17, 2) = 0.105076E+02 + PKER_RWETH( 17, 3) = 0.852362E+01 + PKER_RWETH( 17, 4) = 0.687964E+01 + PKER_RWETH( 17, 5) = 0.551717E+01 + PKER_RWETH( 17, 6) = 0.438782E+01 + PKER_RWETH( 17, 7) = 0.345170E+01 + PKER_RWETH( 17, 8) = 0.267609E+01 + PKER_RWETH( 17, 9) = 0.203468E+01 + PKER_RWETH( 17, 10) = 0.150732E+01 + PKER_RWETH( 17, 11) = 0.108047E+01 + PKER_RWETH( 17, 12) = 0.747735E+00 + PKER_RWETH( 17, 13) = 0.508950E+00 + PKER_RWETH( 17, 14) = 0.365691E+00 + PKER_RWETH( 17, 15) = 0.313111E+00 + PKER_RWETH( 17, 16) = 0.333878E+00 + PKER_RWETH( 17, 17) = 0.399897E+00 + PKER_RWETH( 17, 18) = 0.482939E+00 + PKER_RWETH( 17, 19) = 0.563733E+00 + PKER_RWETH( 17, 20) = 0.633938E+00 + PKER_RWETH( 17, 21) = 0.692122E+00 + PKER_RWETH( 17, 22) = 0.739609E+00 + PKER_RWETH( 17, 23) = 0.778254E+00 + PKER_RWETH( 17, 24) = 0.809729E+00 + PKER_RWETH( 17, 25) = 0.835404E+00 + PKER_RWETH( 17, 26) = 0.856386E+00 + PKER_RWETH( 17, 27) = 0.873558E+00 + PKER_RWETH( 17, 28) = 0.887632E+00 + PKER_RWETH( 17, 29) = 0.899182E+00 + PKER_RWETH( 17, 30) = 0.908671E+00 + PKER_RWETH( 17, 31) = 0.916474E+00 + PKER_RWETH( 17, 32) = 0.922895E+00 + PKER_RWETH( 17, 33) = 0.928182E+00 + PKER_RWETH( 17, 34) = 0.932539E+00 + PKER_RWETH( 17, 35) = 0.936130E+00 + PKER_RWETH( 17, 36) = 0.939092E+00 + PKER_RWETH( 17, 37) = 0.941535E+00 + PKER_RWETH( 17, 38) = 0.943552E+00 + PKER_RWETH( 17, 39) = 0.945216E+00 + PKER_RWETH( 17, 40) = 0.946590E+00 + PKER_RWETH( 18, 1) = 0.130481E+02 + PKER_RWETH( 18, 2) = 0.106547E+02 + PKER_RWETH( 18, 3) = 0.867216E+01 + PKER_RWETH( 18, 4) = 0.702966E+01 + PKER_RWETH( 18, 5) = 0.566864E+01 + PKER_RWETH( 18, 6) = 0.454066E+01 + PKER_RWETH( 18, 7) = 0.360566E+01 + PKER_RWETH( 18, 8) = 0.283064E+01 + PKER_RWETH( 18, 9) = 0.218857E+01 + PKER_RWETH( 18, 10) = 0.165785E+01 + PKER_RWETH( 18, 11) = 0.122215E+01 + PKER_RWETH( 18, 12) = 0.870920E+00 + PKER_RWETH( 18, 13) = 0.599738E+00 + PKER_RWETH( 18, 14) = 0.409230E+00 + PKER_RWETH( 18, 15) = 0.300399E+00 + PKER_RWETH( 18, 16) = 0.267701E+00 + PKER_RWETH( 18, 17) = 0.294269E+00 + PKER_RWETH( 18, 18) = 0.355318E+00 + PKER_RWETH( 18, 19) = 0.427404E+00 + PKER_RWETH( 18, 20) = 0.495700E+00 + PKER_RWETH( 18, 21) = 0.554339E+00 + PKER_RWETH( 18, 22) = 0.602725E+00 + PKER_RWETH( 18, 23) = 0.642169E+00 + PKER_RWETH( 18, 24) = 0.674260E+00 + PKER_RWETH( 18, 25) = 0.700395E+00 + PKER_RWETH( 18, 26) = 0.721715E+00 + PKER_RWETH( 18, 27) = 0.739136E+00 + PKER_RWETH( 18, 28) = 0.753394E+00 + PKER_RWETH( 18, 29) = 0.765078E+00 + PKER_RWETH( 18, 30) = 0.774667E+00 + PKER_RWETH( 18, 31) = 0.782543E+00 + PKER_RWETH( 18, 32) = 0.789019E+00 + PKER_RWETH( 18, 33) = 0.794348E+00 + PKER_RWETH( 18, 34) = 0.798736E+00 + PKER_RWETH( 18, 35) = 0.802351E+00 + PKER_RWETH( 18, 36) = 0.805330E+00 + PKER_RWETH( 18, 37) = 0.807788E+00 + PKER_RWETH( 18, 38) = 0.809814E+00 + PKER_RWETH( 18, 39) = 0.811487E+00 + PKER_RWETH( 18, 40) = 0.812867E+00 + PKER_RWETH( 19, 1) = 0.131712E+02 + PKER_RWETH( 19, 2) = 0.107790E+02 + PKER_RWETH( 19, 3) = 0.879768E+01 + PKER_RWETH( 19, 4) = 0.715640E+01 + PKER_RWETH( 19, 5) = 0.579662E+01 + PKER_RWETH( 19, 6) = 0.466986E+01 + PKER_RWETH( 19, 7) = 0.373600E+01 + PKER_RWETH( 19, 8) = 0.296191E+01 + PKER_RWETH( 19, 9) = 0.232027E+01 + PKER_RWETH( 19, 10) = 0.178879E+01 + PKER_RWETH( 19, 11) = 0.134972E+01 + PKER_RWETH( 19, 12) = 0.989916E+00 + PKER_RWETH( 19, 13) = 0.701233E+00 + PKER_RWETH( 19, 14) = 0.480800E+00 + PKER_RWETH( 19, 15) = 0.329665E+00 + PKER_RWETH( 19, 16) = 0.248272E+00 + PKER_RWETH( 19, 17) = 0.230434E+00 + PKER_RWETH( 19, 18) = 0.260120E+00 + PKER_RWETH( 19, 19) = 0.315632E+00 + PKER_RWETH( 19, 20) = 0.377834E+00 + PKER_RWETH( 19, 21) = 0.435396E+00 + PKER_RWETH( 19, 22) = 0.484321E+00 + PKER_RWETH( 19, 23) = 0.524549E+00 + PKER_RWETH( 19, 24) = 0.557311E+00 + PKER_RWETH( 19, 25) = 0.583962E+00 + PKER_RWETH( 19, 26) = 0.605667E+00 + PKER_RWETH( 19, 27) = 0.623372E+00 + PKER_RWETH( 19, 28) = 0.637838E+00 + PKER_RWETH( 19, 29) = 0.649677E+00 + PKER_RWETH( 19, 30) = 0.659379E+00 + PKER_RWETH( 19, 31) = 0.667339E+00 + PKER_RWETH( 19, 32) = 0.673877E+00 + PKER_RWETH( 19, 33) = 0.679253E+00 + PKER_RWETH( 19, 34) = 0.683676E+00 + PKER_RWETH( 19, 35) = 0.687317E+00 + PKER_RWETH( 19, 36) = 0.690317E+00 + PKER_RWETH( 19, 37) = 0.692790E+00 + PKER_RWETH( 19, 38) = 0.694828E+00 + PKER_RWETH( 19, 39) = 0.696510E+00 + PKER_RWETH( 19, 40) = 0.697897E+00 + PKER_RWETH( 20, 1) = 0.132755E+02 + PKER_RWETH( 20, 2) = 0.108842E+02 + PKER_RWETH( 20, 3) = 0.890381E+01 + PKER_RWETH( 20, 4) = 0.726353E+01 + PKER_RWETH( 20, 5) = 0.590477E+01 + PKER_RWETH( 20, 6) = 0.477905E+01 + PKER_RWETH( 20, 7) = 0.384623E+01 + PKER_RWETH( 20, 8) = 0.307309E+01 + PKER_RWETH( 20, 9) = 0.243222E+01 + PKER_RWETH( 20, 10) = 0.190101E+01 + PKER_RWETH( 20, 11) = 0.146109E+01 + PKER_RWETH( 20, 12) = 0.109792E+01 + PKER_RWETH( 20, 13) = 0.800957E+00 + PKER_RWETH( 20, 14) = 0.564005E+00 + PKER_RWETH( 20, 15) = 0.385366E+00 + PKER_RWETH( 20, 16) = 0.266229E+00 + PKER_RWETH( 20, 17) = 0.206550E+00 + PKER_RWETH( 20, 18) = 0.199590E+00 + PKER_RWETH( 20, 19) = 0.230425E+00 + PKER_RWETH( 20, 20) = 0.280277E+00 + PKER_RWETH( 20, 21) = 0.333630E+00 + PKER_RWETH( 20, 22) = 0.382023E+00 + PKER_RWETH( 20, 23) = 0.422805E+00 + PKER_RWETH( 20, 24) = 0.456244E+00 + PKER_RWETH( 20, 25) = 0.483458E+00 + PKER_RWETH( 20, 26) = 0.505594E+00 + PKER_RWETH( 20, 27) = 0.523620E+00 + PKER_RWETH( 20, 28) = 0.538325E+00 + PKER_RWETH( 20, 29) = 0.550339E+00 + PKER_RWETH( 20, 30) = 0.560171E+00 + PKER_RWETH( 20, 31) = 0.568227E+00 + PKER_RWETH( 20, 32) = 0.574836E+00 + PKER_RWETH( 20, 33) = 0.580265E+00 + PKER_RWETH( 20, 34) = 0.584727E+00 + PKER_RWETH( 20, 35) = 0.588398E+00 + PKER_RWETH( 20, 36) = 0.591421E+00 + PKER_RWETH( 20, 37) = 0.593910E+00 + PKER_RWETH( 20, 38) = 0.595962E+00 + PKER_RWETH( 20, 39) = 0.597653E+00 + PKER_RWETH( 20, 40) = 0.599048E+00 + PKER_RWETH( 21, 1) = 0.133638E+02 + PKER_RWETH( 21, 2) = 0.109733E+02 + PKER_RWETH( 21, 3) = 0.899363E+01 + PKER_RWETH( 21, 4) = 0.735415E+01 + PKER_RWETH( 21, 5) = 0.599624E+01 + PKER_RWETH( 21, 6) = 0.487138E+01 + PKER_RWETH( 21, 7) = 0.393943E+01 + PKER_RWETH( 21, 8) = 0.316716E+01 + PKER_RWETH( 21, 9) = 0.252708E+01 + PKER_RWETH( 21, 10) = 0.199649E+01 + PKER_RWETH( 21, 11) = 0.155673E+01 + PKER_RWETH( 21, 12) = 0.119262E+01 + PKER_RWETH( 21, 13) = 0.892302E+00 + PKER_RWETH( 21, 14) = 0.647350E+00 + PKER_RWETH( 21, 15) = 0.453162E+00 + PKER_RWETH( 21, 16) = 0.308890E+00 + PKER_RWETH( 21, 17) = 0.215757E+00 + PKER_RWETH( 21, 18) = 0.173047E+00 + PKER_RWETH( 21, 19) = 0.173871E+00 + PKER_RWETH( 21, 20) = 0.204444E+00 + PKER_RWETH( 21, 21) = 0.248705E+00 + PKER_RWETH( 21, 22) = 0.294253E+00 + PKER_RWETH( 21, 23) = 0.334851E+00 + PKER_RWETH( 21, 24) = 0.368823E+00 + PKER_RWETH( 21, 25) = 0.396614E+00 + PKER_RWETH( 21, 26) = 0.419221E+00 + PKER_RWETH( 21, 27) = 0.437608E+00 + PKER_RWETH( 21, 28) = 0.452581E+00 + PKER_RWETH( 21, 29) = 0.464795E+00 + PKER_RWETH( 21, 30) = 0.474774E+00 + PKER_RWETH( 21, 31) = 0.482940E+00 + PKER_RWETH( 21, 32) = 0.489630E+00 + PKER_RWETH( 21, 33) = 0.495118E+00 + PKER_RWETH( 21, 34) = 0.499626E+00 + PKER_RWETH( 21, 35) = 0.503331E+00 + PKER_RWETH( 21, 36) = 0.506378E+00 + PKER_RWETH( 21, 37) = 0.508887E+00 + PKER_RWETH( 21, 38) = 0.510953E+00 + PKER_RWETH( 21, 39) = 0.512656E+00 + PKER_RWETH( 21, 40) = 0.514060E+00 + PKER_RWETH( 22, 1) = 0.134387E+02 + PKER_RWETH( 22, 2) = 0.110487E+02 + PKER_RWETH( 22, 3) = 0.906972E+01 + PKER_RWETH( 22, 4) = 0.743089E+01 + PKER_RWETH( 22, 5) = 0.607364E+01 + PKER_RWETH( 22, 6) = 0.494948E+01 + PKER_RWETH( 22, 7) = 0.401825E+01 + PKER_RWETH( 22, 8) = 0.324671E+01 + PKER_RWETH( 22, 9) = 0.260736E+01 + PKER_RWETH( 22, 10) = 0.207745E+01 + PKER_RWETH( 22, 11) = 0.163817E+01 + PKER_RWETH( 22, 12) = 0.127411E+01 + PKER_RWETH( 22, 13) = 0.972782E+00 + PKER_RWETH( 22, 14) = 0.724507E+00 + PKER_RWETH( 22, 15) = 0.522622E+00 + PKER_RWETH( 22, 16) = 0.363766E+00 + PKER_RWETH( 22, 17) = 0.247703E+00 + PKER_RWETH( 22, 18) = 0.175545E+00 + PKER_RWETH( 22, 19) = 0.146034E+00 + PKER_RWETH( 22, 20) = 0.152234E+00 + PKER_RWETH( 22, 21) = 0.181564E+00 + PKER_RWETH( 22, 22) = 0.220489E+00 + PKER_RWETH( 22, 23) = 0.259220E+00 + PKER_RWETH( 22, 24) = 0.293219E+00 + PKER_RWETH( 22, 25) = 0.321501E+00 + PKER_RWETH( 22, 26) = 0.344597E+00 + PKER_RWETH( 22, 27) = 0.363378E+00 + PKER_RWETH( 22, 28) = 0.378653E+00 + PKER_RWETH( 22, 29) = 0.391092E+00 + PKER_RWETH( 22, 30) = 0.401239E+00 + PKER_RWETH( 22, 31) = 0.409528E+00 + PKER_RWETH( 22, 32) = 0.416310E+00 + PKER_RWETH( 22, 33) = 0.421867E+00 + PKER_RWETH( 22, 34) = 0.426425E+00 + PKER_RWETH( 22, 35) = 0.430168E+00 + PKER_RWETH( 22, 36) = 0.433244E+00 + PKER_RWETH( 22, 37) = 0.435774E+00 + PKER_RWETH( 22, 38) = 0.437857E+00 + PKER_RWETH( 22, 39) = 0.439572E+00 + PKER_RWETH( 22, 40) = 0.440985E+00 + PKER_RWETH( 23, 1) = 0.135023E+02 + PKER_RWETH( 23, 2) = 0.111128E+02 + PKER_RWETH( 23, 3) = 0.913424E+01 + PKER_RWETH( 23, 4) = 0.749591E+01 + PKER_RWETH( 23, 5) = 0.613920E+01 + PKER_RWETH( 23, 6) = 0.501560E+01 + PKER_RWETH( 23, 7) = 0.408496E+01 + PKER_RWETH( 23, 8) = 0.331403E+01 + PKER_RWETH( 23, 9) = 0.267529E+01 + PKER_RWETH( 23, 10) = 0.214598E+01 + PKER_RWETH( 23, 11) = 0.170727E+01 + PKER_RWETH( 23, 12) = 0.134359E+01 + PKER_RWETH( 23, 13) = 0.104222E+01 + PKER_RWETH( 23, 14) = 0.792868E+00 + PKER_RWETH( 23, 15) = 0.587692E+00 + PKER_RWETH( 23, 16) = 0.421446E+00 + PKER_RWETH( 23, 17) = 0.291760E+00 + PKER_RWETH( 23, 18) = 0.198828E+00 + PKER_RWETH( 23, 19) = 0.143521E+00 + PKER_RWETH( 23, 20) = 0.124168E+00 + PKER_RWETH( 23, 21) = 0.133847E+00 + PKER_RWETH( 23, 22) = 0.161331E+00 + PKER_RWETH( 23, 23) = 0.195282E+00 + PKER_RWETH( 23, 24) = 0.228096E+00 + PKER_RWETH( 23, 25) = 0.256525E+00 + PKER_RWETH( 23, 26) = 0.280060E+00 + PKER_RWETH( 23, 27) = 0.299255E+00 + PKER_RWETH( 23, 28) = 0.314859E+00 + PKER_RWETH( 23, 29) = 0.327550E+00 + PKER_RWETH( 23, 30) = 0.337885E+00 + PKER_RWETH( 23, 31) = 0.346315E+00 + PKER_RWETH( 23, 32) = 0.353201E+00 + PKER_RWETH( 23, 33) = 0.358835E+00 + PKER_RWETH( 23, 34) = 0.363451E+00 + PKER_RWETH( 23, 35) = 0.367237E+00 + PKER_RWETH( 23, 36) = 0.370345E+00 + PKER_RWETH( 23, 37) = 0.372900E+00 + PKER_RWETH( 23, 38) = 0.375001E+00 + PKER_RWETH( 23, 39) = 0.376730E+00 + PKER_RWETH( 23, 40) = 0.378154E+00 + PKER_RWETH( 24, 1) = 0.135563E+02 + PKER_RWETH( 24, 2) = 0.111671E+02 + PKER_RWETH( 24, 3) = 0.918899E+01 + PKER_RWETH( 24, 4) = 0.755107E+01 + PKER_RWETH( 24, 5) = 0.619478E+01 + PKER_RWETH( 24, 6) = 0.507163E+01 + PKER_RWETH( 24, 7) = 0.414145E+01 + PKER_RWETH( 24, 8) = 0.337101E+01 + PKER_RWETH( 24, 9) = 0.273279E+01 + PKER_RWETH( 24, 10) = 0.220400E+01 + PKER_RWETH( 24, 11) = 0.176579E+01 + PKER_RWETH( 24, 12) = 0.140257E+01 + PKER_RWETH( 24, 13) = 0.110150E+01 + PKER_RWETH( 24, 14) = 0.852021E+00 + PKER_RWETH( 24, 15) = 0.645715E+00 + PKER_RWETH( 24, 16) = 0.476221E+00 + PKER_RWETH( 24, 17) = 0.339467E+00 + PKER_RWETH( 24, 18) = 0.233850E+00 + PKER_RWETH( 24, 19) = 0.159822E+00 + PKER_RWETH( 24, 20) = 0.118004E+00 + PKER_RWETH( 24, 21) = 0.106334E+00 + PKER_RWETH( 24, 22) = 0.118095E+00 + PKER_RWETH( 24, 23) = 0.143353E+00 + PKER_RWETH( 24, 24) = 0.172771E+00 + PKER_RWETH( 24, 25) = 0.200484E+00 + PKER_RWETH( 24, 26) = 0.224227E+00 + PKER_RWETH( 24, 27) = 0.243806E+00 + PKER_RWETH( 24, 28) = 0.259757E+00 + PKER_RWETH( 24, 29) = 0.272723E+00 + PKER_RWETH( 24, 30) = 0.283268E+00 + PKER_RWETH( 24, 31) = 0.291856E+00 + PKER_RWETH( 24, 32) = 0.298861E+00 + PKER_RWETH( 24, 33) = 0.304583E+00 + PKER_RWETH( 24, 34) = 0.309264E+00 + PKER_RWETH( 24, 35) = 0.313098E+00 + PKER_RWETH( 24, 36) = 0.316243E+00 + PKER_RWETH( 24, 37) = 0.318825E+00 + PKER_RWETH( 24, 38) = 0.320946E+00 + PKER_RWETH( 24, 39) = 0.322691E+00 + PKER_RWETH( 24, 40) = 0.324127E+00 + PKER_RWETH( 25, 1) = 0.136022E+02 + PKER_RWETH( 25, 2) = 0.112133E+02 + PKER_RWETH( 25, 3) = 0.923550E+01 + PKER_RWETH( 25, 4) = 0.759789E+01 + PKER_RWETH( 25, 5) = 0.624194E+01 + PKER_RWETH( 25, 6) = 0.511914E+01 + PKER_RWETH( 25, 7) = 0.418934E+01 + PKER_RWETH( 25, 8) = 0.341929E+01 + PKER_RWETH( 25, 9) = 0.278148E+01 + PKER_RWETH( 25, 10) = 0.225311E+01 + PKER_RWETH( 25, 11) = 0.181534E+01 + PKER_RWETH( 25, 12) = 0.145255E+01 + PKER_RWETH( 25, 13) = 0.115185E+01 + PKER_RWETH( 25, 14) = 0.902595E+00 + PKER_RWETH( 25, 15) = 0.696094E+00 + PKER_RWETH( 25, 16) = 0.525430E+00 + PKER_RWETH( 25, 17) = 0.385484E+00 + PKER_RWETH( 25, 18) = 0.273126E+00 + PKER_RWETH( 25, 19) = 0.187350E+00 + PKER_RWETH( 25, 20) = 0.128722E+00 + PKER_RWETH( 25, 21) = 0.976342E-01 + PKER_RWETH( 25, 22) = 0.916722E-01 + PKER_RWETH( 25, 23) = 0.104476E+00 + PKER_RWETH( 25, 24) = 0.127358E+00 + PKER_RWETH( 25, 25) = 0.152684E+00 + PKER_RWETH( 25, 26) = 0.176023E+00 + PKER_RWETH( 25, 27) = 0.195832E+00 + PKER_RWETH( 25, 28) = 0.212116E+00 + PKER_RWETH( 25, 29) = 0.225373E+00 + PKER_RWETH( 25, 30) = 0.236148E+00 + PKER_RWETH( 25, 31) = 0.244912E+00 + PKER_RWETH( 25, 32) = 0.252049E+00 + PKER_RWETH( 25, 33) = 0.257870E+00 + PKER_RWETH( 25, 34) = 0.262625E+00 + PKER_RWETH( 25, 35) = 0.266514E+00 + PKER_RWETH( 25, 36) = 0.269700E+00 + PKER_RWETH( 25, 37) = 0.272313E+00 + PKER_RWETH( 25, 38) = 0.274458E+00 + PKER_RWETH( 25, 39) = 0.276220E+00 + PKER_RWETH( 25, 40) = 0.277669E+00 + PKER_RWETH( 26, 1) = 0.136413E+02 + PKER_RWETH( 26, 2) = 0.112526E+02 + PKER_RWETH( 26, 3) = 0.927503E+01 + PKER_RWETH( 26, 4) = 0.763768E+01 + PKER_RWETH( 26, 5) = 0.628200E+01 + PKER_RWETH( 26, 6) = 0.515948E+01 + PKER_RWETH( 26, 7) = 0.422997E+01 + PKER_RWETH( 26, 8) = 0.346023E+01 + PKER_RWETH( 26, 9) = 0.282275E+01 + PKER_RWETH( 26, 10) = 0.229473E+01 + PKER_RWETH( 26, 11) = 0.185731E+01 + PKER_RWETH( 26, 12) = 0.149489E+01 + PKER_RWETH( 26, 13) = 0.119454E+01 + PKER_RWETH( 26, 14) = 0.945593E+00 + PKER_RWETH( 26, 15) = 0.739243E+00 + PKER_RWETH( 26, 16) = 0.568324E+00 + PKER_RWETH( 26, 17) = 0.427174E+00 + PKER_RWETH( 26, 18) = 0.311688E+00 + PKER_RWETH( 26, 19) = 0.219506E+00 + PKER_RWETH( 26, 20) = 0.150065E+00 + PKER_RWETH( 26, 21) = 0.103983E+00 + PKER_RWETH( 26, 22) = 0.813323E-01 + PKER_RWETH( 26, 23) = 0.795339E-01 + PKER_RWETH( 26, 24) = 0.926187E-01 + PKER_RWETH( 26, 25) = 0.113085E+00 + PKER_RWETH( 26, 26) = 0.134774E+00 + PKER_RWETH( 26, 27) = 0.154384E+00 + PKER_RWETH( 26, 28) = 0.170899E+00 + PKER_RWETH( 26, 29) = 0.184441E+00 + PKER_RWETH( 26, 30) = 0.195459E+00 + PKER_RWETH( 26, 31) = 0.204415E+00 + PKER_RWETH( 26, 32) = 0.211698E+00 + PKER_RWETH( 26, 33) = 0.217630E+00 + PKER_RWETH( 26, 34) = 0.222469E+00 + PKER_RWETH( 26, 35) = 0.226420E+00 + PKER_RWETH( 26, 36) = 0.229653E+00 + PKER_RWETH( 26, 37) = 0.232300E+00 + PKER_RWETH( 26, 38) = 0.234471E+00 + PKER_RWETH( 26, 39) = 0.236253E+00 + PKER_RWETH( 26, 40) = 0.237716E+00 + PKER_RWETH( 27, 1) = 0.136746E+02 + PKER_RWETH( 27, 2) = 0.112861E+02 + PKER_RWETH( 27, 3) = 0.930868E+01 + PKER_RWETH( 27, 4) = 0.767152E+01 + PKER_RWETH( 27, 5) = 0.631604E+01 + PKER_RWETH( 27, 6) = 0.519374E+01 + PKER_RWETH( 27, 7) = 0.426447E+01 + PKER_RWETH( 27, 8) = 0.349498E+01 + PKER_RWETH( 27, 9) = 0.285775E+01 + PKER_RWETH( 27, 10) = 0.233001E+01 + PKER_RWETH( 27, 11) = 0.189288E+01 + PKER_RWETH( 27, 12) = 0.153076E+01 + PKER_RWETH( 27, 13) = 0.123072E+01 + PKER_RWETH( 27, 14) = 0.982064E+00 + PKER_RWETH( 27, 15) = 0.775961E+00 + PKER_RWETH( 27, 16) = 0.605136E+00 + PKER_RWETH( 27, 17) = 0.463679E+00 + PKER_RWETH( 27, 18) = 0.346968E+00 + PKER_RWETH( 27, 19) = 0.251737E+00 + PKER_RWETH( 27, 20) = 0.176232E+00 + PKER_RWETH( 27, 21) = 0.120216E+00 + PKER_RWETH( 27, 22) = 0.842855E-01 + PKER_RWETH( 27, 23) = 0.682432E-01 + PKER_RWETH( 27, 24) = 0.693968E-01 + PKER_RWETH( 27, 25) = 0.822195E-01 + PKER_RWETH( 27, 26) = 0.100330E+00 + PKER_RWETH( 27, 27) = 0.118826E+00 + PKER_RWETH( 27, 28) = 0.135271E+00 + PKER_RWETH( 27, 29) = 0.149030E+00 + PKER_RWETH( 27, 30) = 0.160290E+00 + PKER_RWETH( 27, 31) = 0.169449E+00 + PKER_RWETH( 27, 32) = 0.176893E+00 + PKER_RWETH( 27, 33) = 0.182947E+00 + PKER_RWETH( 27, 34) = 0.187879E+00 + PKER_RWETH( 27, 35) = 0.191900E+00 + PKER_RWETH( 27, 36) = 0.195185E+00 + PKER_RWETH( 27, 37) = 0.197872E+00 + PKER_RWETH( 27, 38) = 0.200072E+00 + PKER_RWETH( 27, 39) = 0.201876E+00 + PKER_RWETH( 27, 40) = 0.203356E+00 + PKER_RWETH( 28, 1) = 0.137029E+02 + PKER_RWETH( 28, 2) = 0.113146E+02 + PKER_RWETH( 28, 3) = 0.933732E+01 + PKER_RWETH( 28, 4) = 0.770032E+01 + PKER_RWETH( 28, 5) = 0.634501E+01 + PKER_RWETH( 28, 6) = 0.522288E+01 + PKER_RWETH( 28, 7) = 0.429379E+01 + PKER_RWETH( 28, 8) = 0.352449E+01 + PKER_RWETH( 28, 9) = 0.288747E+01 + PKER_RWETH( 28, 10) = 0.235994E+01 + PKER_RWETH( 28, 11) = 0.192305E+01 + PKER_RWETH( 28, 12) = 0.156117E+01 + PKER_RWETH( 28, 13) = 0.126138E+01 + PKER_RWETH( 28, 14) = 0.101298E+01 + PKER_RWETH( 28, 15) = 0.807124E+00 + PKER_RWETH( 28, 16) = 0.636495E+00 + PKER_RWETH( 28, 17) = 0.495081E+00 + PKER_RWETH( 28, 18) = 0.378020E+00 + PKER_RWETH( 28, 19) = 0.281548E+00 + PKER_RWETH( 28, 20) = 0.203081E+00 + PKER_RWETH( 28, 21) = 0.141353E+00 + PKER_RWETH( 28, 22) = 0.963613E-01 + PKER_RWETH( 28, 23) = 0.686158E-01 + PKER_RWETH( 28, 24) = 0.577003E-01 + PKER_RWETH( 28, 25) = 0.608435E-01 + PKER_RWETH( 28, 26) = 0.730535E-01 + PKER_RWETH( 28, 27) = 0.889343E-01 + PKER_RWETH( 28, 28) = 0.104643E+00 + PKER_RWETH( 28, 29) = 0.118411E+00 + PKER_RWETH( 28, 30) = 0.129868E+00 + PKER_RWETH( 28, 31) = 0.139231E+00 + PKER_RWETH( 28, 32) = 0.146844E+00 + PKER_RWETH( 28, 33) = 0.153033E+00 + PKER_RWETH( 28, 34) = 0.158067E+00 + PKER_RWETH( 28, 35) = 0.162167E+00 + PKER_RWETH( 28, 36) = 0.165510E+00 + PKER_RWETH( 28, 37) = 0.168241E+00 + PKER_RWETH( 28, 38) = 0.170474E+00 + PKER_RWETH( 28, 39) = 0.172303E+00 + PKER_RWETH( 28, 40) = 0.173802E+00 + PKER_RWETH( 29, 1) = 0.137271E+02 + PKER_RWETH( 29, 2) = 0.113389E+02 + PKER_RWETH( 29, 3) = 0.936173E+01 + PKER_RWETH( 29, 4) = 0.772485E+01 + PKER_RWETH( 29, 5) = 0.636967E+01 + PKER_RWETH( 29, 6) = 0.524768E+01 + PKER_RWETH( 29, 7) = 0.431873E+01 + PKER_RWETH( 29, 8) = 0.354959E+01 + PKER_RWETH( 29, 9) = 0.291273E+01 + PKER_RWETH( 29, 10) = 0.238537E+01 + PKER_RWETH( 29, 11) = 0.194865E+01 + PKER_RWETH( 29, 12) = 0.158696E+01 + PKER_RWETH( 29, 13) = 0.128738E+01 + PKER_RWETH( 29, 14) = 0.103919E+01 + PKER_RWETH( 29, 15) = 0.833552E+00 + PKER_RWETH( 29, 16) = 0.663125E+00 + PKER_RWETH( 29, 17) = 0.521865E+00 + PKER_RWETH( 29, 18) = 0.404804E+00 + PKER_RWETH( 29, 19) = 0.307944E+00 + PKER_RWETH( 29, 20) = 0.228229E+00 + PKER_RWETH( 29, 21) = 0.163636E+00 + PKER_RWETH( 29, 22) = 0.113284E+00 + PKER_RWETH( 29, 23) = 0.773180E-01 + PKER_RWETH( 29, 24) = 0.561494E-01 + PKER_RWETH( 29, 25) = 0.491502E-01 + PKER_RWETH( 29, 26) = 0.535664E-01 + PKER_RWETH( 29, 27) = 0.649274E-01 + PKER_RWETH( 29, 28) = 0.787521E-01 + PKER_RWETH( 29, 29) = 0.920477E-01 + PKER_RWETH( 29, 30) = 0.103558E+00 + PKER_RWETH( 29, 31) = 0.113095E+00 + PKER_RWETH( 29, 32) = 0.120880E+00 + PKER_RWETH( 29, 33) = 0.127210E+00 + PKER_RWETH( 29, 34) = 0.132356E+00 + PKER_RWETH( 29, 35) = 0.136542E+00 + PKER_RWETH( 29, 36) = 0.139951E+00 + PKER_RWETH( 29, 37) = 0.142731E+00 + PKER_RWETH( 29, 38) = 0.145001E+00 + PKER_RWETH( 29, 39) = 0.146858E+00 + PKER_RWETH( 29, 40) = 0.148378E+00 + PKER_RWETH( 30, 1) = 0.137477E+02 + PKER_RWETH( 30, 2) = 0.113596E+02 + PKER_RWETH( 30, 3) = 0.938254E+01 + PKER_RWETH( 30, 4) = 0.774576E+01 + PKER_RWETH( 30, 5) = 0.639068E+01 + PKER_RWETH( 30, 6) = 0.526879E+01 + PKER_RWETH( 30, 7) = 0.433996E+01 + PKER_RWETH( 30, 8) = 0.357094E+01 + PKER_RWETH( 30, 9) = 0.293420E+01 + PKER_RWETH( 30, 10) = 0.240698E+01 + PKER_RWETH( 30, 11) = 0.197041E+01 + PKER_RWETH( 30, 12) = 0.160887E+01 + PKER_RWETH( 30, 13) = 0.130945E+01 + PKER_RWETH( 30, 14) = 0.106143E+01 + PKER_RWETH( 30, 15) = 0.855966E+00 + PKER_RWETH( 30, 16) = 0.685719E+00 + PKER_RWETH( 30, 17) = 0.544626E+00 + PKER_RWETH( 30, 18) = 0.427680E+00 + PKER_RWETH( 30, 19) = 0.330783E+00 + PKER_RWETH( 30, 20) = 0.250649E+00 + PKER_RWETH( 30, 21) = 0.184810E+00 + PKER_RWETH( 30, 22) = 0.131698E+00 + PKER_RWETH( 30, 23) = 0.907310E-01 + PKER_RWETH( 30, 24) = 0.621333E-01 + PKER_RWETH( 30, 25) = 0.462193E-01 + PKER_RWETH( 30, 26) = 0.421662E-01 + PKER_RWETH( 30, 27) = 0.473138E-01 + PKER_RWETH( 30, 28) = 0.577107E-01 + PKER_RWETH( 30, 29) = 0.696596E-01 + PKER_RWETH( 30, 30) = 0.808783E-01 + PKER_RWETH( 30, 31) = 0.904907E-01 + PKER_RWETH( 30, 32) = 0.984276E-01 + PKER_RWETH( 30, 33) = 0.104901E+00 + PKER_RWETH( 30, 34) = 0.110165E+00 + PKER_RWETH( 30, 35) = 0.114443E+00 + PKER_RWETH( 30, 36) = 0.117924E+00 + PKER_RWETH( 30, 37) = 0.120759E+00 + PKER_RWETH( 30, 38) = 0.123072E+00 + PKER_RWETH( 30, 39) = 0.124960E+00 + PKER_RWETH( 30, 40) = 0.126503E+00 + PKER_RWETH( 31, 1) = 0.137654E+02 + PKER_RWETH( 31, 2) = 0.113773E+02 + PKER_RWETH( 31, 3) = 0.940030E+01 + PKER_RWETH( 31, 4) = 0.776359E+01 + PKER_RWETH( 31, 5) = 0.640859E+01 + PKER_RWETH( 31, 6) = 0.528679E+01 + PKER_RWETH( 31, 7) = 0.435805E+01 + PKER_RWETH( 31, 8) = 0.358912E+01 + PKER_RWETH( 31, 9) = 0.295248E+01 + PKER_RWETH( 31, 10) = 0.242536E+01 + PKER_RWETH( 31, 11) = 0.198890E+01 + PKER_RWETH( 31, 12) = 0.162749E+01 + PKER_RWETH( 31, 13) = 0.132819E+01 + PKER_RWETH( 31, 14) = 0.108031E+01 + PKER_RWETH( 31, 15) = 0.874986E+00 + PKER_RWETH( 31, 16) = 0.704888E+00 + PKER_RWETH( 31, 17) = 0.563945E+00 + PKER_RWETH( 31, 18) = 0.447136E+00 + PKER_RWETH( 31, 19) = 0.350322E+00 + PKER_RWETH( 31, 20) = 0.270119E+00 + PKER_RWETH( 31, 21) = 0.203836E+00 + PKER_RWETH( 31, 22) = 0.149485E+00 + PKER_RWETH( 31, 23) = 0.105870E+00 + PKER_RWETH( 31, 24) = 0.726361E-01 + PKER_RWETH( 31, 25) = 0.500546E-01 + PKER_RWETH( 31, 26) = 0.382950E-01 + PKER_RWETH( 31, 27) = 0.364238E-01 + PKER_RWETH( 31, 28) = 0.419002E-01 + PKER_RWETH( 31, 29) = 0.512768E-01 + PKER_RWETH( 31, 30) = 0.615456E-01 + PKER_RWETH( 31, 31) = 0.709877E-01 + PKER_RWETH( 31, 32) = 0.790080E-01 + PKER_RWETH( 31, 33) = 0.856118E-01 + PKER_RWETH( 31, 34) = 0.909951E-01 + PKER_RWETH( 31, 35) = 0.953723E-01 + PKER_RWETH( 31, 36) = 0.989311E-01 + PKER_RWETH( 31, 37) = 0.101826E+00 + PKER_RWETH( 31, 38) = 0.104185E+00 + PKER_RWETH( 31, 39) = 0.106108E+00 + PKER_RWETH( 31, 40) = 0.107678E+00 + PKER_RWETH( 32, 1) = 0.137804E+02 + PKER_RWETH( 32, 2) = 0.113924E+02 + PKER_RWETH( 32, 3) = 0.941546E+01 + PKER_RWETH( 32, 4) = 0.777881E+01 + PKER_RWETH( 32, 5) = 0.642387E+01 + PKER_RWETH( 32, 6) = 0.530214E+01 + PKER_RWETH( 32, 7) = 0.437346E+01 + PKER_RWETH( 32, 8) = 0.360461E+01 + PKER_RWETH( 32, 9) = 0.296805E+01 + PKER_RWETH( 32, 10) = 0.244102E+01 + PKER_RWETH( 32, 11) = 0.200464E+01 + PKER_RWETH( 32, 12) = 0.164332E+01 + PKER_RWETH( 32, 13) = 0.134412E+01 + PKER_RWETH( 32, 14) = 0.109635E+01 + PKER_RWETH( 32, 15) = 0.891139E+00 + PKER_RWETH( 32, 16) = 0.721160E+00 + PKER_RWETH( 32, 17) = 0.580341E+00 + PKER_RWETH( 32, 18) = 0.463657E+00 + PKER_RWETH( 32, 19) = 0.366953E+00 + PKER_RWETH( 32, 20) = 0.286807E+00 + PKER_RWETH( 32, 21) = 0.220427E+00 + PKER_RWETH( 32, 22) = 0.165613E+00 + PKER_RWETH( 32, 23) = 0.120775E+00 + PKER_RWETH( 32, 24) = 0.850138E-01 + PKER_RWETH( 32, 25) = 0.581425E-01 + PKER_RWETH( 32, 26) = 0.404419E-01 + PKER_RWETH( 32, 27) = 0.319552E-01 + PKER_RWETH( 32, 28) = 0.316626E-01 + PKER_RWETH( 32, 29) = 0.371741E-01 + PKER_RWETH( 32, 30) = 0.455292E-01 + PKER_RWETH( 32, 31) = 0.543130E-01 + PKER_RWETH( 32, 32) = 0.622423E-01 + PKER_RWETH( 32, 33) = 0.689293E-01 + PKER_RWETH( 32, 34) = 0.744234E-01 + PKER_RWETH( 32, 35) = 0.789005E-01 + PKER_RWETH( 32, 36) = 0.825413E-01 + PKER_RWETH( 32, 37) = 0.855015E-01 + PKER_RWETH( 32, 38) = 0.879101E-01 + PKER_RWETH( 32, 39) = 0.898719E-01 + PKER_RWETH( 32, 40) = 0.914716E-01 + PKER_RWETH( 33, 1) = 0.137933E+02 + PKER_RWETH( 33, 2) = 0.114053E+02 + PKER_RWETH( 33, 3) = 0.942841E+01 + PKER_RWETH( 33, 4) = 0.779180E+01 + PKER_RWETH( 33, 5) = 0.643691E+01 + PKER_RWETH( 33, 6) = 0.531523E+01 + PKER_RWETH( 33, 7) = 0.438661E+01 + PKER_RWETH( 33, 8) = 0.361782E+01 + PKER_RWETH( 33, 9) = 0.298132E+01 + PKER_RWETH( 33, 10) = 0.245435E+01 + PKER_RWETH( 33, 11) = 0.201805E+01 + PKER_RWETH( 33, 12) = 0.165680E+01 + PKER_RWETH( 33, 13) = 0.135768E+01 + PKER_RWETH( 33, 14) = 0.110999E+01 + PKER_RWETH( 33, 15) = 0.904867E+00 + PKER_RWETH( 33, 16) = 0.734983E+00 + PKER_RWETH( 33, 17) = 0.594264E+00 + PKER_RWETH( 33, 18) = 0.477684E+00 + PKER_RWETH( 33, 19) = 0.381084E+00 + PKER_RWETH( 33, 20) = 0.301025E+00 + PKER_RWETH( 33, 21) = 0.234678E+00 + PKER_RWETH( 33, 22) = 0.179744E+00 + PKER_RWETH( 33, 23) = 0.134427E+00 + PKER_RWETH( 33, 24) = 0.974646E-01 + PKER_RWETH( 33, 25) = 0.681937E-01 + PKER_RWETH( 33, 26) = 0.465543E-01 + PKER_RWETH( 33, 27) = 0.328007E-01 + PKER_RWETH( 33, 28) = 0.268706E-01 + PKER_RWETH( 33, 29) = 0.276742E-01 + PKER_RWETH( 33, 30) = 0.330242E-01 + PKER_RWETH( 33, 31) = 0.403935E-01 + PKER_RWETH( 33, 32) = 0.478738E-01 + PKER_RWETH( 33, 33) = 0.545206E-01 + PKER_RWETH( 33, 34) = 0.600926E-01 + PKER_RWETH( 33, 35) = 0.646634E-01 + PKER_RWETH( 33, 36) = 0.683873E-01 + PKER_RWETH( 33, 37) = 0.714159E-01 + PKER_RWETH( 33, 38) = 0.738787E-01 + PKER_RWETH( 33, 39) = 0.758827E-01 + PKER_RWETH( 33, 40) = 0.775149E-01 + PKER_RWETH( 34, 1) = 0.138043E+02 + PKER_RWETH( 34, 2) = 0.114163E+02 + PKER_RWETH( 34, 3) = 0.943947E+01 + PKER_RWETH( 34, 4) = 0.780291E+01 + PKER_RWETH( 34, 5) = 0.644805E+01 + PKER_RWETH( 34, 6) = 0.532642E+01 + PKER_RWETH( 34, 7) = 0.439784E+01 + PKER_RWETH( 34, 8) = 0.362909E+01 + PKER_RWETH( 34, 9) = 0.299264E+01 + PKER_RWETH( 34, 10) = 0.246572E+01 + PKER_RWETH( 34, 11) = 0.202947E+01 + PKER_RWETH( 34, 12) = 0.166828E+01 + PKER_RWETH( 34, 13) = 0.136922E+01 + PKER_RWETH( 34, 14) = 0.112160E+01 + PKER_RWETH( 34, 15) = 0.916545E+00 + PKER_RWETH( 34, 16) = 0.746735E+00 + PKER_RWETH( 34, 17) = 0.606095E+00 + PKER_RWETH( 34, 18) = 0.489599E+00 + PKER_RWETH( 34, 19) = 0.393086E+00 + PKER_RWETH( 34, 20) = 0.313112E+00 + PKER_RWETH( 34, 21) = 0.246834E+00 + PKER_RWETH( 34, 22) = 0.191912E+00 + PKER_RWETH( 34, 23) = 0.146456E+00 + PKER_RWETH( 34, 24) = 0.109003E+00 + PKER_RWETH( 34, 25) = 0.785586E-01 + PKER_RWETH( 34, 26) = 0.546497E-01 + PKER_RWETH( 34, 27) = 0.373003E-01 + PKER_RWETH( 34, 28) = 0.267289E-01 + PKER_RWETH( 34, 29) = 0.227683E-01 + PKER_RWETH( 34, 30) = 0.243048E-01 + PKER_RWETH( 34, 31) = 0.293552E-01 + PKER_RWETH( 34, 32) = 0.358030E-01 + PKER_RWETH( 34, 33) = 0.421486E-01 + PKER_RWETH( 34, 34) = 0.477119E-01 + PKER_RWETH( 34, 35) = 0.523530E-01 + PKER_RWETH( 34, 36) = 0.561555E-01 + PKER_RWETH( 34, 37) = 0.592533E-01 + PKER_RWETH( 34, 38) = 0.617731E-01 + PKER_RWETH( 34, 39) = 0.638224E-01 + PKER_RWETH( 34, 40) = 0.654901E-01 + PKER_RWETH( 35, 1) = 0.138137E+02 + PKER_RWETH( 35, 2) = 0.114258E+02 + PKER_RWETH( 35, 3) = 0.944893E+01 + PKER_RWETH( 35, 4) = 0.781240E+01 + PKER_RWETH( 35, 5) = 0.645758E+01 + PKER_RWETH( 35, 6) = 0.533597E+01 + PKER_RWETH( 35, 7) = 0.440743E+01 + PKER_RWETH( 35, 8) = 0.363871E+01 + PKER_RWETH( 35, 9) = 0.300230E+01 + PKER_RWETH( 35, 10) = 0.247542E+01 + PKER_RWETH( 35, 11) = 0.203922E+01 + PKER_RWETH( 35, 12) = 0.167807E+01 + PKER_RWETH( 35, 13) = 0.137906E+01 + PKER_RWETH( 35, 14) = 0.113148E+01 + PKER_RWETH( 35, 15) = 0.926485E+00 + PKER_RWETH( 35, 16) = 0.756733E+00 + PKER_RWETH( 35, 17) = 0.616156E+00 + PKER_RWETH( 35, 18) = 0.499726E+00 + PKER_RWETH( 35, 19) = 0.403283E+00 + PKER_RWETH( 35, 20) = 0.323383E+00 + PKER_RWETH( 35, 21) = 0.257174E+00 + PKER_RWETH( 35, 22) = 0.202305E+00 + PKER_RWETH( 35, 23) = 0.156843E+00 + PKER_RWETH( 35, 24) = 0.119234E+00 + PKER_RWETH( 35, 25) = 0.882933E-01 + PKER_RWETH( 35, 26) = 0.632437E-01 + PKER_RWETH( 35, 27) = 0.437614E-01 + PKER_RWETH( 35, 28) = 0.299201E-01 + PKER_RWETH( 35, 29) = 0.219008E-01 + PKER_RWETH( 35, 30) = 0.194367E-01 + PKER_RWETH( 35, 31) = 0.214285E-01 + PKER_RWETH( 35, 32) = 0.261037E-01 + PKER_RWETH( 35, 33) = 0.317007E-01 + PKER_RWETH( 35, 34) = 0.370659E-01 + PKER_RWETH( 35, 35) = 0.417162E-01 + PKER_RWETH( 35, 36) = 0.455807E-01 + PKER_RWETH( 35, 37) = 0.487442E-01 + PKER_RWETH( 35, 38) = 0.513216E-01 + PKER_RWETH( 35, 39) = 0.534183E-01 + PKER_RWETH( 35, 40) = 0.551239E-01 + PKER_RWETH( 36, 1) = 0.138217E+02 + PKER_RWETH( 36, 2) = 0.114338E+02 + PKER_RWETH( 36, 3) = 0.945703E+01 + PKER_RWETH( 36, 4) = 0.782051E+01 + PKER_RWETH( 36, 5) = 0.646572E+01 + PKER_RWETH( 36, 6) = 0.534413E+01 + PKER_RWETH( 36, 7) = 0.441562E+01 + PKER_RWETH( 36, 8) = 0.364693E+01 + PKER_RWETH( 36, 9) = 0.301055E+01 + PKER_RWETH( 36, 10) = 0.248370E+01 + PKER_RWETH( 36, 11) = 0.204753E+01 + PKER_RWETH( 36, 12) = 0.168642E+01 + PKER_RWETH( 36, 13) = 0.138744E+01 + PKER_RWETH( 36, 14) = 0.113991E+01 + PKER_RWETH( 36, 15) = 0.934954E+00 + PKER_RWETH( 36, 16) = 0.765248E+00 + PKER_RWETH( 36, 17) = 0.624718E+00 + PKER_RWETH( 36, 18) = 0.508341E+00 + PKER_RWETH( 36, 19) = 0.411953E+00 + PKER_RWETH( 36, 20) = 0.332112E+00 + PKER_RWETH( 36, 21) = 0.265964E+00 + PKER_RWETH( 36, 22) = 0.211152E+00 + PKER_RWETH( 36, 23) = 0.165729E+00 + PKER_RWETH( 36, 24) = 0.128099E+00 + PKER_RWETH( 36, 25) = 0.969879E-01 + PKER_RWETH( 36, 26) = 0.714385E-01 + PKER_RWETH( 36, 27) = 0.508527E-01 + PKER_RWETH( 36, 28) = 0.350208E-01 + PKER_RWETH( 36, 29) = 0.240492E-01 + PKER_RWETH( 36, 30) = 0.180569E-01 + PKER_RWETH( 36, 31) = 0.167148E-01 + PKER_RWETH( 36, 32) = 0.189530E-01 + PKER_RWETH( 36, 33) = 0.232085E-01 + PKER_RWETH( 36, 34) = 0.280365E-01 + PKER_RWETH( 36, 35) = 0.325598E-01 + PKER_RWETH( 36, 36) = 0.364432E-01 + PKER_RWETH( 36, 37) = 0.396603E-01 + PKER_RWETH( 36, 38) = 0.422924E-01 + PKER_RWETH( 36, 39) = 0.444370E-01 + PKER_RWETH( 36, 40) = 0.461821E-01 + PKER_RWETH( 37, 1) = 0.138286E+02 + PKER_RWETH( 37, 2) = 0.114408E+02 + PKER_RWETH( 37, 3) = 0.946395E+01 + PKER_RWETH( 37, 4) = 0.782746E+01 + PKER_RWETH( 37, 5) = 0.647268E+01 + PKER_RWETH( 37, 6) = 0.535111E+01 + PKER_RWETH( 37, 7) = 0.442262E+01 + PKER_RWETH( 37, 8) = 0.365395E+01 + PKER_RWETH( 37, 9) = 0.301760E+01 + PKER_RWETH( 37, 10) = 0.249077E+01 + PKER_RWETH( 37, 11) = 0.205463E+01 + PKER_RWETH( 37, 12) = 0.169354E+01 + PKER_RWETH( 37, 13) = 0.139460E+01 + PKER_RWETH( 37, 14) = 0.114709E+01 + PKER_RWETH( 37, 15) = 0.942174E+00 + PKER_RWETH( 37, 16) = 0.772503E+00 + PKER_RWETH( 37, 17) = 0.632012E+00 + PKER_RWETH( 37, 18) = 0.515675E+00 + PKER_RWETH( 37, 19) = 0.419331E+00 + PKER_RWETH( 37, 20) = 0.339536E+00 + PKER_RWETH( 37, 21) = 0.273438E+00 + PKER_RWETH( 37, 22) = 0.218676E+00 + PKER_RWETH( 37, 23) = 0.173299E+00 + PKER_RWETH( 37, 24) = 0.135696E+00 + PKER_RWETH( 37, 25) = 0.104551E+00 + PKER_RWETH( 37, 26) = 0.788199E-01 + PKER_RWETH( 37, 27) = 0.577354E-01 + PKER_RWETH( 37, 28) = 0.408418E-01 + PKER_RWETH( 37, 29) = 0.280163E-01 + PKER_RWETH( 37, 30) = 0.193782E-01 + PKER_RWETH( 37, 31) = 0.149908E-01 + PKER_RWETH( 37, 32) = 0.144734E-01 + PKER_RWETH( 37, 33) = 0.168026E-01 + PKER_RWETH( 37, 34) = 0.206235E-01 + PKER_RWETH( 37, 35) = 0.247667E-01 + PKER_RWETH( 37, 36) = 0.285711E-01 + PKER_RWETH( 37, 37) = 0.318112E-01 + PKER_RWETH( 37, 38) = 0.344891E-01 + PKER_RWETH( 37, 39) = 0.366792E-01 + PKER_RWETH( 37, 40) = 0.384641E-01 + PKER_RWETH( 38, 1) = 0.138345E+02 + PKER_RWETH( 38, 2) = 0.114467E+02 + PKER_RWETH( 38, 3) = 0.946988E+01 + PKER_RWETH( 38, 4) = 0.783340E+01 + PKER_RWETH( 38, 5) = 0.647863E+01 + PKER_RWETH( 38, 6) = 0.535709E+01 + PKER_RWETH( 38, 7) = 0.442861E+01 + PKER_RWETH( 38, 8) = 0.365996E+01 + PKER_RWETH( 38, 9) = 0.302362E+01 + PKER_RWETH( 38, 10) = 0.249682E+01 + PKER_RWETH( 38, 11) = 0.206069E+01 + PKER_RWETH( 38, 12) = 0.169963E+01 + PKER_RWETH( 38, 13) = 0.140071E+01 + PKER_RWETH( 38, 14) = 0.115323E+01 + PKER_RWETH( 38, 15) = 0.948333E+00 + PKER_RWETH( 38, 16) = 0.778690E+00 + PKER_RWETH( 38, 17) = 0.638228E+00 + PKER_RWETH( 38, 18) = 0.521923E+00 + PKER_RWETH( 38, 19) = 0.425613E+00 + PKER_RWETH( 38, 20) = 0.345854E+00 + PKER_RWETH( 38, 21) = 0.279795E+00 + PKER_RWETH( 38, 22) = 0.225075E+00 + PKER_RWETH( 38, 23) = 0.179739E+00 + PKER_RWETH( 38, 24) = 0.142173E+00 + PKER_RWETH( 38, 25) = 0.111044E+00 + PKER_RWETH( 38, 26) = 0.852693E-01 + PKER_RWETH( 38, 27) = 0.639938E-01 + PKER_RWETH( 38, 28) = 0.466054E-01 + PKER_RWETH( 38, 29) = 0.327645E-01 + PKER_RWETH( 38, 30) = 0.224136E-01 + PKER_RWETH( 38, 31) = 0.156672E-01 + PKER_RWETH( 38, 32) = 0.125407E-01 + PKER_RWETH( 38, 33) = 0.126088E-01 + PKER_RWETH( 38, 34) = 0.149224E-01 + PKER_RWETH( 38, 35) = 0.183139E-01 + PKER_RWETH( 38, 36) = 0.218522E-01 + PKER_RWETH( 38, 37) = 0.250453E-01 + PKER_RWETH( 38, 38) = 0.277469E-01 + PKER_RWETH( 38, 39) = 0.299758E-01 + PKER_RWETH( 38, 40) = 0.317985E-01 + PKER_RWETH( 39, 1) = 0.138396E+02 + PKER_RWETH( 39, 2) = 0.114517E+02 + PKER_RWETH( 39, 3) = 0.947496E+01 + PKER_RWETH( 39, 4) = 0.783849E+01 + PKER_RWETH( 39, 5) = 0.648373E+01 + PKER_RWETH( 39, 6) = 0.536220E+01 + PKER_RWETH( 39, 7) = 0.443373E+01 + PKER_RWETH( 39, 8) = 0.366510E+01 + PKER_RWETH( 39, 9) = 0.302877E+01 + PKER_RWETH( 39, 10) = 0.250199E+01 + PKER_RWETH( 39, 11) = 0.206588E+01 + PKER_RWETH( 39, 12) = 0.170483E+01 + PKER_RWETH( 39, 13) = 0.140593E+01 + PKER_RWETH( 39, 14) = 0.115847E+01 + PKER_RWETH( 39, 15) = 0.953590E+00 + PKER_RWETH( 39, 16) = 0.783969E+00 + PKER_RWETH( 39, 17) = 0.643530E+00 + PKER_RWETH( 39, 18) = 0.527250E+00 + PKER_RWETH( 39, 19) = 0.430966E+00 + PKER_RWETH( 39, 20) = 0.351236E+00 + PKER_RWETH( 39, 21) = 0.285208E+00 + PKER_RWETH( 39, 22) = 0.230520E+00 + PKER_RWETH( 39, 23) = 0.185219E+00 + PKER_RWETH( 39, 24) = 0.147687E+00 + PKER_RWETH( 39, 25) = 0.116587E+00 + PKER_RWETH( 39, 26) = 0.908192E-01 + PKER_RWETH( 39, 27) = 0.694900E-01 + PKER_RWETH( 39, 28) = 0.519037E-01 + PKER_RWETH( 39, 29) = 0.375752E-01 + PKER_RWETH( 39, 30) = 0.262572E-01 + PKER_RWETH( 39, 31) = 0.179379E-01 + PKER_RWETH( 39, 32) = 0.127211E-01 + PKER_RWETH( 39, 33) = 0.105726E-01 + PKER_RWETH( 39, 34) = 0.110445E-01 + PKER_RWETH( 39, 35) = 0.132652E-01 + PKER_RWETH( 39, 36) = 0.162488E-01 + PKER_RWETH( 39, 37) = 0.192576E-01 + PKER_RWETH( 39, 38) = 0.219332E-01 + PKER_RWETH( 39, 39) = 0.241847E-01 + PKER_RWETH( 39, 40) = 0.260398E-01 + PKER_RWETH( 40, 1) = 0.138439E+02 + PKER_RWETH( 40, 2) = 0.114561E+02 + PKER_RWETH( 40, 3) = 0.947930E+01 + PKER_RWETH( 40, 4) = 0.784284E+01 + PKER_RWETH( 40, 5) = 0.648810E+01 + PKER_RWETH( 40, 6) = 0.536657E+01 + PKER_RWETH( 40, 7) = 0.443812E+01 + PKER_RWETH( 40, 8) = 0.366949E+01 + PKER_RWETH( 40, 9) = 0.303318E+01 + PKER_RWETH( 40, 10) = 0.250641E+01 + PKER_RWETH( 40, 11) = 0.207031E+01 + PKER_RWETH( 40, 12) = 0.170928E+01 + PKER_RWETH( 40, 13) = 0.141039E+01 + PKER_RWETH( 40, 14) = 0.116294E+01 + PKER_RWETH( 40, 15) = 0.958081E+00 + PKER_RWETH( 40, 16) = 0.788476E+00 + PKER_RWETH( 40, 17) = 0.648056E+00 + PKER_RWETH( 40, 18) = 0.531794E+00 + PKER_RWETH( 40, 19) = 0.435532E+00 + PKER_RWETH( 40, 20) = 0.355824E+00 + PKER_RWETH( 40, 21) = 0.289819E+00 + PKER_RWETH( 40, 22) = 0.235157E+00 + PKER_RWETH( 40, 23) = 0.189883E+00 + PKER_RWETH( 40, 24) = 0.152380E+00 + PKER_RWETH( 40, 25) = 0.121308E+00 + PKER_RWETH( 40, 26) = 0.955623E-01 + PKER_RWETH( 40, 27) = 0.742324E-01 + PKER_RWETH( 40, 28) = 0.565844E-01 + PKER_RWETH( 40, 29) = 0.420531E-01 + PKER_RWETH( 40, 30) = 0.302574E-01 + PKER_RWETH( 40, 31) = 0.210233E-01 + PKER_RWETH( 40, 32) = 0.143677E-01 + PKER_RWETH( 40, 33) = 0.103816E-01 + PKER_RWETH( 40, 34) = 0.898239E-02 + PKER_RWETH( 40, 35) = 0.971795E-02 + PKER_RWETH( 40, 36) = 0.118003E-01 + PKER_RWETH( 40, 37) = 0.144020E-01 + PKER_RWETH( 40, 38) = 0.169513E-01 + PKER_RWETH( 40, 39) = 0.191899E-01 + PKER_RWETH( 40, 40) = 0.210656E-01 +END IF +! +END SUBROUTINE READ_XKER_RWETH diff --git a/src/mesonh/micro/read_xker_sdryg.f90 b/src/mesonh/micro/read_xker_sdryg.f90 new file mode 100644 index 000000000..0164c5736 --- /dev/null +++ b/src/mesonh/micro/read_xker_sdryg.f90 @@ -0,0 +1,3337 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 init 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ########################### + MODULE MODI_READ_XKER_SDRYG +! ########################### +! +INTERFACE + SUBROUTINE READ_XKER_SDRYG (KDRYLBDAG,KDRYLBDAS,KND, & + PALPHAG,PNUG,PALPHAS,PNUS,PEGS,PBS,PCG,PDG,PCS,PDS, & + PDRYLBDAG_MAX,PDRYLBDAS_MAX,PDRYLBDAG_MIN,PDRYLBDAS_MIN, & + PFDINFTY,PKER_SDRYG ) +! +INTEGER, INTENT(OUT) :: KND,KDRYLBDAG,KDRYLBDAS +REAL, INTENT(OUT) :: PALPHAG +REAL, INTENT(OUT) :: PNUG +REAL, INTENT(OUT) :: PALPHAS +REAL, INTENT(OUT) :: PNUS +REAL, INTENT(OUT) :: PEGS +REAL, INTENT(OUT) :: PBS +REAL, INTENT(OUT) :: PCG +REAL, INTENT(OUT) :: PDG +REAL, INTENT(OUT) :: PCS +REAL, INTENT(OUT) :: PDS +REAL, INTENT(OUT) :: PDRYLBDAG_MAX +REAL, INTENT(OUT) :: PDRYLBDAS_MAX +REAL, INTENT(OUT) :: PDRYLBDAG_MIN +REAL, INTENT(OUT) :: PDRYLBDAS_MIN +REAL, INTENT(OUT) :: PFDINFTY +REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PKER_SDRYG +! +END SUBROUTINE +! +END INTERFACE +! +END MODULE MODI_READ_XKER_SDRYG +! ######################################################################## + SUBROUTINE READ_XKER_SDRYG (KDRYLBDAG,KDRYLBDAS,KND, & + PALPHAG,PNUG,PALPHAS,PNUS,PEGS,PBS,PCG,PDG,PCS,PDS, & + PDRYLBDAG_MAX,PDRYLBDAS_MAX,PDRYLBDAG_MIN,PDRYLBDAS_MIN, & + PFDINFTY,PKER_SDRYG ) +! ######################################################################## +! +!!**** * * - initialize the kernels for the snow-graupel dry growth process +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to initialize the kernels PKER_SDRYG +!! prepared from a previous run of the routine INI_RAIN_ICE. The reading +!! of the kernels is optional after checking for the dimensions of the +!! arrays. +!! +!!** METHOD +!! ------ +!! +!! +!! EXTERNAL +!! -------- +!! None +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! Book2 of documentation ( routine READ_XKER_SDRYG ) +!! +!! AUTHOR +!! ------ +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original 09/04/96 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +!* 0.2 Declarations of local variables : +! +! +INTEGER, INTENT(OUT) :: KND,KDRYLBDAG,KDRYLBDAS +REAL, INTENT(OUT) :: PALPHAG +REAL, INTENT(OUT) :: PNUG +REAL, INTENT(OUT) :: PALPHAS +REAL, INTENT(OUT) :: PNUS +REAL, INTENT(OUT) :: PEGS +REAL, INTENT(OUT) :: PBS +REAL, INTENT(OUT) :: PCG +REAL, INTENT(OUT) :: PDG +REAL, INTENT(OUT) :: PCS +REAL, INTENT(OUT) :: PDS +REAL, INTENT(OUT) :: PDRYLBDAG_MAX +REAL, INTENT(OUT) :: PDRYLBDAS_MAX +REAL, INTENT(OUT) :: PDRYLBDAG_MIN +REAL, INTENT(OUT) :: PDRYLBDAS_MIN +REAL, INTENT(OUT) :: PFDINFTY +REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PKER_SDRYG +! +! ################################################################### +! #INSERT HERE THE OUTPUT OF INI_RAIN_ICE IF THE KERNELS ARE UPDATED# +! ################################################################### +! +KND= 50 +KDRYLBDAG= 40 +KDRYLBDAS= 80 +PALPHAG= 0.100000E+01 +PNUG= 0.100000E+01 +PALPHAS= 0.100000E+01 +PNUS= 0.100000E+01 +PEGS= 0.100000E+01 +PBS= 0.190000E+01 +PCG= 0.124000E+03 +PDG= 0.660000E+00 +PCS= 0.510000E+01 +PDS= 0.270000E+00 +PDRYLBDAG_MAX= 0.100000E+08 +PDRYLBDAS_MAX= 0.250000E+10 +PDRYLBDAG_MIN= 0.100000E+04 +PDRYLBDAS_MIN= 0.250000E+02 +PFDINFTY= 0.200000E+02 +! +IF( PRESENT(PKER_SDRYG) ) THEN + PKER_SDRYG( 1, 1) = 0.185306E+01 + PKER_SDRYG( 1, 2) = 0.166801E+01 + PKER_SDRYG( 1, 3) = 0.149854E+01 + PKER_SDRYG( 1, 4) = 0.134462E+01 + PKER_SDRYG( 1, 5) = 0.120619E+01 + PKER_SDRYG( 1, 6) = 0.108309E+01 + PKER_SDRYG( 1, 7) = 0.975739E+00 + PKER_SDRYG( 1, 8) = 0.883962E+00 + PKER_SDRYG( 1, 9) = 0.807898E+00 + PKER_SDRYG( 1, 10) = 0.748063E+00 + PKER_SDRYG( 1, 11) = 0.704887E+00 + PKER_SDRYG( 1, 12) = 0.678484E+00 + PKER_SDRYG( 1, 13) = 0.670243E+00 + PKER_SDRYG( 1, 14) = 0.680669E+00 + PKER_SDRYG( 1, 15) = 0.710449E+00 + PKER_SDRYG( 1, 16) = 0.760420E+00 + PKER_SDRYG( 1, 17) = 0.829980E+00 + PKER_SDRYG( 1, 18) = 0.918211E+00 + PKER_SDRYG( 1, 19) = 0.102260E+01 + PKER_SDRYG( 1, 20) = 0.113834E+01 + PKER_SDRYG( 1, 21) = 0.125954E+01 + PKER_SDRYG( 1, 22) = 0.138067E+01 + PKER_SDRYG( 1, 23) = 0.149733E+01 + PKER_SDRYG( 1, 24) = 0.160649E+01 + PKER_SDRYG( 1, 25) = 0.170617E+01 + PKER_SDRYG( 1, 26) = 0.179534E+01 + PKER_SDRYG( 1, 27) = 0.187393E+01 + PKER_SDRYG( 1, 28) = 0.194253E+01 + PKER_SDRYG( 1, 29) = 0.200219E+01 + PKER_SDRYG( 1, 30) = 0.205413E+01 + PKER_SDRYG( 1, 31) = 0.209956E+01 + PKER_SDRYG( 1, 32) = 0.213951E+01 + PKER_SDRYG( 1, 33) = 0.217487E+01 + PKER_SDRYG( 1, 34) = 0.220635E+01 + PKER_SDRYG( 1, 35) = 0.223455E+01 + PKER_SDRYG( 1, 36) = 0.225995E+01 + PKER_SDRYG( 1, 37) = 0.228296E+01 + PKER_SDRYG( 1, 38) = 0.230390E+01 + PKER_SDRYG( 1, 39) = 0.232304E+01 + PKER_SDRYG( 1, 40) = 0.234059E+01 + PKER_SDRYG( 1, 41) = 0.235674E+01 + PKER_SDRYG( 1, 42) = 0.237165E+01 + PKER_SDRYG( 1, 43) = 0.238545E+01 + PKER_SDRYG( 1, 44) = 0.239825E+01 + PKER_SDRYG( 1, 45) = 0.241013E+01 + PKER_SDRYG( 1, 46) = 0.242119E+01 + PKER_SDRYG( 1, 47) = 0.243150E+01 + PKER_SDRYG( 1, 48) = 0.244112E+01 + PKER_SDRYG( 1, 49) = 0.245010E+01 + PKER_SDRYG( 1, 50) = 0.245849E+01 + PKER_SDRYG( 1, 51) = 0.246634E+01 + PKER_SDRYG( 1, 52) = 0.247369E+01 + PKER_SDRYG( 1, 53) = 0.248057E+01 + PKER_SDRYG( 1, 54) = 0.248702E+01 + PKER_SDRYG( 1, 55) = 0.249305E+01 + PKER_SDRYG( 1, 56) = 0.249872E+01 + PKER_SDRYG( 1, 57) = 0.250402E+01 + PKER_SDRYG( 1, 58) = 0.250900E+01 + PKER_SDRYG( 1, 59) = 0.251367E+01 + PKER_SDRYG( 1, 60) = 0.251805E+01 + PKER_SDRYG( 1, 61) = 0.252217E+01 + PKER_SDRYG( 1, 62) = 0.252602E+01 + PKER_SDRYG( 1, 63) = 0.252964E+01 + PKER_SDRYG( 1, 64) = 0.253304E+01 + PKER_SDRYG( 1, 65) = 0.253623E+01 + PKER_SDRYG( 1, 66) = 0.253923E+01 + PKER_SDRYG( 1, 67) = 0.254204E+01 + PKER_SDRYG( 1, 68) = 0.254468E+01 + PKER_SDRYG( 1, 69) = 0.254715E+01 + PKER_SDRYG( 1, 70) = 0.254948E+01 + PKER_SDRYG( 1, 71) = 0.255166E+01 + PKER_SDRYG( 1, 72) = 0.255371E+01 + PKER_SDRYG( 1, 73) = 0.255564E+01 + PKER_SDRYG( 1, 74) = 0.255745E+01 + PKER_SDRYG( 1, 75) = 0.255914E+01 + PKER_SDRYG( 1, 76) = 0.256074E+01 + PKER_SDRYG( 1, 77) = 0.256223E+01 + PKER_SDRYG( 1, 78) = 0.256364E+01 + PKER_SDRYG( 1, 79) = 0.256496E+01 + PKER_SDRYG( 1, 80) = 0.256619E+01 + PKER_SDRYG( 2, 1) = 0.203397E+01 + PKER_SDRYG( 2, 2) = 0.184139E+01 + PKER_SDRYG( 2, 3) = 0.166253E+01 + PKER_SDRYG( 2, 4) = 0.149734E+01 + PKER_SDRYG( 2, 5) = 0.134545E+01 + PKER_SDRYG( 2, 6) = 0.120699E+01 + PKER_SDRYG( 2, 7) = 0.108196E+01 + PKER_SDRYG( 2, 8) = 0.970394E+00 + PKER_SDRYG( 2, 9) = 0.872467E+00 + PKER_SDRYG( 2, 10) = 0.788381E+00 + PKER_SDRYG( 2, 11) = 0.718584E+00 + PKER_SDRYG( 2, 12) = 0.663446E+00 + PKER_SDRYG( 2, 13) = 0.623736E+00 + PKER_SDRYG( 2, 14) = 0.600108E+00 + PKER_SDRYG( 2, 15) = 0.593535E+00 + PKER_SDRYG( 2, 16) = 0.605004E+00 + PKER_SDRYG( 2, 17) = 0.635005E+00 + PKER_SDRYG( 2, 18) = 0.683561E+00 + PKER_SDRYG( 2, 19) = 0.749784E+00 + PKER_SDRYG( 2, 20) = 0.831464E+00 + PKER_SDRYG( 2, 21) = 0.925362E+00 + PKER_SDRYG( 2, 22) = 0.102652E+01 + PKER_SDRYG( 2, 23) = 0.112960E+01 + PKER_SDRYG( 2, 24) = 0.122990E+01 + PKER_SDRYG( 2, 25) = 0.132422E+01 + PKER_SDRYG( 2, 26) = 0.141069E+01 + PKER_SDRYG( 2, 27) = 0.148870E+01 + PKER_SDRYG( 2, 28) = 0.155812E+01 + PKER_SDRYG( 2, 29) = 0.161933E+01 + PKER_SDRYG( 2, 30) = 0.167302E+01 + PKER_SDRYG( 2, 31) = 0.172003E+01 + PKER_SDRYG( 2, 32) = 0.176131E+01 + PKER_SDRYG( 2, 33) = 0.179774E+01 + PKER_SDRYG( 2, 34) = 0.183007E+01 + PKER_SDRYG( 2, 35) = 0.185895E+01 + PKER_SDRYG( 2, 36) = 0.188489E+01 + PKER_SDRYG( 2, 37) = 0.190831E+01 + PKER_SDRYG( 2, 38) = 0.192958E+01 + PKER_SDRYG( 2, 39) = 0.194897E+01 + PKER_SDRYG( 2, 40) = 0.196672E+01 + PKER_SDRYG( 2, 41) = 0.198304E+01 + PKER_SDRYG( 2, 42) = 0.199807E+01 + PKER_SDRYG( 2, 43) = 0.201197E+01 + PKER_SDRYG( 2, 44) = 0.202484E+01 + PKER_SDRYG( 2, 45) = 0.203679E+01 + PKER_SDRYG( 2, 46) = 0.204790E+01 + PKER_SDRYG( 2, 47) = 0.205824E+01 + PKER_SDRYG( 2, 48) = 0.206789E+01 + PKER_SDRYG( 2, 49) = 0.207689E+01 + PKER_SDRYG( 2, 50) = 0.208530E+01 + PKER_SDRYG( 2, 51) = 0.209317E+01 + PKER_SDRYG( 2, 52) = 0.210053E+01 + PKER_SDRYG( 2, 53) = 0.210741E+01 + PKER_SDRYG( 2, 54) = 0.211387E+01 + PKER_SDRYG( 2, 55) = 0.211991E+01 + PKER_SDRYG( 2, 56) = 0.212558E+01 + PKER_SDRYG( 2, 57) = 0.213089E+01 + PKER_SDRYG( 2, 58) = 0.213587E+01 + PKER_SDRYG( 2, 59) = 0.214054E+01 + PKER_SDRYG( 2, 60) = 0.214493E+01 + PKER_SDRYG( 2, 61) = 0.214904E+01 + PKER_SDRYG( 2, 62) = 0.215290E+01 + PKER_SDRYG( 2, 63) = 0.215652E+01 + PKER_SDRYG( 2, 64) = 0.215992E+01 + PKER_SDRYG( 2, 65) = 0.216311E+01 + PKER_SDRYG( 2, 66) = 0.216610E+01 + PKER_SDRYG( 2, 67) = 0.216891E+01 + PKER_SDRYG( 2, 68) = 0.217155E+01 + PKER_SDRYG( 2, 69) = 0.217403E+01 + PKER_SDRYG( 2, 70) = 0.217636E+01 + PKER_SDRYG( 2, 71) = 0.217854E+01 + PKER_SDRYG( 2, 72) = 0.218059E+01 + PKER_SDRYG( 2, 73) = 0.218252E+01 + PKER_SDRYG( 2, 74) = 0.218432E+01 + PKER_SDRYG( 2, 75) = 0.218602E+01 + PKER_SDRYG( 2, 76) = 0.218761E+01 + PKER_SDRYG( 2, 77) = 0.218911E+01 + PKER_SDRYG( 2, 78) = 0.219051E+01 + PKER_SDRYG( 2, 79) = 0.219183E+01 + PKER_SDRYG( 2, 80) = 0.219307E+01 + PKER_SDRYG( 3, 1) = 0.219960E+01 + PKER_SDRYG( 3, 2) = 0.200376E+01 + PKER_SDRYG( 3, 3) = 0.182057E+01 + PKER_SDRYG( 3, 4) = 0.164957E+01 + PKER_SDRYG( 3, 5) = 0.149045E+01 + PKER_SDRYG( 3, 6) = 0.134297E+01 + PKER_SDRYG( 3, 7) = 0.120706E+01 + PKER_SDRYG( 3, 8) = 0.108261E+01 + PKER_SDRYG( 3, 9) = 0.969749E+00 + PKER_SDRYG( 3, 10) = 0.868633E+00 + PKER_SDRYG( 3, 11) = 0.779309E+00 + PKER_SDRYG( 3, 12) = 0.702567E+00 + PKER_SDRYG( 3, 13) = 0.638634E+00 + PKER_SDRYG( 3, 14) = 0.588095E+00 + PKER_SDRYG( 3, 15) = 0.552053E+00 + PKER_SDRYG( 3, 16) = 0.531341E+00 + PKER_SDRYG( 3, 17) = 0.526715E+00 + PKER_SDRYG( 3, 18) = 0.539327E+00 + PKER_SDRYG( 3, 19) = 0.569229E+00 + PKER_SDRYG( 3, 20) = 0.615927E+00 + PKER_SDRYG( 3, 21) = 0.677810E+00 + PKER_SDRYG( 3, 22) = 0.751743E+00 + PKER_SDRYG( 3, 23) = 0.834002E+00 + PKER_SDRYG( 3, 24) = 0.920162E+00 + PKER_SDRYG( 3, 25) = 0.100577E+01 + PKER_SDRYG( 3, 26) = 0.108725E+01 + PKER_SDRYG( 3, 27) = 0.116248E+01 + PKER_SDRYG( 3, 28) = 0.123064E+01 + PKER_SDRYG( 3, 29) = 0.129168E+01 + PKER_SDRYG( 3, 30) = 0.134598E+01 + PKER_SDRYG( 3, 31) = 0.139406E+01 + PKER_SDRYG( 3, 32) = 0.143653E+01 + PKER_SDRYG( 3, 33) = 0.147406E+01 + PKER_SDRYG( 3, 34) = 0.150732E+01 + PKER_SDRYG( 3, 35) = 0.153694E+01 + PKER_SDRYG( 3, 36) = 0.156346E+01 + PKER_SDRYG( 3, 37) = 0.158735E+01 + PKER_SDRYG( 3, 38) = 0.160898E+01 + PKER_SDRYG( 3, 39) = 0.162866E+01 + PKER_SDRYG( 3, 40) = 0.164664E+01 + PKER_SDRYG( 3, 41) = 0.166312E+01 + PKER_SDRYG( 3, 42) = 0.167830E+01 + PKER_SDRYG( 3, 43) = 0.169230E+01 + PKER_SDRYG( 3, 44) = 0.170526E+01 + PKER_SDRYG( 3, 45) = 0.171727E+01 + PKER_SDRYG( 3, 46) = 0.172843E+01 + PKER_SDRYG( 3, 47) = 0.173882E+01 + PKER_SDRYG( 3, 48) = 0.174850E+01 + PKER_SDRYG( 3, 49) = 0.175753E+01 + PKER_SDRYG( 3, 50) = 0.176596E+01 + PKER_SDRYG( 3, 51) = 0.177384E+01 + PKER_SDRYG( 3, 52) = 0.178121E+01 + PKER_SDRYG( 3, 53) = 0.178811E+01 + PKER_SDRYG( 3, 54) = 0.179457E+01 + PKER_SDRYG( 3, 55) = 0.180062E+01 + PKER_SDRYG( 3, 56) = 0.180629E+01 + PKER_SDRYG( 3, 57) = 0.181160E+01 + PKER_SDRYG( 3, 58) = 0.181659E+01 + PKER_SDRYG( 3, 59) = 0.182126E+01 + PKER_SDRYG( 3, 60) = 0.182565E+01 + PKER_SDRYG( 3, 61) = 0.182976E+01 + PKER_SDRYG( 3, 62) = 0.183362E+01 + PKER_SDRYG( 3, 63) = 0.183725E+01 + PKER_SDRYG( 3, 64) = 0.184065E+01 + PKER_SDRYG( 3, 65) = 0.184384E+01 + PKER_SDRYG( 3, 66) = 0.184683E+01 + PKER_SDRYG( 3, 67) = 0.184964E+01 + PKER_SDRYG( 3, 68) = 0.185228E+01 + PKER_SDRYG( 3, 69) = 0.185476E+01 + PKER_SDRYG( 3, 70) = 0.185709E+01 + PKER_SDRYG( 3, 71) = 0.185927E+01 + PKER_SDRYG( 3, 72) = 0.186132E+01 + PKER_SDRYG( 3, 73) = 0.186325E+01 + PKER_SDRYG( 3, 74) = 0.186505E+01 + PKER_SDRYG( 3, 75) = 0.186675E+01 + PKER_SDRYG( 3, 76) = 0.186834E+01 + PKER_SDRYG( 3, 77) = 0.186984E+01 + PKER_SDRYG( 3, 78) = 0.187124E+01 + PKER_SDRYG( 3, 79) = 0.187256E+01 + PKER_SDRYG( 3, 80) = 0.187380E+01 + PKER_SDRYG( 4, 1) = 0.234554E+01 + PKER_SDRYG( 4, 2) = 0.214868E+01 + PKER_SDRYG( 4, 3) = 0.196393E+01 + PKER_SDRYG( 4, 4) = 0.179065E+01 + PKER_SDRYG( 4, 5) = 0.162831E+01 + PKER_SDRYG( 4, 6) = 0.147653E+01 + PKER_SDRYG( 4, 7) = 0.133498E+01 + PKER_SDRYG( 4, 8) = 0.120339E+01 + PKER_SDRYG( 4, 9) = 0.108174E+01 + PKER_SDRYG( 4, 10) = 0.969881E+00 + PKER_SDRYG( 4, 11) = 0.868067E+00 + PKER_SDRYG( 4, 12) = 0.776438E+00 + PKER_SDRYG( 4, 13) = 0.695367E+00 + PKER_SDRYG( 4, 14) = 0.625282E+00 + PKER_SDRYG( 4, 15) = 0.566838E+00 + PKER_SDRYG( 4, 16) = 0.521003E+00 + PKER_SDRYG( 4, 17) = 0.488550E+00 + PKER_SDRYG( 4, 18) = 0.470631E+00 + PKER_SDRYG( 4, 19) = 0.468163E+00 + PKER_SDRYG( 4, 20) = 0.481689E+00 + PKER_SDRYG( 4, 21) = 0.511098E+00 + PKER_SDRYG( 4, 22) = 0.555153E+00 + PKER_SDRYG( 4, 23) = 0.611456E+00 + PKER_SDRYG( 4, 24) = 0.676720E+00 + PKER_SDRYG( 4, 25) = 0.747017E+00 + PKER_SDRYG( 4, 26) = 0.818743E+00 + PKER_SDRYG( 4, 27) = 0.888470E+00 + PKER_SDRYG( 4, 28) = 0.953813E+00 + PKER_SDRYG( 4, 29) = 0.101352E+01 + PKER_SDRYG( 4, 30) = 0.106728E+01 + PKER_SDRYG( 4, 31) = 0.111531E+01 + PKER_SDRYG( 4, 32) = 0.115816E+01 + PKER_SDRYG( 4, 33) = 0.119634E+01 + PKER_SDRYG( 4, 34) = 0.123037E+01 + PKER_SDRYG( 4, 35) = 0.126073E+01 + PKER_SDRYG( 4, 36) = 0.128788E+01 + PKER_SDRYG( 4, 37) = 0.131229E+01 + PKER_SDRYG( 4, 38) = 0.133432E+01 + PKER_SDRYG( 4, 39) = 0.135431E+01 + PKER_SDRYG( 4, 40) = 0.137254E+01 + PKER_SDRYG( 4, 41) = 0.138922E+01 + PKER_SDRYG( 4, 42) = 0.140455E+01 + PKER_SDRYG( 4, 43) = 0.141867E+01 + PKER_SDRYG( 4, 44) = 0.143172E+01 + PKER_SDRYG( 4, 45) = 0.144381E+01 + PKER_SDRYG( 4, 46) = 0.145503E+01 + PKER_SDRYG( 4, 47) = 0.146546E+01 + PKER_SDRYG( 4, 48) = 0.147517E+01 + PKER_SDRYG( 4, 49) = 0.148423E+01 + PKER_SDRYG( 4, 50) = 0.149268E+01 + PKER_SDRYG( 4, 51) = 0.150058E+01 + PKER_SDRYG( 4, 52) = 0.150797E+01 + PKER_SDRYG( 4, 53) = 0.151488E+01 + PKER_SDRYG( 4, 54) = 0.152134E+01 + PKER_SDRYG( 4, 55) = 0.152740E+01 + PKER_SDRYG( 4, 56) = 0.153308E+01 + PKER_SDRYG( 4, 57) = 0.153840E+01 + PKER_SDRYG( 4, 58) = 0.154339E+01 + PKER_SDRYG( 4, 59) = 0.154806E+01 + PKER_SDRYG( 4, 60) = 0.155245E+01 + PKER_SDRYG( 4, 61) = 0.155657E+01 + PKER_SDRYG( 4, 62) = 0.156043E+01 + PKER_SDRYG( 4, 63) = 0.156405E+01 + PKER_SDRYG( 4, 64) = 0.156745E+01 + PKER_SDRYG( 4, 65) = 0.157064E+01 + PKER_SDRYG( 4, 66) = 0.157364E+01 + PKER_SDRYG( 4, 67) = 0.157645E+01 + PKER_SDRYG( 4, 68) = 0.157909E+01 + PKER_SDRYG( 4, 69) = 0.158157E+01 + PKER_SDRYG( 4, 70) = 0.158389E+01 + PKER_SDRYG( 4, 71) = 0.158608E+01 + PKER_SDRYG( 4, 72) = 0.158813E+01 + PKER_SDRYG( 4, 73) = 0.159005E+01 + PKER_SDRYG( 4, 74) = 0.159186E+01 + PKER_SDRYG( 4, 75) = 0.159356E+01 + PKER_SDRYG( 4, 76) = 0.159515E+01 + PKER_SDRYG( 4, 77) = 0.159665E+01 + PKER_SDRYG( 4, 78) = 0.159805E+01 + PKER_SDRYG( 4, 79) = 0.159937E+01 + PKER_SDRYG( 4, 80) = 0.160061E+01 + PKER_SDRYG( 5, 1) = 0.247163E+01 + PKER_SDRYG( 5, 2) = 0.227466E+01 + PKER_SDRYG( 5, 3) = 0.208958E+01 + PKER_SDRYG( 5, 4) = 0.191571E+01 + PKER_SDRYG( 5, 5) = 0.175239E+01 + PKER_SDRYG( 5, 6) = 0.159906E+01 + PKER_SDRYG( 5, 7) = 0.145522E+01 + PKER_SDRYG( 5, 8) = 0.132049E+01 + PKER_SDRYG( 5, 9) = 0.119453E+01 + PKER_SDRYG( 5, 10) = 0.107714E+01 + PKER_SDRYG( 5, 11) = 0.968196E+00 + PKER_SDRYG( 5, 12) = 0.867771E+00 + PKER_SDRYG( 5, 13) = 0.775878E+00 + PKER_SDRYG( 5, 14) = 0.692883E+00 + PKER_SDRYG( 5, 15) = 0.619198E+00 + PKER_SDRYG( 5, 16) = 0.555232E+00 + PKER_SDRYG( 5, 17) = 0.502129E+00 + PKER_SDRYG( 5, 18) = 0.460636E+00 + PKER_SDRYG( 5, 19) = 0.431732E+00 + PKER_SDRYG( 5, 20) = 0.416649E+00 + PKER_SDRYG( 5, 21) = 0.416143E+00 + PKER_SDRYG( 5, 22) = 0.430263E+00 + PKER_SDRYG( 5, 23) = 0.458530E+00 + PKER_SDRYG( 5, 24) = 0.499025E+00 + PKER_SDRYG( 5, 25) = 0.549068E+00 + PKER_SDRYG( 5, 26) = 0.605236E+00 + PKER_SDRYG( 5, 27) = 0.664063E+00 + PKER_SDRYG( 5, 28) = 0.722681E+00 + PKER_SDRYG( 5, 29) = 0.778798E+00 + PKER_SDRYG( 5, 30) = 0.830925E+00 + PKER_SDRYG( 5, 31) = 0.878310E+00 + PKER_SDRYG( 5, 32) = 0.920907E+00 + PKER_SDRYG( 5, 33) = 0.959072E+00 + PKER_SDRYG( 5, 34) = 0.993274E+00 + PKER_SDRYG( 5, 35) = 0.102398E+01 + PKER_SDRYG( 5, 36) = 0.105160E+01 + PKER_SDRYG( 5, 37) = 0.107647E+01 + PKER_SDRYG( 5, 38) = 0.109893E+01 + PKER_SDRYG( 5, 39) = 0.111927E+01 + PKER_SDRYG( 5, 40) = 0.113777E+01 + PKER_SDRYG( 5, 41) = 0.115467E+01 + PKER_SDRYG( 5, 42) = 0.117017E+01 + PKER_SDRYG( 5, 43) = 0.118442E+01 + PKER_SDRYG( 5, 44) = 0.119758E+01 + PKER_SDRYG( 5, 45) = 0.120975E+01 + PKER_SDRYG( 5, 46) = 0.122103E+01 + PKER_SDRYG( 5, 47) = 0.123151E+01 + PKER_SDRYG( 5, 48) = 0.124127E+01 + PKER_SDRYG( 5, 49) = 0.125035E+01 + PKER_SDRYG( 5, 50) = 0.125883E+01 + PKER_SDRYG( 5, 51) = 0.126675E+01 + PKER_SDRYG( 5, 52) = 0.127415E+01 + PKER_SDRYG( 5, 53) = 0.128107E+01 + PKER_SDRYG( 5, 54) = 0.128755E+01 + PKER_SDRYG( 5, 55) = 0.129361E+01 + PKER_SDRYG( 5, 56) = 0.129929E+01 + PKER_SDRYG( 5, 57) = 0.130462E+01 + PKER_SDRYG( 5, 58) = 0.130961E+01 + PKER_SDRYG( 5, 59) = 0.131429E+01 + PKER_SDRYG( 5, 60) = 0.131868E+01 + PKER_SDRYG( 5, 61) = 0.132280E+01 + PKER_SDRYG( 5, 62) = 0.132666E+01 + PKER_SDRYG( 5, 63) = 0.133028E+01 + PKER_SDRYG( 5, 64) = 0.133369E+01 + PKER_SDRYG( 5, 65) = 0.133688E+01 + PKER_SDRYG( 5, 66) = 0.133987E+01 + PKER_SDRYG( 5, 67) = 0.134269E+01 + PKER_SDRYG( 5, 68) = 0.134533E+01 + PKER_SDRYG( 5, 69) = 0.134781E+01 + PKER_SDRYG( 5, 70) = 0.135013E+01 + PKER_SDRYG( 5, 71) = 0.135232E+01 + PKER_SDRYG( 5, 72) = 0.135437E+01 + PKER_SDRYG( 5, 73) = 0.135629E+01 + PKER_SDRYG( 5, 74) = 0.135810E+01 + PKER_SDRYG( 5, 75) = 0.135980E+01 + PKER_SDRYG( 5, 76) = 0.136139E+01 + PKER_SDRYG( 5, 77) = 0.136289E+01 + PKER_SDRYG( 5, 78) = 0.136429E+01 + PKER_SDRYG( 5, 79) = 0.136561E+01 + PKER_SDRYG( 5, 80) = 0.136685E+01 + PKER_SDRYG( 6, 1) = 0.257972E+01 + PKER_SDRYG( 6, 2) = 0.238286E+01 + PKER_SDRYG( 6, 3) = 0.219787E+01 + PKER_SDRYG( 6, 4) = 0.202403E+01 + PKER_SDRYG( 6, 5) = 0.186062E+01 + PKER_SDRYG( 6, 6) = 0.170702E+01 + PKER_SDRYG( 6, 7) = 0.156262E+01 + PKER_SDRYG( 6, 8) = 0.142692E+01 + PKER_SDRYG( 6, 9) = 0.129944E+01 + PKER_SDRYG( 6, 10) = 0.117979E+01 + PKER_SDRYG( 6, 11) = 0.106768E+01 + PKER_SDRYG( 6, 12) = 0.962918E+00 + PKER_SDRYG( 6, 13) = 0.865347E+00 + PKER_SDRYG( 6, 14) = 0.775045E+00 + PKER_SDRYG( 6, 15) = 0.692083E+00 + PKER_SDRYG( 6, 16) = 0.616878E+00 + PKER_SDRYG( 6, 17) = 0.549875E+00 + PKER_SDRYG( 6, 18) = 0.491835E+00 + PKER_SDRYG( 6, 19) = 0.443555E+00 + PKER_SDRYG( 6, 20) = 0.406127E+00 + PKER_SDRYG( 6, 21) = 0.380824E+00 + PKER_SDRYG( 6, 22) = 0.368387E+00 + PKER_SDRYG( 6, 23) = 0.369445E+00 + PKER_SDRYG( 6, 24) = 0.383806E+00 + PKER_SDRYG( 6, 25) = 0.410216E+00 + PKER_SDRYG( 6, 26) = 0.446510E+00 + PKER_SDRYG( 6, 27) = 0.489828E+00 + PKER_SDRYG( 6, 28) = 0.537058E+00 + PKER_SDRYG( 6, 29) = 0.585473E+00 + PKER_SDRYG( 6, 30) = 0.632833E+00 + PKER_SDRYG( 6, 31) = 0.677778E+00 + PKER_SDRYG( 6, 32) = 0.719331E+00 + PKER_SDRYG( 6, 33) = 0.757120E+00 + PKER_SDRYG( 6, 34) = 0.791204E+00 + PKER_SDRYG( 6, 35) = 0.821879E+00 + PKER_SDRYG( 6, 36) = 0.849531E+00 + PKER_SDRYG( 6, 37) = 0.874550E+00 + PKER_SDRYG( 6, 38) = 0.897242E+00 + PKER_SDRYG( 6, 39) = 0.917866E+00 + PKER_SDRYG( 6, 40) = 0.936642E+00 + PKER_SDRYG( 6, 41) = 0.953775E+00 + PKER_SDRYG( 6, 42) = 0.969458E+00 + PKER_SDRYG( 6, 43) = 0.983861E+00 + PKER_SDRYG( 6, 44) = 0.997132E+00 + PKER_SDRYG( 6, 45) = 0.100939E+01 + PKER_SDRYG( 6, 46) = 0.102075E+01 + PKER_SDRYG( 6, 47) = 0.103128E+01 + PKER_SDRYG( 6, 48) = 0.104108E+01 + PKER_SDRYG( 6, 49) = 0.105020E+01 + PKER_SDRYG( 6, 50) = 0.105871E+01 + PKER_SDRYG( 6, 51) = 0.106665E+01 + PKER_SDRYG( 6, 52) = 0.107406E+01 + PKER_SDRYG( 6, 53) = 0.108100E+01 + PKER_SDRYG( 6, 54) = 0.108749E+01 + PKER_SDRYG( 6, 55) = 0.109356E+01 + PKER_SDRYG( 6, 56) = 0.109925E+01 + PKER_SDRYG( 6, 57) = 0.110458E+01 + PKER_SDRYG( 6, 58) = 0.110957E+01 + PKER_SDRYG( 6, 59) = 0.111425E+01 + PKER_SDRYG( 6, 60) = 0.111865E+01 + PKER_SDRYG( 6, 61) = 0.112277E+01 + PKER_SDRYG( 6, 62) = 0.112663E+01 + PKER_SDRYG( 6, 63) = 0.113026E+01 + PKER_SDRYG( 6, 64) = 0.113366E+01 + PKER_SDRYG( 6, 65) = 0.113685E+01 + PKER_SDRYG( 6, 66) = 0.113985E+01 + PKER_SDRYG( 6, 67) = 0.114266E+01 + PKER_SDRYG( 6, 68) = 0.114530E+01 + PKER_SDRYG( 6, 69) = 0.114778E+01 + PKER_SDRYG( 6, 70) = 0.115011E+01 + PKER_SDRYG( 6, 71) = 0.115229E+01 + PKER_SDRYG( 6, 72) = 0.115434E+01 + PKER_SDRYG( 6, 73) = 0.115627E+01 + PKER_SDRYG( 6, 74) = 0.115808E+01 + PKER_SDRYG( 6, 75) = 0.115977E+01 + PKER_SDRYG( 6, 76) = 0.116137E+01 + PKER_SDRYG( 6, 77) = 0.116286E+01 + PKER_SDRYG( 6, 78) = 0.116427E+01 + PKER_SDRYG( 6, 79) = 0.116559E+01 + PKER_SDRYG( 6, 80) = 0.116682E+01 + PKER_SDRYG( 7, 1) = 0.267216E+01 + PKER_SDRYG( 7, 2) = 0.247542E+01 + PKER_SDRYG( 7, 3) = 0.229059E+01 + PKER_SDRYG( 7, 4) = 0.211690E+01 + PKER_SDRYG( 7, 5) = 0.195366E+01 + PKER_SDRYG( 7, 6) = 0.180020E+01 + PKER_SDRYG( 7, 7) = 0.165590E+01 + PKER_SDRYG( 7, 8) = 0.152016E+01 + PKER_SDRYG( 7, 9) = 0.139247E+01 + PKER_SDRYG( 7, 10) = 0.127232E+01 + PKER_SDRYG( 7, 11) = 0.115928E+01 + PKER_SDRYG( 7, 12) = 0.105298E+01 + PKER_SDRYG( 7, 13) = 0.953147E+00 + PKER_SDRYG( 7, 14) = 0.859548E+00 + PKER_SDRYG( 7, 15) = 0.772080E+00 + PKER_SDRYG( 7, 16) = 0.690795E+00 + PKER_SDRYG( 7, 17) = 0.615899E+00 + PKER_SDRYG( 7, 18) = 0.547689E+00 + PKER_SDRYG( 7, 19) = 0.486803E+00 + PKER_SDRYG( 7, 20) = 0.434037E+00 + PKER_SDRYG( 7, 21) = 0.390298E+00 + PKER_SDRYG( 7, 22) = 0.356884E+00 + PKER_SDRYG( 7, 23) = 0.334845E+00 + PKER_SDRYG( 7, 24) = 0.324836E+00 + PKER_SDRYG( 7, 25) = 0.327158E+00 + PKER_SDRYG( 7, 26) = 0.341163E+00 + PKER_SDRYG( 7, 27) = 0.365112E+00 + PKER_SDRYG( 7, 28) = 0.396807E+00 + PKER_SDRYG( 7, 29) = 0.433487E+00 + PKER_SDRYG( 7, 30) = 0.472612E+00 + PKER_SDRYG( 7, 31) = 0.511994E+00 + PKER_SDRYG( 7, 32) = 0.550118E+00 + PKER_SDRYG( 7, 33) = 0.586089E+00 + PKER_SDRYG( 7, 34) = 0.619363E+00 + PKER_SDRYG( 7, 35) = 0.649769E+00 + PKER_SDRYG( 7, 36) = 0.677330E+00 + PKER_SDRYG( 7, 37) = 0.702279E+00 + PKER_SDRYG( 7, 38) = 0.724930E+00 + PKER_SDRYG( 7, 39) = 0.745565E+00 + PKER_SDRYG( 7, 40) = 0.764428E+00 + PKER_SDRYG( 7, 41) = 0.781707E+00 + PKER_SDRYG( 7, 42) = 0.797555E+00 + PKER_SDRYG( 7, 43) = 0.812112E+00 + PKER_SDRYG( 7, 44) = 0.825509E+00 + PKER_SDRYG( 7, 45) = 0.837870E+00 + PKER_SDRYG( 7, 46) = 0.849304E+00 + PKER_SDRYG( 7, 47) = 0.859904E+00 + PKER_SDRYG( 7, 48) = 0.869749E+00 + PKER_SDRYG( 7, 49) = 0.878910E+00 + PKER_SDRYG( 7, 50) = 0.887445E+00 + PKER_SDRYG( 7, 51) = 0.895407E+00 + PKER_SDRYG( 7, 52) = 0.902841E+00 + PKER_SDRYG( 7, 53) = 0.909790E+00 + PKER_SDRYG( 7, 54) = 0.916289E+00 + PKER_SDRYG( 7, 55) = 0.922371E+00 + PKER_SDRYG( 7, 56) = 0.928066E+00 + PKER_SDRYG( 7, 57) = 0.933401E+00 + PKER_SDRYG( 7, 58) = 0.938401E+00 + PKER_SDRYG( 7, 59) = 0.943087E+00 + PKER_SDRYG( 7, 60) = 0.947482E+00 + PKER_SDRYG( 7, 61) = 0.951603E+00 + PKER_SDRYG( 7, 62) = 0.955469E+00 + PKER_SDRYG( 7, 63) = 0.959096E+00 + PKER_SDRYG( 7, 64) = 0.962500E+00 + PKER_SDRYG( 7, 65) = 0.965694E+00 + PKER_SDRYG( 7, 66) = 0.968691E+00 + PKER_SDRYG( 7, 67) = 0.971504E+00 + PKER_SDRYG( 7, 68) = 0.974145E+00 + PKER_SDRYG( 7, 69) = 0.976624E+00 + PKER_SDRYG( 7, 70) = 0.978951E+00 + PKER_SDRYG( 7, 71) = 0.981136E+00 + PKER_SDRYG( 7, 72) = 0.983187E+00 + PKER_SDRYG( 7, 73) = 0.985112E+00 + PKER_SDRYG( 7, 74) = 0.986920E+00 + PKER_SDRYG( 7, 75) = 0.988617E+00 + PKER_SDRYG( 7, 76) = 0.990211E+00 + PKER_SDRYG( 7, 77) = 0.991707E+00 + PKER_SDRYG( 7, 78) = 0.993112E+00 + PKER_SDRYG( 7, 79) = 0.994431E+00 + PKER_SDRYG( 7, 80) = 0.995669E+00 + PKER_SDRYG( 8, 1) = 0.275117E+01 + PKER_SDRYG( 8, 2) = 0.255454E+01 + PKER_SDRYG( 8, 3) = 0.236983E+01 + PKER_SDRYG( 8, 4) = 0.219630E+01 + PKER_SDRYG( 8, 5) = 0.203323E+01 + PKER_SDRYG( 8, 6) = 0.187998E+01 + PKER_SDRYG( 8, 7) = 0.173590E+01 + PKER_SDRYG( 8, 8) = 0.160040E+01 + PKER_SDRYG( 8, 9) = 0.147293E+01 + PKER_SDRYG( 8, 10) = 0.135295E+01 + PKER_SDRYG( 8, 11) = 0.123996E+01 + PKER_SDRYG( 8, 12) = 0.113353E+01 + PKER_SDRYG( 8, 13) = 0.103324E+01 + PKER_SDRYG( 8, 14) = 0.938726E+00 + PKER_SDRYG( 8, 15) = 0.849707E+00 + PKER_SDRYG( 8, 16) = 0.765984E+00 + PKER_SDRYG( 8, 17) = 0.687490E+00 + PKER_SDRYG( 8, 18) = 0.614228E+00 + PKER_SDRYG( 8, 19) = 0.546445E+00 + PKER_SDRYG( 8, 20) = 0.484521E+00 + PKER_SDRYG( 8, 21) = 0.429191E+00 + PKER_SDRYG( 8, 22) = 0.381279E+00 + PKER_SDRYG( 8, 23) = 0.341954E+00 + PKER_SDRYG( 8, 24) = 0.312266E+00 + PKER_SDRYG( 8, 25) = 0.293197E+00 + PKER_SDRYG( 8, 26) = 0.285436E+00 + PKER_SDRYG( 8, 27) = 0.288590E+00 + PKER_SDRYG( 8, 28) = 0.301647E+00 + PKER_SDRYG( 8, 29) = 0.322883E+00 + PKER_SDRYG( 8, 30) = 0.349944E+00 + PKER_SDRYG( 8, 31) = 0.380489E+00 + PKER_SDRYG( 8, 32) = 0.412492E+00 + PKER_SDRYG( 8, 33) = 0.444350E+00 + PKER_SDRYG( 8, 34) = 0.475064E+00 + PKER_SDRYG( 8, 35) = 0.503980E+00 + PKER_SDRYG( 8, 36) = 0.530853E+00 + PKER_SDRYG( 8, 37) = 0.555542E+00 + PKER_SDRYG( 8, 38) = 0.578083E+00 + PKER_SDRYG( 8, 39) = 0.598637E+00 + PKER_SDRYG( 8, 40) = 0.617414E+00 + PKER_SDRYG( 8, 41) = 0.634627E+00 + PKER_SDRYG( 8, 42) = 0.650467E+00 + PKER_SDRYG( 8, 43) = 0.665074E+00 + PKER_SDRYG( 8, 44) = 0.678558E+00 + PKER_SDRYG( 8, 45) = 0.691015E+00 + PKER_SDRYG( 8, 46) = 0.702533E+00 + PKER_SDRYG( 8, 47) = 0.713201E+00 + PKER_SDRYG( 8, 48) = 0.723101E+00 + PKER_SDRYG( 8, 49) = 0.732303E+00 + PKER_SDRYG( 8, 50) = 0.740871E+00 + PKER_SDRYG( 8, 51) = 0.748859E+00 + PKER_SDRYG( 8, 52) = 0.756314E+00 + PKER_SDRYG( 8, 53) = 0.763279E+00 + PKER_SDRYG( 8, 54) = 0.769790E+00 + PKER_SDRYG( 8, 55) = 0.775882E+00 + PKER_SDRYG( 8, 56) = 0.781585E+00 + PKER_SDRYG( 8, 57) = 0.786926E+00 + PKER_SDRYG( 8, 58) = 0.791930E+00 + PKER_SDRYG( 8, 59) = 0.796621E+00 + PKER_SDRYG( 8, 60) = 0.801018E+00 + PKER_SDRYG( 8, 61) = 0.805142E+00 + PKER_SDRYG( 8, 62) = 0.809010E+00 + PKER_SDRYG( 8, 63) = 0.812638E+00 + PKER_SDRYG( 8, 64) = 0.816043E+00 + PKER_SDRYG( 8, 65) = 0.819238E+00 + PKER_SDRYG( 8, 66) = 0.822236E+00 + PKER_SDRYG( 8, 67) = 0.825050E+00 + PKER_SDRYG( 8, 68) = 0.827691E+00 + PKER_SDRYG( 8, 69) = 0.830170E+00 + PKER_SDRYG( 8, 70) = 0.832497E+00 + PKER_SDRYG( 8, 71) = 0.834682E+00 + PKER_SDRYG( 8, 72) = 0.836733E+00 + PKER_SDRYG( 8, 73) = 0.838659E+00 + PKER_SDRYG( 8, 74) = 0.840467E+00 + PKER_SDRYG( 8, 75) = 0.842164E+00 + PKER_SDRYG( 8, 76) = 0.843758E+00 + PKER_SDRYG( 8, 77) = 0.845254E+00 + PKER_SDRYG( 8, 78) = 0.846659E+00 + PKER_SDRYG( 8, 79) = 0.847978E+00 + PKER_SDRYG( 8, 80) = 0.849217E+00 + PKER_SDRYG( 9, 1) = 0.281873E+01 + PKER_SDRYG( 9, 2) = 0.262217E+01 + PKER_SDRYG( 9, 3) = 0.243755E+01 + PKER_SDRYG( 9, 4) = 0.226413E+01 + PKER_SDRYG( 9, 5) = 0.210120E+01 + PKER_SDRYG( 9, 6) = 0.194811E+01 + PKER_SDRYG( 9, 7) = 0.180423E+01 + PKER_SDRYG( 9, 8) = 0.166898E+01 + PKER_SDRYG( 9, 9) = 0.154178E+01 + PKER_SDRYG( 9, 10) = 0.142211E+01 + PKER_SDRYG( 9, 11) = 0.130946E+01 + PKER_SDRYG( 9, 12) = 0.120336E+01 + PKER_SDRYG( 9, 13) = 0.110334E+01 + PKER_SDRYG( 9, 14) = 0.100898E+01 + PKER_SDRYG( 9, 15) = 0.919904E+00 + PKER_SDRYG( 9, 16) = 0.835767E+00 + PKER_SDRYG( 9, 17) = 0.756296E+00 + PKER_SDRYG( 9, 18) = 0.681312E+00 + PKER_SDRYG( 9, 19) = 0.610704E+00 + PKER_SDRYG( 9, 20) = 0.544549E+00 + PKER_SDRYG( 9, 21) = 0.483126E+00 + PKER_SDRYG( 9, 22) = 0.426903E+00 + PKER_SDRYG( 9, 23) = 0.376623E+00 + PKER_SDRYG( 9, 24) = 0.333280E+00 + PKER_SDRYG( 9, 25) = 0.297980E+00 + PKER_SDRYG( 9, 26) = 0.271818E+00 + PKER_SDRYG( 9, 27) = 0.255645E+00 + PKER_SDRYG( 9, 28) = 0.249649E+00 + PKER_SDRYG( 9, 29) = 0.253211E+00 + PKER_SDRYG( 9, 30) = 0.265062E+00 + PKER_SDRYG( 9, 31) = 0.283396E+00 + PKER_SDRYG( 9, 32) = 0.306054E+00 + PKER_SDRYG( 9, 33) = 0.331204E+00 + PKER_SDRYG( 9, 34) = 0.357250E+00 + PKER_SDRYG( 9, 35) = 0.383076E+00 + PKER_SDRYG( 9, 36) = 0.407898E+00 + PKER_SDRYG( 9, 37) = 0.431335E+00 + PKER_SDRYG( 9, 38) = 0.453229E+00 + PKER_SDRYG( 9, 39) = 0.473481E+00 + PKER_SDRYG( 9, 40) = 0.492133E+00 + PKER_SDRYG( 9, 41) = 0.509252E+00 + PKER_SDRYG( 9, 42) = 0.524980E+00 + PKER_SDRYG( 9, 43) = 0.539487E+00 + PKER_SDRYG( 9, 44) = 0.552905E+00 + PKER_SDRYG( 9, 45) = 0.565346E+00 + PKER_SDRYG( 9, 46) = 0.576895E+00 + PKER_SDRYG( 9, 47) = 0.587615E+00 + PKER_SDRYG( 9, 48) = 0.597569E+00 + PKER_SDRYG( 9, 49) = 0.606817E+00 + PKER_SDRYG( 9, 50) = 0.615422E+00 + PKER_SDRYG( 9, 51) = 0.623439E+00 + PKER_SDRYG( 9, 52) = 0.630916E+00 + PKER_SDRYG( 9, 53) = 0.637899E+00 + PKER_SDRYG( 9, 54) = 0.644424E+00 + PKER_SDRYG( 9, 55) = 0.650527E+00 + PKER_SDRYG( 9, 56) = 0.656238E+00 + PKER_SDRYG( 9, 57) = 0.661586E+00 + PKER_SDRYG( 9, 58) = 0.666595E+00 + PKER_SDRYG( 9, 59) = 0.671290E+00 + PKER_SDRYG( 9, 60) = 0.675690E+00 + PKER_SDRYG( 9, 61) = 0.679817E+00 + PKER_SDRYG( 9, 62) = 0.683687E+00 + PKER_SDRYG( 9, 63) = 0.687317E+00 + PKER_SDRYG( 9, 64) = 0.690723E+00 + PKER_SDRYG( 9, 65) = 0.693918E+00 + PKER_SDRYG( 9, 66) = 0.696917E+00 + PKER_SDRYG( 9, 67) = 0.699732E+00 + PKER_SDRYG( 9, 68) = 0.702374E+00 + PKER_SDRYG( 9, 69) = 0.704853E+00 + PKER_SDRYG( 9, 70) = 0.707181E+00 + PKER_SDRYG( 9, 71) = 0.709366E+00 + PKER_SDRYG( 9, 72) = 0.711417E+00 + PKER_SDRYG( 9, 73) = 0.713343E+00 + PKER_SDRYG( 9, 74) = 0.715151E+00 + PKER_SDRYG( 9, 75) = 0.716848E+00 + PKER_SDRYG( 9, 76) = 0.718442E+00 + PKER_SDRYG( 9, 77) = 0.719938E+00 + PKER_SDRYG( 9, 78) = 0.721343E+00 + PKER_SDRYG( 9, 79) = 0.722663E+00 + PKER_SDRYG( 9, 80) = 0.723901E+00 + PKER_SDRYG( 10, 1) = 0.287649E+01 + PKER_SDRYG( 10, 2) = 0.267999E+01 + PKER_SDRYG( 10, 3) = 0.249543E+01 + PKER_SDRYG( 10, 4) = 0.232209E+01 + PKER_SDRYG( 10, 5) = 0.215926E+01 + PKER_SDRYG( 10, 6) = 0.200629E+01 + PKER_SDRYG( 10, 7) = 0.186256E+01 + PKER_SDRYG( 10, 8) = 0.172749E+01 + PKER_SDRYG( 10, 9) = 0.160052E+01 + PKER_SDRYG( 10, 10) = 0.148113E+01 + PKER_SDRYG( 10, 11) = 0.136880E+01 + PKER_SDRYG( 10, 12) = 0.126307E+01 + PKER_SDRYG( 10, 13) = 0.116348E+01 + PKER_SDRYG( 10, 14) = 0.106958E+01 + PKER_SDRYG( 10, 15) = 0.980970E+00 + PKER_SDRYG( 10, 16) = 0.897241E+00 + PKER_SDRYG( 10, 17) = 0.818035E+00 + PKER_SDRYG( 10, 18) = 0.743029E+00 + PKER_SDRYG( 10, 19) = 0.671957E+00 + PKER_SDRYG( 10, 20) = 0.604628E+00 + PKER_SDRYG( 10, 21) = 0.540973E+00 + PKER_SDRYG( 10, 22) = 0.481134E+00 + PKER_SDRYG( 10, 23) = 0.425371E+00 + PKER_SDRYG( 10, 24) = 0.374261E+00 + PKER_SDRYG( 10, 25) = 0.328628E+00 + PKER_SDRYG( 10, 26) = 0.289572E+00 + PKER_SDRYG( 10, 27) = 0.258117E+00 + PKER_SDRYG( 10, 28) = 0.235368E+00 + PKER_SDRYG( 10, 29) = 0.221755E+00 + PKER_SDRYG( 10, 30) = 0.217136E+00 + PKER_SDRYG( 10, 31) = 0.220856E+00 + PKER_SDRYG( 10, 32) = 0.231296E+00 + PKER_SDRYG( 10, 33) = 0.246745E+00 + PKER_SDRYG( 10, 34) = 0.265573E+00 + PKER_SDRYG( 10, 35) = 0.286164E+00 + PKER_SDRYG( 10, 36) = 0.307344E+00 + PKER_SDRYG( 10, 37) = 0.328309E+00 + PKER_SDRYG( 10, 38) = 0.348513E+00 + PKER_SDRYG( 10, 39) = 0.367687E+00 + PKER_SDRYG( 10, 40) = 0.385687E+00 + PKER_SDRYG( 10, 41) = 0.402481E+00 + PKER_SDRYG( 10, 42) = 0.418056E+00 + PKER_SDRYG( 10, 43) = 0.432452E+00 + PKER_SDRYG( 10, 44) = 0.445760E+00 + PKER_SDRYG( 10, 45) = 0.458086E+00 + PKER_SDRYG( 10, 46) = 0.469537E+00 + PKER_SDRYG( 10, 47) = 0.480201E+00 + PKER_SDRYG( 10, 48) = 0.490143E+00 + PKER_SDRYG( 10, 49) = 0.499411E+00 + PKER_SDRYG( 10, 50) = 0.508047E+00 + PKER_SDRYG( 10, 51) = 0.516093E+00 + PKER_SDRYG( 10, 52) = 0.523596E+00 + PKER_SDRYG( 10, 53) = 0.530598E+00 + PKER_SDRYG( 10, 54) = 0.537139E+00 + PKER_SDRYG( 10, 55) = 0.543253E+00 + PKER_SDRYG( 10, 56) = 0.548974E+00 + PKER_SDRYG( 10, 57) = 0.554329E+00 + PKER_SDRYG( 10, 58) = 0.559345E+00 + PKER_SDRYG( 10, 59) = 0.564044E+00 + PKER_SDRYG( 10, 60) = 0.568448E+00 + PKER_SDRYG( 10, 61) = 0.572577E+00 + PKER_SDRYG( 10, 62) = 0.576449E+00 + PKER_SDRYG( 10, 63) = 0.580081E+00 + PKER_SDRYG( 10, 64) = 0.583488E+00 + PKER_SDRYG( 10, 65) = 0.586685E+00 + PKER_SDRYG( 10, 66) = 0.589685E+00 + PKER_SDRYG( 10, 67) = 0.592500E+00 + PKER_SDRYG( 10, 68) = 0.595142E+00 + PKER_SDRYG( 10, 69) = 0.597623E+00 + PKER_SDRYG( 10, 70) = 0.599950E+00 + PKER_SDRYG( 10, 71) = 0.602136E+00 + PKER_SDRYG( 10, 72) = 0.604187E+00 + PKER_SDRYG( 10, 73) = 0.606113E+00 + PKER_SDRYG( 10, 74) = 0.607921E+00 + PKER_SDRYG( 10, 75) = 0.609619E+00 + PKER_SDRYG( 10, 76) = 0.611213E+00 + PKER_SDRYG( 10, 77) = 0.612709E+00 + PKER_SDRYG( 10, 78) = 0.614114E+00 + PKER_SDRYG( 10, 79) = 0.615433E+00 + PKER_SDRYG( 10, 80) = 0.616672E+00 + PKER_SDRYG( 11, 1) = 0.292588E+01 + PKER_SDRYG( 11, 2) = 0.272942E+01 + PKER_SDRYG( 11, 3) = 0.254491E+01 + PKER_SDRYG( 11, 4) = 0.237162E+01 + PKER_SDRYG( 11, 5) = 0.220887E+01 + PKER_SDRYG( 11, 6) = 0.205599E+01 + PKER_SDRYG( 11, 7) = 0.191237E+01 + PKER_SDRYG( 11, 8) = 0.177743E+01 + PKER_SDRYG( 11, 9) = 0.165062E+01 + PKER_SDRYG( 11, 10) = 0.153143E+01 + PKER_SDRYG( 11, 11) = 0.141936E+01 + PKER_SDRYG( 11, 12) = 0.131393E+01 + PKER_SDRYG( 11, 13) = 0.121471E+01 + PKER_SDRYG( 11, 14) = 0.112125E+01 + PKER_SDRYG( 11, 15) = 0.103314E+01 + PKER_SDRYG( 11, 16) = 0.949992E+00 + PKER_SDRYG( 11, 17) = 0.871403E+00 + PKER_SDRYG( 11, 18) = 0.797011E+00 + PKER_SDRYG( 11, 19) = 0.726472E+00 + PKER_SDRYG( 11, 20) = 0.659472E+00 + PKER_SDRYG( 11, 21) = 0.595759E+00 + PKER_SDRYG( 11, 22) = 0.535173E+00 + PKER_SDRYG( 11, 23) = 0.477686E+00 + PKER_SDRYG( 11, 24) = 0.423410E+00 + PKER_SDRYG( 11, 25) = 0.372735E+00 + PKER_SDRYG( 11, 26) = 0.326343E+00 + PKER_SDRYG( 11, 27) = 0.285079E+00 + PKER_SDRYG( 11, 28) = 0.250073E+00 + PKER_SDRYG( 11, 29) = 0.222370E+00 + PKER_SDRYG( 11, 30) = 0.202694E+00 + PKER_SDRYG( 11, 31) = 0.191356E+00 + PKER_SDRYG( 11, 32) = 0.187944E+00 + PKER_SDRYG( 11, 33) = 0.191428E+00 + PKER_SDRYG( 11, 34) = 0.200384E+00 + PKER_SDRYG( 11, 35) = 0.213284E+00 + PKER_SDRYG( 11, 36) = 0.228761E+00 + PKER_SDRYG( 11, 37) = 0.245555E+00 + PKER_SDRYG( 11, 38) = 0.262820E+00 + PKER_SDRYG( 11, 39) = 0.279947E+00 + PKER_SDRYG( 11, 40) = 0.296552E+00 + PKER_SDRYG( 11, 41) = 0.312363E+00 + PKER_SDRYG( 11, 42) = 0.327309E+00 + PKER_SDRYG( 11, 43) = 0.341353E+00 + PKER_SDRYG( 11, 44) = 0.354467E+00 + PKER_SDRYG( 11, 45) = 0.366682E+00 + PKER_SDRYG( 11, 46) = 0.378026E+00 + PKER_SDRYG( 11, 47) = 0.388571E+00 + PKER_SDRYG( 11, 48) = 0.398407E+00 + PKER_SDRYG( 11, 49) = 0.407595E+00 + PKER_SDRYG( 11, 50) = 0.416190E+00 + PKER_SDRYG( 11, 51) = 0.424231E+00 + PKER_SDRYG( 11, 52) = 0.431746E+00 + PKER_SDRYG( 11, 53) = 0.438766E+00 + PKER_SDRYG( 11, 54) = 0.445323E+00 + PKER_SDRYG( 11, 55) = 0.451452E+00 + PKER_SDRYG( 11, 56) = 0.457183E+00 + PKER_SDRYG( 11, 57) = 0.462546E+00 + PKER_SDRYG( 11, 58) = 0.467568E+00 + PKER_SDRYG( 11, 59) = 0.472272E+00 + PKER_SDRYG( 11, 60) = 0.476681E+00 + PKER_SDRYG( 11, 61) = 0.480813E+00 + PKER_SDRYG( 11, 62) = 0.484687E+00 + PKER_SDRYG( 11, 63) = 0.488321E+00 + PKER_SDRYG( 11, 64) = 0.491730E+00 + PKER_SDRYG( 11, 65) = 0.494928E+00 + PKER_SDRYG( 11, 66) = 0.497929E+00 + PKER_SDRYG( 11, 67) = 0.500745E+00 + PKER_SDRYG( 11, 68) = 0.503387E+00 + PKER_SDRYG( 11, 69) = 0.505868E+00 + PKER_SDRYG( 11, 70) = 0.508196E+00 + PKER_SDRYG( 11, 71) = 0.510382E+00 + PKER_SDRYG( 11, 72) = 0.512433E+00 + PKER_SDRYG( 11, 73) = 0.514360E+00 + PKER_SDRYG( 11, 74) = 0.516168E+00 + PKER_SDRYG( 11, 75) = 0.517866E+00 + PKER_SDRYG( 11, 76) = 0.519459E+00 + PKER_SDRYG( 11, 77) = 0.520956E+00 + PKER_SDRYG( 11, 78) = 0.522361E+00 + PKER_SDRYG( 11, 79) = 0.523680E+00 + PKER_SDRYG( 11, 80) = 0.524919E+00 + PKER_SDRYG( 12, 1) = 0.296813E+01 + PKER_SDRYG( 12, 2) = 0.277169E+01 + PKER_SDRYG( 12, 3) = 0.258722E+01 + PKER_SDRYG( 12, 4) = 0.241397E+01 + PKER_SDRYG( 12, 5) = 0.225126E+01 + PKER_SDRYG( 12, 6) = 0.209845E+01 + PKER_SDRYG( 12, 7) = 0.195490E+01 + PKER_SDRYG( 12, 8) = 0.182006E+01 + PKER_SDRYG( 12, 9) = 0.169337E+01 + PKER_SDRYG( 12, 10) = 0.157433E+01 + PKER_SDRYG( 12, 11) = 0.146243E+01 + PKER_SDRYG( 12, 12) = 0.135723E+01 + PKER_SDRYG( 12, 13) = 0.125828E+01 + PKER_SDRYG( 12, 14) = 0.116516E+01 + PKER_SDRYG( 12, 15) = 0.107747E+01 + PKER_SDRYG( 12, 16) = 0.994807E+00 + PKER_SDRYG( 12, 17) = 0.916807E+00 + PKER_SDRYG( 12, 18) = 0.843095E+00 + PKER_SDRYG( 12, 19) = 0.773314E+00 + PKER_SDRYG( 12, 20) = 0.707116E+00 + PKER_SDRYG( 12, 21) = 0.644174E+00 + PKER_SDRYG( 12, 22) = 0.584199E+00 + PKER_SDRYG( 12, 23) = 0.526949E+00 + PKER_SDRYG( 12, 24) = 0.472291E+00 + PKER_SDRYG( 12, 25) = 0.420211E+00 + PKER_SDRYG( 12, 26) = 0.370902E+00 + PKER_SDRYG( 12, 27) = 0.324892E+00 + PKER_SDRYG( 12, 28) = 0.282842E+00 + PKER_SDRYG( 12, 29) = 0.245728E+00 + PKER_SDRYG( 12, 30) = 0.214626E+00 + PKER_SDRYG( 12, 31) = 0.190466E+00 + PKER_SDRYG( 12, 32) = 0.173675E+00 + PKER_SDRYG( 12, 33) = 0.164353E+00 + PKER_SDRYG( 12, 34) = 0.161777E+00 + PKER_SDRYG( 12, 35) = 0.164848E+00 + PKER_SDRYG( 12, 36) = 0.172447E+00 + PKER_SDRYG( 12, 37) = 0.183108E+00 + PKER_SDRYG( 12, 38) = 0.195737E+00 + PKER_SDRYG( 12, 39) = 0.209501E+00 + PKER_SDRYG( 12, 40) = 0.223654E+00 + PKER_SDRYG( 12, 41) = 0.237731E+00 + PKER_SDRYG( 12, 42) = 0.251446E+00 + PKER_SDRYG( 12, 43) = 0.264605E+00 + PKER_SDRYG( 12, 44) = 0.277116E+00 + PKER_SDRYG( 12, 45) = 0.288946E+00 + PKER_SDRYG( 12, 46) = 0.300077E+00 + PKER_SDRYG( 12, 47) = 0.310498E+00 + PKER_SDRYG( 12, 48) = 0.320228E+00 + PKER_SDRYG( 12, 49) = 0.329310E+00 + PKER_SDRYG( 12, 50) = 0.337797E+00 + PKER_SDRYG( 12, 51) = 0.345746E+00 + PKER_SDRYG( 12, 52) = 0.353202E+00 + PKER_SDRYG( 12, 53) = 0.360196E+00 + PKER_SDRYG( 12, 54) = 0.366751E+00 + PKER_SDRYG( 12, 55) = 0.372888E+00 + PKER_SDRYG( 12, 56) = 0.378630E+00 + PKER_SDRYG( 12, 57) = 0.384002E+00 + PKER_SDRYG( 12, 58) = 0.389031E+00 + PKER_SDRYG( 12, 59) = 0.393741E+00 + PKER_SDRYG( 12, 60) = 0.398154E+00 + PKER_SDRYG( 12, 61) = 0.402290E+00 + PKER_SDRYG( 12, 62) = 0.406167E+00 + PKER_SDRYG( 12, 63) = 0.409803E+00 + PKER_SDRYG( 12, 64) = 0.413213E+00 + PKER_SDRYG( 12, 65) = 0.416413E+00 + PKER_SDRYG( 12, 66) = 0.419414E+00 + PKER_SDRYG( 12, 67) = 0.422231E+00 + PKER_SDRYG( 12, 68) = 0.424874E+00 + PKER_SDRYG( 12, 69) = 0.427355E+00 + PKER_SDRYG( 12, 70) = 0.429684E+00 + PKER_SDRYG( 12, 71) = 0.431870E+00 + PKER_SDRYG( 12, 72) = 0.433922E+00 + PKER_SDRYG( 12, 73) = 0.435848E+00 + PKER_SDRYG( 12, 74) = 0.437657E+00 + PKER_SDRYG( 12, 75) = 0.439355E+00 + PKER_SDRYG( 12, 76) = 0.440949E+00 + PKER_SDRYG( 12, 77) = 0.442445E+00 + PKER_SDRYG( 12, 78) = 0.443850E+00 + PKER_SDRYG( 12, 79) = 0.445170E+00 + PKER_SDRYG( 12, 80) = 0.446408E+00 + PKER_SDRYG( 13, 1) = 0.300426E+01 + PKER_SDRYG( 13, 2) = 0.280784E+01 + PKER_SDRYG( 13, 3) = 0.262339E+01 + PKER_SDRYG( 13, 4) = 0.245018E+01 + PKER_SDRYG( 13, 5) = 0.228751E+01 + PKER_SDRYG( 13, 6) = 0.213473E+01 + PKER_SDRYG( 13, 7) = 0.199125E+01 + PKER_SDRYG( 13, 8) = 0.185647E+01 + PKER_SDRYG( 13, 9) = 0.172987E+01 + PKER_SDRYG( 13, 10) = 0.161093E+01 + PKER_SDRYG( 13, 11) = 0.149916E+01 + PKER_SDRYG( 13, 12) = 0.139412E+01 + PKER_SDRYG( 13, 13) = 0.129536E+01 + PKER_SDRYG( 13, 14) = 0.120249E+01 + PKER_SDRYG( 13, 15) = 0.111509E+01 + PKER_SDRYG( 13, 16) = 0.103280E+01 + PKER_SDRYG( 13, 17) = 0.955258E+00 + PKER_SDRYG( 13, 18) = 0.882099E+00 + PKER_SDRYG( 13, 19) = 0.812980E+00 + PKER_SDRYG( 13, 20) = 0.747559E+00 + PKER_SDRYG( 13, 21) = 0.685504E+00 + PKER_SDRYG( 13, 22) = 0.626487E+00 + PKER_SDRYG( 13, 23) = 0.570200E+00 + PKER_SDRYG( 13, 24) = 0.516370E+00 + PKER_SDRYG( 13, 25) = 0.464781E+00 + PKER_SDRYG( 13, 26) = 0.415330E+00 + PKER_SDRYG( 13, 27) = 0.368082E+00 + PKER_SDRYG( 13, 28) = 0.323329E+00 + PKER_SDRYG( 13, 29) = 0.281592E+00 + PKER_SDRYG( 13, 30) = 0.243675E+00 + PKER_SDRYG( 13, 31) = 0.210623E+00 + PKER_SDRYG( 13, 32) = 0.183280E+00 + PKER_SDRYG( 13, 33) = 0.162430E+00 + PKER_SDRYG( 13, 34) = 0.148317E+00 + PKER_SDRYG( 13, 35) = 0.140602E+00 + PKER_SDRYG( 13, 36) = 0.138606E+00 + PKER_SDRYG( 13, 37) = 0.141294E+00 + PKER_SDRYG( 13, 38) = 0.147531E+00 + PKER_SDRYG( 13, 39) = 0.156269E+00 + PKER_SDRYG( 13, 40) = 0.166597E+00 + PKER_SDRYG( 13, 41) = 0.177865E+00 + PKER_SDRYG( 13, 42) = 0.189495E+00 + PKER_SDRYG( 13, 43) = 0.201132E+00 + PKER_SDRYG( 13, 44) = 0.212557E+00 + PKER_SDRYG( 13, 45) = 0.223599E+00 + PKER_SDRYG( 13, 46) = 0.234145E+00 + PKER_SDRYG( 13, 47) = 0.244174E+00 + PKER_SDRYG( 13, 48) = 0.253668E+00 + PKER_SDRYG( 13, 49) = 0.262605E+00 + PKER_SDRYG( 13, 50) = 0.270996E+00 + PKER_SDRYG( 13, 51) = 0.278849E+00 + PKER_SDRYG( 13, 52) = 0.286203E+00 + PKER_SDRYG( 13, 53) = 0.293107E+00 + PKER_SDRYG( 13, 54) = 0.299592E+00 + PKER_SDRYG( 13, 55) = 0.305689E+00 + PKER_SDRYG( 13, 56) = 0.311416E+00 + PKER_SDRYG( 13, 57) = 0.316789E+00 + PKER_SDRYG( 13, 58) = 0.321824E+00 + PKER_SDRYG( 13, 59) = 0.326539E+00 + PKER_SDRYG( 13, 60) = 0.330957E+00 + PKER_SDRYG( 13, 61) = 0.335096E+00 + PKER_SDRYG( 13, 62) = 0.338977E+00 + PKER_SDRYG( 13, 63) = 0.342615E+00 + PKER_SDRYG( 13, 64) = 0.346027E+00 + PKER_SDRYG( 13, 65) = 0.349228E+00 + PKER_SDRYG( 13, 66) = 0.352231E+00 + PKER_SDRYG( 13, 67) = 0.355048E+00 + PKER_SDRYG( 13, 68) = 0.357693E+00 + PKER_SDRYG( 13, 69) = 0.360174E+00 + PKER_SDRYG( 13, 70) = 0.362503E+00 + PKER_SDRYG( 13, 71) = 0.364689E+00 + PKER_SDRYG( 13, 72) = 0.366742E+00 + PKER_SDRYG( 13, 73) = 0.368668E+00 + PKER_SDRYG( 13, 74) = 0.370477E+00 + PKER_SDRYG( 13, 75) = 0.372175E+00 + PKER_SDRYG( 13, 76) = 0.373769E+00 + PKER_SDRYG( 13, 77) = 0.375266E+00 + PKER_SDRYG( 13, 78) = 0.376671E+00 + PKER_SDRYG( 13, 79) = 0.377990E+00 + PKER_SDRYG( 13, 80) = 0.379229E+00 + PKER_SDRYG( 14, 1) = 0.303517E+01 + PKER_SDRYG( 14, 2) = 0.283877E+01 + PKER_SDRYG( 14, 3) = 0.265433E+01 + PKER_SDRYG( 14, 4) = 0.248114E+01 + PKER_SDRYG( 14, 5) = 0.231850E+01 + PKER_SDRYG( 14, 6) = 0.216575E+01 + PKER_SDRYG( 14, 7) = 0.202231E+01 + PKER_SDRYG( 14, 8) = 0.188758E+01 + PKER_SDRYG( 14, 9) = 0.176104E+01 + PKER_SDRYG( 14, 10) = 0.164217E+01 + PKER_SDRYG( 14, 11) = 0.153050E+01 + PKER_SDRYG( 14, 12) = 0.142557E+01 + PKER_SDRYG( 14, 13) = 0.132695E+01 + PKER_SDRYG( 14, 14) = 0.123425E+01 + PKER_SDRYG( 14, 15) = 0.114707E+01 + PKER_SDRYG( 14, 16) = 0.106505E+01 + PKER_SDRYG( 14, 17) = 0.987829E+00 + PKER_SDRYG( 14, 18) = 0.915075E+00 + PKER_SDRYG( 14, 19) = 0.846455E+00 + PKER_SDRYG( 14, 20) = 0.781644E+00 + PKER_SDRYG( 14, 21) = 0.720325E+00 + PKER_SDRYG( 14, 22) = 0.662179E+00 + PKER_SDRYG( 14, 23) = 0.606894E+00 + PKER_SDRYG( 14, 24) = 0.554165E+00 + PKER_SDRYG( 14, 25) = 0.503702E+00 + PKER_SDRYG( 14, 26) = 0.455255E+00 + PKER_SDRYG( 14, 27) = 0.408655E+00 + PKER_SDRYG( 14, 28) = 0.363840E+00 + PKER_SDRYG( 14, 29) = 0.320957E+00 + PKER_SDRYG( 14, 30) = 0.280360E+00 + PKER_SDRYG( 14, 31) = 0.242663E+00 + PKER_SDRYG( 14, 32) = 0.208805E+00 + PKER_SDRYG( 14, 33) = 0.179611E+00 + PKER_SDRYG( 14, 34) = 0.155880E+00 + PKER_SDRYG( 14, 35) = 0.138098E+00 + PKER_SDRYG( 14, 36) = 0.126282E+00 + PKER_SDRYG( 14, 37) = 0.119901E+00 + PKER_SDRYG( 14, 38) = 0.118300E+00 + PKER_SDRYG( 14, 39) = 0.120505E+00 + PKER_SDRYG( 14, 40) = 0.125551E+00 + PKER_SDRYG( 14, 41) = 0.132700E+00 + PKER_SDRYG( 14, 42) = 0.141142E+00 + PKER_SDRYG( 14, 43) = 0.150371E+00 + PKER_SDRYG( 14, 44) = 0.159990E+00 + PKER_SDRYG( 14, 45) = 0.169685E+00 + PKER_SDRYG( 14, 46) = 0.179245E+00 + PKER_SDRYG( 14, 47) = 0.188540E+00 + PKER_SDRYG( 14, 48) = 0.197487E+00 + PKER_SDRYG( 14, 49) = 0.206035E+00 + PKER_SDRYG( 14, 50) = 0.214165E+00 + PKER_SDRYG( 14, 51) = 0.221865E+00 + PKER_SDRYG( 14, 52) = 0.229121E+00 + PKER_SDRYG( 14, 53) = 0.235935E+00 + PKER_SDRYG( 14, 54) = 0.242332E+00 + PKER_SDRYG( 14, 55) = 0.248340E+00 + PKER_SDRYG( 14, 56) = 0.253994E+00 + PKER_SDRYG( 14, 57) = 0.259317E+00 + PKER_SDRYG( 14, 58) = 0.264327E+00 + PKER_SDRYG( 14, 59) = 0.269036E+00 + PKER_SDRYG( 14, 60) = 0.273454E+00 + PKER_SDRYG( 14, 61) = 0.277597E+00 + PKER_SDRYG( 14, 62) = 0.281481E+00 + PKER_SDRYG( 14, 63) = 0.285122E+00 + PKER_SDRYG( 14, 64) = 0.288536E+00 + PKER_SDRYG( 14, 65) = 0.291738E+00 + PKER_SDRYG( 14, 66) = 0.294743E+00 + PKER_SDRYG( 14, 67) = 0.297561E+00 + PKER_SDRYG( 14, 68) = 0.300206E+00 + PKER_SDRYG( 14, 69) = 0.302688E+00 + PKER_SDRYG( 14, 70) = 0.305018E+00 + PKER_SDRYG( 14, 71) = 0.307205E+00 + PKER_SDRYG( 14, 72) = 0.309257E+00 + PKER_SDRYG( 14, 73) = 0.311184E+00 + PKER_SDRYG( 14, 74) = 0.312993E+00 + PKER_SDRYG( 14, 75) = 0.314691E+00 + PKER_SDRYG( 14, 76) = 0.316285E+00 + PKER_SDRYG( 14, 77) = 0.317782E+00 + PKER_SDRYG( 14, 78) = 0.319187E+00 + PKER_SDRYG( 14, 79) = 0.320506E+00 + PKER_SDRYG( 14, 80) = 0.321745E+00 + PKER_SDRYG( 15, 1) = 0.306161E+01 + PKER_SDRYG( 15, 2) = 0.286522E+01 + PKER_SDRYG( 15, 3) = 0.268080E+01 + PKER_SDRYG( 15, 4) = 0.250762E+01 + PKER_SDRYG( 15, 5) = 0.234499E+01 + PKER_SDRYG( 15, 6) = 0.219228E+01 + PKER_SDRYG( 15, 7) = 0.204886E+01 + PKER_SDRYG( 15, 8) = 0.191417E+01 + PKER_SDRYG( 15, 9) = 0.178767E+01 + PKER_SDRYG( 15, 10) = 0.166885E+01 + PKER_SDRYG( 15, 11) = 0.155725E+01 + PKER_SDRYG( 15, 12) = 0.145240E+01 + PKER_SDRYG( 15, 13) = 0.135388E+01 + PKER_SDRYG( 15, 14) = 0.126130E+01 + PKER_SDRYG( 15, 15) = 0.117427E+01 + PKER_SDRYG( 15, 16) = 0.109244E+01 + PKER_SDRYG( 15, 17) = 0.101546E+01 + PKER_SDRYG( 15, 18) = 0.942994E+00 + PKER_SDRYG( 15, 19) = 0.874732E+00 + PKER_SDRYG( 15, 20) = 0.810365E+00 + PKER_SDRYG( 15, 21) = 0.749592E+00 + PKER_SDRYG( 15, 22) = 0.692115E+00 + PKER_SDRYG( 15, 23) = 0.637639E+00 + PKER_SDRYG( 15, 24) = 0.585869E+00 + PKER_SDRYG( 15, 25) = 0.536512E+00 + PKER_SDRYG( 15, 26) = 0.489283E+00 + PKER_SDRYG( 15, 27) = 0.443919E+00 + PKER_SDRYG( 15, 28) = 0.400205E+00 + PKER_SDRYG( 15, 29) = 0.358017E+00 + PKER_SDRYG( 15, 30) = 0.317369E+00 + PKER_SDRYG( 15, 31) = 0.278488E+00 + PKER_SDRYG( 15, 32) = 0.241839E+00 + PKER_SDRYG( 15, 33) = 0.208131E+00 + PKER_SDRYG( 15, 34) = 0.178156E+00 + PKER_SDRYG( 15, 35) = 0.152678E+00 + PKER_SDRYG( 15, 36) = 0.132382E+00 + PKER_SDRYG( 15, 37) = 0.117317E+00 + PKER_SDRYG( 15, 38) = 0.107412E+00 + PKER_SDRYG( 15, 39) = 0.102138E+00 + PKER_SDRYG( 15, 40) = 0.100720E+00 + PKER_SDRYG( 15, 41) = 0.102430E+00 + PKER_SDRYG( 15, 42) = 0.106496E+00 + PKER_SDRYG( 15, 43) = 0.112243E+00 + PKER_SDRYG( 15, 44) = 0.119136E+00 + PKER_SDRYG( 15, 45) = 0.126711E+00 + PKER_SDRYG( 15, 46) = 0.134684E+00 + PKER_SDRYG( 15, 47) = 0.142774E+00 + PKER_SDRYG( 15, 48) = 0.150805E+00 + PKER_SDRYG( 15, 49) = 0.158681E+00 + PKER_SDRYG( 15, 50) = 0.166306E+00 + PKER_SDRYG( 15, 51) = 0.173620E+00 + PKER_SDRYG( 15, 52) = 0.180607E+00 + PKER_SDRYG( 15, 53) = 0.187254E+00 + PKER_SDRYG( 15, 54) = 0.193543E+00 + PKER_SDRYG( 15, 55) = 0.199475E+00 + PKER_SDRYG( 15, 56) = 0.205051E+00 + PKER_SDRYG( 15, 57) = 0.210294E+00 + PKER_SDRYG( 15, 58) = 0.215233E+00 + PKER_SDRYG( 15, 59) = 0.219886E+00 + PKER_SDRYG( 15, 60) = 0.224272E+00 + PKER_SDRYG( 15, 61) = 0.228402E+00 + PKER_SDRYG( 15, 62) = 0.232282E+00 + PKER_SDRYG( 15, 63) = 0.235924E+00 + PKER_SDRYG( 15, 64) = 0.239341E+00 + PKER_SDRYG( 15, 65) = 0.242545E+00 + PKER_SDRYG( 15, 66) = 0.245550E+00 + PKER_SDRYG( 15, 67) = 0.248370E+00 + PKER_SDRYG( 15, 68) = 0.251016E+00 + PKER_SDRYG( 15, 69) = 0.253499E+00 + PKER_SDRYG( 15, 70) = 0.255829E+00 + PKER_SDRYG( 15, 71) = 0.258016E+00 + PKER_SDRYG( 15, 72) = 0.260069E+00 + PKER_SDRYG( 15, 73) = 0.261996E+00 + PKER_SDRYG( 15, 74) = 0.263805E+00 + PKER_SDRYG( 15, 75) = 0.265503E+00 + PKER_SDRYG( 15, 76) = 0.267097E+00 + PKER_SDRYG( 15, 77) = 0.268594E+00 + PKER_SDRYG( 15, 78) = 0.270000E+00 + PKER_SDRYG( 15, 79) = 0.271319E+00 + PKER_SDRYG( 15, 80) = 0.272558E+00 + PKER_SDRYG( 16, 1) = 0.308423E+01 + PKER_SDRYG( 16, 2) = 0.288784E+01 + PKER_SDRYG( 16, 3) = 0.270343E+01 + PKER_SDRYG( 16, 4) = 0.253026E+01 + PKER_SDRYG( 16, 5) = 0.236765E+01 + PKER_SDRYG( 16, 6) = 0.221495E+01 + PKER_SDRYG( 16, 7) = 0.207156E+01 + PKER_SDRYG( 16, 8) = 0.193689E+01 + PKER_SDRYG( 16, 9) = 0.181043E+01 + PKER_SDRYG( 16, 10) = 0.169165E+01 + PKER_SDRYG( 16, 11) = 0.158009E+01 + PKER_SDRYG( 16, 12) = 0.147530E+01 + PKER_SDRYG( 16, 13) = 0.137686E+01 + PKER_SDRYG( 16, 14) = 0.128436E+01 + PKER_SDRYG( 16, 15) = 0.119745E+01 + PKER_SDRYG( 16, 16) = 0.111575E+01 + PKER_SDRYG( 16, 17) = 0.103893E+01 + PKER_SDRYG( 16, 18) = 0.966673E+00 + PKER_SDRYG( 16, 19) = 0.898666E+00 + PKER_SDRYG( 16, 20) = 0.834615E+00 + PKER_SDRYG( 16, 21) = 0.774233E+00 + PKER_SDRYG( 16, 22) = 0.717240E+00 + PKER_SDRYG( 16, 23) = 0.663360E+00 + PKER_SDRYG( 16, 24) = 0.612319E+00 + PKER_SDRYG( 16, 25) = 0.563842E+00 + PKER_SDRYG( 16, 26) = 0.517655E+00 + PKER_SDRYG( 16, 27) = 0.473486E+00 + PKER_SDRYG( 16, 28) = 0.431073E+00 + PKER_SDRYG( 16, 29) = 0.390189E+00 + PKER_SDRYG( 16, 30) = 0.350665E+00 + PKER_SDRYG( 16, 31) = 0.312442E+00 + PKER_SDRYG( 16, 32) = 0.275636E+00 + PKER_SDRYG( 16, 33) = 0.240542E+00 + PKER_SDRYG( 16, 34) = 0.207718E+00 + PKER_SDRYG( 16, 35) = 0.177836E+00 + PKER_SDRYG( 16, 36) = 0.151594E+00 + PKER_SDRYG( 16, 37) = 0.129702E+00 + PKER_SDRYG( 16, 38) = 0.112415E+00 + PKER_SDRYG( 16, 39) = 0.997384E-01 + PKER_SDRYG( 16, 40) = 0.914126E-01 + PKER_SDRYG( 16, 41) = 0.869384E-01 + PKER_SDRYG( 16, 42) = 0.856034E-01 + PKER_SDRYG( 16, 43) = 0.868406E-01 + PKER_SDRYG( 16, 44) = 0.900395E-01 + PKER_SDRYG( 16, 45) = 0.946372E-01 + PKER_SDRYG( 16, 46) = 0.100254E+00 + PKER_SDRYG( 16, 47) = 0.106487E+00 + PKER_SDRYG( 16, 48) = 0.113101E+00 + PKER_SDRYG( 16, 49) = 0.119871E+00 + PKER_SDRYG( 16, 50) = 0.126659E+00 + PKER_SDRYG( 16, 51) = 0.133342E+00 + PKER_SDRYG( 16, 52) = 0.139846E+00 + PKER_SDRYG( 16, 53) = 0.146127E+00 + PKER_SDRYG( 16, 54) = 0.152147E+00 + PKER_SDRYG( 16, 55) = 0.157896E+00 + PKER_SDRYG( 16, 56) = 0.163360E+00 + PKER_SDRYG( 16, 57) = 0.168528E+00 + PKER_SDRYG( 16, 58) = 0.173397E+00 + PKER_SDRYG( 16, 59) = 0.177982E+00 + PKER_SDRYG( 16, 60) = 0.182299E+00 + PKER_SDRYG( 16, 61) = 0.186373E+00 + PKER_SDRYG( 16, 62) = 0.190215E+00 + PKER_SDRYG( 16, 63) = 0.193838E+00 + PKER_SDRYG( 16, 64) = 0.197247E+00 + PKER_SDRYG( 16, 65) = 0.200450E+00 + PKER_SDRYG( 16, 66) = 0.203457E+00 + PKER_SDRYG( 16, 67) = 0.206278E+00 + PKER_SDRYG( 16, 68) = 0.208924E+00 + PKER_SDRYG( 16, 69) = 0.211408E+00 + PKER_SDRYG( 16, 70) = 0.213739E+00 + PKER_SDRYG( 16, 71) = 0.215926E+00 + PKER_SDRYG( 16, 72) = 0.217979E+00 + PKER_SDRYG( 16, 73) = 0.219907E+00 + PKER_SDRYG( 16, 74) = 0.221716E+00 + PKER_SDRYG( 16, 75) = 0.223414E+00 + PKER_SDRYG( 16, 76) = 0.225009E+00 + PKER_SDRYG( 16, 77) = 0.226506E+00 + PKER_SDRYG( 16, 78) = 0.227911E+00 + PKER_SDRYG( 16, 79) = 0.229231E+00 + PKER_SDRYG( 16, 80) = 0.230470E+00 + PKER_SDRYG( 17, 1) = 0.310358E+01 + PKER_SDRYG( 17, 2) = 0.290720E+01 + PKER_SDRYG( 17, 3) = 0.272279E+01 + PKER_SDRYG( 17, 4) = 0.254964E+01 + PKER_SDRYG( 17, 5) = 0.238704E+01 + PKER_SDRYG( 17, 6) = 0.223435E+01 + PKER_SDRYG( 17, 7) = 0.209097E+01 + PKER_SDRYG( 17, 8) = 0.195632E+01 + PKER_SDRYG( 17, 9) = 0.182988E+01 + PKER_SDRYG( 17, 10) = 0.171113E+01 + PKER_SDRYG( 17, 11) = 0.159960E+01 + PKER_SDRYG( 17, 12) = 0.149486E+01 + PKER_SDRYG( 17, 13) = 0.139647E+01 + PKER_SDRYG( 17, 14) = 0.130404E+01 + PKER_SDRYG( 17, 15) = 0.121720E+01 + PKER_SDRYG( 17, 16) = 0.113560E+01 + PKER_SDRYG( 17, 17) = 0.105890E+01 + PKER_SDRYG( 17, 18) = 0.986787E+00 + PKER_SDRYG( 17, 19) = 0.918963E+00 + PKER_SDRYG( 17, 20) = 0.855137E+00 + PKER_SDRYG( 17, 21) = 0.795034E+00 + PKER_SDRYG( 17, 22) = 0.738385E+00 + PKER_SDRYG( 17, 23) = 0.684932E+00 + PKER_SDRYG( 17, 24) = 0.634417E+00 + PKER_SDRYG( 17, 25) = 0.586588E+00 + PKER_SDRYG( 17, 26) = 0.541190E+00 + PKER_SDRYG( 17, 27) = 0.497968E+00 + PKER_SDRYG( 17, 28) = 0.456667E+00 + PKER_SDRYG( 17, 29) = 0.417040E+00 + PKER_SDRYG( 17, 30) = 0.378858E+00 + PKER_SDRYG( 17, 31) = 0.341935E+00 + PKER_SDRYG( 17, 32) = 0.306167E+00 + PKER_SDRYG( 17, 33) = 0.271581E+00 + PKER_SDRYG( 17, 34) = 0.238370E+00 + PKER_SDRYG( 17, 35) = 0.206924E+00 + PKER_SDRYG( 17, 36) = 0.177806E+00 + PKER_SDRYG( 17, 37) = 0.151640E+00 + PKER_SDRYG( 17, 38) = 0.129035E+00 + PKER_SDRYG( 17, 39) = 0.110359E+00 + PKER_SDRYG( 17, 40) = 0.956972E-01 + PKER_SDRYG( 17, 41) = 0.850722E-01 + PKER_SDRYG( 17, 42) = 0.779682E-01 + PKER_SDRYG( 17, 43) = 0.740481E-01 + PKER_SDRYG( 17, 44) = 0.727646E-01 + PKER_SDRYG( 17, 45) = 0.735553E-01 + PKER_SDRYG( 17, 46) = 0.759991E-01 + PKER_SDRYG( 17, 47) = 0.796568E-01 + PKER_SDRYG( 17, 48) = 0.841822E-01 + PKER_SDRYG( 17, 49) = 0.893114E-01 + PKER_SDRYG( 17, 50) = 0.947876E-01 + PKER_SDRYG( 17, 51) = 0.100463E+00 + PKER_SDRYG( 17, 52) = 0.106196E+00 + PKER_SDRYG( 17, 53) = 0.111874E+00 + PKER_SDRYG( 17, 54) = 0.117444E+00 + PKER_SDRYG( 17, 55) = 0.122848E+00 + PKER_SDRYG( 17, 56) = 0.128044E+00 + PKER_SDRYG( 17, 57) = 0.133022E+00 + PKER_SDRYG( 17, 58) = 0.137773E+00 + PKER_SDRYG( 17, 59) = 0.142278E+00 + PKER_SDRYG( 17, 60) = 0.146537E+00 + PKER_SDRYG( 17, 61) = 0.150550E+00 + PKER_SDRYG( 17, 62) = 0.154332E+00 + PKER_SDRYG( 17, 63) = 0.157901E+00 + PKER_SDRYG( 17, 64) = 0.161269E+00 + PKER_SDRYG( 17, 65) = 0.164447E+00 + PKER_SDRYG( 17, 66) = 0.167443E+00 + PKER_SDRYG( 17, 67) = 0.170260E+00 + PKER_SDRYG( 17, 68) = 0.172907E+00 + PKER_SDRYG( 17, 69) = 0.175391E+00 + PKER_SDRYG( 17, 70) = 0.177723E+00 + PKER_SDRYG( 17, 71) = 0.179911E+00 + PKER_SDRYG( 17, 72) = 0.181964E+00 + PKER_SDRYG( 17, 73) = 0.183892E+00 + PKER_SDRYG( 17, 74) = 0.185701E+00 + PKER_SDRYG( 17, 75) = 0.187400E+00 + PKER_SDRYG( 17, 76) = 0.188995E+00 + PKER_SDRYG( 17, 77) = 0.190492E+00 + PKER_SDRYG( 17, 78) = 0.191897E+00 + PKER_SDRYG( 17, 79) = 0.193217E+00 + PKER_SDRYG( 17, 80) = 0.194456E+00 + PKER_SDRYG( 18, 1) = 0.312013E+01 + PKER_SDRYG( 18, 2) = 0.292376E+01 + PKER_SDRYG( 18, 3) = 0.273936E+01 + PKER_SDRYG( 18, 4) = 0.256621E+01 + PKER_SDRYG( 18, 5) = 0.240361E+01 + PKER_SDRYG( 18, 6) = 0.225094E+01 + PKER_SDRYG( 18, 7) = 0.210757E+01 + PKER_SDRYG( 18, 8) = 0.197294E+01 + PKER_SDRYG( 18, 9) = 0.184651E+01 + PKER_SDRYG( 18, 10) = 0.172778E+01 + PKER_SDRYG( 18, 11) = 0.161628E+01 + PKER_SDRYG( 18, 12) = 0.151156E+01 + PKER_SDRYG( 18, 13) = 0.141321E+01 + PKER_SDRYG( 18, 14) = 0.132083E+01 + PKER_SDRYG( 18, 15) = 0.123405E+01 + PKER_SDRYG( 18, 16) = 0.115251E+01 + PKER_SDRYG( 18, 17) = 0.107590E+01 + PKER_SDRYG( 18, 18) = 0.100390E+01 + PKER_SDRYG( 18, 19) = 0.936202E+00 + PKER_SDRYG( 18, 20) = 0.872537E+00 + PKER_SDRYG( 18, 21) = 0.812633E+00 + PKER_SDRYG( 18, 22) = 0.756230E+00 + PKER_SDRYG( 18, 23) = 0.703080E+00 + PKER_SDRYG( 18, 24) = 0.652942E+00 + PKER_SDRYG( 18, 25) = 0.605576E+00 + PKER_SDRYG( 18, 26) = 0.560750E+00 + PKER_SDRYG( 18, 27) = 0.518227E+00 + PKER_SDRYG( 18, 28) = 0.477773E+00 + PKER_SDRYG( 18, 29) = 0.439152E+00 + PKER_SDRYG( 18, 30) = 0.402131E+00 + PKER_SDRYG( 18, 31) = 0.366493E+00 + PKER_SDRYG( 18, 32) = 0.332050E+00 + PKER_SDRYG( 18, 33) = 0.298676E+00 + PKER_SDRYG( 18, 34) = 0.266345E+00 + PKER_SDRYG( 18, 35) = 0.235168E+00 + PKER_SDRYG( 18, 36) = 0.205422E+00 + PKER_SDRYG( 18, 37) = 0.177545E+00 + PKER_SDRYG( 18, 38) = 0.152032E+00 + PKER_SDRYG( 18, 39) = 0.129423E+00 + PKER_SDRYG( 18, 40) = 0.110093E+00 + PKER_SDRYG( 18, 41) = 0.942133E-01 + PKER_SDRYG( 18, 42) = 0.818749E-01 + PKER_SDRYG( 18, 43) = 0.728212E-01 + PKER_SDRYG( 18, 44) = 0.667257E-01 + PKER_SDRYG( 18, 45) = 0.632100E-01 + PKER_SDRYG( 18, 46) = 0.618886E-01 + PKER_SDRYG( 18, 47) = 0.622846E-01 + PKER_SDRYG( 18, 48) = 0.640674E-01 + PKER_SDRYG( 18, 49) = 0.669386E-01 + PKER_SDRYG( 18, 50) = 0.705747E-01 + PKER_SDRYG( 18, 51) = 0.747677E-01 + PKER_SDRYG( 18, 52) = 0.793092E-01 + PKER_SDRYG( 18, 53) = 0.840736E-01 + PKER_SDRYG( 18, 54) = 0.889086E-01 + PKER_SDRYG( 18, 55) = 0.937517E-01 + PKER_SDRYG( 18, 56) = 0.985202E-01 + PKER_SDRYG( 18, 57) = 0.103163E+00 + PKER_SDRYG( 18, 58) = 0.107658E+00 + PKER_SDRYG( 18, 59) = 0.111974E+00 + PKER_SDRYG( 18, 60) = 0.116103E+00 + PKER_SDRYG( 18, 61) = 0.120035E+00 + PKER_SDRYG( 18, 62) = 0.123761E+00 + PKER_SDRYG( 18, 63) = 0.127277E+00 + PKER_SDRYG( 18, 64) = 0.130593E+00 + PKER_SDRYG( 18, 65) = 0.133720E+00 + PKER_SDRYG( 18, 66) = 0.136675E+00 + PKER_SDRYG( 18, 67) = 0.139464E+00 + PKER_SDRYG( 18, 68) = 0.142096E+00 + PKER_SDRYG( 18, 69) = 0.144574E+00 + PKER_SDRYG( 18, 70) = 0.146905E+00 + PKER_SDRYG( 18, 71) = 0.149093E+00 + PKER_SDRYG( 18, 72) = 0.151147E+00 + PKER_SDRYG( 18, 73) = 0.153075E+00 + PKER_SDRYG( 18, 74) = 0.154885E+00 + PKER_SDRYG( 18, 75) = 0.156583E+00 + PKER_SDRYG( 18, 76) = 0.158178E+00 + PKER_SDRYG( 18, 77) = 0.159675E+00 + PKER_SDRYG( 18, 78) = 0.161081E+00 + PKER_SDRYG( 18, 79) = 0.162401E+00 + PKER_SDRYG( 18, 80) = 0.163640E+00 + PKER_SDRYG( 19, 1) = 0.313430E+01 + PKER_SDRYG( 19, 2) = 0.293792E+01 + PKER_SDRYG( 19, 3) = 0.275353E+01 + PKER_SDRYG( 19, 4) = 0.258038E+01 + PKER_SDRYG( 19, 5) = 0.241780E+01 + PKER_SDRYG( 19, 6) = 0.226513E+01 + PKER_SDRYG( 19, 7) = 0.212176E+01 + PKER_SDRYG( 19, 8) = 0.198714E+01 + PKER_SDRYG( 19, 9) = 0.186073E+01 + PKER_SDRYG( 19, 10) = 0.174202E+01 + PKER_SDRYG( 19, 11) = 0.163053E+01 + PKER_SDRYG( 19, 12) = 0.152584E+01 + PKER_SDRYG( 19, 13) = 0.142751E+01 + PKER_SDRYG( 19, 14) = 0.133517E+01 + PKER_SDRYG( 19, 15) = 0.124842E+01 + PKER_SDRYG( 19, 16) = 0.116694E+01 + PKER_SDRYG( 19, 17) = 0.109039E+01 + PKER_SDRYG( 19, 18) = 0.101846E+01 + PKER_SDRYG( 19, 19) = 0.950864E+00 + PKER_SDRYG( 19, 20) = 0.887315E+00 + PKER_SDRYG( 19, 21) = 0.827553E+00 + PKER_SDRYG( 19, 22) = 0.771326E+00 + PKER_SDRYG( 19, 23) = 0.718393E+00 + PKER_SDRYG( 19, 24) = 0.668523E+00 + PKER_SDRYG( 19, 25) = 0.621489E+00 + PKER_SDRYG( 19, 26) = 0.577071E+00 + PKER_SDRYG( 19, 27) = 0.535052E+00 + PKER_SDRYG( 19, 28) = 0.495215E+00 + PKER_SDRYG( 19, 29) = 0.457343E+00 + PKER_SDRYG( 19, 30) = 0.421219E+00 + PKER_SDRYG( 19, 31) = 0.386628E+00 + PKER_SDRYG( 19, 32) = 0.353366E+00 + PKER_SDRYG( 19, 33) = 0.321252E+00 + PKER_SDRYG( 19, 34) = 0.290155E+00 + PKER_SDRYG( 19, 35) = 0.260019E+00 + PKER_SDRYG( 19, 36) = 0.230899E+00 + PKER_SDRYG( 19, 37) = 0.202987E+00 + PKER_SDRYG( 19, 38) = 0.176611E+00 + PKER_SDRYG( 19, 39) = 0.152167E+00 + PKER_SDRYG( 19, 40) = 0.130090E+00 + PKER_SDRYG( 19, 41) = 0.110741E+00 + PKER_SDRYG( 19, 42) = 0.943181E-01 + PKER_SDRYG( 19, 43) = 0.809330E-01 + PKER_SDRYG( 19, 44) = 0.704716E-01 + PKER_SDRYG( 19, 45) = 0.626544E-01 + PKER_SDRYG( 19, 46) = 0.573699E-01 + PKER_SDRYG( 19, 47) = 0.541204E-01 + PKER_SDRYG( 19, 48) = 0.527083E-01 + PKER_SDRYG( 19, 49) = 0.527892E-01 + PKER_SDRYG( 19, 50) = 0.540394E-01 + PKER_SDRYG( 19, 51) = 0.562337E-01 + PKER_SDRYG( 19, 52) = 0.591260E-01 + PKER_SDRYG( 19, 53) = 0.625315E-01 + PKER_SDRYG( 19, 54) = 0.662926E-01 + PKER_SDRYG( 19, 55) = 0.702636E-01 + PKER_SDRYG( 19, 56) = 0.743493E-01 + PKER_SDRYG( 19, 57) = 0.784688E-01 + PKER_SDRYG( 19, 58) = 0.825487E-01 + PKER_SDRYG( 19, 59) = 0.865492E-01 + PKER_SDRYG( 19, 60) = 0.904344E-01 + PKER_SDRYG( 19, 61) = 0.941778E-01 + PKER_SDRYG( 19, 62) = 0.977677E-01 + PKER_SDRYG( 19, 63) = 0.101199E+00 + PKER_SDRYG( 19, 64) = 0.104457E+00 + PKER_SDRYG( 19, 65) = 0.107540E+00 + PKER_SDRYG( 19, 66) = 0.110449E+00 + PKER_SDRYG( 19, 67) = 0.113194E+00 + PKER_SDRYG( 19, 68) = 0.115786E+00 + PKER_SDRYG( 19, 69) = 0.118234E+00 + PKER_SDRYG( 19, 70) = 0.120546E+00 + PKER_SDRYG( 19, 71) = 0.122726E+00 + PKER_SDRYG( 19, 72) = 0.124778E+00 + PKER_SDRYG( 19, 73) = 0.126705E+00 + PKER_SDRYG( 19, 74) = 0.128515E+00 + PKER_SDRYG( 19, 75) = 0.130214E+00 + PKER_SDRYG( 19, 76) = 0.131809E+00 + PKER_SDRYG( 19, 77) = 0.133307E+00 + PKER_SDRYG( 19, 78) = 0.134712E+00 + PKER_SDRYG( 19, 79) = 0.136032E+00 + PKER_SDRYG( 19, 80) = 0.137271E+00 + PKER_SDRYG( 20, 1) = 0.314641E+01 + PKER_SDRYG( 20, 2) = 0.295004E+01 + PKER_SDRYG( 20, 3) = 0.276565E+01 + PKER_SDRYG( 20, 4) = 0.259251E+01 + PKER_SDRYG( 20, 5) = 0.242993E+01 + PKER_SDRYG( 20, 6) = 0.227726E+01 + PKER_SDRYG( 20, 7) = 0.213391E+01 + PKER_SDRYG( 20, 8) = 0.199929E+01 + PKER_SDRYG( 20, 9) = 0.187289E+01 + PKER_SDRYG( 20, 10) = 0.175419E+01 + PKER_SDRYG( 20, 11) = 0.164272E+01 + PKER_SDRYG( 20, 12) = 0.153804E+01 + PKER_SDRYG( 20, 13) = 0.143974E+01 + PKER_SDRYG( 20, 14) = 0.134741E+01 + PKER_SDRYG( 20, 15) = 0.126070E+01 + PKER_SDRYG( 20, 16) = 0.117926E+01 + PKER_SDRYG( 20, 17) = 0.110275E+01 + PKER_SDRYG( 20, 18) = 0.103088E+01 + PKER_SDRYG( 20, 19) = 0.963347E+00 + PKER_SDRYG( 20, 20) = 0.899882E+00 + PKER_SDRYG( 20, 21) = 0.840222E+00 + PKER_SDRYG( 20, 22) = 0.784121E+00 + PKER_SDRYG( 20, 23) = 0.731345E+00 + PKER_SDRYG( 20, 24) = 0.681666E+00 + PKER_SDRYG( 20, 25) = 0.634870E+00 + PKER_SDRYG( 20, 26) = 0.590745E+00 + PKER_SDRYG( 20, 27) = 0.549087E+00 + PKER_SDRYG( 20, 28) = 0.509694E+00 + PKER_SDRYG( 20, 29) = 0.472366E+00 + PKER_SDRYG( 20, 30) = 0.436902E+00 + PKER_SDRYG( 20, 31) = 0.403104E+00 + PKER_SDRYG( 20, 32) = 0.370773E+00 + PKER_SDRYG( 20, 33) = 0.339721E+00 + PKER_SDRYG( 20, 34) = 0.309780E+00 + PKER_SDRYG( 20, 35) = 0.280817E+00 + PKER_SDRYG( 20, 36) = 0.252766E+00 + PKER_SDRYG( 20, 37) = 0.225649E+00 + PKER_SDRYG( 20, 38) = 0.199598E+00 + PKER_SDRYG( 20, 39) = 0.174855E+00 + PKER_SDRYG( 20, 40) = 0.151733E+00 + PKER_SDRYG( 20, 41) = 0.130576E+00 + PKER_SDRYG( 20, 42) = 0.111685E+00 + PKER_SDRYG( 20, 43) = 0.952438E-01 + PKER_SDRYG( 20, 44) = 0.813642E-01 + PKER_SDRYG( 20, 45) = 0.700036E-01 + PKER_SDRYG( 20, 46) = 0.610159E-01 + PKER_SDRYG( 20, 47) = 0.542824E-01 + PKER_SDRYG( 20, 48) = 0.495365E-01 + PKER_SDRYG( 20, 49) = 0.465418E-01 + PKER_SDRYG( 20, 50) = 0.450362E-01 + PKER_SDRYG( 20, 51) = 0.448236E-01 + PKER_SDRYG( 20, 52) = 0.456174E-01 + PKER_SDRYG( 20, 53) = 0.472243E-01 + PKER_SDRYG( 20, 54) = 0.495059E-01 + PKER_SDRYG( 20, 55) = 0.522568E-01 + PKER_SDRYG( 20, 56) = 0.553442E-01 + PKER_SDRYG( 20, 57) = 0.586561E-01 + PKER_SDRYG( 20, 58) = 0.621124E-01 + PKER_SDRYG( 20, 59) = 0.656027E-01 + PKER_SDRYG( 20, 60) = 0.690997E-01 + PKER_SDRYG( 20, 61) = 0.725427E-01 + PKER_SDRYG( 20, 62) = 0.758958E-01 + PKER_SDRYG( 20, 63) = 0.791459E-01 + PKER_SDRYG( 20, 64) = 0.822686E-01 + PKER_SDRYG( 20, 65) = 0.852588E-01 + PKER_SDRYG( 20, 66) = 0.881095E-01 + PKER_SDRYG( 20, 67) = 0.908129E-01 + PKER_SDRYG( 20, 68) = 0.933663E-01 + PKER_SDRYG( 20, 69) = 0.957757E-01 + PKER_SDRYG( 20, 70) = 0.980498E-01 + PKER_SDRYG( 20, 71) = 0.100200E+00 + PKER_SDRYG( 20, 72) = 0.102230E+00 + PKER_SDRYG( 20, 73) = 0.104147E+00 + PKER_SDRYG( 20, 74) = 0.105953E+00 + PKER_SDRYG( 20, 75) = 0.107651E+00 + PKER_SDRYG( 20, 76) = 0.109246E+00 + PKER_SDRYG( 20, 77) = 0.110743E+00 + PKER_SDRYG( 20, 78) = 0.112149E+00 + PKER_SDRYG( 20, 79) = 0.113469E+00 + PKER_SDRYG( 20, 80) = 0.114708E+00 + PKER_SDRYG( 21, 1) = 0.315678E+01 + PKER_SDRYG( 21, 2) = 0.296041E+01 + PKER_SDRYG( 21, 3) = 0.277602E+01 + PKER_SDRYG( 21, 4) = 0.260288E+01 + PKER_SDRYG( 21, 5) = 0.244030E+01 + PKER_SDRYG( 21, 6) = 0.228764E+01 + PKER_SDRYG( 21, 7) = 0.214429E+01 + PKER_SDRYG( 21, 8) = 0.200969E+01 + PKER_SDRYG( 21, 9) = 0.188329E+01 + PKER_SDRYG( 21, 10) = 0.176459E+01 + PKER_SDRYG( 21, 11) = 0.165314E+01 + PKER_SDRYG( 21, 12) = 0.154847E+01 + PKER_SDRYG( 21, 13) = 0.145018E+01 + PKER_SDRYG( 21, 14) = 0.135788E+01 + PKER_SDRYG( 21, 15) = 0.127119E+01 + PKER_SDRYG( 21, 16) = 0.118977E+01 + PKER_SDRYG( 21, 17) = 0.111330E+01 + PKER_SDRYG( 21, 18) = 0.104147E+01 + PKER_SDRYG( 21, 19) = 0.973984E+00 + PKER_SDRYG( 21, 20) = 0.910579E+00 + PKER_SDRYG( 21, 21) = 0.850994E+00 + PKER_SDRYG( 21, 22) = 0.794985E+00 + PKER_SDRYG( 21, 23) = 0.742321E+00 + PKER_SDRYG( 21, 24) = 0.692781E+00 + PKER_SDRYG( 21, 25) = 0.646155E+00 + PKER_SDRYG( 21, 26) = 0.602240E+00 + PKER_SDRYG( 21, 27) = 0.560841E+00 + PKER_SDRYG( 21, 28) = 0.521767E+00 + PKER_SDRYG( 21, 29) = 0.484831E+00 + PKER_SDRYG( 21, 30) = 0.449847E+00 + PKER_SDRYG( 21, 31) = 0.416632E+00 + PKER_SDRYG( 21, 32) = 0.385000E+00 + PKER_SDRYG( 21, 33) = 0.354772E+00 + PKER_SDRYG( 21, 34) = 0.325773E+00 + PKER_SDRYG( 21, 35) = 0.297848E+00 + PKER_SDRYG( 21, 36) = 0.270871E+00 + PKER_SDRYG( 21, 37) = 0.244771E+00 + PKER_SDRYG( 21, 38) = 0.219552E+00 + PKER_SDRYG( 21, 39) = 0.195307E+00 + PKER_SDRYG( 21, 40) = 0.172218E+00 + PKER_SDRYG( 21, 41) = 0.150528E+00 + PKER_SDRYG( 21, 42) = 0.130506E+00 + PKER_SDRYG( 21, 43) = 0.112387E+00 + PKER_SDRYG( 21, 44) = 0.963217E-01 + PKER_SDRYG( 21, 45) = 0.824142E-01 + PKER_SDRYG( 21, 46) = 0.706536E-01 + PKER_SDRYG( 21, 47) = 0.609423E-01 + PKER_SDRYG( 21, 48) = 0.532273E-01 + PKER_SDRYG( 21, 49) = 0.473264E-01 + PKER_SDRYG( 21, 50) = 0.429933E-01 + PKER_SDRYG( 21, 51) = 0.402064E-01 + PKER_SDRYG( 21, 52) = 0.386102E-01 + PKER_SDRYG( 21, 53) = 0.381308E-01 + PKER_SDRYG( 21, 54) = 0.385657E-01 + PKER_SDRYG( 21, 55) = 0.397270E-01 + PKER_SDRYG( 21, 56) = 0.414742E-01 + PKER_SDRYG( 21, 57) = 0.436663E-01 + PKER_SDRYG( 21, 58) = 0.461938E-01 + PKER_SDRYG( 21, 59) = 0.489445E-01 + PKER_SDRYG( 21, 60) = 0.518374E-01 + PKER_SDRYG( 21, 61) = 0.548037E-01 + PKER_SDRYG( 21, 62) = 0.577875E-01 + PKER_SDRYG( 21, 63) = 0.607451E-01 + PKER_SDRYG( 21, 64) = 0.636436E-01 + PKER_SDRYG( 21, 65) = 0.664592E-01 + PKER_SDRYG( 21, 66) = 0.691751E-01 + PKER_SDRYG( 21, 67) = 0.717806E-01 + PKER_SDRYG( 21, 68) = 0.742731E-01 + PKER_SDRYG( 21, 69) = 0.766406E-01 + PKER_SDRYG( 21, 70) = 0.788820E-01 + PKER_SDRYG( 21, 71) = 0.809983E-01 + PKER_SDRYG( 21, 72) = 0.829967E-01 + PKER_SDRYG( 21, 73) = 0.848837E-01 + PKER_SDRYG( 21, 74) = 0.866675E-01 + PKER_SDRYG( 21, 75) = 0.883526E-01 + PKER_SDRYG( 21, 76) = 0.899415E-01 + PKER_SDRYG( 21, 77) = 0.914371E-01 + PKER_SDRYG( 21, 78) = 0.928426E-01 + PKER_SDRYG( 21, 79) = 0.941625E-01 + PKER_SDRYG( 21, 80) = 0.954017E-01 + PKER_SDRYG( 22, 1) = 0.316565E+01 + PKER_SDRYG( 22, 2) = 0.296928E+01 + PKER_SDRYG( 22, 3) = 0.278490E+01 + PKER_SDRYG( 22, 4) = 0.261176E+01 + PKER_SDRYG( 22, 5) = 0.244918E+01 + PKER_SDRYG( 22, 6) = 0.229652E+01 + PKER_SDRYG( 22, 7) = 0.215318E+01 + PKER_SDRYG( 22, 8) = 0.201857E+01 + PKER_SDRYG( 22, 9) = 0.189218E+01 + PKER_SDRYG( 22, 10) = 0.177349E+01 + PKER_SDRYG( 22, 11) = 0.166204E+01 + PKER_SDRYG( 22, 12) = 0.155739E+01 + PKER_SDRYG( 22, 13) = 0.145911E+01 + PKER_SDRYG( 22, 14) = 0.136682E+01 + PKER_SDRYG( 22, 15) = 0.128015E+01 + PKER_SDRYG( 22, 16) = 0.119875E+01 + PKER_SDRYG( 22, 17) = 0.112230E+01 + PKER_SDRYG( 22, 18) = 0.105050E+01 + PKER_SDRYG( 22, 19) = 0.983055E+00 + PKER_SDRYG( 22, 20) = 0.919694E+00 + PKER_SDRYG( 22, 21) = 0.860163E+00 + PKER_SDRYG( 22, 22) = 0.804221E+00 + PKER_SDRYG( 22, 23) = 0.751638E+00 + PKER_SDRYG( 22, 24) = 0.702199E+00 + PKER_SDRYG( 22, 25) = 0.655696E+00 + PKER_SDRYG( 22, 26) = 0.611933E+00 + PKER_SDRYG( 22, 27) = 0.570720E+00 + PKER_SDRYG( 22, 28) = 0.531876E+00 + PKER_SDRYG( 22, 29) = 0.495222E+00 + PKER_SDRYG( 22, 30) = 0.460585E+00 + PKER_SDRYG( 22, 31) = 0.427793E+00 + PKER_SDRYG( 22, 32) = 0.396676E+00 + PKER_SDRYG( 22, 33) = 0.367065E+00 + PKER_SDRYG( 22, 34) = 0.338793E+00 + PKER_SDRYG( 22, 35) = 0.311700E+00 + PKER_SDRYG( 22, 36) = 0.285643E+00 + PKER_SDRYG( 22, 37) = 0.260506E+00 + PKER_SDRYG( 22, 38) = 0.236218E+00 + PKER_SDRYG( 22, 39) = 0.212773E+00 + PKER_SDRYG( 22, 40) = 0.190240E+00 + PKER_SDRYG( 22, 41) = 0.168759E+00 + PKER_SDRYG( 22, 42) = 0.148523E+00 + PKER_SDRYG( 22, 43) = 0.129738E+00 + PKER_SDRYG( 22, 44) = 0.112583E+00 + PKER_SDRYG( 22, 45) = 0.971811E-01 + PKER_SDRYG( 22, 46) = 0.835936E-01 + PKER_SDRYG( 22, 47) = 0.718231E-01 + PKER_SDRYG( 22, 48) = 0.618072E-01 + PKER_SDRYG( 22, 49) = 0.534898E-01 + PKER_SDRYG( 22, 50) = 0.467624E-01 + PKER_SDRYG( 22, 51) = 0.414860E-01 + PKER_SDRYG( 22, 52) = 0.375763E-01 + PKER_SDRYG( 22, 53) = 0.348805E-01 + PKER_SDRYG( 22, 54) = 0.332667E-01 + PKER_SDRYG( 22, 55) = 0.325688E-01 + PKER_SDRYG( 22, 56) = 0.326954E-01 + PKER_SDRYG( 22, 57) = 0.334646E-01 + PKER_SDRYG( 22, 58) = 0.347486E-01 + PKER_SDRYG( 22, 59) = 0.364906E-01 + PKER_SDRYG( 22, 60) = 0.385370E-01 + PKER_SDRYG( 22, 61) = 0.408038E-01 + PKER_SDRYG( 22, 62) = 0.432264E-01 + PKER_SDRYG( 22, 63) = 0.457437E-01 + PKER_SDRYG( 22, 64) = 0.482800E-01 + PKER_SDRYG( 22, 65) = 0.508227E-01 + PKER_SDRYG( 22, 66) = 0.533231E-01 + PKER_SDRYG( 22, 67) = 0.557593E-01 + PKER_SDRYG( 22, 68) = 0.581222E-01 + PKER_SDRYG( 22, 69) = 0.603926E-01 + PKER_SDRYG( 22, 70) = 0.625678E-01 + PKER_SDRYG( 22, 71) = 0.646420E-01 + PKER_SDRYG( 22, 72) = 0.666097E-01 + PKER_SDRYG( 22, 73) = 0.684688E-01 + PKER_SDRYG( 22, 74) = 0.702238E-01 + PKER_SDRYG( 22, 75) = 0.718811E-01 + PKER_SDRYG( 22, 76) = 0.734478E-01 + PKER_SDRYG( 22, 77) = 0.749287E-01 + PKER_SDRYG( 22, 78) = 0.763265E-01 + PKER_SDRYG( 22, 79) = 0.776433E-01 + PKER_SDRYG( 22, 80) = 0.788817E-01 + PKER_SDRYG( 23, 1) = 0.317324E+01 + PKER_SDRYG( 23, 2) = 0.297688E+01 + PKER_SDRYG( 23, 3) = 0.279249E+01 + PKER_SDRYG( 23, 4) = 0.261935E+01 + PKER_SDRYG( 23, 5) = 0.245678E+01 + PKER_SDRYG( 23, 6) = 0.230412E+01 + PKER_SDRYG( 23, 7) = 0.216078E+01 + PKER_SDRYG( 23, 8) = 0.202618E+01 + PKER_SDRYG( 23, 9) = 0.189979E+01 + PKER_SDRYG( 23, 10) = 0.178111E+01 + PKER_SDRYG( 23, 11) = 0.166966E+01 + PKER_SDRYG( 23, 12) = 0.156501E+01 + PKER_SDRYG( 23, 13) = 0.146674E+01 + PKER_SDRYG( 23, 14) = 0.137446E+01 + PKER_SDRYG( 23, 15) = 0.128780E+01 + PKER_SDRYG( 23, 16) = 0.120642E+01 + PKER_SDRYG( 23, 17) = 0.112999E+01 + PKER_SDRYG( 23, 18) = 0.105821E+01 + PKER_SDRYG( 23, 19) = 0.990793E+00 + PKER_SDRYG( 23, 20) = 0.927466E+00 + PKER_SDRYG( 23, 21) = 0.867975E+00 + PKER_SDRYG( 23, 22) = 0.812081E+00 + PKER_SDRYG( 23, 23) = 0.759559E+00 + PKER_SDRYG( 23, 24) = 0.710192E+00 + PKER_SDRYG( 23, 25) = 0.663779E+00 + PKER_SDRYG( 23, 26) = 0.620126E+00 + PKER_SDRYG( 23, 27) = 0.579048E+00 + PKER_SDRYG( 23, 28) = 0.540370E+00 + PKER_SDRYG( 23, 29) = 0.503920E+00 + PKER_SDRYG( 23, 30) = 0.469534E+00 + PKER_SDRYG( 23, 31) = 0.437049E+00 + PKER_SDRYG( 23, 32) = 0.406307E+00 + PKER_SDRYG( 23, 33) = 0.377150E+00 + PKER_SDRYG( 23, 34) = 0.349422E+00 + PKER_SDRYG( 23, 35) = 0.322971E+00 + PKER_SDRYG( 23, 36) = 0.297649E+00 + PKER_SDRYG( 23, 37) = 0.273324E+00 + PKER_SDRYG( 23, 38) = 0.249890E+00 + PKER_SDRYG( 23, 39) = 0.227278E+00 + PKER_SDRYG( 23, 40) = 0.205477E+00 + PKER_SDRYG( 23, 41) = 0.184540E+00 + PKER_SDRYG( 23, 42) = 0.164581E+00 + PKER_SDRYG( 23, 43) = 0.145753E+00 + PKER_SDRYG( 23, 44) = 0.128220E+00 + PKER_SDRYG( 23, 45) = 0.112118E+00 + PKER_SDRYG( 23, 46) = 0.975291E-01 + PKER_SDRYG( 23, 47) = 0.844965E-01 + PKER_SDRYG( 23, 48) = 0.730043E-01 + PKER_SDRYG( 23, 49) = 0.629937E-01 + PKER_SDRYG( 23, 50) = 0.544338E-01 + PKER_SDRYG( 23, 51) = 0.472364E-01 + PKER_SDRYG( 23, 52) = 0.413003E-01 + PKER_SDRYG( 23, 53) = 0.366010E-01 + PKER_SDRYG( 23, 54) = 0.330232E-01 + PKER_SDRYG( 23, 55) = 0.304152E-01 + PKER_SDRYG( 23, 56) = 0.287909E-01 + PKER_SDRYG( 23, 57) = 0.279201E-01 + PKER_SDRYG( 23, 58) = 0.277828E-01 + PKER_SDRYG( 23, 59) = 0.282422E-01 + PKER_SDRYG( 23, 60) = 0.291874E-01 + PKER_SDRYG( 23, 61) = 0.305223E-01 + PKER_SDRYG( 23, 62) = 0.321561E-01 + PKER_SDRYG( 23, 63) = 0.340230E-01 + PKER_SDRYG( 23, 64) = 0.360382E-01 + PKER_SDRYG( 23, 65) = 0.381505E-01 + PKER_SDRYG( 23, 66) = 0.403137E-01 + PKER_SDRYG( 23, 67) = 0.424862E-01 + PKER_SDRYG( 23, 68) = 0.446395E-01 + PKER_SDRYG( 23, 69) = 0.467491E-01 + PKER_SDRYG( 23, 70) = 0.487982E-01 + PKER_SDRYG( 23, 71) = 0.507757E-01 + PKER_SDRYG( 23, 72) = 0.526730E-01 + PKER_SDRYG( 23, 73) = 0.544887E-01 + PKER_SDRYG( 23, 74) = 0.562135E-01 + PKER_SDRYG( 23, 75) = 0.578463E-01 + PKER_SDRYG( 23, 76) = 0.593889E-01 + PKER_SDRYG( 23, 77) = 0.608458E-01 + PKER_SDRYG( 23, 78) = 0.622217E-01 + PKER_SDRYG( 23, 79) = 0.635229E-01 + PKER_SDRYG( 23, 80) = 0.647520E-01 + PKER_SDRYG( 24, 1) = 0.317974E+01 + PKER_SDRYG( 24, 2) = 0.298337E+01 + PKER_SDRYG( 24, 3) = 0.279898E+01 + PKER_SDRYG( 24, 4) = 0.262585E+01 + PKER_SDRYG( 24, 5) = 0.246328E+01 + PKER_SDRYG( 24, 6) = 0.231062E+01 + PKER_SDRYG( 24, 7) = 0.216728E+01 + PKER_SDRYG( 24, 8) = 0.203268E+01 + PKER_SDRYG( 24, 9) = 0.190630E+01 + PKER_SDRYG( 24, 10) = 0.178762E+01 + PKER_SDRYG( 24, 11) = 0.167618E+01 + PKER_SDRYG( 24, 12) = 0.157153E+01 + PKER_SDRYG( 24, 13) = 0.147327E+01 + PKER_SDRYG( 24, 14) = 0.138100E+01 + PKER_SDRYG( 24, 15) = 0.129435E+01 + PKER_SDRYG( 24, 16) = 0.121298E+01 + PKER_SDRYG( 24, 17) = 0.113656E+01 + PKER_SDRYG( 24, 18) = 0.106480E+01 + PKER_SDRYG( 24, 19) = 0.997399E+00 + PKER_SDRYG( 24, 20) = 0.934096E+00 + PKER_SDRYG( 24, 21) = 0.874634E+00 + PKER_SDRYG( 24, 22) = 0.818777E+00 + PKER_SDRYG( 24, 23) = 0.766298E+00 + PKER_SDRYG( 24, 24) = 0.716985E+00 + PKER_SDRYG( 24, 25) = 0.670637E+00 + PKER_SDRYG( 24, 26) = 0.627064E+00 + PKER_SDRYG( 24, 27) = 0.586085E+00 + PKER_SDRYG( 24, 28) = 0.547527E+00 + PKER_SDRYG( 24, 29) = 0.511226E+00 + PKER_SDRYG( 24, 30) = 0.477021E+00 + PKER_SDRYG( 24, 31) = 0.444759E+00 + PKER_SDRYG( 24, 32) = 0.414290E+00 + PKER_SDRYG( 24, 33) = 0.385466E+00 + PKER_SDRYG( 24, 34) = 0.358141E+00 + PKER_SDRYG( 24, 35) = 0.332171E+00 + PKER_SDRYG( 24, 36) = 0.307415E+00 + PKER_SDRYG( 24, 37) = 0.283739E+00 + PKER_SDRYG( 24, 38) = 0.261021E+00 + PKER_SDRYG( 24, 39) = 0.239161E+00 + PKER_SDRYG( 24, 40) = 0.218098E+00 + PKER_SDRYG( 24, 41) = 0.197816E+00 + PKER_SDRYG( 24, 42) = 0.178358E+00 + PKER_SDRYG( 24, 43) = 0.159817E+00 + PKER_SDRYG( 24, 44) = 0.142322E+00 + PKER_SDRYG( 24, 45) = 0.126004E+00 + PKER_SDRYG( 24, 46) = 0.110966E+00 + PKER_SDRYG( 24, 47) = 0.972696E-01 + PKER_SDRYG( 24, 48) = 0.849240E-01 + PKER_SDRYG( 24, 49) = 0.739011E-01 + PKER_SDRYG( 24, 50) = 0.641503E-01 + PKER_SDRYG( 24, 51) = 0.556168E-01 + PKER_SDRYG( 24, 52) = 0.482410E-01 + PKER_SDRYG( 24, 53) = 0.419558E-01 + PKER_SDRYG( 24, 54) = 0.367232E-01 + PKER_SDRYG( 24, 55) = 0.324850E-01 + PKER_SDRYG( 24, 56) = 0.291562E-01 + PKER_SDRYG( 24, 57) = 0.266947E-01 + PKER_SDRYG( 24, 58) = 0.250249E-01 + PKER_SDRYG( 24, 59) = 0.240671E-01 + PKER_SDRYG( 24, 60) = 0.237119E-01 + PKER_SDRYG( 24, 61) = 0.239149E-01 + PKER_SDRYG( 24, 62) = 0.245541E-01 + PKER_SDRYG( 24, 63) = 0.255388E-01 + PKER_SDRYG( 24, 64) = 0.268448E-01 + PKER_SDRYG( 24, 65) = 0.283592E-01 + PKER_SDRYG( 24, 66) = 0.300237E-01 + PKER_SDRYG( 24, 67) = 0.317974E-01 + PKER_SDRYG( 24, 68) = 0.336350E-01 + PKER_SDRYG( 24, 69) = 0.354861E-01 + PKER_SDRYG( 24, 70) = 0.373396E-01 + PKER_SDRYG( 24, 71) = 0.391617E-01 + PKER_SDRYG( 24, 72) = 0.409381E-01 + PKER_SDRYG( 24, 73) = 0.426598E-01 + PKER_SDRYG( 24, 74) = 0.443148E-01 + PKER_SDRYG( 24, 75) = 0.459007E-01 + PKER_SDRYG( 24, 76) = 0.474126E-01 + PKER_SDRYG( 24, 77) = 0.488471E-01 + PKER_SDRYG( 24, 78) = 0.502027E-01 + PKER_SDRYG( 24, 79) = 0.514825E-01 + PKER_SDRYG( 24, 80) = 0.526915E-01 + PKER_SDRYG( 25, 1) = 0.318529E+01 + PKER_SDRYG( 25, 2) = 0.298893E+01 + PKER_SDRYG( 25, 3) = 0.280454E+01 + PKER_SDRYG( 25, 4) = 0.263141E+01 + PKER_SDRYG( 25, 5) = 0.246884E+01 + PKER_SDRYG( 25, 6) = 0.231618E+01 + PKER_SDRYG( 25, 7) = 0.217284E+01 + PKER_SDRYG( 25, 8) = 0.203825E+01 + PKER_SDRYG( 25, 9) = 0.191186E+01 + PKER_SDRYG( 25, 10) = 0.179319E+01 + PKER_SDRYG( 25, 11) = 0.168175E+01 + PKER_SDRYG( 25, 12) = 0.157711E+01 + PKER_SDRYG( 25, 13) = 0.147885E+01 + PKER_SDRYG( 25, 14) = 0.138659E+01 + PKER_SDRYG( 25, 15) = 0.129994E+01 + PKER_SDRYG( 25, 16) = 0.121858E+01 + PKER_SDRYG( 25, 17) = 0.114218E+01 + PKER_SDRYG( 25, 18) = 0.107042E+01 + PKER_SDRYG( 25, 19) = 0.100304E+01 + PKER_SDRYG( 25, 20) = 0.939754E+00 + PKER_SDRYG( 25, 21) = 0.880315E+00 + PKER_SDRYG( 25, 22) = 0.824484E+00 + PKER_SDRYG( 25, 23) = 0.772038E+00 + PKER_SDRYG( 25, 24) = 0.722764E+00 + PKER_SDRYG( 25, 25) = 0.676465E+00 + PKER_SDRYG( 25, 26) = 0.632951E+00 + PKER_SDRYG( 25, 27) = 0.592044E+00 + PKER_SDRYG( 25, 28) = 0.553574E+00 + PKER_SDRYG( 25, 29) = 0.517380E+00 + PKER_SDRYG( 25, 30) = 0.483308E+00 + PKER_SDRYG( 25, 31) = 0.451208E+00 + PKER_SDRYG( 25, 32) = 0.420937E+00 + PKER_SDRYG( 25, 33) = 0.392356E+00 + PKER_SDRYG( 25, 34) = 0.365326E+00 + PKER_SDRYG( 25, 35) = 0.339713E+00 + PKER_SDRYG( 25, 36) = 0.315384E+00 + PKER_SDRYG( 25, 37) = 0.292209E+00 + PKER_SDRYG( 25, 38) = 0.270064E+00 + PKER_SDRYG( 25, 39) = 0.248837E+00 + PKER_SDRYG( 25, 40) = 0.228437E+00 + PKER_SDRYG( 25, 41) = 0.208804E+00 + PKER_SDRYG( 25, 42) = 0.189923E+00 + PKER_SDRYG( 25, 43) = 0.171829E+00 + PKER_SDRYG( 25, 44) = 0.154601E+00 + PKER_SDRYG( 25, 45) = 0.138347E+00 + PKER_SDRYG( 25, 46) = 0.123178E+00 + PKER_SDRYG( 25, 47) = 0.109173E+00 + PKER_SDRYG( 25, 48) = 0.963727E-01 + PKER_SDRYG( 25, 49) = 0.847717E-01 + PKER_SDRYG( 25, 50) = 0.743296E-01 + PKER_SDRYG( 25, 51) = 0.649850E-01 + PKER_SDRYG( 25, 52) = 0.566822E-01 + PKER_SDRYG( 25, 53) = 0.493595E-01 + PKER_SDRYG( 25, 54) = 0.429562E-01 + PKER_SDRYG( 25, 55) = 0.374539E-01 + PKER_SDRYG( 25, 56) = 0.328017E-01 + PKER_SDRYG( 25, 57) = 0.289442E-01 + PKER_SDRYG( 25, 58) = 0.258795E-01 + PKER_SDRYG( 25, 59) = 0.235524E-01 + PKER_SDRYG( 25, 60) = 0.218674E-01 + PKER_SDRYG( 25, 61) = 0.208371E-01 + PKER_SDRYG( 25, 62) = 0.203194E-01 + PKER_SDRYG( 25, 63) = 0.203049E-01 + PKER_SDRYG( 25, 64) = 0.206977E-01 + PKER_SDRYG( 25, 65) = 0.214318E-01 + PKER_SDRYG( 25, 66) = 0.224335E-01 + PKER_SDRYG( 25, 67) = 0.236433E-01 + PKER_SDRYG( 25, 68) = 0.250200E-01 + PKER_SDRYG( 25, 69) = 0.264977E-01 + PKER_SDRYG( 25, 70) = 0.280428E-01 + PKER_SDRYG( 25, 71) = 0.296240E-01 + PKER_SDRYG( 25, 72) = 0.312105E-01 + PKER_SDRYG( 25, 73) = 0.327816E-01 + PKER_SDRYG( 25, 74) = 0.343205E-01 + PKER_SDRYG( 25, 75) = 0.358148E-01 + PKER_SDRYG( 25, 76) = 0.372575E-01 + PKER_SDRYG( 25, 77) = 0.386413E-01 + PKER_SDRYG( 25, 78) = 0.399659E-01 + PKER_SDRYG( 25, 79) = 0.412241E-01 + PKER_SDRYG( 25, 80) = 0.424150E-01 + PKER_SDRYG( 26, 1) = 0.319005E+01 + PKER_SDRYG( 26, 2) = 0.299368E+01 + PKER_SDRYG( 26, 3) = 0.280930E+01 + PKER_SDRYG( 26, 4) = 0.263616E+01 + PKER_SDRYG( 26, 5) = 0.247359E+01 + PKER_SDRYG( 26, 6) = 0.232094E+01 + PKER_SDRYG( 26, 7) = 0.217760E+01 + PKER_SDRYG( 26, 8) = 0.204301E+01 + PKER_SDRYG( 26, 9) = 0.191663E+01 + PKER_SDRYG( 26, 10) = 0.179795E+01 + PKER_SDRYG( 26, 11) = 0.168652E+01 + PKER_SDRYG( 26, 12) = 0.158188E+01 + PKER_SDRYG( 26, 13) = 0.148363E+01 + PKER_SDRYG( 26, 14) = 0.139136E+01 + PKER_SDRYG( 26, 15) = 0.130473E+01 + PKER_SDRYG( 26, 16) = 0.122337E+01 + PKER_SDRYG( 26, 17) = 0.114697E+01 + PKER_SDRYG( 26, 18) = 0.107523E+01 + PKER_SDRYG( 26, 19) = 0.100786E+01 + PKER_SDRYG( 26, 20) = 0.944586E+00 + PKER_SDRYG( 26, 21) = 0.885163E+00 + PKER_SDRYG( 26, 22) = 0.829352E+00 + PKER_SDRYG( 26, 23) = 0.776930E+00 + PKER_SDRYG( 26, 24) = 0.727686E+00 + PKER_SDRYG( 26, 25) = 0.681422E+00 + PKER_SDRYG( 26, 26) = 0.637952E+00 + PKER_SDRYG( 26, 27) = 0.597097E+00 + PKER_SDRYG( 26, 28) = 0.558692E+00 + PKER_SDRYG( 26, 29) = 0.522578E+00 + PKER_SDRYG( 26, 30) = 0.488602E+00 + PKER_SDRYG( 26, 31) = 0.456621E+00 + PKER_SDRYG( 26, 32) = 0.426495E+00 + PKER_SDRYG( 26, 33) = 0.398091E+00 + PKER_SDRYG( 26, 34) = 0.371278E+00 + PKER_SDRYG( 26, 35) = 0.345928E+00 + PKER_SDRYG( 26, 36) = 0.321917E+00 + PKER_SDRYG( 26, 37) = 0.299121E+00 + PKER_SDRYG( 26, 38) = 0.277419E+00 + PKER_SDRYG( 26, 39) = 0.256699E+00 + PKER_SDRYG( 26, 40) = 0.236857E+00 + PKER_SDRYG( 26, 41) = 0.217808E+00 + PKER_SDRYG( 26, 42) = 0.199498E+00 + PKER_SDRYG( 26, 43) = 0.181910E+00 + PKER_SDRYG( 26, 44) = 0.165073E+00 + PKER_SDRYG( 26, 45) = 0.149056E+00 + PKER_SDRYG( 26, 46) = 0.133952E+00 + PKER_SDRYG( 26, 47) = 0.119852E+00 + PKER_SDRYG( 26, 48) = 0.106824E+00 + PKER_SDRYG( 26, 49) = 0.948930E-01 + PKER_SDRYG( 26, 50) = 0.840437E-01 + PKER_SDRYG( 26, 51) = 0.742268E-01 + PKER_SDRYG( 26, 52) = 0.653792E-01 + PKER_SDRYG( 26, 53) = 0.574320E-01 + PKER_SDRYG( 26, 54) = 0.503214E-01 + PKER_SDRYG( 26, 55) = 0.439973E-01 + PKER_SDRYG( 26, 56) = 0.384248E-01 + PKER_SDRYG( 26, 57) = 0.335714E-01 + PKER_SDRYG( 26, 58) = 0.294087E-01 + PKER_SDRYG( 26, 59) = 0.259221E-01 + PKER_SDRYG( 26, 60) = 0.230931E-01 + PKER_SDRYG( 26, 61) = 0.208678E-01 + PKER_SDRYG( 26, 62) = 0.192226E-01 + PKER_SDRYG( 26, 63) = 0.181215E-01 + PKER_SDRYG( 26, 64) = 0.175118E-01 + PKER_SDRYG( 26, 65) = 0.173173E-01 + PKER_SDRYG( 26, 66) = 0.175126E-01 + PKER_SDRYG( 26, 67) = 0.180143E-01 + PKER_SDRYG( 26, 68) = 0.187588E-01 + PKER_SDRYG( 26, 69) = 0.197277E-01 + PKER_SDRYG( 26, 70) = 0.208458E-01 + PKER_SDRYG( 26, 71) = 0.220691E-01 + PKER_SDRYG( 26, 72) = 0.233679E-01 + PKER_SDRYG( 26, 73) = 0.247120E-01 + PKER_SDRYG( 26, 74) = 0.260656E-01 + PKER_SDRYG( 26, 75) = 0.274186E-01 + PKER_SDRYG( 26, 76) = 0.287488E-01 + PKER_SDRYG( 26, 77) = 0.300462E-01 + PKER_SDRYG( 26, 78) = 0.313023E-01 + PKER_SDRYG( 26, 79) = 0.325101E-01 + PKER_SDRYG( 26, 80) = 0.336677E-01 + PKER_SDRYG( 27, 1) = 0.319411E+01 + PKER_SDRYG( 27, 2) = 0.299775E+01 + PKER_SDRYG( 27, 3) = 0.281337E+01 + PKER_SDRYG( 27, 4) = 0.264023E+01 + PKER_SDRYG( 27, 5) = 0.247766E+01 + PKER_SDRYG( 27, 6) = 0.232501E+01 + PKER_SDRYG( 27, 7) = 0.218167E+01 + PKER_SDRYG( 27, 8) = 0.204708E+01 + PKER_SDRYG( 27, 9) = 0.192070E+01 + PKER_SDRYG( 27, 10) = 0.180203E+01 + PKER_SDRYG( 27, 11) = 0.169060E+01 + PKER_SDRYG( 27, 12) = 0.158596E+01 + PKER_SDRYG( 27, 13) = 0.148771E+01 + PKER_SDRYG( 27, 14) = 0.139545E+01 + PKER_SDRYG( 27, 15) = 0.130882E+01 + PKER_SDRYG( 27, 16) = 0.122746E+01 + PKER_SDRYG( 27, 17) = 0.115107E+01 + PKER_SDRYG( 27, 18) = 0.107934E+01 + PKER_SDRYG( 27, 19) = 0.101197E+01 + PKER_SDRYG( 27, 20) = 0.948712E+00 + PKER_SDRYG( 27, 21) = 0.889302E+00 + PKER_SDRYG( 27, 22) = 0.833506E+00 + PKER_SDRYG( 27, 23) = 0.781102E+00 + PKER_SDRYG( 27, 24) = 0.731880E+00 + PKER_SDRYG( 27, 25) = 0.685643E+00 + PKER_SDRYG( 27, 26) = 0.642205E+00 + PKER_SDRYG( 27, 27) = 0.601390E+00 + PKER_SDRYG( 27, 28) = 0.563032E+00 + PKER_SDRYG( 27, 29) = 0.526976E+00 + PKER_SDRYG( 27, 30) = 0.493071E+00 + PKER_SDRYG( 27, 31) = 0.461177E+00 + PKER_SDRYG( 27, 32) = 0.431158E+00 + PKER_SDRYG( 27, 33) = 0.402883E+00 + PKER_SDRYG( 27, 34) = 0.376229E+00 + PKER_SDRYG( 27, 35) = 0.351073E+00 + PKER_SDRYG( 27, 36) = 0.327297E+00 + PKER_SDRYG( 27, 37) = 0.304783E+00 + PKER_SDRYG( 27, 38) = 0.283419E+00 + PKER_SDRYG( 27, 39) = 0.263094E+00 + PKER_SDRYG( 27, 40) = 0.243701E+00 + PKER_SDRYG( 27, 41) = 0.225146E+00 + PKER_SDRYG( 27, 42) = 0.207352E+00 + PKER_SDRYG( 27, 43) = 0.190265E+00 + PKER_SDRYG( 27, 44) = 0.173872E+00 + PKER_SDRYG( 27, 45) = 0.158194E+00 + PKER_SDRYG( 27, 46) = 0.143292E+00 + PKER_SDRYG( 27, 47) = 0.129246E+00 + PKER_SDRYG( 27, 48) = 0.116137E+00 + PKER_SDRYG( 27, 49) = 0.104019E+00 + PKER_SDRYG( 27, 50) = 0.929097E-01 + PKER_SDRYG( 27, 51) = 0.827874E-01 + PKER_SDRYG( 27, 52) = 0.735998E-01 + PKER_SDRYG( 27, 53) = 0.652790E-01 + PKER_SDRYG( 27, 54) = 0.577537E-01 + PKER_SDRYG( 27, 55) = 0.509584E-01 + PKER_SDRYG( 27, 56) = 0.448376E-01 + PKER_SDRYG( 27, 57) = 0.393546E-01 + PKER_SDRYG( 27, 58) = 0.344768E-01 + PKER_SDRYG( 27, 59) = 0.301795E-01 + PKER_SDRYG( 27, 60) = 0.264605E-01 + PKER_SDRYG( 27, 61) = 0.233008E-01 + PKER_SDRYG( 27, 62) = 0.206714E-01 + PKER_SDRYG( 27, 63) = 0.185744E-01 + PKER_SDRYG( 27, 64) = 0.169884E-01 + PKER_SDRYG( 27, 65) = 0.158478E-01 + PKER_SDRYG( 27, 66) = 0.151582E-01 + PKER_SDRYG( 27, 67) = 0.148323E-01 + PKER_SDRYG( 27, 68) = 0.148592E-01 + PKER_SDRYG( 27, 69) = 0.151721E-01 + PKER_SDRYG( 27, 70) = 0.157308E-01 + PKER_SDRYG( 27, 71) = 0.164769E-01 + PKER_SDRYG( 27, 72) = 0.173707E-01 + PKER_SDRYG( 27, 73) = 0.183846E-01 + PKER_SDRYG( 27, 74) = 0.194688E-01 + PKER_SDRYG( 27, 75) = 0.206001E-01 + PKER_SDRYG( 27, 76) = 0.217573E-01 + PKER_SDRYG( 27, 77) = 0.229174E-01 + PKER_SDRYG( 27, 78) = 0.240651E-01 + PKER_SDRYG( 27, 79) = 0.251891E-01 + PKER_SDRYG( 27, 80) = 0.262800E-01 + PKER_SDRYG( 28, 1) = 0.319759E+01 + PKER_SDRYG( 28, 2) = 0.300123E+01 + PKER_SDRYG( 28, 3) = 0.281685E+01 + PKER_SDRYG( 28, 4) = 0.264371E+01 + PKER_SDRYG( 28, 5) = 0.248114E+01 + PKER_SDRYG( 28, 6) = 0.232849E+01 + PKER_SDRYG( 28, 7) = 0.218516E+01 + PKER_SDRYG( 28, 8) = 0.205056E+01 + PKER_SDRYG( 28, 9) = 0.192418E+01 + PKER_SDRYG( 28, 10) = 0.180551E+01 + PKER_SDRYG( 28, 11) = 0.169408E+01 + PKER_SDRYG( 28, 12) = 0.158945E+01 + PKER_SDRYG( 28, 13) = 0.149120E+01 + PKER_SDRYG( 28, 14) = 0.139894E+01 + PKER_SDRYG( 28, 15) = 0.131231E+01 + PKER_SDRYG( 28, 16) = 0.123097E+01 + PKER_SDRYG( 28, 17) = 0.115458E+01 + PKER_SDRYG( 28, 18) = 0.108285E+01 + PKER_SDRYG( 28, 19) = 0.101549E+01 + PKER_SDRYG( 28, 20) = 0.952238E+00 + PKER_SDRYG( 28, 21) = 0.892837E+00 + PKER_SDRYG( 28, 22) = 0.837052E+00 + PKER_SDRYG( 28, 23) = 0.784662E+00 + PKER_SDRYG( 28, 24) = 0.735456E+00 + PKER_SDRYG( 28, 25) = 0.689239E+00 + PKER_SDRYG( 28, 26) = 0.645825E+00 + PKER_SDRYG( 28, 27) = 0.605039E+00 + PKER_SDRYG( 28, 28) = 0.566718E+00 + PKER_SDRYG( 28, 29) = 0.530704E+00 + PKER_SDRYG( 28, 30) = 0.496852E+00 + PKER_SDRYG( 28, 31) = 0.465022E+00 + PKER_SDRYG( 28, 32) = 0.435081E+00 + PKER_SDRYG( 28, 33) = 0.406902E+00 + PKER_SDRYG( 28, 34) = 0.380365E+00 + PKER_SDRYG( 28, 35) = 0.355351E+00 + PKER_SDRYG( 28, 36) = 0.331748E+00 + PKER_SDRYG( 28, 37) = 0.309445E+00 + PKER_SDRYG( 28, 38) = 0.288334E+00 + PKER_SDRYG( 28, 39) = 0.268309E+00 + PKER_SDRYG( 28, 40) = 0.249267E+00 + PKER_SDRYG( 28, 41) = 0.231112E+00 + PKER_SDRYG( 28, 42) = 0.213755E+00 + PKER_SDRYG( 28, 43) = 0.197125E+00 + PKER_SDRYG( 28, 44) = 0.181172E+00 + PKER_SDRYG( 28, 45) = 0.165882E+00 + PKER_SDRYG( 28, 46) = 0.151274E+00 + PKER_SDRYG( 28, 47) = 0.137400E+00 + PKER_SDRYG( 28, 48) = 0.124331E+00 + PKER_SDRYG( 28, 49) = 0.112135E+00 + PKER_SDRYG( 28, 50) = 0.100860E+00 + PKER_SDRYG( 28, 51) = 0.905169E-01 + PKER_SDRYG( 28, 52) = 0.810815E-01 + PKER_SDRYG( 28, 53) = 0.725012E-01 + PKER_SDRYG( 28, 54) = 0.647084E-01 + PKER_SDRYG( 28, 55) = 0.576308E-01 + PKER_SDRYG( 28, 56) = 0.512005E-01 + PKER_SDRYG( 28, 57) = 0.453625E-01 + PKER_SDRYG( 28, 58) = 0.400717E-01 + PKER_SDRYG( 28, 59) = 0.352935E-01 + PKER_SDRYG( 28, 60) = 0.310071E-01 + PKER_SDRYG( 28, 61) = 0.272018E-01 + PKER_SDRYG( 28, 62) = 0.238669E-01 + PKER_SDRYG( 28, 63) = 0.209938E-01 + PKER_SDRYG( 28, 64) = 0.185775E-01 + PKER_SDRYG( 28, 65) = 0.166174E-01 + PKER_SDRYG( 28, 66) = 0.150755E-01 + PKER_SDRYG( 28, 67) = 0.139364E-01 + PKER_SDRYG( 28, 68) = 0.131851E-01 + PKER_SDRYG( 28, 69) = 0.127769E-01 + PKER_SDRYG( 28, 70) = 0.126668E-01 + PKER_SDRYG( 28, 71) = 0.128310E-01 + PKER_SDRYG( 28, 72) = 0.132148E-01 + PKER_SDRYG( 28, 73) = 0.137746E-01 + PKER_SDRYG( 28, 74) = 0.144895E-01 + PKER_SDRYG( 28, 75) = 0.153140E-01 + PKER_SDRYG( 28, 76) = 0.162131E-01 + PKER_SDRYG( 28, 77) = 0.171648E-01 + PKER_SDRYG( 28, 78) = 0.181488E-01 + PKER_SDRYG( 28, 79) = 0.191394E-01 + PKER_SDRYG( 28, 80) = 0.201280E-01 + PKER_SDRYG( 29, 1) = 0.320057E+01 + PKER_SDRYG( 29, 2) = 0.300421E+01 + PKER_SDRYG( 29, 3) = 0.281983E+01 + PKER_SDRYG( 29, 4) = 0.264669E+01 + PKER_SDRYG( 29, 5) = 0.248412E+01 + PKER_SDRYG( 29, 6) = 0.233147E+01 + PKER_SDRYG( 29, 7) = 0.218814E+01 + PKER_SDRYG( 29, 8) = 0.205355E+01 + PKER_SDRYG( 29, 9) = 0.192717E+01 + PKER_SDRYG( 29, 10) = 0.180850E+01 + PKER_SDRYG( 29, 11) = 0.169707E+01 + PKER_SDRYG( 29, 12) = 0.159244E+01 + PKER_SDRYG( 29, 13) = 0.149419E+01 + PKER_SDRYG( 29, 14) = 0.140193E+01 + PKER_SDRYG( 29, 15) = 0.131530E+01 + PKER_SDRYG( 29, 16) = 0.123396E+01 + PKER_SDRYG( 29, 17) = 0.115758E+01 + PKER_SDRYG( 29, 18) = 0.108585E+01 + PKER_SDRYG( 29, 19) = 0.101850E+01 + PKER_SDRYG( 29, 20) = 0.955250E+00 + PKER_SDRYG( 29, 21) = 0.895856E+00 + PKER_SDRYG( 29, 22) = 0.840080E+00 + PKER_SDRYG( 29, 23) = 0.787700E+00 + PKER_SDRYG( 29, 24) = 0.738507E+00 + PKER_SDRYG( 29, 25) = 0.692305E+00 + PKER_SDRYG( 29, 26) = 0.648909E+00 + PKER_SDRYG( 29, 27) = 0.608145E+00 + PKER_SDRYG( 29, 28) = 0.569850E+00 + PKER_SDRYG( 29, 29) = 0.533869E+00 + PKER_SDRYG( 29, 30) = 0.500057E+00 + PKER_SDRYG( 29, 31) = 0.468274E+00 + PKER_SDRYG( 29, 32) = 0.438391E+00 + PKER_SDRYG( 29, 33) = 0.410283E+00 + PKER_SDRYG( 29, 34) = 0.383831E+00 + PKER_SDRYG( 29, 35) = 0.358922E+00 + PKER_SDRYG( 29, 36) = 0.335447E+00 + PKER_SDRYG( 29, 37) = 0.313300E+00 + PKER_SDRYG( 29, 38) = 0.292377E+00 + PKER_SDRYG( 29, 39) = 0.272578E+00 + PKER_SDRYG( 29, 40) = 0.253805E+00 + PKER_SDRYG( 29, 41) = 0.235964E+00 + PKER_SDRYG( 29, 42) = 0.218962E+00 + PKER_SDRYG( 29, 43) = 0.202721E+00 + PKER_SDRYG( 29, 44) = 0.187172E+00 + PKER_SDRYG( 29, 45) = 0.172272E+00 + PKER_SDRYG( 29, 46) = 0.158003E+00 + PKER_SDRYG( 29, 47) = 0.144383E+00 + PKER_SDRYG( 29, 48) = 0.131457E+00 + PKER_SDRYG( 29, 49) = 0.119287E+00 + PKER_SDRYG( 29, 50) = 0.107934E+00 + PKER_SDRYG( 29, 51) = 0.974376E-01 + PKER_SDRYG( 29, 52) = 0.878049E-01 + PKER_SDRYG( 29, 53) = 0.790110E-01 + PKER_SDRYG( 29, 54) = 0.710047E-01 + PKER_SDRYG( 29, 55) = 0.637201E-01 + PKER_SDRYG( 29, 56) = 0.570871E-01 + PKER_SDRYG( 29, 57) = 0.510391E-01 + PKER_SDRYG( 29, 58) = 0.455190E-01 + PKER_SDRYG( 29, 59) = 0.404790E-01 + PKER_SDRYG( 29, 60) = 0.358835E-01 + PKER_SDRYG( 29, 61) = 0.317075E-01 + PKER_SDRYG( 29, 62) = 0.279360E-01 + PKER_SDRYG( 29, 63) = 0.245579E-01 + PKER_SDRYG( 29, 64) = 0.215683E-01 + PKER_SDRYG( 29, 65) = 0.189675E-01 + PKER_SDRYG( 29, 66) = 0.167538E-01 + PKER_SDRYG( 29, 67) = 0.149086E-01 + PKER_SDRYG( 29, 68) = 0.134333E-01 + PKER_SDRYG( 29, 69) = 0.123230E-01 + PKER_SDRYG( 29, 70) = 0.115303E-01 + PKER_SDRYG( 29, 71) = 0.110545E-01 + PKER_SDRYG( 29, 72) = 0.108420E-01 + PKER_SDRYG( 29, 73) = 0.108817E-01 + PKER_SDRYG( 29, 74) = 0.111244E-01 + PKER_SDRYG( 29, 75) = 0.115437E-01 + PKER_SDRYG( 29, 76) = 0.120983E-01 + PKER_SDRYG( 29, 77) = 0.127573E-01 + PKER_SDRYG( 29, 78) = 0.135034E-01 + PKER_SDRYG( 29, 79) = 0.142993E-01 + PKER_SDRYG( 29, 80) = 0.151279E-01 + PKER_SDRYG( 30, 1) = 0.320312E+01 + PKER_SDRYG( 30, 2) = 0.300676E+01 + PKER_SDRYG( 30, 3) = 0.282237E+01 + PKER_SDRYG( 30, 4) = 0.264924E+01 + PKER_SDRYG( 30, 5) = 0.248667E+01 + PKER_SDRYG( 30, 6) = 0.233402E+01 + PKER_SDRYG( 30, 7) = 0.219069E+01 + PKER_SDRYG( 30, 8) = 0.205610E+01 + PKER_SDRYG( 30, 9) = 0.192972E+01 + PKER_SDRYG( 30, 10) = 0.181105E+01 + PKER_SDRYG( 30, 11) = 0.169962E+01 + PKER_SDRYG( 30, 12) = 0.159499E+01 + PKER_SDRYG( 30, 13) = 0.149674E+01 + PKER_SDRYG( 30, 14) = 0.140449E+01 + PKER_SDRYG( 30, 15) = 0.131786E+01 + PKER_SDRYG( 30, 16) = 0.123652E+01 + PKER_SDRYG( 30, 17) = 0.116014E+01 + PKER_SDRYG( 30, 18) = 0.108842E+01 + PKER_SDRYG( 30, 19) = 0.102107E+01 + PKER_SDRYG( 30, 20) = 0.957825E+00 + PKER_SDRYG( 30, 21) = 0.898436E+00 + PKER_SDRYG( 30, 22) = 0.842667E+00 + PKER_SDRYG( 30, 23) = 0.790295E+00 + PKER_SDRYG( 30, 24) = 0.741111E+00 + PKER_SDRYG( 30, 25) = 0.694920E+00 + PKER_SDRYG( 30, 26) = 0.651538E+00 + PKER_SDRYG( 30, 27) = 0.610791E+00 + PKER_SDRYG( 30, 28) = 0.572516E+00 + PKER_SDRYG( 30, 29) = 0.536559E+00 + PKER_SDRYG( 30, 30) = 0.502776E+00 + PKER_SDRYG( 30, 31) = 0.471029E+00 + PKER_SDRYG( 30, 32) = 0.441189E+00 + PKER_SDRYG( 30, 33) = 0.413133E+00 + PKER_SDRYG( 30, 34) = 0.386745E+00 + PKER_SDRYG( 30, 35) = 0.361914E+00 + PKER_SDRYG( 30, 36) = 0.338534E+00 + PKER_SDRYG( 30, 37) = 0.316502E+00 + PKER_SDRYG( 30, 38) = 0.295719E+00 + PKER_SDRYG( 30, 39) = 0.276089E+00 + PKER_SDRYG( 30, 40) = 0.257519E+00 + PKER_SDRYG( 30, 41) = 0.239918E+00 + PKER_SDRYG( 30, 42) = 0.223197E+00 + PKER_SDRYG( 30, 43) = 0.207273E+00 + PKER_SDRYG( 30, 44) = 0.192071E+00 + PKER_SDRYG( 30, 45) = 0.177528E+00 + PKER_SDRYG( 30, 46) = 0.163604E+00 + PKER_SDRYG( 30, 47) = 0.150282E+00 + PKER_SDRYG( 30, 48) = 0.137575E+00 + PKER_SDRYG( 30, 49) = 0.125525E+00 + PKER_SDRYG( 30, 50) = 0.114185E+00 + PKER_SDRYG( 30, 51) = 0.103610E+00 + PKER_SDRYG( 30, 52) = 0.938314E-01 + PKER_SDRYG( 30, 53) = 0.848558E-01 + PKER_SDRYG( 30, 54) = 0.766574E-01 + PKER_SDRYG( 30, 55) = 0.691873E-01 + PKER_SDRYG( 30, 56) = 0.623830E-01 + PKER_SDRYG( 30, 57) = 0.561775E-01 + PKER_SDRYG( 30, 58) = 0.505069E-01 + PKER_SDRYG( 30, 59) = 0.453150E-01 + PKER_SDRYG( 30, 60) = 0.405539E-01 + PKER_SDRYG( 30, 61) = 0.361851E-01 + PKER_SDRYG( 30, 62) = 0.321814E-01 + PKER_SDRYG( 30, 63) = 0.285232E-01 + PKER_SDRYG( 30, 64) = 0.251963E-01 + PKER_SDRYG( 30, 65) = 0.221941E-01 + PKER_SDRYG( 30, 66) = 0.195174E-01 + PKER_SDRYG( 30, 67) = 0.171634E-01 + PKER_SDRYG( 30, 68) = 0.151306E-01 + PKER_SDRYG( 30, 69) = 0.134200E-01 + PKER_SDRYG( 30, 70) = 0.120326E-01 + PKER_SDRYG( 30, 71) = 0.109418E-01 + PKER_SDRYG( 30, 72) = 0.101394E-01 + PKER_SDRYG( 30, 73) = 0.961608E-02 + PKER_SDRYG( 30, 74) = 0.933453E-02 + PKER_SDRYG( 30, 75) = 0.927173E-02 + PKER_SDRYG( 30, 76) = 0.940407E-02 + PKER_SDRYG( 30, 77) = 0.969318E-02 + PKER_SDRYG( 30, 78) = 0.101124E-01 + PKER_SDRYG( 30, 79) = 0.106403E-01 + PKER_SDRYG( 30, 80) = 0.112467E-01 + PKER_SDRYG( 31, 1) = 0.320530E+01 + PKER_SDRYG( 31, 2) = 0.300894E+01 + PKER_SDRYG( 31, 3) = 0.282455E+01 + PKER_SDRYG( 31, 4) = 0.265142E+01 + PKER_SDRYG( 31, 5) = 0.248885E+01 + PKER_SDRYG( 31, 6) = 0.233620E+01 + PKER_SDRYG( 31, 7) = 0.219287E+01 + PKER_SDRYG( 31, 8) = 0.205828E+01 + PKER_SDRYG( 31, 9) = 0.193190E+01 + PKER_SDRYG( 31, 10) = 0.181323E+01 + PKER_SDRYG( 31, 11) = 0.170180E+01 + PKER_SDRYG( 31, 12) = 0.159717E+01 + PKER_SDRYG( 31, 13) = 0.149893E+01 + PKER_SDRYG( 31, 14) = 0.140668E+01 + PKER_SDRYG( 31, 15) = 0.132005E+01 + PKER_SDRYG( 31, 16) = 0.123871E+01 + PKER_SDRYG( 31, 17) = 0.116233E+01 + PKER_SDRYG( 31, 18) = 0.109061E+01 + PKER_SDRYG( 31, 19) = 0.102327E+01 + PKER_SDRYG( 31, 20) = 0.960026E+00 + PKER_SDRYG( 31, 21) = 0.900641E+00 + PKER_SDRYG( 31, 22) = 0.844877E+00 + PKER_SDRYG( 31, 23) = 0.792511E+00 + PKER_SDRYG( 31, 24) = 0.743334E+00 + PKER_SDRYG( 31, 25) = 0.697152E+00 + PKER_SDRYG( 31, 26) = 0.653780E+00 + PKER_SDRYG( 31, 27) = 0.613046E+00 + PKER_SDRYG( 31, 28) = 0.574786E+00 + PKER_SDRYG( 31, 29) = 0.538847E+00 + PKER_SDRYG( 31, 30) = 0.505086E+00 + PKER_SDRYG( 31, 31) = 0.473366E+00 + PKER_SDRYG( 31, 32) = 0.443558E+00 + PKER_SDRYG( 31, 33) = 0.415542E+00 + PKER_SDRYG( 31, 34) = 0.389201E+00 + PKER_SDRYG( 31, 35) = 0.364428E+00 + PKER_SDRYG( 31, 36) = 0.341118E+00 + PKER_SDRYG( 31, 37) = 0.319171E+00 + PKER_SDRYG( 31, 38) = 0.298492E+00 + PKER_SDRYG( 31, 39) = 0.278989E+00 + PKER_SDRYG( 31, 40) = 0.260571E+00 + PKER_SDRYG( 31, 41) = 0.243153E+00 + PKER_SDRYG( 31, 42) = 0.226648E+00 + PKER_SDRYG( 31, 43) = 0.210975E+00 + PKER_SDRYG( 31, 44) = 0.196056E+00 + PKER_SDRYG( 31, 45) = 0.181823E+00 + PKER_SDRYG( 31, 46) = 0.168217E+00 + PKER_SDRYG( 31, 47) = 0.155200E+00 + PKER_SDRYG( 31, 48) = 0.142755E+00 + PKER_SDRYG( 31, 49) = 0.130895E+00 + PKER_SDRYG( 31, 50) = 0.119654E+00 + PKER_SDRYG( 31, 51) = 0.109081E+00 + PKER_SDRYG( 31, 52) = 0.992231E-01 + PKER_SDRYG( 31, 53) = 0.901085E-01 + PKER_SDRYG( 31, 54) = 0.817403E-01 + PKER_SDRYG( 31, 55) = 0.740936E-01 + PKER_SDRYG( 31, 56) = 0.671220E-01 + PKER_SDRYG( 31, 57) = 0.607667E-01 + PKER_SDRYG( 31, 58) = 0.549649E-01 + PKER_SDRYG( 31, 59) = 0.496562E-01 + PKER_SDRYG( 31, 60) = 0.447864E-01 + PKER_SDRYG( 31, 61) = 0.403087E-01 + PKER_SDRYG( 31, 62) = 0.361850E-01 + PKER_SDRYG( 31, 63) = 0.323859E-01 + PKER_SDRYG( 31, 64) = 0.288877E-01 + PKER_SDRYG( 31, 65) = 0.256749E-01 + PKER_SDRYG( 31, 66) = 0.227386E-01 + PKER_SDRYG( 31, 67) = 0.200734E-01 + PKER_SDRYG( 31, 68) = 0.176775E-01 + PKER_SDRYG( 31, 69) = 0.155527E-01 + PKER_SDRYG( 31, 70) = 0.136989E-01 + PKER_SDRYG( 31, 71) = 0.121210E-01 + PKER_SDRYG( 31, 72) = 0.108058E-01 + PKER_SDRYG( 31, 73) = 0.975234E-02 + PKER_SDRYG( 31, 74) = 0.896449E-02 + PKER_SDRYG( 31, 75) = 0.840572E-02 + PKER_SDRYG( 31, 76) = 0.807166E-02 + PKER_SDRYG( 31, 77) = 0.793136E-02 + PKER_SDRYG( 31, 78) = 0.797231E-02 + PKER_SDRYG( 31, 79) = 0.815684E-02 + PKER_SDRYG( 31, 80) = 0.847058E-02 + PKER_SDRYG( 32, 1) = 0.320717E+01 + PKER_SDRYG( 32, 2) = 0.301080E+01 + PKER_SDRYG( 32, 3) = 0.282642E+01 + PKER_SDRYG( 32, 4) = 0.265329E+01 + PKER_SDRYG( 32, 5) = 0.249072E+01 + PKER_SDRYG( 32, 6) = 0.233807E+01 + PKER_SDRYG( 32, 7) = 0.219474E+01 + PKER_SDRYG( 32, 8) = 0.206015E+01 + PKER_SDRYG( 32, 9) = 0.193377E+01 + PKER_SDRYG( 32, 10) = 0.181510E+01 + PKER_SDRYG( 32, 11) = 0.170367E+01 + PKER_SDRYG( 32, 12) = 0.159904E+01 + PKER_SDRYG( 32, 13) = 0.150080E+01 + PKER_SDRYG( 32, 14) = 0.140855E+01 + PKER_SDRYG( 32, 15) = 0.132192E+01 + PKER_SDRYG( 32, 16) = 0.124058E+01 + PKER_SDRYG( 32, 17) = 0.116421E+01 + PKER_SDRYG( 32, 18) = 0.109249E+01 + PKER_SDRYG( 32, 19) = 0.102514E+01 + PKER_SDRYG( 32, 20) = 0.961907E+00 + PKER_SDRYG( 32, 21) = 0.902526E+00 + PKER_SDRYG( 32, 22) = 0.846765E+00 + PKER_SDRYG( 32, 23) = 0.794404E+00 + PKER_SDRYG( 32, 24) = 0.745233E+00 + PKER_SDRYG( 32, 25) = 0.699057E+00 + PKER_SDRYG( 32, 26) = 0.655693E+00 + PKER_SDRYG( 32, 27) = 0.614968E+00 + PKER_SDRYG( 32, 28) = 0.576720E+00 + PKER_SDRYG( 32, 29) = 0.540795E+00 + PKER_SDRYG( 32, 30) = 0.507051E+00 + PKER_SDRYG( 32, 31) = 0.475350E+00 + PKER_SDRYG( 32, 32) = 0.445567E+00 + PKER_SDRYG( 32, 33) = 0.417580E+00 + PKER_SDRYG( 32, 34) = 0.391276E+00 + PKER_SDRYG( 32, 35) = 0.366546E+00 + PKER_SDRYG( 32, 36) = 0.343288E+00 + PKER_SDRYG( 32, 37) = 0.321405E+00 + PKER_SDRYG( 32, 38) = 0.300804E+00 + PKER_SDRYG( 32, 39) = 0.281394E+00 + PKER_SDRYG( 32, 40) = 0.263091E+00 + PKER_SDRYG( 32, 41) = 0.245809E+00 + PKER_SDRYG( 32, 42) = 0.229469E+00 + PKER_SDRYG( 32, 43) = 0.213990E+00 + PKER_SDRYG( 32, 44) = 0.199297E+00 + PKER_SDRYG( 32, 45) = 0.185318E+00 + PKER_SDRYG( 32, 46) = 0.171989E+00 + PKER_SDRYG( 32, 47) = 0.159255E+00 + PKER_SDRYG( 32, 48) = 0.147081E+00 + PKER_SDRYG( 32, 49) = 0.135452E+00 + PKER_SDRYG( 32, 50) = 0.124376E+00 + PKER_SDRYG( 32, 51) = 0.113884E+00 + PKER_SDRYG( 32, 52) = 0.104021E+00 + PKER_SDRYG( 32, 53) = 0.948256E-01 + PKER_SDRYG( 32, 54) = 0.863244E-01 + PKER_SDRYG( 32, 55) = 0.785179E-01 + PKER_SDRYG( 32, 56) = 0.713821E-01 + PKER_SDRYG( 32, 57) = 0.648731E-01 + PKER_SDRYG( 32, 58) = 0.589359E-01 + PKER_SDRYG( 32, 59) = 0.535119E-01 + PKER_SDRYG( 32, 60) = 0.485445E-01 + PKER_SDRYG( 32, 61) = 0.439825E-01 + PKER_SDRYG( 32, 62) = 0.397817E-01 + PKER_SDRYG( 32, 63) = 0.359045E-01 + PKER_SDRYG( 32, 64) = 0.323209E-01 + PKER_SDRYG( 32, 65) = 0.290070E-01 + PKER_SDRYG( 32, 66) = 0.259441E-01 + PKER_SDRYG( 32, 67) = 0.231196E-01 + PKER_SDRYG( 32, 68) = 0.205267E-01 + PKER_SDRYG( 32, 69) = 0.181592E-01 + PKER_SDRYG( 32, 70) = 0.160162E-01 + PKER_SDRYG( 32, 71) = 0.141022E-01 + PKER_SDRYG( 32, 72) = 0.124158E-01 + PKER_SDRYG( 32, 73) = 0.109584E-01 + PKER_SDRYG( 32, 74) = 0.973316E-02 + PKER_SDRYG( 32, 75) = 0.873966E-02 + PKER_SDRYG( 32, 76) = 0.796029E-02 + PKER_SDRYG( 32, 77) = 0.738911E-02 + PKER_SDRYG( 32, 78) = 0.702077E-02 + PKER_SDRYG( 32, 79) = 0.682454E-02 + PKER_SDRYG( 32, 80) = 0.678880E-02 + PKER_SDRYG( 33, 1) = 0.320876E+01 + PKER_SDRYG( 33, 2) = 0.301240E+01 + PKER_SDRYG( 33, 3) = 0.282802E+01 + PKER_SDRYG( 33, 4) = 0.265489E+01 + PKER_SDRYG( 33, 5) = 0.249232E+01 + PKER_SDRYG( 33, 6) = 0.233967E+01 + PKER_SDRYG( 33, 7) = 0.219633E+01 + PKER_SDRYG( 33, 8) = 0.206174E+01 + PKER_SDRYG( 33, 9) = 0.193536E+01 + PKER_SDRYG( 33, 10) = 0.181670E+01 + PKER_SDRYG( 33, 11) = 0.170527E+01 + PKER_SDRYG( 33, 12) = 0.160064E+01 + PKER_SDRYG( 33, 13) = 0.150240E+01 + PKER_SDRYG( 33, 14) = 0.141015E+01 + PKER_SDRYG( 33, 15) = 0.132352E+01 + PKER_SDRYG( 33, 16) = 0.124219E+01 + PKER_SDRYG( 33, 17) = 0.116581E+01 + PKER_SDRYG( 33, 18) = 0.109409E+01 + PKER_SDRYG( 33, 19) = 0.102675E+01 + PKER_SDRYG( 33, 20) = 0.963516E+00 + PKER_SDRYG( 33, 21) = 0.904137E+00 + PKER_SDRYG( 33, 22) = 0.848379E+00 + PKER_SDRYG( 33, 23) = 0.796021E+00 + PKER_SDRYG( 33, 24) = 0.746854E+00 + PKER_SDRYG( 33, 25) = 0.700684E+00 + PKER_SDRYG( 33, 26) = 0.657326E+00 + PKER_SDRYG( 33, 27) = 0.616608E+00 + PKER_SDRYG( 33, 28) = 0.578369E+00 + PKER_SDRYG( 33, 29) = 0.542455E+00 + PKER_SDRYG( 33, 30) = 0.508723E+00 + PKER_SDRYG( 33, 31) = 0.477038E+00 + PKER_SDRYG( 33, 32) = 0.447273E+00 + PKER_SDRYG( 33, 33) = 0.419308E+00 + PKER_SDRYG( 33, 34) = 0.393031E+00 + PKER_SDRYG( 33, 35) = 0.368334E+00 + PKER_SDRYG( 33, 36) = 0.345115E+00 + PKER_SDRYG( 33, 37) = 0.323280E+00 + PKER_SDRYG( 33, 38) = 0.302737E+00 + PKER_SDRYG( 33, 39) = 0.283398E+00 + PKER_SDRYG( 33, 40) = 0.265179E+00 + PKER_SDRYG( 33, 41) = 0.248001E+00 + PKER_SDRYG( 33, 42) = 0.231784E+00 + PKER_SDRYG( 33, 43) = 0.216454E+00 + PKER_SDRYG( 33, 44) = 0.201936E+00 + PKER_SDRYG( 33, 45) = 0.188160E+00 + PKER_SDRYG( 33, 46) = 0.175059E+00 + PKER_SDRYG( 33, 47) = 0.162573E+00 + PKER_SDRYG( 33, 48) = 0.150653E+00 + PKER_SDRYG( 33, 49) = 0.139264E+00 + PKER_SDRYG( 33, 50) = 0.128391E+00 + PKER_SDRYG( 33, 51) = 0.118043E+00 + PKER_SDRYG( 33, 52) = 0.108246E+00 + PKER_SDRYG( 33, 53) = 0.990391E-01 + PKER_SDRYG( 33, 54) = 0.904578E-01 + PKER_SDRYG( 33, 55) = 0.825243E-01 + PKER_SDRYG( 33, 56) = 0.752379E-01 + PKER_SDRYG( 33, 57) = 0.685753E-01 + PKER_SDRYG( 33, 58) = 0.624955E-01 + PKER_SDRYG( 33, 59) = 0.569470E-01 + PKER_SDRYG( 33, 60) = 0.518753E-01 + PKER_SDRYG( 33, 61) = 0.472275E-01 + PKER_SDRYG( 33, 62) = 0.429558E-01 + PKER_SDRYG( 33, 63) = 0.390186E-01 + PKER_SDRYG( 33, 64) = 0.353804E-01 + PKER_SDRYG( 33, 65) = 0.320117E-01 + PKER_SDRYG( 33, 66) = 0.288882E-01 + PKER_SDRYG( 33, 67) = 0.259908E-01 + PKER_SDRYG( 33, 68) = 0.233051E-01 + PKER_SDRYG( 33, 69) = 0.208197E-01 + PKER_SDRYG( 33, 70) = 0.185279E-01 + PKER_SDRYG( 33, 71) = 0.164268E-01 + PKER_SDRYG( 33, 72) = 0.145150E-01 + PKER_SDRYG( 33, 73) = 0.127936E-01 + PKER_SDRYG( 33, 74) = 0.112662E-01 + PKER_SDRYG( 33, 75) = 0.993136E-02 + PKER_SDRYG( 33, 76) = 0.879659E-02 + PKER_SDRYG( 33, 77) = 0.785167E-02 + PKER_SDRYG( 33, 78) = 0.709416E-02 + PKER_SDRYG( 33, 79) = 0.653114E-02 + PKER_SDRYG( 33, 80) = 0.613422E-02 + PKER_SDRYG( 34, 1) = 0.321013E+01 + PKER_SDRYG( 34, 2) = 0.301377E+01 + PKER_SDRYG( 34, 3) = 0.282938E+01 + PKER_SDRYG( 34, 4) = 0.265625E+01 + PKER_SDRYG( 34, 5) = 0.249368E+01 + PKER_SDRYG( 34, 6) = 0.234103E+01 + PKER_SDRYG( 34, 7) = 0.219770E+01 + PKER_SDRYG( 34, 8) = 0.206311E+01 + PKER_SDRYG( 34, 9) = 0.193673E+01 + PKER_SDRYG( 34, 10) = 0.181807E+01 + PKER_SDRYG( 34, 11) = 0.170664E+01 + PKER_SDRYG( 34, 12) = 0.160201E+01 + PKER_SDRYG( 34, 13) = 0.150377E+01 + PKER_SDRYG( 34, 14) = 0.141152E+01 + PKER_SDRYG( 34, 15) = 0.132489E+01 + PKER_SDRYG( 34, 16) = 0.124356E+01 + PKER_SDRYG( 34, 17) = 0.116718E+01 + PKER_SDRYG( 34, 18) = 0.109547E+01 + PKER_SDRYG( 34, 19) = 0.102812E+01 + PKER_SDRYG( 34, 20) = 0.964891E+00 + PKER_SDRYG( 34, 21) = 0.905514E+00 + PKER_SDRYG( 34, 22) = 0.849759E+00 + PKER_SDRYG( 34, 23) = 0.797403E+00 + PKER_SDRYG( 34, 24) = 0.748240E+00 + PKER_SDRYG( 34, 25) = 0.702073E+00 + PKER_SDRYG( 34, 26) = 0.658720E+00 + PKER_SDRYG( 34, 27) = 0.618008E+00 + PKER_SDRYG( 34, 28) = 0.579775E+00 + PKER_SDRYG( 34, 29) = 0.543869E+00 + PKER_SDRYG( 34, 30) = 0.510147E+00 + PKER_SDRYG( 34, 31) = 0.478474E+00 + PKER_SDRYG( 34, 32) = 0.448723E+00 + PKER_SDRYG( 34, 33) = 0.420775E+00 + PKER_SDRYG( 34, 34) = 0.394518E+00 + PKER_SDRYG( 34, 35) = 0.369845E+00 + PKER_SDRYG( 34, 36) = 0.346657E+00 + PKER_SDRYG( 34, 37) = 0.324858E+00 + PKER_SDRYG( 34, 38) = 0.304358E+00 + PKER_SDRYG( 34, 39) = 0.285071E+00 + PKER_SDRYG( 34, 40) = 0.266917E+00 + PKER_SDRYG( 34, 41) = 0.249816E+00 + PKER_SDRYG( 34, 42) = 0.233693E+00 + PKER_SDRYG( 34, 43) = 0.218475E+00 + PKER_SDRYG( 34, 44) = 0.204091E+00 + PKER_SDRYG( 34, 45) = 0.190473E+00 + PKER_SDRYG( 34, 46) = 0.177555E+00 + PKER_SDRYG( 34, 47) = 0.165275E+00 + PKER_SDRYG( 34, 48) = 0.153578E+00 + PKER_SDRYG( 34, 49) = 0.142416E+00 + PKER_SDRYG( 34, 50) = 0.131757E+00 + PKER_SDRYG( 34, 51) = 0.121589E+00 + PKER_SDRYG( 34, 52) = 0.111916E+00 + PKER_SDRYG( 34, 53) = 0.102764E+00 + PKER_SDRYG( 34, 54) = 0.941652E-01 + PKER_SDRYG( 34, 55) = 0.861526E-01 + PKER_SDRYG( 34, 56) = 0.787448E-01 + PKER_SDRYG( 34, 57) = 0.719403E-01 + PKER_SDRYG( 34, 58) = 0.657167E-01 + PKER_SDRYG( 34, 59) = 0.600352E-01 + PKER_SDRYG( 34, 60) = 0.548480E-01 + PKER_SDRYG( 34, 61) = 0.501041E-01 + PKER_SDRYG( 34, 62) = 0.457547E-01 + PKER_SDRYG( 34, 63) = 0.417550E-01 + PKER_SDRYG( 34, 64) = 0.380663E-01 + PKER_SDRYG( 34, 65) = 0.346552E-01 + PKER_SDRYG( 34, 66) = 0.314935E-01 + PKER_SDRYG( 34, 67) = 0.285580E-01 + PKER_SDRYG( 34, 68) = 0.258292E-01 + PKER_SDRYG( 34, 69) = 0.232916E-01 + PKER_SDRYG( 34, 70) = 0.209331E-01 + PKER_SDRYG( 34, 71) = 0.187445E-01 + PKER_SDRYG( 34, 72) = 0.167197E-01 + PKER_SDRYG( 34, 73) = 0.148560E-01 + PKER_SDRYG( 34, 74) = 0.131512E-01 + PKER_SDRYG( 34, 75) = 0.116067E-01 + PKER_SDRYG( 34, 76) = 0.102254E-01 + PKER_SDRYG( 34, 77) = 0.900807E-02 + PKER_SDRYG( 34, 78) = 0.795670E-02 + PKER_SDRYG( 34, 79) = 0.707317E-02 + PKER_SDRYG( 34, 80) = 0.635774E-02 + PKER_SDRYG( 35, 1) = 0.321130E+01 + PKER_SDRYG( 35, 2) = 0.301493E+01 + PKER_SDRYG( 35, 3) = 0.283055E+01 + PKER_SDRYG( 35, 4) = 0.265742E+01 + PKER_SDRYG( 35, 5) = 0.249485E+01 + PKER_SDRYG( 35, 6) = 0.234220E+01 + PKER_SDRYG( 35, 7) = 0.219887E+01 + PKER_SDRYG( 35, 8) = 0.206428E+01 + PKER_SDRYG( 35, 9) = 0.193790E+01 + PKER_SDRYG( 35, 10) = 0.181923E+01 + PKER_SDRYG( 35, 11) = 0.170781E+01 + PKER_SDRYG( 35, 12) = 0.160318E+01 + PKER_SDRYG( 35, 13) = 0.150494E+01 + PKER_SDRYG( 35, 14) = 0.141269E+01 + PKER_SDRYG( 35, 15) = 0.132607E+01 + PKER_SDRYG( 35, 16) = 0.124473E+01 + PKER_SDRYG( 35, 17) = 0.116835E+01 + PKER_SDRYG( 35, 18) = 0.109664E+01 + PKER_SDRYG( 35, 19) = 0.102930E+01 + PKER_SDRYG( 35, 20) = 0.966067E+00 + PKER_SDRYG( 35, 21) = 0.906692E+00 + PKER_SDRYG( 35, 22) = 0.850938E+00 + PKER_SDRYG( 35, 23) = 0.798585E+00 + PKER_SDRYG( 35, 24) = 0.749424E+00 + PKER_SDRYG( 35, 25) = 0.703260E+00 + PKER_SDRYG( 35, 26) = 0.659911E+00 + PKER_SDRYG( 35, 27) = 0.619203E+00 + PKER_SDRYG( 35, 28) = 0.580975E+00 + PKER_SDRYG( 35, 29) = 0.545076E+00 + PKER_SDRYG( 35, 30) = 0.511361E+00 + PKER_SDRYG( 35, 31) = 0.479697E+00 + PKER_SDRYG( 35, 32) = 0.449956E+00 + PKER_SDRYG( 35, 33) = 0.422022E+00 + PKER_SDRYG( 35, 34) = 0.395780E+00 + PKER_SDRYG( 35, 35) = 0.371126E+00 + PKER_SDRYG( 35, 36) = 0.347960E+00 + PKER_SDRYG( 35, 37) = 0.326188E+00 + PKER_SDRYG( 35, 38) = 0.305721E+00 + PKER_SDRYG( 35, 39) = 0.286474E+00 + PKER_SDRYG( 35, 40) = 0.268367E+00 + PKER_SDRYG( 35, 41) = 0.251325E+00 + PKER_SDRYG( 35, 42) = 0.235272E+00 + PKER_SDRYG( 35, 43) = 0.220139E+00 + PKER_SDRYG( 35, 44) = 0.205857E+00 + PKER_SDRYG( 35, 45) = 0.192361E+00 + PKER_SDRYG( 35, 46) = 0.179586E+00 + PKER_SDRYG( 35, 47) = 0.167472E+00 + PKER_SDRYG( 35, 48) = 0.155960E+00 + PKER_SDRYG( 35, 49) = 0.144998E+00 + PKER_SDRYG( 35, 50) = 0.134544E+00 + PKER_SDRYG( 35, 51) = 0.124567E+00 + PKER_SDRYG( 35, 52) = 0.115053E+00 + PKER_SDRYG( 35, 53) = 0.106009E+00 + PKER_SDRYG( 35, 54) = 0.974547E-01 + PKER_SDRYG( 35, 55) = 0.894206E-01 + PKER_SDRYG( 35, 56) = 0.819354E-01 + PKER_SDRYG( 35, 57) = 0.750153E-01 + PKER_SDRYG( 35, 58) = 0.686578E-01 + PKER_SDRYG( 35, 59) = 0.628415E-01 + PKER_SDRYG( 35, 60) = 0.575301E-01 + PKER_SDRYG( 35, 61) = 0.526787E-01 + PKER_SDRYG( 35, 62) = 0.482402E-01 + PKER_SDRYG( 35, 63) = 0.441689E-01 + PKER_SDRYG( 35, 64) = 0.404234E-01 + PKER_SDRYG( 35, 65) = 0.369676E-01 + PKER_SDRYG( 35, 66) = 0.337703E-01 + PKER_SDRYG( 35, 67) = 0.308051E-01 + PKER_SDRYG( 35, 68) = 0.280497E-01 + PKER_SDRYG( 35, 69) = 0.254855E-01 + PKER_SDRYG( 35, 70) = 0.230970E-01 + PKER_SDRYG( 35, 71) = 0.208713E-01 + PKER_SDRYG( 35, 72) = 0.187982E-01 + PKER_SDRYG( 35, 73) = 0.168703E-01 + PKER_SDRYG( 35, 74) = 0.150815E-01 + PKER_SDRYG( 35, 75) = 0.134288E-01 + PKER_SDRYG( 35, 76) = 0.119116E-01 + PKER_SDRYG( 35, 77) = 0.105294E-01 + PKER_SDRYG( 35, 78) = 0.928417E-02 + PKER_SDRYG( 35, 79) = 0.817987E-02 + PKER_SDRYG( 35, 80) = 0.721421E-02 + PKER_SDRYG( 36, 1) = 0.321230E+01 + PKER_SDRYG( 36, 2) = 0.301593E+01 + PKER_SDRYG( 36, 3) = 0.283155E+01 + PKER_SDRYG( 36, 4) = 0.265842E+01 + PKER_SDRYG( 36, 5) = 0.249585E+01 + PKER_SDRYG( 36, 6) = 0.234320E+01 + PKER_SDRYG( 36, 7) = 0.219987E+01 + PKER_SDRYG( 36, 8) = 0.206528E+01 + PKER_SDRYG( 36, 9) = 0.193890E+01 + PKER_SDRYG( 36, 10) = 0.182024E+01 + PKER_SDRYG( 36, 11) = 0.170881E+01 + PKER_SDRYG( 36, 12) = 0.160418E+01 + PKER_SDRYG( 36, 13) = 0.150594E+01 + PKER_SDRYG( 36, 14) = 0.141369E+01 + PKER_SDRYG( 36, 15) = 0.132707E+01 + PKER_SDRYG( 36, 16) = 0.124573E+01 + PKER_SDRYG( 36, 17) = 0.116936E+01 + PKER_SDRYG( 36, 18) = 0.109764E+01 + PKER_SDRYG( 36, 19) = 0.103030E+01 + PKER_SDRYG( 36, 20) = 0.967073E+00 + PKER_SDRYG( 36, 21) = 0.907699E+00 + PKER_SDRYG( 36, 22) = 0.851947E+00 + PKER_SDRYG( 36, 23) = 0.799595E+00 + PKER_SDRYG( 36, 24) = 0.750436E+00 + PKER_SDRYG( 36, 25) = 0.704275E+00 + PKER_SDRYG( 36, 26) = 0.660928E+00 + PKER_SDRYG( 36, 27) = 0.620224E+00 + PKER_SDRYG( 36, 28) = 0.582000E+00 + PKER_SDRYG( 36, 29) = 0.546105E+00 + PKER_SDRYG( 36, 30) = 0.512396E+00 + PKER_SDRYG( 36, 31) = 0.480738E+00 + PKER_SDRYG( 36, 32) = 0.451006E+00 + PKER_SDRYG( 36, 33) = 0.423081E+00 + PKER_SDRYG( 36, 34) = 0.396851E+00 + PKER_SDRYG( 36, 35) = 0.372212E+00 + PKER_SDRYG( 36, 36) = 0.349063E+00 + PKER_SDRYG( 36, 37) = 0.327311E+00 + PKER_SDRYG( 36, 38) = 0.306869E+00 + PKER_SDRYG( 36, 39) = 0.287653E+00 + PKER_SDRYG( 36, 40) = 0.269582E+00 + PKER_SDRYG( 36, 41) = 0.252583E+00 + PKER_SDRYG( 36, 42) = 0.236584E+00 + PKER_SDRYG( 36, 43) = 0.221515E+00 + PKER_SDRYG( 36, 44) = 0.207311E+00 + PKER_SDRYG( 36, 45) = 0.193907E+00 + PKER_SDRYG( 36, 46) = 0.181243E+00 + PKER_SDRYG( 36, 47) = 0.169258E+00 + PKER_SDRYG( 36, 48) = 0.157896E+00 + PKER_SDRYG( 36, 49) = 0.147102E+00 + PKER_SDRYG( 36, 50) = 0.136828E+00 + PKER_SDRYG( 36, 51) = 0.127035E+00 + PKER_SDRYG( 36, 52) = 0.117693E+00 + PKER_SDRYG( 36, 53) = 0.108790E+00 + PKER_SDRYG( 36, 54) = 0.100330E+00 + PKER_SDRYG( 36, 55) = 0.923315E-01 + PKER_SDRYG( 36, 56) = 0.848218E-01 + PKER_SDRYG( 36, 57) = 0.778261E-01 + PKER_SDRYG( 36, 58) = 0.713586E-01 + PKER_SDRYG( 36, 59) = 0.654162E-01 + PKER_SDRYG( 36, 60) = 0.599783E-01 + PKER_SDRYG( 36, 61) = 0.550109E-01 + PKER_SDRYG( 36, 62) = 0.504721E-01 + PKER_SDRYG( 36, 63) = 0.463179E-01 + PKER_SDRYG( 36, 64) = 0.425060E-01 + PKER_SDRYG( 36, 65) = 0.389979E-01 + PKER_SDRYG( 36, 66) = 0.357599E-01 + PKER_SDRYG( 36, 67) = 0.327630E-01 + PKER_SDRYG( 36, 68) = 0.299825E-01 + PKER_SDRYG( 36, 69) = 0.273977E-01 + PKER_SDRYG( 36, 70) = 0.249908E-01 + PKER_SDRYG( 36, 71) = 0.227467E-01 + PKER_SDRYG( 36, 72) = 0.206528E-01 + PKER_SDRYG( 36, 73) = 0.186985E-01 + PKER_SDRYG( 36, 74) = 0.168752E-01 + PKER_SDRYG( 36, 75) = 0.151760E-01 + PKER_SDRYG( 36, 76) = 0.135960E-01 + PKER_SDRYG( 36, 77) = 0.121320E-01 + PKER_SDRYG( 36, 78) = 0.107828E-01 + PKER_SDRYG( 36, 79) = 0.954776E-02 + PKER_SDRYG( 36, 80) = 0.842894E-02 + PKER_SDRYG( 37, 1) = 0.321315E+01 + PKER_SDRYG( 37, 2) = 0.301679E+01 + PKER_SDRYG( 37, 3) = 0.283241E+01 + PKER_SDRYG( 37, 4) = 0.265928E+01 + PKER_SDRYG( 37, 5) = 0.249671E+01 + PKER_SDRYG( 37, 6) = 0.234406E+01 + PKER_SDRYG( 37, 7) = 0.220072E+01 + PKER_SDRYG( 37, 8) = 0.206614E+01 + PKER_SDRYG( 37, 9) = 0.193976E+01 + PKER_SDRYG( 37, 10) = 0.182109E+01 + PKER_SDRYG( 37, 11) = 0.170967E+01 + PKER_SDRYG( 37, 12) = 0.160504E+01 + PKER_SDRYG( 37, 13) = 0.150680E+01 + PKER_SDRYG( 37, 14) = 0.141455E+01 + PKER_SDRYG( 37, 15) = 0.132793E+01 + PKER_SDRYG( 37, 16) = 0.124659E+01 + PKER_SDRYG( 37, 17) = 0.117022E+01 + PKER_SDRYG( 37, 18) = 0.109850E+01 + PKER_SDRYG( 37, 19) = 0.103116E+01 + PKER_SDRYG( 37, 20) = 0.967933E+00 + PKER_SDRYG( 37, 21) = 0.908560E+00 + PKER_SDRYG( 37, 22) = 0.852809E+00 + PKER_SDRYG( 37, 23) = 0.800458E+00 + PKER_SDRYG( 37, 24) = 0.751301E+00 + PKER_SDRYG( 37, 25) = 0.705142E+00 + PKER_SDRYG( 37, 26) = 0.661797E+00 + PKER_SDRYG( 37, 27) = 0.621095E+00 + PKER_SDRYG( 37, 28) = 0.582874E+00 + PKER_SDRYG( 37, 29) = 0.546983E+00 + PKER_SDRYG( 37, 30) = 0.513278E+00 + PKER_SDRYG( 37, 31) = 0.481626E+00 + PKER_SDRYG( 37, 32) = 0.451901E+00 + PKER_SDRYG( 37, 33) = 0.423983E+00 + PKER_SDRYG( 37, 34) = 0.397762E+00 + PKER_SDRYG( 37, 35) = 0.373134E+00 + PKER_SDRYG( 37, 36) = 0.349998E+00 + PKER_SDRYG( 37, 37) = 0.328262E+00 + PKER_SDRYG( 37, 38) = 0.307839E+00 + PKER_SDRYG( 37, 39) = 0.288645E+00 + PKER_SDRYG( 37, 40) = 0.270603E+00 + PKER_SDRYG( 37, 41) = 0.253637E+00 + PKER_SDRYG( 37, 42) = 0.237677E+00 + PKER_SDRYG( 37, 43) = 0.222657E+00 + PKER_SDRYG( 37, 44) = 0.208511E+00 + PKER_SDRYG( 37, 45) = 0.195178E+00 + PKER_SDRYG( 37, 46) = 0.182599E+00 + PKER_SDRYG( 37, 47) = 0.170714E+00 + PKER_SDRYG( 37, 48) = 0.159470E+00 + PKER_SDRYG( 37, 49) = 0.148812E+00 + PKER_SDRYG( 37, 50) = 0.138690E+00 + PKER_SDRYG( 37, 51) = 0.129060E+00 + PKER_SDRYG( 37, 52) = 0.119883E+00 + PKER_SDRYG( 37, 53) = 0.111134E+00 + PKER_SDRYG( 37, 54) = 0.102800E+00 + PKER_SDRYG( 37, 55) = 0.948842E-01 + PKER_SDRYG( 37, 56) = 0.874029E-01 + PKER_SDRYG( 37, 57) = 0.803806E-01 + PKER_SDRYG( 37, 58) = 0.738398E-01 + PKER_SDRYG( 37, 59) = 0.677928E-01 + PKER_SDRYG( 37, 60) = 0.622361E-01 + PKER_SDRYG( 37, 61) = 0.571501E-01 + PKER_SDRYG( 37, 62) = 0.525027E-01 + PKER_SDRYG( 37, 63) = 0.482549E-01 + PKER_SDRYG( 37, 64) = 0.443658E-01 + PKER_SDRYG( 37, 65) = 0.407958E-01 + PKER_SDRYG( 37, 66) = 0.375092E-01 + PKER_SDRYG( 37, 67) = 0.344748E-01 + PKER_SDRYG( 37, 68) = 0.316655E-01 + PKER_SDRYG( 37, 69) = 0.290583E-01 + PKER_SDRYG( 37, 70) = 0.266339E-01 + PKER_SDRYG( 37, 71) = 0.243755E-01 + PKER_SDRYG( 37, 72) = 0.222689E-01 + PKER_SDRYG( 37, 73) = 0.203019E-01 + PKER_SDRYG( 37, 74) = 0.184641E-01 + PKER_SDRYG( 37, 75) = 0.167467E-01 + PKER_SDRYG( 37, 76) = 0.151420E-01 + PKER_SDRYG( 37, 77) = 0.136442E-01 + PKER_SDRYG( 37, 78) = 0.122492E-01 + PKER_SDRYG( 37, 79) = 0.109531E-01 + PKER_SDRYG( 37, 80) = 0.975456E-02 + PKER_SDRYG( 38, 1) = 0.321388E+01 + PKER_SDRYG( 38, 2) = 0.301752E+01 + PKER_SDRYG( 38, 3) = 0.283314E+01 + PKER_SDRYG( 38, 4) = 0.266001E+01 + PKER_SDRYG( 38, 5) = 0.249744E+01 + PKER_SDRYG( 38, 6) = 0.234479E+01 + PKER_SDRYG( 38, 7) = 0.220146E+01 + PKER_SDRYG( 38, 8) = 0.206687E+01 + PKER_SDRYG( 38, 9) = 0.194049E+01 + PKER_SDRYG( 38, 10) = 0.182182E+01 + PKER_SDRYG( 38, 11) = 0.171040E+01 + PKER_SDRYG( 38, 12) = 0.160577E+01 + PKER_SDRYG( 38, 13) = 0.150753E+01 + PKER_SDRYG( 38, 14) = 0.141528E+01 + PKER_SDRYG( 38, 15) = 0.132866E+01 + PKER_SDRYG( 38, 16) = 0.124732E+01 + PKER_SDRYG( 38, 17) = 0.117095E+01 + PKER_SDRYG( 38, 18) = 0.109924E+01 + PKER_SDRYG( 38, 19) = 0.103190E+01 + PKER_SDRYG( 38, 20) = 0.968669E+00 + PKER_SDRYG( 38, 21) = 0.909296E+00 + PKER_SDRYG( 38, 22) = 0.853546E+00 + PKER_SDRYG( 38, 23) = 0.801197E+00 + PKER_SDRYG( 38, 24) = 0.752040E+00 + PKER_SDRYG( 38, 25) = 0.705882E+00 + PKER_SDRYG( 38, 26) = 0.662539E+00 + PKER_SDRYG( 38, 27) = 0.621840E+00 + PKER_SDRYG( 38, 28) = 0.583621E+00 + PKER_SDRYG( 38, 29) = 0.547733E+00 + PKER_SDRYG( 38, 30) = 0.514032E+00 + PKER_SDRYG( 38, 31) = 0.482384E+00 + PKER_SDRYG( 38, 32) = 0.452663E+00 + PKER_SDRYG( 38, 33) = 0.424751E+00 + PKER_SDRYG( 38, 34) = 0.398537E+00 + PKER_SDRYG( 38, 35) = 0.373917E+00 + PKER_SDRYG( 38, 36) = 0.350791E+00 + PKER_SDRYG( 38, 37) = 0.329068E+00 + PKER_SDRYG( 38, 38) = 0.308659E+00 + PKER_SDRYG( 38, 39) = 0.289483E+00 + PKER_SDRYG( 38, 40) = 0.271461E+00 + PKER_SDRYG( 38, 41) = 0.254521E+00 + PKER_SDRYG( 38, 42) = 0.238592E+00 + PKER_SDRYG( 38, 43) = 0.223608E+00 + PKER_SDRYG( 38, 44) = 0.209507E+00 + PKER_SDRYG( 38, 45) = 0.196227E+00 + PKER_SDRYG( 38, 46) = 0.183712E+00 + PKER_SDRYG( 38, 47) = 0.171905E+00 + PKER_SDRYG( 38, 48) = 0.160752E+00 + PKER_SDRYG( 38, 49) = 0.150201E+00 + PKER_SDRYG( 38, 50) = 0.140203E+00 + PKER_SDRYG( 38, 51) = 0.130711E+00 + PKER_SDRYG( 38, 52) = 0.121682E+00 + PKER_SDRYG( 38, 53) = 0.113083E+00 + PKER_SDRYG( 38, 54) = 0.104887E+00 + PKER_SDRYG( 38, 55) = 0.970832E-01 + PKER_SDRYG( 38, 56) = 0.896740E-01 + PKER_SDRYG( 38, 57) = 0.826740E-01 + PKER_SDRYG( 38, 58) = 0.761051E-01 + PKER_SDRYG( 38, 59) = 0.699873E-01 + PKER_SDRYG( 38, 60) = 0.643313E-01 + PKER_SDRYG( 38, 61) = 0.591334E-01 + PKER_SDRYG( 38, 62) = 0.543747E-01 + PKER_SDRYG( 38, 63) = 0.500254E-01 + PKER_SDRYG( 38, 64) = 0.460488E-01 + PKER_SDRYG( 38, 65) = 0.424067E-01 + PKER_SDRYG( 38, 66) = 0.390625E-01 + PKER_SDRYG( 38, 67) = 0.359829E-01 + PKER_SDRYG( 38, 68) = 0.331387E-01 + PKER_SDRYG( 38, 69) = 0.305049E-01 + PKER_SDRYG( 38, 70) = 0.280601E-01 + PKER_SDRYG( 38, 71) = 0.257861E-01 + PKER_SDRYG( 38, 72) = 0.236673E-01 + PKER_SDRYG( 38, 73) = 0.216904E-01 + PKER_SDRYG( 38, 74) = 0.198439E-01 + PKER_SDRYG( 38, 75) = 0.181177E-01 + PKER_SDRYG( 38, 76) = 0.165031E-01 + PKER_SDRYG( 38, 77) = 0.149927E-01 + PKER_SDRYG( 38, 78) = 0.135800E-01 + PKER_SDRYG( 38, 79) = 0.122598E-01 + PKER_SDRYG( 38, 80) = 0.110278E-01 + PKER_SDRYG( 39, 1) = 0.321451E+01 + PKER_SDRYG( 39, 2) = 0.301815E+01 + PKER_SDRYG( 39, 3) = 0.283377E+01 + PKER_SDRYG( 39, 4) = 0.266063E+01 + PKER_SDRYG( 39, 5) = 0.249807E+01 + PKER_SDRYG( 39, 6) = 0.234542E+01 + PKER_SDRYG( 39, 7) = 0.220208E+01 + PKER_SDRYG( 39, 8) = 0.206749E+01 + PKER_SDRYG( 39, 9) = 0.194112E+01 + PKER_SDRYG( 39, 10) = 0.182245E+01 + PKER_SDRYG( 39, 11) = 0.171103E+01 + PKER_SDRYG( 39, 12) = 0.160640E+01 + PKER_SDRYG( 39, 13) = 0.150816E+01 + PKER_SDRYG( 39, 14) = 0.141591E+01 + PKER_SDRYG( 39, 15) = 0.132929E+01 + PKER_SDRYG( 39, 16) = 0.124795E+01 + PKER_SDRYG( 39, 17) = 0.117158E+01 + PKER_SDRYG( 39, 18) = 0.109987E+01 + PKER_SDRYG( 39, 19) = 0.103253E+01 + PKER_SDRYG( 39, 20) = 0.969298E+00 + PKER_SDRYG( 39, 21) = 0.909926E+00 + PKER_SDRYG( 39, 22) = 0.854176E+00 + PKER_SDRYG( 39, 23) = 0.801828E+00 + PKER_SDRYG( 39, 24) = 0.752672E+00 + PKER_SDRYG( 39, 25) = 0.706516E+00 + PKER_SDRYG( 39, 26) = 0.663174E+00 + PKER_SDRYG( 39, 27) = 0.622476E+00 + PKER_SDRYG( 39, 28) = 0.584259E+00 + PKER_SDRYG( 39, 29) = 0.548373E+00 + PKER_SDRYG( 39, 30) = 0.514674E+00 + PKER_SDRYG( 39, 31) = 0.483030E+00 + PKER_SDRYG( 39, 32) = 0.453313E+00 + PKER_SDRYG( 39, 33) = 0.425406E+00 + PKER_SDRYG( 39, 34) = 0.399197E+00 + PKER_SDRYG( 39, 35) = 0.374583E+00 + PKER_SDRYG( 39, 36) = 0.351465E+00 + PKER_SDRYG( 39, 37) = 0.329751E+00 + PKER_SDRYG( 39, 38) = 0.309353E+00 + PKER_SDRYG( 39, 39) = 0.290190E+00 + PKER_SDRYG( 39, 40) = 0.272185E+00 + PKER_SDRYG( 39, 41) = 0.255264E+00 + PKER_SDRYG( 39, 42) = 0.239358E+00 + PKER_SDRYG( 39, 43) = 0.224402E+00 + PKER_SDRYG( 39, 44) = 0.210335E+00 + PKER_SDRYG( 39, 45) = 0.197096E+00 + PKER_SDRYG( 39, 46) = 0.184630E+00 + PKER_SDRYG( 39, 47) = 0.172881E+00 + PKER_SDRYG( 39, 48) = 0.161799E+00 + PKER_SDRYG( 39, 49) = 0.151332E+00 + PKER_SDRYG( 39, 50) = 0.141432E+00 + PKER_SDRYG( 39, 51) = 0.132052E+00 + PKER_SDRYG( 39, 52) = 0.123149E+00 + PKER_SDRYG( 39, 53) = 0.114684E+00 + PKER_SDRYG( 39, 54) = 0.106623E+00 + PKER_SDRYG( 39, 55) = 0.989442E-01 + PKER_SDRYG( 39, 56) = 0.916356E-01 + PKER_SDRYG( 39, 57) = 0.846988E-01 + PKER_SDRYG( 39, 58) = 0.781472E-01 + PKER_SDRYG( 39, 59) = 0.720003E-01 + PKER_SDRYG( 39, 60) = 0.662762E-01 + PKER_SDRYG( 39, 61) = 0.609842E-01 + PKER_SDRYG( 39, 62) = 0.561201E-01 + PKER_SDRYG( 39, 63) = 0.516663E-01 + PKER_SDRYG( 39, 64) = 0.475946E-01 + PKER_SDRYG( 39, 65) = 0.438709E-01 + PKER_SDRYG( 39, 66) = 0.404594E-01 + PKER_SDRYG( 39, 67) = 0.373260E-01 + PKER_SDRYG( 39, 68) = 0.344398E-01 + PKER_SDRYG( 39, 69) = 0.317735E-01 + PKER_SDRYG( 39, 70) = 0.293039E-01 + PKER_SDRYG( 39, 71) = 0.270111E-01 + PKER_SDRYG( 39, 72) = 0.248780E-01 + PKER_SDRYG( 39, 73) = 0.228902E-01 + PKER_SDRYG( 39, 74) = 0.210352E-01 + PKER_SDRYG( 39, 75) = 0.193021E-01 + PKER_SDRYG( 39, 76) = 0.176816E-01 + PKER_SDRYG( 39, 77) = 0.161652E-01 + PKER_SDRYG( 39, 78) = 0.147457E-01 + PKER_SDRYG( 39, 79) = 0.134166E-01 + PKER_SDRYG( 39, 80) = 0.121725E-01 + PKER_SDRYG( 40, 1) = 0.321505E+01 + PKER_SDRYG( 40, 2) = 0.301868E+01 + PKER_SDRYG( 40, 3) = 0.283430E+01 + PKER_SDRYG( 40, 4) = 0.266117E+01 + PKER_SDRYG( 40, 5) = 0.249860E+01 + PKER_SDRYG( 40, 6) = 0.234595E+01 + PKER_SDRYG( 40, 7) = 0.220262E+01 + PKER_SDRYG( 40, 8) = 0.206803E+01 + PKER_SDRYG( 40, 9) = 0.194165E+01 + PKER_SDRYG( 40, 10) = 0.182299E+01 + PKER_SDRYG( 40, 11) = 0.171156E+01 + PKER_SDRYG( 40, 12) = 0.160694E+01 + PKER_SDRYG( 40, 13) = 0.150869E+01 + PKER_SDRYG( 40, 14) = 0.141644E+01 + PKER_SDRYG( 40, 15) = 0.132982E+01 + PKER_SDRYG( 40, 16) = 0.124849E+01 + PKER_SDRYG( 40, 17) = 0.117212E+01 + PKER_SDRYG( 40, 18) = 0.110040E+01 + PKER_SDRYG( 40, 19) = 0.103307E+01 + PKER_SDRYG( 40, 20) = 0.969836E+00 + PKER_SDRYG( 40, 21) = 0.910465E+00 + PKER_SDRYG( 40, 22) = 0.854716E+00 + PKER_SDRYG( 40, 23) = 0.802368E+00 + PKER_SDRYG( 40, 24) = 0.753213E+00 + PKER_SDRYG( 40, 25) = 0.707057E+00 + PKER_SDRYG( 40, 26) = 0.663716E+00 + PKER_SDRYG( 40, 27) = 0.623019E+00 + PKER_SDRYG( 40, 28) = 0.584804E+00 + PKER_SDRYG( 40, 29) = 0.548920E+00 + PKER_SDRYG( 40, 30) = 0.515223E+00 + PKER_SDRYG( 40, 31) = 0.483581E+00 + PKER_SDRYG( 40, 32) = 0.453867E+00 + PKER_SDRYG( 40, 33) = 0.425963E+00 + PKER_SDRYG( 40, 34) = 0.399759E+00 + PKER_SDRYG( 40, 35) = 0.375150E+00 + PKER_SDRYG( 40, 36) = 0.352038E+00 + PKER_SDRYG( 40, 37) = 0.330331E+00 + PKER_SDRYG( 40, 38) = 0.309942E+00 + PKER_SDRYG( 40, 39) = 0.290789E+00 + PKER_SDRYG( 40, 40) = 0.272796E+00 + PKER_SDRYG( 40, 41) = 0.255890E+00 + PKER_SDRYG( 40, 42) = 0.240002E+00 + PKER_SDRYG( 40, 43) = 0.225068E+00 + PKER_SDRYG( 40, 44) = 0.211026E+00 + PKER_SDRYG( 40, 45) = 0.197818E+00 + PKER_SDRYG( 40, 46) = 0.185389E+00 + PKER_SDRYG( 40, 47) = 0.173686E+00 + PKER_SDRYG( 40, 48) = 0.162657E+00 + PKER_SDRYG( 40, 49) = 0.152255E+00 + PKER_SDRYG( 40, 50) = 0.142431E+00 + PKER_SDRYG( 40, 51) = 0.133141E+00 + PKER_SDRYG( 40, 52) = 0.124340E+00 + PKER_SDRYG( 40, 53) = 0.115989E+00 + PKER_SDRYG( 40, 54) = 0.108051E+00 + PKER_SDRYG( 40, 55) = 0.100495E+00 + PKER_SDRYG( 40, 56) = 0.932989E-01 + PKER_SDRYG( 40, 57) = 0.864523E-01 + PKER_SDRYG( 40, 58) = 0.799563E-01 + PKER_SDRYG( 40, 59) = 0.738226E-01 + PKER_SDRYG( 40, 60) = 0.680689E-01 + PKER_SDRYG( 40, 61) = 0.627114E-01 + PKER_SDRYG( 40, 62) = 0.577583E-01 + PKER_SDRYG( 40, 63) = 0.532053E-01 + PKER_SDRYG( 40, 64) = 0.490356E-01 + PKER_SDRYG( 40, 65) = 0.452228E-01 + PKER_SDRYG( 40, 66) = 0.417349E-01 + PKER_SDRYG( 40, 67) = 0.385386E-01 + PKER_SDRYG( 40, 68) = 0.356022E-01 + PKER_SDRYG( 40, 69) = 0.328967E-01 + PKER_SDRYG( 40, 70) = 0.303969E-01 + PKER_SDRYG( 40, 71) = 0.280809E-01 + PKER_SDRYG( 40, 72) = 0.259303E-01 + PKER_SDRYG( 40, 73) = 0.239293E-01 + PKER_SDRYG( 40, 74) = 0.220643E-01 + PKER_SDRYG( 40, 75) = 0.203236E-01 + PKER_SDRYG( 40, 76) = 0.186972E-01 + PKER_SDRYG( 40, 77) = 0.171761E-01 + PKER_SDRYG( 40, 78) = 0.157525E-01 + PKER_SDRYG( 40, 79) = 0.144193E-01 + PKER_SDRYG( 40, 80) = 0.131706E-01 +END IF +! +END SUBROUTINE READ_XKER_SDRYG diff --git a/src/mesonh/micro/read_xker_sweth.f90 b/src/mesonh/micro/read_xker_sweth.f90 new file mode 100644 index 000000000..52d9df6a7 --- /dev/null +++ b/src/mesonh/micro/read_xker_sweth.f90 @@ -0,0 +1,3337 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 microph 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ########################### + MODULE MODI_READ_XKER_SWETH +! ########################### +! +INTERFACE + SUBROUTINE READ_XKER_SWETH (KWETLBDAH,KWETLBDAS,KND, & + PALPHAH,PNUH,PALPHAS,PNUS,PEHS,PBS,PCH,PDH,PCS,PDS, & + PWETLBDAH_MAX,PWETLBDAS_MAX,PWETLBDAH_MIN,PWETLBDAS_MIN, & + PFDINFTY,PKER_SWETH ) +! +INTEGER, INTENT(OUT) :: KND,KWETLBDAH,KWETLBDAS +REAL, INTENT(OUT) :: PALPHAH +REAL, INTENT(OUT) :: PNUH +REAL, INTENT(OUT) :: PALPHAS +REAL, INTENT(OUT) :: PNUS +REAL, INTENT(OUT) :: PEHS +REAL, INTENT(OUT) :: PBS +REAL, INTENT(OUT) :: PCH +REAL, INTENT(OUT) :: PDH +REAL, INTENT(OUT) :: PCS +REAL, INTENT(OUT) :: PDS +REAL, INTENT(OUT) :: PWETLBDAH_MAX +REAL, INTENT(OUT) :: PWETLBDAS_MAX +REAL, INTENT(OUT) :: PWETLBDAH_MIN +REAL, INTENT(OUT) :: PWETLBDAS_MIN +REAL, INTENT(OUT) :: PFDINFTY +REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PKER_SWETH +! +END SUBROUTINE +! +END INTERFACE +! +END MODULE MODI_READ_XKER_SWETH +! ######################################################################## + SUBROUTINE READ_XKER_SWETH (KWETLBDAH,KWETLBDAS,KND, & + PALPHAH,PNUH,PALPHAS,PNUS,PEHS,PBS,PCH,PDH,PCS,PDS, & + PWETLBDAH_MAX,PWETLBDAS_MAX,PWETLBDAH_MIN,PWETLBDAS_MIN, & + PFDINFTY,PKER_SWETH ) +! ######################################################################## +! +!!**** * * - initialize the kernels for the snow-hail wet growth process +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to initialize the kernels PKER_SWETH +!! prepared from a previous run of the routine INI_RAIN_ICE. The reading +!! of the kernels is optional after checking for the dimensions of the +!! arrays. +!! +!!** METHOD +!! ------ +!! +!! +!! EXTERNAL +!! -------- +!! None +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! Book2 of documentation ( routine READ_XKER_SWETH ) +!! +!! AUTHOR +!! ------ +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original 19/04/97 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +!* 0.2 Declarations of local variables : +! +! +INTEGER, INTENT(OUT) :: KND,KWETLBDAH,KWETLBDAS +REAL, INTENT(OUT) :: PALPHAH +REAL, INTENT(OUT) :: PNUH +REAL, INTENT(OUT) :: PALPHAS +REAL, INTENT(OUT) :: PNUS +REAL, INTENT(OUT) :: PEHS +REAL, INTENT(OUT) :: PBS +REAL, INTENT(OUT) :: PCH +REAL, INTENT(OUT) :: PDH +REAL, INTENT(OUT) :: PCS +REAL, INTENT(OUT) :: PDS +REAL, INTENT(OUT) :: PWETLBDAH_MAX +REAL, INTENT(OUT) :: PWETLBDAS_MAX +REAL, INTENT(OUT) :: PWETLBDAH_MIN +REAL, INTENT(OUT) :: PWETLBDAS_MIN +REAL, INTENT(OUT) :: PFDINFTY +REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PKER_SWETH +! +! ######################################################################## +! #INSERT HERE THE OUTPUT OF INI_RAIN_ICE_HAIL IF THE KERNELS ARE UPDATED# +! ######################################################################## +! +KND= 50 +KWETLBDAH= 40 +KWETLBDAS= 80 +PALPHAH= 0.100000E+01 +PNUH= 0.800000E+01 +PALPHAS= 0.100000E+01 +PNUS= 0.100000E+01 +PEHS= 0.100000E+01 +PBS= 0.190000E+01 +PCH= 0.207000E+03 +PDH= 0.640000E+00 +PCS= 0.510000E+01 +PDS= 0.270000E+00 +PWETLBDAH_MAX= 0.100000E+08 +PWETLBDAS_MAX= 0.250000E+10 +PWETLBDAH_MIN= 0.100000E+04 +PWETLBDAS_MIN= 0.250000E+02 +PFDINFTY= 0.200000E+02 +! +IF( PRESENT(PKER_SWETH) ) THEN + PKER_SWETH( 1, 1) = 0.615237E+01 + PKER_SWETH( 1, 2) = 0.637080E+01 + PKER_SWETH( 1, 3) = 0.658231E+01 + PKER_SWETH( 1, 4) = 0.678858E+01 + PKER_SWETH( 1, 5) = 0.699129E+01 + PKER_SWETH( 1, 6) = 0.719213E+01 + PKER_SWETH( 1, 7) = 0.739259E+01 + PKER_SWETH( 1, 8) = 0.759386E+01 + PKER_SWETH( 1, 9) = 0.779656E+01 + PKER_SWETH( 1, 10) = 0.800053E+01 + PKER_SWETH( 1, 11) = 0.820465E+01 + PKER_SWETH( 1, 12) = 0.840686E+01 + PKER_SWETH( 1, 13) = 0.860429E+01 + PKER_SWETH( 1, 14) = 0.879377E+01 + PKER_SWETH( 1, 15) = 0.897226E+01 + PKER_SWETH( 1, 16) = 0.913741E+01 + PKER_SWETH( 1, 17) = 0.928778E+01 + PKER_SWETH( 1, 18) = 0.942293E+01 + PKER_SWETH( 1, 19) = 0.954325E+01 + PKER_SWETH( 1, 20) = 0.964973E+01 + PKER_SWETH( 1, 21) = 0.974368E+01 + PKER_SWETH( 1, 22) = 0.982656E+01 + PKER_SWETH( 1, 23) = 0.989979E+01 + PKER_SWETH( 1, 24) = 0.996470E+01 + PKER_SWETH( 1, 25) = 0.100225E+02 + PKER_SWETH( 1, 26) = 0.100741E+02 + PKER_SWETH( 1, 27) = 0.101205E+02 + PKER_SWETH( 1, 28) = 0.101624E+02 + PKER_SWETH( 1, 29) = 0.102004E+02 + PKER_SWETH( 1, 30) = 0.102350E+02 + PKER_SWETH( 1, 31) = 0.102667E+02 + PKER_SWETH( 1, 32) = 0.102957E+02 + PKER_SWETH( 1, 33) = 0.103224E+02 + PKER_SWETH( 1, 34) = 0.103471E+02 + PKER_SWETH( 1, 35) = 0.103699E+02 + PKER_SWETH( 1, 36) = 0.103911E+02 + PKER_SWETH( 1, 37) = 0.104108E+02 + PKER_SWETH( 1, 38) = 0.104291E+02 + PKER_SWETH( 1, 39) = 0.104461E+02 + PKER_SWETH( 1, 40) = 0.104620E+02 + PKER_SWETH( 1, 41) = 0.104769E+02 + PKER_SWETH( 1, 42) = 0.104908E+02 + PKER_SWETH( 1, 43) = 0.105038E+02 + PKER_SWETH( 1, 44) = 0.105159E+02 + PKER_SWETH( 1, 45) = 0.105273E+02 + PKER_SWETH( 1, 46) = 0.105380E+02 + PKER_SWETH( 1, 47) = 0.105480E+02 + PKER_SWETH( 1, 48) = 0.105573E+02 + PKER_SWETH( 1, 49) = 0.105661E+02 + PKER_SWETH( 1, 50) = 0.105744E+02 + PKER_SWETH( 1, 51) = 0.105821E+02 + PKER_SWETH( 1, 52) = 0.105893E+02 + PKER_SWETH( 1, 53) = 0.105961E+02 + PKER_SWETH( 1, 54) = 0.106025E+02 + PKER_SWETH( 1, 55) = 0.106085E+02 + PKER_SWETH( 1, 56) = 0.106141E+02 + PKER_SWETH( 1, 57) = 0.106194E+02 + PKER_SWETH( 1, 58) = 0.106244E+02 + PKER_SWETH( 1, 59) = 0.106290E+02 + PKER_SWETH( 1, 60) = 0.106334E+02 + PKER_SWETH( 1, 61) = 0.106375E+02 + PKER_SWETH( 1, 62) = 0.106413E+02 + PKER_SWETH( 1, 63) = 0.106450E+02 + PKER_SWETH( 1, 64) = 0.106483E+02 + PKER_SWETH( 1, 65) = 0.106515E+02 + PKER_SWETH( 1, 66) = 0.106545E+02 + PKER_SWETH( 1, 67) = 0.106573E+02 + PKER_SWETH( 1, 68) = 0.106600E+02 + PKER_SWETH( 1, 69) = 0.106624E+02 + PKER_SWETH( 1, 70) = 0.106648E+02 + PKER_SWETH( 1, 71) = 0.106669E+02 + PKER_SWETH( 1, 72) = 0.106690E+02 + PKER_SWETH( 1, 73) = 0.106709E+02 + PKER_SWETH( 1, 74) = 0.106727E+02 + PKER_SWETH( 1, 75) = 0.106744E+02 + PKER_SWETH( 1, 76) = 0.106760E+02 + PKER_SWETH( 1, 77) = 0.106775E+02 + PKER_SWETH( 1, 78) = 0.106789E+02 + PKER_SWETH( 1, 79) = 0.106802E+02 + PKER_SWETH( 1, 80) = 0.106815E+02 + PKER_SWETH( 2, 1) = 0.482432E+01 + PKER_SWETH( 2, 2) = 0.503595E+01 + PKER_SWETH( 2, 3) = 0.523941E+01 + PKER_SWETH( 2, 4) = 0.543608E+01 + PKER_SWETH( 2, 5) = 0.562743E+01 + PKER_SWETH( 2, 6) = 0.581495E+01 + PKER_SWETH( 2, 7) = 0.600013E+01 + PKER_SWETH( 2, 8) = 0.618431E+01 + PKER_SWETH( 2, 9) = 0.636855E+01 + PKER_SWETH( 2, 10) = 0.655341E+01 + PKER_SWETH( 2, 11) = 0.673880E+01 + PKER_SWETH( 2, 12) = 0.692377E+01 + PKER_SWETH( 2, 13) = 0.710655E+01 + PKER_SWETH( 2, 14) = 0.728471E+01 + PKER_SWETH( 2, 15) = 0.745548E+01 + PKER_SWETH( 2, 16) = 0.761628E+01 + PKER_SWETH( 2, 17) = 0.776507E+01 + PKER_SWETH( 2, 18) = 0.790065E+01 + PKER_SWETH( 2, 19) = 0.802264E+01 + PKER_SWETH( 2, 20) = 0.813143E+01 + PKER_SWETH( 2, 21) = 0.822788E+01 + PKER_SWETH( 2, 22) = 0.831318E+01 + PKER_SWETH( 2, 23) = 0.838861E+01 + PKER_SWETH( 2, 24) = 0.845542E+01 + PKER_SWETH( 2, 25) = 0.851480E+01 + PKER_SWETH( 2, 26) = 0.856779E+01 + PKER_SWETH( 2, 27) = 0.861528E+01 + PKER_SWETH( 2, 28) = 0.865805E+01 + PKER_SWETH( 2, 29) = 0.869674E+01 + PKER_SWETH( 2, 30) = 0.873190E+01 + PKER_SWETH( 2, 31) = 0.876398E+01 + PKER_SWETH( 2, 32) = 0.879336E+01 + PKER_SWETH( 2, 33) = 0.882036E+01 + PKER_SWETH( 2, 34) = 0.884525E+01 + PKER_SWETH( 2, 35) = 0.886825E+01 + PKER_SWETH( 2, 36) = 0.888956E+01 + PKER_SWETH( 2, 37) = 0.890934E+01 + PKER_SWETH( 2, 38) = 0.892772E+01 + PKER_SWETH( 2, 39) = 0.894485E+01 + PKER_SWETH( 2, 40) = 0.896081E+01 + PKER_SWETH( 2, 41) = 0.897571E+01 + PKER_SWETH( 2, 42) = 0.898963E+01 + PKER_SWETH( 2, 43) = 0.900265E+01 + PKER_SWETH( 2, 44) = 0.901483E+01 + PKER_SWETH( 2, 45) = 0.902623E+01 + PKER_SWETH( 2, 46) = 0.903690E+01 + PKER_SWETH( 2, 47) = 0.904690E+01 + PKER_SWETH( 2, 48) = 0.905628E+01 + PKER_SWETH( 2, 49) = 0.906507E+01 + PKER_SWETH( 2, 50) = 0.907331E+01 + PKER_SWETH( 2, 51) = 0.908104E+01 + PKER_SWETH( 2, 52) = 0.908830E+01 + PKER_SWETH( 2, 53) = 0.909510E+01 + PKER_SWETH( 2, 54) = 0.910149E+01 + PKER_SWETH( 2, 55) = 0.910748E+01 + PKER_SWETH( 2, 56) = 0.911311E+01 + PKER_SWETH( 2, 57) = 0.911839E+01 + PKER_SWETH( 2, 58) = 0.912334E+01 + PKER_SWETH( 2, 59) = 0.912799E+01 + PKER_SWETH( 2, 60) = 0.913236E+01 + PKER_SWETH( 2, 61) = 0.913646E+01 + PKER_SWETH( 2, 62) = 0.914031E+01 + PKER_SWETH( 2, 63) = 0.914392E+01 + PKER_SWETH( 2, 64) = 0.914731E+01 + PKER_SWETH( 2, 65) = 0.915050E+01 + PKER_SWETH( 2, 66) = 0.915349E+01 + PKER_SWETH( 2, 67) = 0.915630E+01 + PKER_SWETH( 2, 68) = 0.915894E+01 + PKER_SWETH( 2, 69) = 0.916141E+01 + PKER_SWETH( 2, 70) = 0.916374E+01 + PKER_SWETH( 2, 71) = 0.916592E+01 + PKER_SWETH( 2, 72) = 0.916797E+01 + PKER_SWETH( 2, 73) = 0.916989E+01 + PKER_SWETH( 2, 74) = 0.917170E+01 + PKER_SWETH( 2, 75) = 0.917339E+01 + PKER_SWETH( 2, 76) = 0.917499E+01 + PKER_SWETH( 2, 77) = 0.917648E+01 + PKER_SWETH( 2, 78) = 0.917789E+01 + PKER_SWETH( 2, 79) = 0.917921E+01 + PKER_SWETH( 2, 80) = 0.918044E+01 + PKER_SWETH( 3, 1) = 0.368905E+01 + PKER_SWETH( 3, 2) = 0.389478E+01 + PKER_SWETH( 3, 3) = 0.409193E+01 + PKER_SWETH( 3, 4) = 0.428141E+01 + PKER_SWETH( 3, 5) = 0.446434E+01 + PKER_SWETH( 3, 6) = 0.464196E+01 + PKER_SWETH( 3, 7) = 0.481560E+01 + PKER_SWETH( 3, 8) = 0.498655E+01 + PKER_SWETH( 3, 9) = 0.515601E+01 + PKER_SWETH( 3, 10) = 0.532493E+01 + PKER_SWETH( 3, 11) = 0.549382E+01 + PKER_SWETH( 3, 12) = 0.566262E+01 + PKER_SWETH( 3, 13) = 0.583056E+01 + PKER_SWETH( 3, 14) = 0.599610E+01 + PKER_SWETH( 3, 15) = 0.615716E+01 + PKER_SWETH( 3, 16) = 0.631137E+01 + PKER_SWETH( 3, 17) = 0.645651E+01 + PKER_SWETH( 3, 18) = 0.659082E+01 + PKER_SWETH( 3, 19) = 0.671329E+01 + PKER_SWETH( 3, 20) = 0.682361E+01 + PKER_SWETH( 3, 21) = 0.692215E+01 + PKER_SWETH( 3, 22) = 0.700968E+01 + PKER_SWETH( 3, 23) = 0.708726E+01 + PKER_SWETH( 3, 24) = 0.715602E+01 + PKER_SWETH( 3, 25) = 0.721708E+01 + PKER_SWETH( 3, 26) = 0.727148E+01 + PKER_SWETH( 3, 27) = 0.732015E+01 + PKER_SWETH( 3, 28) = 0.736386E+01 + PKER_SWETH( 3, 29) = 0.740332E+01 + PKER_SWETH( 3, 30) = 0.743910E+01 + PKER_SWETH( 3, 31) = 0.747167E+01 + PKER_SWETH( 3, 32) = 0.750144E+01 + PKER_SWETH( 3, 33) = 0.752875E+01 + PKER_SWETH( 3, 34) = 0.755388E+01 + PKER_SWETH( 3, 35) = 0.757707E+01 + PKER_SWETH( 3, 36) = 0.759853E+01 + PKER_SWETH( 3, 37) = 0.761842E+01 + PKER_SWETH( 3, 38) = 0.763691E+01 + PKER_SWETH( 3, 39) = 0.765410E+01 + PKER_SWETH( 3, 40) = 0.767013E+01 + PKER_SWETH( 3, 41) = 0.768507E+01 + PKER_SWETH( 3, 42) = 0.769903E+01 + PKER_SWETH( 3, 43) = 0.771207E+01 + PKER_SWETH( 3, 44) = 0.772427E+01 + PKER_SWETH( 3, 45) = 0.773569E+01 + PKER_SWETH( 3, 46) = 0.774638E+01 + PKER_SWETH( 3, 47) = 0.775639E+01 + PKER_SWETH( 3, 48) = 0.776578E+01 + PKER_SWETH( 3, 49) = 0.777457E+01 + PKER_SWETH( 3, 50) = 0.778282E+01 + PKER_SWETH( 3, 51) = 0.779056E+01 + PKER_SWETH( 3, 52) = 0.779781E+01 + PKER_SWETH( 3, 53) = 0.780462E+01 + PKER_SWETH( 3, 54) = 0.781101E+01 + PKER_SWETH( 3, 55) = 0.781700E+01 + PKER_SWETH( 3, 56) = 0.782263E+01 + PKER_SWETH( 3, 57) = 0.782791E+01 + PKER_SWETH( 3, 58) = 0.783287E+01 + PKER_SWETH( 3, 59) = 0.783752E+01 + PKER_SWETH( 3, 60) = 0.784189E+01 + PKER_SWETH( 3, 61) = 0.784599E+01 + PKER_SWETH( 3, 62) = 0.784984E+01 + PKER_SWETH( 3, 63) = 0.785345E+01 + PKER_SWETH( 3, 64) = 0.785684E+01 + PKER_SWETH( 3, 65) = 0.786003E+01 + PKER_SWETH( 3, 66) = 0.786302E+01 + PKER_SWETH( 3, 67) = 0.786583E+01 + PKER_SWETH( 3, 68) = 0.786846E+01 + PKER_SWETH( 3, 69) = 0.787094E+01 + PKER_SWETH( 3, 70) = 0.787326E+01 + PKER_SWETH( 3, 71) = 0.787545E+01 + PKER_SWETH( 3, 72) = 0.787750E+01 + PKER_SWETH( 3, 73) = 0.787942E+01 + PKER_SWETH( 3, 74) = 0.788123E+01 + PKER_SWETH( 3, 75) = 0.788292E+01 + PKER_SWETH( 3, 76) = 0.788452E+01 + PKER_SWETH( 3, 77) = 0.788601E+01 + PKER_SWETH( 3, 78) = 0.788742E+01 + PKER_SWETH( 3, 79) = 0.788874E+01 + PKER_SWETH( 3, 80) = 0.788997E+01 + PKER_SWETH( 4, 1) = 0.272364E+01 + PKER_SWETH( 4, 2) = 0.292170E+01 + PKER_SWETH( 4, 3) = 0.311233E+01 + PKER_SWETH( 4, 4) = 0.329553E+01 + PKER_SWETH( 4, 5) = 0.347178E+01 + PKER_SWETH( 4, 6) = 0.364187E+01 + PKER_SWETH( 4, 7) = 0.380681E+01 + PKER_SWETH( 4, 8) = 0.396771E+01 + PKER_SWETH( 4, 9) = 0.412569E+01 + PKER_SWETH( 4, 10) = 0.428181E+01 + PKER_SWETH( 4, 11) = 0.443691E+01 + PKER_SWETH( 4, 12) = 0.459147E+01 + PKER_SWETH( 4, 13) = 0.474544E+01 + PKER_SWETH( 4, 14) = 0.489819E+01 + PKER_SWETH( 4, 15) = 0.504840E+01 + PKER_SWETH( 4, 16) = 0.519429E+01 + PKER_SWETH( 4, 17) = 0.533381E+01 + PKER_SWETH( 4, 18) = 0.546505E+01 + PKER_SWETH( 4, 19) = 0.558652E+01 + PKER_SWETH( 4, 20) = 0.569735E+01 + PKER_SWETH( 4, 21) = 0.579731E+01 + PKER_SWETH( 4, 22) = 0.588672E+01 + PKER_SWETH( 4, 23) = 0.596630E+01 + PKER_SWETH( 4, 24) = 0.603698E+01 + PKER_SWETH( 4, 25) = 0.609976E+01 + PKER_SWETH( 4, 26) = 0.615566E+01 + PKER_SWETH( 4, 27) = 0.620557E+01 + PKER_SWETH( 4, 28) = 0.625032E+01 + PKER_SWETH( 4, 29) = 0.629062E+01 + PKER_SWETH( 4, 30) = 0.632707E+01 + PKER_SWETH( 4, 31) = 0.636018E+01 + PKER_SWETH( 4, 32) = 0.639038E+01 + PKER_SWETH( 4, 33) = 0.641803E+01 + PKER_SWETH( 4, 34) = 0.644343E+01 + PKER_SWETH( 4, 35) = 0.646684E+01 + PKER_SWETH( 4, 36) = 0.648846E+01 + PKER_SWETH( 4, 37) = 0.650849E+01 + PKER_SWETH( 4, 38) = 0.652707E+01 + PKER_SWETH( 4, 39) = 0.654435E+01 + PKER_SWETH( 4, 40) = 0.656044E+01 + PKER_SWETH( 4, 41) = 0.657544E+01 + PKER_SWETH( 4, 42) = 0.658943E+01 + PKER_SWETH( 4, 43) = 0.660251E+01 + PKER_SWETH( 4, 44) = 0.661473E+01 + PKER_SWETH( 4, 45) = 0.662617E+01 + PKER_SWETH( 4, 46) = 0.663687E+01 + PKER_SWETH( 4, 47) = 0.664690E+01 + PKER_SWETH( 4, 48) = 0.665629E+01 + PKER_SWETH( 4, 49) = 0.666510E+01 + PKER_SWETH( 4, 50) = 0.667335E+01 + PKER_SWETH( 4, 51) = 0.668109E+01 + PKER_SWETH( 4, 52) = 0.668835E+01 + PKER_SWETH( 4, 53) = 0.669516E+01 + PKER_SWETH( 4, 54) = 0.670155E+01 + PKER_SWETH( 4, 55) = 0.670755E+01 + PKER_SWETH( 4, 56) = 0.671318E+01 + PKER_SWETH( 4, 57) = 0.671846E+01 + PKER_SWETH( 4, 58) = 0.672342E+01 + PKER_SWETH( 4, 59) = 0.672807E+01 + PKER_SWETH( 4, 60) = 0.673244E+01 + PKER_SWETH( 4, 61) = 0.673654E+01 + PKER_SWETH( 4, 62) = 0.674039E+01 + PKER_SWETH( 4, 63) = 0.674400E+01 + PKER_SWETH( 4, 64) = 0.674739E+01 + PKER_SWETH( 4, 65) = 0.675058E+01 + PKER_SWETH( 4, 66) = 0.675357E+01 + PKER_SWETH( 4, 67) = 0.675638E+01 + PKER_SWETH( 4, 68) = 0.675902E+01 + PKER_SWETH( 4, 69) = 0.676149E+01 + PKER_SWETH( 4, 70) = 0.676382E+01 + PKER_SWETH( 4, 71) = 0.676600E+01 + PKER_SWETH( 4, 72) = 0.676805E+01 + PKER_SWETH( 4, 73) = 0.676997E+01 + PKER_SWETH( 4, 74) = 0.677178E+01 + PKER_SWETH( 4, 75) = 0.677348E+01 + PKER_SWETH( 4, 76) = 0.677507E+01 + PKER_SWETH( 4, 77) = 0.677656E+01 + PKER_SWETH( 4, 78) = 0.677797E+01 + PKER_SWETH( 4, 79) = 0.677929E+01 + PKER_SWETH( 4, 80) = 0.678053E+01 + PKER_SWETH( 5, 1) = 0.191873E+01 + PKER_SWETH( 5, 2) = 0.210156E+01 + PKER_SWETH( 5, 3) = 0.228144E+01 + PKER_SWETH( 5, 4) = 0.245647E+01 + PKER_SWETH( 5, 5) = 0.262578E+01 + PKER_SWETH( 5, 6) = 0.278922E+01 + PKER_SWETH( 5, 7) = 0.294715E+01 + PKER_SWETH( 5, 8) = 0.310025E+01 + PKER_SWETH( 5, 9) = 0.324939E+01 + PKER_SWETH( 5, 10) = 0.339551E+01 + PKER_SWETH( 5, 11) = 0.353950E+01 + PKER_SWETH( 5, 12) = 0.368211E+01 + PKER_SWETH( 5, 13) = 0.382377E+01 + PKER_SWETH( 5, 14) = 0.396446E+01 + PKER_SWETH( 5, 15) = 0.410364E+01 + PKER_SWETH( 5, 16) = 0.424020E+01 + PKER_SWETH( 5, 17) = 0.437258E+01 + PKER_SWETH( 5, 18) = 0.449905E+01 + PKER_SWETH( 5, 19) = 0.461795E+01 + PKER_SWETH( 5, 20) = 0.472801E+01 + PKER_SWETH( 5, 21) = 0.482849E+01 + PKER_SWETH( 5, 22) = 0.491922E+01 + PKER_SWETH( 5, 23) = 0.500049E+01 + PKER_SWETH( 5, 24) = 0.507296E+01 + PKER_SWETH( 5, 25) = 0.513746E+01 + PKER_SWETH( 5, 26) = 0.519489E+01 + PKER_SWETH( 5, 27) = 0.524613E+01 + PKER_SWETH( 5, 28) = 0.529199E+01 + PKER_SWETH( 5, 29) = 0.533320E+01 + PKER_SWETH( 5, 30) = 0.537039E+01 + PKER_SWETH( 5, 31) = 0.540410E+01 + PKER_SWETH( 5, 32) = 0.543477E+01 + PKER_SWETH( 5, 33) = 0.546280E+01 + PKER_SWETH( 5, 34) = 0.548850E+01 + PKER_SWETH( 5, 35) = 0.551214E+01 + PKER_SWETH( 5, 36) = 0.553395E+01 + PKER_SWETH( 5, 37) = 0.555413E+01 + PKER_SWETH( 5, 38) = 0.557283E+01 + PKER_SWETH( 5, 39) = 0.559020E+01 + PKER_SWETH( 5, 40) = 0.560636E+01 + PKER_SWETH( 5, 41) = 0.562141E+01 + PKER_SWETH( 5, 42) = 0.563545E+01 + PKER_SWETH( 5, 43) = 0.564856E+01 + PKER_SWETH( 5, 44) = 0.566081E+01 + PKER_SWETH( 5, 45) = 0.567227E+01 + PKER_SWETH( 5, 46) = 0.568299E+01 + PKER_SWETH( 5, 47) = 0.569303E+01 + PKER_SWETH( 5, 48) = 0.570244E+01 + PKER_SWETH( 5, 49) = 0.571125E+01 + PKER_SWETH( 5, 50) = 0.571951E+01 + PKER_SWETH( 5, 51) = 0.572725E+01 + PKER_SWETH( 5, 52) = 0.573452E+01 + PKER_SWETH( 5, 53) = 0.574133E+01 + PKER_SWETH( 5, 54) = 0.574773E+01 + PKER_SWETH( 5, 55) = 0.575372E+01 + PKER_SWETH( 5, 56) = 0.575935E+01 + PKER_SWETH( 5, 57) = 0.576463E+01 + PKER_SWETH( 5, 58) = 0.576959E+01 + PKER_SWETH( 5, 59) = 0.577425E+01 + PKER_SWETH( 5, 60) = 0.577862E+01 + PKER_SWETH( 5, 61) = 0.578272E+01 + PKER_SWETH( 5, 62) = 0.578657E+01 + PKER_SWETH( 5, 63) = 0.579018E+01 + PKER_SWETH( 5, 64) = 0.579357E+01 + PKER_SWETH( 5, 65) = 0.579676E+01 + PKER_SWETH( 5, 66) = 0.579975E+01 + PKER_SWETH( 5, 67) = 0.580256E+01 + PKER_SWETH( 5, 68) = 0.580520E+01 + PKER_SWETH( 5, 69) = 0.580767E+01 + PKER_SWETH( 5, 70) = 0.581000E+01 + PKER_SWETH( 5, 71) = 0.581218E+01 + PKER_SWETH( 5, 72) = 0.581423E+01 + PKER_SWETH( 5, 73) = 0.581615E+01 + PKER_SWETH( 5, 74) = 0.581796E+01 + PKER_SWETH( 5, 75) = 0.581966E+01 + PKER_SWETH( 5, 76) = 0.582125E+01 + PKER_SWETH( 5, 77) = 0.582275E+01 + PKER_SWETH( 5, 78) = 0.582415E+01 + PKER_SWETH( 5, 79) = 0.582547E+01 + PKER_SWETH( 5, 80) = 0.582671E+01 + PKER_SWETH( 6, 1) = 0.128538E+01 + PKER_SWETH( 6, 2) = 0.143580E+01 + PKER_SWETH( 6, 3) = 0.159310E+01 + PKER_SWETH( 6, 4) = 0.175236E+01 + PKER_SWETH( 6, 5) = 0.191039E+01 + PKER_SWETH( 6, 6) = 0.206519E+01 + PKER_SWETH( 6, 7) = 0.221578E+01 + PKER_SWETH( 6, 8) = 0.236189E+01 + PKER_SWETH( 6, 9) = 0.250376E+01 + PKER_SWETH( 6, 10) = 0.264193E+01 + PKER_SWETH( 6, 11) = 0.277711E+01 + PKER_SWETH( 6, 12) = 0.291003E+01 + PKER_SWETH( 6, 13) = 0.304132E+01 + PKER_SWETH( 6, 14) = 0.317134E+01 + PKER_SWETH( 6, 15) = 0.330011E+01 + PKER_SWETH( 6, 16) = 0.342714E+01 + PKER_SWETH( 6, 17) = 0.355150E+01 + PKER_SWETH( 6, 18) = 0.367186E+01 + PKER_SWETH( 6, 19) = 0.378671E+01 + PKER_SWETH( 6, 20) = 0.389463E+01 + PKER_SWETH( 6, 21) = 0.399453E+01 + PKER_SWETH( 6, 22) = 0.408580E+01 + PKER_SWETH( 6, 23) = 0.416829E+01 + PKER_SWETH( 6, 24) = 0.424230E+01 + PKER_SWETH( 6, 25) = 0.430841E+01 + PKER_SWETH( 6, 26) = 0.436736E+01 + PKER_SWETH( 6, 27) = 0.441996E+01 + PKER_SWETH( 6, 28) = 0.446700E+01 + PKER_SWETH( 6, 29) = 0.450920E+01 + PKER_SWETH( 6, 30) = 0.454719E+01 + PKER_SWETH( 6, 31) = 0.458156E+01 + PKER_SWETH( 6, 32) = 0.461276E+01 + PKER_SWETH( 6, 33) = 0.464121E+01 + PKER_SWETH( 6, 34) = 0.466724E+01 + PKER_SWETH( 6, 35) = 0.469115E+01 + PKER_SWETH( 6, 36) = 0.471317E+01 + PKER_SWETH( 6, 37) = 0.473351E+01 + PKER_SWETH( 6, 38) = 0.475234E+01 + PKER_SWETH( 6, 39) = 0.476981E+01 + PKER_SWETH( 6, 40) = 0.478604E+01 + PKER_SWETH( 6, 41) = 0.480116E+01 + PKER_SWETH( 6, 42) = 0.481525E+01 + PKER_SWETH( 6, 43) = 0.482840E+01 + PKER_SWETH( 6, 44) = 0.484068E+01 + PKER_SWETH( 6, 45) = 0.485216E+01 + PKER_SWETH( 6, 46) = 0.486290E+01 + PKER_SWETH( 6, 47) = 0.487296E+01 + PKER_SWETH( 6, 48) = 0.488237E+01 + PKER_SWETH( 6, 49) = 0.489119E+01 + PKER_SWETH( 6, 50) = 0.489946E+01 + PKER_SWETH( 6, 51) = 0.490721E+01 + PKER_SWETH( 6, 52) = 0.491448E+01 + PKER_SWETH( 6, 53) = 0.492130E+01 + PKER_SWETH( 6, 54) = 0.492769E+01 + PKER_SWETH( 6, 55) = 0.493369E+01 + PKER_SWETH( 6, 56) = 0.493932E+01 + PKER_SWETH( 6, 57) = 0.494461E+01 + PKER_SWETH( 6, 58) = 0.494957E+01 + PKER_SWETH( 6, 59) = 0.495422E+01 + PKER_SWETH( 6, 60) = 0.495859E+01 + PKER_SWETH( 6, 61) = 0.496269E+01 + PKER_SWETH( 6, 62) = 0.496654E+01 + PKER_SWETH( 6, 63) = 0.497016E+01 + PKER_SWETH( 6, 64) = 0.497355E+01 + PKER_SWETH( 6, 65) = 0.497674E+01 + PKER_SWETH( 6, 66) = 0.497973E+01 + PKER_SWETH( 6, 67) = 0.498254E+01 + PKER_SWETH( 6, 68) = 0.498518E+01 + PKER_SWETH( 6, 69) = 0.498765E+01 + PKER_SWETH( 6, 70) = 0.498998E+01 + PKER_SWETH( 6, 71) = 0.499216E+01 + PKER_SWETH( 6, 72) = 0.499421E+01 + PKER_SWETH( 6, 73) = 0.499613E+01 + PKER_SWETH( 6, 74) = 0.499794E+01 + PKER_SWETH( 6, 75) = 0.499964E+01 + PKER_SWETH( 6, 76) = 0.500123E+01 + PKER_SWETH( 6, 77) = 0.500272E+01 + PKER_SWETH( 6, 78) = 0.500413E+01 + PKER_SWETH( 6, 79) = 0.500545E+01 + PKER_SWETH( 6, 80) = 0.500669E+01 + PKER_SWETH( 7, 1) = 0.856768E+00 + PKER_SWETH( 7, 2) = 0.947769E+00 + PKER_SWETH( 7, 3) = 0.106025E+01 + PKER_SWETH( 7, 4) = 0.118718E+01 + PKER_SWETH( 7, 5) = 0.132214E+01 + PKER_SWETH( 7, 6) = 0.146072E+01 + PKER_SWETH( 7, 7) = 0.159954E+01 + PKER_SWETH( 7, 8) = 0.173657E+01 + PKER_SWETH( 7, 9) = 0.187073E+01 + PKER_SWETH( 7, 10) = 0.200163E+01 + PKER_SWETH( 7, 11) = 0.212938E+01 + PKER_SWETH( 7, 12) = 0.225437E+01 + PKER_SWETH( 7, 13) = 0.237711E+01 + PKER_SWETH( 7, 14) = 0.249807E+01 + PKER_SWETH( 7, 15) = 0.261757E+01 + PKER_SWETH( 7, 16) = 0.273559E+01 + PKER_SWETH( 7, 17) = 0.285173E+01 + PKER_SWETH( 7, 18) = 0.296518E+01 + PKER_SWETH( 7, 19) = 0.307480E+01 + PKER_SWETH( 7, 20) = 0.317928E+01 + PKER_SWETH( 7, 21) = 0.327741E+01 + PKER_SWETH( 7, 22) = 0.336826E+01 + PKER_SWETH( 7, 23) = 0.345129E+01 + PKER_SWETH( 7, 24) = 0.352643E+01 + PKER_SWETH( 7, 25) = 0.359394E+01 + PKER_SWETH( 7, 26) = 0.365434E+01 + PKER_SWETH( 7, 27) = 0.370832E+01 + PKER_SWETH( 7, 28) = 0.375657E+01 + PKER_SWETH( 7, 29) = 0.379981E+01 + PKER_SWETH( 7, 30) = 0.383869E+01 + PKER_SWETH( 7, 31) = 0.387377E+01 + PKER_SWETH( 7, 32) = 0.390555E+01 + PKER_SWETH( 7, 33) = 0.393446E+01 + PKER_SWETH( 7, 34) = 0.396087E+01 + PKER_SWETH( 7, 35) = 0.398507E+01 + PKER_SWETH( 7, 36) = 0.400732E+01 + PKER_SWETH( 7, 37) = 0.402784E+01 + PKER_SWETH( 7, 38) = 0.404682E+01 + PKER_SWETH( 7, 39) = 0.406440E+01 + PKER_SWETH( 7, 40) = 0.408073E+01 + PKER_SWETH( 7, 41) = 0.409591E+01 + PKER_SWETH( 7, 42) = 0.411006E+01 + PKER_SWETH( 7, 43) = 0.412325E+01 + PKER_SWETH( 7, 44) = 0.413556E+01 + PKER_SWETH( 7, 45) = 0.414707E+01 + PKER_SWETH( 7, 46) = 0.415783E+01 + PKER_SWETH( 7, 47) = 0.416790E+01 + PKER_SWETH( 7, 48) = 0.417733E+01 + PKER_SWETH( 7, 49) = 0.418616E+01 + PKER_SWETH( 7, 50) = 0.419444E+01 + PKER_SWETH( 7, 51) = 0.420220E+01 + PKER_SWETH( 7, 52) = 0.420947E+01 + PKER_SWETH( 7, 53) = 0.421629E+01 + PKER_SWETH( 7, 54) = 0.422269E+01 + PKER_SWETH( 7, 55) = 0.422869E+01 + PKER_SWETH( 7, 56) = 0.423433E+01 + PKER_SWETH( 7, 57) = 0.423961E+01 + PKER_SWETH( 7, 58) = 0.424457E+01 + PKER_SWETH( 7, 59) = 0.424923E+01 + PKER_SWETH( 7, 60) = 0.425360E+01 + PKER_SWETH( 7, 61) = 0.425770E+01 + PKER_SWETH( 7, 62) = 0.426155E+01 + PKER_SWETH( 7, 63) = 0.426517E+01 + PKER_SWETH( 7, 64) = 0.426856E+01 + PKER_SWETH( 7, 65) = 0.427175E+01 + PKER_SWETH( 7, 66) = 0.427474E+01 + PKER_SWETH( 7, 67) = 0.427755E+01 + PKER_SWETH( 7, 68) = 0.428018E+01 + PKER_SWETH( 7, 69) = 0.428266E+01 + PKER_SWETH( 7, 70) = 0.428498E+01 + PKER_SWETH( 7, 71) = 0.428717E+01 + PKER_SWETH( 7, 72) = 0.428922E+01 + PKER_SWETH( 7, 73) = 0.429114E+01 + PKER_SWETH( 7, 74) = 0.429295E+01 + PKER_SWETH( 7, 75) = 0.429464E+01 + PKER_SWETH( 7, 76) = 0.429624E+01 + PKER_SWETH( 7, 77) = 0.429773E+01 + PKER_SWETH( 7, 78) = 0.429914E+01 + PKER_SWETH( 7, 79) = 0.430046E+01 + PKER_SWETH( 7, 80) = 0.430169E+01 + PKER_SWETH( 8, 1) = 0.666288E+00 + PKER_SWETH( 8, 2) = 0.672636E+00 + PKER_SWETH( 8, 3) = 0.713972E+00 + PKER_SWETH( 8, 4) = 0.783974E+00 + PKER_SWETH( 8, 5) = 0.875298E+00 + PKER_SWETH( 8, 6) = 0.981698E+00 + PKER_SWETH( 8, 7) = 0.109726E+01 + PKER_SWETH( 8, 8) = 0.121759E+01 + PKER_SWETH( 8, 9) = 0.133955E+01 + PKER_SWETH( 8, 10) = 0.146099E+01 + PKER_SWETH( 8, 11) = 0.158073E+01 + PKER_SWETH( 8, 12) = 0.169826E+01 + PKER_SWETH( 8, 13) = 0.181355E+01 + PKER_SWETH( 8, 14) = 0.192680E+01 + PKER_SWETH( 8, 15) = 0.203828E+01 + PKER_SWETH( 8, 16) = 0.214820E+01 + PKER_SWETH( 8, 17) = 0.225651E+01 + PKER_SWETH( 8, 18) = 0.236285E+01 + PKER_SWETH( 8, 19) = 0.246652E+01 + PKER_SWETH( 8, 20) = 0.256652E+01 + PKER_SWETH( 8, 21) = 0.266174E+01 + PKER_SWETH( 8, 22) = 0.275113E+01 + PKER_SWETH( 8, 23) = 0.283388E+01 + PKER_SWETH( 8, 24) = 0.290956E+01 + PKER_SWETH( 8, 25) = 0.297812E+01 + PKER_SWETH( 8, 26) = 0.303979E+01 + PKER_SWETH( 8, 27) = 0.309508E+01 + PKER_SWETH( 8, 28) = 0.314456E+01 + PKER_SWETH( 8, 29) = 0.318889E+01 + PKER_SWETH( 8, 30) = 0.322870E+01 + PKER_SWETH( 8, 31) = 0.326456E+01 + PKER_SWETH( 8, 32) = 0.329698E+01 + PKER_SWETH( 8, 33) = 0.332641E+01 + PKER_SWETH( 8, 34) = 0.335322E+01 + PKER_SWETH( 8, 35) = 0.337775E+01 + PKER_SWETH( 8, 36) = 0.340027E+01 + PKER_SWETH( 8, 37) = 0.342099E+01 + PKER_SWETH( 8, 38) = 0.344013E+01 + PKER_SWETH( 8, 39) = 0.345784E+01 + PKER_SWETH( 8, 40) = 0.347427E+01 + PKER_SWETH( 8, 41) = 0.348953E+01 + PKER_SWETH( 8, 42) = 0.350374E+01 + PKER_SWETH( 8, 43) = 0.351697E+01 + PKER_SWETH( 8, 44) = 0.352933E+01 + PKER_SWETH( 8, 45) = 0.354087E+01 + PKER_SWETH( 8, 46) = 0.355165E+01 + PKER_SWETH( 8, 47) = 0.356174E+01 + PKER_SWETH( 8, 48) = 0.357118E+01 + PKER_SWETH( 8, 49) = 0.358003E+01 + PKER_SWETH( 8, 50) = 0.358831E+01 + PKER_SWETH( 8, 51) = 0.359607E+01 + PKER_SWETH( 8, 52) = 0.360335E+01 + PKER_SWETH( 8, 53) = 0.361018E+01 + PKER_SWETH( 8, 54) = 0.361658E+01 + PKER_SWETH( 8, 55) = 0.362259E+01 + PKER_SWETH( 8, 56) = 0.362822E+01 + PKER_SWETH( 8, 57) = 0.363351E+01 + PKER_SWETH( 8, 58) = 0.363847E+01 + PKER_SWETH( 8, 59) = 0.364313E+01 + PKER_SWETH( 8, 60) = 0.364750E+01 + PKER_SWETH( 8, 61) = 0.365160E+01 + PKER_SWETH( 8, 62) = 0.365545E+01 + PKER_SWETH( 8, 63) = 0.365907E+01 + PKER_SWETH( 8, 64) = 0.366246E+01 + PKER_SWETH( 8, 65) = 0.366565E+01 + PKER_SWETH( 8, 66) = 0.366864E+01 + PKER_SWETH( 8, 67) = 0.367145E+01 + PKER_SWETH( 8, 68) = 0.367408E+01 + PKER_SWETH( 8, 69) = 0.367656E+01 + PKER_SWETH( 8, 70) = 0.367889E+01 + PKER_SWETH( 8, 71) = 0.368107E+01 + PKER_SWETH( 8, 72) = 0.368312E+01 + PKER_SWETH( 8, 73) = 0.368504E+01 + PKER_SWETH( 8, 74) = 0.368685E+01 + PKER_SWETH( 8, 75) = 0.368855E+01 + PKER_SWETH( 8, 76) = 0.369014E+01 + PKER_SWETH( 8, 77) = 0.369163E+01 + PKER_SWETH( 8, 78) = 0.369304E+01 + PKER_SWETH( 8, 79) = 0.369436E+01 + PKER_SWETH( 8, 80) = 0.369560E+01 + PKER_SWETH( 9, 1) = 0.707414E+00 + PKER_SWETH( 9, 2) = 0.624644E+00 + PKER_SWETH( 9, 3) = 0.580795E+00 + PKER_SWETH( 9, 4) = 0.573199E+00 + PKER_SWETH( 9, 5) = 0.598399E+00 + PKER_SWETH( 9, 6) = 0.650444E+00 + PKER_SWETH( 9, 7) = 0.723705E+00 + PKER_SWETH( 9, 8) = 0.812303E+00 + PKER_SWETH( 9, 9) = 0.910888E+00 + PKER_SWETH( 9, 10) = 0.101536E+01 + PKER_SWETH( 9, 11) = 0.112252E+01 + PKER_SWETH( 9, 12) = 0.123028E+01 + PKER_SWETH( 9, 13) = 0.133733E+01 + PKER_SWETH( 9, 14) = 0.144307E+01 + PKER_SWETH( 9, 15) = 0.154726E+01 + PKER_SWETH( 9, 16) = 0.164991E+01 + PKER_SWETH( 9, 17) = 0.175103E+01 + PKER_SWETH( 9, 18) = 0.185052E+01 + PKER_SWETH( 9, 19) = 0.194801E+01 + PKER_SWETH( 9, 20) = 0.204288E+01 + PKER_SWETH( 9, 21) = 0.213426E+01 + PKER_SWETH( 9, 22) = 0.222119E+01 + PKER_SWETH( 9, 23) = 0.230275E+01 + PKER_SWETH( 9, 24) = 0.237826E+01 + PKER_SWETH( 9, 25) = 0.244736E+01 + PKER_SWETH( 9, 26) = 0.251001E+01 + PKER_SWETH( 9, 27) = 0.256645E+01 + PKER_SWETH( 9, 28) = 0.261712E+01 + PKER_SWETH( 9, 29) = 0.266256E+01 + PKER_SWETH( 9, 30) = 0.270334E+01 + PKER_SWETH( 9, 31) = 0.274003E+01 + PKER_SWETH( 9, 32) = 0.277315E+01 + PKER_SWETH( 9, 33) = 0.280314E+01 + PKER_SWETH( 9, 34) = 0.283042E+01 + PKER_SWETH( 9, 35) = 0.285531E+01 + PKER_SWETH( 9, 36) = 0.287812E+01 + PKER_SWETH( 9, 37) = 0.289907E+01 + PKER_SWETH( 9, 38) = 0.291839E+01 + PKER_SWETH( 9, 39) = 0.293624E+01 + PKER_SWETH( 9, 40) = 0.295278E+01 + PKER_SWETH( 9, 41) = 0.296813E+01 + PKER_SWETH( 9, 42) = 0.298241E+01 + PKER_SWETH( 9, 43) = 0.299570E+01 + PKER_SWETH( 9, 44) = 0.300810E+01 + PKER_SWETH( 9, 45) = 0.301967E+01 + PKER_SWETH( 9, 46) = 0.303048E+01 + PKER_SWETH( 9, 47) = 0.304059E+01 + PKER_SWETH( 9, 48) = 0.305005E+01 + PKER_SWETH( 9, 49) = 0.305890E+01 + PKER_SWETH( 9, 50) = 0.306720E+01 + PKER_SWETH( 9, 51) = 0.307497E+01 + PKER_SWETH( 9, 52) = 0.308225E+01 + PKER_SWETH( 9, 53) = 0.308908E+01 + PKER_SWETH( 9, 54) = 0.309549E+01 + PKER_SWETH( 9, 55) = 0.310150E+01 + PKER_SWETH( 9, 56) = 0.310713E+01 + PKER_SWETH( 9, 57) = 0.311242E+01 + PKER_SWETH( 9, 58) = 0.311739E+01 + PKER_SWETH( 9, 59) = 0.312204E+01 + PKER_SWETH( 9, 60) = 0.312642E+01 + PKER_SWETH( 9, 61) = 0.313052E+01 + PKER_SWETH( 9, 62) = 0.313437E+01 + PKER_SWETH( 9, 63) = 0.313799E+01 + PKER_SWETH( 9, 64) = 0.314138E+01 + PKER_SWETH( 9, 65) = 0.314457E+01 + PKER_SWETH( 9, 66) = 0.314756E+01 + PKER_SWETH( 9, 67) = 0.315037E+01 + PKER_SWETH( 9, 68) = 0.315301E+01 + PKER_SWETH( 9, 69) = 0.315548E+01 + PKER_SWETH( 9, 70) = 0.315781E+01 + PKER_SWETH( 9, 71) = 0.315999E+01 + PKER_SWETH( 9, 72) = 0.316204E+01 + PKER_SWETH( 9, 73) = 0.316396E+01 + PKER_SWETH( 9, 74) = 0.316577E+01 + PKER_SWETH( 9, 75) = 0.316747E+01 + PKER_SWETH( 9, 76) = 0.316906E+01 + PKER_SWETH( 9, 77) = 0.317056E+01 + PKER_SWETH( 9, 78) = 0.317196E+01 + PKER_SWETH( 9, 79) = 0.317328E+01 + PKER_SWETH( 9, 80) = 0.317452E+01 + PKER_SWETH( 10, 1) = 0.911913E+00 + PKER_SWETH( 10, 2) = 0.763036E+00 + PKER_SWETH( 10, 3) = 0.645536E+00 + PKER_SWETH( 10, 4) = 0.561056E+00 + PKER_SWETH( 10, 5) = 0.510613E+00 + PKER_SWETH( 10, 6) = 0.492913E+00 + PKER_SWETH( 10, 7) = 0.504602E+00 + PKER_SWETH( 10, 8) = 0.541947E+00 + PKER_SWETH( 10, 9) = 0.599761E+00 + PKER_SWETH( 10, 10) = 0.673026E+00 + PKER_SWETH( 10, 11) = 0.756871E+00 + PKER_SWETH( 10, 12) = 0.847450E+00 + PKER_SWETH( 10, 13) = 0.941685E+00 + PKER_SWETH( 10, 14) = 0.103741E+01 + PKER_SWETH( 10, 15) = 0.113330E+01 + PKER_SWETH( 10, 16) = 0.122855E+01 + PKER_SWETH( 10, 17) = 0.132276E+01 + PKER_SWETH( 10, 18) = 0.141568E+01 + PKER_SWETH( 10, 19) = 0.150707E+01 + PKER_SWETH( 10, 20) = 0.159652E+01 + PKER_SWETH( 10, 21) = 0.168345E+01 + PKER_SWETH( 10, 22) = 0.176708E+01 + PKER_SWETH( 10, 23) = 0.184656E+01 + PKER_SWETH( 10, 24) = 0.192110E+01 + PKER_SWETH( 10, 25) = 0.199011E+01 + PKER_SWETH( 10, 26) = 0.205330E+01 + PKER_SWETH( 10, 27) = 0.211065E+01 + PKER_SWETH( 10, 28) = 0.216238E+01 + PKER_SWETH( 10, 29) = 0.220889E+01 + PKER_SWETH( 10, 30) = 0.225067E+01 + PKER_SWETH( 10, 31) = 0.228824E+01 + PKER_SWETH( 10, 32) = 0.232210E+01 + PKER_SWETH( 10, 33) = 0.235272E+01 + PKER_SWETH( 10, 34) = 0.238050E+01 + PKER_SWETH( 10, 35) = 0.240580E+01 + PKER_SWETH( 10, 36) = 0.242893E+01 + PKER_SWETH( 10, 37) = 0.245014E+01 + PKER_SWETH( 10, 38) = 0.246966E+01 + PKER_SWETH( 10, 39) = 0.248768E+01 + PKER_SWETH( 10, 40) = 0.250434E+01 + PKER_SWETH( 10, 41) = 0.251979E+01 + PKER_SWETH( 10, 42) = 0.253415E+01 + PKER_SWETH( 10, 43) = 0.254750E+01 + PKER_SWETH( 10, 44) = 0.255994E+01 + PKER_SWETH( 10, 45) = 0.257155E+01 + PKER_SWETH( 10, 46) = 0.258239E+01 + PKER_SWETH( 10, 47) = 0.259252E+01 + PKER_SWETH( 10, 48) = 0.260200E+01 + PKER_SWETH( 10, 49) = 0.261087E+01 + PKER_SWETH( 10, 50) = 0.261917E+01 + PKER_SWETH( 10, 51) = 0.262696E+01 + PKER_SWETH( 10, 52) = 0.263425E+01 + PKER_SWETH( 10, 53) = 0.264108E+01 + PKER_SWETH( 10, 54) = 0.264749E+01 + PKER_SWETH( 10, 55) = 0.265350E+01 + PKER_SWETH( 10, 56) = 0.265914E+01 + PKER_SWETH( 10, 57) = 0.266443E+01 + PKER_SWETH( 10, 58) = 0.266940E+01 + PKER_SWETH( 10, 59) = 0.267406E+01 + PKER_SWETH( 10, 60) = 0.267843E+01 + PKER_SWETH( 10, 61) = 0.268253E+01 + PKER_SWETH( 10, 62) = 0.268639E+01 + PKER_SWETH( 10, 63) = 0.269000E+01 + PKER_SWETH( 10, 64) = 0.269340E+01 + PKER_SWETH( 10, 65) = 0.269659E+01 + PKER_SWETH( 10, 66) = 0.269958E+01 + PKER_SWETH( 10, 67) = 0.270239E+01 + PKER_SWETH( 10, 68) = 0.270502E+01 + PKER_SWETH( 10, 69) = 0.270750E+01 + PKER_SWETH( 10, 70) = 0.270983E+01 + PKER_SWETH( 10, 71) = 0.271201E+01 + PKER_SWETH( 10, 72) = 0.271406E+01 + PKER_SWETH( 10, 73) = 0.271598E+01 + PKER_SWETH( 10, 74) = 0.271779E+01 + PKER_SWETH( 10, 75) = 0.271949E+01 + PKER_SWETH( 10, 76) = 0.272108E+01 + PKER_SWETH( 10, 77) = 0.272257E+01 + PKER_SWETH( 10, 78) = 0.272398E+01 + PKER_SWETH( 10, 79) = 0.272530E+01 + PKER_SWETH( 10, 80) = 0.272654E+01 + PKER_SWETH( 11, 1) = 0.118545E+01 + PKER_SWETH( 11, 2) = 0.100295E+01 + PKER_SWETH( 11, 3) = 0.841340E+00 + PKER_SWETH( 11, 4) = 0.703241E+00 + PKER_SWETH( 11, 5) = 0.591315E+00 + PKER_SWETH( 11, 6) = 0.507481E+00 + PKER_SWETH( 11, 7) = 0.452983E+00 + PKER_SWETH( 11, 8) = 0.427344E+00 + PKER_SWETH( 11, 9) = 0.428797E+00 + PKER_SWETH( 11, 10) = 0.453908E+00 + PKER_SWETH( 11, 11) = 0.498674E+00 + PKER_SWETH( 11, 12) = 0.558774E+00 + PKER_SWETH( 11, 13) = 0.629851E+00 + PKER_SWETH( 11, 14) = 0.708336E+00 + PKER_SWETH( 11, 15) = 0.791265E+00 + PKER_SWETH( 11, 16) = 0.876433E+00 + PKER_SWETH( 11, 17) = 0.962409E+00 + PKER_SWETH( 11, 18) = 0.104825E+01 + PKER_SWETH( 11, 19) = 0.113333E+01 + PKER_SWETH( 11, 20) = 0.121716E+01 + PKER_SWETH( 11, 21) = 0.129924E+01 + PKER_SWETH( 11, 22) = 0.137896E+01 + PKER_SWETH( 11, 23) = 0.145558E+01 + PKER_SWETH( 11, 24) = 0.152835E+01 + PKER_SWETH( 11, 25) = 0.159658E+01 + PKER_SWETH( 11, 26) = 0.165976E+01 + PKER_SWETH( 11, 27) = 0.171764E+01 + PKER_SWETH( 11, 28) = 0.177021E+01 + PKER_SWETH( 11, 29) = 0.181769E+01 + PKER_SWETH( 11, 30) = 0.186044E+01 + PKER_SWETH( 11, 31) = 0.189891E+01 + PKER_SWETH( 11, 32) = 0.193356E+01 + PKER_SWETH( 11, 33) = 0.196485E+01 + PKER_SWETH( 11, 34) = 0.199318E+01 + PKER_SWETH( 11, 35) = 0.201894E+01 + PKER_SWETH( 11, 36) = 0.204243E+01 + PKER_SWETH( 11, 37) = 0.206393E+01 + PKER_SWETH( 11, 38) = 0.208369E+01 + PKER_SWETH( 11, 39) = 0.210188E+01 + PKER_SWETH( 11, 40) = 0.211869E+01 + PKER_SWETH( 11, 41) = 0.213425E+01 + PKER_SWETH( 11, 42) = 0.214869E+01 + PKER_SWETH( 11, 43) = 0.216211E+01 + PKER_SWETH( 11, 44) = 0.217461E+01 + PKER_SWETH( 11, 45) = 0.218626E+01 + PKER_SWETH( 11, 46) = 0.219713E+01 + PKER_SWETH( 11, 47) = 0.220729E+01 + PKER_SWETH( 11, 48) = 0.221679E+01 + PKER_SWETH( 11, 49) = 0.222567E+01 + PKER_SWETH( 11, 50) = 0.223399E+01 + PKER_SWETH( 11, 51) = 0.224178E+01 + PKER_SWETH( 11, 52) = 0.224908E+01 + PKER_SWETH( 11, 53) = 0.225592E+01 + PKER_SWETH( 11, 54) = 0.226233E+01 + PKER_SWETH( 11, 55) = 0.226835E+01 + PKER_SWETH( 11, 56) = 0.227399E+01 + PKER_SWETH( 11, 57) = 0.227928E+01 + PKER_SWETH( 11, 58) = 0.228425E+01 + PKER_SWETH( 11, 59) = 0.228891E+01 + PKER_SWETH( 11, 60) = 0.229329E+01 + PKER_SWETH( 11, 61) = 0.229739E+01 + PKER_SWETH( 11, 62) = 0.230124E+01 + PKER_SWETH( 11, 63) = 0.230486E+01 + PKER_SWETH( 11, 64) = 0.230826E+01 + PKER_SWETH( 11, 65) = 0.231144E+01 + PKER_SWETH( 11, 66) = 0.231444E+01 + PKER_SWETH( 11, 67) = 0.231724E+01 + PKER_SWETH( 11, 68) = 0.231988E+01 + PKER_SWETH( 11, 69) = 0.232236E+01 + PKER_SWETH( 11, 70) = 0.232468E+01 + PKER_SWETH( 11, 71) = 0.232687E+01 + PKER_SWETH( 11, 72) = 0.232892E+01 + PKER_SWETH( 11, 73) = 0.233084E+01 + PKER_SWETH( 11, 74) = 0.233265E+01 + PKER_SWETH( 11, 75) = 0.233434E+01 + PKER_SWETH( 11, 76) = 0.233594E+01 + PKER_SWETH( 11, 77) = 0.233743E+01 + PKER_SWETH( 11, 78) = 0.233884E+01 + PKER_SWETH( 11, 79) = 0.234016E+01 + PKER_SWETH( 11, 80) = 0.234140E+01 + PKER_SWETH( 12, 1) = 0.145894E+01 + PKER_SWETH( 12, 2) = 0.126502E+01 + PKER_SWETH( 12, 3) = 0.108573E+01 + PKER_SWETH( 12, 4) = 0.922022E+00 + PKER_SWETH( 12, 5) = 0.775551E+00 + PKER_SWETH( 12, 6) = 0.648490E+00 + PKER_SWETH( 12, 7) = 0.543095E+00 + PKER_SWETH( 12, 8) = 0.461483E+00 + PKER_SWETH( 12, 9) = 0.405081E+00 + PKER_SWETH( 12, 10) = 0.373938E+00 + PKER_SWETH( 12, 11) = 0.367149E+00 + PKER_SWETH( 12, 12) = 0.382311E+00 + PKER_SWETH( 12, 13) = 0.416306E+00 + PKER_SWETH( 12, 14) = 0.465232E+00 + PKER_SWETH( 12, 15) = 0.525344E+00 + PKER_SWETH( 12, 16) = 0.593373E+00 + PKER_SWETH( 12, 17) = 0.666351E+00 + PKER_SWETH( 12, 18) = 0.742209E+00 + PKER_SWETH( 12, 19) = 0.819328E+00 + PKER_SWETH( 12, 20) = 0.896597E+00 + PKER_SWETH( 12, 21) = 0.973187E+00 + PKER_SWETH( 12, 22) = 0.104838E+01 + PKER_SWETH( 12, 23) = 0.112146E+01 + PKER_SWETH( 12, 24) = 0.119172E+01 + PKER_SWETH( 12, 25) = 0.125842E+01 + PKER_SWETH( 12, 26) = 0.132096E+01 + PKER_SWETH( 12, 27) = 0.137888E+01 + PKER_SWETH( 12, 28) = 0.143197E+01 + PKER_SWETH( 12, 29) = 0.148024E+01 + PKER_SWETH( 12, 30) = 0.152388E+01 + PKER_SWETH( 12, 31) = 0.156323E+01 + PKER_SWETH( 12, 32) = 0.159870E+01 + PKER_SWETH( 12, 33) = 0.163070E+01 + PKER_SWETH( 12, 34) = 0.165963E+01 + PKER_SWETH( 12, 35) = 0.168589E+01 + PKER_SWETH( 12, 36) = 0.170978E+01 + PKER_SWETH( 12, 37) = 0.173161E+01 + PKER_SWETH( 12, 38) = 0.175162E+01 + PKER_SWETH( 12, 39) = 0.177002E+01 + PKER_SWETH( 12, 40) = 0.178699E+01 + PKER_SWETH( 12, 41) = 0.180268E+01 + PKER_SWETH( 12, 42) = 0.181722E+01 + PKER_SWETH( 12, 43) = 0.183072E+01 + PKER_SWETH( 12, 44) = 0.184328E+01 + PKER_SWETH( 12, 45) = 0.185498E+01 + PKER_SWETH( 12, 46) = 0.186588E+01 + PKER_SWETH( 12, 47) = 0.187607E+01 + PKER_SWETH( 12, 48) = 0.188559E+01 + PKER_SWETH( 12, 49) = 0.189449E+01 + PKER_SWETH( 12, 50) = 0.190282E+01 + PKER_SWETH( 12, 51) = 0.191063E+01 + PKER_SWETH( 12, 52) = 0.191793E+01 + PKER_SWETH( 12, 53) = 0.192478E+01 + PKER_SWETH( 12, 54) = 0.193120E+01 + PKER_SWETH( 12, 55) = 0.193722E+01 + PKER_SWETH( 12, 56) = 0.194286E+01 + PKER_SWETH( 12, 57) = 0.194816E+01 + PKER_SWETH( 12, 58) = 0.195313E+01 + PKER_SWETH( 12, 59) = 0.195779E+01 + PKER_SWETH( 12, 60) = 0.196217E+01 + PKER_SWETH( 12, 61) = 0.196627E+01 + PKER_SWETH( 12, 62) = 0.197013E+01 + PKER_SWETH( 12, 63) = 0.197374E+01 + PKER_SWETH( 12, 64) = 0.197714E+01 + PKER_SWETH( 12, 65) = 0.198033E+01 + PKER_SWETH( 12, 66) = 0.198332E+01 + PKER_SWETH( 12, 67) = 0.198613E+01 + PKER_SWETH( 12, 68) = 0.198877E+01 + PKER_SWETH( 12, 69) = 0.199124E+01 + PKER_SWETH( 12, 70) = 0.199357E+01 + PKER_SWETH( 12, 71) = 0.199575E+01 + PKER_SWETH( 12, 72) = 0.199780E+01 + PKER_SWETH( 12, 73) = 0.199973E+01 + PKER_SWETH( 12, 74) = 0.200153E+01 + PKER_SWETH( 12, 75) = 0.200323E+01 + PKER_SWETH( 12, 76) = 0.200482E+01 + PKER_SWETH( 12, 77) = 0.200632E+01 + PKER_SWETH( 12, 78) = 0.200772E+01 + PKER_SWETH( 12, 79) = 0.200904E+01 + PKER_SWETH( 12, 80) = 0.201028E+01 + PKER_SWETH( 13, 1) = 0.170405E+01 + PKER_SWETH( 13, 2) = 0.150769E+01 + PKER_SWETH( 13, 3) = 0.132375E+01 + PKER_SWETH( 13, 4) = 0.115199E+01 + PKER_SWETH( 13, 5) = 0.992573E+00 + PKER_SWETH( 13, 6) = 0.846175E+00 + PKER_SWETH( 13, 7) = 0.713998E+00 + PKER_SWETH( 13, 8) = 0.597806E+00 + PKER_SWETH( 13, 9) = 0.499584E+00 + PKER_SWETH( 13, 10) = 0.421275E+00 + PKER_SWETH( 13, 11) = 0.364551E+00 + PKER_SWETH( 13, 12) = 0.329932E+00 + PKER_SWETH( 13, 13) = 0.316966E+00 + PKER_SWETH( 13, 14) = 0.324306E+00 + PKER_SWETH( 13, 15) = 0.349233E+00 + PKER_SWETH( 13, 16) = 0.388790E+00 + PKER_SWETH( 13, 17) = 0.439524E+00 + PKER_SWETH( 13, 18) = 0.498464E+00 + PKER_SWETH( 13, 19) = 0.562783E+00 + PKER_SWETH( 13, 20) = 0.630325E+00 + PKER_SWETH( 13, 21) = 0.699430E+00 + PKER_SWETH( 13, 22) = 0.768779E+00 + PKER_SWETH( 13, 23) = 0.837340E+00 + PKER_SWETH( 13, 24) = 0.904222E+00 + PKER_SWETH( 13, 25) = 0.968619E+00 + PKER_SWETH( 13, 26) = 0.102980E+01 + PKER_SWETH( 13, 27) = 0.108719E+01 + PKER_SWETH( 13, 28) = 0.114036E+01 + PKER_SWETH( 13, 29) = 0.118912E+01 + PKER_SWETH( 13, 30) = 0.123349E+01 + PKER_SWETH( 13, 31) = 0.127366E+01 + PKER_SWETH( 13, 32) = 0.130993E+01 + PKER_SWETH( 13, 33) = 0.134267E+01 + PKER_SWETH( 13, 34) = 0.137225E+01 + PKER_SWETH( 13, 35) = 0.139905E+01 + PKER_SWETH( 13, 36) = 0.142339E+01 + PKER_SWETH( 13, 37) = 0.144558E+01 + PKER_SWETH( 13, 38) = 0.146588E+01 + PKER_SWETH( 13, 39) = 0.148451E+01 + PKER_SWETH( 13, 40) = 0.150167E+01 + PKER_SWETH( 13, 41) = 0.151750E+01 + PKER_SWETH( 13, 42) = 0.153215E+01 + PKER_SWETH( 13, 43) = 0.154574E+01 + PKER_SWETH( 13, 44) = 0.155836E+01 + PKER_SWETH( 13, 45) = 0.157012E+01 + PKER_SWETH( 13, 46) = 0.158107E+01 + PKER_SWETH( 13, 47) = 0.159129E+01 + PKER_SWETH( 13, 48) = 0.160083E+01 + PKER_SWETH( 13, 49) = 0.160975E+01 + PKER_SWETH( 13, 50) = 0.161810E+01 + PKER_SWETH( 13, 51) = 0.162591E+01 + PKER_SWETH( 13, 52) = 0.163323E+01 + PKER_SWETH( 13, 53) = 0.164009E+01 + PKER_SWETH( 13, 54) = 0.164651E+01 + PKER_SWETH( 13, 55) = 0.165254E+01 + PKER_SWETH( 13, 56) = 0.165818E+01 + PKER_SWETH( 13, 57) = 0.166348E+01 + PKER_SWETH( 13, 58) = 0.166845E+01 + PKER_SWETH( 13, 59) = 0.167312E+01 + PKER_SWETH( 13, 60) = 0.167749E+01 + PKER_SWETH( 13, 61) = 0.168160E+01 + PKER_SWETH( 13, 62) = 0.168546E+01 + PKER_SWETH( 13, 63) = 0.168907E+01 + PKER_SWETH( 13, 64) = 0.169247E+01 + PKER_SWETH( 13, 65) = 0.169566E+01 + PKER_SWETH( 13, 66) = 0.169865E+01 + PKER_SWETH( 13, 67) = 0.170146E+01 + PKER_SWETH( 13, 68) = 0.170410E+01 + PKER_SWETH( 13, 69) = 0.170658E+01 + PKER_SWETH( 13, 70) = 0.170890E+01 + PKER_SWETH( 13, 71) = 0.171108E+01 + PKER_SWETH( 13, 72) = 0.171313E+01 + PKER_SWETH( 13, 73) = 0.171506E+01 + PKER_SWETH( 13, 74) = 0.171687E+01 + PKER_SWETH( 13, 75) = 0.171856E+01 + PKER_SWETH( 13, 76) = 0.172016E+01 + PKER_SWETH( 13, 77) = 0.172165E+01 + PKER_SWETH( 13, 78) = 0.172306E+01 + PKER_SWETH( 13, 79) = 0.172437E+01 + PKER_SWETH( 13, 80) = 0.172561E+01 + PKER_SWETH( 14, 1) = 0.191644E+01 + PKER_SWETH( 14, 2) = 0.171981E+01 + PKER_SWETH( 14, 3) = 0.153516E+01 + PKER_SWETH( 14, 4) = 0.136183E+01 + PKER_SWETH( 14, 5) = 0.119931E+01 + PKER_SWETH( 14, 6) = 0.104729E+01 + PKER_SWETH( 14, 7) = 0.905766E+00 + PKER_SWETH( 14, 8) = 0.775129E+00 + PKER_SWETH( 14, 9) = 0.656292E+00 + PKER_SWETH( 14, 10) = 0.550615E+00 + PKER_SWETH( 14, 11) = 0.459778E+00 + PKER_SWETH( 14, 12) = 0.385647E+00 + PKER_SWETH( 14, 13) = 0.329785E+00 + PKER_SWETH( 14, 14) = 0.293160E+00 + PKER_SWETH( 14, 15) = 0.275937E+00 + PKER_SWETH( 14, 16) = 0.276977E+00 + PKER_SWETH( 14, 17) = 0.294714E+00 + PKER_SWETH( 14, 18) = 0.326332E+00 + PKER_SWETH( 14, 19) = 0.369117E+00 + PKER_SWETH( 14, 20) = 0.420187E+00 + PKER_SWETH( 14, 21) = 0.476869E+00 + PKER_SWETH( 14, 22) = 0.536997E+00 + PKER_SWETH( 14, 23) = 0.598735E+00 + PKER_SWETH( 14, 24) = 0.660650E+00 + PKER_SWETH( 14, 25) = 0.721544E+00 + PKER_SWETH( 14, 26) = 0.780441E+00 + PKER_SWETH( 14, 27) = 0.836536E+00 + PKER_SWETH( 14, 28) = 0.889213E+00 + PKER_SWETH( 14, 29) = 0.938066E+00 + PKER_SWETH( 14, 30) = 0.982909E+00 + PKER_SWETH( 14, 31) = 0.102375E+01 + PKER_SWETH( 14, 32) = 0.106077E+01 + PKER_SWETH( 14, 33) = 0.109424E+01 + PKER_SWETH( 14, 34) = 0.112450E+01 + PKER_SWETH( 14, 35) = 0.115187E+01 + PKER_SWETH( 14, 36) = 0.117671E+01 + PKER_SWETH( 14, 37) = 0.119930E+01 + PKER_SWETH( 14, 38) = 0.121993E+01 + PKER_SWETH( 14, 39) = 0.123882E+01 + PKER_SWETH( 14, 40) = 0.125618E+01 + PKER_SWETH( 14, 41) = 0.127218E+01 + PKER_SWETH( 14, 42) = 0.128696E+01 + PKER_SWETH( 14, 43) = 0.130065E+01 + PKER_SWETH( 14, 44) = 0.131335E+01 + PKER_SWETH( 14, 45) = 0.132516E+01 + PKER_SWETH( 14, 46) = 0.133616E+01 + PKER_SWETH( 14, 47) = 0.134642E+01 + PKER_SWETH( 14, 48) = 0.135599E+01 + PKER_SWETH( 14, 49) = 0.136494E+01 + PKER_SWETH( 14, 50) = 0.137330E+01 + PKER_SWETH( 14, 51) = 0.138113E+01 + PKER_SWETH( 14, 52) = 0.138846E+01 + PKER_SWETH( 14, 53) = 0.139532E+01 + PKER_SWETH( 14, 54) = 0.140175E+01 + PKER_SWETH( 14, 55) = 0.140778E+01 + PKER_SWETH( 14, 56) = 0.141343E+01 + PKER_SWETH( 14, 57) = 0.141874E+01 + PKER_SWETH( 14, 58) = 0.142371E+01 + PKER_SWETH( 14, 59) = 0.142837E+01 + PKER_SWETH( 14, 60) = 0.143275E+01 + PKER_SWETH( 14, 61) = 0.143686E+01 + PKER_SWETH( 14, 62) = 0.144072E+01 + PKER_SWETH( 14, 63) = 0.144434E+01 + PKER_SWETH( 14, 64) = 0.144773E+01 + PKER_SWETH( 14, 65) = 0.145092E+01 + PKER_SWETH( 14, 66) = 0.145391E+01 + PKER_SWETH( 14, 67) = 0.145672E+01 + PKER_SWETH( 14, 68) = 0.145936E+01 + PKER_SWETH( 14, 69) = 0.146184E+01 + PKER_SWETH( 14, 70) = 0.146416E+01 + PKER_SWETH( 14, 71) = 0.146635E+01 + PKER_SWETH( 14, 72) = 0.146840E+01 + PKER_SWETH( 14, 73) = 0.147032E+01 + PKER_SWETH( 14, 74) = 0.147213E+01 + PKER_SWETH( 14, 75) = 0.147383E+01 + PKER_SWETH( 14, 76) = 0.147542E+01 + PKER_SWETH( 14, 77) = 0.147692E+01 + PKER_SWETH( 14, 78) = 0.147832E+01 + PKER_SWETH( 14, 79) = 0.147964E+01 + PKER_SWETH( 14, 80) = 0.148088E+01 + PKER_SWETH( 15, 1) = 0.209919E+01 + PKER_SWETH( 15, 2) = 0.190259E+01 + PKER_SWETH( 15, 3) = 0.171794E+01 + PKER_SWETH( 15, 4) = 0.154449E+01 + PKER_SWETH( 15, 5) = 0.138158E+01 + PKER_SWETH( 15, 6) = 0.122859E+01 + PKER_SWETH( 15, 7) = 0.108503E+01 + PKER_SWETH( 15, 8) = 0.950547E+00 + PKER_SWETH( 15, 9) = 0.825033E+00 + PKER_SWETH( 15, 10) = 0.708693E+00 + PKER_SWETH( 15, 11) = 0.602154E+00 + PKER_SWETH( 15, 12) = 0.506482E+00 + PKER_SWETH( 15, 13) = 0.423037E+00 + PKER_SWETH( 15, 14) = 0.353533E+00 + PKER_SWETH( 15, 15) = 0.299551E+00 + PKER_SWETH( 15, 16) = 0.262102E+00 + PKER_SWETH( 15, 17) = 0.241884E+00 + PKER_SWETH( 15, 18) = 0.238413E+00 + PKER_SWETH( 15, 19) = 0.250171E+00 + PKER_SWETH( 15, 20) = 0.275347E+00 + PKER_SWETH( 15, 21) = 0.311363E+00 + PKER_SWETH( 15, 22) = 0.355624E+00 + PKER_SWETH( 15, 23) = 0.405543E+00 + PKER_SWETH( 15, 24) = 0.458917E+00 + PKER_SWETH( 15, 25) = 0.513821E+00 + PKER_SWETH( 15, 26) = 0.568682E+00 + PKER_SWETH( 15, 27) = 0.622251E+00 + PKER_SWETH( 15, 28) = 0.673551E+00 + PKER_SWETH( 15, 29) = 0.721876E+00 + PKER_SWETH( 15, 30) = 0.766778E+00 + PKER_SWETH( 15, 31) = 0.808050E+00 + PKER_SWETH( 15, 32) = 0.845689E+00 + PKER_SWETH( 15, 33) = 0.879844E+00 + PKER_SWETH( 15, 34) = 0.910766E+00 + PKER_SWETH( 15, 35) = 0.938752E+00 + PKER_SWETH( 15, 36) = 0.964114E+00 + PKER_SWETH( 15, 37) = 0.987153E+00 + PKER_SWETH( 15, 38) = 0.100814E+01 + PKER_SWETH( 15, 39) = 0.102733E+01 + PKER_SWETH( 15, 40) = 0.104492E+01 + PKER_SWETH( 15, 41) = 0.106110E+01 + PKER_SWETH( 15, 42) = 0.107603E+01 + PKER_SWETH( 15, 43) = 0.108984E+01 + PKER_SWETH( 15, 44) = 0.110263E+01 + PKER_SWETH( 15, 45) = 0.111451E+01 + PKER_SWETH( 15, 46) = 0.112557E+01 + PKER_SWETH( 15, 47) = 0.113587E+01 + PKER_SWETH( 15, 48) = 0.114547E+01 + PKER_SWETH( 15, 49) = 0.115444E+01 + PKER_SWETH( 15, 50) = 0.116283E+01 + PKER_SWETH( 15, 51) = 0.117067E+01 + PKER_SWETH( 15, 52) = 0.117801E+01 + PKER_SWETH( 15, 53) = 0.118488E+01 + PKER_SWETH( 15, 54) = 0.119132E+01 + PKER_SWETH( 15, 55) = 0.119736E+01 + PKER_SWETH( 15, 56) = 0.120301E+01 + PKER_SWETH( 15, 57) = 0.120832E+01 + PKER_SWETH( 15, 58) = 0.121329E+01 + PKER_SWETH( 15, 59) = 0.121796E+01 + PKER_SWETH( 15, 60) = 0.122234E+01 + PKER_SWETH( 15, 61) = 0.122645E+01 + PKER_SWETH( 15, 62) = 0.123031E+01 + PKER_SWETH( 15, 63) = 0.123393E+01 + PKER_SWETH( 15, 64) = 0.123732E+01 + PKER_SWETH( 15, 65) = 0.124051E+01 + PKER_SWETH( 15, 66) = 0.124351E+01 + PKER_SWETH( 15, 67) = 0.124632E+01 + PKER_SWETH( 15, 68) = 0.124896E+01 + PKER_SWETH( 15, 69) = 0.125143E+01 + PKER_SWETH( 15, 70) = 0.125376E+01 + PKER_SWETH( 15, 71) = 0.125594E+01 + PKER_SWETH( 15, 72) = 0.125799E+01 + PKER_SWETH( 15, 73) = 0.125992E+01 + PKER_SWETH( 15, 74) = 0.126172E+01 + PKER_SWETH( 15, 75) = 0.126342E+01 + PKER_SWETH( 15, 76) = 0.126501E+01 + PKER_SWETH( 15, 77) = 0.126651E+01 + PKER_SWETH( 15, 78) = 0.126792E+01 + PKER_SWETH( 15, 79) = 0.126923E+01 + PKER_SWETH( 15, 80) = 0.127047E+01 + PKER_SWETH( 16, 1) = 0.225627E+01 + PKER_SWETH( 16, 2) = 0.205974E+01 + PKER_SWETH( 16, 3) = 0.187515E+01 + PKER_SWETH( 16, 4) = 0.170176E+01 + PKER_SWETH( 16, 5) = 0.153889E+01 + PKER_SWETH( 16, 6) = 0.138588E+01 + PKER_SWETH( 16, 7) = 0.124213E+01 + PKER_SWETH( 16, 8) = 0.110710E+01 + PKER_SWETH( 16, 9) = 0.980292E+00 + PKER_SWETH( 16, 10) = 0.861366E+00 + PKER_SWETH( 16, 11) = 0.750132E+00 + PKER_SWETH( 16, 12) = 0.646663E+00 + PKER_SWETH( 16, 13) = 0.551374E+00 + PKER_SWETH( 16, 14) = 0.465058E+00 + PKER_SWETH( 16, 15) = 0.388869E+00 + PKER_SWETH( 16, 16) = 0.324265E+00 + PKER_SWETH( 16, 17) = 0.272776E+00 + PKER_SWETH( 16, 18) = 0.235577E+00 + PKER_SWETH( 16, 19) = 0.213511E+00 + PKER_SWETH( 16, 20) = 0.206520E+00 + PKER_SWETH( 16, 21) = 0.213797E+00 + PKER_SWETH( 16, 22) = 0.233640E+00 + PKER_SWETH( 16, 23) = 0.263928E+00 + PKER_SWETH( 16, 24) = 0.302257E+00 + PKER_SWETH( 16, 25) = 0.346122E+00 + PKER_SWETH( 16, 26) = 0.393290E+00 + PKER_SWETH( 16, 27) = 0.441774E+00 + PKER_SWETH( 16, 28) = 0.489947E+00 + PKER_SWETH( 16, 29) = 0.536578E+00 + PKER_SWETH( 16, 30) = 0.580787E+00 + PKER_SWETH( 16, 31) = 0.622021E+00 + PKER_SWETH( 16, 32) = 0.660014E+00 + PKER_SWETH( 16, 33) = 0.694722E+00 + PKER_SWETH( 16, 34) = 0.726265E+00 + PKER_SWETH( 16, 35) = 0.754860E+00 + PKER_SWETH( 16, 36) = 0.780775E+00 + PKER_SWETH( 16, 37) = 0.804293E+00 + PKER_SWETH( 16, 38) = 0.825685E+00 + PKER_SWETH( 16, 39) = 0.845200E+00 + PKER_SWETH( 16, 40) = 0.863058E+00 + PKER_SWETH( 16, 41) = 0.879451E+00 + PKER_SWETH( 16, 42) = 0.894545E+00 + PKER_SWETH( 16, 43) = 0.908480E+00 + PKER_SWETH( 16, 44) = 0.921377E+00 + PKER_SWETH( 16, 45) = 0.933340E+00 + PKER_SWETH( 16, 46) = 0.944457E+00 + PKER_SWETH( 16, 47) = 0.954804E+00 + PKER_SWETH( 16, 48) = 0.964449E+00 + PKER_SWETH( 16, 49) = 0.973449E+00 + PKER_SWETH( 16, 50) = 0.981857E+00 + PKER_SWETH( 16, 51) = 0.989717E+00 + PKER_SWETH( 16, 52) = 0.997071E+00 + PKER_SWETH( 16, 53) = 0.100395E+01 + PKER_SWETH( 16, 54) = 0.101040E+01 + PKER_SWETH( 16, 55) = 0.101644E+01 + PKER_SWETH( 16, 56) = 0.102211E+01 + PKER_SWETH( 16, 57) = 0.102741E+01 + PKER_SWETH( 16, 58) = 0.103239E+01 + PKER_SWETH( 16, 59) = 0.103706E+01 + PKER_SWETH( 16, 60) = 0.104144E+01 + PKER_SWETH( 16, 61) = 0.104556E+01 + PKER_SWETH( 16, 62) = 0.104941E+01 + PKER_SWETH( 16, 63) = 0.105303E+01 + PKER_SWETH( 16, 64) = 0.105643E+01 + PKER_SWETH( 16, 65) = 0.105962E+01 + PKER_SWETH( 16, 66) = 0.106262E+01 + PKER_SWETH( 16, 67) = 0.106543E+01 + PKER_SWETH( 16, 68) = 0.106807E+01 + PKER_SWETH( 16, 69) = 0.107054E+01 + PKER_SWETH( 16, 70) = 0.107287E+01 + PKER_SWETH( 16, 71) = 0.107505E+01 + PKER_SWETH( 16, 72) = 0.107710E+01 + PKER_SWETH( 16, 73) = 0.107903E+01 + PKER_SWETH( 16, 74) = 0.108083E+01 + PKER_SWETH( 16, 75) = 0.108253E+01 + PKER_SWETH( 16, 76) = 0.108412E+01 + PKER_SWETH( 16, 77) = 0.108562E+01 + PKER_SWETH( 16, 78) = 0.108703E+01 + PKER_SWETH( 16, 79) = 0.108834E+01 + PKER_SWETH( 16, 80) = 0.108958E+01 + PKER_SWETH( 17, 1) = 0.239130E+01 + PKER_SWETH( 17, 2) = 0.219480E+01 + PKER_SWETH( 17, 3) = 0.201026E+01 + PKER_SWETH( 17, 4) = 0.183694E+01 + PKER_SWETH( 17, 5) = 0.167414E+01 + PKER_SWETH( 17, 6) = 0.152122E+01 + PKER_SWETH( 17, 7) = 0.137754E+01 + PKER_SWETH( 17, 8) = 0.124255E+01 + PKER_SWETH( 17, 9) = 0.111570E+01 + PKER_SWETH( 17, 10) = 0.996495E+00 + PKER_SWETH( 17, 11) = 0.884490E+00 + PKER_SWETH( 17, 12) = 0.779332E+00 + PKER_SWETH( 17, 13) = 0.680798E+00 + PKER_SWETH( 17, 14) = 0.588860E+00 + PKER_SWETH( 17, 15) = 0.503782E+00 + PKER_SWETH( 17, 16) = 0.426137E+00 + PKER_SWETH( 17, 17) = 0.356873E+00 + PKER_SWETH( 17, 18) = 0.297270E+00 + PKER_SWETH( 17, 19) = 0.248688E+00 + PKER_SWETH( 17, 20) = 0.212450E+00 + PKER_SWETH( 17, 21) = 0.189516E+00 + PKER_SWETH( 17, 22) = 0.180089E+00 + PKER_SWETH( 17, 23) = 0.183781E+00 + PKER_SWETH( 17, 24) = 0.199287E+00 + PKER_SWETH( 17, 25) = 0.224789E+00 + PKER_SWETH( 17, 26) = 0.257938E+00 + PKER_SWETH( 17, 27) = 0.296342E+00 + PKER_SWETH( 17, 28) = 0.337770E+00 + PKER_SWETH( 17, 29) = 0.380196E+00 + PKER_SWETH( 17, 30) = 0.422074E+00 + PKER_SWETH( 17, 31) = 0.462252E+00 + PKER_SWETH( 17, 32) = 0.499999E+00 + PKER_SWETH( 17, 33) = 0.534934E+00 + PKER_SWETH( 17, 34) = 0.566940E+00 + PKER_SWETH( 17, 35) = 0.596084E+00 + PKER_SWETH( 17, 36) = 0.622549E+00 + PKER_SWETH( 17, 37) = 0.646567E+00 + PKER_SWETH( 17, 38) = 0.668394E+00 + PKER_SWETH( 17, 39) = 0.688272E+00 + PKER_SWETH( 17, 40) = 0.706427E+00 + PKER_SWETH( 17, 41) = 0.723060E+00 + PKER_SWETH( 17, 42) = 0.738344E+00 + PKER_SWETH( 17, 43) = 0.752430E+00 + PKER_SWETH( 17, 44) = 0.765446E+00 + PKER_SWETH( 17, 45) = 0.777501E+00 + PKER_SWETH( 17, 46) = 0.788690E+00 + PKER_SWETH( 17, 47) = 0.799094E+00 + PKER_SWETH( 17, 48) = 0.808782E+00 + PKER_SWETH( 17, 49) = 0.817816E+00 + PKER_SWETH( 17, 50) = 0.826250E+00 + PKER_SWETH( 17, 51) = 0.834130E+00 + PKER_SWETH( 17, 52) = 0.841500E+00 + PKER_SWETH( 17, 53) = 0.848396E+00 + PKER_SWETH( 17, 54) = 0.854853E+00 + PKER_SWETH( 17, 55) = 0.860901E+00 + PKER_SWETH( 17, 56) = 0.866570E+00 + PKER_SWETH( 17, 57) = 0.871883E+00 + PKER_SWETH( 17, 58) = 0.876865E+00 + PKER_SWETH( 17, 59) = 0.881538E+00 + PKER_SWETH( 17, 60) = 0.885922E+00 + PKER_SWETH( 17, 61) = 0.890034E+00 + PKER_SWETH( 17, 62) = 0.893893E+00 + PKER_SWETH( 17, 63) = 0.897515E+00 + PKER_SWETH( 17, 64) = 0.900914E+00 + PKER_SWETH( 17, 65) = 0.904104E+00 + PKER_SWETH( 17, 66) = 0.907099E+00 + PKER_SWETH( 17, 67) = 0.909910E+00 + PKER_SWETH( 17, 68) = 0.912549E+00 + PKER_SWETH( 17, 69) = 0.915026E+00 + PKER_SWETH( 17, 70) = 0.917352E+00 + PKER_SWETH( 17, 71) = 0.919536E+00 + PKER_SWETH( 17, 72) = 0.921586E+00 + PKER_SWETH( 17, 73) = 0.923511E+00 + PKER_SWETH( 17, 74) = 0.925319E+00 + PKER_SWETH( 17, 75) = 0.927015E+00 + PKER_SWETH( 17, 76) = 0.928609E+00 + PKER_SWETH( 17, 77) = 0.930105E+00 + PKER_SWETH( 17, 78) = 0.931509E+00 + PKER_SWETH( 17, 79) = 0.932828E+00 + PKER_SWETH( 17, 80) = 0.934067E+00 + PKER_SWETH( 18, 1) = 0.250736E+01 + PKER_SWETH( 18, 2) = 0.231089E+01 + PKER_SWETH( 18, 3) = 0.212639E+01 + PKER_SWETH( 18, 4) = 0.195312E+01 + PKER_SWETH( 18, 5) = 0.179038E+01 + PKER_SWETH( 18, 6) = 0.163752E+01 + PKER_SWETH( 18, 7) = 0.149393E+01 + PKER_SWETH( 18, 8) = 0.135903E+01 + PKER_SWETH( 18, 9) = 0.123229E+01 + PKER_SWETH( 18, 10) = 0.111318E+01 + PKER_SWETH( 18, 11) = 0.100122E+01 + PKER_SWETH( 18, 12) = 0.895967E+00 + PKER_SWETH( 18, 13) = 0.797018E+00 + PKER_SWETH( 18, 14) = 0.704029E+00 + PKER_SWETH( 18, 15) = 0.616756E+00 + PKER_SWETH( 18, 16) = 0.535113E+00 + PKER_SWETH( 18, 17) = 0.459233E+00 + PKER_SWETH( 18, 18) = 0.389543E+00 + PKER_SWETH( 18, 19) = 0.326796E+00 + PKER_SWETH( 18, 20) = 0.272095E+00 + PKER_SWETH( 18, 21) = 0.226702E+00 + PKER_SWETH( 18, 22) = 0.191896E+00 + PKER_SWETH( 18, 23) = 0.168801E+00 + PKER_SWETH( 18, 24) = 0.157853E+00 + PKER_SWETH( 18, 25) = 0.158846E+00 + PKER_SWETH( 18, 26) = 0.170918E+00 + PKER_SWETH( 18, 27) = 0.192288E+00 + PKER_SWETH( 18, 28) = 0.220881E+00 + PKER_SWETH( 18, 29) = 0.254306E+00 + PKER_SWETH( 18, 30) = 0.290385E+00 + PKER_SWETH( 18, 31) = 0.327168E+00 + PKER_SWETH( 18, 32) = 0.363206E+00 + PKER_SWETH( 18, 33) = 0.397516E+00 + PKER_SWETH( 18, 34) = 0.429526E+00 + PKER_SWETH( 18, 35) = 0.458999E+00 + PKER_SWETH( 18, 36) = 0.485922E+00 + PKER_SWETH( 18, 37) = 0.510423E+00 + PKER_SWETH( 18, 38) = 0.532699E+00 + PKER_SWETH( 18, 39) = 0.552969E+00 + PKER_SWETH( 18, 40) = 0.571453E+00 + PKER_SWETH( 18, 41) = 0.588356E+00 + PKER_SWETH( 18, 42) = 0.603857E+00 + PKER_SWETH( 18, 43) = 0.618115E+00 + PKER_SWETH( 18, 44) = 0.631267E+00 + PKER_SWETH( 18, 45) = 0.643428E+00 + PKER_SWETH( 18, 46) = 0.654700E+00 + PKER_SWETH( 18, 47) = 0.665169E+00 + PKER_SWETH( 18, 48) = 0.674907E+00 + PKER_SWETH( 18, 49) = 0.683980E+00 + PKER_SWETH( 18, 50) = 0.692444E+00 + PKER_SWETH( 18, 51) = 0.700348E+00 + PKER_SWETH( 18, 52) = 0.707736E+00 + PKER_SWETH( 18, 53) = 0.714646E+00 + PKER_SWETH( 18, 54) = 0.721114E+00 + PKER_SWETH( 18, 55) = 0.727171E+00 + PKER_SWETH( 18, 56) = 0.732846E+00 + PKER_SWETH( 18, 57) = 0.738165E+00 + PKER_SWETH( 18, 58) = 0.743151E+00 + PKER_SWETH( 18, 59) = 0.747827E+00 + PKER_SWETH( 18, 60) = 0.752213E+00 + PKER_SWETH( 18, 61) = 0.756327E+00 + PKER_SWETH( 18, 62) = 0.760188E+00 + PKER_SWETH( 18, 63) = 0.763810E+00 + PKER_SWETH( 18, 64) = 0.767210E+00 + PKER_SWETH( 18, 65) = 0.770401E+00 + PKER_SWETH( 18, 66) = 0.773396E+00 + PKER_SWETH( 18, 67) = 0.776208E+00 + PKER_SWETH( 18, 68) = 0.778847E+00 + PKER_SWETH( 18, 69) = 0.781325E+00 + PKER_SWETH( 18, 70) = 0.783651E+00 + PKER_SWETH( 18, 71) = 0.785835E+00 + PKER_SWETH( 18, 72) = 0.787885E+00 + PKER_SWETH( 18, 73) = 0.789810E+00 + PKER_SWETH( 18, 74) = 0.791618E+00 + PKER_SWETH( 18, 75) = 0.793315E+00 + PKER_SWETH( 18, 76) = 0.794908E+00 + PKER_SWETH( 18, 77) = 0.796404E+00 + PKER_SWETH( 18, 78) = 0.797809E+00 + PKER_SWETH( 18, 79) = 0.799128E+00 + PKER_SWETH( 18, 80) = 0.800366E+00 + PKER_SWETH( 19, 1) = 0.260712E+01 + PKER_SWETH( 19, 2) = 0.241068E+01 + PKER_SWETH( 19, 3) = 0.222621E+01 + PKER_SWETH( 19, 4) = 0.205297E+01 + PKER_SWETH( 19, 5) = 0.189027E+01 + PKER_SWETH( 19, 6) = 0.173746E+01 + PKER_SWETH( 19, 7) = 0.159394E+01 + PKER_SWETH( 19, 8) = 0.145912E+01 + PKER_SWETH( 19, 9) = 0.133246E+01 + PKER_SWETH( 19, 10) = 0.121346E+01 + PKER_SWETH( 19, 11) = 0.110163E+01 + PKER_SWETH( 19, 12) = 0.996507E+00 + PKER_SWETH( 19, 13) = 0.897673E+00 + PKER_SWETH( 19, 14) = 0.804722E+00 + PKER_SWETH( 19, 15) = 0.717285E+00 + PKER_SWETH( 19, 16) = 0.635038E+00 + PKER_SWETH( 19, 17) = 0.557733E+00 + PKER_SWETH( 19, 18) = 0.485242E+00 + PKER_SWETH( 19, 19) = 0.417618E+00 + PKER_SWETH( 19, 20) = 0.355152E+00 + PKER_SWETH( 19, 21) = 0.298466E+00 + PKER_SWETH( 19, 22) = 0.248486E+00 + PKER_SWETH( 19, 23) = 0.206362E+00 + PKER_SWETH( 19, 24) = 0.173382E+00 + PKER_SWETH( 19, 25) = 0.150641E+00 + PKER_SWETH( 19, 26) = 0.138811E+00 + PKER_SWETH( 19, 27) = 0.137940E+00 + PKER_SWETH( 19, 28) = 0.147153E+00 + PKER_SWETH( 19, 29) = 0.165086E+00 + PKER_SWETH( 19, 30) = 0.189581E+00 + PKER_SWETH( 19, 31) = 0.218462E+00 + PKER_SWETH( 19, 32) = 0.249591E+00 + PKER_SWETH( 19, 33) = 0.281174E+00 + PKER_SWETH( 19, 34) = 0.311929E+00 + PKER_SWETH( 19, 35) = 0.341031E+00 + PKER_SWETH( 19, 36) = 0.368064E+00 + PKER_SWETH( 19, 37) = 0.392893E+00 + PKER_SWETH( 19, 38) = 0.415567E+00 + PKER_SWETH( 19, 39) = 0.436229E+00 + PKER_SWETH( 19, 40) = 0.455063E+00 + PKER_SWETH( 19, 41) = 0.472262E+00 + PKER_SWETH( 19, 42) = 0.488006E+00 + PKER_SWETH( 19, 43) = 0.502461E+00 + PKER_SWETH( 19, 44) = 0.515768E+00 + PKER_SWETH( 19, 45) = 0.528053E+00 + PKER_SWETH( 19, 46) = 0.539421E+00 + PKER_SWETH( 19, 47) = 0.549964E+00 + PKER_SWETH( 19, 48) = 0.559761E+00 + PKER_SWETH( 19, 49) = 0.568879E+00 + PKER_SWETH( 19, 50) = 0.577378E+00 + PKER_SWETH( 19, 51) = 0.585309E+00 + PKER_SWETH( 19, 52) = 0.592718E+00 + PKER_SWETH( 19, 53) = 0.599645E+00 + PKER_SWETH( 19, 54) = 0.606125E+00 + PKER_SWETH( 19, 55) = 0.612192E+00 + PKER_SWETH( 19, 56) = 0.617874E+00 + PKER_SWETH( 19, 57) = 0.623199E+00 + PKER_SWETH( 19, 58) = 0.628190E+00 + PKER_SWETH( 19, 59) = 0.632869E+00 + PKER_SWETH( 19, 60) = 0.637258E+00 + PKER_SWETH( 19, 61) = 0.641374E+00 + PKER_SWETH( 19, 62) = 0.645237E+00 + PKER_SWETH( 19, 63) = 0.648860E+00 + PKER_SWETH( 19, 64) = 0.652261E+00 + PKER_SWETH( 19, 65) = 0.655453E+00 + PKER_SWETH( 19, 66) = 0.658449E+00 + PKER_SWETH( 19, 67) = 0.661261E+00 + PKER_SWETH( 19, 68) = 0.663901E+00 + PKER_SWETH( 19, 69) = 0.666379E+00 + PKER_SWETH( 19, 70) = 0.668705E+00 + PKER_SWETH( 19, 71) = 0.670889E+00 + PKER_SWETH( 19, 72) = 0.672939E+00 + PKER_SWETH( 19, 73) = 0.674865E+00 + PKER_SWETH( 19, 74) = 0.676672E+00 + PKER_SWETH( 19, 75) = 0.678369E+00 + PKER_SWETH( 19, 76) = 0.679963E+00 + PKER_SWETH( 19, 77) = 0.681459E+00 + PKER_SWETH( 19, 78) = 0.682863E+00 + PKER_SWETH( 19, 79) = 0.684182E+00 + PKER_SWETH( 19, 80) = 0.685421E+00 + PKER_SWETH( 20, 1) = 0.269288E+01 + PKER_SWETH( 20, 2) = 0.249646E+01 + PKER_SWETH( 20, 3) = 0.231201E+01 + PKER_SWETH( 20, 4) = 0.213879E+01 + PKER_SWETH( 20, 5) = 0.197613E+01 + PKER_SWETH( 20, 6) = 0.182336E+01 + PKER_SWETH( 20, 7) = 0.167988E+01 + PKER_SWETH( 20, 8) = 0.154512E+01 + PKER_SWETH( 20, 9) = 0.141853E+01 + PKER_SWETH( 20, 10) = 0.129961E+01 + PKER_SWETH( 20, 11) = 0.118788E+01 + PKER_SWETH( 20, 12) = 0.108288E+01 + PKER_SWETH( 20, 13) = 0.984187E+00 + PKER_SWETH( 20, 14) = 0.891397E+00 + PKER_SWETH( 20, 15) = 0.804124E+00 + PKER_SWETH( 20, 16) = 0.722009E+00 + PKER_SWETH( 20, 17) = 0.644714E+00 + PKER_SWETH( 20, 18) = 0.571940E+00 + PKER_SWETH( 20, 19) = 0.503441E+00 + PKER_SWETH( 20, 20) = 0.439066E+00 + PKER_SWETH( 20, 21) = 0.378811E+00 + PKER_SWETH( 20, 22) = 0.322879E+00 + PKER_SWETH( 20, 23) = 0.271763E+00 + PKER_SWETH( 20, 24) = 0.226263E+00 + PKER_SWETH( 20, 25) = 0.187406E+00 + PKER_SWETH( 20, 26) = 0.156446E+00 + PKER_SWETH( 20, 27) = 0.134517E+00 + PKER_SWETH( 20, 28) = 0.122305E+00 + PKER_SWETH( 20, 29) = 0.120067E+00 + PKER_SWETH( 20, 30) = 0.127125E+00 + PKER_SWETH( 20, 31) = 0.142001E+00 + PKER_SWETH( 20, 32) = 0.162875E+00 + PKER_SWETH( 20, 33) = 0.187599E+00 + PKER_SWETH( 20, 34) = 0.214210E+00 + PKER_SWETH( 20, 35) = 0.241099E+00 + PKER_SWETH( 20, 36) = 0.267168E+00 + PKER_SWETH( 20, 37) = 0.291755E+00 + PKER_SWETH( 20, 38) = 0.314552E+00 + PKER_SWETH( 20, 39) = 0.335492E+00 + PKER_SWETH( 20, 40) = 0.354644E+00 + PKER_SWETH( 20, 41) = 0.372144E+00 + PKER_SWETH( 20, 42) = 0.388151E+00 + PKER_SWETH( 20, 43) = 0.402823E+00 + PKER_SWETH( 20, 44) = 0.416308E+00 + PKER_SWETH( 20, 45) = 0.428733E+00 + PKER_SWETH( 20, 46) = 0.440212E+00 + PKER_SWETH( 20, 47) = 0.450843E+00 + PKER_SWETH( 20, 48) = 0.460707E+00 + PKER_SWETH( 20, 49) = 0.469878E+00 + PKER_SWETH( 20, 50) = 0.478418E+00 + PKER_SWETH( 20, 51) = 0.486380E+00 + PKER_SWETH( 20, 52) = 0.493813E+00 + PKER_SWETH( 20, 53) = 0.500759E+00 + PKER_SWETH( 20, 54) = 0.507254E+00 + PKER_SWETH( 20, 55) = 0.513332E+00 + PKER_SWETH( 20, 56) = 0.519023E+00 + PKER_SWETH( 20, 57) = 0.524354E+00 + PKER_SWETH( 20, 58) = 0.529350E+00 + PKER_SWETH( 20, 59) = 0.534034E+00 + PKER_SWETH( 20, 60) = 0.538425E+00 + PKER_SWETH( 20, 61) = 0.542544E+00 + PKER_SWETH( 20, 62) = 0.546409E+00 + PKER_SWETH( 20, 63) = 0.550034E+00 + PKER_SWETH( 20, 64) = 0.553436E+00 + PKER_SWETH( 20, 65) = 0.556629E+00 + PKER_SWETH( 20, 66) = 0.559625E+00 + PKER_SWETH( 20, 67) = 0.562438E+00 + PKER_SWETH( 20, 68) = 0.565078E+00 + PKER_SWETH( 20, 69) = 0.567556E+00 + PKER_SWETH( 20, 70) = 0.569883E+00 + PKER_SWETH( 20, 71) = 0.572067E+00 + PKER_SWETH( 20, 72) = 0.574118E+00 + PKER_SWETH( 20, 73) = 0.576043E+00 + PKER_SWETH( 20, 74) = 0.577850E+00 + PKER_SWETH( 20, 75) = 0.579548E+00 + PKER_SWETH( 20, 76) = 0.581141E+00 + PKER_SWETH( 20, 77) = 0.582637E+00 + PKER_SWETH( 20, 78) = 0.584042E+00 + PKER_SWETH( 20, 79) = 0.585361E+00 + PKER_SWETH( 20, 80) = 0.586599E+00 + PKER_SWETH( 21, 1) = 0.276660E+01 + PKER_SWETH( 21, 2) = 0.257019E+01 + PKER_SWETH( 21, 3) = 0.238576E+01 + PKER_SWETH( 21, 4) = 0.221256E+01 + PKER_SWETH( 21, 5) = 0.204992E+01 + PKER_SWETH( 21, 6) = 0.189718E+01 + PKER_SWETH( 21, 7) = 0.175373E+01 + PKER_SWETH( 21, 8) = 0.161901E+01 + PKER_SWETH( 21, 9) = 0.149248E+01 + PKER_SWETH( 21, 10) = 0.137362E+01 + PKER_SWETH( 21, 11) = 0.126196E+01 + PKER_SWETH( 21, 12) = 0.115706E+01 + PKER_SWETH( 21, 13) = 0.105848E+01 + PKER_SWETH( 21, 14) = 0.965820E+00 + PKER_SWETH( 21, 15) = 0.878708E+00 + PKER_SWETH( 21, 16) = 0.796778E+00 + PKER_SWETH( 21, 17) = 0.719688E+00 + PKER_SWETH( 21, 18) = 0.647114E+00 + PKER_SWETH( 21, 19) = 0.578752E+00 + PKER_SWETH( 21, 20) = 0.514323E+00 + PKER_SWETH( 21, 21) = 0.453593E+00 + PKER_SWETH( 21, 22) = 0.396401E+00 + PKER_SWETH( 21, 23) = 0.342701E+00 + PKER_SWETH( 21, 24) = 0.292637E+00 + PKER_SWETH( 21, 25) = 0.246605E+00 + PKER_SWETH( 21, 26) = 0.205290E+00 + PKER_SWETH( 21, 27) = 0.169646E+00 + PKER_SWETH( 21, 28) = 0.140837E+00 + PKER_SWETH( 21, 29) = 0.119992E+00 + PKER_SWETH( 21, 30) = 0.107857E+00 + PKER_SWETH( 21, 31) = 0.104691E+00 + PKER_SWETH( 21, 32) = 0.109912E+00 + PKER_SWETH( 21, 33) = 0.122241E+00 + PKER_SWETH( 21, 34) = 0.139853E+00 + PKER_SWETH( 21, 35) = 0.160815E+00 + PKER_SWETH( 21, 36) = 0.183364E+00 + PKER_SWETH( 21, 37) = 0.206102E+00 + PKER_SWETH( 21, 38) = 0.228109E+00 + PKER_SWETH( 21, 39) = 0.248850E+00 + PKER_SWETH( 21, 40) = 0.268092E+00 + PKER_SWETH( 21, 41) = 0.285801E+00 + PKER_SWETH( 21, 42) = 0.302045E+00 + PKER_SWETH( 21, 43) = 0.316939E+00 + PKER_SWETH( 21, 44) = 0.330615E+00 + PKER_SWETH( 21, 45) = 0.343198E+00 + PKER_SWETH( 21, 46) = 0.354804E+00 + PKER_SWETH( 21, 47) = 0.365535E+00 + PKER_SWETH( 21, 48) = 0.375478E+00 + PKER_SWETH( 21, 49) = 0.384710E+00 + PKER_SWETH( 21, 50) = 0.393297E+00 + PKER_SWETH( 21, 51) = 0.401296E+00 + PKER_SWETH( 21, 52) = 0.408758E+00 + PKER_SWETH( 21, 53) = 0.415725E+00 + PKER_SWETH( 21, 54) = 0.422237E+00 + PKER_SWETH( 21, 55) = 0.428328E+00 + PKER_SWETH( 21, 56) = 0.434029E+00 + PKER_SWETH( 21, 57) = 0.439368E+00 + PKER_SWETH( 21, 58) = 0.444370E+00 + PKER_SWETH( 21, 59) = 0.449059E+00 + PKER_SWETH( 21, 60) = 0.453454E+00 + PKER_SWETH( 21, 61) = 0.457576E+00 + PKER_SWETH( 21, 62) = 0.461442E+00 + PKER_SWETH( 21, 63) = 0.465069E+00 + PKER_SWETH( 21, 64) = 0.468472E+00 + PKER_SWETH( 21, 65) = 0.471666E+00 + PKER_SWETH( 21, 66) = 0.474663E+00 + PKER_SWETH( 21, 67) = 0.477476E+00 + PKER_SWETH( 21, 68) = 0.480117E+00 + PKER_SWETH( 21, 69) = 0.482596E+00 + PKER_SWETH( 21, 70) = 0.484923E+00 + PKER_SWETH( 21, 71) = 0.487107E+00 + PKER_SWETH( 21, 72) = 0.489158E+00 + PKER_SWETH( 21, 73) = 0.491083E+00 + PKER_SWETH( 21, 74) = 0.492891E+00 + PKER_SWETH( 21, 75) = 0.494588E+00 + PKER_SWETH( 21, 76) = 0.496182E+00 + PKER_SWETH( 21, 77) = 0.497678E+00 + PKER_SWETH( 21, 78) = 0.499083E+00 + PKER_SWETH( 21, 79) = 0.500402E+00 + PKER_SWETH( 21, 80) = 0.501640E+00 + PKER_SWETH( 22, 1) = 0.282997E+01 + PKER_SWETH( 22, 2) = 0.263357E+01 + PKER_SWETH( 22, 3) = 0.244915E+01 + PKER_SWETH( 22, 4) = 0.227597E+01 + PKER_SWETH( 22, 5) = 0.211334E+01 + PKER_SWETH( 22, 6) = 0.196063E+01 + PKER_SWETH( 22, 7) = 0.181721E+01 + PKER_SWETH( 22, 8) = 0.168252E+01 + PKER_SWETH( 22, 9) = 0.155602E+01 + PKER_SWETH( 22, 10) = 0.143721E+01 + PKER_SWETH( 22, 11) = 0.132561E+01 + PKER_SWETH( 22, 12) = 0.122077E+01 + PKER_SWETH( 22, 13) = 0.112227E+01 + PKER_SWETH( 22, 14) = 0.102972E+01 + PKER_SWETH( 22, 15) = 0.942728E+00 + PKER_SWETH( 22, 16) = 0.860945E+00 + PKER_SWETH( 22, 17) = 0.784032E+00 + PKER_SWETH( 22, 18) = 0.711667E+00 + PKER_SWETH( 22, 19) = 0.643543E+00 + PKER_SWETH( 22, 20) = 0.579369E+00 + PKER_SWETH( 22, 21) = 0.518868E+00 + PKER_SWETH( 22, 22) = 0.461786E+00 + PKER_SWETH( 22, 23) = 0.407901E+00 + PKER_SWETH( 22, 24) = 0.357051E+00 + PKER_SWETH( 22, 25) = 0.309171E+00 + PKER_SWETH( 22, 26) = 0.264357E+00 + PKER_SWETH( 22, 27) = 0.222939E+00 + PKER_SWETH( 22, 28) = 0.185511E+00 + PKER_SWETH( 22, 29) = 0.152956E+00 + PKER_SWETH( 22, 30) = 0.126371E+00 + PKER_SWETH( 22, 31) = 0.106799E+00 + PKER_SWETH( 22, 32) = 0.950337E-01 + PKER_SWETH( 22, 33) = 0.913020E-01 + PKER_SWETH( 22, 34) = 0.950413E-01 + PKER_SWETH( 22, 35) = 0.105099E+00 + PKER_SWETH( 22, 36) = 0.119803E+00 + PKER_SWETH( 22, 37) = 0.137435E+00 + PKER_SWETH( 22, 38) = 0.156413E+00 + PKER_SWETH( 22, 39) = 0.175558E+00 + PKER_SWETH( 22, 40) = 0.194103E+00 + PKER_SWETH( 22, 41) = 0.211605E+00 + PKER_SWETH( 22, 42) = 0.227888E+00 + PKER_SWETH( 22, 43) = 0.242923E+00 + PKER_SWETH( 22, 44) = 0.256764E+00 + PKER_SWETH( 22, 45) = 0.269505E+00 + PKER_SWETH( 22, 46) = 0.281247E+00 + PKER_SWETH( 22, 47) = 0.292089E+00 + PKER_SWETH( 22, 48) = 0.302122E+00 + PKER_SWETH( 22, 49) = 0.311425E+00 + PKER_SWETH( 22, 50) = 0.320067E+00 + PKER_SWETH( 22, 51) = 0.328110E+00 + PKER_SWETH( 22, 52) = 0.335604E+00 + PKER_SWETH( 22, 53) = 0.342597E+00 + PKER_SWETH( 22, 54) = 0.349129E+00 + PKER_SWETH( 22, 55) = 0.355235E+00 + PKER_SWETH( 22, 56) = 0.360948E+00 + PKER_SWETH( 22, 57) = 0.366296E+00 + PKER_SWETH( 22, 58) = 0.371305E+00 + PKER_SWETH( 22, 59) = 0.375999E+00 + PKER_SWETH( 22, 60) = 0.380398E+00 + PKER_SWETH( 22, 61) = 0.384523E+00 + PKER_SWETH( 22, 62) = 0.388392E+00 + PKER_SWETH( 22, 63) = 0.392021E+00 + PKER_SWETH( 22, 64) = 0.395426E+00 + PKER_SWETH( 22, 65) = 0.398621E+00 + PKER_SWETH( 22, 66) = 0.401619E+00 + PKER_SWETH( 22, 67) = 0.404433E+00 + PKER_SWETH( 22, 68) = 0.407074E+00 + PKER_SWETH( 22, 69) = 0.409553E+00 + PKER_SWETH( 22, 70) = 0.411880E+00 + PKER_SWETH( 22, 71) = 0.414065E+00 + PKER_SWETH( 22, 72) = 0.416116E+00 + PKER_SWETH( 22, 73) = 0.418041E+00 + PKER_SWETH( 22, 74) = 0.419849E+00 + PKER_SWETH( 22, 75) = 0.421547E+00 + PKER_SWETH( 22, 76) = 0.423140E+00 + PKER_SWETH( 22, 77) = 0.424636E+00 + PKER_SWETH( 22, 78) = 0.426041E+00 + PKER_SWETH( 22, 79) = 0.427360E+00 + PKER_SWETH( 22, 80) = 0.428599E+00 + PKER_SWETH( 23, 1) = 0.288445E+01 + PKER_SWETH( 23, 2) = 0.268806E+01 + PKER_SWETH( 23, 3) = 0.250364E+01 + PKER_SWETH( 23, 4) = 0.233048E+01 + PKER_SWETH( 23, 5) = 0.216786E+01 + PKER_SWETH( 23, 6) = 0.201516E+01 + PKER_SWETH( 23, 7) = 0.187176E+01 + PKER_SWETH( 23, 8) = 0.173710E+01 + PKER_SWETH( 23, 9) = 0.161063E+01 + PKER_SWETH( 23, 10) = 0.149185E+01 + PKER_SWETH( 23, 11) = 0.138029E+01 + PKER_SWETH( 23, 12) = 0.127551E+01 + PKER_SWETH( 23, 13) = 0.117707E+01 + PKER_SWETH( 23, 14) = 0.108459E+01 + PKER_SWETH( 23, 15) = 0.997690E+00 + PKER_SWETH( 23, 16) = 0.916018E+00 + PKER_SWETH( 23, 17) = 0.839238E+00 + PKER_SWETH( 23, 18) = 0.767034E+00 + PKER_SWETH( 23, 19) = 0.699104E+00 + PKER_SWETH( 23, 20) = 0.635161E+00 + PKER_SWETH( 23, 21) = 0.574928E+00 + PKER_SWETH( 23, 22) = 0.518145E+00 + PKER_SWETH( 23, 23) = 0.464561E+00 + PKER_SWETH( 23, 24) = 0.413942E+00 + PKER_SWETH( 23, 25) = 0.366084E+00 + PKER_SWETH( 23, 26) = 0.320828E+00 + PKER_SWETH( 23, 27) = 0.278103E+00 + PKER_SWETH( 23, 28) = 0.237978E+00 + PKER_SWETH( 23, 29) = 0.200731E+00 + PKER_SWETH( 23, 30) = 0.166899E+00 + PKER_SWETH( 23, 31) = 0.137289E+00 + PKER_SWETH( 23, 32) = 0.112921E+00 + PKER_SWETH( 23, 33) = 0.947715E-01 + PKER_SWETH( 23, 34) = 0.835556E-01 + PKER_SWETH( 23, 35) = 0.795022E-01 + PKER_SWETH( 23, 36) = 0.820667E-01 + PKER_SWETH( 23, 37) = 0.901434E-01 + PKER_SWETH( 23, 38) = 0.102318E+00 + PKER_SWETH( 23, 39) = 0.117002E+00 + PKER_SWETH( 23, 40) = 0.132892E+00 + PKER_SWETH( 23, 41) = 0.148969E+00 + PKER_SWETH( 23, 42) = 0.164595E+00 + PKER_SWETH( 23, 43) = 0.179397E+00 + PKER_SWETH( 23, 44) = 0.193221E+00 + PKER_SWETH( 23, 45) = 0.206041E+00 + PKER_SWETH( 23, 46) = 0.217890E+00 + PKER_SWETH( 23, 47) = 0.228840E+00 + PKER_SWETH( 23, 48) = 0.238967E+00 + PKER_SWETH( 23, 49) = 0.248348E+00 + PKER_SWETH( 23, 50) = 0.257053E+00 + PKER_SWETH( 23, 51) = 0.265145E+00 + PKER_SWETH( 23, 52) = 0.272678E+00 + PKER_SWETH( 23, 53) = 0.279701E+00 + PKER_SWETH( 23, 54) = 0.286256E+00 + PKER_SWETH( 23, 55) = 0.292380E+00 + PKER_SWETH( 23, 56) = 0.298107E+00 + PKER_SWETH( 23, 57) = 0.303465E+00 + PKER_SWETH( 23, 58) = 0.308482E+00 + PKER_SWETH( 23, 59) = 0.313182E+00 + PKER_SWETH( 23, 60) = 0.317586E+00 + PKER_SWETH( 23, 61) = 0.321715E+00 + PKER_SWETH( 23, 62) = 0.325587E+00 + PKER_SWETH( 23, 63) = 0.329218E+00 + PKER_SWETH( 23, 64) = 0.332625E+00 + PKER_SWETH( 23, 65) = 0.335821E+00 + PKER_SWETH( 23, 66) = 0.338820E+00 + PKER_SWETH( 23, 67) = 0.341635E+00 + PKER_SWETH( 23, 68) = 0.344276E+00 + PKER_SWETH( 23, 69) = 0.346756E+00 + PKER_SWETH( 23, 70) = 0.349083E+00 + PKER_SWETH( 23, 71) = 0.351269E+00 + PKER_SWETH( 23, 72) = 0.353320E+00 + PKER_SWETH( 23, 73) = 0.355245E+00 + PKER_SWETH( 23, 74) = 0.357053E+00 + PKER_SWETH( 23, 75) = 0.358751E+00 + PKER_SWETH( 23, 76) = 0.360345E+00 + PKER_SWETH( 23, 77) = 0.361841E+00 + PKER_SWETH( 23, 78) = 0.363246E+00 + PKER_SWETH( 23, 79) = 0.364565E+00 + PKER_SWETH( 23, 80) = 0.365803E+00 + PKER_SWETH( 24, 1) = 0.293128E+01 + PKER_SWETH( 24, 2) = 0.273490E+01 + PKER_SWETH( 24, 3) = 0.255049E+01 + PKER_SWETH( 24, 4) = 0.237733E+01 + PKER_SWETH( 24, 5) = 0.221473E+01 + PKER_SWETH( 24, 6) = 0.206204E+01 + PKER_SWETH( 24, 7) = 0.191865E+01 + PKER_SWETH( 24, 8) = 0.178401E+01 + PKER_SWETH( 24, 9) = 0.165756E+01 + PKER_SWETH( 24, 10) = 0.153881E+01 + PKER_SWETH( 24, 11) = 0.142728E+01 + PKER_SWETH( 24, 12) = 0.132253E+01 + PKER_SWETH( 24, 13) = 0.122414E+01 + PKER_SWETH( 24, 14) = 0.113172E+01 + PKER_SWETH( 24, 15) = 0.104489E+01 + PKER_SWETH( 24, 16) = 0.963296E+00 + PKER_SWETH( 24, 17) = 0.886615E+00 + PKER_SWETH( 24, 18) = 0.814532E+00 + PKER_SWETH( 24, 19) = 0.746748E+00 + PKER_SWETH( 24, 20) = 0.682980E+00 + PKER_SWETH( 24, 21) = 0.622959E+00 + PKER_SWETH( 24, 22) = 0.566429E+00 + PKER_SWETH( 24, 23) = 0.513140E+00 + PKER_SWETH( 24, 24) = 0.462858E+00 + PKER_SWETH( 24, 25) = 0.415356E+00 + PKER_SWETH( 24, 26) = 0.370422E+00 + PKER_SWETH( 24, 27) = 0.327867E+00 + PKER_SWETH( 24, 28) = 0.287546E+00 + PKER_SWETH( 24, 29) = 0.249386E+00 + PKER_SWETH( 24, 30) = 0.213448E+00 + PKER_SWETH( 24, 31) = 0.179979E+00 + PKER_SWETH( 24, 32) = 0.149462E+00 + PKER_SWETH( 24, 33) = 0.122655E+00 + PKER_SWETH( 24, 34) = 0.100473E+00 + PKER_SWETH( 24, 35) = 0.838046E-01 + PKER_SWETH( 24, 36) = 0.732975E-01 + PKER_SWETH( 24, 37) = 0.690734E-01 + PKER_SWETH( 24, 38) = 0.706629E-01 + PKER_SWETH( 24, 39) = 0.770847E-01 + PKER_SWETH( 24, 40) = 0.870070E-01 + PKER_SWETH( 24, 41) = 0.991818E-01 + PKER_SWETH( 24, 42) = 0.112426E+00 + PKER_SWETH( 24, 43) = 0.125916E+00 + PKER_SWETH( 24, 44) = 0.139097E+00 + PKER_SWETH( 24, 45) = 0.151650E+00 + PKER_SWETH( 24, 46) = 0.163434E+00 + PKER_SWETH( 24, 47) = 0.174410E+00 + PKER_SWETH( 24, 48) = 0.184599E+00 + PKER_SWETH( 24, 49) = 0.194049E+00 + PKER_SWETH( 24, 50) = 0.202817E+00 + PKER_SWETH( 24, 51) = 0.210962E+00 + PKER_SWETH( 24, 52) = 0.218539E+00 + PKER_SWETH( 24, 53) = 0.225596E+00 + PKER_SWETH( 24, 54) = 0.232178E+00 + PKER_SWETH( 24, 55) = 0.238323E+00 + PKER_SWETH( 24, 56) = 0.244066E+00 + PKER_SWETH( 24, 57) = 0.249437E+00 + PKER_SWETH( 24, 58) = 0.254464E+00 + PKER_SWETH( 24, 59) = 0.259171E+00 + PKER_SWETH( 24, 60) = 0.263581E+00 + PKER_SWETH( 24, 61) = 0.267714E+00 + PKER_SWETH( 24, 62) = 0.271589E+00 + PKER_SWETH( 24, 63) = 0.275223E+00 + PKER_SWETH( 24, 64) = 0.278631E+00 + PKER_SWETH( 24, 65) = 0.281829E+00 + PKER_SWETH( 24, 66) = 0.284829E+00 + PKER_SWETH( 24, 67) = 0.287645E+00 + PKER_SWETH( 24, 68) = 0.290287E+00 + PKER_SWETH( 24, 69) = 0.292767E+00 + PKER_SWETH( 24, 70) = 0.295095E+00 + PKER_SWETH( 24, 71) = 0.297281E+00 + PKER_SWETH( 24, 72) = 0.299332E+00 + PKER_SWETH( 24, 73) = 0.301258E+00 + PKER_SWETH( 24, 74) = 0.303066E+00 + PKER_SWETH( 24, 75) = 0.304764E+00 + PKER_SWETH( 24, 76) = 0.306358E+00 + PKER_SWETH( 24, 77) = 0.307854E+00 + PKER_SWETH( 24, 78) = 0.309259E+00 + PKER_SWETH( 24, 79) = 0.310578E+00 + PKER_SWETH( 24, 80) = 0.311817E+00 + PKER_SWETH( 25, 1) = 0.297154E+01 + PKER_SWETH( 25, 2) = 0.277516E+01 + PKER_SWETH( 25, 3) = 0.259076E+01 + PKER_SWETH( 25, 4) = 0.241761E+01 + PKER_SWETH( 25, 5) = 0.225501E+01 + PKER_SWETH( 25, 6) = 0.210233E+01 + PKER_SWETH( 25, 7) = 0.195896E+01 + PKER_SWETH( 25, 8) = 0.182433E+01 + PKER_SWETH( 25, 9) = 0.169789E+01 + PKER_SWETH( 25, 10) = 0.157916E+01 + PKER_SWETH( 25, 11) = 0.146766E+01 + PKER_SWETH( 25, 12) = 0.136294E+01 + PKER_SWETH( 25, 13) = 0.126459E+01 + PKER_SWETH( 25, 14) = 0.117220E+01 + PKER_SWETH( 25, 15) = 0.108542E+01 + PKER_SWETH( 25, 16) = 0.100389E+01 + PKER_SWETH( 25, 17) = 0.927285E+00 + PKER_SWETH( 25, 18) = 0.855291E+00 + PKER_SWETH( 25, 19) = 0.787616E+00 + PKER_SWETH( 25, 20) = 0.723980E+00 + PKER_SWETH( 25, 21) = 0.664118E+00 + PKER_SWETH( 25, 22) = 0.607779E+00 + PKER_SWETH( 25, 23) = 0.554721E+00 + PKER_SWETH( 25, 24) = 0.504713E+00 + PKER_SWETH( 25, 25) = 0.457533E+00 + PKER_SWETH( 25, 26) = 0.412967E+00 + PKER_SWETH( 25, 27) = 0.370812E+00 + PKER_SWETH( 25, 28) = 0.330876E+00 + PKER_SWETH( 25, 29) = 0.292989E+00 + PKER_SWETH( 25, 30) = 0.257023E+00 + PKER_SWETH( 25, 31) = 0.222915E+00 + PKER_SWETH( 25, 32) = 0.190725E+00 + PKER_SWETH( 25, 33) = 0.160684E+00 + PKER_SWETH( 25, 34) = 0.133246E+00 + PKER_SWETH( 25, 35) = 0.109094E+00 + PKER_SWETH( 25, 36) = 0.890541E-01 + PKER_SWETH( 25, 37) = 0.738827E-01 + PKER_SWETH( 25, 38) = 0.641418E-01 + PKER_SWETH( 25, 39) = 0.598974E-01 + PKER_SWETH( 25, 40) = 0.606697E-01 + PKER_SWETH( 25, 41) = 0.656428E-01 + PKER_SWETH( 25, 42) = 0.736972E-01 + PKER_SWETH( 25, 43) = 0.836895E-01 + PKER_SWETH( 25, 44) = 0.947074E-01 + PKER_SWETH( 25, 45) = 0.106025E+00 + PKER_SWETH( 25, 46) = 0.117165E+00 + PKER_SWETH( 25, 47) = 0.127842E+00 + PKER_SWETH( 25, 48) = 0.137923E+00 + PKER_SWETH( 25, 49) = 0.147359E+00 + PKER_SWETH( 25, 50) = 0.156153E+00 + PKER_SWETH( 25, 51) = 0.164338E+00 + PKER_SWETH( 25, 52) = 0.171955E+00 + PKER_SWETH( 25, 53) = 0.179048E+00 + PKER_SWETH( 25, 54) = 0.185659E+00 + PKER_SWETH( 25, 55) = 0.191828E+00 + PKER_SWETH( 25, 56) = 0.197589E+00 + PKER_SWETH( 25, 57) = 0.202975E+00 + PKER_SWETH( 25, 58) = 0.208013E+00 + PKER_SWETH( 25, 59) = 0.212728E+00 + PKER_SWETH( 25, 60) = 0.217145E+00 + PKER_SWETH( 25, 61) = 0.221283E+00 + PKER_SWETH( 25, 62) = 0.225162E+00 + PKER_SWETH( 25, 63) = 0.228799E+00 + PKER_SWETH( 25, 64) = 0.232210E+00 + PKER_SWETH( 25, 65) = 0.235409E+00 + PKER_SWETH( 25, 66) = 0.238411E+00 + PKER_SWETH( 25, 67) = 0.241227E+00 + PKER_SWETH( 25, 68) = 0.243871E+00 + PKER_SWETH( 25, 69) = 0.246352E+00 + PKER_SWETH( 25, 70) = 0.248680E+00 + PKER_SWETH( 25, 71) = 0.250866E+00 + PKER_SWETH( 25, 72) = 0.252918E+00 + PKER_SWETH( 25, 73) = 0.254844E+00 + PKER_SWETH( 25, 74) = 0.256652E+00 + PKER_SWETH( 25, 75) = 0.258350E+00 + PKER_SWETH( 25, 76) = 0.259944E+00 + PKER_SWETH( 25, 77) = 0.261440E+00 + PKER_SWETH( 25, 78) = 0.262845E+00 + PKER_SWETH( 25, 79) = 0.264164E+00 + PKER_SWETH( 25, 80) = 0.265403E+00 + PKER_SWETH( 26, 1) = 0.300615E+01 + PKER_SWETH( 26, 2) = 0.280977E+01 + PKER_SWETH( 26, 3) = 0.262538E+01 + PKER_SWETH( 26, 4) = 0.245223E+01 + PKER_SWETH( 26, 5) = 0.228964E+01 + PKER_SWETH( 26, 6) = 0.213697E+01 + PKER_SWETH( 26, 7) = 0.199360E+01 + PKER_SWETH( 26, 8) = 0.185898E+01 + PKER_SWETH( 26, 9) = 0.173256E+01 + PKER_SWETH( 26, 10) = 0.161385E+01 + PKER_SWETH( 26, 11) = 0.150236E+01 + PKER_SWETH( 26, 12) = 0.139766E+01 + PKER_SWETH( 26, 13) = 0.129933E+01 + PKER_SWETH( 26, 14) = 0.120698E+01 + PKER_SWETH( 26, 15) = 0.112024E+01 + PKER_SWETH( 26, 16) = 0.103876E+01 + PKER_SWETH( 26, 17) = 0.962205E+00 + PKER_SWETH( 26, 18) = 0.890279E+00 + PKER_SWETH( 26, 19) = 0.822684E+00 + PKER_SWETH( 26, 20) = 0.759146E+00 + PKER_SWETH( 26, 21) = 0.699404E+00 + PKER_SWETH( 26, 22) = 0.643208E+00 + PKER_SWETH( 26, 23) = 0.590322E+00 + PKER_SWETH( 26, 24) = 0.540522E+00 + PKER_SWETH( 26, 25) = 0.493591E+00 + PKER_SWETH( 26, 26) = 0.449320E+00 + PKER_SWETH( 26, 27) = 0.407511E+00 + PKER_SWETH( 26, 28) = 0.367971E+00 + PKER_SWETH( 26, 29) = 0.330516E+00 + PKER_SWETH( 26, 30) = 0.294977E+00 + PKER_SWETH( 26, 31) = 0.261206E+00 + PKER_SWETH( 26, 32) = 0.229091E+00 + PKER_SWETH( 26, 33) = 0.198592E+00 + PKER_SWETH( 26, 34) = 0.169777E+00 + PKER_SWETH( 26, 35) = 0.142869E+00 + PKER_SWETH( 26, 36) = 0.118292E+00 + PKER_SWETH( 26, 37) = 0.966610E-01 + PKER_SWETH( 26, 38) = 0.786825E-01 + PKER_SWETH( 26, 39) = 0.650023E-01 + PKER_SWETH( 26, 40) = 0.560497E-01 + PKER_SWETH( 26, 41) = 0.518524E-01 + PKER_SWETH( 26, 42) = 0.519800E-01 + PKER_SWETH( 26, 43) = 0.557183E-01 + PKER_SWETH( 26, 44) = 0.621393E-01 + PKER_SWETH( 26, 45) = 0.703233E-01 + PKER_SWETH( 26, 46) = 0.794632E-01 + PKER_SWETH( 26, 47) = 0.889548E-01 + PKER_SWETH( 26, 48) = 0.983834E-01 + PKER_SWETH( 26, 49) = 0.107490E+00 + PKER_SWETH( 26, 50) = 0.116142E+00 + PKER_SWETH( 26, 51) = 0.124280E+00 + PKER_SWETH( 26, 52) = 0.131897E+00 + PKER_SWETH( 26, 53) = 0.139007E+00 + PKER_SWETH( 26, 54) = 0.145642E+00 + PKER_SWETH( 26, 55) = 0.151833E+00 + PKER_SWETH( 26, 56) = 0.157614E+00 + PKER_SWETH( 26, 57) = 0.163015E+00 + PKER_SWETH( 26, 58) = 0.168066E+00 + PKER_SWETH( 26, 59) = 0.172792E+00 + PKER_SWETH( 26, 60) = 0.177216E+00 + PKER_SWETH( 26, 61) = 0.181360E+00 + PKER_SWETH( 26, 62) = 0.185244E+00 + PKER_SWETH( 26, 63) = 0.188884E+00 + PKER_SWETH( 26, 64) = 0.192298E+00 + PKER_SWETH( 26, 65) = 0.195499E+00 + PKER_SWETH( 26, 66) = 0.198503E+00 + PKER_SWETH( 26, 67) = 0.201320E+00 + PKER_SWETH( 26, 68) = 0.203965E+00 + PKER_SWETH( 26, 69) = 0.206446E+00 + PKER_SWETH( 26, 70) = 0.208775E+00 + PKER_SWETH( 26, 71) = 0.210961E+00 + PKER_SWETH( 26, 72) = 0.213013E+00 + PKER_SWETH( 26, 73) = 0.214940E+00 + PKER_SWETH( 26, 74) = 0.216748E+00 + PKER_SWETH( 26, 75) = 0.218446E+00 + PKER_SWETH( 26, 76) = 0.220040E+00 + PKER_SWETH( 26, 77) = 0.221537E+00 + PKER_SWETH( 26, 78) = 0.222942E+00 + PKER_SWETH( 26, 79) = 0.224261E+00 + PKER_SWETH( 26, 80) = 0.225500E+00 + PKER_SWETH( 27, 1) = 0.303590E+01 + PKER_SWETH( 27, 2) = 0.283953E+01 + PKER_SWETH( 27, 3) = 0.265514E+01 + PKER_SWETH( 27, 4) = 0.248199E+01 + PKER_SWETH( 27, 5) = 0.231941E+01 + PKER_SWETH( 27, 6) = 0.216674E+01 + PKER_SWETH( 27, 7) = 0.202338E+01 + PKER_SWETH( 27, 8) = 0.188877E+01 + PKER_SWETH( 27, 9) = 0.176236E+01 + PKER_SWETH( 27, 10) = 0.164366E+01 + PKER_SWETH( 27, 11) = 0.153218E+01 + PKER_SWETH( 27, 12) = 0.142750E+01 + PKER_SWETH( 27, 13) = 0.132919E+01 + PKER_SWETH( 27, 14) = 0.123687E+01 + PKER_SWETH( 27, 15) = 0.115015E+01 + PKER_SWETH( 27, 16) = 0.106870E+01 + PKER_SWETH( 27, 17) = 0.992194E+00 + PKER_SWETH( 27, 18) = 0.920318E+00 + PKER_SWETH( 27, 19) = 0.852785E+00 + PKER_SWETH( 27, 20) = 0.789320E+00 + PKER_SWETH( 27, 21) = 0.729667E+00 + PKER_SWETH( 27, 22) = 0.673578E+00 + PKER_SWETH( 27, 23) = 0.620822E+00 + PKER_SWETH( 27, 24) = 0.571178E+00 + PKER_SWETH( 27, 25) = 0.524434E+00 + PKER_SWETH( 27, 26) = 0.480388E+00 + PKER_SWETH( 27, 27) = 0.438846E+00 + PKER_SWETH( 27, 28) = 0.399622E+00 + PKER_SWETH( 27, 29) = 0.362534E+00 + PKER_SWETH( 27, 30) = 0.327412E+00 + PKER_SWETH( 27, 31) = 0.294092E+00 + PKER_SWETH( 27, 32) = 0.262426E+00 + PKER_SWETH( 27, 33) = 0.232290E+00 + PKER_SWETH( 27, 34) = 0.203599E+00 + PKER_SWETH( 27, 35) = 0.176334E+00 + PKER_SWETH( 27, 36) = 0.150579E+00 + PKER_SWETH( 27, 37) = 0.126557E+00 + PKER_SWETH( 27, 38) = 0.104653E+00 + PKER_SWETH( 27, 39) = 0.854039E-01 + PKER_SWETH( 27, 40) = 0.693914E-01 + PKER_SWETH( 27, 41) = 0.571427E-01 + PKER_SWETH( 27, 42) = 0.489777E-01 + PKER_SWETH( 27, 43) = 0.448639E-01 + PKER_SWETH( 27, 44) = 0.444652E-01 + PKER_SWETH( 27, 45) = 0.471717E-01 + PKER_SWETH( 27, 46) = 0.522132E-01 + PKER_SWETH( 27, 47) = 0.588533E-01 + PKER_SWETH( 27, 48) = 0.664103E-01 + PKER_SWETH( 27, 49) = 0.743760E-01 + PKER_SWETH( 27, 50) = 0.823690E-01 + PKER_SWETH( 27, 51) = 0.901537E-01 + PKER_SWETH( 27, 52) = 0.975988E-01 + PKER_SWETH( 27, 53) = 0.104637E+00 + PKER_SWETH( 27, 54) = 0.111249E+00 + PKER_SWETH( 27, 55) = 0.117442E+00 + PKER_SWETH( 27, 56) = 0.123234E+00 + PKER_SWETH( 27, 57) = 0.128648E+00 + PKER_SWETH( 27, 58) = 0.133711E+00 + PKER_SWETH( 27, 59) = 0.138448E+00 + PKER_SWETH( 27, 60) = 0.142881E+00 + PKER_SWETH( 27, 61) = 0.147032E+00 + PKER_SWETH( 27, 62) = 0.150920E+00 + PKER_SWETH( 27, 63) = 0.154565E+00 + PKER_SWETH( 27, 64) = 0.157982E+00 + PKER_SWETH( 27, 65) = 0.161186E+00 + PKER_SWETH( 27, 66) = 0.164191E+00 + PKER_SWETH( 27, 67) = 0.167010E+00 + PKER_SWETH( 27, 68) = 0.169655E+00 + PKER_SWETH( 27, 69) = 0.172138E+00 + PKER_SWETH( 27, 70) = 0.174467E+00 + PKER_SWETH( 27, 71) = 0.176654E+00 + PKER_SWETH( 27, 72) = 0.178707E+00 + PKER_SWETH( 27, 73) = 0.180633E+00 + PKER_SWETH( 27, 74) = 0.182442E+00 + PKER_SWETH( 27, 75) = 0.184140E+00 + PKER_SWETH( 27, 76) = 0.185734E+00 + PKER_SWETH( 27, 77) = 0.187231E+00 + PKER_SWETH( 27, 78) = 0.188636E+00 + PKER_SWETH( 27, 79) = 0.189955E+00 + PKER_SWETH( 27, 80) = 0.191194E+00 + PKER_SWETH( 28, 1) = 0.306148E+01 + PKER_SWETH( 28, 2) = 0.286511E+01 + PKER_SWETH( 28, 3) = 0.268072E+01 + PKER_SWETH( 28, 4) = 0.250758E+01 + PKER_SWETH( 28, 5) = 0.234500E+01 + PKER_SWETH( 28, 6) = 0.219234E+01 + PKER_SWETH( 28, 7) = 0.204898E+01 + PKER_SWETH( 28, 8) = 0.191437E+01 + PKER_SWETH( 28, 9) = 0.178797E+01 + PKER_SWETH( 28, 10) = 0.166928E+01 + PKER_SWETH( 28, 11) = 0.155782E+01 + PKER_SWETH( 28, 12) = 0.145315E+01 + PKER_SWETH( 28, 13) = 0.135485E+01 + PKER_SWETH( 28, 14) = 0.126254E+01 + PKER_SWETH( 28, 15) = 0.117585E+01 + PKER_SWETH( 28, 16) = 0.109443E+01 + PKER_SWETH( 28, 17) = 0.101795E+01 + PKER_SWETH( 28, 18) = 0.946114E+00 + PKER_SWETH( 28, 19) = 0.878627E+00 + PKER_SWETH( 28, 20) = 0.815218E+00 + PKER_SWETH( 28, 21) = 0.755631E+00 + PKER_SWETH( 28, 22) = 0.699623E+00 + PKER_SWETH( 28, 23) = 0.646965E+00 + PKER_SWETH( 28, 24) = 0.597438E+00 + PKER_SWETH( 28, 25) = 0.550835E+00 + PKER_SWETH( 28, 26) = 0.506959E+00 + PKER_SWETH( 28, 27) = 0.465619E+00 + PKER_SWETH( 28, 28) = 0.426636E+00 + PKER_SWETH( 28, 29) = 0.389834E+00 + PKER_SWETH( 28, 30) = 0.355045E+00 + PKER_SWETH( 28, 31) = 0.322108E+00 + PKER_SWETH( 28, 32) = 0.290872E+00 + PKER_SWETH( 28, 33) = 0.261193E+00 + PKER_SWETH( 28, 34) = 0.232948E+00 + PKER_SWETH( 28, 35) = 0.206039E+00 + PKER_SWETH( 28, 36) = 0.180409E+00 + PKER_SWETH( 28, 37) = 0.156068E+00 + PKER_SWETH( 28, 38) = 0.133115E+00 + PKER_SWETH( 28, 39) = 0.111765E+00 + PKER_SWETH( 28, 40) = 0.923608E-01 + PKER_SWETH( 28, 41) = 0.753445E-01 + PKER_SWETH( 28, 42) = 0.611817E-01 + PKER_SWETH( 28, 43) = 0.502690E-01 + PKER_SWETH( 28, 44) = 0.428431E-01 + PKER_SWETH( 28, 45) = 0.388528E-01 + PKER_SWETH( 28, 46) = 0.380123E-01 + PKER_SWETH( 28, 47) = 0.398568E-01 + PKER_SWETH( 28, 48) = 0.437542E-01 + PKER_SWETH( 28, 49) = 0.490872E-01 + PKER_SWETH( 28, 50) = 0.553254E-01 + PKER_SWETH( 28, 51) = 0.619931E-01 + PKER_SWETH( 28, 52) = 0.687719E-01 + PKER_SWETH( 28, 53) = 0.754350E-01 + PKER_SWETH( 28, 54) = 0.818527E-01 + PKER_SWETH( 28, 55) = 0.879516E-01 + PKER_SWETH( 28, 56) = 0.937041E-01 + PKER_SWETH( 28, 57) = 0.991077E-01 + PKER_SWETH( 28, 58) = 0.104172E+00 + PKER_SWETH( 28, 59) = 0.108914E+00 + PKER_SWETH( 28, 60) = 0.113354E+00 + PKER_SWETH( 28, 61) = 0.117512E+00 + PKER_SWETH( 28, 62) = 0.121407E+00 + PKER_SWETH( 28, 63) = 0.125056E+00 + PKER_SWETH( 28, 64) = 0.128476E+00 + PKER_SWETH( 28, 65) = 0.131683E+00 + PKER_SWETH( 28, 66) = 0.134690E+00 + PKER_SWETH( 28, 67) = 0.137511E+00 + PKER_SWETH( 28, 68) = 0.140158E+00 + PKER_SWETH( 28, 69) = 0.142641E+00 + PKER_SWETH( 28, 70) = 0.144972E+00 + PKER_SWETH( 28, 71) = 0.147159E+00 + PKER_SWETH( 28, 72) = 0.149212E+00 + PKER_SWETH( 28, 73) = 0.151139E+00 + PKER_SWETH( 28, 74) = 0.152948E+00 + PKER_SWETH( 28, 75) = 0.154646E+00 + PKER_SWETH( 28, 76) = 0.156240E+00 + PKER_SWETH( 28, 77) = 0.157737E+00 + PKER_SWETH( 28, 78) = 0.159143E+00 + PKER_SWETH( 28, 79) = 0.160462E+00 + PKER_SWETH( 28, 80) = 0.161701E+00 + PKER_SWETH( 29, 1) = 0.308347E+01 + PKER_SWETH( 29, 2) = 0.288710E+01 + PKER_SWETH( 29, 3) = 0.270272E+01 + PKER_SWETH( 29, 4) = 0.252958E+01 + PKER_SWETH( 29, 5) = 0.236700E+01 + PKER_SWETH( 29, 6) = 0.221434E+01 + PKER_SWETH( 29, 7) = 0.207099E+01 + PKER_SWETH( 29, 8) = 0.193639E+01 + PKER_SWETH( 29, 9) = 0.180999E+01 + PKER_SWETH( 29, 10) = 0.169130E+01 + PKER_SWETH( 29, 11) = 0.157985E+01 + PKER_SWETH( 29, 12) = 0.147519E+01 + PKER_SWETH( 29, 13) = 0.137691E+01 + PKER_SWETH( 29, 14) = 0.128461E+01 + PKER_SWETH( 29, 15) = 0.119793E+01 + PKER_SWETH( 29, 16) = 0.111653E+01 + PKER_SWETH( 29, 17) = 0.104008E+01 + PKER_SWETH( 29, 18) = 0.968270E+00 + PKER_SWETH( 29, 19) = 0.900817E+00 + PKER_SWETH( 29, 20) = 0.837451E+00 + PKER_SWETH( 29, 21) = 0.777915E+00 + PKER_SWETH( 29, 22) = 0.721968E+00 + PKER_SWETH( 29, 23) = 0.669383E+00 + PKER_SWETH( 29, 24) = 0.619944E+00 + PKER_SWETH( 29, 25) = 0.573448E+00 + PKER_SWETH( 29, 26) = 0.529699E+00 + PKER_SWETH( 29, 27) = 0.488512E+00 + PKER_SWETH( 29, 28) = 0.449712E+00 + PKER_SWETH( 29, 29) = 0.413127E+00 + PKER_SWETH( 29, 30) = 0.378596E+00 + PKER_SWETH( 29, 31) = 0.345961E+00 + PKER_SWETH( 29, 32) = 0.315072E+00 + PKER_SWETH( 29, 33) = 0.285787E+00 + PKER_SWETH( 29, 34) = 0.257972E+00 + PKER_SWETH( 29, 35) = 0.231509E+00 + PKER_SWETH( 29, 36) = 0.206298E+00 + PKER_SWETH( 29, 37) = 0.182272E+00 + PKER_SWETH( 29, 38) = 0.159406E+00 + PKER_SWETH( 29, 39) = 0.137733E+00 + PKER_SWETH( 29, 40) = 0.117365E+00 + PKER_SWETH( 29, 41) = 0.984979E-01 + PKER_SWETH( 29, 42) = 0.814212E-01 + PKER_SWETH( 29, 43) = 0.664782E-01 + PKER_SWETH( 29, 44) = 0.540142E-01 + PKER_SWETH( 29, 45) = 0.443303E-01 + PKER_SWETH( 29, 46) = 0.375787E-01 + PKER_SWETH( 29, 47) = 0.337194E-01 + PKER_SWETH( 29, 48) = 0.325388E-01 + PKER_SWETH( 29, 49) = 0.336514E-01 + PKER_SWETH( 29, 50) = 0.365861E-01 + PKER_SWETH( 29, 51) = 0.408448E-01 + PKER_SWETH( 29, 52) = 0.459450E-01 + PKER_SWETH( 29, 53) = 0.515262E-01 + PKER_SWETH( 29, 54) = 0.572696E-01 + PKER_SWETH( 29, 55) = 0.629759E-01 + PKER_SWETH( 29, 56) = 0.685136E-01 + PKER_SWETH( 29, 57) = 0.738057E-01 + PKER_SWETH( 29, 58) = 0.788178E-01 + PKER_SWETH( 29, 59) = 0.835388E-01 + PKER_SWETH( 29, 60) = 0.879729E-01 + PKER_SWETH( 29, 61) = 0.921314E-01 + PKER_SWETH( 29, 62) = 0.960291E-01 + PKER_SWETH( 29, 63) = 0.996821E-01 + PKER_SWETH( 29, 64) = 0.103106E+00 + PKER_SWETH( 29, 65) = 0.106316E+00 + PKER_SWETH( 29, 66) = 0.109326E+00 + PKER_SWETH( 29, 67) = 0.112149E+00 + PKER_SWETH( 29, 68) = 0.114797E+00 + PKER_SWETH( 29, 69) = 0.117281E+00 + PKER_SWETH( 29, 70) = 0.119613E+00 + PKER_SWETH( 29, 71) = 0.121801E+00 + PKER_SWETH( 29, 72) = 0.123854E+00 + PKER_SWETH( 29, 73) = 0.125782E+00 + PKER_SWETH( 29, 74) = 0.127591E+00 + PKER_SWETH( 29, 75) = 0.129289E+00 + PKER_SWETH( 29, 76) = 0.130884E+00 + PKER_SWETH( 29, 77) = 0.132381E+00 + PKER_SWETH( 29, 78) = 0.133786E+00 + PKER_SWETH( 29, 79) = 0.135106E+00 + PKER_SWETH( 29, 80) = 0.136344E+00 + PKER_SWETH( 30, 1) = 0.310238E+01 + PKER_SWETH( 30, 2) = 0.290601E+01 + PKER_SWETH( 30, 3) = 0.272162E+01 + PKER_SWETH( 30, 4) = 0.254849E+01 + PKER_SWETH( 30, 5) = 0.238591E+01 + PKER_SWETH( 30, 6) = 0.223325E+01 + PKER_SWETH( 30, 7) = 0.208991E+01 + PKER_SWETH( 30, 8) = 0.195531E+01 + PKER_SWETH( 30, 9) = 0.182891E+01 + PKER_SWETH( 30, 10) = 0.171023E+01 + PKER_SWETH( 30, 11) = 0.159878E+01 + PKER_SWETH( 30, 12) = 0.149413E+01 + PKER_SWETH( 30, 13) = 0.139586E+01 + PKER_SWETH( 30, 14) = 0.130357E+01 + PKER_SWETH( 30, 15) = 0.121691E+01 + PKER_SWETH( 30, 16) = 0.113552E+01 + PKER_SWETH( 30, 17) = 0.105909E+01 + PKER_SWETH( 30, 18) = 0.987301E+00 + PKER_SWETH( 30, 19) = 0.919876E+00 + PKER_SWETH( 30, 20) = 0.856541E+00 + PKER_SWETH( 30, 21) = 0.797043E+00 + PKER_SWETH( 30, 22) = 0.741143E+00 + PKER_SWETH( 30, 23) = 0.688613E+00 + PKER_SWETH( 30, 24) = 0.639241E+00 + PKER_SWETH( 30, 25) = 0.592825E+00 + PKER_SWETH( 30, 26) = 0.549173E+00 + PKER_SWETH( 30, 27) = 0.508102E+00 + PKER_SWETH( 30, 28) = 0.469441E+00 + PKER_SWETH( 30, 29) = 0.433022E+00 + PKER_SWETH( 30, 30) = 0.398687E+00 + PKER_SWETH( 30, 31) = 0.366284E+00 + PKER_SWETH( 30, 32) = 0.335667E+00 + PKER_SWETH( 30, 33) = 0.306696E+00 + PKER_SWETH( 30, 34) = 0.279238E+00 + PKER_SWETH( 30, 35) = 0.253167E+00 + PKER_SWETH( 30, 36) = 0.228374E+00 + PKER_SWETH( 30, 37) = 0.204762E+00 + PKER_SWETH( 30, 38) = 0.182262E+00 + PKER_SWETH( 30, 39) = 0.160835E+00 + PKER_SWETH( 30, 40) = 0.140485E+00 + PKER_SWETH( 30, 41) = 0.121268E+00 + PKER_SWETH( 30, 42) = 0.103293E+00 + PKER_SWETH( 30, 43) = 0.867296E-01 + PKER_SWETH( 30, 44) = 0.717964E-01 + PKER_SWETH( 30, 45) = 0.587461E-01 + PKER_SWETH( 30, 46) = 0.478245E-01 + PKER_SWETH( 30, 47) = 0.392417E-01 + PKER_SWETH( 30, 48) = 0.331060E-01 + PKER_SWETH( 30, 49) = 0.293783E-01 + PKER_SWETH( 30, 50) = 0.279234E-01 + PKER_SWETH( 30, 51) = 0.284480E-01 + PKER_SWETH( 30, 52) = 0.305694E-01 + PKER_SWETH( 30, 53) = 0.339106E-01 + PKER_SWETH( 30, 54) = 0.380759E-01 + PKER_SWETH( 30, 55) = 0.427144E-01 + PKER_SWETH( 30, 56) = 0.475751E-01 + PKER_SWETH( 30, 57) = 0.524601E-01 + PKER_SWETH( 30, 58) = 0.572399E-01 + PKER_SWETH( 30, 59) = 0.618346E-01 + PKER_SWETH( 30, 60) = 0.662050E-01 + PKER_SWETH( 30, 61) = 0.703339E-01 + PKER_SWETH( 30, 62) = 0.742197E-01 + PKER_SWETH( 30, 63) = 0.778693E-01 + PKER_SWETH( 30, 64) = 0.812936E-01 + PKER_SWETH( 30, 65) = 0.845052E-01 + PKER_SWETH( 30, 66) = 0.875171E-01 + PKER_SWETH( 30, 67) = 0.903420E-01 + PKER_SWETH( 30, 68) = 0.929917E-01 + PKER_SWETH( 30, 69) = 0.954775E-01 + PKER_SWETH( 30, 70) = 0.978099E-01 + PKER_SWETH( 30, 71) = 0.999987E-01 + PKER_SWETH( 30, 72) = 0.102053E+00 + PKER_SWETH( 30, 73) = 0.103981E+00 + PKER_SWETH( 30, 74) = 0.105790E+00 + PKER_SWETH( 30, 75) = 0.107489E+00 + PKER_SWETH( 30, 76) = 0.109084E+00 + PKER_SWETH( 30, 77) = 0.110581E+00 + PKER_SWETH( 30, 78) = 0.111986E+00 + PKER_SWETH( 30, 79) = 0.113306E+00 + PKER_SWETH( 30, 80) = 0.114545E+00 + PKER_SWETH( 31, 1) = 0.311863E+01 + PKER_SWETH( 31, 2) = 0.292226E+01 + PKER_SWETH( 31, 3) = 0.273788E+01 + PKER_SWETH( 31, 4) = 0.256474E+01 + PKER_SWETH( 31, 5) = 0.240217E+01 + PKER_SWETH( 31, 6) = 0.224951E+01 + PKER_SWETH( 31, 7) = 0.210617E+01 + PKER_SWETH( 31, 8) = 0.197157E+01 + PKER_SWETH( 31, 9) = 0.184518E+01 + PKER_SWETH( 31, 10) = 0.172650E+01 + PKER_SWETH( 31, 11) = 0.161506E+01 + PKER_SWETH( 31, 12) = 0.151041E+01 + PKER_SWETH( 31, 13) = 0.141215E+01 + PKER_SWETH( 31, 14) = 0.131987E+01 + PKER_SWETH( 31, 15) = 0.123322E+01 + PKER_SWETH( 31, 16) = 0.115184E+01 + PKER_SWETH( 31, 17) = 0.107542E+01 + PKER_SWETH( 31, 18) = 0.100365E+01 + PKER_SWETH( 31, 19) = 0.936246E+00 + PKER_SWETH( 31, 20) = 0.872936E+00 + PKER_SWETH( 31, 21) = 0.813467E+00 + PKER_SWETH( 31, 22) = 0.757602E+00 + PKER_SWETH( 31, 23) = 0.705114E+00 + PKER_SWETH( 31, 24) = 0.655793E+00 + PKER_SWETH( 31, 25) = 0.609438E+00 + PKER_SWETH( 31, 26) = 0.565859E+00 + PKER_SWETH( 31, 27) = 0.524877E+00 + PKER_SWETH( 31, 28) = 0.486320E+00 + PKER_SWETH( 31, 29) = 0.450027E+00 + PKER_SWETH( 31, 30) = 0.415842E+00 + PKER_SWETH( 31, 31) = 0.383618E+00 + PKER_SWETH( 31, 32) = 0.353211E+00 + PKER_SWETH( 31, 33) = 0.324485E+00 + PKER_SWETH( 31, 34) = 0.297310E+00 + PKER_SWETH( 31, 35) = 0.271562E+00 + PKER_SWETH( 31, 36) = 0.247124E+00 + PKER_SWETH( 31, 37) = 0.223892E+00 + PKER_SWETH( 31, 38) = 0.201777E+00 + PKER_SWETH( 31, 39) = 0.180710E+00 + PKER_SWETH( 31, 40) = 0.160650E+00 + PKER_SWETH( 31, 41) = 0.141588E+00 + PKER_SWETH( 31, 42) = 0.123552E+00 + PKER_SWETH( 31, 43) = 0.106604E+00 + PKER_SWETH( 31, 44) = 0.908414E-01 + PKER_SWETH( 31, 45) = 0.763931E-01 + PKER_SWETH( 31, 46) = 0.634109E-01 + PKER_SWETH( 31, 47) = 0.520606E-01 + PKER_SWETH( 31, 48) = 0.425084E-01 + PKER_SWETH( 31, 49) = 0.349021E-01 + PKER_SWETH( 31, 50) = 0.293151E-01 + PKER_SWETH( 31, 51) = 0.257350E-01 + PKER_SWETH( 31, 52) = 0.240679E-01 + PKER_SWETH( 31, 53) = 0.241097E-01 + PKER_SWETH( 31, 54) = 0.255670E-01 + PKER_SWETH( 31, 55) = 0.281346E-01 + PKER_SWETH( 31, 56) = 0.314877E-01 + PKER_SWETH( 31, 57) = 0.353359E-01 + PKER_SWETH( 31, 58) = 0.394363E-01 + PKER_SWETH( 31, 59) = 0.436099E-01 + PKER_SWETH( 31, 60) = 0.477319E-01 + PKER_SWETH( 31, 61) = 0.517211E-01 + PKER_SWETH( 31, 62) = 0.555332E-01 + PKER_SWETH( 31, 63) = 0.591462E-01 + PKER_SWETH( 31, 64) = 0.625536E-01 + PKER_SWETH( 31, 65) = 0.657586E-01 + PKER_SWETH( 31, 66) = 0.687686E-01 + PKER_SWETH( 31, 67) = 0.715936E-01 + PKER_SWETH( 31, 68) = 0.742443E-01 + PKER_SWETH( 31, 69) = 0.767313E-01 + PKER_SWETH( 31, 70) = 0.790647E-01 + PKER_SWETH( 31, 71) = 0.812543E-01 + PKER_SWETH( 31, 72) = 0.833091E-01 + PKER_SWETH( 31, 73) = 0.852376E-01 + PKER_SWETH( 31, 74) = 0.870477E-01 + PKER_SWETH( 31, 75) = 0.887468E-01 + PKER_SWETH( 31, 76) = 0.903417E-01 + PKER_SWETH( 31, 77) = 0.918390E-01 + PKER_SWETH( 31, 78) = 0.932447E-01 + PKER_SWETH( 31, 79) = 0.945644E-01 + PKER_SWETH( 31, 80) = 0.958034E-01 + PKER_SWETH( 32, 1) = 0.313260E+01 + PKER_SWETH( 32, 2) = 0.293624E+01 + PKER_SWETH( 32, 3) = 0.275185E+01 + PKER_SWETH( 32, 4) = 0.257872E+01 + PKER_SWETH( 32, 5) = 0.241614E+01 + PKER_SWETH( 32, 6) = 0.226349E+01 + PKER_SWETH( 32, 7) = 0.212015E+01 + PKER_SWETH( 32, 8) = 0.198555E+01 + PKER_SWETH( 32, 9) = 0.185917E+01 + PKER_SWETH( 32, 10) = 0.174049E+01 + PKER_SWETH( 32, 11) = 0.162905E+01 + PKER_SWETH( 32, 12) = 0.152441E+01 + PKER_SWETH( 32, 13) = 0.142615E+01 + PKER_SWETH( 32, 14) = 0.133388E+01 + PKER_SWETH( 32, 15) = 0.124723E+01 + PKER_SWETH( 32, 16) = 0.116587E+01 + PKER_SWETH( 32, 17) = 0.108946E+01 + PKER_SWETH( 32, 18) = 0.101770E+01 + PKER_SWETH( 32, 19) = 0.950309E+00 + PKER_SWETH( 32, 20) = 0.887017E+00 + PKER_SWETH( 32, 21) = 0.827571E+00 + PKER_SWETH( 32, 22) = 0.771732E+00 + PKER_SWETH( 32, 23) = 0.719277E+00 + PKER_SWETH( 32, 24) = 0.669995E+00 + PKER_SWETH( 32, 25) = 0.623686E+00 + PKER_SWETH( 32, 26) = 0.580163E+00 + PKER_SWETH( 32, 27) = 0.539247E+00 + PKER_SWETH( 32, 28) = 0.500771E+00 + PKER_SWETH( 32, 29) = 0.464574E+00 + PKER_SWETH( 32, 30) = 0.430504E+00 + PKER_SWETH( 32, 31) = 0.398415E+00 + PKER_SWETH( 32, 32) = 0.368170E+00 + PKER_SWETH( 32, 33) = 0.339635E+00 + PKER_SWETH( 32, 34) = 0.312682E+00 + PKER_SWETH( 32, 35) = 0.287189E+00 + PKER_SWETH( 32, 36) = 0.263042E+00 + PKER_SWETH( 32, 37) = 0.240131E+00 + PKER_SWETH( 32, 38) = 0.218359E+00 + PKER_SWETH( 32, 39) = 0.197643E+00 + PKER_SWETH( 32, 40) = 0.177917E+00 + PKER_SWETH( 32, 41) = 0.159141E+00 + PKER_SWETH( 32, 42) = 0.141300E+00 + PKER_SWETH( 32, 43) = 0.124409E+00 + PKER_SWETH( 32, 44) = 0.108506E+00 + PKER_SWETH( 32, 45) = 0.936524E-01 + PKER_SWETH( 32, 46) = 0.799192E-01 + PKER_SWETH( 32, 47) = 0.673874E-01 + PKER_SWETH( 32, 48) = 0.561491E-01 + PKER_SWETH( 32, 49) = 0.463031E-01 + PKER_SWETH( 32, 50) = 0.379538E-01 + PKER_SWETH( 32, 51) = 0.312049E-01 + PKER_SWETH( 32, 52) = 0.261105E-01 + PKER_SWETH( 32, 53) = 0.226845E-01 + PKER_SWETH( 32, 54) = 0.208720E-01 + PKER_SWETH( 32, 55) = 0.205205E-01 + PKER_SWETH( 32, 56) = 0.214305E-01 + PKER_SWETH( 32, 57) = 0.233522E-01 + PKER_SWETH( 32, 58) = 0.260139E-01 + PKER_SWETH( 32, 59) = 0.291765E-01 + PKER_SWETH( 32, 60) = 0.326186E-01 + PKER_SWETH( 32, 61) = 0.361785E-01 + PKER_SWETH( 32, 62) = 0.397295E-01 + PKER_SWETH( 32, 63) = 0.431912E-01 + PKER_SWETH( 32, 64) = 0.465163E-01 + PKER_SWETH( 32, 65) = 0.496779E-01 + PKER_SWETH( 32, 66) = 0.526668E-01 + PKER_SWETH( 32, 67) = 0.554823E-01 + PKER_SWETH( 32, 68) = 0.581292E-01 + PKER_SWETH( 32, 69) = 0.606151E-01 + PKER_SWETH( 32, 70) = 0.629486E-01 + PKER_SWETH( 32, 71) = 0.651387E-01 + PKER_SWETH( 32, 72) = 0.671941E-01 + PKER_SWETH( 32, 73) = 0.691232E-01 + PKER_SWETH( 32, 74) = 0.709337E-01 + PKER_SWETH( 32, 75) = 0.726332E-01 + PKER_SWETH( 32, 76) = 0.742284E-01 + PKER_SWETH( 32, 77) = 0.757259E-01 + PKER_SWETH( 32, 78) = 0.771318E-01 + PKER_SWETH( 32, 79) = 0.784516E-01 + PKER_SWETH( 32, 80) = 0.796907E-01 + PKER_SWETH( 33, 1) = 0.314461E+01 + PKER_SWETH( 33, 2) = 0.294825E+01 + PKER_SWETH( 33, 3) = 0.276386E+01 + PKER_SWETH( 33, 4) = 0.259073E+01 + PKER_SWETH( 33, 5) = 0.242816E+01 + PKER_SWETH( 33, 6) = 0.227551E+01 + PKER_SWETH( 33, 7) = 0.213217E+01 + PKER_SWETH( 33, 8) = 0.199757E+01 + PKER_SWETH( 33, 9) = 0.187119E+01 + PKER_SWETH( 33, 10) = 0.175251E+01 + PKER_SWETH( 33, 11) = 0.164108E+01 + PKER_SWETH( 33, 12) = 0.153644E+01 + PKER_SWETH( 33, 13) = 0.143818E+01 + PKER_SWETH( 33, 14) = 0.134592E+01 + PKER_SWETH( 33, 15) = 0.125928E+01 + PKER_SWETH( 33, 16) = 0.117792E+01 + PKER_SWETH( 33, 17) = 0.110152E+01 + PKER_SWETH( 33, 18) = 0.102977E+01 + PKER_SWETH( 33, 19) = 0.962391E+00 + PKER_SWETH( 33, 20) = 0.899114E+00 + PKER_SWETH( 33, 21) = 0.839685E+00 + PKER_SWETH( 33, 22) = 0.783867E+00 + PKER_SWETH( 33, 23) = 0.731436E+00 + PKER_SWETH( 33, 24) = 0.682183E+00 + PKER_SWETH( 33, 25) = 0.635910E+00 + PKER_SWETH( 33, 26) = 0.592429E+00 + PKER_SWETH( 33, 27) = 0.551564E+00 + PKER_SWETH( 33, 28) = 0.513149E+00 + PKER_SWETH( 33, 29) = 0.477025E+00 + PKER_SWETH( 33, 30) = 0.443042E+00 + PKER_SWETH( 33, 31) = 0.411059E+00 + PKER_SWETH( 33, 32) = 0.380937E+00 + PKER_SWETH( 33, 33) = 0.352549E+00 + PKER_SWETH( 33, 34) = 0.325769E+00 + PKER_SWETH( 33, 35) = 0.300478E+00 + PKER_SWETH( 33, 36) = 0.276562E+00 + PKER_SWETH( 33, 37) = 0.253913E+00 + PKER_SWETH( 33, 38) = 0.232431E+00 + PKER_SWETH( 33, 39) = 0.212025E+00 + PKER_SWETH( 33, 40) = 0.192616E+00 + PKER_SWETH( 33, 41) = 0.174143E+00 + PKER_SWETH( 33, 42) = 0.156567E+00 + PKER_SWETH( 33, 43) = 0.139871E+00 + PKER_SWETH( 33, 44) = 0.124064E+00 + PKER_SWETH( 33, 45) = 0.109173E+00 + PKER_SWETH( 33, 46) = 0.952378E-01 + PKER_SWETH( 33, 47) = 0.823015E-01 + PKER_SWETH( 33, 48) = 0.704036E-01 + PKER_SWETH( 33, 49) = 0.595823E-01 + PKER_SWETH( 33, 50) = 0.498785E-01 + PKER_SWETH( 33, 51) = 0.413438E-01 + PKER_SWETH( 33, 52) = 0.340421E-01 + PKER_SWETH( 33, 53) = 0.280430E-01 + PKER_SWETH( 33, 54) = 0.233974E-01 + PKER_SWETH( 33, 55) = 0.201291E-01 + PKER_SWETH( 33, 56) = 0.182206E-01 + PKER_SWETH( 33, 57) = 0.175675E-01 + PKER_SWETH( 33, 58) = 0.180229E-01 + PKER_SWETH( 33, 59) = 0.194061E-01 + PKER_SWETH( 33, 60) = 0.214879E-01 + PKER_SWETH( 33, 61) = 0.240570E-01 + PKER_SWETH( 33, 62) = 0.269359E-01 + PKER_SWETH( 33, 63) = 0.299571E-01 + PKER_SWETH( 33, 64) = 0.330093E-01 + PKER_SWETH( 33, 65) = 0.360092E-01 + PKER_SWETH( 33, 66) = 0.389073E-01 + PKER_SWETH( 33, 67) = 0.416736E-01 + PKER_SWETH( 33, 68) = 0.442952E-01 + PKER_SWETH( 33, 69) = 0.467690E-01 + PKER_SWETH( 33, 70) = 0.490971E-01 + PKER_SWETH( 33, 71) = 0.512851E-01 + PKER_SWETH( 33, 72) = 0.533399E-01 + PKER_SWETH( 33, 73) = 0.552690E-01 + PKER_SWETH( 33, 74) = 0.570798E-01 + PKER_SWETH( 33, 75) = 0.587796E-01 + PKER_SWETH( 33, 76) = 0.603751E-01 + PKER_SWETH( 33, 77) = 0.618729E-01 + PKER_SWETH( 33, 78) = 0.632789E-01 + PKER_SWETH( 33, 79) = 0.645989E-01 + PKER_SWETH( 33, 80) = 0.658382E-01 + PKER_SWETH( 34, 1) = 0.315494E+01 + PKER_SWETH( 34, 2) = 0.295858E+01 + PKER_SWETH( 34, 3) = 0.277419E+01 + PKER_SWETH( 34, 4) = 0.260106E+01 + PKER_SWETH( 34, 5) = 0.243849E+01 + PKER_SWETH( 34, 6) = 0.228584E+01 + PKER_SWETH( 34, 7) = 0.214250E+01 + PKER_SWETH( 34, 8) = 0.200790E+01 + PKER_SWETH( 34, 9) = 0.188152E+01 + PKER_SWETH( 34, 10) = 0.176285E+01 + PKER_SWETH( 34, 11) = 0.165142E+01 + PKER_SWETH( 34, 12) = 0.154678E+01 + PKER_SWETH( 34, 13) = 0.144853E+01 + PKER_SWETH( 34, 14) = 0.135626E+01 + PKER_SWETH( 34, 15) = 0.126963E+01 + PKER_SWETH( 34, 16) = 0.118827E+01 + PKER_SWETH( 34, 17) = 0.111188E+01 + PKER_SWETH( 34, 18) = 0.104014E+01 + PKER_SWETH( 34, 19) = 0.972772E+00 + PKER_SWETH( 34, 20) = 0.909506E+00 + PKER_SWETH( 34, 21) = 0.850090E+00 + PKER_SWETH( 34, 22) = 0.794288E+00 + PKER_SWETH( 34, 23) = 0.741876E+00 + PKER_SWETH( 34, 24) = 0.692646E+00 + PKER_SWETH( 34, 25) = 0.646400E+00 + PKER_SWETH( 34, 26) = 0.602952E+00 + PKER_SWETH( 34, 27) = 0.562126E+00 + PKER_SWETH( 34, 28) = 0.523757E+00 + PKER_SWETH( 34, 29) = 0.487689E+00 + PKER_SWETH( 34, 30) = 0.453773E+00 + PKER_SWETH( 34, 31) = 0.421869E+00 + PKER_SWETH( 34, 32) = 0.391843E+00 + PKER_SWETH( 34, 33) = 0.363568E+00 + PKER_SWETH( 34, 34) = 0.336921E+00 + PKER_SWETH( 34, 35) = 0.311787E+00 + PKER_SWETH( 34, 36) = 0.288054E+00 + PKER_SWETH( 34, 37) = 0.265616E+00 + PKER_SWETH( 34, 38) = 0.244371E+00 + PKER_SWETH( 34, 39) = 0.224227E+00 + PKER_SWETH( 34, 40) = 0.205097E+00 + PKER_SWETH( 34, 41) = 0.186910E+00 + PKER_SWETH( 34, 42) = 0.169607E+00 + PKER_SWETH( 34, 43) = 0.153151E+00 + PKER_SWETH( 34, 44) = 0.137525E+00 + PKER_SWETH( 34, 45) = 0.122734E+00 + PKER_SWETH( 34, 46) = 0.108800E+00 + PKER_SWETH( 34, 47) = 0.957515E-01 + PKER_SWETH( 34, 48) = 0.836164E-01 + PKER_SWETH( 34, 49) = 0.724132E-01 + PKER_SWETH( 34, 50) = 0.621505E-01 + PKER_SWETH( 34, 51) = 0.528311E-01 + PKER_SWETH( 34, 52) = 0.444613E-01 + PKER_SWETH( 34, 53) = 0.370591E-01 + PKER_SWETH( 34, 54) = 0.306644E-01 + PKER_SWETH( 34, 55) = 0.253251E-01 + PKER_SWETH( 34, 56) = 0.210858E-01 + PKER_SWETH( 34, 57) = 0.179868E-01 + PKER_SWETH( 34, 58) = 0.160241E-01 + PKER_SWETH( 34, 59) = 0.151403E-01 + PKER_SWETH( 34, 60) = 0.152366E-01 + PKER_SWETH( 34, 61) = 0.161644E-01 + PKER_SWETH( 34, 62) = 0.177533E-01 + PKER_SWETH( 34, 63) = 0.198251E-01 + PKER_SWETH( 34, 64) = 0.222044E-01 + PKER_SWETH( 34, 65) = 0.247619E-01 + PKER_SWETH( 34, 66) = 0.273765E-01 + PKER_SWETH( 34, 67) = 0.299716E-01 + PKER_SWETH( 34, 68) = 0.324948E-01 + PKER_SWETH( 34, 69) = 0.349138E-01 + PKER_SWETH( 34, 70) = 0.372131E-01 + PKER_SWETH( 34, 71) = 0.393864E-01 + PKER_SWETH( 34, 72) = 0.414343E-01 + PKER_SWETH( 34, 73) = 0.433604E-01 + PKER_SWETH( 34, 74) = 0.451700E-01 + PKER_SWETH( 34, 75) = 0.468695E-01 + PKER_SWETH( 34, 76) = 0.484650E-01 + PKER_SWETH( 34, 77) = 0.499630E-01 + PKER_SWETH( 34, 78) = 0.513692E-01 + PKER_SWETH( 34, 79) = 0.526893E-01 + PKER_SWETH( 34, 80) = 0.539287E-01 + PKER_SWETH( 35, 1) = 0.316382E+01 + PKER_SWETH( 35, 2) = 0.296745E+01 + PKER_SWETH( 35, 3) = 0.278307E+01 + PKER_SWETH( 35, 4) = 0.260994E+01 + PKER_SWETH( 35, 5) = 0.244737E+01 + PKER_SWETH( 35, 6) = 0.229472E+01 + PKER_SWETH( 35, 7) = 0.215138E+01 + PKER_SWETH( 35, 8) = 0.201679E+01 + PKER_SWETH( 35, 9) = 0.189041E+01 + PKER_SWETH( 35, 10) = 0.177173E+01 + PKER_SWETH( 35, 11) = 0.166030E+01 + PKER_SWETH( 35, 12) = 0.155567E+01 + PKER_SWETH( 35, 13) = 0.145742E+01 + PKER_SWETH( 35, 14) = 0.136516E+01 + PKER_SWETH( 35, 15) = 0.127853E+01 + PKER_SWETH( 35, 16) = 0.119718E+01 + PKER_SWETH( 35, 17) = 0.112079E+01 + PKER_SWETH( 35, 18) = 0.104905E+01 + PKER_SWETH( 35, 19) = 0.981692E+00 + PKER_SWETH( 35, 20) = 0.918434E+00 + PKER_SWETH( 35, 21) = 0.859029E+00 + PKER_SWETH( 35, 22) = 0.803239E+00 + PKER_SWETH( 35, 23) = 0.750842E+00 + PKER_SWETH( 35, 24) = 0.701629E+00 + PKER_SWETH( 35, 25) = 0.655404E+00 + PKER_SWETH( 35, 26) = 0.611980E+00 + PKER_SWETH( 35, 27) = 0.571185E+00 + PKER_SWETH( 35, 28) = 0.532852E+00 + PKER_SWETH( 35, 29) = 0.496827E+00 + PKER_SWETH( 35, 30) = 0.462962E+00 + PKER_SWETH( 35, 31) = 0.431119E+00 + PKER_SWETH( 35, 32) = 0.401166E+00 + PKER_SWETH( 35, 33) = 0.372978E+00 + PKER_SWETH( 35, 34) = 0.346435E+00 + PKER_SWETH( 35, 35) = 0.321423E+00 + PKER_SWETH( 35, 36) = 0.297833E+00 + PKER_SWETH( 35, 37) = 0.275561E+00 + PKER_SWETH( 35, 38) = 0.254507E+00 + PKER_SWETH( 35, 39) = 0.234578E+00 + PKER_SWETH( 35, 40) = 0.215686E+00 + PKER_SWETH( 35, 41) = 0.197751E+00 + PKER_SWETH( 35, 42) = 0.180705E+00 + PKER_SWETH( 35, 43) = 0.164495E+00 + PKER_SWETH( 35, 44) = 0.149084E+00 + PKER_SWETH( 35, 45) = 0.134456E+00 + PKER_SWETH( 35, 46) = 0.120615E+00 + PKER_SWETH( 35, 47) = 0.107577E+00 + PKER_SWETH( 35, 48) = 0.953661E-01 + PKER_SWETH( 35, 49) = 0.840018E-01 + PKER_SWETH( 35, 50) = 0.734926E-01 + PKER_SWETH( 35, 51) = 0.638322E-01 + PKER_SWETH( 35, 52) = 0.550036E-01 + PKER_SWETH( 35, 53) = 0.469852E-01 + PKER_SWETH( 35, 54) = 0.397621E-01 + PKER_SWETH( 35, 55) = 0.333353E-01 + PKER_SWETH( 35, 56) = 0.277239E-01 + PKER_SWETH( 35, 57) = 0.229657E-01 + PKER_SWETH( 35, 58) = 0.191037E-01 + PKER_SWETH( 35, 59) = 0.161795E-01 + PKER_SWETH( 35, 60) = 0.142064E-01 + PKER_SWETH( 35, 61) = 0.131510E-01 + PKER_SWETH( 35, 62) = 0.129597E-01 + PKER_SWETH( 35, 63) = 0.135198E-01 + PKER_SWETH( 35, 64) = 0.146888E-01 + PKER_SWETH( 35, 65) = 0.163281E-01 + PKER_SWETH( 35, 66) = 0.182882E-01 + PKER_SWETH( 35, 67) = 0.204331E-01 + PKER_SWETH( 35, 68) = 0.226652E-01 + PKER_SWETH( 35, 69) = 0.249047E-01 + PKER_SWETH( 35, 70) = 0.270982E-01 + PKER_SWETH( 35, 71) = 0.292114E-01 + PKER_SWETH( 35, 72) = 0.312269E-01 + PKER_SWETH( 35, 73) = 0.331361E-01 + PKER_SWETH( 35, 74) = 0.349374E-01 + PKER_SWETH( 35, 75) = 0.366329E-01 + PKER_SWETH( 35, 76) = 0.382268E-01 + PKER_SWETH( 35, 77) = 0.397241E-01 + PKER_SWETH( 35, 78) = 0.411301E-01 + PKER_SWETH( 35, 79) = 0.424503E-01 + PKER_SWETH( 35, 80) = 0.436897E-01 + PKER_SWETH( 36, 1) = 0.317145E+01 + PKER_SWETH( 36, 2) = 0.297509E+01 + PKER_SWETH( 36, 3) = 0.279070E+01 + PKER_SWETH( 36, 4) = 0.261757E+01 + PKER_SWETH( 36, 5) = 0.245500E+01 + PKER_SWETH( 36, 6) = 0.230235E+01 + PKER_SWETH( 36, 7) = 0.215901E+01 + PKER_SWETH( 36, 8) = 0.202442E+01 + PKER_SWETH( 36, 9) = 0.189804E+01 + PKER_SWETH( 36, 10) = 0.177937E+01 + PKER_SWETH( 36, 11) = 0.166794E+01 + PKER_SWETH( 36, 12) = 0.156331E+01 + PKER_SWETH( 36, 13) = 0.146506E+01 + PKER_SWETH( 36, 14) = 0.137280E+01 + PKER_SWETH( 36, 15) = 0.128617E+01 + PKER_SWETH( 36, 16) = 0.120483E+01 + PKER_SWETH( 36, 17) = 0.112844E+01 + PKER_SWETH( 36, 18) = 0.105671E+01 + PKER_SWETH( 36, 19) = 0.989358E+00 + PKER_SWETH( 36, 20) = 0.926106E+00 + PKER_SWETH( 36, 21) = 0.866709E+00 + PKER_SWETH( 36, 22) = 0.810928E+00 + PKER_SWETH( 36, 23) = 0.758542E+00 + PKER_SWETH( 36, 24) = 0.709343E+00 + PKER_SWETH( 36, 25) = 0.663134E+00 + PKER_SWETH( 36, 26) = 0.619730E+00 + PKER_SWETH( 36, 27) = 0.578957E+00 + PKER_SWETH( 36, 28) = 0.540652E+00 + PKER_SWETH( 36, 29) = 0.504659E+00 + PKER_SWETH( 36, 30) = 0.470834E+00 + PKER_SWETH( 36, 31) = 0.439039E+00 + PKER_SWETH( 36, 32) = 0.409142E+00 + PKER_SWETH( 36, 33) = 0.381020E+00 + PKER_SWETH( 36, 34) = 0.354557E+00 + PKER_SWETH( 36, 35) = 0.329639E+00 + PKER_SWETH( 36, 36) = 0.306160E+00 + PKER_SWETH( 36, 37) = 0.284019E+00 + PKER_SWETH( 36, 38) = 0.263117E+00 + PKER_SWETH( 36, 39) = 0.243361E+00 + PKER_SWETH( 36, 40) = 0.224665E+00 + PKER_SWETH( 36, 41) = 0.206945E+00 + PKER_SWETH( 36, 42) = 0.190128E+00 + PKER_SWETH( 36, 43) = 0.174150E+00 + PKER_SWETH( 36, 44) = 0.158961E+00 + PKER_SWETH( 36, 45) = 0.144526E+00 + PKER_SWETH( 36, 46) = 0.130829E+00 + PKER_SWETH( 36, 47) = 0.117873E+00 + PKER_SWETH( 36, 48) = 0.105672E+00 + PKER_SWETH( 36, 49) = 0.942459E-01 + PKER_SWETH( 36, 50) = 0.836094E-01 + PKER_SWETH( 36, 51) = 0.737662E-01 + PKER_SWETH( 36, 52) = 0.647037E-01 + PKER_SWETH( 36, 53) = 0.563958E-01 + PKER_SWETH( 36, 54) = 0.488078E-01 + PKER_SWETH( 36, 55) = 0.419058E-01 + PKER_SWETH( 36, 56) = 0.356633E-01 + PKER_SWETH( 36, 57) = 0.300718E-01 + PKER_SWETH( 36, 58) = 0.251413E-01 + PKER_SWETH( 36, 59) = 0.208989E-01 + PKER_SWETH( 36, 60) = 0.173840E-01 + PKER_SWETH( 36, 61) = 0.146412E-01 + PKER_SWETH( 36, 62) = 0.126895E-01 + PKER_SWETH( 36, 63) = 0.115219E-01 + PKER_SWETH( 36, 64) = 0.111061E-01 + PKER_SWETH( 36, 65) = 0.113656E-01 + PKER_SWETH( 36, 66) = 0.121884E-01 + PKER_SWETH( 36, 67) = 0.134579E-01 + PKER_SWETH( 36, 68) = 0.150470E-01 + PKER_SWETH( 36, 69) = 0.168388E-01 + PKER_SWETH( 36, 70) = 0.187349E-01 + PKER_SWETH( 36, 71) = 0.206605E-01 + PKER_SWETH( 36, 72) = 0.225628E-01 + PKER_SWETH( 36, 73) = 0.244065E-01 + PKER_SWETH( 36, 74) = 0.261718E-01 + PKER_SWETH( 36, 75) = 0.278484E-01 + PKER_SWETH( 36, 76) = 0.294325E-01 + PKER_SWETH( 36, 77) = 0.309251E-01 + PKER_SWETH( 36, 78) = 0.323289E-01 + PKER_SWETH( 36, 79) = 0.336481E-01 + PKER_SWETH( 36, 80) = 0.348872E-01 + PKER_SWETH( 37, 1) = 0.317801E+01 + PKER_SWETH( 37, 2) = 0.298165E+01 + PKER_SWETH( 37, 3) = 0.279727E+01 + PKER_SWETH( 37, 4) = 0.262413E+01 + PKER_SWETH( 37, 5) = 0.246156E+01 + PKER_SWETH( 37, 6) = 0.230891E+01 + PKER_SWETH( 37, 7) = 0.216558E+01 + PKER_SWETH( 37, 8) = 0.203099E+01 + PKER_SWETH( 37, 9) = 0.190461E+01 + PKER_SWETH( 37, 10) = 0.178594E+01 + PKER_SWETH( 37, 11) = 0.167451E+01 + PKER_SWETH( 37, 12) = 0.156988E+01 + PKER_SWETH( 37, 13) = 0.147163E+01 + PKER_SWETH( 37, 14) = 0.137938E+01 + PKER_SWETH( 37, 15) = 0.129275E+01 + PKER_SWETH( 37, 16) = 0.121140E+01 + PKER_SWETH( 37, 17) = 0.113502E+01 + PKER_SWETH( 37, 18) = 0.106330E+01 + PKER_SWETH( 37, 19) = 0.995945E+00 + PKER_SWETH( 37, 20) = 0.932699E+00 + PKER_SWETH( 37, 21) = 0.873307E+00 + PKER_SWETH( 37, 22) = 0.817534E+00 + PKER_SWETH( 37, 23) = 0.765157E+00 + PKER_SWETH( 37, 24) = 0.715968E+00 + PKER_SWETH( 37, 25) = 0.669771E+00 + PKER_SWETH( 37, 26) = 0.626382E+00 + PKER_SWETH( 37, 27) = 0.585627E+00 + PKER_SWETH( 37, 28) = 0.547343E+00 + PKER_SWETH( 37, 29) = 0.511376E+00 + PKER_SWETH( 37, 30) = 0.477581E+00 + PKER_SWETH( 37, 31) = 0.445822E+00 + PKER_SWETH( 37, 32) = 0.415968E+00 + PKER_SWETH( 37, 33) = 0.387898E+00 + PKER_SWETH( 37, 34) = 0.361496E+00 + PKER_SWETH( 37, 35) = 0.336651E+00 + PKER_SWETH( 37, 36) = 0.313259E+00 + PKER_SWETH( 37, 37) = 0.291219E+00 + PKER_SWETH( 37, 38) = 0.270437E+00 + PKER_SWETH( 37, 39) = 0.250820E+00 + PKER_SWETH( 37, 40) = 0.232282E+00 + PKER_SWETH( 37, 41) = 0.214740E+00 + PKER_SWETH( 37, 42) = 0.198119E+00 + PKER_SWETH( 37, 43) = 0.182349E+00 + PKER_SWETH( 37, 44) = 0.167369E+00 + PKER_SWETH( 37, 45) = 0.153134E+00 + PKER_SWETH( 37, 46) = 0.139610E+00 + PKER_SWETH( 37, 47) = 0.126783E+00 + PKER_SWETH( 37, 48) = 0.114653E+00 + PKER_SWETH( 37, 49) = 0.103232E+00 + PKER_SWETH( 37, 50) = 0.925378E-01 + PKER_SWETH( 37, 51) = 0.825827E-01 + PKER_SWETH( 37, 52) = 0.733675E-01 + PKER_SWETH( 37, 53) = 0.648776E-01 + PKER_SWETH( 37, 54) = 0.570830E-01 + PKER_SWETH( 37, 55) = 0.499450E-01 + PKER_SWETH( 37, 56) = 0.434200E-01 + PKER_SWETH( 37, 57) = 0.374691E-01 + PKER_SWETH( 37, 58) = 0.320636E-01 + PKER_SWETH( 37, 59) = 0.271887E-01 + PKER_SWETH( 37, 60) = 0.228498E-01 + PKER_SWETH( 37, 61) = 0.190676E-01 + PKER_SWETH( 37, 62) = 0.158762E-01 + PKER_SWETH( 37, 63) = 0.133176E-01 + PKER_SWETH( 37, 64) = 0.114155E-01 + PKER_SWETH( 37, 65) = 0.101818E-01 + PKER_SWETH( 37, 66) = 0.960151E-02 + PKER_SWETH( 37, 67) = 0.961729E-02 + PKER_SWETH( 37, 68) = 0.101533E-01 + PKER_SWETH( 37, 69) = 0.111109E-01 + PKER_SWETH( 37, 70) = 0.123790E-01 + PKER_SWETH( 37, 71) = 0.138599E-01 + PKER_SWETH( 37, 72) = 0.154599E-01 + PKER_SWETH( 37, 73) = 0.171104E-01 + PKER_SWETH( 37, 74) = 0.187566E-01 + PKER_SWETH( 37, 75) = 0.203627E-01 + PKER_SWETH( 37, 76) = 0.219075E-01 + PKER_SWETH( 37, 77) = 0.233786E-01 + PKER_SWETH( 37, 78) = 0.247714E-01 + PKER_SWETH( 37, 79) = 0.260851E-01 + PKER_SWETH( 37, 80) = 0.273215E-01 + PKER_SWETH( 38, 1) = 0.318365E+01 + PKER_SWETH( 38, 2) = 0.298729E+01 + PKER_SWETH( 38, 3) = 0.280291E+01 + PKER_SWETH( 38, 4) = 0.262978E+01 + PKER_SWETH( 38, 5) = 0.246721E+01 + PKER_SWETH( 38, 6) = 0.231456E+01 + PKER_SWETH( 38, 7) = 0.217122E+01 + PKER_SWETH( 38, 8) = 0.203663E+01 + PKER_SWETH( 38, 9) = 0.191025E+01 + PKER_SWETH( 38, 10) = 0.179158E+01 + PKER_SWETH( 38, 11) = 0.168015E+01 + PKER_SWETH( 38, 12) = 0.157552E+01 + PKER_SWETH( 38, 13) = 0.147728E+01 + PKER_SWETH( 38, 14) = 0.138502E+01 + PKER_SWETH( 38, 15) = 0.129840E+01 + PKER_SWETH( 38, 16) = 0.121706E+01 + PKER_SWETH( 38, 17) = 0.114068E+01 + PKER_SWETH( 38, 18) = 0.106895E+01 + PKER_SWETH( 38, 19) = 0.100161E+01 + PKER_SWETH( 38, 20) = 0.938364E+00 + PKER_SWETH( 38, 21) = 0.878977E+00 + PKER_SWETH( 38, 22) = 0.823209E+00 + PKER_SWETH( 38, 23) = 0.770839E+00 + PKER_SWETH( 38, 24) = 0.721658E+00 + PKER_SWETH( 38, 25) = 0.675471E+00 + PKER_SWETH( 38, 26) = 0.632094E+00 + PKER_SWETH( 38, 27) = 0.591352E+00 + PKER_SWETH( 38, 28) = 0.553085E+00 + PKER_SWETH( 38, 29) = 0.517137E+00 + PKER_SWETH( 38, 30) = 0.483366E+00 + PKER_SWETH( 38, 31) = 0.451634E+00 + PKER_SWETH( 38, 32) = 0.421814E+00 + PKER_SWETH( 38, 33) = 0.393784E+00 + PKER_SWETH( 38, 34) = 0.367429E+00 + PKER_SWETH( 38, 35) = 0.342641E+00 + PKER_SWETH( 38, 36) = 0.319316E+00 + PKER_SWETH( 38, 37) = 0.297355E+00 + PKER_SWETH( 38, 38) = 0.276666E+00 + PKER_SWETH( 38, 39) = 0.257158E+00 + PKER_SWETH( 38, 40) = 0.238746E+00 + PKER_SWETH( 38, 41) = 0.221350E+00 + PKER_SWETH( 38, 42) = 0.204891E+00 + PKER_SWETH( 38, 43) = 0.189299E+00 + PKER_SWETH( 38, 44) = 0.174508E+00 + PKER_SWETH( 38, 45) = 0.160464E+00 + PKER_SWETH( 38, 46) = 0.147120E+00 + PKER_SWETH( 38, 47) = 0.134448E+00 + PKER_SWETH( 38, 48) = 0.122432E+00 + PKER_SWETH( 38, 49) = 0.111072E+00 + PKER_SWETH( 38, 50) = 0.100379E+00 + PKER_SWETH( 38, 51) = 0.903681E-01 + PKER_SWETH( 38, 52) = 0.810492E-01 + PKER_SWETH( 38, 53) = 0.724222E-01 + PKER_SWETH( 38, 54) = 0.644714E-01 + PKER_SWETH( 38, 55) = 0.571675E-01 + PKER_SWETH( 38, 56) = 0.504700E-01 + PKER_SWETH( 38, 57) = 0.443333E-01 + PKER_SWETH( 38, 58) = 0.387134E-01 + PKER_SWETH( 38, 59) = 0.335716E-01 + PKER_SWETH( 38, 60) = 0.288792E-01 + PKER_SWETH( 38, 61) = 0.246214E-01 + PKER_SWETH( 38, 62) = 0.207986E-01 + PKER_SWETH( 38, 63) = 0.174274E-01 + PKER_SWETH( 38, 64) = 0.145371E-01 + PKER_SWETH( 38, 65) = 0.121635E-01 + PKER_SWETH( 38, 66) = 0.103355E-01 + PKER_SWETH( 38, 67) = 0.907165E-02 + PKER_SWETH( 38, 68) = 0.837324E-02 + PKER_SWETH( 38, 69) = 0.820126E-02 + PKER_SWETH( 38, 70) = 0.849900E-02 + PKER_SWETH( 38, 71) = 0.919422E-02 + PKER_SWETH( 38, 72) = 0.101904E-01 + PKER_SWETH( 38, 73) = 0.113982E-01 + PKER_SWETH( 38, 74) = 0.127419E-01 + PKER_SWETH( 38, 75) = 0.141481E-01 + PKER_SWETH( 38, 76) = 0.155678E-01 + PKER_SWETH( 38, 77) = 0.169638E-01 + PKER_SWETH( 38, 78) = 0.183137E-01 + PKER_SWETH( 38, 79) = 0.196037E-01 + PKER_SWETH( 38, 80) = 0.208275E-01 + PKER_SWETH( 39, 1) = 0.318850E+01 + PKER_SWETH( 39, 2) = 0.299214E+01 + PKER_SWETH( 39, 3) = 0.280776E+01 + PKER_SWETH( 39, 4) = 0.263463E+01 + PKER_SWETH( 39, 5) = 0.247206E+01 + PKER_SWETH( 39, 6) = 0.231941E+01 + PKER_SWETH( 39, 7) = 0.217607E+01 + PKER_SWETH( 39, 8) = 0.204148E+01 + PKER_SWETH( 39, 9) = 0.191510E+01 + PKER_SWETH( 39, 10) = 0.179644E+01 + PKER_SWETH( 39, 11) = 0.168501E+01 + PKER_SWETH( 39, 12) = 0.158038E+01 + PKER_SWETH( 39, 13) = 0.148213E+01 + PKER_SWETH( 39, 14) = 0.138988E+01 + PKER_SWETH( 39, 15) = 0.130326E+01 + PKER_SWETH( 39, 16) = 0.122192E+01 + PKER_SWETH( 39, 17) = 0.114554E+01 + PKER_SWETH( 39, 18) = 0.107382E+01 + PKER_SWETH( 39, 19) = 0.100647E+01 + PKER_SWETH( 39, 20) = 0.943232E+00 + PKER_SWETH( 39, 21) = 0.883849E+00 + PKER_SWETH( 39, 22) = 0.828086E+00 + PKER_SWETH( 39, 23) = 0.775721E+00 + PKER_SWETH( 39, 24) = 0.726547E+00 + PKER_SWETH( 39, 25) = 0.680367E+00 + PKER_SWETH( 39, 26) = 0.636998E+00 + PKER_SWETH( 39, 27) = 0.596268E+00 + PKER_SWETH( 39, 28) = 0.558013E+00 + PKER_SWETH( 39, 29) = 0.522080E+00 + PKER_SWETH( 39, 30) = 0.488327E+00 + PKER_SWETH( 39, 31) = 0.456617E+00 + PKER_SWETH( 39, 32) = 0.426823E+00 + PKER_SWETH( 39, 33) = 0.398824E+00 + PKER_SWETH( 39, 34) = 0.372505E+00 + PKER_SWETH( 39, 35) = 0.347761E+00 + PKER_SWETH( 39, 36) = 0.324487E+00 + PKER_SWETH( 39, 37) = 0.302588E+00 + PKER_SWETH( 39, 38) = 0.281972E+00 + PKER_SWETH( 39, 39) = 0.262550E+00 + PKER_SWETH( 39, 40) = 0.244238E+00 + PKER_SWETH( 39, 41) = 0.226957E+00 + PKER_SWETH( 39, 42) = 0.210631E+00 + PKER_SWETH( 39, 43) = 0.195187E+00 + PKER_SWETH( 39, 44) = 0.180559E+00 + PKER_SWETH( 39, 45) = 0.166686E+00 + PKER_SWETH( 39, 46) = 0.153516E+00 + PKER_SWETH( 39, 47) = 0.141008E+00 + PKER_SWETH( 39, 48) = 0.129131E+00 + PKER_SWETH( 39, 49) = 0.117873E+00 + PKER_SWETH( 39, 50) = 0.107233E+00 + PKER_SWETH( 39, 51) = 0.972184E-01 + PKER_SWETH( 39, 52) = 0.878440E-01 + PKER_SWETH( 39, 53) = 0.791184E-01 + PKER_SWETH( 39, 54) = 0.710406E-01 + PKER_SWETH( 39, 55) = 0.635951E-01 + PKER_SWETH( 39, 56) = 0.567529E-01 + PKER_SWETH( 39, 57) = 0.504750E-01 + PKER_SWETH( 39, 58) = 0.447169E-01 + PKER_SWETH( 39, 59) = 0.394327E-01 + PKER_SWETH( 39, 60) = 0.345813E-01 + PKER_SWETH( 39, 61) = 0.301271E-01 + PKER_SWETH( 39, 62) = 0.260446E-01 + PKER_SWETH( 39, 63) = 0.223191E-01 + PKER_SWETH( 39, 64) = 0.189491E-01 + PKER_SWETH( 39, 65) = 0.159459E-01 + PKER_SWETH( 39, 66) = 0.133348E-01 + PKER_SWETH( 39, 67) = 0.111460E-01 + PKER_SWETH( 39, 68) = 0.940775E-02 + PKER_SWETH( 39, 69) = 0.814637E-02 + PKER_SWETH( 39, 70) = 0.736755E-02 + PKER_SWETH( 39, 71) = 0.705182E-02 + PKER_SWETH( 39, 72) = 0.716064E-02 + PKER_SWETH( 39, 73) = 0.763295E-02 + PKER_SWETH( 39, 74) = 0.839614E-02 + PKER_SWETH( 39, 75) = 0.937315E-02 + PKER_SWETH( 39, 76) = 0.104870E-01 + PKER_SWETH( 39, 77) = 0.116808E-01 + PKER_SWETH( 39, 78) = 0.129002E-01 + PKER_SWETH( 39, 79) = 0.141107E-01 + PKER_SWETH( 39, 80) = 0.152883E-01 + PKER_SWETH( 40, 1) = 0.319267E+01 + PKER_SWETH( 40, 2) = 0.299631E+01 + PKER_SWETH( 40, 3) = 0.281193E+01 + PKER_SWETH( 40, 4) = 0.263880E+01 + PKER_SWETH( 40, 5) = 0.247623E+01 + PKER_SWETH( 40, 6) = 0.232358E+01 + PKER_SWETH( 40, 7) = 0.218024E+01 + PKER_SWETH( 40, 8) = 0.204565E+01 + PKER_SWETH( 40, 9) = 0.191927E+01 + PKER_SWETH( 40, 10) = 0.180061E+01 + PKER_SWETH( 40, 11) = 0.168918E+01 + PKER_SWETH( 40, 12) = 0.158455E+01 + PKER_SWETH( 40, 13) = 0.148631E+01 + PKER_SWETH( 40, 14) = 0.139405E+01 + PKER_SWETH( 40, 15) = 0.130743E+01 + PKER_SWETH( 40, 16) = 0.122609E+01 + PKER_SWETH( 40, 17) = 0.114971E+01 + PKER_SWETH( 40, 18) = 0.107800E+01 + PKER_SWETH( 40, 19) = 0.101065E+01 + PKER_SWETH( 40, 20) = 0.947416E+00 + PKER_SWETH( 40, 21) = 0.888036E+00 + PKER_SWETH( 40, 22) = 0.832276E+00 + PKER_SWETH( 40, 23) = 0.779916E+00 + PKER_SWETH( 40, 24) = 0.730746E+00 + PKER_SWETH( 40, 25) = 0.684572E+00 + PKER_SWETH( 40, 26) = 0.641210E+00 + PKER_SWETH( 40, 27) = 0.600488E+00 + PKER_SWETH( 40, 28) = 0.562243E+00 + PKER_SWETH( 40, 29) = 0.526323E+00 + PKER_SWETH( 40, 30) = 0.492583E+00 + PKER_SWETH( 40, 31) = 0.460890E+00 + PKER_SWETH( 40, 32) = 0.431116E+00 + PKER_SWETH( 40, 33) = 0.403140E+00 + PKER_SWETH( 40, 34) = 0.376851E+00 + PKER_SWETH( 40, 35) = 0.352140E+00 + PKER_SWETH( 40, 36) = 0.328907E+00 + PKER_SWETH( 40, 37) = 0.307055E+00 + PKER_SWETH( 40, 38) = 0.286495E+00 + PKER_SWETH( 40, 39) = 0.267140E+00 + PKER_SWETH( 40, 40) = 0.248907E+00 + PKER_SWETH( 40, 41) = 0.231718E+00 + PKER_SWETH( 40, 42) = 0.215498E+00 + PKER_SWETH( 40, 43) = 0.200175E+00 + PKER_SWETH( 40, 44) = 0.185683E+00 + PKER_SWETH( 40, 45) = 0.171959E+00 + PKER_SWETH( 40, 46) = 0.158946E+00 + PKER_SWETH( 40, 47) = 0.146595E+00 + PKER_SWETH( 40, 48) = 0.134867E+00 + PKER_SWETH( 40, 49) = 0.123735E+00 + PKER_SWETH( 40, 50) = 0.113185E+00 + PKER_SWETH( 40, 51) = 0.103216E+00 + PKER_SWETH( 40, 52) = 0.938355E-01 + PKER_SWETH( 40, 53) = 0.850554E-01 + PKER_SWETH( 40, 54) = 0.768835E-01 + PKER_SWETH( 40, 55) = 0.693180E-01 + PKER_SWETH( 40, 56) = 0.623442E-01 + PKER_SWETH( 40, 57) = 0.559346E-01 + PKER_SWETH( 40, 58) = 0.500518E-01 + PKER_SWETH( 40, 59) = 0.446530E-01 + PKER_SWETH( 40, 60) = 0.396945E-01 + PKER_SWETH( 40, 61) = 0.351341E-01 + PKER_SWETH( 40, 62) = 0.309350E-01 + PKER_SWETH( 40, 63) = 0.270668E-01 + PKER_SWETH( 40, 64) = 0.235073E-01 + PKER_SWETH( 40, 65) = 0.202425E-01 + PKER_SWETH( 40, 66) = 0.172698E-01 + PKER_SWETH( 40, 67) = 0.145977E-01 + PKER_SWETH( 40, 68) = 0.122444E-01 + PKER_SWETH( 40, 69) = 0.102365E-01 + PKER_SWETH( 40, 70) = 0.860187E-02 + PKER_SWETH( 40, 71) = 0.736637E-02 + PKER_SWETH( 40, 72) = 0.654201E-02 + PKER_SWETH( 40, 73) = 0.611859E-02 + PKER_SWETH( 40, 74) = 0.607653E-02 + PKER_SWETH( 40, 75) = 0.636809E-02 + PKER_SWETH( 40, 76) = 0.693164E-02 + PKER_SWETH( 40, 77) = 0.770652E-02 + PKER_SWETH( 40, 78) = 0.862610E-02 + PKER_SWETH( 40, 79) = 0.962951E-02 + PKER_SWETH( 40, 80) = 0.106726E-01 +END IF +! +END SUBROUTINE READ_XKER_SWETH diff --git a/src/mesonh/micro/rrcolss.f90 b/src/mesonh/micro/rrcolss.f90 new file mode 100644 index 000000000..527165111 --- /dev/null +++ b/src/mesonh/micro/rrcolss.f90 @@ -0,0 +1,312 @@ +!MNH_LIC Copyright 1995-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ################### + MODULE MODI_RRCOLSS +! ################### +! +INTERFACE +! + SUBROUTINE RRCOLSS( KND, PALPHAS, PNUS, PALPHAR, PNUR, & + PESR, PEXMASSR, PFALLS, PEXFALLS, PFALLR, PEXFALLR, & + PLBDASMAX, PLBDARMAX, PLBDASMIN, PLBDARMIN, & + PDINFTY, PRRCOLSS, PAG, PBS, PAS ) +! +INTEGER, INTENT(IN) :: KND ! Number of discrete size intervals in DS and DR +! +REAL, INTENT(IN) :: PALPHAS ! First shape parameter of the aggregates + ! size distribution (generalized gamma law) +REAL, INTENT(IN) :: PNUS ! Second shape parameter of the aggregates + ! size distribution (generalized gamma law) +REAL, INTENT(IN) :: PALPHAR ! First shape parameter of the rain + ! size distribution (generalized gamma law) +REAL, INTENT(IN) :: PNUR ! Second shape parameter of the rain + ! size distribution (generalized gamma law) +REAL, INTENT(IN) :: PESR ! Efficiency of aggregates collecting rain +REAL, INTENT(IN) :: PEXMASSR ! Mass exponent of rain +REAL, INTENT(IN) :: PFALLS ! Fall speed constant of aggregates +REAL, INTENT(IN) :: PEXFALLS ! Fall speed exponent of aggregates +REAL, INTENT(IN) :: PFALLR ! Fall speed constant of rain +REAL, INTENT(IN) :: PEXFALLR ! Fall speed exponent of rain +REAL, INTENT(IN) :: PLBDASMAX ! Maximun slope of size distribution of aggregates +REAL, INTENT(IN) :: PLBDARMAX ! Maximun slope of size distribution of rain +REAL, INTENT(IN) :: PLBDASMIN ! Minimun slope of size distribution of aggregates +REAL, INTENT(IN) :: PLBDARMIN ! Minimun slope of size distribution of rain +REAL, INTENT(IN) :: PDINFTY ! Factor to define the largest diameter up to + ! which the diameter integration is performed +REAL, INTENT(IN) :: PAG, PBS, PAS +! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PRRCOLSS! Scaled fall speed difference in + ! the mass collection kernel as a + ! function of LAMBDAX and LAMBDAZ +! + END SUBROUTINE RRCOLSS +! +END INTERFACE +! + END MODULE MODI_RRCOLSS +! ######################################################################## + SUBROUTINE RRCOLSS( KND, PALPHAS, PNUS, PALPHAR, PNUR, & + PESR, PEXMASSR, PFALLS, PEXFALLS, PFALLR, PEXFALLR, & + PLBDASMAX, PLBDARMAX, PLBDASMIN, PLBDARMIN, & + PDINFTY, PRRCOLSS, PAG, PBS, PAS ) +! ######################################################################## +! +! +! +!!**** * - Build up a look-up table containing the scaled fall speed +!! difference between size distributed particles of aggregates and Z +!! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to integrate numerically the scaled fall +!! speed difference between aggregates and rain for use in collection +!! kernels. A first integral of the form +!! +!! infty Dz_max +!! / / +!! |{| } +!! |{| E_xz (Dx+Dz)^2 |cxDx^dx-czDz^dz| Dz^bz n(Dz) dDz} n(Dx) dDx +!! |{| } +!! / / +!! 0 Dz_min +!! +!! is evaluated and normalised by a second integral of the form +!! +!! infty +!! / / +!! |{| } +!! |{| (Dx+Dz)^2 Dz^bz n(Dz) dDz} n(Dx) dDx +!! |{| } +!! / / +!! 0 +!! +!! The result is stored in a two-dimensional array. +!! +!!** METHOD +!! ------ +!! The free parameters of the size distribution function of aggregates and Z +!! (slope parameter LAMBDA) are discretized with a geometrical rate in a +!! specific range +!! LAMBDA = exp( (Log(LAMBDA_max) - Log(LAMBDA_min))/N_interval ) +!! The two above integrals are performed using the trapezoidal scheme. +!! +!! EXTERNAL +!! -------- +!! MODI_GENERAL_GAMMA: Generalized gamma distribution law +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! MODD_CST : XPI,XRHOLW +!! MODD_RAIN_ICE_DESCR: XAS,XAS,XBS +!! +!! REFERENCE +!! --------- +!! B.S. Ferrier , 1994 : A Double-Moment Multiple-Phase Four-Class +!! Bulk Ice Scheme,JAS,51,249-280. +!! +!! AUTHOR +!! ------ +!! J.-P. Pinty * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original 8/11/95 +!! +! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! +!------------------------------------------------------------------------------- +! +! +!* 0. DECLARATIONS +! ------------ +! +! +USE MODI_GENERAL_GAMMA +! +USE MODD_CST +USE MODD_RAIN_ICE_DESCR +! +IMPLICIT NONE +! +! +!* 0.1 Declarations of dummy arguments +! ------------------------------- +! +! +INTEGER, INTENT(IN) :: KND ! Number of discrete size intervals in DS and DR +! +REAL, INTENT(IN) :: PALPHAS ! First shape parameter of the aggregates + ! size distribution (generalized gamma law) +REAL, INTENT(IN) :: PNUS ! Second shape parameter of the aggregates + ! size distribution (generalized gamma law) +REAL, INTENT(IN) :: PALPHAR ! First shape parameter of the rain + ! size distribution (generalized gamma law) +REAL, INTENT(IN) :: PNUR ! Second shape parameter of the rain + ! size distribution (generalized gamma law) +REAL, INTENT(IN) :: PESR ! Efficiency of aggregates collecting rain +REAL, INTENT(IN) :: PEXMASSR ! Mass exponent of rain +REAL, INTENT(IN) :: PFALLS ! Fall speed constant of aggregates +REAL, INTENT(IN) :: PEXFALLS ! Fall speed exponent of aggregates +REAL, INTENT(IN) :: PFALLR ! Fall speed constant of rain +REAL, INTENT(IN) :: PEXFALLR ! Fall speed exponent of rain +REAL, INTENT(IN) :: PLBDASMAX ! Maximun slope of size distribution of aggregates +REAL, INTENT(IN) :: PLBDARMAX ! Maximun slope of size distribution of rain +REAL, INTENT(IN) :: PLBDASMIN ! Minimun slope of size distribution of aggregates +REAL, INTENT(IN) :: PLBDARMIN ! Minimun slope of size distribution of rain +REAL, INTENT(IN) :: PDINFTY ! Factor to define the largest diameter up to + ! which the diameter integration is performed +REAL, INTENT(IN) :: PAG, PBS, PAS +! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PRRCOLSS! Scaled fall speed difference in + ! the mass collection kernel as a + ! function of LAMBDAX and LAMBDAZ +! +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +! +INTEGER :: JLBDAS ! Slope index of the size distribution of aggregates +INTEGER :: JLBDAR ! Slope index of the size distribution of rain +INTEGER :: JDS ! Diameter index of a particle of aggregates +INTEGER :: JDR ! Diameter index of a particle of rain +! +INTEGER :: INR ! Number of diameter step for the partial integration +! +! +REAL :: ZLBDAS ! Current slope parameter LAMBDA of aggregates +REAL :: ZLBDAR ! Current slope parameter LAMBDA of rain +REAL :: ZDLBDAS ! Growth rate of the slope parameter LAMBDA of aggregates +REAL :: ZDLBDAR ! Growth rate of the slope parameter LAMBDA of rain +REAL :: ZDDS ! Integration step of the diameter of aggregates +REAL :: ZDDSCALR! Integration step of the diameter of rain (scaling integral) +REAL :: ZDDCOLLR! Integration step of the diameter of rain (fallspe integral) +REAL :: ZDS ! Current diameter of the particle aggregates +REAL :: ZDR ! Current diameter of the rain +REAL :: ZDRMAX ! Maximal diameter of the raindrops where the integration ends +REAL :: ZCOLLR ! Single integral of the mass weighted fall speed difference + ! over the spectrum of rain +REAL :: ZCOLLDRMAX ! Maximum ending point for the partial integral +REAL :: ZCOLLSR ! Double integral of the mass weighted fall speed difference + ! over the spectra of aggregates and rain +REAL :: ZSCALR ! Single integral of the scaling factor over + ! the spectrum of rain +REAL :: ZSCALSR ! Double integral of the scaling factor over + ! the spectra of aggregates and rain +REAL :: ZFUNC ! Ancillary function +REAL :: ZCST1 +! +! +!------------------------------------------------------------------------------- +! +! +!* 1 COMPUTE THE SCALED VELOCITY DIFFERENCE IN THE MASS +!* COLLECTION KERNEL, +! ------------------------------------------------- +! +! +! +!* 1.0 Initialization +! +PRRCOLSS(:,:) = 0.0 +ZCST1 = (3.0/XPI)/XRHOLW +! +!* 1.1 Compute the growth rate of the slope factors LAMBDA +! +ZDLBDAS = EXP( LOG(PLBDASMAX/PLBDASMIN)/REAL(SIZE(PRRCOLSS(:,:),1)-1) ) +ZDLBDAR = EXP( LOG(PLBDARMAX/PLBDARMIN)/REAL(SIZE(PRRCOLSS(:,:),2)-1) ) +! +!* 1.2 Scan the slope factors LAMBDAX and LAMBDAZ +! +DO JLBDAS = 1,SIZE(PRRCOLSS(:,:),1) + ZLBDAS = PLBDASMIN * ZDLBDAS ** (JLBDAS-1) +! +!* 1.3 Compute the diameter steps +! + ZDDS = PDINFTY / (REAL(KND) * ZLBDAS) + DO JLBDAR = 1,SIZE(PRRCOLSS(:,:),2) + ZLBDAR = PLBDARMIN * ZDLBDAR ** (JLBDAR-1) +! +!* 1.4 Initialize the collection integrals +! + ZSCALSR = 0.0 + ZCOLLSR = 0.0 +! +!* 1.5 Compute the diameter steps +! + ZDDSCALR = PDINFTY / (REAL(KND) * ZLBDAR) +! +!* 1.6 Scan over the diameters DS and DR +! + DO JDS = 1,KND-1 + ZDS = ZDDS * REAL(JDS) + ZSCALR = 0.0 + ZCOLLR = 0.0 + DO JDR = 1,KND-1 + ZDR = ZDDSCALR * REAL(JDR) +! +!* 1.7 Compute the normalization factor by integration over the +! dimensional spectrum of rain +! + ZSCALR = ZSCALR + (ZDS+ZDR)**2 * ZDR**PEXMASSR & + * GENERAL_GAMMA(PALPHAR,PNUR,ZLBDAR,ZDR) + END DO +! +!* 1.8 Compute the scaled fall speed difference by partial +! integration over the dimensional spectrum of rain +! + ZFUNC = PAG - PAS*ZDS**(PBS-3.0) ! approximate limit is Ds=240 microns + IF( ZFUNC>0.0 ) THEN + ZDRMAX = ZDS*( ZCST1*ZFUNC )**0.3333333 + ELSE + ZDRMAX = PDINFTY / ZLBDAR + END IF + IF( ZDS>1.0E-4 ) THEN ! allow computation if Ds>100 microns + ! corresponding to a maximal density of the aggregates of XRHOLW + IF( ZDRMAX >= 0.5*ZDDSCALR ) THEN + INR = CEILING( ZDRMAX/ZDDSCALR ) + ZDDCOLLR = ZDRMAX / REAL(INR) + IF (INR>=KND ) THEN + INR = KND + ZDDCOLLR = ZDDSCALR + END IF + DO JDR = 1,INR-1 + ZDR = ZDDCOLLR * REAL(JDR) + ZCOLLR = ZCOLLR + (ZDS+ZDR)**2 * ZDR**PEXMASSR & + * PESR * ABS(PFALLS*ZDS**PEXFALLS-PFALLR*ZDR**PEXFALLR) & + * GENERAL_GAMMA(PALPHAR,PNUR,ZLBDAR,ZDR) + END DO + ZCOLLDRMAX = (ZDS+ZDRMAX)**2 * ZDRMAX**PEXMASSR & + * PESR * ABS(PFALLS*ZDS**PEXFALLS-PFALLR*ZDRMAX**PEXFALLR) & + * GENERAL_GAMMA(PALPHAR,PNUR,ZLBDAR,ZDRMAX) + ZCOLLR = (ZCOLLR + 0.5*ZCOLLDRMAX)*(ZDDCOLLR/ZDDSCALR) +! +!* 1.9 Compute the normalization factor by integration over the +! dimensional spectrum of aggregates +! + ZFUNC = GENERAL_GAMMA(PALPHAS,PNUS,ZLBDAS,ZDS) + ZSCALSR = ZSCALSR + ZSCALR * ZFUNC +! +!* 1.10 Compute the scaled fall speed difference by integration over +! the dimensional spectrum of aggregates +! + ZCOLLSR = ZCOLLSR + ZCOLLR * ZFUNC + END IF +! +! Otherwise ZDRMAX = 0.0 so the density of the graupel cannot be reached +! and so PRRCOLSS(JLBDAS,JLBDAR) = 0.0 ! +! + END IF + END DO +! +!* 1.11 Scale the fall speed difference +! + IF( ZSCALSR>0.0 ) PRRCOLSS(JLBDAS,JLBDAR) = ZCOLLSR / ZSCALSR + END DO +END DO +! +END SUBROUTINE RRCOLSS diff --git a/src/mesonh/micro/rscolrg.f90 b/src/mesonh/micro/rscolrg.f90 new file mode 100644 index 000000000..caa868e91 --- /dev/null +++ b/src/mesonh/micro/rscolrg.f90 @@ -0,0 +1,312 @@ +!MNH_LIC Copyright 1995-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ################### + MODULE MODI_RSCOLRG +! ################### +! +INTERFACE +! + SUBROUTINE RSCOLRG( KND, PALPHAS, PZNUS, PALPHAR, PNUR, & + PESR, PEXMASSS, PFALLS, PEXFALLS, PFALLR, PEXFALLR, & + PLBDASMAX, PLBDARMAX, PLBDASMIN, PLBDARMIN, & + PDINFTY, PRSCOLRG,PAG, PBS, PAS ) +! +INTEGER, INTENT(IN) :: KND ! Number of discrete size intervals in DS and DR +! +REAL, INTENT(IN) :: PALPHAS ! First shape parameter of the aggregates + ! size distribution (generalized gamma law) +REAL, INTENT(IN) :: PZNUS ! Second shape parameter of the aggregates + ! size distribution (generalized gamma law) +REAL, INTENT(IN) :: PALPHAR ! First shape parameter of the rain + ! size distribution (generalized gamma law) +REAL, INTENT(IN) :: PNUR ! Second shape parameter of the rain + ! size distribution (generalized gamma law) +REAL, INTENT(IN) :: PESR ! Efficiency of the aggregates collecting rain +REAL, INTENT(IN) :: PEXMASSS ! Mass exponent of the aggregates +REAL, INTENT(IN) :: PFALLS ! Fall speed constant of the aggregates +REAL, INTENT(IN) :: PEXFALLS ! Fall speed exponent of the aggregates +REAL, INTENT(IN) :: PFALLR ! Fall speed constant of rain +REAL, INTENT(IN) :: PEXFALLR ! Fall speed exponent of rain +REAL, INTENT(IN) :: PLBDASMAX ! Maximun slope of size distribution of the aggregates +REAL, INTENT(IN) :: PLBDARMAX ! Maximun slope of size distribution of rain +REAL, INTENT(IN) :: PLBDASMIN ! Minimun slope of size distribution of the aggregates +REAL, INTENT(IN) :: PLBDARMIN ! Minimun slope of size distribution of rain +REAL, INTENT(IN) :: PDINFTY ! Factor to define the largest diameter up to + ! which the diameter integration is performed +REAL, INTENT(IN) :: PAG, PBS, PAS +! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PRSCOLRG! Scaled fall speed difference in + ! the mass collection kernel as a + ! function of LAMBDAX and LAMBDAZ +! + END SUBROUTINE RSCOLRG +! +END INTERFACE +! + END MODULE MODI_RSCOLRG +! ######################################################################## + SUBROUTINE RSCOLRG( KND, PALPHAS, PZNUS, PALPHAR, PNUR, & + PESR, PEXMASSS, PFALLS, PEXFALLS, PFALLR, PEXFALLR, & + PLBDASMAX, PLBDARMAX, PLBDASMIN, PLBDARMIN, & + PDINFTY, PRSCOLRG,PAG, PBS, PAS ) +! ######################################################################## +! +! +! +!!**** * - Build up a look-up table containing the scaled fall speed +!! difference between size distributed particles of the aggregates and Z +!! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to integrate numerically the scaled fall +!! speed difference between aggregates and rain for use in collection +!! kernels. A first integral of the form +!! +!! infty Dz_max +!! / / +!! |{| } +!! |{| E_xz (Dx+Dz)^2 |cxDx^dx-czDz^dz| Dz^bz n(Dz) dDz} n(Dx) dDx +!! |{| } +!! / / +!! 0 Dz_min +!! +!! is evaluated and normalised by a second integral of the form +!! +!! infty +!! / / +!! |{| } +!! |{| (Dx+Dz)^2 Dz^bz n(Dz) dDz} n(Dx) dDx +!! |{| } +!! / / +!! 0 +!! +!! The result is stored in a two-dimensional array. +!! +!!** METHOD +!! ------ +!! The free parameters of the size distribution function of the aggregates +!! and Z (slope parameter LAMBDA) are discretized with a geometrical rate +!! in a specific range +!! LAMBDA = exp( (Log(LAMBDA_max) - Log(LAMBDA_min))/N_interval ) +!! The two above integrals are performed using the trapezoidal scheme. +!! +!! EXTERNAL +!! -------- +!! MODI_GENERAL_GAMMA: Generalized gamma distribution law +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! MODD_CST : XPI,XRHOLW +!! MODD_RAIN_ICE_DESCR: XAS,XAS,XBS +!! +!! REFERENCE +!! --------- +!! B.S. Ferrier , 1994 : A Double-Moment Multiple-Phase Four-Class +!! Bulk Ice Scheme,JAS,51,249-280. +!! +!! AUTHOR +!! ------ +!! J.-P. Pinty * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original 8/11/95 +!! +! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! +!------------------------------------------------------------------------------- +! +! +!* 0. DECLARATIONS +! ------------ +! +USE MODI_GENERAL_GAMMA +! +USE MODD_CST +USE MODD_RAIN_ICE_DESCR +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments +! ------------------------------- +! +! +INTEGER, INTENT(IN) :: KND ! Number of discrete size intervals in DS and DR +! +REAL, INTENT(IN) :: PALPHAS ! First shape parameter of the aggregates + ! size distribution (generalized gamma law) +REAL, INTENT(IN) :: PZNUS ! Second shape parameter of the aggregates + ! size distribution (generalized gamma law) +REAL, INTENT(IN) :: PALPHAR ! First shape parameter of the rain + ! size distribution (generalized gamma law) +REAL, INTENT(IN) :: PNUR ! Second shape parameter of the rain + ! size distribution (generalized gamma law) +REAL, INTENT(IN) :: PESR ! Efficiency of the aggregates collecting rain +REAL, INTENT(IN) :: PEXMASSS ! Mass exponent of the aggregates +REAL, INTENT(IN) :: PFALLS ! Fall speed constant of the aggregates +REAL, INTENT(IN) :: PEXFALLS ! Fall speed exponent of the aggregates +REAL, INTENT(IN) :: PFALLR ! Fall speed constant of rain +REAL, INTENT(IN) :: PEXFALLR ! Fall speed exponent of rain +REAL, INTENT(IN) :: PLBDASMAX ! Maximun slope of size distribution of the aggregates +REAL, INTENT(IN) :: PLBDARMAX ! Maximun slope of size distribution of rain +REAL, INTENT(IN) :: PLBDASMIN ! Minimun slope of size distribution of the aggregates +REAL, INTENT(IN) :: PLBDARMIN ! Minimun slope of size distribution of rain +REAL, INTENT(IN) :: PDINFTY ! Factor to define the largest diameter up to + ! which the diameter integration is performed +REAL, INTENT(IN) :: PAG, PBS, PAS +! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PRSCOLRG! Scaled fall speed difference in + ! the mass collection kernel as a + ! function of LAMBDAX and LAMBDAZ +! +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +! +INTEGER :: JLBDAS ! Slope index of the size distribution of the aggregates +INTEGER :: JLBDAR ! Slope index of the size distribution of rain +INTEGER :: JDS ! Diameter index of a particle of the aggregates +INTEGER :: JDR ! Diameter index of a particle of rain +! +INTEGER :: INR ! Number of diameter step for the partial integration +! +REAL :: ZLBDAS ! Current slope parameter LAMBDA of the aggregates +REAL :: ZLBDAR ! Current slope parameter LAMBDA of rain +REAL :: ZDLBDAS ! Growth rate of the slope parameter LAMBDA of the aggregates +REAL :: ZDLBDAR ! Growth rate of the slope parameter LAMBDA of rain +REAL :: ZDDS ! Integration step of the diameter of the aggregates +REAL :: ZDDSCALR! Integration step of the diameter of rain (scaling integral) +REAL :: ZDDCOLLR! Integration step of the diameter of rain (fallspe integral) +REAL :: ZDS ! Current diameter of the particle aggregates +REAL :: ZDR ! Current diameter of the raindrops +REAL :: ZDRMIN ! Minimal diameter of the raindrops where the integration starts +REAL :: ZDRMAX ! Maximal diameter of the raindrops where the integration ends +REAL :: ZCOLLR ! Single integral of the mass weighted fall speed difference + ! over the spectrum of rain +REAL :: ZCOLLDRMIN ! Minimum ending point for the partial integral +REAL :: ZCOLLSR ! Double integral of the mass weighted fall speed difference + ! over the spectra of the aggregates and rain +REAL :: ZSCALR ! Single integral of the scaling factor over + ! the spectrum of rain +REAL :: ZSCALSR ! Double integral of the scaling factor over + ! the spectra of the aggregates and rain +REAL :: ZFUNC ! Ancillary function +REAL :: ZCST1 +! +! +!------------------------------------------------------------------------------- +! +! +!* 1 COMPUTE THE SCALED VELOCITY DIFFERENCE IN THE MASS +!* COLLECTION KERNEL, +! ------------------------------------------------- +! +! +!* 1.0 Initialization +! +PRSCOLRG(:,:) = 0.0 +ZCST1 = (3.0/XPI)/XRHOLW +! +!* 1.1 Compute the growth rate of the slope factors LAMBDA +! +ZDLBDAR = EXP( LOG(PLBDARMAX/PLBDARMIN)/REAL(SIZE(PRSCOLRG(:,:),1)-1) ) +ZDLBDAS = EXP( LOG(PLBDASMAX/PLBDASMIN)/REAL(SIZE(PRSCOLRG(:,:),2)-1) ) +! +!* 1.2 Scan the slope factors LAMBDAX and LAMBDAZ +! +DO JLBDAR = 1,SIZE(PRSCOLRG(:,:),1) + ZLBDAR = PLBDARMIN * ZDLBDAR ** (JLBDAR-1) + ZDRMAX = PDINFTY / ZLBDAR +! +!* 1.3 Compute the diameter steps +! + ZDDSCALR = PDINFTY / (REAL(KND) * ZLBDAR) + DO JLBDAS = 1,SIZE(PRSCOLRG(:,:),2) + ZLBDAS = PLBDASMIN * ZDLBDAS ** (JLBDAS-1) +! +!* 1.4 Initialize the collection integrals +! + ZSCALSR = 0.0 + ZCOLLSR = 0.0 +! +!* 1.5 Compute the diameter steps +! + ZDDS = PDINFTY / (REAL(KND) * ZLBDAS) +! +!* 1.6 Scan over the diameters DS and DR +! + DO JDS = 1,KND-1 + ZDS = ZDDS * REAL(JDS) + ZSCALR = 0.0 + ZCOLLR = 0.0 + DO JDR = 1,KND-1 + ZDR = ZDDSCALR * REAL(JDR) +! +!* 1.7 Compute the normalization factor by integration over the +! dimensional spectrum of rain +! + ZSCALR = ZSCALR + (ZDS+ZDR)**2 * GENERAL_GAMMA(PALPHAR,PNUR,ZLBDAR,ZDR) + END DO +! +!* 1.8 Compute the scaled fall speed difference by partial +! integration over the dimensional spectrum of rain +! + ZFUNC = PAG - PAS*ZDS**(PBS-3.0) ! approximate limit is Ds=240 microns + IF( ZFUNC>0.0 ) THEN + ZDRMIN = ZDS*( ZCST1*ZFUNC )**0.3333333 + ELSE + ZDRMIN = 0.0 + END IF + IF( ZDS>1.0E-4 ) THEN ! allow computation if Ds>100 microns + ! corresponding to a maximal density of the aggregates of XRHOLW + IF( (ZDRMAX-ZDRMIN) >= 0.5*ZDDSCALR ) THEN + INR = CEILING( (ZDRMAX-ZDRMIN)/ZDDSCALR ) + ZDDCOLLR = (ZDRMAX-ZDRMIN) / REAL(INR) + DO JDR = 1,INR-1 + ZDR = ZDDCOLLR * REAL(JDR) + ZDRMIN + ZCOLLR = ZCOLLR + (ZDS+ZDR)**2 & + * GENERAL_GAMMA(PALPHAR,PNUR,ZLBDAR,ZDR) & + * PESR * ABS(PFALLS*ZDS**PEXFALLS-PFALLR*ZDR**PEXFALLR) + END DO + IF( ZDRMIN>0.0 ) THEN + ZCOLLDRMIN = (ZDS+ZDRMIN)**2 & + * GENERAL_GAMMA(PALPHAR,PNUR,ZLBDAR,ZDRMIN) & + * PESR * ABS(PFALLS*ZDS**PEXFALLS-PFALLR*ZDRMIN**PEXFALLR) + ELSE + ZCOLLDRMIN = 0.0 + END IF + ZCOLLR = (ZCOLLR + 0.5*ZCOLLDRMIN)*(ZDDCOLLR/ZDDSCALR) +! +!* 1.9 Compute the normalization factor by integration over the +! dimensional spectrum of the aggregates +! + ZFUNC = (ZDS**PEXMASSS) * GENERAL_GAMMA(PALPHAS,PZNUS,ZLBDAS,ZDS) + ZSCALSR = ZSCALSR + ZSCALR * ZFUNC +! +!* 1.10 Compute the scaled fall speed difference by integration over +! the dimensional spectrum of the aggregates +! + ZCOLLSR = ZCOLLSR + ZCOLLR * ZFUNC +! +! Otherwise ZDRMIN>ZDRMAX so PRRCOLSS(JLBDAS,JLBDAR) = 0.0 ! +! + END IF +! +! Otherwise ZDRMAX = 0.0 so the density of the graupel cannot be reached +! and so PRRCOLSS(JLBDAS,JLBDAR) = 0.0 ! +! + END IF + END DO +! +!* 1.10 Scale the fall speed difference +! + IF( ZSCALSR>0.0 ) PRSCOLRG(JLBDAR,JLBDAS) = ZCOLLSR / ZSCALSR + END DO +END DO +! +END SUBROUTINE RSCOLRG diff --git a/src/mesonh/micro/rzcolx.f90 b/src/mesonh/micro/rzcolx.f90 new file mode 100644 index 000000000..28658241c --- /dev/null +++ b/src/mesonh/micro/rzcolx.f90 @@ -0,0 +1,271 @@ +!MNH_LIC Copyright 1995-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ################## + MODULE MODI_RZCOLX +! ################## +! +INTERFACE +! + SUBROUTINE RZCOLX( KND, PALPHAX, PNUX, PALPHAZ, PNUZ, & + PEXZ, PEXMASSZ, PFALLX, PEXFALLX, PFALLZ, PEXFALLZ, & + PLBDAXMAX, PLBDAZMAX, PLBDAXMIN, PLBDAZMIN, & + PDINFTY, PRZCOLX ) +! +INTEGER, INTENT(IN) :: KND ! Number of discrete size intervals in DX and DZ +! +! +REAL, INTENT(IN) :: PALPHAX ! First shape parameter of the specy X + ! size distribution (generalized gamma law) +REAL, INTENT(IN) :: PNUX ! Second shape parameter of the specy X + ! size distribution (generalized gamma law) +REAL, INTENT(IN) :: PALPHAZ ! First shape parameter of the specy Z + ! size distribution (generalized gamma law) +REAL, INTENT(IN) :: PNUZ ! Second shape parameter of the specy Z + ! size distribution (generalized gamma law) +REAL, INTENT(IN) :: PEXZ ! Efficiency of specy X collecting specy Z +REAL, INTENT(IN) :: PEXMASSZ ! Mass exponent of specy Z +REAL, INTENT(IN) :: PFALLX ! Fall speed constant of specy X +REAL, INTENT(IN) :: PEXFALLX ! Fall speed exponent of specy X +REAL, INTENT(IN) :: PFALLZ ! Fall speed constant of specy Z +REAL, INTENT(IN) :: PEXFALLZ ! Fall speed exponent of specy Z +REAL, INTENT(IN) :: PLBDAXMAX ! Maximun slope of size distribution of specy X +REAL, INTENT(IN) :: PLBDAZMAX ! Maximun slope of size distribution of specy Z +REAL, INTENT(IN) :: PLBDAXMIN ! Minimun slope of size distribution of specy X +REAL, INTENT(IN) :: PLBDAZMIN ! Minimun slope of size distribution of specy Z +REAL, INTENT(IN) :: PDINFTY ! Factor to define the largest diameter up to + ! which the diameter integration is performed +! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PRZCOLX ! Scaled fall speed difference in + ! the mass collection kernel as a + ! function of LAMBDAX and LAMBDAZ +! + END SUBROUTINE RZCOLX +! +END INTERFACE +! + END MODULE MODI_RZCOLX +! ######################################################################## + SUBROUTINE RZCOLX( KND, PALPHAX, PNUX, PALPHAZ, PNUZ, & + PEXZ, PEXMASSZ, PFALLX, PEXFALLX, PFALLZ, PEXFALLZ, & + PLBDAXMAX, PLBDAZMAX, PLBDAXMIN, PLBDAZMIN, & + PDINFTY, PRZCOLX ) +! ######################################################################## +! +! +! +!!**** * - Build up a look-up table containing the scaled fall speed +!! difference between size distributed particles of specy X and Z +!! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to integrate numerically the scaled fall +!! speed difference between specy X and specy Z for use in collection +!! kernels. A first integral of the form +!! +!! infty +!! / / +!! |{| } +!! |{| E_xz (Dx+Dz)^2 |cxDx^dx-czDz^dz| Dz^bz g(Dz) dDz} g(Dx) dDx +!! |{| } +!! / / +!! 0 +!! +!! is evaluated and normalised by a second integral of the form +!! +!! infty +!! / / +!! |{| } +!! |{| (Dx+Dz)^2 Dz^bz g(Dz) dDz} g(Dx) dDx +!! |{| } +!! / / +!! 0 +!! +!! where E_xz is a collection efficiency, g(D) is the generalized Gamma +!! distribution law. The 'infty' diameter is defined according to the +!! current value of the Lbda that is D_x=PDINFTY/Lbda_x or +!! D_z=PINFTY/Lbda_z. +!! The result is stored in a two-dimensional array. +!! +!!** METHOD +!! ------ +!! The free parameters of the size distribution function of specy X and Z +!! (slope parameter LAMBDA) are discretized with a geometrical rate in a +!! specific range +!! LAMBDA = exp( (Log(LAMBDA_max) - Log(LAMBDA_min))/N_interval ) +!! The two above integrals are performed using the trapezoidal scheme and +!! the [0,infty] interval is discretized over KND values of D_x or D_z. +!! +!! EXTERNAL +!! -------- +!! MODI_GENERAL_GAMMA: Generalized gamma distribution law +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! B.S. Ferrier , 1994 : A Double-Moment Multiple-Phase Four-Class +!! Bulk Ice Scheme,JAS,51,249-280. +!! +!! AUTHOR +!! ------ +!! J.-P. Pinty * Laboratoire d'Aerologie * +!! +!! MODIFICATIONS +!! ------------- +!! Original 8/11/95 +!! +! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! +!------------------------------------------------------------------------------- +! +! +!* 0. DECLARATIONS +! ------------ +! +USE MODI_GENERAL_GAMMA +! +IMPLICIT NONE +! +! +!* 0.1 Declarations of dummy arguments +! ------------------------------- +! +! +INTEGER, INTENT(IN) :: KND ! Number of discrete size intervals in DX and DZ +! +! +REAL, INTENT(IN) :: PALPHAX ! First shape parameter of the specy X + ! size distribution (generalized gamma law) +REAL, INTENT(IN) :: PNUX ! Second shape parameter of the specy X + ! size distribution (generalized gamma law) +REAL, INTENT(IN) :: PALPHAZ ! First shape parameter of the specy Z + ! size distribution (generalized gamma law) +REAL, INTENT(IN) :: PNUZ ! Second shape parameter of the specy Z + ! size distribution (generalized gamma law) +REAL, INTENT(IN) :: PEXZ ! Efficiency of specy X collecting specy Z +REAL, INTENT(IN) :: PEXMASSZ ! Mass exponent of specy Z +REAL, INTENT(IN) :: PFALLX ! Fall speed constant of specy X +REAL, INTENT(IN) :: PEXFALLX ! Fall speed exponent of specy X +REAL, INTENT(IN) :: PFALLZ ! Fall speed constant of specy Z +REAL, INTENT(IN) :: PEXFALLZ ! Fall speed exponent of specy Z +REAL, INTENT(IN) :: PLBDAXMAX ! Maximun slope of size distribution of specy X +REAL, INTENT(IN) :: PLBDAZMAX ! Maximun slope of size distribution of specy Z +REAL, INTENT(IN) :: PLBDAXMIN ! Minimun slope of size distribution of specy X +REAL, INTENT(IN) :: PLBDAZMIN ! Minimun slope of size distribution of specy Z +REAL, INTENT(IN) :: PDINFTY ! Factor to define the largest diameter up to + ! which the diameter integration is performed +! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PRZCOLX ! Scaled fall speed difference in + ! the mass collection kernel as a + ! function of LAMBDAX and LAMBDAZ +! +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +! +INTEGER :: JLBDAX ! Slope index of the size distribution of specy X +INTEGER :: JLBDAZ ! Slope index of the size distribution of specy Z +INTEGER :: JDX ! Diameter index of a particle of specy X +INTEGER :: JDZ ! Diameter index of a particle of specy Z +! +! +REAL :: ZLBDAX ! Current slope parameter LAMBDA of specy X +REAL :: ZLBDAZ ! Current slope parameter LAMBDA of specy Z +REAL :: ZDLBDAX ! Growth rate of the slope parameter LAMBDA of specy X +REAL :: ZDLBDAZ ! Growth rate of the slope parameter LAMBDA of specy Z +REAL :: ZDDX ! Integration step of the diameter of specy X +REAL :: ZDDZ ! Integration step of the diameter of specy Z +REAL :: ZDX ! Current diameter of the particle specy X +REAL :: ZDZ ! Current diameter of the particle specy Z +REAL :: ZCOLLZ ! Single integral of the mass weighted fall speed difference + ! over the spectrum of specy Z +REAL :: ZCOLLXZ ! Double integral of the mass weighted fall speed difference + ! over the spectra of specy X and specy Z +REAL :: ZSCALZ ! Single integral of the scaling factor over + ! the spectrum of specy Z +REAL :: ZSCALXZ ! Double integral of the scaling factor over + ! the spectra of specy X and specy Z +REAL :: ZFUNC ! Ancillary function +! +! +!------------------------------------------------------------------------------- +! +! +!* 1 COMPUTE THE SCALED VELOCITZ DIFFERENCE IN THE MASS +!* COLLECTION KERNEL, +! ------------------------------------------------- +! +! +! +!* 1.1 Compute the growth rate of the slope factors LAMBDA +! +ZDLBDAX = EXP( LOG(PLBDAXMAX/PLBDAXMIN)/REAL(SIZE(PRZCOLX(:,:),1)-1) ) +ZDLBDAZ = EXP( LOG(PLBDAZMAX/PLBDAZMIN)/REAL(SIZE(PRZCOLX(:,:),2)-1) ) +! +!* 1.2 Scan the slope factors LAMBDAX and LAMBDAZ +! +DO JLBDAX = 1,SIZE(PRZCOLX(:,:),1) + ZLBDAX = PLBDAXMIN * ZDLBDAX ** (JLBDAX-1) + DO JLBDAZ = 1,SIZE(PRZCOLX(:,:),2) + ZLBDAZ = PLBDAZMIN * ZDLBDAZ ** (JLBDAZ-1) +! +!* 1.3 Initialize the collection integrals +! + ZSCALXZ = 0.0 + ZCOLLXZ = 0.0 +! +!* 1.4 Compute the diameter steps +! + ZDDX = PDINFTY / (REAL(KND) * ZLBDAX) + ZDDZ = PDINFTY / (REAL(KND) * ZLBDAZ) +! +!* 1.5 Scan over the diameters DX and DZ +! + DO JDX = 1,KND-1 + ZDX = ZDDX * REAL(JDX) +! + ZSCALZ = 0.0 + ZCOLLZ = 0.0 + DO JDZ = 1,KND-1 + ZDZ = ZDDZ * REAL(JDZ) +! +!* 1.6 Compute the normalization factor by integration over the +! dimensional spectrum of specy Z +! + ZFUNC = (ZDX+ZDZ)**2 * ZDZ**PEXMASSZ & + * GENERAL_GAMMA(PALPHAZ,PNUZ,ZLBDAZ,ZDZ) + ZSCALZ = ZSCALZ + ZFUNC +! +!* 1.7 Compute the scaled fall speed difference by integration over +! the dimensional spectrum of specy Z +! + ZCOLLZ = ZCOLLZ + ZFUNC & + * PEXZ * ABS(PFALLX*ZDX**PEXFALLX-PFALLZ*ZDZ**PEXFALLZ) + END DO +! +!* 1.8 Compute the normalization factor by integration over the +! dimensional spectrum of specy X +! + ZFUNC = GENERAL_GAMMA(PALPHAX,PNUX,ZLBDAX,ZDX) + ZSCALXZ = ZSCALXZ + ZSCALZ * ZFUNC +! +!* 1.9 Compute the scaled fall speed difference by integration over +! the dimensional spectrum of specy X +! + ZCOLLXZ = ZCOLLXZ + ZCOLLZ * ZFUNC + END DO +! +!* 1.10 Scale the fall speed difference +! + PRZCOLX(JLBDAX,JLBDAZ) = ZCOLLXZ / ZSCALXZ + END DO +END DO +! +END SUBROUTINE RZCOLX diff --git a/src/mesonh/micro/set_conc_lima.f90 b/src/mesonh/micro/set_conc_lima.f90 new file mode 100644 index 000000000..3eeda7f5a --- /dev/null +++ b/src/mesonh/micro/set_conc_lima.f90 @@ -0,0 +1,200 @@ +!MNH_LIC Copyright 2000-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!####################################### +module mode_set_conc_lima +!####################################### + +implicit none + +contains + +! ########################################################################### + SUBROUTINE SET_CONC_LIMA( kmi, HGETCLOUD, PRHODREF, PRT, PSVT ) +! ########################################################################### +! +!!**** *SET_CONC_LIMA * - initialize droplet, raindrop and ice +!! concentration for a RESTArt simulation of the LIMA scheme +!! +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to initialize cloud droplet and rain drop +!! concentrations when the cloud droplet and rain drop mixing ratios are +!! only available (generally from a previous run using the Kessler scheme). +!! This routine is used to initialize the droplet/drop concentrations +!! using the r_c and r_r of a previous REVE or KESS run but also to compute +!! the LB tendencies in ONE_WAY$n in case of grid-nesting when the optional +!! argument PTIME is set (a LIMA run embedded in a KESS or REVE run). +!! +!!** METHOD +!! ------ +!! The method assumes a Csk law for the activation of aerososl with "s" +!! the supersaturation (here 0.05 % is chosen). A Marshall-Palmer law with +!! N_o=10**(-7) m**(-4) is assumed for the rain drop concentration. +!! The initialization of the PSVT is straightforward for the cloud droplets +!! while N_r=N_0/Lambda_r with Rho*r_r=Pi*Rho_w*N_0/(Lambda_r**4) is used for +!! the rain drops. The HGETCLOUD test is used to discriminate between the +!! 'REVE' and 'KESS' options for CCLOUD in the previous run (from which +!! PRT was calculated). +!! +!! EXTERNAL +!! -------- +!! None +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_RAIN_C2R2_DESCR, ONLY : XRTMIN, XCTMIN +!! Module MODD_RAIN_C2R2_KHKO_PARAM, ONLY : XCONCC_INI, XCONCR_PARAM_INI +!! Module MODD_CONF, ONLY : NVERB +!! +!! REFERENCE +!! --------- +!! Book2 of documentation ( routine SET_CONC_RAIN_C2R2 ) +!! +!! AUTHOR +!! ------ +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! P. Jabouille * CNRM/GMME * +!! B. Vié * CNRM/GMME * +!! +!! MODIFICATIONS +!! ------------- +!! Original 15/11/00 +!! 2014 G.Delautier : remplace MODD_RAIN_C2R2_PARAM par MODD_RAIN_C2R2_KHKO_PARAM * +!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +! B. Vié 03/03/2020: secure physical tests +! P. Wautelet 04/06/2020: correct array start for microphys. concentrations + add kmi dummy argument +! (this subroutine is also called for other models) +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAM_LIMA, ONLY : XRTMIN, XCTMIN, LCOLD, LWARM, LRAIN, NMOD_CCN, NMOD_IFN +USE MODD_PARAM_LIMA_COLD, ONLY : XAI, XBI +USE MODD_NSV, ONLY : NSV_LIMA_BEG_A, NSV_LIMA_NC_A, NSV_LIMA_NR_A, NSV_LIMA_CCN_ACTI_A, & + NSV_LIMA_NI_A, NSV_LIMA_IFN_NUCL_A +USE MODD_CST, ONLY : XPI, XRHOLW, XRHOLI +USE MODD_CONF, ONLY : NVERB +USE MODD_CONF_n, ONLY : NRR +USE MODD_LUNIT_n, ONLY : TLUOUT +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +integer, intent(in) :: kmi ! Model number +CHARACTER (LEN=4), INTENT(IN) :: HGETCLOUD ! Get indicator +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! Reference density +! +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRT ! microphysical mixing ratios +! +REAL, DIMENSION(:,:,:,NSV_LIMA_BEG_A(kmi):), INTENT(INOUT):: PSVT ! microphys. concentrations +! +! +!* 0.2 Declarations of local variables : +! +INTEGER :: IRESP ! Return code of FM routines +INTEGER :: ILUOUT ! Logical unit number of output-listing +REAL :: ZCONCC, ZCONCR, ZCONCI +! +!------------------------------------------------------------------------------- +!* 1. RETRIEVE LOGICAL UNIT NUMBER +! ---------------------------- +! +ILUOUT = TLUOUT%NLU +! +!* 2. INITIALIZATION +! -------------- +! +IF (LWARM .AND. NRR.GE.2) THEN +! +! droplets +! + ZCONCC = 300.E6 ! droplet concentration set at 300 cm-3 + WHERE ( PRT(:,:,:,2) > 1.E-11 ) + PSVT(:,:,:,NSV_LIMA_NC_A(kmi)) = ZCONCC + END WHERE + WHERE ( PRT(:,:,:,2) <= 1.E-11 ) + PRT(:,:,:,2) = 0.0 + PSVT(:,:,:,NSV_LIMA_NC_A(kmi)) = 0.0 + END WHERE + + IF (NMOD_CCN .GE. 1) THEN + WHERE ( PRT(:,:,:,2) > 1.E-11 ) + PSVT(:,:,:,NSV_LIMA_CCN_ACTI_A(kmi)) = ZCONCC + END WHERE + WHERE ( PRT(:,:,:,2) <= 1.E-11 ) + PSVT(:,:,:,NSV_LIMA_CCN_ACTI_A(kmi)) = 0.0 + END WHERE + END IF + + IF( NVERB >= 5 ) THEN + WRITE (UNIT=ILUOUT,FMT=*) "!INI_MODEL$n: The droplet concentration has " + WRITE (UNIT=ILUOUT,FMT=*) "been roughly initialised" + END IF +END IF +! +IF (LWARM .AND. LRAIN .AND. NRR.GE.3) THEN +! +! drops +! + ZCONCR = (1.E7)**3/(XPI*XRHOLW) ! cf XCONCR_PARAM_INI in ini_rain_c2r2.f90 + IF (HGETCLOUD == 'INI1') THEN ! init from REVE scheme + PSVT(:,:,:,NSV_LIMA_NR_A(kmi)) = 0.0 + ELSE ! init from KESS, ICE3... + WHERE ( PRT(:,:,:,3) > 1.E-11 ) + PSVT(:,:,:,NSV_LIMA_NR_A(kmi)) = MAX( SQRT(SQRT(PRHODREF(:,:,:)*PRT(:,:,:,3) & + *ZCONCR)),1. ) + END WHERE + WHERE ( PRT(:,:,:,3) <= 1.E-11 ) + PRT(:,:,:,3) = 0.0 + PSVT(:,:,:,NSV_LIMA_NR_A(kmi)) = 0.0 + END WHERE + IF( NVERB >= 5 ) THEN + WRITE (UNIT=ILUOUT,FMT=*) "!INI_MODEL$n: The raindrop concentration has " + WRITE (UNIT=ILUOUT,FMT=*) "been roughly initialised" + END IF + END IF +END IF +! +IF (LCOLD .AND. NRR.GE.4) THEN +! +! ice crystals +! + ZCONCI = 100.E3 ! maximum ice concentration set at 100/L + WHERE ( PRT(:,:,:,4) > 1.E-11 ) +! +! PSVT(:,:,:,NSV_LIMA_NI_A(kmi)) = MIN( PRHODREF(:,:,:) / & +! ( XRHOLI * XAI*(10.E-06)**XBI * PRT(:,:,:,4) ), & +! ZCONCI ) +! Correction + PSVT(:,:,:,NSV_LIMA_NI_A(kmi)) = MIN(PRT(:,:,:,4)/(0.82*(10.E-06)**2.5),ZCONCI ) + END WHERE + WHERE ( PRT(:,:,:,4) <= 1.E-11 ) + PRT(:,:,:,4) = 0.0 + PSVT(:,:,:,NSV_LIMA_NI_A(kmi)) = 0.0 + END WHERE + + IF (NMOD_IFN .GE. 1) THEN + WHERE ( PRT(:,:,:,4) > 1.E-11 ) + PSVT(:,:,:,NSV_LIMA_IFN_NUCL_A(kmi)) = PSVT(:,:,:,NSV_LIMA_NI_A(kmi)) + END WHERE + WHERE ( PRT(:,:,:,4) <= 1.E-11 ) + PSVT(:,:,:,NSV_LIMA_IFN_NUCL_A(kmi)) = 0.0 + END WHERE + END IF + + IF( NVERB >= 5 ) THEN + WRITE (UNIT=ILUOUT,FMT=*) "!INI_MODEL$n: The cloud ice concentration has " + WRITE (UNIT=ILUOUT,FMT=*) "been roughly initialised" + END IF +! +END IF +! +END SUBROUTINE SET_CONC_LIMA + +end module mode_set_conc_lima diff --git a/src/mesonh/turb/bl89.f90 b/src/mesonh/turb/bl89.f90 new file mode 100644 index 000000000..8d9fe3e36 --- /dev/null +++ b/src/mesonh/turb/bl89.f90 @@ -0,0 +1,396 @@ +!MNH_LIC Copyright 1997-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ################ + MODULE MODI_BL89 +! ################ +INTERFACE + SUBROUTINE BL89(KKA,KKU,KKL,PZZ,PDZZ,PTHVREF,PTHLM,KRR,PRM,PTKEM,PSHEAR,PLM) +! +INTEGER, INTENT(IN) :: KKA +INTEGER, INTENT(IN) :: KKU +INTEGER, INTENT(IN) :: KKL +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM +INTEGER, INTENT(IN) :: KRR +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSHEAR +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLM + +END SUBROUTINE BL89 +END INTERFACE +END MODULE MODI_BL89 +! +! ######################################################### + SUBROUTINE BL89(KKA,KKU,KKL,PZZ,PDZZ,PTHVREF,PTHLM,KRR,PRM,PTKEM,PSHEAR,PLM) +! ######################################################### +! +!!**** *BL89* - +!! +!! PURPOSE +!! ------- +!! This routine computes the mixing length from Bougeault-Lacarrere 89 +!! formula. +!! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! +!! REFERENCE +!! --------- +!! +!! Book 2 +!! +!! AUTHOR +!! ------ +!! +!! J. Cuxart INM and Meteo-France +!! +!! MODIFICATIONS +!! ------------- +!! Original 27/04/97 (V. Masson) separation from turb.f90 +!! and optimization +!! 06/01/98 (V. Masson and P. Jabouille) optimization +!! 15/03/99 (V. Masson) new lup ldown averaging +!! 21/02/01 (P. Jabouille) improve vectorization +!! 2012-02 (Y. Seity) add possibility to run with +!! reversed vertical levels +!! Philippe 13/02/2018: use ifdef MNH_REAL to prevent problems with intrinsics on Blue Gene/Q +!! 01/2019 (Q. Rodier) support for RM17 mixing length +!! 03/2021 (JL Redelsperger) Ocean model case +!! 06/2021 (P. Marquet) correction of exponent on final length according to Lemarié et al. 2021 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CONF, ONLY: CPROGRAM +USE MODD_CST +USE MODD_CTURB +USE MODD_DYN_n, ONLY: LOCEAN +USE MODD_PARAMETERS +use modd_precision, only: MNHREAL +! +! +IMPLICIT NONE +! +!* 0.1 Declaration of arguments +! ------------------------ +! +INTEGER, INTENT(IN) :: KKA !near ground array index +INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM ! conservative pot. temp. +INTEGER, INTENT(IN) :: KRR +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! water var. +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSHEAR +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLM ! Mixing length +! thermodynamical variables PTHLM=Theta at the begining +! +!* 0.2 Declaration of local variables +! ------------------------------ +! +INTEGER :: IKB,IKE +INTEGER :: IKT ! array size in k direction +INTEGER :: IKTB,IKTE ! start, end of k loops in physical domain + +REAL, DIMENSION(SIZE(PTKEM,1)*SIZE(PTKEM,2),SIZE(PTKEM,3)) :: ZVPT ! Virtual Potential Temp at half levels +REAL, DIMENSION(SIZE(PTKEM,1)*SIZE(PTKEM,2),SIZE(PTKEM,3)) :: ZDELTVPT + ! Increment of Virtual Potential Temp between two following levels +REAL, DIMENSION(SIZE(PTKEM,1)*SIZE(PTKEM,2),SIZE(PTKEM,3)) :: ZHLVPT + ! Virtual Potential Temp at half levels +REAL, DIMENSION(SIZE(PTKEM,1)*SIZE(PTKEM,2)) :: ZLWORK,ZINTE +! ! downwards then upwards vertical displacement, +! ! residual internal energy, +! ! residual potential energy +REAL, DIMENSION(SIZE(PTKEM,1)*SIZE(PTKEM,2),SIZE(PTKEM,3)) :: ZZZ,ZDZZ, & + ZG_O_THVREF, & + ZTHM,ZTKEM,ZLM, & + ZLMDN,ZSHEAR, & + ZSQRT_TKE +! ! input and output arrays packed according one horizontal coord. +REAL, DIMENSION(SIZE(PRM,1)*SIZE(PRM,2),SIZE(PRM,3),SIZE(PRM,4)) :: ZRM +! ! input array packed according one horizontal coord. +REAL, DIMENSION(SIZE(PRM,1)*SIZE(PRM,2),SIZE(PRM,3)) :: ZSUM ! to replace SUM function +! +INTEGER :: IIU,IJU +INTEGER :: J1D ! horizontal loop counter +INTEGER :: JK,JKK,J3RD ! loop counters +INTEGER :: JRR ! moist loop counter +REAL :: ZRVORD ! Rv/Rd +REAL :: ZPOTE,ZLWORK1,ZLWORK2 +REAL :: ZTEST,ZTEST0,ZTESTM ! test for vectorization +REAL :: Z2SQRT2,ZUSRBL89,ZBL89EXP +!------------------------------------------------------------------------------- +! +Z2SQRT2=2.*SQRT(2.) +IIU=SIZE(PTKEM,1) +IJU=SIZE(PTKEM,2) +! +IKB=KKA+JPVEXT_TURB*KKL +IKE=KKU-JPVEXT_TURB*KKL + +IKTB = JPVEXT_TURB + 1 +IKT = SIZE(PTKEM,3) +IKTE = IKT-JPVEXT_TURB +ZRVORD = XRV / XRD +! +!------------------------------------------------------------------------------- +! +!* 1. pack the horizontal dimensions into one +! --------------------------------------- +! +IF (CPROGRAM=='AROME ') THEN + DO JK=1,IKT + ZZZ (:,JK) = PZZ (:,1,JK) + ZDZZ (:,JK) = PDZZ (:,1,JK) + ZTHM (:,JK) = PTHLM (:,1,JK) + ZTKEM (:,JK) = PTKEM (:,1,JK) + ZG_O_THVREF(:,JK) = XG/PTHVREF(:,1,JK) + END DO + DO JK=1,IKT + DO JRR=1,KRR + ZRM (:,JK,JRR) = PRM (:,1,JK,JRR) + END DO + END DO +ELSE + DO JK=1,IKT + ZZZ (:,JK) = RESHAPE(PZZ (:,:,JK),(/ IIU*IJU /) ) + ZDZZ (:,JK) = RESHAPE(PDZZ (:,:,JK),(/ IIU*IJU /) ) + ZTHM (:,JK) = RESHAPE(PTHLM (:,:,JK),(/ IIU*IJU /) ) + ZSHEAR (:,JK) = RESHAPE(PSHEAR (:,:,JK),(/ IIU*IJU /) ) + ZTKEM (:,JK) = RESHAPE(PTKEM (:,:,JK),(/ IIU*IJU /) ) + ZG_O_THVREF(:,JK) = RESHAPE(XG/PTHVREF(:,:,JK),(/ IIU*IJU /) ) + IF (LOCEAN) ZG_O_THVREF(:,JK) = XG * XALPHAOC + DO JRR=1,KRR + ZRM (:,JK,JRR) = RESHAPE(PRM (:,:,JK,JRR),(/ IIU*IJU /) ) + END DO + END DO +END IF +! +ZSQRT_TKE = SQRT(ZTKEM) +! +!ZBL89EXP is defined here because (and not in ini_cturb) because XCED is defined in read_exseg (depending on BL89/RM17) +ZBL89EXP = LOG(16.)/(4.*LOG(XKARMAN)+LOG(XCED)-3.*LOG(XCMFS)) +ZUSRBL89 = 1./ZBL89EXP +!------------------------------------------------------------------------------- +! +!* 2. Virtual potential temperature on the model grid +! ----------------------------------------------- +! +IF(KRR /= 0) THEN + ZSUM(:,:) = 0. + DO JRR=1,KRR + ZSUM(:,:) = ZSUM(:,:)+ZRM(:,:,JRR) + ENDDO + ZVPT(:,1:)=ZTHM(:,:) * ( 1. + ZRVORD*ZRM(:,:,1) ) & + / ( 1. + ZSUM(:,:) ) +ELSE + ZVPT(:,1:)=ZTHM(:,:) +END IF +! +!!!!!!!!!!!! +!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!! WARNING !! +!!!!!!!!!!!! +!!!!!!!!!!!! +!Any modification done to the following lines and to the sections 4 and +!6 must be copied in compute_bl89_ml routine. +!We do not call directly this routine for numerical performance reasons +!but algorithm must remain the same. +!!!!!!!!!!!! + +ZDELTVPT(:,IKTB:IKTE)=ZVPT(:,IKTB:IKTE)-ZVPT(:,IKTB-KKL:IKTE-KKL) +ZDELTVPT(:,KKU)=ZVPT(:,KKU)-ZVPT(:,KKU-KKL) +ZDELTVPT(:,KKA)=0. +WHERE (ABS(ZDELTVPT(:,:))<XLINF) + ZDELTVPT(:,:)=XLINF +END WHERE +! +ZHLVPT(:,IKTB:IKTE)= 0.5 * ( ZVPT(:,IKTB:IKTE)+ZVPT(:,IKTB-KKL:IKTE-KKL) ) +ZHLVPT(:,KKU)= 0.5 * ( ZVPT(:,KKU)+ZVPT(:,KKU-KKL) ) +ZHLVPT(:,KKA) = ZVPT(:,KKA) +!------------------------------------------------------------------------------- +! +!* 3. loop on model levels +! -------------------- +DO JK=IKTB,IKTE +! +!------------------------------------------------------------------------------- +! +! + +!* 4. mixing length for a downwards displacement +! ------------------------------------------ + ZINTE(:)=ZTKEM(:,JK) + ZLWORK=0. + ZTESTM=1. + DO JKK=JK,IKB,-KKL + IF(ZTESTM > 0.) THEN + ZTESTM=0. + DO J1D=1,IIU*IJU + + ZTEST0=0.5+SIGN(0.5,ZINTE(J1D)) + + !--------- SHEAR + STABILITY ----------- + ZPOTE = ZTEST0* & + (-ZG_O_THVREF(J1D,JK)*(ZHLVPT(J1D,JKK)-ZVPT(J1D,JK)) & + + XRM17*ZSHEAR(J1D,JKK)*ZSQRT_TKE(J1D,JK) & + )*ZDZZ(J1D,JKK) + + ZTEST =0.5+SIGN(0.5,ZINTE(J1D)-ZPOTE) + ZTESTM=ZTESTM+ZTEST0 + ZLWORK1=ZDZZ(J1D,JKK) + + !-------- ORIGINAL ------------- +! ZLWORK2= ( + ZG_O_THVREF(J1D,JK) * & +! ( ZVPT(J1D,JKK) - ZVPT(J1D,JK) ) & +! + SQRT (ABS( & +! ( ZG_O_THVREF(J1D,JK) * (ZVPT(J1D,JKK) - ZVPT(J1D,JK)) )**2 & +! + 2. * ZINTE(J1D) * ZG_O_THVREF(J1D,JK) & +! * ZDELTVPT(J1D,JKK) / ZDZZ(J1D,JKK) ))) / & +! ( ZG_O_THVREF(J1D,JK) * ZDELTVPT(J1D,JKK) / ZDZZ(J1D,JKK)) + + + !--------- SHEAR + STABILITY ----------- + ZLWORK2 = (ZG_O_THVREF(J1D,JK) *(ZVPT(J1D,JKK) - ZVPT(J1D,JK)) & + -XRM17*ZSHEAR(J1D,JKK)*ZSQRT_TKE(J1D,JK) & + + sqrt(abs( (XRM17*ZSHEAR(J1D,JKK)*ZSQRT_TKE(J1D,JK) & + + ( -ZG_O_THVREF(J1D,JK) * (ZVPT(J1D,JKK) - ZVPT(J1D,JK)) ))**2.0 + & + 2. * ZINTE(J1D) * & + (ZG_O_THVREF(J1D,JK) * ZDELTVPT(J1D,JKK)/ ZDZZ(J1D,JKK))))) / & + (ZG_O_THVREF(J1D,JK) * ZDELTVPT(J1D,JKK) / ZDZZ(J1D,JKK)) + + + ZLWORK(J1D)=ZLWORK(J1D)+ZTEST0*(ZTEST*ZLWORK1+(1-ZTEST)*ZLWORK2) + ZINTE(J1D) = ZINTE(J1D) - ZPOTE + + END DO + ENDIF + END DO +!------------------------------------------------------------------------------- +! +!* 5. intermediate storage of the final mixing length +! ----------------------------------------------- +! + ZLMDN(:,JK)=MIN(ZLWORK(:),0.5*(ZZZ(:,JK)+ZZZ(:,JK+KKL))-ZZZ(:,IKB)) +! +!------------------------------------------------------------------------------- +! +!* 6. mixing length for an upwards displacement +! ----------------------------------------- +! + ZINTE(:)=ZTKEM(:,JK) + ZLWORK=0. + ZTESTM=1. +! + DO JKK=JK+KKL,IKE,KKL + IF(ZTESTM > 0.) THEN + ZTESTM=0. + DO J1D=1,IIU*IJU + ZTEST0=0.5+SIGN(0.5,ZINTE(J1D)) + + !-------- ORIGINAL ------------- + !ZPOTE = ZTEST0*ZG_O_THVREF(J1D,JK) * & + ! (ZHLVPT(J1D,JKK) - ZVPT(J1D,JK) ) *ZDZZ(J1D,JKK) + + !--------- SHEAR + STABILITY ----------- + ZPOTE = ZTEST0* & + (ZG_O_THVREF(J1D,JK)*(ZHLVPT(J1D,JKK)-ZVPT(J1D,JK)) & + +XRM17*ZSHEAR(J1D,JKK)*ZSQRT_TKE(J1D,JK) & + )*ZDZZ(J1D,JKK) + + ZTEST =0.5+SIGN(0.5,ZINTE(J1D)-ZPOTE) + ZTESTM=ZTESTM+ZTEST0 + ZLWORK1=ZDZZ(J1D,JKK) + + !-------- ORIGINAL ------------- + ! ZLWORK2= ( - ZG_O_THVREF(J1D,JK) * & + ! ( ZVPT(J1D,JKK-KKL) - ZVPT(J1D,JK) ) & + ! + SQRT (ABS( & + ! ( ZG_O_THVREF(J1D,JK) * (ZVPT(J1D,JKK-KKL) - ZVPT(J1D,JK)) )**2 & + ! + 2. * ZINTE(J1D) * ZG_O_THVREF(J1D,JK) & + ! * ZDELTVPT(J1D,JKK) / ZDZZ(J1D,JKK) )) ) / & + ! ( ZG_O_THVREF(J1D,JK) * ZDELTVPT(J1D,JKK) / ZDZZ(J1D,JKK) ) + + !--------- SHEAR + STABILITY ----------- + ZLWORK2= ( - ZG_O_THVREF(J1D,JK) *(ZVPT(J1D,JKK-KKL) - ZVPT(J1D,JK) ) & + - XRM17*ZSHEAR(J1D,JKK)*ZSQRT_TKE(J1D,JK) & + + SQRT (ABS( & + (XRM17*ZSHEAR(J1D,JKK)*ZSQRT_TKE(J1D,JK) & + + ( ZG_O_THVREF(J1D,JK) * (ZVPT(J1D,JKK-KKL) - ZVPT(J1D,JK))) )**2 & + + 2. * ZINTE(J1D) * & + ( ZG_O_THVREF(J1D,JK)* ZDELTVPT(J1D,JKK)/ZDZZ(J1D,JKK))))) / & + (ZG_O_THVREF(J1D,JK) * ZDELTVPT(J1D,JKK) / ZDZZ(J1D,JKK)) + + + + + ZLWORK(J1D)=ZLWORK(J1D)+ZTEST0*(ZTEST*ZLWORK1+(1-ZTEST)*ZLWORK2) + ZINTE(J1D) = ZINTE(J1D) - ZPOTE + END DO + ENDIF + END DO +! +!------------------------------------------------------------------------------- +! +!* 7. final mixing length +! + DO J1D=1,IIU*IJU + ZLWORK1=MAX(ZLMDN(J1D,JK),1.E-10_MNHREAL) + ZLWORK2=MAX(ZLWORK(J1D),1.E-10_MNHREAL) + ZPOTE = ZLWORK1 / ZLWORK2 + ZLWORK2=1.d0 + ZPOTE**ZBL89EXP + ZLM(J1D,JK) = ZLWORK1*(2./ZLWORK2)**ZUSRBL89 + END DO + +ZLM(:,JK)=MAX(ZLM(:,JK),XLINI) + +! +! +!* 8. end of the loop on the vertical levels +! -------------------------------------- +! +END DO +! +!------------------------------------------------------------------------------- +! +!* 9. boundaries +! ---------- +! +ZLM(:,KKA)=ZLM(:,IKB) +ZLM(:,IKE)=ZLM(:,IKE-KKL) +ZLM(:,KKU)=ZLM(:,IKE-KKL) +! +!------------------------------------------------------------------------------- +! +!* 10. retrieve output array in model coordinates +! ------------------------------------------ +! +IF (CPROGRAM=='AROME ') THEN + DO JK=1,IKT + PLM (:,1,JK) = ZLM (:,JK) + END DO +ELSE + DO JK=1,IKT + PLM (:,:,JK) = RESHAPE(ZLM (:,JK), (/ IIU,IJU /) ) + END DO +END IF + +! +END SUBROUTINE BL89 diff --git a/src/mesonh/turb/bl_depth_diag.f90 b/src/mesonh/turb/bl_depth_diag.f90 new file mode 100644 index 000000000..2e7fb121c --- /dev/null +++ b/src/mesonh/turb/bl_depth_diag.f90 @@ -0,0 +1,200 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 turb 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ################ + MODULE MODI_BL_DEPTH_DIAG +! ################ +! +INTERFACE BL_DEPTH_DIAG +! +! + FUNCTION BL_DEPTH_DIAG_3D(KKB,KKE,PSURF,PZS,PFLUX,PZZ,PFTOP_O_FSURF) + +INTEGER, INTENT(IN) :: KKB ! bottom point +INTEGER, INTENT(IN) :: KKE ! top point +REAL, DIMENSION(:,:), INTENT(IN) :: PSURF ! surface flux +REAL, DIMENSION(:,:), INTENT(IN) :: PZS ! orography +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFLUX ! flux +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! altitude of flux points +REAL, INTENT(IN) :: PFTOP_O_FSURF! Flux at BL top / Surface flux +REAL, DIMENSION(SIZE(PSURF,1),SIZE(PSURF,2)) :: BL_DEPTH_DIAG_3D +! +END FUNCTION BL_DEPTH_DIAG_3D +! +! + FUNCTION BL_DEPTH_DIAG_1D(KKB,KKE,PSURF,PZS,PFLUX,PZZ,PFTOP_O_FSURF) +INTEGER, INTENT(IN) :: KKB ! bottom point +INTEGER, INTENT(IN) :: KKE ! top point +REAL, INTENT(IN) :: PSURF ! surface flux +REAL, INTENT(IN) :: PZS ! orography +REAL, DIMENSION(:), INTENT(IN) :: PFLUX ! flux +REAL, DIMENSION(:), INTENT(IN) :: PZZ ! altitude of flux points +REAL, INTENT(IN) :: PFTOP_O_FSURF! Flux at BL top / Surface flux +REAL :: BL_DEPTH_DIAG_1D +! +END FUNCTION BL_DEPTH_DIAG_1D +! +END INTERFACE +! +END MODULE MODI_BL_DEPTH_DIAG +! +!------------------------------------------------------------------------------- +! +! ################ + MODULE MODI_BL_DEPTH_DIAG_3D +! ################ +! +! +INTERFACE +! +! + FUNCTION BL_DEPTH_DIAG_3D(KKB,KKE,PSURF,PZS,PFLUX,PZZ,PFTOP_O_FSURF) +INTEGER, INTENT(IN) :: KKB ! bottom point +INTEGER, INTENT(IN) :: KKE ! top point +REAL, DIMENSION(:,:), INTENT(IN) :: PSURF ! surface flux +REAL, DIMENSION(:,:), INTENT(IN) :: PZS ! orography +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFLUX ! flux +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! altitude of flux points +REAL, INTENT(IN) :: PFTOP_O_FSURF! Flux at BL top / Surface flux +REAL, DIMENSION(SIZE(PSURF,1),SIZE(PSURF,2)) :: BL_DEPTH_DIAG_3D +! +END FUNCTION BL_DEPTH_DIAG_3D +! +! +END INTERFACE +! +END MODULE MODI_BL_DEPTH_DIAG_3D +! +!------------------------------------------------------------------------------- +! +FUNCTION BL_DEPTH_DIAG_3D(KKB,KKE,PSURF,PZS,PFLUX,PZZ,PFTOP_O_FSURF) +! +! +!!**** *SBL_DEPTH* - computes SBL depth +!! +!! PURPOSE +!! ------- +! +!!** METHOD +!! ------ +!! +!! SBL is defined as the layer where momentum flux is equal to XSBL_FRAC of its surface value +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! V. Masson * Meteo-France * +!! +!! MODIFICATIONS +!! ------------- +!! Original nov. 2005 +!! +!! -------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +!* 0.1 declarations of arguments +! +IMPLICIT NONE +! +INTEGER, INTENT(IN) :: KKB ! bottom point +INTEGER, INTENT(IN) :: KKE ! top point +REAL, DIMENSION(:,:), INTENT(IN) :: PSURF ! surface flux +REAL, DIMENSION(:,:), INTENT(IN) :: PZS ! orography +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFLUX ! flux +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! altitude of flux points +REAL, INTENT(IN) :: PFTOP_O_FSURF! Flux at BL top / Surface flux +REAL, DIMENSION(SIZE(PSURF,1),SIZE(PSURF,2)) :: BL_DEPTH_DIAG_3D +! +! +! 0.2 declaration of local variables +! +INTEGER :: JI,JJ,JK ! loop counters +INTEGER :: IKL ! +1 : MesoNH levels -1: Arome +REAL :: ZFLX ! flux at top of BL +! +!---------------------------------------------------------------------------- +! +IF (KKB < KKE) THEN + IKL=1 +ELSE + IKL=-1 +ENDIF + +BL_DEPTH_DIAG_3D(:,:) = 0. +! + +DO JJ=1,SIZE(PSURF,2) + DO JI=1,SIZE(PSURF,1) + IF (PSURF(JI,JJ)==0.) CYCLE + DO JK=KKB,KKE,IKL + IF (PZZ(JI,JJ,JK-IKL)<=PZS(JI,JJ)) CYCLE + ZFLX = PSURF(JI,JJ) * PFTOP_O_FSURF + IF ( (PFLUX(JI,JJ,JK)-ZFLX)*(PFLUX(JI,JJ,JK-IKL)-ZFLX) <= 0. ) THEN + BL_DEPTH_DIAG_3D(JI,JJ) = (PZZ (JI,JJ,JK-IKL) - PZS(JI,JJ)) & + + (PZZ (JI,JJ,JK) - PZZ (JI,JJ,JK-IKL)) & + * (ZFLX - PFLUX(JI,JJ,JK-IKL) ) & + / (PFLUX(JI,JJ,JK) - PFLUX(JI,JJ,JK-IKL) ) + EXIT + END IF + END DO + END DO +END DO +! +BL_DEPTH_DIAG_3D(:,:) = BL_DEPTH_DIAG_3D(:,:) / (1. - PFTOP_O_FSURF) +! +END FUNCTION BL_DEPTH_DIAG_3D +! +! +!------------------------------------------------------------------------------- +!------------------------------------------------------------------------------- +! +FUNCTION BL_DEPTH_DIAG_1D(KKB,KKE,PSURF,PZS,PFLUX,PZZ,PFTOP_O_FSURF) +! +USE MODI_BL_DEPTH_DIAG_3D +IMPLICIT NONE +! +INTEGER, INTENT(IN) :: KKB ! bottom point +INTEGER, INTENT(IN) :: KKE ! top point +REAL, INTENT(IN) :: PSURF ! surface flux +REAL, INTENT(IN) :: PZS ! orography +REAL, DIMENSION(:), INTENT(IN) :: PFLUX ! flux +REAL, DIMENSION(:), INTENT(IN) :: PZZ ! altitude of flux points +REAL, INTENT(IN) :: PFTOP_O_FSURF! Flux at BL top / Surface flux +REAL :: BL_DEPTH_DIAG_1D +! +REAL, DIMENSION(1,1) :: ZSURF +REAL, DIMENSION(1,1) :: ZZS +REAL, DIMENSION(1,1,SIZE(PFLUX)) :: ZFLUX +REAL, DIMENSION(1,1,SIZE(PZZ)) :: ZZZ +REAL, DIMENSION(1,1) :: ZBL_DEPTH_DIAG +! +ZSURF = PSURF +ZZS = PZS +ZFLUX(1,1,:) = PFLUX(:) +ZZZ (1,1,:) = PZZ (:) +! +ZBL_DEPTH_DIAG = BL_DEPTH_DIAG_3D(KKB,KKE,ZSURF,ZZS,ZFLUX,ZZZ,PFTOP_O_FSURF) +! +BL_DEPTH_DIAG_1D = ZBL_DEPTH_DIAG(1,1) +! +!------------------------------------------------------------------------------- +! +END FUNCTION BL_DEPTH_DIAG_1D diff --git a/src/mesonh/turb/compute_bl89_ml.f90 b/src/mesonh/turb/compute_bl89_ml.f90 new file mode 100644 index 000000000..20c9a078d --- /dev/null +++ b/src/mesonh/turb/compute_bl89_ml.f90 @@ -0,0 +1,250 @@ +!MNH_LIC Copyright 2006-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ########################### + MODULE MODI_COMPUTE_BL89_ML +! ########################### + +INTERFACE + +! ################################################################### + SUBROUTINE COMPUTE_BL89_ML(KKA,KKB,KKE,KKU,KKL,PDZZ2D, & + PTKEM_DEP,PG_O_THVREF,PVPT,KK,OUPORDN,OFLUX,PSHEAR,PLWORK) +! ################################################################### + +!* 1.1 Declaration of Arguments + +INTEGER, INTENT(IN) :: KKA ! near ground array index +INTEGER, INTENT(IN) :: KKB ! near ground physical index +INTEGER, INTENT(IN) :: KKE ! uppest atmosphere physical index +INTEGER, INTENT(IN) :: KKU ! uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:), INTENT(IN) :: PDZZ2D ! height difference between two mass levels +REAL, DIMENSION(:), INTENT(IN) :: PTKEM_DEP ! TKE to consume +REAL, DIMENSION(:), INTENT(IN) :: PG_O_THVREF ! g/ThetaVRef at the departure point +REAL, DIMENSION(:,:), INTENT(IN) :: PVPT ! ThetaV on mass levels +INTEGER, INTENT(IN) :: KK ! index of departure level +LOGICAL, INTENT(IN) :: OUPORDN ! switch to compute upward (true) or + ! downward (false) mixing length +LOGICAL, INTENT(IN) :: OFLUX ! Computation must be done from flux level +REAL, DIMENSION(:), INTENT(OUT) :: PLWORK ! Resulting mixing length +REAL, DIMENSION(:,:), INTENT(IN) :: PSHEAR ! vertical wind shear for RM17 mixing length + +END SUBROUTINE COMPUTE_BL89_ML + +END INTERFACE +! +END MODULE MODI_COMPUTE_BL89_ML +! ######spl + SUBROUTINE COMPUTE_BL89_ML(KKA,KKB,KKE,KKU,KKL,PDZZ2D, & + PTKEM_DEP,PG_O_THVREF,PVPT,KK,OUPORDN,OFLUX,PSHEAR,PLWORK) + +! ################################################################### +!! +!! COMPUTE_BL89_ML routine to: +!! 1/ compute upward or downward mixing length with BL89 formulation +!! +!! AUTHOR +!! ------ +!! J. PERGAUD +!! +!! MODIFICATIONS +!! ------------- +!! Original 19/01/06 +!! S. Riette Jan 2012: support for both order of vertical levels and cleaning +!! R.Honnert Oct 2016 : Update with AROME +!! Q.Rodier 01/2019 : support RM17 mixing length as in bl89.f90 +! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! +! ------------ +! +!!!!!!!!!!!! +!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!! WARNING !! +!!!!!!!!!!!! +!!!!!!!!!!!! +!Any modification done to this routine must be copied in bl89.f90. +!This routine was inlined in bl89 for numerical performance reasons +!but algorithm must remain the same. +!!!!!!!!!!!! +! +USE MODD_CTURB +USE MODD_PARAMETERS, ONLY: JPVEXT +! +use mode_msg +! +USE MODI_SHUMAN_MF +! +IMPLICIT NONE +! +! 0.1 arguments +! +INTEGER, INTENT(IN) :: KKA ! near ground array index +INTEGER, INTENT(IN) :: KKB ! near ground physical index +INTEGER, INTENT(IN) :: KKE ! uppest atmosphere physical index +INTEGER, INTENT(IN) :: KKU ! uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:), INTENT(IN) :: PDZZ2D ! height difference between two mass levels +REAL, DIMENSION(:), INTENT(IN) :: PTKEM_DEP ! TKE to consume +REAL, DIMENSION(:), INTENT(IN) :: PG_O_THVREF ! g/ThetaVRef at the departure point +REAL, DIMENSION(:,:), INTENT(IN) :: PVPT ! ThetaV on mass levels +INTEGER, INTENT(IN) :: KK ! index of departure level +LOGICAL, INTENT(IN) :: OUPORDN ! switch to compute upward (true) or + ! downward (false) mixing length +LOGICAL, INTENT(IN) :: OFLUX ! Computation must be done from flux level +REAL, DIMENSION(:), INTENT(OUT) :: PLWORK ! Resulting mixing length +REAL, DIMENSION(:,:), INTENT(IN) :: PSHEAR ! vertical wind shear for RM17 mixing length + +! 0.2 Local variable +! +REAL, DIMENSION(SIZE(PVPT,1)) :: ZLWORK1,ZLWORK2 ! Temporary mixing length +REAL, DIMENSION(SIZE(PVPT,1)) :: ZINTE,ZPOTE ! TKE and potential energy + ! between 2 levels +REAL, DIMENSION(SIZE(PVPT,1)) :: ZVPT_DEP ! Thetav on departure point +! +REAL, DIMENSION(SIZE(PVPT,1),SIZE(PVPT,2)) :: ZDELTVPT,ZHLVPT + !Virtual Potential Temp at Half level and DeltaThv between + !2 mass levels + +INTEGER :: IIJU !Internal Domain +INTEGER :: J1D !horizontal loop counter +INTEGER :: JKK !loop counters +REAL :: ZTEST,ZTEST0,ZTESTM !test for vectorization +!------------------------------------------------------------------------------------- +! +!* 1. INITIALISATION +! -------------- +IIJU=SIZE(PVPT,1) +! +ZDELTVPT(:,:)=DZM_MF(KKA,KKU,KKL,PVPT(:,:)) +ZDELTVPT(:,KKA)=0. +WHERE (ABS(ZDELTVPT(:,:))<XLINF) + ZDELTVPT(:,:)=XLINF +END WHERE +! +ZHLVPT(:,:)=MZM_MF(KKA,KKU,KKL,PVPT(:,:)) +! +!We consider that gradient between mass levels KKB and KKB+KKL is the same as +!the gradient between flux level KKB and mass level KKB +ZDELTVPT(:,KKB)=PDZZ2D(:,KKB)*ZDELTVPT(:,KKB+KKL)/PDZZ2D(:,KKB+KKL) +ZHLVPT(:,KKB)=PVPT(:,KKB)-ZDELTVPT(:,KKB)*0.5 +! +! +! +!* 2. CALCULATION OF THE UPWARD MIXING LENGTH +! --------------------------------------- +! + +IF (OUPORDN.EQV..TRUE.) THEN + ZINTE(:)=PTKEM_DEP(:) + PLWORK=0. + ZTESTM=1. + IF(OFLUX)THEN + ZVPT_DEP(:)=ZHLVPT(:,KK) ! departure point is on flux level + !We must compute what happens between flux level KK and mass level KK + DO J1D=1,IIJU + ZTEST0=0.5+SIGN(0.5,ZINTE(J1D)) ! test if there's energy to consume + ! Energy consumed if parcel cross the entire layer + ZPOTE(J1D) = ZTEST0*(PG_O_THVREF(J1D) * & + (0.5*(ZHLVPT(J1D,KK)+ PVPT(J1D,KK)) - ZVPT_DEP(J1D)) + & + XRM17*PSHEAR(J1D,KK)*SQRT(ABS(PTKEM_DEP(J1D)))) * & + PDZZ2D(J1D,KK)*0.5 + ! Test if it rests some energy to consume + ZTEST =0.5+SIGN(0.5,ZINTE(J1D)-ZPOTE(J1D)) + ! Length travelled by parcel if it rests energy to consume + ZLWORK1(J1D)=PDZZ2D(J1D,KK)*0.5 + ! Lenght travelled by parcel to nullify energy + ZLWORK2(J1D)= ( - PG_O_THVREF(J1D) * & + ( ZHLVPT(J1D,KK) - ZVPT_DEP(J1D) ) & + - XRM17*PSHEAR(J1D,JKK)*sqrt(abs(PTKEM_DEP(J1D))) & + + SQRT (ABS( & + (XRM17*PSHEAR(J1D,JKK)*sqrt(abs(PTKEM_DEP(J1D))) + & + PG_O_THVREF(J1D) * (ZHLVPT(J1D,KK) - ZVPT_DEP(J1D)) )**2 & + + 2. * ZINTE(J1D) * PG_O_THVREF(J1D) & + * ZDELTVPT(J1D,KK) / PDZZ2D(J1D,KK) )) ) / & + ( PG_O_THVREF(J1D) * ZDELTVPT(J1D,KK) / PDZZ2D(J1D,KK) ) + ! Effective length travelled by parcel + PLWORK(J1D)=PLWORK(J1D)+ZTEST0*(ZTEST*ZLWORK1(J1D)+ & + (1-ZTEST)*ZLWORK2(J1D)) + ! Rest of energy to consume + ZINTE(J1D) = ZINTE(J1D) - ZPOTE(J1D) + ENDDO + ELSE + ZVPT_DEP(:)=PVPT(:,KK) ! departure point is on mass level + ENDIF + + DO JKK=KK+KKL,KKE,KKL + IF(ZTESTM > 0.) THEN + ZTESTM=0 + DO J1D=1,IIJU + ZTEST0=0.5+SIGN(0.5,ZINTE(J1D)) + ZPOTE(J1D) = ZTEST0*(PG_O_THVREF(J1D) * & + (ZHLVPT(J1D,JKK) - ZVPT_DEP(J1D)) & + + XRM17*PSHEAR(J1D,JKK)*SQRT(ABS(PTKEM_DEP(J1D))))* PDZZ2D(J1D,JKK) + ZTEST =0.5+SIGN(0.5,ZINTE(J1D)-ZPOTE(J1D)) + ZTESTM=ZTESTM+ZTEST0 + ZLWORK1(J1D)=PDZZ2D(J1D,JKK) + !ZLWORK2 jump of the last reached level + ZLWORK2(J1D)= ( - PG_O_THVREF(J1D) * & + ( PVPT(J1D,JKK-KKL) - ZVPT_DEP(J1D) ) & + - XRM17*PSHEAR(J1D,JKK)*sqrt(abs(PTKEM_DEP(J1D))) & + + SQRT (ABS( & + (XRM17*PSHEAR(J1D,JKK)*sqrt(abs(PTKEM_DEP(J1D))) + & + PG_O_THVREF(J1D) * (PVPT(J1D,JKK-KKL) - ZVPT_DEP(J1D)) )**2 & + + 2. * ZINTE(J1D) * PG_O_THVREF(J1D) & + * ZDELTVPT(J1D,JKK) / PDZZ2D(J1D,JKK) )) ) / & + ( PG_O_THVREF(J1D) * ZDELTVPT(J1D,JKK) / PDZZ2D(J1D,JKK) ) +! + PLWORK(J1D)=PLWORK(J1D)+ZTEST0*(ZTEST*ZLWORK1(J1D)+ & + (1-ZTEST)*ZLWORK2(J1D)) + ZINTE(J1D) = ZINTE(J1D) - ZPOTE(J1D) + END DO + ENDIF + END DO +ENDIF +!! +!* 2. CALCULATION OF THE DOWNWARD MIXING LENGTH +! --------------------------------------- +! + +IF (OUPORDN.EQV..FALSE.) THEN + IF(OFLUX) call Print_msg(NVERB_FATAL,'GEN','COMPUTE_BL89_ML','OFLUX option not coded for downward mixing length') + ZINTE(:)=PTKEM_DEP(:) + PLWORK=0. + ZTESTM=1. + DO JKK=KK,KKB,-KKL + IF(ZTESTM > 0.) THEN + ZTESTM=0 + DO J1D=1,IIJU + ZTEST0=0.5+SIGN(0.5,ZINTE(J1D)) + ZPOTE(J1D) = ZTEST0*(-PG_O_THVREF(J1D) * & + (ZHLVPT(J1D,JKK) - PVPT(J1D,KK)) & + + XRM17*PSHEAR(J1D,JKK)*SQRT(ABS(PTKEM_DEP(J1D))))* PDZZ2D(J1D,JKK) + ZTEST =0.5+SIGN(0.5,ZINTE(J1D)-ZPOTE(J1D)) + ZTESTM=ZTESTM+ZTEST0 + ZLWORK1(J1D)=PDZZ2D(J1D,JKK) + ZLWORK2(J1D)= ( + PG_O_THVREF(J1D) * & + ( PVPT(J1D,JKK) - PVPT(J1D,KK) ) & + -XRM17*PSHEAR(J1D,JKK)*sqrt(abs(PTKEM_DEP(J1D))) & + + SQRT (ABS( & + (XRM17*PSHEAR(J1D,JKK)*sqrt(abs(PTKEM_DEP(J1D))) - & + PG_O_THVREF(J1D) * (PVPT(J1D,JKK) - PVPT(J1D,KK)) )**2 & + + 2. * ZINTE(J1D) * PG_O_THVREF(J1D) & + * ZDELTVPT(J1D,JKK) / PDZZ2D(J1D,JKK) )) ) / & + ( PG_O_THVREF(J1D) * ZDELTVPT(J1D,JKK) / PDZZ2D(J1D,JKK) ) +! + PLWORK(J1D)=PLWORK(J1D)+ZTEST0*(ZTEST*ZLWORK1(J1D)+ & + (1-ZTEST)*ZLWORK2(J1D)) + ZINTE(J1D) = ZINTE(J1D) - ZPOTE(J1D) + END DO + ENDIF + END DO +ENDIF + +END SUBROUTINE COMPUTE_BL89_ML diff --git a/src/mesonh/turb/compute_entr_detr.f90 b/src/mesonh/turb/compute_entr_detr.f90 new file mode 100644 index 000000000..80a9d68db --- /dev/null +++ b/src/mesonh/turb/compute_entr_detr.f90 @@ -0,0 +1,488 @@ +!MNH_LIC Copyright 2009-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +! ######spl + MODULE MODI_COMPUTE_ENTR_DETR +! ############################## +! +INTERFACE +! + SUBROUTINE COMPUTE_ENTR_DETR(KK,KKB,KKE,KKL,OTEST,OTESTLCL,& + HFRAC_ICE,PFRAC_ICE,PRHODREF,& + PPRE_MINUS_HALF,& + PPRE_PLUS_HALF,PZZ,PDZZ,& + PTHVM,PTHLM,PRTM,PW_UP2,PTH_UP,& + PTHL_UP,PRT_UP,PLUP,& + PRC_UP,PRI_UP,PTHV_UP,& + PRSAT_UP,PRC_MIX,PRI_MIX, & + PENTR,PDETR,PENTR_CLD,PDETR_CLD,& + PBUO_INTEG_DRY,PBUO_INTEG_CLD,& + PPART_DRY) + +!INTEGER, INTENT(IN) :: KK +INTEGER, INTENT(IN) :: KKB ! near ground physical index +INTEGER, INTENT(IN) :: KKE ! uppest atmosphere physical index +INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +LOGICAL,DIMENSION(:), INTENT(IN) :: OTEST ! test to see if updraft is running +LOGICAL,DIMENSION(:), INTENT(IN) :: OTESTLCL !test of condensation +CHARACTER(len=1), INTENT(IN) :: HFRAC_ICE ! frac_ice can be compute using + ! Temperature (T) or prescribed + ! (Y) +REAL, DIMENSION(:), INTENT(IN) :: PFRAC_ICE ! fraction of ice +! +! prognostic variables at t- deltat +! +REAL, DIMENSION(:), INTENT(IN) :: PRHODREF !rhodref +REAL, DIMENSION(:), INTENT(IN) :: PPRE_MINUS_HALF ! Pressure at flux level KK +REAL, DIMENSION(:), INTENT(IN) :: PPRE_PLUS_HALF ! Pressure at flux level KK+KKL +REAL, DIMENSION(:,:), INTENT(IN) :: PZZ ! Height at the flux point +REAL, DIMENSION(:,:), INTENT(IN) :: PDZZ ! metrics coefficient +REAL, DIMENSION(:,:), INTENT(IN) :: PTHVM ! ThetaV environment + +! +! thermodynamical variables which are transformed in conservative var. +! +REAL, DIMENSION(:,:), INTENT(IN) :: PTHLM ! Thetal +REAL, DIMENSION(:,:), INTENT(IN) :: PRTM ! total mixing ratio +REAL, DIMENSION(:,:), INTENT(IN) :: PW_UP2 ! Vertical velocity^2 +REAL, DIMENSION(:), INTENT(IN) :: PTH_UP,PTHL_UP,PRT_UP ! updraft properties +REAL, DIMENSION(:), INTENT(IN) :: PLUP ! LUP compute from the ground +REAL, DIMENSION(:), INTENT(IN) :: PRC_UP,PRI_UP ! Updraft cloud content +REAL, DIMENSION(:), INTENT(IN) :: PTHV_UP ! Thetav of updraft +REAL, DIMENSION(:), INTENT(IN) :: PRSAT_UP ! Mixing ratio at saturation in updraft +REAL, DIMENSION(:), INTENT(INOUT) :: PRC_MIX, PRI_MIX ! Mixture cloud content +REAL, DIMENSION(:), INTENT(OUT) :: PENTR ! Mass flux entrainment of the updraft +REAL, DIMENSION(:), INTENT(OUT) :: PDETR ! Mass flux detrainment of the updraft +REAL, DIMENSION(:), INTENT(OUT) :: PENTR_CLD ! Mass flux entrainment of the updraft in cloudy part +REAL, DIMENSION(:), INTENT(OUT) :: PDETR_CLD ! Mass flux detrainment of the updraft in cloudy part +REAL, DIMENSION(:), INTENT(OUT) :: PBUO_INTEG_DRY, PBUO_INTEG_CLD! Integral Buoyancy +REAL, DIMENSION(:), INTENT(OUT) :: PPART_DRY ! ratio of dry part at the transition level +! +! +END SUBROUTINE COMPUTE_ENTR_DETR + +END INTERFACE +! +END MODULE MODI_COMPUTE_ENTR_DETR +! ######spl + SUBROUTINE COMPUTE_ENTR_DETR(KK,KKB,KKE,KKL,OTEST,OTESTLCL,& + HFRAC_ICE,PFRAC_ICE,PRHODREF,& + PPRE_MINUS_HALF,& + PPRE_PLUS_HALF,PZZ,PDZZ,& + PTHVM,PTHLM,PRTM,PW_UP2,PTH_UP,& + PTHL_UP,PRT_UP,PLUP,& + PRC_UP,PRI_UP,PTHV_UP,& + PRSAT_UP,PRC_MIX,PRI_MIX, & + PENTR,PDETR,PENTR_CLD,PDETR_CLD,& + PBUO_INTEG_DRY,PBUO_INTEG_CLD,& + PPART_DRY) +! ############################################################# + +!! +!!***COMPUTE_ENTR_DETR* - calculates caracteristics of the updraft or downdraft +!! using model of the EDMF scheme +!! +!! PURPOSE +!! ------- +!!**** The purpose of this routine is to compute entrainement and +!! detrainement at one level of the updraft +! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! Book 1 of Meso-NH documentation (chapter Convection) +!! +!! +!! AUTHOR +!! ------ +!! J.Pergaud : 2009 +!! +!! MODIFICATIONS +!! ------------- +!! Y.Seity (06/2010) Bug correction +!! V.Masson (09/2010) Optimization +!! S. Riette april 2011 : ice added, protection against zero divide by Yves Bouteloup +!! protection against too big ZPART_DRY, interface modified +!! S. Riette Jan 2012: support for both order of vertical levels +!! S. Riette & J. Escobar (11/2013) : remove div by 0 on real*4 case +!! P.Marguinaud Jun 2012: fix uninitialized variable +!! P.Marguinaud Nov 2012: fix gfortran bug +!! S. Riette Apr 2013: bugs correction, rewriting (for optimisation) and +!! improvement of continuity at the condensation level +!! S. Riette Nov 2013: protection against zero divide for min value of dry PDETR +!! R.Honnert Oct 2016 : Update with AROME +! P. Wautelet 08/02/2019: bugfix: compute ZEPSI_CLOUD only once and only when it is needed +! P. Wautelet 10/02/2021: bugfix: initialized PPART_DRY everywhere +!! -------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_PARAM_MFSHALL_n +USE MODD_PARAMETERS, ONLY: XUNDEF + +USE MODE_THERMO + +USE MODI_TH_R_FROM_THL_RT_1D + +IMPLICIT NONE +! +! +!* 1.1 Declaration of Arguments +! +! +INTEGER, INTENT(IN) :: KK +INTEGER, INTENT(IN) :: KKB ! near ground physical index +INTEGER, INTENT(IN) :: KKE ! uppest atmosphere physical index +INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +LOGICAL,DIMENSION(:), INTENT(IN) :: OTEST ! test to see if updraft is running +LOGICAL,DIMENSION(:), INTENT(IN) :: OTESTLCL !test of condensation +CHARACTER(len=1), INTENT(IN) :: HFRAC_ICE ! frac_ice can be compute using + ! Temperature (T) or prescribed + ! (Y) +REAL, DIMENSION(:), INTENT(IN) :: PFRAC_ICE ! fraction of ice +! +! prognostic variables at t- deltat +! +REAL, DIMENSION(:), INTENT(IN) :: PRHODREF !rhodref +REAL, DIMENSION(:), INTENT(IN) :: PPRE_MINUS_HALF ! Pressure at flux level KK +REAL, DIMENSION(:), INTENT(IN) :: PPRE_PLUS_HALF ! Pressure at flux level KK+KKL +REAL, DIMENSION(:,:), INTENT(IN) :: PZZ ! Height at the flux point +REAL, DIMENSION(:,:), INTENT(IN) :: PDZZ ! metrics coefficient +REAL, DIMENSION(:,:), INTENT(IN) :: PTHVM ! ThetaV environment + +! +! thermodynamical variables which are transformed in conservative var. +! +REAL, DIMENSION(:,:), INTENT(IN) :: PTHLM ! Thetal +REAL, DIMENSION(:,:), INTENT(IN) :: PRTM ! total mixing ratio +REAL, DIMENSION(:,:), INTENT(IN) :: PW_UP2 ! Vertical velocity^2 +REAL, DIMENSION(:), INTENT(IN) :: PTH_UP,PTHL_UP,PRT_UP ! updraft properties +REAL, DIMENSION(:), INTENT(IN) :: PLUP ! LUP compute from the ground +REAL, DIMENSION(:), INTENT(IN) :: PRC_UP,PRI_UP ! Updraft cloud content +REAL, DIMENSION(:), INTENT(IN) :: PTHV_UP ! Thetav of updraft +REAL, DIMENSION(:), INTENT(IN) :: PRSAT_UP ! Mixing ratio at saturation in updraft +REAL, DIMENSION(:), INTENT(INOUT) :: PRC_MIX, PRI_MIX ! Mixture cloud content +REAL, DIMENSION(:), INTENT(OUT) :: PENTR ! Mass flux entrainment of the updraft +REAL, DIMENSION(:), INTENT(OUT) :: PDETR ! Mass flux detrainment of the updraft +REAL, DIMENSION(:), INTENT(OUT) :: PENTR_CLD ! Mass flux entrainment of the updraft in cloudy part +REAL, DIMENSION(:), INTENT(OUT) :: PDETR_CLD ! Mass flux detrainment of the updraft in cloudy part +REAL, DIMENSION(:), INTENT(OUT) :: PBUO_INTEG_DRY, PBUO_INTEG_CLD! Integral Buoyancy +REAL, DIMENSION(:), INTENT(OUT) :: PPART_DRY ! ratio of dry part at the transition level +! +! +! 1.2 Declaration of local variables +! +! + +! Variables for cloudy part +REAL, DIMENSION(SIZE(PTHLM,1)) :: ZKIC, ZKIC_F2 ! fraction of env. mass in the muxtures +REAL, DIMENSION(SIZE(PTHLM,1)) :: ZEPSI,ZDELTA ! factor entrainment detrainment +REAL, DIMENSION(SIZE(PTHLM,1)) :: ZEPSI_CLOUD ! factor entrainment detrainment +REAL :: ZCOEFFMF_CLOUD ! factor for compputing entr. detr. +REAL, DIMENSION(SIZE(PTHLM,1)) :: ZMIXTHL,ZMIXRT ! Thetal and rt in the mixtures +REAL, DIMENSION(SIZE(PTHLM,1)) :: ZTHMIX ! Theta and Thetav of mixtures +REAL, DIMENSION(SIZE(PTHLM,1)) :: ZRVMIX,ZRCMIX,ZRIMIX ! mixing ratios in mixtures +REAL, DIMENSION(SIZE(PTHLM,1)) :: ZTHVMIX, ZTHVMIX_F2 ! Theta and Thetav of mixtures +REAL, DIMENSION(SIZE(PTHLM,1)) :: ZTHV_UP_F2 ! thv_up at flux point kk+kkl +REAL, DIMENSION(SIZE(PTHLM,1)) :: ZRSATW, ZRSATI ! working arrays (mixing ratio at saturation) +REAL, DIMENSION(SIZE(PTHLM,1)) :: ZTHV ! theta V of environment at the bottom of cloudy part +REAL :: ZKIC_INIT !Initial value of ZKIC +REAL, DIMENSION(SIZE(PTHLM,1)) :: ZCOTHVU ! Variation of Thvup between bottom and top of cloudy part + +! Variables for dry part +REAL, DIMENSION(SIZE(PTHLM,1)) :: ZFOESW, ZFOESI ! saturating vapor pressure +REAL, DIMENSION(SIZE(PTHLM,1)) :: ZDRSATODP ! d.Rsat/dP +REAL, DIMENSION(SIZE(PTHLM,1)) :: ZT ! Temperature +REAL, DIMENSION(SIZE(PTHLM,1)) :: ZWK ! Work array + +! Variables for dry and cloudy parts +REAL, DIMENSION(SIZE(PTHLM,1)) :: ZCOEFF_MINUS_HALF,& ! Variation of Thv between mass points kk-kkl and kk + ZCOEFF_PLUS_HALF ! Variation of Thv between mass points kk and kk+kkl +REAL, DIMENSION(SIZE(PTHLM,1)) :: ZPRE ! pressure at the bottom of the cloudy part +REAL, DIMENSION(SIZE(PTHVM,1)) :: ZG_O_THVREF +REAL, DIMENSION(SIZE(PTHLM,1)) :: ZFRAC_ICE ! fraction of ice +REAL :: ZRVORD ! RV/RD +REAL, DIMENSION(SIZE(PTHLM,1)) :: ZDZ_STOP,& ! Exact Height of the LCL above flux level KK + ZTHV_MINUS_HALF,& ! Thv at flux point(kk) + ZTHV_PLUS_HALF,& ! Thv at flux point(kk+kkl) + ZDZ ! Delta Z used in computations +INTEGER :: JI,JLOOP + +!---------------------------------------------------------------------------------- + +! 1.3 Initialisation +! ------------------ + + + ZRVORD = XRV / XRD !=1.607 + ZG_O_THVREF(:)=XG/PTHVM(:,KK) + ZCOEFFMF_CLOUD=XENTR_MF * XG / XCRAD_MF + + ZFRAC_ICE(:)=PFRAC_ICE(:) ! to not modify fraction of ice + + ZPRE(:)=PPRE_MINUS_HALF(:) + ZMIXTHL(:)=0.1 + ZMIXRT(:)=0.1 + + !Initialize PPART_DRY everywhere to prevent access to non-initialized values + ! (intent(out) arrays have undefined values at subroutine entry) + PPART_DRY(:) = XUNDEF + +! 1.4 Estimation of PPART_DRY + DO JLOOP=1,SIZE(OTEST) + IF(OTEST(JLOOP) .AND. OTESTLCL(JLOOP)) THEN + !No dry part when condensation level is reached + PPART_DRY(JLOOP)=0. + ZDZ_STOP(JLOOP)=0. + ZPRE(JLOOP)=PPRE_MINUS_HALF(JLOOP) + ELSE IF (OTEST(JLOOP) .AND. .NOT. OTESTLCL(JLOOP)) THEN + !Temperature at flux level KK + ZT(JLOOP)=PTH_UP(JLOOP)*(PPRE_MINUS_HALF(JLOOP)/XP00) ** (XRD/XCPD) + !Saturating vapor pressure at flux level KK + ZFOESW(JLOOP) = MIN(EXP( XALPW - XBETAW/ZT(JLOOP) - XGAMW*LOG(ZT(JLOOP)) ), 0.99*PPRE_MINUS_HALF(JLOOP)) + ZFOESI(JLOOP) = MIN(EXP( XALPI - XBETAI/ZT(JLOOP) - XGAMI*LOG(ZT(JLOOP)) ), 0.99*PPRE_MINUS_HALF(JLOOP)) + !Computation of d.Rsat / dP (partial derivations with respect to P and T + !and use of T=Theta*(P/P0)**(R/Cp) to transform dT into dP with theta_up + !constant at the vertical) + ZDRSATODP(JLOOP)=(XBETAW/ZT(JLOOP)-XGAMW)*(1-ZFRAC_ICE(JLOOP))+(XBETAI/ZT(JLOOP)-XGAMI)*ZFRAC_ICE(JLOOP) + ZDRSATODP(JLOOP)=((XRD/XCPD)*ZDRSATODP(JLOOP)-1.)*PRSAT_UP(JLOOP)/ & + &(PPRE_MINUS_HALF(JLOOP)-(ZFOESW(JLOOP)*(1-ZFRAC_ICE(JLOOP)) + ZFOESI(JLOOP)*ZFRAC_ICE(JLOOP))) + !Use of d.Rsat / dP and pressure at flux level KK to find pressure (ZPRE) + !where Rsat is equal to PRT_UP + ZPRE(JLOOP)=PPRE_MINUS_HALF(JLOOP)+(PRT_UP(JLOOP)-PRSAT_UP(JLOOP))/ZDRSATODP(JLOOP) + !Fraction of dry part (computed with pressure and used with heights, no + !impact found when using log function here and for pressure on flux levels + !computation) + PPART_DRY(JLOOP)=MAX(0., MIN(1., (PPRE_MINUS_HALF(JLOOP)-ZPRE(JLOOP))/(PPRE_MINUS_HALF(JLOOP)-PPRE_PLUS_HALF(JLOOP)))) + !Height above flux level KK of the cloudy part + ZDZ_STOP(JLOOP) = (PZZ(JLOOP,KK+KKL)-PZZ(JLOOP,KK))*PPART_DRY(JLOOP) + END IF + END DO + +! 1.5 Gradient and flux values of thetav + IF(KK/=KKB)THEN + ZCOEFF_MINUS_HALF(:)=((PTHVM(:,KK)-PTHVM(:,KK-KKL))/PDZZ(:,KK)) + ZTHV_MINUS_HALF(:) = PTHVM(:,KK) - ZCOEFF_MINUS_HALF(:)*0.5*(PZZ(:,KK+KKL)-PZZ(:,KK)) + ELSE + ZCOEFF_MINUS_HALF(:)=0. + ZTHV_MINUS_HALF(:) = PTHVM(:,KK) + ENDIF + ZCOEFF_PLUS_HALF(:) = ((PTHVM(:,KK+KKL)-PTHVM(:,KK))/PDZZ(:,KK+KKL)) + ZTHV_PLUS_HALF(:) = PTHVM(:,KK) + ZCOEFF_PLUS_HALF(:)*0.5*(PZZ(:,KK+KKL)-PZZ(:,KK)) + +! 2 Dry part computation: +! Integral buoyancy and computation of PENTR and PDETR for dry part +! -------------------------------------------------------------------- + +DO JLOOP=1,SIZE(OTEST) + IF (OTEST(JLOOP) .AND. PPART_DRY(JLOOP)>0.) THEN + ZDZ(JLOOP)=MIN(ZDZ_STOP(JLOOP),(PZZ(JLOOP,KK+KKL)-PZZ(JLOOP,KK))*0.5) + PBUO_INTEG_DRY(JLOOP) = ZG_O_THVREF(JLOOP)*ZDZ(JLOOP)*& + (0.5 * ( - ZCOEFF_MINUS_HALF(JLOOP))*ZDZ(JLOOP) & + - ZTHV_MINUS_HALF(JLOOP) + PTHV_UP(JLOOP) ) + + !Between mass flux KK and bottom of cloudy part (if above mass flux) + ZDZ(JLOOP)=MAX(0., ZDZ_STOP(JLOOP)-(PZZ(JLOOP,KK+KKL)-PZZ(JLOOP,KK))*0.5) + PBUO_INTEG_DRY(JLOOP) = PBUO_INTEG_DRY(JLOOP) + ZG_O_THVREF(JLOOP)*ZDZ(JLOOP)*& + (0.5 * ( - ZCOEFF_PLUS_HALF(JLOOP))*ZDZ(JLOOP) & + - PTHVM(JLOOP,KK) + PTHV_UP(JLOOP) ) + IF (PBUO_INTEG_DRY(JLOOP)>=0.) THEN + PENTR(JLOOP) = 0.5/(XABUO-XBENTR*XENTR_DRY)*& + LOG(1.+ (2.*(XABUO-XBENTR*XENTR_DRY)/PW_UP2(JLOOP,KK))* & + PBUO_INTEG_DRY(JLOOP)) + PDETR(JLOOP) = 0. + ELSE + PENTR(JLOOP) = 0. + PDETR(JLOOP) = 0.5/(XABUO)*& + LOG(1.+ (2.*(XABUO)/PW_UP2(JLOOP,KK))* & + (-PBUO_INTEG_DRY(JLOOP))) + ENDIF + PENTR(JLOOP) = XENTR_DRY*PENTR(JLOOP)/(PZZ(JLOOP,KK+KKL)-PZZ(JLOOP,KK)) + PDETR(JLOOP) = XDETR_DRY*PDETR(JLOOP)/(PZZ(JLOOP,KK+KKL)-PZZ(JLOOP,KK)) + !Minimum value of detrainment + ZWK(JLOOP)=PLUP(JLOOP)-0.5*(PZZ(JLOOP,KK)+PZZ(JLOOP,KK+KKL)) + ZWK(JLOOP)=SIGN(MAX(1., ABS(ZWK(JLOOP))), ZWK(JLOOP)) ! ZWK must not be zero + PDETR(JLOOP) = MAX(PPART_DRY(JLOOP)*XDETR_LUP/ZWK(JLOOP), PDETR(JLOOP)) + ELSE + !No dry part, consation reached (OTESTLCL) + PBUO_INTEG_DRY(JLOOP) = 0. + PENTR(JLOOP)=0. + PDETR(JLOOP)=0. + END IF +ENDDO + + +! 3 Wet part computation +! ----------------------- + +! 3.1 Integral buoyancy for cloudy part + + ! Compute theta_v of updraft at flux level KK+KKL + !MIX variables are used to avoid declaring new variables + !but we are dealing with updraft and not mixture + ZRCMIX(:)=PRC_UP(:) + ZRIMIX(:)=PRI_UP(:) + CALL TH_R_FROM_THL_RT_1D(HFRAC_ICE,ZFRAC_ICE,& + PPRE_PLUS_HALF,PTHL_UP,PRT_UP,& + ZTHMIX,ZRVMIX,ZRCMIX,ZRIMIX,& + ZRSATW, ZRSATI) + ZTHV_UP_F2(:) = ZTHMIX(:)*(1.+ZRVORD*ZRVMIX(:))/(1.+PRT_UP(:)) + + ! Integral buoyancy for cloudy part + DO JLOOP=1,SIZE(OTEST) + IF(OTEST(JLOOP) .AND. PPART_DRY(JLOOP)<1.) THEN + !Gradient of Theta V updraft over the cloudy part, assuming that thetaV updraft don't change + !between flux level KK and bottom of cloudy part + ZCOTHVU(JLOOP)=(ZTHV_UP_F2(JLOOP)-PTHV_UP(JLOOP))/((PZZ(JLOOP,KK+KKL)-PZZ(JLOOP,KK))*(1-PPART_DRY(JLOOP))) + + !Computation in two parts to use change of gradient of theta v of environment + !Between bottom of cloudy part (if under mass level) and mass level KK + ZDZ(JLOOP)=MAX(0., 0.5*(PZZ(JLOOP,KK+KKL)-PZZ(JLOOP,KK))-ZDZ_STOP(JLOOP)) + PBUO_INTEG_CLD(JLOOP) = ZG_O_THVREF(JLOOP)*ZDZ(JLOOP)*& + (0.5*( ZCOTHVU(JLOOP) - ZCOEFF_MINUS_HALF(JLOOP))*ZDZ(JLOOP) & + - (PTHVM(JLOOP,KK)-ZDZ(JLOOP)*ZCOEFF_MINUS_HALF(JLOOP)) + PTHV_UP(JLOOP) ) + + !Between max(mass level, bottom of cloudy part) and flux level KK+KKL + ZDZ(JLOOP)=(PZZ(JLOOP,KK+KKL)-PZZ(JLOOP,KK))-MAX(ZDZ_STOP(JLOOP),0.5*(PZZ(JLOOP,KK+KKL)-PZZ(JLOOP,KK))) + PBUO_INTEG_CLD(JLOOP) = PBUO_INTEG_CLD(JLOOP)+ZG_O_THVREF(JLOOP)*ZDZ(JLOOP)*& + (0.5*( ZCOTHVU(JLOOP) - ZCOEFF_PLUS_HALF(JLOOP))*ZDZ(JLOOP)& + - (PTHVM(JLOOP,KK)+(0.5*((PZZ(JLOOP,KK+KKL)-PZZ(JLOOP,KK)))-ZDZ(JLOOP))*ZCOEFF_PLUS_HALF(JLOOP)) +& + PTHV_UP(JLOOP) ) + + ELSE + !No cloudy part + PBUO_INTEG_CLD(JLOOP)=0. + END IF + END DO + +! 3.2 Critical mixed fraction for KK+KKL flux level (ZKIC_F2) and +! for bottom of cloudy part (ZKIC), then a mean for the cloudy part +! (put also in ZKIC) +! +! computation by estimating unknown +! T^mix r_c^mix and r_i^mix from enthalpy^mix and r_w^mix +! We determine the zero crossing of the linear curve +! evaluating the derivative using ZMIXF=0.1 + + ZKIC_INIT=0.1 ! starting value for critical mixed fraction for CLoudy Part + + ! Compute thetaV of environment at the bottom of cloudy part + ! and cons then non cons. var. of mixture at the bottom of cloudy part + + ! JI computed to avoid KKL(KK-KKL) being < KKL*KKB + JI=KKL*MAX(KKL*(KK-KKL),KKL*KKB) + DO JLOOP=1,SIZE(OTEST) + IF(OTEST(JLOOP) .AND. PPART_DRY(JLOOP)>0.5) THEN + ZDZ(JLOOP)=ZDZ_STOP(JLOOP)-0.5*(PZZ(JLOOP,KK+KKL)-PZZ(JLOOP,KK)) + ZTHV(JLOOP)= PTHVM(JLOOP,KK)+ZCOEFF_PLUS_HALF(JLOOP)*ZDZ(JLOOP) + ZMIXTHL(JLOOP) = ZKIC_INIT * & + (PTHLM(JLOOP,KK)+ZDZ(JLOOP)*(PTHLM(JLOOP,KK+KKL)-PTHLM(JLOOP,KK))/PDZZ(JLOOP,KK+KKL)) + & + (1. - ZKIC_INIT)*PTHL_UP(JLOOP) + ZMIXRT(JLOOP) = ZKIC_INIT * & + (PRTM(JLOOP,KK)+ZDZ(JLOOP)*(PRTM(JLOOP,KK+KKL)-PRTM(JLOOP,KK))/PDZZ(JLOOP,KK+KKL)) + & + (1. - ZKIC_INIT)*PRT_UP(JLOOP) + ELSEIF(OTEST(JLOOP)) THEN + ZDZ(JLOOP)=0.5*(PZZ(JLOOP,KK+KKL)-PZZ(JLOOP,KK))-ZDZ_STOP(JLOOP) + ZTHV(JLOOP)= PTHVM(JLOOP,KK)-ZCOEFF_MINUS_HALF(JLOOP)*ZDZ(JLOOP) + ZMIXTHL(JLOOP) = ZKIC_INIT * & + (PTHLM(JLOOP,KK)-ZDZ(JLOOP)*(PTHLM(JLOOP,KK)-PTHLM(JLOOP,JI))/PDZZ(JLOOP,KK)) + & + (1. - ZKIC_INIT)*PTHL_UP(JLOOP) + ZMIXRT(JLOOP) = ZKIC_INIT * & + (PRTM(JLOOP,KK)-ZDZ(JLOOP)*(PRTM(JLOOP,KK)-PRTM(JLOOP,JI))/PDZZ(JLOOP,KK)) + & + (1. - ZKIC_INIT)*PRT_UP(JLOOP) + ENDIF + ENDDO + CALL TH_R_FROM_THL_RT_1D(HFRAC_ICE,ZFRAC_ICE,& + ZPRE,ZMIXTHL,ZMIXRT,& + ZTHMIX,ZRVMIX,PRC_MIX,PRI_MIX,& + ZRSATW, ZRSATI) + ZTHVMIX(:) = ZTHMIX(:)*(1.+ZRVORD*ZRVMIX(:))/(1.+ZMIXRT(:)) + + ! Compute cons then non cons. var. of mixture at the flux level KK+KKL with initial ZKIC + ZMIXTHL(:) = ZKIC_INIT * 0.5*(PTHLM(:,KK)+PTHLM(:,KK+KKL))+(1. - ZKIC_INIT)*PTHL_UP(:) + ZMIXRT(:) = ZKIC_INIT * 0.5*(PRTM(:,KK)+PRTM(:,KK+KKL))+(1. - ZKIC_INIT)*PRT_UP(:) + CALL TH_R_FROM_THL_RT_1D(HFRAC_ICE,ZFRAC_ICE,& + PPRE_PLUS_HALF,ZMIXTHL,ZMIXRT,& + ZTHMIX,ZRVMIX,PRC_MIX,PRI_MIX,& + ZRSATW, ZRSATI) + ZTHVMIX_F2(:) = ZTHMIX(:)*(1.+ZRVORD*ZRVMIX(:))/(1.+ZMIXRT(:)) + + !Computation of mean ZKIC over the cloudy part + DO JLOOP=1,SIZE(OTEST) + IF (OTEST(JLOOP)) THEN + ! Compute ZKIC at the bottom of cloudy part + ! Thetav_up at bottom is equal to Thetav_up at flux level KK + IF (ABS(PTHV_UP(JLOOP)-ZTHVMIX(JLOOP))<1.E-10) THEN + ZKIC(JLOOP)=1. + ELSE + ZKIC(JLOOP) = MAX(0.,PTHV_UP(JLOOP)-ZTHV(JLOOP))*ZKIC_INIT / & + (PTHV_UP(JLOOP)-ZTHVMIX(JLOOP)) + END IF + ! Compute ZKIC_F2 at flux level KK+KKL + IF (ABS(ZTHV_UP_F2(JLOOP)-ZTHVMIX_F2(JLOOP))<1.E-10) THEN + ZKIC_F2(JLOOP)=1. + ELSE + ZKIC_F2(JLOOP) = MAX(0.,ZTHV_UP_F2(JLOOP)-ZTHV_PLUS_HALF(JLOOP))*ZKIC_INIT / & + (ZTHV_UP_F2(JLOOP)-ZTHVMIX_F2(JLOOP)) + END IF + !Mean ZKIC over the cloudy part + ZKIC(JLOOP)=MAX(MIN(0.5*(ZKIC(JLOOP)+ZKIC_F2(JLOOP)),1.),0.) + END IF + END DO + + +! 3.3 Integration of PDF +! According to Kain and Fritsch (1990), we replace delta Mt +! in eq. (7) and (8) using eq. (5). Here we compute the ratio +! of integrals without computing delta Me + + !Constant PDF + !For this PDF, eq. (5) is delta Me=0.5*delta Mt + DO JLOOP=1,SIZE(OTEST) + IF(OTEST(JLOOP)) THEN + ZEPSI(JLOOP) = ZKIC(JLOOP)**2. !integration multiplied by 2 + ZDELTA(JLOOP) = (1.-ZKIC(JLOOP))**2. !idem + ENDIF + ENDDO + + !Triangular PDF + !Calculus must be verified before activating this part, but in this state, + !results on ARM case are almost identical + !For this PDF, eq. (5) is also delta Me=0.5*delta Mt + !WHERE(OTEST) + ! !Integration multiplied by 2 + ! WHERE(ZKIC<0.5) + ! ZEPSI(:)=8.*ZKIC(:)**3/3. + ! ZDELTA(:)=1.-4.*ZKIC(:)**2+8.*ZKIC(:)**3/3. + ! ELSEWHERE + ! ZEPSI(:)=5./3.-4*ZKIC(:)**2+8.*ZKIC(:)**3/3. + ! ZDELTA(:)=8.*(1.-ZKIC(:))**3/3. + ! ENDWHERE + !ENDWHERE + +! 3.4 Computation of PENTR and PDETR + DO JLOOP=1,SIZE(OTEST) + IF(OTEST(JLOOP)) THEN + ZEPSI_CLOUD(JLOOP)=MIN(ZDELTA(JLOOP),ZEPSI(JLOOP)) + PENTR_CLD(JLOOP) = (1.-PPART_DRY(JLOOP))*ZCOEFFMF_CLOUD*PRHODREF(JLOOP)*ZEPSI_CLOUD(JLOOP) + PDETR_CLD(JLOOP) = (1.-PPART_DRY(JLOOP))*ZCOEFFMF_CLOUD*PRHODREF(JLOOP)*ZDELTA(JLOOP) + PENTR(JLOOP) = PENTR(JLOOP)+PENTR_CLD(JLOOP) + PDETR(JLOOP) = PDETR(JLOOP)+PDETR_CLD(JLOOP) + ELSE + PENTR_CLD(JLOOP) = 0. + PDETR_CLD(JLOOP) = 0. + ENDIF + ENDDO + +END SUBROUTINE COMPUTE_ENTR_DETR diff --git a/src/mesonh/turb/compute_frac_ice.f90 b/src/mesonh/turb/compute_frac_ice.f90 new file mode 100644 index 000000000..b0e8e7b2d --- /dev/null +++ b/src/mesonh/turb/compute_frac_ice.f90 @@ -0,0 +1,286 @@ +!MNH_LIC Copyright 2006-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ######spl + MODULE MODI_COMPUTE_FRAC_ICE +! ############################ +! +INTERFACE COMPUTE_FRAC_ICE +! + SUBROUTINE COMPUTE_FRAC_ICE3D(HFRAC_ICE,PFRAC_ICE,PT) +! +CHARACTER(len=1), INTENT(IN) :: HFRAC_ICE +REAL, DIMENSION(:,:,:), INTENT(IN) :: PT +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PFRAC_ICE +! + END SUBROUTINE COMPUTE_FRAC_ICE3D +! + SUBROUTINE COMPUTE_FRAC_ICE2D(HFRAC_ICE,PFRAC_ICE,PT) +! +CHARACTER(len=1), INTENT(IN) :: HFRAC_ICE +REAL, DIMENSION(:,:), INTENT(IN) :: PT +REAL, DIMENSION(:,:), INTENT(INOUT) :: PFRAC_ICE +! + END SUBROUTINE COMPUTE_FRAC_ICE2D + + SUBROUTINE COMPUTE_FRAC_ICE1D(HFRAC_ICE,PFRAC_ICE,PT) +! +CHARACTER(len=1), INTENT(IN) :: HFRAC_ICE +REAL, DIMENSION(:), INTENT(IN) :: PT +REAL, DIMENSION(:), INTENT(INOUT) :: PFRAC_ICE + + END SUBROUTINE COMPUTE_FRAC_ICE1D + +END INTERFACE +! +END MODULE MODI_COMPUTE_FRAC_ICE +! +! ############################## + MODULE MODI_COMPUTE_FRAC_ICE3D +! ############################## + +INTERFACE +! + SUBROUTINE COMPUTE_FRAC_ICE3D(HFRAC_ICE,PFRAC_ICE,PT) +! +CHARACTER(len=1), INTENT(IN) :: HFRAC_ICE +REAL, DIMENSION(:,:,:), INTENT(IN) :: PT +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PFRAC_ICE +! + END SUBROUTINE COMPUTE_FRAC_ICE3D +END INTERFACE +END MODULE MODI_COMPUTE_FRAC_ICE3D +! +! ############################## + MODULE MODI_COMPUTE_FRAC_ICE1D +! ############################## + +INTERFACE +! + SUBROUTINE COMPUTE_FRAC_ICE1D(HFRAC_ICE,PFRAC_ICE,PT) +! +CHARACTER(len=1), INTENT(IN) :: HFRAC_ICE +REAL, DIMENSION(:), INTENT(IN) :: PT +REAL, DIMENSION(:), INTENT(INOUT) :: PFRAC_ICE +! + END SUBROUTINE COMPUTE_FRAC_ICE1D +END INTERFACE +END MODULE MODI_COMPUTE_FRAC_ICE1D +! ########################################################## + SUBROUTINE COMPUTE_FRAC_ICE3D(HFRAC_ICE,PFRAC_ICE,PT) +! ################################################################# +! +! +!!**** *COMPUTE_FRAC_ICE* - computes ice fraction +!! +!! PURPOSE +!! ------- +!! +!!** METHOD +!! ------ +!! +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! Julien PERGAUD * Meteo-France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 13/03/06 +!! S. Riette April 2011 optimisation +!! +!! -------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODI_COMPUTE_FRAC_ICE1D +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments +! +CHARACTER(len=1), INTENT(IN) :: HFRAC_ICE ! scheme to use +REAL, DIMENSION(:,:,:), INTENT(IN) :: PT ! Temperature +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PFRAC_ICE ! Ice fraction (1 for ice only, 0 for liquid only) +!------------------------------------------------------------------------- +! +! 0.2 declaration of local variables +! +INTEGER :: JJ, JK +!------------------------------------------------------------------------- +! +! 0.3 Initialisation +! +! +!---------------------------------------------------------------------------- +! +! 1 Compute FRAC_ICE +! ---------------- +! +DO JK=1, SIZE(PT,3) + DO JJ=1, SIZE(PT,2) + CALL COMPUTE_FRAC_ICE1D(HFRAC_ICE,PFRAC_ICE(:,JJ,JK),PT(:,JJ,JK)) + ENDDO +ENDDO + + +END SUBROUTINE COMPUTE_FRAC_ICE3D +! ########################################################## + SUBROUTINE COMPUTE_FRAC_ICE2D(HFRAC_ICE,PFRAC_ICE,PT) +! ########################################################## +! +! +!!**** *COMPUTE_FRAC_ICE* - computes ice fraction +!! +!! PURPOSE +!! ------- +!! +!!** METHOD +!! ------ +!! +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! Julien PERGAUD * Meteo-France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 13/03/06 +!! S. Riette April 2011 optimisation +!! +!! -------------------------------------------------------------------------- +! 0. DECLARATIONS +! ------------ +! +USE MODI_COMPUTE_FRAC_ICE1D +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments +! +CHARACTER(len=1), INTENT(IN) :: HFRAC_ICE ! scheme to use +REAL, DIMENSION(:,:), INTENT(IN) :: PT ! Temperature +REAL, DIMENSION(:,:), INTENT(INOUT) :: PFRAC_ICE ! Ice fraction (1 for ice only, 0 for liquid only) +!------------------------------------------------------------------------- +! +! 0.2 declaration of local variables +! +INTEGER :: JK +!------------------------------------------------------------------------- +! +! 0.3 Initialisation +! +! +!---------------------------------------------------------------------------- +! +! 1 Compute FRAC_ICE +! ---------------- +! +DO JK=1, SIZE(PT,2) + CALL COMPUTE_FRAC_ICE1D(HFRAC_ICE,PFRAC_ICE(:,JK),PT(:,JK)) +ENDDO + + +END SUBROUTINE COMPUTE_FRAC_ICE2D +! ########################################################## + SUBROUTINE COMPUTE_FRAC_ICE1D(HFRAC_ICE,PFRAC_ICE,PT) +! ########################################################## +! +! +!!**** *COMPUTE_FRAC_ICE* - computes ice fraction +!! +!! PURPOSE +!! ------- +!! +!!** METHOD +!! ------ +!! +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! Julien PERGAUD * Meteo-France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 13/03/06 +!! S. Riette April 2011 optimisation +!! S. Riette 08/2016 add option O +! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg +!! +!! -------------------------------------------------------------------------- +! 0. DECLARATIONS +! ------------ +! +USE MODD_NEB, ONLY : XTMINMIX, XTMAXMIX +USE MODD_CST, ONLY : XTT +USE MODE_MSG +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments +! +CHARACTER(len=1), INTENT(IN) :: HFRAC_ICE ! scheme to use +REAL, DIMENSION(:), INTENT(IN) :: PT ! temperature +REAL, DIMENSION(:), INTENT(INOUT) :: PFRAC_ICE ! Ice fraction (1 for ice only, 0 for liquid only) +! +! 0.2 declaration of local variables +! +! +! 0.2 initialisation +! +! +!------------------------------------------------------------------------ +! 1. Compute FRAC_ICE +! +IF (HFRAC_ICE=='T') THEN !using Temperature + PFRAC_ICE(:) = ( XTMAXMIX - PT(:) ) / ( XTMAXMIX - XTMINMIX ) ! freezing interval +ELSEIF (HFRAC_ICE=='O') THEN !using Temperature with old formulae + PFRAC_ICE(:) = ( XTT - PT(:) ) / 40. ! freezing interval +ELSEIF (HFRAC_ICE=='N') THEN !No ice + PFRAC_ICE(:) = 0. +ELSEIF (HFRAC_ICE=='S') THEN !Same as previous + !nothing to do +ELSE + call Print_msg(NVERB_FATAL,'GEN','COMPUTE_FRAC_ICE','invalid option for HFRAC_ICE='//HFRAC_ICE) +ENDIF + +PFRAC_ICE(:) = MAX( 0., MIN(1., PFRAC_ICE(:) ) ) + + +END SUBROUTINE COMPUTE_FRAC_ICE1D diff --git a/src/mesonh/turb/compute_function_thermo_mf.f90 b/src/mesonh/turb/compute_function_thermo_mf.f90 new file mode 100644 index 000000000..ae9499c70 --- /dev/null +++ b/src/mesonh/turb/compute_function_thermo_mf.f90 @@ -0,0 +1,238 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +! ######spl + MODULE MODI_COMPUTE_FUNCTION_THERMO_MF +! ###################################### +! +INTERFACE + +! ################################################################# + SUBROUTINE COMPUTE_FUNCTION_THERMO_MF( KRR,KRRL,KRRI, & + PTH, PR, PEXN, PFRAC_ICE, PPABS, & + PT, PAMOIST,PATHETA ) +! ################################################################# + +!* 1.1 Declaration of Arguments +! + +INTEGER, INTENT(IN) :: KRR ! number of moist var. +INTEGER, INTENT(IN) :: KRRL ! number of liquid water var. +INTEGER, INTENT(IN) :: KRRI ! number of ice water var. + +REAL, DIMENSION(:,:), INTENT(IN) :: PTH ! theta +REAL, DIMENSION(:,:,:), INTENT(IN) :: PR ! water species +REAL, DIMENSION(:,:) , INTENT(IN) :: PPABS,PEXN ! pressure, Exner funct. +REAL, DIMENSION(:,:) , INTENT(IN) :: PFRAC_ICE ! ice fraction + +REAL, DIMENSION(:,:), INTENT(OUT) :: PT ! temperature + +REAL, DIMENSION(:,:), INTENT(OUT) :: PAMOIST,PATHETA +! +END SUBROUTINE COMPUTE_FUNCTION_THERMO_MF + +END INTERFACE +! +END MODULE MODI_COMPUTE_FUNCTION_THERMO_MF +! ######spl + SUBROUTINE COMPUTE_FUNCTION_THERMO_MF( KRR,KRRL,KRRI, & + PTH, PR, PEXN, PFRAC_ICE, PPABS, & + PT,PAMOIST,PATHETA ) +! ################################################################# +! +!! +!!**** *COMPUTE_FUNCTION_THERMO_MF* - +!! +!! PURPOSE +!! ------- +!! +!!** METHOD +!! ------ +!! +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! +!! JP Pinty *LA* +!! +!! MODIFICATIONS +!! ------------- +!! Original 24/02/03 +!! Externalisation of computations done in TURB and MF_TURB (Malardel and Pergaud, fev. 2007) +!! Optimization : V.Masson, 09/2010 +!! S. Riette Sept 2011 : remove of unused PL?OCPEXN, use of received ice fraction +!! +!! -------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments +! +INTEGER, INTENT(IN) :: KRR ! number of moist var. +INTEGER, INTENT(IN) :: KRRL ! number of liquid water var. +INTEGER, INTENT(IN) :: KRRI ! number of ice water var. + +REAL, DIMENSION(:,:), INTENT(IN) :: PTH ! theta +REAL, DIMENSION(:,:,:), INTENT(IN) :: PR ! water species +REAL, DIMENSION(:,:) , INTENT(IN) :: PPABS,PEXN ! pressure, Exner funct. +REAL, DIMENSION(:,:) , INTENT(IN) :: PFRAC_ICE ! ice fraction + +REAL, DIMENSION(:,:), INTENT(OUT) :: PT ! temperature + +REAL, DIMENSION(:,:), INTENT(OUT) :: PAMOIST,PATHETA +! +!------------------------------------------------------------------------------- +! +!* 0.2 Declarations of local variables +! +REAL :: ZEPS ! XMV / XMD +REAL, DIMENSION(SIZE(PTH,1),SIZE(PTH,2)) :: & + ZCP, & ! Cp + ZE, & ! Saturation mixing ratio + ZDEDT, & ! Saturation mixing ratio derivative + ZAMOIST_W, & ! Coefficients for s = f (Thetal,Rnp) + ZATHETA_W, & ! + ZAMOIST_I, & ! + ZATHETA_I, & ! + ZLVOCP,ZLSOCP + +INTEGER :: JRR +! +!------------------------------------------------------------------------------- +! +! + ZEPS = XMV / XMD + +! +!* Cph +! +ZCP=XCPD + +IF (KRR > 0) ZCP(:,:) = ZCP(:,:) + XCPV * PR(:,:,1) + +DO JRR = 2,1+KRRL ! loop on the liquid components + ZCP(:,:) = ZCP(:,:) + XCL * PR(:,:,JRR) +END DO + +DO JRR = 2+KRRL,1+KRRL+KRRI ! loop on the solid components + ZCP(:,:) = ZCP(:,:) + XCI * PR(:,:,JRR) +END DO + +!* Temperature +! +PT(:,:) = PTH(:,:) * PEXN(:,:) +! +! +!! Liquid water +! +IF ( KRRL >= 1 ) THEN +! +!* Lv/Cph +! + ZLVOCP(:,:) = (XLVTT + (XCPV-XCL) * (PT(:,:)-XTT) ) / ZCP(:,:) +! +!* Saturation vapor pressure with respect to water +! + ZE(:,:) = EXP( XALPW - XBETAW/PT(:,:) - XGAMW*ALOG( PT(:,:) ) ) +! +!* Saturation mixing ratio with respect to water +! + ZE(:,:) = ZE(:,:) * ZEPS / ( PPABS(:,:) - ZE(:,:) ) +! +!* Compute the saturation mixing ratio derivative (rvs') +! + ZDEDT(:,:) = ( XBETAW / PT(:,:) - XGAMW ) / PT(:,:) & + * ZE(:,:) * ( 1. + ZE(:,:) / ZEPS ) +! +!* Compute Amoist +! + ZAMOIST_W(:,:)= 0.5 / ( 1.0 + ZDEDT(:,:) * ZLVOCP(:,:) ) +! +!* Compute Atheta +! + ZATHETA_W(:,:)= ZAMOIST_W(:,:) * PEXN(:,:) * & + ( ( ZE(:,:) - PR(:,:,1) ) * ZLVOCP(:,:) / & + ( 1. + ZDEDT(:,:) * ZLVOCP(:,:) ) * & + ( & + ZE(:,:) * (1. + ZE(:,:)/ZEPS) & + * ( -2.*XBETAW/PT(:,:) + XGAMW ) / PT(:,:)**2 & + +ZDEDT(:,:) * (1. + 2. * ZE(:,:)/ZEPS) & + * ( XBETAW/PT(:,:) - XGAMW ) / PT(:,:) & + ) & + - ZDEDT(:,:) & + ) + +! +!! Solid water +! + IF ( KRRI >= 1 ) THEN + +! +!* Ls/Cph +! + ZLSOCP(:,:) = (XLSTT + (XCPV-XCI) * (PT(:,:)-XTT) ) / ZCP(:,:) +! +!* Saturation vapor pressure with respect to ice +! + ZE(:,:) = EXP( XALPI - XBETAI/PT(:,:) - XGAMI*ALOG( PT(:,:) ) ) +! +!* Saturation mixing ratio with respect to ice +! + ZE(:,:) = ZE(:,:) * ZEPS / ( PPABS(:,:) - ZE(:,:) ) +! +!* Compute the saturation mixing ratio derivative (rvs') +! + ZDEDT(:,:) = ( XBETAI / PT(:,:) - XGAMI ) / PT(:,:) & + * ZE(:,:) * ( 1. + ZE(:,:) / ZEPS ) +! +!* Compute Amoist +! + ZAMOIST_I(:,:)= 0.5 / ( 1.0 + ZDEDT(:,:) * ZLSOCP(:,:) ) +! +!* Compute Atheta +! + ZATHETA_I(:,:)= ZAMOIST_I(:,:) * PEXN(:,:) * & + ( ( ZE(:,:) - PR(:,:,1) ) * ZLSOCP(:,:) / & + ( 1. + ZDEDT(:,:) * ZLSOCP(:,:) ) * & + ( & + ZE(:,:) * (1. + ZE(:,:)/ZEPS) & + * ( -2.*XBETAI/PT(:,:) + XGAMI ) / PT(:,:)**2 & + +ZDEDT(:,:) * (1. + 2. * ZE(:,:)/ZEPS) & + * ( XBETAI/PT(:,:) - XGAMI ) / PT(:,:) & + ) & + - ZDEDT(:,:) & + ) + + ELSE + ZAMOIST_I(:,:)=0. + ZATHETA_I(:,:)=0. + ENDIF + + PAMOIST(:,:) = (1.0-PFRAC_ICE(:,:))*ZAMOIST_W(:,:) & + +PFRAC_ICE(:,:) *ZAMOIST_I(:,:) + PATHETA(:,:) = (1.0-PFRAC_ICE(:,:))*ZATHETA_W(:,:) & + +PFRAC_ICE(:,:) *ZATHETA_I(:,:) + +! +ELSE + PAMOIST(:,:) = 0. + PATHETA(:,:) = 0. +ENDIF +END SUBROUTINE COMPUTE_FUNCTION_THERMO_MF diff --git a/src/mesonh/turb/compute_mf_cloud.f90 b/src/mesonh/turb/compute_mf_cloud.f90 new file mode 100644 index 000000000..23f94bce5 --- /dev/null +++ b/src/mesonh/turb/compute_mf_cloud.f90 @@ -0,0 +1,196 @@ +!MNH_LIC Copyright 2009-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ######spl + MODULE MODI_COMPUTE_MF_CLOUD +! ############################ +! +INTERFACE +! ################################################################# + SUBROUTINE COMPUTE_MF_CLOUD(KKA,KKB,KKE,KKU,KKL,KRR,KRRL,KRRI,HMF_CLOUD,& + PFRAC_ICE, & + PRC_UP,PRI_UP,PEMF, & + PTHL_UP, PRT_UP, PFRAC_UP, & + PTHV_UP, PFRAC_ICE_UP, PRSAT_UP, & + PEXNM, PTHLM, PRTM, PTHM, PTHVM, PRM, & + PDZZ, PZZ, KKLCL, & + PPABSM, PRHODREF, & + PRC_MF, PRI_MF, PCF_MF, PSIGMF, PDEPTH ) +! ################################################################# +!! +! +!* 1.1 Declaration of Arguments +! +INTEGER, INTENT(IN) :: KKA ! near ground array index +INTEGER, INTENT(IN) :: KKB ! near ground physical index +INTEGER, INTENT(IN) :: KKE ! uppest atmosphere physical index +INTEGER, INTENT(IN) :: KKU ! uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +INTEGER, INTENT(IN) :: KRR ! number of moist var. +INTEGER, INTENT(IN) :: KRRL ! number of liquid water var. +INTEGER, INTENT(IN) :: KRRI ! number of ice water var. +CHARACTER (LEN=4), INTENT(IN) :: HMF_CLOUD ! Type of statistical cloud scheme +REAL, DIMENSION(:,:), INTENT(IN) :: PFRAC_ICE ! liquid/ice fraction +REAL, DIMENSION(:,:), INTENT(IN) :: PRC_UP,PRI_UP,PEMF ! updraft characteritics +REAL, DIMENSION(:,:), INTENT(IN) :: PTHL_UP, PRT_UP +REAL, DIMENSION(:,:), INTENT(IN) :: PFRAC_UP +REAL, DIMENSION(:,:), INTENT(IN) :: PTHV_UP ! updraft thetaV +REAL, DIMENSION(:,:), INTENT(IN) :: PFRAC_ICE_UP ! liquid/solid fraction in updraft +REAL, DIMENSION(:,:), INTENT(IN) :: PRSAT_UP ! Rsat in updraft +REAL, DIMENSION(:,:), INTENT(IN) :: PEXNM ! exner function +REAL, DIMENSION(:,:), INTENT(IN) :: PTHLM, PRTM ! cons. var. at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PTHM, PTHVM ! theta and thetaV +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRM ! water var. at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PDZZ, PZZ +INTEGER, DIMENSION(:), INTENT(IN) :: KKLCL ! index of updraft condensation level +REAL, DIMENSION(:,:), INTENT(IN) :: PPABSM, PRHODREF ! environement +REAL, DIMENSION(:,:), INTENT(OUT) :: PRC_MF, PRI_MF ! cloud content and +REAL, DIMENSION(:,:), INTENT(OUT) :: PCF_MF ! cloud fraction for MF scheme +REAL, DIMENSION(:,:), INTENT(OUT) :: PSIGMF ! SQRT(variance) for statistical cloud scheme +REAL, DIMENSION(:), INTENT(IN) :: PDEPTH ! Deepness of cloud + +END SUBROUTINE COMPUTE_MF_CLOUD + +END INTERFACE +! +END MODULE MODI_COMPUTE_MF_CLOUD +! ######spl + SUBROUTINE COMPUTE_MF_CLOUD(KKA,KKB,KKE,KKU,KKL,KRR,KRRL,KRRI,HMF_CLOUD, & + PFRAC_ICE, & + PRC_UP,PRI_UP,PEMF, & + PTHL_UP, PRT_UP, PFRAC_UP, & + PTHV_UP, PFRAC_ICE_UP, PRSAT_UP, & + PEXNM, PTHLM, PRTM, PTHM, PTHVM, PRM, & + PDZZ, PZZ, KKLCL, & + PPABSM, PRHODREF, & + PRC_MF, PRI_MF, PCF_MF, PSIGMF, PDEPTH ) +! ################################################################# +!! +!!**** *COMPUTE_MF_CLOUD* - +!! compute diagnostic subgrid cumulus cloud caracteristics +!! +!! PURPOSE +!! ------- +!!**** The purpose of this routine is to compute the cloud fraction and +!! the mean cloud content associated with clouds described by the +!! mass flux scheme +!! +! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! +!! AUTHOR +!! ------ +!! +!! MODIFICATIONS +!! ------------- +!! Original +!! S. Riette Dec 2010 BIGA case +!! S. Riette Aug 2011 code is split into subroutines +!! S. Riette Jan 2012: support for both order of vertical levels +! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg +!! -------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +use mode_msg +! +USE MODI_COMPUTE_MF_CLOUD_BIGAUS +USE MODI_COMPUTE_MF_CLOUD_DIRECT +USE MODI_COMPUTE_MF_CLOUD_STAT +! + +IMPLICIT NONE + +!* 1.1 Declaration of Arguments +! +! +! +INTEGER, INTENT(IN) :: KKA ! near ground array index +INTEGER, INTENT(IN) :: KKB ! near ground physical index +INTEGER, INTENT(IN) :: KKE ! uppest atmosphere physical index +INTEGER, INTENT(IN) :: KKU ! uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +INTEGER, INTENT(IN) :: KRR ! number of moist var. +INTEGER, INTENT(IN) :: KRRL ! number of liquid water var. +INTEGER, INTENT(IN) :: KRRI ! number of ice water var. +CHARACTER (LEN=4), INTENT(IN) :: HMF_CLOUD ! Type of statistical cloud scheme +REAL, DIMENSION(:,:), INTENT(IN) :: PFRAC_ICE ! liquid/ice fraction +REAL, DIMENSION(:,:), INTENT(IN) :: PRC_UP,PRI_UP,PEMF! updraft characteritics +REAL, DIMENSION(:,:), INTENT(IN) :: PTHL_UP, PRT_UP ! rc,w,Mass Flux,Thetal,rt +REAL, DIMENSION(:,:), INTENT(IN) :: PFRAC_UP ! Updraft Fraction +REAL, DIMENSION(:,:), INTENT(IN) :: PTHV_UP ! updraft thetaV +REAL, DIMENSION(:,:), INTENT(IN) :: PFRAC_ICE_UP ! liquid/solid fraction in updraft +REAL, DIMENSION(:,:), INTENT(IN) :: PRSAT_UP ! Rsat in updraft +REAL, DIMENSION(:,:), INTENT(IN) :: PEXNM ! exner function +REAL, DIMENSION(:,:), INTENT(IN) :: PTHLM, PRTM ! cons. var. at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PTHM, PTHVM ! theta and thetaV +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRM ! water var. at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PDZZ, PZZ +INTEGER, DIMENSION(:), INTENT(IN) :: KKLCL ! index of updraft condensation level +REAL, DIMENSION(:,:), INTENT(IN) :: PPABSM, PRHODREF ! environement +REAL, DIMENSION(:,:), INTENT(OUT) :: PRC_MF, PRI_MF ! cloud content (INPUT=environment, OUTPUT=conv. cloud) +REAL, DIMENSION(:,:), INTENT(OUT) :: PCF_MF ! and cloud fraction for MF scheme +REAL, DIMENSION(:,:), INTENT(OUT) :: PSIGMF ! SQRT(variance) for statistical cloud scheme +REAL, DIMENSION(:), INTENT(IN) :: PDEPTH ! Deepness of cloud + +! +! 1.2 Declaration of local variables +! +!------------------------------------------------------------------------ + +! 1. INITIALISATION +! +! +! 2.1 Internal domain + +PRC_MF = 0. +PRI_MF = 0. +PCF_MF = 0. +PSIGMF = 0. + +IF (HMF_CLOUD == 'DIRE') THEN + !Direct cloud scheme + CALL COMPUTE_MF_CLOUD_DIRECT(KKE, KKL, & + &KKLCL(:), PFRAC_UP(:,:), PRC_UP(:,:), PRI_UP(:,:),& + &PRC_MF(:,:), PRI_MF(:,:), PCF_MF(:,:)) + ! +ELSEIF (HMF_CLOUD == 'STAT') THEN + !Statistical scheme using the PDF proposed by Bougeault (81, 82) and + !Bechtold et al (95). + CALL COMPUTE_MF_CLOUD_STAT(KKA, KKB, KKE, KKU, KKL, KRR, KRRL, KRRI,& + &PFRAC_ICE,& + &PTHLM, PRTM, PPABSM, PRM,& + &PDZZ, PTHM, PEXNM,& + &PEMF, PTHL_UP, PRT_UP,& + &PSIGMF) +ELSEIF (HMF_CLOUD == 'BIGA') THEN + !Statistical scheme using the bi-gaussian PDF proposed by E. Perraud. + CALL COMPUTE_MF_CLOUD_BIGAUS(KKA, KKB, KKE, KKU, KKL,& + &PEMF, PDEPTH,& + &PRT_UP, PTHV_UP, PFRAC_ICE_UP, PRSAT_UP,& + &PRTM, PTHM, PTHVM,& + &PDZZ, PZZ, PRHODREF,& + &PRC_MF, PRI_MF, PCF_MF) + ! +ELSEIF (HMF_CLOUD == 'NONE') THEN + ! No CONVECTIVE CLOUD SCHEME + ! Nothing to do: PRC_MF, PRI_MF, PCF_MF, PSIGMF are already filled with zero +ELSE + call Print_msg(NVERB_FATAL,'GEN','COMPUTE_MF_CLOUD','Shallow convection cloud scheme not valid: HMF_CLOUD='//TRIM(HMF_CLOUD)) +ENDIF + +END SUBROUTINE COMPUTE_MF_CLOUD diff --git a/src/mesonh/turb/compute_mf_cloud_bigaus.f90 b/src/mesonh/turb/compute_mf_cloud_bigaus.f90 new file mode 100644 index 000000000..b080f9923 --- /dev/null +++ b/src/mesonh/turb/compute_mf_cloud_bigaus.f90 @@ -0,0 +1,209 @@ +!MNH_LIC Copyright 2011-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ######spl + MODULE MODI_COMPUTE_MF_CLOUD_BIGAUS +! ################################### +! +INTERFACE +! ################################################################# + SUBROUTINE COMPUTE_MF_CLOUD_BIGAUS(KKA, KKB, KKE, KKU, KKL,& + PEMF, PDEPTH,& + PRT_UP, PTHV_UP, PFRAC_ICE_UP, PRSAT_UP,& + PRTM, PTHM, PTHVM,& + PDZZ, PZZ, PRHODREF,& + PRC_MF, PRI_MF, PCF_MF) +! ################################################################# +!! +! +!* 1.1 Declaration of Arguments +! +INTEGER, INTENT(IN) :: KKA ! near ground array index +INTEGER, INTENT(IN) :: KKB ! near ground physical index +INTEGER, INTENT(IN) :: KKE ! uppest atmosphere physical index +INTEGER, INTENT(IN) :: KKU ! uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:), INTENT(IN) :: PEMF ! updraft characteritics +REAL, DIMENSION(:), INTENT(IN) :: PDEPTH ! Deepness of cloud +REAL, DIMENSION(:,:), INTENT(IN) :: PTHV_UP, PRSAT_UP, PRT_UP ! updraft characteritics +REAL, DIMENSION(:,:), INTENT(IN) :: PFRAC_ICE_UP ! liquid/ice fraction in updraft +REAL, DIMENSION(:,:), INTENT(IN) :: PTHM, PRTM, PTHVM ! env. var. at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PDZZ, PZZ +REAL, DIMENSION(:,:), INTENT(IN) :: PRHODREF +REAL, DIMENSION(:,:), INTENT(OUT) :: PRC_MF, PRI_MF ! cloud content +REAL, DIMENSION(:,:), INTENT(OUT) :: PCF_MF ! and cloud fraction for MF scheme + +END SUBROUTINE COMPUTE_MF_CLOUD_BIGAUS + +END INTERFACE +! +END MODULE MODI_COMPUTE_MF_CLOUD_BIGAUS +! ######spl + SUBROUTINE COMPUTE_MF_CLOUD_BIGAUS(KKA, KKB, KKE, KKU, KKL,& + PEMF, PDEPTH,& + PRT_UP, PTHV_UP, PFRAC_ICE_UP, PRSAT_UP,& + PRTM, PTHM, PTHVM,& + PDZZ, PZZ, PRHODREF,& + PRC_MF, PRI_MF, PCF_MF) +! ################################################################# +!! +!!**** *COMPUTE_MF_CLOUD_BIGAUS* - +!! compute diagnostic subgrid cumulus cloud caracteristics with a statistical scheme +!! based on a bi-gaussian PDF. In this routine, we only compute the shallow convection +!! part of this bi-gaussian +!! +!! PURPOSE +!! ------- +!!**** With this option, a formulation for the computation of the variance of the departure +!! to saturation is proposed. This variance is used to compute the cloud fraction and +!! the mean convective cloud content from the bi-gaussian PDF proposed by E. Perraud +!! +! +!!** METHOD +!! ------ +!! Updraft variables are used to diagnose the variance +!! Perraud et al (2011) +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! +!! AUTHOR +!! ------ +!! S. Riette moving of code previously in compute_mf_cloud code +!! +!! MODIFICATIONS +!! ------------- +!! Original 25 Aug 2011 +!! S. Riette Jan 2012: support for both order of vertical levels +!! S. Riette Jun 2019: remove unused PRC_UP and PRI_UP, use SIGN in ERFC computation +!! -------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +USE MODD_PARAM_MFSHALL_n, ONLY : XALPHA_MF, XSIGMA_MF +USE MODD_CST, ONLY : XPI, XG +! +USE MODI_SHUMAN_MF +USE MODI_GAMMA_INC +! +USE MODE_THERMO +! +! +IMPLICIT NONE +! +!* 0.1 Declaration of Arguments +! +INTEGER, INTENT(IN) :: KKA ! near ground array index +INTEGER, INTENT(IN) :: KKB ! near ground physical index +INTEGER, INTENT(IN) :: KKE ! uppest atmosphere physical index +INTEGER, INTENT(IN) :: KKU ! uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:), INTENT(IN) :: PEMF ! updraft characteritics +REAL, DIMENSION(:), INTENT(IN) :: PDEPTH ! Deepness of cloud +REAL, DIMENSION(:,:), INTENT(IN) :: PTHV_UP, PRSAT_UP, PRT_UP ! updraft characteritics +REAL, DIMENSION(:,:), INTENT(IN) :: PFRAC_ICE_UP ! liquid/ice fraction in updraft +REAL, DIMENSION(:,:), INTENT(IN) :: PTHM, PRTM, PTHVM ! env. var. at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PDZZ, PZZ +REAL, DIMENSION(:,:), INTENT(IN) :: PRHODREF +REAL, DIMENSION(:,:), INTENT(OUT) :: PRC_MF, PRI_MF ! cloud content +REAL, DIMENSION(:,:), INTENT(OUT) :: PCF_MF ! and cloud fraction for MF scheme +! +!* 0.1 Declaration of local variables +! +! +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZGRAD_Z_RT, & ! + & ZALPHA_UP_M, & ! Variables used to compute variance + & ZSIGMF ! and sqrt(variance) +REAL, DIMENSION(SIZE(PTHM,1)) :: ZOMEGA_UP_M ! +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZW1 ! working array +INTEGER :: JK ! vertical loop control +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZEMF_M, ZTHV_UP_M, & ! + & ZRSAT_UP_M, ZRT_UP_M,& ! Interpolation on mass points + & ZFRAC_ICE_UP_M ! +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZCOND ! condensate +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZA, ZGAM ! used for integration + + +!Computation is done on mass points +!---------------------------------------------------------------------------- +! +!* 1. Computation of the variance +! ------------------------------------------------ +! +! +!Vertical gradient of RT, result on mass points +ZW1(:,:)=GZ_M_W_MF(KKA,KKU,KKL, PRTM(:,:), PDZZ(:,:)) +ZGRAD_Z_RT(:,:)=MZF_MF(KKA,KKU,KKL, ZW1(:,:)) + +!Interpolation on mass points +ZTHV_UP_M(:,:) = MZF_MF(KKA,KKU,KKL, PTHV_UP(:,:)) +ZRSAT_UP_M(:,:)= MZF_MF(KKA,KKU,KKL, PRSAT_UP(:,:)) +ZRT_UP_M(:,:) = MZF_MF(KKA,KKU,KKL, PRT_UP(:,:)) +ZEMF_M(:,:) = MZF_MF(KKA,KKU,KKL, PEMF(:,:)) +ZFRAC_ICE_UP_M(:,:) = MZF_MF(KKA,KKU,KKL, PFRAC_ICE_UP(:,:)) + +!computation of omega star up +ZOMEGA_UP_M(:)=0. +DO JK=KKB,KKE,KKL + !Vertical integration over the entire column but only buoyant points are used + !ZOMEGA_UP_M(:)=ZOMEGA_UP_M(:) + & + ! ZEMF_M(:,JK) * & + ! MAX(0.,(ZTHV_UP_M(:,JK)-PTHVM(:,JK))) * & + ! (PZZ(:,JK+KKL)-PZZ(:,JK)) / & + ! (PTHM(:,JK) * PRHODREF(:,JK)) + + !Vertical integration over the entire column + ZOMEGA_UP_M(:)=ZOMEGA_UP_M(:) + & + ZEMF_M(:,JK) * & + (ZTHV_UP_M(:,JK)-PTHVM(:,JK)) * & + (PZZ(:,JK+KKL)-PZZ(:,JK)) / & + (PTHM(:,JK) * PRHODREF(:,JK)) +ENDDO +ZOMEGA_UP_M(:)=MAX(ZOMEGA_UP_M(:), 1.E-20) +ZOMEGA_UP_M(:)=(XG*ZOMEGA_UP_M(:))**(1./3.) + +!computation of alpha up +DO JK=KKA,KKU,KKL + ZALPHA_UP_M(:,JK)=ZEMF_M(:,JK)/(XALPHA_MF*PRHODREF(:,JK)*ZOMEGA_UP_M(:)) +ENDDO +ZALPHA_UP_M(:,:)=MAX(0., MIN(ZALPHA_UP_M(:,:), 1.)) + +!computation of sigma of the distribution +DO JK=KKA,KKU,KKL + ZSIGMF(:,JK)=ZEMF_M(:,JK) * & + (ZRT_UP_M(:,JK) - PRTM(:,JK)) * & + PDEPTH(:) * ZGRAD_Z_RT(:,JK) / & + (XSIGMA_MF * ZOMEGA_UP_M(:) * PRHODREF(:,JK)) +ENDDO +ZSIGMF(:,:)=SQRT(MAX(ABS(ZSIGMF(:,:)), 1.E-40)) +! +!* 2. PDF integration +! ------------------------------------------------ +! +!The mean of the distribution is ZRT_UP +!Computation of ZA and ZGAM (=efrc(ZA)) coefficient +ZA(:,:)=(ZRSAT_UP_M(:,:)-ZRT_UP_M(:,:))/(sqrt(2.)*ZSIGMF(:,:)) + +!Approximation of erf function +ZGAM(:,:)=1-SIGN(1., ZA(:,:))*SQRT(1-EXP(-4*ZA(:,:)**2/XPI)) + +!computation of cloud fraction +PCF_MF(:,:)=MAX( 0., MIN(1.,0.5*ZGAM(:,:) * ZALPHA_UP_M(:,:))) + +!computation of condensate, then PRC and PRI +ZCOND(:,:)=(EXP(-ZA(:,:)**2)-ZA(:,:)*SQRT(XPI)*ZGAM(:,:))*ZSIGMF(:,:)/SQRT(2.*XPI) * ZALPHA_UP_M(:,:) +ZCOND(:,:)=MAX(ZCOND(:,:), 0.) !due to approximation of ZGAM value, ZCOND could be slightly negative +PRC_MF(:,:)=(1.-ZFRAC_ICE_UP_M(:,:)) * ZCOND(:,:) +PRI_MF(:,:)=( ZFRAC_ICE_UP_M(:,:)) * ZCOND(:,:) + + +END SUBROUTINE COMPUTE_MF_CLOUD_BIGAUS diff --git a/src/mesonh/turb/compute_mf_cloud_direct.f90 b/src/mesonh/turb/compute_mf_cloud_direct.f90 new file mode 100644 index 000000000..c1c1b6220 --- /dev/null +++ b/src/mesonh/turb/compute_mf_cloud_direct.f90 @@ -0,0 +1,119 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +! ######spl + MODULE MODI_COMPUTE_MF_CLOUD_DIRECT +! ################################### +! +INTERFACE +! ################################################################# + SUBROUTINE COMPUTE_MF_CLOUD_DIRECT(KKE, KKL, & + &KKLCL, PFRAC_UP, PRC_UP, PRI_UP,& + &PRC_MF, PRI_MF, PCF_MF) +! ################################################################# +!! +! +!* 1.1 Declaration of Arguments +! +INTEGER, INTENT(IN) :: KKE ! uppest atmosphere physical index +INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +INTEGER, DIMENSION(:), INTENT(IN) :: KKLCL ! index of updraft condensation level +REAL, DIMENSION(:,:), INTENT(IN) :: PFRAC_UP ! Updraft Fraction +REAL, DIMENSION(:,:), INTENT(IN) :: PRC_UP,PRI_UP ! updraft characteritics +REAL, DIMENSION(:,:), INTENT(OUT) :: PRC_MF, PRI_MF ! cloud content (INPUT=environment, OUTPUT=conv. cloud) +REAL, DIMENSION(:,:), INTENT(OUT) :: PCF_MF ! and cloud fraction for MF scheme + +END SUBROUTINE COMPUTE_MF_CLOUD_DIRECT + +END INTERFACE +! +END MODULE MODI_COMPUTE_MF_CLOUD_DIRECT +! ######spl + SUBROUTINE COMPUTE_MF_CLOUD_DIRECT(KKE, KKL, & + &KKLCL, PFRAC_UP, PRC_UP, PRI_UP,& + &PRC_MF, PRI_MF, PCF_MF) +! ################################################################# +!! +!!**** *COMPUTE_MF_CLOUD_DIRECT* - +!! compute diagnostic subgrid cumulus cloud caracteristics with a direct scheme +!! +!! PURPOSE +!! ------- +!!**** The purpose of this routine is to compute the cloud fraction and +!! the mean cloud content associated with clouds described by the +!! mass flux scheme +!! +! +!!** METHOD +!! ------ +!! Updraft variables are used directly to diagnose subgrid clouds +!! This scheme may be activated only if the selected updraft model +!! gives the updraft fraction as an output +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! +!! AUTHOR +!! ------ +!! S. Riette moving of code previously in compute_mf_cloud code +!! +!! MODIFICATIONS +!! ------------- +!! Original 25 Aug 2011 +!! S. Riette Jan 2012: support for both order of vertical levels +!! -------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +USE MODD_PARAM_MFSHALL_n, ONLY : XKCF_MF +! +IMPLICIT NONE +! +!* 0.1 Declaration of Arguments +! +INTEGER, INTENT(IN) :: KKE ! uppest atmosphere physical index +INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +INTEGER, DIMENSION(:), INTENT(IN) :: KKLCL ! index of updraft condensation level +REAL, DIMENSION(:,:), INTENT(IN) :: PFRAC_UP ! Updraft Fraction +REAL, DIMENSION(:,:), INTENT(IN) :: PRC_UP,PRI_UP ! updraft characteritics +REAL, DIMENSION(:,:), INTENT(OUT) :: PRC_MF, PRI_MF ! cloud content +REAL, DIMENSION(:,:), INTENT(OUT) :: PCF_MF ! and cloud fraction for MF scheme +! +!* 0.1 Declaration of local variables +! +INTEGER :: JI,JK +! +!* 0.2 Initialisation +! +! +!* 1. COMPUTATION OF SUBGRID CLOUD +! ---------------------------- + +! +! Warning: updraft variables are on flux levels +! and PRC_MF, PRI_MF and PCF_MF are on mass levels +PRC_MF(:,:)=0. +PRI_MF(:,:)=0. +PCF_MF(:,:)=0. + +DO JI=1,SIZE(PCF_MF,1) + DO JK=KKLCL(JI),KKE-KKL,KKL + PCF_MF(JI,JK ) = MAX( 0., MIN(1.,XKCF_MF *0.5* ( & + & PFRAC_UP(JI,JK) + PFRAC_UP(JI,JK+KKL) ) )) + PRC_MF(JI,JK) = 0.5* XKCF_MF * ( PFRAC_UP(JI,JK)*PRC_UP(JI,JK) & + + PFRAC_UP(JI,JK+KKL)*PRC_UP(JI,JK+KKL) ) + PRI_MF(JI,JK) = 0.5* XKCF_MF * ( PFRAC_UP(JI,JK)*PRI_UP(JI,JK) & + + PFRAC_UP(JI,JK+KKL)*PRI_UP(JI,JK+KKL) ) + END DO +END DO + + +END SUBROUTINE COMPUTE_MF_CLOUD_DIRECT diff --git a/src/mesonh/turb/compute_mf_cloud_stat.f90 b/src/mesonh/turb/compute_mf_cloud_stat.f90 new file mode 100644 index 000000000..c3c78d467 --- /dev/null +++ b/src/mesonh/turb/compute_mf_cloud_stat.f90 @@ -0,0 +1,181 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +! ######spl + MODULE MODI_COMPUTE_MF_CLOUD_STAT +! ############################ +! +INTERFACE +! ################################################################# + SUBROUTINE COMPUTE_MF_CLOUD_STAT(KKA, KKB, KKE, KKU, KKL, KRR, KRRL, KRRI,& + &PFRAC_ICE,& + &PTHLM, PRTM, PPABSM, PRM,& + &PDZZ, PTHM, PEXNM,& + &PEMF, PTHL_UP, PRT_UP,& + &PSIGMF) +! ################################################################# +!! +! +!* 1.1 Declaration of Arguments +! +INTEGER, INTENT(IN) :: KKA ! near ground array index +INTEGER, INTENT(IN) :: KKB ! near ground physical index +INTEGER, INTENT(IN) :: KKE ! uppest atmosphere physical index +INTEGER, INTENT(IN) :: KKU ! uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +INTEGER, INTENT(IN) :: KRR ! number of moist var. +INTEGER, INTENT(IN) :: KRRL ! number of liquid water var. +INTEGER, INTENT(IN) :: KRRI ! number of ice water var. +REAL, DIMENSION(:,:), INTENT(IN) :: PFRAC_ICE ! liquid/ice fraction +REAL, DIMENSION(:,:), INTENT(IN) :: PTHLM, PRTM ! cons. var. at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PPABSM ! Pressure at time t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRM ! water var. at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PDZZ +REAL, DIMENSION(:,:), INTENT(IN) :: PTHM ! environement +REAL, DIMENSION(:,:), INTENT(IN) :: PEXNM +REAL, DIMENSION(:,:), INTENT(IN) :: PEMF ! updraft characteritics +REAL, DIMENSION(:,:), INTENT(IN) :: PTHL_UP, PRT_UP ! rc,w,Mass Flux,Thetal,rt +REAL, DIMENSION(:,:), INTENT(OUT) :: PSIGMF ! SQRT(variance) for statistical cloud scheme + + +END SUBROUTINE COMPUTE_MF_CLOUD_STAT + +END INTERFACE +! +END MODULE MODI_COMPUTE_MF_CLOUD_STAT +! ######spl + SUBROUTINE COMPUTE_MF_CLOUD_STAT(KKA, KKB, KKE, KKU, KKL, KRR, KRRL, KRRI,& + &PFRAC_ICE,& + &PTHLM, PRTM, PPABSM, PRM,& + &PDZZ, PTHM, PEXNM, & + &PEMF, PTHL_UP, PRT_UP,& + &PSIGMF) +! ################################################################# +!! +!!**** *COMPUTE_MF_CLOUD_STAT* - +!! compute diagnostic subgrid cumulus cloud caracteristics with a statistical scheme +!! +!! PURPOSE +!! ------- +!!**** With this option, a formulation for the computation of the variance of the departure +!! to saturation is proposed. +!! +! +!!** METHOD +!! ------ +!! Updraft variables are used to diagnose the variance +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! +!! AUTHOR +!! ------ +!! S. Riette moving of code previously in compute_mf_cloud code +!! +!! MODIFICATIONS +!! ------------- +!! Original 25 Aug 2011 +!! S. Riette Jan 2012: support for both order of vertical levels +!! -------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +USE MODD_PARAM_MFSHALL_n, ONLY : XTAUSIGMF +USE MODD_PARAMETERS, ONLY : JPHEXT, JPVEXT +! +USE MODI_SHUMAN_MF +USE MODI_COMPUTE_FUNCTION_THERMO_MF +! +! +IMPLICIT NONE +! +!* 0.1 Declaration of Arguments +! +INTEGER, INTENT(IN) :: KKA ! near ground array index +INTEGER, INTENT(IN) :: KKB ! near ground physical index +INTEGER, INTENT(IN) :: KKE ! uppest atmosphere physical index +INTEGER, INTENT(IN) :: KKU ! uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +INTEGER, INTENT(IN) :: KRR ! number of moist var. +INTEGER, INTENT(IN) :: KRRL ! number of liquid water var. +INTEGER, INTENT(IN) :: KRRI ! number of ice water var. +REAL, DIMENSION(:,:), INTENT(IN) :: PFRAC_ICE ! liquid/ice fraction +REAL, DIMENSION(:,:), INTENT(IN) :: PTHLM, PRTM ! cons. var. at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PPABSM ! Pressure at time t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRM ! water var. at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PDZZ +REAL, DIMENSION(:,:), INTENT(IN) :: PTHM ! environement +REAL, DIMENSION(:,:), INTENT(IN) :: PEXNM +REAL, DIMENSION(:,:), INTENT(IN) :: PEMF ! updraft characteritics +REAL, DIMENSION(:,:), INTENT(IN) :: PTHL_UP, PRT_UP ! rc,w,Mass Flux,Thetal,rt +REAL, DIMENSION(:,:), INTENT(OUT) :: PSIGMF ! SQRT(variance) for statistical cloud scheme +! +!* 0.1 Declaration of local variables +! +! +REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2)) :: ZFLXZ +REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2)) :: ZT +REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2)) :: ZAMOIST, ZATHETA +! +!* 0.2 initialisation +! +! +!---------------------------------------------------------------------------- +! +!* 1. COMPUTE SIGMA_MF (saturation deviation variance) +! Soares et al (2004) formulation +! ------------------------------------------------ +! +! Thermodynamics functions +CALL COMPUTE_FUNCTION_THERMO_MF( KRR,KRRL,KRRI, & + PTHM,PRM,PEXNM,PFRAC_ICE,PPABSM, & + ZT,ZAMOIST,ZATHETA ) +! +IF (KRRL > 0) THEN +! +!* 1.1 contribution from <THl THl> +! + +! + ZFLXZ(:,:) = -2 * XTAUSIGMF * PEMF(:,:)*(PTHL_UP(:,:)-MZM_MF(KKA,KKU,KKL,PTHLM(:,:))) * & + GZ_M_W_MF(KKA,KKU,KKL,PTHLM(:,:),PDZZ(:,:)) +! +! Avoid negative values + ZFLXZ(:,:) = MAX(0.,ZFLXZ(:,:)) + + + PSIGMF(:,:) = MZF_MF(KKA,KKU,KKL,ZFLXZ(:,:)) * ZATHETA(:,:)**2 + +! +! +!* 1.2 contribution from <Rnp Rnp> +! +! +! +! + ZFLXZ(:,:) = -2 * XTAUSIGMF * PEMF(:,:)*(PRT_UP(:,:)-MZM_MF(KKA,KKU,KKL,PRTM(:,:))) * & + GZ_M_W_MF(KKA,KKU,KKL,PRTM(:,:),PDZZ(:,:)) +! +! Avoid negative values + ZFLXZ(:,:) = MAX(0.,ZFLXZ(:,:)) +! + + PSIGMF(:,:) = PSIGMF(:,:) + ZAMOIST(:,:) **2 * MZF_MF(KKA,KKU,KKL,ZFLXZ(:,:)) +! +! 1.3 Vertical part of Sigma_s +! + PSIGMF(:,:) = SQRT( MAX (PSIGMF(:,:) , 0.) ) +ELSE + PSIGMF(:,:) = 0. +END IF +! +! +END SUBROUTINE COMPUTE_MF_CLOUD_STAT diff --git a/src/mesonh/turb/compute_updraft.f90 b/src/mesonh/turb/compute_updraft.f90 new file mode 100644 index 000000000..69985ecdb --- /dev/null +++ b/src/mesonh/turb/compute_updraft.f90 @@ -0,0 +1,647 @@ +!MNH_LIC Copyright 2004-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ######spl + MODULE MODI_COMPUTE_UPDRAFT +! ########################### +! +INTERFACE +! +! ################################################################# + SUBROUTINE COMPUTE_UPDRAFT(KKA,KKB,KKE,KKU,KKL, HFRAC_ICE, & + OENTR_DETR,OMIXUV, & + ONOMIXLG,KSV_LGBEG,KSV_LGEND, & + PZZ,PDZZ, & + PSFTH,PSFRV, & + PPABSM,PRHODREF,PUM,PVM,PTKEM, & + PTHM,PRVM,PTHLM,PRTM, & + PSVM,PTHL_UP,PRT_UP, & + PRV_UP,PRC_UP,PRI_UP,PTHV_UP, & + PW_UP,PU_UP, PV_UP, PSV_UP, & + PFRAC_UP,PFRAC_ICE_UP,PRSAT_UP, & + PEMF,PDETR,PENTR, & + PBUO_INTEG,KKLCL,KKETL,KKCTL, & + PDEPTH) +! ################################################################# +! +!* 1.1 Declaration of Arguments +! +! +! +INTEGER, INTENT(IN) :: KKA ! near ground array index +INTEGER, INTENT(IN) :: KKB ! near ground physical index +INTEGER, INTENT(IN) :: KKE ! uppest atmosphere physical index +INTEGER, INTENT(IN) :: KKU ! uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +CHARACTER(len=1), INTENT(IN) :: HFRAC_ICE ! partition liquid/ice scheme +LOGICAL, INTENT(IN) :: OENTR_DETR! flag to recompute entrainment, detrainment and mass flux +LOGICAL, INTENT(IN) :: OMIXUV ! True if mixing of momentum +LOGICAL, INTENT(IN) :: ONOMIXLG ! False if mixing of lagrangian tracer +INTEGER, INTENT(IN) :: KSV_LGBEG ! first index of lag. tracer +INTEGER, INTENT(IN) :: KSV_LGEND ! last index of lag. tracer +REAL, DIMENSION(:,:), INTENT(IN) :: PZZ ! Height at the flux point +REAL, DIMENSION(:,:), INTENT(IN) :: PDZZ ! Metrics coefficient + +REAL, DIMENSION(:), INTENT(IN) :: PSFTH,PSFRV +! normal surface fluxes of theta,rv,(u,v) parallel to the orography +! +REAL, DIMENSION(:,:), INTENT(IN) :: PPABSM ! Pressure at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PRHODREF ! dry density of the + ! reference state +REAL, DIMENSION(:,:), INTENT(IN) :: PUM ! u mean wind +REAL, DIMENSION(:,:), INTENT(IN) :: PVM ! v mean wind +REAL, DIMENSION(:,:), INTENT(IN) :: PTKEM ! TKE at t-dt +! +REAL, DIMENSION(:,:), INTENT(IN) :: PTHM ! liquid pot. temp. at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PRVM ! vapor mixing ratio at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PTHLM,PRTM ! cons. var. at t-dt + +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSVM ! scalar var. at t-dt + +REAL, DIMENSION(:,:), INTENT(OUT) :: PTHL_UP,PRT_UP ! updraft properties +REAL, DIMENSION(:,:), INTENT(OUT) :: PU_UP, PV_UP ! updraft wind components +REAL, DIMENSION(:,:), INTENT(INOUT):: PRV_UP,PRC_UP, & ! updraft rv, rc + PRI_UP,PTHV_UP,& ! updraft ri, THv + PW_UP,PFRAC_UP,& ! updraft w, fraction + PFRAC_ICE_UP,& ! liquid/solid fraction in updraft + PRSAT_UP ! Rsat + +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSV_UP ! updraft scalar var. + +REAL, DIMENSION(:,:), INTENT(INOUT):: PEMF,PDETR,PENTR ! Mass_flux, + ! entrainment, detrainment +REAL, DIMENSION(:,:), INTENT(INOUT) :: PBUO_INTEG ! Integrated Buoyancy +INTEGER, DIMENSION(:), INTENT(INOUT):: KKLCL,KKETL,KKCTL! LCL, ETL, CTL +REAL, DIMENSION(:), INTENT(OUT) :: PDEPTH ! Deepness of cloud + + +END SUBROUTINE COMPUTE_UPDRAFT + +END INTERFACE +! +END MODULE MODI_COMPUTE_UPDRAFT +! ######spl + SUBROUTINE COMPUTE_UPDRAFT(KKA,KKB,KKE,KKU,KKL,HFRAC_ICE, & + OENTR_DETR,OMIXUV, & + ONOMIXLG,KSV_LGBEG,KSV_LGEND, & + PZZ,PDZZ, & + PSFTH,PSFRV, & + PPABSM,PRHODREF,PUM,PVM, PTKEM, & + PTHM,PRVM,PTHLM,PRTM, & + PSVM,PTHL_UP,PRT_UP, & + PRV_UP,PRC_UP,PRI_UP,PTHV_UP, & + PW_UP,PU_UP, PV_UP, PSV_UP, & + PFRAC_UP,PFRAC_ICE_UP,PRSAT_UP, & + PEMF,PDETR,PENTR, & + PBUO_INTEG,KKLCL,KKETL,KKCTL, & + PDEPTH ) + +! ################################################################# +!! +!!**** *COMPUTE_UPDRAFT* - calculates caracteristics of the updraft +!! +!! +!! PURPOSE +!! ------- +!!**** The purpose of this routine is to build the updraft model +!! +! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! !! REFERENCE +!! --------- +!! Book 1 of Meso-NH documentation (chapter Turbulence) +!! Soares et al. 2004 QJ +!! +!! AUTHOR +!! ------ +!! J.Pergaud +!! V.Masson : Optimization 07/2010 +!! S. Riette : 07/2010 : modification for reproducibility +!! S. Riette may 2011: ice added, interface modified +!! S. Riette Jan 2012: support for both order of vertical levels +!! V.Masson, C.Lac : 02/2011 : SV_UP initialized by a non-zero value +!! S. Riette Apr 2013: improvement of continuity at the condensation level +!! R.Honnert Oct 2016 : Add ZSURF and Update with AROME +!! Q.Rodier 01/2019 : support RM17 mixing length +!! R.Honnert 01/2019 : add LGZ (reduction of the mass-flux surface closure with the resolution) +!! -------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_PARAM_MFSHALL_n +USE MODD_TURB_n, ONLY : CTURBLEN + +USE MODI_COMPUTE_ENTR_DETR +USE MODI_TH_R_FROM_THL_RT_1D +USE MODI_SHUMAN_MF + +USE MODI_COMPUTE_BL89_ML +USE MODD_GRID_n, ONLY : XDXHAT, XDYHAT + + +IMPLICIT NONE + +!* 1.1 Declaration of Arguments +! +! +! +INTEGER, INTENT(IN) :: KKA ! near ground array index +INTEGER, INTENT(IN) :: KKB ! near ground physical index +INTEGER, INTENT(IN) :: KKE ! uppest atmosphere physical index +INTEGER, INTENT(IN) :: KKU ! uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +CHARACTER(len=1), INTENT(IN) :: HFRAC_ICE ! partition liquid/ice scheme +LOGICAL, INTENT(IN) :: OENTR_DETR! flag to recompute entrainment, detrainment and mass flux +LOGICAL, INTENT(IN) :: OMIXUV ! True if mixing of momentum +LOGICAL, INTENT(IN) :: ONOMIXLG ! False if mixing of lagrangian tracer +INTEGER, INTENT(IN) :: KSV_LGBEG ! first index of lag. tracer +INTEGER, INTENT(IN) :: KSV_LGEND ! last index of lag. tracer +REAL, DIMENSION(:,:), INTENT(IN) :: PZZ ! Height at the flux point +REAL, DIMENSION(:,:), INTENT(IN) :: PDZZ ! Metrics coefficient + +REAL, DIMENSION(:), INTENT(IN) :: PSFTH,PSFRV +! normal surface fluxes of theta,rv,(u,v) parallel to the orography +! +REAL, DIMENSION(:,:), INTENT(IN) :: PPABSM ! Pressure at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PRHODREF ! dry density of the + ! reference state +REAL, DIMENSION(:,:), INTENT(IN) :: PUM ! u mean wind +REAL, DIMENSION(:,:), INTENT(IN) :: PVM ! v mean wind +REAL, DIMENSION(:,:), INTENT(IN) :: PTKEM ! TKE at t-dt +! +REAL, DIMENSION(:,:), INTENT(IN) :: PTHM ! liquid pot. temp. at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PRVM ! vapor mixing ratio at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PTHLM,PRTM ! cons. var. at t-dt + +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSVM ! scalar var. at t-dt + +REAL, DIMENSION(:,:), INTENT(OUT) :: PTHL_UP,PRT_UP ! updraft properties +REAL, DIMENSION(:,:), INTENT(OUT) :: PU_UP, PV_UP ! updraft wind components +REAL, DIMENSION(:,:), INTENT(INOUT):: PRV_UP,PRC_UP, & ! updraft rv, rc + PRI_UP,PTHV_UP,& ! updraft ri, THv + PW_UP,PFRAC_UP,& ! updraft w, fraction + PFRAC_ICE_UP,& ! liquid/solid fraction in updraft + PRSAT_UP ! Rsat + +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSV_UP ! updraft scalar var. + +REAL, DIMENSION(:,:), INTENT(INOUT):: PEMF,PDETR,PENTR ! Mass_flux, + ! detrainment,entrainment +REAL, DIMENSION(:,:), INTENT(INOUT) :: PBUO_INTEG ! Integrated Buoyancy +INTEGER, DIMENSION(:), INTENT(INOUT) :: KKLCL,KKETL,KKCTL! LCL, ETL, CTL +REAL, DIMENSION(:), INTENT(OUT) :: PDEPTH ! Deepness of cloud +! 1.2 Declaration of local variables +! +! +! Mean environment variables at t-dt at flux point +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: & + ZTHM_F,ZRVM_F ! Theta,rv of + ! updraft environnement +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: & + ZRTM_F, ZTHLM_F, ZTKEM_F,& ! rt, thetal,TKE,pressure, + ZUM_F,ZVM_F,ZRHO_F, & ! density,momentum + ZPRES_F,ZTHVM_F,ZTHVM, & ! interpolated at the flux point + ZG_O_THVREF, & ! g*ThetaV ref + ZW_UP2, & ! w**2 of the updraft + ZBUO_INTEG_DRY, ZBUO_INTEG_CLD,&! Integrated Buoyancy + ZENTR_CLD,ZDETR_CLD ! wet entrainment and detrainment + +REAL, DIMENSION(SIZE(PSVM,1),SIZE(PTHM,2),SIZE(PSVM,3)) :: & + ZSVM_F ! scalar variables + + +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: & + ZTH_UP, & ! updraft THETA + ZRC_MIX, ZRI_MIX ! guess of Rc and Ri for KF mixture + +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZCOEF ! diminution coefficient for too high clouds + +REAL, DIMENSION(SIZE(PSFTH,1) ) :: ZWTHVSURF ! Surface w'thetav' + +REAL :: ZRDORV ! RD/RV +REAL :: ZRVORD ! RV/RD + + +REAL, DIMENSION(SIZE(PTHM,1)) :: ZMIX1,ZMIX2,ZMIX3_CLD,ZMIX2_CLD + +REAL, DIMENSION(SIZE(PTHM,1)) :: ZLUP ! Upward Mixing length from the ground + +INTEGER :: ISV ! Number of scalar variables +INTEGER :: JK,JI,JSV ! loop counters + +LOGICAL, DIMENSION(SIZE(PTHM,1)) :: GTEST,GTESTLCL,GTESTETL + ! Test if the ascent continue, if LCL or ETL is reached +LOGICAL :: GLMIX + ! To choose upward or downward mixing length +LOGICAL, DIMENSION(SIZE(PTHM,1)) :: GWORK1 +LOGICAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: GWORK2 + +INTEGER :: ITEST,JLOOP + +REAL, DIMENSION(SIZE(PTHM,1)) :: ZRC_UP, ZRI_UP, ZRV_UP, ZRSATW, ZRSATI,& + ZPART_DRY + +REAL :: ZDEPTH_MAX1, ZDEPTH_MAX2 ! control auto-extinction process + +REAL :: ZTMAX,ZRMAX ! control value + +REAL, DIMENSION(SIZE(PTHM,1)) :: ZSURF +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZSHEAR,ZDUDZ,ZDVDZ ! vertical wind shear +! Thresholds for the perturbation of +! theta_l and r_t at the first level of the updraft +ZTMAX=2.0 +ZRMAX=1.E-3 +!------------------------------------------------------------------------ + +! INITIALISATION + +! Initialisation of the constants +ZRDORV = XRD / XRV !=0.622 +ZRVORD = (XRV / XRD) + +ZDEPTH_MAX1=3000. ! clouds with depth inferior to this value are keeped untouched +ZDEPTH_MAX2=4000. ! clouds with depth superior to this value are suppressed + +! Local variables, internal domain +!number of scalar variables +ISV=SIZE(PSVM,3) + +IF (OENTR_DETR) THEN + ! Initialisation of intersesting Level :LCL,ETL,CTL + KKLCL(:)=KKE + KKETL(:)=KKE + KKCTL(:)=KKE + + ! + ! Initialisation + !* udraft governing variables + PEMF(:,:)=0. + PDETR(:,:)=0. + PENTR(:,:)=0. + + ! Initialisation + !* updraft core variables + PRV_UP(:,:)=0. + PRC_UP(:,:)=0. + PRI_UP(:,:)=0. + PW_UP(:,:)=0. + ZTH_UP(:,:)=0. + PFRAC_UP(:,:)=0. + PTHV_UP(:,:)=0. + + PBUO_INTEG=0. + + PFRAC_ICE_UP(:,:)=0. + PRSAT_UP(:,:)=PRVM(:,:) ! should be initialised correctly but is (normaly) not used + + !cloud/dry air mixture cloud content + ZRC_MIX = 0. + ZRI_MIX = 0. + +END IF + +! Initialisation of environment variables at t-dt +! variables at flux level +ZTHLM_F(:,:) = MZM_MF(KKA,KKU,KKL,PTHLM(:,:)) +ZRTM_F (:,:) = MZM_MF(KKA,KKU,KKL,PRTM(:,:)) +ZUM_F (:,:) = MZM_MF(KKA,KKU,KKL,PUM(:,:)) +ZVM_F (:,:) = MZM_MF(KKA,KKU,KKL,PVM(:,:)) +ZTKEM_F(:,:) = MZM_MF(KKA,KKU,KKL,PTKEM(:,:)) + +DO JSV=1,ISV + IF (ONOMIXLG .AND. JSV >= KSV_LGBEG .AND. JSV<= KSV_LGEND) CYCLE + ZSVM_F(:,:,JSV) = MZM_MF(KKA,KKU,KKL,PSVM(:,:,JSV)) +END DO +! +! Initialisation of updraft characteristics +PTHL_UP(:,:)=ZTHLM_F(:,:) +PRT_UP(:,:)=ZRTM_F(:,:) +PU_UP(:,:)=ZUM_F(:,:) +PV_UP(:,:)=ZVM_F(:,:) +PSV_UP(:,:,:)=ZSVM_F(:,:,:) + + +! Computation or initialisation of updraft characteristics at the KKB level +! thetal_up,rt_up,thetaV_up, w2,Buoyancy term and mass flux (PEMF) + +PTHL_UP(:,KKB)= ZTHLM_F(:,KKB)+MAX(0.,MIN(ZTMAX,(PSFTH(:)/SQRT(ZTKEM_F(:,KKB)))*XALP_PERT)) +PRT_UP(:,KKB) = ZRTM_F(:,KKB)+MAX(0.,MIN(ZRMAX,(PSFRV(:)/SQRT(ZTKEM_F(:,KKB)))*XALP_PERT)) + + +IF (OENTR_DETR) THEN + ZTHM_F (:,:) = MZM_MF(KKA,KKU,KKL,PTHM (:,:)) + ZPRES_F(:,:) = MZM_MF(KKA,KKU,KKL,PPABSM(:,:)) + ZRHO_F (:,:) = MZM_MF(KKA,KKU,KKL,PRHODREF(:,:)) + ZRVM_F (:,:) = MZM_MF(KKA,KKU,KKL,PRVM(:,:)) + + ! thetav at mass and flux levels + ZTHVM_F(:,:)=ZTHM_F(:,:)*((1.+ZRVORD*ZRVM_F(:,:))/(1.+ZRTM_F(:,:))) + ZTHVM(:,:)=PTHM(:,:)*((1.+ZRVORD*PRVM(:,:))/(1.+PRTM(:,:))) + + PTHV_UP(:,:)=ZTHVM_F(:,:) + + ZW_UP2(:,:)=0. + ZW_UP2(:,KKB) = MAX(0.0001,(2./3.)*ZTKEM_F(:,KKB)) + + + ! Computation of non conservative variable for the KKB level of the updraft + ! (all or nothing ajustement) + PRC_UP(:,KKB)=0. + PRI_UP(:,KKB)=0. + CALL TH_R_FROM_THL_RT_1D(HFRAC_ICE,PFRAC_ICE_UP(:,KKB),ZPRES_F(:,KKB), & + PTHL_UP(:,KKB),PRT_UP(:,KKB),ZTH_UP(:,KKB), & + PRV_UP(:,KKB),PRC_UP(:,KKB),PRI_UP(:,KKB),ZRSATW(:),ZRSATI(:)) + + ! compute updraft thevav and buoyancy term at KKB level + PTHV_UP(:,KKB) = ZTH_UP(:,KKB)*((1+ZRVORD*PRV_UP(:,KKB))/(1+PRT_UP(:,KKB))) + ! compute mean rsat in updraft + PRSAT_UP(:,KKB) = ZRSATW(:)*(1-PFRAC_ICE_UP(:,KKB)) + ZRSATI(:)*PFRAC_ICE_UP(:,KKB) + + ! Closure assumption for mass flux at KKB level + ! + + ZG_O_THVREF=XG/ZTHVM_F + + ! compute L_up + GLMIX=.TRUE. + ZTKEM_F(:,KKB)=0. + ! + IF(CTURBLEN=='RM17') THEN + ZDUDZ = MZF_MF(KKA,KKU,KKL,GZ_M_W_MF(KKA,KKU,KKL,PUM,PDZZ)) + ZDVDZ = MZF_MF(KKA,KKU,KKL,GZ_M_W_MF(KKA,KKU,KKL,PVM,PDZZ)) + ZSHEAR = SQRT(ZDUDZ*ZDUDZ + ZDVDZ*ZDVDZ) + ELSE + ZSHEAR = 0. !no shear in bl89 mixing length + END IF + ! + CALL COMPUTE_BL89_ML(KKA,KKB,KKE,KKU,KKL,PDZZ,ZTKEM_F(:,KKB),ZG_O_THVREF(:,KKB),ZTHVM,KKB,GLMIX,.FALSE.,ZSHEAR,ZLUP) + ZLUP(:)=MAX(ZLUP(:),1.E-10) + + ! Compute Buoyancy flux at the ground + ZWTHVSURF(:) = (ZTHVM_F(:,KKB)/ZTHM_F(:,KKB))*PSFTH(:)+ & + (0.61*ZTHM_F(:,KKB))*PSFRV(:) + + ! Mass flux at KKB level (updraft triggered if PSFTH>0.) + IF (LGZ) THEN + ZSURF(:)=TANH(XGZ*SQRT(XDXHAT(1)*XDYHAT(1))/ZLUP) + ELSE + ZSURF(:)=1. + END IF + WHERE (ZWTHVSURF(:)>0.) + PEMF(:,KKB) = XCMF * ZSURF(:) * ZRHO_F(:,KKB) * & + ((ZG_O_THVREF(:,KKB))*ZWTHVSURF*ZLUP)**(1./3.) + PFRAC_UP(:,KKB)=MIN(PEMF(:,KKB)/(SQRT(ZW_UP2(:,KKB))*ZRHO_F(:,KKB)),XFRAC_UP_MAX) + ZW_UP2(:,KKB)=(PEMF(:,KKB)/(PFRAC_UP(:,KKB)*ZRHO_F(:,KKB)))**2 + GTEST(:)=.TRUE. + ELSEWHERE + PEMF(:,KKB) =0. + GTEST(:)=.FALSE. + ENDWHERE +ELSE + GTEST(:)=PEMF(:,KKB+KKL)>0. +END IF + +!-------------------------------------------------------------------------- + +! 3. Vertical ascending loop +! ----------------------- +! +! If GTEST = T the updraft starts from the KKB level and stops when GTEST becomes F +! +! +GTESTLCL(:)=.FALSE. +GTESTETL(:)=.FALSE. + +! Loop on vertical level +DO JK=KKB,KKE-KKL,KKL + +! IF the updraft top is reached for all column, stop the loop on levels + ITEST=COUNT(GTEST) + IF (ITEST==0) CYCLE + +! Computation of entrainment and detrainment with KF90 +! parameterization in clouds and LR01 in subcloud layer + + +! to find the LCL (check if JK is LCL or not) + + WHERE ((PRC_UP(:,JK)+PRI_UP(:,JK)>0.).AND.(.NOT.(GTESTLCL))) + KKLCL(:) = JK + GTESTLCL(:)=.TRUE. + ENDWHERE + +! COMPUTE PENTR and PDETR at mass level JK + IF (OENTR_DETR) THEN + IF(JK/=KKB) THEN + ZRC_MIX(:,JK) = ZRC_MIX(:,JK-KKL) ! guess of Rc of mixture + ZRI_MIX(:,JK) = ZRI_MIX(:,JK-KKL) ! guess of Ri of mixture + ENDIF + CALL COMPUTE_ENTR_DETR(JK,KKB,KKE,KKL,GTEST,GTESTLCL,HFRAC_ICE,PFRAC_ICE_UP(:,JK),& + PRHODREF(:,JK),ZPRES_F(:,JK),ZPRES_F(:,JK+KKL),& + PZZ(:,:),PDZZ(:,:),ZTHVM(:,:), & + PTHLM(:,:),PRTM(:,:),ZW_UP2(:,:),ZTH_UP(:,JK), & + PTHL_UP(:,JK),PRT_UP(:,JK),ZLUP(:), & + PRC_UP(:,JK),PRI_UP(:,JK),PTHV_UP(:,JK),& + PRSAT_UP(:,JK),ZRC_MIX(:,JK),ZRI_MIX(:,JK), & + PENTR(:,JK),PDETR(:,JK),ZENTR_CLD(:,JK),ZDETR_CLD(:,JK),& + ZBUO_INTEG_DRY(:,JK), ZBUO_INTEG_CLD(:,JK), & + ZPART_DRY(:) ) + PBUO_INTEG(:,JK)=ZBUO_INTEG_DRY(:,JK)+ZBUO_INTEG_CLD(:,JK) + + IF (JK==KKB) THEN + PDETR(:,JK)=0. + ZDETR_CLD(:,JK)=0. + ENDIF + +! Computation of updraft characteristics at level JK+KKL + WHERE(GTEST) + ZMIX1(:)=0.5*(PZZ(:,JK+KKL)-PZZ(:,JK))*(PENTR(:,JK)-PDETR(:,JK)) + PEMF(:,JK+KKL)=PEMF(:,JK)*EXP(2*ZMIX1(:)) + ENDWHERE + ELSE + GTEST(:) = (PEMF(:,JK+KKL)>0.) + END IF + + +! stop the updraft if MF becomes negative + WHERE (GTEST.AND.(PEMF(:,JK+KKL)<=0.)) + PEMF(:,JK+KKL)=0. + KKCTL(:) = JK+KKL + GTEST(:)=.FALSE. + PFRAC_ICE_UP(:,JK+KKL)=PFRAC_ICE_UP(:,JK) + PRSAT_UP(:,JK+KKL)=PRSAT_UP(:,JK) + ENDWHERE + + +! If the updraft did not stop, compute cons updraft characteritics at jk+KKL +! WHERE(GTEST) + DO JLOOP=1,SIZE(GTEST) + IF (GTEST(JLOOP) ) THEN + ZMIX2(JLOOP) = (PZZ(JLOOP,JK+KKL)-PZZ(JLOOP,JK))*PENTR(JLOOP,JK) !& + ZMIX3_CLD(JLOOP) = (PZZ(JLOOP,JK+KKL)-PZZ(JLOOP,JK))*(1.-ZPART_DRY(JLOOP))*ZDETR_CLD(JLOOP,JK) !& + ZMIX2_CLD(JLOOP) = (PZZ(JLOOP,JK+KKL)-PZZ(JLOOP,JK))*(1.-ZPART_DRY(JLOOP))*ZENTR_CLD(JLOOP,JK) + + !PTHL_UP(JLOOP,JK+KKL)=(PTHL_UP(JLOOP,JK)*(1.-0.5*ZMIX2(JLOOP)) + PTHLM(JLOOP,JK)*ZMIX2(JLOOP)) & + ! /(1.+0.5*ZMIX2(JLOOP)) + !PRT_UP(JLOOP,JK+KKL) =(PRT_UP (JLOOP,JK)*(1.-0.5*ZMIX2(JLOOP)) + PRTM(JLOOP,JK)*ZMIX2(JLOOP)) & + ! /(1.+0.5*ZMIX2(JLOOP)) + + PTHL_UP(JLOOP,JK+KKL)=PTHL_UP(JLOOP,JK)*EXP(-ZMIX2(JLOOP)) + PTHLM(JLOOP,JK)*(1-EXP(-ZMIX2(JLOOP))) + PRT_UP(JLOOP,JK+KKL) =PRT_UP (JLOOP,JK)*EXP(-ZMIX2(JLOOP)) + PRTM(JLOOP,JK)*(1-EXP(-ZMIX2(JLOOP))) + + END IF + END DO +! ENDWHERE + + + IF(OMIXUV) THEN + IF(JK/=KKB) THEN + WHERE(GTEST) + PU_UP(:,JK+KKL) = (PU_UP (:,JK)*(1-0.5*ZMIX2(:)) + PUM(:,JK)*ZMIX2(:)+ & + 0.5*XPRES_UV*(PZZ(:,JK+KKL)-PZZ(:,JK))*& + ((PUM(:,JK+KKL)-PUM(:,JK))/PDZZ(:,JK+KKL)+& + (PUM(:,JK)-PUM(:,JK-KKL))/PDZZ(:,JK)) ) & + /(1+0.5*ZMIX2(:)) + PV_UP(:,JK+KKL) = (PV_UP (:,JK)*(1-0.5*ZMIX2(:)) + PVM(:,JK)*ZMIX2(:)+ & + 0.5*XPRES_UV*(PZZ(:,JK+KKL)-PZZ(:,JK))*& + ((PVM(:,JK+KKL)-PVM(:,JK))/PDZZ(:,JK+KKL)+& + (PVM(:,JK)-PVM(:,JK-KKL))/PDZZ(:,JK)) ) & + /(1+0.5*ZMIX2(:)) + ENDWHERE + ELSE + WHERE(GTEST) + PU_UP(:,JK+KKL) = (PU_UP (:,JK)*(1-0.5*ZMIX2(:)) + PUM(:,JK)*ZMIX2(:)+ & + 0.5*XPRES_UV*(PZZ(:,JK+KKL)-PZZ(:,JK))*& + ((PUM(:,JK+KKL)-PUM(:,JK))/PDZZ(:,JK+KKL)) ) & + /(1+0.5*ZMIX2(:)) + PV_UP(:,JK+KKL) = (PV_UP (:,JK)*(1-0.5*ZMIX2(:)) + PVM(:,JK)*ZMIX2(:)+ & + 0.5*XPRES_UV*(PZZ(:,JK+KKL)-PZZ(:,JK))*& + ((PVM(:,JK+KKL)-PVM(:,JK))/PDZZ(:,JK+KKL)) ) & + /(1+0.5*ZMIX2(:)) + ENDWHERE + + ENDIF + ENDIF + DO JSV=1,ISV + IF (ONOMIXLG .AND. JSV >= KSV_LGBEG .AND. JSV<= KSV_LGEND) CYCLE + WHERE(GTEST) + PSV_UP(:,JK+KKL,JSV) = (PSV_UP (:,JK,JSV)*(1-0.5*ZMIX2(:)) + & + PSVM(:,JK,JSV)*ZMIX2(:)) /(1+0.5*ZMIX2(:)) + ENDWHERE + END DO + + IF (OENTR_DETR) THEN + +! Compute non cons. var. at level JK+KKL + ZRC_UP(:)=PRC_UP(:,JK) ! guess = level just below + ZRI_UP(:)=PRI_UP(:,JK) ! guess = level just below + CALL TH_R_FROM_THL_RT_1D(HFRAC_ICE,PFRAC_ICE_UP(:,JK+KKL),ZPRES_F(:,JK+KKL), & + PTHL_UP(:,JK+KKL),PRT_UP(:,JK+KKL),ZTH_UP(:,JK+KKL), & + ZRV_UP(:),ZRC_UP(:),ZRI_UP(:),ZRSATW(:),ZRSATI(:)) + WHERE(GTEST) + PRC_UP(:,JK+KKL)=ZRC_UP(:) + PRV_UP(:,JK+KKL)=ZRV_UP(:) + PRI_UP(:,JK+KKL)=ZRI_UP(:) + PRSAT_UP(:,JK+KKL) = ZRSATW(:)*(1-PFRAC_ICE_UP(:,JK+KKL)) + ZRSATI(:)*PFRAC_ICE_UP(:,JK+KKL) + ENDWHERE + + +! Compute the updraft theta_v, buoyancy and w**2 for level JK+KKL + WHERE(GTEST) + PTHV_UP(:,JK+KKL) = ZTH_UP(:,JK+KKL)*((1+ZRVORD*PRV_UP(:,JK+KKL))/(1+PRT_UP(:,JK+KKL))) + WHERE (ZBUO_INTEG_DRY(:,JK)>0.) + ZW_UP2(:,JK+KKL) = ZW_UP2(:,JK) + 2.*(XABUO-XBENTR*XENTR_DRY)* ZBUO_INTEG_DRY(:,JK) + ELSEWHERE + ZW_UP2(:,JK+KKL) = ZW_UP2(:,JK) + 2.*XABUO* ZBUO_INTEG_DRY(:,JK) + ENDWHERE + ZW_UP2(:,JK+KKL) = ZW_UP2(:,JK+KKL)*(1.-(XBDETR*ZMIX3_CLD(:)+XBENTR*ZMIX2_CLD(:)))& + /(1.+(XBDETR*ZMIX3_CLD(:)+XBENTR*ZMIX2_CLD(:))) & + +2.*(XABUO)*ZBUO_INTEG_CLD(:,JK)/(1.+(XBDETR*ZMIX3_CLD(:)+XBENTR*ZMIX2_CLD(:))) + ENDWHERE + + +! Test if the updraft has reach the ETL + GTESTETL(:)=.FALSE. + WHERE (GTEST.AND.(PBUO_INTEG(:,JK)<=0.)) + KKETL(:) = JK+KKL + GTESTETL(:)=.TRUE. + ENDWHERE + +! Test is we have reached the top of the updraft + WHERE (GTEST.AND.((ZW_UP2(:,JK+KKL)<=0.).OR.(PEMF(:,JK+KKL)<=0.))) + ZW_UP2(:,JK+KKL)=0. + PEMF(:,JK+KKL)=0. + GTEST(:)=.FALSE. + PTHL_UP(:,JK+KKL)=ZTHLM_F(:,JK+KKL) + PRT_UP(:,JK+KKL)=ZRTM_F(:,JK+KKL) + PRC_UP(:,JK+KKL)=0. + PRI_UP(:,JK+KKL)=0. + PRV_UP(:,JK+KKL)=0. + PTHV_UP(:,JK+KKL)=ZTHVM_F(:,JK+KKL) + PFRAC_UP(:,JK+KKL)=0. + KKCTL(:)=JK+KKL + ENDWHERE + +! compute frac_up at JK+KKL + WHERE (GTEST) + PFRAC_UP(:,JK+KKL)=PEMF(:,JK+KKL)/(SQRT(ZW_UP2(:,JK+KKL))*ZRHO_F(:,JK+KKL)) + ENDWHERE + +! Updraft fraction must be smaller than XFRAC_UP_MAX + WHERE (GTEST) + PFRAC_UP(:,JK+KKL)=MIN(XFRAC_UP_MAX,PFRAC_UP(:,JK+KKL)) + ENDWHERE + + +! When cloudy and non-buoyant, updraft fraction must decrease + + WHERE ((GTEST.AND.GTESTETL).AND.GTESTLCL) + PFRAC_UP(:,JK+KKL)=MIN(PFRAC_UP(:,JK+KKL),PFRAC_UP(:,JK)) + ENDWHERE + +! Mass flux is updated with the new updraft fraction + + IF (OENTR_DETR) PEMF(:,JK+KKL)=PFRAC_UP(:,JK+KKL)*SQRT(ZW_UP2(:,JK+KKL))*ZRHO_F(:,JK+KKL) + + END IF + +ENDDO + +IF(OENTR_DETR) THEN + + PW_UP(:,:)=SQRT(ZW_UP2(:,:)) + + PEMF(:,KKB) =0. + +! Limits the shallow convection scheme when cloud heigth is higher than 3000m. +! To do this, mass flux is multiplied by a coefficient decreasing linearly +! from 1 (for clouds of ZDEPTH_MAX1 m of depth) to 0 (for clouds of ZDEPTH_MAX2 m of depth). +! This way, all MF fluxes are diminished by this amount. +! Diagnosed cloud fraction is also multiplied by the same coefficient. +! + DO JI=1,SIZE(PTHM,1) + PDEPTH(JI) = MAX(0., PZZ(JI,KKCTL(JI)) - PZZ(JI,KKLCL(JI)) ) + END DO + + GWORK1(:)= (GTESTLCL(:) .AND. (PDEPTH(:) > ZDEPTH_MAX1) ) + GWORK2(:,:) = SPREAD( GWORK1(:), DIM=2, NCOPIES=MAX(KKU,KKA) ) + ZCOEF(:,:) = SPREAD( (1.-(PDEPTH(:)-ZDEPTH_MAX1)/(ZDEPTH_MAX2-ZDEPTH_MAX1)), DIM=2, NCOPIES=SIZE(ZCOEF,2)) + ZCOEF=MIN(MAX(ZCOEF,0.),1.) + WHERE (GWORK2) + PEMF(:,:) = PEMF(:,:) * ZCOEF(:,:) + PFRAC_UP(:,:) = PFRAC_UP(:,:) * ZCOEF(:,:) + ENDWHERE +ENDIF +END SUBROUTINE COMPUTE_UPDRAFT diff --git a/src/mesonh/turb/compute_updraft_raha.f90 b/src/mesonh/turb/compute_updraft_raha.f90 new file mode 100644 index 000000000..1cf8c32b2 --- /dev/null +++ b/src/mesonh/turb/compute_updraft_raha.f90 @@ -0,0 +1,666 @@ +!MNH_LIC Copyright 2012-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ######spl + MODULE MODI_COMPUTE_UPDRAFT_RAHA +! ########################### +! +INTERFACE +! +! ################################################################# + SUBROUTINE COMPUTE_UPDRAFT_RAHA(KKA,KKB,KKE,KKU,KKL,HFRAC_ICE, & + OENTR_DETR,OMIXUV, & + ONOMIXLG,KSV_LGBEG,KSV_LGEND, & + PZZ,PDZZ, & + PSFTH,PSFRV, & + PPABSM,PRHODREF,PUM,PVM, PTKEM, & + PEXNM,PTHM,PRVM,PTHLM,PRTM, & + PSVM,PTHL_UP,PRT_UP, & + PRV_UP,PRC_UP,PRI_UP,PTHV_UP, & + PW_UP,PU_UP, PV_UP, PSV_UP, & + PFRAC_UP,PFRAC_ICE_UP,PRSAT_UP, & + PEMF,PDETR,PENTR, & + PBUO_INTEG,KKLCL,KKETL,KKCTL, & + PDEPTH ) +! ################################################################# +! +!* 1.1 Declaration of Arguments +! +! +INTEGER, INTENT(IN) :: KKA ! near ground array index +INTEGER, INTENT(IN) :: KKB ! near ground physical index +INTEGER, INTENT(IN) :: KKE ! uppest atmosphere physical index +INTEGER, INTENT(IN) :: KKU ! uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +CHARACTER(len=1), INTENT(IN) :: HFRAC_ICE ! partition liquid/ice scheme +LOGICAL, INTENT(IN) :: OENTR_DETR! flag to recompute entrainment, detrainment and mass flux +LOGICAL, INTENT(IN) :: OMIXUV ! True if mixing of momentum +LOGICAL, INTENT(IN) :: ONOMIXLG ! False if mixing of lagrangian tracer +INTEGER, INTENT(IN) :: KSV_LGBEG ! first index of lag. tracer +INTEGER, INTENT(IN) :: KSV_LGEND ! last index of lag. tracer +REAL, DIMENSION(:,:), INTENT(IN) :: PZZ ! Height at the flux point +REAL, DIMENSION(:,:), INTENT(IN) :: PDZZ ! Metrics coefficient + +REAL, DIMENSION(:), INTENT(IN) :: PSFTH,PSFRV +! normal surface fluxes of theta,rv,(u,v) parallel to the orography +! +REAL, DIMENSION(:,:), INTENT(IN) :: PPABSM ! Pressure at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PRHODREF ! dry density of the + ! reference state +REAL, DIMENSION(:,:), INTENT(IN) :: PUM ! u mean wind +REAL, DIMENSION(:,:), INTENT(IN) :: PVM ! v mean wind +REAL, DIMENSION(:,:), INTENT(IN) :: PTKEM ! TKE at t-dt + +REAL, DIMENSION(:,:), INTENT(IN) :: PEXNM ! Exner function at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PTHM ! liquid pot. temp. at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PRVM ! vapor mixing ratio at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PTHLM,PRTM ! cons. var. at t-dt + +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSVM ! scalar var. at t-dt + +REAL, DIMENSION(:,:), INTENT(OUT) :: PTHL_UP,PRT_UP ! updraft properties +REAL, DIMENSION(:,:), INTENT(OUT) :: PU_UP, PV_UP ! updraft wind components +REAL, DIMENSION(:,:), INTENT(INOUT):: PRV_UP,PRC_UP ! updraft rv, rc +REAL, DIMENSION(:,:), INTENT(INOUT):: PRI_UP,PTHV_UP ! updraft ri, THv +REAL, DIMENSION(:,:), INTENT(INOUT):: PW_UP,PFRAC_UP ! updraft w, fraction +REAL, DIMENSION(:,:), INTENT(INOUT):: PFRAC_ICE_UP ! liquid/solid fraction in updraft +REAL, DIMENSION(:,:), INTENT(INOUT):: PRSAT_UP ! Rsat + +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSV_UP ! updraft scalar var. + +REAL, DIMENSION(:,:), INTENT(INOUT):: PEMF,PDETR,PENTR ! Mass_flux, + ! detrainment,entrainment +REAL, DIMENSION(:,:), INTENT(INOUT) :: PBUO_INTEG ! Integrated Buoyancy +INTEGER, DIMENSION(:), INTENT(INOUT):: KKLCL,KKETL,KKCTL! LCL, ETL, CTL +REAL, DIMENSION(:), INTENT(OUT) :: PDEPTH ! Deepness of cloud + + +END SUBROUTINE COMPUTE_UPDRAFT_RAHA + +END INTERFACE +! +END MODULE MODI_COMPUTE_UPDRAFT_RAHA +! +! ######spl + SUBROUTINE COMPUTE_UPDRAFT_RAHA(KKA,KKB,KKE,KKU,KKL,HFRAC_ICE, & + OENTR_DETR,OMIXUV, & + ONOMIXLG,KSV_LGBEG,KSV_LGEND, & + PZZ,PDZZ, & + PSFTH,PSFRV, & + PPABSM,PRHODREF,PUM,PVM, PTKEM, & + PEXNM,PTHM,PRVM,PTHLM,PRTM, & + PSVM,PTHL_UP,PRT_UP, & + PRV_UP,PRC_UP,PRI_UP,PTHV_UP, & + PW_UP,PU_UP, PV_UP, PSV_UP, & + PFRAC_UP,PFRAC_ICE_UP,PRSAT_UP, & + PEMF,PDETR,PENTR, & + PBUO_INTEG,KKLCL,KKETL,KKCTL, & + PDEPTH ) + +! ################################################################# +!! +!!**** *COMPUTE_UPDRAF_RAHA* - calculates caracteristics of the updraft +!! +!! +!! PURPOSE +!! ------- +!!**** The purpose of this routine is to build the updraft following Rio et al (2010) +!! Same as compute_updraft_rhcj10 exept the use of Hourdin et al closure +!! +! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! !! REFERENCE +!! --------- +!! Rio et al (2010) (Boundary Layer Meteorol 135:469-483) +!! Hourdin et al (xxxx) +!! +!! AUTHOR +!! ------ +!! Y. Bouteloup (2012) +!! R. Honnert Janv 2013 ==> corection of some coding bugs +!! Y. Bouteloup Janv 2014 ==> Allow the use of loops in the both direction +!! -------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ + +USE MODD_CST +USE MODD_PARAM_MFSHALL_n + +USE MODI_TH_R_FROM_THL_RT_1D +USE MODI_SHUMAN_MF + +IMPLICIT NONE + +!* 1.1 Declaration of Arguments +! +! +! +INTEGER, INTENT(IN) :: KKA ! near ground array index +INTEGER, INTENT(IN) :: KKB ! near ground physical index +INTEGER, INTENT(IN) :: KKE ! uppest atmosphere physical index +INTEGER, INTENT(IN) :: KKU ! uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +CHARACTER(len=1), INTENT(IN) :: HFRAC_ICE ! partition liquid/ice scheme +LOGICAL, INTENT(IN) :: OENTR_DETR! flag to recompute entrainment, detrainment and mass flux +LOGICAL, INTENT(IN) :: OMIXUV ! True if mixing of momentum +LOGICAL, INTENT(IN) :: ONOMIXLG ! False if mixing of lagrangian tracer +INTEGER, INTENT(IN) :: KSV_LGBEG ! first index of lag. tracer +INTEGER, INTENT(IN) :: KSV_LGEND ! last index of lag. tracer +REAL, DIMENSION(:,:), INTENT(IN) :: PZZ ! Height at the flux point +REAL, DIMENSION(:,:), INTENT(IN) :: PDZZ ! Metrics coefficient + +REAL, DIMENSION(:), INTENT(IN) :: PSFTH,PSFRV +! normal surface fluxes of theta,rv,(u,v) parallel to the orography +! +REAL, DIMENSION(:,:), INTENT(IN) :: PPABSM ! Pressure at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PRHODREF ! dry density of the + ! reference state +REAL, DIMENSION(:,:), INTENT(IN) :: PUM ! u mean wind +REAL, DIMENSION(:,:), INTENT(IN) :: PVM ! v mean wind +REAL, DIMENSION(:,:), INTENT(IN) :: PTKEM ! TKE at t-dt + +REAL, DIMENSION(:,:), INTENT(IN) :: PEXNM ! Exner function at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PTHM ! liquid pot. temp. at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PRVM ! vapor mixing ratio at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PTHLM,PRTM ! cons. var. at t-dt + +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSVM ! scalar var. at t-dt + +REAL, DIMENSION(:,:), INTENT(OUT) :: PTHL_UP,PRT_UP ! updraft properties +REAL, DIMENSION(:,:), INTENT(OUT) :: PU_UP, PV_UP ! updraft wind components +REAL, DIMENSION(:,:), INTENT(INOUT):: PRV_UP,PRC_UP ! updraft rv, rc +REAL, DIMENSION(:,:), INTENT(INOUT):: PRI_UP,PTHV_UP ! updraft ri, THv +REAL, DIMENSION(:,:), INTENT(INOUT):: PW_UP,PFRAC_UP ! updraft w, fraction +REAL, DIMENSION(:,:), INTENT(INOUT):: PFRAC_ICE_UP ! liquid/solid fraction in updraft +REAL, DIMENSION(:,:), INTENT(INOUT):: PRSAT_UP ! Rsat + +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSV_UP ! updraft scalar var. + +REAL, DIMENSION(:,:), INTENT(INOUT):: PEMF,PDETR,PENTR ! Mass_flux, + ! detrainment,entrainment +REAL, DIMENSION(:,:), INTENT(INOUT) :: PBUO_INTEG ! Integrated Buoyancy +INTEGER, DIMENSION(:), INTENT(INOUT):: KKLCL,KKETL,KKCTL! LCL, ETL, CTL +REAL, DIMENSION(:), INTENT(OUT) :: PDEPTH ! Deepness of cloud +! 1.2 Declaration of local variables +! +! +! Mean environment variables at t-dt at flux point +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZTHM_F,ZRVM_F,ZRCM_F ! Theta,rv of + ! updraft environnement +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZRTM_F, ZTHLM_F, ZTKEM_F ! rt, thetal,TKE,pressure, +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZUM_F,ZVM_F,ZRHO_F ! density,momentum +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZPRES_F,ZTHVM_F,ZTHVM ! interpolated at the flux point +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZG_O_THVREF ! g*ThetaV ref +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZW_UP2 ! w**2 of the updraft + +REAL, DIMENSION(SIZE(PSVM,1),SIZE(PTHM,2),SIZE(PSVM,3)) :: ZSVM_F ! scalar variables + + + +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZTH_UP ! updraft THETA +REAL, DIMENSION(SIZE(PTHM,1)) :: ZT_UP ! updraft T +REAL, DIMENSION(SIZE(PTHM,1)) :: ZLVOCPEXN ! updraft L +REAL, DIMENSION(SIZE(PTHM,1)) :: ZCP ! updraft cp +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZBUO ! Buoyancy +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZTHS_UP,ZTHSM + +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZCOEF ! diminution coefficient for too high clouds + +REAL, DIMENSION(SIZE(PSFTH,1) ) :: ZWTHVSURF ! Surface w'thetav' + +REAL :: ZRDORV ! RD/RV +REAL :: ZRVORD ! RV/RD + + +REAL, DIMENSION(SIZE(PTHM,1)) :: ZMIX1,ZMIX2,ZMIX3 + +REAL, DIMENSION(SIZE(PTHM,1)) :: ZLUP ! Upward Mixing length from the ground + +REAL, DIMENSION(SIZE(PTHM,1)) :: ZDEPTH ! Deepness limit for cloud + +INTEGER :: ISV ! Number of scalar variables +INTEGER :: IKU,IIJU ! array size in k +INTEGER :: JK,JI,JJ,JSV ! loop counters + +LOGICAL, DIMENSION(SIZE(PTHM,1)) :: GTEST,GTESTLCL,GTESTETL + ! Test if the ascent continue, if LCL or ETL is reached +LOGICAL :: GLMIX + ! To choose upward or downward mixing length +LOGICAL, DIMENSION(SIZE(PTHM,1)) :: GWORK1 +LOGICAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: GWORK2 + + +INTEGER :: ITEST + +REAL, DIMENSION(SIZE(PTHM,1)) :: ZRC_UP, ZRI_UP, ZRV_UP, ZWP2, ZRSATW, ZRSATI + +LOGICAL, DIMENSION(SIZE(PTHM,1)) :: GTEST_FER +REAL, DIMENSION(SIZE(PTHM,1)) :: ZPHI,ZALIM_STAR_TOT +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZDTHETASDZ,ZALIM_STAR,ZZDZ,ZZZ +INTEGER, DIMENSION(SIZE(PTHM,1)) :: IALIM + +REAL, DIMENSION(SIZE(PTHM,1)) :: ZTEST,ZDZ,ZWUP_MEAN ! +REAL, DIMENSION(SIZE(PTHM,1)) :: ZCOE,ZWCOE,ZBUCOE +REAL, DIMENSION(SIZE(PTHM,1)) :: ZDETR_BUO, ZDETR_RT +REAL, DIMENSION(SIZE(PTHM,1)) :: ZW_MAX ! w**2 max of the updraft +REAL, DIMENSION(SIZE(PTHM,1)) :: ZZTOP ! Top of the updraft +REAL, DIMENSION(SIZE(PTHM,1)) :: ZA,ZB,ZQTM,ZQT_UP + +REAL :: ZDEPTH_MAX1, ZDEPTH_MAX2 ! control auto-extinction process + +REAL :: ZTMAX,ZRMAX, ZEPS ! control value + + +! Thresholds for the perturbation of +! theta_l and r_t at the first level of the updraft + +ZTMAX=2.0 +ZRMAX=1.E-3 +ZEPS=1.E-15 +!------------------------------------------------------------------------ +! INITIALISATION + +! Initialisation of the constants +ZRDORV = XRD / XRV !=0.622 +ZRVORD = (XRV / XRD) + +ZDEPTH_MAX1=4500. ! clouds with depth infeRIOr to this value are keeped untouched +ZDEPTH_MAX2=5000. ! clouds with depth superior to this value are suppressed + +! Local variables, internal domain +! Internal Domain + +IKU=SIZE(PTHM,2) +IIJU =SIZE(PTHM,1) +!number of scalar variables +ISV=SIZE(PSVM,3) + +! Initialisation of intersesting Level :LCL,ETL,CTL +KKLCL(:)=KKE +KKETL(:)=KKE +KKCTL(:)=KKE + +! +! Initialisation +!* udraft governing variables +PEMF(:,:)=0. +PDETR(:,:)=0. +PENTR(:,:)=0. + +! Initialisation +!* updraft core variables +PRV_UP(:,:)=0. +PRC_UP(:,:)=0. + +PW_UP(:,:)=0. +ZTH_UP(:,:)=0. +PFRAC_UP(:,:)=0. +PTHV_UP(:,:)=0. + +PBUO_INTEG=0. +ZBUO =0. + +!no ice cloud coded yet +PRI_UP(:,:)=0. +PFRAC_ICE_UP(:,:)=0. +PRSAT_UP(:,:)=PRVM(:,:) ! should be initialised correctly but is (normaly) not used + +! Initialisation of environment variables at t-dt + +! variables at flux level +ZTHLM_F(:,:) = MZM_MF(KKA,KKU,KKL,PTHLM(:,:)) +ZRTM_F (:,:) = MZM_MF(KKA,KKU,KKL,PRTM(:,:)) +ZUM_F (:,:) = MZM_MF(KKA,KKU,KKL,PUM(:,:)) +ZVM_F (:,:) = MZM_MF(KKA,KKU,KKL,PVM(:,:)) +ZTKEM_F(:,:) = MZM_MF(KKA,KKU,KKL,PTKEM(:,:)) + +!DO JSV=1,ISV +! IF (ONOMIXLG .AND. JSV >= KSV_LGBEG .AND. JSV<= KSV_LGEND) CYCLE +! ZSVM_F(:,KKB:IKU,JSV) = 0.5*(PSVM(:,KKB:IKU,JSV)+PSVM(:,1:IKU-1,JSV)) +! ZSVM_F(:,1,JSV) = ZSVM_F(:,KKB,JSV) +!END DO + +! Initialisation of updraft characteristics +PTHL_UP(:,:)=ZTHLM_F(:,:) +PRT_UP(:,:)=ZRTM_F(:,:) +PU_UP(:,:)=ZUM_F(:,:) +PV_UP(:,:)=ZVM_F(:,:) +PSV_UP(:,:,:)=0. +!IF (ONOMIXLG .AND. JSV >= KSV_LGBEG .AND. JSV<= KSV_LGEND) then +! PSV_UP(:,:,:)=ZSVM_F(:,:,:) +!ENDIF + +! Computation or initialisation of updraft characteristics at the KKB level +! thetal_up,rt_up,thetaV_up, w�,Buoyancy term and mass flux (PEMF) + +PTHL_UP(:,KKB)= ZTHLM_F(:,KKB)+MAX(0.,MIN(ZTMAX,(PSFTH(:)/SQRT(ZTKEM_F(:,KKB)))*XALP_PERT)) +PRT_UP(:,KKB) = ZRTM_F(:,KKB)+MAX(0.,MIN(ZRMAX,(PSFRV(:)/SQRT(ZTKEM_F(:,KKB)))*XALP_PERT)) + +ZQT_UP(:) = PRT_UP(:,KKB)/(1.+PRT_UP(:,KKB)) +ZTHS_UP(:,KKB)=PTHL_UP(:,KKB)*(1.+XLAMBDA_MF*ZQT_UP(:)) + +ZTHM_F (:,:) = MZM_MF(KKA,KKU,KKL,PTHM (:,:)) +ZPRES_F(:,:) = MZM_MF(KKA,KKU,KKL,PPABSM(:,:)) +ZRHO_F (:,:) = MZM_MF(KKA,KKU,KKL,PRHODREF(:,:)) +ZRVM_F (:,:) = MZM_MF(KKA,KKU,KKL,PRVM(:,:)) + +! thetav at mass and flux levels +ZTHVM_F(:,:)=ZTHM_F(:,:)*((1.+ZRVORD*ZRVM_F(:,:))/(1.+ZRTM_F(:,:))) +ZTHVM(:,:)=PTHM(:,:)*((1.+ZRVORD*PRVM(:,:))/(1.+PRTM(:,:))) + +PTHV_UP(:,:)= ZTHVM_F(:,:) +PRV_UP (:,:)= ZRVM_F (:,:) + +ZW_UP2(:,:)=ZEPS +ZW_UP2(:,KKB) = MAX(0.0001,(1./6.)*ZTKEM_F(:,KKB)) +GTEST = (ZW_UP2(:,KKB) > ZEPS) + +! Computation of non conservative variable for the KKB level of the updraft +! (all or nothing ajustement) +PRC_UP(:,KKB)=0. +PRI_UP(:,KKB)=0. + +CALL TH_R_FROM_THL_RT_1D(HFRAC_ICE,PFRAC_ICE_UP(:,KKB),ZPRES_F(:,KKB), & + PTHL_UP(:,KKB),PRT_UP(:,KKB),ZTH_UP(:,KKB), & + PRV_UP(:,KKB),PRC_UP(:,KKB),PRI_UP(:,KKB),ZRSATW(:),ZRSATI(:)) + +! compute updraft thevav and buoyancy term at KKB level +PTHV_UP(:,KKB) = ZTH_UP(:,KKB)*((1+ZRVORD*PRV_UP(:,KKB))/(1+PRT_UP(:,KKB))) +! compute mean rsat in updraft +PRSAT_UP(:,KKB) = ZRSATW(:)*(1-PFRAC_ICE_UP(:,KKB)) + ZRSATI(:)*PFRAC_ICE_UP(:,KKB) + +!Tout est commente pour tester dans un premier temps la s�paration en deux de la +! boucle verticale, une pour w et une pour PEMF + +ZG_O_THVREF=XG/ZTHVM_F + + +! Definition de l'alimentation au sens de la fermeture de Hourdin et al + +ZALIM_STAR(:,:) = 0. +ZALIM_STAR_TOT(:) = 0. ! <== Normalization of ZALIM_STAR +IALIM(:) = KKB ! <== Top level of the alimentation layer + +DO JK=KKB,KKE-KKL,KKL ! Vertical loop + ZZDZ(:,JK) = MAX(ZEPS,PZZ(:,JK+KKL)-PZZ(:,JK)) ! <== Delta Z between two flux level + ZZZ(:,JK) = MAX(0.,0.5*(PZZ(:,JK+KKL)+PZZ(:,JK)) ) ! <== Hight of mass levels + ZDTHETASDZ(:,JK) = (ZTHVM_F(:,JK)-ZTHVM_F(:,JK+KKL)) ! <== Delta theta_v + + WHERE ((ZTHVM_F(:,JK+KKL)<ZTHVM_F(:,JK)) .AND. (ZTHVM_F(:,KKB)>=ZTHVM_F(:,JK))) + ZALIM_STAR(:,JK) = SQRT(ZZZ(:,JK))*ZDTHETASDZ(:,JK)/ZZDZ(:,JK) + ZALIM_STAR_TOT(:) = ZALIM_STAR_TOT(:)+ZALIM_STAR(:,JK)*ZZDZ(:,JK) + IALIM(:) = JK + ENDWHERE +ENDDO + +! Normalization of ZALIM_STAR +DO JK=KKB,KKE-KKL,KKL ! Vertical loop + WHERE (ZALIM_STAR_TOT > ZEPS) + ZALIM_STAR(:,JK) = ZALIM_STAR(:,JK)/ZALIM_STAR_TOT(:) + ENDWHERE +ENDDO +ZALIM_STAR_TOT(:) = 0. + + +! --------- END of alimentation calculation --------------------------------------- + + +!-------------------------------------------------------------------------- + +! 3. Vertical ascending loop +! ----------------------- +! +! If GTEST = T the updraft starts from the KKB level and stops when GTEST becomes F +! +! +GTESTLCL(:)=.FALSE. +GTESTETL(:)=.FALSE. + +! Loop on vertical level to compute W + +ZW_MAX(:) = 0. +ZZTOP(:) = 0. +ZPHI(:) = 0. + + +DO JK=KKB,KKE-KKL,KKL + +! IF the updraft top is reached for all column, stop the loop on levels + +! ITEST=COUNT(GTEST) +! IF (ITEST==0) CYCLE + +! Computation of entrainment and detrainment with KF90 +! parameterization in clouds and LR01 in subcloud layer + + +! to find the LCL (check if JK is LCL or not) + + WHERE ((PRC_UP(:,JK)+PRI_UP(:,JK)>0.).AND.(.NOT.(GTESTLCL))) + KKLCL(:) = JK + GTESTLCL(:)=.TRUE. + ENDWHERE + + +! COMPUTE PENTR and PDETR at mass level JK + + +! Buoyancy is computed on "flux" levels where updraft variables are known + + ! Compute theta_v of updraft at flux level JK + + ZRC_UP(:) = PRC_UP(:,JK) + ZRI_UP(:) = PRI_UP(:,JK) ! guess + ZRV_UP(:) = PRV_UP(:,JK) + ZBUO (:,JK) = ZG_O_THVREF(:,JK)*(PTHV_UP(:,JK) - ZTHVM_F(:,JK)) + PBUO_INTEG(:,JK) = ZBUO(:,JK)*(PZZ(:,JK+KKL)-PZZ(:,JK)) + + ZDZ(:) = MAX(ZEPS,PZZ(:,JK+KKL)-PZZ(:,JK)) + ZTEST(:) = XA1*ZBUO(:,JK) - XB*ZW_UP2(:,JK) + + ZCOE(:) = ZDZ(:) + WHERE (ZTEST(:)>0.) + ZCOE(:) = ZDZ(:)/(1.+ XBETA1) + ENDWHERE + +! Calcul de la vitesse + + ZWCOE(:) = (1.-XB*ZCOE(:))/(1.+XB*ZCOE(:)) + ZBUCOE(:) = 2.*ZCOE(:)/(1.+XB*ZCOE(:)) + + ZW_UP2(:,JK+KKL) = MAX(ZEPS,ZW_UP2(:,JK)*ZWCOE(:) + XA1*ZBUO(:,JK)*ZBUCOE(:) ) + ZW_MAX(:) = MAX(ZW_MAX(:), SQRT(ZW_UP2(:,JK+KKL))) + ZWUP_MEAN(:) = MAX(ZEPS,0.5*(ZW_UP2(:,JK+KKL)+ZW_UP2(:,JK))) + +! Entrainement et detrainement + + PENTR(:,JK) = MAX(0.,(XBETA1/(1.+XBETA1))*(XA1*ZBUO(:,JK)/ZWUP_MEAN(:)-XB)) + + ZDETR_BUO(:) = MAX(0., -(XBETA1/(1.+XBETA1))*XA1*ZBUO(:,JK)/ZWUP_MEAN(:)) + ZDETR_RT(:) = XC*SQRT(MAX(0.,(PRT_UP(:,JK) - ZRTM_F(:,JK))) / MAX(ZEPS,ZRTM_F(:,JK)) / ZWUP_MEAN(:)) + PDETR(:,JK) = ZDETR_RT(:)+ZDETR_BUO(:) + + +! If the updraft did not stop, compute cons updraft characteritics at jk+1 + WHERE(GTEST) + ZZTOP(:) = MAX(ZZTOP(:),PZZ(:,JK+KKL)) + ZMIX2(:) = (PZZ(:,JK+KKL)-PZZ(:,JK))*PENTR(:,JK) !& + ZMIX3(:) = (PZZ(:,JK+KKL)-PZZ(:,JK))*PDETR(:,JK) !& + + ZQTM(:) = PRTM(:,JK)/(1.+PRTM(:,JK)) + ZTHSM(:,JK) = PTHLM(:,JK)*(1.+XLAMBDA_MF*ZQTM(:)) + ZTHS_UP(:,JK+KKL)=(ZTHS_UP(:,JK)*(1.-0.5*ZMIX2(:)) + ZTHSM(:,JK)*ZMIX2(:)) & + /(1.+0.5*ZMIX2(:)) + PRT_UP(:,JK+KKL)=(PRT_UP (:,JK)*(1.-0.5*ZMIX2(:)) + PRTM(:,JK)*ZMIX2(:)) & + /(1.+0.5*ZMIX2(:)) + ZQT_UP(:) = PRT_UP(:,JK+KKL)/(1.+PRT_UP(:,JK+KKL)) + PTHL_UP(:,JK+KKL)=ZTHS_UP(:,JK+KKL)/(1.+XLAMBDA_MF*ZQT_UP(:)) + ENDWHERE + + + IF(OMIXUV) THEN + IF(JK/=KKB) THEN + WHERE(GTEST) + PU_UP(:,JK+KKL) = (PU_UP (:,JK)*(1-0.5*ZMIX2(:)) + PUM(:,JK)*ZMIX2(:)+ & + 0.5*XPRES_UV*(PZZ(:,JK+KKL)-PZZ(:,JK))*& + ((PUM(:,JK+KKL)-PUM(:,JK))/PDZZ(:,JK+KKL)+& + (PUM(:,JK)-PUM(:,JK-KKL))/PDZZ(:,JK)) ) & + /(1+0.5*ZMIX2(:)) + PV_UP(:,JK+KKL) = (PV_UP (:,JK)*(1-0.5*ZMIX2(:)) + PVM(:,JK)*ZMIX2(:)+ & + 0.5*XPRES_UV*(PZZ(:,JK+KKL)-PZZ(:,JK))*& + ((PVM(:,JK+KKL)-PVM(:,JK))/PDZZ(:,JK+KKL)+& + (PVM(:,JK)-PVM(:,JK-KKL))/PDZZ(:,JK)) ) & + /(1+0.5*ZMIX2(:)) + ENDWHERE + ELSE + WHERE(GTEST) + PU_UP(:,JK+KKL) = (PU_UP (:,JK)*(1-0.5*ZMIX2(:)) + PUM(:,JK)*ZMIX2(:)+ & + 0.5*XPRES_UV*(PZZ(:,JK+KKL)-PZZ(:,JK))*& + ((PUM(:,JK+KKL)-PUM(:,JK))/PDZZ(:,JK+KKL)) ) & + /(1+0.5*ZMIX2(:)) + PV_UP(:,JK+KKL) = (PV_UP (:,JK)*(1-0.5*ZMIX2(:)) + PVM(:,JK)*ZMIX2(:)+ & + 0.5*XPRES_UV*(PZZ(:,JK+KKL)-PZZ(:,JK))*& + ((PVM(:,JK+KKL)-PVM(:,JK))/PDZZ(:,JK+KKL)) ) & + /(1+0.5*ZMIX2(:)) + ENDWHERE + + ENDIF + ENDIF +! DO JSV=1,ISV +! IF (ONOMIXLG .AND. JSV >= KSV_LGBEG .AND. JSV<= KSV_LGEND) CYCLE +! WHERE(GTEST) +! PSV_UP(:,JK+KKL,JSV) = (PSV_UP (:,JK,JSV)*(1-0.5*ZMIX2(:)) + & +! PSVM(:,JK,JSV)*ZMIX2(:)) /(1+0.5*ZMIX2(:)) +! ENDWHERE +! ENDDO + + +! Compute non cons. var. at level JK+KKL + ZRC_UP(:)=PRC_UP(:,JK) ! guess = level just below + ZRI_UP(:)=PRI_UP(:,JK) ! guess = level just below + ZRV_UP(:)=PRV_UP(:,JK) + CALL TH_R_FROM_THL_RT_1D(HFRAC_ICE,PFRAC_ICE_UP(:,JK+KKL),ZPRES_F(:,JK+KKL), & + PTHL_UP(:,JK+KKL),PRT_UP(:,JK+KKL),ZTH_UP(:,JK+KKL), & + ZRV_UP(:),ZRC_UP(:),ZRI_UP(:),ZRSATW(:),ZRSATI(:)) + WHERE(GTEST) + ZT_UP(:) = ZTH_UP(:,JK+KKL)*PEXNM(:,JK+KKL) + ZCP(:) = XCPD + XCL * ZRC_UP(:) + ZLVOCPEXN(:)=(XLVTT + (XCPV-XCL) * (ZT_UP(:)-XTT) ) / ZCP(:) / PEXNM(:,JK+KKL) + PRC_UP(:,JK+KKL)=MIN(0.5E-3,ZRC_UP(:)) ! On ne peut depasser 0.5 g/kg (autoconversion donc elimination !) + PTHL_UP(:,JK+KKL) = PTHL_UP(:,JK+KKL)+ZLVOCPEXN(:)*(ZRC_UP(:)-PRC_UP(:,JK+KKL)) + PRV_UP(:,JK+KKL)=ZRV_UP(:) + PRI_UP(:,JK+KKL)=ZRI_UP(:) + PRT_UP(:,JK+KKL) = PRC_UP(:,JK+KKL) + PRV_UP(:,JK+KKL) + PRSAT_UP(:,JK+KKL) = ZRSATW(:)*(1-PFRAC_ICE_UP(:,JK+KKL)) + ZRSATI(:)*PFRAC_ICE_UP(:,JK+KKL) + ENDWHERE + + +! Compute the updraft theta_v, buoyancy and w**2 for level JK+1 + WHERE(GTEST) +! PTHV_UP(:,JK+KKL) = ZTH_UP(:,JK+KKL)*((1+ZRVORD*PRV_UP(:,JK+KKL))/(1+PRT_UP(:,JK+KKL))) + PTHV_UP(:,JK+KKL) = ZTH_UP(:,JK+KKL)*(1.+0.608*PRV_UP(:,JK+KKL) - PRC_UP(:,JK+KKL)) + ENDWHERE + + +! Test if the updraft has reach the ETL + GTESTETL(:)=.FALSE. + WHERE (GTEST.AND.(PBUO_INTEG(:,JK)<=0.)) + KKETL(:) = JK+KKL + GTESTETL(:)=.TRUE. + ENDWHERE + +! Test is we have reached the top of the updraft + + WHERE (GTEST.AND.((ZW_UP2(:,JK+KKL)<=ZEPS))) + ZW_UP2(:,JK+KKL)=ZEPS + GTEST(:)=.FALSE. + PTHL_UP(:,JK+KKL)=ZTHLM_F(:,JK+KKL) + PRT_UP(:,JK+KKL)=ZRTM_F(:,JK+KKL) + PRC_UP(:,JK+KKL)=0. + PRI_UP(:,JK+KKL)=0. + PRV_UP(:,JK+KKL)=0. + PTHV_UP(:,JK+KKL)=ZTHVM_F(:,JK+KKL) + PFRAC_UP(:,JK+KKL)=0. + KKCTL(:)=JK+KKL + ENDWHERE + +ENDDO + +! Closure assumption for mass flux at KKB+1 level (Mass flux is supposed to be 0 at KKB level !) +! Hourdin et al 2002 formulation + + +ZZTOP(:) = MAX(ZZTOP(:),ZEPS) + +DO JK=KKB+KKL,KKE-KKL,KKL ! Vertical loop + WHERE(JK<=IALIM) + ZALIM_STAR_TOT(:) = ZALIM_STAR_TOT(:) + ZALIM_STAR(:,JK)*ZALIM_STAR(:,JK)*ZZDZ(:,JK)/PRHODREF(:,JK) + ENDWHERE +ENDDO + +WHERE (ZALIM_STAR_TOT*ZZTOP > ZEPS) + ZPHI(:) = ZW_MAX(:)/(XR*ZZTOP(:)*ZALIM_STAR_TOT(:)) +ENDWHERE + +GTEST(:) = .TRUE. +PEMF(:,KKB+KKL) = ZPHI(:)*ZZDZ(:,KKB)*ZALIM_STAR(:,KKB) +! Updraft fraction must be smaller than XFRAC_UP_MAX +PFRAC_UP(:,KKB+KKL)=PEMF(:,KKB+KKL)/(SQRT(ZW_UP2(:,KKB+KKL))*ZRHO_F(:,KKB+KKL)) +PFRAC_UP(:,KKB+KKL)=MIN(XFRAC_UP_MAX,PFRAC_UP(:,KKB+KKL)) +PEMF(:,KKB+KKL) = ZRHO_F(:,KKB+KKL)*PFRAC_UP(:,KKB+KKL)*SQRT(ZW_UP2(:,KKB+KKL)) + +DO JK=KKB+KKL,KKE-KKL,KKL ! Vertical loop + + GTEST = (ZW_UP2(:,JK) > ZEPS) + + WHERE (GTEST) + WHERE(JK<IALIM) + PEMF(:,JK+KKL) = MAX(0.,PEMF(:,JK) + ZPHI(:)*ZZDZ(:,JK)*(PENTR(:,JK) - PDETR(:,JK))) + ELSEWHERE + ZMIX1(:)=ZZDZ(:,JK)*(PENTR(:,JK)-PDETR(:,JK)) + PEMF(:,JK+KKL)=PEMF(:,JK)*EXP(ZMIX1(:)) + ENDWHERE + +! Updraft fraction must be smaller than XFRAC_UP_MAX + PFRAC_UP(:,JK+KKL)=PEMF(:,JK+KKL)/(SQRT(ZW_UP2(:,JK+KKL))*ZRHO_F(:,JK+KKL)) + PFRAC_UP(:,JK+KKL)=MIN(XFRAC_UP_MAX,PFRAC_UP(:,JK+KKL)) + PEMF(:,JK+KKL) = ZRHO_F(:,JK+KKL)*PFRAC_UP(:,JK+KKL)*SQRT(ZW_UP2(:,JK+KKL)) + ENDWHERE + +ENDDO + +PW_UP(:,:)=SQRT(ZW_UP2(:,:)) +PEMF(:,KKB) =0. + +! Limits the shallow convection scheme when cloud heigth is higher than 3000m. +! To do this, mass flux is multiplied by a coefficient decreasing linearly +! from 1 (for clouds of 3000m of depth) to 0 (for clouds of 4000m of depth). +! This way, all MF fluxes are diminished by this amount. +! Diagnosed cloud fraction is also multiplied by the same coefficient. +! +DO JI=1,SIZE(PTHM,1) + PDEPTH(JI) = MAX(0., PZZ(JI,KKCTL(JI)) - PZZ(JI,KKLCL(JI)) ) +END DO + +GWORK1(:)= (GTESTLCL(:) .AND. (PDEPTH(:) > ZDEPTH_MAX1) ) +GWORK2(:,:) = SPREAD( GWORK1(:), DIM=2, NCOPIES=IKU ) +ZCOEF(:,:) = SPREAD( (1.-(PDEPTH(:)-ZDEPTH_MAX1)/(ZDEPTH_MAX2-ZDEPTH_MAX1)), DIM=2, NCOPIES=IKU) +ZCOEF=MIN(MAX(ZCOEF,0.),1.) +WHERE (GWORK2) + PEMF(:,:) = PEMF(:,:) * ZCOEF(:,:) + PFRAC_UP(:,:) = PFRAC_UP(:,:) * ZCOEF(:,:) +ENDWHERE + + +END SUBROUTINE COMPUTE_UPDRAFT_RAHA diff --git a/src/mesonh/turb/compute_updraft_rhcj10.f90 b/src/mesonh/turb/compute_updraft_rhcj10.f90 new file mode 100644 index 000000000..a918d05b0 --- /dev/null +++ b/src/mesonh/turb/compute_updraft_rhcj10.f90 @@ -0,0 +1,625 @@ +!MNH_LIC Copyright 2012-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ######spl + MODULE MODI_COMPUTE_UPDRAFT_RHCJ10 +! ########################### +! +INTERFACE +! +! ################################################################# + SUBROUTINE COMPUTE_UPDRAFT_RHCJ10(KKA,KKB,KKE,KKU,KKL, HFRAC_ICE, & + OENTR_DETR,OMIXUV, & + ONOMIXLG,KSV_LGBEG,KSV_LGEND, & + PZZ,PDZZ, & + PSFTH,PSFRV, & + PPABSM,PRHODREF,PUM,PVM,PTKEM, & + PTHM,PRVM,PTHLM,PRTM, & + PSVM,PTHL_UP,PRT_UP, & + PRV_UP,PRC_UP,PRI_UP,PTHV_UP, & + PW_UP,PU_UP, PV_UP, PSV_UP, & + PFRAC_UP,PFRAC_ICE_UP,PRSAT_UP, & + PEMF,PDETR,PENTR, & + PBUO_INTEG,KKLCL,KKETL,KKCTL, & + PDEPTH) +! ################################################################# +! +!* 1.1 Declaration of Arguments +! +! +! +INTEGER, INTENT(IN) :: KKA ! near ground array index +INTEGER, INTENT(IN) :: KKB ! near ground physical index +INTEGER, INTENT(IN) :: KKE ! uppest atmosphere physical index +INTEGER, INTENT(IN) :: KKU ! uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +CHARACTER(len=1), INTENT(IN) :: HFRAC_ICE ! partition liquid/ice scheme +LOGICAL, INTENT(IN) :: OENTR_DETR! flag to recompute entrainment, detrainment and mass flux +LOGICAL, INTENT(IN) :: OMIXUV ! True if mixing of momentum +LOGICAL, INTENT(IN) :: ONOMIXLG ! False if mixing of lagrangian tracer +INTEGER, INTENT(IN) :: KSV_LGBEG ! first index of lag. tracer +INTEGER, INTENT(IN) :: KSV_LGEND ! last index of lag. tracer +REAL, DIMENSION(:,:), INTENT(IN) :: PZZ ! Height at the flux point +REAL, DIMENSION(:,:), INTENT(IN) :: PDZZ ! Metrics coefficient + +REAL, DIMENSION(:), INTENT(IN) :: PSFTH,PSFRV +! normal surface fluxes of theta,rv,(u,v) parallel to the orography +! +REAL, DIMENSION(:,:), INTENT(IN) :: PPABSM ! Pressure at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PRHODREF ! dry density of the + ! reference state +REAL, DIMENSION(:,:), INTENT(IN) :: PUM ! u mean wind +REAL, DIMENSION(:,:), INTENT(IN) :: PVM ! v mean wind +REAL, DIMENSION(:,:), INTENT(IN) :: PTKEM ! TKE at t-dt +! +REAL, DIMENSION(:,:), INTENT(IN) :: PTHM ! liquid pot. temp. at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PRVM ! vapor mixing ratio at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PTHLM,PRTM ! cons. var. at t-dt + +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSVM ! scalar var. at t-dt + +REAL, DIMENSION(:,:), INTENT(OUT) :: PTHL_UP,PRT_UP ! updraft properties +REAL, DIMENSION(:,:), INTENT(OUT) :: PU_UP, PV_UP ! updraft wind components +REAL, DIMENSION(:,:), INTENT(INOUT):: PRV_UP,PRC_UP, & ! updraft rv, rc + PRI_UP,PTHV_UP,& ! updraft ri, THv + PW_UP,PFRAC_UP,& ! updraft w, fraction + PFRAC_ICE_UP,& ! liquid/solid fraction in updraft + PRSAT_UP ! Rsat + +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSV_UP ! updraft scalar var. + +REAL, DIMENSION(:,:), INTENT(INOUT):: PEMF,PDETR,PENTR ! Mass_flux, + ! entrainment, detrainment +REAL, DIMENSION(:,:), INTENT(INOUT) :: PBUO_INTEG ! Integrated Buoyancy +INTEGER, DIMENSION(:), INTENT(INOUT):: KKLCL,KKETL,KKCTL! LCL, ETL, CTL +REAL, DIMENSION(:), INTENT(OUT) :: PDEPTH ! Deepness of cloud + + +END SUBROUTINE COMPUTE_UPDRAFT_RHCJ10 + +END INTERFACE +! +END MODULE MODI_COMPUTE_UPDRAFT_RHCJ10 +! +SUBROUTINE COMPUTE_UPDRAFT_RHCJ10(KKA,KKB,KKE,KKU,KKL,HFRAC_ICE, & + OENTR_DETR,OMIXUV, & + ONOMIXLG,KSV_LGBEG,KSV_LGEND, & + PZZ,PDZZ, & + PSFTH,PSFRV, & + PPABSM,PRHODREF,PUM,PVM, PTKEM, & + PTHM,PRVM,PTHLM,PRTM, & + PSVM,PTHL_UP,PRT_UP, & + PRV_UP,PRC_UP,PRI_UP,PTHV_UP, & + PW_UP,PU_UP, PV_UP, PSV_UP, & + PFRAC_UP,PFRAC_ICE_UP,PRSAT_UP, & + PEMF,PDETR,PENTR, & + PBUO_INTEG,KKLCL,KKETL,KKCTL, & + PDEPTH ) +! ################################################################# +!! +!!**** *COMPUTE_UPDRAF_RHCJ10* - calculates caracteristics of the updraft +!! +!! +!! PURPOSE +!! ------- +!!**** The purpose of this routine is to build the updraft following Rio et al (2010) +!! +! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! !! REFERENCE +!! --------- +!! Rio et al (2010) (Boundary Layer Meteorol 135:469-483) +!! +!! AUTHOR +!! ------ +!! Y. Bouteloup (2012) +!! R. Honert Janv 2013 ==> corection of some bugs +!! Q.Rodier 01/2019 : support RM17 mixing length +!! -------------------------------------------------------------------------- + +! WARNING ==> This updraft is not yet ready to use scalar variables + +!* 0. DECLARATIONS +! ------------ + +USE MODD_CST +USE MODD_PARAM_MFSHALL_n +USE MODD_TURB_n, ONLY : CTURBLEN +USE MODI_COMPUTE_ENTR_DETR +USE MODI_TH_R_FROM_THL_RT_1D +USE MODI_SHUMAN_MF + +USE MODI_COMPUTE_BL89_ML + + +IMPLICIT NONE + +!* 1.1 Declaration of Arguments + + +INTEGER, INTENT(IN) :: KKA ! near ground array index +INTEGER, INTENT(IN) :: KKB ! near ground physical index +INTEGER, INTENT(IN) :: KKE ! uppest atmosphere physical index +INTEGER, INTENT(IN) :: KKU ! uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +CHARACTER(len=1), INTENT(IN) :: HFRAC_ICE ! partition liquid/ice scheme +LOGICAL, INTENT(IN) :: OENTR_DETR! flag to recompute entrainment, detrainment and mass flux +LOGICAL, INTENT(IN) :: OMIXUV ! True if mixing of momentum +LOGICAL, INTENT(IN) :: ONOMIXLG ! False if mixing of lagrangian tracer +INTEGER, INTENT(IN) :: KSV_LGBEG ! first index of lag. tracer +INTEGER, INTENT(IN) :: KSV_LGEND ! last index of lag. tracer +REAL, DIMENSION(:,:), INTENT(IN) :: PZZ ! Height at the flux point +REAL, DIMENSION(:,:), INTENT(IN) :: PDZZ ! Metrics coefficient + +REAL, DIMENSION(:), INTENT(IN) :: PSFTH,PSFRV +! normal surface fluxes of theta,rv,(u,v) parallel to the orography + +REAL, DIMENSION(:,:), INTENT(IN) :: PPABSM ! Pressure at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PRHODREF ! dry density of the + ! reference state +REAL, DIMENSION(:,:), INTENT(IN) :: PUM ! u mean wind +REAL, DIMENSION(:,:), INTENT(IN) :: PVM ! v mean wind +REAL, DIMENSION(:,:), INTENT(IN) :: PTKEM ! TKE at t-dt +! +REAL, DIMENSION(:,:), INTENT(IN) :: PTHM ! pot. temp. at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PRVM ! vapor mixing ratio at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PTHLM,PRTM ! cons. var. at t-dt + +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSVM ! scalar var. at t-dt + +REAL, DIMENSION(:,:), INTENT(OUT) :: PTHL_UP,PRT_UP ! updraft properties +REAL, DIMENSION(:,:), INTENT(OUT) :: PU_UP, PV_UP ! updraft wind components +REAL, DIMENSION(:,:), INTENT(INOUT):: PRV_UP,PRC_UP ! updraft rv, rc +REAL, DIMENSION(:,:), INTENT(INOUT):: PRI_UP ! updraft ri +REAL, DIMENSION(:,:), INTENT(INOUT):: PTHV_UP ! updraft THv +REAL, DIMENSION(:,:), INTENT(INOUT):: PW_UP,PFRAC_UP ! updraft w, fraction +REAL, DIMENSION(:,:), INTENT(INOUT):: PFRAC_ICE_UP ! liquid/solid fraction in updraft +REAL, DIMENSION(:,:), INTENT(INOUT):: PRSAT_UP ! Rsat + +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSV_UP ! updraft scalar var. + +REAL, DIMENSION(:,:), INTENT(INOUT):: PEMF,PDETR,PENTR ! Mass_flux, + ! detrainment,entrainment +REAL, DIMENSION(:,:), INTENT(INOUT) :: PBUO_INTEG ! Integrated Buoyancy +INTEGER, DIMENSION(:), INTENT(INOUT):: KKLCL,KKETL,KKCTL! LCL, ETL, CTL +REAL, DIMENSION(:), INTENT(OUT) :: PDEPTH ! Deepness of cloud +! 1.2 Declaration of local variables + +! Mean environment variables at t-dt at flux point +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZTHM_F,ZRVM_F ! Theta,rv of + ! updraft environnement +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZRTM_F, ZTHLM_F, ZTKEM_F ! rt, thetal,TKE,pressure, +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZUM_F,ZVM_F,ZRHO_F ! density,momentum +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZPRES_F,ZTHVM_F,ZTHVM ! interpolated at the flux point +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZG_O_THVREF ! g*ThetaV ref +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZW_UP2 ! w**2 of the updraft + +REAL, DIMENSION(SIZE(PSVM,1),SIZE(PTHM,2),SIZE(PSVM,3)) :: ZSVM_F ! scalar variables + + + +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZTH_UP ! updraft THETA +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZBUO ! Buoyancy + +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZCOEF ! diminution coefficient for too high clouds + +REAL, DIMENSION(SIZE(PSFTH,1) ) :: ZWTHVSURF ! Surface w'thetav' + +REAL :: ZRDORV ! RD/RV +REAL :: ZRVORD ! RV/RD + + +REAL, DIMENSION(SIZE(PTHM,1)) :: ZMIX1,ZMIX2,ZMIX3 + +REAL, DIMENSION(SIZE(PTHM,1)) :: ZLUP ! Upward Mixing length from the ground + + +INTEGER :: ISV ! Number of scalar variables +INTEGER :: IKU,IIJU ! array size in k +INTEGER :: JK,JI,JJ,JSV ! loop counters + +LOGICAL, DIMENSION(SIZE(PTHM,1)) :: GTEST,GTESTLCL,GTESTETL + ! Test if the ascent continue, if LCL or ETL is reached +LOGICAL :: GLMIX + ! To choose upward or downward mixing length +LOGICAL, DIMENSION(SIZE(PTHM,1)) :: GWORK1 +LOGICAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: GWORK2 + +INTEGER :: ITEST + +REAL, DIMENSION(SIZE(PTHM,1)) :: ZRC_UP, ZRI_UP, ZRV_UP, ZRSATW, ZRSATI + +REAL, DIMENSION(SIZE(PTHM,1)) :: ZPHI +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZZDZ,ZZZ + +REAL, DIMENSION(SIZE(PTHM,1)) :: ZTEST,ZDZ,ZWUP_MEAN ! +REAL, DIMENSION(SIZE(PTHM,1)) :: ZCOE,ZWCOE,ZBUCOE +REAL, DIMENSION(SIZE(PTHM,1)) :: ZDETR_BUO, ZDETR_RT +REAL, DIMENSION(SIZE(PTHM,1)) :: ZW_MAX ! w**2 max of the updraft +REAL, DIMENSION(SIZE(PTHM,1)) :: ZZTOP ! Top of the updraft +REAL, DIMENSION(SIZE(PTHM,1)) :: ZBETA1 + +REAL :: ZDEPTH_MAX1, ZDEPTH_MAX2 ! control auto-extinction process + +REAL :: ZTMAX,ZRMAX, ZEPS ! control value + +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZSHEAR,ZDUDZ,ZDVDZ ! vertical wind shear + +! Thresholds for the perturbation of +! theta_l and r_t at the first level of the updraft + +ZTMAX=2.0 +ZRMAX=1.E-3 +ZEPS=1.E-15 +!------------------------------------------------------------------------ +! INITIALISATION + +! Initialisation of the constants +ZRDORV = XRD / XRV !=0.622 +ZRVORD = (XRV / XRD) + +! depth are different in compute_updraft (3000. and 4000.) ==> impact is small +ZDEPTH_MAX1=4500. ! clouds with depth infeRIOr to this value are keeped untouched +ZDEPTH_MAX2=5000. ! clouds with depth superior to this value are suppressed + + +! Initialisation of ZBETA1 ==> I do not remember why I introduced a KLON array for beta1 ! + +ZBETA1(:) = XBETA1 + +! Local variables, internal domain +! Internal Domain + +IKU=SIZE(PTHM,2) +IIJU =SIZE(PTHM,1) +!number of scalar variables +ISV=SIZE(PSVM,3) + +! Initialisation of intersesting Level :LCL,ETL,CTL +KKLCL(:)=KKE +KKETL(:)=KKE +KKCTL(:)=KKE + +! +! Initialisation +!* udraft governing variables +PEMF(:,:)=0. +PDETR(:,:)=0. +PENTR(:,:)=0. + +! Initialisation +!* updraft core variables +PRC_UP(:,:)=0. + +PW_UP(:,:)=0. +ZTH_UP(:,:)=0. +PFRAC_UP(:,:)=0. +PTHV_UP(:,:)=0. + +PBUO_INTEG=0. +ZBUO =0. + +PRI_UP(:,:)=0. +PFRAC_ICE_UP(:,:)=0. +PRSAT_UP(:,:)=PRVM(:,:) ! should be initialised correctly but is (normaly) not used + +! Initialisation of environment variables at t-dt +! variables at flux level +ZTHLM_F(:,:) = MZM_MF(KKA,KKU,KKL,PTHLM(:,:)) +ZRTM_F (:,:) = MZM_MF(KKA,KKU,KKL,PRTM(:,:)) +ZUM_F (:,:) = MZM_MF(KKA,KKU,KKL,PUM(:,:)) +ZVM_F (:,:) = MZM_MF(KKA,KKU,KKL,PVM(:,:)) +ZTKEM_F(:,:) = MZM_MF(KKA,KKU,KKL,PTKEM(:,:)) + + +! This updraft is not yet ready to use scalar variables +!DO JSV=1,ISV +! IF (ONOMIXLG .AND. JSV >= KSV_LGBEG .AND. JSV<= KSV_LGEND) CYCLE +! ZSVM_F(:,:,JSV) = MZM_MF(KKA,KKU,KKL,PSVM(:,:,JSV)) +!END DO + +! Initialisation of updraft characteristics +PTHL_UP(:,:)=ZTHLM_F(:,:) +PRT_UP(:,:)=ZRTM_F(:,:) +PU_UP(:,:)=ZUM_F(:,:) +PV_UP(:,:)=ZVM_F(:,:) +PSV_UP(:,:,:)=0. +! This updraft is not yet ready to use scalar variables +!IF (ONOMIXLG .AND. JSV >= KSV_LGBEG .AND. JSV<= KSV_LGEND) then +! PSV_UP(:,:,:)=ZSVM_F(:,:,:) +!ENDIF + +! Computation or initialisation of updraft characteristics at the KKB level +! thetal_up,rt_up,thetaV_up, w�,Buoyancy term and mass flux (PEMF) + +!PTHL_UP(:,KKB)= ZTHLM_F(:,KKB)+MAX(0.,MIN(ZTMAX,(PSFTH(:)/SQRT(ZTKEM_F(:,KKB)))*XALP_PERT)) +!PRT_UP(:,KKB) = ZRTM_F(:,KKB)+MAX(0.,MIN(ZRMAX,(PSFRV(:)/SQRT(ZTKEM_F(:,KKB)))*XALP_PERT)) +PTHL_UP(:,KKB)= ZTHLM_F(:,KKB) +PRT_UP(:,KKB) = ZRTM_F(:,KKB) + +ZTHM_F (:,:) = MZM_MF(KKA,KKU,KKL,PTHM (:,:)) +ZPRES_F(:,:) = MZM_MF(KKA,KKU,KKL,PPABSM(:,:)) +ZRHO_F (:,:) = MZM_MF(KKA,KKU,KKL,PRHODREF(:,:)) +ZRVM_F (:,:) = MZM_MF(KKA,KKU,KKL,PRVM(:,:)) + +! thetav at mass and flux levels +ZTHVM_F(:,:)=ZTHM_F(:,:)*((1.+ZRVORD*ZRVM_F(:,:))/(1.+ZRTM_F(:,:))) +ZTHVM(:,:)=PTHM(:,:)*((1.+ZRVORD*PRVM(:,:))/(1.+PRTM(:,:))) + +PTHV_UP(:,:)= ZTHVM_F(:,:) +PRV_UP (:,:)= ZRVM_F (:,:) + +ZW_UP2(:,:)=ZEPS +ZW_UP2(:,KKB) = MAX(0.0001,(2./3.)*ZTKEM_F(:,KKB)) + +! Computation of non conservative variable for the KKB level of the updraft +! (all or nothing ajustement) + +PRC_UP(:,KKB)=0. +PRI_UP(:,KKB)=0. +CALL TH_R_FROM_THL_RT_1D(HFRAC_ICE,PFRAC_ICE_UP(:,KKB),ZPRES_F(:,KKB), & + PTHL_UP(:,KKB),PRT_UP(:,KKB),ZTH_UP(:,KKB), & + PRV_UP(:,KKB),PRC_UP(:,KKB),PRI_UP(:,KKB),ZRSATW(:),ZRSATI(:)) + +! compute updraft thevav and buoyancy term at KKB level +PTHV_UP(:,KKB) = ZTH_UP(:,KKB)*((1+ZRVORD*PRV_UP(:,KKB))/(1+PRT_UP(:,KKB))) +! compute mean rsat in updraft +PRSAT_UP(:,KKB) = ZRSATW(:)*(1-PFRAC_ICE_UP(:,KKB)) + ZRSATI(:)*PFRAC_ICE_UP(:,KKB) + +!Tout est commente pour tester dans un premier temps la séparation en deux de la +! boucle verticale, une pour w et une pour PEMF + +ZG_O_THVREF=XG/ZTHVM_F + +! Calcul de la fermeture de Julien Pergaut comme limite max de PHY + +DO JK=KKB,KKE-KKL,KKL ! Vertical loop + ZZDZ(:,JK) = MAX(ZEPS,PZZ(:,JK+KKL)-PZZ(:,JK)) ! <== Delta Z between two flux level + ZZZ(:,JK) = 0.5*(PZZ(:,JK+KKL)+PZZ(:,JK)) ! <== Hight of mass levels +ENDDO + +! compute L_up +GLMIX=.TRUE. +ZTKEM_F(:,KKB)=0. +! +IF(CTURBLEN=='RM17') THEN + ZDUDZ = MZF_MF(KKA,KKU,KKL,GZ_M_W_MF(KKA,KKU,KKL,PUM,PDZZ)) + ZDVDZ = MZF_MF(KKA,KKU,KKL,GZ_M_W_MF(KKA,KKU,KKL,PVM,PDZZ)) + ZSHEAR = SQRT(ZDUDZ*ZDUDZ + ZDVDZ*ZDVDZ) +ELSE + ZSHEAR = 0. !no shear in bl89 mixing length +END IF +! +CALL COMPUTE_BL89_ML(KKA,KKB,KKE,KKU,KKL,PDZZ,ZTKEM_F(:,KKB),ZG_O_THVREF(:,KKB), & + ZTHVM_F,KKB,GLMIX,.TRUE.,ZSHEAR,ZLUP) +ZLUP(:)=MAX(ZLUP(:),1.E-10) + +! Compute Buoyancy flux at the ground +ZWTHVSURF(:) = (ZTHVM_F(:,KKB)/ZTHM_F(:,KKB))*PSFTH(:)+ & + (0.61*ZTHM_F(:,KKB))*PSFRV(:) + +! Mass flux at KKB level (updraft triggered if PSFTH>0.) +WHERE (ZWTHVSURF(:)>0.010) ! <== Not 0 Important to have stratocumulus !!!!! + PEMF(:,KKB) = XCMF * ZRHO_F(:,KKB) * ((ZG_O_THVREF(:,KKB))*ZWTHVSURF*ZLUP)**(1./3.) + PFRAC_UP(:,KKB)=MIN(PEMF(:,KKB)/(SQRT(ZW_UP2(:,KKB))*ZRHO_F(:,KKB)),XFRAC_UP_MAX) + ZW_UP2(:,KKB)=(PEMF(:,KKB)/(PFRAC_UP(:,KKB)*ZRHO_F(:,KKB)))**2 + GTEST(:)=.TRUE. +ELSEWHERE + PEMF(:,KKB) =0. + GTEST(:)=.FALSE. +ENDWHERE + + +!-------------------------------------------------------------------------- + +! 3. Vertical ascending loop +! ----------------------- +! +! If GTEST = T the updraft starts from the KKB level and stops when GTEST becomes F +! +! +GTESTLCL(:)=.FALSE. +GTESTETL(:)=.FALSE. + + +! Loop on vertical level to compute W + +ZW_MAX(:) = 0. +ZZTOP(:) = 0. +ZPHI(:) = 0. + +DO JK=KKB,KKE-KKL,KKL + +! IF the updraft top is reached for all column, stop the loop on levels + + ITEST=COUNT(GTEST) +! IF (ITEST==0) CYCLE ! <== I do not remember why I removed this ... + +! Computation of entrainment and detrainment with KF90 +! parameterization in clouds and LR01 in subcloud layer + + +! to find the LCL (check if JK is LCL or not) + + WHERE ((PRC_UP(:,JK)+PRI_UP(:,JK)>0.).AND.(.NOT.(GTESTLCL))) + KKLCL(:) = JK + GTESTLCL(:)=.TRUE. + ENDWHERE + + +! COMPUTE PENTR and PDETR at mass level JK + + +! Buoyancy is computed on "flux" levels where updraft variables are known + + ! Compute theta_v of updraft at flux level JK + + ZRC_UP(:) =PRC_UP(:,JK) ! guess + ZRI_UP(:) =PRI_UP(:,JK) ! guess + ZRV_UP(:) =PRV_UP(:,JK) + CALL TH_R_FROM_THL_RT_1D(HFRAC_ICE,PFRAC_ICE_UP(:,JK),& + PPABSM(:,JK),PTHL_UP(:,JK),PRT_UP(:,JK),& + ZTH_UP(:,JK),ZRV_UP,ZRC_UP,ZRI_UP,ZRSATW(:),ZRSATI(:)) + + WHERE (GTEST) + PTHV_UP (:,JK) = ZTH_UP(:,JK)*(1.+ZRVORD*ZRV_UP(:))/(1.+PRT_UP(:,JK)) + ZBUO (:,JK) = ZG_O_THVREF(:,JK)*(PTHV_UP(:,JK) - ZTHVM_F(:,JK)) + PBUO_INTEG(:,JK) = ZBUO(:,JK)*(PZZ(:,JK+KKL)-PZZ(:,JK)) + + ZDZ(:) = MAX(ZEPS,PZZ(:,JK+KKL)-PZZ(:,JK)) + ZTEST(:) = XA1*ZBUO(:,JK) - XB*ZW_UP2(:,JK) + + ZCOE(:) = ZDZ(:) + WHERE (ZTEST(:)>0.) + ZCOE(:) = ZDZ(:)/(1.+ ZBETA1(:)) + ENDWHERE + +! Convective Vertical speed computation + + ZWCOE(:) = (1.-XB*ZCOE(:))/(1.+XB*ZCOE(:)) + ZBUCOE(:) = 2.*ZCOE(:)/(1.+XB*ZCOE(:)) + +! Second Rachel bug correction (XA1 has been forgotten ... not yet tested ...) +! ZW_UP2(:,JK+KKL) = MAX(ZEPS,ZW_UP2(:,JK)*ZWCOE(:) + ZBUO(:,JK)*ZBUCOE(:) ) + ZW_UP2(:,JK+KKL) = MAX(ZEPS,ZW_UP2(:,JK)*ZWCOE(:) + XA1*ZBUO(:,JK)*ZBUCOE(:) ) + ZW_MAX(:) = MAX(ZW_MAX(:), SQRT(ZW_UP2(:,JK+KKL))) + ZWUP_MEAN(:) = MAX(ZEPS,0.5*(ZW_UP2(:,JK+KKL)+ZW_UP2(:,JK))) + +! Entrainement and detrainement + +! First Rachel bug correction (Parenthesis around 1+beta1 ==> impact is small) + PENTR(:,JK) = MAX(0.,(ZBETA1(:)/(1.+ZBETA1(:)))*(XA1*ZBUO(:,JK)/ZWUP_MEAN(:)-XB)) + ZDETR_BUO(:) = MAX(0., -(ZBETA1(:)/(1.+ZBETA1(:)))*XA1*ZBUO(:,JK)/ZWUP_MEAN(:)) + ZDETR_RT(:) = XC*SQRT(MAX(0.,(PRT_UP(:,JK) - ZRTM_F(:,JK))) / MAX(ZEPS,ZRTM_F(:,JK)) / ZWUP_MEAN(:)) + PDETR(:,JK) = ZDETR_RT(:)+ZDETR_BUO(:) + +! If the updraft did not stop, compute cons updraft characteritics at jk+1 + + ZZTOP(:) = MAX(ZZTOP(:),PZZ(:,JK+KKL)) + ZMIX2(:) = (PZZ(:,JK+KKL)-PZZ(:,JK))*PENTR(:,JK) !& + ZMIX3(:) = (PZZ(:,JK+KKL)-PZZ(:,JK))*PDETR(:,JK) !& + + PTHL_UP(:,JK+KKL)=(PTHL_UP(:,JK)*(1.-0.5*ZMIX2(:)) + PTHLM(:,JK)*ZMIX2(:)) & + /(1.+0.5*ZMIX2(:)) + PRT_UP(:,JK+KKL) =(PRT_UP (:,JK)*(1.-0.5*ZMIX2(:)) + PRTM(:,JK)*ZMIX2(:)) & + /(1.+0.5*ZMIX2(:)) + ENDWHERE ! GTEST + + + IF(OMIXUV) THEN + WHERE(GTEST) + PU_UP(:,JK+KKL) = (PU_UP (:,JK)*(1-0.5*ZMIX2(:)) + PUM(:,JK)*ZMIX2(:)+ & + 0.5*XPRES_UV*(PZZ(:,JK+KKL)-PZZ(:,JK))*& + ((PUM(:,JK+KKL)-PUM(:,JK))/PDZZ(:,JK+KKL)+& + (PUM(:,JK)-PUM(:,JK-KKL))/PDZZ(:,JK)) ) & + /(1+0.5*ZMIX2(:)) + PV_UP(:,JK+KKL) = (PV_UP (:,JK)*(1-0.5*ZMIX2(:)) + PVM(:,JK)*ZMIX2(:)+ & + 0.5*XPRES_UV*(PZZ(:,JK+KKL)-PZZ(:,JK))*& + ((PVM(:,JK+KKL)-PVM(:,JK))/PDZZ(:,JK+KKL)+& + (PVM(:,JK)-PVM(:,JK-KKL))/PDZZ(:,JK)) ) & + /(1+0.5*ZMIX2(:)) + ENDWHERE + ENDIF + +! This updraft is not yet ready to use scalar variables +! DO JSV=1,ISV +! IF (ONOMIXLG .AND. JSV >= KSV_LGBEG .AND. JSV<= KSV_LGEND) CYCLE +! WHERE(GTEST) +! PSV_UP(:,JK+KKL,JSV) = (PSV_UP (:,JK,JSV)*(1-0.5*ZMIX2(:)) + & +! PSVM(:,JK,JSV)*ZMIX2(:)) /(1+0.5*ZMIX2(:)) +! ENDWHERE +! ENDDO + + +! Compute non cons. var. at level JK+KKL + ZRC_UP(:)=PRC_UP(:,JK) ! guess = level just below + ZRI_UP(:)=PRI_UP(:,JK) ! guess = level just below + ZRV_UP(:)=PRV_UP(:,JK) + CALL TH_R_FROM_THL_RT_1D(HFRAC_ICE,PFRAC_ICE_UP(:,JK+KKL),ZPRES_F(:,JK+KKL), & + PTHL_UP(:,JK+KKL),PRT_UP(:,JK+KKL),ZTH_UP(:,JK+KKL), & + ZRV_UP(:),ZRC_UP(:),ZRI_UP(:),ZRSATW(:),ZRSATI(:)) + WHERE(GTEST) + PRC_UP(:,JK+KKL)=ZRC_UP(:) + PRV_UP(:,JK+KKL)=ZRV_UP(:) + PRI_UP(:,JK+KKL)=ZRI_UP(:) + PRSAT_UP(:,JK+KKL) = ZRSATW(:)*(1-PFRAC_ICE_UP(:,JK+KKL)) + ZRSATI(:)*PFRAC_ICE_UP(:,JK+KKL) + ENDWHERE + + +! Compute the updraft theta_v, buoyancy and w**2 for level JK+1 + WHERE(GTEST) + PTHV_UP(:,JK+KKL) = ZTH_UP(:,JK+KKL)*((1+ZRVORD*PRV_UP(:,JK+KKL))/(1+PRT_UP(:,JK+KKL))) + ENDWHERE + + WHERE(GTEST) + ZMIX1(:)=ZZDZ(:,JK)*(PENTR(:,JK)-PDETR(:,JK)) + PEMF(:,JK+KKL)=PEMF(:,JK)*EXP(ZMIX1(:)) + +! Updraft fraction must be smaller than XFRAC_UP_MAX + PFRAC_UP(:,JK+KKL)=PEMF(:,JK+KKL)/(SQRT(ZW_UP2(:,JK+KKL))*ZRHO_F(:,JK+KKL)) + PFRAC_UP(:,JK+KKL)=MIN(XFRAC_UP_MAX,PFRAC_UP(:,JK+KKL)) + ENDWHERE + +! Test if the updraft has reach the ETL + GTESTETL(:)=.FALSE. + WHERE (GTEST.AND.(PBUO_INTEG(:,JK)<=0.)) + KKETL(:) = JK+KKL + GTESTETL(:)=.TRUE. + ENDWHERE + + +! Test is we have reached the top of the updraft + + WHERE (GTEST.AND.((ZW_UP2(:,JK+KKL)<=ZEPS).OR.(PEMF(:,JK+KKL)<=ZEPS))) + ZW_UP2 (:,JK+KKL)=ZEPS + PEMF (:,JK+KKL)=0. + GTEST (:) =.FALSE. + PTHL_UP (:,JK+KKL)=ZTHLM_F(:,JK+KKL) + PRT_UP (:,JK+KKL)=ZRTM_F(:,JK+KKL) + PRC_UP (:,JK+KKL)=0. + PRI_UP (:,JK+KKL)=0. + PRV_UP (:,JK+KKL)=ZRVM_F (:,JK+KKL) + PTHV_UP (:,JK+KKL)=ZTHVM_F(:,JK+KKL) + PFRAC_UP (:,JK+KKL)=0. + KKCTL (:) =JK+KKL + + ENDWHERE + + +ENDDO ! Fin de la boucle verticale + +PW_UP(:,:)=SQRT(ZW_UP2(:,:)) +PEMF(:,KKB) =0. + +! Limits the shallow convection scheme when cloud heigth is higher than 3000m. +! To do this, mass flux is multiplied by a coefficient decreasing linearly +! from 1 (for clouds of 3000m of depth) to 0 (for clouds of 4000m of depth). +! This way, all MF fluxes are diminished by this amount. +! Diagnosed cloud fraction is also multiplied by the same coefficient. +! +DO JI=1,SIZE(PTHM,1) + PDEPTH(JI) = MAX(0., PZZ(JI,KKCTL(JI)) - PZZ(JI,KKLCL(JI)) ) +END DO + +GWORK1(:)= (GTESTLCL(:) .AND. (PDEPTH(:) > ZDEPTH_MAX1) ) +GWORK2(:,:) = SPREAD( GWORK1(:), DIM=2, NCOPIES=IKU ) +ZCOEF(:,:) = SPREAD( (1.-(PDEPTH(:)-ZDEPTH_MAX1)/(ZDEPTH_MAX2-ZDEPTH_MAX1)), DIM=2, NCOPIES=IKU) +ZCOEF=MIN(MAX(ZCOEF,0.),1.) +WHERE (GWORK2) + PEMF(:,:) = PEMF(:,:) * ZCOEF(:,:) + PFRAC_UP(:,:) = PFRAC_UP(:,:) * ZCOEF(:,:) +ENDWHERE + +END SUBROUTINE COMPUTE_UPDRAFT_RHCJ10 + + diff --git a/src/mesonh/turb/emoist.f90 b/src/mesonh/turb/emoist.f90 new file mode 100644 index 000000000..7703fb388 --- /dev/null +++ b/src/mesonh/turb/emoist.f90 @@ -0,0 +1,185 @@ +!MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!################# +MODULE MODI_EMOIST +!################# +! +INTERFACE +! +FUNCTION EMOIST(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PAMOIST,PSRCM) RESULT(PEMOIST) +! +INTEGER :: KRR ! number of moist var. +INTEGER :: KRRI ! number of ice var. +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM ! Conservative pot. temperature +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Mixing ratios, where +! PRM(:,:,:,1) = conservative mixing ratio +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exner at time t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! Amoist +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM ! Normalized 2dn_order + ! moment s'r'c/2Sigma_s2 +! +REAL,DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)):: PEMOIST ! result +! +END FUNCTION EMOIST +! +END INTERFACE +! +END MODULE MODI_EMOIST +! +! ############################################################################ +FUNCTION EMOIST(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PAMOIST,PSRCM) RESULT(PEMOIST) +! ############################################################################ +! +! PURPOSE +!! ------- +! EMOIST computes the coefficient Emoist in the flottability turbulent +! flux. This coefficient relates the vertical flux of the virtual potential +! temperature ( <Thv' W'> ) to the vertical flux of the conservative mixing +! ratio ( <Rnp' W'> ). +! +!!** METHOD +!! ------ +!! The virtual potential temperature perturbation is linearized in function +!! of Thl' and Rnp'. The result is +!! Thv'= ( ZA + ZC * Atheta * 2 * SRC ) Thl' +!! +( ZB + ZC * Amoist * 2 * SRC ) Rnp' +!! From this relation, we can compute the verical turbulent fluxes. +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST : contains physical constants. +!! XRV, XRD : R for water vapor and dry air +!! +!! REFERENCE +!! --------- +!! +!! NONE +!! +!! +!! AUTHOR +!! ------ +!! Jean-Marie Carriere * Meteo-France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 20/03/95 +!! +!! J. Stein Feb 28, 1996 optimization + Doctorization +!! J. Stein Spet 15, 1996 Amoist previously computed +!! J.-P. Pinty May 20, 2003 Improve EMOIST expression +!! 03/2021 (JL Redelsperger) Ocean model case +!! +!! ---------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +USE MODD_CST +USE MODD_DYN_n, ONLY : LOCEAN +! +IMPLICIT NONE +! +!* 0.1 declarations of arguments and result +! +! +INTEGER :: KRR ! number of moist var. +INTEGER :: KRRI ! number of ice var. +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM ! Conservative pot. temperature +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Mixing ratios, where +! PRM(:,:,:,1) = conservative mixing ratio +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exner at time t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! Amoist +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM ! Normalized 2dn_order + ! moment s'r'c/2Sigma_s2 +! +REAL,DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)):: PEMOIST ! result +! +!* 0.2 declarations of local variables +! +REAL,DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: & + ZA, ZRW +! ZA = coeft A, ZRW = total mixing ratio rw +REAL :: ZDELTA ! = Rv/Rd - 1 +INTEGER :: JRR ! moist loop counter +! +!--------------------------------------------------------------------------- +! +! +!* 1. COMPUTE EMOIST +! -------------- +IF (LOCEAN) THEN + IF ( KRR == 0 ) THEN ! Unsalted + PEMOIST(:,:,:) = 0. + ELSE + PEMOIST(:,:,:) = 1. ! Salted case + END IF +! +ELSE +! + IF ( KRR == 0 ) THEN ! dry case + PEMOIST(:,:,:) = 0. + ELSE IF ( KRR == 1 ) THEN ! only vapor + ZDELTA = (XRV/XRD) - 1. + PEMOIST(:,:,:) = ZDELTA*PTHLM(:,:,:) + ELSE ! liquid water & ice present + ZDELTA = (XRV/XRD) - 1. + ZRW(:,:,:) = PRM(:,:,:,1) +! + IF ( KRRI>0) THEN ! rc and ri case + ZRW(:,:,:) = ZRW(:,:,:) + PRM(:,:,:,3) + DO JRR=5,KRR + ZRW(:,:,:) = ZRW(:,:,:) + PRM(:,:,:,JRR) + ENDDO + ZA(:,:,:) = 1. + ( & ! Compute A + (1.+ZDELTA) * (PRM(:,:,:,1) - PRM(:,:,:,2) - PRM(:,:,:,4)) & + -ZRW(:,:,:) & + ) / (1. + ZRW(:,:,:)) + ! + ! Emoist = ZB + ZC * Amoist + ! ZB is computed from line 1 to line 2 + ! ZC is computed from line 3 to line 5 + ! Amoist* 2 * SRC is computed at line 6 + ! + PEMOIST(:,:,:) = ZDELTA * (PTHLM(:,:,:) + PLOCPEXNM(:,:,:)*( & + PRM(:,:,:,2)+PRM(:,:,:,4)))& + / (1. + ZRW(:,:,:)) & + +( PLOCPEXNM(:,:,:) * ZA(:,:,:) & + -(1.+ZDELTA) * (PTHLM(:,:,:) + PLOCPEXNM(:,:,:)*( & + PRM(:,:,:,2)+PRM(:,:,:,4)))& + / (1. + ZRW(:,:,:)) & + ) * PAMOIST(:,:,:) * 2. * PSRCM(:,:,:) + ELSE + DO JRR=3,KRR + ZRW(:,:,:) = ZRW(:,:,:) + PRM(:,:,:,JRR) + ENDDO + ZA(:,:,:) = 1. + ( & ! Compute ZA + (1.+ZDELTA) * (PRM(:,:,:,1) - PRM(:,:,:,2)) & + -ZRW(:,:,:) & + ) / (1. + ZRW(:,:,:)) + ! + ! Emoist = ZB + ZC * Amoist + ! ZB is computed from line 1 to line 2 + ! ZC is computed from line 3 to line 5 + ! Amoist* 2 * SRC is computed at line 6 + ! + PEMOIST(:,:,:) = ZDELTA * (PTHLM(:,:,:) + PLOCPEXNM(:,:,:)*PRM(:,:,:,2)) & + / (1. + ZRW(:,:,:)) & + +( PLOCPEXNM(:,:,:) * ZA(:,:,:) & + -(1.+ZDELTA) * (PTHLM(:,:,:) + PLOCPEXNM(:,:,:)*PRM(:,:,:,2)) & + / (1. + ZRW(:,:,:)) & + ) * PAMOIST(:,:,:) * 2. * PSRCM(:,:,:) + END IF + END IF +! +END IF +!--------------------------------------------------------------------------- +! +END FUNCTION EMOIST diff --git a/src/mesonh/turb/etheta.f90 b/src/mesonh/turb/etheta.f90 new file mode 100644 index 000000000..3ef29178b --- /dev/null +++ b/src/mesonh/turb/etheta.f90 @@ -0,0 +1,180 @@ +!MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!################# +MODULE MODI_ETHETA +!################# +! +INTERFACE +! +FUNCTION ETHETA(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PATHETA,PSRCM) RESULT(PETHETA) +! +INTEGER :: KRR ! number of moist var. +INTEGER :: KRRI ! number of ice var. +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM ! Conservative pot. temperature +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Mixing ratios, where +! PRM(:,:,:,1) = conservative mixing ratio +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exner at time t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA ! Atheta +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM ! Normalized 2dn_order + ! moment s'r'c/2Sigma_s2 +! +REAL,DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)):: PETHETA ! result +! +! +END FUNCTION ETHETA +! +END INTERFACE +! +END MODULE MODI_ETHETA +! +! ############################################################################ +FUNCTION ETHETA(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PATHETA,PSRCM) RESULT(PETHETA) +! ############################################################################ +! +! PURPOSE +!! ------- +! ETHETA computes the coefficient Etheta in the flottability turbulent +! flux. This coefficient relates the vertical flux of the virtual potential +! temperature ( <Thv' W'> ) to the vertical flux of the conservative potential +! temperature ( <Thl' W'> ). +! +!!** METHOD +!! ------ +!! +!! The virtual potential temperature perturbation is linearized in function +!! of Thl' and Rnp'. The result is +!! Thv'= ( ZA + ZC * Atheta * 2 * SRC ) Thl' +!! +( ZB + ZC * Amoist * 2 * SRC ) Rnp' +!! From this relation, we can compute the vertical turbulent fluxes. +!! +!! EXTERNAL +!! -------- +!! +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST : contains physical constants. +!! XRV, XRD : R for water vapor and dry air +!! +!! REFERENCE +!! --------- +!! +!! +!! AUTHOR +!! ------ +!! Jean-Marie Carriere * Meteo-France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 20/03/95 +!! +!! J. Stein Feb 28, 1996 optimization + Doctorization +!! J. Stein Sept 15, 1996 Atheta previously computed +!! J.-P. Pinty May 20, 2003 Improve ETHETA expression +!! J.L Redelsperger 03, 2021 Ocean Model Case +!! ---------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +USE MODD_CST +USE MODD_DYN_n, ONLY : LOCEAN +! +IMPLICIT NONE +! +!* 0.1 declarations of arguments and result +! +! +INTEGER :: KRR ! number of moist var. +INTEGER :: KRRI ! number of ice var. +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM ! Conservative pot. temperature +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Mixing ratios, where +! PRM(:,:,:,1) = conservative mixing ratio +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exner at time t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA ! Atheta +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM ! Normalized 2dn_order + ! moment s'r'c/2Sigma_s2 +! +REAL,DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)):: PETHETA ! result +! +! +! +!* 0.2 declarations of local variables +! +REAL,DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: & + ZA, ZRW +! ZA = coeft A, ZRW = total mixing ratio rw +REAL :: ZDELTA ! = Rv/Rd - 1 +INTEGER :: JRR ! moist loop counter +! +!--------------------------------------------------------------------------- +! +! +!* 1. COMPUTE ETHETA +! -------------- +! +! +IF (LOCEAN) THEN ! ocean case + PETHETA(:,:,:) = 1. +ELSE + IF ( KRR == 0.) THEN ! dry case + PETHETA(:,:,:) = 1. + ELSE IF ( KRR == 1 ) THEN ! only vapor + ZDELTA = (XRV/XRD) - 1. + PETHETA(:,:,:) = 1. + ZDELTA*PRM(:,:,:,1) + ELSE ! liquid water & ice present + ZDELTA = (XRV/XRD) - 1. + ZRW(:,:,:) = PRM(:,:,:,1) +! + IF ( KRRI>0 ) THEN ! rc and ri case + ZRW(:,:,:) = ZRW(:,:,:) + PRM(:,:,:,3) + DO JRR=5,KRR + ZRW(:,:,:) = ZRW(:,:,:) + PRM(:,:,:,JRR) + ENDDO + ZA(:,:,:) = 1. + ( & ! Compute A + (1.+ZDELTA) * (PRM(:,:,:,1) - PRM(:,:,:,2) - PRM(:,:,:,4)) & + -ZRW(:,:,:) & + ) / (1. + ZRW(:,:,:)) + ! + ! Etheta = ZA + ZC * Atheta + ! ZC is computed from line 2 to line 5 + ! - Atheta * 2. * SRC is computed at line 6 + ! + PETHETA(:,:,:) = ZA(:,:,:) & + +( PLOCPEXNM(:,:,:) * ZA(:,:,:) & + -(1.+ZDELTA) * (PTHLM(:,:,:) + PLOCPEXNM(:,:,:)*( & + PRM(:,:,:,2)+PRM(:,:,:,4)))& + / (1. + ZRW(:,:,:)) & + ) * PATHETA(:,:,:) * 2. * PSRCM(:,:,:) + ELSE + DO JRR=3,KRR + ZRW(:,:,:) = ZRW(:,:,:) + PRM(:,:,:,JRR) + ENDDO + ZA(:,:,:) = 1. + ( & ! Compute A + (1.+ZDELTA) * (PRM(:,:,:,1) - PRM(:,:,:,2)) & + -ZRW(:,:,:) & + ) / (1. + ZRW(:,:,:)) + ! + ! Etheta = ZA + ZC * Atheta + ! ZC is computed from line 2 to line 5 + ! - Atheta * 2. * SRC is computed at line 6 + ! + PETHETA(:,:,:) = ZA(:,:,:) & + +( PLOCPEXNM(:,:,:) * ZA(:,:,:) & + -(1.+ZDELTA) * (PTHLM(:,:,:) + PLOCPEXNM(:,:,:)*PRM(:,:,:,2)) & + / (1. + ZRW(:,:,:)) & + ) * PATHETA(:,:,:) * 2. * PSRCM(:,:,:) + END IF + END IF +! +END IF +!--------------------------------------------------------------------------- +! +END FUNCTION ETHETA diff --git a/src/mesonh/turb/ini_cturb.f90 b/src/mesonh/turb/ini_cturb.f90 new file mode 100644 index 000000000..245dfa063 --- /dev/null +++ b/src/mesonh/turb/ini_cturb.f90 @@ -0,0 +1,254 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ $Date$ +!----------------------------------------------------------------- +!----------------------------------------------------------------- +! ##################### + MODULE MODI_INI_CTURB +! ##################### +! +INTERFACE +! +SUBROUTINE INI_CTURB +END SUBROUTINE INI_CTURB +! +END INTERFACE +! +END MODULE MODI_INI_CTURB +! +! +! +! #################### + SUBROUTINE INI_CTURB +! #################### +! +!!**** *INI_CTURB* - routine to initialize the turbulence scheme +!! constants. +!! +!! PURPOSE +!! ------- +! The purpose of this routine is to initialize the turbulence +! scheme constants that are stored in module MODD_CTURB +! +!! METHOD +!! ------ +!! The constants are set to their numerical values +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CTURB +!! +!! REFERENCE +!! --------- +!! Book 2 of Meso-NH documentation (module INI_CTURB) +!! Book 1 of Meso-NH documentation (Chapter Turbulence) +!! +!! AUTHOR +!! ------ +!! Joan Cuxart * INM and Meteo-France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 08/08/94 +!! J.Cuxart 15/06/95 document more precisely the Shuman cts +!! P.Jabouille 20/10/99 XCET=0.4 +!! V.Masson 13/11/02 XALPSBL and XASBL +!! 05/06 Remove KEPS +!! Q.Rodier 01/19 XCED replaced by XCEDIS in read_exsegn.f90 and ini_modeln.f90 +!! Remove XASBL (not used) +!! -------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_CTURB +! +IMPLICIT NONE +! +! --------------------------------------------------------------------------- +! +! 1. SETTING THE NUMERICAL VALUES +! ---------------------------- +! +! 1.1 Constant for dissipation of Tke +! +!XCED is now replaced by XCEDIS +!XCED = 0.70 +!XCED = 0.84 +! +! Redelsperger-Sommeria (1981) = 0.70 +! Schmidt-Schumann (1989) = 0.845 +! Cheng-Canuto-Howard (2002) = 0.845 +! Rodier, Masson, Couvreux, Paci (2017) = 0.34 +! +! +! 1.2 Constant for wind pressure-correlations +! +!XCEP = 4. +XCEP = 2.11 +! Redelsperger-Sommeria (1981) = 4. +! Schmidt-Schumann (1989) = 3.5 +! Cheng-Canuto-Howard (2002) = 2.11 +! +! +! 1.3 Constant a0 for wind pressure-correlations +! +XA0 = 0.6 +! Redelsperger-Sommeria (1981) = 0.6 +! Schmidt-Schumann (1989) = 0.55 +! Cheng-Canuto-Howard (2002) = 0.6 +! +! +! 1.4 Constant a2 for wind pressure-correlations +! +XA2 = 1. +! Redelsperger-Sommeria (1981) = 1. +! Schmidt-Schumann (1989) = 1. +! Cheng-Canuto-Howard (2002) = 0.57 +! +! +! 1.5 Constant a3 for wind pressure-correlations +! +XA3 = 0. +! Redelsperger-Sommeria (1981) = 0. +! Schmidt-Schumann (1989) = 0.45 +! Cheng-Canuto-Howard (2002) = 0.5 +! +! +! 1.6 Constant for dissipation of th'2, r'2, th'r' +! +XCTD = 1.2 +! Redelsperger-Sommeria (1981) = 1.2 +! Schmidt-Schumann (1989) = 1.01 +! Cheng-Canuto-Howard (2002) = 0.98 +! +! +! 1.7 Constant for temperature and vapor pressure-correlations +! +XCTP = 4.65 +! Redelsperger-Sommeria (1981) = 4. +! Schmidt-Schumann (1989) = 3.25 +! Cheng-Canuto-Howard (2002) = 4.65 +! +! +! 1.8 Constant a5 for temperature pressure-correlations +! +XA5 = 1./3. +! Redelsperger-Sommeria (1981) = 1./3. +! Schmidt-Schumann (1989) = 0. +! Cheng-Canuto-Howard (2002) = 1./3. +! +! +! 1.9 Values in the evolution equation of the TKE +! +XCET = 0.40 +! +! Redelsperger-Sommeria (1981) = 0.20 +! Schmidt-Schumann (1989) = 0.33 +! Krettenauer-Schumann (1992) = 0.33 +! Bougeault and Lacarrere(1989)= 0.40 +! +! +! 1.10 Value related to the TKE universal function within SBL +! +XALPSBL = 4.63 +! Redelsperger et al 2001 = 4.63 +! Wyngaard et al. 1974 = 3.75 +! Stull 1988 = 4.75 +! +! +! 1.11 Value related to the shear term in mixing length computation +! +XRM17 = 0.5 ! Rodier et al 2017 +! +! +! 2. Derivated constants +! ------------------- +! +! 2.1 Constant in fluxes equations +! +XCMFS= 2./3./XCEP*(1.-XA0) !Constant for the momentum flux due to shear (RS) +! +! Redelsperger-Sommeria (1981) ......... 0.066 +! Schmidt-Schumann (1989) ......... 0.086 +! +! +XCSHF= 2./3./XCTP !Constant for the sensible heat flux(RS) +! +! Redelsperger-Sommeria (1981) ......... 0.167 +! Schmidt-Schumann (1989) ......... 0.204 +! +! +XCHF= XCSHF !Constant for the humidity flux(RS) +! +! 2.2 Constant in variances and covariances equations +! +XCTV= 2./3./XCTP/XCTD !Constant for the temperature variance(RS) +! +! Redelsperger-Sommeria (1981) ......... 0.139 +! Schmidt-Schumann (1989) ......... 0.202 +! +XCHV= XCTV !Constant for the humidity variance(RS) +! +! Redelsperger-Sommeria (1981) ......... 0.139 +! +! +XCHT1= XCTV/2. !Constants for the temperature-humidity correlation(RS) +XCHT2= XCTV/2. +! +! 2.3 Constant in Prandtl numbers +! +XCPR1= XCTV !Constants for the turbulent Prandtl and Schmidt numbers +XCPR2= XCHT1 +XCPR3= XCPR2 ! used only for the Schmidt number for scalar variables +XCPR4= XCPR2 +XCPR5= XCPR2 +! +! 3. MINIMUM VALUES +! -------------- +! +XTKEMIN=0.01 +! +!XLINI=10. ! BL mixing length +XLINI=0.1 ! BL mixing length +XLINF=1.E-10! to prevent division by zero +! +! +! 4. MAXIMUM VALUES +! -------------- +! +XPHI_LIM = 3. +! +! +! 5. Constants in K-eps scheme +! ------------------------- +! +! 1.3 Values in the evolution equation of the dissipation of TKE +XCDP = 1.46 +! Duynkerke (1988) = 1.46 +! +XCDD = 1.83 +! Duynkerke (1988) = 1.83 +! +XCDT = 0.42 +! Duynkerke (1988) = 1./(2.38) +! +! +! 6. Constants in RMC01 +! ------------------ +! +XSBL_O_BL = 0.05 ! SBL height / BL height ratio +XFTOP_O_FSURF = 0.05 ! Fraction of surface (heat or momentum) flux used to define top of BL +! +! +END SUBROUTINE INI_CTURB diff --git a/src/mesonh/turb/mf_turb.f90 b/src/mesonh/turb/mf_turb.f90 new file mode 100644 index 000000000..2a96b713a --- /dev/null +++ b/src/mesonh/turb/mf_turb.f90 @@ -0,0 +1,332 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +! ###################### + MODULE MODI_MF_TURB +! ###################### +! +INTERFACE +! ################################################################# + SUBROUTINE MF_TURB(KKA,KKB,KKE,KKU,KKL,OMIXUV, & + ONOMIXLG,KSV_LGBEG,KSV_LGEND, & + PIMPL, PTSTEP, & + PDZZ, & + PRHODJ, & + PTHLM,PTHVM,PRTM,PUM,PVM,PSVM, & + PTHLDT,PRTDT,PUDT,PVDT,PSVDT, & + PEMF,PTHL_UP,PTHV_UP,PRT_UP,PU_UP,PV_UP,PSV_UP, & + PFLXZTHMF,PFLXZTHVMF,PFLXZRMF,PFLXZUMF,PFLXZVMF, & + PFLXZSVMF ) + +! ################################################################# +! +! +!* 1.1 Declaration of Arguments +! +! +INTEGER, INTENT(IN) :: KKA ! near ground array index +INTEGER, INTENT(IN) :: KKB ! near ground physical index +INTEGER, INTENT(IN) :: KKE ! uppest atmosphere physical index +INTEGER, INTENT(IN) :: KKU ! uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise + +LOGICAL, INTENT(IN) :: OMIXUV ! True if mixing of momentum +LOGICAL, INTENT(IN) :: ONOMIXLG ! False if mixing of lagrangian tracer +INTEGER, INTENT(IN) :: KSV_LGBEG ! first index of lag. tracer +INTEGER, INTENT(IN) :: KSV_LGEND ! last index of lag. tracer +REAL, INTENT(IN) :: PIMPL ! degree of implicitness +REAL, INTENT(IN) :: PTSTEP ! Dynamical timestep +! +REAL, DIMENSION(:,:), INTENT(IN) :: PDZZ ! metric coefficients + +REAL, DIMENSION(:,:), INTENT(IN) :: PRHODJ ! dry density * Grid size + +! Conservative var. at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PTHLM ! conservative pot. temp. +REAL, DIMENSION(:,:), INTENT(IN) :: PRTM ! water var. where +! Virtual potential temperature at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PTHVM +! Momentum at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PUM +REAL, DIMENSION(:,:), INTENT(IN) :: PVM +! scalar variables at t-dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSVM +! +! Tendencies of conservative variables +REAL, DIMENSION(:,:), INTENT(OUT) :: PTHLDT + +REAL, DIMENSION(:,:), INTENT(OUT) :: PRTDT +! Tendencies of momentum +REAL, DIMENSION(:,:), INTENT(OUT) :: PUDT +REAL, DIMENSION(:,:), INTENT(OUT) :: PVDT +! Tendencies of scalar variables +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSVDT + + +! Updraft characteritics +REAL, DIMENSION(:,:), INTENT(IN) :: PEMF,PTHL_UP,PTHV_UP,PRT_UP,PU_UP,PV_UP +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSV_UP +! Fluxes +REAL, DIMENSION(:,:), INTENT(OUT) :: PFLXZTHMF,PFLXZTHVMF,PFLXZRMF,PFLXZUMF,PFLXZVMF + +REAL, DIMENSION(:,:,:), INTENT(OUT):: PFLXZSVMF + +END SUBROUTINE MF_TURB + +END INTERFACE +! +END MODULE MODI_MF_TURB + + +! ################################################################# + SUBROUTINE MF_TURB(KKA,KKB,KKE,KKU,KKL,OMIXUV, & + ONOMIXLG,KSV_LGBEG,KSV_LGEND, & + PIMPL, PTSTEP, & + PDZZ, & + PRHODJ, & + PTHLM,PTHVM,PRTM,PUM,PVM,PSVM, & + PTHLDT,PRTDT,PUDT,PVDT,PSVDT, & + PEMF,PTHL_UP,PTHV_UP,PRT_UP,PU_UP,PV_UP,PSV_UP, & + PFLXZTHMF,PFLXZTHVMF,PFLXZRMF,PFLXZUMF,PFLXZVMF, & + PFLXZSVMF ) + +! ################################################################# +! +! +!!**** *MF_TURB* - computes the MF_turbulent source terms for the prognostic +!! variables. +!! +!! PURPOSE +!! ------- +!!**** The purpose of this routine is to compute the source terms in +!! the evolution equations due to the MF turbulent mixing. +!! The source term is computed as the divergence of the turbulent fluxes. +! +!!** METHOD +!! ------ +!! +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! +!! +!! MODIFICATIONS +!! ------------- +!! 10/2009 (C.Lac) Introduction of different PTSTEP according to the +!! advection schemes +!! 09/2010 (V.Masson) Optimization +!! S. Riette Jan 2012: support for both order of vertical levels +!! suppression of useless initialisations +!! +!! -------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAM_MFSHALL_n +! +USE MODI_SHUMAN_MF +USE MODI_TRIDIAG_MASSFLUX +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments +! +! +INTEGER, INTENT(IN) :: KKA ! near ground array index +INTEGER, INTENT(IN) :: KKB ! near ground physical index +INTEGER, INTENT(IN) :: KKE ! uppest atmosphere physical index +INTEGER, INTENT(IN) :: KKU ! uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +LOGICAL, INTENT(IN) :: OMIXUV ! True if mixing of momentum +LOGICAL, INTENT(IN) :: ONOMIXLG ! False if mixing of lagrangian tracer +INTEGER, INTENT(IN) :: KSV_LGBEG ! first index of lag. tracer +INTEGER, INTENT(IN) :: KSV_LGEND ! last index of lag. tracer +REAL, INTENT(IN) :: PIMPL ! degree of implicitness +REAL, INTENT(IN) :: PTSTEP ! Dynamical timestep +! +REAL, DIMENSION(:,:), INTENT(IN) :: PDZZ ! metric coefficients + +REAL, DIMENSION(:,:), INTENT(IN) :: PRHODJ ! dry density * Grid size + +! Conservative var. at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PTHLM ! conservative pot. temp. +REAL, DIMENSION(:,:), INTENT(IN) :: PRTM ! water var. where +! Virtual potential temperature at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PTHVM +! Momentum at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PUM +REAL, DIMENSION(:,:), INTENT(IN) :: PVM +! scalar variables at t-dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSVM +! +! Tendencies of conservative variables +REAL, DIMENSION(:,:), INTENT(OUT) :: PTHLDT + +REAL, DIMENSION(:,:), INTENT(OUT) :: PRTDT +! Tendencies of momentum +REAL, DIMENSION(:,:), INTENT(OUT) :: PUDT +REAL, DIMENSION(:,:), INTENT(OUT) :: PVDT +! Tendencies of scalar variables +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSVDT + + +! Updraft characteritics +REAL, DIMENSION(:,:), INTENT(IN) :: PEMF,PTHL_UP,PTHV_UP,PRT_UP,PU_UP,PV_UP +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSV_UP +! Fluxes +REAL, DIMENSION(:,:), INTENT(OUT) :: PFLXZTHMF,PFLXZTHVMF,PFLXZRMF,PFLXZUMF,PFLXZVMF + +REAL, DIMENSION(:,:,:), INTENT(OUT):: PFLXZSVMF +! +! +! +!------------------------------------------------------------------------------- +! +! 0.2 declaration of local variables +! + +REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2)) :: ZVARS + +! +INTEGER :: ISV,JSV !number of scalar variables and Loop counter +! +!---------------------------------------------------------------------------- +! +!* 1.PRELIMINARIES +! ------------- +! +! +! number of scalar var +ISV=SIZE(PSVM,3) + +! +PFLXZSVMF = 0. +PSVDT = 0. + +! +!---------------------------------------------------------------------------- +! +!* 2. COMPUTE THE MEAN FLUX OF CONSERVATIVE VARIABLES at time t-dt +! (equation (3) of Soares et al) +! + THE MEAN FLUX OF THETA_V (buoyancy flux) +! ----------------------------------------------- +! ( Resulting fluxes are in flux level (w-point) as PEMF and PTHL_UP ) +! + +PFLXZTHMF(:,:) = PEMF(:,:)*(PTHL_UP(:,:)-MZM_MF(KKA,KKU,KKL,PTHLM(:,:))) + +PFLXZRMF(:,:) = PEMF(:,:)*(PRT_UP(:,:)-MZM_MF(KKA,KKU,KKL,PRTM(:,:))) + +PFLXZTHVMF(:,:) = PEMF(:,:)*(PTHV_UP(:,:)-MZM_MF(KKA,KKU,KKL,PTHVM(:,:))) + +IF (OMIXUV) THEN + PFLXZUMF(:,:) = PEMF(:,:)*(PU_UP(:,:)-MZM_MF(KKA,KKU,KKL,PUM(:,:))) + PFLXZVMF(:,:) = PEMF(:,:)*(PV_UP(:,:)-MZM_MF(KKA,KKU,KKL,PVM(:,:))) +ELSE + PFLXZUMF(:,:) = 0. + PFLXZVMF(:,:) = 0. +ENDIF +! +! +!---------------------------------------------------------------------------- +! +!* 3. COMPUTE TENDENCIES OF CONSERVATIVE VARIABLES (or treated as such...) +! (implicit formulation) +! -------------------------------------------- +! + +! +! +! 3.1 Compute the tendency for the conservative potential temperature +! (PDZZ and flux in w-point and PRHODJ is mass point, result in mass point) +! +CALL TRIDIAG_MASSFLUX(KKA,KKB,KKE,KKU,KKL,PTHLM,PFLXZTHMF,-PEMF,PTSTEP,PIMPL, & + PDZZ,PRHODJ,ZVARS ) +! compute new flux +PFLXZTHMF(:,:) = PEMF(:,:)*(PTHL_UP(:,:)-MZM_MF(KKA,KKU,KKL,ZVARS(:,:))) + +!!! compute THL tendency +! +PTHLDT(:,:)= (ZVARS(:,:)-PTHLM(:,:))/PTSTEP + +! +! 3.2 Compute the tendency for the conservative mixing ratio +! +CALL TRIDIAG_MASSFLUX(KKA,KKB,KKE,KKU,KKL,PRTM(:,:),PFLXZRMF,-PEMF,PTSTEP,PIMPL, & + PDZZ,PRHODJ,ZVARS ) +! compute new flux +PFLXZRMF(:,:) = PEMF(:,:)*(PRT_UP(:,:)-MZM_MF(KKA,KKU,KKL,ZVARS(:,:))) + +!!! compute RT tendency +PRTDT(:,:) = (ZVARS(:,:)-PRTM(:,:))/PTSTEP +! + +IF (OMIXUV) THEN + ! + ! 3.3 Compute the tendency for the (non conservative but treated as it) zonal momentum + ! (PDZZ and flux in w-point and PRHODJ is mass point, result in mass point) + ! + + CALL TRIDIAG_MASSFLUX(KKA,KKB,KKE,KKU,KKL,PUM,PFLXZUMF,-PEMF,PTSTEP,PIMPL, & + PDZZ,PRHODJ,ZVARS ) + ! compute new flux + PFLXZUMF(:,:) = PEMF(:,:)*(PU_UP(:,:)-MZM_MF(KKA,KKU,KKL,ZVARS(:,:))) + + ! compute U tendency + PUDT(:,:)= (ZVARS(:,:)-PUM(:,:))/PTSTEP + + ! + ! + ! 3.4 Compute the tendency for the (non conservative but treated as it for the time beiing) + ! meridian momentum + ! (PDZZ and flux in w-point and PRHODJ is mass point, result in mass point) + ! + CALL TRIDIAG_MASSFLUX(KKA,KKB,KKE,KKU,KKL,PVM,PFLXZVMF,-PEMF,PTSTEP,PIMPL, & + PDZZ,PRHODJ,ZVARS ) + ! compute new flux + PFLXZVMF(:,:) = PEMF(:,:)*(PV_UP(:,:)-MZM_MF(KKA,KKU,KKL,ZVARS(:,:))) + + ! compute V tendency + PVDT(:,:)= (ZVARS(:,:)-PVM(:,:))/PTSTEP +ELSE + PUDT(:,:)=0. + PVDT(:,:)=0. +ENDIF + +DO JSV=1,ISV + + IF (ONOMIXLG .AND. JSV >= KSV_LGBEG .AND. JSV<= KSV_LGEND) CYCLE + + !* compute mean flux of scalar variables at time t-dt + ! ( Resulting fluxes are in flux level (w-point) as PEMF and PTHL_UP ) + + PFLXZSVMF(:,:,JSV) = PEMF(:,:)*(PSV_UP(:,:,JSV)-MZM_MF(KKA,KKU,KKL,PSVM(:,:,JSV))) + + ! + ! 3.5 Compute the tendency for scalar variables + ! (PDZZ and flux in w-point and PRHODJ is mass point, result in mass point) + ! + CALL TRIDIAG_MASSFLUX(KKA,KKB,KKE,KKU,KKL,PSVM(:,:,JSV),PFLXZSVMF(:,:,JSV),& + -PEMF,PTSTEP,PIMPL,PDZZ,PRHODJ,ZVARS ) + ! compute new flux + PFLXZSVMF(:,:,JSV) = PEMF(:,:)*(PSV_UP(:,:,JSV)-MZM_MF(KKA,KKU,KKL,ZVARS)) + + ! compute Sv tendency + PSVDT(:,:,JSV)= (ZVARS(:,:)-PSVM(:,:,JSV))/PTSTEP + +ENDDO +! +END SUBROUTINE MF_TURB diff --git a/src/mesonh/turb/mf_turb_expl.f90 b/src/mesonh/turb/mf_turb_expl.f90 new file mode 100644 index 000000000..a22f092c2 --- /dev/null +++ b/src/mesonh/turb/mf_turb_expl.f90 @@ -0,0 +1,227 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +! ###################### + MODULE MODI_MF_TURB_EXPL +! ###################### +! +INTERFACE +! +! ################################################################# + SUBROUTINE MF_TURB_EXPL(KKA,KKB,KKE,KKU,KKL,OMIXUV, & + PRHODJ, & + PTHLM,PTHVM,PRTM,PUM,PVM, & + PTHLDT,PRTDT,PUDT,PVDT, & + PEMF,PTHL_UP,PTHV_UP,PRT_UP,PU_UP,PV_UP, & + PFLXZTHLMF,PFLXZTHVMF,PFLXZRMF,PFLXZUMF,PFLXZVMF) +! ################################################################# +! +!* 1.1 Declaration of Arguments +! +! +INTEGER, INTENT(IN) :: KKA ! near ground array index +INTEGER, INTENT(IN) :: KKB ! near ground physical index +INTEGER, INTENT(IN) :: KKE ! uppest atmosphere physical index +INTEGER, INTENT(IN) :: KKU ! uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +LOGICAL, INTENT(IN) :: OMIXUV ! True if mixing of momentum + +REAL, DIMENSION(:,:), INTENT(IN) :: PRHODJ ! dry density * Grid size + +! Conservative var. at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PTHLM ! conservative pot. temp. +REAL, DIMENSION(:,:), INTENT(IN) :: PRTM ! water var. where + +! Virtual potential temperature at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PTHVM +! Momentum at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PUM +REAL, DIMENSION(:,:), INTENT(IN) :: PVM +! +! Tendencies of conservative variables +REAL, DIMENSION(:,:), INTENT(OUT) :: PTHLDT + +REAL, DIMENSION(:,:), INTENT(OUT) :: PRTDT + +! Tendencies of momentum +REAL, DIMENSION(:,:), INTENT(OUT) :: PUDT +REAL, DIMENSION(:,:), INTENT(OUT) :: PVDT + +! Updraft characteritics +REAL, DIMENSION(:,:), INTENT(IN) :: PEMF,PTHL_UP,PTHV_UP,PRT_UP,PU_UP,PV_UP + +! Fluxes +REAL, DIMENSION(:,:), INTENT(OUT) :: PFLXZTHLMF,PFLXZTHVMF,PFLXZRMF,PFLXZUMF,PFLXZVMF + +END SUBROUTINE MF_TURB_EXPL + +END INTERFACE +! +END MODULE MODI_MF_TURB_EXPL +! + +! ######spl + SUBROUTINE MF_TURB_EXPL(KKA,KKB,KKE,KKU,KKL,OMIXUV, & + PRHODJ, & + PTHLM,PTHVM,PRTM,PUM,PVM, & + PTHLDT,PRTDT,PUDT,PVDT, & + PEMF,PTHL_UP,PTHV_UP,PRT_UP,PU_UP,PV_UP, & + PFLXZTHLMF,PFLXZTHVMF,PFLXZRMF,PFLXZUMF,PFLXZVMF) + +! ################################################################# +! +! +!!**** *MF_TURB_EXPL* - computes the MF_turbulent source terms for the prognostic +!! variables (when PIMPL=0) +!! +!! PURPOSE +!! ------- +!!**** The purpose of this routine is to compute the source terms in +!! the evolution equations due to the MF turbulent mixing. +!! The source term is computed as the divergence of the turbulent fluxes. +! +!!** METHOD +!! ------ +!! +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! +!! +!! MODIFICATIONS +!! ------------- +!! +!! -------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ + +USE MODD_PARAM_MFSHALL_n +USE MODI_SHUMAN_MF + +IMPLICIT NONE + + +!* 0.1 declarations of arguments + + +INTEGER, INTENT(IN) :: KKA ! near ground array index +INTEGER, INTENT(IN) :: KKB ! near ground physical index +INTEGER, INTENT(IN) :: KKE ! uppest atmosphere physical index +INTEGER, INTENT(IN) :: KKU ! uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +LOGICAL, INTENT(IN) :: OMIXUV ! True if mixing of momentum + +REAL, DIMENSION(:,:), INTENT(IN) :: PRHODJ ! dry density * Grid size + +! Conservative var. at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PTHLM ! conservative pot. temp. +REAL, DIMENSION(:,:), INTENT(IN) :: PRTM ! water var. where + +! Virtual potential temperature at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PTHVM +! Momentum at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PUM +REAL, DIMENSION(:,:), INTENT(IN) :: PVM +! +! Tendencies of conservative variables +REAL, DIMENSION(:,:), INTENT(OUT) :: PTHLDT + +REAL, DIMENSION(:,:), INTENT(OUT) :: PRTDT + +! Tendencies of momentum +REAL, DIMENSION(:,:), INTENT(OUT) :: PUDT +REAL, DIMENSION(:,:), INTENT(OUT) :: PVDT + +! Updraft characteritics +REAL, DIMENSION(:,:), INTENT(IN) :: PEMF,PTHL_UP,PTHV_UP,PRT_UP,PU_UP,PV_UP + +! Fluxes +REAL, DIMENSION(:,:), INTENT(OUT) :: PFLXZTHLMF,PFLXZTHVMF,PFLXZRMF,PFLXZUMF,PFLXZVMF + +REAL, DIMENSION(SIZE(PFLXZTHLMF,1),SIZE(PFLXZTHLMF,2)) :: ZFLXZTHSMF,ZTHS_UP,ZTHSM ! Theta S flux +REAL, DIMENSION(SIZE(PFLXZTHLMF,1),SIZE(PFLXZTHLMF,2)) :: ZQT_UP,ZQTM,ZTHSDT,ZQTDT +REAL, DIMENSION(SIZE(PFLXZTHLMF,1),SIZE(PFLXZTHLMF,2)) :: ZTHLM_F,ZRTM_F + +INTEGER :: JK ! loop counter + +!---------------------------------------------------------------------------- +! +!* 1.PRELIMINARIES +! ------------- + +PFLXZRMF = 0. +PFLXZTHVMF = 0. +PFLXZTHLMF = 0. +PFLXZUMF = 0. +PFLXZVMF = 0. +PTHLDT = 0. +PRTDT = 0. +PUDT = 0. +PVDT = 0. + +! +!---------------------------------------------------------------------------- +! +!* 2. COMPUTE THE MEAN FLUX OF CONSERVATIVE VARIABLES at time t-dt +! (equation (3) of Soares et al) +! + THE MEAN FLUX OF THETA_V (buoyancy flux) +! ----------------------------------------------- +! ( Resulting fluxes are in flux level (w-point) as PEMF and PTHL_UP ) + +ZRTM_F (:,:) = MZM_MF(KKA,KKU,KKL,PRTM (:,:)) +ZTHLM_F(:,:) = MZM_MF(KKA,KKU,KKL,PTHLM(:,:)) +ZQTM (:,:) = ZRTM_F (:,:)/(1.+ZRTM_F (:,:)) +ZQT_UP (:,:) = PRT_UP (:,:)/(1.+PRT_UP (:,:)) +ZTHS_UP(:,:) = PTHL_UP(:,:)*(1.+XLAMBDA_MF*ZQT_UP(:,:)) +ZTHSM (:,:) = ZTHLM_F(:,:)*(1.+XLAMBDA_MF*ZQTM(:,:)) + +PFLXZTHLMF(:,:) = PEMF(:,:)*(PTHL_UP(:,:)-MZM_MF(KKA,KKU,KKL,PTHLM(:,:))) ! ThetaL +PFLXZRMF(:,:) = PEMF(:,:)*(PRT_UP (:,:)-MZM_MF(KKA,KKU,KKL,PRTM (:,:))) ! Rt +PFLXZTHVMF(:,:) = PEMF(:,:)*(PTHV_UP(:,:)-MZM_MF(KKA,KKU,KKL,PTHVM(:,:))) ! ThetaV + +ZFLXZTHSMF(:,:) = PEMF(:,:)*(ZTHS_UP(:,:)-ZTHSM(:,:)) ! Theta S flux + +IF (OMIXUV) THEN + PFLXZUMF(:,:) = PEMF(:,:)*(PU_UP(:,:)-MZM_MF(KKA,KKU,KKL,PUM(:,:))) ! U + PFLXZVMF(:,:) = PEMF(:,:)*(PV_UP(:,:)-MZM_MF(KKA,KKU,KKL,PVM(:,:))) ! V +ELSE + PFLXZUMF(:,:) = 0. + PFLXZVMF(:,:) = 0. +ENDIF + + +!---------------------------------------------------------------------------- +! +!* 3. COMPUTE TENDENCIES OF CONSERVATIVE VARIABLES (or treated as such...) +! (explicit formulation) +! -------------------------------------------- + +DO JK=KKB,KKE-KKL,KKL +! PTHLDT(:,JK) = (PFLXZTHLMF(:,JK ) - PFLXZTHLMF(:,JK+KKL)) / PRHODJ(:,JK) + PRTDT (:,JK) = (PFLXZRMF (:,JK ) - PFLXZRMF (:,JK+KKL)) / PRHODJ(:,JK) + ZQTDT (:,JK) = PRTDT (:,JK)/(1.+ ZRTM_F (:,JK)*ZRTM_F (:,JK)) + ZTHSDT(:,JK) = (ZFLXZTHSMF(:,JK ) - ZFLXZTHSMF(:,JK+KKL)) / PRHODJ(:,JK) + PTHLDT(:,JK) = ZTHSDT(:,JK)/(1.+XLAMBDA_MF*ZQTM(:,JK)) - ZTHLM_F(:,JK)*XLAMBDA_MF*ZQTDT(:,JK) +END DO + +IF (OMIXUV) THEN + DO JK=KKB,KKE-KKL,KKL + PUDT(:,JK) = (PFLXZUMF(:,JK ) - PFLXZUMF(:,JK+KKL)) / PRHODJ(:,JK) + PVDT(:,JK) = (PFLXZVMF(:,JK ) - PFLXZVMF(:,JK+KKL)) / PRHODJ(:,JK) + END DO +ENDIF + + +END SUBROUTINE MF_TURB_EXPL diff --git a/src/mesonh/turb/mf_turb_greyzone.f90 b/src/mesonh/turb/mf_turb_greyzone.f90 new file mode 100644 index 000000000..ab28b6c61 --- /dev/null +++ b/src/mesonh/turb/mf_turb_greyzone.f90 @@ -0,0 +1,340 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +! ######spl + MODULE MODI_MF_TURB_GREYZONE +! ###################### +! +INTERFACE +! ################################################################# + SUBROUTINE MF_TURB_GREYZONE(KKA,KKB,KKE,KKU,KKL,OMIXUV, & + ONOMIXLG,KSV_LGBEG,KSV_LGEND, & + PIMPL, PTSTEP, & + PDZZ, & + PRHODJ, & + PTHLM,PTHVM,PRTM,PUM,PVM,PSVM, & + PTHLDT,PRTDT,PUDT,PVDT,PSVDT, & + PEMF,PTHL_UP,PTHV_UP,PRT_UP,PU_UP,PV_UP,PSV_UP, & + PTHL_DO,PTHV_DO,PRT_DO,PU_DO,PV_DO,PSV_DO, & + PFLXZTHMF,PFLXZTHVMF,PFLXZRMF,PFLXZUMF,PFLXZVMF, & + PFLXZSVMF ) + +! ################################################################# +! +! +!* 1.1 Declaration of Arguments +! +! +INTEGER, INTENT(IN) :: KKA ! near ground array index +INTEGER, INTENT(IN) :: KKB ! near ground physical index +INTEGER, INTENT(IN) :: KKE ! uppest atmosphere physical index +INTEGER, INTENT(IN) :: KKU ! uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise + +LOGICAL, INTENT(IN) :: OMIXUV ! True if mixing of momentum +LOGICAL, INTENT(IN) :: ONOMIXLG ! False if mixing of lagrangian tracer +INTEGER, INTENT(IN) :: KSV_LGBEG ! first index of lag. tracer +INTEGER, INTENT(IN) :: KSV_LGEND ! last index of lag. tracer +REAL, INTENT(IN) :: PIMPL ! degree of implicitness +REAL, INTENT(IN) :: PTSTEP ! Dynamical timestep +! +REAL, DIMENSION(:,:), INTENT(IN) :: PDZZ ! metric coefficients + +REAL, DIMENSION(:,:), INTENT(IN) :: PRHODJ ! dry density * Grid size + +! Conservative var. at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PTHLM ! conservative pot. temp. +REAL, DIMENSION(:,:), INTENT(IN) :: PRTM ! water var. where +! Virtual potential temperature at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PTHVM +! Momentum at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PUM +REAL, DIMENSION(:,:), INTENT(IN) :: PVM +! scalar variables at t-dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSVM +! +! Tendencies of conservative variables +REAL, DIMENSION(:,:), INTENT(OUT) :: PTHLDT + +REAL, DIMENSION(:,:), INTENT(OUT) :: PRTDT +! Tendencies of momentum +REAL, DIMENSION(:,:), INTENT(OUT) :: PUDT +REAL, DIMENSION(:,:), INTENT(OUT) :: PVDT +! Tendencies of scalar variables +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSVDT + + +! Updraft characteritics +REAL, DIMENSION(:,:), INTENT(IN) :: PEMF,PTHL_UP,PTHV_UP,PRT_UP,PU_UP,PV_UP +REAL, DIMENSION(:,:), INTENT(IN) :: PTHL_DO,PTHV_DO,PRT_DO,PU_DO,PV_DO +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSV_UP, PSV_DO +! Fluxes +REAL, DIMENSION(:,:), INTENT(OUT) :: PFLXZTHMF,PFLXZTHVMF,PFLXZRMF,PFLXZUMF,PFLXZVMF + +REAL, DIMENSION(:,:,:), INTENT(OUT):: PFLXZSVMF + +END SUBROUTINE MF_TURB_GREYZONE + +END INTERFACE +! +END MODULE MODI_MF_TURB_GREYZONE +! ################################################################# + SUBROUTINE MF_TURB_GREYZONE(KKA, KKB, KKE, KKU, KKL,OMIXUV, & + ONOMIXLG,KSV_LGBEG,KSV_LGEND, & + PIMPL, PTSTEP, & + PDZZ, & + PRHODJ, & + PTHLM,PTHVM,PRTM,PUM,PVM,PSVM, & + PTHLDT,PRTDT,PUDT,PVDT,PSVDT, & + PEMF,PTHL_UP,PTHV_UP,PRT_UP,PU_UP,PV_UP,PSV_UP, & + PTHL_DO,PTHV_DO,PRT_DO,PU_DO,PV_DO,PSV_DO, & + PFLXZTHMF,PFLXZTHVMF,PFLXZRMF,PFLXZUMF,PFLXZVMF, & + PFLXZSVMF ) + +! ################################################################# +! +! +!!**** *MF_TURB_GREYZONE* - computes the MF_turbulent source terms for the prognostic +!! variables. +!! +!! PURPOSE +!! ------- +!!**** The purpose of this routine is to compute the source terms in +!! the evolution equations due to the MF turbulent mixing. +!! The source term is computed as the divergence of the turbulent fluxes. +! +!!** METHOD +!! ------ +!! +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! +!! +!! MODIFICATIONS +!! ------------- +!! 10/2009 (C.Lac) Introduction of different PTSTEP according to the +!! advection schemes +!! 09/2010 (V.Masson) Optimization +!! S. Riette Jan 2012: support for both order of vertical levels +!! suppression of useless initialisations +!! +!! -------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAM_MFSHALL_n +! +USE MODI_SHUMAN_MF +USE MODI_TRIDIAG_MASSFLUX +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments +! +! +INTEGER, INTENT(IN) :: KKA ! near ground array index +INTEGER, INTENT(IN) :: KKB ! near ground physical index +INTEGER, INTENT(IN) :: KKE ! uppest atmosphere physical index +INTEGER, INTENT(IN) :: KKU ! uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +LOGICAL, INTENT(IN) :: OMIXUV ! True if mixing of momentum +LOGICAL, INTENT(IN) :: ONOMIXLG ! False if mixing of lagrangian tracer +INTEGER, INTENT(IN) :: KSV_LGBEG ! first index of lag. tracer +INTEGER, INTENT(IN) :: KSV_LGEND ! last index of lag. tracer +REAL, INTENT(IN) :: PIMPL ! degree of implicitness +REAL, INTENT(IN) :: PTSTEP ! Dynamical timestep +! +REAL, DIMENSION(:,:), INTENT(IN) :: PDZZ ! metric coefficients + +REAL, DIMENSION(:,:), INTENT(IN) :: PRHODJ ! dry density * Grid size + +! Conservative var. at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PTHLM ! conservative pot. temp. +REAL, DIMENSION(:,:), INTENT(IN) :: PRTM ! water var. where +! Virtual potential temperature at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PTHVM +! Momentum at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PUM +REAL, DIMENSION(:,:), INTENT(IN) :: PVM +! scalar variables at t-dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSVM +! +! Tendencies of conservative variables +REAL, DIMENSION(:,:), INTENT(OUT) :: PTHLDT + +REAL, DIMENSION(:,:), INTENT(OUT) :: PRTDT +! Tendencies of momentum +REAL, DIMENSION(:,:), INTENT(OUT) :: PUDT +REAL, DIMENSION(:,:), INTENT(OUT) :: PVDT +! Tendencies of scalar variables +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSVDT + + +! Updraft/environment characteritics +REAL, DIMENSION(:,:), INTENT(IN) :: PEMF,PTHL_UP,PTHV_UP,PRT_UP,PU_UP,PV_UP +REAL, DIMENSION(:,:), INTENT(IN) :: PTHL_DO,PTHV_DO,PRT_DO,PU_DO,PV_DO +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSV_UP,PSV_DO +! Fluxes +REAL, DIMENSION(:,:), INTENT(OUT) :: PFLXZTHMF,PFLXZTHVMF,PFLXZRMF,PFLXZUMF,PFLXZVMF + +REAL, DIMENSION(:,:,:), INTENT(OUT):: PFLXZSVMF +! +! +! +!------------------------------------------------------------------------------- +! +! 0.2 declaration of local variables +! + +REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2)) :: ZVARS + +! +INTEGER :: ISV,JSV !number of scalar variables and Loop counter +! +!---------------------------------------------------------------------------- +! +!* 1.PRELIMINARIES +! ------------- +! +! +! number of scalar var +ISV=SIZE(PSVM,3) + +! +PFLXZSVMF = 0. +PSVDT = 0. + +! +!---------------------------------------------------------------------------- +! +!* 2. COMPUTE THE MEAN FLUX OF CONSERVATIVE VARIABLES at time t-dt +! (equation (3) of Soares et al) +! + THE MEAN FLUX OF THETA_V (buoyancy flux) +! ----------------------------------------------- +! ( Resulting fluxes are in flux level (w-point) as PEMF and PTHL_UP ) +! +! downdraft data are on the flux points +PFLXZTHMF(:,:) = PEMF(:,:)*(PTHL_UP(:,:)-PTHL_DO(:,:)) + +PFLXZRMF(:,:) = PEMF(:,:)*(PRT_UP(:,:)-PRT_DO(:,:)) + +PFLXZTHVMF(:,:) = PEMF(:,:)*(PTHV_UP(:,:)-PTHV_DO(:,:)) + +IF (OMIXUV) THEN + PFLXZUMF(:,:) = PEMF(:,:)*(PU_UP(:,:)-PU_DO(:,:)) + PFLXZVMF(:,:) = PEMF(:,:)*(PV_UP(:,:)-PV_DO(:,:)) +ELSE + PFLXZUMF(:,:) = 0. + PFLXZVMF(:,:) = 0. +ENDIF +! +! +!---------------------------------------------------------------------------- +! +!* 3. COMPUTE TENDENCIES OF CONSERVATIVE VARIABLES (or treated as such...) +! (implicit formulation) +! -------------------------------------------- +! + +! +! +! 3.1 Compute the tendency for the conservative potential temperature +! (PDZZ and flux in w-point and PRHODJ is mass point, result in mass point) +! +CALL TRIDIAG_MASSFLUX(KKA,KKB,KKE,KKU,KKL,PTHLM,PFLXZTHMF,-PEMF,PTSTEP,PIMPL, & + PDZZ,PRHODJ,ZVARS ) +! compute new flux +!!!!!!!!!!!!!!!!!!!!!!!!!! +! Pourquoi on le recalcule ici alors qu'il n'est pas utilisé ailleurs +! sauf pour l'écriture ? +! Est ce que ZVARS est au point de masse pour qu'il doivent être remis au point +! de flux ? +!!!!!!!!!!!!!!!!!!!!!!!!!! +PFLXZTHMF(:,:) = PEMF(:,:)*(PTHL_UP(:,:)-MZM_MF(KKA,KKU,KKL,ZVARS(:,:))) + +!!! compute THL tendency +! +PTHLDT(:,:)= (ZVARS(:,:)-PTHLM(:,:))/PTSTEP + +! +! 3.2 Compute the tendency for the conservative mixing ratio +! +CALL TRIDIAG_MASSFLUX(KKA,KKB,KKE,KKU,KKL,PRTM(:,:),PFLXZRMF,-PEMF,PTSTEP,PIMPL, & + PDZZ,PRHODJ,ZVARS ) +! compute new flux +PFLXZRMF(:,:) = PEMF(:,:)*(PRT_UP(:,:)-MZM_MF(KKA,KKU,KKL,ZVARS(:,:))) + +!!! compute RT tendency +PRTDT(:,:) = (ZVARS(:,:)-PRTM(:,:))/PTSTEP +! + +IF (OMIXUV) THEN + ! + ! 3.3 Compute the tendency for the (non conservative but treated as it) zonal momentum + ! (PDZZ and flux in w-point and PRHODJ is mass point, result in mass point) + ! + + CALL TRIDIAG_MASSFLUX(KKA,KKB,KKE,KKU,KKL,PUM,PFLXZUMF,-PEMF,PTSTEP,PIMPL, & + PDZZ,PRHODJ,ZVARS ) + ! compute new flux + PFLXZUMF(:,:) = PEMF(:,:)*(PU_UP(:,:)-MZM_MF(KKA,KKU,KKL,ZVARS(:,:))) + + ! compute U tendency + PUDT(:,:)= (ZVARS(:,:)-PUM(:,:))/PTSTEP + + ! + ! + ! 3.4 Compute the tendency for the (non conservative but treated as it for the time beiing) + ! meridian momentum + ! (PDZZ and flux in w-point and PRHODJ is mass point, result in mass point) + ! + CALL TRIDIAG_MASSFLUX(KKA,KKB,KKE,KKU,KKL,PVM,PFLXZVMF,-PEMF,PTSTEP,PIMPL, & + PDZZ,PRHODJ,ZVARS ) + ! compute new flux + PFLXZVMF(:,:) = PEMF(:,:)*(PV_UP(:,:)-MZM_MF(KKA,KKU,KKL,ZVARS(:,:))) + + ! compute V tendency + PVDT(:,:)= (ZVARS(:,:)-PVM(:,:))/PTSTEP +ELSE + PUDT(:,:)=0. + PVDT(:,:)=0. +ENDIF + +DO JSV=1,ISV + + IF (ONOMIXLG .AND. JSV >= KSV_LGBEG .AND. JSV<= KSV_LGEND) CYCLE + + !* compute mean flux of scalar variables at time t-dt + ! ( Resulting fluxes are in flux level (w-point) as PEMF and PTHL_UP ) + + PFLXZSVMF(:,:,JSV) = PEMF(:,:)*(PSV_UP(:,:,JSV)-MZM_MF(KKA,KKU,KKL,PSVM(:,:,JSV))) + + ! + ! 3.5 Compute the tendency for scalar variables + ! (PDZZ and flux in w-point and PRHODJ is mass point, result in mass point) + ! + CALL TRIDIAG_MASSFLUX(KKA,KKB,KKE,KKU,KKL,PSVM(:,:,JSV),PFLXZSVMF(:,:,JSV),& + -PEMF,PTSTEP,PIMPL,PDZZ,PRHODJ,ZVARS ) + ! compute new flux + PFLXZSVMF(:,:,JSV) = PEMF(:,:)*(PSV_UP(:,:,JSV)-MZM_MF(KKA,KKU,KKL,ZVARS)) + + ! compute Sv tendency + PSVDT(:,:,JSV)= (ZVARS(:,:)-PSVM(:,:,JSV))/PTSTEP + +ENDDO +! +END SUBROUTINE MF_TURB_GREYZONE diff --git a/src/mesonh/turb/modd_cturb.f90 b/src/mesonh/turb/modd_cturb.f90 new file mode 100644 index 000000000..db23e955b --- /dev/null +++ b/src/mesonh/turb/modd_cturb.f90 @@ -0,0 +1,91 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 modd 2006/05/23 10:10:13 +!----------------------------------------------------------------- +! ####################### + MODULE MODD_CTURB +! ####################### +! +!!**** *MODD_CTURB* - declaration of the turbulent scheme constants +!! +!! PURPOSE +!! ------- +! The purpose of this declarative module is to declare the +! turbulence scheme constants. +! +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! NONE +!! +!! REFERENCE +!! --------- +!! Book 2 of Meso-NH documentation (MODD_CTURB) +!! Book 1 of Meso-NH documentation (Chapter Turbulence) +!! +!! AUTHOR +!! ------ +!1 Joan Cuxart * INM and Meteo-France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 08/08/94 +!! Nov 06, 2002 (V. Masson) add XALPSBL and XASBL +!! May 06 Remove EPS +!! Jan 2019 (Q. Rodier) Remove XASBL +!---------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +REAL,SAVE :: XCMFS ! constant for the momentum flux due to shear +REAL,SAVE :: XCMFB ! constant for the momentum flux due to buoyancy +REAL,SAVE :: XCSHF ! constant for the sensible heat flux +REAL,SAVE :: XCHF ! constant for the humidity flux +REAL,SAVE :: XCTV ! constant for the temperature variance +REAL,SAVE :: XCHV ! constant for the humidity variance +REAL,SAVE :: XCHT1 ! first ct. for the humidity-temperature correlation +REAL,SAVE :: XCHT2 ! second ct. for the humidity-temperature correlation +! +REAL,SAVE :: XCPR1 ! first ct. for the turbulent Prandtl numbers +REAL,SAVE :: XCPR2 ! second ct. for the turbulent Prandtl numbers +REAL,SAVE :: XCPR3 ! third ct. for the turbulent Prandtl numbers +REAL,SAVE :: XCPR4 ! fourth ct. for the turbulent Prandtl numbers +REAL,SAVE :: XCPR5 ! fifth ct. for the turbulent Prandtl numbers +! +REAL,SAVE :: XCET ! constant into the transport term of the TKE eq. +REAL,SAVE :: XCED ! constant into the dissipation term of the TKE eq. +! +REAL,SAVE :: XCDP ! ct. for the production term in the dissipation eq. +REAL,SAVE :: XCDD ! ct. for the destruction term in the dissipation eq. +REAL,SAVE :: XCDT ! ct. for the transport term in the dissipation eq. +! +REAL,SAVE :: XTKEMIN ! mimimum value for the TKE +REAL,SAVE :: XRM17 ! Rodier et al 2017 constant in shear term for mixing length +! +REAL,SAVE :: XLINI ! initial value for BL mixing length +REAL,SAVE :: XLINF ! to prevent division by zero in the BL algorithm +! +REAL,SAVE :: XALPSBL ! constant linking TKE and friction velocity in the SBL +! +REAL,SAVE :: XCEP ! Constant for wind pressure-correlations +REAL,SAVE :: XA0 ! Constant a0 for wind pressure-correlations +REAL,SAVE :: XA2 ! Constant a2 for wind pressure-correlations +REAL,SAVE :: XA3 ! Constant a3 for wind pressure-correlations +REAL,SAVE :: XA5 ! Constant a5 for temperature pressure-correlations +REAL,SAVE :: XCTD ! Constant for temperature and vapor dissipation +REAL,SAVE :: XCTP ! Constant for temperature and vapor pressure-correlations +! +REAL,SAVE :: XPHI_LIM ! Threshold value for Phi3 and Psi3 +REAL,SAVE :: XSBL_O_BL ! SBL height / BL height ratio +REAL,SAVE :: XFTOP_O_FSURF! Fraction of surface (heat or momentum) flux used to define top of BL +! +END MODULE MODD_CTURB diff --git a/src/mesonh/turb/modd_diag_in_run.f90 b/src/mesonh/turb/modd_diag_in_run.f90 new file mode 100644 index 000000000..b7bba80d0 --- /dev/null +++ b/src/mesonh/turb/modd_diag_in_run.f90 @@ -0,0 +1,43 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 modd 2006/10/24 10:07:40 +!----------------------------------------------------------------- +MODULE MODD_DIAG_IN_RUN +! Modifications +!! 02/2018 Q.Libois ECRAD +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes +! +!* stores instantaneous diagnostic arrays for the current time-step +! +IMPLICIT NONE + +LOGICAL :: LDIAG_IN_RUN ! flag for diagnostics +! +REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_RN ! net radiation +REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_H ! sensible heat flux +REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_LE ! Total latent heat flux +REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_LEI ! Solid latent heat flux +REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_GFLUX ! ground flux +REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_LWD ! incoming longwave at the surface +REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_LWU ! outcoming longwave at the surface +REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_SWD ! incoming Shortwave at the surface +REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_SWU ! outcoming Shortwave at the surface +REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_SWDIR ! incoming Shortwave direct at the surface +REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_SWDIFF! incoming Shortwave diffuse at the surface +REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_T2M ! temperature at 2m +REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_Q2M ! humidity at 2m +REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_HU2M ! relative humidity at 2m +REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_ZON10M! zonal wind at 10m +REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_MER10M! meridian wind at 10m +REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_DSTAOD! dust aerosol optical depth +REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_SFCO2 ! CO2 Surface flux +REAL, DIMENSION(:,:,:), ALLOCATABLE :: XCURRENT_TKE_DISS ! Tke dissipation rate +REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_SLTAOD ! Salt aerosol optical depth +REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_ZWS ! Significant height of waves +END MODULE MODD_DIAG_IN_RUN diff --git a/src/mesonh/turb/modd_turb_cloud.f90 b/src/mesonh/turb/modd_turb_cloud.f90 new file mode 100644 index 000000000..28b1f106f --- /dev/null +++ b/src/mesonh/turb/modd_turb_cloud.f90 @@ -0,0 +1,58 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 modd 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ################## + MODULE MODD_TURB_CLOUD +! ################## +! +!!**** *MODD_TURB_CLOUD* - declaration of parameters for cloud mixing length +!! +!! PURPOSE +!! ------- +! The purpose of this declarative module is to declare the +! variables that may be set by namelist for the cloud mixing length +! +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! M. Tomasini *Meteo France* +!! +!! MODIFICATIONS +!! ------------- +!! Original September, 2004 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +INTEGER,SAVE :: NMODEL_CLOUD ! model number where the modification ! of the mixing length in the clouds is computed +CHARACTER (LEN=4),SAVE :: CTURBLEN_CLOUD ! type of length in the clouds + ! 'DEAR' Deardorff mixing length + ! 'BL89' Bougeault and Lacarrere scheme + ! 'DELT' length = ( volum) ** 1/3 +REAL,SAVE :: XCOEF_AMPL_SAT ! saturation of the amplification coefficient +REAL,SAVE :: XCEI_MIN ! minimum threshold for the instability index CEI + !(beginning of the amplification) +REAL,SAVE :: XCEI_MAX ! maximum threshold for the instability index CEI + !(beginning of the saturation of the amplification) +REAL,SAVE,DIMENSION(:,:,:), ALLOCATABLE :: XCEI ! Cloud Entrainment instability + ! index to emphasize localy + ! turbulent fluxes +! +END MODULE MODD_TURB_CLOUD diff --git a/src/mesonh/turb/modd_turb_flux_aircraft_balloon.f90 b/src/mesonh/turb/modd_turb_flux_aircraft_balloon.f90 new file mode 100644 index 000000000..cd3e40b62 --- /dev/null +++ b/src/mesonh/turb/modd_turb_flux_aircraft_balloon.f90 @@ -0,0 +1,54 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ $Date$ +!----------------------------------------------------------------- +!----------------------------------------------------------------- +!----------------------------------------------------------------- +! ###################################### + MODULE MODD_TURB_FLUX_AIRCRAFT_BALLOON +! ###################################### +! +!!**** *MODD_CVERT* - Declares work arrays for vertical cross-sections +!! +!! PURPOSE +!! ------- +! For vertical cross-sections only, this declarative module declares +! the arrays containing the sea-level altitudes and the model topography +! of the oblique cross-section points. +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! +!! Book2 of the TRACE volume of the Meso-NH user manual +!! (MODD_CVERT) +!! +!! AUTHOR +!! ------ +!! P.Lacarrere +!! +!! MODIFICATIONS +!! ------------- +!! Original 18/09/06 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +! +IMPLICIT NONE +! +REAL,DIMENSION(:,:,:) ,ALLOCATABLE,SAVE :: XTHW_FLUX !sensible flux +REAL,DIMENSION(:,:,:) ,ALLOCATABLE,SAVE :: XRCW_FLUX !Latent flux +REAL,DIMENSION(:,:,:,:),ALLOCATABLE,SAVE :: XSVW_FLUX !turb scalar flux +! +END MODULE MODD_TURB_FLUX_AIRCRAFT_BALLOON diff --git a/src/mesonh/turb/modd_turbn.f90 b/src/mesonh/turb/modd_turbn.f90 new file mode 100644 index 000000000..8c35fd9d4 --- /dev/null +++ b/src/mesonh/turb/modd_turbn.f90 @@ -0,0 +1,211 @@ +!MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ################## + MODULE MODD_TURB_n +! ################## +! +!!**** *MODD_TURB$n* - declaration of turbulence scheme free parameters +!! +!! PURPOSE +!! ------- +! The purpose of this declarative module is to declare the +! variables that may be set by namelist for the turbulence scheme +! +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (module MODD_PARAMn) +!! +!! AUTHOR +!! ------ +!! J. Cuxart and J. Stein * I.N.M. and Meteo France* +!! +!! MODIFICATIONS +!! ------------- +!! Original January 9, 1995 +!! J.Cuxart February 15, 1995 add the switches for diagnostic storages +!! J.M. Carriere May 15, 1995 add the subgrid condensation +!! M. Tomasini Jul 05, 2001 add the subgrid autoconversion +!! P. Bechtold Feb 11, 2002 add switch for Sigma_s computation +!! P. Jabouille Apr 4, 2002 add switch for Sigma_s convection +!! V. Masson Nov 13 2002 add switch for SBL lengths +!! May 2006 Remove KEPS +!! C.Lac Nov 2014 add terms of TKE production for LES diag +!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +!! D. Ricard May 2021 add the switches for Leonard terms +!! JL Redelsperger 03/2021 Add O-A flux for auto-coupled LES case +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAMETERS, ONLY: JPMODELMAX +IMPLICIT NONE + +TYPE TURB_t +! +! + REAL :: XIMPL ! implicitness degree for the vertical terms of + ! the turbulence scheme + REAL :: XKEMIN ! mimimum value for the TKE + REAL :: XCEDIS ! Constant for dissipation of Tke + REAL :: XCADAP ! Coefficient for ADAPtative mixing length + CHARACTER (LEN=4) :: CTURBLEN ! type of length used for the closure + ! 'BL89' Bougeault and Lacarrere scheme + ! 'DELT' length = ( volum) ** 1/3 + CHARACTER (LEN=4) :: CTURBDIM ! dimensionality of the turbulence scheme + ! '1DIM' for purely vertical computations + ! '3DIM' for computations in the 3 + ! directions + LOGICAL :: LTURB_FLX ! logical switch for the storage of all + ! the turbulent fluxes + LOGICAL :: LTURB_DIAG! logical switch for the storage of some + ! turbulence related diagnostics + LOGICAL :: LSUBG_COND! Switch for subgrid condensation + LOGICAL :: LSIGMAS ! Switch for using Sigma_s from turbulence scheme + LOGICAL :: LSIG_CONV ! Switch for computing Sigma_s due to convection +! + LOGICAL :: LRMC01 ! Switch for computing separate mixing +! ! and dissipative length in the SBL +! ! according to Redelsperger, Mahe & +! ! Carlotti 2001 + CHARACTER(LEN=4) :: CTOM ! type of Third Order Moments + ! 'NONE' none + ! 'TM06' Tomas Masson 2006 + CHARACTER(LEN=4) :: CSUBG_AUCV ! type of subgrid rc->rr autoconv. method + CHARACTER(LEN=80) :: CSUBG_AUCV_RI ! type of subgrid ri->rs autoconv. method + CHARACTER(LEN=80) :: CCONDENS ! subrgrid condensation PDF + CHARACTER(LEN=4) :: CLAMBDA3 ! lambda3 choice for subgrid cloud scheme + CHARACTER(LEN=80) :: CSUBG_MF_PDF ! PDF to use for MF cloud autoconversions + +! REAL, DIMENSION(:,:), POINTER :: XBL_DEPTH=>NULL() ! BL depth for TOMS computations +! REAL, DIMENSION(:,:), POINTER :: XSBL_DEPTH=>NULL()! SurfaceBL depth for RMC01 computations +! REAL, DIMENSION(:,:,:), POINTER :: XWTHVMF=>NULL()! Mass Flux vert. transport of buoyancy + REAL :: VSIGQSAT ! coeff applied to qsat variance contribution + REAL, DIMENSION(:,:,:), POINTER :: XDYP=>NULL() ! Dynamical production of Kinetic energy + REAL, DIMENSION(:,:,:), POINTER :: XTHP=>NULL() ! Thermal production of Kinetic energy + REAL, DIMENSION(:,:,:), POINTER :: XTR=>NULL() ! Transport production of Kinetic energy + REAL, DIMENSION(:,:,:), POINTER :: XDISS=>NULL() ! Dissipation of Kinetic energy + REAL, DIMENSION(:,:,:), POINTER :: XLEM=>NULL() ! Mixing length + REAL, DIMENSION(:,:,:), POINTER :: XSSUFL_C=>NULL() ! O-A interface flux for u + REAL, DIMENSION(:,:,:), POINTER :: XSSVFL_C=>NULL() ! O-A interface flux for v + REAL, DIMENSION(:,:,:), POINTER :: XSSTFL_C=>NULL() ! O-A interface flux for theta + REAL, DIMENSION(:,:,:), POINTER :: XSSRFL_C=>NULL() ! O-A interface flux for vapor + LOGICAL :: LHGRAD ! logical switch for the computation of the Leornard Terms + REAL :: XCOEFHGRADTHL ! coeff applied to thl contribution + REAL :: XCOEFHGRADRM ! coeff applied to mixing ratio contribution + REAL :: XALTHGRAD ! altitude from which to apply the Leonard terms + REAL :: XCLDTHOLD ! cloud threshold to apply the Leonard terms + ! negative value : applied everywhere + ! 0.000001 applied only inside the clouds ri+rc > 10**-6 kg/kg +! +END TYPE TURB_t + +TYPE(TURB_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: TURB_MODEL + +REAL, POINTER :: XIMPL=>NULL() +REAL, POINTER :: XKEMIN=>NULL() +REAL, POINTER :: XCEDIS=>NULL() +REAL, POINTER :: XCADAP=>NULL() +CHARACTER (LEN=4), POINTER :: CTURBLEN=>NULL() +CHARACTER (LEN=4), POINTER :: CTURBDIM=>NULL() +LOGICAL, POINTER :: LTURB_FLX=>NULL() +LOGICAL, POINTER :: LTURB_DIAG=>NULL() +LOGICAL, POINTER :: LSUBG_COND=>NULL() +LOGICAL, POINTER :: LSIGMAS=>NULL() +LOGICAL, POINTER :: LSIG_CONV=>NULL() +LOGICAL, POINTER :: LRMC01=>NULL() +CHARACTER(LEN=4),POINTER :: CTOM=>NULL() +CHARACTER(LEN=4),POINTER :: CSUBG_AUCV=>NULL() +CHARACTER(LEN=80),POINTER :: CSUBG_AUCV_RI=>NULL() +CHARACTER(LEN=80),POINTER :: CCONDENS=>NULL() +CHARACTER(LEN=4),POINTER :: CLAMBDA3=>NULL() +CHARACTER(LEN=80),POINTER :: CSUBG_MF_PDF=>NULL() +REAL, DIMENSION(:,:), POINTER :: XBL_DEPTH=>NULL() +REAL, DIMENSION(:,:), POINTER :: XSBL_DEPTH=>NULL() +REAL, DIMENSION(:,:,:), POINTER :: XWTHVMF=>NULL() +REAL, POINTER :: VSIGQSAT=>NULL() +REAL, DIMENSION(:,:,:), POINTER :: XDYP=>NULL() +REAL, DIMENSION(:,:,:), POINTER :: XTHP=>NULL() +REAL, DIMENSION(:,:,:), POINTER :: XTR=>NULL() +REAL, DIMENSION(:,:,:), POINTER :: XDISS=>NULL() +REAL, DIMENSION(:,:,:), POINTER :: XLEM=>NULL() +REAL, DIMENSION(:,:,:), POINTER :: XSSUFL_C=>NULL() +REAL, DIMENSION(:,:,:), POINTER :: XSSVFL_C=>NULL() +REAL, DIMENSION(:,:,:), POINTER :: XSSTFL_C=>NULL() +REAL, DIMENSION(:,:,:), POINTER :: XSSRFL_C=>NULL() +LOGICAL, POINTER :: LHGRAD=>NULL() +REAL, POINTER :: XCOEFHGRADTHL=>NULL() +REAL, POINTER :: XCOEFHGRADRM=>NULL() +REAL, POINTER :: XALTHGRAD=>NULL() +REAL, POINTER :: XCLDTHOLD=>NULL() + +CONTAINS + +SUBROUTINE TURB_GOTO_MODEL(KFROM, KTO) +INTEGER, INTENT(IN) :: KFROM, KTO +! +! Save current state for allocated arrays +! +!TURB_MODEL(KFROM)%XBL_DEPTH=>XBL_DEPTH !Done in FIELDLIST_GOTO_MODEL +!TURB_MODEL(KFROM)%XSBL_DEPTH=>XSBL_DEPTH !Done in FIELDLIST_GOTO_MODEL +!TURB_MODEL(KFROM)%XWTHVMF=>XWTHVMF !Done in FIELDLIST_GOTO_MODEL +TURB_MODEL(KFROM)%XDYP=>XDYP +TURB_MODEL(KFROM)%XTHP=>XTHP +TURB_MODEL(KFROM)%XTR=>XTR +TURB_MODEL(KFROM)%XDISS=>XDISS +TURB_MODEL(KFROM)%XLEM=>XLEM +TURB_MODEL(KFROM)%XSSUFL_C=>XSSUFL_C +TURB_MODEL(KFROM)%XSSVFL_C=>XSSVFL_C +TURB_MODEL(KFROM)%XSSTFL_C=>XSSTFL_C +TURB_MODEL(KFROM)%XSSRFL_C=>XSSRFL_C +! +! Current model is set to model KTO +XIMPL=>TURB_MODEL(KTO)%XIMPL +XKEMIN=>TURB_MODEL(KTO)%XKEMIN +XCEDIS=>TURB_MODEL(KTO)%XCEDIS +XCADAP=>TURB_MODEL(KTO)%XCADAP +CTURBLEN=>TURB_MODEL(KTO)%CTURBLEN +CTURBDIM=>TURB_MODEL(KTO)%CTURBDIM +LTURB_FLX=>TURB_MODEL(KTO)%LTURB_FLX +LTURB_DIAG=>TURB_MODEL(KTO)%LTURB_DIAG +LSUBG_COND=>TURB_MODEL(KTO)%LSUBG_COND +LSIGMAS=>TURB_MODEL(KTO)%LSIGMAS +LSIG_CONV=>TURB_MODEL(KTO)%LSIG_CONV +LRMC01=>TURB_MODEL(KTO)%LRMC01 +CTOM=>TURB_MODEL(KTO)%CTOM +CSUBG_AUCV=>TURB_MODEL(KTO)%CSUBG_AUCV +CSUBG_AUCV_RI=>TURB_MODEL(KTO)%CSUBG_AUCV_RI +CCONDENS=>TURB_MODEL(KTO)%CCONDENS +CLAMBDA3=>TURB_MODEL(KTO)%CLAMBDA3 +CSUBG_MF_PDF=>TURB_MODEL(KTO)%CSUBG_MF_PDF +!XBL_DEPTH=>TURB_MODEL(KTO)%XBL_DEPTH !Done in FIELDLIST_GOTO_MODEL +!XSBL_DEPTH=>TURB_MODEL(KTO)%XSBL_DEPTH !Done in FIELDLIST_GOTO_MODEL +!XWTHVMF=>TURB_MODEL(KTO)%XWTHVMF !Done in FIELDLIST_GOTO_MODEL +VSIGQSAT=>TURB_MODEL(KTO)%VSIGQSAT +XDYP=>TURB_MODEL(KTO)%XDYP +XTHP=>TURB_MODEL(KTO)%XTHP +XTR=>TURB_MODEL(KTO)%XTR +XDISS=>TURB_MODEL(KTO)%XDISS +XLEM=>TURB_MODEL(KTO)%XLEM +XSSUFL_C=>TURB_MODEL(KTO)%XSSUFL_C +XSSVFL_C=>TURB_MODEL(KTO)%XSSVFL_C +XSSTFL_C=>TURB_MODEL(KTO)%XSSTFL_C +XSSRFL_C=>TURB_MODEL(KTO)%XSSRFL_C +LHGRAD=>TURB_MODEL(KTO)%LHGRAD +XCOEFHGRADTHL=>TURB_MODEL(KTO)%XCOEFHGRADTHL +XCOEFHGRADRM=>TURB_MODEL(KTO)%XCOEFHGRADRM +XALTHGRAD=>TURB_MODEL(KTO)%XALTHGRAD +XCLDTHOLD=>TURB_MODEL(KTO)%XCLDTHOLD + +END SUBROUTINE TURB_GOTO_MODEL + +END MODULE MODD_TURB_n diff --git a/src/mesonh/turb/mode_prandtl.f90 b/src/mesonh/turb/mode_prandtl.f90 new file mode 100644 index 000000000..04dfe6155 --- /dev/null +++ b/src/mesonh/turb/mode_prandtl.f90 @@ -0,0 +1,1399 @@ +!MNH_LIC Copyright 1994-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! #################### + MODULE MODE_PRANDTL +! #################### +! +!* modification 08/2010 V. Masson smoothing of the discontinuity in functions +! used for implicitation of exchange coefficients +! 05/2020 V. Masson and C. Lac : bug in D_PHI3DTDZ2_O_DDTDZ +! +USE MODD_CTURB, ONLY : XCTV, XCSHF, XCTD, XPHI_LIM, XCPR3, XCPR4, XCPR5 +USE MODD_PARAMETERS, ONLY : JPVEXT_TURB +! +USE MODI_SHUMAN +IMPLICIT NONE +!---------------------------------------------------------------------------- +CONTAINS +!---------------------------------------------------------------------------- +SUBROUTINE SMOOTH_TURB_FUNCT(PPHI3,PF_LIM,PF) +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPHI3 ! Phi3 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PF_LIM ! Value of F when Phi3 is +! ! larger than Phi_lim +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PF ! function F to smooth +! +REAL, DIMENSION(SIZE(PF,1),SIZE(PF,2),SIZE(PF,3)) :: ZCOEF +! +!* adds a artificial correction to smooth the function near the discontinuity +! point at Phi3 = Phi_lim +! This smoothing is applied between 0.9*phi_lim (=2.7) and Phi_lim (=3) +! Note that in the Boundary layer, phi is usually between 0.8 and 1 +! +! +ZCOEF = MAX(MIN(( 10.*(1.-PPHI3/XPHI_LIM)) ,1.), 0.) +! +PF(:,:,:) = ZCOEF(:,:,:) * PF & + + (1.-ZCOEF(:,:,:)) * PF_LIM +! +END SUBROUTINE SMOOTH_TURB_FUNCT +!---------------------------------------------------------------------------- +FUNCTION PHI3(PREDTH1,PREDR1,PRED2TH3,PRED2R3,PRED2THR3,HTURBDIM,OUSERV) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PRED2TH3 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PRED2R3 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PRED2THR3 + CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! 1DIM or 3DIM turb. scheme + LOGICAL, INTENT(IN) :: OUSERV ! flag to use vapor + REAL, DIMENSION(SIZE(PREDTH1,1),SIZE(PREDTH1,2),SIZE(PREDTH1,3)) :: PHI3 +! + REAL, DIMENSION(SIZE(PREDTH1,1),SIZE(PREDTH1,2),SIZE(PREDTH1,3)) :: ZW1, ZW2 + INTEGER :: IKB, IKE +! +IKB = 1+JPVEXT_TURB +IKE = SIZE(PREDTH1,3)-JPVEXT_TURB +! +IF (HTURBDIM=='3DIM') THEN + !* 3DIM case + IF (OUSERV) THEN + ZW1(:,:,:) = 1. + 1.5* (PREDTH1(:,:,:)+PREDR1(:,:,:)) + & + ( 0.5 * (PREDTH1(:,:,:)**2+PREDR1(:,:,:)**2) & + + PREDTH1(:,:,:) * PREDR1(:,:,:) & + ) + + ZW2(:,:,:) = 0.5 * (PRED2TH3(:,:,:)-PRED2R3(:,:,:)) + + PHI3(:,:,:)= 1. - & + ( ( (1.+PREDR1(:,:,:)) * & + (PRED2THR3(:,:,:) + PRED2TH3(:,:,:)) / PREDTH1(:,:,:) & + ) + ZW2(:,:,:) & + ) / ZW1(:,:,:) + ELSE + ZW1(:,:,:) = 1. + 1.5* PREDTH1(:,:,:) + & + 0.5* PREDTH1(:,:,:)**2 + + ZW2(:,:,:) = 0.5* PRED2TH3(:,:,:) + + PHI3(:,:,:)= 1. - & + (PRED2TH3(:,:,:) / PREDTH1(:,:,:) + ZW2(:,:,:)) / ZW1(:,:,:) + END IF + WHERE( PHI3 <= 0. .OR. PHI3 > XPHI_LIM ) + PHI3 = XPHI_LIM + END WHERE + +ELSE + !* 1DIM case + IF (OUSERV) THEN + PHI3(:,:,:)= 1./(1.+PREDTH1(:,:,:)+PREDR1(:,:,:)) + ELSE + PHI3(:,:,:)= 1./(1.+PREDTH1(:,:,:)) + END IF +END IF +! +PHI3(:,:,IKB-1)=PHI3(:,:,IKB) +PHI3(:,:,IKE+1)=PHI3(:,:,IKE) +! +END FUNCTION PHI3 +!---------------------------------------------------------------------------- +FUNCTION PSI_SV(PREDTH1,PREDR1,PREDS1,PRED2THS,PRED2RS,PPHI3,PPSI3) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PREDS1 + REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRED2THS + REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRED2RS + REAL, DIMENSION(:,:,:), INTENT(IN) :: PPHI3 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PPSI3 + REAL, DIMENSION(SIZE(PRED2THS,1),SIZE(PRED2THS,2),SIZE(PRED2THS,3),SIZE(PRED2THS,4)) :: PSI_SV +! + INTEGER :: IKB, IKE + INTEGER :: JSV +! +IKB = 1+JPVEXT_TURB +IKE = SIZE(PREDTH1,3)-JPVEXT_TURB +! +DO JSV=1,SIZE(PSI_SV,4) + PSI_SV(:,:,:,JSV) = ( 1. & + - (XCPR3+XCPR5) * (PRED2THS(:,:,:,JSV)/PREDS1(:,:,:,JSV)-PREDTH1) & + - (XCPR4+XCPR5) * (PRED2RS (:,:,:,JSV)/PREDS1(:,:,:,JSV)-PREDR1 ) & + - XCPR3 * PREDTH1 * PPHI3 - XCPR4 * PREDR1 * PPSI3 & + ) / ( 1. + XCPR5 * ( PREDTH1 + PREDR1 ) ) + +! control of the PSI_SV positivity + WHERE ( (PSI_SV(:,:,:,JSV) <=0.).AND. (PREDTH1+PREDR1) <= 0. ) + PSI_SV(:,:,:,JSV)=XPHI_LIM + END WHERE + PSI_SV(:,:,:,JSV) = MAX( 1.E-4, MIN(XPHI_LIM,PSI_SV(:,:,:,JSV)) ) +! + PSI_SV(:,:,IKB-1,JSV)=PSI_SV(:,:,IKB,JSV) + PSI_SV(:,:,IKE+1,JSV)=PSI_SV(:,:,IKE,JSV) +END DO +! +END FUNCTION PSI_SV +!---------------------------------------------------------------------------- +FUNCTION D_PHI3DTDZ_O_DDTDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,HTURBDIM,OUSERV) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PPHI3 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PRED2TH3 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PRED2THR3 + CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! 1DIM or 3DIM turb. scheme + LOGICAL, INTENT(IN) :: OUSERV ! flag to use vapor + REAL, DIMENSION(SIZE(PREDTH1,1),SIZE(PREDTH1,2),SIZE(PREDTH1,3)) :: D_PHI3DTDZ_O_DDTDZ + INTEGER :: IKB, IKE,JL,JK,JJ +! +IKB = 1+JPVEXT_TURB +IKE = SIZE(PREDTH1,3)-JPVEXT_TURB +! +IF (HTURBDIM=='3DIM') THEN + !* 3DIM case + IF (OUSERV) THEN + WHERE (PPHI3(:,:,:)<=XPHI_LIM) + D_PHI3DTDZ_O_DDTDZ(:,:,:) = PPHI3(:,:,:) & + * (1. - PREDTH1(:,:,:) * (3./2.+PREDTH1+PREDR1) & + /((1.+PREDTH1+PREDR1)*(1.+1./2.*(PREDTH1+PREDR1)))) & + + (1.+PREDR1)*(PRED2THR3+PRED2TH3) & + / (PREDTH1*(1.+PREDTH1+PREDR1)*(1.+1./2.*(PREDTH1+PREDR1))) & + - (1./2.*PREDTH1+PREDR1 * (1.+PREDTH1+PREDR1)) & + / ((1.+PREDTH1+PREDR1)*(1.+1./2.*(PREDTH1+PREDR1))) + ELSEWHERE + D_PHI3DTDZ_O_DDTDZ(:,:,:) = PPHI3(:,:,:) + ENDWHERE + +! + ELSE + WHERE (PPHI3(:,:,:)<=XPHI_LIM) + D_PHI3DTDZ_O_DDTDZ(:,:,:) = PPHI3(:,:,:) & + * (1. - PREDTH1(:,:,:) * (3./2.+PREDTH1) & + /((1.+PREDTH1)*(1.+1./2.*PREDTH1))) & + + PRED2TH3 / (PREDTH1*(1.+PREDTH1)*(1.+1./2.*PREDTH1)) & + - 1./2.*PREDTH1 / ((1.+PREDTH1)*(1.+1./2.*PREDTH1)) + ELSEWHERE + D_PHI3DTDZ_O_DDTDZ(:,:,:) = PPHI3(:,:,:) + ENDWHERE +! + END IF +ELSE + !* 1DIM case +! WHERE (PPHI3(:,:,:)<=XPHI_LIM) +! D_PHI3DTDZ_O_DDTDZ(:,:,:) = PPHI3(:,:,:) & +! * (1. - PREDTH1(:,:,:)*PPHI3(:,:,:)) +! ELSEWHERE +! D_PHI3DTDZ_O_DDTDZ(:,:,:) = PPHI3(:,:,:) +! ENDWHERE +DO JJ=1,SIZE(PPHI3,2) + DO JL=1,SIZE(PPHI3,1) + DO JK=1,SIZE(PPHI3,3) + IF ( ABS(PPHI3(JL,JJ,JK)-XPHI_LIM) < 1.E-12 ) THEN + D_PHI3DTDZ_O_DDTDZ(JL,JJ,JK)=PPHI3(JL,JJ,JK)*& +& (1. - PREDTH1(JL,JJ,JK)*PPHI3(JL,JJ,JK)) + ELSE + D_PHI3DTDZ_O_DDTDZ(JL,JJ,JK)=PPHI3(JL,JJ,JK) + ENDIF + ENDDO + ENDDO +ENDDO +END IF +! +!* smoothing +CALL SMOOTH_TURB_FUNCT(PPHI3,PPHI3,D_PHI3DTDZ_O_DDTDZ) +! +D_PHI3DTDZ_O_DDTDZ(:,:,IKB-1)=D_PHI3DTDZ_O_DDTDZ(:,:,IKB) +D_PHI3DTDZ_O_DDTDZ(:,:,IKE+1)=D_PHI3DTDZ_O_DDTDZ(:,:,IKE) +! +END FUNCTION D_PHI3DTDZ_O_DDTDZ +!---------------------------------------------------------------------------- +FUNCTION D_PHI3DRDZ_O_DDRDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,HTURBDIM,OUSERV) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PPHI3 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PRED2TH3 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PRED2THR3 + CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! 1DIM or 3DIM turb. scheme + LOGICAL, INTENT(IN) :: OUSERV ! flag to use vapor + REAL, DIMENSION(SIZE(PREDTH1,1),SIZE(PREDTH1,2),SIZE(PREDTH1,3)) :: D_PHI3DRDZ_O_DDRDZ + INTEGER :: IKB, IKE +! +IKB = 1+JPVEXT_TURB +IKE = SIZE(PREDTH1,3)-JPVEXT_TURB +! +! +IF (HTURBDIM=='3DIM') THEN + !* 3DIM case + IF (OUSERV) THEN + WHERE (PPHI3(:,:,:)<=XPHI_LIM) + D_PHI3DRDZ_O_DDRDZ(:,:,:) = & + PPHI3(:,:,:) * (1.-PREDR1(:,:,:)*(3./2.+PREDTH1+PREDR1) & + / ((1.+PREDTH1+PREDR1)*(1.+1./2.*(PREDTH1+PREDR1)))) & + - PREDR1(:,:,:) * (PRED2THR3+PRED2TH3) / (PREDTH1 & + * (1.+PREDTH1+PREDR1)*(1.+1./2.*(PREDTH1+PREDR1))) & + + PREDR1(:,:,:) * (1./2.+PREDTH1+PREDR1) & + / ((1.+PREDTH1+PREDR1)*(1.+1./2.*(PREDTH1+PREDR1))) + ELSEWHERE + D_PHI3DRDZ_O_DDRDZ(:,:,:) = PPHI3(:,:,:) + END WHERE + ELSE + D_PHI3DRDZ_O_DDRDZ(:,:,:) = PPHI3(:,:,:) + END IF +ELSE + !* 1DIM case + WHERE (PPHI3(:,:,:)<=XPHI_LIM) + D_PHI3DRDZ_O_DDRDZ(:,:,:) = PPHI3(:,:,:) & + * (1. - PREDR1(:,:,:)*PPHI3(:,:,:)) + ELSEWHERE + D_PHI3DRDZ_O_DDRDZ(:,:,:) = PPHI3(:,:,:) + END WHERE +END IF +! +!* smoothing +CALL SMOOTH_TURB_FUNCT(PPHI3,PPHI3,D_PHI3DRDZ_O_DDRDZ) +! +D_PHI3DRDZ_O_DDRDZ(:,:,IKB-1)=D_PHI3DRDZ_O_DDRDZ(:,:,IKB) +D_PHI3DRDZ_O_DDRDZ(:,:,IKE+1)=D_PHI3DRDZ_O_DDRDZ(:,:,IKE) +! +END FUNCTION D_PHI3DRDZ_O_DDRDZ +!---------------------------------------------------------------------------- +FUNCTION D_PHI3DTDZ2_O_DDTDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,PDTDZ,HTURBDIM,OUSERV) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PPHI3 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PRED2TH3 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PRED2THR3 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTDZ + CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! 1DIM or 3DIM turb. scheme + LOGICAL, INTENT(IN) :: OUSERV ! flag to use vapor + REAL, DIMENSION(SIZE(PREDTH1,1),SIZE(PREDTH1,2),SIZE(PREDTH1,3)) :: D_PHI3DTDZ2_O_DDTDZ + INTEGER :: IKB, IKE +! +IKB = 1+JPVEXT_TURB +IKE = SIZE(PREDTH1,3)-JPVEXT_TURB +! +! +IF (HTURBDIM=='3DIM') THEN + ! by derivation of (phi3 dtdz) * dtdz according to dtdz we obtain: + D_PHI3DTDZ2_O_DDTDZ(:,:,:) = PDTDZ * (PPHI3 + & + D_PHI3DTDZ_O_DDTDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,HTURBDIM,OUSERV) ) + +! !* 3DIM case +! IF (OUSERV) THEN +! WHERE (PPHI3(:,:,:)<=XPHI_LIM) +! D_PHI3DTDZ2_O_DDTDZ(:,:,:) = PPHI3(:,:,:) & +! * PDTDZ(:,:,:)*(2.-PREDTH1(:,:,:)*(3./2.+PREDTH1+PREDR1) & +! /((1.+PREDTH1+PREDR1)*(1.+1./2.*(PREDTH1+PREDR1)))) & +! + (1.+PREDR1)*(PRED2THR3+PRED2TH3) & +! / (PREDTH1*(1.+PREDTH1+PREDR1)*(1.+1./2.*(PREDTH1+PREDR1))) & +! - (1./2.*PREDTH1+PREDR1 * (1.+PREDTH1+PREDR1)) & +! / ((1.+PREDTH1+PREDR1)*(1.+1./2.*(PREDTH1+PREDR1))) +! ELSEWHERE +! D_PHI3DTDZ2_O_DDTDZ(:,:,:) = PPHI3(:,:,:) * 2. * PDTDZ(:,:,:) +! ENDWHERE +! +!! +! ELSE +! WHERE (PPHI3(:,:,:)<=XPHI_LIM) +! D_PHI3DTDZ2_O_DDTDZ(:,:,:) = PPHI3(:,:,:) & +! * PDTDZ(:,:,:)*(2.-PREDTH1(:,:,:)*(3./2.+PREDTH1) & +! /((1.+PREDTH1)*(1.+1./2.*PREDTH1))) & +! + PRED2TH3 / (PREDTH1*(1.+PREDTH1)*(1.+1./2.*PREDTH1)) & +! - 1./2.*PREDTH1 / ((1.+PREDTH1)*(1.+1./2.*PREDTH1)) +! ELSEWHERE +! D_PHI3DTDZ2_O_DDTDZ(:,:,:) = PPHI3(:,:,:) * 2. * PDTDZ(:,:,:) +! ENDWHERE +! END IF +ELSE + !* 1DIM case + WHERE (PPHI3(:,:,:)<=XPHI_LIM) + D_PHI3DTDZ2_O_DDTDZ(:,:,:) = PPHI3(:,:,:)*PDTDZ(:,:,:) & + * (2. - PREDTH1(:,:,:)*PPHI3(:,:,:)) + ELSEWHERE + D_PHI3DTDZ2_O_DDTDZ(:,:,:) = PPHI3(:,:,:) * 2. * PDTDZ(:,:,:) + END WHERE +END IF +! +!* smoothing +CALL SMOOTH_TURB_FUNCT(PPHI3,PPHI3*2.*PDTDZ,D_PHI3DTDZ2_O_DDTDZ) +! +! +D_PHI3DTDZ2_O_DDTDZ(:,:,IKB-1)=D_PHI3DTDZ2_O_DDTDZ(:,:,IKB) +D_PHI3DTDZ2_O_DDTDZ(:,:,IKE+1)=D_PHI3DTDZ2_O_DDTDZ(:,:,IKE) +! +END FUNCTION D_PHI3DTDZ2_O_DDTDZ +!---------------------------------------------------------------------------- +FUNCTION M3_WTH_WTH2(PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PBLL_O_E + REAL, DIMENSION(:,:,:), INTENT(IN) :: PETHETA + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_WTH_WTH2 + INTEGER :: IKB, IKE +! +IKB = 1+JPVEXT_TURB +IKE = SIZE(PD,3)-JPVEXT_TURB + +M3_WTH_WTH2(:,:,:) = XCSHF*PBLL_O_E*PETHETA*0.5/XCTD & + * (1.+0.5*PREDTH1+PREDR1) / PD +M3_WTH_WTH2(:,:,IKB-1)=M3_WTH_WTH2(:,:,IKB) +M3_WTH_WTH2(:,:,IKE+1)=M3_WTH_WTH2(:,:,IKE) +! +END FUNCTION M3_WTH_WTH2 +!---------------------------------------------------------------------------- +FUNCTION D_M3_WTH_WTH2_O_DDTDZ(PM3_WTH_WTH2,PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PM3_WTH_WTH2 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PBLL_O_E + REAL, DIMENSION(:,:,:), INTENT(IN) :: PETHETA + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_WTH_WTH2_O_DDTDZ + INTEGER :: IKB, IKE +! +IKB = 1+JPVEXT_TURB +IKE = SIZE(PD,3)-JPVEXT_TURB + +D_M3_WTH_WTH2_O_DDTDZ(:,:,:) = ( 0.5*XCSHF*PBLL_O_E*PETHETA*0.5/XCTD/PD & + - PM3_WTH_WTH2/PD*(1.5+PREDTH1+PREDR1) )& + * PBLL_O_E * PETHETA * XCTV +! +D_M3_WTH_WTH2_O_DDTDZ(:,:,IKB-1)=D_M3_WTH_WTH2_O_DDTDZ(:,:,IKB) +D_M3_WTH_WTH2_O_DDTDZ(:,:,IKE+1)=D_M3_WTH_WTH2_O_DDTDZ(:,:,IKE) +! +END FUNCTION D_M3_WTH_WTH2_O_DDTDZ +!---------------------------------------------------------------------------- +FUNCTION M3_WTH_W2TH(PREDTH1,PREDR1,PD,PKEFF,PTKE) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PKEFF + REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_WTH_W2TH + INTEGER :: IKB, IKE +! +IKB = 1+JPVEXT_TURB +IKE = SIZE(PD,3)-JPVEXT_TURB + +M3_WTH_W2TH(:,:,:) = XCSHF*PKEFF*1.5/MZM(PTKE) & + * (1. - 0.5*PREDR1*(1.+PREDR1)/PD ) / (1.+PREDTH1) +! +M3_WTH_W2TH(:,:,IKB-1)=M3_WTH_W2TH(:,:,IKB) +M3_WTH_W2TH(:,:,IKE+1)=M3_WTH_W2TH(:,:,IKE) +! +END FUNCTION M3_WTH_W2TH +!---------------------------------------------------------------------------- +FUNCTION D_M3_WTH_W2TH_O_DDTDZ(PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA,PKEFF,PTKE) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PBLL_O_E + REAL, DIMENSION(:,:,:), INTENT(IN) :: PETHETA + REAL, DIMENSION(:,:,:), INTENT(IN) :: PKEFF + REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_WTH_W2TH_O_DDTDZ + INTEGER :: IKB, IKE +! +IKB = 1+JPVEXT_TURB +IKE = SIZE(PD,3)-JPVEXT_TURB + +D_M3_WTH_W2TH_O_DDTDZ(:,:,:) = & + - XCSHF*PKEFF*1.5/MZM(PTKE)/(1.+PREDTH1)**2*XCTV*PBLL_O_E*PETHETA & + * (1. - 0.5*PREDR1*(1.+PREDR1)/PD*( 1.+(1.+PREDTH1)*(1.5+PREDR1+PREDTH1)/PD) ) +! +D_M3_WTH_W2TH_O_DDTDZ(:,:,IKB-1)=D_M3_WTH_W2TH_O_DDTDZ(:,:,IKB) +D_M3_WTH_W2TH_O_DDTDZ(:,:,IKE+1)=D_M3_WTH_W2TH_O_DDTDZ(:,:,IKE) +! +END FUNCTION D_M3_WTH_W2TH_O_DDTDZ +!---------------------------------------------------------------------------- +FUNCTION M3_WTH_W2R(PD,PKEFF,PTKE,PBLL_O_E,PEMOIST,PDTDZ) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PKEFF + REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE + REAL, DIMENSION(:,:,:), INTENT(IN) :: PBLL_O_E + REAL, DIMENSION(:,:,:), INTENT(IN) :: PEMOIST + REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTDZ + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_WTH_W2R + INTEGER :: IKB, IKE +! +IKB = 1+JPVEXT_TURB +IKE = SIZE(PD,3)-JPVEXT_TURB + +M3_WTH_W2R(:,:,:) = - XCSHF*PKEFF*0.75*XCTV*PBLL_O_E/MZM(PTKE)*PEMOIST*PDTDZ/PD +! +M3_WTH_W2R(:,:,IKB-1)=M3_WTH_W2R(:,:,IKB) +M3_WTH_W2R(:,:,IKE+1)=M3_WTH_W2R(:,:,IKE) +! +END FUNCTION M3_WTH_W2R +!---------------------------------------------------------------------------- +FUNCTION D_M3_WTH_W2R_O_DDTDZ(PREDTH1,PREDR1,PD,PKEFF,PTKE,PBLL_O_E,PEMOIST) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PKEFF + REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE + REAL, DIMENSION(:,:,:), INTENT(IN) :: PBLL_O_E + REAL, DIMENSION(:,:,:), INTENT(IN) :: PEMOIST + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_WTH_W2R_O_DDTDZ + INTEGER :: IKB, IKE +! +IKB = 1+JPVEXT_TURB +IKE = SIZE(PD,3)-JPVEXT_TURB + +D_M3_WTH_W2R_O_DDTDZ(:,:,:) = - XCSHF*PKEFF*0.75*XCTV*PBLL_O_E/MZM(PTKE)*PEMOIST/PD & + * (1. - PREDTH1*(1.5+PREDTH1+PREDR1)/PD) +! +D_M3_WTH_W2R_O_DDTDZ(:,:,IKB-1)=D_M3_WTH_W2R_O_DDTDZ(:,:,IKB) +D_M3_WTH_W2R_O_DDTDZ(:,:,IKE+1)=D_M3_WTH_W2R_O_DDTDZ(:,:,IKE) +! +END FUNCTION D_M3_WTH_W2R_O_DDTDZ +!---------------------------------------------------------------------------- +FUNCTION M3_WTH_WR2(PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PEMOIST,PDTDZ) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PKEFF + REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE + REAL, DIMENSION(:,:,:), INTENT(IN) :: PSQRT_TKE + REAL, DIMENSION(:,:,:), INTENT(IN) :: PBLL_O_E + REAL, DIMENSION(:,:,:), INTENT(IN) :: PBETA + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS + REAL, DIMENSION(:,:,:), INTENT(IN) :: PEMOIST + REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTDZ + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_WTH_WR2 + INTEGER :: IKB, IKE +! +IKB = 1+JPVEXT_TURB +IKE = SIZE(PD,3)-JPVEXT_TURB + +M3_WTH_WR2(:,:,:) = - XCSHF*PKEFF*0.25*PBLL_O_E*XCTV*PEMOIST**2 & + *MZM(PBETA*PLEPS/(PSQRT_TKE*PTKE))/XCTD*PDTDZ/PD +! +M3_WTH_WR2(:,:,IKB-1)=M3_WTH_WR2(:,:,IKB) +M3_WTH_WR2(:,:,IKE+1)=M3_WTH_WR2(:,:,IKE) +! +END FUNCTION M3_WTH_WR2 +!---------------------------------------------------------------------------- +FUNCTION D_M3_WTH_WR2_O_DDTDZ(PREDTH1,PREDR1,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PEMOIST) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PKEFF + REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE + REAL, DIMENSION(:,:,:), INTENT(IN) :: PSQRT_TKE + REAL, DIMENSION(:,:,:), INTENT(IN) :: PBLL_O_E + REAL, DIMENSION(:,:,:), INTENT(IN) :: PBETA + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS + REAL, DIMENSION(:,:,:), INTENT(IN) :: PEMOIST + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_WTH_WR2_O_DDTDZ + INTEGER :: IKB, IKE +! +IKB = 1+JPVEXT_TURB +IKE = SIZE(PD,3)-JPVEXT_TURB + +D_M3_WTH_WR2_O_DDTDZ(:,:,:) = - XCSHF*PKEFF*0.25*PBLL_O_E*XCTV*PEMOIST**2 & + *MZM(PBETA*PLEPS/(PSQRT_TKE*PTKE))/XCTD/PD & + * (1. - PREDTH1*(1.5+PREDTH1+PREDR1)/PD) +! +D_M3_WTH_WR2_O_DDTDZ(:,:,IKB-1)=D_M3_WTH_WR2_O_DDTDZ(:,:,IKB) +D_M3_WTH_WR2_O_DDTDZ(:,:,IKE+1)=D_M3_WTH_WR2_O_DDTDZ(:,:,IKE) +! +END FUNCTION D_M3_WTH_WR2_O_DDTDZ +!---------------------------------------------------------------------------- +FUNCTION M3_WTH_WTHR(PREDR1,PD,PKEFF,PTKE,PSQRT_TKE,PBETA,PLEPS,PEMOIST) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PKEFF + REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE + REAL, DIMENSION(:,:,:), INTENT(IN) :: PSQRT_TKE + REAL, DIMENSION(:,:,:), INTENT(IN) :: PBETA + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS + REAL, DIMENSION(:,:,:), INTENT(IN) :: PEMOIST + REAL, DIMENSION(SIZE(PREDR1,1),SIZE(PREDR1,2),SIZE(PREDR1,3)) :: M3_WTH_WTHR + INTEGER :: IKB, IKE +! +IKB = 1+JPVEXT_TURB +IKE = SIZE(PD,3)-JPVEXT_TURB + +!M3_WTH_WTHR(:,:,:) = XCSHF*PKEFF*PEMOIST/MZM(PBETA*PTKE*PSQRT_TKE) & +! *0.5*PLEPS/XCTD*(1+PREDR1)/PD +M3_WTH_WTHR(:,:,:) = XCSHF*PKEFF*PEMOIST*MZM(PBETA/PTKE*PSQRT_TKE) & + *0.5*PLEPS/XCTD*(1+PREDR1)/PD +! +M3_WTH_WTHR(:,:,IKB-1)=M3_WTH_WTHR(:,:,IKB) +M3_WTH_WTHR(:,:,IKE+1)=M3_WTH_WTHR(:,:,IKE) +! +END FUNCTION M3_WTH_WTHR +!---------------------------------------------------------------------------- +FUNCTION D_M3_WTH_WTHR_O_DDTDZ(PM3_WTH_WTHR,PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PM3_WTH_WTHR + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PBLL_O_E + REAL, DIMENSION(:,:,:), INTENT(IN) :: PETHETA + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_WTH_WTHR_O_DDTDZ + INTEGER :: IKB, IKE +! +IKB = 1+JPVEXT_TURB +IKE = SIZE(PD,3)-JPVEXT_TURB + +D_M3_WTH_WTHR_O_DDTDZ(:,:,:) = - PM3_WTH_WTHR * (1.5+PREDTH1+PREDR1)/PD*XCTV*PBLL_O_E*PETHETA +! +D_M3_WTH_WTHR_O_DDTDZ(:,:,IKB-1)=D_M3_WTH_WTHR_O_DDTDZ(:,:,IKB) +D_M3_WTH_WTHR_O_DDTDZ(:,:,IKE+1)=D_M3_WTH_WTHR_O_DDTDZ(:,:,IKE) +! +END FUNCTION D_M3_WTH_WTHR_O_DDTDZ +!---------------------------------------------------------------------------- +FUNCTION M3_TH2_W2TH(PREDTH1,PREDR1,PD,PDTDZ,PLM,PLEPS,PTKE) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTDZ + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS + REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_TH2_W2TH + INTEGER :: IKB, IKE +! +IKB = 1+JPVEXT_TURB +IKE = SIZE(PD,3)-JPVEXT_TURB + +M3_TH2_W2TH(:,:,:) = - MZF((1.-0.5*PREDR1*(1.+PREDR1)/PD)/(1.+PREDTH1)*PDTDZ) & + * 1.5*PLM*PLEPS/PTKE*XCTV +! +M3_TH2_W2TH(:,:,IKB-1)=M3_TH2_W2TH(:,:,IKB) +M3_TH2_W2TH(:,:,IKE+1)=M3_TH2_W2TH(:,:,IKE) +! +END FUNCTION M3_TH2_W2TH +!---------------------------------------------------------------------------- +FUNCTION D_M3_TH2_W2TH_O_DDTDZ(PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,OUSERV) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS + REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE + LOGICAL, INTENT(IN) :: OUSERV + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_TH2_W2TH_O_DDTDZ + INTEGER :: IKB, IKE +! +IKB = 1+JPVEXT_TURB +IKE = SIZE(PD,3)-JPVEXT_TURB + +IF (OUSERV) THEN +! D_M3_TH2_W2TH_O_DDTDZ(:,:,:) = - 1.5*PLM*PLEPS/PTKE*XCTV * MZF( & +! (1.-0.5*PREDR1*(1.+PREDR1)/PD)*(1.-(1.5+PREDTH1+PREDR1)*(1.+PREDTH1)/PD ) & +! / (1.+PREDTH1)**2 ) + D_M3_TH2_W2TH_O_DDTDZ(:,:,:) = - 1.5*PLM*PLEPS/PTKE*XCTV * MZF( & + (1.-0.5*PREDR1*(1.+PREDR1)/PD)*(1.-(1.5+PREDTH1+PREDR1)* & + PREDTH1*(1.+PREDTH1)/PD ) / (1.+PREDTH1)**2 ) + +ELSE + D_M3_TH2_W2TH_O_DDTDZ(:,:,:) = - 1.5*PLM*PLEPS/PTKE*XCTV * MZF(1./(1.+PREDTH1)**2) +END IF +! +D_M3_TH2_W2TH_O_DDTDZ(:,:,IKB-1)=D_M3_TH2_W2TH_O_DDTDZ(:,:,IKB) +D_M3_TH2_W2TH_O_DDTDZ(:,:,IKE+1)=D_M3_TH2_W2TH_O_DDTDZ(:,:,IKE) +! +END FUNCTION D_M3_TH2_W2TH_O_DDTDZ +!---------------------------------------------------------------------------- +FUNCTION M3_TH2_WTH2(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS + REAL, DIMENSION(:,:,:), INTENT(IN) :: PSQRT_TKE + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_TH2_WTH2 + INTEGER :: IKB, IKE +! +IKB = 1+JPVEXT_TURB +IKE = SIZE(PD,3)-JPVEXT_TURB + +M3_TH2_WTH2(:,:,:) = PLEPS*0.5/XCTD/PSQRT_TKE & + * MZF( (1.+0.5*PREDTH1+1.5*PREDR1+0.5*PREDR1**2)/PD ) +! +M3_TH2_WTH2(:,:,IKB-1)=M3_TH2_WTH2(:,:,IKB) +M3_TH2_WTH2(:,:,IKE+1)=M3_TH2_WTH2(:,:,IKE) +! +END FUNCTION M3_TH2_WTH2 +!---------------------------------------------------------------------------- +FUNCTION D_M3_TH2_WTH2_O_DDTDZ(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS + REAL, DIMENSION(:,:,:), INTENT(IN) :: PSQRT_TKE + REAL, DIMENSION(:,:,:), INTENT(IN) :: PBLL_O_E + REAL, DIMENSION(:,:,:), INTENT(IN) :: PETHETA + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_TH2_WTH2_O_DDTDZ + INTEGER :: IKB, IKE +! +IKB = 1+JPVEXT_TURB +IKE = SIZE(PD,3)-JPVEXT_TURB + +D_M3_TH2_WTH2_O_DDTDZ(:,:,:) = PLEPS*0.5/XCTD/PSQRT_TKE*XCTV & + * MZF( PBLL_O_E*PETHETA* (0.5/PD & + - (1.5+PREDTH1+PREDR1)*(1.+0.5*PREDTH1+1.5*PREDR1+0.5*PREDR1**2)/PD**2 & + ) ) +! +D_M3_TH2_WTH2_O_DDTDZ(:,:,IKB-1)=D_M3_TH2_WTH2_O_DDTDZ(:,:,IKB) +D_M3_TH2_WTH2_O_DDTDZ(:,:,IKE+1)=D_M3_TH2_WTH2_O_DDTDZ(:,:,IKE) +! +END FUNCTION D_M3_TH2_WTH2_O_DDTDZ +!---------------------------------------------------------------------------- +FUNCTION M3_TH2_W2R(PD,PLM,PLEPS,PTKE,PBLL_O_E,PEMOIST,PDTDZ) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS + REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE + REAL, DIMENSION(:,:,:), INTENT(IN) :: PBLL_O_E + REAL, DIMENSION(:,:,:), INTENT(IN) :: PEMOIST + REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTDZ + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_TH2_W2R + INTEGER :: IKB, IKE +! +IKB = 1+JPVEXT_TURB +IKE = SIZE(PD,3)-JPVEXT_TURB + +M3_TH2_W2R(:,:,:) = 0.75*XCTV**2*MZF(PBLL_O_E*PEMOIST/PD*PDTDZ**2)*PLM*PLEPS/PTKE +! +M3_TH2_W2R(:,:,IKB-1)=M3_TH2_W2R(:,:,IKB) +M3_TH2_W2R(:,:,IKE+1)=M3_TH2_W2R(:,:,IKE) +! +END FUNCTION M3_TH2_W2R +!---------------------------------------------------------------------------- +FUNCTION D_M3_TH2_W2R_O_DDTDZ(PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PEMOIST,PDTDZ) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS + REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE + REAL, DIMENSION(:,:,:), INTENT(IN) :: PBLL_O_E + REAL, DIMENSION(:,:,:), INTENT(IN) :: PEMOIST + REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTDZ + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_TH2_W2R_O_DDTDZ + INTEGER :: IKB, IKE +! +IKB = 1+JPVEXT_TURB +IKE = SIZE(PD,3)-JPVEXT_TURB + +D_M3_TH2_W2R_O_DDTDZ(:,:,:) = 0.75*XCTV**2*PLM*PLEPS/PTKE & + * MZF( PBLL_O_E*PEMOIST/PD*PDTDZ*(2.-PREDTH1*(1.5+PREDTH1+PREDR1)/PD) ) +! +D_M3_TH2_W2R_O_DDTDZ(:,:,IKB-1)=D_M3_TH2_W2R_O_DDTDZ(:,:,IKB) +D_M3_TH2_W2R_O_DDTDZ(:,:,IKE+1)=D_M3_TH2_W2R_O_DDTDZ(:,:,IKE) +! +END FUNCTION D_M3_TH2_W2R_O_DDTDZ +!---------------------------------------------------------------------------- +FUNCTION M3_TH2_WR2(PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS + REAL, DIMENSION(:,:,:), INTENT(IN) :: PSQRT_TKE + REAL, DIMENSION(:,:,:), INTENT(IN) :: PBLL_O_E + REAL, DIMENSION(:,:,:), INTENT(IN) :: PEMOIST + REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTDZ + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_TH2_WR2 + INTEGER :: IKB, IKE +! +IKB = 1+JPVEXT_TURB +IKE = SIZE(PD,3)-JPVEXT_TURB + +M3_TH2_WR2(:,:,:) = 0.25*XCTV**2*MZF((PBLL_O_E*PEMOIST*PDTDZ)**2/PD)*PLEPS/PSQRT_TKE/XCTD +! +M3_TH2_WR2(:,:,IKB-1)=M3_TH2_WR2(:,:,IKB) +M3_TH2_WR2(:,:,IKE+1)=M3_TH2_WR2(:,:,IKE) +! +END FUNCTION M3_TH2_WR2 +!---------------------------------------------------------------------------- +FUNCTION D_M3_TH2_WR2_O_DDTDZ(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS + REAL, DIMENSION(:,:,:), INTENT(IN) :: PSQRT_TKE + REAL, DIMENSION(:,:,:), INTENT(IN) :: PBLL_O_E + REAL, DIMENSION(:,:,:), INTENT(IN) :: PEMOIST + REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTDZ + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_TH2_WR2_O_DDTDZ + INTEGER :: IKB, IKE +! +IKB = 1+JPVEXT_TURB +IKE = SIZE(PD,3)-JPVEXT_TURB + +D_M3_TH2_WR2_O_DDTDZ(:,:,:) = 0.25*XCTV**2*PLEPS/PSQRT_TKE/XCTD & + * MZF( (PBLL_O_E*PEMOIST)**2*PDTDZ/PD*(2.-PREDTH1*(1.5+PREDTH1+PREDR1)/PD) ) +! +D_M3_TH2_WR2_O_DDTDZ(:,:,IKB-1)=D_M3_TH2_WR2_O_DDTDZ(:,:,IKB) +D_M3_TH2_WR2_O_DDTDZ(:,:,IKE+1)=D_M3_TH2_WR2_O_DDTDZ(:,:,IKE) +! +END FUNCTION D_M3_TH2_WR2_O_DDTDZ +!---------------------------------------------------------------------------- +FUNCTION M3_TH2_WTHR(PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS + REAL, DIMENSION(:,:,:), INTENT(IN) :: PSQRT_TKE + REAL, DIMENSION(:,:,:), INTENT(IN) :: PBLL_O_E + REAL, DIMENSION(:,:,:), INTENT(IN) :: PEMOIST + REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTDZ + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_TH2_WTHR + INTEGER :: IKB, IKE +! +IKB = 1+JPVEXT_TURB +IKE = SIZE(PD,3)-JPVEXT_TURB + +M3_TH2_WTHR(:,:,:) = - 0.5*XCTV*PLEPS/PSQRT_TKE/XCTD & + * MZF( PBLL_O_E*PEMOIST*PDTDZ*(1.+PREDR1)/PD ) +! +M3_TH2_WTHR(:,:,IKB-1)=M3_TH2_WTHR(:,:,IKB) +M3_TH2_WTHR(:,:,IKE+1)=M3_TH2_WTHR(:,:,IKE) +! +END FUNCTION M3_TH2_WTHR +!---------------------------------------------------------------------------- +FUNCTION D_M3_TH2_WTHR_O_DDTDZ(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS + REAL, DIMENSION(:,:,:), INTENT(IN) :: PSQRT_TKE + REAL, DIMENSION(:,:,:), INTENT(IN) :: PBLL_O_E + REAL, DIMENSION(:,:,:), INTENT(IN) :: PEMOIST + REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTDZ + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_TH2_WTHR_O_DDTDZ + INTEGER :: IKB, IKE +! +IKB = 1+JPVEXT_TURB +IKE = SIZE(PD,3)-JPVEXT_TURB + +D_M3_TH2_WTHR_O_DDTDZ(:,:,:) = - 0.5*XCTV*PLEPS/PSQRT_TKE/XCTD & + * MZF( PBLL_O_E*PEMOIST*(1.+PREDR1)/PD * (1. -PREDTH1*(1.5+PREDTH1+PREDR1)/PD) ) +! +D_M3_TH2_WTHR_O_DDTDZ(:,:,IKB-1)=D_M3_TH2_WTHR_O_DDTDZ(:,:,IKB) +D_M3_TH2_WTHR_O_DDTDZ(:,:,IKE+1)=D_M3_TH2_WTHR_O_DDTDZ(:,:,IKE) +! +END FUNCTION D_M3_TH2_WTHR_O_DDTDZ +!---------------------------------------------------------------------------- +FUNCTION M3_THR_WTHR(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS + REAL, DIMENSION(:,:,:), INTENT(IN) :: PSQRT_TKE + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_THR_WTHR + INTEGER :: IKB, IKE +! +IKB = 1+JPVEXT_TURB +IKE = SIZE(PD,3)-JPVEXT_TURB + +M3_THR_WTHR(:,:,:) = 0.5*PLEPS/PSQRT_TKE/XCTD & + * MZF( (1.+PREDTH1)*(1.+PREDR1)/PD ) +! +M3_THR_WTHR(:,:,IKB-1)=M3_THR_WTHR(:,:,IKB) +M3_THR_WTHR(:,:,IKE+1)=M3_THR_WTHR(:,:,IKE) +! +END FUNCTION M3_THR_WTHR +!---------------------------------------------------------------------------- +FUNCTION D_M3_THR_WTHR_O_DDTDZ(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS + REAL, DIMENSION(:,:,:), INTENT(IN) :: PSQRT_TKE + REAL, DIMENSION(:,:,:), INTENT(IN) :: PBLL_O_E + REAL, DIMENSION(:,:,:), INTENT(IN) :: PETHETA + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_THR_WTHR_O_DDTDZ + INTEGER :: IKB, IKE +! +IKB = 1+JPVEXT_TURB +IKE = SIZE(PD,3)-JPVEXT_TURB + +D_M3_THR_WTHR_O_DDTDZ(:,:,:) = 0.5*PLEPS/PSQRT_TKE/XCTD * XCTV & + * MZF( PETHETA*PBLL_O_E/PD*(1.+PREDR1)*(1.-(1.+PREDTH1)*(1.5+PREDTH1+PREDR1)/PD) ) +! +D_M3_THR_WTHR_O_DDTDZ(:,:,IKB-1)=D_M3_THR_WTHR_O_DDTDZ(:,:,IKB) +D_M3_THR_WTHR_O_DDTDZ(:,:,IKE+1)=D_M3_THR_WTHR_O_DDTDZ(:,:,IKE) +! +END FUNCTION D_M3_THR_WTHR_O_DDTDZ +!---------------------------------------------------------------------------- +FUNCTION M3_THR_WTH2(PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS + REAL, DIMENSION(:,:,:), INTENT(IN) :: PSQRT_TKE + REAL, DIMENSION(:,:,:), INTENT(IN) :: PBLL_O_E + REAL, DIMENSION(:,:,:), INTENT(IN) :: PETHETA + REAL, DIMENSION(:,:,:), INTENT(IN) :: PDRDZ + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_THR_WTH2 + INTEGER :: IKB, IKE +! +IKB = 1+JPVEXT_TURB +IKE = SIZE(PD,3)-JPVEXT_TURB + +M3_THR_WTH2(:,:,:) = - 0.25*PLEPS/PSQRT_TKE/XCTD*XCTV & + * MZF( (1.+PREDR1)*PBLL_O_E*PETHETA*PDRDZ/PD ) +! +M3_THR_WTH2(:,:,IKB-1)=M3_THR_WTH2(:,:,IKB) +M3_THR_WTH2(:,:,IKE+1)=M3_THR_WTH2(:,:,IKE) +! +END FUNCTION M3_THR_WTH2 +!---------------------------------------------------------------------------- +FUNCTION D_M3_THR_WTH2_O_DDTDZ(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS + REAL, DIMENSION(:,:,:), INTENT(IN) :: PSQRT_TKE + REAL, DIMENSION(:,:,:), INTENT(IN) :: PBLL_O_E + REAL, DIMENSION(:,:,:), INTENT(IN) :: PETHETA + REAL, DIMENSION(:,:,:), INTENT(IN) :: PDRDZ + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_THR_WTH2_O_DDTDZ + INTEGER :: IKB, IKE +! +IKB = 1+JPVEXT_TURB +IKE = SIZE(PD,3)-JPVEXT_TURB + +D_M3_THR_WTH2_O_DDTDZ(:,:,:) = - 0.25*PLEPS/PSQRT_TKE/XCTD*XCTV**2 & + * MZF( -(1.+PREDR1)*(PBLL_O_E*PETHETA/PD)**2*PDRDZ*(1.5+PREDTH1+PREDR1) ) +! +D_M3_THR_WTH2_O_DDTDZ(:,:,IKB-1)=D_M3_THR_WTH2_O_DDTDZ(:,:,IKB) +D_M3_THR_WTH2_O_DDTDZ(:,:,IKE+1)=D_M3_THR_WTH2_O_DDTDZ(:,:,IKE) +! +END FUNCTION D_M3_THR_WTH2_O_DDTDZ +!---------------------------------------------------------------------------- +FUNCTION D_M3_THR_WTH2_O_DDRDZ(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS + REAL, DIMENSION(:,:,:), INTENT(IN) :: PSQRT_TKE + REAL, DIMENSION(:,:,:), INTENT(IN) :: PBLL_O_E + REAL, DIMENSION(:,:,:), INTENT(IN) :: PETHETA + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_THR_WTH2_O_DDRDZ + INTEGER :: IKB, IKE +! +IKB = 1+JPVEXT_TURB +IKE = SIZE(PD,3)-JPVEXT_TURB + +D_M3_THR_WTH2_O_DDRDZ(:,:,:) = - 0.25*PLEPS/PSQRT_TKE/XCTD*XCTV & + * MZF( PBLL_O_E*PETHETA/PD & + *(-(1.+PREDR1)*PREDR1/PD*(1.5+PREDTH1+PREDR1)+(1.+2.*PREDR1)) & + ) +! +D_M3_THR_WTH2_O_DDRDZ(:,:,IKB-1)=D_M3_THR_WTH2_O_DDRDZ(:,:,IKB) +D_M3_THR_WTH2_O_DDRDZ(:,:,IKE+1)=D_M3_THR_WTH2_O_DDRDZ(:,:,IKE) +! +END FUNCTION D_M3_THR_WTH2_O_DDRDZ +!---------------------------------------------------------------------------- +FUNCTION M3_THR_W2TH(PREDR1,PD,PLM,PLEPS,PTKE,PDRDZ) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS + REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE + REAL, DIMENSION(:,:,:), INTENT(IN) :: PDRDZ + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_THR_W2TH + INTEGER :: IKB, IKE +! +IKB = 1+JPVEXT_TURB +IKE = SIZE(PD,3)-JPVEXT_TURB + +M3_THR_W2TH(:,:,:) = - 0.75*PLM*PLEPS/PTKE * XCTV & + * MZF( (1.+PREDR1)*PDRDZ/PD ) +! +M3_THR_W2TH(:,:,IKB-1)=M3_THR_W2TH(:,:,IKB) +M3_THR_W2TH(:,:,IKE+1)=M3_THR_W2TH(:,:,IKE) +! +END FUNCTION M3_THR_W2TH +!---------------------------------------------------------------------------- +FUNCTION D_M3_THR_W2TH_O_DDTDZ(PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PDRDZ,PETHETA) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS + REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE + REAL, DIMENSION(:,:,:), INTENT(IN) :: PBLL_O_E + REAL, DIMENSION(:,:,:), INTENT(IN) :: PDRDZ + REAL, DIMENSION(:,:,:), INTENT(IN) :: PETHETA + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_THR_W2TH_O_DDTDZ + INTEGER :: IKB, IKE +! +IKB = 1+JPVEXT_TURB +IKE = SIZE(PD,3)-JPVEXT_TURB + +D_M3_THR_W2TH_O_DDTDZ(:,:,:) = - 0.75*PLM*PLEPS/PTKE * XCTV**2 & + * MZF( -PETHETA*PBLL_O_E*(1.+PREDR1)*PDRDZ*(1.5+PREDTH1+PREDR1)/PD**2 ) + +! +D_M3_THR_W2TH_O_DDTDZ(:,:,IKB-1)=D_M3_THR_W2TH_O_DDTDZ(:,:,IKB) +D_M3_THR_W2TH_O_DDTDZ(:,:,IKE+1)=D_M3_THR_W2TH_O_DDTDZ(:,:,IKE) +! +END FUNCTION D_M3_THR_W2TH_O_DDTDZ +!---------------------------------------------------------------------------- +FUNCTION D_M3_THR_W2TH_O_DDRDZ(PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS + REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_THR_W2TH_O_DDRDZ + INTEGER :: IKB, IKE +! +IKB = 1+JPVEXT_TURB +IKE = SIZE(PD,3)-JPVEXT_TURB + +D_M3_THR_W2TH_O_DDRDZ(:,:,:) = - 0.75*PLM*PLEPS/PTKE * XCTV & + * MZF( -(1.+PREDR1)*PREDR1*(1.5+PREDTH1+PREDR1)/PD**2 & + +(1.+2.*PREDR1)/PD & + ) + +! +D_M3_THR_W2TH_O_DDRDZ(:,:,IKB-1)=D_M3_THR_W2TH_O_DDRDZ(:,:,IKB) +D_M3_THR_W2TH_O_DDRDZ(:,:,IKE+1)=D_M3_THR_W2TH_O_DDRDZ(:,:,IKE) +! +END FUNCTION D_M3_THR_W2TH_O_DDRDZ +!---------------------------------------------------------------------------- +!---------------------------------------------------------------------------- +!---------------------------------------------------------------------------- +! +FUNCTION PSI3(PREDR1,PREDTH1,PRED2R3,PRED2TH3,PRED2THR3,HTURBDIM,OUSERV) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PRED2TH3 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PRED2R3 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PRED2THR3 + CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! 1DIM or 3DIM turb. scheme + LOGICAL, INTENT(IN) :: OUSERV ! flag to use vapor + REAL, DIMENSION(SIZE(PREDTH1,1),SIZE(PREDTH1,2),SIZE(PREDTH1,3)) :: PSI3 +! +PSI3 = PHI3(PREDR1,PREDTH1,PRED2R3,PRED2TH3,PRED2THR3,HTURBDIM,OUSERV) +! +END FUNCTION PSI3 +!---------------------------------------------------------------------------- +FUNCTION D_PSI3DRDZ_O_DDRDZ(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,OUSERV) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PPSI3 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PRED2R3 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PRED2THR3 + CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! 1DIM or 3DIM turb. scheme + LOGICAL, INTENT(IN) :: OUSERV ! flag to use vapor + REAL, DIMENSION(SIZE(PREDTH1,1),SIZE(PREDTH1,2),SIZE(PREDTH1,3)) :: D_PSI3DRDZ_O_DDRDZ + +D_PSI3DRDZ_O_DDRDZ = D_PHI3DTDZ_O_DDTDZ(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,OUSERV) +! +!C'est ok?! +! +END FUNCTION D_PSI3DRDZ_O_DDRDZ +!---------------------------------------------------------------------------- +FUNCTION D_PSI3DTDZ_O_DDTDZ(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,OUSERV) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PPSI3 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PRED2R3 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PRED2THR3 + CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! 1DIM or 3DIM turb. scheme + LOGICAL, INTENT(IN) :: OUSERV ! flag to use vapor + REAL, DIMENSION(SIZE(PREDTH1,1),SIZE(PREDTH1,2),SIZE(PREDTH1,3)) :: D_PSI3DTDZ_O_DDTDZ +! +D_PSI3DTDZ_O_DDTDZ = D_PHI3DRDZ_O_DDRDZ(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,OUSERV) +! +END FUNCTION D_PSI3DTDZ_O_DDTDZ +!---------------------------------------------------------------------------- +FUNCTION D_PSI3DRDZ2_O_DDRDZ(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,PDRDZ,HTURBDIM,OUSERV) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PPSI3 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PRED2R3 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PRED2THR3 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PDRDZ + CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! 1DIM or 3DIM turb. scheme + LOGICAL, INTENT(IN) :: OUSERV ! flag to use vapor + REAL, DIMENSION(SIZE(PREDTH1,1),SIZE(PREDTH1,2),SIZE(PREDTH1,3)) :: D_PSI3DRDZ2_O_DDRDZ +! +D_PSI3DRDZ2_O_DDRDZ = D_PHI3DTDZ2_O_DDTDZ(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,PDRDZ,HTURBDIM,OUSERV) +! +END FUNCTION D_PSI3DRDZ2_O_DDRDZ +!---------------------------------------------------------------------------- +FUNCTION M3_WR_WR2(PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PBLL_O_E + REAL, DIMENSION(:,:,:), INTENT(IN) :: PEMOIST + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_WR_WR2 +! +M3_WR_WR2 = M3_WTH_WTH2(PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST) +! +END FUNCTION M3_WR_WR2 +!---------------------------------------------------------------------------- +FUNCTION D_M3_WR_WR2_O_DDRDZ(PM3_WR_WR2,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PM3_WR_WR2 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PBLL_O_E + REAL, DIMENSION(:,:,:), INTENT(IN) :: PEMOIST + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_WR_WR2_O_DDRDZ +! +D_M3_WR_WR2_O_DDRDZ = D_M3_WTH_WTH2_O_DDTDZ(PM3_WR_WR2,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST) +! +END FUNCTION D_M3_WR_WR2_O_DDRDZ +!---------------------------------------------------------------------------- +FUNCTION M3_WR_W2R(PREDR1,PREDTH1,PD,PKEFF,PTKE) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PKEFF + REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_WR_W2R +! +M3_WR_W2R = M3_WTH_W2TH(PREDR1,PREDTH1,PD,PKEFF,PTKE) +! +END FUNCTION M3_WR_W2R +!---------------------------------------------------------------------------- +FUNCTION D_M3_WR_W2R_O_DDRDZ(PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST,PKEFF,PTKE) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PBLL_O_E + REAL, DIMENSION(:,:,:), INTENT(IN) :: PEMOIST + REAL, DIMENSION(:,:,:), INTENT(IN) :: PKEFF + REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_WR_W2R_O_DDRDZ +! +D_M3_WR_W2R_O_DDRDZ = D_M3_WTH_W2TH_O_DDTDZ(PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST,PKEFF,PTKE) +! +END FUNCTION D_M3_WR_W2R_O_DDRDZ +!---------------------------------------------------------------------------- +FUNCTION M3_WR_W2TH(PD,PKEFF,PTKE,PBLL_O_E,PETHETA,PDRDZ) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PKEFF + REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE + REAL, DIMENSION(:,:,:), INTENT(IN) :: PBLL_O_E + REAL, DIMENSION(:,:,:), INTENT(IN) :: PETHETA + REAL, DIMENSION(:,:,:), INTENT(IN) :: PDRDZ + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_WR_W2TH +! +M3_WR_W2TH = M3_WTH_W2R(PD,PKEFF,PTKE,PBLL_O_E,PETHETA,PDRDZ) +! +END FUNCTION M3_WR_W2TH +!---------------------------------------------------------------------------- +FUNCTION D_M3_WR_W2TH_O_DDRDZ(PREDR1,PREDTH1,PD,PKEFF,PTKE,PBLL_O_E,PETHETA) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PKEFF + REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE + REAL, DIMENSION(:,:,:), INTENT(IN) :: PBLL_O_E + REAL, DIMENSION(:,:,:), INTENT(IN) :: PETHETA + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_WR_W2TH_O_DDRDZ +! +D_M3_WR_W2TH_O_DDRDZ = D_M3_WTH_W2R_O_DDTDZ(PREDR1,PREDTH1,PD,PKEFF,PTKE,PBLL_O_E,PETHETA) +! +END FUNCTION D_M3_WR_W2TH_O_DDRDZ +!---------------------------------------------------------------------------- +FUNCTION M3_WR_WTH2(PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA,PDRDZ) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PKEFF + REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE + REAL, DIMENSION(:,:,:), INTENT(IN) :: PSQRT_TKE + REAL, DIMENSION(:,:,:), INTENT(IN) :: PBLL_O_E + REAL, DIMENSION(:,:,:), INTENT(IN) :: PBETA + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS + REAL, DIMENSION(:,:,:), INTENT(IN) :: PETHETA + REAL, DIMENSION(:,:,:), INTENT(IN) :: PDRDZ + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_WR_WTH2 +! +M3_WR_WTH2 = M3_WTH_WR2(PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA,PDRDZ) +! +END FUNCTION M3_WR_WTH2 +!---------------------------------------------------------------------------- +FUNCTION D_M3_WR_WTH2_O_DDRDZ(PREDR1,PREDTH1,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PKEFF + REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE + REAL, DIMENSION(:,:,:), INTENT(IN) :: PSQRT_TKE + REAL, DIMENSION(:,:,:), INTENT(IN) :: PBLL_O_E + REAL, DIMENSION(:,:,:), INTENT(IN) :: PBETA + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS + REAL, DIMENSION(:,:,:), INTENT(IN) :: PETHETA + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_WR_WTH2_O_DDRDZ +! +D_M3_WR_WTH2_O_DDRDZ = D_M3_WTH_WR2_O_DDTDZ(PREDR1,PREDTH1,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA) +! +END FUNCTION D_M3_WR_WTH2_O_DDRDZ +!---------------------------------------------------------------------------- +FUNCTION M3_WR_WTHR(PREDTH1,PD,PKEFF,PTKE,PSQRT_TKE,PBETA,PLEPS,PETHETA) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PKEFF + REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE + REAL, DIMENSION(:,:,:), INTENT(IN) :: PSQRT_TKE + REAL, DIMENSION(:,:,:), INTENT(IN) :: PBETA + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS + REAL, DIMENSION(:,:,:), INTENT(IN) :: PETHETA + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_WR_WTHR +! +M3_WR_WTHR = M3_WTH_WTHR(PREDTH1,PD,PKEFF,PTKE,PSQRT_TKE,PBETA,PLEPS,PETHETA) +! +END FUNCTION M3_WR_WTHR +!---------------------------------------------------------------------------- +FUNCTION D_M3_WR_WTHR_O_DDRDZ(PM3_WR_WTHR,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PM3_WR_WTHR + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PBLL_O_E + REAL, DIMENSION(:,:,:), INTENT(IN) :: PEMOIST + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_WR_WTHR_O_DDRDZ +! +D_M3_WR_WTHR_O_DDRDZ = D_M3_WTH_WTHR_O_DDTDZ(PM3_WR_WTHR,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST) +! +END FUNCTION D_M3_WR_WTHR_O_DDRDZ +!---------------------------------------------------------------------------- +FUNCTION M3_R2_W2R(PREDR1,PREDTH1,PD,PDRDZ,PLM,PLEPS,PTKE) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PDRDZ + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS + REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_R2_W2R +! +M3_R2_W2R = M3_TH2_W2TH(PREDR1,PREDTH1,PD,PDRDZ,PLM,PLEPS,PTKE) +! +END FUNCTION M3_R2_W2R +!---------------------------------------------------------------------------- +FUNCTION D_M3_R2_W2R_O_DDRDZ(PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,OUSERV) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS + REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE + LOGICAL, INTENT(IN) :: OUSERV + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_R2_W2R_O_DDRDZ +! +D_M3_R2_W2R_O_DDRDZ = D_M3_TH2_W2TH_O_DDTDZ(PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,OUSERV) +! +END FUNCTION D_M3_R2_W2R_O_DDRDZ +!---------------------------------------------------------------------------- +FUNCTION M3_R2_WR2(PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS + REAL, DIMENSION(:,:,:), INTENT(IN) :: PSQRT_TKE + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_R2_WR2 +! +M3_R2_WR2 = M3_TH2_WTH2(PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE) +! +END FUNCTION M3_R2_WR2 +!---------------------------------------------------------------------------- +FUNCTION D_M3_R2_WR2_O_DDRDZ(PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS + REAL, DIMENSION(:,:,:), INTENT(IN) :: PSQRT_TKE + REAL, DIMENSION(:,:,:), INTENT(IN) :: PBLL_O_E + REAL, DIMENSION(:,:,:), INTENT(IN) :: PEMOIST + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_R2_WR2_O_DDRDZ +! +D_M3_R2_WR2_O_DDRDZ = D_M3_TH2_WTH2_O_DDTDZ(PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) +! +END FUNCTION D_M3_R2_WR2_O_DDRDZ +!---------------------------------------------------------------------------- +FUNCTION M3_R2_W2TH(PD,PLM,PLEPS,PTKE,PBLL_O_E,PETHETA,PDRDZ) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS + REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE + REAL, DIMENSION(:,:,:), INTENT(IN) :: PBLL_O_E + REAL, DIMENSION(:,:,:), INTENT(IN) :: PETHETA + REAL, DIMENSION(:,:,:), INTENT(IN) :: PDRDZ + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_R2_W2TH +! +M3_R2_W2TH = M3_TH2_W2R(PD,PLM,PLEPS,PTKE,PBLL_O_E,PETHETA,PDRDZ) +! +END FUNCTION M3_R2_W2TH +!---------------------------------------------------------------------------- +FUNCTION D_M3_R2_W2TH_O_DDRDZ(PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PETHETA,PDRDZ) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS + REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE + REAL, DIMENSION(:,:,:), INTENT(IN) :: PBLL_O_E + REAL, DIMENSION(:,:,:), INTENT(IN) :: PETHETA + REAL, DIMENSION(:,:,:), INTENT(IN) :: PDRDZ + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_R2_W2TH_O_DDRDZ +! +D_M3_R2_W2TH_O_DDRDZ = D_M3_TH2_W2R_O_DDTDZ(PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PETHETA,PDRDZ) +! +END FUNCTION D_M3_R2_W2TH_O_DDRDZ +!---------------------------------------------------------------------------- +FUNCTION M3_R2_WTH2(PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS + REAL, DIMENSION(:,:,:), INTENT(IN) :: PSQRT_TKE + REAL, DIMENSION(:,:,:), INTENT(IN) :: PBLL_O_E + REAL, DIMENSION(:,:,:), INTENT(IN) :: PETHETA + REAL, DIMENSION(:,:,:), INTENT(IN) :: PDRDZ + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_R2_WTH2 +! +M3_R2_WTH2 = M3_TH2_WR2(PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) +! +END FUNCTION M3_R2_WTH2 +!---------------------------------------------------------------------------- +FUNCTION D_M3_R2_WTH2_O_DDRDZ(PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS + REAL, DIMENSION(:,:,:), INTENT(IN) :: PSQRT_TKE + REAL, DIMENSION(:,:,:), INTENT(IN) :: PBLL_O_E + REAL, DIMENSION(:,:,:), INTENT(IN) :: PETHETA + REAL, DIMENSION(:,:,:), INTENT(IN) :: PDRDZ + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_R2_WTH2_O_DDRDZ +! +D_M3_R2_WTH2_O_DDRDZ = D_M3_TH2_WR2_O_DDTDZ(PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) +! +END FUNCTION D_M3_R2_WTH2_O_DDRDZ +!---------------------------------------------------------------------------- +FUNCTION M3_R2_WTHR(PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS + REAL, DIMENSION(:,:,:), INTENT(IN) :: PSQRT_TKE + REAL, DIMENSION(:,:,:), INTENT(IN) :: PBLL_O_E + REAL, DIMENSION(:,:,:), INTENT(IN) :: PETHETA + REAL, DIMENSION(:,:,:), INTENT(IN) :: PDRDZ + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_R2_WTHR +! +M3_R2_WTHR = M3_TH2_WTHR(PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) +! +END FUNCTION M3_R2_WTHR +!---------------------------------------------------------------------------- +FUNCTION D_M3_R2_WTHR_O_DDRDZ(PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS + REAL, DIMENSION(:,:,:), INTENT(IN) :: PSQRT_TKE + REAL, DIMENSION(:,:,:), INTENT(IN) :: PBLL_O_E + REAL, DIMENSION(:,:,:), INTENT(IN) :: PETHETA + REAL, DIMENSION(:,:,:), INTENT(IN) :: PDRDZ + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_R2_WTHR_O_DDRDZ +! +D_M3_R2_WTHR_O_DDRDZ = D_M3_TH2_WTHR_O_DDTDZ(PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) +! +END FUNCTION D_M3_R2_WTHR_O_DDRDZ +!---------------------------------------------------------------------------- +FUNCTION D_M3_THR_WTHR_O_DDRDZ(PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS + REAL, DIMENSION(:,:,:), INTENT(IN) :: PSQRT_TKE + REAL, DIMENSION(:,:,:), INTENT(IN) :: PBLL_O_E + REAL, DIMENSION(:,:,:), INTENT(IN) :: PEMOIST + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_THR_WTHR_O_DDRDZ +! +D_M3_THR_WTHR_O_DDRDZ = D_M3_THR_WTHR_O_DDTDZ(PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) +! +END FUNCTION D_M3_THR_WTHR_O_DDRDZ +!---------------------------------------------------------------------------- +FUNCTION M3_THR_WR2(PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS + REAL, DIMENSION(:,:,:), INTENT(IN) :: PSQRT_TKE + REAL, DIMENSION(:,:,:), INTENT(IN) :: PBLL_O_E + REAL, DIMENSION(:,:,:), INTENT(IN) :: PEMOIST + REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTDZ + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_THR_WR2 +! +M3_THR_WR2 = M3_THR_WTH2(PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) +! +END FUNCTION M3_THR_WR2 +!---------------------------------------------------------------------------- +FUNCTION D_M3_THR_WR2_O_DDRDZ(PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS + REAL, DIMENSION(:,:,:), INTENT(IN) :: PSQRT_TKE + REAL, DIMENSION(:,:,:), INTENT(IN) :: PBLL_O_E + REAL, DIMENSION(:,:,:), INTENT(IN) :: PEMOIST + REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTDZ + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_THR_WR2_O_DDRDZ +! +D_M3_THR_WR2_O_DDRDZ = D_M3_THR_WTH2_O_DDTDZ(PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) +! +END FUNCTION D_M3_THR_WR2_O_DDRDZ +!---------------------------------------------------------------------------- +FUNCTION D_M3_THR_WR2_O_DDTDZ(PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS + REAL, DIMENSION(:,:,:), INTENT(IN) :: PSQRT_TKE + REAL, DIMENSION(:,:,:), INTENT(IN) :: PBLL_O_E + REAL, DIMENSION(:,:,:), INTENT(IN) :: PEMOIST + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_THR_WR2_O_DDTDZ +! +D_M3_THR_WR2_O_DDTDZ = D_M3_THR_WTH2_O_DDRDZ(PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) +! +END FUNCTION D_M3_THR_WR2_O_DDTDZ +!---------------------------------------------------------------------------- +FUNCTION M3_THR_W2R(PREDTH1,PD,PLM,PLEPS,PTKE,PDTDZ) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS + REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE + REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTDZ + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_THR_W2R +! +M3_THR_W2R = M3_THR_W2TH(PREDTH1,PD,PLM,PLEPS,PTKE,PDTDZ) +! +END FUNCTION M3_THR_W2R +!---------------------------------------------------------------------------- +FUNCTION D_M3_THR_W2R_O_DDRDZ(PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PDTDZ,PEMOIST) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS + REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE + REAL, DIMENSION(:,:,:), INTENT(IN) :: PBLL_O_E + REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTDZ + REAL, DIMENSION(:,:,:), INTENT(IN) :: PEMOIST + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_THR_W2R_O_DDRDZ +! +D_M3_THR_W2R_O_DDRDZ = D_M3_THR_W2TH_O_DDTDZ(PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PDTDZ,PEMOIST) +! +END FUNCTION D_M3_THR_W2R_O_DDRDZ +!---------------------------------------------------------------------------- +FUNCTION D_M3_THR_W2R_O_DDTDZ(PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 + REAL, DIMENSION(:,:,:), INTENT(IN) :: PD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM + REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS + REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE + REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_THR_W2R_O_DDTDZ +! +D_M3_THR_W2R_O_DDTDZ = D_M3_THR_W2TH_O_DDRDZ(PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE) +! +END FUNCTION D_M3_THR_W2R_O_DDTDZ +!---------------------------------------------------------------------------- +! +END MODULE MODE_PRANDTL diff --git a/src/mesonh/turb/mode_sbl.f90 b/src/mesonh/turb/mode_sbl.f90 new file mode 100644 index 000000000..1c5e1da7f --- /dev/null +++ b/src/mesonh/turb/mode_sbl.f90 @@ -0,0 +1,457 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 mode 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ############### + MODULE MODE_SBL +! ############### +! +!!**** *MODE_SBL * - contains Surface Boundary Layer characteristics functions +!! +!! PURPOSE +!! ------- +! +!!** METHOD +!! ------ +!! +!! +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! Businger et al 1971, Wyngaard and Cote 1974 +!! +!! +!! AUTHOR +!! ------ +!! V. Masson * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 13/10/99 +!! V. Masson 06/11/02 optimization and add Businger fonction for TKE +!! V. Masson 01/01/03 use PAULSON_PSIM function +!----------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! +! +INTERFACE BUSINGER_PHIM + MODULE PROCEDURE BUSINGER_PHIM_0D + MODULE PROCEDURE BUSINGER_PHIM_1D + MODULE PROCEDURE BUSINGER_PHIM_2D + MODULE PROCEDURE BUSINGER_PHIM_3D +END INTERFACE +INTERFACE BUSINGER_PHIH + MODULE PROCEDURE BUSINGER_PHIH_0D + MODULE PROCEDURE BUSINGER_PHIH_1D + MODULE PROCEDURE BUSINGER_PHIH_2D + MODULE PROCEDURE BUSINGER_PHIH_3D +END INTERFACE +INTERFACE BUSINGER_PHIE + MODULE PROCEDURE BUSINGER_PHIE_3D +END INTERFACE +INTERFACE PAULSON_PSIM + MODULE PROCEDURE PAULSON_PSIM_0D + MODULE PROCEDURE PAULSON_PSIM_1D + MODULE PROCEDURE PAULSON_PSIM_2D +END INTERFACE +INTERFACE LMO + MODULE PROCEDURE LMO_0D + MODULE PROCEDURE LMO_1D + MODULE PROCEDURE LMO_2D +END INTERFACE +INTERFACE USTAR + MODULE PROCEDURE USTAR_0D + MODULE PROCEDURE USTAR_1D + MODULE PROCEDURE USTAR_2D +END INTERFACE +! +!------------------------------------------------------------------------------- +CONTAINS +!------------------------------------------------------------------------------- +! +FUNCTION BUSINGER_PHIM_3D(PZ_O_LMO) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PZ_O_LMO + REAL, DIMENSION(SIZE(PZ_O_LMO,1), & + SIZE(PZ_O_LMO,2),SIZE(PZ_O_LMO,3)) :: BUSINGER_PHIM_3D +! + WHERE ( PZ_O_LMO(:,:,:) < 0. ) + BUSINGER_PHIM_3D(:,:,:) = (1.-15.*PZ_O_LMO)**(-0.25) + ELSEWHERE + BUSINGER_PHIM_3D(:,:,:) = 1. + 4.7 * PZ_O_LMO + END WHERE +END FUNCTION BUSINGER_PHIM_3D +! +!------------------------------------------------------------------------------- +! +FUNCTION BUSINGER_PHIM_2D(PZ_O_LMO) + REAL, DIMENSION(:,:), INTENT(IN) :: PZ_O_LMO + REAL, DIMENSION(SIZE(PZ_O_LMO,1),SIZE(PZ_O_LMO,2)) :: BUSINGER_PHIM_2D +! + WHERE ( PZ_O_LMO(:,:) < 0. ) + BUSINGER_PHIM_2D(:,:) = (1.-15.*PZ_O_LMO)**(-0.25) + ELSEWHERE + BUSINGER_PHIM_2D(:,:) = 1. + 4.7 * PZ_O_LMO + END WHERE +END FUNCTION BUSINGER_PHIM_2D +! +!------------------------------------------------------------------------------- +! +FUNCTION BUSINGER_PHIM_1D(PZ_O_LMO) + REAL, DIMENSION(:), INTENT(IN) :: PZ_O_LMO + REAL, DIMENSION(SIZE(PZ_O_LMO)) :: BUSINGER_PHIM_1D +! + WHERE ( PZ_O_LMO(:) < 0. ) + BUSINGER_PHIM_1D(:) = (1.-15.*PZ_O_LMO)**(-0.25) + ELSEWHERE + BUSINGER_PHIM_1D(:) = 1. + 4.7 * PZ_O_LMO + END WHERE +END FUNCTION BUSINGER_PHIM_1D +! +!------------------------------------------------------------------------------- +! +FUNCTION BUSINGER_PHIM_0D(PZ_O_LMO) + REAL, INTENT(IN) :: PZ_O_LMO + REAL :: BUSINGER_PHIM_0D +! + IF ( PZ_O_LMO < 0. ) THEN + BUSINGER_PHIM_0D = (1.-15.*PZ_O_LMO)**(-0.25) + ELSE + BUSINGER_PHIM_0D = 1. + 4.7 * PZ_O_LMO + END IF +END FUNCTION BUSINGER_PHIM_0D +! +!------------------------------------------------------------------------------- +!------------------------------------------------------------------------------- +! +FUNCTION BUSINGER_PHIH_3D(PZ_O_LMO) + REAL, DIMENSION(:,:,:), INTENT(IN) :: PZ_O_LMO + REAL, DIMENSION(SIZE(PZ_O_LMO,1), & + SIZE(PZ_O_LMO,2),SIZE(PZ_O_LMO,3)) :: BUSINGER_PHIH_3D +! + WHERE ( PZ_O_LMO(:,:,:) < 0. ) + BUSINGER_PHIH_3D(:,:,:) = 0.74 * (1.-9.*PZ_O_LMO)**(-0.5) + ELSEWHERE + BUSINGER_PHIH_3D(:,:,:) = 0.74 + 4.7 * PZ_O_LMO + END WHERE +END FUNCTION BUSINGER_PHIH_3D +! +!------------------------------------------------------------------------------- +! +FUNCTION BUSINGER_PHIH_2D(PZ_O_LMO) + REAL, DIMENSION(:,:), INTENT(IN) :: PZ_O_LMO + REAL, DIMENSION(SIZE(PZ_O_LMO,1),SIZE(PZ_O_LMO,2)) :: BUSINGER_PHIH_2D +! + WHERE ( PZ_O_LMO(:,:) < 0. ) + BUSINGER_PHIH_2D(:,:) = 0.74 * (1.-9.*PZ_O_LMO)**(-0.5) + ELSEWHERE + BUSINGER_PHIH_2D(:,:) = 0.74 + 4.7 * PZ_O_LMO + END WHERE +END FUNCTION BUSINGER_PHIH_2D +! +!------------------------------------------------------------------------------- +! +FUNCTION BUSINGER_PHIH_1D(PZ_O_LMO) + REAL, DIMENSION(:), INTENT(IN) :: PZ_O_LMO + REAL, DIMENSION(SIZE(PZ_O_LMO)) :: BUSINGER_PHIH_1D +! + WHERE ( PZ_O_LMO(:) < 0. ) + BUSINGER_PHIH_1D(:) = 0.74 * (1.-9.*PZ_O_LMO)**(-0.5) + ELSEWHERE + BUSINGER_PHIH_1D(:) = 0.74 + 4.7 * PZ_O_LMO + END WHERE +END FUNCTION BUSINGER_PHIH_1D +! +!------------------------------------------------------------------------------- +! +FUNCTION BUSINGER_PHIH_0D(PZ_O_LMO) + REAL, INTENT(IN) :: PZ_O_LMO + REAL :: BUSINGER_PHIH_0D +! + IF ( PZ_O_LMO < 0. ) THEN + BUSINGER_PHIH_0D = 0.74 * (1.-9.*PZ_O_LMO)**(-0.5) + ELSE + BUSINGER_PHIH_0D = 0.74 + 4.7 * PZ_O_LMO + END IF +END FUNCTION BUSINGER_PHIH_0D +! +!------------------------------------------------------------------------------- +!------------------------------------------------------------------------------- +! +FUNCTION BUSINGER_PHIE_3D(PZ_O_LMO) + USE MODD_CTURB + REAL, DIMENSION(:,:,:), INTENT(IN) :: PZ_O_LMO + REAL, DIMENSION(SIZE(PZ_O_LMO,1), & + SIZE(PZ_O_LMO,2),SIZE(PZ_O_LMO,3)) :: BUSINGER_PHIE_3D +! + WHERE ( PZ_O_LMO(:,:,:) < 0. ) + BUSINGER_PHIE_3D(:,:,:) = (1.+(-PZ_O_LMO)**(2./3.)/XALPSBL) & + * (1.-15.*PZ_O_LMO)**(0.5) + ELSEWHERE + BUSINGER_PHIE_3D(:,:,:) = 1./(1. + 4.7 * PZ_O_LMO)**2 + END WHERE +END FUNCTION BUSINGER_PHIE_3D +! +!------------------------------------------------------------------------------- +!------------------------------------------------------------------------------- +! +FUNCTION PAULSON_PSIM_2D(PZ_O_LMO) + USE MODD_CST + REAL, DIMENSION(:,:), INTENT(IN) :: PZ_O_LMO + REAL, DIMENSION(SIZE(PZ_O_LMO,1),SIZE(PZ_O_LMO,2)) :: PAULSON_PSIM_2D +! + REAL, DIMENSION(SIZE(PZ_O_LMO,1),SIZE(PZ_O_LMO,2)) :: ZX + + ZX=1. + WHERE ( PZ_O_LMO(:,:) < 0. ) + ZX=(1.-15.*PZ_O_LMO)**(0.25) + PAULSON_PSIM_2D(:,:) = LOG( (1.+ZX**2)*(1+ZX)**2/8. ) - 2.*ATAN(ZX) + XPI/2. + ELSEWHERE + PAULSON_PSIM_2D(:,:) = - 4.7 * PZ_O_LMO + END WHERE +END FUNCTION PAULSON_PSIM_2D +! +!------------------------------------------------------------------------------- +! +FUNCTION PAULSON_PSIM_1D(PZ_O_LMO) + USE MODD_CST + REAL, DIMENSION(:), INTENT(IN) :: PZ_O_LMO + REAL, DIMENSION(SIZE(PZ_O_LMO,1)) :: PAULSON_PSIM_1D +! + REAL, DIMENSION(SIZE(PZ_O_LMO,1)) :: ZX + + ZX=1. + WHERE ( PZ_O_LMO(:) < 0. ) + ZX=(1.-15.*PZ_O_LMO)**(0.25) + PAULSON_PSIM_1D(:) = LOG( (1.+ZX**2)*(1+ZX)**2/8. ) - 2.*ATAN(ZX) + XPI/2. + ELSEWHERE + PAULSON_PSIM_1D(:) = - 4.7 * PZ_O_LMO + END WHERE +END FUNCTION PAULSON_PSIM_1D +! +!------------------------------------------------------------------------------- +! +FUNCTION PAULSON_PSIM_0D(PZ_O_LMO) + USE MODD_CST + REAL, INTENT(IN) :: PZ_O_LMO + REAL :: PAULSON_PSIM_0D +! + REAL :: ZX + + ZX=1. + IF ( PZ_O_LMO < 0. ) THEN + ZX=(1.-15.*PZ_O_LMO)**(0.25) + PAULSON_PSIM_0D = LOG( (1.+ZX**2)*(1+ZX)**2/8. ) - 2.*ATAN(ZX) + XPI/2. + ELSE + PAULSON_PSIM_0D = - 4.7 * PZ_O_LMO + END IF +END FUNCTION PAULSON_PSIM_0D +! +!------------------------------------------------------------------------------- +!------------------------------------------------------------------------------- +! +FUNCTION LMO_2D(PUSTAR,PTHETA,PRV,PSFTH,PSFRV) + USE MODD_CST + USE MODD_PARAMETERS + REAL, DIMENSION(:,:), INTENT(IN) :: PUSTAR + REAL, DIMENSION(:,:), INTENT(IN) :: PTHETA + REAL, DIMENSION(:,:), INTENT(IN) :: PRV + REAL, DIMENSION(:,:), INTENT(IN) :: PSFTH + REAL, DIMENSION(:,:), INTENT(IN) :: PSFRV + REAL, DIMENSION(SIZE(PUSTAR,1),SIZE(PUSTAR,2)) :: LMO_2D +! + REAL, DIMENSION(SIZE(PUSTAR,1),SIZE(PUSTAR,2)) :: ZTHETAV + REAL, DIMENSION(SIZE(PUSTAR,1),SIZE(PUSTAR,2)) :: ZQ0 + REAL :: ZEPS +! +! + ZEPS=(XRV-XRD)/XRD + ZTHETAV(:,:) = PTHETA(:,:) * ( 1. +ZEPS * PRV(:,:)) + ZQ0 (:,:) = PSFTH(:,:) + ZTHETAV(:,:) * ZEPS * PSFRV(:,:) +! + LMO_2D(:,:) = XUNDEF + WHERE ( ZQ0(:,:) /=0. ) & + LMO_2D(:,:) = - MAX(PUSTAR(:,:),1.E-6)**3 & + / ( XKARMAN * XG / ZTHETAV(:,:) *ZQ0(:,:) ) + +END FUNCTION LMO_2D +! +!------------------------------------------------------------------------------- +! +FUNCTION LMO_1D(PUSTAR,PTHETA,PRV,PSFTH,PSFRV) + USE MODD_CST + USE MODD_PARAMETERS + REAL, DIMENSION(:), INTENT(IN) :: PUSTAR + REAL, DIMENSION(:), INTENT(IN) :: PTHETA + REAL, DIMENSION(:), INTENT(IN) :: PRV + REAL, DIMENSION(:), INTENT(IN) :: PSFTH + REAL, DIMENSION(:), INTENT(IN) :: PSFRV + REAL, DIMENSION(SIZE(PUSTAR)) :: LMO_1D +! + REAL, DIMENSION(SIZE(PUSTAR)) :: ZTHETAV + REAL :: ZEPS +! +! + ZEPS=(XRV-XRD)/XRD +! + ZTHETAV(:) = PTHETA(:) * ( 1. +ZEPS * PRV(:)) +! + LMO_1D(:) = XUNDEF + WHERE ( PSFTH(:)/ZTHETAV(:)+ZEPS*PSFRV(:)/=0. ) & + LMO_1D(:) = - MAX(PUSTAR(:),1.E-6)**3 & + / ( XKARMAN * ( XG / ZTHETAV(:) * PSFTH(:) & + + XG * ZEPS * PSFRV(:) ) ) +END FUNCTION LMO_1D +! +!------------------------------------------------------------------------------- +! +FUNCTION LMO_0D(PUSTAR,PTHETA,PRV,PSFTH,PSFRV) + USE MODD_CST + USE MODD_PARAMETERS + REAL, INTENT(IN) :: PUSTAR + REAL, INTENT(IN) :: PTHETA + REAL, INTENT(IN) :: PRV + REAL, INTENT(IN) :: PSFTH + REAL, INTENT(IN) :: PSFRV + REAL :: LMO_0D +! + REAL :: ZTHETAV + REAL :: ZEPS +! +! + ZEPS=(XRV-XRD)/XRD +! +! + ZTHETAV = PTHETA * ( 1. +ZEPS * PRV) +! + LMO_0D = XUNDEF + IF ( PSFTH/ZTHETAV+ZEPS*PSFRV/=0. ) & + LMO_0D = - MAX(PUSTAR,1.E-6)**3 & + / ( XKARMAN * ( XG / ZTHETAV * PSFTH & + + XG * ZEPS * PSFRV ) ) +END FUNCTION LMO_0D +! +!------------------------------------------------------------------------------- +!------------------------------------------------------------------------------- +! +FUNCTION USTAR_2D(PU,PV,PZ,PZ0,PLMO) + USE MODD_CST + USE MODD_PARAMETERS + REAL, DIMENSION(:,:), INTENT(IN) :: PU + REAL, DIMENSION(:,:), INTENT(IN) :: PV + REAL, DIMENSION(:,:), INTENT(IN) :: PZ + REAL, DIMENSION(:,:), INTENT(IN) :: PZ0 + REAL, DIMENSION(:,:), INTENT(IN) :: PLMO + REAL, DIMENSION(SIZE(PU,1),SIZE(PU,2)) :: USTAR_2D + + REAL, DIMENSION(SIZE(PU,1),SIZE(PU,2)) :: ZZ_O_LMO + REAL, DIMENSION(SIZE(PU,1),SIZE(PU,2)) :: ZZ0_O_LMO +! +!* purely unstable case + USTAR_2D(:,:) = 0. + ZZ_O_LMO(:,:) = XUNDEF + ZZ0_O_LMO(:,:) = XUNDEF +! +!* general case + WHERE(ABS(PLMO) > 1.E-20 .AND. PLMO/=XUNDEF) + ZZ_O_LMO = PZ(:,:) / PLMO(:,:) + ZZ0_O_LMO = PZ0(:,:) / PLMO(:,:) + USTAR_2D(:,:) = SQRT( PU(:,:)**2+PV(:,:)**2 ) & + * XKARMAN / ( LOG(PZ(:,:)/PZ0(:,:)) & + - PAULSON_PSIM(ZZ_O_LMO(:,:)) & + + PAULSON_PSIM(ZZ0_O_LMO(:,:)) ) + END WHERE +! +!* purely neutral case + WHERE(PLMO==XUNDEF) + ZZ_O_LMO = 0. + USTAR_2D(:,:) = SQRT( PU(:,:)**2+PV(:,:)**2 ) & + * XKARMAN / LOG(PZ(:,:)/PZ0(:,:)) + END WHERE +! +END FUNCTION USTAR_2D +! +!------------------------------------------------------------------------------- +! +FUNCTION USTAR_1D(PU,PV,PZ,PZ0,PLMO) + USE MODD_CST + USE MODD_PARAMETERS + REAL, DIMENSION(:), INTENT(IN) :: PU + REAL, DIMENSION(:), INTENT(IN) :: PV + REAL, DIMENSION(:), INTENT(IN) :: PZ + REAL, DIMENSION(:), INTENT(IN) :: PZ0 + REAL, DIMENSION(:), INTENT(IN) :: PLMO + REAL, DIMENSION(SIZE(PU)) :: USTAR_1D + + REAL, DIMENSION(SIZE(PU)) :: ZZ_O_LMO + REAL, DIMENSION(SIZE(PU)) :: ZZ0_O_LMO +! +!* purely unstable case + USTAR_1D(:) = 0. + ZZ_O_LMO(:) = XUNDEF + ZZ0_O_LMO(:) = XUNDEF +! +!* general case + WHERE(ABS(PLMO) > 1.E-20 .AND. PLMO/=XUNDEF) + ZZ_O_LMO = PZ(:) / PLMO(:) + ZZ0_O_LMO = PZ0(:) / PLMO(:) + USTAR_1D(:) = SQRT( PU(:)**2+PV(:)**2 ) & + * XKARMAN / ( LOG(PZ(:)/PZ0(:)) & + - PAULSON_PSIM(ZZ_O_LMO(:)) & + + PAULSON_PSIM(ZZ0_O_LMO(:)) ) + END WHERE +! +!* purely neutral case + WHERE(PLMO==XUNDEF) + ZZ_O_LMO = 0. + USTAR_1D(:) = SQRT( PU(:)**2+PV(:)**2 ) & + * XKARMAN / LOG(PZ(:)/PZ0(:)) + END WHERE +! +END FUNCTION USTAR_1D +! +!------------------------------------------------------------------------------- +! +FUNCTION USTAR_0D(PU,PV,PZ,PZ0,PLMO) + USE MODD_CST + USE MODD_PARAMETERS + REAL, INTENT(IN) :: PU + REAL, INTENT(IN) :: PV + REAL, INTENT(IN) :: PZ + REAL, INTENT(IN) :: PZ0 + REAL, INTENT(IN) :: PLMO + REAL :: USTAR_0D +! +!* purely unstable case + USTAR_0D = 0. +! +!* general case + IF ( ABS(PLMO) >= 1.E-20 .AND. PLMO/=XUNDEF) & + USTAR_0D = SQRT( PU**2+PV**2 ) & + * XKARMAN / ( LOG(PZ/PZ0) & + - PAULSON_PSIM(PZ/PLMO) & + + PAULSON_PSIM(PZ0/PLMO)) +! +!* purely neutral case + IF (PLMO==XUNDEF) & + USTAR_0D = SQRT( PU**2+PV**2 ) & + * XKARMAN / LOG(PZ/PZ0) + +END FUNCTION USTAR_0D +! +!------------------------------------------------------------------------------- +! +END MODULE MODE_SBL diff --git a/src/mesonh/turb/modn_turb.f90 b/src/mesonh/turb/modn_turb.f90 new file mode 100644 index 000000000..a7c794abd --- /dev/null +++ b/src/mesonh/turb/modn_turb.f90 @@ -0,0 +1,47 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 modn 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ################### + MODULE MODN_TURB +! ################### +! +!!**** *MODN_TURB* - declaration of namelist NAM_TURB +!! +!! PURPOSE +!! ------- +! The purpose of this module is to specify the namelist NAM_TURB +! which concern the parameters of the turbulence scheme for all models +! +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! V. Masson * Meteo-France * +!! +!! MODIFICATIONS +!! ------------- +!! Original November 2005 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CTURB +! +IMPLICIT NONE +! +NAMELIST/NAM_TURB/XPHI_LIM, XSBL_O_BL, XFTOP_O_FSURF +! +END MODULE MODN_TURB diff --git a/src/mesonh/turb/modn_turb_cloud.f90 b/src/mesonh/turb/modn_turb_cloud.f90 new file mode 100644 index 000000000..f4929a58c --- /dev/null +++ b/src/mesonh/turb/modn_turb_cloud.f90 @@ -0,0 +1,49 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 modn 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ################## + MODULE MODN_TURB_CLOUD +! ################## +! +!!**** *MODN_TURB_CLOUD* - declaration of namelist NAM_TURB_CLOUD +!! +!! PURPOSE +!! ------- +! The purpose of this module is to specify the namelist NAM_TURB_CLOUD +! which concern the parameters of the cloud mixing length for a given model. +! +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_TURB_CLOUD +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! M. Tomasini *Meteo France* +!! +!! MODIFICATIONS +!! ------------- +!! Original September, 2004 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_TURB_CLOUD +! +IMPLICIT NONE +! +NAMELIST/NAM_TURB_CLOUD/NMODEL_CLOUD, CTURBLEN_CLOUD, & + XCOEF_AMPL_SAT, XCEI_MIN, XCEI_MAX +! +END MODULE MODN_TURB_CLOUD diff --git a/src/mesonh/turb/modn_turbn.f90 b/src/mesonh/turb/modn_turbn.f90 new file mode 100644 index 000000000..3e777d2da --- /dev/null +++ b/src/mesonh/turb/modn_turbn.f90 @@ -0,0 +1,167 @@ +!MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ################### + MODULE MODN_TURB_n +! ################### +! +!!**** *MODN_TURB$n* - declaration of namelist NAM_TURBn +!! +!! PURPOSE +!! ------- +! The purpose of this module is to specify the namelist NAM_TURBn +! which concern the parameters of the turbulence scheme for one nested +! model. +! +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_TURB$n : contains declaration of turbulence scheme +!! variables entering by a namelist +!! +!! XIMPL,CTURBLEN,CTURBDIM,LTURB_FLX +!! LTURB_DIAG,LSUBG_COND,LTGT_FLX +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (module MODD_TURBn) +!! +!! AUTHOR +!! ------ +!! J. Cuxart and J. Stein * I.N.M. and Meteo-France * +!! +!! MODIFICATIONS +!! ------------- +!! Original January 9, 1995 +!! J.Cuxart February 15, 1995 add the switches for diagnostic storages +!! J. Stein June 14, 1995 add the subgrid condensation switch +!! J. Stein October, 1999 add the tangential fluxes switch +!! M. Tomasini Jul 05, 2001 add the subgrid autoconversion +!! P. Bechtold Feb 11, 2002 add switch for Sigma_s computation +!! P. Jabouille Apr 4, 2002 add switch for Sigma_s convection +!! V. Masson Nov 13 2002 add switch for SBL lengths +!! D. Ricard May, 2021 add switch for Leonard Terms +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_TURB_n, ONLY: & + XIMPL_n => XIMPL, & + XKEMIN_n => XKEMIN, & + XCEDIS_n => XCEDIS, & + XCADAP_n => XCADAP, & + CTURBLEN_n => CTURBLEN, & + CTURBDIM_n => CTURBDIM, & + LTURB_FLX_n => LTURB_FLX, & + LTURB_DIAG_n => LTURB_DIAG, & + LSUBG_COND_n => LSUBG_COND, & + LSIGMAS_n => LSIGMAS, & + LSIG_CONV_n => LSIG_CONV, & + LRMC01_n => LRMC01, & + CTOM_n => CTOM, & + CSUBG_AUCV_n => CSUBG_AUCV, & + VSIGQSAT_n => VSIGQSAT, & + CSUBG_AUCV_RI_n => CSUBG_AUCV_RI, & + CCONDENS_n => CCONDENS, & + CLAMBDA3_n => CLAMBDA3, & + CSUBG_MF_PDF_n => CSUBG_MF_PDF, & + LHGRAD_n => LHGRAD, & + XCOEFHGRADTHL_n => XCOEFHGRADTHL, & + XCOEFHGRADRM_n => XCOEFHGRADRM, & + XALTHGRAD_n => XALTHGRAD, & + XCLDTHOLD_n => XCLDTHOLD +! +IMPLICIT NONE +! +REAL,SAVE :: XIMPL +REAL,SAVE :: XKEMIN +REAL,SAVE :: XCEDIS +REAL,SAVE :: XCADAP +CHARACTER (LEN=4),SAVE :: CTURBLEN +CHARACTER (LEN=4),SAVE :: CTURBDIM +LOGICAL,SAVE :: LTURB_FLX +LOGICAL,SAVE :: LTURB_DIAG +LOGICAL,SAVE :: LSUBG_COND +LOGICAL,SAVE :: LSIGMAS +LOGICAL,SAVE :: LSIG_CONV +LOGICAL,SAVE :: LRMC01 +CHARACTER (LEN=4),SAVE :: CTOM +CHARACTER (LEN=4),SAVE :: CSUBG_AUCV +CHARACTER (LEN=80),SAVE :: CSUBG_AUCV_RI +CHARACTER (LEN=80),SAVE :: CCONDENS +CHARACTER (LEN=4),SAVE :: CLAMBDA3 +CHARACTER (LEN=80),SAVE :: CSUBG_MF_PDF +REAL,SAVE :: VSIGQSAT +LOGICAL,SAVE :: LHGRAD +REAL,SAVE :: XCOEFHGRADTHL +REAL,SAVE :: XCOEFHGRADRM +REAL,SAVE :: XALTHGRAD +REAL,SAVE :: XCLDTHOLD +! +NAMELIST/NAM_TURBn/XIMPL,CTURBLEN,CTURBDIM,LTURB_FLX,LTURB_DIAG, & + LSUBG_COND,LSIGMAS,LSIG_CONV,LRMC01,CTOM,CSUBG_AUCV,& + XKEMIN,VSIGQSAT,XCEDIS,XCADAP,CSUBG_AUCV_RI,CCONDENS,& + CLAMBDA3,CSUBG_MF_PDF,LHGRAD,XCOEFHGRADTHL, XCOEFHGRADRM, & + XALTHGRAD, XCLDTHOLD + +! +CONTAINS +! +SUBROUTINE INIT_NAM_TURBn + XIMPL = XIMPL_n + XKEMIN = XKEMIN_n + XCEDIS = XCEDIS_n + XCADAP = XCADAP_n + CTURBLEN = CTURBLEN_n + CTURBDIM = CTURBDIM_n + LTURB_FLX = LTURB_FLX_n + LTURB_DIAG = LTURB_DIAG_n + LSUBG_COND = LSUBG_COND_n + LSIGMAS = LSIGMAS_n + LSIG_CONV = LSIG_CONV_n + LRMC01 = LRMC01_n + CTOM = CTOM_n + CSUBG_AUCV = CSUBG_AUCV_n + VSIGQSAT = VSIGQSAT_n + CSUBG_AUCV_RI = CSUBG_AUCV_RI_n + CCONDENS = CCONDENS_n + CLAMBDA3 = CLAMBDA3_n + CSUBG_MF_PDF = CSUBG_MF_PDF_n + LHGRAD = LHGRAD_n + XCOEFHGRADTHL = XCOEFHGRADTHL_n + XCOEFHGRADRM = XCOEFHGRADRM_n + XALTHGRAD = XALTHGRAD_n + XCLDTHOLD = XCLDTHOLD_n +END SUBROUTINE INIT_NAM_TURBn + +SUBROUTINE UPDATE_NAM_TURBn + XIMPL_n = XIMPL + XKEMIN_n = XKEMIN + XCEDIS_n = XCEDIS + XCADAP_n = XCADAP + CTURBLEN_n = CTURBLEN + CTURBDIM_n = CTURBDIM + LTURB_FLX_n = LTURB_FLX + LTURB_DIAG_n = LTURB_DIAG + LSUBG_COND_n = LSUBG_COND + LSIGMAS_n = LSIGMAS + LSIG_CONV_n = LSIG_CONV + LRMC01_n = LRMC01 + CTOM_n = CTOM + CSUBG_AUCV_n = CSUBG_AUCV + VSIGQSAT_n = VSIGQSAT + CSUBG_AUCV_RI_n = CSUBG_AUCV_RI + CCONDENS_n = CCONDENS + CLAMBDA3_n = CLAMBDA3 + CSUBG_MF_PDF_n = CSUBG_MF_PDF + LHGRAD_n = LHGRAD + XCOEFHGRADTHL_n = XCOEFHGRADTHL + XCOEFHGRADRM_n = XCOEFHGRADRM + XALTHGRAD_n = XALTHGRAD + XCLDTHOLD_n = XCLDTHOLD +END SUBROUTINE UPDATE_NAM_TURBn + +END MODULE MODN_TURB_n diff --git a/src/mesonh/turb/prandtl.f90 b/src/mesonh/turb/prandtl.f90 new file mode 100644 index 000000000..fbfe0a762 --- /dev/null +++ b/src/mesonh/turb/prandtl.f90 @@ -0,0 +1,609 @@ +!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ################### + MODULE MODI_PRANDTL +! ################### +! +INTERFACE +! + SUBROUTINE PRANDTL(KKA,KKU,KKL,KRR,KRRI,OTURB_DIAG, & + HTURBDIM, & + TPFILE, & + PDXX,PDYY,PDZZ,PDZX,PDZY, & + PTHVREF,PLOCPEXNM,PATHETA,PAMOIST, & + PLM,PLEPS,PTKEM,PTHLM,PRM,PSVM,PSRCM, & + PREDTH1,PREDR1, & + PRED2TH3, PRED2R3, PRED2THR3, & + PREDS1,PRED2THS3, PRED2RS3, & + PBLL_O_E, & + PETHETA, PEMOIST ) +! +! +USE MODD_IO, ONLY: TFILEDATA +! +INTEGER, INTENT(IN) :: KKA !near ground array index +INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO +INTEGER, INTENT(IN) :: KRR ! number of moist var. +INTEGER, INTENT(IN) :: KRRI ! number of ice var. +! +LOGICAL, INTENT(IN) :: OTURB_DIAG ! switch to write some + ! diagnostic fields in the syncronous FM-file +CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! Kind of turbulence param. +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ,PDZX,PDZY + ! metric coefficients +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! Virtual Potential Temp. + ! of the reference state +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exner at t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA ! coefficients between +REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! s and Thetal and Rnp +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turbulent Mixing length +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! Dissipative length +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM,PTKEM! Conservative Potential + ! Temperature and TKE at t-1 +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Mixing ratios at t-1 + ! with PRM(:,:,:,1) = cons. + ! mixing ratio +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! Scalars at t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM + ! s'r'c/2Sigma_s2 at t-1 multiplied by Lambda_3 +! +! +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PREDTH1 ! Redelsperger number R_theta +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PREDR1 ! Redelsperger number R_q +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRED2TH3 ! Redelsperger number R*2_theta +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRED2R3 ! Redelsperger number R*2_q +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRED2THR3! Redelsperger number R*2_thq +REAL, DIMENSION(:,:,:,:), INTENT(OUT):: PREDS1 ! Redelsperger number R_sv +REAL, DIMENSION(:,:,:,:), INTENT(OUT):: PRED2THS3! Redelsperger number R*2_thsv +REAL, DIMENSION(:,:,:,:), INTENT(OUT):: PRED2RS3 ! Redelsperger number R*2_qsv +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PBLL_O_E! beta*Lk*Leps/tke +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PETHETA ! coefficient E_theta +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PEMOIST ! coefficient E_moist +! +END SUBROUTINE PRANDTL +! +END INTERFACE +! +END MODULE MODI_PRANDTL +! +! +! +! ########################################################### + SUBROUTINE PRANDTL(KKA,KKU,KKL,KRR,KRRI,OTURB_DIAG, & + HTURBDIM, & + TPFILE, & + PDXX,PDYY,PDZZ,PDZX,PDZY, & + PTHVREF,PLOCPEXNM,PATHETA,PAMOIST, & + PLM,PLEPS,PTKEM,PTHLM,PRM,PSVM,PSRCM, & + PREDTH1,PREDR1, & + PRED2TH3, PRED2R3, PRED2THR3, & + PREDS1,PRED2THS3, PRED2RS3, & + PBLL_O_E, & + PETHETA, PEMOIST ) +! ########################################################### +! +! +!!**** *PRANDTL* - routine to compute the Prandtl turbulent numbers +!! +!! PURPOSE +!! ------- +! The purpose of this routine is to compute the Redelsperger +! numbers and then get the turbulent Prandtl and Schmidt numbers: +! * for the heat fluxes - PHI3 = 1/ Prandtl +! * for the moisture fluxes - PSI3 = 1/ Schmidt +! +!!** METHOD +!! ------ +!! The following steps are performed: +!! +!! 1 - default values of 1 are taken for phi3 and psi3 and different masks +!! are defined depending on the presence of turbulence, stratification and +!! humidity. The 1D Redelsperger numbers are computed +!! * ZREDTH1 : (g / THVREF ) (LT**2 / TKE ) ETHETA (D Theta / Dz) +!! * ZREDR1 : (g / THVREF ) (LT**2 / TKE ) EMOIST (D TW / Dz) +!! 2 - 3D Redelsperger numbers are computed only for turbulent +!! grid points where ZREDTH1 or ZREDR1 are > 0. +!! 3 - PHI3 is computed only for turbulent grid points where ZREDTH1 > 0 +!! (turbulent thermally stratified points) +!! 4 - PSI3 is computed only for turbulent grid points where ZREDR1 > 0 +!! (turbulent moist points) +!! +!! +!! EXTERNAL +!! -------- +!! FUNCTIONs ETHETA and EMOIST : +!! allows to compute the coefficients +!! for the turbulent correlation between any variable +!! and the virtual potential temperature, of its correlations +!! with the conservative potential temperature and the humidity +!! conservative variable: +!! ------- ------- ------- +!! A' Thv' = ETHETA A' Thl' + EMOIST A' Rnp' +!! +!! GX_M_M, GY_M_M, GZ_M_M : Cartesian gradient operators +!! MZM : Shuman function (mean operator in the z direction) +!! Module MODI_ETHETA : interface module for ETHETA +!! Module MODI_EMOIST : interface module for EMOIST +!! Module MODI_SHUMAN : interface module for Shuman operators +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST : contains physical constants +!! XG : gravity constant +!! +!! Module MODD_CTURB: contains the set of constants for +!! the turbulence scheme +!! XCTV,XCPR2 : constants for the turbulent prandtl numbers +!! XTKEMIN : minimum value allowed for the TKE +!! +!! Module MODD_PARAMETERS +!! JPVEXT_TURB : number of vertical marginal points +!! +!! REFERENCE +!! --------- +!! Book 2 of documentation (routine PRANDTL) +!! Book 1 of documentation (Chapter: Turbulence) +!! +!! AUTHOR +!! ------ +!! Joan Cuxart * INM and Meteo-France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 18/10/94 +!! Modifications: Feb 14, 1995 (J.Cuxart and J.Stein) +!! Doctorization and Optimization +!! Modifications: March 21, 1995 (J.M. Carriere) +!! Introduction of cloud water +!! Modifications: March 21, 1995 (J. Cuxart and J.Stein) +!! Phi3 and Psi3 at w point + cleaning +!! Modifications: July 2, 1995 (J.Cuxart and Ph.Bougeault) +!! change the value of Phi3 and Psi3 if negative +!! Modifications: Sept 20, 1995 (J. Stein, J. Cuxart, J.L. Redelsperger) +!! remove the Where + use REDTH1+REDR1 for the tests +!! Modifications: October 10, 1995 (J. Cuxart and J.Stein) +!! Psi3 for tPREDS1he scalar variables +!! Modifications: February 27, 1996 (J.Stein) optimization +!! Modifications: June 15, 1996 (P.Jabouille) return to the previous +!! computation of Phi3 and Psi3 +!! Modifications: October 10, 1996 (J. Stein) change the temporal +!! discretization +!! Modifications: May 23, 1997 (J. Stein) bug in 3D Redels number at ground +!! with orography +!! Modifications: Feb 20, 1998 (J. Stein) bug in all the 3D cases due to +!! the use of ZW1 instead of ZW2 +!! Feb 20, 2003 (JP Pinty) Add PFRAC_ICE +!! July 2005 (Tomas, Masson) implicitation of PHI3 and PSI3 +!! October 2009 (G. Tanguy) add ILENCH=LEN(YCOMMENT) after +!! change of YCOMMENT +!! 2012-02 Y. Seity, add possibility to run with reversed +!! vertical levels +!! 2017-09 J.Escobar, use epsilon XMNH_TINY_12 for R*4 +!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +!! JL Redelsperger 03/2021 : adding Ocean case for temperature only +!! -------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_CONF +USE MODD_CTURB +USE MODD_DYN_n, ONLY: LOCEAN +use modd_field, only: tfielddata, TYPEREAL +USE MODD_IO, ONLY: TFILEDATA +USE MODD_PARAMETERS +! +USE MODI_GRADIENT_M +USE MODI_EMOIST +USE MODI_ETHETA +USE MODI_SHUMAN +USE MODE_IO_FIELD_WRITE, only: IO_Field_write +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments +! +INTEGER, INTENT(IN) :: KKA !near ground array index +INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO + +INTEGER, INTENT(IN) :: KRR ! number of moist var. +INTEGER, INTENT(IN) :: KRRI ! number of ice var. +! +LOGICAL, INTENT(IN) :: OTURB_DIAG ! switch to write some + ! diagnostic fields in the syncronous FM-file +CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! Kind of turbulence param. +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ,PDZX,PDZY + ! metric coefficients +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! Virtual Potential Temp. + ! of the reference state +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exner at t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA ! coefficients between +REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! s and Thetal and Rnp +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turbulent Mixing length +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! Dissipative length +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM,PTKEM! Conservative Potential + ! Temperature and TKE at t-1 +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Mixing ratios at t-1 + ! with PRM(:,:,:,1) = cons. + ! mixing ratio +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! Scalars at t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM + ! s'r'c/2Sigma_s2 at t-1 multiplied by Lambda_3 +! +! +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PREDTH1 ! Redelsperger number R_theta +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PREDR1 ! Redelsperger number R_q +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRED2TH3 ! Redelsperger number R*2_theta +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRED2R3 ! Redelsperger number R*2_q +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRED2THR3! Redelsperger number R*2_thq +REAL, DIMENSION(:,:,:,:), INTENT(OUT):: PREDS1 ! Redelsperger number R_s +REAL, DIMENSION(:,:,:,:), INTENT(OUT):: PRED2THS3! Redelsperger number R*2_thsv +REAL, DIMENSION(:,:,:,:), INTENT(OUT):: PRED2RS3 ! Redelsperger number R*2_qsv +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PBLL_O_E! beta*Lk*Leps/tke +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PETHETA ! coefficient E_theta +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PEMOIST ! coefficient E_moist +! +! +! 0.2 declaration of local variables +! +REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: & + ZW1, ZW2 +! working variables +! +INTEGER :: IKB ! vertical index value for the first inner mass point +INTEGER :: IKE ! vertical index value for the last inner mass point +INTEGER:: ISV ! number of scalar variables +INTEGER:: JSV ! loop index for the scalar variables + +INTEGER :: JLOOP +REAL :: ZMINVAL +TYPE(TFIELDDATA) :: TZFIELD +! --------------------------------------------------------------------------- +! +!* 1. DEFAULT VALUES, 1D REDELSPERGER NUMBERS +! ---------------------------------------- +! +IKB = KKA+JPVEXT_TURB*KKL +IKE = KKU-JPVEXT_TURB*KKL +ISV =SIZE(PSVM,4) +! +PETHETA(:,:,:) = MZM( ETHETA(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PATHETA,PSRCM) ) +PEMOIST(:,:,:) = MZM( EMOIST(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PAMOIST,PSRCM) ) +PETHETA(:,:,KKA) = 2.*PETHETA(:,:,IKB) - PETHETA(:,:,IKB+KKL) +PEMOIST(:,:,KKA) = 2.*PEMOIST(:,:,IKB) - PEMOIST(:,:,IKB+KKL) +! +!--------------------------------------------------------------------------- +! +! 1.3 1D Redelsperger numbers +! +IF (LOCEAN) THEN + PBLL_O_E(:,:,:) = MZM(XG *XALPHAOC* PLM(:,:,:) * PLEPS(:,:,:) / PTKEM(:,:,:) ) + PREDTH1(:,:,:)= XCTV*PBLL_O_E(:,:,:) * GZ_M_W(KKA,KKU,KKL,PTHLM,PDZZ) + PREDR1(:,:,:) = 0. +ELSE + PBLL_O_E(:,:,:) = MZM(XG / PTHVREF(:,:,:) * PLM(:,:,:) * PLEPS(:,:,:) / PTKEM(:,:,:) ) + IF (KRR /= 0) THEN ! moist case + PREDTH1(:,:,:)= XCTV*PBLL_O_E(:,:,:) * PETHETA(:,:,:) * & + & GZ_M_W(KKA,KKU,KKL,PTHLM,PDZZ) + PREDR1(:,:,:) = XCTV*PBLL_O_E(:,:,:) * PEMOIST(:,:,:) * & + & GZ_M_W(KKA,KKU,KKL,PRM(:,:,:,1),PDZZ) + ELSE ! dry case + PREDTH1(:,:,:)= XCTV*PBLL_O_E(:,:,:) * GZ_M_W(KKA,KKU,KKL,PTHLM,PDZZ) + PREDR1(:,:,:) = 0. + END IF +! +END IF +! +! 3. Limits on 1D Redelperger numbers +! -------------------------------- +! +ZMINVAL = (1.-1./XPHI_LIM) +! +ZW1 = 1. +ZW2 = 1. +! +WHERE (PREDTH1+PREDR1<-ZMINVAL) + ZW1 = (-ZMINVAL) / (PREDTH1+PREDR1) +END WHERE +! +WHERE (PREDTH1<-ZMINVAL) + ZW2 = (-ZMINVAL) / (PREDTH1) +END WHERE +ZW2 = MIN(ZW1,ZW2) +! +ZW1 = 1. +WHERE (PREDR1<-ZMINVAL) + ZW1 = (-ZMINVAL) / (PREDR1) +END WHERE +ZW1 = MIN(ZW2,ZW1) +! +! +! 3. Modification of Mixing length and dissipative length +! ---------------------------------------------------- +! +PBLL_O_E(:,:,:) = PBLL_O_E(:,:,:) * ZW1(:,:,:) +PREDTH1 (:,:,:) = PREDTH1 (:,:,:) * ZW1(:,:,:) +PREDR1 (:,:,:) = PREDR1 (:,:,:) * ZW1(:,:,:) +! +! 4. Threshold for very small (in absolute value) Redelperger numbers +! ---------------------------------------------------------------- +! +ZW2=SIGN(1.,PREDTH1(:,:,:)) +PREDTH1(:,:,:)= ZW2(:,:,:) * MAX(XMNH_TINY_12, ZW2(:,:,:)*PREDTH1(:,:,:)) +! +IF (.NOT.LOCEAN) THEN + IF (KRR /= 0) THEN ! dry case + ZW2=SIGN(1.,PREDR1(:,:,:)) + PREDR1(:,:,:)= ZW2(:,:,:) * MAX(XMNH_TINY_12, ZW2(:,:,:)*PREDR1(:,:,:)) + END IF +END IF +! +! +!--------------------------------------------------------------------------- +! +! For the scalar variables +DO JSV=1,ISV + PREDS1(:,:,:,JSV)=XCTV*PBLL_O_E(:,:,:)*GZ_M_W(KKA,KKU,KKL,PSVM(:,:,:,JSV),PDZZ) +END DO +! +DO JSV=1,ISV + ZW2=SIGN(1.,PREDS1(:,:,:,JSV)) + PREDS1(:,:,:,JSV)= ZW2(:,:,:) * MAX(XMNH_TINY_12, ZW2(:,:,:)*PREDS1(:,:,:,JSV)) +END DO +! +!--------------------------------------------------------------------------- +! +!* 2. 3D REDELSPERGER NUMBERS +! ------------------------ +! +IF(HTURBDIM=='1DIM') THEN ! 1D case +! +! + PRED2TH3(:,:,:) = PREDTH1(:,:,:)**2 +! + PRED2R3(:,:,:) = PREDR1(:,:,:) **2 +! + PRED2THR3(:,:,:) = PREDTH1(:,:,:) * PREDR1(:,:,:) +! +ELSE IF (L2D) THEN ! 3D case in a 2D model +! + IF (KRR /= 0) THEN ! moist 3D case + PRED2TH3(:,:,:)= PREDTH1(:,:,:)**2+(XCTV*PBLL_O_E(:,:,:)*PETHETA(:,:,:) )**2 * & + MZM( GX_M_M(PTHLM,PDXX,PDZZ,PDZX)**2 ) + PRED2TH3(:,:,IKB)=PRED2TH3(:,:,IKB+KKL) +! + PRED2R3(:,:,:)= PREDR1(:,:,:)**2 + (XCTV*PBLL_O_E(:,:,:)*PEMOIST(:,:,:))**2 * & + MZM( GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX)**2 ) + PRED2R3(:,:,IKB)=PRED2R3(:,:,IKB+KKL) +! + PRED2THR3(:,:,:)= PREDR1(:,:,:) * PREDTH1(:,:,:) + XCTV**2*PBLL_O_E(:,:,:)**2 * & + PEMOIST(:,:,:) * PETHETA(:,:,:) * & + MZM( GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX)* & + GX_M_M(PTHLM,PDXX,PDZZ,PDZX)) + PRED2THR3(:,:,IKB)=PRED2THR3(:,:,IKB+KKL) +! + ELSE ! dry 3D case in a 2D model + PRED2TH3(:,:,:) = PREDTH1(:,:,:)**2 + XCTV**2*PBLL_O_E(:,:,:)**2 * & + MZM( GX_M_M(PTHLM,PDXX,PDZZ,PDZX)**2 ) + PRED2TH3(:,:,IKB)=PRED2TH3(:,:,IKB+KKL) +! + PRED2R3(:,:,:) = 0. +! + PRED2THR3(:,:,:) = 0. +! + END IF +! +ELSE ! 3D case in a 3D model +! + IF (KRR /= 0) THEN ! moist 3D case + PRED2TH3(:,:,:)= PREDTH1(:,:,:)**2 + ( XCTV*PBLL_O_E(:,:,:)*PETHETA(:,:,:) )**2 * & + MZM( GX_M_M(PTHLM,PDXX,PDZZ,PDZX)**2 & + + GY_M_M(PTHLM,PDYY,PDZZ,PDZY)**2 ) + PRED2TH3(:,:,IKB)=PRED2TH3(:,:,IKB+KKL) +! + PRED2R3(:,:,:)= PREDR1(:,:,:)**2 + (XCTV*PBLL_O_E(:,:,:)*PEMOIST(:,:,:))**2 * & + MZM( GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX)**2 + & + GY_M_M(PRM(:,:,:,1),PDYY,PDZZ,PDZY)**2 ) + PRED2R3(:,:,IKB)=PRED2R3(:,:,IKB+KKL) +! + PRED2THR3(:,:,:)= PREDR1(:,:,:) * PREDTH1(:,:,:) + XCTV**2*PBLL_O_E(:,:,:)**2 * & + PEMOIST(:,:,:) * PETHETA(:,:,:) * & + MZM( GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX)* & + GX_M_M(PTHLM,PDXX,PDZZ,PDZX)+ & + GY_M_M(PRM(:,:,:,1),PDYY,PDZZ,PDZY)* & + GY_M_M(PTHLM,PDYY,PDZZ,PDZY) ) + PRED2THR3(:,:,IKB)=PRED2THR3(:,:,IKB+KKL) +! + ELSE ! dry 3D case in a 3D model + PRED2TH3(:,:,:) = PREDTH1(:,:,:)**2 + XCTV**2*PBLL_O_E(:,:,:)**2 * & + MZM( GX_M_M(PTHLM,PDXX,PDZZ,PDZX)**2 & + + GY_M_M(PTHLM,PDYY,PDZZ,PDZY)**2 ) + PRED2TH3(:,:,IKB)=PRED2TH3(:,:,IKB+KKL) +! + PRED2R3(:,:,:) = 0. +! + PRED2THR3(:,:,:) = 0. +! + END IF +! +END IF ! end of the if structure on the turbulence dimensionnality +! +! +!--------------------------------------------------------------------------- +! +! 5. Prandtl numbers for scalars +! --------------------------- +IF(HTURBDIM=='1DIM') THEN +! 1D case + DO JSV=1,ISV + PRED2THS3(:,:,:,JSV) = PREDS1(:,:,:,JSV) * PREDTH1(:,:,:) + IF (KRR /= 0) THEN + PRED2RS3(:,:,:,JSV) = PREDR1(:,:,:) *PREDS1(:,:,:,JSV) + ELSE + PRED2RS3(:,:,:,JSV) = 0. + END IF + ENDDO +! +ELSE IF (L2D) THEN ! 3D case in a 2D model +! + IF (LOCEAN) THEN + IF (KRR /= 0) THEN + ZW1 = MZM((XG *XALPHAOC * PLM * PLEPS / PTKEM)**2 ) *PETHETA + ELSE + ZW1 = MZM((XG *XALPHAOC * PLM * PLEPS / PTKEM)**2) + END IF + ELSE + DO JSV=1,ISV + IF (KRR /= 0) THEN + ZW1 = MZM( (XG / PTHVREF * PLM * PLEPS / PTKEM)**2 ) *PETHETA + ELSE + ZW1 = MZM( (XG / PTHVREF * PLM * PLEPS / PTKEM)**2) + END IF + PRED2THS3(:,:,:,JSV) = PREDTH1(:,:,:) * PREDS1(:,:,:,JSV) + & + ZW1* & + MZM(GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX)* & + GX_M_M(PTHLM,PDXX,PDZZ,PDZX) & + ) +! + IF (KRR /= 0) THEN + PRED2RS3(:,:,:,JSV) = PREDR1(:,:,:) * PREDS1(:,:,:,JSV) + & + ZW1 * PEMOIST * & + MZM(GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX)* & + GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX) & + ) + ELSE + PRED2RS3(:,:,:,JSV) = 0. + END IF + ENDDO + END IF +! +ELSE ! 3D case in a 3D model +! + IF (LOCEAN) THEN + IF (KRR /= 0) THEN + ZW1 = MZM((XG *XALPHAOC * PLM * PLEPS / PTKEM)**2 ) *PETHETA + ELSE + ZW1 = MZM((XG *XALPHAOC * PLM * PLEPS / PTKEM)**2) + END IF + ELSE + DO JSV=1,ISV + IF (KRR /= 0) THEN + ZW1 = MZM( (XG / PTHVREF * PLM * PLEPS / PTKEM)**2 ) *PETHETA + ELSE + ZW1 = MZM( (XG / PTHVREF * PLM * PLEPS / PTKEM)**2) + END IF + PRED2THS3(:,:,:,JSV) = PREDTH1(:,:,:) * PREDS1(:,:,:,JSV) + & + ZW1* & + MZM(GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX)* & + GX_M_M(PTHLM,PDXX,PDZZ,PDZX) & + +GY_M_M(PSVM(:,:,:,JSV),PDYY,PDZZ,PDZY)* & + GY_M_M(PTHLM,PDYY,PDZZ,PDZY) & + ) +! + IF (KRR /= 0) THEN + PRED2RS3(:,:,:,JSV) = PREDR1(:,:,:) * PREDS1(:,:,:,JSV) + & + ZW1 * PEMOIST * & + MZM(GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX)* & + GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX) & + +GY_M_M(PSVM(:,:,:,JSV),PDYY,PDZZ,PDZY)* & + GY_M_M(PRM(:,:,:,1),PDYY,PDZZ,PDZY) & + ) + ELSE + PRED2RS3(:,:,:,JSV) = 0. + END IF + ENDDO + END IF +! +END IF ! end of HTURBDIM if-block +! +! +!--------------------------------------------------------------------------- +! +!* 6. SAVES THE REDELSPERGER NUMBERS +! ------------------------------ +! +IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN + ! + ! stores the RED_TH1 + TZFIELD%CMNHNAME = 'RED_TH1' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'RED_TH1' + TZFIELD%CUNITS = '1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_RED_TH1' + TZFIELD%NGRID = 4 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,PREDTH1) + ! + ! stores the RED_R1 + TZFIELD%CMNHNAME = 'RED_R1' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'RED_R1' + TZFIELD%CUNITS = '1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_RED_R1' + TZFIELD%NGRID = 4 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,PREDR1) + ! + ! stores the RED2_TH3 + TZFIELD%CMNHNAME = 'RED2_TH3' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'RED2_TH3' + TZFIELD%CUNITS = '1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_RED2_TH3' + TZFIELD%NGRID = 4 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,PRED2TH3) + ! + ! stores the RED2_R3 + TZFIELD%CMNHNAME = 'RED2_R3' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'RED2_R3' + TZFIELD%CUNITS = '1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_RED2_R3' + TZFIELD%NGRID = 4 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,PRED2R3) + ! + ! stores the RED2_THR3 + TZFIELD%CMNHNAME = 'RED2_THR3' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'RED2_THR3' + TZFIELD%CUNITS = '1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_RED2_THR3' + TZFIELD%NGRID = 4 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,PRED2THR3) + ! +END IF +! +!--------------------------------------------------------------------------- +! +END SUBROUTINE PRANDTL diff --git a/src/mesonh/turb/rmc01.f90 b/src/mesonh/turb/rmc01.f90 new file mode 100644 index 000000000..cf77c5033 --- /dev/null +++ b/src/mesonh/turb/rmc01.f90 @@ -0,0 +1,260 @@ +!MNH_LIC Copyright 2002-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ################ + MODULE MODI_RMC01 +! ################ +INTERFACE + SUBROUTINE RMC01(HTURBLEN,KKA,KKU,KKL,PZZ,PDXX,PDYY,PDZZ,PDIRCOSZW, & + PSBL_DEPTH, PLMO, PLK, PLEPS ) +! +CHARACTER(LEN=4), INTENT(IN) :: HTURBLEN ! type of mixing length +INTEGER, INTENT(IN) :: KKA !near ground array index +INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! altitude of flux points +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! width of grid mesh (X dir) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! width of grid mesh (Y dir) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! width of vert. layers +REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSZW ! Director Cosinus +REAL, DIMENSION(:,:), INTENT(IN) :: PSBL_DEPTH! SBL depth +REAL, DIMENSION(:,:), INTENT(IN) :: PLMO ! Monin Obuhkov length +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLK ! Mixing length +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLEPS ! Dissipative length + +END SUBROUTINE RMC01 +END INTERFACE +END MODULE MODI_RMC01 +! +! ############################################################## + SUBROUTINE RMC01(HTURBLEN,KKA, KKU, KKL, PZZ, PDXX, PDYY, PDZZ, PDIRCOSZW, & + PSBL_DEPTH, PLMO, PLK, PLEPS ) +! ############################################################## +! +!!**** *RMC01* - +!! +!! PURPOSE +!! ------- +!! This routine modifies the mixing and dissipative length near the SBL. +!! (Redelsperger, Mahe and Carlotti, 2001) +!! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! +!! REFERENCE +!! --------- +!! +!! Book 2 +!! +!! AUTHOR +!! ------ +!! +!! V. Masson - Meteo-France - +!! +!! MODIFICATIONS +!! ------------- +!! Original 14/02/02 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAMETERS +USE MODD_CST +USE MODD_CTURB +! +USE MODE_SBL +! +USE MODI_SHUMAN +! +IMPLICIT NONE +! +!* 0.1 Declaration of arguments +! ------------------------ +! +CHARACTER(LEN=4), INTENT(IN) :: HTURBLEN ! type of mixing length +INTEGER, INTENT(IN) :: KKA !near ground array index +INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! altitude of flux points +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! width of grid mesh (X dir) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! width of grid mesh (Y dir) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! width of vert. layers +REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSZW ! Director Cosinus +REAL, DIMENSION(:,:), INTENT(IN) :: PSBL_DEPTH! SBL depth +REAL, DIMENSION(:,:), INTENT(IN) :: PLMO ! Monin Obuhkov length +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLK ! Mixing length +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLEPS ! Dissipative length +! +!* 0.2 Declaration of local variables +! ------------------------------ +! +INTEGER :: IKB,IKE ! first,last physical level +INTEGER :: IKT ! array size in k direction +INTEGER :: IKTB,IKTE ! start, end of k loops in physical domain +INTEGER :: IIU ! horizontal x boundary +INTEGER :: IJU ! horizontal y boundary +INTEGER :: JK ! loop counter +! +REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) :: ZZZ ! height of mass + ! points above ground +REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) :: ZZ_O_LMO ! height / LMO +REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) :: ZGAM ! factor controling + ! transition betw. + ! SBL and free BL + +REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) :: ZPHIM! MO function + ! for stress +REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) :: ZPHIE! MO function + ! for TKE +REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) :: ZDH ! hor. grid mesh + ! size +REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) :: ZL ! SBL length +REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) :: ZZC ! alt. where + ! turb. is isotr. +!------------------------------------------------------------------------------- +! +!* 1. Initializations +! --------------- +! +! horizontal boundaries +IIU=SIZE(PZZ,1) +IJU=SIZE(PZZ,2) +! +! vertical boundaries +IKB=KKA+JPVEXT_TURB*KKL +IKE=KKU-JPVEXT_TURB*KKL + +IKTB=1+JPVEXT_TURB +IKT=SIZE(PZZ,3) +IKTE=IKT-JPVEXT_TURB +! +! altitude of mass points +ZZZ=MZF(PZZ) +! replace by height of mass points +DO JK=1,IKT + ZZZ(:,:,JK) = ZZZ(:,:,JK) - PZZ(:,:,IKB) +END DO +! fill upper level with physical value +ZZZ(:,:,KKU) = 2.*ZZZ(:,:,KKU-KKL) - ZZZ(:,:,KKU-2*KKL) +! +!------------------------------------------------------------------------------- +! +!* 2. MO quantities +! ------------- +! +! z/LMO +DO JK=1,IKT + WHERE (PLMO(:,:)==XUNDEF) + ZZ_O_LMO(:,:,JK)=0. + ELSEWHERE + ZZ_O_LMO(:,:,JK)=ZZZ(:,:,JK)*PDIRCOSZW(:,:)/PLMO(:,:) + END WHERE +END DO +ZZ_O_LMO(:,:,:) = MAX(ZZ_O_LMO(:,:,:),-10.) +ZZ_O_LMO(:,:,:) = MIN(ZZ_O_LMO(:,:,:), 10.) +! +! +! MO function for stress +ZPHIM(:,:,:) = BUSINGER_PHIM(ZZ_O_LMO) +! +! MO function for TKE +ZPHIE(:,:,:) = BUSINGER_PHIE(ZZ_O_LMO) +! +!------------------------------------------------------------------------------- +SELECT CASE (HTURBLEN) +!------------------------------------------------------------------------------- +! +!* 3. altitude where turbulence is isotropic inside a layer of given width (3D case) +! -------------------------------------------------------------------- +! +! +!* LES subgrid mixing (unresolved eddies all below mesh size) +! For stable cases, the vertical size of eddies is supposed to be given by the +! same law as in the neutral case (i.e. with Phim = 1). +! + CASE ('DELT','DEAR') + ZDH = SQRT(MXF(PDXX)*MYF(PDYY)) + ZDH(IIU,:,:) = ZDH(IIU-1,:,:) + ZDH(:,IJU,:) = ZDH(:,IJU-1,:) + DO JK=1,IKT + ZZC(:,:,JK) = 2.*MIN(ZPHIM(:,:,JK),1.)/XKARMAN & + * MAX( PDZZ(:,:,JK)*PDIRCOSZW(:,:) , ZDH(:,:,JK)/PDIRCOSZW(:,:)/3. ) + END DO +! +!* 4. factor controling the transition between SBL and free isotropic turb. (3D case) +! -------------------------------------------------------------------- +! + ZGAM(:,:,KKA) = 0. + DO JK=IKTB,IKTE + ZGAM(:,:,JK) = 1. - EXP( -3.*(ZZZ(:,:,JK)-ZZZ(:,:,IKB))/(ZZC(:,:,JK)) ) + WHERE (ZGAM(:,:,JK-KKL)>ZGAM(:,:,JK) .OR. ZGAM(:,:,JK-KKL)>0.99 ) ZGAM(:,:,JK) = 1. + END DO + ZGAM(:,:,KKU) = 1. - EXP( -3.*(ZZZ(:,:,KKU)-ZZZ(:,:,IKB))/(ZZC(:,:,KKU)) ) + WHERE (ZGAM(:,:,KKU-KKL)>ZGAM(:,:,KKU) .OR. ZGAM(:,:,KKU-KKL)>0.99 ) ZGAM(:,:,KKU) = 1. +! +! +!------------------------------------------------------------------------------- +! +!* 5. factor controling the transition between SBL and free isotropic turb.(1D case) +! -------------------------------------------------------------------- +! + CASE DEFAULT +!* SBL depth is used + ZGAM(:,:,:) = 1. + ZGAM(:,:,KKA) = 0. + DO JK=IKTB,IKTE + WHERE(PSBL_DEPTH>0.) & + ZGAM(:,:,JK) = TANH( (ZZZ(:,:,JK)-ZZZ(:,:,IKB))/PSBL_DEPTH(:,:) ) + WHERE (ZGAM(:,:,JK-KKL)>0.99 ) ZGAM(:,:,JK) = 1. + END DO + WHERE(PSBL_DEPTH>0.) & + ZGAM(:,:,KKU) = TANH( (ZZZ(:,:,KKU)-ZZZ(:,:,IKB))/PSBL_DEPTH(:,:) ) + WHERE (ZGAM(:,:,KKU-KKL)>0.99 ) ZGAM(:,:,JK) = 1. +! +!------------------------------------------------------------------------------- +END SELECT +!------------------------------------------------------------------------------- +! +!* 6. Modification of the mixing length +! --------------------------------- +! +DO JK=1,IKT + ZL(:,:,JK) = XKARMAN/SQRT(XALPSBL)/XCMFS & + * ZZZ(:,:,JK)*PDIRCOSZW(:,:)/(ZPHIM(:,:,JK)**2*SQRT(ZPHIE(:,:,JK))) +END DO +! +PLK(:,:,:)=(1.-ZGAM)*ZL+ZGAM*PLK +! +PLK(:,:,KKA) = PLK(:,:,IKB) +PLK(:,:,KKU) = PLK(:,:,IKE) +!------------------------------------------------------------------------------- +! +!* 7. Modification of the dissipative length +! -------------------------------------- +! +ZL = ZL * (XALPSBL**(3./2.)*XKARMAN*XCED) & + / (XKARMAN/SQRT(XALPSBL)/XCMFS) +! +WHERE (ZZ_O_LMO<0.) + ZL = ZL/(1.-1.9*ZZ_O_LMO) +ELSEWHERE + ZL = ZL/(1.-0.3*SQRT(ZZ_O_LMO)) +ENDWHERE +! +PLEPS(:,:,:)=(1.-ZGAM)*ZL+ZGAM*PLEPS +! +PLEPS(:,:,KKA) = PLEPS(:,:,IKB) +PLEPS(:,:,KKU ) = PLEPS(:,:,IKE) +!------------------------------------------------------------------------------- +! +END SUBROUTINE RMC01 diff --git a/src/mesonh/turb/sbl_depth.f90 b/src/mesonh/turb/sbl_depth.f90 new file mode 100644 index 000000000..e83d8f784 --- /dev/null +++ b/src/mesonh/turb/sbl_depth.f90 @@ -0,0 +1,145 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +! ################ + MODULE MODI_SBL_DEPTH +! ################ +! +INTERFACE +! + SUBROUTINE SBL_DEPTH(KKB,KKE,PZZ,PFLXU,PFLXV,PWTHV,PLMO,PSBL_DEPTH) +! +INTEGER, INTENT(IN) :: KKB ! first physical level +INTEGER, INTENT(IN) :: KKE ! upper physical level +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! altitude of flux levels +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFLXU ! u'w' +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFLXV ! v'w' +REAL, DIMENSION(:,:,:), INTENT(IN) :: PWTHV ! buoyancy flux +REAL, DIMENSION(:,:), INTENT(IN) :: PLMO ! Monin-Obukhov length +REAL, DIMENSION(:,:), INTENT(INOUT) :: PSBL_DEPTH! boundary layer height +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE SBL_DEPTH +! +END INTERFACE +! +END MODULE MODI_SBL_DEPTH +! +! ################################################################# + SUBROUTINE SBL_DEPTH(KKB,KKE,PZZ,PFLXU,PFLXV,PWTHV,PLMO,PSBL_DEPTH) +! ################################################################# +! +! +!!**** *SBL_DEPTH* - computes SBL depth +!! +!! PURPOSE +!! ------- +! +!!** METHOD +!! ------ +!! +!! SBL is defined as the layer where momentum flux is equal to XSBL_FRAC of its surface value +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! V. Masson * Meteo-France * +!! +!! MODIFICATIONS +!! ------------- +!! Original nov. 2005 +!! 26/02/2020 T.Nagel Correction of SBL depth computation in neutral stratification +!! -------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAMETERS, ONLY : XUNDEF +USE MODD_CTURB, ONLY : XFTOP_O_FSURF, XSBL_O_BL +! +USE MODI_BL_DEPTH_DIAG +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments +! +INTEGER, INTENT(IN) :: KKB ! first physical level +INTEGER, INTENT(IN) :: KKE ! upper physical level +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! altitude of flux levels +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFLXU ! u'w' +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFLXV ! v'w' +REAL, DIMENSION(:,:,:), INTENT(IN) :: PWTHV ! buoyancy flux +REAL, DIMENSION(:,:), INTENT(IN) :: PLMO ! Monin-Obukhov length +REAL, DIMENSION(:,:), INTENT(INOUT) :: PSBL_DEPTH! boundary layer height +! +!------------------------------------------------------------------------------- +! +! 0.2 declaration of local variables +! +! +INTEGER :: JLOOP ! loop counter +REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2)) :: ZQ0 ! surface buoyancy flux +REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2)) :: ZWU ! surface friction u'w' +REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2)) :: ZWV ! surface friction v'w' +REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2)) :: ZUSTAR2 ! surface friction +REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2)) :: ZSBL_DYN ! SBL wih dynamical criteria +REAL, DIMENSION(SIZE(PFLXU,1),SIZE(PFLXU,2),SIZE(PFLXU,3)) :: ZWIND + ! intermediate wind for SBL calculation +REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2)) :: ZSBL_THER! SBL wih thermal criteria +REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2)) :: ZA ! ponderation coefficient +!---------------------------------------------------------------------------- +! +!* initialisations +! +! +ZWU (:,:) = PFLXU(:,:,KKB) +ZWV (:,:) = PFLXV(:,:,KKB) +ZQ0 (:,:) = PWTHV(:,:,KKB) +! +ZUSTAR2(:,:) = SQRT(ZWU**2+ZWV**2) +! +!---------------------------------------------------------------------------- +! +!* BL and SBL diagnosed with friction criteria +! +ZWIND=SQRT(PFLXU**2+PFLXV**2) +ZSBL_DYN = XSBL_O_BL * BL_DEPTH_DIAG(KKB,KKE,ZUSTAR2,PZZ(:,:,KKB),ZWIND,PZZ,XFTOP_O_FSURF) +! +!---------------------------------------------------------------------------- +! +!* BL and SBL diagnosed with buoyancy flux criteria +! +ZSBL_THER= XSBL_O_BL * BL_DEPTH_DIAG(KKB,KKE,ZQ0,PZZ(:,:,KKB),PWTHV,PZZ,XFTOP_O_FSURF) +! +!---------------------------------------------------------------------------- +! +!* SBL depth +! +PSBL_DEPTH = 0. +WHERE (ZSBL_THER> 0. .AND. ZSBL_DYN> 0.) PSBL_DEPTH = MIN(ZSBL_THER(:,:),ZSBL_DYN(:,:)) +WHERE (ZSBL_THER> 0. .AND. ZSBL_DYN==0.) PSBL_DEPTH = ZSBL_THER(:,:) +WHERE (ZSBL_THER==0. .AND. ZSBL_DYN> 0.) PSBL_DEPTH = ZSBL_DYN(:,:) +! +DO JLOOP=1,5 + WHERE (PLMO(:,:)/=XUNDEF .AND. ABS(PLMO(:,:))>=0.01 ) + ZA = TANH(2.*PSBL_DEPTH/PLMO)**2 + PSBL_DEPTH = 0.2 * PSBL_DEPTH + 0.8 * ((1.-ZA) * ZSBL_DYN + ZA * ZSBL_THER ) + END WHERE +END DO +WHERE (ABS(PLMO(:,:))<=0.01 ) PSBL_DEPTH = ZSBL_THER +WHERE (PLMO(:,:)==XUNDEF) PSBL_DEPTH = ZSBL_DYN +! +!---------------------------------------------------------------------------- +END SUBROUTINE SBL_DEPTH diff --git a/src/mesonh/turb/shallow_mf.f90 b/src/mesonh/turb/shallow_mf.f90 new file mode 100644 index 000000000..2ae315ad5 --- /dev/null +++ b/src/mesonh/turb/shallow_mf.f90 @@ -0,0 +1,437 @@ +!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ######spl + MODULE MODI_SHALLOW_MF +! ###################### +! +INTERFACE +! ################################################################# + SUBROUTINE SHALLOW_MF(KKA,KKU,KKL,KRR,KRRL,KRRI, & + HMF_UPDRAFT, HMF_CLOUD, HFRAC_ICE, OMIXUV, & + ONOMIXLG,KSV_LGBEG,KSV_LGEND, & + PIMPL_MF, PTSTEP, & + PDZZ, PZZ, & + PRHODJ, PRHODREF, & + PPABSM, PEXNM, & + PSFTH,PSFRV, & + PTHM,PRM,PUM,PVM,PWM,PTKEM,PSVM, & + PDUDT_MF,PDVDT_MF, & + PDTHLDT_MF,PDRTDT_MF,PDSVDT_MF, & + PSIGMF,PRC_MF,PRI_MF,PCF_MF,PFLXZTHVMF, & + PFLXZTHMF,PFLXZRMF,PFLXZUMF,PFLXZVMF, & + PTHL_UP,PRT_UP,PRV_UP,PRC_UP,PRI_UP, & + PU_UP, PV_UP, PTHV_UP, PW_UP, & + PTHL_DO,PTHV_DO,PRT_DO,PU_DO, PV_DO, & + PFRAC_UP,PEMF,PDETR,PENTR, & + KKLCL,KKETL,KKCTL ) +! ################################################################# +!! +! +!* 1.1 Declaration of Arguments +! +! +INTEGER, INTENT(IN) :: KKA ! near ground array index +INTEGER, INTENT(IN) :: KKU ! uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +INTEGER, INTENT(IN) :: KRR ! number of moist var. +INTEGER, INTENT(IN) :: KRRL ! number of liquid water var. +INTEGER, INTENT(IN) :: KRRI ! number of ice water var. +CHARACTER (LEN=4), INTENT(IN) :: HMF_UPDRAFT ! Type of Mass Flux Scheme + ! 'NONE' if no parameterization +CHARACTER (LEN=4), INTENT(IN) :: HMF_CLOUD ! Type of statistical cloud + ! scheme +CHARACTER(len=1), INTENT(IN) :: HFRAC_ICE ! partition liquid/ice scheme +LOGICAL, INTENT(IN) :: OMIXUV ! True if mixing of momentum +LOGICAL, INTENT(IN) :: ONOMIXLG ! False if mixing of lagrangian tracer +INTEGER, INTENT(IN) :: KSV_LGBEG ! first index of lag. tracer +INTEGER, INTENT(IN) :: KSV_LGEND ! last index of lag. tracer +REAL, INTENT(IN) :: PIMPL_MF ! degre of implicitness +REAL, INTENT(IN) :: PTSTEP ! Dynamical timestep + +REAL, DIMENSION(:,:), INTENT(IN) :: PZZ ! Height of flux point +REAL, DIMENSION(:,:), INTENT(IN) :: PDZZ ! Metric coefficients +REAL, DIMENSION(:,:), INTENT(IN) :: PRHODJ ! dry density * Grid size +REAL, DIMENSION(:,:), INTENT(IN) :: PRHODREF ! dry density of the + ! reference state +REAL, DIMENSION(:,:), INTENT(IN) :: PPABSM ! Pressure at time t-1 +REAL, DIMENSION(:,:), INTENT(IN) :: PEXNM ! Exner function at t-dt + +REAL, DIMENSION(:), INTENT(IN) :: PSFTH,PSFRV ! normal surface fluxes of theta and Rv +REAL, DIMENSION(:,:), INTENT(IN) :: PTHM ! Theta at t-dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRM ! water var. at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PUM,PVM,PWM ! wind components at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PTKEM ! tke at t-dt + +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSVM ! scalar variable a t-dt + +REAL, DIMENSION(:,:), INTENT(OUT):: PDUDT_MF ! tendency of U by massflux scheme +REAL, DIMENSION(:,:), INTENT(OUT):: PDVDT_MF ! tendency of V by massflux scheme +REAL, DIMENSION(:,:), INTENT(OUT):: PDTHLDT_MF ! tendency of thl by massflux scheme +REAL, DIMENSION(:,:), INTENT(OUT):: PDRTDT_MF ! tendency of rt by massflux scheme +REAL, DIMENSION(:,:,:), INTENT(OUT):: PDSVDT_MF ! tendency of Sv by massflux scheme + +REAL, DIMENSION(:,:), INTENT(OUT) :: PSIGMF,PRC_MF,PRI_MF,PCF_MF ! cloud info for the cloud scheme +REAL, DIMENSION(:,:), INTENT(OUT) :: PFLXZTHVMF ! Thermal production for TKE scheme +REAL, DIMENSION(:,:), INTENT(OUT) :: PFLXZTHMF +REAL, DIMENSION(:,:), INTENT(OUT) :: PFLXZRMF +REAL, DIMENSION(:,:), INTENT(OUT) :: PFLXZUMF +REAL, DIMENSION(:,:), INTENT(OUT) :: PFLXZVMF +REAL, DIMENSION(:,:), INTENT(INOUT) :: PTHL_UP ! Thl updraft characteristics +REAL, DIMENSION(:,:), INTENT(INOUT) :: PRT_UP ! Rt updraft characteristics +REAL, DIMENSION(:,:), INTENT(INOUT) :: PRV_UP ! Vapor updraft characteristics +REAL, DIMENSION(:,:), INTENT(INOUT) :: PU_UP ! U wind updraft characteristics +REAL, DIMENSION(:,:), INTENT(INOUT) :: PV_UP ! V wind updraft characteristics + +REAL, DIMENSION(:,:), INTENT(INOUT) :: PTHL_DO ! Thl environment characteristics +REAL, DIMENSION(:,:), INTENT(INOUT) :: PTHV_DO ! Thv environment characteristics +REAL, DIMENSION(:,:), INTENT(INOUT) :: PRT_DO ! Rt environment characteristics +REAL, DIMENSION(:,:), INTENT(INOUT) :: PU_DO ! U wind environment characteristics +REAL, DIMENSION(:,:), INTENT(INOUT) :: PV_DO ! V wind environment characteristics + +REAL, DIMENSION(:,:), INTENT(INOUT) :: PRC_UP ! cloud content updraft characteristics +REAL, DIMENSION(:,:), INTENT(INOUT) :: PRI_UP ! ice content updraft characteristics +REAL, DIMENSION(:,:), INTENT(INOUT) :: PTHV_UP ! Thv updraft characteristics +REAL, DIMENSION(:,:), INTENT(INOUT) :: PW_UP ! vertical speed updraft characteristics +REAL, DIMENSION(:,:), INTENT(INOUT) :: PFRAC_UP ! updraft fraction +REAL, DIMENSION(:,:), INTENT(INOUT) :: PEMF ! updraft mass flux +REAL, DIMENSION(:,:), INTENT(OUT) :: PDETR ! updraft detrainment +REAL, DIMENSION(:,:), INTENT(OUT) :: PENTR ! updraft entrainment +INTEGER,DIMENSION(:), INTENT(OUT) :: KKLCL,KKETL,KKCTL ! level of LCL,ETL and CTL + + +END SUBROUTINE SHALLOW_MF + +END INTERFACE +! +END MODULE MODI_SHALLOW_MF +! ################################################################ + SUBROUTINE SHALLOW_MF(KKA,KKU,KKL,KRR,KRRL,KRRI, & + HMF_UPDRAFT, HMF_CLOUD, HFRAC_ICE, OMIXUV, & + ONOMIXLG,KSV_LGBEG,KSV_LGEND, & + PIMPL_MF, PTSTEP, & + PDZZ, PZZ, & + PRHODJ, PRHODREF, & + PPABSM, PEXNM, & + PSFTH,PSFRV, & + PTHM,PRM,PUM,PVM,PWM,PTKEM,PSVM, & + PDUDT_MF,PDVDT_MF, & + PDTHLDT_MF,PDRTDT_MF,PDSVDT_MF, & + PSIGMF,PRC_MF,PRI_MF,PCF_MF,PFLXZTHVMF, & + PFLXZTHMF,PFLXZRMF,PFLXZUMF,PFLXZVMF, & + PTHL_UP,PRT_UP,PRV_UP,PRC_UP,PRI_UP, & + PU_UP, PV_UP, PTHV_UP, PW_UP, & + PTHL_DO,PTHV_DO,PRT_DO,PU_DO, PV_DO, & + PFRAC_UP,PEMF,PDETR,PENTR, & + KKLCL,KKETL,KKCTL ) + +! ################################################################# +!! +!!**** *SHALLOW_MF* - +!! +!! +!! PURPOSE +!! ------- +!!**** The purpose of this routine is +!! +! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! +!! AUTHOR +!! ------ +!! J.Pergaud +!! +!! MODIFICATIONS +!! ------------- +!! Original +!! V.Masson 09/2010 : optimization +!! S. Riette 18 May 2010 interface changed due to ice correction +!! S.Riette DUAL case +!! S. Riette Jan 2012: support for both order of vertical levels +!! R.Honnert 07/2012 : elemnts of Rio according to Bouteloup +!! R.Honnert 07/2012 : MF gray zone +!! R.Honnert 10/2016 : SURF=gray zone initilisation + EDKF +!! R.Honnert 10/2016 : Update with Arome +!! Philippe Wautelet 28/05/2018: corrected truncated integer division (2/3 -> 2./3.) +!! Q.Rodier 01/2019 : support RM17 mixing length +!! R.Honnert 1/2019 : remove SURF +! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg +! R. Honnert 04/2021: remove HRIO and BOUT schemes +!! -------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_PARAMETERS, ONLY: JPVEXT +USE MODD_PARAM_MFSHALL_n +USE MODD_TURB_n, ONLY: CTURBLEN + +USE MODI_THL_RT_FROM_TH_R_MF +USE MODI_COMPUTE_UPDRAFT +USE MODI_COMPUTE_UPDRAFT_RHCJ10 +USE MODI_COMPUTE_UPDRAFT_RAHA +USE MODI_MF_TURB +USE MODI_MF_TURB_EXPL +USE MODI_MF_TURB_GREYZONE +USE MODI_COMPUTE_MF_CLOUD +USE MODI_COMPUTE_FRAC_ICE +USE MODI_SHUMAN_MF +! +USE MODI_COMPUTE_BL89_ML +USE MODD_GRID_n, ONLY : XDXHAT, XDYHAT +USE MODD_REF_n, ONLY : XTHVREF +USE MODE_MSG +! +IMPLICIT NONE + +!* 0.1 Declaration of Arguments +! +! +! +INTEGER, INTENT(IN) :: KKA ! near ground array index +INTEGER, INTENT(IN) :: KKU ! uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +INTEGER, INTENT(IN) :: KRR ! number of moist var. +INTEGER, INTENT(IN) :: KRRL ! number of liquid water var. +INTEGER, INTENT(IN) :: KRRI ! number of ice water var. +CHARACTER (LEN=4), INTENT(IN) :: HMF_UPDRAFT ! Type of Mass Flux Scheme + ! 'NONE' if no parameterization +CHARACTER (LEN=4), INTENT(IN) :: HMF_CLOUD ! Type of statistical cloud + ! scheme +CHARACTER(len=1), INTENT(IN) :: HFRAC_ICE ! partition liquid/ice scheme +LOGICAL, INTENT(IN) :: OMIXUV ! True if mixing of momentum +LOGICAL, INTENT(IN) :: ONOMIXLG ! False if mixing of lagrangian tracer +INTEGER, INTENT(IN) :: KSV_LGBEG ! first index of lag. tracer +INTEGER, INTENT(IN) :: KSV_LGEND ! last index of lag. tracer +REAL, INTENT(IN) :: PIMPL_MF ! degre of implicitness +REAL, INTENT(IN) :: PTSTEP ! Dynamical timestep + +REAL, DIMENSION(:,:), INTENT(IN) :: PZZ ! Height of flux point +REAL, DIMENSION(:,:), INTENT(IN) :: PDZZ ! Metric coefficients +REAL, DIMENSION(:,:), INTENT(IN) :: PRHODJ ! dry density * Grid size +REAL, DIMENSION(:,:), INTENT(IN) :: PRHODREF ! dry density of the + ! reference state +REAL, DIMENSION(:,:), INTENT(IN) :: PPABSM ! Pressure at time t-1 +REAL, DIMENSION(:,:), INTENT(IN) :: PEXNM ! Exner function at t-dt + +REAL, DIMENSION(:), INTENT(IN) :: PSFTH,PSFRV ! normal surface fluxes of theta and Rv +REAL, DIMENSION(:,:), INTENT(IN) :: PTHM ! Theta at t-dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRM ! water var. at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PUM,PVM,PWM ! wind components at t-dt +REAL, DIMENSION(:,:), INTENT(IN) :: PTKEM ! tke at t-dt + +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSVM ! scalar variable a t-dt + +REAL, DIMENSION(:,:), INTENT(OUT):: PDUDT_MF ! tendency of U by massflux scheme +REAL, DIMENSION(:,:), INTENT(OUT):: PDVDT_MF ! tendency of V by massflux scheme +REAL, DIMENSION(:,:), INTENT(OUT):: PDTHLDT_MF ! tendency of thl by massflux scheme +REAL, DIMENSION(:,:), INTENT(OUT):: PDRTDT_MF ! tendency of rt by massflux scheme +REAL, DIMENSION(:,:,:), INTENT(OUT):: PDSVDT_MF ! tendency of Sv by massflux scheme + +REAL, DIMENSION(:,:), INTENT(OUT) :: PSIGMF,PRC_MF,PRI_MF,PCF_MF ! cloud info for the cloud scheme +REAL, DIMENSION(:,:), INTENT(OUT) :: PFLXZTHVMF ! Thermal production for TKE scheme +REAL, DIMENSION(:,:), INTENT(OUT) :: PFLXZTHMF +REAL, DIMENSION(:,:), INTENT(OUT) :: PFLXZRMF +REAL, DIMENSION(:,:), INTENT(OUT) :: PFLXZUMF +REAL, DIMENSION(:,:), INTENT(OUT) :: PFLXZVMF +REAL, DIMENSION(:,:), INTENT(INOUT) :: PTHL_UP ! Thl updraft characteristics +REAL, DIMENSION(:,:), INTENT(INOUT) :: PRT_UP ! Rt updraft characteristics +REAL, DIMENSION(:,:), INTENT(INOUT) :: PRV_UP ! Vapor updraft characteristics +REAL, DIMENSION(:,:), INTENT(INOUT) :: PU_UP ! U wind updraft characteristics +REAL, DIMENSION(:,:), INTENT(INOUT) :: PV_UP ! V wind updraft characteristics + +REAL, DIMENSION(:,:), INTENT(INOUT) :: PTHL_DO ! Thl environment characteristics +REAL, DIMENSION(:,:), INTENT(INOUT) :: PTHV_DO ! Thv environment characteristics +REAL, DIMENSION(:,:), INTENT(INOUT) :: PRT_DO ! Rt environment characteristics +REAL, DIMENSION(:,:), INTENT(INOUT) :: PU_DO ! U wind environment characteristics +REAL, DIMENSION(:,:), INTENT(INOUT) :: PV_DO ! V wind environment characteristics + +REAL, DIMENSION(:,:), INTENT(INOUT) :: PRC_UP ! cloud content updraft characteristics +REAL, DIMENSION(:,:), INTENT(INOUT) :: PRI_UP ! ice content updraft characteristics +REAL, DIMENSION(:,:), INTENT(INOUT) :: PTHV_UP ! Thv updraft characteristics +REAL, DIMENSION(:,:), INTENT(INOUT) :: PW_UP ! vertical speed updraft characteristics +REAL, DIMENSION(:,:), INTENT(INOUT) :: PFRAC_UP ! updraft fraction +REAL, DIMENSION(:,:), INTENT(INOUT) :: PEMF ! updraft mass flux +REAL, DIMENSION(:,:), INTENT(OUT) :: PDETR ! updraft detrainment +REAL, DIMENSION(:,:), INTENT(OUT) :: PENTR ! updraft entrainment +INTEGER,DIMENSION(:), INTENT(OUT) :: KKLCL,KKETL,KKCTL ! level of LCL,ETL and CTL +! +! 0.2 Declaration of local variables +! +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: & + ZTHLM, & ! + ZRTM, & ! + ZTHVM, & ! + ZEMF_O_RHODREF, & ! entrainment/detrainment + ZBUO_INTEG ! integrated buoyancy +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZFRAC_ICE + +REAL, DIMENSION(SIZE(PSVM,1),SIZE(PSVM,2),SIZE(PSVM,3)) :: & + ZSV_UP,& ! updraft scalar var. + ZSV_DO,& ! updraft scalar var. + ZFLXZSVMF ! Flux +REAL, DIMENSION(SIZE(PTHM,1)) :: ZDEPTH ! Deepness of cloud +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZFRAC_ICE_UP ! liquid/solid fraction in updraft +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZRSAT_UP ! Rsat in updraft +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZSHEAR,ZDUDZ,ZDVDZ !vertical wind shear + +LOGICAL :: GENTR_DETR ! flag to recompute entrainment, detrainment and mass flux +INTEGER :: IKB ! near ground physical index +INTEGER :: IKE ! uppest atmosphere physical index +! pour bouttle et al. +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZG_O_THVREF,PTHVREF +REAL, DIMENSION(SIZE(PTHM,1)) :: ZRESOL_NORM, ZRESOL_GRID,& ! normalized grid + ZLUP, ZPLAW +! Test if the ascent continue, if LCL or ETL is reached +LOGICAL :: GLMIX + INTEGER :: JI,JJ,JK ! loop counter +!------------------------------------------------------------------------ + +!!! 1. Initialisation + +! vertical boundaries +IKB=KKA+KKL*JPVEXT +IKE=KKU-KKL*JPVEXT + +! updraft governing variables +IF (HMF_UPDRAFT == 'EDKF' .OR. HMF_UPDRAFT == 'RHCJ') THEN + PENTR = 1.E20 + PDETR = 1.E20 + PEMF = 1.E20 + ZBUO_INTEG = 1.E20 +ENDIF + +! Thermodynamics functions +ZFRAC_ICE(:,:) = 0. +IF (SIZE(PRM,3).GE.4) THEN + WHERE(PRM(:,:,2)+PRM(:,:,4) > 1.E-20) + ZFRAC_ICE(:,:) = PRM(:,:,4) / (PRM(:,:,2)+PRM(:,:,4)) + ENDWHERE +ENDIF +CALL COMPUTE_FRAC_ICE(HFRAC_ICE,ZFRAC_ICE(:,:),PTHM(:,:)*PEXNM(:,:)) + +! Conservative variables at t-dt +CALL THL_RT_FROM_TH_R_MF(KRR,KRRL,KRRI, & + PTHM, PRM, PEXNM, & + ZTHLM, ZRTM ) + +! Virtual potential temperature at t-dt +ZTHVM(:,:) = PTHM(:,:)*((1.+XRV / XRD *PRM(:,:,1))/(1.+ZRTM(:,:))) + +! +!!! 2. Compute updraft +!!! --------------- +! +IF (HMF_UPDRAFT == 'EDKF') THEN + GENTR_DETR = .TRUE. + CALL COMPUTE_UPDRAFT(KKA,IKB,IKE,KKU,KKL,HFRAC_ICE,GENTR_DETR,OMIXUV,& + ONOMIXLG,KSV_LGBEG,KSV_LGEND, & + PZZ,PDZZ, & + PSFTH,PSFRV,PPABSM,PRHODREF, & + PUM,PVM,PTKEM, & + PTHM,PRM(:,:,1),ZTHLM,ZRTM,PSVM, & + PTHL_UP,PRT_UP,PRV_UP,PRC_UP,PRI_UP, & + PTHV_UP, PW_UP, PU_UP, PV_UP, ZSV_UP, & + PFRAC_UP,ZFRAC_ICE_UP,ZRSAT_UP,PEMF,PDETR,& + PENTR,ZBUO_INTEG,KKLCL,KKETL,KKCTL,ZDEPTH ) +ELSEIF (HMF_UPDRAFT == 'RHCJ') THEN + GENTR_DETR = .TRUE. + CALL COMPUTE_UPDRAFT_RHCJ10(KKA,IKB,IKE,KKU,KKL,HFRAC_ICE,GENTR_DETR,OMIXUV,& + ONOMIXLG,KSV_LGBEG,KSV_LGEND, & + PZZ,PDZZ, & + PSFTH,PSFRV,PPABSM,PRHODREF, & + PUM,PVM,PTKEM, & + PTHM,PRM(:,:,1),ZTHLM,ZRTM,PSVM, & + PTHL_UP,PRT_UP,PRV_UP,PRC_UP,PRI_UP, & + PTHV_UP, PW_UP, PU_UP, PV_UP, ZSV_UP, & + PFRAC_UP,ZFRAC_ICE_UP,ZRSAT_UP,PEMF,PDETR,& + PENTR,ZBUO_INTEG,KKLCL,KKETL,KKCTL,ZDEPTH ) +ELSEIF (HMF_UPDRAFT == 'RAHA') THEN + CALL COMPUTE_UPDRAFT_RAHA(KKA,IKB,IKE,KKU,KKL,HFRAC_ICE, & + GENTR_DETR,OMIXUV, & + ONOMIXLG,KSV_LGBEG,KSV_LGEND, & + PZZ,PDZZ, & + PSFTH,PSFRV, & + PPABSM,PRHODREF,PUM,PVM,PTKEM, & + PEXNM,PTHM,PRM(:,:,1),ZTHLM,ZRTM, & + PSVM,PTHL_UP,PRT_UP, & + PRV_UP,PRC_UP,PRI_UP, PTHV_UP, & + PW_UP, PU_UP, PV_UP, ZSV_UP, & + PFRAC_UP,ZFRAC_ICE_UP,ZRSAT_UP, & + PEMF,PDETR,PENTR, & + ZBUO_INTEG,KKLCL,KKETL,KKCTL, & + ZDEPTH ) +ELSEIF (HMF_UPDRAFT == 'DUAL') THEN + !Updraft characteristics are already computed and received by interface +ELSE + call Print_msg( NVERB_FATAL, 'GEN', 'SHALLOW_MF', 'no updraft model for EDKF: CMF_UPDRAFT='//trim(HMF_UPDRAFT) ) +ENDIF + +!!! 5. Compute diagnostic convective cloud fraction and content +!!! -------------------------------------------------------- +! +CALL COMPUTE_MF_CLOUD(KKA,IKB,IKE,KKU,KKL,KRR,KRRL,KRRI,& + HMF_CLOUD,ZFRAC_ICE, & + PRC_UP,PRI_UP,PEMF, & + PTHL_UP,PRT_UP,PFRAC_UP, & + PTHV_UP,ZFRAC_ICE_UP, & + ZRSAT_UP,PEXNM,ZTHLM,ZRTM, & + PTHM, ZTHVM, PRM, & + PDZZ,PZZ,KKLCL, & + PPABSM,PRHODREF, & + PRC_MF,PRI_MF,PCF_MF,PSIGMF,ZDEPTH) + + +!!! 3. Compute fluxes of conservative variables and their divergence = tendency +!!! ------------------------------------------------------------------------ +! +ZEMF_O_RHODREF=PEMF/PRHODREF +IF(HMF_UPDRAFT == 'EDKF' .OR. HMF_UPDRAFT == 'RHCJ') THEN + IF ( PIMPL_MF > 1.E-10 ) THEN + CALL MF_TURB(KKA, IKB, IKE, KKU, KKL, OMIXUV, & + ONOMIXLG,KSV_LGBEG,KSV_LGEND, & + PIMPL_MF, PTSTEP, & + PDZZ, & + PRHODJ, & + ZTHLM,ZTHVM,ZRTM,PUM,PVM,PSVM, & + PDTHLDT_MF,PDRTDT_MF,PDUDT_MF,PDVDT_MF,PDSVDT_MF, & + ZEMF_O_RHODREF,PTHL_UP,PTHV_UP,PRT_UP,PU_UP,PV_UP,ZSV_UP,& + PFLXZTHMF,PFLXZTHVMF,PFLXZRMF,PFLXZUMF,PFLXZVMF, & + ZFLXZSVMF ) + ELSE + CALL MF_TURB_EXPL(KKA, IKB, IKE, KKU, KKL, OMIXUV, & + PRHODJ, & + ZTHLM,ZTHVM,ZRTM,PUM,PVM, & + PDTHLDT_MF,PDRTDT_MF,PDUDT_MF,PDVDT_MF, & + ZEMF_O_RHODREF,PTHL_UP,PTHV_UP,PRT_UP,PU_UP,PV_UP, & + PFLXZTHMF,PFLXZTHVMF,PFLXZRMF,PFLXZUMF,PFLXZVMF) + ENDIF +ELSE + call Print_msg( NVERB_FATAL, 'GEN', 'SHALLOW_MF', 'no updraft model for EDKF: CMF_UPDRAFT='//trim(HMF_UPDRAFT) ) +END IF + +! security in the case HMF_UPDRAFT = 'DUAL' +! to be modified if 'DUAL' is evolving (momentum mixing for example) +IF( HMF_UPDRAFT == 'DUAL') THEN + ! Now thetav_up from vdfhghtnn is used! + PFLXZTHVMF=0. + ! Yes/No UV mixing! +! PDUDT_MF=0. +! PDVDT_MF=0. +ENDIF +! +END SUBROUTINE SHALLOW_MF diff --git a/src/mesonh/turb/shuman_mf.f90 b/src/mesonh/turb/shuman_mf.f90 new file mode 100644 index 000000000..ce9cde051 --- /dev/null +++ b/src/mesonh/turb/shuman_mf.f90 @@ -0,0 +1,445 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +! ################## + MODULE MODI_SHUMAN_MF +! ################## +! +INTERFACE +! +FUNCTION DZF_MF(KKA,KKU,KKL,PA) RESULT(PDZF) +INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:), INTENT(IN) :: PA ! variable at flux + ! side +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2)) :: PDZF ! result at mass + ! localization +END FUNCTION DZF_MF +! +FUNCTION DZM_MF(KKA,KKU,KKL,PA) RESULT(PDZM) +INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:), INTENT(IN) :: PA ! variable at mass + ! localization +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2)) :: PDZM ! result at flux + ! side +END FUNCTION DZM_MF +! +FUNCTION MZF_MF(KKA,KKU,KKL,PA) RESULT(PMZF) +INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:), INTENT(IN) :: PA ! variable at flux + ! side +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2)) :: PMZF ! result at mass + ! localization +END FUNCTION MZF_MF +! +FUNCTION MZM_MF(KKA,KKU,KKL,PA) RESULT(PMZM) +INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:), INTENT(IN) :: PA ! variable at mass localization +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2)) :: PMZM ! result at flux localization +END FUNCTION MZM_MF +! +FUNCTION GZ_M_W_MF(KKA,KKU,KKL,PY,PDZZ) RESULT(PGZ_M_W) +INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:), INTENT(IN) :: PDZZ ! Metric coefficient d*zz +REAL, DIMENSION(:,:), INTENT(IN) :: PY ! variable at mass localization +REAL, DIMENSION(SIZE(PY,1),SIZE(PY,2)) :: PGZ_M_W ! result at flux side +END FUNCTION GZ_M_W_MF +! +END INTERFACE +! +END MODULE MODI_SHUMAN_MF +! +! ############################### + FUNCTION MZF_MF(KKA,KKU,KKL,PA) RESULT(PMZF) +! ############################### +! +!!**** *MZF* - SHUMAN_MF operator : mean operator in z direction for a +!! variable at a flux side +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute a mean +! along the z direction (K index) for a field PA localized at a z-flux +! point (w point). The result is localized at a mass point. +! +!!** METHOD +!! ------ +!! The result PMZF(:,:,k) is defined by 0.5*(PA(:,:,k)+PA(:,:,k+1)) +!! At k=size(PA,3), PMZF(:,:,k) is defined by PA(:,:,k). +!! +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! NONE +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (SHUMAN_MF operators) +!! Technical specifications Report of The Meso-NH (chapters 3) +!! +!! +!! AUTHOR +!! ------ +!! V. Ducrocq * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 04/07/94 +!! optimisation 20/08/00 J. Escobar +!! S. Riette, Jan 2012: Simplification and suppression of array overflow +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +!* 0.1 Declarations of argument and result +! ------------------------------------ +! +INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:), INTENT(IN) :: PA ! variable at flux + ! side +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2)) :: PMZF ! result at mass + ! localization +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +INTEGER :: JK ! Loop index in z direction +! +! +!------------------------------------------------------------------------------- +! +!* 1. DEFINITION OF MZF +! ------------------ +! +DO JK=2,SIZE(PA,2)-1 + PMZF(:,JK) = 0.5*( PA(:,JK)+PA(:,JK+KKL) ) +END DO +PMZF(:,KKA) = 0.5*( PA(:,KKA)+PA(:,KKA+KKL) ) +PMZF(:,KKU) = PA(:,KKU) +! +!------------------------------------------------------------------------------- +! +END FUNCTION MZF_MF +! ############################### + FUNCTION MZM_MF(KKA,KKU,KKL,PA) RESULT(PMZM) +! ############################### +! +!!**** *MZM* - SHUMAN_MF operator : mean operator in z direction for a +!! mass variable +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute a mean +! along the z direction (K index) for a field PA localized at a mass +! point. The result is localized at a z-flux point (w point). +! +!!** METHOD +!! ------ +!! The result PMZM(:,:,k) is defined by 0.5*(PA(:,:,k)+PA(:,:,k-1)) +!! At k=1, PMZM(:,:,1) is defined by PA(:,:,1). +!! +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! NONE +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (SHUMAN_MF operators) +!! Technical specifications Report of The Meso-NH (chapters 3) +!! +!! +!! AUTHOR +!! ------ +!! V. Ducrocq * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 04/07/94 +!! optimisation 20/08/00 J. Escobar +!! S. Riette, Jan 2012: Simplification and suppression of array overflow +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +!* 0.1 Declarations of argument and result +! ------------------------------------ +! +INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:), INTENT(IN) :: PA ! variable at mass localization +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2)) :: PMZM ! result at flux localization +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +INTEGER :: JK ! Loop index in z direction +! +! +!------------------------------------------------------------------------------- +! +!* 1. DEFINITION OF MZM +! ------------------ +! +DO JK=2,SIZE(PA,2)-1 + PMZM(:,JK) = 0.5*( PA(:,JK)+PA(:,JK-KKL) ) +END DO +PMZM(:,KKA) = PA(:,KKA) +PMZM(:,KKU) = 0.5*( PA(:,KKU)+PA(:,KKU-KKL) ) +! +!------------------------------------------------------------------------------- +! +END FUNCTION MZM_MF +! ############################### + FUNCTION DZF_MF(KKA,KKU,KKL,PA) RESULT(PDZF) +! ############################### +! +!!**** *DZF* - SHUMAN_MF operator : finite difference operator in z direction +!! for a variable at a flux side +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute a finite difference +! along the z direction (K index) for a field PA localized at a z-flux +! point (w point). The result is localized at a mass point. +! +!!** METHOD +!! ------ +!! The result PDZF(:,:,k) is defined by (PA(:,:,k+1)-PA(:,:,k)) +!! At k=size(PA,3), PDZF(:,:,k) is defined by 0. +!! +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! NONE +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (SHUMAN_MF operators) +!! Technical specifications Report of The Meso-NH (chapters 3) +!! +!! +!! AUTHOR +!! ------ +!! V. Ducrocq * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 05/07/94 +!! optimisation 20/08/00 J. Escobar +!! S. Riette, Jan 2012: Simplification and suppression of array overflow +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +!* 0.1 Declarations of argument and result +! ------------------------------------ +! +INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:), INTENT(IN) :: PA ! variable at flux + ! side +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2)) :: PDZF ! result at mass + ! localization +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +INTEGER :: JK ! Loop index in z direction +! +!------------------------------------------------------------------------------- +! +!* 1. DEFINITION OF DZF +! ------------------ +! +DO JK=2,SIZE(PA,2)-1 + PDZF(:,JK) = PA(:,JK+KKL) - PA(:,JK) +END DO +PDZF(:,KKA) = PA(:,KKA+KKL) - PA(:,KKA) +PDZF(:,KKU) = 0. +! +!------------------------------------------------------------------------------- +! +END FUNCTION DZF_MF +! ############################### + FUNCTION DZM_MF(KKA,KKU,KKL,PA) RESULT(PDZM) +! ############################### +! +!!**** *DZM* - SHUMAN_MF operator : finite difference operator in z direction +!! for a variable at a mass localization +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute a finite difference +! along the z direction (K index) for a field PA localized at a mass +! point. The result is localized at a z-flux point (w point). +! +!!** METHOD +!! ------ +!! The result PDZM(:,j,:) is defined by (PA(:,:,k)-PA(:,:,k-1)) +!! At k=1, PDZM(:,:,k) is defined by 0. +!! +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! NONE +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (SHUMAN_MF operators) +!! Technical specifications Report of The Meso-NH (chapters 3) +!! +!! +!! AUTHOR +!! ------ +!! V. Ducrocq * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 05/07/94 +!! optimisation 20/08/00 J. Escobar +!! S. Riette, Jan 2012: Simplification and suppression of array overflow +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +!* 0.1 Declarations of argument and result +! ------------------------------------ +! +INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:), INTENT(IN) :: PA ! variable at mass + ! localization +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2)) :: PDZM ! result at flux + ! side +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +INTEGER :: JK ! Loop index in z direction +! +!------------------------------------------------------------------------------- +! +!* 1. DEFINITION OF DZM +! ------------------ +! +DO JK=2,SIZE(PA,2)-1 + PDZM(:,JK) = PA(:,JK) - PA(:,JK-KKL) +END DO +PDZM(:,KKA) = 0. +PDZM(:,KKU) = PA(:,KKU) - PA(:,KKU-KKL) +! +!------------------------------------------------------------------------------- +! +END FUNCTION DZM_MF + +! ############################### + FUNCTION GZ_M_W_MF(KKA,KKU,KKL,PY,PDZZ) RESULT(PGZ_M_W) +! ############################### +! +!!**** *GZ_M_W * - Compute the gradient along z direction for a +!! variable localized at a mass point +!! +!! PURPOSE +!! ------- +! +!!** METHOD +!! ------ +! dzm(PY) +! PGZ_M_W = ------- +! d*zz +!! +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! NONE +!! +!! REFERENCE +!! --------- +!! +!! +!! AUTHOR +!! ------ +!! S.Riette moving of code previously in compute_mf_cloud code +!! +!! MODIFICATIONS +!! ------------- +!! Original 25 Aug 2011 +!! S. Riette, Jan 2012: Simplification and suppression of array overflow +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +!! +! +!------------------------------------------------------------------------------- +! +IMPLICIT NONE +! +!* 0.1 Declarations of argument and result +! ------------------------------------ +! +INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:), INTENT(IN) :: PDZZ ! Metric coefficient d*zz +REAL, DIMENSION(:,:), INTENT(IN) :: PY ! variable at mass localization +REAL, DIMENSION(SIZE(PY,1),SIZE(PY,2)) :: PGZ_M_W ! result at flux side +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +INTEGER JK +!------------------------------------------------------------------------------- +! +!* 1. COMPUTE THE GRADIENT ALONG Z +! ----------------------------- +! +DO JK=2,SIZE(PY,2)-1 + PGZ_M_W(:,JK) = (PY(:,JK) - PY(:,JK-KKL)) / PDZZ(:,JK) +END DO +PGZ_M_W(:,KKA) = 0. +PGZ_M_W(:,KKU) = (PY(:,KKU) - PY(:,KKU-KKL)) / PDZZ(:,KKU) +! +!------------------------------------------------------------------------------- +! +END FUNCTION GZ_M_W_MF diff --git a/src/mesonh/turb/thl_rt_from_th_r_mf.f90 b/src/mesonh/turb/thl_rt_from_th_r_mf.f90 new file mode 100644 index 000000000..1fb982a1a --- /dev/null +++ b/src/mesonh/turb/thl_rt_from_th_r_mf.f90 @@ -0,0 +1,146 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +! ######spl + MODULE MODI_THL_RT_FROM_TH_R_MF +! ############################### +! +INTERFACE +! ################################################################# + SUBROUTINE THL_RT_FROM_TH_R_MF( KRR,KRRL,KRRI, & + PTH, PR, PEXN, & + PTHL, PRT ) +! ################################################################# +! +! +!* 1.1 Declaration of Arguments +! +! +INTEGER, INTENT(IN) :: KRR ! number of moist var. +INTEGER, INTENT(IN) :: KRRL ! number of liquid water var. +INTEGER, INTENT(IN) :: KRRI ! number of ice water var. + +REAL, DIMENSION(:,:), INTENT(IN) :: PTH ! theta +REAL, DIMENSION(:,:,:), INTENT(IN) :: PR ! water species +REAL, DIMENSION(:,:), INTENT(IN) :: PEXN ! exner function + +REAL, DIMENSION(:,:), INTENT(OUT) :: PTHL ! th_l +REAL, DIMENSION(:,:), INTENT(OUT) :: PRT ! total non precip. water +! +END SUBROUTINE THL_RT_FROM_TH_R_MF + +END INTERFACE +! +END MODULE MODI_THL_RT_FROM_TH_R_MF +! ################################################################# + SUBROUTINE THL_RT_FROM_TH_R_MF( KRR,KRRL,KRRI, & + PTH, PR, PEXN, & + PTHL, PRT ) +! ################################################################# +! +!! +!!**** *THL_RT_FROM_TH_R* - computes the conservative variables THL and RT +!! from TH and the non precipitating water species +!! +!! PURPOSE +!! ------- +!! +!!** METHOD +!! ------ +!! +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! V. Masson * Meteo-France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 20/09/02 +!! Externalisation of computations done in TURB and MF_TURB (Malardel and Pergaud, fev. 2007) +!! V.Masson : Optimization +!! S. Riette 2011 suppression of PLVOCPEXN and PLSOCPEXN +!! +!! -------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments +! +INTEGER, INTENT(IN) :: KRR ! number of moist var. +INTEGER, INTENT(IN) :: KRRL ! number of liquid water var. +INTEGER, INTENT(IN) :: KRRI ! number of ice water var. + +REAL, DIMENSION(:,:), INTENT(IN) :: PTH ! theta +REAL, DIMENSION(:,:,:), INTENT(IN) :: PR ! water species +REAL, DIMENSION(:,:), INTENT(IN) :: PEXN ! exner function + +REAL, DIMENSION(:,:), INTENT(OUT) :: PTHL ! th_l +REAL, DIMENSION(:,:), INTENT(OUT) :: PRT ! total non precip. water +! +!------------------------------------------------------------------------------- +! +! 0.2 declaration of local variables +! + +!---------------------------------------------------------------------------- +REAL, DIMENSION(SIZE(PTH,1),SIZE(PTH,2)) :: ZCP, ZT +REAL, DIMENSION(SIZE(PTH,1),SIZE(PTH,2)) :: ZLVOCPEXN, ZLSOCPEXN +INTEGER :: JRR +!---------------------------------------------------------------------------- +! +! +!temperature +ZT(:,:) = PTH(:,:) * PEXN(:,:) + +!Cp +ZCP=XCPD +IF (KRR > 0) ZCP(:,:) = ZCP(:,:) + XCPV * PR(:,:,1) +DO JRR = 2,1+KRRL ! loop on the liquid components + ZCP(:,:) = ZCP(:,:) + XCL * PR(:,:,JRR) +END DO +DO JRR = 2+KRRL,1+KRRL+KRRI ! loop on the solid components + ZCP(:,:) = ZCP(:,:) + XCI * PR(:,:,JRR) +END DO + +IF ( KRRL >= 1 ) THEN + IF ( KRRI >= 1 ) THEN + !ZLVOCPEXN and ZLSOCPEXN + ZLVOCPEXN(:,:)=(XLVTT + (XCPV-XCL) * (ZT(:,:)-XTT) ) / ZCP(:,:) / PEXN(:,:) + ZLSOCPEXN(:,:)=(XLSTT + (XCPV-XCI) * (ZT(:,:)-XTT) ) / ZCP(:,:) / PEXN(:,:) + ! Rnp + PRT(:,:) = PR(:,:,1) + PR(:,:,2) + PR(:,:,4) + ! Theta_l + PTHL(:,:) = PTH(:,:) - ZLVOCPEXN(:,:) * PR(:,:,2) & + - ZLSOCPEXN(:,:) * PR(:,:,4) + ELSE + !ZLVOCPEXN + ZLVOCPEXN(:,:)=(XLVTT + (XCPV-XCL) * (ZT(:,:)-XTT) ) / ZCP(:,:) / PEXN(:,:) + ! Rnp + PRT(:,:) = PR(:,:,1) + PR(:,:,2) + ! Theta_l + PTHL(:,:) = PTH(:,:) - ZLVOCPEXN(:,:) * PR(:,:,2) + END IF +ELSE + ! Rnp = rv + PRT(:,:) = PR(:,:,1) + ! Theta_l = Theta + PTHL(:,:) = PTH(:,:) +END IF +END SUBROUTINE THL_RT_FROM_TH_R_MF diff --git a/src/mesonh/turb/tke_eps_sources.f90 b/src/mesonh/turb/tke_eps_sources.f90 new file mode 100644 index 000000000..4efe246be --- /dev/null +++ b/src/mesonh/turb/tke_eps_sources.f90 @@ -0,0 +1,485 @@ +!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ########################### + MODULE MODI_TKE_EPS_SOURCES +! ########################### +INTERFACE +! + SUBROUTINE TKE_EPS_SOURCES(KKA,KKU,KKL,KMI,PTKEM,PLM,PLEPS,PDP,PTRH, & + PRHODJ,PDZZ,PDXX,PDYY,PDZX,PDZY,PZZ, & + PTSTEP,PIMPL,PEXPL, & + HTURBLEN,HTURBDIM, & + TPFILE,OTURB_DIAG, & + PTP,PRTKES,PRTKESM, PRTHLS,PCOEF_DISS,PTR,PDISS ) +! +USE MODD_IO, ONLY: TFILEDATA +! +INTEGER, INTENT(IN) :: KKA !near ground array index +INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO +INTEGER, INTENT(IN) :: KMI ! model index number +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at t-deltat +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! mixing length +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! dissipative length +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density * grid volume +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ,PDZX,PDZY + ! metric coefficients +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! physical height w-pt +REAL, INTENT(IN) :: PTSTEP ! Time step +REAL, INTENT(IN) :: PEXPL, PIMPL ! Coef. temporal. disc. +CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! dimensionality of the + ! turbulence scheme +CHARACTER(len=4), INTENT(IN) :: HTURBLEN ! kind of mixing length +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +LOGICAL, INTENT(IN) :: OTURB_DIAG ! switch to write some + ! diagnostic fields in the syncronous FM-file +REAL, DIMENSION(:,:,:), INTENT(INOUT):: PDP ! Dyn. prod. of TKE +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTRH +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTP ! Ther. prod. of TKE +REAL, DIMENSION(:,:,:), INTENT(INOUT):: PRTKES ! RHOD * Jacobian * + ! TKE at t+deltat +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRTKESM ! Advection source +REAL, DIMENSION(:,:,:), INTENT(INOUT):: PRTHLS ! Source of Theta_l +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCOEF_DISS ! 1/(Cph*Exner) +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTR ! Transport prod. of TKE +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDISS ! Dissipati prod. of TKE +! +! +! +END SUBROUTINE TKE_EPS_SOURCES +! +END INTERFACE +! +END MODULE MODI_TKE_EPS_SOURCES +! +! ################################################################## + SUBROUTINE TKE_EPS_SOURCES(KKA,KKU,KKL,KMI,PTKEM,PLM,PLEPS,PDP, & + PTRH,PRHODJ,PDZZ,PDXX,PDYY,PDZX,PDZY,PZZ, & + PTSTEP,PIMPL,PEXPL, & + HTURBLEN,HTURBDIM, & + TPFILE,OTURB_DIAG, & + PTP,PRTKES,PRTKESM, PRTHLS,PCOEF_DISS,PTR,PDISS ) +! ################################################################## +! +! +!!**** *TKE_EPS_SOURCES* - routine to compute the sources of the turbulent +!! evolutive variables: TKE and its dissipation when it is taken into +!! account. The contribution to the heating of tke dissipation is computed. +!! +!! PURPOSE +!! ------- +! The purpose of this routine is to compute the sources necessary for +! the evolution of the turbulent kinetic energy and its dissipation +! if necessary. +! +!!** METHOD +!! ------ +!! The vertical turbulent flux is computed in an off-centered +!! implicit scheme (a Crank-Nicholson type with coefficients different +!! than 0.5), which allows to vary the degree of implicitness of the +!! formulation. +!! In high resolution, the horizontal transport terms are also +!! calculated, but explicitly. +!! The evolution of the dissipation as a variable is made if +!! the parameter HTURBLEN is set equal to KEPS. The same reasoning +!! made for TKE applies. +!! +!! EXTERNAL +!! -------- +!! GX_U_M,GY_V_M,GZ_W_M +!! GX_M_U,GY_M_V : Cartesian vertical gradient operators +!! +!! MXF,MXM.MYF,MYM,MZF,MZM: Shuman functions (mean operators) +!! DZF : Shuman functions (difference operators) +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST : contains physical constants +!! +!! XG : gravity constant +!! +!! Module MODD_CTURB: contains the set of constants for +!! the turbulence scheme +!! +!! XCET,XCED : transport and dissipation cts. for the TKE +!! XCDP,XCDD,XCDT: constants from the parameterization of +!! the K-epsilon equation +!! XTKEMIN,XEPSMIN : minimum values for the TKE and its +!! dissipation +!! +!! Module MODD_PARAMETERS: +!! +!! JPVEXT +!! Module MODD_BUDGET: +!! NBUMOD : model in which budget is calculated +!! CBUTYPE : type of desired budget +!! 'CART' for cartesian box configuration +!! 'MASK' for budget zone defined by a mask +!! 'NONE' ' for no budget +!! LBU_RTKE : logical for budget of RTKE (turbulent kinetic energy) +!! .TRUE. = budget of RTKE +!! .FALSE. = no budget of RTKE +!! +!! +!! REFERENCE +!! --------- +!! Book 2 of documentation (routine TKE_EPS_SOURCES) +!! Book 1 of documentation (Chapter: Turbulence) +!! +!! AUTHOR +!! ------ +!! Joan Cuxart * INM and Meteo-France * +!! +!! MODIFICATIONS +!! ------------- +!! Original August 23, 1994 +!! Modifications: Feb 14, 1995 (J.Cuxart and J.Stein) +!! Doctorization and Optimization +!! June 29, 1995 (J.Stein) TKE budget +!! June 28, 1995 (J.Cuxart) Add LES tools +!! Modifications: February 29, 1996 (J. Stein) optimization +!! Modifications: May 6, 1996 (N. Wood) Extend some loops over +!! the outer points +!! Modifications: August 30, 1996 (P. Jabouille) calcul ZFLX at the +!! IKU level +!! October 10, 1996 (J.Stein) set Keff at t-deltat +!! Oct 8, 1996 (Cuxart,Sanchez) Var.LES: XETR_TF,XDISS_TF +!! December 20, 1996 (J.-P. Pinty) update the CALL BUDGET +!! November 24, 1997 (V. Masson) bug in <v'e> +!! removes the DO loops +!! Augu. 9, 1999 (J.Stein) TKE budget correction +!! Mar 07 2001 (V. Masson and J. Stein) remove the horizontal +!! turbulent transports of Tke computation +!! Nov 06, 2002 (V. Masson) LES budgets +!! July 20, 2003 (J.-P. Pinty P Jabouille) add the dissipative heating +!! May 2006 Remove KEPS +!! October 2009 (G. Tanguy) add ILENCH=LEN(YCOMMENT) after +!! change of YCOMMENT +!! 2012-02 Y. Seity, add possibility to run with reversed +!! vertical levels +!! 2015-01 (J. Escobar) missing get_halo(ZRES) for JPHEXT<> 1 +!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 +!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine +! P. Wautelet 02/2020: use the new data structures and subroutines for budgets +! -------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_ARGSLIST_ll, ONLY: LIST_ll +use modd_budget, only: lbudget_tke, lbudget_th, NBUDGET_TKE, NBUDGET_TH, tbudgets +USE MODD_CONF +USE MODD_CST +USE MODD_CTURB +USE MODD_DIAG_IN_RUN, ONLY: LDIAG_IN_RUN, XCURRENT_TKE_DISS +use modd_field, only: tfielddata, TYPEREAL +USE MODD_IO, ONLY: TFILEDATA +USE MODD_LES +USE MODD_PARAMETERS +! +use mode_budget, only: Budget_store_add, Budget_store_end, Budget_store_init +USE MODE_IO_FIELD_WRITE, only: IO_Field_write +USE MODE_ll +! +USE MODI_GET_HALO +USE MODI_GRADIENT_M +USE MODI_GRADIENT_U +USE MODI_GRADIENT_V +USE MODI_GRADIENT_W +USE MODI_LES_MEAN_SUBGRID +USE MODI_SHUMAN +USE MODI_TRIDIAG_TKE +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments +! +! +INTEGER, INTENT(IN) :: KKA !near ground array index +INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO + +INTEGER, INTENT(IN) :: KMI ! model index number +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at t-deltat +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! mixing length +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! dissipative length +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density * grid volume +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ,PDZX,PDZY + ! metric coefficients +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! physical height w-pt +REAL, INTENT(IN) :: PTSTEP ! Time step +REAL, INTENT(IN) :: PEXPL, PIMPL ! Coef. temporal. disc. +CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! dimensionality of the + ! turbulence scheme +CHARACTER(len=4), INTENT(IN) :: HTURBLEN ! kind of mixing length +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +LOGICAL, INTENT(IN) :: OTURB_DIAG ! switch to write some + ! diagnostic fields in the syncronous FM-file +REAL, DIMENSION(:,:,:), INTENT(INOUT):: PDP ! Dyn. prod. of TKE +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTRH +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTP ! Ther. prod. of TKE +REAL, DIMENSION(:,:,:), INTENT(INOUT):: PRTKES ! RHOD * Jacobian * + ! TKE at t+deltat +REAL, DIMENSION(:,:,:), INTENT(INOUT):: PRTHLS ! Source of Theta_l +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCOEF_DISS ! 1/(Cph*Exner) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRTKESM ! Advection source +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTR ! Transport prod. of TKE +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDISS ! Dissipati prod. of TKE +! +! +! +!* 0.2 declaration of local variables +! +REAL, DIMENSION(SIZE(PTKEM,1),SIZE(PTKEM,2),SIZE(PTKEM,3)):: & + ZA, & ! under diagonal elements of the tri-diagonal matrix involved + ! in the temporal implicit scheme + ZRES, & ! treated variable at t+ deltat when the turbu- + ! lence is the only source of evolution added to the ones + ! considered in ZSOURCE. This variable is also used to + ! temporarily store some diagnostics stored in FM file + ZFLX, & ! horizontal or vertical flux of the treated variable + ZSOURCE, & ! source of evolution for the treated variable + ZKEFF ! effectif diffusion coeff = LT * SQRT( TKE ) +!LOGICAL,DIMENSION(SIZE(PTKEM,1),SIZE(PTKEM,2),SIZE(PTKEM,3)) :: GTKENEG +! ! 3D mask .T. if TKE < XTKEMIN +INTEGER :: IIB,IIE,IJB,IJE,IKB,IKE + ! Index values for the Beginning and End + ! mass points of the domain +INTEGER :: IIU,IJU,IKU ! array size in the 3 dimensions +! +TYPE(LIST_ll), POINTER :: TZFIELDDISS_ll ! list of fields to exchange +INTEGER :: IINFO_ll ! return code of parallel routine +TYPE(TFIELDDATA) :: TZFIELD +! +!---------------------------------------------------------------------------- +NULLIFY(TZFIELDDISS_ll) +! +!* 1. PRELIMINARY COMPUTATIONS +! ------------------------ +! +CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) +IIU=SIZE(PTKEM,1) +IJU=SIZE(PTKEM,2) +IKB=KKA+JPVEXT_TURB*KKL +IKE=KKU-JPVEXT_TURB*KKL +! +! compute the effective diffusion coefficient at the mass point +ZKEFF(:,:,:) = PLM(:,:,:) * SQRT(PTKEM(:,:,:)) + +if (lbudget_th) call Budget_store_init( tbudgets(NBUDGET_TH), 'DISSH', prthls(:, :, :) ) + +!---------------------------------------------------------------------------- +! +!* 2. TKE EQUATION +! ------------ +! +!* 2.1 Horizontal turbulent explicit transport +! +! +! Complete the sources of TKE with the horizontal turbulent explicit transport +! +IF (HTURBDIM=='3DIM') THEN + PTR=PTRH +ELSE + PTR=0. +END IF +! +! +! +!* 2.2 Explicit TKE sources except horizontal turbulent transport +! +! +! extrapolate the dynamic production with a 1/Z law from its value at the +! W(IKB+1) value stored in PDP(IKB) to the mass localization tke(IKB) +PDP(:,:,IKB) = PDP(:,:,IKB) * (1. + PDZZ(:,:,IKB+KKL)/PDZZ(:,:,IKB)) +! +! Compute the source terms for TKE: ( ADVECtion + NUMerical DIFFusion + ..) +! + (Dynamical Production) + (Thermal Production) - (dissipation) +ZFLX(:,:,:) = XCED * SQRT(PTKEM(:,:,:)) / PLEPS(:,:,:) +ZSOURCE(:,:,:) = ( PRTKES(:,:,:) + PRTKESM(:,:,:) ) / PRHODJ(:,:,:) & + - PTKEM(:,:,:) / PTSTEP & + + PDP(:,:,:) + PTP(:,:,:) + PTR(:,:,:) - PEXPL * ZFLX(:,:,:) * PTKEM(:,:,:) +! +!* 2.2 implicit vertical TKE transport +! +! +! Compute the vector giving the elements just under the diagonal for the +! matrix inverted in TRIDIAG +! +ZA(:,:,:) = - PTSTEP * XCET * & + MZM(ZKEFF) * MZM(PRHODJ) / PDZZ**2 +! +! Compute TKE at time t+deltat: ( stored in ZRES ) +! +CALL TRIDIAG_TKE(KKA,KKU,KKL,PTKEM,ZA,PTSTEP,PEXPL,PIMPL,PRHODJ,& + & ZSOURCE,PTSTEP*ZFLX,ZRES) +CALL GET_HALO(ZRES) +! +!* diagnose the dissipation +! +IF (LDIAG_IN_RUN) THEN + XCURRENT_TKE_DISS = ZFLX(:,:,:) * PTKEM(:,:,:) & + *(PEXPL*PTKEM(:,:,:) + PIMPL*ZRES(:,:,:)) + CALL ADD3DFIELD_ll( TZFIELDDISS_ll, XCURRENT_TKE_DISS, 'TKE_EPS_SOURCES::XCURRENT_TKE_DISS' ) + CALL UPDATE_HALO_ll(TZFIELDDISS_ll,IINFO_ll) + CALL CLEANLIST_ll(TZFIELDDISS_ll) +ENDIF +! +! TKE must be greater than its minimum value +! +! CL : Now done at the end of the time step in ADVECTION_METSV +!GTKENEG = ZRES <= XTKEMIN +!WHERE ( GTKENEG ) +! ZRES = XTKEMIN +!END WHERE +! +IF ( LLES_CALL .OR. & + (OTURB_DIAG .AND. tpfile%lopened) ) THEN +! +! Compute the cartesian vertical flux of TKE in ZFLX +! + + ZFLX(:,:,:) = - XCET * MZM(ZKEFF) * & + DZM(PIMPL * ZRES + PEXPL * PTKEM ) / PDZZ +! + ZFLX(:,:,IKB) = 0. + ZFLX(:,:,KKA) = 0. +! +! Compute the whole turbulent TRansport of TKE: +! + PTR(:,:,:)= PTR - DZF( MZM(PRHODJ) * ZFLX / PDZZ ) /PRHODJ +! +! Storage in the LES configuration +! + IF (LLES_CALL) THEN + CALL LES_MEAN_SUBGRID( MZF(ZFLX), X_LES_SUBGRID_WTke ) + CALL LES_MEAN_SUBGRID( -PTR, X_LES_SUBGRID_ddz_WTke ) + END IF +! +END IF +! +!* 2.4 stores the explicit sources for budget purposes +! +if (lbudget_tke) then + ! Dynamical production + call Budget_store_add( tbudgets(NBUDGET_TKE), 'DP', pdp(:, :, :) * prhodj(:, :, :) ) + ! Thermal production + call Budget_store_add( tbudgets(NBUDGET_TKE), 'TP', ptp(:, :, :) * prhodj(:, :, :) ) + ! Dissipation + call Budget_store_add( tbudgets(NBUDGET_TKE), 'DISS', -xced * sqrt( ptkem(:, :, :) ) / pleps(:, :, :) & + * ( pexpl * ptkem(:, :, :) + pimpl * zres(:, :, :) ) * prhodj(:, :, :) ) +end if +! +!* 2.5 computes the final RTKE and stores the whole turbulent transport +! with the removal of the advection part + +if (lbudget_tke) then + !Store the previous source terms in prtkes before initializing the next one + PRTKES(:,:,:) = PRTKES(:,:,:) + PRHODJ(:,:,:) * & + ( PDP(:,:,:) + PTP(:,:,:) & + - XCED * SQRT(PTKEM(:,:,:)) / PLEPS(:,:,:) * ( PEXPL*PTKEM(:,:,:) + PIMPL*ZRES(:,:,:) ) ) + + call Budget_store_init( tbudgets(NBUDGET_TKE), 'TR', prtkes(:, :, :) ) +end if + +PRTKES(:,:,:) = ZRES(:,:,:) * PRHODJ(:,:,:) / PTSTEP - PRTKESM(:,:,:) +! +! stores the whole turbulent transport +! +if (lbudget_tke) call Budget_store_end( tbudgets(NBUDGET_TKE), 'TR', prtkes(:, :, :) ) + +!---------------------------------------------------------------------------- +! +!* 3. COMPUTE THE DISSIPATIVE HEATING +! ------------------------------- +! +PRTHLS(:,:,:) = PRTHLS(:,:,:) + XCED * SQRT(PTKEM(:,:,:)) / PLEPS(:,:,:) * & + (PEXPL*PTKEM(:,:,:) + PIMPL*ZRES(:,:,:)) * PRHODJ(:,:,:) * PCOEF_DISS(:,:,:) + +if (lbudget_th) call Budget_store_end( tbudgets(NBUDGET_TH), 'DISSH', prthls(:, :, :) ) + +!---------------------------------------------------------------------------- +! +!* 4. STORES SOME DIAGNOSTICS +! ----------------------- +! +PDISS(:,:,:) = -XCED * (PTKEM(:,:,:)**1.5) / PLEPS(:,:,:) +! +IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN +! +! stores the dynamic production +! + TZFIELD%CMNHNAME = 'DP' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'DP' + TZFIELD%CUNITS = 'm2 s-3' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_DP' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,PDP) +! +! stores the thermal production +! + TZFIELD%CMNHNAME = 'TP' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'TP' + TZFIELD%CUNITS = 'm2 s-3' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_TP' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,PTP) +! +! stores the whole turbulent transport +! + TZFIELD%CMNHNAME = 'TR' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'TR' + TZFIELD%CUNITS = 'm2 s-3' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_TR' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,PTR) +! +! stores the dissipation of TKE +! + TZFIELD%CMNHNAME = 'DISS' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'DISS' + TZFIELD%CUNITS = 'm2 s-3' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_DISS' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,PDISS) +END IF +! +! Storage in the LES configuration of the Dynamic Production of TKE and +! the dissipation of TKE +! +IF (LLES_CALL ) THEN + CALL LES_MEAN_SUBGRID( PDISS, X_LES_SUBGRID_DISS_Tke ) +END IF +! +!---------------------------------------------------------------------------- +! +! +!---------------------------------------------------------------------------- +! +END SUBROUTINE TKE_EPS_SOURCES diff --git a/src/mesonh/turb/tm06.f90 b/src/mesonh/turb/tm06.f90 new file mode 100644 index 000000000..eb82548d9 --- /dev/null +++ b/src/mesonh/turb/tm06.f90 @@ -0,0 +1,165 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 newsrc 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ################ + MODULE MODI_TM06 +! ################ +! +INTERFACE +! + SUBROUTINE TM06(KKA,KKU,KKL,PTHVREF,PBL_DEPTH,PZZ,PSFTH,PMWTH,PMTH2) +! +INTEGER, INTENT(IN) :: KKA !near ground array index +INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! reference potential temperature +REAL, DIMENSION(:,:), INTENT(IN) :: PBL_DEPTH ! boundary layer height +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! altitude of flux levels +REAL, DIMENSION(:,:), INTENT(IN) :: PSFTH ! surface heat flux +REAL, DIMENSION(:,:,:), INTENT(OUT):: PMWTH ! w'2th' +REAL, DIMENSION(:,:,:), INTENT(OUT):: PMTH2 ! w'th'2 +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE TM06 +! +END INTERFACE +! +END MODULE MODI_TM06 +! +! ################################################################# + SUBROUTINE TM06(KKA,KKU,KKL,PTHVREF,PBL_DEPTH,PZZ,PSFTH,PMWTH,PMTH2) +! ################################################################# +! +! +!!**** *TM06* - computes the Third Order Moments +!! +!! PURPOSE +!! ------- +! +!!** METHOD +!! ------ +!! +!! TOMs are deduced from convective normalized TOMs according to Tomas and +!! Masson 2006 +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! V. MAsson and S. Tomas * Meteo-France * +!! +!! MODIFICATIONS +!! ------------- +!! Original sept. 2005 +!! +!! -------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAMETERS, ONLY : XUNDEF +USE MODD_CST, ONLY : XG +USE MODD_PARAMETERS, ONLY : JPVEXT_TURB + +! +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments +! +INTEGER, INTENT(IN) :: KKA !near ground array index +INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! reference potential temperature +REAL, DIMENSION(:,:), INTENT(IN) :: PBL_DEPTH ! boundary layer height +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! altitude of flux levels +REAL, DIMENSION(:,:), INTENT(IN) :: PSFTH ! surface heat flux +REAL, DIMENSION(:,:,:), INTENT(OUT):: PMWTH ! w'2th' +REAL, DIMENSION(:,:,:), INTENT(OUT):: PMTH2 ! w'th'2 +! +!------------------------------------------------------------------------------- +! +! 0.2 declaration of local variables +! +REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: ZZ_O_H ! normalized height z/h (where h=BL height) +REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2)) :: ZWSTAR ! normalized convective velocity w* +REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2)) :: ZTSTAR ! normalized temperature velocity w* +! +INTEGER :: JK ! loop counter +INTEGER :: IKT ! vertical size +INTEGER :: IKTB,IKTE,IKB,IKE ! vertical levels +!---------------------------------------------------------------------------- +! +IKT=SIZE(PZZ,3) +IKTB=1+JPVEXT_TURB +IKTE=IKT-JPVEXT_TURB +IKB=KKA+JPVEXT_TURB*KKL +IKE=KKU-JPVEXT_TURB*KKL + +! +! +!* w* and T* +! +WHERE(PSFTH>0.) + ZWSTAR = ((XG/PTHVREF(:,:,IKB))*PSFTH*PBL_DEPTH)**(1./3.) + ZTSTAR = PSFTH / ZWSTAR +ELSEWHERE + ZWSTAR = 0. + ZTSTAR = 0. +END WHERE +! +! +!* normalized height +! +ZZ_O_H = XUNDEF +DO JK=1,IKT + WHERE (PBL_DEPTH/=XUNDEF) + ZZ_O_H(:,:,JK) = (PZZ(:,:,JK)-PZZ(:,:,IKB)) / PBL_DEPTH(:,:) + END WHERE +END DO +! +!* w'th'2 +! +PMTH2 = 0. +WHERE(ZZ_O_H < 0.95 .AND. ZZ_O_H/=XUNDEF) + PMTH2(:,:,:) = 4.*(MAX(ZZ_O_H,0.))**0.4*(ZZ_O_H-0.95)**2 +END WHERE +DO JK=IKTB+1,IKTE-1 + PMTH2(:,:,JK) = PMTH2(:,:,JK) * ZTSTAR(:,:)**2*ZWSTAR(:,:) +END DO +PMTH2(:,:,IKE)=PMTH2(:,:,IKE) * ZTSTAR(:,:)**2*ZWSTAR(:,:) +PMTH2(:,:,KKU)=PMTH2(:,:,KKU) * ZTSTAR(:,:)**2*ZWSTAR(:,:) + +! +! +!* w'2th' +! +PMWTH = 0. +WHERE(ZZ_O_H <0.9 .AND. ZZ_O_H/=XUNDEF) + PMWTH(:,:,:) = MAX(-7.9*(ABS(ZZ_O_H-0.35))**2.9 * (ABS(ZZ_O_H-1.))**0.58 + 0.37, 0.) +END WHERE +DO JK=IKTB+1,IKTE-1 + PMWTH(:,:,JK) = PMWTH(:,:,JK) * ZWSTAR(:,:)**2*ZTSTAR(:,:) +END DO +PMWTH(:,:,IKE) = PMWTH(:,:,IKE) * ZWSTAR(:,:)**2*ZTSTAR(:,:) +PMWTH(:,:,KKU) = PMWTH(:,:,KKU) * ZWSTAR(:,:)**2*ZTSTAR(:,:) +! +!---------------------------------------------------------------------------- +END SUBROUTINE TM06 diff --git a/src/mesonh/turb/tm06_h.f90 b/src/mesonh/turb/tm06_h.f90 new file mode 100644 index 000000000..58f018554 --- /dev/null +++ b/src/mesonh/turb/tm06_h.f90 @@ -0,0 +1,124 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 newsrc 2006/06/02 17:34:59 +!----------------------------------------------------------------- +! ################ + MODULE MODI_TM06_H +! ################ +! +INTERFACE +! + SUBROUTINE TM06_H(KKB,KKTB,KKTE,PTSTEP,PZZ,PFLXZ,PBL_DEPTH) +! +INTEGER, INTENT(IN) :: KKB ! index of 1st physical level + ! close to ground +INTEGER, INTENT(IN) :: KKTB ! first physical level in k +INTEGER, INTENT(IN) :: KKTE ! last physical level in k +REAL, INTENT(IN) :: PTSTEP ! Double time step +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! altitude of flux levels +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFLXZ ! heat flux +REAL, DIMENSION(:,:), INTENT(INOUT) :: PBL_DEPTH ! boundary layer height +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE TM06_H +! +END INTERFACE +! +END MODULE MODI_TM06_H +! +! ################################################################# + SUBROUTINE TM06_H(KKB,KKTB,KKTE,PTSTEP,PZZ,PFLXZ,PBL_DEPTH) +! ################################################################# +! +! +!!**** *TM06_H* - computes the Third Order Moments +!! +!! PURPOSE +!! ------- +! +!!** METHOD +!! ------ +!! +!! TOMs are deduced from convective normalized TOMs according to Tomas and +!! Masson 2006 +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! V. MAsson and S. Tomas * Meteo-France * +!! +!! MODIFICATIONS +!! ------------- +!! Original sept. 2005 +!! +!! -------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAMETERS, ONLY : XUNDEF +! +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments +! +INTEGER, INTENT(IN) :: KKB ! index of 1st physical level + ! close to ground +INTEGER, INTENT(IN) :: KKTB ! first physical level in k +INTEGER, INTENT(IN) :: KKTE ! last physical level in k +REAL, INTENT(IN) :: PTSTEP ! Double time step +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! altitude of flux levels +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFLXZ ! heat flux +REAL, DIMENSION(:,:), INTENT(INOUT) :: PBL_DEPTH ! boundary layer height +! +!------------------------------------------------------------------------------- +! +! 0.2 declaration of local variables +! +! +INTEGER :: JK ! loop counter +REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2)) :: ZFLXZMIN ! minimum of temperature flux +REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2)) :: ZBL_DEPTH! BL depth at previous time-step +REAL :: ZGROWTH ! maximum BL growth rate +!---------------------------------------------------------------------------- +! +!* mixed boundary layer cannot grow more rapidly than 1800m/h +ZGROWTH = 2.0 ! (m/s) +! +!---------------------------------------------------------------------------- +! +ZBL_DEPTH(:,:) = PBL_DEPTH(:,:) +WHERE(ZBL_DEPTH(:,:)==XUNDEF) ZBL_DEPTH(:,:)=0. +! +PBL_DEPTH(:,:) = XUNDEF +ZFLXZMIN (:,:) = PFLXZ(:,:,KKB) +! +DO JK=KKTB,KKTE + WHERE (PFLXZ(:,:,KKB)>0. .AND. PFLXZ(:,:,JK)<ZFLXZMIN(:,:)) + PBL_DEPTH(:,:) = PZZ (:,:,JK) - PZZ(:,:,KKB) + ZFLXZMIN (:,:) = PFLXZ(:,:,JK) + END WHERE +END DO +! +WHERE(PBL_DEPTH(:,:)/=XUNDEF) PBL_DEPTH(:,:)=MIN(PBL_DEPTH(:,:),ZBL_DEPTH(:,:)+ZGROWTH*PTSTEP) +! +!---------------------------------------------------------------------------- +END SUBROUTINE TM06_H diff --git a/src/mesonh/turb/tridiag.f90 b/src/mesonh/turb/tridiag.f90 new file mode 100644 index 000000000..20a4213da --- /dev/null +++ b/src/mesonh/turb/tridiag.f90 @@ -0,0 +1,261 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 turb 2006/06/06 09:55:03 +!----------------------------------------------------------------- +! ################### + MODULE MODI_TRIDIAG +! ################### +INTERFACE +! + SUBROUTINE TRIDIAG(KKA,KKU,KKL,PVARM,PA,PTSTEP,PEXPL,PIMPL, & + PRHODJ,PSOURCE,PVARP ) +! +INTEGER, INTENT(IN) :: KKA !near ground array index +INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=AR +REAL, DIMENSION(:,:,:), INTENT(IN) :: PVARM ! variable at t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! upper diag. elements +REAL, INTENT(IN) :: PTSTEP ! Double time step +REAL, INTENT(IN) :: PEXPL,PIMPL ! weights of the temporal scheme +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! (dry rho)*J +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSOURCE ! source term of PVAR +! +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PVARP ! variable at t+1 +! +END SUBROUTINE TRIDIAG +! +END INTERFACE +! +END MODULE MODI_TRIDIAG +! +! +! +! ################################################# + SUBROUTINE TRIDIAG(KKA,KKU,KKL,PVARM,PA,PTSTEP,PEXPL,PIMPL, & + PRHODJ,PSOURCE,PVARP ) +! ################################################# +! +! +!!**** *TRIDIAG* - routine to solve a time implicit scheme +!! +!! +!! PURPOSE +!! ------- +! The purpose of this routine is to give a field PVARP at t+1, by +! solving an implicit tridiagonal system obtained by the +! discretization of the vertical turbulent diffusion. It should be noted +! that the degree of implicitness can be varied (PIMPL parameter) and the +! sources of evolution other than the turbulent diffusion can be taken +! into account through the PSOURCE field. PVARP is localized at a mass +! point. +! +!!** METHOD +!! ------ +!! First, the Right Hand Side of the implicit equation is computed. +!! It is build as follows: +!! ZY = PVARM + PTSTEP*PSOURCE + DIFF_EXPLI +!! where PVARM is the variable at t-dt, PSOURCE the supplementary sources of +!! PVAR ( and not PVAR * PRHODJ !!) and DIFF_EXPLI is the explicit part +!! of the vertical turbulent diffusion. This operator is spatially +!! discretized as the implicit one, thus: +!! DIFF_EXPLI(k) = - PEXPL / PRHODJ(k) * +!! ( PA(k+1) * (PVARM(k+1) - PVARM(k) ) +!! -PA(k) * (PVARM(k) - PVARM(k-1)) ) +!! For the first level, only the upper part is considered, the lower one +!! is replaced by the turbulent surface flux (taken into account in the +!! PSOURCE(ikb) term). +!! DIFF_EXPLI(ikb) = - PEXPL / PRHODJ(ikb) * +!! ( PA(ikb+1) * (PVARM(ikb+1) - PVARM(ikb)) ) +!! For the last level, only the lower part is considered, the upper one +!! is replaced by the turbulent flux which is taken equal to 0 +!! (taken into account in the PSOURCE(ike) term). +!! +!! DIFF_EXPLI(ike) = + PEXPL / PRHODJ(ike) * +!! ( PA(ike) * (PVARM(ike) - PVARM(ike-1)) ) +!! +!! Then, the classical tridiagonal algorithm is used to invert the +!! implicit operator. Its matrix is given by: +!! +!! ( b(ikb) c(ikb) 0 0 0 0 0 0 ) +!! ( 0 a(ikb+1) b(ikb+1) c(ikb+1) 0 ... 0 0 0 ) +!! ( 0 0 a(ikb+2) b(ikb+2) c(ikb+2). 0 0 0 ) +!! ....................................................................... +!! ( 0 ... 0 a(k) b(k) c(k) 0 ... 0 0 ) +!! ....................................................................... +!! ( 0 0 0 0 0 ...a(ike-1) b(ike-1) c(ike-1)) +!! ( 0 0 0 0 0 ... 0 a(ike) b(ike) ) +!! +!! ikb and ike represent the first and the last inner mass levels of the +!! model. The coefficients are: +!! +!! a(k) = PIMPL * PA(k)/PRHODJ(k) +!! b(k) = 1 - PIMPL * PA(k)/PRHODJ(k) - PIMPL * PA(k+1)/PRHODJ(k) +!! c(k) = PIMPL * PA(k+1)/PRHODJ(k) +!! +!! for all k /= ikb or ike +!! +!! b(ikb) = 1 - PIMPL * PA(ikb+1)/PRHODJ(ikb) +!! c(ikb) = PIMPL * PA(ikb+1)/PRHODJ(ikb) +!! (discretization of the upper part of the implicit operator) +!! b(ike) = 1 - PIMPL * PA(ike)/PRHODJ(ike) +!! a(ike) = PIMPL * PA(ike)/PRHODJ(ike) +!! (discretization of the lower part of the implicit operator) +!! Finally, the marginal points are prescribed. +!! +!! All these computations are purely vertical and vectorizations are +!! easely achieved by processing all the verticals in parallel. +!! +!! EXTERNAL +!! -------- +!! +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! MODD_PARAMETERS +!! JPVEXT_TURB: number of vertical external points +!! +!! REFERENCE +!! --------- +!! Book 1 of Meso-NH documentation (chapter Turbulence) +!! Press et al: Numerical recipes (1986) Cambridge Univ. Press +!! +!! AUTHOR +!! ------ +!! Joan Cuxart * INM and Meteo-France * +!! +!! MODIFICATIONS +!! ------------- +!! Original August 29, 1994 +!! Modification : January 29, 1995 Algorithm written with two +!! local variables less +!! (Cuxart, Stein) August 21, 1995 Bug correction for PRHODJ +!! (Stein) November 16, 1995 new version +!! (Stein) February 28, 1995 no inversion in the explicit case +!! (Seity) February 2012 add possibility to run with reversed +!! vertical levels +!! --------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! +USE MODD_PARAMETERS +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments +! +INTEGER, INTENT(IN) :: KKA !near ground array index +INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO +REAL, DIMENSION(:,:,:), INTENT(IN) :: PVARM ! variable at t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! upper diag. elements +REAL, INTENT(IN) :: PTSTEP ! Double time step +REAL, INTENT(IN) :: PEXPL,PIMPL ! weights of the temporal scheme +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! (dry rho)*J +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSOURCE ! source term of PVAR +! +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PVARP ! variable at t+1 +! +!* 0.2 declarations of local variables +! +REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2),SIZE(PVARM,3)) :: ZY ,ZGAM + ! RHS of the equation, 3D work array +REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2)) :: ZBET + ! 2D work array +INTEGER :: JK ! loop counter +INTEGER :: IKB,IKE ! inner vertical limits +INTEGER :: IKT ! array size in k direction +INTEGER :: IKTB,IKTE ! start, end of k loops in physical domain + +! +! --------------------------------------------------------------------------- +! +!* 1. COMPUTE THE RIGHT HAND SIDE +! --------------------------- +! +IKTB=1+JPVEXT_TURB +IKT=SIZE(PVARM,3) +IKTE=IKT-JPVEXT_TURB +IKB=KKA+JPVEXT_TURB*KKL +IKE=KKU-JPVEXT_TURB*KKL +! +! +ZY(:,:,IKB) = PVARM(:,:,IKB) + PTSTEP*PSOURCE(:,:,IKB) - & + PEXPL / PRHODJ(:,:,IKB) * PA(:,:,IKB+KKL) * (PVARM(:,:,IKB+KKL) - PVARM(:,:,IKB)) +! +DO JK=IKTB+1,IKTE-1 + ZY(:,:,JK)= PVARM(:,:,JK) + PTSTEP*PSOURCE(:,:,JK) - & + PEXPL / PRHODJ(:,:,JK) * & + ( PVARM(:,:,JK-KKL)*PA(:,:,JK) & + -PVARM(:,:,JK)*(PA(:,:,JK)+PA(:,:,JK+KKL)) & + +PVARM(:,:,JK+KKL)*PA(:,:,JK+KKL) & + ) +END DO +! +ZY(:,:,IKE)= PVARM(:,:,IKE) + PTSTEP*PSOURCE(:,:,IKE) + & + PEXPL / PRHODJ(:,:,IKE) * PA(:,:,IKE) * (PVARM(:,:,IKE)-PVARM(:,:,IKE-KKL)) +! +! +!* 2. INVERSION OF THE TRIDIAGONAL SYSTEM +! ----------------------------------- +! +IF ( PIMPL > 1.E-10 ) THEN +! + ! + ! going up + ! + ZBET(:,:) = 1. - PIMPL * PA(:,:,IKB+KKL) / PRHODJ(:,:,IKB) ! bet = b(ikb) + PVARP(:,:,IKB) = ZY(:,:,IKB) / ZBET(:,:) + ! + DO JK = IKB+KKL,IKE-KKL,KKL + ZGAM(:,:,JK) = PIMPL * PA(:,:,JK) / PRHODJ(:,:,JK-KKL) / ZBET(:,:) + ! gam(k) = c(k-1) / bet + ZBET(:,:) = 1. - PIMPL * ( PA(:,:,JK) * (1. + ZGAM(:,:,JK)) & + + PA(:,:,JK+KKL) & + ) / PRHODJ(:,:,JK) + ! bet = b(k) - a(k)* gam(k) + PVARP(:,:,JK)= ( ZY(:,:,JK) - PIMPL * PA(:,:,JK) / PRHODJ(:,:,JK) & + * PVARP(:,:,JK-KKL) & + ) / ZBET(:,:) + ! res(k) = (y(k) -a(k)*res(k-1))/ bet + END DO + ! special treatment for the last level + ZGAM(:,:,IKE) = PIMPL * PA(:,:,IKE) / PRHODJ(:,:,IKE-KKL) / ZBET(:,:) + ! gam(k) = c(k-1) / bet + ZBET(:,:) = 1. - PIMPL * ( PA(:,:,IKE) * (1. + ZGAM(:,:,IKE)) & + ) / PRHODJ(:,:,IKE) + ! bet = b(k) - a(k)* gam(k) + PVARP(:,:,IKE)= ( ZY(:,:,IKE) - PIMPL * PA(:,:,IKE) / PRHODJ(:,:,IKE) & + * PVARP(:,:,IKE-KKL) & + ) / ZBET(:,:) + ! res(k) = (y(k) -a(k)*res(k-1))/ bet + ! + ! going down + ! + DO JK = IKE-KKL,IKB,-1*KKL + PVARP(:,:,JK) = PVARP(:,:,JK) - ZGAM(:,:,JK+KKL) * PVARP(:,:,JK+KKL) + END DO +! +ELSE +! + PVARP(:,:,IKTB:IKTE) = ZY(:,:,IKTB:IKTE) +! +END IF +! +! +!* 3. FILL THE UPPER AND LOWER EXTERNAL VALUES +! ---------------------------------------- +! +PVARP(:,:,KKA)=PVARP(:,:,IKB) +PVARP(:,:,KKU)=PVARP(:,:,IKE) +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE TRIDIAG diff --git a/src/mesonh/turb/tridiag_massflux.f90 b/src/mesonh/turb/tridiag_massflux.f90 new file mode 100644 index 000000000..122fcf318 --- /dev/null +++ b/src/mesonh/turb/tridiag_massflux.f90 @@ -0,0 +1,301 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +! ################### + MODULE MODI_TRIDIAG_MASSFLUX +! ################### +INTERFACE +! + SUBROUTINE TRIDIAG_MASSFLUX(KKA,KKB,KKE,KKU,KKL,PVARM,PF,PDFDT,PTSTEP,PIMPL, & + PDZZ,PRHODJ,PVARP ) +! +INTEGER, INTENT(IN) :: KKA ! near ground array index +INTEGER, INTENT(IN) :: KKB ! near ground physical index +INTEGER, INTENT(IN) :: KKE ! uppest atmosphere physical index +INTEGER, INTENT(IN) :: KKU ! uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:), INTENT(IN) :: PVARM ! variable at t-1 at mass point +REAL, DIMENSION(:,:), INTENT(IN) :: PF ! flux in dT/dt=-dF/dz at flux point +REAL, DIMENSION(:,:), INTENT(IN) :: PDFDT ! dF/dT at flux point +REAL, INTENT(IN) :: PTSTEP ! Double time step +REAL, INTENT(IN) :: PIMPL ! implicit weight +REAL, DIMENSION(:,:), INTENT(IN) :: PDZZ ! Dz at flux point +REAL, DIMENSION(:,:), INTENT(IN) :: PRHODJ ! (dry rho)*J at mass point +! +REAL, DIMENSION(:,:), INTENT(OUT):: PVARP ! variable at t+1 at mass point +! +END SUBROUTINE TRIDIAG_MASSFLUX +! +END INTERFACE +! +END MODULE MODI_TRIDIAG_MASSFLUX + + +! ################################################# + SUBROUTINE TRIDIAG_MASSFLUX(KKA,KKB,KKE,KKU,KKL,PVARM,PF,PDFDT,PTSTEP,PIMPL, & + PDZZ,PRHODJ,PVARP ) +! ################################################# +! +! +!!**** *TRIDIAG_MASSFLUX* - routine to solve a time implicit scheme +!! +!! +!! PURPOSE +!! ------- +! The purpose of this routine is to give a field PVARP at t+1, by +! solving an implicit TRIDIAGonal system obtained by the +! discretization of the vertical turbulent diffusion. It should be noted +! that the degree of implicitness can be varied (PIMPL parameter) and that +! the function of F(T) must have been linearized. +! PVARP is localized at a mass point. +! +!!** METHOD +!! ------ +!! +!! [T(+) - T(-)]/2Dt = -d{ F + dF/dT *impl*[T(+) + T(-)] }/dz +!! +!! It is discretized as follows: +!! +!! PRHODJ(k)*PVARP(k)/PTSTEP +!! = +!! PRHODJ(k)*PVARM(k)/PTSTEP +!! - (PRHODJ(k+1)+PRHODJ(k) )/2. * PF(k+1)/PDZZ(k+1) +!! + (PRHODJ(k) +PRHODJ(k-1))/2. * PF(k) /PDZZ(k) +!! + (PRHODJ(k+1)+PRHODJ(k) )/2. * 0.5*PIMPL* PDFDT(k+1) * PVARM(k+1)/PDZZ(k+1) +!! - (PRHODJ(k+1)+PRHODJ(k) )/2. * 0.5*PIMPL* PDFDT(k+1) * PVARP(k+1)/PDZZ(k+1) +!! + (PRHODJ(k+1)+PRHODJ(k) )/2. * 0.5*PIMPL* PDFDT(k+1) * PVARM(k) /PDZZ(k+1) +!! - (PRHODJ(k+1)+PRHODJ(k) )/2. * 0.5*PIMPL* PDFDT(k+1) * PVARP(k) /PDZZ(k+1) +!! - (PRHODJ(k) +PRHODJ(k-1))/2. * 0.5*PIMPL* PDFDT(k) * PVARM(k) /PDZZ(k) +!! + (PRHODJ(k) +PRHODJ(k-1))/2. * 0.5*PIMPL* PDFDT(k) * PVARP(k) /PDZZ(k) +!! - (PRHODJ(k) +PRHODJ(k-1))/2. * 0.5*PIMPL* PDFDT(k) * PVARM(k-1)/PDZZ(k) +!! + (PRHODJ(k) +PRHODJ(k-1))/2. * 0.5*PIMPL* PDFDT(k) * PVARP(k-1)/PDZZ(k) +!! +!! +!! The system to solve is: +!! +!! A*PVARP(k-1) + B*PVARP(k) + C*PVARP(k+1) = Y(k) +!! +!! +!! The RHS of the linear system in PVARP writes: +!! +!! y(k) = PRHODJ(k)*PVARM(k)/PTSTEP +!! - (PRHODJ(k+1)+PRHODJ(k) )/2. * PF(k+1)/PDZZ(k+1) +!! + (PRHODJ(k) +PRHODJ(k-1))/2. * PF(k) /PDZZ(k) +!! + (PRHODJ(k+1)+PRHODJ(k) )/2. * 0.5*PIMPL* PDFDT(k+1) * PVARM(k+1)/PDZZ(k+1) +!! + (PRHODJ(k+1)+PRHODJ(k) )/2. * 0.5*PIMPL* PDFDT(k+1) * PVARM(k) /PDZZ(k+1) +!! - (PRHODJ(k) +PRHODJ(k-1))/2. * 0.5*PIMPL* PDFDT(k) * PVARM(k) /PDZZ(k) +!! - (PRHODJ(k) +PRHODJ(k-1))/2. * 0.5*PIMPL* PDFDT(k) * PVARM(k-1)/PDZZ(k) +!! +!! +!! Then, the classical TRIDIAGonal algorithm is used to invert the +!! implicit operator. Its matrix is given by: +!! +!! ( b(KKB) c(KKB) 0 0 0 0 0 0 ) +!! ( a(KKB+1) b(KKB+1) c(KKB+1) 0 ... 0 0 0 0 ) +!! ( 0 a(KKB+2) b(KKB+2) c(KKB+2). 0 0 0 0 ) +!! ....................................................................... +!! ( 0 ... 0 a(k) b(k) c(k) 0 ... 0 0 ) +!! ....................................................................... +!! ( 0 0 0 0 0 ...a(KKE-1) b(KKE-1) c(KKE-1)) +!! ( 0 0 0 0 0 ... 0 a(KKE) b(KKE) ) +!! +!! KKB and KKE represent the first and the last inner mass levels of the +!! model. The coefficients are: +!! +!! a(k) = - (PRHODJ(k) +PRHODJ(k-1))/2. * 0.5*PIMPL* PDFDT(k) /PDZZ(k) +!! b(k) = PRHODJ(k) / PTSTEP +!! + (PRHODJ(k+1)+PRHODJ(k) )/2. * 0.5*PIMPL* PDFDT(k+1)/PDZZ(k+1) +!! - (PRHODJ(k) +PRHODJ(k-1))/2. * 0.5*PIMPL* PDFDT(k) /PDZZ(k) +!! c(k) = + (PRHODJ(k+1)+PRHODJ(k) )/2. * 0.5*PIMPL* PDFDT(k+1)/PDZZ(k+1) +!! +!! for all k /= KKB or KKE +!! +!! +!! b(KKB) = PRHODJ(KKB) / PTSTEP +!! +(PRHODJ(KKB+1)+PRHODJ(KKB))/2.*0.5*PIMPL*PDFDT(KKB+1)/PDZZ(KKB+1) +!! c(KKB) = +(PRHODJ(KKB+1)+PRHODJ(KKB))/2.*0.5*PIMPL*PDFDT(KKB+1)/PDZZ(KKB+1) +!! +!! b(KKE) = PRHODJ(KKE) / PTSTEP +!! -(PRHODJ(KKE)+PRHODJ(KKE-1))/2.*0.5*PIMPL*PDFDT(KKE)/PDZZ(KKE) +!! a(KKE) = -(PRHODJ(KKE)+PRHODJ(KKE-1))/2.*0.5*PIMPL*PDFDT(KKE)/PDZZ(KKE) +!! +!! +!! EXTERNAL +!! -------- +!! +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! Press et al: Numerical recipes (1986) Cambridge Univ. Press +!! +!! AUTHOR +!! ------ +!! V. Masson and S. Malardel * Meteo-France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 07/2006 +!! V.Masson : Optimization +!! S. Riette Jan 2012: support for both order of vertical levels +!! --------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! +USE MODD_PARAMETERS, ONLY: JPVEXT +USE MODI_SHUMAN_MF +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments +! +INTEGER, INTENT(IN) :: KKA ! near ground array index +INTEGER, INTENT(IN) :: KKB ! near ground physical index +INTEGER, INTENT(IN) :: KKE ! uppest atmosphere physical index +INTEGER, INTENT(IN) :: KKU ! uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:), INTENT(IN) :: PVARM ! variable at t-1 at mass point +REAL, DIMENSION(:,:), INTENT(IN) :: PF ! flux in dT/dt=-dF/dz at flux point +REAL, DIMENSION(:,:), INTENT(IN) :: PDFDT ! dF/dT at flux point +REAL, INTENT(IN) :: PTSTEP ! Double time step +REAL, INTENT(IN) :: PIMPL ! implicit weight +REAL, DIMENSION(:,:), INTENT(IN) :: PDZZ ! Dz at flux point +REAL, DIMENSION(:,:), INTENT(IN) :: PRHODJ ! (dry rho)*J at mass point +! +REAL, DIMENSION(:,:), INTENT(OUT):: PVARP ! variable at t+1 at mass point +! +! +!* 0.2 declarations of local variables +! +REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2)) :: ZRHODJ_DFDT_O_DZ +REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2)) :: ZMZM_RHODJ +REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2)) :: ZA, ZB, ZC +REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2)) :: ZY ,ZGAM + ! RHS of the equation, 3D work array +REAL, DIMENSION(SIZE(PVARM,1)) :: ZBET + ! 2D work array +INTEGER :: JK ! loop counter +! +! --------------------------------------------------------------------------- +! +!* 1. Preliminaries +! ------------- +! +ZMZM_RHODJ = MZM_MF(KKA,KKU,KKL,PRHODJ) +ZRHODJ_DFDT_O_DZ = ZMZM_RHODJ*PDFDT/PDZZ +! +ZA=0. +ZB=0. +ZC=0. +ZY=0. +! +! +!* 2. COMPUTE THE RIGHT HAND SIDE +! --------------------------- +! +ZY(:,KKB) = PRHODJ(:,KKB)*PVARM(:,KKB)/PTSTEP & + - ZMZM_RHODJ(:,KKB+KKL) * PF(:,KKB+KKL)/PDZZ(:,KKB+KKL) & + + ZMZM_RHODJ(:,KKB ) * PF(:,KKB )/PDZZ(:,KKB ) & + + ZRHODJ_DFDT_O_DZ(:,KKB+KKL) * 0.5*PIMPL * PVARM(:,KKB+KKL) & + + ZRHODJ_DFDT_O_DZ(:,KKB+KKL) * 0.5*PIMPL * PVARM(:,KKB ) +! +DO JK=2+JPVEXT,SIZE(ZY,2)-JPVEXT-1 + ZY(:,JK) = PRHODJ(:,JK)*PVARM(:,JK)/PTSTEP & + - ZMZM_RHODJ(:,JK+KKL) * PF(:,JK+KKL)/PDZZ(:,JK+KKL) & + + ZMZM_RHODJ(:,JK ) * PF(:,JK )/PDZZ(:,JK ) & + + ZRHODJ_DFDT_O_DZ(:,JK+KKL) * 0.5*PIMPL * PVARM(:,JK+KKL) & + + ZRHODJ_DFDT_O_DZ(:,JK+KKL) * 0.5*PIMPL * PVARM(:,JK ) & + - ZRHODJ_DFDT_O_DZ(:,JK ) * 0.5*PIMPL * PVARM(:,JK ) & + - ZRHODJ_DFDT_O_DZ(:,JK ) * 0.5*PIMPL * PVARM(:,JK-KKL) +END DO +! +IF (JPVEXT==0) THEN + ZY(:,KKE) = PRHODJ(:,KKE)*PVARM(:,KKE)/PTSTEP +ELSE + ZY(:,KKE) = PRHODJ(:,KKE)*PVARM(:,KKE)/PTSTEP & + - ZMZM_RHODJ(:,KKE+KKL) * PF(:,KKE+KKL)/PDZZ(:,KKE+KKL) & + + ZMZM_RHODJ(:,KKE ) * PF(:,KKE )/PDZZ(:,KKE ) & + - ZRHODJ_DFDT_O_DZ(:,KKE ) * 0.5*PIMPL * PVARM(:,KKE ) & + - ZRHODJ_DFDT_O_DZ(:,KKE ) * 0.5*PIMPL * PVARM(:,KKE-KKL) +ENDIF +! +! +!* 3. INVERSION OF THE TRIDIAGONAL SYSTEM +! ----------------------------------- +! +IF ( PIMPL > 1.E-10 ) THEN +! +!* 3.1 arrays A, B, C +! -------------- +! + ZB(:,KKB) = PRHODJ(:,KKB)/PTSTEP & + + ZRHODJ_DFDT_O_DZ(:,KKB+KKL) * 0.5*PIMPL + ZC(:,KKB) = ZRHODJ_DFDT_O_DZ(:,KKB+KKL) * 0.5*PIMPL + + DO JK=2+JPVEXT,SIZE(ZY,2)-JPVEXT-1 + ZA(:,JK) = - ZRHODJ_DFDT_O_DZ(:,JK ) * 0.5*PIMPL + ZB(:,JK) = PRHODJ(:,JK)/PTSTEP & + + ZRHODJ_DFDT_O_DZ(:,JK+KKL) * 0.5*PIMPL & + - ZRHODJ_DFDT_O_DZ(:,JK ) * 0.5*PIMPL + ZC(:,JK) = ZRHODJ_DFDT_O_DZ(:,JK+KKL) * 0.5*PIMPL + END DO + + ZA(:,KKE) = - ZRHODJ_DFDT_O_DZ(:,KKE ) * 0.5*PIMPL + ZB(:,KKE) = PRHODJ(:,KKE)/PTSTEP & + - ZRHODJ_DFDT_O_DZ(:,KKE ) * 0.5*PIMPL +! +!* 3.2 going up +! -------- +! + ZBET(:) = ZB(:,KKB) ! bet = b(KKB) + PVARP(:,KKB) = ZY(:,KKB) / ZBET(:) + + ! + DO JK = KKB+KKL,KKE-KKL,KKL + ZGAM(:,JK) = ZC(:,JK-KKL) / ZBET(:) + ! gam(k) = c(k-1) / bet + ZBET(:) = ZB(:,JK) - ZA(:,JK) * ZGAM(:,JK) + ! bet = b(k) - a(k)* gam(k) + PVARP(:,JK)= ( ZY(:,JK) - ZA(:,JK) * PVARP(:,JK-KKL) ) / ZBET(:) + ! res(k) = (y(k) -a(k)*res(k-1))/ bet + END DO + ! special treatment for the last level + ZGAM(:,KKE) = ZC(:,KKE-KKL) / ZBET(:) + ! gam(k) = c(k-1) / bet + ZBET(:) = ZB(:,KKE) - ZA(:,KKE) * ZGAM(:,KKE) + ! bet = b(k) - a(k)* gam(k) + PVARP(:,KKE)= ( ZY(:,KKE) - ZA(:,KKE) * PVARP(:,KKE-KKL) ) / ZBET(:) + ! res(k) = (y(k) -a(k)*res(k-1))/ bet +! +!* 3.3 going down +! ---------- +! + DO JK = KKE-KKL,KKB,-KKL + PVARP(:,JK) = PVARP(:,JK) - ZGAM(:,JK+KKL) * PVARP(:,JK+KKL) + END DO +! +! +ELSE + !!! EXPLICIT FORMULATION + ! + DO JK=1+JPVEXT,SIZE(PVARP,2)-JPVEXT + PVARP(:,JK) = ZY(:,JK) * PTSTEP / PRHODJ(:,JK) + ENDDO + ! +END IF +! +! +!* 4. FILL THE UPPER AND LOWER EXTERNAL VALUES +! ---------------------------------------- +! +PVARP(:,KKA)=PVARP(:,KKB) +PVARP(:,KKU)=PVARP(:,KKE) +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE TRIDIAG_MASSFLUX diff --git a/src/mesonh/turb/tridiag_thermo.f90 b/src/mesonh/turb/tridiag_thermo.f90 new file mode 100644 index 000000000..2a02b6346 --- /dev/null +++ b/src/mesonh/turb/tridiag_thermo.f90 @@ -0,0 +1,297 @@ +!MNH_LIC Copyright 2003-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ################### + MODULE MODI_TRIDIAG_THERMO +! ################### +INTERFACE +! + SUBROUTINE TRIDIAG_THERMO(KKA,KKU,KKL,PVARM,PF,PDFDDTDZ,PTSTEP,PIMPL, & + PDZZ,PRHODJ,PVARP ) +! +INTEGER, INTENT(IN) :: KKA !near ground array index +INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=AR +REAL, DIMENSION(:,:,:), INTENT(IN) :: PVARM ! variable at t-1 at mass point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PF ! flux in dT/dt=-dF/dz at flux point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDFDDTDZ! dF/d(dT/dz) at flux point +REAL, INTENT(IN) :: PTSTEP ! Double time step +REAL, INTENT(IN) :: PIMPL ! implicit weight +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! Dz at flux point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! (dry rho)*J at mass point +! +REAL, DIMENSION(:,:,:), INTENT(OUT):: PVARP ! variable at t+1 at mass point +! +END SUBROUTINE TRIDIAG_THERMO +! +END INTERFACE +! +END MODULE MODI_TRIDIAG_THERMO +! +! +! + +! ################################################# + SUBROUTINE TRIDIAG_THERMO(KKA,KKU,KKL,PVARM,PF,PDFDDTDZ,PTSTEP,PIMPL, & + PDZZ,PRHODJ,PVARP ) +! ################################################# +! +! +!!**** *TRIDIAG_THERMO* - routine to solve a time implicit scheme +!! +!! +!! PURPOSE +!! ------- +! The purpose of this routine is to give a field PVARP at t+1, by +! solving an implicit TRIDIAGonal system obtained by the +! discretization of the vertical turbulent diffusion. It should be noted +! that the degree of implicitness can be varied (PIMPL parameter) and that +! the function of F(dT/dz) must have been linearized. +! PVARP is localized at a mass point. +! +!!** METHOD +!! ------ +!! +!! [T(+) - T(-)]/2Dt = -d{ F + dF/d(dT/dz) * [impl*dT/dz(+) + expl* dT/dz(-)] }/dz +!! +!! It is discretized as follows: +!! +!! PRHODJ(k)*PVARP(k)/PTSTEP +!! = +!! PRHODJ(k)*PVARM(k)/PTSTEP +!! - (PRHODJ(k+1)+PRHODJ(k) )/2. * PF(k+1)/PDZZ(k+1) +!! + (PRHODJ(k) +PRHODJ(k-1))/2. * PF(k) /PDZZ(k) +!! + (PRHODJ(k+1)+PRHODJ(k) )/2. * ZEXPL* PDFDDTDZ(k+1) * PVARM(k+1)/PDZZ(k+1)**2 +!! - (PRHODJ(k+1)+PRHODJ(k) )/2. * PIMPL* PDFDDTDZ(k+1) * PVARP(k+1)/PDZZ(k+1)**2 +!! - (PRHODJ(k+1)+PRHODJ(k) )/2. * ZEXPL* PDFDDTDZ(k+1) * PVARM(k) /PDZZ(k+1)**2 +!! + (PRHODJ(k+1)+PRHODJ(k) )/2. * PIMPL* PDFDDTDZ(k+1) * PVARP(k) /PDZZ(k+1)**2 +!! - (PRHODJ(k) +PRHODJ(k-1))/2. * ZEXPL* PDFDDTDZ(k) * PVARM(k) /PDZZ(k)**2 +!! + (PRHODJ(k) +PRHODJ(k-1))/2. * PIMPL* PDFDDTDZ(k) * PVARP(k) /PDZZ(k)**2 +!! + (PRHODJ(k) +PRHODJ(k-1))/2. * ZEXPL* PDFDDTDZ(k) * PVARM(k-1)/PDZZ(k)**2 +!! - (PRHODJ(k) +PRHODJ(k-1))/2. * PIMPL* PDFDDTDZ(k) * PVARP(k-1)/PDZZ(k)**2 +!! +!! +!! The system to solve is: +!! +!! A*PVARP(k-1) + B*PVARP(k) + C*PVARP(k+1) = Y(k) +!! +!! +!! The RHS of the linear system in PVARP writes: +!! +!! y(k) = PRHODJ(k)*PVARM(k)/PTSTEP +!! - (PRHODJ(k+1)+PRHODJ(k) )/2. * PF(k+1)/PDZZ(k+1) +!! + (PRHODJ(k) +PRHODJ(k-1))/2. * PF(k) /PDZZ(k) +!! + (PRHODJ(k+1)+PRHODJ(k) )/2. * ZEXPL* PDFDDTDZ(k+1) * PVARM(k+1)/PDZZ(k+1)**2 +!! - (PRHODJ(k+1)+PRHODJ(k) )/2. * ZEXPL* PDFDDTDZ(k+1) * PVARM(k) /PDZZ(k+1)**2 +!! - (PRHODJ(k) +PRHODJ(k-1))/2. * ZEXPL* PDFDDTDZ(k) * PVARM(k) /PDZZ(k)**2 +!! + (PRHODJ(k) +PRHODJ(k-1))/2. * ZEXPL* PDFDDTDZ(k) * PVARM(k-1)/PDZZ(k)**2 +!! +!! +!! Then, the classical TRIDIAGonal algorithm is used to invert the +!! implicit operator. Its matrix is given by: +!! +!! ( b(ikb) c(ikb) 0 0 0 0 0 0 ) +!! ( 0 a(ikb+1) b(ikb+1) c(ikb+1) 0 ... 0 0 0 ) +!! ( 0 0 a(ikb+2) b(ikb+2) c(ikb+2). 0 0 0 ) +!! ....................................................................... +!! ( 0 ... 0 a(k) b(k) c(k) 0 ... 0 0 ) +!! ....................................................................... +!! ( 0 0 0 0 0 ...a(ike-1) b(ike-1) c(ike-1)) +!! ( 0 0 0 0 0 ... 0 a(ike) b(ike) ) +!! +!! ikb and ike represent the first and the last inner mass levels of the +!! model. The coefficients are: +!! +!! a(k) = + (PRHODJ(k) +PRHODJ(k-1))/2. * PIMPL* PDFDDTDZ(k) /PDZZ(k)**2 +!! b(k) = PRHODJ(k) / PTSTEP +!! - (PRHODJ(k+1)+PRHODJ(k) )/2. * PIMPL* PDFDDTDZ(k+1)/PDZZ(k+1)**2 +!! - (PRHODJ(k) +PRHODJ(k-1))/2. * PIMPL* PDFDDTDZ(k) /PDZZ(k)**2 +!! c(k) = + (PRHODJ(k+1)+PRHODJ(k) )/2. * PIMPL* PDFDDTDZ(k+1)/PDZZ(k+1)**2 +!! +!! for all k /= ikb or ike +!! +!! +!! b(ikb) = PRHODJ(ikb) / PTSTEP +!! -(PRHODJ(ikb+1)+PRHODJ(ikb))/2.*PIMPL*PDFDDTDZ(ikb+1)/PDZZ(ikb+1)**2 +!! c(ikb) = +(PRHODJ(ikb+1)+PRHODJ(ikb))/2.*PIMPL*PDFDDTDZ(ikb+1)/PDZZ(ikb+1)**2 +!! +!! b(ike) = PRHODJ(ike) / PTSTEP +!! -(PRHODJ(ike)+PRHODJ(ike-1))/2.*PIMPL*PDFDDTDZ(ike)/PDZZ(ike)**2 +!! a(ike) = +(PRHODJ(ike)+PRHODJ(ike-1))/2.*PIMPL*PDFDDTDZ(ike)/PDZZ(ike)**2 +!! +!! +!! EXTERNAL +!! -------- +!! +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! Press et al: Numerical recipes (1986) Cambridge Univ. Press +!! +!! AUTHOR +!! ------ +!! V. Masson * Meteo-France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 04/2003 (from tridiag.f90) +!! --------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! +USE MODD_PARAMETERS, ONLY : JPVEXT_TURB +! +USE MODI_SHUMAN +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments +! +INTEGER, INTENT(IN) :: KKA !near ground array index +INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO +REAL, DIMENSION(:,:,:), INTENT(IN) :: PVARM ! variable at t-1 at mass point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PF ! flux in dT/dt=-dF/dz at flux point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDFDDTDZ! dF/d(dT/dz) at flux point +REAL, INTENT(IN) :: PTSTEP ! Double time step +REAL, INTENT(IN) :: PIMPL ! implicit weight +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! Dz at flux point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! (dry rho)*J at mass point +! +REAL, DIMENSION(:,:,:), INTENT(OUT):: PVARP ! variable at t+1 at mass point +! +! +!* 0.2 declarations of local variables +! +REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2),SIZE(PVARM,3)) :: ZRHODJ_DFDDTDZ_O_DZ2 +REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2),SIZE(PVARM,3)) :: ZMZM_RHODJ +REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2),SIZE(PVARM,3)) :: ZA, ZB, ZC +REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2),SIZE(PVARM,3)) :: ZY ,ZGAM + ! RHS of the equation, 3D work array +REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2)) :: ZBET + ! 2D work array +INTEGER :: JK ! loop counter +INTEGER :: IKB,IKE ! inner vertical limits +INTEGER :: IKT ! array size in k direction +INTEGER :: IKTB,IKTE ! start, end of k loops in physical domain +! +! --------------------------------------------------------------------------- +! +!* 1. Preliminaries +! ------------- +! +IKT=SIZE(PVARM,3) +IKTB=1+JPVEXT_TURB +IKTE=IKT-JPVEXT_TURB +IKB=KKA+JPVEXT_TURB*KKL +IKE=KKU-JPVEXT_TURB*KKL + +! +ZMZM_RHODJ = MZM(PRHODJ) +ZRHODJ_DFDDTDZ_O_DZ2 = ZMZM_RHODJ*PDFDDTDZ/PDZZ**2 +! +ZA=0. +ZB=0. +ZC=0. +ZY=0. +! +! +!* 2. COMPUTE THE RIGHT HAND SIDE +! --------------------------- +! +ZY(:,:,IKB) = PRHODJ(:,:,IKB)*PVARM(:,:,IKB)/PTSTEP & + - ZMZM_RHODJ(:,:,IKB+KKL) * PF(:,:,IKB+KKL)/PDZZ(:,:,IKB+KKL) & + + ZMZM_RHODJ(:,:,IKB ) * PF(:,:,IKB )/PDZZ(:,:,IKB ) & + + ZRHODJ_DFDDTDZ_O_DZ2(:,:,IKB+KKL) * PIMPL * PVARM(:,:,IKB+KKL) & + - ZRHODJ_DFDDTDZ_O_DZ2(:,:,IKB+KKL) * PIMPL * PVARM(:,:,IKB ) +! + ZY(:,:,IKTB+1:IKTE-1) = PRHODJ(:,:,IKTB+1:IKTE-1)*PVARM(:,:,IKTB+1:IKTE-1)/PTSTEP & + - ZMZM_RHODJ(:,:,IKTB+1+KKL:IKTE-1+KKL) * PF(:,:,IKTB+1+KKL:IKTE-1+KKL)/PDZZ(:,:,IKTB+1+KKL:IKTE-1+KKL) & + + ZMZM_RHODJ(:,:,IKTB+1:IKTE-1 ) * PF(:,:,IKTB+1:IKTE-1 )/PDZZ(:,:,IKTB+1:IKTE-1 ) & + + ZRHODJ_DFDDTDZ_O_DZ2(:,:,IKTB+1+KKL:IKTE-1+KKL) * PIMPL * PVARM(:,:,IKTB+1+KKL:IKTE-1+KKL) & + - ZRHODJ_DFDDTDZ_O_DZ2(:,:,IKTB+1+KKL:IKTE-1+KKL) * PIMPL * PVARM(:,:,IKTB+1:IKTE-1 ) & + - ZRHODJ_DFDDTDZ_O_DZ2(:,:,IKTB+1:IKTE-1 ) * PIMPL * PVARM(:,:,IKTB+1:IKTE-1 ) & + + ZRHODJ_DFDDTDZ_O_DZ2(:,:,IKTB+1:IKTE-1 ) * PIMPL * PVARM(:,:,IKTB+1-KKL:IKTE-1-KKL) +! +ZY(:,:,IKE) = PRHODJ(:,:,IKE)*PVARM(:,:,IKE)/PTSTEP & + - ZMZM_RHODJ(:,:,IKE+KKL) * PF(:,:,IKE+KKL)/PDZZ(:,:,IKE+KKL) & + + ZMZM_RHODJ(:,:,IKE ) * PF(:,:,IKE )/PDZZ(:,:,IKE ) & + - ZRHODJ_DFDDTDZ_O_DZ2(:,:,IKE ) * PIMPL * PVARM(:,:,IKE ) & + + ZRHODJ_DFDDTDZ_O_DZ2(:,:,IKE ) * PIMPL * PVARM(:,:,IKE-KKL) +! +! +!* 3. INVERSION OF THE TRIDIAGONAL SYSTEM +! ----------------------------------- +! +IF ( PIMPL > 1.E-10 ) THEN +! +!* 3.1 arrays A, B, C +! -------------- +! + ZB(:,:,IKB) = PRHODJ(:,:,IKB)/PTSTEP & + - ZRHODJ_DFDDTDZ_O_DZ2(:,:,IKB+KKL) * PIMPL + ZC(:,:,IKB) = ZRHODJ_DFDDTDZ_O_DZ2(:,:,IKB+KKL) * PIMPL +! + ZA(:,:,IKTB+1:IKTE-1) = ZRHODJ_DFDDTDZ_O_DZ2(:,:,IKTB+1:IKTE-1) * PIMPL + ZB(:,:,IKTB+1:IKTE-1) = PRHODJ(:,:,IKTB+1:IKTE-1)/PTSTEP & + - ZRHODJ_DFDDTDZ_O_DZ2(:,:,IKTB+1+KKL:IKTE-1+KKL) * PIMPL & + - ZRHODJ_DFDDTDZ_O_DZ2(:,:,IKTB+1:IKTE-1) * PIMPL + ZC(:,:,IKTB+1:IKTE-1) = ZRHODJ_DFDDTDZ_O_DZ2(:,:,IKTB+1+KKL:IKTE-1+KKL) * PIMPL +! + ZA(:,:,IKE) = ZRHODJ_DFDDTDZ_O_DZ2(:,:,IKE ) * PIMPL + ZB(:,:,IKE) = PRHODJ(:,:,IKE)/PTSTEP & + - ZRHODJ_DFDDTDZ_O_DZ2(:,:,IKE ) * PIMPL +! +!* 3.2 going up +! -------- +! + ZBET(:,:) = ZB(:,:,IKB) ! bet = b(ikb) + PVARP(:,:,IKB) = ZY(:,:,IKB) / ZBET(:,:) + + ! + DO JK = IKB+KKL,IKE-KKL,KKL + ZGAM(:,:,JK) = ZC(:,:,JK-KKL) / ZBET(:,:) + ! gam(k) = c(k-1) / bet + ZBET(:,:) = ZB(:,:,JK) - ZA(:,:,JK) * ZGAM(:,:,JK) + ! bet = b(k) - a(k)* gam(k) + PVARP(:,:,JK)= ( ZY(:,:,JK) - ZA(:,:,JK) * PVARP(:,:,JK-KKL) ) / ZBET(:,:) + ! res(k) = (y(k) -a(k)*res(k-1))/ bet + END DO + ! special treatment for the last level + ZGAM(:,:,IKE) = ZC(:,:,IKE-KKL) / ZBET(:,:) + ! gam(k) = c(k-1) / bet + ZBET(:,:) = ZB(:,:,IKE) - ZA(:,:,IKE) * ZGAM(:,:,IKE) + ! bet = b(k) - a(k)* gam(k) + PVARP(:,:,IKE)= ( ZY(:,:,IKE) - ZA(:,:,IKE) * PVARP(:,:,IKE-KKL) ) / ZBET(:,:) + ! res(k) = (y(k) -a(k)*res(k-1))/ bet +! +!* 3.3 going down +! ---------- +! + DO JK = IKE-KKL,IKB,-1*KKL + PVARP(:,:,JK) = PVARP(:,:,JK) - ZGAM(:,:,JK+KKL) * PVARP(:,:,JK+KKL) + END DO +! +ELSE +! + PVARP(:,:,IKTB:IKTE) = ZY(:,:,IKTB:IKTE) * PTSTEP / PRHODJ(:,:,IKTB:IKTE) +! +END IF +! +! +!* 4. FILL THE UPPER AND LOWER EXTERNAL VALUES +! ---------------------------------------- +! +PVARP(:,:,KKA)=PVARP(:,:,IKB) +PVARP(:,:,KKU)=PVARP(:,:,IKE) +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE TRIDIAG_THERMO diff --git a/src/mesonh/turb/tridiag_tke.f90 b/src/mesonh/turb/tridiag_tke.f90 new file mode 100644 index 000000000..170f83f6c --- /dev/null +++ b/src/mesonh/turb/tridiag_tke.f90 @@ -0,0 +1,266 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 turb 2006/06/06 10:00:49 +!----------------------------------------------------------------- +! ########################## + MODULE MODI_TRIDIAG_TKE +! ########################## +INTERFACE +! + SUBROUTINE TRIDIAG_TKE(KKA,KKU,KKL,PVARM,PA,PTSTEP,PEXPL,PIMPL, & + PRHODJ,PSOURCE,PDIAG,PVARP ) +! +INTEGER, INTENT(IN) :: KKA !near ground array index +INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO +REAL, DIMENSION(:,:,:), INTENT(IN) :: PVARM ! variable at t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! upper diag. elements +REAL, INTENT(IN) :: PTSTEP ! Double time step +REAL, INTENT(IN) :: PEXPL,PIMPL ! weights of the temporal scheme +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! (dry rho)*J +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSOURCE ! source term of PVAR +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDIAG ! diagonal term linked to + ! the implicit dissipation +! +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PVARP ! variable at t+1 +! +END SUBROUTINE TRIDIAG_TKE +! +END INTERFACE +! +END MODULE MODI_TRIDIAG_TKE +! +! +! +! ######################################################## + SUBROUTINE TRIDIAG_TKE(KKA,KKU,KKL,PVARM,PA,PTSTEP,PEXPL,PIMPL, & + PRHODJ,PSOURCE,PDIAG,PVARP ) +! ######################################################## +! +! +!!**** *TRIDIAG_TKE* - routine to solve a time implicit scheme +!! +!! +!! PURPOSE +!! ------- +! The purpose of this routine is to give a field PVARP at t+1, by +! solving an implicit tridiagonal system obtained by the +! discretization of the vertical turbulent diffusion. It should be noted +! that the degree of implicitness can be varied (PIMPL parameter) and the +! sources of evolution other than the turbulent diffusion can be taken +! into account through the PSOURCE field. PVARP is localized at a mass +! point. +! +!!** METHOD +!! ------ +!! First, the Right Hand Side of the implicit equation is computed. +!! It is build as follows: +!! ZY = PVARM + PTSTEP*PSOURCE + DIFF_EXPLI +!! where PVARM is the variable at t-dt, PSOURCE the supplementary sources of +!! PVAR ( and not PVAR * PRHODJ !!) and DIFF_EXPLI is the explicit part +!! of the vertical turbulent diffusion. This operator is spatially +!! discretized as the implicit one, thus: +!! DIFF_EXPLI(k) = - PEXPL / PRHODJ(k) * +!! ( PA(k+1) * (PVARM(k+1) - PVARM(k) ) +!! -PA(k) * (PVARM(k) - PVARM(k-1)) ) +!! For the first level, only the upper part is considered, the lower one +!! is replaced by the turbulent surface flux (taken into account in the +!! PSOURCE(ikb) term). +!! DIFF_EXPLI(ikb) = - PEXPL / PRHODJ(ikb) * +!! ( PA(ikb+1) * (PVARM(ikb+1) - PVARM(ikb)) ) +!! For the last level, only the lower part is considered, the upper one +!! is replaced by the turbulent flux which is taken equal to 0 +!! (taken into account in the PSOURCE(ike) term). +!! +!! DIFF_EXPLI(ike) = + PEXPL / PRHODJ(ike) * +!! ( PA(ike) * (PVARM(ike) - PVARM(ike-1)) ) +!! +!! Then, the classical tridiagonal algorithm is used to invert the +!! implicit operator. Its matrix is given by: +!! +!! ( b(ikb) c(ikb) 0 0 0 0 0 0 ) +!! ( 0 a(ikb+1) b(ikb+1) c(ikb+1) 0 ... 0 0 0 ) +!! ( 0 0 a(ikb+2) b(ikb+2) c(ikb+2). 0 0 0 ) +!! ....................................................................... +!! ( 0 ... 0 a(k) b(k) c(k) 0 ... 0 0 ) +!! ....................................................................... +!! ( 0 0 0 0 0 ...a(ike-1) b(ike-1) c(ike-1)) +!! ( 0 0 0 0 0 ... 0 a(ike) b(ike) ) +!! +!! ikb and ike represent the first and the last inner mass levels of the +!! model. The coefficients are: +!! +!! a(k) = PIMPL * PA(k)/PRHODJ(k) +!! b(k) = 1 - PIMPL * PA(k)/PRHODJ(k) - PIMPL * PA(k+1)/PRHODJ(k) +!! c(k) = PIMPL * PA(k+1)/PRHODJ(k) +!! +!! for all k /= ikb or ike +!! +!! b(ikb) = 1 - PIMPL * PA(ikb+1)/PRHODJ(ikb) +!! c(ikb) = PIMPL * PA(ikb+1)/PRHODJ(ikb) +!! (discretization of the upper part of the implicit operator) +!! b(ike) = 1 - PIMPL * PA(ike)/PRHODJ(ike) +!! a(ike) = PIMPL * PA(ike)/PRHODJ(ike) +!! (discretization of the lower part of the implicit operator) +!! Finally, the marginal points are prescribed. +!! +!! All these computations are purely vertical and vectorizations are +!! easely achieved by processing all the verticals in parallel. +!! +!! EXTERNAL +!! -------- +!! +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! MODD_PARAMETERS +!! JPVEXT_TURB: number of vertical external points +!! +!! REFERENCE +!! --------- +!! Book 1 of Meso-NH documentation (chapter Turbulence) +!! Press et al: Numerical recipes (1986) Cambridge Univ. Press +!! +!! AUTHOR +!! ------ +!! Joan Cuxart * INM and Meteo-France * +!! +!! MODIFICATIONS +!! ------------- +!! Original August 29, 1994 +!! Modification : January 29, 1995 Algorithm written with two +!! local variables less +!! (Cuxart, Stein) August 21, 1995 Bug correction for PRHODJ +!! (Stein) November 16, 1995 new version +!! (Stein) February 28, 1995 no inversion in the explicit case +!! --------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! +USE MODD_PARAMETERS +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments +! +INTEGER, INTENT(IN) :: KKA !near ground array index +INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO +REAL, DIMENSION(:,:,:), INTENT(IN) :: PVARM ! variable at t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! upper diag. elements +REAL, INTENT(IN) :: PTSTEP ! Double time step +REAL, INTENT(IN) :: PEXPL,PIMPL ! weights of the temporal scheme +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! (dry rho)*J +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSOURCE ! source term of PVAR +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDIAG ! diagonal term linked to + ! the implicit dissipation +! +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PVARP ! variable at t+1 +! +!* 0.2 declarations of local variables +! +REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2),SIZE(PVARM,3)) :: ZY ,ZGAM + ! RHS of the equation, 3D work array +REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2)) :: ZBET + ! 2D work array +INTEGER :: JK ! loop counter +INTEGER :: IKB,IKE ! inner vertical limits +INTEGER :: IKT ! array size in k direction +INTEGER :: IKTB,IKTE ! start, end of k loops in physical domain +! +! --------------------------------------------------------------------------- +! +!* 1. COMPUTE THE RIGHT HAND SIDE +! --------------------------- +! +IKT=SIZE(PVARM,3) +IKTB=1+JPVEXT_TURB +IKTE=IKT-JPVEXT_TURB +IKB=KKA+JPVEXT_TURB*KKL +IKE=KKU-JPVEXT_TURB*KKL + +! +! +ZY(:,:,IKB) = PVARM(:,:,IKB) + PTSTEP*PSOURCE(:,:,IKB) - & + PEXPL / PRHODJ(:,:,IKB) * PA(:,:,IKB+KKL) * (PVARM(:,:,IKB+KKL) - PVARM(:,:,IKB)) +! +DO JK=IKTB+1,IKTE-1 + ZY(:,:,JK)= PVARM(:,:,JK) + PTSTEP*PSOURCE(:,:,JK) - & + PEXPL / PRHODJ(:,:,JK) * & + ( PVARM(:,:,JK-KKL)*PA(:,:,JK) & + -PVARM(:,:,JK)*(PA(:,:,JK)+PA(:,:,JK+KKL)) & + +PVARM(:,:,JK+KKL)*PA(:,:,JK+KKL) & + ) +END DO +! +ZY(:,:,IKE)= PVARM(:,:,IKE) + PTSTEP*PSOURCE(:,:,IKE) + & + PEXPL / PRHODJ(:,:,IKE) * PA(:,:,IKE) * (PVARM(:,:,IKE)-PVARM(:,:,IKE-KKL)) +! +! +!* 2. INVERSION OF THE TRIDIAGONAL SYSTEM +! ----------------------------------- +! +IF ( PIMPL > 1.E-10 ) THEN +! + ! + ! going up + ! + ZBET(:,:) = 1. + PIMPL * (PDIAG(:,:,IKB)-PA(:,:,IKB+KKL) / PRHODJ(:,:,IKB)) + ! bet = b(ikb) + PVARP(:,:,IKB) = ZY(:,:,IKB) / ZBET(:,:) + ! + DO JK = IKB+KKL,IKE-KKL,KKL + ZGAM(:,:,JK) = PIMPL * PA(:,:,JK) / PRHODJ(:,:,JK-KKL) / ZBET(:,:) + ! gam(k) = c(k-1) / bet + ZBET(:,:) = 1. + PIMPL * ( PDIAG(:,:,JK) - & + ( PA(:,:,JK) * (1. + ZGAM(:,:,JK)) & + + PA(:,:,JK+KKL) & + ) / PRHODJ(:,:,JK) & + ) ! bet = b(k) - a(k)* gam(k) + PVARP(:,:,JK)= ( ZY(:,:,JK) - PIMPL * PA(:,:,JK) / PRHODJ(:,:,JK) & + * PVARP(:,:,JK-KKL) & + ) / ZBET(:,:) + ! res(k) = (y(k) -a(k)*res(k-1))/ bet + END DO + ! special treatment for the last level + ZGAM(:,:,IKE) = PIMPL * PA(:,:,IKE) / PRHODJ(:,:,IKE-KKL) / ZBET(:,:) + ! gam(k) = c(k-1) / bet + ZBET(:,:) = 1. + PIMPL * ( PDIAG(:,:,IKE) - & + ( PA(:,:,IKE) * (1. + ZGAM(:,:,IKE)) ) / PRHODJ(:,:,IKE) & + ) + ! bet = b(k) - a(k)* gam(k) + PVARP(:,:,IKE)= ( ZY(:,:,IKE) - PIMPL * PA(:,:,IKE) / PRHODJ(:,:,IKE) & + * PVARP(:,:,IKE-KKL) & + ) / ZBET(:,:) + ! res(k) = (y(k) -a(k)*res(k-1))/ bet + ! + ! going down + ! + DO JK = IKE-KKL,IKB,-1*KKL + PVARP(:,:,JK) = PVARP(:,:,JK) - ZGAM(:,:,JK+KKL) * PVARP(:,:,JK+KKL) + END DO +! +ELSE +! + PVARP(:,:,IKTB:IKTE) = ZY(:,:,IKTB:IKTE) +! +END IF +! +! +!* 3. FILL THE UPPER AND LOWER EXTERNAL VALUES +! ---------------------------------------- +! +PVARP(:,:,KKA)=PVARP(:,:,IKB) +PVARP(:,:,KKU)=PVARP(:,:,IKE) +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE TRIDIAG_TKE diff --git a/src/mesonh/turb/tridiag_wind.f90 b/src/mesonh/turb/tridiag_wind.f90 new file mode 100644 index 000000000..5dc35f1b1 --- /dev/null +++ b/src/mesonh/turb/tridiag_wind.f90 @@ -0,0 +1,267 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +! $Source$ $Revision$ +! MASDEV4_7 turb 2006/06/06 09:36:38 +!----------------------------------------------------------------- +! ######################## + MODULE MODI_TRIDIAG_WIND +! ######################## +INTERFACE +! + SUBROUTINE TRIDIAG_WIND(KKA,KKU,KKL,PVARM,PA,PCOEFS,PTSTEP,PEXPL,PIMPL, & + PRHODJA,PSOURCE,PVARP ) +! +INTEGER, INTENT(IN) :: KKA !near ground array index +INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=AR +REAL, DIMENSION(:,:,:), INTENT(IN) :: PVARM ! variable at t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! upper diag. elements +REAL, DIMENSION(:,:), INTENT(IN) :: PCOEFS ! implicit coeff for the + ! surface flux +REAL, INTENT(IN) :: PTSTEP ! Double time step +REAL, INTENT(IN) :: PEXPL,PIMPL ! weights of the temporal scheme +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJA ! (dry rho)*J averaged +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSOURCE ! source term of PVAR +! +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PVARP ! variable at t+1 +! +END SUBROUTINE TRIDIAG_WIND +! +END INTERFACE +! +END MODULE MODI_TRIDIAG_WIND +! +! +! +! ############################################################# + SUBROUTINE TRIDIAG_WIND(KKA,KKU,KKL,PVARM,PA,PCOEFS,PTSTEP,PEXPL,PIMPL, & + PRHODJA,PSOURCE,PVARP ) +! ############################################################# +! +! +!!**** *TRIDIAG_WIND* - routine to solve a time implicit scheme +!! +!! +!! PURPOSE +!! ------- +! The purpose of this routine is to give a field PVARP at t+1, by +! solving an implicit tridiagonal system obtained by the +! discretization of the vertical turbulent diffusion. It should be noted +! that the degree of implicitness can be varied (PIMPL parameter) and the +! sources of evolution other than the turbulent diffusion can be taken +! into account through the PSOURCE field. PVARP is localized at a wind +! point either U or V, PRHODJA is averaged to be localized at the same +! point. The surface flux is also implicitly computed. +! +!!** METHOD +!! ------ +!! First, the Right Hand Side of the implicit equation is computed. +!! It is build as follows: +!! ZY = PVARM + PTSTEP*PSOURCE + DIFF_EXPLI +!! where PVARM is the variable at t-dt, PSOURCE the supplementary sources of +!! PVAR ( and not PVAR * PRHODJA !!) and DIFF_EXPLI is the explicit part +!! of the vertical turbulent diffusion. This operator is spatially +!! discretized as the implicit one, thus: +!! DIFF_EXPLI(k) = - PEXPL / PRHODJA(k) * +!! ( PA(k+1) * (PVARM(k+1) - PVARM(k) ) +!! -PA(k) * (PVARM(k) - PVARM(k-1)) ) +!! For the first level, only the upper part is considered, the lower one +!! is replaced by the turbulent surface flux (taken into account in the +!! PSOURCE(ikb) term). +!! DIFF_EXPLI(ikb) = - PEXPL / PRHODJA(ikb) * +!! ( PA(ikb+1) * (PVARM(ikb+1) - PVARM(ikb)) ) +!! For the last level, only the lower part is considered, the upper one +!! is replaced by the turbulent flux which is taken equal to 0 +!! (taken into account in the PSOURCE(ike) term). +!! +!! DIFF_EXPLI(ike) = + PEXPL / PRHODJA(ike) * +!! ( PA(ike) * (PVARM(ike) - PVARM(ike-1)) ) +!! +!! Then, the classical tridiagonal algorithm is used to invert the +!! implicit operator. Its matrix is given by: +!! +!! ( b(ikb) c(ikb) 0 0 0 0 0 0 ) +!! ( 0 a(ikb+1) b(ikb+1) c(ikb+1) 0 ... 0 0 0 ) +!! ( 0 0 a(ikb+2) b(ikb+2) c(ikb+2). 0 0 0 ) +!! ....................................................................... +!! ( 0 ... 0 a(k) b(k) c(k) 0 ... 0 0 ) +!! ....................................................................... +!! ( 0 0 0 0 0 ...a(ike-1) b(ike-1) c(ike-1)) +!! ( 0 0 0 0 0 ... 0 a(ike) b(ike) ) +!! +!! ikb and ike represent the first and the last inner mass levels of the +!! model. The coefficients are: +!! +!! a(k) = PIMPL * PA(k)/PRHODJA(k) +!! b(k) = 1 - PIMPL * PA(k)/PRHODJA(k) - PIMPL * PA(k+1)/PRHODJA(k) +!! c(k) = PIMPL * PA(k+1)/PRHODJA(k) +!! +!! for all k /= ikb or ike +!! +!! b(ikb) = 1 - PIMPL * PA(ikb+1)/PRHODJA(ikb) - PIMPL * PCOEFS +!! c(ikb) = PIMPL * PA(ikb+1)/PRHODJA(ikb) +!! (discretization of the upper part of the implicit operator) +!! b(ike) = 1 - PIMPL * PA(ike)/PRHODJA(ike) +!! a(ike) = PIMPL * PA(ike)/PRHODJA(ike) +!! (discretization of the lower part of the implicit operator) +!! +!! The surface flux is given by: +!! <w'u'> = <w'u'>EXPL + PIMPL * PCOEFS * PVARP +!! The explicit part is taken into account in PSOURCE(ikb) and the +!! implicit one is present in the LHS of the equation in b(ikb) +!! +!! Finally, the marginal points are prescribed. +!! +!! All these computations are purely vertical and vectorizations are +!! easely achieved by processing all the verticals in parallel. +!! +!! EXTERNAL +!! -------- +!! +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! MODD_PARAMETERS +!! JPVEXT_TURB: number of vertical external points +!! +!! REFERENCE +!! --------- +!! Book 1 of Meso-NH documentation (chapter Turbulence) +!! Press et al: Numerical recipes (1986) Cambridge Univ. Press +!! +!! AUTHOR +!! ------ +!! Joel Stein * Meteo-France * +!! +!! MODIFICATIONS +!! ------------- +!! Original November 16, 1995 +!! (Stein) February 28, 1995 no inversion in the explicit case +!! (Seity) February 2012 add possibility to run with reversed +!! vertical levels +!! --------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! +USE MODD_PARAMETERS +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments +! +INTEGER, INTENT(IN) :: KKA !near ground array index +INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO +REAL, DIMENSION(:,:,:), INTENT(IN) :: PVARM ! variable at t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! upper diag. elements +REAL, DIMENSION(:,:), INTENT(IN) :: PCOEFS ! implicit coeff for the + ! surface flux +REAL, INTENT(IN) :: PTSTEP ! Double time step +REAL, INTENT(IN) :: PEXPL,PIMPL ! weights of the temporal scheme +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJA ! (dry rho)*J averaged +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSOURCE ! source term of PVAR +! +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PVARP ! variable at t+1 +! +!* 0.2 declarations of local variables +! +REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2),SIZE(PVARM,3)) :: ZY ,ZGAM + ! RHS of the equation, 3D work array +REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2)) :: ZBET + ! 2D work array +INTEGER :: JK ! loop counter +INTEGER :: IKB,IKE ! inner vertical limits +INTEGER :: IKT ! array size in k direction +INTEGER :: IKTB,IKTE ! start, end of k loops in physical domain +! +! --------------------------------------------------------------------------- +! +!* 1. COMPUTE THE RIGHT HAND SIDE +! --------------------------- +! +IKT=SIZE(PVARM,3) +IKTB=1+JPVEXT_TURB +IKTE=IKT-JPVEXT_TURB +IKB=KKA+JPVEXT_TURB*KKL +IKE=KKU-JPVEXT_TURB*KKL + +! +! +ZY(:,:,IKB) = PVARM(:,:,IKB) + PTSTEP*PSOURCE(:,:,IKB) - & + PEXPL / PRHODJA(:,:,IKB) * PA(:,:,IKB+KKL) * (PVARM(:,:,IKB+KKL) - PVARM(:,:,IKB)) +! + ZY(:,:,IKTB+1:IKTE-1)= PVARM(:,:,IKTB+1:IKTE-1) + PTSTEP*PSOURCE(:,:,IKTB+1:IKTE-1) - & + PEXPL / PRHODJA(:,:,IKTB+1:IKTE-1) * & + ( PVARM(:,:,IKTB+1-KKL:IKTE-1-KKL)*PA(:,:,IKTB+1:IKTE-1) & + -PVARM(:,:,IKTB+1:IKTE-1)*(PA(:,:,IKTB+1:IKTE-1)+PA(:,:,IKTB+1+KKL:IKTE-1+KKL)) & + +PVARM(:,:,IKTB+1+KKL:IKTE-1+KKL)*PA(:,:,IKTB+1+KKL:IKTE-1+KKL) & + ) +! +ZY(:,:,IKE)= PVARM(:,:,IKE) + PTSTEP*PSOURCE(:,:,IKE) + & + PEXPL / PRHODJA(:,:,IKE) * PA(:,:,IKE) * (PVARM(:,:,IKE)-PVARM(:,:,IKE-KKL)) +! +! +!* 2. INVERSION OF THE TRIDIAGONAL SYSTEM +! ----------------------------------- +! +IF ( PIMPL > 1.E-10 ) THEN +! + ! + ! going up + ! + ZBET(:,:) = 1. - PIMPL * ( PA(:,:,IKB+KKL) / PRHODJA(:,:,IKB) & + + PCOEFS(:,:) * PTSTEP ) ! bet = b(ikb) + PVARP(:,:,IKB) = ZY(:,:,IKB) / ZBET(:,:) + ! + DO JK = IKB+KKL,IKE-KKL,KKL + ZGAM(:,:,JK) = PIMPL * PA(:,:,JK) / PRHODJA(:,:,JK-KKL) / ZBET(:,:) + ! gam(k) = c(k-1) / bet + ZBET(:,:) = 1. - PIMPL * ( PA(:,:,JK) * (1. + ZGAM(:,:,JK)) & + + PA(:,:,JK+KKL) & + ) / PRHODJA(:,:,JK) + ! bet = b(k) - a(k)* gam(k) + PVARP(:,:,JK)= ( ZY(:,:,JK) - PIMPL * PA(:,:,JK) / PRHODJA(:,:,JK) & + * PVARP(:,:,JK-KKL) & + ) / ZBET(:,:) + ! res(k) = (y(k) -a(k)*res(k-1))/ bet + END DO + ! special treatment for the last level + ZGAM(:,:,IKE) = PIMPL * PA(:,:,IKE) / PRHODJA(:,:,IKE-KKL) / ZBET(:,:) + ! gam(k) = c(k-1) / bet + ZBET(:,:) = 1. - PIMPL * ( PA(:,:,IKE) * (1. + ZGAM(:,:,IKE)) & + ) / PRHODJA(:,:,IKE) + ! bet = b(k) - a(k)* gam(k) + PVARP(:,:,IKE)= ( ZY(:,:,IKE) - PIMPL * PA(:,:,IKE) / PRHODJA(:,:,IKE) & + * PVARP(:,:,IKE-KKL) & + ) / ZBET(:,:) + ! res(k) = (y(k) -a(k)*res(k-1))/ bet + ! + ! going down + ! + DO JK = IKE-KKL,IKB,-1*KKL + PVARP(:,:,JK) = PVARP(:,:,JK) - ZGAM(:,:,JK+KKL) * PVARP(:,:,JK+KKL) + END DO +! +ELSE +! + PVARP(:,:,IKTB:IKTE) = ZY(:,:,IKTB:IKTE) +! +END IF +! +! +!* 3. FILL THE UPPER AND LOWER EXTERNAL VALUES +! ---------------------------------------- +! +PVARP(:,:,KKA)=PVARP(:,:,IKB) +PVARP(:,:,KKU)=PVARP(:,:,IKE) +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE TRIDIAG_WIND diff --git a/src/mesonh/turb/turb.f90 b/src/mesonh/turb/turb.f90 new file mode 100644 index 000000000..228241e2c --- /dev/null +++ b/src/mesonh/turb/turb.f90 @@ -0,0 +1,1876 @@ +!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ################ + MODULE MODI_TURB +! ################ +! +INTERFACE +! + SUBROUTINE TURB(KKA, KKU, KKL, KMI,KRR,KRRL,KRRI,HLBCX,HLBCY, & + KSPLIT,KMODEL_CL, & + OTURB_FLX,OTURB_DIAG,OSUBG_COND,ORMC01, & + HTURBDIM,HTURBLEN,HTOM,HTURBLEN_CL,HCLOUD,PIMPL, & + PTSTEP,TPFILE,PDXX,PDYY,PDZZ,PDZX,PDZY,PZZ, & + PDIRCOSXW,PDIRCOSYW,PDIRCOSZW,PCOSSLOPE,PSINSLOPE, & + PRHODJ,PTHVREF, & + PSFTH,PSFRV,PSFSV,PSFU,PSFV, & + PPABST,PUT,PVT,PWT,PTKET,PSVT,PSRCT, & + PBL_DEPTH, PSBL_DEPTH, & + PCEI,PCEI_MIN,PCEI_MAX,PCOEF_AMPL_SAT, & + PTHLT,PRT, & + PRUS,PRVS,PRWS,PRTHLS,PRRS,PRSVS,PRTKES,PRTKEMS,PSIGS,& + PFLXZTHVMF,PWTH,PWRC,PWSV,PDYP,PTHP,PTR,PDISS,PLEM ) + +! +USE MODD_IO, ONLY: TFILEDATA +! +INTEGER, INTENT(IN) :: KKA !near ground array index +INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=AR +INTEGER, INTENT(IN) :: KMI ! model index number +INTEGER, INTENT(IN) :: KRR ! number of moist var. +INTEGER, INTENT(IN) :: KRRL ! number of liquid water var. +INTEGER, INTENT(IN) :: KRRI ! number of ice water var. +CHARACTER(LEN=*),DIMENSION(:),INTENT(IN):: HLBCX, HLBCY ! X- and Y-direc LBC +INTEGER, INTENT(IN) :: KSPLIT ! number of time-splitting +INTEGER, INTENT(IN) :: KMODEL_CL ! model number for cloud mixing length +LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the + ! turbulent fluxes in the syncronous FM-file +LOGICAL, INTENT(IN) :: OTURB_DIAG ! switch to write some + ! diagnostic fields in the syncronous FM-file +LOGICAL, INTENT(IN) :: OSUBG_COND ! switch for SUBGrid + ! CONDensation +LOGICAL, INTENT(IN) :: ORMC01 ! switch for RMC01 lengths in SBL +CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! dimensionality of the + ! turbulence scheme +CHARACTER(len=4), INTENT(IN) :: HTURBLEN ! kind of mixing length +CHARACTER(len=4), INTENT(IN) :: HTOM ! kind of Third Order Moment +CHARACTER(len=4), INTENT(IN) :: HTURBLEN_CL ! kind of cloud mixing length + ! surface friction flux +REAL, INTENT(IN) :: PIMPL ! degree of implicitness +CHARACTER (LEN=4), INTENT(IN) :: HCLOUD ! Kind of microphysical scheme +REAL, INTENT(IN) :: PTSTEP ! timestep +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ,PDZX,PDZY + ! metric coefficients +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! physical distance +! between 2 succesive grid points along the K direction +REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSXW, PDIRCOSYW, PDIRCOSZW +! Director Cosinus along x, y and z directions at surface w-point +REAL, DIMENSION(:,:), INTENT(IN) :: PCOSSLOPE ! cosinus of the angle + ! between i and the slope vector +REAL, DIMENSION(:,:), INTENT(IN) :: PSINSLOPE ! sinus of the angle + ! between i and the slope vector +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry density * Grid size +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! Virtual Potential + ! Temperature of the reference state +! +REAL, DIMENSION(:,:), INTENT(IN) :: PSFTH,PSFRV, & +! normal surface fluxes of theta and Rv + PSFU,PSFV +! normal surface fluxes of (u,v) parallel to the orography +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSFSV +! normal surface fluxes of Scalar var. +! +! prognostic variables at t- deltat +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! Pressure at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PUT,PVT,PWT ! wind components +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKET ! TKE +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT ! passive scal. var. +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCT ! Second-order flux + ! s'rc'/2Sigma_s2 at time t-1 multiplied by Lambda_3 +REAL, DIMENSION(:,:), INTENT(INOUT) :: PBL_DEPTH ! BL depth for TOMS +REAL, DIMENSION(:,:), INTENT(INOUT) :: PSBL_DEPTH ! SBL depth for RMC01 +! +! +! variables for cloud mixing length +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCEI ! Cloud Entrainment instability + ! index to emphasize localy + ! turbulent fluxes +REAL, INTENT(IN) :: PCEI_MIN ! minimum threshold for the instability index CEI +REAL, INTENT(IN) :: PCEI_MAX ! maximum threshold for the instability index CEI +REAL, INTENT(IN) :: PCOEF_AMPL_SAT ! saturation of the amplification coefficient +! thermodynamical variables which are transformed in conservative var. +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHLT ! conservative pot. temp. +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRT ! water var. where + ! PRT(:,:,:,1) is the conservative mixing ratio +! +! sources of momentum, conservative potential temperature, Turb. Kin. Energy, +! TKE dissipation +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS,PRVS,PRWS,PRTHLS,PRTKES +! Source terms for all water kinds, PRRS(:,:,:,1) is used for the conservative +! mixing ratio +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRTKEMS +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS +! Source terms for all passive scalar variables +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS +! Sigma_s at time t+1 : square root of the variance of the deviation to the +! saturation +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSIGS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFLXZTHVMF +! MF contribution for vert. turb. transport +! used in the buoy. prod. of TKE +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWTH ! heat flux +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWRC ! cloud water flux +REAL, DIMENSION(:,:,:,:),INTENT(OUT) :: PWSV ! scalar flux +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDYP ! Dynamical production of TKE +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTHP ! Thermal production of TKE +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTR ! Transport production of TKE +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDISS ! Dissipation of TKE +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLEM ! Mixing length + +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE TURB +! +END INTERFACE +! +END MODULE MODI_TURB +! +! ################################################################# + SUBROUTINE TURB(KKA, KKU, KKL, KMI,KRR,KRRL,KRRI,HLBCX,HLBCY, & + KSPLIT,KMODEL_CL, & + OTURB_FLX,OTURB_DIAG,OSUBG_COND,ORMC01, & + HTURBDIM,HTURBLEN,HTOM,HTURBLEN_CL,HCLOUD,PIMPL, & + PTSTEP,TPFILE,PDXX,PDYY,PDZZ,PDZX,PDZY,PZZ, & + PDIRCOSXW,PDIRCOSYW,PDIRCOSZW,PCOSSLOPE,PSINSLOPE, & + PRHODJ,PTHVREF, & + PSFTH,PSFRV,PSFSV,PSFU,PSFV, & + PPABST,PUT,PVT,PWT,PTKET,PSVT,PSRCT, & + PBL_DEPTH, PSBL_DEPTH, & + PCEI,PCEI_MIN,PCEI_MAX,PCOEF_AMPL_SAT, & + PTHLT,PRT, & + PRUS,PRVS,PRWS,PRTHLS,PRRS,PRSVS,PRTKES,PRTKEMS,PSIGS,& + PFLXZTHVMF,PWTH,PWRC,PWSV,PDYP,PTHP,PTR,PDISS,PLEM ) +! ################################################################# +! +! +!!**** *TURB* - computes the turbulent source terms for the prognostic +!! variables. +!! +!! PURPOSE +!! ------- +!!**** The purpose of this routine is to compute the source terms in +!! the evolution equations due to the turbulent mixing. +!! The source term is computed as the divergence of the turbulent fluxes. +!! The cartesian fluxes are obtained by a one and a half order closure, based +!! on a prognostic equation for the Turbulence Kinetic Energy( TKE ). The +!! system is closed by prescribing a turbulent mixing length. Different +!! choices are available for this length. +! +!!** METHOD +!! ------ +!! +!! The dimensionality of the turbulence parameterization can be chosen by +!! means of the parameter HTURBDIM: +!! * HTURBDIM='1DIM' the parameterization is 1D but can be used in +!! 3D , 2D or 1D simulations. Only the sources associated to the vertical +!! turbulent fluxes are taken into account. +!! * HTURBDIM='3DIM' the parameterization is fully 2D or 3D depending +!! on the model dimensionality. Of course, it does not make any sense to +!! activate this option with a 1D model. +!! +!! The following steps are made: +!! 1- Preliminary computations. +!! 2- The metric coefficients are recovered from the grid knowledge. +!! 3- The mixing length is computed according to its choice: +!! * HTURBLEN='BL89' the Bougeault and Lacarrere algorithm is used. +!! The mixing length is given by the vertical displacement from its +!! original level of an air particule having an initial internal +!! energy equal to its TKE and stopped by the buoyancy forces. +!! The discrete formulation is second order accurate. +!! * HTURBLEN='DELT' the mixing length is given by the mesh size +!! depending on the model dimensionality, this length is limited +!! with the ground distance. +!! * HTURBLEN='DEAR' the mixing length is given by the mesh size +!! depending on the model dimensionality, this length is limited +!! with the ground distance and also by the Deardorff mixing length +!! pertinent in the stable cases. +!! * HTURBLEN='KEPS' the mixing length is deduced from the TKE +!! dissipation, which becomes a prognostic variable of the model ( +!! Duynkerke formulation). +!! 3'- The cloud mixing length is computed according to HTURBLEN_CLOUD +!! and emphasized following the CEI index +!! 4- The conservative variables are computed along with Lv/Cp. +!! 5- The turbulent Prandtl numbers are computed from the resolved fields +!! and TKE +!! 6- The sources associated to the vertical turbulent fluxes are computed +!! with a temporal scheme allowing a degree of implicitness given by +!! PIMPL, varying from PIMPL=0. ( purely explicit scheme) to PIMPL=1. +!! ( purely implicit scheme) +!! The sources associated to the horizontal fluxes are computed with a +!! purely explicit temporal scheme. These sources are only computed when +!! the turbulence parameterization is 2D or 3D( HTURBDIM='3DIM' ). +!! 7- The sources for TKE are computed, along with the dissipation of TKE +!! if HTURBLEN='KEPS'. +!! 8- Some turbulence-related quantities are stored in the synchronous +!! FM-file. +!! 9- The non-conservative variables are retrieved. +!! +!! +!! The saving of the fields in the synchronous FM-file is controlled by: +!! * OTURB_FLX => saves all the turbulent fluxes and correlations +!! * OTURB_DIAG=> saves the turbulent Prandtl and Schmidt numbers, the +!! source terms of TKE and dissipation of TKE +!! +!! EXTERNAL +!! -------- +!! SUBROUTINE PRANDTL : computes the turbulent Prandtl number +!! SUBROUTINE TURB_VER : computes the sources from the vertical fluxes +!! SUBROUTINE TURB_HOR : computes the sources from the horizontal fluxes +!! SUBROUTINE TKE_EPS_SOURCES : computes the sources for TKE and its +!! dissipation +!! SUBROUTINE BUDGET : computes and stores the budgets +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! MODD_PARAMETERS : JPVEXT number of marginal vertical points +!! +!! MODD_CONF : CCONF model configuration (start/restart) +!! L1D switch for 1D model version +!! L2D switch for 2D model version +!! +!! MODD_CST : contains physical constants +!! XG gravity constant +!! XRD Gas constant for dry air +!! XRV Gas constant for vapor +!! +!! MODD_CTURB : contains turbulence scheme constants +!! XCMFS,XCED to compute the dissipation mixing length +!! XTKEMIN minimum values for the TKE +!! XLINI,XLINF to compute Bougeault-Lacarrere mixing +!! length +!! Module MODD_BUDGET: +!! NBUMOD +!! CBUTYPE +!! LBU_RU +!! LBU_RV +!! LBU_RW +!! LBU_RTH +!! LBU_RSV1 +!! LBU_RRV +!! LBU_RRC +!! LBU_RRR +!! LBU_RRI +!! LBU_RRS +!! LBU_RRG +!! LBU_RRH +!! +!! REFERENCE +!! --------- +!! Book 2 of documentation (routine TURB) +!! Book 1 of documentation (Chapter: Turbulence) +!! +!! AUTHOR +!! ------ +!! Joan Cuxart * INM and Meteo-France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 05/10/94 +!! Modifications: Feb 14, 1995 (J.Cuxart and J.Stein) +!! Doctorization and Optimization +!! Modifications: March 21, 1995 (J.M. Carriere) +!! Introduction of cloud water +!! Modifications: June 1, 1995 (J.Cuxart ) +!! take min(Kz,delta) +!! Modifications: June 1, 1995 (J.Stein J.Cuxart) +!! remove unnecessary arrays and change Prandtl +!! and Schmidt numbers localizations +!! Modifications: July 20, 1995 (J.Stein) remove MODI_ground_ocean + +!! TZDTCUR + MODD_TIME because they are not used +!! change RW in RNP for the outputs +!! Modifications: August 21, 1995 (Ph. Bougeault) +!! take min(K(z-zsol),delta) +!! Modifications: Sept 14, 1995 (Ph Bougeault, J. Cuxart) +!! second order BL89 mixing length computations + add Deardorff length +!! in the Delta case for stable cases +!! Modifications: Sept 19, 1995 (J. Stein, J. Cuxart) +!! define a DEAR case for the mixing length, add MODI_BUDGET and change +!! some BUDGET calls, add LES tools +!! Modifications: Oct 16, 1995 (J. Stein) change the budget calls +!! Modifications: Feb 28, 1996 (J. Stein) optimization + +!! remove min(K(z-zsol),delta)+ +!! bug in the tangential fluxes +!! Modifications: Oct 16, 1996 (J. Stein) change the subgrid condensation +!! scheme + temporal discretization +!! Modifications: Dec 19, 1996 (J.-P. Pinty) update the budget calls +!! Jun 22, 1997 (J. Stein) use the absolute pressure and +!! change the Deardorf length at the surface +!! Modifications: Apr 27, 1997 (V. Masson) BL89 mix. length computed in +!! a separate routine +!! Oct 13, 1999 (J. Stein) switch for the tgt fluxes +!! Jun 24, 1999 (P Jabouille) Add routine UPDATE_ROTATE_WIND +!! Feb 15, 2001 (J. Stein) remove tgt fluxes +!! Mar 8, 2001 (V. Masson) forces the same behaviour near the surface +!! for all mixing lengths +!! Nov 06, 2002 (V. Masson) LES budgets +!! Nov, 2002 (V. Masson) implement modifications of +!! mixing and dissipative lengths +!! near the surface (according +!! Redelsperger et al 2001) +!! Apr, 2003 (V. Masson) bug in Blackadar length +!! bug in LES in 1DIM case +!! Feb 20, 2003 (J.-P. Pinty) Add reversible ice processes +!! May,26 2004 (P Jabouille) coef for computing dissipative heating +!! Sept 2004 (M.Tomasini) Cloud Mixing length modification +!! following the instability +!! criterium CEI calculated in modeln +!! May 2006 Remove KEPS +!! Sept.2006 (I.Sandu): Modification of the stability criterion for +!! DEAR (theta_v -> theta_l) +!! Oct 2007 (J.Pergaud) Add MF contribution for vert. turb. transport +!! Oct.2009 (C.Lac) Introduction of different PTSTEP according to the +!! advection schemes +!! October 2009 (G. Tanguy) add ILENCH=LEN(YCOMMENT) after +!! change of YCOMMENT +!! 06/2011 (J.escobar ) Bypass Bug with ifort11/12 on HLBCX,HLBC +!! 2012-02 Y. Seity, add possibility to run with reversed +!! vertical levels +!! 10/2012 (J. Colin) Correct bug in DearDoff for dry simulations +!! 10/2012 J.Escobar Bypass PGI bug , redefine some allocatable array inplace of automatic +!! 04/2016 (C.Lac) correction of negativity for KHKO +! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O +! Q. Rodier 01/2018: introduction of RM17 +! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine +! P. Wautelet 02/2020: use the new data structures and subroutines for budgets +! B. Vie 03/2020: LIMA negativity checks after turbulence, advection and microphysics budgets +! P. Wautelet 11/06/2020: bugfix: correct PRSVS array indices +! P. Wautelet + Benoit Vié 06/2020: improve removal of negative scalar variables + adapt the corresponding budgets +! P. Wautelet 30/06/2020: move removal of negative scalar variables to Sources_neg_correct +! R. Honnert/V. Masson 02/2021: new mixing length in the grey zone +! J.L. Redelsperger 03/2021: add Ocean LES case +! -------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +use modd_budget, only: lbudget_u, lbudget_v, lbudget_w, lbudget_th, lbudget_rv, lbudget_rc, & + lbudget_rr, lbudget_ri, lbudget_rs, lbudget_rg, lbudget_rh, lbudget_sv, & + NBUDGET_U, NBUDGET_V, NBUDGET_W, NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, & + NBUDGET_RR, NBUDGET_RI, NBUDGET_RS, NBUDGET_RG, NBUDGET_RH, NBUDGET_SV1, & + tbudgets +USE MODD_CONF +USE MODD_CST +USE MODD_CTURB +USE MODD_DYN_n, ONLY : LOCEAN +use modd_field, only: tfielddata, TYPEREAL +USE MODD_IO, ONLY: TFILEDATA +USE MODD_LES +USE MODD_NSV +USE MODD_PARAMETERS, ONLY: JPVEXT_TURB +USE MODD_PARAM_LIMA +USE MODD_TURB_n, ONLY: XCADAP +! +USE MODI_GRADIENT_M +USE MODI_GRADIENT_U +USE MODI_GRADIENT_V +USE MODI_BL89 +USE MODI_TURB_VER +USE MODI_ROTATE_WIND +USE MODI_TURB_HOR_SPLT +USE MODI_TKE_EPS_SOURCES +USE MODI_SHUMAN +USE MODI_GRADIENT_M +USE MODI_LES_MEAN_SUBGRID +USE MODI_RMC01 +USE MODI_GRADIENT_W +USE MODI_TM06 +USE MODI_UPDATE_LM +USE MODI_GET_HALO +! +use mode_budget, only: Budget_store_init, Budget_store_end +USE MODE_IO_FIELD_WRITE, only: IO_Field_write +USE MODE_SBL +use mode_sources_neg_correct, only: Sources_neg_correct +! +USE MODI_EMOIST +USE MODI_ETHETA +! +USE MODI_SECOND_MNH +! +USE MODD_IBM_PARAM_n, ONLY: LIBM, XIBM_LS, XIBM_XMUT +USE MODI_IBM_MIXINGLENGTH +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments +! +! +! +INTEGER, INTENT(IN) :: KKA !near ground array index +INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO +INTEGER, INTENT(IN) :: KMI ! model index number +INTEGER, INTENT(IN) :: KRR ! number of moist var. +INTEGER, INTENT(IN) :: KRRL ! number of liquid water var. +INTEGER, INTENT(IN) :: KRRI ! number of ice water var. +CHARACTER(LEN=*),DIMENSION(:),INTENT(IN):: HLBCX, HLBCY ! X- and Y-direc LBC +INTEGER, INTENT(IN) :: KSPLIT ! number of time-splitting +INTEGER, INTENT(IN) :: KMODEL_CL ! model number for cloud mixing length +LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the + ! turbulent fluxes in the syncronous FM-file +LOGICAL, INTENT(IN) :: OTURB_DIAG ! switch to write some + ! diagnostic fields in the syncronous FM-file +LOGICAL, INTENT(IN) :: OSUBG_COND ! switch for SUBGrid + ! CONDensation +LOGICAL, INTENT(IN) :: ORMC01 ! switch for RMC01 lengths in SBL +CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! dimensionality of the + ! turbulence scheme +CHARACTER(len=4), INTENT(IN) :: HTURBLEN ! kind of mixing length +CHARACTER(len=4), INTENT(IN) :: HTOM ! kind of Third Order Moment +CHARACTER(len=4), INTENT(IN) :: HTURBLEN_CL ! kind of cloud mixing length +REAL, INTENT(IN) :: PIMPL ! degree of implicitness +CHARACTER (LEN=4), INTENT(IN) :: HCLOUD ! Kind of microphysical scheme +REAL, INTENT(IN) :: PTSTEP ! timestep +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ,PDZX,PDZY + ! metric coefficients +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! physical distance +! between 2 succesive grid points along the K direction +REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSXW, PDIRCOSYW, PDIRCOSZW +! Director Cosinus along x, y and z directions at surface w-point +REAL, DIMENSION(:,:), INTENT(IN) :: PCOSSLOPE ! cosinus of the angle + ! between i and the slope vector +REAL, DIMENSION(:,:), INTENT(IN) :: PSINSLOPE ! sinus of the angle + ! between i and the slope vector +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry density * Grid size +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! Virtual Potential + ! Temperature of the reference state +! +REAL, DIMENSION(:,:), INTENT(IN) :: PSFTH,PSFRV, & +! normal surface fluxes of theta and Rv + PSFU,PSFV +! normal surface fluxes of (u,v) parallel to the orography +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSFSV +! normal surface fluxes of Scalar var. +! +! prognostic variables at t- deltat +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! Pressure at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PUT,PVT,PWT ! wind components +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKET ! TKE +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT ! passive scal. var. +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCT ! Second-order flux + ! s'rc'/2Sigma_s2 at time t-1 multiplied by Lambda_3 +REAL, DIMENSION(:,:), INTENT(INOUT) :: PBL_DEPTH ! BL height for TOMS +REAL, DIMENSION(:,:), INTENT(INOUT) :: PSBL_DEPTH ! SBL depth for RMC01 +! +! variables for cloud mixing length +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCEI ! Cloud Entrainment instability + ! index to emphasize localy + ! turbulent fluxes +REAL, INTENT(IN) :: PCEI_MIN ! minimum threshold for the instability index CEI +REAL, INTENT(IN) :: PCEI_MAX ! maximum threshold for the instability index CEI +REAL, INTENT(IN) :: PCOEF_AMPL_SAT ! saturation of the amplification coefficient +! +! thermodynamical variables which are transformed in conservative var. +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHLT ! conservative pot. temp. +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRT ! water var. where + ! PRT(:,:,:,1) is the conservative mixing ratio +! +! sources of momentum, conservative potential temperature, Turb. Kin. Energy, +! TKE dissipation +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS,PRVS,PRWS,PRTHLS,PRTKES +! Source terms for all water kinds, PRRS(:,:,:,1) is used for the conservative +! mixing ratio +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRTKEMS +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS +! Source terms for all passive scalar variables +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS +! Sigma_s at time t+1 : square root of the variance of the deviation to the +! saturation +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSIGS +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFLXZTHVMF +! MF contribution for vert. turb. transport +! used in the buoy. prod. of TKE +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWTH ! heat flux +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWRC ! cloud water flux +REAL, DIMENSION(:,:,:,:),INTENT(OUT) :: PWSV ! scalar flux +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDYP ! Dynamical production of TKE +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTHP ! Thermal production of TKE +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTR ! Transport production of TKE +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDISS ! Dissipation of TKE +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLEM ! Mixing length +! +! +!------------------------------------------------------------------------------- +! +! 0.2 declaration of local variables +! +REAL, ALLOCATABLE, DIMENSION(:,:,:) ::& + ZCP, & ! Cp at t-1 + ZEXN, & ! EXN at t-1 + ZT, & ! T at t-1 + ZLOCPEXNM, & ! Lv/Cp/EXNREF at t-1 + ZLMW, & ! Turbulent mixing length (work array) + ZLEPS, & ! Dissipative length + ZTRH, & ! Dynamic and Thermal Production of TKE + ZATHETA,ZAMOIST, & ! coefficients for s = f (Thetal,Rnp) + ZCOEF_DISS, & ! 1/(Cph*Exner) for dissipative heating + ZFRAC_ICE, & ! ri fraction of rc+ri + ZMWTH,ZMWR,ZMTH2,ZMR2,ZMTHR,& ! 3rd order moments + ZFWTH,ZFWR,ZFTH2,ZFR2,ZFTHR,& ! opposite of verticale derivate of 3rd order moments + ZTHLM, ZTR, ZDISS ! initial potential temp. +REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: & + ZRM ! initial mixing ratio +REAL, ALLOCATABLE, DIMENSION(:,:) :: ZTAU11M,ZTAU12M, & + ZTAU22M,ZTAU33M, & + ! tangential surface fluxes in the axes following the orography + ZUSLOPE,ZVSLOPE, & + ! wind components at the first mass level parallel + ! to the orography + ZCDUEFF, & + ! - Cd*||u|| where ||u|| is the module of the wind tangential to + ! orography (ZUSLOPE,ZVSLOPE) at the surface. + ZUSTAR, ZLMO, & + ZRVM, ZSFRV + ! friction velocity, Monin Obuhkov length, work arrays for vapor +! + ! Virtual Potential Temp. used + ! in the Deardorff mixing length computation +REAL, DIMENSION(:,:,:), ALLOCATABLE :: & + ZLVOCPEXNM,ZLSOCPEXNM, & ! Lv/Cp/EXNREF and Ls/Cp/EXNREF at t-1 + ZATHETA_ICE,ZAMOIST_ICE ! coefficients for s = f (Thetal,Rnp) +! +REAL :: ZEXPL ! 1-PIMPL deg of expl. +REAL :: ZRVORD ! RV/RD +! +INTEGER :: IKB,IKE ! index value for the +! Beginning and the End of the physical domain for the mass points +INTEGER :: IKT ! array size in k direction +INTEGER :: IKTB,IKTE ! start, end of k loops in physical domain +INTEGER :: JRR,JK,JSV ! loop counters +INTEGER :: JI,JJ ! loop counters +REAL :: ZL0 ! Max. Mixing Length in Blakadar formula +REAL :: ZALPHA ! work coefficient : + ! - proportionnality constant between Dz/2 and +! ! BL89 mixing length near the surface +! +REAL :: ZTIME1, ZTIME2 +REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)):: ZTT,ZEXNE,ZLV,ZLS,ZCPH,ZCOR +REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)):: ZSHEAR, ZDUDZ, ZDVDZ +TYPE(TFIELDDATA) :: TZFIELD +! +!------------------------------------------------------------------------------------------ +ALLOCATE ( & + ZCP(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & + ZEXN(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & + ZT(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & + ZLOCPEXNM(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & + ZLMW(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & + ZLEPS(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & + ZTRH(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & + ZATHETA(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & + ZAMOIST(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & + ZCOEF_DISS(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & + ZFRAC_ICE(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & + ZMWTH(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & + ZMWR(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & + ZMTH2(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & + ZMR2(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & + ZMTHR(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & + ZFWTH(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & + ZFWR(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & + ZFTH2(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & + ZFR2(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & + ZFTHR(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & + ZTHLM(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) ) + +ALLOCATE ( ZRM(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3),SIZE(PRT,4)) ) + +ALLOCATE ( & + ZTAU11M(SIZE(PTHLT,1),SIZE(PTHLT,2)), & + ZTAU12M(SIZE(PTHLT,1),SIZE(PTHLT,2)), & + ZTAU22M(SIZE(PTHLT,1),SIZE(PTHLT,2)), & + ZTAU33M(SIZE(PTHLT,1),SIZE(PTHLT,2)), & + ZUSLOPE(SIZE(PTHLT,1),SIZE(PTHLT,2)), & + ZVSLOPE(SIZE(PTHLT,1),SIZE(PTHLT,2)), & + ZCDUEFF(SIZE(PTHLT,1),SIZE(PTHLT,2)), & + ZUSTAR(SIZE(PTHLT,1),SIZE(PTHLT,2)), & + ZLMO(SIZE(PTHLT,1),SIZE(PTHLT,2)), & + ZRVM(SIZE(PTHLT,1),SIZE(PTHLT,2)), & + ZSFRV(SIZE(PTHLT,1),SIZE(PTHLT,2)) ) + +!------------------------------------------------------------------------------------------ +! +!* 1.PRELIMINARIES +! ------------- +! +!* 1.1 Set the internal domains, ZEXPL +! +! +IKT=SIZE(PTHLT,3) +IKTB=1+JPVEXT_TURB +IKTE=IKT-JPVEXT_TURB +IKB=KKA+JPVEXT_TURB*KKL +IKE=KKU-JPVEXT_TURB*KKL +! +ZEXPL = 1.- PIMPL +ZRVORD= XRV / XRD +! +! +!Copy data into ZTHLM and ZRM only if needed +IF (HTURBLEN=='BL89' .OR. HTURBLEN=='RM17' .OR. ORMC01) THEN + ZTHLM(:,:,:) = PTHLT(:,:,:) + ZRM(:,:,:,:) = PRT(:,:,:,:) +END IF +! +! +! +!---------------------------------------------------------------------------- +! +!* 2. COMPUTE CONSERVATIVE VARIABLES AND RELATED QUANTITIES +! ----------------------------------------------------- +! +!* 2.1 Cph at t +! +ZCP(:,:,:)=XCPD +! +IF (KRR > 0) ZCP(:,:,:) = ZCP(:,:,:) + XCPV * PRT(:,:,:,1) +DO JRR = 2,1+KRRL ! loop on the liquid components + ZCP(:,:,:) = ZCP(:,:,:) + XCL * PRT(:,:,:,JRR) +END DO +! +DO JRR = 2+KRRL,1+KRRL+KRRI ! loop on the solid components + ZCP(:,:,:) = ZCP(:,:,:) + XCI * PRT(:,:,:,JRR) +END DO +! +!* 2.2 Exner function at t +! +IF (LOCEAN) THEN + ZEXN(:,:,:) = 1. +ELSE + ZEXN(:,:,:) = (PPABST(:,:,:)/XP00) ** (XRD/XCPD) +END IF +! +!* 2.3 dissipative heating coeff a t +! +ZCOEF_DISS(:,:,:) = 1/(ZCP(:,:,:) * ZEXN(:,:,:)) +! +! +ZFRAC_ICE(:,:,:) = 0.0 +ZATHETA(:,:,:) = 0.0 +ZAMOIST(:,:,:) = 0.0 +! +IF (KRRL >=1) THEN +! +!* 2.4 Temperature at t +! + ZT(:,:,:) = PTHLT(:,:,:) * ZEXN(:,:,:) +! +!* 2.5 Lv/Cph/Exn +! + IF ( KRRI >= 1 ) THEN + ALLOCATE(ZLVOCPEXNM(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3))) + ALLOCATE(ZLSOCPEXNM(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3))) + ALLOCATE(ZAMOIST_ICE(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3))) + ALLOCATE(ZATHETA_ICE(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3))) +! + CALL COMPUTE_FUNCTION_THERMO(XALPW,XBETAW,XGAMW,XLVTT,XCL,ZT,ZEXN,ZCP, & + ZLVOCPEXNM,ZAMOIST,ZATHETA) + CALL COMPUTE_FUNCTION_THERMO(XALPI,XBETAI,XGAMI,XLSTT,XCI,ZT,ZEXN,ZCP, & + ZLSOCPEXNM,ZAMOIST_ICE,ZATHETA_ICE) +! + WHERE(PRT(:,:,:,2)+PRT(:,:,:,4)>0.0) + ZFRAC_ICE(:,:,:) = PRT(:,:,:,4) / ( PRT(:,:,:,2)+PRT(:,:,:,4) ) + END WHERE +! + ZLOCPEXNM(:,:,:) = (1.0-ZFRAC_ICE(:,:,:))*ZLVOCPEXNM(:,:,:) & + +ZFRAC_ICE(:,:,:) *ZLSOCPEXNM(:,:,:) + ZAMOIST(:,:,:) = (1.0-ZFRAC_ICE(:,:,:))*ZAMOIST(:,:,:) & + +ZFRAC_ICE(:,:,:) *ZAMOIST_ICE(:,:,:) + ZATHETA(:,:,:) = (1.0-ZFRAC_ICE(:,:,:))*ZATHETA(:,:,:) & + +ZFRAC_ICE(:,:,:) *ZATHETA_ICE(:,:,:) + + DEALLOCATE(ZAMOIST_ICE) + DEALLOCATE(ZATHETA_ICE) + ELSE + CALL COMPUTE_FUNCTION_THERMO(XALPW,XBETAW,XGAMW,XLVTT,XCL,ZT,ZEXN,ZCP, & + ZLOCPEXNM,ZAMOIST,ZATHETA) + END IF +! +! + IF ( tpfile%lopened .AND. OTURB_DIAG ) THEN + TZFIELD%CMNHNAME = 'ATHETA' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'ATHETA' + TZFIELD%CUNITS = 'm' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_ATHETA' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZATHETA) +! + TZFIELD%CMNHNAME = 'AMOIST' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'AMOIST' + TZFIELD%CUNITS = 'm' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_AMOIST' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZAMOIST) + END IF +! +ELSE + ZLOCPEXNM=0. +END IF ! loop end on KRRL >= 1 +! +! computes conservative variables +! +IF ( KRRL >= 1 ) THEN + IF ( KRRI >= 1 ) THEN + ! Rnp at t + PRT(:,:,:,1) = PRT(:,:,:,1) + PRT(:,:,:,2) + PRT(:,:,:,4) + PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,2) + PRRS(:,:,:,4) + ! Theta_l at t + PTHLT(:,:,:) = PTHLT(:,:,:) - ZLVOCPEXNM(:,:,:) * PRT(:,:,:,2) & + - ZLSOCPEXNM(:,:,:) * PRT(:,:,:,4) + PRTHLS(:,:,:) = PRTHLS(:,:,:) - ZLVOCPEXNM(:,:,:) * PRRS(:,:,:,2) & + - ZLSOCPEXNM(:,:,:) * PRRS(:,:,:,4) + ELSE + ! Rnp at t + PRT(:,:,:,1) = PRT(:,:,:,1) + PRT(:,:,:,2) + PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,2) + ! Theta_l at t + PTHLT(:,:,:) = PTHLT(:,:,:) - ZLOCPEXNM(:,:,:) * PRT(:,:,:,2) + PRTHLS(:,:,:) = PRTHLS(:,:,:) - ZLOCPEXNM(:,:,:) * PRRS(:,:,:,2) + END IF +END IF +! +!---------------------------------------------------------------------------- +! +!* 3. MIXING LENGTH : SELECTION AND COMPUTATION +! ----------------------------------------- +! +! +SELECT CASE (HTURBLEN) +! +!* 3.1 BL89 mixing length +! ------------------ + + CASE ('BL89') + ZSHEAR=0. + CALL BL89(KKA,KKU,KKL,PZZ,PDZZ,PTHVREF,ZTHLM,KRR,ZRM,PTKET,ZSHEAR,PLEM) +! +!* 3.2 RM17 mixing length +! ------------------ + + CASE ('RM17') + ZDUDZ = MXF(MZF(GZ_U_UW(PUT,PDZZ))) + ZDVDZ = MYF(MZF(GZ_V_VW(PVT,PDZZ))) + ZSHEAR = SQRT(ZDUDZ*ZDUDZ + ZDVDZ*ZDVDZ) + CALL BL89(KKA,KKU,KKL,PZZ,PDZZ,PTHVREF,ZTHLM,KRR,ZRM,PTKET,ZSHEAR,PLEM) +! +!* 3.3 Grey-zone combined RM17 & Deardorff mixing lengths +! -------------------------------------------------- + + CASE ('ADAP') + ZDUDZ = MXF(MZF(GZ_U_UW(PUT,PDZZ))) + ZDVDZ = MYF(MZF(GZ_V_VW(PVT,PDZZ))) + ZSHEAR = SQRT(ZDUDZ*ZDUDZ + ZDVDZ*ZDVDZ) + CALL BL89(KKA,KKU,KKL,PZZ,PDZZ,PTHVREF,ZTHLM,KRR,ZRM,PTKET,ZSHEAR,PLEM) + + CALL DELT(ZLMW,ODZ=.FALSE.) + ! The minimum mixing length is chosen between Horizontal grid mesh (not taking into account the vertical grid mesh) and RM17. + ! For large horizontal grid meshes, this is equal to RM17 + ! For LES grid meshes, this is equivalent to Deardorff : the base mixing lentgh is the horizontal grid mesh, + ! and it is limited by a stability-based length (RM17), as was done in Deardorff length (but taking into account shear as well) + ! For grid meshes in the grey zone, then this is the smaller of the two. + PLEM = MIN(PLEM,XCADAP*ZLMW) +! +!* 3.4 Delta mixing length +! ------------------- +! + CASE ('DELT') + CALL DELT(PLEM,ODZ=.TRUE.) +! +!* 3.5 Deardorff mixing length +! ----------------------- +! + CASE ('DEAR') + CALL DEAR(PLEM) +! +!* 3.6 Blackadar mixing length +! ----------------------- +! + CASE ('BLKR') + ZL0 = 100. + PLEM(:,:,:) = ZL0 + + ZALPHA=0.5**(-1.5) + ! + DO JK=IKTB,IKTE + PLEM(:,:,JK) = ( 0.5*(PZZ(:,:,JK)+PZZ(:,:,JK+KKL)) - & + & PZZ(:,:,KKA+JPVEXT_TURB*KKL) ) * PDIRCOSZW(:,:) + PLEM(:,:,JK) = ZALPHA * PLEM(:,:,JK) * ZL0 / ( ZL0 + ZALPHA*PLEM(:,:,JK) ) + END DO +! + PLEM(:,:,IKTB-1) = PLEM(:,:,IKTB) + PLEM(:,:,IKTE+1) = PLEM(:,:,IKTE) +! +! +! +END SELECT +! +! +! +!* 3.5 Mixing length modification for cloud +! ----------------------- +IF (KMODEL_CL==KMI .AND. HTURBLEN_CL/='NONE') CALL CLOUD_MODIF_LM + +! +!* 3.6 Dissipative length +! ------------------ +! +ZLEPS(:,:,:)=PLEM(:,:,:) +! +!* 3.7 Correction in the Surface Boundary Layer (Redelsperger 2001) +! ---------------------------------------- +! +ZLMO=XUNDEF +IF (ORMC01) THEN + ZUSTAR=(PSFU**2+PSFV**2)**(0.25) + IF (KRR>0) THEN + ZLMO=LMO(ZUSTAR,ZTHLM(:,:,IKB),ZRM(:,:,IKB,1),PSFTH,PSFRV) + ELSE + ZRVM=0. + ZSFRV=0. + ZLMO=LMO(ZUSTAR,ZTHLM(:,:,IKB),ZRVM,PSFTH,ZSFRV) + END IF + CALL RMC01(HTURBLEN,KKA,KKU,KKL,PZZ,PDXX,PDYY,PDZZ,PDIRCOSZW,PSBL_DEPTH,ZLMO,PLEM,ZLEPS) +END IF +! +!RMC01 is only applied on RM17 in ADAP +IF (HTURBLEN=='ADAP') ZLEPS = MIN(ZLEPS,ZLMW*XCADAP) +! +!* 3.8 Mixing length in external points (used if HTURBDIM="3DIM") +! ---------------------------------------------------------- +! +IF (HTURBDIM=="3DIM") THEN + CALL UPDATE_LM(HLBCX,HLBCY,PLEM,ZLEPS) +END IF +! +!* 3.9 Mixing length correction if immersed walls +! ------------------------------------------ +! +IF (LIBM) THEN + CALL IBM_MIXINGLENGTH(PLEM,ZLEPS,XIBM_XMUT,XIBM_LS(:,:,:,1),PTKET) +ENDIF +!---------------------------------------------------------------------------- +! +!* 4. GO INTO THE AXES FOLLOWING THE SURFACE +! -------------------------------------- +! +! +!* 4.1 rotate the wind at time t +! +! +! + IF (CPROGRAM/='AROME ') THEN + CALL ROTATE_WIND(PUT,PVT,PWT, & + PDIRCOSXW, PDIRCOSYW, PDIRCOSZW, & + PCOSSLOPE,PSINSLOPE, & + PDXX,PDYY,PDZZ, & + ZUSLOPE,ZVSLOPE ) +! + CALL UPDATE_ROTATE_WIND(ZUSLOPE,ZVSLOPE) + ELSE + ZUSLOPE=PUT(:,:,KKA) + ZVSLOPE=PVT(:,:,KKA) + END IF +! +! +!* 4.2 compute the proportionality coefficient between wind and stress +! + ZCDUEFF(:,:) =-SQRT ( (PSFU(:,:)**2 + PSFV(:,:)**2) / & + (XMNH_TINY + ZUSLOPE(:,:)**2 + ZVSLOPE(:,:)**2 ) ) +! +!* 4.6 compute the surface tangential fluxes +! +ZTAU11M(:,:) =2./3.*( (1.+ (PZZ (:,:,IKB+KKL)-PZZ (:,:,IKB)) & + /(PDZZ(:,:,IKB+KKL)+PDZZ(:,:,IKB)) & + ) *PTKET(:,:,IKB) & + -0.5 *PTKET(:,:,IKB+KKL) & + ) +ZTAU12M(:,:) =0.0 +ZTAU22M(:,:) =ZTAU11M(:,:) +ZTAU33M(:,:) =ZTAU11M(:,:) +! +!* 4.7 third order terms in temperature and water fluxes and correlations +! ------------------------------------------------------------------ +! +! +ZMWTH = 0. ! w'2th' +ZMWR = 0. ! w'2r' +ZMTH2 = 0. ! w'th'2 +ZMR2 = 0. ! w'r'2 +ZMTHR = 0. ! w'th'r' + +IF (HTOM=='TM06') THEN + CALL TM06(KKA,KKU,KKL,PTHVREF,PBL_DEPTH,PZZ,PSFTH,ZMWTH,ZMTH2) +! + ZFWTH = -GZ_M_W(KKA,KKU,KKL,ZMWTH,PDZZ) ! -d(w'2th' )/dz + !ZFWR = -GZ_M_W(KKA,KKU,KKL,ZMWR, PDZZ) ! -d(w'2r' )/dz + ZFTH2 = -GZ_W_M(ZMTH2,PDZZ) ! -d(w'th'2 )/dz + !ZFR2 = -GZ_W_M(ZMR2, PDZZ) ! -d(w'r'2 )/dz + !ZFTHR = -GZ_W_M(ZMTHR,PDZZ) ! -d(w'th'r')/dz +! + ZFWTH(:,:,IKTE:) = 0. + ZFWTH(:,:,:IKTB) = 0. + !ZFWR (:,:,IKTE:) = 0. + !ZFWR (:,:,:IKTB) = 0. + ZFWR = 0. + ZFTH2(:,:,IKTE:) = 0. + ZFTH2(:,:,:IKTB) = 0. + !ZFR2 (:,:,IKTE:) = 0. + !ZFR2 (:,:,:IKTB) = 0. + ZFR2 = 0. + !ZFTHR(:,:,IKTE:) = 0. + !ZFTHR(:,:,:IKTB) = 0. + ZFTHR = 0. +ELSE + ZFWTH = 0. + ZFWR = 0. + ZFTH2 = 0. + ZFR2 = 0. + ZFTHR = 0. +ENDIF +! +!---------------------------------------------------------------------------- +! +!* 5. TURBULENT SOURCES +! ----------------- +! +if ( lbudget_u ) call Budget_store_init( tbudgets(NBUDGET_U ), 'VTURB', prus (:, :, :) ) +if ( lbudget_v ) call Budget_store_init( tbudgets(NBUDGET_V ), 'VTURB', prvs (:, :, :) ) +if ( lbudget_w ) call Budget_store_init( tbudgets(NBUDGET_W ), 'VTURB', prws (:, :, :) ) + +if ( lbudget_th ) then + if ( krri >= 1 .and. krrl >= 1 ) then + call Budget_store_init( tbudgets(NBUDGET_TH), 'VTURB', prthls(:, :, :) + zlvocpexnm(:, :, :) * prrs(:, :, :, 2) & + + zlsocpexnm(:, :, :) * prrs(:, :, :, 4) ) + else if ( krrl >= 1 ) then + call Budget_store_init( tbudgets(NBUDGET_TH), 'VTURB', prthls(:, :, :) + zlocpexnm(:, :, :) * prrs(:, :, :, 2) ) + else + call Budget_store_init( tbudgets(NBUDGET_TH), 'VTURB', prthls(:, :, :) ) + end if +end if + +if ( lbudget_rv ) then + if ( krri >= 1 .and. krrl >= 1 ) then + call Budget_store_init( tbudgets(NBUDGET_RV), 'VTURB', prrs(:, :, :, 1) - prrs(:, :, :, 2) - prrs(:, :, :, 4) ) + else if ( krrl >= 1 ) then + call Budget_store_init( tbudgets(NBUDGET_RV), 'VTURB', prrs(:, :, :, 1) - prrs(:, :, :, 2) ) + else + call Budget_store_init( tbudgets(NBUDGET_RV), 'VTURB', prrs(:, :, :, 1) ) + end if +end if + +if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'VTURB', prrs (:, :, :, 2) ) +if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), 'VTURB', prrs (:, :, :, 4) ) + +if ( lbudget_sv ) then + do jsv = 1, nsv + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + jsv), 'VTURB', prsvs(:, :, :, jsv) ) + end do +end if + +CALL TURB_VER(KKA,KKU,KKL,KRR, KRRL, KRRI, & + OTURB_FLX, & + HTURBDIM,HTOM,PIMPL,ZEXPL, & + PTSTEP,TPFILE, & + PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ, & + PCOSSLOPE,PSINSLOPE, & + PRHODJ,PTHVREF, & + PSFTH,PSFRV,PSFSV,PSFTH,PSFRV,PSFSV, & + ZCDUEFF,ZTAU11M,ZTAU12M,ZTAU33M, & + PUT,PVT,PWT,ZUSLOPE,ZVSLOPE,PTHLT,PRT,PSVT, & + PTKET,PLEM,ZLEPS, & + ZLOCPEXNM,ZATHETA,ZAMOIST,PSRCT,ZFRAC_ICE, & + ZFWTH,ZFWR,ZFTH2,ZFR2,ZFTHR,PBL_DEPTH, & + PSBL_DEPTH,ZLMO, & + PRUS,PRVS,PRWS,PRTHLS,PRRS,PRSVS, & + PDYP,PTHP,PSIGS,PWTH,PWRC,PWSV ) + +if ( lbudget_u ) call Budget_store_end( tbudgets(NBUDGET_U), 'VTURB', prus(:, :, :) ) +if ( lbudget_v ) call Budget_store_end( tbudgets(NBUDGET_V), 'VTURB', prvs(:, :, :) ) +if ( lbudget_w ) call Budget_store_end( tbudgets(NBUDGET_W), 'VTURB', prws(:, :, :) ) + +if ( lbudget_th ) then + if ( krri >= 1 .and. krrl >= 1 ) then + call Budget_store_end( tbudgets(NBUDGET_TH), 'VTURB', prthls(:, :, :) + zlvocpexnm(:, :, :) * prrs(:, :, :, 2) & + + zlsocpexnm(:, :, :) * prrs(:, :, :, 4) ) + else if ( krrl >= 1 ) then + call Budget_store_end( tbudgets(NBUDGET_TH), 'VTURB', prthls(:, :, :) + zlocpexnm(:, :, :) * prrs(:, :, :, 2) ) + else + call Budget_store_end( tbudgets(NBUDGET_TH), 'VTURB', prthls(:, :, :) ) + end if +end if + +if ( lbudget_rv ) then + if ( krri >= 1 .and. krrl >= 1 ) then + call Budget_store_end( tbudgets(NBUDGET_RV), 'VTURB', prrs(:, :, :, 1) - prrs(:, :, :, 2) - prrs(:, :, :, 4) ) + else if ( krrl >= 1 ) then + call Budget_store_end( tbudgets(NBUDGET_RV), 'VTURB', prrs(:, :, :, 1) - prrs(:, :, :, 2) ) + else + call Budget_store_end( tbudgets(NBUDGET_RV), 'VTURB', prrs(:, :, :, 1) ) + end if +end if + +if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'VTURB', prrs(:, :, :, 2) ) +if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'VTURB', prrs(:, :, :, 4) ) + +if ( lbudget_sv ) then + do jsv = 1, nsv + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + jsv), 'VTURB', prsvs(:, :, :, jsv) ) + end do +end if +! +if ( hturbdim == '3DIM' ) then + if ( lbudget_u ) call Budget_store_init( tbudgets(NBUDGET_U ), 'HTURB', prus (:, :, :) ) + if ( lbudget_v ) call Budget_store_init( tbudgets(NBUDGET_V ), 'HTURB', prvs (:, :, :) ) + if ( lbudget_w ) call Budget_store_init( tbudgets(NBUDGET_W ), 'HTURB', prws (:, :, :) ) + + if (lbudget_th) then + if ( krri >= 1 .and. krrl >= 1 ) then + call Budget_store_init( tbudgets(NBUDGET_TH), 'HTURB', prthls(:, :, :) + zlvocpexnm(:, :, :) * prrs(:, :, :, 2) & + + zlsocpexnm(:, :, :) * prrs(:, :, :, 4) ) + else if ( krrl >= 1 ) then + call Budget_store_init( tbudgets(NBUDGET_TH), 'HTURB', prthls(:, :, :) + zlocpexnm(:, :, :) * prrs(:, :, :, 2) ) + else + call Budget_store_init( tbudgets(NBUDGET_TH), 'HTURB', prthls(:, :, :) ) + end if + end if + + if ( lbudget_rv ) then + if ( krri >= 1 .and. krrl >= 1 ) then + call Budget_store_init( tbudgets(NBUDGET_RV), 'HTURB', prrs(:, :, :, 1) - prrs(:, :, :, 2) - prrs(:, :, :, 4) ) + else if ( krrl >= 1 ) then + call Budget_store_init( tbudgets(NBUDGET_RV), 'HTURB', prrs(:, :, :, 1) - prrs(:, :, :, 2) ) + else + call Budget_store_init( tbudgets(NBUDGET_RV), 'HTURB', prrs(:, :, :, 1) ) + end if + end if + + if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'HTURB', prrs(:, :, :, 2) ) + if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), 'HTURB', prrs(:, :, :, 4) ) + + if ( lbudget_sv ) then + do jsv = 1, nsv + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + jsv), 'HTURB', prsvs(:, :, :, jsv) ) + end do + end if + + CALL TURB_HOR_SPLT(KSPLIT, KRR, KRRL, KRRI, PTSTEP, & + HLBCX,HLBCY,OTURB_FLX,OSUBG_COND, & + TPFILE, & + PDXX,PDYY,PDZZ,PDZX,PDZY,PZZ, & + PDIRCOSXW,PDIRCOSYW,PDIRCOSZW, & + PCOSSLOPE,PSINSLOPE, & + PRHODJ,PTHVREF, & + PSFTH,PSFRV,PSFSV, & + ZCDUEFF,ZTAU11M,ZTAU12M,ZTAU22M,ZTAU33M, & + PUT,PVT,PWT,ZUSLOPE,ZVSLOPE,PTHLT,PRT,PSVT, & + PTKET,PLEM,ZLEPS, & + ZLOCPEXNM,ZATHETA,ZAMOIST,PSRCT,ZFRAC_ICE, & + PDYP,PTHP,PSIGS, & + ZTRH, & + PRUS,PRVS,PRWS,PRTHLS,PRRS,PRSVS ) + + if ( lbudget_u ) call Budget_store_end( tbudgets(NBUDGET_U), 'HTURB', prus(:, :, :) ) + if ( lbudget_v ) call Budget_store_end( tbudgets(NBUDGET_V), 'HTURB', prvs(:, :, :) ) + if ( lbudget_w ) call Budget_store_end( tbudgets(NBUDGET_W), 'HTURB', prws(:, :, :) ) + + if ( lbudget_th ) then + if ( krri >= 1 .and. krrl >= 1 ) then + call Budget_store_end( tbudgets(NBUDGET_TH), 'HTURB', prthls(:, :, :) + zlvocpexnm(:, :, :) * prrs(:, :, :, 2) & + + zlsocpexnm(:, :, :) * prrs(:, :, :, 4) ) + else if ( krrl >= 1 ) then + call Budget_store_end( tbudgets(NBUDGET_TH), 'HTURB', prthls(:, :, :) + zlocpexnm(:, :, :) * prrs(:, :, :, 2) ) + else + call Budget_store_end( tbudgets(NBUDGET_TH), 'HTURB', prthls(:, :, :) ) + end if + end if + + if ( lbudget_rv ) then + if ( krri >= 1 .and. krrl >= 1 ) then + call Budget_store_end( tbudgets(NBUDGET_RV), 'HTURB', prrs(:, :, :, 1) - prrs(:, :, :, 2) - prrs(:, :, :, 4) ) + else if ( krrl >= 1 ) then + call Budget_store_end( tbudgets(NBUDGET_RV), 'HTURB', prrs(:, :, :, 1) - prrs(:, :, :, 2) ) + else + call Budget_store_end( tbudgets(NBUDGET_RV), 'HTURB', prrs(:, :, :, 1) ) + end if + end if + + if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'HTURB', prrs(:, :, :, 2) ) + if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'HTURB', prrs(:, :, :, 4) ) + + if ( lbudget_sv ) then + do jsv = 1, nsv + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + jsv), 'HTURB', prsvs(:, :, :, jsv) ) + end do + end if +end if +!---------------------------------------------------------------------------- +! +!* 6. EVOLUTION OF THE TKE AND ITS DISSIPATION +! ---------------------------------------- +! +! 6.1 Contribution of mass-flux in the TKE buoyancy production if +! cloud computation is not statistical + + PTHP = PTHP + XG / PTHVREF * MZF( PFLXZTHVMF ) + +! 6.2 TKE evolution equation + +CALL TKE_EPS_SOURCES(KKA,KKU,KKL,KMI,PTKET,PLEM,ZLEPS,PDYP,ZTRH, & + PRHODJ,PDZZ,PDXX,PDYY,PDZX,PDZY,PZZ, & + PTSTEP,PIMPL,ZEXPL, & + HTURBLEN,HTURBDIM, & + TPFILE,OTURB_DIAG, & + PTHP,PRTKES,PRTKEMS,PRTHLS,ZCOEF_DISS,PTR,PDISS ) + +!---------------------------------------------------------------------------- +! +!* 7. STORES SOME INFORMATIONS RELATED TO THE TURBULENCE SCHEME +! --------------------------------------------------------- +! +IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN +! +! stores the mixing length +! + TZFIELD%CMNHNAME = 'LM' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'LM' + TZFIELD%CUNITS = 'm' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'Mixing length' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,PLEM) +! + IF (KRR /= 0) THEN +! +! stores the conservative potential temperature +! + TZFIELD%CMNHNAME = 'THLM' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'THLM' + TZFIELD%CUNITS = 'K' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'Conservative potential temperature' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,PTHLT) +! +! stores the conservative mixing ratio +! + TZFIELD%CMNHNAME = 'RNPM' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'RNPM' + TZFIELD%CUNITS = 'kg kg-1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'Conservative mixing ratio' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,PRT(:,:,:,1)) + END IF +END IF +! +!---------------------------------------------------------------------------- +! +!* 8. RETRIEVE NON-CONSERVATIVE VARIABLES +! ----------------------------------- +! +IF ( KRRL >= 1 ) THEN + IF ( KRRI >= 1 ) THEN + PRT(:,:,:,1) = PRT(:,:,:,1) - PRT(:,:,:,2) - PRT(:,:,:,4) + PRRS(:,:,:,1) = PRRS(:,:,:,1) - PRRS(:,:,:,2) - PRRS(:,:,:,4) + PTHLT(:,:,:) = PTHLT(:,:,:) + ZLVOCPEXNM(:,:,:) * PRT(:,:,:,2) & + + ZLSOCPEXNM(:,:,:) * PRT(:,:,:,4) + PRTHLS(:,:,:) = PRTHLS(:,:,:) + ZLVOCPEXNM(:,:,:) * PRRS(:,:,:,2) & + + ZLSOCPEXNM(:,:,:) * PRRS(:,:,:,4) +! + DEALLOCATE(ZLVOCPEXNM) + DEALLOCATE(ZLSOCPEXNM) + ELSE + PRT(:,:,:,1) = PRT(:,:,:,1) - PRT(:,:,:,2) + PRRS(:,:,:,1) = PRRS(:,:,:,1) - PRRS(:,:,:,2) + PTHLT(:,:,:) = PTHLT(:,:,:) + ZLOCPEXNM(:,:,:) * PRT(:,:,:,2) + PRTHLS(:,:,:) = PRTHLS(:,:,:) + ZLOCPEXNM(:,:,:) * PRRS(:,:,:,2) + END IF +END IF + +! Remove non-physical negative values (unnecessary in a perfect world) + corresponding budgets +call Sources_neg_correct( hcloud, 'NETUR', krr, ptstep, ppabst, pthlt, prt, prthls, prrs, prsvs ) + +!---------------------------------------------------------------------------- +! +!* 9. LES averaged surface fluxes +! --------------------------- +! +IF (LLES_CALL) THEN + CALL SECOND_MNH(ZTIME1) + CALL LES_MEAN_SUBGRID(PSFTH,X_LES_Q0) + CALL LES_MEAN_SUBGRID(PSFRV,X_LES_E0) + DO JSV=1,NSV + CALL LES_MEAN_SUBGRID(PSFSV(:,:,JSV),X_LES_SV0(:,JSV)) + END DO + CALL LES_MEAN_SUBGRID(PSFU,X_LES_UW0) + CALL LES_MEAN_SUBGRID(PSFV,X_LES_VW0) + CALL LES_MEAN_SUBGRID((PSFU*PSFU+PSFV*PSFV)**0.25,X_LES_USTAR) +!---------------------------------------------------------------------------- +! +!* 10. LES for 3rd order moments +! ------------------------- +! + CALL LES_MEAN_SUBGRID(ZMWTH,X_LES_SUBGRID_W2Thl) + CALL LES_MEAN_SUBGRID(ZMTH2,X_LES_SUBGRID_WThl2) + IF (KRR>0) THEN + CALL LES_MEAN_SUBGRID(ZMWR,X_LES_SUBGRID_W2Rt) + CALL LES_MEAN_SUBGRID(ZMTHR,X_LES_SUBGRID_WThlRt) + CALL LES_MEAN_SUBGRID(ZMR2,X_LES_SUBGRID_WRt2) + END IF +! +!---------------------------------------------------------------------------- +! +!* 11. LES quantities depending on <w'2> in "1DIM" mode +! ------------------------------------------------ +! + IF (HTURBDIM=="1DIM") THEN + CALL LES_MEAN_SUBGRID(2./3.*PTKET,X_LES_SUBGRID_U2) + X_LES_SUBGRID_V2 = X_LES_SUBGRID_U2 + X_LES_SUBGRID_W2 = X_LES_SUBGRID_U2 + CALL LES_MEAN_SUBGRID(2./3.*PTKET*MZF(& + & GZ_M_W(KKA,KKU,KKL,PTHLT,PDZZ)),X_LES_RES_ddz_Thl_SBG_W2) + IF (KRR>=1) & + CALL LES_MEAN_SUBGRID(2./3.*PTKET*MZF(& + & GZ_M_W(KKA,KKU,KKL,PRT(:,:,:,1),PDZZ)),X_LES_RES_ddz_Rt_SBG_W2) + DO JSV=1,NSV + CALL LES_MEAN_SUBGRID(2./3.*PTKET*MZF(& + & GZ_M_W(KKA,KKU,KKL,PSVT(:,:,:,JSV),PDZZ)),X_LES_RES_ddz_Sv_SBG_W2(:,:,:,JSV)) + END DO + END IF + +!---------------------------------------------------------------------------- +! +!* 12. LES mixing end dissipative lengths, presso-correlations +! ------------------------------------------------------- +! + CALL LES_MEAN_SUBGRID(PLEM,X_LES_SUBGRID_LMix) + CALL LES_MEAN_SUBGRID(ZLEPS,X_LES_SUBGRID_LDiss) +! +!* presso-correlations for subgrid Tke are equal to zero. +! + ZLEPS = 0. !ZLEPS is used as a work array (not used anymore) + CALL LES_MEAN_SUBGRID(ZLEPS,X_LES_SUBGRID_WP) +! + CALL SECOND_MNH(ZTIME2) + XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 +END IF + +! + +! +!---------------------------------------------------------------------------- +! +CONTAINS +! +! +! ############################################## + SUBROUTINE UPDATE_ROTATE_WIND(PUSLOPE,PVSLOPE) +! ############################################## +!! +!!**** *UPDATE_ROTATE_WIND* routine to set rotate wind values at the border +! +!! AUTHOR +!! ------ +!! +!! P Jabouille *CNRM METEO-FRANCE +!! +!! MODIFICATIONS +!! ------------- +!! Original 24/06/99 +!! J.Escobar 21/03/2013: for HALOK comment all NHALO=1 test +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +USE MODE_ll +USE MODD_ARGSLIST_ll, ONLY : LIST_ll +USE MODD_CONF +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PUSLOPE,PVSLOPE +! tangential surface fluxes in the axes following the orography +! +!* 0.2 Declarations of local variables : +! +INTEGER :: IIB,IIE,IJB,IJE ! index values for the physical subdomain +TYPE(LIST_ll), POINTER :: TZFIELDS_ll ! list of fields to exchange +INTEGER :: IINFO_ll ! return code of parallel routine +! +!* 1 PROLOGUE +! +NULLIFY(TZFIELDS_ll) +! +CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) +! +! 2 Update halo if necessary +! +!!$IF (NHALO == 1) THEN + CALL ADD2DFIELD_ll( TZFIELDS_ll, PUSLOPE, 'UPDATE_ROTATE_WIND::PUSLOPE' ) + CALL ADD2DFIELD_ll( TZFIELDS_ll, PVSLOPE, 'UPDATE_ROTATE_WIND::PVSLOPE' ) + CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll) + CALL CLEANLIST_ll(TZFIELDS_ll) +!!$ENDIF +! +! 3 Boundary conditions for non cyclic case +! +IF ( HLBCX(1) /= "CYCL" .AND. LWEST_ll()) THEN + PUSLOPE(IIB-1,:)=PUSLOPE(IIB,:) + PVSLOPE(IIB-1,:)=PVSLOPE(IIB,:) +END IF +IF ( HLBCX(2) /= "CYCL" .AND. LEAST_ll()) THEN + PUSLOPE(IIE+1,:)=PUSLOPE(IIE,:) + PVSLOPE(IIE+1,:)=PVSLOPE(IIE,:) +END IF +IF ( HLBCY(1) /= "CYCL" .AND. LSOUTH_ll()) THEN + PUSLOPE(:,IJB-1)=PUSLOPE(:,IJB) + PVSLOPE(:,IJB-1)=PVSLOPE(:,IJB) +END IF +IF( HLBCY(2) /= "CYCL" .AND. LNORTH_ll()) THEN + PUSLOPE(:,IJE+1)=PUSLOPE(:,IJE) + PVSLOPE(:,IJE+1)=PVSLOPE(:,IJE) +END IF +! +END SUBROUTINE UPDATE_ROTATE_WIND +! +! ######################################################################## + SUBROUTINE COMPUTE_FUNCTION_THERMO(PALP,PBETA,PGAM,PLTT,PC,PT,PEXN,PCP,& + PLOCPEXN,PAMOIST,PATHETA ) +! ######################################################################## +!! +!!**** *COMPUTE_FUNCTION_THERMO* routine to compute several thermo functions +! +!! AUTHOR +!! ------ +!! +!! JP Pinty *LA* +!! +!! MODIFICATIONS +!! ------------- +!! Original 24/02/03 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +USE MODD_CST +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments +! +REAL, INTENT(IN) :: PALP,PBETA,PGAM,PLTT,PC +REAL, DIMENSION(:,:,:), INTENT(IN) :: PT,PEXN,PCP +! +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLOCPEXN +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PAMOIST,PATHETA +! +!* 0.2 Declarations of local variables +! +REAL :: ZEPS ! XMV / XMD +REAL, DIMENSION(SIZE(PEXN,1),SIZE(PEXN,2),SIZE(PEXN,3)) :: ZRVSAT +REAL, DIMENSION(SIZE(PEXN,1),SIZE(PEXN,2),SIZE(PEXN,3)) :: ZDRVSATDT +! +!------------------------------------------------------------------------------- +! + ZEPS = XMV / XMD +! +!* 1.1 Lv/Cph at t +! + PLOCPEXN(:,:,:) = ( PLTT + (XCPV-PC) * (PT(:,:,:)-XTT) ) / PCP(:,:,:) +! +!* 1.2 Saturation vapor pressure at t +! + ZRVSAT(:,:,:) = EXP( PALP - PBETA/PT(:,:,:) - PGAM*ALOG( PT(:,:,:) ) ) +! +!* 1.3 saturation mixing ratio at t +! + ZRVSAT(:,:,:) = ZRVSAT(:,:,:) * ZEPS / ( PPABST(:,:,:) - ZRVSAT(:,:,:) ) +! +!* 1.4 compute the saturation mixing ratio derivative (rvs') +! + ZDRVSATDT(:,:,:) = ( PBETA / PT(:,:,:) - PGAM ) / PT(:,:,:) & + * ZRVSAT(:,:,:) * ( 1. + ZRVSAT(:,:,:) / ZEPS ) +! +!* 1.5 compute Amoist +! + PAMOIST(:,:,:)= 0.5 / ( 1.0 + ZDRVSATDT(:,:,:) * PLOCPEXN(:,:,:) ) +! +!* 1.6 compute Atheta +! + PATHETA(:,:,:)= PAMOIST(:,:,:) * PEXN(:,:,:) * & + ( ( ZRVSAT(:,:,:) - PRT(:,:,:,1) ) * PLOCPEXN(:,:,:) / & + ( 1. + ZDRVSATDT(:,:,:) * PLOCPEXN(:,:,:) ) * & + ( & + ZRVSAT(:,:,:) * (1. + ZRVSAT(:,:,:)/ZEPS) & + * ( -2.*PBETA/PT(:,:,:) + PGAM ) / PT(:,:,:)**2 & + +ZDRVSATDT(:,:,:) * (1. + 2. * ZRVSAT(:,:,:)/ZEPS) & + * ( PBETA/PT(:,:,:) - PGAM ) / PT(:,:,:) & + ) & + - ZDRVSATDT(:,:,:) & + ) +! +!* 1.7 Lv/Cph/Exner at t-1 +! + PLOCPEXN(:,:,:) = PLOCPEXN(:,:,:) / PEXN(:,:,:) +! +END SUBROUTINE COMPUTE_FUNCTION_THERMO +! +! #################### + SUBROUTINE DELT(PLM,ODZ) +! #################### +!! +!!**** *DELT* routine to compute mixing length for DELT case +! +!! AUTHOR +!! ------ +!! +!! M Tomasini *Meteo-France +!! +!! MODIFICATIONS +!! ------------- +!! Original 01/05 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +!* 0.1 Declarations of dummy arguments +! +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLM +LOGICAL, INTENT(IN) :: ODZ +! +!* 0.2 Declarations of local variables +! +REAL :: ZD ! distance to the surface +! +!------------------------------------------------------------------------------- +! +IF (ODZ) THEN + ! Dz is take into account in the computation + DO JK = IKTB,IKTE ! 1D turbulence scheme + PLM(:,:,JK) = PZZ(:,:,JK+KKL) - PZZ(:,:,JK) + END DO + PLM(:,:,KKU) = PLM(:,:,IKE) + PLM(:,:,KKA) = PZZ(:,:,IKB) - PZZ(:,:,KKA) + IF ( HTURBDIM /= '1DIM' ) THEN ! 3D turbulence scheme + IF ( L2D) THEN + PLM(:,:,:) = SQRT( PLM(:,:,:)*MXF(PDXX(:,:,:)) ) + ELSE + PLM(:,:,:) = (PLM(:,:,:)*MXF(PDXX(:,:,:))*MYF(PDYY(:,:,:)) ) ** (1./3.) + END IF + END IF +ELSE + ! Dz not taken into account in computation to assure invariability with vertical grid mesh + PLM=1.E10 + IF ( HTURBDIM /= '1DIM' ) THEN ! 3D turbulence scheme + IF ( L2D) THEN + PLM(:,:,:) = MXF(PDXX(:,:,:)) + ELSE + PLM(:,:,:) = (MXF(PDXX(:,:,:))*MYF(PDYY(:,:,:)) ) ** (1./2.) + END IF + END IF +END IF + +! +! mixing length limited by the distance normal to the surface +! (with the same factor as for BL89) +! +IF (.NOT. ORMC01) THEN + ZALPHA=0.5**(-1.5) + ! + DO JJ=1,SIZE(PUT,2) + DO JI=1,SIZE(PUT,1) + IF (LOCEAN) THEN + DO JK=IKTE,IKTB,-1 + ZD=ZALPHA*(PZZ(JI,JJ,IKTE+1)-PZZ(JI,JJ,JK)) + IF ( PLM(JI,JJ,JK)>ZD) THEN + PLM(JI,JJ,JK)=ZD + ELSE + EXIT + ENDIF + END DO + ELSE + DO JK=IKTB,IKTE + ZD=ZALPHA*(0.5*(PZZ(JI,JJ,JK)+PZZ(JI,JJ,JK+KKL))& + -PZZ(JI,JJ,IKB)) *PDIRCOSZW(JI,JJ) + IF ( PLM(JI,JJ,JK)>ZD) THEN + PLM(JI,JJ,JK)=ZD + ELSE + EXIT + ENDIF + END DO + ENDIF + END DO + END DO +END IF +! +PLM(:,:,KKA) = PLM(:,:,IKB ) +PLM(:,:,KKU ) = PLM(:,:,IKE) +! +END SUBROUTINE DELT +! +! #################### + SUBROUTINE DEAR(PLM) +! #################### +!! +!!**** *DEAR* routine to compute mixing length for DEARdorff case +! +!! AUTHOR +!! ------ +!! +!! M Tomasini *Meteo-France +!! +!! MODIFICATIONS +!! ------------- +!! Original 01/05 +!! I.Sandu (Sept.2006) : Modification of the stability criterion +!! (theta_v -> theta_l) +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +!* 0.1 Declarations of dummy arguments +! +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLM +! +!* 0.2 Declarations of local variables +! +REAL :: ZD ! distance to the surface +REAL :: ZVAR ! Intermediary variable +REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2)) :: ZWORK2D +! +REAL, DIMENSION(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) :: & + ZDTHLDZ,ZDRTDZ, &!dtheta_l/dz, drt_dz used for computing the stablity +! ! criterion + ZETHETA,ZEMOIST !coef ETHETA and EMOIST +!---------------------------------------------------------------------------- +! +!------------------------------------------------------------------------------- +! +! initialize the mixing length with the mesh grid +! 1D turbulence scheme +PLM(:,:,IKTB:IKTE) = PZZ(:,:,IKTB+KKL:IKTE+KKL) - PZZ(:,:,IKTB:IKTE) +PLM(:,:,KKU) = PLM(:,:,IKE) +PLM(:,:,KKA) = PZZ(:,:,IKB) - PZZ(:,:,KKA) +IF ( HTURBDIM /= '1DIM' ) THEN ! 3D turbulence scheme + IF ( L2D) THEN + PLM(:,:,:) = SQRT( PLM(:,:,:)*MXF(PDXX(:,:,:)) ) + ELSE + PLM(:,:,:) = (PLM(:,:,:)*MXF(PDXX(:,:,:))*MYF(PDYY(:,:,:)) ) ** (1./3.) + END IF +END IF +! compute a mixing length limited by the stability +! +ZETHETA(:,:,:) = ETHETA(KRR,KRRI,PTHLT,PRT,ZLOCPEXNM,ZATHETA,PSRCT) +ZEMOIST(:,:,:) = EMOIST(KRR,KRRI,PTHLT,PRT,ZLOCPEXNM,ZAMOIST,PSRCT) +! +IF (KRR>0) THEN + DO JK = IKTB+1,IKTE-1 + DO JJ=1,SIZE(PUT,2) + DO JI=1,SIZE(PUT,1) + ZDTHLDZ(JI,JJ,JK)= 0.5*((PTHLT(JI,JJ,JK+KKL)-PTHLT(JI,JJ,JK ))/PDZZ(JI,JJ,JK+KKL)+ & + (PTHLT(JI,JJ,JK )-PTHLT(JI,JJ,JK-KKL))/PDZZ(JI,JJ,JK )) + ZDRTDZ(JI,JJ,JK) = 0.5*((PRT(JI,JJ,JK+KKL,1)-PRT(JI,JJ,JK ,1))/PDZZ(JI,JJ,JK+KKL)+ & + (PRT(JI,JJ,JK ,1)-PRT(JI,JJ,JK-KKL,1))/PDZZ(JI,JJ,JK )) + IF (LOCEAN) THEN + ZVAR=XG*(XALPHAOC*ZDTHLDZ(JI,JJ,JK)-XBETAOC*ZDRTDZ(JI,JJ,JK)) + ELSE + ZVAR=XG/PTHVREF(JI,JJ,JK)* & + (ZETHETA(JI,JJ,JK)*ZDTHLDZ(JI,JJ,JK)+ZEMOIST(JI,JJ,JK)*ZDRTDZ(JI,JJ,JK)) + END IF + ! + IF (ZVAR>0.) THEN + PLM(JI,JJ,JK)=MAX(XMNH_EPSILON,MIN(PLM(JI,JJ,JK), & + 0.76* SQRT(PTKET(JI,JJ,JK)/ZVAR))) + END IF + END DO + END DO + END DO +ELSE! For dry atmos or unsalted ocean runs + DO JK = IKTB+1,IKTE-1 + DO JJ=1,SIZE(PUT,2) + DO JI=1,SIZE(PUT,1) + ZDTHLDZ(JI,JJ,JK)= 0.5*((PTHLT(JI,JJ,JK+KKL)-PTHLT(JI,JJ,JK ))/PDZZ(JI,JJ,JK+KKL)+ & + (PTHLT(JI,JJ,JK )-PTHLT(JI,JJ,JK-KKL))/PDZZ(JI,JJ,JK )) + IF (LOCEAN) THEN + ZVAR= XG*XALPHAOC*ZDTHLDZ(JI,JJ,JK) + ELSE + ZVAR= XG/PTHVREF(JI,JJ,JK)*ZETHETA(JI,JJ,JK)*ZDTHLDZ(JI,JJ,JK) + END IF +! + IF (ZVAR>0.) THEN + PLM(JI,JJ,JK)=MAX(XMNH_EPSILON,MIN(PLM(JI,JJ,JK), & + 0.76* SQRT(PTKET(JI,JJ,JK)/ZVAR))) + END IF + END DO + END DO + END DO +END IF +! special case near the surface +ZDTHLDZ(:,:,IKB)=(PTHLT(:,:,IKB+KKL)-PTHLT(:,:,IKB))/PDZZ(:,:,IKB+KKL) +! For dry simulations +IF (KRR>0) THEN + ZDRTDZ(:,:,IKB)=(PRT(:,:,IKB+KKL,1)-PRT(:,:,IKB,1))/PDZZ(:,:,IKB+KKL) +ELSE + ZDRTDZ(:,:,IKB)=0 +ENDIF +! +IF (LOCEAN) THEN + ZWORK2D(:,:)=XG*(XALPHAOC*ZDTHLDZ(:,:,IKB)-XBETAOC*ZDRTDZ(:,:,IKB)) +ELSE + ZWORK2D(:,:)=XG/PTHVREF(:,:,IKB)* & + (ZETHETA(:,:,IKB)*ZDTHLDZ(:,:,IKB)+ZEMOIST(:,:,IKB)*ZDRTDZ(:,:,IKB)) +END IF +WHERE(ZWORK2D(:,:)>0.) + PLM(:,:,IKB)=MAX(XMNH_EPSILON,MIN( PLM(:,:,IKB), & + 0.76* SQRT(PTKET(:,:,IKB)/ZWORK2D(:,:)))) +END WHERE +! +! mixing length limited by the distance normal to the surface (with the same factor as for BL89) +! +IF (.NOT. ORMC01) THEN + ZALPHA=0.5**(-1.5) + ! + DO JJ=1,SIZE(PUT,2) + DO JI=1,SIZE(PUT,1) + IF (LOCEAN) THEN + DO JK=IKTE,IKTB,-1 + ZD=ZALPHA*(PZZ(JI,JJ,IKTE+1)-PZZ(JI,JJ,JK)) + IF ( PLM(JI,JJ,JK)>ZD) THEN + PLM(JI,JJ,JK)=ZD + ELSE + EXIT + ENDIF + END DO + ELSE + DO JK=IKTB,IKTE + ZD=ZALPHA*(0.5*(PZZ(JI,JJ,JK)+PZZ(JI,JJ,JK+KKL))-PZZ(JI,JJ,IKB)) & + *PDIRCOSZW(JI,JJ) + IF ( PLM(JI,JJ,JK)>ZD) THEN + PLM(JI,JJ,JK)=ZD + ELSE + EXIT + ENDIF + END DO + ENDIF + END DO + END DO +END IF +! +PLM(:,:,KKA) = PLM(:,:,IKB ) +PLM(:,:,IKE ) = PLM(:,:,IKE-KKL) +PLM(:,:,KKU ) = PLM(:,:,KKU-KKL) +! +END SUBROUTINE DEAR +! +! ######################### + SUBROUTINE CLOUD_MODIF_LM +! ######################### +!! +!!*****CLOUD_MODIF_LM routine to: +!! 1/ change the mixing length in the clouds +!! 2/ emphasize the mixing length in the cloud +!! by the coefficient ZCOEF_AMPL calculated here +!! when the CEI index is above ZCEI_MIN. +!! +!! +!! ZCOEF_AMPL ^ +!! | +!! | +!! ZCOEF_AMPL_SAT - ---------- Saturation +!! (XDUMMY1) | - +!! | - +!! | - +!! | - +!! | - Amplification +!! | - straight +!! | - line +!! | - +!! | - +!! | - +!! | - +!! | - +!! 1 ------------ +!! | +!! | +!! 0 -----------|------------|----------> PCEI +!! 0 ZCEI_MIN ZCEI_MAX +!! (XDUMMY2) (XDUMMY3) +!! +!! +!! +!! AUTHOR +!! ------ +!! M. Tomasini *CNRM METEO-FRANCE +!! +!! MODIFICATIONS +!! ------------- +!! Original 09/07/04 +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +REAL :: ZPENTE ! Slope of the amplification straight line +REAL :: ZCOEF_AMPL_CEI_NUL! Ordonnate at the origin of the + ! amplification straight line +REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZCOEF_AMPL + ! Amplification coefficient of the mixing length + ! when the instability criterium is verified +REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZLM_CLOUD + ! Turbulent mixing length in the clouds +! +!------------------------------------------------------------------------------- +! +!* 1. INITIALISATION +! -------------- +! +ZPENTE = ( PCOEF_AMPL_SAT - 1. ) / ( PCEI_MAX - PCEI_MIN ) +ZCOEF_AMPL_CEI_NUL = 1. - ZPENTE * PCEI_MIN +! +ZCOEF_AMPL(:,:,:) = 1. +! +!* 2. CALCULATION OF THE AMPLIFICATION COEFFICIENT +! -------------------------------------------- +! +! Saturation +! +WHERE ( PCEI(:,:,:)>=PCEI_MAX ) ZCOEF_AMPL(:,:,:)=PCOEF_AMPL_SAT +! +! Between the min and max limits of CEI index, linear variation of the +! amplification coefficient ZCOEF_AMPL as a function of CEI +! +WHERE ( PCEI(:,:,:) < PCEI_MAX .AND. & + PCEI(:,:,:) > PCEI_MIN ) & + ZCOEF_AMPL(:,:,:) = ZPENTE * PCEI(:,:,:) + ZCOEF_AMPL_CEI_NUL +! +! +!* 3. CALCULATION OF THE MIXING LENGTH IN CLOUDS +! ------------------------------------------ +! +IF (HTURBLEN_CL == HTURBLEN) THEN + ZLM_CLOUD(:,:,:) = PLEM(:,:,:) +ELSE + SELECT CASE (HTURBLEN_CL) +! +!* 3.1 BL89 mixing length +! ------------------ + CASE ('BL89','RM17','ADAP') + ZSHEAR=0. + CALL BL89(KKA,KKU,KKL,PZZ,PDZZ,PTHVREF,ZTHLM,KRR,ZRM,PTKET,ZSHEAR,ZLM_CLOUD) +! +!* 3.2 Delta mixing length +! ------------------- + CASE ('DELT') + CALL DELT(ZLM_CLOUD,ODZ=.TRUE.) +! +!* 3.3 Deardorff mixing length +! ----------------------- + CASE ('DEAR') + CALL DEAR(ZLM_CLOUD) +! + END SELECT +ENDIF +! +!* 4. MODIFICATION OF THE MIXING LENGTH IN THE CLOUDS +! ----------------------------------------------- +! +! Impression before modification of the mixing length +IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN + TZFIELD%CMNHNAME = 'LM_CLEAR_SKY' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'LM_CLEAR_SKY' + TZFIELD%CUNITS = 'm' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_LM CLEAR SKY' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,PLEM) +ENDIF +! +! Amplification of the mixing length when the criteria are verified +! +WHERE (ZCOEF_AMPL(:,:,:) /= 1.) PLEM(:,:,:) = ZCOEF_AMPL(:,:,:)*ZLM_CLOUD(:,:,:) +! +! Cloud mixing length in the clouds at the points which do not verified the CEI +! +WHERE (PCEI(:,:,:) == -1.) PLEM(:,:,:) = ZLM_CLOUD(:,:,:) +! +! +!* 5. IMPRESSION +! ---------- +! +IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN + TZFIELD%CMNHNAME = 'COEF_AMPL' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'COEF_AMPL' + TZFIELD%CUNITS = '1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_COEF AMPL' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZCOEF_AMPL) + ! + TZFIELD%CMNHNAME = 'LM_CLOUD' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'LM_CLOUD' + TZFIELD%CUNITS = 'm' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_LM CLOUD' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + CALL IO_Field_write(TPFILE,TZFIELD,ZLM_CLOUD) + ! +ENDIF +! +END SUBROUTINE CLOUD_MODIF_LM +! +END SUBROUTINE TURB diff --git a/src/mesonh/turb/turb_cloud_index.f90 b/src/mesonh/turb/turb_cloud_index.f90 new file mode 100644 index 000000000..c194db611 --- /dev/null +++ b/src/mesonh/turb/turb_cloud_index.f90 @@ -0,0 +1,344 @@ +!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ################ + MODULE MODI_TURB_CLOUD_INDEX +! ################ +! +INTERFACE +! + SUBROUTINE TURB_CLOUD_INDEX(PTSTEP,TPFILE, & + OTURB_DIAG,KRRI, & + PRRS,PRM,PRHODJ,PDXX,PDYY,PDZZ,PDZX,PDZY, & + PCEI ) +! +USE MODD_IO, ONLY: TFILEDATA +! +REAL, INTENT(IN) :: PTSTEP ! Double Time step +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +LOGICAL, INTENT(IN) :: OTURB_DIAG ! switch to write some + ! diagnostic fields in the syncronous FM-file +INTEGER, INTENT(IN) :: KRRI ! number of ice water var. +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRRS ! Sources term of RR +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Variable at t-dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Jacobian * dry density of + ! the reference state +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ,PDZX,PDZY + ! metric coefficients +REAL, DIMENSION(:,:,:), INTENT(OUT):: PCEI ! Cloud Entrainment instability + ! index to emphasize locally + ! turbulent fluxes +! +END SUBROUTINE TURB_CLOUD_INDEX +! +END INTERFACE +! +END MODULE MODI_TURB_CLOUD_INDEX +! +! ####################### + SUBROUTINE TURB_CLOUD_INDEX(PTSTEP,TPFILE, & + OTURB_DIAG,KRRI, & + PRRS,PRM,PRHODJ,PDXX,PDYY,PDZZ,PDZX,PDZY, & + PCEI ) +! ####################### + ! +!! PURPOSE +!! ------- +!! CEI (cloud Entrainment Instability) index calculation +!! It permits to localize cloudy points where a different mixing length +!! from the one in clear sky can be applicated +!! It permits to quantify also, at those cloudy points, an instability +!! that can emphasize sub-grid turbulence. +!! If such an instability exists, mixing length is increased proportionnaly +!! to that CEI criterium +!! +!!** METHOD +!! ------ +!! +!! Criteria: For a cloudy point or a point adjacent to a cloudy point, +!! G = NORM( dVAR/dx_j ) > threshold +!! Q_j = DG_j/Dt of the same sign as G_j +!! where VAR=rv+rc+ri and j=x or y +!! then CEI= NORM(Q) +!! +!! EXTERNAL +!! -------- +!! GX_M_M, GY_M_M : Cartesian gradient operators +!! FMWRIT : FM-routine to write a record +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODI_GRADIENT_M : GX_M_M, GY_M_M +!! +!! AUTHOR +!! ------ +!! M. Tomasini * Meteo-France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 15/09/94 +!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +! +!------------------------------------------------------------------------------- +! +use modd_field, only: tfielddata, TYPEREAL +USE MODD_IO, ONLY: TFILEDATA +USE MODD_PARAMETERS, ONLY: JPVEXT +! +USE MODE_IO_FIELD_WRITE, only: IO_Field_write +use mode_tools_ll, only: GET_INDICE_ll +! +USE MODI_GRADIENT_M +! +IMPLICIT NONE +! +!* 0. DECLARATIONS +! ------------ +! +!* 0.1 declarations of arguments +! +REAL, INTENT(IN) :: PTSTEP ! Double Time step +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +LOGICAL, INTENT(IN) :: OTURB_DIAG ! switch to write some + ! diagnostic fields in the syncronous FM-file +INTEGER, INTENT(IN) :: KRRI ! number of ice water var. +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRRS ! Sources term of RR +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Variable at t-dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Jacobian * dry density of + ! the reference state +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ,PDZX,PDZY + ! metric coefficients +REAL, DIMENSION(:,:,:), INTENT(OUT):: PCEI ! Cloud Entrainment instability + ! index to emphasize locally + ! turbulent fluxes +! +!* 0.2 declarations of local variables +! +REAL, DIMENSION(SIZE(PRM,1),SIZE(PRM,2),SIZE(PRM,3)) :: ZWORK,ZRVCI0 ! Work arrays +REAL, DIMENSION(SIZE(PRM,1),SIZE(PRM,2),SIZE(PRM,3)) :: ZCLOUD + ! rc+ri at time after ADVECTION routine + ! for the CEI criterium +REAL, DIMENSION(SIZE(PRM,1),SIZE(PRM,2),SIZE(PRM,3)) :: ZRVCI,ZGNORM_RVCI,ZQNORM_RVCI + ! rv+rc+ri at time after ADVECTION routine + ! horizontal norm of the vector PG_RVCI + ! horizontal norm of the vector PQ_RVCI +REAL, DIMENSION(SIZE(PRM,1),SIZE(PRM,2),SIZE(PRM,3),2) :: ZG_RVCI,ZQ_RVCI + ! x and y gradient of rv+rc+ri + ! x and y gradient of the advection of rv+rc+ri +! +INTEGER :: JI,JJ,JK ! loop counters +INTEGER :: IIB,IJB,IKB ! Begin of physical dimensions +INTEGER :: IIE,IJE,IKE ! End of physical dimensions +INTEGER, DIMENSION(SIZE(PRM,1),SIZE(PRM,2),SIZE(PRM,3)) :: IMASK_CLOUD + ! 0 except cloudy points or adjacent points (1) +TYPE(TFIELDDATA) :: TZFIELD +! +!------------------------------------------------------------------------------- +! +!* 1. INITIALISATION +! -------------- +! +CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) +IKB = 1 + JPVEXT +IKE = SIZE(PRM,3) - JPVEXT +! +IMASK_CLOUD(:,:,:) = 0 +PCEI(:,:,:) = 0. +! +!------------------------------------------------------------------------------- +! +!* 2. CALCULATION +! ----------- +!* 2.1 Gradients calculation of the variable : +! VAR at time (t+1)=VAR at time (t-1) + 2*dt*ADV at time t +! VAR is a source term (i.e. x by RHODJ) +! +! To avoid negative mixing ratios at external points +! but also in the physical domain ! +ZRVCI0(:,:,:) = MAX ( PRRS(:,:,:,1) , 0. ) + MAX ( PRRS(:,:,:,2) , 0. ) +IF (KRRI>=1) ZRVCI0(:,:,:) = ZRVCI0(:,:,:) + MAX ( PRRS(:,:,:,4) , 0. ) +! +ZRVCI(:,:,:)= PTSTEP *ZRVCI0(:,:,:) /PRHODJ(:,:,:) +ZG_RVCI(:,:,:,1) = GX_M_M(ZRVCI,PDXX,PDZZ,PDZX) +ZG_RVCI(:,:,:,2) = GY_M_M(ZRVCI,PDYY,PDZZ,PDZY) +! +ZGNORM_RVCI(:,:,:) = SQRT( ZG_RVCI(:,:,:,1)*ZG_RVCI(:,:,:,1) + & + ZG_RVCI(:,:,:,2)*ZG_RVCI(:,:,:,2) ) +! +! +!* 2.2 Frontogenetic terms calculation +! (gradient of the advection) +! Q_j=DG_j/Dt=d(DVAR/Dt)dx_j - d(u_k*dVAR/dx_k)/dx_j +! As DVAR/Dt=0 if the VAR is conserved during the movement, +! Q_j = dADV/dx_j +! VAR=rv+rc+ri +! +ZWORK(:,:,:) = ZRVCI0 / PRHODJ(:,:,:) - & + ( PRM(:,:,:,1)+ PRM(:,:,:,2) ) / PTSTEP +IF (KRRI>=1) ZWORK(:,:,:) = ZWORK(:,:,:) - PRM(:,:,:,4) / PTSTEP +! +ZQ_RVCI(:,:,:,1) = GX_M_M(ZWORK,PDXX,PDZZ,PDZX) +ZQ_RVCI(:,:,:,2) = GY_M_M(ZWORK,PDYY,PDZZ,PDZY) +! +ZQNORM_RVCI(:,:,:) = SQRT( ZQ_RVCI(:,:,:,1)*ZQ_RVCI(:,:,:,1) + & + ZQ_RVCI(:,:,:,2)*ZQ_RVCI(:,:,:,2) ) +! +! +!* 2.3 Cloud mask +! +ZCLOUD(:,:,:)= MAX ( PRRS(:,:,:,2) , 0. ) +IF (KRRI>=1) ZCLOUD(:,:,:) = ZCLOUD(:,:,:) + MAX ( PRRS(:,:,:,4) , 0. ) +ZCLOUD(:,:,:) = PTSTEP * ZCLOUD / PRHODJ(:,:,:) +! +DO JK=IKB,IKE +DO JJ=IJB,IJE +DO JI=IIB,IIE + ! rc+ri threshold to avoid white noise and calculations + IF ( ZCLOUD(JI,JJ,JK) > 1.E-6 ) THEN + IMASK_CLOUD(JI-1,JJ ,JK ) = 1 + IMASK_CLOUD(JI ,JJ ,JK ) = 1 + IMASK_CLOUD(JI+1,JJ ,JK ) = 1 + IMASK_CLOUD(JI ,JJ-1,JK ) = 1 + IMASK_CLOUD(JI ,JJ+1,JK ) = 1 + IMASK_CLOUD(JI ,JJ ,JK-1) = 1 + IMASK_CLOUD(JI ,JJ ,JK+1) = 1 + ! The cloudy points where the criteria will not be satisfied + ! will have the cloudy mixing length not amplified + ! We put in the CEI index a negative number to mark those points + ! in turb.f90 + PCEI(JI,JJ,JK) = -1. + ENDIF +ENDDO +ENDDO +ENDDO +! +!* 2.4 Cloud Entrainment Instability index +! +! CEI(:,:,:)=NORM_Q +! +! if the considered point is cloudy or surrounded by at least one cloudy point +! +! and if the characteristic time >0 in at least one direction that is to say +! |grad(rv+rc+ri)| increasing with time that is to say +! grad(rv+rc+ri) has the same sign as Q_RVCI +! +! and if NORM_G_RVCI >= 0.1 g/kg/km +! +DO JK=IKB,IKE +DO JJ=IJB,IJE +DO JI=IIB,IIE + IF ( IMASK_CLOUD(JI,JJ,JK) == 1 ) THEN + IF ( ZGNORM_RVCI(JI,JJ,JK) >= 1.E-07 ) THEN + IF ( SIGN(1.0,ZG_RVCI(JI,JJ,JK,1))==SIGN(1.0,ZQ_RVCI(JI,JJ,JK,1)) .OR. & + SIGN(1.0,ZG_RVCI(JI,JJ,JK,2))==SIGN(1.0,ZQ_RVCI(JI,JJ,JK,2)) ) THEN + PCEI(JI,JJ,JK) = ZQNORM_RVCI(JI,JJ,JK) + ENDIF + ENDIF + ENDIF +ENDDO +ENDDO +ENDDO +! +!* 2.5 Writing +! +IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN + TZFIELD%CMNHNAME = 'RVCI' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'RVCI' + TZFIELD%CUNITS = 'kg kg-1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_RVCI' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZRVCI) + ! + TZFIELD%CMNHNAME = 'GX_RVCI' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'GX_RVCI' + TZFIELD%CUNITS = 'kg kg-1 m-1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_GX_RVCI' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZG_RVCI(:,:,:,1)) + ! + TZFIELD%CMNHNAME = 'GY_RVCI' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'GY_RVCI' + TZFIELD%CUNITS = 'kg kg-1 m-1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_GY_RVCI' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZG_RVCI(:,:,:,2)) + ! + TZFIELD%CMNHNAME = 'GNORM_RVCI' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'GNORM_RVCI' + TZFIELD%CUNITS = 'kg kg-1 m-1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_NORM G' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZGNORM_RVCI) + ! + TZFIELD%CMNHNAME = 'QX_RVCI' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'QX_RVCI' + TZFIELD%CUNITS = 'kg kg-1 m-1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_QX_RVCI' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZQ_RVCI(:,:,:,1)) + ! + TZFIELD%CMNHNAME = 'QY_RVCI' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'QY_RVCI' + TZFIELD%CUNITS = 'kg kg-1 m-1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_QY_RVCI' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZQ_RVCI(:,:,:,2)) + ! + TZFIELD%CMNHNAME = 'QNORM_RVCI' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'QNORM_RVCI' + TZFIELD%CUNITS = 'kg kg-1 m-1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_QNORM_RVCI' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZQNORM_RVCI) + ! + TZFIELD%CMNHNAME = 'CEI' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'CEI' + TZFIELD%CUNITS = 'kg kg-1 m-1 s-1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_CEI' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,PCEI) +END IF +! +END SUBROUTINE TURB_CLOUD_INDEX diff --git a/src/mesonh/turb/turb_hor.f90 b/src/mesonh/turb/turb_hor.f90 new file mode 100644 index 000000000..8c872dcee --- /dev/null +++ b/src/mesonh/turb/turb_hor.f90 @@ -0,0 +1,469 @@ +!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! #################### + MODULE MODI_TURB_HOR +! #################### +! +INTERFACE +! + SUBROUTINE TURB_HOR(KSPLT, KRR, KRRL, KRRI, PTSTEP, & + OTURB_FLX,OSUBG_COND, & + TPFILE, & + PDXX,PDYY,PDZZ,PDZX,PDZY,PZZ, & + PDIRCOSXW,PDIRCOSYW,PDIRCOSZW, & + PCOSSLOPE,PSINSLOPE, & + PINV_PDXX, PINV_PDYY, PINV_PDZZ, PMZM_PRHODJ, & + PK, & + PRHODJ,PTHVREF, & + PSFTHM,PSFRM,PSFSVM, & + PCDUEFF,PTAU11M,PTAU12M,PTAU22M,PTAU33M, & + PUM,PVM,PWM,PUSLOPEM,PVSLOPEM,PTHLM,PRM,PSVM, & + PTKEM,PLM,PLEPS, & + PLOCPEXNM,PATHETA,PAMOIST,PSRCM,PFRAC_ICE, & + PDP,PTP,PSIGS, & + PRUS,PRVS,PRWS,PRTHLS,PRRS,PRSVS ) + +! +USE MODD_IO, ONLY: TFILEDATA +! +INTEGER, INTENT(IN) :: KSPLT ! current split index +INTEGER, INTENT(IN) :: KRR ! number of moist var. +INTEGER, INTENT(IN) :: KRRL ! number of liquid water var. +INTEGER, INTENT(IN) :: KRRI ! number of ice water var. +REAL, INTENT(IN) :: PTSTEP ! +LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the + ! turbulent fluxes in the syncronous FM-file +LOGICAL, INTENT(IN) :: OSUBG_COND ! Switch for sub-grid +! condensation +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX, PDYY, PDZZ, PDZX, PDZY + ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! vertical grid +REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSXW, PDIRCOSYW, PDIRCOSZW +! Director Cosinus along x, y and z directions at surface w-point +REAL, DIMENSION(:,:), INTENT(IN) :: PCOSSLOPE ! cosinus of the angle + ! between i and the slope vector +REAL, DIMENSION(:,:), INTENT(IN) :: PSINSLOPE ! sinus of the angle + ! between i and the slope vector +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density * grid volume +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! ref. state VPT +! +REAL, DIMENSION(:,:), INTENT(IN) :: PSFTHM,PSFRM +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSFSVM ! surface fluxes +! +REAL, DIMENSION(:,:), INTENT(IN) :: PCDUEFF ! Cd * || u || at time t +REAL, DIMENSION(:,:), INTENT(IN) :: PTAU11M ! <uu> in the axes linked + ! to the maximum slope direction and the surface normal and the binormal + ! at time t - dt +REAL, DIMENSION(:,:), INTENT(IN) :: PTAU12M ! <uv> in the same axes +REAL, DIMENSION(:,:), INTENT(IN) :: PTAU22M ! <vv> in the same axes +REAL, DIMENSION(:,:), INTENT(IN) :: PTAU33M ! <ww> in the same axes +! +! Variables at t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM,PVM,PWM,PTHLM +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! mixing ratios at t-1, + ! where PRM(:,:,:,1) = conservative mixing ratio +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! scalar var. at t-1 +REAL, DIMENSION(:,:), INTENT(IN) :: PUSLOPEM ! wind component along the + ! maximum slope direction +REAL, DIMENSION(:,:), INTENT(IN) :: PVSLOPEM ! wind component along the + ! direction normal to the maximum slope one + +REAL, DIMENSION(:,:,:), INTENT(IN) :: PK ! Turbulent diffusion doef. + ! PK = PLM * SQRT(PTKEM) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDXX ! 1./PDXX +REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDYY ! 1./PDYY +REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDZZ ! 1./PDZZ +REAL, DIMENSION(:,:,:), INTENT(IN) :: PMZM_PRHODJ ! MZM(PRHODJ) +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t- dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! dissipative length +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exner at time t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA ! coefficients between +REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! s and Thetal and Rnp + +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM + ! normalized 2nd-order flux + ! s'r'c/2Sigma_s2 at t-1 multiplied by Lambda_3 +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFRAC_ICE ! ri fraction of rc+ri +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS, PRWS, PRTHLS +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS,PRRS ! var. at t+1 -split- +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDP,PTP ! TKE production terms +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSIGS + ! IN: Vertical part of Sigma_s at t + ! OUT: Total Sigma_s at t +! +! +! +END SUBROUTINE TURB_HOR +! +END INTERFACE +! +END MODULE MODI_TURB_HOR +! ################################################################ + SUBROUTINE TURB_HOR(KSPLT, KRR, KRRL, KRRI, PTSTEP, & + OTURB_FLX,OSUBG_COND, & + TPFILE, & + PDXX,PDYY,PDZZ,PDZX,PDZY,PZZ, & + PDIRCOSXW,PDIRCOSYW,PDIRCOSZW, & + PCOSSLOPE,PSINSLOPE, & + PINV_PDXX, PINV_PDYY, PINV_PDZZ, PMZM_PRHODJ, & + PK, & + PRHODJ,PTHVREF, & + PSFTHM,PSFRM,PSFSVM, & + PCDUEFF,PTAU11M,PTAU12M,PTAU22M,PTAU33M, & + PUM,PVM,PWM,PUSLOPEM,PVSLOPEM,PTHLM,PRM,PSVM, & + PTKEM,PLM,PLEPS, & + PLOCPEXNM,PATHETA,PAMOIST,PSRCM,PFRAC_ICE, & + PDP,PTP,PSIGS, & + PRUS,PRVS,PRWS,PRTHLS,PRRS,PRSVS ) +! ################################################################ +! +! +!!**** *TURB_HOR* -routine to compute the source terms in the meso-NH +!! model equations due to the non-vertical turbulent fluxes. +!! +!! PURPOSE +!! ------- +! The purpose of this routine is to compute the non-vertical +! turbulent fluxes of the evolutive variables and give back the +! source terms to the main program. +! +!!** METHOD +!! ------ +!! Complementary 3D calculations when running at high resolution; +!! The non-vertical turbulent fluxes are computed explicitly. The +!! contributions are cumulated in PRvarS and in DP and TP of TKE +! +! d(rho*T) = -d(rho*u'T'/dxx) -d(-rho*u'T'*dzx/dxx/dzz) +! / dt / dx /dz +!! +!! +!! Near the bottom of the model, uncentred evaluation of vertical +!! gradients are required because no field values are available under +!! the level where the gradient must be evaluated. In this case, the +!! gradient is computed with a second order accurate uncentred scheme +!! according to: +!! +!! D FF dzz3 (dzz3+dzz4) +!! ---- = - ----------------- FF(4) + ----------------- FF(3) +!! D z (dzz3+dzz4) dzz4 dzz3 dzz4 +!! +!! dzz4 + 2 dzz3 +!! - ----------------- FF(2) +!! (dzz3+dzz4) dzz3 +!! +!! where the values are taken from: +!! +!! ----- FF(5) +!! | +!! | dzz5 +!! | +!! ----- FF(4) +!! | +!! | dzz4 +!! | +!! ----- FF(3) +!! | +!! | dzz3 +!! | +!! ----- FF(2) , (D FF / DZ) +!! | dzz2 * 0.5 +!! ----- ground +!! +!! +!! +!! EXTERNAL +!! -------- +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST : contains physical constants +!! +!! XG : gravity constant +!! +!! Module MODD_CTURB: contains the set of constants for +!! the turbulence scheme +!! +!! XCMFS,XCMFB : cts for the momentum flux +!! XCSHF : ct for the sensible heat flux +!! XCHF : ct for the moisture flux +!! XCTV,XCHV : cts for the T and moisture variances +!! +!! Module MODD_PARAMETERS +!! +!! JPVEXT : number of vertical external points +!! +!! +!! +!! +!! REFERENCE +!! --------- +!! Book 2 of documentation (routine TURB_HOR) +!! Book 1 of documentation (Chapter: Turbulence) +!! +!! AUTHOR +!! ------ +!! Joan Cuxart * INM and Meteo-France * +!! +!! MODIFICATIONS +!! ------------- +!! Original Aug 29, 1994 +!! Modifications: Feb 14, 1995 (J.Cuxart and J.Stein) +!! Doctorization and Optimization +!! March 21, 1995 (J.M. Carriere) +!! Introduction of cloud water +!! June 14, 1995 (J. Stein) +!! rm the ZVTPV computation + bug in the all +!! or nothing condens. case +!! June 28, 1995 (J.Cuxart) Add the LES tools +!! Sept 19, 1995 (J. Stein) change the surface flux +!! computations +!! Nov 13, 1995 (J. Stein) include the tangential fluxes +!! bug in <u'w'> at the surface +!! Nov 27, 1997 (V. Saravane) spliting of the routine +!! Nov 27, 1997 (V. Masson) clearing of the routine +!! Nov 06, 2002 (V. Masson) LES budgets +!! Feb 20, 2003 (JP Pinty) Add PFRAC_ICE +!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +!! -------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_CTURB +USE MODD_IO, ONLY: TFILEDATA +USE MODD_PARAMETERS +USE MODD_LES +! +USE MODI_TURB_HOR_THERMO_FLUX +USE MODI_TURB_HOR_THERMO_CORR +USE MODI_TURB_HOR_DYN_CORR +USE MODI_TURB_HOR_UV +USE MODI_TURB_HOR_UW +USE MODI_TURB_HOR_VW +USE MODI_TURB_HOR_SV_FLUX +USE MODI_TURB_HOR_SV_CORR +! +IMPLICIT NONE +! +! +!* 0.1 declaration of arguments +! +! +INTEGER, INTENT(IN) :: KSPLT ! current split index +INTEGER, INTENT(IN) :: KRR ! number of moist var. +INTEGER, INTENT(IN) :: KRRL ! number of liquid water var. +INTEGER, INTENT(IN) :: KRRI ! number of ice water var. +REAL, INTENT(IN) :: PTSTEP ! +LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the + ! turbulent fluxes in the syncronous FM-file +LOGICAL, INTENT(IN) :: OSUBG_COND ! Switch for sub-grid +! condensation +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX, PDYY, PDZZ, PDZX, PDZY + ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! vertical grid +REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSXW, PDIRCOSYW, PDIRCOSZW +! Director Cosinus along x, y and z directions at surface w-point +REAL, DIMENSION(:,:), INTENT(IN) :: PCOSSLOPE ! cosinus of the angle + ! between i and the slope vector +REAL, DIMENSION(:,:), INTENT(IN) :: PSINSLOPE ! sinus of the angle + ! between i and the slope vector + +REAL, DIMENSION(:,:,:), INTENT(IN) :: PK ! Turbulent diffusion doef. + ! PK = PLM * SQRT(PTKEM) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDXX ! 1./PDXX +REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDYY ! 1./PDYY +REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDZZ ! 1./PDZZ +REAL, DIMENSION(:,:,:), INTENT(IN) :: PMZM_PRHODJ ! MZM(PRHODJ) + +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density * grid volume +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! ref. state VPT +! +REAL, DIMENSION(:,:), INTENT(IN) :: PSFTHM,PSFRM +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSFSVM ! surface fluxes +! +REAL, DIMENSION(:,:), INTENT(IN) :: PCDUEFF ! Cd * || u || at time t +REAL, DIMENSION(:,:), INTENT(IN) :: PTAU11M ! <uu> in the axes linked + ! to the maximum slope direction and the surface normal and the binormal + ! at time t - dt +REAL, DIMENSION(:,:), INTENT(IN) :: PTAU12M ! <uv> in the same axes +REAL, DIMENSION(:,:), INTENT(IN) :: PTAU22M ! <vv> in the same axes +REAL, DIMENSION(:,:), INTENT(IN) :: PTAU33M ! <ww> in the same axes +! +! Variables at t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM,PVM,PWM,PTHLM +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! mixing ratios at t-1, + ! where PRM(:,:,:,1) = conservative mixing ratio +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! scalar var. at t-1 +REAL, DIMENSION(:,:), INTENT(IN) :: PUSLOPEM ! wind component along the + ! maximum slope direction +REAL, DIMENSION(:,:), INTENT(IN) :: PVSLOPEM ! wind component along the + ! direction normal to the maximum slope one +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t- dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! dissipative length +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exner at time t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA ! coefficients between +REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! s and Thetal and Rnp + +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM + ! normalized 2nd-order flux + ! s'r'c/2Sigma_s2 at t-1 multiplied by Lambda_3 +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFRAC_ICE ! ri fraction of rc+ri +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS, PRWS, PRTHLS +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS,PRRS ! var. at t+1 -split- +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDP,PTP ! TKE production terms +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSIGS + ! IN: Vertical part of Sigma_s at t + ! OUT: Total Sigma_s at t +! +! +! +!* 0.2 declaration of local variables +! +! --------------------------------------------------------------------------- +! +!* 1. PRELIMINARY COMPUTATIONS +! ------------------------ +! +!* Exchange coefficient is limited in order to insure numerical stability +! +!! +!* 2. < U' THETA'l > +!* 3. < U' R'np > +!* 4. < U' TPV' > +!* 5. < V' THETA'l > +!* 6. < V' R'np > +!* 7. < V' TPV' > +! + CALL TURB_HOR_THERMO_FLUX(KSPLT, KRR, KRRL, KRRI, & + OTURB_FLX,OSUBG_COND, & + TPFILE, & + PK,PINV_PDXX,PINV_PDYY,PINV_PDZZ,PMZM_PRHODJ, & + PDXX,PDYY,PDZZ,PDZX,PDZY, & + PDIRCOSXW,PDIRCOSYW, & + PRHODJ, & + PSFTHM,PSFRM, & + PWM,PTHLM,PRM, & + PATHETA,PAMOIST,PSRCM,PFRAC_ICE, & + PRTHLS,PRRS ) +! +! +!* 8. TURBULENT CORRELATIONS : <THl THl>, <THl Rnp>, <Rnp Rnp>, Sigma_s +! + IF (KSPLT==1) & + CALL TURB_HOR_THERMO_CORR(KRR, KRRL, KRRI, & + OTURB_FLX,OSUBG_COND, & + TPFILE, & + PINV_PDXX,PINV_PDYY, & + PDXX,PDYY,PDZZ,PDZX,PDZY, & + PTHVREF, & + PWM,PTHLM,PRM, & + PTKEM,PLM,PLEPS, & + PLOCPEXNM,PATHETA,PAMOIST,PSRCM, & + PSIGS ) +! +! +!* 9. < U'U'> +!* 10. < V'V'> +!* 11. < W'W'> +! + CALL TURB_HOR_DYN_CORR(KSPLT, PTSTEP, & + OTURB_FLX,KRR, & + TPFILE, & + PK,PINV_PDZZ, & + PDXX,PDYY,PDZZ,PDZX,PDZY,PZZ, & + PDIRCOSZW, & + PCOSSLOPE,PSINSLOPE, & + PRHODJ, & + PCDUEFF,PTAU11M,PTAU12M,PTAU22M,PTAU33M, & + PUM,PVM,PWM, PUSLOPEM,PVSLOPEM, & + PTHLM,PRM,PSVM, & + PTKEM,PLM, & + PDP,PTP, & + PRUS,PRVS,PRWS ) +! +! +!* 12. < U'V'> +! + CALL TURB_HOR_UV(KSPLT, & + OTURB_FLX, & + TPFILE, & + PK,PINV_PDXX,PINV_PDYY,PINV_PDZZ,PMZM_PRHODJ, & + PDXX,PDYY,PDZZ,PDZX,PDZY, & + PDIRCOSZW, & + PCOSSLOPE,PSINSLOPE, & + PRHODJ, & + PCDUEFF,PTAU11M,PTAU12M,PTAU22M,PTAU33M, & + PUM,PVM,PUSLOPEM,PVSLOPEM, & + PDP, & + PRUS,PRVS ) +! +! +!* 13. < U'W'> +! + CALL TURB_HOR_UW(KSPLT, & + OTURB_FLX,KRR, & + TPFILE, & + PK,PINV_PDXX,PINV_PDZZ,PMZM_PRHODJ, & + PDXX,PDZZ,PDZX, & + PRHODJ,PTHVREF, & + PUM,PWM,PTHLM,PRM,PSVM, & + PTKEM,PLM, & + PDP, & + PRUS,PRWS ) +! +! +!* 14. < V'W'> +! + CALL TURB_HOR_VW(KSPLT, & + OTURB_FLX,KRR, & + TPFILE, & + PK,PINV_PDYY,PINV_PDZZ,PMZM_PRHODJ, & + PDYY,PDZZ,PDZY, & + PRHODJ,PTHVREF, & + PVM,PWM,PTHLM,PRM,PSVM, & + PTKEM,PLM, & + PDP, & + PRVS,PRWS ) + +! +! +!* 15. HORIZONTAL FLUXES OF PASSIVE SCALARS +! + CALL TURB_HOR_SV_FLUX(KSPLT, & + OTURB_FLX, & + TPFILE, & + PK,PINV_PDXX,PINV_PDYY,PINV_PDZZ,PMZM_PRHODJ, & + PDXX,PDYY,PDZZ,PDZX,PDZY, & + PDIRCOSXW,PDIRCOSYW, & + PRHODJ,PWM, & + PSFSVM, & + PSVM, & + PRSVS ) +! + IF (KSPLT==1 .AND. LLES_CALL) & + CALL TURB_HOR_SV_CORR(KRR,KRRL,KRRI, & + PDXX,PDYY,PDZZ,PDZX,PDZY, & + PLM,PLEPS,PTKEM,PTHVREF, & + PTHLM,PRM, & + PLOCPEXNM,PATHETA,PAMOIST,PSRCM, & + PWM,PSVM ) +! +! +END SUBROUTINE TURB_HOR diff --git a/src/mesonh/turb/turb_hor_dyn_corr.f90 b/src/mesonh/turb/turb_hor_dyn_corr.f90 new file mode 100644 index 000000000..2a4a3e98d --- /dev/null +++ b/src/mesonh/turb/turb_hor_dyn_corr.f90 @@ -0,0 +1,625 @@ +!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +MODULE MODI_TURB_HOR_DYN_CORR +! +INTERFACE +! + SUBROUTINE TURB_HOR_DYN_CORR(KSPLT, PTSTEP, & + OTURB_FLX,KRR, & + TPFILE, & + PK,PINV_PDZZ, & + PDXX,PDYY,PDZZ,PDZX,PDZY,PZZ, & + PDIRCOSZW, & + PCOSSLOPE,PSINSLOPE, & + PRHODJ, & + PCDUEFF,PTAU11M,PTAU12M,PTAU22M,PTAU33M, & + PUM,PVM,PWM,PUSLOPEM,PVSLOPEM, & + PTHLM,PRM,PSVM, & + PTKEM,PLM, & + PDP,PTP, & + PRUS,PRVS,PRWS ) +! +USE MODD_IO, ONLY: TFILEDATA +! +INTEGER, INTENT(IN) :: KSPLT ! split process index +REAL, INTENT(IN) :: PTSTEP ! timestep +LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the + ! turbulent fluxes in the syncronous FM-file +INTEGER, INTENT(IN) :: KRR ! number of moist var. +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PK ! Turbulent diffusion doef. + ! PK = PLM * SQRT(PTKEM) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDZZ ! 1./PDZZ +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX, PDYY, PDZZ, PDZX, PDZY + ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! vertical grid +REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSZW +! Director Cosinus along z directions at surface w-point +REAL, DIMENSION(:,:), INTENT(IN) :: PCOSSLOPE ! cosinus of the angle + ! between i and the slope vector +REAL, DIMENSION(:,:), INTENT(IN) :: PSINSLOPE ! sinus of the angle + ! between i and the slope vector +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density * grid volume +! +REAL, DIMENSION(:,:), INTENT(IN) :: PCDUEFF ! Cd * || u || at time t +REAL, DIMENSION(:,:), INTENT(IN) :: PTAU11M ! <uu> in the axes linked + ! to the maximum slope direction and the surface normal and the binormal + ! at time t - dt +REAL, DIMENSION(:,:), INTENT(IN) :: PTAU12M ! <uv> in the same axes +REAL, DIMENSION(:,:), INTENT(IN) :: PTAU22M ! <vv> in the same axes +REAL, DIMENSION(:,:), INTENT(IN) :: PTAU33M ! <ww> in the same axes +! +! Variables at t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM,PVM,PWM,PTHLM +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM +REAL, DIMENSION(:,:), INTENT(IN) :: PUSLOPEM ! wind component along the + ! maximum slope direction +REAL, DIMENSION(:,:), INTENT(IN) :: PVSLOPEM ! wind component along the + ! direction normal to the maximum slope one +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t- dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS, PRWS +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDP,PTP ! TKE production terms +! +! +! +END SUBROUTINE TURB_HOR_DYN_CORR +! +END INTERFACE +! +END MODULE MODI_TURB_HOR_DYN_CORR +! ################################################################ + SUBROUTINE TURB_HOR_DYN_CORR(KSPLT, PTSTEP, & + OTURB_FLX,KRR, & + TPFILE, & + PK,PINV_PDZZ, & + PDXX,PDYY,PDZZ,PDZX,PDZY,PZZ, & + PDIRCOSZW, & + PCOSSLOPE,PSINSLOPE, & + PRHODJ, & + PCDUEFF,PTAU11M,PTAU12M,PTAU22M,PTAU33M, & + PUM,PVM,PWM,PUSLOPEM,PVSLOPEM, & + PTHLM,PRM,PSVM, & + PTKEM,PLM, & + PDP,PTP, & + PRUS,PRVS,PRWS ) +! ################################################################ +! +!!**** *TURB_HOR* -routine to compute the source terms in the meso-NH +!! model equations due to the non-vertical turbulent fluxes. +!! +!! PURPOSE +!! ------- +!! +!! see TURB_HOR +!! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! +!! Joan Cuxart * INM and Meteo-France * +!! +!! MODIFICATIONS +!! ------------- +!! Aug , 1997 (V. Saravane) spliting of TURB_HOR +!! Nov 27, 1997 (V. Masson) clearing of the routine +!! Oct 18, 2000 (V. Masson) LES computations + LFLAT switch +!! Feb 15, 2001 (J. Stein) remove the use of w=0 at the +!! ground +!! Mar 12, 2001 (V. Masson and J. Stein) major bugs +!! + change of discretization at the surface +!! Nov 06, 2002 (V. Masson) LES budgets +!! October 2009 (G. Tanguy) add ILENCH=LEN(YCOMMENT) after +!! change of YCOMMENT +!! July 2012 (V.Masson) Implicitness of W +!! March 2014 (V.Masson) tridiag_w : bug between +!! mass and flux position +!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 +!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine +!! -------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_ARGSLIST_ll, ONLY: LIST_ll +USE MODD_CST +USE MODD_CONF +USE MODD_CTURB +use modd_field, only: tfielddata, TYPEREAL +USE MODD_IO, ONLY: TFILEDATA +USE MODD_PARAMETERS +USE MODD_LES +USE MODD_NSV +! +USE MODE_ll +USE MODE_IO_FIELD_WRITE, only: IO_Field_write +! +USE MODI_GRADIENT_M +USE MODI_GRADIENT_U +USE MODI_GRADIENT_V +USE MODI_GRADIENT_W +USE MODI_SHUMAN +USE MODI_COEFJ +USE MODI_LES_MEAN_SUBGRID +USE MODI_TRIDIAG_W +! +USE MODI_SECOND_MNH +USE MODE_MPPDB +! +IMPLICIT NONE +! +! +!* 0.1 declaration of arguments +! +! +! +INTEGER, INTENT(IN) :: KSPLT ! split process index +REAL, INTENT(IN) :: PTSTEP ! timestep +LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the + ! turbulent fluxes in the syncronous FM-file +INTEGER, INTENT(IN) :: KRR ! number of moist var. +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PK ! Turbulent diffusion doef. + ! PK = PLM * SQRT(PTKEM) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDZZ ! 1./PDZZ +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX, PDYY, PDZZ, PDZX, PDZY + ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! vertical grid +REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSZW +! Director Cosinus along z directions at surface w-point +REAL, DIMENSION(:,:), INTENT(IN) :: PCOSSLOPE ! cosinus of the angle + ! between i and the slope vector +REAL, DIMENSION(:,:), INTENT(IN) :: PSINSLOPE ! sinus of the angle + ! between i and the slope vector +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density * grid volume +! +REAL, DIMENSION(:,:), INTENT(IN) :: PCDUEFF ! Cd * || u || at time t +REAL, DIMENSION(:,:), INTENT(IN) :: PTAU11M ! <uu> in the axes linked + ! to the maximum slope direction and the surface normal and the binormal + ! at time t - dt +REAL, DIMENSION(:,:), INTENT(IN) :: PTAU12M ! <uv> in the same axes +REAL, DIMENSION(:,:), INTENT(IN) :: PTAU22M ! <vv> in the same axes +REAL, DIMENSION(:,:), INTENT(IN) :: PTAU33M ! <ww> in the same axes +! +! Variables at t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM,PVM,PWM,PTHLM +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM +REAL, DIMENSION(:,:), INTENT(IN) :: PUSLOPEM ! wind component along the + ! maximum slope direction +REAL, DIMENSION(:,:), INTENT(IN) :: PVSLOPEM ! wind component along the + ! direction normal to the maximum slope one +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t- dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS, PRWS +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDP,PTP ! TKE production terms +! +! +! +!* 0.2 declaration of local variables +! +REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2),SIZE(PUM,3)) & + :: ZFLX,ZWORK + ! work arrays, PK is the turb. mixing coef. +! +REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2)) ::ZDIRSINZW + ! sinus of the angle between the vertical and the normal to the orography +INTEGER :: IKB,IKE + ! Index values for the Beginning and End + ! mass points of the domain +INTEGER :: IKU +INTEGER :: JSV ! scalar loop counter +! +REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2),SIZE(PUM,3)) :: GX_U_M_PUM +REAL, DIMENSION(SIZE(PVM,1),SIZE(PVM,2),SIZE(PVM,3)) :: GY_V_M_PVM +REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3)) :: GZ_W_M_PWM +REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3)) :: GZ_W_M_ZWP +REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3)) :: ZMZF_DZZ ! MZF(PDZZ) +REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3)) :: ZDFDDWDZ ! formal derivative of the +! ! flux (variable: dW/dz) +REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3)) :: ZWP ! W at future time-step +! +REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),1) :: ZDU_DZ_DZS_DX ! du/dz*dzs/dx surf +REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),1) :: ZDV_DZ_DZS_DY ! dv/dz*dzs/dy surf +REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),1) :: ZDU_DX ! du/dx surf +REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),1) :: ZDV_DY ! dv/dy surf +REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),1) :: ZDW_DZ ! dw/dz surf +! +INTEGER :: IINFO_ll ! return code of parallel routine +TYPE(LIST_ll), POINTER :: TZFIELDS_ll ! list of fields to exchange + +REAL :: ZTIME1, ZTIME2 + + +REAL, DIMENSION(SIZE(PDZZ,1),SIZE(PDZZ,2),1+JPVEXT:3+JPVEXT) :: ZCOEFF , ZDZZ + ! coefficients for the uncentred gradient + ! computation near the ground +TYPE(TFIELDDATA) :: TZFIELD +! -------------------------------------------------------------------------- +! +!* 1. PRELIMINARY COMPUTATIONS +! ------------------------ +NULLIFY(TZFIELDS_ll) +! +IKB = 1+JPVEXT +IKE = SIZE(PUM,3)-JPVEXT +IKU = SIZE(PUM,3) +! +! +ZDIRSINZW(:,:) = SQRT( 1. - PDIRCOSZW(:,:)**2 ) +! +GX_U_M_PUM = GX_U_M(PUM,PDXX,PDZZ,PDZX) +IF (.NOT. L2D) GY_V_M_PVM = GY_V_M(PVM,PDYY,PDZZ,PDZY) +GZ_W_M_PWM = GZ_W_M(PWM,PDZZ) +! +ZMZF_DZZ = MZF(PDZZ) +! +CALL ADD3DFIELD_ll( TZFIELDS_ll, ZFLX, 'TURB_HOR_DYN_CORR::ZFLX' ) + + +! compute the coefficients for the uncentred gradient computation near the +! ground +! +!* 9. < U'U'> +! ------- +! +! Computes the U variance +IF (.NOT. L2D) THEN + ZFLX(:,:,:)= (2./3.) * PTKEM & + - XCMFS * PK *( (4./3.) * GX_U_M_PUM & + -(2./3.) * ( GY_V_M_PVM & + +GZ_W_M_PWM ) ) + !! & to be tested later + !! + XCMFB * PLM / SQRT(PTKEM) * (-2./3.) * PTP +ELSE + ZFLX(:,:,:)= (2./3.) * PTKEM & + - XCMFS * PK *( (4./3.) * GX_U_M_PUM & + -(2./3.) * ( GZ_W_M_PWM ) ) + !! & to be tested later + !! + XCMFB * PLM / SQRT(PTKEM) * (-2./3.) * PTP +END IF +! +ZFLX(:,:,IKE+1) = ZFLX(:,:,IKE) +! +!* prescription of du/dz and dv/dz with uncentered gradient at the surface +! prescription of dw/dz at Dz/2 above ground using the continuity equation +! using a Boussinesq hypothesis to remove the z dependance of rhod_ref +! (div u = 0) +! +ZDZZ(:,:,:) = MXM(PDZZ(:,:,IKB:IKB+2)) +ZCOEFF(:,:,IKB+2)= - ZDZZ(:,:,2) / & + ( (ZDZZ(:,:,3)+ZDZZ(:,:,2)) * ZDZZ(:,:,3) ) +ZCOEFF(:,:,IKB+1)= (ZDZZ(:,:,3)+ZDZZ(:,:,2)) / & + ( ZDZZ(:,:,2) * ZDZZ(:,:,3) ) +ZCOEFF(:,:,IKB)= - (ZDZZ(:,:,3)+2.*ZDZZ(:,:,2)) / & + ( (ZDZZ(:,:,3)+ZDZZ(:,:,2)) * ZDZZ(:,:,2) ) +! +ZDU_DZ_DZS_DX(:,:,:)=MXF ((ZCOEFF(:,:,IKB+2:IKB+2)*PUM(:,:,IKB+2:IKB+2) & + +ZCOEFF(:,:,IKB+1:IKB+1)*PUM(:,:,IKB+1:IKB+1) & + +ZCOEFF(:,:,IKB :IKB )*PUM(:,:,IKB :IKB ) & + )* 0.5 * ( PDZX(:,:,IKB+1:IKB+1)+PDZX(:,:,IKB:IKB)) & + )/ MXF(PDXX(:,:,IKB:IKB)) +! +ZDZZ(:,:,:) = MYM(PDZZ(:,:,IKB:IKB+2)) +ZCOEFF(:,:,IKB+2)= - ZDZZ(:,:,2) / & + ( (ZDZZ(:,:,3)+ZDZZ(:,:,2)) * ZDZZ(:,:,3) ) +ZCOEFF(:,:,IKB+1)= (ZDZZ(:,:,3)+ZDZZ(:,:,2)) / & + ( ZDZZ(:,:,2) * ZDZZ(:,:,3) ) +ZCOEFF(:,:,IKB)= - (ZDZZ(:,:,3)+2.*ZDZZ(:,:,2)) / & + ( (ZDZZ(:,:,3)+ZDZZ(:,:,2)) * ZDZZ(:,:,2) ) +! + +ZDV_DZ_DZS_DY(:,:,:)=MYF ((ZCOEFF(:,:,IKB+2:IKB+2)*PVM(:,:,IKB+2:IKB+2) & + +ZCOEFF(:,:,IKB+1:IKB+1)*PVM(:,:,IKB+1:IKB+1) & + +ZCOEFF(:,:,IKB :IKB )*PVM(:,:,IKB :IKB ) & + )* 0.5 * ( PDZY(:,:,IKB+1:IKB+1)+PDZY(:,:,IKB:IKB)) & + )/ MYF(PDYY(:,:,IKB:IKB)) +! +! +ZDU_DX(:,:,:)= DXF(PUM(:,:,IKB:IKB)) / MXF(PDXX(:,:,IKB:IKB)) & + - ZDU_DZ_DZS_DX(:,:,:) + +ZDV_DY(:,:,:)= DYF(PVM(:,:,IKB:IKB)) / MYF(PDYY(:,:,IKB:IKB)) & + - ZDV_DZ_DZS_DY(:,:,:) +! +ZDW_DZ(:,:,:)=-ZDU_DX(:,:,:)-ZDV_DY(:,:,:) +! +!* computation +! +ZFLX(:,:,IKB) = (2./3.) * PTKEM(:,:,IKB) & + - XCMFS * PK(:,:,IKB) * 2. * ZDU_DX(:,:,1) + + +!! & to be tested later +!! + XCMFB * PLM(:,:,IKB:IKB) /SQRT(PTKEM(:,:,IKB:IKB)) * & +!! (-2./3.) * PTP(:,:,IKB:IKB) +! +! extrapolates this flux under the ground with the surface flux +ZFLX(:,:,IKB-1) = & + PTAU11M(:,:) * PCOSSLOPE(:,:)**2 * PDIRCOSZW(:,:)**2 & + -2. * PTAU12M(:,:) * PCOSSLOPE(:,:)* PSINSLOPE(:,:) * PDIRCOSZW(:,:) & + + PTAU22M(:,:) * PSINSLOPE(:,:)**2 & + + PTAU33M(:,:) * PCOSSLOPE(:,:)**2 * ZDIRSINZW(:,:)**2 & + +2. * PCDUEFF(:,:) * ( & + PVSLOPEM(:,:) * PCOSSLOPE(:,:) * PSINSLOPE(:,:) * ZDIRSINZW(:,:) & + - PUSLOPEM(:,:) * PCOSSLOPE(:,:)**2 * ZDIRSINZW(:,:) * PDIRCOSZW(:,:) ) +! +ZFLX(:,:,IKB-1) = 2. * ZFLX(:,:,IKB-1) - ZFLX(:,:,IKB) +! +CALL UPDATE_HALO_ll(TZFIELDS_ll, IINFO_ll) +IF ( tpfile%lopened .AND. OTURB_FLX ) THEN + ! stores <U U> + TZFIELD%CMNHNAME = 'U_VAR' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'U_VAR' + TZFIELD%CUNITS = 'm2 s-2' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_U_VAR' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZFLX) +END IF +! +! Complete the U tendency +IF (.NOT. LFLAT) THEN +CALL MPPDB_CHECK3DM("before turb_corr:PRUS,PRHODJ,ZFLX,PDXX,PDZX,PINV_PDZZ",PRECISION,& + & PRUS,PRHODJ,ZFLX,PDXX,PDZX,PINV_PDZZ ) + + PRUS(:,:,:)=PRUS & + -DXM(PRHODJ * ZFLX / MXF(PDXX) ) & + +DZF( PDZX / MZM(PDXX) * MXM( MZM(PRHODJ*ZFLX) * PINV_PDZZ ) ) +CALL MPPDB_CHECK3DM("after turb_corr:PRUS,PRHODJ,ZFLX,PDXX,PDZX,PINV_PDZZ",PRECISION,& + & PRUS,PRHODJ,ZFLX,PDXX,PDZX,PINV_PDZZ ) +ELSE + PRUS(:,:,:)=PRUS -DXM(PRHODJ * ZFLX / MXF(PDXX) ) +END IF +! +IF (KSPLT==1) THEN + ! Contribution to the dynamic production of TKE: + ZWORK(:,:,:) = - ZFLX(:,:,:) * GX_U_M_PUM + ! + ! evaluate the dynamic production at w(IKB+1) in PDP(IKB) + ! + ZWORK(:,:,IKB) = 0.5* ( -ZFLX(:,:,IKB)*ZDU_DX(:,:,1) + ZWORK(:,:,IKB+1) ) + ! + PDP(:,:,:) = PDP(:,:,:) + ZWORK(:,:,:) +END IF +! +! Storage in the LES configuration +! +IF (LLES_CALL .AND. KSPLT==1) THEN + CALL SECOND_MNH(ZTIME1) + CALL LES_MEAN_SUBGRID( ZFLX, X_LES_SUBGRID_U2 ) + CALL LES_MEAN_SUBGRID( -ZWORK, X_LES_RES_ddxa_U_SBG_UaU , .TRUE.) + CALL SECOND_MNH(ZTIME2) + XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 +END IF + +! +!* 10. < V'V'> +! ------- +! +! Computes the V variance +IF (.NOT. L2D) THEN + ZFLX(:,:,:)= (2./3.) * PTKEM & + - XCMFS * PK *( (4./3.) * GY_V_M_PVM & + -(2./3.) * ( GX_U_M_PUM & + +GZ_W_M_PWM ) ) + !! & to be tested + !! + XCMFB * PLM / SQRT(PTKEM) * (-2./3.) * PTP + ! +ELSE + ZFLX(:,:,:)= (2./3.) * PTKEM & + - XCMFS * PK *(-(2./3.) * ( GX_U_M_PUM & + +GZ_W_M_PWM ) ) + !! & to be tested + !! + XCMFB * PLM / SQRT(PTKEM) * (-2./3.) * PTP + ! +END IF +! +ZFLX(:,:,IKE+1) = ZFLX(:,:,IKE) +! +ZFLX(:,:,IKB) = (2./3.) * PTKEM(:,:,IKB) & + - XCMFS * PK(:,:,IKB) * 2. * ZDV_DY(:,:,1) + +!! & to be tested +!! + XCMFB * PLM(:,:,IKB:IKB) /SQRT(PTKEM(:,:,IKB:IKB)) * & +!! (-2./3.) * PTP(:,:,IKB:IKB) +! +! extrapolates this flux under the ground with the surface flux +ZFLX(:,:,IKB-1) = & + PTAU11M(:,:) * PSINSLOPE(:,:)**2 * PDIRCOSZW(:,:)**2 & + +2. * PTAU12M(:,:) * PCOSSLOPE(:,:)* PSINSLOPE(:,:) * PDIRCOSZW(:,:) & + + PTAU22M(:,:) * PCOSSLOPE(:,:)**2 & + + PTAU33M(:,:) * PSINSLOPE(:,:)**2 * ZDIRSINZW(:,:)**2 & + -2. * PCDUEFF(:,:)* ( & + PUSLOPEM(:,:) * PSINSLOPE(:,:)**2 * ZDIRSINZW(:,:) * PDIRCOSZW(:,:) & + + PVSLOPEM(:,:) * PCOSSLOPE(:,:) * PSINSLOPE(:,:) * ZDIRSINZW(:,:) ) +! +ZFLX(:,:,IKB-1) = 2. * ZFLX(:,:,IKB-1) - ZFLX(:,:,IKB) +! +CALL UPDATE_HALO_ll(TZFIELDS_ll, IINFO_ll) +! +IF ( tpfile%lopened .AND. OTURB_FLX ) THEN + ! stores <V V> + TZFIELD%CMNHNAME = 'V_VAR' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'V_VAR' + TZFIELD%CUNITS = 'm2 s-2' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_V_VAR' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZFLX) +END IF +! +! Complete the V tendency +IF (.NOT. L2D) THEN + IF (.NOT. LFLAT) THEN + PRVS(:,:,:)=PRVS & + -DYM(PRHODJ * ZFLX / MYF(PDYY) ) & + +DZF( PDZY / MZM(PDYY) * & + MYM( MZM(PRHODJ*ZFLX) * PINV_PDZZ ) ) + ELSE + PRVS(:,:,:)=PRVS -DYM(PRHODJ * ZFLX / MYF(PDYY) ) + END IF +! +! Contribution to the dynamic production of TKE: + IF (KSPLT==1) ZWORK(:,:,:) = - ZFLX(:,:,:) * GY_V_M_PVM +ELSE + ZWORK(:,:,:) = 0. +END IF +! +IF (KSPLT==1) THEN + ! + ! evaluate the dynamic production at w(IKB+1) in PDP(IKB) + ! + ZWORK(:,:,IKB) = 0.5* ( -ZFLX(:,:,IKB)*ZDV_DY(:,:,1) + ZWORK(:,:,IKB+1) ) + ! + PDP(:,:,:) = PDP(:,:,:) + ZWORK(:,:,:) +END IF +! +! Storage in the LES configuration +! +IF (LLES_CALL .AND. KSPLT==1) THEN + CALL SECOND_MNH(ZTIME1) + CALL LES_MEAN_SUBGRID( ZFLX, X_LES_SUBGRID_V2 ) + CALL LES_MEAN_SUBGRID( -ZWORK, X_LES_RES_ddxa_V_SBG_UaV , .TRUE.) + CALL SECOND_MNH(ZTIME2) + XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 +END IF +! +!* 11. < W'W'> +! ------- +! +! Computes the W variance +IF (.NOT. L2D) THEN + ZFLX(:,:,:)= (2./3.) * PTKEM & + - XCMFS * PK *( (4./3.) * GZ_W_M_PWM & + -(2./3.) * ( GX_U_M_PUM & + +GY_V_M_PVM ) ) + !! & to be tested + !! -2.* XCMFB * PLM / SQRT(PTKEM) * (-2./3.) * PTP +ELSE + ZFLX(:,:,:)= (2./3.) * PTKEM & + - XCMFS * PK *( (4./3.) * GZ_W_M_PWM & + -(2./3.) * ( GX_U_M_PUM ) ) + !! & to be tested + !! -2.* XCMFB * PLM / SQRT(PTKEM) * (-2./3.) * PTP +END IF +! +ZFLX(:,:,IKE+1)= ZFLX(:,:,IKE) +! +ZFLX(:,:,IKB) = (2./3.) * PTKEM(:,:,IKB) & + - XCMFS * PK(:,:,IKB) * 2. * ZDW_DZ(:,:,1) + +! & to be tested +! - 2.* XCMFB * PLM(:,:,IKB:IKB) /SQRT(PTKEM(:,:,IKB:IKB)) * & +! (-2./3.) * PTP(:,:,IKB:IKB) +! +! extrapolates this flux under the ground with the surface flux +ZFLX(:,:,IKB-1) = & + PTAU11M(:,:) * ZDIRSINZW(:,:)**2 & + + PTAU33M(:,:) * PDIRCOSZW(:,:)**2 & + +2. * PCDUEFF(:,:)* PUSLOPEM(:,:) * ZDIRSINZW(:,:) * PDIRCOSZW(:,:) + ! +ZFLX(:,:,IKB-1) = 2. * ZFLX(:,:,IKB-1) - ZFLX(:,:,IKB) +! +IF ( tpfile%lopened .AND. OTURB_FLX ) THEN + ! stores <W W> + TZFIELD%CMNHNAME = 'W_VAR' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'W_VAR' + TZFIELD%CUNITS = 'm2 s-2' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_W_VAR' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZFLX) +END IF +! +! Complete the W tendency +! +!PRWS(:,:,:)=PRWS(:,:,:) - DZM( PRHODJ*ZFLX/MZF(PDZZ) ) +ZDFDDWDZ(:,:,:) = - XCMFS * PK(:,:,:) * (4./3.) +ZDFDDWDZ(:,:,:IKB) = 0. +! +CALL TRIDIAG_W(PWM,ZFLX,ZDFDDWDZ,PTSTEP,ZMZF_DZZ,PRHODJ,ZWP) +! +PRWS = PRWS(:,:,:) + MZM(PRHODJ(:,:,:))*(ZWP(:,:,:)-PWM(:,:,:))/PTSTEP +! +!* recomputes flux using guess of W +! +GZ_W_M_ZWP = GZ_W_M(ZWP,PDZZ) +ZFLX(:,:,IKB+1:)=ZFLX(:,:,IKB+1:) & + - XCMFS * PK(:,:,IKB+1:) * (4./3.) * (GZ_W_M_ZWP(:,:,IKB+1:) - GZ_W_M_PWM(:,:,IKB+1:)) +! +IF (KSPLT==1) THEN + !Contribution to the dynamic production of TKE: +! ZWORK(:,:,:) = - ZFLX(:,:,:) * GZ_W_M_PWM + ZWORK(:,:,:) = - ZFLX(:,:,:) * GZ_W_M_ZWP + ! + ! evaluate the dynamic production at w(IKB+1) in PDP(IKB) + ! + ZWORK(:,:,IKB) = 0.5* ( -ZFLX(:,:,IKB)*ZDW_DZ(:,:,1) + ZWORK(:,:,IKB+1) ) + ! + PDP(:,:,:) = PDP(:,:,:) + ZWORK(:,:,:) +END IF +! +! Storage in the LES configuration +! +! +IF (LLES_CALL .AND. KSPLT==1) THEN + CALL SECOND_MNH(ZTIME1) + CALL LES_MEAN_SUBGRID( ZFLX, X_LES_SUBGRID_W2 ) + CALL LES_MEAN_SUBGRID( -ZWORK, X_LES_RES_ddxa_W_SBG_UaW , .TRUE.) + CALL LES_MEAN_SUBGRID( GZ_M_M(PTHLM,PDZZ)*ZFLX, X_LES_RES_ddxa_Thl_SBG_UaW , .TRUE.) + CALL LES_MEAN_SUBGRID(ZFLX*MZF(GZ_M_W(1,IKU,1,PTHLM,PDZZ)),X_LES_RES_ddz_Thl_SBG_W2) + IF (KRR>=1) THEN + CALL LES_MEAN_SUBGRID( GZ_M_M(PRM(:,:,:,1),PDZZ)*ZFLX, & + X_LES_RES_ddxa_Rt_SBG_UaW , .TRUE.) + CALL LES_MEAN_SUBGRID(ZFLX*MZF(GZ_M_W(1,IKU,1,PRM(:,:,:,1),PDZZ)), & + X_LES_RES_ddz_Rt_SBG_W2) + END IF + DO JSV=1,NSV + CALL LES_MEAN_SUBGRID( GZ_M_M(PSVM(:,:,:,JSV),PDZZ)*ZFLX, & + X_LES_RES_ddxa_Sv_SBG_UaW(:,:,:,JSV) , .TRUE.) + CALL LES_MEAN_SUBGRID(ZFLX*MZF(GZ_M_W(1,IKU,1,PSVM(:,:,:,JSV),PDZZ)), & + X_LES_RES_ddz_Sv_SBG_W2(:,:,:,JSV)) + END DO + CALL SECOND_MNH(ZTIME2) + XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 +END IF +! +CALL CLEANLIST_ll(TZFIELDS_ll) +! +! +END SUBROUTINE TURB_HOR_DYN_CORR diff --git a/src/mesonh/turb/turb_hor_splt.f90 b/src/mesonh/turb/turb_hor_splt.f90 new file mode 100644 index 000000000..2de0ca9a8 --- /dev/null +++ b/src/mesonh/turb/turb_hor_splt.f90 @@ -0,0 +1,632 @@ +!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ######################### + MODULE MODI_TURB_HOR_SPLT +! ######################### +! +INTERFACE +! + SUBROUTINE TURB_HOR_SPLT(KSPLIT, KRR, KRRL, KRRI, PTSTEP, & + HLBCX,HLBCY,OTURB_FLX,OSUBG_COND, & + TPFILE, & + PDXX,PDYY,PDZZ,PDZX,PDZY,PZZ, & + PDIRCOSXW,PDIRCOSYW,PDIRCOSZW, & + PCOSSLOPE,PSINSLOPE, & + PRHODJ,PTHVREF, & + PSFTHM,PSFRM,PSFSVM, & + PCDUEFF,PTAU11M,PTAU12M,PTAU22M,PTAU33M, & + PUM,PVM,PWM,PUSLOPEM,PVSLOPEM,PTHLM,PRM,PSVM, & + PTKEM,PLM,PLEPS, & + PLOCPEXNM,PATHETA,PAMOIST,PSRCM,PFRAC_ICE, & + PDP,PTP,PSIGS, & + PTRH, & + PRUS,PRVS,PRWS,PRTHLS,PRRS,PRSVS ) + +! +USE MODD_IO, ONLY: TFILEDATA +! +INTEGER, INTENT(IN) :: KSPLIT ! number of time splitting +INTEGER, INTENT(IN) :: KRR ! number of moist var. +INTEGER, INTENT(IN) :: KRRL ! number of liquid water var. +INTEGER, INTENT(IN) :: KRRI ! number of ice water var. +REAL, INTENT(IN) :: PTSTEP ! timestep +CHARACTER (LEN=*), DIMENSION(:), INTENT(IN) :: HLBCX,HLBCY +LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the + ! turbulent fluxes in the syncronous FM-file +LOGICAL, INTENT(IN) :: OSUBG_COND ! Switch for sub-grid +! condensation +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX, PDYY, PDZZ, PDZX, PDZY + ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! vertical grid +REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSXW, PDIRCOSYW, PDIRCOSZW +! Director Cosinus along x, y and z directions at surface w-point +REAL, DIMENSION(:,:), INTENT(IN) :: PCOSSLOPE ! cosinus of the angle + ! between i and the slope vector +REAL, DIMENSION(:,:), INTENT(IN) :: PSINSLOPE ! sinus of the angle + ! between i and the slope vector +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density * grid volume +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! ref. state VPT +! +REAL, DIMENSION(:,:), INTENT(IN) :: PSFTHM,PSFRM +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSFSVM ! surface fluxes +! +REAL, DIMENSION(:,:), INTENT(IN) :: PCDUEFF ! Cd * || u || at time t +REAL, DIMENSION(:,:), INTENT(IN) :: PTAU11M ! <uu> in the axes linked + ! to the maximum slope direction and the surface normal and the binormal + ! at time t - dt +REAL, DIMENSION(:,:), INTENT(IN) :: PTAU12M ! <uv> in the same axes +REAL, DIMENSION(:,:), INTENT(IN) :: PTAU22M ! <vv> in the same axes +REAL, DIMENSION(:,:), INTENT(IN) :: PTAU33M ! <ww> in the same axes +! +! Variables at t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM,PVM,PWM,PTHLM +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! mixing ratios at t-1, + ! where PRM(:,:,:,1) = conservative mixing ratio +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! scalar var. at t-1 +REAL, DIMENSION(:,:), INTENT(IN) :: PUSLOPEM ! wind component along the + ! maximum slope direction +REAL, DIMENSION(:,:), INTENT(IN) :: PVSLOPEM ! wind component along the + ! direction normal to the maximum slope one +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t- dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! dissipative length +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exner at time t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA ! coefficients between +REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! s and Thetal and Rnp + +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM + ! normalized 2nd-order flux + ! s'r'c/2Sigma_s2 at t-1 multiplied by Lambda_3 +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFRAC_ICE ! ri fraction of rc+ri +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS, PRWS, PRTHLS +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS,PRRS ! var. at t+1 -split- +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDP,PTP ! TKE production terms +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTRH + +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSIGS + ! IN: Vertical part of Sigma_s at t + ! OUT: Total Sigma_s at t +! +! +! +END SUBROUTINE TURB_HOR_SPLT +! +END INTERFACE +! +END MODULE MODI_TURB_HOR_SPLT +! ################################################################ + SUBROUTINE TURB_HOR_SPLT(KSPLIT, KRR, KRRL, KRRI, PTSTEP, & + HLBCX,HLBCY,OTURB_FLX,OSUBG_COND, & + TPFILE, & + PDXX,PDYY,PDZZ,PDZX,PDZY,PZZ, & + PDIRCOSXW,PDIRCOSYW,PDIRCOSZW, & + PCOSSLOPE,PSINSLOPE, & + PRHODJ,PTHVREF, & + PSFTHM,PSFRM,PSFSVM, & + PCDUEFF,PTAU11M,PTAU12M,PTAU22M,PTAU33M, & + PUM,PVM,PWM,PUSLOPEM,PVSLOPEM,PTHLM,PRM,PSVM, & + PTKEM,PLM,PLEPS, & + PLOCPEXNM,PATHETA,PAMOIST,PSRCM,PFRAC_ICE, & + PDP,PTP,PSIGS, & + PTRH, & + PRUS,PRVS,PRWS,PRTHLS,PRRS,PRSVS ) +! ################################################################ +! +! +!!**** *TURB_HOR* -routine to compute the source terms in the meso-NH +!! model equations due to the non-vertical turbulent fluxes. +!! +!! PURPOSE +!! ------- +! The purpose of this routine is to compute the non-vertical +! turbulent fluxes of the evolutive variables and give back the +! source terms to the main program. +! +!!** METHOD +!! ------ +!! Complementary 3D calculations when running at high resolution; +!! The non-vertical turbulent fluxes are computed explicitly. The +!! contributions are cumulated in PRvarS and in DP and TP of TKE +! +! d(rho*T) = -d(rho*u'T'/dxx) -d(-rho*u'T'*dzx/dxx/dzz) +! / dt / dx /dz +!! +!! +!! Near the bottom of the model, uncentred evaluation of vertical +!! gradients are required because no field values are available under +!! the level where the gradient must be evaluated. In this case, the +!! gradient is computed with a second order accurate uncentred scheme +!! according to: +!! +!! D FF dzz3 (dzz3+dzz4) +!! ---- = - ----------------- FF(4) + ----------------- FF(3) +!! D z (dzz3+dzz4) dzz4 dzz3 dzz4 +!! +!! dzz4 + 2 dzz3 +!! - ----------------- FF(2) +!! (dzz3+dzz4) dzz3 +!! +!! where the values are taken from: +!! +!! ----- FF(5) +!! | +!! | dzz5 +!! | +!! ----- FF(4) +!! | +!! | dzz4 +!! | +!! ----- FF(3) +!! | +!! | dzz3 +!! | +!! ----- FF(2) , (D FF / DZ) +!! | dzz2 * 0.5 +!! ----- ground +!! +!! +!! +!! EXTERNAL +!! -------- +!! GX_M_U, GY_M_V +!! GX_M_M, GY_M_M, GZ_M_M +!! GY_U_UV,GX_V_UV +!! GX_U_M, GY_V_M, GZ_W_M +!! GX_W_UW,GY_W_UW +!! : Cartesian vertical gradient operators +!! +!! +!! MXM,MXF,MYM,MYF,MZM,MZF +!! : Shuman functions (mean operators) +!! DXM,DXF.DYM,DYF,DZM,DZF +!! : Shuman functions (difference operators) +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST : contains physical constants +!! +!! XG : gravity constant +!! +!! Module MODD_CTURB: contains the set of constants for +!! the turbulence scheme +!! +!! XCMFS,XCMFB : cts for the momentum flux +!! XCSHF : ct for the sensible heat flux +!! XCHF : ct for the moisture flux +!! XCTV,XCHV : cts for the T and moisture variances +!! +!! Module MODD_PARAMETERS +!! +!! JPVEXT : number of vertical external points +!! +!! Module MODD_CONF +!! +!! CPROGRAM +!! +!! +!! REFERENCE +!! --------- +!! Book 2 of documentation (routine TURB_HOR) +!! Book 1 of documentation (Chapter: Turbulence) +!! +!! AUTHOR +!! ------ +!! Joan Cuxart * INM and Meteo-France * +!! +!! MODIFICATIONS +!! ------------- +!! Original Aug 29, 1994 +!! Modifications: Feb 14, 1995 (J.Cuxart and J.Stein) +!! Doctorization and Optimization +!! March 21, 1995 (J.M. Carriere) +!! Introduction of cloud water +!! June 14, 1995 (J. Stein) +!! rm the ZVTPV computation + bug in the all +!! or nothing condens. case +!! June 28, 1995 (J.Cuxart) Add the LES tools +!! Sept 19, 1995 (J. Stein) change the surface flux +!! computations +!! Nov 13, 1995 (J. Stein) include the tangential fluxes +!! bug in <u'w'> at the surface +!! Nov 27, 1997 (V. Saravane) spliting of the routine +!! Nov 27, 1997 (V. Masson) clearing of the routine +!! Mar 07, 2001 (V. Masson and J. Stein) time splitting +!! + major bugs correction for slopes +!! Nov 06, 2002 (V. Masson) LES budgets +!! Feb 20, 2003 (JP Pinty) Add PFRAC_ICE +!! Oct.2009 (C.Lac) Introduction of different PTSTEP according to the +!! advection schemes +!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 +!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine +!! -------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CONF +USE MODD_CST +USE MODD_CTURB +USE MODD_IO, ONLY: TFILEDATA +USE MODD_PARAMETERS +! +! +USE MODI_SHUMAN +USE MODI_TURB_HOR +USE MODI_TURB_HOR_TKE +! +USE MODE_ll +! +IMPLICIT NONE +! +! +!* 0.1 declaration of arguments +! +! +INTEGER, INTENT(IN) :: KSPLIT ! number of time splitting +INTEGER, INTENT(IN) :: KRR ! number of moist var. +INTEGER, INTENT(IN) :: KRRL ! number of liquid water var. +INTEGER, INTENT(IN) :: KRRI ! number of ice water var. +REAL, INTENT(IN) :: PTSTEP ! timestep +CHARACTER (LEN=*), DIMENSION(:), INTENT(IN) :: HLBCX,HLBCY +LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the + ! turbulent fluxes in the syncronous FM-file +LOGICAL, INTENT(IN) :: OSUBG_COND ! Switch for sub-grid +! condensation +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX, PDYY, PDZZ, PDZX, PDZY + ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! vertical grid +REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSXW, PDIRCOSYW, PDIRCOSZW +! Director Cosinus along x, y and z directions at surface w-point +REAL, DIMENSION(:,:), INTENT(IN) :: PCOSSLOPE ! cosinus of the angle + ! between i and the slope vector +REAL, DIMENSION(:,:), INTENT(IN) :: PSINSLOPE ! sinus of the angle + ! between i and the slope vector +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density * grid volume +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! ref. state VPT +! +REAL, DIMENSION(:,:), INTENT(IN) :: PSFTHM,PSFRM +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSFSVM ! surface fluxes +! +REAL, DIMENSION(:,:), INTENT(IN) :: PCDUEFF ! Cd * || u || at time t +REAL, DIMENSION(:,:), INTENT(IN) :: PTAU11M ! <uu> in the axes linked + ! to the maximum slope direction and the surface normal and the binormal + ! at time t - dt +REAL, DIMENSION(:,:), INTENT(IN) :: PTAU12M ! <uv> in the same axes +REAL, DIMENSION(:,:), INTENT(IN) :: PTAU22M ! <vv> in the same axes +REAL, DIMENSION(:,:), INTENT(IN) :: PTAU33M ! <ww> in the same axes +! +! Variables at t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM,PVM,PWM,PTHLM +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! mixing ratios at t-1, + ! where PRM(:,:,:,1) = conservative mixing ratio +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! scalar var. at t-1 +REAL, DIMENSION(:,:), INTENT(IN) :: PUSLOPEM ! wind component along the + ! maximum slope direction +REAL, DIMENSION(:,:), INTENT(IN) :: PVSLOPEM ! wind component along the + ! direction normal to the maximum slope one +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t- dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! dissipative length +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exner at time t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA ! coefficients between +REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! s and Thetal and Rnp + +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM + ! normalized 2nd-order flux + ! s'r'c/2Sigma_s2 at t-1 multiplied by Lambda_3 +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFRAC_ICE ! ri fraction of rc+ri +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS, PRWS, PRTHLS +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS,PRRS ! var. at t+1 -split- +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDP,PTP ! TKE production terms +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTRH +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSIGS + ! IN: Vertical part of Sigma_s at t + ! OUT: Total Sigma_s at t +! +! +! +!* 0.2 declaration of local variables +! +REAL,ALLOCATABLE,DIMENSION(:,:,:) :: ZK ! Turbulent diffusion doef. + ! ZK = PLM * SQRT(PTKEM) +REAL,ALLOCATABLE,DIMENSION(:,:,:) :: ZINV_PDXX ! 1./PDXX +REAL,ALLOCATABLE,DIMENSION(:,:,:) :: ZINV_PDYY ! 1./PDYY +REAL,ALLOCATABLE,DIMENSION(:,:,:) :: ZINV_PDZZ ! 1./PDZZ +REAL,ALLOCATABLE,DIMENSION(:,:,:) :: ZMZM_PRHODJ ! MZM(PRHODJ) +! +INTEGER :: JSPLT ! current split +! +INTEGER :: IKB, IKE, IIB, IIE, IJB, IJE +INTEGER :: JRR, JSV +! +INTEGER :: ISV +INTEGER :: IINFO_ll +! +REAL,ALLOCATABLE,DIMENSION(:,:,:) :: ZUM, ZVM, ZWM, ZTHLM, ZTKEM +REAL,ALLOCATABLE,DIMENSION(:,:,:,:) :: ZRM, ZSVM +REAL,ALLOCATABLE,DIMENSION(:,:,:) :: ZRUS, ZRVS, ZRWS, ZRTHLS +REAL,ALLOCATABLE,DIMENSION(:,:,:,:) :: ZRRS, ZRSVS +! +! +TYPE(LIST_ll), POINTER, SAVE :: TZFIELDS_ll +! +! --------------------------------------------------------------------------- +! +!* 1. PRELIMINARY COMPUTATIONS +! ------------------------ +! +IKB = 1.+JPVEXT +IKE = SIZE(PUM,3) - JPVEXT +CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) +ISV=SIZE(PSVM,4) +! +ALLOCATE(ZK(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3))) +ALLOCATE(ZINV_PDXX(SIZE(PDXX,1),SIZE(PDXX,2),SIZE(PDXX,3))) +ALLOCATE(ZINV_PDYY(SIZE(PDYY,1),SIZE(PDYY,2),SIZE(PDYY,3))) +ALLOCATE(ZINV_PDZZ(SIZE(PDZZ,1),SIZE(PDZZ,2),SIZE(PDZZ,3))) +ALLOCATE(ZMZM_PRHODJ(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3))) +! +ZINV_PDXX = 1./PDXX +ZINV_PDYY = 1./PDYY +ZINV_PDZZ = 1./PDZZ +ZMZM_PRHODJ = MZM(PRHODJ) +! +ZK(:,:,:) = PLM(:,:,:) * SQRT(PTKEM(:,:,:)) +! +NULLIFY(TZFIELDS_ll) +! +!-------------------------------------------------------------------- +! +!* 2. SPLIT PROCESS LOOP +! ------------------ +! +IF (KSPLIT>1 .AND. CPROGRAM=='MESONH') THEN +! +!* 2.1 allocations +! ----------- +! + ALLOCATE(ZUM(SIZE(PUM,1),SIZE(PUM,2),SIZE(PUM,3))) + ALLOCATE(ZVM(SIZE(PVM,1),SIZE(PVM,2),SIZE(PVM,3))) + ALLOCATE(ZWM(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3))) + ALLOCATE(ZSVM(SIZE(PSVM,1),SIZE(PSVM,2),SIZE(PSVM,3),SIZE(PSVM,4))) + ALLOCATE(ZTHLM(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3))) + ALLOCATE(ZTKEM(SIZE(PTKEM,1),SIZE(PTKEM,2),SIZE(PTKEM,3))) + ALLOCATE(ZRM(SIZE(PRM,1),SIZE(PRM,2),SIZE(PRM,3),SIZE(PRM,4))) + ALLOCATE(ZRUS(SIZE(PRUS,1),SIZE(PRUS,2),SIZE(PRUS,3))) + ALLOCATE(ZRVS(SIZE(PRVS,1),SIZE(PRVS,2),SIZE(PRVS,3))) + ALLOCATE(ZRWS(SIZE(PRWS,1),SIZE(PRWS,2),SIZE(PRWS,3))) + ALLOCATE(ZRSVS(SIZE(PRSVS,1),SIZE(PRSVS,2),SIZE(PRSVS,3),SIZE(PRSVS,4))) + ALLOCATE(ZRTHLS(SIZE(PRTHLS,1),SIZE(PRTHLS,2),SIZE(PRTHLS,3))) + ALLOCATE(ZRRS(SIZE(PRRS,1),SIZE(PRRS,2),SIZE(PRRS,3),SIZE(PRRS,4))) +! +! +!* 2.2 list for parallel exchanges +! --------------------------- +! + CALL ADD3DFIELD_ll( TZFIELDS_ll, ZUM, 'TURB_HOR_SPLT::ZUM' ) + CALL ADD3DFIELD_ll( TZFIELDS_ll, ZVM, 'TURB_HOR_SPLT::ZVM' ) + CALL ADD3DFIELD_ll( TZFIELDS_ll, ZWM, 'TURB_HOR_SPLT::ZWM' ) + CALL ADD3DFIELD_ll( TZFIELDS_ll, ZTHLM, 'TURB_HOR_SPLT::ZTHLM' ) + CALL ADD3DFIELD_ll( TZFIELDS_ll, ZTKEM, 'TURB_HOR_SPLT::ZTKEM' ) + CALL ADD4DFIELD_ll( TZFIELDS_ll, ZSVM(:,:,:,1:ISV), 'TURB_HOR_SPLT::ZSVM(:,:,:,1:ISV)' ) + CALL ADD4DFIELD_ll( TZFIELDS_ll, ZRM(:,:,:,1:KRR), 'TURB_HOR_SPLT::ZRM(:,:,:,1:KRR)' ) +! +! +!* 2.3 initializations +! --------------- +! +! + ZUM=PUM + ZVM=PVM + ZWM=PWM + IF (ISV>0) ZSVM=PSVM + ZTHLM=PTHLM + ZTKEM=PTKEM + IF (KRR>0) ZRM=PRM + ! + ZRUS=PRUS*KSPLIT + ZRVS=PRVS*KSPLIT + ZRWS=PRWS*KSPLIT + IF (ISV>0) ZRSVS=PRSVS*KSPLIT + ZRTHLS=PRTHLS*KSPLIT + IF (KRR>0) ZRRS=PRRS*KSPLIT + +! +!* 2.4 split process +! ------------- +! + DO JSPLT=1,KSPLIT +! +! compute the turbulent tendencies for the small time step + CALL TURB_HOR(JSPLT, KRR, KRRL, KRRI, PTSTEP, & + OTURB_FLX,OSUBG_COND, & + TPFILE, & + PDXX,PDYY,PDZZ,PDZX,PDZY,PZZ, & + PDIRCOSXW,PDIRCOSYW,PDIRCOSZW, & + PCOSSLOPE,PSINSLOPE, & + ZINV_PDXX, ZINV_PDYY, ZINV_PDZZ, ZMZM_PRHODJ, & + ZK, & + PRHODJ,PTHVREF, & + PSFTHM,PSFRM,PSFSVM, & + PCDUEFF,PTAU11M,PTAU12M,PTAU22M,PTAU33M, & + ZUM,ZVM,ZWM,PUSLOPEM,PVSLOPEM,ZTHLM,ZRM,ZSVM, & + PTKEM,PLM,PLEPS, & + PLOCPEXNM,PATHETA,PAMOIST,PSRCM,PFRAC_ICE, & + PDP,PTP,PSIGS, & + ZRUS,ZRVS,ZRWS,ZRTHLS,ZRRS,ZRSVS ) +! +! horizontal transport of Tke +! + CALL TURB_HOR_TKE(JSPLT, & + PDXX,PDYY,PDZZ,PDZX,PDZY, & + ZINV_PDXX, ZINV_PDYY, ZINV_PDZZ, ZMZM_PRHODJ, & + ZK, PRHODJ, ZTKEM, & + PTRH ) +! +! +! split temporal advance + + ZUM=PUM+(ZRUS/KSPLIT-PRUS)/MXM(PRHODJ)*PTSTEP + ZVM=PVM+(ZRVS/KSPLIT-PRVS)/MYM(PRHODJ)*PTSTEP + ZWM=PWM+(ZRWS/KSPLIT-PRWS)/ZMZM_PRHODJ*PTSTEP + DO JSV=1,ISV + ZSVM(:,:,:,JSV)=PSVM(:,:,:,JSV)+ & + (ZRSVS(:,:,:,JSV)/KSPLIT-PRSVS(:,:,:,JSV))/PRHODJ*PTSTEP + END DO + ZTHLM=PTHLM+(ZRTHLS/KSPLIT-PRTHLS)/PRHODJ*PTSTEP + ZTKEM=ZTKEM+PTRH*PTSTEP/KSPLIT + DO JRR=1,KRR + ZRM(:,:,:,JRR)=PRM(:,:,:,JRR)+ & + (ZRRS(:,:,:,JRR)/KSPLIT-PRRS(:,:,:,JRR))/PRHODJ*PTSTEP + END DO +! +! reinforce boundary conditions +! + IF (JSPLT<KSPLIT-NHALO+1) CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll) + ! + IF ( HLBCX(1) /= "CYCL" .AND. LWEST_ll()) THEN + ZUM(IIB ,:,:)=PUM(IIB ,:,:) + ZVM(IIB-1,:,:)=PVM(IIB-1,:,:) + ZWM(IIB-1,:,:)=PWM(IIB-1,:,:) + ZTHLM(IIB-1,:,:)=PTHLM(IIB-1,:,:) + ZTKEM(IIB-1,:,:)=PTKEM(IIB-1,:,:) + IF (ISV>0) ZSVM(IIB-1,:,:,:)=PSVM(IIB-1,:,:,:) + IF (KRR>0) ZRM (IIB-1,:,:,:)=PRM (IIB-1,:,:,:) + ENDIF + ! + IF ( HLBCX(2) /= "CYCL" .AND. LEAST_ll()) THEN + ZUM(IIE+1,:,:)=PUM(IIE+1,:,:) + ZVM(IIE+1,:,:)=PVM(IIE+1,:,:) + ZWM(IIE+1,:,:)=PWM(IIE+1,:,:) + ZTHLM(IIE+1,:,:)=PTHLM(IIE+1,:,:) + ZTKEM(IIE+1,:,:)=PTKEM(IIE+1,:,:) + IF (ISV>0) ZSVM(IIE+1,:,:,:)=PSVM(IIE+1,:,:,:) + IF (KRR>0) ZRM (IIE+1,:,:,:)=PRM(IIE+1,:,:,:) + ENDIF + ! + IF ( HLBCY(1) /= "CYCL" .AND. LSOUTH_ll()) THEN + ZUM(:,IJB-1,:)=PUM(:,IJB-1,:) + ZVM(:,IJB ,:)=PVM(:,IJB ,:) + ZWM(:,IJB-1,:)=PWM(:,IJB-1,:) + ZTHLM(:,IJB-1,:)=PTHLM(:,IJB-1,:) + ZTKEM(:,IJB-1,:)=PTKEM(:,IJB-1,:) + IF (ISV>0) ZSVM(:,IJB-1,:,:)=PSVM(:,IJB-1,:,:) + IF (KRR>0) ZRM (:,IJB-1,:,:)=PRM (:,IJB-1,:,:) + ENDIF + ! + IF ( HLBCY(2) /= "CYCL" .AND. LNORTH_ll()) THEN + ZUM(:,IJE+1,:)=PUM(:,IJE+1,:) + ZVM(:,IJE+1,:)=PVM(:,IJE+1,:) + ZWM(:,IJE+1,:)=PWM(:,IJE+1,:) + ZTHLM(:,IJE+1,:)=PTHLM(:,IJE+1,:) + ZTKEM(:,IJE+1,:)=PTKEM(:,IJE+1,:) + IF (ISV>0) ZSVM(:,IJE+1,:,:)=PSVM(:,IJE+1,:,:) + IF (KRR>0) ZRM (:,IJE+1,:,:)=PRM(:,IJE+1,:,:) + ENDIF + ! + ZUM(:,:,IKB-1)=ZUM(:,:,IKB) + ZVM(:,:,IKB-1)=ZVM(:,:,IKB) + ZWM(:,:,IKB-1)=ZWM(:,:,IKB) + ZTHLM(:,:,IKB-1)=ZTHLM(:,:,IKB) + ZTKEM(:,:,IKB-1)=ZTKEM(:,:,IKB) + IF (ISV>0) ZSVM(:,:,IKB-1,:)=ZSVM(:,:,IKB,:) + IF (KRR>0) ZRM (:,:,IKB-1,:)=ZRM (:,:,IKB,:) + ! + ZUM(:,:,IKE+1)=ZUM(:,:,IKE) + ZVM(:,:,IKE+1)=ZVM(:,:,IKE) + ZWM(:,:,IKE+1)=ZWM(:,:,IKE) + ZTHLM(:,:,IKE+1)=ZTHLM(:,:,IKE) + ZTKEM(:,:,IKE+1)=ZTKEM(:,:,IKE) + IF (ISV>0) ZSVM(:,:,IKE+1,:)=ZSVM(:,:,IKE,:) + IF (KRR>0) ZRM (:,:,IKE+1,:)=ZRM (:,:,IKE,:) + ! + END DO +! +!* 2.5 update the complete tendencies +! ------------------------------ +! + PRUS=ZRUS/KSPLIT + PRVS=ZRVS/KSPLIT + PRWS=ZRWS/KSPLIT + IF (ISV>0) PRSVS=ZRSVS/KSPLIT + PRTHLS=ZRTHLS/KSPLIT + IF (KRR>0) PRRS=ZRRS/KSPLIT + PTRH=(ZTKEM-PTKEM)/PTSTEP +! +!* 2.6 deallocations +! ------------- +! + DEALLOCATE(ZUM) + DEALLOCATE(ZVM) + DEALLOCATE(ZWM) + DEALLOCATE(ZSVM) + DEALLOCATE(ZTHLM) + DEALLOCATE(ZTKEM) + DEALLOCATE(ZRM) + DEALLOCATE(ZRUS) + DEALLOCATE(ZRVS) + DEALLOCATE(ZRWS) + DEALLOCATE(ZRSVS) + DEALLOCATE(ZRTHLS) + DEALLOCATE(ZRRS) + ! + CALL CLEANLIST_ll(TZFIELDS_ll) +! +!------------------------------------------------------------------- +! +!* 4. NO SPLIT PROCESS CASE +! --------------------- +! +ELSE +! + CALL TURB_HOR(1, KRR, KRRL, KRRI, PTSTEP, & + OTURB_FLX,OSUBG_COND, & + TPFILE, & + PDXX,PDYY,PDZZ,PDZX,PDZY,PZZ, & + PDIRCOSXW,PDIRCOSYW,PDIRCOSZW, & + PCOSSLOPE,PSINSLOPE, & + ZINV_PDXX, ZINV_PDYY, ZINV_PDZZ, ZMZM_PRHODJ, & + ZK, & + PRHODJ,PTHVREF, & + PSFTHM,PSFRM,PSFSVM, & + PCDUEFF,PTAU11M,PTAU12M,PTAU22M,PTAU33M, & + PUM,PVM,PWM,PUSLOPEM,PVSLOPEM,PTHLM,PRM,PSVM, & + PTKEM,PLM,PLEPS, & + PLOCPEXNM,PATHETA,PAMOIST,PSRCM,PFRAC_ICE, & + PDP,PTP,PSIGS, & + PRUS,PRVS,PRWS,PRTHLS,PRRS,PRSVS ) + +! horizontal transport of Tke +! + + CALL TURB_HOR_TKE(1, & + PDXX,PDYY,PDZZ,PDZX,PDZY, & + ZINV_PDXX, ZINV_PDYY, ZINV_PDZZ, ZMZM_PRHODJ, & + ZK, PRHODJ, PTKEM, & + PTRH ) +! +END IF +!-------------------------------------------------------------------- +! +DEALLOCATE(ZK) +DEALLOCATE(ZINV_PDXX) +DEALLOCATE(ZINV_PDYY) +DEALLOCATE(ZINV_PDZZ) +DEALLOCATE(ZMZM_PRHODJ) +! +END SUBROUTINE TURB_HOR_SPLT diff --git a/src/mesonh/turb/turb_hor_sv_corr.f90 b/src/mesonh/turb/turb_hor_sv_corr.f90 new file mode 100644 index 000000000..f9e2c7b55 --- /dev/null +++ b/src/mesonh/turb/turb_hor_sv_corr.f90 @@ -0,0 +1,218 @@ +!MNH_LIC Copyright 2002-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ############################ + MODULE MODI_TURB_HOR_SV_CORR +! ############################ +! +INTERFACE +! + SUBROUTINE TURB_HOR_SV_CORR(KRR,KRRL,KRRI, & + PDXX,PDYY,PDZZ,PDZX,PDZY, & + PLM,PLEPS,PTKEM,PTHVREF, & + PTHLM,PRM, & + PLOCPEXNM,PATHETA,PAMOIST,PSRCM, & + PWM,PSVM ) +! +INTEGER, INTENT(IN) :: KRR ! number of moist var. +INTEGER, INTENT(IN) :: KRRL ! number of liquid var. +INTEGER, INTENT(IN) :: KRRI ! number of ice var. +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX, PDYY, PDZZ, PDZX, PDZY + ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! mixing length +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! dissipative length +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! tke +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! reference Thv +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM ! potential temperature at t-Delta t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Mixing ratios at t-Delta t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exnref at time t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA ! coefficients between +REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! s and Thetal and Rnp +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM ! normalized + ! 2nd-order flux s'r'c/2Sigma_s2 at t-1 multiplied by Lambda_3 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PWM ! w at t-1 +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! scalar var. at t-1 +! +! +END SUBROUTINE TURB_HOR_SV_CORR +! +END INTERFACE +! +END MODULE MODI_TURB_HOR_SV_CORR +! ################################################################ + SUBROUTINE TURB_HOR_SV_CORR(KRR,KRRL,KRRI, & + PDXX,PDYY,PDZZ,PDZX,PDZY, & + PLM,PLEPS,PTKEM,PTHVREF, & + PTHLM,PRM, & + PLOCPEXNM,PATHETA,PAMOIST,PSRCM, & + PWM,PSVM ) +! ################################################################ +! +! +!!**** *TURB_HOT_SV_CORR* computes subgrid Sv2 and SvThv terms +!! +!! PURPOSE +!! ------- +!! +!! see TURB_HOR +!! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! +!! V. Masson * Meteo-France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 06/11/02 +!! JP Pinty Feb 20, 2003 Add PFRAC_ICE +!! -------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_CONF +USE MODD_CTURB +USE MODD_PARAMETERS +USE MODD_NSV, ONLY : NSV,NSV_LGBEG,NSV_LGEND +USE MODD_LES +USE MODD_BLOWSNOW +! +USE MODI_GRADIENT_M +USE MODI_GRADIENT_U +USE MODI_GRADIENT_V +USE MODI_GRADIENT_W +USE MODI_SHUMAN +USE MODI_LES_MEAN_SUBGRID +USE MODI_EMOIST +USE MODI_ETHETA +! +USE MODI_SECOND_MNH +! +IMPLICIT NONE +! +! +!* 0.1 declaration of arguments +! +! +! +INTEGER, INTENT(IN) :: KRR ! number of moist var. +INTEGER, INTENT(IN) :: KRRL ! number of liquid var. +INTEGER, INTENT(IN) :: KRRI ! number of ice var. +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX, PDYY, PDZZ, PDZX, PDZY + ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! mixing length +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! dissipative length +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! tke +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! reference Thv +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM ! potential temperature at t-Delta t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Mixing ratios at t-Delta t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exnref at time t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA ! coefficients between +REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! s and Thetal and Rnp +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM ! normalized + ! 2nd-order flux s'r'c/2Sigma_s2 at t-1 multiplied by Lambda_3 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PWM ! w at t-1 +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! scalar var. at t-1 +! +! +! +!* 0.2 declaration of local variables +! +REAL, DIMENSION(SIZE(PSVM,1),SIZE(PSVM,2),SIZE(PSVM,3)) & + :: ZFLX, ZA +! +INTEGER :: JSV ! loop counter +! +REAL :: ZTIME1, ZTIME2 +! +REAL :: ZCSVD = 1.2 ! constant for scalar variance dissipation +REAL :: ZCTSVD = 2.4 ! constant for temperature - scalar covariance dissipation +REAL :: ZCQSVD = 2.4 ! constant for humidity - scalar covariance dissipation +! +REAL :: ZCSV !constant for the scalar flux +! --------------------------------------------------------------------------- +! +CALL SECOND_MNH(ZTIME1) +! +IF(LBLOWSNOW) THEN +! See Vionnet (PhD, 2012) for a complete discussion around the value of the Schmidt number for blowing snow variables + ZCSV= XCHF/XRSNOW +ELSE + ZCSV= XCHF +ENDIF +! +DO JSV=1,NSV +! + IF (LNOMIXLG .AND. JSV >= NSV_LGBEG .AND. JSV<= NSV_LGEND) CYCLE + ! + ! variance Sv2 + ! + IF (LLES_CALL) THEN + IF (.NOT. L2D) THEN + ZFLX(:,:,:) = ZCSV / ZCSVD * PLM(:,:,:) * PLEPS(:,:,:) * & + ( GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX)**2 & + + GY_M_M(PSVM(:,:,:,JSV),PDYY,PDZZ,PDZY)**2 ) + ELSE + ZFLX(:,:,:) = ZCSV / ZCSVD * PLM(:,:,:) * PLEPS(:,:,:) * & + GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX)**2 + END IF + CALL LES_MEAN_SUBGRID( -2.*ZCSVD*SQRT(PTKEM)*ZFLX/PLEPS, & + X_LES_SUBGRID_DISS_Sv2(:,:,:,JSV), .TRUE. ) + CALL LES_MEAN_SUBGRID( MZF(PWM)*ZFLX, X_LES_RES_W_SBG_Sv2(:,:,:,JSV), .TRUE. ) + END IF + ! + ! covariance SvThv + ! + IF (LLES_CALL) THEN + ZA(:,:,:) = ETHETA(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PATHETA,PSRCM) + IF (.NOT. L2D) THEN + ZFLX(:,:,:)= PLM(:,:,:) * PLEPS(:,:,:) & + * ( GX_M_M(PTHLM,PDXX,PDZZ,PDZX) * GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX) & + + GY_M_M(PTHLM,PDYY,PDZZ,PDZY) * GY_M_M(PSVM(:,:,:,JSV),PDYY,PDZZ,PDZY) & + ) * (XCSHF+ZCSV) / (2.*ZCTSVD) + ELSE + ZFLX(:,:,:)= PLM(:,:,:) * PLEPS(:,:,:) & + * GX_M_M(PTHLM,PDXX,PDZZ,PDZX) * GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX) & + * (XCSHF+ZCSV) / (2.*ZCTSVD) + END IF + CALL LES_MEAN_SUBGRID( ZA*ZFLX, X_LES_SUBGRID_SvThv(:,:,:,JSV) , .TRUE.) + CALL LES_MEAN_SUBGRID( -XG/PTHVREF/3.*ZA*ZFLX, X_LES_SUBGRID_SvPz(:,:,:,JSV), .TRUE. ) + ! + IF (KRR>=1) THEN + ZA(:,:,:) = EMOIST(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PAMOIST,PSRCM) + IF (.NOT. L2D) THEN + ZFLX(:,:,:)= PLM(:,:,:) * PLEPS(:,:,:) & + * ( GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX) * GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX) & + + GY_M_M(PRM(:,:,:,1),PDYY,PDZZ,PDZY) * GY_M_M(PSVM(:,:,:,JSV),PDYY,PDZZ,PDZY) & + ) * (XCHF+ZCSV) / (2.*ZCQSVD) + ELSE + ZFLX(:,:,:)= PLM(:,:,:) * PLEPS(:,:,:) & + * GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX) * GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX) & + * (XCHF+ZCSV) / (2.*ZCQSVD) + END IF + CALL LES_MEAN_SUBGRID( ZA*ZFLX, X_LES_SUBGRID_SvThv(:,:,:,JSV) , .TRUE.) + CALL LES_MEAN_SUBGRID( -XG/PTHVREF/3.*ZA*ZFLX, X_LES_SUBGRID_SvPz(:,:,:,JSV), .TRUE. ) + END IF + END IF +! +END DO ! end loop JSV +! +CALL SECOND_MNH(ZTIME2) +XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 +! +END SUBROUTINE TURB_HOR_SV_CORR diff --git a/src/mesonh/turb/turb_hor_sv_flux.f90 b/src/mesonh/turb/turb_hor_sv_flux.f90 new file mode 100644 index 000000000..163ee3d02 --- /dev/null +++ b/src/mesonh/turb/turb_hor_sv_flux.f90 @@ -0,0 +1,364 @@ +!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ############################ + MODULE MODI_TURB_HOR_SV_FLUX +! ############################ +! +INTERFACE +! + SUBROUTINE TURB_HOR_SV_FLUX(KSPLT, & + OTURB_FLX, & + TPFILE, & + PK,PINV_PDXX,PINV_PDYY,PINV_PDZZ,PMZM_PRHODJ, & + PDXX,PDYY,PDZZ,PDZX,PDZY, & + PDIRCOSXW,PDIRCOSYW, & + PRHODJ,PWM, & + PSFSVM, & + PSVM, & + PRSVS ) +! +USE MODD_IO, ONLY: TFILEDATA +! +INTEGER, INTENT(IN) :: KSPLT ! split process index +LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the + ! turbulent fluxes in the syncronous FM-file +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PK ! Turbulent diffusion doef. + ! PK = PLM * SQRT(PTKEM) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDXX ! 1./PDXX +REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDYY ! 1./PDYY +REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDZZ ! 1./PDZZ +REAL, DIMENSION(:,:,:), INTENT(IN) :: PMZM_PRHODJ ! MZM(PRHODJ) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX, PDYY, PDZZ, PDZX, PDZY + ! Metric coefficients +REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSXW, PDIRCOSYW +! Director Cosinus along x and y directions at surface w-point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density * grid volume +REAL, DIMENSION(:,:,:), INTENT(IN) :: PWM ! vertical wind +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSFSVM ! surface fluxes +! +! +! Variables at t-1 +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! scalar var. at t-1 +! +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS ! var. at t+1 -split- +! +! +! +END SUBROUTINE TURB_HOR_SV_FLUX +! +END INTERFACE +! +END MODULE MODI_TURB_HOR_SV_FLUX +! ################################################################ + SUBROUTINE TURB_HOR_SV_FLUX(KSPLT, & + OTURB_FLX, & + TPFILE, & + PK,PINV_PDXX,PINV_PDYY,PINV_PDZZ,PMZM_PRHODJ, & + PDXX,PDYY,PDZZ,PDZX,PDZY, & + PDIRCOSXW,PDIRCOSYW, & + PRHODJ,PWM, & + PSFSVM, & + PSVM, & + PRSVS ) +! ################################################################ +! +! +!!**** *TURB_HOR* -routine to compute the source terms in the meso-NH +!! model equations due to the non-vertical turbulent fluxes. +!! +!! PURPOSE +!! ------- +!! +!! see TURB_HOR +!! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! +!! Joan Cuxart * INM and Meteo-France * +!! +!! MODIFICATIONS +!! ------------- +!! Aug , 1997 (V. Saravane) spliting of TURB_HOR +!! Nov 27, 1997 (V. Masson) clearing of the routine +!! Oct 18, 2000 (V. Masson) LES computations + LFLAT swith +!! + bug on Y scalar flux +!! Jun 20, 2001 (J Stein) case of lagragian variables +!! Nov 06, 2002 (V. Masson) LES budgets +!! October 2009 (G. Tanguy) add ILENCH=LEN(YCOMMENT) after +!! change of YCOMMENT +!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +!! -------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_CONF +USE MODD_CTURB +use modd_field, only: tfielddata, TYPEREAL +USE MODD_IO, ONLY: TFILEDATA +USE MODD_PARAMETERS +USE MODD_NSV, ONLY: NSV_LGBEG, NSV_LGEND +USE MODD_LES +USE MODD_BLOWSNOW +! +USE MODE_IO_FIELD_WRITE, only: IO_Field_write +! +USE MODI_GRADIENT_M +USE MODI_GRADIENT_U +USE MODI_GRADIENT_V +USE MODI_GRADIENT_W +USE MODI_SHUMAN +USE MODI_COEFJ +USE MODI_LES_MEAN_SUBGRID +! +USE MODI_SECOND_MNH +! +IMPLICIT NONE +! +! +!* 0.1 declaration of arguments +! +! +! +INTEGER, INTENT(IN) :: KSPLT ! split process index +LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the + ! turbulent fluxes in the syncronous FM-file +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PK ! Turbulent diffusion doef. + ! PK = PLM * SQRT(PTKEM) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDXX ! 1./PDXX +REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDYY ! 1./PDYY +REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDZZ ! 1./PDZZ +REAL, DIMENSION(:,:,:), INTENT(IN) :: PMZM_PRHODJ ! MZM(PRHODJ) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX, PDYY, PDZZ, PDZX, PDZY + ! Metric coefficients +REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSXW, PDIRCOSYW +! Director Cosinus along x and y directions at surface w-point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density * grid volume +REAL, DIMENSION(:,:,:), INTENT(IN) :: PWM ! vertical wind +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSFSVM ! surface fluxes +! +! +! Variables at t-1 +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! scalar var. at t-1 +! +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS ! var. at t+1 -split- +! +! +! +!* 0.2 declaration of local variables +! +REAL, DIMENSION(SIZE(PSVM,1),SIZE(PSVM,2),SIZE(PSVM,3)) & + :: ZFLXX,ZFLXY + ! work arrays +REAL, DIMENSION(SIZE(PSVM,1),SIZE(PSVM,2),1) :: ZWORK2D +! +REAL :: ZCSV !constant for the scalar flux + +INTEGER :: IKB,IKE + ! Index values for the Beginning and End + ! mass points of the domain +INTEGER :: JSV ! loop counter +INTEGER :: ISV ! number of scalar var. +REAL, DIMENSION(SIZE(PDZZ,1),SIZE(PDZZ,2),1+JPVEXT:3+JPVEXT) :: ZCOEFF + ! coefficients for the uncentred gradient + ! computation near the ground +! +INTEGER :: IKU +TYPE(TFIELDDATA) :: TZFIELD +REAL :: ZTIME1, ZTIME2 +! --------------------------------------------------------------------------- +! +!* 1. PRELIMINARY COMPUTATIONS +! ------------------------ +! +IKB = 1+JPVEXT +IKE = SIZE(PSVM,3)-JPVEXT +IKU = SIZE(PSVM,3) +! +ISV = SIZE(PSVM,4) +! +IF(LBLOWSNOW) THEN +! See Vionnet (PhD, 2012) for a complete discussion around the value of the Schmidt number for blowing snow variables + ZCSV= XCHF/XRSNOW +ELSE + ZCSV= XCHF +ENDIF +! +! compute the coefficients for the uncentred gradient computation near the +! ground +ZCOEFF(:,:,IKB+2)= - PDZZ(:,:,IKB+1) / & + ( (PDZZ(:,:,IKB+2)+PDZZ(:,:,IKB+1)) * PDZZ(:,:,IKB+2) ) +ZCOEFF(:,:,IKB+1)= (PDZZ(:,:,IKB+2)+PDZZ(:,:,IKB+1)) / & + ( PDZZ(:,:,IKB+1) * PDZZ(:,:,IKB+2) ) +ZCOEFF(:,:,IKB)= - (PDZZ(:,:,IKB+2)+2.*PDZZ(:,:,IKB+1)) / & + ( (PDZZ(:,:,IKB+2)+PDZZ(:,:,IKB+1)) * PDZZ(:,:,IKB+1) ) +! +! +!* 15. HORIZONTAL FLUXES OF PASSIVE SCALARS +! ------------------------------------ +! +! +DO JSV=1,ISV +! + IF (LNOMIXLG .AND. JSV >= NSV_LGBEG .AND. JSV<= NSV_LGEND) CYCLE +! +! 15.1 <U' SVth'> +! ---------- +! + ! Computes the flux in the X direction + ZFLXX(:,:,:) = -ZCSV * MXM(PK) * GX_M_U(1,IKU,1,PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX) + ZFLXX(:,:,IKE+1) = ZFLXX(:,:,IKE) +! +! Compute the flux at the first inner U-point with an uncentred vertical +! gradient + ZFLXX(:,:,IKB:IKB) = -ZCSV * MXM( PK(:,:,IKB:IKB) ) * & + ( DXM(PSVM(:,:,IKB:IKB,JSV)) * PINV_PDXX(:,:,IKB:IKB) & + -MXM ( ZCOEFF(:,:,IKB+2:IKB+2)*PSVM(:,:,IKB+2:IKB+2,JSV) & + +ZCOEFF(:,:,IKB+1:IKB+1)*PSVM(:,:,IKB+1:IKB+1,JSV) & + +ZCOEFF(:,:,IKB :IKB )*PSVM(:,:,IKB :IKB ,JSV) & + ) * 0.5 * ( PDZX(:,:,IKB+1:IKB+1)+PDZX(:,:,IKB:IKB) ) & + * PINV_PDXX(:,:,IKB:IKB) & + ) +! extrapolates the flux under the ground so that the vertical average with +! the IKB flux gives the ground value + ZWORK2D(:,:,1)=PSFSVM(:,:,JSV) * PDIRCOSXW(:,:) + ZFLXX(:,:,IKB-1:IKB-1) = 2. * MXM( ZWORK2D(:,:,1:1) ) - ZFLXX(:,:,IKB:IKB) + ! + ! stores <U SVth> + IF ( tpfile%lopened .AND. OTURB_FLX ) THEN + WRITE(TZFIELD%CMNHNAME,'("USV_FLX_",I3.3)') JSV + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CUNITS = 'SVUNIT m s-1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) + TZFIELD%NGRID = 2 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZFLXX) + END IF +! + IF (LLES_CALL .AND. KSPLT==1) THEN + CALL SECOND_MNH(ZTIME1) + CALL LES_MEAN_SUBGRID( MXF(ZFLXX), X_LES_SUBGRID_USv(:,:,:,JSV) ) + CALL LES_MEAN_SUBGRID( MZF(MXF(GX_W_UW(PWM,PDXX,PDZZ,PDZX)*MZM(ZFLXX))), & + X_LES_RES_ddxa_W_SBG_UaSv(:,:,:,JSV) , .TRUE. ) + CALL LES_MEAN_SUBGRID( GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX)*MXF(ZFLXX), & + X_LES_RES_ddxa_Sv_SBG_UaSv(:,:,:,JSV), .TRUE. ) + CALL SECOND_MNH(ZTIME2) + XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 + END IF +! +! 15.2 <V' SVth'> +! ---------- +! + IF (.NOT. L2D) THEN +! +! Computes the flux in the Y direction + ZFLXY(:,:,:)=-ZCSV * MYM(PK) * GY_M_V(1,IKU,1,PSVM(:,:,:,JSV),PDYY,PDZZ,PDZY) + ZFLXY(:,:,IKE+1) = ZFLXY(:,:,IKE) +! +! Compute the flux at the first inner V-point with an uncentred vertical +! gradient +! + ZFLXY(:,:,IKB:IKB) = -ZCSV * MYM( PK(:,:,IKB:IKB) ) * & + ( DYM(PSVM(:,:,IKB:IKB,JSV)) * PINV_PDYY(:,:,IKB:IKB) & + -MYM ( ZCOEFF(:,:,IKB+2:IKB+2)*PSVM(:,:,IKB+2:IKB+2,JSV) & + +ZCOEFF(:,:,IKB+1:IKB+1)*PSVM(:,:,IKB+1:IKB+1,JSV) & + +ZCOEFF(:,:,IKB :IKB )*PSVM(:,:,IKB :IKB ,JSV) & + ) * 0.5 * ( PDZY(:,:,IKB+1:IKB+1)+PDZY(:,:,IKB:IKB) ) & + * PINV_PDYY(:,:,IKB:IKB) & + ) +! extrapolates the flux under the ground so that the vertical average with +! the IKB flux gives the ground value + ZWORK2D(:,:,1)=PSFSVM(:,:,JSV) * PDIRCOSYW(:,:) + ZFLXY(:,:,IKB-1:IKB-1) = 2. * MYM( ZWORK2D(:,:,1:1) ) - ZFLXY(:,:,IKB:IKB) + ! + ! stores <V SVth> + IF ( tpfile%lopened .AND. OTURB_FLX ) THEN + WRITE(TZFIELD%CMNHNAME,'("VSV_FLX_",I3.3)') JSV + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CUNITS = 'SVUNIT m s-1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) + TZFIELD%NGRID = 3 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZFLXY) + END IF +! + ELSE + ZFLXY=0. + END IF +! + IF (LLES_CALL .AND. KSPLT==1) THEN + CALL SECOND_MNH(ZTIME1) + CALL LES_MEAN_SUBGRID( MYF(ZFLXY), X_LES_SUBGRID_VSv(:,:,:,JSV) ) + CALL LES_MEAN_SUBGRID( MZF(MYF(GY_W_VW(PWM,PDYY,PDZZ,PDZY)*MZM(ZFLXY))), & + X_LES_RES_ddxa_W_SBG_UaSv(:,:,:,JSV) , .TRUE. ) + CALL LES_MEAN_SUBGRID( GY_M_M(PSVM(:,:,:,JSV),PDYY,PDZZ,PDZY)*MYF(ZFLXY), & + X_LES_RES_ddxa_Sv_SBG_UaSv(:,:,:,JSV) , .TRUE. ) + CALL SECOND_MNH(ZTIME2) + XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 + END IF +! +! +! 15.3 Horizontal source terms +! ----------------------- +! + IF (.NOT. L2D) THEN + IF (.NOT. LFLAT) THEN + PRSVS(:,:,:,JSV)= PRSVS(:,:,:,JSV) & + -DXF( MXM(PRHODJ) * ZFLXX * PINV_PDXX ) & + -DYF( MYM(PRHODJ) * ZFLXY * PINV_PDYY ) & + +DZF( PMZM_PRHODJ * PINV_PDZZ * & + ( MXF( MZM(ZFLXX * PINV_PDXX) * PDZX ) + MYF( MZM(ZFLXY * PINV_PDYY) * PDZY ) ) & + ) + ELSE + PRSVS(:,:,:,JSV)= PRSVS(:,:,:,JSV) & + -DXF( MXM(PRHODJ) * ZFLXX * PINV_PDXX ) & + -DYF( MYM(PRHODJ) * ZFLXY * PINV_PDYY ) + END IF + ELSE + IF (.NOT. LFLAT) THEN + PRSVS(:,:,:,JSV)= PRSVS(:,:,:,JSV) & + -DXF( MXM(PRHODJ) * ZFLXX * PINV_PDXX ) & + +DZF( PMZM_PRHODJ * PINV_PDZZ * & + ( MXF( MZM(ZFLXX * PINV_PDXX) * PDZX ) ) & + ) + ELSE + PRSVS(:,:,:,JSV)= PRSVS(:,:,:,JSV) & + -DXF( MXM(PRHODJ) *ZFLXX * PINV_PDXX ) + END IF + END IF +! +! +END DO ! end loop JSV +! +! +END SUBROUTINE TURB_HOR_SV_FLUX diff --git a/src/mesonh/turb/turb_hor_thermo_corr.f90 b/src/mesonh/turb/turb_hor_thermo_corr.f90 new file mode 100644 index 000000000..b61948676 --- /dev/null +++ b/src/mesonh/turb/turb_hor_thermo_corr.f90 @@ -0,0 +1,468 @@ +!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ################################ + MODULE MODI_TURB_HOR_THERMO_CORR +! ################################ +! +INTERFACE +! + SUBROUTINE TURB_HOR_THERMO_CORR(KRR, KRRL, KRRI, & + OTURB_FLX,OSUBG_COND, & + TPFILE, & + PINV_PDXX,PINV_PDYY, & + PDXX,PDYY,PDZZ,PDZX,PDZY, & + PTHVREF, & + PWM,PTHLM,PRM, & + PTKEM,PLM,PLEPS, & + PLOCPEXNM,PATHETA,PAMOIST,PSRCM, & + PSIGS ) +! +USE MODD_IO, ONLY: TFILEDATA +! +INTEGER, INTENT(IN) :: KRR ! number of moist var. +INTEGER, INTENT(IN) :: KRRL ! number of liquid water var. +INTEGER, INTENT(IN) :: KRRI ! number of ice water var. +LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the + ! turbulent fluxes in the syncronous FM-file +LOGICAL, INTENT(IN) :: OSUBG_COND ! Switch for sub-grid +! condensation +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDXX ! 1./PDXX +REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDYY ! 1./PDYY +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX, PDYY, PDZZ, PDZX, PDZY + ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! ref. state Virtual + ! Potential Temperature +! +! Variables at t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PWM +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! mixing ratios at t-1, + ! where PRM(:,:,:,1) = conservative mixing ratio +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! Turb. Kin. Energy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! dissipative length +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exnref at time t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA ! coefficients between +REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! s and Thetal and Rnp +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM ! normalized + ! 2nd-order flux s'r'c/2Sigma_s2 at t-1 multiplied by Lambda_3 +! +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSIGS + ! IN: Vertical part of Sigma_s at t + ! OUT: Total Sigma_s at t +! +! +! +END SUBROUTINE TURB_HOR_THERMO_CORR +! +END INTERFACE +! +END MODULE MODI_TURB_HOR_THERMO_CORR +! ################################################################ + SUBROUTINE TURB_HOR_THERMO_CORR(KRR, KRRL, KRRI, & + OTURB_FLX,OSUBG_COND, & + TPFILE, & + PINV_PDXX,PINV_PDYY, & + PDXX,PDYY,PDZZ,PDZX,PDZY, & + PTHVREF, & + PWM,PTHLM,PRM, & + PTKEM,PLM,PLEPS, & + PLOCPEXNM,PATHETA,PAMOIST,PSRCM, & + PSIGS ) +! ################################################################ +! +! +!!**** *TURB_HOR* -routine to compute the source terms in the meso-NH +!! model equations due to the non-vertical turbulent fluxes. +!! +!! PURPOSE +!! ------- +!! +!! see TURB_HOR +!! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! +!! Joan Cuxart * INM and Meteo-France * +!! +!! MODIFICATIONS +!! ------------- +!! Aug , 1997 (V. Saravane) spliting of TURB_HOR +!! Nov 27, 1997 (V. Masson) clearing of the routine +!! Nov 06, 2002 (V. Masson) LES budgets +!! Feb 20, 2003 (JP Pinty) Add PFRAC_ICE +!! October 2009 (G. Tanguy) add ILENCH=LEN(YCOMMENT) after +!! change of YCOMMENT +!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +!! -------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_CONF +USE MODD_CTURB +use modd_field, only: tfielddata, TYPEREAL +USE MODD_IO, ONLY: TFILEDATA +USE MODD_PARAMETERS +USE MODD_LES +! +USE MODE_IO_FIELD_WRITE, only: IO_Field_write +! +USE MODI_GRADIENT_M +USE MODI_GRADIENT_U +USE MODI_GRADIENT_V +USE MODI_GRADIENT_W +USE MODI_SHUMAN +USE MODI_LES_MEAN_SUBGRID +! +USE MODI_EMOIST +USE MODI_ETHETA +! +USE MODI_SECOND_MNH +! +IMPLICIT NONE +! +! +!* 0.1 declaration of arguments +! +! +! +INTEGER, INTENT(IN) :: KRR ! number of moist var. +INTEGER, INTENT(IN) :: KRRL ! number of liquid water var. +INTEGER, INTENT(IN) :: KRRI ! number of ice water var. +LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the + ! turbulent fluxes in the syncronous FM-file +LOGICAL, INTENT(IN) :: OSUBG_COND ! Switch for sub-grid +! condensation +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDXX ! 1./PDXX +REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDYY ! 1./PDYY +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX, PDYY, PDZZ, PDZX, PDZY + ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! ref. state Virtual + ! Potential Temperature +! +! Variables at t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PWM +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! mixing ratios at t-1, + ! where PRM(:,:,:,1) = conservative mixing ratio +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! Turb. Kin. Energy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! dissipative length +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exnref at time t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA ! coefficients between +REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! s and Thetal and Rnp +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM ! normalized +! +! +! +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSIGS + ! IN: Vertical part of Sigma_s at t + ! OUT: Total Sigma_s at t +! +!* 0.2 declaration of local variables +! +REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) & + :: ZFLX,ZWORK,ZA + ! work arrays +! +INTEGER :: IKB,IKE + ! Index values for the Beginning and End + ! mass points of the domain +REAL, DIMENSION(SIZE(PDZZ,1),SIZE(PDZZ,2),1+JPVEXT:3+JPVEXT) :: ZCOEFF + ! coefficients for the uncentred gradient + ! computation near the ground +REAL :: ZTIME1, ZTIME2 +TYPE(TFIELDDATA) :: TZFIELD +! +! --------------------------------------------------------------------------- +! +!* 1. PRELIMINARY COMPUTATIONS +! ------------------------ +! +IKB = 1+JPVEXT +IKE = SIZE(PTHLM,3)-JPVEXT +! +! +! +! compute the coefficients for the uncentred gradient computation near the +! ground +ZCOEFF(:,:,IKB+2)= - PDZZ(:,:,IKB+1) / & + ( (PDZZ(:,:,IKB+2)+PDZZ(:,:,IKB+1)) * PDZZ(:,:,IKB+2) ) +ZCOEFF(:,:,IKB+1)= (PDZZ(:,:,IKB+2)+PDZZ(:,:,IKB+1)) / & + ( PDZZ(:,:,IKB+1) * PDZZ(:,:,IKB+2) ) +ZCOEFF(:,:,IKB)= - (PDZZ(:,:,IKB+2)+2.*PDZZ(:,:,IKB+1)) / & + ( (PDZZ(:,:,IKB+2)+PDZZ(:,:,IKB+1)) * PDZZ(:,:,IKB+1) ) +! +! +!* 8. TURBULENT CORRELATIONS : <THl THl>, <THl Rnp>, <Rnp Rnp>, Sigma_s +! ----------------------------------------------------------------- +! +! +! +IF ( ( KRRL > 0 .AND. OSUBG_COND) .OR. ( OTURB_FLX .AND. tpfile%lopened ) & + .OR. ( LLES_CALL ) ) THEN +! +!* 8.1 <THl THl> +! + ! Computes the horizontal variance <THl THl> + IF (.NOT. L2D) THEN + ZFLX(:,:,:) = XCTV * PLM(:,:,:) * PLEPS(:,:,:) * & + ( GX_M_M(PTHLM,PDXX,PDZZ,PDZX)**2 + GY_M_M(PTHLM,PDYY,PDZZ,PDZY)**2 ) + ELSE + ZFLX(:,:,:) = XCTV * PLM(:,:,:) * PLEPS(:,:,:) * & + GX_M_M(PTHLM,PDXX,PDZZ,PDZX)**2 + END IF +! +! Compute the flux at the first inner U-point with an uncentred vertical +! gradient +! + ZFLX(:,:,IKB:IKB) = XCTV * PLM(:,:,IKB:IKB) & + * PLEPS(:,:,IKB:IKB) * ( & + ( MXF(DXM(PTHLM(:,:,IKB:IKB)) * PINV_PDXX(:,:,IKB:IKB)) & + - ( ZCOEFF(:,:,IKB+2:IKB+2)*PTHLM(:,:,IKB+2:IKB+2) & + +ZCOEFF(:,:,IKB+1:IKB+1)*PTHLM(:,:,IKB+1:IKB+1) & + +ZCOEFF(:,:,IKB :IKB )*PTHLM(:,:,IKB :IKB ) & + ) * 0.5 * ( PDZX(:,:,IKB+1:IKB+1)+PDZX(:,:,IKB:IKB) ) & + / MXF(PDXX(:,:,IKB:IKB)) & + ) ** 2 + & + ( MYF(DYM(PTHLM(:,:,IKB:IKB)) * PINV_PDYY(:,:,IKB:IKB)) & + - ( ZCOEFF(:,:,IKB+2:IKB+2)*PTHLM(:,:,IKB+2:IKB+2) & + +ZCOEFF(:,:,IKB+1:IKB+1)*PTHLM(:,:,IKB+1:IKB+1) & + +ZCOEFF(:,:,IKB :IKB )*PTHLM(:,:,IKB :IKB ) & + ) * 0.5 * ( PDZY(:,:,IKB+1:IKB+1)+PDZY(:,:,IKB:IKB) ) & + / MYF(PDYY(:,:,IKB:IKB)) & + ) ** 2 ) + ! + ZFLX(:,:,IKB-1) = ZFLX(:,:,IKB) + ! + IF ( KRRL > 0 ) THEN + ZWORK(:,:,:) = ZFLX(:,:,:) * PATHETA(:,:,:) * PATHETA(:,:,:) + END IF + ! + ! stores <THl THl> + IF ( OTURB_FLX .AND. tpfile%lopened ) THEN + TZFIELD%CMNHNAME = 'THL_HVAR' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'THL_HVAR' + TZFIELD%CUNITS = 'K2' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_THL_HVAR' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZFLX) + END IF +! +! Storage in the LES configuration (addition to TURB_VER computation) +! + IF (LLES_CALL) THEN + CALL SECOND_MNH(ZTIME1) + CALL LES_MEAN_SUBGRID( ZFLX, X_LES_SUBGRID_Thl2, .TRUE. ) + CALL LES_MEAN_SUBGRID( MZF(PWM)*ZFLX, X_LES_RES_W_SBG_Thl2, .TRUE. ) + CALL LES_MEAN_SUBGRID( -2.*XCTD*SQRT(PTKEM)*ZFLX/PLEPS ,X_LES_SUBGRID_DISS_Thl2, .TRUE. ) + ZA(:,:,:) = ETHETA(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PATHETA,PSRCM) + CALL LES_MEAN_SUBGRID( ZA*ZFLX, X_LES_SUBGRID_ThlThv, .TRUE. ) + CALL LES_MEAN_SUBGRID( -XG/PTHVREF/3.*ZA*ZFLX, X_LES_SUBGRID_ThlPz, .TRUE. ) + CALL SECOND_MNH(ZTIME2) + XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 + END IF +! + IF ( KRR /= 0 ) THEN +! +!* 8.3 <THl Rnp> +! + ! Computes the horizontal correlation <THl Rnp> + IF (.NOT. L2D) THEN + ZFLX(:,:,:)= & + PLM(:,:,:) * PLEPS(:,:,:) * & + (GX_M_M(PTHLM,PDXX,PDZZ,PDZX) * GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX) & + + GY_M_M(PTHLM,PDYY,PDZZ,PDZY) * GY_M_M(PRM(:,:,:,1),PDYY,PDZZ,PDZY) & + ) * (XCHT1+XCHT2) + ELSE + ZFLX(:,:,:)= & + PLM(:,:,:) * PLEPS(:,:,:) * & + (GX_M_M(PTHLM,PDXX,PDZZ,PDZX) * GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX) & + ) * (XCHT1+XCHT2) + + END IF +! +! Compute the flux at the first inner U-point with an uncentred vertical +! gradient + ZFLX(:,:,IKB:IKB) = (XCHT1+XCHT2) * PLM(:,:,IKB:IKB) & + * PLEPS(:,:,IKB:IKB) * ( & + ( MXF(DXM(PTHLM(:,:,IKB:IKB)) * PINV_PDXX(:,:,IKB:IKB)) & + - ( ZCOEFF(:,:,IKB+2:IKB+2)*PTHLM(:,:,IKB+2:IKB+2) & + +ZCOEFF(:,:,IKB+1:IKB+1)*PTHLM(:,:,IKB+1:IKB+1) & + +ZCOEFF(:,:,IKB :IKB )*PTHLM(:,:,IKB :IKB ) & + ) * 0.5 * ( PDZX(:,:,IKB+1:IKB+1)+PDZX(:,:,IKB:IKB) ) & + / MXF(PDXX(:,:,IKB:IKB)) & + ) * & + ( MXF(DXM(PRM(:,:,IKB:IKB,1)) * PINV_PDXX(:,:,IKB:IKB)) & + - ( ZCOEFF(:,:,IKB+2:IKB+2)*PRM(:,:,IKB+2:IKB+2,1) & + +ZCOEFF(:,:,IKB+1:IKB+1)*PRM(:,:,IKB+1:IKB+1,1) & + +ZCOEFF(:,:,IKB :IKB )*PRM(:,:,IKB :IKB ,1) & + ) * 0.5 * ( PDZX(:,:,IKB+1:IKB+1)+PDZX(:,:,IKB:IKB) ) & + / MXF(PDXX(:,:,IKB:IKB)) & + ) + & + ( MYF(DYM(PTHLM(:,:,IKB:IKB)) * PINV_PDYY(:,:,IKB:IKB)) & + - ( ZCOEFF(:,:,IKB+2:IKB+2)*PTHLM(:,:,IKB+2:IKB+2) & + +ZCOEFF(:,:,IKB+1:IKB+1)*PTHLM(:,:,IKB+1:IKB+1) & + +ZCOEFF(:,:,IKB :IKB )*PTHLM(:,:,IKB :IKB ) & + ) * 0.5 * ( PDZY(:,:,IKB+1:IKB+1)+PDZY(:,:,IKB:IKB) ) & + / MYF(PDYY(:,:,IKB:IKB)) & + ) * & + ( MYF(DYM(PRM(:,:,IKB:IKB,1)) * PINV_PDYY(:,:,IKB:IKB)) & + - ( ZCOEFF(:,:,IKB+2:IKB+2)*PRM(:,:,IKB+2:IKB+2,1) & + +ZCOEFF(:,:,IKB+1:IKB+1)*PRM(:,:,IKB+1:IKB+1,1) & + +ZCOEFF(:,:,IKB :IKB )*PRM(:,:,IKB :IKB ,1) & + ) * 0.5 * ( PDZY(:,:,IKB+1:IKB+1)+PDZY(:,:,IKB:IKB) ) & + / MYF(PDYY(:,:,IKB:IKB)) & + ) ) + ! + ZFLX(:,:,IKB-1) = ZFLX(:,:,IKB) + ! + IF ( KRRL > 0 ) THEN + ZWORK(:,:,:) = ZWORK(:,:,:) + & + 2. * PATHETA(:,:,:) * PAMOIST(:,:,:) * ZFLX(:,:,:) + END IF + ! + ! stores <THl Rnp> + IF ( OTURB_FLX .AND. tpfile%lopened ) THEN + TZFIELD%CMNHNAME = 'THLR_HCOR' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'THLR_HCOR' + TZFIELD%CUNITS = 'K kg kg-1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_THLR_HCOR' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZFLX) + END IF +! +! Storage in the LES configuration (addition to TURB_VER computation) +! + IF (LLES_CALL) THEN + CALL SECOND_MNH(ZTIME1) + CALL LES_MEAN_SUBGRID( ZFLX, X_LES_SUBGRID_ThlRt, .TRUE. ) + CALL LES_MEAN_SUBGRID( MZF(PWM)*ZFLX, X_LES_RES_W_SBG_ThlRt, .TRUE. ) + CALL LES_MEAN_SUBGRID( -XCTD*SQRT(PTKEM)*ZFLX/PLEPS ,X_LES_SUBGRID_DISS_ThlRt, .TRUE. ) + CALL LES_MEAN_SUBGRID( ZA*ZFLX, X_LES_SUBGRID_RtThv, .TRUE. ) + CALL LES_MEAN_SUBGRID( -XG/PTHVREF/3.*ZA*ZFLX, X_LES_SUBGRID_RtPz,.TRUE.) + ZA(:,:,:) = EMOIST(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PAMOIST,PSRCM) + CALL LES_MEAN_SUBGRID( ZA*ZFLX, X_LES_SUBGRID_ThlThv, .TRUE. ) + CALL LES_MEAN_SUBGRID( -XG/PTHVREF/3.*ZA*ZFLX, X_LES_SUBGRID_ThlPz,.TRUE.) + CALL SECOND_MNH(ZTIME2) + XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 + END IF +! +!* 8.4 <Rnp Rnp> +! + ! Computes the horizontal variance <Rnp Rnp> + IF (.NOT. L2D) THEN + ZFLX(:,:,:) = XCHV * PLM(:,:,:) * PLEPS(:,:,:) * & + ( GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX)**2 + & + GY_M_M(PRM(:,:,:,1),PDYY,PDZZ,PDZY)**2 ) + ELSE + ZFLX(:,:,:) = XCHV * PLM(:,:,:) * PLEPS(:,:,:) * & + ( GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX)**2 ) + END IF +! +! Compute the flux at the first inner U-point with an uncentred vertical +! gradient + ZFLX(:,:,IKB:IKB) = XCHV * PLM(:,:,IKB:IKB) & + * PLEPS(:,:,IKB:IKB) * ( & + ( MXF(DXM(PRM(:,:,IKB:IKB,1)) * PINV_PDXX(:,:,IKB:IKB)) & + - ( ZCOEFF(:,:,IKB+2:IKB+2)*PRM(:,:,IKB+2:IKB+2,1) & + +ZCOEFF(:,:,IKB+1:IKB+1)*PRM(:,:,IKB+1:IKB+1,1) & + +ZCOEFF(:,:,IKB :IKB )*PRM(:,:,IKB :IKB ,1) & + ) * 0.5 * ( PDZX(:,:,IKB+1:IKB+1)+PDZX(:,:,IKB:IKB) ) & + / MXF(PDXX(:,:,IKB:IKB)) & + ) ** 2 + & + ( MYF(DYM(PRM(:,:,IKB:IKB,1)) * PINV_PDYY(:,:,IKB:IKB)) & + - ( ZCOEFF(:,:,IKB+2:IKB+2)*PRM(:,:,IKB+2:IKB+2,1) & + +ZCOEFF(:,:,IKB+1:IKB+1)*PRM(:,:,IKB+1:IKB+1,1) & + +ZCOEFF(:,:,IKB :IKB )*PRM(:,:,IKB :IKB ,1) & + ) * 0.5 * ( PDZY(:,:,IKB+1:IKB+1)+PDZY(:,:,IKB:IKB) ) & + / MYF(PDYY(:,:,IKB:IKB)) & + ) ** 2 ) +! + ZFLX(:,:,IKB-1) = ZFLX(:,:,IKB) + ! + IF ( KRRL > 0 ) THEN + ZWORK(:,:,:) = ZWORK(:,:,:)+ PAMOIST(:,:,:) * PAMOIST(:,:,:) * ZFLX(:,:,:) + END IF + ! + ! stores <Rnp Rnp> + IF ( OTURB_FLX .AND. tpfile%lopened ) THEN + TZFIELD%CMNHNAME = 'R_HVAR' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'R_HVAR' + TZFIELD%CUNITS = 'kg2 kg-2' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_R_HVAR' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZFLX) + END IF + ! + ! Storage in the LES configuration (addition to TURB_VER computation) + ! + IF (LLES_CALL) THEN + CALL SECOND_MNH(ZTIME1) + CALL LES_MEAN_SUBGRID( ZFLX, X_LES_SUBGRID_Rt2, .TRUE. ) + CALL LES_MEAN_SUBGRID( MZF(PWM)*ZFLX, X_LES_RES_W_SBG_Rt2, .TRUE. ) + CALL LES_MEAN_SUBGRID( ZA*ZFLX, X_LES_SUBGRID_RtThv, .TRUE. ) + CALL LES_MEAN_SUBGRID( -XG/PTHVREF/3.*ZA*ZFLX, X_LES_SUBGRID_RtPz,.TRUE.) + CALL LES_MEAN_SUBGRID( -2.*XCTD*SQRT(PTKEM)*ZFLX/PLEPS, X_LES_SUBGRID_DISS_Rt2, .TRUE. ) + CALL SECOND_MNH(ZTIME2) + XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 + END IF + ! + END IF +! +! 8.5 Complete the Sigma_s computation: +! + IF ( KRRL > 0 ) THEN + ! + PSIGS(:,:,:)=PSIGS(:,:,:)*PSIGS(:,:,:) + ZWORK(:,:,:) + ! Extrapolate PSIGS at the ground and at the top + PSIGS(:,:,IKB-1) = PSIGS(:,:,IKB) + PSIGS(:,:,IKE+1) = PSIGS(:,:,IKE) + PSIGS(:,:,:) = SQRT(MAX ( PSIGS(:,:,:),1.E-12) ) + END IF +! +END IF +! +! +! +END SUBROUTINE TURB_HOR_THERMO_CORR diff --git a/src/mesonh/turb/turb_hor_thermo_flux.f90 b/src/mesonh/turb/turb_hor_thermo_flux.f90 new file mode 100644 index 000000000..90d189a2b --- /dev/null +++ b/src/mesonh/turb/turb_hor_thermo_flux.f90 @@ -0,0 +1,752 @@ +!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ################################ + MODULE MODI_TURB_HOR_THERMO_FLUX +! ################################ +! +INTERFACE +! + SUBROUTINE TURB_HOR_THERMO_FLUX(KSPLT, KRR, KRRL, KRRI, & + OTURB_FLX,OSUBG_COND, & + TPFILE, & + PK,PINV_PDXX,PINV_PDYY,PINV_PDZZ,PMZM_PRHODJ, & + PDXX,PDYY,PDZZ,PDZX,PDZY, & + PDIRCOSXW,PDIRCOSYW, & + PRHODJ, & + PSFTHM,PSFRM, & + PWM,PTHLM,PRM, & + PATHETA,PAMOIST,PSRCM,PFRAC_ICE, & + PRTHLS,PRRS ) +! +USE MODD_IO, ONLY: TFILEDATA +! +INTEGER, INTENT(IN) :: KSPLT ! split process index +INTEGER, INTENT(IN) :: KRR ! number of moist var. +INTEGER, INTENT(IN) :: KRRL ! number of liquid water var. +INTEGER, INTENT(IN) :: KRRI ! number of ice water var. +LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the + ! turbulent fluxes in the syncronous FM-file +LOGICAL, INTENT(IN) :: OSUBG_COND ! Switch for sub-grid +! condensation +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PK ! Turbulent diffusion doef. + ! PK = PLM * SQRT(PTKEM) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDXX ! 1./PDXX +REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDYY ! 1./PDYY +REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDZZ ! 1./PDZZ +REAL, DIMENSION(:,:,:), INTENT(IN) :: PMZM_PRHODJ ! MZM(PRHODJ) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX, PDYY, PDZZ, PDZX, PDZY + ! Metric coefficients +REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSXW, PDIRCOSYW +! Director Cosinus along x, y and z directions at surface w-point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density * grid volume +! +REAL, DIMENSION(:,:), INTENT(IN) :: PSFTHM,PSFRM +! +! Variables at t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PWM +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! mixing ratios at t-1, + ! where PRM(:,:,:,1) = conservative mixing ratio +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA ! coefficients between +REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! s and Thetal and Rnp + +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM + ! normalized 2nd-order flux + ! s'r'c/2Sigma_s2 at t-1 multiplied by Lambda_3 +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFRAC_ICE ! ri fraction of rc+ri +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRTHLS +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS ! var. at t+1 -split- +! +! +END SUBROUTINE TURB_HOR_THERMO_FLUX +! +END INTERFACE +! +END MODULE MODI_TURB_HOR_THERMO_FLUX +! ################################################################ + SUBROUTINE TURB_HOR_THERMO_FLUX(KSPLT, KRR, KRRL, KRRI, & + OTURB_FLX,OSUBG_COND, & + TPFILE, & + PK,PINV_PDXX,PINV_PDYY,PINV_PDZZ,PMZM_PRHODJ, & + PDXX,PDYY,PDZZ,PDZX,PDZY, & + PDIRCOSXW,PDIRCOSYW, & + PRHODJ, & + PSFTHM,PSFRM, & + PWM,PTHLM,PRM, & + PATHETA,PAMOIST,PSRCM,PFRAC_ICE, & + PRTHLS,PRRS ) +! ################################################################ +! +! +!!**** *TURB_HOR* -routine to compute the source terms in the meso-NH +!! model equations due to the non-vertical turbulent fluxes. +!! +!! PURPOSE +!! ------- +!! +!! see TURB_HOR +!! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! +!! Joan Cuxart * INM and Meteo-France * +!! +!! MODIFICATIONS +!! ------------- +!! Aug , 1997 (V. Saravane) spliting of TURB_HOR +!! Nov 27, 1997 (V. Masson) clearing of the routine +!! Feb. 18, 1998 (J. Stein) bug for v'RC' +!! Oct 18, 2000 (V. Masson) LES computations + LFLAT switch +!! Nov 06, 2002 (V. Masson) LES budgets +!! Feb 20, 2003 (JP Pinty) Add PFRAC_ICE +!! October 2009 (G. Tanguy) add ILENCH=LEN(YCOMMENT) after +!! change of YCOMMENT +!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +!! -------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_CONF +USE MODD_CTURB +use modd_field, only: tfielddata, TYPEREAL +USE MODD_IO, ONLY: TFILEDATA +USE MODD_PARAMETERS +USE MODD_LES +! +USE MODE_IO_FIELD_WRITE, only: IO_Field_write +! +USE MODI_GRADIENT_M +USE MODI_GRADIENT_U +USE MODI_GRADIENT_V +USE MODI_GRADIENT_W +USE MODI_SHUMAN +USE MODI_LES_MEAN_SUBGRID +!!USE MODI_EMOIST +!!USE MODI_ETHETA +! +USE MODI_SECOND_MNH +! +IMPLICIT NONE +! +! +!* 0.1 declaration of arguments +! +! +! +INTEGER, INTENT(IN) :: KSPLT ! split process index +INTEGER, INTENT(IN) :: KRR ! number of moist var. +INTEGER, INTENT(IN) :: KRRL ! number of liquid water var. +INTEGER, INTENT(IN) :: KRRI ! number of ice water var. +LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the + ! turbulent fluxes in the syncronous FM-file +LOGICAL, INTENT(IN) :: OSUBG_COND ! Switch for sub-grid +! condensation +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PK ! Turbulent diffusion doef. + ! PK = PLM * SQRT(PTKEM) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDXX ! 1./PDXX +REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDYY ! 1./PDYY +REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDZZ ! 1./PDZZ +REAL, DIMENSION(:,:,:), INTENT(IN) :: PMZM_PRHODJ ! MZM(PRHODJ) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX, PDYY, PDZZ, PDZX, PDZY + ! Metric coefficients +REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSXW, PDIRCOSYW +! Director Cosinus along x, y and z directions at surface w-point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density * grid volume +! +REAL, DIMENSION(:,:), INTENT(IN) :: PSFTHM,PSFRM +! +! Variables at t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PWM +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! mixing ratios at t-1, + ! where PRM(:,:,:,1) = conservative mixing ratio +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA ! coefficients between +REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! s and Thetal and Rnp + +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM + ! normalized 2nd-order flux + ! s'r'c/2Sigma_s2 at t-1 multiplied by Lambda_3 +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFRAC_ICE ! ri fraction of rc+ri +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRTHLS +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS ! var. at t+1 -split- +! +! +! +!* 0.2 declaration of local variables +! +REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) & + :: ZFLX,ZFLXC + ! work arrays +! +!! REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: ZVPTV +INTEGER :: IKB,IKE,IKU + ! Index values for the Beginning and End + ! mass points of the domain +REAL, DIMENSION(SIZE(PDZZ,1),SIZE(PDZZ,2),1+JPVEXT:3+JPVEXT) :: ZCOEFF + ! coefficients for the uncentred gradient + ! computation near the ground +! +REAL :: ZTIME1, ZTIME2 +TYPE(TFIELDDATA) :: TZFIELD +! --------------------------------------------------------------------------- +! +!* 1. PRELIMINARY COMPUTATIONS +! ------------------------ +! +IKB = 1+JPVEXT +IKE = SIZE(PTHLM,3)-JPVEXT +IKU = SIZE(PTHLM,3) +! +! +! compute the coefficients for the uncentred gradient computation near the +! ground +ZCOEFF(:,:,IKB+2)= - PDZZ(:,:,IKB+1) / & + ( (PDZZ(:,:,IKB+2)+PDZZ(:,:,IKB+1)) * PDZZ(:,:,IKB+2) ) +ZCOEFF(:,:,IKB+1)= (PDZZ(:,:,IKB+2)+PDZZ(:,:,IKB+1)) / & + ( PDZZ(:,:,IKB+1) * PDZZ(:,:,IKB+2) ) +ZCOEFF(:,:,IKB)= - (PDZZ(:,:,IKB+2)+2.*PDZZ(:,:,IKB+1)) / & + ( (PDZZ(:,:,IKB+2)+PDZZ(:,:,IKB+1)) * PDZZ(:,:,IKB+1) ) +! +!* 2. < U' THETA'l > +! -------------- +! +! +ZFLX(:,:,:) = -XCSHF * MXM( PK ) * GX_M_U(1,IKU,1,PTHLM,PDXX,PDZZ,PDZX) +ZFLX(:,:,IKE+1) = ZFLX(:,:,IKE) +! +! Compute the flux at the first inner U-point with an uncentred vertical +! gradient +ZFLX(:,:,IKB:IKB) = -XCSHF * MXM( PK(:,:,IKB:IKB) ) * & + ( DXM(PTHLM(:,:,IKB:IKB)) * PINV_PDXX(:,:,IKB:IKB) & + -MXM( ZCOEFF(:,:,IKB+2:IKB+2)*PTHLM(:,:,IKB+2:IKB+2) & + +ZCOEFF(:,:,IKB+1:IKB+1)*PTHLM(:,:,IKB+1:IKB+1) & + +ZCOEFF(:,:,IKB :IKB )*PTHLM(:,:,IKB :IKB )) & + *0.5* ( PDZX(:,:,IKB+1:IKB+1)+PDZX(:,:,IKB:IKB)) & + * PINV_PDXX(:,:,IKB:IKB) ) +! extrapolates the flux under the ground so that the vertical average with +! the IKB flux gives the ground value ( warning the tangential surface +! flux has been set to 0 for the moment !! to be improved ) +ZFLX(:,:,IKB-1:IKB-1) = 2. * MXM( SPREAD( PSFTHM(:,:)* PDIRCOSXW(:,:), 3,1) ) & + - ZFLX(:,:,IKB:IKB) +! +! Add this source to the Theta_l sources +! +IF (.NOT. LFLAT) THEN + PRTHLS(:,:,:) = PRTHLS & + - DXF( MXM(PRHODJ) * ZFLX * PINV_PDXX ) & + + DZF( PMZM_PRHODJ *MXF(PDZX*(MZM(ZFLX * PINV_PDXX))) * PINV_PDZZ ) +ELSE + PRTHLS(:,:,:) = PRTHLS - DXF( MXM(PRHODJ) * ZFLX * PINV_PDXX ) +END IF +! +! Compute the equivalent tendancy for Rc and Ri +! +IF ( KRRL >= 1 ) THEN + IF (.NOT. LFLAT) THEN + ZFLXC = 2.*( MXF( MXM( PRHODJ*PATHETA*PSRCM )*ZFLX ) & + +MZF( MZM( PRHODJ*PATHETA*PSRCM )*MXF( & + PDZX*(MZM( ZFLX*PINV_PDXX )) ) )& + ) + IF ( KRRI >= 1 ) THEN + PRRS(:,:,:,2) = PRRS(:,:,:,2) + 2. * & + (- DXF( MXM( PRHODJ*PATHETA*PSRCM )*ZFLX*PINV_PDXX ) & + + DZF( MZM( PRHODJ*PATHETA*PSRCM )*MXF( PDZX*(MZM( ZFLX*PINV_PDXX )) )& + *PINV_PDZZ ) & + )*(1.0-PFRAC_ICE(:,:,:)) + PRRS(:,:,:,4) = PRRS(:,:,:,4) + 2. * & + (- DXF( MXM( PRHODJ*PATHETA*PSRCM )*ZFLX*PINV_PDXX ) & + + DZF( MZM( PRHODJ*PATHETA*PSRCM )*MXF( PDZX*(MZM( ZFLX*PINV_PDXX )) )& + *PINV_PDZZ ) & + )*PFRAC_ICE(:,:,:) + ELSE + PRRS(:,:,:,2) = PRRS(:,:,:,2) + 2. * & + (- DXF( MXM( PRHODJ*PATHETA*PSRCM )*ZFLX*PINV_PDXX ) & + + DZF( MZM( PRHODJ*PATHETA*PSRCM )*MXF( PDZX*(MZM( ZFLX*PINV_PDXX )) )& + *PINV_PDZZ ) & + ) + END IF + ELSE + ZFLXC = 2.*MXF( MXM( PRHODJ*PATHETA*PSRCM )*ZFLX ) + IF ( KRRI >= 1 ) THEN + PRRS(:,:,:,2) = PRRS(:,:,:,2) - 2. * & + DXF( MXM( PRHODJ*PATHETA*PSRCM )*ZFLX*PINV_PDXX )*(1.0-PFRAC_ICE(:,:,:)) + PRRS(:,:,:,4) = PRRS(:,:,:,4) - 2. * & + DXF( MXM( PRHODJ*PATHETA*PSRCM )*ZFLX*PINV_PDXX )*PFRAC_ICE(:,:,:) + ELSE + PRRS(:,:,:,2) = PRRS(:,:,:,2) - 2. * & + DXF( MXM( PRHODJ*PATHETA*PSRCM )*ZFLX*PINV_PDXX ) + END IF + END IF +END IF +! +!! stores this flux in ZWORK to compute later <U' VPT'> +!!ZWORK(:,:,:) = ZFLX(:,:,:) +! +! stores the horizontal <U THl> +IF ( tpfile%lopened .AND. OTURB_FLX ) THEN + TZFIELD%CMNHNAME = 'UTHL_FLX' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'UTHL_FLX' + TZFIELD%CUNITS = 'K m s-1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_UTHL_FLX' + TZFIELD%NGRID = 2 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZFLX) +END IF +! +IF (KSPLT==1 .AND. LLES_CALL) THEN + CALL SECOND_MNH(ZTIME1) + CALL LES_MEAN_SUBGRID( MXF(ZFLX), X_LES_SUBGRID_UThl ) + CALL LES_MEAN_SUBGRID( MZF(MXF(GX_W_UW(PWM,PDXX,PDZZ,PDZX)*MZM(ZFLX))),& + X_LES_RES_ddxa_W_SBG_UaThl , .TRUE. ) + CALL LES_MEAN_SUBGRID( GX_M_M(PTHLM,PDXX,PDZZ,PDZX)*MXF(ZFLX),& + X_LES_RES_ddxa_Thl_SBG_UaThl , .TRUE. ) + IF (KRR>=1) THEN + CALL LES_MEAN_SUBGRID( GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX)*MXF(ZFLX), & + X_LES_RES_ddxa_Rt_SBG_UaThl , .TRUE. ) + END IF + CALL SECOND_MNH(ZTIME2) + XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 +END IF +! +!* 3. < U' R'np > +! ----------- +IF (KRR/=0) THEN + ! + ZFLX(:,:,:) = -XCHF * MXM( PK ) * GX_M_U(1,IKU,1,PRM(:,:,:,1),PDXX,PDZZ,PDZX) + ZFLX(:,:,IKE+1) = ZFLX(:,:,IKE) +! +! Compute the flux at the first inner U-point with an uncentred vertical +! gradient + ZFLX(:,:,IKB:IKB) = -XCHF * MXM( PK(:,:,IKB:IKB) ) * & + ( DXM(PRM(:,:,IKB:IKB,1)) * PINV_PDXX(:,:,IKB:IKB) & + -MXM( ZCOEFF(:,:,IKB+2:IKB+2)*PRM(:,:,IKB+2:IKB+2,1) & + +ZCOEFF(:,:,IKB+1:IKB+1)*PRM(:,:,IKB+1:IKB+1,1) & + +ZCOEFF(:,:,IKB :IKB )*PRM(:,:,IKB :IKB ,1)) & + *0.5* ( PDZX(:,:,IKB+1:IKB+1)+PDZX(:,:,IKB:IKB)) & + * PINV_PDXX(:,:,IKB:IKB) ) +! extrapolates the flux under the ground so that the vertical average with +! the IKB flux gives the ground value ( warning the tangential surface +! flux has been set to 0 for the moment !! to be improved ) + ZFLX(:,:,IKB-1:IKB-1) = 2. * MXM( SPREAD( PSFRM(:,:)* PDIRCOSXW(:,:), 3,1) ) & + - ZFLX(:,:,IKB:IKB) + ! + ! Add this source to the conservative mixing ratio sources + ! + IF (.NOT. LFLAT) THEN + PRRS(:,:,:,1) = PRRS(:,:,:,1) & + - DXF( MXM(PRHODJ) * ZFLX * PINV_PDXX ) & + + DZF( PMZM_PRHODJ *MXF(PDZX*(MZM(ZFLX * PINV_PDXX))) * PINV_PDZZ ) + ELSE + PRRS(:,:,:,1) = PRRS(:,:,:,1) - DXF( MXM(PRHODJ) * ZFLX * PINV_PDXX ) + END IF + ! + ! Compute the equivalent tendancy for Rc and Ri + ! + IF ( KRRL >= 1 ) THEN + IF (.NOT. LFLAT) THEN + ZFLXC = ZFLXC & + + 2.*( MXF( MXM( PRHODJ*PAMOIST*PSRCM )*ZFLX ) & + +MZF( MZM( PRHODJ*PAMOIST*PSRCM )*MXF( & + PDZX*(MZM( ZFLX*PINV_PDXX )) ) )& + ) + IF ( KRRI >= 1 ) THEN + PRRS(:,:,:,2) = PRRS(:,:,:,2) + 2. * & + (- DXF( MXM( PRHODJ*PAMOIST*PSRCM )*ZFLX*PINV_PDXX ) & + + DZF( MZM( PRHODJ*PAMOIST*PSRCM )*MXF( PDZX*(MZM( ZFLX*PINV_PDXX )) )& + *PINV_PDZZ ) & + )*(1.0-PFRAC_ICE(:,:,:)) + PRRS(:,:,:,2) = PRRS(:,:,:,2) + 2. * & + (- DXF( MXM( PRHODJ*PAMOIST*PSRCM )*ZFLX*PINV_PDXX ) & + + DZF( MZM( PRHODJ*PAMOIST*PSRCM )*MXF( PDZX*(MZM( ZFLX*PINV_PDXX )) )& + *PINV_PDZZ ) & + )*PFRAC_ICE(:,:,:) + ELSE + PRRS(:,:,:,2) = PRRS(:,:,:,2) + 2. * & + (- DXF( MXM( PRHODJ*PAMOIST*PSRCM )*ZFLX*PINV_PDXX ) & + + DZF( MZM( PRHODJ*PAMOIST*PSRCM )*MXF( PDZX*(MZM( ZFLX*PINV_PDXX )) )& + *PINV_PDZZ ) & + ) + END IF + ELSE + ZFLXC = ZFLXC + 2.*MXF( MXM( PRHODJ*PAMOIST*PSRCM )*ZFLX ) + IF ( KRRI >= 1 ) THEN + PRRS(:,:,:,2) = PRRS(:,:,:,2) - 2. * & + DXF( MXM( PRHODJ*PAMOIST*PSRCM )*ZFLX*PINV_PDXX )*(1.0-PFRAC_ICE(:,:,:)) + PRRS(:,:,:,4) = PRRS(:,:,:,4) - 2. * & + DXF( MXM( PRHODJ*PAMOIST*PSRCM )*ZFLX*PINV_PDXX )*PFRAC_ICE(:,:,:) + ELSE + PRRS(:,:,:,2) = PRRS(:,:,:,2) - 2. * & + DXF( MXM( PRHODJ*PAMOIST*PSRCM )*ZFLX*PINV_PDXX ) + END IF + END IF + END IF + ! + ! stores the horizontal <U Rnp> + IF ( tpfile%lopened .AND. OTURB_FLX ) THEN + TZFIELD%CMNHNAME = 'UR_FLX' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'UR_FLX' + TZFIELD%CUNITS = 'kg kg-1 m s-1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_UR_FLX' + TZFIELD%NGRID = 2 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZFLX) + END IF + ! + IF (KSPLT==1 .AND. LLES_CALL) THEN + CALL SECOND_MNH(ZTIME1) + CALL LES_MEAN_SUBGRID( MXF(ZFLX), X_LES_SUBGRID_URt ) + CALL LES_MEAN_SUBGRID( MZF(MXF(GX_W_UW(PWM,PDXX,PDZZ,PDZX)*MZM(ZFLX))),& + X_LES_RES_ddxa_W_SBG_UaRt , .TRUE. ) + CALL LES_MEAN_SUBGRID( GX_M_M(PTHLM,PDXX,PDZZ,PDZX)*MXF(ZFLX),& + X_LES_RES_ddxa_Thl_SBG_UaRt , .TRUE. ) + CALL LES_MEAN_SUBGRID( GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX)*MXF(ZFLX),& + X_LES_RES_ddxa_Rt_SBG_UaRt , .TRUE. ) + CALL SECOND_MNH(ZTIME2) + XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 + END IF +! + ! + IF (KRRL>0 .AND. KSPLT==1 .AND. LLES_CALL) THEN + CALL SECOND_MNH(ZTIME1) + CALL LES_MEAN_SUBGRID(MXF(ZFLXC), X_LES_SUBGRID_URc ) + CALL SECOND_MNH(ZTIME2) + XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 + END IF +! +END IF +! +!* 4. < U' TPV' > +! ----------- +! +!! to be tested later +!!IF (KRR/=0) THEN +!! ! here ZFLX= <U'Rnp'> and ZWORK= <U'Thetal'> +!! ! +!! ZVPTU(:,:,:) = & +!! ZWORK(:,:,:)*MXM(ETHETA(KRR,KRRI,PTHLT,PEXNREF,PRT,PLOCPT,PSRCM)) + & +!! ZFLX(:,:,:)*MXM(EMOIST(KRR,KRRI,PTHLT,PEXNREF,PRT,PLOCPT,PSRCM)) +!! ! +!! ! stores the horizontal <U VPT> +!! IF ( tpfile%lopened .AND. OTURB_FLX ) THEN +!! TZFIELD%CMNHNAME = 'UVPT_FLX' +!! TZFIELD%CSTDNAME = '' +!! TZFIELD%CLONGNAME = 'UVPT_FLX' +!! TZFIELD%CUNITS = 'K m s-1' +!! TZFIELD%CDIR = 'XY' +!! TZFIELD%CCOMMENT = 'X_Y_Z_UVPT_FLX' +!! TZFIELD%NGRID = 2 +!! TZFIELD%NTYPE = TYPEREAL +!! TZFIELD%NDIMS = 3 +!! TZFIELD%LTIMEDEP = .TRUE. +!! CALL IO_Field_write(TPFILE,TZFIELD,ZVPTU) +!! END IF +!!! +!!ELSE +!! ZVPTU(:,:,:)=ZWORK(:,:,:) +!!END IF +! +! +!* 5. < V' THETA'l > +! -------------- +! +! +IF (.NOT. L2D) THEN + ZFLX(:,:,:) = -XCSHF * MYM( PK ) * GY_M_V(1,IKU,1,PTHLM,PDYY,PDZZ,PDZY) + ZFLX(:,:,IKE+1) = ZFLX(:,:,IKE) +ELSE + ZFLX(:,:,:) = 0. +END IF +! +! +! Compute the flux at the first inner U-point with an uncentred vertical +! gradient +ZFLX(:,:,IKB:IKB) = -XCSHF * MYM( PK(:,:,IKB:IKB) ) * & + ( DYM(PTHLM(:,:,IKB:IKB)) * PINV_PDYY(:,:,IKB:IKB) & + -MYM( ZCOEFF(:,:,IKB+2:IKB+2)*PTHLM(:,:,IKB+2:IKB+2) & + +ZCOEFF(:,:,IKB+1:IKB+1)*PTHLM(:,:,IKB+1:IKB+1) & + +ZCOEFF(:,:,IKB :IKB )*PTHLM(:,:,IKB :IKB ) ) & + *0.5* ( PDZY(:,:,IKB+1:IKB+1)+PDZY(:,:,IKB:IKB)) & + * PINV_PDYY(:,:,IKB:IKB) ) +! extrapolates the flux under the ground so that the vertical average with +! the IKB flux gives the ground value ( warning the tangential surface +! flux has been set to 0 for the moment !! to be improved ) +ZFLX(:,:,IKB-1:IKB-1) = 2. * MYM( SPREAD( PSFTHM(:,:)* PDIRCOSYW(:,:), 3,1) ) & + - ZFLX(:,:,IKB:IKB) +! +! Add this source to the Theta_l sources +! +IF (.NOT. L2D) THEN + IF (.NOT. LFLAT) THEN + PRTHLS(:,:,:) = PRTHLS & + - DYF( MYM(PRHODJ) * ZFLX * PINV_PDYY ) & + + DZF( PMZM_PRHODJ *MYF(PDZY*(MZM(ZFLX * PINV_PDYY))) * PINV_PDZZ ) + ELSE + PRTHLS(:,:,:) = PRTHLS - DYF( MYM(PRHODJ) * ZFLX * PINV_PDYY ) + END IF +END IF +! +! Compute the equivalent tendancy for Rc and Ri +! +!IF ( OSUBG_COND .AND. KRRL > 0 .AND. .NOT. L2D) THEN +IF ( KRRL >= 1 .AND. .NOT. L2D) THEN + IF (.NOT. LFLAT) THEN + ZFLXC = 2.*( MYF( MYM( PRHODJ*PATHETA*PSRCM )*ZFLX ) & + +MZF( MZM( PRHODJ*PATHETA*PSRCM )*MYF( & + PDZY*(MZM( ZFLX*PINV_PDYY )) ) )& + ) + IF ( KRRI >= 1 ) THEN + PRRS(:,:,:,2) = PRRS(:,:,:,2) + 2. * & + (- DYF( MYM( PRHODJ*PATHETA*PSRCM )*ZFLX*PINV_PDYY ) & + + DZF( MZM( PRHODJ*PATHETA*PSRCM )*MYF( PDZY*(MZM( ZFLX*PINV_PDYY )) )& + *PINV_PDZZ ) & + )*(1.0-PFRAC_ICE(:,:,:)) + PRRS(:,:,:,4) = PRRS(:,:,:,4) + 2. * & + (- DYF( MYM( PRHODJ*PATHETA*PSRCM )*ZFLX*PINV_PDYY ) & + + DZF( MZM( PRHODJ*PATHETA*PSRCM )*MYF( PDZY*(MZM( ZFLX*PINV_PDYY )) )& + *PINV_PDZZ ) & + )*PFRAC_ICE(:,:,:) + ELSE + PRRS(:,:,:,2) = PRRS(:,:,:,2) + 2. * & + (- DYF( MYM( PRHODJ*PATHETA*PSRCM )*ZFLX*PINV_PDYY ) & + + DZF( MZM( PRHODJ*PATHETA*PSRCM )*MYF( PDZY*(MZM( ZFLX*PINV_PDYY )) )& + *PINV_PDZZ ) & + ) + END IF + ELSE + ZFLXC = 2.*MYF( MYM( PRHODJ*PATHETA*PSRCM )*ZFLX ) + IF ( KRRI >= 1 ) THEN + PRRS(:,:,:,2) = PRRS(:,:,:,2) - 2. * & + DYF( MYM( PRHODJ*PATHETA*PSRCM )*ZFLX*PINV_PDYY )*(1.0-PFRAC_ICE(:,:,:)) + PRRS(:,:,:,4) = PRRS(:,:,:,4) - 2. * & + DYF( MYM( PRHODJ*PATHETA*PSRCM )*ZFLX*PINV_PDYY )*PFRAC_ICE(:,:,:) + ELSE + PRRS(:,:,:,2) = PRRS(:,:,:,2) - 2. * & + DYF( MYM( PRHODJ*PATHETA*PSRCM )*ZFLX*PINV_PDYY ) + END IF + END IF +END IF +! +!! stores this flux in ZWORK to compute later <V' VPT'> +!!ZWORK(:,:,:) = ZFLX(:,:,:) +! +! stores the horizontal <V THl> +IF ( tpfile%lopened .AND. OTURB_FLX ) THEN + TZFIELD%CMNHNAME = 'VTHL_FLX' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'VTHL_FLX' + TZFIELD%CUNITS = 'K m s-1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_VTHL_FLX' + TZFIELD%NGRID = 3 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZFLX) +END IF +! +IF (KSPLT==1 .AND. LLES_CALL) THEN + CALL SECOND_MNH(ZTIME1) + CALL LES_MEAN_SUBGRID( MYF(ZFLX), X_LES_SUBGRID_VThl ) + CALL LES_MEAN_SUBGRID( MZF(MYF(GY_W_VW(PWM,PDYY,PDZZ,PDZY)*MZM(ZFLX))),& + X_LES_RES_ddxa_W_SBG_UaThl , .TRUE. ) + CALL LES_MEAN_SUBGRID( GY_M_M(PTHLM,PDYY,PDZZ,PDZY)*MYF(ZFLX),& + X_LES_RES_ddxa_Thl_SBG_UaThl , .TRUE. ) + IF (KRR>=1) THEN + CALL LES_MEAN_SUBGRID( GY_M_M(PRM(:,:,:,1),PDYY,PDZZ,PDZY)*MYF(ZFLX),& + X_LES_RES_ddxa_Rt_SBG_UaThl , .TRUE. ) + END IF + CALL SECOND_MNH(ZTIME2) + XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 +END IF +! +! +!* 6. < V' R'np > +! ----------- +! +IF (KRR/=0) THEN + ! + IF (.NOT. L2D) THEN + ZFLX(:,:,:) = -XCHF * MYM( PK ) * GY_M_V(1,IKU,1,PRM(:,:,:,1),PDYY,PDZZ,PDZY) + ZFLX(:,:,IKE+1) = ZFLX(:,:,IKE) + ELSE + ZFLX(:,:,:) = 0. + END IF +! +! Compute the flux at the first inner U-point with an uncentred vertical +! gradient + ZFLX(:,:,IKB:IKB) = -XCHF * MYM( PK(:,:,IKB:IKB) ) * & + ( DYM(PRM(:,:,IKB:IKB,1)) * PINV_PDYY(:,:,IKB:IKB) & + -MYM( ZCOEFF(:,:,IKB+2:IKB+2)*PRM(:,:,IKB+2:IKB+2,1) & + +ZCOEFF(:,:,IKB+1:IKB+1)*PRM(:,:,IKB+1:IKB+1,1) & + +ZCOEFF(:,:,IKB :IKB )*PRM(:,:,IKB :IKB ,1) ) & + *0.5* ( PDZY(:,:,IKB+1:IKB+1)+PDZY(:,:,IKB:IKB)) & + * PINV_PDYY(:,:,IKB:IKB) ) +! extrapolates the flux under the ground so that the vertical average with +! the IKB flux gives the ground value ( warning the tangential surface +! flux has been set to 0 for the moment !! to be improved ) + ZFLX(:,:,IKB-1:IKB-1) = 2. * MYM( SPREAD( PSFRM(:,:)* PDIRCOSYW(:,:), 3,1) ) & + - ZFLX(:,:,IKB:IKB) + ! + ! Add this source to the conservative mixing ratio sources + ! + IF (.NOT. L2D) THEN + IF (.NOT. LFLAT) THEN + PRRS(:,:,:,1) = PRRS(:,:,:,1) & + - DYF( MYM(PRHODJ) * ZFLX * PINV_PDYY ) & + + + DZF( PMZM_PRHODJ *MYF(PDZY*(MZM(ZFLX * PINV_PDYY))) * PINV_PDZZ ) + ELSE + PRRS(:,:,:,1) = PRRS(:,:,:,1) - DYF( MYM(PRHODJ) * ZFLX * PINV_PDYY ) + END IF + END IF + ! + ! Compute the equivalent tendancy for Rc and Ri + ! + IF ( KRRL >= 1 .AND. .NOT. L2D) THEN ! Sub-grid condensation + IF (.NOT. LFLAT) THEN + ZFLXC = ZFLXC & + + 2.*( MXF( MYM( PRHODJ*PAMOIST*PSRCM )*ZFLX ) & + + MZF( MZM( PRHODJ*PAMOIST*PSRCM )*MYF( & + PDZY*(MZM( ZFLX*PINV_PDYY )) ) )& + ) + IF ( KRRI >= 1 ) THEN + PRRS(:,:,:,2) = PRRS(:,:,:,2) + 2. * & + (- DYF( MYM( PRHODJ*PAMOIST*PSRCM )*ZFLX/PDYY ) & + + DZF( MZM( PRHODJ*PAMOIST*PSRCM )*MYF( PDZY*(MZM( ZFLX*PINV_PDYY )) )& + * PINV_PDZZ ) & + )*(1.0-PFRAC_ICE(:,:,:)) + PRRS(:,:,:,4) = PRRS(:,:,:,4) + 2. * & + (- DYF( MYM( PRHODJ*PAMOIST*PSRCM )*ZFLX/PDYY ) & + + DZF( MZM( PRHODJ*PAMOIST*PSRCM )*MYF( PDZY*(MZM( ZFLX*PINV_PDYY )) )& + * PINV_PDZZ ) & + )*PFRAC_ICE(:,:,:) + ELSE + PRRS(:,:,:,2) = PRRS(:,:,:,2) + 2. * & + (- DYF( MYM( PRHODJ*PAMOIST*PSRCM )*ZFLX/PDYY ) & + + DZF( MZM( PRHODJ*PAMOIST*PSRCM )*MYF( PDZY*(MZM( ZFLX*PINV_PDYY )) )& + * PINV_PDZZ ) & + ) + END IF + ELSE + ZFLXC = ZFLXC + 2.*MXF( MYM( PRHODJ*PAMOIST*PSRCM )*ZFLX ) + IF ( KRRI >= 1 ) THEN + PRRS(:,:,:,2) = PRRS(:,:,:,2) - 2. * & + DYF( MYM( PRHODJ*PAMOIST*PSRCM )*ZFLX/PDYY )*(1.0-PFRAC_ICE(:,:,:)) + PRRS(:,:,:,4) = PRRS(:,:,:,4) - 2. * & + DYF( MYM( PRHODJ*PAMOIST*PSRCM )*ZFLX/PDYY )*PFRAC_ICE(:,:,:) + ELSE + PRRS(:,:,:,2) = PRRS(:,:,:,2) - 2. * & + DYF( MYM( PRHODJ*PAMOIST*PSRCM )*ZFLX/PDYY ) + END IF + END IF + END IF + ! + ! stores the horizontal <V Rnp> + IF ( tpfile%lopened .AND. OTURB_FLX ) THEN + TZFIELD%CMNHNAME = 'VR_FLX' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'VR_FLX' + TZFIELD%CUNITS = 'kg kg-1 m s-1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_VR_FLX' + TZFIELD%NGRID = 3 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZFLX) + END IF + ! + IF (KSPLT==1 .AND. LLES_CALL) THEN + CALL SECOND_MNH(ZTIME1) + CALL LES_MEAN_SUBGRID( MYF(ZFLX), X_LES_SUBGRID_VRt ) + CALL LES_MEAN_SUBGRID( MZF(MYF(GY_W_VW(PWM,PDYY,PDZZ,PDZY)*MZM(ZFLX))),& + X_LES_RES_ddxa_W_SBG_UaRt , .TRUE. ) + CALL LES_MEAN_SUBGRID( GY_M_M(PTHLM,PDYY,PDZZ,PDZY)*MYF(ZFLX), & + X_LES_RES_ddxa_Thl_SBG_UaRt , .TRUE. ) + CALL LES_MEAN_SUBGRID( GY_M_M(PRM(:,:,:,1),PDYY,PDZZ,PDZY)*MYF(ZFLX), & + X_LES_RES_ddxa_Rt_SBG_UaRt , .TRUE. ) + CALL SECOND_MNH(ZTIME2) + XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 + END IF +! + ! + IF (KRRL>0 .AND. KSPLT==1 .AND. LLES_CALL) THEN + CALL SECOND_MNH(ZTIME1) + CALL LES_MEAN_SUBGRID(MYF(ZFLXC), X_LES_SUBGRID_VRc ) + CALL SECOND_MNH(ZTIME2) + XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 + END IF + ! +END IF +! +!* 7. < V' TPV' > +! ----------- +! +!! to be tested later +!!IF (KRR/=0) THEN +!! ! here ZFLX= <V'R'np> and ZWORK= <V'Theta'l> +!! ! +!! IF (.NOT. L2D) THEN & +!! ZVPTV(:,:,:) = & +!! ZWORK(:,:,:)*MYM(ETHETA(KRR,KRRI,PTHLT,PEXNREF,PRT,PLOCPT,PSRCM)) + & +!! ZFLX(:,:,:)*MYM(EMOIST(KRR,KRRI,PTHLT,PEXNREF,PRT,PLOCPT,PSRCM)) +!! ELSE +!! ZVPTV(:,:,:) = 0. +!! END IF +!! ! +!! ! stores the horizontal <V VPT> +!! IF ( tpfile%lopened .AND. OTURB_FLX ) THEN +!! TZFIELD%CMNHNAME = 'VVPT_FLX' +!! TZFIELD%CSTDNAME = '' +!! TZFIELD%CLONGNAME = 'VVPT_FLX' +!! TZFIELD%CUNITS = 'K m s-1' +!! TZFIELD%CDIR = 'XY' +!! TZFIELD%CCOMMENT = 'X_Y_Z_VVPT_FLX' +!! TZFIELD%NGRID = 3 +!! TZFIELD%NTYPE = TYPEREAL +!! TZFIELD%NDIMS = 3 +!! TZFIELD%LTIMEDEP = .TRUE. +!! CALL IO_Field_write(TPFILE,TZFIELD,ZVPTV) +!! END IF +!!! +!!ELSE +!! ZVPTV(:,:,:)=ZWORK(:,:,:) +!!END IF +! +! +END SUBROUTINE TURB_HOR_THERMO_FLUX diff --git a/src/mesonh/turb/turb_hor_tke.f90 b/src/mesonh/turb/turb_hor_tke.f90 new file mode 100644 index 000000000..ec8e9e2b6 --- /dev/null +++ b/src/mesonh/turb/turb_hor_tke.f90 @@ -0,0 +1,246 @@ +!MNH_LIC Copyright 1994-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! #################### + MODULE MODI_TURB_HOR_TKE +! #################### +! +INTERFACE +! + SUBROUTINE TURB_HOR_TKE(KSPLT, & + PDXX,PDYY,PDZZ,PDZX,PDZY, & + PINV_PDXX, PINV_PDYY, PINV_PDZZ, PMZM_PRHODJ, & + PK, PRHODJ, PTKEM, & + PTRH ) + +! +INTEGER, INTENT(IN) :: KSPLT ! current split index +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX, PDYY, PDZZ, PDZX, PDZY + ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(IN) :: PK ! Turbulent diffusion doef. + ! PK = PLM * SQRT(PTKEM) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDXX ! 1./PDXX +REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDYY ! 1./PDYY +REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDZZ ! 1./PDZZ +REAL, DIMENSION(:,:,:), INTENT(IN) :: PMZM_PRHODJ ! MZM(PRHODJ) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density * grid volume +! +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t- dt +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTRH ! horizontal transport of Tke +! +! +! +END SUBROUTINE TURB_HOR_TKE +! +END INTERFACE +! +END MODULE MODI_TURB_HOR_TKE +! ################################################################ + SUBROUTINE TURB_HOR_TKE(KSPLT, & + PDXX, PDYY, PDZZ,PDZX,PDZY, & + PINV_PDXX, PINV_PDYY, PINV_PDZZ, PMZM_PRHODJ, & + PK, PRHODJ, PTKEM, & + PTRH ) +! ################################################################ +! +! +!!**** *TURB_HOR_TKE* computes the horizontal turbulant transports of Tke +!! +!! PURPOSE +!! ------- + +!!** METHOD +!! ------ +!! +!! +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! Joan Cuxart * INM and Meteo-France * +!! +!! MODIFICATIONS +!! ------------- +!! Original Aug 29, 1994 +!! Mar 07 2001 (V. Masson and J. Stein) new routine +!! Nov 06, 2002 (V. Masson) LES budgets +!! -------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CONF +USE MODD_CST +USE MODD_CTURB +USE MODD_PARAMETERS +USE MODD_LES +! +! +USE MODI_SHUMAN +USE MODI_GRADIENT_M +USE MODI_LES_MEAN_SUBGRID +! +USE MODI_SECOND_MNH +! +IMPLICIT NONE +! +! +!* 0.1 declaration of arguments +! +! +INTEGER, INTENT(IN) :: KSPLT ! current split index +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX, PDYY, PDZZ, PDZX, PDZY + ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(IN) :: PK ! Turbulent diffusion doef. + ! PK = PLM * SQRT(PTKEM) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDXX ! 1./PDXX +REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDYY ! 1./PDYY +REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDZZ ! 1./PDZZ +REAL, DIMENSION(:,:,:), INTENT(IN) :: PMZM_PRHODJ ! MZM(PRHODJ) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density * grid volume +! +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t- dt +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTRH ! horizontal transport of Tke +! +! +! +!* 0.2 declaration of local variables +! +INTEGER :: IKB, IKU +! +REAL, DIMENSION(SIZE(PDZZ,1),SIZE(PDZZ,2),1+JPVEXT:3+JPVEXT) :: ZCOEFF + ! coefficients for the uncentred gradient + ! computation near the ground +! +REAL, DIMENSION(SIZE(PTKEM,1),SIZE(PTKEM,2),SIZE(PTKEM,3)):: ZFLX +! +REAL :: ZTIME1, ZTIME2 +! --------------------------------------------------------------------------- +! +!* 1. PRELIMINARY COMPUTATIONS +! ------------------------ +! +IKB = 1.+JPVEXT +IKU = SIZE(PTKEM,3) +! +! compute the coefficients for the uncentred gradient computation near the +! ground +! +ZCOEFF(:,:,IKB+2)= - PDZZ(:,:,IKB+1) / & + ( (PDZZ(:,:,IKB+2)+PDZZ(:,:,IKB+1)) * PDZZ(:,:,IKB+2) ) +ZCOEFF(:,:,IKB+1)= (PDZZ(:,:,IKB+2)+PDZZ(:,:,IKB+1)) / & + ( PDZZ(:,:,IKB+1) * PDZZ(:,:,IKB+2) ) +ZCOEFF(:,:,IKB)= - (PDZZ(:,:,IKB+2)+2.*PDZZ(:,:,IKB+1)) / & + ( (PDZZ(:,:,IKB+2)+PDZZ(:,:,IKB+1)) * PDZZ(:,:,IKB+1) ) +! +!-------------------------------------------------------------------- +! +!* 2. horizontal transport of Tke u'e +! ------------------------------- +! +! +ZFLX = -XCET * MXM(PK) * GX_M_U(1,IKU,1,PTKEM,PDXX,PDZZ,PDZX) ! < u'e > +! +! special case near the ground ( uncentred gradient ) +! +ZFLX(:,:,IKB) = ZCOEFF(:,:,IKB+2)*PTKEM(:,:,IKB+2) & + + ZCOEFF(:,:,IKB+1)*PTKEM(:,:,IKB+1) & + + ZCOEFF(:,:,IKB )*PTKEM(:,:,IKB ) +! +ZFLX(:,:,IKB:IKB) = & + - XCET * MXM( PK(:,:,IKB:IKB) ) * ( & + DXM ( PTKEM(:,:,IKB:IKB) ) * PINV_PDXX(:,:,IKB:IKB) & + -MXM ( ZFLX (:,:,IKB:IKB) ) * PINV_PDXX(:,:,IKB:IKB) & + * 0.5 * ( PDZX(:,:,IKB+1:IKB+1) + PDZX(:,:,IKB:IKB) ) ) +! +! extrapolate the fluxes to obtain < u'e > = 0 at the ground +! +ZFLX(:,:,IKB-1) = - ZFLX(:,:,IKB) +! +! let the same flux at IKU-1 and IKU level +! +ZFLX(:,:,IKU) = ZFLX(:,:,IKU-1) +! +IF (.NOT. LFLAT) THEN + PTRH =-( DXF( MXM(PRHODJ) * ZFLX * PINV_PDXX)& + - DZF( PMZM_PRHODJ * MXF( PDZX * MZM(ZFLX*PINV_PDXX)) * PINV_PDZZ)& + ) /PRHODJ +ELSE + PTRH =-( DXF( MXM(PRHODJ) * ZFLX * PINV_PDXX)& + ) /PRHODJ +END IF +! +IF (LLES_CALL .AND. KSPLT==1) THEN + CALL SECOND_MNH(ZTIME1) + CALL LES_MEAN_SUBGRID( MXF(ZFLX), X_LES_SUBGRID_UTke ) + CALL SECOND_MNH(ZTIME2) + XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 +END IF +! +! +!-------------------------------------------------------------------- +! +!* 3. horizontal transport of Tke v'e +! ------------------------------- +! +IF (.NOT. L2D) THEN + ZFLX =-XCET * MYM(PK) * GY_M_V(1,IKU,1,PTKEM,PDYY,PDZZ,PDZY) ! < v'e > +! +! special case near the ground ( uncentred gradient ) +! + ZFLX(:,:,IKB) = ZCOEFF(:,:,IKB+2)*PTKEM(:,:,IKB+2) & + + ZCOEFF(:,:,IKB+1)*PTKEM(:,:,IKB+1) & + + ZCOEFF(:,:,IKB )*PTKEM(:,:,IKB ) +! + ZFLX(:,:,IKB:IKB) = & + - XCET * MYM( PK(:,:,IKB:IKB) ) * ( & + DYM ( PTKEM(:,:,IKB:IKB) ) * PINV_PDYY(:,:,IKB:IKB) & + - MYM ( ZFLX (:,:,IKB:IKB) ) * PINV_PDYY(:,:,IKB:IKB) & + * 0.5 * ( PDZY(:,:,IKB+1:IKB+1) + PDZY(:,:,IKB:IKB) ) ) +! +! extrapolate the fluxes to obtain < v'e > = 0 at the ground +! + ZFLX(:,:,IKB-1) = - ZFLX(:,:,IKB) +! +! let the same flux at IKU-1 and IKU level +! + ZFLX(:,:,IKU) = ZFLX(:,:,IKU-1) +! +! complete the explicit turbulent transport +! + IF (.NOT. LFLAT) THEN + PTRH = PTRH - ( DYF( MYM(PRHODJ) * ZFLX * PINV_PDYY ) & + - DZF( PMZM_PRHODJ * MYF( PDZY * MZM(ZFLX*PINV_PDYY) ) * PINV_PDZZ ) & + ) /PRHODJ + ELSE + PTRH = PTRH - ( DYF( MYM(PRHODJ) * ZFLX * PINV_PDYY ) & + ) /PRHODJ + END IF +! + IF (LLES_CALL .AND. KSPLT==1) THEN + CALL SECOND_MNH(ZTIME1) + CALL LES_MEAN_SUBGRID( MYF(ZFLX), X_LES_SUBGRID_VTke ) + CALL SECOND_MNH(ZTIME2) + XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 + END IF +! +END IF +! +!---------------------------------------------------------------------------- +! +END SUBROUTINE TURB_HOR_TKE diff --git a/src/mesonh/turb/turb_hor_uv.f90 b/src/mesonh/turb/turb_hor_uv.f90 new file mode 100644 index 000000000..3fcecc20e --- /dev/null +++ b/src/mesonh/turb/turb_hor_uv.f90 @@ -0,0 +1,355 @@ +!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ####################### + MODULE MODI_TURB_HOR_UV +! ####################### +! +INTERFACE +! + SUBROUTINE TURB_HOR_UV(KSPLT, & + OTURB_FLX, & + TPFILE, & + PK,PINV_PDXX,PINV_PDYY,PINV_PDZZ,PMZM_PRHODJ, & + PDXX,PDYY,PDZZ,PDZX,PDZY, & + PDIRCOSZW, & + PCOSSLOPE,PSINSLOPE, & + PRHODJ, & + PCDUEFF,PTAU11M,PTAU12M,PTAU22M,PTAU33M, & + PUM,PVM,PUSLOPEM,PVSLOPEM, & + PDP, & + PRUS,PRVS ) +! +USE MODD_IO, ONLY: TFILEDATA +! +INTEGER, INTENT(IN) :: KSPLT ! split process index +LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the + ! turbulent fluxes in the syncronous FM-file +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PK ! Turbulent diffusion doef. + ! PK = PLM * SQRT(PTKEM) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDXX ! 1./PDXX +REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDYY ! 1./PDYY +REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDZZ ! 1./PDZZ +REAL, DIMENSION(:,:,:), INTENT(IN) :: PMZM_PRHODJ ! MZM(PRHODJ) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX, PDYY, PDZZ, PDZX, PDZY + ! Metric coefficients +REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSZW +! Director Cosinus along z directions at surface w-point +REAL, DIMENSION(:,:), INTENT(IN) :: PCOSSLOPE ! cosinus of the angle + ! between i and the slope vector +REAL, DIMENSION(:,:), INTENT(IN) :: PSINSLOPE ! sinus of the angle + ! between i and the slope vector +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density * grid volume +! +REAL, DIMENSION(:,:), INTENT(IN) :: PCDUEFF ! Cd * || u || at time t +REAL, DIMENSION(:,:), INTENT(IN) :: PTAU11M ! <uu> in the axes linked + ! to the maximum slope direction and the surface normal and the binormal + ! at time t - dt +REAL, DIMENSION(:,:), INTENT(IN) :: PTAU12M ! <uv> in the same axes +REAL, DIMENSION(:,:), INTENT(IN) :: PTAU22M ! <vv> in the same axes +REAL, DIMENSION(:,:), INTENT(IN) :: PTAU33M ! <ww> in the same axes +! +! Variables at t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM,PVM +REAL, DIMENSION(:,:), INTENT(IN) :: PUSLOPEM ! wind component along the + ! maximum slope direction +REAL, DIMENSION(:,:), INTENT(IN) :: PVSLOPEM ! wind component along the + ! direction normal to the maximum slope one +! +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS ! var. at t+1 -split- +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDP ! TKE production terms +! +! +END SUBROUTINE TURB_HOR_UV +! +END INTERFACE +! +END MODULE MODI_TURB_HOR_UV +! ################################################################ + SUBROUTINE TURB_HOR_UV(KSPLT, & + OTURB_FLX, & + TPFILE, & + PK,PINV_PDXX,PINV_PDYY,PINV_PDZZ,PMZM_PRHODJ, & + PDXX,PDYY,PDZZ,PDZX,PDZY, & + PDIRCOSZW, & + PCOSSLOPE,PSINSLOPE, & + PRHODJ, & + PCDUEFF,PTAU11M,PTAU12M,PTAU22M,PTAU33M, & + PUM,PVM,PUSLOPEM,PVSLOPEM, & + PDP, & + PRUS,PRVS ) +! ################################################################ +! +! +!!**** *TURB_HOR* -routine to compute the source terms in the meso-NH +!! model equations due to the non-vertical turbulent fluxes. +!! +!! PURPOSE +!! ------- +!! +!! see TURB_HOR +!! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! +!! Joan Cuxart * INM and Meteo-France * +!! +!! MODIFICATIONS +!! ------------- +!! Aug , 1997 (V. Saravane) spliting of TURB_HOR +!! Nov 27, 1997 (V. Masson) clearing of the routine +!! Oct 18, 2000 (V. Masson) LES computations + LFLAT switch +!! Nov 06, 2002 (V. Masson) LES budgets +!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +!! -------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_CONF +USE MODD_CTURB +use modd_field, only: tfielddata, TYPEREAL +USE MODD_IO, ONLY: TFILEDATA +USE MODD_PARAMETERS +USE MODD_LES +! +USE MODE_IO_FIELD_WRITE, only: IO_Field_write +! +USE MODI_GRADIENT_M +USE MODI_GRADIENT_U +USE MODI_GRADIENT_V +USE MODI_GRADIENT_W +USE MODI_SHUMAN +USE MODI_COEFJ +USE MODI_LES_MEAN_SUBGRID +! +USE MODI_SECOND_MNH +! +IMPLICIT NONE +! +! +!* 0.1 declaration of arguments +! +! +! +INTEGER, INTENT(IN) :: KSPLT ! split process index +LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the + ! turbulent fluxes in the syncronous FM-file +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PK ! Turbulent diffusion doef. + ! PK = PLM * SQRT(PTKEM) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDXX ! 1./PDXX +REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDYY ! 1./PDYY +REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDZZ ! 1./PDZZ +REAL, DIMENSION(:,:,:), INTENT(IN) :: PMZM_PRHODJ ! MZM(PRHODJ) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX, PDYY, PDZZ, PDZX, PDZY + ! Metric coefficients +REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSZW +! Director Cosinus along z directions at surface w-point +REAL, DIMENSION(:,:), INTENT(IN) :: PCOSSLOPE ! cosinus of the angle + ! between i and the slope vector +REAL, DIMENSION(:,:), INTENT(IN) :: PSINSLOPE ! sinus of the angle + ! between i and the slope vector +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density * grid volume +! +REAL, DIMENSION(:,:), INTENT(IN) :: PCDUEFF ! Cd * || u || at time t +REAL, DIMENSION(:,:), INTENT(IN) :: PTAU11M ! <uu> in the axes linked + ! to the maximum slope direction and the surface normal and the binormal + ! at time t - dt +REAL, DIMENSION(:,:), INTENT(IN) :: PTAU12M ! <uv> in the same axes +REAL, DIMENSION(:,:), INTENT(IN) :: PTAU22M ! <vv> in the same axes +REAL, DIMENSION(:,:), INTENT(IN) :: PTAU33M ! <ww> in the same axes +! +! Variables at t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM,PVM +REAL, DIMENSION(:,:), INTENT(IN) :: PUSLOPEM ! wind component along the + ! maximum slope direction +REAL, DIMENSION(:,:), INTENT(IN) :: PVSLOPEM ! wind component along the + ! direction normal to the maximum slope one +! +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS ! var. at t+1 -split- +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDP ! TKE production terms +! +! +! +!* 0.2 declaration of local variables +! +REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2),SIZE(PUM,3)) & + :: ZFLX,ZWORK + ! work arrays +! +REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2)) ::ZDIRSINZW + ! sinus of the angle between the vertical and the normal to the orography +INTEGER :: IKB,IKE + ! Index values for the Beginning and End + ! mass points of the domain +! +REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2),SIZE(PUM,3)) :: GY_U_UV_PUM +REAL, DIMENSION(SIZE(PVM,1),SIZE(PVM,2),SIZE(PVM,3)) :: GX_V_UV_PVM +! +REAL :: ZTIME1, ZTIME2 +TYPE(TFIELDDATA) :: TZFIELD +! --------------------------------------------------------------------------- +! +!* 1. PRELIMINARY COMPUTATIONS +! ------------------------ +! +IKB = 1+JPVEXT +IKE = SIZE(PUM,3)-JPVEXT +! +ZDIRSINZW(:,:) = SQRT( 1. - PDIRCOSZW(:,:)**2 ) +! +GX_V_UV_PVM = GX_V_UV(PVM,PDXX,PDZZ,PDZX) +IF (.NOT. L2D) GY_U_UV_PUM = GY_U_UV(PUM,PDYY,PDZZ,PDZY) +! +! +!* 12. < U'V'> +! ------- +! +! +IF (.NOT. L2D) THEN + ZFLX(:,:,:)= - XCMFS * MYM(MXM(PK)) * & + (GY_U_UV_PUM + GX_V_UV_PVM) +ELSE + ZFLX(:,:,:)= - XCMFS * MYM(MXM(PK)) * & + (GX_V_UV_PVM) +END IF +! +ZFLX(:,:,IKE+1)= ZFLX(:,:,IKE) +! +! +! Compute the correlation at the first physical level with the following +! hypothesis du/dz vary in 1/z and w=0 at the ground +ZFLX(:,:,IKB:IKB) = - XCMFS * MYM(MXM(PK(:,:,IKB:IKB))) * ( & + ( DYM( PUM(:,:,IKB:IKB) ) & + -MYM( (PUM(:,:,IKB+1:IKB+1)-PUM(:,:,IKB:IKB)) & + *(1./MXM(PDZZ(:,:,IKB+1:IKB+1))+1./MXM(PDZZ(:,:,IKB:IKB))))& + *0.5*MXM((PDZY(:,:,IKB+1:IKB+1)+PDZY(:,:,IKB:IKB))) & + ) / MXM(PDYY(:,:,IKB:IKB)) & + +( DXM( PVM(:,:,IKB:IKB) ) & + -MXM( (PVM(:,:,IKB+1:IKB+1)-PVM(:,:,IKB:IKB)) & + *(1./MYM(PDZZ(:,:,IKB+1:IKB+1))+1./MYM(PDZZ(:,:,IKB:IKB))))& + *0.5*MYM((PDZX(:,:,IKB+1:IKB+1)+PDZX(:,:,IKB:IKB))) & + ) / MYM(PDXX(:,:,IKB:IKB)) ) +! +! extrapolates this flux under the ground with the surface flux +ZFLX(:,:,IKB-1) = & + PTAU11M(:,:) * PCOSSLOPE(:,:) * PSINSLOPE(:,:) * PDIRCOSZW(:,:)**2 & + +PTAU12M(:,:) * (PCOSSLOPE(:,:)**2 - PSINSLOPE(:,:)**2) * & + PDIRCOSZW(:,:)**2 & + -PTAU22M(:,:) * PCOSSLOPE(:,:) * PSINSLOPE(:,:) & + +PTAU33M(:,:) * PCOSSLOPE(:,:) * PSINSLOPE(:,:) * ZDIRSINZW(:,:)**2 & + -PCDUEFF(:,:) * ( & + 2. * PUSLOPEM(:,:) * PCOSSLOPE(:,:) * PSINSLOPE(:,:) * & + PDIRCOSZW(:,:) * ZDIRSINZW(:,:) & + +PVSLOPEM(:,:) * (PCOSSLOPE(:,:)**2 - PSINSLOPE(:,:)**2) * ZDIRSINZW(:,:) & + ) +! +ZFLX(:,:,IKB-1:IKB-1) = 2. * MXM( MYM( ZFLX(:,:,IKB-1:IKB-1) ) ) & + - ZFLX(:,:,IKB:IKB) +! +! stores <U V> +IF ( tpfile%lopened .AND. OTURB_FLX ) THEN + TZFIELD%CMNHNAME = 'UV_FLX' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'UV_FLX' + TZFIELD%CUNITS = 'm2 s-2' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_UV_FLX' + TZFIELD%NGRID = 5 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZFLX) +END IF +! +! +! +!computation of the source for rho*V due to this flux +IF (.NOT. LFLAT) THEN + PRUS(:,:,:) = PRUS(:,:,:) & + - DYF(ZFLX * MXM(MYM(PRHODJ) * PINV_PDYY) ) & + + DZF( MYF( MZM(ZFLX)*MXM(PDZY/MZM(PDYY))) & + * MXM(PMZM_PRHODJ * PINV_PDZZ) ) +ELSE + PRUS(:,:,:) = PRUS(:,:,:) - DYF(ZFLX * MXM(MYM(PRHODJ) * PINV_PDYY) ) +END IF +! +!computation of the source for rho*V due to this flux +IF (.NOT. LFLAT) THEN + PRVS(:,:,:) = PRVS(:,:,:) & + - DXF(ZFLX * MYM(MXM(PRHODJ) * PINV_PDXX) ) & + + DZF( MXF( MZM(ZFLX)*MYM(PDZX/MZM(PDXX))) & + * MYM(PMZM_PRHODJ * PINV_PDZZ) ) +ELSE + PRVS(:,:,:) = PRVS(:,:,:) - DXF(ZFLX * MYM(MXM(PRHODJ) * PINV_PDXX) ) +END IF +! +IF (KSPLT==1) THEN + ! + !Contribution to the dynamic production of TKE: + ! + IF (.NOT. L2D) THEN + ZWORK(:,:,:) = - MXF( MYF( ZFLX * & + (GY_U_UV_PUM + GX_V_UV_PVM) ) ) + ELSE + ZWORK(:,:,:) = - MXF( MYF( ZFLX * & + (GX_V_UV_PVM) ) ) + ENDIF + ! + ! evaluate the dynamic production at w(IKB+1) in PDP(IKB) + ! + ZWORK(:,:,IKB:IKB) = - & + MXF ( MYF( 0.5 * (ZFLX(:,:,IKB+1:IKB+1)+ZFLX(:,:,IKB:IKB)) ) ) & + *(MXF ( MYF( & + DYM( 0.5 * (PUM(:,:,IKB+1:IKB+1)+PUM(:,:,IKB:IKB)) ) & + / MXM( 0.5*(PDYY(:,:,IKB:IKB)+PDYY(:,:,IKB+1:IKB+1)) ) & + +DXM( 0.5 * (PVM(:,:,IKB+1:IKB+1)+PVM(:,:,IKB:IKB)) ) & + / MYM( 0.5*(PDXX(:,:,IKB:IKB)+PDXX(:,:,IKB+1:IKB+1)) ) & + ) ) & + -MXF( (PUM(:,:,IKB+1:IKB+1)-PUM(:,:,IKB:IKB)) / & + MXM(PDZZ(:,:,IKB+1:IKB+1)) * PDZY(:,:,IKB+1:IKB+1) & + ) / MYF(MXM( 0.5*(PDYY(:,:,IKB:IKB)+PDYY(:,:,IKB+1:IKB+1)) ) )& + -MYF( (PVM(:,:,IKB+1:IKB+1)-PVM(:,:,IKB:IKB)) / & + MYM(PDZZ(:,:,IKB+1:IKB+1)) * PDZX(:,:,IKB+1:IKB+1) & + ) / MXF(MYM( 0.5*(PDXX(:,:,IKB:IKB)+PDXX(:,:,IKB+1:IKB+1)) ) )& + ) + ! + ! dynamic production + PDP(:,:,:) = PDP(:,:,:) + ZWORK(:,:,:) + ! +END IF +! +! Storage in the LES configuration +! +IF (LLES_CALL .AND. KSPLT==1) THEN + CALL SECOND_MNH(ZTIME1) + CALL LES_MEAN_SUBGRID( MXF(MYF(ZFLX)), X_LES_SUBGRID_UV ) + CALL LES_MEAN_SUBGRID( MXF(MYF(GY_U_UV(PUM,PDYY,PDZZ,PDZY)*ZFLX)), X_LES_RES_ddxa_U_SBG_UaU , .TRUE.) + CALL LES_MEAN_SUBGRID( MXF(MYF(GX_V_UV(PVM,PDXX,PDZZ,PDZX)*ZFLX)), X_LES_RES_ddxa_V_SBG_UaV , .TRUE.) + CALL SECOND_MNH(ZTIME2) + XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 +END IF +! +! +END SUBROUTINE TURB_HOR_UV diff --git a/src/mesonh/turb/turb_hor_uw.f90 b/src/mesonh/turb/turb_hor_uw.f90 new file mode 100644 index 000000000..d19c68bae --- /dev/null +++ b/src/mesonh/turb/turb_hor_uw.f90 @@ -0,0 +1,299 @@ +!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ####################### + MODULE MODI_TURB_HOR_UW +! ####################### +! +INTERFACE +! + SUBROUTINE TURB_HOR_UW(KSPLT, & + OTURB_FLX,KRR, & + TPFILE, & + PK,PINV_PDXX,PINV_PDZZ,PMZM_PRHODJ, & + PDXX,PDZZ,PDZX, & + PRHODJ,PTHVREF, & + PUM,PWM,PTHLM,PRM,PSVM, & + PTKEM,PLM, & + PDP, & + PRUS,PRWS ) +! +USE MODD_IO, ONLY: TFILEDATA +! +INTEGER, INTENT(IN) :: KSPLT ! split process index +LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the + ! turbulent fluxes in the syncronous FM-file +INTEGER, INTENT(IN) :: KRR ! number of moist var. +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +! + +REAL, DIMENSION(:,:,:), INTENT(IN) :: PK ! Turbulent diffusion doef. + ! PK = PLM * SQRT(PTKEM) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDXX ! 1./PDXX +REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDZZ ! 1./PDZZ +REAL, DIMENSION(:,:,:), INTENT(IN) :: PMZM_PRHODJ ! MZM(PRHODJ) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX, PDZZ, PDZX + ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density * grid volume +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! ref. state VPT +! +! Variables at t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM,PWM,PTHLM +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t- dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRWS +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDP ! TKE production terms +! +! +! +! +END SUBROUTINE TURB_HOR_UW +! +END INTERFACE +! +END MODULE MODI_TURB_HOR_UW +! ################################################################ + SUBROUTINE TURB_HOR_UW(KSPLT, & + OTURB_FLX,KRR, & + TPFILE, & + PK,PINV_PDXX,PINV_PDZZ,PMZM_PRHODJ, & + PDXX,PDZZ,PDZX, & + PRHODJ,PTHVREF, & + PUM,PWM,PTHLM,PRM,PSVM, & + PTKEM,PLM, & + PDP, & + PRUS,PRWS ) +! ################################################################ +! +! +!!**** *TURB_HOR* -routine to compute the source terms in the meso-NH +!! model equations due to the non-vertical turbulent fluxes. +!! +!! PURPOSE +!! ------- +!! +!! see TURB_HOR +!! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! +!! Joan Cuxart * INM and Meteo-France * +!! +!! MODIFICATIONS +!! ------------- +!! Aug , 1997 (V. Saravane) spliting of TURB_HOR +!! Nov 27, 1997 (V. Masson) clearing of the routine +!! Oct 18, 2000 (V. Masson) LES computations + LFLAT switch +!! Feb 14, 2001 (V. Masson and J. Stein) DZF bug on PRWS +!! + remove the use of W=0 at the ground +!! + extrapolation under the ground +!! Nov 06, 2002 (V. Masson) LES budgets +!! October 2009 (G. Tanguy) add ILENCH=LEN(YCOMMENT) after +!! change of YCOMMENT +!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +!! -------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_CONF +USE MODD_CTURB +use modd_field, only: tfielddata, TYPEREAL +USE MODD_IO, ONLY: TFILEDATA +USE MODD_PARAMETERS +USE MODD_LES +USE MODD_NSV +! +USE MODE_IO_FIELD_WRITE, only: IO_Field_write +! +USE MODI_GRADIENT_M +USE MODI_GRADIENT_U +USE MODI_GRADIENT_V +USE MODI_GRADIENT_W +USE MODI_SHUMAN +USE MODI_COEFJ +USE MODI_LES_MEAN_SUBGRID +! +USE MODI_SECOND_MNH +! +IMPLICIT NONE +! +! +!* 0.1 declaration of arguments +! +! +! +INTEGER, INTENT(IN) :: KSPLT ! split process index +LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the + ! turbulent fluxes in the syncronous FM-file +INTEGER, INTENT(IN) :: KRR ! number of moist var. +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +! + +REAL, DIMENSION(:,:,:), INTENT(IN) :: PK ! Turbulent diffusion doef. + ! PK = PLM * SQRT(PTKEM) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDXX ! 1./PDXX +REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDZZ ! 1./PDZZ +REAL, DIMENSION(:,:,:), INTENT(IN) :: PMZM_PRHODJ ! MZM(PRHODJ) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX, PDZZ, PDZX + ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density * grid volume +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! ref. state VPT +! +! Variables at t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM,PWM,PTHLM +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t- dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRWS +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDP ! TKE production terms +! +! +! +! +!* 0.2 declaration of local variables +! +REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3)) & + :: ZFLX,ZWORK + ! work arrays +! +INTEGER :: IKB,IKE,IKU + ! Index values for the Beginning and End + ! mass points of the domain +INTEGER :: JSV ! scalar loop counter +! +REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3)) :: GX_W_UW_PWM +! +REAL :: ZTIME1, ZTIME2 +TYPE(TFIELDDATA) :: TZFIELD +! --------------------------------------------------------------------------- +! +!* 1. PRELIMINARY COMPUTATIONS +! ------------------------ +! +IKB = 1+JPVEXT +IKE = SIZE(PWM,3)-JPVEXT +IKU = SIZE(PWM,3) +! +! +GX_W_UW_PWM = GX_W_UW(PWM,PDXX,PDZZ,PDZX) +! +! +!* 13. < U'W'> +! ------- +! +! residual part of < U'W'> depending on dw/dx +! +ZFLX(:,:,:) = & + - XCMFS * MXM(MZM(PK)) * GX_W_UW_PWM +!! & to be tested +!! - (2./3.) * XCMFB * MZM( ZVPTU * MXM( PLM / SQRT(PTKEM) * XG / PTHVREF ) ) +! +ZFLX(:,:,IKE+1) = 0. ! rigid wall condition => no turbulent flux +! +! Nullify the flux at the ground level because it has been fully taken into +! account in turb_ver and extrapolate the flux under the ground +ZFLX(:,:,IKB) = 0. +ZFLX(:,:,IKB-1)=2.*ZFLX(:,:,IKB)- ZFLX(:,:,IKB+1) +! +! stores <U W> +IF ( tpfile%lopened .AND. OTURB_FLX ) THEN + TZFIELD%CMNHNAME = 'UW_HFLX' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'UW_HFLX' + TZFIELD%CUNITS = 'm2 s-2' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_UW_HFLX' + TZFIELD%NGRID = 6 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZFLX) +END IF +! +! +! compute the source for rho*U due to this residual flux ( the other part is +! taken into account in TURB_VER) +PRUS(:,:,:) = PRUS(:,:,:) - DZF( ZFLX* MXM( PMZM_PRHODJ ) / MXM( PDZZ ) ) +! +!computation of the source for rho*W due to this flux +IF (.NOT. LFLAT) THEN + PRWS(:,:,:) = PRWS(:,:,:) & + -DXF( MZM( MXM(PRHODJ) * PINV_PDXX) * ZFLX) & + +DZM( PRHODJ * MXF( MZF( ZFLX*PDZX ) * PINV_PDXX ) / MZF(PDZZ) ) +ELSE + PRWS(:,:,:) = PRWS(:,:,:) -DXF( MZM( MXM(PRHODJ) * PINV_PDXX) * ZFLX) +END IF +! +IF (KSPLT==1) THEN + ! + !Contribution to the dynamic production of TKE: + ! + ZWORK(:,:,:) =-MZF( MXF( & + ZFLX *( GZ_U_UW(PUM,PDZZ) + GX_W_UW_PWM ) ) ) + ! + ! + ! evaluate the dynamic production at w(IKB+1) in PDP(IKB) + ZWORK(:,:,IKB:IKB) = - MXF ( & + ZFLX(:,:,IKB+1:IKB+1) * & + ( (PUM(:,:,IKB+1:IKB+1)-PUM(:,:,IKB:IKB)) / MXM(PDZZ(:,:,IKB+1:IKB+1))& + + ( DXM( PWM(:,:,IKB+1:IKB+1) ) & + -MXM( (PWM(:,:,IKB+2:IKB+2)-PWM(:,:,IKB+1:IKB+1)) & + /(PDZZ(:,:,IKB+2:IKB+2)+PDZZ(:,:,IKB+1:IKB+1)) & + +(PWM(:,:,IKB+1:IKB+1)-PWM(:,:,IKB :IKB )) & + /(PDZZ(:,:,IKB+1:IKB+1)+PDZZ(:,:,IKB :IKB )) & + ) & + * PDZX(:,:,IKB+1:IKB+1) & + ) / (0.5*(PDXX(:,:,IKB+1:IKB+1)+PDXX(:,:,IKB:IKB))) & + ) ) + ! + ! dynamic production computation + PDP(:,:,:) = PDP(:,:,:) + ZWORK(:,:,:) + ! +END IF +! +! Storage in the LES configuration (addition to TURB_VER computation) +! +IF (LLES_CALL .AND. KSPLT==1) THEN + CALL SECOND_MNH(ZTIME1) + CALL LES_MEAN_SUBGRID( MZF(MXF(ZFLX)), X_LES_SUBGRID_WU , .TRUE. ) + CALL LES_MEAN_SUBGRID( MZF(MXF(GZ_U_UW(PUM,PDZZ)*ZFLX)), X_LES_RES_ddxa_U_SBG_UaU , .TRUE.) + CALL LES_MEAN_SUBGRID( MZF(MXF(GX_W_UW_PWM*ZFLX)), X_LES_RES_ddxa_W_SBG_UaW , .TRUE.) + CALL LES_MEAN_SUBGRID( MXF(GX_M_U(1,IKU,1,PTHLM,PDXX,PDZZ,PDZX)*MZF(ZFLX)),& + X_LES_RES_ddxa_Thl_SBG_UaW , .TRUE.) + IF (KRR>=1) THEN + CALL LES_MEAN_SUBGRID( MXF(GX_M_U(1,IKU,1,PRM(:,:,:,1),PDXX,PDZZ,PDZX)*MZF(ZFLX)), & + X_LES_RES_ddxa_Rt_SBG_UaW , .TRUE.) + END IF + DO JSV=1,NSV + CALL LES_MEAN_SUBGRID( MXF(GX_M_U(1,IKU,1,PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX)*MZF(ZFLX)), & + X_LES_RES_ddxa_Sv_SBG_UaW(:,:,:,JSV) , .TRUE.) + END DO + CALL SECOND_MNH(ZTIME2) + XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 +END IF + +! +END SUBROUTINE TURB_HOR_UW diff --git a/src/mesonh/turb/turb_hor_vw.f90 b/src/mesonh/turb/turb_hor_vw.f90 new file mode 100644 index 000000000..df888c2c7 --- /dev/null +++ b/src/mesonh/turb/turb_hor_vw.f90 @@ -0,0 +1,307 @@ +!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ####################### + MODULE MODI_TURB_HOR_VW +! ####################### +! +INTERFACE +! + SUBROUTINE TURB_HOR_VW(KSPLT, & + OTURB_FLX,KRR, & + TPFILE, & + PK,PINV_PDYY,PINV_PDZZ,PMZM_PRHODJ, & + PDYY,PDZZ,PDZY, & + PRHODJ,PTHVREF, & + PVM,PWM,PTHLM,PRM,PSVM, & + PTKEM,PLM, & + PDP, & + PRVS,PRWS ) +! +USE MODD_IO, ONLY: TFILEDATA +! +INTEGER, INTENT(IN) :: KSPLT ! split process index +LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the + ! turbulent fluxes in the syncronous FM-file +INTEGER, INTENT(IN) :: KRR ! number of moist var. +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PK ! Turbulent diffusion doef. + ! PK = PLM * SQRT(PTKEM) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDYY ! 1./PDYY +REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDZZ ! 1./PDZZ +REAL, DIMENSION(:,:,:), INTENT(IN) :: PMZM_PRHODJ ! MZM(PRHODJ) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY, PDZZ, PDZY + ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density * grid volume +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! ref. state VPT +! +! Variables at t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PVM,PWM,PTHLM +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t- dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVS, PRWS ! var. at t+1 -split- +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDP ! TKE production terms +! +END SUBROUTINE TURB_HOR_VW +! +END INTERFACE +! +END MODULE MODI_TURB_HOR_VW +! ################################################################ + SUBROUTINE TURB_HOR_VW(KSPLT, & + OTURB_FLX,KRR, & + TPFILE, & + PK,PINV_PDYY,PINV_PDZZ,PMZM_PRHODJ, & + PDYY,PDZZ,PDZY, & + PRHODJ,PTHVREF, & + PVM,PWM,PTHLM,PRM,PSVM, & + PTKEM,PLM, & + PDP, & + PRVS,PRWS ) +! ################################################################ +! +! +!!**** *TURB_HOR* -routine to compute the source terms in the meso-NH +!! model equations due to the non-vertical turbulent fluxes. +!! +!! PURPOSE +!! ------- +!! +!! see TURB_HOR +!! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! +!! Joan Cuxart * INM and Meteo-France * +!! +!! MODIFICATIONS +!! ------------- +!! Aug , 1997 (V. Saravane) spliting of TURB_HOR +!! Nov 27, 1997 (V. Masson) clearing of the routine +!! Oct 18, 2000 (V. Masson) LES computations + LFLAT switch +!! Feb 14, 2001 (V. Masson and J. Stein) DZF bug on PRWS +!! + remove the use of W=0 at the ground +!! + extrapolataion under the ground +!! Nov 06, 2002 (V. Masson) LES budgets +!! October 2009 (G. Tanguy) add ILENCH=LEN(YCOMMENT) after +!! change of YCOMMENT +!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +!! -------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_CONF +USE MODD_CTURB +use modd_field, only: tfielddata, TYPEREAL +USE MODD_IO, ONLY: TFILEDATA +USE MODD_PARAMETERS +USE MODD_LES +USE MODD_NSV +! +USE MODE_IO_FIELD_WRITE, only: IO_Field_write +! +USE MODI_GRADIENT_M +USE MODI_GRADIENT_U +USE MODI_GRADIENT_V +USE MODI_GRADIENT_W +USE MODI_SHUMAN +USE MODI_COEFJ +USE MODI_LES_MEAN_SUBGRID +! +USE MODI_SECOND_MNH +! +IMPLICIT NONE +! +! +!* 0.1 declaration of arguments +! +! +! +INTEGER, INTENT(IN) :: KSPLT ! split process index +LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the + ! turbulent fluxes in the syncronous FM-file +INTEGER, INTENT(IN) :: KRR ! number of moist var. +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PK ! Turbulent diffusion doef. + ! PK = PLM * SQRT(PTKEM) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDYY ! 1./PDYY +REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDZZ ! 1./PDZZ +REAL, DIMENSION(:,:,:), INTENT(IN) :: PMZM_PRHODJ ! MZM(PRHODJ) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY, PDZZ, PDZY + ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density * grid volume +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! ref. state VPT +! +! Variables at t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PVM,PWM,PTHLM +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t- dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVS, PRWS ! var. at t+1 -split- +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDP ! TKE production terms +! +! +! +!* 0.2 declaration of local variables +! +REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3)) & + :: ZFLX,ZWORK + ! work arrays +! +!! REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3)) :: ZVPTV +INTEGER :: IKB,IKE,IKU + ! Index values for the Beginning and End + ! mass points of the domain +INTEGER :: JSV ! scalar loop counter +! +REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3)) :: GY_W_VW_PWM +! +REAL :: ZTIME1, ZTIME2 +TYPE(TFIELDDATA) :: TZFIELD +! --------------------------------------------------------------------------- +! +!* 1. PRELIMINARY COMPUTATIONS +! ------------------------ +! +IKB = 1+JPVEXT +IKE = SIZE(PWM,3)-JPVEXT +IKU = SIZE(PWM,3) +! +! +IF (.NOT. L2D) GY_W_VW_PWM = GY_W_VW(PWM,PDYY,PDZZ,PDZY) +! +! +!* 14. < V'W'> +! ------- +! +! residual part of < V'W'> depending on dw/dy +! +IF (.NOT. L2D) THEN + ZFLX(:,:,:) = & + - XCMFS * MYM(MZM(PK)) * GY_W_VW_PWM + !! & to be tested + !! - (2./3.) * XCMFB * MZM( ZVPTV * MYM( PLM / SQRT(PTKEM) * XG / PTHVREF ) ) +ELSE + ZFLX(:,:,:) = 0. + !! & to be tested + !! - (2./3.) * XCMFB * MZM( ZVPTV * MYM( PLM / SQRT(PTKEM) * XG / PTHVREF ) ) +END IF +! +ZFLX(:,:,IKE+1) = 0. ! rigid wall condition => no turbulent flux +! +! +! Nullify the flux at the ground level because it has been fully taken into +! account in turb_ver and extrapolate the flux under the ground +ZFLX(:,:,IKB) = 0. +ZFLX(:,:,IKB-1)= 2.*ZFLX(:,:,IKB) - ZFLX(:,:,IKB+1) +! +! stores <V W> +IF ( tpfile%lopened .AND. OTURB_FLX ) THEN + TZFIELD%CMNHNAME = 'VW_HFLX' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'VW_HFLX' + TZFIELD%CUNITS = 'm2 s-2' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_VW_HFLX' + TZFIELD%NGRID = 7 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZFLX) +END IF +! +! compute the source for rho*V due to this residual flux ( the other part is +! taken into account in TURB_VER) +IF (.NOT. L2D) & +PRVS(:,:,:) = PRVS(:,:,:) - DZF( ZFLX* MYM( PMZM_PRHODJ ) / MYM ( PDZZ ) ) +! +!computation of the source for rho*W due to this flux +IF (.NOT. L2D) THEN + IF (.NOT. LFLAT) THEN + PRWS(:,:,:) = PRWS(:,:,:) & + -DYF( MZM( MYM(PRHODJ) * PINV_PDYY) * ZFLX) & + +DZM( PRHODJ * MYF( MZF( ZFLX*PDZY ) * PINV_PDYY ) / MZF(PDZZ) ) + ELSE + PRWS(:,:,:) = PRWS(:,:,:) - DYF( MZM( MYM(PRHODJ) * PINV_PDYY) * ZFLX) + END IF +END IF +! +IF (KSPLT==1) THEN + ! + !Contribution to the dynamic production of TKE: + ! + IF (.NOT. L2D) THEN + ZWORK(:,:,:) =-MZF( MYF( ZFLX *( GZ_V_VW(PVM,PDZZ) + GY_W_VW_PWM ) ) ) + ! + ! + ! evaluate the dynamic production at w(IKB+1) in PDP(IKB) + ZWORK(:,:,IKB:IKB) = - MYF ( & + ZFLX(:,:,IKB+1:IKB+1) * & + ( (PVM(:,:,IKB+1:IKB+1)-PVM(:,:,IKB:IKB)) / MYM(PDZZ(:,:,IKB+1:IKB+1)) & + + ( DYM( PWM(:,:,IKB+1:IKB+1) ) & + -MYM( (PWM(:,:,IKB+2:IKB+2)-PWM(:,:,IKB+1:IKB+1)) & + /(PDZZ(:,:,IKB+2:IKB+2)+PDZZ(:,:,IKB+1:IKB+1)) & + +(PWM(:,:,IKB+1:IKB+1)-PWM(:,:,IKB :IKB )) & + /(PDZZ(:,:,IKB+1:IKB+1)+PDZZ(:,:,IKB :IKB )) & + ) * PDZY(:,:,IKB+1:IKB+1) & + ) / (0.5*(PDYY(:,:,IKB+1:IKB+1)+PDYY(:,:,IKB:IKB))) & + ) ) + ENDIF + ! + ! dynamic production computation + IF (.NOT. L2D) & + PDP(:,:,:) = PDP(:,:,:) + ZWORK(:,:,:) + ! +END IF +! +! Storage in the LES configuration (addition to TURB_VER computation) +! +IF (LLES_CALL .AND. KSPLT==1) THEN + CALL SECOND_MNH(ZTIME1) + CALL LES_MEAN_SUBGRID( MZF(MYF(ZFLX)), X_LES_SUBGRID_WV , .TRUE. ) + CALL LES_MEAN_SUBGRID( MZF(MYF(GZ_V_VW(PVM,PDZZ)*ZFLX)),& + X_LES_RES_ddxa_V_SBG_UaV , .TRUE.) + CALL LES_MEAN_SUBGRID( MZF(MYF(GY_W_VW(PWM,PDYY,PDZZ,PDZY)*ZFLX)),& + X_LES_RES_ddxa_W_SBG_UaW , .TRUE.) + CALL LES_MEAN_SUBGRID( MXF(GY_M_V(1,IKU,1,PTHLM,PDYY,PDZZ,PDZY)*MZF(ZFLX)),& + X_LES_RES_ddxa_Thl_SBG_UaW , .TRUE.) + IF (KRR>=1) THEN + CALL LES_MEAN_SUBGRID( MXF(GY_M_V(1,IKU,1,PRM(:,:,:,1),PDYY,PDZZ,PDZY)*MZF(ZFLX)), & + X_LES_RES_ddxa_Rt_SBG_UaW , .TRUE.) + END IF + DO JSV=1,NSV + CALL LES_MEAN_SUBGRID( MXF(GY_M_V(1,IKU,1,PSVM(:,:,:,JSV),PDYY,PDZZ,PDZY)*MZF(ZFLX)), & + X_LES_RES_ddxa_Sv_SBG_UaW(:,:,:,JSV), .TRUE.) + END DO + CALL SECOND_MNH(ZTIME2) + XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 +END IF +! +! +! +END SUBROUTINE TURB_HOR_VW diff --git a/src/mesonh/turb/turb_ver.f90 b/src/mesonh/turb/turb_ver.f90 new file mode 100644 index 000000000..4117d8191 --- /dev/null +++ b/src/mesonh/turb/turb_ver.f90 @@ -0,0 +1,746 @@ +!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! #################### + MODULE MODI_TURB_VER +! #################### +! +INTERFACE +! + SUBROUTINE TURB_VER(KKA,KKU,KKL,KRR,KRRL,KRRI, & + OTURB_FLX, & + HTURBDIM,HTOM,PIMPL,PEXPL, & + PTSTEP, TPFILE, & + PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ, & + PCOSSLOPE,PSINSLOPE, & + PRHODJ,PTHVREF, & + PSFTHM,PSFRM,PSFSVM,PSFTHP,PSFRP,PSFSVP, & + PCDUEFF,PTAU11M,PTAU12M,PTAU33M, & + PUM,PVM,PWM,PUSLOPEM,PVSLOPEM,PTHLM,PRM,PSVM, & + PTKEM,PLM,PLEPS, & + PLOCPEXNM,PATHETA,PAMOIST,PSRCM,PFRAC_ICE, & + PFWTH,PFWR,PFTH2,PFR2,PFTHR,PBL_DEPTH, & + PSBL_DEPTH,PLMO, & + PRUS,PRVS,PRWS,PRTHLS,PRRS,PRSVS, & + PDP,PTP,PSIGS,PWTH,PWRC,PWSV ) + +! +USE MODD_IO, ONLY: TFILEDATA +! +INTEGER, INTENT(IN) :: KRR ! number of moist var. +INTEGER, INTENT(IN) :: KRRL ! number of liquid water var. +INTEGER, INTENT(IN) :: KRRI ! number of ice water var. +LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the + ! turbulent fluxes in the syncronous FM-file +CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! dimensionality of the + ! turbulence scheme +CHARACTER(len=4), INTENT(IN) :: HTOM ! type of Third Order Moment +REAL, INTENT(IN) :: PIMPL, PEXPL ! Coef. for temporal disc. +REAL, INTENT(IN) :: PTSTEP ! timestep +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX, PDYY, PDZZ, PDZX, PDZY + ! Metric coefficients +REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSZW ! Director Cosinus of the + ! normal to the ground surface +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! altitudes at flux points +REAL, DIMENSION(:,:), INTENT(IN) :: PCOSSLOPE ! cosinus of the angle + ! between i and the slope vector +REAL, DIMENSION(:,:), INTENT(IN) :: PSINSLOPE ! sinus of the angle + ! between i and the slope vector +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry density * grid volum +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! ref. state Virtual + ! Potential Temperature +! +REAL, DIMENSION(:,:), INTENT(IN) :: PSFTHM,PSFRM ! surface fluxes at time +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSFSVM ! t - deltat +! +REAL, DIMENSION(:,:), INTENT(IN) :: PSFTHP,PSFRP ! surface fluxes at time +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSFSVP ! t + deltat +! +REAL, DIMENSION(:,:), INTENT(IN) :: PCDUEFF ! Cd * || u || at time t +REAL, DIMENSION(:,:), INTENT(IN) :: PTAU11M ! <uu> in the axes linked + ! to the maximum slope direction and the surface normal and the binormal + ! at time t - dt +REAL, DIMENSION(:,:), INTENT(IN) :: PTAU12M ! <uv> in the same axes +REAL, DIMENSION(:,:), INTENT(IN) :: PTAU33M ! <ww> in the same axes +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM,PVM,PWM,PTHLM + ! Wind and potential temperature at t-Delta t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Mixing ratios + ! at t-Delta t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! scalar var. at t-Delta t +REAL, DIMENSION(:,:), INTENT(IN) :: PUSLOPEM ! wind component along the + ! maximum slope direction +REAL, DIMENSION(:,:), INTENT(IN) :: PVSLOPEM ! wind component along the + ! direction normal to the maximum slope one +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! dissipative length +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exner at time t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA ! coefficients between +REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! s and Thetal and Rnp +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM ! normalized + ! 2nd-order flux s'r'c/2Sigma_s2 at t-1 multiplied by Lambda_3 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFRAC_ICE ! ri fraction of rc+ri +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFWTH ! d(w'2th' )/dz +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFWR ! d(w'2r' )/dz +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFTH2 ! d(w'th'2 )/dz +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFR2 ! d(w'r'2 )/dz +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFTHR ! d(w'th'r')/dz +REAL, DIMENSION(:,:), INTENT(INOUT):: PBL_DEPTH ! BL depth +REAL, DIMENSION(:,:), INTENT(INOUT):: PSBL_DEPTH ! SBL depth +REAL, DIMENSION(:,:), INTENT(IN) :: PLMO ! Monin-Obukhov length +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS, PRWS, PRTHLS +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS,PRRS + ! cumulated sources for the prognostic variables +! +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDP,PTP ! Dynamic and thermal + ! TKE production terms +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSIGS ! Vert. part of Sigma_s at t +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWTH ! heat flux +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWRC ! cloud water flux +REAL, DIMENSION(:,:,:,:),INTENT(OUT) :: PWSV ! scalar flux + +! +! +END SUBROUTINE TURB_VER +! +END INTERFACE +! +END MODULE MODI_TURB_VER +! +! +! ############################################################### + SUBROUTINE TURB_VER(KKA,KKU,KKL,KRR, KRRL, KRRI, & + OTURB_FLX, & + HTURBDIM,HTOM,PIMPL,PEXPL, & + PTSTEP, TPFILE, & + PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ, & + PCOSSLOPE,PSINSLOPE, & + PRHODJ,PTHVREF, & + PSFTHM,PSFRM,PSFSVM,PSFTHP,PSFRP,PSFSVP, & + PCDUEFF,PTAU11M,PTAU12M,PTAU33M, & + PUM,PVM,PWM,PUSLOPEM,PVSLOPEM,PTHLM,PRM,PSVM, & + PTKEM,PLM,PLEPS, & + PLOCPEXNM,PATHETA,PAMOIST,PSRCM,PFRAC_ICE, & + PFWTH,PFWR,PFTH2,PFR2,PFTHR,PBL_DEPTH, & + PSBL_DEPTH,PLMO, & + PRUS,PRVS,PRWS,PRTHLS,PRRS,PRSVS, & + PDP,PTP,PSIGS,PWTH,PWRC,PWSV ) +! ############################################################### +! +! +!!**** *TURB_VER* -compute the source terms due to the vertical turbulent +!! fluxes. +!! +!! PURPOSE +!! ------- +! The purpose of this routine is to compute the vertical turbulent +! fluxes of the evolutive variables and give back the source +! terms to the main program. In the case of large horizontal meshes, +! the divergence of these vertical turbulent fluxes represent the whole +! effect of the turbulence but when the three-dimensionnal version of +! the turbulence scheme is activated (CTURBDIM="3DIM"), these divergences +! are completed in the next routine TURB_HOR. +! An arbitrary degree of implicitness has been implemented for the +! temporal treatment of these diffusion terms. +! The vertical boundary conditions are as follows: +! * at the bottom, the surface fluxes are prescribed at the same +! as the other turbulent fluxes +! * at the top, the turbulent fluxes are set to 0. +! It should be noted that the condensation has been implicitely included +! in this turbulence scheme by using conservative variables and computing +! the subgrid variance of a statistical variable s indicating the presence +! or not of condensation in a given mesh. +! +!!** METHOD +!! ------ +!! 1D type calculations are made; +!! The vertical turbulent fluxes are computed in an off-centered +!! implicit scheme (a Crank-Nicholson type with coefficients different +!! than 0.5), which allows to vary the degree of implicitness of the +!! formulation. +!! The different prognostic variables are treated one by one. +!! The contributions of each turbulent fluxes are cumulated into the +!! tendency PRvarS, and into the dynamic and thermal production of +!! TKE if necessary. +!! +!! In section 2 and 3, the thermodynamical fields are considered. +!! Only the turbulent fluxes of the conservative variables +!! (Thetal and Rnp stored in PRx(:,:,:,1)) are computed. +!! Note that the turbulent fluxes at the vertical +!! boundaries are given either by the soil scheme for the surface one +!! ( at the same instant as the others fluxes) and equal to 0 at the +!! top of the model. The thermal production is computed by vertically +!! averaging the turbulent flux and multiply this flux at the mass point by +!! a function ETHETA or EMOIST, which preform the transformation from the +!! conservative variables to the virtual potential temperature. +!! +!! In section 4, the variance of the statistical variable +!! s indicating presence or not of condensation, is determined in function +!! of the turbulent moments of the conservative variables and its +!! squarred root is stored in PSIGS. This information will be completed in +!! the horizontal turbulence if the turbulence dimensionality is not +!! equal to "1DIM". +!! +!! In section 5, the x component of the stress tensor is computed. +!! The surface flux <u'w'> is computed from the value of the surface +!! fluxes computed in axes linked to the orography ( i", j" , k"): +!! i" is parallel to the surface and in the direction of the maximum +!! slope +!! j" is also parallel to the surface and in the normal direction of +!! the maximum slope +!! k" is the normal to the surface +!! In order to prevent numerical instability, the implicit scheme has +!! been extended to the surface flux regarding to its dependence in +!! function of U. The dependence in function of the other components +!! introduced by the different rotations is only explicit. +!! The turbulent fluxes are used to compute the dynamic production of +!! TKE. For the last TKE level ( located at PDZZ(:,:,IKB)/2 from the +!! ground), an harmonic extrapolation from the dynamic production at +!! PDZZ(:,:,IKB) is used to avoid an evaluation of the gradient of U +!! in the surface layer. +!! +!! In section 6, the same steps are repeated but for the y direction +!! and in section 7, a diagnostic computation of the W variance is +!! performed. +!! +!! In section 8, the turbulent fluxes for the scalar variables are +!! computed by the same way as the conservative thermodynamical variables +!! +!! +!! EXTERNAL +!! -------- +!! GX_U_M, GY_V_M, GZ_W_M : cartesian gradient operators +!! GX_U_UW,GY_V_VW (X,Y,Z) represent the direction of the gradient +!! _(M,U,...)_ represent the localization of the +!! field to be derivated +!! _(M,UW,...) represent the localization of the +!! field derivated +!! +!! SUBROUTINE TRIDIAG : to compute the split implicit evolution +!! of a variable located at a mass point +!! +!! SUBROUTINE TRIDIAG_WIND: to compute the split implicit evolution +!! of a variable located at a wind point +!! +!! FUNCTIONs ETHETA and EMOIST : +!! allows to compute: +!! - the coefficients for the turbulent correlation between +!! any variable and the virtual potential temperature, of its +!! correlations with the conservative potential temperature and +!! the humidity conservative variable: +!! ------- ------- ------- +!! A' Thv' = ETHETA A' Thl' + EMOIST A' Rnp' +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST : contains physical constants +!! +!! XG : gravity constant +!! +!! Module MODD_CTURB: contains the set of constants for +!! the turbulence scheme +!! +!! XCMFS,XCMFB : cts for the momentum flux +!! XCSHF : ct for the sensible heat flux +!! XCHF : ct for the moisture flux +!! XCTV,XCHV : cts for the T and moisture variances +!! +!! Module MODD_PARAMETERS +!! +!! JPVEXT_TURB : number of vertical external points +!! JPHEXT : number of horizontal external points +!! +!! +!! REFERENCE +!! --------- +!! Book 1 of documentation (Chapter: Turbulence) +!! +!! AUTHOR +!! ------ +!! Joan Cuxart * INM and Meteo-France * +!! +!! MODIFICATIONS +!! ------------- +!! Original August 19, 1994 +!! Modifications: February 14, 1995 (J.Cuxart and J.Stein) +!! Doctorization and Optimization +!! Modifications: March 21, 1995 (J.M. Carriere) +!! Introduction of cloud water +!! Modifications: June 14, 1995 (J.Cuxart and J. Stein) +!! Phi3 and Psi3 at w-point + bug in the all +!! or nothing condens. +!! Modifications: Sept 15, 1995 (J.Cuxart and J. Stein) +!! Change the DP computation at the ground +!! Modifications: October 10, 1995 (J.Cuxart and J. Stein) +!! Psi for scal var and LES tools +!! Modifications: November 10, 1995 (J. Stein) +!! change the surface relations +!! Modifications: February 20, 1995 (J. Stein) optimization +!! Modifications: May 21, 1996 (J. Stein) +!! bug in the vertical flux of the V wind +!! component for explicit computation +!! Modifications: May 21, 1996 (N. wood) +!! modify the computation of the vertical +!! part or the surface tangential flux +!! Modifications: May 21, 1996 (P. Jabouille) +!! same modification in the Y direction +!! +!! Modifications: Sept 17, 1996 (J. Stein) change the moist case by using +!! Pi instead of Piref + use Atheta and Amoist +!! +!! Modifications: Nov 24, 1997 (V. Masson) removes the DO loops +!! Modifications: Mar 31, 1998 (V. Masson) splits the routine TURB_VER +!! Nov 06, 2002 (V. Masson) LES budgets +!! Feb 20, 2003 (JP Pinty) Add PFRAC_ICE +!! July 2005 (S. Tomas, V. Masson) +!! Add 3rd order moments and +!! implicitation of PHI3, PSI3 +!! Oct.2009 (C.Lac) Introduction of different PTSTEP according to the +!! advection schemes +!! Feb. 2012 (Y. Seity) add possibility to run with +!! reversed vertical levels +!! 10/2012 (J.Escobar) Bypass PGI bug , redefine some allocatable array inplace of automatic +!! 08/2014 (J.Escobar) Bypass PGI memory leak bug , replace IF statement with IF THEN ENDIF +!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +!! JL Redelsperger 03/2021 : add Ocean LES case +!!-------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_CTURB +USE MODD_DYN_n, ONLY: LOCEAN +use modd_field, only: tfielddata, TYPEREAL +USE MODD_IO, ONLY: TFILEDATA +USE MODD_PARAMETERS +USE MODD_LES +USE MODD_NSV, ONLY: NSV +! +USE MODI_PRANDTL +USE MODI_EMOIST +USE MODI_ETHETA +USE MODI_GRADIENT_M +USE MODI_GRADIENT_W +USE MODI_TURB +USE MODI_TURB_VER_THERMO_FLUX +USE MODI_TURB_VER_THERMO_CORR +USE MODI_TURB_VER_DYN_FLUX +USE MODI_TURB_VER_SV_FLUX +USE MODI_TURB_VER_SV_CORR +USE MODI_LES_MEAN_SUBGRID +USE MODI_SBL_DEPTH +! +USE MODE_IO_FIELD_WRITE, only: IO_Field_write +USE MODE_PRANDTL +! +USE MODI_SECOND_MNH +! +IMPLICIT NONE +! +!* 0.1 declarations of arguments +! +! +! +INTEGER, INTENT(IN) :: KKA !near ground array index +INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO +INTEGER, INTENT(IN) :: KRR ! number of moist var. +INTEGER, INTENT(IN) :: KRRL ! number of liquid water var. +INTEGER, INTENT(IN) :: KRRI ! number of ice water var. +LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the + ! turbulent fluxes in the syncronous FM-file +CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! dimensionality of the + ! turbulence scheme +CHARACTER(len=4), INTENT(IN) :: HTOM ! type of Third Order Moment +REAL, INTENT(IN) :: PIMPL, PEXPL ! Coef. for temporal disc. +REAL, INTENT(IN) :: PTSTEP ! timestep +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX, PDYY, PDZZ, PDZX, PDZY + ! Metric coefficients +REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSZW ! Director Cosinus of the + ! normal to the ground surface +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! altitudes at flux points +REAL, DIMENSION(:,:), INTENT(IN) :: PCOSSLOPE ! cosinus of the angle + ! between i and the slope vector +REAL, DIMENSION(:,:), INTENT(IN) :: PSINSLOPE ! sinus of the angle + ! between i and the slope vector +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry density * grid volum +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! ref. state Virtual + ! Potential Temperature +! +REAL, DIMENSION(:,:), INTENT(IN) :: PSFTHM,PSFRM ! surface fluxes at time +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSFSVM ! t - deltat +! +REAL, DIMENSION(:,:), INTENT(IN) :: PSFTHP,PSFRP ! surface fluxes at time +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSFSVP ! t + deltat +! +REAL, DIMENSION(:,:), INTENT(IN) :: PCDUEFF ! Cd * || u || at time t +REAL, DIMENSION(:,:), INTENT(IN) :: PTAU11M ! <uu> in the axes linked + ! to the maximum slope direction and the surface normal and the binormal + ! at time t - dt +REAL, DIMENSION(:,:), INTENT(IN) :: PTAU12M ! <uv> in the same axes +REAL, DIMENSION(:,:), INTENT(IN) :: PTAU33M ! <ww> in the same axes +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM,PVM,PWM,PTHLM + ! Wind and potential temperature at t-Delta t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Mixing ratios + ! at t-Delta t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! scalar var. at t-Delta t +REAL, DIMENSION(:,:), INTENT(IN) :: PUSLOPEM ! wind component along the + ! maximum slope direction +REAL, DIMENSION(:,:), INTENT(IN) :: PVSLOPEM ! wind component along the + ! direction normal to the maximum slope one +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! dissipative length +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exnref at time t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA ! coefficients between +REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! s and Thetal and Rnp +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM ! normalized + ! 2nd-order flux s'r'c/2Sigma_s2 at t-1 multiplied by Lambda_3 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFRAC_ICE ! ri fraction of rc+ri +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFWTH ! d(w'2th' )/dz +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFWR ! d(w'2r' )/dz +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFTH2 ! d(w'th'2 )/dz +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFR2 ! d(w'r'2 )/dz +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFTHR ! d(w'th'r')/dz +REAL, DIMENSION(:,:), INTENT(INOUT):: PBL_DEPTH ! BL depth +REAL, DIMENSION(:,:), INTENT(INOUT):: PSBL_DEPTH ! SBL depth +REAL, DIMENSION(:,:), INTENT(IN) :: PLMO ! Monin-Obukhov length +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS, PRWS, PRTHLS +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS,PRRS + ! cumulated sources for the prognostic variables +! +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDP,PTP ! Dynamic and thermal + ! TKE production terms +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSIGS ! Vert. part of Sigma_s at t +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWTH ! heat flux +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWRC ! cloud water flux +REAL, DIMENSION(:,:,:,:),INTENT(OUT) :: PWSV ! scalar flux + +! +! +! +! +!* 0.2 declaration of local variables +! +!JUAN BUG PGI +!!$REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: & +REAL, ALLOCATABLE, DIMENSION(:,:,:) :: & + ZBETA, & ! buoyancy coefficient + ZSQRT_TKE,& ! sqrt(e) + ZDTH_DZ, & ! d(th)/dz + ZDR_DZ, & ! d(rt)/dz + ZRED2TH3, & ! 3D Redeslperger number R*2_th + ZRED2R3, & ! 3D Redeslperger number R*2_r + ZRED2THR3,& ! 3D Redeslperger number R*2_thr + ZBLL_O_E, & ! beta * Lk * Leps / tke + ZETHETA, & ! Coefficient for theta in theta_v computation + ZEMOIST, & ! Coefficient for r in theta_v computation + ZREDTH1, & ! 1D Redelsperger number for Th + ZREDR1, & ! 1D Redelsperger number for r + ZPHI3, & ! phi3 Prandtl number + ZPSI3, & ! psi3 Prandtl number for vapor + ZD, & ! denominator in phi3 terms + ZWTHV, & ! buoyancy flux + ZWU, & ! (u'w') + ZWV, & ! (v'w') + ZTHLP, & ! guess of potential temperature due to vert. turbulent flux + ZRP ! guess of total water due to vert. turbulent flux + +!!$REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3),NSV) :: & +REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: & + ZPSI_SV, & ! Prandtl number for scalars + ZREDS1, & ! 1D Redelsperger number R_sv + ZRED2THS, & ! 3D Redelsperger number R*2_thsv + ZRED2RS ! 3D Redelsperger number R*2_rsv +! +LOGICAL :: GUSERV ! flag to use water vapor +INTEGER :: IKB,IKE ! index value for the Beginning + ! and the End of the physical domain for the mass points +INTEGER :: JSV ! loop counter on scalar variables +REAL :: ZTIME1 +REAL :: ZTIME2 +TYPE(TFIELDDATA) :: TZFIELD +!---------------------------------------------------------------------------- +ALLOCATE ( ZBETA(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& + ZSQRT_TKE(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)),& + ZDTH_DZ(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& + ZDR_DZ(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& + ZRED2TH3(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& + ZRED2R3(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& + ZRED2THR3(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)),& + ZBLL_O_E(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& + ZETHETA(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& + ZEMOIST(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& + ZREDTH1(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& + ZREDR1(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& + ZPHI3(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& + ZPSI3(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& + ZD(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& + ZWTHV(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& + ZWU(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& + ZWV(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& + ZTHLP(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& + ZRP(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ) + +ALLOCATE ( & + ZPSI_SV(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3),NSV), & + ZREDS1(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3),NSV), & + ZRED2THS(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3),NSV), & + ZRED2RS(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3),NSV) ) + +!---------------------------------------------------------------------------- +! +!* 1. PRELIMINARIES +! ------------- +! +IKB=KKA+JPVEXT_TURB*KKL +IKE=KKU-JPVEXT_TURB*KKL +! +! +! 3D Redelsperger numbers +! +! +CALL PRANDTL(KKA,KKU,KKL,KRR,KRRI,OTURB_FLX, & + HTURBDIM, & + TPFILE, & + PDXX,PDYY,PDZZ,PDZX,PDZY, & + PTHVREF,PLOCPEXNM,PATHETA,PAMOIST, & + PLM,PLEPS,PTKEM,PTHLM,PRM,PSVM,PSRCM, & + ZREDTH1, ZREDR1, & + ZRED2TH3, ZRED2R3, ZRED2THR3, & + ZREDS1,ZRED2THS, ZRED2RS, & + ZBLL_O_E, & + ZETHETA, ZEMOIST ) +! +! Buoyancy coefficient +! +IF (LOCEAN) THEN + ZBETA = XG*XALPHAOC +ELSE + ZBETA = XG/PTHVREF +END IF +! +! Square root of Tke +! +ZSQRT_TKE = SQRT(PTKEM) +! +! gradients of mean quantities at previous time-step +! +ZDTH_DZ = GZ_M_W(KKA,KKU,KKL,PTHLM(:,:,:),PDZZ) +ZDR_DZ = 0. +IF (KRR>0) THEN +ZDR_DZ = GZ_M_W(KKA,KKU,KKL,PRM(:,:,:,1),PDZZ) +ENDIF +! +! +! Denominator factor in 3rd order terms +! +ZD(:,:,:) = (1.+ZREDTH1+ZREDR1) * (1.+0.5*(ZREDTH1+ZREDR1)) +! +! Phi3 and Psi3 Prandtl numbers +! +GUSERV = KRR/=0 +! +ZPHI3 = PHI3(ZREDTH1,ZREDR1,ZRED2TH3,ZRED2R3,ZRED2THR3,HTURBDIM,GUSERV) +IF(KRR/=0) THEN +ZPSI3 = PSI3(ZREDR1,ZREDTH1,ZRED2R3,ZRED2TH3,ZRED2THR3,HTURBDIM,GUSERV) +ENDIF +! +! Prandtl numbers for scalars +! +ZPSI_SV = PSI_SV(ZREDTH1,ZREDR1,ZREDS1,ZRED2THS,ZRED2RS,ZPHI3,ZPSI3) +! +! LES diagnostics +! +IF (LLES_CALL) THEN + CALL SECOND_MNH(ZTIME1) + CALL LES_MEAN_SUBGRID(ZPHI3,X_LES_SUBGRID_PHI3) + IF(KRR/=0) THEN + CALL LES_MEAN_SUBGRID(ZPSI3,X_LES_SUBGRID_PSI3) + END IF + CALL SECOND_MNH(ZTIME2) + XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 +END IF +!---------------------------------------------------------------------------- +! +! +!* 2. SOURCES OF CONSERVATIVE POTENTIAL TEMPERATURE AND +! PARTIAL THERMAL PRODUCTION +! --------------------------------------------------------------- +! +!* 3. SOURCES OF CONSERVATIVE AND CLOUD MIXING RATIO AND +! COMPLETE THERMAL PRODUCTION +! ------------------------------------------------------ +! +!* 4. TURBULENT CORRELATIONS : <w Rc>, <THl THl>, <THl Rnp>, <Rnp Rnp> +! ---------------------------------------------------------------- +! +! + CALL TURB_VER_THERMO_FLUX(KKA,KKU,KKL,KRR,KRRL,KRRI, & + OTURB_FLX,HTURBDIM,HTOM, & + PIMPL,PEXPL,PTSTEP, & + TPFILE, & + PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ, & + PRHODJ,PTHVREF, & + PSFTHM,PSFRM,PSFTHP,PSFRP, & + PWM,PTHLM,PRM,PSVM, & + PTKEM,PLM,PLEPS, & + PLOCPEXNM,PATHETA,PAMOIST,PSRCM,PFRAC_ICE, & + ZBETA, ZSQRT_TKE, ZDTH_DZ, ZDR_DZ, ZRED2TH3, & + ZRED2R3, ZRED2THR3, ZBLL_O_E, ZETHETA, & + ZEMOIST, ZREDTH1, ZREDR1, ZPHI3, ZPSI3, ZD, & + PFWTH,PFWR,PFTH2,PFR2,PFTHR,PBL_DEPTH,ZWTHV, & + PRTHLS,PRRS,ZTHLP,ZRP,PTP,PWTH,PWRC ) +! + CALL TURB_VER_THERMO_CORR(KKA,KKU,KKL,KRR,KRRL,KRRI, & + OTURB_FLX,HTURBDIM,HTOM, & + PIMPL,PEXPL, & + TPFILE, & + PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW, & + PRHODJ,PTHVREF, & + PSFTHM,PSFRM,PSFTHP,PSFRP, & + PWM,PTHLM,PRM,PSVM, & + PTKEM,PLM,PLEPS, & + PLOCPEXNM,PATHETA,PAMOIST,PSRCM, & + ZBETA, ZSQRT_TKE, ZDTH_DZ, ZDR_DZ, ZRED2TH3, & + ZRED2R3, ZRED2THR3, ZBLL_O_E, ZETHETA, & + ZEMOIST, ZREDTH1, ZREDR1, ZPHI3, ZPSI3, ZD, & + PFWTH,PFWR,PFTH2,PFR2,PFTHR, & + ZTHLP,ZRP,PSIGS ) +! +!---------------------------------------------------------------------------- +! +! +! +!* 5. SOURCES OF U,W WIND COMPONENTS AND PARTIAL DYNAMIC PRODUCTION +! ------------------------------------------------------------- +! +!* 6. SOURCES OF V,W WIND COMPONENTS AND COMPLETE 1D DYNAMIC PRODUCTION +! ----------------------------------------------------------------- +! +!* 7. DIAGNOSTIC COMPUTATION OF THE 1D <W W> VARIANCE +! ----------------------------------------------- +! +CALL TURB_VER_DYN_FLUX(KKA,KKU,KKL, & + OTURB_FLX,KRR, & + HTURBDIM,PIMPL,PEXPL,PTSTEP, & + TPFILE, & + PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ, & + PCOSSLOPE,PSINSLOPE, & + PRHODJ, & + PCDUEFF,PTAU11M,PTAU12M,PTAU33M, & + PTHLM,PRM,PSVM,PUM,PVM,PWM,PUSLOPEM,PVSLOPEM, & + PTKEM,PLM,ZWU,ZWV, & + PRUS,PRVS,PRWS, & + PDP,PTP ) +! +!---------------------------------------------------------------------------- +! +! +!* 8. SOURCES OF PASSIVE SCALAR VARIABLES +! ----------------------------------- +! +IF (SIZE(PSVM,4)>0) & +CALL TURB_VER_SV_FLUX(KKA,KKU,KKL, & + OTURB_FLX,HTURBDIM, & + PIMPL,PEXPL,PTSTEP, & + TPFILE, & + PDZZ,PDIRCOSZW, & + PRHODJ,PWM, & + PSFSVM,PSFSVP, & + PSVM, & + PTKEM,PLM,ZPSI_SV, & + PRSVS,PWSV ) +! +! +IF (SIZE(PSVM,4)>0 .AND. LLES_CALL) & +CALL TURB_VER_SV_CORR(KKA,KKU,KKL,KRR,KRRL,KRRI, & + PDZZ, & + PTHLM,PRM,PTHVREF, & + PLOCPEXNM,PATHETA,PAMOIST,PSRCM,ZPHI3,ZPSI3, & + PWM,PSVM, & + PTKEM,PLM,PLEPS,ZPSI_SV ) +! +! +!---------------------------------------------------------------------------- +! +!* 9. DIAGNOSTIC OF Surface Boundary Layer Depth +! ------------------------------------------ +! +IF (SIZE(PSBL_DEPTH)>0) CALL SBL_DEPTH(IKB,IKE,PZZ,ZWU,ZWV,ZWTHV,PLMO,PSBL_DEPTH) +! +!---------------------------------------------------------------------------- +! +! +!* 10. PRINTS +! ------ +! +! +IF ( OTURB_FLX .AND. tpfile%lopened ) THEN +! +! stores the Turbulent Prandtl number +! + TZFIELD%CMNHNAME = 'PHI3' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'PHI3' + TZFIELD%CUNITS = '1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'Turbulent Prandtl number' + TZFIELD%NGRID = 4 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZPHI3) +! +! stores the Turbulent Schmidt number +! + TZFIELD%CMNHNAME = 'PSI3' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'PSI3' + TZFIELD%CUNITS = '1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'Turbulent Schmidt number' + TZFIELD%NGRID = 4 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZPSI3) +! +! +! stores the Turbulent Schmidt number for the scalar variables +! + TZFIELD%CSTDNAME = '' + TZFIELD%CUNITS = '1' + TZFIELD%CDIR = 'XY' + TZFIELD%NGRID = 4 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + DO JSV=1,NSV + WRITE(TZFIELD%CMNHNAME, '("PSI_SV_",I3.3)') JSV + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) + CALL IO_Field_write(TPFILE,TZFIELD,ZPSI_SV(:,:,:,JSV)) + END DO +! +END IF +! +! +!---------------------------------------------------------------------------- +END SUBROUTINE TURB_VER diff --git a/src/mesonh/turb/turb_ver_dyn_flux.f90 b/src/mesonh/turb/turb_ver_dyn_flux.f90 new file mode 100644 index 000000000..51bc4e7e1 --- /dev/null +++ b/src/mesonh/turb/turb_ver_dyn_flux.f90 @@ -0,0 +1,924 @@ +!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! #################### + MODULE MODI_TURB_VER_DYN_FLUX +! #################### +! +INTERFACE +! + SUBROUTINE TURB_VER_DYN_FLUX(KKA,KKU,KKL, & + OTURB_FLX,KRR, & + HTURBDIM,PIMPL,PEXPL, & + PTSTEP, & + TPFILE, & + PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ, & + PCOSSLOPE,PSINSLOPE, & + PRHODJ, & + PCDUEFF,PTAU11M,PTAU12M,PTAU33M, & + PTHLM,PRM,PSVM,PUM,PVM,PWM,PUSLOPEM,PVSLOPEM, & + PTKEM,PLM,PWU,PWV, & + PRUS,PRVS,PRWS, & + PDP,PTP ) +! +USE MODD_IO, ONLY: TFILEDATA +! +INTEGER, INTENT(IN) :: KKA !near ground array index +INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=AR +LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the + ! turbulent fluxes in the syncronous FM-file +INTEGER, INTENT(IN) :: KRR ! number of moist var. +CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! dimensionality of the + ! turbulence scheme +REAL, INTENT(IN) :: PIMPL, PEXPL ! Coef. for temporal disc. +REAL, INTENT(IN) :: PTSTEP ! Double Time Step +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX, PDYY, PDZZ, PDZX, PDZY + ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! altitude of flux points +REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSZW ! Director Cosinus of the + ! normal to the ground surface +REAL, DIMENSION(:,:), INTENT(IN) :: PCOSSLOPE ! cosinus of the angle + ! between i and the slope vector +REAL, DIMENSION(:,:), INTENT(IN) :: PSINSLOPE ! sinus of the angle + ! between i and the slope vector +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry density * grid volum +! +REAL, DIMENSION(:,:), INTENT(IN) :: PCDUEFF ! Cd * || u || at time t +REAL, DIMENSION(:,:), INTENT(IN) :: PTAU11M ! <uu> in the axes linked + ! to the maximum slope direction and the surface normal and the binormal + ! at time t - dt +REAL, DIMENSION(:,:), INTENT(IN) :: PTAU12M ! <uv> in the same axes +REAL, DIMENSION(:,:), INTENT(IN) :: PTAU33M ! <ww> in the same axes +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM,PVM,PWM,PTHLM + ! Wind at t-Delta t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM +REAL, DIMENSION(:,:), INTENT(IN) :: PUSLOPEM ! wind component along the + ! maximum slope direction +REAL, DIMENSION(:,:), INTENT(IN) :: PVSLOPEM ! wind component along the + ! direction normal to the maximum slope one +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWU ! momentum flux u'w' +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWV ! momentum flux v'w' +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS, PRWS + ! cumulated sources for the prognostic variables +! +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDP ! Dynamic TKE production term +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTP ! Thermal TKE production term +! +! +! +END SUBROUTINE TURB_VER_DYN_FLUX +! +END INTERFACE +! +END MODULE MODI_TURB_VER_DYN_FLUX +! +! +! ############################################################### + SUBROUTINE TURB_VER_DYN_FLUX(KKA,KKU,KKL, & + OTURB_FLX,KRR, & + HTURBDIM,PIMPL,PEXPL, & + PTSTEP, & + TPFILE, & + PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ, & + PCOSSLOPE,PSINSLOPE, & + PRHODJ, & + PCDUEFF,PTAU11M,PTAU12M,PTAU33M, & + PTHLM,PRM,PSVM,PUM,PVM,PWM,PUSLOPEM,PVSLOPEM, & + PTKEM,PLM,PWU,PWV, & + PRUS,PRVS,PRWS, & + PDP,PTP ) +! ############################################################### +! +! +!!**** *TURB_VER_DYN_FLUX* -compute the source terms due to the vertical turbulent +!! fluxes. +!! +!! PURPOSE +!! ------- +! The purpose of this routine is to compute the vertical turbulent +! fluxes of the evolutive variables and give back the source +! terms to the main program. In the case of large horizontal meshes, +! the divergence of these vertical turbulent fluxes represent the whole +! effect of the turbulence but when the three-dimensionnal version of +! the turbulence scheme is activated (CTURBDIM="3DIM"), these divergences +! are completed in the next routine TURB_HOR. +! An arbitrary degree of implicitness has been implemented for the +! temporal treatment of these diffusion terms. +! The vertical boundary conditions are as follows: +! * at the bottom, the surface fluxes are prescribed at the same +! as the other turbulent fluxes +! * at the top, the turbulent fluxes are set to 0. +! It should be noted that the condensation has been implicitely included +! in this turbulence scheme by using conservative variables and computing +! the subgrid variance of a statistical variable s indicating the presence +! or not of condensation in a given mesh. +! +!!** METHOD +!! ------ +!! 1D type calculations are made; +!! The vertical turbulent fluxes are computed in an off-centered +!! implicit scheme (a Crank-Nicholson type with coefficients different +!! than 0.5), which allows to vary the degree of implicitness of the +!! formulation. +!! The different prognostic variables are treated one by one. +!! The contributions of each turbulent fluxes are cumulated into the +!! tendency PRvarS, and into the dynamic and thermal production of +!! TKE if necessary. +!! +!! In section 2 and 3, the thermodynamical fields are considered. +!! Only the turbulent fluxes of the conservative variables +!! (Thetal and Rnp stored in PRx(:,:,:,1)) are computed. +!! Note that the turbulent fluxes at the vertical +!! boundaries are given either by the soil scheme for the surface one +!! ( at the same instant as the others fluxes) and equal to 0 at the +!! top of the model. The thermal production is computed by vertically +!! averaging the turbulent flux and multiply this flux at the mass point by +!! a function ETHETA or EMOIST, which preform the transformation from the +!! conservative variables to the virtual potential temperature. +!! +!! In section 4, the variance of the statistical variable +!! s indicating presence or not of condensation, is determined in function +!! of the turbulent moments of the conservative variables and its +!! squarred root is stored in PSIGS. This information will be completed in +!! the horizontal turbulence if the turbulence dimensionality is not +!! equal to "1DIM". +!! +!! In section 5, the x component of the stress tensor is computed. +!! The surface flux <u'w'> is computed from the value of the surface +!! fluxes computed in axes linked to the orography ( i", j" , k"): +!! i" is parallel to the surface and in the direction of the maximum +!! slope +!! j" is also parallel to the surface and in the normal direction of +!! the maximum slope +!! k" is the normal to the surface +!! In order to prevent numerical instability, the implicit scheme has +!! been extended to the surface flux regarding to its dependence in +!! function of U. The dependence in function of the other components +!! introduced by the different rotations is only explicit. +!! The turbulent fluxes are used to compute the dynamic production of +!! TKE. For the last TKE level ( located at PDZZ(:,:,IKB)/2 from the +!! ground), an harmonic extrapolation from the dynamic production at +!! PDZZ(:,:,IKB) is used to avoid an evaluation of the gradient of U +!! in the surface layer. +!! +!! In section 6, the same steps are repeated but for the y direction +!! and in section 7, a diagnostic computation of the W variance is +!! performed. +!! +!! In section 8, the turbulent fluxes for the scalar variables are +!! computed by the same way as the conservative thermodynamical variables +!! +!! +!! EXTERNAL +!! -------- +!! GX_U_M, GY_V_M, GZ_W_M : cartesian gradient operators +!! GX_U_UW,GY_V_VW (X,Y,Z) represent the direction of the gradient +!! _(M,U,...)_ represent the localization of the +!! field to be derivated +!! _(M,UW,...) represent the localization of the +!! field derivated +!! +!! +!! MXM,MXF,MYM,MYF,MZM,MZF +!! : Shuman functions (mean operators) +!! DXF,DYF,DZF,DZM +!! : Shuman functions (difference operators) +!! +!! SUBROUTINE TRIDIAG : to compute the split implicit evolution +!! of a variable located at a mass point +!! +!! SUBROUTINE TRIDIAG_WIND: to compute the split implicit evolution +!! of a variable located at a wind point +!! +!! FUNCTIONs ETHETA and EMOIST : +!! allows to compute: +!! - the coefficients for the turbulent correlation between +!! any variable and the virtual potential temperature, of its +!! correlations with the conservative potential temperature and +!! the humidity conservative variable: +!! ------- ------- ------- +!! A' Thv' = ETHETA A' Thl' + EMOIST A' Rnp' +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST : contains physical constants +!! +!! XG : gravity constant +!! +!! Module MODD_CTURB: contains the set of constants for +!! the turbulence scheme +!! +!! XCMFS,XCMFB : cts for the momentum flux +!! XCSHF : ct for the sensible heat flux +!! XCHF : ct for the moisture flux +!! XCTV,XCHV : cts for the T and moisture variances +!! +!! Module MODD_PARAMETERS +!! +!! JPVEXT_TURB : number of vertical external points +!! JPHEXT : number of horizontal external points +!! +!! +!! REFERENCE +!! --------- +!! Book 1 of documentation (Chapter: Turbulence) +!! +!! AUTHOR +!! ------ +!! Joan Cuxart * INM and Meteo-France * +!! +!! MODIFICATIONS +!! ------------- +!! Original August 19, 1994 +!! Modifications: February 14, 1995 (J.Cuxart and J.Stein) +!! Doctorization and Optimization +!! Modifications: March 21, 1995 (J.M. Carriere) +!! Introduction of cloud water +!! Modifications: June 14, 1995 (J.Cuxart and J. Stein) +!! Phi3 and Psi3 at w-point + bug in the all +!! or nothing condens. +!! Modifications: Sept 15, 1995 (J.Cuxart and J. Stein) +!! Change the DP computation at the ground +!! Modifications: October 10, 1995 (J.Cuxart and J. Stein) +!! Psi for scal var and LES tools +!! Modifications: November 10, 1995 (J. Stein) +!! change the surface relations +!! Modifications: February 20, 1995 (J. Stein) optimization +!! Modifications: May 21, 1996 (J. Stein) +!! bug in the vertical flux of the V wind +!! component for explicit computation +!! Modifications: May 21, 1996 (N. wood) +!! modify the computation of the vertical +!! part or the surface tangential flux +!! Modifications: May 21, 1996 (P. Jabouille) +!! same modification in the Y direction +!! +!! Modifications: Sept 17, 1996 (J. Stein) change the moist case by using +!! Pi instead of Piref + use Atheta and Amoist +!! +!! Modifications: Nov 24, 1997 (V. Masson) removes the DO loops +!! Modifications: Mar 31, 1998 (V. Masson) splits the routine TURB_VER_DYN_FLUX +!! Modifications: Oct 18, 2000 (J. Stein) Bug in some computations for IKB level +!! Modifications: Oct 18, 2000 (V. Masson) LES computations + LFLAT switch +!! Nov 06, 2002 (V. Masson) LES budgets +!! October 2009 (G. Tanguy) add ILENCH=LEN(YCOMMENT) after +!! change of YCOMMENT +!! 2012-02 Y. Seity, add possibility to run with reversed vertical levels +!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 +!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +!! Q. Rodier 17/01/2019 : cleaning : remove cyclic conditions on DP and ZA +!! JL Redelsperger 03/2021 : Add Ocean & O-A Autocoupling LES Cases +!!-------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CONF +USE MODD_CST +USE MODD_CTURB +USE MODD_DYN_n, ONLY: LOCEAN +use modd_field, only: tfielddata, TYPEREAL +USE MODD_IO, ONLY: TFILEDATA +USE MODD_LES +USE MODD_NSV +USE MODD_OCEANH +USE MODD_PARAMETERS +USE MODD_REF, ONLY : LCOUPLES +USE MODD_TURB_n +! +! +USE MODI_GRADIENT_U +USE MODI_GRADIENT_V +USE MODI_GRADIENT_W +USE MODI_GRADIENT_M +USE MODI_SECOND_MNH +USE MODI_SHUMAN +USE MODI_TRIDIAG +USE MODI_TRIDIAG_WIND +USE MODI_LES_MEAN_SUBGRID +! +USE MODE_IO_FIELD_WRITE, only: IO_Field_write +USE MODE_ll +! +IMPLICIT NONE +! +!* 0.1 declarations of arguments +! +! +! +INTEGER, INTENT(IN) :: KKA !near ground array index +INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO +LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the + ! turbulent fluxes in the syncronous FM-file +INTEGER, INTENT(IN) :: KRR ! number of moist var. +CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! dimensionality of the + ! turbulence scheme +REAL, INTENT(IN) :: PIMPL, PEXPL ! Coef. for temporal disc. +REAL, INTENT(IN) :: PTSTEP ! Double Time Step +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX, PDYY, PDZZ, PDZX, PDZY + ! Metric coefficients +REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSZW ! Director Cosinus of the + ! normal to the ground surface +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! altitude of flux points +REAL, DIMENSION(:,:), INTENT(IN) :: PCOSSLOPE ! cosinus of the angle + ! between i and the slope vector +REAL, DIMENSION(:,:), INTENT(IN) :: PSINSLOPE ! sinus of the angle + ! between i and the slope vector +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry density * grid volum +! +REAL, DIMENSION(:,:), INTENT(IN) :: PCDUEFF ! Cd * || u || at time t +REAL, DIMENSION(:,:), INTENT(IN) :: PTAU11M ! <uu> in the axes linked + ! to the maximum slope direction and the surface normal and the binormal + ! at time t - dt +REAL, DIMENSION(:,:), INTENT(IN) :: PTAU12M ! <uv> in the same axes +REAL, DIMENSION(:,:), INTENT(IN) :: PTAU33M ! <ww> in the same axes +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM,PVM,PWM, PTHLM + ! Wind at t-Delta t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM +REAL, DIMENSION(:,:), INTENT(IN) :: PUSLOPEM ! wind component along the + ! maximum slope direction +REAL, DIMENSION(:,:), INTENT(IN) :: PVSLOPEM ! wind component along the + ! direction normal to the maximum slope one +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWU ! momentum flux u'w' +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWV ! momentum flux v'w' +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS, PRWS + ! cumulated sources for the prognostic variables +! +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDP ! Dynamic TKE production term +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTP ! Thermal TKE production term +! +! +! +! +!* 0.2 declaration of local variables +! +! +REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2)) :: ZDIRSINZW ! sinus of the angle + ! between the normal and the vertical at the surface +REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2),1):: ZCOEFS ! coeff. for the + ! implicit scheme for the wind at the surface +REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2),SIZE(PUM,3)) :: & + ZA, & ! under diagonal elements of the tri-diagonal matrix involved + ! in the temporal implicit scheme (also used to store coefficient + ! J in Section 5) + ZRES, & ! guess of the treated variable at t+ deltat when the turbu- + ! lence is the only source of evolution added to the ones + ! considered in ZSOURCE + ZFLXZ, & ! vertical flux of the treated variable + ZSOURCE, & ! source of evolution for the treated variable + ZKEFF ! effectif diffusion coeff = LT * SQRT( TKE ) +INTEGER :: IIB,IIE, & ! I index values for the Beginning and End + IJB,IJE, & ! mass points of the domain in the 3 direct. + IKB,IKE ! +INTEGER :: IKT ! array size in k direction +INTEGER :: IKTB,IKTE ! start, end of k loops in physical domain +INTEGER :: JSV ! scalar loop counter +REAL, DIMENSION(SIZE(PDZZ,1),SIZE(PDZZ,2),1) :: ZCOEFFLXU, & + ZCOEFFLXV, ZUSLOPEM, ZVSLOPEM + ! coefficients for the surface flux + ! evaluation and copy of PUSLOPEM and + ! PVSLOPEM in local 3D arrays +INTEGER :: IIU,IJU ! size of array in x,y,z directions +! +REAL :: ZTIME1, ZTIME2 +TYPE(TFIELDDATA) :: TZFIELD +!---------------------------------------------------------------------------- +! +!* 1. PRELIMINARIES +! ------------- +ZA=XUNDEF +PDP=XUNDEF +! +IIU=SIZE(PUM,1) +IJU=SIZE(PUM,2) +CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) +IKB=KKA+JPVEXT_TURB*KKL +IKE=KKU-JPVEXT_TURB*KKL +IKT=SIZE(PUM,3) +IKTB=1+JPVEXT_TURB +IKTE=IKT-JPVEXT_TURB + + +! +ZSOURCE(:,:,:) = 0. +! +ZDIRSINZW(:,:) = SQRT(1.-PDIRCOSZW(:,:)**2) +! compute the coefficients for the uncentred gradient computation near the +! ground +! +ZKEFF(:,:,:) = MZM( PLM(:,:,:) * SQRT(PTKEM(:,:,:)) ) +! +ZUSLOPEM(:,:,1)=PUSLOPEM(:,:) +ZVSLOPEM(:,:,1)=PVSLOPEM(:,:) +! +!---------------------------------------------------------------------------- +! +! +!* 5. SOURCES OF U,W WIND COMPONENTS AND PARTIAL DYNAMIC PRODUCTION +! ------------------------------------------------------------- +! +!* 5.1 Source of U wind component +! +! Preparation of the arguments for TRIDIAG_WIND +! +ZA(:,:,:) = -PTSTEP * XCMFS * & + MXM( ZKEFF ) * MXM(MZM( PRHODJ )) / & + MXM( PDZZ )**2 +! +! +! Compute the source of U wind component +! +! compute the coefficient between the vertical flux and the 2 components of the +! wind following the slope +ZCOEFFLXU(:,:,1) = PCDUEFF(:,:) * (PDIRCOSZW(:,:)**2 - ZDIRSINZW(:,:)**2) & + * PCOSSLOPE(:,:) +ZCOEFFLXV(:,:,1) = PCDUEFF(:,:) * PDIRCOSZW(:,:) * PSINSLOPE(:,:) + +! prepare the implicit scheme coefficients for the surface flux +ZCOEFS(:,:,1)= ZCOEFFLXU(:,:,1) * PCOSSLOPE(:,:) * PDIRCOSZW(:,:) & + +ZCOEFFLXV(:,:,1) * PSINSLOPE(:,:) +! +! average this flux to be located at the U,W vorticity point +ZCOEFS(:,:,1:1)=MXM(ZCOEFS(:,:,1:1) / PDZZ(:,:,IKB:IKB) ) +! +! +! ZSOURCE= FLUX /DZ +IF (LOCEAN) THEN ! OCEAN MODEL ONLY + ! Sfx flux assumed to be in SI & at vorticity point + IF (LCOUPLES) THEN + ZSOURCE(:,:,IKE:IKE) = XSSUFL_C(:,:,1:1)/PDZZ(:,:,IKE:IKE) & + *0.5 * ( 1. + MXM(PRHODJ(:,:,KKU:KKU)) / MXM(PRHODJ(:,:,IKE:IKE))) + ELSE + ZSOURCE(:,:,IKE) = XSSUFL(:,:) + ZSOURCE(:,:,IKE:IKE) = ZSOURCE (:,:,IKE:IKE) /PDZZ(:,:,IKE:IKE) & + *0.5 * ( 1. + MXM(PRHODJ(:,:,KKU:KKU)) / MXM(PRHODJ(:,:,IKE:IKE)) ) + ENDIF + !No flux at the ocean domain bottom + ZSOURCE(:,:,IKB) = 0. + ZSOURCE(:,:,IKTB+1:IKTE-1) = 0 +! +ELSE !ATMOS MODEL ONLY + IF (LCOUPLES) THEN + ZSOURCE(:,:,IKB:IKB) = XSSUFL_C(:,:,1:1)/PDZZ(:,:,IKB:IKB) & + * 0.5 * ( 1. + MXM(PRHODJ(:,:,KKA:KKA)) / MXM(PRHODJ(:,:,IKB:IKB)) ) + ELSE + ! compute the explicit tangential flux at the W point + ZSOURCE(:,:,IKB) = & + PTAU11M(:,:) * PCOSSLOPE(:,:) * PDIRCOSZW(:,:) * ZDIRSINZW(:,:) & + -PTAU12M(:,:) * PSINSLOPE(:,:) * ZDIRSINZW(:,:) & + -PTAU33M(:,:) * PCOSSLOPE(:,:) * ZDIRSINZW(:,:) * PDIRCOSZW(:,:) +! + ! add the vertical part or the surface flux at the U,W vorticity point +! + ZSOURCE(:,:,IKB:IKB) = & + ( MXM( ZSOURCE(:,:,IKB:IKB) / PDZZ(:,:,IKB:IKB) ) & + + MXM( ZCOEFFLXU(:,:,1:1) / PDZZ(:,:,IKB:IKB) & + *ZUSLOPEM(:,:,1:1) & + -ZCOEFFLXV(:,:,1:1) / PDZZ(:,:,IKB:IKB) & + *ZVSLOPEM(:,:,1:1) ) & + - ZCOEFS(:,:,1:1) * PUM(:,:,IKB:IKB) * PIMPL & + ) * 0.5 * ( 1. + MXM(PRHODJ(:,:,KKA:KKA)) / MXM(PRHODJ(:,:,IKB:IKB)) ) + ENDIF +! + ZSOURCE(:,:,IKTB+1:IKTE-1) = 0. + ZSOURCE(:,:,IKE) = 0. +ENDIF !end ocean or atmosphere cases +! +! Obtention of the split U at t+ deltat +! +CALL TRIDIAG_WIND(KKA,KKU,KKL,PUM,ZA,ZCOEFS(:,:,1),PTSTEP,PEXPL,PIMPL, & + MXM(PRHODJ),ZSOURCE,ZRES) +! +! Compute the equivalent tendency for the U wind component +! +PRUS(:,:,:)=PRUS(:,:,:)+MXM(PRHODJ(:,:,:))*(ZRES(:,:,:)-PUM(:,:,:))/PTSTEP +! +! +!* 5.2 Partial Dynamic Production +! +! vertical flux of the U wind component +! +ZFLXZ(:,:,:) = -XCMFS * MXM(ZKEFF) * & + DZM (PIMPL*ZRES + PEXPL*PUM) / MXM(PDZZ) +! +! surface flux +ZFLXZ(:,:,IKB:IKB) = MXM(PDZZ(:,:,IKB:IKB)) * & + ( ZSOURCE(:,:,IKB:IKB) & + +ZCOEFS(:,:,1:1) * ZRES(:,:,IKB:IKB) * PIMPL & + ) / 0.5 / ( 1. + MXM(PRHODJ(:,:,KKA:KKA)) / MXM(PRHODJ(:,:,IKB:IKB)) ) +! +ZFLXZ(:,:,KKA) = ZFLXZ(:,:,IKB) + +IF (LOCEAN) THEN !ocean model at phys sfc (ocean domain top) + ZFLXZ(:,:,IKE:IKE) = MXM(PDZZ(:,:,IKE:IKE)) * & + ZSOURCE(:,:,IKE:IKE) & + / 0.5 / ( 1. + MXM(PRHODJ(:,:,KKU:KKU)) / MXM(PRHODJ(:,:,IKE:IKE)) ) + ZFLXZ(:,:,KKU) = ZFLXZ(:,:,IKE) +END IF +! +IF ( OTURB_FLX .AND. tpfile%lopened ) THEN + ! stores the U wind component vertical flux + TZFIELD%CMNHNAME = 'UW_VFLX' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'UW_VFLX' + TZFIELD%CUNITS = 'm2 s-2' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'U wind component vertical flux' + TZFIELD%NGRID = 4 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZFLXZ) +END IF +! +! first part of total momentum flux +! +PWU(:,:,:) = ZFLXZ(:,:,:) +! +! Contribution to the dynamic production of TKE +! compute the dynamic production at the mass point +! +PDP(:,:,:) = - MZF( MXF ( ZFLXZ * GZ_U_UW(PUM,PDZZ) ) ) +! +! evaluate the dynamic production at w(IKB+KKL) in PDP(IKB) +PDP(:,:,IKB:IKB) = - MXF ( & + ZFLXZ(:,:,IKB+KKL:IKB+KKL) * (PUM(:,:,IKB+KKL:IKB+KKL)-PUM(:,:,IKB:IKB)) & + / MXM(PDZZ(:,:,IKB+KKL:IKB+KKL)) & + ) +! +IF (LOCEAN) THEN + ! evaluate the dynamic production at w(IKE-KKL) in PDP(IKE) + PDP(:,:,IKE:IKE) = - MXF ( & + ZFLXZ(:,:,IKE-KKL:IKE-KKL) * (PUM(:,:,IKE:IKE)-PUM(:,:,IKE-KKL:IKE-KKL)) & + / MXM(PDZZ(:,:,IKE-KKL:IKE-KKL)) & + ) +END IF +! +! Storage in the LES configuration +! +IF (LLES_CALL) THEN + CALL SECOND_MNH(ZTIME1) + CALL LES_MEAN_SUBGRID( MZF(MXF(ZFLXZ)), X_LES_SUBGRID_WU ) + CALL LES_MEAN_SUBGRID( MZF(MXF(GZ_U_UW(PUM,PDZZ) & + & *ZFLXZ)), X_LES_RES_ddxa_U_SBG_UaU ) + CALL LES_MEAN_SUBGRID( XCMFS * ZKEFF, X_LES_SUBGRID_Km ) + CALL SECOND_MNH(ZTIME2) + XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 +END IF +! +!* 5.3 Source of W wind component +! +! +IF(HTURBDIM=='3DIM') THEN + ! Compute the source for the W wind component + ! used to compute the W source at the ground + ZFLXZ(:,:,KKA) = 2 * ZFLXZ(:,:,IKB) - ZFLXZ(:,:,IKB+KKL) ! extrapolation + IF (LOCEAN) THEN + ZFLXZ(:,:,KKU) = 2 * ZFLXZ(:,:,IKE) - ZFLXZ(:,:,IKE-KKL) ! extrapolation + END IF + + ! + IF (.NOT. LFLAT) THEN + PRWS(:,:,:)= PRWS & + -DXF( MZM( MXM(PRHODJ) /PDXX ) * ZFLXZ ) & + +DZM( PRHODJ / MZF(PDZZ ) * & + MXF( MZF( ZFLXZ*PDZX ) / PDXX ) & + ) + ELSE + PRWS(:,:,:)= PRWS -DXF( MZM( MXM(PRHODJ) /PDXX ) * ZFLXZ ) + END IF + ! + ! Complete the Dynamical production with the W wind component + ! + ZA(:,:,:)=-MZF( MXF ( ZFLXZ * GX_W_UW( PWM,PDXX,PDZZ,PDZX) ) ) + ! + ! + ! evaluate the dynamic production at w(IKB+KKL) in PDP(IKB) + ZA(:,:,IKB:IKB) = - MXF ( & + ZFLXZ(:,:,IKB+KKL:IKB+KKL) * & + ( DXM( PWM(:,:,IKB+KKL:IKB+KKL) ) & + -MXM( (PWM(:,:,IKB+2*KKL:IKB+2*KKL )-PWM(:,:,IKB+KKL:IKB+KKL)) & + /(PDZZ(:,:,IKB+2*KKL:IKB+2*KKL)+PDZZ(:,:,IKB+KKL:IKB+KKL)) & + +(PWM(:,:,IKB+KKL:IKB+KKL)-PWM(:,:,IKB:IKB )) & + /(PDZZ(:,:,IKB+KKL:IKB+KKL)+PDZZ(:,:,IKB:IKB )) & + ) & + * PDZX(:,:,IKB+KKL:IKB+KKL) & + ) / (0.5*(PDXX(:,:,IKB+KKL:IKB+KKL)+PDXX(:,:,IKB:IKB))) & + ) + ! +IF (LOCEAN) THEN + ! evaluate the dynamic production at w(IKE-KKL) in PDP(IKE) + ZA(:,:,IKE:IKE) = - MXF ( & + ZFLXZ(:,:,IKE-KKL:IKE-KKL) * & + ( DXM( PWM(:,:,IKE-KKL:IKE-KKL) ) & + -MXM( (PWM(:,:,IKE-2*KKL:IKE-2*KKL )-PWM(:,:,IKE-KKL:IKE-KKL)) & + /(PDZZ(:,:,IKE-2*KKL:IKE-2*KKL)+PDZZ(:,:,IKE-KKL:IKE-KKL)) & + +(PWM(:,:,IKE-KKL:IKE-KKL)-PWM(:,:,IKE:IKE )) & + /(PDZZ(:,:,IKE-KKL:IKE-KKL)+PDZZ(:,:,IKE:IKE )) & + ) & + * PDZX(:,:,IKE-KKL:IKE-KKL) & + ) / (0.5*(PDXX(:,:,IKE-KKL:IKE-KKL)+PDXX(:,:,IKE:IKE))) & + ) +END IF + ! + PDP(:,:,:)=PDP(:,:,:)+ZA(:,:,:) + ! + ! Storage in the LES configuration + ! + IF (LLES_CALL) THEN + CALL SECOND_MNH(ZTIME1) + CALL LES_MEAN_SUBGRID( MZF(MXF(GX_W_UW(PWM,PDXX,& + PDZZ,PDZX)*ZFLXZ)), X_LES_RES_ddxa_W_SBG_UaW ) + CALL LES_MEAN_SUBGRID( MXF(GX_M_U(KKA,KKU,KKL,PTHLM,PDXX,PDZZ,PDZX)& + * MZF(ZFLXZ)), X_LES_RES_ddxa_Thl_SBG_UaW ) + IF (KRR>=1) THEN + CALL LES_MEAN_SUBGRID(MXF(GX_U_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX)& + *MZF(ZFLXZ)),X_LES_RES_ddxa_Rt_SBG_UaW ) + END IF + DO JSV=1,NSV + CALL LES_MEAN_SUBGRID( MXF(GX_U_M(PSVM(:,:,:,JSV),PDXX,PDZZ,& + PDZX)*MZF(ZFLXZ)),X_LES_RES_ddxa_Sv_SBG_UaW(:,:,:,JSV) ) + END DO + CALL SECOND_MNH(ZTIME2) + XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 + END IF +END IF +! +!---------------------------------------------------------------------------- +! +! +!* 6. SOURCES OF V,W WIND COMPONENTS AND COMPLETE 1D DYNAMIC PRODUCTION +! ----------------------------------------------------------------- +! +!* 6.1 Source of V wind component +! +! Preparation of the arguments for TRIDIAG_WIND +!! +ZA(:,:,:) = - PTSTEP * XCMFS * & + MYM( ZKEFF ) * MYM(MZM( PRHODJ )) / & + MYM( PDZZ )**2 +! +! +! +! Compute the source of V wind component +! compute the coefficient between the vertical flux and the 2 components of the +! wind following the slope +ZCOEFFLXU(:,:,1) = PCDUEFF(:,:) * (PDIRCOSZW(:,:)**2 - ZDIRSINZW(:,:)**2) & + * PSINSLOPE(:,:) +ZCOEFFLXV(:,:,1) = PCDUEFF(:,:) * PDIRCOSZW(:,:) * PCOSSLOPE(:,:) + +! prepare the implicit scheme coefficients for the surface flux +ZCOEFS(:,:,1)= ZCOEFFLXU(:,:,1) * PSINSLOPE(:,:) * PDIRCOSZW(:,:) & + +ZCOEFFLXV(:,:,1) * PCOSSLOPE(:,:) +! +! average this flux to be located at the V,W vorticity point +ZCOEFS(:,:,1:1)=MYM(ZCOEFS(:,:,1:1) / PDZZ(:,:,IKB:IKB) ) +! +IF (LOCEAN) THEN ! Ocean case + IF (LCOUPLES) THEN + ZSOURCE(:,:,IKE:IKE) = XSSVFL_C(:,:,1:1)/PDZZ(:,:,IKE:IKE) & + *0.5 * ( 1. + MYM(PRHODJ(:,:,KKU:KKU)) / MYM(PRHODJ(:,:,IKE:IKE)) ) + ELSE + ZSOURCE(:,:,IKE) = XSSVFL(:,:) + ZSOURCE(:,:,IKE:IKE) = ZSOURCE(:,:,IKE:IKE)/PDZZ(:,:,IKE:IKE) & + *0.5 * ( 1. + MYM(PRHODJ(:,:,KKU:KKU)) / MYM(PRHODJ(:,:,IKE:IKE)) ) + END IF + !No flux at the ocean domain bottom + ZSOURCE(:,:,IKB) = 0. +ELSE ! Atmos case + IF (.NOT.LCOUPLES) THEN ! only atmosp without coupling + ! compute the explicit tangential flux at the W point + ZSOURCE(:,:,IKB) = & + PTAU11M(:,:) * PSINSLOPE(:,:) * PDIRCOSZW(:,:) * ZDIRSINZW(:,:) & + +PTAU12M(:,:) * PCOSSLOPE(:,:) * ZDIRSINZW(:,:) & + -PTAU33M(:,:) * PSINSLOPE(:,:) * ZDIRSINZW(:,:) * PDIRCOSZW(:,:) +! + ! add the vertical part or the surface flux at the V,W vorticity point + ZSOURCE(:,:,IKB:IKB) = & + ( MYM( ZSOURCE(:,:,IKB:IKB) / PDZZ(:,:,IKB:IKB) ) & + + MYM( ZCOEFFLXU(:,:,1:1) / PDZZ(:,:,IKB:IKB) & + *ZUSLOPEM(:,:,1:1) & + +ZCOEFFLXV(:,:,1:1) / PDZZ(:,:,IKB:IKB) & + *ZVSLOPEM(:,:,1:1) ) & + - ZCOEFS(:,:,1:1) * PVM(:,:,IKB:IKB) * PIMPL & + ) * 0.5 * ( 1. + MYM(PRHODJ(:,:,KKA:KKA)) / MYM(PRHODJ(:,:,IKB:IKB)) ) +! + ELSE !atmosphere when coupling + ! input flux assumed to be in SI and at vorticity point + ZSOURCE(:,:,IKB:IKB) = -XSSVFL_C(:,:,1:1)/(1.*PDZZ(:,:,IKB:IKB)) & + * 0.5 * ( 1. + MYM(PRHODJ(:,:,KKA:KKA)) / MYM(PRHODJ(:,:,IKB:IKB)) ) + ENDIF + !No flux at the atmosphere top + ZSOURCE(:,:,IKE) = 0. +ENDIF ! End of Ocean or Atmospher Cases +ZSOURCE(:,:,IKTB+1:IKTE-1) = 0. +! +! Obtention of the split V at t+ deltat +CALL TRIDIAG_WIND(KKA,KKU,KKL,PVM,ZA,ZCOEFS(:,:,1),PTSTEP,PEXPL,PIMPL, & + MYM(PRHODJ),ZSOURCE,ZRES) +! +! Compute the equivalent tendency for the V wind component +! +PRVS(:,:,:)=PRVS(:,:,:)+MYM(PRHODJ(:,:,:))*(ZRES(:,:,:)-PVM(:,:,:))/PTSTEP +! +! +!* 6.2 Complete 1D dynamic Production +! +! vertical flux of the V wind component +! +ZFLXZ(:,:,:) = -XCMFS * MYM(ZKEFF) * & + DZM( PIMPL*ZRES + PEXPL*PVM ) / MYM(PDZZ) +! +ZFLXZ(:,:,IKB:IKB) = MYM(PDZZ(:,:,IKB:IKB)) * & + ( ZSOURCE(:,:,IKB:IKB) & + +ZCOEFS(:,:,1:1) * ZRES(:,:,IKB:IKB) * PIMPL & + ) / 0.5 / ( 1. + MYM(PRHODJ(:,:,KKA:KKA)) / MYM(PRHODJ(:,:,IKB:IKB)) ) +! +! +ZFLXZ(:,:,KKA) = ZFLXZ(:,:,IKB) +! +IF (LOCEAN) THEN + ZFLXZ(:,:,IKE:IKE) = MYM(PDZZ(:,:,IKE:IKE)) * & + ZSOURCE(:,:,IKE:IKE) & + / 0.5 / ( 1. + MYM(PRHODJ(:,:,KKU:KKU)) / MYM(PRHODJ(:,:,IKE:IKE)) ) + ZFLXZ(:,:,KKU) = ZFLXZ(:,:,IKE) +END IF +! +IF ( OTURB_FLX .AND. tpfile%lopened ) THEN + ! stores the V wind component vertical flux + TZFIELD%CMNHNAME = 'VW_VFLX' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'VW_VFLX' + TZFIELD%CUNITS = 'm2 s-2' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'V wind component vertical flux' + TZFIELD%NGRID = 4 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZFLXZ) +END IF +! +! second part of total momentum flux +! +PWV(:,:,:) = ZFLXZ(:,:,:) +! +! Contribution to the dynamic production of TKE +! compute the dynamic production contribution at the mass point +! +ZA(:,:,:) = - MZF( MYF ( ZFLXZ * GZ_V_VW(PVM,PDZZ) ) ) +! +! evaluate the dynamic production at w(IKB+KKL) in PDP(IKB) +ZA(:,:,IKB:IKB) = & + - MYF ( & +ZFLXZ(:,:,IKB+KKL:IKB+KKL) * (PVM(:,:,IKB+KKL:IKB+KKL)-PVM(:,:,IKB:IKB)) & + / MYM(PDZZ(:,:,IKB+KKL:IKB+KKL)) & + ) +! +IF (LOCEAN) THEN + ! evaluate the dynamic production at w(IKE-KKL) in PDP(IKE) + ZA(:,:,IKE:IKE) = - MYF ( & + ZFLXZ(:,:,IKE-KKL:IKE-KKL) * (PVM(:,:,IKE:IKE)-PVM(:,:,IKE-KKL:IKE-KKL)) & + / MYM(PDZZ(:,:,IKE-KKL:IKE-KKL)) & + ) +END IF +! +PDP(:,:,:)=PDP(:,:,:)+ZA(:,:,:) +! +! Storage in the LES configuration +! +IF (LLES_CALL) THEN + CALL SECOND_MNH(ZTIME1) + CALL LES_MEAN_SUBGRID( MZF(MYF(ZFLXZ)), X_LES_SUBGRID_WV ) + CALL LES_MEAN_SUBGRID( MZF(MYF(GZ_V_VW(PVM,PDZZ)*& + & ZFLXZ)), X_LES_RES_ddxa_V_SBG_UaV ) + CALL SECOND_MNH(ZTIME2) + XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 +END IF +! +! +!* 6.3 Source of W wind component +! +IF(HTURBDIM=='3DIM') THEN + ! Compute the source for the W wind component + ZFLXZ(:,:,KKA) = 2 * ZFLXZ(:,:,IKB) - ZFLXZ(:,:,IKB+KKL) ! extrapolation + IF (LOCEAN) THEN + ZFLXZ(:,:,KKU) = 2 * ZFLXZ(:,:,IKE) - ZFLXZ(:,:,IKE-KKL) ! extrapolation + END IF + ! + IF (.NOT. L2D) THEN + IF (.NOT. LFLAT) THEN + PRWS(:,:,:)= PRWS(:,:,:) & + -DYF( MZM( MYM(PRHODJ) /PDYY ) * ZFLXZ ) & + +DZM( PRHODJ / MZF(PDZZ ) * & + MYF( MZF( ZFLXZ*PDZY ) / PDYY ) & + ) + ELSE + PRWS(:,:,:)= PRWS(:,:,:) -DYF( MZM( MYM(PRHODJ) /PDYY ) * ZFLXZ ) + END IF + END IF + ! + ! Complete the Dynamical production with the W wind component + IF (.NOT. L2D) THEN + ZA(:,:,:) = - MZF( MYF ( ZFLXZ * GY_W_VW( PWM,PDYY,PDZZ,PDZY) ) ) + ! + ! evaluate the dynamic production at w(IKB+KKL) in PDP(IKB) + ZA(:,:,IKB:IKB) = - MYF ( & + ZFLXZ(:,:,IKB+KKL:IKB+KKL) * & + ( DYM( PWM(:,:,IKB+KKL:IKB+KKL) ) & + -MYM( (PWM(:,:,IKB+2*KKL:IKB+2*KKL)-PWM(:,:,IKB+KKL:IKB+KKL)) & + /(PDZZ(:,:,IKB+2*KKL:IKB+2*KKL)+PDZZ(:,:,IKB+KKL:IKB+KKL)) & + +(PWM(:,:,IKB+KKL:IKB+KKL)-PWM(:,:,IKB:IKB )) & + /(PDZZ(:,:,IKB+KKL:IKB+KKL)+PDZZ(:,:,IKB:IKB )) & + ) & + * PDZY(:,:,IKB+KKL:IKB+KKL) & + ) / (0.5*(PDYY(:,:,IKB+KKL:IKB+KKL)+PDYY(:,:,IKB:IKB))) & + ) + ! + IF (LOCEAN) THEN + ZA(:,:,IKE:IKE) = - MYF ( & + ZFLXZ(:,:,IKE-KKL:IKE-KKL) * & + ( DYM( PWM(:,:,IKE-KKL:IKE-KKL) ) & + -MYM( (PWM(:,:,IKE-2*KKL:IKE-2*KKL)-PWM(:,:,IKE-KKL:IKE-KKL)) & + /(PDZZ(:,:,IKE-2*KKL:IKE-2*KKL)+PDZZ(:,:,IKE-KKL:IKE-KKL)) & + +(PWM(:,:,IKE-KKL:IKE-KKL)-PWM(:,:,IKE:IKE )) & + /(PDZZ(:,:,IKE-KKL:IKE-KKL)+PDZZ(:,:,IKE:IKE )) & + ) & + * PDZY(:,:,IKE-KKL:IKE-KKL) & + ) / (0.5*(PDYY(:,:,IKE-KKL:IKE-KKL)+PDYY(:,:,IKE:IKE))) & + ) + END IF +! + PDP(:,:,:)=PDP(:,:,:)+ZA(:,:,:) + ! + END IF + ! + ! Storage in the LES configuration + ! + IF (LLES_CALL) THEN + CALL SECOND_MNH(ZTIME1) + CALL LES_MEAN_SUBGRID( MZF(MYF(GY_W_VW(PWM,PDYY,& + PDZZ,PDZY)*ZFLXZ)), X_LES_RES_ddxa_W_SBG_UaW , .TRUE. ) + CALL LES_MEAN_SUBGRID( MYF(GY_M_V(KKA,KKU,KKL,PTHLM,PDYY,PDZZ,PDZY)& + *MZF(ZFLXZ)), X_LES_RES_ddxa_Thl_SBG_UaW , .TRUE. ) + IF (KRR>=1) THEN + CALL LES_MEAN_SUBGRID( MYF(GY_V_M(PRM(:,:,:,1),PDYY,PDZZ,& + PDZY)*MZF(ZFLXZ)),X_LES_RES_ddxa_Rt_SBG_UaW , .TRUE. ) + END IF + CALL SECOND_MNH(ZTIME2) + XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 + END IF + ! +END IF +! +! +!---------------------------------------------------------------------------- +! +!* 7. DIAGNOSTIC COMPUTATION OF THE 1D <W W> VARIANCE +! ----------------------------------------------- +! +IF ( OTURB_FLX .AND. tpfile%lopened .AND. HTURBDIM == '1DIM') THEN + ZFLXZ(:,:,:)= (2./3.) * PTKEM(:,:,:) & + -XCMFS*PLM(:,:,:)*SQRT(PTKEM(:,:,:))*GZ_W_M(PWM,PDZZ) + ! to be tested & + ! +XCMFB*(4./3.)*PLM(:,:,:)/SQRT(PTKEM(:,:,:))*PTP(:,:,:) + ! stores the W variance + TZFIELD%CMNHNAME = 'W_VVAR' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'W_VVAR' + TZFIELD%CUNITS = 'm2 s-2' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_W_VVAR' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZFLXZ) +END IF +! +!---------------------------------------------------------------------------- +! +END SUBROUTINE TURB_VER_DYN_FLUX diff --git a/src/mesonh/turb/turb_ver_sv_corr.f90 b/src/mesonh/turb/turb_ver_sv_corr.f90 new file mode 100644 index 000000000..b62268e7e --- /dev/null +++ b/src/mesonh/turb/turb_ver_sv_corr.f90 @@ -0,0 +1,223 @@ +!MNH_LIC Copyright 2002-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! #################### + MODULE MODI_TURB_VER_SV_CORR +! #################### +! +INTERFACE +! + SUBROUTINE TURB_VER_SV_CORR(KKA,KKU,KKL,KRR,KRRL,KRRI, & + PDZZ, & + PTHLM,PRM,PTHVREF, & + PLOCPEXNM,PATHETA,PAMOIST,PSRCM,PPHI3,PPSI3, & + PWM,PSVM, & + PTKEM,PLM,PLEPS,PPSI_SV ) +! +INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +INTEGER, INTENT(IN) :: KRR ! number of moist var. +INTEGER, INTENT(IN) :: KRRL ! number of liquid var. +INTEGER, INTENT(IN) :: KRRI ! number of ice var. +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ + ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM ! potential temperature at t-Delta t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Mixing ratios at t-Delta t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! reference Thv +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exnref at time t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA ! coefficients between +REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! s and Thetal and Rnp +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM ! normalized + ! 2nd-order flux s'r'c/2Sigma_s2 at t-1 multiplied by Lambda_3 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPHI3 ! Inv.Turb.Sch.for temperature +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPSI3 ! Inv.Turb.Sch.for humidity +REAL, DIMENSION(:,:,:), INTENT(IN) :: PWM ! w at time t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! scalar var. at t-Delta t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! dissipative length +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PPSI_SV ! Inv.Turb.Sch.for scalars + ! cumulated sources for the prognostic variables +! +! +END SUBROUTINE TURB_VER_SV_CORR +! +END INTERFACE +! +END MODULE MODI_TURB_VER_SV_CORR +! +! +! ############################################################### + SUBROUTINE TURB_VER_SV_CORR(KKA,KKU,KKL,KRR,KRRL,KRRI, & + PDZZ, & + PTHLM,PRM,PTHVREF, & + PLOCPEXNM,PATHETA,PAMOIST,PSRCM,PPHI3,PPSI3, & + PWM,PSVM, & + PTKEM,PLM,PLEPS,PPSI_SV ) +! ############################################################### +! +! +!!**** *TURB_VER_SV_CORR* -compute the subgrid Sv2 and SvThv terms +!! +!! PURPOSE +!! ------- +!! +!! +!! EXTERNAL +!! -------- +!! +!! FUNCTIONs ETHETA and EMOIST : +!! allows to compute: +!! - the coefficients for the turbulent correlation between +!! any variable and the virtual potential temperature, of its +!! correlations with the conservative potential temperature and +!! the humidity conservative variable: +!! ------- ------- ------- +!! A' Thv' = ETHETA A' Thl' + EMOIST A' Rnp' +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! V. Masson * Meteo-France * +!! +!! MODIFICATIONS +!! ------------- +!! Original October 29, 2002 +!! JP Pinty Feb 20, 2003 Add PFRAC_ICE +!!-------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_CTURB +USE MODD_PARAMETERS +USE MODD_LES +USE MODD_CONF +USE MODD_NSV, ONLY : NSV,NSV_LGBEG,NSV_LGEND +USE MODD_BLOWSNOW +! +! +USE MODI_GRADIENT_U +USE MODI_GRADIENT_V +USE MODI_GRADIENT_W +USE MODI_GRADIENT_M +USE MODI_SHUMAN +USE MODI_EMOIST +USE MODI_ETHETA +USE MODI_LES_MEAN_SUBGRID +! +USE MODI_SECOND_MNH +! +IMPLICIT NONE +! +!* 0.1 declarations of arguments +! +! +! +INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +INTEGER, INTENT(IN) :: KRR ! number of moist var. +INTEGER, INTENT(IN) :: KRRL ! number of liquid var. +INTEGER, INTENT(IN) :: KRRI ! number of ice var. +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ + ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM ! potential temperature at t-Delta t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Mixing ratios at t-Delta t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! reference Thv +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exnref at time t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA ! coefficients between +REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! s and Thetal and Rnp +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM ! normalized + ! 2nd-order flux s'r'c/2Sigma_s2 at t-1 multiplied by Lambda_3 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPHI3 ! Inv.Turb.Sch.for temperature +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPSI3 ! Inv.Turb.Sch.for humidity +REAL, DIMENSION(:,:,:), INTENT(IN) :: PWM ! w at time t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! scalar var. at t-Delta t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! dissipative length +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PPSI_SV ! Inv.Turb.Sch.for scalars + ! cumulated sources for the prognostic variables +! +! +! +! +!* 0.2 declaration of local variables +! +! +REAL, DIMENSION(SIZE(PSVM,1),SIZE(PSVM,2),SIZE(PSVM,3)) :: & + ZA, ZFLXZ +! +REAL :: ZCSV !constant for the scalar flux +! +INTEGER :: JSV ! loop counters +! +REAL :: ZTIME1, ZTIME2 +! +REAL :: ZCSVD = 1.2 ! constant for scalar variance dissipation +REAL :: ZCTSVD = 2.4 ! constant for temperature - scalar covariance dissipation +REAL :: ZCQSVD = 2.4 ! constant for humidity - scalar covariance dissipation +!---------------------------------------------------------------------------- +! +CALL SECOND_MNH(ZTIME1) +! +IF(LBLOWSNOW) THEN +! See Vionnet (PhD, 2012) for a complete discussion around the value of the Schmidt number for blowing snow variables + ZCSV= XCHF/XRSNOW +ELSE + ZCSV= XCHF +ENDIF +! +DO JSV=1,NSV + ! + IF (LNOMIXLG .AND. JSV >= NSV_LGBEG .AND. JSV<= NSV_LGEND) CYCLE + ! + ! variance Sv2 + ! + IF (LLES_CALL) THEN + ! approximation: diagnosed explicitely (without implicit term) + ZFLXZ(:,:,:) = PPSI_SV(:,:,:,JSV)*GZ_M_W(KKA,KKU,KKL,PSVM(:,:,:,JSV),PDZZ)**2 + ZFLXZ(:,:,:) = ZCSV / ZCSVD * PLM * PLEPS * MZF(ZFLXZ(:,:,:) ) + CALL LES_MEAN_SUBGRID( -2.*ZCSVD*SQRT(PTKEM)*ZFLXZ/PLEPS, X_LES_SUBGRID_DISS_Sv2(:,:,:,JSV) ) + CALL LES_MEAN_SUBGRID( MZF(PWM)*ZFLXZ, X_LES_RES_W_SBG_Sv2(:,:,:,JSV) ) + END IF + ! + ! covariance ThvSv + ! + IF (LLES_CALL) THEN + ! approximation: diagnosed explicitely (without implicit term) + ZA(:,:,:) = ETHETA(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PATHETA,PSRCM) + ZFLXZ(:,:,:)= ( XCSHF * PPHI3 + ZCSV * PPSI_SV(:,:,:,JSV) ) & + * GZ_M_W(KKA,KKU,KKL,PTHLM,PDZZ) & + * GZ_M_W(KKA,KKU,KKL,PSVM(:,:,:,JSV),PDZZ) + ZFLXZ(:,:,:)= PLM * PLEPS / (2.*ZCTSVD) * MZF(ZFLXZ) + CALL LES_MEAN_SUBGRID( ZA*ZFLXZ, X_LES_SUBGRID_SvThv(:,:,:,JSV) ) + CALL LES_MEAN_SUBGRID( -XG/PTHVREF/3.*ZA*ZFLXZ, X_LES_SUBGRID_SvPz(:,:,:,JSV), .TRUE.) + ! + IF (KRR>=1) THEN + ZA(:,:,:) = EMOIST(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PAMOIST,PSRCM) + ZFLXZ(:,:,:)= ( XCHF * PPSI3 + ZCSV * PPSI_SV(:,:,:,JSV) ) & + * GZ_M_W(KKA,KKU,KKL,PRM(:,:,:,1),PDZZ) & + * GZ_M_W(KKA,KKU,KKL,PSVM(:,:,:,JSV),PDZZ) + ZFLXZ(:,:,:)= PLM * PLEPS / (2.*ZCQSVD) * MZF(ZFLXZ) + CALL LES_MEAN_SUBGRID( ZA*ZFLXZ, X_LES_SUBGRID_SvThv(:,:,:,JSV) , .TRUE.) + CALL LES_MEAN_SUBGRID( -XG/PTHVREF/3.*ZA*ZFLXZ, X_LES_SUBGRID_SvPz(:,:,:,JSV), .TRUE.) + END IF + END IF + ! +END DO ! end of scalar loop +! +CALL SECOND_MNH(ZTIME2) +XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 +!---------------------------------------------------------------------------- +! +END SUBROUTINE TURB_VER_SV_CORR diff --git a/src/mesonh/turb/turb_ver_sv_flux.f90 b/src/mesonh/turb/turb_ver_sv_flux.f90 new file mode 100644 index 000000000..23d8bee03 --- /dev/null +++ b/src/mesonh/turb/turb_ver_sv_flux.f90 @@ -0,0 +1,490 @@ +!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! #################### + MODULE MODI_TURB_VER_SV_FLUX +! #################### +! +INTERFACE +! + SUBROUTINE TURB_VER_SV_FLUX(KKA,KKU,KKL, & + OTURB_FLX,HTURBDIM, & + PIMPL,PEXPL, & + PTSTEP, & + TPFILE, & + PDZZ,PDIRCOSZW, & + PRHODJ,PWM, & + PSFSVM,PSFSVP, & + PSVM, & + PTKEM,PLM,PPSI_SV, & + PRSVS,PWSV ) +! +USE MODD_IO, ONLY: TFILEDATA +! +INTEGER, INTENT(IN) :: KKA !near ground array index +INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=AR +LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the + ! turbulent fluxes in the syncronous FM-file +CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! dimensionality of the + ! turbulence scheme +REAL, INTENT(IN) :: PIMPL, PEXPL ! Coef. for temporal disc. +REAL, INTENT(IN) :: PTSTEP ! Double Time Step +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ + ! Metric coefficients +REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSZW ! Director Cosinus of the + ! normal to the ground surface +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry density * grid volum +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSFSVM ! t - deltat +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSFSVP ! t + deltat +! +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! scalar var. at t-Delta t +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PWM ! vertical wind +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PPSI_SV ! Inv.Turb.Sch.for scalars +! +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS + ! cumulated sources for the prognostic variables +REAL, DIMENSION(:,:,:,:), INTENT(OUT) :: PWSV ! scalar flux + +! +! +END SUBROUTINE TURB_VER_SV_FLUX +! +END INTERFACE +! +END MODULE MODI_TURB_VER_SV_FLUX +! +! +! ############################################################### + SUBROUTINE TURB_VER_SV_FLUX(KKA,KKU,KKL, & + OTURB_FLX,HTURBDIM, & + PIMPL,PEXPL, & + PTSTEP, & + TPFILE, & + PDZZ,PDIRCOSZW, & + PRHODJ,PWM, & + PSFSVM,PSFSVP, & + PSVM, & + PTKEM,PLM,PPSI_SV, & + PRSVS,PWSV ) +! + +! +! +!!**** *TURB_VER_SV_FLUX* -compute the source terms due to the vertical turbulent +!! fluxes. +!! +!! PURPOSE +!! ------- +! The purpose of this routine is to compute the vertical turbulent +! fluxes of the evolutive variables and give back the source +! terms to the main program. In the case of large horizontal meshes, +! the divergence of these vertical turbulent fluxes represent the whole +! effect of the turbulence but when the three-dimensionnal version of +! the turbulence scheme is activated (CTURBDIM="3DIM"), these divergences +! are completed in the next routine TURB_HOR. +! An arbitrary degree of implicitness has been implemented for the +! temporal treatment of these diffusion terms. +! The vertical boundary conditions are as follows: +! * at the bottom, the surface fluxes are prescribed at the same +! as the other turbulent fluxes +! * at the top, the turbulent fluxes are set to 0. +! It should be noted that the condensation has been implicitely included +! in this turbulence scheme by using conservative variables and computing +! the subgrid variance of a statistical variable s indicating the presence +! or not of condensation in a given mesh. +! +!!** METHOD +!! ------ +!! 1D type calculations are made; +!! The vertical turbulent fluxes are computed in an off-centered +!! implicit scheme (a Crank-Nicholson type with coefficients different +!! than 0.5), which allows to vary the degree of implicitness of the +!! formulation. +!! The different prognostic variables are treated one by one. +!! The contributions of each turbulent fluxes are cumulated into the +!! tendency PRvarS, and into the dynamic and thermal production of +!! TKE if necessary. +!! +!! In section 2 and 3, the thermodynamical fields are considered. +!! Only the turbulent fluxes of the conservative variables +!! (Thetal and Rnp stored in PRx(:,:,:,1)) are computed. +!! Note that the turbulent fluxes at the vertical +!! boundaries are given either by the soil scheme for the surface one +!! ( at the same instant as the others fluxes) and equal to 0 at the +!! top of the model. The thermal production is computed by vertically +!! averaging the turbulent flux and multiply this flux at the mass point by +!! a function ETHETA or EMOIST, which preform the transformation from the +!! conservative variables to the virtual potential temperature. +!! +!! In section 4, the variance of the statistical variable +!! s indicating presence or not of condensation, is determined in function +!! of the turbulent moments of the conservative variables and its +!! squarred root is stored in PSIGS. This information will be completed in +!! the horizontal turbulence if the turbulence dimensionality is not +!! equal to "1DIM". +!! +!! In section 5, the x component of the stress tensor is computed. +!! The surface flux <u'w'> is computed from the value of the surface +!! fluxes computed in axes linked to the orography ( i", j" , k"): +!! i" is parallel to the surface and in the direction of the maximum +!! slope +!! j" is also parallel to the surface and in the normal direction of +!! the maximum slope +!! k" is the normal to the surface +!! In order to prevent numerical instability, the implicit scheme has +!! been extended to the surface flux regarding to its dependence in +!! function of U. The dependence in function of the other components +!! introduced by the different rotations is only explicit. +!! The turbulent fluxes are used to compute the dynamic production of +!! TKE. For the last TKE level ( located at PDZZ(:,:,IKB)/2 from the +!! ground), an harmonic extrapolation from the dynamic production at +!! PDZZ(:,:,IKB) is used to avoid an evaluation of the gradient of U +!! in the surface layer. +!! +!! In section 6, the same steps are repeated but for the y direction +!! and in section 7, a diagnostic computation of the W variance is +!! performed. +!! +!! In section 8, the turbulent fluxes for the scalar variables are +!! computed by the same way as the conservative thermodynamical variables +!! +!! +!! EXTERNAL +!! -------- +!! GX_U_M, GY_V_M, GZ_W_M : cartesian gradient operators +!! GX_U_UW,GY_V_VW (X,Y,Z) represent the direction of the gradient +!! _(M,U,...)_ represent the localization of the +!! field to be derivated +!! _(M,UW,...) represent the localization of the +!! field derivated +!! +!! +!! MXM,MXF,MYM,MYF,MZM,MZF +!! : Shuman functions (mean operators) +!! DXF,DYF,DZF,DZM +!! : Shuman functions (difference operators) +!! +!! SUBROUTINE TRIDIAG : to compute the split implicit evolution +!! of a variable located at a mass point +!! +!! SUBROUTINE TRIDIAG_WIND: to compute the split implicit evolution +!! of a variable located at a wind point +!! +!! FUNCTIONs ETHETA and EMOIST : +!! allows to compute: +!! - the coefficients for the turbulent correlation between +!! any variable and the virtual potential temperature, of its +!! correlations with the conservative potential temperature and +!! the humidity conservative variable: +!! ------- ------- ------- +!! A' Thv' = ETHETA A' Thl' + EMOIST A' Rnp' +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST : contains physical constants +!! +!! XG : gravity constant +!! +!! Module MODD_CTURB: contains the set of constants for +!! the turbulence scheme +!! +!! XCMFS,XCMFB : cts for the momentum flux +!! XCSHF : ct for the sensible heat flux +!! XCHF : ct for the moisture flux +!! XCTV,XCHV : cts for the T and moisture variances +!! +!! Module MODD_PARAMETERS +!! +!! JPVEXT_TURB : number of vertical external points +!! JPHEXT : number of horizontal external points +!! +!! +!! REFERENCE +!! --------- +!! Book 1 of documentation (Chapter: Turbulence) +!! +!! AUTHOR +!! ------ +!! Joan Cuxart * INM and Meteo-France * +!! +!! MODIFICATIONS +!! ------------- +!! Original August 19, 1994 +!! Modifications: February 14, 1995 (J.Cuxart and J.Stein) +!! Doctorization and Optimization +!! Modifications: March 21, 1995 (J.M. Carriere) +!! Introduction of cloud water +!! Modifications: June 14, 1995 (J.Cuxart and J. Stein) +!! Phi3 and Psi3 at w-point + bug in the all +!! or nothing condens. +!! Modifications: Sept 15, 1995 (J.Cuxart and J. Stein) +!! Change the DP computation at the ground +!! Modifications: October 10, 1995 (J.Cuxart and J. Stein) +!! Psi for scal var and LES tools +!! Modifications: November 10, 1995 (J. Stein) +!! change the surface relations +!! Modifications: February 20, 1995 (J. Stein) optimization +!! Modifications: May 21, 1996 (J. Stein) +!! bug in the vertical flux of the V wind +!! component for explicit computation +!! Modifications: May 21, 1996 (N. wood) +!! modify the computation of the vertical +!! part or the surface tangential flux +!! Modifications: May 21, 1996 (P. Jabouille) +!! same modification in the Y direction +!! +!! Modifications: Sept 17, 1996 (J. Stein) change the moist case by using +!! Pi instead of Piref + use Atheta and Amoist +!! +!! Modifications: Nov 24, 1997 (V. Masson) removes the DO loops +!! Modifications: Mar 31, 1998 (V. Masson) splits the routine TURB_VER_SV_FLUX +!! Modifications: Dec 01, 2000 (V. Masson) conservation of scalar emission +!! from surface in 1DIM case +!! when slopes are present +!! Jun 20, 2001 (J Stein) case of lagragian variables +!! Nov 06, 2002 (V. Masson) LES budgets +!! October 2009 (G. Tanguy) add ILENCH=LEN(YCOMMENT) after +!! change of YCOMMENT +!! Feb 2012(Y. Seity) add possibility to run with reversed +!! vertical levels +!! Feb 2017(M. Leriche) add initialisation of ZSOURCE +!! to avoid unknwon values outside physical domain +!! and avoid negative values in sv tendencies +!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +!!-------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_CTURB +use modd_field, only: tfielddata, TYPEREAL +USE MODD_IO, ONLY: TFILEDATA +USE MODD_PARAMETERS +USE MODD_LES +USE MODD_CONF +USE MODD_NSV, ONLY: XSVMIN, NSV_LGBEG, NSV_LGEND +USE MODD_BLOWSNOW +USE MODE_IO_FIELD_WRITE, only: IO_Field_write +! +USE MODI_GRADIENT_U +USE MODI_GRADIENT_V +USE MODI_GRADIENT_W +USE MODI_GRADIENT_M +USE MODI_SHUMAN +USE MODI_TRIDIAG +USE MODI_TRIDIAG_WIND +USE MODI_EMOIST +USE MODI_ETHETA +USE MODI_LES_MEAN_SUBGRID +! +USE MODI_SECOND_MNH +! +IMPLICIT NONE +! +!* 0.1 declarations of arguments +! +! +INTEGER, INTENT(IN) :: KKA !near ground array index +INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO +LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the + ! turbulent fluxes in the syncronous FM-file +CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! dimensionality of the + ! turbulence scheme +REAL, INTENT(IN) :: PIMPL, PEXPL ! Coef. for temporal disc. +REAL, INTENT(IN) :: PTSTEP ! Double Time Step +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ + ! Metric coefficients +REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSZW ! Director Cosinus of the + ! normal to the ground surface +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry density * grid volum +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSFSVM ! t - deltat +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSFSVP ! t + deltat +! +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! scalar var. at t-Delta t +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PWM ! vertical wind +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PPSI_SV ! Inv.Turb.Sch.for scalars +! +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS + ! cumulated sources for the prognostic variables +REAL, DIMENSION(:,:,:,:), INTENT(OUT) :: PWSV ! scalar flux +! +! +! +! +!* 0.2 declaration of local variables +! +! +REAL, DIMENSION(SIZE(PSVM,1),SIZE(PSVM,2),SIZE(PSVM,3)) :: & + ZA, & ! under diagonal elements of the tri-diagonal matrix involved + ! in the temporal implicit scheme (also used to store coefficient + ! J in Section 5) + ZRES, & ! guess of the treated variable at t+ deltat when the turbu- + ! lence is the only source of evolution added to the ones + ! considered in ZSOURCE + ZFLXZ, & ! vertical flux of the treated variable + ZSOURCE, & ! source of evolution for the treated variable + ZKEFF ! effectif diffusion coeff = LT * SQRT( TKE ) +INTEGER :: IKB,IKE ! I index values for the Beginning and End + ! mass points of the domain in the 3 direct. +INTEGER :: IKT ! array size in k direction +INTEGER :: IKTB,IKTE ! start, end of k loops in physical domain +INTEGER :: JSV ! loop counters +INTEGER :: JK ! loop +INTEGER :: ISV ! number of scalar var. +! +REAL :: ZTIME1, ZTIME2 + +REAL :: ZCSVP = 4.0 ! constant for scalar flux presso-correlation (RS81) +REAL :: ZCSV !constant for the scalar flux +! +TYPE(TFIELDDATA) :: TZFIELD +!---------------------------------------------------------------------------- +! +!* 1. PRELIMINARIES +! ------------- +! +IKB=KKA+JPVEXT_TURB*KKL +IKE=KKU-JPVEXT_TURB*KKL +IKT=SIZE(PSVM,3) +IKTE =IKT-JPVEXT_TURB +IKTB =1+JPVEXT_TURB +! +ISV=SIZE(PSVM,4) +! +ZKEFF(:,:,:) = MZM( PLM(:,:,:) * SQRT(PTKEM(:,:,:)) ) +! +IF(LBLOWSNOW) THEN +! See Vionnet (PhD, 2012) for a complete discussion around the value of the Schmidt number for blowing snow variables + ZCSV= XCHF/XRSNOW +ELSE + ZCSV= XCHF +ENDIF +!---------------------------------------------------------------------------- +! +!* 8. SOURCES OF PASSIVE SCALAR VARIABLES +! ----------------------------------- +! +DO JSV=1,ISV +! + IF (LNOMIXLG .AND. JSV >= NSV_LGBEG .AND. JSV<= NSV_LGEND) CYCLE +! +! Preparation of the arguments for TRIDIAG + ZA(:,:,:) = -PTSTEP*ZCSV*PPSI_SV(:,:,:,JSV) * & + ZKEFF * MZM(PRHODJ) / & + PDZZ**2 + ZSOURCE(:,:,:) = 0. +! +! Compute the sources for the JSVth scalar variable + +!* in 3DIM case, a part of the flux goes vertically, and another goes horizontally +! (in presence of slopes) +!* in 1DIM case, the part of energy released in horizontal flux +! is taken into account in the vertical part + IF (HTURBDIM=='3DIM') THEN + ZSOURCE(:,:,IKB) = (PIMPL*PSFSVP(:,:,JSV) + PEXPL*PSFSVM(:,:,JSV)) / & + PDZZ(:,:,IKB) * PDIRCOSZW(:,:) & + * 0.5 * (1. + PRHODJ(:,:,KKA) / PRHODJ(:,:,IKB)) + ELSE + + ZSOURCE(:,:,IKB) = (PIMPL*PSFSVP(:,:,JSV) + PEXPL*PSFSVM(:,:,JSV)) / & + PDZZ(:,:,IKB) / PDIRCOSZW(:,:) & + * 0.5 * (1. + PRHODJ(:,:,KKA) / PRHODJ(:,:,IKB)) + END IF + ZSOURCE(:,:,IKTB+1:IKTE-1) = 0. + ZSOURCE(:,:,IKE) = 0. +! +! Obtention of the split JSV scalar variable at t+ deltat + CALL TRIDIAG(KKA,KKU,KKL,PSVM(:,:,:,JSV),ZA,PTSTEP,PEXPL,PIMPL,PRHODJ,ZSOURCE,ZRES) +! +! Compute the equivalent tendency for the JSV scalar variable + PRSVS(:,:,:,JSV)= PRSVS(:,:,:,JSV)+ & + PRHODJ(:,:,:)*(ZRES(:,:,:)-PSVM(:,:,:,JSV))/PTSTEP +! PRSVS(:,:,:,JSV)= MAX((PRSVS(:,:,:,JSV)+ & +! PRHODJ(:,:,:)*(ZRES(:,:,:)-PSVM(:,:,:,JSV))/PTSTEP),XSVMIN(JSV)) +! + IF ( (OTURB_FLX .AND. tpfile%lopened) .OR. LLES_CALL ) THEN + ! Diagnostic of the cartesian vertical flux + ! + ZFLXZ(:,:,:) = -ZCSV * PPSI_SV(:,:,:,JSV) * MZM(PLM*SQRT(PTKEM)) / PDZZ * & + DZM( PIMPL*ZRES(:,:,:) + PEXPL*PSVM(:,:,:,JSV) ) + ! surface flux + !* in 3DIM case, a part of the flux goes vertically, and another goes horizontally + ! (in presence of slopes) + !* in 1DIM case, the part of energy released in horizontal flux + ! is taken into account in the vertical part + IF (HTURBDIM=='3DIM') THEN + ZFLXZ(:,:,IKB) = (PIMPL*PSFSVP(:,:,JSV) + PEXPL*PSFSVM(:,:,JSV)) & + * PDIRCOSZW(:,:) + ELSE + ZFLXZ(:,:,IKB) = (PIMPL*PSFSVP(:,:,JSV) + PEXPL*PSFSVM(:,:,JSV)) & + / PDIRCOSZW(:,:) + END IF + ! extrapolates the flux under the ground so that the vertical average with + ! the IKB flux gives the ground value + ZFLXZ(:,:,KKA) = ZFLXZ(:,:,IKB) + DO JK=IKTB+1,IKTE-1 + PWSV(:,:,JK,JSV)=0.5*(ZFLXZ(:,:,JK)+ZFLXZ(:,:,JK+KKL)) + END DO + PWSV(:,:,IKB,JSV)=0.5*(ZFLXZ(:,:,IKB)+ZFLXZ(:,:,IKB+KKL)) + PWSV(:,:,IKE,JSV)=PWSV(:,:,IKE-KKL,JSV) + END IF + ! + IF (OTURB_FLX .AND. tpfile%lopened) THEN + ! stores the JSVth vertical flux + WRITE(TZFIELD%CMNHNAME,'("WSV_FLX_",I3.3)') JSV + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + !PW: TODO: use the correct units of the JSV variable (and multiply it by m s-1) + TZFIELD%CUNITS = 'SVUNIT m s-1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) + TZFIELD%NGRID = 4 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + ! + CALL IO_Field_write(TPFILE,TZFIELD,ZFLXZ) + END IF + ! + ! Storage in the LES configuration + ! + IF (LLES_CALL) THEN + CALL SECOND_MNH(ZTIME1) + CALL LES_MEAN_SUBGRID( MZF(ZFLXZ), X_LES_SUBGRID_WSv(:,:,:,JSV) ) + CALL LES_MEAN_SUBGRID( GZ_W_M(PWM,PDZZ)*MZF(ZFLXZ), & + X_LES_RES_ddxa_W_SBG_UaSv(:,:,:,JSV) ) + CALL LES_MEAN_SUBGRID( MZF(GZ_M_W(KKA,KKU,KKL,PSVM(:,:,:,JSV),PDZZ)*ZFLXZ), & + X_LES_RES_ddxa_Sv_SBG_UaSv(:,:,:,JSV) ) + CALL LES_MEAN_SUBGRID( -ZCSVP*SQRT(PTKEM)/PLM*MZF(ZFLXZ), X_LES_SUBGRID_SvPz(:,:,:,JSV) ) + CALL LES_MEAN_SUBGRID( MZF(PWM*ZFLXZ), X_LES_RES_W_SBG_WSv(:,:,:,JSV) ) + CALL SECOND_MNH(ZTIME2) + XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 + END IF + ! +END DO ! end of scalar loop +! +!---------------------------------------------------------------------------- +! +END SUBROUTINE TURB_VER_SV_FLUX diff --git a/src/mesonh/turb/turb_ver_thermo_corr.f90 b/src/mesonh/turb/turb_ver_thermo_corr.f90 new file mode 100644 index 000000000..bdd074e5c --- /dev/null +++ b/src/mesonh/turb/turb_ver_thermo_corr.f90 @@ -0,0 +1,848 @@ +!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! #################### + MODULE MODI_TURB_VER_THERMO_CORR +! #################### +! +INTERFACE +! + SUBROUTINE TURB_VER_THERMO_CORR(KKA,KKU,KKL,KRR,KRRL,KRRI, & + OTURB_FLX,HTURBDIM,HTOM, & + PIMPL,PEXPL, & + TPFILE, & + PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW, & + PRHODJ,PTHVREF, & + PSFTHM,PSFRM,PSFTHP,PSFRP, & + PWM,PTHLM,PRM,PSVM, & + PTKEM,PLM,PLEPS, & + PLOCPEXNM,PATHETA,PAMOIST,PSRCM, & + PBETA, PSQRT_TKE, PDTH_DZ, PDR_DZ, PRED2TH3, & + PRED2R3, PRED2THR3, PBLL_O_E, PETHETA, & + PEMOIST, PREDTH1, PREDR1, PPHI3, PPSI3, PD, & + PFWTH,PFWR,PFTH2,PFR2,PFTHR, & + PTHLP,PRP,PSIGS ) +! +USE MODD_IO, ONLY: TFILEDATA +! +INTEGER, INTENT(IN) :: KKA !near ground array index +INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=AR +INTEGER, INTENT(IN) :: KRR ! number of moist var. +INTEGER, INTENT(IN) :: KRRL ! number of liquid water var. +INTEGER, INTENT(IN) :: KRRI ! number of ice water var. +LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the + ! turbulent fluxes in the syncronous FM-file +CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! dimensionality of the + ! turbulence scheme +CHARACTER(len=4), INTENT(IN) :: HTOM ! type of Third Order Moment +REAL, INTENT(IN) :: PIMPL, PEXPL ! Coef. for temporal disc. +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ, PDXX, PDYY, PDZX, PDZY + ! Metric coefficients +REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSZW ! Director Cosinus of the + ! normal to the ground surface +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry density * grid volum +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! ref. state Virtual + ! Potential Temperature +! +REAL, DIMENSION(:,:), INTENT(IN) :: PSFTHM,PSFRM ! surface fluxes at time +! ! t - deltat +! +REAL, DIMENSION(:,:), INTENT(IN) :: PSFTHP,PSFRP ! surface fluxes at time +! ! t + deltat +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PWM +! Vertical wind +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM +! potential temperature at t-Delta t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Mixing ratios + ! at t-Delta t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! Mixing ratios +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! dissipative length +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exnref at time t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA ! coefficients between +REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! s and Thetal and Rnp +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM ! normalized + ! 2nd-order flux s'r'c/2Sigma_s2 at t-1 multiplied by Lambda_3 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PBETA ! buoyancy coefficient +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSQRT_TKE ! sqrt(e) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTH_DZ ! d(th)/dz +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDR_DZ ! d(rt)/dz +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRED2TH3 ! 3D Redeslperger number R*2_th +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRED2R3 ! 3D Redeslperger number R*2_r +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRED2THR3 ! 3D Redeslperger number R*2_thr +REAL, DIMENSION(:,:,:), INTENT(IN) :: PBLL_O_E ! beta * Lk * Leps / tke +REAL, DIMENSION(:,:,:), INTENT(IN) :: PETHETA ! Coefficient for theta in theta_v computation +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEMOIST ! Coefficient for r in theta_v computation +REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 ! 1D Redelsperger number for Th +REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 ! 1D Redelsperger number for r +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPHI3 ! Prandtl number for temperature +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPSI3 ! Prandtl number for vapor +REAL, DIMENSION(:,:,:), INTENT(IN) :: PD ! Denominator in Prandtl numbers +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFWTH ! d(w'2th' )/dz (at flux point) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFWR ! d(w'2r' )/dz (at flux point) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFTH2 ! d(w'th'2 )/dz (at mass point) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFR2 ! d(w'r'2 )/dz (at mass point) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFTHR ! d(w'th'r')/dz (at mass point) +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLP ! guess of thl at t+ deltat +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRP ! guess of r at t+ deltat +! +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSIGS ! Vert. part of Sigma_s at t +! +! +! +END SUBROUTINE TURB_VER_THERMO_CORR +! +END INTERFACE +! +END MODULE MODI_TURB_VER_THERMO_CORR +! +! +! ############################################################### + SUBROUTINE TURB_VER_THERMO_CORR(KKA,KKU,KKL,KRR, KRRL, KRRI, & + OTURB_FLX,HTURBDIM,HTOM, & + PIMPL,PEXPL, & + TPFILE, & + PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW, & + PRHODJ,PTHVREF, & + PSFTHM,PSFRM,PSFTHP,PSFRP, & + PWM,PTHLM,PRM,PSVM, & + PTKEM,PLM,PLEPS, & + PLOCPEXNM,PATHETA,PAMOIST,PSRCM, & + PBETA, PSQRT_TKE, PDTH_DZ, PDR_DZ, PRED2TH3, & + PRED2R3, PRED2THR3, PBLL_O_E, PETHETA, & + PEMOIST, PREDTH1, PREDR1, PPHI3, PPSI3, PD, & + PFWTH,PFWR,PFTH2,PFR2,PFTHR, & + PTHLP,PRP,PSIGS ) +! ############################################################### +! +! +!!**** *TURB_VER_THERMO_FLUX* -compute the source terms due to the vertical turbulent +!! fluxes. +!! +!! PURPOSE +!! ------- +! The purpose of this routine is to compute the vertical turbulent +! fluxes of the evolutive variables and give back the source +! terms to the main program. In the case of large horizontal meshes, +! the divergence of these vertical turbulent fluxes represent the whole +! effect of the turbulence but when the three-dimensionnal version of +! the turbulence scheme is activated (CTURBDIM="3DIM"), these divergences +! are completed in the next routine TURB_HOR. +! An arbitrary degree of implicitness has been implemented for the +! temporal treatment of these diffusion terms. +! The vertical boundary conditions are as follows: +! * at the bottom, the surface fluxes are prescribed at the same +! as the other turbulent fluxes +! * at the top, the turbulent fluxes are set to 0. +! It should be noted that the condensation has been implicitely included +! in this turbulence scheme by using conservative variables and computing +! the subgrid variance of a statistical variable s indicating the presence +! or not of condensation in a given mesh. +! +!!** METHOD +!! ------ +!! 1D type calculations are made; +!! The vertical turbulent fluxes are computed in an off-centered +!! implicit scheme (a Crank-Nicholson type with coefficients different +!! than 0.5), which allows to vary the degree of implicitness of the +!! formulation. +!! The different prognostic variables are treated one by one. +!! The contributions of each turbulent fluxes are cumulated into the +!! tendency PRvarS, and into the dynamic and thermal production of +!! TKE if necessary. +!! +!! In section 2 and 3, the thermodynamical fields are considered. +!! Only the turbulent fluxes of the conservative variables +!! (Thetal and Rnp stored in PRx(:,:,:,1)) are computed. +!! Note that the turbulent fluxes at the vertical +!! boundaries are given either by the soil scheme for the surface one +!! ( at the same instant as the others fluxes) and equal to 0 at the +!! top of the model. The thermal production is computed by vertically +!! averaging the turbulent flux and multiply this flux at the mass point by +!! a function ETHETA or EMOIST, which preform the transformation from the +!! conservative variables to the virtual potential temperature. +!! +!! In section 4, the variance of the statistical variable +!! s indicating presence or not of condensation, is determined in function +!! of the turbulent moments of the conservative variables and its +!! squarred root is stored in PSIGS. This information will be completed in +!! the horizontal turbulence if the turbulence dimensionality is not +!! equal to "1DIM". +!! +!! In section 5, the x component of the stress tensor is computed. +!! The surface flux <u'w'> is computed from the value of the surface +!! fluxes computed in axes linked to the orography ( i", j" , k"): +!! i" is parallel to the surface and in the direction of the maximum +!! slope +!! j" is also parallel to the surface and in the normal direction of +!! the maximum slope +!! k" is the normal to the surface +!! In order to prevent numerical instability, the implicit scheme has +!! been extended to the surface flux regarding to its dependence in +!! function of U. The dependence in function of the other components +!! introduced by the different rotations is only explicit. +!! The turbulent fluxes are used to compute the dynamic production of +!! TKE. For the last TKE level ( located at PDZZ(:,:,IKB)/2 from the +!! ground), an harmonic extrapolation from the dynamic production at +!! PDZZ(:,:,IKB) is used to avoid an evaluation of the gradient of U +!! in the surface layer. +!! +!! In section 6, the same steps are repeated but for the y direction +!! and in section 7, a diagnostic computation of the W variance is +!! performed. +!! +!! In section 8, the turbulent fluxes for the scalar variables are +!! computed by the same way as the conservative thermodynamical variables +!! +!! +!! EXTERNAL +!! -------- +!! GX_U_M, GY_V_M, GZ_W_M : cartesian gradient operators +!! GX_U_UW,GY_V_VW (X,Y,Z) represent the direction of the gradient +!! _(M,U,...)_ represent the localization of the +!! field to be derivated +!! _(M,UW,...) represent the localization of the +!! field derivated +!! +!! +!! MXM,MXF,MYM,MYF,MZM,MZF +!! : Shuman functions (mean operators) +!! DXF,DYF,DZF,DZM +!! : Shuman functions (difference operators) +!! +!! SUBROUTINE TRIDIAG : to compute the split implicit evolution +!! of a variable located at a mass point +!! +!! SUBROUTINE TRIDIAG_WIND: to compute the split implicit evolution +!! of a variable located at a wind point +!! +!! FUNCTIONs ETHETA and EMOIST : +!! allows to compute: +!! - the coefficients for the turbulent correlation between +!! any variable and the virtual potential temperature, of its +!! correlations with the conservative potential temperature and +!! the humidity conservative variable: +!! ------- ------- ------- +!! A' Thv' = ETHETA A' Thl' + EMOIST A' Rnp' +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST : contains physical constants +!! +!! XG : gravity constant +!! +!! Module MODD_CTURB: contains the set of constants for +!! the turbulence scheme +!! +!! XCMFS,XCMFB : cts for the momentum flux +!! XCSHF : ct for the sensible heat flux +!! XCHF : ct for the moisture flux +!! XCTV,XCHV : cts for the T and moisture variances +!! +!! Module MODD_PARAMETERS +!! +!! JPVEXT_TURB : number of vertical external points +!! JPHEXT : number of horizontal external points +!! +!! +!! REFERENCE +!! --------- +!! Book 1 of documentation (Chapter: Turbulence) +!! +!! AUTHOR +!! ------ +!! Joan Cuxart * INM and Meteo-France * +!! +!! MODIFICATIONS +!! ------------- +!! Original August 19, 1994 +!! Modifications: February 14, 1995 (J.Cuxart and J.Stein) +!! Doctorization and Optimization +!! Modifications: March 21, 1995 (J.M. Carriere) +!! Introduction of cloud water +!! Modifications: June 14, 1995 (J.Cuxart and J. Stein) +!! Phi3 and Psi3 at w-point + bug in the all +!! or nothing condens. +!! Modifications: Sept 15, 1995 (J.Cuxart and J. Stein) +!! Change the DP computation at the ground +!! Modifications: October 10, 1995 (J.Cuxart and J. Stein) +!! Psi for scal var and LES tools +!! Modifications: November 10, 1995 (J. Stein) +!! change the surface relations +!! Modifications: February 20, 1995 (J. Stein) optimization +!! Modifications: May 21, 1996 (J. Stein) +!! bug in the vertical flux of the V wind +!! component for explicit computation +!! Modifications: May 21, 1996 (N. wood) +!! modify the computation of the vertical +!! part or the surface tangential flux +!! Modifications: May 21, 1996 (P. Jabouille) +!! same modification in the Y direction +!! +!! Modifications: Sept 17, 1996 (J. Stein) change the moist case by using +!! Pi instead of Piref + use Atheta and Amoist +!! +!! Modifications: Nov 24, 1997 (V. Masson) removes the DO loops +!! Modifications: Mar 31, 1998 (V. Masson) splits the routine TURB_VER_THERMO_FLUX +!! Modifications: Oct 18, 2000 (V. Masson) LES computations +!! Modifications: Dec 01, 2000 (V. Masson) conservation of energy from +!! surface flux in 1DIM case +!! when slopes are present +!! Nov 06, 2002 (V. Masson) LES budgets +!! October 2009 (G. Tanguy) add ILENCH=LEN(YCOMMENT) after +!! change of YCOMMENT +!! 2012-02 (Y. Seity) add possibility to run with reversed +!! vertical levels +!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +!!-------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_CTURB +use modd_field, only: tfielddata, TYPEREAL +USE MODD_IO, ONLY: TFILEDATA +USE MODD_PARAMETERS +USE MODD_CONF +USE MODD_LES +! +USE MODI_GRADIENT_U +USE MODI_GRADIENT_V +USE MODI_GRADIENT_W +USE MODI_GRADIENT_M +USE MODI_SHUMAN +USE MODI_TRIDIAG +USE MODI_LES_MEAN_SUBGRID +USE MODI_PRANDTL +USE MODI_TRIDIAG_THERMO +! +USE MODE_IO_FIELD_WRITE, only: IO_Field_write +USE MODE_PRANDTL +! +USE MODI_SECOND_MNH +! +IMPLICIT NONE +! +!* 0.1 declarations of arguments +! +! +! +INTEGER, INTENT(IN) :: KKA !near ground array index +INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO +INTEGER, INTENT(IN) :: KRR ! number of moist var. +INTEGER, INTENT(IN) :: KRRL ! number of liquid water var. +INTEGER, INTENT(IN) :: KRRI ! number of ice water var. +LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the + ! turbulent fluxes in the syncronous FM-file +CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! dimensionality of the + ! turbulence scheme +CHARACTER(len=4), INTENT(IN) :: HTOM ! type of Third Order Moment +REAL, INTENT(IN) :: PIMPL, PEXPL ! Coef. for temporal disc. +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ, PDXX, PDYY, PDZX, PDZY + ! Metric coefficients +REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSZW ! Director Cosinus of the + ! normal to the ground surface +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry density * grid volum +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! ref. state Virtual + ! Potential Temperature +! +REAL, DIMENSION(:,:), INTENT(IN) :: PSFTHM,PSFRM ! surface fluxes at time +! ! t - deltat +! +REAL, DIMENSION(:,:), INTENT(IN) :: PSFTHP,PSFRP ! surface fluxes at time +! ! t + deltat +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PWM +! Vertical wind +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM +! potential temperature at t-Delta t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Mixing ratios + ! at t-Delta t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! Mixing ratios +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! dissipative length +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exnref at time t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA ! coefficients between +REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! s and Thetal and Rnp +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM ! normalized +! 2nd-order flux s'r'c/2Sigma_s2 at t-1 multiplied by Lambda_3 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PBETA ! buoyancy coefficient +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSQRT_TKE ! sqrt(e) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTH_DZ ! d(th)/dz +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDR_DZ ! d(rt)/dz +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRED2TH3 ! 3D Redeslperger number R*2_th +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRED2R3 ! 3D Redeslperger number R*2_r +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRED2THR3 ! 3D Redeslperger number R*2_thr +REAL, DIMENSION(:,:,:), INTENT(IN) :: PBLL_O_E ! beta * Lk * Leps / tke +REAL, DIMENSION(:,:,:), INTENT(IN) :: PETHETA ! Coefficient for theta in theta_v computation +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEMOIST ! Coefficient for r in theta_v computation +REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 ! 1D Redelsperger number for Th +REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 ! 1D Redelsperger number for r +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPHI3 ! Prandtl number for temperature +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPSI3 ! Prandtl number for vapor +REAL, DIMENSION(:,:,:), INTENT(IN) :: PD ! Denominator in Prandtl numbers +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFWTH ! d(w'2th' )/dz (at flux point) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFWR ! d(w'2r' )/dz (at flux point) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFTH2 ! d(w'th'2 )/dz (at mass point) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFR2 ! d(w'r'2 )/dz (at mass point) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFTHR ! d(w'th'r')/dz (at mass point) +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLP ! guess of thl at t+ deltat +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRP ! guess of r at t+ deltat +! +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSIGS ! Vert. part of Sigma_s at t +! +! +! +!* 0.2 declaration of local variables +! +! +REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: & + ZA, & ! work variable for wrc + ZFLXZ, & ! vertical flux of the treated variable + ZSOURCE, & ! source of evolution for the treated variable + ZKEFF, & ! effectif diffusion coeff = LT * SQRT( TKE ) + ZF, & ! Flux in dTh/dt =-dF/dz (evaluated at t-1)(or rt instead of Th) + ZDFDDTDZ, & ! dF/d(dTh/dz) + ZDFDDRDZ, & ! dF/d(dr/dz) + Z3RDMOMENT ! 3 order term in flux or variance equation +INTEGER :: IKB,IKE ! I index values for the Beginning and End + ! mass points of the domain in the 3 direct. +INTEGER :: I1,I2 ! For ZCOEFF allocation +REAL, DIMENSION(:,:,:),ALLOCATABLE :: ZCOEFF + ! coefficients for the uncentred gradient + ! computation near the ground +! +REAL :: ZTIME1, ZTIME2 +! +LOGICAL :: GUSERV ! flag to use water +LOGICAL :: GFTH2 ! flag to use w'th'2 +LOGICAL :: GFWTH ! flag to use w'2th' +LOGICAL :: GFR2 ! flag to use w'r'2 +LOGICAL :: GFWR ! flag to use w'2r' +LOGICAL :: GFTHR ! flag to use w'th'r' +TYPE(TFIELDDATA) :: TZFIELD +!---------------------------------------------------------------------------- +! +!* 1. PRELIMINARIES +! ------------- +! +IKB=KKA+JPVEXT_TURB*KKL +IKE=KKU-JPVEXT_TURB*KKL +I1=MIN(KKA+JPVEXT_TURB*KKL,KKA+JPVEXT_TURB*KKL+2*KKL) +I2=MAX(KKA+JPVEXT_TURB*KKL,KKA+JPVEXT_TURB*KKL+2*KKL) + +ALLOCATE(ZCOEFF(SIZE(PDZZ,1),SIZE(PDZZ,2),I1:I2)) +! +GUSERV = (KRR/=0) +! +! compute the coefficients for the uncentred gradient computation near the +! ground +ZCOEFF(:,:,IKB+2*KKL)= - PDZZ(:,:,IKB+KKL) / & + ( (PDZZ(:,:,IKB+2*KKL)+PDZZ(:,:,IKB+KKL)) * PDZZ(:,:,IKB+2*KKL) ) +ZCOEFF(:,:,IKB+KKL)= (PDZZ(:,:,IKB+2*KKL)+PDZZ(:,:,IKB+KKL)) / & + ( PDZZ(:,:,IKB+KKL) * PDZZ(:,:,IKB+2*KKL) ) +ZCOEFF(:,:,IKB)= - (PDZZ(:,:,IKB+2*KKL)+2.*PDZZ(:,:,IKB+KKL)) / & + ( (PDZZ(:,:,IKB+2*KKL)+PDZZ(:,:,IKB+KKL)) * PDZZ(:,:,IKB+KKL) ) +! +ZKEFF(:,:,:) = MZM( PLM(:,:,:) * SQRT(PTKEM(:,:,:)) ) +! +! Flags for 3rd order quantities +! +GFTH2 = .FALSE. +GFR2 = .FALSE. +GFTHR = .FALSE. +GFWTH = .FALSE. +GFWR = .FALSE. +! +IF (HTOM/='NONE') THEN + GFTH2 = ANY(PFTH2/=0.) + GFR2 = ANY(PFR2 /=0.) .AND. GUSERV + GFTHR = ANY(PFTHR/=0.) .AND. GUSERV + GFWTH = ANY(PFWTH/=0.) + GFWR = ANY(PFWR /=0.) .AND. GUSERV +END IF +!---------------------------------------------------------------------------- +! +! +!* 4. TURBULENT CORRELATIONS : <THl THl>, <THl Rnp>, <Rnp Rnp> +! -------------------------------------------------------- +! +! +!* 4.2 <THl THl> +! +! Compute the turbulent variance F and F' at time t-dt. + ZF (:,:,:) = XCTV*PLM*PLEPS*MZF(PPHI3*PDTH_DZ**2) + ZDFDDTDZ(:,:,:) = 0. ! this term, because of discretization, is treated separately + ! + ! Effect of 3rd order terms in temperature flux (at mass point) + ! + ! d(w'th'2)/dz + IF (GFTH2) THEN + ZF = ZF + M3_TH2_WTH2(PREDTH1,PREDR1,PD,PLEPS,& + & PSQRT_TKE) * PFTH2 + ZDFDDTDZ = ZDFDDTDZ + D_M3_TH2_WTH2_O_DDTDZ(PREDTH1,PREDR1,& + & PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA) * PFTH2 + END IF + ! + ! d(w'2th')/dz + IF (GFWTH) THEN + ZF = ZF + M3_TH2_W2TH(PREDTH1,PREDR1,PD,PDTH_DZ,& + & PLM,PLEPS,PTKEM) * MZF(PFWTH) + ZDFDDTDZ = ZDFDDTDZ + D_M3_TH2_W2TH_O_DDTDZ(PREDTH1,PREDR1,PD,& + & PLM,PLEPS,PTKEM,GUSERV) * MZF(PFWTH) + END IF + ! + IF (KRR/=0) THEN + ! d(w'r'2)/dz + IF (GFR2) THEN + ZF = ZF + M3_TH2_WR2(PD,PLEPS,PSQRT_TKE,PBLL_O_E,& + & PEMOIST,PDTH_DZ) * PFR2 + ZDFDDTDZ = ZDFDDTDZ + D_M3_TH2_WR2_O_DDTDZ(PREDTH1,PREDR1,PD,& + & PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTH_DZ) * PFR2 + END IF + ! + ! d(w'2r')/dz + IF (GFWR) THEN + ZF = ZF + M3_TH2_W2R(PD,PLM,PLEPS,PTKEM,PBLL_O_E,& + & PEMOIST,PDTH_DZ) * MZF(PFWR) + ZDFDDTDZ = ZDFDDTDZ + D_M3_TH2_W2R_O_DDTDZ(PREDTH1,PREDR1,PD,& + & PLM,PLEPS,PTKEM,PBLL_O_E,PEMOIST,PDTH_DZ) * MZF(PFWR) + END IF + ! + ! d(w'th'r')/dz + IF (GFTHR) THEN + ZF = ZF + M3_TH2_WTHR(PREDR1,PD,PLEPS,PSQRT_TKE,& + & PBLL_O_E,PEMOIST,PDTH_DZ) * PFTHR + ZDFDDTDZ = ZDFDDTDZ + D_M3_TH2_WTHR_O_DDTDZ(PREDTH1,PREDR1,& + & PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTH_DZ) * PFTHR + END IF + + END IF + ! + ZFLXZ(:,:,:) = ZF & + ! + PIMPL * XCTV*PLM*PLEPS & + ! *MZF(D_PHI3DTDZ2_O_DDTDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,PDTH_DZ,HTURBDIM,GUSERV) & + ! *DZM(PTHLP - PTHLM) / PDZZ ) & + + PIMPL * ZDFDDTDZ * MZF(DZM(PTHLP - PTHLM) / PDZZ ) + ! + ! special case near the ground ( uncentred gradient ) + ZFLXZ(:,:,IKB) = XCTV * PPHI3(:,:,IKB+KKL) * PLM(:,:,IKB) & + * PLEPS(:,:,IKB) & + *( PEXPL * & + ( ZCOEFF(:,:,IKB+2*KKL)*PTHLM(:,:,IKB+2*KKL) & + +ZCOEFF(:,:,IKB+KKL )*PTHLM(:,:,IKB+KKL ) & + +ZCOEFF(:,:,IKB )*PTHLM(:,:,IKB ) )**2 & + +PIMPL * & + ( ZCOEFF(:,:,IKB+2*KKL)*PTHLP(:,:,IKB+2*KKL) & + +ZCOEFF(:,:,IKB+KKL )*PTHLP(:,:,IKB+KKL ) & + +ZCOEFF(:,:,IKB )*PTHLP(:,:,IKB ) )**2 & + ) + ! + ZFLXZ(:,:,KKA) = ZFLXZ(:,:,IKB) + ! + ZFLXZ = MAX(0., ZFLXZ) + ! + IF (KRRL > 0) THEN + PSIGS(:,:,:) = ZFLXZ(:,:,:) * PATHETA(:,:,:)**2 + END IF + ! + ! + ! stores <THl THl> + IF ( OTURB_FLX .AND. tpfile%lopened ) THEN + TZFIELD%CMNHNAME = 'THL_VVAR' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'THL_VVAR' + TZFIELD%CUNITS = 'K2' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_THL_VVAR' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZFLXZ) + END IF +! +! and we store in LES configuration +! + IF (LLES_CALL) THEN + CALL SECOND_MNH(ZTIME1) + CALL LES_MEAN_SUBGRID( ZFLXZ, X_LES_SUBGRID_Thl2 ) + CALL LES_MEAN_SUBGRID( MZF(PWM)*ZFLXZ, X_LES_RES_W_SBG_Thl2 ) + CALL LES_MEAN_SUBGRID( -2.*XCTD*PSQRT_TKE*ZFLXZ/PLEPS, X_LES_SUBGRID_DISS_Thl2 ) + CALL LES_MEAN_SUBGRID( PETHETA*ZFLXZ, X_LES_SUBGRID_ThlThv ) + CALL LES_MEAN_SUBGRID( -XA3*PBETA*PETHETA*ZFLXZ, X_LES_SUBGRID_ThlPz, .TRUE. ) + CALL SECOND_MNH(ZTIME2) + XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 + END IF +! + IF ( KRR /= 0 ) THEN +! +!* 4.3 <THl Rnp> +! +! + ! Compute the turbulent variance F and F' at time t-dt. + ZF (:,:,:) = XCTV*PLM*PLEPS*MZF(0.5*(PPHI3+PPSI3)*PDTH_DZ*PDR_DZ) + ZDFDDTDZ(:,:,:) = 0. ! this term, because of discretization, is treated separately + ZDFDDRDZ(:,:,:) = 0. ! this term, because of discretization, is treated separately + ! + ! Effect of 3rd order terms in temperature flux (at mass point) + ! + ! d(w'th'2)/dz + IF (GFTH2) THEN + ZF = ZF + M3_THR_WTH2(PREDR1,PD,PLEPS,PSQRT_TKE,& + & PBLL_O_E,PETHETA,PDR_DZ) * PFTH2 + ZDFDDTDZ = ZDFDDTDZ + D_M3_THR_WTH2_O_DDTDZ(PREDTH1,PREDR1,& + & PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDR_DZ) * PFTH2 + ZDFDDRDZ = ZDFDDRDZ + D_M3_THR_WTH2_O_DDRDZ(PREDTH1,PREDR1,& + & PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA) * PFTH2 + END IF + ! + ! d(w'2th')/dz + IF (GFWTH) THEN + ZF = ZF + M3_THR_W2TH(PREDR1,PD,PLM,PLEPS,PTKEM,& + & PDR_DZ) * MZF(PFWTH) + ZDFDDTDZ = ZDFDDTDZ + D_M3_THR_W2TH_O_DDTDZ(PREDTH1,PREDR1,& + & PD,PLM,PLEPS,PTKEM,PBLL_O_E,PDR_DZ,PETHETA) * MZF(PFWTH) + ZDFDDRDZ = ZDFDDRDZ + D_M3_THR_W2TH_O_DDRDZ(PREDTH1,PREDR1,& + & PD,PLM,PLEPS,PTKEM) * MZF(PFWTH) + END IF + ! + ! d(w'r'2)/dz + IF (GFR2) THEN + ZF = ZF + M3_THR_WR2(PREDTH1,PD,PLEPS,PSQRT_TKE,& + & PBLL_O_E,PEMOIST,PDTH_DZ) * PFR2 + ZDFDDTDZ = ZDFDDTDZ + D_M3_THR_WR2_O_DDTDZ(PREDR1,PREDTH1,PD,& + & PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) * PFR2 + ZDFDDRDZ = ZDFDDRDZ + D_M3_THR_WR2_O_DDRDZ(PREDR1,PREDTH1,PD,& + & PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTH_DZ) * PFR2 + END IF + ! + ! d(w'2r')/dz + IF (GFWR) THEN + ZF = ZF + M3_THR_W2R(PREDTH1,PD,PLM,PLEPS,PTKEM,& + & PDTH_DZ) * MZF(PFWR) + ZDFDDTDZ = ZDFDDTDZ + D_M3_THR_W2R_O_DDTDZ(PREDR1,PREDTH1,PD,& + & PLM,PLEPS,PTKEM) * MZF(PFWR) + ZDFDDRDZ = ZDFDDRDZ + D_M3_THR_W2R_O_DDRDZ(PREDR1,PREDTH1,PD,& + & PLM,PLEPS,PTKEM,PBLL_O_E,PDTH_DZ,PEMOIST) * MZF(PFWR) + END IF + ! + ! d(w'th'r')/dz + IF (GFTHR) THEN + ZF = ZF + M3_THR_WTHR(PREDTH1,PREDR1,PD,PLEPS,& + & PSQRT_TKE) * PFTHR + ZDFDDTDZ = ZDFDDTDZ + D_M3_THR_WTHR_O_DDTDZ(PREDTH1,PREDR1,& + & PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA) * PFTHR + ZDFDDRDZ = ZDFDDRDZ + D_M3_THR_WTHR_O_DDRDZ(PREDR1,PREDTH1,& + & PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) * PFTHR + END IF + ! + ZFLXZ(:,:,:) = ZF & + + PIMPL * XCTV*PLM*PLEPS*0.5 & + * MZF( ( D_PHI3DTDZ_O_DDTDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,HTURBDIM,GUSERV) & ! d(phi3*dthdz)/ddthdz term + +D_PSI3DTDZ_O_DDTDZ(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,GUSERV) & ! d(psi3*dthdz)/ddthdz term + ) *PDR_DZ *DZM(PTHLP - PTHLM ) / PDZZ & + +( D_PHI3DRDZ_O_DDRDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,HTURBDIM,GUSERV) & ! d(phi3*drdz )/ddrdz term + +D_PSI3DRDZ_O_DDRDZ(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,GUSERV) & ! d(psi3*drdz )/ddrdz term + ) *PDTH_DZ *DZM(PRP - PRM(:,:,:,1)) / PDZZ & + ) & + + PIMPL * ZDFDDTDZ * MZF(DZM(PTHLP - PTHLM(:,:,:)) / PDZZ ) & + + PIMPL * ZDFDDRDZ * MZF(DZM(PRP - PRM(:,:,:,1)) / PDZZ ) + ! + ! special case near the ground ( uncentred gradient ) + ZFLXZ(:,:,IKB) = & + (XCHT1 * PPHI3(:,:,IKB+KKL) + XCHT2 * PPSI3(:,:,IKB+KKL)) & + *( PEXPL * & + ( ZCOEFF(:,:,IKB+2*KKL)*PTHLM(:,:,IKB+2*KKL) & + +ZCOEFF(:,:,IKB+KKL )*PTHLM(:,:,IKB+KKL ) & + +ZCOEFF(:,:,IKB )*PTHLM(:,:,IKB )) & + *( ZCOEFF(:,:,IKB+2*KKL)*PRM(:,:,IKB+2*KKL,1) & + +ZCOEFF(:,:,IKB+KKL )*PRM(:,:,IKB+KKL,1 ) & + +ZCOEFF(:,:,IKB )*PRM(:,:,IKB ,1 )) & + +PIMPL * & + ( ZCOEFF(:,:,IKB+2*KKL)*PTHLP(:,:,IKB+2*KKL) & + +ZCOEFF(:,:,IKB+KKL )*PTHLP(:,:,IKB+KKL ) & + +ZCOEFF(:,:,IKB )*PTHLP(:,:,IKB )) & + *( ZCOEFF(:,:,IKB+2*KKL)*PRP(:,:,IKB+2*KKL ) & + +ZCOEFF(:,:,IKB+KKL )*PRP(:,:,IKB+KKL ) & + +ZCOEFF(:,:,IKB )*PRP(:,:,IKB )) & + ) + ! + ZFLXZ(:,:,KKA) = ZFLXZ(:,:,IKB) + ! + IF ( KRRL > 0 ) THEN + PSIGS(:,:,:) = PSIGS(:,:,:) + & + 2. * PATHETA(:,:,:) * PAMOIST(:,:,:) * ZFLXZ(:,:,:) + END IF + ! stores <THl Rnp> + IF ( OTURB_FLX .AND. tpfile%lopened ) THEN + TZFIELD%CMNHNAME = 'THLRCONS_VCOR' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'THLRCONS_VCOR' + TZFIELD%CUNITS = 'K kg kg-1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_THLRCONS_VCOR' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZFLXZ) + END IF +! +! and we store in LES configuration +! + IF (LLES_CALL) THEN + CALL SECOND_MNH(ZTIME1) + CALL LES_MEAN_SUBGRID( ZFLXZ, X_LES_SUBGRID_THlRt ) + CALL LES_MEAN_SUBGRID( MZF(PWM)*ZFLXZ, X_LES_RES_W_SBG_ThlRt ) + CALL LES_MEAN_SUBGRID( -2.*XCTD*PSQRT_TKE*ZFLXZ/PLEPS, X_LES_SUBGRID_DISS_ThlRt ) + CALL LES_MEAN_SUBGRID( PETHETA*ZFLXZ, X_LES_SUBGRID_RtThv ) + CALL LES_MEAN_SUBGRID( -XA3*PBETA*PETHETA*ZFLXZ, X_LES_SUBGRID_RtPz, .TRUE. ) + CALL LES_MEAN_SUBGRID( PEMOIST*ZFLXZ, X_LES_SUBGRID_ThlThv , .TRUE. ) + CALL LES_MEAN_SUBGRID( -XA3*PBETA*PEMOIST*ZFLXZ, X_LES_SUBGRID_ThlPz, .TRUE. ) + CALL SECOND_MNH(ZTIME2) + XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 + END IF +! +! +!* 4.4 <Rnp Rnp> +! +! + ! Compute the turbulent variance F and F' at time t-dt. + ZF (:,:,:) = XCTV*PLM*PLEPS*MZF(PPSI3*PDR_DZ**2) + ZDFDDRDZ(:,:,:) = 0. ! this term, because of discretization, is treated separately + ! + ! Effect of 3rd order terms in temperature flux (at mass point) + ! + ! d(w'r'2)/dz + IF (GFR2) THEN + ZF = ZF + M3_R2_WR2(PREDR1,PREDTH1,PD,PLEPS,& + & PSQRT_TKE) * PFR2 + ZDFDDRDZ = ZDFDDRDZ + D_M3_R2_WR2_O_DDRDZ(PREDR1,PREDTH1,& + & PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) * PFR2 + END IF + ! + ! d(w'2r')/dz + IF (GFWR) THEN + ZF = ZF + M3_R2_W2R(PREDR1,PREDTH1,PD,PDR_DZ,& + & PLM,PLEPS,PTKEM) * MZF(PFWR) + ZDFDDRDZ = ZDFDDRDZ + D_M3_R2_W2R_O_DDRDZ(PREDR1,PREDTH1,& + & PD,PLM,PLEPS,PTKEM,GUSERV) * MZF(PFWR) + END IF + ! + IF (KRR/=0) THEN + ! d(w'r'2)/dz + IF (GFTH2) THEN + ZF = ZF + M3_R2_WTH2(PD,PLEPS,PSQRT_TKE,& + & PBLL_O_E,PETHETA,PDR_DZ) * PFTH2 + ZDFDDRDZ = ZDFDDRDZ + D_M3_R2_WTH2_O_DDRDZ(PREDR1,& + & PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDR_DZ) * PFTH2 + END IF + ! + ! d(w'2r')/dz + IF (GFWTH) THEN + ZF = ZF + M3_R2_W2TH(PD,PLM,PLEPS,PTKEM,& + & PBLL_O_E,PETHETA,PDR_DZ) * MZF(PFWTH) + ZDFDDRDZ = ZDFDDRDZ + D_M3_R2_W2TH_O_DDRDZ(PREDR1,PREDTH1,& + & PD,PLM,PLEPS,PTKEM,PBLL_O_E,PETHETA,PDR_DZ) * MZF(PFWTH) + END IF + ! + ! d(w'th'r')/dz + IF (GFTHR) THEN + ZF = ZF + M3_R2_WTHR(PREDTH1,PD,PLEPS,& + & PSQRT_TKE,PBLL_O_E,PETHETA,PDR_DZ) * PFTHR + ZDFDDRDZ = ZDFDDRDZ + D_M3_R2_WTHR_O_DDRDZ(PREDR1,PREDTH1,& + & PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDR_DZ) * PFTHR + END IF + + END IF + ! + ZFLXZ(:,:,:) = ZF & + + PIMPL * XCTV*PLM*PLEPS & + *MZF(D_PSI3DRDZ2_O_DDRDZ(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,PDR_DZ,HTURBDIM,GUSERV) & + *DZM(PRP - PRM(:,:,:,1)) / PDZZ ) & + + PIMPL * ZDFDDRDZ * MZF(DZM(PRP - PRM(:,:,:,1)) / PDZZ ) + ! + ! special case near the ground ( uncentred gradient ) + ZFLXZ(:,:,IKB) = XCHV * PPSI3(:,:,IKB+KKL) * PLM(:,:,IKB) & + * PLEPS(:,:,IKB) & + *( PEXPL * & + ( ZCOEFF(:,:,IKB+2*KKL)*PRM(:,:,IKB+2*KKL,1) & + +ZCOEFF(:,:,IKB+KKL )*PRM(:,:,IKB+KKL,1 ) & + +ZCOEFF(:,:,IKB )*PRM(:,:,IKB ,1 ))**2 & + +PIMPL * & + ( ZCOEFF(:,:,IKB+2*KKL)*PRP(:,:,IKB+2*KKL) & + +ZCOEFF(:,:,IKB+KKL )*PRP(:,:,IKB+KKL ) & + +ZCOEFF(:,:,IKB )*PRP(:,:,IKB ))**2 & + ) + ! + ZFLXZ(:,:,KKA) = ZFLXZ(:,:,IKB) + ! + IF ( KRRL > 0 ) THEN + PSIGS(:,:,:) = PSIGS(:,:,:) + PAMOIST(:,:,:) **2 * ZFLXZ(:,:,:) + END IF + ! stores <Rnp Rnp> + IF ( OTURB_FLX .AND. tpfile%lopened ) THEN + TZFIELD%CMNHNAME = 'RTOT_VVAR' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'RTOT_VVAR' + TZFIELD%CUNITS = 'kg2 kg-2' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_RTOT_VVAR' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZFLXZ) + END IF + ! + ! and we store in LES configuration + ! + IF (LLES_CALL) THEN + CALL SECOND_MNH(ZTIME1) + CALL LES_MEAN_SUBGRID( ZFLXZ, X_LES_SUBGRID_Rt2 ) + CALL LES_MEAN_SUBGRID( MZF(PWM)*ZFLXZ, X_LES_RES_W_SBG_Rt2 ) + CALL LES_MEAN_SUBGRID( PEMOIST*ZFLXZ, X_LES_SUBGRID_RtThv , .TRUE. ) + CALL LES_MEAN_SUBGRID( -XA3*PBETA*PEMOIST*ZFLXZ, X_LES_SUBGRID_RtPz, .TRUE. ) + CALL LES_MEAN_SUBGRID( -2.*XCTD*PSQRT_TKE*ZFLXZ/PLEPS, X_LES_SUBGRID_DISS_Rt2 ) + CALL SECOND_MNH(ZTIME2) + XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 + END IF + ! + END IF ! end if KRR ne 0 +! +! +! 4.5 Vertical part of Sigma_s +! + IF ( KRRL > 0 ) THEN + ! Extrapolate PSIGS at the ground and at the top + PSIGS(:,:,KKA) = PSIGS(:,:,IKB) + PSIGS(:,:,KKU) = PSIGS(:,:,IKE) + PSIGS(:,:,:) = SQRT( MAX (PSIGS(:,:,:) , 1.E-12) ) + END IF + +! +! 4.6 Deallocate +! + DEALLOCATE(ZCOEFF) +!---------------------------------------------------------------------------- +END SUBROUTINE TURB_VER_THERMO_CORR diff --git a/src/mesonh/turb/turb_ver_thermo_flux.f90 b/src/mesonh/turb/turb_ver_thermo_flux.f90 new file mode 100644 index 000000000..cf539984e --- /dev/null +++ b/src/mesonh/turb/turb_ver_thermo_flux.f90 @@ -0,0 +1,1109 @@ +!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! #################### + MODULE MODI_TURB_VER_THERMO_FLUX +! #################### +! +INTERFACE +! + SUBROUTINE TURB_VER_THERMO_FLUX(KKA,KKU,KKL,KRR,KRRL,KRRI, & + OTURB_FLX,HTURBDIM,HTOM, & + PIMPL,PEXPL, & + PTSTEP, & + TPFILE, & + PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ, & + PRHODJ,PTHVREF, & + PSFTHM,PSFRM,PSFTHP,PSFRP, & + PWM,PTHLM,PRM,PSVM, & + PTKEM,PLM,PLEPS, & + PLOCPEXNM,PATHETA,PAMOIST,PSRCM,PFRAC_ICE, & + PBETA, PSQRT_TKE, PDTH_DZ, PDR_DZ, PRED2TH3, & + PRED2R3, PRED2THR3, PBLL_O_E, PETHETA, & + PEMOIST, PREDTH1, PREDR1, PPHI3, PPSI3, PD, & + PFWTH,PFWR,PFTH2,PFR2,PFTHR,PBL_DEPTH, & + PWTHV,PRTHLS,PRRS,PTHLP,PRP,PTP,PWTH,PWRC ) +! +USE MODD_IO, ONLY: TFILEDATA +! +INTEGER, INTENT(IN) :: KKA !near ground array index +INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=AR O +INTEGER, INTENT(IN) :: KRR ! number of moist var. +INTEGER, INTENT(IN) :: KRRL ! number of liquid water var. +INTEGER, INTENT(IN) :: KRRI ! number of ice water var. +LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the + ! turbulent fluxes in the syncronous FM-file +CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! dimensionality of the + ! turbulence scheme +CHARACTER(len=4), INTENT(IN) :: HTOM ! type of Third Order Moment +REAL, INTENT(IN) :: PIMPL, PEXPL ! Coef. for temporal disc. +REAL, INTENT(IN) :: PTSTEP ! Double Time Step +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ, PDXX, PDYY, PDZX, PDZY + ! Metric coefficients +REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSZW ! Director Cosinus of the + ! normal to the ground surface +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! altitudes +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry density * grid volum +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! ref. state Virtual + ! Potential Temperature +! +REAL, DIMENSION(:,:), INTENT(IN) :: PSFTHM,PSFRM ! surface fluxes at time +! ! t - deltat +! +REAL, DIMENSION(:,:), INTENT(IN) :: PSFTHP,PSFRP ! surface fluxes at time +! ! t + deltat +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PWM +! Vertical wind +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM +! potential temperature at t-Delta t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Mixing ratios + ! at t-Delta t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! Mixing ratios +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! dissipative length +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exnref at time t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA ! coefficients between +REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! s and Thetal and Rnp +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM ! normalized + ! 2nd-order flux s'r'c/2Sigma_s2 at t-1 multiplied by Lambda_3 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFRAC_ICE ! ri fraction of rc+ri +REAL, DIMENSION(:,:,:), INTENT(IN) :: PBETA ! buoyancy coefficient +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSQRT_TKE ! sqrt(e) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTH_DZ ! d(th)/dz +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDR_DZ ! d(rt)/dz +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRED2TH3 ! 3D Redeslperger number R*2_th +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRED2R3 ! 3D Redeslperger number R*2_r +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRED2THR3 ! 3D Redeslperger number R*2_thr +REAL, DIMENSION(:,:,:), INTENT(IN) :: PBLL_O_E ! beta * Lk * Leps / tke +REAL, DIMENSION(:,:,:), INTENT(IN) :: PETHETA ! Coefficient for theta in theta_v computation +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEMOIST ! Coefficient for r in theta_v computation +REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 ! 1D Redelsperger number for Th +REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 ! 1D Redelsperger number for r +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPHI3 ! Prandtl number for temperature +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPSI3 ! Prandtl number for vapor +REAL, DIMENSION(:,:,:), INTENT(IN) :: PD ! Denominator in Prandtl numbers +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFWTH ! d(w'2th' )/dz (at flux point) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFWR ! d(w'2r' )/dz (at flux point) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFTH2 ! d(w'th'2 )/dz (at mass point) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFR2 ! d(w'r'2 )/dz (at mass point) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFTHR ! d(w'th'r')/dz (at mass point) +REAL, DIMENSION(:,:), INTENT(INOUT):: PBL_DEPTH ! BL depth +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWTHV ! buoyancy flux +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRTHLS ! cumulated source for theta +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS ! cumulated source for rt +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTHLP ! guess of thl at t+ deltat +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRP ! guess of r at t+ deltat +! +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTP ! Dynamic and thermal + ! TKE production terms +! +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWTH ! heat flux +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWRC ! cloud water flux +! +! +END SUBROUTINE TURB_VER_THERMO_FLUX +! +END INTERFACE +! +END MODULE MODI_TURB_VER_THERMO_FLUX +! +! +! ############################################################### + SUBROUTINE TURB_VER_THERMO_FLUX(KKA,KKU,KKL,KRR, KRRL, KRRI, & + OTURB_FLX,HTURBDIM,HTOM, & + PIMPL,PEXPL, & + PTSTEP, & + TPFILE, & + PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ, & + PRHODJ,PTHVREF, & + PSFTHM,PSFRM,PSFTHP,PSFRP, & + PWM,PTHLM,PRM,PSVM, & + PTKEM,PLM,PLEPS, & + PLOCPEXNM,PATHETA,PAMOIST,PSRCM,PFRAC_ICE, & + PBETA, PSQRT_TKE, PDTH_DZ, PDR_DZ, PRED2TH3, & + PRED2R3, PRED2THR3, PBLL_O_E, PETHETA, & + PEMOIST, PREDTH1, PREDR1, PPHI3, PPSI3, PD, & + PFWTH,PFWR,PFTH2,PFR2,PFTHR,PBL_DEPTH, & + PWTHV,PRTHLS,PRRS,PTHLP,PRP,PTP,PWTH,PWRC ) +! ############################################################### +! +! +!!**** *TURB_VER_THERMO_FLUX* -compute the source terms due to the vertical turbulent +!! fluxes. +!! +!! PURPOSE +!! ------- +! The purpose of this routine is to compute the vertical turbulent +! fluxes of the evolutive variables and give back the source +! terms to the main program. In the case of large horizontal meshes, +! the divergence of these vertical turbulent fluxes represent the whole +! effect of the turbulence but when the three-dimensionnal version of +! the turbulence scheme is activated (CTURBDIM="3DIM"), these divergences +! are completed in the next routine TURB_HOR. +! An arbitrary degree of implicitness has been implemented for the +! temporal treatment of these diffusion terms. +! The vertical boundary conditions are as follows: +! * at the bottom, the surface fluxes are prescribed at the same +! as the other turbulent fluxes +! * at the top, the turbulent fluxes are set to 0. +! It should be noted that the condensation has been implicitely included +! in this turbulence scheme by using conservative variables and computing +! the subgrid variance of a statistical variable s indicating the presence +! or not of condensation in a given mesh. +! +!!** METHOD +!! ------ +!! 1D type calculations are made; +!! The vertical turbulent fluxes are computed in an off-centered +!! implicit scheme (a Crank-Nicholson type with coefficients different +!! than 0.5), which allows to vary the degree of implicitness of the +!! formulation. +!! The different prognostic variables are treated one by one. +!! The contributions of each turbulent fluxes are cumulated into the +!! tendency PRvarS, and into the dynamic and thermal production of +!! TKE if necessary. +!! +!! In section 2 and 3, the thermodynamical fields are considered. +!! Only the turbulent fluxes of the conservative variables +!! (Thetal and Rnp stored in PRx(:,:,:,1)) are computed. +!! Note that the turbulent fluxes at the vertical +!! boundaries are given either by the soil scheme for the surface one +!! ( at the same instant as the others fluxes) and equal to 0 at the +!! top of the model. The thermal production is computed by vertically +!! averaging the turbulent flux and multiply this flux at the mass point by +!! a function ETHETA or EMOIST, which preform the transformation from the +!! conservative variables to the virtual potential temperature. +!! +!! In section 4, the variance of the statistical variable +!! s indicating presence or not of condensation, is determined in function +!! of the turbulent moments of the conservative variables and its +!! squarred root is stored in PSIGS. This information will be completed in +!! the horizontal turbulence if the turbulence dimensionality is not +!! equal to "1DIM". +!! +!! In section 5, the x component of the stress tensor is computed. +!! The surface flux <u'w'> is computed from the value of the surface +!! fluxes computed in axes linked to the orography ( i", j" , k"): +!! i" is parallel to the surface and in the direction of the maximum +!! slope +!! j" is also parallel to the surface and in the normal direction of +!! the maximum slope +!! k" is the normal to the surface +!! In order to prevent numerical instability, the implicit scheme has +!! been extended to the surface flux regarding to its dependence in +!! function of U. The dependence in function of the other components +!! introduced by the different rotations is only explicit. +!! The turbulent fluxes are used to compute the dynamic production of +!! TKE. For the last TKE level ( located at PDZZ(:,:,IKB)/2 from the +!! ground), an harmonic extrapolation from the dynamic production at +!! PDZZ(:,:,IKB) is used to avoid an evaluation of the gradient of U +!! in the surface layer. +!! +!! In section 6, the same steps are repeated but for the y direction +!! and in section 7, a diagnostic computation of the W variance is +!! performed. +!! +!! In section 8, the turbulent fluxes for the scalar variables are +!! computed by the same way as the conservative thermodynamical variables +!! +!! +!! EXTERNAL +!! -------- +!! GX_U_M, GY_V_M, GZ_W_M : cartesian gradient operators +!! GX_U_UW,GY_V_VW (X,Y,Z) represent the direction of the gradient +!! _(M,U,...)_ represent the localization of the +!! field to be derivated +!! _(M,UW,...) represent the localization of the +!! field derivated +!! +!! +!! MXM,MXF,MYM,MYF,MZM,MZF +!! : Shuman functions (mean operators) +!! DXF,DYF,DZF,DZM +!! : Shuman functions (difference operators) +!! +!! SUBROUTINE TRIDIAG : to compute the split implicit evolution +!! of a variable located at a mass point +!! +!! SUBROUTINE TRIDIAG_WIND: to compute the split implicit evolution +!! of a variable located at a wind point +!! +!! FUNCTIONs ETHETA and EMOIST : +!! allows to compute: +!! - the coefficients for the turbulent correlation between +!! any variable and the virtual potential temperature, of its +!! correlations with the conservative potential temperature and +!! the humidity conservative variable: +!! ------- ------- ------- +!! A' Thv' = ETHETA A' Thl' + EMOIST A' Rnp' +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST : contains physical constants +!! +!! XG : gravity constant +!! +!! Module MODD_CTURB: contains the set of constants for +!! the turbulence scheme +!! +!! XCMFS,XCMFB : cts for the momentum flux +!! XCSHF : ct for the sensible heat flux +!! XCHF : ct for the moisture flux +!! XCTV,XCHV : cts for the T and moisture variances +!! +!! Module MODD_PARAMETERS +!! +!! JPVEXT_TURB : number of vertical external points +!! JPHEXT : number of horizontal external points +!! +!! +!! REFERENCE +!! --------- +!! Book 1 of documentation (Chapter: Turbulence) +!! +!! AUTHOR +!! ------ +!! Joan Cuxart * INM and Meteo-France * +!! +!! MODIFICATIONS +!! ------------- +!! Original August 19, 1994 +!! Modifications: February 14, 1995 (J.Cuxart and J.Stein) +!! Doctorization and Optimization +!! Modifications: March 21, 1995 (J.M. Carriere) +!! Introduction of cloud water +!! Modifications: June 14, 1995 (J.Cuxart and J. Stein) +!! Phi3 and Psi3 at w-point + bug in the all +!! or nothing condens. +!! Modifications: Sept 15, 1995 (J.Cuxart and J. Stein) +!! Change the DP computation at the ground +!! Modifications: October 10, 1995 (J.Cuxart and J. Stein) +!! Psi for scal var and LES tools +!! Modifications: November 10, 1995 (J. Stein) +!! change the surface relations +!! Modifications: February 20, 1995 (J. Stein) optimization +!! Modifications: May 21, 1996 (J. Stein) +!! bug in the vertical flux of the V wind +!! component for explicit computation +!! Modifications: May 21, 1996 (N. wood) +!! modify the computation of the vertical +!! part or the surface tangential flux +!! Modifications: May 21, 1996 (P. Jabouille) +!! same modification in the Y direction +!! +!! Modifications: Sept 17, 1996 (J. Stein) change the moist case by using +!! Pi instead of Piref + use Atheta and Amoist +!! +!! Modifications: Nov 24, 1997 (V. Masson) removes the DO loops +!! Modifications: Mar 31, 1998 (V. Masson) splits the routine TURB_VER_THERMO_FLUX +!! Modifications: Oct 18, 2000 (V. Masson) LES computations +!! Modifications: Dec 01, 2000 (V. Masson) conservation of energy from +!! surface flux in 1DIM case +!! when slopes are present +!! Nov 06, 2002 (V. Masson) LES budgets +!! Feb 20, 2003 (JP Pinty) Add PFRAC_ICE +!! May 20, 2003 (JP Pinty) Correction of ETHETA +!! and EMOIST calls +!! July 2005 (S. Tomas, V. Masson) +!! Add 3rd order moments +!! and implicitation of PHI3 and PSI3 +!! October 2009 (G. Tanguy) add ILENCH=LEN(YCOMMENT) after +!! change of YCOMMENT +!! 2012-02 (Y. Seity) add possibility to run with reversed +!! vertical levels +!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +!! 2021 (D. Ricard) last version of HGRAD turbulence scheme +!! Leronard terms instead of Reynolds terms +!! applied to vertical fluxes of r_np and Thl +!! for implicit version of turbulence scheme +!! corrections and cleaning +!! June 2020 (B. Vie) Patch preventing negative rc and ri in 2.3 and 3.3 +!! JL Redelsperger : 03/2021: Ocean and Autocoupling O-A LES Cases +!! Sfc flux shape for LDEEPOC Case +!!-------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_CTURB +use modd_field, only: tfielddata, TYPEREAL +USE MODD_GRID_n, ONLY: XZS, XXHAT, XYHAT +USE MODD_IO, ONLY: TFILEDATA +USE MODD_METRICS_n, ONLY: XDXX, XDYY, XDZX, XDZY, XDZZ +USE MODD_PARAMETERS +USE MODD_TURB_n, ONLY: LHGRAD, XCOEFHGRADTHL, XCOEFHGRADRM, XALTHGRAD, XCLDTHOLD +USE MODD_CONF +USE MODD_LES +USE MODD_DIM_n +USE MODD_DYN_n, ONLY: LOCEAN +USE MODD_OCEANH +USE MODD_REF, ONLY: LCOUPLES +USE MODD_TURB_n +USE MODD_FRC +! +USE MODI_GRADIENT_U +USE MODI_GRADIENT_V +USE MODI_GRADIENT_W +USE MODI_GRADIENT_M +USE MODI_GRADIENT_UV +USE MODI_GRADIENT_UW +USE MODI_GRADIENT_VW +USE MODI_SHUMAN +USE MODI_TRIDIAG +USE MODI_LES_MEAN_SUBGRID +USE MODI_PRANDTL +USE MODI_TRIDIAG_THERMO +USE MODI_TM06_H +! +USE MODE_IO_FIELD_WRITE, only: IO_Field_write +USE MODE_PRANDTL +! +USE MODI_SECOND_MNH +USE MODE_ll +USE MODE_GATHER_ll +! +IMPLICIT NONE +! +!* 0.1 declarations of arguments +! +! +! +INTEGER, INTENT(IN) :: KKA !near ground array index +INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO +INTEGER, INTENT(IN) :: KRR ! number of moist var. +INTEGER, INTENT(IN) :: KRRL ! number of liquid water var. +INTEGER, INTENT(IN) :: KRRI ! number of ice water var. +LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the + ! turbulent fluxes in the syncronous FM-file +CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! dimensionality of the + ! turbulence scheme +CHARACTER(len=4), INTENT(IN) :: HTOM ! type of Third Order Moment +REAL, INTENT(IN) :: PIMPL, PEXPL ! Coef. for temporal disc. +REAL, INTENT(IN) :: PTSTEP ! Double Time Step +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ, PDXX, PDYY, PDZX, PDZY + ! Metric coefficients +REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSZW ! Director Cosinus of the + ! normal to the ground surface +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! altitudes +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry density * grid volum +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! ref. state Virtual + ! Potential Temperature +! +REAL, DIMENSION(:,:), INTENT(IN) :: PSFTHM,PSFRM ! surface fluxes at time +! ! t - deltat +! +REAL, DIMENSION(:,:), INTENT(IN) :: PSFTHP,PSFRP ! surface fluxes at time +! ! t + deltat +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PWM +! Vertical wind +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM +! potential temperature at t-Delta t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Mixing ratios + ! at t-Delta t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! Mixing ratios +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! dissipative length +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exnref at time t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA ! coefficients between +REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! s and Thetal and Rnp +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM ! normalized +! 2nd-order flux s'r'c/2Sigma_s2 at t-1 multiplied by Lambda_3 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFRAC_ICE ! ri fraction of rc+ri +REAL, DIMENSION(:,:,:), INTENT(IN) :: PBETA ! buoyancy coefficient +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSQRT_TKE ! sqrt(e) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTH_DZ ! d(th)/dz +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDR_DZ ! d(rt)/dz +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRED2TH3 ! 3D Redeslperger number R*2_th +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRED2R3 ! 3D Redeslperger number R*2_r +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRED2THR3 ! 3D Redeslperger number R*2_thr +REAL, DIMENSION(:,:,:), INTENT(IN) :: PBLL_O_E ! beta * Lk * Leps / tke +REAL, DIMENSION(:,:,:), INTENT(IN) :: PETHETA ! Coefficient for theta in theta_v computation +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEMOIST ! Coefficient for r in theta_v computation +REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 ! 1D Redelsperger number for Th +REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 ! 1D Redelsperger number for r +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPHI3 ! Prandtl number for temperature +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPSI3 ! Prandtl number for vapor +REAL, DIMENSION(:,:,:), INTENT(IN) :: PD ! Denominator in Prandtl numbers +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFWTH ! d(w'2th' )/dz (at flux point) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFWR ! d(w'2r' )/dz (at flux point) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFTH2 ! d(w'th'2 )/dz (at mass point) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFR2 ! d(w'r'2 )/dz (at mass point) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PFTHR ! d(w'th'r')/dz (at mass point) +REAL, DIMENSION(:,:), INTENT(INOUT):: PBL_DEPTH ! BL depth +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWTHV ! buoyancy flux +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRTHLS ! cumulated source for theta +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS ! cumulated source for rt +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTHLP ! guess of thl at t+ deltat +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRP ! guess of r at t+ deltat +! +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTP ! Dynamic and thermal + ! TKE production terms +! +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWTH ! heat flux +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWRC ! cloud water flux +! +! +!* 0.2 declaration of local variables +! +! +REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: & + ZA, & ! work variable for wrc or LES computation + ZFLXZ, & ! vertical flux of the treated variable + ZSOURCE, & ! source of evolution for the treated variable + ZKEFF, & ! effectif diffusion coeff = LT * SQRT( TKE ) + ZF, & ! Flux in dTh/dt =-dF/dz (evaluated at t-1)(or rt instead of Th) + ZDFDDTDZ, & ! dF/d(dTh/dz) + ZDFDDRDZ, & ! dF/d(dr/dz) + Z3RDMOMENT,& ! 3 order term in flux or variance equation + ZF_NEW, & + ZRWTHL, & + ZRWRNP, & + ZCLD_THOLD +! +REAL,DIMENSION(SIZE(XZS,1),SIZE(XZS,2),KKU) :: ZALT +! +INTEGER :: IKB,IKE ! I index values for the Beginning and End + ! mass points of the domain in the 3 direct. +INTEGER :: IKT ! array size in k direction +INTEGER :: IKTB,IKTE ! start, end of k loops in physical domain +INTEGER :: JI, JJ ! loop indexes +! +! +INTEGER :: IIB,IJB ! Lower bounds of the physical + ! sub-domain in x and y directions +INTEGER :: IIE,IJE ! Upper bounds of the physical + ! sub-domain in x and y directions +! +REAL, DIMENSION(:), ALLOCATABLE :: ZXHAT_ll ! Position x in the conformal + ! plane (array on the complete domain) +REAL, DIMENSION(:), ALLOCATABLE :: ZYHAT_ll ! Position y in the conformal + ! plane (array on the complete domain) +! +! +CHARACTER (LEN=100) :: YCOMMENT ! comment string in LFIFM file +CHARACTER (LEN=LEN_HREC) :: YRECFM ! Name of the desired field in LFIFM file +! +REAL :: ZTIME1, ZTIME2 +REAL :: ZDELTAX +REAL :: ZXBEG,ZXEND,ZYBEG,ZYEND ! Forcing size for ocean deep convection +REAL, DIMENSION(SIZE(XXHAT),SIZE(XYHAT)) :: ZDIST ! distance + ! from the center of the cooling +REAL :: ZFLPROV +INTEGER :: JKM ! vertical index loop +INTEGER :: JSW +REAL :: ZSWA ! index for time flux interpolation +! +INTEGER :: IIU, IJU +INTEGER :: IRESP +INTEGER :: JK +LOGICAL :: GUSERV ! flag to use water +LOGICAL :: GFTH2 ! flag to use w'th'2 +LOGICAL :: GFWTH ! flag to use w'2th' +LOGICAL :: GFR2 ! flag to use w'r'2 +LOGICAL :: GFWR ! flag to use w'2r' +LOGICAL :: GFTHR ! flag to use w'th'r' +TYPE(TFIELDDATA) :: TZFIELD +!---------------------------------------------------------------------------- +! +!* 1. PRELIMINARIES +! ------------- +! Size for a given proc & a given model +IIU=SIZE(PTHLM,1) +IJU=SIZE(PTHLM,2) +! +!! Compute Shape of sfc flux for Oceanic Deep Conv Case +! +IF (LOCEAN .AND. LDEEPOC) THEN + !* COMPUTES THE PHYSICAL SUBDOMAIN BOUNDS + ALLOCATE(ZXHAT_ll(NIMAX_ll+2*JPHEXT),ZYHAT_ll(NJMAX_ll+2*JPHEXT)) + !compute ZXHAT_ll = position in the (0:Lx) domain 1 (Lx=Size of domain1 ) + !compute XXHAT_ll = position in the (L0_subproc,Lx_subproc) domain for the current subproc + ! L0_subproc as referenced in the full domain 1 + CALL GATHERALL_FIELD_ll('XX',XXHAT,ZXHAT_ll,IRESP) + CALL GATHERALL_FIELD_ll('YY',XYHAT,ZYHAT_ll,IRESP) + CALL GET_DIM_EXT_ll('B',IIU,IJU) + CALL GET_INDICE_ll(IIB,IJB,IIE,IJE) + DO JJ = IJB,IJE + DO JI = IIB,IIE + ZDIST(JI,JJ) = SQRT( & + (( (XXHAT(JI)+XXHAT(JI+1))*0.5 - XCENTX_OC ) / XRADX_OC)**2 + & + (( (XYHAT(JJ)+XYHAT(JJ+1))*0.5 - XCENTY_OC ) / XRADY_OC)**2 & + ) + END DO + END DO + DO JJ=IJB,IJE + DO JI=IIB,IIE + IF ( ZDIST(JI,JJ) > 1.) XSSTFL(JI,JJ)=0. + END DO + END DO +END IF !END DEEP OCEAN CONV CASE +! +IKT =SIZE(PTHLM,3) +IKTE =IKT-JPVEXT_TURB +IKTB =1+JPVEXT_TURB +IKB=KKA+JPVEXT_TURB*KKL +IKE=KKU-JPVEXT_TURB*KKL +! +GUSERV = (KRR/=0) +! +! compute the coefficients for the uncentred gradient computation near the +! ground +! +ZKEFF(:,:,:) = MZM( PLM(:,:,:) * SQRT(PTKEM(:,:,:)) ) +! +! define a cloud mask with ri and rc (used after with a threshold) for Leonard terms +! +IF(LHGRAD) THEN + IF ( KRRL >= 1 ) THEN + IF ( KRRI >= 1 ) THEN + ZCLD_THOLD(:,:,:) = PRM(:,:,:,2) + PRM(:,:,:,4) + ELSE + ZCLD_THOLD(:,:,:) = PRM(:,:,:,2) + END IF + END IF +END IF +! +! Flags for 3rd order quantities +! +GFTH2 = .FALSE. +GFR2 = .FALSE. +GFTHR = .FALSE. +GFWTH = .FALSE. +GFWR = .FALSE. +! +IF (HTOM/='NONE') THEN + GFTH2 = ANY(PFTH2/=0.) + GFR2 = ANY(PFR2 /=0.) .AND. GUSERV + GFTHR = ANY(PFTHR/=0.) .AND. GUSERV + GFWTH = ANY(PFWTH/=0.) + GFWR = ANY(PFWR /=0.) .AND. GUSERV +END IF +!---------------------------------------------------------------------------- +! +!* 2. SOURCES OF CONSERVATIVE POTENTIAL TEMPERATURE AND +! PARTIAL THERMAL PRODUCTION +! --------------------------------------------------------------- +! +!* 2.1 Splitted value for cons. potential temperature at t+deltat +! +! Compute the turbulent flux F and F' at time t-dt. +! +ZF (:,:,:) = -XCSHF*PPHI3*ZKEFF*DZM(PTHLM)/PDZZ +ZDFDDTDZ(:,:,:) = -XCSHF*ZKEFF*D_PHI3DTDZ_O_DDTDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,HTURBDIM,GUSERV) +! +IF (LHGRAD) THEN + ! Compute the Leonard terms for thl + ZDELTAX= XXHAT(3) - XXHAT(2) + ZF_NEW (:,:,:)= XCOEFHGRADTHL*ZDELTAX*ZDELTAX/12.0*( & + MXF(GX_W_UW(PWM(:,:,:), XDXX, XDZZ, XDZX))& + *MZM(GX_M_M(PTHLM(:,:,:),XDXX,XDZZ,XDZX)) & + + MYF(GY_W_VW(PWM(:,:,:), XDYY,XDZZ,XDZY)) & + *MZM(GY_M_M(PTHLM(:,:,:),XDYY,XDZZ,XDZY)) ) +END IF +! +! Effect of 3rd order terms in temperature flux (at flux point) +! +! d(w'2th')/dz +IF (GFWTH) THEN + Z3RDMOMENT= M3_WTH_W2TH(PREDTH1,PREDR1,PD,ZKEFF,PTKEM) +! + ZF = ZF + Z3RDMOMENT * PFWTH + ZDFDDTDZ = ZDFDDTDZ + D_M3_WTH_W2TH_O_DDTDZ(PREDTH1,PREDR1,& + & PD,PBLL_O_E,PETHETA,ZKEFF,PTKEM) * PFWTH +END IF +! +! d(w'th'2)/dz +IF (GFTH2) THEN + Z3RDMOMENT= M3_WTH_WTH2(PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA) +! + ZF = ZF + Z3RDMOMENT * MZM(PFTH2) + ZDFDDTDZ = ZDFDDTDZ + D_M3_WTH_WTH2_O_DDTDZ(Z3RDMOMENT,PREDTH1,PREDR1,& + & PD,PBLL_O_E,PETHETA) * MZM(PFTH2) +END IF +! +! d(w'2r')/dz +IF (GFWR) THEN + ZF = ZF + M3_WTH_W2R(PD,ZKEFF,& + & PTKEM,PBLL_O_E,PEMOIST,PDTH_DZ) * PFWR + ZDFDDTDZ = ZDFDDTDZ + D_M3_WTH_W2R_O_DDTDZ(PREDTH1,PREDR1,& + & PD,ZKEFF,PTKEM,PBLL_O_E,PEMOIST) * PFWR +END IF +! +! d(w'r'2)/dz +IF (GFR2) THEN + ZF = ZF + M3_WTH_WR2(PD,ZKEFF,PTKEM,& + & PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PEMOIST,PDTH_DZ) * MZM(PFR2) + ZDFDDTDZ = ZDFDDTDZ + D_M3_WTH_WR2_O_DDTDZ(PREDTH1,PREDR1,PD,& + & ZKEFF,PTKEM,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PEMOIST) * MZM(PFR2) +END IF +! +! d(w'th'r')/dz +IF (GFTHR) THEN + Z3RDMOMENT= M3_WTH_WTHR(PREDR1,PD,ZKEFF,PTKEM,PSQRT_TKE,PBETA,& + & PLEPS,PEMOIST) +! + ZF = ZF + Z3RDMOMENT * MZM(PFTHR) + ZDFDDTDZ = ZDFDDTDZ + D_M3_WTH_WTHR_O_DDTDZ(Z3RDMOMENT,PREDTH1,& + & PREDR1,PD,PBLL_O_E,PETHETA) * MZM(PFTHR) +END IF +! compute interface flux +IF (LCOUPLES) THEN ! Autocoupling O-A LES + IF (LOCEAN) THEN ! ocean model in coupled case + ZF(:,:,IKE) = (XSSTFL_C(:,:,1)+XSSRFL_C(:,:,1)) & + *0.5* ( 1. + PRHODJ(:,:,KKU)/PRHODJ(:,:,IKE) ) + ELSE ! atmosph model in coupled case + ZF(:,:,IKB) = XSSTFL_C(:,:,1) & + *0.5* ( 1. + PRHODJ(:,:,KKA)/PRHODJ(:,:,IKB) ) + ENDIF +! +ELSE ! No coupling O and A cases + ! atmosp bottom + !*In 3D, a part of the flux goes vertically, + ! and another goes horizontally (in presence of slopes) + !*In 1D, part of energy released in horizontal flux is taken into account in the vertical part + IF (HTURBDIM=='3DIM') THEN + ZF(:,:,IKB) = ( PIMPL*PSFTHP(:,:) + PEXPL*PSFTHM(:,:) ) & + * PDIRCOSZW(:,:) & + * 0.5 * (1. + PRHODJ(:,:,KKA) / PRHODJ(:,:,IKB)) + ELSE + ZF(:,:,IKB) = ( PIMPL*PSFTHP(:,:) + PEXPL*PSFTHM(:,:) ) & + / PDIRCOSZW(:,:) & + * 0.5 * (1. + PRHODJ(:,:,KKA) / PRHODJ(:,:,IKB)) + END IF +! + IF (LOCEAN) THEN + ZF(:,:,IKE) = XSSTFL(:,:) *0.5*(1. + PRHODJ(:,:,KKU) / PRHODJ(:,:,IKE)) + ELSE !end ocean case (in nocoupled case) + ! atmos top + ZF(:,:,IKE)=0. + END IF +END IF !end no coupled cases +! +! Compute the split conservative potential temperature at t+deltat +CALL TRIDIAG_THERMO(KKA,KKU,KKL,PTHLM,ZF,ZDFDDTDZ,PTSTEP,PIMPL,PDZZ,& + PRHODJ,PTHLP) +! +! Compute the equivalent tendency for the conservative potential temperature +! +ZRWTHL(:,:,:)= PRHODJ(:,:,:)*(PTHLP(:,:,:)-PTHLM(:,:,:))/PTSTEP +! replace the flux by the Leonard terms above ZALT and ZCLD_THOLD +IF (LHGRAD) THEN + DO JK=1,KKU + ZALT(:,:,JK) = PZZ(:,:,JK)-XZS(:,:) + END DO + WHERE ( (ZCLD_THOLD(:,:,:) >= XCLDTHOLD) .AND. ( ZALT(:,:,:) >= XALTHGRAD) ) + ZRWTHL(:,:,:) = -GZ_W_M(MZM(PRHODJ(:,:,:))*ZF_NEW(:,:,:),XDZZ) + END WHERE +END IF +! +PRTHLS(:,:,:)= PRTHLS(:,:,:) + ZRWTHL(:,:,:) +! +!* 2.2 Partial Thermal Production +! +! Conservative potential temperature flux : +! +ZFLXZ(:,:,:) = ZF & + + PIMPL * ZDFDDTDZ * DZM(PTHLP - PTHLM) / PDZZ +! replace the flux by the Leonard terms +IF (LHGRAD) THEN + WHERE ( (ZCLD_THOLD(:,:,:) >= XCLDTHOLD) .AND. ( ZALT(:,:,:) >= XALTHGRAD) ) + ZFLXZ(:,:,:) = ZF_NEW(:,:,:) + END WHERE +END IF +! +ZFLXZ(:,:,KKA) = ZFLXZ(:,:,IKB) +IF (LOCEAN) THEN + ZFLXZ(:,:,KKU) = ZFLXZ(:,:,IKE) +END IF +! +DO JK=IKTB+1,IKTE-1 + PWTH(:,:,JK)=0.5*(ZFLXZ(:,:,JK)+ZFLXZ(:,:,JK+KKL)) +END DO +! +PWTH(:,:,IKB)=0.5*(ZFLXZ(:,:,IKB)+ZFLXZ(:,:,IKB+KKL)) +! +IF (LOCEAN) THEN + PWTH(:,:,IKE)=0.5*(ZFLXZ(:,:,IKE)+ZFLXZ(:,:,IKE+KKL)) + PWTH(:,:,KKA)=0. + PWTH(:,:,KKU)=ZFLXZ(:,:,KKU) +ELSE + PWTH(:,:,IKE)=PWTH(:,:,IKE-KKL) + PWTH(:,:,KKA)=0.5*(ZFLXZ(:,:,KKA)+ZFLXZ(:,:,KKA+KKL)) +END IF +! +IF ( OTURB_FLX .AND. tpfile%lopened ) THEN + ! stores the conservative potential temperature vertical flux + TZFIELD%CMNHNAME = 'THW_FLX' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'THW_FLX' + TZFIELD%CUNITS = 'K m s-1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'Conservative potential temperature vertical flux' + TZFIELD%NGRID = 4 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZFLXZ) +END IF +! +! Contribution of the conservative temperature flux to the buoyancy flux +IF (LOCEAN) THEN + PTP(:,:,:)= XG*XALPHAOC * MZF(ZFLXZ ) +ELSE + IF (KRR /= 0) THEN + PTP(:,:,:) = PBETA * MZF( MZM(PETHETA) * ZFLXZ ) + PTP(:,:,IKB)= PBETA(:,:,IKB) * PETHETA(:,:,IKB) * & + 0.5 * ( ZFLXZ (:,:,IKB) + ZFLXZ (:,:,IKB+KKL) ) + ELSE + PTP(:,:,:)= PBETA * MZF( ZFLXZ ) + END IF +END IF +! +! Buoyancy flux at flux points +! +PWTHV = MZM(PETHETA) * ZFLXZ +PWTHV(:,:,IKB) = PETHETA(:,:,IKB) * ZFLXZ(:,:,IKB) +! +IF (LOCEAN) THEN + ! temperature contribution to Buy flux + PWTHV(:,:,IKE) = PETHETA(:,:,IKE) * ZFLXZ(:,:,IKE) +END IF +!* 2.3 Partial vertical divergence of the < Rc w > flux +! +IF ( KRRL >= 1 ) THEN + IF ( KRRI >= 1 ) THEN + PRRS(:,:,:,2) = PRRS(:,:,:,2) - & + PRHODJ*PATHETA*2.*PSRCM*DZF(ZFLXZ/PDZZ) & + *(1.0-PFRAC_ICE(:,:,:)) + PRRS(:,:,:,4) = PRRS(:,:,:,4) - & + PRHODJ*PATHETA*2.*PSRCM*DZF(ZFLXZ/PDZZ) & + *PFRAC_ICE(:,:,:) + ELSE + PRRS(:,:,:,2) = PRRS(:,:,:,2) - & + PRHODJ*PATHETA*2.*PSRCM*DZF(ZFLXZ/PDZZ) + END IF +END IF +! +!* 2.4 Storage in LES configuration +! +IF (LLES_CALL) THEN + CALL SECOND_MNH(ZTIME1) + CALL LES_MEAN_SUBGRID( MZF(ZFLXZ), X_LES_SUBGRID_WThl ) + CALL LES_MEAN_SUBGRID( MZF(PWM*ZFLXZ), X_LES_RES_W_SBG_WThl ) + CALL LES_MEAN_SUBGRID( GZ_W_M(PWM,PDZZ)*MZF(ZFLXZ),& + & X_LES_RES_ddxa_W_SBG_UaThl ) + CALL LES_MEAN_SUBGRID( MZF(PDTH_DZ*ZFLXZ), X_LES_RES_ddxa_Thl_SBG_UaThl ) + CALL LES_MEAN_SUBGRID( -XCTP*PSQRT_TKE/PLM*MZF(ZFLXZ), X_LES_SUBGRID_ThlPz ) + CALL LES_MEAN_SUBGRID( MZF(MZM(PETHETA)*ZFLXZ), X_LES_SUBGRID_WThv ) + IF (KRR>=1) THEN + CALL LES_MEAN_SUBGRID( MZF(PDR_DZ*ZFLXZ), X_LES_RES_ddxa_Rt_SBG_UaThl ) + END IF + !* diagnostic of mixing coefficient for heat + ZA = DZM(PTHLP) + WHERE (ZA==0.) ZA=1.E-6 + ZA = - ZFLXZ / ZA * PDZZ + ZA(:,:,IKB) = XCSHF*PPHI3(:,:,IKB)*ZKEFF(:,:,IKB) + ZA = MZF( ZA ) + ZA = MIN(MAX(ZA,-1000.),1000.) + CALL LES_MEAN_SUBGRID( ZA, X_LES_SUBGRID_Kh ) + ! + CALL SECOND_MNH(ZTIME2) + XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 +END IF +! +!* 2.5 New boundary layer depth for TOMs +! +IF (HTOM=='TM06') CALL TM06_H(IKB,IKTB,IKTE,PTSTEP,PZZ,ZFLXZ,PBL_DEPTH) +! +!---------------------------------------------------------------------------- +! +! +!* 3. SOURCES OF CONSERVATIVE AND CLOUD MIXING RATIO AND +! COMPLETE THERMAL PRODUCTION +! ------------------------------------------------------ +! +!* 3.1 Splitted value for cons. mixing ratio at t+deltat +! +! +IF (KRR /= 0) THEN + ! Compute the turbulent flux F and F' at time t-dt. + ! + ZF (:,:,:) = -XCSHF*PPSI3*ZKEFF*DZM(PRM(:,:,:,1))/PDZZ + ZDFDDRDZ(:,:,:) = -XCSHF*ZKEFF*D_PSI3DRDZ_O_DDRDZ(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,GUSERV) + ! + ! Compute Leonard Terms for Cloud mixing ratio + IF (LHGRAD) THEN + ZDELTAX= XXHAT(3) - XXHAT(2) + ZF_NEW (:,:,:)= XCOEFHGRADRM*ZDELTAX*ZDELTAX/12.0*( & + MXF(GX_W_UW(PWM(:,:,:), XDXX, XDZZ, XDZX)) & + *MZM(GX_M_M(PRM(:,:,:,1),XDXX,XDZZ,XDZX)) & + +MYF(GY_W_VW(PWM(:,:,:), XDYY,XDZZ,XDZY)) & + *MZM(GY_M_M(PRM(:,:,:,1),XDYY,XDZZ,XDZY)) ) + END IF + ! + ! Effect of 3rd order terms in temperature flux (at flux point) + ! + ! d(w'2r')/dz + IF (GFWR) THEN + Z3RDMOMENT= M3_WR_W2R(PREDR1,PREDTH1,PD,ZKEFF,PTKEM) + ! + ZF = ZF + Z3RDMOMENT * PFWR + ZDFDDRDZ = ZDFDDRDZ + D_M3_WR_W2R_O_DDRDZ(PREDR1,PREDTH1,PD,& + & PBLL_O_E,PEMOIST,ZKEFF,PTKEM) * PFWR + END IF + ! + ! d(w'r'2)/dz + IF (GFR2) THEN + Z3RDMOMENT= M3_WR_WR2(PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST) + ! + ZF = ZF + Z3RDMOMENT * MZM(PFR2) + ZDFDDRDZ = ZDFDDRDZ + D_M3_WR_WR2_O_DDRDZ(Z3RDMOMENT,PREDR1,& + & PREDTH1,PD,PBLL_O_E,PEMOIST) * MZM(PFR2) + END IF + ! + ! d(w'2th')/dz + IF (GFWTH) THEN + ZF = ZF + M3_WR_W2TH(PD,ZKEFF,& + & PTKEM,PBLL_O_E,PETHETA,PDR_DZ) * PFWTH + ZDFDDRDZ = ZDFDDRDZ + D_M3_WR_W2TH_O_DDRDZ(PREDR1,PREDTH1,& + & PD,ZKEFF,PTKEM,PBLL_O_E,PETHETA) * PFWTH + END IF + ! + ! d(w'th'2)/dz + IF (GFTH2) THEN + ZF = ZF + M3_WR_WTH2(PD,ZKEFF,PTKEM,& + & PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA,PDR_DZ) * MZM(PFTH2) + ZDFDDRDZ = ZDFDDRDZ + D_M3_WR_WTH2_O_DDRDZ(PREDR1,PREDTH1,PD,& + &ZKEFF,PTKEM,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA) * MZM(PFTH2) + END IF + ! + ! d(w'th'r')/dz + IF (GFTHR) THEN + Z3RDMOMENT= M3_WR_WTHR(PREDTH1,PD,ZKEFF,PTKEM,PSQRT_TKE,PBETA,& + & PLEPS,PETHETA) + ! + ZF = ZF + Z3RDMOMENT * MZM(PFTHR) + ZDFDDRDZ = ZDFDDRDZ + D_M3_WR_WTHR_O_DDRDZ(Z3RDMOMENT,PREDR1, & + & PREDTH1,PD,PBLL_O_E,PEMOIST) * MZM(PFTHR) + END IF + ! + ! compute interface flux + IF (LCOUPLES) THEN ! coupling NH O-A + IF (LOCEAN) THEN ! ocean model in coupled case + ! evap effect on salinity to be added later !!! + ZF(:,:,IKE) = 0. + ELSE ! atmosph model in coupled case + ZF(:,:,IKB) = 0. + ! AJOUTER FLUX EVAP SUR MODELE ATMOS + ENDIF + ! + ELSE ! No coupling NH OA case + ! atmosp bottom + !* in 3DIM case, a part of the flux goes vertically, and another goes horizontally + ! (in presence of slopes) + !* in 1DIM case, the part of energy released in horizontal flux + ! is taken into account in the vertical part + ! + IF (HTURBDIM=='3DIM') THEN + ZF(:,:,IKB) = ( PIMPL*PSFRP(:,:) + PEXPL*PSFRM(:,:) ) & + * PDIRCOSZW(:,:) & + * 0.5 * (1. + PRHODJ(:,:,KKA) / PRHODJ(:,:,IKB)) + ELSE + ZF(:,:,IKB) = ( PIMPL*PSFRP(:,:) + PEXPL*PSFRM(:,:) ) & + / PDIRCOSZW(:,:) & + * 0.5 * (1. + PRHODJ(:,:,KKA) / PRHODJ(:,:,IKB)) + END IF + ! + IF (LOCEAN) THEN + ! General ocean case + ! salinity/evap effect to be added later !!!!! + ZF(:,:,IKE) = 0. + ELSE !end ocean case (in nocoupled case) + ! atmos top + ZF(:,:,IKE)=0. + END IF + END IF!end no coupled cases + ! Compute the split conservative potential temperature at t+deltat + CALL TRIDIAG_THERMO(KKA,KKU,KKL,PRM(:,:,:,1),ZF,ZDFDDRDZ,PTSTEP,PIMPL,& + PDZZ,PRHODJ,PRP) + ! + ! Compute the equivalent tendency for the conservative mixing ratio + ! + ZRWRNP (:,:,:) = PRHODJ(:,:,:)*(PRP(:,:,:)-PRM(:,:,:,1))/PTSTEP + ! + ! replace the flux by the Leonard terms above ZALT and ZCLD_THOLD + IF (LHGRAD) THEN + DO JK=1,KKU + ZALT(:,:,JK) = PZZ(:,:,JK)-XZS(:,:) + END DO + WHERE ( (ZCLD_THOLD(:,:,:) >= XCLDTHOLD ) .AND. ( ZALT(:,:,:) >= XALTHGRAD ) ) + ZRWRNP (:,:,:) = -GZ_W_M(MZM(PRHODJ(:,:,:))*ZF_NEW(:,:,:),XDZZ) + END WHERE + END IF + ! + PRRS(:,:,:,1) = PRRS(:,:,:,1) + ZRWRNP (:,:,:) + ! + !* 3.2 Complete thermal production + ! + ! cons. mixing ratio flux : + ! + ZFLXZ(:,:,:) = ZF & + + PIMPL * ZDFDDRDZ * DZM(PRP - PRM(:,:,:,1)) / PDZZ + ! + ! replace the flux by the Leonard terms above ZALT and ZCLD_THOLD + IF (LHGRAD) THEN + WHERE ( (ZCLD_THOLD(:,:,:) >= XCLDTHOLD ) .AND. ( ZALT(:,:,:) >= XALTHGRAD ) ) + ZFLXZ(:,:,:) = ZF_NEW(:,:,:) + END WHERE + END IF + ! + ZFLXZ(:,:,KKA) = ZFLXZ(:,:,IKB) + ! + DO JK=IKTB+1,IKTE-1 + PWRC(:,:,JK)=0.5*(ZFLXZ(:,:,JK)+ZFLXZ(:,:,JK+KKL)) + END DO + PWRC(:,:,IKB)=0.5*(ZFLXZ(:,:,IKB)+ZFLXZ(:,:,IKB+KKL)) + PWRC(:,:,KKA)=0.5*(ZFLXZ(:,:,KKA)+ZFLXZ(:,:,KKA+KKL)) + PWRC(:,:,IKE)=PWRC(:,:,IKE-KKL) + ! + ! + IF ( OTURB_FLX .AND. tpfile%lopened ) THEN + ! stores the conservative mixing ratio vertical flux + TZFIELD%CMNHNAME = 'RCONSW_FLX' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'RCONSW_FLX' + TZFIELD%CUNITS = 'kg m s-1 kg-1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'Conservative mixing ratio vertical flux' + TZFIELD%NGRID = 4 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZFLXZ) + END IF + ! + ! Contribution of the conservative water flux to the Buoyancy flux + IF (LOCEAN) THEN + ZA(:,:,:)= -XG*XBETAOC * MZF(ZFLXZ ) + ELSE + ZA(:,:,:) = PBETA * MZF( MZM(PEMOIST) * ZFLXZ ) + ZA(:,:,IKB) = PBETA(:,:,IKB) * PEMOIST(:,:,IKB) * & + 0.5 * ( ZFLXZ (:,:,IKB) + ZFLXZ (:,:,IKB+KKL) ) + PTP(:,:,:) = PTP(:,:,:) + ZA(:,:,:) + END IF + ! + ! Buoyancy flux at flux points + ! + PWTHV = PWTHV + MZM(PEMOIST) * ZFLXZ + PWTHV(:,:,IKB) = PWTHV(:,:,IKB) + PEMOIST(:,:,IKB) * ZFLXZ(:,:,IKB) + IF (LOCEAN) THEN + PWTHV(:,:,IKE) = PWTHV(:,:,IKE) + PEMOIST(:,:,IKE)* ZFLXZ(:,:,IKE) + END IF +! +!* 3.3 Complete vertical divergence of the < Rc w > flux +! + IF ( KRRL >= 1 ) THEN + IF ( KRRI >= 1 ) THEN + PRRS(:,:,:,2) = PRRS(:,:,:,2) - & + PRHODJ*PAMOIST*2.*PSRCM*DZF(ZFLXZ/PDZZ ) & + *(1.0-PFRAC_ICE(:,:,:)) + PRRS(:,:,:,4) = PRRS(:,:,:,4) - & + PRHODJ*PAMOIST*2.*PSRCM*DZF(ZFLXZ/PDZZ ) & + *PFRAC_ICE(:,:,:) + ELSE + PRRS(:,:,:,2) = PRRS(:,:,:,2) - & + PRHODJ*PAMOIST*2.*PSRCM*DZF(ZFLXZ/PDZZ ) + END IF + END IF +! +!* 3.4 Storage in LES configuration +! + IF (LLES_CALL) THEN + CALL SECOND_MNH(ZTIME1) + CALL LES_MEAN_SUBGRID( MZF(ZFLXZ), X_LES_SUBGRID_WRt ) + CALL LES_MEAN_SUBGRID( MZF(PWM*ZFLXZ), X_LES_RES_W_SBG_WRt ) + CALL LES_MEAN_SUBGRID( GZ_W_M(PWM,PDZZ)*MZF(ZFLXZ),& + & X_LES_RES_ddxa_W_SBG_UaRt ) + CALL LES_MEAN_SUBGRID( MZF(PDTH_DZ*ZFLXZ), X_LES_RES_ddxa_Thl_SBG_UaRt ) + CALL LES_MEAN_SUBGRID( MZF(PDR_DZ*ZFLXZ), X_LES_RES_ddxa_Rt_SBG_UaRt ) + CALL LES_MEAN_SUBGRID( MZF(MZM(PEMOIST)*ZFLXZ), X_LES_SUBGRID_WThv , .TRUE. ) + CALL LES_MEAN_SUBGRID( -XCTP*PSQRT_TKE/PLM*MZF(ZFLXZ), X_LES_SUBGRID_RtPz ) + CALL SECOND_MNH(ZTIME2) + XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 + END IF +! +END IF +! +!---------------------------------------------------------------------------- +! +! +!* 4. TURBULENT CORRELATIONS : <w Rc> +! ------------------------------- +! +! +!* 4.1 <w Rc> +! +IF ( ((OTURB_FLX .AND. tpfile%lopened) .OR. LLES_CALL) .AND. (KRRL > 0) ) THEN + ! + ! recover the Conservative potential temperature flux : + ZA(:,:,:) = DZM(PIMPL * PTHLP + PEXPL * PTHLM) / PDZZ * & + (-PPHI3*MZM(PLM*PSQRT_TKE)) * XCSHF + ZA(:,:,IKB) = ( PIMPL*PSFTHP(:,:) + PEXPL*PSFTHM(:,:) ) & + * PDIRCOSZW(:,:) + ! + ! compute <w Rc> + ZFLXZ(:,:,:) = MZM( PAMOIST * 2.* PSRCM ) * ZFLXZ(:,:,:) + & + MZM( PATHETA * 2.* PSRCM ) * ZA(:,:,:) + ZFLXZ(:,:,KKA) = ZFLXZ(:,:,IKB) + ! + ! store the liquid water mixing ratio vertical flux + IF ( OTURB_FLX .AND. tpfile%lopened ) THEN + TZFIELD%CMNHNAME = 'RCW_FLX' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'RCW_FLX' + TZFIELD%CUNITS = 'kg m s-1 kg-1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'Liquid water mixing ratio vertical flux' + TZFIELD%NGRID = 4 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZFLXZ) + END IF + ! +! and we store in LES configuration this subgrid flux <w'rc'> +! + IF (LLES_CALL) THEN + CALL SECOND_MNH(ZTIME1) + CALL LES_MEAN_SUBGRID( MZF(ZFLXZ), X_LES_SUBGRID_WRc ) + CALL SECOND_MNH(ZTIME2) + XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 + END IF +! +END IF !end of <w Rc> +IF (LOCEAN.AND.LDEEPOC) THEN + DEALLOCATE(ZXHAT_ll,ZYHAT_ll) +END IF +! +!---------------------------------------------------------------------------- +END SUBROUTINE TURB_VER_THERMO_FLUX -- GitLab