This repository serve as a backup for my Maxwell-TD code
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

127 lines
5.0 KiB

// DD_SPARMAT.H
#ifndef DD_SPARMAT_H
#define DD_SPARMAT_H
#include "densemat.h"
#include "hb_io.h"
#include "../dgtd-performance.hpp"
typedef enum {
SYMMETRIC = 0, // default
ANTI_SYMMETRIC,
NON_SYMMETRIC,
HERMITIAN,
SKEW_HERMITIAN
} MatrixType;
class sparMat {
public:
MatrixType type;
int dim; // row dimension
int colDim; // column dimension
int NZ; // number of non zeros
int SEGSIZE; // size of the segment
int NUMSEG; // number of
int* rowA; // rowA and colA are the Boeing format
int* colA; // to store sparse matrix
fp_t** entry; // at this moment, always entry[0], needs to be changed
public:
sparMat();
~sparMat();
void init(int n, int nonZero);
void sparInit(int, int); // initialization of symmetric matrix
void sparInit(int, int, int); // initialization of non-symmetric matrix
void sparINIT(int, int, int); // initialization for non-symmetric matrix
void sparInitNonSymm(int n, int nonZero);
void memAlloc() { entry = new fp_t*[1]; entry[0] = new fp_t[NZ]; }
void freeMemory();
// modifiers
void setMatType(MatrixType t) { type = t; }
void setDim(int n) { dim = n; colDim = n; };
void setRowDim(int n) { dim = n; };
void setColDim(int n) { colDim = n; };
void setNumSeg(int n) { NUMSEG = n; };
void setIA(int n, int ID);
void setJA(int n, int ID);
void setIAPtr(int *IAPTR) { rowA = IAPTR; }
void setJAPtr(int *JAPTR) { colA = JAPTR; }
void setEntry(int n, fp_t val) { entry[0][n] = val; }
// accessors
MatrixType isSymmetric() { return type; }
MatrixType isSymmetric() const { return type; }
MatrixType getMatType() { return type; };
MatrixType getMatType() const { return type; }
int* getIAPtr() { return rowA; }
int* getIAPtr() const { return rowA; }
int* getJAPtr() { return colA; }
int* getJAPtr() const { return colA; }
int getRowMap(int i) { return rowA[i]; }
int getRowMap(int i) const { return rowA[i]; }
int getColMap(int i) { return colA[i]; };
int getColMap(int i) const { return colA[i]; };
fp_t getEntry(int n) { return entry[0][n]; }
fp_t getEntry(int n) const { return entry[0][n]; }
fp_t* getEntryPtr() { return entry[0]; };
fp_t* getEntryPtr() const { return entry[0]; };
int getDim() { return dim; }
int getDim() const { return dim; }
int getNZ() { return NZ; }
int getNZ() const { return NZ; }
int getRowDim() { return dim; }
int getRowDim() const { return dim; }
int getColDim() { return colDim; }
int getColDim() const { return colDim; }
// utilities
void addEntry(int row, int col, fp_t val);
void blockAddEntry(int rDim, int cDim, int rowMap[], int colMap[], fp_t **entry);
void blockAddEntryNonSymm(int rDim, int cDim, int rowMap[], int colMap[], denseMat<fp_t> &D);
void blockAddEntry(int rDim, int cDim, int rowMap[], int colMap[], denseMat<fp_t> &D);
void blockAddEntry(int nn, int map[], denseMat<fp_t>& D);
void blockAddEntrySymm(int rDim, int cDim, int rowMap[], int colMap[], const denseMat<fp_t> &D);
void blockAddEntryAnti(int rDim, int cDim, int rowMap[], int colMap[], const denseMat<fp_t> &D);
void diagonalScale(fp_t *d1, fp_t *d2);
sparMat* symmToFull();
// I/O
void print();
void print(char *fname);
void printIA(char *fname);
void printJA(char *fname);
void preRead(char *fname);
void read(char *fname);
void hb_file_write(char const* fname);
void bmtsave(const char*, int base = 0, int float_prec =64,int int_prec = 32) const;
int loadBmtSparse(const char *fname, char *order, int *m, int *n, int *nnz, fp_t **val,
int **ind, int **ptr);
void st_to_hb(int ,int, int ,int [],int [],fp_t []);
fp_t memUsage();
//
void NonSymmMxV(fp_t* ,fp_t* );
};
// /////////////////////////////////////////
// // free functions
// Vector MxV(sparMat *const A, Vector &x);
// Vector MxV(sparMat const &A, Vector &x);
// Vector MxV(sparMat *const A, Vector &x, int *const xMap, int *const yMap);
//
// Vector MxV(sparMat *const A, Vector &x, bool transpose);
// void symmMxV(sparMat *const A, Vector &x, Vector &y);
// void nonSymmMxV(sparMat *const A, Vector &x, Vector &y, bool transpose);
// void symm_MxV(sparMat const &A, Vector &x, Vector &y);
// void nonsymm_MxV(sparMat const &A, Vector &x, Vector &y);
// void antisymm_MxV(sparMat const &A, Vector &x, Vector &y);
// void hermitian_MxV(sparMat const &A, Vector &x, Vector &y);
// void skew_herm_MxV(sparMat const &A, Vector &x, Vector &y);
//
// Vector operator*(const sparMat &A, Vector &x);
#endif