1 /*
2  *_________________________________________________________________________*
3  *      POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE     *
4  *      DESCRIPTION: SEE READ-ME                                           *
5  *      FILE NAME: colmatrix.cpp                                           *
6  *      AUTHORS: See Author List                                           *
7  *      GRANTS: See Grants List                                            *
8  *      COPYRIGHT: (C) 2005 by Authors as listed in Author's List          *
9  *      LICENSE: Please see License Agreement                              *
10  *      DOWNLOAD: Free at www.rpi.edu/~anderk5                             *
11  *      ADMINISTRATOR: Prof. Kurt Anderson                                 *
12  *                     Computational Dynamics Lab                          *
13  *                     Rensselaer Polytechnic Institute                    *
14  *                     110 8th St. Troy NY 12180                           *
15  *      CONTACT:        anderk5@rpi.edu                                    *
16  *_________________________________________________________________________*/
17 
18 #include "colmatrix.h"
19 #include "rowmatrix.h"
20 #include <iostream>
21 #include <cmath>
22 #include <cstdlib>
23 
24 using namespace std;
25 
ColMatrix()26 ColMatrix::ColMatrix(){
27 	numrows = 0;
28 	elements = 0;
29 }
30 
~ColMatrix()31 ColMatrix::~ColMatrix(){
32 	delete [] elements;
33 }
34 
ColMatrix(const ColMatrix & A)35 ColMatrix::ColMatrix(const ColMatrix& A){  // copy constructor
36 	numrows = 0;
37 	elements = 0;
38 	Dim(A.numrows);
39 	for(int i=0;i<numrows;i++)
40 		elements[i] = A.elements[i];
41 }
42 
ColMatrix(const VirtualColMatrix & A)43 ColMatrix::ColMatrix(const VirtualColMatrix& A){  // copy constructor
44 	numrows = 0;
45 	elements = 0;
46 	Dim(A.GetNumRows());
47 	for(int i=0;i<numrows;i++)
48 		elements[i] = A.BasicGet(i);
49 }
50 
ColMatrix(const VirtualMatrix & A)51 ColMatrix::ColMatrix(const VirtualMatrix& A){  // copy constructor
52 	if( A.GetNumCols() != 1 ){
53 		cerr << "error trying to write a 2D matrix to a collumn" << endl;
54 		exit(1);
55 	}
56 	numrows = 0;
57 	elements = 0;
58 	Dim(A.GetNumRows());
59 	for(int i=0;i<numrows;i++)
60 		elements[i] = A.BasicGet(i,0);
61 }
62 
ColMatrix(int m)63 ColMatrix::ColMatrix(int m){  // size constructor
64 	numrows = 0;
65 	elements = 0;
66 	Dim(m);
67 }
68 
Dim(int m)69 void ColMatrix::Dim(int m){
70 	delete [] elements;
71 	numrows = m;
72 	elements = new double [m];
73 }
74 
Const(double value)75 void ColMatrix::Const(double value){
76 	for(int i=0;i<numrows;i++)
77 		elements[i] = value;
78 }
79 
GetType() const80 MatrixType ColMatrix::GetType() const{
81 	return COLMATRIX;
82 }
83 
ReadData(istream & c)84 istream& ColMatrix::ReadData(istream& c){
85 	int n;
86 	c >> n;
87 	Dim(n);
88 	for(int i=0;i<n;i++)
89 		c >> elements[i];
90 	return c;
91 }
92 
WriteData(ostream & c) const93 ostream& ColMatrix::WriteData(ostream& c) const{  //output
94 	c << numrows << ' ';
95 	for(int i=0;i<numrows;i++)
96 		c << elements[i] << ' ';
97 	return c;
98 }
99 
operator_1int(int i)100 double& ColMatrix::operator_1int (int i){ // array access
101 	if((i>numrows) || (i<1)){
102 		cerr << "matrix index invalid in operator ()" << endl;
103 		exit(1);
104 	}
105 	return elements[i-1];
106 }
107 
Get_1int(int i) const108 double ColMatrix::Get_1int(int i) const{
109 	if((i>numrows) || (i<1)){
110 		cerr << "matrix index exceeded in Get" << endl;
111 		exit(1);
112 	}
113 	return elements[i-1];
114 }
115 
Set_1int(int i,double value)116 void ColMatrix::Set_1int(int i, double value){
117 	if((i>numrows) || (i<1)){
118 		cerr << "matrix index exceeded in Set" << endl;
119 		exit(1);
120 	}
121 	elements[i-1] = value;
122 }
123 
BasicGet_1int(int i) const124 double ColMatrix::BasicGet_1int(int i) const{
125 	return elements[i];
126 }
127 
GetElementPointer(int i)128 double* ColMatrix::GetElementPointer(int i){
129 	return &(elements[i]);
130 }
131 
BasicSet_1int(int i,double value)132 void ColMatrix::BasicSet_1int(int i, double value){
133 	elements[i] = value;
134 }
135 
BasicIncrement_1int(int i,double value)136 void ColMatrix::BasicIncrement_1int(int i, double value){
137 	elements[i] += value;
138 }
139 
AssignVM(const VirtualMatrix & A)140 void ColMatrix::AssignVM(const VirtualMatrix& A){
141 	if( A.GetNumCols() != 1 ){
142 		cerr << "error trying to write a 2D matrix to a collumn" << endl;
143 		exit(1);
144 	}
145 	Dim( A.GetNumRows() );
146 	for(int i=0;i<numrows;i++)
147 		elements[i] = A.BasicGet(i,0);
148 }
149 
operator =(const ColMatrix & A)150 ColMatrix& ColMatrix::operator=(const ColMatrix& A){ // assignment operator
151 	Dim(A.numrows);
152 	for(int i=0;i<numrows;i++)
153 		elements[i] = A.elements[i];
154 	return *this;
155 }
156 
operator =(const VirtualColMatrix & A)157 ColMatrix& ColMatrix::operator=(const VirtualColMatrix& A){ // overloaded =
158 	Dim( A.GetNumRows() );
159 	for(int i=0;i<numrows;i++)
160 		elements[i] = A.BasicGet(i);
161 	return *this;
162 }
163 
operator =(const VirtualMatrix & A)164 ColMatrix& ColMatrix::operator=(const VirtualMatrix& A){ // overloaded =
165 	if( A.GetNumCols() != 1 ){
166 		cerr << "error trying to write a 2D matrix to a collumn" << endl;
167 		exit(1);
168 	}
169 	Dim( A.GetNumRows() );
170 	for(int i=0;i<numrows;i++)
171 		elements[i] = A.BasicGet(i,0);
172 	return *this;
173 }
174 
operator *=(double b)175 ColMatrix& ColMatrix::operator*=(double b){
176 	for(int i=0;i<numrows;i++)
177 		elements[i] *= b;
178 	return *this;
179 }
180 
Abs()181 void ColMatrix::Abs(){
182 	for(int i=0;i<numrows;i++)
183 		elements[i] = std::abs(elements[i]);
184 }
185 
BasicMax(double & value,int & index)186 void ColMatrix::BasicMax(double& value, int& index){
187 	value = elements[0];
188 	index = 0;
189 	for(int i=1;i<numrows;i++)
190 		if(elements[i] > value){
191 			value = elements[i];
192 			index = i;
193 		}
194 }
195 
BasicMin(double & value,int & index)196 void ColMatrix::BasicMin(double& value, int& index){
197 	value = elements[0];
198 	index = 0;
199 	for(int i=1;i<numrows;i++)
200 		if(elements[i] < value){
201 			value = elements[i];
202 			index = i;
203 		}
204 }
205 
206