...
 
Commits (5)
......@@ -7,15 +7,24 @@ set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
find_package(OpenMP)
add_executable(dynamicsystems main.cpp compute.cpp)
if(OPENMP_FOUND)
#target_compile_options(dynamicsystems PRIVATE ${OpenMP_CXX_FLAGS})
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
target_compile_options(dynamicsystems PRIVATE ${OpenMP_CXX_FLAGS})
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
target_link_libraries(dynamicsystems PRIVATE ${OpenMP_CXX_FLAGS})
endif()
endif()
find_package(Boost REQUIRED)
find_package(Boost REQUIRED COMPONENTS program_options)
target_include_directories(dynamicsystems PRIVATE ${Boost_INCLUDE_DIR})
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lboost_program_options")
target_link_libraries(dynamicsystems PRIVATE ${Boost_LIBRARIES})
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel")
target_compile_options(dynamicsystems PRIVATE "-std=c++11" "-qopt-report=5" "-qopt-report-phase=vec" "-xhost")
if (WIN32)
target_compile_options(dynamicsystems PRIVATE "/Qopt-report:5"
"/Qopt-report-phase:vec"
"/QxHost")
else(WIN32)
target_compile_options(dynamicsystems PRIVATE "-qopt-report=5"
"-qopt-report-phase=vec"
"-xhost")
endif(WIN32)
endif()
#include "compute.hpp"
#include <algorithm>
float compute(float alpha, float beta, aligned_vector<float> seed_x,
aligned_vector<float> seed_y, int num_iterations, float threshold) {
aligned_vector<float> seed_y, int num_iterations,
float threshold) {
int num_seeds = seed_x.size();
assert(seed_y.size() == num_seeds);
......@@ -13,7 +16,7 @@ float compute(float alpha, float beta, aligned_vector<float> seed_x,
float d = 0.0;
for (int i = 0; i < num_iterations && d < threshold ; i++) {
for (int i = 0; i < num_iterations && d < threshold; i++) {
#pragma omp simd aligned(xp, yp : 64)
for (int s = 0; s < num_seeds; s++) {
yp[s] = yp[s] + beta * std::sin(TWO_PI * xp[s]);
......
......@@ -13,8 +13,6 @@
#include "colormaps.hpp"
#include "compute.hpp"
int main(int argc, char* argv[]) {
// get arguments from CLI
// these can be input by user
......@@ -32,6 +30,27 @@ int main(int argc, char* argv[]) {
namespace po = boost::program_options;
try {
po::options_description desc("Options");
<<<<<<< HEAD
desc.add_options()("help", "Help message")(
"iterations,n", po::value<int>(&num_iterations)->default_value(100),
" Number of iterations")(
"threshold,s", po::value<float>(&threshold)->default_value(1),
" Threshold above that computation is stopped")(
"amin,a", po::value<float>(&alphamin)->default_value(0),
" α lower bound")("amax,A",
po::value<float>(&alphamax)->default_value(1),
" α upper bound")(
"alphas,w", po::value<int>(&alpha_num_intervals)->default_value(100),
" α resolution/width of image")(
"betas,h", po::value<int>(&beta_num_intervals)->default_value(100),
" β resolution/height of image")(
"bmin,b", po::value<float>(&betamin)->default_value(0),
" β lower bound")("bmax,B",
po::value<float>(&betamax)->default_value(1),
" β upper bound")(
"seedpoints,S", po::value<int>(&num_seedpoints)->default_value(10),
" Number of seedpoints (uniformly distributed in (0,1) )");
=======
desc.add_options()
("help", "Help message")
("iterations,n", po::value<int>(&num_iterations)->default_value(100), " Number of iterations")
......@@ -45,6 +64,7 @@ int main(int argc, char* argv[]) {
("seedpoints,S", po::value<int>(&num_seedpoints)->default_value(10), " Number of seedpoints (uniformly distributed in (0,1) )")
("output,O", po::value<bool>(&output)->default_value(true), " Boolean flag for output")
;
>>>>>>> 17ec88803aaf93c5c2336dd48b1ef7dbb6cb89f4
po::variables_map vm;
po::store(po::parse_command_line(argc, argv, desc), vm);
......@@ -57,11 +77,12 @@ int main(int argc, char* argv[]) {
po::notify(vm);
// check if our integers are >0, else throw invalid-argument-error
if ( (num_iterations < 1) || (alpha_num_intervals < 1) || (beta_num_intervals <1) ) {
if ((num_iterations < 1) || (alpha_num_intervals < 1) ||
(beta_num_intervals < 1)) {
throw po::validation_error(po::validation_error::invalid_option_value);
}
} catch (po::error &e) {
} catch (po::error& e) {
std::cerr << e.what() << std::endl;
return -1;
}
......@@ -86,12 +107,22 @@ int main(int argc, char* argv[]) {
betasp[i] = betamin + i * beta_interval_size;
}
<<<<<<< HEAD
// aligned_vector<float> x_start = {0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8,
// 0.9};
aligned_vector<float> x_start(num_seedpoints);
aligned_vector<float> y_start(num_seedpoints);
for (int i = 1; i < num_seedpoints + 1; ++i) {
x_start[i - 1] = i / (num_seedpoints + 1);
y_start[i - 1] = 0;
=======
//aligned_vector<float> x_start = {0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9};
aligned_vector<float> x_start(num_seedpoints);
aligned_vector<float> y_start(num_seedpoints);
for (int i = 1; i < num_seedpoints + 1; ++i){
x_start[i-1] = (float)i / (num_seedpoints + 1);
y_start[i-1] = 0;
>>>>>>> 17ec88803aaf93c5c2336dd48b1ef7dbb6cb89f4
}
// // aligned_vector<float> y_start = {0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9};
//aligned_vector<float> y_start = {0, 0, 0, 0, 0, 0, 0, 0, 0};
......@@ -105,8 +136,8 @@ int main(int argc, char* argv[]) {
#pragma omp parallel for schedule(dynamic)
for (int a = 0; a < alpha_num_params; a++) {
for (int b = beta_num_params - 1; b >= 0; b--) {
result[(beta_num_params - b - 1) * alpha_num_params + a] =
compute(alphas[a], betas[b], x_start, y_start, num_iterations, threshold);
result[(beta_num_params - b - 1) * alpha_num_params + a] = compute(
alphas[a], betas[b], x_start, y_start, num_iterations, threshold);
}
}
auto time_end = std::chrono::system_clock::now();
......@@ -114,6 +145,17 @@ int main(int argc, char* argv[]) {
std::chrono::duration<float>(time_end - time_start).count();
std::cout << "TIME: " << elapsed_seconds << std::endl;
<<<<<<< HEAD
// Output result into .csv
std::string file_result = "result.csv";
std::ofstream ostrm_csv(file_result);
ostrm_csv << "alpha beta value\n";
for (int a = 0; a < alpha_num_params; a++) {
for (int b = beta_num_params - 1; b >= 0; b--) {
ostrm_csv << alphas[a] << ' ' << betas[b] << ' '
<< result[(beta_num_params - b - 1) * alpha_num_params + a]
<< std::endl;
=======
if(output){
// Output result into .csv
......@@ -124,8 +166,30 @@ int main(int argc, char* argv[]) {
for (int b = beta_num_params - 1; b >= 0; b--) {
ostrm_csv << alphas[a] << ' ' << betas[b] << ' ' << result[(beta_num_params - b - 1) * alpha_num_params + a] << std::endl;
}
>>>>>>> 17ec88803aaf93c5c2336dd48b1ef7dbb6cb89f4
}
<<<<<<< HEAD
// transform floats into grayscale-colors:
for (int i = 0; i < alpha_num_params * beta_num_params; ++i) {
if (result[i] > threshold) {
colors[i] = 255;
colors_rgb[3 * i] = 255;
colors_rgb[3 * i + 1] = 255;
colors_rgb[3 * i + 2] = 255;
} else {
colors[i] = (int)254 * result[i] / threshold;
// RGB color gradient: viridis from matplotlib
int idx = floor(255 * result[i] / threshold);
int r = floor(255 * viridis[idx][0]);
int g = floor(255 * viridis[idx][1]);
int b = floor(255 * viridis[idx][2]);
colors_rgb[3 * i] = r; // red
colors_rgb[3 * i + 1] = g; // green
colors_rgb[3 * i + 2] = b; // blue
=======
// transform floats into grayscale-colors:
for (int i = 0; i < alpha_num_params*beta_num_params; ++i) {
if (result[i] > threshold) {
......@@ -146,8 +210,32 @@ int main(int argc, char* argv[]) {
colors_rgb[3*i+1] = g;// green
colors_rgb[3*i+2] = b; // blue
}
>>>>>>> 17ec88803aaf93c5c2336dd48b1ef7dbb6cb89f4
}
<<<<<<< HEAD
// Output pixel vector into PGM File
std::string filename = "picture.pgm";
std::ofstream ostrm(filename);
ostrm << "P5" << '\n';
ostrm << alpha_num_params << ' ' << beta_num_params << '\n';
ostrm << 255 << '\n'; // max. gray value
// 1 byte per pixel
for (int i = 0; i < colors.size(); ++i) {
ostrm.write(reinterpret_cast<char*>(&colors[i]), 1); // colors.size());
}
// Output pixel vector into PPM File
std::string filename_rgb = "picture_rgb.ppm";
std::ofstream ostrm_rgb(filename_rgb);
ostrm_rgb << "P6" << '\n';
ostrm_rgb << alpha_num_params << ' ' << beta_num_params << '\n';
ostrm_rgb << 255 << '\n'; // max. gray value
// 3 byte per pixel
for (int i = 0; i < colors_rgb.size(); ++i) {
// das geht theoretisch auch mit dem ganzen Array, aber praktisch nicht?!
ostrm_rgb.write(reinterpret_cast<char*>(&colors_rgb[i]),
1); // colors_rgb.size());
=======
// Output pixel vector into PGM File
std::string filename = "picture.pgm";
std::ofstream ostrm(filename);
......@@ -169,5 +257,6 @@ int main(int argc, char* argv[]) {
// das geht theoretisch auch mit dem ganzen Array, aber praktisch nicht?!
ostrm_rgb.write(reinterpret_cast<char*>(&colors_rgb[i]),1);//colors_rgb.size());
}
>>>>>>> 17ec88803aaf93c5c2336dd48b1ef7dbb6cb89f4
}
}