00001 void par_solve_stochastic_problem (stochdriver *stochd)
00002 {
00003 long i,j,buffsize;
00004 double *buff;
00005 MPI_Status stat;
00006
00007 if (Myrank==0){
00008 if (St->nsampl<Nproc-1){
00009 fprintf (stderr,"\n\n the number of samples is less than the number of processors");
00010 fprintf (stderr,"\n the program finishes, reduce the number of processors (file %s, line %d)\n",__FILE__,__LINE__);
00011 buffsize=0;
00012 }
00013 else{
00014 buffsize=St->nstochvar+1;
00015 }
00016
00017 for (i=1;i<Nproc;i++){
00018 MPI_Send (&buffsize,1,MPI_LONG,i,myrank,MPI_COMM_WORLD);
00019 }
00020
00021 }
00022 else{
00023 MPI_Recv (&buffsize,1,MPI_LONG,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&stat);
00024 }
00025
00026 if (buffsize>0){
00027 buff = new double [buffsize];
00028
00029 if (Myrank==0){
00030 sampleid=0;
00031 for (i=1;i<Nproc;i++){
00032 St->assemble_new_values (sampleid);
00033 sampleid++;
00034 St->give_new_values (buff);
00035 MPI_Send (buff,buffsize,MPI_DOUBLE,i,myrank,MPI_COMM_WORLD);
00036 }
00037 }
00038 else{
00039 sampleid=0;
00040 MPI_Recv (buff,buffsize,MPI_LONG,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&stat);
00041 St->save_new_values (buff);
00042 St->replace_values ();
00043
00044 Lsrs->clean_lhs ();
00045 Mm->clean_ip ();
00046 Mt->clean_nodes ();
00047 solve_mefel_deterministic_problem ();
00048 St->extractor (sampleid);
00049 sampleid++;
00050 }
00051
00052
00053 if (Myrank==0){
00054 do{
00055 MPI_Recv (buff,buffsize,MPI_LONG,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&stat);
00056 St->assemble_new_values (sampleid);
00057 sampleid++;
00058 St->give_new_values (buff);
00059 buff[buffsize]=1.0;
00060 MPI_Send (buff,buffsize,MPI_DOUBLE,i,myrank,MPI_COMM_WORLD);
00061
00062 }
00063 while(sampleid<St->nsampl);
00064
00065 }
00066 else{
00067 do{
00068 MPI_Send (buff,buffsize,MPI_DOUBLE,i,myrank,MPI_COMM_WORLD);
00069 MPI_Recv (buff,buffsize,MPI_DOUBLE,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&stat);
00070 St->save_new_values (buff);
00071 St->replace_values ();
00072
00073 Lsrs->clean_lhs ();
00074 Mm->clean_ip ();
00075 Mt->clean_nodes ();
00076 solve_mefel_deterministic_problem ();
00077 St->extractor (sampleid);
00078 sampleid++;
00079
00080 stop=buff[buffsize];
00081 }
00082 while(stop>0);
00083 }
00084
00085 }
00086
00087
00088
00089
00090 for (i=1;i<St->nsampl+1;i++){
00091 MPI_Send (buff,buffsize,MPI_DOUBLE,i,myrank,MPI_COMM_WORLD);
00092 MPI_Recv (buff,buffsize,MPI_LONG,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&stat);
00093
00094 }
00095 }
00096 }
00097
00098
00099
00100 if (Myrank==0){
00101 ncs=0;
00102 if (stochd->nsampl>Nproc){
00103 for (i=1;i<Nproc;i++){
00104 stochd->input_data (i,buff);
00105 MPI_Send (buff,buffsize,MPI_DOUBLE,i,myrank,MPI_COMM_WORLD);
00106 }
00107 do{
00108 MPI_Recv (buff,buffsize,MPI_LONG,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&stat);
00109 l=stat.MPI_TAG;
00110 stochd->output_data (ncs,buff);
00111 ncs++;
00112 if (ncs==stochd->nsampl){
00113 for (i=1;i<Nproc;i++){
00114 buff[buffsize-1]=1.0;
00115 MPI_Send (buff,buffsize,MPI_DOUBLE,i,myrank,MPI_COMM_WORLD);
00116 }
00117 break;
00118 }
00119 stochd->input_data (ncs,buff);
00120 MPI_Send (buff,buffsize,MPI_DOUBLE,l,myrank,MPI_COMM_WORLD);
00121 }while();
00122 }
00123 else{
00124 abort ();
00125 }
00126 }
00127 else{
00128
00129 do{
00130 MPI_Recv (buff,buffsize,MPI_LONG,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&stat);
00131 if (buff[buffsize-1]>0.5) break;
00132
00133 stochd->changevalues (buff);
00134 solve_deterministic_problem ();
00135 stochd->extractor (buff);
00136
00137 MPI_Send (buff,buffsize,MPI_DOUBLE,0,myrank,MPI_COMM_WORLD);
00138 }while();
00139
00140 }
00141
00142
00143 }
00144