Blob Blame History Raw
From 8ede1ab6e585c475eaa63b1e64211f43bc4fdff8 Mon Sep 17 00:00:00 2001
From: Junfeng Qiao <qiaojunfeng@outlook.com>
Date: Thu, 21 Jan 2021 19:26:33 +0100
Subject: [PATCH 1/2] Allocate arrays on non-root nodes to avoid SIGSEG

Although these arrays are not used by the non-root nodes, in some
versions of OpenMPI (e.g. 4.0), SIGSEGV may occur when doing
MPI_scatterv. Allocating 0-sized arrays could bypass the issue.
---
 src/disentangle.F90 |  2 ++
 src/overlap.F90     | 12 ++++++++----
 2 files changed, 10 insertions(+), 4 deletions(-)

diff --git a/src/disentangle.F90 b/src/disentangle.F90
index d2fbd3e2..ff3b9516 100644
--- a/src/disentangle.F90
+++ b/src/disentangle.F90
@@ -204,6 +204,8 @@ subroutine dis_main()
       if (on_root) then
         allocate (m_matrix(num_wann, num_wann, nntot, num_kpts), stat=ierr)
         if (ierr /= 0) call io_error('Error in allocating m_matrix in dis_main')
+      else
+        allocate (m_matrix(0, 0, 0, 0), stat=ierr)
       endif
       allocate (m_matrix_local(num_wann, num_wann, nntot, counts(my_node_id)), stat=ierr)
       if (ierr /= 0) call io_error('Error in allocating m_matrix_local in dis_main')
diff --git a/src/overlap.F90 b/src/overlap.F90
index 457405c7..c3fd6dae 100644
--- a/src/overlap.F90
+++ b/src/overlap.F90
@@ -64,6 +64,8 @@ subroutine overlap_allocate()
       if (on_root) then
         allocate (m_matrix_orig(num_bands, num_bands, nntot, num_kpts), stat=ierr)
         if (ierr /= 0) call io_error('Error in allocating m_matrix_orig in overlap_read')
+      else
+        allocate (m_matrix_orig(0, 0, 0, 0))
       endif
       allocate (m_matrix_orig_local(num_bands, num_bands, nntot, counts(my_node_id)), stat=ierr)
       if (ierr /= 0) call io_error('Error in allocating m_matrix_orig_local in overlap_read')
@@ -76,6 +78,8 @@ subroutine overlap_allocate()
         allocate (m_matrix(num_wann, num_wann, nntot, num_kpts), stat=ierr)
         if (ierr /= 0) call io_error('Error in allocating m_matrix in overlap_read')
         m_matrix = cmplx_0
+      else
+        allocate (m_matrix(0, 0, 0, 0))
       endif
       allocate (m_matrix_local(num_wann, num_wann, nntot, counts(my_node_id)), stat=ierr)
       if (ierr /= 0) call io_error('Error in allocating m_matrix_local in overlap_read')
@@ -563,12 +567,12 @@ subroutine overlap_dealloc()
       deallocate (a_matrix, stat=ierr)
       if (ierr /= 0) call io_error('Error deallocating a_matrix in overlap_dealloc')
     end if
-    if (on_root) then
+!    if (on_root) then
     if (allocated(m_matrix_orig)) then
       deallocate (m_matrix_orig, stat=ierr)
       if (ierr /= 0) call io_error('Error deallocating m_matrix_orig in overlap_dealloc')
     endif
-    endif
+!    endif
     if (allocated(m_matrix_orig_local)) then
       deallocate (m_matrix_orig_local, stat=ierr)
       if (ierr /= 0) call io_error('Error deallocating m_matrix_orig_local in overlap_dealloc')
@@ -588,12 +592,12 @@ subroutine overlap_dealloc()
 !    if (ierr/=0) call io_error('Error deallocating m_matrix_local in overlap_dealloc')
 !    deallocate ( u_matrix, stat=ierr )
 !    if (ierr/=0) call io_error('Error deallocating u_matrix in overlap_dealloc')
-    if (on_root) then
+!    if (on_root) then
       if (allocated(m_matrix)) then
         deallocate (m_matrix, stat=ierr)
         if (ierr /= 0) call io_error('Error deallocating m_matrix in overlap_dealloc')
       endif
-    endif
+!    endif
     if (allocated(m_matrix_local)) then
       deallocate (m_matrix_local, stat=ierr)
       if (ierr /= 0) call io_error('Error deallocating m_matrix_local in overlap_dealloc')

From a8a10661c9dcd461706d39387c822d0effb1b964 Mon Sep 17 00:00:00 2001
From: Junfeng Qiao <qiaojunfeng@outlook.com>
Date: Mon, 12 Jul 2021 22:53:56 +0200
Subject: [PATCH 2/2] Format code to pass pre-commit

---
 src/overlap.F90 | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/overlap.F90 b/src/overlap.F90
index c3fd6dae..0b0f84cf 100644
--- a/src/overlap.F90
+++ b/src/overlap.F90
@@ -593,10 +593,10 @@ subroutine overlap_dealloc()
 !    deallocate ( u_matrix, stat=ierr )
 !    if (ierr/=0) call io_error('Error deallocating u_matrix in overlap_dealloc')
 !    if (on_root) then
-      if (allocated(m_matrix)) then
-        deallocate (m_matrix, stat=ierr)
-        if (ierr /= 0) call io_error('Error deallocating m_matrix in overlap_dealloc')
-      endif
+    if (allocated(m_matrix)) then
+      deallocate (m_matrix, stat=ierr)
+      if (ierr /= 0) call io_error('Error deallocating m_matrix in overlap_dealloc')
+    endif
 !    endif
     if (allocated(m_matrix_local)) then
       deallocate (m_matrix_local, stat=ierr)