Ok, vi posto l'intero main: la variabile mype rappresenta il processore che sta leggendo,
#include <iostream>
#include <cmath>
#include <fstream>
#include <mpi.h>
#define G 6.67428e-11
#define M 1.9891e30
#define MIN 0.
#define MAX 1000000000.
int x,y,vx,vy;
int main(int argc,char** argv)
{
using namespace std;
int nprocs, mype;
MPI_Status status;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
MPI_Comm_rank(MPI_COMM_WORLD, &mype);
int N;
if (mype == 0)
{
cout << "Inserisci il numero di pianeti: ";
cin >> N;
for (int k=1; k<4;k++)
MPI_Send(&N,1,MPI_INTEGER,k,k,MPI_COMM_WORLD);
}
if (mype != 0) MPI_Recv(&N,1,MPI_INTEGER,0,MPI_ANY_TAG,MPI_COMM_W ORLD,&status);
int i,n=4*N;
double h=10000.;
double *v=new double[n];
double *m=new double[N];
double a,e,AM,nn;
if (mype == 0)
{
for (i =0; i<N ; i++)
{
cout << "Inserisci il semiasse maggiore a del pianeta " << i+1 << ": ";
cin >> a;
cout << "Inserisici l'eccentricità e del pianeta " << i+1 << ": ";
cin >> e;
cout << "Inserisci l'anomalia media M del pianeta " << i+1 << ": ";
cin >> AM;
cout << "Inserisci la massa del pianeta " << i+1 << ": ";
cin >> m[i];
nn=sqrt(G*(M+m[i])/(pow(a,3)));
orb_to_car(a,e,AM,nn,v,i);
ele_pia(i);
cout << "x: " << v[x] << "y: " << v[y] << "vx: " << v[vx] << "vy: " << v[vy] << endl;
}
}
MPI_Barrier(MPI_COMM_WORLD);
MPI_Bcast(v,n,MPI_DOUBLE_PRECISION,0,MPI_COMM_WORL D);
MPI_Bcast(m,N,MPI_DOUBLE_PRECISION,0,MPI_COMM_WORL D);
/*----------------------------------------------------*/
ofstream out;
if (mype == 0) out.open("dati.dat");
for (double t=MIN; t<=MAX; t+=h)
{
runge5(v,h,m,N,mype);
if (mype==0)
{
for (i=0; i<N;i++)
{
ele_pia(i);
out << v[x] << " " << v[y] << " ";
}
out << endl;
}
}
/*----------------------------------------------------*/
if (mype == 0) out.close();
MPI_Finalize();
return 0;
}
Ho evidenzioto il ciclo for in questione. Se metto un "cout << v[0];" prima del for allora mi da come output il valore esatto che avevo inserito, se lo metto dentro il ciclo allora mi da nan.