diff --git a/sPuReMD/src/QEq.c b/sPuReMD/src/QEq.c
index e8b129d918273381df17a86c1517231d42be8cf4..5a757f9ac2008f65d715931c36d0df4c1eb0c947 100644
--- a/sPuReMD/src/QEq.c
+++ b/sPuReMD/src/QEq.c
@@ -159,7 +159,7 @@ static void Calculate_Droptol( const sparse_matrix * const A, real * const dropt
     unsigned int tid;
 #endif
 
-    #pragma omp parallel default(none) private(i, j, k, val, tid), shared(droptol_local)
+    #pragma omp parallel default(none) private(i, j, k, val, tid), shared(droptol_local, stderr)
     {
 #ifdef _OPENMP
         tid = omp_get_thread_num();
@@ -172,6 +172,7 @@ static void Calculate_Droptol( const sparse_matrix * const A, real * const dropt
             {
                 if ( (droptol_local = (real*) malloc( omp_get_num_threads() * A->n * sizeof(real))) == NULL )
                 {
+                    fprintf( stderr, "Not enough space for droptol. Terminating...\n" );
                     exit( INSUFFICIENT_MEMORY );
                 }
 	    }
@@ -597,16 +598,21 @@ static real diag_pre_comp( const reax_system * const system, real * const Hdia_i
 static real ICHOLT( const sparse_matrix * const A, const real * const droptol,
             sparse_matrix * const L, sparse_matrix * const U )
 {
-    //TODO: either add compilation parameter or dynamically allocate
-    int tmp_j[1000];
-    real tmp_val[1000];
+    int *tmp_j;
+    real *tmp_val;
     int i, j, pj, k1, k2, tmptop, Ltop;
     real val, start;
     int *Utop;
 
     start = Get_Time( );
     
-    Utop = (int*) malloc((A->n + 1) * sizeof(int));
+    if( ( Utop = (int*) malloc((A->n + 1) * sizeof(int)) ) == NULL ||
+            ( tmp_j = (int*) malloc(A->n * sizeof(int)) ) == NULL ||
+            ( tmp_val = (real*) malloc(A->n * sizeof(real)) ) == NULL )
+    {
+        fprintf( stderr, "not enough memory for ICHOLT preconditioning matrices. terminating.\n" );
+        exit( INSUFFICIENT_MEMORY );
+    }
 
     // clear variables
     Ltop = 0;
@@ -726,7 +732,9 @@ static real ICHOLT( const sparse_matrix * const A, const real * const droptol,
 
 //    fprintf( stderr, "nnz(U): %d, max: %d\n", Utop[U->n], U->n * 50 );
 
-    free(Utop);
+    free( tmp_val );
+    free( tmp_j );
+    free( Utop );
 
     return Get_Timing_Info( start );
 }
@@ -750,7 +758,7 @@ static real ICHOL_PAR( const sparse_matrix * const A, const unsigned int sweeps,
 
     if ( Allocate_Matrix( &DAD, A->n, A->m ) == 0 )
     {
-        fprintf( stderr, "not enough memory for preconditioning matrices. terminating.\n" );
+        fprintf( stderr, "not enough memory for ICHOL_PAR preconditioning matrices. terminating.\n" );
         exit( INSUFFICIENT_MEMORY );
     }
 
@@ -758,7 +766,7 @@ static real ICHOL_PAR( const sparse_matrix * const A, const unsigned int sweeps,
             ( D_inv = (real*) malloc(A->n * sizeof(real)) ) == NULL ||
             ( Utop = (int*) malloc((A->n + 1) * sizeof(int)) ) == NULL )
     {
-        fprintf( stderr, "not enough memory for preconditioning matrices. terminating.\n" );
+        fprintf( stderr, "not enough memory for ICHOL_PAR preconditioning matrices. terminating.\n" );
         exit( INSUFFICIENT_MEMORY );
     }
 
@@ -948,14 +956,14 @@ static real ILU_PAR( const sparse_matrix * const A, const unsigned int sweeps,
 
     if ( Allocate_Matrix( &DAD, A->n, A->m ) == 0 )
     {
-        fprintf( stderr, "not enough memory for preconditioning matrices. terminating.\n" );
+        fprintf( stderr, "not enough memory for ILU_PAR preconditioning matrices. terminating.\n" );
         exit( INSUFFICIENT_MEMORY );
     }
 
     if( ( D = (real*) malloc(A->n * sizeof(real)) ) == NULL ||
             ( D_inv = (real*) malloc(A->n * sizeof(real)) ) == NULL )
     {
-        fprintf( stderr, "not enough memory for preconditioning matrices. terminating.\n" );
+        fprintf( stderr, "not enough memory for ILU_PAR preconditioning matrices. terminating.\n" );
         exit( INSUFFICIENT_MEMORY );
     }
 
@@ -1158,14 +1166,14 @@ static real ILUT_PAR( const sparse_matrix * const A, const real * droptol,
             Allocate_Matrix( &L_temp, A->n, A->m ) == 0 ||
             Allocate_Matrix( &U_temp, A->n, A->m ) == 0 )
     {
-        fprintf( stderr, "not enough memory for preconditioning matrices. terminating.\n" );
+        fprintf( stderr, "not enough memory for ILUT_PAR preconditioning matrices. terminating.\n" );
         exit( INSUFFICIENT_MEMORY );
     }
 
     if( ( D = (real*) malloc(A->n * sizeof(real)) ) == NULL ||
             ( D_inv = (real*) malloc(A->n * sizeof(real)) ) == NULL )
     {
-        fprintf( stderr, "not enough memory for preconditioning matrices. terminating.\n" );
+        fprintf( stderr, "not enough memory for ILUT_PAR preconditioning matrices. terminating.\n" );
         exit( INSUFFICIENT_MEMORY );
     }
 
diff --git a/tools/run_sim.py b/tools/run_sim.py
index ac8aa0cdbd7ec25a89b1a6646be6f45a07ef3bc8..842beacfbf08a38c74065d97b0d638f87fcae19e 100644
--- a/tools/run_sim.py
+++ b/tools/run_sim.py
@@ -103,18 +103,28 @@ class TestCase():
                 env['OMP_NUM_THREADS'] = param_dict['threads']
                 start = time()
                 proc_handle = Popen([bin_path, self.__geo_file, self.__ffield_file, temp_file], 
-                    stdout=PIPE, stderr=PIPE, env=env)
+                    stdout=PIPE, stderr=PIPE, env=env, universal_newlines=True)
                 stdout, stderr = proc_handle.communicate()
                 stop = time()
                 if proc_handle.returncode < 0:
                     print("WARNING: process terminated with code {0}".format(proc_handle.returncode))
+                else:
+                    print('stdout:')
+                    print(stdout)
+                    print('stderr:')
+                    print(stderr)
 
             else:
+                #TODO: fix
+                start = 0.
+                stop = 0.
                 self._process_result(fout, stop - start, param_dict)
 
         fout.close()
-        remove(temp_file)
-        rmdir(temp_dir)
+        if path.exists(temp_file):
+            remove(temp_file)
+        if path.exists(temp_dir):
+            rmdir(temp_dir)
 
     def _process_result(self, fout, time, param):
         qeq = 0.
@@ -123,7 +133,12 @@ class TestCase():
         pre_app = 0.
         spmv = 0.
         cnt = 0
-        with open(param['name'] + '.log', 'r') as fp:
+        log_file = param['name'] + '.log'
+
+        if not path.exists(log_file):
+            print('***WARNING: {0} does not exist!'.format(log_file))
+            return
+        with open(log_file, 'r') as fp:
             for line in fp:
                 line = line.split()
                 try:
@@ -219,7 +234,7 @@ if __name__ == '__main__':
                 geo_format=['1'], result_file=result_file))
     if 'water_78480' in args.data:
         test_cases.append(
-            TestCase(path.join(data_dir, 'water/water_78480.pdb'),
+            TestCase(path.join(data_dir, 'water/water_78480.geo'),
                 path.join(data_dir, 'water/ffield.water'),
                 path.join(control_dir, 'param.gpu.water'),
                 params=params, result_header_fmt=header_fmt_str,
@@ -241,6 +256,14 @@ if __name__ == '__main__':
                 params=params, result_header_fmt=header_fmt_str,
                 result_header = header_str, result_body_fmt=body_fmt_str,
                 geo_format=['1'], result_file=result_file))
+    if 'bilayer_340800' in args.data:
+        test_cases.append(
+            TestCase(path.join(data_dir, 'bilayer/bilayer_340800.geo'),
+                path.join(data_dir, 'bilayer/ffield-bio'),
+                path.join(control_dir, 'param.gpu.water'),
+                params=params, result_header_fmt=header_fmt_str,
+                result_header = header_str, result_body_fmt=body_fmt_str,
+                geo_format=['0'], result_file=result_file))
     if 'dna_19733' in args.data:
         test_cases.append(
             TestCase(path.join(data_dir, 'dna/dna_19733.pdb'),