| 1751 | //---------------------------------------------------------------------- |
| 1752 | // P2 Finite Element |
| 1753 | //---------------------------------------------------------------------- |
| 1754 | |
| 1755 | #define P2_BARYCENTER |
| 1756 | #define P2_EDGE |
| 1757 | |
| 1758 | void findQuadraticPolynomial(double *const phi, const double *const vx, const double *const vy, const double *const f_P2) |
| 1759 | { |
| 1760 | const int NQ = 6; // number of unknowns in quadratic polynomial |
| 1761 | |
| 1762 | double *a[NQ]; |
| 1763 | a[0] = new double [NQ*(NQ+1)]; // NQ*(NQ+1) matrix for Gauss Elimination |
| 1764 | for(int i = 1; i < NQ; i++) |
| 1765 | a[i] = a[i-1] + (NQ+1); |
| 1766 | |
| 1767 | #ifdef P2_BARYCENTER |
| 1768 | const double cx = (vx[0]+vx[1]+vx[2]) / 3; |
| 1769 | const double cy = (vy[0]+vy[1]+vy[2]) / 3; |
| 1770 | #endif |
| 1771 | |
| 1772 | #if defined(P2_BARYCENTER) && defined(P2_EDGE) |
| 1773 | const double mx[] = { (vx[1]+vx[2])/2, (vx[2]+vx[0])/2, (vx[0]+vx[1])/2 }; |
| 1774 | const double my[] = { (vy[1]+vy[2])/2, (vy[2]+vy[0])/2, (vy[0]+vy[1])/2 }; |
| 1775 | const double ex[] = { 0.99*mx[0]+0.01*cx, 0.99*mx[1]+0.01*cx, 0.99*mx[2]+0.01*cx }; |
| 1776 | const double ey[] = { 0.99*my[0]+0.01*cy, 0.99*my[1]+0.01*cy, 0.99*my[2]+0.01*cy }; |
| 1777 | #elif defined(P2_BARYCENTER) |
| 1778 | const double ex[] = { (vx[0]+cx)/2, (vx[1]+cx)/2, (vx[2]+cx)/2 }; |
| 1779 | const double ey[] = { (vy[0]+cy)/2, (vy[1]+cy)/2, (vy[2]+cy)/2 }; |
| 1780 | #elif defined(P2_EDGE) |
| 1781 | const double ex[] = { (vx[1]+vx[2])/2, (vx[2]+vx[0])/2, (vx[0]+vx[1])/2 }; |
| 1782 | const double ey[] = { (vy[1]+vy[2])/2, (vy[2]+vy[0])/2, (vy[0]+vy[1])/2 }; |
| 1783 | #endif |
| 1784 | |
| 1785 | const double x[] = { vx[0], vx[1], vx[2], ex[0], ex[1], ex[2] }; |
| 1786 | const double y[] = { vy[0], vy[1], vy[2], ey[0], ey[1], ey[2] }; |
| 1787 | |
| 1788 | for(int i = 0; i < NQ; i++){ |
| 1789 | a[i][0] = x[i] * x[i]; |
| 1790 | a[i][1] = x[i] * y[i]; |
| 1791 | a[i][2] = y[i] * y[i]; |
| 1792 | a[i][3] = x[i]; |
| 1793 | a[i][4] = y[i]; |
| 1794 | a[i][5] = 1; |
| 1795 | a[i][6] = f_P2[i]; |
| 1796 | } |
| 1797 | |
| 1798 | GaussElimination(phi, a, NQ); |
| 1799 | |
| 1800 | delete [] a[0]; |
| 1801 |
no test coverage detected