polaroid-pp

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

commit eda3420f1acc133bc1562fe7cb8f22f42c1e410d
parent 7c4926b8feb208527f946607f22f6e8bfcb52f82
Author: Fabian Wermelinger <fabianw@mavt.ethz.ch>
Date:   Fri, 22 Sep 2017 18:20:46 +0200

added file option 'fscenes' for data input

Diffstat:
Mapps/OrganizerMPI.cpp | 27+++++++++++++++++++++++----
Mapps/OrganizerMPI.h | 7+++++--
Mapps/polaroidCamera/SceneProcessor.cpp | 12++++++------
Mapps/polaroidCamera/SceneProcessor.h | 4++--
Mapps/polaroidCamera/polaroidCameraMPI.cpp | 5+++--
5 files changed, 39 insertions(+), 16 deletions(-)

diff --git a/apps/OrganizerMPI.cpp b/apps/OrganizerMPI.cpp @@ -5,15 +5,18 @@ // Copyright 2016 ETH Zurich. All Rights Reserved. #include <string> #include <iostream> +#include <fstream> #include <cstdio> #include <cstdlib> #include "OrganizerMPI.h" +#include "ArgumentParser.h" using namespace std; -OrganizerMPI::OrganizerMPI(const int argc, char ** const argv, const MPI_Comm comm) : m_nscenes(0), m_scenes(nullptr), m_argc(1), m_comm(comm) +OrganizerMPI::OrganizerMPI(const int argc, char ** const argv, const MPI_Comm comm) : m_nscenes(0), m_argc(1), m_comm(comm) { m_isroot = (rank() == 0) ? true : false; + ArgumentParser p(argc, (const char**)argv); // get scenes bool bfoundScenes = false; @@ -22,13 +25,29 @@ OrganizerMPI::OrganizerMPI(const int argc, char ** const argv, const MPI_Comm co const string key(argv[i]); if (key == "-scenes") { - m_scenes = (argv + (i+1)); + char ** const scenes = (argv + (i+1)); m_nscenes = argc - (i+1); bfoundScenes = true; + for (int i = 0; i < m_nscenes; ++i) + m_scenes.push_back(string(scenes[i])); break; } ++m_argc; } + if (p.exist("fscenes")) + { + ifstream infile(p("fscenes").asString()); + string line; + int count = 0; + while (infile >> line) + { + m_scenes.push_back(line); + ++count; + } + m_nscenes += count; + bfoundScenes = true; + } + if (!bfoundScenes) { // Define input scenes (=input files) at the end of the argument list @@ -43,13 +62,13 @@ OrganizerMPI::OrganizerMPI(const int argc, char ** const argv, const MPI_Comm co } } -vector<char*> OrganizerMPI::split_work() const +vector<string> OrganizerMPI::split_work() const { const int myrank = rank(); const int nranks = size(); const int myshare = m_nscenes/nranks; const int rem = m_nscenes - nranks * myshare; - vector<char*> myscenes(0); + vector<string> myscenes(0); if (m_nscenes <= nranks) { if (myrank < m_nscenes) myscenes.push_back(m_scenes[myrank]); diff --git a/apps/OrganizerMPI.h b/apps/OrganizerMPI.h @@ -7,8 +7,11 @@ #define ORGANIZERMPI_H_8HFBYG90 #include <vector> +#include <string> #include <mpi.h> +#include "ArgumentParser.h" + #ifdef _FLOAT_PRECISION_ #define MPIReal MPI_FLOAT #else @@ -19,7 +22,7 @@ class OrganizerMPI { private: int m_nscenes; - char** m_scenes; + std::vector<std::string> m_scenes; int m_argc; const MPI_Comm m_comm; bool m_isroot; @@ -41,7 +44,7 @@ public: return rank; } - std::vector<char*> split_work() const; + std::vector<std::string> split_work() const; inline int argc() const { return m_argc; } inline bool isroot() const { return m_isroot; } inline void wait() const { MPI_Barrier(m_comm); } diff --git a/apps/polaroidCamera/SceneProcessor.cpp b/apps/polaroidCamera/SceneProcessor.cpp @@ -77,7 +77,7 @@ void SceneProcessor::_load_cam(Polaroid& cam, const char* const fname) const } } -void SceneProcessor::process1212(const vector<char*>& scenes) +void SceneProcessor::process1212(const vector<string>& scenes) { _prepare_cam(); Polaroid mycam(m_cartridge); @@ -85,9 +85,9 @@ void SceneProcessor::process1212(const vector<char*>& scenes) const auto start = chrono::high_resolution_clock::now(); for (size_t i=0; i<scenes.size(); ++i) { - _load_cam(mycam, scenes[i]); + _load_cam(mycam, scenes[i].c_str()); - std::string basename = _outpath(std::string(scenes[i])); + std::string basename = _outpath(scenes[i]); m_photo->set_name(basename); mycam.capture(*m_photo); @@ -101,7 +101,7 @@ void SceneProcessor::process1212(const vector<char*>& scenes) } } -void SceneProcessor::process1122(const vector<char*>& scenes) +void SceneProcessor::process1122(const vector<string>& scenes) { _prepare_cam(); vector<Polaroid> mycams(scenes.size()); @@ -111,7 +111,7 @@ void SceneProcessor::process1122(const vector<char*>& scenes) for (size_t i=0; i<scenes.size(); ++i) { Polaroid& cam = mycams[i]; - _load_cam(cam, scenes[i]); + _load_cam(cam, scenes[i].c_str()); cam.insertCartridge(m_cartridge); cam.computeScene(); if (m_mpi.isroot()) @@ -136,7 +136,7 @@ void SceneProcessor::process1122(const vector<char*>& scenes) { Polaroid& cam = mycams[i]; - std::string basename = _outpath(std::string(scenes[i])); + std::string basename = _outpath(scenes[i]); m_photo->set_name(basename); cam.capture(*m_photo); diff --git a/apps/polaroidCamera/SceneProcessor.h b/apps/polaroidCamera/SceneProcessor.h @@ -78,8 +78,8 @@ public: SceneProcessor(ArgumentParser& parser, OrganizerMPI& mpi) : m_parser(parser), m_mpi(mpi), m_cartridge(nullptr), m_photo(nullptr) {} ~SceneProcessor() { _dispose(); } - void process1212(const std::vector<char*>& scenes); - void process1122(const std::vector<char*>& scenes); + void process1212(const std::vector<std::string>& scenes); + void process1122(const std::vector<std::string>& scenes); }; #endif /* SCENEPROCESSOR_H_UWGYBVIW */ diff --git a/apps/polaroidCamera/polaroidCameraMPI.cpp b/apps/polaroidCamera/polaroidCameraMPI.cpp @@ -6,6 +6,7 @@ #include <iostream> #include <cstdio> #include <vector> +#include <string> #include "ArgumentParser.h" #include "OrganizerMPI.h" @@ -32,9 +33,9 @@ int main(int argc, char* argv[]) } worker.wait(); - vector<char*> myscenes = worker.split_work(); + vector<string> myscenes = worker.split_work(); if (myscenes.size() > 0) - printf("[Worker %d/%d: Load = %d scene(s), start @ %s]\n", worker.rank(), worker.size(), myscenes.size(), myscenes.front()); + printf("[Worker %d/%d: Load = %d scene(s), start @ %s]\n", worker.rank(), worker.size(), myscenes.size(), myscenes.front().c_str()); else printf("[Worker %d/%d: Load = %d scene(s), start @ %s]\n", worker.rank(), worker.size(), myscenes.size(), "none");