def final_record_files(df,rf,sol,problem,mesh):
	df.file << sol
	df.dfile << problem.density_funcs.combined_density
	#dump average
	problem.density_funcs.combined_density.vector()[:]=problem.avg_dens.func
	for x in problem.avg_dens.func:
		rf.density.write(str(x)+" ")
	df.adfile << problem.density_funcs.combined_density
	avgE=mc.negGradient(mesh,PoissonSolve(mesh,
					problem.density_funcs.combined_density,
					problem.bcs,problem.V),
				problem.V2)
	df.avggradfile << avgE
def mainloop(mesh,system,problem,df,rf,scale):
	print "Beginning Simulation"
	current_values = []
	for x in range(options.num):
		start1 = time.time()

		#Solve equation using avg_dens
		print "combined_density",problem.density_funcs.combined_density
		sol = PoissonSolve(mesh,
				problem.density_funcs.scaled_density,
				problem.bcs,problem.space)
		#handle Monte Carlo
		print "Starting Step ",x
		electric_field = (mc.negGradient(mesh,sol,problem.V2))
		start2 = time.time()
		mc.MonteCarlo(mesh,system,sol,electric_field,
				problem.density_funcs,problem.avg_dens,
				problem.avg_electrons,problem.avg_holes,
				current_values)
		end2 = time.time()
		print problem.density_funcs.combined_density
		#Report
		write_results(df,rf,problem,sol,electric_field,current_values)
		end = time.time()
		print "Monte Took: ",end2-start2
		print "Loop Took:",end-start1

	#photocurrent
	current= pc.generate_photo_current(mesh,electric_field,problem)
	rf.current.write("pc: "+str(current)+"\n")

	final_record_files(df,rf,sol,problem,mesh)
	avg_length = 0
	for particle in mesh.trajectories:
		avg_length += len(mesh.trajectories[particle])
		#rf.trajectory.write(str(mesh.trajectories[particle]))
		#rf.trajectory.write("\n")
	print current_values
#	avg_length /= 1.*len(mesh.trajectories)
	print "Average trajectory length:",avg_length