/* remove all residential parcels */ parcel = parcels->data; head = &(parcels->data); while(parcel != NULL) { if(strncmp(parcel->data[2], "R", 1) == 0) { head = &(parcel->next); parcel = parcel->next; } else { *head = parcel->next; clusterGIS_Free_record(parcel); parcel = *head; } } /* Find the min distance */ employer = employers->data; min = malloc(sizeof(double)*2); global_min = malloc(sizeof(double)*2); output = clusterGIS_Create_dataset(); while(employer != NULL) { /* find the local min */ parcel = parcels->data; GEOSDistance(employer->geometry, parcel->geometry, &min_distance); min_distance_parcel = parcel; while(parcel != NULL) { if(strncmp(employer->data[2], parcel->data[2], 1) == 0) { GEOSDistance(employer->geometry, parcel->geometry, &distance); if(distance < min_distance) { min_distance = distance; min_distance_parcel = parcel; } } parcel = parcel->next; } /* find the global min */ min[0] = atoi(min_distance_parcel->data[0]); min[1] = min_distance; MPI_Allreduce(min, global_min, 2, MPI_DOUBLE, min_distance_op, parcels_comm); /* Add the min to the output dataset using front insertion*/ sprintf(output_csv, "\"%s\",\"%d\"\n", employer->data[0], (int) global_min[0]); start = 0; output_record = clusterGIS_Create_record_from_csv(output_csv, &start); output_record->next = output->data; output->data = output_record; employer = employer->next; }