gMatrix.cpp

Go to the documentation of this file.
00001 /* ****************************************************************** **
00002 **    OpenSees - Open System for Earthquake Engineering Simulation    **
00003 **          Pacific Earthquake Engineering Research Center            **
00004 **                                                                    **
00005 **                                                                    **
00006 ** (C) Copyright 1999, The Regents of the University of California    **
00007 ** All Rights Reserved.                                               **
00008 **                                                                    **
00009 ** Commercial use of this program without express permission of the   **
00010 ** University of California, Berkeley, is strictly prohibited.  See   **
00011 ** file 'COPYRIGHT'  in main directory for information on usage and   **
00012 ** redistribution,  and for a DISCLAIMER OF ALL WARRANTIES.           **
00013 **                                                                    **
00014 ** Developed by:                                                      **
00015 **   Frank McKenna (fmckenna@ce.berkeley.edu)                         **
00016 **   Gregory L. Fenves (fenves@ce.berkeley.edu)                       **
00017 **   Filip C. Filippou (filippou@ce.berkeley.edu)                     **
00018 **                                                                    **
00019 ** ****************************************************************** */
00020                                                                         
00021 // $Revision: 1.2 $
00022 // $Date: 2003/02/14 23:01:58 $
00023 // $Source: /usr/local/cvs/OpenSees/SRC/renderer/gMatrix.cpp,v $
00024                                                                         
00025                                                                         
00026 #include "gMatrix.H"
00027 
00028 int
00029 VECTOR::MakeNonHomogeneous()
00030 // Goes from a homogeneous 4D Vector into a non-homogeneous 3D
00031 // vector (4th coordinate is 1).
00032 {
00033   if (v[3] == 0)
00034     {
00035       opserr << "ERROR: w coordinate of vector is 0, cannot unhomogeneize" << endln;
00036       return 0;
00037     }
00038   v[0] = v[0]/v[3];
00039   v[1] = v[1]/v[3];
00040   v[2] = v[2]/v[3];
00041   v[3] = 1;
00042   return 1;
00043 }
00044 
00045 
00046 VECTOR 
00047 VECTOR::operator*(MATRIX &M)
00048 // Implements VECTOR * MATRIX multiplications
00049 { 
00050   VECTOR *V = new VECTOR;
00051   V[0] = v[0] * M.m[0][0] + v[1] * M.m[1][0] + v[2] * M.m[2][0] + v[3] * M.m[3][0];
00052   V[1] = v[0] * M.m[0][1] + v[1] * M.m[1][1] + v[2] * M.m[2][1] + v[3] * M.m[3][1];
00053   V[2] = v[0] * M.m[0][2] + v[1] * M.m[1][2] + v[2] * M.m[2][2] + v[3] * M.m[3][2];
00054   V[3] = v[0] * M.m[0][3] + v[1] * M.m[1][3] + v[2] * M.m[2][3] + v[3] * M.m[3][3];
00055   return *V;
00056 }
00057 void
00058 VECTOR::TimesMat(MATRIX &M)
00059 // Implements MATRIX * VECTOR and overwrites the VECTOR
00060 {
00061   float a,b,c,d;
00062   a = v[0] * M.m[0][0] + v[1] * M.m[0][1] + v[2] * M.m[0][2] + v[3] * M.m[0][3];
00063   b = v[0] * M.m[1][0] + v[1] * M.m[1][1] + v[2] * M.m[1][2] + v[3] * M.m[1][3];
00064   c = v[0] * M.m[2][0] + v[1] * M.m[2][1] + v[2] * M.m[2][2] + v[3] * M.m[2][3];
00065   d = v[0] * M.m[3][0] + v[1] * M.m[3][1] + v[2] * M.m[3][2] + v[3] * M.m[3][3];
00066   v[0] = a; v[1] = b; v[2] = c; v[3] = d;
00067 }
00068 
00069 void 
00070 MATRIX::Set(float a1, float a2, float a3, float a4,
00071             float b1, float b2, float b3, float b4,
00072             float c1, float c2, float c3, float c4,
00073             float d1, float d2, float d3, float d4)
00074 // Sets matrix to specified values.
00075 {
00076   m[0][0] = a1;
00077   m[0][1] = a2;
00078   m[0][2] = a3;
00079   m[0][3] = a4;
00080   
00081   m[1][0] = b1;
00082   m[1][1] = b2;
00083   m[1][2] = b3;
00084   m[1][3] = b4;
00085   
00086   m[2][0] = c1;
00087   m[2][1] = c2;
00088   m[2][2] = c3;
00089   m[2][3] = c4;
00090   
00091   m[3][0] = d1;
00092   m[3][1] = d2;
00093   m[3][2] = d3;
00094   m[3][3] = d4;
00095 }
00096 
00097 MATRIX 
00098 MATRIX::Transpose()
00099 { 
00100   MATRIX *retMat = new MATRIX();
00101   int i,j;
00102   for (i=0; i<4; i++)
00103     for (j=0; j<4; j++)
00104        retMat->m[i][j] = m[j][i];
00105   return *retMat;
00106 }
00107 
00108 MATRIX 
00109 MATRIX::operator*(MATRIX &M)
00110 // Implements MATRIX * MATRIX multiplication
00111 {
00112   MATRIX *retMat = new MATRIX();
00113   int i,j,k;
00114   float sum;
00115   for (i=0; i<4; i++) 
00116     for (j=0; j<4; j++) {
00117       sum = 0.0;
00118       for (k=0; k<4; k++) 
00119         sum = sum + m[i][k] * M.m[k][j];
00120       retMat->m[i][j] = sum;
00121     }
00122      
00123   return *retMat;
00124 }
00125 
00126 
00127 // Debugging output
00128 
00129 OPS_Stream &
00130 operator<<(OPS_Stream &os, VECTOR &v)
00131 {
00132   os << "[ " << v[0] << ' ' << v[1] << ' ' << v[2] << ' ' << v[3] << " ]";
00133   return os;
00134 }
00135 
00136 OPS_Stream &
00137 operator<<(OPS_Stream &os, MATRIX &M)
00138 {
00139   os << "{ " << M.m[0][0] << ' ' << M.m[0][1] << ' ' << M.m[0][2] << ' ' << M.m[0][3] << " }" << endln;
00140   os << "{ " << M.m[1][0] << ' ' << M.m[1][1] << ' ' << M.m[1][2] << ' ' << M.m[1][3] << " }" << endln;
00141   os << "{ " << M.m[2][0] << ' ' << M.m[2][1] << ' ' << M.m[2][2] << ' ' << M.m[2][3] << " }" << endln;
00142   os << "{ " << M.m[3][0] << ' ' << M.m[3][1] << ' ' << M.m[3][2] << ' ' << M.m[3][3] << " }" << endln;
00143   return os;
00144 }
00145 
00146 

Generated on Mon Oct 23 15:05:27 2006 for OpenSees by doxygen 1.5.0