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