def RK3evolve(y,CFL,nstep,rho0,s,RKopt, param=0.0,param0 =0.0,verb = False,time0=None, ru00=[], rv00=[], t00=[]): """ This functions evolve rhou00,T00 and updates rhov00 using drho, reproduces 00 mode evolution of loma (time,y,rhou00,rhov00,T00,timev,dwv) = evolve(my,CFL,nstep,deltaT,RKopt,time0,y,ru00,rv00,t00) """ if verb == True: print "Running Runge-Kutta evolution..." #RKNEW if RKopt == 1: #RK 3 xi = [0 ,-17.0/60.0, -5.0/12.0] gamma = [8./15., 5./12., 3./4. ] beta = [gamma[0]-param0, param, (param*(gamma[0]*gamma[2]+gamma[1]*gamma[2]+xi[1]*gamma[2]+gamma[0]*xi[2])-gamma[0]*gamma[1]*gamma[2]+gamma[0]*gamma[1]*xi[2])/(param-gamma[0]*gamma[1])] alpha = [param0, gamma[1]+xi[1]-param, gamma[2]+xi[2]-beta[2] ] #beta = [8./15., 17/15., 1/6. ] if verb == True: print "using RK3 with Low Storage" print alpha, beta, gamma,xi elif RKopt == 2: alpha = [0, -1., 1/6. ] gamma = [8./15., 5./12., 3./4. ] beta = [8./15., param, (1-gamma[0]+param*gamma[0])/(param*gamma[0])] #beta = [8./15., 17/15., 1/6. ] xi = [0.0 ,-17.0/60.0, -5.0/12.0] #ibeta = [15./4., 15., 6.0 ] if verb == True: print "Using RK3 new option (not Spalart)" else: #NOTE THAT RKopt==3 gives EXPLICIT RK3 #RKspalart gamma = [8./15, 5./12., 3./4. ] xi = [0.0 , -17./60.0, -5.0/12.0] alpha = [29./96., -3./40., 1./6. ] beta = [37./160., 5./24., 1./6. ] ibeta = [160./37., 24./5.0, 6.0 ] if verb == True: print "Using RK3 Spalart, EXP-IMP" #------------Physics -------------------------# ire = 1./160. #inverse of Reynolds ipe = 1./(160.*0.7) #inverse of Peclet my = len(y) L = y[-1] #---------------------------------------------# #Initialization of variables (arrays) if RKopt == 3 and verb==True: print "using RK3 Spalart..." time=0.0 dw=zeros(nstep) timev = zeros(nstep) T00last = zeros(my) T00last1 = zeros(my) drho = zeros(my) drhodt = zeros(my) drholast = zeros(my) intdrho = zeros(my) DT00 = zeros(my) if time0 is None: (rhou00,rhov00,T00) = geninit(y,rho0,s) else: #restarting print "Restarting from previous run..." rhou00 = ru00 rhov00 = rv00 T00 = t00 time = time0 [prem1,prem3,dt11,dt12,dt21,dt22,fmap]= compact.derivadas(y,my) rhotop = 1.0/T00[-1] rhobot = 1.0/T00[0] DU = (rhou00*T00).max()-(rhou00*T00).min() #density ratio sratio = s if verb == True: print "density ratio = %s" % sratio #Start RHS rhs1=zeros([my,3]) #RHS rhou00 rhs4=zeros([my,3]) #RHS T00 Dtvisc = min(diff(y))**2./(2.*ire) #Start istep if RKopt==2: #Update using N(rho) directly (NOT low-storage) for istep in range(nstep): #Obtain timestep Dt = max(1./Dtvisc,max(rhov00*T00)/min(diff(y))) Dt = CFL/Dt if istep==0 and verb == True: # Dt = 0.01*Dtvisc #first step is important print "Initial Dt = %s" % Dt for rkstep in range(3): #For each rkstep #Define the RHS's rhs1[:,rkstep] = -compact.deryr(rhou00*rhov00*T00,dt12,prem1,fmap,my) +ire *compact.deryyr(rhou00*T00,dt22,prem3,my) rhs4[:,rkstep] = -rhov00*T00*compact.deryr(T00,dt12,prem1,fmap,my) + ipe*T00*compact.deryyr(T00,dt22,prem3,my) #Define Dt*RKparameters dtxi = Dt* xi[rkstep] dtgamma = Dt* gamma[rkstep] dtbeta = Dt* beta[rkstep] T00last = T00 #Save T00 before evolution #Explicit Evolution: if rkstep == 0: #First rkstep rhou00 = rhou00 + dtgamma*rhs1[:,rkstep] #Evolve rhou00 DT00 = dtgamma*rhs4[:,rkstep] #Save the increment of T00 T00 = T00 + dtgamma*rhs4[:,rkstep] drhodt = -rhs4[:,rkstep]/T00last**2.0 #First substep else: rhou00 = rhou00[:] + dtgamma*rhs1[:,rkstep] + dtxi*rhs1[:,rkstep-1] DT00 = dtgamma*rhs4[:,rkstep] + dtxi*rhs4[:,rkstep-1] T00 = T00 + dtgamma*rhs4[:,rkstep] + dtxi*rhs4[:,rkstep-1] drhodt=(1.0-xi[rkstep]/beta[rkstep])*(-rhs4[:,rkstep]/T00**2.)+xi[rkstep]/beta[rkstep]*(-rhs4[:,rkstep-1]/T00last**2.) #Option 1, not sure about value of v00 at boundaries: rhov00 = trapz(drhodt,y)/(sratio+1.)-cumtrapz(drhodt,y,initial=0.0) #Option 2, we know this should be zero #rhov00 = -cumtrapz(drhodt,y,initial=0.0) #v00(-Ly) = 0.0 time += Dt dw[istep]=DU/(abs(compact.deryr(rhou00*T00,dt12,prem1,fmap,my))).max() timev[istep]=time if isNaN(dw[istep]): print 'NaN found in this simulation!' return time,rhou00,rhov00, T00,timev,dw #print "istep = %s, rkstep = %s" % (istep, rkstep) elif RKopt==1: #Low Storage RK3 for istep in range(nstep): #Obtain timestep Dt = 1./Dtvisc #Dt = max(1./Dtvisc,max(rhov00*T00)/min(diff(y))) Dt = CFL/Dt if istep==0 and verb == True: # Dt = 0.01*Dtvisc #first step is important print "Initial Dt = %s" % Dt for rkstep in range(3): #For each rkstep #Define the RHS's rhs1[:,rkstep] = -compact.deryr(rhou00*rhov00*T00,dt12,prem1,fmap,my) +ire *compact.deryyr(rhou00*T00,dt22,prem3,my) rhs4[:,rkstep] = -rhov00*T00*compact.deryr(T00,dt12,prem1,fmap,my) + ipe*T00*compact.deryyr(T00,dt22,prem3,my) #Define Dt*RKparameters dtxi = Dt* xi[rkstep] dtgamma = Dt* gamma[rkstep] dtbeta = Dt* beta[rkstep] T00last = T00 if rkstep == 0: #First rkstep rhou00 = rhou00 + dtgamma*rhs1[:,rkstep] #Evolve rhou00 DT00 = dtgamma*rhs4[:,rkstep] #Save the increment of T00 T00 = T00 + DT00 drhodt = -DT00/(beta[rkstep]*Dt*T00last*T00)-alpha[rkstep]/beta[rkstep]*drhodt #drhodt = -rhs4[:,rkstep]/T00last**2. else: rhou00 = rhou00[:] + dtgamma*rhs1[:,rkstep] + dtxi*rhs1[:,rkstep-1] DT00 = dtgamma*rhs4[:,rkstep] + dtxi*rhs4[:,rkstep-1] T00 = T00 + DT00 drhodt = -DT00/(beta[rkstep]*Dt*T00last*T00)-alpha[rkstep]/beta[rkstep]*drhodt rhov00= compact.inty8(drhodt,fmap,dt11,dt12,prem1,my) M = rhov00[-1]-rhov00[0] rhov00 = -(rhov00 - rhov00[0]) + M*rhobot/(rhotop+rhobot) #rhov00 = trapz(drhodt,y)/(sratio+1.)-cumtrapz(drhodt,y,initial=0.0) #istep loop time += Dt dw[istep]=DU/(abs(compact.deryr(rhou00*T00,dt12,prem1,fmap,my))).max() timev[istep]=time if isNaN(dw[istep]): print 'NaN found in this simulation!' return time,rhou00,rhov00, T00,timev,dw elif RKopt==3: #Update using N(rho) directly (NOT low-storage) #FIRST STEP is different timev[0] = 0.0 dw[0]=DU/(abs(compact.deryr(rhou00*T00,dt12,prem1,fmap,my))).max() Dt = max(1./Dtvisc,max(rhov00*T00)/min(diff(y))) Dt = CFL/Dt print "Initial Dt = %s" % Dt T00last = T00 #Save T00 at step n Dtkp1 = 0.0 for rkstep in range(3): Dtkp1 += Dt*(gamma[rkstep]+xi[rkstep]) #For each rkstep #Define the RHS's rhs1[:,rkstep] = -compact.deryr(rhou00*rhov00*T00,dt12,prem1,fmap,my) +ire *compact.deryyr(rhou00*T00,dt22,prem3,my) rhs4[:,rkstep] = -rhov00*T00*compact.deryr(T00,dt12,prem1,fmap,my) + ipe*T00*compact.deryyr(T00,dt22,prem3,my) #Define Dt*RKparameters dtxi = Dt* xi[rkstep] dtgamma = Dt* gamma[rkstep] dtbeta = Dt* beta[rkstep] #Explicit Evolution: if rkstep == 0: #First rkstep rhou00 = rhou00 + dtgamma*rhs1[:,rkstep] #Evolve rhou00 DT00 = dtgamma*rhs4[:,rkstep] #Save the increment of T00 T00 = T00 + dtgamma*rhs4[:,rkstep] else: rhou00 = rhou00[:] + dtgamma*rhs1[:,rkstep] + dtxi*rhs1[:,rkstep-1] DT00 = dtgamma*rhs4[:,rkstep] + dtxi*rhs4[:,rkstep-1] T00 = T00 + dtgamma*rhs4[:,rkstep] + dtxi*rhs4[:,rkstep-1] drhodt = ((1.0/T00)-(1.00/T00last))/Dtkp1 #Option 1, not sure about value of v00 at boundaries: rhov00 = trapz(drhodt,y)/(sratio+1.)-cumtrapz(drhodt,y,initial=0.0) #Option 2, we know this should be zero #rhov00 = -cumtrapz(drhodt,y,initial=0.0) #v00(-Ly) = 0.0 time += Dt dw[istep]=DU/(abs(compact.deryr(rhou00*T00,dt12,prem1,fmap,my))).max() timev[1]=time #End OF FIRST STEP #--------------------------------------------------------------# for istep in range(1,nstep-1): T00last1 = T00last T00last = T00 #Save T00 before evolution Dtkp1 = 0.0 Dt1 = Dt #PREVIOUS DT #Obtain timestep Dt = max(1./Dtvisc,max(rhov00*T00)/min(diff(y))) Dt = CFL/Dt for rkstep in range(3): Dtkp1 += Dt*(gamma[rkstep]+xi[rkstep]) ALP = Dt1/Dtkp1 #For each rkstep #Define the RHS's rhs1[:,rkstep] = -compact.deryr(rhou00*rhov00*T00,dt12,prem1,fmap,my) +ire *compact.deryyr(rhou00*T00,dt22,prem3,my) rhs4[:,rkstep] = -rhov00*T00*compact.deryr(T00,dt12,prem1,fmap,my) + ipe*T00*compact.deryyr(T00,dt22,prem3,my) #Define Dt*RKparameters dtxi = Dt* xi[rkstep] dtgamma = Dt* gamma[rkstep] dtbeta = Dt* beta[rkstep] #Explicit Evolution: if rkstep == 0: #First rkstep rhou00 = rhou00 + dtgamma*rhs1[:,rkstep] #Evolve rhou00 T00 = T00 + dtgamma*rhs4[:,rkstep] else: rhou00 = rhou00[:] + dtgamma*rhs1[:,rkstep] + dtxi*rhs1[:,rkstep-1] T00 = T00 + dtgamma*rhs4[:,rkstep] + dtxi*rhs4[:,rkstep-1] drhodt = (((1.+ALP)**2.0-1.0)*(1.0/T00)-(1.0+ALP)**2.0*(1.0/T00last)+1.0/T00last1)/((1.+ALP)*Dt1) #Option 1, not sure about value of v00 at boundaries: rhov00 = trapz(drhodt,y)/(sratio+1.)-cumtrapz(drhodt,y,initial=0.0) #Option 2, we know this should be zero #rhov00 = -cumtrapz(drhodt,y,initial=0.0) #v00(-Ly) = 0.0 dw[istep]=DU/(abs(compact.deryr(rhou00*T00,dt12,prem1,fmap,my))).max() time += Dt timev[istep+1]=time if isNaN(dw[istep]): print 'NaN found in this simulation!' return time, rhou00,rhov00, T00,timev,dw #print "istep = %s, rkstep = %s" % (istep, rkstep) if verb == True: print "last Dt = %s" % Dt print "final time = %s, dw = %s " % (timev[-1],dw[-1]) return time, rhou00,rhov00, T00,timev,dw
def lomahz(y,CFL,nstep,rho0,s,RKopt, param=0.4,param0 =-0.2,verb = False,time0=None, ru00=[], rv00=[], t00=[]): """ This functions evolve rhou00,T00 and updates rhov00 using drho, reproduces 00 mode evolution of loma (time,y,rhou00,rhov00,T00,timev,dmv) = evolve(my,CFL,nstep,deltaT,RKopt,time0,y,ru00,rv00,t00) """ if verb == True: print "Running Runge-Kutta evolution of LOMAHZ_1D..." #RKNEW xi = [0 ,-17.0/60.0, -5.0/12.0] gamma = [8./15., 5./12., 3./4. ] beta = [gamma[0]-param0, param, (param*(gamma[0]*gamma[2]+gamma[1]*gamma[2]+xi[1]*gamma[2]+gamma[0]*xi[2])-gamma[0]*gamma[1]*gamma[2]+gamma[0]*gamma[1]*xi[2])/(param-gamma[0]*gamma[1])] alpha = [param0, gamma[1]+xi[1]-param, gamma[2]+xi[2]-beta[2] ] #------------Physics -------------------------# Reynolds = 160.0;Pr=0.7 ire = 1./Reynolds #inverse of Reynolds ipe = 1./(Reynolds*Pr) #inverse of Peclet my = len(y) L = y[-1] #---------------------------------------------# #Initialization of variables (arrays) time=0.0 dm=zeros(nstep) timev = zeros(nstep) T00last = zeros(my) T00last1 = zeros(my) drho = zeros(my) drhodt = zeros(my) drholast = zeros(my) intdrho = zeros(my) DT00 = zeros(my) if time0 is None: (rhou00,rhov00,T00) = geninit(y,rho0,s) else: #restarting print "Restarting from previous run..." rhou00 = ru00 rhov00 = rv00 T00 = t00 time = time0 [prem1,prem3,dt11,dt12,dt21,dt22,fmap]= compact.derivadas(y,my) rhotop = 1.0/T00[-1] rhobot = 1.0/T00[0] # #density ratio sratio = s if verb == True: print "density ratio = %s" % sratio #Start RHS rhs1=zeros([my,3]) #RHS rhou00 rhs4=zeros([my,3]) #RHS T00 rhomin = min(rhobot,rhotop) sigma = 0.0 Tmax = 1.0/rhomin #Calculating viscous timestep Dmu =Tmax**(sigma+1.0)/(Reynolds*Pr)*(1.0/np.min(diff(y))**2) #Start istep for istep in range(nstep): Dc =np.max(rhov00*T00)*(1.0/np.min(diff(y))) #Obtain timestep Dt = CFL/(Dc+Dmu) if istep==0 and verb == True: # Dt = 0.01*Dtvisc #first step is important print "Initial Dt = %s" % Dt for rkstep in range(3): #For each rkstep #Define the RHS's rhs1[:,rkstep] = -compact.deryr(rhou00*rhov00*T00,dt12,prem1,fmap,my) +ire *compact.deryyr(rhou00*T00,dt22,prem3,my) rhs4[:,rkstep] = -rhov00*T00*compact.deryr(T00,dt12,prem1,fmap,my) + ipe*T00*compact.deryyr(T00,dt22,prem3,my) #Define Dt*RKparameters dtxi = Dt* xi[rkstep] dtgamma = Dt* gamma[rkstep] dtbeta = Dt* beta[rkstep] #Calculations T00last = T00 #rhou00=evolverkstep(rhou00,rhs1[:,rkstep],rhs1[:,rkstep-1],dtgamma,dtxi] rhou00 = rhou00[:] + dtgamma*rhs1[:,rkstep] + dtxi*rhs1[:,rkstep-1] DT00 = dtgamma*rhs4[:,rkstep] + dtxi*rhs4[:,rkstep-1] T00 = T00 + DT00 #drhodt=-Drho/betaDt drhodt = DT00/(beta[rkstep]*Dt*T00last*T00) kk = compact.inty80(list(drhodt),fmap,dt11,dt12,prem1) M = kk[-1] #flow outcome #M = trapz(drhodt,y) #flow outcome #drhodt = cumtrapz(drhodt,y,initial=0)-M/(1.0+sratio**(-0.5)) drhodt = kk-M/(1.0+sratio**(-0.5)) rhov00 = drhodt-alpha[rkstep]/beta[rkstep]*rhov00 #istep loop time += Dt dm[istep]=calcdmcomp(y,rhou00*T00,rhou00,1.0/T00) timev[istep]=time if isNaN(dm[istep]): print 'NaN found in this simulation!' return time,rhou00,rhov00, T00,timev,dm if verb == True: print "last Dt = %s" % Dt print "final time = %s, dm = %s " % (timev[-1],dm[-1]) return time, rhou00,rhov00, T00,timev,dm