MoDeNa  1.0
Software framework facilitating sequential multi-scale modelling
pda.h
Go to the documentation of this file.
1 
11 void PDA(double *, double *, double *, int &);
12 
13 void PDA(double *we, double *vi, double *mom, int &n)
14 {
15 
16 // Construct P Matrix
17  int i,j;
18 
19  double p[2*n+1][2*n+1];
20 
21  for(i=0;i<2*n+1;i++)
22  {
23  for(j=0;j<2*n+1;j++)
24  {
25  p[i][j] = 0.0;
26  }
27  }
28 
29  double norm_mom[2*n];
30 
31 // Normalize the moments
32  for(i=0;i<2*n;i++)
33  {
34  norm_mom[i] = mom[i]/(fmax(mom[0],1.0e-10));
35  }
36 // First column of P matrix
37  p[0][0] = 1.0;
38  p[0][1] = 1.0;
39 // Second column of P matrix
40  for(i=1;i<2*n;i++)
41  {
42  p[i][1] = pow(-1,double (i))*norm_mom[i];
43  }
44 
45 // Recursion method for calculation of P
46  for(j=2;j<2*n+1;j++)
47  {
48  for(i=0;i<2*n+2-j;i++)
49  {
50  p[i][j] = p[0][j-1]*p[i+1][j-2] - p[0][j-2]*p[i+1][j-1];
51  }
52  }
53 
54 // Computing zeta
55  double zeta[2*n];
56  for(i=0;i<2*n;i++)
57  {
58  zeta[i] = 0.0;
59  }
60 
61  for(i=1;i<2*n;i++)
62  {
63  if(p[0][i]*p[0][i-1]>0)
64  {
65  zeta[i] = p[0][i+1]/(p[0][i]*p[0][i-1]);
66  }
67  else
68  {
69  zeta[i] = 0.0;
70  }
71  }
72 
73 // Coefficients of Jacobi matrix
74  double aa[n];
75  double bb[n-1], cc[n-1];
76 
77  for(i=0;i<n-1;i++)
78  {
79  bb[i] = cc[i] = 0.0;
80  }
81 
82  for(i=1;i<=n;i++)
83  {
84  aa[i-1]=zeta[2*i-1]+zeta[2*i-2];
85  }
86 
87  for(i=1;i<=n-1;i++)
88  {
89  bb[i-1]=zeta[2*i]*zeta[2*i-1];
90  }
91 
92  for(i=1;i<=n-1;i++)
93  {
94  cc[i-1]= sqrt(fabs(bb[i-1]));
95  }
96 
97 // Eigenvalues and Eigenvectors of Jacobi matrix
98  double evec[n][n];
99  for(i=0;i<n;i++)
100  {
101  for(j=0;j<n;j++)
102  {
103  evec[i][j] = 0.0;
104  }
105  }
106 
107 
108  double work[2*n-2];
109  int info;
110  char choice='I';
111 
112  dsteqr_(choice,&n,aa,cc,&evec[0][0],&n,work,&info);
113 
114  for(i=0;i<n;i++)
115  {
116  vi[i]=aa[i];
117 
118  if(vi[i] < 0.0)
119  {
120  vi[i] = 0.0;
121  }
122  }
123 
124  for(j=0;j<n;j++)
125  {
126  we[j]=mom[0]*pow(evec[j][0],2);
127 
128  if(we[j] < 0)
129  {
130  we[j] = 0.0;
131  }
132  }
133 } // End of PDA
void PDA(double *, double *, double *, int &)
Definition: pda.h:13