1 /*
2 *_________________________________________________________________________*
3 * POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE *
4 * DESCRIPTION: SEE READ-ME *
5 * FILE NAME: colmatmap.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 "colmatmap.h"
19 #include "colmatrix.h"
20 #include <iostream>
21 #include <cstdlib>
22
23 using namespace std;
24
ColMatMap()25 ColMatMap::ColMatMap(){
26 numrows = 0;
27 elements = 0;
28 }
29
~ColMatMap()30 ColMatMap::~ColMatMap(){
31 delete [] elements;
32 }
33
ColMatMap(const ColMatMap & A)34 ColMatMap::ColMatMap(const ColMatMap& A){ // copy constructor
35 numrows = 0;
36 elements = 0;
37 Dim(A.numrows);
38 for(int i=0;i<numrows;i++)
39 elements[i] = A.elements[i];
40 }
41
ColMatMap(ColMatrix & A)42 ColMatMap::ColMatMap(ColMatrix& A){ // copy constructor
43 numrows = 0;
44 elements = 0;
45 Dim(A.GetNumRows());
46 for(int i=0;i<numrows;i++)
47 elements[i] = A.GetElementPointer(i);
48 }
49
50 /*
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 */
63
ColMatMap(int m)64 ColMatMap::ColMatMap(int m){ // size constructor
65 numrows = 0;
66 elements = 0;
67 Dim(m);
68 }
69
Dim(int m)70 void ColMatMap::Dim(int m){
71 delete [] elements;
72 numrows = m;
73 elements = new double* [m];
74 }
75
Const(double value)76 void ColMatMap::Const(double value){
77 for(int i=0;i<numrows;i++)
78 *(elements[i]) = value;
79 }
80
GetType() const81 MatrixType ColMatMap::GetType() const{
82 return COLMATMAP;
83 }
84
WriteData(ostream & c) const85 ostream& ColMatMap::WriteData(ostream& c) const{ //output
86 c << numrows << ' ';
87 for(int i=0;i<numrows;i++)
88 c << *(elements[i]) << ' ';
89 return c;
90 }
91
operator_1int(int i)92 double& ColMatMap::operator_1int (int i){ // array access
93 if((i>numrows) || (i<1)){
94 cerr << "matrix index invalid in operator ()" << endl;
95 exit(1);
96 }
97 return *(elements[i-1]);
98 }
99
Get_1int(int i) const100 double ColMatMap::Get_1int(int i) const{
101 if((i>numrows) || (i<1)){
102 cerr << "matrix index exceeded in Get" << endl;
103 exit(1);
104 }
105 return *(elements[i-1]);
106 }
107
Set_1int(int i,double value)108 void ColMatMap::Set_1int(int i, double value){
109 if((i>numrows) || (i<1)){
110 cerr << "matrix index exceeded in Set" << endl;
111 exit(1);
112 }
113 *(elements[i-1]) = value;
114 }
115
BasicGet_1int(int i) const116 double ColMatMap::BasicGet_1int(int i) const{
117 return *(elements[i]);
118 }
119
SetElementPointer(int i,double * p)120 void ColMatMap::SetElementPointer(int i, double* p){
121 elements[i] = p;
122 }
123
GetElementPointer(int i)124 double* ColMatMap::GetElementPointer(int i){
125 return elements[i];
126 }
127
BasicSet_1int(int i,double value)128 void ColMatMap::BasicSet_1int(int i, double value){
129 *(elements[i]) = value;
130 }
131
BasicIncrement_1int(int i,double value)132 void ColMatMap::BasicIncrement_1int(int i, double value){
133 *(elements[i]) += value;
134 }
135
AssignVM(const VirtualMatrix & A)136 void ColMatMap::AssignVM(const VirtualMatrix& A){
137 if(A.GetNumRows() != numrows){
138 cerr << "dimension mismatch in ColMatMap assignment" << endl;
139 exit(0);
140 }
141 if( A.GetNumCols() != 1 ){
142 cerr << "error trying to write a 2D matrix to a collumn" << endl;
143 exit(1);
144 }
145 for(int i=0;i<numrows;i++)
146 *(elements[i]) = A.BasicGet(i,0);
147 }
148
operator =(const ColMatMap & A)149 ColMatMap& ColMatMap::operator=(const ColMatMap& A){ // assignment operator
150 if(A.numrows != numrows){
151 cerr << "dimension mismatch in ColMatMap assignment" << endl;
152 exit(0);
153 }
154 for(int i=0;i<numrows;i++)
155 *(elements[i]) = *(A.elements[i]);
156 return *this;
157 }
158
operator =(const ColMatrix & A)159 ColMatMap& ColMatMap::operator=(const ColMatrix& A){ // assignment operator
160 if(A.GetNumRows() != numrows){
161 cerr << "dimension mismatch in ColMatMap assignment" << endl;
162 exit(0);
163 }
164 for(int i=0;i<numrows;i++)
165 *(elements[i]) = A.BasicGet(i);
166 return *this;
167 }
168
operator =(const VirtualColMatrix & A)169 ColMatMap& ColMatMap::operator=(const VirtualColMatrix& A){ // overloaded =
170 if(A.GetNumRows() != numrows){
171 cerr << "dimension mismatch in ColMatMap assignment" << endl;
172 exit(0);
173 }
174 for(int i=0;i<numrows;i++)
175 *(elements[i]) = A.BasicGet(i);
176 return *this;
177 }
178
operator =(const VirtualMatrix & A)179 ColMatMap& ColMatMap::operator=(const VirtualMatrix& A){ // overloaded =
180 if(A.GetNumRows() != numrows){
181 cerr << "dimension mismatch in ColMatMap assignment" << endl;
182 exit(0);
183 }
184 if( A.GetNumCols() != 1 ){
185 cerr << "error trying to write a 2D matrix to a collumn" << endl;
186 exit(1);
187 }
188 for(int i=0;i<numrows;i++)
189 *(elements[i]) = A.BasicGet(i,0);
190 return *this;
191 }
192
operator *=(double b)193 ColMatMap& ColMatMap::operator*=(double b){
194 for(int i=0;i<numrows;i++)
195 *(elements[i]) *= b;
196 return *this;
197 }
198
199