$extrastylesheet
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