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

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

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

revision 112 by jgs, Thu Jan 27 06:21:59 2005 UTC revision 113 by jgs, Mon Feb 28 07:06:33 2005 UTC
# Line 646  DataArrayView::copySliceFrom(ValueType:: Line 646  DataArrayView::copySliceFrom(ValueType::
646    
647  }  }
648    
 DataArrayView::ShapeType  
 DataArrayView::determineResultShape(const DataArrayView& left,  
                                     const DataArrayView& right)  
 {  
     DataArrayView::ShapeType temp;  
     for (int i=0; i<(left.getRank()-1); i++) {  
       temp.push_back(left.getShape()[i]);  
     }  
     for (int i=1; i<right.getRank(); i++) {  
       temp.push_back(right.getShape()[i]);  
     }  
     return temp;  
 }  
   
649  string  string
650  DataArrayView::toString(const string& suffix) const  DataArrayView::toString(const string& suffix) const
651  {  {
# Line 745  DataArrayView::matMult(const DataArrayVi Line 731  DataArrayView::matMult(const DataArrayVi
731                         const DataArrayView& right,                         const DataArrayView& right,
732                         DataArrayView& result)                         DataArrayView& result)
733  {  {
734    
735      if (left.getRank()==0 || right.getRank()==0) {      if (left.getRank()==0 || right.getRank()==0) {
736        stringstream temp;        stringstream temp;
737        temp << "Error - (matMult) Invalid for rank 0 objects.";        temp << "Error - (matMult) Invalid for rank 0 objects.";
# Line 759  DataArrayView::matMult(const DataArrayVi Line 746  DataArrayView::matMult(const DataArrayVi
746         << " of RHS don't match.";         << " of RHS don't match.";
747        throw DataException(temp.str());        throw DataException(temp.str());
748      }      }
749    
750      int outputRank=left.getRank()+right.getRank()-2;      int outputRank=left.getRank()+right.getRank()-2;
751            
752      if (outputRank < 0) {      if (outputRank < 0) {
# Line 798  DataArrayView::matMult(const DataArrayVi Line 786  DataArrayView::matMult(const DataArrayVi
786      }      }
787    
788      switch (left.getRank()) {      switch (left.getRank()) {
789      case 1:  
       switch (right.getRank()) {  
790        case 1:        case 1:
791      result()=0;          switch (right.getRank()) {
792      for (int i=0;i<left.getShape()[0];++i) {            case 1:
793        result()+=left(i)*right(i);              result()=0;
794      }              for (int i=0;i<left.getShape()[0];i++) {
795      break;                result()+=left(i)*right(i);
796        case 2:              }
797          for (int i=0;i<result.getShape()[0];++i) {              break;
798        result(i)=0;            case 2:
799        for (int j=0;j<right.getShape()[0];++j) {              for (int i=0;i<result.getShape()[0];i++) {
800          result(i)+=left(j)*right(j,i);                result(i)=0;
801        }                for (int j=0;j<right.getShape()[0];j++) {
802      }                  result(i)+=left(j)*right(j,i);
803          break;                }
804        default:              }
805      stringstream temp;              break;
806      temp << "Error - (matMult) Invalid rank. Programming error.";            default:
807          throw DataException(temp.str());              stringstream temp; temp << "Error - (matMult) Invalid rank. Programming error.";
808                throw DataException(temp.str());
809                break;
810            }
811          break;          break;
812        }  
       break;  
     case 2:  
       switch (right.getRank()) {  
       case 1:  
     result()=0;  
     for (int i=0;i<left.getShape()[0];++i) {  
       result(i)=0;  
       for (int j=0;j<left.getShape()[1];++j) {  
         result(i)+=left(i,j)*right(i);  
       }  
     }  
     break;  
813        case 2:        case 2:
814          for (int i=0;i<result.getShape()[0];++i) {          switch (right.getRank()) {
815        for (int j=0;j<result.getShape()[1];++j) {            case 1:
816          result(i,j)=0;              result()=0;
817          for (int jR=0;jR<right.getShape()[0];++jR) {                for (int i=0;i<left.getShape()[0];i++) {
818            result(i,j)+=left(i,jR)*right(jR,j);                 result(i)=0;
819          }                 for (int j=0;j<left.getShape()[1];j++) {
820        }                   result(i)+=left(i,j)*right(i);
821      }                 }
822                }
823            break;
824              case 2:
825                for (int i=0;i<result.getShape()[0];i++) {
826                  for (int j=0;j<result.getShape()[1];j++) {
827                    result(i,j)=0;
828                    for (int jR=0;jR<right.getShape()[0];jR++) {
829                      result(i,j)+=left(i,jR)*right(jR,j);
830                    }
831                  }
832                }
833                break;
834              default:
835                stringstream temp; temp << "Error - (matMult) Invalid rank. Programming error.";
836                throw DataException(temp.str());
837                break;
838            }
839          break;          break;
840    
841        default:        default:
842      stringstream temp;          stringstream temp; temp << "Error - (matMult) Not supported for rank: " << left.getRank();
     temp << "Error - (matMult) Invalid rank. Programming error.";  
843          throw DataException(temp.str());          throw DataException(temp.str());
844          break;          break;
       }  
       break;  
     default:  
       stringstream temp;  
       temp << "Error - (matMult) Not supported for rank: " << left.getRank();  
       throw DataException(temp.str());  
       break;  
845      }      }
846    
847    }
848    
849    DataArrayView::ShapeType
850    DataArrayView::determineResultShape(const DataArrayView& left,
851                                        const DataArrayView& right)
852    {
853        DataArrayView::ShapeType temp;
854        for (int i=0; i<(left.getRank()-1); i++) {
855          temp.push_back(left.getShape()[i]);
856        }
857        for (int i=1; i<right.getRank(); i++) {
858          temp.push_back(right.getShape()[i]);
859        }
860        return temp;
861  }  }
862    
863  bool operator==(const DataArrayView& left, const DataArrayView& right)  bool operator==(const DataArrayView& left, const DataArrayView& right)

Legend:
Removed from v.112  
changed lines
  Added in v.113

  ViewVC Help
Powered by ViewVC 1.1.26