Exemple #1
0
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
Exemple #2
0
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