ZeroOrderTerm.cc 30.7 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
#include "ZeroOrderTerm.h"
#include "DOFVector.h"

namespace AMDiS {

  // ========== VecAtQP_ZOT ==========

  VecAtQP_ZOT::VecAtQP_ZOT(DOFVectorBase<double> *dv,
			   AbstractFunction<double, double> *af)
    : ZeroOrderTerm(af ? af->getDegree() : 0), vec(dv), f(af)
  {
    TEST_EXIT(dv)("No vector!\n");

14
    auxFeSpaces.insert(dv->getFeSpace());
15
16
  }

Thomas Witkowski's avatar
Thomas Witkowski committed
17

18
19
20
21
  void VecAtQP_ZOT::initElement(const ElInfo* elInfo, 
				SubAssembler* subAssembler,
				Quadrature *quad) 
  {
22
    getVectorAtQPs(vec, elInfo, subAssembler, quad, vecAtQPs);
23
24
  }

Thomas Witkowski's avatar
Thomas Witkowski committed
25

26
27
28
29
30
  void VecAtQP_ZOT::initElement(const ElInfo* smallElInfo,
				const ElInfo* largeElInfo,
				SubAssembler* subAssembler,
				Quadrature *quad)
  {
31
    getVectorAtQPs(vec, smallElInfo, largeElInfo, subAssembler, quad, vecAtQPs);
32
33
  }

Thomas Witkowski's avatar
Thomas Witkowski committed
34

35
  void VecAtQP_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C)  
36
37
38
  { 
    if (f) {
      for (int iq = 0; iq < nPoints; iq++)
39
	C[iq] += (*f)(vecAtQPs[iq]);            
40
41
42
43
44
45
    } else {
      for (int iq = 0; iq < nPoints; iq++)
	C[iq] += vecAtQPs[iq];      
    }
  }

Thomas Witkowski's avatar
Thomas Witkowski committed
46

47
  void VecAtQP_ZOT::eval(int nPoints,
48
			 const ElementVector& uhAtQP,
49
50
			 const WorldVector<double> *grdUhAtQP,
			 const WorldMatrix<double> *D2UhAtQP,
51
			 ElementVector& result,
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
			 double fac) 
  {
    if (f) {
      for (int iq = 0; iq < nPoints; iq++)
	result[iq] += fac * (*f)(vecAtQPs[iq]) * uhAtQP[iq];      
    } else {
      for (int iq = 0; iq < nPoints; iq++)
	result[iq] += fac * vecAtQPs[iq] * uhAtQP[iq];
    }
  }

  
  // ========== MultVecAtQP_ZOT ==========

  MultVecAtQP_ZOT::MultVecAtQP_ZOT(DOFVectorBase<double> *dv1,
				   DOFVectorBase<double> *dv2,
				   AbstractFunction<double, double> *af1,
				   AbstractFunction<double, double> *af2)
    : ZeroOrderTerm(af1->getDegree() + af2->getDegree()), 
      vec1(dv1), vec2(dv2), f1(af1), f2(af2)
  {
    TEST_EXIT(dv1)("No first vector!\n");
    TEST_EXIT(dv2)("No second vector!\n");

76
77
    auxFeSpaces.insert(dv1->getFeSpace());
    auxFeSpaces.insert(dv2->getFeSpace());
78
79
  }

Thomas Witkowski's avatar
Thomas Witkowski committed
80

81
82
83
84
  void MultVecAtQP_ZOT::initElement(const ElInfo* elInfo, 
				    SubAssembler* subAssembler,
				    Quadrature *quad) 
  {
85
86
    getVectorAtQPs(vec1, elInfo, subAssembler, quad, vecAtQPs1);
    getVectorAtQPs(vec2, elInfo, subAssembler, quad, vecAtQPs2);
87
88
  }

Thomas Witkowski's avatar
Thomas Witkowski committed
89

90
  void MultVecAtQP_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C)  
91
92
93
94
95
  { 
    for (int iq = 0; iq < nPoints; iq++)
      C[iq] += (*f1)(vecAtQPs1[iq]) * (*f2)(vecAtQPs2[iq]);    
  }

Thomas Witkowski's avatar
Thomas Witkowski committed
96

97
  void MultVecAtQP_ZOT::eval(int nPoints,
98
			     const ElementVector& uhAtQP,
99
100
			     const WorldVector<double> *grdUhAtQP,
			     const WorldMatrix<double> *D2UhAtQP,
101
			     ElementVector& result,
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
			     double fac) 
  {
    for (int iq = 0; iq < nPoints; iq++)
      result[iq] += fac * (*f1)(vecAtQPs1[iq]) * (*f2)(vecAtQPs2[iq]) * uhAtQP[iq];
  }

  
  // ========== Vec2AtQP_ZOT ==========

  Vec2AtQP_ZOT::Vec2AtQP_ZOT(DOFVectorBase<double> *dv1,
			     DOFVectorBase<double> *dv2,
			     BinaryAbstractFunction<double, double, double> *af)
    : ZeroOrderTerm(af->getDegree()), vec1(dv1), vec2(dv2), f(af)
  {
    TEST_EXIT(dv1)("No first vector!\n");
    TEST_EXIT(dv2)("No second vector!\n");

119
120
    auxFeSpaces.insert(dv1->getFeSpace());
    auxFeSpaces.insert(dv2->getFeSpace());
121
122
  }

Thomas Witkowski's avatar
Thomas Witkowski committed
123

124
125
126
127
  void Vec2AtQP_ZOT::initElement(const ElInfo* elInfo, 
				 SubAssembler* subAssembler,
				 Quadrature *quad) 
  {
128
129
    getVectorAtQPs(vec1, elInfo, subAssembler, quad, vecAtQPs1);
    getVectorAtQPs(vec2, elInfo, subAssembler, quad, vecAtQPs2);
130
131
132
133
134
135
136
  }

  void Vec2AtQP_ZOT::initElement(const ElInfo* smallElInfo, 
				 const ElInfo* largeElInfo,
				 SubAssembler* subAssembler,
				 Quadrature *quad)
  {
137
    TEST_EXIT(vec1->getFeSpace() == vec2->getFeSpace())("Not yet implemented!\n");
138

139
140
    getVectorAtQPs(vec1, smallElInfo, largeElInfo, subAssembler, quad, vecAtQPs1);
    getVectorAtQPs(vec2, smallElInfo, largeElInfo, subAssembler, quad, vecAtQPs2);
141
142
  }

143
  void Vec2AtQP_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C)  
144
145
146
147
148
149
  { 
    for (int iq = 0; iq < nPoints; iq++)
      C[iq] += (*f)(vecAtQPs1[iq], vecAtQPs2[iq]);    
  }

  void Vec2AtQP_ZOT::eval(int nPoints,
150
			  const ElementVector& uhAtQP,
151
152
			  const WorldVector<double> *grdUhAtQP,
			  const WorldMatrix<double> *D2UhAtQP,
153
			  ElementVector& result,
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
			  double fac) 
  {
    for (int iq = 0; iq < nPoints; iq++)
      result[iq] += fac * (*f)(vecAtQPs1[iq], vecAtQPs2[iq]) * uhAtQP[iq];    
  }


  // ========== Vec3AtQP_ZOT ==========

  Vec3AtQP_ZOT::Vec3AtQP_ZOT(DOFVectorBase<double> *dv1,
			     DOFVectorBase<double> *dv2,
			     DOFVectorBase<double> *dv3,
			     TertiaryAbstractFunction<double, double, double, double> *af)
    : ZeroOrderTerm(af->getDegree()), vec1(dv1), vec2(dv2), vec3(dv3), f(af)
  {
    TEST_EXIT(dv1)("No first vector!\n");
    TEST_EXIT(dv2)("No second vector!\n");
    TEST_EXIT(dv3)("No thierd vector!\n");

173
174
175
    auxFeSpaces.insert(dv1->getFeSpace());
    auxFeSpaces.insert(dv2->getFeSpace());
    auxFeSpaces.insert(dv3->getFeSpace());
176
177
178
179
180
181
  }

  void Vec3AtQP_ZOT::initElement(const ElInfo* elInfo, 
				 SubAssembler* subAssembler,
				 Quadrature *quad) 
  {
182
183
184
    getVectorAtQPs(vec1, elInfo, subAssembler, quad, vecAtQPs1);
    getVectorAtQPs(vec2, elInfo, subAssembler, quad, vecAtQPs2);
    getVectorAtQPs(vec3, elInfo, subAssembler, quad, vecAtQPs3);
185
186
  }

187
  void Vec3AtQP_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C)  
188
189
190
191
192
193
  { 
    for (int iq = 0; iq < nPoints; iq++)
      C[iq] += (*f)(vecAtQPs1[iq], vecAtQPs2[iq], vecAtQPs3[iq]);    
  }

  void Vec3AtQP_ZOT::eval(int nPoints,
194
			  const ElementVector& uhAtQP,
195
196
			  const WorldVector<double> *grdUhAtQP,
			  const WorldMatrix<double> *D2UhAtQP,
197
			  ElementVector& result,
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
			  double fac) 
  {
    for (int iq = 0; iq < nPoints; iq++)
      result[iq] += 
	fac * (*f)(vecAtQPs1[iq], vecAtQPs2[iq], vecAtQPs3[iq]) * uhAtQP[iq];    
  }


  // ========== FctGradientCoords_ZOT ==========

  FctGradientCoords_ZOT::FctGradientCoords_ZOT(DOFVectorBase<double> *dv,
					       BinaryAbstractFunction<double, WorldVector<double>, WorldVector<double> > *af)
    : ZeroOrderTerm(af->getDegree()), vec(dv), f(af)
  {
    TEST_EXIT(dv)("No vector!\n");

214
    auxFeSpaces.insert(dv->getFeSpace());
215
216
217
218
219
220
221
222
223
224
  }

  void FctGradientCoords_ZOT::initElement(const ElInfo* elInfo, 
					  SubAssembler* subAssembler,
					  Quadrature *quad) 
  {
    gradAtQPs = getGradientsAtQPs(vec, elInfo, subAssembler, quad);
    coordsAtQPs = subAssembler->getCoordsAtQPs(elInfo, quad);
  }

225
  void FctGradientCoords_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C)  
226
227
228
229
230
231
  { 
    for (int iq = 0; iq < nPoints; iq++)
      C[iq] += (*f)(gradAtQPs[iq], coordsAtQPs[iq]);    
  }
 
  void FctGradientCoords_ZOT::eval(int nPoints,
232
				   const ElementVector& uhAtQP,
233
234
				   const WorldVector<double> *grdUhAtQP,
				   const WorldMatrix<double> *D2UhAtQP,
235
				   ElementVector& result,
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
				   double fac) 
  {
    for (int iq = 0; iq < nPoints; iq++)
      result[iq] += 
	fac * (*f)(gradAtQPs[iq], coordsAtQPs[iq]) * uhAtQP[iq];    
  }

  
  // ========== VecGradCoordsAtQP_ZOT ==========
 
  VecGradCoordsAtQP_ZOT::VecGradCoordsAtQP_ZOT(DOFVectorBase<double> *dv,
					       TertiaryAbstractFunction<double, double, WorldVector<double>, WorldVector<double> > *af)
    : ZeroOrderTerm(af->getDegree()), vec(dv), f(af) 
  {
    TEST_EXIT(dv)("No vector!\n");

252
    auxFeSpaces.insert(dv->getFeSpace());
253
254
255
256
257
258
  }

  void VecGradCoordsAtQP_ZOT::initElement(const ElInfo* elInfo, 
					  SubAssembler* subAssembler,
					  Quadrature *quad) 
  {
259
    getVectorAtQPs(vec, elInfo, subAssembler, quad, vecAtQPs);
260
261
262
263
    gradAtQPs = getGradientsAtQPs(vec, elInfo, subAssembler, quad);
    coordsAtQPs = subAssembler->getCoordsAtQPs(elInfo, quad);
  }

264
  void VecGradCoordsAtQP_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C)  
265
266
267
268
269
270
  { 
    for (int iq = 0; iq < nPoints; iq++)
      C[iq] += (*f)(vecAtQPs[iq], gradAtQPs[iq], coordsAtQPs[iq]);
  }
 
  void VecGradCoordsAtQP_ZOT::eval(int nPoints,
271
				   const ElementVector& uhAtQP,
272
273
				   const WorldVector<double> *grdUhAtQP,
				   const WorldMatrix<double> *D2UhAtQP,
274
				   ElementVector& result,
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
				   double fac) 
  {
    for (int iq = 0; iq < nPoints; iq++)
      result[iq] += 
	fac * 
	(*f)(vecAtQPs[iq], gradAtQPs[iq], coordsAtQPs[iq]) * 
	uhAtQP[iq];
  }


  // ========== VecAndCoordsAtQP_ZOT ==========

  VecAndCoordsAtQP_ZOT::VecAndCoordsAtQP_ZOT(DOFVectorBase<double> *dv,
					     BinaryAbstractFunction<double, double, WorldVector<double> > *af)
    : ZeroOrderTerm(af->getDegree()), vec(dv), f(af) 
  {
    TEST_EXIT(dv)("No vector!\n");

293
    auxFeSpaces.insert(dv->getFeSpace());
294
295
296
297
298
299
  }

  void VecAndCoordsAtQP_ZOT::initElement(const ElInfo* elInfo, 
					 SubAssembler* subAssembler,
					 Quadrature *quad) 
  {
300
    getVectorAtQPs(vec, elInfo, subAssembler, quad, vecAtQPs);
301
302
303
    coordsAtQPs = subAssembler->getCoordsAtQPs(elInfo, quad);
  }

304
  void VecAndCoordsAtQP_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C)  
305
306
307
308
309
310
  { 
    for (int iq = 0; iq < nPoints; iq++)
      C[iq] += (*f)(vecAtQPs[iq], coordsAtQPs[iq]);    
  }

  void VecAndCoordsAtQP_ZOT::eval(int nPoints,
311
				  const ElementVector& uhAtQP,
312
313
				  const WorldVector<double> *grdUhAtQP,
				  const WorldMatrix<double> *D2UhAtQP,
314
				  ElementVector& result,
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
				  double fac) 
  {
    for (int iq = 0; iq < nPoints; iq++)
      result[iq] += fac * (*f)(vecAtQPs[iq], coordsAtQPs[iq]) * uhAtQP[iq];    
  }

 
  // ========== Vec2AndGradAtQP_ZOT ==========

  Vec2AndGradAtQP_ZOT::Vec2AndGradAtQP_ZOT(DOFVectorBase<double> *dv1, DOFVectorBase<double> *dv2,
					   TertiaryAbstractFunction<double, double, WorldVector<double>, double > *af)
    : ZeroOrderTerm(af->getDegree()), vec1(dv1), vec2(dv2), f(af) 
  {
    TEST_EXIT(dv1)("No first vector!\n");
    TEST_EXIT(dv2)("No second vector!\n");

331
332
    auxFeSpaces.insert(dv1->getFeSpace());
    auxFeSpaces.insert(dv2->getFeSpace());
333
334
335
336
337
338
  }

  void Vec2AndGradAtQP_ZOT::initElement(const ElInfo* elInfo, 
					SubAssembler* subAssembler,
					Quadrature *quad) 
  {
339
340
    getVectorAtQPs(vec1, elInfo, subAssembler, quad, vecAtQPs1);
    getVectorAtQPs(vec2, elInfo, subAssembler, quad, vecAtQPs2);
341
342
343
344
    gradAtQPs = getGradientsAtQPs(vec1, elInfo, subAssembler, quad);
  }

  void Vec2AndGradAtQP_ZOT::eval(int nPoints,
345
				 const ElementVector& uhAtQP,
346
347
				 const WorldVector<double> *grdUhAtQP,
				 const WorldMatrix<double> *D2UhAtQP,
348
				 ElementVector& result,
349
350
351
352
353
354
355
356
357
				 double fac) 
  {
    for (int iq = 0; iq < nPoints; iq++)
      result[iq] += 
	fac * 
	(*f)(vecAtQPs1[iq], gradAtQPs[iq], vecAtQPs2[iq]) * 
	uhAtQP[iq];
  }

358
  void Vec2AndGradAtQP_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C)  
359
360
361
362
363
364
365
366
367
368
369
370
371
372
  { 
    for (int iq = 0; iq < nPoints; iq++)
      C[iq] += (*f)(vecAtQPs1[iq], gradAtQPs[iq], vecAtQPs2[iq]);
  }


  // ========== FctGradient_ZOT ==========

  FctGradient_ZOT::FctGradient_ZOT(DOFVectorBase<double> *dv,
				   AbstractFunction<double, WorldVector<double> > *af)
    : ZeroOrderTerm(af->getDegree()), vec(dv), f(af)
  {
    TEST_EXIT(dv)("No vector!\n");

373
    auxFeSpaces.insert(dv->getFeSpace());
374
375
376
377
378
379
380
381
382
  }

  void FctGradient_ZOT::initElement(const ElInfo* elInfo, 
				    SubAssembler* subAssembler,
				    Quadrature *quad) 
  {
    gradAtQPs = getGradientsAtQPs(vec, elInfo, subAssembler, quad);
  }

383
  void FctGradient_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C) 
384
385
386
387
388
389
  { 
    for (int iq = 0; iq < nPoints; iq++)
      C[iq] += (*f)(gradAtQPs[iq]);
  }
 
  void FctGradient_ZOT::eval(int nPoints,
390
			     const ElementVector& uhAtQP,
391
392
			     const WorldVector<double> *grdUhAtQP,
			     const WorldMatrix<double> *D2UhAtQP,
393
			     ElementVector& result,
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
			     double fac) 
  {
    for (int iq = 0; iq < nPoints; iq++)
      result[iq] += fac * (*f)(gradAtQPs[iq]) * uhAtQP[iq];    
  }


  // ========== VecAndGradAtQP_ZOT ==========
 
  VecAndGradAtQP_ZOT::VecAndGradAtQP_ZOT(DOFVectorBase<double> *dv,
					 BinaryAbstractFunction<double, double, WorldVector<double> > *af)
    : ZeroOrderTerm(af->getDegree()), vec(dv), f(af) 
  {
    TEST_EXIT(dv)("No vector!\n");

409
    auxFeSpaces.insert(dv->getFeSpace());
410
411
412
413
414
415
  }

  void VecAndGradAtQP_ZOT::initElement(const ElInfo* elInfo, 
				       SubAssembler* subAssembler,
				       Quadrature *quad) 
  {
416
    getVectorAtQPs(vec, elInfo, subAssembler, quad, vecAtQPs);
417
418
419
    gradAtQPs = getGradientsAtQPs(vec, elInfo, subAssembler, quad);
  }

420
  void VecAndGradAtQP_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C) 
421
422
423
424
425
426
  { 
    for (int iq = 0; iq < nPoints; iq++)
      C[iq] += (*f)(vecAtQPs[iq], gradAtQPs[iq]);
  }
 
  void VecAndGradAtQP_ZOT::eval(int nPoints,
427
				const ElementVector& uhAtQP,
428
429
				const WorldVector<double> *grdUhAtQP,
				const WorldMatrix<double> *D2UhAtQP,
430
				ElementVector& result,
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
				double fac) 
  {
    for (int iq = 0; iq < nPoints; iq++)
      result[iq] += fac * (*f)(vecAtQPs[iq], gradAtQPs[iq]) * uhAtQP[iq];   
  }


  // ========== VecAndGradVecAtQP_ZOT ==========
 
  VecAndGradVecAtQP_ZOT::VecAndGradVecAtQP_ZOT(DOFVectorBase<double> *dv, 
					       DOFVectorBase<double> *dGrd,
					       BinaryAbstractFunction<double, double, WorldVector<double> > *af) 
    : ZeroOrderTerm(af->getDegree()), vec(dv), vecGrd(dGrd), f(af) 
  {
    TEST_EXIT(dv)("No vector!\n");
    TEST_EXIT(dGrd)("No gradient vector!\n");

448
449
    auxFeSpaces.insert(dv->getFeSpace());
    auxFeSpaces.insert(dGrd->getFeSpace());
450
451
452
453
454
455
  }

  void VecAndGradVecAtQP_ZOT::initElement(const ElInfo* elInfo, 
					  SubAssembler* subAssembler,
					  Quadrature *quad) 
  {
456
    getVectorAtQPs(vec, elInfo, subAssembler, quad, vecAtQPs);
457
458
459
    gradAtQPs = getGradientsAtQPs(vecGrd, elInfo, subAssembler, quad);
  }

460
  void VecAndGradVecAtQP_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C) 
461
462
463
464
465
466
  { 
    for (int iq = 0; iq < nPoints; iq++)
      C[iq] += (*f)(vecAtQPs[iq], gradAtQPs[iq]);
  }
 
  void VecAndGradVecAtQP_ZOT::eval(int nPoints,
467
				   const ElementVector& uhAtQP,
468
469
				   const WorldVector<double> *grdUhAtQP,
				   const WorldMatrix<double> *D2UhAtQP,
470
				   ElementVector& result,
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
				   double fac) 
  {
    for (int iq = 0; iq < nPoints; iq++)
      result[iq] += fac * (*f)(vecAtQPs[iq], gradAtQPs[iq]) * uhAtQP[iq];
  }


  // ========== VecAndGradVec2AtQP_ZOT ==========

  VecAndGradVec2AtQP_ZOT::VecAndGradVec2AtQP_ZOT(DOFVectorBase<double> *dv, 
						 DOFVectorBase<double> *dGrd1, 
						 DOFVectorBase<double> *dGrd2, 
						 TertiaryAbstractFunction<double, double, WorldVector<double>, WorldVector<double> > *af) 
    : ZeroOrderTerm(af->getDegree()), vec(dv), vecGrd1(dGrd1), vecGrd2(dGrd2), f(af) 
  {
    TEST_EXIT(dv)("No vector!\n");
    TEST_EXIT(dGrd1)("No first gradient vector!\n");
    TEST_EXIT(dGrd2)("No second gradient vector!\n");

490
491
492
    auxFeSpaces.insert(dv->getFeSpace());
    auxFeSpaces.insert(dGrd1->getFeSpace());
    auxFeSpaces.insert(dGrd2->getFeSpace());
493
494
495
496
497
498
  }

  void VecAndGradVec2AtQP_ZOT::initElement(const ElInfo* elInfo, 
					   SubAssembler* subAssembler,
					   Quadrature *quad) 
  {
499
    getVectorAtQPs(vec, elInfo, subAssembler, quad, vecAtQPs);
500
501
502
503
    grad1AtQPs = getGradientsAtQPs(vecGrd1, elInfo, subAssembler, quad);
    grad2AtQPs = getGradientsAtQPs(vecGrd2, elInfo, subAssembler, quad);
  }

504
  void VecAndGradVec2AtQP_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C)
505
506
507
508
509
510
  { 
    for (int iq = 0; iq < nPoints; iq++)
      C[iq] += (*f)(vecAtQPs[iq], grad1AtQPs[iq], grad2AtQPs[iq]);
  }
 
  void VecAndGradVec2AtQP_ZOT::eval(int nPoints,
511
				    const ElementVector& uhAtQP,
512
513
				    const WorldVector<double> *grdUhAtQP,
				    const WorldMatrix<double> *D2UhAtQP,
514
				    ElementVector& result,
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
				    double fac) 
  {
    for (int iq = 0; iq < nPoints; iq++)
      result[iq] += 
	fac * (*f)(vecAtQPs[iq], grad1AtQPs[iq], grad2AtQPs[iq]) * uhAtQP[iq];  
  }


  // ========== VecOfDOFVecsAtQP_ZOT ==========
 
  VecOfDOFVecsAtQP_ZOT::VecOfDOFVecsAtQP_ZOT(const std::vector<DOFVectorBase<double>*>& dv, 
					     AbstractFunction<double, std::vector<double> > *af)
    : ZeroOrderTerm(af->getDegree()), vecs(dv), f(af) 
  {
    vecsAtQPs.resize(vecs.size());

Thomas Witkowski's avatar
Thomas Witkowski committed
531
    for (unsigned int i = 0; i < dv.size(); i++) {
532
533
      TEST_EXIT(dv[i])("One vector is NULL!\n");

534
      auxFeSpaces.insert(dv[i]->getFeSpace());
535
536
537
    }
  } 

Thomas Witkowski's avatar
Thomas Witkowski committed
538

539
540
541
542
  void VecOfDOFVecsAtQP_ZOT::initElement(const ElInfo* elInfo, 
					 SubAssembler* subAssembler,
					 Quadrature *quad) 
  {
Thomas Witkowski's avatar
Thomas Witkowski committed
543
544
    unsigned int size = vecs.size();
    for (unsigned int i = 0; i < size; i++)
545
      getVectorAtQPs(vecs[i], elInfo, subAssembler, quad, vecsAtQPs[i]);
546
  }
Thomas Witkowski's avatar
Thomas Witkowski committed
547

548
 
549
  void VecOfDOFVecsAtQP_ZOT::getC(const ElInfo *, int nPoints,  ElementVector& C)
550
  { 
Thomas Witkowski's avatar
Thomas Witkowski committed
551
    unsigned int size = vecs.size();
552
553
554
    std::vector<double> arg(size);

    for (int iq = 0; iq < nPoints; iq++) {
Thomas Witkowski's avatar
Thomas Witkowski committed
555
      for (unsigned int i = 0; i < size; i++)
556
557
558
559
560
561
	arg[i] = vecsAtQPs[i][iq];
      
      C[iq] += (*f)(arg);
    }
  }

Thomas Witkowski's avatar
Thomas Witkowski committed
562

563
  void VecOfDOFVecsAtQP_ZOT::eval(int nPoints,
564
				  const ElementVector& uhAtQP,
565
566
				  const WorldVector<double> *grdUhAtQP,
				  const WorldMatrix<double> *D2UhAtQP,
567
				  ElementVector& result,
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
				  double fac) 
  {
    int size = static_cast<int>(vecs.size());
    std::vector<double> arg(size);

    for (int iq = 0; iq < nPoints; iq++) {
      for (int i = 0; i < size; i++)
	arg[i] = vecsAtQPs[i][iq];
      
      result[iq] += fac * (*f)(arg) * uhAtQP[iq];
    }
  }


  // ========== VecOfGradientsAtQP_ZOT ==========

  VecOfGradientsAtQP_ZOT::VecOfGradientsAtQP_ZOT(const std::vector<DOFVectorBase<double>*>& dv,
						 AbstractFunction<double, std::vector<WorldVector<double>*> > *af) 
    : ZeroOrderTerm(af->getDegree()), vecs(dv), f(af) 
  {
    gradsAtQPs.resize(vecs.size());

    for (int i = 0; i < static_cast<int>(dv.size()); i++) {
      TEST_EXIT(dv[i])("One vector is NULL!\n");

593
      auxFeSpaces.insert(dv[i]->getFeSpace());
594
595
596
597
598
599
600
601
602
603
604
605
    }
  } 

  void VecOfGradientsAtQP_ZOT::initElement(const ElInfo* elInfo, 
					   SubAssembler* subAssembler,
					   Quadrature *quad) 
  {
    int size = static_cast<int>(vecs.size());
    for (int i = 0; i < size; i++)
      gradsAtQPs[i] = getGradientsAtQPs(vecs[i], elInfo, subAssembler, quad);    
  }

606
  void VecOfGradientsAtQP_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C)
607
608
609
610
611
612
613
614
615
616
617
618
619
  { 
    int size = static_cast<int>(vecs.size());
    std::vector<WorldVector<double>*> arg(size);

    for (int iq = 0; iq < nPoints; iq++) {
      for (int i = 0; i < size; i++)
	arg[i] = &(gradsAtQPs[i][iq]);
      
      C[iq] += (*f)(arg);
    }
  }

  void VecOfGradientsAtQP_ZOT::eval(int nPoints,
620
				    const ElementVector& uhAtQP,
621
622
				    const WorldVector<double> *grdUhAtQP,
				    const WorldMatrix<double> *D2UhAtQP,
623
				    ElementVector& result,
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
				    double fac) 
  {
    int size = static_cast<int>(vecs.size());
    std::vector<WorldVector<double>*> arg(size);

    for (int iq = 0; iq < nPoints; iq++) {
      for (int i = 0; i < size; i++)
	arg[i] = &(gradsAtQPs[i][iq]);
      
      result[iq] += fac * (*f)(arg) * uhAtQP[iq];
    }
  }


  // ========== VecDivergence_ZOT ==========
 
  VecDivergence_ZOT::VecDivergence_ZOT(int nComponents,
				       DOFVectorBase<double> *vec0,
				       DOFVectorBase<double> *vec1,
				       DOFVectorBase<double> *vec2)
    : ZeroOrderTerm(0)
  {
    vecs.resize(nComponents);
    gradsAtQPs.resize(nComponents);
    vecs[0] = vec0;
    vecs[1] = vec1;
    vecs[2] = vec2;

652
    auxFeSpaces.insert(vec0->getFeSpace());
653
    if (vec1) 
654
      auxFeSpaces.insert(vec1->getFeSpace());
655
    if (vec2) 
656
      auxFeSpaces.insert(vec2->getFeSpace());
657
658
659
660
661
662
663
664
665
666
667
668
  }

  void VecDivergence_ZOT::initElement(const ElInfo* elInfo, 
				      SubAssembler* subAssembler,
				      Quadrature *quad) 
  {
    int size = static_cast<int>(vecs.size());
    for (int i = 0; i < size; i++)
      gradsAtQPs[i] = getGradientsAtQPs(vecs[i], elInfo, subAssembler, quad);    
  }


669
  void VecDivergence_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C)
670
671
672
673
674
675
676
677
678
  { 
    int size = static_cast<int>(vecs.size());

    for (int iq = 0; iq < nPoints; iq++)
      for (int i = 0; i < size; i++)
	C[iq] += gradsAtQPs[i][iq][i];    
  }

  void VecDivergence_ZOT::eval(int nPoints,
679
			       const ElementVector& uhAtQP,
680
681
			       const WorldVector<double> *grdUhAtQP,
			       const WorldMatrix<double> *D2UhAtQP,
682
			       ElementVector& result,
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
			       double fac) 
  {
    int size = static_cast<int>(vecs.size());

    for (int iq = 0; iq < nPoints; iq++) {
      double d = 0.0;
      for (int i = 0; i < size; i++)
	d += gradsAtQPs[i][iq][i];
      
      result[iq] += d * uhAtQP[iq] * fac;
    }
  }


  // ========== VecAndVecOfGradientsAtQP_ZOT =========

  VecAndVecOfGradientsAtQP_ZOT::VecAndVecOfGradientsAtQP_ZOT(DOFVector<double> *v,
							     const std::vector<DOFVector<double>*>& dv,
							     BinaryAbstractFunction<double, double, std::vector<WorldVector<double>*> > *af)
    : ZeroOrderTerm(af->getDegree()), vec(v), vecs(dv), f(af)
  {
    gradsAtQPs.resize(vecs.size());

    TEST_EXIT(v)("No vector!\n");

708
    auxFeSpaces.insert(v->getFeSpace());
709
710
711
    for (int i = 0; i < static_cast<int>(dv.size()); i++) {
      TEST_EXIT(dv[i])("One gradient vector is NULL!\n");

712
      auxFeSpaces.insert(dv[i]->getFeSpace());
713
714
715
716
717
718
719
720
721
722
723
    }
  }

  void VecAndVecOfGradientsAtQP_ZOT::initElement(const ElInfo* elInfo,
						 SubAssembler* subAssembler,
						 Quadrature *quad)
  {
    int size = static_cast<int>(vecs.size());
    for (int i = 0; i < size; i++)
      gradsAtQPs[i] = getGradientsAtQPs(vecs[i], elInfo, subAssembler, quad);

724
    getVectorAtQPs(vec, elInfo, subAssembler, quad, vecAtQPs);
725
726
727
  }

  void VecAndVecOfGradientsAtQP_ZOT::getC(const ElInfo *, int nPoints,
728
					  ElementVector& C)
729
730
731
732
733
734
735
736
737
738
739
740
741
  {
    int size = static_cast<int>(vecs.size());
    std::vector<WorldVector<double>*> arg(size);

    for (int iq = 0; iq < nPoints; iq++) {
      for (int i = 0; i < size; i++)
	arg[i] = &(gradsAtQPs[i][iq]);

      C[iq] += (*f)(vecAtQPs[iq], arg);
    }
  }

  void VecAndVecOfGradientsAtQP_ZOT::eval(int nPoints,
742
					  const ElementVector& uhAtQP,
743
744
					  const WorldVector<double> *grdUhAtQP,
					  const WorldMatrix<double> *D2UhAtQP,
745
					  ElementVector& result,
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
					  double fac) 
  {
    int size = static_cast<int>(vecs.size());
    std::vector<WorldVector<double>*> arg(size);

    for (int iq = 0; iq < nPoints; iq++) {
      for (int i = 0; i < size; i++)
	arg[i] = &(gradsAtQPs[i][iq]);

      result[iq] += fac * (*f)(vecAtQPs[iq], arg) * uhAtQP[iq];
    }
  }


  // ========== Vec2AndGrad2AtQP_ZOT ==========

  Vec2AndGrad2AtQP_ZOT::Vec2AndGrad2AtQP_ZOT(DOFVectorBase<double> *dv1, 
					     DOFVectorBase<double> *dv2,
					     QuartAbstractFunction<double, double, double, WorldVector<double>,WorldVector<double> > *af)
    : ZeroOrderTerm(af->getDegree()), vec1(dv1), vec2(dv2), f(af) 
  {
    TEST_EXIT(dv1)("No first vector!\n");
    TEST_EXIT(dv2)("No second vector!\n");
    
770
771
    auxFeSpaces.insert(dv1->getFeSpace());
    auxFeSpaces.insert(dv2->getFeSpace());
772
773
774
775
776
777
  }

  void Vec2AndGrad2AtQP_ZOT::initElement(const ElInfo* elInfo, 
					 SubAssembler* subAssembler,
					 Quadrature *quad) 
  {
778
779
    getVectorAtQPs(vec1, elInfo, subAssembler, quad, vecAtQPs1);
    getVectorAtQPs(vec2, elInfo, subAssembler, quad, vecAtQPs2);
780
781
782
783
784
785
    gradAtQPs1 = getGradientsAtQPs(vec1, elInfo, subAssembler, quad);
    gradAtQPs2 = getGradientsAtQPs(vec2, elInfo, subAssembler, quad);
  }
  
 
  void Vec2AndGrad2AtQP_ZOT::eval(int nPoints,
786
				  const ElementVector& uhAtQP,
787
788
				  const WorldVector<double> *grdUhAtQP,
				  const WorldMatrix<double> *D2UhAtQP,
789
				  ElementVector& result,
790
791
792
793
794
795
796
797
				  double fac) 
  {
    for (int iq = 0; iq < nPoints; iq++)
      result[iq] += 
	fac * (*f)(vecAtQPs1[iq], vecAtQPs2[iq], gradAtQPs1[iq], gradAtQPs2[iq]) * 
	uhAtQP[iq];
  }

798
  void Vec2AndGrad2AtQP_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C)  
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
  { 
    for (int iq = 0; iq < nPoints; iq++)
      C[iq] += (*f)(vecAtQPs1[iq], vecAtQPs2[iq], gradAtQPs1[iq], gradAtQPs2[iq]);
  }

  
  // ========== Vec2AndGradVecAtQP_ZOT ==========

  Vec2AndGradVecAtQP_ZOT::Vec2AndGradVecAtQP_ZOT(DOFVectorBase<double> *dv1, 
						 DOFVectorBase<double> *dv2, 
						 DOFVectorBase<double> *dGrd,
						 TertiaryAbstractFunction<double, double,double, WorldVector<double> > *af) 
    : ZeroOrderTerm(af->getDegree()), vec1(dv1), vec2(dv2), vecGrd(dGrd), f(af) 
  {
    TEST_EXIT(dv1)("No vector!\n");
    TEST_EXIT(dv2)("No vector!\n");
    TEST_EXIT(dGrd)("No gradient vector!\n");
    
817
818
819
    auxFeSpaces.insert(dv1->getFeSpace());
    auxFeSpaces.insert(dv2->getFeSpace());
    auxFeSpaces.insert(dGrd->getFeSpace());
820
821
822
823
824
825
  }
  
  void Vec2AndGradVecAtQP_ZOT::initElement(const ElInfo* elInfo, 
					   SubAssembler* subAssembler,
					   Quadrature *quad) 
  {
826
827
    getVectorAtQPs(vec1, elInfo, subAssembler, quad, vec1AtQPs);
    getVectorAtQPs(vec2, elInfo, subAssembler, quad, vec2AtQPs);
828
829
830
    gradAtQPs = getGradientsAtQPs(vecGrd, elInfo, subAssembler, quad);
  }
  
831
  void Vec2AndGradVecAtQP_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C)  
832
833
834
835
836
837
  { 
    for (int iq = 0; iq < nPoints; iq++)
      C[iq] += (*f)(vec1AtQPs[iq], vec2AtQPs[iq], gradAtQPs[iq]);
  }
  
  void Vec2AndGradVecAtQP_ZOT::eval(int nPoints,
838
				   const ElementVector& uhAtQP,
839
840
				   const WorldVector<double> *grdUhAtQP,
				   const WorldMatrix<double> *D2UhAtQP,
841
				   ElementVector& result,
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
				   double fac) 
  {
    for (int iq = 0; iq < nPoints; iq++)
      result[iq] += 
	fac * (*f)(vec1AtQPs[iq], vec2AtQPs[iq], gradAtQPs[iq]) * uhAtQP[iq];
  }


  // =========== General_ZOT ==========
  
  General_ZOT::General_ZOT(std::vector<DOFVectorBase<double>*> vecs,
			   std::vector<DOFVectorBase<double>*> grads,
			   TertiaryAbstractFunction<double, WorldVector<double>, std::vector<double>, std::vector<WorldVector<double> > > *af)
    : ZeroOrderTerm(af->getDegree()), vecs_(vecs), grads_(grads), f_(af)
  {
857
    vecsAtQPs.resize(vecs_.size());
858
859
860
861
862
    gradsAtQPs_.resize(grads_.size());

    for (int i = 0; i < static_cast<int>(vecs.size()); i++) {
      TEST_EXIT(vecs[i])("One vector is NULL!\n");

863
      auxFeSpaces.insert(vecs[i]->getFeSpace());
864
865
866
867
868
    }   

    for (int i = 0; i < static_cast<int>(grads.size()); i++) {
      TEST_EXIT(grads[i])("One gradient vector is NULL!\n");

869
      auxFeSpaces.insert(grads[i]->getFeSpace());
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
    }   

    vecsArg.resize(vecs_.size());
    gradsArg.resize(grads_.size());
  }

  void General_ZOT::initElement(const ElInfo* elInfo, SubAssembler* subAssembler,
				Quadrature *quad)
  {
    int nVecs = static_cast<int>(vecs_.size());
    int nGrads = static_cast<int>(grads_.size());

    coordsAtQPs_ = subAssembler->getCoordsAtQPs(elInfo, quad);

    for (int i = 0; i < nVecs; i++)
885
      getVectorAtQPs(vecs_[i], elInfo, subAssembler, quad, vecsAtQPs[i]);
886
887
888
889
    for (int i = 0; i < nGrads; i++)
      gradsAtQPs_[i] = getGradientsAtQPs(grads_[i], elInfo, subAssembler, quad);
  }

890
  void General_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C)
891
892
893
894
895
896
  {
    unsigned int nVecs = vecs_.size();
    unsigned int nGrads = grads_.size();

    for (int iq = 0; iq < nPoints; iq++) {
      for (unsigned int i = 0; i < nVecs; i++)
897
	vecsArg[i] = vecsAtQPs[i][iq];
898
899
900
901
902
903
904
905
      for (unsigned int i = 0; i < nGrads; i++)
	gradsArg[i] = gradsAtQPs_[i][iq];

      C[iq] += (*f_)(coordsAtQPs_[iq], vecsArg, gradsArg);
    }
  }

  void General_ZOT::eval(int nPoints,
906
			 const ElementVector& uhAtQP,
907
908
			 const WorldVector<double> *grdUhAtQP,
			 const WorldMatrix<double> *D2UhAtQP,
909
			 ElementVector& result,
910
911
912
913
914
915
916
			 double fac) 
  {
    unsigned int nVecs = vecs_.size();
    unsigned int nGrads = grads_.size();

    for (int iq = 0; iq < nPoints; iq++) {
      for (unsigned int i = 0; i < nVecs; i++)
917
	vecsArg[i] = vecsAtQPs[i][iq];      
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
      for (unsigned int i = 0; i < nGrads; i++) 
	gradsArg[i] = gradsAtQPs_[i][iq];      

      result[iq] += fac * (*f_)(coordsAtQPs_[iq], vecsArg, gradsArg) * uhAtQP[iq];
    }
  }


  // ========== GeneralParametric_ZOT ==========

  GeneralParametric_ZOT::GeneralParametric_ZOT(std::vector<DOFVectorBase<double>*> vecs,
					       std::vector<DOFVectorBase<double>*> grads,
					       QuartAbstractFunction<double, 
					       WorldVector<double>,
					       WorldVector<double>,
					       std::vector<double>, 
					       std::vector<WorldVector<double> > > *af)
    : ZeroOrderTerm(af->getDegree()), vecs_(vecs), grads_(grads), f_(af)
  {
937
938
    vecsAtQPs.resize(vecs_.size());
    gradsAtQPs.resize(grads_.size());
939
940
941
942

    for (int i = 0; i < static_cast<int>(vecs.size()); i++) {
      TEST_EXIT(vecs[i])("One vector is NULL!\n");

943
      auxFeSpaces.insert(vecs[i]->getFeSpace());
944
945
946
947
948
    }   

    for (int i = 0; i < static_cast<int>(grads.size()); i++) {
      TEST_EXIT(grads[i])("One gradient vector is NULL!\n");

949
      auxFeSpaces.insert(grads[i]->getFeSpace());
950
951
952
953
954
955
956
957
958
959
960
961
962
    }   
  }

  void GeneralParametric_ZOT::initElement(const ElInfo* elInfo, SubAssembler* 
					  subAssembler, Quadrature *quad)
  {
    int nVecs = static_cast<int>(vecs_.size());
    int nGrads = static_cast<int>(grads_.size());

    elInfo->getElementNormal(elementNormal_);
    coordsAtQPs_ = subAssembler->getCoordsAtQPs(elInfo, quad);

    for (int i = 0; i < nVecs; i++)
963
      getVectorAtQPs(vecs_[i], elInfo, subAssembler, quad, vecsAtQPs[i]);
964
    for (int i = 0; i < nGrads; i++)
965
      gradsAtQPs[i] = getGradientsAtQPs(grads_[i], elInfo, subAssembler, quad);
966
967
  }

968
  void GeneralParametric_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C)
969
970
971
972
973
974
975
976
977
  {
    int nVecs = static_cast<int>(vecs_.size());
    int nGrads = static_cast<int>(grads_.size());

    std::vector<double> vecsArg(nVecs);
    std::vector<WorldVector<double> > gradsArg(nGrads);

    for (int iq = 0; iq < nPoints; iq++) {
      for (int i = 0; i < nVecs; i++)
978
	vecsArg[i] = vecsAtQPs[i][iq];      
979
      for (int i = 0; i < nGrads; i++)
980
	gradsArg[i] = gradsAtQPs[i][iq];
981
982
983
984
985
986
      
      C[iq] += (*f_)(coordsAtQPs_[iq],  elementNormal_, vecsArg, gradsArg);
    }
  }

  void GeneralParametric_ZOT::eval(int nPoints,
987
				   const ElementVector& uhAtQP,
988
989
				   const WorldVector<double> *grdUhAtQP,
				   const WorldMatrix<double> *D2UhAtQP,
990
				   ElementVector& result,
991
992
993
994
995
996
997
998
999
1000
				   double fac) 
  {
    int nVecs = static_cast<int>(vecs_.size());
    int nGrads = static_cast<int>(grads_.size());

    std::vector<double> vecsArg(nVecs);
    std::vector<WorldVector<double> > gradsArg(nGrads);

    for (int iq = 0; iq < nPoints; iq++) {
      for (int i = 0; i < nVecs; i++)
1001
	vecsArg[i] = vecsAtQPs[i][iq];     
1002
      for (int i = 0; i < nGrads; i++)
1003
	gradsArg[i] = gradsAtQPs[i][iq];      
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
      result[iq] += 
	fac * (*f_)(coordsAtQPs_[iq],  elementNormal_, vecsArg, gradsArg) * uhAtQP[iq];
    }
  }


  // ========== CoordsAtQP_ZOT ==========

  void CoordsAtQP_ZOT::initElement(const ElInfo* elInfo, 
				   SubAssembler* subAssembler,
				   Quadrature *quad) 
  {
    coordsAtQPs = subAssembler->getCoordsAtQPs(elInfo, quad);
  }

1019
  void CoordsAtQP_ZOT::getC(const ElInfo *elInfo, int nPoints, ElementVector& C)
1020
1021
1022
1023
1024
1025
  { 
    for (int iq = 0; iq < nPoints; iq++)
      C[iq] += (*g)(coordsAtQPs[iq]);    
  }

  void CoordsAtQP_ZOT::eval(int nPoints,
1026
			    const ElementVector& uhAtQP,
1027
1028
			    const WorldVector<double> *grdUhAtQP,
			    const WorldMatrix<double> *D2UhAtQP,
1029
			    ElementVector& result,
1030
1031
1032
1033
1034
1035
1036
1037
			    double fac) 
  {
    for (int iq = 0; iq < nPoints; iq++)
      result[iq] += fac * (*g)(coordsAtQPs[iq]) * uhAtQP[iq];    
  }


}