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