From 09df8f0820a7591eefd7380cd3ec525803ec50d1 Mon Sep 17 00:00:00 2001
From: "Kurt A. O'Hearn" <ohearnku@msu.edu>
Date: Wed, 24 Feb 2016 12:59:39 -0500
Subject: [PATCH] sPuReMD: fix diagonal scaling in factorization.

---
 .gitignore                      |  5 +++++
 puremd_rc_1003/sPuReMD/QEq.c    | 27 +++++++++++++++------------
 puremd_rc_1003/sPuReMD/forces.c |  1 +
 3 files changed, 21 insertions(+), 12 deletions(-)

diff --git a/.gitignore b/.gitignore
index be8bc24c..5ad3a172 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,8 @@
+*.log
+*.pdb
+*.pot
+*.trj
+
 # TeX
 *.aux
 *.log
diff --git a/puremd_rc_1003/sPuReMD/QEq.c b/puremd_rc_1003/sPuReMD/QEq.c
index 8ef7ddae..6c268de2 100644
--- a/puremd_rc_1003/sPuReMD/QEq.c
+++ b/puremd_rc_1003/sPuReMD/QEq.c
@@ -333,7 +333,7 @@ static void ICHOL_PAR( const sparse_matrix * const A, const unsigned int sweeps,
             sum = DAD->entries[j].val - sum;
 
             /* diagonal entries */
-            if( (U_t->start[k] - 1) == j )
+            if( (k - 1) == U_t->entries[j].j )
             {
                 /* sanity check */
                 if( sum < ZERO )
@@ -352,8 +352,9 @@ static void ICHOL_PAR( const sparse_matrix * const A, const unsigned int sweeps,
         }
     }
 
-    /* apply inverse transformation D^{-1}DADD^{-1} = A \approx D^{-1}U^{T}UD^{-1},
-     * i.e., D^{-1}U^{T} */
+    /* apply inverse transformation D^{-1}U^{T},
+     * since DAD \approx U^{T}U, so
+     * D^{-1}DADD^{-1} = A \approx D^{-1}U^{T}UD^{-1} */
     for ( i = 0; i < A->n; ++i )
     {
         for ( pj = A->start[i]; pj < A->start[i + 1]; ++pj )
@@ -362,10 +363,10 @@ static void ICHOL_PAR( const sparse_matrix * const A, const unsigned int sweeps,
         }
     }
 
-    /* transpose U^T and copy into U */
+    /* transpose U^{T} and copy into U */
     for ( i = 0; i < U_t->n; ++i )
     {
-        /* count nonzeros in each row of U (column-wise),
+        /* count nonzeros in each row of U (columns of U^{T}),
          * store in U->start */
         for ( pj = U_t->start[i]; pj < U_t->start[i + 1]; ++pj )
         {
@@ -375,7 +376,7 @@ static void ICHOL_PAR( const sparse_matrix * const A, const unsigned int sweeps,
     /* set correct row pointer in U */
     for ( i = 1; i <= U->n; ++i )
     {
-        Utop[i] = U->start[i] = U->start[i] + U->start[i - 1] + 1;
+        Utop[i] = U->start[i] = U->start[i] + U->start[i - 1];
     }
     /* for each row */
     for ( i = 0; i < U_t->n; ++i )
@@ -424,8 +425,9 @@ void Init_MatVec( reax_system *system, control_params *control,
 //                fprintf( stderr, "not enough memory for LU matrices. terminating.\n" );
 //                exit(INSUFFICIENT_SPACE);
 //            }
-           if ( Allocate_Matrix( &(workspace->L), far_nbrs->n, workspace->H->m ) == 0 ||
-                   Allocate_Matrix( &(workspace->U), far_nbrs->n, workspace->H->m ) == 0 )
+           /* factors have sparsity pattern as H */
+           if ( Allocate_Matrix( &(workspace->L), workspace->H->n, workspace->H->m ) == 0 ||
+                   Allocate_Matrix( &(workspace->U), workspace->H->n, workspace->H->m ) == 0 )
            {
                fprintf( stderr, "not enough memory for preconditioning matrices. terminating.\n" );
                exit(INSUFFICIENT_SPACE);
@@ -439,13 +441,14 @@ void Init_MatVec( reax_system *system, control_params *control,
 
 //        ICHOLT( workspace->H, workspace->droptol, workspace->L, workspace->U );
         // TODO: add parameters for sweeps to control file
-       ICHOL_PAR( workspace->H, 1, workspace->L, workspace->U );
+        ICHOL_PAR( workspace->H, 1, workspace->L, workspace->U );
 
+#if defined(DEBUG_FOCUS)
         sprintf( fname, "%s.L%d.out", control->sim_name, data->step );
         Print_Sparse_Matrix2( workspace->L, fname );
         sprintf( fname, "%s.U%d.out", control->sim_name, data->step );
         Print_Sparse_Matrix2( workspace->U, fname );
-#if defined(DEBUG_FOCUS)
+
         fprintf( stderr, "icholt-" );
         //sprintf( fname, "%s.L%d.out", control->sim_name, data->step );
         //Print_Sparse_Matrix2( workspace->L, fname );
@@ -522,8 +525,8 @@ void QEq( reax_system *system, control_params *control, simulation_data *data,
 
     Init_MatVec( system, control, data, workspace, far_nbrs );
 
-    //if( data->step % 10 == 0 )
-    //  Print_Linear_System( system, control, workspace, far_nbrs, data->step );
+//    if( data->step % 10 == 0 )
+//      Print_Linear_System( system, control, workspace, data->step );
 
     //TODO: add parameters in control file for solver choice and options
 //  matvecs = GMRES( workspace, workspace->H,
diff --git a/puremd_rc_1003/sPuReMD/forces.c b/puremd_rc_1003/sPuReMD/forces.c
index ae6128c6..d9348b33 100644
--- a/puremd_rc_1003/sPuReMD/forces.c
+++ b/puremd_rc_1003/sPuReMD/forces.c
@@ -318,6 +318,7 @@ void Init_Forces( reax_system *system, control_params *control,
             atom_j = &(system->atoms[j]);
 
             flag = 0;
+            /*TODO: build H with smaller cutoff, use for preconditioning*/
             if ((data->step - data->prev_steps) % control->reneighbor == 0)
             {
                 if ( nbr_pj->d <= control->r_cut)
-- 
GitLab