Skip to content

Commit e24d5bc

Browse files
RushikeshiitbLoPA607
authored andcommitted
Fix Issue #9: Add partial pivoting to LU Factorization
1 parent c46c3c2 commit e24d5bc

File tree

1 file changed

+34
-4
lines changed

1 file changed

+34
-4
lines changed

src/LU_factorisation.cpp

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,24 @@
11
// lu_decomposition.cpp
2-
#include "lu_decomposition.h"
2+
#include "../include/lu_decomposition.h"
33
#include <omp.h>
44
#include <iostream>
55
#include <cstdio>
66
#include <cstdlib>
7+
#include <cmath>
8+
79
using namespace std;
810
// 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
1012
{
1113
// Initialize a simple lock for parallel region
1214
omp_lock_t lock;
1315
omp_init_lock(&lock);
1416

17+
// Initialize permutation array p
18+
for(int i = 0 ; i < size ; i++){
19+
p[i] = i ;
20+
}
21+
1522
// Initialize L and U matrices
1623
for (int i = 0; i < size; i++) {
1724
for (int j = 0; j < size; j++) {
@@ -29,9 +36,30 @@ void l_u_d(float** a, float** l, float** u, int size)
2936
}
3037

3138
// 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
3340
{
3441
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+
3563
// Update U matrix
3664
#pragma omp for schedule(static)
3765
for (int j = k; j < size; j++) {
@@ -62,11 +90,13 @@ void l_u_d(float** a, float** l, float** u, int size)
6290
int main(int argc, char *argv[]) {
6391
int size = 2;
6492
float **a, **l, **u;
93+
int *p ; // Added permutation array
6594

6695
// Allocate memory for the 2D arrays
6796
a = (float **)malloc(size * sizeof(float *));
6897
l = (float **)malloc(size * sizeof(float *));
6998
u = (float **)malloc(size * sizeof(float *));
99+
p = (int *)malloc(size * sizeof(int)); // Allocated memory for pivot array
70100
for (int i = 0; i < size; i++) {
71101
a[i] = (float *)malloc(size * sizeof(float));
72102
l[i] = (float *)malloc(size * sizeof(float));
@@ -85,7 +115,7 @@ int main(int argc, char *argv[]) {
85115
}
86116

87117
// Perform LU decomposition
88-
l_u_d(a, l, u, size);
118+
l_u_d(a , l , u , p , size) ; // Passed pivot array
89119

90120
// Print L matrix
91121
printf("L Matrix:\n");

0 commit comments

Comments
 (0)