lammps/lib/poems/colmatrix.cpp

206 lines
4.8 KiB
C++

/*
*_________________________________________________________________________*
* POEMS: PARALLELIZABLE OPEN SOURCE EFFICIENT MULTIBODY SOFTWARE *
* DESCRIPTION: SEE READ-ME *
* FILE NAME: colmatrix.cpp *
* AUTHORS: See Author List *
* GRANTS: See Grants List *
* COPYRIGHT: (C) 2005 by Authors as listed in Author's List *
* LICENSE: Please see License Agreement *
* DOWNLOAD: Free at www.rpi.edu/~anderk5 *
* ADMINISTRATOR: Prof. Kurt Anderson *
* Computational Dynamics Lab *
* Rensselaer Polytechnic Institute *
* 110 8th St. Troy NY 12180 *
* CONTACT: anderk5@rpi.edu *
*_________________________________________________________________________*/
#include "colmatrix.h"
#include "rowmatrix.h"
#include <iostream>
#include <cmath>
#include <cstdlib>
using namespace std;
ColMatrix::ColMatrix(){
numrows = 0;
elements = 0;
}
ColMatrix::~ColMatrix(){
delete [] elements;
}
ColMatrix::ColMatrix(const ColMatrix& A){ // copy constructor
numrows = 0;
elements = 0;
Dim(A.numrows);
for(int i=0;i<numrows;i++)
elements[i] = A.elements[i];
}
ColMatrix::ColMatrix(const VirtualColMatrix& A){ // copy constructor
numrows = 0;
elements = 0;
Dim(A.GetNumRows());
for(int i=0;i<numrows;i++)
elements[i] = A.BasicGet(i);
}
ColMatrix::ColMatrix(const VirtualMatrix& A){ // copy constructor
if( A.GetNumCols() != 1 ){
cerr << "error trying to write a 2D matrix to a collumn" << endl;
exit(1);
}
numrows = 0;
elements = 0;
Dim(A.GetNumRows());
for(int i=0;i<numrows;i++)
elements[i] = A.BasicGet(i,0);
}
ColMatrix::ColMatrix(int m){ // size constructor
numrows = 0;
elements = 0;
Dim(m);
}
void ColMatrix::Dim(int m){
delete [] elements;
numrows = m;
elements = new double [m];
}
void ColMatrix::Const(double value){
for(int i=0;i<numrows;i++)
elements[i] = value;
}
MatrixType ColMatrix::GetType() const{
return COLMATRIX;
}
istream& ColMatrix::ReadData(istream& c){
int n;
c >> n;
Dim(n);
for(int i=0;i<n;i++)
c >> elements[i];
return c;
}
ostream& ColMatrix::WriteData(ostream& c) const{ //output
c << numrows << ' ';
for(int i=0;i<numrows;i++)
c << elements[i] << ' ';
return c;
}
double& ColMatrix::operator_1int (int i){ // array access
if((i>numrows) || (i<1)){
cerr << "matrix index invalid in operator ()" << endl;
exit(1);
}
return elements[i-1];
}
double ColMatrix::Get_1int(int i) const{
if((i>numrows) || (i<1)){
cerr << "matrix index exceeded in Get" << endl;
exit(1);
}
return elements[i-1];
}
void ColMatrix::Set_1int(int i, double value){
if((i>numrows) || (i<1)){
cerr << "matrix index exceeded in Set" << endl;
exit(1);
}
elements[i-1] = value;
}
double ColMatrix::BasicGet_1int(int i) const{
return elements[i];
}
double* ColMatrix::GetElementPointer(int i){
return &(elements[i]);
}
void ColMatrix::BasicSet_1int(int i, double value){
elements[i] = value;
}
void ColMatrix::BasicIncrement_1int(int i, double value){
elements[i] += value;
}
void ColMatrix::AssignVM(const VirtualMatrix& A){
if( A.GetNumCols() != 1 ){
cerr << "error trying to write a 2D matrix to a collumn" << endl;
exit(1);
}
Dim( A.GetNumRows() );
for(int i=0;i<numrows;i++)
elements[i] = A.BasicGet(i,0);
}
ColMatrix& ColMatrix::operator=(const ColMatrix& A){ // assignment operator
Dim(A.numrows);
for(int i=0;i<numrows;i++)
elements[i] = A.elements[i];
return *this;
}
ColMatrix& ColMatrix::operator=(const VirtualColMatrix& A){ // overloaded =
Dim( A.GetNumRows() );
for(int i=0;i<numrows;i++)
elements[i] = A.BasicGet(i);
return *this;
}
ColMatrix& ColMatrix::operator=(const VirtualMatrix& A){ // overloaded =
if( A.GetNumCols() != 1 ){
cerr << "error trying to write a 2D matrix to a collumn" << endl;
exit(1);
}
Dim( A.GetNumRows() );
for(int i=0;i<numrows;i++)
elements[i] = A.BasicGet(i,0);
return *this;
}
ColMatrix& ColMatrix::operator*=(double b){
for(int i=0;i<numrows;i++)
elements[i] *= b;
return *this;
}
void ColMatrix::Abs(){
for(int i=0;i<numrows;i++)
elements[i] = std::abs(elements[i]);
}
void ColMatrix::BasicMax(double& value, int& index){
value = elements[0];
index = 0;
for(int i=1;i<numrows;i++)
if(elements[i] > value){
value = elements[i];
index = i;
}
}
void ColMatrix::BasicMin(double& value, int& index){
value = elements[0];
index = 0;
for(int i=1;i<numrows;i++)
if(elements[i] < value){
value = elements[i];
index = i;
}
}