fe_szabab.C
Go to the documentation of this file.00001 // The libMesh Finite Element Library. 00002 // Copyright (C) 2002-2012 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 #ifdef LIBMESH_ENABLE_HIGHER_ORDER_SHAPES 00023 00024 #include "libmesh/fe.h" 00025 #include "libmesh/elem.h" 00026 #include "libmesh/fe_interface.h" 00027 00028 namespace libMesh 00029 { 00030 00031 // ------------------------------------------------------------ 00032 // Szabo-Babuska-specific implementations, Steffen Petersen 2004 00033 00034 // Anonymous namespace for local helper functions 00035 namespace { 00036 00037 void szabab_nodal_soln(const Elem* elem, 00038 const Order order, 00039 const std::vector<Number>& elem_soln, 00040 std::vector<Number>& nodal_soln, 00041 unsigned Dim) 00042 { 00043 const unsigned int n_nodes = elem->n_nodes(); 00044 00045 const ElemType elem_type = elem->type(); 00046 00047 nodal_soln.resize(n_nodes); 00048 00049 const Order totalorder = static_cast<Order>(order+elem->p_level()); 00050 00051 // FEType object to be passed to various FEInterface functions below. 00052 FEType fe_type(totalorder, SZABAB); 00053 00054 switch (totalorder) 00055 { 00056 // Constant shape functions 00057 case CONSTANT: 00058 { 00059 libmesh_assert_equal_to (elem_soln.size(), 1); 00060 00061 const Number val = elem_soln[0]; 00062 00063 for (unsigned int n=0; n<n_nodes; n++) 00064 nodal_soln[n] = val; 00065 00066 return; 00067 } 00068 00069 00070 // For other bases do interpolation at the nodes 00071 // explicitly. 00072 case FIRST: 00073 case SECOND: 00074 case THIRD: 00075 case FOURTH: 00076 case FIFTH: 00077 case SIXTH: 00078 case SEVENTH: 00079 { 00080 00081 const unsigned int n_sf = 00082 // FE<Dim,T>::n_shape_functions(elem_type, totalorder); 00083 FEInterface::n_shape_functions(Dim, fe_type, elem_type); 00084 00085 std::vector<Point> refspace_nodes; 00086 FEBase::get_refspace_nodes(elem_type,refspace_nodes); 00087 libmesh_assert_equal_to (refspace_nodes.size(), n_nodes); 00088 00089 for (unsigned int n=0; n<n_nodes; n++) 00090 { 00091 libmesh_assert_equal_to (elem_soln.size(), n_sf); 00092 00093 // Zero before summation 00094 nodal_soln[n] = 0; 00095 00096 // u_i = Sum (alpha_i phi_i) 00097 for (unsigned int i=0; i<n_sf; i++) 00098 nodal_soln[n] += elem_soln[i] * 00099 // FE<Dim,T>::shape(elem, order, i, mapped_point); 00100 FEInterface::shape(Dim, fe_type, elem, i, refspace_nodes[n]); 00101 } 00102 00103 return; 00104 } 00105 00106 default: 00107 { 00108 libmesh_error(); 00109 return; 00110 } 00111 } 00112 00113 00114 // We should never get here? 00115 libmesh_error(); 00116 return; 00117 } // szabab_nodal_soln() 00118 00119 00120 00121 00122 unsigned int szabab_n_dofs(const ElemType t, const Order o) 00123 { 00124 switch (o) 00125 { 00126 // Szabo-Babuska 1st-order polynomials. 00127 case FIRST: 00128 { 00129 switch (t) 00130 { 00131 case NODEELEM: 00132 return 1; 00133 00134 case EDGE2: 00135 case EDGE3: 00136 return 2; 00137 00138 case TRI6: 00139 return 3; 00140 00141 case QUAD8: 00142 case QUAD9: 00143 return 4; 00144 00145 default: 00146 libmesh_error(); 00147 } 00148 } 00149 00150 00151 // Szabo-Babuska 2nd-order polynomials. 00152 case SECOND: 00153 { 00154 switch (t) 00155 { 00156 case NODEELEM: 00157 return 1; 00158 00159 case EDGE2: 00160 case EDGE3: 00161 return 3; 00162 00163 case TRI6: 00164 return 6; 00165 00166 case QUAD8: 00167 return 8; 00168 case QUAD9: 00169 return 9; 00170 00171 default: 00172 libmesh_error(); 00173 } 00174 } 00175 00176 00177 // Szabo-Babuska 3rd-order polynomials. 00178 case THIRD: 00179 { 00180 switch (t) 00181 { 00182 case NODEELEM: 00183 return 1; 00184 00185 case EDGE2: 00186 case EDGE3: 00187 return 4; 00188 00189 case TRI6: 00190 return 10; 00191 00192 case QUAD8: 00193 case QUAD9: 00194 return 16; 00195 00196 default: 00197 libmesh_error(); 00198 } 00199 } 00200 00201 00202 // Szabo-Babuska 4th-order polynomials. 00203 case FOURTH: 00204 { 00205 switch (t) 00206 { 00207 case NODEELEM: 00208 return 1; 00209 00210 case EDGE2: 00211 case EDGE3: 00212 return 5; 00213 00214 case TRI6: 00215 return 15; 00216 00217 case QUAD8: 00218 case QUAD9: 00219 return 25; 00220 00221 default: 00222 libmesh_error(); 00223 } 00224 } 00225 00226 00227 // Szabo-Babuska 5th-order polynomials. 00228 case FIFTH: 00229 { 00230 switch (t) 00231 { 00232 case NODEELEM: 00233 return 1; 00234 00235 case EDGE2: 00236 case EDGE3: 00237 return 6; 00238 00239 case TRI6: 00240 return 21; 00241 00242 case QUAD8: 00243 case QUAD9: 00244 return 36; 00245 00246 default: 00247 libmesh_error(); 00248 } 00249 } 00250 00251 00252 // Szabo-Babuska 6th-order polynomials. 00253 case SIXTH: 00254 { 00255 switch (t) 00256 { 00257 case NODEELEM: 00258 return 1; 00259 00260 case EDGE2: 00261 case EDGE3: 00262 return 7; 00263 00264 case TRI6: 00265 return 28; 00266 00267 case QUAD8: 00268 case QUAD9: 00269 return 49; 00270 00271 default: 00272 libmesh_error(); 00273 } 00274 } 00275 00276 // Szabo-Babuska 7th-order polynomials. 00277 case SEVENTH: 00278 { 00279 switch (t) 00280 { 00281 case NODEELEM: 00282 return 1; 00283 00284 case EDGE2: 00285 case EDGE3: 00286 return 8; 00287 00288 case TRI6: 00289 return 36; 00290 00291 case QUAD8: 00292 case QUAD9: 00293 return 64; 00294 00295 default: 00296 libmesh_error(); 00297 } 00298 } 00299 00300 00301 default: 00302 { 00303 libmesh_error(); 00304 } 00305 } 00306 00307 libmesh_error(); 00308 return 0; 00309 } // szabab_n_dofs() 00310 00311 00312 00313 00314 00315 unsigned int szabab_n_dofs_at_node(const ElemType t, 00316 const Order o, 00317 const unsigned int n) 00318 { 00319 switch (o) 00320 { 00321 // The first-order Szabo-Babuska shape functions 00322 case FIRST: 00323 { 00324 switch (t) 00325 { 00326 case NODEELEM: 00327 return 1; 00328 00329 // The 1D Szabo-Babuska defined on a three-noded edge 00330 case EDGE2: 00331 case EDGE3: 00332 { 00333 switch (n) 00334 { 00335 case 0: 00336 case 1: 00337 return 1; 00338 00339 case 2: 00340 return 0; 00341 00342 default: 00343 libmesh_error(); 00344 } 00345 } 00346 00347 00348 // The 2D Szabo-Babuska defined on a 6-noded triangle 00349 case TRI6: 00350 { 00351 switch (n) 00352 { 00353 case 0: 00354 case 1: 00355 case 2: 00356 return 1; 00357 00358 case 3: 00359 case 4: 00360 case 5: 00361 return 0; 00362 00363 default: 00364 libmesh_error(); 00365 } 00366 } 00367 00368 00369 // The 2D tensor-product Szabo-Babuska defined on a 00370 // nine-noded quadrilateral. 00371 case QUAD8: 00372 case QUAD9: 00373 { 00374 switch (n) 00375 { 00376 case 0: 00377 case 1: 00378 case 2: 00379 case 3: 00380 return 1; 00381 00382 case 4: 00383 case 5: 00384 case 6: 00385 case 7: 00386 return 0; 00387 00388 case 8: 00389 return 0; 00390 00391 default: 00392 libmesh_error(); 00393 } 00394 } 00395 00396 00397 default: 00398 libmesh_error(); 00399 00400 } 00401 } 00402 00403 00404 00405 // The second-order Szabo-Babuska shape functions 00406 case SECOND: 00407 { 00408 switch (t) 00409 { 00410 case NODEELEM: 00411 return 1; 00412 00413 // The 1D Szabo-Babuska defined on a three-noded edge 00414 case EDGE2: 00415 case EDGE3: 00416 { 00417 switch (n) 00418 { 00419 case 0: 00420 case 1: 00421 return 1; 00422 00423 case 2: 00424 return 1; 00425 00426 default: 00427 libmesh_error(); 00428 } 00429 } 00430 00431 00432 // The 2D Szabo-Babuska defined on a 6-noded triangle 00433 case TRI6: 00434 { 00435 switch (n) 00436 { 00437 case 0: 00438 case 1: 00439 case 2: 00440 return 1; 00441 00442 case 3: 00443 case 4: 00444 case 5: 00445 return 1; 00446 00447 default: 00448 libmesh_error(); 00449 } 00450 } 00451 00452 00453 // The 2D tensor-product Szabo-Babuska defined on a 00454 // nine-noded quadrilateral. 00455 case QUAD8: 00456 case QUAD9: 00457 { 00458 switch (n) 00459 { 00460 case 0: 00461 case 1: 00462 case 2: 00463 case 3: 00464 return 1; 00465 00466 case 4: 00467 case 5: 00468 case 6: 00469 case 7: 00470 return 1; 00471 00472 case 8: 00473 return 1; 00474 00475 default: 00476 libmesh_error(); 00477 } 00478 } 00479 00480 00481 default: 00482 libmesh_error(); 00483 00484 } 00485 } 00486 00487 00488 00489 // The third-order Szabo-Babuska shape functions 00490 case THIRD: 00491 { 00492 switch (t) 00493 { 00494 case NODEELEM: 00495 return 1; 00496 00497 // The 1D Szabo-Babuska defined on a three-noded edge 00498 case EDGE2: 00499 case EDGE3: 00500 { 00501 switch (n) 00502 { 00503 case 0: 00504 case 1: 00505 return 1; 00506 00507 case 2: 00508 return 2; 00509 00510 default: 00511 libmesh_error(); 00512 } 00513 } 00514 00515 00516 // The 2D Szabo-Babuska defined on a 6-noded triangle 00517 case TRI6: 00518 { 00519 switch (n) 00520 { 00521 case 0: 00522 case 1: 00523 case 2: 00524 return 1; 00525 00526 case 3: 00527 case 4: 00528 case 5: 00529 return 2; 00530 00531 default: 00532 libmesh_error(); 00533 } 00534 } 00535 00536 00537 // The 2D tensor-product Szabo-Babuska defined on a 00538 // nine-noded quadrilateral. 00539 case QUAD8: 00540 case QUAD9: 00541 { 00542 switch (n) 00543 { 00544 case 0: 00545 case 1: 00546 case 2: 00547 case 3: 00548 return 1; 00549 00550 case 4: 00551 case 5: 00552 case 6: 00553 case 7: 00554 return 2; 00555 00556 case 8: 00557 return 4; 00558 00559 default: 00560 libmesh_error(); 00561 } 00562 } 00563 00564 00565 default: 00566 libmesh_error(); 00567 00568 } 00569 } 00570 00571 00572 00573 // The fourth-order Szabo-Babuska shape functions 00574 case FOURTH: 00575 { 00576 switch (t) 00577 { 00578 case NODEELEM: 00579 return 1; 00580 00581 // The 1D Szabo-Babuska defined on a three-noded edge 00582 case EDGE2: 00583 case EDGE3: 00584 { 00585 switch (n) 00586 { 00587 case 0: 00588 case 1: 00589 return 1; 00590 00591 case 2: 00592 return 3; 00593 00594 default: 00595 libmesh_error(); 00596 } 00597 } 00598 00599 00600 // The 2D Szabo-Babuska defined on a 6-noded triangle 00601 case TRI6: 00602 { 00603 switch (n) 00604 { 00605 case 0: 00606 case 1: 00607 case 2: 00608 return 1; 00609 00610 case 3: 00611 case 4: 00612 case 5: 00613 return 3; 00614 00615 default: 00616 libmesh_error(); 00617 } 00618 } 00619 00620 00621 // The 2D tensor-product Szabo-Babuska defined on a 00622 // nine-noded quadrilateral. 00623 case QUAD8: 00624 case QUAD9: 00625 { 00626 switch (n) 00627 { 00628 case 0: 00629 case 1: 00630 case 2: 00631 case 3: 00632 return 1; 00633 00634 case 4: 00635 case 5: 00636 case 6: 00637 case 7: 00638 return 3; 00639 00640 case 8: 00641 return 9; 00642 00643 default: 00644 libmesh_error(); 00645 } 00646 } 00647 00648 00649 default: 00650 libmesh_error(); 00651 00652 } 00653 } 00654 00655 00656 00657 // The fifth-order Szabo-Babuska shape functions 00658 case FIFTH: 00659 { 00660 switch (t) 00661 { 00662 case NODEELEM: 00663 return 1; 00664 00665 // The 1D Szabo-Babuska defined on a three-noded edge 00666 case EDGE2: 00667 case EDGE3: 00668 { 00669 switch (n) 00670 { 00671 case 0: 00672 case 1: 00673 return 1; 00674 00675 case 2: 00676 return 4; 00677 00678 default: 00679 libmesh_error(); 00680 } 00681 } 00682 00683 00684 // The 2D Szabo-Babuska defined on a 6-noded triangle 00685 case TRI6: 00686 { 00687 switch (n) 00688 { 00689 case 0: 00690 case 1: 00691 case 2: 00692 return 1; 00693 00694 case 3: 00695 case 4: 00696 case 5: 00697 return 4; 00698 00699 default: 00700 libmesh_error(); 00701 } 00702 } 00703 00704 00705 // The 2D tensor-product Szabo-Babuska defined on a 00706 // nine-noded quadrilateral. 00707 case QUAD8: 00708 case QUAD9: 00709 { 00710 switch (n) 00711 { 00712 case 0: 00713 case 1: 00714 case 2: 00715 case 3: 00716 return 1; 00717 00718 case 4: 00719 case 5: 00720 case 6: 00721 case 7: 00722 return 4; 00723 00724 case 8: 00725 return 16; 00726 00727 default: 00728 libmesh_error(); 00729 } 00730 } 00731 00732 00733 default: 00734 libmesh_error(); 00735 00736 } 00737 } 00738 00739 00740 00741 // The sixth-order Szabo-Babuska shape functions 00742 case SIXTH: 00743 { 00744 switch (t) 00745 { 00746 case NODEELEM: 00747 return 1; 00748 00749 // The 1D Szabo-Babuska defined on a three-noded edge 00750 case EDGE2: 00751 case EDGE3: 00752 { 00753 switch (n) 00754 { 00755 case 0: 00756 case 1: 00757 return 1; 00758 00759 case 2: 00760 return 5; 00761 00762 default: 00763 libmesh_error(); 00764 } 00765 } 00766 00767 00768 // The 2D Szabo-Babuska defined on a 6-noded triangle 00769 case TRI6: 00770 { 00771 switch (n) 00772 { 00773 case 0: 00774 case 1: 00775 case 2: 00776 return 1; 00777 00778 case 3: 00779 case 4: 00780 case 5: 00781 return 5; 00782 00783 default: 00784 libmesh_error(); 00785 } 00786 } 00787 00788 00789 // The 2D tensor-product Szabo-Babuska defined on a 00790 // nine-noded quadrilateral. 00791 case QUAD8: 00792 case QUAD9: 00793 { 00794 switch (n) 00795 { 00796 case 0: 00797 case 1: 00798 case 2: 00799 case 3: 00800 return 1; 00801 00802 case 4: 00803 case 5: 00804 case 6: 00805 case 7: 00806 return 5; 00807 00808 case 8: 00809 return 25; 00810 00811 default: 00812 libmesh_error(); 00813 } 00814 } 00815 00816 00817 default: 00818 libmesh_error(); 00819 00820 } 00821 } 00822 00823 00824 // The seventh-order Szabo-Babuska shape functions 00825 case SEVENTH: 00826 { 00827 switch (t) 00828 { 00829 case NODEELEM: 00830 return 1; 00831 00832 // The 1D Szabo-Babuska defined on a three-noded edge 00833 case EDGE2: 00834 case EDGE3: 00835 { 00836 switch (n) 00837 { 00838 case 0: 00839 case 1: 00840 return 1; 00841 00842 case 2: 00843 return 6; 00844 00845 default: 00846 libmesh_error(); 00847 } 00848 } 00849 00850 00851 // The 2D Szabo-Babuska defined on a 6-noded triangle 00852 case TRI6: 00853 { 00854 switch (n) 00855 { 00856 case 0: 00857 case 1: 00858 case 2: 00859 return 1; 00860 00861 case 3: 00862 case 4: 00863 case 5: 00864 return 6; 00865 00866 default: 00867 libmesh_error(); 00868 } 00869 } 00870 00871 00872 // The 2D tensor-product Szabo-Babuska defined on a 00873 // nine-noded quadrilateral. 00874 case QUAD8: 00875 case QUAD9: 00876 { 00877 switch (n) 00878 { 00879 case 0: 00880 case 1: 00881 case 2: 00882 case 3: 00883 return 1; 00884 00885 case 4: 00886 case 5: 00887 case 6: 00888 case 7: 00889 return 6; 00890 00891 case 8: 00892 return 36; 00893 00894 default: 00895 libmesh_error(); 00896 } 00897 } 00898 00899 00900 default: 00901 libmesh_error(); 00902 00903 } 00904 } 00905 00906 00907 default: 00908 { 00909 libmesh_error(); 00910 } 00911 } 00912 00913 libmesh_error(); 00914 00915 return 0; 00916 } // szabab_n_dofs_at_node() 00917 00918 00919 00920 unsigned int szabab_n_dofs_per_elem(const ElemType t, const Order o) 00921 { 00922 switch (o) 00923 { 00924 // The first-order Szabo-Babuska shape functions 00925 case FIRST: 00926 { 00927 switch (t) 00928 { 00929 case NODEELEM: 00930 return 0; 00931 00932 // The 1D Szabo-Babuska defined on a two-noded edge 00933 case EDGE2: 00934 return 0; 00935 00936 // The 1D Szabo-Babuska defined on a three-noded edge 00937 case EDGE3: 00938 return 0; 00939 00940 // The 2D Szabo-Babuska defined on a 6-noded triangle 00941 case TRI6: 00942 return 0; 00943 00944 // The 2D tensor-product Szabo-Babuska defined on a 00945 // nine-noded quadrilateral. 00946 case QUAD8: 00947 return 0; 00948 00949 // The 2D tensor-product Szabo-Babuska defined on a 00950 // nine-noded quadrilateral. 00951 00952 case QUAD9: 00953 return 0; 00954 00955 00956 default: 00957 libmesh_error(); 00958 00959 } 00960 } 00961 00962 00963 00964 // The second-order Szabo-Babuska shape functions 00965 case SECOND: 00966 { 00967 switch (t) 00968 { 00969 case NODEELEM: 00970 return 0; 00971 00972 // The 1D Szabo-Babuska defined on a two-noded edge 00973 case EDGE2: 00974 return 1; 00975 00976 // The 1D Szabo-Babuska defined on a three-noded edge 00977 case EDGE3: 00978 return 0; 00979 00980 // The 2D Szabo-Babuska defined on a 6-noded triangle 00981 case TRI6: 00982 return 0; 00983 00984 // The 2D tensor-product Szabo-Babuska defined on a 00985 // eight-noded quadrilateral. 00986 case QUAD8: 00987 return 0; 00988 00989 // The 2D tensor-product Szabo-Babuska defined on a 00990 // nine-noded quadrilateral. 00991 case QUAD9: 00992 return 0; 00993 00994 00995 default: 00996 libmesh_error(); 00997 00998 } 00999 } 01000 01001 01002 01003 // The third-order Szabo-Babuska shape functions 01004 case THIRD: 01005 { 01006 switch (t) 01007 { 01008 case NODEELEM: 01009 return 0; 01010 01011 // The 1D Szabo-Babuska defined on a two-noded edge 01012 case EDGE2: 01013 return 2; 01014 01015 // The 1D Szabo-Babuska defined on a three-noded edge 01016 case EDGE3: 01017 return 0; 01018 01019 // The 2D Szabo-Babuska defined on a 6-noded triangle 01020 case TRI6: 01021 return 1; 01022 01023 // The 2D tensor-product Szabo-Babuska defined on a 01024 // eight-noded quadrilateral. 01025 case QUAD8: 01026 return 4; 01027 01028 // The 2D tensor-product Szabo-Babuska defined on a 01029 // nine-noded quadrilateral. 01030 case QUAD9: 01031 return 0; 01032 01033 01034 default: 01035 libmesh_error(); 01036 01037 } 01038 } 01039 01040 01041 01042 // The fourth-order Szabo-Babuska shape functions 01043 case FOURTH: 01044 { 01045 switch (t) 01046 { 01047 case NODEELEM: 01048 return 0; 01049 01050 // The 1D Szabo-Babuska defined on a two-noded edge 01051 case EDGE2: 01052 return 3; 01053 01054 // The 1D Szabo-Babuska defined on a three-noded edge 01055 case EDGE3: 01056 return 0; 01057 01058 // The 2D Szabo-Babuska defined on a 6-noded triangle 01059 case TRI6: 01060 return 3; 01061 01062 // The 2D tensor-product Szabo-Babuska defined on a 01063 // eight-noded quadrilateral. 01064 case QUAD8: 01065 return 9; 01066 01067 // The 2D tensor-product Szabo-Babuska defined on a 01068 // nine-noded quadrilateral. 01069 case QUAD9: 01070 return 0; 01071 01072 01073 default: 01074 libmesh_error(); 01075 01076 } 01077 } 01078 01079 01080 01081 // The fifth-order Szabo-Babuska shape functions 01082 case FIFTH: 01083 { 01084 switch (t) 01085 { 01086 case NODEELEM: 01087 return 0; 01088 01089 // The 1D Szabo-Babuska defined on a two-noded edge 01090 case EDGE2: 01091 return 4; 01092 01093 // The 1D Szabo-Babuska defined on a three-noded edge 01094 case EDGE3: 01095 return 0; 01096 01097 // The 2D Szabo-Babuska defined on a 6-noded triangle 01098 case TRI6: 01099 return 6; 01100 01101 // The 2D tensor-product Szabo-Babuska defined on a 01102 // eight-noded quadrilateral. 01103 case QUAD8: 01104 return 16; 01105 01106 // The 2D tensor-product Szabo-Babuska defined on a 01107 // nine-noded quadrilateral. 01108 case QUAD9: 01109 return 0; 01110 01111 01112 default: 01113 libmesh_error(); 01114 01115 } 01116 } 01117 01118 01119 // The sixth-order Szabo-Babuska shape functions 01120 case SIXTH: 01121 { 01122 switch (t) 01123 { 01124 case NODEELEM: 01125 return 0; 01126 01127 // The 1D Szabo-Babuska defined on a two-noded edge 01128 case EDGE2: 01129 return 5; 01130 01131 // The 1D Szabo-Babuska defined on a three-noded edge 01132 case EDGE3: 01133 return 0; 01134 01135 // The 2D Szabo-Babuska defined on a 6-noded triangle 01136 case TRI6: 01137 return 10; 01138 01139 // The 2D tensor-product Szabo-Babuska defined on a 01140 // eight-noded quadrilateral. 01141 case QUAD8: 01142 return 25; 01143 01144 // The 2D tensor-product Szabo-Babuska defined on a 01145 // nine-noded quadrilateral. 01146 case QUAD9: 01147 return 0; 01148 01149 01150 default: 01151 libmesh_error(); 01152 01153 } 01154 } 01155 01156 01157 // The seventh-order Szabo-Babuska shape functions 01158 case SEVENTH: 01159 { 01160 switch (t) 01161 { 01162 case NODEELEM: 01163 return 0; 01164 01165 // The 1D Szabo-Babuska defined on a two-noded edge 01166 case EDGE2: 01167 return 6; 01168 01169 // The 1D Szabo-Babuska defined on a three-noded edge 01170 case EDGE3: 01171 return 0; 01172 01173 // The 2D Szabo-Babuska defined on a 6-noded triangle 01174 case TRI6: 01175 return 15; 01176 01177 // The 2D tensor-product Szabo-Babuska defined on a 01178 // eight-noded quadrilateral. 01179 case QUAD8: 01180 return 36; 01181 01182 // The 2D tensor-product Szabo-Babuska defined on a 01183 // nine-noded quadrilateral. 01184 case QUAD9: 01185 return 0; 01186 01187 01188 default: 01189 libmesh_error(); 01190 01191 } 01192 } 01193 01194 01195 // Otherwise no DOFS per element 01196 default: 01197 return 0; 01198 } 01199 } // szabab_n_dofs_per_elem 01200 01201 } // anonymous namespace 01202 01203 01204 01205 01206 // Do full-specialization of nodal_soln() function for every 01207 // dimension, instead of explicit instantiation at the end of this 01208 // file. 01209 // This could be macro-ified so that it fits on one line... 01210 template <> 01211 void FE<0,SZABAB>::nodal_soln(const Elem* elem, 01212 const Order order, 01213 const std::vector<Number>& elem_soln, 01214 std::vector<Number>& nodal_soln) 01215 { szabab_nodal_soln(elem, order, elem_soln, nodal_soln, /*Dim=*/0); } 01216 01217 template <> 01218 void FE<1,SZABAB>::nodal_soln(const Elem* elem, 01219 const Order order, 01220 const std::vector<Number>& elem_soln, 01221 std::vector<Number>& nodal_soln) 01222 { szabab_nodal_soln(elem, order, elem_soln, nodal_soln, /*Dim=*/1); } 01223 01224 template <> 01225 void FE<2,SZABAB>::nodal_soln(const Elem* elem, 01226 const Order order, 01227 const std::vector<Number>& elem_soln, 01228 std::vector<Number>& nodal_soln) 01229 { szabab_nodal_soln(elem, order, elem_soln, nodal_soln, /*Dim=*/2); } 01230 01231 template <> 01232 void FE<3,SZABAB>::nodal_soln(const Elem* elem, 01233 const Order order, 01234 const std::vector<Number>& elem_soln, 01235 std::vector<Number>& nodal_soln) 01236 { szabab_nodal_soln(elem, order, elem_soln, nodal_soln, /*Dim=*/3); } 01237 01238 01239 // Full specialization of n_dofs() function for every dimension 01240 template <> unsigned int FE<0,SZABAB>::n_dofs(const ElemType t, const Order o) { return szabab_n_dofs(t, o); } 01241 template <> unsigned int FE<1,SZABAB>::n_dofs(const ElemType t, const Order o) { return szabab_n_dofs(t, o); } 01242 template <> unsigned int FE<2,SZABAB>::n_dofs(const ElemType t, const Order o) { return szabab_n_dofs(t, o); } 01243 template <> unsigned int FE<3,SZABAB>::n_dofs(const ElemType t, const Order o) { return szabab_n_dofs(t, o); } 01244 01245 // Full specialization of n_dofs_at_node() function for every dimension. 01246 template <> unsigned int FE<0,SZABAB>::n_dofs_at_node(const ElemType t, const Order o, const unsigned int n) { return szabab_n_dofs_at_node(t, o, n); } 01247 template <> unsigned int FE<1,SZABAB>::n_dofs_at_node(const ElemType t, const Order o, const unsigned int n) { return szabab_n_dofs_at_node(t, o, n); } 01248 template <> unsigned int FE<2,SZABAB>::n_dofs_at_node(const ElemType t, const Order o, const unsigned int n) { return szabab_n_dofs_at_node(t, o, n); } 01249 template <> unsigned int FE<3,SZABAB>::n_dofs_at_node(const ElemType t, const Order o, const unsigned int n) { return szabab_n_dofs_at_node(t, o, n); } 01250 01251 // Full specialization of n_dofs_per_elem() function for every dimension. 01252 template <> unsigned int FE<0,SZABAB>::n_dofs_per_elem(const ElemType t, const Order o) { return szabab_n_dofs_per_elem(t, o); } 01253 template <> unsigned int FE<1,SZABAB>::n_dofs_per_elem(const ElemType t, const Order o) { return szabab_n_dofs_per_elem(t, o); } 01254 template <> unsigned int FE<2,SZABAB>::n_dofs_per_elem(const ElemType t, const Order o) { return szabab_n_dofs_per_elem(t, o); } 01255 template <> unsigned int FE<3,SZABAB>::n_dofs_per_elem(const ElemType t, const Order o) { return szabab_n_dofs_per_elem(t, o); } 01256 01257 // Szabab FEMs are C^0 continuous 01258 template <> FEContinuity FE<0,SZABAB>::get_continuity() const { return C_ZERO; } 01259 template <> FEContinuity FE<1,SZABAB>::get_continuity() const { return C_ZERO; } 01260 template <> FEContinuity FE<2,SZABAB>::get_continuity() const { return C_ZERO; } 01261 template <> FEContinuity FE<3,SZABAB>::get_continuity() const { return C_ZERO; } 01262 01263 // Szabab FEMs are not hierarchic 01264 template <> bool FE<0,SZABAB>::is_hierarchic() const { return false; } 01265 template <> bool FE<1,SZABAB>::is_hierarchic() const { return false; } 01266 template <> bool FE<2,SZABAB>::is_hierarchic() const { return false; } 01267 template <> bool FE<3,SZABAB>::is_hierarchic() const { return false; } 01268 01269 // Szabab shapes need reinit only for approximation orders >= 3, 01270 // but we might reach that with p refinement 01271 template <> bool FE<0,SZABAB>::shapes_need_reinit() const { return true; } 01272 template <> bool FE<1,SZABAB>::shapes_need_reinit() const { return true; } 01273 template <> bool FE<2,SZABAB>::shapes_need_reinit() const { return true; } 01274 template <> bool FE<3,SZABAB>::shapes_need_reinit() const { return true; } 01275 01276 } // namespace libMesh 01277 01278 #endif //LIBMESH_ENABLE_HIGHER_ORDER_SHAPES
Site Created By: libMesh Developers
Last modified: February 05 2013 19:54:46 UTC
Hosted By: