/[escript]/trunk/escript/src/Data.cpp
ViewVC logotype

Diff of /trunk/escript/src/Data.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 783 by gross, Tue Jul 18 01:32:50 2006 UTC revision 790 by bcumming, Wed Jul 26 23:12:34 2006 UTC
# Line 782  Data::convertToNumArrayFromSampleNo(int Line 782  Data::convertToNumArrayFromSampleNo(int
782    
783  const  const
784  boost::python::numeric::array  boost::python::numeric::array
 #ifdef PASO_MPI  
785  Data::convertToNumArrayFromDPNo(int procNo,  Data::convertToNumArrayFromDPNo(int procNo,
786                                  int sampleNo,                                  int sampleNo,
787                                                                  int dataPointNo)                                                                  int dataPointNo)
788    
 #else  
 Data::convertToNumArrayFromDPNo(int sampleNo,  
                                 int dataPointNo)  
 #endif  
789  {  {
790        size_t length=0;
791        int i, j, k, l, pos;
792    
793    //    //
794    // Check a valid sample number has been supplied    // Check a valid sample number has been supplied
795    if (sampleNo >= getNumSamples()) {    if (sampleNo >= getNumSamples()) {
# Line 837  Data::convertToNumArrayFromDPNo(int samp Line 835  Data::convertToNumArrayFromDPNo(int samp
835      numArray.resize(arrayShape[0],arrayShape[1],arrayShape[2],arrayShape[3]);      numArray.resize(arrayShape[0],arrayShape[1],arrayShape[2],arrayShape[3]);
836    }    }
837    
838        // added for the MPI communication
839        length=1;
840        for( i=0; i<arrayRank; i++ )
841            length *= arrayShape[i];
842        double *tmpData = new double[length];
843    
844    //    //
845    // load the values for the data point into the numeric array.    // load the values for the data point into the numeric array.
846    DataArrayView dataPointView = getDataPoint(sampleNo, dataPointNo);  
847        // updated for the MPI case
848        if( get_MPIRank()==procNo ){
849            // create a view of the data if it is stored locally
850            DataArrayView dataPointView = getDataPoint(sampleNo, dataPointNo);
851            
852            // pack the data from the view into tmpData for MPI communication
853            pos=0;
854            switch( dataPointRank ){
855                case 0 :
856                    tmpData[0] = dataPointView();
857                    break;
858                case 1 :        
859                    for( i=0; i<dataPointShape[0]; i++ )
860                        tmpData[i]=dataPointView(i);
861                    break;
862                case 2 :        
863                    for( i=0; i<dataPointShape[0]; i++ )
864                        for( j=0; j<dataPointShape[1]; j++, pos++ )
865                            tmpData[pos]=dataPointView(i,j);
866                    break;
867                case 3 :        
868                    for( i=0; i<dataPointShape[0]; i++ )
869                        for( j=0; j<dataPointShape[1]; j++ )
870                            for( k=0; k<dataPointShape[2]; k++, pos++ )
871                                tmpData[pos]=dataPointView(i,j,k);
872                    break;
873                case 4 :
874                    for( i=0; i<dataPointShape[0]; i++ )
875                        for( j=0; j<dataPointShape[1]; j++ )
876                            for( k=0; k<dataPointShape[2]; k++ )
877                                for( l=0; l<dataPointShape[3]; l++, pos++ )
878                                    tmpData[pos]=dataPointView(i,j,k,l);
879                    break;
880            }
881        }
882    #ifdef PASO_MPI
883            // broadcast the data to all other processes
884            MPI_Bcast( tmpData, length, MPI_DOUBLE, procNo, get_MPIComm() );
885    #endif
886    
887        // unpack the data
888        switch( dataPointRank ){
889            case 0 :
890                numArray[i]=tmpData[0];
891                break;
892            case 1 :        
893                for( i=0; i<dataPointShape[0]; i++ )
894                    numArray[i]=tmpData[i];
895                break;
896            case 2 :        
897                for( i=0; i<dataPointShape[0]; i++ )
898                    for( j=0; j<dataPointShape[1]; j++ )
899                        tmpData[i+j*dataPointShape[0]];
900                break;
901            case 3 :        
902                for( i=0; i<dataPointShape[0]; i++ )
903                    for( j=0; j<dataPointShape[1]; j++ )
904                        for( k=0; k<dataPointShape[2]; k++ )
905                            tmpData[i+dataPointShape[0]*(j*+k*dataPointShape[1])];
906                break;
907            case 4 :
908                for( i=0; i<dataPointShape[0]; i++ )
909                    for( j=0; j<dataPointShape[1]; j++ )
910                        for( k=0; k<dataPointShape[2]; k++ )
911                            for( l=0; l<dataPointShape[3]; l++ )
912                                tmpData[i+dataPointShape[0]*(j*+dataPointShape[1]*(k+l*dataPointShape[2]))];
913                break;
914        }
915    
916        delete [] tmpData;  
917    /*
918    if (dataPointRank==0) {    if (dataPointRank==0) {
919      numArray[0]=dataPointView();      numArray[0]=dataPointView();
920    }    }
# Line 875  Data::convertToNumArrayFromDPNo(int samp Line 950  Data::convertToNumArrayFromDPNo(int samp
950        }        }
951      }      }
952    }    }
953    */
954    
955    //    //
956    // return the loaded array    // return the loaded array
# Line 1439  Data::mindp() const Line 1515  Data::mindp() const
1515    
1516    int SampleNo;    int SampleNo;
1517    int DataPointNo;    int DataPointNo;
 #ifdef PASO_MPI  
1518      int ProcNo;      int ProcNo;
1519    calc_mindp(ProcNo,SampleNo,DataPointNo);    calc_mindp(ProcNo,SampleNo,DataPointNo);
1520    return make_tuple(ProcNo,SampleNo,DataPointNo);    return make_tuple(ProcNo,SampleNo,DataPointNo);
 #else  
   calc_mindp(SampleNo,DataPointNo);  
   return make_tuple(SampleNo,DataPointNo);  
 #endif  
1521  }  }
1522    
1523  void  void
 #ifdef PASO_MPI  
1524  Data::calc_mindp(   int& ProcNo,  Data::calc_mindp(   int& ProcNo,
1525                  int& SampleNo,                  int& SampleNo,
1526          int& DataPointNo) const          int& DataPointNo) const
 #else  
 Data::calc_mindp(   int& SampleNo,  
         int& DataPointNo) const  
 #endif  
1527  {  {
1528    int i,j;    int i,j;
1529    int lowi=0,lowj=0;    int lowi=0,lowj=0;
# Line 1512  Data::calc_mindp(  int& SampleNo, Line 1578  Data::calc_mindp(  int& SampleNo,
1578    
1579      delete [] globalMins;      delete [] globalMins;
1580      ProcNo = lowProc;      ProcNo = lowProc;
1581    #else
1582        ProcNo = 0;
1583  #endif  #endif
1584    SampleNo = lowi;    SampleNo = lowi;
1585    DataPointNo = lowj;    DataPointNo = lowj;
# Line 2474  ostream& escript::operator<<(ostream& o, Line 2542  ostream& escript::operator<<(ostream& o,
2542  }  }
2543    
2544  /* Member functions specific to the MPI implementation */  /* Member functions specific to the MPI implementation */
 #ifdef PASO_MPI  
2545    
2546  void  void
2547  Data::print()  Data::print()
# Line 2495  int Line 2562  int
2562  Data::get_MPISize() const  Data::get_MPISize() const
2563  {  {
2564      int error, size;      int error, size;
2565    #ifdef PASO_MPI
2566      error = MPI_Comm_size( get_MPIComm(), &size );      error = MPI_Comm_size( get_MPIComm(), &size );
2567    #else
2568        size = 1;
2569    #endif
2570      return size;      return size;
2571  }  }
2572    
# Line 2504  int Line 2574  int
2574  Data::get_MPIRank() const  Data::get_MPIRank() const
2575  {  {
2576      int error, rank;      int error, rank;
2577    #ifdef PASO_MPI
2578      error = MPI_Comm_rank( get_MPIComm(), &rank );      error = MPI_Comm_rank( get_MPIComm(), &rank );
2579    #else
2580        rank = 0;
2581    #endif
2582      return rank;      return rank;
2583  }  }
2584    
2585  MPI_Comm  MPI_Comm
2586  Data::get_MPIComm() const  Data::get_MPIComm() const
2587  {  {
2588    #ifdef PASO_MPI
2589      return MPI_COMM_WORLD;      return MPI_COMM_WORLD;
2590  }  #else
2591        return -1;
2592  #endif  #endif
2593    }
2594    

Legend:
Removed from v.783  
changed lines
  Added in v.790

  ViewVC Help
Powered by ViewVC 1.1.26