1 // GetDP - Copyright (C) 1997-2021 P. Dular and C. Geuzaine, University of Liege
2 //
3 // See the LICENSE.txt file for license information. Please report all
4 // issues on https://gitlab.onelab.info/getdp/getdp/issues.
5 
6 #ifndef PRO_DEFINES_H
7 #define PRO_DEFINES_H
8 
9 #include "GetDPConfig.h"
10 #include "ProDefine.h"
11 
12 #if defined(HAVE_KERNEL)
13 #include "Gauss.h"
14 #endif
15 
16 #include "F.h"
17 #include "BF.h"
18 #include "GF.h"
19 #include "Cal_Value.h"
20 extern struct CurrentData Current;
21 
22 struct StringXDefine  Mesh_Format[] = {
23   {"gmsh"  , FORMAT_GMSH}, {"Gmsh"  , FORMAT_GMSH},
24   {NULL    , FORMAT_GMSH}
25 } ;
26 
27 struct StringXDefine  Field_Type[] = {
28   {"Form0"  , FORM0 }, {"Form1"  , FORM1 }, {"Form2"   , FORM2  }, {"Form3"  , FORM3 },
29   {"Form0P" , FORM0P}, {"Form1P" , FORM1P}, {"Form2P"  , FORM2P }, {"Form3P" , FORM3P},
30   {"Form0S" , FORM0S}, {"Form1S" , FORM1S}, {"Form2S"  , FORM2S }, {"Form3S" , FORM3S},
31   {"Scalar" , SCALAR}, {"Vector" , VECTOR}, {"VectorP" , VECTORP},
32   {"Tensor" , TENSOR}, {"TensorSym" , TENSOR_SYM}, {"TensorDiag" , TENSOR_DIAG},
33   {NULL     , FORM0}
34 } ;
35 
36 struct StringXDefine  FunctionForGroup_Type[] = {
37   {"Region"                   , REGION},
38   {"Global"                   , GLOBAL},
39   {"NodesOf"                  , NODESOF},
40   {"EdgesOf"                  , EDGESOF},
41   {"FacetsOf"                 , FACETSOF},
42   {"VolumesOf"                , VOLUMESOF},
43   {"ElementsOf"               , ELEMENTSOF},
44   {"GroupsOfNodesOf"          , GROUPSOFNODESOF},
45   {"GroupsOfEdgesOnNodesOf"   , GROUPSOFEDGESONNODESOF},
46   {"GroupsOfEdgesOf"          , GROUPSOFEDGESOF},
47   {"GroupsOfFacetsOf"         , GROUPSOFFACETSOF},
48   {"GroupOfRegionsOf"         , GROUPOFREGIONSOF},
49   {"EdgesOfTreeIn"            , EDGESOFTREEIN},
50   {"FacetsOfTreeIn"           , FACETSOFTREEIN},
51   {"DualNodesOf"              , DUALNODESOF},
52   {"DualEdgesOf"              , DUALEDGESOF},
53   {"DualFacetsOf"             , DUALFACETSOF},
54   {"DualVolumesOf"            , DUALVOLUMESOF},
55   {"BoundaryOfDualNodesOf"    , BOUNDARYOFDUALNODESOF},
56   {"BoundaryOfDualEdgesOf"    , BOUNDARYOFDUALEDGESOF},
57   {"BoundaryOfDualFacetsOf"   , BOUNDARYOFDUALFACETSOF},
58   {"MovingBand2D"             , MOVINGBAND2D},
59   {NULL                       , 0}
60 } ;
61 
62 struct StringXDefine  FunctionForGroup_SuppList[] = {
63   {"Not"             , SUPPLIST_NOT},
64   {"StartingOn"      , SUPPLIST_STARTINGON},
65   {"OnOneSideOf"     , SUPPLIST_ONONESIDEOF},
66   {"OnPositiveSideOf", SUPPLIST_ONPOSITIVESIDEOF},
67   {"OnNegativeSideOf", SUPPLIST_ONNEGATIVESIDEOF},
68   {"InSupport"       , SUPPLIST_INSUPPORT},
69   {"ConnectedTo"     , SUPPLIST_CONNECTEDTO},
70   {"DisjointOf"      , SUPPLIST_DISJOINTOF},
71   {NULL              , 0}
72 } ;
73 
74 struct StringXDefine1Nbr  Jacobian_Type[] = {
75   {"Vol"               , JACOBIAN_VOL                   , 0} ,
76   {"VolSphShell"       , JACOBIAN_VOL_SPH_SHELL         , -1} ,
77   {"VolCylShell"       , JACOBIAN_VOL_CYL_SHELL         , -1} ,
78   {"VolRectShell"      , JACOBIAN_VOL_RECT_SHELL        , -1} ,
79   {"VolUniDirShell"    , JACOBIAN_VOL_UNI_DIR_SHELL     , -1} ,
80   {"VolPlpdX"          , JACOBIAN_VOL_PLPD_X            , 2} ,
81 
82   {"VolAxi"            , JACOBIAN_VOL_AXI               , 0} ,
83   {"VolAxiSphShell"    , JACOBIAN_VOL_AXI_SPH_SHELL     , -1} ,
84   {"VolAxiRectShell"   , JACOBIAN_VOL_AXI_RECT_SHELL    , -1} ,
85   {"VolAxiPlpdX"       , JACOBIAN_VOL_AXI_PLPD_X        , 2} ,
86 
87   {"VolAxiSqu"         , JACOBIAN_VOL_AXI_SQU           , 0} ,
88   {"VolAxiSquSphShell" , JACOBIAN_VOL_AXI_SQU_SPH_SHELL , -1} ,
89   {"VolAxiSquRectShell", JACOBIAN_VOL_AXI_SQU_RECT_SHELL, -1} ,
90 
91   {"Sur"               , JACOBIAN_SUR                   , 0} ,
92   {"SurSphShell"       , JACOBIAN_SUR_SPH_SHELL         , -1} ,
93   {"SurRectShell"      , JACOBIAN_SUR_RECT_SHELL        , -1} ,
94 
95   {"SurAxi"            , JACOBIAN_SUR_AXI               , 0} ,
96 
97   {"Lin"               , JACOBIAN_LIN                   , 0} ,
98   {NULL                , JACOBIAN_VOL                   , 0}
99 } ;
100 
101 struct StringXDefine  Integration_Type[] = {
102   {"Gauss"                 , GAUSS},
103   {"GaussLegendre"         , GAUSSLEGENDRE},
104   {"Analytic"              , ANALYTIC},
105   {NULL                    , GAUSS}
106 } ;
107 
108 struct StringXDefine  Integration_SubType[] = {
109   {"Standard"              , STANDARD},
110   {"Singular"              , SINGULAR},
111   {"Adaptative"            , ADAPTATIVE},
112   {NULL                    , STANDARD}
113 } ;
114 
115 struct StringXDefine  Element_Type[] = {
116   {"Point"          , POINT_ELEMENT},
117   {"Line"           , LINE},
118   {"Line2"          , LINE_2},
119   {"Line3"          , LINE_3},
120   {"Line4"          , LINE_4},
121   {"Triangle"       , TRIANGLE},
122   {"Triangle2"      , TRIANGLE_2},
123   {"Triangle3"      , TRIANGLE_3},
124   {"Triangle4"      , TRIANGLE_4},
125   {"Quadrangle"     , QUADRANGLE},
126   {"Quadrangle2"    , QUADRANGLE_2},
127   {"Quadrangle2_8N" , QUADRANGLE_2_8N},
128   {"Quadrangle3"    , QUADRANGLE_3},
129   {"Quadrangle4"    , QUADRANGLE_4},
130   {"Tetrahedron"    , TETRAHEDRON},
131   {"Tetrahedron2"   , TETRAHEDRON_2},
132   {"Tetrahedron3"   , TETRAHEDRON_3},
133   {"Tetrahedron4"   , TETRAHEDRON_4},
134   {"Hexahedron"     , HEXAHEDRON},
135   {"Hexahedron2"    , HEXAHEDRON_2},
136   {"Hexahedron2_20N", HEXAHEDRON_2_20N},
137   {"Hexahedron3"    , HEXAHEDRON_3},
138   {"Hexahedron4"    , HEXAHEDRON_4},
139   {"Prism"          , PRISM},
140   {"Prism2"         , PRISM_2},
141   {"Prism2_15N"     , PRISM_2_15N},
142   {"Prism3"         , PRISM_3},
143   {"Prism4"         , PRISM_4},
144   {"Pyramid"        , PYRAMID},
145   {"Pyramid2"       , PYRAMID_2},
146   {"Pyramid2_13N"   , PYRAMID_2_13N},
147   {"Pyramid3"       , PYRAMID_3},
148   //{"Pyramid4"       , PYRAMID_4},
149   {NULL             , TRIANGLE}
150  } ;
151 
152 struct StringXDefine  GlobalQuantity_Type[] = {
153   {"AliasOf"             , ALIASOF},
154   {"AssociatedWith"      , ASSOCIATEDWITH},
155   {NULL                  , ALIASOF}
156  } ;
157 
158 struct StringXDefine  Constraint_Type[] = {
159   {"Assign"               , ASSIGN},
160   {"Init"                 , INIT},
161   {"AssignFromResolution" , ASSIGNFROMRESOLUTION},
162   {"InitFromResolution"   , INITFROMRESOLUTION},
163   {"Network"              , NETWORK},
164   {"Link"                 , CST_LINK},
165   {"LinkCplx"             , CST_LINKCPLX},
166   {NULL                   , ASSIGN}
167  } ;
168 
169 struct StringXDefine  Formulation_Type[] = {
170   {"FemEquation"    , FEMEQUATION},
171   {"BemEquation"    , BEMEQUATION},
172   {"GlobalEquation" , GLOBALEQUATION},
173   {NULL             , FEMEQUATION}
174  } ;
175 
176 struct StringXDefine  Equation_SubType[] = {
177   {"Self"          , EQ_ST_SELF},
178   {"Mutual"        , EQ_ST_MUTUAL},
179   {"SelfAndMutual" , EQ_ST_SELFANDMUTUAL},
180   {"MutualAndSelf" , EQ_ST_SELFANDMUTUAL},
181   {NULL            , EQ_ST_SELF}
182  } ;
183 
184 struct StringXDefine  DefineQuantity_Type[] = {
185   /* a supprimer */
186   {"LocalQuantity"    , LOCALQUANTITY},
187   {"GlobalQuantity"   , GLOBALQUANTITY},
188   {"IntegralQuantity" , INTEGRALQUANTITY},
189 
190   {"Local"            , LOCALQUANTITY},
191   {"Global"           , GLOBALQUANTITY},
192   {"Integral"         , INTEGRALQUANTITY},
193   {NULL               , LOCALQUANTITY}
194  } ;
195 
196 struct StringXDefine  Operator_Type[] = {
197   {"NoOp"    , NOOP   } ,
198   {"d"       , EXTDER } , {"dInv"    , EXTDERINV} ,
199   {"Grad"    , GRAD   } , {"GradInv" , GRADINV  } ,
200   {"Curl"    , CURL   } , {"CurlInv" , CURLINV  } ,
201   {"Rot"     , CURL   } , {"RotInv"  , CURLINV  } ,
202   {"Div"     , DIV    } , {"DivInv"  , DIVINV   } ,
203 
204   // unused
205   {"NSx"     , NSx      } ,
206   {"NSxd"    , NSxEXTDER} ,
207   {"NSxGrad" , NSxGRAD  } ,
208   {"NPxGrad" , NPxGRAD  } ,
209 
210   {"D1"      , OP_D1 } ,
211   {"D2"      , OP_D2 } ,
212   {"D3"      , OP_D3 } ,
213 
214   {NULL      , NOOP }
215 } ;
216 
217 struct StringXDefine  QuantityFromFS_Type[] = {
218   {"Dof"   , QUANTITY_DOF } ,
219   {"BF"    , QUANTITY_BF } ,
220   {"NoDof" , QUANTITY_NODOF } ,
221   {NULL    , QUANTITY_SIMPLE }
222 } ;
223 
224 struct StringXDefine  DefineSystem_Type[] = {
225   {"RealValue"    , VAL_REAL},
226   {"Real"         , VAL_REAL},
227   {"ComplexValue" , VAL_COMPLEX},
228   {"Complex"      , VAL_COMPLEX},
229   {NULL           , VAL_REAL}
230 } ;
231 
232 struct StringXDefine  Operation_Type[] = {
233   {"Apply"                  , OPERATION_APPLY},
234   {"RemoveLastSolution"     , OPERATION_REMOVELASTSOLUTION},
235   {"DofsFrequencySpectrum"  , OPERATION_DOFSFREQUENCYSPECTRUM},
236   {"Generate"               , OPERATION_GENERATE},
237   {"GenerateCumulative"     , OPERATION_GENERATE_CUMULATIVE},
238   {"GenerateJac"            , OPERATION_GENERATEJAC},
239   {"GenerateJacCumulative"  , OPERATION_GENERATEJAC_CUMULATIVE},
240   {"GenerateOnly"           , OPERATION_GENERATEONLY},
241   {"GenerateOnlyJac"        , OPERATION_GENERATEONLYJAC},
242   {"GenerateRHS"            , OPERATION_GENERATERHS},
243   {"GenerateRightHandSide"  , OPERATION_GENERATERHS},
244   {"GenerateRHSCumulative"  , OPERATION_GENERATERHS_CUMULATIVE},
245   {"GenerateRightHandSideCumulative"  , OPERATION_GENERATERHS_CUMULATIVE},
246   {"GenerateSeparate"       , OPERATION_GENERATESEPARATE},
247   {"InitCorrection"         , OPERATION_INITCORRECTION},
248   {"InitSolution"           , OPERATION_INITSOLUTION},
249   {"InitSolution1"          , OPERATION_INITSOLUTION1},
250   {"ReadSolution"           , OPERATION_READSOLUTION},
251   {"SaveSolution"           , OPERATION_SAVESOLUTION},
252   {"SaveSolutionExtendedMH" , OPERATION_SAVESOLUTIONEXTENDEDMH},
253   {"SaveSolutions"          , OPERATION_SAVESOLUTIONS},
254   {"SetCurrentSystem"       , OPERATION_SETCURRENTSYSTEM},
255   {"SetRHSAsSolution"       , OPERATION_SETRHSASSOLUTION},
256   {"SetRightHandSideAsSolution" , OPERATION_SETRHSASSOLUTION},
257   {"SetSolutionAsRHS"       , OPERATION_SETSOLUTIONASRHS},
258   {"SetSolutionAsRightHandSide", OPERATION_SETSOLUTIONASRHS},
259   {"SetIncrementAsSolution" , OPERATION_SETINCREMENTASSOLUTION},
260   {"SwapSolutionAndRHS"     , OPERATION_SWAPSOLUTIONANDRHS},
261   {"SwapSolutionAndRightHandSide" , OPERATION_SWAPSOLUTIONANDRHS},
262   {"SwapSolutionAndResidual", OPERATION_SWAPSOLUTIONANDRESIDUAL},
263   {"Solve"                  , OPERATION_SOLVE},
264   {"SolveAgain"             , OPERATION_SOLVEAGAIN},
265   {"SolveJac"               , OPERATION_SOLVEJAC},
266   {"SolveJacAgain"          , OPERATION_SOLVEJACAGAIN},
267   {"SolveJac_AdaptRelax"    , OPERATION_SOLVEJACADAPTRELAX},
268   {"SolveNL"                , OPERATION_SOLVENL},
269   {"HPDDMSolve"             , OPERATION_HPDDMSOLVE},
270   {"TransferSolution"       , OPERATION_TRANSFERSOLUTION},
271   {"Update"                 , OPERATION_UPDATE},
272   {"Debug"                  , OPERATION_DEBUG},
273   {NULL                     , OPERATION_NONE}
274 } ;
275 
276 struct StringXDefine  ChangeOfState_Type[] = {
277   {"ChangeSign"        , CHANGEOFSTATE_CHANGESIGN},
278   {"ChangeLevel"       , CHANGEOFSTATE_CHANGELEVEL},
279   {"ChangeReference"   , CHANGEOFSTATE_CHANGEREFERENCE},
280   {"ChangeReference2"  , CHANGEOFSTATE_CHANGEREFERENCE2},
281   {NULL                , CHANGEOFSTATE_CHANGESIGN}
282 } ;
283 
284 struct StringXDefine  ErrorNorm_Type[] = {
285   {"LinfNorm"   , LINFNORM},
286   {"L1Norm"     , L1NORM},
287   {"MeanL1Norm" , MEANL1NORM},
288   {"L2Norm"     , L2NORM},
289   {"MeanL2Norm" , MEANL2NORM},
290   {NULL         , LINFNORM}
291 } ;
292 
293 struct StringXDefine  NormOf_Type[] = {
294   {"Solution"       , SOLUTION},
295   {"Residual"       , RESIDUAL},
296   {"RecalcResidual" , RECALCRESIDUAL},
297   {NULL             , SOLUTION}
298 } ;
299 
300 struct StringXPointer  Current_Value[] = {
301   {"Time"     , &Current.Time},       {"DTime"     , &Current.DTime},
302   {"Theta"    , &Current.Theta},      {"TimeStep"  , &Current.TimeStep},
303   {"Iter"      , &Current.Iteration},
304   {"Iteration", &Current.Iteration},  {"NLIteration", &Current.Iteration},
305   {"Residual" , &Current.Residual},   {"NLResidual" , &Current.Residual},
306   {"RelaxFac" , &Current.RelaxFac}, //+++
307   {"ResidualN" , &Current.ResidualN}, //+++
308   {"Residual_Iter1" , &Current.Residual_Iter1}, //+++
309   {"NbrTestedFac" , &Current.NbrTestedFac}, //+++
310   {"SolveJacAdaptFailed" , &Current.SolveJacAdaptFailed}, //+++
311   {"TimeImag" , &Current.TimeImag},   {"Eigenvalue", &Current.Time},
312   {"EigenvalueReal" , &Current.Time}, {"EigenvalueImag" , &Current.TimeImag},
313   {"ReOmega"  , &Current.Time},       {"ImOmega"   , &Current.TimeImag},
314   {"wr"       , &Current.Time},       {"wi"        , &Current.TimeImag},
315   {"Breakpoint", &Current.Breakpoint},
316 
317   {"X"  , &Current.x}, {"Y"  , &Current.y},  {"Z"  , &Current.z},
318   {"XS" , &Current.xs},{"YS" , &Current.ys}, {"ZS" , &Current.zs},
319   {"XP" , &Current.xp},{"YP" , &Current.yp}, {"ZP" , &Current.zp},
320 
321   {"U"  , &Current.x}, {"V"  , &Current.y},  {"W"  , &Current.z},
322   {"US" , &Current.xs},{"VS" , &Current.ys}, {"WS" , &Current.zs},
323 
324   {"A"  , &Current.a} ,{"B"  , &Current.b} , {"C"  , &Current.c},
325 
326   {"Val0" , &Current.Val[0]}, {"Val1" , &Current.Val[1]}, {"Val2" , &Current.Val[2]},
327   {"Val3" , &Current.Val[3]}, {"Val4" , &Current.Val[4]}, {"Val5" , &Current.Val[5]},
328   {"Val6" , &Current.Val[6]}, {"Val7" , &Current.Val[7]}, {"Val8" , &Current.Val[8]},
329 
330   {"QuadraturePointIndex",  &Current.QuadraturePointIndex},
331   {"QP",                    &Current.QuadraturePointIndex},
332 
333   {"KSPIterations", &Current.KSPIterations}, {"KSPIts", &Current.KSPIterations},
334   {"KSPIteration", &Current.KSPIteration},
335   {"KSPResidual", &Current.KSPResidual},
336   {"KSPSystemSize", &Current.KSPSystemSize},
337   {NULL       , NULL}
338 } ;
339 
340 struct StringXDefine  PostQuantityTerm_EvaluationType[] = {
341   {"Local"    , LOCAL},
342   {"Term"     , LOCAL},
343   {"Integral" , INTEGRAL},
344   {NULL       , LOCAL}
345 } ;
346 
347 struct StringXDefine  PostSubOperation_CombinationType[] = {
348   {"*"   , MULTIPLICATION},
349   {"/"   , DIVISION},
350   {"+"   , ADDITION},
351   {"-"   , SOUSTRACTION},
352   {NULL  , MULTIPLICATION}
353 } ;
354 
355 struct StringXDefine  PostSubOperation_Format[] = {
356   {"Table"               , FORMAT_SPACE_TABLE },
357   {"SimpleTable"         , FORMAT_SIMPLE_SPACE_TABLE },
358   {"NodeTable"           , FORMAT_NODE_TABLE },
359   {"ElementTable"        , FORMAT_ELEMENT_TABLE },
360   {"ValueOnly"           , FORMAT_VALUE_ONLY },
361   {"TimeTable"           , FORMAT_TIME_TABLE },
362   {"RegionTable"         , FORMAT_REGION_TABLE },
363   {"RegionValue"         , FORMAT_REGION_VALUE },
364   {"FrequencyRegionValue", FORMAT_FREQUENCY_REGION_VALUE },
365   {"HarmonicToTimeTable" , FORMAT_TIME_TABLE },   // a supprimer
366   {"FrequencyTable"      , FORMAT_FREQUENCY_TABLE },
367   {"GetDP"               , FORMAT_GETDP},
368   {"Gmsh"                , FORMAT_GMSH},
369   {"GmshParsed"          , FORMAT_GMSH_PARSED},
370   {"Unv"                 , FORMAT_NXUNV},
371   {"NX"                  , FORMAT_NXUNV},
372   {"Gnuplot"             , FORMAT_GNUPLOT },
373   {"Adaptation"          , FORMAT_ADAPT },
374   {NULL                  , FORMAT_GMSH }
375 } ;
376 
377 struct StringXDefine  PostSubOperation_FormatTag[] = {
378   {"Time"     , TAG_TIME},
379   {"TimeStep" , TAG_TIMESTEP},
380   {"Value"    , TAG_VALUE},
381   {"X"        , TAG_X},
382   {"Y"        , TAG_Y},
383   {"Z"        , TAG_Z},
384   {"Nodes"    , TAG_NODES},
385   {"Type"     , TAG_TYPE},
386   {"Version"  , TAG_VERSION},
387   {"Date"     , TAG_DATE},
388   {"Host"     , TAG_HOST},
389   {"Filename" , TAG_FILENAME},
390   {"User"     , TAG_USER},
391   {"Abscissa" , TAG_ABSCISSA},
392   {"Normal"   , TAG_NORMAL},
393   {"Command"  , TAG_COMMAND},
394   {NULL       , 0}
395 } ;
396 
397 struct StringXDefine  PostSubOperation_AdaptationType[] = {
398   {"P1"     , ADAPT_P1},
399   {"H1"     , ADAPT_H1},
400   {"H2"     , ADAPT_H2},
401   {NULL     , ADAPT_P1}
402 } ;
403 
404 struct StringXDefine  PostSubOperation_SortType[] = {
405   {"Position"     , SORT_BY_POSITION },
406   {"Connection"   , SORT_BY_CONNECTIVITY },
407   {NULL           , 0 }
408 } ;
409 
410 /* ------------------------------------------------------------------------ */
411 /*  Types (int) and their assigned functions                                */
412 /* ------------------------------------------------------------------------ */
413 
414 #define CAST  void(*)()
415 
416 struct DefineXFunction  FunctionForGauss[] = {
417 #if defined(HAVE_KERNEL)
418   {POINT_ELEMENT  , (CAST)Gauss_Point},
419   {LINE           , (CAST)Gauss_Line},
420   {LINE_2         , (CAST)Gauss_Line},
421   {LINE_3         , (CAST)Gauss_Line},
422   {LINE_4         , (CAST)Gauss_Line},
423   {TRIANGLE       , (CAST)Gauss_Triangle},
424   {TRIANGLE_2     , (CAST)Gauss_Triangle},
425   {TRIANGLE_3     , (CAST)Gauss_Triangle},
426   {TRIANGLE_4     , (CAST)Gauss_Triangle},
427   {QUADRANGLE     , (CAST)Gauss_Quadrangle},
428   {QUADRANGLE_2   , (CAST)Gauss_Quadrangle},
429   {QUADRANGLE_2_8N, (CAST)Gauss_Quadrangle},
430   {QUADRANGLE_3   , (CAST)Gauss_Quadrangle},
431   {QUADRANGLE_4   , (CAST)Gauss_Quadrangle},
432   {TETRAHEDRON    , (CAST)Gauss_Tetrahedron},
433   {TETRAHEDRON_2  , (CAST)Gauss_Tetrahedron},
434   {TETRAHEDRON_3  , (CAST)Gauss_Tetrahedron},
435   {TETRAHEDRON_4  , (CAST)Gauss_Tetrahedron},
436   {HEXAHEDRON     , (CAST)Gauss_Hexahedron},
437   {HEXAHEDRON_2   , (CAST)Gauss_Hexahedron},
438   {HEXAHEDRON_2_20N, (CAST)Gauss_Hexahedron},
439   {HEXAHEDRON_3   , (CAST)Gauss_Hexahedron},
440   {HEXAHEDRON_4   , (CAST)Gauss_Hexahedron},
441   {PRISM          , (CAST)Gauss_Prism},
442   {PRISM_2        , (CAST)Gauss_Prism},
443   {PRISM_2_15N    , (CAST)Gauss_Prism},
444   {PRISM_3        , (CAST)Gauss_Prism},
445   {PRISM_4        , (CAST)Gauss_Prism},
446   {PYRAMID        , (CAST)Gauss_Pyramid},
447   {PYRAMID_2      , (CAST)Gauss_Pyramid},
448   {PYRAMID_2_13N  , (CAST)Gauss_Pyramid},
449   {PYRAMID_3      , (CAST)Gauss_Pyramid},
450   //{PYRAMID_4      , (CAST)Gauss_Pyramid},
451 #else
452   {POINT_ELEMENT  , NULL},
453   {LINE           , NULL},
454   {LINE_2         , NULL},
455   {LINE_3         , NULL},
456   {LINE_4         , NULL},
457   {TRIANGLE       , NULL},
458   {TRIANGLE_2     , NULL},
459   {TRIANGLE_3     , NULL},
460   {TRIANGLE_4     , NULL},
461   {QUADRANGLE     , NULL},
462   {QUADRANGLE_2   , NULL},
463   {QUADRANGLE_2_8N, NULL},
464   {QUADRANGLE_3   , NULL},
465   {QUADRANGLE_4   , NULL},
466   {TETRAHEDRON    , NULL},
467   {TETRAHEDRON_2  , NULL},
468   {TETRAHEDRON_3  , NULL},
469   {TETRAHEDRON_4  , NULL},
470   {HEXAHEDRON     , NULL},
471   {HEXAHEDRON_2   , NULL},
472   {HEXAHEDRON_2_20N, NULL},
473   {HEXAHEDRON_3   , NULL},
474   {HEXAHEDRON_4   , NULL},
475   {PRISM          , NULL},
476   {PRISM_2        , NULL},
477   {PRISM_2_15N    , NULL},
478   {PRISM_3        , NULL},
479   {PRISM_4        , NULL},
480   {PYRAMID        , NULL},
481   {PYRAMID_2      , NULL},
482   {PYRAMID_2_13N  , NULL},
483   {PYRAMID_3      , NULL},
484   //{PYRAMID_4      , NULL},
485 #endif
486   {0              , 0}
487 } ;
488 
489 struct DefineXFunction  FunctionForSingularGauss[] = {
490 #if defined(HAVE_KERNEL)
491   {TRIANGLE       , (CAST)GaussSingularR_Triangle},
492   {QUADRANGLE     , (CAST)GaussSingularR_Quadrangle},
493 #else
494   {TRIANGLE       , NULL},
495   {QUADRANGLE     , NULL},
496 #endif
497   {0              , 0}
498 } ;
499 
500 struct DefineXFunction  FunctionForGaussLegendre[] = {
501 #if defined(HAVE_KERNEL)
502   {POINT_ELEMENT  , (CAST)Gauss_Point},
503   {LINE           , (CAST)Gauss_Line},
504   {LINE_2         , (CAST)Gauss_Line},
505   {TRIANGLE       , (CAST)GaussLegendre_Triangle},
506   {TRIANGLE_2     , (CAST)GaussLegendre_Triangle},
507   {QUADRANGLE     , (CAST)GaussLegendre_Quadrangle},
508   {QUADRANGLE_2   , (CAST)GaussLegendre_Quadrangle},
509   {TETRAHEDRON    , (CAST)GaussLegendre_Tetrahedron},
510   {TETRAHEDRON_2  , (CAST)GaussLegendre_Tetrahedron},
511   {HEXAHEDRON     , (CAST)GaussLegendre_Hexahedron},
512   {HEXAHEDRON_2   , (CAST)GaussLegendre_Hexahedron},
513   {PRISM          , (CAST)Gauss_Prism},
514   {PRISM_2        , (CAST)Gauss_Prism},
515   {PYRAMID        , (CAST)Gauss_Pyramid},
516   {PYRAMID_2      , (CAST)Gauss_Pyramid},
517 #else
518   {POINT_ELEMENT  , NULL},
519   {LINE           , NULL},
520   {TRIANGLE       , NULL},
521   {QUADRANGLE     , NULL},
522   {TETRAHEDRON    , NULL},
523   {HEXAHEDRON     , NULL},
524 #endif
525   {0              , 0}
526 } ;
527 
528 #define POI  POINT_ELEMENT
529 #define LIN  LINE | LINE_2 | LINE_3 | LINE_4
530 #define TRI  TRIANGLE | TRIANGLE_2 | TRIANGLE_3 | TRIANGLE_4
531 #define QUA  QUADRANGLE | QUADRANGLE_2 | QUADRANGLE_2_8N | QUADRANGLE_3 | QUADRANGLE_4
532 #define TET  TETRAHEDRON | TETRAHEDRON_2 | TETRAHEDRON_3 | TETRAHEDRON_4
533 #define HEX  HEXAHEDRON | HEXAHEDRON_2 | HEXAHEDRON_2_20N | HEXAHEDRON_3 | HEXAHEDRON_4
534 #define PRI  PRISM | PRISM_2 | PRISM_2_15N | PRISM_3 | PRISM_4
535 #define PYR  PYRAMID | PYRAMID_2 | PYRAMID_2_13N | PYRAMID_3 // | PYRAMID_4
536 #define ALL  POI|LIN|TRI|QUA|TET|HEX|PRI|PYR
537 
538 struct StringX3Function3Nbr  BF_Function[] = {
539   // H^1 Basis Functions and their gradients
540 
541   {"BF_Node",    (CAST)BF_Node,
542                  (CAST)BF_GradNode,    (CAST)BF_Zero, 1., ALL, 0 },
543   {"BF_Node_1N", (CAST)BF_Node,
544                  (CAST)BF_GradNode,    (CAST)BF_Zero, 1., ALL, 0 },
545   {"BF_Node_2E", (CAST)BF_Node_2E,
546                  (CAST)BF_GradNode_2E, (CAST)BF_Zero, 2., LIN|TRI|TET, 0 },
547   {"BF_Node_2F", (CAST)BF_Node_2F,
548                  (CAST)BF_GradNode_2F, (CAST)BF_Zero, 2., QUA|HEX/*|PRI|PYR*/, 0 },
549   {"BF_Node_2V", (CAST)BF_Node_2V,
550                  (CAST)BF_GradNode_2V, (CAST)BF_Zero, 2., HEX, 0 },
551   {"BF_Node_3E", (CAST)BF_Node_3E,
552                  (CAST)BF_GradNode_3E, (CAST)BF_Zero, 3., ALL, 0 },
553   {"BF_Node_3F", (CAST)BF_Node_3F,
554                  (CAST)BF_GradNode_3F, (CAST)BF_Zero, 3., TRI|QUA|TET|HEX|PRI|PYR, 0 },
555   {"BF_Node_3V", (CAST)BF_Node_3V,
556                  (CAST)BF_GradNode_3V, (CAST)BF_Zero, 3., HEX|PRI|PYR, 0 },
557 
558   {"BF_GradNodeRealCoord",    (CAST)BF_GradNodeRealCoord,
559                      (CAST)BF_Zero, (CAST)BF_Node,    0., ALL, 0 },
560   {"BF_GradNode",    (CAST)BF_GradNode,
561                      (CAST)BF_Zero, (CAST)BF_Node,    0., ALL, 0 },
562   {"BF_GradNode_1N", (CAST)BF_GradNode,
563                      (CAST)BF_Zero, (CAST)BF_Node,    0., ALL, 0 },
564   {"BF_GradNode_2E", (CAST)BF_GradNode_2E,
565                      (CAST)BF_Zero, (CAST)BF_Node_2E, 1., LIN|TRI|TET, 0 },
566   {"BF_GradNode_2F", (CAST)BF_GradNode_2F,
567                      (CAST)BF_Zero, (CAST)BF_Node_2F, 1., QUA|HEX/*|PRI|PYR*/, 0 },
568   {"BF_GradNode_2V", (CAST)BF_GradNode_2V,
569                      (CAST)BF_Zero, (CAST)BF_Node_2V, 1., HEX, 0 },
570   {"BF_GradNode_3E", (CAST)BF_GradNode_3E,
571                      (CAST)BF_Zero, (CAST)BF_Node_3E, 2., ALL, 0 },
572   {"BF_GradNode_3F", (CAST)BF_GradNode_3F,
573                      (CAST)BF_Zero, (CAST)BF_Node_3F, 2., TRI|QUA|TET|HEX|PRI|PYR, 0 },
574   {"BF_GradNode_3V", (CAST)BF_GradNode_3V,
575                      (CAST)BF_Zero, (CAST)BF_Node_3V, 2., HEX|PRI|PYR, 0 },
576 
577   {"BF_GroupOfNodes",    (CAST)BF_GroupOfNodes,
578                          (CAST)BF_GradGroupOfNodes,    (CAST)BF_Zero, 1., ALL, 0 },
579   {"BF_GroupOfNodes_1N", (CAST)BF_GroupOfNodes,
580                          (CAST)BF_GradGroupOfNodes,    (CAST)BF_Zero, 1., ALL, 0 },
581   {"BF_GroupOfNodes_2E", (CAST)BF_GroupOfNodes_2E,
582                          (CAST)BF_GradGroupOfNodes_2E, (CAST)BF_Zero, 2., ALL, 0 },
583   {"BF_GroupOfNodes_2F", (CAST)BF_GroupOfNodes_2F,
584                          (CAST)BF_GradGroupOfNodes_2F, (CAST)BF_Zero, 2., QUA|HEX/*|PRI|PYR*/, 0 },
585   {"BF_GroupOfNodes_2V", (CAST)BF_GroupOfNodes_2V,
586                          (CAST)BF_GradGroupOfNodes_2V, (CAST)BF_Zero, 2., HEX, 0 },
587   {"BF_GroupOfNodes_3E", (CAST)BF_GroupOfNodes_3E,
588                          (CAST)BF_GradGroupOfNodes_3E, (CAST)BF_Zero, 3., ALL, 0 },
589   {"BF_GroupOfNodes_3F", (CAST)BF_GroupOfNodes_3F,
590                          (CAST)BF_GradGroupOfNodes_3F, (CAST)BF_Zero, 3., HEX|PRI|TET|HEX|PRI|PYR, 0 },
591   {"BF_GroupOfNodes_3V", (CAST)BF_GroupOfNodes_3V,
592                          (CAST)BF_GradGroupOfNodes_3V, (CAST)BF_Zero, 3., HEX|PRI|PYR, 0 },
593 
594   {"BF_GradGroupOfNodes",    (CAST)BF_GradGroupOfNodes,
595                              (CAST)BF_Zero, (CAST)BF_GroupOfNodes,    0., ALL, 0 },
596   {"BF_GradGroupOfNodes_1N", (CAST)BF_GradGroupOfNodes,
597                              (CAST)BF_Zero, (CAST)BF_GroupOfNodes,    0., ALL, 0 },
598   {"BF_GradGroupOfNodes_2E", (CAST)BF_GradGroupOfNodes_2E,
599                              (CAST)BF_Zero, (CAST)BF_GroupOfNodes_2E, 1., ALL, 0 },
600   {"BF_GradGroupOfNodes_2F", (CAST)BF_GradGroupOfNodes_2F,
601                              (CAST)BF_Zero, (CAST)BF_GroupOfNodes_2F, 1., QUA|HEX/*|PRI|PYR*/, 0 },
602   {"BF_GradGroupOfNodes_2V", (CAST)BF_GradGroupOfNodes_2V,
603                              (CAST)BF_Zero, (CAST)BF_GroupOfNodes_2V, 1., HEX, 0 },
604   {"BF_GradGroupOfNodes_3E", (CAST)BF_GradGroupOfNodes_3E,
605                              (CAST)BF_Zero, (CAST)BF_GroupOfNodes_3E, 2., ALL, 0 },
606   {"BF_GradGroupOfNodes_3F", (CAST)BF_GradGroupOfNodes_3F,
607                              (CAST)BF_Zero, (CAST)BF_GroupOfNodes_3F, 2., HEX|PRI|TET|HEX|PRI|PYR, 0 },
608   {"BF_GradGroupOfNodes_3V", (CAST)BF_GradGroupOfNodes_2V,
609                              (CAST)BF_Zero, (CAST)BF_GroupOfNodes_3V, 2., HEX|PRI|PYR, 0 },
610 
611 
612   // H(curl) basis Functions and their curls
613 
614   {"BF_Edge",      (CAST)BF_Edge,
615                    (CAST)BF_CurlEdge,      (CAST)BF_Zero, 0.5, ALL, 1 },
616   {"BF_Edge_1E",   (CAST)BF_Edge,
617                    (CAST)BF_CurlEdge,      (CAST)BF_Zero, 0.5, ALL, 1 },
618   {"BF_Edge_2E",   (CAST)BF_Edge_2E,
619                    (CAST)BF_CurlEdge_2E,   (CAST)BF_Zero, 1.,  LIN|TRI|TET, 0 },
620   {"BF_Edge_2F",   (CAST)BF_Edge_2F,
621                    (CAST)BF_CurlEdge_2F,   (CAST)BF_Zero, 1.,  ALL, 0 },
622   {"BF_Edge_2V",   (CAST)BF_Edge_2V,
623                    (CAST)BF_CurlEdge_2V,   (CAST)BF_Zero, 1.,  ALL, 0 },
624   {"BF_Edge_3E",   (CAST)BF_Edge_3E,
625                    (CAST)BF_CurlEdge_3E,   (CAST)BF_Zero, 1.5, LIN|TRI|TET, 0 },
626   {"BF_Edge_3F_a", (CAST)BF_Edge_3F_a,
627                    (CAST)BF_CurlEdge_3F_a, (CAST)BF_Zero, 1.5, LIN|TRI|TET, 0 },
628   {"BF_Edge_3F_b", (CAST)BF_Edge_3F_b,
629                    (CAST)BF_CurlEdge_3F_b, (CAST)BF_Zero, 1.5, LIN|TRI|TET, 0 },
630   {"BF_Edge_3F_c", (CAST)BF_Edge_3F_c,
631                    (CAST)BF_CurlEdge_3F_c, (CAST)BF_Zero, 1.5, LIN|TRI|TET, 0 },
632   {"BF_Edge_3V",   (CAST)BF_Edge_3V,
633                    (CAST)BF_CurlEdge_3V,   (CAST)BF_Zero, 1.5, LIN|TRI|TET, 0 },
634   {"BF_Edge_4E",   (CAST)BF_Edge_4E,
635                    (CAST)BF_CurlEdge_4E,   (CAST)BF_Zero, 2.,  ALL, 0 },
636   {"BF_Edge_4F",   (CAST)BF_Edge_4F,
637                    (CAST)BF_CurlEdge_4F,   (CAST)BF_Zero, 2.,  LIN|TRI|TET, 0 },
638   {"BF_Edge_4V",   (CAST)BF_Edge_4V,
639                    (CAST)BF_CurlEdge_4V,   (CAST)BF_Zero, 2.,  LIN|TRI|TET, 0 },
640 
641   {"BF_CurlEdge",      (CAST)BF_CurlEdge,
642                        (CAST)BF_Zero, (CAST)BF_Edge,      0., ALL, 1 },
643   {"BF_CurlEdge_1E",   (CAST)BF_CurlEdge,
644                        (CAST)BF_Zero, (CAST)BF_Edge,      0., ALL, 0 },
645   {"BF_CurlEdge_2E",   (CAST)BF_CurlEdge_2E,
646                        (CAST)BF_Zero, (CAST)BF_Edge_2E,   0., LIN|TRI|TET, 0 },
647   {"BF_CurlEdge_2F",   (CAST)BF_CurlEdge_2F,
648                        (CAST)BF_Zero, (CAST)BF_Edge_2F,   0., ALL, 0 },
649   {"BF_CurlEdge_2V",   (CAST)BF_CurlEdge_2V,
650                        (CAST)BF_Zero, (CAST)BF_Edge_2V,   0., ALL, 0 },
651   {"BF_CurlEdge_3E",   (CAST)BF_CurlEdge_3E,
652                        (CAST)BF_Zero, (CAST)BF_Edge_3E,   1., LIN|TRI|TET, 0 },
653   {"BF_CurlEdge_3F_a", (CAST)BF_CurlEdge_3F_a,
654                        (CAST)BF_Zero, (CAST)BF_Edge_3F_a, 1., LIN|TRI|TET, 0 },
655   {"BF_CurlEdge_3F_b", (CAST)BF_CurlEdge_3F_b,
656                        (CAST)BF_Zero, (CAST)BF_Edge_3F_b, 1., LIN|TRI|TET, 0 },
657   {"BF_CurlEdge_3F_c", (CAST)BF_CurlEdge_3F_c,
658                        (CAST)BF_Zero, (CAST)BF_Edge_3F_c, 1., LIN|TRI|TET, 0 },
659   {"BF_CurlEdge_3V",   (CAST)BF_CurlEdge_3V,
660                        (CAST)BF_Zero, (CAST)BF_Edge_3V,   1., LIN|TRI|TET, 0 },
661   {"BF_CurlEdge_4E",   (CAST)BF_CurlEdge_4E,
662                        (CAST)BF_Zero, (CAST)BF_Edge_4E,   1., ALL, 0 },
663   {"BF_CurlEdge_4F",   (CAST)BF_CurlEdge_4F,
664                        (CAST)BF_Zero, (CAST)BF_Edge_4F,   1., LIN|TRI|TET, 0 },
665   {"BF_CurlEdge_4V",   (CAST)BF_CurlEdge_4V,
666                        (CAST)BF_Zero, (CAST)BF_Edge_4V,   1., LIN|TRI|TET, 0 },
667 
668   {"BF_GroupOfEdges",      (CAST)BF_GroupOfEdges,
669                            (CAST)BF_CurlGroupOfEdges,      (CAST)BF_Zero, 0.5, ALL, 1 },
670   {"BF_GroupOfEdges_1E",   (CAST)BF_GroupOfEdges,
671                            (CAST)BF_CurlGroupOfEdges,      (CAST)BF_Zero, 0.5, ALL, 0 },
672   {"BF_GroupOfEdges_2E",   (CAST)BF_GroupOfEdges_2E,
673                            (CAST)BF_CurlGroupOfEdges_2E,   (CAST)BF_Zero, 1.,  LIN|TRI|TET, 0 },
674   {"BF_GroupOfEdges_2F",   (CAST)BF_GroupOfEdges_2F,
675                            (CAST)BF_CurlGroupOfEdges_2F,   (CAST)BF_Zero, 1.,  ALL, 0 },
676   {"BF_GroupOfEdges_2V",   (CAST)BF_GroupOfEdges_2V,
677                            (CAST)BF_CurlGroupOfEdges_2V,   (CAST)BF_Zero, 1.,  ALL, 0 },
678   {"BF_GroupOfEdges_3E",   (CAST)BF_GroupOfEdges_3E,
679                            (CAST)BF_CurlGroupOfEdges_3E,   (CAST)BF_Zero, 1.5, LIN|TRI|TET, 0 },
680   {"BF_GroupOfEdges_3F_a", (CAST)BF_GroupOfEdges_3F_a,
681                            (CAST)BF_CurlGroupOfEdges_3F_a, (CAST)BF_Zero, 1.5, LIN|TRI|TET, 0 },
682   {"BF_GroupOfEdges_3F_b", (CAST)BF_GroupOfEdges_3F_b,
683                            (CAST)BF_CurlGroupOfEdges_3F_b, (CAST)BF_Zero, 1.5, LIN|TRI|TET, 0 },
684   {"BF_GroupOfEdges_3F_c", (CAST)BF_GroupOfEdges_3F_c,
685                            (CAST)BF_CurlGroupOfEdges_3F_c, (CAST)BF_Zero, 1.5, LIN|TRI|TET, 0 },
686   {"BF_GroupOfEdges_3V",   (CAST)BF_GroupOfEdges_3V,
687                            (CAST)BF_CurlGroupOfEdges_3V,   (CAST)BF_Zero, 1.5, LIN|TRI|TET, 0 },
688   {"BF_GroupOfEdges_4E",   (CAST)BF_GroupOfEdges_4E,
689                            (CAST)BF_CurlGroupOfEdges_4E,   (CAST)BF_Zero, 2.,  ALL, 0 },
690   {"BF_GroupOfEdges_4F",   (CAST)BF_GroupOfEdges_4F,
691                            (CAST)BF_CurlGroupOfEdges_4F,   (CAST)BF_Zero, 2.,  LIN|TRI|TET, 0 },
692   {"BF_GroupOfEdges_4V",   (CAST)BF_GroupOfEdges_4V,
693                            (CAST)BF_CurlGroupOfEdges_4V,   (CAST)BF_Zero, 2.,  LIN|TRI|TET, 0 },
694 
695   {"BF_CurlGroupOfEdges",      (CAST)BF_CurlGroupOfEdges,
696                                (CAST)BF_Zero, (CAST)BF_GroupOfEdges,      0., ALL, 1 },
697   {"BF_CurlGroupOfEdges_1E",   (CAST)BF_CurlGroupOfEdges,
698                                (CAST)BF_Zero, (CAST)BF_GroupOfEdges,      0., ALL, 0 },
699   {"BF_CurlGroupOfEdges_2E",   (CAST)BF_CurlGroupOfEdges_2E,
700                                (CAST)BF_Zero, (CAST)BF_GroupOfEdges_2E,   0., LIN|TRI|TET, 0 },
701   {"BF_CurlGroupOfEdges_2F",   (CAST)BF_CurlGroupOfEdges_2F,
702                                (CAST)BF_Zero, (CAST)BF_GroupOfEdges_2F,   0., ALL, 0 },
703   {"BF_CurlGroupOfEdges_2V",   (CAST)BF_CurlGroupOfEdges_2V,
704                                (CAST)BF_Zero, (CAST)BF_GroupOfEdges_2V,   0., ALL, 0 },
705   {"BF_CurlGroupOfEdges_3E",   (CAST)BF_CurlGroupOfEdges_3E,
706                                (CAST)BF_Zero, (CAST)BF_GroupOfEdges_3E,   1., LIN|TRI|TET, 0 },
707   {"BF_CurlGroupOfEdges_3F_a", (CAST)BF_CurlGroupOfEdges_3F_a,
708                                (CAST)BF_Zero, (CAST)BF_GroupOfEdges_3F_a, 1., LIN|TRI|TET, 0 },
709   {"BF_CurlGroupOfEdges_3F_b", (CAST)BF_CurlGroupOfEdges_3F_b,
710                                (CAST)BF_Zero, (CAST)BF_GroupOfEdges_3F_b, 1., LIN|TRI|TET, 0 },
711   {"BF_CurlGroupOfEdges_3F_c", (CAST)BF_CurlGroupOfEdges_3F_c,
712                                (CAST)BF_Zero, (CAST)BF_GroupOfEdges_3F_c, 1., LIN|TRI|TET, 0 },
713   {"BF_CurlGroupOfEdges_3V",   (CAST)BF_CurlGroupOfEdges_3V,
714                                (CAST)BF_Zero, (CAST)BF_GroupOfEdges_3V,   1., LIN|TRI|TET, 0 },
715   {"BF_CurlGroupOfEdges_4E",   (CAST)BF_CurlGroupOfEdges_4E,
716                                (CAST)BF_Zero, (CAST)BF_GroupOfEdges_4E,   1., ALL, 0 },
717   {"BF_CurlGroupOfEdges_4F",   (CAST)BF_CurlGroupOfEdges_4F,
718                                (CAST)BF_Zero, (CAST)BF_GroupOfEdges_4F,   1., LIN|TRI|TET, 0 },
719   {"BF_CurlGroupOfEdges_4V",   (CAST)BF_CurlGroupOfEdges_4V,
720                                (CAST)BF_Zero, (CAST)BF_GroupOfEdges_4V,   1., LIN|TRI|TET, 0 },
721 
722 
723   // H(curl, perp) basis Functions and their curls
724 
725   {"BF_PerpendicularEdge",    (CAST)BF_PerpendicularEdge,
726                               (CAST)BF_CurlPerpendicularEdge,    (CAST)BF_Zero, 1., ALL, 0 },
727   {"BF_PerpendicularEdge_1N", (CAST)BF_PerpendicularEdge,
728                               (CAST)BF_CurlPerpendicularEdge,    (CAST)BF_Zero, 1., ALL, 0 },
729   {"BF_PerpendicularEdge_2E", (CAST)BF_PerpendicularEdge_2E,
730                               (CAST)BF_CurlPerpendicularEdge_2E, (CAST)BF_Zero, 2., ALL, 0 },
731   {"BF_PerpendicularEdge_2F", (CAST)BF_PerpendicularEdge_2F,
732                               (CAST)BF_CurlPerpendicularEdge_2F, (CAST)BF_Zero, 2., QUA|HEX|PRI, 0 },
733   {"BF_PerpendicularEdge_2V", (CAST)BF_PerpendicularEdge_2V,
734                               (CAST)BF_CurlPerpendicularEdge_2V, (CAST)BF_Zero, 2., QUA|HEX, 0 },
735   {"BF_PerpendicularEdge_3E", (CAST)BF_PerpendicularEdge_3E,
736                               (CAST)BF_CurlPerpendicularEdge_3E, (CAST)BF_Zero, 3., ALL, 0 },
737   {"BF_PerpendicularEdge_3F", (CAST)BF_PerpendicularEdge_3F,
738                               (CAST)BF_CurlPerpendicularEdge_3F, (CAST)BF_Zero, 3., TRI|QUA|TET|HEX|PRI, 0 },
739   {"BF_PerpendicularEdge_3V", (CAST)BF_PerpendicularEdge_3V,
740                               (CAST)BF_CurlPerpendicularEdge_3V, (CAST)BF_Zero, 3., HEX|PRI, 0 },
741 
742   {"BF_CurlPerpendicularEdge",    (CAST)BF_CurlPerpendicularEdge,
743                                   (CAST)BF_Zero, (CAST)BF_PerpendicularEdge,    0., ALL, 0 },
744   {"BF_CurlPerpendicularEdge_1N", (CAST)BF_CurlPerpendicularEdge,
745                                   (CAST)BF_Zero, (CAST)BF_PerpendicularEdge,    0., ALL, 0 },
746   {"BF_CurlPerpendicularEdge_2E", (CAST)BF_CurlPerpendicularEdge_2E,
747                                   (CAST)BF_Zero, (CAST)BF_PerpendicularEdge_2E, 1., ALL, 0 },
748   {"BF_CurlPerpendicularEdge_2F", (CAST)BF_CurlPerpendicularEdge_2F,
749                                   (CAST)BF_Zero, (CAST)BF_PerpendicularEdge_2F, 1., QUA|HEX|PRI, 0 },
750   {"BF_CurlPerpendicularEdge_2V", (CAST)BF_CurlPerpendicularEdge_2V,
751                                   (CAST)BF_Zero, (CAST)BF_PerpendicularEdge_2V, 1., QUA|HEX, 0 },
752   {"BF_CurlPerpendicularEdge_3E", (CAST)BF_CurlPerpendicularEdge_3E,
753                                   (CAST)BF_Zero, (CAST)BF_PerpendicularEdge_3E, 2., ALL, 0 },
754   {"BF_CurlPerpendicularEdge_3F", (CAST)BF_CurlPerpendicularEdge_3F,
755                                   (CAST)BF_Zero, (CAST)BF_PerpendicularEdge_3F, 2., TRI|QUA|TET|HEX|PRI, 0 },
756   {"BF_CurlPerpendicularEdge_3V", (CAST)BF_CurlPerpendicularEdge_3V,
757                                   (CAST)BF_Zero, (CAST)BF_PerpendicularEdge_3V, 2., HEX|PRI, 0 },
758 
759   {"BF_GroupOfPerpendicularEdges",    (CAST)BF_GroupOfPerpendicularEdges,
760                                       (CAST)BF_CurlGroupOfPerpendicularEdges,    (CAST)BF_Zero, 1., ALL, 0 },
761   {"BF_GroupOfPerpendicularEdges_1N", (CAST)BF_GroupOfPerpendicularEdges,
762                                       (CAST)BF_CurlGroupOfPerpendicularEdges,    (CAST)BF_Zero, 1., ALL, 0 },
763   {"BF_GroupOfPerpendicularEdges_2E", (CAST)BF_GroupOfPerpendicularEdges_2E,
764                                       (CAST)BF_CurlGroupOfPerpendicularEdges_2E, (CAST)BF_Zero, 2., ALL, 0 },
765   {"BF_GroupOfPerpendicularEdges_2F", (CAST)BF_GroupOfPerpendicularEdges_2F,
766                                       (CAST)BF_CurlGroupOfPerpendicularEdges_2F, (CAST)BF_Zero, 2., QUA|HEX|PRI, 0 },
767   {"BF_GroupOfPerpendicularEdges_2V", (CAST)BF_GroupOfPerpendicularEdges_2V,
768                                       (CAST)BF_CurlGroupOfPerpendicularEdges_2V, (CAST)BF_Zero, 2., QUA|HEX, 0 },
769   {"BF_GroupOfPerpendicularEdges_3E", (CAST)BF_GroupOfPerpendicularEdges_3E,
770                                       (CAST)BF_CurlGroupOfPerpendicularEdges_3E, (CAST)BF_Zero, 3., ALL, 0 },
771   {"BF_GroupOfPerpendicularEdges_3F", (CAST)BF_GroupOfPerpendicularEdges_3F,
772                                       (CAST)BF_CurlGroupOfPerpendicularEdges_3F, (CAST)BF_Zero, 3., TRI|QUA|TET|HEX|PRI, 0 },
773   {"BF_GroupOfPerpendicularEdges_3V", (CAST)BF_GroupOfPerpendicularEdges_3V,
774                                       (CAST)BF_CurlGroupOfPerpendicularEdges_3V, (CAST)BF_Zero, 3., HEX|PRI, 0 },
775 
776   {"BF_CurlGroupOfPerpendicularEdges",    (CAST)BF_CurlGroupOfPerpendicularEdges,
777                                           (CAST)BF_Zero, (CAST)BF_GroupOfPerpendicularEdges,    0., ALL, 0 },
778   {"BF_CurlGroupOfPerpendicularEdges_1N", (CAST)BF_CurlGroupOfPerpendicularEdges,
779                                           (CAST)BF_Zero, (CAST)BF_GroupOfPerpendicularEdges,    0., ALL, 0 },
780   {"BF_CurlGroupOfPerpendicularEdges_2E", (CAST)BF_CurlGroupOfPerpendicularEdges_2E,
781                                           (CAST)BF_Zero, (CAST)BF_GroupOfPerpendicularEdges_2E, 1., ALL, 0 },
782   {"BF_CurlGroupOfPerpendicularEdges_2F", (CAST)BF_CurlGroupOfPerpendicularEdges_2F,
783                                           (CAST)BF_Zero, (CAST)BF_GroupOfPerpendicularEdges_2F, 1., QUA|HEX|PRI, 0 },
784   {"BF_CurlGroupOfPerpendicularEdges_2V", (CAST)BF_CurlGroupOfPerpendicularEdges_2V,
785                                           (CAST)BF_Zero, (CAST)BF_GroupOfPerpendicularEdges_2V, 1., QUA|HEX, 0 },
786   {"BF_CurlGroupOfPerpendicularEdges_3E", (CAST)BF_CurlGroupOfPerpendicularEdges_3E,
787                                           (CAST)BF_Zero, (CAST)BF_GroupOfPerpendicularEdges_3E, 2., ALL, 0 },
788   {"BF_CurlGroupOfPerpendicularEdges_3F", (CAST)BF_CurlGroupOfPerpendicularEdges_3F,
789                                           (CAST)BF_Zero, (CAST)BF_GroupOfPerpendicularEdges_3F, 2., TRI|QUA|TET|HEX|PRI, 0 },
790   {"BF_CurlGroupOfPerpendicularEdges_3V", (CAST)BF_CurlGroupOfPerpendicularEdges_3V,
791                                           (CAST)BF_Zero, (CAST)BF_GroupOfPerpendicularEdges_3V, 2., HEX|PRI, 0 },
792 
793 
794   // H(div) basis Functions and their divergences
795 
796   {"BF_Facet", (CAST)BF_Facet, (CAST)BF_DivFacet, (CAST)BF_Zero, 0.5, ALL, 1 },
797 
798   {"BF_DivFacet", (CAST)BF_DivFacet, (CAST)BF_Zero, (CAST)BF_Facet, 0., ALL, 1 },
799 
800   {"BF_GroupOfFacets", (CAST)BF_GroupOfFacets, (CAST)BF_DivGroupOfFacets, (CAST)BF_Zero, 0.5, ALL, 1 },
801 
802   {"BF_DivGroupOfFacets", (CAST)BF_DivGroupOfFacets, (CAST)BF_Zero, (CAST)BF_GroupOfFacets, 0., ALL, 1 },
803 
804   // Current along wire
805   {"BF_Wire",    (CAST)BF_Wire, (CAST)BF_DivWire, (CAST)BF_Zero, 1., LIN, 0 },
806   {"BF_DivWire", (CAST)BF_DivWire, (CAST)BF_Zero, (CAST)BF_Wire, 0., LIN, 0 },
807 
808   // H(div, perp) basis Functions and their divergences
809 
810   {"BF_PerpendicularFacet",      (CAST)BF_PerpendicularFacet,
811                                  (CAST)BF_DivPerpendicularFacet,      (CAST)BF_Zero, 0.5, ALL, 1 },
812   {"BF_PerpendicularFacet_1E",   (CAST)BF_PerpendicularFacet,
813                                  (CAST)BF_DivPerpendicularFacet,      (CAST)BF_Zero, 0.5, ALL, 0 },
814   {"BF_PerpendicularFacet_2E",   (CAST)BF_PerpendicularFacet_2E,
815                                  (CAST)BF_DivPerpendicularFacet_2E,   (CAST)BF_Zero, 1.,  ALL, 0 },
816   {"BF_PerpendicularFacet_2F",   (CAST)BF_PerpendicularFacet_2F,
817                                  (CAST)BF_DivPerpendicularFacet_2F,   (CAST)BF_Zero, 1.,  ALL, 0 },
818   {"BF_PerpendicularFacet_2V",   (CAST)BF_PerpendicularFacet_2V,
819                                  (CAST)BF_DivPerpendicularFacet_2V,   (CAST)BF_Zero, 1.,  ALL, 0 },
820   {"BF_PerpendicularFacet_3E",   (CAST)BF_PerpendicularFacet_3E,
821                                  (CAST)BF_DivPerpendicularFacet_3E,   (CAST)BF_Zero, 1.5,  ALL, 0 },
822   {"BF_PerpendicularFacet_3F_a", (CAST)BF_PerpendicularFacet_3F_a,
823                                  (CAST)BF_DivPerpendicularFacet_3F_a, (CAST)BF_Zero, 1.5,  ALL, 0 },
824   {"BF_PerpendicularFacet_3F_b", (CAST)BF_PerpendicularFacet_3F_b,
825                                  (CAST)BF_DivPerpendicularFacet_3F_b, (CAST)BF_Zero, 1.5,  ALL, 0 },
826   {"BF_PerpendicularFacet_3F_c", (CAST)BF_PerpendicularFacet_3F_c,
827                                  (CAST)BF_DivPerpendicularFacet_3F_c, (CAST)BF_Zero, 1.5,  ALL, 0 },
828   {"BF_PerpendicularFacet_3V",   (CAST)BF_PerpendicularFacet_3V,
829                                  (CAST)BF_DivPerpendicularFacet_3V,   (CAST)BF_Zero, 1.5,  ALL, 0 },
830   {"BF_PerpendicularFacet_4E",   (CAST)BF_PerpendicularFacet_4E,
831                                  (CAST)BF_DivPerpendicularFacet_4E,   (CAST)BF_Zero, 2.,  ALL, 0 },
832   {"BF_PerpendicularFacet_4F",   (CAST)BF_PerpendicularFacet_4F,
833                                  (CAST)BF_DivPerpendicularFacet_4F,   (CAST)BF_Zero, 2.,  ALL, 0 },
834   {"BF_PerpendicularFacet_4V",   (CAST)BF_PerpendicularFacet_4V,
835                                  (CAST)BF_DivPerpendicularFacet_4V,   (CAST)BF_Zero, 2.,  ALL, 0 },
836 
837   {"BF_DivPerpendicularFacet",      (CAST)BF_DivPerpendicularFacet,
838                                     (CAST)BF_Zero, (CAST)BF_PerpendicularFacet,      0., ALL, 1 },
839   {"BF_DivPerpendicularFacet_1E",   (CAST)BF_DivPerpendicularFacet,
840                                     (CAST)BF_Zero, (CAST)BF_PerpendicularFacet,      0., ALL, 0 },
841   {"BF_DivPerpendicularFacet_2E",   (CAST)BF_DivPerpendicularFacet_2E,
842                                     (CAST)BF_Zero, (CAST)BF_PerpendicularFacet_2E,   0., ALL, 0 },
843   {"BF_DivPerpendicularFacet_2F",   (CAST)BF_DivPerpendicularFacet_2F,
844                                     (CAST)BF_Zero, (CAST)BF_PerpendicularFacet_2F,   0., ALL, 0 },
845   {"BF_DivPerpendicularFacet_2V",   (CAST)BF_DivPerpendicularFacet_2V,
846                                     (CAST)BF_Zero, (CAST)BF_PerpendicularFacet_2V,   0., ALL, 0 },
847   {"BF_DivPerpendicularFacet_3E",   (CAST)BF_DivPerpendicularFacet_3E,
848                                     (CAST)BF_Zero, (CAST)BF_PerpendicularFacet_3E,   1., ALL, 0 },
849   {"BF_DivPerpendicularFacet_3F_a", (CAST)BF_DivPerpendicularFacet_3F_a,
850                                     (CAST)BF_Zero, (CAST)BF_PerpendicularFacet_3F_a, 1., ALL, 0 },
851   {"BF_DivPerpendicularFacet_3F_b", (CAST)BF_DivPerpendicularFacet_3F_b,
852                                     (CAST)BF_Zero, (CAST)BF_PerpendicularFacet_3F_b, 1., ALL, 0 },
853   {"BF_DivPerpendicularFacet_3F_c", (CAST)BF_DivPerpendicularFacet_3F_c,
854                                     (CAST)BF_Zero, (CAST)BF_PerpendicularFacet_3F_c, 1., ALL, 0 },
855   {"BF_DivPerpendicularFacet_3V",   (CAST)BF_DivPerpendicularFacet_3V,
856                                     (CAST)BF_Zero, (CAST)BF_PerpendicularFacet_3V,   1., ALL, 0 },
857   {"BF_DivPerpendicularFacet_4E",   (CAST)BF_DivPerpendicularFacet_4E,
858                                     (CAST)BF_Zero, (CAST)BF_PerpendicularFacet_4E,   1., ALL, 0 },
859   {"BF_DivPerpendicularFacet_4F",   (CAST)BF_DivPerpendicularFacet_4F,
860                                     (CAST)BF_Zero, (CAST)BF_PerpendicularFacet_4F,   1., ALL, 0 },
861   {"BF_DivPerpendicularFacet_4V",   (CAST)BF_DivPerpendicularFacet_4V,
862                                     (CAST)BF_Zero, (CAST)BF_PerpendicularFacet_4V,   1., ALL, 0 },
863 
864   // L^2 basis Functions
865 
866   {"BF_Volume",  (CAST)BF_Volume,  (CAST)BF_Volume,  (CAST)BF_Zero, 0., ALL, 0 },
867   {"BF_VolumeX", (CAST)BF_VolumeX, (CAST)BF_VolumeX, (CAST)BF_Zero, 0., ALL, 0 },
868   {"BF_VolumeY", (CAST)BF_VolumeY, (CAST)BF_VolumeY, (CAST)BF_Zero, 0., ALL, 0 },
869   {"BF_VolumeZ", (CAST)BF_VolumeZ, (CAST)BF_VolumeZ, (CAST)BF_Zero, 0., ALL, 0 },
870 
871   // (H^1)^3 Basis Functions
872 
873   {"BF_NodeX" , (CAST)BF_NodeX , (CAST)BF_NodeX_D1 , (CAST)BF_NodeX_D2 , 1. , ALL, 0 },
874   {"BF_NodeY" , (CAST)BF_NodeY , (CAST)BF_NodeY_D1 , (CAST)BF_NodeY_D2 , 1. , ALL, 0 },
875   {"BF_NodeZ" , (CAST)BF_NodeZ , (CAST)BF_NodeZ_D1 , (CAST)BF_NodeZ_D2 , 1. , ALL, 0 },
876 
877   {"BF_NodeX_2E" , (CAST)BF_NodeX_2E , (CAST)BF_NodeX_D1_2E , (CAST)BF_NodeX_D2_2E , 2. , LIN|TRI|TET|HEX, 0 },
878   {"BF_NodeY_2E" , (CAST)BF_NodeY_2E , (CAST)BF_NodeY_D1_2E , (CAST)BF_NodeY_D2_2E , 2. , LIN|TRI|TET|HEX, 0 },
879   {"BF_NodeZ_2E" , (CAST)BF_NodeZ_2E , (CAST)BF_NodeZ_D1_2E , (CAST)BF_NodeZ_D2_2E , 2. , LIN|TRI|TET|HEX, 0 },
880 
881   {"BF_NodeX_2F" , (CAST)BF_NodeX_2F , (CAST)BF_NodeX_D1_2F , (CAST)BF_NodeX_D2_2F , 2. , QUA|HEX/*|PRI*/, 0 },
882   {"BF_NodeY_2F" , (CAST)BF_NodeY_2F , (CAST)BF_NodeY_D1_2F , (CAST)BF_NodeY_D2_2F , 2. , QUA|HEX/*|PRI*/, 0 },
883   {"BF_NodeZ_2F" , (CAST)BF_NodeZ_2F , (CAST)BF_NodeZ_D1_2F , (CAST)BF_NodeZ_D2_2F , 2. , QUA|HEX/*|PRI*/, 0 },
884 
885   {"BF_NodeX_2V" , (CAST)BF_NodeX_2V , (CAST)BF_NodeX_D1_2V , (CAST)BF_NodeX_D2_2V , 2. , HEX, 0 },
886   {"BF_NodeY_2V" , (CAST)BF_NodeY_2V , (CAST)BF_NodeY_D1_2V , (CAST)BF_NodeY_D2_2V , 2. , HEX, 0 },
887   {"BF_NodeZ_2V" , (CAST)BF_NodeZ_2V , (CAST)BF_NodeZ_D1_2V , (CAST)BF_NodeZ_D2_2V , 2. , HEX, 0 },
888 
889   {"BF_NodeX_3E" , (CAST)BF_NodeX_3E , (CAST)BF_NodeX_D1_3E , (CAST)BF_NodeX_D2_3E , 3. , ALL, 0 },
890   {"BF_NodeY_3E" , (CAST)BF_NodeY_3E , (CAST)BF_NodeY_D1_3E , (CAST)BF_NodeY_D2_3E , 3. , ALL, 0 },
891   {"BF_NodeZ_3E" , (CAST)BF_NodeZ_3E , (CAST)BF_NodeZ_D1_3E , (CAST)BF_NodeZ_D2_3E , 3. , ALL, 0 },
892 
893   {"BF_NodeX_3F" , (CAST)BF_NodeX_3F , (CAST)BF_NodeX_D1_3F , (CAST)BF_NodeX_D2_3F , 3. , TRI|QUA|TET|HEX|PRI, 0 },
894   {"BF_NodeY_3F" , (CAST)BF_NodeY_3F , (CAST)BF_NodeY_D1_3F , (CAST)BF_NodeY_D2_3F , 3. , TRI|QUA|TET|HEX|PRI, 0 },
895   {"BF_NodeZ_3F" , (CAST)BF_NodeZ_3F , (CAST)BF_NodeZ_D1_3F , (CAST)BF_NodeZ_D2_3F , 3. , TRI|QUA|TET|HEX|PRI, 0 },
896 
897   {"BF_NodeX_3V" , (CAST)BF_NodeX_3V , (CAST)BF_NodeX_D1_3V , (CAST)BF_NodeX_D2_3V , 3. , HEX|PRI, 0 },
898   {"BF_NodeY_3V" , (CAST)BF_NodeY_3V , (CAST)BF_NodeY_D1_3V , (CAST)BF_NodeY_D2_3V , 3. , HEX|PRI, 0 },
899   {"BF_NodeZ_3V" , (CAST)BF_NodeZ_3V , (CAST)BF_NodeZ_D1_3V , (CAST)BF_NodeZ_D2_3V , 3. , HEX|PRI, 0 },
900 
901 
902   {"BF_NodeX_D1" , (CAST)BF_NodeX_D1 , (CAST)BF_Zero , (CAST)BF_Zero , 0. , ALL, 0 },
903   {"BF_NodeY_D1" , (CAST)BF_NodeY_D1 , (CAST)BF_Zero , (CAST)BF_Zero , 0. , ALL, 0 },
904   {"BF_NodeZ_D1" , (CAST)BF_NodeZ_D1 , (CAST)BF_Zero , (CAST)BF_Zero , 0. , ALL, 0 },
905 
906   {"BF_NodeX_D1_2E" , (CAST)BF_NodeX_D1_2E , (CAST)BF_Zero , (CAST)BF_Zero , 1. , ALL, 0 },
907   {"BF_NodeY_D1_2E" , (CAST)BF_NodeY_D1_2E , (CAST)BF_Zero , (CAST)BF_Zero , 1. , ALL, 0 },
908   {"BF_NodeZ_D1_2E" , (CAST)BF_NodeZ_D1_2E , (CAST)BF_Zero , (CAST)BF_Zero , 1. , ALL, 0 },
909 
910   {"BF_NodeX_D1_2F" , (CAST)BF_NodeX_D1_2F , (CAST)BF_Zero , (CAST)BF_Zero , 1. , QUA|HEX/*|PRI*/, 0 },
911   {"BF_NodeY_D1_2F" , (CAST)BF_NodeY_D1_2F , (CAST)BF_Zero , (CAST)BF_Zero , 1. , QUA|HEX/*|PRI*/, 0 },
912   {"BF_NodeZ_D1_2F" , (CAST)BF_NodeZ_D1_2F , (CAST)BF_Zero , (CAST)BF_Zero , 1. , QUA|HEX/*|PRI*/, 0 },
913 
914   {"BF_NodeX_D1_2V" , (CAST)BF_NodeX_D1_2V , (CAST)BF_Zero , (CAST)BF_Zero , 1. , HEX, 0 },
915   {"BF_NodeY_D1_2V" , (CAST)BF_NodeY_D1_2V , (CAST)BF_Zero , (CAST)BF_Zero , 1. , HEX, 0 },
916   {"BF_NodeZ_D1_2V" , (CAST)BF_NodeZ_D1_2V , (CAST)BF_Zero , (CAST)BF_Zero , 1. , HEX, 0 },
917 
918   {"BF_NodeX_D1_3E" , (CAST)BF_NodeX_D1_3E , (CAST)BF_Zero , (CAST)BF_Zero , 2. , ALL, 0 },
919   {"BF_NodeY_D1_3E" , (CAST)BF_NodeY_D1_3E , (CAST)BF_Zero , (CAST)BF_Zero , 2. , ALL, 0 },
920   {"BF_NodeZ_D1_3E" , (CAST)BF_NodeZ_D1_3E , (CAST)BF_Zero , (CAST)BF_Zero , 2. , ALL, 0 },
921 
922   {"BF_NodeX_D1_3F" , (CAST)BF_NodeX_D1_3F , (CAST)BF_Zero , (CAST)BF_Zero , 2. , TRI|QUA|TET|HEX|PRI, 0 },
923   {"BF_NodeY_D1_3F" , (CAST)BF_NodeY_D1_3F , (CAST)BF_Zero , (CAST)BF_Zero , 2. , TRI|QUA|TET|HEX|PRI, 0 },
924   {"BF_NodeZ_D1_3F" , (CAST)BF_NodeZ_D1_3F , (CAST)BF_Zero , (CAST)BF_Zero , 2. , TRI|QUA|TET|HEX|PRI, 0 },
925 
926   {"BF_NodeX_D1_3V" , (CAST)BF_NodeX_D1_3V , (CAST)BF_Zero , (CAST)BF_Zero , 2. , HEX|PRI, 0 },
927   {"BF_NodeY_D1_3V" , (CAST)BF_NodeY_D1_3V , (CAST)BF_Zero , (CAST)BF_Zero , 2. , HEX|PRI, 0 },
928   {"BF_NodeZ_D1_3V" , (CAST)BF_NodeZ_D1_3V , (CAST)BF_Zero , (CAST)BF_Zero , 2. , HEX|PRI, 0 },
929 
930 
931   {"BF_NodeX_D2" , (CAST)BF_NodeX_D2 , (CAST)BF_Zero , (CAST)BF_Zero , 0. , ALL, 0 },
932   {"BF_NodeY_D2" , (CAST)BF_NodeY_D2 , (CAST)BF_Zero , (CAST)BF_Zero , 0. , ALL, 0 },
933   {"BF_NodeZ_D2" , (CAST)BF_NodeZ_D2 , (CAST)BF_Zero , (CAST)BF_Zero , 0. , ALL, 0 },
934 
935   {"BF_NodeX_D2_2E" , (CAST)BF_NodeX_D2_2E , (CAST)BF_Zero , (CAST)BF_Zero , 1. , ALL, 0 },
936   {"BF_NodeY_D2_2E" , (CAST)BF_NodeY_D2_2E , (CAST)BF_Zero , (CAST)BF_Zero , 1. , ALL, 0 },
937   {"BF_NodeZ_D2_2E" , (CAST)BF_NodeZ_D2_2E , (CAST)BF_Zero , (CAST)BF_Zero , 1. , ALL, 0 },
938 
939   {"BF_NodeX_D2_2F" , (CAST)BF_NodeX_D2_2F , (CAST)BF_Zero , (CAST)BF_Zero , 1. , QUA|HEX/*|PRI*/, 0 },
940   {"BF_NodeY_D2_2F" , (CAST)BF_NodeY_D2_2F , (CAST)BF_Zero , (CAST)BF_Zero , 1. , QUA|HEX/*|PRI*/, 0 },
941   {"BF_NodeZ_D2_2F" , (CAST)BF_NodeZ_D2_2F , (CAST)BF_Zero , (CAST)BF_Zero , 1. , QUA|HEX/*|PRI*/, 0 },
942 
943   {"BF_NodeX_D2_2V" , (CAST)BF_NodeX_D2_2V , (CAST)BF_Zero , (CAST)BF_Zero , 1. , HEX, 0 },
944   {"BF_NodeY_D2_2V" , (CAST)BF_NodeY_D2_2V , (CAST)BF_Zero , (CAST)BF_Zero , 1. , HEX, 0 },
945   {"BF_NodeZ_D2_2V" , (CAST)BF_NodeZ_D2_2V , (CAST)BF_Zero , (CAST)BF_Zero , 1. , HEX, 0 },
946 
947   {"BF_NodeX_D2_3E" , (CAST)BF_NodeX_D2_3E , (CAST)BF_Zero , (CAST)BF_Zero , 2. , ALL, 0 },
948   {"BF_NodeY_D2_3E" , (CAST)BF_NodeY_D2_3E , (CAST)BF_Zero , (CAST)BF_Zero , 2. , ALL, 0 },
949   {"BF_NodeZ_D2_3E" , (CAST)BF_NodeZ_D2_3E , (CAST)BF_Zero , (CAST)BF_Zero , 2. , ALL, 0 },
950 
951   {"BF_NodeX_D2_3F" , (CAST)BF_NodeX_D2_3F , (CAST)BF_Zero , (CAST)BF_Zero , 2. , TRI|QUA|TET|HEX|PRI, 0 },
952   {"BF_NodeY_D2_3F" , (CAST)BF_NodeY_D2_3F , (CAST)BF_Zero , (CAST)BF_Zero , 2. , TRI|QUA|TET|HEX|PRI, 0 },
953   {"BF_NodeZ_D2_3F" , (CAST)BF_NodeZ_D2_3F , (CAST)BF_Zero , (CAST)BF_Zero , 2. , TRI|QUA|TET|HEX|PRI, 0 },
954 
955   {"BF_NodeX_D2_3V" , (CAST)BF_NodeX_D2_3V , (CAST)BF_Zero , (CAST)BF_Zero , 2. , HEX|PRI, 0 },
956   {"BF_NodeY_D2_3V" , (CAST)BF_NodeY_D2_3V , (CAST)BF_Zero , (CAST)BF_Zero , 2. , HEX|PRI, 0 },
957   {"BF_NodeZ_D2_3V" , (CAST)BF_NodeZ_D2_3V , (CAST)BF_Zero , (CAST)BF_Zero , 2. , HEX|PRI, 0 },
958 
959 
960   {"BF_NodeX_D12" , (CAST)BF_NodeX_D12 , (CAST)BF_Zero , (CAST)BF_Zero , 0. , ALL, 0 },
961   {"BF_NodeY_D12" , (CAST)BF_NodeY_D12 , (CAST)BF_Zero , (CAST)BF_Zero , 0. , ALL, 0 },
962   {"BF_NodeZ_D12" , (CAST)BF_NodeZ_D12 , (CAST)BF_Zero , (CAST)BF_Zero , 0. , ALL, 0 },
963 
964   {"BF_NodeX_D12_2E" , (CAST)BF_NodeX_D12_2E , (CAST)BF_Zero , (CAST)BF_Zero , 0. , ALL, 0 },
965   {"BF_NodeY_D12_2E" , (CAST)BF_NodeY_D12_2E , (CAST)BF_Zero , (CAST)BF_Zero , 0. , ALL, 0 },
966   {"BF_NodeZ_D12_2E" , (CAST)BF_NodeZ_D12_2E , (CAST)BF_Zero , (CAST)BF_Zero , 0. , ALL, 0 },
967 
968 
969   {"BF_GroupOfNodesX" , (CAST)BF_GroupOfNodesX , (CAST)BF_GroupOfNodesX_D1 , (CAST)BF_GroupOfNodesX_D2 , 1. , ALL, 0 },
970   {"BF_GroupOfNodesY" , (CAST)BF_GroupOfNodesY , (CAST)BF_GroupOfNodesY_D1 , (CAST)BF_GroupOfNodesY_D2 , 1. , ALL, 0 },
971   {"BF_GroupOfNodesZ" , (CAST)BF_GroupOfNodesZ , (CAST)BF_GroupOfNodesZ_D1 , (CAST)BF_GroupOfNodesZ_D2 , 1. , ALL, 0 },
972 
973   {"BF_GroupOfNodesX_D1" , (CAST)BF_GroupOfNodesX_D1 , (CAST)BF_Zero , (CAST)BF_Zero , 0. , ALL, 0 },
974   {"BF_GroupOfNodesY_D1" , (CAST)BF_GroupOfNodesY_D1 , (CAST)BF_Zero , (CAST)BF_Zero , 0. , ALL, 0 },
975   {"BF_GroupOfNodesZ_D1" , (CAST)BF_GroupOfNodesZ_D1 , (CAST)BF_Zero , (CAST)BF_Zero , 0. , ALL, 0 },
976 
977   {"BF_GroupOfNodesX_D2" , (CAST)BF_GroupOfNodesX_D2 , (CAST)BF_Zero , (CAST)BF_Zero , 0. , ALL, 0 },
978   {"BF_GroupOfNodesY_D2" , (CAST)BF_GroupOfNodesY_D2 , (CAST)BF_Zero , (CAST)BF_Zero , 0. , ALL, 0 },
979   {"BF_GroupOfNodesZ_D2" , (CAST)BF_GroupOfNodesZ_D2 , (CAST)BF_Zero , (CAST)BF_Zero , 0. , ALL, 0 },
980 
981   {"BF_GroupOfNodesX_D12" , (CAST)BF_GroupOfNodesX_D12 , (CAST)BF_Zero , (CAST)BF_Zero , 0. , ALL, 0 },
982   {"BF_GroupOfNodesY_D12" , (CAST)BF_GroupOfNodesY_D12 , (CAST)BF_Zero , (CAST)BF_Zero , 0. , ALL, 0 },
983   {"BF_GroupOfNodesZ_D12" , (CAST)BF_GroupOfNodesZ_D12 , (CAST)BF_Zero , (CAST)BF_Zero , 0. , ALL, 0 },
984 
985   // Special basis Functions
986 
987   {"BF_Zero", (CAST)BF_Zero, (CAST)BF_Zero, (CAST)BF_Zero, 0., ALL, 0 },
988   {"BF_One",  (CAST)BF_One,  (CAST)BF_Zero, (CAST)BF_One,  0., ALL, 0 },
989   {"BF_OneZ", (CAST)BF_OneZ, (CAST)BF_Zero, (CAST)BF_One,  0., ALL, 0 },
990 
991   {"BF_Region"  , (CAST)BF_Region   , (CAST)BF_dRegion  , (CAST)BF_Zero , 0. , ALL, 0 },
992   {"BF_RegionX" , (CAST)BF_RegionX  , (CAST)BF_dRegionX , (CAST)BF_Zero , 0. , ALL, 0 },
993   {"BF_RegionY" , (CAST)BF_RegionY  , (CAST)BF_dRegionY , (CAST)BF_Zero , 0. , ALL, 0 },
994   {"BF_RegionZ" , (CAST)BF_RegionZ  , (CAST)BF_dRegionZ , (CAST)BF_Zero , 0. , ALL, 0 },
995 
996   {"BF_Global"  , (CAST)BF_Global   , (CAST)BF_dGlobal , (CAST)BF_dInvGlobal , 0. , ALL, 0 },
997   {"BF_dGlobal" , (CAST)BF_dGlobal  , (CAST)BF_Zero    , (CAST)BF_Global, 0. , ALL, 0 },
998 
999   {NULL , NULL , NULL , NULL , 0. , ALL, 0 }
1000 } ;
1001 
1002 #undef POI
1003 #undef LIN
1004 #undef TRI
1005 #undef QUA
1006 #undef TET
1007 #undef HEX
1008 #undef PRI
1009 #undef PYR
1010 #undef ALL
1011 
1012 struct StringXFunction2Nbr  F_Function[] = {    /* #Par #Arg */
1013 
1014   /* #Par = -1 => free number of Parameters ; = -2 free even number */
1015   /* #Arg ... same */
1016 
1017   // F_Math
1018   {"Exp"               , (CAST)F_Exp              ,   0,   1 },
1019   {"Log"               , (CAST)F_Log              ,   0,   1 },
1020   {"Log10"             , (CAST)F_Log10            ,   0,   1 },
1021   {"Sqrt"              , (CAST)F_Sqrt             ,   0,   1 },
1022   {"Sin"               , (CAST)F_Sin              ,   0,   1 },
1023   {"Asin"              , (CAST)F_Asin             ,   0,   1 },
1024   {"Cos"               , (CAST)F_Cos              ,   0,   1 },
1025   {"Acos"              , (CAST)F_Acos             ,   0,   1 },
1026   {"Tan"               , (CAST)F_Tan              ,   0,   1 },
1027   {"Atan"              , (CAST)F_Atan             ,   0,   1 },
1028   {"Sinh"              , (CAST)F_Sinh             ,   0,   1 },
1029   {"Cosh"              , (CAST)F_Cosh             ,   0,   1 },
1030   {"Tanh"              , (CAST)F_Tanh             ,   0,   1 },
1031   {"Atanh"             , (CAST)F_Atanh            ,   0,   1 },
1032   {"Fabs"              , (CAST)F_Fabs             ,   0,   1 },
1033   {"Abs"               , (CAST)F_Abs              ,   0,   1 },
1034   {"Floor"             , (CAST)F_Floor            ,   0,   1 },
1035   {"Ceil"              , (CAST)F_Ceil             ,   0,   1 },
1036   {"Atan2"             , (CAST)F_Atan2            ,   0,   2 },
1037   {"Fmod"              , (CAST)F_Fmod             ,   0,   2 },
1038   {"Sign"              , (CAST)F_Sign             ,   0,   1 },
1039   {"Min"               , (CAST)F_Min              ,   0,   2 },
1040   {"Max"               , (CAST)F_Max              ,   0,   2 },
1041   {"Jn"                , (CAST)F_Jn               ,   0,   2 },
1042   {"JnComplex"         , (CAST)F_JnComplex        ,   0,   2 },
1043   {"KnComplex"         , (CAST)F_KnComplex        ,   0,   2 },
1044   {"Yn"                , (CAST)F_Yn               ,   0,   2 },
1045   {"dJn"               , (CAST)F_dJn              ,   0,   2 },
1046   {"dYn"               , (CAST)F_dYn              ,   0,   2 },
1047   {"JnSph"             , (CAST)F_JnSph            ,   0,   2 },
1048   {"YnSph"             , (CAST)F_YnSph            ,   0,   2 },
1049   {"dJnSph"            , (CAST)F_dJnSph           ,   0,   2 },
1050   {"dYnSph"            , (CAST)F_dYnSph           ,   0,   2 },
1051 
1052   // F_ExtMath
1053   {"Hypot"             , (CAST)F_Hypot            ,   0,   2 },
1054   {"TanhC2"            , (CAST)F_TanhC2           ,   0,   1 },
1055   {"Transpose"         , (CAST)F_Transpose        ,   0,   1 },
1056   {"Inv"               , (CAST)F_Inv              ,   0,   1 },
1057   {"Det"               , (CAST)F_Det              ,   0,   1 },
1058   {"TTrace"            , (CAST)F_Trace            ,   0,   1 },
1059   {"Rotate"            , (CAST)F_RotateXYZ        ,   0,   4 },
1060   {"Norm"              , (CAST)F_Norm             ,   0,   1 },
1061   {"SquNorm"           , (CAST)F_SquNorm          ,   0,   1 },
1062   {"Unit"              , (CAST)F_Unit             ,   0,   1 },
1063   {"ScalarUnit"        , (CAST)F_ScalarUnit       ,   0,   1 },
1064   {"Normalized"        , (CAST)F_Unit             ,   0,   1 },
1065   {"Cos_wt_p"          , (CAST)F_Cos_wt_p         ,   2,   0 },
1066   {"Sin_wt_p"          , (CAST)F_Sin_wt_p         ,   2,   0 },
1067   {"F_Cos_wt_p"        , (CAST)F_Cos_wt_p         ,   2,   0 },
1068   {"F_Sin_wt_p"        , (CAST)F_Sin_wt_p         ,   2,   0 },
1069   {"Period"            , (CAST)F_Period           ,   1,   1 },
1070   {"F_Period"          , (CAST)F_Period           ,   1,   1 },
1071   {"Interval"          , (CAST)F_Interval         ,   3,   3 },
1072   {"Complex"           , (CAST)F_Complex          ,  -2,  -2 },
1073   {"Complex_MH"        , (CAST)F_Complex_MH       ,  -1,  -2 },
1074   {"Re"                , (CAST)F_Re               ,   0,   1 },
1075   {"Im"                , (CAST)F_Im               ,   0,   1 },
1076   {"Conj"              , (CAST)F_Conj             ,   0,   1 },
1077   {"Cart2Pol"          , (CAST)F_Cart2Pol         ,   0,   1 },
1078   {"Vector"            , (CAST)F_Vector           ,   0,   3 },
1079   {"Tensor"            , (CAST)F_Tensor           ,   0,   9 },
1080   {"TensorV"           , (CAST)F_TensorV          ,   0,   3 },
1081   {"TensorSym"         , (CAST)F_TensorSym        ,   0,   6 },
1082   {"TensorDiag"        , (CAST)F_TensorDiag       ,   0,   3 },
1083   {"SquDyadicProduct"  , (CAST)F_SquDyadicProduct ,   0,   1 },
1084   {"Comp"              , (CAST)F_Comp             ,   1,   1 },
1085   {"CompX"             , (CAST)F_CompX            ,   0,   1 },
1086   {"CompY"             , (CAST)F_CompY            ,   0,   1 },
1087   {"CompZ"             , (CAST)F_CompZ            ,   0,   1 },
1088   {"CompXX"            , (CAST)F_CompXX           ,   0,   1 },
1089   {"CompXY"            , (CAST)F_CompXY           ,   0,   1 },
1090   {"CompXZ"            , (CAST)F_CompXZ           ,   0,   1 },
1091   {"CompYX"            , (CAST)F_CompYX           ,   0,   1 },
1092   {"CompYY"            , (CAST)F_CompYY           ,   0,   1 },
1093   {"CompYZ"            , (CAST)F_CompYZ           ,   0,   1 },
1094   {"CompZX"            , (CAST)F_CompZX           ,   0,   1 },
1095   {"CompZY"            , (CAST)F_CompZY           ,   0,   1 },
1096   {"CompZZ"            , (CAST)F_CompZZ           ,   0,   1 },
1097   {"Cart2Sph"          , (CAST)F_Cart2Sph         ,   0,   1 },
1098   {"Cart2Cyl"          , (CAST)F_Cart2Cyl         ,   0,   1 },
1099   {"UnitVectorX"       , (CAST)F_UnitVectorX      ,   0,   0 },
1100   {"UnitVectorY"       , (CAST)F_UnitVectorY      ,   0,   0 },
1101   {"UnitVectorZ"       , (CAST)F_UnitVectorZ      ,   0,   0 },
1102 
1103   // F_Coord
1104   {"CoordX"            , (CAST)F_CoordX           ,   0,   0 },
1105   {"CoordY"            , (CAST)F_CoordY           ,   0,   0 },
1106   {"CoordZ"            , (CAST)F_CoordZ           ,   0,   0 },
1107   {"CoordXYZ"          , (CAST)F_CoordXYZ         ,   0,   0 },
1108   {"X"                 , (CAST)F_CoordX           ,   0,   0 },
1109   {"Y"                 , (CAST)F_CoordY           ,   0,   0 },
1110   {"Z"                 , (CAST)F_CoordZ           ,   0,   0 },
1111   {"XYZ"               , (CAST)F_CoordXYZ         ,   0,   0 },
1112   {"F_aX_bY_cZ"        , (CAST)F_aX_bY_cZ         ,   3,   0 },
1113   {"F_aX21_bY21_cZ21"  , (CAST)F_aX21_bY21_cZ21   ,   3,   0 },
1114   {"XS"                , (CAST)F_CoordXS          ,   0,   0 },
1115   {"YS"                , (CAST)F_CoordYS          ,   0,   0 },
1116   {"ZS"                , (CAST)F_CoordZS          ,   0,   0 },
1117   {"XYZS"              , (CAST)F_CoordXYZS        ,   0,   0 },
1118 
1119   // F_Geometry
1120   {"Normal"            , (CAST)F_Normal           ,   0,   0 },
1121   {"NormalSource"      , (CAST)F_NormalSource     ,   0,   0 },
1122   {"Tangent"           , (CAST)F_Tangent          ,   0,   0 },
1123   {"TangentSource"     , (CAST)F_TangentSource    ,   0,   0 },
1124   {"ElementVol"        , (CAST)F_ElementVol       ,   0,   0 },
1125   {"SurfaceArea"       , (CAST)F_SurfaceArea      ,  -1,   0 },
1126   {"GetVolume"         , (CAST)F_GetVolume        ,  -1,   0 },
1127   {"GetNumElement"     , (CAST)F_GetNumElement    ,   0,   0 },
1128   {"GetNumElements"    , (CAST)F_GetNumElements   ,  -1,   0 },
1129   {"GetNumNodes"       , (CAST)F_GetNumNodes      ,   0,   0 },
1130   {"CellSize"          , (CAST)F_CellSize         ,  -1,   0 },
1131   {"ProjectPointOnEllipse", (CAST)F_ProjectPointOnEllipse,  2, 1 },
1132   {"SquNormEdgeValues" , (CAST)F_SquNormEdgeValues,   2,   0 },
1133 
1134   // F_Misc
1135   {"Printf"            , (CAST)F_Printf           ,   0,   1 },
1136   {"Rand"              , (CAST)F_Rand             ,   0,   1 },
1137   {"CompElementNum"    , (CAST)F_CompElementNum   ,   0,   0 },
1138   {"ElementNum"        , (CAST)F_ElementNum       ,   0,   0 },
1139   {"QuadraturePointIndex" , (CAST)F_QuadraturePointIndex ,   0,   0 },
1140   {"CpuTime"           , (CAST)F_GetCpuTime       ,   0,   0 },
1141   {"GetCpuTime"        , (CAST)F_GetCpuTime       ,   0,   0 },
1142   {"GetWallClockTime"  , (CAST)F_GetWallClockTime ,   0,   0 },
1143   {"Memory"            , (CAST)F_GetMemory        ,   0,   0 },
1144   {"GetMemory"         , (CAST)F_GetMemory        ,   0,   0 },
1145   {"SetNumberRunTime"  , (CAST)F_SetNumberRunTime ,  -1,  -1 },
1146   {"SetNumberRunTimeWithChoices"  , (CAST)F_SetNumberRunTimeWithChoices ,  -1,  -1 },
1147   {"GetNumberRunTime"  , (CAST)F_GetNumberRunTime ,  -1,  -1 },
1148   {"SetVariable"       , (CAST)F_SetVariable      ,  -1,  -1 },
1149   {"SetCumulativeVariable" , (CAST)F_SetCumulativeVariable ,  -1,  -1 },
1150   {"GetVariable"       , (CAST)F_GetVariable      ,  -1,  -1 },
1151   {"ValueFromTable"    , (CAST)F_ValueFromTable   ,  -1,  -1 },
1152   {"VirtualWork"       , (CAST)F_VirtualWork      ,   0,   1 },
1153   {"Felec"	       , (CAST)F_Felec      	  ,   0,   1 },
1154 
1155   {"dFxdux"	       , (CAST)F_dFxdux      	  ,   0,   1 },
1156   {"dFydux"	       , (CAST)F_dFydux      	  ,   0,   1 },
1157   {"dFzdux"	       , (CAST)F_dFzdux      	  ,   0,   1 },
1158   {"dFxduy"	       , (CAST)F_dFxduy      	  ,   0,   1 },
1159   {"dFyduy"	       , (CAST)F_dFyduy      	  ,   0,   1 },
1160   {"dFzduy"	       , (CAST)F_dFzduy      	  ,   0,   1 },
1161   {"dFxduz"	       , (CAST)F_dFxduz      	  ,   0,   1 },
1162   {"dFyduz"	       , (CAST)F_dFyduz      	  ,   0,   1 },
1163   {"dFzduz"	       , (CAST)F_dFzduz      	  ,   0,   1 },
1164 
1165   {"dFxdv"             , (CAST)F_dFxdv      	  ,   0,   1 },
1166   {"dFydv"             , (CAST)F_dFydv      	  ,   0,   1 },
1167   {"dFzdv"             , (CAST)F_dFzdv      	  ,   0,   1 },
1168 
1169   {"dWedxdv"	       , (CAST)F_dWedxdv      	  ,   0,   1 },
1170   {"dWedydv"	       , (CAST)F_dWedydv      	  ,   0,   1 },
1171   {"dWedzdv"	       , (CAST)F_dWedzdv      	  ,   0,   1 },
1172 
1173   {"NodeForceDensity"  , (CAST)F_NodeForceDensity ,   0,   1 },
1174   {"AssDiag"           , (CAST)F_AssDiag          ,  -1,   0 },
1175 
1176   {"AtIndex"           , (CAST)F_AtIndex          ,  -1,   1 },
1177 
1178   // F_Interpolation
1179   {"InterpolationLinear"    , (CAST)F_InterpolationLinear    ,  -2,   1 },
1180   {"dInterpolationLinear"   , (CAST)F_dInterpolationLinear   ,  -2,   1 },
1181   {"dInterpolationLinear2"  , (CAST)F_dInterpolationLinear2  ,  -2,   1 },
1182   {"InterpolationAkima"     , (CAST)F_InterpolationAkima     ,  -2,   1 },
1183   {"dInterpolationAkima"    , (CAST)F_dInterpolationAkima    ,  -2,   1 },
1184   {"InterpolationBilinear"  , (CAST)F_InterpolationBilinear  ,  -1,   2 },
1185   {"dInterpolationBilinear" , (CAST)F_dInterpolationBilinear ,  -1,   2 },
1186   {"InterpolationTrilinear" , (CAST)F_InterpolationTrilinear ,  -1,   3 },
1187   {"dInterpolationTrilinear", (CAST)F_dInterpolationTrilinear,  -1,   3 },
1188   {"ValueFromIndex"         , (CAST)F_ValueFromIndex         ,  -1,   0 },
1189   {"VectorFromIndex"        , (CAST)F_VectorFromIndex        ,  -1,   0 },
1190 
1191   // F_Hysteresis
1192   {"dhdb_Jiles"            , (CAST)F_dhdb_Jiles            ,  -1,   3 },
1193   {"dbdh_Jiles"            , (CAST)F_dbdh_Jiles            ,  -1,   3 },
1194   {"h_Jiles"               , (CAST)F_h_Jiles               ,  -1,   3 },
1195   {"b_Jiles"               , (CAST)F_b_Jiles               ,  -1,   3 },
1196   {"dhdb_Ducharne"         , (CAST)F_dhdb_Ducharne         ,  -1,   3 },
1197   {"h_Ducharne"            , (CAST)F_h_Ducharne            ,  -1,   3 },
1198   {"nu_Ducharne"           , (CAST)F_nu_Ducharne           ,  -1,   3 },
1199   //{"mu_Vinch"              , (CAST)F_mu_Vinch              ,  -1,   3 }, // NOT USED FOR NOW (26/06/2016)
1200   //{"nu_Vinch"              , (CAST)F_nu_Vinch              ,  -1,   3 }, // NOT USED FOR NOW (26/06/2016)
1201   //{"h_Vinch"               , (CAST)F_h_Vinch               ,  -1,   4 }, // NOT USED FOR NOW (26/06/2016)
1202   //{"dhdb_Vinch"            , (CAST)F_dhdb_Vinch            ,  -1,   3 }, // NOT USED FOR NOW (26/06/2016)
1203   //{"dbdh_Vinch"            , (CAST)F_dbdh_Vinch            ,  -1,   3 }, // NOT USED FOR NOW (26/06/2016)
1204   //{"Update_Jk"             , (CAST)F_Update_Jk             ,  -1,   6 },  //kj+++ // NOT USED FOR NOW (26/06/2016)
1205   //{"Update_Jk_sd"          , (CAST)F_Update_Jk_sd          ,  -1,   6 },  //kj+++ // NOT USED FOR NOW (26/06/2016)
1206 
1207   {"Update_Cell_K"         , (CAST)F_Update_Cell_K         ,  -1,   4 },  //kj+++
1208   {"b_Vinch_K"             , (CAST)F_b_Vinch_K             ,  -1,   -1 },  // 1+3*2=7 //kj+++
1209   {"hr_Vinch_K"            , (CAST)F_hr_Vinch_K            ,  -1,   -1 },  // 1+3*1=4 //kj+++
1210   {"Jr_Vinch_K"            , (CAST)F_Jr_Vinch_K            ,  -1,   -1 },  // 1+3*1=4 //kj+++
1211   {"h_Vinch_K"             , (CAST)F_h_Vinch_K             ,  -1,   -1 },  // parameter is dimension {2},{3}, 3+3*2=9 //kj+++
1212   {"dbdh_Vinch_K"          , (CAST)F_dbdh_Vinch_K          ,  -1,   -1 },  // parameter is dimension {2},{3}, 1+3*2=7 //kj+++
1213   {"dhdb_Vinch_K"          , (CAST)F_dhdb_Vinch_K          ,  -1,   -1 },  // parameter is dimension {2},{3}, 1+3*2=7 //kj+++
1214 
1215   {"Cell_EB"          , (CAST)F_Cell_EB          ,  -1,   3  },  //kj+++
1216   {"b_EB"             , (CAST)F_b_EB             ,  -1,   -1 },  // 1+3*2=7 //kj+++
1217   {"hrev_EB"          , (CAST)F_hrev_EB          ,  -1,   -1 },  // 1+3*1=4 //kj+++
1218   {"Jrev_EB"          , (CAST)F_Jrev_EB          ,  -1,   -1 },  // 1+3*1=4 //kj+++
1219   {"h_EB"             , (CAST)F_h_EB             ,  -1,   -1 },  // parameter is dimension {2},{3}, 3+3*2=9 //kj+++
1220   {"dbdh_EB"          , (CAST)F_dbdh_EB          ,  -1,   -1 },  // parameter is dimension {2},{3}, 1+3*2=7 //kj+++
1221   {"dhdb_EB"          , (CAST)F_dhdb_EB          ,  -1,   -1 },  // parameter is dimension {2},{3}, 1+3*2=7 //kj+++
1222 
1223 
1224   // F_MultiHar
1225   {"MHToTime"          , (CAST)F_MHToTime         ,   0,   2 },
1226 
1227   // F_Analytic
1228   {"JFIE_ZPolAnalyticOnCyl",      (CAST)F_JFIE_ZPolCyl     ,   4,   1 },
1229   {"RCS_ZPolAnalyticCyl",         (CAST)F_RCS_ZPolCyl      ,   3,   1 },
1230   {"JFIE_TransZPolAnalyticOnCyl", (CAST)F_JFIE_TransZPolCyl,   3,   1 },
1231   {"JFIE_OnSphCutTheta",          (CAST)F_JFIE_SphTheta,       4,   1 },
1232   {"RCS_SphTheta",                (CAST)F_RCS_SphTheta,        4,   1 },
1233   {"JFIE_OnSphCutPhi",            (CAST)F_JFIE_SphPhi,         4,   1 },
1234   {"RCS_SphPhi",                  (CAST)F_RCS_SphPhi,          4,   1 },
1235   {"CurrentPerfectlyConductingSphere",(CAST)F_CurrentPerfectlyConductingSphere,  3, 1 },
1236 
1237   {"ElectricFieldPerfectlyConductingSphereMwt", (CAST)F_ElectricFieldPerfectlyConductingSphereMwt,  2, 1 },
1238   {"ElectricFieldDielectricSphereMwt", (CAST)F_ElectricFieldDielectricSphereMwt,  2, 1 },
1239   {"ExactOsrcSolutionPerfectlyConductingSphereMwt", (CAST)F_ExactOsrcSolutionPerfectlyConductingSphereMwt,  3, 1 },
1240   {"CurrentPerfectlyConductingSphereMwt",(CAST)F_CurrentPerfectlyConductingSphereMwt,  3, 1 },
1241 
1242   {"AcousticFieldSoftSphere",         (CAST)F_AcousticFieldSoftSphere, -1, 1 },
1243   {"AcousticFieldSoftSphereABC",      (CAST)F_AcousticFieldSoftSphereABC, 5, 1 },
1244   {"DrAcousticFieldSoftSphere",       (CAST)F_DrAcousticFieldSoftSphere, 2, 1 },
1245   {"RCSSoftSphere",                   (CAST)F_RCSSoftSphere,  2, 1 },
1246   {"AcousticFieldHardSphere",         (CAST)F_AcousticFieldHardSphere, -1, 1 },
1247   {"RCSHardSphere",                   (CAST)F_RCSHardSphere,  2, 1 },
1248   {"AcousticFieldSoftCylinder",       (CAST)F_AcousticFieldSoftCylinder, -1, 1 },
1249   {"AcousticFieldSoftCylinderABC",    (CAST)F_AcousticFieldSoftCylinderABC, 5, 1 },
1250   {"DrAcousticFieldSoftCylinder",     (CAST)F_DrAcousticFieldSoftCylinder, 2, 1 },
1251   {"RCSSoftCylinder",                 (CAST)F_RCSSoftCylinder,  2, 1 },
1252   {"AcousticFieldHardCylinder",       (CAST)F_AcousticFieldHardCylinder, -1, 1 },
1253   {"AcousticFieldHardCylinderABC",    (CAST)F_AcousticFieldHardCylinderABC, 5, 1 },
1254   {"DthetaAcousticFieldHardCylinder", (CAST)F_DthetaAcousticFieldHardCylinder, 2, 1 },
1255   {"RCSHardCylinder",                 (CAST)F_RCSHardCylinder,  2, 1 },
1256   {"OSRC_C0",   (CAST)F_OSRC_C0, 2, 0},
1257   {"OSRC_R0",   (CAST)F_OSRC_R0, 2, 0},
1258   {"OSRC_Aj",   (CAST)F_OSRC_Aj, 3, 0},
1259   {"OSRC_Bj",   (CAST)F_OSRC_Bj, 3, 0},
1260 
1261   {"pnm"               , (CAST)F_pnm              ,   0,   3 },
1262   {"unm"               , (CAST)F_unm              ,   0,   3 },
1263   {"snm"               , (CAST)F_snm              ,   0,   3 },
1264   {"Xnm"               , (CAST)F_Xnm              ,   0,   5 },
1265   {"Ynm"               , (CAST)F_Ynm              ,   0,   5 },
1266   {"Znm"               , (CAST)F_Znm              ,   0,   5 },
1267   {"Mnm"               , (CAST)F_Mnm              ,   0,   5 },
1268   {"Nnm"               , (CAST)F_Nnm              ,   0,   5 },
1269 
1270   {"DyadGreenHom"      , (CAST)F_DyadGreenHom     ,   0,   6 },
1271   {"CurlDyadGreenHom"  , (CAST)F_CurlDyadGreenHom ,   0,   6 },
1272 
1273   // F_PeWe
1274   {"ElastodynamicsCylinderCavity", (CAST)F_ElastodynamicsCylinderCavity, 5, 1},
1275   {"ElastodynamicsCylinderWall", (CAST)F_ElastodynamicsCylinderWall, 5, 1},
1276   {"ElastodynamicsCylinderWallS", (CAST)F_ElastodynamicsCylinderWallS, 5, 1},
1277   {"ElastodynamicsCylinderWallOut", (CAST)F_ElastodynamicsCylinderWallOut, 5, 1},
1278   {"ElastodynamicsCylinderWallsOut", (CAST)F_ElastodynamicsCylinderWallsOut, 5, 1},
1279   {"ElastoCylinderWallOutAbc",(CAST)F_ElastoCylinderWallOutAbc, 6, 1},
1280   {"ElastoCylinderWallsOutAbc",(CAST)F_ElastoCylinderWallsOutAbc, 6, 1},
1281   {"ElastoCylinderWallOutAbc2",(CAST)F_ElastoCylinderWallOutAbc2, 6, 1},
1282   {"ElastoCylinderWallOutAbc2Pade",(CAST)F_ElastoCylinderWallOutAbc2Pade, 10, 1},
1283   {"ElastoCylinderWallsOutAbc2Pade",(CAST)F_ElastoCylinderWallsOutAbc2Pade, 10, 1},
1284 
1285 
1286   // F_Raytracing: ray tracing functions
1287   {"CylinderPhase",      (CAST)F_CylinderPhase, 0, 1 },
1288   {"DiamondPhase",       (CAST)F_DiamondPhase,  0, 1 },
1289 
1290   // F_BiotSavart
1291   {"BiotSavart",         (CAST)F_BiotSavart        ,   1,   0 },
1292   {"Pocklington",        (CAST)F_Pocklington       ,   2,   0 },
1293 
1294   // F_Gmsh
1295   {"Field",              (CAST)F_Field             ,   -1,   -1 },
1296   {"ScalarField",        (CAST)F_ScalarField       ,   -1,   -1 },
1297   {"VectorField",        (CAST)F_VectorField       ,   -1,   -1 },
1298   {"TensorField",        (CAST)F_TensorField       ,   -1,   -1 },
1299   {"ComplexScalarField", (CAST)F_ComplexScalarField,   -1,   -1 },
1300   {"ComplexVectorField", (CAST)F_ComplexVectorField,   -1,   -1 },
1301   {"ComplexTensorField", (CAST)F_ComplexTensorField,   -1,   -1 },
1302   {"GradScalarField",        (CAST)F_GradScalarField       ,   -1,   -1 },
1303   {"GradVectorField",        (CAST)F_GradVectorField       ,   -1,   -1 },
1304   {"GradComplexScalarField", (CAST)F_GradComplexScalarField,   -1,   -1 },
1305   {"GradComplexVectorField", (CAST)F_GradComplexVectorField,   -1,   -1 },
1306   {"Distance",           (CAST)F_Distance          ,    1,   1 },
1307 
1308   // F_DiffGeom
1309   {"Hodge",              (CAST)F_Hodge             ,    1,   2 },
1310   {"Sharp",              (CAST)F_Sharp             ,    1,   2 },
1311   {"Flat",               (CAST)F_Flat              ,    1,   2 },
1312   {"InnerProduct",       (CAST)F_InnerProduct      ,    1,   3 },
1313   {"WedgeProduct",       (CAST)F_WedgeProduct      ,    2,   2 },
1314   {"InteriorProduct",    (CAST)F_InteriorProduct   ,    1,   2 },
1315   {"TensorProduct",      (CAST)F_TensorProduct     ,    0,   2 },
1316   {"PullBack",           (CAST)F_PullBack          ,    1,   2 },
1317   {"PullBackMetric",     (CAST)F_PullBackMetric    ,    0,   2 },
1318   {"PushForward",        (CAST)F_PushForward       ,    1,   2 },
1319   {"InvPullBack",        (CAST)F_InvPullBack       ,    1,   2 },
1320   {"InvPushForward",     (CAST)F_InvPushForward    ,    1,   2 },
1321 
1322   // F_Octave
1323   {"Octave",             (CAST)F_Octave            ,    -1,   -1 },
1324 
1325   // F_Python
1326   {"Python",             (CAST)F_Python            ,    -1,   -1 },
1327 
1328   // GF_XXX : Green Functions
1329   {"Laplace"           , (CAST)GF_Laplace          ,   1,   0 },
1330   {"GradLaplace"       , (CAST)GF_GradLaplace      ,   1,   0 },
1331   {"NPxGradLaplace"    , (CAST)GF_NPxGradLaplace   ,   1,   0 },
1332   {"NSxGradLaplace"    , (CAST)GF_NSxGradLaplace   ,   1,   0 },
1333   {"ApproximateLaplace", (CAST)GF_ApproximateLaplace,  2,   0 },
1334   {"Helmholtz"         , (CAST)GF_Helmholtz        ,   2,   0 },
1335   {"HelmholtzThinWire" , (CAST)GF_HelmholtzThinWire,   3,   0 },
1336   {"GradHelmholtz"     , (CAST)GF_GradHelmholtz    ,   2,   0 },
1337   {"NPxGradHelmholtz"  , (CAST)GF_NPxGradHelmholtz ,   2,   0 },
1338   {"NSxGradHelmholtz"  , (CAST)GF_NSxGradHelmholtz ,   2,   0 },
1339 
1340   {NULL                , NULL                      ,   0,   0 }
1341 
1342 } ;
1343 
1344 struct FunctionXFunction  GF_Function[] = {
1345   {(CAST)GF_Laplace         , (CAST)GF_LaplacexForm        } ,
1346   {(CAST)GF_GradLaplace     , (CAST)GF_GradLaplacexForm    } ,
1347   {(CAST)GF_NPxGradLaplace  , (CAST)GF_NPxGradLaplacexForm } ,
1348   {(CAST)GF_NSxGradLaplace  , (CAST)GF_NSxGradLaplacexForm } ,
1349   {(CAST)GF_ApproximateLaplace  , (CAST)GF_ApproximateLaplacexForm  } ,
1350   {(CAST)GF_Helmholtz         , (CAST)GF_HelmholtzxForm        } ,
1351 
1352   {NULL                       , NULL }
1353 } ;
1354 
1355 #undef CAST
1356 
1357 #endif
1358