A parte che il codice andrebbe postato come da regolamento (punto 6) perché così non si capisce granché, ci sono alcuni indici come x e y che usi nel main() ma che non hai inizializzato da nessuna parte. Li hai dichiarati globalmente, quindi è probabile che vengano modificati in una delle funzioni come orb_to_car() o ele_pia(), di cui non hai postato il codice... del resto le funzioni di libreria MPI che usi non penso scombinino molte cose perché non fanno nulla di particolare... l'unica cosa che non mi convince è
codice:
MPI_Send(&N,1,MPI_INTEGER,k,k,MPI_COMM_WORLD);
...
MPI_Recv(&N,1,MPI_INTEGER,0,MPI_ANY_TAG,MPI_COMM_WORLD,&status);
...
perché la Send ha come tag k (con k che va da 1 a 3) e le Recv corrispondenti hanno tutte tag MPI_ANY_TAG? Sei sicuro che funzioni? E poi perché hai scritto k < 4? 4 sono i processori? Perché non hai usato nprocs che sarebbe stato più corretto e generale? Io cambierei con
codice:
MPI_Send(&N,1,MPI_INTEGER,k,k,MPI_COMM_WORLD);
...
MPI_Recv(&N,1,MPI_INTEGER,0,mype,MPI_COMM_WORLD,&status);
senza contare comunque che puoi sostituire il tutto con una semplice MPI_Bcast()...
In ogni caso secondo me è impossibile individuare il problema così, se vuoi/puoi posta il programma completo (e secondo le regole!) a meno che non sia chilometrico e cerchiamo di darti un aiuto migliore.
EDIT - un'altra cosa: perché usi i tipi di dato di libreria in stile Fortran (MPI_INTEGER, MPI_DOUBLE_PRECISION) anziché quelli in C (MPI_INT, MPI_DOUBLE) ?