Skip to content

BiorthBasis::Cylinder deprojection improvements#208

Open
The9Cat wants to merge 48 commits intodevelfrom
Toomre
Open

BiorthBasis::Cylinder deprojection improvements#208
The9Cat wants to merge 48 commits intodevelfrom
Toomre

Conversation

@The9Cat
Copy link
Member

@The9Cat The9Cat commented Mar 13, 2026

Movitation

Needed a less cuspy option than exponential for attempting to produce a doughnut-shaped basis. So this adds a Toomre model for that purpose.

Improvements

  • I noticed that the numerical Abel transform had poor systematics in the inner profile. This is not a bug fix, but it is a noticeable improvement. The original version would not cause failure but could result in weaker EOF convergece.
  • Fixed a bug in Cylindrical parameter parsing: the dmodel key was read as a bool rather than a string.
  • I added all three numerical variants as source configuration choices and switched to the internal derivative form by default. I provided some verification and test routines for this in utils/Tests. These methods could be made user selectable but I have not done this in this PR.
  • I added a Python functor for the disk profile used in the spherical deprojection; this adds more generality for non-traditional surface density profiles.
  • A standalone test driver named testEmp that uses the same algorithm as EmpCylSL is included in utils/Test. I also provided two basic sanity checks on Abel transforms for verification and debugging. These could be removed.

Notes and comments

  • Trying to make an exponential profile with an inner cutoff (doughnut) with a an exponential deprojection results in ringing features in the doughnut hole
  • A more gradual surface density with no cusp for the deprojection, such as a Toomre surface density, helps reduce the wiggle features a bit. Only a bit because the inner roll over needs to be very shallow for positive density.
  • One can not use a basis with a sharp inner cut because this yields negative density in the deprojection.
  • It is additionally helpful, although not strictly necessary, to roll over the inner density for the basis construction more slowly than the target density to keep the Abel deprojected density positive.

Examples

  • First 8 basis functions for m=0 for a exponential disk with h/a=0.1, a=1 and a $(1+\tanh([R-0.005]/0.001)$ inner hole. The target basis is the deprojected disk with $\Sigma=(1+R^2)^{-3/2}$ with the inner rollover $(1+\tanh([R-0.005]/0.02)$, the smallest width that gives positive deprojected density. The inner edge of the model is obvious in these images.
exp4_m2 - First 8 basis functions as above but for a deprojected exponential basis with no hole. It is not too terrible and the orthogonality remains excellent, but there is more noise inside the cutoff for this one. exp1_m2

@The9Cat The9Cat requested a review from Copilot March 13, 2026 16:26
@The9Cat The9Cat changed the title Toomre BiorthBasis::Cylinder deprojection improvements Mar 13, 2026
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Adds a Toomre disk option for cylindrical-basis deprojection/conditioning, expands the Abel inversion implementations used during deprojection, and introduces several standalone test/verification executables under utils/Test.

Changes:

  • Add a new Toomre disk model and wire a configurable deprojection model selector (dmodel) into Cylindrical basis initialization.
  • Update EmpCylSL::create_deprojection to support multiple Abel inversion variants (Derivative/Subtraction/IBP) with derivative as default.
  • Add Deprojector/EmpDeproj test utilities and build targets in utils/Test.

Reviewed changes

Copilot reviewed 15 out of 15 changed files in this pull request and generated 16 comments.

Show a summary per file
File Description
utils/Test/testEmpDeproj.cc New CLI test comparing EmpDeproj vs Deprojector across profiles/methods
utils/Test/testDeproject.cc New example program for Deprojector (sampled + analytic construction)
utils/Test/testDeprojPlummer.cc New simple deprojection verification driver (currently hardwired)
utils/Test/EmpDeproj.cc New empirical deprojection implementation used by test programs
utils/Test/EmpDeproj.H Header for EmpDeproj test-class API
utils/Test/Deprojector.cc New numerical Abel deprojection implementation and grid integration logic
utils/Test/Deprojector.H Header/API for Deprojector
utils/Test/CubicSpline.cc New spline helper for sampled-data deprojection path
utils/Test/CubicSpline.H Header for CubicSpline
utils/Test/CMakeLists.txt Adds new test executables to the build
include/EmpCylSL.H Adds AbelType + abel_type member to control deprojection variant
include/DiskModels.H Adds Toomre disk density model for deprojection conditioning
exputil/EmpCylSL.cc Switchable Abel inversion variants used in deprojection pipeline
expui/BiorthBasis.cc Adds dmodel config key + lookup map and uses it when deproject is enabled
expui/BiorthBasis.H Introduces DeprojType enum + lookup map for deprojection disk models

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

You can also share your feedback on Copilot code review. Take the survey.

The9Cat and others added 8 commits March 13, 2026 12:42
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Adds a Toomre-based option for cylindrical deprojection and refines the numerical Abel inversion machinery, along with several small test/verification executables under utils/Test.

Changes:

  • Add a new Toomre disk model for deprojection and wire it into cylindrical basis initialization via a dmodel lookup.
  • Introduce multiple Abel inversion variants (derivative/subtraction/IBP) in the EmpCylSL deprojection path (defaulting to derivative).
  • Add standalone utils/Test deprojection utilities (Deprojector, EmpDeproj) and test drivers, and hook them into utils/Test/CMakeLists.txt.

Reviewed changes

Copilot reviewed 16 out of 16 changed files in this pull request and generated 12 comments.

Show a summary per file
File Description
utils/Test/testEmpDeproj.cc New CLI test comparing EmpDeproj against Deprojector for several analytic profiles.
utils/Test/testEmp.cc New CLI test for donut-shaped (inner cut) empirical deprojection.
utils/Test/testDeproject.cc New minimal examples for Deprojector from sampled data vs functor.
utils/Test/testDeprojPlummer.cc New Plummer/Gaussian/Toomre Deprojector validation driver.
utils/Test/EmpDeproj.cc Adds an empirical deprojection implementation used by the new test drivers.
utils/Test/EmpDeproj.H Declares the EmpDeproj helper class and AbelType selection.
utils/Test/Deprojector.cc Adds a standalone deprojection implementation with tail-matching and improved inner integration handling.
utils/Test/Deprojector.H Declares the standalone Deprojector API used by tests.
utils/Test/CubicSpline.cc Adds a basic natural cubic spline for sampled-data deprojection.
utils/Test/CubicSpline.H Declares the cubic spline used by Deprojector sampled-data ctor.
utils/Test/CMakeLists.txt Registers the new utils/Test executables in the build.
include/EmpCylSL.H Adds AbelType state to EmpCylSL for selecting deprojection variant.
include/DiskModels.H Adds a new Toomre disk density model (used for deprojection conditioning).
exputil/EmpCylSL.cc Updates EmpCylSL’s Abel inversion integral to support multiple variants.
expui/BiorthBasis.cc Adds dmodel string parsing + lookup for selecting deprojection model (mn/exponential/toomre/python).
expui/BiorthBasis.H Adds DeprojType and makes DiskType an enum class for stronger typing.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

You can also share your feedback on Copilot code review. Take the survey.

The9Cat and others added 10 commits March 13, 2026 14:32
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR enhances cylindrical-basis deprojection support by adding a Toomre disk option and improving the numerical Abel inversion implementation, along with new test/verification utilities under utils/Test.

Changes:

  • Add a Toomre disk model for cylindrical deprojection to provide a less-cuspy alternative to exponential.
  • Introduce selectable Abel inversion variants (derivative/subtraction/IBP) and change the default to the internal-derivative form.
  • Add standalone test programs and supporting spline/deprojection utilities for verification.

Reviewed changes

Copilot reviewed 15 out of 15 changed files in this pull request and generated 12 comments.

Show a summary per file
File Description
expui/BiorthBasis.cc Adds dmodel string handling and deprojection-model selection (mn/exponential/toomre/python) + pyproj config.
expui/BiorthBasis.H Extends Cylindrical config/state with pyproj, adds DeprojType, and converts DiskType to enum class.
exputil/EmpCylSL.cc Updates Abel inversion implementation and routes through a new abel_type selection.
include/EmpCylSL.H Adds AbelType enum + abel_type member to control deprojection inversion method.
include/DiskModels.H Adds a Toomre disk model usable for deprojection conditioning.
utils/Test/CMakeLists.txt Builds new test executables (testDeproj, testEmpDeproj, testEmp) and links Python embed for testEmp.
utils/Test/testDeproject.cc New CLI tool to validate Deprojector against analytic profiles.
utils/Test/testEmpDeproj.cc New CLI tool comparing EmpDeproj vs Deprojector across profiles/Abel variants.
utils/Test/testEmp.cc New CLI tool driving EmpDeproj, optionally via embedded Python-provided functions.
utils/Test/EmpDeproj.cc Implements a test-local EmpDeproj (EmpCylSL-like) deprojection routine with selectable Abel variants.
utils/Test/EmpDeproj.H Declares the test-local EmpDeproj class API.
utils/Test/Deprojector.cc Implements an independent Abel deprojector with improved inner-radius systematics.
utils/Test/Deprojector.H Declares the Deprojector API and data-driven/analytic constructors.
utils/Test/CubicSpline.cc Adds a minimal natural cubic spline implementation used by Deprojector.
utils/Test/CubicSpline.H Declares the minimal spline interface used by Deprojector.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

You can also share your feedback on Copilot code review. Take the survey.

The9Cat and others added 10 commits March 14, 2026 18:12
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
@The9Cat
Copy link
Member Author

The9Cat commented Mar 14, 2026

@copilot You suggested changing M_PI to constexpr double pi = std::acos(-1.0);. However, all clang builds are now failing because std::acos is not available as a constexpr. Please fix this, since it was your idea.

Copy link

Copilot AI commented Mar 14, 2026

@The9Cat I've opened a new pull request, #209, to work on those changes. Once the pull request is ready, I'll request review from you.

Copilot AI and others added 2 commits March 14, 2026 22:49
Co-authored-by: The9Cat <25960766+The9Cat@users.noreply.github.com>
Fix clang build: constexpr pi initialization
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR enhances cylindrical basis deprojection support by adding a Toomre disk option and improving/expanding the numerical Abel inversion approach used during deprojection and verification, along with several new standalone test drivers under utils/Test.

Changes:

  • Add a Toomre disk model for smoother, less-cuspy cylindrical deprojection.
  • Introduce selectable Abel inversion variants (derivative/subtraction/IBP) in EmpCylSL deprojection logic (defaulting to derivative).
  • Add standalone C++ test/verification utilities for deprojection and Abel transform behavior, including optional Python-supplied surface-density functions.

Reviewed changes

Copilot reviewed 15 out of 15 changed files in this pull request and generated 5 comments.

Show a summary per file
File Description
utils/Test/testEmpDeproj.cc New CLI test comparing EmpDeproj vs Deprojector for multiple analytic profiles.
utils/Test/testEmp.cc New CLI test driver supporting Python-embedded callable for Σ(R) or Σ(R,z).
utils/Test/testDeproject.cc New independent Deprojector test driver for analytic profiles.
utils/Test/EmpDeproj.cc Adds an empirical deprojection helper implementation with multiple Abel variants (test utility).
utils/Test/EmpDeproj.H Declares the EmpDeproj test utility API and AbelType enum.
utils/Test/Deprojector.cc Adds an independent deprojection implementation and improved near-origin handling (test utility).
utils/Test/Deprojector.H Declares Deprojector test utility API (analytic- and sampled-data constructors).
utils/Test/CubicSpline.cc New natural cubic spline implementation used by Deprojector (test utility).
utils/Test/CubicSpline.H Declares the spline implementation (test utility).
utils/Test/CMakeLists.txt Wires new test executables (testDeproj, testEmpDeproj, testEmp) into the utils/Test build.
include/EmpCylSL.H Adds internal AbelType and abel_type state for deprojection.
include/DiskModels.H Adds Toomre disk model for deprojection inputs.
exputil/EmpCylSL.cc Updates Abel inversion integral logic to support multiple numerical variants.
expui/BiorthBasis.cc Adds dmodel mapping/selection for deprojection model types, plus pyproj support.
expui/BiorthBasis.H Adds deprojection model typing (DeprojType), pyproj, and modernizes DiskType to enum class.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

You can also share your feedback on Copilot code review. Take the survey.

The9Cat and others added 5 commits March 15, 2026 12:26
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
@The9Cat The9Cat marked this pull request as ready for review March 15, 2026 16:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants