Returns whether or not V is positive-definite. */
| 72 | |
| 73 | /* Returns whether or not V is positive-definite. */ |
| 74 | int sym_matrix_positive_definite(symmetric_matrix *V) { |
| 75 | double det2, det3; |
| 76 | double m00 = V->m00, m11 = V->m11, m22 = V->m22; |
| 77 | |
| 78 | #if defined(WITH_HERMITIAN_EPSILON) |
| 79 | scalar_complex m01 = V->m01, m02 = V->m02, m12 = V->m12; |
| 80 | |
| 81 | det2 = m00 * m11 - CSCALAR_NORMSQR(m01); |
| 82 | det3 = det2 * m22 - m11 * CSCALAR_NORMSQR(m02) - CSCALAR_NORMSQR(m12) * m00 + |
| 83 | 2.0 * ((m01.re * m12.re - m01.im * m12.im) * m02.re + |
| 84 | (m01.re * m12.im + m01.im * m12.re) * m02.im); |
| 85 | #else /* real matrix */ |
| 86 | double m01 = V->m01, m02 = V->m02, m12 = V->m12; |
| 87 | |
| 88 | det2 = m00 * m11 - m01 * m01; |
| 89 | det3 = det2 * m22 - m02 * m11 * m02 + 2.0 * m01 * m12 * m02 - m12 * m12 * m00; |
| 90 | #endif /* real matrix */ |
| 91 | |
| 92 | return (m00 > 0.0 && det2 > 0.0 && det3 > 0.0); |
| 93 | } |
| 94 | |
| 95 | static meep::ndim dim = meep::D3; |
| 96 |