$extrastylesheet
fe_interface_inf_fe.C
Go to the documentation of this file.
00001 // The libMesh Finite Element Library.
00002 // Copyright (C) 2002-2014 Benjamin S. Kirk, John W. Peterson, Roy H. Stogner
00003 
00004 // This library is free software; you can redistribute it and/or
00005 // modify it under the terms of the GNU Lesser General Public
00006 // License as published by the Free Software Foundation; either
00007 // version 2.1 of the License, or (at your option) any later version.
00008 
00009 // This library is distributed in the hope that it will be useful,
00010 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00011 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012 // Lesser General Public License for more details.
00013 
00014 // You should have received a copy of the GNU Lesser General Public
00015 // License along with this library; if not, write to the Free Software
00016 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00017 
00018 
00019 
00020 // Local includes
00021 #include "libmesh/libmesh_config.h"
00022 
00023 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS
00024 
00025 #include "libmesh/fe_interface.h"
00026 #include "libmesh/inf_fe.h"
00027 
00028 namespace libMesh
00029 {
00030 
00031 
00032 
00033 
00034 //------------------------------------------------------------
00035 //FEInterface class members handling calls to InfFE
00036 
00037 
00038 
00039 unsigned int FEInterface::ifem_n_shape_functions(const unsigned int dim,
00040                                                  const FEType& fe_t,
00041                                                  const ElemType t)
00042 {
00043   switch (dim)
00044     {
00045       // 1D
00046     case 1:
00047       /*
00048        * Since InfFE<Dim,T_radial,T_map>::n_shape_functions(...)
00049        * is actually independent of T_radial and T_map, we can use
00050        * just any T_radial and T_map
00051        */
00052       return InfFE<1,JACOBI_20_00,CARTESIAN>::n_shape_functions(fe_t, t);
00053 
00054       // 2D
00055     case 2:
00056       return InfFE<2,JACOBI_20_00,CARTESIAN>::n_shape_functions(fe_t, t);
00057 
00058       // 3D
00059     case 3:
00060       return InfFE<3,JACOBI_20_00,CARTESIAN>::n_shape_functions(fe_t, t);
00061 
00062     default:
00063       libmesh_error_msg("Unsupported dim = " << dim);
00064     }
00065 
00066   libmesh_error_msg("We'll never get here!");
00067   return 0;
00068 }
00069 
00070 
00071 
00072 
00073 
00074 unsigned int FEInterface::ifem_n_dofs(const unsigned int dim,
00075                                       const FEType& fe_t,
00076                                       const ElemType t)
00077 {
00078   switch (dim)
00079     {
00080       // 1D
00081     case 1:
00082       /*
00083        * Since InfFE<Dim,T_radial,T_map>::n_dofs(...)
00084        * is actually independent of T_radial and T_map, we can use
00085        * just any T_radial and T_map
00086        */
00087       return InfFE<1,JACOBI_20_00,CARTESIAN>::n_dofs(fe_t, t);
00088 
00089       // 2D
00090     case 2:
00091       return InfFE<2,JACOBI_20_00,CARTESIAN>::n_dofs(fe_t, t);
00092 
00093       // 3D
00094     case 3:
00095       return InfFE<3,JACOBI_20_00,CARTESIAN>::n_dofs(fe_t, t);
00096 
00097     default:
00098       libmesh_error_msg("Unsupported dim = " << dim);
00099     }
00100 
00101   libmesh_error_msg("We'll never get here!");
00102   return 0;
00103 }
00104 
00105 
00106 
00107 
00108 unsigned int FEInterface::ifem_n_dofs_at_node(const unsigned int dim,
00109                                               const FEType& fe_t,
00110                                               const ElemType t,
00111                                               const unsigned int n)
00112 {
00113   switch (dim)
00114     {
00115       // 1D
00116     case 1:
00117       /*
00118        * Since InfFE<Dim,T_radial,T_map>::n_dofs_at_node(...)
00119        * is actually independent of T_radial and T_map, we can use
00120        * just any T_radial and T_map
00121        */
00122       return InfFE<1,JACOBI_20_00,CARTESIAN>::n_dofs_at_node(fe_t, t, n);
00123 
00124       // 2D
00125     case 2:
00126       return InfFE<2,JACOBI_20_00,CARTESIAN>::n_dofs_at_node(fe_t, t, n);
00127 
00128       // 3D
00129     case 3:
00130       return InfFE<3,JACOBI_20_00,CARTESIAN>::n_dofs_at_node(fe_t, t, n);
00131 
00132     default:
00133       libmesh_error_msg("Unsupported dim = " << dim);
00134     }
00135 
00136   libmesh_error_msg("We'll never get here!");
00137   return 0;
00138 }
00139 
00140 
00141 
00142 
00143 
00144 unsigned int FEInterface::ifem_n_dofs_per_elem(const unsigned int dim,
00145                                                const FEType& fe_t,
00146                                                const ElemType t)
00147 {
00148   switch (dim)
00149     {
00150       // 1D
00151     case 1:
00152       /*
00153        * Since InfFE<Dim,T_radial,T_map>::n_dofs(...)
00154        * is actually independent of T_radial and T_map, we can use
00155        * just any T_radial and T_map
00156        */
00157       return InfFE<1,JACOBI_20_00,CARTESIAN>::n_dofs_per_elem(fe_t, t);
00158 
00159       // 2D
00160     case 2:
00161       return InfFE<2,JACOBI_20_00,CARTESIAN>::n_dofs_per_elem(fe_t, t);
00162 
00163       // 3D
00164     case 3:
00165       return InfFE<3,JACOBI_20_00,CARTESIAN>::n_dofs_per_elem(fe_t, t);
00166 
00167     default:
00168       libmesh_error_msg("Unsupported dim = " << dim);
00169     }
00170 
00171   libmesh_error_msg("We'll never get here!");
00172   return 0;
00173 }
00174 
00175 
00176 
00177 
00178 void FEInterface::ifem_nodal_soln(const unsigned int dim,
00179                                   const FEType& fe_t,
00180                                   const Elem* elem,
00181                                   const std::vector<Number>& elem_soln,
00182                                   std::vector<Number>& nodal_soln)
00183 {
00184   switch (dim)
00185     {
00186 
00187       // 1D
00188     case 1:
00189       {
00190         switch (fe_t.radial_family)
00191           {
00192           case INFINITE_MAP:
00193             libmesh_error_msg("ERROR: INFINTE_MAP is not a valid shape family for radial approximation.");
00194 
00195           case JACOBI_20_00:
00196             {
00197               switch (fe_t.inf_map)
00198                 {
00199                 case CARTESIAN:
00200                   {
00201                     InfFE<1,JACOBI_20_00,CARTESIAN>::nodal_soln(fe_t, elem, elem_soln, nodal_soln);
00202                     break;
00203                   }
00204                 default:
00205                   libmesh_error_msg("ERROR: Spherical & Ellipsoidal IFEMs not implemented.");
00206                 }
00207               break;
00208             }
00209 
00210           case JACOBI_30_00:
00211             {
00212               switch (fe_t.inf_map)
00213                 {
00214                 case CARTESIAN:
00215                   {
00216                     InfFE<1,JACOBI_30_00,CARTESIAN>::nodal_soln(fe_t, elem, elem_soln, nodal_soln);
00217                     break;
00218                   }
00219                 default:
00220                   libmesh_error_msg("ERROR: Spherical & Ellipsoidal IFEMs not implemented.");
00221                 }
00222               break;
00223             }
00224 
00225           case LEGENDRE:
00226             {
00227               switch (fe_t.inf_map)
00228                 {
00229                 case CARTESIAN:
00230                   {
00231                     InfFE<1,LEGENDRE,CARTESIAN>::nodal_soln(fe_t, elem, elem_soln, nodal_soln);
00232                     break;
00233                   }
00234                 default:
00235                   libmesh_error_msg("ERROR: Spherical & Ellipsoidal IFEMs not implemented.");
00236                 }
00237               break;
00238             }
00239 
00240           case LAGRANGE:
00241             {
00242               switch (fe_t.inf_map)
00243                 {
00244                 case CARTESIAN:
00245                   {
00246                     InfFE<1,LAGRANGE,CARTESIAN>::nodal_soln(fe_t, elem, elem_soln, nodal_soln);
00247                     break;
00248                   }
00249                 default:
00250                   libmesh_error_msg("ERROR: Spherical & Ellipsoidal IFEMs not implemented.");
00251                 }
00252               break;
00253             }
00254 
00255           default:
00256             libmesh_error_msg("ERROR: Bad FEType.radial_family= " << fe_t.radial_family);
00257           }
00258 
00259         break;
00260       }
00261 
00262 
00263 
00264 
00265       // 2D
00266     case 2:
00267       {
00268         switch (fe_t.radial_family)
00269           {
00270           case INFINITE_MAP:
00271             libmesh_error_msg("ERROR: INFINTE_MAP is not a valid shape family for radial approximation.");
00272 
00273           case JACOBI_20_00:
00274             {
00275               switch (fe_t.inf_map)
00276                 {
00277                 case CARTESIAN:
00278                   {
00279                     InfFE<2,JACOBI_20_00,CARTESIAN>::nodal_soln(fe_t, elem, elem_soln, nodal_soln);
00280                     break;
00281                   }
00282                 default:
00283                   libmesh_error_msg("ERROR: Spherical & Ellipsoidal IFEMs not implemented.");
00284                 }
00285               break;
00286             }
00287 
00288           case JACOBI_30_00:
00289             {
00290               switch (fe_t.inf_map)
00291                 {
00292                 case CARTESIAN:
00293                   {
00294                     InfFE<2,JACOBI_30_00,CARTESIAN>::nodal_soln(fe_t, elem, elem_soln, nodal_soln);
00295                     break;
00296                   }
00297                 default:
00298                   libmesh_error_msg("ERROR: Spherical & Ellipsoidal IFEMs not implemented.");
00299                 }
00300               break;
00301             }
00302 
00303           case LEGENDRE:
00304             {
00305               switch (fe_t.inf_map)
00306                 {
00307                 case CARTESIAN:
00308                   {
00309                     InfFE<2,LEGENDRE,CARTESIAN>::nodal_soln(fe_t, elem, elem_soln, nodal_soln);
00310                     break;
00311                   }
00312                 default:
00313                   libmesh_error_msg("ERROR: Spherical & Ellipsoidal IFEMs not implemented.");
00314                 }
00315               break;
00316             }
00317 
00318           case LAGRANGE:
00319             {
00320               switch (fe_t.inf_map)
00321                 {
00322                 case CARTESIAN:
00323                   {
00324                     InfFE<2,LAGRANGE,CARTESIAN>::nodal_soln(fe_t, elem, elem_soln, nodal_soln);
00325                     break;
00326                   }
00327                 default:
00328                   libmesh_error_msg("ERROR: Spherical & Ellipsoidal IFEMs not implemented.");
00329                 }
00330               break;
00331             }
00332 
00333           default:
00334             libmesh_error_msg("ERROR: Bad FEType.radial_family= " << fe_t.radial_family);
00335           }
00336 
00337         break;
00338       }
00339 
00340 
00341 
00342 
00343       // 3D
00344     case 3:
00345       {
00346         switch (fe_t.radial_family)
00347           {
00348           case INFINITE_MAP:
00349             libmesh_error_msg("ERROR: INFINTE_MAP is not a valid shape family for radial approximation.");
00350 
00351           case JACOBI_20_00:
00352             {
00353               switch (fe_t.inf_map)
00354                 {
00355                 case CARTESIAN:
00356                   {
00357                     InfFE<3,JACOBI_20_00,CARTESIAN>::nodal_soln(fe_t, elem, elem_soln, nodal_soln);
00358                     break;
00359                   }
00360                 default:
00361                   libmesh_error_msg("ERROR: Spherical & Ellipsoidal IFEMs not implemented.");
00362                 }
00363               break;
00364             }
00365 
00366           case JACOBI_30_00:
00367             {
00368               switch (fe_t.inf_map)
00369                 {
00370                 case CARTESIAN:
00371                   {
00372                     InfFE<3,JACOBI_30_00,CARTESIAN>::nodal_soln(fe_t, elem, elem_soln, nodal_soln);
00373                     break;
00374                   }
00375                 default:
00376                   libmesh_error_msg("ERROR: Spherical & Ellipsoidal IFEMs not implemented.");
00377                 }
00378               break;
00379             }
00380 
00381           case LEGENDRE:
00382             {
00383               switch (fe_t.inf_map)
00384                 {
00385                 case CARTESIAN:
00386                   {
00387                     InfFE<3,LEGENDRE,CARTESIAN>::nodal_soln(fe_t, elem, elem_soln, nodal_soln);
00388                     break;
00389                   }
00390                 default:
00391                   libmesh_error_msg("ERROR: Spherical & Ellipsoidal IFEMs not implemented.");
00392                 }
00393               break;
00394             }
00395 
00396           case LAGRANGE:
00397             {
00398               switch (fe_t.inf_map)
00399                 {
00400                 case CARTESIAN:
00401                   {
00402                     InfFE<3,LAGRANGE,CARTESIAN>::nodal_soln(fe_t, elem, elem_soln, nodal_soln);
00403                     break;
00404                   }
00405                 default:
00406                   libmesh_error_msg("ERROR: Spherical & Ellipsoidal IFEMs not implemented.");
00407                 }
00408               break;
00409             }
00410 
00411 
00412 
00413           default:
00414             libmesh_error_msg("ERROR: Bad FEType.radial_family= " << fe_t.radial_family);
00415           }
00416 
00417         break;
00418       }
00419 
00420     default:
00421       libmesh_error_msg("Invalid dim = " << dim);
00422     }
00423 }
00424 
00425 
00426 
00427 
00428 
00429 
00430 
00431 Point FEInterface::ifem_inverse_map (const unsigned int dim,
00432                                      const FEType& fe_t,
00433                                      const Elem* elem,
00434                                      const Point& p,
00435                                      const Real tolerance,
00436                                      const bool secure)
00437 {
00438   switch (dim)
00439     {
00440       // 1D
00441     case 1:
00442       {
00443         switch (fe_t.inf_map)
00444           {
00445           case CARTESIAN:
00446             return InfFE<1,JACOBI_20_00,CARTESIAN>::inverse_map(elem, p, tolerance, secure);
00447 
00448           case SPHERICAL:
00449           case ELLIPSOIDAL:
00450             libmesh_not_implemented_msg("ERROR: Spherical and Ellipsoidal IFEMs not (yet) implemented.");
00451 
00452             /*
00453               case SPHERICAL:
00454               return InfFE<1,JACOBI_20_00,SPHERICAL>::inverse_map(elem, p, tolerance);
00455 
00456               case ELLIPSOIDAL:
00457               return InfFE<1,JACOBI_20_00,ELLIPSOIDAL>::inverse_map(elem, p, tolerance);
00458             */
00459 
00460           default:
00461             libmesh_error_msg("Invalid map = " << fe_t.inf_map);
00462           }
00463       }
00464 
00465 
00466       // 2D
00467     case 2:
00468       {
00469         switch (fe_t.inf_map)
00470           {
00471           case CARTESIAN:
00472             return InfFE<2,JACOBI_20_00,CARTESIAN>::inverse_map(elem, p, tolerance, secure);
00473 
00474           case SPHERICAL:
00475           case ELLIPSOIDAL:
00476             libmesh_not_implemented_msg("ERROR: Spherical and Ellipsoidal IFEMs not (yet) implemented.");
00477 
00478             /*
00479               case SPHERICAL:
00480               return InfFE<2,JACOBI_20_00,SPHERICAL>::inverse_map(elem, p, tolerance);
00481 
00482               case ELLIPSOIDAL:
00483               return InfFE<2,JACOBI_20_00,ELLIPSOIDAL>::inverse_map(elem, p, tolerance);
00484             */
00485 
00486           default:
00487             libmesh_error_msg("Invalid map = " << fe_t.inf_map);
00488           }
00489       }
00490 
00491 
00492       // 3D
00493     case 3:
00494       {
00495         switch (fe_t.inf_map)
00496           {
00497           case CARTESIAN:
00498             return InfFE<3,JACOBI_20_00,CARTESIAN>::inverse_map(elem, p, tolerance, secure);
00499 
00500           case SPHERICAL:
00501           case ELLIPSOIDAL:
00502             libmesh_not_implemented_msg("ERROR: Spherical and Ellipsoidal IFEMs not (yet) implemented.");
00503 
00504             /*
00505               case SPHERICAL:
00506               return InfFE<3,JACOBI_20_00,SPHERICAL>::inverse_map(elem, p, tolerance);
00507 
00508               case ELLIPSOIDAL:
00509               return InfFE<3,JACOBI_20_00,ELLIPSOIDAL>::inverse_map(elem, p, tolerance);
00510             */
00511 
00512           default:
00513             libmesh_error_msg("Invalid map = " << fe_t.inf_map);
00514           }
00515       }
00516 
00517     default:
00518       libmesh_error_msg("Invalid dim = " << dim);
00519     }
00520 
00521   libmesh_error_msg("We'll never get here!");
00522   Point pt;
00523   return pt;
00524 }
00525 
00526 
00527 
00528 void FEInterface::ifem_inverse_map (const unsigned int dim,
00529                                     const FEType& fe_t,
00530                                     const Elem* elem,
00531                                     const std::vector<Point>& physical_points,
00532                                     std::vector<Point>&       reference_points,
00533                                     const Real tolerance,
00534                                     const bool secure)
00535 {
00536   switch (dim)
00537     {
00538       // 1D
00539     case 1:
00540       {
00541         switch (fe_t.inf_map)
00542           {
00543           case CARTESIAN:
00544             InfFE<1,JACOBI_20_00,CARTESIAN>::inverse_map(elem, physical_points, reference_points, tolerance, secure);
00545             return;
00546 
00547           default:
00548             libmesh_error_msg("Invalid map = " << fe_t.inf_map);
00549           }
00550       }
00551 
00552 
00553       // 2D
00554     case 2:
00555       {
00556         switch (fe_t.inf_map)
00557           {
00558           case CARTESIAN:
00559             InfFE<2,JACOBI_20_00,CARTESIAN>::inverse_map(elem, physical_points, reference_points, tolerance, secure);
00560             return;
00561 
00562           default:
00563             libmesh_error_msg("Invalid map = " << fe_t.inf_map);
00564           }
00565       }
00566 
00567 
00568       // 3D
00569     case 3:
00570       {
00571         switch (fe_t.inf_map)
00572           {
00573           case CARTESIAN:
00574             InfFE<3,JACOBI_20_00,CARTESIAN>::inverse_map(elem, physical_points, reference_points, tolerance, secure);
00575             return;
00576 
00577           default:
00578             libmesh_error_msg("Invalid map = " << fe_t.inf_map);
00579           }
00580       }
00581 
00582     default:
00583       libmesh_error_msg("Invalid dim = " << dim);
00584     }
00585 }
00586 
00587 
00588 
00589 
00590 bool FEInterface::ifem_on_reference_element(const Point& p,
00591                                             const ElemType t,
00592                                             const Real eps)
00593 {
00594   return FEBase::on_reference_element(p,t,eps);
00595 }
00596 
00597 
00598 
00599 
00600 Real FEInterface::ifem_shape(const unsigned int dim,
00601                              const FEType& fe_t,
00602                              const ElemType t,
00603                              const unsigned int i,
00604                              const Point& p)
00605 {
00606   switch (dim)
00607     {
00608       // 1D
00609     case 1:
00610       {
00611         switch (fe_t.radial_family)
00612           {
00613             /*
00614              * For no derivatives (and local coordinates, as
00615              * given in \p p) the infinite element shapes
00616              * are independent of mapping type
00617              */
00618           case INFINITE_MAP:
00619             return InfFE<1,INFINITE_MAP,CARTESIAN>::shape(fe_t, t, i, p);
00620 
00621           case JACOBI_20_00:
00622             return InfFE<1,JACOBI_20_00,CARTESIAN>::shape(fe_t, t, i, p);
00623 
00624           case JACOBI_30_00:
00625             return InfFE<1,JACOBI_30_00,CARTESIAN>::shape(fe_t, t, i, p);
00626 
00627           case LEGENDRE:
00628             return InfFE<1,LEGENDRE,CARTESIAN>::shape(fe_t, t, i, p);
00629 
00630           case LAGRANGE:
00631             return InfFE<1,LAGRANGE,CARTESIAN>::shape(fe_t, t, i, p);
00632 
00633           default:
00634             libmesh_error_msg("Invalid radial family = " << fe_t.radial_family);
00635           }
00636       }
00637 
00638 
00639       // 2D
00640     case 2:
00641       {
00642         switch (fe_t.radial_family)
00643           {
00644           case INFINITE_MAP:
00645             return InfFE<2,INFINITE_MAP,CARTESIAN>::shape(fe_t, t, i, p);
00646 
00647           case JACOBI_20_00:
00648             return InfFE<2,JACOBI_20_00,CARTESIAN>::shape(fe_t, t, i, p);
00649 
00650           case JACOBI_30_00:
00651             return InfFE<2,JACOBI_30_00,CARTESIAN>::shape(fe_t, t, i, p);
00652 
00653           case LEGENDRE:
00654             return InfFE<2,LEGENDRE,CARTESIAN>::shape(fe_t, t, i, p);
00655 
00656           case LAGRANGE:
00657             return InfFE<2,LAGRANGE,CARTESIAN>::shape(fe_t, t, i, p);
00658 
00659           default:
00660             libmesh_error_msg("Invalid radial family = " << fe_t.radial_family);
00661           }
00662       }
00663 
00664 
00665       // 3D
00666     case 3:
00667       {
00668         switch (fe_t.radial_family)
00669           {
00670           case INFINITE_MAP:
00671             return InfFE<3,INFINITE_MAP,CARTESIAN>::shape(fe_t, t, i, p);
00672 
00673           case JACOBI_20_00:
00674             return InfFE<3,JACOBI_20_00,CARTESIAN>::shape(fe_t, t, i, p);
00675 
00676           case JACOBI_30_00:
00677             return InfFE<3,JACOBI_30_00,CARTESIAN>::shape(fe_t, t, i, p);
00678 
00679           case LEGENDRE:
00680             return InfFE<3,LEGENDRE,CARTESIAN>::shape(fe_t, t, i, p);
00681 
00682           case LAGRANGE:
00683             return InfFE<3,LAGRANGE,CARTESIAN>::shape(fe_t, t, i, p);
00684 
00685           default:
00686             libmesh_error_msg("Invalid radial family = " << fe_t.radial_family);
00687           }
00688       }
00689 
00690     default:
00691       libmesh_error_msg("Invalid dim = " << dim);
00692     }
00693 
00694   libmesh_error_msg("We'll never get here!");
00695   return 0.;
00696 }
00697 
00698 
00699 
00700 
00701 Real FEInterface::ifem_shape(const unsigned int dim,
00702                              const FEType& fe_t,
00703                              const Elem* elem,
00704                              const unsigned int i,
00705                              const Point& p)
00706 {
00707   switch (dim)
00708     {
00709       // 1D
00710     case 1:
00711       {
00712         switch (fe_t.radial_family)
00713           {
00714             /*
00715              * For no derivatives (and local coordinates, as
00716              * given in \p p) the infinite element shapes
00717              * are independent of mapping type
00718              */
00719           case INFINITE_MAP:
00720             return InfFE<1,INFINITE_MAP,CARTESIAN>::shape(fe_t, elem, i, p);
00721 
00722           case JACOBI_20_00:
00723             return InfFE<1,JACOBI_20_00,CARTESIAN>::shape(fe_t, elem, i, p);
00724 
00725           case JACOBI_30_00:
00726             return InfFE<1,JACOBI_30_00,CARTESIAN>::shape(fe_t, elem, i, p);
00727 
00728           case LEGENDRE:
00729             return InfFE<1,LEGENDRE,CARTESIAN>::shape(fe_t, elem, i, p);
00730 
00731           case LAGRANGE:
00732             return InfFE<1,LAGRANGE,CARTESIAN>::shape(fe_t, elem, i, p);
00733 
00734           default:
00735             libmesh_error_msg("Invalid radial family = " << fe_t.radial_family);
00736           }
00737       }
00738 
00739 
00740       // 2D
00741     case 2:
00742       {
00743         switch (fe_t.radial_family)
00744           {
00745           case INFINITE_MAP:
00746             return InfFE<2,INFINITE_MAP,CARTESIAN>::shape(fe_t, elem, i, p);
00747 
00748           case JACOBI_20_00:
00749             return InfFE<2,JACOBI_20_00,CARTESIAN>::shape(fe_t, elem, i, p);
00750 
00751           case JACOBI_30_00:
00752             return InfFE<2,JACOBI_30_00,CARTESIAN>::shape(fe_t, elem, i, p);
00753 
00754           case LEGENDRE:
00755             return InfFE<2,LEGENDRE,CARTESIAN>::shape(fe_t, elem, i, p);
00756 
00757           case LAGRANGE:
00758             return InfFE<2,LAGRANGE,CARTESIAN>::shape(fe_t, elem, i, p);
00759 
00760           default:
00761             libmesh_error_msg("Invalid radial family = " << fe_t.radial_family);
00762           }
00763       }
00764 
00765 
00766       // 3D
00767     case 3:
00768       {
00769         switch (fe_t.radial_family)
00770           {
00771           case INFINITE_MAP:
00772             return InfFE<3,INFINITE_MAP,CARTESIAN>::shape(fe_t, elem, i, p);
00773 
00774           case JACOBI_20_00:
00775             return InfFE<3,JACOBI_20_00,CARTESIAN>::shape(fe_t, elem, i, p);
00776 
00777           case JACOBI_30_00:
00778             return InfFE<3,JACOBI_30_00,CARTESIAN>::shape(fe_t, elem, i, p);
00779 
00780           case LEGENDRE:
00781             return InfFE<3,LEGENDRE,CARTESIAN>::shape(fe_t, elem, i, p);
00782 
00783           case LAGRANGE:
00784             return InfFE<3,LAGRANGE,CARTESIAN>::shape(fe_t, elem, i, p);
00785 
00786           default:
00787             libmesh_error_msg("Invalid radial family = " << fe_t.radial_family);
00788           }
00789       }
00790 
00791     default:
00792       libmesh_error_msg("Invalid dim = " << dim);
00793     }
00794 
00795   libmesh_error_msg("We'll never get here!");
00796   return 0.;
00797 }
00798 
00799 
00800 
00801 
00802 void FEInterface::ifem_compute_data(const unsigned int dim,
00803                                     const FEType& fe_t,
00804                                     const Elem* elem,
00805                                     FEComputeData& data)
00806 {
00807   switch (dim)
00808     {
00809       // 1D
00810     case 1:
00811       {
00812         switch (fe_t.radial_family)
00813           {
00814             /*
00815              * For no derivatives (and local coordinates, as
00816              * given in \p p) the infinite element shapes
00817              * are independent of mapping type
00818              */
00819           case INFINITE_MAP:
00820             InfFE<1,INFINITE_MAP,CARTESIAN>::compute_data(fe_t, elem, data);
00821             break;
00822 
00823           case JACOBI_20_00:
00824             InfFE<1,JACOBI_20_00,CARTESIAN>::compute_data(fe_t, elem, data);
00825             break;
00826 
00827           case JACOBI_30_00:
00828             InfFE<1,JACOBI_30_00,CARTESIAN>::compute_data(fe_t, elem, data);
00829             break;
00830 
00831           case LEGENDRE:
00832             InfFE<1,LEGENDRE,CARTESIAN>::compute_data(fe_t, elem, data);
00833             break;
00834 
00835           case LAGRANGE:
00836             InfFE<1,LAGRANGE,CARTESIAN>::compute_data(fe_t, elem, data);
00837             break;
00838 
00839           default:
00840             libmesh_error_msg("Invalid radial family = " << fe_t.radial_family);
00841           }
00842 
00843         break;
00844       }
00845 
00846 
00847       // 2D
00848     case 2:
00849       {
00850         switch (fe_t.radial_family)
00851           {
00852           case INFINITE_MAP:
00853             InfFE<2,INFINITE_MAP,CARTESIAN>::compute_data(fe_t, elem, data);
00854             break;
00855 
00856           case JACOBI_20_00:
00857             InfFE<2,JACOBI_20_00,CARTESIAN>::compute_data(fe_t, elem, data);
00858             break;
00859 
00860           case JACOBI_30_00:
00861             InfFE<2,JACOBI_30_00,CARTESIAN>::compute_data(fe_t, elem, data);
00862             break;
00863 
00864           case LEGENDRE:
00865             InfFE<2,LEGENDRE,CARTESIAN>::compute_data(fe_t, elem, data);
00866             break;
00867 
00868           case LAGRANGE:
00869             InfFE<2,LAGRANGE,CARTESIAN>::compute_data(fe_t, elem, data);
00870             break;
00871 
00872           default:
00873             libmesh_error_msg("Invalid radial family = " << fe_t.radial_family);
00874           }
00875 
00876         break;
00877       }
00878 
00879 
00880       // 3D
00881     case 3:
00882       {
00883         switch (fe_t.radial_family)
00884           {
00885           case INFINITE_MAP:
00886             InfFE<3,INFINITE_MAP,CARTESIAN>::compute_data(fe_t, elem, data);
00887             break;
00888 
00889           case JACOBI_20_00:
00890             InfFE<3,JACOBI_20_00,CARTESIAN>::compute_data(fe_t, elem, data);
00891             break;
00892 
00893           case JACOBI_30_00:
00894             InfFE<3,JACOBI_30_00,CARTESIAN>::compute_data(fe_t, elem, data);
00895             break;
00896 
00897           case LEGENDRE:
00898             InfFE<3,LEGENDRE,CARTESIAN>::compute_data(fe_t, elem, data);
00899             break;
00900 
00901           case LAGRANGE:
00902             InfFE<3,LAGRANGE,CARTESIAN>::compute_data(fe_t, elem, data);
00903             break;
00904 
00905           default:
00906             libmesh_error_msg("Invalid radial family = " << fe_t.radial_family);
00907           }
00908 
00909         break;
00910       }
00911 
00912 
00913     default:
00914       libmesh_error_msg("Invalid dim = " << dim);
00915       break;
00916     }
00917 }
00918 
00919 } // namespace libMesh
00920 
00921 #endif // ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS