pastixFinalize (from Fortran) not threadsafe
This piece of code is working
IF ( self%ll_set) THEN
DO ib_mat = 1, self%il_nbmat
CALL pastixFinalize (self%sla_mat(ib_mat)%pastix_data)
END DO
END IF
!$omp parallel num_threads(NBTHDS_B) default(none), &
!$omp shared(self, NBTHDS_B), &
!$omp private(ib_thr, ib_mat, il_gmat), &
!$omp private(matrix, sys, il_info)
!$omp do
DO ib_thr = 1, NBTHDS_B
DO ib_mat = 1, self%il_nblocmat(ib_thr)
il_gmat = self%ila_glomat(ib_mat,ib_thr)
matrix => self%sla_mat(il_gmat)
matrix%iparm(:) = self%iparm(:)
matrix%dparm(:) = self%dparm(:)
CALL pastixInit( matrix%pastix_data, 0, &
& matrix%iparm, matrix%dparm)
CALL spmConvert(SpmCSC, matrix%spm, il_info)
CALL pastix_task_analyze( matrix%pastix_data, matrix%spm, il_info )
CALL pastix_task_numfact( matrix%pastix_data, matrix%spm, il_info )
sys => self%sla_sys(il_gmat)
sys%idmat = ib_mat
sys%nrhs = 1
END DO
END DO
!$omp end do
!$omp end parallel
while this one (notice that pastixFinalize is inside the OpenMP loop while beforehand it was in a separate previous singlethreaded loop) ends in error with a double corrupted
!$omp parallel num_threads(NBTHDS_B) default(none), &
!$omp shared(self, NBTHDS_B), &
!$omp private(ib_thr, ib_mat, il_gmat), &
!$omp private(matrix, sys, il_info)
!$omp do
DO ib_thr = 1, NBTHDS_B
DO ib_mat = 1, self%il_nblocmat(ib_thr)
il_gmat = self%ila_glomat(ib_mat,ib_thr)
matrix => self%sla_mat(il_gmat)
matrix%iparm(:) = self%iparm(:)
matrix%dparm(:) = self%dparm(:)
IF ( self%ll_set ) CALL pastixFinalize ( matrix%pastix_data )
CALL pastixInit( matrix%pastix_data, 0, &
& matrix%iparm, matrix%dparm)
CALL spmConvert(SpmCSC, matrix%spm, il_info)
CALL pastix_task_analyze( matrix%pastix_data, matrix%spm, il_info )
CALL pastix_task_numfact( matrix%pastix_data, matrix%spm, il_info )
sys => self%sla_sys(il_gmat)
sys%idmat = ib_mat
sys%nrhs = 1
END DO
END DO
!$omp end do
!$omp end parallel
Thanks