Multicomponent reaction rate

Hello, I ran a simulation of multi-component simultaneous pyrolysis in Mfix-22.4.3(windows), but I met some problems.

The required pyrolysis temperature of each component is different. After the pyrolysis of the first component, the other materials do not reach the required reaction temperature and the output chemical reaction rate is 0, but their particle diameter and pmass are decreasing. Even if I set their reaction rate to zero, their diameter and pmass will still decrease. I don’t know how this happened, and I hope to get your help.

It might be that the effect of the chemical reaction of one component on the mass and particle diameter will be added to the other components, resulting in the reduction of the mass of the other components. Can you give me some advice? Thank you very much.

I have uploaded a file in which there is only one reaction rate of materials, while the other reaction rates are zero. However, the particle diameter and mass of other materials will decrease simultaneously when I run. I’d appreciate it if you could take the time to look at it.
29d5a7cf3e1c64b06456e782cb949e2

Summary

test01.zip (45.2 MB)

Here you have to differentiate particles based on their phase index. You have 4 solids phases, so you have to treat them differently when you code the reaction rates. The value of DES_RATE will depend on the phase index pM (second argument of the subroutine). When pM==1 you will set DES_RATES(R1) only (all other DES_RATES are zero), when pM==2 you will set DES_RATES(R2) only etc.

@Silence-017 I’ve had a look at your case and I’m not sure what’s going on.

First, I modified the monitor definitions a little, to monitor, for each of the 4 solid phases (BIOMASS, PAPER, PLASTIC, FABRIC) the particle radius, mass, composition, and all 4 reaction rates.


BIOMASS.csv:# 
BIOMASS.csv:# Run type: NEW
BIOMASS.csv:# Monitor type: Arithmetic average over region, Volume =  0.12800000E-02
BIOMASS.csv:# "Time","r_p","pmass","x_p(1)","x_p(2)","x_p(3)","RRates_R1","RRates_R2","RRates_R3","RRates_R4" 
BIOMASS.csv:  0.0000000,  0.50000000E-02,  0.44505896E-03,  0.74000000,  0.13000000,  0.13000000,  0.0000000,  0.0000000,  0.0000000,  0.0000000  
BIOMASS.csv:  1.0162327,  0.49996051E-02,  0.44495351E-03,  0.73993838,  0.13003081,  0.13003081,  0.59295175E-08,  0.0000000,  0.0000000,  0.0000000  
BIOMASS.csv:  2.0147192,  0.49991822E-02,  0.44484061E-03,  0.73987238,  0.13006381,  0.13006381,  0.64155276E-08,  0.0000000,  0.0000000,  0.0000000  
BIOMASS.csv:  3.0341349,  0.49987138E-02,  0.44471560E-03,  0.73979926,  0.13010037,  0.13010037,  0.69434009E-08,  0.0000000,  0.0000000,  0.0000000  
BIOMASS.csv:  4.0246034,  0.49982208E-02,  0.44458401E-03,  0.73972224,  0.13013888,  0.13013888,  0.74881683E-08,  0.0000000,  0.0000000,  0.0000000  
BIOMASS.csv:  5.0695895,  0.49976604E-02,  0.44443450E-03,  0.73963469,  0.13018265,  0.13018265,  0.80990701E-08,  0.0000000,  0.0000000,  0.0000000  
FABRIC.csv:# 
FABRIC.csv:# Run type: NEW
FABRIC.csv:# Monitor type: Arithmetic average over region, Volume =  0.12800000E-02
FABRIC.csv:# "Time","r_p","pmass","x_p(1)","x_p(2)","x_p(3)","RRates_R1","RRates_R2","RRates_R3","RRates_R4" 
FABRIC.csv:  0.0000000,  0.50000000E-02,  0.41887902E-03,  0.84000000,  0.80000000E-01,  0.80000000E-01,  0.0000000,  0.0000000,  0.0000000,  0.0000000  
FABRIC.csv:  1.0162327,  0.49996174E-02,  0.41878287E-03,  0.83996327,  0.80018367E-01,  0.80018367E-01,  0.56573618E-08,  0.0000000,  0.0000000,  0.0000000  
FABRIC.csv:  2.0147192,  0.49992040E-02,  0.41867899E-03,  0.83992356,  0.80038221E-01,  0.80038221E-01,  0.57083747E-08,  0.0000000,  0.0000000,  0.0000000  
FABRIC.csv:  3.0341349,  0.49987772E-02,  0.41857178E-03,  0.83988256,  0.80058722E-01,  0.80058722E-01,  0.57616325E-08,  0.0000000,  0.0000000,  0.0000000  
FABRIC.csv:  4.0246034,  0.49983578E-02,  0.41846642E-03,  0.83984224,  0.80078878E-01,  0.80078878E-01,  0.58145240E-08,  0.0000000,  0.0000000,  0.0000000  
FABRIC.csv:  5.0695895,  0.49979125E-02,  0.41835460E-03,  0.83979944,  0.80100281E-01,  0.80100281E-01,  0.58716093E-08,  0.0000000,  0.0000000,  0.0000000  
PAPER.csv:# 
PAPER.csv:# Run type: NEW
PAPER.csv:# Monitor type: Arithmetic average over region, Volume =  0.12800000E-02
PAPER.csv:# "Time","r_p","pmass","x_p(1)","x_p(2)","x_p(3)","RRates_R1","RRates_R2","RRates_R3","RRates_R4" 
PAPER.csv:  0.0000000,  0.50000000E-02,  0.57595865E-03,  0.78000000,  0.11000000,  0.11000000,  0.0000000,  0.0000000,  0.0000000,  0.0000000  
PAPER.csv:  1.0162327,  0.49994952E-02,  0.57578422E-03,  0.77993335,  0.11003332,  0.11003332,  0.10090025E-07,  0.0000000,  0.0000000,  0.0000000  
PAPER.csv:  2.0147192,  0.49989582E-02,  0.57559871E-03,  0.77986243,  0.11006879,  0.11006879,  0.10205716E-07,  0.0000000,  0.0000000,  0.0000000  
PAPER.csv:  3.0341349,  0.49984025E-02,  0.57540678E-03,  0.77978900,  0.11010550,  0.11010550,  0.10326630E-07,  0.0000000,  0.0000000,  0.0000000  
PAPER.csv:  4.0246034,  0.49978550E-02,  0.57521771E-03,  0.77971662,  0.11014169,  0.11014169,  0.10446904E-07,  0.0000000,  0.0000000,  0.0000000  
PAPER.csv:  5.0695895,  0.49972723E-02,  0.57501653E-03,  0.77963955,  0.11018023,  0.11018023,  0.10576665E-07,  0.0000000,  0.0000000,  0.0000000  
PLASTIC.csv:# 
PLASTIC.csv:# Run type: NEW
PLASTIC.csv:# Monitor type: Arithmetic average over region, Volume =  0.12800000E-02
PLASTIC.csv:# "Time","r_p","pmass","x_p(1)","x_p(2)","x_p(3)","RRates_R1","RRates_R2","RRates_R3","RRates_R4" 
PLASTIC.csv:  0.0000000,  0.50000000E-02,  0.50265482E-03,  0.90000000,  0.50000000E-01,  0.50000000E-01,  0.0000000,  0.0000000,  0.0000000,  0.0000000  
PLASTIC.csv:  1.0162327,  0.49994097E-02,  0.50247682E-03,  0.89996457,  0.50017713E-01,  0.50017713E-01,  0.10070405E-07,  0.0000000,  0.0000000,  0.0000000  
PLASTIC.csv:  2.0147192,  0.49987905E-02,  0.50229013E-03,  0.89992739,  0.50036303E-01,  0.50036303E-01,  0.10351706E-07,  0.0000000,  0.0000000,  0.0000000  
PLASTIC.csv:  3.0341349,  0.49981389E-02,  0.50209374E-03,  0.89988825,  0.50055874E-01,  0.50055874E-01,  0.10651745E-07,  0.0000000,  0.0000000,  0.0000000  
PLASTIC.csv:  4.0246034,  0.49974859E-02,  0.50189697E-03,  0.89984900,  0.50075498E-01,  0.50075498E-01,  0.10956040E-07,  0.0000000,  0.0000000,  0.0000000  
PLASTIC.csv:  5.0695895,  0.49967787E-02,  0.50168395E-03,  0.89980648,  0.50096761E-01,  0.50096761E-01,  0.11290980E-07,  0.0000000,  0.0000000,  0.0000000  

We can see that for all 4 types of particle, the radius and particle mass decrease (slowly) over time, and the mass fraction of species #1 (“biomass”) decreases while species #2 and #3 increase slightly.

And, furthermore, as you claimed, it seems only reaction #1 is active. Reaction #1 is:

biomass --> 0.0667*CO2 + 0.0881*CO + 0.07585*CH4 +
       0.0098*C2H4 + 0.00521*C2H6 + 0.00135*C3H8 + 0.00248*C5H12 +
        0.0927*C8H10_C6H5C2H5 + 0.432*H2

The other solids phases do not contain “biomass” as a species so this reaction should not affect them. (There’s a slight potential for confusion in that “biomass” is both the name of a phase and a species within that phase, this is not a problem as long as you don’t get confused. Similar for the other 3 solids phases).

I am a bit confused by this section at the end of usr_rates_des.f:

      lb = NO_OF_RXNS +1
      uB = NO_OF_RXNS + NO_OF_DES_RXNS
      ReactionRates(IJK,lB) = ReactionRates(IJK,lB) + DES_RATES(R1)
      ReactionRates(IJK,lB+1) = ReactionRates(IJK,lB+1) + DES_RATES(R2)
      ReactionRates(IJK,lB+2) = ReactionRates(IJK,lB+2) + DES_RATES(R3)
      ReactionRates(IJK,lB+3) = ReactionRates(IJK,lB+3) + DES_RATES(R4)

However, commenting this out doesn’t seem to change anything.
I tried with the simples usr_rates_des.f possible:

subroutine usr_rates_des(np, pm, ijk, des_rates)
     use des_rxns, only: no_of_des_rxns

     implicit none
     include 'species.inc'

     integer, intent(in) :: np  ! global index of particle
     integer, intent(in) :: pm  ! solid phase index of particle np
     integer, intent(in) :: ijk ! fluid cell index containing np
     double precision, intent(out) :: des_rates(no_of_des_rxns) ! computed rates

     des_rates(r1)= 0.000002
     des_rates(r2)= 0
     des_rates(r3)= 0
     des_rates(r4)= 0

     return
end subroutine usr_rates_des

and this is my result:

BIOMASS.csv:# 
BIOMASS.csv:# Run type: NEW
BIOMASS.csv:# Monitor type: Arithmetic average over region, Volume =  0.12800000E-02
BIOMASS.csv:# "Time","r_p","pmass","x_p(1)","x_p(2)","x_p(3)","RRates_R1","RRates_R2","RRates_R3","RRates_R4" 
BIOMASS.csv:  0.0000000,  0.50000000E-02,  0.44505896E-03,  0.74000000,  0.13000000,  0.13000000,  0.0000000,  0.0000000,  0.0000000,  0.0000000  
BIOMASS.csv:  1.0160345,  0.48564884E-02,  0.40782570E-03,  0.71628441,  0.14185780,  0.14185780,  0.20000000E-05,  0.0000000,  0.0000000,  0.0000000  
BIOMASS.csv:  2.0054074,  0.46978314E-02,  0.36914740E-03,  0.68663654,  0.15668173,  0.15668173,  0.20000000E-05,  0.0000000,  0.0000000,  0.0000000  
BIOMASS.csv:  3.0102229,  0.45193159E-02,  0.32864394E-03,  0.64814194,  0.17592903,  0.17592903,  0.20000000E-05,  0.0000000,  0.0000000,  0.0000000  
BIOMASS.csv:  3.9989596,  0.43099231E-02,  0.28504676E-03,  0.59458779,  0.20270610,  0.20270610,  0.20000000E-05,  0.0000000,  0.0000000,  0.0000000  
BIOMASS.csv:  5.0016396,  0.40936802E-02,  0.24425826E-03,  0.52716375,  0.23641812,  0.23641812,  0.20000000E-05,  0.0000000,  0.0000000,  0.0000000  
FABRIC.csv:# 
FABRIC.csv:# Run type: NEW
FABRIC.csv:# Monitor type: Arithmetic average over region, Volume =  0.12800000E-02
FABRIC.csv:# "Time","r_p","pmass","x_p(1)","x_p(2)","x_p(3)","RRates_R1","RRates_R2","RRates_R3","RRates_R4" 
FABRIC.csv:  0.0000000,  0.50000000E-02,  0.41887902E-03,  0.84000000,  0.80000000E-01,  0.80000000E-01,  0.0000000,  0.0000000,  0.0000000,  0.0000000  
FABRIC.csv:  1.0160345,  0.48472336E-02,  0.38164576E-03,  0.82440566,  0.87797169E-01,  0.87797169E-01,  0.20000000E-05,  0.0000000,  0.0000000,  0.0000000  
FABRIC.csv:  2.0054074,  0.46776182E-02,  0.34296746E-03,  0.80465964,  0.97670179E-01,  0.97670179E-01,  0.20000000E-05,  0.0000000,  0.0000000,  0.0000000  
FABRIC.csv:  3.0102229,  0.44857152E-02,  0.30246400E-03,  0.77859362,  0.11070319,  0.11070319,  0.20000000E-05,  0.0000000,  0.0000000,  0.0000000  
FABRIC.csv:  3.9989596,  0.42589179E-02,  0.25886682E-03,  0.74150477,  0.12924762,  0.12924762,  0.20000000E-05,  0.0000000,  0.0000000,  0.0000000  
FABRIC.csv:  5.0016396,  0.40223325E-02,  0.21807832E-03,  0.69337746,  0.15331127,  0.15331127,  0.20000000E-05,  0.0000000,  0.0000000,  0.0000000  
PAPER.csv:# 
PAPER.csv:# Run type: NEW
PAPER.csv:# Monitor type: Arithmetic average over region, Volume =  0.12800000E-02
PAPER.csv:# "Time","r_p","pmass","x_p(1)","x_p(2)","x_p(3)","RRates_R1","RRates_R2","RRates_R3","RRates_R4" 
PAPER.csv:  0.0000000,  0.50000000E-02,  0.57595865E-03,  0.78000000,  0.11000000,  0.11000000,  0.0000000,  0.0000000,  0.0000000,  0.0000000  
PAPER.csv:  1.0160345,  0.48898483E-02,  0.53872540E-03,  0.76480543,  0.11759728,  0.11759728,  0.20000000E-05,  0.0000000,  0.0000000,  0.0000000  
PAPER.csv:  2.0054074,  0.47699065E-02,  0.50004709E-03,  0.74664908,  0.12667546,  0.12667546,  0.20000000E-05,  0.0000000,  0.0000000,  0.0000000  
PAPER.csv:  3.0102229,  0.46374775E-02,  0.45954363E-03,  0.72437131,  0.13781435,  0.13781435,  0.20000000E-05,  0.0000000,  0.0000000,  0.0000000  
PAPER.csv:  3.9989596,  0.44859254E-02,  0.41594645E-03,  0.69557805,  0.15221097,  0.15221097,  0.20000000E-05,  0.0000000,  0.0000000,  0.0000000  
PAPER.csv:  5.0016396,  0.43342200E-02,  0.37515795E-03,  0.66256753,  0.16871624,  0.16871624,  0.20000000E-05,  0.0000000,  0.0000000,  0.0000000  
PLASTIC.csv:# 
PLASTIC.csv:# Run type: NEW
PLASTIC.csv:# Monitor type: Arithmetic average over region, Volume =  0.12800000E-02
PLASTIC.csv:# "Time","r_p","pmass","x_p(1)","x_p(2)","x_p(3)","RRates_R1","RRates_R2","RRates_R3","RRates_R4" 
PLASTIC.csv:  0.0000000,  0.50000000E-02,  0.50265482E-03,  0.90000000,  0.50000000E-01,  0.50000000E-01,  0.0000000,  0.0000000,  0.0000000,  0.0000000  
PLASTIC.csv:  1.0160345,  0.48733644E-02,  0.46542157E-03,  0.89200647,  0.53996766E-01,  0.53996766E-01,  0.20000000E-05,  0.0000000,  0.0000000,  0.0000000  
PLASTIC.csv:  2.0054074,  0.47344436E-02,  0.42674326E-03,  0.88224091,  0.58879543E-01,  0.58879543E-01,  0.20000000E-05,  0.0000000,  0.0000000,  0.0000000  
PLASTIC.csv:  3.0102229,  0.45796511E-02,  0.38623980E-03,  0.86992624,  0.65036879E-01,  0.65036879E-01,  0.20000000E-05,  0.0000000,  0.0000000,  0.0000000  
PLASTIC.csv:  3.9989596,  0.44004171E-02,  0.34264262E-03,  0.85344298,  0.73278512E-01,  0.73278512E-01,  0.20000000E-05,  0.0000000,  0.0000000,  0.0000000  
PLASTIC.csv:  5.0016396,  0.42183806E-02,  0.30185412E-03,  0.83370429,  0.83147857E-01,  0.83147857E-01,  0.20000000E-05,  0.0000000,  0.0000000,  0.0000000  

This shows all 4 types of particles shrinking and reacting, not just the Biomass phase. We might be looking at a bug in the chem reaction code, it might also be a bug in the monitor code. Or else I’m just confused too. We will get back to you when I know more!

Thanks for the report.

– Charles

1 Like

Jeff’s answer above is correct. If I change usr_rates_des.f to

subroutine usr_rates_des(np, pm, ijk, des_rates)
     use des_rxns, only: no_of_des_rxns

     implicit none
     include 'species.inc'

     integer, intent(in) :: np  ! global index of particle
     integer, intent(in) :: pm  ! solid phase index of particle np
     integer, intent(in) :: ijk ! fluid cell index containing np
     double precision, intent(out) :: des_rates(no_of_des_rxns) ! computed rates

     if (pm == 1) then
         des_rates(r1)= 0.000002
     else
         des_rates(r1) = 0.0
     endif
     des_rates(r2)= 0
     des_rates(r3)= 0
     des_rates(r4)= 0
     return
end subroutine usr_rates_des

then we get the expected results (particles in the BIOMASS phase react, the others do not).

This is slightly confusing and requires a bit of understanding the internals of MFiX (sorry). The species names and aliases which occur in reactions are converted to integers internally. So the biomass species is species 1 in phase 1. But in phase 2, species 1 is suliao, so that winds up reacting even though it’s not listed as one of the reactants in the definition of reaction R1. Unfortunately, fixing this would require a lot of code changes, so you have to understand this and handle the pm argument in your usr_rates_des subroutine.

– Charles

Thanks for both of your advice. I added pm=1, pm=2, pm=3, pm=4 to each reaction rate and got the expected result. Thank you very much again.

Best wishes