Advertisement
SpaceQuester

Untitled

Feb 12th, 2018
227
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.24 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 4
  10.  
  11. #define V f[0]
  12. #define m f[1]
  13. #define n f[2]
  14. #define h f[3]
  15.  
  16. double f[N];
  17.  
  18. double C = 1; // muF/cm^2
  19.  
  20. double g_K = 35; // mS/cm^2
  21. double g_Na = 40; // mS/cm^2
  22. double g_L = 0.3; // mS/cm^2
  23.  
  24. double E_K = -77; // mV
  25. double E_Na = 55; // mV
  26. double E_L = -65; // mV
  27.  
  28. double I_app;
  29.  
  30. int RandomI(int min, int max)
  31. {
  32. return ((double)rand() / (RAND_MAX - 1)) * (max - min) + min;
  33. }
  34.  
  35. double RandomD(double min, double max)
  36. {
  37. return ((double)rand() / RAND_MAX) * (max - min) + min;
  38. }
  39.  
  40. double alpha_n(double f[N])
  41. {
  42. return 0.02 * (V - 25) / (1 - exp(-(V - 25) / 9));
  43. }
  44.  
  45. double beta_n(double f[N])
  46. {
  47. return -0.002 * (V - 25) / (1 - exp((V - 25) / 9));
  48. }
  49.  
  50. double alpha_m(double f[N])
  51. {
  52. return 0.182 * (V + 35) / (1 - exp(-(V + 35) / 9));
  53. }
  54.  
  55. double beta_m(double f[N])
  56. {
  57. return -0.124 * (V + 35) / (1 - exp((V + 35) / 9));
  58. }
  59.  
  60. double alpha_h(double f[N])
  61. {
  62. return 0.25 * exp(-(V + 90) / 12);
  63. }
  64.  
  65. double beta_h(double f[N])
  66. {
  67. return 0.25 * exp((V + 62) / 6) / exp((V + 90) / 12);
  68. }
  69.  
  70. double HodgkinHuxley(int i, double f[N])
  71. {
  72. switch (i)
  73. {
  74. case 0:
  75. return 1000 * ((g_Na * pow(m, 3) * h * (E_Na - V) + g_K * pow(n, 4) * (E_K - V) + g_L * (E_L - V) + I_app) / C);
  76.  
  77. case 1:
  78. return 1000 * (alpha_m(f) * (1 - m) - beta_m(f) * m);
  79.  
  80. case 2:
  81. return 1000 * (alpha_n(f) * (1 - n) - beta_n(f) * n);
  82.  
  83. case 3:
  84. return 1000 * (alpha_h(f) * (1 - h) - beta_h(f) * h);
  85. }
  86. return 0;
  87. }
  88.  
  89. void RungeKutta(double dt, double f[N], double f_next[N])
  90. {
  91. double k[N][4];
  92.  
  93. // k1
  94. for (int i = 0; i < N; i++)
  95. k[i][0] = HodgkinHuxley(i, f) * dt;
  96.  
  97. double phi_k1[N];
  98. for (int i = 0; i < N; i++)
  99. phi_k1[i] = f[i] + k[i][0] / 2;
  100.  
  101. // k2
  102. for (int i = 0; i < N; i++)
  103. k[i][1] = HodgkinHuxley(i, phi_k1) * dt;
  104.  
  105. double phi_k2[N];
  106. for (int i = 0; i < N; i++)
  107. phi_k2[i] = f[i] + k[i][1] / 2;
  108.  
  109. // k3
  110. for (int i = 0; i < N; i++)
  111. k[i][2] = HodgkinHuxley(i, phi_k2) * dt;
  112.  
  113. double phi_k3[N];
  114. for (int i = 0; i < N; i++)
  115. phi_k3[i] = f[i] + k[i][2] / 2;
  116.  
  117. // k4
  118. for (int i = 0; i < N; i++)
  119. k[i][3] = HodgkinHuxley(i, phi_k3) * dt;
  120.  
  121. for (int i = 0; i < N; i++)
  122. f_next[i] = f[i] + (k[i][0] + 2 * k[i][1] + 2 * k[i][2] + k[i][3]) / 6;
  123. }
  124.  
  125. void CopyArray(double source[N], double target[N])
  126. {
  127. for (int i = 0; i < N; i++)
  128. target[i] = source[i];
  129. }
  130.  
  131. bool Approximately(double a, double b)
  132. {
  133. if (a < 0)
  134. a = -a;
  135.  
  136. if (b < 0)
  137. b = -b;
  138.  
  139. return a - b <= 0.000001;
  140. }
  141.  
  142. int main(int argc, char *argv[])
  143. {
  144. sscanf(argv[1], "%lf", &I_app);
  145.  
  146. FILE *fp0;
  147. srand(time(NULL));
  148.  
  149. // Initial values at t = 0
  150. /*for (int i = 0; i < N; i++)
  151. f[i] = 0;*/
  152. fp0 = fopen("last_values.txt", "r");
  153. for (int i = 0; i < N; i++)
  154. {
  155. fscanf(fp0, "%lf", &f[i]);
  156. }
  157. fclose(fp0);
  158.  
  159. const double t_start = 0;
  160. const double t_max = 1; // sec
  161. const double dt = 0.000001;
  162.  
  163. double t = t_start;
  164.  
  165. fp0 = fopen("I_stim_height.txt", "a");
  166. fprintf(fp0, "%f\t", I_app);
  167. fclose(fp0);
  168.  
  169. fp0 = fopen("results.txt", "w+");
  170. //setlocale(LC_NUMERIC, "French_Canada.1252");
  171.  
  172. clock_t start_rk4, end_rk4;
  173. start_rk4 = clock();
  174. int lastPercent = -1;
  175.  
  176. while (t < t_max || Approximately(t, t_max))
  177. {
  178. fprintf(fp0, "%f\t", t);
  179. fprintf(fp0, "%f\t", I_app);
  180. for (int i = 0; i < N; i++)
  181. {
  182. fprintf(fp0, i == N - 1 ? "%f" : "%f\t", f[i]);
  183. }
  184. fprintf(fp0, "\n");
  185.  
  186. double f_next[N];
  187.  
  188. RungeKutta(dt, f, f_next);
  189. CopyArray(f_next, f);
  190.  
  191. t += dt;
  192.  
  193. int percent = (int)(100 * (t - t_start) / (t_max - t_start));
  194. if (percent != lastPercent)
  195. {
  196. printf("Progress: %d%%\n", percent);
  197. lastPercent = percent;
  198. }
  199. }
  200.  
  201. end_rk4 = clock();
  202. double extime_rk4 = (double)(end_rk4 - start_rk4) / CLOCKS_PER_SEC;
  203. int minutes = (int)extime_rk4 / 60;
  204. int seconds = (int)extime_rk4 % 60;
  205. printf("\nExecution time is: %d minutes %d seconds\n ", minutes, seconds);
  206.  
  207. fclose(fp0);
  208.  
  209. fp0 = fopen("time_exec.txt", "w+");
  210. fprintf(fp0, "%f\n", extime_rk4);
  211. fclose(fp0);
  212.  
  213. fp0 = fopen("last_values.txt", "w+");
  214. for (int i = 0; i < N; i++)
  215. {
  216. fprintf(fp0, i == N - 1 ? "%f" : "%f\t", f[i]);
  217. }
  218. fclose(fp0);
  219. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement