int main(int argc, char *argv[]) { if(argc<2) return -1; char* fname = argv[1]; char fname_out[50] = "recon.bmp"; if (argc>2) strcpy(fname_out, argv[2]); FILE* fin = fopen(fname,"rb"); if (!fin) { printf("no such file: %s\n", fname); return -1; } int N1; int N2; int i, j; float lambda; fread(&N1, sizeof(int), 1, fin); fread(&N2, sizeof(int), 1, fin); fread(&lambda, sizeof(float), 1, fin); float complex *f = (float complex*) calloc(N1*N2,sizeof(float complex)); float *img = (float*) calloc(N1*N2,sizeof(float)); float *mask = (float*) calloc(N1*N2,sizeof(float)); float *f_r = (float*) calloc(N1*N2,sizeof(float)); float *f_i = (float*) calloc(N1*N2,sizeof(float)); // Read the data from files fread(f_r, sizeof(float), N1*N2, fin); fread(f_i, sizeof(float), N1*N2, fin); fread(mask, sizeof(float), N1*N2, fin); fclose(fin); for(i=0; i<N1; i++) { for(j=0; j<N2; j++) { f[i*N2+j] = f_r[i*N2+j] + f_i[i*N2+j]*I; } } free(f_r); free(f_i); mri(img, f, mask, lambda, N1, N2); imnorm(img, N1, N2); imwrite(img, N1, N2, fname_out); free(f); free(img); free(mask); return 0; }
int main(int argc, char *argv[]) { char* fname; char fname_out[50] = "recon.bmp"; FILE* fin; int N1; int N2; int i, j; float lambda; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &mpi_nprocs); MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank); // Include float complex as an MPI datatype and create the // float complex sum operator. MPI_Type_contiguous(2, MPI_FLOAT, &FLOAT_COMPLEX); MPI_Type_commit(&FLOAT_COMPLEX); MPI_Op_create((void*) &mpi_sum_complexf, 1, &FC_SUM); if(argc<2) { MPI_Finalize(); return -1; } fname = argv[1]; int exit = 0; if (mpi_rank == 0 && argc>2) { strcpy(fname_out, argv[2]); fin = fopen(fname,"rb"); if (!fin) { printf("no such file: %s\n", fname); exit = 1; } } MPI_Bcast(&exit, 1, MPI_INT, 0, MPI_COMM_WORLD); if (exit == 1) { MPI_Finalize(); return -1; } if (mpi_rank == 0) { fread(&N1, sizeof(int), 1, fin); fread(&N2, sizeof(int), 1, fin); fread(&lambda, sizeof(float), 1, fin); } MPI_Bcast(&N1, 1, MPI_INT, 0, MPI_COMM_WORLD); MPI_Bcast(&N2, 1, MPI_INT, 0, MPI_COMM_WORLD); MPI_Bcast(&lambda, 1, MPI_INT, 0, MPI_COMM_WORLD); float complex *f = (float complex*) calloc(N1*N2,sizeof(float complex)); float *img = (float*) calloc(N1*N2,sizeof(float)); float *mask = (float*) calloc(N1*N2,sizeof(float)); float *f_r = (float*) calloc(N1*N2,sizeof(float)); float *f_i = (float*) calloc(N1*N2,sizeof(float)); // Read the data from files if (mpi_rank == 0) { fread(f_r, sizeof(float), N1*N2, fin); fread(f_i, sizeof(float), N1*N2, fin); fread(mask, sizeof(float), N1*N2, fin); fclose(fin); for(i=0; i<N1; i++) { for(j=0; j<N2; j++) { f[i*N2+j] = f_r[i*N2+j] + f_i[i*N2+j]*I; } } } free(f_r); free(f_i); MPI_Bcast(f, N1*N2, FLOAT_COMPLEX, 0, MPI_COMM_WORLD); MPI_Bcast(mask, N1*N2, MPI_FLOAT, 0, MPI_COMM_WORLD); mri(img, f, mask, lambda, N1, N2); if (mpi_rank == 0) { imnorm(img, N1, N2); imwrite(img, N1, N2, fname_out); } free(f); free(img); free(mask); MPI_Finalize(); return 0; }
int imread(float **img, int *width, int *height, char *fname) { FILE* fin = fopen(fname, "rb"); if (!fin) { printf("cannot open input file: %s\n", fname); return -1; } BITMAPFILEHEADER bitHead; BITMAPINFOHEADER bitInfoHead; WORD fileType; int i; int j; fread(&fileType, 1, sizeof(WORD), fin); if (fileType != 0x4d42) { printf("%s is not a bmp file\n", fname); return 1; } fread(&bitHead, 1, sizeof(BITMAPFILEHEADER), fin); fread(&bitInfoHead, 1, sizeof(BITMAPINFOHEADER), fin); fseek(fin, 4*bitInfoHead.biClrUsed, SEEK_CUR); *width = bitInfoHead.biWidth; *height = bitInfoHead.biHeight; int w = bitInfoHead.biWidth; int h = bitInfoHead.biHeight; float* limg = (float*) calloc(w*h, sizeof(float)); if (bitInfoHead.biBitCount == 8) { for (i=h-1; i>=0; i--) { for (j=0; j<w; j++) { unsigned char imbyte = 0; fread(&imbyte, 1, sizeof(char), fin); limg[j*h+i] = 1.0*imbyte; } if (w%4 != 0) { int p; for (p=0; p<4-(w%4); p++) { unsigned char k = 0; fread(&k, 1, sizeof(char), fin); } } } } else if (bitInfoHead.biBitCount == 24) { for (i=h; i>=0; i--) { for (j=0; j<w; j++) { unsigned char r = 0; unsigned char g = 0; unsigned char b = 0; fread(&r, 1, sizeof(char), fin); fread(&g, 1, sizeof(char), fin); fread(&b, 1, sizeof(char), fin); limg[j*h+i] = (1.0*r+1.0*g+1.0*b)/3.0; fread(&r, 1, sizeof(char), fin); } if (w%4 != 0) { int p; for (p=0; p<4-(w%4); p++) { unsigned int k = 0; fread(&k, 1, sizeof(unsigned int), fin); } } } } imnorm(limg, w, h); *img = limg; return 0; }