LifeV
structure/examples/example_anisotropicTraction/ud_functions.cpp
Go to the documentation of this file.
1 //@HEADER
2 /*
3 *******************************************************************************
4 
5  Copyright (C) 2004, 2005, 2007 EPFL, Politecnico di Milano, INRIA
6  Copyright (C) 2010 EPFL, Politecnico di Milano, Emory University
7 
8  This file is part of LifeV.
9 
10  LifeV is free software; you can redistribute it and/or modify
11  it under the terms of the GNU Lesser General Public License as published by
12  the Free Software Foundation, either version 3 of the License, or
13  (at your option) any later version.
14 
15  LifeV is distributed in the hope that it will be useful,
16  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18  Lesser General Public License for more details.
19 
20  You should have received a copy of the GNU Lesser General Public License
21  along with LifeV. If not, see <http://www.gnu.org/licenses/>.
22 
23 *******************************************************************************
24 */
25 //@HEADER
26 
27 /*!
28  * @file
29  * @brief File containing the boundary conditions for the Monolithic Test
30  *
31  * @date 2009-04-09
32  * @author Paolo Tricerri <paolo.tricerri@epfl.ch>
33  *
34  * @maintainer Paolo Tricerri <paolo.tricerri@epfl.ch>
35  *
36  * Contains the functions to be assigned as boundary conditions, in the file boundaryConditions.hpp . The functions
37  * can depend on time and space, while they can take in input an ID specifying one of the three principal axis
38  * if the functions to assign is vectorial and the boundary condition is of type \c Full \c.
39  */
40 
41 #include "ud_functions.hpp"
42 #include<lifev/core/array/VectorSmall.hpp>
43 #include<lifev/core/array/MatrixSmall.hpp>
44 
45 #define PI 3.14159265359
46 
47 namespace LifeV
48 {
49 
50 Real f (const Real& /*t*/, const Real& /*x*/, const Real& /*y*/, const Real& /*z*/, const ID& i)
51 {
52  switch (i)
53  {
54  case 0:
55  return 0.0;
56  break;
57  case 1:
58  return 0.0;
59  break;
60  case 2:
61  return 0.0;
62  break;
63  default:
64  ERROR_MSG ("This entrie is not allowed: ud_functions.hpp");
65  return 0.;
66  break;
67  }
68 }
69 
70 
71 Real fzero_scalar (const Real& /*t*/, const Real& /*x*/, const Real& /*y*/, const Real& /*z*/, const ID& /*i*/)
72 {
73  return 0.0;
74 }
75 
76 Real InternalPressure (const Real& /*t*/, const Real& /*x*/, const Real& /*y*/, const Real& /*z*/, const ID& /*i*/)
77 {
78  return -1e+5;
79  //return -260000*sin(80*3.141592*t);
80 }
81 
82 // Initial displacement and velocity
83 Real d0 (const Real& /*t*/, const Real& x, const Real& y, const Real& z, const ID& i)
84 {
85 
86  switch (i)
87  {
88  case 0:
89  return 0.088002 * ( x + 0.5 );
90  break;
91  case 1:
92  return - ( 0.02068 * 2.0 ) * ( y );
93  break;
94  case 2:
95  return - ( 0.02068 * 2.0 ) * ( z );
96  break;
97  default:
98  ERROR_MSG ("This entry is not allowed: ud_functions.hpp");
99  return 0.;
100  break;
101  }
102 
103 }
104 
105 Real w0 (const Real& /*t*/, const Real& /*x*/, const Real& /*y*/, const Real& /*z*/, const ID& i)
106 {
107 
108  switch (i)
109  {
110  case 0:
111  return 0.0;
112  break;
113  case 1:
114  return 0.0;
115  break;
116  case 2:
117  return 0.0;
118  break;
119  default:
120  ERROR_MSG ("This entrie is not allowed: ud_functions.hpp");
121  return 0.;
122  break;
123  }
124 }
125 
126 Real a0 (const Real& /*t*/, const Real& /*x*/, const Real& /*y*/, const Real& /*z*/, const ID& i)
127 {
128 
129  switch (i)
130  {
131  case 0:
132  return 0.0;
133  break;
134  case 1:
135  return 0.0;
136  break;
137  case 2:
138  return 0.0;
139  break;
140  default:
141  ERROR_MSG ("This entrie is not allowed: ud_functions.hpp");
142  return 0.;
143  break;
144  }
145 }
146 
147 
148 //----------------------------------------------Boundary Conditions--------------
149 Real bcZero (const Real& /*t*/, const Real& /*X*/, const Real& /*Y*/, const Real& /*Z*/, const ID& /*i*/)
150 {
151  return 0.;
152 }
153 
154 Real bcNonZero (const Real& t, const Real& X, const Real& Y, const Real& Z, const ID& i)
155 {
156 
157  return 19995;
158 
159  // Real highestPressure(6.666e+6);
160  // Real totalTime = 20.0;
161  // Real halfTime = totalTime / 2.0;
162 
163  // Real a = ( highestPressure / 2 ) * ( 1/ ((totalTime/2)*(totalTime/2)) );
164 
165  // if ( t <= halfTime )
166  // pressure = a * t*t;
167 
168  // if ( t > halfTime )
169  // pressure = - a * (t - totalTime)*(t - totalTime) + highestPressure;
170 
171  // switch (i)
172  // {
173  // case 0:
174  // return 0.0;
175  // break;
176  // case 1:
177  // return pressure;
178  // break;
179  // case 2:
180  // return 0.0;
181  // break;
182  // default:
183  // ERROR_MSG ("This entrie is not allowed: ud_functions.hpp");
184  // return 0.;
185  // break;
186  // }
187 }
188  Real smoothPressure(const Real& t, const Real& x, const Real& y, const Real& /*Z*/, const ID& i)
189  {
190  Real radius = std::sqrt( x*x + y*y);
191  Real pressure(0);
192 
193  Real highestPressure(200000);
194  Real totalTime = 4.5;
195  Real halfTime = totalTime / 2.0;
196 
197  // Real a = ( highestPressure / 2 ) * ( 1/ ( halfTime*halfTime ) );
198 
199  // if ( t <= halfTime )
200  // pressure = a * t*t;
201 
202  // if ( t > halfTime )
203  // pressure = - a * (t - totalTime)*(t - totalTime) + highestPressure;
204 
205  pressure = 5000 * t;
206 
207  switch (i)
208  {
209  case 0:
210  return pressure * ( x / radius ) ;
211  break;
212  case 1:
213  return pressure * ( y / radius ) ;
214  break;
215  case 2:
216  return 0.0;
217  break;
218 
219  }
220  return 0;
221 
222  }
223 
224 Real bcNonZeroSecondOrderExponential (const Real& /*t*/, const Real& /*X*/, const Real& /*Y*/, const Real& /*Z*/, const ID& /*i*/)
225 {
226  return 19180.;
227 }
228 
229 Real thetaFunction ( const Real& /*t*/, const Real& x, const Real& y, const Real& z, const ID& i)
230 {
231 
232  // Half thorus
233  Real thetaFiber ( 0.0 );
234  Real xT (0.138);
235  Real rT ( xT );
236  Real thetaFree(0);
237  Real thetaRotation(0);
238  Real thetaPosition(0);
239  thetaFree = std::atan( z / ( x - xT ) );
240  thetaPosition = thetaFree;
241  if ( x < xT )
242  {
243  thetaPosition = thetaFree + PI;
244  thetaRotation = PI/2.0 - std::fabs( thetaFree );
245  }
246  else
247  {
248  thetaRotation = thetaFree - PI/2.0;
249  }
250 
251  return thetaPosition;
252 }
253 
254 Real thetaRotationFunction ( const Real& /*t*/, const Real& x, const Real& y, const Real& z, const ID& i)
255 {
256  // Half thorus
257  Real thetaFiber ( 0.0 );
258  Real xT (0.138);
259  Real rT ( xT );
260  Real thetaFree(0);
261  Real thetaRotation(0);
262  Real thetaPosition(0);
263  thetaFree = std::atan( z / ( x - xT ) );
264  thetaPosition = thetaFree;
265  if ( x < xT )
266  {
267  thetaPosition = thetaFree + PI;
268  thetaRotation = PI/2.0 - std::fabs( thetaFree );
269  }
270  else
271  {
272  thetaRotation = thetaFree - PI/2.0;
273  }
274 
275  return thetaRotation;
276 }
277 
278 
279 //----------------------------------------------Fibers Directions--------------
280 Real Family1 ( const Real& /*t*/, const Real& x, const Real& y, const Real& z, const ID& i)
281 {
282 
283  // Tube
284  // Real theta = 0.8426; // value for anisotropic characterization taken from Robertson // ( PI / 6.0 );
285  // Real thetaChangeOfVariable = std::atan( y / x );
286 
287  // if( x < 0 )
288  // {
289  // // This is due to the periodicity of std::atan ( ref. official documentation )
290  // thetaChangeOfVariable += PI;
291  // }
292 
293  // Half thorus
294  Real thetaFiber ( 0.9865 );
295  Real xT (0.138);
296  Real rT ( xT );
297  Real thetaFree(0);
298  Real thetaRotation(0);
299  Real thetaPosition(0);
300  thetaFree = std::atan( z / ( x - xT ) );
301  thetaPosition = thetaFree;
302  if ( x < xT )
303  {
304  thetaPosition = thetaFree + PI;
305  thetaRotation = PI/2.0 - std::fabs( thetaFree );
306  }
307  else
308  {
309  thetaRotation = thetaFree - PI/2.0;
310  }
311 
312  Real xCenter;
313  Real zCenter;
314  xCenter = rT * std::cos( thetaPosition ) + xT;
315  zCenter = rT * std::sin( thetaPosition );
316 
317  VectorSmall<3> positionCenter;
318  positionCenter[0] = xCenter;
319  positionCenter[1] = 0;
320  positionCenter[2] = zCenter;
321 
322  VectorSmall<3> position;
323  position[0] = x;
324  position[1] = y;
325  position[2] = z;
326 
327  MatrixSmall<3,3> changeOfVariable;
328  changeOfVariable(0,0) = std::cos( thetaRotation ); changeOfVariable(0,1) = 0.0; changeOfVariable(0,2) = std::sin( thetaRotation );
329  changeOfVariable(1,0) = 0.0; changeOfVariable(1,1) = 1.0; changeOfVariable(1,2) = 0.0;
330  changeOfVariable(2,0) = -std::sin( thetaRotation ); changeOfVariable(2,1) = 0.0; changeOfVariable(2,2) = std::cos( thetaRotation );
331 
332  VectorSmall<3> localPosition;
333  localPosition = changeOfVariable * ( position - positionCenter );
334 
335  Real thetaPositionOnSection(0);
336  thetaPositionOnSection = std::atan( localPosition[2] / localPosition[1] );
337 
338  if ( localPosition[1] < 0 )
339  thetaPositionOnSection += PI;
340 
341  VectorSmall<3> localFibers;
342  localFibers[0] = std::sin( thetaFiber );
343  localFibers[1] = std::cos( thetaFiber ) * std::sin( thetaPositionOnSection );
344  localFibers[2] = - std::cos( thetaFiber ) * std::cos( thetaPositionOnSection );
345 
346  VectorSmall<3> originFibers;
347  originFibers = changeOfVariable.transpose() * localFibers + positionCenter;
348 
349  originFibers.normalize();
350 
351  switch (i)
352  {
353  case 0:
354  // Tube
355  // return - std::sin( thetaChangeOfVariable ) * std::cos( theta );
356 
357  // half thorus
358  return originFibers[0];
359 
360  // Cube
361  //return std::sin( theta );
362  break;
363  case 1:
364  // Tube
365  // return std::cos( thetaChangeOfVariable ) * std::cos( theta );
366 
367  // half thorus
368  return originFibers[1];
369 
370  // Cube
371  //return std::cos( theta );
372  break;
373  case 2:
374  // Tube
375  //return std::sin( theta );
376 
377  // half thorus
378  return originFibers[2];
379 
380  // Cube
381  //return 0.0;
382  break;
383  default:
384  ERROR_MSG ("This entrie is not allowed: ud_functions.hpp");
385  return 0.;
386  break;
387  }
388 
389 }
390 
391 Real positionCenter ( const Real& /*t*/, const Real& x, const Real& y, const Real& z, const ID& i)
392 {
393  // Half thorus
394  Real thetaFiber ( 0.0 );
395  Real xT (0.138);
396  Real rT ( xT );
397  Real thetaFree(0);
398  Real thetaRotation(0);
399  Real thetaPosition(0);
400  thetaFree = std::atan( z / ( x - xT ) );
401  thetaPosition = thetaFree;
402  if ( x < xT )
403  {
404  thetaPosition = thetaFree + PI;
405  thetaRotation = PI/2.0 - std::fabs( thetaFree );
406  }
407  else
408  {
409  thetaRotation = thetaFree - PI/2.0;
410  }
411 
412  Real xCenter;
413  Real zCenter;
414  xCenter = rT * std::cos( thetaPosition ) + xT;
415  zCenter = rT * std::sin( thetaPosition );
416 
417  switch (i)
418  {
419  case 0:
420  // Tube
421  return xCenter;
422  // Cube
423  //return std::sin( theta );
424  break;
425  case 1:
426  // Tube
427  return 0.0;
428  // Cube
429  //return std::cos( theta );
430  break;
431  case 2:
432  // Tube
433  return zCenter;
434  // Cube
435  //return 0.0;
436  break;
437  default:
438  ERROR_MSG ("This entrie is not allowed: ud_functions.hpp");
439  return 0.;
440  break;
441  }
442 
443 
444 }
445 
446 Real localPosition ( const Real& /*t*/, const Real& x, const Real& y, const Real& z, const ID& i)
447 {
448  // Half thorus
449  Real thetaFiber ( 0.0 );
450  Real xT (0.138);
451  Real rT ( xT );
452  Real thetaFree(0);
453  Real thetaRotation(0);
454  Real thetaPosition(0);
455  thetaFree = std::atan( z / ( x - xT ) );
456  thetaPosition = thetaFree;
457  if ( x < xT )
458  {
459  thetaPosition = thetaFree + PI;
460  thetaRotation = PI/2.0 - std::fabs( thetaFree );
461  }
462  else
463  {
464  thetaRotation = thetaFree - PI/2.0;
465  }
466 
467  Real xCenter;
468  Real zCenter;
469  xCenter = rT * std::cos( thetaPosition ) + xT;
470  zCenter = rT * std::sin( thetaPosition );
471 
472  VectorSmall<3> positionCenter;
473  positionCenter[0] = xCenter;
474  positionCenter[1] = 0;
475  positionCenter[2] = zCenter;
476 
477  VectorSmall<3> position;
478  position[0] = x;
479  position[1] = y;
480  position[2] = z;
481 
482  MatrixSmall<3,3> changeOfVariable;
483  changeOfVariable(0,0) = std::cos( thetaRotation ); changeOfVariable(0,1) = 0.0; changeOfVariable(0,2) = std::sin( thetaRotation );
484  changeOfVariable(1,0) = 0.0; changeOfVariable(1,1) = 1.0; changeOfVariable(1,2) = 0.0;
485  changeOfVariable(2,0) = -std::sin( thetaRotation ); changeOfVariable(2,1) = 0.0; changeOfVariable(2,2) = std::cos( thetaRotation );
486 
487  VectorSmall<3> localPosition;
488  localPosition = changeOfVariable * ( position - positionCenter );
489 
490  switch (i)
491  {
492  case 0:
493  // Tube
494  return localPosition[0];
495  // Cube
496  //return std::sin( theta );
497  break;
498  case 1:
499  // Tube
500  return localPosition[1];
501  // Cube
502  //return std::cos( theta );
503  break;
504  case 2:
505  // Tube
506  return localPosition[2];
507  // Cube
508  //return 0.0;
509  break;
510  default:
511  ERROR_MSG ("This entrie is not allowed: ud_functions.hpp");
512  return 0.;
513  break;
514  }
515 
516 
517 }
518 
519 Real Family2 ( const Real& /*t*/, const Real& x, const Real& y, const Real& z, const ID& i)
520 {
521  // Tube
522  // Real theta = 0.8426; // value for anisotropic characterization taken from Robertson // ( PI / 6.0 );
523  // Real thetaChangeOfVariable = std::atan( y / x );
524 
525  // if( x < 0 )
526  // {
527  // // This is due to the periodicity of std::atan ( ref. official documentation )
528  // thetaChangeOfVariable += PI;
529  // }
530 
531  // Half thorus
532  Real thetaFiber ( - 0.9865 );
533  Real xT (0.138);
534  Real rT ( xT );
535  Real thetaFree(0);
536  Real thetaRotation(0);
537  Real thetaPosition(0);
538  thetaFree = std::atan( z / ( x - xT ) );
539  thetaPosition = thetaFree;
540  if ( x < xT )
541  {
542  thetaPosition = thetaFree + PI;
543  thetaRotation = PI/2.0 - std::fabs( thetaFree );
544  }
545  else
546  {
547  thetaRotation = thetaFree - PI/2.0;
548  }
549 
550  Real xCenter;
551  Real zCenter;
552  xCenter = rT * std::cos( thetaPosition ) + xT;
553  zCenter = rT * std::sin( thetaPosition );
554 
555  VectorSmall<3> positionCenter;
556  positionCenter[0] = xCenter;
557  positionCenter[1] = 0;
558  positionCenter[2] = zCenter;
559 
560  VectorSmall<3> position;
561  position[0] = x;
562  position[1] = y;
563  position[2] = z;
564 
565  MatrixSmall<3,3> changeOfVariable;
566  changeOfVariable(0,0) = std::cos( thetaRotation ); changeOfVariable(0,1) = 0.0; changeOfVariable(0,2) = std::sin( thetaRotation );
567  changeOfVariable(1,0) = 0.0; changeOfVariable(1,1) = 1.0; changeOfVariable(1,2) = 0.0;
568  changeOfVariable(2,0) = -std::sin( thetaRotation ); changeOfVariable(2,1) = 0.0; changeOfVariable(2,2) = std::cos( thetaRotation );
569 
570  VectorSmall<3> localPosition;
571  localPosition = changeOfVariable * ( position - positionCenter );
572 
573  Real thetaPositionOnSection(0);
574  thetaPositionOnSection = std::atan( localPosition[2] / localPosition[1] );
575 
576  if ( localPosition[1] < 0 )
577  thetaPositionOnSection += PI;
578 
579  VectorSmall<3> localFibers;
580  localFibers[0] = std::sin( thetaFiber );
581  localFibers[1] = std::cos( thetaFiber ) * std::sin( thetaPositionOnSection );
582  localFibers[2] = - std::cos( thetaFiber ) * std::cos( thetaPositionOnSection );
583 
584  VectorSmall<3> originFibers;
585  originFibers = changeOfVariable.transpose() * localFibers + positionCenter;
586 
587  originFibers.normalize();
588 
589  switch (i)
590  {
591  case 0:
592  // Tube
593  // return - std::sin( thetaChangeOfVariable ) * std::cos( theta );
594 
595  // half thorus
596  return originFibers[0];
597 
598  // Cube
599  //return std::sin( theta );
600  break;
601  case 1:
602  // Tube
603  // return std::cos( thetaChangeOfVariable ) * std::cos( theta );
604 
605  // half thorus
606  return originFibers[1];
607 
608  // Cube
609  //return std::cos( theta );
610  break;
611  case 2:
612  // Tube
613  //return std::sin( theta );
614 
615  // half thorus
616  return originFibers[2];
617 
618  // Cube
619  //return 0.0;
620  break;
621  default:
622  ERROR_MSG ("This entrie is not allowed: ud_functions.hpp");
623  return 0.;
624  break;
625  }
626 }
627 
628 Real Family3 ( const Real& /*t*/, const Real& x, const Real& y, const Real& z, const ID& i)
629 {
630 
631  Real theta = - 0.8426;
632  Real thetaChangeOfVariable = std::atan( y / x );
633 
634  if( x < 0 )
635  {
636  // This is due to the periodicity of std::atan ( ref. official documentation )
637  thetaChangeOfVariable += PI;
638  }
639 
640  switch (i)
641  {
642  case 0:
643  // Tube
644  return - std::sin( thetaChangeOfVariable ) * std::cos( theta );
645  // Cube
646  //return std::sin( theta );
647  break;
648  case 1:
649  // Tube
650  return std::cos( thetaChangeOfVariable ) * std::cos( theta );
651  // Cube
652  //return std::cos( theta );
653  break;
654  case 2:
655  // Tube
656  return std::sin( theta );
657  // Cube
658  //return 0.0;
659  break;
660  default:
661  ERROR_MSG ("This entrie is not allowed: ud_functions.hpp");
662  return 0.;
663  break;
664  }
665 }
666 
667 
668 Real Family4 ( const Real& /*t*/, const Real& x, const Real& y, const Real& z, const ID& i)
669 {
670 
671  switch (i)
672  {
673  case 0:
674  return 0.0;
675  break;
676  case 1:
677  return 0.0;
678  break;
679  case 2:
680  return 0.0;
681  break;
682  default:
683  ERROR_MSG ("This entrie is not allowed: ud_functions.hpp");
684  return 0.;
685  break;
686  }
687 }
688 
689 
690 Real Family5 ( const Real& /*t*/, const Real& x, const Real& y, const Real& z, const ID& i)
691 {
692 
693  switch (i)
694  {
695  case 0:
696  return 0.0;
697  break;
698  case 1:
699  return 0.0;
700  break;
701  case 2:
702  return 0.0;
703  break;
704  default:
705  ERROR_MSG ("This entrie is not allowed: ud_functions.hpp");
706  return 0.;
707  break;
708  }
709 }
710 
711 Real Family6 ( const Real& /*t*/, const Real& x, const Real& y, const Real& z, const ID& i)
712 {
713 
714  switch (i)
715  {
716  case 0:
717  return 0.0;
718  break;
719  case 1:
720  return 0.0;
721  break;
722  case 2:
723  return 0.0;
724  break;
725  default:
726  ERROR_MSG ("This entrie is not allowed: ud_functions.hpp");
727  return 0.;
728  break;
729  }
730 }
731 
732 // Method for the definition of the fibers
733 fibersDirectionList::fibersDirectionList() :
734  M_mapNameDefinition( )
735 {}
736 
737 fibersDirectionList::~fibersDirectionList()
738 {}
739 
740 void fibersDirectionList::setupFiberDefinitions( const UInt nbFamilies )
741 {
742  // At the moment the creation of the table of fiber functions is done
743  // manually. There should be a way to make it automatically. Btw, only
744  // the first nbFamilies that are set in the data file are taken into account
745 
746  ASSERT( nbFamilies < 6, "At the moment, a maximum number = 6 of families can be used! If you want more \n modifiy the file ud_functions.hpp in the application folder." );
747 
748  // Creation of the database of functions
749  fiberFunctionPtr_Type pointerToFunction( new fiberFunction_Type( Family1 ) );
750  M_mapNameDefinition.insert( std::pair<std::string, fiberFunctionPtr_Type>
751  ( "Family1", pointerToFunction ) );
752 
753  pointerToFunction.reset( new fiberFunction_Type( Family2 ) );
754  M_mapNameDefinition.insert( std::pair<std::string, fiberFunctionPtr_Type>
755  ( "Family2", pointerToFunction ) );
756 
757  pointerToFunction.reset( new fiberFunction_Type( Family3 ) );
758  M_mapNameDefinition.insert( std::pair<std::string, fiberFunctionPtr_Type>
759  ( "Family3", pointerToFunction ) );
760 
761  pointerToFunction.reset( new fiberFunction_Type( Family4 ) );
762  M_mapNameDefinition.insert( std::pair<std::string, fiberFunctionPtr_Type>
763  ( "Family4", pointerToFunction ) );
764 
765  pointerToFunction.reset( new fiberFunction_Type( Family5 ) );
766  M_mapNameDefinition.insert( std::pair<std::string, fiberFunctionPtr_Type>
767  ( "Family5", pointerToFunction ) );
768 
769  pointerToFunction.reset( new fiberFunction_Type( Family6 ) );
770  M_mapNameDefinition.insert( std::pair<std::string, fiberFunctionPtr_Type>
771  ( "Family6", pointerToFunction ) );
772 
773 
774 }
775 
776 fibersDirectionList::fiberFunctionPtr_Type fibersDirectionList::fiberDefinition( const std::string nameFamily )
777 {
778 
779  mapNameDefinitionFiberFunction_Type::const_iterator IT;
780 
781  IT = M_mapNameDefinition.find ( nameFamily );
782 
783  if ( IT != M_mapNameDefinition.end() )
784  {
785  return IT->second;
786  }
787  else
788  {
789  std::cout << " Wrong identification of the fiber function! " << std::endl;
790  fiberFunctionPtr_Type pointerToFunction( new fiberFunction_Type() );
791 
792  return pointerToFunction;
793  }
794 }
795 
796 }
Real d0(const Real &t, const Real &x, const Real &y, const Real &z, const ID &i)
#define PI
void updateInverseJacobian(const UInt &iQuadPt)
void normalize()
Normalize vector.
Real w0(const Real &t, const Real &x, const Real &y, const Real &z, const ID &i)
#define ERROR_MSG(A)
Definition: LifeAssert.hpp:69
Real & operator[](UInt const &i)
Operator [].
#define ASSERT(X, A)
Definition: LifeAssert.hpp:90
uint32_type ID
IDs.
Definition: LifeV.hpp:194
Real f(const Real &t, const Real &x, const Real &y, const Real &z, const ID &i)
double Real
Generic real data.
Definition: LifeV.hpp:175
uint32_type UInt
generic unsigned integer (used mainly for addressing)
Definition: LifeV.hpp:191