1
1
// lu_decomposition.cpp
2
- #include " lu_decomposition.h"
2
+ #include " ../include/ lu_decomposition.h"
3
3
#include < omp.h>
4
4
#include < iostream>
5
5
#include < cstdio>
6
6
#include < cstdlib>
7
+ #include < cmath>
8
+
7
9
using namespace std ;
8
10
// LU Decomposition function
9
- void l_u_d (float ** a, float ** l, float ** u, int size)
11
+ void l_u_d (float ** a, float ** l, float ** u, int * p , int size) // Added pivot array p
10
12
{
11
13
// Initialize a simple lock for parallel region
12
14
omp_lock_t lock;
13
15
omp_init_lock (&lock);
14
16
17
+ // Initialize permutation array p
18
+ for (int i = 0 ; i < size ; i++){
19
+ p[i] = i ;
20
+ }
21
+
15
22
// Initialize L and U matrices
16
23
for (int i = 0 ; i < size; i++) {
17
24
for (int j = 0 ; j < size; j++) {
@@ -29,9 +36,30 @@ void l_u_d(float** a, float** l, float** u, int size)
29
36
}
30
37
31
38
// Parallelize the LU decomposition
32
- #pragma omp parallel shared(a, l, u)
39
+ #pragma omp parallel shared(a, l, u , p) // Add p to shared
33
40
{
34
41
for (int k = 0 ; k < size; k++) {
42
+ // Find pivot row
43
+ int pivot = k ;
44
+ float max_val = fabs (a[k][k]) ;
45
+ for (int i = k+1 ; i < size ; i++){
46
+ if (fabs (a[i][k] > max_val)){
47
+ pivot = i ;
48
+ max_val = fabs (a[i][k]) ;
49
+ }
50
+ }
51
+
52
+ // Row swapping
53
+ if (pivot != k){
54
+ omp_set_lock (&lock) ;
55
+ swap (p[k] , pivot) ; // Swapping in permutation array
56
+ for (int j = 0 ; j < size ; j++){
57
+ if (j < k) swap (a[k][j] , l[pivot][j]) ;
58
+ }
59
+ omp_unset_lock (&lock);
60
+ }
61
+
62
+
35
63
// Update U matrix
36
64
#pragma omp for schedule(static)
37
65
for (int j = k; j < size; j++) {
@@ -62,11 +90,13 @@ void l_u_d(float** a, float** l, float** u, int size)
62
90
int main (int argc, char *argv[]) {
63
91
int size = 2 ;
64
92
float **a, **l, **u;
93
+ int *p ; // Added permutation array
65
94
66
95
// Allocate memory for the 2D arrays
67
96
a = (float **)malloc (size * sizeof (float *));
68
97
l = (float **)malloc (size * sizeof (float *));
69
98
u = (float **)malloc (size * sizeof (float *));
99
+ p = (int *)malloc (size * sizeof (int )); // Allocated memory for pivot array
70
100
for (int i = 0 ; i < size; i++) {
71
101
a[i] = (float *)malloc (size * sizeof (float ));
72
102
l[i] = (float *)malloc (size * sizeof (float ));
@@ -85,7 +115,7 @@ int main(int argc, char *argv[]) {
85
115
}
86
116
87
117
// Perform LU decomposition
88
- l_u_d (a, l, u, size);
118
+ l_u_d (a , l , u , p , size) ; // Passed pivot array
89
119
90
120
// Print L matrix
91
121
printf (" L Matrix:\n " );
0 commit comments