# Converted from multi_log.m - multi-component pellet with log transformationimportnumpyasnpfromscipy.optimizeimportfsolvefrommiscimportcolloc,octave_savep=dict(Rg=8.314,P=1.013e5,T=550.,Rp=0.175,)p['cf_tot']=p['P']/(p['Rg']*p['T'])*1e-6p['cf_a']=p['cf_tot']*0.02p['cf_b']=p['cf_tot']*0.03p['cf_c']=p['cf_tot']*5e-4p['k_k10']=6.802e16*2.6e6*80./100*0.05/100p['k_k20']=1.416e18*2.6e6*80./100*0.05/100p['k_E1']=13108.p['k_E2']=15109.p['k_Ka0']=8.099e6p['k_Kc0']=2.579e8p['k_Ea']=-409.p['k_Ec']=191.p['D_a']=0.0487;p['D_b']=0.0469;p['D_c']=0.0487p['km_a']=0.4*9.76;p['km_b']=0.4*10.18;p['km_c']=0.4*9.76npts=40R_col,A_col,B_col,Q_col=colloc(npts-2,'left','right')R_col=R_col*p['Rp']A_col=A_col/p['Rp']B_col=B_col/p['Rp']**2Q_col=Q_col*p['Rp']Aint=A_col[1:npts-1,:]Bint=B_col[1:npts-1,:]Rint=R_col[1:npts-1]p['npts']=nptsp['col_R']=R_col;p['col_A']=A_col;p['col_B']=B_colp['col_Aint']=Aint;p['col_Bint']=Bint;p['col_Rint']=Rintdefpellet(x,p):n=p['npts']za=x[:n];zb=x[n:2*n];zc=x[2*n:3*n]ca=np.exp(za);cb=np.exp(zb);cc=np.exp(zc)k1=p['k_k10']*np.exp(-p['k_E1']/p['T'])k2=p['k_k20']*np.exp(-p['k_E2']/p['T'])Ka=p['k_Ka0']*np.exp(-p['k_Ea']/p['T'])Kc=p['k_Kc0']*np.exp(-p['k_Ec']/p['T'])den=(1+Ka*ca+Kc*cc)**2r1=k1*ca*cb/den;r2=k2*cc*cb/denRa=-r1;Rb=-0.5*r1-4.5*r2;Rc_=-r2retval=np.zeros(3*n)# Aretval[0]=p['col_A'][0,:]@zaretval[1:n-1]=(p['col_Bint']@za+(p['col_Aint']@za)*(p['col_Aint']@za+2./p['col_Rint'])+Ra[1:n-1]/(p['D_a']*ca[1:n-1]))dzadr=p['col_A'][-1,:]@zaretval[n-1]=p['D_a']*dzadr-p['km_a']*(p['cf_a']/ca[-1]-1)# Bretval[n]=p['col_A'][0,:]@zbretval[n+1:2*n-1]=(p['col_Bint']@zb+(p['col_Aint']@zb)*(p['col_Aint']@zb+2./p['col_Rint'])+Rb[1:n-1]/(p['D_b']*cb[1:n-1]))dzbdr=p['col_A'][-1,:]@zbretval[2*n-1]=p['D_b']*dzbdr-p['km_b']*(p['cf_b']/cb[-1]-1)# Cretval[2*n]=p['col_A'][0,:]@zcretval[2*n+1:3*n-1]=(p['col_Bint']@zc+(p['col_Aint']@zc)*(p['col_Aint']@zc+2./p['col_Rint'])+Rc_[1:n-1]/(p['D_c']*cc[1:n-1]))dzcdr=p['col_A'][-1,:]@zcretval[3*n-1]=p['D_c']*dzcdr-p['km_c']*(p['cf_c']/cc[-1]-1)returnretval# Initial guess (linear from small value to bulk)zain=np.log(1e-9*p['cf_a']);zaout=np.log(0.75*p['cf_a'])za0=zain+R_col/p['Rp']*(zaout-zain)zbin=np.log(0.75*p['cf_b']);zbout=np.log(p['cf_b'])zb0=zbin+R_col/p['Rp']*(zbout-zbin)zcin=np.log(1e-6*p['cf_c']);zcout=np.log(p['cf_c'])zc0=zcin+R_col/p['Rp']*(zcout-zcin)z0=np.concatenate([za0,zb0,zc0])eps_sq=np.sqrt(np.finfo(float).eps)z=fsolve(lambdax:pellet(x,p),z0,full_output=False)za=z[:npts];zb=z[npts:2*npts];zc=z[2*npts:3*npts]ca=np.exp(za);cb=np.exp(zb);cc=np.exp(zc)dzadr=A_col[-1,:]@za;dzbdr=A_col[-1,:]@zb;dzcdr=A_col[-1,:]@zcdcadr=dzadr*ca;dcbdr=dzbdr*cb;dccdr=dzcdr*cc# Compute product concentrations D and Ep['km_d']=p['km_a'];p['km_e']=p['km_b']p['D_d']=p['D_a'];p['D_e']=p['D_b']p['cf_d']=0.;p['cf_e']=0.dcddr=(-p['D_a']*dcadr[-1]-3*p['D_c']*dccdr[-1])/p['D_d']dcedr=(-3*p['D_c']*dccdr[-1])/p['D_e']cdR=p['cf_d']-p['D_d']*dcddr/p['km_d']ceR=p['cf_e']-p['D_e']*dcedr/p['km_e']concd=(p['D_a']*(ca[-1]-ca)+3*p['D_c']*(cc[-1]-cc))/p['D_d']+cdRce=3*p['D_c']*(cc[-1]-cc)/p['D_e']+ceRtable=np.column_stack([R_col,ca,cb,cc,concd,ce,dcadr,dcbdr,dccdr])table_2=np.array([[p['Rp'],p['cf_a'],p['cf_b'],p['cf_c'],p['cf_d'],p['cf_e']]])octave_save('multi_log.dat',('table',table),('table_2',table_2))