From 8c276ea4425358d199cf419edaf751996f04a17f Mon Sep 17 00:00:00 2001
From: "Kurt A. O'Hearn" <ohearnku@msu.edu>
Date: Fri, 5 Mar 2021 11:34:55 -0500
Subject: [PATCH] sPuReMD: fix OpenMP compilation issue with specifications
 prior to 4.0 (behavior change regarding implicit shared attribute assignment
 to const variables).

---
 sPuReMD/src/charges.c |  4 ++--
 sPuReMD/src/lin_alg.c | 38 ++++++++++++++++++++++----------------
 2 files changed, 24 insertions(+), 18 deletions(-)

diff --git a/sPuReMD/src/charges.c b/sPuReMD/src/charges.c
index de08a07f..f3311c1a 100644
--- a/sPuReMD/src/charges.c
+++ b/sPuReMD/src/charges.c
@@ -349,7 +349,7 @@ static void Spline_Extrapolate_Charges_QEq( const reax_system * const system,
     //TODO: good candidate for vectorization, avoid moving data with head pointer and circular buffer
 #if defined(_OPENMP)
     #pragma omp parallel for schedule(static) \
-        default(none) private(i, s_tmp, t_tmp) shared(system, control, data, workspace)
+        default(none) private(i, s_tmp, t_tmp) firstprivate(system, control, workspace)
 #endif
     for ( i = 0; i < system->N_cm; ++i )
     {
@@ -443,7 +443,7 @@ static void Spline_Extrapolate_Charges_EE( const reax_system * const system,
     //TODO: good candidate for vectorization, avoid moving data with head pointer and circular buffer
 #if defined(_OPENMP)
     #pragma omp parallel for schedule(static) \
-        default(none) private(i, s_tmp) shared(system, control, data, workspace)
+        default(none) private(i, s_tmp) firstprivate(system, control, workspace)
 #endif
     for ( i = 0; i < system->N_cm; ++i )
     {
diff --git a/sPuReMD/src/lin_alg.c b/sPuReMD/src/lin_alg.c
index 84ab600f..53c7fca7 100644
--- a/sPuReMD/src/lin_alg.c
+++ b/sPuReMD/src/lin_alg.c
@@ -387,7 +387,8 @@ void Calculate_Droptol( const sparse_matrix * const A,
 #endif
 
 #if defined(_OPENMP)
-    #pragma omp parallel default(none) private(i, j, k, val, tid), shared(A, droptol, dtol, droptol_local, stderr)
+    #pragma omp parallel default(none) private(i, j, k, val, tid) \
+    firstprivate(A, droptol, dtol) shared(droptol_local, stderr)
 #endif
     {
 #if defined(_OPENMP)
@@ -492,7 +493,7 @@ int Estimate_LU_Fill( const sparse_matrix * const A, const real * const droptol
 
 #if defined(_OPENMP)
     #pragma omp parallel for schedule(static) \
-    default(none) private(i, pj, val) shared( A, droptol) reduction(+: fillin)
+    default(none) private(i, pj, val) firstprivate(A, droptol) reduction(+: fillin)
 #endif
     for ( i = 0; i < A->n; ++i )
     {
@@ -521,7 +522,7 @@ real jacobi( const sparse_matrix * const H, real * const Hdia_inv )
 
 #if defined(_OPENMP)
     #pragma omp parallel for schedule(dynamic,256) \
-    default(none) private(i) shared(H, Hdia_inv)
+    default(none) private(i) firstprivate(H, Hdia_inv)
 #endif
     for ( i = 0; i < H->n; ++i )
     {
@@ -1149,7 +1150,7 @@ real FG_ICHOLT( const sparse_matrix * const A, const real * droptol,
 
 #if defined(_OPENMP)
     #pragma omp parallel for schedule(dynamic,512) \
-        default(none) shared(A, D, D_inv, gamma) private(i)
+        default(none) shared(D, D_inv, gamma) private(i) firstprivate(A)
 #endif
     for ( i = 0; i < A->n; ++i )
     {
@@ -1167,7 +1168,7 @@ real FG_ICHOLT( const sparse_matrix * const A, const real * droptol,
 
 #if defined(_OPENMP)
     #pragma omp parallel for schedule(dynamic,512) \
-        default(none) shared(A, D, D_inv, stderr) private(i)
+        default(none) shared(D, D_inv, stderr) private(i) firstprivate(A)
 #endif
     for ( i = 0; i < A->n; ++i )
     {
@@ -1180,7 +1181,7 @@ real FG_ICHOLT( const sparse_matrix * const A, const real * droptol,
     memcpy( DAD.j, A->j, sizeof(unsigned int) * A->start[A->n] );
 #if defined(_OPENMP)
     #pragma omp parallel for schedule(dynamic,4096) \
-        default(none) shared(DAD, A, D, gamma) private(i, pj)
+        default(none) shared(DAD, D, gamma) private(i, pj) firstprivate(A)
 #endif
     for ( i = 0; i < A->n; ++i )
     {
@@ -1358,7 +1359,7 @@ real FG_ILUT( const sparse_matrix * const A, const real * droptol,
 
 #if defined(_OPENMP)
     #pragma omp parallel for schedule(dynamic,512) \
-        default(none) shared(A, D_inv, gamma) private(i)
+        default(none) shared(D_inv, gamma) private(i) firstprivate(A)
 #endif
     for ( i = 0; i < A->n; ++i )
     {
@@ -1376,7 +1377,7 @@ real FG_ILUT( const sparse_matrix * const A, const real * droptol,
 
 #if defined(_OPENMP)
     #pragma omp parallel for schedule(dynamic,512) \
-        default(none) shared(A, D, D_inv) private(i)
+        default(none) shared(D, D_inv) private(i) firstprivate(A)
 #endif
     for ( i = 0; i < A->n; ++i )
     {
@@ -1390,7 +1391,7 @@ real FG_ILUT( const sparse_matrix * const A, const real * droptol,
     memcpy( DAD.j, A->j, sizeof(unsigned int) * A->start[A->n] );
 #if defined(_OPENMP)
     #pragma omp parallel for schedule(dynamic,4096) \
-        default(none) shared(DAD, A, D, gamma) private(i, pj)
+        default(none) shared(DAD, D, gamma) private(i, pj) firstprivate(A)
 #endif
     for ( i = 0; i < A->n; ++i )
     {
@@ -1416,7 +1417,7 @@ real FG_ILUT( const sparse_matrix * const A, const real * droptol,
     /* L has unit diagonal, by convention */
 #if defined(_OPENMP)
     #pragma omp parallel for schedule(dynamic,512) \
-        default(none) private(i) shared(A, L_temp)
+        default(none) shared(L_temp) private(i) firstprivate(A)
 #endif
     for ( i = 0; i < A->n; ++i )
     {
@@ -1671,7 +1672,7 @@ real sparse_approx_inverse( const sparse_matrix * const A,
     #pragma omp parallel default(none) \
     private(i, k, pj, j_temp, identity_pos, N, M, d_i, d_j, m, n, \
             nrhs, lda, ldb, info, X, Y, pos_x, pos_y, e_j, dense_matrix, e_j_size, dense_matrix_size) \
-    shared(A_app_inv, stderr)
+    shared(stderr)
 #endif
     {
         X = smalloc( sizeof(char) * A->n, "sparse_approx_inverse::X" );
@@ -3056,7 +3057,8 @@ int GMRES( const static_storage * const workspace, const control_params * const
 #if defined(_OPENMP)
     #pragma omp parallel default(none) \
     private(i, j, k, itr, bnorm, temp, t_start) \
-    shared(workspace, control, H, b, tol, x, fresh_pre, N, cc, tmp1, tmp2, g_itr, g_j, g_bnorm, stderr) \
+    firstprivate(control, workspace, H, b, tol, x, fresh_pre) \
+    shared(N, cc, tmp1, tmp2, g_itr, g_j, g_bnorm, stderr) \
     reduction(+: t_ortho, t_pa, t_spmv, t_ts, t_vops)
 #endif
     {
@@ -3265,7 +3267,8 @@ int GMRES_HouseHolder( const static_storage * const workspace,
 #if defined(_OPENMP)
     #pragma omp parallel default(none) \
     private(i, j, k, itr, bnorm, temp, t_start) \
-    shared(workspace, control, H, b, tol, x, fresh_pre, v, z, w, u, N, cc, tmp1, tmp2, g_itr, g_j, g_bnorm, stderr) \
+    firstprivate(control, workspace, H, b, tol, x, fresh_pre) \
+    shared(v, z, w, u, N, cc, tmp1, tmp2, g_itr, g_j, g_bnorm, stderr) \
     reduction(+: t_ortho, t_pa, t_spmv, t_ts, t_vops)
 #endif
     {
@@ -3509,8 +3512,9 @@ int CG( const static_storage * const workspace, const control_params * const con
 #if defined(_OPENMP)
     #pragma omp parallel default(none) \
     private(i, tmp, alpha, beta, bnorm, rnorm, sig_old, sig_new, t_start) \
+    firstprivate(control, workspace, H, b, tol, x, fresh_pre) \
     reduction(+: t_pa, t_spmv, t_vops) \
-    shared(workspace, control, H, b, tol, x, fresh_pre, g_itr, g_bnorm, g_rnorm, N, d, r, p, z)
+    shared(g_itr, g_bnorm, g_rnorm, N, d, r, p, z)
 #endif
     {
         t_pa = 0.0;
@@ -3635,8 +3639,9 @@ int BiCGStab( const static_storage * const workspace, const control_params * con
 #if defined(_OPENMP)
     #pragma omp parallel default(none) \
     private(i, tmp, alpha, beta, omega, sigma, rho, rho_old, rnorm, bnorm, t_start) \
+    firstprivate(control, workspace, H, b, tol, x, fresh_pre) \
     reduction(+: t_pa, t_spmv, t_vops) \
-    shared(workspace, control, H, b, tol, x, fresh_pre, g_itr, g_rnorm, g_bnorm, g_omega, g_rho, N)
+    shared(g_itr, g_rnorm, g_bnorm, g_omega, g_rho, N)
 #endif
     {
         t_pa = 0.0;
@@ -3817,8 +3822,9 @@ int SDM( const static_storage * const workspace, const control_params * const co
 #if defined(_OPENMP)
     #pragma omp parallel default(none) \
     private(i, tmp, alpha, bnorm, sig, t_start) \
+    firstprivate(control, workspace, H, b, tol, x, fresh_pre) \
     reduction(+: t_pa, t_spmv, t_vops) \
-    shared(workspace, control, H, b, tol, x, fresh_pre, g_itr, g_sig, g_bnorm, N)
+    shared(g_itr, g_sig, g_bnorm, N)
 #endif
     {
         t_pa = 0.0;
-- 
GitLab