Skip to content

Commit

Permalink
Merge pull request #775 from galacticusorg/featMassDistributionsTabul…
Browse files Browse the repository at this point in the history
…ated

Add an abstract class which automates tabulation of parametric, spherically-symmetric, collisionless mass distributions
  • Loading branch information
abensonca authored Jan 28, 2025
2 parents e811db8 + aeca09b commit 2a8a5af
Show file tree
Hide file tree
Showing 9 changed files with 1,716 additions and 14 deletions.
1 change: 1 addition & 0 deletions .github/workflows/cicd.yml
Original file line number Diff line number Diff line change
Expand Up @@ -839,6 +839,7 @@ jobs:
tests.interpolation.2D.exe,
tests.make_ranges.exe,
tests.mass_distributions.exe,
tests.mass_distributions.tabulated.exe,
tests.math_special_functions.exe,
tests.math_distributions.exe,
tests.math.fast.exe,
Expand Down
3 changes: 2 additions & 1 deletion scripts/build/sourceDigests.pl
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,8 @@
(my $outputFileName = $targetName) =~ s/\.(exe|o)$/.md5s.c/;
open(my $outputFile,">".$ENV{'BUILDPATH'}."/".$outputFileName);
foreach my $hashName ( sort(keys(%{$digestsPerFile->{'types'}})) ) {
print $outputFile "char ".$hashName."MD5[]=\"".$digestsPerFile->{'types'}->{$hashName}->{'compositeMD5'}."\";\n"
(my $digest = $digestsPerFile->{'types'}->{$hashName}->{'compositeMD5'}) =~ s/\//\@/g;
print $outputFile "char ".$hashName."MD5[]=\"".$digest."\";\n"
}
close($outputFile);

Expand Down
139 changes: 139 additions & 0 deletions source/kinematic_distributions.collisionless.tabulated.F90
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
!! Copyright 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018,
!! 2019, 2020, 2021, 2022, 2023, 2024, 2025
!! Andrew Benson <abenson@carnegiescience.edu>
!!
!! This file is part of Galacticus.
!!
!! Galacticus is free software: you can redistribute it and/or modify
!! it under the terms of the GNU General Public License as published by
!! the Free Software Foundation, either version 3 of the License, or
!! (at your option) any later version.
!!
!! Galacticus is distributed in the hope that it will be useful,
!! but WITHOUT ANY WARRANTY; without even the implied warranty of
!! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
!! GNU General Public License for more details.
!!
!! You should have received a copy of the GNU General Public License
!! along with Galacticus. If not, see <http://www.gnu.org/licenses/>.

!!{
Implementation of a kinematic distribution class for collisionless mass distributions using tabulated solutions.
!!}

!![
<kinematicsDistribution name="kinematicsDistributionCollisionlessTabulated">
<description>A kinematic distribution class for collisionless mass distributions using tabulated solutions.</description>
</kinematicsDistribution>
!!]
type, public, extends(kinematicsDistributionClass) :: kinematicsDistributionCollisionlessTabulated
!!{
A kinematics distribution for collisionless distributions using tabulated solutions.
!!}
contains
procedure :: isCollisional => collisionlessTabulatedIsCollisional
procedure :: velocityDispersion1D => collisionlessTabulatedVelocityDispersion1D
end type kinematicsDistributionCollisionlessTabulated

interface kinematicsDistributionCollisionlessTabulated
!!{
Constructors for the {\normalfont \ttfamily collisionless} kinematic distribution class.
!!}
module procedure collisionlessTabulatedConstructorParameters
module procedure collisionlessTabulatedConstructorInternal
module procedure collisionlessTabulatedConstructorDecorated
end interface kinematicsDistributionCollisionlessTabulated

contains

function collisionlessTabulatedConstructorParameters(parameters) result(self)
!!{
Constructor for the {\normalfont \ttfamily collisionlessTabulated} kinematic distribution class which builds the object from a parameter
set.
!!}
use :: Input_Parameters, only : inputParameters
implicit none
type (kinematicsDistributionCollisionlessTabulated) :: self
type (inputParameters ), intent(inout) :: parameters
double precision :: toleranceRelativeVelocityDispersion, toleranceRelativeVelocityDispersionMaximum

!![
<inputParameter>
<name>toleranceRelativeVelocityDispersion</name>
<defaultValue>1.0d-6</defaultValue>
<source>parameters</source>
<description>The relative tolerance to use in numerical solutions for the velocity dispersion in dark-matter-only density profiles.</description>
</inputParameter>
<inputParameter>
<name>toleranceRelativeVelocityDispersionMaximum</name>
<defaultValue>1.0d-3</defaultValue>
<source>parameters</source>
<description>The maximum relative tolerance to use in numerical solutions for the velocity dispersion in dark-matter-only density profiles.</description>
</inputParameter>
!!]
self=kinematicsDistributionCollisionlessTabulated(toleranceRelativeVelocityDispersion,toleranceRelativeVelocityDispersionMaximum)
!![
<inputParametersValidate source="parameters"/>
!!]
return
end function collisionlessTabulatedConstructorParameters

function collisionlessTabulatedConstructorInternal(toleranceRelativeVelocityDispersion,toleranceRelativeVelocityDispersionMaximum) result(self)
!!{
Internal constructor for the {\normalfont \ttfamily collisionlessTabulated} kinematic distribution class.
!!}
implicit none
type (kinematicsDistributionCollisionlessTabulated) :: self
double precision , intent(in ), optional :: toleranceRelativeVelocityDispersion, toleranceRelativeVelocityDispersionMaximum
!![
<constructorAssign variables="toleranceRelativeVelocityDispersion, toleranceRelativeVelocityDispersionMaximum"/>
!!]

return
end function collisionlessTabulatedConstructorInternal

function collisionlessTabulatedConstructorDecorated(kinematicsDistribution_) result(self)
!!{
Internal constructor for the {\normalfont \ttfamily collisionlessTabulated} kinematic distribution class.
!!}
implicit none
type (kinematicsDistributionCollisionlessTabulated) :: self
class(kinematicsDistributionClass ), intent(in ) :: kinematicsDistribution_

self%toleranceRelativeVelocityDispersion =kinematicsDistribution_%toleranceRelativeVelocityDispersion
self%toleranceRelativeVelocityDispersionMaximum=kinematicsDistribution_%toleranceRelativeVelocityDispersionMaximum
return
end function collisionlessTabulatedConstructorDecorated

logical function collisionlessTabulatedIsCollisional(self)
!!{
Return false indicating that the tabulated collisionless kinematic distribution represents collisionless particles.
!!}
implicit none
class(kinematicsDistributionCollisionlessTabulated), intent(inout) :: self

collisionlessTabulatedIsCollisional=.false.
return
end function collisionlessTabulatedIsCollisional

double precision function collisionlessTabulatedVelocityDispersion1D(self,coordinates,massDistributionEmbedding) result(velocityDispersion)
!!{
Return the 1D velocity dispersion at the specified {\normalfont \ttfamily coordinates} in a tabulated collisionless kinematic distribution.
!!}
implicit none
class(kinematicsDistributionCollisionlessTabulated), intent(inout), target :: self
class(coordinate ), intent(in ) :: coordinates
class(massDistributionClass ), intent(inout) :: massDistributionEmbedding

select type (massDistributionEmbedding)
class is (massDistributionSphericalTabulated)
if (.not.massDistributionEmbedding%isTabulating()) then
velocityDispersion=massDistributionEmbedding%velocityDispersion1D (coordinates )
else
velocityDispersion=self %velocityDispersion1DNumerical(coordinates,massDistributionEmbedding)
end if
class default
velocityDispersion =self %velocityDispersion1DNumerical(coordinates,massDistributionEmbedding)
end select
return
end function collisionlessTabulatedVelocityDispersion1D
3 changes: 1 addition & 2 deletions source/mass_distributions.F90
Original file line number Diff line number Diff line change
Expand Up @@ -643,8 +643,7 @@ module Mass_Distributions
<argument>class(coordinate ), intent(in ) :: coordinates </argument>
<argument>class(massDistributionClass), intent(inout) :: massDistributionEmbedding</argument>
<code>
!$GLC attributes unused :: self, coordinates, massDistributionEmbedding
kinematicsDistributionVelocityDispersion1D=0.0d0
kinematicsDistributionVelocityDispersion1D=self%velocityDispersion1DNumerical(coordinates,massDistributionEmbedding)
</code>
</method>
<method name="velocityDispersion1DNumerical" >
Expand Down
7 changes: 2 additions & 5 deletions source/mass_distributions.spherical.F90
Original file line number Diff line number Diff line change
Expand Up @@ -522,8 +522,6 @@ double precision function sphericalPotentialNumerical(self,coordinates,status) r
double precision , dimension(:) , allocatable :: potentials , radii , &
& potentials_ , radii_
double precision , parameter :: countPointsPerOctave=4.0d+0
double precision , parameter :: radiusMaximumFactor =1.0d+1
double precision , parameter :: toleranceRelative =1.0d-6
type (integrator ) :: integrator_
integer (c_size_t ) :: countRadii , iMinimum , &
& iMaximum , iPrevious , &
Expand Down Expand Up @@ -707,10 +705,9 @@ double precision function sphericalPotentialDifferenceNumerical(self,coordinates
use :: Numerical_Comparison , only : Values_Agree
implicit none
class (massDistributionSpherical ), intent(inout), target :: self
class (coordinate ), intent(in ) :: coordinates1 , coordinates2
class (coordinate ), intent(in ) :: coordinates1 , coordinates2
type (enumerationStructureErrorCodeType), intent( out), optional :: status
double precision , parameter :: toleranceRelative =1.0d-3
double precision , parameter :: radiusMaximumFactor=1.0d+1
double precision , parameter :: toleranceRelative=1.0d-3
type (integrator ) :: integrator_

if (present(status)) status=structureErrorCodeSuccess
Expand Down
Loading

2 comments on commit 2a8a5af

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Performance Alert ⚠️

Possible performance regression was detected for benchmark 'Decaying dark matter-only subhalos benchmarks (τ=20 Gyr; vₖ=20 km/s)'.
Benchmark result of this commit is worse than the previous benchmark result exceeding threshold 3.

Benchmark suite Current: 2a8a5af Previous: e811db8 Ratio
(τ=20.0 Gyr; vₖ=20.0 km/s) - Likelihood - mass function 55.654310581503694 -logℒ 6.025134942152011 -logℒ 9.24
(τ=20.0 Gyr; vₖ=20.0 km/s) - Likelihood - orbital radius function 137.17284820154703 -logℒ 3.40178187219096 -logℒ 40.32

This comment was automatically generated by workflow using github-action-benchmark.

CC: @abensonca

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Performance Alert ⚠️

Possible performance regression was detected for benchmark 'Decaying dark matter-only subhalos benchmarks (τ=40 Gyr; vₖ=40 km/s)'.
Benchmark result of this commit is worse than the previous benchmark result exceeding threshold 2.50.

Benchmark suite Current: 2a8a5af Previous: e811db8 Ratio
(τ=40.0 Gyr; vₖ=40.0 km/s) - Likelihood - mass function 36.448625136101384 -logℒ 4.463686761083651 -logℒ 8.17
(τ=40.0 Gyr; vₖ=40.0 km/s) - Likelihood - orbital radius function 176.25647803568833 -logℒ 6.2279371559721755 -logℒ 28.30

This comment was automatically generated by workflow using github-action-benchmark.

CC: @abensonca

Please sign in to comment.