# Converted from st_st_osc_eigo.m - Oscillatory system eigenvalues (upper/limit-cycle branch)# Saves rows 441:rowend (the upper/limit-cycle segment)importnumpyasnpfromscipy.optimizeimportfsolvefrommiscimportsave_asciip=dict(k_m=0.004,T_m=298.,E=15000.,c_Af=2.,C_p=4.,rho=1000.,T_f=298.,T_a=298.,DeltaH_R=-2.2e5,U=340.,theta=35.,T_set=321.53,T_fs=298.,Kc=0.,)p['C_ps']=p['C_p']*p['rho']defst_st_cA(x,c_A,p):theta=x[0];T=x[1]k=p['k_m']*np.exp(-p['E']*(1./T-1./p['T_m']))return[p['c_Af']-(1+k*theta)*c_A,p['U']*theta*(p['T_a']-T)+p['C_ps']*(p['T_f']-T)-k*theta*c_A*p['DeltaH_R']]defst_st_theta(x,theta,p):c_A=x[0];T=x[1]k=p['k_m']*np.exp(-p['E']*(1./T-1./p['T_m']))return[p['c_Af']-(1+k*theta)*c_A,p['U']*theta*(p['T_a']-T)+p['C_ps']*(p['T_f']-T)-k*theta*c_A*p['DeltaH_R']]defcompute_lamrow(k,c_A,T,theta,p):Jac=np.array([[-1./theta-k,-k*c_A*p['E']/(T*T)],[-k*p['DeltaH_R']/p['C_ps'],-p['U']/p['C_ps']-1./theta-k*c_A*p['DeltaH_R']/p['C_ps']*p['E']/(T*T)]])lam=np.linalg.eigvals(Jac)a=lam[0].real;b=lam[0].imagc=lam[1].real;d=lam[1].imagreturn[a,b,c,d]ifa>=celse[c,d,a,b]# Lower branch (logspace in conversion)npts1=200x0=[1.,p['T_f']]xvect=np.logspace(np.log10(1e-4),np.log10(0.75),npts1)c_Avect=(1-xvect)*p['c_Af']table=[]forc_Ainc_Avect:X,_,ier,_=fsolve(lambdax:st_st_cA(x,c_A,p),x0,full_output=True)theta=X[0];T=X[1]conv=(p['c_Af']-c_A)/p['c_Af']k=p['k_m']*np.exp(-p['E']*(1./T-1./p['T_m']))lamrow=compute_lamrow(k,c_A,T,theta,p)table.append([theta,T,conv]+lamrow+[float(ier)])x0=Xc_A_c=c_A;T_c=T;theta_c=theta;conv_c=conv# Near-extinction patchnpts2=50xvect2=np.linspace(conv_c,0.95,npts2)c_Avect2=(1-xvect2)*p['c_Af']forc_Ainc_Avect2:X,_,ier,_=fsolve(lambdax:st_st_cA(x,c_A,p),x0,full_output=True)theta=X[0];T=X[1]conv=(p['c_Af']-c_A)/p['c_Af']k=p['k_m']*np.exp(-p['E']*(1./T-1./p['T_m']))lamrow=compute_lamrow(k,c_A,T,theta,p)table.append([theta,T,conv]+lamrow+[float(ier)])x0=Xc_A_c2=c_A;T_c2=T;theta_c2=theta# Upper branch segment 1 (logspace theta from corner to 20.7)npts3=200x0=[c_A_c2,T_c2]theta_vect3=np.logspace(np.log10(theta_c2),np.log10(20.7),npts3)forthetaintheta_vect3:X,_,ier,_=fsolve(lambdax:st_st_theta(x,theta,p),x0,full_output=True)c_A=X[0];T=X[1]conv=(p['c_Af']-c_A)/p['c_Af']k=p['k_m']*np.exp(-p['E']*(1./T-1./p['T_m']))lamrow=compute_lamrow(k,c_A,T,theta,p)table.append([theta,T,conv]+lamrow+[float(ier)])x0=Xtheta_c3=theta;c_A_c3=X[0];T_c3=X[1]# Fine patch near theta=[20.7, 20.8]npts4=100x0=[c_A_c3,T_c3]theta_vect4=np.linspace(theta_c3,20.8,npts4)forthetaintheta_vect4:X,_,ier,_=fsolve(lambdax:st_st_theta(x,theta,p),x0,full_output=True)c_A=X[0];T=X[1]conv=(p['c_Af']-c_A)/p['c_Af']k=p['k_m']*np.exp(-p['E']*(1./T-1./p['T_m']))lamrow=compute_lamrow(k,c_A,T,theta,p)table.append([theta,T,conv]+lamrow+[float(ier)])x0=Xtheta_c4=theta;c_A_c4=X[0];T_c4=X[1]# Finish to large thetanpts5=200x0=[c_A_c4,T_c4]theta_vect5=np.logspace(np.log10(theta_c4),np.log10(500.),npts5)forthetaintheta_vect5:X,_,ier,_=fsolve(lambdax:st_st_theta(x,theta,p),x0,full_output=True)c_A=X[0];T=X[1]conv=(p['c_Af']-c_A)/p['c_Af']k=p['k_m']*np.exp(-p['E']*(1./T-1./p['T_m']))lamrow=compute_lamrow(k,c_A,T,theta,p)table.append([theta,T,conv]+lamrow+[float(ier)])x0=Xtable=np.array(table)rowend=npts1+npts2+npts3+npts4+npts5# Octave saves rows 441:rowend (1-indexed), i.e. Python 440:rowendtmp=table[440:rowend,:]save_ascii('st_st_osc_eigo.dat',tmp)