polaroid-pp

Schlieren and contour plot tool
git clone https://git.0xfab.ch/polaroid-pp.git
Log | Files | Refs | Submodules | README | LICENSE

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 }