proteus  1.8.1
C/C++/Fortran libraries
femIntegrals.c
Go to the documentation of this file.
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <math.h>
4 #include <string.h>
5 #include <strings.h>
6 #include <assert.h>
7 #include "femIntegrals.h"
8 #include PROTEUS_LAPACK_H
9 
20 void copyLeftElementBoundaryInfo(int nElementBoundaries_element,
21  int nElementBoundaryQuadraturePoints_elementBoundary,
22  int nSpace_global,
23  int nExteriorElementBoundaries_global,
24  int nInteriorElementBoundaries_global,
25  int* elementBoundaryElementsArray,
26  int* elementBoundaryLocalElementBoundariesArray,
27  int* exteriorElementBoundariesArray,
28  int* interiorElementBoundariesArray,
29  double* x,
30  double* n,
31  double* xg,
32  double* ng)
33 {
34  int ebNE,ebNI,ebN,k,left_eN_global,left_ebN_element,right_eN_global,right_ebN_element,I;
35  for (ebNE=0;ebNE<nExteriorElementBoundaries_global;ebNE++)
36  {
37  ebN = exteriorElementBoundariesArray[ebNE];
38  left_eN_global = elementBoundaryElementsArray[ebN*2+0];
39  left_ebN_element = elementBoundaryLocalElementBoundariesArray[ebN*2+0];
40  for (k=0;k<nElementBoundaryQuadraturePoints_elementBoundary;k++)
41  for (I=0;I<nSpace_global;I++)
42  {
43  xg[ebN*nElementBoundaryQuadraturePoints_elementBoundary*3+
44  k*3+
45  I] =
46  x[left_eN_global*nElementBoundaries_element*nElementBoundaryQuadraturePoints_elementBoundary*3+
47  left_ebN_element*nElementBoundaryQuadraturePoints_elementBoundary*3+
48  k*3+
49  I];
50  ng[ebN*nElementBoundaryQuadraturePoints_elementBoundary*nSpace_global+
51  k*nSpace_global+
52  I] =
53  n[left_eN_global*nElementBoundaries_element*nElementBoundaryQuadraturePoints_elementBoundary*nSpace_global+
54  left_ebN_element*nElementBoundaryQuadraturePoints_elementBoundary*nSpace_global+
55  k*nSpace_global+
56  I];
57  }
58  }
59  for (ebNI=0;ebNI<nInteriorElementBoundaries_global;ebNI++)
60  {
61  ebN = interiorElementBoundariesArray[ebNI];
62  left_eN_global = elementBoundaryElementsArray[ebN*2+0];
63  left_ebN_element = elementBoundaryLocalElementBoundariesArray[ebN*2+0];
64  right_eN_global = elementBoundaryElementsArray[ebN*2+1];
65  right_ebN_element = elementBoundaryLocalElementBoundariesArray[ebN*2+1];
66  for (k=0;k<nElementBoundaryQuadraturePoints_elementBoundary;k++)
67  for (I=0;I<nSpace_global;I++)
68  {
69  xg[ebN*nElementBoundaryQuadraturePoints_elementBoundary*3+
70  k*3+
71  I] =
72  x[left_eN_global*nElementBoundaries_element*nElementBoundaryQuadraturePoints_elementBoundary*3+
73  left_ebN_element*nElementBoundaryQuadraturePoints_elementBoundary*3+
74  k*3+
75  I];
76  ng[ebN*nElementBoundaryQuadraturePoints_elementBoundary*nSpace_global+
77  k*nSpace_global+
78  I] =
79  n[left_eN_global*nElementBoundaries_element*nElementBoundaryQuadraturePoints_elementBoundary*nSpace_global+
80  left_ebN_element*nElementBoundaryQuadraturePoints_elementBoundary*nSpace_global+
81  k*nSpace_global+
82  I];
83  x[right_eN_global*nElementBoundaries_element*nElementBoundaryQuadraturePoints_elementBoundary*3+
84  right_ebN_element*nElementBoundaryQuadraturePoints_elementBoundary*3+
85  k*3+
86  I]=
87  x[left_eN_global*nElementBoundaries_element*nElementBoundaryQuadraturePoints_elementBoundary*3+
88  left_ebN_element*nElementBoundaryQuadraturePoints_elementBoundary*3+
89  k*3+
90  I];
91  n[right_eN_global*nElementBoundaries_element*nElementBoundaryQuadraturePoints_elementBoundary*nSpace_global+
92  right_ebN_element*nElementBoundaryQuadraturePoints_elementBoundary*nSpace_global+
93  k*nSpace_global+
94  I]=
95  -n[left_eN_global*nElementBoundaries_element*nElementBoundaryQuadraturePoints_elementBoundary*nSpace_global+
96  left_ebN_element*nElementBoundaryQuadraturePoints_elementBoundary*nSpace_global+
97  k*nSpace_global+
98  I];
99  }
100  }
101 }
102 
103 void copyGlobalElementBoundaryInfo(int nElementBoundaries_element,
104  int nElementBoundaryQuadraturePoints_elementBoundary,
105  int nSpace_global,
106  int nExteriorElementBoundaries_global,
107  int nInteriorElementBoundaries_global,
108  int* elementBoundaryElementsArray,
109  int* elementBoundaryLocalElementBoundariesArray,
110  int* exteriorElementBoundariesArray,
111  int* interiorElementBoundariesArray,
112  double* x,
113  double* n,
114  double* ebqe_x,
115  double* ebqe_n,
116  double* xg,
117  double* ng)
118 {
119  int ebNE,ebNI,ebN,k,left_eN_global,left_ebN_element,right_eN_global,right_ebN_element,I,J;
120  double dot,sign;
121  for (ebNE=0;ebNE<nExteriorElementBoundaries_global;ebNE++)
122  {
123  ebN = exteriorElementBoundariesArray[ebNE];
124  left_eN_global = elementBoundaryElementsArray[ebN*2+0];
125  left_ebN_element = elementBoundaryLocalElementBoundariesArray[ebN*2+0];
126  for (k=0;k<nElementBoundaryQuadraturePoints_elementBoundary;k++)
127  {
128  dot=0.0;
129  for (J=0;J<nSpace_global;J++)
130  dot+= ebqe_n[ebNE*nElementBoundaryQuadraturePoints_elementBoundary*nSpace_global+
131  k*nSpace_global+
132  J]*
133  ng[ebN*nElementBoundaryQuadraturePoints_elementBoundary*nSpace_global+
134  k*nSpace_global+
135  J];
136  if(dot < 0.0)
137  sign=-1.0;
138  else
139  sign=1.0;
140 
141  for (I=0;I<nSpace_global;I++)
142  {
143  x[left_eN_global*nElementBoundaries_element*nElementBoundaryQuadraturePoints_elementBoundary*3+
144  left_ebN_element*nElementBoundaryQuadraturePoints_elementBoundary*3+
145  k*3+
146  I] = xg[ebN*nElementBoundaryQuadraturePoints_elementBoundary*3+
147  k*3+
148  I];
149  n[left_eN_global*nElementBoundaries_element*nElementBoundaryQuadraturePoints_elementBoundary*nSpace_global+
150  left_ebN_element*nElementBoundaryQuadraturePoints_elementBoundary*nSpace_global+
151  k*nSpace_global+
152  I] =
153  ng[ebN*nElementBoundaryQuadraturePoints_elementBoundary*nSpace_global+
154  k*nSpace_global+
155  I];
156  ebqe_x[ebNE*nElementBoundaryQuadraturePoints_elementBoundary*3+
157  k*3+
158  I] = xg[ebN*nElementBoundaryQuadraturePoints_elementBoundary*3+
159  k*3+
160  I];
161  ebqe_n[ebNE*nElementBoundaryQuadraturePoints_elementBoundary*nSpace_global+
162  k*nSpace_global+
163  I]=
164  sign*ng[ebN*nElementBoundaryQuadraturePoints_elementBoundary*nSpace_global+
165  k*nSpace_global+
166  I];
167  }
168  }
169  }
170  for (ebNI=0;ebNI<nInteriorElementBoundaries_global;ebNI++)
171  {
172  ebN = interiorElementBoundariesArray[ebNI];
173  left_eN_global = elementBoundaryElementsArray[ebN*2+0];
174  left_ebN_element = elementBoundaryLocalElementBoundariesArray[ebN*2+0];
175  right_eN_global = elementBoundaryElementsArray[ebN*2+1];
176  right_ebN_element = elementBoundaryLocalElementBoundariesArray[ebN*2+1];
177  for (k=0;k<nElementBoundaryQuadraturePoints_elementBoundary;k++)
178  for (I=0;I<nSpace_global;I++)
179  {
180  x[left_eN_global*nElementBoundaries_element*nElementBoundaryQuadraturePoints_elementBoundary*3+
181  left_ebN_element*nElementBoundaryQuadraturePoints_elementBoundary*3+
182  k*3+
183  I] = xg[ebN*nElementBoundaryQuadraturePoints_elementBoundary*3+
184  k*3+
185  I];
186  n[left_eN_global*nElementBoundaries_element*nElementBoundaryQuadraturePoints_elementBoundary*nSpace_global+
187  left_ebN_element*nElementBoundaryQuadraturePoints_elementBoundary*nSpace_global+
188  k*nSpace_global+
189  I] = ng[ebN*nElementBoundaryQuadraturePoints_elementBoundary*nSpace_global+
190  k*nSpace_global+
191  I];
192  x[right_eN_global*nElementBoundaries_element*nElementBoundaryQuadraturePoints_elementBoundary*3+
193  right_ebN_element*nElementBoundaryQuadraturePoints_elementBoundary*3+
194  k*3+
195  I] = xg[ebN*nElementBoundaryQuadraturePoints_elementBoundary*3+
196  k*3+
197  I];
198  n[right_eN_global*nElementBoundaries_element*nElementBoundaryQuadraturePoints_elementBoundary*nSpace_global+
199  right_ebN_element*nElementBoundaryQuadraturePoints_elementBoundary*nSpace_global+
200  k*nSpace_global+
201  I] = -ng[ebN*nElementBoundaryQuadraturePoints_elementBoundary*nSpace_global+
202  k*nSpace_global+
203  I];
204  }
205  }
206 }
207 
208 void copyLeftElementBoundaryInfo_movingDomain(int nElementBoundaries_element,
209  int nElementBoundaryQuadraturePoints_elementBoundary,
210  int nExteriorElementBoundaries_global,
211  int nInteriorElementBoundaries_global,
212  int* elementBoundaryElementsArray,
213  int* elementBoundaryLocalElementBoundariesArray,
214  int* exteriorElementBoundariesArray,
215  int* interiorElementBoundariesArray,
216  double* xt)
217 {
218  int ebNI,ebN,k,left_eN_global,left_ebN_element,right_eN_global,right_ebN_element,I;
219  for (ebNI=0;ebNI<nInteriorElementBoundaries_global;ebNI++)
220  {
221  ebN = interiorElementBoundariesArray[ebNI];
222  left_eN_global = elementBoundaryElementsArray[ebN*2+0];
223  left_ebN_element = elementBoundaryLocalElementBoundariesArray[ebN*2+0];
224  right_eN_global = elementBoundaryElementsArray[ebN*2+1];
225  right_ebN_element = elementBoundaryLocalElementBoundariesArray[ebN*2+1];
226  for (k=0;k<nElementBoundaryQuadraturePoints_elementBoundary;k++)
227  for (I=0;I<3;I++)
228  {
229  xt[right_eN_global*nElementBoundaries_element*nElementBoundaryQuadraturePoints_elementBoundary*3+
230  right_ebN_element*nElementBoundaryQuadraturePoints_elementBoundary*3+
231  k*3+
232  I]=
233  xt[left_eN_global*nElementBoundaries_element*nElementBoundaryQuadraturePoints_elementBoundary*3+
234  left_ebN_element*nElementBoundaryQuadraturePoints_elementBoundary*3+
235  k*3+
236  I];
237  }
238  }
239 }
240 
241 void parametricFiniteElementSpace_getValues(int nElements_global,
242  int nQuadraturePoints_element,
243  int nDOF_element,
244  double* psi,
245  double* vArray)
246 {
247  int eN,k,j;
248  for(eN=0;eN<nElements_global;eN++)
249  for(k=0;k<nQuadraturePoints_element;k++)
250  for(j=0;j<nDOF_element;j++)
251  vArray[eN*nQuadraturePoints_element*nDOF_element+
252  k*nDOF_element+
253  j]
254  =
255  psi[k*nDOF_element+
256  j];
257 }
258 
260  int nElementBoundaries_element,
261  int nElementBoundaryQuadraturePoints_elementBoundary,
262  int nDOF_element,
263  double* psi,
264  int* permutations,
265  double* vArray)
266 {
267  int eN,ebN,k,j;
268  for(eN=0;eN<nElements_global;eN++)
269  for (ebN=0;ebN<nElementBoundaries_element;ebN++)
270  for(k=0;k<nElementBoundaryQuadraturePoints_elementBoundary;k++)
271  for(j=0;j<nDOF_element;j++)
272  vArray[eN*nElementBoundaries_element*nElementBoundaryQuadraturePoints_elementBoundary*nDOF_element+
273  ebN*nElementBoundaryQuadraturePoints_elementBoundary*nDOF_element+
274  k*nDOF_element+
275  j]
276  =
277  psi[permutations[eN*nElementBoundaries_element*nElementBoundaryQuadraturePoints_elementBoundary+
278  ebN*nElementBoundaryQuadraturePoints_elementBoundary+
279  k]*nDOF_element+
280  j];
281 }
282 
284  int nElementBoundaryQuadraturePoints_elementBoundary,
285  int nDOF_element,
286  int nExteriorElementBoundaries_global,
287  const int* exteriorElementBoundariesArray,
288  const int* elementBoundaryElementsArray,
289  const int* elementBoundaryLocalElementBoundariesArray,
290  double* psi,
291  double* vArray)
292 {
293  int eN,ebN,ebNE,ebN_local,k,j;
294  for (ebNE = 0; ebNE < nExteriorElementBoundaries_global; ebNE++)
295  {
296  ebN = exteriorElementBoundariesArray[ebNE];
297  eN = elementBoundaryElementsArray[ebN*2+0];
298  ebN_local = elementBoundaryLocalElementBoundariesArray[ebN*2+0];
299  for(k=0;k<nElementBoundaryQuadraturePoints_elementBoundary;k++)
300  for(j=0;j<nDOF_element;j++)
301  vArray[ebNE*nElementBoundaryQuadraturePoints_elementBoundary*nDOF_element+
302  k*nDOF_element+
303  j]
304  =
305  psi[ebN_local*nElementBoundaryQuadraturePoints_elementBoundary*nDOF_element +
306  k*nDOF_element +
307  j];
308  }
309 }
310 
312  int nQuadraturePoints_element,
313  int nDOF_element,
314  int nSpace_global,
315  double* grad_psi,
316  double* inverseJacobianArray,
317  double* grad_vArray)
318 {
319  int eN,k,j,I,J,nSpace_global2 = nSpace_global*nSpace_global;
320  for(eN=0;eN<nElements_global;eN++)
321  for(k=0;k<nQuadraturePoints_element;k++)
322  for(j=0;j<nDOF_element;j++)
323  for (I=0;I<nSpace_global;I++)
324  for (J=0;J<nSpace_global;J++)
325  grad_vArray[eN*nQuadraturePoints_element*nDOF_element*nSpace_global+
326  k*nDOF_element*nSpace_global+
327  j*nSpace_global+
328  I]
329  +=
330  grad_psi[k*nDOF_element*nSpace_global+
331  j*nSpace_global+
332  J]
333  *
334  inverseJacobianArray[eN*nQuadraturePoints_element*nSpace_global2+
335  k*nSpace_global2+
336  J*nSpace_global+
337  I];
338 }
339 
341  int nQuadraturePoints_element,
342  int nDOF_element,
343  int nSpace_global,
344  double* Hessian_psi,
345  double* inverseJacobianArray,
346  double* Hessian_vArray)
347 {
348  int eN,k,j,I,J,K,L,nSpace_global2 = nSpace_global*nSpace_global;
349  for(eN=0;eN<nElements_global;eN++)
350  for(k=0;k<nQuadraturePoints_element;k++)
351  for(j=0;j<nDOF_element;j++)
352  for (I=0;I<nSpace_global;I++)
353  for (J=0;J<nSpace_global;J++)
354  for (K=0;K<nSpace_global;K++)
355  for (L=0;L<nSpace_global;L++)
356  Hessian_vArray[eN*nQuadraturePoints_element*nDOF_element*nSpace_global2+
357  k*nDOF_element*nSpace_global2+
358  j*nSpace_global2+
359  I*nSpace_global+
360  J]
361  +=
362  Hessian_psi[k*nDOF_element*nSpace_global2+
363  j*nSpace_global2+
364  K*nSpace_global+
365  L]
366  *
367  inverseJacobianArray[eN*nQuadraturePoints_element*nSpace_global2+
368  k*nSpace_global2+
369  L*nSpace_global+
370  J]
371  *
372  inverseJacobianArray[eN*nQuadraturePoints_element*nSpace_global2+
373  k*nSpace_global2+
374  K*nSpace_global+
375  I];
376 }
377 
379  int nElementBoundaries_element,
380  int nElementBoundaryQuadraturePoints_elementBoundary,
381  int nDOF_element,
382  int nSpace_global,
383  double* grad_psi,
384  int* permutations,
385  double* inverseJacobianArray,
386  double* grad_vArray)
387 {
388  int eN,ebN,k,j,I,J,nSpace_global2 = nSpace_global*nSpace_global;
389  for(eN=0;eN<nElements_global;eN++)
390  for (ebN=0;ebN<nElementBoundaries_element;ebN++)
391  for(k=0;k<nElementBoundaryQuadraturePoints_elementBoundary;k++)
392  for(j=0;j<nDOF_element;j++)
393  for (I=0;I<nSpace_global;I++)
394  for (J=0;J<nSpace_global;J++)
395  grad_vArray[eN*nElementBoundaries_element*nElementBoundaryQuadraturePoints_elementBoundary*nDOF_element*nSpace_global+
396  ebN*nElementBoundaryQuadraturePoints_elementBoundary*nDOF_element*nSpace_global+
397  k*nDOF_element*nSpace_global+
398  j*nSpace_global+
399  I]
400  +=
401  grad_psi[permutations[eN*nElementBoundaries_element*nElementBoundaryQuadraturePoints_elementBoundary+
402  ebN*nElementBoundaryQuadraturePoints_elementBoundary+
403  k]*nDOF_element*nSpace_global+
404  j*nSpace_global+
405  J]
406  *
407  inverseJacobianArray[eN*nElementBoundaries_element*nElementBoundaryQuadraturePoints_elementBoundary*nSpace_global2+
408  ebN*nElementBoundaryQuadraturePoints_elementBoundary*nSpace_global2+
409  k*nSpace_global2+
410  J*nSpace_global+
411  I];
412 }
413 
415  int nElementBoundaryQuadraturePoints_elementBoundary,
416  int nDOF_element,
417  int nSpace_global,
418  int nExteriorElementBoundaries_global,
419  const int *exteriorElementBoundariesArray,
420  const int *elementBoundaryElementsArray,
421  const int *elementBoundaryLocalElementBoundariesArray,
422  double* grad_psi,
423  double* inverseJacobianArray,
424  double* grad_vArray)
425 {
426  int ebN,ebNE,ebN_local,eN,k,j,I,J,nSpace_global2 = nSpace_global*nSpace_global;
427  for (ebNE = 0; ebNE < nExteriorElementBoundaries_global; ebNE++)
428  {
429  ebN = exteriorElementBoundariesArray[ebNE];
430  eN = elementBoundaryElementsArray[ebN*2+0];
431  ebN_local = elementBoundaryLocalElementBoundariesArray[ebN*2+0];
432  for(k=0;k<nElementBoundaryQuadraturePoints_elementBoundary;k++)
433  for(j=0;j<nDOF_element;j++)
434  for (I=0;I<nSpace_global;I++)
435  for (J=0;J<nSpace_global;J++)
436  grad_vArray[ebNE*nElementBoundaryQuadraturePoints_elementBoundary*nDOF_element*nSpace_global+
437  k*nDOF_element*nSpace_global+
438  j*nSpace_global+
439  I]
440  +=
441  grad_psi[ebN_local*nElementBoundaryQuadraturePoints_elementBoundary*nDOF_element*nSpace_global+
442  k*nDOF_element*nSpace_global+
443  j*nSpace_global+
444  J]
445  *
446  inverseJacobianArray[ebNE*nElementBoundaryQuadraturePoints_elementBoundary*nSpace_global2+
447  k*nSpace_global2+
448  J*nSpace_global+
449  I];
450  }
451 }
452 
453 void parametricMaps_getPermutations(int nElements_global,
454  int nElementBoundaries_element,
455  int nElementBoundaryQuadraturePoints_elementBoundary,
456  int nSpace_global,
457  double* xiArray,
458  int* permutations)
459 {
460  const int kTot=(nElementBoundaries_element*nElementBoundaryQuadraturePoints_elementBoundary);
461  int eN,ebN,k,k0,I;
462  register double errorNorm,errorNormMin;
463  /* permutations are relative to the ordering on the first element so the first entries used are the identity*/
464  for (k0=0;k0<kTot;k0++)
465  permutations[k0]=k0;
466  /* now loop over remaining elements and find the permutation used to get to reference points to match*/
467  for (eN=1;eN<nElements_global;eN++)
468  {
469  for (ebN=0;ebN<nElementBoundaries_element;ebN++)
470  for (k=0;k<nElementBoundaryQuadraturePoints_elementBoundary;k++)
471  {
472  errorNormMin=1.0;
473  for (k0=0;k0<kTot;k0++)
474  {
475  errorNorm=0.0;
476  for (I=0;I<nSpace_global;I++)
477  {
478  errorNorm += fabs(xiArray[k0*3+I]
479  -
480  xiArray[eN*nElementBoundaries_element*nElementBoundaryQuadraturePoints_elementBoundary*3+
481  ebN*nElementBoundaryQuadraturePoints_elementBoundary*3+
482  k*3+
483  I]);
484  }
485  if (errorNorm < errorNormMin)
486  {
487  permutations[eN*nElementBoundaries_element*nElementBoundaryQuadraturePoints_elementBoundary+
488  ebN*nElementBoundaryQuadraturePoints_elementBoundary+
489  k] = k0;
490  errorNormMin = errorNorm;
491  }
492  }
493  }
494  }
495 }
496 void parametricMaps_getPermutationsGlobalExterior(int nElementBoundaryQuadraturePoints_elementBoundary,
497  int nSpace_global,
498  int nExteriorElementBoundaries_global,
499  const int * exteriorElementBoundariesArray,
500  const int * elementBoundaryElementsArray,
501  const int * elementBoundaryLocalElementBoundariesArray,
502  double* xiArray,
503  int* permutations)
504 {
505  const int kTot=nElementBoundaryQuadraturePoints_elementBoundary;
506  int eN,ebN,ebNE,ebN_local,k,k0,I;
507  register double errorNorm,errorNormMin;
508  /* permutations are relative to the ordering on the first elementBoundary so the first entries used are the identity*/
509  for (k0=0;k0<kTot;k0++)
510  permutations[k0]=k0;
511  /* loop over exterior elementBoundaries and setup permutation used to get to reference points to match*/
512  for (ebNE = 1; ebNE < nExteriorElementBoundaries_global; ebNE++)
513  {
514  ebN = exteriorElementBoundariesArray[ebNE];
515  eN = elementBoundaryElementsArray[ebN*2+0];
516  ebN_local = elementBoundaryLocalElementBoundariesArray[ebN*2+0];
517  for (k=0;k<nElementBoundaryQuadraturePoints_elementBoundary;k++)
518  {
519  errorNormMin=1.0;
520  for (k0=0;k0<kTot;k0++)
521  {
522  errorNorm=0.0;
523  for (I=0;I<nSpace_global;I++)
524  {
525  errorNorm += fabs(xiArray[k0*3+I]
526  -
527  xiArray[ebNE*nElementBoundaryQuadraturePoints_elementBoundary*3+
528  k*3+
529  I]);
530  }
531  if (errorNorm < errorNormMin)
532  {
533  permutations[ebNE*nElementBoundaryQuadraturePoints_elementBoundary+
534  k] = k0;
535  errorNormMin = errorNorm;
536  }
537  }
538  }
539  }
540 }
541 
542 void getPermutationsGlobal(int nElementBoundaries_global,
543  int nElementBoundaryQuadraturePoints_elementBoundary,
544  double* xArray,
545  double* xArrayNew,
546  int* permutations)
547 {
548  int ebN,k,k0,I;
549  register double errorNorm,errorNormMin;
550  /* now loop over remaining elements and find the permutation used to get to reference points to match*/
551  for (ebN=0;ebN<nElementBoundaries_global;ebN++)
552  {
553  for (k=0;k<nElementBoundaryQuadraturePoints_elementBoundary;k++)
554  {
555  errorNormMin=1.0;
556  for (k0=0;k0<nElementBoundaryQuadraturePoints_elementBoundary;k0++)
557  {
558  errorNorm=0.0;
559  for (I=0;I<3;I++)
560  {
561  errorNorm += fabs(xArrayNew[ebN*nElementBoundaryQuadraturePoints_elementBoundary*3+
562  k0*3+
563  I]
564  -
565  xArray[ebN*nElementBoundaryQuadraturePoints_elementBoundary*3+
566  k*3+
567  I]);
568  }
569  if (errorNorm < errorNormMin)
570  {
571  permutations[ebN*nElementBoundaryQuadraturePoints_elementBoundary+
572  k] = k0;
573  errorNormMin = errorNorm;
574  }
575  }
576  }
577  }
578 }
579 
580 void parametricMaps_getValues(int nElements_global,
581  int nQuadraturePoints_element,
582  int nDOF_element,
583  int nSpace_global,
584  double* psi,
585  int* l2g,
586  double* nodeArray,
587  double* xArray)
588 {
589  memset(xArray,0,sizeof(double)*nElements_global*nQuadraturePoints_element*3);
590  int eN,k,j,j_global,I;
591  for(eN=0;eN<nElements_global;eN++)
592  for(k=0;k<nQuadraturePoints_element;k++)
593  for(j=0;j<nDOF_element;j++)
594  {
595  j_global = l2g[eN*nDOF_element+
596  j];
597  for(I=0;I<nSpace_global;I++)
598  xArray[eN*nQuadraturePoints_element*3+
599  k*3+
600  I]
601  +=
602  psi[k*nDOF_element+
603  j]
604  *
605  nodeArray[j_global*3+
606  I];
607  }
608 }
609 
610 void parametricMaps_getValuesTrace(int nElements_global,
611  int nElementBoundaries_element,
612  int nQuadraturePoints_element,
613  int nDOF_element,
614  int nSpace_global,
615  double* psi,
616  int* l2g,
617  double* nodeArray,
618  double* xArray)
619 {
620  memset(xArray,0,sizeof(double)*nElements_global*nElementBoundaries_element*nQuadraturePoints_element*3);
621  int eN,ebN,k,j,j_global,I;
622  for(eN=0;eN<nElements_global;eN++)
623  for(ebN=0;ebN<nElementBoundaries_element;ebN++)
624  for(k=0;k<nQuadraturePoints_element;k++)
625  for(j=0;j<nDOF_element;j++)
626  {
627  j_global = l2g[eN*nDOF_element+
628  j];
629  for(I=0;I<nSpace_global;I++)
630  xArray[eN*nElementBoundaries_element*nQuadraturePoints_element*3+
631  ebN*nQuadraturePoints_element*3+
632  k*3+
633  I]
634  +=
635  psi[ebN*nQuadraturePoints_element*nDOF_element+
636  k*nDOF_element+
637  j]
638  *
639  nodeArray[j_global*3+
640  I];
641  }
642 }
643 
644 void parametricMaps_getValuesGlobalExteriorTrace(int nQuadraturePoints_elementBoundary,
645  int nDOF_element,
646  int nSpace_global,
647  int nExteriorElementBoundaries_global,
648  const int* exteriorElementBoundariesArray,
649  const int* elementBoundaryElementsArray,
650  const int* elementBoundaryLocalElementBoundariesArray,
651  double* psi,
652  int* l2g,
653  double* nodeArray,
654  double* xArray)
655 {
656  memset(xArray,0,sizeof(double)*nExteriorElementBoundaries_global*nQuadraturePoints_elementBoundary*3);
657  int eN,ebN,ebNE,ebN_local,k,j,j_global,I;
658  for (ebNE = 0; ebNE < nExteriorElementBoundaries_global; ebNE++)
659  {
660  ebN = exteriorElementBoundariesArray[ebNE];
661  eN = elementBoundaryElementsArray[ebN*2 + 0];
662  ebN_local = elementBoundaryLocalElementBoundariesArray[ebN*2 + 0];
663  for(k=0;k<nQuadraturePoints_elementBoundary;k++)
664  for(j=0;j<nDOF_element;j++)
665  {
666  j_global = l2g[eN*nDOF_element+
667  j];
668  for(I=0;I<nSpace_global;I++)
669  xArray[ebNE*nQuadraturePoints_elementBoundary*3+
670  k*3+
671  I]
672  +=
673  psi[ebN_local*nQuadraturePoints_elementBoundary*nDOF_element+
674  k*nDOF_element+
675  j]
676  *
677  nodeArray[j_global*3+
678  I];
679  }
680  }
681 }
682 
683 void parametricMaps_getInverseValues(int nElements_global,
684  int nQuadraturePoints_element,
685  int nDOF_element,
686  int nSpace_global,
687  double* inverseJacobian,
688  int* l2g,
689  double* nodeArray,
690  double* xArray,
691  double* xiArray)
692 {
693  memset(xiArray,0,sizeof(double)*nElements_global*nQuadraturePoints_element*3);
694  int eN,k,node0,I,J,nSpace_global2=nSpace_global*nSpace_global;
695  double dx[nSpace_global];
696  for(eN=0;eN<nElements_global;eN++)
697  for(k=0;k<nQuadraturePoints_element;k++)
698  {
699  node0 = l2g[eN*nDOF_element];
700  for(I=0;I<nSpace_global;I++)
701  dx[I] =
702  xArray[eN*nQuadraturePoints_element*3+
703  k*3+
704  I]
705  -
706  nodeArray[node0*3+I];
707  for(I=0;I<nSpace_global;I++)
708  for(J=0;J<nSpace_global;J++)
709  xiArray[eN*nQuadraturePoints_element*3+
710  k*3+
711  I]
712  +=
713  inverseJacobian[eN*nQuadraturePoints_element*nSpace_global2+
714  k*nSpace_global2+
715  I*nSpace_global+
716  J]
717  *
718  dx[J];
719  }
720 }
721 
722 void parametricMaps_getInverseValuesTrace(int nElements_global,
723  int nElementBoundaries_element,
724  int nElementBoundaryQuadraturePoints_elementBoundary,
725  int nDOF_element,
726  int nSpace_global,
727  double* inverseJacobian,
728  int* l2g,
729  double* nodeArray,
730  double* xArray,
731  double* xiArray)
732 {
733  memset(xiArray,0,sizeof(double)*nElements_global*nElementBoundaries_element*nElementBoundaryQuadraturePoints_elementBoundary*3);
734  int eN,ebN,k,node0,I,J,nSpace_global2=nSpace_global*nSpace_global;
735  double dx[nSpace_global];
736  for(eN=0;eN<nElements_global;eN++)
737  for (ebN=0;ebN<nElementBoundaries_element;ebN++)
738  for(k=0;k<nElementBoundaryQuadraturePoints_elementBoundary;k++)
739  {
740  node0 = l2g[eN*nDOF_element];
741  for(I=0;I<nSpace_global;I++)
742  dx[I] =
743  xArray[eN*nElementBoundaries_element*nElementBoundaryQuadraturePoints_elementBoundary*3+
744  ebN*nElementBoundaryQuadraturePoints_elementBoundary*3+
745  k*3+
746  I]
747  -
748  nodeArray[node0*3+I];
749  for(I=0;I<nSpace_global;I++)
750  for(J=0;J<nSpace_global;J++)
751  xiArray[eN*nElementBoundaries_element*nElementBoundaryQuadraturePoints_elementBoundary*3+
752  ebN*nElementBoundaryQuadraturePoints_elementBoundary*3+
753  k*3+
754  I]
755  +=
756  inverseJacobian[eN*nElementBoundaries_element*nElementBoundaryQuadraturePoints_elementBoundary*nSpace_global2+
757  ebN*nElementBoundaryQuadraturePoints_elementBoundary*nSpace_global2+
758  k*nSpace_global2+
759  I*nSpace_global+
760  J]
761  *
762  dx[J];
763  }
764 }
765 
766 void parametricMaps_getInverseValuesGlobalExteriorTrace(int nElementBoundaryQuadraturePoints_elementBoundary,
767  int nDOF_element,
768  int nSpace_global,
769  int nExteriorElementBoundaries_global,
770  const int* exteriorElementBoundariesArray,
771  const int* elementBoundaryElementsArray,
772  const int* elementBoundaryLocalElementBoundariesArray,
773  double* inverseJacobian,
774  int* l2g,
775  double* nodeArray,
776  double* xArray,
777  double* xiArray)
778 {
779  memset(xiArray,0,sizeof(double)*nExteriorElementBoundaries_global*nElementBoundaryQuadraturePoints_elementBoundary*3);
780  int eN,ebN,ebNE,ebN_local,k,node0,I,J,nSpace_global2=nSpace_global*nSpace_global;
781  double dx[nSpace_global];
782  for (ebNE = 0; ebNE < nExteriorElementBoundaries_global; ebNE++)
783  {
784  ebN = exteriorElementBoundariesArray[ebNE];
785  eN = elementBoundaryElementsArray[ebN*2+0];
786  ebN_local = elementBoundaryLocalElementBoundariesArray[ebN*2+0];
787 
788  for(k=0;k<nElementBoundaryQuadraturePoints_elementBoundary;k++)
789  {
790  node0 = l2g[eN*nDOF_element];
791  for(I=0;I<nSpace_global;I++)
792  dx[I] =
793  xArray[ebNE*nElementBoundaryQuadraturePoints_elementBoundary*3+
794  k*3+
795  I]
796  -
797  nodeArray[node0*3+I];
798  for(I=0;I<nSpace_global;I++)
799  for(J=0;J<nSpace_global;J++)
800  xiArray[ebNE*nElementBoundaryQuadraturePoints_elementBoundary*3+
801  k*3+
802  I]
803  +=
804  inverseJacobian[ebNE*nElementBoundaryQuadraturePoints_elementBoundary*nSpace_global2+
805  k*nSpace_global2+
806  I*nSpace_global+
807  J]
808  *
809  dx[J];
810  }
811  }
812 }
813 
814 void parametricMaps_getJacobianValues3D(int nElements_global,
815  int nQuadraturePoints_element,
816  int nDOF_element,
817  double* grad_psi,
818  int* l2g,
819  double* nodeArray,
820  double* jacobianArray,
821  double* jacobianDeterminantArray,
822  double* jacobianInverseArray)
823 {
824  int eN,k,j,j_global;
825  const int X=0,Y=1,Z=2,
826  XX=0,XY=1,XZ=2,
827  YX=3,YY=4,YZ=5,
828  ZX=6,ZY=7,ZZ=8;
829  double *jac=NULL,*jacDet=NULL,*jacInv=NULL,*grad=NULL,*node=NULL;
830  register double oneOverJacDet=0.0;
831  for(eN=0;eN<nElements_global;eN++)
832  for(k=0;k<nQuadraturePoints_element;k++)
833  {
834  jac = jacobianArray +
835  eN*nQuadraturePoints_element*9+
836  k*9;
837  jacDet = jacobianDeterminantArray +
838  eN*nQuadraturePoints_element+
839  k;
840  jacInv = jacobianInverseArray +
841  eN*nQuadraturePoints_element*9+
842  k*9;
843  for(j=0;j<nDOF_element;j++)
844  {
845  j_global = l2g[eN*nDOF_element+
846  j];
847  grad = grad_psi + k*nDOF_element*3 + j*3;
848  node = nodeArray + j_global*3;
849  jac[XX] += node[X]*grad[X];
850  jac[XY] += node[X]*grad[Y];
851  jac[XZ] += node[X]*grad[Z];
852  jac[YX] += node[Y]*grad[X];
853  jac[YY] += node[Y]*grad[Y];
854  jac[YZ] += node[Y]*grad[Z];
855  jac[ZX] += node[Z]*grad[X];
856  jac[ZY] += node[Z]*grad[Y];
857  jac[ZZ] += node[Z]*grad[Z];
858  }
859  *jacDet
860  =
861  jac[XX]*(jac[YY]*jac[ZZ] - jac[YZ]*jac[ZY]) -
862  jac[XY]*(jac[YX]*jac[ZZ] - jac[YZ]*jac[ZX]) +
863  jac[XZ]*(jac[YX]*jac[ZY] - jac[YY]*jac[ZX]);
864  oneOverJacDet = 1.0/(*jacDet);
865  jacInv[XX] = oneOverJacDet*(jac[YY]*jac[ZZ] - jac[YZ]*jac[ZY]);
866  jacInv[YX] = oneOverJacDet*(jac[YZ]*jac[ZX] - jac[YX]*jac[ZZ]);
867  jacInv[ZX] = oneOverJacDet*(jac[YX]*jac[ZY] - jac[YY]*jac[ZX]);
868  jacInv[XY] = oneOverJacDet*(jac[ZY]*jac[XZ] - jac[ZZ]*jac[XY]);
869  jacInv[YY] = oneOverJacDet*(jac[ZZ]*jac[XX] - jac[ZX]*jac[XZ]);
870  jacInv[ZY] = oneOverJacDet*(jac[ZX]*jac[XY] - jac[ZY]*jac[XX]);
871  jacInv[XZ] = oneOverJacDet*(jac[XY]*jac[YZ] - jac[XZ]*jac[YY]);
872  jacInv[YZ] = oneOverJacDet*(jac[XZ]*jac[YX] - jac[XX]*jac[YZ]);
873  jacInv[ZZ] = oneOverJacDet*(jac[XX]*jac[YY] - jac[XY]*jac[YX]);
874  }
875 }
876 
877 void parametricMaps_getJacobianValues2D(int nElements_global,
878  int nQuadraturePoints_element,
879  int nDOF_element,
880  double* grad_psi,
881  int* l2g,
882  double* nodeArray,
883  double* jacobianArray,
884  double* jacobianDeterminantArray,
885  double* jacobianInverseArray)
886 {
887  int eN,k,j,j_global;
888  const int X=0,Y=1,
889  XX=0,XY=1,
890  YX=2,YY=3;
891  double *jac=NULL,*jacDet=NULL,*jacInv=NULL,*grad=NULL,*node=NULL;
892  register double oneOverJacDet=0.0;
893  for(eN=0;eN<nElements_global;eN++)
894  for(k=0;k<nQuadraturePoints_element;k++)
895  {
896  jac = jacobianArray +
897  eN*nQuadraturePoints_element*4+
898  k*4;
899  jacDet = jacobianDeterminantArray +
900  eN*nQuadraturePoints_element+
901  k;
902  jacInv = jacobianInverseArray +
903  eN*nQuadraturePoints_element*4+
904  k*4;
905  for(j=0;j<nDOF_element;j++)
906  {
907  j_global = l2g[eN*nDOF_element+
908  j];
909  grad = grad_psi + k*nDOF_element*2 + j*2;
910  /* nodes are always 3D */
911  node = nodeArray + j_global*3;
912  jac[XX] += node[X]*grad[X];
913  jac[XY] += node[X]*grad[Y];
914  jac[YX] += node[Y]*grad[X];
915  jac[YY] += node[Y]*grad[Y];
916  }
917  *jacDet
918  =
919  jac[XX]*jac[YY]- jac[XY]*jac[YX];
920  oneOverJacDet = 1.0/(*jacDet);
921  jacInv[XX] = oneOverJacDet*jac[YY];
922  jacInv[YX] = -oneOverJacDet*jac[YX];
923  jacInv[XY] = -oneOverJacDet*jac[XY];
924  jacInv[YY] = oneOverJacDet*jac[XX];
925  }
926 }
927 
928 void parametricMaps_getJacobianValues1D(int nElements_global,
929  int nQuadraturePoints_element,
930  int nDOF_element,
931  double* grad_psi,
932  int* l2g,
933  double* nodeArray,
934  double* jacobianArray,
935  double* jacobianDeterminantArray,
936  double* jacobianInverseArray)
937 {
938  int eN,k,j,j_global;
939  const int X=0,
940  XX=0;
941  double *jac=NULL,*jacDet=NULL,*jacInv=NULL,*grad=NULL,*node=NULL;
942  register double oneOverJacDet=0.0;
943  for(eN=0;eN<nElements_global;eN++)
944  for(k=0;k<nQuadraturePoints_element;k++)
945  {
946  jac = jacobianArray +
947  eN*nQuadraturePoints_element+
948  k;
949  jacDet = jacobianDeterminantArray +
950  eN*nQuadraturePoints_element+
951  k;
952  jacInv = jacobianInverseArray +
953  eN*nQuadraturePoints_element+
954  k;
955  for(j=0;j<nDOF_element;j++)
956  {
957  j_global = l2g[eN*nDOF_element+
958  j];
959  grad = grad_psi + k*nDOF_element + j;
960  /* nodes are always 3D */
961  node = nodeArray + j_global*3;
962  jac[XX] += node[X]*grad[X];
963  }
964  *jacDet
965  =
966  jac[XX];
967  oneOverJacDet = 1.0/(*jacDet);
968  jacInv[XX] = oneOverJacDet;
969  }
970 }
971 
972 void parametricMaps_getJacobianValuesTrace3D(int nElements_global,
973  int nElementBoundaries_element,
974  int nQuadraturePoints_element,
975  int nDOF_element,
976  double* grad_psi,
977  double* boundaryNormals,
978  double* boundaryJacobians,
979  int* l2g,
980  double* nodeArray,
981  double* jacobianInverseArray,
982  double* metricTensorArray,
983  double* metricTensorDeterminantSqrtArray,
984  double* unitNormalArray)
985 {
986  int eN,ebN,k,j,j_global;
987  const int
988  X=0,Y=1,Z=2,
989  XX=0,XY=1,XZ=2,
990  YX=3,YY=4,YZ=5,
991  ZX=6,ZY=7,ZZ=8,
992  XHX=0,XHY=1,
993  YHX=2,YHY=3,
994  ZHX=4,ZHY=5,
995  HXHX=0,HXHY=1,
996  HYHX=2,HYHY=3;
997  double *jacInv=NULL,*mt=NULL,*mtDetSqrt=NULL,*n=NULL,*grad=NULL,*node=NULL,*bn,*bj;
998  register double oneOverJacDet=0.0,oneOverNbn=0.0;
999  double emj[9],ebmj[6];
1000  for(eN=0;eN<nElements_global;eN++)
1001  for(ebN=0;ebN<nElementBoundaries_element;ebN++)
1002  for(k=0;k<nQuadraturePoints_element;k++)
1003  {
1004  emj[XX] = 0.0;
1005  emj[XY] = 0.0;
1006  emj[XZ] = 0.0;
1007  emj[YX] = 0.0;
1008  emj[YY] = 0.0;
1009  emj[YZ] = 0.0;
1010  emj[ZX] = 0.0;
1011  emj[ZY] = 0.0;
1012  emj[ZZ] = 0.0;
1013  ebmj[XHX] = 0.0;
1014  ebmj[XHY] = 0.0;
1015  ebmj[YHX] = 0.0;
1016  ebmj[YHY] = 0.0;
1017  ebmj[ZHX] = 0.0;
1018  ebmj[ZHY] = 0.0;
1019  jacInv = jacobianInverseArray +
1020  eN*nElementBoundaries_element*nQuadraturePoints_element*9+
1021  ebN*nQuadraturePoints_element*9+
1022  k*9;
1023  mt = metricTensorArray +
1024  eN*nElementBoundaries_element*nQuadraturePoints_element*4+
1025  ebN*nQuadraturePoints_element*4+
1026  k*4;
1027  mtDetSqrt = metricTensorDeterminantSqrtArray +
1028  eN*nElementBoundaries_element*nQuadraturePoints_element+
1029  ebN*nQuadraturePoints_element+
1030  k;
1031  n = unitNormalArray+
1032  eN*nElementBoundaries_element*nQuadraturePoints_element*3+
1033  ebN*nQuadraturePoints_element*3+
1034  k*3;
1035  bn = boundaryNormals + ebN*3;
1036  bj = boundaryJacobians + ebN*6;
1037  for(j=0;j<nDOF_element;j++)
1038  {
1039  j_global = l2g[eN*nDOF_element+
1040  j];
1041  grad = grad_psi + ebN*nQuadraturePoints_element*nDOF_element*3+k*nDOF_element*3 + j*3;
1042  /* nodes are always 3D */
1043  node = nodeArray + j_global*3;
1044  emj[XX] += node[X]*grad[X];
1045  emj[XY] += node[X]*grad[Y];
1046  emj[XZ] += node[X]*grad[Z];
1047  emj[YX] += node[Y]*grad[X];
1048  emj[YY] += node[Y]*grad[Y];
1049  emj[YZ] += node[Y]*grad[Z];
1050  emj[ZX] += node[Z]*grad[X];
1051  emj[ZY] += node[Z]*grad[Y];
1052  emj[ZZ] += node[Z]*grad[Z];
1053  }
1054  oneOverJacDet = 1.0/(emj[XX]*(emj[YY]*emj[ZZ] - emj[YZ]*emj[ZY]) -
1055  emj[XY]*(emj[YX]*emj[ZZ] - emj[YZ]*emj[ZX]) +
1056  emj[XZ]*(emj[YX]*emj[ZY] - emj[YY]*emj[ZX]));
1057  jacInv[XX] = oneOverJacDet*(emj[YY]*emj[ZZ] - emj[YZ]*emj[ZY]);
1058  jacInv[YX] = oneOverJacDet*(emj[YZ]*emj[ZX] - emj[YX]*emj[ZZ]);
1059  jacInv[ZX] = oneOverJacDet*(emj[YX]*emj[ZY] - emj[YY]*emj[ZX]);
1060  jacInv[XY] = oneOverJacDet*(emj[ZY]*emj[XZ] - emj[ZZ]*emj[XY]);
1061  jacInv[YY] = oneOverJacDet*(emj[ZZ]*emj[XX] - emj[ZX]*emj[XZ]);
1062  jacInv[ZY] = oneOverJacDet*(emj[ZX]*emj[XY] - emj[ZY]*emj[XX]);
1063  jacInv[XZ] = oneOverJacDet*(emj[XY]*emj[YZ] - emj[XZ]*emj[YY]);
1064  jacInv[YZ] = oneOverJacDet*(emj[XZ]*emj[YX] - emj[XX]*emj[YZ]);
1065  jacInv[ZZ] = oneOverJacDet*(emj[XX]*emj[YY] - emj[XY]*emj[YX]);
1066 
1067  ebmj[XHX] = emj[XX]*bj[XHX]+emj[XY]*bj[YHX]+emj[XZ]*bj[ZHX];
1068  ebmj[XHY] = emj[XX]*bj[XHY]+emj[XY]*bj[YHY]+emj[XZ]*bj[ZHY];
1069  ebmj[YHX] = emj[YX]*bj[XHX]+emj[YY]*bj[YHX]+emj[YZ]*bj[ZHX];
1070  ebmj[YHY] = emj[YX]*bj[XHY]+emj[YY]*bj[YHY]+emj[YZ]*bj[ZHY];
1071  ebmj[ZHX] = emj[ZX]*bj[XHX]+emj[ZY]*bj[YHX]+emj[ZZ]*bj[ZHX];
1072  ebmj[ZHY] = emj[ZX]*bj[XHY]+emj[ZY]*bj[YHY]+emj[ZZ]*bj[ZHY];
1073 
1074  mt[HXHX] = ebmj[XHX]*ebmj[XHX]+ebmj[YHX]*ebmj[YHX]+ebmj[ZHX]*ebmj[ZHX];
1075  mt[HXHY] = ebmj[XHX]*ebmj[XHY]+ebmj[YHX]*ebmj[YHY]+ebmj[ZHX]*ebmj[ZHY];
1076  mt[HYHX] = ebmj[XHY]*ebmj[XHX]+ebmj[YHY]*ebmj[YHX]+ebmj[ZHY]*ebmj[ZHX];
1077  mt[HYHY] = ebmj[XHY]*ebmj[XHY]+ebmj[YHY]*ebmj[YHY]+ebmj[ZHY]*ebmj[ZHY];
1078 
1079  *mtDetSqrt=sqrt(mt[HXHX]*mt[HYHY]- mt[HXHY]*mt[HYHX]);
1080 
1081 
1082  n[X] = (jacInv[XX]*bn[X]+jacInv[YX]*bn[Y]+jacInv[ZX]*bn[Z]);
1083  n[Y] = (jacInv[XY]*bn[X]+jacInv[YY]*bn[Y]+jacInv[ZY]*bn[Z]);
1084  n[Z] = (jacInv[XZ]*bn[X]+jacInv[YZ]*bn[Y]+jacInv[ZZ]*bn[Z]);
1085 
1086  oneOverNbn = 1.0/sqrt(n[X]*n[X]+n[Y]*n[Y]+n[Z]*n[Z]);
1087 
1088  n[X] *= oneOverNbn;
1089  n[Y] *= oneOverNbn;
1090  n[Z] *= oneOverNbn;
1091 
1092  }
1093 }
1094 
1096  int nElementBoundaries_element,
1097  int nQuadraturePoints_element,
1098  int nDOF_element,
1099  double* grad_psi,
1100  double* boundaryNormals,
1101  double* boundaryJacobians,
1102  int* l2g,
1103  double* nodeArray,
1104  double* jacobianInverseArray,
1105  double* metricTensorArray,
1106  double* metricTensorDeterminantSqrtArray,
1107  double* unitNormalArray)
1108 {
1109  int eN,ebN,k,j,j_global;
1110  const int X=0,Y=1,
1111  XX=0,XY=1,
1112  YX=2,YY=3;
1113  double *jacInv=NULL,*mt,*mtDetSqrt,*n,*grad=NULL,*node=NULL,*bn,*bj;
1114  register double oneOverJacDet=0.0,oneOverNbn=0.0;
1115  double emj[4],ebmj[2];
1116  for(eN=0;eN<nElements_global;eN++)
1117  for(ebN=0;ebN<nElementBoundaries_element;ebN++)
1118  for(k=0;k<nQuadraturePoints_element;k++)
1119  {
1120  emj[XX] = 0.0;
1121  emj[XY] = 0.0;
1122  emj[YX] = 0.0;
1123  emj[YY] = 0.0;
1124  ebmj[XX] = 0.0;
1125  ebmj[XY] = 0.0;
1126  jacInv = jacobianInverseArray +
1127  eN*nElementBoundaries_element*nQuadraturePoints_element*4+
1128  ebN*nQuadraturePoints_element*4+
1129  k*4;
1130  mt = metricTensorArray +
1131  eN*nElementBoundaries_element*nQuadraturePoints_element+
1132  ebN*nQuadraturePoints_element+
1133  k;
1134  mtDetSqrt = metricTensorDeterminantSqrtArray +
1135  eN*nElementBoundaries_element*nQuadraturePoints_element+
1136  ebN*nQuadraturePoints_element+
1137  k;
1138  n = unitNormalArray+
1139  eN*nElementBoundaries_element*nQuadraturePoints_element*2+
1140  ebN*nQuadraturePoints_element*2+
1141  k*2;
1142  bn = boundaryNormals + ebN*2;
1143  bj = boundaryJacobians + ebN*2;
1144  for(j=0;j<nDOF_element;j++)
1145  {
1146  j_global = l2g[eN*nDOF_element+
1147  j];
1148  grad = grad_psi + ebN*nQuadraturePoints_element*nDOF_element*2+k*nDOF_element*2 + j*2;
1149  /* nodes are always 3D */
1150  node = nodeArray + j_global*3;
1151  emj[XX] += node[X]*grad[X];
1152  emj[XY] += node[X]*grad[Y];
1153  emj[YX] += node[Y]*grad[X];
1154  emj[YY] += node[Y]*grad[Y];
1155  }
1156  oneOverJacDet = 1.0/(emj[XX]*emj[YY]- emj[XY]*emj[YX]);
1157  jacInv[XX] = oneOverJacDet*emj[YY];
1158  jacInv[YX] = -oneOverJacDet*emj[YX];
1159  jacInv[XY] = -oneOverJacDet*emj[XY];
1160  jacInv[YY] = oneOverJacDet*emj[XX];
1161  ebmj[X] = emj[XX]*bj[XX]+emj[XY]*bj[Y];
1162  ebmj[Y] = emj[YX]*bj[X]+emj[YY]*bj[Y];
1163  mt[X] = ebmj[X]*ebmj[X]+ebmj[Y]*ebmj[Y];
1164  *mtDetSqrt=sqrt(mt[XX]);
1165  n[X] = jacInv[XX]*bn[X]+jacInv[YX]*bn[Y];
1166  n[Y] = jacInv[XY]*bn[X]+jacInv[YY]*bn[Y];
1167  oneOverNbn= 1.0/sqrt(n[X]*n[X]+n[Y]*n[Y]);
1168  n[X] *= oneOverNbn;
1169  n[Y] *= oneOverNbn;
1170  }
1171 }
1172 
1174  int nElementBoundaries_element,
1175  int nQuadraturePoints_element,
1176  int nDOF_element,
1177  double* xtArray,
1178  double* grad_psi,
1179  double* boundaryNormals,
1180  double* boundaryJacobians,
1181  int* l2g,
1182  double* nodeArray,
1183  double* jacobianInverseArray,
1184  double* metricTensorArray,
1185  double* metricTensorDeterminantSqrtArray,
1186  double* unitNormalArray)
1187 {
1188  int eN,ebN,k,j,j_global;
1189  const int X=0,Y=1,
1190  XX=0,XY=1,
1191  YX=2,YY=3;
1192  double *jacInv=NULL,*mt,*mtDetSqrt,*n,*grad=NULL,*node=NULL,*bn,*bj,*xt;
1193  register double oneOverJacDet=0.0,oneOverNbn=0.0,xt_dot_xt,xt_dot_n,xt_dot_bj;
1194  double emj[4],ebmj[2];
1195  for(eN=0;eN<nElements_global;eN++)
1196  for(ebN=0;ebN<nElementBoundaries_element;ebN++)
1197  for(k=0;k<nQuadraturePoints_element;k++)
1198  {
1199  emj[XX] = 0.0;
1200  emj[XY] = 0.0;
1201  emj[YX] = 0.0;
1202  emj[YY] = 0.0;
1203  ebmj[XX] = 0.0;
1204  ebmj[XY] = 0.0;
1205  jacInv = jacobianInverseArray +
1206  eN*nElementBoundaries_element*nQuadraturePoints_element*4+
1207  ebN*nQuadraturePoints_element*4+
1208  k*4;
1209  mt = metricTensorArray +
1210  eN*nElementBoundaries_element*nQuadraturePoints_element+
1211  ebN*nQuadraturePoints_element+
1212  k;
1213  mtDetSqrt = metricTensorDeterminantSqrtArray +
1214  eN*nElementBoundaries_element*nQuadraturePoints_element+
1215  ebN*nQuadraturePoints_element+
1216  k;
1217  n = unitNormalArray+
1218  eN*nElementBoundaries_element*nQuadraturePoints_element*2+
1219  ebN*nQuadraturePoints_element*2+
1220  k*2;
1221  xt = xtArray + eN*nElementBoundaries_element*nQuadraturePoints_element*3+
1222  ebN*nQuadraturePoints_element*3+
1223  k*3;
1224  bn = boundaryNormals + ebN*2;
1225  bj = boundaryJacobians + ebN*2;
1226  for(j=0;j<nDOF_element;j++)
1227  {
1228  j_global = l2g[eN*nDOF_element+
1229  j];
1230  grad = grad_psi + ebN*nQuadraturePoints_element*nDOF_element*2+k*nDOF_element*2 + j*2;
1231  /* nodes are always 3D */
1232  node = nodeArray + j_global*3;
1233  emj[XX] += node[X]*grad[X];
1234  emj[XY] += node[X]*grad[Y];
1235  emj[YX] += node[Y]*grad[X];
1236  emj[YY] += node[Y]*grad[Y];
1237  }
1238  oneOverJacDet = 1.0/(emj[XX]*emj[YY]- emj[XY]*emj[YX]);
1239  jacInv[XX] = oneOverJacDet*emj[YY];
1240  jacInv[YX] = -oneOverJacDet*emj[YX];
1241  jacInv[XY] = -oneOverJacDet*emj[XY];
1242  jacInv[YY] = oneOverJacDet*emj[XX];
1243  ebmj[X] = emj[XX]*bj[X]+emj[XY]*bj[Y];
1244  ebmj[Y] = emj[YX]*bj[X]+emj[YY]*bj[Y];
1245  mt[X] = ebmj[X]*ebmj[X]+ebmj[Y]*ebmj[Y];
1246  n[X] = jacInv[XX]*bn[X]+jacInv[YX]*bn[Y];
1247  n[Y] = jacInv[XY]*bn[X]+jacInv[YY]*bn[Y];
1248  oneOverNbn= 1.0/sqrt(n[X]*n[X]+n[Y]*n[Y]);
1249  n[X] *= oneOverNbn;
1250  n[Y] *= oneOverNbn;
1251  xt_dot_xt = xt[X]*xt[X]+xt[Y]*xt[Y];
1252  xt_dot_bj = xt[X]*ebmj[X]+xt[Y]*ebmj[Y];
1253  xt_dot_n = xt[X]*n[X]+xt[Y]*n[Y];
1254  //printf("%12.5e %12.5e %12.5e\n",xt_dot_xt,xt_dot_bj,xt_dot_n);
1255  //printf("%12.5e \n",((1.0+xt_dot_xt)*mt[X] - xt_dot_bj*xt_dot_bj)/(1.0+xt_dot_n*xt_dot_n));
1256  *mtDetSqrt=sqrt(((1.0+xt_dot_xt)*mt[X] - xt_dot_bj*xt_dot_bj)/(1.0+xt_dot_n*xt_dot_n));// sqrt(det(G^t G))/sqrt(1 + (xt^t n)^2)
1257  }
1258 }
1259 
1261  int nElementBoundaries_element,
1262  int nQuadraturePoints_element,
1263  int nDOF_element,
1264  double* grad_psi,
1265  double* boundaryNormals,
1266  double* boundaryJacobians,
1267  int* l2g,
1268  double* nodeArray,
1269  double* jacobianInverseArray,
1270  double* metricTensorArray,
1271  double* metricTensorDeterminantSqrtArray,
1272  double* unitNormalArray)
1273 {
1274  int eN,ebN,k,j,j_global;
1275  const int X=0,
1276  XX=0;
1277  double *jacInv=NULL,*mt,*mtDetSqrt,*n,*grad=NULL,*node=NULL;
1278  register double emj=0.0,ebmj=0.0;
1279  for(eN=0;eN<nElements_global;eN++)
1280  for(ebN=0;ebN<nElementBoundaries_element;ebN++)
1281  for(k=0;k<nQuadraturePoints_element;k++)
1282  {
1283  emj = 0.0;
1284  ebmj = 0.0;
1285  jacInv = jacobianInverseArray +
1286  eN*nElementBoundaries_element*nQuadraturePoints_element+
1287  ebN*nQuadraturePoints_element+
1288  k;
1289  mt = metricTensorArray +
1290  eN*nElementBoundaries_element*nQuadraturePoints_element+
1291  ebN*nQuadraturePoints_element+
1292  k;
1293  mtDetSqrt = metricTensorDeterminantSqrtArray +
1294  eN*nElementBoundaries_element*nQuadraturePoints_element+
1295  ebN*nQuadraturePoints_element+
1296  k;
1297  n = unitNormalArray+
1298  eN*nElementBoundaries_element*nQuadraturePoints_element+
1299  ebN*nQuadraturePoints_element+
1300  k;
1301  for(j=0;j<nDOF_element;j++)
1302  {
1303  j_global = l2g[eN*nDOF_element+
1304  j];
1305  grad = grad_psi + ebN*nQuadraturePoints_element*nDOF_element+k*nDOF_element + j;
1306  /* nodes are always 3D */
1307  node = nodeArray + j_global*3;
1308  emj += node[X]*grad[X];
1309  }
1310  jacInv[XX] = 1.0/(emj);
1311  mt[XX] = 1.0;
1312  *mtDetSqrt=1.0;
1313  n[X] = boundaryNormals[ebN];
1314  }
1315 }
1316 
1318  int nDOF_element,
1319  int nExteriorElementBoundaries_global,
1320  const int * exteriorElementBoundariesArray,
1321  const int * elementBoundaryElementsArray,
1322  const int * elementBoundaryLocalElementBoundariesArray,
1323  double* grad_psi,
1324  double* boundaryNormals,
1325  double* boundaryJacobians,
1326  int* l2g,
1327  double* nodeArray,
1328  double* jacobianInverseArray,
1329  double* metricTensorArray,
1330  double* metricTensorDeterminantSqrtArray,
1331  double* unitNormalArray)
1332 {
1333  int eN,ebN,ebNE,ebN_local,k,j,j_global;
1334  const int X=0,
1335  XX=0;
1336  double *jacInv=NULL,*mt,*mtDetSqrt,*n,*grad=NULL,*node=NULL;
1337  register double emj=0.0,ebmj=0.0;
1338  for(ebNE = 0; ebNE < nExteriorElementBoundaries_global; ebNE++)
1339  {
1340  ebN = exteriorElementBoundariesArray[ebNE];
1341  eN = elementBoundaryElementsArray[ebN*2+0];
1342  ebN_local = elementBoundaryLocalElementBoundariesArray[ebN*2+0];
1343  for(k=0;k<nQuadraturePoints_element;k++)
1344  {
1345  emj = 0.0;
1346  ebmj = 0.0;
1347  jacInv = jacobianInverseArray +
1348  ebNE*nQuadraturePoints_element+
1349  k;
1350  mt = metricTensorArray +
1351  ebNE*nQuadraturePoints_element+
1352  k;
1353  mtDetSqrt = metricTensorDeterminantSqrtArray +
1354  ebNE*nQuadraturePoints_element+
1355  k;
1356  n = unitNormalArray+
1357  ebNE*nQuadraturePoints_element+
1358  k;
1359  for(j=0;j<nDOF_element;j++)
1360  {
1361  j_global = l2g[eN*nDOF_element+
1362  j];
1363  grad = grad_psi + ebN_local*nQuadraturePoints_element*nDOF_element+k*nDOF_element + j;
1364  /* nodes are always 3D */
1365  node = nodeArray + j_global*3;
1366  emj += node[X]*grad[X];
1367  }
1368  jacInv[XX] = 1.0/(emj);
1369  mt[XX] = 1.0;
1370  *mtDetSqrt=1.0;
1371  n[X] = boundaryNormals[ebN_local];
1372  }
1373  }
1374 }
1376  int nDOF_element,
1377  int nExteriorElementBoundaries_global,
1378  const int * exteriorElementBoundariesArray,
1379  const int * elementBoundaryElementsArray,
1380  const int * elementBoundaryLocalElementBoundariesArray,
1381  double* grad_psi,
1382  double* boundaryNormals,
1383  double* boundaryJacobians,
1384  int* l2g,
1385  double* nodeArray,
1386  double* jacobianInverseArray,
1387  double* metricTensorArray,
1388  double* metricTensorDeterminantSqrtArray,
1389  double* unitNormalArray)
1390 {
1391  int eN,ebN,ebNE,ebN_local,k,j,j_global;
1392  const int X=0,Y=1,
1393  XX=0,XY=1,
1394  YX=2,YY=3;
1395  double *jacInv=NULL,*mt,*mtDetSqrt,*n,*grad=NULL,*node=NULL,*bn,*bj;
1396  register double oneOverJacDet=0.0,oneOverNbn=0.0;
1397  double emj[4],ebmj[2];
1398  for(ebNE = 0; ebNE < nExteriorElementBoundaries_global; ebNE++)
1399  {
1400  ebN = exteriorElementBoundariesArray[ebNE];
1401  eN = elementBoundaryElementsArray[ebN*2+0];
1402  ebN_local = elementBoundaryLocalElementBoundariesArray[ebN*2+0];
1403  for(k=0;k<nQuadraturePoints_element;k++)
1404  {
1405  emj[XX] = 0.0;
1406  emj[XY] = 0.0;
1407  emj[YX] = 0.0;
1408  emj[YY] = 0.0;
1409  ebmj[XX] = 0.0;
1410  ebmj[XY] = 0.0;
1411  jacInv = jacobianInverseArray +
1412  ebNE*nQuadraturePoints_element*4+
1413  k*4;
1414  mt = metricTensorArray +
1415  ebNE*nQuadraturePoints_element+
1416  k;
1417  mtDetSqrt = metricTensorDeterminantSqrtArray +
1418  ebNE*nQuadraturePoints_element+
1419  k;
1420  n = unitNormalArray+
1421  ebNE*nQuadraturePoints_element*2+
1422  k*2;
1423  bn = boundaryNormals + ebN_local*2;
1424  bj = boundaryJacobians + ebN_local*2;
1425  for(j=0;j<nDOF_element;j++)
1426  {
1427  j_global = l2g[eN*nDOF_element+
1428  j];
1429  grad = grad_psi + ebN_local*nQuadraturePoints_element*nDOF_element*2+k*nDOF_element*2 + j*2;
1430  /* nodes are always 3D */
1431  node = nodeArray + j_global*3;
1432  emj[XX] += node[X]*grad[X];
1433  emj[XY] += node[X]*grad[Y];
1434  emj[YX] += node[Y]*grad[X];
1435  emj[YY] += node[Y]*grad[Y];
1436  }
1437  oneOverJacDet = 1.0/(emj[XX]*emj[YY]- emj[XY]*emj[YX]);
1438  jacInv[XX] = oneOverJacDet*emj[YY];
1439  jacInv[YX] = -oneOverJacDet*emj[YX];
1440  jacInv[XY] = -oneOverJacDet*emj[XY];
1441  jacInv[YY] = oneOverJacDet*emj[XX];
1442  ebmj[X] = emj[XX]*bj[XX]+emj[XY]*bj[Y];
1443  ebmj[Y] = emj[YX]*bj[X]+emj[YY]*bj[Y];
1444  mt[X] = ebmj[X]*ebmj[X]+ebmj[Y]*ebmj[Y];
1445  *mtDetSqrt=sqrt(mt[XX]);
1446  n[X] = jacInv[XX]*bn[X]+jacInv[YX]*bn[Y];
1447  n[Y] = jacInv[XY]*bn[X]+jacInv[YY]*bn[Y];
1448  oneOverNbn= 1.0/sqrt(n[X]*n[X]+n[Y]*n[Y]);
1449  n[X] *= oneOverNbn;
1450  n[Y] *= oneOverNbn;
1451  }
1452  }
1453 }
1454 
1456  int nDOF_element,
1457  int nExteriorElementBoundaries_global,
1458  const int * exteriorElementBoundariesArray,
1459  const int * elementBoundaryElementsArray,
1460  const int * elementBoundaryLocalElementBoundariesArray,
1461  double* xtArray,
1462  double* grad_psi,
1463  double* boundaryNormals,
1464  double* boundaryJacobians,
1465  int* l2g,
1466  double* nodeArray,
1467  double* jacobianInverseArray,
1468  double* metricTensorArray,
1469  double* metricTensorDeterminantSqrtArray,
1470  double* unitNormalArray)
1471 {
1472  int eN,ebN,ebNE,ebN_local,k,j,j_global;
1473  const int X=0,Y=1,
1474  XX=0,XY=1,
1475  YX=2,YY=3;
1476  double *jacInv=NULL,*mt,*mtDetSqrt,*n,*grad=NULL,*node=NULL,*bn,*bj,*xt;
1477  register double oneOverJacDet=0.0,oneOverNbn=0.0,xt_dot_xt,xt_dot_n,xt_dot_bj;
1478  double emj[4],ebmj[2];
1479  for(ebNE = 0; ebNE < nExteriorElementBoundaries_global; ebNE++)
1480  {
1481  ebN = exteriorElementBoundariesArray[ebNE];
1482  eN = elementBoundaryElementsArray[ebN*2+0];
1483  ebN_local = elementBoundaryLocalElementBoundariesArray[ebN*2+0];
1484  for(k=0;k<nQuadraturePoints_element;k++)
1485  {
1486  emj[XX] = 0.0;
1487  emj[XY] = 0.0;
1488  emj[YX] = 0.0;
1489  emj[YY] = 0.0;
1490  ebmj[XX] = 0.0;
1491  ebmj[XY] = 0.0;
1492  jacInv = jacobianInverseArray +
1493  ebNE*nQuadraturePoints_element*4+
1494  k*4;
1495  mt = metricTensorArray +
1496  ebNE*nQuadraturePoints_element+
1497  k;
1498  mtDetSqrt = metricTensorDeterminantSqrtArray +
1499  ebNE*nQuadraturePoints_element+
1500  k;
1501  n = unitNormalArray+
1502  ebNE*nQuadraturePoints_element*2+
1503  k*2;
1504  xt = xtArray+
1505  ebNE*nQuadraturePoints_element*3+
1506  k*3;
1507  bn = boundaryNormals + ebN_local*2;
1508  bj = boundaryJacobians + ebN_local*2;
1509  for(j=0;j<nDOF_element;j++)
1510  {
1511  j_global = l2g[eN*nDOF_element+
1512  j];
1513  grad = grad_psi + ebN_local*nQuadraturePoints_element*nDOF_element*2+k*nDOF_element*2 + j*2;
1514  /* nodes are always 3D */
1515  node = nodeArray + j_global*3;
1516  emj[XX] += node[X]*grad[X];
1517  emj[XY] += node[X]*grad[Y];
1518  emj[YX] += node[Y]*grad[X];
1519  emj[YY] += node[Y]*grad[Y];
1520  }
1521  oneOverJacDet = 1.0/(emj[XX]*emj[YY]- emj[XY]*emj[YX]);
1522  jacInv[XX] = oneOverJacDet*emj[YY];
1523  jacInv[YX] = -oneOverJacDet*emj[YX];
1524  jacInv[XY] = -oneOverJacDet*emj[XY];
1525  jacInv[YY] = oneOverJacDet*emj[XX];
1526  ebmj[X] = emj[XX]*bj[XX]+emj[XY]*bj[Y];
1527  ebmj[Y] = emj[YX]*bj[X]+emj[YY]*bj[Y];
1528  mt[X] = ebmj[X]*ebmj[X]+ebmj[Y]*ebmj[Y];
1529  n[X] = jacInv[XX]*bn[X]+jacInv[YX]*bn[Y];
1530  n[Y] = jacInv[XY]*bn[X]+jacInv[YY]*bn[Y];
1531  oneOverNbn= 1.0/sqrt(n[X]*n[X]+n[Y]*n[Y]);
1532  n[X] *= oneOverNbn;
1533  n[Y] *= oneOverNbn;
1534  xt_dot_xt = xt[X]*xt[X]+xt[Y]*xt[Y];
1535  xt_dot_bj = xt[X]*ebmj[X]+xt[Y]*ebmj[Y];
1536  xt_dot_n = xt[X]*n[X]+xt[Y]*n[Y];
1537  //printf("%12.5e %12.5e %12.5e\n",xt_dot_xt,xt_dot_bj,xt_dot_n);
1538  *mtDetSqrt=sqrt(((1.0+xt_dot_xt)*mt[X] - xt_dot_bj*xt_dot_bj)/(1.0+xt_dot_n*xt_dot_n));// sqrt(det(G^t G))/sqrt(1 + (xt^t n)^2)
1539  }
1540  }
1541 }
1543  int nDOF_element,
1544  int nExteriorElementBoundaries_global,
1545  const int * exteriorElementBoundariesArray,
1546  const int * elementBoundaryElementsArray,
1547  const int * elementBoundaryLocalElementBoundariesArray,
1548  double* grad_psi,
1549  double* boundaryNormals,
1550  double* boundaryJacobians,
1551  int* l2g,
1552  double* nodeArray,
1553  double* jacobianInverseArray,
1554  double* metricTensorArray,
1555  double* metricTensorDeterminantSqrtArray,
1556  double* unitNormalArray)
1557 {
1558  int eN,ebN,ebNE,ebN_local,k,j,j_global;
1559  const int
1560  X=0,Y=1,Z=2,
1561  XX=0,XY=1,XZ=2,
1562  YX=3,YY=4,YZ=5,
1563  ZX=6,ZY=7,ZZ=8,
1564  XHX=0,XHY=1,
1565  YHX=2,YHY=3,
1566  ZHX=4,ZHY=5,
1567  HXHX=0,HXHY=1,
1568  HYHX=2,HYHY=3;
1569  double *jacInv=NULL,*mt=NULL,*mtDetSqrt=NULL,*n=NULL,*grad=NULL,*node=NULL,*bn,*bj;
1570  register double oneOverJacDet=0.0,oneOverNbn=0.0;
1571  double emj[9],ebmj[6];
1572  for(ebNE = 0; ebNE < nExteriorElementBoundaries_global; ebNE++)
1573  {
1574  ebN = exteriorElementBoundariesArray[ebNE];
1575  eN = elementBoundaryElementsArray[ebN*2+0];
1576  ebN_local = elementBoundaryLocalElementBoundariesArray[ebN*2+0];
1577  for(k=0;k<nQuadraturePoints_element;k++)
1578  {
1579  emj[XX] = 0.0;
1580  emj[XY] = 0.0;
1581  emj[XZ] = 0.0;
1582  emj[YX] = 0.0;
1583  emj[YY] = 0.0;
1584  emj[YZ] = 0.0;
1585  emj[ZX] = 0.0;
1586  emj[ZY] = 0.0;
1587  emj[ZZ] = 0.0;
1588  ebmj[XHX] = 0.0;
1589  ebmj[XHY] = 0.0;
1590  ebmj[YHX] = 0.0;
1591  ebmj[YHY] = 0.0;
1592  ebmj[ZHX] = 0.0;
1593  ebmj[ZHY] = 0.0;
1594  jacInv = jacobianInverseArray +
1595  ebNE*nQuadraturePoints_element*9+
1596  k*9;
1597  mt = metricTensorArray +
1598  ebNE*nQuadraturePoints_element*4+
1599  k*4;
1600  mtDetSqrt = metricTensorDeterminantSqrtArray +
1601  ebNE*nQuadraturePoints_element+
1602  k;
1603  n = unitNormalArray+
1604  ebNE*nQuadraturePoints_element*3+
1605  k*3;
1606  bn = boundaryNormals + ebN_local*3;
1607  bj = boundaryJacobians + ebN_local*6;
1608  for(j=0;j<nDOF_element;j++)
1609  {
1610  j_global = l2g[eN*nDOF_element+
1611  j];
1612  grad = grad_psi + ebN_local*nQuadraturePoints_element*nDOF_element*3+k*nDOF_element*3 + j*3;
1613  /* nodes are always 3D */
1614  node = nodeArray + j_global*3;
1615  emj[XX] += node[X]*grad[X];
1616  emj[XY] += node[X]*grad[Y];
1617  emj[XZ] += node[X]*grad[Z];
1618  emj[YX] += node[Y]*grad[X];
1619  emj[YY] += node[Y]*grad[Y];
1620  emj[YZ] += node[Y]*grad[Z];
1621  emj[ZX] += node[Z]*grad[X];
1622  emj[ZY] += node[Z]*grad[Y];
1623  emj[ZZ] += node[Z]*grad[Z];
1624  }
1625  oneOverJacDet = 1.0/(emj[XX]*(emj[YY]*emj[ZZ] - emj[YZ]*emj[ZY]) -
1626  emj[XY]*(emj[YX]*emj[ZZ] - emj[YZ]*emj[ZX]) +
1627  emj[XZ]*(emj[YX]*emj[ZY] - emj[YY]*emj[ZX]));
1628  jacInv[XX] = oneOverJacDet*(emj[YY]*emj[ZZ] - emj[YZ]*emj[ZY]);
1629  jacInv[YX] = oneOverJacDet*(emj[YZ]*emj[ZX] - emj[YX]*emj[ZZ]);
1630  jacInv[ZX] = oneOverJacDet*(emj[YX]*emj[ZY] - emj[YY]*emj[ZX]);
1631  jacInv[XY] = oneOverJacDet*(emj[ZY]*emj[XZ] - emj[ZZ]*emj[XY]);
1632  jacInv[YY] = oneOverJacDet*(emj[ZZ]*emj[XX] - emj[ZX]*emj[XZ]);
1633  jacInv[ZY] = oneOverJacDet*(emj[ZX]*emj[XY] - emj[ZY]*emj[XX]);
1634  jacInv[XZ] = oneOverJacDet*(emj[XY]*emj[YZ] - emj[XZ]*emj[YY]);
1635  jacInv[YZ] = oneOverJacDet*(emj[XZ]*emj[YX] - emj[XX]*emj[YZ]);
1636  jacInv[ZZ] = oneOverJacDet*(emj[XX]*emj[YY] - emj[XY]*emj[YX]);
1637 
1638  ebmj[XHX] = emj[XX]*bj[XHX]+emj[XY]*bj[YHX]+emj[XZ]*bj[ZHX];
1639  ebmj[XHY] = emj[XX]*bj[XHY]+emj[XY]*bj[YHY]+emj[XZ]*bj[ZHY];
1640  ebmj[YHX] = emj[YX]*bj[XHX]+emj[YY]*bj[YHX]+emj[YZ]*bj[ZHX];
1641  ebmj[YHY] = emj[YX]*bj[XHY]+emj[YY]*bj[YHY]+emj[YZ]*bj[ZHY];
1642  ebmj[ZHX] = emj[ZX]*bj[XHX]+emj[ZY]*bj[YHX]+emj[ZZ]*bj[ZHX];
1643  ebmj[ZHY] = emj[ZX]*bj[XHY]+emj[ZY]*bj[YHY]+emj[ZZ]*bj[ZHY];
1644 
1645  mt[HXHX] = ebmj[XHX]*ebmj[XHX]+ebmj[YHX]*ebmj[YHX]+ebmj[ZHX]*ebmj[ZHX];
1646  mt[HXHY] = ebmj[XHX]*ebmj[XHY]+ebmj[YHX]*ebmj[YHY]+ebmj[ZHX]*ebmj[ZHY];
1647  mt[HYHX] = ebmj[XHY]*ebmj[XHX]+ebmj[YHY]*ebmj[YHX]+ebmj[ZHY]*ebmj[ZHX];
1648  mt[HYHY] = ebmj[XHY]*ebmj[XHY]+ebmj[YHY]*ebmj[YHY]+ebmj[ZHY]*ebmj[ZHY];
1649 
1650  *mtDetSqrt=sqrt(mt[HXHX]*mt[HYHY]- mt[HXHY]*mt[HYHX]);
1651 
1652 
1653  n[X] = (jacInv[XX]*bn[X]+jacInv[YX]*bn[Y]+jacInv[ZX]*bn[Z]);
1654  n[Y] = (jacInv[XY]*bn[X]+jacInv[YY]*bn[Y]+jacInv[ZY]*bn[Z]);
1655  n[Z] = (jacInv[XZ]*bn[X]+jacInv[YZ]*bn[Y]+jacInv[ZZ]*bn[Z]);
1656 
1657  oneOverNbn = 1.0/sqrt(n[X]*n[X]+n[Y]*n[Y]+n[Z]*n[Z]);
1658 
1659  n[X] *= oneOverNbn;
1660  n[Y] *= oneOverNbn;
1661  n[Z] *= oneOverNbn;
1662 
1663  }
1664  }
1665 }
1666 
1698 void updateMass_weak(int nElements_global,
1699  int nQuadraturePoints_element,
1700  int nDOF_test_element,
1701  double* mt,
1702  double* w_dV,
1703  double* weak_residual)
1704 {
1705  int eN,i,k;
1706  for(eN=0;eN<nElements_global;eN++)
1707  for (i=0;i<nDOF_test_element;i++)
1708  for (k=0;k<nQuadraturePoints_element;k++)
1709  weak_residual[eN*nDOF_test_element +
1710  i]
1711  +=
1712  mt[eN*nQuadraturePoints_element +
1713  k]
1714  *
1715  w_dV[eN*nQuadraturePoints_element*nDOF_test_element +
1716  k*nDOF_test_element +
1717  i];
1718 }
1719 
1759 void updateMassJacobian_weak(int nElements_global,
1760  int nQuadraturePoints_element,
1761  int nDOF_trial_element,
1762  int nDOF_test_element,
1763  double* dmt,
1764  double* v_X_w_dV,
1765  double* jacobian_weak_residual)
1766 {
1767  int eN,i,j,k,nDOF_test_X_trial_element=nDOF_trial_element*nDOF_test_element;
1768  for(eN=0;eN<nElements_global;eN++)
1769  for (i=0;i<nDOF_test_element;i++)
1770  for (k=0;k<nQuadraturePoints_element;k++)
1771  for (j=0;j<nDOF_trial_element;j++)
1772  jacobian_weak_residual[eN*nDOF_test_X_trial_element +
1773  i*nDOF_trial_element+
1774  j]
1775  +=
1776  dmt[eN*nQuadraturePoints_element +
1777  k]
1778  *
1779  v_X_w_dV[eN*nQuadraturePoints_element*nDOF_test_X_trial_element +
1780  k*nDOF_test_X_trial_element +
1781  j*nDOF_test_element+
1782  i];
1783 }
1784 
1785 void updateMassJacobian_weak_lowmem(int nElements_global,
1786  int nQuadraturePoints_element,
1787  int nDOF_trial_element,
1788  int nDOF_test_element,
1789  double* dmt,
1790  double* v,
1791  double* w_dV,
1792  double* jacobian_weak_residual)
1793 {
1794  int eN,i,j,k,nDOF_test_X_trial_element=nDOF_trial_element*nDOF_test_element;
1795  for(eN=0;eN<nElements_global;eN++)
1796  for (i=0;i<nDOF_test_element;i++)
1797  for (k=0;k<nQuadraturePoints_element;k++)
1798  for (j=0;j<nDOF_trial_element;j++)
1799  jacobian_weak_residual[eN*nDOF_test_X_trial_element +
1800  i*nDOF_trial_element+
1801  j]
1802  +=
1803  dmt[eN*nQuadraturePoints_element +
1804  k]
1805  *
1806  v[eN*nQuadraturePoints_element*nDOF_trial_element +
1807  k*nDOF_trial_element +
1808  j]
1809  *
1810  w_dV[eN*nQuadraturePoints_element*nDOF_test_element +
1811  k*nDOF_test_element +
1812  i];
1813 }
1814 
1834 void updateMass_strong(int nElements_global,
1835  int nQuadraturePoints_element,
1836  double* mt,
1837  double* strong_residual)
1838 {
1839  int eN,k;
1840  for(eN=0;eN<nElements_global;eN++)
1841  for (k=0;k<nQuadraturePoints_element;k++)
1842  strong_residual[eN*nQuadraturePoints_element+
1843  k]
1844  +=
1845  mt[eN*nQuadraturePoints_element+
1846  k];
1847 }
1848 
1873 void updateMassJacobian_strong(int nElements_global,
1874  int nQuadraturePoints_element,
1875  int nDOF_trial_element,
1876  double* dmt,
1877  double* v,
1878  double* dstrong_residual)
1879 {
1880  int eN,k,j;
1881  for(eN=0;eN<nElements_global;eN++)
1882  for(j=0;j<nDOF_trial_element;j++)
1883  for (k=0;k<nQuadraturePoints_element;k++)
1884  dstrong_residual[eN*nQuadraturePoints_element*nDOF_trial_element+
1885  k*nDOF_trial_element +
1886  j]
1887  +=
1888  dmt[eN*nQuadraturePoints_element+
1889  k]
1890  *
1891  v[eN*nQuadraturePoints_element*nDOF_trial_element+
1892  k*nDOF_trial_element +
1893  j];
1894 }
1895 
1921 void updateMass_adjoint(int nElements_global,
1922  int nQuadraturePoints_element,
1923  int nDOF_test_element,
1924  double* dmt,
1925  double* w_dV,
1926  double* Lstar_w_dV)
1927 {
1928  int eN,i,k;
1929  for(eN=0;eN<nElements_global;eN++)
1930  for (i=0;i<nDOF_test_element;i++)
1931  for (k=0;k<nQuadraturePoints_element;k++)
1932  Lstar_w_dV[eN*nQuadraturePoints_element*nDOF_test_element +
1933  k*nDOF_test_element +
1934  i]
1935  +=
1936  dmt[eN*nQuadraturePoints_element +
1937  k]
1938  *
1939  w_dV[eN*nQuadraturePoints_element*nDOF_test_element +
1940  k*nDOF_test_element +
1941  i];
1942 }
1943 
1944 
1985 void updateAdvection_weak(int nElements_global,
1986  int nQuadraturePoints_element,
1987  int nDOF_test_element,
1988  int nSpace,
1989  double* f,
1990  double* grad_w_dV,
1991  double* weak_residual)
1992 {
1993  int eN,i,k,I;
1994  for(eN=0;eN<nElements_global;eN++)
1995  for (i=0;i<nDOF_test_element;i++)
1996  for (k=0;k<nQuadraturePoints_element;k++)
1997  for (I=0;I<nSpace;I++)
1998  weak_residual[eN*nDOF_test_element +
1999  i]
2000  -=
2001  f[eN*nQuadraturePoints_element*nSpace +
2002  k*nSpace +
2003  I]
2004  *
2005  grad_w_dV[eN*nQuadraturePoints_element*nDOF_test_element*nSpace +
2006  k*nDOF_test_element*nSpace +
2007  i*nSpace +
2008  I];
2009 }
2010 
2055 void updateAdvectionJacobian_weak(int nElements_global,
2056  int nQuadraturePoints_element,
2057  int nDOF_trial_element,
2058  int nDOF_test_element,
2059  int nSpace,
2060  double* df,
2061  double* v_X_grad_w_dV,
2062  double* jacobian_weak_residual)
2063 {
2064  int eN,i,j,k,I,nDOF_test_X_trial_element=nDOF_trial_element*nDOF_test_element;
2065  for(eN=0;eN<nElements_global;eN++)
2066  for (i=0;i<nDOF_test_element;i++)
2067  for (k=0;k<nQuadraturePoints_element;k++)
2068  for (j=0;j<nDOF_trial_element;j++)
2069  for (I=0;I<nSpace;I++)
2070  jacobian_weak_residual[eN*nDOF_test_X_trial_element +
2071  i*nDOF_trial_element+
2072  j]
2073  -=
2074  df[eN*nQuadraturePoints_element*nSpace +
2075  k*nSpace +
2076  I]
2077  *
2078  v_X_grad_w_dV[eN*nQuadraturePoints_element*nDOF_test_X_trial_element*nSpace +
2079  k*nDOF_test_X_trial_element*nSpace +
2080  j*nDOF_test_element*nSpace +
2081  i*nSpace +
2082  I];
2083 }
2084 
2085 void updateAdvectionJacobian_weak_lowmem(int nElements_global,
2086  int nQuadraturePoints_element,
2087  int nDOF_trial_element,
2088  int nDOF_test_element,
2089  int nSpace,
2090  double* df,
2091  double* v,
2092  double* grad_w_dV,
2093  double* jacobian_weak_residual)
2094 {
2095  int eN,i,j,k,I,nDOF_test_X_trial_element=nDOF_trial_element*nDOF_test_element;
2096  for(eN=0;eN<nElements_global;eN++)
2097  for (i=0;i<nDOF_test_element;i++)
2098  for (k=0;k<nQuadraturePoints_element;k++)
2099  for (j=0;j<nDOF_trial_element;j++)
2100  for (I=0;I<nSpace;I++)
2101  jacobian_weak_residual[eN*nDOF_test_X_trial_element +
2102  i*nDOF_trial_element+
2103  j]
2104  -=
2105  df[eN*nQuadraturePoints_element*nSpace +
2106  k*nSpace +
2107  I]
2108  *
2109  v[eN*nQuadraturePoints_element*nDOF_trial_element +
2110  k*nDOF_trial_element +
2111  j]
2112  *
2113  grad_w_dV[eN*nQuadraturePoints_element*nDOF_test_element*nSpace +
2114  k*nDOF_test_element*nSpace +
2115  i*nSpace +
2116  I];
2117 }
2118 
2143 void updateAdvection_strong(int nElements_global,
2144  int nQuadraturePoints_element,
2145  int nSpace,
2146  double* df,
2147  double* grad_u,
2148  double* strong_residual)
2149 {
2150  int eN,k,I;
2151  for(eN=0;eN<nElements_global;eN++)
2152  for (k=0;k<nQuadraturePoints_element;k++)
2153  for(I=0;I<nSpace;I++)
2154  strong_residual[eN*nQuadraturePoints_element+
2155  k]
2156  +=
2157  df[eN*nQuadraturePoints_element*nSpace +
2158  k*nSpace +
2159  I]
2160  *
2161  grad_u[eN*nQuadraturePoints_element*nSpace +
2162  k*nSpace +
2163  I];
2164 }
2165 
2190 void updateAdvectionJacobian_strong(int nElements_global,
2191  int nQuadraturePoints_element,
2192  int nDOF_trial_element,
2193  int nSpace,
2194  double* df,
2195  double* grad_v,
2196  double* dstrong_residual)
2197 {
2198  int eN,k,j,I;
2199  for(eN=0;eN<nElements_global;eN++)
2200  for(j=0;j<nDOF_trial_element;j++)
2201  for (k=0;k<nQuadraturePoints_element;k++)
2202  for (I=0;I<nSpace;I++)
2203  dstrong_residual[eN*nQuadraturePoints_element*nDOF_trial_element+
2204  k*nDOF_trial_element +
2205  j]
2206  +=
2207  df[eN*nQuadraturePoints_element*nSpace +
2208  k*nSpace +
2209  I]
2210  *
2211  grad_v[eN*nQuadraturePoints_element*nSpace*nDOF_trial_element +
2212  k*nSpace*nDOF_trial_element +
2213  j*nSpace+
2214  I];
2215 }
2216 
2247 void updateAdvection_adjoint(int nElements_global,
2248  int nQuadraturePoints_element,
2249  int nDOF_test_element,
2250  int nSpace,
2251  double* df,
2252  double* grad_w_dV,
2253  double* Lstar_w_dV)
2254 {
2255  int eN,i,k,I;
2256  for(eN=0;eN<nElements_global;eN++)
2257  for (i=0;i<nDOF_test_element;i++)
2258  for (k=0;k<nQuadraturePoints_element;k++)
2259  for (I=0;I<nSpace;I++)
2260  Lstar_w_dV[eN*nQuadraturePoints_element*nDOF_test_element +
2261  k*nDOF_test_element +
2262  i]
2263  -=
2264  df[eN*nQuadraturePoints_element*nSpace +
2265  k*nSpace +
2266  I]
2267  *
2268  grad_w_dV[eN*nQuadraturePoints_element*nDOF_test_element*nSpace +
2269  k*nDOF_test_element*nSpace +
2270  i*nSpace +
2271  I];
2272 }
2273 
2306 void updateHamiltonian_weak(int nElements_global,
2307  int nQuadraturePoints_element,
2308  int nDOF_test_element,
2309  double* H,
2310  double* w_dV,
2311  double* weak_residual)
2312 {
2313  int eN,i,k;
2314  for(eN=0;eN<nElements_global;eN++)
2315  for (i=0;i<nDOF_test_element;i++)
2316  for (k=0;k<nQuadraturePoints_element;k++)
2317  weak_residual[eN*nDOF_test_element + i]
2318  +=
2319  H[eN*nQuadraturePoints_element +
2320  k]
2321  *
2322  w_dV[eN*nQuadraturePoints_element*nDOF_test_element +
2323  k*nDOF_test_element +
2324  i];
2325 }
2326 
2372 void updateHamiltonianJacobian_weak(int nElements_global,
2373  int nQuadraturePoints_element,
2374  int nDOF_trial_element,
2375  int nDOF_test_element,
2376  int nSpace,
2377  double* dH,
2378  double* grad_v_X_w_dV,
2379  double* jacobian_weak_residual)
2380 {
2381  int eN,i,j,k,I,nDOF_test_X_trial_element=nDOF_test_element*nDOF_trial_element;
2382  for(eN=0;eN<nElements_global;eN++)
2383  for (i=0;i<nDOF_test_element;i++)
2384  for (k=0;k<nQuadraturePoints_element;k++)
2385  for (j=0;j<nDOF_trial_element;j++)
2386  for (I=0;I<nSpace;I++)
2387  jacobian_weak_residual[eN*nDOF_test_X_trial_element +
2388  i*nDOF_trial_element +
2389  j]
2390  +=
2391  dH[eN*nQuadraturePoints_element*nSpace +
2392  k*nSpace+
2393  I]
2394  *
2395  grad_v_X_w_dV[eN*nQuadraturePoints_element*nDOF_test_X_trial_element*nSpace +
2396  k*nDOF_test_X_trial_element*nSpace +
2397  j*nDOF_test_element*nSpace +
2398  i*nSpace+
2399  I];
2400 }
2401 
2402 void updateHamiltonianJacobian_weak_lowmem(int nElements_global,
2403  int nQuadraturePoints_element,
2404  int nDOF_trial_element,
2405  int nDOF_test_element,
2406  int nSpace,
2407  double* dH,
2408  double* grad_v,
2409  double* w_dV,
2410  double* jacobian_weak_residual)
2411 {
2412  int eN,i,j,k,I,nDOF_test_X_trial_element=nDOF_test_element*nDOF_trial_element;
2413  for(eN=0;eN<nElements_global;eN++)
2414  for (i=0;i<nDOF_test_element;i++)
2415  for (k=0;k<nQuadraturePoints_element;k++)
2416  for (j=0;j<nDOF_trial_element;j++)
2417  for (I=0;I<nSpace;I++)
2418  jacobian_weak_residual[eN*nDOF_test_X_trial_element +
2419  i*nDOF_trial_element +
2420  j]
2421  +=
2422  dH[eN*nQuadraturePoints_element*nSpace +
2423  k*nSpace+
2424  I]
2425  *
2426  grad_v[eN*nQuadraturePoints_element*nDOF_trial_element*nSpace +
2427  k*nDOF_trial_element*nSpace +
2428  j*nSpace +
2429  I]
2430  *
2431  w_dV[eN*nQuadraturePoints_element*nDOF_test_element +
2432  k*nDOF_test_element +
2433  i];
2434 }
2435 
2462 void updateHamiltonian_strong(int nElements_global,
2463  int nQuadraturePoints_element,
2464  int nSpace,
2465  double* dH,
2466  double* grad_u,
2467  double* strong_residual)
2468 {
2469  int eN,k,I;
2470  for(eN=0;eN<nElements_global;eN++)
2471  for (k=0;k<nQuadraturePoints_element;k++)
2472  for (I=0;I<nSpace;I++)
2473  strong_residual[eN*nQuadraturePoints_element+k]
2474  +=
2475  dH[eN*nQuadraturePoints_element*nSpace+
2476  k*nSpace+
2477  I]
2478  *
2479  grad_u[eN*nQuadraturePoints_element*nSpace+
2480  k*nSpace+
2481  I];
2482 }
2483 
2508 void updateHamiltonianJacobian_strong(int nElements_global,
2509  int nQuadraturePoints_element,
2510  int nDOF_trial_element,
2511  int nSpace,
2512  double* dH,
2513  double* grad_v,
2514  double* dstrong_residual)
2515 {
2516  int eN,k,j,I;
2517  for(eN=0;eN<nElements_global;eN++)
2518  for(j=0;j<nDOF_trial_element;j++)
2519  for (k=0;k<nQuadraturePoints_element;k++)
2520  for (I=0;I<nSpace;I++)
2521  dstrong_residual[eN*nQuadraturePoints_element*nDOF_trial_element+
2522  k*nDOF_trial_element +
2523  j]
2524  +=
2525  dH[eN*nQuadraturePoints_element*nSpace+
2526  k*nSpace+
2527  I]
2528  *
2529  grad_v[eN*nQuadraturePoints_element*nDOF_trial_element*nSpace+
2530  k*nDOF_trial_element*nSpace +
2531  j*nSpace +
2532  I];
2533 }
2534 
2566 void updateHamiltonian_adjoint(int nElements_global,
2567  int nQuadraturePoints_element,
2568  int nDOF_test_element,
2569  int nSpace,
2570  double* dH,
2571  double* grad_w_dV,
2572  double* Lstar_w_dV)
2573 {
2574  int eN,i,k,I;
2575  for(eN=0;eN<nElements_global;eN++)
2576  for (i=0;i<nDOF_test_element;i++)
2577  for (k=0;k<nQuadraturePoints_element;k++)
2578  for (I=0;I<nSpace;I++)
2579  Lstar_w_dV[eN*nQuadraturePoints_element*nDOF_test_element +
2580  k*nDOF_test_element +
2581  i]
2582  -=
2583  dH[eN*nQuadraturePoints_element*nSpace +
2584  k*nSpace +
2585  I]
2586  *
2587  grad_w_dV[eN*nQuadraturePoints_element*nDOF_test_element*nSpace +
2588  k*nDOF_test_element*nSpace +
2589  i*nSpace +
2590  I];
2591 }
2592 
2633 /*#define SCALAR_DIFFUSION*/
2634 void updateDiffusion_weak(int nElements_global,
2635  int nQuadraturePoints_element,
2636  int nDOF_test_element,
2637  int nSpace,
2638  double* a,
2639  double* grad_phi_X_grad_w_dV,
2640  double* weak_residual)
2641 {
2642  int eN,i,k,I,J,nSpace2=nSpace*nSpace;
2643  for(eN=0;eN<nElements_global;eN++)
2644  for (i=0;i<nDOF_test_element;i++)
2645  for (k=0;k<nQuadraturePoints_element;k++)
2646  for (I=0;I<nSpace;I++)
2647  for (J=0;J<nSpace;J++)
2648  weak_residual[eN*nDOF_test_element + i]
2649  +=
2650  a[eN*nQuadraturePoints_element*nSpace2 +
2651  k*nSpace2 +
2652  I*nSpace +
2653  J]
2654  *
2655  grad_phi_X_grad_w_dV[eN*nQuadraturePoints_element*nDOF_test_element*nSpace2 +
2656  k*nDOF_test_element*nSpace2 +
2657  i*nSpace2+
2658  J*nSpace +
2659  I];
2660 }
2661 
2662 void updateDiffusion_weak_lowmem(int nElements_global,
2663  int nQuadraturePoints_element,
2664  int nDOF_test_element,
2665  int nSpace,
2666  double* a,
2667  double* grad_phi,
2668  double* grad_w_dV,
2669  double* weak_residual)
2670 {
2671  int eN,i,k,I,J,nSpace2=nSpace*nSpace;
2672  for(eN=0;eN<nElements_global;eN++)
2673  for (i=0;i<nDOF_test_element;i++)
2674  for (k=0;k<nQuadraturePoints_element;k++)
2675 #ifdef SCALAR_DIFFUSION
2676  for (I=0;I<nSpace;I++)
2677  {
2678  J=I;
2679  weak_residual[eN*nDOF_test_element + i]
2680  +=
2681  a[eN*nQuadraturePoints_element*nSpace2 +
2682  k*nSpace2]
2683  *
2684  grad_phi[eN*nQuadraturePoints_element*nSpace +
2685  k*nSpace +
2686  J]
2687  *
2688  grad_w_dV[eN*nQuadraturePoints_element*nDOF_test_element*nSpace +
2689  k*nDOF_test_element*nSpace +
2690  i*nSpace+
2691  I];
2692  }
2693 #else
2694  for (I=0;I<nSpace;I++)
2695  for (J=0;J<nSpace;J++)
2696  weak_residual[eN*nDOF_test_element + i]
2697  +=
2698  a[eN*nQuadraturePoints_element*nSpace2 +
2699  k*nSpace2 +
2700  I*nSpace +
2701  J]
2702  *
2703  grad_phi[eN*nQuadraturePoints_element*nSpace +
2704  k*nSpace +
2705  J]
2706  *
2707  grad_w_dV[eN*nQuadraturePoints_element*nDOF_test_element*nSpace +
2708  k*nDOF_test_element*nSpace +
2709  i*nSpace+
2710  I];
2711 #endif
2712 }
2713 
2714 void updateDiffusion_weak_sd(int nElements_global,
2715  int nQuadraturePoints_element,
2716  int nDOF_test_element,
2717  int nSpace,
2718  int* rowptr,
2719  int* colind,
2720  double* a,
2721  double* grad_phi,
2722  double* grad_w_dV,
2723  double* weak_residual)
2724 {
2725  int eN,i,k,I,m,nnz=rowptr[nSpace];
2726  for(eN=0;eN<nElements_global;eN++)
2727  for (i=0;i<nDOF_test_element;i++)
2728  for (k=0;k<nQuadraturePoints_element;k++)
2729  for (I=0;I<nSpace;I++)
2730  for (m=rowptr[I];m<rowptr[I+1];m++)
2731  weak_residual[eN*nDOF_test_element + i]
2732  +=
2733  a[eN*nQuadraturePoints_element*nnz+
2734  k*nnz +
2735  m]
2736  *
2737  grad_phi[eN*nQuadraturePoints_element*nSpace +
2738  k*nSpace +
2739  colind[m]]
2740  *
2741  grad_w_dV[eN*nQuadraturePoints_element*nDOF_test_element*nSpace +
2742  k*nDOF_test_element*nSpace +
2743  i*nSpace+
2744  I];
2745 }
2746 
2819 void updateDiffusionJacobian_weak(int nElements_global,
2820  int nQuadraturePoints_element,
2821  int nDOF_trial_element,
2822  int nDOF_test_element,
2823  int nSpace,
2824  int* l2g,
2825  double* a,
2826  double* da,
2827  double* grad_phi_X_grad_w_dV,
2828  double* dphi,
2829  double* v,
2830  double* grad_v_X_grad_w_dV,
2831  double* jacobian_weak_residual)
2832 {
2833  int eN,i,j,k,I,J,nSpace2=nSpace*nSpace,nDOF_test_X_trial_element=nDOF_test_element*nDOF_trial_element;
2834  double daProduct,dphiProduct;
2835  for(eN=0;eN<nElements_global;eN++)
2836  for (i=0;i<nDOF_test_element;i++)
2837  for (k=0;k<nQuadraturePoints_element;k++)
2838  {
2839  daProduct=0.0;
2840  for (I=0;I<nSpace;I++)
2841  for (J=0;J<nSpace;J++)
2842  daProduct
2843  +=
2844  da[eN*nQuadraturePoints_element*nSpace2 +
2845  k*nSpace2 +
2846  I*nSpace +
2847  J]
2848  *
2849  grad_phi_X_grad_w_dV[eN*nQuadraturePoints_element*nDOF_test_element*nSpace2 +
2850  k*nDOF_test_element*nSpace2 +
2851  i*nSpace2+
2852  J*nSpace +
2853  I];
2854  for (j=0;j<nDOF_trial_element;j++)
2855  {
2856  dphiProduct=0.0;
2857  for (I=0;I<nSpace;I++)
2858  for (J=0;J<nSpace;J++)
2859  dphiProduct
2860  +=
2861  a[eN*nQuadraturePoints_element*nSpace2 +
2862  k*nSpace2+
2863  I*nSpace +
2864  J]
2865  *
2866  grad_v_X_grad_w_dV[eN*nQuadraturePoints_element*nDOF_test_X_trial_element*nSpace2 +
2867  k*nDOF_test_X_trial_element*nSpace2 +
2868  j*nDOF_test_element*nSpace2 +
2869  i*nSpace2 +
2870  J*nSpace +
2871  I];
2872  jacobian_weak_residual[eN*nDOF_test_X_trial_element +
2873  i*nDOF_trial_element +
2874  j]
2875  +=
2876  daProduct
2877  *
2878  v[eN*nQuadraturePoints_element*nDOF_trial_element+
2879  k*nDOF_trial_element+
2880  j]
2881  +
2882  dphiProduct
2883  *
2884  dphi[l2g[eN*nDOF_trial_element +
2885  j]];
2886  }
2887  }
2888 }
2889 
2890 void updateDiffusionJacobian_weak_lowmem(int nElements_global,
2891  int nQuadraturePoints_element,
2892  int nDOF_trial_element,
2893  int nDOF_test_element,
2894  int nSpace,
2895  int* l2g,
2896  double* a,
2897  double* da,
2898  double* grad_phi,
2899  double* grad_w_dV,
2900  double* dphi,
2901  double* v,
2902  double* grad_v,
2903  double* jacobian_weak_residual)
2904 {
2905  int eN,i,j,k,I,J,nSpace2=nSpace*nSpace,nDOF_test_X_trial_element=nDOF_test_element*nDOF_trial_element;
2906  double daProduct,dphiProduct;
2907  for(eN=0;eN<nElements_global;eN++)
2908  for (i=0;i<nDOF_test_element;i++)
2909  for (k=0;k<nQuadraturePoints_element;k++)
2910  {
2911  daProduct=0.0;
2912 #ifdef SCALAR_DIFFUSION
2913  for (I=0;I<nSpace;I++)
2914  {
2915  J=I;
2916  daProduct
2917  +=
2918  da[eN*nQuadraturePoints_element*nSpace2 +
2919  k*nSpace2]
2920  *
2921  grad_phi[eN*nQuadraturePoints_element*nSpace +
2922  k*nSpace +
2923  J]
2924  *
2925  grad_w_dV[eN*nQuadraturePoints_element*nDOF_test_element*nSpace +
2926  k*nDOF_test_element*nSpace +
2927  i*nSpace+
2928  I];
2929  }
2930  for (j=0;j<nDOF_trial_element;j++)
2931  {
2932  dphiProduct=0.0;
2933  for (I=0;I<nSpace;I++)
2934  {
2935  J=I;
2936  dphiProduct
2937  +=
2938  a[eN*nQuadraturePoints_element*nSpace2 +
2939  k*nSpace2]
2940  *
2941  grad_v[eN*nQuadraturePoints_element*nDOF_trial_element*nSpace +
2942  k*nDOF_trial_element*nSpace +
2943  j*nSpace +
2944  J]
2945  *
2946  grad_w_dV[eN*nQuadraturePoints_element*nDOF_test_element*nSpace +
2947  k*nDOF_test_element*nSpace +
2948  i*nSpace +
2949  I];
2950  }
2951  jacobian_weak_residual[eN*nDOF_test_X_trial_element +
2952  i*nDOF_trial_element +
2953  j]
2954  +=
2955  daProduct
2956  *
2957  v[eN*nQuadraturePoints_element*nDOF_trial_element+
2958  k*nDOF_trial_element+
2959  j]
2960  +
2961  dphiProduct
2962  *
2963  dphi[l2g[eN*nDOF_trial_element +
2964  j]];
2965  }
2966 #else
2967  for (I=0;I<nSpace;I++)
2968  for (J=0;J<nSpace;J++)
2969  daProduct
2970  +=
2971  da[eN*nQuadraturePoints_element*nSpace2 +
2972  k*nSpace2 +
2973  I*nSpace +
2974  J]
2975  *
2976  grad_phi[eN*nQuadraturePoints_element*nSpace +
2977  k*nSpace +
2978  J]
2979  *
2980  grad_w_dV[eN*nQuadraturePoints_element*nDOF_test_element*nSpace +
2981  k*nDOF_test_element*nSpace +
2982  i*nSpace+
2983  I];
2984  for (j=0;j<nDOF_trial_element;j++)
2985  {
2986  dphiProduct=0.0;
2987  for (I=0;I<nSpace;I++)
2988  for (J=0;J<nSpace;J++)
2989  dphiProduct
2990  +=
2991  a[eN*nQuadraturePoints_element*nSpace2 +
2992  k*nSpace2+
2993  I*nSpace +
2994  J]
2995  *
2996  grad_v[eN*nQuadraturePoints_element*nDOF_trial_element*nSpace +
2997  k*nDOF_trial_element*nSpace +
2998  j*nSpace +
2999  J]
3000  *
3001  grad_w_dV[eN*nQuadraturePoints_element*nDOF_test_element*nSpace +
3002  k*nDOF_test_element*nSpace +
3003  i*nSpace +
3004  I];
3005  jacobian_weak_residual[eN*nDOF_test_X_trial_element +
3006  i*nDOF_trial_element +
3007  j]
3008  +=
3009  daProduct
3010  *
3011  v[eN*nQuadraturePoints_element*nDOF_trial_element+
3012  k*nDOF_trial_element+
3013  j]
3014  +
3015  dphiProduct
3016  *
3017  dphi[l2g[eN*nDOF_trial_element +
3018  j]];
3019  }
3020 #endif
3021  }
3022 }
3023 void updateDiffusionJacobian_weak_sd(int nElements_global,
3024  int nQuadraturePoints_element,
3025  int nDOF_trial_element,
3026  int nDOF_test_element,
3027  int nSpace,
3028  int* rowptr,
3029  int* colind,
3030  int* l2g,
3031  double* a,
3032  double* da,
3033  double* grad_phi,
3034  double* grad_w_dV,
3035  double* dphi,
3036  double* v,
3037  double* grad_v,
3038  double* jacobian_weak_residual)
3039 {
3040  int eN,i,j,k,I,m,nDOF_test_X_trial_element=nDOF_test_element*nDOF_trial_element,nnz=rowptr[nSpace];
3041  double daProduct,dphiProduct;
3042  for(eN=0;eN<nElements_global;eN++)
3043  for (i=0;i<nDOF_test_element;i++)
3044  for (k=0;k<nQuadraturePoints_element;k++)
3045  {
3046  daProduct=0.0;
3047  for (I=0;I<nSpace;I++)
3048  for (m=rowptr[I];m<rowptr[I+1];m++)
3049  daProduct
3050  +=
3051  da[eN*nQuadraturePoints_element*nnz+
3052  k*nnz +
3053  m]
3054  *
3055  grad_phi[eN*nQuadraturePoints_element*nSpace +
3056  k*nSpace +
3057  colind[m]]
3058  *
3059  grad_w_dV[eN*nQuadraturePoints_element*nDOF_test_element*nSpace +
3060  k*nDOF_test_element*nSpace +
3061  i*nSpace+
3062  I];
3063  for (j=0;j<nDOF_trial_element;j++)
3064  {
3065  dphiProduct=0.0;
3066  for (I=0;I<nSpace;I++)
3067  for(m=rowptr[I];m<rowptr[I+1];m++)
3068  dphiProduct
3069  +=
3070  a[eN*nQuadraturePoints_element*nnz +
3071  k*nnz+
3072  m]
3073  *
3074  grad_v[eN*nQuadraturePoints_element*nDOF_trial_element*nSpace +
3075  k*nDOF_trial_element*nSpace +
3076  j*nSpace +
3077  colind[m]]
3078  *
3079  grad_w_dV[eN*nQuadraturePoints_element*nDOF_test_element*nSpace +
3080  k*nDOF_test_element*nSpace +
3081  i*nSpace +
3082  I];
3083  jacobian_weak_residual[eN*nDOF_test_X_trial_element +
3084  i*nDOF_trial_element +
3085  j]
3086  +=
3087  daProduct
3088  *
3089  v[eN*nQuadraturePoints_element*nDOF_trial_element+
3090  k*nDOF_trial_element+
3091  j]
3092  +
3093  dphiProduct
3094  *
3095  dphi[l2g[eN*nDOF_trial_element +
3096  j]];
3097  }
3098  }
3099 }
3100 
3125 void updateDiffusion_strong(int nElements_global,
3126  int nQuadraturePoints_element,
3127  int nSpace,
3128  double* da,
3129  double* grad_phi,
3130  double* grad_u,
3131  double* strong_residual)
3132 {
3133  int eN,k,I,J,nSpace2=nSpace*nSpace;
3134  for(eN=0;eN<nElements_global;eN++)
3135  for (k=0;k<nQuadraturePoints_element;k++)
3136  for(I=0;I<nSpace;I++)
3137  for (J=0;J<nSpace;J++)
3138  strong_residual[eN*nQuadraturePoints_element+
3139  k]
3140  -=
3141  da[eN*nQuadraturePoints_element*nSpace2 +
3142  k*nSpace2 +
3143  I*nSpace+
3144  J]
3145  *
3146  grad_phi[eN*nQuadraturePoints_element*nSpace +
3147  k*nSpace +
3148  J]
3149  *grad_u[eN*nQuadraturePoints_element*nSpace +
3150  k*nSpace +
3151  I];
3152 }
3153 void updateDiffusion_strong_sd(int nElements_global,
3154  int nQuadraturePoints_element,
3155  int nSpace,
3156  int* rowptr,
3157  int* colind,
3158  double* da,
3159  double* grad_phi,
3160  double* grad_u,
3161  double* strong_residual)
3162 {
3163  int eN,k,I,m,nnz=rowptr[nSpace];
3164  for(eN=0;eN<nElements_global;eN++)
3165  for (k=0;k<nQuadraturePoints_element;k++)
3166  for(I=0;I<nSpace;I++)
3167  for(m=rowptr[I];m<rowptr[I+1];m++)
3168  strong_residual[eN*nQuadraturePoints_element+
3169  k]
3170  -=
3171  da[eN*nQuadraturePoints_element*nnz +
3172  k*nnz+
3173  m]
3174  *
3175  grad_phi[eN*nQuadraturePoints_element*nSpace +
3176  k*nSpace +
3177  colind[m]]
3178  *grad_u[eN*nQuadraturePoints_element*nSpace +
3179  k*nSpace +
3180  I];
3181 }
3182 
3207 void updateDiffusionJacobian_strong(int nElements_global,
3208  int nQuadraturePoints_element,
3209  int nDOF_trial_element,
3210  int nSpace,
3211  int* l2g,
3212  double* da,
3213  double* dphi,
3214  double* grad_phi,
3215  double* grad_u,
3216  double* grad_v,
3217  double* dstrong_residual)
3218 {
3219  int eN,k,j,I,J,nSpace2=nSpace*nSpace;
3220  for(eN=0;eN<nElements_global;eN++)
3221  for (k=0;k<nQuadraturePoints_element;k++)
3222  for(j=0;j<nDOF_trial_element;j++)
3223  for(I=0;I<nSpace;I++)
3224  for(J=0;J<nSpace;J++)
3225  {
3226  dstrong_residual[eN*nQuadraturePoints_element*nDOF_trial_element+
3227  k*nDOF_trial_element +
3228  j]
3229  -=
3230  da[eN*nQuadraturePoints_element*nSpace2 +
3231  k*nSpace2 +
3232  I*nSpace+
3233  J]
3234  *
3235  (
3236  grad_phi[eN*nQuadraturePoints_element*nSpace +
3237  k*nSpace +
3238  J]
3239  *
3240  grad_v[eN*nQuadraturePoints_element*nSpace*nDOF_trial_element +
3241  k*nSpace*nDOF_trial_element +
3242  j*nSpace +
3243  I]
3244  +
3245  dphi[l2g[eN*nDOF_trial_element +
3246  j]]*
3247  grad_v[eN*nQuadraturePoints_element*nSpace*nDOF_trial_element +
3248  k*nSpace*nDOF_trial_element +
3249  j*nSpace +
3250  J]
3251  *
3252  grad_u[eN*nQuadraturePoints_element*nSpace+
3253  k*nSpace+
3254  I]
3255  );
3256  }
3257 }
3258 void updateDiffusionJacobian_strong_sd(int nElements_global,
3259  int nQuadraturePoints_element,
3260  int nDOF_trial_element,
3261  int nSpace,
3262  int* rowptr,
3263  int* colind,
3264  int* l2g,
3265  double* da,
3266  double* dphi,
3267  double* grad_phi,
3268  double* grad_u,
3269  double* grad_v,
3270  double* dstrong_residual)
3271 {
3272  int eN,k,j,I,m,nnz=rowptr[nSpace];
3273  for(eN=0;eN<nElements_global;eN++)
3274  for (k=0;k<nQuadraturePoints_element;k++)
3275  for(j=0;j<nDOF_trial_element;j++)
3276  for(I=0;I<nSpace;I++)
3277  for(m=rowptr[I];m<rowptr[I+1];m++)
3278  {
3279  dstrong_residual[eN*nQuadraturePoints_element*nDOF_trial_element+
3280  k*nDOF_trial_element +
3281  j]
3282  -=
3283  da[eN*nQuadraturePoints_element*nnz +
3284  k*nnz+
3285  m]
3286  *
3287  (
3288  grad_phi[eN*nQuadraturePoints_element*nSpace +
3289  k*nSpace +
3290  colind[m]]
3291  *
3292  grad_v[eN*nQuadraturePoints_element*nSpace*nDOF_trial_element +
3293  k*nSpace*nDOF_trial_element +
3294  j*nSpace +
3295  I]
3296  +
3297  dphi[l2g[eN*nDOF_trial_element +
3298  j]]*
3299  grad_v[eN*nQuadraturePoints_element*nSpace*nDOF_trial_element +
3300  k*nSpace*nDOF_trial_element +
3301  j*nSpace +
3302  colind[m]]
3303  *
3304  grad_u[eN*nQuadraturePoints_element*nSpace+
3305  k*nSpace+
3306  I]
3307  );
3308  }
3309 }
3310 
3311 
3344 void updateDiffusion_adjoint(int nElements_global,
3345  int nQuadraturePoints_element,
3346  int nDOF_test_element,
3347  int nSpace,
3348  double* da,
3349  double* grad_phi,
3350  double* grad_w_dV,
3351  double* Lstar_w_dV)
3352 {
3353  int eN,i,k,I,J,nSpace2=nSpace*nSpace;
3354  for(eN=0;eN<nElements_global;eN++)
3355  for (i=0;i<nDOF_test_element;i++)
3356  for (k=0;k<nQuadraturePoints_element;k++)
3357  for (I=0;I<nSpace;I++)
3358  for(J=0;J<nSpace;J++)
3359  Lstar_w_dV[eN*nQuadraturePoints_element*nDOF_test_element +
3360  k*nDOF_test_element +
3361  i]
3362  +=
3363  da[eN*nQuadraturePoints_element*nSpace2 +
3364  k*nSpace2 +
3365  I*nSpace+
3366  J]
3367  *
3368  grad_phi[eN*nQuadraturePoints_element*nSpace+
3369  k*nSpace+
3370  J]
3371  *
3372  grad_w_dV[eN*nQuadraturePoints_element*nDOF_test_element*nSpace +
3373  k*nDOF_test_element*nSpace +
3374  i*nSpace +
3375  I];
3376 }
3377 
3378 void updateDiffusion_adjoint_sd(int nElements_global,
3379  int nQuadraturePoints_element,
3380  int nDOF_test_element,
3381  int nSpace,
3382  int* rowptr,
3383  int* colind,
3384  double* da,
3385  double* grad_phi,
3386  double* grad_w_dV,
3387  double* Lstar_w_dV)
3388 {
3389  int eN,i,k,I,m,nnz=rowptr[nSpace];
3390  for(eN=0;eN<nElements_global;eN++)
3391  for (i=0;i<nDOF_test_element;i++)
3392  for (k=0;k<nQuadraturePoints_element;k++)
3393  for (I=0;I<nSpace;I++)
3394  for(m=rowptr[I];m<rowptr[I+1];m++)
3395  Lstar_w_dV[eN*nQuadraturePoints_element*nDOF_test_element +
3396  k*nDOF_test_element +
3397  i]
3398  +=
3399  da[eN*nQuadraturePoints_element*nnz +
3400  k*nnz+
3401  m]
3402  *
3403  grad_phi[eN*nQuadraturePoints_element*nSpace+
3404  k*nSpace+
3405  colind[m]]
3406  *
3407  grad_w_dV[eN*nQuadraturePoints_element*nDOF_test_element*nSpace +
3408  k*nDOF_test_element*nSpace +
3409  i*nSpace +
3410  I];
3411 }
3412 
3413 void updateDiffusion2_strong(int nElements_global,
3414  int nQuadraturePoints_element,
3415  int nSpace,
3416  double* a,
3417  double* Hess_phi,
3418  double* strong_residual)
3419 {
3420  int eN,k,I,J,nSpace2=nSpace*nSpace;
3421  for(eN=0;eN<nElements_global;eN++)
3422  for (k=0;k<nQuadraturePoints_element;k++)
3423  for(I=0;I<nSpace;I++)
3424  for (J=0;J<nSpace;J++)
3425  {
3426  strong_residual[eN*nQuadraturePoints_element+
3427  k]
3428  -=
3429  a[eN*nQuadraturePoints_element*nSpace2 +
3430  k*nSpace2 +
3431  I*nSpace+
3432  J]
3433  *
3434  Hess_phi[eN*nQuadraturePoints_element*nSpace2 +
3435  k*nSpace2 +
3436  J*nSpace+
3437  I];
3438  }
3439 }
3440 
3441 void updateDiffusion2_strong_sd(int nElements_global,
3442  int nQuadraturePoints_element,
3443  int nSpace,
3444  int* rowptr,
3445  int* colind,
3446  double* a,
3447  double* Hess_phi,
3448  double* strong_residual)
3449 {
3450  int eN,k,I,m,nSpace2=nSpace*nSpace,nnz=rowptr[nSpace];
3451  for(eN=0;eN<nElements_global;eN++)
3452  for (k=0;k<nQuadraturePoints_element;k++)
3453  for(I=0;I<nSpace;I++)
3454  for (m=rowptr[I];m<rowptr[I+1];m++)
3455  {
3456  strong_residual[eN*nQuadraturePoints_element+
3457  k]
3458  -=
3459  a[eN*nQuadraturePoints_element*nnz +
3460  k*nnz+
3461  m]
3462  *
3463  Hess_phi[eN*nQuadraturePoints_element*nSpace2 +
3464  k*nSpace2 +
3465  colind[m]*nSpace+
3466  I];
3467  }
3468 }
3469 
3470 void updateDiffusionJacobian2_strong(int nElements_global,
3471  int nQuadraturePoints_element,
3472  int nDOF_trial_element,
3473  int nSpace,
3474  int* l2g,
3475  double* a,
3476  double* da,
3477  double* v,
3478  double* Hess_phi,
3479  double* dphi,
3480  double* Hess_v,
3481  double* dstrong_residual)
3482 {
3483  int eN,k,j,I,J,nSpace2=nSpace*nSpace;
3484  /*double tmp;*/
3485  for(eN=0;eN<nElements_global;eN++)
3486  for (k=0;k<nQuadraturePoints_element;k++)
3487  for (j=0;j<nDOF_trial_element;j++)
3488  for(I=0;I<nSpace;I++)
3489  for (J=0;J<nSpace;J++)
3490  {
3491  dstrong_residual[eN*nQuadraturePoints_element*nDOF_trial_element+
3492  k*nDOF_trial_element+
3493  j]
3494  -=
3495  (da[eN*nQuadraturePoints_element*nSpace2 +
3496  k*nSpace2 +
3497  I*nSpace+
3498  J]
3499  *
3500  v[eN*nQuadraturePoints_element*nDOF_trial_element+
3501  k*nDOF_trial_element+
3502  j]
3503  *
3504  Hess_phi[eN*nQuadraturePoints_element*nSpace2 +
3505  k*nSpace2 +
3506  J*nSpace+
3507  I]
3508  +
3509  a[eN*nQuadraturePoints_element*nSpace2 +
3510  k*nSpace2 +
3511  I*nSpace+
3512  J]
3513  *
3514  dphi[l2g[eN*nDOF_trial_element +
3515  j]]
3516  *
3517  Hess_v[eN*nQuadraturePoints_element*nDOF_trial_element*nSpace2 +
3518  k*nDOF_trial_element*nSpace2 +
3519  j*nSpace2+
3520  J*nSpace+
3521  I]);
3522  }
3523 }
3524 
3525 void updateDiffusionJacobian2_strong_sd(int nElements_global,
3526  int nQuadraturePoints_element,
3527  int nDOF_trial_element,
3528  int nSpace,
3529  int* rowptr,
3530  int* colind,
3531  int* l2g,
3532  double* a,
3533  double* da,
3534  double* v,
3535  double* Hess_phi,
3536  double* dphi,
3537  double* Hess_v,
3538  double* dstrong_residual)
3539 {
3540  int eN,k,j,I,m,nSpace2=nSpace*nSpace,nnz=rowptr[nSpace];
3541  /*double tmp;*/
3542  for(eN=0;eN<nElements_global;eN++)
3543  for (k=0;k<nQuadraturePoints_element;k++)
3544  for (j=0;j<nDOF_trial_element;j++)
3545  for(I=0;I<nSpace;I++)
3546  for (m=rowptr[I];m<rowptr[I+1];m++)
3547  {
3548  dstrong_residual[eN*nQuadraturePoints_element*nDOF_trial_element+
3549  k*nDOF_trial_element+
3550  j]
3551  -=
3552  (da[eN*nQuadraturePoints_element*nnz+
3553  k*nnz+
3554  m]
3555  *
3556  v[eN*nQuadraturePoints_element*nDOF_trial_element+
3557  k*nDOF_trial_element+
3558  j]
3559  *
3560  Hess_phi[eN*nQuadraturePoints_element*nSpace2 +
3561  k*nSpace2 +
3562  colind[m]*nSpace+
3563  I]
3564  +
3565  a[eN*nQuadraturePoints_element*nnz+
3566  k*nnz+
3567  m]
3568  *
3569  dphi[l2g[eN*nDOF_trial_element +
3570  j]]
3571  *
3572  Hess_v[eN*nQuadraturePoints_element*nDOF_trial_element*nSpace2 +
3573  k*nDOF_trial_element*nSpace2 +
3574  j*nSpace2+
3575  colind[m]*nSpace+
3576  I]);
3577  }
3578 }
3579 
3580 void updateDiffusion2_adjoint(int nElements_global,
3581  int nQuadraturePoints_element,
3582  int nDOF_test_element,
3583  int nSpace,
3584  double* a,
3585  double* Hess_w_dV,
3586  double* Lstar_w_dV)
3587 {
3588  int eN,i,k,I,J,nSpace2=nSpace*nSpace;
3589  for(eN=0;eN<nElements_global;eN++)
3590  for (i=0;i<nDOF_test_element;i++)
3591  for (k=0;k<nQuadraturePoints_element;k++)
3592  for (I=0;I<nSpace;I++)
3593  for(J=0;J<nSpace;J++)
3594  {
3595  Lstar_w_dV[eN*nQuadraturePoints_element*nDOF_test_element +
3596  k*nDOF_test_element +
3597  i]
3598  -=
3599  a[eN*nQuadraturePoints_element*nSpace2 +
3600  k*nSpace2 +
3601  I*nSpace+
3602  J]
3603  *
3604  Hess_w_dV[eN*nQuadraturePoints_element*nDOF_test_element*nSpace2 +
3605  k*nDOF_test_element*nSpace2 +
3606  i*nSpace2+
3607  I*nSpace +
3608  J];
3609  }
3610 }
3611 
3612 
3613 void updateDiffusion2_adjoint_sd(int nElements_global,
3614  int nQuadraturePoints_element,
3615  int nDOF_test_element,
3616  int nSpace,
3617  int* rowptr,
3618  int* colind,
3619  double* a,
3620  double* Hess_w_dV,
3621  double* Lstar_w_dV)
3622 {
3623  int eN,i,k,I,m,nSpace2=nSpace*nSpace,nnz=rowptr[nSpace];
3624  for(eN=0;eN<nElements_global;eN++)
3625  for (i=0;i<nDOF_test_element;i++)
3626  for (k=0;k<nQuadraturePoints_element;k++)
3627  for (I=0;I<nSpace;I++)
3628  for(m=rowptr[I];m<rowptr[I+1];m++)
3629  {
3630  Lstar_w_dV[eN*nQuadraturePoints_element*nDOF_test_element +
3631  k*nDOF_test_element +
3632  i]
3633  -=
3634  a[eN*nQuadraturePoints_element*nnz+
3635  k*nnz+
3636  m]
3637  *
3638  Hess_w_dV[eN*nQuadraturePoints_element*nDOF_test_element*nSpace2 +
3639  k*nDOF_test_element*nSpace2 +
3640  i*nSpace2+
3641  I*nSpace +
3642  colind[m]];
3643  }
3644 }
3645 
3646 
3680 void updateReaction_weak(int nElements_global,
3681  int nQuadraturePoints_element,
3682  int nDOF_test_element,
3683  double* r,
3684  double* w_dV,
3685  double* weak_residual)
3686 {
3687  updateMass_weak(nElements_global,nQuadraturePoints_element,nDOF_test_element,r,w_dV,weak_residual);
3688 }
3689 
3729 void updateReactionJacobian_weak(int nElements_global,
3730  int nQuadraturePoints_element,
3731  int nDOF_trial_element,
3732  int nDOF_test_element,
3733  double* dr,
3734  double* v_X_w_dV,
3735  double* jacobian_weak_residual)
3736 {
3737  updateMassJacobian_weak(nElements_global,nQuadraturePoints_element,nDOF_trial_element,nDOF_test_element,dr,v_X_w_dV,jacobian_weak_residual);
3738 }
3739 
3740 void updateReactionJacobian_weak_lowmem(int nElements_global,
3741  int nQuadraturePoints_element,
3742  int nDOF_trial_element,
3743  int nDOF_test_element,
3744  double* dr,
3745  double* v,
3746  double* w_dV,
3747  double* jacobian_weak_residual)
3748 {
3749  updateMassJacobian_weak_lowmem(nElements_global,nQuadraturePoints_element,nDOF_trial_element,nDOF_test_element,dr,
3750  v,w_dV,jacobian_weak_residual);
3751 }
3752 
3771 void updateReaction_strong(int nElements_global,
3772  int nQuadraturePoints_element,
3773  double* r,
3774  double* strong_residual)
3775 {
3776  int eN,k;
3777  for(eN=0;eN<nElements_global;eN++)
3778  for (k=0;k<nQuadraturePoints_element;k++)
3779  strong_residual[eN*nQuadraturePoints_element+
3780  k]
3781  +=
3782  r[eN*nQuadraturePoints_element+
3783  k];
3784 }
3785 
3805 void updateReactionJacobian_strong(int nElements_global,
3806  int nQuadraturePoints_element,
3807  int nDOF_trial_element,
3808  double* dr,
3809  double* v,
3810  double* dstrong_residual)
3811 {
3812  int eN,k,j;
3813  for(eN=0;eN<nElements_global;eN++)
3814  for(j=0;j<nDOF_trial_element;j++)
3815  for (k=0;k<nQuadraturePoints_element;k++)
3816  dstrong_residual[eN*nQuadraturePoints_element*nDOF_trial_element+
3817  k*nDOF_trial_element +
3818  j]
3819  +=
3820  dr[eN*nQuadraturePoints_element+
3821  k]
3822  *
3823  v[eN*nQuadraturePoints_element*nDOF_trial_element+
3824  k*nDOF_trial_element +
3825  j];
3826 }
3827 
3852 void updateReaction_adjoint(int nElements_global,
3853  int nQuadraturePoints_element,
3854  int nDOF_test_element,
3855  double* dr,
3856  double* w_dV,
3857  double* Lstar_w_dV)
3858 {
3859  int eN,i,k;
3860  for(eN=0;eN<nElements_global;eN++)
3861  for (i=0;i<nDOF_test_element;i++)
3862  for (k=0;k<nQuadraturePoints_element;k++)
3863  Lstar_w_dV[eN*nQuadraturePoints_element*nDOF_test_element +
3864  k*nDOF_test_element +
3865  i]
3866  +=
3867  dr[eN*nQuadraturePoints_element +
3868  k]
3869  *
3870  w_dV[eN*nQuadraturePoints_element*nDOF_test_element +
3871  k*nDOF_test_element +
3872  i];
3873 }
3874 
3875 
3909 void updateSubgridError(int nElements_global,
3910  int nQuadraturePoints_element,
3911  int nDOF_test_element,
3912  double* error,
3913  double* Lstar_w_dV,
3914  double* weak_residual)
3915 {
3916  int eN,i,k;
3917  for(eN=0;eN<nElements_global;eN++)
3918  for (i=0;i<nDOF_test_element;i++)
3919  for (k=0;k<nQuadraturePoints_element;k++)
3920  weak_residual[eN*nDOF_test_element + i]
3921  +=
3922  error[eN*nQuadraturePoints_element +
3923  k]
3924  *
3925  Lstar_w_dV[eN*nQuadraturePoints_element*nDOF_test_element +
3926  k*nDOF_test_element +
3927  i];
3928 }
3929 
3969 void updateSubgridErrorJacobian(int nElements_global,
3970  int nQuadraturePoints_element,
3971  int nDOF_trial_element,
3972  int nDOF_test_element,
3973  double* derror,
3974  double* Lstar_w_dV,
3975  double* jacobian_weak_residual)
3976 {
3977  int eN,i,j,k,nDOF_test_X_trial_element=nDOF_test_element*nDOF_trial_element;
3978  for(eN=0;eN<nElements_global;eN++)
3979  for (i=0;i<nDOF_test_element;i++)
3980  for (k=0;k<nQuadraturePoints_element;k++)
3981  for (j=0;j<nDOF_trial_element;j++)
3982  jacobian_weak_residual[eN*nDOF_test_X_trial_element +
3983  i*nDOF_trial_element +
3984  j]
3985  +=
3986  derror[eN*nQuadraturePoints_element*nDOF_trial_element+
3987  k*nDOF_trial_element+
3988  j]
3989  *
3990  Lstar_w_dV[eN*nQuadraturePoints_element*nDOF_test_element +
3991  k*nDOF_test_element +
3992  i];
3993 }
3994 
4034 void updateNumericalDiffusion(int nElements_global,
4035  int nQuadraturePoints_element,
4036  int nDOF_test_element,
4037  int nSpace,
4038  double* numDiff,
4039  double* grad_u_X_grad_w_dV,
4040  double* weak_residual)
4041 {
4042  int eN,i,k,I,nSpace2=nSpace*nSpace;
4043  for(eN=0;eN<nElements_global;eN++)
4044  for (i=0;i<nDOF_test_element;i++)
4045  for (k=0;k<nQuadraturePoints_element;k++)
4046  for (I=0;I<nSpace;I++)
4047  weak_residual[eN*nDOF_test_element + i]
4048  +=
4049  numDiff[eN*nQuadraturePoints_element +
4050  k]
4051  *
4052  grad_u_X_grad_w_dV[eN*nQuadraturePoints_element*nDOF_test_element*nSpace2 +
4053  k*nDOF_test_element*nSpace2 +
4054  i*nSpace2 +
4055  I*nSpace +
4056  I];
4057 }
4058 
4059 void updateNumericalDiffusion_lowmem(int nElements_global,
4060  int nQuadraturePoints_element,
4061  int nDOF_test_element,
4062  int nSpace,
4063  double* numDiff,
4064  double* grad_u,
4065  double* grad_w_dV,
4066  double* weak_residual)
4067 {
4068  int eN,i,k,I;
4069  for(eN=0;eN<nElements_global;eN++)
4070  for (i=0;i<nDOF_test_element;i++)
4071  for (k=0;k<nQuadraturePoints_element;k++)
4072  for (I=0;I<nSpace;I++)
4073  weak_residual[eN*nDOF_test_element + i]
4074  +=
4075  numDiff[eN*nQuadraturePoints_element +
4076  k]
4077  *
4078  grad_u[eN*nQuadraturePoints_element*nSpace +
4079  k*nSpace +
4080  I]
4081  *
4082  grad_w_dV[eN*nQuadraturePoints_element*nDOF_test_element*nSpace +
4083  k*nDOF_test_element*nSpace +
4084  i*nSpace +
4085  I];
4086 }
4087 
4131 void updateNumericalDiffusionJacobian(int nElements_global,
4132  int nQuadraturePoints_element,
4133  int nDOF_trial_element,
4134  int nDOF_test_element,
4135  int nSpace,
4136  double* numDiff,
4137  double* grad_v_X_grad_w_dV,
4138  double* jacobian_weak_residual)
4139 {
4140  int eN,i,j,k,I,nSpace2=nSpace*nSpace,nDOF_test_X_trial_element=nDOF_test_element*nDOF_trial_element;
4141  for(eN=0;eN<nElements_global;eN++)
4142  for (i=0;i<nDOF_test_element;i++)
4143  for (k=0;k<nQuadraturePoints_element;k++)
4144  for (j=0;j<nDOF_trial_element;j++)
4145  for (I=0;I<nSpace;I++)
4146  jacobian_weak_residual[eN*nDOF_test_X_trial_element +
4147  i*nDOF_trial_element +
4148  j]
4149  +=
4150  numDiff[eN*nQuadraturePoints_element +
4151  k]
4152  *
4153  grad_v_X_grad_w_dV[eN*nQuadraturePoints_element*nDOF_test_X_trial_element*nSpace2 +
4154  k*nDOF_test_X_trial_element*nSpace2 +
4155  j*nDOF_test_element*nSpace2 +
4156  i*nSpace2 +
4157  I*nSpace +
4158  I];
4159 }
4160 
4162  int nQuadraturePoints_element,
4163  int nDOF_trial_element,
4164  int nDOF_test_element,
4165  int nSpace,
4166  double* numDiff,
4167  double* grad_v,
4168  double* grad_w_dV,
4169  double* jacobian_weak_residual)
4170 {
4171  int eN,i,j,k,I,nDOF_test_X_trial_element=nDOF_test_element*nDOF_trial_element;
4172  for(eN=0;eN<nElements_global;eN++)
4173  for (i=0;i<nDOF_test_element;i++)
4174  for (k=0;k<nQuadraturePoints_element;k++)
4175  for (j=0;j<nDOF_trial_element;j++)
4176  for (I=0;I<nSpace;I++)
4177  jacobian_weak_residual[eN*nDOF_test_X_trial_element +
4178  i*nDOF_trial_element +
4179  j]
4180  +=
4181  numDiff[eN*nQuadraturePoints_element +
4182  k]
4183  *
4184  grad_v[eN*nQuadraturePoints_element*nDOF_trial_element*nSpace +
4185  k*nDOF_trial_element*nSpace +
4186  j*nSpace +
4187  I]
4188  *
4189  grad_w_dV[eN*nQuadraturePoints_element*nDOF_test_element*nSpace +
4190  k*nDOF_test_element*nSpace +
4191  i*nSpace +
4192  I];
4193 }
4194 
4198 void calculateScalarScalarProduct(int nElements_global,
4199  int nQuadraturePoints_element,
4200  double* s1,
4201  double* s2,
4202  double* sResult)
4203 {
4204  int eN,k;
4205  for(eN=0;eN<nElements_global;eN++)
4206  for (k=0;k<nQuadraturePoints_element;k++)
4207  sResult[eN*nQuadraturePoints_element +
4208  k]
4209  =
4210  s1[eN*nQuadraturePoints_element +
4211  k]
4212  *
4213  s2[eN*nQuadraturePoints_element +
4214  k];
4215 }
4216 
4220 void calculateVectorScalarProduct(int nElements_global,
4221  int nQuadraturePoints_element,
4222  int nSpace,
4223  double* v,
4224  double* s,
4225  double* vResult)
4226 {
4227  int eN,k,I;
4228  for(eN=0;eN<nElements_global;eN++)
4229  for (k=0;k<nQuadraturePoints_element;k++)
4230  for (I=0;I<nSpace;I++)
4231  vResult[eN*nQuadraturePoints_element*nSpace +
4232  k*nSpace +
4233  I]
4234  =
4235  v[eN*nQuadraturePoints_element*nSpace +
4236  k*nSpace +
4237  I]
4238  *
4239  s[eN*nQuadraturePoints_element +
4240  k];
4241 }
4242 
4246 void calculateTensorScalarProduct(int nElements_global,
4247  int nQuadraturePoints_element,
4248  int nSpace,
4249  double* t,
4250  double* s,
4251  double* tResult)
4252 {
4253  int eN,k,I,J,nSpace2=nSpace*nSpace;
4254  for(eN=0;eN<nElements_global;eN++)
4255  for (k=0;k<nQuadraturePoints_element;k++)
4256  for (I=0;I<nSpace;I++)
4257  for (J=0;J<nSpace;J++)
4258  tResult[eN*nQuadraturePoints_element*nSpace2 +
4259  k*nSpace2 +
4260  I*nSpace +
4261  J]
4262  =
4263  t[eN*nQuadraturePoints_element*nSpace2 +
4264  k*nSpace2 +
4265  I*nSpace +
4266  J]
4267  *
4268  s[eN*nQuadraturePoints_element +
4269  k];
4270 }
4271 
4272 
4273 
4274 
4275 
4276 
4280 void updateInteriorElementBoundaryFlux(int nInteriorElementBoundaries_global,
4281  int nElementBoundaries_element,
4282  int nQuadraturePoints_elementBoundary,
4283  int nDOF_test_element,
4284  int* interiorElementBoundaries,
4285  int* elementBoundaryElements,
4286  int* elementBoundaryLocalElementBoundaries,
4287  double* flux,
4288  double* w_dS,
4289  double* residual)
4290 {
4291  int ebNI,ebN,left_eN_global,right_eN_global,left_ebN_element,right_ebN_element,i,k;
4292  for(ebNI=0;ebNI<nInteriorElementBoundaries_global;ebNI++)
4293  {
4294  ebN = interiorElementBoundaries[ebNI];
4295  left_eN_global = elementBoundaryElements[ebN*2+0];
4296  right_eN_global = elementBoundaryElements[ebN*2+1];
4297  left_ebN_element = elementBoundaryLocalElementBoundaries[ebN*2+0];
4298  right_ebN_element = elementBoundaryLocalElementBoundaries[ebN*2+1];
4299  for(i=0;i<nDOF_test_element;i++)
4300  for(k=0;k<nQuadraturePoints_elementBoundary;k++)
4301  {
4302  residual[left_eN_global*nDOF_test_element+
4303  i]
4304  +=
4305  flux[ebN*nQuadraturePoints_elementBoundary+
4306  k]*
4307  w_dS[left_eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_test_element+
4308  left_ebN_element*nQuadraturePoints_elementBoundary*nDOF_test_element+
4309  k*nDOF_test_element+
4310  i];
4311  residual[right_eN_global*nDOF_test_element+
4312  i]
4313  -=
4314  flux[ebN*nQuadraturePoints_elementBoundary+
4315  k]*
4316  w_dS[right_eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_test_element+
4317  right_ebN_element*nQuadraturePoints_elementBoundary*nDOF_test_element+
4318  k*nDOF_test_element+
4319  i];
4320  }
4321  }
4322 }
4323 
4327 void updateExteriorElementBoundaryFlux(int nExteriorElementBoundaries_global,
4328  int nElementBoundaries_element,
4329  int nQuadraturePoints_elementBoundary,
4330  int nDOF_test_element,
4331  int* exteriorElementBoundaries,
4332  int* elementBoundaryElements,
4333  int* elementBoundaryLocalElementBoundaries,
4334  double* flux,
4335  double* w_dS,
4336  double* residual)
4337 {
4338  int ebNE,ebN,eN_global,ebN_element,i,k;
4339  for(ebNE=0;ebNE<nExteriorElementBoundaries_global;ebNE++)
4340  {
4341  ebN = exteriorElementBoundaries[ebNE];
4342  eN_global = elementBoundaryElements[ebN*2+0];
4343  ebN_element = elementBoundaryLocalElementBoundaries[ebN*2+0];
4344  for(i=0;i<nDOF_test_element;i++)
4345  for(k=0;k<nQuadraturePoints_elementBoundary;k++)
4346  {
4347  residual[eN_global*nDOF_test_element+
4348  i]
4349  +=
4350  flux[ebN*nQuadraturePoints_elementBoundary+
4351  k]
4352  *
4353  w_dS[eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_test_element+
4354  ebN_element*nQuadraturePoints_elementBoundary*nDOF_test_element+
4355  k*nDOF_test_element+
4356  i];
4357  }
4358  }
4359 }
4360 
4361 void updateGlobalExteriorElementBoundaryFlux(int nExteriorElementBoundaries_global,
4362  int nQuadraturePoints_elementBoundary,
4363  int nDOF_test_element,
4364  int* exteriorElementBoundaries,
4365  int* elementBoundaryElements,
4366  int* elementBoundaryLocalElementBoundaries,
4367  double* flux,
4368  double* w_dS,
4369  double* residual)
4370 {
4371  int ebNE,ebN,eN_global,ebN_element,i,k;
4372  for(ebNE=0;ebNE<nExteriorElementBoundaries_global;ebNE++)
4373  {
4374  ebN = exteriorElementBoundaries[ebNE];
4375  eN_global = elementBoundaryElements[ebN*2+0];
4376  ebN_element = elementBoundaryLocalElementBoundaries[ebN*2+0];
4377  for(i=0;i<nDOF_test_element;i++)
4378  for(k=0;k<nQuadraturePoints_elementBoundary;k++)
4379  {
4380  residual[eN_global*nDOF_test_element+
4381  i]
4382  +=
4383  flux[ebNE*nQuadraturePoints_elementBoundary+
4384  k]
4385  *
4386  w_dS[ebNE*nQuadraturePoints_elementBoundary*nDOF_test_element+
4387  k*nDOF_test_element+
4388  i];
4389  }
4390  }
4391 }
4392 void updateGlobalExteriorElementBoundaryStressFlux(int nExteriorElementBoundaries_global,
4393  int nQuadraturePoints_elementBoundary,
4394  int nDOF_test_element,
4395  int* exteriorElementBoundaries,
4396  int* elementBoundaryElements,
4397  int* elementBoundaryLocalElementBoundaries,
4398  double* stressFlux,
4399  double* w_dS,
4400  double* residual)
4401 {
4402  int ebNE,ebN,eN_global,ebN_element,i,k,I;
4403  for(ebNE=0;ebNE<nExteriorElementBoundaries_global;ebNE++)
4404  {
4405  ebN = exteriorElementBoundaries[ebNE];
4406  eN_global = elementBoundaryElements[ebN*2+0];
4407  ebN_element = elementBoundaryLocalElementBoundaries[ebN*2+0];
4408  for(i=0;i<nDOF_test_element;i++)
4409  for(k=0;k<nQuadraturePoints_elementBoundary;k++)
4410  residual[eN_global*nDOF_test_element+
4411  i]
4412  +=
4413  stressFlux[ebNE*nQuadraturePoints_elementBoundary+
4414  k]
4415  *
4416  w_dS[ebNE*nQuadraturePoints_elementBoundary*nDOF_test_element+
4417  k*nDOF_test_element+
4418  i];
4419  }
4420 }
4424 void updateInteriorTwoSidedElementBoundaryFlux(int nInteriorElementBoundaries_global,
4425  int nElementBoundaries_element,
4426  int nQuadraturePoints_elementBoundary,
4427  int nDOF_test_element,
4428  int* interiorElementBoundaries,
4429  int* elementBoundaryElements,
4430  int* elementBoundaryLocalElementBoundaries,
4431  double* flux,
4432  double* w_dS,
4433  double* residual)
4434 {
4435  int ebNI,ebN,left_eN_global,right_eN_global,left_ebN_element,right_ebN_element,i,k;
4436  for(ebNI=0;ebNI<nInteriorElementBoundaries_global;ebNI++)
4437  {
4438  ebN = interiorElementBoundaries[ebNI];
4439  left_eN_global = elementBoundaryElements[ebN*2+0];
4440  right_eN_global = elementBoundaryElements[ebN*2+1];
4441  left_ebN_element = elementBoundaryLocalElementBoundaries[ebN*2+0];
4442  right_ebN_element = elementBoundaryLocalElementBoundaries[ebN*2+1];
4443  for(i=0;i<nDOF_test_element;i++)
4444  for(k=0;k<nQuadraturePoints_elementBoundary;k++)
4445  {
4446  residual[left_eN_global*nDOF_test_element+
4447  i]
4448  +=
4449  flux[left_eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary+
4450  left_ebN_element*nQuadraturePoints_elementBoundary+ /*left flux*/
4451  k]*
4452  w_dS[left_eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_test_element+
4453  left_ebN_element*nQuadraturePoints_elementBoundary*nDOF_test_element+
4454  k*nDOF_test_element+
4455  i];
4456  residual[right_eN_global*nDOF_test_element+
4457  i]
4458  +=
4459  flux[right_eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary+
4460  right_ebN_element*nQuadraturePoints_elementBoundary+ /*right flux*/
4461  k]*
4462  w_dS[right_eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_test_element+
4463  right_ebN_element*nQuadraturePoints_elementBoundary*nDOF_test_element+
4464  k*nDOF_test_element+
4465  i];
4466  }
4467  }
4468 }
4469 
4470 void calculateExteriorElementBoundaryStress3D(int nExteriorElementBoundaries_global,
4471  int nQuadraturePoints_elementBoundary,
4472  int* elementBoundaryMaterialTypes,
4473  int* exteriorElementBoundaries,
4474  int* elementBoundaryElements,
4475  int* elementBoundaryLocalElementBoundaries,
4476  double* p,
4477  double* mom_flux_vec_u,
4478  double* mom_flux_vec_v,
4479  double* mom_flux_vec_w,
4480  double* dS,
4481  double* n,
4482  double* F)
4483 {
4484  int ebNE,ebN,eN_global,ebN_element,k,I;
4485  double stress_x,stress_y,stress_z;
4486  for(ebNE=0;ebNE<nExteriorElementBoundaries_global;ebNE++)
4487  {
4488  ebN = exteriorElementBoundaries[ebNE];
4489  eN_global = elementBoundaryElements[ebN*2+0];
4490  ebN_element = elementBoundaryLocalElementBoundaries[ebN*2+0];
4491  for(k=0;k<nQuadraturePoints_elementBoundary;k++)
4492  {
4493  stress_x = 0.0;
4494  stress_y = 0.0;
4495  stress_z = 0.0;
4496  stress_x += p[ebNE*nQuadraturePoints_elementBoundary+
4497  k]
4498  *
4499  n[ebNE*nQuadraturePoints_elementBoundary*3+
4500  k*3+
4501  0];
4502  stress_y += p[ebNE*nQuadraturePoints_elementBoundary+
4503  k]
4504  *
4505  n[ebNE*nQuadraturePoints_elementBoundary*3+
4506  k*3+
4507  1];
4508  stress_z += p[ebNE*nQuadraturePoints_elementBoundary+
4509  k]
4510  *
4511  n[ebNE*nQuadraturePoints_elementBoundary*3+
4512  k*3+
4513  2];
4514  for(I=0;I<3;I++)
4515  {
4516  stress_x += mom_flux_vec_u[ebNE*nQuadraturePoints_elementBoundary*3+
4517  k*3+
4518  I]
4519  *
4520  n[ebNE*nQuadraturePoints_elementBoundary*3+
4521  k*3+
4522  I];
4523  stress_y += mom_flux_vec_v[ebNE*nQuadraturePoints_elementBoundary*3+
4524  k*3+
4525  I]
4526  *
4527  n[ebNE*nQuadraturePoints_elementBoundary*3+
4528  k*3+
4529  I];
4530  stress_z += mom_flux_vec_w[ebNE*nQuadraturePoints_elementBoundary*3+
4531  k*3+
4532  I]
4533  *
4534  n[ebNE*nQuadraturePoints_elementBoundary*3+
4535  k*3+
4536  I];
4537  }
4538  F[elementBoundaryMaterialTypes[ebN]*3 + 0] += stress_x*
4539  dS[ebNE*nQuadraturePoints_elementBoundary+
4540  k];
4541  F[elementBoundaryMaterialTypes[ebN]*3 + 1] += stress_y*
4542  dS[ebNE*nQuadraturePoints_elementBoundary+
4543  k];
4544  F[elementBoundaryMaterialTypes[ebN]*3 + 2] += stress_z*
4545  dS[ebNE*nQuadraturePoints_elementBoundary+
4546  k];
4547  }
4548  }
4549 }
4550 
4551 void calculateExteriorElementBoundaryStress2D(int nExteriorElementBoundaries_global,
4552  int nQuadraturePoints_elementBoundary,
4553  int* elementBoundaryMaterialTypes,
4554  int* exteriorElementBoundaries,
4555  int* elementBoundaryElements,
4556  int* elementBoundaryLocalElementBoundaries,
4557  double* p,
4558  double* mom_flux_vec_u,
4559  double* mom_flux_vec_v,
4560  double* dS,
4561  double* n,
4562  double* F)
4563 {
4564  int ebNE,ebN,eN_global,ebN_element,k,I;
4565  double stress_x,stress_y;
4566  for(ebNE=0;ebNE<nExteriorElementBoundaries_global;ebNE++)
4567  {
4568  ebN = exteriorElementBoundaries[ebNE];
4569  eN_global = elementBoundaryElements[ebN*2+0];
4570  ebN_element = elementBoundaryLocalElementBoundaries[ebN*2+0];
4571  for(k=0;k<nQuadraturePoints_elementBoundary;k++)
4572  {
4573  stress_x = 0.0;
4574  stress_y = 0.0;
4575  stress_x += p[ebNE*nQuadraturePoints_elementBoundary+
4576  k]
4577  *
4578  n[ebNE*nQuadraturePoints_elementBoundary*2+
4579  k*2+
4580  0];
4581  stress_y += p[ebNE*nQuadraturePoints_elementBoundary+
4582  k]
4583  *
4584  n[ebNE*nQuadraturePoints_elementBoundary*2+
4585  k*2+
4586  1];
4587  /* for(I=0;I<2;I++) */
4588  /* { */
4589  /* stress_x += mom_flux_vec_u[ebNE*nQuadraturePoints_elementBoundary*2+ */
4590  /* k*2+ */
4591  /* I] */
4592  /* * */
4593  /* n[ebNE*nQuadraturePoints_elementBoundary*2+ */
4594  /* k*2+ */
4595  /* I]; */
4596  /* stress_y += mom_flux_vec_v[ebNE*nQuadraturePoints_elementBoundary*2+ */
4597  /* k*2+ */
4598  /* I] */
4599  /* * */
4600  /* n[ebNE*nQuadraturePoints_elementBoundary*2+ */
4601  /* k*2+ */
4602  /* I]; */
4603  /* } */
4604  F[elementBoundaryMaterialTypes[ebN]*2 + 0] += stress_x*
4605  dS[ebNE*nQuadraturePoints_elementBoundary+
4606  k];
4607  F[elementBoundaryMaterialTypes[ebN]*2 + 1] += stress_y*
4608  dS[ebNE*nQuadraturePoints_elementBoundary+
4609  k];
4610  }
4611  }
4612 }
4618 void accumulateExteriorElementPressureIntegrals(int nExteriorElementBoundaries_global,
4619  int nQuadraturePoints_elementBoundary,
4620  int* elementBoundaryMaterialTypes,
4621  int* exteriorElementBoundaries,
4622  double* p,
4623  double* dS,
4624  double* P,
4625  double* boundaryMeasure)
4626 {
4627  int ebNE,ebN,k,elementBoundaryFlag;
4628  /*loop through exterior element boundaries*/
4629  for(ebNE=0;ebNE<nExteriorElementBoundaries_global;ebNE++)
4630  {
4631  /*get the global element boundary number for the current exterior element boundary*/
4632  ebN = exteriorElementBoundaries[ebNE];
4633  /*integer flag for this boundary*/
4634  elementBoundaryFlag = elementBoundaryMaterialTypes[ebN];
4635  /*loop through element boundary quadrature points and accumulate pressure and boundary area/length */
4636  for(k=0;k<nQuadraturePoints_elementBoundary;k++)
4637  {
4638  P[elementBoundaryFlag] += p[ebNE*nQuadraturePoints_elementBoundary+k]
4639  *
4640  dS[ebNE*nQuadraturePoints_elementBoundary+k];
4641  boundaryMeasure[elementBoundaryFlag] +=
4642  dS[ebNE*nQuadraturePoints_elementBoundary+k];
4643  }
4644  }
4645 }
4646 
4647 
4652  int nDOF_test_element,
4653  int offset_r,
4654  int stride_r,
4655  int* nFreeDOF_element_r,
4656  int* freeLocal_r,
4657  int* freeGlobal_r,
4658  double* elementResidual,
4659  double* globalResidual)
4660 {
4661  int eN,ii;
4662  for (eN=0;eN<nElements_global;eN++)
4663  for (ii=0;ii<nFreeDOF_element_r[eN];ii++)
4664  globalResidual[offset_r +
4665  stride_r*freeGlobal_r[eN*nDOF_test_element+
4666  ii]]
4667  +=
4668  elementResidual[eN*nDOF_test_element +
4669  freeLocal_r[eN*nDOF_test_element+
4670  ii]];
4671 }
4672 
4677  int nDOF_test_element,
4678  int nDOF_trial_element,
4679  int offset_r,
4680  int stride_r,
4681  int offset_u,
4682  int stride_u,
4683  int nFreeVDOF_global,
4684  int* nFreeDOF_element_r,
4685  int* freeLocal_r,
4686  int* freeGlobal_r,
4687  int* nFreeDOF_element_u,
4688  int* freeLocal_u,
4689  int* freeGlobal_u,
4690  double* elementJacobian,
4691  double* globalJacobian)
4692 {
4693  int eN,ii,jj,nDOF_test_X_trial_element=nDOF_test_element*nDOF_trial_element,i,j,jacIndex,I,J;
4694  for (eN=0;eN<nElements_global;eN++)
4695  for (ii=0;ii<nFreeDOF_element_r[eN];ii++)
4696  {
4697  i = freeLocal_r[eN*nDOF_test_element+
4698  ii];
4699  I = offset_r + stride_r*freeGlobal_r[eN*nDOF_test_element+
4700  ii];
4701  for (jj=0;jj<nFreeDOF_element_u[eN];jj++)
4702  {
4703  j = freeLocal_u[eN*nDOF_trial_element+
4704  jj];
4705  J = offset_u + stride_u*freeGlobal_u[eN*nDOF_trial_element+
4706  jj];
4707  jacIndex = I + J*nFreeVDOF_global;
4708  globalJacobian[jacIndex]
4709  +=
4710  elementJacobian[eN*nDOF_test_X_trial_element +
4711  i*nDOF_trial_element+
4712  j];
4713  }
4714  }
4715 }
4716 
4721  int nElements_global,
4722  int nElementBoundaries_element,
4723  int nDOF_test_element,
4724  int nDOF_trial_element,
4725  int offset_r,
4726  int stride_r,
4727  int offset_u,
4728  int stride_u,
4729  int nFreeVDOF_global,
4730  int* nFreeDOF_element_r,
4731  int* freeLocal_r,
4732  int* freeGlobal_r,
4733  int* nFreeDOF_element_u,
4734  int* freeLocal_u,
4735  int* freeGlobal_u,
4736  double* elementJacobian_eb,
4737  double* globalJacobian)
4738 {
4739  int eN,ebN,eN_ebN,ii,jj,nDOF_test_X_trial_element=nDOF_test_element*nDOF_trial_element,i,j,jacIndex,I,J;
4740  for (eN=0;eN<nElements_global;eN++)
4741  for (ebN=0;ebN<nElementBoundaries_element;ebN++)
4742  {
4743 /* /\*cek 1D debugging *\/ */
4744 /* if(ebN == 0) */
4745 /* eN_ebN = eN+1; */
4746 /* if(ebN == 1) */
4747 /* eN_ebN = eN-1; */
4748 /* if(eN_ebN >= 0 && eN_ebN < nElements_global) */
4749  eN_ebN = elementNeighbors[eN*nElementBoundaries_element+ebN];
4750  if (eN_ebN >= 0)
4751  for (ii=0;ii<nFreeDOF_element_r[eN];ii++)
4752  {
4753  i = freeLocal_r[eN*nDOF_test_element+
4754  ii];
4755  I = offset_r + stride_r*freeGlobal_r[eN*nDOF_test_element+
4756  ii];
4757  for (jj=0;jj<nFreeDOF_element_u[eN_ebN];jj++)
4758  {
4759  j = freeLocal_u[eN_ebN*nDOF_trial_element+
4760  jj];
4761  J = offset_u + stride_u*freeGlobal_u[eN_ebN*nDOF_trial_element+
4762  jj];
4763  jacIndex = I + J*nFreeVDOF_global;
4764  globalJacobian[jacIndex]
4765  +=
4766  elementJacobian_eb[eN*nElementBoundaries_element*nDOF_test_X_trial_element +
4767  ebN*nDOF_test_X_trial_element+
4768  i*nDOF_trial_element+
4769  j];
4770  }
4771  }
4772  }
4773 }
4774 
4779  int nElementBoundaries_element,
4780  int nQuadraturePoints_elementBoundary,
4781  int nDOF_test_element,
4782  int nDOF_trial_element,
4783  int offset_r,
4784  int stride_r,
4785  int offset_u,
4786  int stride_u,
4787  int nFreeVDOF_global,
4788  int* interiorElementBoundaries,
4789  int* elementBoundaryElements,
4790  int* elementBoundaryLocalElementBoundaries,
4791  int* nFreeDOF_element_r,
4792  int* freeLocal_r,
4793  int* freeGlobal_r,
4794  int* nFreeDOF_element_u,
4795  int* freeLocal_u,
4796  int* freeGlobal_u,
4797  double* elementBoundaryFluxJacobian,
4798  double* w_dS,
4799  double* jac)
4800 {
4801  int ebNI,ebN,left_eN_global,right_eN_global,left_ebN_element,right_ebN_element,ii,i,k,jj,j,jacIndex,I,J;
4802  for (ebNI=0;ebNI<nInteriorElementBoundaries_global;ebNI++)
4803  {
4804  ebN = interiorElementBoundaries[ebNI];
4805  left_eN_global = elementBoundaryElements[ebN*2+0];
4806  right_eN_global = elementBoundaryElements[ebN*2+1];
4807  left_ebN_element = elementBoundaryLocalElementBoundaries[ebN*2+0];
4808  right_ebN_element = elementBoundaryLocalElementBoundaries[ebN*2+1];
4809  for(ii=0;ii<nFreeDOF_element_r[left_eN_global];ii++)
4810  {
4811  i = freeLocal_r[left_eN_global*nDOF_test_element+
4812  ii];
4813  I = offset_r + stride_r*freeGlobal_r[left_eN_global*nDOF_test_element+
4814  ii];
4815  for(k=0;k<nQuadraturePoints_elementBoundary;k++)
4816  {
4817  for(jj=0;jj<nFreeDOF_element_u[left_eN_global];jj++)
4818  {
4819  j = freeLocal_u[left_eN_global*nDOF_trial_element+
4820  jj];
4821  J = offset_u + stride_u*freeGlobal_u[left_eN_global*nDOF_trial_element+
4822  jj];
4823  jacIndex = I+J*nFreeVDOF_global;
4824  jac[jacIndex]
4825  +=
4826  elementBoundaryFluxJacobian[ebN*2*nQuadraturePoints_elementBoundary*nDOF_trial_element +
4827  0*nQuadraturePoints_elementBoundary*nDOF_trial_element+
4828  k*nDOF_trial_element+
4829  j]
4830  *
4831  w_dS[left_eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_test_element +
4832  left_ebN_element*nQuadraturePoints_elementBoundary*nDOF_test_element+
4833  k*nDOF_test_element+
4834  i];
4835  }
4836  for(jj=0;jj<nFreeDOF_element_u[right_eN_global];jj++)
4837  {
4838  j = freeLocal_u[right_eN_global*nDOF_trial_element+
4839  jj];
4840  J = offset_u + stride_u*freeGlobal_u[right_eN_global*nDOF_trial_element+
4841  jj];
4842  jacIndex = I+J*nFreeVDOF_global;
4843  jac[jacIndex]
4844  +=
4845  elementBoundaryFluxJacobian[ebN*2*nQuadraturePoints_elementBoundary*nDOF_trial_element +
4846  1*nQuadraturePoints_elementBoundary*nDOF_trial_element+
4847  k*nDOF_trial_element+
4848  j]*
4849  w_dS[left_eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_test_element +
4850  left_ebN_element*nQuadraturePoints_elementBoundary*nDOF_test_element+
4851  k*nDOF_test_element+i];
4852  }
4853  }
4854  }
4855  for(ii=0;ii<nFreeDOF_element_r[right_eN_global];ii++)
4856  {
4857  i = freeLocal_r[right_eN_global*nDOF_test_element+
4858  ii];
4859  I = offset_r + stride_r*freeGlobal_r[right_eN_global*nDOF_test_element+
4860  ii];
4861  for(k=0;k<nQuadraturePoints_elementBoundary;k++)
4862  {
4863  for(jj=0;jj<nFreeDOF_element_u[left_eN_global];jj++)
4864  {
4865  j = freeLocal_u[left_eN_global*nDOF_trial_element+
4866  jj];
4867  J = offset_u + stride_u*freeGlobal_u[left_eN_global*nDOF_trial_element+
4868  jj];
4869  jacIndex = I+J*nFreeVDOF_global;
4870  jac[jacIndex]
4871  -=
4872  elementBoundaryFluxJacobian[ebN*2*nQuadraturePoints_elementBoundary*nDOF_trial_element+
4873  0*nQuadraturePoints_elementBoundary*nDOF_trial_element+
4874  k*nDOF_trial_element+
4875  j]
4876  *
4877  w_dS[right_eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_test_element+
4878  right_ebN_element*nQuadraturePoints_elementBoundary*nDOF_test_element+
4879  k*nDOF_test_element+
4880  i];
4881  }
4882  for(jj=0;jj<nFreeDOF_element_u[right_eN_global];jj++)
4883  {
4884  j = freeLocal_u[right_eN_global*nDOF_trial_element+
4885  jj];
4886  J = offset_u + stride_u*freeGlobal_u[right_eN_global*nDOF_trial_element+
4887  jj];
4888  jacIndex = I+J*nFreeVDOF_global;
4889  jac[jacIndex]
4890  -=
4891  elementBoundaryFluxJacobian[ebN*2*nQuadraturePoints_elementBoundary*nDOF_trial_element+
4892  1*nQuadraturePoints_elementBoundary*nDOF_trial_element+
4893  k*nDOF_trial_element+
4894  j]*
4895  w_dS[right_eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_test_element+
4896  right_ebN_element*nQuadraturePoints_elementBoundary*nDOF_test_element+
4897  k*nDOF_test_element+
4898  i];
4899  }
4900  }
4901  }
4902  }
4903 }
4904 
4909  int nElements_global,
4910  int nInteriorElementBoundaries_global,
4911  int nElementBoundaries_element,
4912  int nQuadraturePoints_elementBoundary,
4913  int nDOF_test_element,
4914  int nDOF_trial_element,
4915  int offset_r,
4916  int stride_r,
4917  int offset_u,
4918  int stride_u,
4919  int nFreeVDOF_global,
4920  int* interiorElementBoundaries,
4921  int* elementBoundaryElements,
4922  int* elementBoundaryLocalElementBoundaries,
4923  int* nFreeDOF_element_r,
4924  int* freeLocal_r,
4925  int* freeGlobal_r,
4926  int* nFreeDOF_element_u,
4927  int* freeLocal_u,
4928  int* freeGlobal_u,
4929  double* elementBoundaryFluxJacobian_eb,
4930  double* w_dS,
4931  double* jac)
4932 {
4933  int ebNI,ebN,ebN_element,left_eN_ebN,right_eN_ebN,left_eN_global,right_eN_global,left_ebN_element,right_ebN_element,ii,i,k,jj,j,jacIndex,I,J;
4934  for (ebNI=0;ebNI<nInteriorElementBoundaries_global;ebNI++)
4935  {
4936  ebN = interiorElementBoundaries[ebNI];
4937  left_eN_global = elementBoundaryElements[ebN*2+0];
4938  right_eN_global = elementBoundaryElements[ebN*2+1];
4939  left_ebN_element = elementBoundaryLocalElementBoundaries[ebN*2+0];
4940  right_ebN_element = elementBoundaryLocalElementBoundaries[ebN*2+1];
4941  for(ebN_element=0;ebN_element<nElementBoundaries_element;ebN_element++)
4942  {
4943 /* /\* cek debugging 1D *\/ */
4944 /* if(ebN_element == 0) */
4945 /* left_eN_ebN = left_eN_global+1; */
4946 /* if(ebN_element == 1) */
4947 /* left_eN_ebN = left_eN_global-1; */
4948 /* if(ebN_element == 0) */
4949 /* right_eN_ebN = right_eN_global+1; */
4950 /* if(ebN_element == 1) */
4951 /* right_eN_ebN = right_eN_global-1; */
4952  left_eN_ebN = elementNeighbors[left_eN_global*nElementBoundaries_element+ebN_element];
4953  right_eN_ebN = elementNeighbors[right_eN_global*nElementBoundaries_element+ebN_element];
4954  for(ii=0;ii<nFreeDOF_element_r[left_eN_global];ii++)
4955  {
4956  i = freeLocal_r[left_eN_global*nDOF_test_element+
4957  ii];
4958  I = offset_r + stride_r*freeGlobal_r[left_eN_global*nDOF_test_element+
4959  ii];
4960  for(k=0;k<nQuadraturePoints_elementBoundary;k++)
4961  {
4962 /* if(left_eN_ebN >= 0 && left_eN_ebN < nElements_global) */
4963  if(left_eN_ebN >= 0)
4964  for(jj=0;jj<nFreeDOF_element_u[left_eN_ebN];jj++)
4965  {
4966  j = freeLocal_u[left_eN_ebN*nDOF_trial_element+
4967  jj];
4968  J = offset_u + stride_u*freeGlobal_u[left_eN_ebN*nDOF_trial_element+
4969  jj];
4970  jacIndex = I+J*nFreeVDOF_global;
4971  jac[jacIndex]
4972  +=
4973  elementBoundaryFluxJacobian_eb[ebN*2*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_trial_element +
4974  0*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_trial_element+
4975  ebN_element*nQuadraturePoints_elementBoundary*nDOF_trial_element+
4976  k*nDOF_trial_element+
4977  j]
4978  *
4979  w_dS[left_eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_test_element +
4980  left_ebN_element*nQuadraturePoints_elementBoundary*nDOF_test_element+
4981  k*nDOF_test_element+
4982  i];
4983 /* printf("ind=%i,ebN = %i,left_eN_global=%i,left_ebN_element=%i,ebN_element=%i,i=%i,j=%i,jac=%12.5e,fjac=%12.5e,w=%12.5e\n", */
4984 /* jacIndex,ebN,left_eN_global,left_ebN_element,ebN_element,i,j,jac[jacIndex], */
4985 /* elementBoundaryFluxJacobian_eb[ebN*2*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_trial_element + */
4986 /* 0*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_trial_element+ */
4987 /* ebN_element*nQuadraturePoints_elementBoundary*nDOF_trial_element+ */
4988 /* k*nDOF_trial_element+ */
4989 /* j], */
4990 /* w_dS[left_eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_test_element + */
4991 /* left_ebN_element*nQuadraturePoints_elementBoundary*nDOF_test_element+ */
4992 /* k*nDOF_test_element+ */
4993 /* i]); */
4994  }
4995 /* if(right_eN_ebN >= 0 && right_eN_ebN < nElements_global) */
4996  if(right_eN_ebN >= 0)
4997  for(jj=0;jj<nFreeDOF_element_u[right_eN_ebN];jj++)
4998  {
4999  j = freeLocal_u[right_eN_ebN*nDOF_trial_element+
5000  jj];
5001  J = offset_u + stride_u*freeGlobal_u[right_eN_ebN*nDOF_trial_element+
5002  jj];
5003  jacIndex = I+J*nFreeVDOF_global;
5004  jac[jacIndex]
5005  +=
5006  elementBoundaryFluxJacobian_eb[ebN*2*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_trial_element +
5007  1*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_trial_element+
5008  ebN_element*nQuadraturePoints_elementBoundary*nDOF_trial_element+
5009  k*nDOF_trial_element+
5010  j]*
5011  w_dS[left_eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_test_element +
5012  left_ebN_element*nQuadraturePoints_elementBoundary*nDOF_test_element+
5013  k*nDOF_test_element+i];
5014 /* printf("ind=%i,ebN = %i,left_eN_global=%i,left_ebN_element=%i,ebN_element=%i,i=%i,j=%i,jac=%12.5e,fjac=%12.5e,w=%12.5e\n", */
5015 /* jacIndex,ebN,left_eN_global,left_ebN_element,ebN_element,i,j,jac[jacIndex], */
5016 /* elementBoundaryFluxJacobian_eb[ebN*2*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_trial_element + */
5017 /* 1*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_trial_element+ */
5018 /* ebN_element*nQuadraturePoints_elementBoundary*nDOF_trial_element+ */
5019 /* k*nDOF_trial_element+ */
5020 /* j], */
5021 /* w_dS[left_eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_test_element + */
5022 /* left_ebN_element*nQuadraturePoints_elementBoundary*nDOF_test_element+ */
5023 /* k*nDOF_test_element+ */
5024 /* i]); */
5025  }
5026  }
5027  }
5028  for(ii=0;ii<nFreeDOF_element_r[right_eN_global];ii++)
5029  {
5030  i = freeLocal_r[right_eN_global*nDOF_test_element+
5031  ii];
5032  I = offset_r + stride_r*freeGlobal_r[right_eN_global*nDOF_test_element+
5033  ii];
5034  for(k=0;k<nQuadraturePoints_elementBoundary;k++)
5035  {
5036 /* if(left_eN_ebN >= 0 && left_eN_ebN < nElements_global) */
5037  if(left_eN_ebN >= 0)
5038  for(jj=0;jj<nFreeDOF_element_u[left_eN_ebN];jj++)
5039  {
5040  j = freeLocal_u[left_eN_ebN*nDOF_trial_element+
5041  jj];
5042  J = offset_u + stride_u*freeGlobal_u[left_eN_ebN*nDOF_trial_element+
5043  jj];
5044  jacIndex = I+J*nFreeVDOF_global;
5045  jac[jacIndex]
5046  -=
5047  elementBoundaryFluxJacobian_eb[ebN*2*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_trial_element+
5048  0*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_trial_element+
5049  ebN_element*nQuadraturePoints_elementBoundary*nDOF_trial_element+
5050  k*nDOF_trial_element+
5051  j]
5052  *
5053  w_dS[right_eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_test_element+
5054  right_ebN_element*nQuadraturePoints_elementBoundary*nDOF_test_element+
5055  k*nDOF_test_element+
5056  i];
5057 /* printf("ind=%i,ebN = %i,left_eN_global=%i,left_ebN_element=%i,ebN_element=%i,i=%i,j=%i,jac=%12.5e,fjac=%12.5e,w=%12.5e\n", */
5058 /* jacIndex,ebN,right_eN_global,right_ebN_element,ebN_element,i,j,jac[jacIndex], */
5059 /* elementBoundaryFluxJacobian_eb[ebN*2*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_trial_element + */
5060 /* 0*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_trial_element+ */
5061 /* ebN_element*nQuadraturePoints_elementBoundary*nDOF_trial_element+ */
5062 /* k*nDOF_trial_element+ */
5063 /* j], */
5064 /* w_dS[right_eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_test_element + */
5065 /* right_ebN_element*nQuadraturePoints_elementBoundary*nDOF_test_element+ */
5066 /* k*nDOF_test_element+ */
5067 /* i]); */
5068  }
5069 /* if(right_eN_ebN >= 0 && right_eN_ebN < nElements_global) */
5070  if(right_eN_ebN >= 0)
5071  for(jj=0;jj<nFreeDOF_element_u[right_eN_ebN];jj++)
5072  {
5073  j = freeLocal_u[right_eN_ebN*nDOF_trial_element+
5074  jj];
5075  J = offset_u + stride_u*freeGlobal_u[right_eN_ebN*nDOF_trial_element+
5076  jj];
5077  jacIndex = I+J*nFreeVDOF_global;
5078  jac[jacIndex]
5079  -=
5080  elementBoundaryFluxJacobian_eb[ebN*2*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_trial_element+
5081  1*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_trial_element+
5082  ebN_element*nQuadraturePoints_elementBoundary*nDOF_trial_element+
5083  k*nDOF_trial_element+
5084  j]*
5085  w_dS[right_eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_test_element+
5086  right_ebN_element*nQuadraturePoints_elementBoundary*nDOF_test_element+
5087  k*nDOF_test_element+
5088  i];
5089 /* printf("ind=%i,ebN = %i,left_eN_global=%i,left_ebN_element=%i,ebN_element=%i,i=%i,j=%i,jac=%12.5e,fjac=%12.5e,w=%12.5e\n", */
5090 /* jacIndex,ebN,right_eN_global,right_ebN_element,ebN_element,i,j,jac[jacIndex], */
5091 /* elementBoundaryFluxJacobian_eb[ebN*2*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_trial_element + */
5092 /* 1*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_trial_element+ */
5093 /* ebN_element*nQuadraturePoints_elementBoundary*nDOF_trial_element+ */
5094 /* k*nDOF_trial_element+ */
5095 /* j], */
5096 /* w_dS[right_eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_test_element + */
5097 /* right_ebN_element*nQuadraturePoints_elementBoundary*nDOF_test_element+ */
5098 /* k*nDOF_test_element+ */
5099 /* i]); */
5100  }
5101  }
5102  }
5103  }
5104  }
5105 }
5110  int nElementBoundaries_element,
5111  int nQuadraturePoints_elementBoundary,
5112  int nDOF_test_element,
5113  int nDOF_trial_element,
5114  int offset_r,
5115  int stride_r,
5116  int offset_u,
5117  int stride_u,
5118  int nFreeVDOF_global,
5119  int* interiorElementBoundaries,
5120  int* elementBoundaryElements,
5121  int* elementBoundaryLocalElementBoundaries,
5122  int* nFreeDOF_element_r,
5123  int* freeLocal_r,
5124  int* freeGlobal_r,
5125  int* nFreeDOF_element_u,
5126  int* freeLocal_u,
5127  int* freeGlobal_u,
5128  double* elementBoundaryFluxJacobian_2sided,
5129  double* w_dS,
5130  double* jac)
5131 {
5132  int ebNI,ebN,left_eN_global,right_eN_global,left_ebN_element,right_ebN_element,ii,i,k,jj,j,jacIndex,I,J;
5133  for (ebNI=0;ebNI<nInteriorElementBoundaries_global;ebNI++)
5134  {
5135  ebN = interiorElementBoundaries[ebNI];
5136  left_eN_global = elementBoundaryElements[ebN*2+0];
5137  right_eN_global = elementBoundaryElements[ebN*2+1];
5138  left_ebN_element = elementBoundaryLocalElementBoundaries[ebN*2+0];
5139  right_ebN_element = elementBoundaryLocalElementBoundaries[ebN*2+1];
5140  /*left flux*/
5141  for(ii=0;ii<nFreeDOF_element_r[left_eN_global];ii++)
5142  {
5143  i = freeLocal_r[left_eN_global*nDOF_test_element+
5144  ii];
5145  I = offset_r + stride_r*freeGlobal_r[left_eN_global*nDOF_test_element+
5146  ii];
5147  for(k=0;k<nQuadraturePoints_elementBoundary;k++)
5148  {
5149  for(jj=0;jj<nFreeDOF_element_u[left_eN_global];jj++)
5150  {
5151  j = freeLocal_u[left_eN_global*nDOF_trial_element+
5152  jj];
5153  J = offset_u + stride_u*freeGlobal_u[left_eN_global*nDOF_trial_element+
5154  jj];
5155  jacIndex = I+J*nFreeVDOF_global;
5156  jac[jacIndex]
5157  +=
5158  elementBoundaryFluxJacobian_2sided[ebN*2*2*nQuadraturePoints_elementBoundary*nDOF_trial_element +
5159  0*2*nQuadraturePoints_elementBoundary*nDOF_trial_element + /*left flux*/
5160  0*nQuadraturePoints_elementBoundary*nDOF_trial_element+ /*left neig. dep*/
5161  k*nDOF_trial_element+
5162  j]
5163  *
5164  w_dS[left_eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_test_element +
5165  left_ebN_element*nQuadraturePoints_elementBoundary*nDOF_test_element+
5166  k*nDOF_test_element+
5167  i];
5168  }
5169  for(jj=0;jj<nFreeDOF_element_u[right_eN_global];jj++)
5170  {
5171  j = freeLocal_u[right_eN_global*nDOF_trial_element+
5172  jj];
5173  J = offset_u + stride_u*freeGlobal_u[right_eN_global*nDOF_trial_element+
5174  jj];
5175  jacIndex = I+J*nFreeVDOF_global;
5176  jac[jacIndex]
5177  +=
5178  elementBoundaryFluxJacobian_2sided[ebN*2*2*nQuadraturePoints_elementBoundary*nDOF_trial_element +
5179  0*2*nQuadraturePoints_elementBoundary*nDOF_trial_element + /*left flux*/
5180  1*nQuadraturePoints_elementBoundary*nDOF_trial_element+ /*right neig. dep*/
5181  k*nDOF_trial_element+
5182  j]*
5183  w_dS[left_eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_test_element +
5184  left_ebN_element*nQuadraturePoints_elementBoundary*nDOF_test_element+
5185  k*nDOF_test_element+i];
5186  }
5187  }/*k*/
5188  }/*ii*/
5189  /*right flux*/
5190  for(ii=0;ii<nFreeDOF_element_r[right_eN_global];ii++)
5191  {
5192  i = freeLocal_r[right_eN_global*nDOF_test_element+
5193  ii];
5194  I = offset_r + stride_r*freeGlobal_r[right_eN_global*nDOF_test_element+
5195  ii];
5196  for(k=0;k<nQuadraturePoints_elementBoundary;k++)
5197  {
5198  for(jj=0;jj<nFreeDOF_element_u[left_eN_global];jj++)
5199  {
5200  j = freeLocal_u[left_eN_global*nDOF_trial_element+
5201  jj];
5202  J = offset_u + stride_u*freeGlobal_u[left_eN_global*nDOF_trial_element+
5203  jj];
5204  jacIndex = I+J*nFreeVDOF_global;
5205  jac[jacIndex]
5206  +=
5207  elementBoundaryFluxJacobian_2sided[ebN*2*2*nQuadraturePoints_elementBoundary*nDOF_trial_element+
5208  1*2*nQuadraturePoints_elementBoundary*nDOF_trial_element + /*right flux*/
5209  0*nQuadraturePoints_elementBoundary*nDOF_trial_element+ /*left neighbor*/
5210  k*nDOF_trial_element+
5211  j]
5212  *
5213  w_dS[right_eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_test_element+
5214  right_ebN_element*nQuadraturePoints_elementBoundary*nDOF_test_element+
5215  k*nDOF_test_element+
5216  i];
5217  }
5218  for(jj=0;jj<nFreeDOF_element_u[right_eN_global];jj++)
5219  {
5220  j = freeLocal_u[right_eN_global*nDOF_trial_element+
5221  jj];
5222  J = offset_u + stride_u*freeGlobal_u[right_eN_global*nDOF_trial_element+
5223  jj];
5224  jacIndex = I+J*nFreeVDOF_global;
5225  jac[jacIndex]
5226  +=
5227  elementBoundaryFluxJacobian_2sided[ebN*2*2*nQuadraturePoints_elementBoundary*nDOF_trial_element+
5228  1*2*nQuadraturePoints_elementBoundary*nDOF_trial_element + /*right flux*/
5229  1*nQuadraturePoints_elementBoundary*nDOF_trial_element+ /*right neig dep*/
5230  k*nDOF_trial_element+
5231  j]*
5232  w_dS[right_eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_test_element+
5233  right_ebN_element*nQuadraturePoints_elementBoundary*nDOF_test_element+
5234  k*nDOF_test_element+
5235  i];
5236  }
5237  }
5238  }
5239  }
5240 }
5241 
5246  int nElementBoundaries_element,
5247  int nQuadraturePoints_elementBoundary,
5248  int nDOF_test_element,
5249  int nDOF_trial_element,
5250  int offset_r,
5251  int stride_r,
5252  int offset_u,
5253  int stride_u,
5254  int nFreeVDOF_global,
5255  int* exteriorElementBoundaries,
5256  int* elementBoundaryElements,
5257  int* elementBoundaryLocalElementBoundaries,
5258  int* nFreeDOF_element_r,
5259  int* freeLocal_r,
5260  int* freeGlobal_r,
5261  int* nFreeDOF_element_u,
5262  int* freeLocal_u,
5263  int* freeGlobal_u,
5264  double* elementBoundaryFluxJacobian,
5265  double* w_dS,
5266  double* jac)
5267 {
5268  int ebNE,ebN,eN_global,ebN_element,ii,i,k,jj,j,I,J,jacIndex;
5269  for (ebNE=0;ebNE<nExteriorElementBoundaries_global;ebNE++)
5270  {
5271  ebN = exteriorElementBoundaries[ebNE];
5272  eN_global = elementBoundaryElements[ebN*2+0];
5273  ebN_element = elementBoundaryLocalElementBoundaries[ebN*2+0];
5274  for(ii=0;ii<nFreeDOF_element_r[eN_global];ii++)
5275  {
5276  i = freeLocal_r[eN_global*nDOF_test_element+
5277  ii];
5278  I = offset_r + stride_r*freeGlobal_r[eN_global*nDOF_test_element+
5279  ii];
5280  for(k=0;k<nQuadraturePoints_elementBoundary;k++)
5281  {
5282  for(jj=0;jj<nFreeDOF_element_u[eN_global];jj++)
5283  {
5284  j = freeLocal_u[eN_global*nDOF_trial_element+
5285  jj];
5286  J = offset_u + stride_u*freeGlobal_u[eN_global*nDOF_trial_element+
5287  jj];
5288  jacIndex = I+J*nFreeVDOF_global;
5289  jac[jacIndex]
5290  +=
5291  elementBoundaryFluxJacobian[ebN*2*nQuadraturePoints_elementBoundary*nDOF_trial_element +
5292  0*nQuadraturePoints_elementBoundary*nDOF_trial_element+
5293  k*nDOF_trial_element+
5294  j]
5295  *
5296  w_dS[eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_test_element +
5297  ebN_element*nQuadraturePoints_elementBoundary*nDOF_test_element+
5298  k*nDOF_test_element+
5299  i];
5300  }
5301  }
5302  }
5303  }
5304 }
5305 
5310  int nElements_global,
5311  int nExteriorElementBoundaries_global,
5312  int nElementBoundaries_element,
5313  int nQuadraturePoints_elementBoundary,
5314  int nDOF_test_element,
5315  int nDOF_trial_element,
5316  int offset_r,
5317  int stride_r,
5318  int offset_u,
5319  int stride_u,
5320  int nFreeVDOF_global,
5321  int* exteriorElementBoundaries,
5322  int* elementBoundaryElements,
5323  int* elementBoundaryLocalElementBoundaries,
5324  int* nFreeDOF_element_r,
5325  int* freeLocal_r,
5326  int* freeGlobal_r,
5327  int* nFreeDOF_element_u,
5328  int* freeLocal_u,
5329  int* freeGlobal_u,
5330  double* elementBoundaryFluxJacobian_eb,
5331  double* w_dS,
5332  double* jac)
5333 {
5334  int ebNE,ebN,eN_global,ebN_element,ebN_eN,eN_ebN,ii,i,k,jj,j,I,J,jacIndex;
5335  for (ebNE=0;ebNE<nExteriorElementBoundaries_global;ebNE++)
5336  {
5337  ebN = exteriorElementBoundaries[ebNE];
5338  eN_global = elementBoundaryElements[ebN*2+0];
5339  ebN_element = elementBoundaryLocalElementBoundaries[ebN*2+0];
5340  for (ebN_eN=0;ebN_eN<nElementBoundaries_element;ebN_eN++)
5341  {
5342 /* /\* cek debugging 1D *\/ */
5343 /* if(ebN_eN == 0) */
5344 /* eN_ebN = eN_global+1; */
5345 /* if(ebN_eN == 1) */
5346 /* eN_ebN = eN_global-1; */
5347  eN_ebN = elementNeighbors[eN_global*nElementBoundaries_element+ebN_eN];
5348  for(ii=0;ii<nFreeDOF_element_r[eN_global];ii++)
5349  {
5350  i = freeLocal_r[eN_global*nDOF_test_element+
5351  ii];
5352  I = offset_r + stride_r*freeGlobal_r[eN_global*nDOF_test_element+
5353  ii];
5354  for(k=0;k<nQuadraturePoints_elementBoundary;k++)
5355  {
5356 /* if(eN_ebN >= 0 && eN_ebN < nElements_global) */
5357  if(eN_ebN >= 0)
5358  for(jj=0;jj<nFreeDOF_element_u[eN_ebN];jj++)
5359  {
5360  j = freeLocal_u[eN_ebN*nDOF_trial_element+
5361  jj];
5362  J = offset_u + stride_u*freeGlobal_u[eN_ebN*nDOF_trial_element+
5363  jj];
5364  jacIndex = I+J*nFreeVDOF_global;
5365  jac[jacIndex]
5366  +=
5367  elementBoundaryFluxJacobian_eb[ebN*2*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_trial_element +
5368  0*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_trial_element+
5369  ebN_eN*nQuadraturePoints_elementBoundary*nDOF_trial_element+
5370  k*nDOF_trial_element+
5371  j]
5372  *
5373  w_dS[eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_test_element +
5374  ebN_element*nQuadraturePoints_elementBoundary*nDOF_test_element+
5375  k*nDOF_test_element+
5376  i];
5377 /* printf("ind=%i,ebN = %i,eN_global=%i,ebN_element=%i,ebN_element=%i,i=%i,j=%i,jac=%12.5e,fjac=%12.5e,w=%12.5e\n", */
5378 /* jacIndex,ebN,eN_global,ebN_element,ebN_element,i,j,jac[jacIndex], */
5379 /* elementBoundaryFluxJacobian_eb[ebN*2*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_trial_element + */
5380 /* 0*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_trial_element+ */
5381 /* ebN_element*nQuadraturePoints_elementBoundary*nDOF_trial_element+ */
5382 /* k*nDOF_trial_element+ */
5383 /* j], */
5384 /* w_dS[eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_test_element + */
5385 /* ebN_element*nQuadraturePoints_elementBoundary*nDOF_test_element+ */
5386 /* k*nDOF_test_element+ */
5387 /* i]); */
5388  }
5389  }
5390  }
5391  }
5392  }
5393 }
5400  int nElements_global,
5401  int nExteriorElementBoundaries_global,
5402  int nElementBoundaries_element,
5403  int nQuadraturePoints_elementBoundary,
5404  int nDOF_test_element,
5405  int nDOF_trial_element,
5406  int offset_r,
5407  int stride_r,
5408  int offset_u,
5409  int stride_u,
5410  int nFreeVDOF_global,
5411  int* exteriorElementBoundaries,
5412  int* elementBoundaryElements,
5413  int* elementBoundaryLocalElementBoundaries,
5414  int* nFreeDOF_element_r,
5415  int* freeLocal_r,
5416  int* freeGlobal_r,
5417  int* nFreeDOF_element_u,
5418  int* freeLocal_u,
5419  int* freeGlobal_u,
5420  double* elementBoundaryFluxJacobian_eb,
5421  double* w_dS,
5422  double* jac)
5423 {
5424  int ebNE,ebN,eN_global,ebN_element,ebN_eN,eN_ebN,ii,i,k,jj,j,I,J,jacIndex;
5425  for (ebNE=0;ebNE<nExteriorElementBoundaries_global;ebNE++)
5426  {
5427  ebN = exteriorElementBoundaries[ebNE];
5428  eN_global = elementBoundaryElements[ebN*2+0];
5429  ebN_element = elementBoundaryLocalElementBoundaries[ebN*2+0];
5430  for (ebN_eN=0;ebN_eN<nElementBoundaries_element;ebN_eN++)
5431  {
5432 /* /\* cek debugging 1D *\/ */
5433 /* if(ebN_eN == 0) */
5434 /* eN_ebN = eN_global+1; */
5435 /* if(ebN_eN == 1) */
5436 /* eN_ebN = eN_global-1; */
5437  eN_ebN = elementNeighbors[eN_global*nElementBoundaries_element+ebN_eN];
5438  for(ii=0;ii<nFreeDOF_element_r[eN_global];ii++)
5439  {
5440  i = freeLocal_r[eN_global*nDOF_test_element+
5441  ii];
5442  I = offset_r + stride_r*freeGlobal_r[eN_global*nDOF_test_element+
5443  ii];
5444  for(k=0;k<nQuadraturePoints_elementBoundary;k++)
5445  {
5446 /* if(eN_ebN >= 0 && eN_ebN < nElements_global) */
5447  if(eN_ebN >= 0)
5448  for(jj=0;jj<nFreeDOF_element_u[eN_ebN];jj++)
5449  {
5450  j = freeLocal_u[eN_ebN*nDOF_trial_element+
5451  jj];
5452  J = offset_u + stride_u*freeGlobal_u[eN_ebN*nDOF_trial_element+
5453  jj];
5454  jacIndex = I+J*nFreeVDOF_global;
5455  jac[jacIndex]
5456  +=
5457  elementBoundaryFluxJacobian_eb[ebN*2*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_trial_element +
5458  0*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_trial_element+
5459  ebN_eN*nQuadraturePoints_elementBoundary*nDOF_trial_element+
5460  k*nDOF_trial_element+
5461  j]
5462  *
5463  w_dS[ebNE*nQuadraturePoints_elementBoundary*nDOF_test_element+
5464  k*nDOF_test_element+
5465  i];
5466 /* printf("ind=%i,ebN = %i,eN_global=%i,ebN_element=%i,ebN_element=%i,i=%i,j=%i,jac=%12.5e,fjac=%12.5e,w=%12.5e\n", */
5467 /* jacIndex,ebN,eN_global,ebN_element,ebN_element,i,j,jac[jacIndex], */
5468 /* elementBoundaryFluxJacobian_eb[ebN*2*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_trial_element + */
5469 /* 0*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_trial_element+ */
5470 /* ebN_element*nQuadraturePoints_elementBoundary*nDOF_trial_element+ */
5471 /* k*nDOF_trial_element+ */
5472 /* j], */
5473 /* w_dS[eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_test_element + */
5474 /* ebN_element*nQuadraturePoints_elementBoundary*nDOF_test_element+ */
5475 /* k*nDOF_test_element+ */
5476 /* i]); */
5477  }
5478  }
5479  }
5480  }
5481  }
5482 }
5487  int nQuadraturePoints_elementBoundary,
5488  int nDOF_test_element,
5489  int nDOF_trial_element,
5490  int offset_r,
5491  int stride_r,
5492  int offset_u,
5493  int stride_u,
5494  int nFreeVDOF_global,
5495  int* exteriorElementBoundaries,
5496  int* elementBoundaryElements,
5497  int* elementBoundaryLocalElementBoundaries,
5498  int* nFreeDOF_element_r,
5499  int* freeLocal_r,
5500  int* freeGlobal_r,
5501  int* nFreeDOF_element_u,
5502  int* freeLocal_u,
5503  int* freeGlobal_u,
5504  double* elementBoundaryFluxJacobian,
5505  double* w_dS,
5506  double* jac)
5507 {
5508  int ebNE,ebN,eN_global,ebN_element,ii,i,k,jj,j,I,J,jacIndex;
5509  for (ebNE=0;ebNE<nExteriorElementBoundaries_global;ebNE++)
5510  {
5511  ebN = exteriorElementBoundaries[ebNE];
5512  eN_global = elementBoundaryElements[ebN*2+0];
5513  ebN_element = elementBoundaryLocalElementBoundaries[ebN*2+0];
5514  for(ii=0;ii<nFreeDOF_element_r[eN_global];ii++)
5515  {
5516  i = freeLocal_r[eN_global*nDOF_test_element+
5517  ii];
5518  I = offset_r + stride_r*freeGlobal_r[eN_global*nDOF_test_element+
5519  ii];
5520  for(k=0;k<nQuadraturePoints_elementBoundary;k++)
5521  {
5522  for(jj=0;jj<nFreeDOF_element_u[eN_global];jj++)
5523  {
5524  j = freeLocal_u[eN_global*nDOF_trial_element+
5525  jj];
5526  J = offset_u + stride_u*freeGlobal_u[eN_global*nDOF_trial_element+
5527  jj];
5528  jacIndex = I+J*nFreeVDOF_global;
5529  jac[jacIndex]
5530  +=
5531  elementBoundaryFluxJacobian[ebNE*nQuadraturePoints_elementBoundary*nDOF_trial_element+
5532  k*nDOF_trial_element+
5533  j]
5534  *
5535  w_dS[ebNE*nQuadraturePoints_elementBoundary*nDOF_test_element+
5536  k*nDOF_test_element+
5537  i];
5538  }
5539  }
5540  }
5541  }
5542 }
5543 
5548  int nDOF_test_element,
5549  int nDOF_trial_element,
5550  int* nFreeDOF_element_r,
5551  int* freeLocal_r,
5552  int* nFreeDOF_element_u,
5553  int* freeLocal_u,
5554  int* csrRowIndeces_ru,
5555  int* csrColumnOffsets_ru,
5556  double* elementJacobian,
5557  double* globalJacobian)
5558 {
5559  int eN,ii,jj,i,j,jacIndex,nDOF_test_X_trial_element=nDOF_test_element*nDOF_trial_element;
5560  for (eN=0;eN<nElements_global;eN++)
5561  for (ii=0;ii<nFreeDOF_element_r[eN];ii++)
5562  {
5563  i = freeLocal_r[eN*nDOF_test_element+
5564  ii];
5565  for (jj=0;jj<nFreeDOF_element_u[eN];jj++)
5566  {
5567  j = freeLocal_u[eN*nDOF_trial_element+
5568  jj];
5569  jacIndex = csrRowIndeces_ru[eN*nDOF_test_element+
5570  ii]
5571  +
5572  csrColumnOffsets_ru[eN*nDOF_test_X_trial_element+
5573  ii*nDOF_trial_element+
5574  jj];
5575  globalJacobian[jacIndex]
5576  +=
5577  elementJacobian[eN*nDOF_test_X_trial_element +
5578  i*nDOF_trial_element +
5579  j];
5580  }
5581  }
5582 }
5583 
5588  int nElements_global,
5589  int nElementBoundaries_element,
5590  int nDOF_test_element,
5591  int nDOF_trial_element,
5592  int* nFreeDOF_element_r,
5593  int* freeLocal_r,
5594  int* nFreeDOF_element_u,
5595  int* freeLocal_u,
5596  int* csrRowIndeces_ru,
5597  int* csrColumnOffsets_eb_ru,
5598  double* elementJacobian_eb,
5599  double* globalJacobian)
5600 {
5601  int eN,ebN,eN_ebN,ii,jj,i,j,jacIndex,nDOF_test_X_trial_element=nDOF_test_element*nDOF_trial_element;
5602  for (eN=0;eN<nElements_global;eN++)
5603  for (ebN=0;ebN<nElementBoundaries_element;ebN++)
5604  {
5605 /* /\*cek 1D debugging *\/ */
5606 /* /\** \todo cek Need to add mesh structure for getting element's corresponding to element boundaries and */
5607 /* fix sparse matrix load of off element jacobian terms in the element Jacobians for LDG methods *\/ */
5608 /* if(ebN == 0) */
5609 /* eN_ebN = eN+1; */
5610 /* if(ebN == 1) */
5611 /* eN_ebN = eN-1; */
5612  eN_ebN = elementNeighbors[eN*nElementBoundaries_element+ebN];
5613  if (eN_ebN >= 0)
5614  for (ii=0;ii<nFreeDOF_element_r[eN];ii++)
5615  {
5616  i = freeLocal_r[eN*nDOF_test_element+
5617  ii];
5618  for (jj=0;jj<nFreeDOF_element_u[eN_ebN];jj++)
5619  {
5620  j = freeLocal_u[eN_ebN*nDOF_trial_element+
5621  jj];
5622  jacIndex = csrRowIndeces_ru[eN*nDOF_test_element+
5623  ii]
5624  +
5625  csrColumnOffsets_eb_ru[eN*nElementBoundaries_element*nDOF_test_X_trial_element+
5626  ebN*nDOF_test_X_trial_element+
5627  ii*nDOF_trial_element+
5628  jj];
5629  globalJacobian[jacIndex]
5630  +=
5631  elementJacobian_eb[eN*nElementBoundaries_element*nDOF_test_X_trial_element +
5632  ebN*nDOF_test_X_trial_element+
5633  i*nDOF_trial_element +
5634  j];
5635  }
5636  }
5637  }
5638 }
5639 
5643 void updateGlobalJacobianFromInteriorElementBoundaryFluxJacobian_CSR(int nInteriorElementBoundaries_global,
5644  int nElementBoundaries_element,
5645  int nQuadraturePoints_elementBoundary,
5646  int nDOF_test_element,
5647  int nDOF_trial_element,
5648  int* interiorElementBoundaries,
5649  int* elementBoundaryElements,
5650  int* elementBoundaryLocalElementBoundaries,
5651  int* nFreeDOF_element_r,
5652  int* freeLocal_r,
5653  int* nFreeDOF_element_u,
5654  int* freeLocal_u,
5655  int* csrRowIndeces_ru,
5656  int* csrColumnOffsets_eb_ru,
5657  double* elementBoundaryFluxJacobian,
5658  double* w_dS,
5659  double* jac)
5660 {
5661  int ebNI,ebN,left_eN_global,right_eN_global,left_ebN_element,right_ebN_element,ii,i,k,jj,j,nDOF_test_X_trial_element=nDOF_test_element*nDOF_trial_element,jacIndex;
5662  for (ebNI=0;ebNI<nInteriorElementBoundaries_global;ebNI++)
5663  {
5664  ebN = interiorElementBoundaries[ebNI];
5665  left_eN_global = elementBoundaryElements[ebN*2+0];
5666  right_eN_global = elementBoundaryElements[ebN*2+1];
5667  left_ebN_element = elementBoundaryLocalElementBoundaries[ebN*2+0];
5668  right_ebN_element = elementBoundaryLocalElementBoundaries[ebN*2+1];
5669  for(ii=0;ii<nFreeDOF_element_r[left_eN_global];ii++)
5670  {
5671  i = freeLocal_r[left_eN_global*nDOF_test_element+ii];
5672  for(k=0;k<nQuadraturePoints_elementBoundary;k++)
5673  {
5674  for(jj=0;jj<nFreeDOF_element_u[left_eN_global];jj++)
5675  {
5676  j = freeLocal_u[left_eN_global*nDOF_trial_element+
5677  jj];
5678  jacIndex = csrRowIndeces_ru[left_eN_global*nDOF_test_element+
5679  ii]
5680  +
5681  csrColumnOffsets_eb_ru[ebN*4*nDOF_test_X_trial_element +
5682  0*2*nDOF_test_X_trial_element +
5683  0*nDOF_test_X_trial_element +
5684  ii*nDOF_trial_element +
5685  jj];
5686  jac[jacIndex]
5687  +=
5688  elementBoundaryFluxJacobian[ebN*2*nQuadraturePoints_elementBoundary*nDOF_trial_element +
5689  0*nQuadraturePoints_elementBoundary*nDOF_trial_element+
5690  k*nDOF_trial_element+
5691  j]
5692  *
5693  w_dS[left_eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_test_element +
5694  left_ebN_element*nQuadraturePoints_elementBoundary*nDOF_test_element+
5695  k*nDOF_test_element+
5696  i];
5697  }
5698  for(jj=0;jj<nFreeDOF_element_u[right_eN_global];jj++)
5699  {
5700  j = freeLocal_u[right_eN_global*nDOF_trial_element+
5701  jj];
5702  jacIndex = csrRowIndeces_ru[left_eN_global*nDOF_test_element+
5703  ii]
5704  +
5705  csrColumnOffsets_eb_ru[ebN*4*nDOF_test_X_trial_element+
5706  0*2*nDOF_test_X_trial_element+
5707  1*nDOF_test_X_trial_element+
5708  ii*nDOF_trial_element+
5709  jj];
5710  jac[jacIndex]
5711  +=
5712  elementBoundaryFluxJacobian[ebN*2*nQuadraturePoints_elementBoundary*nDOF_trial_element +
5713  1*nQuadraturePoints_elementBoundary*nDOF_trial_element+
5714  k*nDOF_trial_element+
5715  j]
5716  *
5717  w_dS[left_eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_test_element +
5718  left_ebN_element*nQuadraturePoints_elementBoundary*nDOF_test_element+
5719  k*nDOF_test_element+
5720  i];
5721  }
5722  }
5723  }
5724  for(ii=0;ii<nFreeDOF_element_r[right_eN_global];ii++)
5725  {
5726  i = freeLocal_r[right_eN_global*nDOF_test_element+
5727  ii];
5728  for(k=0;k<nQuadraturePoints_elementBoundary;k++)
5729  {
5730  for(jj=0;jj<nFreeDOF_element_u[left_eN_global];jj++)
5731  {
5732  j = freeLocal_u[left_eN_global*nDOF_trial_element+
5733  jj];
5734  jacIndex = csrRowIndeces_ru[right_eN_global*nDOF_test_element+
5735  ii]
5736  +
5737  csrColumnOffsets_eb_ru[ebN*4*nDOF_test_X_trial_element+
5738  1*2*nDOF_test_X_trial_element+
5739  0*nDOF_test_X_trial_element+
5740  ii*nDOF_trial_element+
5741  jj];
5742  jac[jacIndex]
5743  -=
5744  elementBoundaryFluxJacobian[ebN*2*nQuadraturePoints_elementBoundary*nDOF_trial_element+
5745  0*nQuadraturePoints_elementBoundary*nDOF_trial_element+
5746  k*nDOF_trial_element+
5747  j]
5748  *
5749  w_dS[right_eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_test_element+
5750  right_ebN_element*nQuadraturePoints_elementBoundary*nDOF_test_element+
5751  k*nDOF_test_element+
5752  i];
5753  }
5754  for(jj=0;jj<nFreeDOF_element_u[right_eN_global];jj++)
5755  {
5756  j = freeLocal_u[right_eN_global*nDOF_trial_element+
5757  jj];
5758  jacIndex = csrRowIndeces_ru[right_eN_global*nDOF_test_element+
5759  ii]
5760  +
5761  csrColumnOffsets_eb_ru[ebN*4*nDOF_test_X_trial_element+
5762  1*2*nDOF_test_X_trial_element+
5763  1*nDOF_test_X_trial_element+
5764  ii*nDOF_trial_element+
5765  jj];
5766  jac[jacIndex]
5767  -=
5768  elementBoundaryFluxJacobian[ebN*2*nQuadraturePoints_elementBoundary*nDOF_trial_element+
5769  1*nQuadraturePoints_elementBoundary*nDOF_trial_element+
5770  k*nDOF_trial_element+
5771  j]*
5772  w_dS[right_eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_test_element+
5773  right_ebN_element*nQuadraturePoints_elementBoundary*nDOF_test_element+
5774  k*nDOF_test_element+
5775  i];
5776  }
5777  }
5778  }
5779  }
5780 }
5781 
5785 void updateGlobalJacobianFromExteriorElementBoundaryFluxJacobian_CSR(int nExteriorElementBoundaries_global,
5786  int nElementBoundaries_element,
5787  int nQuadraturePoints_elementBoundary,
5788  int nDOF_test_element,
5789  int nDOF_trial_element,
5790  int* exteriorElementBoundaries,
5791  int* elementBoundaryElements,
5792  int* elementBoundaryLocalElementBoundaries,
5793  int* nFreeDOF_element_r,
5794  int* freeLocal_r,
5795  int* nFreeDOF_element_u,
5796  int* freeLocal_u,
5797  int* csrRowIndeces_ru,
5798  int* csrColumnOffsets_eb_ru,
5799  double* elementBoundaryFluxJacobian,
5800  double* w_dS,
5801  double* jac)
5802 {
5803  int ebNE,ebN,eN_global,ebN_element,ii,i,k,jj,j,nDOF_test_X_trial_element=nDOF_test_element*nDOF_trial_element,jacIndex;
5804  for (ebNE=0;ebNE<nExteriorElementBoundaries_global;ebNE++)
5805  {
5806  ebN = exteriorElementBoundaries[ebNE];
5807  eN_global = elementBoundaryElements[ebN*2+0];
5808  ebN_element = elementBoundaryLocalElementBoundaries[ebN*2+0];
5809  for(ii=0;ii<nFreeDOF_element_r[eN_global];ii++)
5810  {
5811  i = freeLocal_r[eN_global*nDOF_test_element+ii];
5812  for(k=0;k<nQuadraturePoints_elementBoundary;k++)
5813  {
5814  for(jj=0;jj<nFreeDOF_element_u[eN_global];jj++)
5815  {
5816  j = freeLocal_u[eN_global*nDOF_trial_element+
5817  jj];
5818  jacIndex = csrRowIndeces_ru[eN_global*nDOF_test_element+
5819  ii]
5820  +
5821  csrColumnOffsets_eb_ru[ebN*4*nDOF_test_X_trial_element +
5822  0*2*nDOF_test_X_trial_element +
5823  0*nDOF_test_X_trial_element +
5824  ii*nDOF_trial_element +
5825  jj];
5826  jac[jacIndex]
5827  +=
5828  elementBoundaryFluxJacobian[ebN*2*nQuadraturePoints_elementBoundary*nDOF_trial_element +
5829  0*nQuadraturePoints_elementBoundary*nDOF_trial_element+
5830  k*nDOF_trial_element+
5831  j]
5832  *
5833  w_dS[eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_test_element +
5834  ebN_element*nQuadraturePoints_elementBoundary*nDOF_test_element+
5835  k*nDOF_test_element+
5836  i];
5837  }
5838  }
5839  }
5840  }
5841 }
5846  int nQuadraturePoints_elementBoundary,
5847  int nDOF_test_element,
5848  int nDOF_trial_element,
5849  int* exteriorElementBoundaries,
5850  int* elementBoundaryElements,
5851  int* elementBoundaryLocalElementBoundaries,
5852  int* nFreeDOF_element_r,
5853  int* freeLocal_r,
5854  int* nFreeDOF_element_u,
5855  int* freeLocal_u,
5856  int* csrRowIndeces_ru,
5857  int* csrColumnOffsets_eb_ru,
5858  double* elementBoundaryFluxJacobian,
5859  double* w_dS,
5860  double* jac)
5861 {
5862  int ebNE,ebN,eN_global,ii,i,k,jj,j,nDOF_test_X_trial_element=nDOF_test_element*nDOF_trial_element,jacIndex;
5863  for (ebNE=0;ebNE<nExteriorElementBoundaries_global;ebNE++)
5864  {
5865  ebN = exteriorElementBoundaries[ebNE];
5866  eN_global = elementBoundaryElements[ebN*2+0];
5867  for(ii=0;ii<nFreeDOF_element_r[eN_global];ii++)
5868  {
5869  i = freeLocal_r[eN_global*nDOF_test_element+ii];
5870  for(k=0;k<nQuadraturePoints_elementBoundary;k++)
5871  {
5872  for(jj=0;jj<nFreeDOF_element_u[eN_global];jj++)
5873  {
5874  j = freeLocal_u[eN_global*nDOF_trial_element+
5875  jj];
5876  jacIndex = csrRowIndeces_ru[eN_global*nDOF_test_element+
5877  ii]
5878  +
5879  csrColumnOffsets_eb_ru[ebN*4*nDOF_test_X_trial_element +
5880  0*2*nDOF_test_X_trial_element +
5881  0*nDOF_test_X_trial_element +
5882  ii*nDOF_trial_element +
5883  jj];
5884  jac[jacIndex]
5885  +=
5886  elementBoundaryFluxJacobian[ebNE*nQuadraturePoints_elementBoundary*nDOF_trial_element+
5887  k*nDOF_trial_element+
5888  j]
5889  *
5890  w_dS[ebNE*nQuadraturePoints_elementBoundary*nDOF_test_element+
5891  k*nDOF_test_element+
5892  i];
5893  }
5894  }
5895  }
5896  }
5897 }
5898 
5903  int nInteriorElementBoundaries_global,
5904  int nElementBoundaries_element,
5905  int nQuadraturePoints_elementBoundary,
5906  int nDOF_test_element,
5907  int nDOF_trial_element,
5908  int* interiorElementBoundaries,
5909  int* elementBoundaryElements,
5910  int* elementBoundaryLocalElementBoundaries,
5911  int* nFreeDOF_element_r,
5912  int* freeLocal_r,
5913  int* nFreeDOF_element_u,
5914  int* freeLocal_u,
5915  int* csrRowIndeces_ru,
5916  int* csrColumnOffsets_eb_eNebN_ru,
5917  double* elementBoundaryFluxJacobian_eb,
5918  double* w_dS,
5919  double* jac)
5920 {
5921  int ebNI,ebN,ebN_element,left_eN_ebN,right_eN_ebN,left_eN_global,right_eN_global,left_ebN_element,right_ebN_element,ii,i,k,jj,j,nDOF_test_X_trial_element=nDOF_test_element*nDOF_trial_element,jacIndex;
5922  for (ebNI=0;ebNI<nInteriorElementBoundaries_global;ebNI++)
5923  {
5924  ebN = interiorElementBoundaries[ebNI];
5925  left_eN_global = elementBoundaryElements[ebN*2+0];
5926  right_eN_global = elementBoundaryElements[ebN*2+1];
5927  left_ebN_element = elementBoundaryLocalElementBoundaries[ebN*2+0];
5928  right_ebN_element = elementBoundaryLocalElementBoundaries[ebN*2+1];
5929  for(ebN_element=0;ebN_element<nElementBoundaries_element;ebN_element++)
5930  {
5931  left_eN_ebN = elementNeighbors[left_eN_global*nElementBoundaries_element+ebN_element];
5932  right_eN_ebN = elementNeighbors[right_eN_global*nElementBoundaries_element+ebN_element];
5933  for(ii=0;ii<nFreeDOF_element_r[left_eN_global];ii++)
5934  {
5935  i = freeLocal_r[left_eN_global*nDOF_test_element+ii];
5936  for(k=0;k<nQuadraturePoints_elementBoundary;k++)
5937  {
5938  if(left_eN_ebN >= 0)
5939  for(jj=0;jj<nFreeDOF_element_u[left_eN_ebN];jj++)
5940  {
5941  j = freeLocal_u[left_eN_ebN*nDOF_trial_element+
5942  jj];
5943  jacIndex = csrRowIndeces_ru[left_eN_global*nDOF_test_element+
5944  ii]
5945  +
5946  csrColumnOffsets_eb_eNebN_ru[ebN*4*nElementBoundaries_element*nDOF_test_X_trial_element +
5947  0*2*nElementBoundaries_element*nDOF_test_X_trial_element +
5948  0*nElementBoundaries_element*nDOF_test_X_trial_element +
5949  ebN_element*nDOF_test_X_trial_element+
5950  ii*nDOF_trial_element +
5951  jj];
5952  jac[jacIndex]
5953  +=
5954  elementBoundaryFluxJacobian_eb[ebN*2*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_trial_element +
5955  0*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_trial_element+
5956  ebN_element*nQuadraturePoints_elementBoundary*nDOF_trial_element+
5957  k*nDOF_trial_element+
5958  j]
5959  *
5960  w_dS[left_eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_test_element +
5961  left_ebN_element*nQuadraturePoints_elementBoundary*nDOF_test_element+
5962  k*nDOF_test_element+
5963  i];
5964 /* printf("ind=%i,ebN = %i,left_eN_global=%i,left_ebN_element=%i,ebN_element=%i,i=%i,j=%i,jac=%12.5e,fjac=%12.5e,w=%12.5e\n", */
5965 /* jacIndex,ebN,left_eN_global,left_ebN_element,ebN_element,i,j,jac[jacIndex], */
5966 /* elementBoundaryFluxJacobian_eb[ebN*2*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_trial_element + */
5967 /* 0*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_trial_element+ */
5968 /* ebN_element*nQuadraturePoints_elementBoundary*nDOF_trial_element+ */
5969 /* k*nDOF_trial_element+ */
5970 /* j], */
5971 /* w_dS[left_eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_test_element + */
5972 /* left_ebN_element*nQuadraturePoints_elementBoundary*nDOF_test_element+ */
5973 /* k*nDOF_test_element+ */
5974 /* i]); */
5975  }
5976  if(right_eN_ebN >= 0)
5977  for(jj=0;jj<nFreeDOF_element_u[right_eN_ebN];jj++)
5978  {
5979  j = freeLocal_u[right_eN_ebN*nDOF_trial_element+
5980  jj];
5981  jacIndex = csrRowIndeces_ru[left_eN_global*nDOF_test_element+
5982  ii]
5983  +
5984  csrColumnOffsets_eb_eNebN_ru[ebN*4*nElementBoundaries_element*nDOF_test_X_trial_element+
5985  0*2*nElementBoundaries_element*nDOF_test_X_trial_element+
5986  1*nElementBoundaries_element*nDOF_test_X_trial_element+
5987  ebN_element*nDOF_test_X_trial_element+
5988  ii*nDOF_trial_element+
5989  jj];
5990  jac[jacIndex]
5991  +=
5992  elementBoundaryFluxJacobian_eb[ebN*2*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_trial_element +
5993  1*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_trial_element+
5994  ebN_element*nQuadraturePoints_elementBoundary*nDOF_trial_element+
5995  k*nDOF_trial_element+
5996  j]
5997  *
5998  w_dS[left_eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_test_element +
5999  left_ebN_element*nQuadraturePoints_elementBoundary*nDOF_test_element+
6000  k*nDOF_test_element+
6001  i];
6002 /* printf("ind=%i,ebN = %i,left_eN_global=%i,left_ebN_element=%i,ebN_element=%i,i=%i,j=%i,jac=%12.5e,fjac=%12.5e,w=%12.5e\n", */
6003 /* jacIndex,ebN,left_eN_global,left_ebN_element,ebN_element,i,j,jac[jacIndex], */
6004 /* elementBoundaryFluxJacobian_eb[ebN*2*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_trial_element + */
6005 /* 1*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_trial_element+ */
6006 /* ebN_element*nQuadraturePoints_elementBoundary*nDOF_trial_element+ */
6007 /* k*nDOF_trial_element+ */
6008 /* j], */
6009 /* w_dS[left_eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_test_element + */
6010 /* left_ebN_element*nQuadraturePoints_elementBoundary*nDOF_test_element+ */
6011 /* k*nDOF_test_element+ */
6012 /* i]); */
6013  }
6014  }
6015  }
6016  for(ii=0;ii<nFreeDOF_element_r[right_eN_global];ii++)
6017  {
6018  i = freeLocal_r[right_eN_global*nDOF_test_element+
6019  ii];
6020  for(k=0;k<nQuadraturePoints_elementBoundary;k++)
6021  {
6022  if(left_eN_ebN >= 0)
6023  for(jj=0;jj<nFreeDOF_element_u[left_eN_ebN];jj++)
6024  {
6025  j = freeLocal_u[left_eN_ebN*nDOF_trial_element+
6026  jj];
6027  jacIndex = csrRowIndeces_ru[right_eN_global*nDOF_test_element+
6028  ii]
6029  +
6030  csrColumnOffsets_eb_eNebN_ru[ebN*4*nElementBoundaries_element*nDOF_test_X_trial_element+
6031  1*2*nElementBoundaries_element*nDOF_test_X_trial_element+
6032  0*nElementBoundaries_element*nDOF_test_X_trial_element+
6033  ebN_element*nDOF_test_X_trial_element+
6034  ii*nDOF_trial_element+
6035  jj];
6036  jac[jacIndex]
6037  -=
6038  elementBoundaryFluxJacobian_eb[ebN*2*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_trial_element+
6039  0*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_trial_element+
6040  ebN_element*nQuadraturePoints_elementBoundary*nDOF_trial_element+
6041  k*nDOF_trial_element+
6042  j]
6043  *
6044  w_dS[right_eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_test_element+
6045  right_ebN_element*nQuadraturePoints_elementBoundary*nDOF_test_element+
6046  k*nDOF_test_element+
6047  i];
6048 /* printf("ind=%i,ebN = %i,left_eN_global=%i,left_ebN_element=%i,ebN_element=%i,i=%i,j=%i,jac=%12.5e,fjac=%12.5e,w=%12.5e\n", */
6049 /* jacIndex,ebN,right_eN_global,right_ebN_element,ebN_element,i,j,jac[jacIndex], */
6050 /* elementBoundaryFluxJacobian_eb[ebN*2*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_trial_element + */
6051 /* 0*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_trial_element+ */
6052 /* ebN_element*nQuadraturePoints_elementBoundary*nDOF_trial_element+ */
6053 /* k*nDOF_trial_element+ */
6054 /* j], */
6055 /* w_dS[right_eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_test_element + */
6056 /* right_ebN_element*nQuadraturePoints_elementBoundary*nDOF_test_element+ */
6057 /* k*nDOF_test_element+ */
6058 /* i]); */
6059  }
6060  if(right_eN_ebN >= 0)
6061  for(jj=0;jj<nFreeDOF_element_u[right_eN_ebN];jj++)
6062  {
6063  j = freeLocal_u[right_eN_ebN*nDOF_trial_element+
6064  jj];
6065  jacIndex = csrRowIndeces_ru[right_eN_global*nDOF_test_element+
6066  ii]
6067  +
6068  csrColumnOffsets_eb_eNebN_ru[ebN*4*nElementBoundaries_element*nDOF_test_X_trial_element+
6069  1*2*nElementBoundaries_element*nDOF_test_X_trial_element+
6070  1*nElementBoundaries_element*nDOF_test_X_trial_element+
6071  ebN_element*nDOF_test_X_trial_element+
6072  ii*nDOF_trial_element+
6073  jj];
6074  jac[jacIndex]
6075  -=
6076  elementBoundaryFluxJacobian_eb[ebN*2*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_trial_element+
6077  1*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_trial_element+
6078  ebN_element*nQuadraturePoints_elementBoundary*nDOF_trial_element+
6079  k*nDOF_trial_element+
6080  j]*
6081  w_dS[right_eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_test_element+
6082  right_ebN_element*nQuadraturePoints_elementBoundary*nDOF_test_element+
6083  k*nDOF_test_element+
6084  i];
6085 /* printf("ind=%i,ebN = %i,left_eN_global=%i,left_ebN_element=%i,ebN_element=%i,i=%i,j=%i,jac=%12.5e,fjac=%12.5e,w=%12.5e\n", */
6086 /* jacIndex,ebN,right_eN_global,right_ebN_element,ebN_element,i,j,jac[jacIndex], */
6087 /* elementBoundaryFluxJacobian_eb[ebN*2*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_trial_element + */
6088 /* 1*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_trial_element+ */
6089 /* ebN_element*nQuadraturePoints_elementBoundary*nDOF_trial_element+ */
6090 /* k*nDOF_trial_element+ */
6091 /* j], */
6092 /* w_dS[right_eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_test_element + */
6093 /* right_ebN_element*nQuadraturePoints_elementBoundary*nDOF_test_element+ */
6094 /* k*nDOF_test_element+ */
6095 /* i]); */
6096  }
6097  }
6098  }
6099  }
6100  }
6101 }
6102 
6107  int nExteriorElementBoundaries_global,
6108  int nElementBoundaries_element,
6109  int nQuadraturePoints_elementBoundary,
6110  int nDOF_test_element,
6111  int nDOF_trial_element,
6112  int* exteriorElementBoundaries,
6113  int* elementBoundaryElements,
6114  int* elementBoundaryLocalElementBoundaries,
6115  int* nFreeDOF_element_r,
6116  int* freeLocal_r,
6117  int* nFreeDOF_element_u,
6118  int* freeLocal_u,
6119  int* csrRowIndeces_ru,
6120  int* csrColumnOffsets_eb_eNebN_ru,
6121  double* elementBoundaryFluxJacobian_eb,
6122  double* w_dS,
6123  double* jac)
6124 {
6125  int ebNE,ebN,ebN_eN,eN_ebN,eN_global,ebN_element,ii,i,k,jj,j,nDOF_test_X_trial_element=nDOF_test_element*nDOF_trial_element,jacIndex;
6126  for (ebNE=0;ebNE<nExteriorElementBoundaries_global;ebNE++)
6127  {
6128  ebN = exteriorElementBoundaries[ebNE];
6129  eN_global = elementBoundaryElements[ebN*2+0];
6130  ebN_element = elementBoundaryLocalElementBoundaries[ebN*2+0];
6131  for(ebN_eN=0;ebN_eN<nElementBoundaries_element;ebN_eN++)
6132  {
6133  eN_ebN = elementNeighbors[eN_global*nElementBoundaries_element+ebN_eN];
6134  for(ii=0;ii<nFreeDOF_element_r[eN_global];ii++)
6135  {
6136  i = freeLocal_r[eN_global*nDOF_test_element+ii];
6137  for(k=0;k<nQuadraturePoints_elementBoundary;k++)
6138  {
6139  if(eN_ebN >= 0)
6140  for(jj=0;jj<nFreeDOF_element_u[eN_ebN];jj++)
6141  {
6142  j = freeLocal_u[eN_ebN*nDOF_trial_element+
6143  jj];
6144  jacIndex = csrRowIndeces_ru[eN_global*nDOF_test_element+
6145  ii]
6146  +
6147  csrColumnOffsets_eb_eNebN_ru[ebN*4*nElementBoundaries_element*nDOF_test_X_trial_element +
6148  0*2*nElementBoundaries_element*nDOF_test_X_trial_element +
6149  0*nElementBoundaries_element*nDOF_test_X_trial_element +
6150  ebN_eN*nDOF_test_X_trial_element +
6151  ii*nDOF_trial_element +
6152  jj];
6153  jac[jacIndex]
6154  +=
6155  elementBoundaryFluxJacobian_eb[ebN*2*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_trial_element +
6156  0*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_trial_element+
6157  ebN_eN*nQuadraturePoints_elementBoundary*nDOF_trial_element+
6158  k*nDOF_trial_element+
6159  j]
6160  *
6161  w_dS[eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_test_element +
6162  ebN_element*nQuadraturePoints_elementBoundary*nDOF_test_element+
6163  k*nDOF_test_element+
6164  i];
6165 /* printf("ind=%i,ebN = %i,eN_global=%i,ebN_element=%i,ebN_element=%i,i=%i,j=%i,jac=%12.5e,fjac=%12.5e,w=%12.5e\n", */
6166 /* jacIndex,ebN,eN_global,ebN_element,ebN_element,i,j,jac[jacIndex], */
6167 /* elementBoundaryFluxJacobian_eb[ebN*2*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_trial_element + */
6168 /* 0*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_trial_element+ */
6169 /* ebN_element*nQuadraturePoints_elementBoundary*nDOF_trial_element+ */
6170 /* k*nDOF_trial_element+ */
6171 /* j], */
6172 /* w_dS[eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_test_element + */
6173 /* ebN_element*nQuadraturePoints_elementBoundary*nDOF_test_element+ */
6174 /* k*nDOF_test_element+ */
6175 /* i]); */
6176  }
6177  }
6178  }
6179  }
6180  }
6181 }
6188  int nExteriorElementBoundaries_global,
6189  int nElementBoundaries_element,
6190  int nQuadraturePoints_elementBoundary,
6191  int nDOF_test_element,
6192  int nDOF_trial_element,
6193  int* exteriorElementBoundaries,
6194  int* elementBoundaryElements,
6195  int* elementBoundaryLocalElementBoundaries,
6196  int* nFreeDOF_element_r,
6197  int* freeLocal_r,
6198  int* nFreeDOF_element_u,
6199  int* freeLocal_u,
6200  int* csrRowIndeces_ru,
6201  int* csrColumnOffsets_eb_eNebN_ru,
6202  double* elementBoundaryFluxJacobian_eb,
6203  double* w_dS,
6204  double* jac)
6205 {
6206  int ebNE,ebN,ebN_eN,eN_ebN,eN_global,ebN_element,ii,i,k,jj,j,nDOF_test_X_trial_element=nDOF_test_element*nDOF_trial_element,jacIndex;
6207  for (ebNE=0;ebNE<nExteriorElementBoundaries_global;ebNE++)
6208  {
6209  ebN = exteriorElementBoundaries[ebNE];
6210  eN_global = elementBoundaryElements[ebN*2+0];
6211  ebN_element = elementBoundaryLocalElementBoundaries[ebN*2+0];
6212  for(ebN_eN=0;ebN_eN<nElementBoundaries_element;ebN_eN++)
6213  {
6214  eN_ebN = elementNeighbors[eN_global*nElementBoundaries_element+ebN_eN];
6215  for(ii=0;ii<nFreeDOF_element_r[eN_global];ii++)
6216  {
6217  i = freeLocal_r[eN_global*nDOF_test_element+ii];
6218  for(k=0;k<nQuadraturePoints_elementBoundary;k++)
6219  {
6220  if(eN_ebN >= 0)
6221  for(jj=0;jj<nFreeDOF_element_u[eN_ebN];jj++)
6222  {
6223  j = freeLocal_u[eN_ebN*nDOF_trial_element+
6224  jj];
6225  jacIndex = csrRowIndeces_ru[eN_global*nDOF_test_element+
6226  ii]
6227  +
6228  csrColumnOffsets_eb_eNebN_ru[ebN*4*nElementBoundaries_element*nDOF_test_X_trial_element +
6229  0*2*nElementBoundaries_element*nDOF_test_X_trial_element +
6230  0*nElementBoundaries_element*nDOF_test_X_trial_element +
6231  ebN_eN*nDOF_test_X_trial_element +
6232  ii*nDOF_trial_element +
6233  jj];
6234  jac[jacIndex]
6235  +=
6236  elementBoundaryFluxJacobian_eb[ebN*2*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_trial_element +
6237  0*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_trial_element+
6238  ebN_eN*nQuadraturePoints_elementBoundary*nDOF_trial_element+
6239  k*nDOF_trial_element+
6240  j]
6241  *
6242  w_dS[ebNE*nQuadraturePoints_elementBoundary*nDOF_test_element+
6243  k*nDOF_test_element+
6244  i];
6245 /* printf("ind=%i,ebN = %i,eN_global=%i,ebN_element=%i,ebN_element=%i,i=%i,j=%i,jac=%12.5e,fjac=%12.5e,w=%12.5e\n", */
6246 /* jacIndex,ebN,eN_global,ebN_element,ebN_element,i,j,jac[jacIndex], */
6247 /* elementBoundaryFluxJacobian_eb[ebN*2*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_trial_element + */
6248 /* 0*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_trial_element+ */
6249 /* ebN_element*nQuadraturePoints_elementBoundary*nDOF_trial_element+ */
6250 /* k*nDOF_trial_element+ */
6251 /* j], */
6252 /* w_dS[eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_test_element + */
6253 /* ebN_element*nQuadraturePoints_elementBoundary*nDOF_test_element+ */
6254 /* k*nDOF_test_element+ */
6255 /* i]); */
6256  }
6257  }
6258  }
6259  }
6260  }
6261 }
6266  int nElementBoundaries_element,
6267  int nQuadraturePoints_elementBoundary,
6268  int nDOF_test_element,
6269  int nDOF_trial_element,
6270  int* interiorElementBoundaries,
6271  int* elementBoundaryElements,
6272  int* elementBoundaryLocalElementBoundaries,
6273  int* nFreeDOF_element_r,
6274  int* freeLocal_r,
6275  int* nFreeDOF_element_u,
6276  int* freeLocal_u,
6277  int* csrRowIndeces_ru,
6278  int* csrColumnOffsets_eb_ru,
6279  double* elementBoundaryFluxJacobian_2sided,
6280  double* w_dS,
6281  double* jac)
6282 {
6283  int ebNI,ebN,left_eN_global,right_eN_global,left_ebN_element,right_ebN_element,ii,i,k,jj,j,nDOF_test_X_trial_element=nDOF_test_element*nDOF_trial_element,jacIndex;
6284  for (ebNI=0;ebNI<nInteriorElementBoundaries_global;ebNI++)
6285  {
6286  ebN = interiorElementBoundaries[ebNI];
6287  left_eN_global = elementBoundaryElements[ebN*2+0];
6288  right_eN_global = elementBoundaryElements[ebN*2+1];
6289  left_ebN_element = elementBoundaryLocalElementBoundaries[ebN*2+0];
6290  right_ebN_element = elementBoundaryLocalElementBoundaries[ebN*2+1];
6291  /*left flux*/
6292  for(ii=0;ii<nFreeDOF_element_r[left_eN_global];ii++)
6293  {
6294  i = freeLocal_r[left_eN_global*nDOF_test_element+ii];
6295  for(k=0;k<nQuadraturePoints_elementBoundary;k++)
6296  {
6297  for(jj=0;jj<nFreeDOF_element_u[left_eN_global];jj++)
6298  {
6299  j = freeLocal_u[left_eN_global*nDOF_trial_element+
6300  jj];
6301  jacIndex = csrRowIndeces_ru[left_eN_global*nDOF_test_element+
6302  ii]
6303  +
6304  csrColumnOffsets_eb_ru[ebN*4*nDOF_test_X_trial_element +
6305  0*2*nDOF_test_X_trial_element +
6306  0*nDOF_test_X_trial_element +
6307  ii*nDOF_trial_element +
6308  jj];
6309  jac[jacIndex]
6310  +=
6311  elementBoundaryFluxJacobian_2sided[ebN*2*2*nQuadraturePoints_elementBoundary*nDOF_trial_element +
6312  0*2*nQuadraturePoints_elementBoundary*nDOF_trial_element + /*left flux*/
6313  0*nQuadraturePoints_elementBoundary*nDOF_trial_element+ /*left neig dep*/
6314  k*nDOF_trial_element+
6315  j]
6316  *
6317  w_dS[left_eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_test_element +
6318  left_ebN_element*nQuadraturePoints_elementBoundary*nDOF_test_element+
6319  k*nDOF_test_element+
6320  i];
6321  }
6322  for(jj=0;jj<nFreeDOF_element_u[right_eN_global];jj++)
6323  {
6324  j = freeLocal_u[right_eN_global*nDOF_trial_element+
6325  jj];
6326  jacIndex = csrRowIndeces_ru[left_eN_global*nDOF_test_element+
6327  ii]
6328  +
6329  csrColumnOffsets_eb_ru[ebN*4*nDOF_test_X_trial_element+
6330  0*2*nDOF_test_X_trial_element+
6331  1*nDOF_test_X_trial_element+
6332  ii*nDOF_trial_element+
6333  jj];
6334  jac[jacIndex]
6335  +=
6336  elementBoundaryFluxJacobian_2sided[ebN*2*2*nQuadraturePoints_elementBoundary*nDOF_trial_element +
6337  0*2*nQuadraturePoints_elementBoundary*nDOF_trial_element + /*left flux*/
6338  1*nQuadraturePoints_elementBoundary*nDOF_trial_element+ /*right neig dep*/
6339  k*nDOF_trial_element+
6340  j]
6341  *
6342  w_dS[left_eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_test_element +
6343  left_ebN_element*nQuadraturePoints_elementBoundary*nDOF_test_element+
6344  k*nDOF_test_element+
6345  i];
6346  }
6347  }
6348  }
6349  /*right flux*/
6350  for(ii=0;ii<nFreeDOF_element_r[right_eN_global];ii++)
6351  {
6352  i = freeLocal_r[right_eN_global*nDOF_test_element+
6353  ii];
6354  for(k=0;k<nQuadraturePoints_elementBoundary;k++)
6355  {
6356  for(jj=0;jj<nFreeDOF_element_u[left_eN_global];jj++)
6357  {
6358  j = freeLocal_u[left_eN_global*nDOF_trial_element+
6359  jj];
6360  jacIndex = csrRowIndeces_ru[right_eN_global*nDOF_test_element+
6361  ii]
6362  +
6363  csrColumnOffsets_eb_ru[ebN*4*nDOF_test_X_trial_element+
6364  1*2*nDOF_test_X_trial_element+
6365  0*nDOF_test_X_trial_element+
6366  ii*nDOF_trial_element+
6367  jj];
6368  jac[jacIndex]
6369  +=
6370  elementBoundaryFluxJacobian_2sided[ebN*2*2*nQuadraturePoints_elementBoundary*nDOF_trial_element+
6371  1*2*nQuadraturePoints_elementBoundary*nDOF_trial_element + /*right flux*/
6372  0*nQuadraturePoints_elementBoundary*nDOF_trial_element+ /*left neig dep*/
6373  k*nDOF_trial_element+
6374  j]
6375  *
6376  w_dS[right_eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_test_element+
6377  right_ebN_element*nQuadraturePoints_elementBoundary*nDOF_test_element+
6378  k*nDOF_test_element+
6379  i];
6380  }
6381  for(jj=0;jj<nFreeDOF_element_u[right_eN_global];jj++)
6382  {
6383  j = freeLocal_u[right_eN_global*nDOF_trial_element+
6384  jj];
6385  jacIndex = csrRowIndeces_ru[right_eN_global*nDOF_test_element+
6386  ii]
6387  +
6388  csrColumnOffsets_eb_ru[ebN*4*nDOF_test_X_trial_element+
6389  1*2*nDOF_test_X_trial_element+
6390  1*nDOF_test_X_trial_element+
6391  ii*nDOF_trial_element+
6392  jj];
6393  jac[jacIndex]
6394  +=
6395  elementBoundaryFluxJacobian_2sided[ebN*2*2*nQuadraturePoints_elementBoundary*nDOF_trial_element+
6396  1*2*nQuadraturePoints_elementBoundary*nDOF_trial_element + /*right flux*/
6397  1*nQuadraturePoints_elementBoundary*nDOF_trial_element+ /*right neig dep*/
6398  k*nDOF_trial_element+
6399  j]*
6400  w_dS[right_eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_test_element+
6401  right_ebN_element*nQuadraturePoints_elementBoundary*nDOF_test_element+
6402  k*nDOF_test_element+
6403  i];
6404  }
6405  }
6406  }
6407  }
6408 }
6409 
6413 void calculateWeightedShape(int nElements_global,
6414  int nQuadraturePoints_element,
6415  int nDOF_test_element,
6416  double* dVR,
6417  double* abs_det_jac,
6418  double* w,
6419  double* w_dV)
6420 {
6421  int eN,i,k;
6422  for (eN=0;eN<nElements_global;eN++)
6423  for (k=0;k<nQuadraturePoints_element;k++)
6424  for (i=0;i<nDOF_test_element;i++)
6425  w_dV[eN*nQuadraturePoints_element*nDOF_test_element+
6426  k*nDOF_test_element+
6427  i]
6428  =
6429  w[eN*nQuadraturePoints_element*nDOF_test_element+
6430  k*nDOF_test_element+
6431  i]
6432  *
6433  dVR[k]
6434  *
6435  abs_det_jac[eN*nQuadraturePoints_element+
6436  k];
6437 }
6438 
6442 void calculateWeightedShapeGradients(int nElements_global,
6443  int nQuadraturePoints_element,
6444  int nDOF_test_element,
6445  int nSpace,
6446  double* dVR,
6447  double* abs_det_jac,
6448  double* grad_w,
6449  double* grad_w_dV)
6450 {
6451  int eN,i,k,I;
6452  for (eN=0;eN<nElements_global;eN++)
6453  for (k=0;k<nQuadraturePoints_element;k++)
6454  for (i=0;i<nDOF_test_element;i++)
6455  for (I=0;I<nSpace;I++)
6456  grad_w_dV[eN*nQuadraturePoints_element*nDOF_test_element*nSpace+
6457  k*nDOF_test_element*nSpace+
6458  i*nSpace+
6459  I]
6460  =
6461  grad_w[eN*nQuadraturePoints_element*nDOF_test_element*nSpace+
6462  k*nDOF_test_element*nSpace+
6463  i*nSpace+
6464  I]
6465  *
6466  dVR[k]
6467  *
6468  abs_det_jac[eN*nQuadraturePoints_element+
6469  k];
6470 }
6471 
6473 void calculateWeightedPiolaShapeGradients(int nElements_global,
6474  int nQuadraturePoints_element,
6475  int nDOF_test_element,
6476  int nSpace,
6477  double* dVR,
6478  double* abs_det_jac,
6479  double* grad_w,
6480  double* grad_w_dV)
6481 {
6482  int eN,i,k,I;
6483  for (eN=0;eN<nElements_global;eN++)
6484  for (k=0;k<nQuadraturePoints_element;k++)
6485  for (i=0;i<nDOF_test_element;i++)
6486  for (I=0;I<nSpace;I++)
6487  grad_w_dV[eN*nQuadraturePoints_element*nDOF_test_element*nSpace+
6488  k*nDOF_test_element*nSpace+
6489  i*nSpace+
6490  I]
6491  =
6492  grad_w[eN*nQuadraturePoints_element*nDOF_test_element*nSpace+
6493  k*nDOF_test_element*nSpace+
6494  i*nSpace+
6495  I]
6496  *
6497  dVR[k]
6498  ;
6499 }
6500 
6501 void calculateWeightedShapeHessians(int nElements_global,
6502  int nQuadraturePoints_element,
6503  int nDOF_test_element,
6504  int nSpace,
6505  double* dVR,
6506  double* abs_det_jac,
6507  double* Hess_w,
6508  double* Hess_w_dV)
6509 {
6510  int eN,i,k,I,J,nSpace2=nSpace*nSpace;
6511  for (eN=0;eN<nElements_global;eN++)
6512  for (k=0;k<nQuadraturePoints_element;k++)
6513  for (i=0;i<nDOF_test_element;i++)
6514  for (I=0;I<nSpace;I++)
6515  for (J=0;J<nSpace;J++)
6516  Hess_w_dV[eN*nQuadraturePoints_element*nDOF_test_element*nSpace2+
6517  k*nDOF_test_element*nSpace2+
6518  i*nSpace2+
6519  I*nSpace+
6520  J]
6521  =
6522  Hess_w[eN*nQuadraturePoints_element*nDOF_test_element*nSpace2+
6523  k*nDOF_test_element*nSpace2+
6524  i*nSpace2+
6525  I*nSpace+
6526  J]
6527  *
6528  dVR[k]
6529  *
6530  abs_det_jac[eN*nQuadraturePoints_element+
6531  k];
6532 }
6533 
6537 void calculateShape_X_weightedShape(int nElements_global,
6538  int nQuadraturePoints_element,
6539  int nDOF_trial_element,
6540  int nDOF_test_element,
6541  double* v,
6542  double* w_dV,
6543  double* v_X_w_dV)
6544 {
6545  int eN,k,i,j,nDOF_test_X_trial_element=nDOF_test_element*nDOF_trial_element;
6546  for (eN=0;eN<nElements_global;eN++)
6547  for (k=0;k<nQuadraturePoints_element;k++)
6548  for (i=0;i<nDOF_test_element;i++)
6549  for (j=0;j<nDOF_trial_element;j++)
6550  v_X_w_dV[eN*nQuadraturePoints_element*nDOF_test_X_trial_element +
6551  k*nDOF_test_X_trial_element+
6552  j*nDOF_test_element+
6553  i]
6554  =
6555  v[eN*nQuadraturePoints_element*nDOF_trial_element +
6556  k*nDOF_trial_element+
6557  j]
6558  *
6559  w_dV[eN*nQuadraturePoints_element*nDOF_test_element +
6560  k*nDOF_test_element+
6561  i];
6562 }
6563 
6567 void calculateShape_X_weightedGradShape(int nElements_global,
6568  int nQuadraturePoints_element,
6569  int nDOF_trial_element,
6570  int nDOF_test_element,
6571  int nSpace,
6572  double* v,
6573  double* grad_w_dV,
6574  double* v_X_grad_w_dV)
6575 {
6576  int eN,k,i,j,I,nDOF_test_X_trial_element=nDOF_test_element*nDOF_trial_element;
6577  for (eN=0;eN<nElements_global;eN++)
6578  for (k=0;k<nQuadraturePoints_element;k++)
6579  for (i=0;i<nDOF_test_element;i++)
6580  for (j=0;j<nDOF_trial_element;j++)
6581  for (I=0;I<nSpace;I++)
6582  v_X_grad_w_dV[eN*nQuadraturePoints_element*nDOF_test_X_trial_element*nSpace +
6583  k*nDOF_test_X_trial_element*nSpace+
6584  j*nDOF_test_element*nSpace+
6585  i*nSpace+
6586  I]
6587  =
6588  v[eN*nQuadraturePoints_element*nDOF_trial_element +
6589  k*nDOF_trial_element+
6590  j]
6591  *
6592  grad_w_dV[eN*nQuadraturePoints_element*nDOF_test_element*nSpace +
6593  k*nDOF_test_element*nSpace+
6594  i*nSpace+
6595  I];
6596 }
6597 
6601 void calculateGradShape_X_weightedShape(int nElements_global,
6602  int nQuadraturePoints_element,
6603  int nDOF_trial_element,
6604  int nDOF_test_element,
6605  int nSpace,
6606  double* grad_v,
6607  double* w_dV,
6608  double* grad_v_X_w_dV)
6609 {
6610  int eN,k,i,j,I,nDOF_test_X_trial_element=nDOF_test_element*nDOF_trial_element;
6611  for (eN=0;eN<nElements_global;eN++)
6612  for (k=0;k<nQuadraturePoints_element;k++)
6613  for (i=0;i<nDOF_test_element;i++)
6614  for (j=0;j<nDOF_trial_element;j++)
6615  for (I=0;I<nSpace;I++)
6616  grad_v_X_w_dV[eN*nQuadraturePoints_element*nDOF_test_X_trial_element*nSpace +
6617  k*nDOF_test_X_trial_element*nSpace+
6618  j*nDOF_test_element*nSpace+
6619  i*nSpace+
6620  I]
6621  =
6622  grad_v[eN*nQuadraturePoints_element*nDOF_trial_element*nSpace +
6623  k*nDOF_trial_element*nSpace+
6624  j*nSpace+
6625  I]
6626  *
6627  w_dV[eN*nQuadraturePoints_element*nDOF_test_element +
6628  k*nDOF_test_element+
6629  i];
6630 }
6631 
6635 void calculateGradShape_X_weightedGradShape(int nElements_global,
6636  int nQuadraturePoints_element,
6637  int nDOF_trial_element,
6638  int nDOF_test_element,
6639  int nSpace,
6640  double* grad_v,
6641  double* grad_w_dV,
6642  double* grad_v_X_grad_w_dV)
6643 {
6644  int eN,k,i,j,I,J,nDOF_test_X_trial_element=nDOF_test_element*nDOF_trial_element,nSpace2=nSpace*nSpace;
6645  for (eN=0;eN<nElements_global;eN++)
6646  for (k=0;k<nQuadraturePoints_element;k++)
6647  for (i=0;i<nDOF_test_element;i++)
6648  for (j=0;j<nDOF_trial_element;j++)
6649  for (I=0;I<nSpace;I++)
6650  for (J=0;J<nSpace;J++)
6651  grad_v_X_grad_w_dV[eN*nQuadraturePoints_element*nDOF_test_X_trial_element*nSpace2 +
6652  k*nDOF_test_X_trial_element*nSpace2+
6653  j*nDOF_test_element*nSpace2+
6654  i*nSpace2+
6655  I*nSpace+
6656  J]
6657  =
6658  grad_v[eN*nQuadraturePoints_element*nDOF_trial_element*nSpace +
6659  k*nDOF_trial_element*nSpace+
6660  j*nSpace+
6661  I]
6662  *
6663  grad_w_dV[eN*nQuadraturePoints_element*nDOF_test_element*nSpace +
6664  k*nDOF_test_element*nSpace+
6665  i*nSpace+
6666  J];
6667 }
6668 
6672 void calculateWeightedShapeTrace(int nElements_global,
6673  int nElementBoundaries_element,
6674  int nElementBoundaryQuadraturePoints_elementBoundary,
6675  int nDOF_test_element,
6676  double* dSR,
6677  double* sqrt_det_g,
6678  double* w,
6679  double* w_dS)
6680 {
6681  int eN,ebN,i,k;
6682  for (eN=0;eN<nElements_global;eN++)
6683  for (ebN=0;ebN<nElementBoundaries_element;ebN++)
6684  for (k=0;k<nElementBoundaryQuadraturePoints_elementBoundary;k++)
6685  for (i=0;i<nDOF_test_element;i++)
6686  {
6687  w_dS[eN*nElementBoundaries_element*nElementBoundaryQuadraturePoints_elementBoundary*nDOF_test_element+
6688  ebN*nElementBoundaryQuadraturePoints_elementBoundary*nDOF_test_element +
6689  k*nDOF_test_element+
6690  i]
6691  =
6692  w[eN*nElementBoundaries_element*nElementBoundaryQuadraturePoints_elementBoundary*nDOF_test_element+
6693  ebN*nElementBoundaryQuadraturePoints_elementBoundary*nDOF_test_element +
6694  k*nDOF_test_element+
6695  i]
6696  *
6697  dSR[k]
6698  *
6699  sqrt_det_g[eN*nElementBoundaries_element*nElementBoundaryQuadraturePoints_elementBoundary+
6700  ebN*nElementBoundaryQuadraturePoints_elementBoundary+
6701  k];
6702  }
6703 }
6704 void calculateWeightedPiolaShapeTrace(int nElements_global,
6705  int nElementBoundaries_element,
6706  int nElementBoundaryQuadraturePoints_elementBoundary,
6707  int nDOF_test_element,
6708  double* dSR,
6709  double* sqrt_det_g,
6710  double* w,
6711  double* w_dS)
6712 {
6713  int eN,ebN,i,k;
6714  for (eN=0;eN<nElements_global;eN++)
6715  for (ebN=0;ebN<nElementBoundaries_element;ebN++)
6716  for (k=0;k<nElementBoundaryQuadraturePoints_elementBoundary;k++)
6717  for (i=0;i<nDOF_test_element;i++)
6718  {
6719  w_dS[eN*nElementBoundaries_element*nElementBoundaryQuadraturePoints_elementBoundary*nDOF_test_element+
6720  ebN*nElementBoundaryQuadraturePoints_elementBoundary*nDOF_test_element +
6721  k*nDOF_test_element+
6722  i]
6723  =
6724  w[eN*nElementBoundaries_element*nElementBoundaryQuadraturePoints_elementBoundary*nDOF_test_element+
6725  ebN*nElementBoundaryQuadraturePoints_elementBoundary*nDOF_test_element +
6726  k*nDOF_test_element+
6727  i]
6728  *
6729  dSR[k]
6730  *
6731  sqrt_det_g[eN*nElementBoundaries_element*nElementBoundaryQuadraturePoints_elementBoundary+
6732  ebN*nElementBoundaryQuadraturePoints_elementBoundary+
6733  k];
6734  }
6735 }
6736 
6740 void calculateShape_X_weightedShapeTrace(int nElements_global,
6741  int nElementBoundaries_element,
6742  int nElementBoundaryQuadraturePoints_elementBoundary,
6743  int nDOF_trial_element,
6744  int nDOF_test_element,
6745  double* v,
6746  double* w_dS,
6747  double* v_X_w_dS)
6748 {
6749  int eN,ebN,k,i,j,nDOF_test_X_trial_element=nDOF_test_element*nDOF_trial_element;
6750  for (eN=0;eN<nElements_global;eN++)
6751  for (ebN=0;ebN<nElementBoundaries_element;ebN++)
6752  for (k=0;k<nElementBoundaryQuadraturePoints_elementBoundary;k++)
6753  for (i=0;i<nDOF_test_element;i++)
6754  for (j=0;j<nDOF_trial_element;j++)
6755  v_X_w_dS[eN*nElementBoundaries_element*nElementBoundaryQuadraturePoints_elementBoundary*nDOF_test_X_trial_element +
6756  ebN*nElementBoundaryQuadraturePoints_elementBoundary*nDOF_test_X_trial_element +
6757  k*nDOF_test_X_trial_element+
6758  j*nDOF_test_element+
6759  i]
6760  =
6761  v[eN*nElementBoundaries_element*nElementBoundaryQuadraturePoints_elementBoundary*nDOF_trial_element +
6762  ebN*nElementBoundaryQuadraturePoints_elementBoundary*nDOF_trial_element +
6763  k*nDOF_trial_element+
6764  j]
6765  *
6766  w_dS[eN*nElementBoundaries_element*nElementBoundaryQuadraturePoints_elementBoundary*nDOF_test_element +
6767  ebN*nElementBoundaryQuadraturePoints_elementBoundary*nDOF_test_element +
6768  k*nDOF_trial_element+
6769  i];
6770 }
6771 
6776  int nElementBoundaries_element,
6777  int nElementBoundaryQuadraturePoints_elementBoundary,
6778  int nDOF_trial_element,
6779  int nDOF_test_element,
6780  int nSpace,
6781  double* grad_v,
6782  double* w_dS,
6783  double* grad_v_X_w_dS)
6784 {
6785  int eN,ebN,k,i,j,I,nDOF_test_X_trial_element=nDOF_test_element*nDOF_trial_element;
6786  for (eN=0;eN<nElements_global;eN++)
6787  for (ebN=0;ebN<nElementBoundaries_element;ebN++)
6788  for (k=0;k<nElementBoundaryQuadraturePoints_elementBoundary;k++)
6789  for (i=0;i<nDOF_test_element;i++)
6790  for (j=0;j<nDOF_trial_element;j++)
6791  for (I=0;I<nSpace;I++)
6792  grad_v_X_w_dS[eN*nElementBoundaries_element*nElementBoundaryQuadraturePoints_elementBoundary*nDOF_test_X_trial_element*nSpace +
6793  ebN*nElementBoundaryQuadraturePoints_elementBoundary*nDOF_test_X_trial_element*nSpace +
6794  k*nDOF_test_X_trial_element*nSpace+
6795  j*nDOF_test_element*nSpace+
6796  i*nSpace+
6797  I]
6798  =
6799  grad_v[eN*nElementBoundaries_element*nElementBoundaryQuadraturePoints_elementBoundary*nDOF_trial_element*nSpace +
6800  ebN*nElementBoundaryQuadraturePoints_elementBoundary*nDOF_trial_element*nSpace +
6801  k*nDOF_trial_element*nSpace+
6802  j*nSpace+
6803  I]
6804  *
6805  w_dS[eN*nElementBoundaries_element*nElementBoundaryQuadraturePoints_elementBoundary*nDOF_test_element +
6806  ebN*nElementBoundaryQuadraturePoints_elementBoundary*nDOF_test_element +
6807  k*nDOF_test_element+
6808  i];
6809 }
6814 void calculateWeightedShapeGlobalExteriorTrace(int nElementBoundaryQuadraturePoints_elementBoundary,
6815  int nDOF_test_element,
6816  int nExteriorElementBoundaries_global,
6817  const int* exteriorElementBoundariesArray,
6818  const int* elementBoundaryElementsArray,
6819  const int* elementBoundaryLocalElementBoundariesArray,
6820  double* dSR,
6821  double* sqrt_det_g,
6822  double* w,
6823  double* w_dS)
6824 {
6825  int ebNE,i,k;
6826  for (ebNE = 0; ebNE < nExteriorElementBoundaries_global; ebNE++)
6827  {
6828  for (k=0;k<nElementBoundaryQuadraturePoints_elementBoundary;k++)
6829  for (i=0;i<nDOF_test_element;i++)
6830  {
6831  w_dS[ebNE*nElementBoundaryQuadraturePoints_elementBoundary*nDOF_test_element +
6832  k*nDOF_test_element+
6833  i]
6834  =
6835  w[ebNE*nElementBoundaryQuadraturePoints_elementBoundary*nDOF_test_element +
6836  k*nDOF_test_element+
6837  i]
6838  *
6839  dSR[k]
6840  *
6841  sqrt_det_g[ebNE*nElementBoundaryQuadraturePoints_elementBoundary+
6842  k];
6843  }
6844  }
6845 }
6850 void calculateShape_X_weightedShapeGlobalExteriorTrace(int nElementBoundaryQuadraturePoints_elementBoundary,
6851  int nDOF_trial_element,
6852  int nDOF_test_element,
6853  int nExteriorElementBoundaries_global,
6854  const int* exteriorElementBoundariesArray,
6855  const int* elementBoundaryElementsArray,
6856  const int* elementBoundaryLocalElementBoundariesArray,
6857  double* v,
6858  double* w_dS,
6859  double* v_X_w_dS)
6860 {
6861  int ebNE,k,i,j,nDOF_test_X_trial_element=nDOF_test_element*nDOF_trial_element;
6862  for (ebNE=0;ebNE<nExteriorElementBoundaries_global;ebNE++)
6863  for (k=0;k<nElementBoundaryQuadraturePoints_elementBoundary;k++)
6864  for (i=0;i<nDOF_test_element;i++)
6865  for (j=0;j<nDOF_trial_element;j++)
6866  v_X_w_dS[ebNE*nElementBoundaryQuadraturePoints_elementBoundary*nDOF_test_X_trial_element +
6867  k*nDOF_test_X_trial_element+
6868  j*nDOF_test_element+
6869  i]
6870  =
6871  v[ebNE*nElementBoundaryQuadraturePoints_elementBoundary*nDOF_trial_element +
6872  k*nDOF_trial_element+
6873  j]
6874  *
6875  w_dS[ebNE*nElementBoundaryQuadraturePoints_elementBoundary*nDOF_test_element +
6876  k*nDOF_trial_element+
6877  i];
6878 }
6879 
6883 void calculateGradShape_X_weightedShapeGlobalExteriorTrace(int nElementBoundaryQuadraturePoints_elementBoundary,
6884  int nDOF_trial_element,
6885  int nDOF_test_element,
6886  int nSpace,
6887  int nExteriorElementBoundaries_global,
6888  const int* exteriorElementBoundariesArray,
6889  const int* elementBoundaryElementsArray,
6890  const int* elementBoundaryLocalElementBoundariesArray,
6891  double* grad_v,
6892  double* w_dS,
6893  double* grad_v_X_w_dS)
6894 {
6895  int ebNE,k,i,j,I,nDOF_test_X_trial_element=nDOF_test_element*nDOF_trial_element;
6896  for (ebNE=0;ebNE<nExteriorElementBoundaries_global;ebNE++)
6897  for (k=0;k<nElementBoundaryQuadraturePoints_elementBoundary;k++)
6898  for (i=0;i<nDOF_test_element;i++)
6899  for (j=0;j<nDOF_trial_element;j++)
6900  for (I=0;I<nSpace;I++)
6901  grad_v_X_w_dS[ebNE*nElementBoundaryQuadraturePoints_elementBoundary*nDOF_test_X_trial_element*nSpace +
6902  k*nDOF_test_X_trial_element*nSpace+
6903  j*nDOF_test_element*nSpace+
6904  i*nSpace+
6905  I]
6906  =
6907  grad_v[ebNE*nElementBoundaryQuadraturePoints_elementBoundary*nDOF_trial_element*nSpace +
6908  k*nDOF_trial_element*nSpace+
6909  j*nSpace+
6910  I]
6911  *
6912  w_dS[ebNE*nElementBoundaryQuadraturePoints_elementBoundary*nDOF_test_element +
6913  k*nDOF_test_element+
6914  i];
6915 }
6916 
6917 
6921 void calculateIntegrationWeights(int nElements_global,
6922  int nQuadraturePoints_element,
6923  double* abs_det_J,
6924  double* referenceWeights,
6925  double* weights)
6926 {
6927  int eN,k;
6928  for (eN=0;eN<nElements_global;eN++)
6929  for (k=0;k<nQuadraturePoints_element;k++)
6930  weights[eN*nQuadraturePoints_element+
6931  k]
6932  =
6933  abs_det_J[eN*nQuadraturePoints_element+
6934  k]
6935  *
6936  referenceWeights[k];
6937 }
6938 
6940  int nElementBoundaries_element,
6941  int nQuadraturePoints_elementBoundary,
6942  double* sqrt_det_g,
6943  double* referenceWeights,
6944  double* weights)
6945 {
6946  int ebN,eN,k;
6947  for (eN=0;eN<nElements_global;eN++)
6948  for (ebN=0; ebN < nElementBoundaries_element; ebN++)
6949  for (k=0;k<nQuadraturePoints_elementBoundary;k++)
6950  weights[eN*nElementBoundaries_element*nQuadraturePoints_elementBoundary+
6951  ebN*nQuadraturePoints_elementBoundary +
6952  k]
6953  =
6954  sqrt_det_g[eN*nElementBoundaries_element*nQuadraturePoints_elementBoundary+
6955  ebN*nQuadraturePoints_elementBoundary +
6956  k]
6957  *
6958  referenceWeights[k];
6959 }
6960 
6961 void calculateGlobalExteriorElementBoundaryIntegrationWeights(int nQuadraturePoints_elementBoundary,
6962  int nExteriorElementBoundaries_global,
6963  double* sqrt_det_g,
6964  double* referenceWeights,
6965  double* weights)
6966 {
6967  int ebNE,k;
6968  for (ebNE=0;ebNE<nExteriorElementBoundaries_global;ebNE++)
6969  for (k=0;k<nQuadraturePoints_elementBoundary;k++)
6970  weights[ebNE*nQuadraturePoints_elementBoundary +
6971  k]
6972  =
6973  sqrt_det_g[ebNE*nQuadraturePoints_elementBoundary +
6974  k]
6975  *
6976  referenceWeights[k];
6977 }
6978 
6982 void calculateFiniteElementFunctionValues(int nElements_global,
6983  int nQuadraturePoints_element,
6984  int nDOF_trial_element,
6985  int nComponents,
6986  int* l2g,
6987  double* dof,
6988  double* v,
6989  double* u)
6990 {
6991  int eN,k,j,t;
6992  memset(u,0,sizeof(double)*nElements_global*nQuadraturePoints_element*nComponents);
6993  for (eN=0;eN<nElements_global;eN++)
6994  for (k=0;k<nQuadraturePoints_element;k++)
6995  for (j=0;j<nDOF_trial_element;j++)
6996  for (t=0;t<nComponents;t++)
6997  u[eN*nQuadraturePoints_element*nComponents+
6998  k*nComponents+
6999  t]
7000  +=
7001  dof[l2g[eN*nDOF_trial_element+
7002  j]*nComponents+
7003  t]
7004  *
7005  v[eN*nQuadraturePoints_element*nDOF_trial_element+
7006  k*nDOF_trial_element+
7007  j];
7008 }
7009 
7014  int nQuadraturePoints_element,
7015  int nDOF_trial_element,
7016  int nComponents,
7017  int nSpace,
7018  int* l2g,
7019  double* dof,
7020  double* grad_v,
7021  double* grad_u)
7022 {
7023  int eN,k,j,t,I;
7024  memset(grad_u,0,sizeof(double)*nElements_global*nQuadraturePoints_element*nComponents*nSpace);
7025  for (eN=0;eN<nElements_global;eN++)
7026  for (k=0;k<nQuadraturePoints_element;k++)
7027  for (j=0;j<nDOF_trial_element;j++)
7028  for (t=0;t<nComponents;t++)
7029  for (I=0;I<nSpace;I++)
7030  grad_u[eN*nQuadraturePoints_element*nComponents*nSpace+
7031  k*nComponents*nSpace+
7032  t*nSpace+
7033  I]
7034  +=
7035  dof[l2g[eN*nDOF_trial_element+
7036  j]*nComponents+
7037  t]
7038  *
7039  grad_v[eN*nQuadraturePoints_element*nDOF_trial_element*nSpace+
7040  k*nDOF_trial_element*nSpace+
7041  j*nSpace+
7042  I];
7043 }
7044 
7046  int nQuadraturePoints_element,
7047  int nDOF_trial_element,
7048  int nComponents,
7049  int nSpace,
7050  int* l2g,
7051  double* dof,
7052  double* Hessian_v,
7053  double* Hessian_u)
7054 {
7055  int eN,k,j,t,I,J,nSpace2=nSpace*nSpace;
7056  memset(Hessian_u,0,sizeof(double)*nElements_global*nQuadraturePoints_element*nComponents*nSpace2);
7057  for (eN=0;eN<nElements_global;eN++)
7058  for (k=0;k<nQuadraturePoints_element;k++)
7059  for (j=0;j<nDOF_trial_element;j++)
7060  for (t=0;t<nComponents;t++)
7061  for (I=0;I<nSpace;I++)
7062  for (J=0;J<nSpace;J++)
7063  Hessian_u[eN*nQuadraturePoints_element*nComponents*nSpace2+
7064  k*nComponents*nSpace2+
7065  t*nSpace2+
7066  I*nSpace+
7067  J]
7068  +=
7069  dof[l2g[eN*nDOF_trial_element+
7070  j]*nComponents+
7071  t]
7072  *
7073  Hessian_v[eN*nQuadraturePoints_element*nDOF_trial_element*nSpace2+
7074  k*nDOF_trial_element*nSpace2+
7075  j*nSpace2+
7076  I*nSpace+
7077  J];
7078 }
7079 
7125  int nQuadraturePoints_element,
7126  int nDOF_trial_element,
7127  int nDOF_test_element,
7128  int nComponents,
7129  int nSpace,
7130  int* l2g,
7131  double* dof,
7132  double* grad_v_X_grad_w_dV,
7133  double* grad_u_X_grad_w_dV)
7134 {
7135  int eN,k,j,i,I,J,t,nSpace2=nSpace*nSpace;
7136  int nDOF_test_X_trial_element = nDOF_test_element*nDOF_trial_element;
7137  memset(grad_u_X_grad_w_dV,0,sizeof(double)*nElements_global*nQuadraturePoints_element*nDOF_test_element*nComponents*nSpace2);
7138  for(eN=0;eN<nElements_global;eN++)
7139  for(k=0;k<nQuadraturePoints_element;k++)
7140  for(j=0;j<nDOF_trial_element;j++)
7141  for(i=0;i<nDOF_test_element;i++)
7142  for (t=0;t<nComponents;t++)
7143  for(I=0;I<nSpace;I++)
7144  for(J=0;J<nSpace;J++)
7145  grad_u_X_grad_w_dV[eN*nQuadraturePoints_element*nDOF_test_element*nComponents*nSpace2+
7146  k*nDOF_test_element*nComponents*nSpace2 +
7147  i*nComponents*nSpace2 +
7148  t*nSpace2 +
7149  I*nSpace +
7150  J]
7151  +=
7152  dof[l2g[eN*nDOF_trial_element+
7153  j]*nComponents+
7154  t]
7155  *
7156  grad_v_X_grad_w_dV[eN*nQuadraturePoints_element*nDOF_test_X_trial_element*nSpace2 +
7157  k*nDOF_test_X_trial_element*nSpace2 +
7158  j*nDOF_test_element*nSpace2 +
7159  i*nSpace2 +
7160  I*nSpace +
7161  J];
7162 }
7163 
7168  int nElementBoundaries_element,
7169  int nQuadraturePoints_elementBoundary,
7170  int nDOF_trial_element,
7171  int nComponents,
7172  int* l2g,
7173  double* dof,
7174  double* v,
7175  double* u)
7176 {
7177  int eN,ebN,k,j,t;
7178  memset(u,0,sizeof(double)*nElements_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nComponents);
7179  for(eN=0;eN<nElements_global;eN++)
7180  for(ebN=0;ebN<nElementBoundaries_element;ebN++)
7181  for(k=0;k<nQuadraturePoints_elementBoundary;k++)
7182  for(j=0;j<nDOF_trial_element;j++)
7183  for(t=0;t<nComponents;t++)
7184  u[eN*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nComponents+
7185  ebN*nQuadraturePoints_elementBoundary*nComponents+
7186  k*nComponents+
7187  t]
7188  +=
7189  dof[l2g[eN*nDOF_trial_element+j]*nComponents+
7190  t]
7191  *
7192  v[eN*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_trial_element+
7193  ebN*nQuadraturePoints_elementBoundary*nDOF_trial_element+
7194  k*nDOF_trial_element+
7195  j];
7196 }
7197 
7198 
7203  int nElementBoundaries_element,
7204  int nQuadraturePoints_elementBoundary,
7205  int nDOF_trial_element,
7206  int nComponents,
7207  int nSpace,
7208  int* l2g,
7209  double* dof,
7210  double* grad_v,
7211  double* grad_u)
7212 {
7213  int eN,ebN,k,j,t,I;
7214  memset(grad_u,0,sizeof(double)*nElements_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nComponents*nSpace);
7215  for(eN=0;eN<nElements_global;eN++)
7216  for(ebN=0;ebN<nElementBoundaries_element;ebN++)
7217  for(k=0;k<nQuadraturePoints_elementBoundary;k++)
7218  for(j=0;j<nDOF_trial_element;j++)
7219  for(t=0;t<nComponents;t++)
7220  for(I=0;I<nSpace;I++)
7221  grad_u[eN*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nComponents*nSpace+
7222  ebN*nQuadraturePoints_elementBoundary*nComponents*nSpace+
7223  k*nComponents*nSpace+
7224  t*nSpace+
7225  I]
7226  +=
7227  dof[l2g[eN*nDOF_trial_element+j]*nComponents+
7228  t]
7229  *
7230  grad_v[eN*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nDOF_trial_element*nSpace+
7231  ebN*nQuadraturePoints_elementBoundary*nDOF_trial_element*nSpace+
7232  k*nDOF_trial_element*nSpace+
7233  j*nSpace+
7234  I];
7235 }
7236 void calculateFiniteElementFunctionValuesGlobalExteriorTrace(int nQuadraturePoints_elementBoundary,
7237  int nDOF_trial_element,
7238  int nComponents,
7239  int nExteriorElementBoundaries_global,
7240  const int * exteriorElementBoundariesArray,
7241  const int * elementBoundaryElementsArray,
7242  const int * elementBoundaryLocalElementBoundariesArray,
7243  int* l2g,
7244  double* dof,
7245  double* v,
7246  double* u)
7247 {
7248  int eN,ebN,ebNE,ebN_local,k,j,t;
7249  memset(u,0,sizeof(double)*nExteriorElementBoundaries_global*nQuadraturePoints_elementBoundary*nComponents);
7250  for (ebNE = 0; ebNE < nExteriorElementBoundaries_global; ebNE++)
7251  {
7252  ebN = exteriorElementBoundariesArray[ebNE];
7253  eN = elementBoundaryElementsArray[ebN*2+0];
7254  ebN_local = elementBoundaryLocalElementBoundariesArray[ebN*2+0];
7255  for(k=0;k<nQuadraturePoints_elementBoundary;k++)
7256  for(j=0;j<nDOF_trial_element;j++)
7257  for(t=0;t<nComponents;t++)
7258  u[ebNE*nQuadraturePoints_elementBoundary*nComponents+
7259  k*nComponents+
7260  t]
7261  +=
7262  dof[l2g[eN*nDOF_trial_element+j]*nComponents+
7263  t]
7264  *
7265  v[ebNE*nQuadraturePoints_elementBoundary*nDOF_trial_element+
7266  k*nDOF_trial_element+
7267  j];
7268  }
7269 }
7270 
7271 void calculateFiniteElementFunctionGradientValuesGlobalExteriorTrace(int nQuadraturePoints_elementBoundary,
7272  int nDOF_trial_element,
7273  int nComponents,
7274  int nSpace,
7275  int nExteriorElementBoundaries_global,
7276  const int * exteriorElementBoundariesArray,
7277  const int * elementBoundaryElementsArray,
7278  const int * elementBoundaryLocalElementBoundariesArray,
7279  int* l2g,
7280  double* dof,
7281  double* grad_v,
7282  double* grad_u)
7283 {
7284  int eN,ebN,ebNE,ebN_local,k,j,t,I;
7285  memset(grad_u,0,sizeof(double)*nExteriorElementBoundaries_global*nQuadraturePoints_elementBoundary*nComponents*nSpace);
7286  for (ebNE = 0; ebNE < nExteriorElementBoundaries_global; ebNE++)
7287  {
7288  ebN = exteriorElementBoundariesArray[ebNE];
7289  eN = elementBoundaryElementsArray[ebN*2+0];
7290  ebN_local = elementBoundaryLocalElementBoundariesArray[ebN*2+0];
7291  for(k=0;k<nQuadraturePoints_elementBoundary;k++)
7292  for(j=0;j<nDOF_trial_element;j++)
7293  for(t=0;t<nComponents;t++)
7294  for(I=0;I<nSpace;I++)
7295  grad_u[ebNE*nQuadraturePoints_elementBoundary*nComponents*nSpace+
7296  k*nComponents*nSpace+
7297  t*nSpace+
7298  I]
7299  +=
7300  dof[l2g[eN*nDOF_trial_element+j]*nComponents+
7301  t]
7302  *
7303  grad_v[ebNE*nQuadraturePoints_elementBoundary*nDOF_trial_element*nSpace+
7304  k*nDOF_trial_element*nSpace+
7305  j*nSpace+
7306  I];
7307  }
7308 }
7309 
7310 
7314 void calculateFlowVelocity(int nElements_global,
7315  int nQuadraturePoints_element,
7316  int nSpace,
7317  double* f,
7318  double* a,
7319  double* grad_phi,
7320  double* v)
7321 {
7322  int eN,k,I,J,nSpace2=nSpace*nSpace;
7323  for (eN=0;eN<nElements_global;eN++)
7324  for (k=0;k<nQuadraturePoints_element;k++)
7325  for (I=0;I<nSpace;I++)
7326  {
7327  v[eN*nQuadraturePoints_element*nSpace+
7328  k*nSpace+
7329  I]
7330  =
7331  f[eN*nQuadraturePoints_element*nSpace+
7332  k*nSpace+
7333  I];
7334  for (J=0;J<nSpace;J++)
7335  v[eN*nQuadraturePoints_element*nSpace+
7336  k*nSpace+
7337  I]
7338  -=
7339  a[eN*nQuadraturePoints_element*nSpace2+
7340  k*nSpace2+
7341  I*nSpace+
7342  J]
7343  *
7344  grad_phi[eN*nQuadraturePoints_element*nSpace+
7345  k*nSpace+
7346  J];
7347  }
7348 }
7349 
7353 void updateAddJacobian_CSR(int jacIndex,
7354  double val,
7355  double* jac)
7356 {
7357  jac[jacIndex] += val;
7358 }
7359 
7363 void zeroJacobian_CSR(int nNonzeros,
7364  double* jac)
7365 {
7366  memset(jac,0,sizeof(double)*nNonzeros);
7367 }
7368 
7369 void calculateInteriorElementBoundaryVelocities(int nInteriorElementBoundaries_global,
7370  int nElementBoundaries_element,
7371  int nQuadraturePoints_elementBoundary,
7372  int nSpace,
7373  int* interiorElementBoundaries,
7374  int* elementBoundaryElements,
7375  int* elementBoundaryLocalElementBoundaries,
7376  double* m,
7377  double* a,
7378  double* grad_phi,
7379  double* f,
7380  double* vAverage,
7381  double* vJump,
7382  double* mAverage,
7383  double* mJump)
7384 {
7385  int ebNI,ebN,left_eN_global,right_eN_global,left_ebN_element,right_ebN_element,k,I,J,nSpace2=nSpace*nSpace;
7386  register double vLeft,vRight,mLeft,mRight;
7387  for(ebNI=0;ebNI<nInteriorElementBoundaries_global;ebNI++)
7388  {
7389  ebN = interiorElementBoundaries[ebNI];
7390  left_eN_global = elementBoundaryElements[ebN*2+0];
7391  right_eN_global = elementBoundaryElements[ebN*2+1];
7392  left_ebN_element = elementBoundaryLocalElementBoundaries[ebN*2+0];
7393  right_ebN_element = elementBoundaryLocalElementBoundaries[ebN*2+1];
7394  for(k=0;k<nQuadraturePoints_elementBoundary;k++)
7395  {
7396  mLeft
7397  =
7398  m[left_eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary+
7399  left_ebN_element*nQuadraturePoints_elementBoundary+
7400  k];
7401  mRight
7402  =
7403  m[right_eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary+
7404  right_ebN_element*nQuadraturePoints_elementBoundary+
7405  k];
7406  for (I=0;I<nSpace;I++)
7407  {
7408  vLeft
7409  =
7410  f[left_eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nSpace+
7411  left_ebN_element*nQuadraturePoints_elementBoundary*nSpace+
7412  k*nSpace+
7413  I];
7414  vRight
7415  =
7416  f[right_eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nSpace+
7417  right_ebN_element*nQuadraturePoints_elementBoundary*nSpace+
7418  k*nSpace+
7419  I];
7420  for (J=0;J<nSpace;J++)
7421  {
7422  vLeft
7423  -=
7424  a[left_eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nSpace2+
7425  left_ebN_element*nQuadraturePoints_elementBoundary*nSpace2+
7426  k*nSpace2+
7427  I*nSpace+
7428  J]
7429  *
7430  grad_phi[left_eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nSpace+
7431  left_ebN_element*nQuadraturePoints_elementBoundary*nSpace+
7432  k*nSpace+
7433  J];
7434  vRight -=
7435  a[right_eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nSpace2+
7436  right_ebN_element*nQuadraturePoints_elementBoundary*nSpace2+
7437  k*nSpace2+
7438  I*nSpace+
7439  J]
7440  *
7441  grad_phi[right_eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nSpace+
7442  right_ebN_element*nQuadraturePoints_elementBoundary*nSpace+
7443  k*nSpace+
7444  J];
7445  }
7446  vAverage[ebN*nQuadraturePoints_elementBoundary*nSpace+
7447  k*nSpace+
7448  I] = 0.5*(vLeft + vRight);
7449  vJump[ebN*nQuadraturePoints_elementBoundary*nSpace+
7450  k*nSpace+
7451  I] = (vLeft - vRight);
7452  }
7453  mAverage[ebN*nQuadraturePoints_elementBoundary+
7454  k] = 0.5*(mLeft+mRight);
7455  mJump[ebN*nQuadraturePoints_elementBoundary+
7456  k] = mLeft - mRight;
7457  }
7458  }
7459 }
7460 
7461 void calculateExteriorElementBoundaryVelocities(int nExteriorElementBoundaries_global,
7462  int nElementBoundaries_element,
7463  int nQuadraturePoints_elementBoundary,
7464  int nSpace,
7465  int* exteriorElementBoundaries,
7466  int* elementBoundaryElements,
7467  int* elementBoundaryLocalElementBoundaries,
7468  double* m,
7469  double* a,
7470  double* grad_phi,
7471  double* f,
7472  double* vAverage,
7473  double* vJump,
7474  double* mAverage,
7475  double* mJump)
7476 {
7477  int ebNE,ebN,left_eN_global,left_ebN_element,k,I,J,nSpace2=nSpace*nSpace;
7478  register double vLeft,mLeft;
7479  for(ebNE=0;ebNE<nExteriorElementBoundaries_global;ebNE++)
7480  {
7481  ebN = exteriorElementBoundaries[ebNE];
7482  left_eN_global = elementBoundaryElements[ebN*2+0];
7483  left_ebN_element = elementBoundaryLocalElementBoundaries[ebN*2+0];
7484  for(k=0;k<nQuadraturePoints_elementBoundary;k++)
7485  {
7486  mLeft
7487  =
7488  m[left_eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary+
7489  left_ebN_element*nQuadraturePoints_elementBoundary+
7490  k];
7491  for (I=0;I<nSpace;I++)
7492  {
7493  vLeft
7494  =
7495  f[left_eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nSpace+
7496  left_ebN_element*nQuadraturePoints_elementBoundary*nSpace+
7497  k*nSpace+
7498  I];
7499  for (J=0;J<nSpace;J++)
7500  {
7501  vLeft
7502  -=
7503  a[left_eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nSpace2+
7504  left_ebN_element*nQuadraturePoints_elementBoundary*nSpace2+
7505  k*nSpace2+
7506  I*nSpace+
7507  J]
7508  *
7509  grad_phi[left_eN_global*nElementBoundaries_element*nQuadraturePoints_elementBoundary*nSpace+
7510  left_ebN_element*nQuadraturePoints_elementBoundary*nSpace+
7511  k*nSpace+
7512  J];
7513  }
7514  vAverage[ebN*nQuadraturePoints_elementBoundary*nSpace+
7515  k*nSpace+
7516  I] = vLeft;
7517  vJump[ebN*nQuadraturePoints_elementBoundary*nSpace+
7518  k*nSpace+
7519  I] = vLeft;
7520  }
7521  mAverage[ebN*nQuadraturePoints_elementBoundary+
7522  k] = mLeft;
7523  mJump[ebN*nQuadraturePoints_elementBoundary+
7524  k] = mLeft;
7525  }
7526  }
7527 }
7528 
7529 /*mwf hack
7530  load in boundary condition velocity values directy into velocity vector
7531 */
7533  int nExteriorElementBoundaries_global,
7534  int nQuadraturePoints_elem