forked from lijiext/lammps
206 lines
4.8 KiB
C++
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;
|
|
}
|
|
}
|
|
|