SceneProcessor.cpp (5032B)
1 // File : SceneProcessor.cpp 2 // Date : Thu 28 Apr 2016 05:43:50 PM CEST 3 // Author : Fabian Wermelinger 4 // Description: Scene Processor implementation 5 // Copyright 2016 ETH Zurich. All Rights Reserved. 6 #include <string> 7 #include <iostream> 8 #include <cstdlib> 9 #include <cstdio> 10 #include <chrono> 11 #include "SceneProcessor.h" 12 13 using namespace std; 14 15 void SceneProcessor::_prepare_cam() 16 { 17 const string cart = m_parser("-cartridge").asString("transmission"); 18 if (cart == "transmission") 19 m_cartridge = new TransmissionCartridge(m_parser); 20 else if (cart == "normalizer") 21 m_cartridge = new NormalizerCartridge(m_parser); 22 else if (cart == "log_normalizer") 23 m_cartridge = new LogNormalizerCartridge(m_parser); 24 else if (cart == "bounded_transmission") 25 m_cartridge = new BoundedTransmissionCartridge(m_parser); 26 else if (cart == "bounded_normalizer") 27 m_cartridge = new BoundedNormalizerCartridge(m_parser); 28 else if (cart == "bounded_log_normalizer") 29 m_cartridge = new BoundedLogNormalizerCartridge(m_parser); 30 else if (cart == "schlieren") 31 m_cartridge = new SchlierenCartridge(m_parser); 32 else if (cart == "line_extractor") 33 m_cartridge = new LineExtractor(m_parser); 34 else if (cart == "statistics") 35 m_cartridge = new SliceStat(m_parser); 36 else 37 { 38 if (m_mpi.isroot()) 39 cerr << "ERROR: Unknown cartridge \"" << cart << "\"" << endl; 40 abort(); 41 } 42 43 const string paper = m_parser("-photo").asString("png_hsv"); 44 if (paper == "png_hsv") 45 m_photo = new PNG_HSV; 46 else if (paper == "png_mono") 47 m_photo = new PNG_MONO; 48 else if (paper == "h5") 49 m_photo = new PhotoHDF5; 50 else if (paper == "ascii") 51 m_photo = new PhotoASCII; 52 else if (paper == "info") 53 m_photo = new PhotoINFO; 54 else 55 { 56 if (m_mpi.isroot()) 57 cerr << "ERROR: Unknown photo paper\"" << paper << "\"" << endl; 58 abort(); 59 } 60 } 61 62 void SceneProcessor::_load_cam(Polaroid& cam, const char* const fname) const 63 { 64 const string input_type = m_parser("-input").asString("h5"); 65 66 if (input_type == "h5") 67 cam.load_hdf5(fname, m_parser); 68 else if (input_type == "h5_slice") 69 cam.load_hdf5_slice(fname, m_parser); 70 else if (input_type == "wavelet") 71 cam.load_wavelet(fname, m_parser); 72 else 73 { 74 if (m_mpi.isroot()) 75 cerr << "ERROR: Undefined input type \"" << input_type << "\"" << endl; 76 abort(); 77 } 78 } 79 80 void SceneProcessor::process1212(const vector<string>& scenes) 81 { 82 _prepare_cam(); 83 Polaroid mycam(m_cartridge); 84 85 const auto start = chrono::high_resolution_clock::now(); 86 for (size_t i=0; i<scenes.size(); ++i) 87 { 88 _load_cam(mycam, scenes[i].c_str()); 89 90 std::string basename = _outpath(scenes[i]); 91 m_photo->set_name(basename); 92 mycam.capture(*m_photo); 93 94 if (m_mpi.isroot()) 95 { 96 const auto now = chrono::high_resolution_clock::now(); 97 const auto delta = now - start; 98 const double sec = chrono::duration_cast<chrono::seconds>(delta).count(); 99 printf("[Progress %3.1f %% (elapsed %.1f s)]\n", static_cast<double>(i+1)/scenes.size()*100.0, sec); 100 } 101 } 102 } 103 104 void SceneProcessor::process1122(const vector<string>& scenes) 105 { 106 _prepare_cam(); 107 vector<Polaroid> mycams(scenes.size()); 108 109 // 1.) load scenes & compute 110 const auto start = chrono::high_resolution_clock::now(); 111 for (size_t i=0; i<scenes.size(); ++i) 112 { 113 Polaroid& cam = mycams[i]; 114 _load_cam(cam, scenes[i].c_str()); 115 cam.insertCartridge(m_cartridge); 116 cam.computeScene(); 117 if (m_mpi.isroot()) 118 { 119 const auto now = chrono::high_resolution_clock::now(); 120 const auto delta = now - start; 121 const double sec = chrono::duration_cast<chrono::seconds>(delta).count(); 122 printf("[Scene Progress %3.1f %% (elapsed %.1f s)]\n", static_cast<double>(i+1)/scenes.size()*100.0, sec); 123 } 124 } 125 126 Real globalMin, globalMax; 127 Real myMin = m_cartridge->min(); 128 Real myMax = m_cartridge->max(); 129 m_mpi.allreduce(&myMin, &globalMin, 1, MPIReal, MPI_MIN); 130 m_mpi.allreduce(&myMax, &globalMax, 1, MPIReal, MPI_MAX); 131 m_cartridge->set_min(globalMin); 132 m_cartridge->set_max(globalMax); 133 134 // 2.)apply pixel shader and write photo 135 for (size_t i=0; i<scenes.size(); ++i) 136 { 137 Polaroid& cam = mycams[i]; 138 139 std::string basename = _outpath(scenes[i]); 140 m_photo->set_name(basename); 141 cam.capture(*m_photo); 142 143 if (m_mpi.isroot()) 144 { 145 const auto now = chrono::high_resolution_clock::now(); 146 const auto delta = now - start; 147 const double sec = chrono::duration_cast<chrono::seconds>(delta).count(); 148 printf("[Shader Progress %3.1f %% (elapsed %.1f s)]\n", static_cast<double>(i+1)/scenes.size()*100.0, sec); 149 } 150 } 151 }