# Converted from wh.m - Weisz-Hicks eta vs phi, parametric search (multiple beta)importnumpyasnpfromscipy.optimizeimportfsolvefromscipy.specialimportexp1frommiscimportcolloc,octave_savep=dict(gamma=30.)n=60npoint=75betavals=[0.6,0.4,0.3,0.2,0.1,0.,-0.8]rE0=[0.15]*len(betavals)rE0[4]=0.1Rad=3.p['cS']=1.options_tol=1e-8R_col,A_col,B_col,Q_col=colloc(n-2,'left','right')R_col=R_col*RadA_col=A_col/RadB_col=B_col/(Rad**2)p['R']=R_col;p['A']=A_col;p['B']=B_coldefindef(x,a,b):# indefinite integral for calcI# expi(z) = -E1(-z) for z < 0; here z = -a/(b*(x-1)-1)z=-a/(b*(x-1)-1)expi=-(exp1(z)+np.pi*1j)val=(np.exp(a)*(b*x*np.exp(a/(b*(x-1)-1))*(a+b*x)-a*(a+2*b+2)*expi)-(b+1)*(a+b+1)*np.exp(a*(1./(b*(x-1)-1)+1)))/(2*b**2)returnval.realdefcalcI(gam,beta):ifbeta==0.:return1.returnnp.sqrt(2*(indef(1.,gam,beta)-indef(0.,gam,beta)))defeta_initial(c,p):phi_hat=p['phi_ini']*p['I']ep=np.exp(p['gamma']*p['beta']*(1-c)/(1+p['beta']*(1-c)))retval=p['A']@c*2./p['R']+p['B']@c-phi_hat**2*c*epretval[0]=p['A'][0,:]@cretval[-1]=c[-1]-p['cS']returnretvaldefeta_calc(para,p):c=para[:-1];psi=para[-1]eta=10**(p['rE']*np.sin(psi)+np.log10(p['eta_prev']))phi=10**(p['rE']*np.cos(psi)+np.log10(p['phi_prev']))phi_hat=phi*p['I']ep=np.exp(p['gamma']*p['beta']*(1-c)/(1+p['beta']*(1-c)))retval=np.zeros(len(para))retval[:-1]=p['A']@c*2./p['R']+p['B']@c-phi_hat**2*c*epretval[0]=p['A'][0,:]@cretval[-2]=c[-1]-p['cS']dcdr=p['A']@ceta_colloc=dcdr[-1]/phi_hat**2retval[-1]=eta-eta_collocreturnretvalnbeta=len(betavals)phistore=[[]for_inrange(nbeta)]etastore=[[]for_inrange(nbeta)]p['phi_ini']=5e-4para_end=0.01In01=np.ones(n)forjinrange(nbeta):p['beta']=betavals[j]p['I']=calcI(p['gamma'],p['beta'])p['rE']=rE0[j]p['phi_prev']=p['phi_ini']psi_prev=0.;delpsi=0.In0=np.append(np.ones(n),0.)foriinrange(npoint):ifi==0:ini,_,info,_=fsolve(lambdac:eta_initial(c,p),In01,full_output=True)[:4]deriv=p['A']@inip['eta_ini']=deriv[-1]/(p['phi_ini']*p['I'])**2p['eta_prev']=p['eta_ini']phistore[j].append(p['phi_ini'])etastore[j].append(p['eta_ini'])x_sol,_,info,_=fsolve(lambdax:eta_calc(x,p),In0,full_output=True)[:4]psi=x_sol[-1]eta=10**(p['rE']*np.sin(psi)+np.log10(p['eta_prev']))phi=10**(p['rE']*np.cos(psi)+np.log10(p['phi_prev']))In0=x_sol.copy()In0[-1]+=delpsiphistore[j].append(phi)etastore[j].append(eta)p['phi_prev']=phi;p['eta_prev']=etadelpsi=psi-psi_prev;psi_prev=psip['rE']=rE0[j]*(1-abs(delpsi/np.pi))**20ifabs(np.log10(p['eta_prev']*p['phi_prev']))<para_end:breaktable_list=[np.column_stack([phistore[j],etastore[j]])forjinrange(nbeta)]xline1=np.array([0.001,10.])yline1=np.array([1000.,0.1])xline2=np.array([0.01,0.01])yline2=np.array([0.2,500.])table2=np.column_stack([xline1,yline1,xline2,yline2])octave_save('wh.dat',*[('table%d'%j,table_list[j])forjinrange(nbeta)],('table2',table2))