forked from JuliaHsu/hpc_FindDet
/
TestFindDetLib.c
106 lines (102 loc) · 2.69 KB
/
TestFindDetLib.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include <stdio.h>
#include <stdlib.h>
#include "gmp.h"
#include <time.h>
#include <math.h>
#include "mpfr.h"
#define size 5000
int main(){
double max;
double tmp;
double resDet;
mpfr_t det;
double mulTmp;
mpfr_t tmp1;
mpfr_t tmp2;
mpfr_t logAbsDet;
int i,j,k,maxRow,sign;
char f_name[50];
double* buffer;
mpfr_init(det);
mpfr_init(tmp1);
mpfr_init(tmp2);
mpfr_init(logAbsDet);
buffer = malloc(size*size*sizeof(double));
sprintf(f_name,"m5000x5000.bin");
FILE *datafile=fopen(f_name,"rb");
for(i=0;i<size;i++){
for(j=0;j<size;j++){
*(buffer+size*i+j)=0;
}
}
for(i=0;i<size;i++){
for(j=0;j<size;j++){
fread(buffer+(size*i+j),sizeof(double),1,datafile);
}
}
for(i=0;i<size;i++){
for(j=0;j<size;j++){
printf("%lf\t",*(buffer+(size*i+j)));
}
printf("\n");
}
for(i=0;i<size-1;i++){
maxRow = i;
max = *(buffer+(size*i+i));
for(j=i+1;j<size;j++){
if(fabs(max)<fabs(*(buffer+size*j+i))){
max = *(buffer+size*j+i);
maxRow=j;
}
}
if(fabs(max)<0.000001){
resDet =0;
printf("det=%e\n",resDet);
exit(1);
}
if(maxRow!=i){
sign++;
for(j=i;j<size;j++){
tmp = *(buffer + size*i+j);
*(buffer+size*i+j) = *(buffer + size*maxRow+j);
*(buffer+size*maxRow+j) = tmp;
}
}
for(j=i+1;j<size;j++){
mulTmp = *(buffer+size*j+i) / *(buffer+size*i+i);
for(k=i;k<size;k++){
*(buffer+size*j+k) = *(buffer+size*j+k)-*(buffer + size*i+k)*mulTmp;
}
}
}
mpfr_set_d(tmp1,1.0,GMP_RNDN);
for(i=0;i<size;i++){
mpfr_set_d(tmp2,*(buffer+size*i+i),GMP_RNDN);
mpfr_mul(tmp1,tmp2,tmp1,GMP_RNDN);
}
if(sign%2==0){
mpfr_set(det,tmp1,GMP_RNDN);
resDet=mpfr_get_d(det,GMP_RNDN);
mpfr_log10(logAbsDet,det,GMP_RNDN);
}
else{
mpfr_neg(tmp1,tmp1,GMP_RNDN);
mpfr_set(det,tmp1,GMP_RNDN);
resDet=mpfr_get_d(det,GMP_RNDN);
mpfr_log10(logAbsDet,det,GMP_RNDN);
}
//mpf_abs(absDet,det);
// mpf_set(logAbsDet, mpfr_log10(absDet));
// mpfr_printf("det= %Fe\n",det);
printf("det= %e\n",resDet);
mpfr_printf("log(abs(det))= %Fe\n",logAbsDet);
//gmp_printf("log(abs(det)= %e\n",logAbsDet);
double END = clock();
printf("%f\n",END/CLOCKS_PER_SEC);
mpfr_clear(det);
mpfr_clear(tmp1);
mpfr_clear(tmp2);
mpfr_clear(logAbsDet);
free(buffer);
return 0;
}