SpaceQuester

Untitled

Nov 10th, 2025
238
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.21 KB | None | 0 0
  1. #define _USE_MATH_DEFINES
  2. #include "math.h"
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include <locale.h>
  6. #include <time.h>
  7. #include <stdbool.h>
  8.  
  9. #define N 3
  10.  
  11. #define Ca  f[0]
  12. #define IP3 f[1]
  13. #define z   f[2]
  14.  
  15. double f[N];
  16.  
  17. double c_0 = 2;
  18. double c_1 = 0.185;
  19. double v_1 = 6;
  20. double v_2 = 0.11;
  21. double v_3 = 2.2;
  22. double v_4 = 0.5;
  23. double v_5 = 0.025;
  24. double v_6 = 0.2;
  25. double k_1 = 0.5;
  26. double k_2 = 1;
  27. double k_3 = 0.1;
  28. double k_4 = 1.1;
  29. double a_2 = 0.14;
  30. double d_1 = 0.13;
  31. double d_2 = 1.049;
  32. double d_3 = 0.9434;
  33. double d_5 = 0.082;
  34. double alpha_G = 25;
  35. double beta_G = 500;
  36. double alpha = 0.8;
  37. double tau_IP3 = 7.143;
  38. double IP3_star = 0.16;
  39. //double d_Ca = 0.001;
  40. //double d_IP3 = 0.12;
  41.  
  42. int RandomI(int min, int max)
  43. {
  44.     return ((double)rand() / (RAND_MAX - 1)) * (max - min) + min;
  45. }
  46.  
  47. double RandomD(double min, double max)
  48. {
  49.     return ((double)rand() / RAND_MAX) * (max - min) + min;
  50. }
  51.  
  52. double UllahJung(int i, double f[N])
  53. {
  54.     switch (i)
  55.     {
  56.     case 0: // Ca
  57.         return ( c_1 * v_1 * pow(IP3, 3) * pow(Ca, 3) * pow(z, 3) * (c_0 / c_1 - (1 + 1 / c_1) * Ca) / pow( ((IP3 + d_1) * (Ca + d_5)), 3) ) - ( v_3 * pow(Ca, 2) / (pow(k_3, 2) + pow(Ca, 2)) ) + ( c_1 * v_2 * ( c_0 / c_1 - (1 + 1 / c_1) * Ca ) ) + ( v_5 + v_6 * pow(IP3, 2) / (pow(k_2, 2) + pow(IP3, 2)) ) - k_1 * Ca;
  58.  
  59.     case 1: // IP3
  60.         return ( IP3_star - IP3 ) / tau_IP3 + v_4 * (Ca + (1 - alpha) * k_4) / (Ca + k_4);
  61.  
  62.     case 2: // z
  63.         return a_2 * ( d_2 * ((IP3 + d_1) / (IP3 + d_3)) * (1 - z) - Ca * z );
  64.     }
  65.   return 0;
  66. }
  67.  
  68. void RungeKutta(double dt, double f[N], double f_next[N])
  69. {
  70.     double k[N][4];
  71.  
  72.     // k1
  73.     for (int i = 0; i < N; i++)
  74.         k[i][0] = UllahJung(i, f) * dt;
  75.  
  76.     double phi_k1[N];
  77.     for (int i = 0; i < N; i++)
  78.         phi_k1[i] = f[i] + k[i][0] / 2;
  79.  
  80.     // k2
  81.     for (int i = 0; i < N; i++)
  82.         k[i][1] = UllahJung(i, phi_k1) * dt;
  83.  
  84.     double phi_k2[N];
  85.     for (int i = 0; i < N; i++)
  86.         phi_k2[i] = f[i] + k[i][1] / 2;
  87.  
  88.     // k3
  89.     for (int i = 0; i < N; i++)
  90.         k[i][2] = UllahJung(i, phi_k2) * dt;
  91.  
  92.     double phi_k3[N];
  93.     for (int i = 0; i < N; i++)
  94.         phi_k3[i] = f[i] + k[i][2] / 2;
  95.  
  96.     // k4
  97.     for (int i = 0; i < N; i++)
  98.         k[i][3] = UllahJung(i, phi_k3) * dt;
  99.  
  100.     for (int i = 0; i < N; i++)
  101.         f_next[i] = f[i] + (k[i][0] + 2 * k[i][1] + 2 * k[i][2] + k[i][3]) / 6;
  102. }
  103.  
  104. void CopyArray(double source[N], double target[N])
  105. {
  106.     for (int i = 0; i < N; i++)
  107.         target[i] = source[i];
  108. }
  109.  
  110. bool Approximately(double a, double b)
  111. {
  112.     if (a < 0)
  113.         a = -a;
  114.  
  115.     if (b < 0)
  116.         b = -b;
  117.  
  118.     return a - b <= 0.000001;
  119. }
  120.  
  121. int main()
  122. //main(int argc, char *argv[])
  123. {
  124.     //sscanf(argv[1], "%lf", &v_4);
  125.  
  126.     FILE *fp0;
  127.     srand(time(NULL));
  128.  
  129.     double Ca_0  = 0.07;
  130.     double IP3_0 = 0.16;
  131.     double z_0   = 0.67;
  132.    
  133.     //Initial values at t = 0
  134.     f[0] = Ca_0;
  135.     f[1] = IP3_0;
  136.     f[2] = z_0;
  137.        
  138.     /*fp0 = fopen("last_values.txt", "r");
  139.     for (int i = 0; i < N; i++)
  140.     {
  141.         fscanf(fp0, "%lf", &f[i]);
  142.     }
  143.     fclose(fp0);*/
  144.  
  145.     const double t_start = 0;
  146.     const double t_max   = 180; // sec
  147.     const double dt      = 0.00001;
  148.  
  149.     double t = t_start;
  150.  
  151.     //fp0 = fopen("v_4.txt", "w+");
  152.     //fprintf(fp0, "%f\n", v_4);
  153.     //fclose(fp0);
  154.  
  155.     fp0 = fopen("results_Ca_IP3_z.txt", "w+");
  156.     //setlocale(LC_NUMERIC, "French_Canada.1252");
  157.  
  158.     clock_t start_rk4, end_rk4;
  159.     start_rk4 = clock();
  160.     int lastPercent = -1;
  161.  
  162.     while (t < t_max || Approximately(t, t_max))
  163.     {
  164.         fprintf(fp0, "%f\t", t);
  165.         for (int i = 0; i < N; i++)
  166.         {
  167.             fprintf(fp0, i == N - 1 ? "%f" : "%f\t", f[i]);
  168.         }
  169.         fprintf(fp0, "\n");
  170.  
  171.         double f_next[N];
  172.  
  173.         RungeKutta(dt, f, f_next);
  174.         CopyArray(f_next, f);
  175.  
  176.         t += dt;
  177.  
  178.         int percent = (int)(100 * (t - t_start) / (t_max - t_start));
  179.         if (percent != lastPercent)
  180.         {
  181.             printf("Progress: %d%%\n", percent);
  182.             lastPercent = percent;
  183.         }
  184.     }
  185.  
  186.     end_rk4 = clock();
  187.     double extime_rk4 = (double)(end_rk4 - start_rk4) / CLOCKS_PER_SEC;
  188.     int minutes = (int)extime_rk4 / 60;
  189.     int seconds = (int)extime_rk4 % 60;
  190.     printf("\nExecution time is: %d minutes %d seconds\n ", minutes, seconds);
  191.  
  192.     fclose(fp0);
  193.  
  194.     fp0 = fopen("time_exec.txt", "w+");
  195.     fprintf(fp0, "%f\n", extime_rk4);
  196.     fclose(fp0);
  197.  
  198.     fp0 = fopen("last_values.txt", "w+");
  199.     for (int i = 0; i < N; i++)
  200.     {
  201.         fprintf(fp0, i == N - 1 ? "%f" : "%f\t", f[i]);
  202.     }
  203.     fclose(fp0);
  204. }
  205.  
Advertisement
Add Comment
Please, Sign In to add comment