mirror of
https://github.com/TREX-CoE/Sherman-Morrison.git
synced 2024-12-26 06:15:08 +01:00
Update of A0_inv fixed. matMul(...) breaks link between A0_inv and Slater_inv. Fixed by creating a new pointer that points to where Slater_inv points to before it gets reassigned by matMul(...) and then copy the updated elements back to the passed array pointed to by the new pointer.
This commit is contained in:
parent
aa6895a4aa
commit
d03c9c665b
19
Helpers.hpp
19
Helpers.hpp
@ -25,7 +25,7 @@ void showScalar(T scalar, string name) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
void showVector(T* vector, unsigned int size, string name) {
|
void showVector(T *vector, unsigned int size, string name) {
|
||||||
cout << name << " = " << endl;
|
cout << name << " = " << endl;
|
||||||
for (unsigned int i = 0; i < size; i++) {
|
for (unsigned int i = 0; i < size; i++) {
|
||||||
cout << "[ " << vector[i] << " ]" << endl;
|
cout << "[ " << vector[i] << " ]" << endl;
|
||||||
@ -34,7 +34,7 @@ void showVector(T* vector, unsigned int size, string name) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
void showMatrix(T** matrix, unsigned int size, string name) {
|
void showMatrix(T **matrix, unsigned int size, string name) {
|
||||||
cout << name << " = " << endl;
|
cout << name << " = " << endl;
|
||||||
for (unsigned int i = 0; i < size; i++) {
|
for (unsigned int i = 0; i < size; i++) {
|
||||||
cout << "[ ";
|
cout << "[ ";
|
||||||
@ -47,7 +47,7 @@ void showMatrix(T** matrix, unsigned int size, string name) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
void showMatrixT(T** matrix, unsigned int size, string name) {
|
void showMatrixT(T **matrix, unsigned int size, string name) {
|
||||||
cout << name << " = " << endl;
|
cout << name << " = " << endl;
|
||||||
for (unsigned int i = 0; i < size; i++) {
|
for (unsigned int i = 0; i < size; i++) {
|
||||||
cout << "[ ";
|
cout << "[ ";
|
||||||
@ -60,8 +60,8 @@ void showMatrixT(T** matrix, unsigned int size, string name) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
T** matMul(T** A, T** B, unsigned int size) {
|
T **matMul(T **A, T **B, unsigned int size) {
|
||||||
T** C = new T*[size];
|
T **C = new T*[size];
|
||||||
for (unsigned int i = 0; i < size; i++) {
|
for (unsigned int i = 0; i < size; i++) {
|
||||||
C[i] = new T[size];
|
C[i] = new T[size];
|
||||||
}
|
}
|
||||||
@ -72,13 +72,12 @@ T** matMul(T** A, T** B, unsigned int size) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
showMatrix(C, size, "C");
|
|
||||||
return C;
|
return C;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T1, typename T2>
|
template<typename T1, typename T2>
|
||||||
T1** outProd(T1* vec1, T2* vec2, unsigned int size) {
|
T1 **outProd(T1 *vec1, T2 *vec2, unsigned int size) {
|
||||||
T1** C = new T1*[size];
|
T1 **C = new T1*[size];
|
||||||
for (unsigned int i = 0; i < size; i++) {
|
for (unsigned int i = 0; i < size; i++) {
|
||||||
C[i] = new T1[size];
|
C[i] = new T1[size];
|
||||||
}
|
}
|
||||||
@ -91,9 +90,9 @@ T1** outProd(T1* vec1, T2* vec2, unsigned int size) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
T matDet(T** A, unsigned int M) {
|
T matDet(T **A, unsigned int M) {
|
||||||
int det = 0, p, h, k, i, j;
|
int det = 0, p, h, k, i, j;
|
||||||
T** temp = new T*[M];
|
T **temp = new T*[M];
|
||||||
for (int i = 0; i < M; i++) temp[i] = new T[M];
|
for (int i = 0; i < M; i++) temp[i] = new T[M];
|
||||||
if(M == 1) {
|
if(M == 1) {
|
||||||
return A[0][0];
|
return A[0][0];
|
||||||
|
@ -7,20 +7,15 @@
|
|||||||
void Sherman_Morrison(int **Slater0, double **Slater_inv, unsigned int *Dim, unsigned int *N_updates, int **Updates, unsigned int *Updates_index) {
|
void Sherman_Morrison(int **Slater0, double **Slater_inv, unsigned int *Dim, unsigned int *N_updates, int **Updates, unsigned int *Updates_index) {
|
||||||
unsigned int k, l, lbar, i, j, tmp, M = *Dim;
|
unsigned int k, l, lbar, i, j, tmp, M = *Dim;
|
||||||
unsigned int *p = new unsigned int[M+1];
|
unsigned int *p = new unsigned int[M+1];
|
||||||
double *breakdown = new double[M+1];
|
unsigned int **Id = new unsigned int*[M];
|
||||||
double alpha, beta;
|
double alpha, beta;
|
||||||
|
double **U, *breakdown = new double[M+1];
|
||||||
for (i = 0; i < M+1; i++) {
|
double **Al = new double*[M];
|
||||||
p[i] = i;
|
p[0] = 0;
|
||||||
}
|
|
||||||
|
|
||||||
int **Id = new int*[M];
|
|
||||||
for (i = 0; i < M; i++) Id[i] = new int[M];
|
|
||||||
for (i = 0; i < M; i++) {
|
for (i = 0; i < M; i++) {
|
||||||
for (j = 0; j < M; j++) {
|
p[i+1] = i + 1;
|
||||||
if (i != j) Id[i][j] = 0;
|
Id[i] = new unsigned int[M];
|
||||||
else Id[i][j] = 1;
|
Al[i] = new double[M];
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Declare auxiliary solution matrix ylk
|
// Declare auxiliary solution matrix ylk
|
||||||
@ -31,6 +26,15 @@ void Sherman_Morrison(int **Slater0, double **Slater_inv, unsigned int *Dim, uns
|
|||||||
ylk[l][k] = new double[M+1];
|
ylk[l][k] = new double[M+1];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Initialize identity matrix
|
||||||
|
for (i = 0; i < M; i++) {
|
||||||
|
for (j = 0; j < M; j++) {
|
||||||
|
if (i != j) Id[i][j] = 0;
|
||||||
|
else Id[i][j] = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Initialize ylk with zeros
|
// Initialize ylk with zeros
|
||||||
for (l = 0; l < M; l++) {
|
for (l = 0; l < M; l++) {
|
||||||
for (k = 0; k < M+1; k++) {
|
for (k = 0; k < M+1; k++) {
|
||||||
@ -73,10 +77,11 @@ void Sherman_Morrison(int **Slater0, double **Slater_inv, unsigned int *Dim, uns
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Construct A-inverse from A0-inverse and the ylk
|
// Construct A-inverse from A0-inverse and the ylk
|
||||||
double **U;
|
// Keep the memory location of the passed array 'Slater_inv' before 'Slater_inv'
|
||||||
double **Al = new double*[M];
|
// gets reassigned by 'matMul(...)' in the next line, by creating a new
|
||||||
for (i = 0; i < M; i++) Al[i] = new double[M];
|
// pointer 'copy' that points to whereever 'Slater_inv' points to now.
|
||||||
|
double **copy = Slater_inv;
|
||||||
|
|
||||||
for (l = 0; l < M; l++) {
|
for (l = 0; l < M; l++) {
|
||||||
k = l+1;
|
k = l+1;
|
||||||
U = outProd(ylk[l][p[k]], Id[p[k]-1], M);
|
U = outProd(ylk[l][p[k]], Id[p[k]-1], M);
|
||||||
@ -86,23 +91,21 @@ void Sherman_Morrison(int **Slater0, double **Slater_inv, unsigned int *Dim, uns
|
|||||||
Al[i][j] = Id[i][j] - U[i][j] / beta;
|
Al[i][j] = Id[i][j] - U[i][j] / beta;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
showMatrix(Slater_inv, M, "Slater_inv");
|
|
||||||
Slater_inv = matMul(Al, Slater_inv, M);
|
Slater_inv = matMul(Al, Slater_inv, M);
|
||||||
showMatrix(Slater_inv, M, "Slater_inv");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
delete [] p, breakdown;
|
// Assign the new values of 'Slater_inv' to the old values in 'copy[][]'
|
||||||
|
|
||||||
for (i = 0; i < M; i++) {
|
for (i = 0; i < M; i++) {
|
||||||
delete [] Id[i];
|
for (j = 0; j < M; j++) {
|
||||||
delete [] U[i];
|
copy[i][j] = Slater_inv[i][j];
|
||||||
delete [] Al[i];
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (l = 0; l < M; l++) {
|
for (l = 0; l < M; l++) {
|
||||||
for (k = 0; k < M+1; k++) {
|
for (k = 0; k < M+1; k++) {
|
||||||
delete [] ylk[l][k];
|
delete [] ylk[l][k];
|
||||||
}
|
}
|
||||||
delete [] ylk[l];
|
delete [] ylk[l], Id[l], U[l], Al[l], Slater_inv[l];
|
||||||
}
|
}
|
||||||
|
delete [] p, breakdown;
|
||||||
}
|
}
|
1
main.cpp
1
main.cpp
@ -66,7 +66,6 @@ int main() {
|
|||||||
unsigned int *dim = new unsigned int(M);
|
unsigned int *dim = new unsigned int(M);
|
||||||
unsigned int *n_updates = new unsigned int(M);
|
unsigned int *n_updates = new unsigned int(M);
|
||||||
Sherman_Morrison(A0, A0_inv, dim, n_updates, Ar, Ar_index);
|
Sherman_Morrison(A0, A0_inv, dim, n_updates, Ar, Ar_index);
|
||||||
|
|
||||||
showMatrix(A0_inv, M, "A0_inv");
|
showMatrix(A0_inv, M, "A0_inv");
|
||||||
|
|
||||||
// Deallocate all vectors and matrices
|
// Deallocate all vectors and matrices
|
||||||
|
Loading…
Reference in New Issue
Block a user