This file provides a command line tool to generate the precomputed textures of our black hole model, and to save them into binary files. It simply calls the preprocessing functions and saves their result.
#include <fstream> #include <iostream> #include "black_hole/preprocess/functions.h" #include "math/binary_function.h" namespace black_hole { namespace preprocess { namespace { using dimensional::BinaryFunction; template <unsigned int NX, unsigned int NY, class T1, class T2> void SaveTexture(const BinaryFunction<NX, NY, Tuple2<T1, T2>>& texture, const std::string& file_name) { std::unique_ptr<float[]> pixels(new float[2 * NX * NY + 2]); pixels[0] = static_cast<float>(NX); pixels[1] = static_cast<float>(NY); for (unsigned int y = 0; y < NY; ++y) { for (unsigned int x = 0; x < NX; ++x) { const auto& texel = texture.Get(x, y); const int offset = 2 * (x + y * NX) + 2; pixels[offset] = static_cast<float>(texel.x.to(T1::Unit())); pixels[offset + 1] = static_cast<float>(texel.y.to(T2::Unit())); } } std::ofstream output_stream(file_name, std::ofstream::out | std::ofstream::binary); output_stream.write((const char*)pixels.get(), (2 * NX * NY + 2) * sizeof(float)); output_stream.close(); } void Main(const std::string& output_dir) { RayDeflectionTexture ray_deflection_texture; ComputeRayDeflectionTexture(&ray_deflection_texture); SaveTexture(ray_deflection_texture, output_dir + "deflection.dat"); RayInverseRadiusTexture ray_inverse_radius_texture; ComputeRayInverseRadiusTexture(&ray_inverse_radius_texture); SaveTexture(ray_inverse_radius_texture, output_dir + "inverse_radius.dat"); } } // namespace } // namespace preprocess } // namespace black_hole int main(int argc, char** argv) { if (argc < 2) { std::cerr << "Usage: preprocess <output folder>" << std::endl; return -1; } black_hole::preprocess::Main(argv[1]); return 0; }