Advertisement
kestutisma

mc36smLib.cpp

Apr 10th, 2019
332
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.18 KB | None | 0 0
  1. #include "GjLib.hpp"
  2. #include <math.h>
  3.  
  4. using namespace std;
  5.  
  6. int add(int a, int b)
  7. {
  8.     return (a + b);
  9. }
  10.  
  11. double MC36SM_Mindaugo_SS(double vj, double *par, double *p, double Pt, double pc1c2, double pc2c1)
  12. {
  13.     double *A = par;
  14.     double *v0 = par + 1 * 4;
  15.     double *Go = par + 2 * 4;
  16.     double *Gc = par + 3 * 4;
  17.     double *Ro = par + 4 * 4;
  18.     double *Rc = par + 5 * 4;
  19.     double *P = par + 6 * 4;
  20.  
  21.     double g[36][4] = {};// initialize to 0
  22.     double v[36][4] = {};
  23.     double k[36][4] = {};
  24.     double R[36][4] = {};
  25.  
  26.     //states conductances
  27.     for (int i1 = 0; i1 < 2; i1++)
  28.         for (int i2 = 0; i2 < 3; i2++)
  29.             for (int i3 = 0; i3 < 3; i3++)
  30.                 for (int i4 = 0; i4 < 2; i4++)
  31.                 {
  32.                     if (i1 == 0)
  33.                     {
  34.                         g[i1 * 18 + i2 * 6 + i3 * 2 + i4 * 1][0] = Go[0];
  35.                         R[i1 * 18 + i2 * 6 + i3 * 2 + i4 * 1][0] = Ro[0];
  36.                     }
  37.                     else
  38.                     {
  39.                         g[i1 * 18 + i2 * 6 + i3 * 2 + i4 * 1][0] = Gc[0];
  40.                         R[i1 * 18 + i2 * 6 + i3 * 2 + i4 * 1][0] = Rc[0];
  41.                     }
  42.                     if (i2 == 0)
  43.                     {
  44.                         g[i1 * 18 + i2 * 6 + i3 * 2 + i4 * 1][1] = Go[1];
  45.                         R[i1 * 18 + i2 * 6 + i3 * 2 + i4 * 1][1] = Ro[1];
  46.                     }
  47.                     else
  48.                     {
  49.                         g[i1 * 18 + i2 * 6 + i3 * 2 + i4 * 1][1] = Gc[1];
  50.                         R[i1 * 18 + i2 * 6 + i3 * 2 + i4 * 1][1] = Rc[1];
  51.                     }
  52.                     if (i3 == 0)
  53.                     {
  54.                         g[i1 * 18 + i2 * 6 + i3 * 2 + i4 * 1][2] = Go[2];
  55.                         R[i1 * 18 + i2 * 6 + i3 * 2 + i4 * 1][2] = Ro[2];
  56.                     }
  57.                     else
  58.                     {
  59.                         g[i1 * 18 + i2 * 6 + i3 * 2 + i4 * 1][2] = Gc[2];
  60.                         R[i1 * 18 + i2 * 6 + i3 * 2 + i4 * 1][2] = Rc[2];
  61.                     }
  62.                     if (i4 == 0)
  63.                     {
  64.                         g[i1 * 18 + i2 * 6 + i3 * 2 + i4 * 1][3] = Go[3];
  65.                         R[i1 * 18 + i2 * 6 + i3 * 2 + i4 * 1][3] = Ro[3];
  66.                     }
  67.                     else
  68.                     {
  69.                         g[i1 * 18 + i2 * 6 + i3 * 2 + i4 * 1][3] = Gc[3];
  70.                         R[i1 * 18 + i2 * 6 + i3 * 2 + i4 * 1][3] = Rc[3];
  71.                     }
  72.  
  73.                 }
  74.  
  75.     double h[36][4] = {};
  76.     for (int i = 0; i < 4; i++)     for (int j = 0; j < 36; j++)        h[j][i] = g[j][i];
  77.  
  78.     for (int a = 0; a < 4; a++) // voltages and rectification
  79.     {
  80.         double gg[36] = {};
  81.         for (int i = 0; i < 36; i++)        //gg = 1. / sum(1. / g, 2); %sums rows
  82.         {
  83.             for (int j = 0; j < 4; j++)
  84.                 gg[i] += 1 / g[i][j];
  85.             gg[i] = 1 / gg[i];
  86.         }
  87.         for (int i = 0; i < 4; i++) //v=vj*[gg gg gg gg]./g;
  88.             for (int j = 0; j < 36; j++)
  89.                 v[j][i] = vj * gg[j] / g[j][i];
  90.         for (int i = 0; i < 4; i++) //g=g.*exp(v./R);
  91.             for (int j = 0; j < 36; j++)
  92.                 g[j][i] = h[j][i] * exp(v[j][i] / R[j][i]);
  93.     }
  94.  
  95.     for (int i = 0; i < 36; i++) //k=exp(repmat(A,16,1).*(v.*repmat(P,16,1)-repmat(v0,16,1)));
  96.         for (int j = 0; j < 4; j++)
  97.             k[i][j] = exp(A[j] * (v[i][j] * P[j] - v0[j]));
  98.  
  99.     double K = Pt;
  100.     double PPP[36][36] = {};
  101.     //------------Matrica P-------------------------------------------------
  102.     double l = pc1c2 / pc2c1;
  103.     double p1, p2, p3, p4;
  104.     for (int i1 = 0; i1 < 2; i1++)
  105.         for (int i2 = 0; i2 < 3; i2++)
  106.             for (int i3 = 0; i3 < 3; i3++)
  107.                 for (int i4 = 0; i4 < 2; i4++)
  108.                     for (int j1 = 0; j1 < 2; j1++)
  109.                         for (int j2 = 0; j2 < 3; j2++)
  110.                             for (int j3 = 0; j3 < 3; j3++)
  111.                                 for (int j4 = 0; j4 < 2; j4++)
  112.                                 {
  113.                                     int i = i1 * 18 + i2 * 6 + i3 * 2 + i4 * 1;
  114.                                     int j = j1 * 18 + j2 * 6 + j3 * 2 + j4 * 1;
  115.                                     ////////////// p1
  116.                                     if (i1 == 0)
  117.                                     {
  118.                                         if (j1 == 0)
  119.                                             p1 = (1 - K * k[i][0] / (1 + k[i][0]));
  120.                                         else
  121.                                             p1 = K * k[i][0] / (1 + k[i][0]);
  122.                                     }
  123.                                     else
  124.                                     {
  125.                                         if (j1 == 1)
  126.                                             p1 = (1 - K / (1 + k[i][0]));
  127.                                         else
  128.                                             p1 = K / (1 + k[i][0]);
  129.                                     }
  130.                                     ///////////////p2
  131.                                     if (i2 == 0)
  132.                                     {
  133.                                         if (j2 == 0)
  134.                                             p2 = (1 - K * k[i][1] / (1 + k[i][1]));
  135.                                         if (j2 == 1)
  136.                                             p2 = K * k[i][1] / (1 + k[i][1]);
  137.                                         if (j2 == 2)
  138.                                             p2 = 0;
  139.                                     }
  140.                                     else if (i2 == 1)
  141.                                     {
  142.                                         if (j2 == 0)
  143.                                             p2 = (K / (1 + k[i][1]))*(1 - pc1c2);
  144.                                         if (j2 == 1)
  145.                                             p2 = (1 - K / (1 + k[i][1]))*(1 - pc1c2);
  146.                                         if (j2 == 2)
  147.                                             p2 = pc1c2;
  148.                                     }
  149.                                     else if (i2 == 2)
  150.                                     {
  151.                                         if (j2 == 0)
  152.                                             p2 = 0;
  153.                                         if (j2 == 1)
  154.                                             p2 = pc2c1;
  155.                                         if (j2 == 2)
  156.                                             p2 = 1 - pc2c1;
  157.                                     }
  158.                                     ////////////////p3
  159.                                     if (i3 == 0)
  160.                                     {
  161.                                         if (j3 == 0)
  162.                                             p3 = (1 - K * k[i][2] / (1 + k[i][2]));
  163.                                         if (j3 == 1)
  164.                                             p3 = K * k[i][2] / (1 + k[i][2]);
  165.                                         if (j3 == 2)
  166.                                             p3 = 0;
  167.                                     }
  168.                                     else if (i3 == 1)
  169.                                     {
  170.                                         if (j3 == 0) //c1->o
  171.                                             p3 = (K / (1 + k[i][2]))*(1 - pc1c2);
  172.                                         if (j3 == 1)
  173.                                             p3 = (1 - K / (1 + k[i][2]))*(1 - pc1c2);
  174.                                         if (j3 == 2)
  175.                                             p3 = pc1c2;
  176.                                     }
  177.                                     else if (i3 == 2)
  178.                                     {
  179.                                         if (j3 == 0)
  180.                                             p3 = 0;
  181.                                         if (j3 == 1)
  182.                                             p3 = pc2c1;
  183.                                         if (j3 == 2)
  184.                                             p3 = 1 - pc2c1;
  185.                                     }
  186.                                     /////////////////p4
  187.                                     if (i4 == 0)
  188.                                     {
  189.                                         if (j4 == 0)
  190.                                             p4 = (1 - K * k[i][3] / (1 + k[i][3]));
  191.                                         else
  192.                                             p4 = K * k[i][3] / (1 + k[i][3]);
  193.                                     }
  194.                                     else
  195.                                     {
  196.                                         if (j4 == 1)
  197.                                             p4 = (1 - K / (1 + k[i][3]));
  198.                                         else
  199.                                             p4 = K / (1 + k[i][3]);
  200.                                     }
  201.                                     PPP[i][j] = p1 * p2*p3*p4;
  202.                                 }
  203.  
  204.     // -------------- SS skaiciavimas
  205.     double d_g = 100000;
  206.     double g_old = 100000;
  207.     double g_final = 0;
  208.     int i = 0;
  209.     while (d_g / (g_old + g_final) > .001e-5)
  210.     {
  211.         i++;
  212.         double q[36] = {};
  213.         for (int j = 0; j < 36; j++) for (int i = 0; i < 36; i++)    q[j] += p[i] * PPP[i][j]; // q=p*PPP;
  214.         double ggg[36] = {};
  215.         for (int i = 0; i < 36; i++)        //ggg = 1. / sum(1. / g, 2); %sums rows
  216.         {
  217.             for (int j = 0; j < 4; j++) ggg[i] += 1 / g[i][j];
  218.             ggg[i] = 1 / ggg[i];
  219.         }
  220.  
  221.         g_final = 0;
  222.         for (int j = 0; j < 36; j++) //g_final = q*ggg';
  223.             g_final += q[j] * ggg[j];
  224.  
  225.         for (int i = 0; i < 36; i++)    p[i] = q[i]; //grazina p
  226.  
  227.         d_g = fabs(g_old - g_final);
  228.         g_old = g_final;
  229.     }
  230.     return g_final;
  231. }
  232.  
  233. // Returns gj
  234. double* MC36SM_Mindaugo_SS_t(int n, double *vj, double *par, double *p, double Pt, double pc1c2, double pc2c1) {
  235.  
  236. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement