54#include "ramCanvas.hpp"
55#include "MRMathUPLY.hpp"
59#define LAPACK_COMPLEX_CUSTOM 1
60#define lapack_complex_float std::complex<float>
61#define lapack_complex_double std::complex<double>
65typedef lapack_complex_double cplx;
69typedef mjr::ramCanvas1c16b drc_t;
70typedef mjr::color3c8b oc_t;
71typedef mjr::ramCanvasPixelFilter::FuncHomoTransform<drc_t, oc_t> hpf_t;
75 std::chrono::time_point<std::chrono::system_clock> startTime = std::chrono::system_clock::now();
81 const int XSIZ = 2048*8;
82 const int YSIZ = 2048*8;
83 drc_t theRamCanvas(XSIZ, YSIZ, -2.5, 2.5, -2.5, 2.5);
85# pragma omp parallel for schedule(static,1)
86 for(
int m1=0; m1<n1; m1++) {
87 std::vector<cplx> p = {{1.0, 0.0}, {-1.0, 0.0}, {0.0, 0.0}, { 0.0, 0.0}, { 0.0, 0.0}, { 0.0, 0.0}, {0.0, 0.0},
88 {0.0, 0.0}, { 0.0, 0.0}, {0.0, 0.0}, { 0.0, 0.0}, { 0.0, 0.0}, { 0.0, 0.0}, {0.0, 0.0},
89 {0.0, 0.0}, { 0.0, 0.0}, {0.0, 0.0}, {-0.1, 0.0}, { 0.1, 0.0}};
90 std::vector<cplx> p1 = {{0.0, 0.0}, { 0.0, 100.0}, {0.0, -100.0}, { 0.0, 100.0}, { 0.0, -100.0}, {-100.0, 0.0}, {0.0, 100.0}};
91 std::vector<cplx> p2 = {{0.0, -100.0}, { 0.0, -100.0}, {0.0, 100.0}, { 0.0, 100.0}, {100.0, 0.0}};
92 int pdg = (int)p.size() - 1;
93 lapack_int n = (lapack_int)p.size() - 1;
94 lapack_int lwork = -1;
96 cplx *a =
new cplx[n*n];
97 cplx *w =
new cplx[n];
98 double *rwork =
new double[n*2];
101 if( 0 != LAPACKE_zgeev_work(LAPACK_COL_MAJOR,
'N',
'N', n, a, n, w, NULL, n, NULL, n, &tmp, lwork, rwork)) {
102 std::cout <<
"ZGEEV Error (lwork query)" << std::endl;
105 lwork = LAPACK_Z2INT(tmp) + 1;
106 work =
new cplx[lwork];
108 cplx t1 = std::exp(cplx(0.0, 1.0) *
static_cast<double>(m1) * 2.0 * std::numbers::pi /
static_cast<double>(n1));
109 p[c1] = mjr::math::uply::eval(p1, t1);
110 for(
int m2=0; m2<n2; m2++) {
112 cplx t2 = std::exp(cplx(0.0, 1.0) *
static_cast<double>(m2) * 2.0 * std::numbers::pi /
static_cast<double>(n2));
113 p[c2] = mjr::math::uply::eval(p2, t2);
115 for(
int i=0;i<n*n;i++)
116 a[i] = cplx(0.0, 0.0);
118 a[i*n+(i-1)] = cplx(1.0, 0.0);
119 for(
int i=1;i<=n;i++)
120 a[(n-i)*n+(n-1)] = - p[i] / p[0];
122 if( 0 != LAPACKE_zgeev_work(LAPACK_COL_MAJOR,
'N',
'N', n, a, n, w, NULL, n, NULL, n, work, lwork, rwork)) {
123 std::cout <<
"ZGEEV Error (eigenvalue)" << std::endl;
128 for(
int j=0; j<pdg; j++)
129 if (theRamCanvas.getPxColor(w[j]).getC0() < 1275)
130 theRamCanvas.incPxChan(w[j]);
134 std::cout <<
"Completed Cycle " << m1 <<
" of " << n1 << std::endl;
143 theRamCanvas.applyHomoPixTfrm(&drc_t::colorType::tfrmStdPow, 0.5);
144 theRamCanvas.scaleDownMax(8);
147 theRamCanvas.writeTIFFfile(
"poly_root_cloud.tiff", hpf_t(theRamCanvas,[](
auto inColor) {
return oc_t::csCCfractal0RYBCW::c(inColor.getC0()); }));
150 std::chrono::duration<double> runTime = std::chrono::system_clock::now() - startTime;
151 std::cout <<
"Total Runtime " << runTime.count() <<
" sec" << std::endl;
int main(int argc, char *argv[])