particles_breakup

Module

Description

$Id$

Secondary breakup of Lagrangian liquid parcels.

Four independent models are available:

HG (Huh-Gosman) - Aguerre & Nigro, Computers and Fluids 190 (2019)

30-48, section 3.1 and Appendix B2 (Algorithm 2). Primary atomization driven by injector-generated turbulence. Acts only inside the liquid core (gated on |z - z_inj| < L_bu). Each parcel carries its own birth time so the turbulence scales L_T(t) and tau_T(t) decay with parcel age, exactly as in the original Huh-Gosman 1991 paper.

KH (Kelvin-Helmholtz) and RT (Rayleigh-Taylor) - Aguerre & Nigro,

sections 3.2-3.3 and Appendices B3-B4. These are designed for very high Weber numbers typical of fuel-injector sprays and can be (and by default now are) gated on a minimum gas Weber number to keep them inside their regime of validity.

PE (Pilch-Erdman) - Pilch, M. & Erdman, C.A., Use of breakup time

data and velocity history data to predict the maximum size of stable fragments for acceleration-induced breakup of a liquid drop, Int. J. Multiphase Flow 13(6) (1987) 741-757. This is a regime-based (vibrational / bag / bag-stamen / sheet stripping / catastrophic) acceleration-driven model that covers the full Weber number range, including the bag and bag-stamen regime that KH+RT do not capture. The breakup-time scaling and Schiller-Naumann drag closure used here also follow Apte, Gorokhovski & Moin, IJMF 29 (2003) 1503-1522.

Branch priority within particles_breakup_pencils:
  1. HG (highest) – inside the liquid core, only HG acts.

  2. RT – outside the liquid core, RT specialist.

  3. KH – outside the liquid core, KH specialist.

  4. PE (lowest) – regime fallback for what neither RT nor KH

    claimed.

At most one branch acts on any parcel in any step.

** AUTOMATIC CPARAM.INC GENERATION ************************

CPARAM logical, parameter :: lparticles_breakup = .true.

MPVAR CONTRIBUTION 0 MPAUX CONTRIBUTION 6


Quick access

Variables:

apply_pe_breakup, apply_rt_breakup, c_bu, compute_drag_coefficient, compute_hg_scales, compute_kh_scales, compute_pe_scales, compute_rt_scales, d_inj, diameter_from_mass, get_local_gas_density, get_local_gas_kinematic_viscosity, hg_c1, hg_c2, hg_c3, hg_c4, hg_c5, hg_c6, hg_cmu, hg_k1, hg_ke, hg_li, hg_ui, idiag_d32m, idiag_imskhm, idiag_tbpem, idiag_wegm, idiag_wegmax, idiag_wegmin, insert_child_particle, kh_b0, kh_b1, kh_b2, kh_min_child_npswarm, kh_we_min, l_bu, lhg_turb_decay, lparticles_breakup_hg, lparticles_breakup_kh, lparticles_breakup_pe, lparticles_breakup_rt, lprint_breakup_mode, mass_from_diameter, nu_liq, pe_child_factor, pe_floor_diameter, pe_max_shrink_ratio, pe_min_diameter, pe_regime_name, pe_we_crit, rt_crt, rt_ctau, rt_method, rt_we_min, sigma_liq, tstart_particles_breakup, update_particle_mass_fields, z_inj

Routines:

dbreakup_dt(), initialize_particles_breakup(), particles_breakup_pencils(), read_particles_breakup_init_pars(), read_particles_breakup_run_pars(), register_particles_breakup(), rprint_particles_breakup(), write_particles_breakup_init_pars(), write_particles_breakup_run_pars()

Needed modules

Variables

  • particles_breakup/apply_pe_breakup [private]
  • particles_breakup/apply_rt_breakup [private]
  • particles_breakup/c_bu [real,private/optional/default=0.0]

    Aguerre-Nigro / Li et al. constant

  • particles_breakup/compute_drag_coefficient [private]
  • particles_breakup/compute_hg_scales [private]
  • particles_breakup/compute_kh_scales [private]
  • particles_breakup/compute_pe_scales [private]
  • particles_breakup/compute_rt_scales [private]
  • particles_breakup/d_inj [real,private/optional/default=0.0]

    injector orifice diameter [cm]

  • particles_breakup/diameter_from_mass [private]
  • particles_breakup/get_local_gas_density [private]
  • particles_breakup/get_local_gas_kinematic_viscosity [private]
  • particles_breakup/hg_c1 [real,private/optional/default=0.1]
  • particles_breakup/hg_c2 [real,private/optional/default=2.0]
  • particles_breakup/hg_c3 [real,private/optional/default=1.2]
  • particles_breakup/hg_c4 [real,private/optional/default=0.4]
  • particles_breakup/hg_c5 [real,private/optional/default=5.0]
  • particles_breakup/hg_c6 [real,private/optional/default=2.0]
  • particles_breakup/hg_cmu [real,private/optional/default=0.09]
  • particles_breakup/hg_k1 [real,private/optional/default=0.175]
  • particles_breakup/hg_ke [real,private/optional/default=0.27]
  • particles_breakup/hg_li [real,private/optional/default=0.0]
  • particles_breakup/hg_ui [real,private/optional/default=0.0]
  • particles_breakup/idiag_d32m [integer,private/optional/default=0]

    Sauter mean diameter, weighted by npswarm

  • particles_breakup/idiag_imskhm [integer,private/optional/default=0]
  • particles_breakup/idiag_tbpem [integer,private/optional/default=0]
  • particles_breakup/idiag_wegm [integer,private/optional/default=0]

    mean per-parcel gas Weber number

  • particles_breakup/idiag_wegmax [integer,private/optional/default=0]

    maximum per-parcel gas Weber number

  • particles_breakup/idiag_wegmin [integer,private/optional/default=0]

    minimum per-parcel gas Weber number

  • particles_breakup/insert_child_particle [private]
  • particles_breakup/kh_b0 [real,private/optional/default=0.61]
  • particles_breakup/kh_b1 [real,private/optional/default=40.0]
  • particles_breakup/kh_b2 [real,private/optional/default=0.05]
  • particles_breakup/kh_min_child_npswarm [real,private/optional/default=0.0]
  • particles_breakup/kh_we_min [real,private/optional/default=0.0]
  • particles_breakup/l_bu [real,private/optional/default=0.0]

    liquid-core length, computed in init

  • particles_breakup/lhg_turb_decay [logical,private/optional/default=.true.]
  • particles_breakup/lparticles_breakup_hg [logical,private/optional/default=.false.]
  • particles_breakup/lparticles_breakup_kh [logical,private/optional/default=.false.]
  • particles_breakup/lparticles_breakup_pe [logical,private/optional/default=.false.]
  • particles_breakup/lparticles_breakup_rt [logical,private/optional/default=.false.]
  • particles_breakup/lprint_breakup_mode [logical,private/optional/default=.false.]
  • particles_breakup/mass_from_diameter [private]
  • particles_breakup/nu_liq [real,private/optional/default=0.01]

    PAR_DOC: kinematic viscosity of the liquid (in cgs units)

  • particles_breakup/pe_child_factor [real,private/optional/default=0.5]

    child-parcel size as a fraction of d_max

  • particles_breakup/pe_floor_diameter [real,private/optional/default=1e-12]
  • particles_breakup/pe_max_shrink_ratio [real,private/optional/default=0.0001]
  • particles_breakup/pe_min_diameter [real,private/optional/default=1e-12]
  • particles_breakup/pe_regime_name [private]
  • particles_breakup/pe_we_crit [real,private/optional/default=12.0]

    base critical Weber number, Eq. (5)

  • particles_breakup/rt_crt [real,private/optional/default=0.1]
  • particles_breakup/rt_ctau [real,private/optional/default=1.0]
  • particles_breakup/rt_method [integer,private/optional/default=2]
  • particles_breakup/rt_we_min [real,private/optional/default=0.0]
  • particles_breakup/sigma_liq [real,private/optional/default=0.072]
  • particles_breakup/tstart_particles_breakup [real,private/optional/default=0.0]
  • particles_breakup/update_particle_mass_fields [private]
  • particles_breakup/z_inj [real,private/optional/default=0.0]

    injector axial position [cm]

Subroutines and functions

subroutine  particles_breakup/register_particles_breakup()

Register particle-local breakup state. imskh - KH stripped-mass accumulator (Aguerre-Nigro Eq. 3.20) itbrt - RT breakup-time accumulator (Aguerre-Nigro Eq. 3.26) itbpe - PE breakup-time accumulator (Pilch-Erdman 1987) itage - parcel “birth time” t_birth, so age = t - fp(k,itage).

Set to a sentinel value (negative) once HG is finished with that parcel so it is not re-entered.

imshg - HG stripped-mass accumulator (Aguerre-Nigro Eq. 3.13) imech - per-parcel “lineage” tag identifying the most recent

breakup event:

0 = no breakup yet (treated as HG mother by post-processing) 1 = HG mother 2 = HG child 3 = KH mother 4 = KH child 5 = RT mother 6 = RT-modified parcel

The tag is sticky: it is never reset to 0, only overwritten when a new event acts on the parcel. Used by plot_fig12.pro and plot_fig11.pro for per-mechanism SMD and volume curves.

Called from:

particles_register_modules()

Call to:

append_npaux(), fatal_error(), not_implemented(), sum_par_name(), interpolate_linear(), max_par_name(), save_name(), getnu()

subroutine  particles_breakup/initialize_particles_breakup(f)

Check the breakup configuration.

Parameters:

f (mx,my,mz,mfarray) [real,in]

Use :

equationofstate (rho0())

Called from:

particles_register_modules(), particles_rprint_list(), particles_initialize_modules()

Call to:

fatal_error(), not_implemented(), sum_par_name(), interpolate_linear(), max_par_name(), save_name(), getnu()

subroutine  particles_breakup/read_particles_breakup_init_pars(iomsg)
Parameters:

iomsg [character,out]

Use :

file_io (parallel_unit())

Call to:

fatal_error(), sum_par_name(), interpolate_linear(), max_par_name(), save_name(), getnu()

subroutine  particles_breakup/write_particles_breakup_init_pars(unit)
Parameters:

unit [integer,in]

Called from:

particles_register_modules(), particles_rprint_list(), particles_initialize_modules(), particles_init(), particles_finalize(), particles_read_snapshot(), particles_write_snapshot(), particles_write_dsnapshot(), particles_write_pdim(), particles_write_block(), particles_write_rmv(), particles_timestep_first(), particles_timestep_second(), split_update_particles(), particles_load_balance(), particles_boundconds(), particles_pencil_criteria(), particles_pencil_interdep(), particles_calc_pencils(), particles_calc_selfpotential(), particles_before_boundary(), particles_special_bfre_bdary(), particles_special_after_dtsub(), particles_pde(), particles_pde_pencil(), particles_calc_pencil_diags(), particles_pde_blocks(), read_all_particles_init_pars(), write_all_particles_init_pars(), read_all_particles_run_pars(), write_dim_particles(), write_snapshot_particles(), read_snapshot_particles()

Call to:

fatal_error(), sum_par_name(), interpolate_linear(), max_par_name(), save_name(), getnu()

subroutine  particles_breakup/read_particles_breakup_run_pars(iomsg)
Parameters:

iomsg [character,out]

Use :

file_io (parallel_unit())

Call to:

fatal_error(), sum_par_name(), interpolate_linear(), max_par_name(), save_name(), getnu()

subroutine  particles_breakup/write_particles_breakup_run_pars(unit)
Parameters:

unit [integer,in]

Called from:

particles_register_modules(), particles_rprint_list(), particles_initialize_modules(), particles_init(), particles_finalize(), particles_read_snapshot(), particles_write_snapshot(), particles_write_dsnapshot(), particles_write_pdim(), particles_write_block(), particles_write_rmv(), particles_timestep_first(), particles_timestep_second(), split_update_particles(), particles_load_balance(), particles_boundconds(), particles_pencil_criteria(), particles_pencil_interdep(), particles_calc_pencils(), particles_calc_selfpotential(), particles_before_boundary(), particles_special_bfre_bdary(), particles_special_after_dtsub(), particles_pde(), particles_pde_pencil(), particles_calc_pencil_diags(), particles_pde_blocks(), read_all_particles_init_pars(), write_all_particles_init_pars(), read_all_particles_run_pars(), write_all_particles_run_pars(), write_dim_particles(), write_snapshot_particles(), read_snapshot_particles()

Call to:

fatal_error(), sum_par_name(), interpolate_linear(), max_par_name(), save_name(), getnu()

subroutine  particles_breakup/rprint_particles_breakup(lreset[, lwrite])
Parameters:
  • lreset [logical,in]

  • lwrite [logical,in,]

Use :

diagnostics

Called from:

particles_register_modules(), particles_rprint_list()

Call to:

sum_par_name(), interpolate_linear(), max_par_name(), save_name(), fatal_error(), getnu()

subroutine  particles_breakup/dbreakup_dt(f, df, fp, dfp, ineargrid)

Diagnostics for breakup-owned particle state. This follows the standard particle-module pattern: diagnostics are gathered during the regular particle RHS phase, while the actual discrete breakup update is still applied later in particles_discrete_collisions.

Parameters:
  • f (mx,my,mz,mfarray) [real,in]

  • df (mx,my,mz,mvar) [real,inout]

  • fp (mpar_loc,mparray) [real,in]

  • dfp (mpar_loc,mpvar) [real,inout]

  • ineargrid (mpar_loc,3) [integer,in]

Use :

diagnostics (save_name()), mpicomm (mpiallreduce_sum())

Called from:

particles_register_modules(), particles_rprint_list(), particles_initialize_modules(), particles_init(), particles_finalize(), particles_read_snapshot(), particles_write_snapshot(), particles_write_dsnapshot(), particles_write_pdim(), particles_write_block(), particles_write_rmv(), particles_timestep_first(), particles_timestep_second(), split_update_particles(), particles_load_balance(), particles_boundconds(), particles_pencil_criteria(), particles_pencil_interdep(), particles_calc_pencils(), particles_calc_selfpotential(), particles_before_boundary(), particles_special_bfre_bdary(), particles_special_after_dtsub(), particles_pde(), read_all_particles_init_pars(), read_all_particles_run_pars(), write_dim_particles(), write_snapshot_particles(), read_snapshot_particles()

Call to:

sum_par_name(), interpolate_linear(), max_par_name(), save_name(), fatal_error(), getnu()

subroutine  particles_breakup/particles_breakup_pencils(f, fp, ineargrid)

Apply secondary-breakup updates after particle advection for the parcels that exist at the start of this step. Newly created child parcels are appended to fp and take part from the next step on.

Branch priority (highest first):
  1. Huh-Gosman (HG) - primary atomisation, Aguerre & Nigro App. B2. Acts inside the liquid core (|z - z_inj| < L_bu) only.

  2. Rayleigh-Taylor (RT) - Aguerre & Nigro (Appendix B4) gated by rt_we_min. Silenced inside L_bu.

  3. Kelvin-Helmholtz (KH) - Aguerre & Nigro (Appendix B3) gated by kh_we_min, only relevant for sheet-stripping.

  4. Pilch-Erdman (PE) - regime-aware fallback covering vibrational / bag / bag-stamen / sheet-stripping / catastrophic regimes.

At most one branch acts on any parcel in any step.

Parameters:
  • f (mx,my,mz,mfarray) [real,in]

  • fp (mpar_loc,mparray) [real,inout]

  • ineargrid (mpar_loc,3) [integer,inout]

Called from:

particles_register_modules(), particles_rprint_list(), particles_initialize_modules(), particles_init(), particles_finalize(), particles_read_snapshot(), particles_write_snapshot(), particles_write_dsnapshot(), particles_write_pdim(), particles_write_block(), particles_write_rmv(), particles_timestep_first(), particles_timestep_second(), split_update_particles(), read_all_particles_init_pars(), read_all_particles_run_pars(), write_dim_particles(), write_snapshot_particles(), read_snapshot_particles()

Call to:

interpolate_linear(), fatal_error(), getnu()