MoDeNa  1.0
Software framework facilitating sequential multi-scale modelling
HankelHadamard.h
Go to the documentation of this file.
1 
12 int HankelHadamard(const double *m, int nNodes);
13 
14 int HankelHadamard(const double *m, int nNodes)
15 {
16  int realizable = 0;
17 
18  if (nNodes == 2)
19  {
20  double** HH01 = new double*[nNodes];
21  double** HH11 = new double*[nNodes];
22 
23  for(int i = 0; i < nNodes; ++i)
24  {
25  HH01[i] = new double[nNodes];
26  HH11[i] = new double[nNodes];
27  }
28  HH01[0][0]=m[0];
29  HH01[0][1]=m[1];
30  HH01[1][0]=m[1];
31  HH01[1][1]=m[2];
32 
33  HH11[0][0]=m[1];
34  HH11[0][1]=m[2];
35  HH11[1][0]=m[2];
36  HH11[1][1]=m[3];
37  cout << endl;
38  cout << "HH01 determinant: " << determinant(HH01, nNodes) << endl;
39  cout << "HH11 determinant: " << determinant(HH11, nNodes) << endl;
40  if (determinant(HH01, nNodes) < 0.0 || determinant(HH11, nNodes) < 0.0)
41  {
42  realizable = 1;
43  }
44  }
45 
46  if (nNodes == 3)
47  {
48  int twoNodes = nNodes - 1;
49  double** HH01 = new double*[twoNodes];
50  double** HH11 = new double*[twoNodes];
51  for(int i = 0; i < twoNodes; ++i)
52  {
53  HH01[i] = new double[twoNodes];
54  HH11[i] = new double[twoNodes];
55  }
56 
57  double** HH02 = new double*[nNodes];
58  double** HH12 = new double*[nNodes];
59  for(int i = 0; i < nNodes; ++i)
60  {
61  HH02[i] = new double[nNodes];
62  HH12[i] = new double[nNodes];
63  }
64 
65  HH01[0][0]=m[0];
66  HH01[0][1]=m[1];
67  HH01[1][0]=m[1];
68  HH01[1][1]=m[2];
69 
70  HH11[0][0]=m[1];
71  HH11[0][1]=m[2];
72  HH11[1][0]=m[2];
73  HH11[1][1]=m[3];
74 
75  HH02[0][0]=m[0];
76  HH02[0][1]=m[1];
77  HH02[0][2]=m[2];
78  HH02[1][0]=m[1];
79  HH02[1][1]=m[2];
80  HH02[1][2]=m[3];
81  HH02[2][0]=m[2];
82  HH02[2][1]=m[3];
83  HH02[2][2]=m[4];
84 
85  HH12[0][0]=m[1];
86  HH12[0][1]=m[2];
87  HH12[0][2]=m[3];
88  HH12[1][0]=m[2];
89  HH12[1][1]=m[3];
90  HH12[1][2]=m[4];
91  HH12[2][0]=m[3];
92  HH12[2][1]=m[4];
93  HH12[2][2]=m[5];
94  cout << endl;
95  cout << "HH01 determinant: " << determinant(HH01, twoNodes) << endl;
96  cout << "HH11 determinant: " << determinant(HH11, twoNodes) << endl;
97  cout << "HH02 determinant: " << determinant(HH02, nNodes) << endl;
98  cout << "HH12 determinant: " << determinant(HH12, nNodes) << endl;
99 
100  if (determinant(HH01, twoNodes) < 0.0 || determinant(HH11, twoNodes) < 0.0 || determinant(HH02, nNodes) < 0.0 || determinant(HH12, nNodes) < 0.0)
101  {
102  realizable = 1;
103  }
104  }
105 
106  if (nNodes == 4)
107  {
108  int twoNodes = nNodes - 2;
109  int threeNodes = nNodes - 1;
110 
111  double** HH01 = new double*[twoNodes];
112  double** HH11 = new double*[twoNodes];
113  for(int i = 0; i < twoNodes; ++i)
114  {
115  HH01[i] = new double[twoNodes];
116  HH11[i] = new double[twoNodes];
117  }
118 
119  double** HH02 = new double*[threeNodes];
120  double** HH12 = new double*[threeNodes];
121  for(int i = 0; i < threeNodes; ++i)
122  {
123  HH02[i] = new double[threeNodes];
124  HH12[i] = new double[threeNodes];
125  }
126 
127  double** HH03 = new double*[nNodes];
128  double** HH13 = new double*[nNodes];
129  for(int i = 0; i < nNodes; ++i)
130  {
131  HH03[i] = new double[nNodes];
132  HH13[i] = new double[nNodes];
133  }
134 
135  HH01[0][0]=m[0];
136  HH01[0][1]=m[1];
137  HH01[1][0]=m[1];
138  HH01[1][1]=m[2];
139 
140  HH11[0][0]=m[1];
141  HH11[0][1]=m[2];
142  HH11[1][0]=m[2];
143  HH11[1][1]=m[3];
144 
145  HH02[0][0]=m[0];
146  HH02[0][1]=m[1];
147  HH02[0][2]=m[2];
148  HH02[1][0]=m[1];
149  HH02[1][1]=m[2];
150  HH02[1][2]=m[3];
151  HH02[2][0]=m[2];
152  HH02[2][1]=m[3];
153  HH02[2][2]=m[4];
154 
155  HH12[0][0]=m[1];
156  HH12[0][1]=m[2];
157  HH12[0][2]=m[3];
158  HH12[1][0]=m[2];
159  HH12[1][1]=m[3];
160  HH12[1][2]=m[4];
161  HH12[2][0]=m[3];
162  HH12[2][1]=m[4];
163  HH12[2][2]=m[5];
164 
165  HH03[0][0]=m[0];
166  HH03[0][1]=m[1];
167  HH03[0][2]=m[2];
168  HH03[0][3]=m[3];
169  HH03[1][0]=m[1];
170  HH03[1][1]=m[2];
171  HH03[1][2]=m[3];
172  HH03[1][3]=m[4];
173  HH03[2][0]=m[2];
174  HH03[2][1]=m[3];
175  HH03[2][2]=m[4];
176  HH03[2][3]=m[5];
177  HH03[3][0]=m[3];
178  HH03[3][1]=m[4];
179  HH03[3][2]=m[5];
180  HH03[3][3]=m[6];
181 
182  HH13[0][0]=m[1];
183  HH13[0][1]=m[2];
184  HH13[0][2]=m[3];
185  HH13[0][3]=m[4];
186  HH13[1][0]=m[2];
187  HH13[1][1]=m[3];
188  HH13[1][2]=m[4];
189  HH13[1][3]=m[5];
190  HH13[2][0]=m[3];
191  HH13[2][1]=m[4];
192  HH13[2][2]=m[5];
193  HH13[2][3]=m[6];
194  HH13[3][0]=m[4];
195  HH13[3][1]=m[5];
196  HH13[3][2]=m[6];
197  HH13[3][3]=m[7];
198  cout << endl;
199  cout << "HH01 determinant: " << determinant(HH01, twoNodes) << endl;
200  cout << "HH11 determinant: " << determinant(HH11, twoNodes) << endl;
201  cout << "HH02 determinant: " << determinant(HH02, threeNodes) << endl;
202  cout << "HH12 determinant: " << determinant(HH12, threeNodes) << endl;
203  cout << "HH03 determinant: " << determinant(HH03, nNodes) << endl;
204  cout << "HH13 determinant: " << determinant(HH13, nNodes) << endl;
205 
206  if ( determinant(HH01, twoNodes) < 0.0 || determinant(HH11, twoNodes) < 0.0 || determinant(HH02, threeNodes) < 0.0 || determinant(HH12, threeNodes) < 0.0 || determinant(HH03, nNodes) < 0.0 || determinant(HH13, nNodes) < 0.0 )
207  {
208  realizable = 1;
209  }
210  }
211  return realizable;
212 }
double determinant(double **in_matrix, int n)
Definition: determinant.h:12
int HankelHadamard(const double *m, int nNodes)
Hankel-Hadamard function.
m
Bubble Growth Application Recipe.
Definition: bubbleGrowth.py:59