SpaceQuester

Untitled

Sep 2nd, 2021
1,144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 56.88 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2.  
  3. #define _USE_MATH_DEFINES
  4. #include "math.h"
  5. #include <stdlib.h>
  6. #include <stdio.h>
  7. #include <locale.h>
  8. #include <time.h>
  9. #include <stdbool.h>
  10. #include <list>
  11. #include <omp.h>
  12. #include <vector>
  13. #include <complex>
  14. #include <iostream>
  15. #include <valarray>
  16.  
  17. using namespace std;
  18.  
  19. #define Node_count 200 // 200 Default
  20.  
  21. int MaxDeep = 50; // 50 Default
  22.  
  23. #define Equations_per_node 12 // !!! 12 - Don't change !!!
  24. #define Equations_count Node_count * Equations_per_node
  25.  
  26. double* f;
  27. double* f_diff;
  28.  
  29. double** k;
  30. double* phi_k1;
  31. double* phi_k2;
  32. double* phi_k3;
  33.  
  34. bool enable_I_syn_out = false;
  35.  
  36. bool write_file = false;
  37. bool omp_enable = false;
  38.  
  39. double c_0 = 2; // uM
  40. double c_1 = 0.185;
  41. double v_1 = 6; // s^-1
  42. double v_2 = 0.11; // s^-1
  43. double v_3 = 2.2; // uM/s
  44. double* v_4; // uM/s - Controling parameter // 0.5 //double v_4[Node_count]; // uM/s - Controling parameter //0.495
  45. double v_5 = 0.025; // uM/s
  46. double v_6 = 0.2;  // uM/s
  47. double k_1 = 0.5; // s^-1
  48. double k_2 = 1; // uM
  49. double k_3 = 0.1;
  50. double k_4 = 1.1; // uM/s
  51. double a_2 = 0.14; // uM/s
  52. double d_1 = 0.13; // uM
  53. double d_2 = 1.049; // uM
  54. double d_3 = 0.9434; // uM
  55. double d_5 = 0.082; // uM
  56. double alpha = 0.8;
  57. double tau_IP3 = 7.143; // s
  58. double IP3_star = 0.16; // uM
  59. double d_Ca = 0.001; // 0.001
  60. double d_IP3 = 0.2; // 0.12
  61. double alpha_Glu = 2; // 2
  62. double g_astro; // 3
  63.  
  64. // https://neuronaldynamics.epfl.ch/online/Ch2.S2.html
  65. double C_m = 1; // muF/cm^2
  66. double g_K = 35; // mS/cm^2
  67. double g_Na = 40; // mS/cm^2
  68. double g_L = 0.3; // mS/cm^2
  69. double E_K = -77; // mV
  70. double E_Na = 55; // mV
  71. double E_L = -65; // mV
  72.  
  73. double C_m_P = 1; // muF/cm^2
  74. double g_K_P = 35; // mS/cm^2
  75. double g_Na_P = 40; // mS/cm^2
  76. double g_L_P = 0.3; // mS/cm^2
  77. double E_K_P = -77; // mV
  78. double E_Na_P = 55; // mV
  79. double E_L_P = -65; // mV
  80.  
  81. double p_rewir;
  82. double p_inhib;
  83.  
  84. double I_app_min;
  85. double I_app_max;
  86.  
  87. double g_syn;
  88. double k_syn = 0.2;
  89. double* E_syn;
  90.  
  91. double g_syn_P;
  92. double k_syn_P = 0.2;
  93. double* E_syn_P;
  94.  
  95. double alpha_G_P = 25; //s^-1
  96. double beta_G_P = 500; //s^-1
  97.  
  98. double* I_app;
  99. double* I_app_P;
  100.  
  101. double** A_A;
  102. double** B_A;
  103. double* C_A;
  104.  
  105. double** A_N;
  106. double** B_N;
  107. double* C_N;
  108.  
  109. double** A_N_P;
  110. double** B_N_P;
  111. double* C_N_P;
  112.  
  113. list<double>* V_spikes;
  114. list<double>* V_spikes_Freq;
  115.  
  116. FILE* fp_I_syn;
  117.  
  118. double** tau;
  119.  
  120. #define tau_min  2 // ms
  121. #define tau_max 12 // ms
  122.  
  123. #define ms_to_step 40 // (0.001 / dt) !!! Don't forget !!!
  124.  
  125. #define Max_delay tau_max * ms_to_step
  126. double** V_old_array;
  127.  
  128. double Poisson_Freq; // Hz
  129. //const double Min_magintude = -0.20; // muA/cm^2
  130. double Max_magnitude = 2.5; // muA/cm^2 // 0.20
  131. const double Duration = 0.002; // sec
  132.  
  133. double* Meander_start_from_zero;
  134. double* Meander_width;
  135. double* Meander_height;
  136. double* Meander_interval;
  137. double* last_meander_end;
  138.  
  139. typedef std::complex<double> Complex;
  140. typedef std::valarray<Complex> CArray;
  141.  
  142. void fft(CArray& x)
  143. {
  144.     // DFT
  145.     unsigned int N = x.size(), k = N, n;
  146.     double thetaT = 3.14159265358979323846264338328L / N;
  147.     Complex phiT = Complex(cos(thetaT), -sin(thetaT)), T;
  148.     while (k > 1)
  149.     {
  150.         n = k;
  151.         k >>= 1;
  152.         phiT = phiT * phiT;
  153.         T = 1.0L;
  154.         for (unsigned int l = 0; l < k; l++)
  155.         {
  156.             for (unsigned int a = l; a < N; a += n)
  157.             {
  158.                 unsigned int b = a + k;
  159.                 Complex t = x[a] - x[b];
  160.                 x[a] += x[b];
  161.                 x[b] = t * T;
  162.             }
  163.             T *= phiT;
  164.         }
  165.     }
  166.     // Decimate
  167.     unsigned int m = (unsigned int)log2(N);
  168.     for (unsigned int a = 0; a < N; a++)
  169.     {
  170.         unsigned int b = a;
  171.         // Reverse bits
  172.         b = (((b & 0xaaaaaaaa) >> 1) | ((b & 0x55555555) << 1));
  173.         b = (((b & 0xcccccccc) >> 2) | ((b & 0x33333333) << 2));
  174.         b = (((b & 0xf0f0f0f0) >> 4) | ((b & 0x0f0f0f0f) << 4));
  175.         b = (((b & 0xff00ff00) >> 8) | ((b & 0x00ff00ff) << 8));
  176.         b = ((b >> 16) | (b << 16)) >> (32 - m);
  177.         if (b > a)
  178.         {
  179.             Complex t = x[a];
  180.             x[a] = x[b];
  181.             x[b] = t;
  182.         }
  183.     }
  184.     //// Normalize (This section make it not working correctly)
  185.     //Complex f = 1.0 / sqrt(N);
  186.     //for (unsigned int i = 0; i < N; i++)
  187.     //  x[i] *= f;
  188. }
  189.  
  190. struct Interval
  191. {
  192.     double T_start;
  193.     double T_end;
  194. };
  195.  
  196. enum Ca_state
  197. {
  198.     Wait_for_up,
  199.     Wait_for_down
  200. };
  201.  
  202. Ca_state ca_all_state[Node_count];
  203.  
  204. vector<Interval> Ca_all_intervals[Node_count];
  205. vector<Interval> Ca_intervals;
  206.  
  207. //bool thread_count_printed = false;
  208.  
  209. double I_stim(int i, double t)
  210. {
  211.     if (t < Meander_start_from_zero[i])
  212.         return 0;
  213.  
  214.     t -= Meander_start_from_zero[i];
  215.     t = fmod(t, Meander_width[i] + Meander_interval[i]);
  216.  
  217.     return t < Meander_width[i] ? Meander_height[i] : 0;
  218. }
  219.  
  220. double Ca(int i)
  221. {
  222.     return f[i * Equations_per_node];
  223. }
  224.  
  225. void SetCa(int i, double value)
  226. {
  227.     f[i * Equations_per_node] = value;
  228. }
  229.  
  230. double IP3(int i)
  231. {
  232.     return f[i * Equations_per_node + 1];
  233. }
  234.  
  235. void SetIP3(int i, double value)
  236. {
  237.     f[i * Equations_per_node + 1] = value;
  238. }
  239.  
  240. double z(int i)
  241. {
  242.     return f[i * Equations_per_node + 2];
  243. }
  244.  
  245. void Setz(int i, double value)
  246. {
  247.     f[i * Equations_per_node + 2] = value;
  248. }
  249.  
  250. double G_P(int i)
  251. {
  252.     return f[i * Equations_per_node + 3];
  253. }
  254.  
  255. void SetG_P(int i, double value)
  256. {
  257.     f[i * Equations_per_node + 3] = value;
  258. }
  259.  
  260. double V(int i)
  261. {
  262.     return f[i * Equations_per_node + 4];
  263. }
  264.  
  265. void SetV(int i, double value)
  266. {
  267.     f[i * Equations_per_node + 4] = value;
  268. }
  269.  
  270. double m(int i)
  271. {
  272.     return f[i * Equations_per_node + 5];
  273. }
  274.  
  275. void Setm(int i, double value)
  276. {
  277.     f[i * Equations_per_node + 5] = value;
  278. }
  279.  
  280. double n(int i)
  281. {
  282.     return f[i * Equations_per_node + 6];
  283. }
  284.  
  285. void Setn(int i, double value)
  286. {
  287.     f[i * Equations_per_node + 6] = value;
  288. }
  289.  
  290. double h(int i)
  291. {
  292.     return f[i * Equations_per_node + 7];
  293. }
  294.  
  295. void Seth(int i, double value)
  296. {
  297.     f[i * Equations_per_node + 7] = value;
  298. }
  299.  
  300. ///
  301.  
  302. double V_P(int i)
  303. {
  304.     return f[i * Equations_per_node + 8];
  305. }
  306.  
  307. void SetV_P(int i, double value)
  308. {
  309.     f[i * Equations_per_node + 8] = value;
  310. }
  311.  
  312. double m_P(int i)
  313. {
  314.     return f[i * Equations_per_node + 9];
  315. }
  316.  
  317. void Setm_P(int i, double value)
  318. {
  319.     f[i * Equations_per_node + 9] = value;
  320. }
  321.  
  322. double n_P(int i)
  323. {
  324.     return f[i * Equations_per_node + 10];
  325. }
  326.  
  327. void Setn_P(int i, double value)
  328. {
  329.     f[i * Equations_per_node + 10] = value;
  330. }
  331.  
  332. double h_P(int i)
  333. {
  334.     return f[i * Equations_per_node + 11];
  335. }
  336.  
  337. void Seth_P(int i, double value)
  338. {
  339.     f[i * Equations_per_node + 11] = value;
  340. }
  341.  
  342. double V_old(int i, int delay)
  343. {
  344.     return V_old_array[i][Max_delay - 1 - delay];
  345. }
  346.  
  347. int RandomI(int min, int max)
  348. {
  349.     return ((double)rand() / (RAND_MAX - 1)) * (max - min) + min;
  350. }
  351.  
  352. double RandomD(double min, double max)
  353. {
  354.     return ((double)rand() / RAND_MAX) * (max - min) + min;
  355. }
  356.  
  357. double J_channel(double* f, int i)
  358. {
  359.     return c_1 * v_1 * pow(IP3(i), 3) * pow(Ca(i), 3) * pow(z(i), 3) * (c_0 / c_1 - (1 + 1 / c_1) * Ca(i)) / pow((IP3(i) + d_1) * (Ca(i) + d_5), 3);
  360. }
  361.  
  362. double J_PLC(double* f, int i)
  363. {
  364.     return v_4[i] * (Ca(i) + (1 - alpha) * k_4) / (Ca(i) + k_4);
  365. }
  366.  
  367. double J_leak(double* f, int i)
  368. {
  369.     return c_1 * v_2 * (c_0 / c_1 - (1 + 1 / c_1) * Ca(i));
  370. }
  371.  
  372. double J_pump(double* f, int i)
  373. {
  374.     return v_3 * pow(Ca(i), 2) / (pow(k_3, 2) + pow(Ca(i), 2));
  375. }
  376.  
  377. double J_in(double* f, int i)
  378. {
  379.     return v_5 + v_6 * pow(IP3(i), 2) / (pow(k_2, 2) + pow(IP3(i), 2));
  380. }
  381.  
  382. double J_out(double* f, int i)
  383. {
  384.     return k_1 * Ca(i);
  385. }
  386.  
  387. double J_Glu(double* f, int i)
  388. {
  389.     /*double J = 0;
  390.     if (E_syn_P[i] == 0)
  391.     {
  392.         J += alpha_Glu / (1 + exp(-(G_P(i) - 0.25) / 0.01));
  393.     }
  394.     return J;*/
  395.  
  396.     return alpha_Glu / (1 + exp(-(G_P(i) - 0.25) / 0.01));
  397. }
  398.  
  399. double alpha_m(double* f, int i)
  400. {
  401.     return 0.182 * (V(i) + 35) / (1 - exp(-(V(i) + 35) / 9));
  402. }
  403.  
  404. double beta_m(double* f, int i)
  405. {
  406.     return -0.124 * (V(i) + 35) / (1 - exp((V(i) + 35) / 9));
  407. }
  408.  
  409. double alpha_n(double* f, int i)
  410. {
  411.     return 0.02 * (V(i) - 25) / (1 - exp(-(V(i) - 25) / 9));
  412. }
  413.  
  414. double beta_n(double* f, int i)
  415. {
  416.     return -0.002 * (V(i) - 25) / (1 - exp((V(i) - 25) / 9));
  417. }
  418.  
  419. double alpha_h(double* f, int i)
  420. {
  421.     return 0.25 * exp(-(V(i) + 90) / 12);
  422. }
  423.  
  424. double beta_h(double* f, int i)
  425. {
  426.     return 0.25 * exp((V(i) + 62) / 6) / exp((V(i) + 90) / 12);
  427. }
  428.  
  429. //
  430.  
  431. double alpha_m_P(double* f, int i)
  432. {
  433.     return 0.182 * (V_P(i) + 35) / (1 - exp(-(V_P(i) + 35) / 9));
  434. }
  435.  
  436. double beta_m_P(double* f, int i)
  437. {
  438.     return -0.124 * (V_P(i) + 35) / (1 - exp((V_P(i) + 35) / 9));
  439. }
  440.  
  441. double alpha_n_P(double* f, int i)
  442. {
  443.     return 0.02 * (V_P(i) - 25) / (1 - exp(-(V_P(i) - 25) / 9));
  444. }
  445.  
  446. double beta_n_P(double* f, int i)
  447. {
  448.     return -0.002 * (V_P(i) - 25) / (1 - exp((V_P(i) - 25) / 9));
  449. }
  450.  
  451. double alpha_h_P(double* f, int i)
  452. {
  453.     return 0.25 * exp(-(V_P(i) + 90) / 12);
  454. }
  455.  
  456. double beta_h_P(double* f, int i)
  457. {
  458.     return 0.25 * exp((V_P(i) + 62) / 6) / exp((V_P(i) + 90) / 12);
  459. }
  460.  
  461. double FindBurstFreq(double dt, double t_start, double t_end)
  462. {
  463.     int window_length = 0.03 / dt;
  464.  
  465.     int steps_count = (t_end - t_start) / dt;
  466.  
  467.     int pow_of_2 = log2(steps_count);
  468.  
  469.     if (pow_of_2 > 22)
  470.         pow_of_2 = 22;
  471.  
  472.     int fft_N = pow(2, pow_of_2);
  473.  
  474.     Complex* complex = new Complex[fft_N];
  475.     int fft_index = 0;
  476.  
  477.     for (int i = 0; i < Node_count; i++)
  478.     {
  479.         list<double>::iterator it_V_spikes = V_spikes[i].begin();
  480.  
  481.         while (it_V_spikes != V_spikes[i].end())
  482.         {
  483.             if (*it_V_spikes > t_end)
  484.                 break;
  485.  
  486.             if (*it_V_spikes >= t_start)
  487.             {
  488.                 int minStepIndex = ((*it_V_spikes - t_start) - (window_length / 2) * dt) / dt;
  489.                 int maxStepIndex = ((*it_V_spikes - t_start) + (window_length / 2) * dt) / dt;
  490.  
  491.                 if (minStepIndex < 0)
  492.                     minStepIndex = 0;
  493.  
  494.                 if (maxStepIndex > fft_N - 1)
  495.                     maxStepIndex = fft_N - 1;
  496.  
  497.                 for (int j = minStepIndex; j <= maxStepIndex; j++)
  498.                     complex[j] += Complex(1, 0);
  499.             }
  500.  
  501.             it_V_spikes++;
  502.         }
  503.     }
  504.     /*
  505.     for (int j = 0; j < fft_N; j++)
  506.     {
  507.         int spikes_count_all = 0;
  508.  
  509.         double t_center = j * dt + t_start;
  510.         double t_min = t_center - (window_length / 2) * dt;
  511.         double t_max = t_center + (window_length / 2) * dt;
  512.  
  513.         for (int i = 0; i < Node_count; i++)
  514.         {
  515.             int spikes_count = 0;
  516.  
  517.             list<double>::iterator it_V_spikes = V_spikes[i].begin();
  518.  
  519.             if (*it_V_spikes <= t_max)
  520.             {
  521.                 while (it_V_spikes != V_spikes[i].end())
  522.                 {
  523.                     if (*it_V_spikes > t_max)
  524.                         break;
  525.  
  526.                     if (*it_V_spikes >= t_min && *it_V_spikes <= t_max)
  527.                         spikes_count++;
  528.  
  529.                     it_V_spikes++;
  530.                 }
  531.  
  532.                 spikes_count_all += spikes_count;
  533.             }
  534.         }
  535.  
  536.         complex[j] = Complex(spikes_count_all, 0);
  537.  
  538.  
  539.         //fprintf(fp0, "%f\t%d\n", j * dt, spikes_count_all);
  540.     }
  541.     */
  542.     CArray data(complex, fft_N);
  543.     fft(data);
  544.  
  545.     double sampleRate = 1 / dt;
  546.  
  547.     int max_freq_index = -1;
  548.     double max_freq_magnitude = 0;
  549.  
  550.     for (int i = 1; i < fft_N / 2; i++)
  551.     {
  552.         double magnitude = sqrt(data[i].real() * data[i].real() + data[i].imag() * data[i].imag());
  553.  
  554.         if (max_freq_index == -1 || magnitude > max_freq_magnitude)
  555.         {
  556.             max_freq_index = i;
  557.             max_freq_magnitude = magnitude;
  558.         }
  559.  
  560.         //fprintf(fp1, "%f\t%10.0f\n", (double)i * sampleRate / fft_N, magnitude);
  561.     }
  562.  
  563.     return max_freq_index * sampleRate / fft_N;
  564. }
  565.  
  566. double UllahJung_HodgkinHuxley(int i, double* f, double t)
  567. {
  568.     int in = i / Equations_per_node;
  569.     int il = i % Equations_per_node;
  570.  
  571.     switch (il)
  572.     {
  573.     case 0: // Ca
  574.     {
  575.         double sum_1 = 0;
  576.  
  577.         /*for (int j = 0; j < Node_count; j++)
  578.         {
  579.           sum_1 += d_Ca * (Ca(j) - Ca(in));
  580.         }*/
  581.  
  582.         for (int j = 0; j < C_A[in]; j++)
  583.         {
  584.             sum_1 += d_Ca * (Ca((int)B_A[in][j]) - Ca(in));
  585.         }
  586.  
  587.         return J_channel(f, in) - J_pump(f, in) + J_leak(f, in) + J_in(f, in) - J_out(f, in) + sum_1;
  588.     }
  589.  
  590.     case 1: // IP3
  591.     {
  592.         double sum_2 = 0;
  593.  
  594.         /*for (int j = 0; j < Node_count; j++)
  595.         {
  596.         sum_2 += d_IP3 * (IP3(j) - IP3(in));
  597.         }*/
  598.  
  599.         for (int j = 0; j < C_A[in]; j++)
  600.         {
  601.             sum_2 += d_IP3 * (IP3((int)B_A[in][j]) - IP3(in));
  602.         }
  603.  
  604.         return (IP3_star - IP3(in)) / tau_IP3 + J_PLC(f, in) + sum_2 + J_Glu(f, in);
  605.     }
  606.  
  607.     case 2: // z
  608.     {
  609.         return a_2 * (d_2 * (IP3(in) + d_1) / (IP3(in) + d_3) * (1 - z(in)) - Ca(in) * z(in));
  610.     }
  611.  
  612.     case 3: // G_P
  613.     {
  614.         return -alpha_G_P * G_P(in) + beta_G_P * (1 / (1 + exp(-V_P(in) / 0.5)));
  615.     }
  616.  
  617.     case 4: // V
  618.     {
  619.         double I_syn = 0;
  620.         double I_syn_P = 0;
  621.  
  622.         /*for (int j = 0; j < Node_count; j++)
  623.         {
  624.         //sum += A[in][j] * g_syn * (V(in) - V_old(j, tau[in][j]));
  625.         //sum += A[in][j] * g_syn * (V(j) - V(in));
  626.         //sum += A[in][j] * g_syn * (V(in) - E_syn[in]) / (1 + exp(-V_old(j, tau[in][j]) / k_syn));
  627.         //sum += 1 / (0.2 * Node_count_half) * A[in][j] * g_syn * (V(in) - E_syn[in]) / (1 + exp(-V(j) / k_syn)); // i up, j down
  628.         //sum += 1 / (0.2 * Node_count_half) * A[in][j] * g_syn * (V(j) - E_syn[j]) / (1 + exp(-V(in) / k_syn)); // j up, i down
  629.           I_syn += A_N[in][j] * g_syn * (E_syn[in] - V(in)) / (1 + exp(-(V(j) / k_syn)));
  630.         //printf("in = %d\t Node_count = %d\t A[in][j] = %f\t V(in) = %f\t E_syn[in] = %f\t sum = %f\n", in, j, A[in][j], V(in), E_syn[in], sum);
  631.       }*/
  632.  
  633.       /*for (int j = 0; j < C[in]; j++)
  634.       {
  635.       sum += sigma[in][(int)B[in][j]] * (V((int)B[in][j]) - V(in));
  636.       }*/
  637.  
  638.         for (int j = 0; j < C_N[in]; j++)
  639.         {
  640.             if ((1 + g_astro * Ca(in)) > 0)
  641.             {
  642.                 if (Ca(in) >= 0.3)
  643.                 {
  644.                     I_syn += g_syn * (1 + g_astro * Ca(in)) * (V(in) - E_syn[(int)B_N[in][j]]) / (1 + exp(-(V((int)B_N[in][j]) / k_syn))); // версия с V (без V_old)
  645.                 }
  646.                 else
  647.                 {
  648.                     I_syn += g_syn * (V(in) - E_syn[(int)B_N[in][j]]) / (1 + exp(-(V((int)B_N[in][j]) / k_syn))); // версия с V (без V_old)
  649.                 }
  650.             }
  651.             //I_syn += g_syn * (V(in) - E_syn[(int)B_N[in][j]]) / (1 + exp(-(V((int)B_N[in][j]) / k_syn))); // версия с V (без V_old)
  652.             //I_syn += g_syn * (1 + g_astro * Ca(in)) * (E_syn[in] - V(in)) / (1 + exp(-(V_old((int)B_N[in][j], tau[in][(int)B_N[in][j]]) / k_syn)); // версия с V_old
  653.             //I_syn += g_syn * (1 + g_astro * Ca(in)) * (E_syn[in] - V(in)) / (1 + exp(-(V(j) / k_syn))); // версия без с V (без V_old)
  654.             //I_syn += g_syn * (E_syn[in] - V(in)) / (1 + exp(-(V(j) / k_syn))); // версия без с V (без V_old), упрощенная версия
  655.             // sum_3 += g_syn * (1 + g_astro * Ca(in)) * (E_syn[i] - V(i)) / (1 + exp(-(V(j) / k_syn))); // образец из старой версии
  656.             //I_syn += g_syn * (E_syn[in] - V(in)) / (1 + exp(-(V_old((int)B_N[in][j], tau[in][(int)B_N[in][j]])) / k_syn));*/
  657.           //I_syn += g_syn * (E_syn[(int)B_N[in][j]] - V(in)) / (1 + exp(-(V(j) / k_syn))); // версия с V (без V_old)
  658.           //I_syn += g_syn * (E_syn[(int)B_N[in][j]] - V(in)) / (1 + exp(-(V((int)B_N[in][j]) / k_syn))); // версия с V (без V_old), упрощенная версия !!!
  659.           //I_syn += g_syn * (E_syn[(int)B_N[in][j]] - V(in)) / (1 + exp(-(V_old((int)B_N[in][j], tau[in][(int)B_N[in][j]]) / k_syn))); // версия с V (без V_old), упрощенная версия !!!
  660.         //sum += g_syn * (V((int)B[in][j]) - V(in)); // устаревшая часть, нужна для проверки разностной схемы
  661.         //sum += A[in][j] * g_syn * (V(in) - E_syn[in]) / (1 + exp(-V_old((int)B[in][j]) / k_syn)); // устаревшая часть
  662.         //sum += A[in][(int)B[in][j]] * g_syn * (V(in) - E_syn[in]) / (1 + exp(-V_old((int)B[in][j], tau[in][(int)B[in][j]]) / k_syn));
  663.         //sum += A[in][(int)B[in][j]] * g_syn * (V((int)B[in][j]) - E_syn[(int)B[in][j]]) / (1 + exp(-V_old(in, tau[in][(int)B[in][j]]) / k_syn));
  664.         //sum += 1 / (0.2 * Node_count_half) * A[in][(int)B[in][j]] * g_syn * (V((int)B[in][j]) - E_syn[(int)B[in][j]]) / (1 + exp(-V(in) / k_syn)); // j up, i down
  665.         //sum += 1 / (0.2 * Node_count) * /*(int)A_N[in][(int)B_N[in][j]] * */ g_syn * (1 + g_astro * Ca(in)) * (V(in) - E_syn[in]) / (1 + exp(-V((int)B_N[in][j]) / k_syn)); // i up, j down
  666.           // i up, j down
  667.           /*printf("i = %d\t j = %d\t A[i, j] = %d\n", in, (int)B_N[in][j], (int)A_N[in][(int)B_N[in][j]]);*/
  668.         /*printf("i = %d\t V_old = %f\t exp = %f\n", in, Vold, ee);*/
  669.         }
  670.         /*printf("i = %d\t sum = %f\n", in, sum);*/
  671.  
  672.         /*if ((1 + g_astro * Ca(in)) > 0)
  673.         {
  674.             if (Ca(in) >= 0.3)
  675.             {
  676.                 I_syn_P += g_syn_P * (1 + g_astro * Ca(in)) * (V_P(in) - E_syn_P[in]) / (1 + exp(-(V_P(in) / k_syn_P))); // версия с V (без V_old)
  677.             }
  678.             else
  679.             {
  680.                 I_syn_P += g_syn_P * (V_P(in) - E_syn_P[in]) / (1 + exp(-(V_P(in) / k_syn_P))); // версия с V (без V_old)
  681.             }
  682.         }*/
  683.         I_syn_P += g_syn_P * (V_P(in) - E_syn_P[in]) / (1 + exp(-(V_P(in) / k_syn_P))); // версия с V (без V_old)
  684.  
  685.         if (enable_I_syn_out)
  686.             fprintf(fp_I_syn, i == Equations_count - 1 ? "%f" : "%f\t", I_syn);
  687.  
  688.         return 1000 * ((g_Na * pow(m(in), 3) * h(in) * (E_Na - V(in)) + g_K * n(in) * (E_K - V(in)) + g_L * (E_L - V(in)) + I_app[in] + I_syn + I_syn_P) / C_m); // V
  689.     }
  690.  
  691.     case 5: // m
  692.     {
  693.         return 1000 * (alpha_m(f, in) * (1 - m(in)) - beta_m(f, in) * m(in)); // m
  694.     }
  695.  
  696.     case 6: // n
  697.     {
  698.         return 1000 * (alpha_n(f, in) * (1 - n(in)) - beta_n(f, in) * n(in)); // n
  699.     }
  700.  
  701.     case 7: // h
  702.     {
  703.         return 1000 * (alpha_h(f, in) * (1 - h(in)) - beta_h(f, in) * h(in)); // h
  704.     }
  705.  
  706.     case 8: // V_P
  707.     {
  708.         return 1000 * ((g_Na_P * pow(m_P(in), 3) * h_P(in) * (E_Na_P - V_P(in)) + g_K_P * n_P(in) * (E_K_P - V_P(in)) + g_L_P * (E_L_P - V_P(in)) + I_app_P[in] + I_stim(in, t)) / C_m_P); // V_P
  709.     }
  710.  
  711.     case 9: // m_P
  712.     {
  713.         return 1000 * (alpha_m_P(f, in) * (1 - m_P(in)) - beta_m_P(f, in) * m_P(in)); // m_P
  714.     }
  715.  
  716.     case 10: // n_P
  717.     {
  718.         return 1000 * (alpha_n_P(f, in) * (1 - n_P(in)) - beta_n_P(f, in) * n_P(in)); // n_P
  719.     }
  720.  
  721.     case 11: // h_P
  722.     {
  723.         return 1000 * (alpha_h_P(f, in) * (1 - h_P(in)) - beta_h_P(f, in) * h_P(in)); // h_P
  724.     }
  725.     }
  726.  
  727.     return 0;
  728. }
  729.  
  730. void RungeKutta(double t, double dt, double* f, double* f_next)
  731. {
  732.     // k1
  733. #pragma omp parallel for
  734.     for (int i = 0; i < Equations_count; i++)
  735.     {
  736.         //if (!thread_count_printed)
  737.         //{
  738.         //  thread_count_printed = true;
  739.         //  printf("Threads = %d\n", omp_get_num_threads());
  740.         //}
  741.  
  742.         k[i][0] = UllahJung_HodgkinHuxley(i, f, t) * dt;
  743.         phi_k1[i] = f[i] + k[i][0] / 2;
  744.         k[i][1] = UllahJung_HodgkinHuxley(i, phi_k1, t) * dt;
  745.         phi_k2[i] = f[i] + k[i][1] / 2;
  746.         k[i][2] = UllahJung_HodgkinHuxley(i, phi_k2, t) * dt;
  747.         phi_k3[i] = f[i] + k[i][2] / 2;
  748.         k[i][3] = UllahJung_HodgkinHuxley(i, phi_k3, t) * dt;
  749.         f_next[i] = f[i] + (k[i][0] + 2 * k[i][1] + 2 * k[i][2] + k[i][3]) / 6;
  750.     }
  751.  
  752.     //for (int i = 0; i < Equations_count; i++)
  753.     //  phi_k1[i] = f[i] + k[i][0] / 2;
  754.  
  755.     // k2
  756.     //for (int i = 0; i < Equations_count; i++)
  757.     //  k[i][1] = UllahJung_HodgkinHuxley(i, phi_k1, t) * dt;
  758.  
  759.  
  760.     //for (int i = 0; i < Equations_count; i++)
  761.     //  phi_k2[i] = f[i] + k[i][1] / 2;
  762.  
  763.     // k3
  764.     //for (int i = 0; i < Equations_count; i++)
  765.     //  k[i][2] = UllahJung_HodgkinHuxley(i, phi_k2, t) * dt;
  766.  
  767.  
  768.     //for (int i = 0; i < Equations_count; i++)
  769.     //  phi_k3[i] = f[i] + k[i][2] / 2;
  770.  
  771.     //enable_I_syn_out = true;
  772.  
  773.     // k4
  774.     //for (int i = 0; i < Equations_count; i++)
  775.     //  k[i][3] = UllahJung_HodgkinHuxley(i, phi_k3, t) * dt;
  776.  
  777.     //enable_I_syn_out = false;
  778.  
  779.     //for (int i = 0; i < Equations_count; i++)
  780.     //  f_next[i] = f[i] + (k[i][0] + 2 * k[i][1] + 2 * k[i][2] + k[i][3]) / 6;
  781. }
  782.  
  783. void CopyArray(double* source, double* target, int N)
  784. {
  785.     for (int i = 0; i < N; i++)
  786.         target[i] = source[i];
  787. }
  788.  
  789. bool Approximately(double a, double b)
  790. {
  791.     if (a < 0)
  792.         a = -a;
  793.  
  794.     if (b < 0)
  795.         b = -b;
  796.  
  797.     return a - b <= 0.000001;
  798. }
  799.  
  800. //bool CheckSameLine(int i, int j)
  801. //{
  802. //  return i / Node_wire_width == j / Node_wire_width;
  803. //}
  804. //
  805. //bool IsWireNeighbors(int i, int j)
  806. //{
  807. //  if (CheckSameLine(i, j) && (i == j - 1 || i == j + 1))
  808. //      return true;
  809. //
  810. //  if (i == j - Node_wire_width || i == j + Node_wire_width)
  811. //      return true;
  812. //
  813. //  return false;
  814. //}
  815.  
  816. // http://preshing.com/20111007/how-to-generate-random-timings-for-a-poisson-process/
  817. double nextTime(double rateParameter)
  818. {
  819.     return -log(1.0 - (double)rand() / (RAND_MAX)) / rateParameter;
  820. }
  821.  
  822. void GenerateRandomMeander(int i, double min_start_time)
  823. {
  824.     double offset = nextTime(Poisson_Freq);
  825.  
  826.     if (offset < 0)
  827.     {
  828.         int a = 0;
  829.     }
  830.  
  831.     Meander_start_from_zero[i] = min_start_time + offset;
  832.     Meander_width[i] = Duration;
  833.     //Meander_height[i] = RandomD(-Max_magnitude, Max_magnitude);
  834.     Meander_height[i] = RandomD(0, Max_magnitude);
  835.     //Meander_height[i] = Max_magnitude;
  836. }
  837.  
  838. void FillAMatrixZero()
  839. {
  840.     for (int i = 0; i < Node_count; i++)
  841.     {
  842.         for (int j = 0; j < Node_count; j++)
  843.         {
  844.             A_A[i][j] = 0;
  845.             A_N[i][j] = 0;
  846.             A_N_P[i][j] = 0;
  847.         }
  848.     }
  849. }
  850.  
  851. void FillAstrociteMatrix()
  852. {
  853.     for (int i = 0; i < Node_count; i++)
  854.     {
  855.         for (int j = 0; j < Node_count; j++)
  856.         {
  857.             if (i == j)
  858.             {
  859.                 A_A[i][j] = 0;
  860.                 continue;
  861.             }
  862.  
  863.             if (i > j)
  864.             {
  865.                 A_A[i][j] = A_A[j][i];
  866.                 continue;
  867.             }
  868.  
  869.             if (i == 0 && j == Node_count - 1)
  870.             {
  871.                 A_A[i][j] = 1;
  872.                 continue;
  873.             }
  874.  
  875.             if (i == Node_count - 1 && j == 0)
  876.             {
  877.                 A_A[i][j] = 1;
  878.                 continue;
  879.             }
  880.  
  881.             if (i == j - 1 || i == j + 1)
  882.             {
  883.                 A_A[i][j] = 1;
  884.                 continue;
  885.             }
  886.         }
  887.     }
  888.     //A_A[0][1] = 0; // only for debug. diffusion Ca test
  889.     //A_A[1][0] = 0; // only for debug. diffusion Ca test
  890.     //A_A[1][3] = 0;
  891.     //A_A[3][1] = 0;
  892.     //A_A[0][2] = 0;
  893.     //A_A[2][0] = 0;
  894. }
  895.  
  896. void FillBCMatrix_A()
  897. {
  898.     for (int i = 0; i < Node_count; i++)
  899.     {
  900.         int bIndex = 0;
  901.         C_A[i] = 0;
  902.         for (int j = 0; j < Node_count; j++)
  903.         {
  904.             if (A_A[i][j] == 1)
  905.             {
  906.                 B_A[i][bIndex] = j;
  907.                 bIndex++;
  908.                 C_A[i]++;
  909.             }
  910.         }
  911.     }
  912. }
  913.  
  914. void FillBCMatrix_N()
  915. {
  916.     for (int i = 0; i < Node_count; i++)
  917.     {
  918.         int bIndex = 0;
  919.         C_N[i] = 0;
  920.         for (int j = 0; j < Node_count; j++)
  921.         {
  922.             if (A_N[i][j] == 1)
  923.             {
  924.                 B_N[i][bIndex] = j;
  925.                 bIndex++;
  926.                 C_N[i]++;
  927.             }
  928.         }
  929.     }
  930. }
  931.  
  932. void FillBCMatrix_N_P()
  933. {
  934.     for (int i = 0; i < Node_count; i++)
  935.     {
  936.         int bIndex = 0;
  937.         C_N_P[i] = 0;
  938.         for (int j = 0; j < Node_count; j++)
  939.         {
  940.             if (A_N_P[i][j] == 1)
  941.             {
  942.                 B_N_P[i][bIndex] = j;
  943.                 bIndex++;
  944.                 C_N_P[i]++;
  945.             }
  946.         }
  947.     }
  948. }
  949.  
  950. bool IsWireNeighbors(int i, int j, int deep)
  951. {
  952.     int j_border_left = j - deep < 0 ? j + Node_count : j;
  953.     int j_border_right = j + deep >= Node_count ? j - Node_count : j;
  954.  
  955.     if (i == j_border_left - deep || i == j_border_right + deep)
  956.     {
  957.         return true;
  958.     }
  959.  
  960.     return false;
  961. }
  962.  
  963. void FillNeuronMatrix()
  964. {
  965.     for (int i = 0; i < Node_count; i++)
  966.     {
  967.         for (int j = 0; j < Node_count; j++)
  968.         {
  969.             if (i == j)
  970.             {
  971.                 A_N[i][j] = 0;
  972.                 continue;
  973.             }
  974.  
  975.             if (i > j)
  976.             {
  977.                 A_N[i][j] = A_N[j][i];
  978.                 continue;
  979.             }
  980.  
  981.             for (int deep = 1; deep <= MaxDeep; deep++)
  982.             {
  983.                 if (IsWireNeighbors(i, j, deep))
  984.                     A_N[i][j] = 1;
  985.             }
  986.         }
  987.     }
  988. }
  989.  
  990. void RandomizeNeuronMatrix()
  991. {
  992.     srand(time(NULL));
  993.  
  994.     for (int i = 0; i < Node_count; i++)
  995.     {
  996.         //if (i == Node_count / 2)
  997.         //  srand(time(NULL));
  998.  
  999.         for (int link = 0; link < MaxDeep * 2; link++)
  1000.         {
  1001.             double x = RandomD(0, 1);
  1002.  
  1003.             if (x > p_rewir)
  1004.                 continue;
  1005.  
  1006.             int rndJ;
  1007.  
  1008.             do
  1009.             {
  1010.                 rndJ = RandomI(0, Node_count);
  1011.             } while (i == rndJ || A_N[i][rndJ] == 1);
  1012.  
  1013.             int rndJ_last;
  1014.  
  1015.             do
  1016.             {
  1017.                 rndJ_last = RandomI(i - MaxDeep - 1, i + MaxDeep + 1);
  1018.  
  1019.                 if (rndJ_last < 0)
  1020.                     rndJ_last += Node_count;
  1021.                 else if (rndJ_last >= Node_count)
  1022.                     rndJ_last -= Node_count;
  1023.  
  1024.             } while (i == rndJ_last || A_N[i][rndJ_last] == 0);
  1025.  
  1026.             A_N[i][rndJ_last] = 0;
  1027.  
  1028.             A_N[i][rndJ] = 1;
  1029.         }
  1030.     }
  1031. }
  1032.  
  1033. void FillNeuronPoissonMatrix()
  1034. {
  1035.     for (int i = 0; i < Node_count; i++)
  1036.     {
  1037.         for (int j = 0; j < Node_count; j++)
  1038.         {
  1039.             A_N_P[i][j] = 0;
  1040.         }
  1041.     }
  1042. }
  1043.  
  1044. void FillVOldFromCurrent()
  1045. {
  1046.     for (int i = 0; i < Node_count; i++)
  1047.         for (int j = 0; j < Max_delay; j++)
  1048.             V_old_array[i][j] = V(i);
  1049. }
  1050.  
  1051. void UpdateVOld()
  1052. {
  1053.     for (int i = 0; i < Node_count; i++)
  1054.     {
  1055.         for (int j = 1; j < Max_delay; j++)
  1056.             V_old_array[i][j - 1] = V_old_array[i][j];
  1057.  
  1058.         V_old_array[i][Max_delay - 1] = V(i);
  1059.     }
  1060. }
  1061.  
  1062. //void FillFullTauMatrix()
  1063. //{
  1064. //  for (int i = 0; i < Node_count; i++)
  1065. //  {
  1066. //      for (int j = 0; j < Node_count; j++)
  1067. //      {
  1068. //          if (i < Node_count || j < Node_count)
  1069. //          {
  1070. //              tau[i][j] = 0;
  1071. //              continue;
  1072. //          }
  1073. //
  1074. //          int i_neuron = i - Node_count;
  1075. //          int j_neuron = j - Node_count;
  1076. //
  1077. //          int i_wire_x = i_neuron / Node_wire_width;
  1078. //          int i_wire_y = i_neuron % Node_wire_width;
  1079. //
  1080. //          int j_wire_x = j_neuron / Node_wire_width;
  1081. //          int j_wire_y = j_neuron % Node_wire_width;
  1082. //
  1083. //          double distance_max = sqrt(2.) * (Node_wire_width - 1);
  1084. //          double distance = sqrt((i_wire_x - j_wire_x) * (i_wire_x - j_wire_x) + (i_wire_y - j_wire_y) * (i_wire_y - j_wire_y));
  1085. //
  1086. //          tau[i][j] = (tau_min + distance / (distance_max) * (tau_max - tau_min)) * ms_to_step;
  1087. //      }
  1088. //  }
  1089. //}
  1090. //
  1091. //void FillTauMatrix()
  1092. //{
  1093. //  for (int i = 0; i < Node_count; i++)
  1094. //  {
  1095. //      for (int j = 0; j < Node_count; j++)
  1096. //      {
  1097. //          if (i == j || A_N[i][j] == 0)
  1098. //          {
  1099. //              tau[i][j] = 0;
  1100. //              continue;
  1101. //          }
  1102. //
  1103. //          int i_neuron = i;
  1104. //          int j_neuron = j;
  1105. //
  1106. //          int i_wire_x = i_neuron / Node_wire_width;
  1107. //          int i_wire_y = i_neuron % Node_wire_width;
  1108. //
  1109. //          int j_wire_x = j_neuron / Node_wire_width;
  1110. //          int j_wire_y = j_neuron % Node_wire_width;
  1111. //
  1112. //          double distance_max = sqrt(2.) * (Node_wire_width - 1);
  1113. //          double distance = sqrt((i_wire_x - j_wire_x) * (i_wire_x - j_wire_x) + (i_wire_y - j_wire_y) * (i_wire_y - j_wire_y));
  1114. //
  1115. //          double t = (distance - 1) / (distance_max - 1);
  1116. //          tau[i][j] = (tau_min + t * (tau_max - tau_min)) * ms_to_step;
  1117. //      }
  1118. //  }
  1119. //}
  1120.  
  1121. int main(int argc, char* argv[])
  1122. {
  1123.     // run like: UJ_HH_Ring_acc.out 250 0.2 0.4 0.05 3.0 1.05 1.50 // (1) p_rewir (2) g_syn (3) g_astro (4) Max_magnitude (5) g_syn_P (6) Poisson_Freq
  1124.     /*sscanf(argv[1], "%d", &Node_count);
  1125.     FILE* fp_Node_count;
  1126.     fp_Node_count = fopen("Node_count.txt", "w");
  1127.     fprintf(fp_Node_count, "%d\t", Node_count);
  1128.     fclose(fp_Node_count);
  1129.     printf("Node_count = %d\n", Node_count);*/
  1130.  
  1131.     sscanf(argv[1], "%lf", &p_rewir);
  1132.     FILE* fp_p_rewir;
  1133.     fp_p_rewir = fopen("p_rewir.txt", "w");
  1134.     fprintf(fp_p_rewir, "%f\t", p_rewir);
  1135.     fclose(fp_p_rewir);
  1136.     printf("p_rewir = %f\n", p_rewir);
  1137.  
  1138.     /*sscanf(argv[3], "%lf", &p_inhib);
  1139.     FILE* fp_p_inhib;
  1140.     fp_p_inhib = fopen("p_inhib.txt", "w");
  1141.     fprintf(fp_p_inhib, "%f\t", p_inhib);
  1142.     fclose(fp_p_inhib);
  1143.     printf("p_inhib = %f\n", p_inhib);*/
  1144.  
  1145.     sscanf(argv[2], "%lf", &g_syn);
  1146.     FILE* fp_g_syn;
  1147.     fp_g_syn = fopen("g_syn.txt", "w");
  1148.     fprintf(fp_g_syn, "%f\t", g_syn);
  1149.     fclose(fp_g_syn);
  1150.     printf("g_syn = %f\n", g_syn);
  1151.  
  1152.     sscanf(argv[3], "%lf", &g_astro);
  1153.     FILE* fp_g_astro;
  1154.     fp_g_astro = fopen("g_astro.txt", "w");
  1155.     fprintf(fp_g_astro, "%f\t", g_astro);
  1156.     fclose(fp_g_astro);
  1157.     printf("g_astro = %f\n", g_astro);
  1158.  
  1159.     sscanf(argv[4], "%lf", &g_syn_P);
  1160.     FILE* fp_g_syn_P;
  1161.     fp_g_syn_P = fopen("g_syn_P.txt", "w");
  1162.     fprintf(fp_g_syn_P, "%f\t", g_syn_P);
  1163.     fclose(fp_g_syn_P);
  1164.     printf("g_syn_P = %f\n", g_syn_P);
  1165.  
  1166.     sscanf(argv[5], "%lf", &Poisson_Freq);
  1167.     FILE* fp_Poisson_Freq;
  1168.     fp_Poisson_Freq = fopen("Poisson_Freq.txt", "w");
  1169.     fprintf(fp_Poisson_Freq, "%f\t", Poisson_Freq);
  1170.     fclose(fp_Poisson_Freq);
  1171.     printf("Poisson_Freq = %f\n", Poisson_Freq);
  1172.  
  1173.     int write = 0;
  1174.     sscanf(argv[6], "%i", &write);
  1175.     write_file = write;
  1176.     printf("write_file = %i\n", write_file);
  1177.  
  1178.     int omp = 0;
  1179.     sscanf(argv[7], "%i", &omp);
  1180.     omp_enable = omp;
  1181.     printf("omp_enable = %i\n", omp_enable);
  1182.  
  1183.     //sscanf(argv[6], "%lf", &I_app_min);
  1184.     //sscanf(argv[7], "%lf", &I_app_max);
  1185.  
  1186.     for (int i = 0; i < Node_count; i++)
  1187.         ca_all_state[i] = Wait_for_up;
  1188.  
  1189.     f = new double[Equations_count];
  1190.     f_diff = new double[Equations_count];
  1191.     v_4 = new double[Node_count];
  1192.     E_syn = new double[Node_count];
  1193.     I_app = new double[Node_count];
  1194.     E_syn_P = new double[Node_count];
  1195.     I_app_P = new double[Node_count];
  1196.     V_spikes = new list<double>[Node_count];
  1197.     V_spikes_Freq = new list<double>[Node_count];
  1198.  
  1199.     Meander_start_from_zero = new double[Node_count];
  1200.     Meander_width = new double[Node_count];
  1201.     Meander_height = new double[Node_count];
  1202.     Meander_interval = new double[Node_count];
  1203.     last_meander_end = new double[Node_count];
  1204.  
  1205.     tau = new double* [Node_count];
  1206.     for (int i = 0; i < Node_count; i++)
  1207.         tau[i] = new double[Node_count];
  1208.  
  1209.     V_old_array = new double* [Node_count];
  1210.     for (int i = 0; i < Node_count; i++)
  1211.         V_old_array[i] = new double[Max_delay];
  1212.  
  1213.     FILE* fp0;
  1214.     FILE* fp_I_stim = 0;
  1215.     FILE* fp_Ca = 0;
  1216.     FILE* fp_IP3 = 0;
  1217.     //FILE *fp_z;
  1218.     //FILE* fp_G_P;
  1219.     FILE* fp_V = 0;
  1220.     FILE* fp_V_P = 0;
  1221.     //FILE *fp_m;
  1222.     //FILE *fp_n;
  1223.     //FILE *fp_h;
  1224.     FILE* fp_V_spikes = 0;
  1225.     FILE* fp_Esyn;
  1226.     FILE* fp_Esyn_P;
  1227.  
  1228.     //FILE* fp_res;
  1229.     srand(time(NULL));
  1230.  
  1231.     //for (int i = 0; i < Node_count; i++)
  1232.     //  V_old_length[i] = 0;
  1233.  
  1234.     A_A = new double* [Node_count];
  1235.     for (int i = 0; i < Node_count; i++)
  1236.         A_A[i] = new double[Node_count];
  1237.  
  1238.     B_A = new double* [Node_count];
  1239.     for (int i = 0; i < Node_count; i++)
  1240.         B_A[i] = new double[Node_count];
  1241.  
  1242.     C_A = new double[Node_count];
  1243.  
  1244.     A_N = new double* [Node_count];
  1245.     for (int i = 0; i < Node_count; i++)
  1246.         A_N[i] = new double[Node_count];
  1247.  
  1248.     B_N = new double* [Node_count];
  1249.     for (int i = 0; i < Node_count; i++)
  1250.         B_N[i] = new double[Node_count];
  1251.  
  1252.     C_N = new double[Node_count];
  1253.  
  1254.     A_N_P = new double* [Node_count];
  1255.     for (int i = 0; i < Node_count; i++)
  1256.         A_N_P[i] = new double[Node_count];
  1257.  
  1258.     B_N_P = new double* [Node_count];
  1259.     for (int i = 0; i < Node_count; i++)
  1260.         B_N_P[i] = new double[Node_count];
  1261.  
  1262.     C_N_P = new double[Node_count];
  1263.  
  1264.     FillAMatrixZero();
  1265.     FillAstrociteMatrix();
  1266.     FillNeuronMatrix();
  1267.     RandomizeNeuronMatrix();
  1268.     FillNeuronPoissonMatrix();
  1269.     FillBCMatrix_A();
  1270.     FillBCMatrix_N();
  1271.     FillBCMatrix_N_P();
  1272.     //FillTauMatrix();
  1273.  
  1274.     fp0 = fopen("A_A.txt", "w+");
  1275.     for (int i = 0; i < Node_count; i++)
  1276.     {
  1277.         for (int j = 0; j < Node_count; j++)
  1278.         {
  1279.             fprintf(fp0, "%d\t", (int)A_A[i][j]);
  1280.         }
  1281.         fprintf(fp0, "\n");
  1282.     }
  1283.     fclose(fp0);
  1284.  
  1285.     fp0 = fopen("A_N.txt", "w+");
  1286.     for (int i = 0; i < Node_count; i++)
  1287.     {
  1288.         for (int j = 0; j < Node_count; j++)
  1289.         {
  1290.             fprintf(fp0, "%d\t", (int)A_N[i][j]);
  1291.         }
  1292.         fprintf(fp0, "\n");
  1293.     }
  1294.     fclose(fp0);
  1295.  
  1296.     fp0 = fopen("tau.txt", "w+");
  1297.     for (int i = 0; i < Node_count; i++)
  1298.     {
  1299.         for (int j = 0; j < Node_count; j++)
  1300.         {
  1301.             fprintf(fp0, "%f\t", tau[i][j] / ms_to_step);
  1302.         }
  1303.         fprintf(fp0, "\n");
  1304.     }
  1305.     fclose(fp0);
  1306.  
  1307.     // Write to file number of links for each neuron
  1308.     fp0 = fopen("links.txt", "w+");
  1309.     for (int i = 0; i < Node_count; i++)
  1310.     {
  1311.         int links_count = 0;
  1312.         for (int j = 0; j < Node_count; j++)
  1313.         {
  1314.             if (A_N[i][j] == 1)
  1315.             {
  1316.                 links_count++;
  1317.             }
  1318.         }
  1319.         fprintf(fp0, "%d\n", (int)links_count);
  1320.     }
  1321.     fclose(fp0);
  1322.  
  1323.     //setlocale(LC_NUMERIC, "French_Canada.1252");
  1324.     fp0 = fopen("test_Poisson.txt", "w+");
  1325.     for (int i = 0; i < 1000; i++)
  1326.         fprintf(fp0, "%f\n", nextTime(Poisson_Freq));
  1327.     fclose(fp0);
  1328.  
  1329.     fp0 = fopen("B_A.txt", "w+");
  1330.     for (int i = 0; i < Node_count; i++)
  1331.     {
  1332.         for (int j = 0; j < C_A[i]; j++)
  1333.         {
  1334.             fprintf(fp0, "%d\t", (int)B_A[i][j]);
  1335.         }
  1336.         fprintf(fp0, "\n");
  1337.     }
  1338.     fclose(fp0);
  1339.  
  1340.     fp0 = fopen("B_N.txt", "w+");
  1341.     for (int i = 0; i < Node_count; i++)
  1342.     {
  1343.         for (int j = 0; j < C_N[i]; j++)
  1344.         {
  1345.             fprintf(fp0, "%d\t", (int)B_N[i][j]);
  1346.         }
  1347.         fprintf(fp0, "\n");
  1348.     }
  1349.     fclose(fp0);
  1350.  
  1351.     fp0 = fopen("C_A.txt", "w+");
  1352.     for (int i = 0; i < Node_count; i++)
  1353.     {
  1354.         fprintf(fp0, "%d\n", (int)C_A[i]);
  1355.     }
  1356.     fclose(fp0);
  1357.  
  1358.     fp0 = fopen("C_N.txt", "w+");
  1359.     for (int i = 0; i < Node_count; i++)
  1360.     {
  1361.         fprintf(fp0, "%d\n", (int)C_N[i]);
  1362.     }
  1363.     fclose(fp0);
  1364.  
  1365.     /*for (int i = 0; i < 6; i++)
  1366.     {
  1367.         v_4[i] = 0.6;
  1368.     }*/
  1369.     for (int i = 0; i < Node_count; i++)
  1370.     {
  1371.         v_4[i] = 0.4; // 0.4
  1372.     }
  1373.  
  1374.     // Initial values
  1375.     /*for (int i = 0; i < Equations_count; i++)
  1376.     {
  1377.       f[i] = 0;
  1378.   }*/
  1379.  
  1380.   //I_app_min = 1.1;
  1381.   //I_app_max = 1.5;
  1382.  
  1383.     FILE* fp_I_app;
  1384.     fp_I_app = fopen("I_app.txt", "w");
  1385.     for (int i = 0; i < Node_count; i++)
  1386.     {
  1387.         I_app[i] = 0.7; //RandomD(I_app_min, I_app_max);
  1388.         fprintf(fp_I_app, "%f\n", I_app[i]);
  1389.     }
  1390.     fclose(fp_I_app);
  1391.  
  1392.     FILE* fp_I_app_P;
  1393.     fp_I_app_P = fopen("I_app_P.txt", "w");
  1394.     for (int i = 0; i < Node_count; i++)
  1395.     {
  1396.         I_app_P[i] = 0.7;
  1397.         fprintf(fp_I_app_P, "%f\n", I_app_P[i]);
  1398.     }
  1399.     fclose(fp_I_app_P);
  1400.  
  1401.     for (int i = 0; i < Node_count; i++) // init array for all nodes
  1402.     {
  1403.         SetG_P(i, 0); // G_P
  1404.     }
  1405.  
  1406.     double percent_stable_state = 0.50; // 0.40
  1407.     double eps_persent = 0.50; //0.05
  1408.  
  1409.     double Ca0 = 0.07;
  1410.     double IP30 = 0.16;
  1411.     double z0 = 0.67;
  1412.  
  1413.     for (int i = 0; i < Node_count; i++)
  1414.     {
  1415.         /*SetCa(i, Ca0 + RandomD(-Ca0 * eps_persent, Ca0 * eps_persent)); // Ca
  1416.         SetIP3(i, IP30 + RandomD(-IP30 * eps_persent, IP30 * eps_persent)); // IP3
  1417.         Setz(i, z0 + RandomD(-z0 * eps_persent, z0 * eps_persent)); // z */
  1418.         SetCa(i, Ca0); // Ca
  1419.         SetIP3(i, IP30); // IP3
  1420.         Setz(i, z0); // z
  1421.     }
  1422.  
  1423.     double V0 = -58.7085;
  1424.     double m0 = 0.0953;
  1425.     double n0 = 0.000913;
  1426.     double h0 = 0.3662;
  1427.  
  1428.     double V1 = 14.8409;
  1429.     double m1 = 0.9174;
  1430.     double n1 = 0.0140;
  1431.     double h1 = 0.0539;
  1432.  
  1433.     for (int i = 0; i < Node_count; i++) // init only for neurons
  1434.     {
  1435.       double random = RandomD(0, 1);
  1436.  
  1437.       SetV(i, random < percent_stable_state ? V0 + RandomD(-V0 * eps_persent, V0 * eps_persent) : V1 + RandomD(-V1 * eps_persent, V1 * eps_persent)); // V
  1438.       Setm(i, random < percent_stable_state ? m0 + RandomD(-m0 * eps_persent, m0 * eps_persent) : m1 + RandomD(-m1 * eps_persent, m1 * eps_persent)); // m
  1439.       Setn(i, random < percent_stable_state ? n0 + RandomD(-n0 * eps_persent, n0 * eps_persent) : n1 + RandomD(-n1 * eps_persent, n1 * eps_persent)); // n
  1440.       Seth(i, random < percent_stable_state ? h0 + RandomD(-h0 * eps_persent, h0 * eps_persent) : h1 + RandomD(-h1 * eps_persent, h1 * eps_persent)); // h
  1441.     }
  1442.  
  1443.     /*for (int i = 0; i < Node_count; i++) // init only for neurons
  1444.     {*/
  1445.     //double random = RandomD(0, 1);
  1446.  
  1447.     /*SetV(i, random < percent_stable_state ? V0 : V1); // V
  1448.     Setm(i, random < percent_stable_state ? m0 : m1); // m
  1449.     Setn(i, random < percent_stable_state ? n0 : n1); // n
  1450.     Seth(i, random < percent_stable_state ? h0 : h1); // h*/
  1451.  
  1452.     //SetV(i, V0); // V
  1453.     //Setm(i, m0); // m
  1454.     //Setn(i, n0); // n
  1455.     //Seth(i, h0); // h
  1456.  
  1457.     /*SetV_P(i, random < percent_stable_state ? V0 : V1); // V
  1458.     Setm_P(i, random < percent_stable_state ? m0 : m1); // m
  1459.     Setn_P(i, random < percent_stable_state ? n0 : n1); // n
  1460.     Seth_P(i, random < percent_stable_state ? h0 : h1); // h*/
  1461.  
  1462.     //SetV_P(i, V0); // V
  1463.     //Setm_P(i, m0); // m
  1464.     //Setn_P(i, n0); // n
  1465.     //Seth_P(i, h0); // h
  1466. //}
  1467.  
  1468.     for (int i = 0; i < Node_count; i++) // init only for neurons
  1469.     {
  1470.         //SetV(i, RandomD(-80, 20)); // V
  1471.         //Setm(i, RandomD(0, 1)); // m
  1472.         //Setn(i, RandomD(0, 1)); // n
  1473.         //Seth(i, RandomD(0, 1)); // h
  1474.         SetV_P(i, RandomD(-80, 20)); // V
  1475.         Setm_P(i, RandomD(0, 1)); // m
  1476.         Setn_P(i, RandomD(0, 1)); // n
  1477.         Seth_P(i, RandomD(0, 1)); // h
  1478.         //SetV(i, V1); // V
  1479.         //Setm(i, m1); // m
  1480.         //Setn(i, n1); // n
  1481.         //Seth(i, h1); // h
  1482.     }
  1483.  
  1484.     double E_syn0 = 0; // Excitatory neuron
  1485.     double E_syn1 = -90; // Inhibitory neuron
  1486.  
  1487.     fp_Esyn = fopen("results_E_syn.txt", "w+");
  1488.     for (int i = 0; i < Node_count; i++)
  1489.     {
  1490.         /*E_syn[i] = E_syn0;
  1491.  
  1492.         double x = RandomD(0, 1);
  1493.  
  1494.         if (x > p_inhib)
  1495.         {
  1496.             fprintf(fp_Esyn, "%f\n", E_syn[i]);
  1497.             continue;
  1498.         }*/
  1499.  
  1500.         E_syn[i] = E_syn1;
  1501.  
  1502.         fprintf(fp_Esyn, "%f\n", E_syn[i]);
  1503.  
  1504.         E_syn_P[i] = E_syn0;
  1505.     }
  1506.     fclose(fp_Esyn);
  1507.  
  1508.     for (int i = 0; i < Node_count; i++)
  1509.     {
  1510.         GenerateRandomMeander(i, 0);
  1511.         last_meander_end[i] = Meander_start_from_zero[i] + Duration;
  1512.     }
  1513.  
  1514.     const double t_start = 0;
  1515.     const double t_max = 5; // 100 msec = 0.1 sec // 240 // 270
  1516.     //const double dt = 0.000002; // 0.01 msec = 0.00001 sec; 0.1 msec = 0.0001 sec; 1 msec = 0.001 sec // 0.000025
  1517.     const double dt = 0.00002; // 0.01 msec = 0.00001 sec; 0.1 msec = 0.0001 sec; 1 msec = 0.001 sec // 0.000025
  1518.  
  1519.     double t = t_start;
  1520.  
  1521.     //fp_res = fopen("matlab_res.txt", "a+");
  1522.     //fprintf(fp_res, "%f\t%f\t", Max_magintude, g_syn);
  1523.  
  1524.     //fp0 = fopen("results.txt", "w+");
  1525.     //setlocale(LC_NUMERIC, "French_Canada.1252");
  1526.  
  1527.     double start_rk4, end_rk4;
  1528.     clock_t omp_start_rk4, omp_end_rk4;
  1529.  
  1530.     if (omp_enable)
  1531.         omp_start_rk4 = omp_get_wtime();
  1532.     else
  1533.         start_rk4 = clock();
  1534.  
  1535.     int lastPercent = -1;
  1536.  
  1537.     //FillVOldFromCurrent();
  1538.  
  1539.     k = new double* [Equations_count];
  1540.     for (int i = 0; i < Equations_count; i++)
  1541.         k[i] = new double[4];
  1542.  
  1543.     phi_k1 = new double[Equations_count];
  1544.     phi_k2 = new double[Equations_count];
  1545.     phi_k3 = new double[Equations_count];
  1546.  
  1547.     if (write_file)
  1548.     {
  1549.         fp_I_stim = fopen("results_I_stim.txt", "w+");
  1550.         //fp_I_syn = fopen("results_I_syn.txt", "w+");
  1551.         fp_Ca = fopen("results_Ca.txt", "w+");
  1552.         //fp_IP3 = fopen("results_IP3.txt", "w+");
  1553.         //fp_z    = fopen("results_z.txt", "w+");
  1554.         //fp_G_P = fopen("results_G_P.txt", "w+");
  1555.         fp_V = fopen("results_V.txt", "w+");
  1556.         fp_V_P = fopen("results_V_P.txt", "w+");
  1557.         //fp_m = fopen("results_m.txt", "w+");
  1558.         //fp_n = fopen("results_n.txt", "w+");
  1559.         //fp_h = fopen("results_h.txt", "w+");
  1560.         fp_V_spikes = fopen("results_V_spikes.txt", "w+");
  1561.     }
  1562.  
  1563.     double* f_next = new double[Equations_count];
  1564.  
  1565.     while (t < t_max || Approximately(t, t_max))
  1566.     {
  1567.         if (write_file)
  1568.         {
  1569.             fprintf(fp_I_stim, "%f\t", t);
  1570.             fprintf(fp_Ca, "%f\t", t);
  1571.             //fprintf(fp_IP3, "%f\t", t);
  1572.             //fprintf(fp_z, "%f\t", t);
  1573.             //fprintf(fp_G, "%f\t", t);
  1574.             fprintf(fp_V, "%f\t", t);
  1575.             fprintf(fp_V_P, "%f\t", t);
  1576.             //fprintf(fp_m, "%f\t", t);
  1577.             //fprintf(fp_n, "%f\t", t);
  1578.             //fprintf(fp_h, "%f\t", t);
  1579.             //fprintf(fp_V_spikes, "%f\t", t);
  1580.         }
  1581.  
  1582.         for (int i = 0; i < Node_count; i++)
  1583.         {
  1584.             if (t > last_meander_end[i])
  1585.             {
  1586.                 GenerateRandomMeander(i, t);
  1587.                 last_meander_end[i] = Meander_start_from_zero[i] + Duration;
  1588.             }
  1589.  
  1590.             if (write_file)
  1591.                 fprintf(fp_I_stim, "%f\t", I_stim(i, t));
  1592.         }
  1593.  
  1594.         if (write_file)
  1595.         {
  1596.             fprintf(fp_I_stim, "\n");
  1597.  
  1598.             for (int i = 0; i < Equations_count; i += Equations_per_node)
  1599.                 fprintf(fp_Ca, i == Equations_count - 1 ? "%f" : "%f\t", f[i]); // Ca
  1600.  
  1601.             //for (int i = 1; i < Equations_count; i += Equations_per_node)
  1602.             //  fprintf(fp_IP3, i == Equations_count - 1 ? "%f" : "%f\t", f[i]); // IP3
  1603.  
  1604.             //for (int i = 2; i < Equations_count; i += Equations_per_node)
  1605.             //  fprintf(fp_z, i == Equations_count - 1 ? "%f" : "%f\t", f[i]); // z
  1606.  
  1607.             //for (int i = 3; i < Equations_count; i += Equations_per_node)
  1608.             //  fprintf(fp_G_P, i == Equations_count - 1 ? "%f" : "%f\t", f[i]); // G
  1609.  
  1610.             for (int i = 4; i < Equations_count; i += Equations_per_node)
  1611.             {
  1612.                 if (isnan(f[i]))
  1613.                     return 1;
  1614.  
  1615.                 fprintf(fp_V, i == Equations_count - 1 ? "%f" : "%f\t", f[i]); // V
  1616.             }
  1617.  
  1618.             //for (int i = 5; i < Equations_count; i += Equations_per_node)
  1619.             //  fprintf(fp_m, i == Equations_count - 1 ? "%f" : "%f\t", f[i]); // m
  1620.  
  1621.             //for (int i = 6; i < Equations_count; i += Equations_per_node)
  1622.             //  fprintf(fp_n, i == Equations_count - 1 ? "%f" : "%f\t", f[i]); // n
  1623.  
  1624.             //for (int i = 7; i < Equations_count; i += Equations_per_node)
  1625.             //  fprintf(fp_h, i == Equations_count - 1 ? "%f" : "%f\t", f[i]); // h
  1626.  
  1627.             for (int i = 8; i < Equations_count; i += Equations_per_node)
  1628.                 fprintf(fp_V_P, i == Equations_count - 1 ? "%f" : "%f\t", f[i]); // V_P
  1629.  
  1630.             //for (int i = 9; i < Equations_count; i += Equations_per_node)
  1631.             //  fprintf(fp_m_P, i == Equations_count - 1 ? "%f" : "%f\t", f[i]); // m_P
  1632.  
  1633.             //for (int i = 10; i < Equations_count; i += Equations_per_node)
  1634.             //  fprintf(fp_n_P, i == Equations_count - 1 ? "%f" : "%f\t", f[i]); // n_P
  1635.  
  1636.             //for (int i = 11; i < Equations_count; i += Equations_per_node)
  1637.             //  fprintf(fp_h_P, i == Equations_count - 1 ? "%f" : "%f\t", f[i]); // h_P
  1638.  
  1639.             fprintf(fp_Ca, "\n");
  1640.             //fprintf(fp_IP3, "\n");
  1641.             //fprintf(fp_z, "\n");
  1642.             //fprintf(fp_G, "\n");
  1643.             fprintf(fp_V, "\n");
  1644.             //fprintf(fp_m, "\n");
  1645.             //fprintf(fp_n, "\n");
  1646.             //fprintf(fp_h, "\n");
  1647.  
  1648.             //fprintf(fp_G_P, "\n");
  1649.             fprintf(fp_V_P, "\n");
  1650.             //fprintf(fp_m_P, "\n");
  1651.             //fprintf(fp_n_P, "\n");
  1652.             //fprintf(fp_h_P, "\n");
  1653.         }
  1654.  
  1655.         RungeKutta(t, dt, f, f_next);
  1656.  
  1657. #pragma omp parallel for
  1658.         for (int i = 0; i < Node_count; i++)
  1659.         {
  1660.             int index = Equations_per_node * i + 4;
  1661.             double diff = f_next[index] - f[index];
  1662.  
  1663.             //fprintf(fp_V_spikes, i == Equations_count - 1 ? "%d" : "%d\t", diff < 0 && f_diff[index] > 0 && f[index] > -10 && (V_spikes[i].size() == 0 || t - V_spikes[i].back() > 0.001) ? 1 : 0);
  1664.  
  1665.             if (diff < 0 && f_diff[index] > 0 && f[index] > -10 && (V_spikes[i].size() == 0 || t - V_spikes[i].back() > 0.001))
  1666.             {
  1667.                 V_spikes[i].push_back(t);
  1668.             }
  1669.  
  1670.             f_diff[index] = diff;
  1671.         }
  1672.  
  1673.         //fprintf(fp_V_spikes, "\n");
  1674.  
  1675.         CopyArray(f_next, f, Equations_count);
  1676.  
  1677.         //printf("V(24) = %f\t V_old(24) = %f\n", f[24*4], V_old(24));
  1678.         //UpdateVOld();
  1679.  
  1680.         //fprintf(fp_I_syn, "\n");
  1681.  
  1682.         for (int i = 0; i < Node_count; i++)
  1683.         {
  1684.             if (ca_all_state[i] == Wait_for_up)
  1685.             {
  1686.                 if (Ca(i) > 0.3)
  1687.                 {
  1688.                     ca_all_state[i] = Wait_for_down;
  1689.                     Interval interval;
  1690.                     interval.T_start = t;
  1691.                     interval.T_end = -1;
  1692.                     Ca_all_intervals[i].push_back(interval);
  1693.                 }
  1694.             }
  1695.             else if (ca_all_state[i] == Wait_for_down)
  1696.             {
  1697.                 if (Ca(i) < 0.3)
  1698.                 {
  1699.                     Ca_all_intervals[i].back().T_end = t;
  1700.                     ca_all_state[i] = Wait_for_up;
  1701.                 }
  1702.             }
  1703.         }
  1704.  
  1705.         t += dt;
  1706.  
  1707.         int percent = (int)(100 * (t - t_start) / (t_max - t_start));
  1708.         if (percent != lastPercent)
  1709.         {
  1710.             printf("Progress: %d%%\n", percent);
  1711.             lastPercent = percent;
  1712.         }
  1713.     }
  1714.  
  1715.     delete[] f_next;
  1716.  
  1717.     double* V_mean_freqs = new double[Node_count];
  1718.     double* V_STD_freqs = new double[Node_count];
  1719.     //list<double> V_mean_freqs;
  1720.  
  1721.     int max_interval_count = 0;
  1722.  
  1723.     for (int i = 0; i < Node_count; i++)
  1724.     {
  1725.         if (Ca_all_intervals[i].size() > max_interval_count)
  1726.         {
  1727.             max_interval_count = Ca_all_intervals[i].size();
  1728.         }
  1729.     }
  1730.  
  1731.     for (int i = 0; i < max_interval_count; i++)
  1732.     {
  1733.         Interval mean_interval;
  1734.         mean_interval.T_start = 0;
  1735.         mean_interval.T_end = 0;
  1736.  
  1737.         int mean_count = 0;
  1738.  
  1739.         for (int j = 0; j < Node_count; j++)
  1740.         {
  1741.             if (Ca_all_intervals[j].size() > i && Ca_all_intervals[j][i].T_end > 0)
  1742.             {
  1743.                 mean_interval.T_start += Ca_all_intervals[j][i].T_start;
  1744.                 mean_interval.T_end += Ca_all_intervals[j][i].T_end;
  1745.  
  1746.                 mean_count++;
  1747.             }
  1748.         }
  1749.  
  1750.         mean_interval.T_start /= mean_count;
  1751.         mean_interval.T_end /= mean_count;
  1752.  
  1753.         Ca_intervals.push_back(mean_interval);
  1754.     }
  1755.  
  1756. #pragma omp parallel for
  1757.     for (int i = 0; i < Node_count; i++)
  1758.     {
  1759.         list<double>::iterator it_V_spikes = V_spikes[i].begin();
  1760.  
  1761.         while (it_V_spikes != V_spikes[i].end() && *it_V_spikes < 0.25 * t_max)
  1762.         {
  1763.             V_spikes[i].pop_front();
  1764.             it_V_spikes = V_spikes[i].begin();
  1765.         }
  1766.  
  1767.         list<double> V_freqs;
  1768.  
  1769.         it_V_spikes = V_spikes[i].begin();
  1770.  
  1771.         V_mean_freqs[i] = 0;
  1772.         V_STD_freqs[i] = 0;
  1773.  
  1774.         if (V_spikes[i].size() <= 1)
  1775.         {
  1776.             continue;
  1777.         }
  1778.         else
  1779.         {
  1780.             for (int j = 1; j < V_spikes[i].size(); j++)
  1781.             {
  1782.                 double first = *it_V_spikes;
  1783.                 advance(it_V_spikes, 1);
  1784.                 double next = *it_V_spikes;
  1785.  
  1786.                 double T = next - first;
  1787.                 V_freqs.push_back(1 / T);
  1788.             }
  1789.         }
  1790.  
  1791.         list<double>::iterator it_Freq = V_freqs.begin();
  1792.  
  1793.         for (int j = 0; j < V_freqs.size(); j++)
  1794.         {
  1795.             V_mean_freqs[i] += *it_Freq;
  1796.             advance(it_Freq, 1);
  1797.         }
  1798.  
  1799.         V_mean_freqs[i] /= V_freqs.size();
  1800.  
  1801.         it_Freq = V_freqs.begin();
  1802.  
  1803.         for (int j = 0; j < V_freqs.size(); j++)
  1804.         {
  1805.             V_STD_freqs[i] += pow(*it_Freq - V_mean_freqs[i], 2);
  1806.             advance(it_Freq, 1);
  1807.         }
  1808.  
  1809.         V_STD_freqs[i] /= V_freqs.size();
  1810.         V_STD_freqs[i] = sqrt(V_STD_freqs[i]);
  1811.     }
  1812.  
  1813.     fp0 = fopen("V_STD_freqs.txt", "w+");
  1814.     for (int i = 0; i < Node_count; i++)
  1815.     {
  1816.         fprintf(fp0, "%f\t", V_STD_freqs[i]);
  1817.     }
  1818.     fclose(fp0);
  1819.  
  1820.     double V_STD_mean_Freq = 0;
  1821.     double V_STD_mean_Freq_not_zero = 0;
  1822.     double V_STD_mean_Freq_not_zero_count = 0;
  1823.  
  1824.     for (int j = 0; j < Node_count; j++)
  1825.     {
  1826.         if (V_STD_freqs[j] != 0)
  1827.         {
  1828.             V_STD_mean_Freq_not_zero_count++;
  1829.             V_STD_mean_Freq += V_STD_freqs[j];
  1830.         }
  1831.     }
  1832.  
  1833.     V_STD_mean_Freq_not_zero = V_STD_mean_Freq / V_STD_mean_Freq_not_zero_count;
  1834.     V_STD_mean_Freq /= Node_count;
  1835.  
  1836.     fp0 = fopen("V_STD_mean_Freq.txt", "w+");
  1837.     fprintf(fp0, "%f\n", V_STD_mean_Freq);
  1838.     //fprintf(fp_res, "%f\t", V_STD_mean_Freq);
  1839.     fclose(fp0);
  1840.  
  1841.     fp0 = fopen("V_STD_mean_Freq_not_zero.txt", "w+");
  1842.     fprintf(fp0, "%f\n", V_STD_mean_Freq_not_zero);
  1843.     //fprintf(fp_res, "%f\t", V_STD_mean_Freq_not_zero);
  1844.     fclose(fp0);
  1845.  
  1846.     double V_mean_mean_Freq = 0;
  1847.     double V_mean_mean_Freq_not_zero = 0;
  1848.     double V_mean_mean_Freq_not_zero_count = 0;
  1849.  
  1850.     for (int j = 0; j < Node_count; j++)
  1851.     {
  1852.         if (V_mean_freqs[j] != 0)
  1853.         {
  1854.             V_mean_mean_Freq_not_zero_count++;
  1855.             V_mean_mean_Freq += V_mean_freqs[j];
  1856.         }
  1857.     }
  1858.  
  1859.     delete[] V_mean_freqs;
  1860.     delete[] V_STD_freqs;
  1861.  
  1862.     V_mean_mean_Freq_not_zero = V_mean_mean_Freq / V_mean_mean_Freq_not_zero_count;
  1863.     V_mean_mean_Freq /= Node_count;
  1864.  
  1865.     fp0 = fopen("V_mean_mean_Freq.txt", "w+");
  1866.     fprintf(fp0, "%f\n", V_mean_mean_Freq);
  1867.     fclose(fp0);
  1868.  
  1869.     fp0 = fopen("V_mean_mean_Freq_not_zero.txt", "w+");
  1870.     fprintf(fp0, "%f\n", V_mean_mean_Freq_not_zero);
  1871.     fclose(fp0);
  1872.  
  1873.     // CHUNKS
  1874.     double chunk_t_start = 0.25 * t_max;
  1875.     double chunk_t_step = 0.5;
  1876.     int chunk_step_count = (0.75 * t_max / chunk_t_step);
  1877.  
  1878.     double dt_chunk = 0.1 / V_mean_mean_Freq_not_zero; // 0.25
  1879.     int chunks_count = chunk_t_step / dt_chunk;
  1880.  
  1881.     double corr_aver_mean = 0, corr_aver_mean_not_zero = 0;
  1882.  
  1883.     FILE* fp_corr_not_zero = fopen("corr_not_zero.txt", "w+");
  1884.     FILE* fp_V_spikes_chunks = fopen("V_spikes_chunks.txt", "w+");
  1885.  
  1886.     vector<double> k_syn;
  1887.     vector<double> k_syn_time;
  1888.  
  1889.     for (int s = 0; s < chunk_step_count; s++)
  1890.     {
  1891.         if (chunks_count > 0)
  1892.         {
  1893.             int** V_spikes_chunks = new int* [Node_count];
  1894.  
  1895. #pragma omp parallel for
  1896.             for (int i = 0; i < Node_count; i++)
  1897.             {
  1898.                 V_spikes_chunks[i] = new int[chunks_count];
  1899.  
  1900.                 if (V_spikes[i].size() == 0)
  1901.                     for (int ch = 0; ch < chunks_count; ch++)
  1902.                         V_spikes_chunks[i][ch] = 0;
  1903.  
  1904.                 double ch_start = chunk_t_start + chunk_t_step * s;
  1905.                 double ch_end = ch_start + dt_chunk;
  1906.                 list<double>::iterator currentSpike = V_spikes[i].begin();
  1907.  
  1908.                 for (int ch = 0; ch < chunks_count; ch++)
  1909.                 {
  1910.                     while (currentSpike != V_spikes[i].end() && *currentSpike < ch_start)
  1911.                         currentSpike++;
  1912.  
  1913.                     if (currentSpike == V_spikes[i].end())
  1914.                         V_spikes_chunks[i][ch] = 0;
  1915.                     else
  1916.                         V_spikes_chunks[i][ch] = *currentSpike >= ch_start && *currentSpike <= ch_end;
  1917.  
  1918.                     ch_start += dt_chunk;
  1919.                     ch_end += dt_chunk;
  1920.                 }
  1921.             }
  1922.  
  1923.             char buffer[50];
  1924.             //sprintf(buffer, "V_spikes_chunks_%d.txt", s);
  1925.             //fp0 = fopen(buffer, "w+");
  1926.  
  1927.             for (int ch = 0; ch < chunks_count; ch++)
  1928.             {
  1929.                 for (int i = 0; i < Node_count; i++)
  1930.                     fprintf(fp_V_spikes_chunks, "%d\t", V_spikes_chunks[i][ch]);
  1931.  
  1932.                 fprintf(fp_V_spikes_chunks, "\n");
  1933.             }
  1934.  
  1935.             //fclose(fp0);
  1936.  
  1937.             double corr = 0;
  1938.             double corr_not_zero = 0;
  1939.             double counter = 0;
  1940.             double counter_not_zero = 0;
  1941.  
  1942.             for (int i = 0; i < Node_count; i++)
  1943.             {
  1944.                 for (int j = 0; j < Node_count; j++)
  1945.                 {
  1946.                     if (i == j)
  1947.                         continue;
  1948.  
  1949.                     int k1 = 0;
  1950.                     int k2 = 0;
  1951.                     int k3 = 0;
  1952.  
  1953.                     for (int l = 0; l < chunks_count; l++)
  1954.                     {
  1955.                         if (V_spikes_chunks[i][l] == 1 && V_spikes_chunks[j][l] == 1)
  1956.                             k1++;
  1957.  
  1958.                         k2 += V_spikes_chunks[i][l];
  1959.                         k3 += V_spikes_chunks[j][l];
  1960.                     }
  1961.  
  1962.                     if (k2 != 0 && k3 != 0)
  1963.                     {
  1964.                         corr += (double)k1 / sqrt((double)k2 * (double)k3);
  1965.                         counter_not_zero++;
  1966.                     }
  1967.  
  1968.                     counter++;
  1969.                 }
  1970.             }
  1971.  
  1972.             double corr_aver = corr / counter;
  1973.  
  1974.             double corr_aver_not_zero = corr;
  1975.  
  1976.             if (counter_not_zero != 0)
  1977.                 corr_aver_not_zero /= counter_not_zero;
  1978.  
  1979.             corr_aver_mean += corr_aver;
  1980.             corr_aver_mean_not_zero += corr_aver_not_zero;
  1981.  
  1982.             //sprintf(buffer, "corr_aver_%d.txt", s);
  1983.  
  1984.             //fp0 = fopen(buffer, "w+");
  1985.             //fprintf(fp0, "%f\n", corr_aver);
  1986.             //fclose(fp0);
  1987.  
  1988.             double ch_start = chunk_t_start + chunk_t_step * s;
  1989.             fprintf(fp_corr_not_zero, "%f\t%f\n", ch_start, corr_aver_not_zero);
  1990.  
  1991.             for (int i = 0; i < Node_count; i++)
  1992.                 delete[] V_spikes_chunks[i];
  1993.  
  1994.             delete[] V_spikes_chunks;
  1995.  
  1996.             k_syn.push_back(corr_aver_not_zero);
  1997.             k_syn_time.push_back(ch_start);
  1998.         }
  1999.         else
  2000.         {
  2001.             double ch_start = chunk_t_start + chunk_t_step * s;
  2002.             fprintf(fp_corr_not_zero, "%f\t%f\n", ch_start, 0.0);
  2003.         }
  2004.     }
  2005.  
  2006.     fclose(fp_corr_not_zero);
  2007.     fclose(fp_V_spikes_chunks);
  2008.  
  2009.     corr_aver_mean /= chunk_step_count;
  2010.     corr_aver_mean_not_zero /= chunk_step_count;
  2011.  
  2012.     double k_syn_local_max_mean = 0;
  2013.     int k_syn_local_max_mean_count = 0;
  2014.  
  2015.     double k_syn_local_min_mean = 0;
  2016.     int k_syn_local_min_mean_count = 0;
  2017.  
  2018.     FILE* fp_max = fopen("k_syn_local_max.txt", "w+");
  2019.     FILE* fp_min = fopen("k_syn_local_min.txt", "w+");
  2020.  
  2021.     for (int i = 0; i < Ca_intervals.size(); i++)
  2022.     {
  2023.         if (Ca_intervals[i].T_end < 0)
  2024.             break;
  2025.  
  2026.         {
  2027.             double k_syn_local_max = 0;
  2028.             bool firstValue = true;
  2029.  
  2030.             for (int j = 0; j < k_syn.size(); j++)
  2031.             {
  2032.                 if (k_syn_time[j] >= Ca_intervals[i].T_start && k_syn_time[j] <= Ca_intervals[i].T_end)
  2033.                 {
  2034.                     if (firstValue)
  2035.                     {
  2036.                         k_syn_local_max = k_syn[j];
  2037.                         firstValue = false;
  2038.                     }
  2039.                     else if (k_syn[j] > k_syn_local_max)
  2040.                     {
  2041.                         k_syn_local_max = k_syn[j];
  2042.                     }
  2043.                 }
  2044.             }
  2045.  
  2046.             if (!firstValue)
  2047.             {
  2048.                 k_syn_local_max_mean += k_syn_local_max;
  2049.                 k_syn_local_max_mean_count++;
  2050.  
  2051.                 fprintf(fp_max, "%f\n", k_syn_local_max);
  2052.             }
  2053.         }
  2054.  
  2055.         {
  2056.             double k_syn_local_min = 1;
  2057.             bool firstValue = true;
  2058.  
  2059.             for (int j = 0; j < k_syn.size(); j++)
  2060.             {
  2061.                 if (k_syn_time[j] >= Ca_intervals[i].T_start && k_syn_time[j] <= Ca_intervals[i].T_end)
  2062.                 {
  2063.                     if (firstValue)
  2064.                     {
  2065.                         k_syn_local_min = k_syn[j];
  2066.                         firstValue = false;
  2067.                     }
  2068.                     else if (k_syn[j] < k_syn_local_min)
  2069.                     {
  2070.                         k_syn_local_min = k_syn[j];
  2071.                     }
  2072.                 }
  2073.             }
  2074.  
  2075.             if (!firstValue)
  2076.             {
  2077.                 k_syn_local_min_mean += k_syn_local_min;
  2078.                 k_syn_local_min_mean_count++;
  2079.  
  2080.                 fprintf(fp_min, "%f\n", k_syn_local_min);
  2081.             }
  2082.         }
  2083.     }
  2084.  
  2085.     fclose(fp_max);
  2086.     fclose(fp_min);
  2087.  
  2088.     if (k_syn_local_max_mean_count != 0)
  2089.         k_syn_local_max_mean /= k_syn_local_max_mean_count;
  2090.  
  2091.     if (k_syn_local_min_mean_count != 0)
  2092.         k_syn_local_min_mean /= k_syn_local_min_mean_count;
  2093.  
  2094.  
  2095.  
  2096.     //fp0 = fopen("corr_aver_mean.txt", "w+");
  2097.     //fprintf(fp0, "%f\n", corr_aver_mean);
  2098.     //fclose(fp0);
  2099.  
  2100.     //fp0 = fopen("corr_aver_mean_not_zero.txt", "w+");
  2101.     //fprintf(fp0, "%f\n", corr_aver_mean_not_zero);
  2102.     //fclose(fp0);
  2103.     ////// CHUNKS END
  2104.  
  2105.     // 2
  2106.     double* V_freq_sync_time = new double[Node_count];
  2107.     double* V_freq_sync_time_relative = new double[Node_count];
  2108.  
  2109. #pragma omp parallel for
  2110.     for (int i = 0; i < Node_count; i++)
  2111.     {
  2112.         list<double>::iterator it_V_spikes = V_spikes[i].begin();
  2113.  
  2114.         while (it_V_spikes != V_spikes[i].end() && *it_V_spikes < 0.25 * t_max)
  2115.         {
  2116.             V_spikes[i].pop_front();
  2117.             it_V_spikes = V_spikes[i].begin();
  2118.         }
  2119.  
  2120.         list<double> V_freqs_normalized;
  2121.         list<double> V_freqs_time;
  2122.  
  2123.         it_V_spikes = V_spikes[i].begin();
  2124.  
  2125.         if (V_spikes[i].size() <= 1)
  2126.         {
  2127.             continue;
  2128.         }
  2129.         else
  2130.         {
  2131.             for (int j = 1; j < V_spikes[i].size(); j++)
  2132.             {
  2133.                 double first = *it_V_spikes;
  2134.                 advance(it_V_spikes, 1);
  2135.                 double next = *it_V_spikes;
  2136.  
  2137.                 double T = next - first;
  2138.                 V_freqs_normalized.push_back(1 / T - V_mean_mean_Freq);
  2139.                 V_freqs_time.push_back(next);
  2140.             }
  2141.         }
  2142.  
  2143.         list<double>::iterator it_Freq_normalized = V_freqs_normalized.begin();
  2144.         list<double>::iterator it_Freq_time = V_freqs_time.begin();
  2145.  
  2146.         V_freq_sync_time[i] = 0;
  2147.  
  2148.         for (int j = 1; j < V_freqs_normalized.size(); j++)
  2149.         {
  2150.             double Freq_normalized_last = *it_Freq_normalized;
  2151.             advance(it_Freq_normalized, 1);
  2152.             double Freq_normalized_next = *it_Freq_normalized;
  2153.  
  2154.             double Freq_time_last = *it_Freq_time;
  2155.             advance(it_Freq_time, 1);
  2156.             double Freq_time_next = *it_Freq_time;
  2157.  
  2158.             if (abs(Freq_normalized_last) <= 0.5 && abs(Freq_normalized_next) <= 0.5 && (Freq_time_next - Freq_time_last) <= 0.035)
  2159.                 V_freq_sync_time[i] += Freq_time_next - Freq_time_last;
  2160.         }
  2161.  
  2162.         V_freq_sync_time_relative[i] = V_freq_sync_time[i] / (t_max - (0.25 * t_max));
  2163.     }
  2164.  
  2165.     double V_mean_freq_sync_time_relative = 0;
  2166.  
  2167.     for (int j = 0; j < Node_count; j++)
  2168.     {
  2169.         V_mean_freq_sync_time_relative += V_freq_sync_time_relative[j];
  2170.     }
  2171.  
  2172.     V_mean_freq_sync_time_relative /= Node_count;
  2173.  
  2174.     fp0 = fopen("V_freq_sync_time_relative.txt", "w+");
  2175.     for (int i = 0; i < Node_count; i++)
  2176.     {
  2177.         fprintf(fp0, "%f\t", V_freq_sync_time_relative[i]);
  2178.     }
  2179.     fclose(fp0);
  2180.  
  2181.     fp0 = fopen("V_mean_freq_sync_time_relative.txt", "w+");
  2182.     fprintf(fp0, "%f\n", V_mean_freq_sync_time_relative);
  2183.     //fprintf(fp_res, "%f\n", V_mean_freq_sync_time_relative);
  2184.     fclose(fp0);
  2185.  
  2186.  
  2187.  
  2188.     // 3 BURSTS FREQ
  2189.  
  2190.     double Bursts_Freq = 0;
  2191.  
  2192.     if (g_astro == 0)
  2193.     {
  2194.         Bursts_Freq = FindBurstFreq(dt, 0.25 * t_max, t_max);
  2195.  
  2196.         /*
  2197.         fp0 = fopen("Spikes_sum.txt", "w+");
  2198.         FILE* fp1 = fopen("Spikes_freqs.txt", "w+");
  2199.  
  2200.         if (corr_aver_mean_not_zero >= 0.2)
  2201.         {
  2202.             //int window_length = (1 / V_mean_mean_Freq) / dt;
  2203.             int window_length = 0.03 / dt;
  2204.  
  2205.             int steps_count = t_max / dt;
  2206.  
  2207.             int pow_of_2 = log2(steps_count);
  2208.  
  2209.             if (pow_of_2 > 22)
  2210.                 pow_of_2 = 22;
  2211.  
  2212.             int fft_N = pow(2, pow_of_2);
  2213.  
  2214.             Complex* complex = new Complex[fft_N];
  2215.             int fft_index = 0;
  2216.  
  2217.             for (int j = (0.25 * t_max) / dt; j < steps_count; j++)
  2218.             {
  2219.                 int spikes_count_all = 0;
  2220.  
  2221.                 double t_center = j * dt;
  2222.                 double t_min = t_center - (window_length / 2) * dt;
  2223.                 double t_max = t_center + (window_length / 2) * dt;
  2224.  
  2225.                 for (int i = 0; i < Node_count; i++)
  2226.                 {
  2227.                     int spikes_count = 0;
  2228.  
  2229.                     list<double>::iterator it_V_spikes = V_spikes[i].begin();
  2230.  
  2231.                     if (*it_V_spikes <= t_max)
  2232.                     {
  2233.                         while (it_V_spikes != V_spikes[i].end())
  2234.                         {
  2235.                             if (*it_V_spikes > t_max)
  2236.                                 break;
  2237.  
  2238.                             if (*it_V_spikes >= t_min && *it_V_spikes <= t_max)
  2239.                                 spikes_count++;
  2240.  
  2241.                             it_V_spikes++;
  2242.                         }
  2243.  
  2244.                         spikes_count_all += spikes_count;
  2245.                     }
  2246.                 }
  2247.  
  2248.  
  2249.                 if (fft_index < fft_N)
  2250.                 {
  2251.                     //fft_values_re[fft_index] = sin(2 * M_PI * fft_index / 20);
  2252.  
  2253.                     complex[fft_index] = Complex(spikes_count_all, 0);
  2254.  
  2255.                     fft_index++;
  2256.                 }
  2257.  
  2258.                 fprintf(fp0, "%f\t%d\n", j * dt, spikes_count_all);
  2259.             }
  2260.  
  2261.             CArray data(complex, fft_N);
  2262.             fft(data);
  2263.  
  2264.             double sampleRate = 1 / dt;
  2265.  
  2266.             int max_freq_index = -1;
  2267.             double max_freq_magnitude = 0;
  2268.  
  2269.             for (int i = 1; i < fft_N / 2; i++)
  2270.             {
  2271.                 double magnitude = sqrt(data[i].real() * data[i].real() + data[i].imag() * data[i].imag());
  2272.  
  2273.                 if (max_freq_index == -1 || magnitude > max_freq_magnitude)
  2274.                 {
  2275.                     max_freq_index = i;
  2276.                     max_freq_magnitude = magnitude;
  2277.                 }
  2278.  
  2279.                 fprintf(fp1, "%f\t%10.0f\n", (double)i * sampleRate / fft_N, magnitude);
  2280.             }
  2281.  
  2282.             Bursts_Freq = max_freq_index * sampleRate / fft_N;
  2283.  
  2284.             fprintf(fp1, "\n\nFreq with max magnitude\t%f", Bursts_Freq);
  2285.  
  2286.             delete[] complex;
  2287.         }
  2288.  
  2289.         fclose(fp0);
  2290.         fclose(fp1);
  2291.         */
  2292.     }
  2293.     else
  2294.     {
  2295.         fp0 = fopen("interval_burst_freqs.txt", "w+");
  2296.  
  2297.         for (int i = 0; i < Ca_intervals.size(); i++)
  2298.         {
  2299.             double freq = FindBurstFreq(dt, Ca_intervals[i].T_start, Ca_intervals[i].T_end);
  2300.             fprintf(fp0, "%f\t%f\t%f\n", Ca_intervals[i].T_start, Ca_intervals[i].T_end, freq);
  2301.  
  2302.             Bursts_Freq += freq;
  2303.         }
  2304.  
  2305.         if (Ca_intervals.size() > 0)
  2306.             Bursts_Freq /= Ca_intervals.size();
  2307.  
  2308.         fclose(fp0);
  2309.     }
  2310.  
  2311.     if (write_file)
  2312.     {
  2313.         //fclose(fp_res);
  2314.         fclose(fp_I_stim);
  2315.         ///fclose(fp_I_syn);
  2316.         fclose(fp_Ca);
  2317.         //fclose(fp_IP3);
  2318.         //fclose(fp_z);
  2319.         fclose(fp_V);
  2320.         //fclose(fp_m);
  2321.         //fclose(fp_n);
  2322.         //fclose(fp_h);
  2323.         //fclose(fp_G_P);
  2324.         fclose(fp_V_P);
  2325.         //fclose(fp_m_P);
  2326.         //fclose(fp_n_P);
  2327.         //fclose(fp_h_P);
  2328.  
  2329.         fclose(fp_V_spikes);
  2330.     }
  2331.  
  2332.     double extime_rk4 = 0;
  2333.  
  2334.     if (omp_enable)
  2335.     {
  2336.         omp_end_rk4 = omp_get_wtime();
  2337.         extime_rk4 = (double)(omp_end_rk4 - omp_start_rk4);// / CLOCKS_PER_SEC;
  2338.     }
  2339.     else
  2340.     {
  2341.         end_rk4 = clock();
  2342.         extime_rk4 = (double)(end_rk4 - start_rk4);// / CLOCKS_PER_SEC;
  2343.     }
  2344.  
  2345.     int minutes = (int)extime_rk4 / 60;
  2346.     int seconds = (int)extime_rk4 % 60;
  2347.     printf("\nExecution time is: %d minutes %d seconds\n ", minutes, seconds);
  2348.  
  2349.     /*int nth;
  2350.     #pragma omp parallel
  2351.     {
  2352.         #pragma omp master
  2353.         nth = omp_get_num_threads();
  2354.     }*/
  2355.  
  2356.     fp0 = fopen("time_exec.txt", "a");
  2357.     //fprintf(fp0, "%d %lf\n", nth, extime_rk4);
  2358.     fprintf(fp0, "%lf\n", extime_rk4);
  2359.     fclose(fp0);
  2360.  
  2361.     /*fp0 = fopen("results_Poisson_Freq_g_syn_k_syn.txt", "a");
  2362.     fprintf(fp0, "%f\t%f\t%f\t%f\t%f\n", Poisson_Freq, g_syn, k_syn_local_min_mean, corr_aver_mean_not_zero, k_syn_local_max_mean);
  2363.     fclose(fp0);*/
  2364.  
  2365.     fp0 = fopen("results_Poisson_Freq_g_syn_Bursts_Freq.txt", "a");
  2366.     fprintf(fp0, "%f\t%f\t%f\t%f\t%f\t%f\t%f\n", Poisson_Freq, g_astro, g_syn, g_syn_P,  corr_aver_mean_not_zero, V_mean_mean_Freq, Bursts_Freq);
  2367.     fclose(fp0);
  2368.  
  2369.     return 0;
  2370.  
  2371.     for (int i = 0; i < Node_count; i++)
  2372.         delete[] A_A[i];
  2373.  
  2374.     delete[] A_A;
  2375.  
  2376.     for (int i = 0; i < Node_count; i++)
  2377.         delete[] B_A[i];
  2378.  
  2379.     delete[] B_A;
  2380.  
  2381.     delete[] C_A;
  2382.  
  2383.     for (int i = 0; i < Node_count; i++)
  2384.         delete[] A_N[i];
  2385.  
  2386.     delete[] A_N;
  2387.  
  2388.     for (int i = 0; i < Node_count; i++)
  2389.         delete[] B_N[i];
  2390.  
  2391.     delete[] B_N;
  2392.  
  2393.     delete[] C_N;
  2394.  
  2395.     delete[] A_N_P;
  2396.  
  2397.     for (int i = 0; i < Node_count; i++)
  2398.         delete[] B_N_P[i];
  2399.  
  2400.     delete[] B_N_P;
  2401.  
  2402.     delete[] C_N_P;
  2403.  
  2404.     delete[] f;
  2405.     delete[] f_diff;
  2406.     delete[] v_4;
  2407.     delete[] E_syn;
  2408.     delete[] I_app;
  2409.     delete[] V_spikes;
  2410.     delete[] V_spikes_Freq;
  2411.  
  2412.     delete[] Meander_start_from_zero;
  2413.     delete[] Meander_width;
  2414.     delete[] Meander_height;
  2415.     delete[] Meander_interval;
  2416.     delete[] last_meander_end;
  2417.     delete[] V_freq_sync_time;
  2418.  
  2419.     for (int i = 0; i < Node_count; i++)
  2420.         delete[] tau[i];
  2421.  
  2422.     delete[] tau;
  2423.  
  2424.     for (int i = 0; i < Node_count; i++)
  2425.         delete[] V_old_array[i];
  2426.  
  2427.     delete[] V_old_array;
  2428.  
  2429.     for (int i = 0; i < Equations_count; i++)
  2430.         delete[] k[i];
  2431.  
  2432.     delete[] k;
  2433.  
  2434.     delete[] phi_k1;
  2435.     delete[] phi_k2;
  2436.     delete[] phi_k3;
  2437. }
  2438.  
Advertisement
Add Comment
Please, Sign In to add comment