Example #1
0
static void go_ray(struct initializations &init, Spectrum &spec,
		Metric &metric, Particle &particle, EMField &emfield,
		string &plotfilename)
{
	myfloat dtau = init.dtau;

	ofstream plotfile(plotfilename.c_str());
	ofstream dtaufile("globaldtau.dat");
	ofstream wrongfile("globalwrong.dat");
	plotfile << scientific;
	dtaufile << scientific;
	wrongfile << scientific;

	// Print important information to plotfile
	plotfile << "# Metric: " << metric.name << endl;
	plotfile << "#	m = " << metric.m << endl
		<< "#	a = " << metric.a << endl
		<< "#	q = " << metric.q << endl;
	plotfile << "# particle:" << endl
		<< "#	m = " << init.teilchen_masse << endl
		<< "#	q = " << init.teilchen_ladung << endl;
	plotfile << "# length_4velocity = "
		<< scalar(metric, particle.x, particle.u, particle.u)
		<< endl
		<< "# dtau = " << dtau << endl
		<< "# tau_max = " << init.tau_max << endl
		<< "# max_wrongness = " << init.max_wrongness << endl
		<< "# max_x1 = " << init.max_x1 << endl;
	plotfile << "# x3 x1 x2 x0	wrong	u3 u1 u2 u0" << endl;

	myfloat wrong = wrongness(metric, &init, particle.x,
			particle.u);
	myfloat wrong_old = wrong;

	// Iterate
	int absorb_last = 0;
	int taun = -1;
	myfloat tau = 0.0;
	while ((absol(wrong) <= init.max_wrongness)
		&& (tau <= init.tau_max + dtau))
	{
		dtau = init.dtau * pow(absol(particle.x[1] - 2 * init.m), sqrt(3.0));

		if (++taun % 256 == 0) {
			info(metric, taun, tau, dtau, wrong, particle);
			if (taun >= 10000) {
				cerr << "WARNING: Aborting prematurely: taking too long" << endl;
				break;
			}
		}

		// print to file
		plotfile<< particle.x[3] << ' '
			<< particle.x[1] << ' '
			<< particle.x[2] << ' '
			<< particle.x[0] << '\t'
			<< wrong	 << '\t'
			<< particle.u[3] << ' '
		        << particle.u[1] << ' '
		        << particle.u[2] << ' '
		        << particle.u[0] << '\t'
			<< tau << '\t'
			<< dtau
			<< endl;

		dtaufile << tau << "\t" << dtau << endl;
		wrongfile << tau << "\t" << wrong << endl;

		tau += dtau;


		// Berechne x, u
		x_and_u(metric, emfield, dtau, particle);

		// Update spectrum
		absorb += spec.inc_cnts(particle.x, particle.u);

		wrong_old = wrong;
		wrong = wrongness(metric, &init, particle.x, particle.u);

		if (absorb) {
			if (absorb >= absorb_max)
				break;
			if (absorb == absorb_last)
				// error, currently
				break;
			absorb_last = absorb;
		}
		if ((particle.x[1] > init.max_x1)
				|| (particle.x[1] < init.min_x1))
			break;
	}
	plotfile << endl;
	plotfile << "# length_4velocity = "
		<< scalar(metric, particle.x, particle.u, particle.u)
		<< endl;

	plotfile.close();
	dtaufile.close();
	wrongfile.close();

	info(metric, taun, tau, dtau, wrong, particle);

	append_file(taun);
}