00001 #include "hpssolver.h" 00002 #include "genfile.h" 00003 #include "mpi.h" 00004 #include "pglobal.h" 00005 /* 00006 void par_solve_stochastic_problem (stochdriver *stochd) 00007 { 00008 00009 long i,l,buffsize; 00010 double buff; 00011 MPI_Status stat; 00012 00013 // computation and distribution of buffsize 00014 if (Myrank==0){ 00015 if (stochd->nstochvar > stochd->nprunknowns){ 00016 // number of input parameters is greater than number of output parameters 00017 buffsize = stochd->nstochvar + 1; 00018 } 00019 else{ 00020 // number of output parameters is greater than number of input parameters 00021 buffsize = stochd->nprunknowns + 1; 00022 } 00023 for (i=1;i<Nproc;i++){ 00024 MPI_Send (buffsize,1,MPI_LONG,i,myrank,MPI_COMM_WORLD); 00025 } 00026 } 00027 else{ 00028 MPI_Recv (buffsize,1,MPI_LONG,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&stat); 00029 } 00030 00031 00032 // evaluation of samples 00033 if (Myrank==0){ 00034 // number of computed sample 00035 ncs=0; 00036 if (stochd->nsampl>Nproc){ 00037 for (i=1;i<Nproc;i++){ 00038 // generation of new input data 00039 stochd->assemble_new_values (ncs); 00040 ncs++; 00041 // copying of input data into buffer 00042 stochd->give_new_values (buff); 00043 // scatering of data to appropriate processors 00044 MPI_Send (buff,buffsize,MPI_DOUBLE,i,myrank,MPI_COMM_WORLD); 00045 } 00046 do{ 00047 // receiving of output 00048 MPI_Recv (buff,buffsize,MPI_LONG,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&stat); 00049 l=stat.MPI_TAG; 00050 00051 // import of output data from buffer to stochdriver 00052 stochd->save_new_outvalues (buff); 00053 // save results in object stochdriver 00054 // ta nula neni dobre, provizorium 00055 stochd->save_results (0); 00056 00057 // generation of new input data 00058 stochd->assemble_new_values (ncs); 00059 ncs++; 00060 // copying of input data into buffer 00061 stochd->give_new_values (buff); 00062 // scatering of data to appropriate processors 00063 MPI_Send (buff,buffsize,MPI_DOUBLE,l,myrank,MPI_COMM_WORLD); 00064 00065 if (ncs==stochd->nsampl){ 00066 for (i=1;i<Nproc;i++){ 00067 buff[buffsize-1]=1.0; 00068 MPI_Send (buff,buffsize,MPI_DOUBLE,i,myrank,MPI_COMM_WORLD); 00069 } 00070 break; 00071 } 00072 00073 }while(); 00074 } 00075 else{ 00076 fprintf (stderr,"\n\n number of samples is less than number of used processors,"); 00077 fprintf (stderr,"\n use number of processors equal to number of samples,\n\n"); 00078 abort (); 00079 } 00080 } 00081 else{ 00082 // slave processors 00083 do{ 00084 MPI_Recv (buff,buffsize,MPI_LONG,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&stat); 00085 if (buff[buffsize-1]>0.5) break; 00086 00087 // import of new values to object stochdriver 00088 stochd->save_new_values (buff); 00089 // update of stochastic values 00090 stochd->replace_values (); 00091 00092 // deterministic computation 00093 solve_deterministic_problem (); 00094 00095 // extraction of output data 00096 stochd->extractor (0); 00097 // import of computed values from stochdriver to buffer 00098 stochd->save_new_outvalues (buff); 00099 00100 MPI_Send (buff,buffsize,MPI_DOUBLE,0,myrank,MPI_COMM_WORLD); 00101 }while(); 00102 00103 } 00104 00105 00106 } 00107 00108 */