mirror of
https://github.com/TREX-CoE/Sherman-Morrison.git
synced 2024-11-03 20:54:08 +01:00
Rewrote matMul function so it doesn't declare memory inside.
This commit is contained in:
parent
f352a09815
commit
983f87d504
8
Makefile
8
Makefile
@ -1,8 +1,8 @@
|
|||||||
## Compilers
|
## Compilers
|
||||||
ARCH =
|
ARCH =
|
||||||
H5CXX = h5c++
|
H5CXX = h5c++ -std=gnu++11
|
||||||
CXX = clang++
|
CXX = g++
|
||||||
FC = flang
|
FC = gfortran
|
||||||
|
|
||||||
## Compiler flags
|
## Compiler flags
|
||||||
H5CXXFLAGS = -O0 -g
|
H5CXXFLAGS = -O0 -g
|
||||||
@ -55,7 +55,7 @@ $(OBJ_DIR)/%_h5.o: $(TST_DIR)/%_h5.cpp $(INC_DIR)/* | $(OBJ_DIR)
|
|||||||
|
|
||||||
## Fortran modules
|
## Fortran modules
|
||||||
$(OBJ_DIR)/%_mod.o: $(SRC_DIR)/%_mod.f90 | $(OBJ_DIR)
|
$(OBJ_DIR)/%_mod.o: $(SRC_DIR)/%_mod.f90 | $(OBJ_DIR)
|
||||||
$(FC) $(FFLAGS) $(ARCH) -module $(OBJ_DIR)/ -c -o $@ $<
|
$(FC) $(FFLAGS) $(ARCH) -J$(OBJ_DIR)/ -c -o $@ $<
|
||||||
|
|
||||||
## Fortran objects
|
## Fortran objects
|
||||||
$(OBJ_DIR)/%.o: $(TST_DIR)/%.f90 | $(OBJ_DIR)
|
$(OBJ_DIR)/%.o: $(TST_DIR)/%.f90 | $(OBJ_DIR)
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <cstring>
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
@ -76,6 +77,18 @@ T *matMul(T *A, T *B, unsigned int M) {
|
|||||||
return C;
|
return C;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
void matMul2(T *A, T *B, T *C, unsigned int M) {
|
||||||
|
memset(C,0,M*M*sizeof(T));
|
||||||
|
for (unsigned int i = 0; i < M; i++) {
|
||||||
|
for (unsigned int j = 0; j < M; j++) {
|
||||||
|
for (unsigned int k = 0; k < M; k++) {
|
||||||
|
C[i*M+j] += A[i*M+k] * B[k*M+j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
template<typename T1, typename T2>
|
template<typename T1, typename T2>
|
||||||
T1 *outProd(T1 *vec1, T2 *vec2, unsigned int M) {
|
T1 *outProd(T1 *vec1, T2 *vec2, unsigned int M) {
|
||||||
T1 *C = new T1[M*M];
|
T1 *C = new T1[M*M];
|
||||||
|
@ -68,16 +68,13 @@ void MaponiA3(double *Slater_inv, unsigned int Dim,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Keep the memory location of the passed array 'Slater_inv' before
|
double *next = new double[Dim*Dim] {0};
|
||||||
// 'Slater_inv' gets reassigned by 'matMul(...)' in the next line,
|
double *last;
|
||||||
// by creating a new pointer 'copy' that points to whereever
|
last = Slater_inv;
|
||||||
// 'Slater_inv' points to now.
|
|
||||||
double *copy = Slater_inv;
|
|
||||||
|
|
||||||
// Construct A-inverse from A0-inverse and the ylk
|
// Construct A-inverse from A0-inverse and the ylk
|
||||||
for (l = 0; l < N_updates; l++) { // l = 0, 1
|
for (l = 0; l < N_updates; l++) {
|
||||||
k = l + 1; // k = 1, 2
|
k = l + 1;
|
||||||
component = Updates_index[p[k] - 1]; // comp = 2, 4
|
component = Updates_index[p[k] - 1];
|
||||||
beta = 1 + ylk[l][p[k]][component];
|
beta = 1 + ylk[l][p[k]][component];
|
||||||
for (i = 0; i < Dim; i++) {
|
for (i = 0; i < Dim; i++) {
|
||||||
for (j = 0; j < Dim; j++) {
|
for (j = 0; j < Dim; j++) {
|
||||||
@ -85,24 +82,21 @@ void MaponiA3(double *Slater_inv, unsigned int Dim,
|
|||||||
* ylk[l][p[k]][i + 1] / beta;
|
* ylk[l][p[k]][i + 1] / beta;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Slater_inv = matMul(Al, Slater_inv, Dim);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Assign the new values of 'Slater_inv' to the old values
|
matMul2(Al, last, next, Dim);
|
||||||
// in 'copy[][]'
|
double *tmp = next;
|
||||||
for (i = 0; i < Dim; i++) {
|
next = last;
|
||||||
for (j = 0; j < Dim; j++) {
|
last = tmp;
|
||||||
copy[i * Dim + j] = Slater_inv[i * Dim + j];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
memcpy(Slater_inv, last, Dim*Dim*sizeof(double));
|
||||||
|
|
||||||
for (l = 0; l < N_updates; l++) {
|
for (l = 0; l < N_updates; l++) {
|
||||||
for (k = 0; k < N_updates + 1; k++) {
|
for (k = 0; k < N_updates + 1; k++) {
|
||||||
delete[] ylk[l][k];
|
delete[] ylk[l][k];
|
||||||
}
|
}
|
||||||
delete[] ylk[l];
|
delete[] ylk[l];
|
||||||
}
|
}
|
||||||
delete[] Al;
|
delete[] Al, next;
|
||||||
delete[] p, breakdown;
|
delete[] p, breakdown;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@ program QMCChem_dataset_test
|
|||||||
real(c_double), dimension(:,:), allocatable :: Updates
|
real(c_double), dimension(:,:), allocatable :: Updates
|
||||||
real(c_double), dimension(:,:), allocatable :: S, S_inv, S_inv_t
|
real(c_double), dimension(:,:), allocatable :: S, S_inv, S_inv_t
|
||||||
|
|
||||||
call Read_dataset("datasets/update_cycle_13.dat", &
|
call Read_dataset("datasets/update_cycle_8169.dat", &
|
||||||
cycle_id, &
|
cycle_id, &
|
||||||
dim, &
|
dim, &
|
||||||
n_updates, &
|
n_updates, &
|
||||||
|
Loading…
Reference in New Issue
Block a user