ZeroOrderTerm.cc 31 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
//
// Software License for AMDiS
//
// Copyright (c) 2010 Dresden University of Technology 
// All rights reserved.
// Authors: Simon Vey, Thomas Witkowski et al.
//
// This file is part of AMDiS
//
// See also license.opensource.txt in the distribution.


13
14
15
16
17
18
19
20
21
22
23
24
25
#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");

26
    auxFeSpaces.insert(dv->getFeSpace());
27
28
  }

Thomas Witkowski's avatar
Thomas Witkowski committed
29

30
31
32
33
  void VecAtQP_ZOT::initElement(const ElInfo* elInfo, 
				SubAssembler* subAssembler,
				Quadrature *quad) 
  {
34
    getVectorAtQPs(vec, elInfo, subAssembler, quad, vecAtQPs);
35
36
  }

Thomas Witkowski's avatar
Thomas Witkowski committed
37

38
39
40
41
42
  void VecAtQP_ZOT::initElement(const ElInfo* smallElInfo,
				const ElInfo* largeElInfo,
				SubAssembler* subAssembler,
				Quadrature *quad)
  {
43
    getVectorAtQPs(vec, smallElInfo, largeElInfo, subAssembler, quad, vecAtQPs);
44
45
  }

Thomas Witkowski's avatar
Thomas Witkowski committed
46

47
  void VecAtQP_ZOT::getC(const ElInfo *elInfo, int nPoints, ElementVector& C)  
48
49
50
  { 
    if (f) {
      for (int iq = 0; iq < nPoints; iq++)
51
	C[iq] += (*f)(vecAtQPs[iq]);            
52
53
54
55
56
57
    } else {
      for (int iq = 0; iq < nPoints; iq++)
	C[iq] += vecAtQPs[iq];      
    }
  }

Thomas Witkowski's avatar
Thomas Witkowski committed
58

59
  void VecAtQP_ZOT::eval(int nPoints,
60
			 const ElementVector& uhAtQP,
61
62
			 const WorldVector<double> *grdUhAtQP,
			 const WorldMatrix<double> *D2UhAtQP,
63
			 ElementVector& result,
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
			 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");

88
89
    auxFeSpaces.insert(dv1->getFeSpace());
    auxFeSpaces.insert(dv2->getFeSpace());
90
91
  }

Thomas Witkowski's avatar
Thomas Witkowski committed
92

93
94
95
96
  void MultVecAtQP_ZOT::initElement(const ElInfo* elInfo, 
				    SubAssembler* subAssembler,
				    Quadrature *quad) 
  {
97
98
    getVectorAtQPs(vec1, elInfo, subAssembler, quad, vecAtQPs1);
    getVectorAtQPs(vec2, elInfo, subAssembler, quad, vecAtQPs2);
99
100
  }

Thomas Witkowski's avatar
Thomas Witkowski committed
101

102
  void MultVecAtQP_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C)  
103
104
105
106
107
  { 
    for (int iq = 0; iq < nPoints; iq++)
      C[iq] += (*f1)(vecAtQPs1[iq]) * (*f2)(vecAtQPs2[iq]);    
  }

Thomas Witkowski's avatar
Thomas Witkowski committed
108

109
  void MultVecAtQP_ZOT::eval(int nPoints,
110
			     const ElementVector& uhAtQP,
111
112
			     const WorldVector<double> *grdUhAtQP,
			     const WorldMatrix<double> *D2UhAtQP,
113
			     ElementVector& result,
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
			     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");

131
132
    auxFeSpaces.insert(dv1->getFeSpace());
    auxFeSpaces.insert(dv2->getFeSpace());
133
134
  }

Thomas Witkowski's avatar
Thomas Witkowski committed
135

136
137
138
139
  void Vec2AtQP_ZOT::initElement(const ElInfo* elInfo, 
				 SubAssembler* subAssembler,
				 Quadrature *quad) 
  {
140
141
    getVectorAtQPs(vec1, elInfo, subAssembler, quad, vecAtQPs1);
    getVectorAtQPs(vec2, elInfo, subAssembler, quad, vecAtQPs2);
142
143
144
145
146
147
148
  }

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

151
152
    getVectorAtQPs(vec1, smallElInfo, largeElInfo, subAssembler, quad, vecAtQPs1);
    getVectorAtQPs(vec2, smallElInfo, largeElInfo, subAssembler, quad, vecAtQPs2);
153
154
  }

155
  void Vec2AtQP_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C)  
156
157
158
159
160
161
  { 
    for (int iq = 0; iq < nPoints; iq++)
      C[iq] += (*f)(vecAtQPs1[iq], vecAtQPs2[iq]);    
  }

  void Vec2AtQP_ZOT::eval(int nPoints,
162
			  const ElementVector& uhAtQP,
163
164
			  const WorldVector<double> *grdUhAtQP,
			  const WorldMatrix<double> *D2UhAtQP,
165
			  ElementVector& result,
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
			  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");

185
186
187
    auxFeSpaces.insert(dv1->getFeSpace());
    auxFeSpaces.insert(dv2->getFeSpace());
    auxFeSpaces.insert(dv3->getFeSpace());
188
189
190
191
192
193
  }

  void Vec3AtQP_ZOT::initElement(const ElInfo* elInfo, 
				 SubAssembler* subAssembler,
				 Quadrature *quad) 
  {
194
195
196
    getVectorAtQPs(vec1, elInfo, subAssembler, quad, vecAtQPs1);
    getVectorAtQPs(vec2, elInfo, subAssembler, quad, vecAtQPs2);
    getVectorAtQPs(vec3, elInfo, subAssembler, quad, vecAtQPs3);
197
198
  }

199
  void Vec3AtQP_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C)  
200
201
202
203
204
205
  { 
    for (int iq = 0; iq < nPoints; iq++)
      C[iq] += (*f)(vecAtQPs1[iq], vecAtQPs2[iq], vecAtQPs3[iq]);    
  }

  void Vec3AtQP_ZOT::eval(int nPoints,
206
			  const ElementVector& uhAtQP,
207
208
			  const WorldVector<double> *grdUhAtQP,
			  const WorldMatrix<double> *D2UhAtQP,
209
			  ElementVector& result,
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
			  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");

226
    auxFeSpaces.insert(dv->getFeSpace());
227
228
229
230
231
232
233
234
235
236
  }

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

237
  void FctGradientCoords_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C)  
238
239
240
241
242
243
  { 
    for (int iq = 0; iq < nPoints; iq++)
      C[iq] += (*f)(gradAtQPs[iq], coordsAtQPs[iq]);    
  }
 
  void FctGradientCoords_ZOT::eval(int nPoints,
244
				   const ElementVector& uhAtQP,
245
246
				   const WorldVector<double> *grdUhAtQP,
				   const WorldMatrix<double> *D2UhAtQP,
247
				   ElementVector& result,
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
				   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");

264
    auxFeSpaces.insert(dv->getFeSpace());
265
266
267
268
269
270
  }

  void VecGradCoordsAtQP_ZOT::initElement(const ElInfo* elInfo, 
					  SubAssembler* subAssembler,
					  Quadrature *quad) 
  {
271
    getVectorAtQPs(vec, elInfo, subAssembler, quad, vecAtQPs);
272
273
274
275
    gradAtQPs = getGradientsAtQPs(vec, elInfo, subAssembler, quad);
    coordsAtQPs = subAssembler->getCoordsAtQPs(elInfo, quad);
  }

276
  void VecGradCoordsAtQP_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C)  
277
278
279
280
281
282
  { 
    for (int iq = 0; iq < nPoints; iq++)
      C[iq] += (*f)(vecAtQPs[iq], gradAtQPs[iq], coordsAtQPs[iq]);
  }
 
  void VecGradCoordsAtQP_ZOT::eval(int nPoints,
283
				   const ElementVector& uhAtQP,
284
285
				   const WorldVector<double> *grdUhAtQP,
				   const WorldMatrix<double> *D2UhAtQP,
286
				   ElementVector& result,
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
				   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");

305
    auxFeSpaces.insert(dv->getFeSpace());
306
307
308
309
310
311
  }

  void VecAndCoordsAtQP_ZOT::initElement(const ElInfo* elInfo, 
					 SubAssembler* subAssembler,
					 Quadrature *quad) 
  {
312
    getVectorAtQPs(vec, elInfo, subAssembler, quad, vecAtQPs);
313
314
315
    coordsAtQPs = subAssembler->getCoordsAtQPs(elInfo, quad);
  }

316
  void VecAndCoordsAtQP_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C)  
317
318
319
320
321
322
  { 
    for (int iq = 0; iq < nPoints; iq++)
      C[iq] += (*f)(vecAtQPs[iq], coordsAtQPs[iq]);    
  }

  void VecAndCoordsAtQP_ZOT::eval(int nPoints,
323
				  const ElementVector& uhAtQP,
324
325
				  const WorldVector<double> *grdUhAtQP,
				  const WorldMatrix<double> *D2UhAtQP,
326
				  ElementVector& result,
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
				  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");

343
344
    auxFeSpaces.insert(dv1->getFeSpace());
    auxFeSpaces.insert(dv2->getFeSpace());
345
346
347
348
349
350
  }

  void Vec2AndGradAtQP_ZOT::initElement(const ElInfo* elInfo, 
					SubAssembler* subAssembler,
					Quadrature *quad) 
  {
351
352
    getVectorAtQPs(vec1, elInfo, subAssembler, quad, vecAtQPs1);
    getVectorAtQPs(vec2, elInfo, subAssembler, quad, vecAtQPs2);
353
354
355
356
    gradAtQPs = getGradientsAtQPs(vec1, elInfo, subAssembler, quad);
  }

  void Vec2AndGradAtQP_ZOT::eval(int nPoints,
357
				 const ElementVector& uhAtQP,
358
359
				 const WorldVector<double> *grdUhAtQP,
				 const WorldMatrix<double> *D2UhAtQP,
360
				 ElementVector& result,
361
362
363
364
365
366
367
368
369
				 double fac) 
  {
    for (int iq = 0; iq < nPoints; iq++)
      result[iq] += 
	fac * 
	(*f)(vecAtQPs1[iq], gradAtQPs[iq], vecAtQPs2[iq]) * 
	uhAtQP[iq];
  }

370
  void Vec2AndGradAtQP_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C)  
371
372
373
374
375
376
377
378
379
380
381
382
383
384
  { 
    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");

385
    auxFeSpaces.insert(dv->getFeSpace());
386
387
388
389
390
391
392
393
394
  }

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

395
  void FctGradient_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C) 
396
397
398
399
400
401
  { 
    for (int iq = 0; iq < nPoints; iq++)
      C[iq] += (*f)(gradAtQPs[iq]);
  }
 
  void FctGradient_ZOT::eval(int nPoints,
402
			     const ElementVector& uhAtQP,
403
404
			     const WorldVector<double> *grdUhAtQP,
			     const WorldMatrix<double> *D2UhAtQP,
405
			     ElementVector& result,
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
			     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");

421
    auxFeSpaces.insert(dv->getFeSpace());
422
423
424
425
426
427
  }

  void VecAndGradAtQP_ZOT::initElement(const ElInfo* elInfo, 
				       SubAssembler* subAssembler,
				       Quadrature *quad) 
  {
428
    getVectorAtQPs(vec, elInfo, subAssembler, quad, vecAtQPs);
429
430
431
    gradAtQPs = getGradientsAtQPs(vec, elInfo, subAssembler, quad);
  }

432
  void VecAndGradAtQP_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C) 
433
434
435
436
437
438
  { 
    for (int iq = 0; iq < nPoints; iq++)
      C[iq] += (*f)(vecAtQPs[iq], gradAtQPs[iq]);
  }
 
  void VecAndGradAtQP_ZOT::eval(int nPoints,
439
				const ElementVector& uhAtQP,
440
441
				const WorldVector<double> *grdUhAtQP,
				const WorldMatrix<double> *D2UhAtQP,
442
				ElementVector& result,
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
				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");

460
461
    auxFeSpaces.insert(dv->getFeSpace());
    auxFeSpaces.insert(dGrd->getFeSpace());
462
463
464
465
466
467
  }

  void VecAndGradVecAtQP_ZOT::initElement(const ElInfo* elInfo, 
					  SubAssembler* subAssembler,
					  Quadrature *quad) 
  {
468
    getVectorAtQPs(vec, elInfo, subAssembler, quad, vecAtQPs);
469
470
471
    gradAtQPs = getGradientsAtQPs(vecGrd, elInfo, subAssembler, quad);
  }

472
  void VecAndGradVecAtQP_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C) 
473
474
475
476
477
478
  { 
    for (int iq = 0; iq < nPoints; iq++)
      C[iq] += (*f)(vecAtQPs[iq], gradAtQPs[iq]);
  }
 
  void VecAndGradVecAtQP_ZOT::eval(int nPoints,
479
				   const ElementVector& uhAtQP,
480
481
				   const WorldVector<double> *grdUhAtQP,
				   const WorldMatrix<double> *D2UhAtQP,
482
				   ElementVector& result,
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
				   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");

502
503
504
    auxFeSpaces.insert(dv->getFeSpace());
    auxFeSpaces.insert(dGrd1->getFeSpace());
    auxFeSpaces.insert(dGrd2->getFeSpace());
505
506
507
508
509
510
  }

  void VecAndGradVec2AtQP_ZOT::initElement(const ElInfo* elInfo, 
					   SubAssembler* subAssembler,
					   Quadrature *quad) 
  {
511
    getVectorAtQPs(vec, elInfo, subAssembler, quad, vecAtQPs);
512
513
514
515
    grad1AtQPs = getGradientsAtQPs(vecGrd1, elInfo, subAssembler, quad);
    grad2AtQPs = getGradientsAtQPs(vecGrd2, elInfo, subAssembler, quad);
  }

516
  void VecAndGradVec2AtQP_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C)
517
518
519
520
521
522
  { 
    for (int iq = 0; iq < nPoints; iq++)
      C[iq] += (*f)(vecAtQPs[iq], grad1AtQPs[iq], grad2AtQPs[iq]);
  }
 
  void VecAndGradVec2AtQP_ZOT::eval(int nPoints,
523
				    const ElementVector& uhAtQP,
524
525
				    const WorldVector<double> *grdUhAtQP,
				    const WorldMatrix<double> *D2UhAtQP,
526
				    ElementVector& result,
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
				    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
543
    for (unsigned int i = 0; i < dv.size(); i++) {
544
545
      TEST_EXIT(dv[i])("One vector is NULL!\n");

546
      auxFeSpaces.insert(dv[i]->getFeSpace());
547
548
549
    }
  } 

Thomas Witkowski's avatar
Thomas Witkowski committed
550

551
552
553
554
  void VecOfDOFVecsAtQP_ZOT::initElement(const ElInfo* elInfo, 
					 SubAssembler* subAssembler,
					 Quadrature *quad) 
  {
Thomas Witkowski's avatar
Thomas Witkowski committed
555
556
    unsigned int size = vecs.size();
    for (unsigned int i = 0; i < size; i++)
557
      getVectorAtQPs(vecs[i], elInfo, subAssembler, quad, vecsAtQPs[i]);
558
  }
Thomas Witkowski's avatar
Thomas Witkowski committed
559

560
 
561
  void VecOfDOFVecsAtQP_ZOT::getC(const ElInfo *, int nPoints,  ElementVector& C)
562
  { 
Thomas Witkowski's avatar
Thomas Witkowski committed
563
    unsigned int size = vecs.size();
564
565
566
    std::vector<double> arg(size);

    for (int iq = 0; iq < nPoints; iq++) {
Thomas Witkowski's avatar
Thomas Witkowski committed
567
      for (unsigned int i = 0; i < size; i++)
568
569
570
571
572
573
	arg[i] = vecsAtQPs[i][iq];
      
      C[iq] += (*f)(arg);
    }
  }

Thomas Witkowski's avatar
Thomas Witkowski committed
574

575
  void VecOfDOFVecsAtQP_ZOT::eval(int nPoints,
576
				  const ElementVector& uhAtQP,
577
578
				  const WorldVector<double> *grdUhAtQP,
				  const WorldMatrix<double> *D2UhAtQP,
579
				  ElementVector& result,
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
				  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");

605
      auxFeSpaces.insert(dv[i]->getFeSpace());
606
607
608
609
610
611
612
613
614
615
616
617
    }
  } 

  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);    
  }

618
  void VecOfGradientsAtQP_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C)
619
620
621
622
623
624
625
626
627
628
629
630
631
  { 
    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,
632
				    const ElementVector& uhAtQP,
633
634
				    const WorldVector<double> *grdUhAtQP,
				    const WorldMatrix<double> *D2UhAtQP,
635
				    ElementVector& result,
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
				    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;

664
    auxFeSpaces.insert(vec0->getFeSpace());
665
    if (vec1) 
666
      auxFeSpaces.insert(vec1->getFeSpace());
667
    if (vec2) 
668
      auxFeSpaces.insert(vec2->getFeSpace());
669
670
671
672
673
674
675
676
677
678
679
680
  }

  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);    
  }


681
  void VecDivergence_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C)
682
683
684
685
686
687
688
689
690
  { 
    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,
691
			       const ElementVector& uhAtQP,
692
693
			       const WorldVector<double> *grdUhAtQP,
			       const WorldMatrix<double> *D2UhAtQP,
694
			       ElementVector& result,
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
			       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");

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

724
      auxFeSpaces.insert(dv[i]->getFeSpace());
725
726
727
728
729
730
731
732
733
734
735
    }
  }

  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);

736
    getVectorAtQPs(vec, elInfo, subAssembler, quad, vecAtQPs);
737
738
739
  }

  void VecAndVecOfGradientsAtQP_ZOT::getC(const ElInfo *, int nPoints,
740
					  ElementVector& C)
741
742
743
744
745
746
747
748
749
750
751
752
753
  {
    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,
754
					  const ElementVector& uhAtQP,
755
756
					  const WorldVector<double> *grdUhAtQP,
					  const WorldMatrix<double> *D2UhAtQP,
757
					  ElementVector& result,
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
					  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");
    
782
783
    auxFeSpaces.insert(dv1->getFeSpace());
    auxFeSpaces.insert(dv2->getFeSpace());
784
785
786
787
788
789
  }

  void Vec2AndGrad2AtQP_ZOT::initElement(const ElInfo* elInfo, 
					 SubAssembler* subAssembler,
					 Quadrature *quad) 
  {
790
791
    getVectorAtQPs(vec1, elInfo, subAssembler, quad, vecAtQPs1);
    getVectorAtQPs(vec2, elInfo, subAssembler, quad, vecAtQPs2);
792
793
794
795
796
797
    gradAtQPs1 = getGradientsAtQPs(vec1, elInfo, subAssembler, quad);
    gradAtQPs2 = getGradientsAtQPs(vec2, elInfo, subAssembler, quad);
  }
  
 
  void Vec2AndGrad2AtQP_ZOT::eval(int nPoints,
798
				  const ElementVector& uhAtQP,
799
800
				  const WorldVector<double> *grdUhAtQP,
				  const WorldMatrix<double> *D2UhAtQP,
801
				  ElementVector& result,
802
803
804
805
806
807
808
809
				  double fac) 
  {
    for (int iq = 0; iq < nPoints; iq++)
      result[iq] += 
	fac * (*f)(vecAtQPs1[iq], vecAtQPs2[iq], gradAtQPs1[iq], gradAtQPs2[iq]) * 
	uhAtQP[iq];
  }

810
  void Vec2AndGrad2AtQP_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C)  
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
  { 
    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");
    
829
830
831
    auxFeSpaces.insert(dv1->getFeSpace());
    auxFeSpaces.insert(dv2->getFeSpace());
    auxFeSpaces.insert(dGrd->getFeSpace());
832
833
834
835
836
837
  }
  
  void Vec2AndGradVecAtQP_ZOT::initElement(const ElInfo* elInfo, 
					   SubAssembler* subAssembler,
					   Quadrature *quad) 
  {
838
839
    getVectorAtQPs(vec1, elInfo, subAssembler, quad, vec1AtQPs);
    getVectorAtQPs(vec2, elInfo, subAssembler, quad, vec2AtQPs);
840
841
842
    gradAtQPs = getGradientsAtQPs(vecGrd, elInfo, subAssembler, quad);
  }
  
843
  void Vec2AndGradVecAtQP_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C)  
844
845
846
847
848
849
  { 
    for (int iq = 0; iq < nPoints; iq++)
      C[iq] += (*f)(vec1AtQPs[iq], vec2AtQPs[iq], gradAtQPs[iq]);
  }
  
  void Vec2AndGradVecAtQP_ZOT::eval(int nPoints,
850
				   const ElementVector& uhAtQP,
851
852
				   const WorldVector<double> *grdUhAtQP,
				   const WorldMatrix<double> *D2UhAtQP,
853
				   ElementVector& result,
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
				   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)
  {
869
    vecsAtQPs.resize(vecs_.size());
870
871
872
873
874
    gradsAtQPs_.resize(grads_.size());

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

875
      auxFeSpaces.insert(vecs[i]->getFeSpace());
876
877
878
879
880
    }   

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

881
      auxFeSpaces.insert(grads[i]->getFeSpace());
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
    }   

    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++)
897
      getVectorAtQPs(vecs_[i], elInfo, subAssembler, quad, vecsAtQPs[i]);
898
899
900
901
    for (int i = 0; i < nGrads; i++)
      gradsAtQPs_[i] = getGradientsAtQPs(grads_[i], elInfo, subAssembler, quad);
  }

902
  void General_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C)
903
904
905
906
907
908
  {
    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++)
909
	vecsArg[i] = vecsAtQPs[i][iq];
910
911
912
913
914
915
916
917
      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,
918
			 const ElementVector& uhAtQP,
919
920
			 const WorldVector<double> *grdUhAtQP,
			 const WorldMatrix<double> *D2UhAtQP,
921
			 ElementVector& result,
922
923
924
925
926
927
928
			 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++)
929
	vecsArg[i] = vecsAtQPs[i][iq];      
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
      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)
  {
949
950
    vecsAtQPs.resize(vecs_.size());
    gradsAtQPs.resize(grads_.size());
951
952
953
954

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

955
      auxFeSpaces.insert(vecs[i]->getFeSpace());
956
957
958
959
960
    }   

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

961
      auxFeSpaces.insert(grads[i]->getFeSpace());
962
963
964
965
966
967
968
969
970
971
972
973
974
    }   
  }

  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++)
975
      getVectorAtQPs(vecs_[i], elInfo, subAssembler, quad, vecsAtQPs[i]);
976
    for (int i = 0; i < nGrads; i++)
977
      gradsAtQPs[i] = getGradientsAtQPs(grads_[i], elInfo, subAssembler, quad);
978
979
  }

980
  void GeneralParametric_ZOT::getC(const ElInfo *, int nPoints, ElementVector& C)
981
982
983
984
985
986
987
988
989
  {
    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++)
990
	vecsArg[i] = vecsAtQPs[i][iq];      
991
      for (int i = 0; i < nGrads; i++)
992
	gradsArg[i] = gradsAtQPs[i][iq];
993
994
995
996
997
998
      
      C[iq] += (*f_)(coordsAtQPs_[iq],  elementNormal_, vecsArg, gradsArg);
    }
  }

  void GeneralParametric_ZOT::eval(int nPoints,
999
				   const ElementVector& uhAtQP,
1000
1001
				   const WorldVector<double> *grdUhAtQP,
				   const WorldMatrix<double> *D2UhAtQP,
1002
				   ElementVector& result,
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
				   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++)
1013
	vecsArg[i] = vecsAtQPs[i][iq];     
1014
      for (int i = 0; i < nGrads; i++)
1015
	gradsArg[i] = gradsAtQPs[i][iq];      
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
      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);
  }

1031
  void CoordsAtQP_ZOT::getC(const ElInfo *elInfo, int nPoints, ElementVector& C)
1032
1033
1034
1035
1036
1037
  { 
    for (int iq = 0; iq < nPoints; iq++)
      C[iq] += (*g)(coordsAtQPs[iq]);    
  }

  void CoordsAtQP_ZOT::eval(int nPoints,
1038
			    const ElementVector& uhAtQP,
1039
1040
			    const WorldVector<double> *grdUhAtQP,
			    const WorldMatrix<double> *D2UhAtQP,
1041
			    ElementVector& result,
1042
1043
1044
1045
1046
1047
1048
1049
			    double fac) 
  {
    for (int iq = 0; iq < nPoints; iq++)
      result[iq] += fac * (*g)(coordsAtQPs[iq]) * uhAtQP[iq];    
  }


}