49#include "ramCanvas.hpp"
50#include "MRMathSTR.hpp"
51#include "MRMathIVL.hpp"
55 std::chrono::time_point<std::chrono::system_clock> startTime = std::chrono::system_clock::now();
56 const bool CENTER =
false;
57 const int NUMFRM = 1080;
58 const int IMXSIZ = 7680/8;
59 const int IMYSIZ = 7680/8;
60 const double m1 = 1.0;
61 const double m2 = 1.0;
62 const double L1 = 1.0;
63 const double L2 = 1.0;
64 const double h = 0.01;
65 const double g = 9.80665;
66 const double p = std::numbers::pi;
68 mjr::ramCanvas1c64F theta1canvas(IMXSIZ, IMYSIZ);
69 mjr::ramCanvas1c64F omega1canvas(IMXSIZ, IMYSIZ);
70 mjr::ramCanvas1c64F theta2canvas(IMXSIZ, IMYSIZ);
71 mjr::ramCanvas1c64F omega2canvas(IMXSIZ, IMYSIZ);
73 mjr::ramCanvas3c8b pcolorCanvas(IMXSIZ, IMYSIZ);
75 pcolorCanvas.newRealCoords(0, 2*p, 0, 2*p);
77 pcolorCanvas.newRealCoords(-p, p, -p, p);
78 pcolorCanvas.clrCanvasToBlack();
80 for(
int frame=0; frame<NUMFRM; frame++) {
81# pragma omp parallel for schedule(static,1)
82 for(
int y=0;y<pcolorCanvas.getNumPixY();y++) {
83 for(
int x=0;x<pcolorCanvas.getNumPixX();x++) {
84 double theta1, omega1, theta2, omega2;
86 theta1 = pcolorCanvas.int2realX(x);
88 theta2 = pcolorCanvas.int2realY(y);
91 theta1 = theta1canvas.getPxColorRefNC(x, y).getC0();
92 omega1 = omega1canvas.getPxColorRefNC(x, y).getC0();
93 theta2 = theta2canvas.getPxColorRefNC(x, y).getC0();
94 omega2 = omega2canvas.getPxColorRefNC(x, y).getC0();
95 double cd = cos(theta1-theta2);
96 double sd = sin(theta1-theta2);
97 double o12 = omega1*omega1;
98 double o22 = omega2*omega2;
99 double denom = 2*m1+m2-m2*cos(2*theta1-2*theta2);
100 double new_omega1 = (-g*(2*m1+m2)*sin(theta1)-m2*g*sin(theta1-2*theta2)-2*sd*m2*(o22*L2+o12*L1*cd))/(L1*denom);
101 double new_omega2 = (2*sd*(o12*L1*(m1+m2)+g*(m1+m2)*cos(theta1)+o22*L2*m2*cd))/(L2*denom);
103 omega1 += h*new_omega1;
105 omega2 += h*new_omega2;
107 theta1canvas.drawPoint(x, y, theta1);
108 omega1canvas.drawPoint(x, y, omega1);
109 theta2canvas.drawPoint(x, y, theta2);
110 omega2canvas.drawPoint(x, y, omega2);
111 double r = mjr::math::ivl::wrapCO(theta2, 2*p)/(2*p);
112 double b = mjr::math::ivl::wrapCO(theta1, 2*p)/(2*p);
113 double g = mjr::math::ivl::wrapCC((omega1+omega2)/(4*p), 1.0);
114 pcolorCanvas.getPxColorRefNC(x, y).setChansRGB_dbl(r, g, b);
117 pcolorCanvas.writeTIFFfile((CENTER ?
"doublePendulumM_center_" :
"doublePendulumM_corner_") + mjr::math::str::fmt_int(frame, 4,
'0') +
".tiff");
119 std::cout <<
"FRAME(" << frame <<
"): " <<
"DONE" << std::endl;
121 std::chrono::duration<double> runTime = std::chrono::system_clock::now() - startTime;
122 std::cout <<
"Total Runtime " << runTime.count() <<
" sec" << std::endl;
int main(int argc, char *argv[])