Skip to content

Commit

Permalink
fix: Make pointers used in OpenMP parallel region saved and `thread…
Browse files Browse the repository at this point in the history
…private`

This avoids segfaults with some compiler versions if these pointers are instead just marked as `private` in the `!$omp parallel` directive.
  • Loading branch information
abensonca committed Jan 28, 2025
1 parent 2753e23 commit aeca09b
Showing 1 changed file with 18 additions and 7 deletions.
25 changes: 18 additions & 7 deletions source/mass_distributions.spherical.tabulated.F90
Original file line number Diff line number Diff line change
Expand Up @@ -476,8 +476,9 @@ subroutine sphericalTabulatedTabulate(self,radiusScaled,parameters,container,tab
double precision , dimension(: ), intent(in ) :: parameters
type (massDistributionContainer ) , intent(inout) :: container
type (massDistributionTabulation ) , intent(inout) :: tabulation
class (massDistributionSphericalTabulated ) , pointer :: instance
type (kinematicsDistributionCollisionless) , pointer :: instanceKinematicsDistribution
class (massDistributionSphericalTabulated ), save , pointer :: instance
type (kinematicsDistributionCollisionless), save , pointer :: instanceKinematicsDistribution
!$omp threadprivate(instance,instanceKinematicsDistribution)
double precision , dimension(: ), allocatable :: parameters_ , parametersReduced_
integer (c_size_t ), dimension(: ), allocatable :: countParameters , iParameters
integer (c_size_t ) :: countRadii , iRadius , &
Expand Down Expand Up @@ -538,7 +539,7 @@ subroutine sphericalTabulatedTabulate(self,radiusScaled,parameters,container,tab
iterationCount =0_c_size_t
iterationCountTotal=product(countParameters)
! Tabulate in parallel.
!$omp parallel private(iRadius,radius_,time_,radiusOuter_,wavenumber_,coordinates,coordinatesZeroPoint,quantity_,instance,instanceKinematicsDistribution,iParameters,parameters_,parametersReduced_,workRemains,counter)
!$omp parallel private(iRadius,radius_,time_,radiusOuter_,wavenumber_,coordinates,coordinatesZeroPoint,quantity_,iParameters,parameters_,parametersReduced_,workRemains,counter)
! This is a new thread, so mark it as tabulating.
tabulating =.true.
! Initialize the counter and iterate over parameter states.
Expand All @@ -564,11 +565,20 @@ subroutine sphericalTabulatedTabulate(self,radiusScaled,parameters,container,tab
instance => self%factoryTabulation(parameters_ )
end select
allocate(instanceKinematicsDistribution)
instanceKinematicsDistribution=kinematicsDistributionCollisionless( &
& toleranceRelativeVelocityDispersion =self%kinematicsDistribution_%toleranceRelativeVelocityDispersion , &
& toleranceRelativeVelocityDispersionMaximum=self%kinematicsDistribution_%toleranceRelativeVelocityDispersionMaximum &
& )
!![
<referenceConstruct object="instanceKinematicsDistribution">
<constructor>
kinematicsDistributionCollisionless( &amp;
&amp; toleranceRelativeVelocityDispersion =self%kinematicsDistribution_%toleranceRelativeVelocityDispersion , &amp;
&amp; toleranceRelativeVelocityDispersionMaximum=self%kinematicsDistribution_%toleranceRelativeVelocityDispersionMaximum &amp;
&amp; )
</constructor>
</referenceConstruct>
!!]
call instance%setKinematicsDistribution(instanceKinematicsDistribution)
!![
<objectDestructor name="instanceKinematicsDistribution"/>
!!]
! Iterate over scaled radii.
!$omp do
do iRadius=1,countRadii
Expand Down Expand Up @@ -623,6 +633,7 @@ subroutine sphericalTabulatedTabulate(self,radiusScaled,parameters,container,tab
end do
!$omp end do
deallocate(instance)
nullify (instance)
end do
!$omp master
call displayCounterClear(verbosityLevelWorking)
Expand Down

0 comments on commit aeca09b

Please sign in to comment.