Although not an advertised feature, you can use MFIX-Exa as a “coarse-grained” (CFD-)DEM model. In CG DEM, like PIC, each particle is meant to represent an n unresolved number of “real” particles. This can be useful when the number of particles is large so it’s not easily simulated with DEM and flow features make it challenging for the PIC model, e.g., containing very dense regions that are not well fluidized. To give an example, we’ll take a look at a case that @wakefiej has been looking at recently. The problem description is a 2.5” fluidized bed with an inlet area that is only approximately 1.35” creating the possibility of a defluidized region near the walls. The material is approximately 365 grams of 180 micron glass beads. This is roughly 48M particles; do-able, but expensive. Let’s instead simulate this case with 1 mm diameter CG particles which represent n = 171.67 real particles. The size ratio is f = n^(1/3) = 5.555. If I were to simulate this with DEM, I would probably set the spring constant to kn0 = 37.8 N/m. To scale the normal force by a factor of f, we simply need to increase the spring constant to kn = f * kn0 = 210 N/m. (For the justification for this selection, see discussion here CGP scaling laws and cohesive models - #7 by wfullmer .) Note that for a constant restitution coefficient and tangential scale factors, i.e., the input variables
dem.restitution_coeff.solid0.solid0 = <value>
dem.restitution_coeff.solid0.wall = <value>
dem.spring_tang_fac.pp = <value>
dem.spring_tang_fac.pw = <value>
dem.damping_tang_fac.pp = <value>
dem.damping_tang_fac.pw = <value>
setting kn effectively scales the normal and tangential collision forces. All other forces scale “naturally,” i.e., no intervention is needed, except the drag force. For the drag force, we need to use the diameter of the real particle, here 180 micron, in the drag model. I will use the Gidaspow drag model, so this can be achieved by hacking in the fixed diameter in src/des/coupling/mfix_des_drag_K.H (on or about line 115 in release 25.10). The git diff for this edit is
diff --git a/src/des/coupling/mfix_des_drag_K.H b/src/des/coupling/mfix_des_drag_K.H
index a69f5d83a..cbd777f39 100644
--- a/src/des/coupling/mfix_des_drag_K.H
+++ b/src/des/coupling/mfix_des_drag_K.H
@@ -115,7 +115,8 @@ struct ComputeDragGidaspow : public ComputeTxfrCoeff
amrex::Real const vrel = vslp.vectorLength();
- amrex::Real const diam_p = 2.0*a_realarray[SoArealData::radius][a_id];
+ //amrex::Real const diam_p = 2.0*a_realarray[SoArealData::radius][a_id];
+ amrex::Real const diam_p = 180.0e-6;
amrex::Real const Re = (mu_f > 0.0) ? diam_p*vrel*rop_f/mu_f : m_large_number;
if (Re < m_epsilon) { return 0.0; }
Further note that all of the drag models, including UserDrag, contain the line
amrex::Real const diam_p = 2.0*a_realarray[SoArealData::radius][a_id];
which can be adjusted to the desired particle diameter.
With this CG representation of the example problem, there are now only 280k CG particles and a 20 second simulation was run in less than 7 hours on 4 H100 GPUs with a grid of dx = 2 mm, which provides a substantial computational savings in its own right. The animation below shows, more or less, that the CG model is able to qualitatively reproduce the non-uniform bubbling observed in the lab.
Note that I do not endorse or recommend using a CG “model” to make quantitative predictions.