Alraku

45
reputation
1
10
int is_in_mandelbrot(double complex z);
int is_in_julia(double complex c, double complex z);

int main(int argc, char **argv){
    int rank, size, m=0, i, small_in=0, big_in;
    double* a;
    double* b;
    //double t[2];
    double complex c;
    c = 2.0+1.0*I;

    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);

    if(rank == 0){
        FILE *myFile;
        myFile = fopen("/home/laurence/Desktop/cs/3INF/kolokwium/dane.txt", "r");
        //fscanf(myFile, "%1d %lf %lf", &m, &t[0], &t[1]);
        fscanf(myFile, "%d", &m);
        for(i=1;i<size;i++){
            MPI_Send(&m,1,MPI_INT,i,0,MPI_COMM_WORLD);
        }
        //for(i=1;i<size;i++){
        //    MPI_Send(&t[0],2,MPI_DOUBLE,i,0,MPI_COMM_WORLD);
        //}
        fclose(myFile);
    }
    else{
        MPI_Recv(&m,1,MPI_INT,0,0,MPI_COMM_WORLD, NULL);
        //MPI_Recv(&t[0],2,MPI_DOUBLE,0,0,MPI_COMM_WORLD,NULL);
    }
    //printf("t:%lf %lf\n",t[0],t[1]);
    //printf("%d moje m %d\n",rank,m);
    //c = t[0]+t[1]*I;
    a = (double *)malloc(m*sizeof(double));
    b = (double *)malloc(m*sizeof(double));

    if(rank == 0){
        FILE *myFile;
        double t1,t2;
        int i=0;
        myFile = fopen("/home/laurence/Desktop/cs/3INF/kolokwium/dane.txt", "r");  
        //fscanf(myFile, "%d %lf %lf", &m, &t1, &t2);
        fscanf(myFile, "%d", &m);
        while (fscanf(myFile, "%lf %lf", &t1, &t2)){
            a[i] = t1;
            b[i] = t2;
            //printf("%lf %lf\n\n",a[i],b[i]);
            if(++i == m) break;
        }
        fclose(myFile);
    }
    MPI_Barrier(MPI_COMM_WORLD);

    MPI_Bcast(&a[0],m,MPI_DOUBLE,0,MPI_COMM_WORLD);
    MPI_Bcast(&b[0],m,MPI_DOUBLE,0,MPI_COMM_WORLD);

    double complex c_nums[m];

    for(i=0;i<m;i++){
        c_nums[i] = a[i]+b[i]*I;
    }    



    for(i=rank;i<m;i+=size){
        //printf("%d : %d : %.2lf\n",rank, is_in_mandelbrot(c_nums[i]), cabs(c_nums[i]));
        if(cabs(c_nums[i]) < 2 && is_in_mandelbrot(c_nums[i]))
            small_in++;
    }

    MPI_Reduce(&small_in,&big_in,1,MPI_INT,MPI_SUM, 0, MPI_COMM_WORLD);

    if(rank == 0){
        printf("Punktow w zbiorze jest %d/%d\n",big_in,m);
    }

    MPI_Finalize();


    return 0;
}

int is_in_mandelbrot(double complex z) {

    int N = 10000;
    unsigned int i = 0;
    double complex zi = 0.0 + 0.0 * I;
    while (creal(zi)*creal(zi)+cimag(zi)*cimag(zi) < 4 && i++ < N) {
        zi = zi*zi + z;
    }
    if (i < N) 
        return 0;
    else
        return 1;
}

int is_in_julia(double complex c, double complex z) {

    int N = 10000;
    unsigned int i = 0;
    double complex zi = c;
    while (creal(zi)*creal(zi)+cimag(zi)*cimag(zi) < 4 && i++ < N) {
        zi = zi*zi + z;
    }
    if (i < N) 
        return 0;
    else
        return 1;
}

SPACER