c_lorenz.c 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. #include <stdio.h>
  2. #include <time.h>
  3. #include <math.h>
  4. void lorenz(const double *x, double *restrict y) {
  5. y[0] = 10.0 * (x[1] - x[0]);
  6. y[1] = 28.0 * x[0] - x[1] - x[0] * x[2];
  7. y[2] = x[0] * x[1] - (8.0 / 3.0) * x[2];
  8. }
  9. int main(int argc, const char *argv[])
  10. {
  11. const int nb_steps = 20000000;
  12. const double h = 1.0e-10;
  13. const double h2 = 0.5 * h;
  14. const double nb_loops = 21;
  15. double x[3];
  16. double y[3];
  17. double f1[3];
  18. double f2[3];
  19. double f3[3];
  20. double f4[3];
  21. double min_time = 1E6;
  22. clock_t begin, end;
  23. double time_spent;
  24. for (int j = 0; j < nb_loops; j++) {
  25. x[0] = 8.5;
  26. x[1] = 3.1;
  27. x[2] = 1.2;
  28. begin = clock();
  29. for (int k = 0; k < nb_steps; k++) {
  30. lorenz(x, f1);
  31. for (int i = 0; i < 3; i++) {
  32. y[i] = x[i] + h2 * f1[i];
  33. }
  34. lorenz(y, f2);
  35. for (int i = 0; i < 3; i++) {
  36. y[i] = x[i] + h2 * f2[i];
  37. }
  38. lorenz(y, f3);
  39. for (int i = 0; i < 3; i++) {
  40. y[i] = x[i] + h * f3[i];
  41. }
  42. lorenz(y, f4);
  43. for (int i = 0; i < 3; i++) {
  44. x[i] = x[i] + h * (f1[i] + 2 * (f2[i] + f3[i]) + f4[i]) / 6.0;
  45. }
  46. }
  47. end = clock();
  48. min_time = fmin(min_time, (double)(end-begin)/CLOCKS_PER_SEC);
  49. printf("Result: %f\t runtime: %f\n", x[0], (double)(end-begin)/CLOCKS_PER_SEC);
  50. }
  51. printf("Minimal Runtime: %f\n", min_time);
  52. return 0;
  53. }