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); }