# Commits

committed 07f1cc9
• Participants
• Parent commits bc74981
• Branches default

# File core/random.cpp

 #include <cmath>
 #include <random>
 #include <limits>
-
+#include <iostream>
 #include "core/mpi_assert.h"

 namespace {
 }

 void RandomPointOnDisk(float maxRadius, float* angle, float* radius) {
+  assert(maxRadius > 0);
   // For explanation @see
   // http://www.ece.virginia.edu/mv/edu/prob/stat/random-number-generation.pdf
   // Since the total area of the tube front side is pi * r^2,
   *angle = 2 * M_PI * Random();
   *radius = sqrt(Random()) * maxRadius;

+  if (*radius >= maxRadius)
+    std::cout << *radius << " Max = " << maxRadius << '\n';
   assert(*radius < maxRadius);
 }

# File core/sphere.cpp

 #include <cstdlib>
 #include <algorithm>
 #include <limits>
-
+#include <iostream>
 #include "core/mpi_assert.h"

 namespace {
   assert(a != NULL);
   assert(b != NULL);

-  Vector3f z(0, 0, 1);
-  float angle = acos(z.dot(vec) / vec.norm());
+  Vector3f z(0, 0, 1.0);
+  Vector3f vec_norm = vec;
+  vec_norm.normalize();
+  float angle = acos(z.dot(vec_norm));

   if (angle >= kFloatEpsilon) {
     z.noalias() = z.cross(vec);
   }

+  z.normalize();
   Eigen::AngleAxisf aa(angle, z);
-  Vector3f x = aa * Vector3f(1, 0, 0);
-  Vector3f y = aa * Vector3f(0, 1, 0);
+  Vector3f x = aa * Vector3f(1.0, 0, 0);
+  Vector3f y = aa * Vector3f(0, 1.0, 0);

-  // @see http://en.wikipedia.org/wiki/Gram%E2%80%93Schmidt_process
-  x -= x.dot(vec) / vec.dot(vec) * vec;
-  y -= y.dot(vec) / vec.dot(vec) * vec - y.dot(x) / x.dot(x) * x;
+   // @see http://en.wikipedia.org/wiki/Gram%E2%80%93Schmidt_process
+  x -= x.dot(vec) * vec_norm;
+  y -= y.dot(vec) * vec_norm - y.dot(x) / x.dot(x) * x;
+
   x.normalize();
   y.normalize();

   assert(!isnan(x.norm()) && !isnan(y.norm()));
-  assert(abs(x.dot(y)) < kFloatEpsilon);
-  assert(abs(x.dot(vec)) < kFloatEpsilon);
-  assert(abs(y.dot(vec)) < kFloatEpsilon);
-  assert(abs(x.squaredNorm() - 1) < kFloatEpsilon);
-  assert(abs(y.squaredNorm() - 1) < kFloatEpsilon);
+
+  assert(fabs(x.dot(y)) < kFloatEpsilon);
+  assert(fabs(x.dot(vec)) < kFloatEpsilon);
+  assert(fabs(y.dot(vec)) < kFloatEpsilon);
+
+  if (fabs(x.squaredNorm() - 1) >= kFloatEpsilon)
+    std::cout << vec << "\n x \n" << x << "\n y \n" << y << "\n angle \n" << angle <<
+        "\n epsilon \n" << kFloatEpsilon <<  "\n cdot \n" << x.dot(y) <<
+        "\n x_normed \n" << x.normalized() << "\n y_normed \n" << y.normalized() <<
+        "\n cdot \n" << x.normalized().dot(y.normalized()) << "\n aa \n";// << aa;
+
+  assert(fabs(x.squaredNorm() - 1) < kFloatEpsilon);
+  assert(fabs(y.squaredNorm() - 1) < kFloatEpsilon);

   *a = x;
   *b = y;

# File core/sphere_test.cpp

   ASSERT_TRUE(VecNear(Vector3f(0, 0, 1),position));
 }

+TEST(MakeTwoOrthogonalVectors, NonOrtRes) {
+  Vector3f vec(0.456012, 0.47149, -0.754818);
+  Vector3f a, b;
+  MakeTwoOrthogonalVectors(vec, &a, &b);
+}
+

# File experiments/particle_size_peak_width/gauss.res

- results/r0.000316228.res 5259.25931342 25.7342526646 12.4218167475
+ results/r0.000316228.res 5259.2412516 25.698140693 12.4097947891
+ results/r0.000749894.res 5258.35015407 32.9797522383 29.9912317548
  results/r0.00177828.res 5257.34728265 47.2395585293 63.0021145047
- results/r0.01.res 5259.05890535 101.469509086 187.117598675
+ results/r0.00421697.res 5257.68720751 71.1049963587 115.881014449
+ results/r0.01.res 5259.07201353 101.42841392 187.083063942

# File experiments/particle_size_peak_width/generator.py

 cfg = libconfig.ConfigLib()
 cfg.read('example.cfg')
 initial_r_log = np.log10(float(cfg['averageSphereRadius']))
-for radius in np.logspace(initial_r_log - 0.5, initial_r_log + 1, num=5):
+for radius in np.logspace(initial_r_log - 2, initial_r_log, num=5):
      cfg['averageSphereRadius'] = radius
      cfg['outputFileName'] = "results/r%g.dat" % radius
      cfg.write("len%g.cfg" % radius)

# File report_spring_2013/report_spring_2013.pdf

Binary file modified.

# File report_spring_2013/report_spring_2013.tex

 Фильтр Христьянсона -- это ... Работает так ...
 \section{Описание метода}
 \subsection{Физика}
-Шарики, геометрическая оптика.
-\subsection{А ещё мы его запрогали}
-Случайная генерация. MPI/C++
+Шарики, геометрическая оптика. Случайная генерация столкновений.
+\subsection{Реализация}
+MPI/C++, сейчас параллелен по значениям n -- 30 нод, плюс по
+ параметрам установки -- 30x5 нод. Потенциально -- неограниченно, каждый фотон.
 \section{Результаты}
-Графики - Гаусс, зависимости. Параметры установки, соображения
-пределов размера частиц.
+Графики - Гаусс, зависимости ширины/высоты пика. Сравнение с эксперементом.

-Сравнение с экспериментом (если успеем)
 \section{Дальнейшие перспективы}
-Есть метод, есть результаты, есть Issues, куда расти. Кто угодно может
+Есть метод, есть реализация, есть Issues, куда расти. Кто угодно может
 взять и продолжить.

 \end{document}