xref: /libCEED/tests/t301-basis.c (revision b2e3f8ecbfa285d0f4ffde9b24c57cc13f0319fb)
1 /// @file
2 /// Test QR Factorization
3 /// \test Test QR Factorization
4 #include <ceed.h>
5 #include <ceed/backend.h>
6 #include <math.h>
7 #include <stdio.h>
8 
9 int main(int argc, char **argv) {
10   Ceed       ceed;
11   CeedScalar A[12]    = {1, -1, 4, 1, 4, -2, 1, 4, 2, 1, -1, 0};
12   CeedScalar qr[12]   = {1, -1, 4, 1, 4, -2, 1, 4, 2, 1, -1, 0};
13   CeedScalar A_qr[12] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
14   CeedScalar tau[4];
15 
16   CeedInit(argv[1], &ceed);
17 
18   CeedQRFactorization(ceed, qr, tau, 4, 3);
19   for (CeedInt i = 0; i < 3; i++) {
20     for (CeedInt j = i; j < 3; j++) A_qr[i * 3 + j] = qr[i * 3 + j];
21   }
22   CeedHouseholderApplyQ(A_qr, qr, tau, CEED_NOTRANSPOSE, 4, 3, 3, 3, 1);
23 
24   for (CeedInt i = 0; i < 12; i++) {
25     if (fabs(A_qr[i] - A[i]) > 100. * CEED_EPSILON) {
26       // LCOV_EXCL_START
27       printf("Error in QR factorization A_qr[%" CeedInt_FMT "] = %f != A[%" CeedInt_FMT "] = %f\n", i, A_qr[i], i, A[i]);
28       // LCOV_EXCL_STOP
29     }
30   }
31 
32   CeedDestroy(&ceed);
33   return 0;
34 }
35