From be3a7060dfbcb80c1427c8b5f3badc9299e51d08 Mon Sep 17 00:00:00 2001 From: EBHolm Date: Wed, 25 Oct 2023 14:48:45 +0200 Subject: [PATCH 01/59] Created branch and XCode project --- CLASS.xcodeproj/project.pbxproj | 482 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../UserInterfaceState.xcuserstate | Bin 0 -> 96212 bytes .../xcshareddata/xcschemes/CLASS.xcscheme | 86 ++++ .../xcdebugger/Breakpoints_v2.xcbkptlist | 104 ++++ .../xcschemes/xcschememanagement.plist | 22 + 7 files changed, 709 insertions(+) create mode 100644 CLASS.xcodeproj/project.pbxproj create mode 100644 CLASS.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 CLASS.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 CLASS.xcodeproj/project.xcworkspace/xcuserdata/au566942.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 CLASS.xcodeproj/xcshareddata/xcschemes/CLASS.xcscheme create mode 100644 CLASS.xcodeproj/xcuserdata/au566942.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist create mode 100644 CLASS.xcodeproj/xcuserdata/au566942.xcuserdatad/xcschemes/xcschememanagement.plist diff --git a/CLASS.xcodeproj/project.pbxproj b/CLASS.xcodeproj/project.pbxproj new file mode 100644 index 000000000..1d0413cd7 --- /dev/null +++ b/CLASS.xcodeproj/project.pbxproj @@ -0,0 +1,482 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + AF089BBE27BD516E004D8CB6 /* distortions.c in Sources */ = {isa = PBXBuildFile; fileRef = AF089BBD27BD516E004D8CB6 /* distortions.c */; }; + AF089C5C27BD5191004D8CB6 /* history.c in Sources */ = {isa = PBXBuildFile; fileRef = AF089BC127BD5191004D8CB6 /* history.c */; }; + AF089C5D27BD5191004D8CB6 /* energy_injection.c in Sources */ = {isa = PBXBuildFile; fileRef = AF089BC327BD5191004D8CB6 /* energy_injection.c */; }; + AF089C5E27BD5191004D8CB6 /* hyrectools.c in Sources */ = {isa = PBXBuildFile; fileRef = AF089BC527BD5191004D8CB6 /* hyrectools.c */; }; + AF089C6027BD5191004D8CB6 /* helium.c in Sources */ = {isa = PBXBuildFile; fileRef = AF089BCE27BD5191004D8CB6 /* helium.c */; }; + AF089C6127BD5191004D8CB6 /* hydrogen.c in Sources */ = {isa = PBXBuildFile; fileRef = AF089BD127BD5191004D8CB6 /* hydrogen.c */; }; + AF089C6227BD5191004D8CB6 /* wrap_hyrec.c in Sources */ = {isa = PBXBuildFile; fileRef = AF089BD327BD5191004D8CB6 /* wrap_hyrec.c */; }; + AF089C6327BD5191004D8CB6 /* injection.c in Sources */ = {isa = PBXBuildFile; fileRef = AF089BE127BD5191004D8CB6 /* injection.c */; }; + AF089C6427BD5191004D8CB6 /* noninjection.c in Sources */ = {isa = PBXBuildFile; fileRef = AF089BE427BD5191004D8CB6 /* noninjection.c */; }; + AF089C6527BD5191004D8CB6 /* wrap_recfast.c in Sources */ = {isa = PBXBuildFile; fileRef = AF089BEC27BD5191004D8CB6 /* wrap_recfast.c */; }; + AFDC689C240D9F500044B5A3 /* lensing.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDC6892240D9F500044B5A3 /* lensing.c */; }; + AFDC689D240D9F500044B5A3 /* perturbations.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDC6893240D9F500044B5A3 /* perturbations.c */; }; + AFDC689E240D9F500044B5A3 /* transfer.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDC6894240D9F500044B5A3 /* transfer.c */; }; + AFDC689F240D9F500044B5A3 /* thermodynamics.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDC6895240D9F500044B5A3 /* thermodynamics.c */; }; + AFDC68A0240D9F500044B5A3 /* input.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDC6896240D9F500044B5A3 /* input.c */; }; + AFDC68A1240D9F500044B5A3 /* harmonic.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDC6897240D9F500044B5A3 /* harmonic.c */; }; + AFDC68A2240D9F500044B5A3 /* fourier.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDC6898240D9F500044B5A3 /* fourier.c */; }; + AFDC68A3240D9F500044B5A3 /* primordial.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDC6899240D9F500044B5A3 /* primordial.c */; }; + AFDC68A4240D9F500044B5A3 /* background.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDC689A240D9F500044B5A3 /* background.c */; }; + AFDC68A5240D9F500044B5A3 /* output.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDC689B240D9F500044B5A3 /* output.c */; }; + AFDC68B5240D9F6B0044B5A3 /* common.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDC68A7240D9F6B0044B5A3 /* common.c */; }; + AFDC68B6240D9F6B0044B5A3 /* arrays.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDC68A8240D9F6B0044B5A3 /* arrays.c */; }; + AFDC68B7240D9F6B0044B5A3 /* hyperspherical.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDC68AA240D9F6B0044B5A3 /* hyperspherical.c */; }; + AFDC68B8240D9F6B0044B5A3 /* sparse.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDC68AB240D9F6B0044B5A3 /* sparse.c */; }; + AFDC68B9240D9F6B0044B5A3 /* dei_rkck.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDC68AD240D9F6B0044B5A3 /* dei_rkck.c */; }; + AFDC68BA240D9F6B0044B5A3 /* growTable.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDC68AE240D9F6B0044B5A3 /* growTable.c */; }; + AFDC68BB240D9F6B0044B5A3 /* quadrature.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDC68AF240D9F6B0044B5A3 /* quadrature.c */; }; + AFDC68BC240D9F6B0044B5A3 /* evolver_rkck.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDC68B0240D9F6B0044B5A3 /* evolver_rkck.c */; }; + AFDC68BD240D9F6B0044B5A3 /* evolver_ndf15.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDC68B1240D9F6B0044B5A3 /* evolver_ndf15.c */; }; + AFDC68BE240D9F6B0044B5A3 /* parser.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDC68B3240D9F6B0044B5A3 /* parser.c */; }; + AFDC68BF240D9F6B0044B5A3 /* trigonometric_integrals.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDC68B4240D9F6B0044B5A3 /* trigonometric_integrals.c */; }; + AFDC68C2240D9FB80044B5A3 /* class.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDC68C1240D9FB80044B5A3 /* class.c */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + AFDC6884240D9EA00044B5A3 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + AF089BBD27BD516E004D8CB6 /* distortions.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = distortions.c; sourceTree = ""; }; + AF089BC127BD5191004D8CB6 /* history.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = history.c; sourceTree = ""; }; + AF089BC327BD5191004D8CB6 /* energy_injection.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = energy_injection.c; sourceTree = ""; }; + AF089BC427BD5191004D8CB6 /* helium.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = helium.h; sourceTree = ""; }; + AF089BC527BD5191004D8CB6 /* hyrectools.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = hyrectools.c; sourceTree = ""; }; + AF089BC627BD5191004D8CB6 /* wrap_hyrec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_hyrec.h; sourceTree = ""; }; + AF089BC827BD5191004D8CB6 /* hydrogen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hydrogen.h; sourceTree = ""; }; + AF089BCE27BD5191004D8CB6 /* helium.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = helium.c; sourceTree = ""; }; + AF089BCF27BD5191004D8CB6 /* energy_injection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = energy_injection.h; sourceTree = ""; }; + AF089BD027BD5191004D8CB6 /* history.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = history.h; sourceTree = ""; }; + AF089BD127BD5191004D8CB6 /* hydrogen.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = hydrogen.c; sourceTree = ""; }; + AF089BD227BD5191004D8CB6 /* hyrectools.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hyrectools.h; sourceTree = ""; }; + AF089BD327BD5191004D8CB6 /* wrap_hyrec.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = wrap_hyrec.c; sourceTree = ""; }; + AF089BDF27BD5191004D8CB6 /* noninjection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = noninjection.h; sourceTree = ""; }; + AF089BE127BD5191004D8CB6 /* injection.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = injection.c; sourceTree = ""; }; + AF089BE427BD5191004D8CB6 /* noninjection.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = noninjection.c; sourceTree = ""; }; + AF089BE627BD5191004D8CB6 /* injection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = injection.h; sourceTree = ""; }; + AF089BEC27BD5191004D8CB6 /* wrap_recfast.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = wrap_recfast.c; sourceTree = ""; }; + AF089BED27BD5191004D8CB6 /* wrap_recfast.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_recfast.h; sourceTree = ""; }; + AFDC6886240D9EA00044B5A3 /* CLASS */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = CLASS; sourceTree = BUILT_PRODUCTS_DIR; }; + AFDC6892240D9F500044B5A3 /* lensing.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = lensing.c; sourceTree = ""; }; + AFDC6893240D9F500044B5A3 /* perturbations.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = perturbations.c; sourceTree = ""; }; + AFDC6894240D9F500044B5A3 /* transfer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = transfer.c; sourceTree = ""; }; + AFDC6895240D9F500044B5A3 /* thermodynamics.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = thermodynamics.c; sourceTree = ""; }; + AFDC6896240D9F500044B5A3 /* input.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = input.c; sourceTree = ""; }; + AFDC6897240D9F500044B5A3 /* harmonic.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = harmonic.c; sourceTree = ""; }; + AFDC6898240D9F500044B5A3 /* fourier.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = fourier.c; sourceTree = ""; }; + AFDC6899240D9F500044B5A3 /* primordial.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = primordial.c; sourceTree = ""; }; + AFDC689A240D9F500044B5A3 /* background.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = background.c; sourceTree = ""; }; + AFDC689B240D9F500044B5A3 /* output.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = output.c; sourceTree = ""; }; + AFDC68A7240D9F6B0044B5A3 /* common.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = common.c; sourceTree = ""; }; + AFDC68A8240D9F6B0044B5A3 /* arrays.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = arrays.c; sourceTree = ""; }; + AFDC68A9240D9F6B0044B5A3 /* hermite6_interpolation_csource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hermite6_interpolation_csource.h; sourceTree = ""; }; + AFDC68AA240D9F6B0044B5A3 /* hyperspherical.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = hyperspherical.c; sourceTree = ""; }; + AFDC68AB240D9F6B0044B5A3 /* sparse.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sparse.c; sourceTree = ""; }; + AFDC68AC240D9F6B0044B5A3 /* hermite3_interpolation_csource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hermite3_interpolation_csource.h; sourceTree = ""; }; + AFDC68AD240D9F6B0044B5A3 /* dei_rkck.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dei_rkck.c; sourceTree = ""; }; + AFDC68AE240D9F6B0044B5A3 /* growTable.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = growTable.c; sourceTree = ""; }; + AFDC68AF240D9F6B0044B5A3 /* quadrature.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = quadrature.c; sourceTree = ""; }; + AFDC68B0240D9F6B0044B5A3 /* evolver_rkck.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = evolver_rkck.c; sourceTree = ""; }; + AFDC68B1240D9F6B0044B5A3 /* evolver_ndf15.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = evolver_ndf15.c; sourceTree = ""; }; + AFDC68B2240D9F6B0044B5A3 /* hermite4_interpolation_csource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hermite4_interpolation_csource.h; sourceTree = ""; }; + AFDC68B3240D9F6B0044B5A3 /* parser.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = parser.c; sourceTree = ""; }; + AFDC68B4240D9F6B0044B5A3 /* trigonometric_integrals.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = trigonometric_integrals.c; sourceTree = ""; }; + AFDC68C1240D9FB80044B5A3 /* class.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = class.c; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + AFDC6883240D9EA00044B5A3 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + AF089BBF27BD5191004D8CB6 /* external */ = { + isa = PBXGroup; + children = ( + AF089BC027BD5191004D8CB6 /* HyRec2020 */, + AF089BDD27BD5191004D8CB6 /* heating */, + AF089BEB27BD5191004D8CB6 /* RecfastCLASS */, + ); + path = external; + sourceTree = ""; + }; + AF089BC027BD5191004D8CB6 /* HyRec2020 */ = { + isa = PBXGroup; + children = ( + AF089BC127BD5191004D8CB6 /* history.c */, + AF089BC327BD5191004D8CB6 /* energy_injection.c */, + AF089BC427BD5191004D8CB6 /* helium.h */, + AF089BC527BD5191004D8CB6 /* hyrectools.c */, + AF089BC627BD5191004D8CB6 /* wrap_hyrec.h */, + AF089BC827BD5191004D8CB6 /* hydrogen.h */, + AF089BCE27BD5191004D8CB6 /* helium.c */, + AF089BCF27BD5191004D8CB6 /* energy_injection.h */, + AF089BD027BD5191004D8CB6 /* history.h */, + AF089BD127BD5191004D8CB6 /* hydrogen.c */, + AF089BD227BD5191004D8CB6 /* hyrectools.h */, + AF089BD327BD5191004D8CB6 /* wrap_hyrec.c */, + ); + path = HyRec2020; + sourceTree = ""; + }; + AF089BDD27BD5191004D8CB6 /* heating */ = { + isa = PBXGroup; + children = ( + AF089BDF27BD5191004D8CB6 /* noninjection.h */, + AF089BE127BD5191004D8CB6 /* injection.c */, + AF089BE427BD5191004D8CB6 /* noninjection.c */, + AF089BE627BD5191004D8CB6 /* injection.h */, + ); + path = heating; + sourceTree = ""; + }; + AF089BEB27BD5191004D8CB6 /* RecfastCLASS */ = { + isa = PBXGroup; + children = ( + AF089BEC27BD5191004D8CB6 /* wrap_recfast.c */, + AF089BED27BD5191004D8CB6 /* wrap_recfast.h */, + ); + path = RecfastCLASS; + sourceTree = ""; + }; + AFDC687D240D9EA00044B5A3 = { + isa = PBXGroup; + children = ( + AF089BBF27BD5191004D8CB6 /* external */, + AFDC68C0240D9FB80044B5A3 /* main */, + AFDC68A6240D9F6B0044B5A3 /* tools */, + AFDC6891240D9F500044B5A3 /* source */, + AFDC6887240D9EA00044B5A3 /* Products */, + ); + indentWidth = 2; + sourceTree = ""; + tabWidth = 2; + }; + AFDC6887240D9EA00044B5A3 /* Products */ = { + isa = PBXGroup; + children = ( + AFDC6886240D9EA00044B5A3 /* CLASS */, + ); + name = Products; + sourceTree = ""; + }; + AFDC6891240D9F500044B5A3 /* source */ = { + isa = PBXGroup; + children = ( + AFDC6892240D9F500044B5A3 /* lensing.c */, + AFDC6893240D9F500044B5A3 /* perturbations.c */, + AFDC6894240D9F500044B5A3 /* transfer.c */, + AFDC6895240D9F500044B5A3 /* thermodynamics.c */, + AFDC6896240D9F500044B5A3 /* input.c */, + AFDC6897240D9F500044B5A3 /* harmonic.c */, + AFDC6898240D9F500044B5A3 /* fourier.c */, + AFDC6899240D9F500044B5A3 /* primordial.c */, + AFDC689A240D9F500044B5A3 /* background.c */, + AFDC689B240D9F500044B5A3 /* output.c */, + AF089BBD27BD516E004D8CB6 /* distortions.c */, + ); + path = source; + sourceTree = ""; + }; + AFDC68A6240D9F6B0044B5A3 /* tools */ = { + isa = PBXGroup; + children = ( + AFDC68A7240D9F6B0044B5A3 /* common.c */, + AFDC68A8240D9F6B0044B5A3 /* arrays.c */, + AFDC68A9240D9F6B0044B5A3 /* hermite6_interpolation_csource.h */, + AFDC68AA240D9F6B0044B5A3 /* hyperspherical.c */, + AFDC68AB240D9F6B0044B5A3 /* sparse.c */, + AFDC68AC240D9F6B0044B5A3 /* hermite3_interpolation_csource.h */, + AFDC68AD240D9F6B0044B5A3 /* dei_rkck.c */, + AFDC68AE240D9F6B0044B5A3 /* growTable.c */, + AFDC68AF240D9F6B0044B5A3 /* quadrature.c */, + AFDC68B0240D9F6B0044B5A3 /* evolver_rkck.c */, + AFDC68B1240D9F6B0044B5A3 /* evolver_ndf15.c */, + AFDC68B2240D9F6B0044B5A3 /* hermite4_interpolation_csource.h */, + AFDC68B3240D9F6B0044B5A3 /* parser.c */, + AFDC68B4240D9F6B0044B5A3 /* trigonometric_integrals.c */, + ); + path = tools; + sourceTree = ""; + }; + AFDC68C0240D9FB80044B5A3 /* main */ = { + isa = PBXGroup; + children = ( + AFDC68C1240D9FB80044B5A3 /* class.c */, + ); + path = main; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + AFDC6885240D9EA00044B5A3 /* CLASS */ = { + isa = PBXNativeTarget; + buildConfigurationList = AFDC688D240D9EA00044B5A3 /* Build configuration list for PBXNativeTarget "CLASS" */; + buildPhases = ( + AFDC6882240D9EA00044B5A3 /* Sources */, + AFDC6883240D9EA00044B5A3 /* Frameworks */, + AFDC6884240D9EA00044B5A3 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = CLASS; + productName = ppCLASS; + productReference = AFDC6886240D9EA00044B5A3 /* CLASS */; + productType = "com.apple.product-type.tool"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + AFDC687E240D9EA00044B5A3 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1130; + ORGANIZATIONNAME = "Aarhus University"; + TargetAttributes = { + AFDC6885240D9EA00044B5A3 = { + CreatedOnToolsVersion = 11.3.1; + }; + }; + }; + buildConfigurationList = AFDC6881240D9EA00044B5A3 /* Build configuration list for PBXProject "CLASS" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = AFDC687D240D9EA00044B5A3; + productRefGroup = AFDC6887240D9EA00044B5A3 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + AFDC6885240D9EA00044B5A3 /* CLASS */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + AFDC6882240D9EA00044B5A3 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + AFDC68A0240D9F500044B5A3 /* input.c in Sources */, + AF089C6027BD5191004D8CB6 /* helium.c in Sources */, + AF089C6327BD5191004D8CB6 /* injection.c in Sources */, + AF089C5D27BD5191004D8CB6 /* energy_injection.c in Sources */, + AFDC68A1240D9F500044B5A3 /* harmonic.c in Sources */, + AFDC68A2240D9F500044B5A3 /* fourier.c in Sources */, + AFDC68B6240D9F6B0044B5A3 /* arrays.c in Sources */, + AF089C6527BD5191004D8CB6 /* wrap_recfast.c in Sources */, + AF089C5C27BD5191004D8CB6 /* history.c in Sources */, + AF089C6127BD5191004D8CB6 /* hydrogen.c in Sources */, + AFDC68A5240D9F500044B5A3 /* output.c in Sources */, + AFDC689E240D9F500044B5A3 /* transfer.c in Sources */, + AFDC689F240D9F500044B5A3 /* thermodynamics.c in Sources */, + AF089C6427BD5191004D8CB6 /* noninjection.c in Sources */, + AF089C5E27BD5191004D8CB6 /* hyrectools.c in Sources */, + AFDC68BE240D9F6B0044B5A3 /* parser.c in Sources */, + AFDC68BC240D9F6B0044B5A3 /* evolver_rkck.c in Sources */, + AFDC68BD240D9F6B0044B5A3 /* evolver_ndf15.c in Sources */, + AFDC68B9240D9F6B0044B5A3 /* dei_rkck.c in Sources */, + AFDC68BA240D9F6B0044B5A3 /* growTable.c in Sources */, + AFDC68C2240D9FB80044B5A3 /* class.c in Sources */, + AF089BBE27BD516E004D8CB6 /* distortions.c in Sources */, + AFDC68BF240D9F6B0044B5A3 /* trigonometric_integrals.c in Sources */, + AFDC68B5240D9F6B0044B5A3 /* common.c in Sources */, + AFDC689C240D9F500044B5A3 /* lensing.c in Sources */, + AFDC68BB240D9F6B0044B5A3 /* quadrature.c in Sources */, + AFDC689D240D9F500044B5A3 /* perturbations.c in Sources */, + AFDC68A3240D9F500044B5A3 /* primordial.c in Sources */, + AFDC68B7240D9F6B0044B5A3 /* hyperspherical.c in Sources */, + AFDC68B8240D9F6B0044B5A3 /* sparse.c in Sources */, + AFDC68A4240D9F500044B5A3 /* background.c in Sources */, + AF089C6227BD5191004D8CB6 /* wrap_hyrec.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + AFDC688B240D9EA00044B5A3 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = "__CLASSDIR__='\"$(PROJECT_DIR)\"'"; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(PROJECT_DIR)/include", + "$(PROJECT_DIR)/external/**", + ); + MACOSX_DEPLOYMENT_TARGET = 10.15; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + }; + name = Debug; + }; + AFDC688C240D9EA00044B5A3 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREPROCESSOR_DEFINITIONS = "__CLASSDIR__='\"$(PROJECT_DIR)\"'"; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(PROJECT_DIR)/include", + "$(PROJECT_DIR)/external/**", + ); + MACOSX_DEPLOYMENT_TARGET = 10.15; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = macosx; + }; + name = Release; + }; + AFDC688E240D9EA00044B5A3 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + AFDC688F240D9EA00044B5A3 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + AFDC6881240D9EA00044B5A3 /* Build configuration list for PBXProject "CLASS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + AFDC688B240D9EA00044B5A3 /* Debug */, + AFDC688C240D9EA00044B5A3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + AFDC688D240D9EA00044B5A3 /* Build configuration list for PBXNativeTarget "CLASS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + AFDC688E240D9EA00044B5A3 /* Debug */, + AFDC688F240D9EA00044B5A3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = AFDC687E240D9EA00044B5A3 /* Project object */; +} diff --git a/CLASS.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/CLASS.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..919434a62 --- /dev/null +++ b/CLASS.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/CLASS.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/CLASS.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/CLASS.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/CLASS.xcodeproj/project.xcworkspace/xcuserdata/au566942.xcuserdatad/UserInterfaceState.xcuserstate b/CLASS.xcodeproj/project.xcworkspace/xcuserdata/au566942.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..e853ba11040ace250d13d9e03acd926d9212b204 GIT binary patch literal 96212 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 BDvAIA literal 0 HcmV?d00001 diff --git a/CLASS.xcodeproj/xcshareddata/xcschemes/CLASS.xcscheme b/CLASS.xcodeproj/xcshareddata/xcschemes/CLASS.xcscheme new file mode 100644 index 000000000..db531c720 --- /dev/null +++ b/CLASS.xcodeproj/xcshareddata/xcschemes/CLASS.xcscheme @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CLASS.xcodeproj/xcuserdata/au566942.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/CLASS.xcodeproj/xcuserdata/au566942.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 000000000..e22bdda7a --- /dev/null +++ b/CLASS.xcodeproj/xcuserdata/au566942.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CLASS.xcodeproj/xcuserdata/au566942.xcuserdatad/xcschemes/xcschememanagement.plist b/CLASS.xcodeproj/xcuserdata/au566942.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 000000000..18ddafe09 --- /dev/null +++ b/CLASS.xcodeproj/xcuserdata/au566942.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,22 @@ + + + + + SchemeUserState + + CLASS.xcscheme_^#shared#^_ + + orderHint + 0 + + + SuppressBuildableAutocreation + + AFDC6885240D9EA00044B5A3 + + primary + + + + + From df3cbd8809c7bda77fb93558a9132a0f8edfe4b1 Mon Sep 17 00:00:00 2001 From: EBHolm Date: Wed, 25 Oct 2023 17:17:28 +0200 Subject: [PATCH 02/59] Implemented background; _solve needs work --- include/background.h | 79 ++++++++++++++ include/precisions.h | 3 + source/background.c | 238 ++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 317 insertions(+), 3 deletions(-) diff --git a/include/background.h b/include/background.h index 809c12601..d93e0b5ad 100644 --- a/include/background.h +++ b/include/background.h @@ -18,6 +18,13 @@ enum spatial_curvature {flat,open,closed}; enum equation_of_state {CLP,EDE}; +/** Nature of NEDE fluid */ +enum NEDE_fld_nature +{ + NEDE_fld_A, + NEDE_fld_B, + NEDE_fld_BIII +}; /** list of possible parametrizations of the varying fundamental constants */ @@ -81,6 +88,31 @@ struct background double Omega_ini_dcdm; /**< \f$ \Omega_{ini,dcdm} \f$: rescaled initial value for dcdm density (see 1407.2418 for definitions) */ double Gamma_dcdm; /**< \f$ \Gamma_{dcdm} \f$: decay constant for decaying cold dark matter */ double tau_dcdm; + + /* New Early Dark Energy quantities */ + double Omega_NEDE; /* NEDE density parameter before decay */ + double Omega0_NEDE; /* NEDE density parameter today */ + double f_NEDE; /* Fraction of NEDE at decay time */ + double Omega_trigger_decay; /* NEDE trigger at decay time */ + + short Junction_tag; + double Bubble_trigger_H_over_m; /* Decay time trigger */ + double NEDE_trigger_mass; /* Trigger field mass */ + double NEDE_trigger_ini; /* Trigger initial field value */ + double Omega0_trigger; /* Omega trigger field today */ + double phi_ini_trigger; + double phi_prime_ini_trigger; + double three_eos_NEDE; /* NEDE e.o.s. (scenario A) */ + short decay_flag; /* NEDE decay flag; True iff NEDE has decayed */ + + /* NEDE decay time */ + double tau_decay; + double a_decay; + double z_decay; + + /* NEDE fluid nature*/ + int NEDE_fld_nature; + int N_ncdm; /**< Number of distinguishable ncdm species */ /* the following parameters help to define tabulated ncdm p-s-d passed in file */ @@ -177,6 +209,19 @@ struct background int index_bg_rho_dcdm; /**< dcdm density */ int index_bg_rho_dr; /**< dr density */ + int index_bg_rho_NEDE; /**< NEDE density */ + int index_bg_w_NEDE; /**< NEDE eos parameter */ + + /* NEDE trigger field quantities*/ + int index_bg_phi_trigger; /**< trigger field value */ + int index_bg_phi_prime_trigger; /**< trigger field derivative wrt conformal time */ + int index_bg_V_trigger; /**< trigger field potential V */ + int index_bg_dV_trigger; /**< trigger field potential derivative V' */ + int index_bg_ddV_trigger; /**< trigger field potential second derivative V'' */ + int index_bg_rho_trigger; /**< trigger field energy density */ + int index_bg_p_trigger; /**< trigger field pressure */ + int index_bg_p_prime_trigger; /**< scalar field pressure */ + int index_bg_phi_scf; /**< scalar field value */ int index_bg_phi_prime_scf; /**< scalar field derivative wrt conformal time */ int index_bg_V_scf; /**< scalar field potential V */ @@ -261,6 +306,9 @@ struct background int index_bi_rho_fld; /**< {B} fluid density */ int index_bi_phi_scf; /**< {B} scalar field value */ int index_bi_phi_prime_scf; /**< {B} scalar field derivative wrt conformal time */ + + int index_bi_phi_trigger; /**< {B} NEDE trigger scalar field value */ + int index_bi_phi_prime_trigger; /**< {B} NEDE trigger scalar field derivative wrt conformal time */ int index_bi_time; /**< {C} proper (cosmological) time in Mpc */ int index_bi_rs; /**< {C} sound horizon */ @@ -295,6 +343,10 @@ struct background short has_idr; /**< presence of interacting dark radiation? */ short has_curvature; /**< presence of global spatial curvature? */ short has_varconst; /**< presence of varying fundamental constants? */ + + short has_NEDE; /**< presence of NEDE? */ + short has_NEDE_pert; /**< presence of NEDE perturbations? */ + short has_NEDE_trigger; /**< presence of NEDE trigger? */ //@} @@ -423,6 +475,16 @@ extern "C" { double * dw_over_da_fld, double * integral_fld); + int background_quantities_NEDE( + struct background *pba, + double a, + double a_prime_over_a, + double *rho, + double *p, + double *w, + double *dw_over_da, + double *ca2); + int background_varconst_of_z( struct background* pba, double z, @@ -565,6 +627,23 @@ extern "C" { double phi ); + + /** Trigger field potential and its derivatives **/ + double V_trigger( + struct background *pba, + double phi + ); + + double dV_trigger( + struct background *pba, + double phi + ); + + double ddV_trigger( + struct background *pba, + double phi + ); + /** Coupling between scalar field and matter **/ double Q_scf( struct background *pba, diff --git a/include/precisions.h b/include/precisions.h index b9bd961b5..70c069848 100644 --- a/include/precisions.h +++ b/include/precisions.h @@ -596,6 +596,9 @@ class_precision_parameter(tol_sd_detector,double,1.e-5) class_string_parameter(sd_external_path,"/external/distortions","sd_external_path") +/* NEDE: Makes integration around EDE decay finer */ +class_precision_parameter(decay_res_enhancement,double,0) +class_precision_parameter(sub_dom_cond,double,0) #undef class_precision_parameter #undef class_string_parameter diff --git a/source/background.c b/source/background.c index 22246e23e..ba23d71af 100644 --- a/source/background.c +++ b/source/background.c @@ -404,7 +404,11 @@ int background_functions( p_prime = a_prime_over_a * dp_dloga = a_prime_over_a * Sum [ (w_prime/a_prime_over_a -3(1+w)w)rho]. Note: The scalar field contribution must be added in the end, as an exception!*/ double dp_dloga; - + + /* NEDE */ + double rho_NEDE_decay; + double w_NEDE, dw_over_da_NEDE, integral_NEDE; + /** - initialize local variables */ rho_tot = 0.; p_tot = 0.; @@ -489,6 +493,30 @@ int background_functions( //printf(" a= %e, Omega_scf = %f, \n ",a, pvecback[pba->index_bg_rho_scf]/rho_tot ); } + /* New EDE trigger field */ + /*this function is called at every integration step in order to calculate scalar field related quantities like rho_trigger and so on*/ + if (pba->has_NEDE_trigger == _TRUE_) { + // if (-a_rel*0.99 <= pba->a_decay || pba->a_decay ==0 ) { + phi = pvecback_B[pba->index_bi_phi_trigger]; + phi_prime = pvecback_B[pba->index_bi_phi_prime_trigger]; + // if (a_rel>0.99) + // printf("phi: %f",phi); + pvecback[pba->index_bg_phi_trigger] = phi; // value of the trigger field phi + pvecback[pba->index_bg_phi_prime_trigger] = phi_prime; // value of the trigger field derivative wrt conformal time + pvecback[pba->index_bg_V_trigger] = V_trigger(pba, phi); // V_scf(pba,phi); //write here potential as function of phi + pvecback[pba->index_bg_dV_trigger] = dV_trigger(pba, phi); // dV_scf(pba,phi); //potential' as function of phi + pvecback[pba->index_bg_ddV_trigger] = ddV_trigger(pba, phi); // ddV_scf(pba,phi); //potential'' as function of phi + pvecback[pba->index_bg_rho_trigger] = (phi_prime*phi_prime/(2*a*a) + V_trigger(pba, phi))/3.; // energy of the trigger field. The field units are set automatically by setting the initial conditions + pvecback[pba->index_bg_p_trigger] = (phi_prime*phi_prime/(2*a*a) - V_trigger(pba, phi))/3.; // pressure of the trigger field + rho_tot += pvecback[pba->index_bg_rho_trigger]; + p_tot += pvecback[pba->index_bg_p_trigger]; + dp_dloga += 0.0; /** <-- This depends on a_prime_over_a, so we cannot add it now! */ + // divide relativistic & nonrelativistic (not very meaningful for oscillatory models) + rho_r += 3.*pvecback[pba->index_bg_p_trigger]; // field pressure contributes radiation + rho_m += pvecback[pba->index_bg_rho_trigger] - 3.*pvecback[pba->index_bg_p_trigger]; // the rest contributes matter + // printf(" a= %e, Omega_scf = %f, \n ",a_rel, pvecback[pba->index_bg_rho_scf]/rho_tot ); + } + /* ncdm */ if (pba->has_ncdm == _TRUE_) { @@ -563,6 +591,34 @@ int background_functions( dp_dloga += -(4./3.) * pvecback[pba->index_bg_rho_ur]; rho_r += pvecback[pba->index_bg_rho_ur]; } + + /* NEDE: Here we calculate bg quantities of the New EDE fluid like its energy density at every time step, we have to check if we are before or after the phase transition. */ + if (pba->has_NEDE == _TRUE_) { + if (a < pba->a_decay || pba->a_decay == 0) { + /* w=-1 phase */ + /*Note the class convention according to which 3 Mpl^2 is absorbed in rho, i.e. rho_crit = H0^2. */ + rho_NEDE_decay = pba->Omega_NEDE * pow(pba->H0, 2); + /* Save value of rho in array for later use. */ + pvecback[pba->index_bg_rho_NEDE] = rho_NEDE_decay; + pvecback[pba->index_bg_w_NEDE] = -1; + + p_tot -= rho_NEDE_decay; /* add pressure contributio n*/ + rho_tot += rho_NEDE_decay; /* add energy contribution */ + } + else { + /* NEDE decay phase with w > 0 */ + class_call(background_quantities_NEDE(pba, a, 0, &rho_NEDE_decay, NULL, &w_NEDE, &dw_over_da_NEDE, NULL), + pba->error_message, + pba->error_message); + + pvecback[pba->index_bg_rho_NEDE] = rho_NEDE_decay; + pvecback[pba->index_bg_w_NEDE] = w_NEDE; + p_tot += w_NEDE * rho_NEDE_decay; + rho_tot += rho_NEDE_decay; + + dp_dloga += (a*dw_over_da_NEDE - 3*(1 + w_NEDE)*w_NEDE)*pvecback[pba->index_bg_rho_NEDE]; + } + } /* interacting dark radiation */ if (pba->has_idr == _TRUE_) { @@ -595,6 +651,12 @@ int background_functions( (-pvecback[pba->index_bg_phi_prime_scf]*pvecback[pba->index_bg_H]/a-2./3.*pvecback[pba->index_bg_dV_scf]); pvecback[pba->index_bg_p_tot_prime] += pvecback[pba->index_bg_p_prime_scf]; } + + if (pba->has_NEDE_trigger == _TRUE_) { + /** The contribution of the trigger field was not added to dp_dloga, add p_scf_prime here: */ + pvecback[pba->index_bg_p_prime_trigger] = pvecback[pba->index_bg_phi_prime_trigger]*(-pvecback[pba->index_bg_phi_prime_trigger]*pvecback[pba->index_bg_H]/a - 2./3.*pvecback[pba->index_bg_dV_trigger]); + pvecback[pba->index_bg_p_tot_prime] += pvecback[pba->index_bg_p_prime_trigger]; + } /** - compute critical density */ rho_crit = rho_tot-pba->K/a/a; @@ -750,6 +812,65 @@ int background_w_fld( return _SUCCESS_; } +/** + * Single place where the NEDE fluid equation of state is + * defined. Parameters of the function are passed through the + * background structure. Generalisation to arbitrary functions should + * be simple. + * + * @param pba Input: pointer to background structure + * @param a Input: current value of scale factor + * @param a_prime_over_a Input: Hubble parameter + * @param rho Output: rho_NEDE(a) + * @param p Output: p_NEDE(a) + * @param w Output: equation of state parameter w_NEDE(a) + * @param dw_over_da Output: function dw_NEDE/da + * @param ca2 Output: adiabatic sound speed$ + * @return the error status + */ + +int background_quantities_NEDE( + struct background *pba, + double a, + double a_prime_over_a, + double *rho, + double *p, + double *w, + double *dw_over_da, + double *ca2) +{ + double x, a_over_a_non_rel; + double rhohat, phat, drhohat_dx, dphat_dx; + int last_index_1 = 1, last_index_2, i; + double w_prime; + double w_local = 0.; + double rho_local, dw_over_da_local; + double *vec; + + switch (pba->NEDE_fld_nature) + { + case NEDE_fld_A: + w_local = pba->three_eos_NEDE / 3.; + rho_local = (pba->Omega_NEDE) * pow(pba->H0, 2) * pow(pba->a_decay / a, 3. + 3. * w_local); + w_prime = 0.; + + if (w != NULL) + *w = w_local; + if (dw_over_da != NULL) + *dw_over_da = 0; + if (rho != NULL) + *rho = rho_local; + if (p != NULL) + *p = w_local * rho_local; + if ((ca2 != NULL) && (a_prime_over_a != 0.)) + *ca2 = w_local - w_prime / 3. / (1. + w_local) / a_prime_over_a; + + break; + } + + return _SUCCESS_; +} + /** * Single place where the variation of fundamental constants is * defined. Parameters of the function are passed through the @@ -983,6 +1104,9 @@ int background_indices( pba->has_idr = _FALSE_; pba->has_curvature = _FALSE_; pba->has_varconst = _FALSE_; + pba->has_NEDE = _FALSE_; + pba->has_NEDE_pert = _FALSE_; + pba->has_NEDE_trigger = _FALSE_; if (pba->Omega0_cdm != 0.) pba->has_cdm = _TRUE_; @@ -998,6 +1122,14 @@ int background_indices( if (pba->Gamma_dcdm != 0.) pba->has_dr = _TRUE_; } + + if (pba->Omega_NEDE != 0.) { + pba->has_NEDE = _TRUE_; + pba->has_NEDE_pert = _TRUE_; + /* Here we decide if we include a trigger field */ + if (pba->NEDE_trigger_ini != 0.) + pba->has_NEDE_trigger = _TRUE_; + } if (pba->Omega0_scf != 0.) pba->has_scf = _TRUE_; @@ -1099,6 +1231,19 @@ int background_indices( /* */ /* */ + /* - NEDE indices */ + class_define_index(pba->index_bg_rho_NEDE, pba->has_NEDE, index_bg, 1); + class_define_index(pba->index_bg_w_NEDE, pba->has_NEDE, index_bg, 1); + /* - NEDE trigger indices */ + class_define_index(pba->index_bg_phi_trigger, pba->has_NEDE_trigger, index_bg, 1); + class_define_index(pba->index_bg_phi_prime_trigger, pba->has_NEDE_trigger, index_bg, 1); + class_define_index(pba->index_bg_V_trigger, pba->has_NEDE_trigger, index_bg, 1); + class_define_index(pba->index_bg_dV_trigger, pba->has_NEDE_trigger, index_bg, 1); + class_define_index(pba->index_bg_ddV_trigger, pba->has_NEDE_trigger, index_bg, 1); + class_define_index(pba->index_bg_rho_trigger, pba->has_NEDE_trigger, index_bg, 1); + class_define_index(pba->index_bg_p_trigger, pba->has_NEDE_trigger, index_bg, 1); + class_define_index(pba->index_bg_p_prime_trigger, pba->has_NEDE_trigger, index_bg, 1); + /* - end of indices in the normal vector of background values */ pba->bg_size_normal = index_bg; @@ -1179,7 +1324,14 @@ int background_indices( /* -> Second order equation for growth factor */ class_define_index(pba->index_bi_D,_TRUE_,index_bi,1); class_define_index(pba->index_bi_D_prime,_TRUE_,index_bi,1); - + + /* -> NEDE trigger field and its derivative wrt conformal time */ + /* It is important that these two components appear at the end of the vector + (but still before the conformal time) because we stop integrating them + shortly after the decay (they are sub-dominant). + */ + class_define_index(pba->index_bi_phi_trigger, pba->has_NEDE_trigger, index_bi, 1); + class_define_index(pba->index_bi_phi_prime_trigger, pba->has_NEDE_trigger, index_bi, 1); /* -> end of indices in the vector of variables to integrate */ pba->bi_size = index_bi; @@ -1884,6 +2036,12 @@ int background_solve( double comoving_radius=0.; /* conformal distance in Mpc (equal to comoving radius in flat case) */ double conformal_distance; + + /* Reshift interval around decay of NEDE for which the integration is made finer. */ + double delta_z; + double a; + double d; + double w_NEDE, ca2_NEDE; /* evolvers */ extern int evolver_rk(); @@ -2069,6 +2227,20 @@ int background_solve( pba->Omega0_dr+pba->Omega0_dcdm,pba->Omega0_dcdmdr); printf(" -> Omega_ini_dcdm/Omega_b = %f\n",pba->Omega_ini_dcdm/pba->Omega0_b); } + if (pba->has_NEDE == _TRUE_) + { + printf(" -> NEDE details:\n"); + printf(" -> NEDE decay time: %.2f \n", pba->z_decay); + printf(" -> NEDE fraction: %.4f \n", pba->f_NEDE); + if (pba->NEDE_fld_nature == NEDE_fld_A) + printf(" -> Scenario A with eos NEDE: 3*w = %.2f \n", pba->three_eos_NEDE); + printf(" -> Percolation trigger (H/m): %f \n", pba->Bubble_trigger_H_over_m); + printf(" -> closure check: H/H0-1: %e \n", pvecback[pba->index_bg_H] / pba->H0 - 1); + printf(" -> resolution_enhancement: %e \n", ppr->decay_res_enhancement); + if (pba->has_NEDE_trigger == _TRUE_) + printf(" -> Omega_trigger = %g, Trigger_ini = %g \n", + pvecback[pba->index_bg_rho_trigger] / pvecback[pba->index_bg_rho_crit], pba->NEDE_trigger_ini); + } if (pba->has_scf == _TRUE_) { printf(" Scalar field details:\n"); printf(" -> Omega_scf = %g, wished %g\n", @@ -2252,6 +2424,17 @@ int background_initial_conditions( pvecback_integration[pba->index_bi_rho_fld] = rho_fld_today * exp(integral_fld); } + + + /* NEDE: Here we specify the initial conditions for the trigger field in slow roll approximation. + We simply set it on the attractor. We could also have started with zero, as the attractor is approached quickly + */ + if (pba->has_NEDE_trigger == _TRUE_ && pba->has_NEDE == _TRUE_) { + /* phi'_ini = -1/5 * phi_ini a^2 m^2 / (a H) where H = sqrt(rho) ins class conventions. */ + pvecback_integration[pba->index_bi_phi_trigger] = pba->phi_ini_trigger; + pvecback_integration[pba->index_bi_phi_prime_trigger] = -1./5.*pba->phi_ini_trigger*pow(pba->NEDE_trigger_mass, 2)/pow(rho_rad, 0.5)*a; + // printf("initial value: %e; \n",pvecback_integration[pba->index_bi_phi_prime_scf]); + } /** - Fix initial value of \f$ \phi, \phi' \f$ * set directly in the radiation attractor => fixes the units in terms of rho_ur @@ -2454,6 +2637,15 @@ int background_output_titles( class_store_columntitle(titles,"(.)rho_crit",_TRUE_); class_store_columntitle(titles,"(.)rho_dcdm",pba->has_dcdm); class_store_columntitle(titles,"(.)rho_dr",pba->has_dr); + + /* NEDE titles */ + class_store_columntitle(titles, "(.)rho_NEDE", pba->has_NEDE); + class_store_columntitle(titles, "(.)w_NEDE", pba->has_NEDE); + class_store_columntitle(titles, "(.)rho_trigger", pba->has_NEDE_trigger); + class_store_columntitle(titles, "(.)p_trigger", pba->has_NEDE_trigger); + class_store_columntitle(titles, "(.)p_prime_trigger", pba->has_NEDE_trigger); + class_store_columntitle(titles, "phi_trigger", pba->has_NEDE_trigger); + class_store_columntitle(titles, "phi'_trigger", pba->has_NEDE_trigger); class_store_columntitle(titles,"(.)rho_scf",pba->has_scf); class_store_columntitle(titles,"(.)p_scf",pba->has_scf); @@ -2528,6 +2720,14 @@ int background_output_data( class_store_double(dataptr,pvecback[pba->index_bg_rho_dcdm],pba->has_dcdm,storeidx); class_store_double(dataptr,pvecback[pba->index_bg_rho_dr],pba->has_dr,storeidx); + class_store_double(dataptr, pvecback[pba->index_bg_rho_NEDE], pba->has_NEDE, storeidx); + class_store_double(dataptr, pvecback[pba->index_bg_w_NEDE], pba->has_NEDE, storeidx); + class_store_double(dataptr, pvecback[pba->index_bg_rho_trigger], pba->has_NEDE_trigger, storeidx); + class_store_double(dataptr, pvecback[pba->index_bg_p_trigger], pba->has_NEDE_trigger, storeidx); + class_store_double(dataptr, pvecback[pba->index_bg_p_prime_trigger], pba->has_NEDE_trigger, storeidx); + class_store_double(dataptr, pvecback[pba->index_bg_phi_trigger], pba->has_NEDE_trigger, storeidx); + class_store_double(dataptr, pvecback[pba->index_bg_phi_prime_trigger], pba->has_NEDE_trigger, storeidx); + class_store_double(dataptr,pvecback[pba->index_bg_rho_scf],pba->has_scf,storeidx); class_store_double(dataptr,pvecback[pba->index_bg_p_scf],pba->has_scf,storeidx); class_store_double(dataptr,pvecback[pba->index_bg_p_prime_scf],pba->has_scf,storeidx); @@ -2657,6 +2857,13 @@ int background_derivs( dy[pba->index_bi_phi_scf] = y[pba->index_bi_phi_prime_scf]/a/H; dy[pba->index_bi_phi_prime_scf] = - 2*y[pba->index_bi_phi_prime_scf] - a*dV_scf(pba,y[pba->index_bi_phi_scf])/H ; } + + if (pba->has_NEDE_trigger == _TRUE_) + { + /** - Scalar field equation: \f$ \phi'' + 2 a H \phi' + a^2 dV = 0 \f$ (note H is wrt cosmic time) */ + dy[pba->index_bi_phi_trigger] = y[pba->index_bi_phi_prime_trigger]; + dy[pba->index_bi_phi_prime_trigger] = -a*(2.*pvecback[pba->index_bg_H]*y[pba->index_bi_phi_prime_trigger] + a*dV_trigger(pba, y[pba->index_bi_phi_trigger])); + } return _SUCCESS_; @@ -2835,7 +3042,7 @@ int background_output_budget( budget_radiation+=pba->Omega0_idr; } - if ((pba->has_lambda == _TRUE_) || (pba->has_fld == _TRUE_) || (pba->has_scf == _TRUE_) || (pba->has_curvature == _TRUE_)) { + if ((pba->has_lambda == _TRUE_) || (pba->has_fld == _TRUE_) || (pba->has_scf == _TRUE_) || (pba->has_curvature == _TRUE_) || (pba->has_NEDE)) { printf(" ---> Other Content \n"); } if (pba->has_lambda == _TRUE_) { @@ -2854,6 +3061,11 @@ int background_output_budget( class_print_species("Spatial Curvature",k); budget_other+=pba->Omega0_k; } + if (pba->has_NEDE) + { + class_print_species("New EDE", NEDE); + budget_other += pba->Omega0_NEDE; + } printf(" ---> Total budgets \n"); printf(" Radiation Omega = %-15g , omega = %-15g \n",budget_radiation,budget_radiation*pba->h*pba->h); @@ -2996,3 +3208,23 @@ double ddV_scf( double phi) { return ddV_e_scf(pba,phi)*V_p_scf(pba,phi) + 2*dV_e_scf(pba,phi)*dV_p_scf(pba,phi) + V_e_scf(pba,phi)*ddV_p_scf(pba,phi); } + + +/* NEDE: Here we implement out trigger potential (a simple quadratic) and its derivatives */ +double V_trigger( + struct background *pba, + double phi) { + return 1./2.*pba->NEDE_trigger_mass*pba->NEDE_trigger_mass*phi*phi; +} + +double dV_trigger( + struct background *pba, + double phi) { + return pba->NEDE_trigger_mass*pba->NEDE_trigger_mass*phi; +} + +double ddV_trigger( + struct background *pba, + double phi) { + return pba->NEDE_trigger_mass*pba->NEDE_trigger_mass; +} From 6e7938ff1b7c61860bbee84e8c3bb42809b3762f Mon Sep 17 00:00:00 2001 From: EBHolm Date: Wed, 25 Oct 2023 17:32:56 +0200 Subject: [PATCH 03/59] Implemented input --- include/input.h | 4 +- include/perturbations.h | 15 +++++ source/input.c | 123 +++++++++++++++++++++++++++++++++++++++- 3 files changed, 137 insertions(+), 5 deletions(-) diff --git a/include/input.h b/include/input.h index 8b78e3335..c945ea085 100644 --- a/include/input.h +++ b/include/input.h @@ -203,9 +203,9 @@ * For shooting method: definition of the possible targets */ -enum target_names {theta_s, theta_s_100, Omega_dcdmdr, omega_dcdmdr, Omega_scf, Omega_ini_dcdm, omega_ini_dcdm, sigma8, S8}; +enum target_names {theta_s, theta_s_100, Omega_dcdmdr, omega_dcdmdr, Omega_scf, Omega_ini_dcdm, omega_ini_dcdm, sigma8, S8, z_decay_NEDE}; /* Important: Keep this number equal to the number of target_names (except sigma8, S8), and keep sigma8, S8 at the very end */ -#define _NUM_TARGETS_ 7 +#define _NUM_TARGETS_ 8 /* Important: add one for each new target_names */ enum computation_stage {cs_background, cs_thermodynamics, cs_perturbations, cs_primordial, cs_nonlinear, cs_transfer, cs_spectra}; diff --git a/include/perturbations.h b/include/perturbations.h index 7747919d9..326d60f52 100644 --- a/include/perturbations.h +++ b/include/perturbations.h @@ -31,6 +31,9 @@ enum rsa_idr_flags {rsa_idr_off, rsa_idr_on}; enum ufa_flags {ufa_off, ufa_on}; enum ncdmfa_flags {ncdmfa_off, ncdmfa_on}; +/* Nature of NEDE fluid, either effective rest-frame sound speed is tracking the adiabatic sound speed (adiabatic case) or it is constant. */ +enum NEDE_ceff_nature {NEDE_ceff_const, NEDE_ceff_tracking}; + //@} /** @@ -169,6 +172,10 @@ struct perturbations double three_ceff2_ur;/**< 3 x effective squared sound speed for the ultrarelativistic perturbations */ double three_cvis2_ur;/**< 3 x effective viscosity parameter for the ultrarelativistic perturbations */ + + double three_ceff2_NEDE; + double three_cvis2_NEDE; + int NEDE_ceff_nature; double z_max_pk; /**< when we compute only the matter spectrum / transfer functions, but not the CMB, we are sometimes interested to sample source functions at very high redshift, way before recombination. This z_max_pk will then fix the initial sampling time of the sources. */ @@ -245,6 +252,7 @@ struct perturbations short has_source_delta_dr; /**< do we need source for delta of decay radiation? */ short has_source_delta_ur; /**< do we need source for delta of ultra-relativistic neutrinos/relics? */ short has_source_delta_ncdm; /**< do we need source for delta of all non-cold dark matter species (e.g. massive neutrinos)? */ + short has_source_delta_NEDE; /**< do we need source for delta of NEDE? */ short has_source_theta_m; /**< do we need source for theta of total matter? */ short has_source_theta_cb; /**< do we ALSO need source for theta of ONLY cdm and baryon? */ short has_source_theta_tot; /**< do we need source for theta total? */ @@ -259,6 +267,7 @@ struct perturbations short has_source_theta_dr; /**< do we need source for theta of ultra-relativistic neutrinos/relics? */ short has_source_theta_ur; /**< do we need source for theta of ultra-relativistic neutrinos/relics? */ short has_source_theta_ncdm; /**< do we need source for theta of all non-cold dark matter species (e.g. massive neutrinos)? */ + short has_source_theta_NEDE; /**< do we need source for theta of NEDE? */ short has_source_phi; /**< do we need source for metric fluctuation phi? */ short has_source_phi_prime; /**< do we need source for metric fluctuation phi'? */ short has_source_phi_plus_psi; /**< do we need source for metric fluctuation (phi+psi)? */ @@ -293,6 +302,7 @@ struct perturbations int index_tp_delta_ur; /**< index value for delta of ultra-relativistic neutrinos/relics */ int index_tp_delta_idr; /**< index value for delta of interacting dark radiation */ int index_tp_delta_ncdm1; /**< index value for delta of first non-cold dark matter species (e.g. massive neutrinos) */ + int index_tp_delta_NEDE; /**< index value for delta of NEDE */ int index_tp_perturbed_recombination_delta_temp; /**< Gas temperature perturbation */ int index_tp_perturbed_recombination_delta_chi; /**< Inionization fraction perturbation */ @@ -310,6 +320,7 @@ struct perturbations int index_tp_theta_idm; /**< index value for theta of interacting dark matter */ int index_tp_theta_dr; /**< index value for F1 of decay radiation */ int index_tp_theta_ncdm1; /**< index value for theta of first non-cold dark matter species (e.g. massive neutrinos) */ + int index_tp_theta_NEDE; /**< index value for theta of NEDE */ int index_tp_phi; /**< index value for metric fluctuation phi */ int index_tp_phi_prime; /**< index value for metric fluctuation phi' */ @@ -484,6 +495,10 @@ struct perturbations_vector int index_pt_shear_idr; /**< shear of interacting dark radiation */ int index_pt_l3_idr; /**< l=3 of interacting dark radiation */ int l_max_idr; /**< max momentum in Boltzmann hierarchy (at least 3) for interacting dark radiation */ + + int index_pt_delta_NEDE; + int index_pt_theta_NEDE; + int index_pt_shear_NEDE; /* perturbed recombination */ int index_pt_perturbed_recombination_delta_temp; /**< Gas temperature perturbation */ diff --git a/source/input.c b/source/input.c index c376d1d8a..6d6c9a6f6 100644 --- a/source/input.c +++ b/source/input.c @@ -527,7 +527,8 @@ int input_shooting(struct file_content * pfc, "omega_dcdmdr", "Omega_scf", "Omega_ini_dcdm", - "omega_ini_dcdm"}; + "omega_ini_dcdm", + "z_decay_NEDE"}; /* array of corresponding parameters that must be adjusted in order to meet the target (= unknown parameters) */ char * const unknown_namestrings[] = {"h", /* unknown param for target '100*theta_s' */ @@ -536,7 +537,8 @@ int input_shooting(struct file_content * pfc, "omega_ini_dcdm", /* unknown param for target 'omega_dcdmdr' */ "scf_shooting_parameter", /* unknown param for target 'Omega_scf' */ "Omega_dcdmdr", /* unknown param for target 'Omega_ini_dcdm' */ - "omega_dcdmdr"}; /* unknown param for target 'omega_ini_dcdm' */ + "omega_dcdmdr", /* unknown param for target 'omega_ini_dcdm' */ + "NEDE_trigger_mass"}; /* unknown param for target 'z_decay_NEDE' */ /* for each target, module up to which we need to run CLASS in order to compute the targetted quantities (not running the whole code @@ -547,7 +549,8 @@ int input_shooting(struct file_content * pfc, cs_background, /* computation stage for target 'omega_dcdmdr' */ cs_background, /* computation stage for target 'Omega_scf' */ cs_background, /* computation stage for target 'Omega_ini_dcdm' */ - cs_background}; /* computation stage for target 'omega_ini_dcdm' */ + cs_background, /* computation stage for target 'omega_ini_dcdm' */ + cs_background}; /* computation stage for target 'z_decay_NEDE' */ struct fzerofun_workspace fzw; @@ -1282,6 +1285,9 @@ int input_get_guess(double *xguess, xguess[index_guess] = 2.43e-9/0.891*pfzw->target_value[index_guess]; dxdy[index_guess] = 2.43e-9/0.891; break; + case z_decay_NEDE: + xguess[index_guess] = pow(pfzw->target_value[index_guess], 2.)/pow(ba.Bubble_trigger_H_over_m*1200., 2.); + dxdy[index_guess] = 2*pfzw->target_value[index_guess]/pow(ba.Bubble_trigger_H_over_m*1200., 2.); } } @@ -1493,6 +1499,11 @@ int input_try_unknown_parameters(double * unknown_parameter, case S8: output[i] = fo.sigma8[fo.index_pk_m]*sqrt(ba.Omega0_m/0.3); break; + case z_decay_NEDE: + output[i] = ba.z_decay - pfzw->target_value[i]; + // printf("z_decay: %f",ba.z_decay); + // z_decay_temp=ba.z_decay; + break; } } @@ -2340,6 +2351,13 @@ int input_read_parameters_species(struct file_content * pfc, int flag1, flag2, flag3; double param1, param2, param3; char string1[_ARGUMENT_LENGTH_MAX_]; + + double param_NEDE; + double rho_NEDE, w_NEDE; + double ca2; + int flag_NEDE, flag_NEDE_4; + char string_NEDE[_ARGUMENT_LENGTH_MAX_]; + int fileentries; int N_ncdm=0, n, entries_read; double rho_ncdm; @@ -3127,6 +3145,84 @@ int input_read_parameters_species(struct file_content * pfc, printf("Warning: Setting the tight_coupling_approximation = compromise_CLASS, since you selected idm-g!\n"); ppr->tight_coupling_approximation = compromise_CLASS; } + + /** 7.3) New Early Dark Energy */ + + class_read_double("f_NEDE", pba->f_NEDE); + class_read_double("z_decay_NEDE", pba->z_decay); + class_read_double("NEDE_trigger_mass", pba->NEDE_trigger_mass); + class_read_double("three_eos_NEDE", pba->three_eos_NEDE); + class_read_double("three_ceff2_NEDE", ppt->three_ceff2_NEDE); + class_read_double("three_cvis2_NEDE", ppt->three_cvis2_NEDE); + class_read_double("H_over_m_NEDE", pba->Bubble_trigger_H_over_m); + class_read_double("NEDE_trigger_ini", pba->NEDE_trigger_ini); + class_read_double("Junction_tag", pba->Junction_tag); + class_read_double("Omega0_NEDE", pba->Omega0_NEDE); // Omega today, is only used internally, when finding a better fit for z_decay. + + /* NEDE: Here we decide whether NEDE decays according to scenario A or B. Default: Scneario A*/ + + class_call(parser_read_string(pfc, "NEDE_fld_nature", &string_NEDE, &flag_NEDE_4, errmsg), + errmsg, + errmsg); + + if (flag_NEDE_4 == _TRUE_) + { + if ((strstr(string_NEDE, "A") != NULL) || (strstr(string1, "stiff") != NULL) || (strstr(string1, "Scenario_A") != NULL) || (strstr(string1, "const") != NULL)) + { + pba->NEDE_fld_nature = NEDE_fld_A; + } + if ((strstr(string_NEDE, "B") != NULL) || (strstr(string1, "decay") != NULL) || (strstr(string1, "Scenario_B") != NULL)) + { + pba->NEDE_fld_nature = NEDE_fld_B; + } + } + + // Decide if the effective sound speed is tracking the adiabatic sound speed. Default: no tracking (constant) + class_call(parser_read_string(pfc, "NEDE_ceff_nature", &string_NEDE, &flag_NEDE, errmsg), + errmsg, + errmsg); + + if (flag_NEDE == _TRUE_) + { + if ((strstr(string_NEDE, "constant") != NULL) || (strstr(string1, "Constant") != NULL) || (strstr(string1, "CONSTANT") != NULL) || (strstr(string1, "const") != NULL)) + { + ppt->NEDE_ceff_nature = NEDE_ceff_const; + } + if ((strstr(string_NEDE, "tracking") != NULL) || (strstr(string1, "Tracking") != NULL) || (strstr(string1, "TRACKING") != NULL)) + { + ppt->NEDE_ceff_nature = NEDE_ceff_tracking; + } + } + + if ((pba->Omega_NEDE > 0) || (pba->f_NEDE > 0)) + { + class_test(pba->z_decay == 0, errmsg, + "In input file, z_decay_NEDE needs to be specified for NEDE (The trigger mass as input parameter has been retired in v5)."); + + if (pba->Omega_NEDE == 0) + pba->Omega_NEDE = pba->f_NEDE * pow(pba->NEDE_trigger_mass * pba->Bubble_trigger_H_over_m / pba->H0, 2); + else if (pba->f_NEDE == 0) + pba->f_NEDE = pba->Omega_NEDE / pow(pba->NEDE_trigger_mass * pba->Bubble_trigger_H_over_m / pba->H0, 2); + + if (pba->NEDE_trigger_ini != 0) + { + pba->phi_ini_trigger = pba->NEDE_trigger_ini; + pba->phi_prime_ini_trigger = 0; // This value is set to the attractor later. + } + + class_test(pba->f_NEDE > 0.4, errmsg, + "Choose a smaller amount of NEDE as the code has not been tested for f_NEDE > 0.4."); + + if (pba->NEDE_fld_nature == NEDE_fld_A) + pba->Omega0_NEDE = pba->Omega_NEDE * pow(1. / (1. + pba->z_decay), (3. + pba->three_eos_NEDE)); + + Omega_tot += pba->Omega0_NEDE; + Omega_tot += pba->Omega0_trigger; + + /*printf("h: %f, omega_b: %f, omega_cdm: %f, ns: %f, ln10^10As: %f, tau: %f, mass: %f \n", pba->h, pba->Omega0_b * pba->h * pba->h, + pba->Omega0_cdm * pba->h * pba->h, ppm->n_s, log(ppm->A_s / 1.e-10), pth->tau_reio);*/ + } + /* ** ADDITIONAL SPECIES ** */ @@ -5806,6 +5902,27 @@ int input_default_params(struct background *pba, /** 7.2.4.b) temperature scaling idm_g */ pth->n_index_idm_g = 0; ppt->has_idm_soundspeed = _FALSE_; + + /** 7.3) New EDE parameters */ + pba->Omega_trigger_decay = 0.; + pba->three_eos_NEDE = 2.; // Default: w=2/3. + pba->Omega_NEDE = 0.; + pba->f_NEDE = 0; + pba->Omega0_NEDE = 0.; + pba->Omega0_trigger = 0.; + pba->decay_flag = _FALSE_; // Initially the decay has not yet taken place. + pba->Junction_tag = 1; // Default: standard junction condition inferred from matching. + pba->NEDE_trigger_ini = 0.001; + + pba->Bubble_trigger_H_over_m = .2; // Default value ionferred from miscroscpic model. + pba->NEDE_trigger_mass = 0.; + pba->z_decay = 0.; + pba->a_decay = 0.; + + ppt->three_ceff2_NEDE = 2.; // Default: matches adiabatic sound speed. + ppt->three_cvis2_NEDE = 0.; + pba->NEDE_fld_nature = NEDE_fld_A; + ppt->NEDE_ceff_nature = NEDE_ceff_const; /* ** ADDITIONAL SPECIES ** */ From aedb5e6e43b7d08a84b29961ee6f07ebe9691ed6 Mon Sep 17 00:00:00 2001 From: EBHolm Date: Wed, 25 Oct 2023 18:42:47 +0200 Subject: [PATCH 04/59] Small changes to background --- source/background.c | 2 +- source/input.c | 12 +++++------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/source/background.c b/source/background.c index ba23d71af..ec0bc9e56 100644 --- a/source/background.c +++ b/source/background.c @@ -407,7 +407,7 @@ int background_functions( /* NEDE */ double rho_NEDE_decay; - double w_NEDE, dw_over_da_NEDE, integral_NEDE; + double w_NEDE, dw_over_da_NEDE; /** - initialize local variables */ rho_tot = 0.; diff --git a/source/input.c b/source/input.c index 6d6c9a6f6..0ce76338d 100644 --- a/source/input.c +++ b/source/input.c @@ -2351,10 +2351,7 @@ int input_read_parameters_species(struct file_content * pfc, int flag1, flag2, flag3; double param1, param2, param3; char string1[_ARGUMENT_LENGTH_MAX_]; - - double param_NEDE; - double rho_NEDE, w_NEDE; - double ca2; + int flag_NEDE, flag_NEDE_4; char string_NEDE[_ARGUMENT_LENGTH_MAX_]; @@ -3216,9 +3213,6 @@ int input_read_parameters_species(struct file_content * pfc, if (pba->NEDE_fld_nature == NEDE_fld_A) pba->Omega0_NEDE = pba->Omega_NEDE * pow(1. / (1. + pba->z_decay), (3. + pba->three_eos_NEDE)); - Omega_tot += pba->Omega0_NEDE; - Omega_tot += pba->Omega0_trigger; - /*printf("h: %f, omega_b: %f, omega_cdm: %f, ns: %f, ln10^10As: %f, tau: %f, mass: %f \n", pba->h, pba->Omega0_b * pba->h * pba->h, pba->Omega0_cdm * pba->h * pba->h, ppm->n_s, log(ppm->A_s / 1.e-10), pth->tau_reio);*/ } @@ -3337,6 +3331,10 @@ int input_read_parameters_species(struct file_content * pfc, printf(" -> matched budget equations by adjusting Omega_scf = %g\n",pba->Omega0_scf); } } + + /* NEDE budget, both zero if no NEDE */ + Omega_tot += pba->Omega0_NEDE; + Omega_tot += pba->Omega0_trigger; /* ** END OF BUDGET EQUATION ** */ From 2ebb427fbeecaccab7c82a49c614abb2a997600e Mon Sep 17 00:00:00 2001 From: EBHolm Date: Wed, 25 Oct 2023 21:54:51 +0200 Subject: [PATCH 05/59] Fixed shooting bug introduced in class_public --- include/input.h | 2 +- source/input.c | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/include/input.h b/include/input.h index c945ea085..ab2fb15cb 100644 --- a/include/input.h +++ b/include/input.h @@ -205,7 +205,7 @@ enum target_names {theta_s, theta_s_100, Omega_dcdmdr, omega_dcdmdr, Omega_scf, Omega_ini_dcdm, omega_ini_dcdm, sigma8, S8, z_decay_NEDE}; /* Important: Keep this number equal to the number of target_names (except sigma8, S8), and keep sigma8, S8 at the very end */ -#define _NUM_TARGETS_ 8 +#define _NUM_TARGETS_ 10 /* Important: add one for each new target_names */ enum computation_stage {cs_background, cs_thermodynamics, cs_perturbations, cs_primordial, cs_nonlinear, cs_transfer, cs_spectra}; diff --git a/source/input.c b/source/input.c index 0ce76338d..e95675a83 100644 --- a/source/input.c +++ b/source/input.c @@ -528,6 +528,8 @@ int input_shooting(struct file_content * pfc, "Omega_scf", "Omega_ini_dcdm", "omega_ini_dcdm", + "sigma8", + "S8", "z_decay_NEDE"}; /* array of corresponding parameters that must be adjusted in order to meet the target (= unknown parameters) */ @@ -538,6 +540,8 @@ int input_shooting(struct file_content * pfc, "scf_shooting_parameter", /* unknown param for target 'Omega_scf' */ "Omega_dcdmdr", /* unknown param for target 'Omega_ini_dcdm' */ "omega_dcdmdr", /* unknown param for target 'omega_ini_dcdm' */ + "A_s", /* unknown param for target 'sigma8' */ + "A_s", /* unknown param for target 'S8' */ "NEDE_trigger_mass"}; /* unknown param for target 'z_decay_NEDE' */ /* for each target, module up to which we need to run CLASS in order From a7a87d5e9cf425287a6ec333a40a30b3812d045b Mon Sep 17 00:00:00 2001 From: EBHolm Date: Wed, 25 Oct 2023 21:57:57 +0200 Subject: [PATCH 06/59] New XCode project Might be hardcoded to my system... --- .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../UserInterfaceState.xcuserstate | Bin 96212 -> 113500 bytes .../WorkspaceSettings.xcsettings | 14 ++ .../xcdebugger/Breakpoints_v2.xcbkptlist | 158 ++++++++++++++---- 4 files changed, 149 insertions(+), 31 deletions(-) create mode 100644 CLASS.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 CLASS.xcodeproj/project.xcworkspace/xcuserdata/au566942.xcuserdatad/WorkspaceSettings.xcsettings diff --git a/CLASS.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/CLASS.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 000000000..f9b0d7c5e --- /dev/null +++ b/CLASS.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/CLASS.xcodeproj/project.xcworkspace/xcuserdata/au566942.xcuserdatad/UserInterfaceState.xcuserstate b/CLASS.xcodeproj/project.xcworkspace/xcuserdata/au566942.xcuserdatad/UserInterfaceState.xcuserstate index e853ba11040ace250d13d9e03acd926d9212b204..a75f9a71e1a57d34b6d215cf34d82edd85d8196c 100644 GIT binary patch literal 113500 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%0A*G=2=fNrz3 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 NzyJIH{~eXA|6j3#oGAbR literal 96212 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 BDvAIA diff --git a/CLASS.xcodeproj/project.xcworkspace/xcuserdata/au566942.xcuserdatad/WorkspaceSettings.xcsettings b/CLASS.xcodeproj/project.xcworkspace/xcuserdata/au566942.xcuserdatad/WorkspaceSettings.xcsettings new file mode 100644 index 000000000..bbfef027f --- /dev/null +++ b/CLASS.xcodeproj/project.xcworkspace/xcuserdata/au566942.xcuserdatad/WorkspaceSettings.xcsettings @@ -0,0 +1,14 @@ + + + + + BuildLocationStyle + UseAppPreferences + CustomBuildLocationType + RelativeToDerivedData + DerivedDataLocationStyle + Default + ShowSharedSchemesAutomaticallyEnabled + + + diff --git a/CLASS.xcodeproj/xcuserdata/au566942.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/CLASS.xcodeproj/xcuserdata/au566942.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index e22bdda7a..73f758c61 100644 --- a/CLASS.xcodeproj/xcuserdata/au566942.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/CLASS.xcodeproj/xcuserdata/au566942.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -1,53 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + startingLineNumber = "658" + endingLineNumber = "658" + offsetFromSymbolStart = "2056"> + startingLineNumber = "658" + endingLineNumber = "658" + offsetFromSymbolStart = "2096"> @@ -55,15 +151,15 @@ @@ -71,32 +167,32 @@ From b7abd33a438c90bbb622ba3d87b52d95f64aed2a Mon Sep 17 00:00:00 2001 From: EBHolm Date: Wed, 25 Oct 2023 22:09:09 +0200 Subject: [PATCH 07/59] Fixes --- include/input.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/input.h b/include/input.h index ab2fb15cb..0f1361894 100644 --- a/include/input.h +++ b/include/input.h @@ -203,9 +203,9 @@ * For shooting method: definition of the possible targets */ -enum target_names {theta_s, theta_s_100, Omega_dcdmdr, omega_dcdmdr, Omega_scf, Omega_ini_dcdm, omega_ini_dcdm, sigma8, S8, z_decay_NEDE}; +enum target_names {theta_s, theta_s_100, Omega_dcdmdr, omega_dcdmdr, Omega_scf, Omega_ini_dcdm, omega_ini_dcdm, z_decay_NEDE, sigma8, S8}; /* Important: Keep this number equal to the number of target_names (except sigma8, S8), and keep sigma8, S8 at the very end */ -#define _NUM_TARGETS_ 10 +#define _NUM_TARGETS_ 8 /* Important: add one for each new target_names */ enum computation_stage {cs_background, cs_thermodynamics, cs_perturbations, cs_primordial, cs_nonlinear, cs_transfer, cs_spectra}; From c1e1d101d8d8144328da35fd34b001bc2f916d17 Mon Sep 17 00:00:00 2001 From: EBHolm Date: Wed, 25 Oct 2023 22:09:56 +0200 Subject: [PATCH 08/59] Final shooting fix --- source/input.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/source/input.c b/source/input.c index e95675a83..0ebbd54a1 100644 --- a/source/input.c +++ b/source/input.c @@ -527,9 +527,7 @@ int input_shooting(struct file_content * pfc, "omega_dcdmdr", "Omega_scf", "Omega_ini_dcdm", - "omega_ini_dcdm", - "sigma8", - "S8", + "omega_ini_dcdm" "z_decay_NEDE"}; /* array of corresponding parameters that must be adjusted in order to meet the target (= unknown parameters) */ @@ -540,8 +538,6 @@ int input_shooting(struct file_content * pfc, "scf_shooting_parameter", /* unknown param for target 'Omega_scf' */ "Omega_dcdmdr", /* unknown param for target 'Omega_ini_dcdm' */ "omega_dcdmdr", /* unknown param for target 'omega_ini_dcdm' */ - "A_s", /* unknown param for target 'sigma8' */ - "A_s", /* unknown param for target 'S8' */ "NEDE_trigger_mass"}; /* unknown param for target 'z_decay_NEDE' */ /* for each target, module up to which we need to run CLASS in order From baa365f205ca78ff974ac05186110ffff662bdf1 Mon Sep 17 00:00:00 2001 From: EBHolm Date: Fri, 27 Oct 2023 14:14:10 +0200 Subject: [PATCH 09/59] Implemented z_decay peak-finding and shooting --- source/background.c | 16 ++++++------ source/input.c | 63 +++++++++++++++++++++++++++++++++++---------- 2 files changed, 58 insertions(+), 21 deletions(-) diff --git a/source/background.c b/source/background.c index ec0bc9e56..24b0fec17 100644 --- a/source/background.c +++ b/source/background.c @@ -499,8 +499,6 @@ int background_functions( // if (-a_rel*0.99 <= pba->a_decay || pba->a_decay ==0 ) { phi = pvecback_B[pba->index_bi_phi_trigger]; phi_prime = pvecback_B[pba->index_bi_phi_prime_trigger]; - // if (a_rel>0.99) - // printf("phi: %f",phi); pvecback[pba->index_bg_phi_trigger] = phi; // value of the trigger field phi pvecback[pba->index_bg_phi_prime_trigger] = phi_prime; // value of the trigger field derivative wrt conformal time pvecback[pba->index_bg_V_trigger] = V_trigger(pba, phi); // V_scf(pba,phi); //write here potential as function of phi @@ -594,9 +592,10 @@ int background_functions( /* NEDE: Here we calculate bg quantities of the New EDE fluid like its energy density at every time step, we have to check if we are before or after the phase transition. */ if (pba->has_NEDE == _TRUE_) { - if (a < pba->a_decay || pba->a_decay == 0) { + double a_decay = 1./(1. + pba->z_decay); + if (a < a_decay || a_decay == 0) { /* w=-1 phase */ - /*Note the class convention according to which 3 Mpl^2 is absorbed in rho, i.e. rho_crit = H0^2. */ + /* Note the class convention according to which 3 Mpl^2 is absorbed in rho, i.e. rho_crit = H0^2. */ rho_NEDE_decay = pba->Omega_NEDE * pow(pba->H0, 2); /* Save value of rho in array for later use. */ pvecback[pba->index_bg_rho_NEDE] = rho_NEDE_decay; @@ -851,7 +850,7 @@ int background_quantities_NEDE( { case NEDE_fld_A: w_local = pba->three_eos_NEDE / 3.; - rho_local = (pba->Omega_NEDE) * pow(pba->H0, 2) * pow(pba->a_decay / a, 3. + 3. * w_local); + rho_local = (pba->Omega_NEDE) * pow(pba->H0, 2) * pow(1./(1. + pba->z_decay) / a, 3. + 3. * w_local); w_prime = 0.; if (w != NULL) @@ -1104,7 +1103,7 @@ int background_indices( pba->has_idr = _FALSE_; pba->has_curvature = _FALSE_; pba->has_varconst = _FALSE_; - pba->has_NEDE = _FALSE_; + // pba->has_NEDE = _FALSE_; pba->has_NEDE_pert = _FALSE_; pba->has_NEDE_trigger = _FALSE_; @@ -1123,8 +1122,9 @@ int background_indices( pba->has_dr = _TRUE_; } - if (pba->Omega_NEDE != 0.) { - pba->has_NEDE = _TRUE_; + //if (pba->Omega_NEDE != 0.) { + if (pba->has_NEDE == _TRUE_) { + //pba->has_NEDE = _TRUE_; pba->has_NEDE_pert = _TRUE_; /* Here we decide if we include a trigger field */ if (pba->NEDE_trigger_ini != 0.) diff --git a/source/input.c b/source/input.c index 0ebbd54a1..d3b8df504 100644 --- a/source/input.c +++ b/source/input.c @@ -527,7 +527,7 @@ int input_shooting(struct file_content * pfc, "omega_dcdmdr", "Omega_scf", "Omega_ini_dcdm", - "omega_ini_dcdm" + "omega_ini_dcdm", "z_decay_NEDE"}; /* array of corresponding parameters that must be adjusted in order to meet the target (= unknown parameters) */ @@ -560,6 +560,8 @@ int input_shooting(struct file_content * pfc, unknown_parameters_size = 0; fzw.required_computation_stage = 0; for (index_target = 0; index_target < _NUM_TARGETS_; index_target++){ + if (index_target == 7) { + int a = 0;} class_call(parser_read_double(pfc,target_namestrings[index_target],¶m1,&flag1,errmsg), errmsg, errmsg); @@ -1285,9 +1287,14 @@ int input_get_guess(double *xguess, xguess[index_guess] = 2.43e-9/0.891*pfzw->target_value[index_guess]; dxdy[index_guess] = 2.43e-9/0.891; break; - case z_decay_NEDE: - xguess[index_guess] = pow(pfzw->target_value[index_guess], 2.)/pow(ba.Bubble_trigger_H_over_m*1200., 2.); - dxdy[index_guess] = 2*pfzw->target_value[index_guess]/pow(ba.Bubble_trigger_H_over_m*1200., 2.); + case z_decay_NEDE: { + double Omega_M = ba.Omega0_cdm + ba.Omega0_b + ba.Omega0_ncdm_tot; + double z_NEDE = pfzw->target_value[index_guess]; + double trigger_mass = 0.5 * ba.H0 / ba.Bubble_trigger_H_over_m * pow(1. / (1. - ba.f_NEDE), 0.5) * pow(Omega_M * pow((1. + z_NEDE), 3) + Omega_M * pow((1. + z_NEDE), 4) / (3001.) + (1. - Omega_M), 0.5); + + xguess[index_guess] = 0.5 * ba.H0 / ba.Bubble_trigger_H_over_m * pow(1. / (1. - ba.f_NEDE), 0.5) * pow(Omega_M * pow((1. + pfzw->target_value[index_guess]), 3) + Omega_M * pow((1. + pfzw->target_value[index_guess]), 4) / (3001.) + (1. - Omega_M), 0.5); + dxdy[index_guess] = 0.5 * trigger_mass * (3. * Omega_M * pow((1. + z_NEDE), 2) + 4. * Omega_M * pow((1. + z_NEDE), 3) / (3001.)) / (Omega_M * pow((1. + z_NEDE), 3) + Omega_M * pow((1. + z_NEDE), 4) / (3001.) + (1. - Omega_M)); + } } } @@ -1499,11 +1506,41 @@ int input_try_unknown_parameters(double * unknown_parameter, case S8: output[i] = fo.sigma8[fo.index_pk_m]*sqrt(ba.Omega0_m/0.3); break; - case z_decay_NEDE: - output[i] = ba.z_decay - pfzw->target_value[i]; - // printf("z_decay: %f",ba.z_decay); - // z_decay_temp=ba.z_decay; - break; + case z_decay_NEDE: { + /*NOTE TO SELF: COMPUTE ACTUAL z_DECAY FROM ba HERE. USE THE TRICK FROM CLASS_EDE! + ALSO NOTE TO SELF: CODE THE NEDE DYNAMCIS IN BG FUNCTIONS INSTEAD OF BG SOLVE. + NEDE DYNAMICS NEED TO BE ACTIVATED THER. + SHOULD ALSO CHECK IF TRIGGER DYNAMICS NEED EXPLICIT IMPLEMENTATION THERE. + + + To find the z value at decay: + Find the z at which H(z) < m_trigger*Bubble_trigger_HoverM + + + */ + + double z_decay = 0.; + double H_decay = ba.NEDE_trigger_mass*ba.Bubble_trigger_H_over_m; + for (int index_tau = 1; index_tau < ba.bt_size - 1; ++index_tau) { + double H_z = ba.background_table[index_tau*ba.bg_size + ba.index_bg_H]; + if (H_decay > H_z) { + /* Linear interpolation to find approximate decay redshift */ + double a1 = ba.background_table[(index_tau - 1)*ba.bg_size + ba.index_bg_a]; + double a2 = ba.background_table[index_tau*ba.bg_size + ba.index_bg_a]; + double H1 = ba.background_table[(index_tau - 1)*ba.bg_size + ba.index_bg_H]; + double H2 = ba.background_table[index_tau*ba.bg_size + ba.index_bg_H]; + double a_decay = a1 + (H_decay - H1)*(a2 - a1)/(H2 - H1); + z_decay = 1./a_decay - 1.; + break; + } + } + + output[i] = z_decay - pfzw->target_value[i]; + if (input_verbose > 1) { + printf("z_decay=%f, target=%f\n", z_decay, pfzw->target_value[i]); + } + break; + } } } @@ -3144,7 +3181,7 @@ int input_read_parameters_species(struct file_content * pfc, } /** 7.3) New Early Dark Energy */ - + pba->has_NEDE = _FALSE_; class_read_double("f_NEDE", pba->f_NEDE); class_read_double("z_decay_NEDE", pba->z_decay); class_read_double("NEDE_trigger_mass", pba->NEDE_trigger_mass); @@ -3191,10 +3228,11 @@ int input_read_parameters_species(struct file_content * pfc, } } - if ((pba->Omega_NEDE > 0) || (pba->f_NEDE > 0)) - { + if ((pba->Omega_NEDE > 0) || (pba->f_NEDE > 0)) { class_test(pba->z_decay == 0, errmsg, "In input file, z_decay_NEDE needs to be specified for NEDE (The trigger mass as input parameter has been retired in v5)."); + + pba->has_NEDE = _TRUE_; if (pba->Omega_NEDE == 0) pba->Omega_NEDE = pba->f_NEDE * pow(pba->NEDE_trigger_mass * pba->Bubble_trigger_H_over_m / pba->H0, 2); @@ -5915,7 +5953,6 @@ int input_default_params(struct background *pba, pba->Bubble_trigger_H_over_m = .2; // Default value ionferred from miscroscpic model. pba->NEDE_trigger_mass = 0.; pba->z_decay = 0.; - pba->a_decay = 0.; ppt->three_ceff2_NEDE = 2.; // Default: matches adiabatic sound speed. ppt->three_cvis2_NEDE = 0.; From a5ef61b5882270c45c294a4a0d882d2b09a84dd8 Mon Sep 17 00:00:00 2001 From: EBHolm Date: Tue, 31 Oct 2023 21:57:30 +0100 Subject: [PATCH 10/59] Fully working 2d shooting --- include/background.h | 11 ++++ include/input.h | 4 +- include/precisions.h | 4 -- source/background.c | 151 +++++++++++++++++++++++++++---------------- source/input.c | 112 ++++++++++++++++++++------------ 5 files changed, 180 insertions(+), 102 deletions(-) diff --git a/include/background.h b/include/background.h index d93e0b5ad..abf5224c6 100644 --- a/include/background.h +++ b/include/background.h @@ -347,6 +347,7 @@ struct background short has_NEDE; /**< presence of NEDE? */ short has_NEDE_pert; /**< presence of NEDE perturbations? */ short has_NEDE_trigger; /**< presence of NEDE trigger? */ + short has_NEDE_trigger_DM; /**< tracking trigger density? */ //@} @@ -485,6 +486,16 @@ extern "C" { double *dw_over_da, double *ca2); + int background_quantities_NEDE_trigger( + struct background *pba, + double a, + double a_prime_over_a, + double H, + double H_prime, + double *w, + double *dw_over_da, + double *ca2); + int background_varconst_of_z( struct background* pba, double z, diff --git a/include/input.h b/include/input.h index 0f1361894..c3adf7741 100644 --- a/include/input.h +++ b/include/input.h @@ -203,9 +203,9 @@ * For shooting method: definition of the possible targets */ -enum target_names {theta_s, theta_s_100, Omega_dcdmdr, omega_dcdmdr, Omega_scf, Omega_ini_dcdm, omega_ini_dcdm, z_decay_NEDE, sigma8, S8}; +enum target_names {theta_s, theta_s_100, Omega_dcdmdr, omega_dcdmdr, Omega_scf, Omega_ini_dcdm, omega_ini_dcdm, z_decay_NEDE, Omega0_NEDE_trigger_DM, NEDE_trigger_ini, sigma8, S8}; /* Important: Keep this number equal to the number of target_names (except sigma8, S8), and keep sigma8, S8 at the very end */ -#define _NUM_TARGETS_ 8 +#define _NUM_TARGETS_ 10 /* Important: add one for each new target_names */ enum computation_stage {cs_background, cs_thermodynamics, cs_perturbations, cs_primordial, cs_nonlinear, cs_transfer, cs_spectra}; diff --git a/include/precisions.h b/include/precisions.h index 70c069848..7937df759 100644 --- a/include/precisions.h +++ b/include/precisions.h @@ -596,10 +596,6 @@ class_precision_parameter(tol_sd_detector,double,1.e-5) class_string_parameter(sd_external_path,"/external/distortions","sd_external_path") -/* NEDE: Makes integration around EDE decay finer */ -class_precision_parameter(decay_res_enhancement,double,0) -class_precision_parameter(sub_dom_cond,double,0) - #undef class_precision_parameter #undef class_string_parameter #undef class_type_parameter diff --git a/source/background.c b/source/background.c index 24b0fec17..629e8528f 100644 --- a/source/background.c +++ b/source/background.c @@ -493,8 +493,37 @@ int background_functions( //printf(" a= %e, Omega_scf = %f, \n ",a, pvecback[pba->index_bg_rho_scf]/rho_tot ); } - /* New EDE trigger field */ - /*this function is called at every integration step in order to calculate scalar field related quantities like rho_trigger and so on*/ + /* NEDE */ + if (pba->has_NEDE == _TRUE_) { + double a_decay = 1./(1. + pba->z_decay); + if (a < a_decay || a_decay == 0) { + /* w=-1 phase */ + /* Note the class convention according to which 3 Mpl^2 is absorbed in rho, i.e. rho_crit = H0^2. */ + rho_NEDE_decay = pba->Omega_NEDE * pow(pba->H0, 2); + /* Save value of rho in array for later use. */ + pvecback[pba->index_bg_rho_NEDE] = rho_NEDE_decay; + pvecback[pba->index_bg_w_NEDE] = -1; + + p_tot -= rho_NEDE_decay; /* add pressure contributio n*/ + rho_tot += rho_NEDE_decay; /* add energy contribution */ + } + else { + /* NEDE decay phase with w > 0 */ + class_call(background_quantities_NEDE(pba, a, 0, &rho_NEDE_decay, NULL, &w_NEDE, &dw_over_da_NEDE, NULL), + pba->error_message, + pba->error_message); + + pvecback[pba->index_bg_rho_NEDE] = rho_NEDE_decay; + pvecback[pba->index_bg_w_NEDE] = w_NEDE; + p_tot += w_NEDE * rho_NEDE_decay; + rho_tot += rho_NEDE_decay; + + dp_dloga += (a*dw_over_da_NEDE - 3*(1 + w_NEDE)*w_NEDE)*pvecback[pba->index_bg_rho_NEDE]; + } + } + + + /* NEDE trigger field */ if (pba->has_NEDE_trigger == _TRUE_) { // if (-a_rel*0.99 <= pba->a_decay || pba->a_decay ==0 ) { phi = pvecback_B[pba->index_bi_phi_trigger]; @@ -590,35 +619,6 @@ int background_functions( rho_r += pvecback[pba->index_bg_rho_ur]; } - /* NEDE: Here we calculate bg quantities of the New EDE fluid like its energy density at every time step, we have to check if we are before or after the phase transition. */ - if (pba->has_NEDE == _TRUE_) { - double a_decay = 1./(1. + pba->z_decay); - if (a < a_decay || a_decay == 0) { - /* w=-1 phase */ - /* Note the class convention according to which 3 Mpl^2 is absorbed in rho, i.e. rho_crit = H0^2. */ - rho_NEDE_decay = pba->Omega_NEDE * pow(pba->H0, 2); - /* Save value of rho in array for later use. */ - pvecback[pba->index_bg_rho_NEDE] = rho_NEDE_decay; - pvecback[pba->index_bg_w_NEDE] = -1; - - p_tot -= rho_NEDE_decay; /* add pressure contributio n*/ - rho_tot += rho_NEDE_decay; /* add energy contribution */ - } - else { - /* NEDE decay phase with w > 0 */ - class_call(background_quantities_NEDE(pba, a, 0, &rho_NEDE_decay, NULL, &w_NEDE, &dw_over_da_NEDE, NULL), - pba->error_message, - pba->error_message); - - pvecback[pba->index_bg_rho_NEDE] = rho_NEDE_decay; - pvecback[pba->index_bg_w_NEDE] = w_NEDE; - p_tot += w_NEDE * rho_NEDE_decay; - rho_tot += rho_NEDE_decay; - - dp_dloga += (a*dw_over_da_NEDE - 3*(1 + w_NEDE)*w_NEDE)*pvecback[pba->index_bg_rho_NEDE]; - } - } - /* interacting dark radiation */ if (pba->has_idr == _TRUE_) { pvecback[pba->index_bg_rho_idr] = pba->Omega0_idr * pow(pba->H0,2) / pow(a,4); @@ -870,6 +870,34 @@ int background_quantities_NEDE( return _SUCCESS_; } +int background_quantities_NEDE_trigger( + struct background *pba, + double a, + double a_prime_over_a, + double H, + double H_prime, + double *w, + double *dw_over_da, + double *ca2) +{ + double w_prime; + double w_local = 0.; + + // We use the description proposed in arXiv:2201.10238 + + w_local = 3.0 / 2.0 * pow(H / pba->NEDE_trigger_mass, 2); + w_prime = w_local * 2 * H_prime / H; + + if (w != NULL) + *w = w_local; + if (dw_over_da != NULL) + *dw_over_da = w_prime / a / a / H; + if ((ca2 != NULL) && (a_prime_over_a != 0.)) + *ca2 = w_local - w_prime / 3. / (1. + w_local) / a_prime_over_a; + + return _SUCCESS_; +} + /** * Single place where the variation of fundamental constants is * defined. Parameters of the function are passed through the @@ -1103,7 +1131,7 @@ int background_indices( pba->has_idr = _FALSE_; pba->has_curvature = _FALSE_; pba->has_varconst = _FALSE_; - // pba->has_NEDE = _FALSE_; + pba->has_NEDE = _FALSE_; pba->has_NEDE_pert = _FALSE_; pba->has_NEDE_trigger = _FALSE_; @@ -1122,13 +1150,16 @@ int background_indices( pba->has_dr = _TRUE_; } - //if (pba->Omega_NEDE != 0.) { - if (pba->has_NEDE == _TRUE_) { - //pba->has_NEDE = _TRUE_; + if (pba->f_NEDE != 0.) { + pba->has_NEDE = _TRUE_; pba->has_NEDE_pert = _TRUE_; /* Here we decide if we include a trigger field */ - if (pba->NEDE_trigger_ini != 0.) + if (pba->NEDE_trigger_ini != 0.) { pba->has_NEDE_trigger = _TRUE_; + if (pba->Omega0_trigger != 0.) { + pba->has_NEDE_trigger_DM = _TRUE_; + } + } } if (pba->Omega0_scf != 0.) @@ -2036,12 +2067,6 @@ int background_solve( double comoving_radius=0.; /* conformal distance in Mpc (equal to comoving radius in flat case) */ double conformal_distance; - - /* Reshift interval around decay of NEDE for which the integration is made finer. */ - double delta_z; - double a; - double d; - double w_NEDE, ca2_NEDE; /* evolvers */ extern int evolver_rk(); @@ -2236,10 +2261,11 @@ int background_solve( printf(" -> Scenario A with eos NEDE: 3*w = %.2f \n", pba->three_eos_NEDE); printf(" -> Percolation trigger (H/m): %f \n", pba->Bubble_trigger_H_over_m); printf(" -> closure check: H/H0-1: %e \n", pvecback[pba->index_bg_H] / pba->H0 - 1); - printf(" -> resolution_enhancement: %e \n", ppr->decay_res_enhancement); - if (pba->has_NEDE_trigger == _TRUE_) - printf(" -> Omega_trigger = %g, Trigger_ini = %g \n", - pvecback[pba->index_bg_rho_trigger] / pvecback[pba->index_bg_rho_crit], pba->NEDE_trigger_ini); + if (pba->has_NEDE_trigger == _TRUE_) { + double rho_crit = pba->background_table[(pba->bt_size-1)*pba->bg_size+pba->index_bg_rho_crit]; + printf(" -> Omega0_trigger = %g, Trigger_ini = %g \n", + pba->background_table[(pba->bt_size-1)*pba->bg_size+pba->index_bg_rho_trigger] / rho_crit, pba->NEDE_trigger_ini); + } } if (pba->has_scf == _TRUE_) { printf(" Scalar field details:\n"); @@ -2262,6 +2288,12 @@ int background_solve( pba->Omega0_m = pba->background_table[(pba->bt_size-1)*pba->bg_size+pba->index_bg_Omega_m]; pba->Omega0_r = pba->background_table[(pba->bt_size-1)*pba->bg_size+pba->index_bg_Omega_r]; pba->Omega0_de = 1. - (pba->Omega0_m + pba->Omega0_r + pba->Omega0_k); + + if (pba->has_NEDE) { + double rho_crit = pba->background_table[(pba->bt_size-1)*pba->bg_size+pba->index_bg_rho_crit]; + pba->Omega0_NEDE = pba->background_table[(pba->bt_size-1)*pba->bg_size+pba->index_bg_rho_NEDE]/rho_crit; + pba->Omega0_trigger = pba->background_table[(pba->bt_size-1)*pba->bg_size+pba->index_bg_rho_trigger]/rho_crit; + } /* Compute the density fraction of non-free-streaming matter (in the minimal LambdaCDM model, this would be just Omega_b + Omega_cdm). This definition takes into account interating, decaying and warm dark matter, but it would need to be refined if some part of the matter component was modelled by the fluid (fld) or the scalar field (scf). */ pba->Omega0_nfsm = pba->Omega0_b; @@ -2431,8 +2463,8 @@ int background_initial_conditions( */ if (pba->has_NEDE_trigger == _TRUE_ && pba->has_NEDE == _TRUE_) { /* phi'_ini = -1/5 * phi_ini a^2 m^2 / (a H) where H = sqrt(rho) ins class conventions. */ - pvecback_integration[pba->index_bi_phi_trigger] = pba->phi_ini_trigger; - pvecback_integration[pba->index_bi_phi_prime_trigger] = -1./5.*pba->phi_ini_trigger*pow(pba->NEDE_trigger_mass, 2)/pow(rho_rad, 0.5)*a; + pvecback_integration[pba->index_bi_phi_trigger] = pba->NEDE_trigger_ini; + pvecback_integration[pba->index_bi_phi_prime_trigger] = -1./5.*pba->NEDE_trigger_ini*pow(pba->NEDE_trigger_mass, 2)/pow(rho_rad, 0.5)*a; // printf("initial value: %e; \n",pvecback_integration[pba->index_bi_phi_prime_scf]); } @@ -2646,6 +2678,9 @@ int background_output_titles( class_store_columntitle(titles, "(.)p_prime_trigger", pba->has_NEDE_trigger); class_store_columntitle(titles, "phi_trigger", pba->has_NEDE_trigger); class_store_columntitle(titles, "phi'_trigger", pba->has_NEDE_trigger); + class_store_columntitle(titles, "V_trigger", pba->has_NEDE_trigger) + class_store_columntitle(titles, "dV_trigger", pba->has_NEDE_trigger) + class_store_columntitle(titles, "ddV_trigger", pba->has_NEDE_trigger) class_store_columntitle(titles,"(.)rho_scf",pba->has_scf); class_store_columntitle(titles,"(.)p_scf",pba->has_scf); @@ -2727,6 +2762,9 @@ int background_output_data( class_store_double(dataptr, pvecback[pba->index_bg_p_prime_trigger], pba->has_NEDE_trigger, storeidx); class_store_double(dataptr, pvecback[pba->index_bg_phi_trigger], pba->has_NEDE_trigger, storeidx); class_store_double(dataptr, pvecback[pba->index_bg_phi_prime_trigger], pba->has_NEDE_trigger, storeidx); + class_store_double(dataptr, pvecback[pba->index_bg_V_trigger], pba->has_NEDE_trigger, storeidx); + class_store_double(dataptr, pvecback[pba->index_bg_dV_trigger], pba->has_NEDE_trigger, storeidx); + class_store_double(dataptr, pvecback[pba->index_bg_ddV_trigger], pba->has_NEDE_trigger, storeidx); class_store_double(dataptr,pvecback[pba->index_bg_rho_scf],pba->has_scf,storeidx); class_store_double(dataptr,pvecback[pba->index_bg_p_scf],pba->has_scf,storeidx); @@ -2858,11 +2896,11 @@ int background_derivs( dy[pba->index_bi_phi_prime_scf] = - 2*y[pba->index_bi_phi_prime_scf] - a*dV_scf(pba,y[pba->index_bi_phi_scf])/H ; } - if (pba->has_NEDE_trigger == _TRUE_) - { + if (pba->has_NEDE_trigger == _TRUE_) { /** - Scalar field equation: \f$ \phi'' + 2 a H \phi' + a^2 dV = 0 \f$ (note H is wrt cosmic time) */ - dy[pba->index_bi_phi_trigger] = y[pba->index_bi_phi_prime_trigger]; - dy[pba->index_bi_phi_prime_trigger] = -a*(2.*pvecback[pba->index_bg_H]*y[pba->index_bi_phi_prime_trigger] + a*dV_trigger(pba, y[pba->index_bi_phi_trigger])); + /** Here transformed to derivatives wrt. loga through d/dloga = 1/(aH)*d/deta, with eta conformal time */ + dy[pba->index_bi_phi_trigger] = y[pba->index_bi_phi_prime_trigger]/a/H; + dy[pba->index_bi_phi_prime_trigger] = -2*y[pba->index_bi_phi_prime_trigger] - a*dV_trigger(pba, y[pba->index_bi_phi_trigger])/H; } return _SUCCESS_; @@ -3061,12 +3099,15 @@ int background_output_budget( class_print_species("Spatial Curvature",k); budget_other+=pba->Omega0_k; } - if (pba->has_NEDE) - { + if (pba->has_NEDE) { class_print_species("New EDE", NEDE); budget_other += pba->Omega0_NEDE; } - + if (pba->has_NEDE_trigger) { + class_print_species("New EDE trigger", trigger); + budget_other += pba->Omega0_trigger; + } + printf(" ---> Total budgets \n"); printf(" Radiation Omega = %-15g , omega = %-15g \n",budget_radiation,budget_radiation*pba->h*pba->h); printf(" Non-relativistic Omega = %-15g , omega = %-15g \n",budget_matter,budget_matter*pba->h*pba->h); diff --git a/source/input.c b/source/input.c index d3b8df504..4b80fcb30 100644 --- a/source/input.c +++ b/source/input.c @@ -528,7 +528,9 @@ int input_shooting(struct file_content * pfc, "Omega_scf", "Omega_ini_dcdm", "omega_ini_dcdm", - "z_decay_NEDE"}; + "z_decay_NEDE", + "Omega0_NEDE_trigger_DM", + "NEDE_trigger_ini"}; /* array of corresponding parameters that must be adjusted in order to meet the target (= unknown parameters) */ char * const unknown_namestrings[] = {"h", /* unknown param for target '100*theta_s' */ @@ -538,7 +540,9 @@ int input_shooting(struct file_content * pfc, "scf_shooting_parameter", /* unknown param for target 'Omega_scf' */ "Omega_dcdmdr", /* unknown param for target 'Omega_ini_dcdm' */ "omega_dcdmdr", /* unknown param for target 'omega_ini_dcdm' */ - "NEDE_trigger_mass"}; /* unknown param for target 'z_decay_NEDE' */ + "NEDE_trigger_mass", /* unknown param for target 'z_decay_NEDE' */ + "NEDE_trigger_ini", /* unknown param for target 'Omega0_NEDE_trigger_DM' */ + "Omega0_NEDE_trigger_DM"}; /* unknown param for target 'NEDE_trigger_ini' */ /* for each target, module up to which we need to run CLASS in order to compute the targetted quantities (not running the whole code @@ -550,7 +554,9 @@ int input_shooting(struct file_content * pfc, cs_background, /* computation stage for target 'Omega_scf' */ cs_background, /* computation stage for target 'Omega_ini_dcdm' */ cs_background, /* computation stage for target 'omega_ini_dcdm' */ - cs_background}; /* computation stage for target 'z_decay_NEDE' */ + cs_background, /* computation stage for target 'z_decay_NEDE' */ + cs_background, /* computation stage for target 'Omega0_NEDE_trigger_DM' */ + cs_background}; /* computation stage for target 'NEDE_trigger_ini' */ struct fzerofun_workspace fzw; @@ -560,8 +566,7 @@ int input_shooting(struct file_content * pfc, unknown_parameters_size = 0; fzw.required_computation_stage = 0; for (index_target = 0; index_target < _NUM_TARGETS_; index_target++){ - if (index_target == 7) { - int a = 0;} + class_call(parser_read_double(pfc,target_namestrings[index_target],¶m1,&flag1,errmsg), errmsg, errmsg); @@ -1288,12 +1293,35 @@ int input_get_guess(double *xguess, dxdy[index_guess] = 2.43e-9/0.891; break; case z_decay_NEDE: { + // Need to guess NEDE_trigger_mass double Omega_M = ba.Omega0_cdm + ba.Omega0_b + ba.Omega0_ncdm_tot; double z_NEDE = pfzw->target_value[index_guess]; double trigger_mass = 0.5 * ba.H0 / ba.Bubble_trigger_H_over_m * pow(1. / (1. - ba.f_NEDE), 0.5) * pow(Omega_M * pow((1. + z_NEDE), 3) + Omega_M * pow((1. + z_NEDE), 4) / (3001.) + (1. - Omega_M), 0.5); xguess[index_guess] = 0.5 * ba.H0 / ba.Bubble_trigger_H_over_m * pow(1. / (1. - ba.f_NEDE), 0.5) * pow(Omega_M * pow((1. + pfzw->target_value[index_guess]), 3) + Omega_M * pow((1. + pfzw->target_value[index_guess]), 4) / (3001.) + (1. - Omega_M), 0.5); dxdy[index_guess] = 0.5 * trigger_mass * (3. * Omega_M * pow((1. + z_NEDE), 2) + 4. * Omega_M * pow((1. + z_NEDE), 3) / (3001.)) / (Omega_M * pow((1. + z_NEDE), 3) + Omega_M * pow((1. + z_NEDE), 4) / (3001.) + (1. - Omega_M)); + break; + } + case Omega0_NEDE_trigger_DM: { + // Need to guess NEDE_trigger_ini + double Omega_M = ba.Omega0_cdm + ba.Omega0_b + ba.Omega0_ncdm_tot; + double z_NEDE = ba.z_decay; + double trigger_mass = 0.5 * ba.H0 / ba.Bubble_trigger_H_over_m * pow(1. / (1. - ba.f_NEDE), 0.5) * pow(Omega_M * pow((1. + z_NEDE), 3) + Omega_M * pow((1. + z_NEDE), 4) / (3001.) + (1. - Omega_M), 0.5); + + xguess[index_guess] = pow(75. * ba.H0 * ba.H0 * pfzw->target_value[index_guess] * pow(z_NEDE, 3) / pow(trigger_mass, 2), 0.5); + dxdy[index_guess] = 0.5 * xguess[index_guess] / pfzw->target_value[index_guess]; + break; + } + case NEDE_trigger_ini: { + // Need to guess Omega0_NEDE_trigger_DM + // Inversion the guess above + double Omega_M = ba.Omega0_cdm + ba.Omega0_b + ba.Omega0_ncdm_tot; + double z_NEDE = ba.z_decay; + double trigger_mass = 0.5 * ba.H0 / ba.Bubble_trigger_H_over_m * pow(1. / (1. - ba.f_NEDE), 0.5) * pow(Omega_M * pow((1. + z_NEDE), 3) + Omega_M * pow((1. + z_NEDE), 4) / (3001.) + (1. - Omega_M), 0.5); + + xguess[index_guess] = pow(pfzw->target_value[index_guess]*trigger_mass/ba.H0, 2.)/(75.*pow(z_NEDE, 3.)); + dxdy[index_guess] = 2.*pfzw->target_value[index_guess]*pow(trigger_mass/ba.H0, 2.)/(75.*pow(z_NEDE, 3.)); // derivative of xguess + break; } } } @@ -1507,18 +1535,6 @@ int input_try_unknown_parameters(double * unknown_parameter, output[i] = fo.sigma8[fo.index_pk_m]*sqrt(ba.Omega0_m/0.3); break; case z_decay_NEDE: { - /*NOTE TO SELF: COMPUTE ACTUAL z_DECAY FROM ba HERE. USE THE TRICK FROM CLASS_EDE! - ALSO NOTE TO SELF: CODE THE NEDE DYNAMCIS IN BG FUNCTIONS INSTEAD OF BG SOLVE. - NEDE DYNAMICS NEED TO BE ACTIVATED THER. - SHOULD ALSO CHECK IF TRIGGER DYNAMICS NEED EXPLICIT IMPLEMENTATION THERE. - - - To find the z value at decay: - Find the z at which H(z) < m_trigger*Bubble_trigger_HoverM - - - */ - double z_decay = 0.; double H_decay = ba.NEDE_trigger_mass*ba.Bubble_trigger_H_over_m; for (int index_tau = 1; index_tau < ba.bt_size - 1; ++index_tau) { @@ -1541,6 +1557,21 @@ int input_try_unknown_parameters(double * unknown_parameter, } break; } + case Omega0_NEDE_trigger_DM: { + output[i] = ba.Omega0_trigger - pfzw->target_value[i]; + if (input_verbose > 1) { + printf("Omega0_NEDE_trigger_DM=%f, target=%f\n", ba.Omega0_trigger, pfzw->target_value[i]); + } + break; + } + case NEDE_trigger_ini: { + double Omega0_trigger_today = ba.background_table[(ba.bt_size-1)*ba.bg_size+ba.index_bg_rho_trigger]/ba.H0/ba.H0; + output[i] = ba.Omega0_trigger - Omega0_trigger_today; + if (input_verbose > 1) { + printf("NEDE_trigger_ini=%f, target=%f\n", ba.NEDE_trigger_ini, pfzw->target_value[i]); + } + break; + } } } @@ -3181,17 +3212,17 @@ int input_read_parameters_species(struct file_content * pfc, } /** 7.3) New Early Dark Energy */ - pba->has_NEDE = _FALSE_; class_read_double("f_NEDE", pba->f_NEDE); - class_read_double("z_decay_NEDE", pba->z_decay); - class_read_double("NEDE_trigger_mass", pba->NEDE_trigger_mass); + class_read_double("z_decay_NEDE", pba->z_decay); /* Related by shooting */ + class_read_double("NEDE_trigger_mass", pba->NEDE_trigger_mass); /* */ class_read_double("three_eos_NEDE", pba->three_eos_NEDE); class_read_double("three_ceff2_NEDE", ppt->three_ceff2_NEDE); class_read_double("three_cvis2_NEDE", ppt->three_cvis2_NEDE); class_read_double("H_over_m_NEDE", pba->Bubble_trigger_H_over_m); - class_read_double("NEDE_trigger_ini", pba->NEDE_trigger_ini); class_read_double("Junction_tag", pba->Junction_tag); class_read_double("Omega0_NEDE", pba->Omega0_NEDE); // Omega today, is only used internally, when finding a better fit for z_decay. + class_read_double("NEDE_trigger_ini", pba->NEDE_trigger_ini); /* Related by shooting */ + class_read_double("Omega0_NEDE_trigger_DM", pba->Omega0_trigger); /* */ /* NEDE: Here we decide whether NEDE decays according to scenario A or B. Default: Scneario A*/ @@ -3229,30 +3260,27 @@ int input_read_parameters_species(struct file_content * pfc, } if ((pba->Omega_NEDE > 0) || (pba->f_NEDE > 0)) { - class_test(pba->z_decay == 0, errmsg, - "In input file, z_decay_NEDE needs to be specified for NEDE (The trigger mass as input parameter has been retired in v5)."); - - pba->has_NEDE = _TRUE_; - if (pba->Omega_NEDE == 0) pba->Omega_NEDE = pba->f_NEDE * pow(pba->NEDE_trigger_mass * pba->Bubble_trigger_H_over_m / pba->H0, 2); else if (pba->f_NEDE == 0) pba->f_NEDE = pba->Omega_NEDE / pow(pba->NEDE_trigger_mass * pba->Bubble_trigger_H_over_m / pba->H0, 2); - - if (pba->NEDE_trigger_ini != 0) - { - pba->phi_ini_trigger = pba->NEDE_trigger_ini; - pba->phi_prime_ini_trigger = 0; // This value is set to the attractor later. - } + + class_test(pba->z_decay == 0, errmsg, + "In input file, z_decay_NEDE needs to be specified for NEDE (The trigger mass as input parameter has been retired in v5)."); class_test(pba->f_NEDE > 0.4, errmsg, "Choose a smaller amount of NEDE as the code has not been tested for f_NEDE > 0.4."); + + class_test(pba->NEDE_trigger_ini < 0., errmsg, + "NEDE trigger field cannot run with negative initial value."); + + class_test(((pba->NEDE_trigger_ini == 0.) && (pba->Omega0_trigger == 0.)), errmsg, + "You must input either 'NEDE_trigger_ini' or 'Omega0_NEDE_trigger_DM' to set the trigger density.") + + pba->phi_prime_ini_trigger = 0; // This value is set to the attractor later. if (pba->NEDE_fld_nature == NEDE_fld_A) pba->Omega0_NEDE = pba->Omega_NEDE * pow(1. / (1. + pba->z_decay), (3. + pba->three_eos_NEDE)); - - /*printf("h: %f, omega_b: %f, omega_cdm: %f, ns: %f, ln10^10As: %f, tau: %f, mass: %f \n", pba->h, pba->Omega0_b * pba->h * pba->h, - pba->Omega0_cdm * pba->h * pba->h, ppm->n_s, log(ppm->A_s / 1.e-10), pth->tau_reio);*/ } @@ -3334,6 +3362,12 @@ int input_read_parameters_species(struct file_content * pfc, Omega_tot += pba->Omega0_dcdmdr; Omega_tot += pba->Omega0_idr; Omega_tot += pba->Omega0_ncdm_tot; + + /* NEDE budget, both zero if no NEDE */ + Omega_tot += pba->Omega0_NEDE; + Omega_tot += pba->Omega0_trigger; + printf("Omega0_NEDE=%g, Omega0_NEDE_trigger_DM=%g\n", pba->Omega0_NEDE, pba->Omega0_trigger); + /* Step 1 */ if (flag1 == _TRUE_){ pba->Omega0_lambda = param1; @@ -3369,10 +3403,6 @@ int input_read_parameters_species(struct file_content * pfc, printf(" -> matched budget equations by adjusting Omega_scf = %g\n",pba->Omega0_scf); } } - - /* NEDE budget, both zero if no NEDE */ - Omega_tot += pba->Omega0_NEDE; - Omega_tot += pba->Omega0_trigger; /* ** END OF BUDGET EQUATION ** */ @@ -5945,10 +5975,10 @@ int input_default_params(struct background *pba, pba->Omega_NEDE = 0.; pba->f_NEDE = 0; pba->Omega0_NEDE = 0.; - pba->Omega0_trigger = 0.; pba->decay_flag = _FALSE_; // Initially the decay has not yet taken place. pba->Junction_tag = 1; // Default: standard junction condition inferred from matching. - pba->NEDE_trigger_ini = 0.001; + pba->NEDE_trigger_ini = 0.; + pba->Omega0_trigger = 0.; // Default value pba->Bubble_trigger_H_over_m = .2; // Default value ionferred from miscroscpic model. pba->NEDE_trigger_mass = 0.; From fefcc9aaf368f184351465d64a3717333983abf3 Mon Sep 17 00:00:00 2001 From: EBHolm Date: Tue, 31 Oct 2023 22:40:11 +0100 Subject: [PATCH 11/59] Implemented trigger fluid approx, but bugs shootin --- source/background.c | 141 +++++++++++++++++++++++++++++++++++--------- source/input.c | 2 + 2 files changed, 115 insertions(+), 28 deletions(-) diff --git a/source/background.c b/source/background.c index 629e8528f..a367f5d29 100644 --- a/source/background.c +++ b/source/background.c @@ -525,23 +525,46 @@ int background_functions( /* NEDE trigger field */ if (pba->has_NEDE_trigger == _TRUE_) { - // if (-a_rel*0.99 <= pba->a_decay || pba->a_decay ==0 ) { - phi = pvecback_B[pba->index_bi_phi_trigger]; - phi_prime = pvecback_B[pba->index_bi_phi_prime_trigger]; - pvecback[pba->index_bg_phi_trigger] = phi; // value of the trigger field phi - pvecback[pba->index_bg_phi_prime_trigger] = phi_prime; // value of the trigger field derivative wrt conformal time - pvecback[pba->index_bg_V_trigger] = V_trigger(pba, phi); // V_scf(pba,phi); //write here potential as function of phi - pvecback[pba->index_bg_dV_trigger] = dV_trigger(pba, phi); // dV_scf(pba,phi); //potential' as function of phi - pvecback[pba->index_bg_ddV_trigger] = ddV_trigger(pba, phi); // ddV_scf(pba,phi); //potential'' as function of phi - pvecback[pba->index_bg_rho_trigger] = (phi_prime*phi_prime/(2*a*a) + V_trigger(pba, phi))/3.; // energy of the trigger field. The field units are set automatically by setting the initial conditions - pvecback[pba->index_bg_p_trigger] = (phi_prime*phi_prime/(2*a*a) - V_trigger(pba, phi))/3.; // pressure of the trigger field - rho_tot += pvecback[pba->index_bg_rho_trigger]; - p_tot += pvecback[pba->index_bg_p_trigger]; - dp_dloga += 0.0; /** <-- This depends on a_prime_over_a, so we cannot add it now! */ - // divide relativistic & nonrelativistic (not very meaningful for oscillatory models) - rho_r += 3.*pvecback[pba->index_bg_p_trigger]; // field pressure contributes radiation - rho_m += pvecback[pba->index_bg_rho_trigger] - 3.*pvecback[pba->index_bg_p_trigger]; // the rest contributes matter - // printf(" a= %e, Omega_scf = %f, \n ",a_rel, pvecback[pba->index_bg_rho_scf]/rho_tot ); + if (a < pba->a_trigger_fluid) { + // This part is relevant before the fluid approximation is turned on. + phi = pvecback_B[pba->index_bi_phi_trigger]; + phi_prime = pvecback_B[pba->index_bi_phi_prime_trigger]; + pvecback[pba->index_bg_phi_trigger] = phi; // value of the trigger field phi + pvecback[pba->index_bg_phi_prime_trigger] = phi_prime; // value of the trigger field derivative wrt conformal time + pvecback[pba->index_bg_V_trigger] = V_trigger(pba, phi); // V_scf(pba,phi); //write here potential as function of phi + pvecback[pba->index_bg_dV_trigger] = dV_trigger(pba, phi); // dV_scf(pba,phi); //potential' as function of phi + pvecback[pba->index_bg_ddV_trigger] = ddV_trigger(pba, phi); // ddV_scf(pba,phi); //potential'' as function of phi + pvecback[pba->index_bg_rho_trigger] = (phi_prime*phi_prime/(2*a*a) + V_trigger(pba, phi))/3.; // energy of the trigger field. The field units are set automatically by setting the initial conditions + pvecback[pba->index_bg_p_trigger] = (phi_prime*phi_prime/(2*a*a) - V_trigger(pba, phi))/3.; // pressure of the trigger field + rho_tot += pvecback[pba->index_bg_rho_trigger]; + p_tot += pvecback[pba->index_bg_p_trigger]; + dp_dloga += 0.0; /** <-- This depends on a_prime_over_a, so we cannot add it now! */ + + // divide relativistic & nonrelativistic (not very meaningful for oscillatory models) + rho_r += 3.*pvecback[pba->index_bg_p_trigger]; // field pressure contributes radiation + rho_m += pvecback[pba->index_bg_rho_trigger] - 3.*pvecback[pba->index_bg_p_trigger]; // the rest contributes matter + } + else { + // This part is relevant after the fluid approximation has been turned on. + // We still fill the phi array with trivial values. + phi = pvecback_B[pba->index_bi_phi_trigger]; + phi_prime = pvecback_B[pba->index_bi_phi_prime_trigger]; + pvecback[pba->index_bg_phi_trigger] = phi; // value of the trigger field phi + pvecback[pba->index_bg_phi_prime_trigger] = phi_prime; // value of the trigger field derivative wrt conformal time + pvecback[pba->index_bg_V_trigger] = V_trigger(pba, phi); // V_scf(pba,phi); //write here potential as function of phi + pvecback[pba->index_bg_dV_trigger] = dV_trigger(pba, phi); // dV_scf(pba,phi); //potential' as function of phi + pvecback[pba->index_bg_ddV_trigger] = ddV_trigger(pba, phi); // ddV_scf(pba,phi); //potential'' as function of phi + + // Here we copy the fluid energy density from the integration vector and add it to rho_tot. + pvecback[pba->index_bg_rho_trigger] = pvecback_B[pba->index_bi_rho_trigger]; + + // And add it to the total energy density. + rho_tot += pvecback[pba->index_bg_rho_trigger]; + + // Everything else is added later after we have calculated H and H_prime below. + dp_dloga += 0.0; + p_tot += 0.0; + } } /* ncdm */ @@ -626,6 +649,25 @@ int background_functions( p_tot += (1./3.) * pvecback[pba->index_bg_rho_idr]; rho_r += pvecback[pba->index_bg_rho_idr]; } + + if (pba->has_NEDE_trigger == _TRUE_) { + // NEDE: Here we calculate the pressure contribution of the Trigger field when we are in the fluid approximation. + if (a >= pba->a_trigger_fluid) { + double w_trigger; + class_call(background_quantities_NEDE_trigger(pba, a, a*pvecback[pba->index_bg_H], pvecback[pba->index_bg_H], 0, &w_trigger, NULL, NULL), + pba->error_message, + pba->error_message); + + pvecback[pba->index_bg_p_trigger] = w_trigger * pvecback[pba->index_bg_rho_trigger]; // pressure of the trigger field + p_tot += pvecback[pba->index_bg_p_trigger]; + + dp_dloga += 0.0; // Add later after we have H_prime //(a * dw_over_da_trigger - 3 * (1 + w_trigger) * w_fld) * pvecback[pba->index_bg_rho_fld]; + + // divide relativistic & nonrelativistic (not very meaningful for oscillatory models) + rho_r += 3. * pvecback[pba->index_bg_p_trigger]; // field pressure contributes radiation + rho_m += pvecback[pba->index_bg_rho_trigger] - 3. * pvecback[pba->index_bg_p_trigger]; // the rest contributes matter + } + } /** - compute expansion rate H from Friedmann equation: this is the only place where the Friedmann equation is assumed. Remember @@ -653,8 +695,20 @@ int background_functions( if (pba->has_NEDE_trigger == _TRUE_) { /** The contribution of the trigger field was not added to dp_dloga, add p_scf_prime here: */ - pvecback[pba->index_bg_p_prime_trigger] = pvecback[pba->index_bg_phi_prime_trigger]*(-pvecback[pba->index_bg_phi_prime_trigger]*pvecback[pba->index_bg_H]/a - 2./3.*pvecback[pba->index_bg_dV_trigger]); - pvecback[pba->index_bg_p_tot_prime] += pvecback[pba->index_bg_p_prime_trigger]; + if (a < pba->a_trigger_fluid) { + pvecback[pba->index_bg_p_prime_trigger] = pvecback[pba->index_bg_phi_prime_trigger]*(-pvecback[pba->index_bg_phi_prime_trigger]*pvecback[pba->index_bg_H]/a - 2./3.*pvecback[pba->index_bg_dV_trigger]); + pvecback[pba->index_bg_p_tot_prime] += pvecback[pba->index_bg_p_prime_trigger]; + } + else { + // Similarly in the fluid case. + double w_trigger, dw_over_da_trigger; + class_call(background_quantities_NEDE_trigger(pba, a, a*pvecback[pba->index_bg_H], pvecback[pba->index_bg_H], pvecback[pba->index_bg_H_prime], &w_trigger, &dw_over_da_trigger, NULL), + pba->error_message, + pba->error_message); + + double dp_dloga_trigger = (a*dw_over_da_trigger - 3.*(1. + w_trigger)*w_trigger)*pvecback[pba->index_bg_rho_trigger]; + pvecback[pba->index_bg_p_tot_prime] += a*pvecback[pba->index_bg_H]*dp_dloga_trigger; + } } /** - compute critical density */ @@ -1152,14 +1206,8 @@ int background_indices( if (pba->f_NEDE != 0.) { pba->has_NEDE = _TRUE_; + pba->has_NEDE_trigger = _TRUE_; pba->has_NEDE_pert = _TRUE_; - /* Here we decide if we include a trigger field */ - if (pba->NEDE_trigger_ini != 0.) { - pba->has_NEDE_trigger = _TRUE_; - if (pba->Omega0_trigger != 0.) { - pba->has_NEDE_trigger_DM = _TRUE_; - } - } } if (pba->Omega0_scf != 0.) @@ -1363,6 +1411,7 @@ int background_indices( */ class_define_index(pba->index_bi_phi_trigger, pba->has_NEDE_trigger, index_bi, 1); class_define_index(pba->index_bi_phi_prime_trigger, pba->has_NEDE_trigger, index_bi, 1); + class_define_index(pba->index_bi_rho_trigger, pba->has_NEDE_trigger, index_bi, 1); /* -> end of indices in the vector of variables to integrate */ pba->bi_size = index_bi; @@ -2465,6 +2514,7 @@ int background_initial_conditions( /* phi'_ini = -1/5 * phi_ini a^2 m^2 / (a H) where H = sqrt(rho) ins class conventions. */ pvecback_integration[pba->index_bi_phi_trigger] = pba->NEDE_trigger_ini; pvecback_integration[pba->index_bi_phi_prime_trigger] = -1./5.*pba->NEDE_trigger_ini*pow(pba->NEDE_trigger_mass, 2)/pow(rho_rad, 0.5)*a; + pvecback_integration[pba->index_bi_rho_trigger] = 0.0; // printf("initial value: %e; \n",pvecback_integration[pba->index_bi_phi_prime_scf]); } @@ -2897,10 +2947,45 @@ int background_derivs( } if (pba->has_NEDE_trigger == _TRUE_) { + if ((H < pba->trigger_fluid_H_over_m*pba->NEDE_trigger_mass) && (pba->a_trigger_fluid == 1.)) { + // Turn on trigger fluid approximation + pba->a_trigger_fluid = a; + + /* Here we implement the matching between the fluid and field description proposed in arXiv:2201.10238. We use Eq.8, Eq. 6 and Eq. 13 */ + double phi_fluid = y[pba->index_bi_phi_trigger]; + double phi_prime_fluid = y[pba->index_bi_phi_prime_trigger]; + + double factor = 6.*pow(pvecback[pba->index_bg_H], 2)/(9.*pow(pvecback[pba->index_bg_H], 4) - 4.*(4.*pow(pvecback[pba->index_bg_H], 2)* pow(pba->NEDE_trigger_mass, 2) + pow(pvecback[pba->index_bg_H_prime], 2) / pow(a, 2))); + double phi_c_p = factor*(4.*pvecback[pba->index_bg_H]*pba->NEDE_trigger_mass*phi_fluid + 3.*pow(pvecback[pba->index_bg_H], 2)*phi_prime_fluid/a/pba->NEDE_trigger_mass + 2.*pvecback[pba->index_bg_H_prime]*phi_prime_fluid/pow(a, 2)/pba->NEDE_trigger_mass); + double phi_s_p = factor*(3.*pow(pvecback[pba->index_bg_H], 2)*phi_fluid - 2.*pvecback[pba->index_bg_H_prime]/a*phi_fluid + 4.*pvecback[pba->index_bg_H]*phi_prime_fluid/a); + double phi_c = phi_fluid; + double phi_s = phi_prime_fluid/a/pba->NEDE_trigger_mass - phi_c_p; + + double rho_tfa = 0.5*pow(pba->NEDE_trigger_mass, 2)*(phi_c*phi_c + phi_s*phi_s + 0.5*(phi_c_p*phi_c_p + phi_s_p*phi_s_p) - phi_c*phi_s_p + phi_s*phi_c_p); + rho_tfa /= 3.; // CLASS convention! + + y[pba->index_bi_rho_trigger] = rho_tfa; + + if (pba->background_verbose > 1) { + printf("Turned on NEDE fluid approximation at a=%g\n", a); + } + } + + dy[pba->index_bi_phi_trigger] = 0.; + dy[pba->index_bi_phi_prime_trigger] = 0.; + dy[pba->index_bi_rho_trigger] = 0.; + /** - Scalar field equation: \f$ \phi'' + 2 a H \phi' + a^2 dV = 0 \f$ (note H is wrt cosmic time) */ /** Here transformed to derivatives wrt. loga through d/dloga = 1/(aH)*d/deta, with eta conformal time */ - dy[pba->index_bi_phi_trigger] = y[pba->index_bi_phi_prime_trigger]/a/H; - dy[pba->index_bi_phi_prime_trigger] = -2*y[pba->index_bi_phi_prime_trigger] - a*dV_trigger(pba, y[pba->index_bi_phi_trigger])/H; + if (a < pba->a_trigger_fluid) { + dy[pba->index_bi_phi_trigger] = y[pba->index_bi_phi_prime_trigger]/a/H; + dy[pba->index_bi_phi_prime_trigger] = -2*y[pba->index_bi_phi_prime_trigger] - a*dV_trigger(pba, y[pba->index_bi_phi_trigger])/H; + } + else { + double w_trigger, dw_over_da_trigger; + class_call(background_quantities_NEDE_trigger(pba, a, a*H, H, pvecback[pba->index_bg_H_prime], &w_trigger, &dw_over_da_trigger, NULL), pba->error_message, pba->error_message); + dy[pba->index_bi_rho_trigger] = -3.*(1. + w_trigger)*y[pba->index_bi_rho_trigger]; + } } return _SUCCESS_; diff --git a/source/input.c b/source/input.c index 4b80fcb30..0a7ba3560 100644 --- a/source/input.c +++ b/source/input.c @@ -5979,6 +5979,8 @@ int input_default_params(struct background *pba, pba->Junction_tag = 1; // Default: standard junction condition inferred from matching. pba->NEDE_trigger_ini = 0.; pba->Omega0_trigger = 0.; // Default value + pba->trigger_fluid_H_over_m = 0.2; /* Trigger fluid threshold */ + pba->a_trigger_fluid = 1.; /* True iff trigger field fluid approximation is turned on */ pba->Bubble_trigger_H_over_m = .2; // Default value ionferred from miscroscpic model. pba->NEDE_trigger_mass = 0.; From de7396ad9873e9783f973d9f85451cb183255522 Mon Sep 17 00:00:00 2001 From: EBHolm Date: Tue, 31 Oct 2023 22:41:54 +0100 Subject: [PATCH 12/59] Default is now no trigger fluid approx --- source/input.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/input.c b/source/input.c index 0a7ba3560..61a9e596c 100644 --- a/source/input.c +++ b/source/input.c @@ -5979,7 +5979,7 @@ int input_default_params(struct background *pba, pba->Junction_tag = 1; // Default: standard junction condition inferred from matching. pba->NEDE_trigger_ini = 0.; pba->Omega0_trigger = 0.; // Default value - pba->trigger_fluid_H_over_m = 0.2; /* Trigger fluid threshold */ + pba->trigger_fluid_H_over_m = 0.; /* Trigger fluid threshold. Default: Never turn on */ pba->a_trigger_fluid = 1.; /* True iff trigger field fluid approximation is turned on */ pba->Bubble_trigger_H_over_m = .2; // Default value ionferred from miscroscpic model. From fee5fbb77121be448452e4c6e99ef6da1b129685 Mon Sep 17 00:00:00 2001 From: EBHolm Date: Tue, 31 Oct 2023 22:49:34 +0100 Subject: [PATCH 13/59] Forgot .h in fluid approximation --- include/background.h | 4 ++++ source/input.c | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/include/background.h b/include/background.h index abf5224c6..0a3356455 100644 --- a/include/background.h +++ b/include/background.h @@ -105,6 +105,9 @@ struct background double three_eos_NEDE; /* NEDE e.o.s. (scenario A) */ short decay_flag; /* NEDE decay flag; True iff NEDE has decayed */ + double trigger_fluid_H_over_m; /* NEDE trigger fluid approximation threshold */ + double a_trigger_fluid; /* Scale factor when trigger fluid approximation is turned on */ + /* NEDE decay time */ double tau_decay; double a_decay; @@ -309,6 +312,7 @@ struct background int index_bi_phi_trigger; /**< {B} NEDE trigger scalar field value */ int index_bi_phi_prime_trigger; /**< {B} NEDE trigger scalar field derivative wrt conformal time */ + int index_bi_rho_trigger; /**< {B} NEDE trigger energy density */ int index_bi_time; /**< {C} proper (cosmological) time in Mpc */ int index_bi_rs; /**< {C} sound horizon */ diff --git a/source/input.c b/source/input.c index 61a9e596c..7477cac17 100644 --- a/source/input.c +++ b/source/input.c @@ -1314,7 +1314,7 @@ int input_get_guess(double *xguess, } case NEDE_trigger_ini: { // Need to guess Omega0_NEDE_trigger_DM - // Inversion the guess above + // Inversion of the guess above double Omega_M = ba.Omega0_cdm + ba.Omega0_b + ba.Omega0_ncdm_tot; double z_NEDE = ba.z_decay; double trigger_mass = 0.5 * ba.H0 / ba.Bubble_trigger_H_over_m * pow(1. / (1. - ba.f_NEDE), 0.5) * pow(Omega_M * pow((1. + z_NEDE), 3) + Omega_M * pow((1. + z_NEDE), 4) / (3001.) + (1. - Omega_M), 0.5); From 12807a3650c26e0222997f16feec51bde0437b38 Mon Sep 17 00:00:00 2001 From: EBHolm Date: Tue, 31 Oct 2023 22:55:25 +0100 Subject: [PATCH 14/59] Recovered no-fluid as default --- source/background.c | 2 +- source/input.c | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/source/background.c b/source/background.c index a367f5d29..4ceda1202 100644 --- a/source/background.c +++ b/source/background.c @@ -2947,7 +2947,7 @@ int background_derivs( } if (pba->has_NEDE_trigger == _TRUE_) { - if ((H < pba->trigger_fluid_H_over_m*pba->NEDE_trigger_mass) && (pba->a_trigger_fluid == 1.)) { + if ((H < pba->trigger_fluid_H_over_m*pba->NEDE_trigger_mass) && (pba->a_trigger_fluid == 100.)) { // Turn on trigger fluid approximation pba->a_trigger_fluid = a; diff --git a/source/input.c b/source/input.c index 7477cac17..9b0e0f7ca 100644 --- a/source/input.c +++ b/source/input.c @@ -3277,6 +3277,8 @@ int input_read_parameters_species(struct file_content * pfc, class_test(((pba->NEDE_trigger_ini == 0.) && (pba->Omega0_trigger == 0.)), errmsg, "You must input either 'NEDE_trigger_ini' or 'Omega0_NEDE_trigger_DM' to set the trigger density.") + class_read_double("NEDE_trigger_fluid_H_m", pba->trigger_fluid_H_over_m); + pba->phi_prime_ini_trigger = 0; // This value is set to the attractor later. if (pba->NEDE_fld_nature == NEDE_fld_A) @@ -5980,7 +5982,7 @@ int input_default_params(struct background *pba, pba->NEDE_trigger_ini = 0.; pba->Omega0_trigger = 0.; // Default value pba->trigger_fluid_H_over_m = 0.; /* Trigger fluid threshold. Default: Never turn on */ - pba->a_trigger_fluid = 1.; /* True iff trigger field fluid approximation is turned on */ + pba->a_trigger_fluid = 100.; /* True iff trigger field fluid approximation is turned on; default is never on */ pba->Bubble_trigger_H_over_m = .2; // Default value ionferred from miscroscpic model. pba->NEDE_trigger_mass = 0.; From d432a5e38667fe98f35838662ff7790053c6847a Mon Sep 17 00:00:00 2001 From: EBHolm Date: Wed, 1 Nov 2023 09:13:13 +0100 Subject: [PATCH 15/59] Updates to FA --- include/background.h | 1 + source/background.c | 31 +++++++++++++++---------------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/include/background.h b/include/background.h index 0a3356455..8441e7673 100644 --- a/include/background.h +++ b/include/background.h @@ -107,6 +107,7 @@ struct background double trigger_fluid_H_over_m; /* NEDE trigger fluid approximation threshold */ double a_trigger_fluid; /* Scale factor when trigger fluid approximation is turned on */ + double rho_fluid; /* Energy density when trigger fluid approximation is turned on */ /* NEDE decay time */ double tau_decay; diff --git a/source/background.c b/source/background.c index 4ceda1202..4c2552df8 100644 --- a/source/background.c +++ b/source/background.c @@ -525,15 +525,18 @@ int background_functions( /* NEDE trigger field */ if (pba->has_NEDE_trigger == _TRUE_) { + phi = pvecback_B[pba->index_bi_phi_trigger]; + phi_prime = pvecback_B[pba->index_bi_phi_prime_trigger]; + pvecback[pba->index_bg_V_trigger] = V_trigger(pba, phi); // V_scf(pba,phi); //write here potential as function of phi + pvecback[pba->index_bg_dV_trigger] = dV_trigger(pba, phi); // dV_scf(pba,phi); //potential' as function of phi + pvecback[pba->index_bg_ddV_trigger] = ddV_trigger(pba, phi); // ddV_scf(pba,phi); //potential'' as function of phi + phi = pvecback_B[pba->index_bi_phi_trigger]; + phi_prime = pvecback_B[pba->index_bi_phi_prime_trigger]; + pvecback[pba->index_bg_phi_trigger] = phi; // value of the trigger field phi + pvecback[pba->index_bg_phi_prime_trigger] = phi_prime; // value of the trigger field derivative wrt conformal time + if (a < pba->a_trigger_fluid) { // This part is relevant before the fluid approximation is turned on. - phi = pvecback_B[pba->index_bi_phi_trigger]; - phi_prime = pvecback_B[pba->index_bi_phi_prime_trigger]; - pvecback[pba->index_bg_phi_trigger] = phi; // value of the trigger field phi - pvecback[pba->index_bg_phi_prime_trigger] = phi_prime; // value of the trigger field derivative wrt conformal time - pvecback[pba->index_bg_V_trigger] = V_trigger(pba, phi); // V_scf(pba,phi); //write here potential as function of phi - pvecback[pba->index_bg_dV_trigger] = dV_trigger(pba, phi); // dV_scf(pba,phi); //potential' as function of phi - pvecback[pba->index_bg_ddV_trigger] = ddV_trigger(pba, phi); // ddV_scf(pba,phi); //potential'' as function of phi pvecback[pba->index_bg_rho_trigger] = (phi_prime*phi_prime/(2*a*a) + V_trigger(pba, phi))/3.; // energy of the trigger field. The field units are set automatically by setting the initial conditions pvecback[pba->index_bg_p_trigger] = (phi_prime*phi_prime/(2*a*a) - V_trigger(pba, phi))/3.; // pressure of the trigger field rho_tot += pvecback[pba->index_bg_rho_trigger]; @@ -544,17 +547,12 @@ int background_functions( rho_r += 3.*pvecback[pba->index_bg_p_trigger]; // field pressure contributes radiation rho_m += pvecback[pba->index_bg_rho_trigger] - 3.*pvecback[pba->index_bg_p_trigger]; // the rest contributes matter } + else if (a == pba->a_trigger_fluid) { + /* Turn on fluid approximation by setting the matched density calculated in background_derivs */ + pvecback[pba->index_bg_rho_trigger] = pba->rho_fluid; + } else { // This part is relevant after the fluid approximation has been turned on. - // We still fill the phi array with trivial values. - phi = pvecback_B[pba->index_bi_phi_trigger]; - phi_prime = pvecback_B[pba->index_bi_phi_prime_trigger]; - pvecback[pba->index_bg_phi_trigger] = phi; // value of the trigger field phi - pvecback[pba->index_bg_phi_prime_trigger] = phi_prime; // value of the trigger field derivative wrt conformal time - pvecback[pba->index_bg_V_trigger] = V_trigger(pba, phi); // V_scf(pba,phi); //write here potential as function of phi - pvecback[pba->index_bg_dV_trigger] = dV_trigger(pba, phi); // dV_scf(pba,phi); //potential' as function of phi - pvecback[pba->index_bg_ddV_trigger] = ddV_trigger(pba, phi); // ddV_scf(pba,phi); //potential'' as function of phi - // Here we copy the fluid energy density from the integration vector and add it to rho_tot. pvecback[pba->index_bg_rho_trigger] = pvecback_B[pba->index_bi_rho_trigger]; @@ -2965,6 +2963,7 @@ int background_derivs( rho_tfa /= 3.; // CLASS convention! y[pba->index_bi_rho_trigger] = rho_tfa; + pba->rho_fluid = rho_tfa; if (pba->background_verbose > 1) { printf("Turned on NEDE fluid approximation at a=%g\n", a); From 66243bae9363a777bb0d8fb7a165b09b59645c09 Mon Sep 17 00:00:00 2001 From: EBHolm Date: Thu, 2 Nov 2023 08:21:30 +0100 Subject: [PATCH 16/59] Implemented background approximation switching --- include/background.h | 2 +- include/common.h | 1 + source/background.c | 247 +++++++++++++++++++++++++++++------------- tools/evolver_ndf15.c | 25 ++++- 4 files changed, 192 insertions(+), 83 deletions(-) diff --git a/include/background.h b/include/background.h index 8441e7673..a5264db77 100644 --- a/include/background.h +++ b/include/background.h @@ -106,8 +106,8 @@ struct background short decay_flag; /* NEDE decay flag; True iff NEDE has decayed */ double trigger_fluid_H_over_m; /* NEDE trigger fluid approximation threshold */ + int trigger_fluid_approximation; /* True iff trigger fluid approximation is on */ double a_trigger_fluid; /* Scale factor when trigger fluid approximation is turned on */ - double rho_fluid; /* Energy density when trigger fluid approximation is turned on */ /* NEDE decay time */ double tau_decay; diff --git a/include/common.h b/include/common.h index 36165e128..00f92e8b2 100644 --- a/include/common.h +++ b/include/common.h @@ -24,6 +24,7 @@ #define _SUCCESS_ 0 /**< integer returned after successful call of a function */ #define _FAILURE_ 1 /**< integer returned after failure in a function */ +#define _APPROXIMATION_REACHED_ 2 /**< integer returned after reaching the threshold of a background approximation */ #define _ERRORMSGSIZE_ 2048 /**< generic error messages are cut beyond this number of characters */ typedef char ErrorMsg[_ERRORMSGSIZE_]; /**< Generic error messages (there is such a field in each structure) */ diff --git a/source/background.c b/source/background.c index 4c2552df8..4b1eea60a 100644 --- a/source/background.c +++ b/source/background.c @@ -525,20 +525,21 @@ int background_functions( /* NEDE trigger field */ if (pba->has_NEDE_trigger == _TRUE_) { - phi = pvecback_B[pba->index_bi_phi_trigger]; - phi_prime = pvecback_B[pba->index_bi_phi_prime_trigger]; - pvecback[pba->index_bg_V_trigger] = V_trigger(pba, phi); // V_scf(pba,phi); //write here potential as function of phi - pvecback[pba->index_bg_dV_trigger] = dV_trigger(pba, phi); // dV_scf(pba,phi); //potential' as function of phi - pvecback[pba->index_bg_ddV_trigger] = ddV_trigger(pba, phi); // ddV_scf(pba,phi); //potential'' as function of phi - phi = pvecback_B[pba->index_bi_phi_trigger]; - phi_prime = pvecback_B[pba->index_bi_phi_prime_trigger]; - pvecback[pba->index_bg_phi_trigger] = phi; // value of the trigger field phi - pvecback[pba->index_bg_phi_prime_trigger] = phi_prime; // value of the trigger field derivative wrt conformal time - - if (a < pba->a_trigger_fluid) { + if (pba->trigger_fluid_approximation == _FALSE_) { // This part is relevant before the fluid approximation is turned on. + if (a == pba->a_trigger_fluid) { + int k = 0; + } + phi = pvecback_B[pba->index_bi_phi_trigger]; + phi_prime = pvecback_B[pba->index_bi_phi_prime_trigger]; + pvecback[pba->index_bg_V_trigger] = V_trigger(pba, phi); // V_scf(pba,phi); //write here potential as function of phi + pvecback[pba->index_bg_dV_trigger] = dV_trigger(pba, phi); // dV_scf(pba,phi); //potential' as function of phi + pvecback[pba->index_bg_ddV_trigger] = ddV_trigger(pba, phi); // ddV_scf(pba,phi); //potential'' as function of phi + pvecback[pba->index_bg_phi_trigger] = phi; // value of the trigger field phi + pvecback[pba->index_bg_phi_prime_trigger] = phi_prime; // value of the trigger field derivative wrt conformal time pvecback[pba->index_bg_rho_trigger] = (phi_prime*phi_prime/(2*a*a) + V_trigger(pba, phi))/3.; // energy of the trigger field. The field units are set automatically by setting the initial conditions pvecback[pba->index_bg_p_trigger] = (phi_prime*phi_prime/(2*a*a) - V_trigger(pba, phi))/3.; // pressure of the trigger field + rho_tot += pvecback[pba->index_bg_rho_trigger]; p_tot += pvecback[pba->index_bg_p_trigger]; dp_dloga += 0.0; /** <-- This depends on a_prime_over_a, so we cannot add it now! */ @@ -547,15 +548,18 @@ int background_functions( rho_r += 3.*pvecback[pba->index_bg_p_trigger]; // field pressure contributes radiation rho_m += pvecback[pba->index_bg_rho_trigger] - 3.*pvecback[pba->index_bg_p_trigger]; // the rest contributes matter } - else if (a == pba->a_trigger_fluid) { - /* Turn on fluid approximation by setting the matched density calculated in background_derivs */ - pvecback[pba->index_bg_rho_trigger] = pba->rho_fluid; - } else { // This part is relevant after the fluid approximation has been turned on. // Here we copy the fluid energy density from the integration vector and add it to rho_tot. pvecback[pba->index_bg_rho_trigger] = pvecback_B[pba->index_bi_rho_trigger]; - + // Everything else is not tracked; just set to zero. + pvecback[pba->index_bg_V_trigger] = V_trigger(pba, 0.); + pvecback[pba->index_bg_dV_trigger] = dV_trigger(pba, 0.); + pvecback[pba->index_bg_ddV_trigger] = ddV_trigger(pba, 0.); + pvecback[pba->index_bg_phi_trigger] = 0.; + pvecback[pba->index_bg_phi_prime_trigger] = 0.; + // index_bg_p_trigger is later in background_functions + // And add it to the total energy density. rho_tot += pvecback[pba->index_bg_rho_trigger]; @@ -650,7 +654,7 @@ int background_functions( if (pba->has_NEDE_trigger == _TRUE_) { // NEDE: Here we calculate the pressure contribution of the Trigger field when we are in the fluid approximation. - if (a >= pba->a_trigger_fluid) { + if (pba->trigger_fluid_approximation == _TRUE_) { double w_trigger; class_call(background_quantities_NEDE_trigger(pba, a, a*pvecback[pba->index_bg_H], pvecback[pba->index_bg_H], 0, &w_trigger, NULL, NULL), pba->error_message, @@ -693,7 +697,7 @@ int background_functions( if (pba->has_NEDE_trigger == _TRUE_) { /** The contribution of the trigger field was not added to dp_dloga, add p_scf_prime here: */ - if (a < pba->a_trigger_fluid) { + if (pba->trigger_fluid_approximation == _FALSE_) { pvecback[pba->index_bg_p_prime_trigger] = pvecback[pba->index_bg_phi_prime_trigger]*(-pvecback[pba->index_bg_phi_prime_trigger]*pvecback[pba->index_bg_H]/a - 2./3.*pvecback[pba->index_bg_dV_trigger]); pvecback[pba->index_bg_p_tot_prime] += pvecback[pba->index_bg_p_prime_trigger]; } @@ -705,6 +709,7 @@ int background_functions( pba->error_message); double dp_dloga_trigger = (a*dw_over_da_trigger - 3.*(1. + w_trigger)*w_trigger)*pvecback[pba->index_bg_rho_trigger]; + pvecback[pba->index_bg_p_prime_trigger] = 0.; // Not tracked in fluid approximation pvecback[pba->index_bg_p_tot_prime] += a*pvecback[pba->index_bg_H]*dp_dloga_trigger; } } @@ -723,7 +728,16 @@ int background_functions( /** - store critical density */ pvecback[pba->index_bg_rho_crit] = rho_crit; - + + if (pba->has_NEDE_trigger == _TRUE_) { + if (pba->trigger_fluid_approximation == _TRUE_) { + pvecback[pba->index_bg_rho_trigger] = pvecback_B[pba->index_bi_rho_trigger]; + if (pvecback[pba->index_bg_rho_trigger] < 0.) { + printf("rho_trigger=%g negative at a=%g in background functions; rho_crit=%g, Omega0_trigger=%g\n", pvecback[pba->index_bg_rho_trigger], a, pvecback[pba->index_bg_rho_crit], pvecback[pba->index_bg_rho_trigger]/pvecback[pba->index_bg_rho_crit]); + } + } + } + /** - compute Omega_m */ pvecback[pba->index_bg_Omega_m] = rho_m / rho_crit; @@ -1021,16 +1035,6 @@ int background_init( "Shooting failed, try optimising input_get_guess(). Error message:\n\n%s", pba->shooting_error); - /** - assign values to all indices in vectors of background quantities */ - class_call(background_indices(pba), - pba->error_message, - pba->error_message); - - /** - check that input parameters make sense and write additional information about them */ - class_call(background_checks(ppr,pba), - pba->error_message, - pba->error_message); - /** - integrate the background over log(a), allocate and fill the background table */ class_call(background_solve(ppr,pba), pba->error_message, @@ -1386,6 +1390,23 @@ int background_indices( /* -> scalar field and its derivative wrt conformal time (Zuma) */ class_define_index(pba->index_bi_phi_scf,pba->has_scf,index_bi,1); class_define_index(pba->index_bi_phi_prime_scf,pba->has_scf,index_bi,1); + + /* -> NEDE trigger field, its derivative and energy density + Important that these are the last defined B bi indices! */ + if (pba->has_NEDE_trigger) { + if (pba->trigger_fluid_approximation == _TRUE_) { + // Only rho is evolved within the fluid approximation + class_define_index(pba->index_bi_rho_trigger, _TRUE_, index_bi, 1); + pba->index_bi_phi_trigger = NAN; + pba->index_bi_phi_prime_trigger = NAN; + } + else { + // Not fluid approximation, evolve the field itself + class_define_index(pba->index_bi_phi_trigger, _TRUE_, index_bi, 1); + class_define_index(pba->index_bi_phi_prime_trigger, _TRUE_, index_bi, 1); + pba->index_bi_rho_trigger = NAN; + } + } /* End of {B} variables */ pba->bi_B_size = index_bi; @@ -1401,15 +1422,7 @@ int background_indices( /* -> Second order equation for growth factor */ class_define_index(pba->index_bi_D,_TRUE_,index_bi,1); class_define_index(pba->index_bi_D_prime,_TRUE_,index_bi,1); - - /* -> NEDE trigger field and its derivative wrt conformal time */ - /* It is important that these two components appear at the end of the vector - (but still before the conformal time) because we stop integrating them - shortly after the decay (they are sub-dominant). - */ - class_define_index(pba->index_bi_phi_trigger, pba->has_NEDE_trigger, index_bi, 1); - class_define_index(pba->index_bi_phi_prime_trigger, pba->has_NEDE_trigger, index_bi, 1); - class_define_index(pba->index_bi_rho_trigger, pba->has_NEDE_trigger, index_bi, 1); + /* -> end of indices in the vector of variables to integrate */ pba->bi_size = index_bi; @@ -2131,6 +2144,19 @@ int background_solve( /* index of ncdm species */ int n_ncdm; + + /** - assign values to all indices in vectors of background quantities */ + if (pba->has_NEDE_trigger) { + pba->trigger_fluid_approximation = _FALSE_; + } + class_call(background_indices(pba), + pba->error_message, + pba->error_message); + + /** - check that input parameters make sense and write additional information about them */ + class_call(background_checks(ppr,pba), + pba->error_message, + pba->error_message); /** - setup background workspace */ bpaw.pba = pba; @@ -2220,6 +2246,88 @@ int background_solve( } /* -> scale-invariant growth rate today */ D_today = pvecback_integration[pba->index_bi_D]; + + double* new_pvecback_integration; + if (pba->has_NEDE_trigger) { + if (pba->a_trigger_fluid != 100.) { + // Fluid approximation was requested; integration was stopped early, continue integration with new variables + + /** - Get background quantities at end of last integration; required for computing initial rho_trigger when approx is turned on + (important to do this before changing indices in the next step) */ + double* pvecback; + class_alloc(pvecback,pba->bg_size*sizeof(double),pba->error_message); + double a = pba->a_trigger_fluid; + class_call(background_functions(pba, a, pvecback_integration, normal_info, pvecback), + pba->error_message, + pba->error_message); + + /** - Here we implement the matching between the fluid and field description proposed in arXiv:2201.10238. We use Eq.8, Eq. 6 and Eq. 13 */ + double phi_fluid = pvecback_integration[pba->index_bi_phi_trigger]; + double phi_prime_fluid = pvecback_integration[pba->index_bi_phi_prime_trigger]; + double factor = 6.*pow(pvecback[pba->index_bg_H], 2)/(9.*pow(pvecback[pba->index_bg_H], 4) - 4.*(4.*pow(pvecback[pba->index_bg_H], 2)* pow(pba->NEDE_trigger_mass, 2) + pow(pvecback[pba->index_bg_H_prime], 2) / pow(a, 2))); + double phi_c_p = factor*(4.*pvecback[pba->index_bg_H]*pba->NEDE_trigger_mass*phi_fluid + 3.*pow(pvecback[pba->index_bg_H], 2)*phi_prime_fluid/a/pba->NEDE_trigger_mass + 2.*pvecback[pba->index_bg_H_prime]*phi_prime_fluid/pow(a, 2)/pba->NEDE_trigger_mass); + double phi_s_p = factor*(3.*pow(pvecback[pba->index_bg_H], 2)*phi_fluid - 2.*pvecback[pba->index_bg_H_prime]/a*phi_fluid + 4.*pvecback[pba->index_bg_H]*phi_prime_fluid/a); + double phi_c = phi_fluid; + double phi_s = phi_prime_fluid/a/pba->NEDE_trigger_mass - phi_c_p; + double rho_tfa = 0.5*pow(pba->NEDE_trigger_mass, 2)*(phi_c*phi_c + phi_s*phi_s + 0.5*(phi_c_p*phi_c_p + phi_s_p*phi_s_p) - phi_c*phi_s_p + phi_s*phi_c_p); + rho_tfa /= 3.; // CLASS convention! + + pba->trigger_fluid_approximation = _TRUE_; + if (pba->background_verbose > 1) { + printf("Turned on NEDE trigger fluid approximation at a=%g with rho_trigger=%g, matching the FA initial value rho_trigger=%g.\n", pvecback_integration[pba->index_bg_a], pvecback_integration[pba->index_bg_rho_trigger], rho_tfa); + } + + /** - assign new indices after approximation turned on */ + class_call(background_indices(pba), + pba->error_message, + pba->error_message); + + /** - copy variables from last integration vector to the new one */ + class_alloc(new_pvecback_integration,pba->bi_size*sizeof(double),pba->error_message); + for (int index_bi_new = 0; index_bi_new < pba->index_bi_rho_trigger; index_bi_new++) { + // Copy bi A and bi B variables into new set of variables + new_pvecback_integration[index_bi_new] = pvecback_integration[index_bi_new]; + } + new_pvecback_integration[pba->index_bi_rho_trigger] = rho_tfa; + for (int index_bi_new = pba->index_bi_rho_trigger + 1; index_bi_new < pba->bi_size; index_bi_new++) { + // Copy bi C variables + new_pvecback_integration[index_bi_new] = pvecback_integration[index_bi_new + 1]; // +1 because new_pvecback has 1 less bi B variable defined + } + class_call(generic_evolver(background_derivs, + log(pba->a_trigger_fluid), + loga_final, + new_pvecback_integration, + used_in_output, + pba->bi_size, + &bpaw, + ppr->tol_background_integration, + ppr->smallest_allowed_variation, + background_timescale, //'evaluate_timescale', required by evolver_rk but not by ndf15 + ppr->background_integration_stepsize, + pba->loga_table, + pba->bt_size, + background_sources, + NULL, //'print_variables' in evolver_rk could be set, but, not required + pba->error_message), + pba->error_message, + pba->error_message); + + /** - recover some quantities today */ + /* -> age in Gyears */ + pba->age = new_pvecback_integration[pba->index_bi_time]/_Gyr_over_Mpc_; + /* -> conformal age in Mpc */ + pba->conformal_age = new_pvecback_integration[pba->index_bi_tau]; + /* -> contribution of decaying dark matter and dark radiation to the critical density today: */ + if (pba->has_dcdm == _TRUE_) { + pba->Omega0_dcdm = new_pvecback_integration[pba->index_bi_rho_dcdm]/pba->H0/pba->H0; + } + if (pba->has_dr == _TRUE_) { + pba->Omega0_dr = new_pvecback_integration[pba->index_bi_rho_dr]/pba->H0/pba->H0; + } + /* -> scale-invariant growth rate today */ + D_today = new_pvecback_integration[pba->index_bi_D]; + } + } /** - In a loop over lines, fill rest of background table for quantities that depend on numbers like "conformal_age" or @@ -2360,6 +2468,11 @@ int background_solve( free(pvecback); free(pvecback_integration); free(used_in_output); + if (pba->has_NEDE_trigger) { + if (pba->trigger_fluid_approximation == _TRUE_) { + free(new_pvecback_integration); + } + } return _SUCCESS_; @@ -2512,8 +2625,6 @@ int background_initial_conditions( /* phi'_ini = -1/5 * phi_ini a^2 m^2 / (a H) where H = sqrt(rho) ins class conventions. */ pvecback_integration[pba->index_bi_phi_trigger] = pba->NEDE_trigger_ini; pvecback_integration[pba->index_bi_phi_prime_trigger] = -1./5.*pba->NEDE_trigger_ini*pow(pba->NEDE_trigger_mass, 2)/pow(rho_rad, 0.5)*a; - pvecback_integration[pba->index_bi_rho_trigger] = 0.0; - // printf("initial value: %e; \n",pvecback_integration[pba->index_bi_phi_prime_scf]); } /** - Fix initial value of \f$ \phi, \phi' \f$ @@ -2945,46 +3056,18 @@ int background_derivs( } if (pba->has_NEDE_trigger == _TRUE_) { - if ((H < pba->trigger_fluid_H_over_m*pba->NEDE_trigger_mass) && (pba->a_trigger_fluid == 100.)) { - // Turn on trigger fluid approximation - pba->a_trigger_fluid = a; - - /* Here we implement the matching between the fluid and field description proposed in arXiv:2201.10238. We use Eq.8, Eq. 6 and Eq. 13 */ - double phi_fluid = y[pba->index_bi_phi_trigger]; - double phi_prime_fluid = y[pba->index_bi_phi_prime_trigger]; - - double factor = 6.*pow(pvecback[pba->index_bg_H], 2)/(9.*pow(pvecback[pba->index_bg_H], 4) - 4.*(4.*pow(pvecback[pba->index_bg_H], 2)* pow(pba->NEDE_trigger_mass, 2) + pow(pvecback[pba->index_bg_H_prime], 2) / pow(a, 2))); - double phi_c_p = factor*(4.*pvecback[pba->index_bg_H]*pba->NEDE_trigger_mass*phi_fluid + 3.*pow(pvecback[pba->index_bg_H], 2)*phi_prime_fluid/a/pba->NEDE_trigger_mass + 2.*pvecback[pba->index_bg_H_prime]*phi_prime_fluid/pow(a, 2)/pba->NEDE_trigger_mass); - double phi_s_p = factor*(3.*pow(pvecback[pba->index_bg_H], 2)*phi_fluid - 2.*pvecback[pba->index_bg_H_prime]/a*phi_fluid + 4.*pvecback[pba->index_bg_H]*phi_prime_fluid/a); - double phi_c = phi_fluid; - double phi_s = phi_prime_fluid/a/pba->NEDE_trigger_mass - phi_c_p; - - double rho_tfa = 0.5*pow(pba->NEDE_trigger_mass, 2)*(phi_c*phi_c + phi_s*phi_s + 0.5*(phi_c_p*phi_c_p + phi_s_p*phi_s_p) - phi_c*phi_s_p + phi_s*phi_c_p); - rho_tfa /= 3.; // CLASS convention! - - y[pba->index_bi_rho_trigger] = rho_tfa; - pba->rho_fluid = rho_tfa; - - if (pba->background_verbose > 1) { - printf("Turned on NEDE fluid approximation at a=%g\n", a); - } - } - - dy[pba->index_bi_phi_trigger] = 0.; - dy[pba->index_bi_phi_prime_trigger] = 0.; - dy[pba->index_bi_rho_trigger] = 0.; - - /** - Scalar field equation: \f$ \phi'' + 2 a H \phi' + a^2 dV = 0 \f$ (note H is wrt cosmic time) */ - /** Here transformed to derivatives wrt. loga through d/dloga = 1/(aH)*d/deta, with eta conformal time */ - if (a < pba->a_trigger_fluid) { - dy[pba->index_bi_phi_trigger] = y[pba->index_bi_phi_prime_trigger]/a/H; - dy[pba->index_bi_phi_prime_trigger] = -2*y[pba->index_bi_phi_prime_trigger] - a*dV_trigger(pba, y[pba->index_bi_phi_trigger])/H; - } - else { + if ((a >= pba->a_trigger_fluid) && (pba->trigger_fluid_approximation == _TRUE_)) { + // Fluid approximation; track only rho_trigger double w_trigger, dw_over_da_trigger; class_call(background_quantities_NEDE_trigger(pba, a, a*H, H, pvecback[pba->index_bg_H_prime], &w_trigger, &dw_over_da_trigger, NULL), pba->error_message, pba->error_message); dy[pba->index_bi_rho_trigger] = -3.*(1. + w_trigger)*y[pba->index_bi_rho_trigger]; } + else { + /** - Scalar field equation: \f$ \phi'' + 2 a H \phi' + a^2 dV = 0 \f$ (note H is wrt cosmic time) */ + /** Here transformed to derivatives wrt. loga through d/dloga = 1/(aH)*d/deta, with eta conformal time */ + dy[pba->index_bi_phi_trigger] = y[pba->index_bi_phi_prime_trigger]/a/H; + dy[pba->index_bi_phi_prime_trigger] = -2*y[pba->index_bi_phi_prime_trigger] - a*dV_trigger(pba, y[pba->index_bi_phi_trigger])/H; + } } return _SUCCESS_; @@ -3048,7 +3131,17 @@ int background_sources( class_call(background_functions(pba, a, y, long_info, bg_table_row), pba->error_message, pba->error_message); - + + if (pba->has_NEDE_trigger) { + double H = bg_table_row[pba->index_bg_H]; + if ((H < pba->trigger_fluid_H_over_m*pba->NEDE_trigger_mass) && (pba->trigger_fluid_approximation == _FALSE_)) { + // Turn on NEDE trigger fluid approximation + printf("From BG Sources: Turned on FA at a=%g\n", a); + pba->a_trigger_fluid = a; + // pba->trigger_fluid_approximation = _TRUE_; + return _APPROXIMATION_REACHED_; + } + } return _SUCCESS_; } diff --git a/tools/evolver_ndf15.c b/tools/evolver_ndf15.c index 0d2937235..d6206d9b5 100644 --- a/tools/evolver_ndf15.c +++ b/tools/evolver_ndf15.c @@ -549,11 +549,14 @@ int evolver_ndf15( } } /** Output **/ + int output_return; while ((next= 0.0)){ /* Do we need to write output? */ if (tnew==t_vec[next]){ - class_call((*output)(t_vec[next],ynew+1,f0+1,next,parameters_and_workspace_for_derivs,error_message), - error_message,error_message); + + output_return = output(t_vec[next],ynew+1,f0+1,next,parameters_and_workspace_for_derivs,error_message); + // class_call((*output)(t_vec[next],ynew+1,f0+1,next,parameters_and_workspace_for_derivs,error_message), + // error_message,error_message); // MODIFICATION BY LUC // All print_variables have been moved to the end of time step /* @@ -567,11 +570,23 @@ int evolver_ndf15( else { /*Interpolate if we have overshot sample values*/ interp_from_dif(t_vec[next],tnew,ynew,h,dif,k,yinterp,ypinterp,yppinterp,interpidx,neq,2); + + output_return = output(t_vec[next],ynew+1,f0+1,next,parameters_and_workspace_for_derivs,error_message); + // class_call((*output)(t_vec[next],yinterp+1,ypinterp+1,next,parameters_and_workspace_for_derivs, + // error_message),error_message,error_message); - class_call((*output)(t_vec[next],yinterp+1,ypinterp+1,next,parameters_and_workspace_for_derivs, - error_message),error_message,error_message); - } + + if (output_return == _FAILURE_) { + // Cast CLASS error message by mimicing the class_call macro + class_call_message(error_message, output, error_message) + return _FAILURE_; + } + else if (output_return == _APPROXIMATION_REACHED_) { + // Early stopping due to turning on approximation + done = _TRUE_; + } + next++; } /** End of output **/ From 7c65f17f4f50f864d2a31d8499d1d56f438e946f Mon Sep 17 00:00:00 2001 From: EBHolm Date: Thu, 2 Nov 2023 10:22:42 +0100 Subject: [PATCH 17/59] Progress on perturbations --- include/perturbations.h | 36 +++++++++++++ include/precisions.h | 5 ++ source/perturbations.c | 113 ++++++++++++++++++++++++++++++++++++++-- 3 files changed, 149 insertions(+), 5 deletions(-) diff --git a/include/perturbations.h b/include/perturbations.h index 326d60f52..35ea322a2 100644 --- a/include/perturbations.h +++ b/include/perturbations.h @@ -31,6 +31,16 @@ enum rsa_idr_flags {rsa_idr_off, rsa_idr_on}; enum ufa_flags {ufa_off, ufa_on}; enum ncdmfa_flags {ncdmfa_off, ncdmfa_on}; +/* New EDE, before decay CCa_on, corresponding to no perts.*/ +enum CCa_flags {CCa_on, CCa_off}; + +/*New EDE, we stop tracking NewEDE pert when sda_on*/ +enum sda_flags {sda_off, sda_on}; + +/*New EDE, we apply trigger fluid approximation when tfa_on*/ +enum tfa_flags {tfa_off, tfa_on}; +enum tavg_flags {tavg_off, tavg_on}; + /* Nature of NEDE fluid, either effective rest-frame sound speed is tracking the adiabatic sound speed (adiabatic case) or it is constant. */ enum NEDE_ceff_nature {NEDE_ceff_const, NEDE_ceff_tracking}; @@ -253,6 +263,7 @@ struct perturbations short has_source_delta_ur; /**< do we need source for delta of ultra-relativistic neutrinos/relics? */ short has_source_delta_ncdm; /**< do we need source for delta of all non-cold dark matter species (e.g. massive neutrinos)? */ short has_source_delta_NEDE; /**< do we need source for delta of NEDE? */ + short has_source_delta_trigger; /**< do we need source for delta from trigger field? */ short has_source_theta_m; /**< do we need source for theta of total matter? */ short has_source_theta_cb; /**< do we ALSO need source for theta of ONLY cdm and baryon? */ short has_source_theta_tot; /**< do we need source for theta total? */ @@ -268,6 +279,7 @@ struct perturbations short has_source_theta_ur; /**< do we need source for theta of ultra-relativistic neutrinos/relics? */ short has_source_theta_ncdm; /**< do we need source for theta of all non-cold dark matter species (e.g. massive neutrinos)? */ short has_source_theta_NEDE; /**< do we need source for theta of NEDE? */ + short has_source_theta_trigger; /**< do we need source for theta of trigger field? */ short has_source_phi; /**< do we need source for metric fluctuation phi? */ short has_source_phi_prime; /**< do we need source for metric fluctuation phi'? */ short has_source_phi_plus_psi; /**< do we need source for metric fluctuation (phi+psi)? */ @@ -303,6 +315,7 @@ struct perturbations int index_tp_delta_idr; /**< index value for delta of interacting dark radiation */ int index_tp_delta_ncdm1; /**< index value for delta of first non-cold dark matter species (e.g. massive neutrinos) */ int index_tp_delta_NEDE; /**< index value for delta of NEDE */ + int index_tp_delta_trigger; /**< index value for delta of trigger field */ int index_tp_perturbed_recombination_delta_temp; /**< Gas temperature perturbation */ int index_tp_perturbed_recombination_delta_chi; /**< Inionization fraction perturbation */ @@ -321,6 +334,7 @@ struct perturbations int index_tp_theta_dr; /**< index value for F1 of decay radiation */ int index_tp_theta_ncdm1; /**< index value for theta of first non-cold dark matter species (e.g. massive neutrinos) */ int index_tp_theta_NEDE; /**< index value for theta of NEDE */ + int index_tp_theta_trigger; /**< index value for theta of trigger field */ int index_tp_phi; /**< index value for metric fluctuation phi */ int index_tp_phi_prime; /**< index value for metric fluctuation phi' */ @@ -485,6 +499,14 @@ struct perturbations_vector int index_pt_Gamma_fld; /**< unique dark energy dynamical variable in PPF case */ int index_pt_phi_scf; /**< scalar field density */ int index_pt_phi_prime_scf; /**< scalar field velocity */ + int index_pt_phi_trigger; /**< trigger field density */ + int index_pt_phi_prime_trigger; /**< trigger field velocity */ + int index_pt_delta_trigger_fld; + int index_pt_theta_trigger_fld; + int index_pt_delta_trigger_cycle_integral; + int index_pt_theta_hat_trigger_cycle_integral; + int index_pt_delta_t_trigger_cycle_integral; + int index_pt_theta_hat_t_trigger_cycle_integral; int index_pt_delta_ur; /**< density of ultra-relativistic neutrinos/relics */ int index_pt_theta_ur; /**< velocity of ultra-relativistic neutrinos/relics */ int index_pt_shear_ur; /**< shear of ultra-relativistic neutrinos/relics */ @@ -499,6 +521,8 @@ struct perturbations_vector int index_pt_delta_NEDE; int index_pt_theta_NEDE; int index_pt_shear_NEDE; + int index_pt_delta_trigger; + int index_pt_rho_plus_p_theta_trigger; /* perturbed recombination */ int index_pt_perturbed_recombination_delta_temp; /**< Gas temperature perturbation */ @@ -642,6 +666,10 @@ struct perturbations_workspace int index_ap_rsa_idr; /**< index for dark radiation streaming approximation */ int index_ap_ufa; /**< index for ur fluid approximation */ int index_ap_ncdmfa; /**< index for ncdm fluid approximation */ + int index_ap_CCa; /**< index for New EDE approximation*/ + int index_ap_sda; /**< index for New EDE approximation*/ + int index_ap_tfa; /**< index for New EDE approximation*/ + int index_ap_tavg; /**< index for New EDE approximation*/ int ap_size; /**< number of relevant approximations for a given mode */ int * approx; /**< array of approximation flags holding at a given time: approx[index_ap] */ @@ -982,6 +1010,14 @@ extern "C" { ErrorMsg error_message ); +int trigger_NEDE_cs2( + struct background *pba, + double a, + double k, + double H, + double *cs2 + ); + #ifdef __cplusplus } #endif diff --git a/include/precisions.h b/include/precisions.h index 7937df759..cd2eb0f18 100644 --- a/include/precisions.h +++ b/include/precisions.h @@ -596,6 +596,11 @@ class_precision_parameter(tol_sd_detector,double,1.e-5) class_string_parameter(sd_external_path,"/external/distortions","sd_external_path") +/* + NEDE precision settings + */ +class_precision_parameter(sub_dom_cond,double,0) + #undef class_precision_parameter #undef class_string_parameter #undef class_type_parameter diff --git a/source/perturbations.c b/source/perturbations.c index 2d353f389..a83964c1d 100644 --- a/source/perturbations.c +++ b/source/perturbations.c @@ -470,6 +470,8 @@ int perturbations_output_data( class_store_double(dataptr,tk[ppt->index_tp_delta_idm],ppt->has_source_delta_idm,storeidx); class_store_double(dataptr,tk[ppt->index_tp_delta_fld],ppt->has_source_delta_fld,storeidx); class_store_double(dataptr,tk[ppt->index_tp_delta_ur],ppt->has_source_delta_ur,storeidx); + class_store_double(dataptr,tk[ppt->index_tp_delta_NEDE],ppt->has_source_delta_NEDE,storeidx); + // class_store_double(dataptr,tk[ppt->index_tp_delta_trigger],ppt->has_source_delta_trigger,storeidx); class_store_double(dataptr,tk[ppt->index_tp_delta_idr],ppt->has_source_delta_idr,storeidx); if (pba->has_ncdm == _TRUE_){ for (n_ncdm = 0; n_ncdm < pba->N_ncdm; n_ncdm++){ @@ -499,6 +501,8 @@ int perturbations_output_data( class_store_double(dataptr,tk[ppt->index_tp_theta_idm],ppt->has_source_theta_idm,storeidx); class_store_double(dataptr,tk[ppt->index_tp_theta_fld],ppt->has_source_theta_fld,storeidx); class_store_double(dataptr,tk[ppt->index_tp_theta_ur],ppt->has_source_theta_ur,storeidx); + class_store_double(dataptr,tk[ppt->index_tp_theta_NEDE],ppt->has_source_theta_NEDE,storeidx); + // class_store_double(dataptr,tk[ppt->index_tp_theta_trigger],ppt->has_source_theta_trigger,storeidx); class_store_double(dataptr,tk[ppt->index_tp_theta_idr],ppt->has_source_theta_idr,storeidx); if (pba->has_ncdm == _TRUE_){ for (n_ncdm = 0; n_ncdm < pba->N_ncdm; n_ncdm++){ @@ -558,6 +562,7 @@ int perturbations_output_titles( class_store_columntitle(titles,"d_idm",pba->has_idm); class_store_columntitle(titles,"d_fld",pba->has_fld); class_store_columntitle(titles,"d_ur",pba->has_ur); + class_store_columntitle(titles,"d_NEDE",pba->has_NEDE_pert); class_store_columntitle(titles,"d_idr",pba->has_idr); if (pba->has_ncdm == _TRUE_) { for (n_ncdm=0; n_ncdm < pba->N_ncdm; n_ncdm++) { @@ -568,6 +573,7 @@ int perturbations_output_titles( class_store_columntitle(titles,"d_dcdm",pba->has_dcdm); class_store_columntitle(titles,"d_dr",pba->has_dr); class_store_columntitle(titles,"d_scf",pba->has_scf); + // class_store_columntitle(titles,"d_trigger",pba->has_NEDE_trigger); class_store_columntitle(titles,"d_m",ppt->has_source_delta_m); class_store_columntitle(titles,"d_tot",ppt->has_source_delta_tot); class_store_columntitle(titles,"phi",ppt->has_source_phi); @@ -587,6 +593,7 @@ int perturbations_output_titles( class_store_columntitle(titles,"t_idm",pba->has_idm); class_store_columntitle(titles,"t_fld",pba->has_fld); class_store_columntitle(titles,"t_ur",pba->has_ur); + class_store_columntitle(titles, "t_NEDE", pba->has_NEDE_pert); class_store_columntitle(titles,"t_idr",pba->has_idr); if (pba->has_ncdm == _TRUE_) { for (n_ncdm=0; n_ncdm < pba->N_ncdm; n_ncdm++) { @@ -597,6 +604,7 @@ int perturbations_output_titles( class_store_columntitle(titles,"t_dcdm",pba->has_dcdm); class_store_columntitle(titles,"t_dr",pba->has_dr); class_store_columntitle(titles,"t_scf",pba->has_scf); + // class_store_columntitle(titles,"t_trigger",pba->has_NEDE_trigger); class_store_columntitle(titles,"t_tot",_TRUE_); } } @@ -742,6 +750,17 @@ int perturbations_init( if (ppt->perturbations_verbose > 0) printf("Computing sources\n"); } + + if (pba->has_NEDE && ppt->perturbations_verbose > 1) { + printf(" -> NEDE perturbation details:\n"); + if (ppt->NEDE_ceff_nature == NEDE_ceff_const) + printf(" -> 3*ceff2: %f (constant)\n", ppt->three_ceff2_NEDE); + else + printf(" -> ceff2 = ca2 (tracking) \n"); + printf(" -> 3*cvis2: %f (constant) \n", ppt->three_cvis2_NEDE); + printf(" -> Junction_tag: %d \n", pba->Junction_tag); + printf(" -> NEDE sub-dominant condition: %e \n", ppr->sub_dom_cond); + } class_test((ppt->gauge == synchronous) && (pba->has_cdm == _FALSE_), ppt->error_message, @@ -1298,6 +1317,8 @@ int perturbations_indices( ppt->has_source_delta_scf = _FALSE_; ppt->has_source_delta_dr = _FALSE_; ppt->has_source_delta_ur = _FALSE_; + ppt->has_source_delta_NEDE = _FALSE_; + ppt->has_source_delta_trigger = _FALSE_; ppt->has_source_delta_idr = _FALSE_; ppt->has_source_delta_ncdm = _FALSE_; ppt->has_source_delta_tot = _FALSE_; @@ -1313,6 +1334,8 @@ int perturbations_indices( ppt->has_source_theta_scf = _FALSE_; ppt->has_source_theta_dr = _FALSE_; ppt->has_source_theta_ur = _FALSE_; + ppt->has_source_theta_NEDE = _FALSE_; + ppt->has_source_theta_trigger = _FALSE_; ppt->has_source_theta_idr = _FALSE_; ppt->has_source_theta_ncdm = _FALSE_; ppt->has_source_theta_tot = _FALSE_; @@ -1413,6 +1436,11 @@ int perturbations_indices( ppt->has_source_delta_dr = _TRUE_; if (pba->has_ncdm == _TRUE_) ppt->has_source_delta_ncdm = _TRUE_; + if (pba->has_NEDE == _TRUE_) { + ppt->has_source_delta_NEDE = _TRUE_; + ppt->has_source_delta_trigger = _TRUE_; + } + // No source for the subdom trigger field required. // Thanks to the following lines, (phi,psi) are also stored as sources // (Obtained directly in newtonian gauge, infereed from (h,eta) in synchronous gauge). // If density transfer functions are requested in the (default) CLASS format, @@ -1510,6 +1538,7 @@ int perturbations_indices( class_define_index(ppt->index_tp_delta_dcdm, ppt->has_source_delta_dcdm,index_type,1); class_define_index(ppt->index_tp_delta_fld, ppt->has_source_delta_fld, index_type,1); class_define_index(ppt->index_tp_delta_scf, ppt->has_source_delta_scf, index_type,1); + // class_define_index(ppt->index_tp_delta_trigger, ppt->has_source_delta_trigger, index_type,1); class_define_index(ppt->index_tp_delta_dr, ppt->has_source_delta_dr, index_type,1); class_define_index(ppt->index_tp_delta_ur, ppt->has_source_delta_ur, index_type,1); class_define_index(ppt->index_tp_delta_idr, ppt->has_source_delta_idr, index_type,1); @@ -1524,6 +1553,7 @@ int perturbations_indices( class_define_index(ppt->index_tp_theta_dcdm, ppt->has_source_theta_dcdm,index_type,1); class_define_index(ppt->index_tp_theta_fld, ppt->has_source_theta_fld, index_type,1); class_define_index(ppt->index_tp_theta_scf, ppt->has_source_theta_scf, index_type,1); + // class_define_index(ppt->index_tp_theta_trigger, ppt->has_source_theta_trigger, index_type,1); class_define_index(ppt->index_tp_theta_dr, ppt->has_source_theta_dr, index_type,1); class_define_index(ppt->index_tp_theta_ur, ppt->has_source_theta_ur, index_type,1); class_define_index(ppt->index_tp_theta_idr, ppt->has_source_theta_idr, index_type,1); @@ -2866,6 +2896,10 @@ int perturbations_workspace_init( class_define_index(ppw->index_ap_ncdmfa,pba->has_ncdm,index_ap,1); class_define_index(ppw->index_ap_tca_idm_dr,pba->has_idr,index_ap,1); class_define_index(ppw->index_ap_rsa_idr,pba->has_idr,index_ap,1); + + class_define_index(ppw->index_ap_CCa, pba->has_NEDE, index_ap, 1); + class_define_index(ppw->index_ap_sda, pba->has_NEDE, index_ap, 1); + class_define_index(ppw->index_ap_tfa, pba->has_NEDE_trigger, index_ap, 1); } ppw->ap_size=index_ap; @@ -2895,6 +2929,22 @@ int perturbations_workspace_init( if (pba->has_ncdm == _TRUE_) { ppw->approx[ppw->index_ap_ncdmfa]=(int)ncdmfa_off; } + + /*New EDE: Define different evolution phases*/ + if (pba->has_NEDE_pert == _TRUE_) { + /*CCa_on: NEDE is decribed as a constant without fluctuations.*/ + /*CCa_off: NEDE is decribed as a fluid with fluctuations.*/ + ppw->approx[ppw->index_ap_CCa] = (int)CCa_on; + + if (pba->has_NEDE_trigger) { + ppw->approx[ppw->index_ap_tfa] = (int)tfa_off; + } + } + if (pba->has_NEDE_pert == _TRUE_) { + /*sda_on: NEDE has decayed sufficiently far that we do not need to track its perturbations. As a conservative condition we use that rho_EDE/rho_tot < 10^(-6).*/ + /*sda_off: NEDE is not yet subdominant and we therefore need to track its perturbations.*/ + ppw->approx[ppw->index_ap_sda] = (int)sda_off; + } } if (_tensors_) { @@ -3413,6 +3463,10 @@ int perturbations_prepare_k_output(struct background * pba, class_store_columntitle(ppt->scalar_titles,"delta_ur",pba->has_ur); class_store_columntitle(ppt->scalar_titles,"theta_ur",pba->has_ur); class_store_columntitle(ppt->scalar_titles,"shear_ur",pba->has_ur); + /* NEDE*/ + class_store_columntitle(ppt->scalar_titles, "delta_NEDE", pba->has_NEDE_pert); + class_store_columntitle(ppt->scalar_titles, "theta_NEDE", pba->has_NEDE_pert); + class_store_columntitle(ppt->scalar_titles, "shear_NEDE", pba->has_NEDE_pert); /* Interacting dark radiation */ class_store_columntitle(ppt->scalar_titles,"delta_idr",pba->has_idr); class_store_columntitle(ppt->scalar_titles,"theta_idr",pba->has_idr); @@ -3447,6 +3501,9 @@ int perturbations_prepare_k_output(struct background * pba, /* Scalar field scf */ class_store_columntitle(ppt->scalar_titles, "delta_scf", pba->has_scf); class_store_columntitle(ppt->scalar_titles, "theta_scf", pba->has_scf); + /* NEDE: Trigger field*/ + class_store_columntitle(ppt->scalar_titles, "delta_trigger", pba->has_NEDE_trigger); + class_store_columntitle(ppt->scalar_titles, "theta_hat_trigger", pba->has_NEDE_trigger); /** Fluid */ class_store_columntitle(ppt->scalar_titles, "delta_rho_fld", pba->has_fld); class_store_columntitle(ppt->scalar_titles, "rho_plus_p_theta_fld", pba->has_fld); @@ -3829,6 +3886,19 @@ int perturbations_find_approximation_switches( fprintf(stdout,"Mode k=%e: will switch on ncdm fluid approximation at tau=%e\n",k,interval_limit[index_switch]); } } + if (pba->has_NEDE_pert == _TRUE_) { + /* Here we check when the phase transition has occurred */ + if ((interval_approx[index_switch - 1][ppw->index_ap_CCa] == (int)CCa_on) && + (interval_approx[index_switch][ppw->index_ap_CCa] == (int)CCa_off)) { + fprintf(stdout, "Mode k=%e: will create decaying NEDE mode at tau=%e\n", k, interval_limit[index_switch]); + } + if (pba->has_NEDE_trigger_DM) { + if ((interval_approx[index_switch - 1][ppw->index_ap_tfa] == (int)tfa_off) && + (interval_approx[index_switch][ppw->index_ap_tfa] == (int)tfa_on)) { + fprintf(stdout, "Mode k=%e: will switch on trigger fluid approximation at tau=%e\n", k, interval_limit[index_switch]); + } + } + } } if (_tensors_) { @@ -4040,6 +4110,31 @@ int perturbations_vector_init( class_define_index(ppv->index_pt_phi_scf,pba->has_scf,index_pt,1); /* scalar field density */ class_define_index(ppv->index_pt_phi_prime_scf,pba->has_scf,index_pt,1); /* scalar field velocity */ + + /* Here we allocate memory for the variables to be integrated depending on NEDE phase */ + if (pba->has_NEDE_pert == _TRUE_) { + if (pba->has_NEDE_trigger == _TRUE_) { + if ((ppw->approx[ppw->index_ap_CCa] == (int)CCa_on) || ((pba->has_NEDE_trigger_DM == _TRUE_) && (ppw->approx[ppw->index_ap_tfa] == (int)tfa_off))) { + /* trigger field density */ + class_define_index(ppv->index_pt_phi_trigger, pba->has_NEDE_trigger, index_pt, 1); + /* trigger field velocity */ + class_define_index(ppv->index_pt_phi_prime_trigger, pba->has_NEDE_trigger, index_pt, 1); + } + else if ((pba->has_NEDE_trigger_DM == _TRUE_) && (ppw->approx[ppw->index_ap_tfa] == (int)tfa_on)) { + class_define_index(ppv->index_pt_delta_trigger_fld, pba->has_NEDE_trigger_DM, index_pt, 1); + class_define_index(ppv->index_pt_theta_trigger_fld, pba->has_NEDE_trigger_DM, index_pt, 1); + } + } + /* NEDE: Only track perturbations in NEDE fluid after decay and before NEDE is highly subdominant */ + if ((ppw->approx[ppw->index_ap_CCa] == (int)CCa_off) && (ppw->approx[ppw->index_ap_sda] == (int)sda_off)) { + /* NEDE pert density */ + class_define_index(ppv->index_pt_delta_NEDE, _TRUE_, index_pt, 1); + /* NEDE pert velocity */ + class_define_index(ppv->index_pt_theta_NEDE, _TRUE_, index_pt, 1); + /* NEDE pert sehar */ + class_define_index(ppv->index_pt_shear_NEDE, _TRUE_, index_pt, 1); + } + } /* perturbed recombination: the indices are defined once tca is off. */ if ( (ppt->has_perturbed_recombination == _TRUE_) && (ppw->approx[ppw->index_ap_tca] == (int)tca_off) ){ @@ -4374,19 +4469,27 @@ int perturbations_vector_init( "scalar initial conditions assume ur fluid approximation turned off"); } - + + /* NEDE: Check that all modes are being initizalized before the transition */ + if (pba->has_NEDE_pert == _TRUE_) { + class_test(ppw->approx[ppw->index_ap_CCa] == (int)CCa_off, + ppt->error_message, + "scalar initial conditions assume that phase transition in NEDE has not yet occurred"); + if (pba->has_NEDE_trigger == _TRUE_) { + class_test(ppw->approx[ppw->index_ap_sda] == (int)sda_on, + ppt->error_message, + "The tag sda_on should only be set after the transition"); + } + } + if (pba->has_ncdm == _TRUE_) { - class_test(ppw->approx[ppw->index_ap_ncdmfa] == (int)ncdmfa_on, ppt->error_message, "scalar initial conditions assume ncdm fluid approximation turned off"); - } - class_test(ppw->approx[ppw->index_ap_tca] == (int)tca_off, ppt->error_message, "scalar initial conditions assume tight-coupling approximation turned on"); - } if (_tensors_) { From 203b01fd903ff772e9ceb11f52f71fd60d6249ce Mon Sep 17 00:00:00 2001 From: EBHolm Date: Tue, 19 Dec 2023 13:45:12 +0100 Subject: [PATCH 18/59] Changes to XCode project --- CLASS.xcodeproj/project.pbxproj | 84 +- .../UserInterfaceState.xcuserstate | Bin 113500 -> 154252 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 1527 ++++++++++++++++- 3 files changed, 1567 insertions(+), 44 deletions(-) diff --git a/CLASS.xcodeproj/project.pbxproj b/CLASS.xcodeproj/project.pbxproj index 1d0413cd7..85b02910b 100644 --- a/CLASS.xcodeproj/project.pbxproj +++ b/CLASS.xcodeproj/project.pbxproj @@ -54,6 +54,36 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 8D7F31462AF25AAF000AB359 /* macros_precision.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = macros_precision.h; sourceTree = ""; }; + 8D7F31472AF25AAF000AB359 /* hermite6_interpolation_csource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = hermite6_interpolation_csource.h; sourceTree = ""; }; + 8D7F31482AF25AAF000AB359 /* input.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = input.h; sourceTree = ""; }; + 8D7F31492AF25AAF000AB359 /* dei_rkck.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = dei_rkck.h; sourceTree = ""; }; + 8D7F314A2AF25AAF000AB359 /* background.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = background.h; sourceTree = ""; }; + 8D7F314B2AF25AAF000AB359 /* quadrature.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = quadrature.h; sourceTree = ""; }; + 8D7F314C2AF25AAF000AB359 /* primordial.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = primordial.h; sourceTree = ""; }; + 8D7F314D2AF25AAF000AB359 /* growTable.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = growTable.h; sourceTree = ""; }; + 8D7F314E2AF25AAF000AB359 /* distortions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = distortions.h; sourceTree = ""; }; + 8D7F314F2AF25AAF000AB359 /* parser.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = parser.h; sourceTree = ""; }; + 8D7F31502AF25AAF000AB359 /* evolver_ndf15.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = evolver_ndf15.h; sourceTree = ""; }; + 8D7F31512AF25AAF000AB359 /* evolver_rkck.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = evolver_rkck.h; sourceTree = ""; }; + 8D7F31522AF25AAF000AB359 /* trigonometric_integrals.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = trigonometric_integrals.h; sourceTree = ""; }; + 8D7F31532AF25AAF000AB359 /* output.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = output.h; sourceTree = ""; }; + 8D7F31542AF25AAF000AB359 /* hermite3_interpolation_csource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = hermite3_interpolation_csource.h; sourceTree = ""; }; + 8D7F31552AF25AAF000AB359 /* lensing.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = lensing.h; sourceTree = ""; }; + 8D7F31562AF25AAF000AB359 /* arrays.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = arrays.h; sourceTree = ""; }; + 8D7F31572AF25AAF000AB359 /* common.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = common.h; sourceTree = ""; }; + 8D7F31582AF25AAF000AB359 /* perturbations.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = perturbations.h; sourceTree = ""; }; + 8D7F31592AF25AAF000AB359 /* class.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = class.h; sourceTree = ""; }; + 8D7F315A2AF25AAF000AB359 /* fourier.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = fourier.h; sourceTree = ""; }; + 8D7F315B2AF25AAF000AB359 /* precisions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = precisions.h; sourceTree = ""; }; + 8D7F315C2AF25AAF000AB359 /* transfer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = transfer.h; sourceTree = ""; }; + 8D7F315D2AF25AAF000AB359 /* svnversion.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = svnversion.h; sourceTree = ""; }; + 8D7F315E2AF25AAF000AB359 /* sparse.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = sparse.h; sourceTree = ""; }; + 8D7F315F2AF25AAF000AB359 /* hyperspherical.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = hyperspherical.h; sourceTree = ""; }; + 8D7F31602AF25AAF000AB359 /* hermite4_interpolation_csource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = hermite4_interpolation_csource.h; sourceTree = ""; }; + 8D7F31612AF25AAF000AB359 /* thermodynamics.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = thermodynamics.h; sourceTree = ""; }; + 8D7F31622AF25AAF000AB359 /* harmonic.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = harmonic.h; sourceTree = ""; }; + 8D7F31632AF27E26000AB359 /* test.ini */ = {isa = PBXFileReference; lastKnownFileType = text; path = test.ini; sourceTree = ""; }; AF089BBD27BD516E004D8CB6 /* distortions.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = distortions.c; sourceTree = ""; }; AF089BC127BD5191004D8CB6 /* history.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = history.c; sourceTree = ""; }; AF089BC327BD5191004D8CB6 /* energy_injection.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = energy_injection.c; sourceTree = ""; }; @@ -112,6 +142,42 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 8D7F31452AF25AAF000AB359 /* include */ = { + isa = PBXGroup; + children = ( + 8D7F31562AF25AAF000AB359 /* arrays.h */, + 8D7F314A2AF25AAF000AB359 /* background.h */, + 8D7F31592AF25AAF000AB359 /* class.h */, + 8D7F31572AF25AAF000AB359 /* common.h */, + 8D7F31492AF25AAF000AB359 /* dei_rkck.h */, + 8D7F314E2AF25AAF000AB359 /* distortions.h */, + 8D7F31502AF25AAF000AB359 /* evolver_ndf15.h */, + 8D7F31512AF25AAF000AB359 /* evolver_rkck.h */, + 8D7F315A2AF25AAF000AB359 /* fourier.h */, + 8D7F314D2AF25AAF000AB359 /* growTable.h */, + 8D7F31622AF25AAF000AB359 /* harmonic.h */, + 8D7F31542AF25AAF000AB359 /* hermite3_interpolation_csource.h */, + 8D7F31602AF25AAF000AB359 /* hermite4_interpolation_csource.h */, + 8D7F31472AF25AAF000AB359 /* hermite6_interpolation_csource.h */, + 8D7F315F2AF25AAF000AB359 /* hyperspherical.h */, + 8D7F31482AF25AAF000AB359 /* input.h */, + 8D7F31552AF25AAF000AB359 /* lensing.h */, + 8D7F31462AF25AAF000AB359 /* macros_precision.h */, + 8D7F31532AF25AAF000AB359 /* output.h */, + 8D7F314F2AF25AAF000AB359 /* parser.h */, + 8D7F31582AF25AAF000AB359 /* perturbations.h */, + 8D7F315B2AF25AAF000AB359 /* precisions.h */, + 8D7F314C2AF25AAF000AB359 /* primordial.h */, + 8D7F314B2AF25AAF000AB359 /* quadrature.h */, + 8D7F315E2AF25AAF000AB359 /* sparse.h */, + 8D7F315D2AF25AAF000AB359 /* svnversion.h */, + 8D7F31612AF25AAF000AB359 /* thermodynamics.h */, + 8D7F315C2AF25AAF000AB359 /* transfer.h */, + 8D7F31522AF25AAF000AB359 /* trigonometric_integrals.h */, + ); + path = include; + sourceTree = ""; + }; AF089BBF27BD5191004D8CB6 /* external */ = { isa = PBXGroup; children = ( @@ -164,6 +230,8 @@ AFDC687D240D9EA00044B5A3 = { isa = PBXGroup; children = ( + 8D7F31632AF27E26000AB359 /* test.ini */, + 8D7F31452AF25AAF000AB359 /* include */, AF089BBF27BD5191004D8CB6 /* external */, AFDC68C0240D9FB80044B5A3 /* main */, AFDC68A6240D9F6B0044B5A3 /* tools */, @@ -185,17 +253,17 @@ AFDC6891240D9F500044B5A3 /* source */ = { isa = PBXGroup; children = ( + AFDC689A240D9F500044B5A3 /* background.c */, + AF089BBD27BD516E004D8CB6 /* distortions.c */, + AFDC6898240D9F500044B5A3 /* fourier.c */, + AFDC6897240D9F500044B5A3 /* harmonic.c */, + AFDC6896240D9F500044B5A3 /* input.c */, AFDC6892240D9F500044B5A3 /* lensing.c */, + AFDC689B240D9F500044B5A3 /* output.c */, AFDC6893240D9F500044B5A3 /* perturbations.c */, - AFDC6894240D9F500044B5A3 /* transfer.c */, - AFDC6895240D9F500044B5A3 /* thermodynamics.c */, - AFDC6896240D9F500044B5A3 /* input.c */, - AFDC6897240D9F500044B5A3 /* harmonic.c */, - AFDC6898240D9F500044B5A3 /* fourier.c */, AFDC6899240D9F500044B5A3 /* primordial.c */, - AFDC689A240D9F500044B5A3 /* background.c */, - AFDC689B240D9F500044B5A3 /* output.c */, - AF089BBD27BD516E004D8CB6 /* distortions.c */, + AFDC6895240D9F500044B5A3 /* thermodynamics.c */, + AFDC6894240D9F500044B5A3 /* transfer.c */, ); path = source; sourceTree = ""; diff --git a/CLASS.xcodeproj/project.xcworkspace/xcuserdata/au566942.xcuserdatad/UserInterfaceState.xcuserstate b/CLASS.xcodeproj/project.xcworkspace/xcuserdata/au566942.xcuserdatad/UserInterfaceState.xcuserstate index a75f9a71e1a57d34b6d215cf34d82edd85d8196c..325c711b28bb2e475609bccef86c860e4482381f 100644 GIT binary patch literal 154252 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 literal 113500 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%0A*G=2=fNrz3 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 NzyJIH{~eXA|6j3#oGAbR diff --git a/CLASS.xcodeproj/xcuserdata/au566942.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/CLASS.xcodeproj/xcuserdata/au566942.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index 73f758c61..61b15351f 100644 --- a/CLASS.xcodeproj/xcuserdata/au566942.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/CLASS.xcodeproj/xcuserdata/au566942.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -4,22 +4,6 @@ type = "1" version = "2.0"> - - - - @@ -46,8 +30,8 @@ filePath = "source/input.c" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "604" - endingLineNumber = "604" + startingLineNumber = "607" + endingLineNumber = "607" landmarkName = "input_shooting(pfc, ppr, pba, pth, ppt, ptr, ppm, phr, pfo, ple, psd, pop, input_verbose, has_shooting, errmsg)" landmarkType = "9"> @@ -62,8 +46,8 @@ filePath = "source/input.c" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "624" - endingLineNumber = "624" + startingLineNumber = "627" + endingLineNumber = "627" landmarkName = "input_shooting(pfc, ppr, pba, pth, ppt, ptr, ppm, phr, pfo, ple, psd, pop, input_verbose, has_shooting, errmsg)" landmarkType = "9"> @@ -78,8 +62,8 @@ filePath = "source/input.c" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "643" - endingLineNumber = "643" + startingLineNumber = "646" + endingLineNumber = "646" landmarkName = "input_shooting(pfc, ppr, pba, pth, ppt, ptr, ppm, phr, pfo, ple, psd, pop, input_verbose, has_shooting, errmsg)" landmarkType = "9"> @@ -94,8 +78,8 @@ filePath = "source/input.c" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "646" - endingLineNumber = "646" + startingLineNumber = "649" + endingLineNumber = "649" landmarkName = "input_shooting(pfc, ppr, pba, pth, ppt, ptr, ppm, phr, pfo, ple, psd, pop, input_verbose, has_shooting, errmsg)" landmarkType = "9"> @@ -110,8 +94,8 @@ filePath = "source/input.c" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "658" - endingLineNumber = "658" + startingLineNumber = "661" + endingLineNumber = "661" landmarkName = "input_shooting(pfc, ppr, pba, pth, ppt, ptr, ppm, phr, pfo, ple, psd, pop, input_verbose, has_shooting, errmsg)" landmarkType = "9"> @@ -152,14 +136,14 @@ BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> @@ -174,8 +158,8 @@ filePath = "source/input.c" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "1285" - endingLineNumber = "1285" + startingLineNumber = "1288" + endingLineNumber = "1288" landmarkName = "input_get_guess(xguess, dxdy, pfzw, errmsg)" landmarkType = "9"> @@ -184,17 +168,1488 @@ BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 665e6044ec0fae7d38fd9ba303f3e7dccea6b4ef Mon Sep 17 00:00:00 2001 From: EBHolm Date: Fri, 5 Jan 2024 10:13:06 +0100 Subject: [PATCH 19/59] Finished perturbations, needs testing --- source/background.c | 2 + source/perturbations.c | 1259 ++++++++++++++++++++++++++++++++++++++-- 2 files changed, 1221 insertions(+), 40 deletions(-) diff --git a/source/background.c b/source/background.c index 4b1eea60a..2eaba0786 100644 --- a/source/background.c +++ b/source/background.c @@ -3138,6 +3138,8 @@ int background_sources( // Turn on NEDE trigger fluid approximation printf("From BG Sources: Turned on FA at a=%g\n", a); pba->a_trigger_fluid = a; + pba->H_fluid = H; + pba->H_prime_fluid = bg_table_row[pba->index_bg_H_prime]; // pba->trigger_fluid_approximation = _TRUE_; return _APPROXIMATION_REACHED_; } diff --git a/source/perturbations.c b/source/perturbations.c index a83964c1d..bc0d3cf6c 100644 --- a/source/perturbations.c +++ b/source/perturbations.c @@ -4717,6 +4717,45 @@ int perturbations_vector_init( } } } + + /*New EDE*/ + /*NEDE and trigger perturbations not affectecd by tight coupling approximation, so we just copy the values from the previous integration step.*/ + + if (pba->has_NEDE_pert == _TRUE_) + { + if ((ppw->approx[ppw->index_ap_sda] == (int)sda_off) && (ppw->approx[ppw->index_ap_CCa] == (int)CCa_off)) + { + ppv->y[ppv->index_pt_delta_NEDE] = + ppw->pv->y[ppw->pv->index_pt_delta_NEDE]; + + ppv->y[ppv->index_pt_theta_NEDE] = + ppw->pv->y[ppw->pv->index_pt_theta_NEDE]; + + ppv->y[ppv->index_pt_shear_NEDE] = + ppw->pv->y[ppw->pv->index_pt_shear_NEDE]; + } + if (pba->has_NEDE_trigger == _TRUE_) + { + if ((ppw->approx[ppw->index_ap_CCa] == (int)CCa_on) || ((pba->has_NEDE_trigger_DM == _TRUE_) && (ppw->approx[ppw->index_ap_tfa] == (int)tfa_off))) + { + + ppv->y[ppv->index_pt_phi_trigger] = + ppw->pv->y[ppw->pv->index_pt_phi_trigger]; + + ppv->y[ppv->index_pt_phi_prime_trigger] = + ppw->pv->y[ppw->pv->index_pt_phi_prime_trigger]; + } + else if ((pba->has_NEDE_trigger_DM == _TRUE_) && (ppw->approx[ppw->index_ap_tfa] == (int)tfa_on)) + { + + ppv->y[ppv->index_pt_delta_trigger_fld] = + ppw->pv->y[ppw->pv->index_pt_delta_trigger_fld]; + + ppv->y[ppv->index_pt_theta_trigger_fld] = + ppw->pv->y[ppw->pv->index_pt_theta_trigger_fld]; + } + } + } /* perturbed recombination */ /* the initial conditions are set when tca is switched off (current block) */ @@ -4786,6 +4825,44 @@ int perturbations_vector_init( } } } + + /*New EDE*/ + /*NEDE and trigger perturbations not affectecd by radiation streaming approximation, so we just copy the values from the previous integration step.*/ + if (pba->has_NEDE_pert == _TRUE_) + { + if ((ppw->approx[ppw->index_ap_sda] == (int)sda_off) && (ppw->approx[ppw->index_ap_CCa] == (int)CCa_off)) + { + ppv->y[ppv->index_pt_delta_NEDE] = + ppw->pv->y[ppw->pv->index_pt_delta_NEDE]; + + ppv->y[ppv->index_pt_theta_NEDE] = + ppw->pv->y[ppw->pv->index_pt_theta_NEDE]; + + ppv->y[ppv->index_pt_shear_NEDE] = + ppw->pv->y[ppw->pv->index_pt_shear_NEDE]; + } + if (pba->has_NEDE_trigger == _TRUE_) + { + if ((ppw->approx[ppw->index_ap_CCa] == (int)CCa_on) || ((pba->has_NEDE_trigger_DM == _TRUE_) && (ppw->approx[ppw->index_ap_tfa] == (int)tfa_off))) + { + + ppv->y[ppv->index_pt_phi_trigger] = + ppw->pv->y[ppw->pv->index_pt_phi_trigger]; + + ppv->y[ppv->index_pt_phi_prime_trigger] = + ppw->pv->y[ppw->pv->index_pt_phi_prime_trigger]; + } + else if ((pba->has_NEDE_trigger_DM == _TRUE_) && (ppw->approx[ppw->index_ap_tfa] == (int)tfa_on)) + { + + ppv->y[ppv->index_pt_delta_trigger_fld] = + ppw->pv->y[ppw->pv->index_pt_delta_trigger_fld]; + + ppv->y[ppv->index_pt_theta_trigger_fld] = + ppw->pv->y[ppw->pv->index_pt_theta_trigger_fld]; + } + } + } } /* -- case of switching on ur fluid @@ -4896,6 +4973,43 @@ int perturbations_vector_init( } } } + /*New EDE*/ + /*EDE and trigger perturbations not affectecd by ur fluid approximation, so we just copy the values from the previous integration step.*/ + if (pba->has_NEDE_pert == _TRUE_) + { + if ((ppw->approx[ppw->index_ap_sda] == (int)sda_off) && (ppw->approx[ppw->index_ap_CCa] == (int)CCa_off)) + { + ppv->y[ppv->index_pt_delta_NEDE] = + ppw->pv->y[ppw->pv->index_pt_delta_NEDE]; + + ppv->y[ppv->index_pt_theta_NEDE] = + ppw->pv->y[ppw->pv->index_pt_theta_NEDE]; + + ppv->y[ppv->index_pt_shear_NEDE] = + ppw->pv->y[ppw->pv->index_pt_shear_NEDE]; + } + if (pba->has_NEDE_trigger == _TRUE_) + { + if ((ppw->approx[ppw->index_ap_CCa] == (int)CCa_on) || ((pba->has_NEDE_trigger_DM == _TRUE_) && (ppw->approx[ppw->index_ap_tfa] == (int)tfa_off))) + { + + ppv->y[ppv->index_pt_phi_trigger] = + ppw->pv->y[ppw->pv->index_pt_phi_trigger]; + + ppv->y[ppv->index_pt_phi_prime_trigger] = + ppw->pv->y[ppw->pv->index_pt_phi_prime_trigger]; + } + else if ((pba->has_NEDE_trigger_DM == _TRUE_) && (ppw->approx[ppw->index_ap_tfa] == (int)tfa_on)) + { + + ppv->y[ppv->index_pt_delta_trigger_fld] = + ppw->pv->y[ppw->pv->index_pt_delta_trigger_fld]; + + ppv->y[ppv->index_pt_theta_trigger_fld] = + ppw->pv->y[ppw->pv->index_pt_theta_trigger_fld]; + } + } + } } } @@ -4990,7 +5104,43 @@ int perturbations_vector_init( } } } + /*New EDE*/ + /*NEDE and trigger perturbations not affectecd by this approximation, so we just copy the values from the previous integration step.*/ + if (pba->has_NEDE_pert == _TRUE_) + { + if ((ppw->approx[ppw->index_ap_sda] == (int)sda_off) && (ppw->approx[ppw->index_ap_CCa] == (int)CCa_off)) + { + ppv->y[ppv->index_pt_delta_NEDE] = + ppw->pv->y[ppw->pv->index_pt_delta_NEDE]; + + ppv->y[ppv->index_pt_theta_NEDE] = + ppw->pv->y[ppw->pv->index_pt_theta_NEDE]; + + ppv->y[ppv->index_pt_shear_NEDE] = + ppw->pv->y[ppw->pv->index_pt_shear_NEDE]; + } + if (pba->has_NEDE_trigger == _TRUE_) + { + if ((ppw->approx[ppw->index_ap_CCa] == (int)CCa_on) || ((pba->has_NEDE_trigger_DM == _TRUE_) && (ppw->approx[ppw->index_ap_tfa] == (int)tfa_off))) + { + + ppv->y[ppv->index_pt_phi_trigger] = + ppw->pv->y[ppw->pv->index_pt_phi_trigger]; + ppv->y[ppv->index_pt_phi_prime_trigger] = + ppw->pv->y[ppw->pv->index_pt_phi_prime_trigger]; + } + else if ((pba->has_NEDE_trigger_DM == _TRUE_) && (ppw->approx[ppw->index_ap_tfa] == (int)tfa_on)) + { + + ppv->y[ppv->index_pt_delta_trigger_fld] = + ppw->pv->y[ppw->pv->index_pt_delta_trigger_fld]; + + ppv->y[ppv->index_pt_theta_trigger_fld] = + ppw->pv->y[ppw->pv->index_pt_theta_trigger_fld]; + } + } + } } } @@ -5102,6 +5252,44 @@ int perturbations_vector_init( } } } + /*New EDE*/ + /*NEDE and trigger perturbations not affectecd by ur fluid approximation, so we just copy the values from the previous integration step.*/ + if (pba->has_NEDE_pert == _TRUE_) + { + if ((ppw->approx[ppw->index_ap_sda] == (int)sda_off) && (ppw->approx[ppw->index_ap_CCa] == (int)CCa_off)) + { + ppv->y[ppv->index_pt_delta_NEDE] = + ppw->pv->y[ppw->pv->index_pt_delta_NEDE]; + + ppv->y[ppv->index_pt_theta_NEDE] = + ppw->pv->y[ppw->pv->index_pt_theta_NEDE]; + + ppv->y[ppv->index_pt_shear_NEDE] = + ppw->pv->y[ppw->pv->index_pt_shear_NEDE]; + } + + if (pba->has_NEDE_trigger == _TRUE_) + { + if ((ppw->approx[ppw->index_ap_CCa] == (int)CCa_on) || ((pba->has_NEDE_trigger_DM == _TRUE_) && (ppw->approx[ppw->index_ap_tfa] == (int)tfa_off))) + { + + ppv->y[ppv->index_pt_phi_trigger] = + ppw->pv->y[ppw->pv->index_pt_phi_trigger]; + + ppv->y[ppv->index_pt_phi_prime_trigger] = + ppw->pv->y[ppw->pv->index_pt_phi_prime_trigger]; + } + else if ((pba->has_NEDE_trigger_DM == _TRUE_) && (ppw->approx[ppw->index_ap_tfa] == (int)tfa_on)) + { + + ppv->y[ppv->index_pt_delta_trigger_fld] = + ppw->pv->y[ppw->pv->index_pt_delta_trigger_fld]; + + ppv->y[ppv->index_pt_theta_trigger_fld] = + ppw->pv->y[ppw->pv->index_pt_theta_trigger_fld]; + } + } + } } } @@ -5212,6 +5400,44 @@ int perturbations_vector_init( } } } + + /*New EDE*/ + /*NEDE and trigger perturbations not affectecd by ncdm fluid approximation, so we just copy the values from the previous integration step.*/ + if (pba->has_NEDE_pert == _TRUE_) + { + if ((ppw->approx[ppw->index_ap_sda] == (int)sda_off) && (ppw->approx[ppw->index_ap_CCa] == (int)CCa_off)) + { + ppv->y[ppv->index_pt_delta_NEDE] = + ppw->pv->y[ppw->pv->index_pt_delta_NEDE]; + + ppv->y[ppv->index_pt_theta_NEDE] = + ppw->pv->y[ppw->pv->index_pt_theta_NEDE]; + + ppv->y[ppv->index_pt_shear_NEDE] = + ppw->pv->y[ppw->pv->index_pt_shear_NEDE]; + } + if (pba->has_NEDE_trigger == _TRUE_) + { + if ((ppw->approx[ppw->index_ap_CCa] == (int)CCa_on) || ((pba->has_NEDE_trigger_DM == _TRUE_) && (ppw->approx[ppw->index_ap_tfa] == (int)tfa_off))) + { + + ppv->y[ppv->index_pt_phi_trigger] = + ppw->pv->y[ppw->pv->index_pt_phi_trigger]; + + ppv->y[ppv->index_pt_phi_prime_trigger] = + ppw->pv->y[ppw->pv->index_pt_phi_prime_trigger]; + } + else if ((pba->has_NEDE_trigger_DM == _TRUE_) && (ppw->approx[ppw->index_ap_tfa] == (int)tfa_on)) + { + + ppv->y[ppv->index_pt_delta_trigger_fld] = + ppw->pv->y[ppw->pv->index_pt_delta_trigger_fld]; + + ppv->y[ppv->index_pt_theta_trigger_fld] = + ppw->pv->y[ppw->pv->index_pt_theta_trigger_fld]; + } + } + } a = ppw->pvecback[pba->index_bg_a]; @@ -5251,6 +5477,586 @@ int perturbations_vector_init( } } } + + /*New EDE*/ + /*Here we set the initial conditions for all our NEDE fluid modes / note that all other sectors are unaffected. */ + if (pba->has_NEDE_pert == _TRUE_) + { + if ((pa_old[ppw->index_ap_CCa] == (int)CCa_on) && (ppw->approx[ppw->index_ap_CCa] == (int)CCa_off)) + { + + if (ppt->perturbations_verbose > 2) + fprintf(stdout, "Mode k=%e: initialize decaying EDE mode at tau=%e\n", k, tau); + + if (ppw->approx[ppw->index_ap_rsa] == (int)rsa_off) + { + + ppv->y[ppv->index_pt_delta_g] = + ppw->pv->y[ppw->pv->index_pt_delta_g]; + + ppv->y[ppv->index_pt_theta_g] = + ppw->pv->y[ppw->pv->index_pt_theta_g]; + } + + if ((ppw->approx[ppw->index_ap_tca] == (int)tca_off) && (ppw->approx[ppw->index_ap_rsa] == (int)rsa_off)) + { + + ppv->y[ppv->index_pt_shear_g] = + ppw->pv->y[ppw->pv->index_pt_shear_g]; + + ppv->y[ppv->index_pt_l3_g] = + ppw->pv->y[ppw->pv->index_pt_l3_g]; + + for (l = 4; l <= ppw->pv->l_max_g; l++) + { + + ppv->y[ppv->index_pt_delta_g + l] = + ppw->pv->y[ppw->pv->index_pt_delta_g + l]; + } + + ppv->y[ppv->index_pt_pol0_g] = + ppw->pv->y[ppw->pv->index_pt_pol0_g]; + + ppv->y[ppv->index_pt_pol1_g] = + ppw->pv->y[ppw->pv->index_pt_pol1_g]; + + ppv->y[ppv->index_pt_pol2_g] = + ppw->pv->y[ppw->pv->index_pt_pol2_g]; + + ppv->y[ppv->index_pt_pol3_g] = + ppw->pv->y[ppw->pv->index_pt_pol3_g]; + + for (l = 4; l <= ppw->pv->l_max_pol_g; l++) + { + + ppv->y[ppv->index_pt_pol0_g + l] = + ppw->pv->y[ppw->pv->index_pt_pol0_g + l]; + } + } + + if (pba->has_ur == _TRUE_) + { + + if (ppw->approx[ppw->index_ap_rsa] == (int)rsa_off) + { + + ppv->y[ppv->index_pt_delta_ur] = + ppw->pv->y[ppw->pv->index_pt_delta_ur]; + + ppv->y[ppv->index_pt_theta_ur] = + ppw->pv->y[ppw->pv->index_pt_theta_ur]; + + ppv->y[ppv->index_pt_shear_ur] = + ppw->pv->y[ppw->pv->index_pt_shear_ur]; + + if (ppw->approx[ppw->index_ap_ufa] == (int)ufa_off) + { + + ppv->y[ppv->index_pt_l3_ur] = + ppw->pv->y[ppw->pv->index_pt_l3_ur]; + + for (l = 4; l <= ppv->l_max_ur; l++) + ppv->y[ppv->index_pt_delta_ur + l] = + ppw->pv->y[ppw->pv->index_pt_delta_ur + l]; + } + } + } + + if (pba->has_idr == _TRUE_) + { + + if (ppw->approx[ppw->index_ap_rsa_idr] == (int)rsa_idr_off) + { + + ppv->y[ppv->index_pt_delta_idr] = + ppw->pv->y[ppw->pv->index_pt_delta_idr]; + + ppv->y[ppv->index_pt_theta_idr] = + ppw->pv->y[ppw->pv->index_pt_theta_idr]; + + if (ppt->idr_nature == idr_free_streaming) + { + + if ((ppt->has_idm_dr == _FALSE_) || ((ppt->has_idm_dr == _TRUE_) && (ppw->approx[ppw->index_ap_tca_idm_dr] == (int)tca_idm_dr_off))) + { + + ppv->y[ppv->index_pt_shear_idr] = + ppw->pv->y[ppw->pv->index_pt_shear_idr]; + + ppv->y[ppv->index_pt_l3_idr] = + ppw->pv->y[ppw->pv->index_pt_l3_idr]; + + for (l = 4; l <= ppv->l_max_idr; l++) + ppv->y[ppv->index_pt_delta_idr + l] = + ppw->pv->y[ppw->pv->index_pt_delta_idr + l]; + } + } + } + } + + /*New EDE*/ /*important*/ + /*Here, we set the matching conditions for EDE perturbations: before transition perturbations are zero and after transition they start with value set by fluctuation in transition surface / see Israel's equations in our paper*/ + + /*Nothing needs to be done if NEDE is exremly subdominant*/ + if (ppw->approx[ppw->index_ap_sda] == (int)sda_off) + { + a = ppw->pvecback[pba->index_bg_a]; + double a_prime_over_a = ppw->pvecback[pba->index_bg_H] * a; + double w_NEDE, dw_over_da_NEDE; + double delta_phi_over_phi_prime, amp_rel, sigma_NEDE; + + class_call(background_quantities_NEDE(pba, a, a_prime_over_a, NULL, NULL, &w_NEDE, &dw_over_da_NEDE, NULL), + pba->error_message, + pba->error_message); + + if (pba->has_NEDE_trigger == _TRUE_) + delta_phi_over_phi_prime = ppw->pv->y[ppw->pv->index_pt_phi_trigger] / (ppw->pvecback[pba->index_bg_phi_prime_trigger]); + else + delta_phi_over_phi_prime = 0; // In absence of scalar field we use trivial junction conditions as there is no better choice available. This case is not used. + + if (pba->Junction_tag == 0) + { + // Here we use trivial mathcing conditions only to study their relevance. Not used for NEDE runs. + amp_rel = 0.0; + sigma_NEDE = 0.0; + } + else if (pba->Junction_tag == 1) + { + // standard case for NEDE + amp_rel = 1.; + sigma_NEDE = 0.0; + } + + // printf("k: %f, aH: %f, h': %f, eta': %f, alpha1: %f, alpha2: %f \n",k,a_prime_over_a ,ppw->pvecmetric[ppw->index_mt_h_prime],ppw->pvecmetric[ppw->index_mt_eta_prime],(ppw->pvecmetric[ppw->index_mt_h_prime] + 6.0*ppw->pvecmetric[ppw->index_mt_eta_prime])/(2.0 *k*k),ppw->pvecmetric[ppw->index_mt_alpha]); + + /* Junction conditions, derived in 2006.06686*/ + ppv->y[ppv->index_pt_delta_NEDE] = -(3. + 3. * w_NEDE) * amp_rel * a_prime_over_a * delta_phi_over_phi_prime; + + ppv->y[ppv->index_pt_theta_NEDE] = -1. / (3. + 3. * w_NEDE) * k * k / a_prime_over_a * ppv->y[ppv->index_pt_delta_NEDE]; + // if (k<0.04 && k>0.03) + // printf("v1: %f, v2: %f, v3: %E",k,ppw->pv->y[ppw->pv->index_pt_phi_scf], ppw->pvecback[pba->index_bg_phi_prime_scf]); + + // printf("z: %f and k: %f and delta_NEDE: %f and theta_EDE: %f \n",1./a-1,k,ppv->y[ppv->index_pt_delta_NEDE],ppv->y[ppv->index_pt_theta_EDE]); + + ppv->y[ppv->index_pt_shear_NEDE] = sigma_NEDE; + } + /* New EDE */ /*Trigger field evolution stops at transition, no values need to be copied unless the trigger is not sub-dominant.*/ + + if (pba->has_NEDE_trigger_DM == _TRUE_) + { + if (ppw->approx[ppw->index_ap_tfa] == (int)tfa_off) + { + ppv->y[ppv->index_pt_phi_trigger] = + ppw->pv->y[ppw->pv->index_pt_phi_trigger]; + + ppv->y[ppv->index_pt_phi_prime_trigger] = + ppw->pv->y[ppw->pv->index_pt_phi_prime_trigger]; + } + else if (ppw->approx[ppw->index_ap_tfa] == (int)tfa_on) + { + ppv->y[ppv->index_pt_delta_trigger_fld] = + ppw->pv->y[ppw->pv->index_pt_delta_trigger_fld]; + + ppv->y[ppv->index_pt_theta_trigger_fld] = + ppw->pv->y[ppw->pv->index_pt_theta_trigger_fld]; + } + } + + if (pba->has_ncdm == _TRUE_) + { + index_pt = 0; + for (n_ncdm = 0; n_ncdm < ppv->N_ncdm; n_ncdm++) + { + for (index_q = 0; index_q < ppv->q_size_ncdm[n_ncdm]; index_q++) + { + for (l = 0; l <= ppv->l_max_ncdm[n_ncdm]; l++) + { + /* This is correct even when ncdmfa == off, since ppv->l_max_ncdm and + ppv->q_size_ncdm is updated.*/ + ppv->y[ppv->index_pt_psi0_ncdm1 + index_pt] = + ppw->pv->y[ppw->pv->index_pt_psi0_ncdm1 + index_pt]; + index_pt++; + } + } + } + } + } + + /*New EDE: Here we stop tracking the evolution of NEDE + perturbations as the NEDE fluid has becomes sufficiently suppressed.*/ + if ((pa_old[ppw->index_ap_sda] == (int)sda_off) && (ppw->approx[ppw->index_ap_sda] == (int)sda_on)) + { + + if (ppt->perturbations_verbose > 2) + fprintf(stdout, "Stop tracking EDE mode k=%e at tau=%e\n", k, tau); + + if (ppw->approx[ppw->index_ap_rsa] == (int)rsa_off) + { + + ppv->y[ppv->index_pt_delta_g] = + ppw->pv->y[ppw->pv->index_pt_delta_g]; + + ppv->y[ppv->index_pt_theta_g] = + ppw->pv->y[ppw->pv->index_pt_theta_g]; + } + if ((ppw->approx[ppw->index_ap_tca] == (int)tca_off) && (ppw->approx[ppw->index_ap_rsa] == (int)rsa_off)) + { + + ppv->y[ppv->index_pt_shear_g] = + ppw->pv->y[ppw->pv->index_pt_shear_g]; + + ppv->y[ppv->index_pt_l3_g] = + ppw->pv->y[ppw->pv->index_pt_l3_g]; + + for (l = 4; l <= ppw->pv->l_max_g; l++) + { + + ppv->y[ppv->index_pt_delta_g + l] = + ppw->pv->y[ppw->pv->index_pt_delta_g + l]; + } + + ppv->y[ppv->index_pt_pol0_g] = + ppw->pv->y[ppw->pv->index_pt_pol0_g]; + + ppv->y[ppv->index_pt_pol1_g] = + ppw->pv->y[ppw->pv->index_pt_pol1_g]; + + ppv->y[ppv->index_pt_pol2_g] = + ppw->pv->y[ppw->pv->index_pt_pol2_g]; + + ppv->y[ppv->index_pt_pol3_g] = + ppw->pv->y[ppw->pv->index_pt_pol3_g]; + + for (l = 4; l <= ppw->pv->l_max_pol_g; l++) + { + + ppv->y[ppv->index_pt_pol0_g + l] = + ppw->pv->y[ppw->pv->index_pt_pol0_g + l]; + } + } + + if (pba->has_ur == _TRUE_) + { + + if (ppw->approx[ppw->index_ap_rsa] == (int)rsa_off) + { + + ppv->y[ppv->index_pt_delta_ur] = + ppw->pv->y[ppw->pv->index_pt_delta_ur]; + + ppv->y[ppv->index_pt_theta_ur] = + ppw->pv->y[ppw->pv->index_pt_theta_ur]; + + ppv->y[ppv->index_pt_shear_ur] = + ppw->pv->y[ppw->pv->index_pt_shear_ur]; + + if (ppw->approx[ppw->index_ap_ufa] == (int)ufa_off) + { + + ppv->y[ppv->index_pt_l3_ur] = + ppw->pv->y[ppw->pv->index_pt_l3_ur]; + + for (l = 4; l <= ppv->l_max_ur; l++) + ppv->y[ppv->index_pt_delta_ur + l] = + ppw->pv->y[ppw->pv->index_pt_delta_ur + l]; + } + } + } + + if (pba->has_idr == _TRUE_) + { + + if (ppw->approx[ppw->index_ap_rsa_idr] == (int)rsa_idr_off) + { + + ppv->y[ppv->index_pt_delta_idr] = + ppw->pv->y[ppw->pv->index_pt_delta_idr]; + + ppv->y[ppv->index_pt_theta_idr] = + ppw->pv->y[ppw->pv->index_pt_theta_idr]; + + if (ppt->idr_nature == idr_free_streaming) + { + + if ((ppt->has_idm_dr == _FALSE_) || ((ppt->has_idm_dr == _TRUE_) && (ppw->approx[ppw->index_ap_tca_idm_dr] == (int)tca_idm_dr_off))) + { + + ppv->y[ppv->index_pt_shear_idr] = + ppw->pv->y[ppw->pv->index_pt_shear_idr]; + + ppv->y[ppv->index_pt_l3_idr] = + ppw->pv->y[ppw->pv->index_pt_l3_idr]; + + for (l = 4; l <= ppv->l_max_idr; l++) + ppv->y[ppv->index_pt_delta_idr + l] = + ppw->pv->y[ppw->pv->index_pt_delta_idr + l]; + } + } + } + } + + if (pba->has_ncdm == _TRUE_) + { + index_pt = 0; + for (n_ncdm = 0; n_ncdm < ppv->N_ncdm; n_ncdm++) + { + for (index_q = 0; index_q < ppv->q_size_ncdm[n_ncdm]; index_q++) + { + for (l = 0; l <= ppv->l_max_ncdm[n_ncdm]; l++) + { + /* This is correct even when ncdmfa == off, since ppv->l_max_ncdm and ppv->q_size_ncdm is updated.*/ + ppv->y[ppv->index_pt_psi0_ncdm1 + index_pt] = + ppw->pv->y[ppw->pv->index_pt_psi0_ncdm1 + index_pt]; + index_pt++; + } + } + } + } + + /* We still track the trigger if we are in the trigger DM scenario.*/ + + if (pba->has_NEDE_trigger_DM == _TRUE_) + { + if (ppw->approx[ppw->index_ap_tfa] == (int)tfa_off) + { + ppv->y[ppv->index_pt_phi_trigger] = + ppw->pv->y[ppw->pv->index_pt_phi_trigger]; + + ppv->y[ppv->index_pt_phi_prime_trigger] = + ppw->pv->y[ppw->pv->index_pt_phi_prime_trigger]; + } + else if (ppw->approx[ppw->index_ap_tfa] == (int)tfa_on) + { + ppv->y[ppv->index_pt_delta_trigger_fld] = + ppw->pv->y[ppw->pv->index_pt_delta_trigger_fld]; + + ppv->y[ppv->index_pt_theta_trigger_fld] = + ppw->pv->y[ppw->pv->index_pt_theta_trigger_fld]; + } + } + } + + /* -- case of switching on trigger fluid + approximation. Provide correct initial conditions to new set + of variables */ + + if (pba->has_NEDE_trigger_DM == _TRUE_) + { + + if ((pa_old[ppw->index_ap_tfa] == (int)tfa_off) && (ppw->approx[ppw->index_ap_tfa] == (int)tfa_on)) + { + + if (ppt->perturbations_verbose > 2) + fprintf(stdout, "Mode k=%e: switch on trigger fluid approximation at tau=%e\n", k, tau); + + if (ppw->approx[ppw->index_ap_rsa] == (int)rsa_off) + { + + ppv->y[ppv->index_pt_delta_g] = + ppw->pv->y[ppw->pv->index_pt_delta_g]; + + ppv->y[ppv->index_pt_theta_g] = + ppw->pv->y[ppw->pv->index_pt_theta_g]; + } + + if ((ppw->approx[ppw->index_ap_tca] == (int)tca_off) && (ppw->approx[ppw->index_ap_rsa] == (int)rsa_off)) + { + + ppv->y[ppv->index_pt_shear_g] = + ppw->pv->y[ppw->pv->index_pt_shear_g]; + + ppv->y[ppv->index_pt_l3_g] = + ppw->pv->y[ppw->pv->index_pt_l3_g]; + + for (l = 4; l <= ppw->pv->l_max_g; l++) + { + + ppv->y[ppv->index_pt_delta_g + l] = + ppw->pv->y[ppw->pv->index_pt_delta_g + l]; + } + + ppv->y[ppv->index_pt_pol0_g] = + ppw->pv->y[ppw->pv->index_pt_pol0_g]; + + ppv->y[ppv->index_pt_pol1_g] = + ppw->pv->y[ppw->pv->index_pt_pol1_g]; + + ppv->y[ppv->index_pt_pol2_g] = + ppw->pv->y[ppw->pv->index_pt_pol2_g]; + + ppv->y[ppv->index_pt_pol3_g] = + ppw->pv->y[ppw->pv->index_pt_pol3_g]; + + for (l = 4; l <= ppw->pv->l_max_pol_g; l++) + { + + ppv->y[ppv->index_pt_pol0_g + l] = + ppw->pv->y[ppw->pv->index_pt_pol0_g + l]; + } + } + + if (pba->has_ur == _TRUE_) + { + + if (ppw->approx[ppw->index_ap_rsa] == (int)rsa_off) + { + + ppv->y[ppv->index_pt_delta_ur] = + ppw->pv->y[ppw->pv->index_pt_delta_ur]; + + ppv->y[ppv->index_pt_theta_ur] = + ppw->pv->y[ppw->pv->index_pt_theta_ur]; + + ppv->y[ppv->index_pt_shear_ur] = + ppw->pv->y[ppw->pv->index_pt_shear_ur]; + + if (ppw->approx[ppw->index_ap_ufa] == (int)ufa_off) + { + + ppv->y[ppv->index_pt_l3_ur] = + ppw->pv->y[ppw->pv->index_pt_l3_ur]; + + for (l = 4; l <= ppv->l_max_ur; l++) + ppv->y[ppv->index_pt_delta_ur + l] = + ppw->pv->y[ppw->pv->index_pt_delta_ur + l]; + } + } + } + + /*New EDE*/ + /*NEDE fluid perturbations not affectecd by trigger fluid approximation, so we just copy the values from the previous integration step.*/ + if (pba->has_NEDE_pert == _TRUE_) + { + + if ((ppw->approx[ppw->index_ap_sda] == (int)sda_off) && (ppw->approx[ppw->index_ap_CCa] == (int)CCa_off)) + { + ppv->y[ppv->index_pt_delta_NEDE] = + ppw->pv->y[ppw->pv->index_pt_delta_NEDE]; + + ppv->y[ppv->index_pt_theta_NEDE] = + ppw->pv->y[ppw->pv->index_pt_theta_NEDE]; + + ppv->y[ppv->index_pt_shear_NEDE] = + ppw->pv->y[ppw->pv->index_pt_shear_NEDE]; + } + + // New EDE: Here we do the matching for he NEDE trigger field perturbations when the fluid approximation starts. + a = ppw->pvecback[pba->index_bg_a]; + // double a_prime_over_a = ppw->pvecback[pba->index_bg_H] * a; + // double a2 = a * a; + // double k2 = k * k; + + // printf("k: %f, ma: %f , naive delta-rho: %e, average: %e,m cs: %e, x: %e \n", k, pba->NEDE_trigger_mass * a, delta_rho_trigger, ppw->pv->y[ppw->pv->index_pt_delta_trigger_cycle_integral] / ppw->pv->y[ppw->pv->index_pt_theta_hat_t_trigger_cycle_integral], cs2_trigger, ppw->pv->y[ppw->pv->index_pt_phi_trigger]); + + // We use the description proposed in arXiv:2201.10238 //stop2 + + double phi_fluid = ppw->pvecback[pba->index_bg_phi_trigger]; + double phi_prime_fluid = ppw->pvecback[pba->index_bg_phi_prime_trigger]; + + double hL_prime = ppw->pvecmetric[ppw->index_mt_h_prime]; + + double delta_phi_fluid = ppw->pv->y[ppw->pv->index_pt_phi_trigger]; + double delta_phi_prime_fluid = ppw->pv->y[ppw->pv->index_pt_phi_prime_trigger]; + + double H = pba->H_fluid; // ppw->pvecback[pba->index_bg_H]; + double H_prime = pba->H_prime_fluid; // ppw->pvecback[pba->index_bg_H_prime]; + double m = pba->NEDE_trigger_mass; + + // printf("m: %e, H: %e, H_prime %e, hL_prime: %e, a: %e,k: %e, phi_fluid: %e, phi_prime_fluid: %e, delta_phi_fluid: %e, delta_phi_prime_fluid: %e \n",m, H, H_prime,hL_prime,a, k, phi_fluid,phi_prime_fluid,delta_phi_fluid,delta_phi_prime_fluid); + + double fac = 6.0 * pow(H, 2) / (9.0 * pow(H, 4) - 4 * (4 * pow(H, 2) * pow(m, 2) + pow(H_prime, 2) / pow(a, 2))); + + double phi_c_p = fac * (4.0 * H * m * phi_fluid + 3.0 * pow(H, 2) * phi_prime_fluid / a / m + 2.0 * H_prime * phi_prime_fluid / pow(a, 2) / m); + + double phi_s_p = fac * (3.0 * pow(H, 2) * phi_fluid - 2.0 * H_prime / a * phi_fluid + 4.0 * H * phi_prime_fluid / a); + + double phi_c = phi_fluid; + + double phi_s = phi_prime_fluid / a / m - phi_c_p; + + double delta_phi_c_p = H / (-8.0 * pow(H * k, 2) * m + a * a * m * (9 * pow(H, 4) - 4.0 * (4.0 * pow(H * m, 2) + pow(H_prime / a, 2)))) * (2.0 * k * k * (3.0 * H * H * delta_phi_fluid + 2.0 * H_prime / a * delta_phi_fluid - 4.0 * H * delta_phi_prime_fluid / a) + a * a * m * (2.0 * hL_prime / a * H_prime / a * (phi_c_p + phi_s) + 3.0 * H * H * m * (hL_prime / a / m * (phi_c_p + phi_s) + 8.0 * delta_phi_fluid) + 18.0 * pow(H, 3) * delta_phi_prime_fluid / a / m + 4.0 * H * m * (hL_prime / a * (phi_c - phi_s_p) + 3.0 * H_prime / a / m * delta_phi_prime_fluid / a / m))); + + double delta_phi_s_p = -H / pow(a, 2) / m / (-8.0 * pow(H * k, 2) * m + a * a * m * (9.0 * pow(H, 4) - 4.0 * (4.0 * pow(H * m, 2) + pow(H_prime / a, 2)))) * (-4.0 * H * pow(k, 4) * delta_phi_fluid - 2.0 * pow(a * k, 2) * m * (H * m * (hL_prime / a / m * (phi_c_p + phi_s) + 4.0 * delta_phi_fluid) + 3.0 * pow(H, 2) * delta_phi_prime_fluid / a / m + 2.0 * H_prime / a * delta_phi_prime_fluid / a / m) - pow(a * a * m, 2) * (2.0 * hL_prime / a * H_prime / a * (-phi_c + phi_s_p) + 18.0 * pow(H, 3) * delta_phi_fluid + 4.0 * H * m * (hL_prime / a * (phi_c_p + phi_s) - 3.0 * H_prime / a / m * delta_phi_fluid) + 3.0 * H * H * m * (hL_prime / a / m * phi_c - hL_prime / a / m * phi_s_p + 8.0 * delta_phi_prime_fluid / a / m))); + + double delta_phi_c = delta_phi_fluid; + + double delta_phi_s = delta_phi_prime_fluid / a / m - delta_phi_c_p; + + double delta_rho_trigger = 0.5 * m * m * (phi_s * delta_phi_c_p - phi_c * delta_phi_s_p + delta_phi_c_p * phi_c_p + delta_phi_s_p * phi_s_p + delta_phi_s * (2.0 * phi_s + phi_c_p) + delta_phi_c * (2.0 * phi_c - phi_s_p)); + delta_rho_trigger = delta_rho_trigger / 3.0; // CLASS convention! + + double rho_plus_p_theta_trigger_fld = k * k * m / (2.0 * a) * (delta_phi_c * (phi_s + phi_c_p) + delta_phi_s * (-phi_c + phi_s_p)); + rho_plus_p_theta_trigger_fld = rho_plus_p_theta_trigger_fld / 3.0; // CLASS convention! + + double rho_tfa = 0.5 * pow(m, 2) * (phi_c * phi_c + phi_s * phi_s + 0.5 * (phi_c_p * phi_c_p + phi_s_p * phi_s_p) - phi_c * phi_s_p + phi_s * phi_c_p); + rho_tfa = rho_tfa / 3.0; // CLASS convention! + + double p_tfa = 0.5 * pow(m, 2) * (phi_c_p * phi_c_p / 2.0 + phi_s_p * phi_s_p / 2.0 - phi_c * phi_s_p + phi_s * phi_c_p); + p_tfa = p_tfa / 3.0; // CLASS convention! + + // printf("delta_phi_c: %e, delta_phi_s: %e, delta_phi_c_p: %e, delta_phi_s_p: %e, delta_rho_trigger: %e, rho_plus_p_theta_trigger_fld: %e, rho_tfa: %e,p_tfa: %e, phi_c: %e, phi_s: %e, phi_c_p: %e, phi_s_p: %e \n",delta_phi_c,delta_phi_s,delta_phi_c_p,delta_phi_s_p, delta_rho_trigger,rho_plus_p_theta_trigger_fld,rho_tfa,p_tfa,phi_c,phi_s,phi_c_p, phi_s_p); + + ppv->y[ppv->index_pt_delta_trigger_fld] = delta_rho_trigger / rho_tfa; + ppv->y[ppv->index_pt_theta_trigger_fld] = rho_plus_p_theta_trigger_fld / (rho_tfa + p_tfa); + + // printf("tau: %f, H: %e, a: %e, H_prime: %e ,factor: %e, rho_tfa:%e , p_tfa: %e\n",tau,H,a,H_prime, fac,rho_tfa, p_tfa); + // printf("delta_rho_old: %e, delta_rho_Hu: %e, Theta: %e, Theta Hu: %e \n",ppv->y[ppv->index_pt_delta_trigger_fld]*ppw->pvecback[pba->index_bg_rho_trigger],delta_rho_trigger,ppw->pv->y[ppw->pv->index_pt_theta_hat_trigger_cycle_integral] / (pba->tau_trigger_fluid - pba->tau_trigger_average_start)*ppw->pvecback[pba->index_bg_rho_trigger],rho_plus_p_theta_trigger_fld); + // printf("k: %f, aH: %f, h': %f, eta': %e, alpha1: %f, alpha2: %f \n",k,a_prime_over_a ,ppw->pvecmetric[ppw->index_mt_h_prime],ppw->pvecmetric[ppw->index_mt_eta_prime]/tau,(ppw->pvecmetric[ppw->index_mt_h_prime] + 6.0*ppw->pvecmetric[ppw->index_mt_eta_prime])/(2.0 *k*k),ppw->pvecmetric[ppw->index_mt_alpha]); + + } + + if (pba->has_idr == _TRUE_) + { + if (ppw->approx[ppw->index_ap_rsa_idr] == (int)rsa_idr_off) + { + + ppv->y[ppv->index_pt_delta_idr] = + ppw->pv->y[ppw->pv->index_pt_delta_idr]; + + ppv->y[ppv->index_pt_theta_idr] = + ppw->pv->y[ppw->pv->index_pt_theta_idr]; + + if (ppt->idr_nature == idr_free_streaming) + { + + if ((ppt->has_idm_dr == _FALSE_) || ((ppt->has_idm_dr == _TRUE_) && (ppw->approx[ppw->index_ap_tca_idm_dr] == (int)tca_idm_dr_off))) + { + + ppv->y[ppv->index_pt_shear_idr] = + ppw->pv->y[ppw->pv->index_pt_shear_idr]; + + ppv->y[ppv->index_pt_l3_idr] = + ppw->pv->y[ppw->pv->index_pt_l3_idr]; + + for (l = 4; l <= ppv->l_max_idr; l++) + ppv->y[ppv->index_pt_delta_idr + l] = + ppw->pv->y[ppw->pv->index_pt_delta_idr + l]; + } + } + } + } + + if (pba->has_ncdm == _TRUE_) + { + index_pt = 0; + for (n_ncdm = 0; n_ncdm < ppv->N_ncdm; n_ncdm++) + { + for (index_q = 0; index_q < ppv->q_size_ncdm[n_ncdm]; index_q++) + { + for (l = 0; l <= ppv->l_max_ncdm[n_ncdm]; l++) + { + /* This is correct even when ncdmfa == off, since ppv->l_max_ncdm and + ppv->q_size_ncdm is updated.*/ + ppv->y[ppv->index_pt_psi0_ncdm1 + index_pt] = + ppw->pv->y[ppw->pv->index_pt_psi0_ncdm1 + index_pt]; + index_pt++; + } + } + } + } + } + } + } } /** - --> (b) for the vector mode */ @@ -5678,6 +6484,22 @@ int perturbations_initial_conditions(struct precision * ppr, /* delta_fld expression * rho_scf with the w = 1/3, c_s = 1 a*a/ppw->pvecback[pba->index_bg_phi_prime_scf]*( - ktau_two/4.*(1.+1./3.)*(4.-3.*1.)/(4.-6.*(1/3.)+3.*1.)*ppw->pvecback[pba->index_bg_rho_scf] - ppw->pvecback[pba->index_bg_dV_scf]*ppw->pv->y[ppw->pv->index_pt_phi_scf])* ppr->curvature_ini * s2_squared; */ } + + /*New EDE: Here we set adiabatic intial conditions for the trigger field.*/ + if ((pba->has_NEDE_pert == _TRUE_) && (pba->has_NEDE_trigger == _TRUE_)) + { + if (ppw->approx[ppw->index_ap_CCa] == (int)CCa_on) + { + + ppw->pv->y[ppw->pv->index_pt_phi_trigger] = -1. / 140. * pba->phi_ini_trigger * ppw->pv->y[ppw->pv->index_pt_delta_g] * pow(pba->NEDE_trigger_mass / ppw->pvecback[pba->index_bg_H], 2); + + ppw->pv->y[ppw->pv->index_pt_phi_prime_trigger] = -3. / 70. * pba->phi_ini_trigger * ppw->pv->y[ppw->pv->index_pt_delta_g] * pow(pba->NEDE_trigger_mass, 2) * a / ppw->pvecback[pba->index_bg_H]; + } + else + { + class_test(0 == 0, ppt->error_message, "NEDE Cosmological approximation was not 'on' at initial time.\n"); + } + } /* all relativistic relics: ur, early ncdm, dr */ @@ -5951,6 +6773,34 @@ int perturbations_initial_conditions(struct precision * ppr, -a*a* dV_scf(pba,ppw->pvecback[pba->index_bg_phi_scf])*alpha +ppw->pvecback[pba->index_bg_phi_prime_scf]*alpha_prime); } + + /*New EDE: Convert inital conditions to Newtonian gauge / danger: we never have tested this part as we only use synchronous gauge*/ + if (pba->has_NEDE_pert == _TRUE_) + { + + /* New EDE: trigger field like scf above */ + if ((pba->has_NEDE_trigger == _TRUE_) && (ppw->approx[ppw->index_ap_CCa] == (int)CCa_on)) + { + alpha_prime = 0.0; + + ppw->pv->y[ppw->pv->index_pt_phi_trigger] += alpha * ppw->pvecback[pba->index_bg_phi_prime_trigger]; + ppw->pv->y[ppw->pv->index_pt_phi_prime_trigger] += + (-2. * a_prime_over_a * alpha * ppw->pvecback[pba->index_bg_phi_prime_trigger] - a * a * dV_trigger(pba, ppw->pvecback[pba->index_bg_phi_trigger]) * alpha + ppw->pvecback[pba->index_bg_phi_prime_trigger] * alpha_prime); + } + + if (ppw->approx[ppw->index_ap_CCa] == (int)CCa_off) // This part is not relevant as NEDE is initialized at later times, we still included it for self-consistency. + { + double w_NEDE; + class_call(background_quantities_NEDE(pba, a, a_prime_over_a, NULL, NULL, &w_NEDE, NULL, NULL), + pba->error_message, + pba->error_message); + + ppw->pv->y[ppw->pv->index_pt_delta_NEDE] -= 3 * (1. + w_NEDE) * a_prime_over_a * alpha; + ppw->pv->y[ppw->pv->index_pt_theta_NEDE] += k * k * alpha; + } + } + + if ((pba->has_ur == _TRUE_) || (pba->has_ncdm == _TRUE_) || (pba->has_dr == _TRUE_) || (pba->has_idr == _TRUE_)) { @@ -6366,6 +7216,47 @@ int perturbations_approximations( else { ppw->approx[ppw->index_ap_rsa] = (int)rsa_off; } + + + /*New EDE*/ + /*define NEDE phases*/ + if (pba->has_NEDE_pert == _TRUE_) + { + /*before transition CCa_on*/ + if (1. / ppw->pvecback[pba->index_bg_a] - 1. > pba->z_decay) + { + ppw->approx[ppw->index_ap_CCa] = (int)CCa_on; + } + /*after transition CCa_off*/ + else + { + ppw->approx[ppw->index_ap_CCa] = (int)CCa_off; + } + /*When the NEDE fluid becomes highly subdominant set sda_on*/ + if ((1. / ppw->pvecback[pba->index_bg_a] - 1. < pba->z_decay * 0.9) && (ppw->pvecback[pba->index_bg_rho_NEDE] / pow(ppw->pvecback[pba->index_bg_H], 2) < ppr->sub_dom_cond)) + { + ppw->approx[ppw->index_ap_sda] = (int)sda_on; + } + else + { + ppw->approx[ppw->index_ap_sda] = (int)sda_off; + } + + /*New EDE: Here we define the switch for the trigger fluid approximation*/ // stop3 + if (pba->has_NEDE_trigger) + { + if ((ppw->pvecback[pba->index_bg_a] <= pba->a_trigger_fluid) || (pba->has_NEDE_trigger_DM == _FALSE_)) + { + ppw->approx[ppw->index_ap_tfa] = (int)tfa_off; + } + else + { + ppw->approx[ppw->index_ap_tfa] = (int)tfa_on; + } + } + } + + /* interacting dark radiation free streaming approximation*/ if (pba->has_idr == _TRUE_){ @@ -6923,6 +7814,11 @@ int perturbations_total_stress_energy( double X, Y, Z, X_prime, Y_prime, Z_prime; double Gamma_fld, S, S_prime, theta_t, theta_t_prime, rho_plus_p_theta_fld_prime; double delta_p_b_over_rho_b; + double delta_NEDE = 0.; + double theta_NEDE = 0.; + double shear_NEDE = 0.; + double delta_trigger = 0.; + double theta_trigger = 0.; /** - wavenumber and scale factor related quantities */ @@ -7010,6 +7906,35 @@ int perturbations_total_stress_energy( } } + + /*New EDE*/ + /*Here contributions to EMT are collected*/ + if (pba->has_NEDE_pert == _TRUE_) + { + + if ((ppw->approx[ppw->index_ap_sda] == (int)sda_off) && (ppw->approx[ppw->index_ap_CCa] == (int)CCa_off)) + { + + delta_NEDE = y[ppw->pv->index_pt_delta_NEDE]; + theta_NEDE = y[ppw->pv->index_pt_theta_NEDE]; + shear_NEDE = y[ppw->pv->index_pt_shear_NEDE]; + } + else + { + delta_NEDE = 0.; + theta_NEDE = 0.; + shear_NEDE = 0.; + } + + if (pba->has_NEDE_trigger_DM == _TRUE_) + { + if ((ppw->approx[ppw->index_ap_tfa] == (int)tfa_on)) + { + delta_trigger = y[ppw->pv->index_pt_delta_trigger_fld]; + theta_trigger = y[ppw->pv->index_pt_theta_trigger_fld]; + } + } + } /** - ---> (a.3.) baryon pressure perturbation */ @@ -7254,6 +8179,78 @@ int perturbations_total_stress_energy( } } } + + /*Trigger contribution / like scalar field below*/ + if (pba->has_NEDE_trigger == _TRUE_) + { + if ((ppw->approx[ppw->index_ap_CCa] == (int)CCa_on) || ((pba->has_NEDE_trigger_DM == _TRUE_) && (ppw->approx[ppw->index_ap_tfa] == (int)tfa_off))) + { + // This is the case when the scalar field is tracked. + double delta_rho_trigger, delta_p_trigger; + if (ppt->gauge == synchronous) + { + + delta_rho_trigger = 1. / 3. * + (1. / a2 * ppw->pvecback[pba->index_bg_phi_prime_trigger] * y[ppw->pv->index_pt_phi_prime_trigger] + ppw->pvecback[pba->index_bg_dV_trigger] * y[ppw->pv->index_pt_phi_trigger]); + delta_p_trigger = 1. / 3. * + (1. / a2 * ppw->pvecback[pba->index_bg_phi_prime_trigger] * y[ppw->pv->index_pt_phi_prime_trigger] - ppw->pvecback[pba->index_bg_dV_trigger] * y[ppw->pv->index_pt_phi_trigger]); + } + else + { + /* equation for psi */ + psi = y[ppw->pv->index_pt_phi] - 4.5 * (a2 / k / k) * ppw->rho_plus_p_shear; + + delta_rho_trigger = 1. / 3. * + (1. / a2 * ppw->pvecback[pba->index_bg_phi_prime_trigger] * y[ppw->pv->index_pt_phi_prime_trigger] + ppw->pvecback[pba->index_bg_dV_trigger] * y[ppw->pv->index_pt_phi_trigger] - 1. / a2 * pow(ppw->pvecback[pba->index_bg_phi_prime_trigger], 2) * psi); + delta_p_trigger = 1. / 3. * + (1. / a2 * ppw->pvecback[pba->index_bg_phi_prime_trigger] * y[ppw->pv->index_pt_phi_prime_trigger] - ppw->pvecback[pba->index_bg_dV_trigger] * y[ppw->pv->index_pt_phi_trigger] - 1. / a2 * pow(ppw->pvecback[pba->index_bg_phi_prime_trigger], 2) * psi); + } + + ppw->delta_rho += delta_rho_trigger; + + ppw->rho_plus_p_theta += 1. / 3. * + k * k / a2 * ppw->pvecback[pba->index_bg_phi_prime_trigger] * y[ppw->pv->index_pt_phi_trigger]; + + ppw->delta_p += delta_p_trigger; + + ppw->rho_plus_p_tot += ppw->pvecback[pba->index_bg_rho_trigger] + ppw->pvecback[pba->index_bg_p_trigger]; + } + else if ((pba->has_NEDE_trigger_DM == _TRUE_) && (ppw->approx[ppw->index_ap_tfa] == (int)tfa_on)) + { + // This is the case when the fluid approximation is used.. + double cs2_trigger, ca2_trigger, w_trigger; + class_call(trigger_NEDE_cs2(pba, a, k, ppw->pvecback[pba->index_bg_H], &cs2_trigger), + pba->error_message, + pba->error_message); + + class_call(background_quantities_NEDE_trigger(pba, a, a_prime_over_a, ppw->pvecback[pba->index_bg_H], ppw->pvecback[pba->index_bg_H_prime], &w_trigger, NULL, &ca2_trigger), + pba->error_message, + pba->error_message); + + delta_trigger = y[ppw->pv->index_pt_delta_trigger_fld]; + theta_trigger = y[ppw->pv->index_pt_theta_trigger_fld]; + + ppw->delta_rho = ppw->delta_rho + ppw->pvecback[pba->index_bg_rho_trigger] * delta_trigger; + + ppw->rho_plus_p_theta = ppw->rho_plus_p_theta + (1. + w_trigger) * ppw->pvecback[pba->index_bg_rho_trigger] * theta_trigger; + + /*Compare to arXiv: astro-ph/9801234v2, Eq. 3 and thereafter; use dictionnary theta/k = v.*/ + ppw->delta_p += cs2_trigger * ppw->pvecback[pba->index_bg_rho_trigger] * delta_trigger + (cs2_trigger - ca2_trigger) * (3. * a_prime_over_a * ((1. + w_trigger) * ppw->pvecback[pba->index_bg_rho_trigger] * theta_trigger) / k / k); + + ppw->rho_plus_p_tot += (1. + w_trigger) * ppw->pvecback[pba->index_bg_rho_trigger]; + + if (ppt->has_source_delta_m == _TRUE_) + { + delta_rho_m += ppw->pvecback[pba->index_bg_rho_trigger] * delta_trigger; // contribution to delta rho_matter + rho_m += ppw->pvecback[pba->index_bg_rho_trigger]; + } + if ((ppt->has_source_delta_m == _TRUE_) || (ppt->has_source_theta_m == _TRUE_)) + { + rho_plus_p_theta_m += (1. + w_trigger) * ppw->pvecback[pba->index_bg_rho_trigger] * theta_trigger; // contribution to [(rho+p)theta]_matter + rho_plus_p_m += (1. + w_trigger) * ppw->pvecback[pba->index_bg_rho_trigger]; + } + } + } /* scalar field contribution. In Newtonian gauge, delta_scf depends on the metric perturbation psi which is inferred @@ -8263,6 +9260,11 @@ int perturbations_print_variables(double tau, double a,a2,H; int idx,index_q, storeidx; double *dataptr; + + /*variables for New EDE*/ + double delta_NEDE = 0., theta_NEDE = 0., shear_NEDE = 0.; + double delta_rho_trigger = 0., rho_plus_p_theta_trigger = 0.; + double delta_trigger = 0., theta_trigger = 0.; /** - rename structure fields (just to avoid heavy notations) */ @@ -8383,6 +9385,57 @@ int perturbations_print_variables(double tau, shear_ur = 0.; } } + + /*New EDE*/ + /* Here we infer the perturbations for different approximations in order to print them in a file*/ + if (pba->has_NEDE_pert == _TRUE_) + { + if ((ppw->approx[ppw->index_ap_sda] == (int)sda_off) && (ppw->approx[ppw->index_ap_CCa] == (int)CCa_off)) + { + delta_NEDE = y[ppw->pv->index_pt_delta_NEDE]; + theta_NEDE = y[ppw->pv->index_pt_theta_NEDE]; + shear_NEDE = y[ppw->pv->index_pt_shear_NEDE]; + } + else + { + delta_NEDE = 0.; + theta_NEDE = 0.; + shear_NEDE = 0.; + } + if (pba->has_NEDE_trigger == _TRUE_) + { + + if ((ppw->approx[ppw->index_ap_CCa] == (int)CCa_on) || ((pba->has_NEDE_trigger_DM == _TRUE_) && (ppw->approx[ppw->index_ap_tfa] == (int)tfa_off))) + { + if (ppt->gauge == synchronous) + { + delta_rho_trigger = 1. / 3. * + (1. / a2 * ppw->pvecback[pba->index_bg_phi_prime_trigger] * y[ppw->pv->index_pt_phi_prime_trigger] + ppw->pvecback[pba->index_bg_dV_trigger] * y[ppw->pv->index_pt_phi_trigger]); + } + else + { + delta_rho_trigger = 1. / 3. * + (1. / a2 * ppw->pvecback[pba->index_bg_phi_prime_trigger] * y[ppw->pv->index_pt_phi_prime_trigger] + ppw->pvecback[pba->index_bg_dV_trigger] * y[ppw->pv->index_pt_phi_trigger] - 1. / a2 * pow(ppw->pvecback[pba->index_bg_phi_prime_trigger], 2) * ppw->pvecmetric[ppw->index_mt_psi]); + } + + rho_plus_p_theta_trigger = 1. / 3. * + k * k / a2 * ppw->pvecback[pba->index_bg_phi_prime_trigger] * y[ppw->pv->index_pt_phi_trigger]; + + delta_trigger = delta_rho_trigger / pvecback[pba->index_bg_rho_trigger]; + // theta_trigger = rho_plus_p_theta_trigger / (pvecback[pba->index_bg_rho_trigger] + pvecback[pba->index_bg_p_trigger]); + // printf("theta: %e ", theta_trigger); + } + else if ((pba->has_NEDE_trigger_DM == _TRUE_) && (ppw->approx[ppw->index_ap_tfa] == (int)tfa_on)) + + { + + delta_trigger = y[ppw->pv->index_pt_delta_trigger_fld]; + theta_trigger = y[ppw->pv->index_pt_theta_trigger_fld]; + rho_plus_p_theta_trigger = theta_trigger * (pvecback[pba->index_bg_rho_trigger] + pvecback[pba->index_bg_p_trigger]); + } + } + } + delta_b = y[ppw->pv->index_pt_delta_b]; theta_b = y[ppw->pv->index_pt_theta_b]; @@ -8538,59 +9591,73 @@ int perturbations_print_variables(double tau, } - /* converting synchronous variables to newtonian ones */ + if (ppt->gauge == synchronous) { + if (ppt->plot_gauge == 0) { + /* converting synchronous variables to newtonian ones */ + + /* density and velocity perturbations (comment out if you wish to keep synchronous variables) */ - /* density and velocity perturbations (comment out if you wish to keep synchronous variables) */ + delta_g -= 4. * pvecback[pba->index_bg_H]*pvecback[pba->index_bg_a]*alpha; + theta_g += k*k*alpha; - delta_g -= 4. * pvecback[pba->index_bg_H]*pvecback[pba->index_bg_a]*alpha; - theta_g += k*k*alpha; + delta_b -= 3. * pvecback[pba->index_bg_H]*pvecback[pba->index_bg_a]*alpha; + theta_b += k*k*alpha; - delta_b -= 3. * pvecback[pba->index_bg_H]*pvecback[pba->index_bg_a]*alpha; - theta_b += k*k*alpha; - - if (pba->has_ur == _TRUE_) { - delta_ur -= 4. * pvecback[pba->index_bg_H]*pvecback[pba->index_bg_a]*alpha; - theta_ur += k*k*alpha; - } - - if (pba->has_idr == _TRUE_) { - delta_idr -= 4. * pvecback[pba->index_bg_H]*pvecback[pba->index_bg_a]*alpha; - theta_idr += k*k*alpha; - } + if (pba->has_ur == _TRUE_) { + delta_ur -= 4. * pvecback[pba->index_bg_H]*pvecback[pba->index_bg_a]*alpha; + theta_ur += k*k*alpha; + } + + /*New EDE*/ + /* We normally have this commented out and plot everything in synchronous gauge*/ + /*Here we convert to Newtonian gauge, not really important for running of code but for plotting / Note that the conversion is only well-defined if the equation of state is not -1*/ + if (pba->has_NEDE_pert) { + delta_NEDE -= 4. * pvecback[pba->index_bg_H]*pvecback[pba->index_bg_a]*alpha; + theta_NEDE += k*k*alpha; + if (pba->has_NEDE_trigger){ + delta_trigger += alpha*(-3.0*H*(1.0+pvecback[pba->index_bg_p_trigger]/pvecback[pba->index_bg_rho_trigger])); + theta_trigger += k*k*alpha; + } + } + + if (pba->has_idr == _TRUE_) { + delta_idr -= 4. * pvecback[pba->index_bg_H]*pvecback[pba->index_bg_a]*alpha; + theta_idr += k*k*alpha; + } - if (pba->has_dr == _TRUE_) { - delta_dr += (-4.*a*H+a*pba->Gamma_dcdm*pvecback[pba->index_bg_rho_dcdm]/pvecback[pba->index_bg_rho_dr])*alpha; + if (pba->has_dr == _TRUE_) { + delta_dr += (-4.*a*H+a*pba->Gamma_dcdm*pvecback[pba->index_bg_rho_dcdm]/pvecback[pba->index_bg_rho_dr])*alpha; - theta_dr += k*k*alpha; - } + theta_dr += k*k*alpha; + } - if (pba->has_cdm == _TRUE_) { - delta_cdm -= 3. * pvecback[pba->index_bg_H]*pvecback[pba->index_bg_a]*alpha; - theta_cdm += k*k*alpha; - } + if (pba->has_cdm == _TRUE_) { + delta_cdm -= 3. * pvecback[pba->index_bg_H]*pvecback[pba->index_bg_a]*alpha; + theta_cdm += k*k*alpha; + } - if (pba->has_idm == _TRUE_) { - delta_idm -= 3. * pvecback[pba->index_bg_H]*pvecback[pba->index_bg_a]*alpha; - theta_idm += k*k*alpha; - } + if (pba->has_idm == _TRUE_) { + delta_idm -= 3. * pvecback[pba->index_bg_H]*pvecback[pba->index_bg_a]*alpha; + theta_idm += k*k*alpha; + } - if (pba->has_ncdm == _TRUE_) { - for (n_ncdm=0; n_ncdm < pba->N_ncdm; n_ncdm++){ - /** - --> TODO: gauge transformation of delta, deltaP/rho (?) and theta using -= 3aH(1+w_ncdm) alpha for delta. */ + if (pba->has_ncdm == _TRUE_) { + for (n_ncdm=0; n_ncdm < pba->N_ncdm; n_ncdm++){ + /** - --> TODO: gauge transformation of delta, deltaP/rho (?) and theta using -= 3aH(1+w_ncdm) alpha for delta. */ + } } - } - if (pba->has_dcdm == _TRUE_) { - delta_dcdm += alpha*(-a*pba->Gamma_dcdm-3.*a*H); - theta_dcdm += k*k*alpha; - } + if (pba->has_dcdm == _TRUE_) { + delta_dcdm += alpha*(-a*pba->Gamma_dcdm-3.*a*H); + theta_dcdm += k*k*alpha; + } - if (pba->has_scf == _TRUE_) { - delta_scf += alpha*(-3.0*H*(1.0+pvecback[pba->index_bg_p_scf]/pvecback[pba->index_bg_rho_scf])); - theta_scf += k*k*alpha; + if (pba->has_scf == _TRUE_) { + delta_scf += alpha*(-3.0*H*(1.0+pvecback[pba->index_bg_p_scf]/pvecback[pba->index_bg_rho_scf])); + theta_scf += k*k*alpha; + } } - } // fprintf(ppw->perturbations_output_file," "); @@ -8664,6 +9731,13 @@ int perturbations_print_variables(double tau, class_store_double(dataptr, ppw->delta_rho_fld, pba->has_fld, storeidx); class_store_double(dataptr, ppw->rho_plus_p_theta_fld, pba->has_fld, storeidx); class_store_double(dataptr, ppw->delta_p_fld, pba->has_fld, storeidx); + /** New EDE*/ + class_store_double(dataptr, delta_NEDE, pba->has_NEDE_pert, storeidx); + class_store_double(dataptr, theta_NEDE, pba->has_NEDE_pert, storeidx); + class_store_double(dataptr, shear_NEDE, pba->has_NEDE_pert, storeidx); + /*New EDE; Trigger field*/ + class_store_double(dataptr, delta_trigger, pba->has_NEDE_trigger, storeidx); + class_store_double(dataptr, rho_plus_p_theta_trigger, pba->has_NEDE_trigger, storeidx); //fprintf(ppw->perturbations_output_file,"\n"); } @@ -9724,6 +10798,89 @@ int perturbations_derivs(double tau, } } } + + + /* New EDE */ // stop1 + /*These are the actual perturbation equations. See for example arXiv: 1806.10.608v1 and also Hu in the presence of shear, arXiv: astro-ph/9801234v2*/ + + if (pba->has_NEDE_pert == _TRUE_) + { + + if ((ppw->approx[ppw->index_ap_sda] == (int)sda_off) && (ppw->approx[ppw->index_ap_CCa] == (int)CCa_off)) + { + double w_NEDE, dw_over_da_NEDE, ca2_NEDE, cs2_NEDE; + class_call(background_quantities_NEDE(pba, a, a_prime_over_a, NULL, NULL, &w_NEDE, &dw_over_da_NEDE, &ca2_NEDE), + pba->error_message, + pba->error_message); + double w_prime_NEDE = dw_over_da_NEDE * a_prime_over_a * a; + + /*The NEDE implementation so far assumes w_prime_NEDE=0*/ + + /** Decide if effective rest-frame sound speed is constant or tracking the adiabatic sound speed (note that w_NEDE=const). */ + + if (pba->NEDE_fld_nature == NEDE_fld_A) + { + if (ppt->NEDE_ceff_nature == NEDE_ceff_const) + cs2_NEDE = ppt->three_ceff2_NEDE / 3.; + else + cs2_NEDE = ca2_NEDE; + } + + /** - -----> NEDE density */ + dy[pv->index_pt_delta_NEDE] = + -(1. + w_NEDE) * (y[pv->index_pt_theta_NEDE] + metric_continuity) - 3. * (cs2_NEDE - w_NEDE) * a_prime_over_a * y[pv->index_pt_delta_NEDE] - 9. * (1 + w_NEDE) * (cs2_NEDE - ca2_NEDE) * a_prime_over_a * a_prime_over_a * y[pv->index_pt_theta_NEDE] / k2; + // metric_continuity = h'/2 + + /** - -----> NEDE velocity */ + dy[pv->index_pt_theta_NEDE] = + k2 * (3. * cs2_NEDE * y[pv->index_pt_delta_NEDE] / (3. + 3. * w_NEDE) - s2_squared * y[pv->index_pt_shear_NEDE]) + metric_euler - (1. - 3. * cs2_NEDE) * a_prime_over_a * y[pv->index_pt_theta_NEDE]; + // metric_euler=0 in synchronous gauge and s2_squared = 1 without spatial curvature. //Shear term vanishes in standard NEDE scenario. + + /* Shear, only relevant for cvis2 non-vanishing, in other cases sigma_NEDE=0 all the time. */ + dy[pv->index_pt_shear_NEDE] = + -3. * a_prime_over_a * y[pv->index_pt_shear_NEDE] + 8. / 3. * ppt->three_cvis2_NEDE / (3. * w_NEDE + 3.) * (y[pv->index_pt_theta_NEDE] + metric_shear); + // metric_shear = (h_prime+6eta_prime)/2 in synchronous gauge + } + + /** - ---> trigger field */ + + if (pba->has_NEDE_trigger == _TRUE_) + { + if ((ppw->approx[ppw->index_ap_CCa] == (int)CCa_on) || ((pba->has_NEDE_trigger_DM == _TRUE_) && (ppw->approx[ppw->index_ap_tfa] == (int)tfa_off))) + { + /** - ----> field value */ + + dy[pv->index_pt_phi_trigger] = y[pv->index_pt_phi_prime_trigger]; + + /** - ----> Klein Gordon equation */ + + dy[pv->index_pt_phi_prime_trigger] = -2. * a_prime_over_a * y[pv->index_pt_phi_prime_trigger] - metric_continuity * pvecback[pba->index_bg_phi_prime_trigger] // metric_continuity = h'/2 + - (k2 + a2 * pvecback[pba->index_bg_ddV_trigger]) * y[pv->index_pt_phi_trigger]; + } + + else if ((pba->has_NEDE_trigger_DM == _TRUE_) && (ppw->approx[ppw->index_ap_tfa] == (int)tfa_on)) + { + double cs2_trigger, w_trigger, ca2_trigger; + // Get the sound speed. + class_call(trigger_NEDE_cs2(pba, a, k, ppw->pvecback[pba->index_bg_H], &cs2_trigger), + pba->error_message, + pba->error_message); + + // Get other background quantities. + class_call(background_quantities_NEDE_trigger(pba, a, a_prime_over_a, ppw->pvecback[pba->index_bg_H], ppw->pvecback[pba->index_bg_H_prime], &w_trigger, NULL, &ca2_trigger), + pba->error_message, + pba->error_message); + + // These are the standard equations for generic fluid perturbations. + + dy[pv->index_pt_delta_trigger_fld] = -(1. + w_trigger) * (y[pv->index_pt_theta_trigger_fld] + metric_continuity) - 3. * (cs2_trigger - w_trigger) * a_prime_over_a * y[pv->index_pt_delta_trigger_fld] - 9. * (1 + w_trigger) * (cs2_trigger - ca2_trigger) * a_prime_over_a * a_prime_over_a * y[pv->index_pt_theta_trigger_fld] / k2; + + dy[pv->index_pt_theta_trigger_fld] = + k2 * (3. * cs2_trigger * y[pv->index_pt_delta_trigger_fld] / (3. + 3. * w_trigger)) + metric_euler - (1. - 3. * cs2_trigger) * a_prime_over_a * y[pv->index_pt_theta_trigger_fld]; + } + } + } + /** - ---> metric */ @@ -10627,3 +11784,25 @@ int perturbations_rsa_idr_delta_and_theta( return _SUCCESS_; } + +int trigger_NEDE_cs2( + struct background *pba, + double a, + double k, + double H, + double *cs2) +{ + double m; + + m = pba->NEDE_trigger_mass; + + // We use the improved formula for the sound speed derived in arXiv: 2201.10238 + if (cs2 != NULL) + { + *cs2 = pow((a * m) / k * (pow(1.0 + pow(k / (a * m), 2), 0.5) - 1.0), 2) + 5.0 / 4.0 * pow(H / m, 2); + //*cs2 = k * k / (4.0 * pow(pba->NEDE_trigger_mass, 2) * a * a + k*k); + } + + return _SUCCESS_; +} + From 83060c7ebf3e4bc881bba497c0df29d8cc4656fb Mon Sep 17 00:00:00 2001 From: EBHolm Date: Fri, 5 Jan 2024 10:13:12 +0100 Subject: [PATCH 20/59] Implemented plot_gauge flag --- source/input.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/source/input.c b/source/input.c index 9b0e0f7ca..26507f94e 100644 --- a/source/input.c +++ b/source/input.c @@ -5649,6 +5649,26 @@ int input_read_parameters_output(struct file_content * pfc, class_read_int("lensing_verbose",ple->lensing_verbose); class_read_int("distortions_verbose",psd->distortions_verbose); class_read_int("output_verbose",pop->output_verbose); + + /** Gauge to plot perturbations in */ + char plot_gauge[_ARGUMENT_LENGTH_MAX_]; + int flag_temp; + parser_read_string(pfc, "plot_gauge", &plot_gauge, &flag_temp, errmsg); + if (flag_temp == _TRUE_) { + if ((strcmp(plot_gauge, "newtonian") == 0) || (strcmp(plot_gauge, "Newtonian") == 0)) { + ppt->plot_gauge = 0; // indexed as in the possible_gauges of perturbations.h + } + else if ((strcmp(plot_gauge, "synchronous") == 0) || (strcmp(plot_gauge, "Synchronous") == 0)) { + ppt->plot_gauge = 1; // indexed as in the possible_gauges of perturbations.h + } + else { + class_test(0 == 0, errmsg, "Invalid input in 'plot_gauges'. Choose either 'newtonian' or 'synchronous'.") + } + } + else { + // Default is Newtonian gauge + ppt->plot_gauge = 0; + } return _SUCCESS_; From d2094e83e8b84f674d2b943d1826ced74511f6f6 Mon Sep 17 00:00:00 2001 From: EBHolm Date: Fri, 5 Jan 2024 10:13:27 +0100 Subject: [PATCH 21/59] Forgot some changes --- include/background.h | 7 ++++++- include/perturbations.h | 2 ++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/include/background.h b/include/background.h index a5264db77..4bb1f808f 100644 --- a/include/background.h +++ b/include/background.h @@ -105,9 +105,14 @@ struct background double three_eos_NEDE; /* NEDE e.o.s. (scenario A) */ short decay_flag; /* NEDE decay flag; True iff NEDE has decayed */ + double trigger_fluid_H_over_m; /* NEDE trigger fluid approximation threshold */ int trigger_fluid_approximation; /* True iff trigger fluid approximation is on */ - double a_trigger_fluid; /* Scale factor when trigger fluid approximation is turned on */ + /* Quantities when trigger FA is turned on */ + double H_fluid; + double H_prime_fluid; + double a_trigger_fluid; + /* NEDE decay time */ double tau_decay; diff --git a/include/perturbations.h b/include/perturbations.h index 35ea322a2..3937fdf44 100644 --- a/include/perturbations.h +++ b/include/perturbations.h @@ -193,6 +193,8 @@ struct perturbations double * beta_idr; /**< Angular contribution to collisional term at l>=2 for idr-idr */ int idr_nature; /**< Nature of the interacting dark radiation (free streaming or fluid) */ + + int plot_gauge; /** Gauge to plot the perturbations in */ //@} From 6b2915d1fa7ac87098fd086333e22c1b361e517a Mon Sep 17 00:00:00 2001 From: EBHolm Date: Thu, 8 Feb 2024 10:59:57 +0100 Subject: [PATCH 22/59] Fixed bug --- source/background.c | 111 ++++++++++++++++++++---------------------- tools/evolver_ndf15.c | 5 +- 2 files changed, 54 insertions(+), 62 deletions(-) diff --git a/source/background.c b/source/background.c index 2eaba0786..16534dbfa 100644 --- a/source/background.c +++ b/source/background.c @@ -495,34 +495,33 @@ int background_functions( /* NEDE */ if (pba->has_NEDE == _TRUE_) { - double a_decay = 1./(1. + pba->z_decay); - if (a < a_decay || a_decay == 0) { - /* w=-1 phase */ - /* Note the class convention according to which 3 Mpl^2 is absorbed in rho, i.e. rho_crit = H0^2. */ - rho_NEDE_decay = pba->Omega_NEDE * pow(pba->H0, 2); - /* Save value of rho in array for later use. */ - pvecback[pba->index_bg_rho_NEDE] = rho_NEDE_decay; - pvecback[pba->index_bg_w_NEDE] = -1; - - p_tot -= rho_NEDE_decay; /* add pressure contributio n*/ - rho_tot += rho_NEDE_decay; /* add energy contribution */ - } - else { - /* NEDE decay phase with w > 0 */ - class_call(background_quantities_NEDE(pba, a, 0, &rho_NEDE_decay, NULL, &w_NEDE, &dw_over_da_NEDE, NULL), - pba->error_message, - pba->error_message); + double a_decay = 1./(1. + pba->z_decay); + if (a < a_decay || a_decay == 0) { + /* w=-1 phase */ + /* Note the class convention according to which 3 Mpl^2 is absorbed in rho, i.e. rho_crit = H0^2. */ + rho_NEDE_decay = pba->Omega_NEDE * pow(pba->H0, 2); + /* Save value of rho in array for later use. */ + pvecback[pba->index_bg_rho_NEDE] = rho_NEDE_decay; + pvecback[pba->index_bg_w_NEDE] = -1; + + p_tot -= rho_NEDE_decay; /* add pressure contributio n*/ + rho_tot += rho_NEDE_decay; /* add energy contribution */ + } + else { + /* NEDE decay phase with w > 0 */ + class_call(background_quantities_NEDE(pba, a, 0, &rho_NEDE_decay, NULL, &w_NEDE, &dw_over_da_NEDE, NULL), + pba->error_message, + pba->error_message); - pvecback[pba->index_bg_rho_NEDE] = rho_NEDE_decay; - pvecback[pba->index_bg_w_NEDE] = w_NEDE; - p_tot += w_NEDE * rho_NEDE_decay; - rho_tot += rho_NEDE_decay; + pvecback[pba->index_bg_rho_NEDE] = rho_NEDE_decay; + pvecback[pba->index_bg_w_NEDE] = w_NEDE; + p_tot += w_NEDE * rho_NEDE_decay; + rho_tot += rho_NEDE_decay; - dp_dloga += (a*dw_over_da_NEDE - 3*(1 + w_NEDE)*w_NEDE)*pvecback[pba->index_bg_rho_NEDE]; - } + dp_dloga += (a*dw_over_da_NEDE - 3*(1 + w_NEDE)*w_NEDE)*pvecback[pba->index_bg_rho_NEDE]; + } } - /* NEDE trigger field */ if (pba->has_NEDE_trigger == _TRUE_) { if (pba->trigger_fluid_approximation == _FALSE_) { @@ -2231,21 +2230,6 @@ int background_solve( pba->error_message), pba->error_message, pba->error_message); - - /** - recover some quantities today */ - /* -> age in Gyears */ - pba->age = pvecback_integration[pba->index_bi_time]/_Gyr_over_Mpc_; - /* -> conformal age in Mpc */ - pba->conformal_age = pvecback_integration[pba->index_bi_tau]; - /* -> contribution of decaying dark matter and dark radiation to the critical density today: */ - if (pba->has_dcdm == _TRUE_) { - pba->Omega0_dcdm = pvecback_integration[pba->index_bi_rho_dcdm]/pba->H0/pba->H0; - } - if (pba->has_dr == _TRUE_) { - pba->Omega0_dr = pvecback_integration[pba->index_bi_rho_dr]/pba->H0/pba->H0; - } - /* -> scale-invariant growth rate today */ - D_today = pvecback_integration[pba->index_bi_D]; double* new_pvecback_integration; if (pba->has_NEDE_trigger) { @@ -2311,23 +2295,25 @@ int background_solve( pba->error_message), pba->error_message, pba->error_message); - - /** - recover some quantities today */ - /* -> age in Gyears */ - pba->age = new_pvecback_integration[pba->index_bi_time]/_Gyr_over_Mpc_; - /* -> conformal age in Mpc */ - pba->conformal_age = new_pvecback_integration[pba->index_bi_tau]; - /* -> contribution of decaying dark matter and dark radiation to the critical density today: */ - if (pba->has_dcdm == _TRUE_) { - pba->Omega0_dcdm = new_pvecback_integration[pba->index_bi_rho_dcdm]/pba->H0/pba->H0; - } - if (pba->has_dr == _TRUE_) { - pba->Omega0_dr = new_pvecback_integration[pba->index_bi_rho_dr]/pba->H0/pba->H0; - } - /* -> scale-invariant growth rate today */ - D_today = new_pvecback_integration[pba->index_bi_D]; + free(pvecback_integration); + pvecback_integration = new_pvecback_integration; } } + + /** - recover some quantities today */ + /* -> age in Gyears */ + pba->age = pvecback_integration[pba->index_bi_time]/_Gyr_over_Mpc_; + /* -> conformal age in Mpc */ + pba->conformal_age = pvecback_integration[pba->index_bi_tau]; + /* -> contribution of decaying dark matter and dark radiation to the critical density today: */ + if (pba->has_dcdm == _TRUE_) { + pba->Omega0_dcdm = pvecback_integration[pba->index_bi_rho_dcdm]/pba->H0/pba->H0; + } + if (pba->has_dr == _TRUE_) { + pba->Omega0_dr = pvecback_integration[pba->index_bi_rho_dr]/pba->H0/pba->H0; + } + /* -> scale-invariant growth rate today */ + D_today = pvecback_integration[pba->index_bi_D]; /** - In a loop over lines, fill rest of background table for quantities that depend on numbers like "conformal_age" or @@ -2468,11 +2454,6 @@ int background_solve( free(pvecback); free(pvecback_integration); free(used_in_output); - if (pba->has_NEDE_trigger) { - if (pba->trigger_fluid_approximation == _TRUE_) { - free(new_pvecback_integration); - } - } return _SUCCESS_; @@ -2748,6 +2729,18 @@ int background_find_equality( class_alloc(pvecback,pba->bg_size*sizeof(double),pba->error_message); + // Always do at least one iteration + tau_mid = 0.5*(tau_plus+tau_minus); + class_call(background_at_tau(pba,tau_mid,long_info,inter_closeby,&index_tau_minus,pvecback), + pba->error_message, + pba->error_message); + Omega_m_over_Omega_r = pvecback[pba->index_bg_Omega_m]/pvecback[pba->index_bg_Omega_r]; + if (Omega_m_over_Omega_r > 1) + tau_plus = tau_mid; + else + tau_minus = tau_mid; + + // Then iterate until desired precision is reached while ((tau_plus - tau_minus) > ppr->tol_tau_eq) { tau_mid = 0.5*(tau_plus+tau_minus); diff --git a/tools/evolver_ndf15.c b/tools/evolver_ndf15.c index d6206d9b5..a8fdae19c 100644 --- a/tools/evolver_ndf15.c +++ b/tools/evolver_ndf15.c @@ -571,10 +571,9 @@ int evolver_ndf15( /*Interpolate if we have overshot sample values*/ interp_from_dif(t_vec[next],tnew,ynew,h,dif,k,yinterp,ypinterp,yppinterp,interpidx,neq,2); - output_return = output(t_vec[next],ynew+1,f0+1,next,parameters_and_workspace_for_derivs,error_message); + output_return = output(t_vec[next],yinterp+1,ypinterp+1,next,parameters_and_workspace_for_derivs,error_message); // class_call((*output)(t_vec[next],yinterp+1,ypinterp+1,next,parameters_and_workspace_for_derivs, // error_message),error_message,error_message); - } if (output_return == _FAILURE_) { @@ -1099,7 +1098,7 @@ int fzero_Newton(int (*func)(double *x, take ntrial Newton-Raphson steps to improve the root. Stop if the root converges in either summed absolute variable increments tolx or summed absolute function values tolf.*/ - int k,i,j,*indx, ntrial=20; + int k,i,j,*indx, ntrial=30; double errx,errf,d,*F0,*Fdel,**Fjac,*p, *lu_work; int has_converged = _FALSE_; int funcreturn; From 1a047ed2eaa28697dfe6becf26be52eb02561684 Mon Sep 17 00:00:00 2001 From: EBHolm Date: Thu, 8 Feb 2024 13:32:16 +0100 Subject: [PATCH 23/59] Updates --- include/background.h | 3 +-- source/background.c | 9 +++------ source/input.c | 18 +++++++++--------- source/perturbations.c | 4 ++-- 4 files changed, 15 insertions(+), 19 deletions(-) diff --git a/include/background.h b/include/background.h index 4bb1f808f..9ce7c5b11 100644 --- a/include/background.h +++ b/include/background.h @@ -117,8 +117,7 @@ struct background /* NEDE decay time */ double tau_decay; double a_decay; - double z_decay; - + double z_decay_NEDE; /* NEDE fluid nature*/ int NEDE_fld_nature; diff --git a/source/background.c b/source/background.c index 16534dbfa..ef7157fc1 100644 --- a/source/background.c +++ b/source/background.c @@ -495,7 +495,7 @@ int background_functions( /* NEDE */ if (pba->has_NEDE == _TRUE_) { - double a_decay = 1./(1. + pba->z_decay); + double a_decay = 1./(1. + pba->z_decay_NEDE); if (a < a_decay || a_decay == 0) { /* w=-1 phase */ /* Note the class convention according to which 3 Mpl^2 is absorbed in rho, i.e. rho_crit = H0^2. */ @@ -526,9 +526,6 @@ int background_functions( if (pba->has_NEDE_trigger == _TRUE_) { if (pba->trigger_fluid_approximation == _FALSE_) { // This part is relevant before the fluid approximation is turned on. - if (a == pba->a_trigger_fluid) { - int k = 0; - } phi = pvecback_B[pba->index_bi_phi_trigger]; phi_prime = pvecback_B[pba->index_bi_phi_prime_trigger]; pvecback[pba->index_bg_V_trigger] = V_trigger(pba, phi); // V_scf(pba,phi); //write here potential as function of phi @@ -915,7 +912,7 @@ int background_quantities_NEDE( { case NEDE_fld_A: w_local = pba->three_eos_NEDE / 3.; - rho_local = (pba->Omega_NEDE) * pow(pba->H0, 2) * pow(1./(1. + pba->z_decay) / a, 3. + 3. * w_local); + rho_local = (pba->Omega_NEDE) * pow(pba->H0, 2) * pow(1./(1. + pba->z_decay_NEDE) / a, 3. + 3. * w_local); w_prime = 0.; if (w != NULL) @@ -2396,7 +2393,7 @@ int background_solve( if (pba->has_NEDE == _TRUE_) { printf(" -> NEDE details:\n"); - printf(" -> NEDE decay time: %.2f \n", pba->z_decay); + printf(" -> NEDE decay time: %.2f \n", pba->z_decay_NEDE); printf(" -> NEDE fraction: %.4f \n", pba->f_NEDE); if (pba->NEDE_fld_nature == NEDE_fld_A) printf(" -> Scenario A with eos NEDE: 3*w = %.2f \n", pba->three_eos_NEDE); diff --git a/source/input.c b/source/input.c index 26507f94e..0cd0b0cf6 100644 --- a/source/input.c +++ b/source/input.c @@ -1298,14 +1298,15 @@ int input_get_guess(double *xguess, double z_NEDE = pfzw->target_value[index_guess]; double trigger_mass = 0.5 * ba.H0 / ba.Bubble_trigger_H_over_m * pow(1. / (1. - ba.f_NEDE), 0.5) * pow(Omega_M * pow((1. + z_NEDE), 3) + Omega_M * pow((1. + z_NEDE), 4) / (3001.) + (1. - Omega_M), 0.5); - xguess[index_guess] = 0.5 * ba.H0 / ba.Bubble_trigger_H_over_m * pow(1. / (1. - ba.f_NEDE), 0.5) * pow(Omega_M * pow((1. + pfzw->target_value[index_guess]), 3) + Omega_M * pow((1. + pfzw->target_value[index_guess]), 4) / (3001.) + (1. - Omega_M), 0.5); + xguess[index_guess] = trigger_mass; dxdy[index_guess] = 0.5 * trigger_mass * (3. * Omega_M * pow((1. + z_NEDE), 2) + 4. * Omega_M * pow((1. + z_NEDE), 3) / (3001.)) / (Omega_M * pow((1. + z_NEDE), 3) + Omega_M * pow((1. + z_NEDE), 4) / (3001.) + (1. - Omega_M)); break; } case Omega0_NEDE_trigger_DM: { // Need to guess NEDE_trigger_ini double Omega_M = ba.Omega0_cdm + ba.Omega0_b + ba.Omega0_ncdm_tot; - double z_NEDE = ba.z_decay; + // Bad guess: This not being the actual z makes this guess quite bad, I think. Issue is, we haven't computed yet. + double z_NEDE = ba.z_decay_NEDE; double trigger_mass = 0.5 * ba.H0 / ba.Bubble_trigger_H_over_m * pow(1. / (1. - ba.f_NEDE), 0.5) * pow(Omega_M * pow((1. + z_NEDE), 3) + Omega_M * pow((1. + z_NEDE), 4) / (3001.) + (1. - Omega_M), 0.5); xguess[index_guess] = pow(75. * ba.H0 * ba.H0 * pfzw->target_value[index_guess] * pow(z_NEDE, 3) / pow(trigger_mass, 2), 0.5); @@ -1316,7 +1317,7 @@ int input_get_guess(double *xguess, // Need to guess Omega0_NEDE_trigger_DM // Inversion of the guess above double Omega_M = ba.Omega0_cdm + ba.Omega0_b + ba.Omega0_ncdm_tot; - double z_NEDE = ba.z_decay; + double z_NEDE = ba.z_decay_NEDE; double trigger_mass = 0.5 * ba.H0 / ba.Bubble_trigger_H_over_m * pow(1. / (1. - ba.f_NEDE), 0.5) * pow(Omega_M * pow((1. + z_NEDE), 3) + Omega_M * pow((1. + z_NEDE), 4) / (3001.) + (1. - Omega_M), 0.5); xguess[index_guess] = pow(pfzw->target_value[index_guess]*trigger_mass/ba.H0, 2.)/(75.*pow(z_NEDE, 3.)); @@ -3213,8 +3214,8 @@ int input_read_parameters_species(struct file_content * pfc, /** 7.3) New Early Dark Energy */ class_read_double("f_NEDE", pba->f_NEDE); - class_read_double("z_decay_NEDE", pba->z_decay); /* Related by shooting */ - class_read_double("NEDE_trigger_mass", pba->NEDE_trigger_mass); /* */ + class_read_double("z_decay_NEDE", pba->z_decay_NEDE); /* Related by shooting */ + class_read_double("NEDE_trigger_mass", pba->NEDE_trigger_mass); /* */ class_read_double("three_eos_NEDE", pba->three_eos_NEDE); class_read_double("three_ceff2_NEDE", ppt->three_ceff2_NEDE); class_read_double("three_cvis2_NEDE", ppt->three_cvis2_NEDE); @@ -3265,7 +3266,7 @@ int input_read_parameters_species(struct file_content * pfc, else if (pba->f_NEDE == 0) pba->f_NEDE = pba->Omega_NEDE / pow(pba->NEDE_trigger_mass * pba->Bubble_trigger_H_over_m / pba->H0, 2); - class_test(pba->z_decay == 0, errmsg, + class_test(pba->z_decay_NEDE == 0, errmsg, "In input file, z_decay_NEDE needs to be specified for NEDE (The trigger mass as input parameter has been retired in v5)."); class_test(pba->f_NEDE > 0.4, errmsg, @@ -3282,7 +3283,7 @@ int input_read_parameters_species(struct file_content * pfc, pba->phi_prime_ini_trigger = 0; // This value is set to the attractor later. if (pba->NEDE_fld_nature == NEDE_fld_A) - pba->Omega0_NEDE = pba->Omega_NEDE * pow(1. / (1. + pba->z_decay), (3. + pba->three_eos_NEDE)); + pba->Omega0_NEDE = pba->Omega_NEDE * pow(1. / (1. + pba->z_decay_NEDE), (3. + pba->three_eos_NEDE)); } @@ -3368,7 +3369,6 @@ int input_read_parameters_species(struct file_content * pfc, /* NEDE budget, both zero if no NEDE */ Omega_tot += pba->Omega0_NEDE; Omega_tot += pba->Omega0_trigger; - printf("Omega0_NEDE=%g, Omega0_NEDE_trigger_DM=%g\n", pba->Omega0_NEDE, pba->Omega0_trigger); /* Step 1 */ if (flag1 == _TRUE_){ @@ -6006,7 +6006,7 @@ int input_default_params(struct background *pba, pba->Bubble_trigger_H_over_m = .2; // Default value ionferred from miscroscpic model. pba->NEDE_trigger_mass = 0.; - pba->z_decay = 0.; + pba->z_decay_NEDE = 0.; ppt->three_ceff2_NEDE = 2.; // Default: matches adiabatic sound speed. ppt->three_cvis2_NEDE = 0.; diff --git a/source/perturbations.c b/source/perturbations.c index bc0d3cf6c..c9ac985f1 100644 --- a/source/perturbations.c +++ b/source/perturbations.c @@ -7223,7 +7223,7 @@ int perturbations_approximations( if (pba->has_NEDE_pert == _TRUE_) { /*before transition CCa_on*/ - if (1. / ppw->pvecback[pba->index_bg_a] - 1. > pba->z_decay) + if (1. / ppw->pvecback[pba->index_bg_a] - 1. > pba->z_decay_NEDE) { ppw->approx[ppw->index_ap_CCa] = (int)CCa_on; } @@ -7233,7 +7233,7 @@ int perturbations_approximations( ppw->approx[ppw->index_ap_CCa] = (int)CCa_off; } /*When the NEDE fluid becomes highly subdominant set sda_on*/ - if ((1. / ppw->pvecback[pba->index_bg_a] - 1. < pba->z_decay * 0.9) && (ppw->pvecback[pba->index_bg_rho_NEDE] / pow(ppw->pvecback[pba->index_bg_H], 2) < ppr->sub_dom_cond)) + if ((1. / ppw->pvecback[pba->index_bg_a] - 1. < pba->z_decay_NEDE * 0.9) && (ppw->pvecback[pba->index_bg_rho_NEDE] / pow(ppw->pvecback[pba->index_bg_H], 2) < ppr->sub_dom_cond)) { ppw->approx[ppw->index_ap_sda] = (int)sda_on; } From 754ceed3a32bb36bfa148d3472944e7f70dc5e46 Mon Sep 17 00:00:00 2001 From: EBHolm Date: Thu, 8 Feb 2024 16:54:46 +0100 Subject: [PATCH 24/59] Import RKDP45 evolver from LASAGNA --- Makefile | 4 +- include/background.h | 1 + include/common.h | 15 +- include/evolver_rkdp45.h | 43 ++++++ include/precisions.h | 10 +- include/thermodynamics.h | 1 + source/background.c | 7 + source/perturbations.c | 5 +- tools/evolver_rkdp45.c | 292 +++++++++++++++++++++++++++++++++++++++ 9 files changed, 370 insertions(+), 8 deletions(-) create mode 100755 include/evolver_rkdp45.h create mode 100755 tools/evolver_rkdp45.c diff --git a/Makefile b/Makefile index 9e4a8a779..9bb029a00 100644 --- a/Makefile +++ b/Makefile @@ -38,7 +38,7 @@ OPTFLAG = -O3 #OPTFLAG = -fast # your openmp flag (comment for compiling without openmp) -OMPFLAG = -fopenmp +#OMPFLAG = -fopenmp #OMPFLAG = -mp -mp=nonuma -mp=allcores -g #OMPFLAG = -openmp @@ -91,7 +91,7 @@ endif %.o: %.c .base $(HEADERFILES) cd $(WRKDIR);$(CC) $(OPTFLAG) $(OMPFLAG) $(CCFLAG) $(INCLUDES) -c ../$< -o $*.o -TOOLS = growTable.o dei_rkck.o sparse.o evolver_rkck.o evolver_ndf15.o arrays.o parser.o quadrature.o hyperspherical.o common.o trigonometric_integrals.o +TOOLS = growTable.o dei_rkck.o sparse.o evolver_rkck.o evolver_rkdp45.o evolver_ndf15.o arrays.o parser.o quadrature.o hyperspherical.o common.o trigonometric_integrals.o SOURCE = input.o background.o thermodynamics.o perturbations.o primordial.o fourier.o transfer.o harmonic.o lensing.o distortions.o diff --git a/include/background.h b/include/background.h index 9ce7c5b11..51dfbd13b 100644 --- a/include/background.h +++ b/include/background.h @@ -8,6 +8,7 @@ #include "growTable.h" #include "arrays.h" #include "dei_rkck.h" +#include "evolver_rkdp45.h" #include "parser.h" /** list of possible types of spatial curvature */ diff --git a/include/common.h b/include/common.h index 00f92e8b2..58f693fe2 100644 --- a/include/common.h +++ b/include/common.h @@ -129,6 +129,18 @@ int string_begins_with(char* thestring, char beginchar); #define class_call(function, error_message_from_function, error_message_output) \ class_call_except(function, error_message_from_function,error_message_output,) +/* macro for calling output in evolvers with possiblity for approximation reached */ +#define class_evolver_output(function, error_message_from_function, error_message_output) { \ + int output_return = function; \ + if (output_return == _FAILURE_) { \ + class_call_message(error_message, output, error_message) \ + return _FAILURE_; \ + } \ + else if (output_return == _APPROXIMATION_REACHED_) { \ + done = _TRUE_; \ + } \ +} + /* same in parallel region */ #define class_call_parallel(function, error_message_from_function, error_message_output) { \ if (abort == _FALSE_) { \ @@ -348,7 +360,8 @@ struct output; */ enum evolver_type { rk, /* Runge-Kutta integrator */ - ndf15 /* stiff integrator */ + ndf15, /* stiff integrator */ + rkdp45 /* Runge-Kutta Dormand-Prince */ }; /** diff --git a/include/evolver_rkdp45.h b/include/evolver_rkdp45.h new file mode 100755 index 000000000..e2724c7c5 --- /dev/null +++ b/include/evolver_rkdp45.h @@ -0,0 +1,43 @@ +#ifndef __RK__ +#define __RK__ +#include "common.h" +/**************************************************************/ + +/** + * Boilerplate for C++ + */ +#ifdef __cplusplus +extern "C" { +#endif + +int evolver_rkdp45( + int (*derivs)(double x,double * y,double * dy, + void * parameters_and_workspace, ErrorMsg error_message), + double t_ini, + double t_final, + double * y_inout, + int* used_in_output, + int neq, + void * parameters_and_workspace_for_derivs, + double rtol, + double minimum_variation, + int (*timescale_and_approximation)(double x, + void * parameters_and_workspace, + double * timescales, + ErrorMsg error_message), + double timestep_over_timescale, + double* t_vec, + int tres, + int (*output)(double x,double y[],double dy[],int index_x,void * parameters_and_workspace, + ErrorMsg error_message), + int (*print_variables)(double x, double y[], double dy[], void *parameters_and_workspace, + ErrorMsg error_message), + ErrorMsg error_message); + +#ifdef __cplusplus +} +#endif + +/**************************************************************/ + +#endif diff --git a/include/precisions.h b/include/precisions.h index cd2eb0f18..79ee3678a 100644 --- a/include/precisions.h +++ b/include/precisions.h @@ -14,9 +14,10 @@ class_precision_parameter(a_ini_over_a_today_default,double,1.e-14) */ class_precision_parameter(background_Nloga,int,40000) /** - * Evolver to be used for thermodynamics (rk, ndf15) + * Evolver to be used for thermodynamics (rk, ndf15, rkdp45) */ -class_type_parameter(background_evolver,int,enum evolver_type,ndf15) +// class_type_parameter(background_evolver,int,enum evolver_type,rkdp45) +class_precision_parameter(background_evolver,int,2) /** * Tolerance of the background integration, giving the allowed relative integration error. * (used by both evolvers) @@ -139,7 +140,7 @@ class_precision_parameter(thermo_Nz_log,int,5000) /** * Evolver to be used for thermodynamics (rk, ndf15) */ -class_type_parameter(thermo_evolver,int,enum evolver_type,ndf15) +class_type_parameter(thermo_evolver,int,enum evolver_type,rkdp45) /** * Tolerance of the relative value of integral during thermodynamical integration * (used by both evolvers) @@ -386,7 +387,8 @@ class_precision_parameter(neglect_CMB_sources_below_visibility,double,1.0e-3) /** * The type of evolver to use: options are ndf15 or rk */ -class_type_parameter(evolver,int,enum evolver_type,ndf15) +//class_type_parameter(evolver,int,enum evolver_type,rkdp45) +class_precision_parameter(evolver,int,2) /* * Primordial parameters diff --git a/include/thermodynamics.h b/include/thermodynamics.h index f02f25910..1fbe4465e 100644 --- a/include/thermodynamics.h +++ b/include/thermodynamics.h @@ -5,6 +5,7 @@ #include "background.h" #include "evolver_ndf15.h" +#include "evolver_rkdp45.h" #include "evolver_rkck.h" #include "wrap_hyrec.h" #include "wrap_recfast.h" diff --git a/source/background.c b/source/background.c index ef7157fc1..4faa815d1 100644 --- a/source/background.c +++ b/source/background.c @@ -2206,6 +2206,13 @@ int background_solve( printf("%s\n", "Chose ndf15 as generic_evolver"); } break; + + case rkdp45: + generic_evolver = evolver_rkdp45; + if (pba->background_verbose > 1) { + printf("%s\n", "Chose rkdp45 as generic_evolver"); + } + break; } /** - perform the integration */ diff --git a/source/perturbations.c b/source/perturbations.c index c9ac985f1..d07c7bf00 100644 --- a/source/perturbations.c +++ b/source/perturbations.c @@ -3361,9 +3361,12 @@ int perturbations_solve( if (ppr->evolver == rk){ generic_evolver = evolver_rk; } - else { + else if (ppr->evolver == ndf15){ generic_evolver = evolver_ndf15; } + else if (ppr->evolver == rkdp45) { + generic_evolver = evolver_rkdp45; + } class_call(generic_evolver(perturbations_derivs, interval_limit[index_interval], diff --git a/tools/evolver_rkdp45.c b/tools/evolver_rkdp45.c new file mode 100755 index 000000000..321a50ba2 --- /dev/null +++ b/tools/evolver_rkdp45.c @@ -0,0 +1,292 @@ +#include "evolver_rkdp45.h" + +int evolver_rkdp45( + int (*derivs)(double x,double * y,double * dy, + void * parameters_and_workspace, ErrorMsg error_message), + double t_ini, + double t_final, + double * y_inout, + int* used_in_output, + int neq, + void * parameters_and_workspace_for_derivs, + double rtol, + double minimum_variation, + int (*timescale_and_approximation)(double x, + void * parameters_and_workspace, + double * timescales, + ErrorMsg error_message), + double timestep_over_timescale, + double* t_vec, + int tres, + int (*output)(double x,double y[],double dy[],int index_x,void * parameters_and_workspace, + ErrorMsg error_message), + int (*print_variables)(double x, double y[], double dy[], void *parameters_and_workspace, + ErrorMsg error_message), + ErrorMsg error_message){ + + /** Handle options: */ + + double abstol = 1e-15; // Same as in ndf15 + int stats[3] = {0, 0, 0}; + int verbose = 0; + int output_return; + + double *dy,*err,*ynew,*ytemp, *ki; + double h,absh,hmax,errmax,errtemp,hmin,hnew; + double t,tnew; + int tdir, i, j, k, idx=0; + int s=7; + double ci[s]; + double bi[s]; + double bi_diff[s]; + double ai[s][s]; + double bi_vec_y[s],bi_vec_dy[s]; + double threshold = abstol/rtol; + int nofailed; + int done = _FALSE_; + double pow_grow=0.2; + double rh,maxtmp; + //Interpolation variables: + double i01,i02,i03; + double ixx[5][3]; + double ti,ss1,ss2,ss3,ss4,*yinterp,*dyinterp; + dy = (double *) malloc(sizeof(double)*neq); + ytemp = (double *) malloc(sizeof(double)*neq); + yinterp = (double *) malloc(sizeof(double)*neq); + dyinterp = (double *) malloc(sizeof(double)*neq); + ynew = (double *) malloc(sizeof(double)*neq); + err = (double *) malloc(sizeof(double)*neq); + pow_grow = 0.2; + ki = (double *) malloc(sizeof(double)*s*neq); + /** Set method parameters for Runge-Kutta Dormand-Prince method: + ------------------------------------------------------------------ + */ + ci[0] = 0.0; ci[1] = 0.2; ci[2] = 0.3; ci[3] = 0.8; + ci[4] = 8.0/9.0; ci[5] = 1.0; ci[6] = 1.0; + bi[0] = 35.0/384.0; bi[1] = 0.0; bi[2] = 500.0/1113.0; + bi[3] = 125.0/192.0; bi[4] = -2187.0/6784.0; bi[5] = 11.0/84.0; bi[6] = 0.0; + bi_diff[0] = 71.0/57600.0; bi_diff[1] = 0.0; bi_diff[2] = -71.0/16695.0; + bi_diff[3] = 71.0/1920.0; bi_diff[4] = -17253.0/339200.0; + bi_diff[5] = 22.0/525.0; bi_diff[6] = -1.0/40.0; + ai[1][0] = 0.2; + ai[2][0] = 3.0/40.0; ai[2][1] = 9.0/40.0; + ai[3][0] = 44.0/45.0; ai[3][1] = -56.0/15.0; ai[3][2] = 32.0/9.0; + ai[4][0] = 19372.0/6561.0; ai[4][1] = -25360.0/2187.0; + ai[4][2] = 64448.0/6561.0; ai[4][3] = -212.0/729.0; + ai[5][0] = 9017.0/3168.0; ai[5][1] = -355.0/33.0; ai[5][2] = 46732.0/5247.0; + ai[5][3] = 49.0/176.0; ai[5][4] = -5103.0/18656.0; + ai[6][0] = 35.0/384.0; ai[6][1] = 0.0; ai[6][2] = 500.0/1113.0; + ai[6][3] = 125.0/192.0; ai[6][4] = -2187.0/6784.0; ai[6][5] = 11.0/84.0; + ixx[0][0] = 1500.0/371.0; ixx[0][1] = -1000.0/159.0; ixx[0][2] = 1000.0/371.0; + ixx[1][0] = -125.0/32.0; ixx[1][1] = 125.0/12.0; ixx[1][2] = -375.0/64.0; + ixx[2][0] = 9477.0/3392.0; ixx[2][1] = -729.0/106.0; ixx[2][2] = 25515.0/6784.0; + ixx[3][0] = -11.0/7.0; ixx[3][1] = 11.0/3.0; ixx[3][2] = -55.0/28.0; + ixx[4][0] = 1.5; ixx[4][1] = -4.0; ixx[4][2] = 2.5; + i01 = -183.0/64.0; i02=37.0/12.0; i03 = -145.0/128.0; + /** + Done setting method parameters. + */ + + t = t_ini; + //initialise ki + class_call((*derivs)(t,y_inout,ki,parameters_and_workspace_for_derivs,error_message),error_message,error_message); + hmin = 100.0*DBL_MIN*fabs(t); + hmax = fabs(t_final-t_ini)/10.0; + if (t_vec!=NULL) + absh = MIN(hmax,fabs(t_vec[1]-t_vec[0])); + else + absh = hmax; + if (absh==0.0) + absh = hmax; + //Compute h_initial: + for (k=0,rh=0.0; k1.0) + absh = 1.0/rh; + if (t_final>t_ini) + tdir = 1; + else + tdir = -1; + + hnew = absh*tdir; + h = hnew; + //Find current index: + if (t_vec != NULL){ + //Output at specified points. + for(idx = 0; (t_vec[idx]-t)*tdir<0.0; idx++); + } + nofailed = _TRUE_; + + while ((t-t_final)*tdir<0.0){ + h = hnew; + hmin = 100.0*DBL_MIN*fabs(t); + if (fabs(h)0.9*fabs(t_final-t)) + h = t_final-t; + //Try to take a step h. + for (k=0; k2){ + printf("Evaluating ODE at t=%g, ci[i] = %g. h=%g\n", + t+ci[i]*h,ci[i],h); + printf("y_inout = [%g,%g]. ytemp = [%g,%g]\n", + y_inout[0],y_inout[1],ytemp[0],ytemp[1]); + } + class_call((*derivs)(t+ci[i]*h,ytemp,ki+i*neq,parameters_and_workspace_for_derivs,error_message),error_message,error_message); + // Update ynew and err: + for (k=0; k3) + printf("Finished loop over i, new y has been found.\n"); + // Got new y and error estimate. + for (k=0,errmax = 0.0; kerrmax){ + errmax = errtemp; + } + } + if (verbose>3) + printf("h: %g, errmax = %g\n",h,errmax); + if (errmax>rtol){ + if (verbose>4) + printf("Step rejected..\n"); + stats[1]++; + //Step rejected. + if (nofailed == _TRUE_){ + hnew = tdir*MAX(hmin, fabs(h) * MAX(0.1, 0.8*pow(rtol/errmax,pow_grow))); + } + else{ + hnew = tdir*MAX(hmin,0.5*fabs(h)); + nofailed = _FALSE_; + } + } + else{ + //Step accepted. + stats[0]++; + if (print_variables!=NULL){ + class_call((*print_variables)(t+h,ynew,ki+6*neq, + parameters_and_workspace_for_derivs,error_message), + error_message,error_message); + } + if (verbose>1) + printf("Step accepted. t=%g, h=%g\n",t,h); + nofailed = _TRUE_; + + hnew = tdir*MAX(hmin, fabs(h) * MAX(0.1, 0.8*pow(rtol/errmax,pow_grow))); + tnew = t+h; + //Do we need to write output? + if (t_vec==NULL){ + //Refined output + for (idx=1; idx=0.0); idx++){ + if (tnew==t_vec[idx]){ + //We have hit the point exactly. Use ynew and dy=ki+6*neq + class_evolver_output((*output)(tnew,ynew,ki+6*neq,idx,parameters_and_workspace_for_derivs,error_message), + error_message,error_message); + } + else{ + //Interpolate to get output using the information in the ki-matrix: + ti = t_vec[idx]; + ss1 = (ti-t)/h; ss2=ss1*ss1; ss3=ss2*ss1; ss4=ss2*ss2; + bi_vec_y[0] = ss1+i01*ss2+i02*ss3+i03*ss4; + bi_vec_dy[0] = 1.0+i01*2.0*ss1+i02*3.0*ss2+i03*4.0*ss3; + //bi_vec_y[1] = 0.0; bi_vec_dy[1] = 0.0; + for (i=2; i<7; i++){ + bi_vec_y[i] = ixx[i-2][0]*ss2+ixx[i-2][1]*ss3+ixx[i-2][2]*ss4; + bi_vec_dy[i] = ixx[i-2][0]*2*ss1+ixx[i-2][1]*3*ss2+ixx[i-2][2]*4*ss3; + } + for (k=0; k0) + printf(" Successful steps: %d\n Failed steps: %d\n Function evaluations: %d\n", + stats[0],stats[1],stats[2]); + free(dy); + free(ynew); + free(ytemp); + free(ki); + free(err); + return _SUCCESS_; +} From 9ce2a02045c3cdce1f00a7fa9b213abc60813107 Mon Sep 17 00:00:00 2001 From: EBHolm Date: Fri, 9 Feb 2024 15:27:14 +0100 Subject: [PATCH 25/59] Fixed shooting with half-stepping iterations --- include/precisions.h | 6 ++-- tools/evolver_ndf15.c | 83 ++++++++++++++++++++++++++++++++++--------- 2 files changed, 70 insertions(+), 19 deletions(-) diff --git a/include/precisions.h b/include/precisions.h index 79ee3678a..d9f12ffa4 100644 --- a/include/precisions.h +++ b/include/precisions.h @@ -17,7 +17,7 @@ class_precision_parameter(background_Nloga,int,40000) * Evolver to be used for thermodynamics (rk, ndf15, rkdp45) */ // class_type_parameter(background_evolver,int,enum evolver_type,rkdp45) -class_precision_parameter(background_evolver,int,2) +class_precision_parameter(background_evolver,int,1) /** * Tolerance of the background integration, giving the allowed relative integration error. * (used by both evolvers) @@ -140,7 +140,7 @@ class_precision_parameter(thermo_Nz_log,int,5000) /** * Evolver to be used for thermodynamics (rk, ndf15) */ -class_type_parameter(thermo_evolver,int,enum evolver_type,rkdp45) +class_type_parameter(thermo_evolver,int,enum evolver_type,ndf15) /** * Tolerance of the relative value of integral during thermodynamical integration * (used by both evolvers) @@ -388,7 +388,7 @@ class_precision_parameter(neglect_CMB_sources_below_visibility,double,1.0e-3) * The type of evolver to use: options are ndf15 or rk */ //class_type_parameter(evolver,int,enum evolver_type,rkdp45) -class_precision_parameter(evolver,int,2) +class_precision_parameter(evolver,int,1) /* * Primordial parameters diff --git a/tools/evolver_ndf15.c b/tools/evolver_ndf15.c index a8fdae19c..5f8ec3169 100644 --- a/tools/evolver_ndf15.c +++ b/tools/evolver_ndf15.c @@ -1129,6 +1129,13 @@ int fzero_Newton(int (*func)(double *x, /** Compute F(x): */ /**printf("x = [%f, %f], delx = [%e, %e]\n", x_inout[0],x_inout[1],delx[0],delx[1]);*/ + /* + printf("Evaluating at x_inout: "); + for (int asdf = 0; asdf < x_size; asdf++) { + printf("x[%d]=%g, ", asdf, x_inout[asdf]); + } + printf("\n"); + */ class_call(func(x_inout, x_size, param, F0, error_message), error_message, error_message); /** printf("F0 = [%f, %f]\n",F0[0],F0[1]);*/ @@ -1141,31 +1148,75 @@ int fzero_Newton(int (*func)(double *x, break; } - /** - if (k==1){ - for (i=1; i<=x_size; i++){ - delx[i-1] *= F0[i-1]; - } + for (int i = 0; i < x_size; ++i){ + if (k == 1) { + delx[i] = -dxdF[i]*F0[i]; + } + else { + delx[i] = -toljac*p[i + 1]; + } } + + + /* + If shooting guess takes somewhere that gives an error, halve the step and try again + Copied from CLASS++ */ + double* x_inout_backup; + class_alloc(x_inout_backup,sizeof(double)*x_size,error_message); + for (int j = 0; j < x_size; j++) { + x_inout_backup[j] = x_inout[j]; + } /** Compute the jacobian of F: */ for (i=1; i<=x_size; i++){ - if (F0[i-1]<0.0) - delx[i-1] *= -1; - x_inout[i-1] += delx[i-1]; - - /** printf("x = [%f, %f], delx = [%e, %e]\n", - x_inout[0],x_inout[1],delx[0],delx[1]);*/ - class_call(func(x_inout, x_size, param, Fdel, error_message), - error_message, error_message); - /** printf("F = [%f, %f]\n",Fdel[0],Fdel[1]);*/ + int return_function = _FAILURE_; + for (int func_iter = 0; func_iter < 10; ++func_iter) { + x_inout[i - 1] = x_inout_backup[i - 1] + delx[i - 1]; + + /* + printf("Evaluating at x_inout: "); + for (int asdf = 0; asdf < x_size; asdf++) { + printf("x[%d]=%g, ", asdf, x_inout[asdf]); + } + printf("\n"); + */ + return_function = func(x_inout, x_size, param, Fdel, error_message); + *fevals += 1; + + if (return_function == _SUCCESS_) { + double max_y_diff = 0.; + for (int j = 0; j < x_size; ++j) { + double yscal = MAX(1e-50, 0.5*(fabs(Fdel[j]) + fabs(F0[j]))); + max_y_diff = MAX(max_y_diff, fabs((Fdel[j] - F0[j])/yscal)); + } + if (max_y_diff > tolF*tolF) { + //Significant difference + break; + } + else { + delx[i - 1] *= 2; + } + } + else { + delx[i - 1] *= -0.5; + } + } + if (return_function == _FAILURE_) { + class_test(1 == 1, error_message, "Jacobian computation in Newtons method failed during shooting") + } for (j=1; j<=x_size; j++) Fjac[j][i] = (Fdel[j-1]-F0[j-1])/delx[i-1]; x_inout[i-1] -= delx[i-1]; } - *fevals = *fevals + x_size; - + /* + printf("Found x_inout: "); + for (int asdf = 0; asdf < x_size; asdf++) { + printf("x[%d]=%g, ", asdf, x_inout[asdf]); + } + printf("\n"); + */ + for (i=1; i<=x_size; i++) p[i] = -F0[i-1]; //Right-hand side of linear equations. funcreturn = ludcmp(Fjac, x_size, indx, &d, lu_work); //Solve linear equations using LU decomposition. From fbee848107dfee049902d736a60c7522e7d5c9df Mon Sep 17 00:00:00 2001 From: EBHolm Date: Fri, 9 Feb 2024 15:27:49 +0100 Subject: [PATCH 26/59] Added rkdp to XCode project --- CLASS.xcodeproj/project.pbxproj | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CLASS.xcodeproj/project.pbxproj b/CLASS.xcodeproj/project.pbxproj index 85b02910b..45c03c4e6 100644 --- a/CLASS.xcodeproj/project.pbxproj +++ b/CLASS.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 8D541BE02B7528D900E531D0 /* evolver_rkdp45.c in Sources */ = {isa = PBXBuildFile; fileRef = 8D541BDE2B7528C500E531D0 /* evolver_rkdp45.c */; }; AF089BBE27BD516E004D8CB6 /* distortions.c in Sources */ = {isa = PBXBuildFile; fileRef = AF089BBD27BD516E004D8CB6 /* distortions.c */; }; AF089C5C27BD5191004D8CB6 /* history.c in Sources */ = {isa = PBXBuildFile; fileRef = AF089BC127BD5191004D8CB6 /* history.c */; }; AF089C5D27BD5191004D8CB6 /* energy_injection.c in Sources */ = {isa = PBXBuildFile; fileRef = AF089BC327BD5191004D8CB6 /* energy_injection.c */; }; @@ -54,6 +55,8 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 8D541BDE2B7528C500E531D0 /* evolver_rkdp45.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = evolver_rkdp45.c; sourceTree = ""; }; + 8D541BDF2B7528CE00E531D0 /* evolver_rkdp45.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = evolver_rkdp45.h; sourceTree = ""; }; 8D7F31462AF25AAF000AB359 /* macros_precision.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = macros_precision.h; sourceTree = ""; }; 8D7F31472AF25AAF000AB359 /* hermite6_interpolation_csource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = hermite6_interpolation_csource.h; sourceTree = ""; }; 8D7F31482AF25AAF000AB359 /* input.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = input.h; sourceTree = ""; }; @@ -152,6 +155,7 @@ 8D7F31492AF25AAF000AB359 /* dei_rkck.h */, 8D7F314E2AF25AAF000AB359 /* distortions.h */, 8D7F31502AF25AAF000AB359 /* evolver_ndf15.h */, + 8D541BDF2B7528CE00E531D0 /* evolver_rkdp45.h */, 8D7F31512AF25AAF000AB359 /* evolver_rkck.h */, 8D7F315A2AF25AAF000AB359 /* fourier.h */, 8D7F314D2AF25AAF000AB359 /* growTable.h */, @@ -281,6 +285,7 @@ AFDC68AE240D9F6B0044B5A3 /* growTable.c */, AFDC68AF240D9F6B0044B5A3 /* quadrature.c */, AFDC68B0240D9F6B0044B5A3 /* evolver_rkck.c */, + 8D541BDE2B7528C500E531D0 /* evolver_rkdp45.c */, AFDC68B1240D9F6B0044B5A3 /* evolver_ndf15.c */, AFDC68B2240D9F6B0044B5A3 /* hermite4_interpolation_csource.h */, AFDC68B3240D9F6B0044B5A3 /* parser.c */, @@ -360,6 +365,7 @@ AF089C5D27BD5191004D8CB6 /* energy_injection.c in Sources */, AFDC68A1240D9F500044B5A3 /* harmonic.c in Sources */, AFDC68A2240D9F500044B5A3 /* fourier.c in Sources */, + 8D541BE02B7528D900E531D0 /* evolver_rkdp45.c in Sources */, AFDC68B6240D9F6B0044B5A3 /* arrays.c in Sources */, AF089C6527BD5191004D8CB6 /* wrap_recfast.c in Sources */, AF089C5C27BD5191004D8CB6 /* history.c in Sources */, From 34e3b5895f0108b86b09911ed35db321ecf6156a Mon Sep 17 00:00:00 2001 From: EBHolm Date: Fri, 9 Feb 2024 15:29:38 +0100 Subject: [PATCH 27/59] Small update --- source/input.c | 1 - 1 file changed, 1 deletion(-) diff --git a/source/input.c b/source/input.c index 0cd0b0cf6..752df1a16 100644 --- a/source/input.c +++ b/source/input.c @@ -1305,7 +1305,6 @@ int input_get_guess(double *xguess, case Omega0_NEDE_trigger_DM: { // Need to guess NEDE_trigger_ini double Omega_M = ba.Omega0_cdm + ba.Omega0_b + ba.Omega0_ncdm_tot; - // Bad guess: This not being the actual z makes this guess quite bad, I think. Issue is, we haven't computed yet. double z_NEDE = ba.z_decay_NEDE; double trigger_mass = 0.5 * ba.H0 / ba.Bubble_trigger_H_over_m * pow(1. / (1. - ba.f_NEDE), 0.5) * pow(Omega_M * pow((1. + z_NEDE), 3) + Omega_M * pow((1. + z_NEDE), 4) / (3001.) + (1. - Omega_M), 0.5); From d443c832de1cab7e47e9f5435326f4d020857a52 Mon Sep 17 00:00:00 2001 From: EBHolm Date: Thu, 22 Feb 2024 10:13:55 +0100 Subject: [PATCH 28/59] Fixed perturbs plotting bug --- source/perturbations.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/source/perturbations.c b/source/perturbations.c index d07c7bf00..681fe1674 100644 --- a/source/perturbations.c +++ b/source/perturbations.c @@ -3466,10 +3466,6 @@ int perturbations_prepare_k_output(struct background * pba, class_store_columntitle(ppt->scalar_titles,"delta_ur",pba->has_ur); class_store_columntitle(ppt->scalar_titles,"theta_ur",pba->has_ur); class_store_columntitle(ppt->scalar_titles,"shear_ur",pba->has_ur); - /* NEDE*/ - class_store_columntitle(ppt->scalar_titles, "delta_NEDE", pba->has_NEDE_pert); - class_store_columntitle(ppt->scalar_titles, "theta_NEDE", pba->has_NEDE_pert); - class_store_columntitle(ppt->scalar_titles, "shear_NEDE", pba->has_NEDE_pert); /* Interacting dark radiation */ class_store_columntitle(ppt->scalar_titles,"delta_idr",pba->has_idr); class_store_columntitle(ppt->scalar_titles,"theta_idr",pba->has_idr); @@ -3504,13 +3500,17 @@ int perturbations_prepare_k_output(struct background * pba, /* Scalar field scf */ class_store_columntitle(ppt->scalar_titles, "delta_scf", pba->has_scf); class_store_columntitle(ppt->scalar_titles, "theta_scf", pba->has_scf); - /* NEDE: Trigger field*/ - class_store_columntitle(ppt->scalar_titles, "delta_trigger", pba->has_NEDE_trigger); - class_store_columntitle(ppt->scalar_titles, "theta_hat_trigger", pba->has_NEDE_trigger); /** Fluid */ class_store_columntitle(ppt->scalar_titles, "delta_rho_fld", pba->has_fld); class_store_columntitle(ppt->scalar_titles, "rho_plus_p_theta_fld", pba->has_fld); class_store_columntitle(ppt->scalar_titles, "delta_p_fld", pba->has_fld); + /* NEDE*/ + class_store_columntitle(ppt->scalar_titles, "delta_NEDE", pba->has_NEDE_pert); + class_store_columntitle(ppt->scalar_titles, "theta_NEDE", pba->has_NEDE_pert); + class_store_columntitle(ppt->scalar_titles, "shear_NEDE", pba->has_NEDE_pert); + /* NEDE: Trigger field*/ + class_store_columntitle(ppt->scalar_titles, "delta_trigger", pba->has_NEDE_trigger); + class_store_columntitle(ppt->scalar_titles, "theta_hat_trigger", pba->has_NEDE_trigger); ppt->number_of_scalar_titles = get_number_of_titles(ppt->scalar_titles); From 1452f5d3a033d29d8c982b8542da405a559cfe5b Mon Sep 17 00:00:00 2001 From: EBHolm Date: Thu, 22 Feb 2024 10:50:42 +0100 Subject: [PATCH 29/59] Perts fixed? --- source/background.c | 1 + source/perturbations.c | 58 +++++++++++++++++++++--------------------- 2 files changed, 30 insertions(+), 29 deletions(-) diff --git a/source/background.c b/source/background.c index 4faa815d1..4051127c2 100644 --- a/source/background.c +++ b/source/background.c @@ -1206,6 +1206,7 @@ int background_indices( pba->has_NEDE = _TRUE_; pba->has_NEDE_trigger = _TRUE_; pba->has_NEDE_pert = _TRUE_; + pba->has_NEDE_trigger_DM = _TRUE_; } if (pba->Omega0_scf != 0.) diff --git a/source/perturbations.c b/source/perturbations.c index 681fe1674..60fea7662 100644 --- a/source/perturbations.c +++ b/source/perturbations.c @@ -7909,35 +7909,6 @@ int perturbations_total_stress_energy( } } - - /*New EDE*/ - /*Here contributions to EMT are collected*/ - if (pba->has_NEDE_pert == _TRUE_) - { - - if ((ppw->approx[ppw->index_ap_sda] == (int)sda_off) && (ppw->approx[ppw->index_ap_CCa] == (int)CCa_off)) - { - - delta_NEDE = y[ppw->pv->index_pt_delta_NEDE]; - theta_NEDE = y[ppw->pv->index_pt_theta_NEDE]; - shear_NEDE = y[ppw->pv->index_pt_shear_NEDE]; - } - else - { - delta_NEDE = 0.; - theta_NEDE = 0.; - shear_NEDE = 0.; - } - - if (pba->has_NEDE_trigger_DM == _TRUE_) - { - if ((ppw->approx[ppw->index_ap_tfa] == (int)tfa_on)) - { - delta_trigger = y[ppw->pv->index_pt_delta_trigger_fld]; - theta_trigger = y[ppw->pv->index_pt_theta_trigger_fld]; - } - } - } /** - ---> (a.3.) baryon pressure perturbation */ @@ -8183,6 +8154,35 @@ int perturbations_total_stress_energy( } } + /*New EDE*/ + /*Here contributions to EMT are collected*/ + if (pba->has_NEDE_pert == _TRUE_) + { + + if ((ppw->approx[ppw->index_ap_sda] == (int)sda_off) && (ppw->approx[ppw->index_ap_CCa] == (int)CCa_off)) + { + + delta_NEDE = y[ppw->pv->index_pt_delta_NEDE]; + theta_NEDE = y[ppw->pv->index_pt_theta_NEDE]; + shear_NEDE = y[ppw->pv->index_pt_shear_NEDE]; + } + else + { + delta_NEDE = 0.; + theta_NEDE = 0.; + shear_NEDE = 0.; + } + + if (pba->has_NEDE_trigger_DM == _TRUE_) + { + if ((ppw->approx[ppw->index_ap_tfa] == (int)tfa_on)) + { + delta_trigger = y[ppw->pv->index_pt_delta_trigger_fld]; + theta_trigger = y[ppw->pv->index_pt_theta_trigger_fld]; + } + } + } + /*Trigger contribution / like scalar field below*/ if (pba->has_NEDE_trigger == _TRUE_) { From 894d9476ff34021b91b76c9c66a7910818f645fc Mon Sep 17 00:00:00 2001 From: EBHolm Date: Fri, 23 Feb 2024 08:22:06 +0100 Subject: [PATCH 30/59] Plotting fluid quantities --- python/cclassy.pxd | 2 ++ python/classy.pyx | 5 +++++ source/background.c | 15 +++++++++++++-- source/perturbations.c | 12 +++++++++--- 4 files changed, 29 insertions(+), 5 deletions(-) diff --git a/python/cclassy.pxd b/python/cclassy.pxd index 19d8a6e0a..131894beb 100644 --- a/python/cclassy.pxd +++ b/python/cclassy.pxd @@ -104,6 +104,8 @@ cdef extern from "class.h": double H_eq double z_eq double tau_eq + short has_NEDE + double a_trigger_fluid cdef struct thermodynamics: ErrorMsg error_message diff --git a/python/classy.pyx b/python/classy.pyx index b2ea1fccf..1d0f4ece7 100644 --- a/python/classy.pyx +++ b/python/classy.pyx @@ -2455,6 +2455,11 @@ cdef class Class: value = self.ba.H_eq elif name == 'tau_eq': value = self.ba.tau_eq + elif name == 'a_trigger_fluid': + if (self.ba.has_NEDE == _TRUE_): + value = self.ba.a_trigger_fluid + else: + raise CosmoSevereError("You have asked for 'a_trigger_fluid', but did not run with NEDE.") elif name == 'g_sd': self.compute(["distortions"]) if (self.sd.has_distortions == _FALSE_): diff --git a/source/background.c b/source/background.c index 4051127c2..8f4314db6 100644 --- a/source/background.c +++ b/source/background.c @@ -693,17 +693,22 @@ int background_functions( if (pba->has_NEDE_trigger == _TRUE_) { /** The contribution of the trigger field was not added to dp_dloga, add p_scf_prime here: */ + pvecback[pba->index_bg_w_trigger] = 0.; + pvecback[pba->index_bg_ca2_trigger] = 0.; if (pba->trigger_fluid_approximation == _FALSE_) { pvecback[pba->index_bg_p_prime_trigger] = pvecback[pba->index_bg_phi_prime_trigger]*(-pvecback[pba->index_bg_phi_prime_trigger]*pvecback[pba->index_bg_H]/a - 2./3.*pvecback[pba->index_bg_dV_trigger]); pvecback[pba->index_bg_p_tot_prime] += pvecback[pba->index_bg_p_prime_trigger]; } else { // Similarly in the fluid case. - double w_trigger, dw_over_da_trigger; - class_call(background_quantities_NEDE_trigger(pba, a, a*pvecback[pba->index_bg_H], pvecback[pba->index_bg_H], pvecback[pba->index_bg_H_prime], &w_trigger, &dw_over_da_trigger, NULL), + double w_trigger, dw_over_da_trigger, ca2_trigger; + class_call(background_quantities_NEDE_trigger(pba, a, a*pvecback[pba->index_bg_H], pvecback[pba->index_bg_H], pvecback[pba->index_bg_H_prime], &w_trigger, &dw_over_da_trigger, &ca2_trigger), pba->error_message, pba->error_message); + pvecback[pba->index_bg_w_trigger] = w_trigger; + pvecback[pba->index_bg_ca2_trigger] = ca2_trigger; + double dp_dloga_trigger = (a*dw_over_da_trigger - 3.*(1. + w_trigger)*w_trigger)*pvecback[pba->index_bg_rho_trigger]; pvecback[pba->index_bg_p_prime_trigger] = 0.; // Not tracked in fluid approximation pvecback[pba->index_bg_p_tot_prime] += a*pvecback[pba->index_bg_H]*dp_dloga_trigger; @@ -1321,6 +1326,8 @@ int background_indices( class_define_index(pba->index_bg_rho_trigger, pba->has_NEDE_trigger, index_bg, 1); class_define_index(pba->index_bg_p_trigger, pba->has_NEDE_trigger, index_bg, 1); class_define_index(pba->index_bg_p_prime_trigger, pba->has_NEDE_trigger, index_bg, 1); + class_define_index(pba->index_bg_w_trigger, pba->has_NEDE_trigger, index_bg, 1); + class_define_index(pba->index_bg_ca2_trigger, pba->has_NEDE_trigger, index_bg, 1); /* - end of indices in the normal vector of background values */ pba->bg_size_normal = index_bg; @@ -2838,6 +2845,8 @@ int background_output_titles( class_store_columntitle(titles, "V_trigger", pba->has_NEDE_trigger) class_store_columntitle(titles, "dV_trigger", pba->has_NEDE_trigger) class_store_columntitle(titles, "ddV_trigger", pba->has_NEDE_trigger) + class_store_columntitle(titles, "w_trigger", pba->has_NEDE_trigger) + class_store_columntitle(titles, "ca2_trigger", pba->has_NEDE_trigger) class_store_columntitle(titles,"(.)rho_scf",pba->has_scf); class_store_columntitle(titles,"(.)p_scf",pba->has_scf); @@ -2922,6 +2931,8 @@ int background_output_data( class_store_double(dataptr, pvecback[pba->index_bg_V_trigger], pba->has_NEDE_trigger, storeidx); class_store_double(dataptr, pvecback[pba->index_bg_dV_trigger], pba->has_NEDE_trigger, storeidx); class_store_double(dataptr, pvecback[pba->index_bg_ddV_trigger], pba->has_NEDE_trigger, storeidx); + class_store_double(dataptr, pvecback[pba->index_bg_w_trigger], pba->has_NEDE_trigger, storeidx); + class_store_double(dataptr, pvecback[pba->index_bg_ca2_trigger], pba->has_NEDE_trigger, storeidx); class_store_double(dataptr,pvecback[pba->index_bg_rho_scf],pba->has_scf,storeidx); class_store_double(dataptr,pvecback[pba->index_bg_p_scf],pba->has_scf,storeidx); diff --git a/source/perturbations.c b/source/perturbations.c index 60fea7662..e07b9ab6f 100644 --- a/source/perturbations.c +++ b/source/perturbations.c @@ -3511,6 +3511,7 @@ int perturbations_prepare_k_output(struct background * pba, /* NEDE: Trigger field*/ class_store_columntitle(ppt->scalar_titles, "delta_trigger", pba->has_NEDE_trigger); class_store_columntitle(ppt->scalar_titles, "theta_hat_trigger", pba->has_NEDE_trigger); + class_store_columntitle(ppt->scalar_titles, "cs2_trigger", pba->has_NEDE_trigger); ppt->number_of_scalar_titles = get_number_of_titles(ppt->scalar_titles); @@ -8233,7 +8234,7 @@ int perturbations_total_stress_energy( delta_trigger = y[ppw->pv->index_pt_delta_trigger_fld]; theta_trigger = y[ppw->pv->index_pt_theta_trigger_fld]; - ppw->delta_rho = ppw->delta_rho + ppw->pvecback[pba->index_bg_rho_trigger] * delta_trigger; + ppw->delta_rho += ppw->pvecback[pba->index_bg_rho_trigger] * delta_trigger; ppw->rho_plus_p_theta = ppw->rho_plus_p_theta + (1. + w_trigger) * ppw->pvecback[pba->index_bg_rho_trigger] * theta_trigger; @@ -9266,7 +9267,7 @@ int perturbations_print_variables(double tau, /*variables for New EDE*/ double delta_NEDE = 0., theta_NEDE = 0., shear_NEDE = 0.; - double delta_rho_trigger = 0., rho_plus_p_theta_trigger = 0.; + double delta_rho_trigger = 0., rho_plus_p_theta_trigger = 0., cs2_trigger = 0.; double delta_trigger = 0., theta_trigger = 0.; @@ -9431,7 +9432,11 @@ int perturbations_print_variables(double tau, else if ((pba->has_NEDE_trigger_DM == _TRUE_) && (ppw->approx[ppw->index_ap_tfa] == (int)tfa_on)) { - + + class_call(trigger_NEDE_cs2(pba, a, k, ppw->pvecback[pba->index_bg_H], &cs2_trigger), + pba->error_message, + pba->error_message); + delta_trigger = y[ppw->pv->index_pt_delta_trigger_fld]; theta_trigger = y[ppw->pv->index_pt_theta_trigger_fld]; rho_plus_p_theta_trigger = theta_trigger * (pvecback[pba->index_bg_rho_trigger] + pvecback[pba->index_bg_p_trigger]); @@ -9741,6 +9746,7 @@ int perturbations_print_variables(double tau, /*New EDE; Trigger field*/ class_store_double(dataptr, delta_trigger, pba->has_NEDE_trigger, storeidx); class_store_double(dataptr, rho_plus_p_theta_trigger, pba->has_NEDE_trigger, storeidx); + class_store_double(dataptr, cs2_trigger, pba->has_NEDE_trigger, storeidx); //fprintf(ppw->perturbations_output_file,"\n"); } From 87c95e5334bf3582bca39ac7b31f9bb8f30c0020 Mon Sep 17 00:00:00 2001 From: EBHolm Date: Mon, 4 Mar 2024 15:38:33 +0100 Subject: [PATCH 31/59] Compute phi and phi_prime after TFA --- source/background.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/source/background.c b/source/background.c index 8f4314db6..146be05fb 100644 --- a/source/background.c +++ b/source/background.c @@ -548,13 +548,7 @@ int background_functions( // This part is relevant after the fluid approximation has been turned on. // Here we copy the fluid energy density from the integration vector and add it to rho_tot. pvecback[pba->index_bg_rho_trigger] = pvecback_B[pba->index_bi_rho_trigger]; - // Everything else is not tracked; just set to zero. - pvecback[pba->index_bg_V_trigger] = V_trigger(pba, 0.); - pvecback[pba->index_bg_dV_trigger] = dV_trigger(pba, 0.); - pvecback[pba->index_bg_ddV_trigger] = ddV_trigger(pba, 0.); - pvecback[pba->index_bg_phi_trigger] = 0.; - pvecback[pba->index_bg_phi_prime_trigger] = 0.; - // index_bg_p_trigger is later in background_functions + // Everything is set below! // And add it to the total energy density. rho_tot += pvecback[pba->index_bg_rho_trigger]; @@ -664,6 +658,13 @@ int background_functions( // divide relativistic & nonrelativistic (not very meaningful for oscillatory models) rho_r += 3. * pvecback[pba->index_bg_p_trigger]; // field pressure contributes radiation rho_m += pvecback[pba->index_bg_rho_trigger] - 3. * pvecback[pba->index_bg_p_trigger]; // the rest contributes matter + + // Everything else is not tracked; just set to zero. + pvecback[pba->index_bg_V_trigger] = V_trigger(pba, 0.); + pvecback[pba->index_bg_dV_trigger] = dV_trigger(pba, 0.); + pvecback[pba->index_bg_ddV_trigger] = ddV_trigger(pba, 0.); + pvecback[pba->index_bg_phi_trigger] = sqrt(pvecback[pba->index_bg_rho_trigger] - pvecback[pba->index_bg_p_trigger])/pba->NEDE_trigger_mass; + pvecback[pba->index_bg_phi_prime_trigger] = sqrt(pvecback[pba->index_bg_rho_trigger] + pvecback[pba->index_bg_p_trigger]); } } From 5be71f336bb762300a1160fd05c1ca0013f69e48 Mon Sep 17 00:00:00 2001 From: EBHolm Date: Mon, 4 Mar 2024 15:44:12 +0100 Subject: [PATCH 32/59] Further changes? --- include/background.h | 2 + source/perturbations.c | 98 +++++++++++++++++++++++++++++------------- 2 files changed, 71 insertions(+), 29 deletions(-) diff --git a/include/background.h b/include/background.h index 51dfbd13b..58472f20d 100644 --- a/include/background.h +++ b/include/background.h @@ -230,6 +230,8 @@ struct background int index_bg_rho_trigger; /**< trigger field energy density */ int index_bg_p_trigger; /**< trigger field pressure */ int index_bg_p_prime_trigger; /**< scalar field pressure */ + int index_bg_w_trigger; + int index_bg_ca2_trigger; int index_bg_phi_scf; /**< scalar field value */ int index_bg_phi_prime_scf; /**< scalar field derivative wrt conformal time */ diff --git a/source/perturbations.c b/source/perturbations.c index e07b9ab6f..c114921a8 100644 --- a/source/perturbations.c +++ b/source/perturbations.c @@ -5377,33 +5377,6 @@ int perturbations_vector_init( } } } - - if (pba->has_idr == _TRUE_){ - if (ppw->approx[ppw->index_ap_rsa_idr] == (int)rsa_idr_off){ - - ppv->y[ppv->index_pt_delta_idr] = - ppw->pv->y[ppw->pv->index_pt_delta_idr]; - - ppv->y[ppv->index_pt_theta_idr] = - ppw->pv->y[ppw->pv->index_pt_theta_idr]; - - if (ppt->idr_nature == idr_free_streaming){ - - if (ppw->approx[ppw->index_ap_tca_idm_dr] == (int)tca_idm_dr_off){ - - ppv->y[ppv->index_pt_shear_idr] = - ppw->pv->y[ppw->pv->index_pt_shear_idr]; - - ppv->y[ppv->index_pt_l3_idr] = - ppw->pv->y[ppw->pv->index_pt_l3_idr]; - - for (l=4; l <= ppv->l_max_idr; l++) - ppv->y[ppv->index_pt_delta_idr+l] = - ppw->pv->y[ppw->pv->index_pt_delta_idr+l]; - } - } - } - } /*New EDE*/ /*NEDE and trigger perturbations not affectecd by ncdm fluid approximation, so we just copy the values from the previous integration step.*/ @@ -5443,6 +5416,32 @@ int perturbations_vector_init( } } + if (pba->has_idr == _TRUE_){ + if (ppw->approx[ppw->index_ap_rsa_idr] == (int)rsa_idr_off){ + + ppv->y[ppv->index_pt_delta_idr] = + ppw->pv->y[ppw->pv->index_pt_delta_idr]; + + ppv->y[ppv->index_pt_theta_idr] = + ppw->pv->y[ppw->pv->index_pt_theta_idr]; + + if (ppt->idr_nature == idr_free_streaming){ + + if (ppw->approx[ppw->index_ap_tca_idm_dr] == (int)tca_idm_dr_off){ + + ppv->y[ppv->index_pt_shear_idr] = + ppw->pv->y[ppw->pv->index_pt_shear_idr]; + + ppv->y[ppv->index_pt_l3_idr] = + ppw->pv->y[ppw->pv->index_pt_l3_idr]; + + for (l=4; l <= ppv->l_max_idr; l++) + ppv->y[ppv->index_pt_delta_idr+l] = + ppw->pv->y[ppw->pv->index_pt_delta_idr+l]; + } + } + } + } a = ppw->pvecback[pba->index_bg_a]; index_pt = ppw->pv->index_pt_psi0_ncdm1; @@ -8182,6 +8181,43 @@ int perturbations_total_stress_energy( theta_trigger = y[ppw->pv->index_pt_theta_trigger_fld]; } } + + if ((ppw->approx[ppw->index_ap_CCa] == (int)CCa_off) && (ppw->approx[ppw->index_ap_sda] == (int)sda_off)) + { + double w_NEDE, dw_over_da_NEDE, ca2_NEDE, cs2_NEDE; + class_call(background_quantities_NEDE(pba, a, a_prime_over_a, NULL, NULL, &w_NEDE, &dw_over_da_NEDE, &ca2_NEDE), + pba->error_message, + pba->error_message); + double w_prime_NEDE = dw_over_da_NEDE * a_prime_over_a * a; + /** Decide if effective rest-frame sound speed is constant or tracking the adiabatic sound speed (note that w_NEDE=const). */ + + if (pba->NEDE_fld_nature == NEDE_fld_A) + { + if (ppt->NEDE_ceff_nature == NEDE_ceff_const) + cs2_NEDE = ppt->three_ceff2_NEDE / 3.; + else + cs2_NEDE = ca2_NEDE; + } + + ppw->delta_rho = ppw->delta_rho + ppw->pvecback[pba->index_bg_rho_NEDE] * delta_NEDE; + + ppw->rho_plus_p_theta = ppw->rho_plus_p_theta + (1. + w_NEDE) * ppw->pvecback[pba->index_bg_rho_NEDE] * theta_NEDE; + + ppw->rho_plus_p_shear = ppw->rho_plus_p_shear + (1. + w_NEDE) * ppw->pvecback[pba->index_bg_rho_NEDE] * shear_NEDE; + + /*Compare to arXiv: astro-ph/9801234v2, Eq. 3 and thereafter; use dictionnary theta/k = v.*/ + ppw->delta_p += cs2_NEDE * ppw->pvecback[pba->index_bg_rho_NEDE] * delta_NEDE + (cs2_NEDE - ca2_NEDE) * (3. * a_prime_over_a * ((1. + w_NEDE) * ppw->pvecback[pba->index_bg_rho_NEDE] * theta_NEDE) / k / k); + + /* This part is implemented overly correct as first case cannot happen*/ + if (a < pba->a_decay) + { + ppw->rho_plus_p_tot += 0.0; + } + else + { + ppw->rho_plus_p_tot += (1. + w_NEDE) * ppw->pvecback[pba->index_bg_rho_NEDE]; + } + } } /*Trigger contribution / like scalar field below*/ @@ -8222,7 +8258,9 @@ int perturbations_total_stress_energy( else if ((pba->has_NEDE_trigger_DM == _TRUE_) && (ppw->approx[ppw->index_ap_tfa] == (int)tfa_on)) { // This is the case when the fluid approximation is used.. - double cs2_trigger, ca2_trigger, w_trigger; + double cs2_trigger = 0; + double ca2_trigger = 0; + double w_trigger = 0; class_call(trigger_NEDE_cs2(pba, a, k, ppw->pvecback[pba->index_bg_H], &cs2_trigger), pba->error_message, pba->error_message); @@ -10869,7 +10907,9 @@ int perturbations_derivs(double tau, else if ((pba->has_NEDE_trigger_DM == _TRUE_) && (ppw->approx[ppw->index_ap_tfa] == (int)tfa_on)) { - double cs2_trigger, w_trigger, ca2_trigger; + double cs2_trigger = 0; + double w_trigger = 0; + double ca2_trigger = 0; // Get the sound speed. class_call(trigger_NEDE_cs2(pba, a, k, ppw->pvecback[pba->index_bg_H], &cs2_trigger), pba->error_message, From cd57831e310c8c3097cd98079ec2321908b2054d Mon Sep 17 00:00:00 2001 From: EBHolm Date: Tue, 5 Mar 2024 13:42:01 +0100 Subject: [PATCH 33/59] Delayed onset of BG trigger fluid approx --- include/background.h | 2 ++ source/background.c | 26 ++++++++++++++++---------- source/input.c | 1 + 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/include/background.h b/include/background.h index 58472f20d..90aea38c1 100644 --- a/include/background.h +++ b/include/background.h @@ -113,6 +113,8 @@ struct background double H_fluid; double H_prime_fluid; double a_trigger_fluid; + double a_trigger_fluid_safe; + double trigger_fluid_safety_factor; /* NEDE decay time */ diff --git a/source/background.c b/source/background.c index 146be05fb..bf95273b4 100644 --- a/source/background.c +++ b/source/background.c @@ -2253,7 +2253,7 @@ int background_solve( (important to do this before changing indices in the next step) */ double* pvecback; class_alloc(pvecback,pba->bg_size*sizeof(double),pba->error_message); - double a = pba->a_trigger_fluid; + double a = pba->a_trigger_fluid_safe; class_call(background_functions(pba, a, pvecback_integration, normal_info, pvecback), pba->error_message, pba->error_message); @@ -2291,7 +2291,7 @@ int background_solve( new_pvecback_integration[index_bi_new] = pvecback_integration[index_bi_new + 1]; // +1 because new_pvecback has 1 less bi B variable defined } class_call(generic_evolver(background_derivs, - log(pba->a_trigger_fluid), + log(pba->a_trigger_fluid_safe), loga_final, new_pvecback_integration, used_in_output, @@ -3144,14 +3144,20 @@ int background_sources( if (pba->has_NEDE_trigger) { double H = bg_table_row[pba->index_bg_H]; - if ((H < pba->trigger_fluid_H_over_m*pba->NEDE_trigger_mass) && (pba->trigger_fluid_approximation == _FALSE_)) { - // Turn on NEDE trigger fluid approximation - printf("From BG Sources: Turned on FA at a=%g\n", a); - pba->a_trigger_fluid = a; - pba->H_fluid = H; - pba->H_prime_fluid = bg_table_row[pba->index_bg_H_prime]; - // pba->trigger_fluid_approximation = _TRUE_; - return _APPROXIMATION_REACHED_; + if (H < pba->trigger_fluid_H_over_m*pba->NEDE_trigger_mass) { + if (pba->a_trigger_fluid == 100.) { + // Turn on NEDE trigger fluid approximation + printf("From BG Sources: Turned on FA at a=%g\n", a); + pba->a_trigger_fluid = a; + pba->H_fluid = H; + pba->H_prime_fluid = bg_table_row[pba->index_bg_H_prime]; + } + else if (pba->trigger_fluid_approximation == _FALSE_) { + if (a > pba->trigger_fluid_safety_factor*pba->a_trigger_fluid) { // 1.05 is a safety factor, same as in old TriggerCLASS + pba->a_trigger_fluid_safe = a; + return _APPROXIMATION_REACHED_; + } + } } } return _SUCCESS_; diff --git a/source/input.c b/source/input.c index 752df1a16..bf4ae2c8a 100644 --- a/source/input.c +++ b/source/input.c @@ -3280,6 +3280,7 @@ int input_read_parameters_species(struct file_content * pfc, class_read_double("NEDE_trigger_fluid_H_m", pba->trigger_fluid_H_over_m); pba->phi_prime_ini_trigger = 0; // This value is set to the attractor later. + pba->trigger_fluid_safety_factor = 1.05; if (pba->NEDE_fld_nature == NEDE_fld_A) pba->Omega0_NEDE = pba->Omega_NEDE * pow(1. / (1. + pba->z_decay_NEDE), (3. + pba->three_eos_NEDE)); From 1bff345f7bc5d704060a5ceb1f50fc7274ac327e Mon Sep 17 00:00:00 2001 From: EBHolm Date: Tue, 5 Mar 2024 15:20:46 +0100 Subject: [PATCH 34/59] Commented out print --- source/background.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/background.c b/source/background.c index bf95273b4..11a3c0f2c 100644 --- a/source/background.c +++ b/source/background.c @@ -3147,7 +3147,7 @@ int background_sources( if (H < pba->trigger_fluid_H_over_m*pba->NEDE_trigger_mass) { if (pba->a_trigger_fluid == 100.) { // Turn on NEDE trigger fluid approximation - printf("From BG Sources: Turned on FA at a=%g\n", a); + // printf("From BG Sources: Turned on FA at a=%g\n", a); pba->a_trigger_fluid = a; pba->H_fluid = H; pba->H_prime_fluid = bg_table_row[pba->index_bg_H_prime]; From 29526f8be56ec65a8adedb7e7c2a66da58dfec09 Mon Sep 17 00:00:00 2001 From: EBHolm Date: Tue, 5 Mar 2024 15:27:56 +0100 Subject: [PATCH 35/59] Adjusted delayed trigger FA criterion --- source/background.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/background.c b/source/background.c index 11a3c0f2c..7d5c98316 100644 --- a/source/background.c +++ b/source/background.c @@ -3153,7 +3153,7 @@ int background_sources( pba->H_prime_fluid = bg_table_row[pba->index_bg_H_prime]; } else if (pba->trigger_fluid_approximation == _FALSE_) { - if (a > pba->trigger_fluid_safety_factor*pba->a_trigger_fluid) { // 1.05 is a safety factor, same as in old TriggerCLASS + if (H*pba->trigger_fluid_safety_factor < pba->trigger_fluid_H_over_m*pba->NEDE_trigger_mass) { // 1.05 is a safety factor, same as in old TriggerCLASS pba->a_trigger_fluid_safe = a; return _APPROXIMATION_REACHED_; } From 8d64fefba12468059b77e06a2417a699a121ee17 Mon Sep 17 00:00:00 2001 From: EBHolm Date: Tue, 5 Mar 2024 17:39:03 +0100 Subject: [PATCH 36/59] Changes to bg --- source/background.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/source/background.c b/source/background.c index 7d5c98316..1bc64274d 100644 --- a/source/background.c +++ b/source/background.c @@ -663,8 +663,10 @@ int background_functions( pvecback[pba->index_bg_V_trigger] = V_trigger(pba, 0.); pvecback[pba->index_bg_dV_trigger] = dV_trigger(pba, 0.); pvecback[pba->index_bg_ddV_trigger] = ddV_trigger(pba, 0.); - pvecback[pba->index_bg_phi_trigger] = sqrt(pvecback[pba->index_bg_rho_trigger] - pvecback[pba->index_bg_p_trigger])/pba->NEDE_trigger_mass; - pvecback[pba->index_bg_phi_prime_trigger] = sqrt(pvecback[pba->index_bg_rho_trigger] + pvecback[pba->index_bg_p_trigger]); + // pvecback[pba->index_bg_phi_trigger] = sqrt(pvecback[pba->index_bg_rho_trigger] - pvecback[pba->index_bg_p_trigger])/pba->NEDE_trigger_mass; + // pvecback[pba->index_bg_phi_prime_trigger] = sqrt(pvecback[pba->index_bg_rho_trigger] + pvecback[pba->index_bg_p_trigger]); + pvecback[pba->index_bg_phi_trigger] = 0.; + pvecback[pba->index_bg_phi_prime_trigger] = 0.; } } From 0e2cfcc0552c05acaee9753494b419072f8ba447 Mon Sep 17 00:00:00 2001 From: EBHolm Date: Fri, 8 Mar 2024 09:56:43 +0100 Subject: [PATCH 37/59] Adjusted guess for robustness --- source/input.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/input.c b/source/input.c index bf4ae2c8a..0706be24b 100644 --- a/source/input.c +++ b/source/input.c @@ -1308,7 +1308,7 @@ int input_get_guess(double *xguess, double z_NEDE = ba.z_decay_NEDE; double trigger_mass = 0.5 * ba.H0 / ba.Bubble_trigger_H_over_m * pow(1. / (1. - ba.f_NEDE), 0.5) * pow(Omega_M * pow((1. + z_NEDE), 3) + Omega_M * pow((1. + z_NEDE), 4) / (3001.) + (1. - Omega_M), 0.5); - xguess[index_guess] = pow(75. * ba.H0 * ba.H0 * pfzw->target_value[index_guess] * pow(z_NEDE, 3) / pow(trigger_mass, 2), 0.5); + xguess[index_guess] = 0.5*pow(75. * ba.H0 * ba.H0 * pfzw->target_value[index_guess] * pow(z_NEDE, 3) / pow(trigger_mass, 2), 0.5); dxdy[index_guess] = 0.5 * xguess[index_guess] / pfzw->target_value[index_guess]; break; } From d11b8300fbb32d943ec0d25c76a94160fe0d097e Mon Sep 17 00:00:00 2001 From: EBHolm Date: Tue, 12 Mar 2024 09:58:20 +0100 Subject: [PATCH 38/59] Made cosmosevereerrro into non-severe error --- source/background.c | 8 ++++++++ source/input.c | 6 ------ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/source/background.c b/source/background.c index 1bc64274d..1ed319b4a 100644 --- a/source/background.c +++ b/source/background.c @@ -2044,6 +2044,14 @@ int background_checks( pba->error_message, "incorrect transition redshift"); } + + if (pba->has_NEDE == _TRUE_) { + class_test(pba->f_NEDE > 0.4, pba->error_message, + "Choose a smaller amount of NEDE as the code has not been tested for f_NEDE > 0.4."); + + class_test(pba->NEDE_trigger_ini < 0., pba->error_message, + "NEDE trigger field cannot run with negative initial value."); + } /** - in verbose mode, send to standard output some additional information on non-obvious background parameters */ if (pba->background_verbose > 0) { diff --git a/source/input.c b/source/input.c index 0706be24b..85f0f82b5 100644 --- a/source/input.c +++ b/source/input.c @@ -3267,12 +3267,6 @@ int input_read_parameters_species(struct file_content * pfc, class_test(pba->z_decay_NEDE == 0, errmsg, "In input file, z_decay_NEDE needs to be specified for NEDE (The trigger mass as input parameter has been retired in v5)."); - - class_test(pba->f_NEDE > 0.4, errmsg, - "Choose a smaller amount of NEDE as the code has not been tested for f_NEDE > 0.4."); - - class_test(pba->NEDE_trigger_ini < 0., errmsg, - "NEDE trigger field cannot run with negative initial value."); class_test(((pba->NEDE_trigger_ini == 0.) && (pba->Omega0_trigger == 0.)), errmsg, "You must input either 'NEDE_trigger_ini' or 'Omega0_NEDE_trigger_DM' to set the trigger density.") From 174227ad1340413f2737b99b3356c7b2694a3e20 Mon Sep 17 00:00:00 2001 From: EBHolm Date: Tue, 19 Mar 2024 10:18:24 +0100 Subject: [PATCH 39/59] Fixed S8 shooting bug --- source/input.c | 49 +++++++++++++------------------------------------ 1 file changed, 13 insertions(+), 36 deletions(-) diff --git a/source/input.c b/source/input.c index 85f0f82b5..dba77dead 100644 --- a/source/input.c +++ b/source/input.c @@ -421,13 +421,11 @@ int input_read_from_file(struct file_content * pfc, errmsg, errmsg); - /** If no shooting is necessary, initialize read parameters without it */ - if (has_shooting == _FALSE_){ + /** Update structs with input that is potentially updated after shooting */ class_call(input_read_parameters(pfc,ppr,pba,pth,ppt,ptr,ppm,phr,pfo,ple,psd,pop, errmsg), errmsg, errmsg); - } /** Write info on the read/unread parameters. This is the correct place to do it, since we want it to happen after all the shooting business, @@ -733,12 +731,6 @@ int input_shooting(struct file_content * pfc, fprintf(stdout,"Shooting completed using %d function evaluations\n",fevals); } - /** Read all parameters from the fc obtained through shooting */ - class_call(input_read_parameters(&(fzw.fc),ppr,pba,pth,ppt,ptr,ppm,phr,pfo,ple,psd,pop, - errmsg), - errmsg, - errmsg); - /** Set status of shooting */ pba->shooting_failed = shooting_failed; if (pba->shooting_failed == _TRUE_) { @@ -747,16 +739,12 @@ int input_shooting(struct file_content * pfc, perturbations_free_input(ppt); } - /* all parameters read in fzw must be considered as read in pfc. At the same - time the parameters read before in pfc (like theta_s,...) must still be - considered as read (hence we could not do a memcopy) */ - for (i=0; i < pfc->size; i ++) { - if (fzw.fc.read[i] == _TRUE_) - pfc->read[i] = _TRUE_; - } - - /* Free tuned pfc */ - parser_free(&(fzw.fc)); + /** Copy the tuned fzw to pfc */ + pfc->name = fzw.fc.name; + pfc->value = fzw.fc.value; + pfc->size = fzw.fc.size; + pfc->read = fzw.fc.read; + free(fzw.fc.filename); /** Free arrays allocated */ free(unknown_parameter); @@ -854,23 +842,12 @@ int input_shooting(struct file_content * pfc, fzw.fc.name[pfc->size], fzw.fc.value[pfc->size]); } - - /* Now read the remaining parameters from the fine tuned fzw into the individual structures */ - class_call(input_read_parameters(&(fzw.fc),ppr,pba,pth,ppt,ptr,ppm,phr,pfo,ple,psd,pop, - errmsg), - errmsg, - errmsg); - - /* all parameters read in fzw must be considered as read in pfc. At the same - time the parameters read before in pfc (like theta_s,...) must still be - considered as read (hence we could not do a memcopy) */ - for (i=0; i < pfc->size; i ++) { - if (fzw.fc.read[i] == _TRUE_) - pfc->read[i] = _TRUE_; - } - - /* Free tuned pfc */ - parser_free(&(fzw.fc)); + + free(fzw.fc.filename); + pfc->name = fzw.fc.name; + pfc->value = fzw.fc.value; + pfc->size = fzw.fc.size; + pfc->read = fzw.fc.read; /** Free arrays allocated */ free(fzw.unknown_parameters_index); From 77facdd880c0b0bfbf55df6b7cab2d3710ffec01 Mon Sep 17 00:00:00 2001 From: EBHolm Date: Wed, 20 Mar 2024 13:31:51 +0100 Subject: [PATCH 40/59] Fixed settings precision parameters --- source/input.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/source/input.c b/source/input.c index dba77dead..11db85d98 100644 --- a/source/input.c +++ b/source/input.c @@ -420,7 +420,14 @@ int input_read_from_file(struct file_content * pfc, errmsg), errmsg, errmsg); - + + if (has_shooting == _TRUE_) { + class_call(input_read_precisions(pfc,ppr,pba,pth,ppt,ptr,ppm,phr,pfo,ple,psd,pop, + errmsg), + errmsg, + errmsg); + } + /** Update structs with input that is potentially updated after shooting */ class_call(input_read_parameters(pfc,ppr,pba,pth,ppt,ptr,ppm,phr,pfo,ple,psd,pop, errmsg), From 5d7d9a8a6f819f12bad360d161a57ead7242cddf Mon Sep 17 00:00:00 2001 From: EBHolm Date: Wed, 20 Mar 2024 14:10:21 +0100 Subject: [PATCH 41/59] Last fixes to shooting bug --- source/input.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/source/input.c b/source/input.c index 11db85d98..25ca882fb 100644 --- a/source/input.c +++ b/source/input.c @@ -747,10 +747,10 @@ int input_shooting(struct file_content * pfc, } /** Copy the tuned fzw to pfc */ - pfc->name = fzw.fc.name; - pfc->value = fzw.fc.value; + free(pfc->name); pfc->name = fzw.fc.name; + free(pfc->value); pfc->value = fzw.fc.value; pfc->size = fzw.fc.size; - pfc->read = fzw.fc.read; + free(pfc->read); pfc->read = fzw.fc.read; free(fzw.fc.filename); /** Free arrays allocated */ @@ -851,10 +851,10 @@ int input_shooting(struct file_content * pfc, } free(fzw.fc.filename); - pfc->name = fzw.fc.name; - pfc->value = fzw.fc.value; + free(pfc->name); pfc->name = fzw.fc.name; + free(pfc->value); pfc->value = fzw.fc.value; pfc->size = fzw.fc.size; - pfc->read = fzw.fc.read; + free(pfc->read); pfc->read = fzw.fc.read; /** Free arrays allocated */ free(fzw.unknown_parameters_index); From 4cf09d0c9683e9e01a0f021d950f2e6077047dd0 Mon Sep 17 00:00:00 2001 From: EBHolm Date: Wed, 20 Mar 2024 14:10:36 +0100 Subject: [PATCH 42/59] Cleanup of NEDE implementation --- source/background.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/background.c b/source/background.c index 1ed319b4a..708039135 100644 --- a/source/background.c +++ b/source/background.c @@ -1404,14 +1404,14 @@ int background_indices( if (pba->trigger_fluid_approximation == _TRUE_) { // Only rho is evolved within the fluid approximation class_define_index(pba->index_bi_rho_trigger, _TRUE_, index_bi, 1); - pba->index_bi_phi_trigger = NAN; - pba->index_bi_phi_prime_trigger = NAN; + pba->index_bi_phi_trigger = -1; + pba->index_bi_phi_prime_trigger = -1; } else { // Not fluid approximation, evolve the field itself class_define_index(pba->index_bi_phi_trigger, _TRUE_, index_bi, 1); class_define_index(pba->index_bi_phi_prime_trigger, _TRUE_, index_bi, 1); - pba->index_bi_rho_trigger = NAN; + pba->index_bi_rho_trigger = -1; } } @@ -2281,7 +2281,7 @@ int background_solve( pba->trigger_fluid_approximation = _TRUE_; if (pba->background_verbose > 1) { - printf("Turned on NEDE trigger fluid approximation at a=%g with rho_trigger=%g, matching the FA initial value rho_trigger=%g.\n", pvecback_integration[pba->index_bg_a], pvecback_integration[pba->index_bg_rho_trigger], rho_tfa); + printf("Turned on NEDE trigger fluid approximation at a=%g with rho_trigger=%g, matching the FA initial value rho_trigger=%g.\n", pvecback[pba->index_bg_a], pvecback[pba->index_bg_rho_trigger], rho_tfa); } /** - assign new indices after approximation turned on */ From 0092a81351ecb759cee5dba781a5dba019779c56 Mon Sep 17 00:00:00 2001 From: EBHolm Date: Thu, 21 Mar 2024 13:12:09 +0100 Subject: [PATCH 43/59] Final fixes to shooting --- source/input.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/source/input.c b/source/input.c index 25ca882fb..27d64617c 100644 --- a/source/input.c +++ b/source/input.c @@ -421,7 +421,16 @@ int input_read_from_file(struct file_content * pfc, errmsg, errmsg); + if (has_shooting == _TRUE_ && pba->shooting_failed == _TRUE_) { + return _SUCCESS_; + } if (has_shooting == _TRUE_) { + if (pba->shooting_failed == _TRUE_) { + // Shooting failed, but error must be thrown in background in order to trigger a + // runtime error, so here we skip the rest and go straight to background + return _SUCCESS_; + } + class_call(input_read_precisions(pfc,ppr,pba,pth,ppt,ptr,ppm,phr,pfo,ple,psd,pop, errmsg), errmsg, @@ -429,10 +438,10 @@ int input_read_from_file(struct file_content * pfc, } /** Update structs with input that is potentially updated after shooting */ - class_call(input_read_parameters(pfc,ppr,pba,pth,ppt,ptr,ppm,phr,pfo,ple,psd,pop, - errmsg), - errmsg, - errmsg); + class_call(input_read_parameters(pfc,ppr,pba,pth,ppt,ptr,ppm,phr,pfo,ple,psd,pop, + errmsg), + errmsg, + errmsg); /** Write info on the read/unread parameters. This is the correct place to do it, since we want it to happen after all the shooting business, @@ -740,11 +749,6 @@ int input_shooting(struct file_content * pfc, /** Set status of shooting */ pba->shooting_failed = shooting_failed; - if (pba->shooting_failed == _TRUE_) { - background_free_input(pba); - thermodynamics_free_input(pth); - perturbations_free_input(ppt); - } /** Copy the tuned fzw to pfc */ free(pfc->name); pfc->name = fzw.fc.name; From 719ddacd1b63367881cd4395c540a834dfeb09e6 Mon Sep 17 00:00:00 2001 From: EBHolm Date: Thu, 21 Mar 2024 16:59:56 +0100 Subject: [PATCH 44/59] Fixed ugly bug where S8 was not indicated read --- source/input.c | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/source/input.c b/source/input.c index 27d64617c..cbe09c4f1 100644 --- a/source/input.c +++ b/source/input.c @@ -422,20 +422,10 @@ int input_read_from_file(struct file_content * pfc, errmsg); if (has_shooting == _TRUE_ && pba->shooting_failed == _TRUE_) { + // Shooting failed, but error must be thrown in background in order to trigger a + // runtime error, so here we skip the rest and go straight to background return _SUCCESS_; } - if (has_shooting == _TRUE_) { - if (pba->shooting_failed == _TRUE_) { - // Shooting failed, but error must be thrown in background in order to trigger a - // runtime error, so here we skip the rest and go straight to background - return _SUCCESS_; - } - - class_call(input_read_precisions(pfc,ppr,pba,pth,ppt,ptr,ppm,phr,pfo,ple,psd,pop, - errmsg), - errmsg, - errmsg); - } /** Update structs with input that is potentially updated after shooting */ class_call(input_read_parameters(pfc,ppr,pba,pth,ppt,ptr,ppm,phr,pfo,ple,psd,pop, @@ -750,11 +740,19 @@ int input_shooting(struct file_content * pfc, /** Set status of shooting */ pba->shooting_failed = shooting_failed; + /* all parameters read in fzw must be considered as read in pfc. At the same + time the parameters read before in pfc (like theta_s,...) must still be + considered as read (hence we could not do a memcopy) */ + for (i=0; i < pfc->size; i ++) { + if (fzw.fc.read[i] == _TRUE_) + pfc->read[i] = _TRUE_; + } + free(fzw.fc.read); + /** Copy the tuned fzw to pfc */ free(pfc->name); pfc->name = fzw.fc.name; free(pfc->value); pfc->value = fzw.fc.value; pfc->size = fzw.fc.size; - free(pfc->read); pfc->read = fzw.fc.read; free(fzw.fc.filename); /** Free arrays allocated */ @@ -854,11 +852,19 @@ int input_shooting(struct file_content * pfc, fzw.fc.value[pfc->size]); } + /* all parameters read in fzw must be considered as read in pfc. At the same + time the parameters read before in pfc (like theta_s,...) must still be + considered as read (hence we could not do a memcopy) */ + for (i=0; i < pfc->size; i ++) { + if (fzw.fc.read[i] == _TRUE_) + pfc->read[i] = _TRUE_; + } + free(fzw.fc.read); + free(fzw.fc.filename); free(pfc->name); pfc->name = fzw.fc.name; free(pfc->value); pfc->value = fzw.fc.value; pfc->size = fzw.fc.size; - free(pfc->read); pfc->read = fzw.fc.read; /** Free arrays allocated */ free(fzw.unknown_parameters_index); From ba379ab3bd6d7975337e2d467f6b12020a7ddd25 Mon Sep 17 00:00:00 2001 From: EBHolm Date: Fri, 22 Mar 2024 14:29:06 +0100 Subject: [PATCH 45/59] Restructured input and parser functions --- include/parser.h | 13 +++++++++ source/input.c | 73 ++++++++++++++---------------------------------- tools/parser.c | 34 ++++++++++++++++++++++ 3 files changed, 68 insertions(+), 52 deletions(-) diff --git a/include/parser.h b/include/parser.h index 1214231a0..c869aa00d 100644 --- a/include/parser.h +++ b/include/parser.h @@ -100,6 +100,19 @@ extern "C" { int N_options, int* valid); + int parser_extend(struct file_content * pfc, + int N_extend, + ErrorMsg errmsg); + + int parser_copy(struct file_content * pfc_source, + struct file_content * pfc_destination, + int index_start, + int index_end); + + int parser_init_from_pfc(struct file_content * pfc_source, + struct file_content * pfc_destination, + ErrorMsg errmsg); + #ifdef __cplusplus } #endif diff --git a/source/input.c b/source/input.c index cbe09c4f1..1f95d6484 100644 --- a/source/input.c +++ b/source/input.c @@ -600,17 +600,11 @@ int input_shooting(struct file_content * pfc, /* We need to remember that we shot so we can clean up properly */ *has_shooting=_TRUE_; - /* Create file content structure with additional entries */ - class_call(parser_init(&(fzw.fc), - pfc->size+unknown_parameters_size, - pfc->filename, - errmsg), + class_call(parser_extend(pfc, unknown_parameters_size, errmsg), errmsg,errmsg); - /* Copy input file content to the new file content structure: */ - memcpy(fzw.fc.name, pfc->name, pfc->size*sizeof(FileArg)); - memcpy(fzw.fc.value, pfc->value, pfc->size*sizeof(FileArg)); - memcpy(fzw.fc.read, pfc->read, pfc->size*sizeof(short)); + class_call(parser_init_from_pfc(pfc, &(fzw.fc), errmsg), + errmsg,errmsg); class_alloc(unknown_parameter, unknown_parameters_size*sizeof(double), @@ -642,7 +636,7 @@ int input_shooting(struct file_content * pfc, fzw.target_name[counter] = index_target; /* store target value of target parameter */ fzw.target_value[counter] = param1; - fzw.unknown_parameters_index[counter]=pfc->size+counter; + fzw.unknown_parameters_index[counter]=pfc->size+counter-unknown_parameters_size; /* substitute the name of the target parameter with the name of the corresponding unknown parameter */ strcpy(fzw.fc.name[fzw.unknown_parameters_index[counter]],unknown_namestrings[index_target]); @@ -740,22 +734,11 @@ int input_shooting(struct file_content * pfc, /** Set status of shooting */ pba->shooting_failed = shooting_failed; - /* all parameters read in fzw must be considered as read in pfc. At the same - time the parameters read before in pfc (like theta_s,...) must still be - considered as read (hence we could not do a memcopy) */ - for (i=0; i < pfc->size; i ++) { - if (fzw.fc.read[i] == _TRUE_) - pfc->read[i] = _TRUE_; - } - free(fzw.fc.read); - - /** Copy the tuned fzw to pfc */ - free(pfc->name); pfc->name = fzw.fc.name; - free(pfc->value); pfc->value = fzw.fc.value; - pfc->size = fzw.fc.size; - free(fzw.fc.filename); + parser_copy(&(fzw.fc), pfc, pfc->size - unknown_parameters_size, pfc->size); /** Free arrays allocated */ + class_call(parser_free(&(fzw.fc)), + errmsg, errmsg); free(unknown_parameter); free(fzw.unknown_parameters_index); free(fzw.target_name); @@ -776,17 +759,12 @@ int input_shooting(struct file_content * pfc, if (flag1 == _TRUE_ || flag2 == _TRUE_) { /* Tell the main function that shooting indeed has occured */ *has_shooting=_TRUE_; - /* Create file content structure with additional entries */ - class_call(parser_init(&(fzw.fc), - pfc->size+1, - pfc->filename, - errmsg), - errmsg,errmsg); - /* Copy input file content to the new file content structure: */ - memcpy(fzw.fc.name, pfc->name, pfc->size*sizeof(FileArg)); - memcpy(fzw.fc.value, pfc->value, pfc->size*sizeof(FileArg)); - memcpy(fzw.fc.read, pfc->read, pfc->size*sizeof(short)); + class_call(parser_extend(pfc, 1, errmsg), + errmsg,errmsg); + + class_call(parser_init_from_pfc(pfc, &(fzw.fc), errmsg), + errmsg,errmsg); fzw.target_size = 1; class_alloc(fzw.unknown_parameters_index, @@ -809,11 +787,11 @@ int input_shooting(struct file_content * pfc, fzw.target_value[0] = param2; } /* store target value of target parameter */ - fzw.unknown_parameters_index[0]=pfc->size; + fzw.unknown_parameters_index[0]=pfc->size - 1; fzw.required_computation_stage = cs_nonlinear; /* substitute the name of the target parameter with the name of the corresponding unknown parameter */ - strcpy(fzw.fc.name[pfc->size],"A_s"); + strcpy(fzw.fc.name[pfc->size - 1],"A_s"); /* Print to the user */ if (input_verbose > 0) { @@ -845,27 +823,18 @@ int input_shooting(struct file_content * pfc, A_s = (fzw.target_value[0]/sigma8_or_S8) *(fzw.target_value[0]/sigma8_or_S8) * A_s; //(truesigma/sigma_for_guess)^2 *A_s_for_guess /* Store the derived value with high enough accuracy */ - sprintf(fzw.fc.value[pfc->size],"%.20e",A_s); + sprintf(fzw.fc.value[pfc->size - 1],"%.20e",A_s); if (input_verbose > 0) { fprintf(stdout," -> found '%s = %s'\n", - fzw.fc.name[pfc->size], - fzw.fc.value[pfc->size]); + fzw.fc.name[pfc->size - 1], + fzw.fc.value[pfc->size - 1]); } - /* all parameters read in fzw must be considered as read in pfc. At the same - time the parameters read before in pfc (like theta_s,...) must still be - considered as read (hence we could not do a memcopy) */ - for (i=0; i < pfc->size; i ++) { - if (fzw.fc.read[i] == _TRUE_) - pfc->read[i] = _TRUE_; - } - free(fzw.fc.read); - - free(fzw.fc.filename); - free(pfc->name); pfc->name = fzw.fc.name; - free(pfc->value); pfc->value = fzw.fc.value; - pfc->size = fzw.fc.size; + parser_copy(&(fzw.fc), pfc, pfc->size - 1, pfc->size); + /** Free arrays allocated */ + class_call(parser_free(&(fzw.fc)), + errmsg, errmsg); /** Free arrays allocated */ free(fzw.unknown_parameters_index); free(fzw.target_name); diff --git a/tools/parser.c b/tools/parser.c index 602e2b729..93fed3348 100644 --- a/tools/parser.c +++ b/tools/parser.c @@ -738,3 +738,37 @@ int parser_check_options(char * strinput, char ** options, int N_options, int* v return _SUCCESS_; } + +int parser_extend(struct file_content * pfc, int N_extend, ErrorMsg errmsg) { + // Append N_extend empty entries in the vectors of pfc + pfc->size += N_extend; + class_realloc(pfc->name, pfc->name, pfc->size*sizeof(FileArg), errmsg); + class_realloc(pfc->value, pfc->value, pfc->size*sizeof(FileArg), errmsg); + class_realloc(pfc->read, pfc->read, pfc->size*sizeof(short), errmsg); + for (int index = pfc->size - N_extend; index < pfc->size; index++) { + pfc->name[index][0] = '\0'; + pfc->value[index][0] = '\0'; + pfc->read[index] = _FALSE_; + } + return _SUCCESS_; +} + +int parser_copy(struct file_content * pfc_source, struct file_content * pfc_destination, int index_start, int index_end) { + // Copy the entries from index_start to index_end from pfc_source to pfc_destination + memcpy(pfc_destination->name + index_start, pfc_source->name + index_start, (index_end - index_start)*sizeof(FileArg)); + memcpy(pfc_destination->value + index_start, pfc_source->value + index_start, (index_end - index_start)*sizeof(FileArg)); + memcpy(pfc_destination->read + index_start, pfc_source->read + index_start, (index_end - index_start)*sizeof(short)); + return _SUCCESS_; +} + +int parser_init_from_pfc(struct file_content * pfc_source, struct file_content * pfc_destination, ErrorMsg errmsg) { + class_call(parser_init(pfc_destination, + pfc_source->size, + pfc_source->filename, + errmsg), + errmsg,errmsg); + parser_copy(pfc_source, pfc_destination, 0, pfc_source->size); + return _SUCCESS_; +} + + From 0a252b8e0d0a14089c4e06c93cfc5fe6bda2f492 Mon Sep 17 00:00:00 2001 From: EBHolm Date: Fri, 22 Mar 2024 15:46:21 +0100 Subject: [PATCH 46/59] Only activate trigger FA is NEDE has decayed This makes perturbations quite slow at the large z_decay limit... --- source/background.c | 4 ++-- source/perturbations.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/source/background.c b/source/background.c index 708039135..690220164 100644 --- a/source/background.c +++ b/source/background.c @@ -3154,9 +3154,9 @@ int background_sources( if (pba->has_NEDE_trigger) { double H = bg_table_row[pba->index_bg_H]; - if (H < pba->trigger_fluid_H_over_m*pba->NEDE_trigger_mass) { + if (H < pba->trigger_fluid_H_over_m*pba->NEDE_trigger_mass && a > 1./(pba->z_decay_NEDE + 1)) { if (pba->a_trigger_fluid == 100.) { - // Turn on NEDE trigger fluid approximation + // Turn on NEDE trigger fluid approximation (only if NEDE has already decayed) // printf("From BG Sources: Turned on FA at a=%g\n", a); pba->a_trigger_fluid = a; pba->H_fluid = H; diff --git a/source/perturbations.c b/source/perturbations.c index c114921a8..17e32c9c2 100644 --- a/source/perturbations.c +++ b/source/perturbations.c @@ -4118,13 +4118,13 @@ int perturbations_vector_init( /* Here we allocate memory for the variables to be integrated depending on NEDE phase */ if (pba->has_NEDE_pert == _TRUE_) { if (pba->has_NEDE_trigger == _TRUE_) { - if ((ppw->approx[ppw->index_ap_CCa] == (int)CCa_on) || ((pba->has_NEDE_trigger_DM == _TRUE_) && (ppw->approx[ppw->index_ap_tfa] == (int)tfa_off))) { + if (pba->has_NEDE_trigger_DM == _TRUE_ && ppw->approx[ppw->index_ap_tfa] == (int)tfa_off) { /* trigger field density */ class_define_index(ppv->index_pt_phi_trigger, pba->has_NEDE_trigger, index_pt, 1); /* trigger field velocity */ class_define_index(ppv->index_pt_phi_prime_trigger, pba->has_NEDE_trigger, index_pt, 1); } - else if ((pba->has_NEDE_trigger_DM == _TRUE_) && (ppw->approx[ppw->index_ap_tfa] == (int)tfa_on)) { + else if (pba->has_NEDE_trigger_DM == _TRUE_ && ppw->approx[ppw->index_ap_tfa] == (int)tfa_on) { class_define_index(ppv->index_pt_delta_trigger_fld, pba->has_NEDE_trigger_DM, index_pt, 1); class_define_index(ppv->index_pt_theta_trigger_fld, pba->has_NEDE_trigger_DM, index_pt, 1); } From e2e1fca6fd8f592dd76d012cf9bf78d1aa08fc8f Mon Sep 17 00:00:00 2001 From: EBHolm Date: Tue, 26 Mar 2024 12:27:50 +0100 Subject: [PATCH 47/59] Fixed setting fluid_approximation False initially --- Makefile | 2 +- source/background.c | 19 ++++++++++--------- source/perturbations.c | 8 ++++---- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/Makefile b/Makefile index 9bb029a00..8f58d3902 100644 --- a/Makefile +++ b/Makefile @@ -38,7 +38,7 @@ OPTFLAG = -O3 #OPTFLAG = -fast # your openmp flag (comment for compiling without openmp) -#OMPFLAG = -fopenmp +OMPFLAG = -fopenmp #OMPFLAG = -mp -mp=nonuma -mp=allcores -g #OMPFLAG = -openmp diff --git a/source/background.c b/source/background.c index 690220164..ae33bf8d0 100644 --- a/source/background.c +++ b/source/background.c @@ -1400,7 +1400,7 @@ int background_indices( /* -> NEDE trigger field, its derivative and energy density Important that these are the last defined B bi indices! */ - if (pba->has_NEDE_trigger) { + if (pba->has_NEDE_trigger == _TRUE_) { if (pba->trigger_fluid_approximation == _TRUE_) { // Only rho is evolved within the fluid approximation class_define_index(pba->index_bi_rho_trigger, _TRUE_, index_bi, 1); @@ -2161,9 +2161,6 @@ int background_solve( int n_ncdm; /** - assign values to all indices in vectors of background quantities */ - if (pba->has_NEDE_trigger) { - pba->trigger_fluid_approximation = _FALSE_; - } class_call(background_indices(pba), pba->error_message, pba->error_message); @@ -2255,7 +2252,7 @@ int background_solve( pba->error_message); double* new_pvecback_integration; - if (pba->has_NEDE_trigger) { + if (pba->has_NEDE_trigger == _TRUE_) { if (pba->a_trigger_fluid != 100.) { // Fluid approximation was requested; integration was stopped early, continue integration with new variables @@ -2264,6 +2261,7 @@ int background_solve( double* pvecback; class_alloc(pvecback,pba->bg_size*sizeof(double),pba->error_message); double a = pba->a_trigger_fluid_safe; + //printf("\n\nAT FLUID APPROXIMATION TRIGGER: a_trigger_fluid_safe=%g\n", a); class_call(background_functions(pba, a, pvecback_integration, normal_info, pvecback), pba->error_message, pba->error_message); @@ -2627,6 +2625,7 @@ int background_initial_conditions( */ if (pba->has_NEDE_trigger == _TRUE_ && pba->has_NEDE == _TRUE_) { /* phi'_ini = -1/5 * phi_ini a^2 m^2 / (a H) where H = sqrt(rho) ins class conventions. */ + pba->trigger_fluid_approximation = _FALSE_; pvecback_integration[pba->index_bi_phi_trigger] = pba->NEDE_trigger_ini; pvecback_integration[pba->index_bi_phi_prime_trigger] = -1./5.*pba->NEDE_trigger_ini*pow(pba->NEDE_trigger_mass, 2)/pow(rho_rad, 0.5)*a; } @@ -3152,18 +3151,20 @@ int background_sources( pba->error_message, pba->error_message); - if (pba->has_NEDE_trigger) { + if (pba->has_NEDE_trigger == _TRUE_) { double H = bg_table_row[pba->index_bg_H]; if (H < pba->trigger_fluid_H_over_m*pba->NEDE_trigger_mass && a > 1./(pba->z_decay_NEDE + 1)) { if (pba->a_trigger_fluid == 100.) { // Turn on NEDE trigger fluid approximation (only if NEDE has already decayed) - // printf("From BG Sources: Turned on FA at a=%g\n", a); + //printf("From BG Sources: Turned on FA at a=%g\n", a); + //printf("At this time, pba->trigger_fluid_approximation=%d\n", pba->trigger_fluid_approximation); pba->a_trigger_fluid = a; pba->H_fluid = H; pba->H_prime_fluid = bg_table_row[pba->index_bg_H_prime]; } else if (pba->trigger_fluid_approximation == _FALSE_) { if (H*pba->trigger_fluid_safety_factor < pba->trigger_fluid_H_over_m*pba->NEDE_trigger_mass) { // 1.05 is a safety factor, same as in old TriggerCLASS + //printf("From BG Sources: Set a_trigger_fluid_safe at a=%g\n", a); pba->a_trigger_fluid_safe = a; return _APPROXIMATION_REACHED_; } @@ -3304,11 +3305,11 @@ int background_output_budget( class_print_species("Spatial Curvature",k); budget_other+=pba->Omega0_k; } - if (pba->has_NEDE) { + if (pba->has_NEDE == _TRUE_) { class_print_species("New EDE", NEDE); budget_other += pba->Omega0_NEDE; } - if (pba->has_NEDE_trigger) { + if (pba->has_NEDE_trigger == _TRUE_) { class_print_species("New EDE trigger", trigger); budget_other += pba->Omega0_trigger; } diff --git a/source/perturbations.c b/source/perturbations.c index 17e32c9c2..3d4675ba4 100644 --- a/source/perturbations.c +++ b/source/perturbations.c @@ -2936,7 +2936,7 @@ int perturbations_workspace_init( /*CCa_off: NEDE is decribed as a fluid with fluctuations.*/ ppw->approx[ppw->index_ap_CCa] = (int)CCa_on; - if (pba->has_NEDE_trigger) { + if (pba->has_NEDE_trigger == _TRUE_) { ppw->approx[ppw->index_ap_tfa] = (int)tfa_off; } } @@ -3896,7 +3896,7 @@ int perturbations_find_approximation_switches( (interval_approx[index_switch][ppw->index_ap_CCa] == (int)CCa_off)) { fprintf(stdout, "Mode k=%e: will create decaying NEDE mode at tau=%e\n", k, interval_limit[index_switch]); } - if (pba->has_NEDE_trigger_DM) { + if (pba->has_NEDE_trigger_DM == _TRUE_) { if ((interval_approx[index_switch - 1][ppw->index_ap_tfa] == (int)tfa_off) && (interval_approx[index_switch][ppw->index_ap_tfa] == (int)tfa_on)) { fprintf(stdout, "Mode k=%e: will switch on trigger fluid approximation at tau=%e\n", k, interval_limit[index_switch]); @@ -7246,7 +7246,7 @@ int perturbations_approximations( } /*New EDE: Here we define the switch for the trigger fluid approximation*/ // stop3 - if (pba->has_NEDE_trigger) + if (pba->has_NEDE_trigger == _TRUE_) { if ((ppw->pvecback[pba->index_bg_a] <= pba->a_trigger_fluid) || (pba->has_NEDE_trigger_DM == _FALSE_)) { @@ -9661,7 +9661,7 @@ int perturbations_print_variables(double tau, if (pba->has_NEDE_pert) { delta_NEDE -= 4. * pvecback[pba->index_bg_H]*pvecback[pba->index_bg_a]*alpha; theta_NEDE += k*k*alpha; - if (pba->has_NEDE_trigger){ + if (pba->has_NEDE_trigger == _TRUE_){ delta_trigger += alpha*(-3.0*H*(1.0+pvecback[pba->index_bg_p_trigger]/pvecback[pba->index_bg_rho_trigger])); theta_trigger += k*k*alpha; } From c17c0d605eb5cdc104050af67bc1cca931eb2f9b Mon Sep 17 00:00:00 2001 From: EBHolm Date: Tue, 26 Mar 2024 12:39:27 +0100 Subject: [PATCH 48/59] Maybe fixed bug --- source/background.c | 1 - source/input.c | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/source/background.c b/source/background.c index ae33bf8d0..dbbbf9edd 100644 --- a/source/background.c +++ b/source/background.c @@ -2625,7 +2625,6 @@ int background_initial_conditions( */ if (pba->has_NEDE_trigger == _TRUE_ && pba->has_NEDE == _TRUE_) { /* phi'_ini = -1/5 * phi_ini a^2 m^2 / (a H) where H = sqrt(rho) ins class conventions. */ - pba->trigger_fluid_approximation = _FALSE_; pvecback_integration[pba->index_bi_phi_trigger] = pba->NEDE_trigger_ini; pvecback_integration[pba->index_bi_phi_prime_trigger] = -1./5.*pba->NEDE_trigger_ini*pow(pba->NEDE_trigger_mass, 2)/pow(rho_rad, 0.5)*a; } diff --git a/source/input.c b/source/input.c index 1f95d6484..bfc9ece6d 100644 --- a/source/input.c +++ b/source/input.c @@ -3236,8 +3236,9 @@ int input_read_parameters_species(struct file_content * pfc, class_read_double("NEDE_trigger_fluid_H_m", pba->trigger_fluid_H_over_m); - pba->phi_prime_ini_trigger = 0; // This value is set to the attractor later. + pba->trigger_fluid_approximation = _FALSE_; pba->trigger_fluid_safety_factor = 1.05; + pba->phi_prime_ini_trigger = 0; // This value is set to the attractor later. if (pba->NEDE_fld_nature == NEDE_fld_A) pba->Omega0_NEDE = pba->Omega_NEDE * pow(1. / (1. + pba->z_decay_NEDE), (3. + pba->three_eos_NEDE)); From 9788cffc1f6f048e012df8d2c202acf00f078aeb Mon Sep 17 00:00:00 2001 From: EBHolm Date: Tue, 26 Mar 2024 12:52:53 +0100 Subject: [PATCH 49/59] Added some derived parameters --- python/cclassy.pxd | 2 ++ python/classy.pyx | 10 ++++++++++ 2 files changed, 12 insertions(+) diff --git a/python/cclassy.pxd b/python/cclassy.pxd index 131894beb..7fdc30561 100644 --- a/python/cclassy.pxd +++ b/python/cclassy.pxd @@ -106,6 +106,8 @@ cdef extern from "class.h": double tau_eq short has_NEDE double a_trigger_fluid + double NEDE_trigger_ini + double NEDE_trigger_mass cdef struct thermodynamics: ErrorMsg error_message diff --git a/python/classy.pyx b/python/classy.pyx index 1d0f4ece7..bd4ee6130 100644 --- a/python/classy.pyx +++ b/python/classy.pyx @@ -2460,6 +2460,16 @@ cdef class Class: value = self.ba.a_trigger_fluid else: raise CosmoSevereError("You have asked for 'a_trigger_fluid', but did not run with NEDE.") + elif name == 'NEDE_trigger_ini': + if (self.ba.has_NEDE == _TRUE_): + value = self.ba.NEDE_trigger_ini + else: + raise CosmoSevereError("You have asked for 'NEDE_trigger_ini', but did not run with NEDE.") + elif name == 'NEDE_trigger_mass': + if (self.ba.has_NEDE == _TRUE_): + value = self.ba.NEDE_trigger_mass + else: + raise CosmoSevereError("You have asked for 'NEDE_trigger_mass', but did not run with NEDE.") elif name == 'g_sd': self.compute(["distortions"]) if (self.sd.has_distortions == _FALSE_): From a47b66455df6e0390aed6595c5e9bbe414fb2fbf Mon Sep 17 00:00:00 2001 From: EBHolm Date: Tue, 26 Mar 2024 14:11:46 +0100 Subject: [PATCH 50/59] Fixed reading error when shooting failed --- source/input.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/source/input.c b/source/input.c index bfc9ece6d..e1d268b12 100644 --- a/source/input.c +++ b/source/input.c @@ -421,18 +421,18 @@ int input_read_from_file(struct file_content * pfc, errmsg, errmsg); - if (has_shooting == _TRUE_ && pba->shooting_failed == _TRUE_) { - // Shooting failed, but error must be thrown in background in order to trigger a - // runtime error, so here we skip the rest and go straight to background - return _SUCCESS_; - } - /** Update structs with input that is potentially updated after shooting */ class_call(input_read_parameters(pfc,ppr,pba,pth,ppt,ptr,ppm,phr,pfo,ple,psd,pop, errmsg), errmsg, errmsg); + if (has_shooting == _TRUE_ && pba->shooting_failed == _TRUE_) { + // Shooting failed, but error must be thrown in background in order to trigger a + // runtime error, so here we skip the rest and go straight to background + return _SUCCESS_; + } + /** Write info on the read/unread parameters. This is the correct place to do it, since we want it to happen after all the shooting business, and after the final reading of all parameters */ From 75b23e9c42d84ad91b4b8075d19eacb4ef5dd81d Mon Sep 17 00:00:00 2001 From: EBHolm Date: Thu, 18 Apr 2024 10:34:24 +0200 Subject: [PATCH 51/59] Fix --- include/perturbations.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/perturbations.h b/include/perturbations.h index 3937fdf44..c4c795225 100644 --- a/include/perturbations.h +++ b/include/perturbations.h @@ -185,6 +185,7 @@ struct perturbations double three_ceff2_NEDE; double three_cvis2_NEDE; + double cs2_NEDE; int NEDE_ceff_nature; double z_max_pk; /**< when we compute only the matter spectrum / transfer functions, but not the CMB, we are sometimes interested to sample source functions at very high redshift, way before recombination. This z_max_pk will then fix the initial sampling time of the sources. */ From 584a4e56017cf0265b8f8902d1fb078376d71d94 Mon Sep 17 00:00:00 2001 From: EBHolm Date: Thu, 18 Apr 2024 18:38:48 +0200 Subject: [PATCH 52/59] Implemented twice linear NEDE sound speed params --- include/perturbations.h | 7 ++++++- source/input.c | 23 +++++++++++++++++++++++ source/perturbations.c | 34 +++++++++++++++++++++++++++++++--- 3 files changed, 60 insertions(+), 4 deletions(-) diff --git a/include/perturbations.h b/include/perturbations.h index c4c795225..6019ae75d 100644 --- a/include/perturbations.h +++ b/include/perturbations.h @@ -42,7 +42,7 @@ enum tfa_flags {tfa_off, tfa_on}; enum tavg_flags {tavg_off, tavg_on}; /* Nature of NEDE fluid, either effective rest-frame sound speed is tracking the adiabatic sound speed (adiabatic case) or it is constant. */ -enum NEDE_ceff_nature {NEDE_ceff_const, NEDE_ceff_tracking}; +enum NEDE_ceff_nature {NEDE_ceff_const, NEDE_ceff_tracking, NEDE_ceff_twice_linear}; //@} @@ -187,6 +187,11 @@ struct perturbations double three_cvis2_NEDE; double cs2_NEDE; int NEDE_ceff_nature; + // Parameters of the piecewise linear sound speed + double NEDE_cs2_slope_1; + double NEDE_cs2_intercept_1; + double NEDE_cs2_slope_2; + double NEDE_cs2_intercept_2; double z_max_pk; /**< when we compute only the matter spectrum / transfer functions, but not the CMB, we are sometimes interested to sample source functions at very high redshift, way before recombination. This z_max_pk will then fix the initial sampling time of the sources. */ diff --git a/source/input.c b/source/input.c index e1d268b12..bab09d97d 100644 --- a/source/input.c +++ b/source/input.c @@ -3220,6 +3220,29 @@ int input_read_parameters_species(struct file_content * pfc, { ppt->NEDE_ceff_nature = NEDE_ceff_tracking; } + if ((strstr(string_NEDE, "twice linear") != NULL) || (strstr(string1, "Twice linear") != NULL) || (strstr(string1, "twice") != NULL)) + { + ppt->NEDE_ceff_nature = NEDE_ceff_twice_linear; + flag1 = 0; + flag2 = 0; + flag3 = 0; + int flag4 = 0; + class_call(parser_read_double(pfc,"NEDE_cs2_slope_1",&ppt->NEDE_cs2_slope_1,&flag1,errmsg), + errmsg, + errmsg); + class_call(parser_read_double(pfc,"NEDE_cs2_intercept_1",&ppt->NEDE_cs2_intercept_1,&flag2,errmsg), + errmsg, + errmsg); + class_call(parser_read_double(pfc,"NEDE_cs2_slope_2",&ppt->NEDE_cs2_slope_2,&flag3,errmsg), + errmsg, + errmsg); + class_call(parser_read_double(pfc,"NEDE_cs2_intercept_2",&ppt->NEDE_cs2_intercept_2,&flag4,errmsg), + errmsg, + errmsg); + if (flag1*flag2*flag3*flag4 != 1) { + class_test(_TRUE_, errmsg, "To use the 'twice linear' parametrisation of the NEDE sound speed, you need to input all of the following: NEDE_cs2_slope_1, NEDE_cs2_intercept_1, NEDE_cs2_slope_2, NEDE_cs2_intercept_2.") + } + } } if ((pba->Omega_NEDE > 0) || (pba->f_NEDE > 0)) { diff --git a/source/perturbations.c b/source/perturbations.c index 3d4675ba4..9ed780c5d 100644 --- a/source/perturbations.c +++ b/source/perturbations.c @@ -755,8 +755,12 @@ int perturbations_init( printf(" -> NEDE perturbation details:\n"); if (ppt->NEDE_ceff_nature == NEDE_ceff_const) printf(" -> 3*ceff2: %f (constant)\n", ppt->three_ceff2_NEDE); - else + else if (ppt->NEDE_ceff_nature == NEDE_ceff_tracking) printf(" -> ceff2 = ca2 (tracking) \n"); + else if (ppt->NEDE_ceff_nature == NEDE_ceff_twice_linear) + printf(" -> ceff2 = twice linear \n"); + else + printf(" -> ceff2 not understood!\n"); printf(" -> 3*cvis2: %f (constant) \n", ppt->three_cvis2_NEDE); printf(" -> Junction_tag: %d \n", pba->Junction_tag); printf(" -> NEDE sub-dominant condition: %e \n", ppr->sub_dom_cond); @@ -8195,8 +8199,20 @@ int perturbations_total_stress_energy( { if (ppt->NEDE_ceff_nature == NEDE_ceff_const) cs2_NEDE = ppt->three_ceff2_NEDE / 3.; - else + else if (ppt->NEDE_ceff_nature == NEDE_ceff_tracking) cs2_NEDE = ca2_NEDE; + else if (ppt->NEDE_ceff_nature == NEDE_ceff_twice_linear) { + double k_horizon = 2*_PI_*a*pvecback[pba->index_bg_H]; + if (k > k_horizon) { + cs2_NEDE = ppt->NEDE_cs2_slope_1*k + ppt->NEDE_cs2_intercept_1; + } + else { + cs2_NEDE = ppt->NEDE_cs2_slope_2*k + ppt->NEDE_cs2_intercept_2; + } + } + else { + class_test(_FALSE_, ppt->error_message, "NEDE sound speed not understood.") + } } ppw->delta_rho = ppw->delta_rho + ppw->pvecback[pba->index_bg_rho_NEDE] * delta_NEDE; @@ -10869,8 +10885,20 @@ int perturbations_derivs(double tau, { if (ppt->NEDE_ceff_nature == NEDE_ceff_const) cs2_NEDE = ppt->three_ceff2_NEDE / 3.; - else + else if (ppt->NEDE_ceff_nature == NEDE_ceff_tracking) cs2_NEDE = ca2_NEDE; + else if (ppt->NEDE_ceff_nature == NEDE_ceff_twice_linear) { + double k_horizon = 2*_PI_*a*pvecback[pba->index_bg_H]; + if (k > k_horizon) { + cs2_NEDE = ppt->NEDE_cs2_slope_1*k + ppt->NEDE_cs2_intercept_1; + } + else { + cs2_NEDE = ppt->NEDE_cs2_slope_2*k + ppt->NEDE_cs2_intercept_2; + } + } + else { + class_test(_FALSE_, ppt->error_message, "NEDE sound speed not understood.") + } } /** - -----> NEDE density */ From b90e6e1c662f8fb797119db11f16c6652c98f0cb Mon Sep 17 00:00:00 2001 From: EBHolm Date: Thu, 18 Apr 2024 18:39:20 +0200 Subject: [PATCH 53/59] Small fix --- source/perturbations.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/perturbations.c b/source/perturbations.c index 9ed780c5d..4987e83f4 100644 --- a/source/perturbations.c +++ b/source/perturbations.c @@ -8202,7 +8202,7 @@ int perturbations_total_stress_energy( else if (ppt->NEDE_ceff_nature == NEDE_ceff_tracking) cs2_NEDE = ca2_NEDE; else if (ppt->NEDE_ceff_nature == NEDE_ceff_twice_linear) { - double k_horizon = 2*_PI_*a*pvecback[pba->index_bg_H]; + double k_horizon = 2*_PI_*a*ppw->pvecback[pba->index_bg_H]; if (k > k_horizon) { cs2_NEDE = ppt->NEDE_cs2_slope_1*k + ppt->NEDE_cs2_intercept_1; } From c039a283f05a5064fb907cd755cbac4703e23645 Mon Sep 17 00:00:00 2001 From: EBHolm Date: Fri, 19 Apr 2024 08:43:10 +0200 Subject: [PATCH 54/59] Removed not-needed error throw --- source/perturbations.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/source/perturbations.c b/source/perturbations.c index 4987e83f4..38d0250d1 100644 --- a/source/perturbations.c +++ b/source/perturbations.c @@ -8210,9 +8210,6 @@ int perturbations_total_stress_energy( cs2_NEDE = ppt->NEDE_cs2_slope_2*k + ppt->NEDE_cs2_intercept_2; } } - else { - class_test(_FALSE_, ppt->error_message, "NEDE sound speed not understood.") - } } ppw->delta_rho = ppw->delta_rho + ppw->pvecback[pba->index_bg_rho_NEDE] * delta_NEDE; From cef2d40fd060c85274b42fd2fe0f4a9395d4fe1f Mon Sep 17 00:00:00 2001 From: EBHolm Date: Mon, 22 Apr 2024 13:24:43 +0200 Subject: [PATCH 55/59] Error message when negative sound speed --- source/perturbations.c | 1 + 1 file changed, 1 insertion(+) diff --git a/source/perturbations.c b/source/perturbations.c index 38d0250d1..6f91e23a6 100644 --- a/source/perturbations.c +++ b/source/perturbations.c @@ -8209,6 +8209,7 @@ int perturbations_total_stress_energy( else { cs2_NEDE = ppt->NEDE_cs2_slope_2*k + ppt->NEDE_cs2_intercept_2; } + class_test(cs2_NEDE < 0., ppt->error_message, "NEDE sound speed is negative with the given 'twice linear' parametrisation parameters.") } } From 27da445d6ba52feb78b58b3a5a978bbe615c2d7a Mon Sep 17 00:00:00 2001 From: EBHolm Date: Wed, 22 May 2024 13:40:36 +0200 Subject: [PATCH 56/59] Warning fixes --- source/background.c | 6 +----- source/input.c | 2 +- source/perturbations.c | 25 ++++++++++++++++--------- 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/source/background.c b/source/background.c index dbbbf9edd..2b47c592c 100644 --- a/source/background.c +++ b/source/background.c @@ -908,13 +908,9 @@ int background_quantities_NEDE( double *dw_over_da, double *ca2) { - double x, a_over_a_non_rel; - double rhohat, phat, drhohat_dx, dphat_dx; - int last_index_1 = 1, last_index_2, i; double w_prime; double w_local = 0.; - double rho_local, dw_over_da_local; - double *vec; + double rho_local; switch (pba->NEDE_fld_nature) { diff --git a/source/input.c b/source/input.c index bab09d97d..278b66903 100644 --- a/source/input.c +++ b/source/input.c @@ -516,7 +516,7 @@ int input_shooting(struct file_content * pfc, double param1, param2; double * unknown_parameter; int unknown_parameters_size; - int counter, index_target, i; + int counter, index_target; int fevals=0; double xzero; double *dxdF, *x_inout; diff --git a/source/perturbations.c b/source/perturbations.c index 6f91e23a6..20e541e09 100644 --- a/source/perturbations.c +++ b/source/perturbations.c @@ -5633,6 +5633,9 @@ int perturbations_vector_init( amp_rel = 1.; sigma_NEDE = 0.0; } + else { + class_stop(ppt->error_message, "Junction tag value not understood.") + } // printf("k: %f, aH: %f, h': %f, eta': %f, alpha1: %f, alpha2: %f \n",k,a_prime_over_a ,ppw->pvecmetric[ppw->index_mt_h_prime],ppw->pvecmetric[ppw->index_mt_eta_prime],(ppw->pvecmetric[ppw->index_mt_h_prime] + 6.0*ppw->pvecmetric[ppw->index_mt_eta_prime])/(2.0 *k*k),ppw->pvecmetric[ppw->index_mt_alpha]); @@ -8179,7 +8182,7 @@ int perturbations_total_stress_energy( if (pba->has_NEDE_trigger_DM == _TRUE_) { - if ((ppw->approx[ppw->index_ap_tfa] == (int)tfa_on)) + if (ppw->approx[ppw->index_ap_tfa] == (int)tfa_on) { delta_trigger = y[ppw->pv->index_pt_delta_trigger_fld]; theta_trigger = y[ppw->pv->index_pt_theta_trigger_fld]; @@ -8192,7 +8195,6 @@ int perturbations_total_stress_energy( class_call(background_quantities_NEDE(pba, a, a_prime_over_a, NULL, NULL, &w_NEDE, &dw_over_da_NEDE, &ca2_NEDE), pba->error_message, pba->error_message); - double w_prime_NEDE = dw_over_da_NEDE * a_prime_over_a * a; /** Decide if effective rest-frame sound speed is constant or tracking the adiabatic sound speed (note that w_NEDE=const). */ if (pba->NEDE_fld_nature == NEDE_fld_A) @@ -8211,6 +8213,12 @@ int perturbations_total_stress_energy( } class_test(cs2_NEDE < 0., ppt->error_message, "NEDE sound speed is negative with the given 'twice linear' parametrisation parameters.") } + else { + class_stop(ppt->error_message, "NEDE c_eff nature not understood.") + } + } + else { + class_stop(ppt->error_message, "NEDE fld nature not understood.") } ppw->delta_rho = ppw->delta_rho + ppw->pvecback[pba->index_bg_rho_NEDE] * delta_NEDE; @@ -10873,7 +10881,6 @@ int perturbations_derivs(double tau, class_call(background_quantities_NEDE(pba, a, a_prime_over_a, NULL, NULL, &w_NEDE, &dw_over_da_NEDE, &ca2_NEDE), pba->error_message, pba->error_message); - double w_prime_NEDE = dw_over_da_NEDE * a_prime_over_a * a; /*The NEDE implementation so far assumes w_prime_NEDE=0*/ @@ -10895,9 +10902,12 @@ int perturbations_derivs(double tau, } } else { - class_test(_FALSE_, ppt->error_message, "NEDE sound speed not understood.") + class_stop(ppt->error_message, "NEDE sound speed not understood.") } } + else { + class_stop(ppt->error_message, "NEDE fld nature not understood.") + } /** - -----> NEDE density */ dy[pv->index_pt_delta_NEDE] = @@ -11872,11 +11882,8 @@ int trigger_NEDE_cs2( m = pba->NEDE_trigger_mass; // We use the improved formula for the sound speed derived in arXiv: 2201.10238 - if (cs2 != NULL) - { - *cs2 = pow((a * m) / k * (pow(1.0 + pow(k / (a * m), 2), 0.5) - 1.0), 2) + 5.0 / 4.0 * pow(H / m, 2); - //*cs2 = k * k / (4.0 * pow(pba->NEDE_trigger_mass, 2) * a * a + k*k); - } + *cs2 = pow((a * m) / k * (pow(1.0 + pow(k / (a * m), 2), 0.5) - 1.0), 2) + 5.0 / 4.0 * pow(H / m, 2); + //*cs2 = k * k / (4.0 * pow(pba->NEDE_trigger_mass, 2) * a * a + k*k); return _SUCCESS_; } From 701e612f4859b9a67b35c6baccfd1fdf0fa4fecc Mon Sep 17 00:00:00 2001 From: EBHolm Date: Wed, 22 May 2024 14:01:18 +0200 Subject: [PATCH 57/59] Removed unneeded imports --- include/transfer.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/include/transfer.h b/include/transfer.h index f243432aa..dbe018214 100644 --- a/include/transfer.h +++ b/include/transfer.h @@ -5,8 +5,6 @@ #include "fourier.h" #include "hyperspherical.h" -#include -#include #include "errno.h" /* macro: test if index_tt is in the range between index and index+num, while the flag is true */ From a2dd1f836cf90068698f95944d1493ae9d9be2cb Mon Sep 17 00:00:00 2001 From: EBHolm Date: Thu, 22 Aug 2024 09:23:32 +0200 Subject: [PATCH 58/59] Added notebook, input folder and montepython_tree --- CLASS.xcodeproj/project.pbxproj | 556 ------ .../contents.xcworkspacedata | 7 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - .../xcshareddata/WorkspaceSettings.xcsettings | 8 - .../UserInterfaceState.xcuserstate | Bin 154252 -> 0 bytes .../WorkspaceSettings.xcsettings | 14 - .../xcshareddata/xcschemes/CLASS.xcscheme | 86 - .../xcdebugger/Breakpoints_v2.xcbkptlist | 1655 ----------------- .../xcschemes/xcschememanagement.plist | 22 - explanatory.ini | 1336 ------------- .../input/runNEDE_canonical.param | 162 ++ montepython_tree/montepython/data.py | 1149 ++++++++++++ notebooks/NEDE.ipynb | 288 +++ 13 files changed, 1599 insertions(+), 3692 deletions(-) delete mode 100644 CLASS.xcodeproj/project.pbxproj delete mode 100644 CLASS.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 CLASS.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 CLASS.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings delete mode 100644 CLASS.xcodeproj/project.xcworkspace/xcuserdata/au566942.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 CLASS.xcodeproj/project.xcworkspace/xcuserdata/au566942.xcuserdatad/WorkspaceSettings.xcsettings delete mode 100644 CLASS.xcodeproj/xcshareddata/xcschemes/CLASS.xcscheme delete mode 100644 CLASS.xcodeproj/xcuserdata/au566942.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist delete mode 100644 CLASS.xcodeproj/xcuserdata/au566942.xcuserdatad/xcschemes/xcschememanagement.plist delete mode 100644 explanatory.ini create mode 100644 montepython_tree/input/runNEDE_canonical.param create mode 100644 montepython_tree/montepython/data.py create mode 100644 notebooks/NEDE.ipynb diff --git a/CLASS.xcodeproj/project.pbxproj b/CLASS.xcodeproj/project.pbxproj deleted file mode 100644 index 45c03c4e6..000000000 --- a/CLASS.xcodeproj/project.pbxproj +++ /dev/null @@ -1,556 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 50; - objects = { - -/* Begin PBXBuildFile section */ - 8D541BE02B7528D900E531D0 /* evolver_rkdp45.c in Sources */ = {isa = PBXBuildFile; fileRef = 8D541BDE2B7528C500E531D0 /* evolver_rkdp45.c */; }; - AF089BBE27BD516E004D8CB6 /* distortions.c in Sources */ = {isa = PBXBuildFile; fileRef = AF089BBD27BD516E004D8CB6 /* distortions.c */; }; - AF089C5C27BD5191004D8CB6 /* history.c in Sources */ = {isa = PBXBuildFile; fileRef = AF089BC127BD5191004D8CB6 /* history.c */; }; - AF089C5D27BD5191004D8CB6 /* energy_injection.c in Sources */ = {isa = PBXBuildFile; fileRef = AF089BC327BD5191004D8CB6 /* energy_injection.c */; }; - AF089C5E27BD5191004D8CB6 /* hyrectools.c in Sources */ = {isa = PBXBuildFile; fileRef = AF089BC527BD5191004D8CB6 /* hyrectools.c */; }; - AF089C6027BD5191004D8CB6 /* helium.c in Sources */ = {isa = PBXBuildFile; fileRef = AF089BCE27BD5191004D8CB6 /* helium.c */; }; - AF089C6127BD5191004D8CB6 /* hydrogen.c in Sources */ = {isa = PBXBuildFile; fileRef = AF089BD127BD5191004D8CB6 /* hydrogen.c */; }; - AF089C6227BD5191004D8CB6 /* wrap_hyrec.c in Sources */ = {isa = PBXBuildFile; fileRef = AF089BD327BD5191004D8CB6 /* wrap_hyrec.c */; }; - AF089C6327BD5191004D8CB6 /* injection.c in Sources */ = {isa = PBXBuildFile; fileRef = AF089BE127BD5191004D8CB6 /* injection.c */; }; - AF089C6427BD5191004D8CB6 /* noninjection.c in Sources */ = {isa = PBXBuildFile; fileRef = AF089BE427BD5191004D8CB6 /* noninjection.c */; }; - AF089C6527BD5191004D8CB6 /* wrap_recfast.c in Sources */ = {isa = PBXBuildFile; fileRef = AF089BEC27BD5191004D8CB6 /* wrap_recfast.c */; }; - AFDC689C240D9F500044B5A3 /* lensing.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDC6892240D9F500044B5A3 /* lensing.c */; }; - AFDC689D240D9F500044B5A3 /* perturbations.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDC6893240D9F500044B5A3 /* perturbations.c */; }; - AFDC689E240D9F500044B5A3 /* transfer.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDC6894240D9F500044B5A3 /* transfer.c */; }; - AFDC689F240D9F500044B5A3 /* thermodynamics.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDC6895240D9F500044B5A3 /* thermodynamics.c */; }; - AFDC68A0240D9F500044B5A3 /* input.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDC6896240D9F500044B5A3 /* input.c */; }; - AFDC68A1240D9F500044B5A3 /* harmonic.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDC6897240D9F500044B5A3 /* harmonic.c */; }; - AFDC68A2240D9F500044B5A3 /* fourier.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDC6898240D9F500044B5A3 /* fourier.c */; }; - AFDC68A3240D9F500044B5A3 /* primordial.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDC6899240D9F500044B5A3 /* primordial.c */; }; - AFDC68A4240D9F500044B5A3 /* background.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDC689A240D9F500044B5A3 /* background.c */; }; - AFDC68A5240D9F500044B5A3 /* output.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDC689B240D9F500044B5A3 /* output.c */; }; - AFDC68B5240D9F6B0044B5A3 /* common.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDC68A7240D9F6B0044B5A3 /* common.c */; }; - AFDC68B6240D9F6B0044B5A3 /* arrays.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDC68A8240D9F6B0044B5A3 /* arrays.c */; }; - AFDC68B7240D9F6B0044B5A3 /* hyperspherical.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDC68AA240D9F6B0044B5A3 /* hyperspherical.c */; }; - AFDC68B8240D9F6B0044B5A3 /* sparse.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDC68AB240D9F6B0044B5A3 /* sparse.c */; }; - AFDC68B9240D9F6B0044B5A3 /* dei_rkck.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDC68AD240D9F6B0044B5A3 /* dei_rkck.c */; }; - AFDC68BA240D9F6B0044B5A3 /* growTable.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDC68AE240D9F6B0044B5A3 /* growTable.c */; }; - AFDC68BB240D9F6B0044B5A3 /* quadrature.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDC68AF240D9F6B0044B5A3 /* quadrature.c */; }; - AFDC68BC240D9F6B0044B5A3 /* evolver_rkck.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDC68B0240D9F6B0044B5A3 /* evolver_rkck.c */; }; - AFDC68BD240D9F6B0044B5A3 /* evolver_ndf15.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDC68B1240D9F6B0044B5A3 /* evolver_ndf15.c */; }; - AFDC68BE240D9F6B0044B5A3 /* parser.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDC68B3240D9F6B0044B5A3 /* parser.c */; }; - AFDC68BF240D9F6B0044B5A3 /* trigonometric_integrals.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDC68B4240D9F6B0044B5A3 /* trigonometric_integrals.c */; }; - AFDC68C2240D9FB80044B5A3 /* class.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDC68C1240D9FB80044B5A3 /* class.c */; }; -/* End PBXBuildFile section */ - -/* Begin PBXCopyFilesBuildPhase section */ - AFDC6884240D9EA00044B5A3 /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = /usr/share/man/man1/; - dstSubfolderSpec = 0; - files = ( - ); - runOnlyForDeploymentPostprocessing = 1; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 8D541BDE2B7528C500E531D0 /* evolver_rkdp45.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = evolver_rkdp45.c; sourceTree = ""; }; - 8D541BDF2B7528CE00E531D0 /* evolver_rkdp45.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = evolver_rkdp45.h; sourceTree = ""; }; - 8D7F31462AF25AAF000AB359 /* macros_precision.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = macros_precision.h; sourceTree = ""; }; - 8D7F31472AF25AAF000AB359 /* hermite6_interpolation_csource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = hermite6_interpolation_csource.h; sourceTree = ""; }; - 8D7F31482AF25AAF000AB359 /* input.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = input.h; sourceTree = ""; }; - 8D7F31492AF25AAF000AB359 /* dei_rkck.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = dei_rkck.h; sourceTree = ""; }; - 8D7F314A2AF25AAF000AB359 /* background.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = background.h; sourceTree = ""; }; - 8D7F314B2AF25AAF000AB359 /* quadrature.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = quadrature.h; sourceTree = ""; }; - 8D7F314C2AF25AAF000AB359 /* primordial.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = primordial.h; sourceTree = ""; }; - 8D7F314D2AF25AAF000AB359 /* growTable.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = growTable.h; sourceTree = ""; }; - 8D7F314E2AF25AAF000AB359 /* distortions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = distortions.h; sourceTree = ""; }; - 8D7F314F2AF25AAF000AB359 /* parser.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = parser.h; sourceTree = ""; }; - 8D7F31502AF25AAF000AB359 /* evolver_ndf15.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = evolver_ndf15.h; sourceTree = ""; }; - 8D7F31512AF25AAF000AB359 /* evolver_rkck.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = evolver_rkck.h; sourceTree = ""; }; - 8D7F31522AF25AAF000AB359 /* trigonometric_integrals.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = trigonometric_integrals.h; sourceTree = ""; }; - 8D7F31532AF25AAF000AB359 /* output.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = output.h; sourceTree = ""; }; - 8D7F31542AF25AAF000AB359 /* hermite3_interpolation_csource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = hermite3_interpolation_csource.h; sourceTree = ""; }; - 8D7F31552AF25AAF000AB359 /* lensing.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = lensing.h; sourceTree = ""; }; - 8D7F31562AF25AAF000AB359 /* arrays.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = arrays.h; sourceTree = ""; }; - 8D7F31572AF25AAF000AB359 /* common.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = common.h; sourceTree = ""; }; - 8D7F31582AF25AAF000AB359 /* perturbations.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = perturbations.h; sourceTree = ""; }; - 8D7F31592AF25AAF000AB359 /* class.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = class.h; sourceTree = ""; }; - 8D7F315A2AF25AAF000AB359 /* fourier.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = fourier.h; sourceTree = ""; }; - 8D7F315B2AF25AAF000AB359 /* precisions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = precisions.h; sourceTree = ""; }; - 8D7F315C2AF25AAF000AB359 /* transfer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = transfer.h; sourceTree = ""; }; - 8D7F315D2AF25AAF000AB359 /* svnversion.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = svnversion.h; sourceTree = ""; }; - 8D7F315E2AF25AAF000AB359 /* sparse.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = sparse.h; sourceTree = ""; }; - 8D7F315F2AF25AAF000AB359 /* hyperspherical.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = hyperspherical.h; sourceTree = ""; }; - 8D7F31602AF25AAF000AB359 /* hermite4_interpolation_csource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = hermite4_interpolation_csource.h; sourceTree = ""; }; - 8D7F31612AF25AAF000AB359 /* thermodynamics.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = thermodynamics.h; sourceTree = ""; }; - 8D7F31622AF25AAF000AB359 /* harmonic.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = harmonic.h; sourceTree = ""; }; - 8D7F31632AF27E26000AB359 /* test.ini */ = {isa = PBXFileReference; lastKnownFileType = text; path = test.ini; sourceTree = ""; }; - AF089BBD27BD516E004D8CB6 /* distortions.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = distortions.c; sourceTree = ""; }; - AF089BC127BD5191004D8CB6 /* history.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = history.c; sourceTree = ""; }; - AF089BC327BD5191004D8CB6 /* energy_injection.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = energy_injection.c; sourceTree = ""; }; - AF089BC427BD5191004D8CB6 /* helium.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = helium.h; sourceTree = ""; }; - AF089BC527BD5191004D8CB6 /* hyrectools.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = hyrectools.c; sourceTree = ""; }; - AF089BC627BD5191004D8CB6 /* wrap_hyrec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_hyrec.h; sourceTree = ""; }; - AF089BC827BD5191004D8CB6 /* hydrogen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hydrogen.h; sourceTree = ""; }; - AF089BCE27BD5191004D8CB6 /* helium.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = helium.c; sourceTree = ""; }; - AF089BCF27BD5191004D8CB6 /* energy_injection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = energy_injection.h; sourceTree = ""; }; - AF089BD027BD5191004D8CB6 /* history.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = history.h; sourceTree = ""; }; - AF089BD127BD5191004D8CB6 /* hydrogen.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = hydrogen.c; sourceTree = ""; }; - AF089BD227BD5191004D8CB6 /* hyrectools.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hyrectools.h; sourceTree = ""; }; - AF089BD327BD5191004D8CB6 /* wrap_hyrec.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = wrap_hyrec.c; sourceTree = ""; }; - AF089BDF27BD5191004D8CB6 /* noninjection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = noninjection.h; sourceTree = ""; }; - AF089BE127BD5191004D8CB6 /* injection.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = injection.c; sourceTree = ""; }; - AF089BE427BD5191004D8CB6 /* noninjection.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = noninjection.c; sourceTree = ""; }; - AF089BE627BD5191004D8CB6 /* injection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = injection.h; sourceTree = ""; }; - AF089BEC27BD5191004D8CB6 /* wrap_recfast.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = wrap_recfast.c; sourceTree = ""; }; - AF089BED27BD5191004D8CB6 /* wrap_recfast.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_recfast.h; sourceTree = ""; }; - AFDC6886240D9EA00044B5A3 /* CLASS */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = CLASS; sourceTree = BUILT_PRODUCTS_DIR; }; - AFDC6892240D9F500044B5A3 /* lensing.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = lensing.c; sourceTree = ""; }; - AFDC6893240D9F500044B5A3 /* perturbations.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = perturbations.c; sourceTree = ""; }; - AFDC6894240D9F500044B5A3 /* transfer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = transfer.c; sourceTree = ""; }; - AFDC6895240D9F500044B5A3 /* thermodynamics.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = thermodynamics.c; sourceTree = ""; }; - AFDC6896240D9F500044B5A3 /* input.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = input.c; sourceTree = ""; }; - AFDC6897240D9F500044B5A3 /* harmonic.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = harmonic.c; sourceTree = ""; }; - AFDC6898240D9F500044B5A3 /* fourier.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = fourier.c; sourceTree = ""; }; - AFDC6899240D9F500044B5A3 /* primordial.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = primordial.c; sourceTree = ""; }; - AFDC689A240D9F500044B5A3 /* background.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = background.c; sourceTree = ""; }; - AFDC689B240D9F500044B5A3 /* output.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = output.c; sourceTree = ""; }; - AFDC68A7240D9F6B0044B5A3 /* common.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = common.c; sourceTree = ""; }; - AFDC68A8240D9F6B0044B5A3 /* arrays.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = arrays.c; sourceTree = ""; }; - AFDC68A9240D9F6B0044B5A3 /* hermite6_interpolation_csource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hermite6_interpolation_csource.h; sourceTree = ""; }; - AFDC68AA240D9F6B0044B5A3 /* hyperspherical.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = hyperspherical.c; sourceTree = ""; }; - AFDC68AB240D9F6B0044B5A3 /* sparse.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sparse.c; sourceTree = ""; }; - AFDC68AC240D9F6B0044B5A3 /* hermite3_interpolation_csource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hermite3_interpolation_csource.h; sourceTree = ""; }; - AFDC68AD240D9F6B0044B5A3 /* dei_rkck.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dei_rkck.c; sourceTree = ""; }; - AFDC68AE240D9F6B0044B5A3 /* growTable.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = growTable.c; sourceTree = ""; }; - AFDC68AF240D9F6B0044B5A3 /* quadrature.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = quadrature.c; sourceTree = ""; }; - AFDC68B0240D9F6B0044B5A3 /* evolver_rkck.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = evolver_rkck.c; sourceTree = ""; }; - AFDC68B1240D9F6B0044B5A3 /* evolver_ndf15.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = evolver_ndf15.c; sourceTree = ""; }; - AFDC68B2240D9F6B0044B5A3 /* hermite4_interpolation_csource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hermite4_interpolation_csource.h; sourceTree = ""; }; - AFDC68B3240D9F6B0044B5A3 /* parser.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = parser.c; sourceTree = ""; }; - AFDC68B4240D9F6B0044B5A3 /* trigonometric_integrals.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = trigonometric_integrals.c; sourceTree = ""; }; - AFDC68C1240D9FB80044B5A3 /* class.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = class.c; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - AFDC6883240D9EA00044B5A3 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 8D7F31452AF25AAF000AB359 /* include */ = { - isa = PBXGroup; - children = ( - 8D7F31562AF25AAF000AB359 /* arrays.h */, - 8D7F314A2AF25AAF000AB359 /* background.h */, - 8D7F31592AF25AAF000AB359 /* class.h */, - 8D7F31572AF25AAF000AB359 /* common.h */, - 8D7F31492AF25AAF000AB359 /* dei_rkck.h */, - 8D7F314E2AF25AAF000AB359 /* distortions.h */, - 8D7F31502AF25AAF000AB359 /* evolver_ndf15.h */, - 8D541BDF2B7528CE00E531D0 /* evolver_rkdp45.h */, - 8D7F31512AF25AAF000AB359 /* evolver_rkck.h */, - 8D7F315A2AF25AAF000AB359 /* fourier.h */, - 8D7F314D2AF25AAF000AB359 /* growTable.h */, - 8D7F31622AF25AAF000AB359 /* harmonic.h */, - 8D7F31542AF25AAF000AB359 /* hermite3_interpolation_csource.h */, - 8D7F31602AF25AAF000AB359 /* hermite4_interpolation_csource.h */, - 8D7F31472AF25AAF000AB359 /* hermite6_interpolation_csource.h */, - 8D7F315F2AF25AAF000AB359 /* hyperspherical.h */, - 8D7F31482AF25AAF000AB359 /* input.h */, - 8D7F31552AF25AAF000AB359 /* lensing.h */, - 8D7F31462AF25AAF000AB359 /* macros_precision.h */, - 8D7F31532AF25AAF000AB359 /* output.h */, - 8D7F314F2AF25AAF000AB359 /* parser.h */, - 8D7F31582AF25AAF000AB359 /* perturbations.h */, - 8D7F315B2AF25AAF000AB359 /* precisions.h */, - 8D7F314C2AF25AAF000AB359 /* primordial.h */, - 8D7F314B2AF25AAF000AB359 /* quadrature.h */, - 8D7F315E2AF25AAF000AB359 /* sparse.h */, - 8D7F315D2AF25AAF000AB359 /* svnversion.h */, - 8D7F31612AF25AAF000AB359 /* thermodynamics.h */, - 8D7F315C2AF25AAF000AB359 /* transfer.h */, - 8D7F31522AF25AAF000AB359 /* trigonometric_integrals.h */, - ); - path = include; - sourceTree = ""; - }; - AF089BBF27BD5191004D8CB6 /* external */ = { - isa = PBXGroup; - children = ( - AF089BC027BD5191004D8CB6 /* HyRec2020 */, - AF089BDD27BD5191004D8CB6 /* heating */, - AF089BEB27BD5191004D8CB6 /* RecfastCLASS */, - ); - path = external; - sourceTree = ""; - }; - AF089BC027BD5191004D8CB6 /* HyRec2020 */ = { - isa = PBXGroup; - children = ( - AF089BC127BD5191004D8CB6 /* history.c */, - AF089BC327BD5191004D8CB6 /* energy_injection.c */, - AF089BC427BD5191004D8CB6 /* helium.h */, - AF089BC527BD5191004D8CB6 /* hyrectools.c */, - AF089BC627BD5191004D8CB6 /* wrap_hyrec.h */, - AF089BC827BD5191004D8CB6 /* hydrogen.h */, - AF089BCE27BD5191004D8CB6 /* helium.c */, - AF089BCF27BD5191004D8CB6 /* energy_injection.h */, - AF089BD027BD5191004D8CB6 /* history.h */, - AF089BD127BD5191004D8CB6 /* hydrogen.c */, - AF089BD227BD5191004D8CB6 /* hyrectools.h */, - AF089BD327BD5191004D8CB6 /* wrap_hyrec.c */, - ); - path = HyRec2020; - sourceTree = ""; - }; - AF089BDD27BD5191004D8CB6 /* heating */ = { - isa = PBXGroup; - children = ( - AF089BDF27BD5191004D8CB6 /* noninjection.h */, - AF089BE127BD5191004D8CB6 /* injection.c */, - AF089BE427BD5191004D8CB6 /* noninjection.c */, - AF089BE627BD5191004D8CB6 /* injection.h */, - ); - path = heating; - sourceTree = ""; - }; - AF089BEB27BD5191004D8CB6 /* RecfastCLASS */ = { - isa = PBXGroup; - children = ( - AF089BEC27BD5191004D8CB6 /* wrap_recfast.c */, - AF089BED27BD5191004D8CB6 /* wrap_recfast.h */, - ); - path = RecfastCLASS; - sourceTree = ""; - }; - AFDC687D240D9EA00044B5A3 = { - isa = PBXGroup; - children = ( - 8D7F31632AF27E26000AB359 /* test.ini */, - 8D7F31452AF25AAF000AB359 /* include */, - AF089BBF27BD5191004D8CB6 /* external */, - AFDC68C0240D9FB80044B5A3 /* main */, - AFDC68A6240D9F6B0044B5A3 /* tools */, - AFDC6891240D9F500044B5A3 /* source */, - AFDC6887240D9EA00044B5A3 /* Products */, - ); - indentWidth = 2; - sourceTree = ""; - tabWidth = 2; - }; - AFDC6887240D9EA00044B5A3 /* Products */ = { - isa = PBXGroup; - children = ( - AFDC6886240D9EA00044B5A3 /* CLASS */, - ); - name = Products; - sourceTree = ""; - }; - AFDC6891240D9F500044B5A3 /* source */ = { - isa = PBXGroup; - children = ( - AFDC689A240D9F500044B5A3 /* background.c */, - AF089BBD27BD516E004D8CB6 /* distortions.c */, - AFDC6898240D9F500044B5A3 /* fourier.c */, - AFDC6897240D9F500044B5A3 /* harmonic.c */, - AFDC6896240D9F500044B5A3 /* input.c */, - AFDC6892240D9F500044B5A3 /* lensing.c */, - AFDC689B240D9F500044B5A3 /* output.c */, - AFDC6893240D9F500044B5A3 /* perturbations.c */, - AFDC6899240D9F500044B5A3 /* primordial.c */, - AFDC6895240D9F500044B5A3 /* thermodynamics.c */, - AFDC6894240D9F500044B5A3 /* transfer.c */, - ); - path = source; - sourceTree = ""; - }; - AFDC68A6240D9F6B0044B5A3 /* tools */ = { - isa = PBXGroup; - children = ( - AFDC68A7240D9F6B0044B5A3 /* common.c */, - AFDC68A8240D9F6B0044B5A3 /* arrays.c */, - AFDC68A9240D9F6B0044B5A3 /* hermite6_interpolation_csource.h */, - AFDC68AA240D9F6B0044B5A3 /* hyperspherical.c */, - AFDC68AB240D9F6B0044B5A3 /* sparse.c */, - AFDC68AC240D9F6B0044B5A3 /* hermite3_interpolation_csource.h */, - AFDC68AD240D9F6B0044B5A3 /* dei_rkck.c */, - AFDC68AE240D9F6B0044B5A3 /* growTable.c */, - AFDC68AF240D9F6B0044B5A3 /* quadrature.c */, - AFDC68B0240D9F6B0044B5A3 /* evolver_rkck.c */, - 8D541BDE2B7528C500E531D0 /* evolver_rkdp45.c */, - AFDC68B1240D9F6B0044B5A3 /* evolver_ndf15.c */, - AFDC68B2240D9F6B0044B5A3 /* hermite4_interpolation_csource.h */, - AFDC68B3240D9F6B0044B5A3 /* parser.c */, - AFDC68B4240D9F6B0044B5A3 /* trigonometric_integrals.c */, - ); - path = tools; - sourceTree = ""; - }; - AFDC68C0240D9FB80044B5A3 /* main */ = { - isa = PBXGroup; - children = ( - AFDC68C1240D9FB80044B5A3 /* class.c */, - ); - path = main; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - AFDC6885240D9EA00044B5A3 /* CLASS */ = { - isa = PBXNativeTarget; - buildConfigurationList = AFDC688D240D9EA00044B5A3 /* Build configuration list for PBXNativeTarget "CLASS" */; - buildPhases = ( - AFDC6882240D9EA00044B5A3 /* Sources */, - AFDC6883240D9EA00044B5A3 /* Frameworks */, - AFDC6884240D9EA00044B5A3 /* CopyFiles */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = CLASS; - productName = ppCLASS; - productReference = AFDC6886240D9EA00044B5A3 /* CLASS */; - productType = "com.apple.product-type.tool"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - AFDC687E240D9EA00044B5A3 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 1130; - ORGANIZATIONNAME = "Aarhus University"; - TargetAttributes = { - AFDC6885240D9EA00044B5A3 = { - CreatedOnToolsVersion = 11.3.1; - }; - }; - }; - buildConfigurationList = AFDC6881240D9EA00044B5A3 /* Build configuration list for PBXProject "CLASS" */; - compatibilityVersion = "Xcode 9.3"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = AFDC687D240D9EA00044B5A3; - productRefGroup = AFDC6887240D9EA00044B5A3 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - AFDC6885240D9EA00044B5A3 /* CLASS */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXSourcesBuildPhase section */ - AFDC6882240D9EA00044B5A3 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - AFDC68A0240D9F500044B5A3 /* input.c in Sources */, - AF089C6027BD5191004D8CB6 /* helium.c in Sources */, - AF089C6327BD5191004D8CB6 /* injection.c in Sources */, - AF089C5D27BD5191004D8CB6 /* energy_injection.c in Sources */, - AFDC68A1240D9F500044B5A3 /* harmonic.c in Sources */, - AFDC68A2240D9F500044B5A3 /* fourier.c in Sources */, - 8D541BE02B7528D900E531D0 /* evolver_rkdp45.c in Sources */, - AFDC68B6240D9F6B0044B5A3 /* arrays.c in Sources */, - AF089C6527BD5191004D8CB6 /* wrap_recfast.c in Sources */, - AF089C5C27BD5191004D8CB6 /* history.c in Sources */, - AF089C6127BD5191004D8CB6 /* hydrogen.c in Sources */, - AFDC68A5240D9F500044B5A3 /* output.c in Sources */, - AFDC689E240D9F500044B5A3 /* transfer.c in Sources */, - AFDC689F240D9F500044B5A3 /* thermodynamics.c in Sources */, - AF089C6427BD5191004D8CB6 /* noninjection.c in Sources */, - AF089C5E27BD5191004D8CB6 /* hyrectools.c in Sources */, - AFDC68BE240D9F6B0044B5A3 /* parser.c in Sources */, - AFDC68BC240D9F6B0044B5A3 /* evolver_rkck.c in Sources */, - AFDC68BD240D9F6B0044B5A3 /* evolver_ndf15.c in Sources */, - AFDC68B9240D9F6B0044B5A3 /* dei_rkck.c in Sources */, - AFDC68BA240D9F6B0044B5A3 /* growTable.c in Sources */, - AFDC68C2240D9FB80044B5A3 /* class.c in Sources */, - AF089BBE27BD516E004D8CB6 /* distortions.c in Sources */, - AFDC68BF240D9F6B0044B5A3 /* trigonometric_integrals.c in Sources */, - AFDC68B5240D9F6B0044B5A3 /* common.c in Sources */, - AFDC689C240D9F500044B5A3 /* lensing.c in Sources */, - AFDC68BB240D9F6B0044B5A3 /* quadrature.c in Sources */, - AFDC689D240D9F500044B5A3 /* perturbations.c in Sources */, - AFDC68A3240D9F500044B5A3 /* primordial.c in Sources */, - AFDC68B7240D9F6B0044B5A3 /* hyperspherical.c in Sources */, - AFDC68B8240D9F6B0044B5A3 /* sparse.c in Sources */, - AFDC68A4240D9F500044B5A3 /* background.c in Sources */, - AF089C6227BD5191004D8CB6 /* wrap_hyrec.c in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - AFDC688B240D9EA00044B5A3 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = "__CLASSDIR__='\"$(PROJECT_DIR)\"'"; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(PROJECT_DIR)/include", - "$(PROJECT_DIR)/external/**", - ); - MACOSX_DEPLOYMENT_TARGET = 10.15; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = macosx; - }; - name = Debug; - }; - AFDC688C240D9EA00044B5A3 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREPROCESSOR_DEFINITIONS = "__CLASSDIR__='\"$(PROJECT_DIR)\"'"; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(PROJECT_DIR)/include", - "$(PROJECT_DIR)/external/**", - ); - MACOSX_DEPLOYMENT_TARGET = 10.15; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - SDKROOT = macosx; - }; - name = Release; - }; - AFDC688E240D9EA00044B5A3 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - AFDC688F240D9EA00044B5A3 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - AFDC6881240D9EA00044B5A3 /* Build configuration list for PBXProject "CLASS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - AFDC688B240D9EA00044B5A3 /* Debug */, - AFDC688C240D9EA00044B5A3 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - AFDC688D240D9EA00044B5A3 /* Build configuration list for PBXNativeTarget "CLASS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - AFDC688E240D9EA00044B5A3 /* Debug */, - AFDC688F240D9EA00044B5A3 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = AFDC687E240D9EA00044B5A3 /* Project object */; -} diff --git a/CLASS.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/CLASS.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a62..000000000 --- a/CLASS.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/CLASS.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/CLASS.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d981003..000000000 --- a/CLASS.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/CLASS.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/CLASS.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings deleted file mode 100644 index f9b0d7c5e..000000000 --- a/CLASS.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +++ /dev/null @@ -1,8 +0,0 @@ - - - - - PreviewsEnabled - - - diff --git a/CLASS.xcodeproj/project.xcworkspace/xcuserdata/au566942.xcuserdatad/UserInterfaceState.xcuserstate b/CLASS.xcodeproj/project.xcworkspace/xcuserdata/au566942.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index 325c711b28bb2e475609bccef86c860e4482381f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 154252 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 diff --git a/CLASS.xcodeproj/project.xcworkspace/xcuserdata/au566942.xcuserdatad/WorkspaceSettings.xcsettings b/CLASS.xcodeproj/project.xcworkspace/xcuserdata/au566942.xcuserdatad/WorkspaceSettings.xcsettings deleted file mode 100644 index bbfef027f..000000000 --- a/CLASS.xcodeproj/project.xcworkspace/xcuserdata/au566942.xcuserdatad/WorkspaceSettings.xcsettings +++ /dev/null @@ -1,14 +0,0 @@ - - - - - BuildLocationStyle - UseAppPreferences - CustomBuildLocationType - RelativeToDerivedData - DerivedDataLocationStyle - Default - ShowSharedSchemesAutomaticallyEnabled - - - diff --git a/CLASS.xcodeproj/xcshareddata/xcschemes/CLASS.xcscheme b/CLASS.xcodeproj/xcshareddata/xcschemes/CLASS.xcscheme deleted file mode 100644 index db531c720..000000000 --- a/CLASS.xcodeproj/xcshareddata/xcschemes/CLASS.xcscheme +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/CLASS.xcodeproj/xcuserdata/au566942.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/CLASS.xcodeproj/xcuserdata/au566942.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist deleted file mode 100644 index 61b15351f..000000000 --- a/CLASS.xcodeproj/xcuserdata/au566942.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ /dev/null @@ -1,1655 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/CLASS.xcodeproj/xcuserdata/au566942.xcuserdatad/xcschemes/xcschememanagement.plist b/CLASS.xcodeproj/xcuserdata/au566942.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index 18ddafe09..000000000 --- a/CLASS.xcodeproj/xcuserdata/au566942.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - SchemeUserState - - CLASS.xcscheme_^#shared#^_ - - orderHint - 0 - - - SuppressBuildableAutocreation - - AFDC6885240D9EA00044B5A3 - - primary - - - - - diff --git a/explanatory.ini b/explanatory.ini deleted file mode 100644 index 0db900d7c..000000000 --- a/explanatory.ini +++ /dev/null @@ -1,1336 +0,0 @@ -# *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~* -# * CLASS input parameter file * -# *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~* - -# This example of input file, intended for CLASS beginners, lists all -# possibilities with detailed comments. You can use a more concise version, in -# which only the arguments in which you are interested would appear. Only lines -# containing an equal sign not preceded by a sharp sign "#" are considered by -# the code, any other line is considered as a comment. -# -# The normal syntax is: parameter = value(s) -# where white spaces do not matter (they are removed automatically by the -# parser unless they are part of the parameter name). -# However, 'parameter' = value(s) -# and "parameter" = value(s) -# are also accepted by the parser since v2.8.0 -# -# Input files must have an extension ".ini". - - - -# ------------------------- -# ----> General parameters: -# ------------------------- - -# 1) List of output spectra requested: -# - 'tCl' for temperature Cls, -# - 'pCl' for polarization Cls, -# - 'lCl' for CMB lensing potential Cls, -# - 'nCl' (or 'dCl') for density number count Cls, -# - 'sCl' for galaxy lensing potential Cls, -# - 'mPk' for total matter power spectrum P(k) infered from gravitational -# potential, -# - 'dTk' (or 'mTk') for density transfer functions for each species, -# - 'vTk' for velocity transfer function for each species -# - 'sd' for spectral distortions -# Warning: both lCl and sCl compute the C_ls of the lensing potential, -# C_l^phi-phi. If you are used to other codes, you may want to deal instead -# with the deflection Cls or the shear/convergence Cls. The relations -# between them are trivial: -# --> deflection d: Cl^dd = l(l+1) C_l^phiphi -# --> convergence kappa and shear gamma: the share the same harmonic -# power spectrum: Cl^gamma-gamma = 1/4 * [(l+2)!/(l-2)!] C_l^phi-phi -# By defaut, the code will try to compute the following cross-correlation -# Cls (if available): temperature-polarisation, temperature-CMB lensing, -# polarization-CMB lensing, CMB lensing-density, and density-lensing. Other -# cross-correlations are not computed because they would slow down the -# code considerably. -# -# Can be left blank if you do not want to evolve cosmological perturbations -# at all. (default: set to blank, no perturbation calculation) -output = tCl,pCl,lCl,mPk -#output = tCl,pCl,lCl -#output = mPk,mTk -#output = Sd - -# 1.a) If you included 'tCl' in the list, you can take into account only some -# of the terms contributing to the temperature spectrum: -# - intrinsic temperature corrected by Sachs-Wolfe ('tsw' or 'TSW'), -# - early integrated Sachs-Wolfe ('eisw' or 'EISW'), -# - late integrated Sachs-Wolfe ('lisw' or 'LISW'), -# - Doppler ('dop' or 'Dop'), -# - polarisation contribution ('pol' or 'Pol'). -# Put below the list of terms to be included (defaut: if this field is not -# passed, all terms will be included) -#temperature_contributions = tsw, eisw, lisw, dop, pol - -# 1.a.1) If one of 'eisw' or 'lisw' is turned off, the code will read -# 'early/late isw redshift', the split value of redshift z at which the -# isw is considered as late or early (if this field is absent or left -# blank, by default, 'early/late isw redshift' is set to 50) -#early_late_isw_redshift = - -# 1.b) If you included 'nCl' (or 'dCl') in the list, you can take into account -# only some of the terms contributing to the obsevable number count -# fluctuation spectrum: -# - matter density ('density'), -# - redshift-space and Doppler distortions ('rsd'), -# - lensing ('lensing'), -# - or gravitational potential terms ('gr'). -# Put below the list of terms to be included (defaut: if this field is not -# passed, only 'dens' will be included) -#number_count_contributions = density, rsd, lensing, gr - -# 1.c) If you included 'dTk' (or 'mTk') in the list, the code will give you by -# default the transfer function of the scale-invariant Bardeen potentials -# (for whatever gauge you are using). If you need the transfer function of -# additional metric fluctuations, specific to the gauge you are using, set -# the following flag to 'yes' (default: set to 'no') -#extra_metric_transfer_functions = yes - - -# 2) If you want to consider perturbed recombination, enter a word -# containing the letter 'y' or 'Y'. CLASS will then compute the -# perturbation in the ionization fraction x_e and the baryon -# temperature, as in 0707.2727. The initial conformal time will be -# small, therefore you should use the default integrator ndf15 -# (i.e. do not set 'evolver' to 0, otherwise the code will be -# slower). (default: no, neglect perturbed recombination) -#perturbed_recombination = yes - -# 3) List of modes: -# - 's' for scalars, -# - 'v' for vectors, -# - 't' for tensors). -# More than one letter allowed, can be attached or separated by arbitrary -# characters; letters can be small or capital. (default: set to 's') -modes = s -#modes = s,t - -# 3.a) List of initial conditions for scalars: -# - 'ad' for adiabatic, -# - 'bi' for baryon isocurvature, -# - 'cdi' for CDM isocurvature, -# - 'nid' for neutrino density isocurvature, -# - 'niv' for neutrino velocity isocurvature. -# More than one of these allowed, can be attached or separated by arbitrary -# characters; letters can be small or capital. (default: set to 'ad') -ic = ad -#ic = ad&bi&nid - -# 3.b) Which perturbations should be included in tensor calculations? -# - write 'exact' to include photons, ultra-relativistic species 'ur' -# and all non-cold dark matter species 'ncdm'; -# - write 'massless' to approximate 'ncdm' as extra relativistic species -# (good approximation if ncdm is still relativistic at the time of -# recombination); -# - write 'photons' to include only photons -# (default: set to 'massless') -tensor_method = - - -# 4) Gauge -# 4.a) Gauge in which calculations are performed: -# - 'sync' or 'synchronous' or 'Synchronous' for synchronous, -# - 'new' or 'newtonian' or 'Newtonian' for Newtonian/longitudinal gauge -# (default: set to synchronous) -gauge = synchronous - -# 4.b) Do you want to output the N-body gauge quantities as well? -# If you included 'dTk' or 'vTk' in the list of outputs, you may transform -# your transfer functions into the Nbody gauge by setting the following -# flag to 'yes'. This will also include the transfer function for the -# metric perturbations H_T' (exact) and gamma (approximate) in the Nbody gauge. -# See e.g. 1505.04756, and equations (A.2) and (A.5) in 1811.00904 -# for more precise definitions. These calculations are more stable with -# 'gauge=synchronous' (default). To compute H_T' and gamma -# without converting the output to the Nbody gauge, -# please use the flag 'extra metric transfer functions' instead. -# Can be set to anything starting with 'y' or 'n'. -# (default: set to 'no') -#nbody_gauge_transfer_functions = yes - -# 5) Hubble parameter : either 'H0' in km/s/Mpc or 'h' (or 'theta_s_100'), where -# the latter is the peak scale parameter defined exactly as 100(ds_dec/da_dec) -# with a decoupling time given by maximum of visibility function (quite different -# from theta_MC of CosmoMC and slightly different from theta_* of CAMB) -# (default: 'h' set to 0.67810 such that 100*theta_s = 1.041783 like in Planck 2018) -h = 0.67810 -#H0 = 67.810 -#theta_s_100 = 1.041783 - - -# 6) Primordial Helium fraction 'YHe', e.g. 0.25; if set to 'BBN' or 'bbn', -# will be inferred from Big Bang Nucleosynthesis (default: set to 'BBN') -YHe = BBN - - -# 7) 'recombination' algorithm set to 'RECFAST' or 'HyRec'. 'HyRec' points at HyRec 2020. Its compute time is negligible compared to other CLASS modules. 'RECFAST' points at RecFastCLASS, an enhanced version of RecFast 1.5 with better integration shceme and less discontinuities. Recfast is still slightly faster than HyRec but less accurate. HyRec is better for most purposes. RecFast can still be useful for studying some particular modifications of standard recombination. Both schemes use the CLASS ODE integrators. (Default: HyRec') -recombination = HyRec - -# 7.a) If recombination algorithm is set to 'RECFAST' -# the photo-ionization coefficients beta(T) for normal Recfast depend on Tmat -# This is an approximation (see e.g. arxiv:1605.03928 page 10, arxiv:1503.04827 page 2, right column) -# With 'recfast_photoion_dependence' the photo-ionization coefficient beta(T) is set to depend on -# - 'Tmat' uses beta(Tmat) depending on matter temperature -# (like in original RECFAST and in CLASS v2.x) -# - 'Trad' uses beta(Trad) depending on radiation temperature -# (while this option is theoretically more motivated, the option 'Tmat' leads to -# results which agree better with HyRec and CosmoRec. This is probably due to the -# fudge factor for the Peebles coefficient being optimized for a Tmat dependence) -# (default: set to 'Tmat') -recfast_photoion_dependence = - - -# 8) Parametrization of reionization: 'reio_parametrization' must be one of -# - 'reio_none' (no reionization), -# - 'reio_camb' (like CAMB: one tanh() step for hydrogen reionization one -# for second helium reionization), -# - 'reio_bins_tanh' (binned history x_e(z) with tanh() interpolation -# between input values), -# - 'reio_half_tanh' (like 'reio_camb' excepted that we match the -# function xe(z) from recombination with only half a tanh(z-z_reio)), -# - 'reio_many_tanh' (arbitrary number of tanh-like steps with specified -# ending values, a scheme usually more useful than 'reio_bins_tanh'), -# - 'reio_inter' (linear interpolation between discrete values of xe(z)). -# (default: set to 'reio_camb') -reio_parametrization = reio_camb - -# 8.a) If 'reio_parametrization' set to 'reio_camb' or 'reio_half_tanh': -# enter one of 'z_reio' or 'tau_reio' (default: 'z_reio' set to 7.6711 to -# get tau_reio of 0.054308), plus 'reionization_exponent', -# 'reionization_width', 'helium_fullreio_redshift', -# 'helium_fullreio_width'. (default: set to 1.5, 0.5, 3.5, 0.5) -z_reio = 7.6711 -#tau_reio = 0.05430842 -reionization_exponent = 1.5 -reionization_width = 0.5 -helium_fullreio_redshift = 3.5 -helium_fullreio_width = 0.5 - -# 8.b) If 'reio_parametrization' set to 'reio_bins_tanh': -# enter number of bins and list of z_i and xe_i defining the free electron -# density at the center of each bin. Also enter a dimensionless paramater -# regulating the sharpness of the tanh() steps, independently of the bin -# width; recommended sharpness is 0.3, smaller values will make steps too -# sharp, larger values will make the step very progressive but with -# discontinuity of x_e(z) derivative around z_i values. (default: set to -# 0, blank, blank, 0.3) -binned_reio_num = 3 -binned_reio_z = 8,12,16 -binned_reio_xe = 0.8,0.2,0.1 -binned_reio_step_sharpness = 0.3 - -# 8.c) If 'reio_parametrization' set to 'reio_many_tanh': -# enter number of jumps, list of jump redhsifts z_i (central value of each -# tanh()), list of free electron density x_i after each jump, and common -# width of all jumps. If you want to end up with all hydrogen reionized -# but neglecting helium reionization, the first value of x_i in the list -# should be 1. For each x_i you can also pass the flags -1 or -2. They -# mean: -# - -1: after hydrogen + first helium recombination (so the code will -# substitute a value bigger than one based on Y_He); -# - -2: after hydrogen + second helium recombination (the code will -# substitute an even bigger value based on Y_He). -# You can get results close to reio_camb by setting these parameters to -# the value showed below (and adapting the second many_tanh_z to the usual -# z_reio). (default: not set) -many_tanh_num = 2 -many_tanh_z = 3.5,11.3 -many_tanh_xe = -2,-1 -many_tanh_width = 0.5 - -# 8.d) If 'reio_parametrization' set to 'reio_inter': enter the number of -# points, the list of redshifts z_i, and the list of free electron -# fraction values x_i. The code will do linear interpolation between them. -# The first z_i should always be 0. Like above, for each x_i, you can also -# pass the flags -1 or -2. They mean: for -1, after the hydrogen and the -# first helium recombination (so the code will substitute a value bigger -# than one based on Y_He); for -2, after the hydrogen and the second -# helium recombination (the code will substitute an even bigger value -# based on Y_He). The last value of x_i should always be zero, the code -# will substitute it with the value that one would get in absence of -# reionization, as computed by the recombination code. (default: not set) -reio_inter_num = 8 -reio_inter_z = 0, 3, 4, 8, 9, 10, 11, 12 -reio_inter_xe = -2, -2, -1, -1, 0.9, 0.5, 0.1, 0 - - -# 9) State whether you want the code to compute the simplest analytic -# approximation to the photon damping scale (it will be added to the -# thermodynamics output, and its value at recombination will be stored and -# displayed in the standard output) (default: 'compute damping scale' set to -# 'no') -compute_damping_scale = - - -# 10) State whether you want to include a variation of fudamental constants. Can be set to 'none' or to 'instantaneous'. Smoother evolutions could be included by modifying the function "background_varconst_of_z" in source/background.c. -varying_fundamental_constants = none - -# 10.a) If 'varying_fundamental_constants' is set to 'instantaneous', select the redshift of the transition 'varying_transition_redshift' (default: 50). At lower redshift, the value will be the currently observed value, while at higher redshift you can specify how large the value should be by giving the ratio of the value at high redshift with respect to the currently observed one. Provide the relative value of the fine structure constant 'varying_alpha' (default: 1), and the relative value of the effective electron mass 'varying_me' (default: 1). The treatment corresponds to that of 1705.03925. -varying_transition_redshift = -varying_alpha = 1. -varying_me = 1. - -# 10.b) If 'varying_fundamental_constants' is not set to 'none' and 'YHe' is set to 'BBN', specify by how much the 'YHe' prediction from 'BBN' should be affected by the different value of the fine structure constant. The default value is motivated by 2001.01787. (default: 1) -bbn_alpha_sensitivity = 1. - - -# ------------------------- -# ----> Species parameters: -# ------------------------- - -# 1) Photon density: either 'T_cmb' in K or 'Omega_g' or 'omega_g' (default: -# 'T_cmb' set to 2.7255) -T_cmb = 2.7255 -#Omega_g = -#omega_g = - - -# 2) Baryon density: either 'Omega_b' or 'omega_b' (default: 'omega_b' set to -# 0.02238280) -omega_b = 0.02238280 -#Omega_b = - - -# 3) Ultra-relativistic species / massless neutrino density: either -# 'N_ur' or 'Omega_ur' or 'omega_ur' (default: 'N_ur' set to 3.044; -# see 2008.01074 and 2012.02726. This value is more accurate than the -# previous default value of 3.046) (note: instead of 'N_ur' you can -# pass equivalently 'N_eff', although this syntax is deprecated) (one -# more remark: if you have respectively 1,2,3 massive neutrinos, if -# you stick to the default value T_ncdm equal to 0.71611, designed to -# give m/omega of 93.14 eV, and if you want to use N_ur to get N_eff -# equal to 3.044 in the early universe, then you should pass here -# respectively 2.0308,1.0176,0.00441) -N_ur = 3.044 -#Omega_ur = -#omega_ur = - -# 3.a) To simulate ultra-relativistic species with non-standard properties, you -# can pass 'ceff2_ur' and 'cvis2_ur' (effective squared -# sound speed and viscosity parameter, like in the Generalised Dark Matter -# formalism of W. Hu) (default: both set to 1/3) -#ceff2_ur = -#cvis2_ur = - - -# 4) Density of cdm (cold dark matter): 'Omega_cdm' or 'omega_cdm', or, -# density of total non-relativistic matter: 'Omega_m' or 'omega_m'. -# If you pass 'Omega_m' or 'omega_m', the code will automatically fill -# up the density of Cold Dark Matter such that all non-relativistic species -# (including non-cold DM) sum up to your input value of Omega_m -# (default: 'omega_cdm' set to 0.1201075) -omega_cdm = 0.1201075 -#Omega_cdm = -#Omega_m = -#omega_m = - - -# 5) ncdm sector (i.e. any non-cold dark matter relics, including massive -# neutrinos, warm dark matter, etc.): -# 5.a) 'N_ncdm' is the number of distinct species (default: set to 0) -N_ncdm = - -# 5.b) 'use_ncdm_psd_files' is the list of N_ncdm numbers: -# - 0 means 'phase-space distribution (psd) passed analytically -# inside the code, in the mnodule background.c, inside the function -# background_ncdm_distribution()', -# - 1 means 'psd passed as a file with at list two columns: first for -# q, second for f_0(q)', where q is p/T_ncdm -# (default: only zeros) -#use_ncdm_psd_files = 0 - -# 5.b.1) If some of the previous values are equal to one, 'ncdm_psd_filenames' is -# the list of names of psd files (as many as number of ones in previous -# entry) -ncdm_psd_filenames = psd_FD_single.dat - -# 5.c) 'ncdm_psd_parameters' is an optional list of double parameters to -# describe the analytic distribution function or to modify a p.s.d. passed -# as a file. It is made available in the routine -# background_ncdm_distribution. -#ncdm_psd_parameters = 0.3 ,0.5, 0.05 -#ncdm_psd_parameters = Nactive, sin^2_12 ,s23 ,s13 - -# 5.d) 'Omega_ncdm' or 'omega_ncdm' or 'm_ncdm' in eV (default: all set to -# zero); with only one of these inputs, CLASS computes the correct value -# of the mass; if both (Omega_ncdm, m_ncdm) or (omega_ncdm, m_ncdm) are -# passed, CLASS will renormalise the psd in order to fulfill both -# conditions. Passing zero in the list of m_ncdm's or Omeg_ncdm's means -# that for this component, this coefficient is not imposed, and its value -# is inferred from the other one. -m_ncdm = 0.06 -#m_ncdm = 0.04, 0.04, 0.04 -#Omega_ncdm = -#omega_ncdm = - -# 5.e) 'T_ncdm' is the ncdm temperature in units of photon temperature -# (default: set to 0.71611, which is slightly larger than the -# instantaneous decoupling value (4/11)^(1/3); indeed, this default value -# is fudged to give a ratio m/omega equal to 93.14 eV for active -# neutrinos, as predicted by precise studies of active neutrino -# decoupling, see hep-ph/0506164) -T_ncdm = - -# 5.f) 'ksi_ncdm' is the ncdm chemical potential in units of its own -# temperature (default: set to 0) -ksi_ncdm = - -# 5.g) 'deg_ncdm' is the degeneracy parameter multiplying the psd: 1 stands for -# 'one family', i.e. one particle + anti-particle (default: set to 1.0) -deg_ncdm = - -# 5.h) 'ncdm_quadrature_strategy' is the method used for the momentum sampling of -# the ncdm distribution function. -# - 0 is the automatic method, -# - 1 is Gauss-Laguerre quadrature, -# - 2 is the trapezoidal rule on [0,Infinity] using the transformation q->1/t-1. -# - 3 is the trapezoidal rule on [0,q_max] where q_max is the next input. -# (default: set to 0) -ncdm_quadrature_strategy = - -# 5.h.1) 'ncdm_maximum_q' is the maximum q relevant only for Quadrature strategy 3. -# (default: set to 15) -ncdm_maximum_q = - -# 5.h.2) Number of momentum bins. (default: 150) -ncdm_N_momentum_bins = - - -# 6) Curvature: 'Omega_k' (default: 'Omega_k' set to 0) -Omega_k = 0. - - -# Begin of ADDITIONAL SPECIES --> Add your species here - -# 7.1) Decaying CDM into Dark Radiation -# 7.1.a) The current fractional density of dcdm+dr (decaying cold dark matter -# and its relativistic decay radiation): 'Omega_dcdmdr' or 'omega_dcdmdr' -# (default: 'Omega_dcdmdr' set to 0) -Omega_dcdmdr = 0.0 -#omega_dcdmdr = 0.0 - -# 7.1.b) The rescaled initial value for dcdm density (see 1407.2418 for -# definitions). If you specify 7.a.1, 7.a.2 will be found automtically by a -# shooting method, and vice versa. (default: 'Omega_dcdmdr' set to 0, -# hence so is 'Omega_ini_dcdm') -#Omega_ini_dcdm = -#omega_ini_dcdm = - -# 7.1.c) Decay constant of dcdm in km/s/Mpc, same unit as H0 above. -Gamma_dcdm = 0.0 -tau_dcdm = 0.0 - - -# 7.2) Multi-interacting Dark Matter (idm), implemented by N. Becker, -# D.C. Hooper, and N. Schoeneberg. Described in (2010.04074) - -# 7.2.1) Global parameters for the (multi-)interacting Dark Matter component - -# 7.2.1.a) Amount of interacting Dark Matter -# Can be passed as either f_idm (fraction) or Omega_idm (relative abundance) (default : 0) -#Omega_idm = 0. -f_idm = 0. - -# 7.2.1.b) Mass of interacting Dark Matter particle in eV (default : 1e9) -m_idm = 1e9 - -# 7.2.2) Dark Matter interacting with Dark Radiation (idm_dr) and -# interacting Dark Radiation (idr), implemented by -# M. Archidiacono, S. Bohr, and D.C. Hooper, following the ETHOS -# framework (1512.05344). Can also take as input the parameters -# of the models of 1507.04351 (with non-abelian dark matter, dark -# gluons...) which can be seen as a sub-class of ETHOS. See -# 1907.01496 for more details on both cases. - -# 7.2.2.a) Amount of interacting dark radiation (idr) -# - Can be parameterised through the temperature ratio 'xi_idr' (= T_idr/T_cmb) -# - Can be parameterised through the number of extra relativistic relics 'N_idr' (or indifferently 'N_dg') -# In all cases the parameter is dimensionless. -# (default : 0) -xi_idr = -#N_idr = - -# 7.2.2.b) Statistical factor to differentiate between fermionic (= 7/8) and bosonic (= 1) dark radiation (default 7/8) -stat_f_idr = 0.875 - -# 7.2.2.c) Strength of the coupling between DM and DR: -# -# Can be passed as 'a_idm_dr' or 'a_dark' in ETHOS parameterisation, in units of 1/Mpc. -# Then in ETHOS notations: Gamma_DR-DM = - omega_DM a_dark ((1+z)/10^7)^nindex_dark -# while: Gamma_DM-DR = - 4/3 (rho_DR/rho_DM) omega_DM a_dark ((1+z)/10^7)^nindex_dark -# = - 4/3 omega_DR a_dark (1+z) ((1+z)/10^7)^nindex_dark -# or in CLASS notations: dmu_idm_dr = - Gamma_DR-DM = omega_idm_dr a_idm_dr ((1+z)/10^7)^nindex_idm_dr -# -# Can be passed as 'Gamma_0_nadm' in NADM parameterisation, in units of 1/Mpc. -# Then in ETHOS notations: Gamma_DR-DM = - 3/4 Omega_DM/Omega_DR Gamma_0_nadm -# while: Gamma_DM-DR = - (1+z) Gamma_0_nadm -# or in CLASS notations: dmu_idm_dr = - Gamma_DR-DM = 3/4 Omega_idm_dr/Omega_idr Gamma_0_nadm -# -# (default : 0) -a_idm_dr = 0. -#Gamma_0_nadm = - -# 7.2.2.d) Only if ETHOS parametrization : Power of the temperature dependence of the co-moving idr - idm_dr interaction rate -# Can be passed indifferently as 'nindex_idm_dr' (or 'nindex_dark'), in units of 1/Mpc. -# (default : 4, unless Gamma_0_nadm has been passed, then default changes to 0) -nindex_idm_dr = - -# 7.2.2.e) Only if ETHOS parametrization : Nature of the interacting dark radiation: 'free_streaming' or 'fluid' -# (default = 'free_streaming', unless Gamma_0_nadm has been passed, then default changes to 'fluid') -idr_nature = - -# 7.2.2.f) Strength of the dark radiation self interactions coupling, -# can be passed as 'b_idr' or 'b_dark', in units of 1/Mpc. -# In ETHOS notations: Gamma_DR-DR = (b_dark/a_dark) (Omega_DR/Omega_DM) Gamma_DR-DM -# In CLASS notations: dmu_idr = - Gamma_DR-DR = (b_idr/a_idm_dr) (Omega_idr/Omega_idm_dr) dmu_idm_dr -# (default : 0) -b_idr = - -# 7.2.2.g) idr - idm_dr interaction angular coefficient: 'alpha_idm_dr' (or indifferently 'alpha_dark') -# Should be 3/4 if vector boson mediator; 3/2 if scalar boson mediator. -# In full generality this coefficient may depend on l = 2, 3, 4... -# The user can pass here a list of values with an arbitrary size. The first coefficients will be adjusted -# accordingly. After that, the last value will be repeated. -# For instance, if users passes 3, 2, 1, the code will take alpha_2=3, alpha_3=2, and all others equal to 1. -# (default = all set to 1.5) -alpha_idm_dr = 1.5 - -# 7.2.2.h) idr self-interaction angular coefficient: 'beta_idr' (or indifferently 'beta_dark') -# In full generality this coefficient may depend on l = 2, 3, 4... -# The user can pass here a list of values with an arbitrary size. The first coefficients will be adjusted -# accordingly. After that, the last value will be repeated. -# For instance, if users passes 3, 2, 1, the code will take beta_2=3, beta_3=2, and all others equal to 1. -# (default = all set to 1.5) -beta_idr = 1.5 - -# -> Precision parameters for idm_dr and idr can be found in precisions.h, with the tag idm_dr - -# 7.2.3) Interacting Dark Matter with Baryons -# Implemented by D.C. Hooper, N. Schoeneberg, and N. Becker -# following 1311.2937, 1509.00029, 1803.09734, 1802.06788 - -# 7.2.3.a) Coupling strength of Dark Matter and baryons (in cm^2) (default : 0) -cross_idm_b = 0. -# 7.2.3.b) Temperature dependence of the DM - baryon interactions (between -4 and 4) (default : 0) -n_index_idm_b = 0 - -# 7.2.4) Dark Matter interactions with photons -# Implementd by N. Becker following the formalism of Stadler&Boehm (1802.06589) - -# 7.2.4.a) Interaction coefficient or coupling strength between DM and photons -# Can be passed as either u_idm_g (dimensionless interaction strength) or cross_idm_g (cross section in cm^2) (default : 0) -u_idm_g = 0 -#cross_idm_g = 0 - -# 7.2.4.b) Temperature dependence of the DM - photon interactions (default : 0) -n_index_idm_g = 0 - -# End of ADDITIONAL SPECIES - - -# 8) Dark energy contributions. -# At least one out of three conditions must be satisfied: -# - 'Omega_Lambda' unspecified. -# - 'Omega_fld' unspecified. -# - 'Omega_scf' set to a negative value. [Will be refered to as -# unspecified in the following text.] -# The code will then use the first unspecified component to satisfy the -# closure equation (sum_i Omega_i) equals (1 + Omega_k) -# (default: 'Omega_fld' and 'Omega_scf' set to 0 and 'Omega_Lambda' -# inferred by code) -Omega_fld = 0 -Omega_scf = 0 -# Omega_Lambda = 0.7 - -# 8.a) If Omega fluid is different from 0 - -# 8.a.1) The flag 'use_ppf' is 'yes' by default, to use the PPF approximation -# (see 0808.3125 [astro-ph]) allowing perturbations to cross the -# phantom divide. Set to 'no' to enforce true fluid equations for -# perturbations. When the PPF approximation is used, you can choose the -# ratio 'c_gamma_over_c_fld' (eq. (16) in 0808.3125). The default is 0.4 -# as recommended by that reference, and implicitely assumed in other -# codes. (default: 'use_ppf' to yes, 'c_gamma_over_c_fld' to 0.4) -use_ppf = yes -c_gamma_over_c_fld = 0.4 - -# 8.a.2) Choose your equation of state between different models, -# - 'CLP' for p/rho = w0_fld + wa_fld (1-a/a0) -# (Chevalier-Linder-Polarski), -# - 'EDE' for early Dark Energy -# (default:'fluid_equation_of_state' set to 'CLP') -fluid_equation_of_state = CLP - -# 8.a.2.1) Equation of state of the fluid in 'CLP' case and squared sound speed -# 'cs2_fld' of the fluid (this is the sound speed defined in the frame -# comoving with the fluid, i.e. obeying to the most sensible physical -# definition). Generalizing w(a) to a more complicated expressions would -# be easy, for that, have a look into source/background.c at the -# function background_w_fld(). (default: 'w0_fld' set to -1, 'wa_fld' to -# 0, 'cs2_fls' to 1) -#w0_fld = -0.9 -#wa_fld = 0. -#cs2_fld = 1 - -# 8.a.2.2) Equation of state of the fluid in 'EDE' case and squared sound speed -# 'cs2_fld' of the fluid (this is the sound speed defined in the frame -# comoving with the fluid, i.e. obeying to the most sensible physical -# definition). Generalizing w(a) to a more complicated expressions would -# be easy, for that, have a look into source/background.c at the -# function background_w_fld(). (default: 'w0_fld' set to -1, 'Omega_EDE' -# to 0, 'cs2_fls' to 1) -#w0_fld = -0.9 -#Omega_EDE = 0. -#cs2_fld = 1 - -# 8.b) If Omega scalar field is different from 0 - -# 8.b.1) Scalar field (scf) potential parameters and initial conditions -# (scf_parameters = [scf_lambda, scf_alpha, scf_A, scf_B, phi, -# phi_prime]). V = ((\phi-B)^\alpha + A)exp(-lambda*phi), see -# http://arxiv.org/abs/astro-ph/9908085. If 'attractor_ic_scf' is set to -# 'no', the last two entries are assumed to be the initial values of phi -# in units of the reduced planck mass m_Pl and the conformal time -# derivative of phi in units of [m_Pl/Mpc]. (Note however that CLASS -# determines the initial scale factor dynamically and the results might -# not be as expected in some models.) -scf_parameters = 10.0, 0.0, 0.0, 0.0, 100.0, 0.0 - -# 8.b.2) Scalar field (scf) initial conditions from attractor solution (assuming -# pure exponential potential). (default: yes) -attractor_ic_scf = yes - -# 8.b.3) Scalar field (scf) shooting parameter: If Omega_scf is set (can only be negative), -# the following index (0,1,2,...) in the list scf_parameters will be used for shooting: -# (See also the section about shooting in input.c) -# Basically parameter number scf_tuning_index will be adjusted until -# the correct Omega_scf is found to suffice the budget equation -scf_tuning_index = 0 - - -# 8.b.4) Scalar field (scf) shooting parameter. With this, you can overwrite some parameter -# of 8.b.1) depending on the index defined in 8.b.3) -scf_shooting_parameter = - -# ----------------------------------------- -# ----> Exotic energy injection parameters: -# ----------------------------------------- - -# 1) DM Annihilation - -# 1.a) In order to model energy injection from DM annihilation, specify a -# parameter 'annihilation_efficiency' corresponding to -# / m_cdm expressed here in units of m^3/s/J. Alternatively, -# you can specify the annihilation cross section in cm^3/s and the DM -# mass in GeV. The code will then evaluate 'annihilation_efficiency'. -# (default: all set to zero) -DM_annihilation_efficiency = 0. -#DM_annihilation_cross_section = 0. -#DM_annihilation_mass = 0. -#DM_annihilation_fraction = 0. - -# 1.a.1) You can model simple variations of the above quantity as a function of -# redhsift. If 'annihilation_variation' is non-zero, the function F(z) -# defined as ( / m_cdm)(z) (see 1.a) will be a parabola in log-log scale -# between 'annihilation_zmin' and 'annihilation_zmax', with a curvature -# given by 'annihilation_variation' (must be negative), and with a maximum -# in 'annihilation_zmax'; it will be constant outside this range. To -# take DM halos into account, specify the parameters 'annihilation_f_halo', -# the amplitude of the halo contribution, and 'annihilation_z_halo', -# the characteristic redshift of halos (default: no variation, -# 'annihilation_variation' and 'annihilation_f_halo' set to zero). -DM_annihilation_variation = 0. -DM_annihilation_z = 1000 -DM_annihilation_zmax = 2500 -DM_annihilation_zmin = 30 -DM_annihilation_f_halo= 0 -DM_annihilation_z_halo= 8 - - -# 2) DM electromagnetic decay - -# 2.a) Specify the dimensionless parameter 'decay_fraction' which is -# equal to the fraction of cdm with electromagnetic decay -# products (decaying into dark radiation is handled by -# Omega_dcdm). Note: Until class 2.7, this parameter was called -# 'decay'. Its name and its meaning have slightly changed to -# avoid confusion when working with model in which the lifetime -# of the dcdm can be small (this is allowed providing that the -# 'decay_fraction' parameter is small as well). (default: set to -# 0) -DM_decay_fraction = 0. - -# 2.b) Specify the decay width of the particle 'decay_Gamma' in 1/s. -# (default: set to 0) -DM_decay_Gamma = 0. - - -# 3) PBH evaporation. In this case, check that in 5), 'f_eff_type' and -# 'f_eff' have their default values 'on_the_spot' and 1, because CLASS -# will automatically take into account the time-dependent efficiency -# of energy injection from evaporating BH, taking the spectrum of -# evaporated particles into account. - -# 3.a) Specify a dimensionless parameter 'PBH_evaporation_fraction' which is equal -# to the fraction of evaporating PBH. (default set to 0) -PBH_evaporation_fraction = 0. - -# 3.b) Specify the mass of the evaporating PBH in g. (default set to 0) -PBH_evaporation_mass = 0. - - -# 4) PBH matter accretion - -# 4.a) Specify a dimensionless parameter 'PBH_accreting_fraction' which is equal -# to the fraction of accreting PBH. (default set to 0) -PBH_accretion_fraction = 0. - -# 4.b) Specify the mass of the accreting PBH in Msun. (default set to 0) -PBH_accretion_mass = 0. - -# 4.c) Specify the 'PBH_accretion_recipe' between 'spherical_accretion' -# (computed according to Ali-Haimoud and Kamionkowski 1612.05644), or -# 'disk_accretion' (computed according to Poulin et al. 1707.04206). -# (default set to 'disk_accretion') -PBH_accretion_recipe = disk_accretion - -# 4.c.1) If you choose 'spherical_accretion', you might want to specify the -# relative velocity between PBH and baryons in km/s. -# If negative, the linear result is chosen by the code. -# (default set to -1., standard value is the linear result extrapolated to PBH.) -PBH_accretion_relative_velocities = -1. - -# 4.c.2) If you choose 'disk_accretion', you might want to specify the -# factor 'PBH_accretion_ADAF_delta' which, determines the heating -# of the electrons in the disk, influencing the emissivity. -# Can be set to 0.5 (aggressive scenario), 0.1 or 1.e-3 (conservative). -# (default set to 1.e-3) -# Furthermore you can also specify the the eigenvalue of the accretion -# rate. It rescales the perfect Bondi case. (see e.g. Ali-Haimoud -# & Kamionkowski 2016) (default set to 0.1, standard value in the ADAF -# scenario.) -PBH_accretion_ADAF_delta = 1.e-3 -PBH_accretion_eigenvalue = 0.1 - -# 5) Define the so-called injection efficiency f_eff, i.e. the factor -# determining how much of the heating is deposited at all, -# regardless of the form. There are two options to define this -# function: 'on_the_spot' or 'from_file' (default: set to 'on_the_spot'). -# -# - with 'on_the_spot', the injected energy is transformed into deposited energy -# at the same redshift with efficiency f_eff. In this case the -# user can pass explicitely the value of f_eff. (default: f_eff=1) -# -# - for 'from_file' the code reads a precomputed function in an external file -# with a path set by the user (default set to "external/heating/example_f_eff_file.dat") -f_eff_type = on_the_spot -#f_eff = -#f_eff_file = external/heating/example_f_eff_file.dat - -# 6) Define the so-called deposition function chi, i.e the function which determines -# the amount of energy effectively deposited into the different forms (heating, -# ionization, Lyman alpha and low energy). There are several options -# - by setting 'chi_type' to 'CK_2004', the approximation by Chen & Kamionkowski 2004 is employed. -# - by setting 'chi_type' to 'PF_2005', the approximation by Padmanabhan & Finkbeiner 2005 is employed. -# - by setting 'chi_type' to 'Galli_2013_file', the approximation by Galli et al. 2013 is employed. -# - by setting 'chi_type' to 'Galli_2013_analytic', the approximation by Poulin is employed. -# interpolating Galli et al. 2013 anyltically. Use this for consistency tests with -# older versions of CLASS (2.x). -# - by setting 'chi_type' to 'heat', the whole injected energy is going -# to be deposited into heat. -# - by setting 'chi_type' to 'from_x_file' or 'from_z_file', the user can -# define own deposition functions with respect to the free electron -# fraction x_e or to redshift, respectively. -# (default set to 'CK_2004') -chi_type = CK_2004 - -# 6.a) If the option 'from_file' has been chosen, define the name of the file. -# Two files 'example_chix_file.dat' and 'example_chiz_file.dat' are given -# as example in external/heating. Note that 'example_chix_file.dat' has -# been computed according to the approximations of Galli et al. 2013. -# (default set to "external/heating/example_f_eff_file.dat") -#chi_file = external/heating/example_chiz_file.dat -#chi_file = external/heating/example_chix_file.dat - - - -# ------------------------------- -# ----> Non-linear parameters: -# ------------------------------- - -# 1) If you want an estimate of the non-linear P(k) and Cls: -# Enter 'halofit' or 'Halofit' or 'HALOFIT' for Halofit -# Enter 'hmcode' or 'Hmcode' or 'HMcode' or 'HMCODE' for HMcode; -# otherwise leave blank (default: blank, linear P(k) and Cls) -non_linear = - -# 1.a) if you chose Halofit, and you have Omega0_fld != 0. (i.e. you -# set Omega_lambda=0.) & wa_fld != 0., then you might want to use the -# pk equal method of 0810.0190 and 1601.07230 by setting this flag to -# 'yes' (default: set to 'no') -pk_eq = - -# 1.b) if you chose HMcode: -# In HMcode you can specify a baryonic feedback model (otherwise only DM is used). -# Each model depends on two parameters: the minimum concentration "c_min" from the -# Bullock et al. 2001 mass-concentration relation and the halo bloating parameter "eta_0" -# introduced in Mead et al. 2015. In Mead et al. 2015 the parameters c_min and eta_0 are fitted -# to the Cosmic Emulator dark matter only simulation (Heitman et al. 2014) and the -# hydrodynamical OWLS simulations (Schaye et al. 2010, van Daalen et al. 2011). -# You can choose between the 5 models of Mead et al. 2015, Table 4: -# Model (eta_0, c_min) Explanation -# - 'emu_dmonly' (0.603, 3.13) fits the only dark matter Cosmic Emulator simulation (default) -# - 'owls_dmonly' (0.64, 3.43) fits the OWLS simulation of dark matter only -# - 'owls_ref' (0.68, 3.91) fits the OWLS simulation that includes gas cooling, heating, -# star formation and evolution, chemical enrichment and supernovae feedback -# - 'owls_agn' (0.76, 2.32) fits the OWLS simulation that includes AGN feedback -# - 'owls_dblim' (0.70, 3.01) fits the OWLS simulation that has extra supernova energy in wind velocity -# Set 'feedback model' to one of these names, -# or leave blank and pass manually the value of either 'eta_0' or 'c_min' -# (the other one will then be fixed according to equation (30) in Mead et al. 2015), -# or pass manually the two values of 'eta_0' and 'c_min' -# (default: 'feedback model' set to 'nl_emu_dmonly') -feedback model = -eta_0 = -c_min = - -# ---------------------------- -# ----> Primordial parameters: -# ---------------------------- - -# 1) Primordial spectrum type -# - 'analytic_Pk' for an analytic smooth function with amplitude, tilt, -# running, etc.; analytic spectra with feature can also be added as -# a new type; -# - 'inflation_V' for a numerical computation of the inflationary -# primordial spectrum, through a full integration of the perturbation -# equations, given a parametrization of the potential V(phi) in the -# observable window, like in astro-ph/0703625; -# - 'inflation_H' for the same, but given a parametrization of the -# potential H(phi) in the observable window, like in -# astro-ph/0710.1630; -# - 'inflation_V_end' for the same, but given a parametrization of the -# potential V(phi) in the whole region between the observable part and -# the end of inflation; -# - 'two scales' allows to specify two amplitudes instead of one -# amplitude and one tilt, like in the isocurvature mode analysis of the -# Planck inflation paper (works also for adiabatic mode only; see -# details below, item 2.c); -# - 'external_Pk' allows for the primordial spectrum to be computed -# externally by some piece of code, or to be read from a table, see -# 2.d). -# (default: set to 'analytic_Pk') -Pk_ini_type = analytic_Pk - -# 1.a) Pivot scale in Mpc-1 (default: set to 0.05) -k_pivot = 0.05 - -# 1.b) For type 'analytic_Pk': -# 1.b.1) For scalar perturbations -# curvature power spectrum value at pivot scale ('A_s' or -# 'ln_A_s_1e10') OR one of 'sigma8' or 'S8' (found by iterations using a shooting -# method). (default: set 'A_s' to 2.100549e-09) -A_s = 2.100549e-09 -#ln_A_s_1e10 = 3.04478383 -#sigma8 = 0.824398 -#S8 = 0.837868 - -# 1.b.1.1) Adiabatic perturbations: -# tilt at the same scale 'n_s', and tilt running 'alpha_s' -# (default: set 'n_s' to 0.9660499, 'alpha_s' to 0) -n_s = 0.9660499 -alpha_s = 0. - -# 1.b.1.2) Isocurvature/entropy perturbations: -# for each mode xx ('xx' being one of 'bi', 'cdi', 'nid', 'niv', -# corresponding to baryon, cdm, neutrino density and neutrino velocity -# entropy perturbations), enter the entropy-to-curvature ratio f_xx, -# tilt n_xx and running alpha_xx, all defined at the pivot scale; e.g. -# f_cdi of 0.5 means S_cdi/R equal to one half and (S_cdi/R)^2 to 0.25 -# (default: set each 'f_xx' to 1, 'n_xx' to 1, 'alpha_xx' to 0) -f_bi = 1. -n_bi = 1.5 -f_cdi=1. -f_nid=1. -n_nid=2. -alpha_nid= 0.01 -# etc. - -# 1.b.1.3) Cross-correlation between different adiabatic/entropy mode: -# for each pair (xx, yy) where 'xx' and 'yy' are one of 'ad', 'bi', -# 'cdi', 'nid', 'niv', enter the correlation c_xx_yy (parameter between -# -1 and 1, standing for cosDelta, the cosine of the cross-correlation -# angle), the tilt n_xx_yy of the function cosDelta(k), and its running -# alpha_xx_yy, all defined at the pivot scale. So, for a pair of fully -# correlated (resp. anti-correlated) modes, one should set (c_xx_yy, -# n_xx_yy, alpha_xx_yy) to (1,0,0) (resp. (-1,0,0) (default: set each -# 'c_xx_yy' to 0, 'n_xx_yy' to 0, 'alpha_xx_yy' to 0) -c_ad_bi = 0.5 -#n_ad_bi = 0.1 -c_ad_cdi = -1. -c_bi_nid = 1. -#n_bi_nid = -0.2 -#alpha_bi_nid = 0.002 -# etc. - -# 1.b.2) For tensor perturbations (if any): -# tensor-to-scalar power spectrum ratio, tilt, -# running at the pivot scale; if 'n_t' and/or 'alpha_t' is set to 'scc' -# or 'SCC' isntead of a numerical value, it will be inferred from the -# self-consistency condition of single field slow-roll inflation: for -# n_t, -r/8*(2-r/8-n_s); for alpha_t, r/8(r/8+n_s-1) (default: set 'r' -# to 1, 'n_t' to 'scc', 'alpha_t' to 'scc') -r = 1. -n_t = scc -alpha_t = scc - -# 1.c) For type 'inflation_V' -# 1.c.1) Type of potential: 'polynomial' for a Taylor expansion of the -# potential around phi_pivot. Other shapes can easily be defined in -# primordial module. -potential = polynomial - -# 1.c.2) For 'inflation_V' and 'polynomial': enter either the coefficients -# 'V_0', 'V_1', 'V_2', 'V_3', 'V_4' of the Taylor expansion (in units of -# Planck mass to appropriate power), or their ratios 'R_0', 'R_1', -# 'R_2', 'R_3', 'R_4' corresponding to (128pi/3)*V_0^3/V_1^2, -# V_1^2/V_0^2, V_2/V_0, V_1*V_3/V_0, V_1^2*V_4/V_0^3, or the -# potential-slow-roll parameters 'PSR_0', 'PSR_1', 'PSR_2', 'PSR_3', -# 'PSR_4', equal respectively to R_0, epsilon_V=R_1/(16pi), -# eta_V=R_2/(8pi), ksi_V=R_3/(8pi)^2, omega_V=R_4/(8pi)^3 (default: -# 'V_0' set to 1.25e-13, 'V_1' to 1.12e-14, 'V_2' to 6.95e-14, 'V_3' -# and 'V_4' to zero). -V_0=1.e-13 -V_1=-1.e-14 -V_2=7.e-14 -V_3= -V_4= -#R_0=2.18e-9 -#R_1=0.1 -#R_2=0.01 -#R_3= -#R_4= -#PSR_0 = 2.18e-9 -#PSR_1 = 0.001989 -#PSR_2 = 0.0003979 -#PSR_3 = -#PSR_4 = - -# 1.d) For 'inflation_H': -# enter either the coefficients 'H_0', 'H_1', 'H_2', 'H_3', 'H_4' of the -# Taylor expansion (in units of Planck mass to appropriate power), or the -# Hubble-slow-roll parameters 'HSR_0', 'HSR_1', 'HSR_2', 'HSR_3', 'HSR_4' -H_0=1.e-13 -H_1=-1.e-14 -H_2=7.e-14 -H_3= -H_4= -#HSR_0 = 2.18e-9 -#HSR_1 = 0.001989 -#HSR_2 = 0.0003979 -#HSR_3 = -#HSR_4 = - -# 1.e) For type 'inflation_V_end': -# 1.e.1) Value of the field at the minimum of the potential after inflation, or -# at a value in which you want to impose the end of inflation, in -# hybrid-like models. By convention, the code expects inflation to take -# place for values smaller than this value, with phi increasing with -# time (using a reflection symmetry, it is always possible to be in that -# case) (default: 'phi_end' set to 0) -phi_end = - -# 1.e.2) Shape of the potential. Refers to functions pre-coded in the primordail -# module, so far 'polynomial' and 'higgs_inflation'. (default: -# 'full_potential' set to 0) -full_potential = polynomial - -# 1.e.3) Parameters of the potential. The meaning of each parameter is -# explained in the function primrodial_inflation_potential() in -# source/primordial.c -Vparam0 = -Vparam1 = -Vparam2 = -Vparam3 = -Vparam4 = - -# 1.e.4) How much the scale factor a or the product (aH) increases between -# Hubble crossing for the pivot scale (during inflation) and the end of -# inflation. You can pass either: 'N_star' (standing for -# log(a_end/a_pivot)) set to a number; or 'ln_aH_ratio' (standing for -# log(aH_end/aH_pivot)) set to a number; (default: 'N_star' set to 60) -#ln_aH_ratio = 50 -#N_star = 55 - -# 1.e.5) Should the inflation module do its nomral job of numerical integration -# ('numerical') or use analytical slow-roll formulas to infer the -# primordial spectrum from the potential ('analytical')? (default: -# 'inflation_behavior' set to 'numerical') -#inflation_behavior = numerical - -# 1.f) For type 'two_scales' (currently this option works only for scalar modes, -# and either for pure adiabatic modes or adiabatic + one type of -# isocurvature): -# 1.f.1) Two wavenumbers 'k1' and 'k2' in 1/Mpc, at which primordial amplitude -# parameters will be given. The value of 'k_pivot' will not be used in -# input but quantities at k_pivot will still be calculated and stored in -# the primordial structure (no default value: compulsory input if -# 'P_k_ini type' has been set to 'two_scales') -k1=0.002 -k2=0.1 - -# 1.f.2) Two amplitudes 'P_{RR}^1', 'P_{RR}^2' for the adiabatic primordial -# spectrum (no default value: compulsory input if 'P_k_ini type' has been -# set to 'two_scales') -P_{RR}^1 = 2.3e-9 -P_{RR}^2 = 2.3e-9 - -# 1.f.3) If one isocurvature mode has been turned on ('ic' set e.g. to 'ad,cdi' -# or 'ad,nid', etc.), enter values of the isocurvature amplitude -# 'P_{II}^1', 'P_{II}^2', and cross-correlation amplitude 'P_{RI}^1', -# '|P_{RI}^2|' (see Planck paper on inflation for details on -# definitions) -P_{II}^1 = 1.e-11 -P_{II}^2 = 1.e-11 -P_{RI}^1 = -1.e-13 -|P_{RI}^2| = 1.e-13 - -# 1.f.4) Set 'special iso' to 'axion' or 'curvaton' for two particular cases: -# 'axion' means uncorrelated, n_ad equal to n_iso, 'curvaton' means fully -# anti-correlated with f_iso<0 (in the conventions of the Planck -# inflation paper this would be called fully correlated), n_iso equal -# to one; in these two cases, the last three of the four paramneters in -# 2.c.3 will be over-written give the input for 'P_{II}^1' (defaut: -# 'special_iso' left blanck, code assumes general case described by four -# parameters of 2.c.3) -special_iso = - -# 1.g) For type 'external_Pk' (see external documentation external_Pk/README.md -# for more details): -# 1.g.1) Command generating the table. If the table is already generated, just -# write "cat ". The table should have two columns (k, pk) if -# tensors are not requested, or three columns (k, pks, pkt) if they are. -#command = python external/external_Pk/generate_Pk_example.py -#command = python external/external_Pk/generate_Pk_example_w_tensors.py -command = cat external/external_Pk/Pk_example.dat -#command = cat external/external_Pk/Pk_example_w_tensors.dat - -# 1.g.2) If the table is not pregenerated, parameters to be passed to the -# command, in the right order, starting from "custom1" and up to -# "custom10". They must be real numbers. -custom1 = 0.05 # In the example command: k_pivot -custom2 = 2.215e-9 # In the example command: A_s -custom3 = 0.9624 # In the example command: n_s -custom4 = 2e-10 # In the example (with tensors) command: A_t -custom5 = -0.1 # In the example (with tensors) command: n_t -#custom6 = 0 -#custom7 = 0 -#custom8 = 0 -#custom9 = 0 -#custom10 = 0 - - - -# ------------------------- -# ----> Spectra parameters: -# ------------------------- - -# 1) Maximum l for CLs: -# - 'l_max_scalars' for CMB scalars (temperature, polarization, cmb -# lensing potential), -# - 'l_max_vectors' for CMB vectors -# - 'l_max_tensors' for CMB tensors (temperature, polarization) -# - 'l_max_lss' for Large Scale Structure Cls (density, galaxy -# lensing potential) -# Reducing 'l_max_lss' with respect to l_max_scalars reduces the execution -# time significantly (default: set 'l_max_scalars' to 2500, 'l_max_vectors' -# to 500, 'l_max_tensors' to 500, 'l_max_lss' to 300) -l_max_scalars = 2500 -#l_max_vectors = 500 -l_max_tensors = 500 -#l_max_lss = 300 - - -# 2) Parameters for the the matter density number count (option 'nCl' -# (or 'dCl')) or galaxy lensing potential (option 'sCl') Cls: -# 2.a) Enter here a description of the selection functions W(z) of each redshift -# bin; selection can be set to 'gaussian', 'tophat' or 'dirac', then pass a -# list of N mean redshifts in growing order separated by comas, 1 or N -# widths separated by comas, 1 or N bias separated by a comma, and 1 or N -# magnification bias separated by a comma. The width stands for one -# standard deviation of the gaussian (in z space), or for the half-width of -# the top-hat. Finally, non_diagonal sets the number of cross-correlation -# spectra that you want to calculate: 0 means only auto-correlation, 1 -# means only adjacent bins, and number of bins minus one means all -# correlations (default: set to 'gaussian',1,0.1,1.,0.,0) -# -# NOTE: For good performances, the code uses the Limber approximation for -# nCl. If you want high precision even with thin selection functions, -# increase the default value of the precision parameters -# l_switch_limber_for_nc_local_over_z and -# l_switch_limber_for_nc_los_over_z; for instance, add them to the -# input file with values 10000 and 2000, instead of the default 100 -# and 30. -selection=gaussian -selection_mean = 0.98,0.99,1.0,1.1,1.2 -selection_width = 0.1 -selection_bias = -selection_magnification_bias = -non_diagonal=4 - -# 2.b) It is possible to multiply the window function W(z) by a selection -# function 'dNdz' (number of objects per redshift interval). Type the name -# of the file containing the redshift in the first column and the number of -# objects in the second column (do not call it 'analytic*'). Set to -# 'analytic' to use instead the analytic expression from arXiv:1004.4640 -# (this function can be tuned in the module transfer.c, in the subroutine -# transfer_dNdz_analytic). Leave blank to use a uniform distribution -# (default). -dNdz_selection = - -# 2.c) It is possible to consider source number counts evolution. Type the name -# of the file containing the redshift on the first column and the number -# of objects on the second column (do not call it 'analytic*'). Set to -# 'analytic' to use instead the analytic expression from Eq. 48 of -# arXiv:1105.5292. Leave blank to use constant comoving number densities -# (default). -dNdz_evolution = - - -# 3) Power spectrum P(k) -# 3.a) Maximum k in P(k), 'P_k_max_h/Mpc' in units of h/Mpc or 'P_k_max_1/Mpc' -# inunits of 1/Mpc. If scalar Cls are also requested, a minimum value is -# automatically imposed (the same as in scalar Cls computation) (default: -# set to 1 1/Mpc) -P_k_max_h/Mpc = 1. -#P_k_max_1/Mpc = 0.7 - -# 3.a.1) If you want to use a different value for k_max in the primordial and -# perturbations structures, specify -# 'primordial_P_k_max_h/Mpc' in units of h/Mpc or -# 'primordial_P_k_max_1/Mpc' in units of 1/Mpc -# to define the maximum value of k for primordial power spectrum. By doing -# so, 'P_k_max_h/Mpc' will only apply to perturbations. If unspecified, -# 'primordial_P_k_max_h/Mpc' is assumed to be the same as 'P_k_max_h/Mpc'. -#primordial_P_k_max_h/Mpc = -#primordial_P_k_max_1/Mpc = - -# 3.b) Value(s) 'z_pk' of redshift(s) for P(k,z) output file(s); can be ordered -# arbitrarily, but must be separated by comas (default: set 'z_pk' to 0) -z_pk = 0 -#z_pk = 0., 1.2, 3.5 - -# 3.c) If the code is interfaced with routines that need to interpolate P(k,z) at -# various values of (k,z), enter 'z_max_pk', the maximum value of z at -# which such interpolations are needed. (default: set to maximum value in -# above 'z_pk' input) -#z_max_pk = 10. - - - -# ---------------------------------- -# ----> Lensing parameters: -# ---------------------------------- - -# 1) Relevant only if you ask for 'tCl, lCl' and/or 'pCl, lCl': if you want the -# spectrum of lensed Cls. Can be anything starting with 'y' or 'n'. -# (default: no lensed Cls) -lensing = yes - - -# 2) Should the lensing potential [phi+psi](k,tau) and the lensing spectrum Cl_phiphi be rescaled? -# You can rescale [phi+psi](k,tau) at all times by an overall amplitude and tilt: lcmb_rescale*(k/lcmb_pivot)**lcmb_tilt -# Or, more simply, you can pass the usual parameter 'A_l', and the potential will be rescaled by sqrt(A_L) -# (matches standard definition in Calabrese et al. 0803.2309) -# (default: no rescaling: A_L=lcmb_rescale=1) -A_L = -#lcmb_rescale = 1 -#lcmb_tilt = 0 -#lcmb_pivot = 0.1 - - - -# ------------------------------------- -# ----> Distortions parameters: -# ------------------------------------- - -# 1) Which kind of appriximation would you like to use for the calculation of the -# branching ratios? -# To use approximation 1) 'branching approx'=sharp_sharp -# To use approximation 2) 'branching approx'=sharp_soft -# To use approximation 3) 'branching approx'=soft_soft -# To use approximation 4) 'branching approx'=soft_soft_cons -# To use approximation 5) 'branching approx'=exact -# -# Approximation 3) violates energy conservation in the plasma, and is discouraged. -# Please be aware, that the total energy injected will NOT include the residual distortion energy. -# (default set to 'exact') -sd_branching_approx = exact - -# 1.a) If the branching ratios are = exact, the user can specify additional parameters. For any other -# branching ratio approximation, all of the following parameters are going to be ignored. -# 1.a.1) How many multipoles do you want to use for the residuals in the case of the PCA -# analysis? The value can vary between 0 and 6. (default set to 2) -sd_PCA_size = 2 - -# 1.a.2) If PCA size is different from 0, you need to specify the chosen detector, by defining -# setting "sd_detector_name" and defining any of 1.a.3.x). -# In external/distortions, the file detectors_list.dat contains a list -# of currently "known" detectors, i.e. detectors for which the PCA decomposition -# has already been computed. If no detector name is specified, but the detector specifics -# 1.a.3.x) are, the name will be created automatically. If no name and no specifics are -# given, PIXIE values are going to be assumed. -# -# For instance, in the case of "sd_detector_name=PIXIE", the values are fixed respectively to 30 GHz, -# 1005 GHz, 15 GHz and 5 10^-26 W/(m^2 Hz sr), and all spectral shapes and branching ratios are -# already precumputed. -# -# It would be very helpful if, once computed the vectors for a new detector, the user would -# send us the files containing spectral shapes and branching ratios (see e.g. -# external/distortions for templates). -sd_detector_name = PIXIE - -# 1.a.3) Provide the specifics of the detector (frequencies and sensitivities) -# Either define a path to a full noise file or enter the specifics here -# 1.a.3.1) Give a path to the full noise file containing -# - the frequency array in GHz and -# - the detector noise in 10^-26 W/(m^2 Hz sr) for each frequency -# Please supply the path relative to external/distortions -#sd_detector_file = FIRAS_nu_delta_I.dat - -# 1.a.3.2) If you did not supply the full noise file, you need to set -# - the minumum frequency in GHz -# - the maximum frequency in GHz -# - the bin width in GHz or alternatively the number of bins -# - the detector noise in 10^-26 W/(m^2 Hz sr) -# of the chosen detector. -#sd_detector_nu_min = 30. -#sd_detector_nu_max = 1000. -#sd_detector_nu_delta = 15. -#sd_detector_bin_number = 65 -#sd_detector_delta_Ic = 5. - - -# 2) Only calculate non-LCDM contributions to heating? -# Sometimes, for comparison, one might want to disable all LCDM contributions to SDs. -# Can be set to anything starting with 'y' or 'n' (default: no) -sd_only_exotic = no - - -# 3) Include g distortions? -# Can be set to anything starting with 'y' or 'n' (default: no) -sd_include_g_distortion = no - - -# 4) If you want to manually add a y and/or a mu parameter on top of the calculated values, specify -# 'sd_add_y' or 'sd_add_mu' or both (default set to 0 for both) -sd_add_y = 0. -sd_add_mu = 0. - - -# 5) Include SZ effect from reionization? Can be set to anything starting with 'y' or 'n' -# (default: no) -include_SZ_effect = no - -# 5.a) Specify the type of approximation you want to use for the SZ effect -# - by setting 'sd_reio_type' to 'Nozawa_2005', the approximation by Nozawa et al. 2005 is employed. -# - by setting 'sd_reio_type' to 'Chluba_2012', the approximation by Chluba et al. 2012 is employed. -# Note that, for the moment, this appoximation is only valid for cluster temperatures lower -# than few KeV. -# (default set to 'Chluba_2012') -#sd_reio_type = Chluba_2012 - - - -# ---------------------------------- -# ----> Output parameters: -# ---------------------------------- - -# 1) Output for external files -# 1.a) File name root 'root' for all output files (if Cl requested, written to -# '_cl.dat'; if P(k) requested, written to '_pk.dat'; plus -# similar files for scalars, tensors, pairs of initial conditions, etc.; -# if file with input parameters requested, written to -# '_parameters.ini') -# If no root is specified, the root will be set to 'output/' -# (default: output/) -#root = output/test - -# 1.a.1) If root is specified, do you want to keep overwriting the file, -# or do you want to create files numbered as 'N_'. -# Can be set to anything starting with 'y' or 'n' (default: no) -overwrite_root = no - -# 1.b) Do you want headers at the beginning of each output file (giving -# precisions on the output units/ format) ? Can be set to anything -# starting with 'y' or 'n' (default: yes) -headers = yes - -# 1.c) In all output files, do you want columns to be normalized and ordered -# with the default CLASS definitions or with the CAMB definitions (often -# idential to the CMBFAST one) ? Set 'format' to either 'class', 'CLASS', -# 'camb' or 'CAMB' (default: 'class') -format = class - -# 1.d) Do you want to write a table of background quantitites in a file? This -# will include H, densities, Omegas, various cosmological distances, sound -# horizon, etc., as a function of conformal time, proper time, scale -# factor. Can be set to anything starting with 'y' or 'no' (default: no) -write_background = no - -# 1.e) Do you want to write a table of thermodynamics quantitites in a file? -# Can be set to anything starting with 'y' or 'n'. (default: no) -write_thermodynamics = no - -# 1.f) Do you want to write a table of perturbations to files for certain -# wavenumbers k? Dimension of k is 1/Mpc. The actual wave numbers are -# chosen such that they are as close as possible to the requested k-values. (default: none) -#k_output_values = 0.01, 0.1, 0.0001 - -# 1.g) Do you want to write the primordial scalar(/tensor) spectrum in a file, -# with columns k [1/Mpc], P_s(k) [dimensionless], ( P_t(k) -# [dimensionless])? Can be set to anything starting with 'y' or 'n'. (default: no) -write_primordial = no - -# 1.h) Do you want to write the exotic energy injection function in a file, -# with columns z [dimensionless], dE/dz_inj, dE/dz_dep [J/(m^3 s)]? -# 1.i) Do you want to write also the non-injected photon heating? -# File created if 'write_exotic_injection' or -# 'write_noninjection' set to something containing the letter -# 'y' or 'Y', file written, otherwise not written (default: no) -write_exotic_injection = no -#write_noninjection = no - -# 1.k) Do you want to write the spectral distortions in a file, -# with columns x [dimensionless], DI(x) [dimensionless]? -# File created if 'write_distortions' set to something containing the letter -# 'y' or 'Y', file written, otherwise not written (default: no) -write_distortions = no - -# 1.l) Do you want to have all input/precision parameters which have been read -# written in file 'parameters.ini', and those not written in file -# 'unused_parameters' ? Can be set to anything starting with 'y' -# or 'n'. (default: yes) -write_parameters = yes - -# 1.m) Do you want a warning written in the standard output when an input -# parameter or value could not be interpreted ? Can be set to anything starting -# with 'y' or 'n' (default: no) -write_warnings = no - -# 2) Amount of information sent to standard output: Increase integer values -# to make each module more talkative (default: all set to 0) -input_verbose = 1 -background_verbose = 1 -thermodynamics_verbose = 1 -perturbations_verbose = 1 -transfer_verbose = 1 -primordial_verbose = 1 -harmonic_verbose = 1 -fourier_verbose = 1 -lensing_verbose = 1 -distortions_verbose = 1 -output_verbose = 1 diff --git a/montepython_tree/input/runNEDE_canonical.param b/montepython_tree/input/runNEDE_canonical.param new file mode 100644 index 000000000..8bf25f735 --- /dev/null +++ b/montepython_tree/input/runNEDE_canonical.param @@ -0,0 +1,162 @@ +#------Experiments to test (separated with commas)----- +data.experiments=['Planck_highl_TTTEEE','Planck_lowl_TT','Planck_lowl_EE','Planck_lensing','bao_fs_boss_dr12','bao_smallz_2014','H0_local','Pantheon','He'] + + +#------ Settings for the over-sampling. +# The first element will always be set to 1, for it is the sampling of the +# cosmological parameters. The other numbers describe the over sampling of the +# nuisance parameter space. This array must have the same dimension as the +# number of blocks in your run (so, 1 for cosmological parameters, and then 1 +# for each experiment with varying nuisance parameters). +# Note that when using Planck likelihoods, you definitely want to use [1, 4], +# to oversample as much as possible the 14 nuisance parameters. +# Remember to order manually the experiments from slowest to fastest (putting +# Planck as the first set of experiments should be a safe bet, except if you +# also have LSS experiments). +# If you have experiments without nuisance, you do not need to specify an +# additional entry in the over_sampling list (notice for instance that, out of +# the three Planck likelihoods used, only Planck_highl requires nuisance +# parameters, therefore over_sampling has a length of two (cosmology, plus one +# set of nuisance). +data.over_sampling=[1, 5,2] + +#------ Parameter list ------- + +# data.parameters[class name] = [mean, min, max, 1-sigma, scale, role] +# - if min max irrelevant, put to None +# - if fixed, put 1-sigma to 0 +# - if scale irrelevant, put to 1, otherwise to the appropriate factor +# - role is either 'cosmo', 'nuisance' or 'derived'. You should put the derived +# parameters at the end, and in case you are using the `-j fast` Cholesky +# decomposition, you should order your nuisance parameters from slowest to +# fastest. + +# Cosmological parameters list + +data.parameters['omega_b'] = [ 2.28, None, None, 0.028, 0.01, 'cosmo'] +data.parameters['omega_cdm'] = [0.133, None, None, 0.0027, 1, 'cosmo'] +data.parameters['h'] = [.715, None, None, .006, 1, 'cosmo'] +data.parameters['ln10^{10}A_s'] = [ 3.077, None, None, 0.0029, 1, 'cosmo'] +data.parameters['n_s'] = [0.99, None, None, 0.0074, 1, 'cosmo'] +data.parameters['tau_reio'] = [0.057, 0.04, None, 0.013, 1, 'cosmo'] +#NEDE parameters +data.parameters['f_NEDE'] = [0.14, 0.0000001, 0.3, 0.014, 1, 'cosmo'] +data.parameters['log10z'] = [3.3, 2, 4, 0.08, 1, 'cosmo'] +data.parameters['three_eos_NEDE'] = [2, 1, 3, 0.08, 1, 'cosmo'] + +# Nuisance parameter list, same call, except the name does not have to be a class name +data.parameters['A_cib_217'] = [ 47.2, 0, 200, 6.2593, 1, 'nuisance'] +data.parameters['cib_index'] = [ -1.3, -1.3, -1.3, 0, 1, 'nuisance'] +data.parameters['xi_sz_cib'] = [ 0.42, 0, 1, 0.33, 1, 'nuisance'] +data.parameters['A_sz'] = [ 7.23, 0, 10, 1.4689, 1, 'nuisance'] +data.parameters['ps_A_100_100'] = [ 251.0, 0, 400, 29.438, 1, 'nuisance'] +data.parameters['ps_A_143_143'] = [ 47.4, 0, 400, 9.9484, 1, 'nuisance'] +data.parameters['ps_A_143_217'] = [ 47.3, 0, 400, 11.356, 1, 'nuisance'] +data.parameters['ps_A_217_217'] = [ 119.8, 0, 400, 10.256, 1, 'nuisance'] +data.parameters['ksz_norm'] = [ 0.01, 0, 10, 2.7468, 1, 'nuisance'] +data.parameters['gal545_A_100'] = [ 8.86, 0, 50, 1.8928, 1, 'nuisance'] +data.parameters['gal545_A_143'] = [ 11.10, 0, 50, 1.8663, 1, 'nuisance'] +data.parameters['gal545_A_143_217'] = [ 19.8, 0, 100, 3.8796, 1, 'nuisance'] +data.parameters['gal545_A_217'] = [ 95.1, 0, 400, 6.9759, 1, 'nuisance'] +data.parameters['galf_EE_A_100'] = [ 0.055, 0.055, 0.055, 0, 1, 'nuisance'] +data.parameters['galf_EE_A_100_143'] = [ 0.040, 0.040, 0.040, 0, 1, 'nuisance'] +data.parameters['galf_EE_A_100_217'] = [ 0.094, 0.094, 0.094, 0, 1, 'nuisance'] +data.parameters['galf_EE_A_143'] = [ 0.086, 0.086, 0.086, 0, 1, 'nuisance'] +data.parameters['galf_EE_A_143_217'] = [ 0.21, 0.21, 0.21, 0, 1, 'nuisance'] +data.parameters['galf_EE_A_217'] = [ 0.70, 0.70, 0.70, 0, 1, 'nuisance'] +data.parameters['galf_EE_index'] = [ -2.4, -2.4, -2.4, 0, 1, 'nuisance'] +data.parameters['galf_TE_A_100'] = [ 0.114, 0, 10, 0.038762, 1, 'nuisance'] +data.parameters['galf_TE_A_100_143'] = [ 0.134, 0, 10, 0.030096, 1, 'nuisance'] +data.parameters['galf_TE_A_100_217'] = [ 0.482, 0, 10, 0.086185, 1, 'nuisance'] +data.parameters['galf_TE_A_143'] = [ 0.224, 0, 10, 0.055126, 1, 'nuisance'] +data.parameters['galf_TE_A_143_217'] = [ 0.664, 0, 10, 0.082349, 1, 'nuisance'] +data.parameters['galf_TE_A_217'] = [ 2.08, 0, 10, 0.27175, 1, 'nuisance'] +data.parameters['galf_TE_index'] = [ -2.4, -2.4, -2.4, 0, 1, 'nuisance'] +data.parameters['calib_100T'] = [ 999.69, 0, 3000, 0.61251, 0.001, 'nuisance'] +data.parameters['calib_217T'] = [ 998.16, 0, 3000, 0.63584, 0.001, 'nuisance'] +data.parameters['calib_100P'] = [ 1.021, 1.021, 1.021, 0, 1, 'nuisance'] +data.parameters['calib_143P'] = [ 0.966, 0.966, 0.966, 0, 1, 'nuisance'] +data.parameters['calib_217P'] = [ 1.040, 1.040, 1.040, 0, 1, 'nuisance'] +data.parameters['A_cnoise_e2e_100_100_EE'] = [ 1, 1, 1, 0, 1, 'nuisance'] +data.parameters['A_cnoise_e2e_143_143_EE'] = [ 1, 1, 1, 0, 1, 'nuisance'] +data.parameters['A_cnoise_e2e_217_217_EE'] = [ 1, 1, 1, 0, 1, 'nuisance'] +data.parameters['A_sbpx_100_100_TT'] = [ 1, 1, 1, 0, 1, 'nuisance'] +data.parameters['A_sbpx_143_143_TT'] = [ 1, 1, 1, 0, 1, 'nuisance'] +data.parameters['A_sbpx_143_217_TT'] = [ 1, 1, 1, 0, 1, 'nuisance'] +data.parameters['A_sbpx_217_217_TT'] = [ 1, 1, 1, 0, 1, 'nuisance'] +data.parameters['A_sbpx_100_100_EE'] = [ 1, 1, 1, 0, 1, 'nuisance'] +data.parameters['A_sbpx_100_143_EE'] = [ 1, 1, 1, 0, 1, 'nuisance'] +data.parameters['A_sbpx_100_217_EE'] = [ 1, 1, 1, 0, 1, 'nuisance'] +data.parameters['A_sbpx_143_143_EE'] = [ 1, 1, 1, 0, 1, 'nuisance'] +data.parameters['A_sbpx_143_217_EE'] = [ 1, 1, 1, 0, 1, 'nuisance'] +data.parameters['A_sbpx_217_217_EE'] = [ 1, 1, 1, 0, 1, 'nuisance'] +data.parameters['A_planck'] = [ 1.00061, 0.9, 1.1, 0.0025, 1, 'nuisance'] +data.parameters['A_pol'] = [ 1, 1, 1, 0, 1, 'nuisance'] + + +data.parameters['M'] = [-19.1, None, None, 0.004, 1,'nuisance'] + +# Derived parameters + +data.parameters['YHe'] = [1, None, None, 0, 1, 'derived'] +#data.parameters['H0'] = [0, None, None, 0, 1, 'derived'] +#data.parameters['A_s'] = [0, None, None, 0, 1e-9, 'derived'] +data.parameters['sigma8'] = [0, None, None, 0, 1, 'derived'] +data.parameters['rs_d'] = [0, None, None, 0, 1, 'derived'] +data.parameters['z_decay'] = [0, None, None, 0, 1, 'derived'] +data.parameters['NEDE_trigger_mass'] = [0, None, None, 0, 1, 'derived'] + +# Other cosmo parameters (fixed parameters, precision parameters, etc.) + +data.cosmo_arguments['sBBN file'] = data.path['cosmo']+'/bbn/sBBN_2017.dat' +data.cosmo_arguments['k_pivot'] = 0.05 + + +# The base model features two massless +# and one massive neutrino with m=0.06eV. +# The settings below ensures that Neff=3.046 +# and m/omega = 93.14 eV + +data.cosmo_arguments['N_ur'] = 2.0328 +data.cosmo_arguments['N_ncdm'] = 1 +data.cosmo_arguments['m_ncdm'] = 0.06 +data.cosmo_arguments['T_ncdm'] = 0.71611 + + + +# These two are required to get sigma8 as a derived parameter +# (class must compute the P(k) until sufficient k) +data.cosmo_arguments['output'] = 'mPk' +data.cosmo_arguments['P_k_max_h/Mpc'] = 1. + + +data.cosmo_arguments['H_over_m_NEDE']=0.2 +data.cosmo_arguments['NEDE_trigger_ini'] = 0.0001 +data.cosmo_arguments['Junction_tag'] = 1 +data.cosmo_arguments['three_cvis2_NEDE'] = 0 +data.cosmo_arguments['NEDE_ceff_nature']='tracking' + +# Recommended precision settings; less strict settings are probably also OK +data.cosmo_arguments['back_integration_stepsize'] = 1.e-3 +data.cosmo_arguments['tol_background_integration'] = 1e-10 +data.cosmo_arguments['tol_perturbations_integration'] = 1e-8 +data.cosmo_arguments['perturbations_integration_stepsize'] = 0.5 +data.cosmo_arguments['perturbations_sampling_stepsize'] = 0.003 +data.cosmo_arguments['tol_shooting_deltax_rel'] = 1e-8 +data.cosmo_arguments['tol_shooting_deltax'] = 1e-8 +data.cosmo_arguments['tol_shooting_deltaF'] = 1e-8 +data.cosmo_arguments['background_evolver'] = 1 +data.cosmo_arguments['evolver'] = 1 + +data.cosmo_arguments['background_verbose'] = 4 +data.cosmo_arguments['perturbations_verbose'] = 2 + +#makes sure that all modes start before the transition of EDE, i.e. before z=30k. +data.cosmo_arguments['start_large_k_at_tau_h_over_tau_k'] = 0.000001 +data.cosmo_arguments['start_small_k_at_tau_c_over_tau_h'] = 0.000001 + +#------ Mcmc parameters ---- + +data.N=10 +data.write_step=5 + diff --git a/montepython_tree/montepython/data.py b/montepython_tree/montepython/data.py new file mode 100644 index 000000000..3d81bf96e --- /dev/null +++ b/montepython_tree/montepython/data.py @@ -0,0 +1,1149 @@ +""" +.. module:: data + :synopsis: Define the Data and Parameter classes + +.. moduleauthor:: Benjamin Audren +""" +from __future__ import print_function +import os +import sys +import math +import random as rd +import warnings +import subprocess as sp +import re + +import io_mp # Needs to talk to io_mp.py file for the logging + # of parameters +from io_mp import dictitems,dictvalues,dictkeys +import prior +from scipy.optimize import fsolve + +# A modified version of Python dictionary in order to keep track of the order +# in it (much the same as in an array). In case an older version of Python is +# used, this module does not belong to collections. Please remind to put that +# into your PYTHONPATH variable. +try: + from collections import OrderedDict as od +except ImportError: + try: + from ordereddict import OrderedDict as od + except ImportError: + raise io_mp.MissingLibraryError( + "If you are running with Python v2.5 or 2.6, you need" + + "to manually install the ordereddict package by placing" + + "the file ordereddict.py in your Python Path") + + +class Data(object): + """ + Store all relevant data to communicate between the different modules. + + """ + + def __init__(self, command_line, path): + """ + The Data class holds the cosmological information, the parameters from + the MCMC run, the information coming from the likelihoods. It is a wide + collections of information, with in particular two main dictionaries: + cosmo_arguments and mcmc_parameters. + + It defines several useful **methods**. The following ones are called + just once, at initialization: + + * :func:`fill_mcmc_parameters` + * :func:`read_file` + * :func:`read_version` + * :func:`group_parameters_in_blocks` + + On the other hand, these two following functions are called every step. + + * :func:`check_for_slow_step` + * :func:`update_cosmo_arguments` + + Finally, the convenient method :func:`get_mcmc_parameters` will be + called in many places, to return the proper list of desired parameters. + + It has a number of different **attributes**, and the more important + ones are listed here: + + * :attr:`boundary_loglike` + * :attr:`cosmo_arguments` + * :attr:`mcmc_parameters` + * :attr:`need_cosmo_update` + * :attr:`log_flag` + + .. note:: + + The `experiments` attribute is extracted from the parameter file, + and contains the list of likelihoods to use + + .. note:: + + The path argument will be used in case it is a first run, and hence + a new folder is created. If starting from an existing folder, this + dictionary will be compared with the one extracted from the + log.param, and will use the latter while warning the user. + + .. warning:: + + New in version 2.0.0, you can now specify an oversampling of the + nuisance parameters, to hasten the execution of a run with + likelihoods that have many of them. You should specify a new field + in the parameter file, `data.over_sampling = [1, ...]`, that + contains a 1 on the first element, and then the over sampling of + the desired likelihoods. This array must have the same size as the + number of blocks (1 for the cosmo + 1 for each likelihood with + varying nuisance parameters). You need to call the code with the + flag `-j jast` for it to be used. + + To create an instance of this class, one must feed the following + parameters and keyword arguments: + + Parameters + ---------- + command_line : NameSpace + NameSpace containing the input from the :mod:`parser_mp`. It + stores the input parameter file, the jumping methods, the output + folder, etc... Most of the information extracted from the + command_file will be transformed into :class:`Data` attributes, + whenever it felt meaningful to do so. + path : dict + Contains a dictionary of important local paths. It is used here to + find the cosmological module location. + + """ + + # Initialisation of the random seed + rd.seed() + + # Store the parameter file + self.param = command_line.param + + # Recover jumping method from command_line + self.jumping = command_line.jumping + self.jumping_factor = command_line.jumping_factor + + # Store the rest of the command line + self.command_line = command_line + + # Initialise the path dictionnary. + self.path = {} + + self.boundary_loglike = -1e30 + """ + Define the boundary loglike, the value used to defined a loglike + that is out of bounds. If a point in the parameter space is affected to + this value, it will be automatically rejected, hence increasing the + multiplicity of the last accepted point. + """ + + # Creation of the two main dictionnaries: + self.cosmo_arguments = {} + """ + Simple dictionary that will serve as a communication interface with the + cosmological code. It contains all the parameters for the code that + will not be set to their default values. It is updated from + :attr:`mcmc_parameters`. + + :rtype: dict + """ + self.mcmc_parameters = od() + """ + Ordered dictionary of dictionaries, it contains everything needed by + the :mod:`mcmc` module for the MCMC procedure. Every parameter name + will be the key of a dictionary, containing the initial configuration, + role, status, last accepted point and current point. + + :rtype: ordereddict + """ + + # Arguments for PyMultiNest + self.NS_param_names = [] + self.NS_arguments = {} + """ + Dictionary containing the parameters needed by the PyMultiNest sampler. + It is filled just before the run of the sampler. Those parameters not + defined will be set to the default value of PyMultiNest. + + :rtype: dict + """ + + # Arguments for PyPolyChord + self.PC_param_names = [] + self.PC_arguments = {} + """ + Dictionary containing the parameters needed by the PyPolyChord sampler. + It is filled just before the run of the sampler. Those parameters not + defined will be set to the default value of PyPolyChord. + + :rtype: dict + """ + + # Initialise the experiments attribute + self.experiments = [] + + # Initialise the oversampling setting + self.over_sampling = [] + """ + List storing the respective over sampling of the parameters. The first + entry, applied to the cosmological parameters, will always be 1. + Setting it to anything else would simply rescale the whole process. If + not specified otherwise in the parameter file, all other numbers will + be set to 1 as well. + + :rtype: list + """ + + # Default value for the number of steps + self.N = 10 + + # Create the variable out, and out_name, which will be initialised + # later by the :mod:`io_mp` module + self.out = None + self.out_name = '' + + # If the parameter file is not a log.param, the path will be read + # before reading the parameter file. + if self.param.find('log.param') == -1: + self.path.update(path) + + # Read from the parameter file to fill properly the mcmc_parameters + # dictionary. + self.fill_mcmc_parameters() + + # Test if the recovered path agrees with the one extracted from + # the configuration file. + if self.path != {}: + if not 'root' in self.path: + self.path.update({'root': path['root']}) + if self.path != path: + warnings.warn( + "Your code location in the log.param file is " + "in contradiction with your .conf file. " + "I will use the one from log.param.") + + # Determine which cosmological code is in use + if os.path.isfile(self.path['cosmo']+'/main/class.c'): + self.cosmological_module_name = 'CLASS' + else: + self.cosmological_module_name = None + + # check for MPI + try: + from mpi4py import MPI + comm = MPI.COMM_WORLD + rank = comm.Get_rank() + except ImportError: + # set all chains to master if no MPI + rank = 0 + + # Recover the cosmological code version (and git hash if relevant). + # To implement a new cosmological code, please add another case to the + # test below. + if self.cosmological_module_name == 'CLASS': + # Official version number + common_file_path = os.path.join( + self.path['cosmo'], 'include', 'common.h') + with open(common_file_path, 'r') as common_file: + for line in common_file: + if line.find('_VERSION_') != -1: + self.version = line.split()[-1].replace('"', '') + break + if not command_line.silent and not rank: + print('with CLASS %s' % self.version) + # Git version number and branch + try: + # This nul_file helps to get read of a potential useless error + # message + with open(os.devnull, "w") as nul_file: + self.git_version = sp.Popen( + ["git", "rev-parse", "HEAD"], + cwd=self.path['cosmo'], + stdout=sp.PIPE, + stderr=nul_file).communicate()[0].strip() + self.git_branch = sp.Popen( + ["git", "rev-parse", "--abbrev-ref", "HEAD"], + cwd=self.path['cosmo'], + stdout=sp.PIPE, + stderr=nul_file).communicate()[0].strip() + except (sp.CalledProcessError, OSError): + # Note, OSError seems to be raised on some systems, instead of + # sp.CalledProcessError - which seems to be linked to the + # existence of os.devnull, so now both error are caught. + warnings.warn( + "Running CLASS from a non version-controlled repository") + self.git_version, self.git_branch = '', '' + + # If using an existing log.param, read in and compare this number + # to the already stored one + if self.param.find('log.param') != -1: + try: + version, git_version, git_branch = self.read_version( + self.param_file) + if version != self.version: + warnings.warn( + "Your version of CLASS: %s" % self.version + + " does not match the one used previously" + + " in this folder (%s)." % version + + " Proceed with caution") + else: + if self.git_branch != git_branch: + warnings.warn( + "CLASS set to branch %s" % self.git_branch + + ", wrt. the one used in the log.param:" + + " %s." % git_branch) + if self.git_version != git_version: + warnings.warn( + "CLASS set to version %s" % self.git_version + + ", wrt. the one used in the log.param:" + + " %s." % git_version) + + except AttributeError: + # This error is raised when the regular expression match + # failed - due to comparing to an old log.param that did + # not have this feature properly implemented. Ignore this. + pass + + else: + raise io_mp.CosmologicalModuleError( + "Could not find any of the registered cosmological modules, such as {CLASS}." + " The code tried to search for "+self.path['cosmo']+'/main/class.c'+" but the file did not exist." + " If you want to check for another cosmological module version" + " please add an elif clause to this part of the code.") + + # End of initialisation with the parameter file + self.param_file.close() + + self.log_flag = False + """ + Stores the information whether or not the likelihood data files need to + be written down in the log.param file. Initially at False. + + :rtype: bool + """ + + self.need_cosmo_update = True + """ + `added in version 1.1.1`. It stores the truth value of whether the + cosmological block of parameters was changed from one step to another. + See :meth:`group_parameters_in_blocks` + + :rtype: bool + """ + + # logging the parameter file (only if folder does not exist !) + ## temporary variable for readability + log_param = os.path.join(command_line.folder, 'log.param') + + if (os.path.exists(command_line.folder) and + not os.path.exists(log_param)): + if command_line.param is not None: + warnings.warn( + "Detecting empty folder, logging the parameter file") + io_mp.log_parameters(self, command_line) + self.log_flag = True + if not os.path.exists(command_line.folder): + os.makedirs(command_line.folder) + # Logging of parameters + io_mp.log_parameters(self, command_line) + self.log_flag = True + + if not command_line.silent and not rank: + sys.stdout.write('\nTesting likelihoods for:\n ->') + print(', '.join(self.experiments)+'\n') + + self.initialise_likelihoods(self.experiments) + + # Storing parameters by blocks of speed + self.group_parameters_in_blocks() + + # Finally, log the cosmo_arguments used. This comes in the end, because + # it can be modified inside the likelihoods init functions + if self.log_flag: + io_mp.log_cosmo_arguments(self, command_line) + io_mp.log_default_configuration(self, command_line) + + # Log plotting parameter names file for compatibility with GetDist + io_mp.log_parameter_names(self, command_line) + + def fill_mcmc_parameters(self): + """ + Initializes the ordered dictionary :attr:`mcmc_parameters` from + the input parameter file. + + It uses :meth:`read_file`, and initializes instances of + :class:`parameter` to actually fill in :attr:`mcmc_parameters`. + + """ + + # Define temporary quantities, only to simplify the input in the + # parameter file + self.parameters = od() + + # Read from the parameter file everything + try: + self.param_file = open(self.param, 'r') + except IOError: + raise io_mp.ConfigurationError( + "Error in initializing the Data class, the parameter file " + + "{0} does not point to a proper file".format(self.param)) + # In case the parameter file is a log.param, scan first once the file + # to extract only the path dictionnary. + if self.param.find('log.param') != -1: + self.read_file(self.param, 'data', field='path') + self.read_file(self.param, 'data') + + # Test here whether the number of parameters extracted correspond to + # the number of lines (to make sure no doublon is present) + number_of_parameters = sum( + [1 for l in open(self.param, 'r') if l and l.find('#') == -1 + and l.find('data.parameters[') != -1]) + if number_of_parameters != len(self.parameters): + raise io_mp.ConfigurationError( + "You probably have two lines in your parameter files with " + "the same parameter name. This is most probably an error, " + "which will cause problems down the line. Please fix this.") + + # Do the same for every experiments - but only if you are starting a + # new folder. Otherwise, this step will actually be done when + # initializing the likelihood. + if self.param.find('log.param') == -1: + for experiment in self.experiments: + self.read_file(self.param, experiment, separate=True) + + # Finally create all the instances of the Parameter given the input. + for key, value in dictitems(self.parameters): + self.mcmc_parameters[key] = Parameter(value, key) + + # When there is no prior edge requested, the syntax consists in setting it to 'None' in the input file. + # There is also an old syntax which is deprecated: '-1'. + # We still allow for that, but just after parsing it, we substitute it with 'None'. + # When the user really wants a prior edge in -1, he can write -1.0, then the next lines will not substitute it. + for i in [1,2]: + if (str(self.mcmc_parameters[key]['initial'][i]) == '-1'): + self.mcmc_parameters[key]['initial'][i] = None + + """ + Transform from parameters dictionary to mcmc_parameters dictionary of + instances from the class :class:`parameter` (inheriting from dict) + """ + + def initialise_likelihoods(self, experiments): + """ + Given an array of experiments, return an ordered dict of instances + + .. Note:: + + in the __init__ method, experiments is naturally self.experiments, + but it is useful to keep it as a parameter, for the case of + importance sampling. + + """ + + self.lkl = od() + # adding the likelihood directory to the path, to import the module + # then, for each library, calling an instance of the likelihood. + # Beware, though, if you add new likelihoods, they should go to the + # folder likelihoods/yourlike/yourlike.py, and contain a yourlike.data, + # otherwise the following set of commands will not work anymore. + + # For the logging if log_flag is True, each likelihood will log its + # parameters + + # Due to problems in relative import, this line must be there. Until a + # better solution is found. It adds the root folder of the MontePython + # used as the first element in the sys.path + sys.path.insert(0, self.path['root']) + + for elem in experiments: + folder = os.path.abspath(os.path.join( + self.path['MontePython'], "likelihoods", "%s" % elem)) + # add the folder of the likelihood to the path of libraries to... + # ... import easily the likelihood.py program + try: + exec("from likelihoods.%s import %s" % ( + elem, elem)) + except ImportError as message: + raise io_mp.ConfigurationError( + "Trying to import the %s likelihood" % elem + + " as asked in the parameter file, and failed." + " Please make sure it is in the `montepython/" + "likelihoods` folder, and is a proper python " + "module. Check also that the name of the class" + " defined in the __init__.py matches the name " + "of the folder. In case this is not enough, " + "here is the original message: %s\n" % message) + # Initialize the likelihoods. Depending on the values of + # command_line and log_flag, the routine will call slightly + # different things. If log_flag is True, the log.param will be + # appended. + try: + exec("self.lkl['%s'] = %s('%s/%s.data',\ + self, self.command_line)" % ( + elem, elem, folder, elem)) + except KeyError as e: + if e.find('clik') != -1: + raise io_mp.ConfigurationError( + "You should provide a 'clik' entry in the dictionary " + "path defined in the file default.conf") + else: + raise io_mp.ConfigurationError( + "The following key: '%s' was not found" % e) + + def read_file(self, param, structure, field='', separate=False): + """ + Execute all lines concerning the Data class from a parameter file + + All lines starting with `data.` will be replaced by `self.`, so the + current instance of the class will contain all the information. + + .. note:: + + A rstrip() was added at the end, because of an incomprehensible bug + on some systems that imagined some inexistent characters at the end + of the line... Now should work + + .. note:: + + A security should be added to protect from obvious attacks. + + Parameters + ---------- + param : str + Name of the parameter file + structure : str + Name of the class entries we want to execute (mainly, data, or any + other likelihood) + + Keyword Arguments + ----------------- + field : str + If nothing is specified, this routine will execute all the lines + corresponding to the `structure` parameters. If you specify a + specific field, like `path`, only this field will be read and + executed. + separate : bool + If this flag is set to True, a container class will be created for + the structure field, so instead of appending to the namespace of + the data instance, it will append to a sub-namespace named in the + same way that the desired structure. This is used to extract custom + values from the likelihoods, allowing to specify values for the + likelihood directly in the parameter file. + + """ + if separate: + exec("self.%s = Container()" % structure) + with open(param, 'r') as param_file: + for line in param_file: + if line.find('#') == -1 and line: + lhs = line.split('=')[0] + if lhs.find(structure+'.') != -1: + if field: + # If field is not an empty string, you want to skip + # the execution of the line (exec statement) if you + # do not find the exact searched field + if lhs.find('.'.join([structure, field])) == -1: + continue + if not separate: + exec(line.replace(structure+'.', 'self.').rstrip()) + else: + exec(line.replace( + structure+'.', 'self.'+structure+'.').rstrip()) + + def group_parameters_in_blocks(self): + """ + Regroup mcmc parameters by blocks of same speed + + This method divides all varying parameters from :attr:`mcmc_parameters` + into as many categories as there are likelihoods, plus one (the slow + block of cosmological parameters). + + It creates the attribute :attr:`block_parameters`, to be used in the + module :mod:`mcmc`. + + .. note:: + + It does not compute by any mean the real speed of each parameter, + instead, every parameter belonging to the same likelihood will + be considered as fast as its neighbour. + + .. warning:: + + It assumes that the nuisance parameters are already written + sequentially, and grouped together (not necessarily in the order + described in :attr:`experiments`). If you mix up the different + nuisance parameters in the .param file, this routine will not + method as intended. It also assumes that the cosmological + parameters are written at the beginning of the file. + + """ + array = [] + # First obvious block is all cosmological parameters + array.append(len(self.get_mcmc_parameters(['varying', 'cosmo']))) + # Then, store all nuisance parameters + nuisance = self.get_mcmc_parameters(['varying', 'nuisance']) + + # Create an array to keep track of the already taken into account + # nuisance parameters. This will come in handy when using likelihoods + # that share some nuisance parameters. + used_nuisance = [] + for likelihood in dictvalues(self.lkl): + count = 0 + for elem in nuisance: + if elem in likelihood.nuisance: + if elem not in used_nuisance: + count += 1 + used_nuisance.append(elem) + likelihood.varying_nuisance_parameters = count + + # Then circle through them + index = 0 + while index < len(nuisance): + elem = nuisance[index] + flag = False + # For each one, check if they belong to a likelihood + for likelihood in dictvalues(self.lkl): + if (elem in likelihood.nuisance) and (index < len(nuisance)): + # If yes, store the number of nuisance parameters needed + # for this likelihood. + flag = True + array.append( + likelihood.varying_nuisance_parameters+array[-1]) + index += likelihood.varying_nuisance_parameters + continue + if not flag: + # If the loop reaches this part, it means this nuisance + # parameter was associated with no likelihood: this should not + # happen + raise io_mp.ConfigurationError( + "nuisance parameter %s " % elem + + "is associated to no likelihood") + # Store the result + self.block_parameters = array + + # Setting a default value for the over_sampling array + if not self.over_sampling: + self.over_sampling = [1 for _ in range(len(self.block_parameters))] + # Test that the over_sampling list has the same size as + # block_parameters. + else: + try: + assert len(self.block_parameters) == len(self.over_sampling) + except AssertionError: + raise io_mp.ConfigurationError( + "The length of the over_sampling field should be" + " equal to the number of blocks (one for cosmological " + "parameters, plus one for each likelihood with " + "nuisance parameters)") + + # Create a list of indices corresponding of the oversampling strategy + self.assign_over_sampling_indices() + + def assign_over_sampling_indices(self): + """ + Create the list of varied parameters given the oversampling + """ + self.over_sampling_indices = [] + for index in range(len(self.get_mcmc_parameters(['varying']))): + if index == 0: + self.over_sampling_indices.append(index) + else: + block_index = self.block_parameters.index( + [i for i in self.block_parameters if index < i][0]) + for _ in range(self.over_sampling[block_index]): + self.over_sampling_indices.append(index) + + def read_version(self, param_file): + """ + Extract version and subversion from an existing log.param + """ + # Read the first line (cosmological code version) + first_line = param_file.readline() + param_file.seek(0) + regexp = re.match( + ".*\(branch: (.*), hash: (.*)\).*", + first_line) + version = first_line.split()[1] + git_branch, git_version = regexp.groups() + return version, git_version, git_branch + + def get_mcmc_parameters(self, table_of_strings): + """ + Returns an ordered array of parameter names filtered by + `table_of_strings`. + + Parameters + ---------- + table_of_strings : list + List of strings whose role and status must be matched by a + parameter. For instance, + + >>> data.get_mcmc_parameters(['varying']) + ['omega_b', 'h', 'amplitude', 'other'] + + will return a list of all the varying parameters, both + cosmological and nuisance ones (derived parameters being `fixed`, + they wont be part of this list). Instead, + + >>> data.get_mcmc_parameters(['nuisance', 'varying']) + ['amplitude', 'other'] + + will only return the nuisance parameters that are being varied. + + """ + table = [] + for key, value in dictitems(self.mcmc_parameters): + number = 0 + for subvalue in dictvalues(value): + for string in table_of_strings: + if subvalue == string: + number += 1 + if number == len(table_of_strings): + table.append(key) + return table + + def check_for_slow_step(self, new_step): + """ + Check whether the value of cosmological parameters were + changed, and if no, skip computation of the cosmology. + + """ + parameter_names = self.get_mcmc_parameters(['varying']) + cosmo_names = self.get_mcmc_parameters(['cosmo']) + + need_change = 0 + + # For all elements in the varying parameters: + for elem in parameter_names: + i = parameter_names.index(elem) + # If it is a cosmological parameter + if elem in cosmo_names: + if self.mcmc_parameters[elem]['current'] != new_step[i]: + need_change += 1 + + # If any cosmological value was changed, + if need_change > 0: + self.need_cosmo_update = True + else: + self.need_cosmo_update = False + + for likelihood in dictvalues(self.lkl): + # If the cosmology changed, you need to recompute the likelihood + # anyway + if self.need_cosmo_update: + likelihood.need_update = True + continue + # Otherwise, check if the nuisance parameters of this likelihood + # were changed + need_change = 0 + for elem in parameter_names: + i = parameter_names.index(elem) + if elem in likelihood.nuisance: + if self.mcmc_parameters[elem]['current'] != new_step[i]: + need_change += 1 + if need_change > 0: + likelihood.need_update = True + else: + likelihood.need_update = False + + def update_cosmo_arguments(self): + """ + Put in :attr:`cosmo_arguments` the current values of + :attr:`mcmc_parameters` + + This method is called at every step in the Markov chain, to update the + dictionary. In the Markov chain, the scale is not remembered, so one + has to apply it before giving it to the cosmological code. + + .. note:: + + When you want to define new parameters in the Markov chain that do + not have a one to one correspondance to a cosmological name, you + can redefine its behaviour here. You will find in the source + several such examples. + + .. note:: + + For complex CLASS parameters, that expect a string of numbers + separated with commas, you can now use the name of the argument, + for instance :code:`m_ncdm`, then append a double underscore and a + number. So if you run with two cosmological parameters, + :code:`m_ncdm__1` and :code:`m_ncdm__2`, this function will + automatically concatenate the two and feed class :code:`m_ncdm`. + You still have to make sure that the other variables are properly + set, like :code:`N_ncdm` to 2, in this example. + + """ + # For all elements in any cosmological parameters + for elem in self.get_mcmc_parameters(['cosmo']): + # Fill in the dictionnary with the current value of parameters + self.cosmo_arguments[elem] = \ + self.mcmc_parameters[elem]['current'] *\ + self.mcmc_parameters[elem]['scale'] + + # For all elements in the cosmological parameters from the mcmc list, + # translate any-one that is not directly a CLASS parameter into one. + # The try: except: syntax ensures that the first call + for elem in self.get_mcmc_parameters(['cosmo']): + # infer h from Omega_Lambda and delete Omega_Lambda + if elem == 'Omega_Lambda': + omega_b = self.cosmo_arguments['omega_b'] + omega_cdm = self.cosmo_arguments['omega_cdm'] + Omega_Lambda = self.cosmo_arguments['Omega_Lambda'] + self.cosmo_arguments['h'] = math.sqrt( + (omega_b+omega_cdm) / (1.-Omega_Lambda)) + del self.cosmo_arguments[elem] + # infer omega_cdm from Omega_L and delete Omega_L + elif elem == 'Omega_L': + omega_b = self.cosmo_arguments['omega_b'] + h = self.cosmo_arguments['h'] + Omega_L = self.cosmo_arguments['Omega_L'] + self.cosmo_arguments['omega_cdm'] = (1.-Omega_L)*h*h-omega_b + del self.cosmo_arguments[elem] + # infer omega_cdm from omega_m (assuming one standard massive neutrino and omega_nu=m_nu/93.14) and delete omega_m + elif elem == 'omega_m': + omega_b = self.cosmo_arguments['omega_b'] + omega_m = self.cosmo_arguments['omega_m'] + try: + omega_nu = self.cosmo_arguments['m_ncdm'] / 93.14 + except: + omega_nu = 0. + self.cosmo_arguments['omega_cdm'] = omega_m - omega_b - omega_nu + del self.cosmo_arguments[elem] + + elif elem == 'log10z': + self.cosmo_arguments['z_decay_NEDE'] = 10**self.cosmo_arguments[elem] + del self.cosmo_arguments[elem] + + elif elem == 'ln10^{10}A_s': + self.cosmo_arguments['A_s'] = math.exp( + self.cosmo_arguments[elem]) / 1.e10 + del self.cosmo_arguments[elem] + + elif elem == 'exp_m_2_tau_As': + tau_reio = self.cosmo_arguments['tau_reio'] + self.cosmo_arguments['A_s'] = self.cosmo_arguments[elem] * \ + math.exp(2.*tau_reio) + del self.cosmo_arguments[elem] + elif elem == 'f_cdi': + self.cosmo_arguments['n_cdi'] = self.cosmo_arguments['n_s'] + elif elem == 'beta': + self.cosmo_arguments['alpha'] = 2.*self.cosmo_arguments['beta'] + elif elem == 'M_tot_NH' or elem == '{\sum}m_nu_NH': + # By T. Brinckmann + # Normal hierarchy massive neutrinos. Calculates the individual + # neutrino masses from M_tot_NH and deletes M_tot_NH + if not self.cosmo_arguments['N_ncdm'] == 3: + raise ValueError( + "N_ncdm is not equal to 3." + " This value should be exactly 3.") + # From Esteban et al. 2016: https://arxiv.org/abs/1611.01514 + delta_m_squared_atm=2.524e-3 #2.45e-3 + delta_m_squared_sol=7.50e-5 #7.50e-5 + #m1_func = lambda m1, M_tot, d_m_sq_atm, d_m_sq_sol: M_tot**2. + 0.5*d_m_sq_sol - d_m_sq_atm + m1**2. - 2.*M_tot*m1 - 2.*M_tot*(d_m_sq_sol+m1**2.)**0.5 + 2.*m1*(d_m_sq_sol+m1**2.)**0.5 + m1_func = lambda m1, M_tot, d_m_sq_atm, d_m_sq_sol: M_tot - m1 - (d_m_sq_sol + m1**2.)**0.5 - (d_m_sq_atm + m1**2.)**0.5 + m1,opt_output,success,output_message = fsolve(m1_func,self.cosmo_arguments[elem]/3.,(self.cosmo_arguments[elem],delta_m_squared_atm,delta_m_squared_sol),full_output=True) + if not success == 1: + raise ValueError( + "Failed to estimate m1. Reason: "+output_message+ + " Exiting run.") + m1 = m1[0] + m2 = (delta_m_squared_sol + m1**2.)**0.5 + #m3 = (delta_m_squared_atm + 0.5*(m2**2. + m1**2.))**0.5 + m3 = (delta_m_squared_atm + m1**2.)**0.5 + if m1+m2+m3 > self.cosmo_arguments[elem]+0.001*self.cosmo_arguments[elem]: + raise ValueError( + "Failed to estimate m1 resulting in sum(m_i) > M_tot." + " Exiting run.") + self.cosmo_arguments['m_ncdm'] = r'%g, %g, %g' % (m1,m2,m3) + del self.cosmo_arguments[elem] + elif elem == 'M_tot_IH'or elem == '{\sum}m_nu_IH': + # By T. Brinckmann + # Inverted hierarchy massive neutrinos. Calculates the individual + # neutrino masses from M_tot_IH and deletes M_tot_IH + if not self.cosmo_arguments['N_ncdm'] == 3: + raise ValueError( + "N_ncdm is not equal to 3." + " This value should be exactly 3.") + # From Esteban et al. 2016: https://arxiv.org/abs/1611.01514 + delta_m_squared_atm=-2.514e-3 #-2.45e-3 + delta_m_squared_sol=7.50e-5 #7.50e-5 + #m1_func = lambda m1, M_tot, d_m_sq_atm, d_m_sq_sol: M_tot**2. + 0.5*d_m_sq_sol - d_m_sq_atm + m1**2. - 2.*M_tot*m1 - 2.*M_tot*(d_m_sq_sol+m1**2.)**0.5 + 2.*m1*(d_m_sq_sol+m1**2.)**0.5 + m1_func = lambda m1, M_tot, d_m_sq_atm, d_m_sq_sol: M_tot - m1 - (d_m_sq_sol + m1**2.)**0.5 - (abs(d_m_sq_atm + d_m_sq_sol + m1**2.))**0.5 + m1,opt_output,success,output_message = fsolve(m1_func,self.cosmo_arguments[elem]/2.,(self.cosmo_arguments[elem],delta_m_squared_atm,delta_m_squared_sol),full_output=True) + if not success == 1: + raise ValueError( + "Failed to estimate m1. Reason: "+output_message+ + " Exiting run.") + m1 = m1[0] + m2 = (delta_m_squared_sol + m1**2.)**0.5 + #m3 = (delta_m_squared_atm + 0.5*(m2**2. + m1**2.))**0.5 + m3 = (delta_m_squared_atm + m2**2.)**0.5 + if m1+m2+m3 > self.cosmo_arguments[elem]+0.001*self.cosmo_arguments[elem]: + raise ValueError( + "Failed to estimate m1 resulting in sum(m_i) > M_tot." + "Exiting run.") + if delta_m_squared_atm + delta_m_squared_sol + m1**2. < 0.: + raise ValueError( + "Failed to correctly estimate m1. Found m1^2 = %f < %f," + "but m1^2 should always be greater than this value." % (m1**2.,- delta_m_squared_sol - delta_m_squared_atm)) + self.cosmo_arguments['m_ncdm'] = r'%g, %g, %g' % (m1,m2,m3) + del self.cosmo_arguments[elem] + elif elem == 'M_tot' or elem == '{\sum}m_nu': + # By T. Brinckmann + # Massive neutrinos with identical non-zero mass. Calculates the + # individual neutrino masses from M_tot and deletes M_tot + if not self.cosmo_arguments['N_ncdm'] == 1: + raise ValueError( + "N_ncdm is not equal to 1." + " This value should be exactly 1.") + self.cosmo_arguments['m_ncdm'] = self.cosmo_arguments[elem]/self.cosmo_arguments['deg_ncdm'] + del self.cosmo_arguments[elem] + elif elem == 'm_s_eff': + # By T. Brinckmann + # conversion from effective sterile neutrino mass to physical sterile neutrino mass, assuming that this + # is the ncdm species number 2 and that it is Dodelson-Widrow like (i.e same temperature as active neutrinos) + #print self.cosmo_arguments + #self.cosmo_arguments['m_ncdm__2'] = self.cosmo_arguments['deg_ncdm__2']*self.cosmo_arguments[elem] + m_s_eff = self.cosmo_arguments[elem]/self.cosmo_arguments['deg_ncdm__2'] + self.cosmo_arguments['m_ncdm'] = r'%g, %g' % (float(self.cosmo_arguments['m_ncdm']), m_s_eff) + del self.cosmo_arguments[elem] + elif elem == 'log10N_dg': + self.cosmo_arguments['N_dg'] = 10**(self.cosmo_arguments[elem]) + del self.cosmo_arguments[elem] + elif elem == 'log10fn': + self.cosmo_arguments['f_nadm'] = 10**(self.cosmo_arguments[elem]) + del self.cosmo_arguments[elem] + elif elem == 'log10Gamma': + self.cosmo_arguments['invtau0_nadm_dg'] = 10**(self.cosmo_arguments[elem]) + del self.cosmo_arguments[elem] + elif elem == 'w0wa': + self.cosmo_arguments['wa_fld'] = self.cosmo_arguments[elem] - self.cosmo_arguments['w0_fld'] + del self.cosmo_arguments[elem] + + # Finally, deal with all the parameters ending with __i, where i is + # an integer. Replace them all with their name without the trailing + # double underscore, concatenated with each other. The test is + # always on the one ending with __1, as it will be the first on the + # list, and deal with all the others. + elif re.search(r'__1', elem): + original_name = re.search(r'(.*)__1', elem).groups()[0] + # Recover the values of all the other elements + values = [self.cosmo_arguments[elem]] + for other_elem in self.get_mcmc_parameters(['cosmo']): + match = re.search(r'%s__([2-9])' % original_name, + other_elem) + if match: + values.append(self.cosmo_arguments[other_elem]) + # create the cosmo_argument + self.cosmo_arguments[original_name] = ', '.join( + ['%g' % value for value in values]) + # Delete the now obsolete entries of the dictionary + for index in range(1, len(values)+1): + del self.cosmo_arguments[ + original_name + '__%i' % index] + @staticmethod + def folder_is_initialised(folder): + """ + Static method to call for checking if a folder was already initialised + + This method can be used to speed up the mpi initialisation in + :mod:`run`. If a process finds that the folder is already a proper + Monte Python one, it sends directly a 'go' signal to its next in line. + + .. warning:: + + This method assumes that the last lines of the log.param are the + path indication. If this would ever change, adjust this method + accordingly. + + """ + # If the folder is not there, easy answer: False! + if not os.path.isdir(folder): + return False + # Recover the log.param from the folder, and assert it exists + log_param_path = os.path.join(folder, 'log.param') + if not os.path.isfile(log_param_path): + return False + # Quickly load it to a string, and assert that the path has been + # written (which are the last lines) + with open(log_param_path, 'r') as log_param: + text = log_param.readlines() + if text[-1].find('path[') != -1: + return True + else: + return False + + def __cmp__(self, other): + """ + Redefinition of the 'compare' method for two instances of this class. + + It will decide which basic operations to perform when the code asked if + two instances are the same (in case you want to launch a new chain in + an existing folder, with your own parameter file) Comparing + cosmological code versions (warning only, will not fail the comparison) + + """ + if self.version != other.version: + warnings.warn( + "You are running with a different version of your " + + "cosmological code") + + # Defines unordered version of the dictionaries of parameters + self.uo_parameters = {} + other.uo_parameters = {} + + # Check if all the experiments are tested again, + if len(list(set(other.experiments).symmetric_difference( + set(self.experiments)))) == 0: + # Check that they have been called with the same .data file, stored + # in dictionary when initializing. + for experiment in self.experiments: + for elem in self.lkl[experiment].dictionary: + if self.lkl[experiment].dictionary[elem] != \ + other.lkl[experiment].dictionary[elem]: + sys.stdout.write('in your parameter file: ') + print(self.lkl[experiment].dictionary) + sys.stdout.write('in log.param: ') + print(other.lkl[experiment].dictionary) + return -1 + # Fill in the unordered version of dictionaries + for key, elem in dictitems(self.mcmc_parameters): + self.uo_parameters[key] = elem['initial'] + for key, elem in dictitems(other.mcmc_parameters): + other.uo_parameters[key] = elem['initial'] + + # And finally compare them (standard comparison between + # dictionnaries, will return True if both have the same keys and + # values associated to them. + return cmp(self.uo_parameters, other.uo_parameters) + else: + return -1 + + def __call__(self, ctx): + """ + Interface layer with CosmoHammer + + Store quantities to a the context, to be accessed by the Cosmo Module + and each of the likelihoods. + + Parameters + ---------- + ctx : context + Contains several dictionaries storing data and cosmological + information + + """ + # Recover the cosmological parameter value from the context + parameters = ctx.getParams() + + # Storing them as current points + for index, elem in enumerate(self.get_mcmc_parameters(["varying"])): + self.mcmc_parameters[elem]['current'] = parameters[index] + + # Propagating this to the cosmo_arguments dictionary + self.update_cosmo_arguments() + + # Store itself into the context + ctx.add('data', self) + + +class Parameter(dict): + """ + Store all important fields, and define a few convenience methods + + """ + def __init__(self, array, key): + """ + This class replaces the old function defined in the Data class, called + `from_input_to_mcmc_parameters`. The traduction is now done inside the + Parameter class, which interprets the array given as an input inside + the parameter file, and returns a dictionary having all relevant fields + initialized. + + .. warning:: + + This used to be an ordered dictionary, for no evident reason. It is + now reverted back to an ordinary dictionary. If this broke + anything, it will be reverted back + + At the end of this initialization, every field but one is filled for + the specified parameter, be it fixed or varying. The missing field is + the 'last_accepted' one, that will be filled in the module :mod:`mcmc`. + + .. note:: + + The syntax of the parameter files is defined here - if one + wants to change it, one should report the changes in there. + + The other fields are + + Attributes + ---------- + initial : array + Initial array of input values defined in the parameter file. + Contains (in this order) `mean`, `minimum`, `maximum`, `1-sigma`. + If the min/max values (**TO CHECK** proposal density boundaries) + are unimportant/unconstrained, use `None` or `-1` (without a period + !) + scale : float + 5th entry of the initial array in the parameter file, defines the + factor with which to multiply the values defined in `initial` to + give the real value. + role : str + 6th entry of the initial array, can be `cosmo`, `nuisance` or + `derived`. A `derived` parameter will not be considered as varying, + but will be instead recovered from the cosmological code for each + point in the parameter space. + prior : :class:`Prior ` + defined through the optional 7th entry of the initial array, can be + ommited or set to `flat` (same), or set to `gaussian`. An instance + of the :class:`prior` defined in :mod:`prior` will be initialized + and set to this value. + tex_name : str + A tentative tex version of the name, provided by the function + :func:`io_mp.get_tex_name`. + status : str + Depending on the `1-sigma` value in the initial array, it will be + set to `fixed` or `varying` (resp. zero and non-zero) + current : float + Stores the value at the current point in parameter space (`not + allowed initially`) + + Parameters + ---------- + value : list + Array read from the parameter file + key : str + Name of the parameter + + """ + # calling the parent method initialization + dict.__init__(self) + + self['initial'] = array[0:4] + self['scale'] = array[4] + self['role'] = array[-1] + self['tex_name'] = io_mp.get_tex_name(key) + if array[3] == 0: + self['status'] = 'fixed' + self['current'] = array[0] + else: + self['status'] = 'varying' + self['prior'] = prior.Prior(array) + + +class Container(object): + """Dummy class to act as a namespace for data""" + pass + + +if __name__ == "__main__": + import doctest + import shutil + from initialise import initialise + folder = os.path.join('tests', 'doc') + cosmo, data, command_line, _ = initialise('-o %s -p test.param' % folder) + doctest.testmod(extraglobs={'data': data}) + shutil.rmtree(folder) diff --git a/notebooks/NEDE.ipynb b/notebooks/NEDE.ipynb new file mode 100644 index 000000000..a44fd7927 --- /dev/null +++ b/notebooks/NEDE.ipynb @@ -0,0 +1,288 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "a646b77d", + "metadata": {}, + "source": [ + "# Example of how to run the v7.0 CLASS implementation of Cold New Early Dark Energy" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "ca18bca5-9b0a-4e7c-92a9-34ae0c703a35", + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "from time import perf_counter\n", + "from scipy.interpolate import interp1d\n", + "def interp_onto(xdata, ydata, new_xdata):\n", + " return interp1d(xdata, ydata, fill_value=\"extrapolate\")(new_xdata)\n", + "def get_spectrum(class_instance, lensing=True):\n", + " if lensing:\n", + " cls = class_instance.lensed_cl(2500)\n", + " else:\n", + " cls = class_instance.raw_cl(2500)\n", + " ll = cls['ell'][2:]\n", + " clTT = cls['tt'][2:]\n", + " cl = clTT*ll*(ll+1)/2./np.pi\n", + " return ll, cl\n", + "\n", + "from classy import Class" + ] + }, + { + "cell_type": "markdown", + "id": "c321b3ad", + "metadata": {}, + "source": [ + "#### $\\Lambda$ CDM run to compare with" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "11dcd949-a357-47e2-bc21-95a53aa74ab9", + "metadata": {}, + "outputs": [], + "source": [ + "k_max = 1.0\n", + "kk = np.logspace(-4,np.log10(k_max),1000) # k in h/Mpc\n", + "k_plot = 0.2\n", + "\n", + "LCDM_settings = {\n", + " 'output' : 'tCl, lCl, mPk',\n", + " 'lensing' : 'yes',\n", + " 'P_k_max_1/Mpc' : k_max,\n", + " 'k_output_values' : k_plot,\n", + " 'omega_b' : 0.02238280,\n", + " 'omega_cdm' : 0.1201075,\n", + " 'tau_reio' : 0.05430842,\n", + " 'n_s' : 0.9660499,\n", + " 'A_s' : 2.100549e-09,\n", + " 'h' : 0.67,\n", + " 'N_eff' : 2.038,\n", + " 'YHe' : 0.2454006,\n", + " 'N_ncdm': 1,\n", + " 'm_ncdm': 0.06,\n", + "}\n", + "LCDM = Class()\n", + "LCDM.set(LCDM_settings)\n", + "LCDM.compute()\n", + "ll_lcdm, cl_lcdm = get_spectrum(LCDM)\n", + "pk_lcdm = np.array([k**(3/2)*LCDM.pk(k*LCDM.h(), 0.)*LCDM.h()**3 for k in kk])" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "0c01511e", + "metadata": {}, + "outputs": [], + "source": [ + "NEDE_settings = {\n", + " 'f_NEDE': 0.23612917, \n", + " 'z_decay_NEDE': 10**3.6134105, \n", + " 'three_eos_NEDE': 1.959447, \n", + " 'Junction_tag': 1,\n", + " 'H_over_m_NEDE': 0.2,\n", + " 'Omega0_NEDE_trigger_DM': 0.3,\n", + " 'NEDE_trigger_fluid_H_m': 0.01,\n", + " 'NEDE_ceff_nature': 'tracking',\n", + " 'sub_dom_cond':1e-6,\n", + " 'start_small_k_at_tau_c_over_tau_h':0.0000001\n", + "}\n", + "\n", + "# These are the recommended precision settings, for which v7.0 has been verified to match older versions\n", + "precision_settings = {\n", + " # No longer uses these old settings from TriggerCLASS versions < 7.0!\n", + " # 'decay_res_enhancement': 100,\n", + " # 'trigger_resolution': 0.005,\n", + "\n", + " 'tol_background_integration': 1e-10, # default\n", + " 'background_integration_stepsize': 1e-3, # ignored when using ndf15\n", + "\n", + " 'tol_perturbations_integration': 1.0e-8,\n", + " 'perturbations_integration_stepsize': 0.5,\n", + " 'perturbations_sampling_stepsize': 0.003,\n", + "\n", + " 'tol_shooting_deltax_rel': 1e-8,\n", + " 'tol_shooting_deltax': 1e-8,\n", + " 'tol_shooting_deltaF': 1e-8,\n", + " \n", + " 'background_evolver': 1, # ndf15 for background, alternatively, use 2 for rkdp45\n", + " 'evolver': 1, \n", + " 'plot_gauge': 'synchronous' # species which gauge to plot quantities in (WARNING: Not tested for Newtonian gauge)\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "809a58af", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Ran version 7.0 w. perts in 50.9 s\n" + ] + } + ], + "source": [ + "v7 = Class()\n", + "v7.set(LCDM_settings | NEDE_settings | precision_settings)\n", + "tic = perf_counter()\n", + "v7.compute()\n", + "toc = perf_counter()\n", + "print(f\"Ran version 7.0 w. perts in {toc - tic:.3} s\")" + ] + }, + { + "cell_type": "markdown", + "id": "4b2d9b83-2b50-41d6-bdf2-2ed5ab2d8c4c", + "metadata": {}, + "source": [ + "# 1: CMB Plot" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "f1b2131a-3b08-4bff-900f-1330dfa2a14e", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "ll_v7, cl_v7 = get_spectrum(v7)\n", + "\n", + "fig, ax = plt.subplots(2,1, figsize=[6, 4])\n", + "ax[0].set_xscale('log')\n", + "ax[0].set_yscale('linear')\n", + "ax[0].set_xlim(2,2500)\n", + "ax[0].set_ylabel(r'$C_\\ell^{\\mathrm{TT}}$')\n", + "ax[0].plot(ll_lcdm, cl_lcdm, 'k-', label=r'$\\Lambda$CDM')\n", + "ax[0].plot(ll_v7, cl_v7, '-', label=f\"NEDE v7.0\")\n", + "ax[0].legend(frameon=False)\n", + "ax[1].set_ylabel(r'$\\Delta C_{\\ell}^{\\mathrm{TT}}/C_{\\ell,\\Lambda\\mathrm{CDM}}^{\\mathrm{TT}}$')\n", + "ax[1].set_xscale('log')\n", + "ax[1].set_yscale('linear')\n", + "ax[1].set_xlim(2,2500)\n", + "ax[1].plot(ll_lcdm, np.zeros(len(ll_lcdm)), 'k--', lw=0.8)\n", + "ax[1].plot(ll_v7, (cl_v7 - cl_lcdm)/cl_lcdm, '-', label=f\"NEDE v7.0\")\n", + "ax[1].legend(frameon=False)\n", + "fig.tight_layout()\n" + ] + }, + { + "cell_type": "markdown", + "id": "ae8eca43", + "metadata": {}, + "source": [ + "Crazy spectrum, but that's due to the chosen NEDE parameters." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "b753782c-bcec-485a-b00f-e03245f6cab8", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "pk_v7 = np.array([k**(3/2)*v7.pk(k*v7.h(), 0.)*v7.h()**3 for k in kk])\n", + "\n", + "fig, ax = plt.subplots(2,1, figsize=[6, 4])\n", + "ax[0].set_xscale('log')\n", + "ax[0].set_yscale('log')\n", + "ax[0].set_ylabel(r'$k^{3/2} P_k$ [Mpc$^3$/h$^3$]')\n", + "ax[0].plot(kk, pk_lcdm, 'k-', label=r'$\\Lambda$CDM')\n", + "ax[0].plot(kk, pk_v7, '-', label=f\"NEDE v7.0\")\n", + "ax[0].legend(frameon=False)\n", + "ax[1].set_ylabel(r'$\\Delta P_k/P_{k,\\Lambda\\mathrm{CDM}}$')\n", + "ax[1].set_xscale('log')\n", + "ax[1].set_yscale('linear')\n", + "ax[1].plot(kk, (pk_v7 - pk_lcdm)/pk_lcdm, '-', label=f\"NEDE v7.0\")\n", + "ax[1].plot(kk, np.zeros(len(kk)), 'k--', lw=0.8)\n", + "ax[1].legend(frameon=False)\n", + "fig.subplots_adjust(hspace=0.)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "c5c2bee9-0ead-427e-a8af-04190ad6b944", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAi0AAAFhCAYAAAC8m5r4AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/av/WaAAAACXBIWXMAAA9hAAAPYQGoP6dpAABubElEQVR4nO3deViU5frA8e/MAMMOAgKCCriLG4iaprnlEqm5lqVHzeW06MnUrJNbuWtZZh3T7KepZZlpWVmmqWlaljuUuSuCGyKgbMo28/7+GBgY2ddh8P5c11zOvO/zPu89ozI3z6pSFEVBCCGEEKKKU5s7ACGEEEKI4pCkRQghhBAWQZIWIYQQQlgESVqEEEIIYREkaRFCCCGERZCkRQghhBAWQZIWIYQQQlgESVqEEEIIYREkaRFCCCGERZCkRVisdevWoVKpsLW1JTIyMs/5rl270rx5c5Nj/v7+qFSqfB9du3bNU3f2w9bWFm9vb7p168aiRYuIiYnJc7/Zs2cXWLdKpeLy5cvl/RGU2t27d5k9ezb79u2rkPovX76MSqXinXfeKbc6r1+/zuzZswkLC8tzLvuzt3QLFy7k22+/LVbZiviM75ecnMykSZPw8fHB1taWoKAgvvzyy2Jd+8033/DMM8/QoEED7Ozs8Pf3Z/jw4Zw/f77Aaz744APc3d3JzMxk3759xv8769aty7d89+7dUalU+Pv7l+LdCUtkZe4AhCirtLQ0Zs6cyWeffVas8h07dsz3B72zs3OeY2vXrqVJkyZkZGQQExPDb7/9xltvvcU777zDpk2b6NGjR55rduzYgYuLS57jtWrVKlZ8leHu3bvMmTMHwCRZq8quX7/OnDlz8Pf3JygoyOTcuHHjeOyxx8wTWDlauHAhQ4YMYcCAAeYOBYBBgwZx5MgRFi9eTKNGjfjiiy945pln0Ov1DBs2rNBr33rrLby9vZkxYwb16tXjypUrLFy4kNatW/Pnn3/SrFmzPNd8/fXX9O/fHyurnK8mJycn1qxZw7PPPmtSNiIign379uX7/1ZUX5K0CIv32GOP8cUXXzB16lRatWpVZHlXV1fat29frLqbN29OmzZtjK8HDx7M5MmT6dSpE4MGDeL8+fN4eXmZXBMSEoKHh0fJ3kQlURSF1NRUi62/ILVr16Z27dqVft/qbPv27ezatcuYqAB069aNyMhIXn31VYYOHYpGoynw+m3btuHp6WlyrHv37vj7+/Pee++xevVqk3M3b97kt99+47XXXjM5PnToUFavXs358+dp2LCh8fgnn3yCr68vLVq04NSpU2V9u8JCSPeQsHivvfYa7u7u/Pe//62U+9WtW5d3332XpKQkVq1aVW71+vv707dvX7Zu3UrLli2xtbWlXr16fPDBB3nKJiYmMnXqVAICArCxscHX15dJkyaRkpJiUk6lUvGf//yHjz76iKZNm6LValm/fj01a9YEYM6cOcYm+OzfZJ999tl8m9vz64IpqP5ser2eBQsWULduXWxtbWnTpg179uwxqePChQuMHj2ahg0bYm9vj6+vL/369ePvv/82ltm3bx9t27YFYPTo0caYZ8+eXWBser2et99+myZNmqDVavH09GTkyJFcvXrVpFx2N+KRI0d45JFHsLe3p169eixevBi9Xm9S3/z582ncuDF2dna4urrSsmVL3n///TyfVW6pqam88sorBAUF4eLigpubGx06dOC7777L81mmpKSwfv36fLssiyMjI4NRo0bh6OjIDz/8UKJr77d161YcHR158sknTY6PHj2a69evc+jQoUKvvz9hAfDx8aF27dpcuXKlwPvd33rZs2dP6tSpwyeffGI8ptfrWb9+PaNGjUKtzvs1lv3vctWqVTRq1AitVktgYGC+XVvXrl3jueeeo06dOtjY2ODj48OQIUO4efNmoe9PmIe0tAiL5+TkxMyZM3n55Zf55Zdf6N69e6HlFUUhMzMzz3GNRlPscRGPP/44Go2G/fv35zmn0+ny1K9SqQr9rTRbWFgYkyZNYvbs2Xh7e/P555/z8ssvk56eztSpUwFD106XLl24evUq06dPp2XLlvzzzz+88cYb/P333+zevdvkfXz77bccOHCAN954A29vb9zc3NixYwePPfYYY8eOZdy4cQDGRKak7q8/95fV8uXL8fPzY9myZcYkIjQ0lF9//ZUOHToAhm4fd3d3Fi9eTM2aNYmPj2f9+vU89NBDnDhxgsaNG9O6dWvWrl3L6NGjmTlzJn369AEotHXlxRdf5OOPP+Y///kPffv25fLly8yaNYt9+/Zx/Phxk9aw6Ohohg8fziuvvMKbb77J1q1bmTZtGj4+PowcORKAt99+m9mzZzNz5kw6d+5MRkYGZ86c4c6dO4V+PmlpacTHxzN16lR8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J0+eLJfghDA7XSaEfQHL28D3LxkSFkcvCH0bJp6AtmMlYREPJH9/f1QqFSqVim+//bbAcj169EClUuVZMmPdunXG6wt73L9kRn7XabVaPD09adGiBaNGjWLDhg2kpqYWGNO+ffuKde/SrEtWEgXFEflWX+PDeCwyssT1b9++nR49euDm5oaDgwOtW7fmf//7H3q9vgLeTeUo1UDc559/Hj8/P/bu3cv58+fp378/Go2h//6HH37A3d293AMVolLpdXDyG/h1McRl7TDuUBM6TYY2Y8DazrzxCVGFzJ49m/79+5fqS16r1dKmTcGbg9aqVavI6xRFISEhgcuXL3Py5Ek+/fRTpkyZwsqVKxk8eHCh9+/YsWOJYy4vLi4u+d7/6OXbAGQm3ESXHIevry916tQpUd2LFy9m2rRpANSrVw9HR0fCw8OZOHEiu3fvZuvWragtcFZjiZMWLy8vY1at0+l4+eWXGTt2LI0aNSIlJYXTp08zf/788o5TiMqh18Opb2HfYog9azhm5wYdX4Z2/wYbB7OGJ0RVo9FoCA8P5+uvv2bIkCElvt7b25vffvutXK7T6XQcPnyYxYsX8/333zNkyBA++ugjnn/++QLrKc29y0twcHC+9/d//UcAoje8hi45juHDh5cowfjjjz+YPn06arWaDRs28MwzzwAQHh5O7969+f7771m6dClTp04tnzdSicqUZmk0GpYvX84vv/xC79696datG+vXrzdmd0JYDEWBU9/DRx1hy2hDwmLrCt1nwaS/oNMkSViEyEf2F+KcOXNQFMWssWg0Gjp06MB3333H9OnTAXjppZc4f/68WeMqjYw70aRdOwXAiBEjSnTt/PnzURSFcePGGf9+AFq1asXSpUsBQ0tMRkZG+QVcScqlbSg4OJi5c+fyv//9j3/961/lUaUQlUNR4OxPsKozfDUCYk6B1tmwzsqkvwwDbbVO5o5SiCprzJgx+Pv7c/LkSb766itzh2M0b948goODycjI4N13363Qey1fvhyVSkXfvn0LLBMfH4+NjQ3W1tbExcUVWWfKP3sBCAoKonnz5sWOJTExkd27dwMwduzYPOeffPJJnJ2diYuLY+/evcWut6ooUdISEBBAvXr1Svz44IMPKip+IUpHUeD8bvi/7rDxaYj+C2wcofOrhmSl6+tg62LuKIWo8qytrZkxYwZgaG2pKoM81Wo1zz33HAA//vhjhd5r6NChWFlZ8fPPP+c7QQVgy5YtZGRk0KtXr2KN+0w5tQ8oeSvLiRMnSE9Px9bWltatW+c5b21tTdu2bQE4dOhQiequCmTDRPFgURS4tA/2LoSrhw3HrO2h3XPw8ERwkEHkQpTUs88+y6JFizh9+jRffvklw4YNM3dIAHTq1AmAq1evEh0djbe3d4Xcp2bNmjz66KPs3LmTLVu2GJOl3DZu3AhQrM8m7fpZMuOvgUpd4s8yuyusbt26WFnl/xVfr1499uzZY5HdZrJhonhwXP7NkKxE/m54bWULbcdBx0ngWNOsoQnLoSgK9zJ05g6jVOysNRUyjdfKyopZs2YxevRo5s6dy9ChQ40zSosSGRlZaEwvv/wyy5YtK1VcuWfcxMTE5Ju0FHbv/v37FzqdO7dhw4axc+dONm7cmCdpuX79Ovv378fe3p7+/fsXWVfKP78AYOsfVOJE6/Ztw8yjwrbUyT6XXdaSyIaJovqL+hP2LoCI/YbXGhvDtOVOk8GpYn7zEtXXvQwdgW/sNHcYpXJqbm/sbSrmx/6IESNYuHAhZ8+e5fPPP2fkyJHFuq6oKc/16tUrdUwODjmD55OSkvItU9iU58DAwGLfa+DAgbzwwgvs37+f69ev4+PjYzy3adMm9Ho9/fr1w9HRsdB6MjIySDl9wBB/s27Fvn+27PVpbGwKXj9Kq9UChpXsLc0DmbQMHDiQffv28eijj7JlyxaTc1ZWVsZBT23atGH16tXmCFGUh6tHDS0rF/cYXqutofVIeOQVcPE1b2xCVDMajYZZs2YxcuRI5s2bx7BhwwrsnsittFOeiyM5Odn43NnZOd8y5XVvJycn+vbty+bNm9m0aROTJ082nsvuGso9k6cgO3bsQH8vEZWNHfaNOpQ4DltbWwDS09MLLJOWlgYYVrK3NA9k0jJx4kTGjBnD+vXr85xzdXUlLCys8oMS5ef6Cdi7CM5n/TastoKg4YaZQK51zRubsHh21hpOze1t7jBKxc66YjfxHDZsGAsWLODs2bN89tlnjB49ukLvV5SoqCjjc09Pzwq/37Bhw9i8eTMbN240Ji0XL17kyJEjuLq6Fmt7m88++wwA+0YPo7a2LXEMxen6KU4XUlX1QCYt3bp1Y9++feYOQ5S36L8Ni8Kd+cHwWqU2bGLY+VVwCzBvbKLaUKlUFdbFYuk0Gg1vvPEGw4cPZ968eSWe+VLesltR6tati5eXV4XfLzQ0FFdXV44cOcKFCxdo0KCBsZVl8ODBhXbZACQkJBg3IS5N1xBAw4YNAUPClpmZmW9r16VLl0zKWpIqt4bv/v376devHz4+PgXuabFixQoCAgKwtbUlJCSEAwcOlNv9ExMTCQkJoVOnTvz666/lVq+oQDGn4auR8FGnrIRFBS2egglHYMAKSViEqERPP/00gYGBRERElHrGaXnQ6/V8/PHHAPTp06dS7qnVahk0aBCQ0yVUkllDW7ZsITU1FY2jO7Z+LUsVQ3BwMNbW1qSmpnL8+PE85zMyMjhy5AgADz30UKnuYU5VLmlJSUmhVatWLF++PN/zmzZtYtKkScyYMYMTJ07wyCOPEBoaatIMGBISQvPmzfM8rl+/XuT9L1++zLFjx/joo48YOXIkiYmJ5fbeRDmLPQ9bxsKKDnDqO8OxZoNgwiEY/H/g0cC88QnxAFKr1bz55puAYWVWc626OmvWLMLDw7G2tuaVV16ptPtmJycbN24kPDycU6dOUatWLbp27VrktdldQw7NuqJSle7r2dnZmR49egCwZs2aPOc3b95MYmIi7u7uxYqpqqlybZyhoaGF9vstXbqUsWPHMm7cOACWLVvGzp07WblyJYsWLQLg2LFjpb5/9ojv5s2bExgYyLlz5/Id2Z6WlmYczARIclOZ4i7C/iXw1yZQshayatrPsIqtVzPzxiaE4Mknn2T+/Pn8/fffXL16tdLuq9frOXTokHHvIYCVK1dSv379SouhW7du1KpVi9OnT/P6668DhsXnito7KCoqiv37DTMci9M1NHXqVLZs2cKQIUN45513TM7NmDGDHTt2sHr1arp27Wqy99CUKVMAeO2114rsrqqKqlzSUpj09HSOHTtm/IeQrVevXhw8eLDM9d++fRt7e3u0Wi1Xr17l1KlTBU63W7RoEXPmzCnzPUUJ3L5sSFbCNoKStU5G48cNq9fWamXW0IQQOVQqFW+++SZDhgxBpyt8TZvo6GjjInAF2bFjR56pwrmvUxSFxMREIiMjjVOba9asyapVqxg4cGChdRd173Xr1tGgQfFbbdVqNUOHDmXZsmXs2LEDKN6soc8//xxFUQgKCuJ2Tf8iy8fGxhIZGUlsbGyecx07dmTevHnMnDmTYcOGMXPmTBwdHTl58iR6vZ4+ffpUautTebKopCU2NhadTpdnQJWXlxfR0dHFrqd3794cP36clJQUateuzdatW2nbti2nT5/m+eefR61Wo1KpeP/993Fzc8u3jmnTphkzVjC0tJR063BRTAlXYf87cOIz0GcajjXoCd2mgW+IeWMTQuRr0KBBBAUFFTkbMy0tjd9//73QMpmZmYVeZ21tjYuLC35+frRu3ZqePXvy5JNPGtcjKUxR9849bbq4hg0bZlwQr379+rRr167IazZs2AAY1rv5IKbEt8xjxowZtGrVivfee49jx44RHR1NixYtGD16NP/5z3+KvfhfVaNSzL0tZyFUKhVbt25lwIABgGFVQV9fXw4ePEiHDjnz1xcsWMBnn33GmTNnzBSpIWlxcXEhISGhwPUARAkl3oAD78Lx9aDLWnOgXjfoNh3qFP1DQIjS+r/9l1iw/TSDgn1ZOjTI3OGIB4z/6zl7JV1eXDmDiM2tuN+hFtXS4uHhgUajydOqEhMTUynT2UQlSboJvy+DI2tAlzVuyK+TIVnxL3j1SiGEENWbRSUtNjY2hISEsGvXLpN+yl27dhVrPwdRxaXEGpKVw6shM2t56TrtofsMCOhs1tCEEEKYX5VLWpKTk7lw4YLxdUREBGFhYbi5uVG3bl2mTJnCiBEjaNOmDR06dODjjz8mKiqKF154wYxRizK5Gw8H/weHVkFGiuGYbxtDy0r97lABG7wJIYSwPFUuaTl69CjduuVM98oe7Dpq1CjWrVvH0KFDiYuLY+7cudy4cYPmzZuzfft2/Pz8zBWyKK17d+DPFfDHCkjP2sysVhB0mwENe0qyIoQQwkSVS1q6du1KUWODx48fz/jx4yspIlHuUhPh0EdwcDmkJRiOeTU3tKw0flySFSGEEPmqckmLqMbSkuHwx3DwA7iXtZlXzSaGReGaPgFFLL4khBDiwSZJi6h46XfhyGrDINu7cYZj7g0Ni8I1Gwhqy1wvQAghROWSpEVUnIxUOLYWDiyFlKzVkmoEGJKVFk9KsiKEEKJEJGkR5S8zDY5/algYLumG4ZhrXejyX2j5NGjkn50QQoiSk28PUX4y0yHsc8OS+4lZm6Q514bOUyFoOFhZ3uZcQgghqg5JWkTZ6TIhfCPsfxvuRBmOOdWCR16B1iPBquj9P4QQQoiiSNIiSk+vg783w77FcDvCcMzBEx6ZAiHPgrWdWcMTQghRvUjSIkpOr4N/thqSlbjzhmP27tBxErQdBzb2Zg1PCCFE9SRJiyg+vR5OfQu/vgW3snbUtqsBD0+Eds+B1tGs4QkhhKjeJGkRRdPr4cw2Q8tKzCnDMVsX6PAfeOgFsC14G3EhhBCivEjSIgqmKHB2O+xdBDf/NhzTOkP78dD+RbBzNWt4QgjL5+/vT2RkJBEREfj7+5s7HFHFybrpIi9FgbM74OMu8OUwQ8Ji4wSdX4NJf0G3aZKwCPGAW7ZsGbNnz+bOnTvmDuWBM3v2bFQqVZGPgICAEtet1+v54IMPCA4OxsHBATc3N3r06MFPP/1UAe+k5KSlReRQFLiwG/YuhOvHDcesHaD9C4auIHs388YnhKgyli1bRmRkJM8++yyurq6lrqd+/frY2tpibW1dfsFVc3Xr1qVjx44Fng8PDyc5OZkOHTqUqF6dTkf//v358ccfUavVNG/enKSkJPbs2cOePXtYsmQJU6dOLWv4ZSJJizAkKxd/gX2L4OoRwzFre8Pg2ocngoO7eeMTQlRbe/bsMXcIFmfMmDGMGTMm33NJSUl4eXkBMGLEiBLVu2TJEn788Ue8vLzYuXMnrVq1AuCLL75gxIgRvPbaa3Tp0oW2bduW7Q2UgXQPPcgUBc7vgk8egw2DDAmLlR08/BK8/Bf0nCMJixBCWJAtW7Zw7949vLy86NmzZ7GvS09P5+233wbgvffeMyYsAMOGDWPs2LEoisL8+fPLPeaSkKTlQaTXwT/fwqrO8PkQuPInWNlC+wnwcjj0mg+ONc0dpRCiClq3bh0qlYrIyEgAAgICTMZR7Nu3D4B9+/ahUqno2rUrmZmZvP3227Ro0QJ7e3uTAbf+/v6oVCouX76c515JSUm89tpr+Pv7Y2trS0BAAP/9739JSUnh2WefRaVSsW7dujzXpaens3DhQho3boytrS2+vr688MIL3Lp1yzgeZPbs2fm+vzNnzjBmzBj8/f3RarW4u7vTp08ffvnll3zL545/7969hIaG4uHhYfJZFGTIkCGoVCreeeedAsts27YNlUpF69atC60r22effQbAM888g5VV8TtT9u7dy+3bt3F2dmbIkCF5zo8dOxaAnTt3kpSUVOx6y5t0Dz1IdBmGFWx/ew9izxmOWTtAm9GG1hUnb/PGJ4So8ry8vOjYsSNHjx4lLS2NNm3aoNXmbNXh4uJiUl5RFAYMGMCPP/5I/fr1CQwMJDU1tcj7JCYm0rVrV06cOIFaraZZs2bo9XqWLFnC3r17adCgQb7XZWZm8sQTT7Bz504AGjdujJ2dHWvWrGHnzp3069evwHt+9dVXjBgxgvT0dJycnAgMDCQ6Oprt27fz008/8f777/PSSy/le+3GjRuZOXMmLi4uNGjQADu7olcEHzZsGF9//TUbN24scKzIxo0bAUMSUpSrV6/y66+/AiXvGvrzzz8BaNeuXb7ji0JCQrC1tSU1NZWwsDAeeeSREtVfbhRRLhISEhRASUhIMHcoeaUmKsqfqxRlaXNFedPZ8FhUR1F+WaAoKXHmjk6IKufjXy8qfv/9QZn85Qlzh1Jl+fn5KYASERGR7/m9e/cqgKLRaBRPT0/l4MGDxnP37t0rsp4JEyYogFKvXj3l1KlTxuMnT55U/Pz8FGtrawVQ1q5da3LdkiVLFEBxc3NTfv/9d+PxqKgoJTg42Hjdm2++aXJdeHi4otVqFVtbW+Xjjz9WdDqd8dz333+vODs7KxqNRgkLC8v3c9BoNMqcOXOUjIwMRVEURa/XK6mpqQV+foqiKKmpqYqLi4sCKGfPns2p878/KH7//UGpM2WL4uDgoKhUKiUqKqrQuhRFURYvXqwASmBgYJFl7zd8+HAFUJ577rkCyzRs2FABlDVr1pS4/qIU9ztUuoeqs/gI2DEdlgbCT69CQhQ41IQec2DSSeg2XWYECVFSigLpKZb5UJRK/7h0Oh0rV640mclia2tb6DUJCQmsWbMGgE8//ZSmTZsazzVr1ox169aRkZGR5zq9Xs+yZcsA+OCDD3j44YeN5+rUqcNXX32FXq/P955z5swhLS2Nt956i3//+9+o1Tlfj/369WPBggXodDo++OCDfK9//PHHeeONN4xdMiqVyqQFKj9arZZBgwYBOS0qud07f4iUlBQ6depEnTp1Cq0LYMOGDUDJW1kAbt++DUCNGjUKLJN9LrusOTxw3UNXrlxhxIgRxMTEYGVlxaxZs3jyySeLPGcx0u/CmR8g7Au4tA/I+iHl3sCwem3wv2QjQyHKIuMuLPQxdxSlM/062DhU6i1dXFzo379/ia45cOAAqampNGzYMN+pvV27diUgIICIiAiT46dOneLatWs4ODjk+7O7QYMGPPLII3nGmqSnp7N9+3Y0Gg3PPvtsvjE98cQTvPTSS8bul/uNHDmyeG/uPsOGDWPt2rVs3LiRN9980+Rcyun9xjJFCQsL4+TJk6jVaoYPH17iOLK77GxsbAosk52E3bt3r8T1l5cHLmmxsrJi2bJlBAUFERMTQ+vWrXn88cdxcHAo9FyVptdD1EEI22jYGyg9Oedc/UcNq9fWfxTU0rAmhKhcDRs2RKPRlOia8+cNG7G2bNmywDItWrTIk7RkX9ekSZMCv3xbtmyZJ2k5d+4cqamp2NjY8Pjjj+d7nZLVSnXt2rV8z+duDSqJ7t274+3tzdmzZzlx4gTBwcEA6FOTuRdxDCsrq3wHxt4vewBu165di9Uqc7/s1q/09PQCy6SlpQEUa7xORXngkpZatWpRq1YtADw9PXFzcyM+Ph4HB4dCz1VJ8Zcg/EsI3wh3onKO1/CHVs9Ay6HgVvIVEYUQhbC2N7RYWCLryt+BvTQ/P1NSUgBwcnIqsEx+50p7XUJCAmD4wv79998Lja2gQcSl/Z5Qq9UMHTqU999/n40bNxqTlpSzB0GXSa/HH8fDw6PQOnQ6nbF7qTRdQ1C8rp/idCFVtCr3q/f+/fvp168fPj4+qFQqvv322zxlVqxYQUBAALa2toSEhHDgwIFS3evo0aPo9fp8s9LCzplVZhr8vQXW9YUPgg07Lt+JMiyzHzwCRv8EE8Og6+uSsAhREVQqQxeLJT5UKnN/esWSnQAkJycXWCa/abelvc7R0bBDva+vL4qiFPkob9kzg7788ktj/XdP/2pyrjB79uzhxo0b2NnZMXjw4FLF0LBhQwAuXbqU7/nMzEyioqJMyppDlWtpSUlJoVWrVowePTrfD3/Tpk1MmjSJFStW0LFjR1atWkVoaCinTp2ibt26gGFqVnYzVm4///wzPj6Gvui4uDhGjhzJ6tWr85Qr7JzZZKbBkTXw21JIuZV1UAX1u0GrYdCkD9hU/m9RQogHk6oCE6BGjRoB8NdffxVY5u+//y7wujNnzpCRkZHv1N38rmvYsCHW1tbcuHGD+Ph43Nwqd4LCQw89RP369bl48SK//fYbuuTbpEb9jcpKy4ABA4q8PrtraMCAAYW2MhUVA8Dhw4fz/eyOHTtGWloaNjY2BAUFleoe5aHKtbSEhoYyf/5844jq+y1dupSxY8cybtw4mjZtyrJly6hTpw4rV640ljl27BgnT57M88hOWNLS0hg4cCDTpk0zGV1e1Ln7yyUmJpo8KkzMafi4K+ycZkhYnHygy+sw6W8YsRVaPikJixCiUmWPa6iIQZmdOnXC1taWc+fO8ccff+Q5v3///jzjWcAwrsTX15fk5GS2bNmS5/ylS5fybZm3t7end+/exs0CzSG7RWXjxo2knNkPih67Bu2MrUAFSUlJYevWrUDpu4YAunXrRo0aNUhMTMz3s8uezdW7d+9SJ0blocolLYVJT0/n2LFj9OrVy+R4r169OHjwYLHqUBSFZ599lu7du+f5Cy7s3P0WLVqEi4uL8VFh3Ug3TxmW2Y85ZZiu3O/9nJ2WXatY15UQ4oFRr149gAJn05SFi4uLcQXWESNGcPbsWeO5U6dOMWrUqHxbUdRqNZMmTQJg4sSJxgXTwLDw2lNPPVVgC9G8efPQarXMnz+fxYsX50nGbty4wfvvv89HH31U1reXr+wZP5s3bybln30AOAR2KfK6rVu3kpKSUuxl+zt16oS/v3+exESr1RoXuJsyZQrh4eHGc1988QVr1qxBpVIxY8aM4r6lCmFRSUtsbCw6nc64GVQ2Ly8voqOji1XH77//zqZNm/j2228JCgoiKCjI2FxY2Ln7TZs2jYSEBOPjypUrZXtz+dFlwtdjIfUO1G4LL/4BIc+CRnZDFUKY19ChQwF48cUXadGiBV27dqVr166EhYWVS/0LFy4kKCiIixcvEhgYSKtWrWjZsiXNmzfHw8PDOHzg/plJkyZNolevXsTGxtKhQweaNm1K69atCQgIIC4ujhdeeCHf64KCgti4cSNarZZp06bh5uZGcHAwDz30EHXr1sXHx4dJkyblu91AeWjSpAlBQUHExsaSHn0etdYBu3ohRV5X0mX7r169SmRkZL7jfl577TUee+wxoqOjad26Na1ataJ+/foMHz4cvV7PwoULjd1I5lLlxrQUx/2ZsqIoxe5f7dSpU4GLCxV27n5arbbIhYPK7Mw2QwuLXQ14eqPsBySEqDJGjBjB7du3WbNmDefPn+fkyZMA3Llzp1zqd3Z2Zv/+/cydO5evvvqKM2fOUKtWLSZPnsycOXMYPXo0kHc2kJWVFdu2bWPJkiWsX7+eS5cu4e7uzqhRo1i4cCFLlizJ9zqAgQMHcurUKd577z127tzJ2bNn0Wg0+Pr6MnDgQAYMGMATTzxRLu8vP8OGDTMmffaNO6Iq4hfU6Oho4y7ZZekaymZlZcUPP/zA8uXLWbt2LefPn8fa2pru3bszZcoU+vTpU+Z7lJVKqYih0OVEpVKxdetW40Ck9PR07O3t2bx5MwMHDjSWe/nllwkLC6uQZsriSkxMxMXFhYSEBJydncun0i1j4eQW6DQZeswunzqFEEX6v/2XWLD9NIOCfVk6NMjc4Yh8tGjRgpMnT3LixIkSDQzt168fP/zwg8l3S1Xj//qPxueXF5s/UagMxf0OtajuIRsbG0JCQti1a5fJ8V27dhU6aNZiXT1i+LNeN/PGIYQQVciRI0c4efIkrq6uNGvWrNjXXb16lV27dqHRaGjfvn0FRigqSpVLWpKTkwkLCzM2kUVERBAWFmacHz5lyhRWr17NJ598wunTp5k8eTJRUVHGfspqQ6+HxKwFrNzqmTcWIYQwg+nTp+dZgfbw4cM89dRTAIwZMybfAbnz5883ro6b7ezZs/Tv35+0tDT69++Pt7fsam+JqtyYlqNHj9KtW07LwpQpUwAYNWoU69atY+jQocTFxTF37lxu3LhB8+bN2b59O35+fuYKuWLciwd9BqACJ/nPJYR48CxatIhFixbh7e1NnTp1iImJITIyEoA2bdowZ86cfK9bvXo1s2bNwsPDA39/fxISEoxJTL169cw2rVmUXZVLWrp27VrkioPjx49n/PjxlRSRmaRlrdpobSezhYQQD6S33nqL7du3c/bsWcLDw41DBJ566in+85//YG+f//pUs2bNYvPmzcY1utRqNc2aNWPAgAG88sorZl2GXpRNlUtaRBYlaxaTqmQbjQkhRHXx2muv8dprr5X4urFjxxrXeRHVS5Ub0yKyZLc2qeSvSAghhABJWqouY0uLZWxwJoQQQlQ0SVqqLGlpEUIIIXKTb8SqytjSIn9FQgghBEjSUnVJ0iKEEEKYkG/EqkqSFiGEEMKEfCNWVZK0CCGEECbkG7GqkqRFCCGEMCHfiFWVTHkWQgghTEjSUlUZF5eTpEUIIYQASVqqLukeEkIIIUzIN2JVJUmLEEIIYUK+EasqSVqEEEIIE7LLc1VVqxW8eBDU1uaORAghhKgSJGmpqmwcwKuZuaMQQgghqgzpexBCCCGERZCkRQghhBAWQZIWIYQQQlgEGdNSTnQ6HQBXr17F2dnZzNEIIcri9q0bZCbGkhRnxdWrV80djnjAZCbGGp8/KP/+EhMTgZzv0oKoFCV76VVRFkeOHKFdu3bmDkMIIYSwWIcPH6Zt27YFnpekpZzcvn0bNzc3rly5Ii0tQgghRAkkJiZSp04d4uPjqVGjRoHlpHuonGg0GgCcnZ0laRFCCCFKIfu7tCAyELeMPvzwQwIDAwttzhJCCCFE2Un3UDlJTEzExcWFhIQEaWkRQgghSqC436HS0iKEEEIIiyBJixBCCFFFZOr0+L/+I/6v/0h8Srq5w6lyJGkRQgghqoALMUk0mPGT8fX7u8+ZMZqqSWYPCSGEEGb27s9n+d8vF0yOJacVvtDag0iSFiGEEMJMdHqF+tO353tO5snkJd1DQgghhBlcib9bYMICoJekJQ9JWspI1mkRQghRUqsPXOKRt/cWWkalUlVSNJZDuofKaMKECUyYMME4x1wIIYQoiF6vUK+Q1hVROGlpEUIIISpBZFxKiRIWGdOSl7S0CCGEEBVs+S/neednmcJcVpK0CCGEEBUkLVNH45k7zB1GtSHdQ0IIIUQFCL9yRxKWciYtLUIIIUQ5m/JVGN8cv2buMKodSVqEEEKIcnLnbjpBc3eZO4xqS7qHhBBCiHKw9cRVSVgqmLS0CCGEEGWg1ys0n72Tu+myV1BFk5aWMpIVcSuOv78/KpUKlUrFt99+W2C5Hj16oFKpWLduncnxdevWGa8v7OHv71/kdVqtFk9PT1q0aMGoUaPYsGEDqampBca0b9++Yt27ole8LEkckZGRJa5/+/bt9OjRAzc3NxwcHGjdujX/+9//0Ov1FfBuhKh6/rmeQL3p2yVhqSTS0lJGsiJu5Zg9ezb9+/cv1Ze8VqulTZs2BZ6vVatWkdcpikJCQgKXL1/m5MmTfPrpp0yZMoWVK1cyePDgQu/fsWPHEsdcXlxcXAq9/+XLl7l27Rq+vr7UqVOnRHUvXryYadOmAVCvXj0cHR0JDw9n4sSJ7N69m61bt6JWy+9FovqSwbaVT5IWUeVpNBrCw8P5+uuvGTJkSImv9/b25rfffiuX63Q6HYcPH2bx4sV8//33DBkyhI8++ojnn3++wHpKc+/yEhwcXOj9O3XqxLVr1xg+fHiJEow//viD6dOno1ar2bBhA8888wwA4eHh9O7dm++//56lS5cyderUMr8HIaqaa3fu0XHxL+YO44EkvwaJKi/7C3HOnDlmX9Zao9HQoUMHvvvuO6ZPnw7ASy+9xPnz580aV2lcunSJ33//HYARI0aU6Nr58+ejKArjxo0z/v0AtGrViqVLlwKGlpiMjIzyC1iIKuCDPeclYTEjSVpElTdmzBj8/f05efIkX331lbnDMZo3bx7BwcFkZGTw7rvvVui9li9fjkqlom/fvgWWiY+Px8bGBmtra+Li4oqsc8OGDQAEBQXRvHnzYseSmJjI7t27ARg7dmye808++STOzs7ExcWxd2/hu9gKYSniktPwf/1Hlu6SpfjNSZIWUeVZW1szY8YMwNDaUlUGearVap577jkAfvzxxwq919ChQ7GysuLnn38mPj4+3zJbtmwhIyODXr164e7uXmSdn3/+OVDyVpYTJ06Qnp6Ora0trVu3znPe2traODD90KFDJapbiKro80ORhMzfXen3le0S85KkRViEZ599lnr16nH69Gm+/PJLc4dj1KlTJwCuXr1KdHR0hd2nZs2aPProo2RkZLBly5Z8y2zcuBGAYcOGFVnfoUOHOHfuHBqNpljlc8vuCqtbty5WVvkPi6tXr55JWSEsUcK9DPxf/5EZW0+aOxSRRZKWKkhRFO6mZ1rko6LGnFhZWTFr1iwA5s6di05X/OmFkZGRhU71nTRpUqnjyj3jJiYmJt8yhd17wIABxb5XdnKRnZzkdv36dfbv34+9vT39+/cvsq7PPvsMMEwX9/b2LnYMALdv3wagRo0aBZbJPpddVghL89mfkbSa87NZYzDzEL4qSWYPVUH3MnQEvrHT3GGUyqm5vbG3qZh/ViNGjGDhwoWcPXuWzz//nJEjRxbruqKmPGe3CpSGg4OD8XlSUlK+ZQqbchwYGFjsew0cOJAXXniB/fv3c/36dXx8fIznNm3ahF6vp1+/fjg6OhZaT0ZGBps2bQJK3jUEGNensbGxKbCMVqsF4N69eyWuXwhzup2STvA8WdW2qpKkRVgMjUbDrFmzGDlyJPPmzWPYsGEFdk/kVtopz8WRnJxsfO7s7JxvmfK6t5OTE3379mXz5s1s2rSJyZMnG89lt77knslTkB07dhAbG4ujoyMDBw4scRy2trYApKenF1gmLS0NADs7uxLXL4S5fPrHZd747h9zh2EkDS15SdJSBdlZazg1t7e5wygVO2tNhdY/bNgwFixYwNmzZ/nss88YPXp0hd6vKFFRUcbnnp6eFX6/YcOGsXnzZjZu3GhMWi5evMiRI0dwdXUlNDS0yDqyu4YGDx6Mvb19iWMoTtdPcbqQhKgqYpJSabdgj7nDEMUgSUsVpFKpKqyLxdJpNBreeOMNhg8fzrx580rVvVGesltR6tati5eXV4XfLzQ0FFdXV44cOcKFCxdo0KCBsZVl8ODBhXbZACQkJLBt2zagdF1DAA0bNgQMCVtmZma+rV2XLl0yKStEVaTXKyzbc54P9lTNAePmXpeqKpKBuGUkew9VvqeffprAwEAiIiLy7DdUmfR6PR9//DEAffr0qZR7arVaBg0aBOR0CZVk1tCWLVtITU3F19eXbt26lSqG4OBgrK2tSU1N5fjx43nOZ2RkcOTIEQAeeuihUt1DiIoWEZtCvenbq2zCIvInSUsZTZgwgVOnThl/SIuKp1arefPNNwHDyqzmWnV11qxZhIeHY21tzSuvvFJp9809iyg8PJxTp05Rq1YtunbtWuS12V1DJV22PzdnZ2d69OgBwJo1a/Kc37x5M4mJibi7uxcrJiEqU4ZOz1s7ztDtnX3mDqVI0s6SlyQtwiI9+eSTtGjRgsjISONS9JVBr9fzxx9/0L9/fxYuXAjAypUrqV+/fqXF0K1bN2rVqsXp06d5/fXXAcPic0UlIVFRUezfvx8oXtfQ1KlT8ff3z3f/oBkzZqBSqVi9erXJFOzw8HCmTJkCwGuvvVZkd5UQlel41G0azviJlfsumjuU4pGsJQ8ZOCEskkql4s0332TIkCFFrtkSHR1tXASuIDt27MgzVTj3dYqikJiYSGRkpHFqc82aNVm1alWRM3CKuve6deto0KBBoWVyU6vVDB06lGXLlrFjxw6geLOGPv/8cxRFKfay/bGxsURGRhIbG5vnXMeOHZk3bx4zZ85k2LBhzJw5E0dHR06ePIler6dPnz6V2vokRGES7mXw1Ed/cPZm/ssSCMshSYuwWIMGDSIoKIiwsLBCy6WlpRXZGpOZmVnoddbW1ri4uODn50fr1q3p2bMnTz75pHE9ksIUde/c06aLa9iwYSxbtgyA+vXr065duyKvyd5rqLwGL8+YMYNWrVrx3nvvcezYMaKjo2nRogWjR4/mP//5DxpNxc4kE6IoOr3C6gOXWPTTGXOHUiq3ktPMHUKVo1JkeHK5SExMxMXFhYSEhALX6xBCCFE5zkYn0XvZfnOHUWaXF1fOIH9zK+53qLS0CCGEqDZSM3Q8/9kxfj13y9yhiAogSYsQQgiLl6nTs/HIFWZ9K5sbVmeStAghhLBoF2KS6LHU8ruCRNEkaRFCCGGRbiTcY/o3f7P3rHQFPSgkaRFCCGFRdHqFzw9FVqnNDUXlkKRFCCGERdDrFfaciWHKpjCS0vIuUyCqP0lahBBCVHlnohMZvOIgKemFLyYpqjdJWoQQQlRZNxNTWfrzOTYdvWLuUEQVIEmLEEKIKudWUhqf/B5hOfsEiUohSYsQQogqZeW+i7y1wzKX3hcVS5IWIYQQZpeaoeN45G0mfnmC2OR0c4cjqihJWoQQQphNeqaeo5fjmfHtSSJiU8wdjqjiJGkpow8//JAPP/wQnU5GtAshREl8F3aNLw9f4Y9LceYORVgI2eW5nMguz0IIUTwHL8byxaEofvjrhrlDqfJkl2dT0tIihBCiUlyISWbh9tP8cibG3KEICyVJixBCiAoVm5zGyDWHOXUj0dyhCAsnSYsQQohypygKKek6hqw8yJnoJHOHI6oJSVqEEEKUm7RMHZk6hSeW/8bFWzIbSJQvSVqEEEKUWXJaJumZevp+cIA79zK4K3sEiQogSYsQQohSu52SToZeT5e396FWIRsaigolSYsQQogS0ekVklIzOHU9kWGrD+HppOVehiQrouJJ0iKEEKJY0jP1aNQq3vz+JBsPX8HZ1vAVEpOUZubIxINCkhYhhBCFUhSFO3cz6PbuPpp4O/HnpXgAbt/NMHNk4kEjSYsQQogCLdt9jnUHL/NCl/rcuZthTFiEMAe1uQMQQghRtZyIuk3nt/fyXdg1lu0+z527Gbz781lzhyWEtLQIIYQwrFo75atwhrapw/a/bxAVf5eXvwwzns/QyTZ1wvwkaRFCiAdUTFIq7+06x7B2fuw+fZP9526x/9wtarnYmjs0IfIlSYsQQjxAzt9M4njUbYaE1OHjXy+x8fAVTkTdoaaT1ljGzkZjxgiFKJgkLUIIUY0pisJfVxOo7+mIo9aKVzaH89fVBHR62HvWsNvymegkatewy3WNuaIVonAyEFcIIaqZ1AwdSlbm8ePfN+j/4e+M//w46Zl6/rqaAMDvF2JNWlSs1DlfB0mpMpVZVE2StAghRDVy7mYSbRfsZuz6owBs//sGAPvP3SLhXk4yolGrTBKVlPRM4/PE1JznQlQl5dI9FBAQgEqlKvF1kyZNYuLEieURghBCPJB+OXOTeT+cZlpoE3o182b73zdISs3klzMxJKVmcDslJ1G5cvuu8XlcShq5f2zHJqcbn6dn6isldiFKqlySlnXr1pXqOn9///K4vRBCPBDiktOYs+0U3Zt4MiDYF4B3dp4jIjaFt3eepVczb6LicxKTy7F3uZurBSUqLudcUmommbmmMd+SpfiFBSiXpKVLly7lUY0QQlQJsclpvL/7PMPb16WJt7NZYgi7cocdJ6N5sUt9XOytAfi/AxF8H36d78OvE9rCGxuNmlM3EgG4EJMMwNXb94x13EpO5U6uLqFrd3LOJadlotfnJC2xyZK0iKpPxrQIIcR9Nh6K4rM/I3ls2QEydPl3lWTq9ByOiOdybEqhdSWmZvDFoSguxCTlez4iNoWT1xJMjun0CuPWH+WjXy+yeMdp4/Hc5U7fSCIuJd3kusTUDO7czTl2KymN27nK5E5aUtIySU6TnZmFZSmXlpakpCTmzJnDDz/8QGxsLC4uLjRu3JiOHTsyePBgmjRpUh63EUKISpGRqwXiy8NRjOjgb3I+MTWD0WuPcCzyNmoVLBnSisEhtfOt6/lPj/HHpTgctVb8MrULnk45C7ddvX2XPh8c4G66jo/+FcJjzb0BOH0j0djysed0jLF8TFKq8XlkXAoO962ncv3OPe7k2sTwZmKayaDa67lbWlIzkZnNwtKUS0vLyJEj2bJlC6NGjWLx4sW8/PLL/PLLL3zxxRc0a9aM/v37c/369fK4lRBCVDgnbc7vc8t2nzeZAqwoCjO2nuRY5G0A9ArM+u4kcfl0r4RducMfl+IAQ3fMV0eumJz/Pvw6d9MNrR1fHI4yHj9x5Y7xeUxSGolZ97+ZmHOPq7fvEX9fS0t8crpJd9DVXANvAa7l6jpKSdcZ7y2EpSiXpOXnn3/m22+/Zdq0aYwbN46JEydibW3Ntm3biIiIwNvbm7Zt2xIREVEet6swAwcOpEaNGgwZMsTcoQghqoi4lHRW/XrJ+Pq7sOtsC7+ORq3i6xc70MzHmbvpOjbmSjqy7T0TY/L6l/teHzgXa3x+PPK2cYxJVJxpl9Pl2BRSM3QmU5av37nH7bumScv1hFSTmT+5x7cARCekIoQlK5ekxcvLi5SU/Pt169aty6pVq5gwYQIvv/xyedyuwkycOJFPP/3U3GEIIaoIx6wWl/87cIkbCfeITkjlje9OAjCxe0NC/NwY3TEAMLSa3O9oZDwAz3epB8BfVxNIzchp3Th7M2ecS3JaJpeyxsdciTdNNi7H3SUm0bQlJz4lnfgU00Xg7h9fk7s7CCApTdZfEZatXJKWl19+mTFjxhAeHl5gmeHDh/PLL7+Ux+0qTLdu3XBycjJ3GEKIKqJnoBdt/WuQlqln0pdhjPv0CImpmbSq7cKEbvUNZZp6YaVWce5mMpduJRuvzdTpORF1B4ABQb7UsLcmU69wNtqQqMQlpxGfko5KBQ09HQGM11+9Y+jWye6mupmQys0k01aSuOT0PC0tEfclLTekZUVUM+WWtAwePJiQkBAee+wxPvroI/R6vcmCcxs3bsTDw6PU99i/fz/9+vXDx8cHlUrFt99+m6fMihUrCAgIwNbWlpCQEA4cOFDq+wkhhAqY1TcQG42aQxHxnLyWSA17a94bGoSVxvDj08Xemg713QHTQbNnopO4m67DydaKxl5ONPd1AeDvrBlA524aEpTaNexoUsswrToyax2V7JaWEP8aANxMTOVmomkCEpuSlmdMy8VcSRNAmiwSJ6qZcpvyvHDhQv744w9cXFx45ZVXuHfvHs2bNycgIAB3d3fmzZvHkiVLSl1/SkoKrVq1Yvny5fme37RpE5MmTWLGjBmcOHGCRx55hNDQUKKicvqZQ0JCaN68eZ6HDBIWQhSkZW1XNj73EL0Cvegf5MOWFx+mXk1HkzLdm3gCpmNWjl42dA21rlsDtVplTFpy1lUxtLg08nTC390egIi4FBJTM4xjV0LqZiUtSWnGQbiNvQytwfEp6cbpzG4ONkBO0iNEdVWuuzy3bduWTZs2kZ6ezvHjxzl37hyJiYl4eHjQvXt3PD09S113aGgooaGhBZ5funQpY8eOZdy4cQAsW7aMnTt3snLlShYtWgTAsWPHSn3/+6WlpZGWltPHnJiYWG51CyGqlhA/Nz4e6Vbg+W6NPZmz7RRHLseTmJqBs601R7NmF7XxMyQegVmtKaeuG35WnM9aDK6BlyN+7g6AYUxK9gyfGvbW+HsYjt9MTCUmq6Ul0MeZszeTuHM3g1tZM5YCPByIT0nnXtZ4GU8nLTG5Vri1UqvI1MsEZ2H5yjVpyWZjY0P79u1p3759RVSfR3p6OseOHeP11183Od6rVy8OHjxYIfdctGgRc+bMqZC6hRCWxd/DgXoeDlyKTeG387GENvfm6GVD0pLdxdM0K2k5E52ITq9wLmsQbsNcLS2RcXe5kWBIWnxc7fByNqzpEpOre6iRlxNqlWGqdfYquPU8HIxTsAF8a9iZJC3eLrZ5ZhIJYYmqxYaJsbGx6HQ6vLy8TI57eXkRHR1d7Hp69+7N8ePHSUlJoXbt2mzdupW2bdvmW3batGlMmTLF+DoxMZE6deqU7g0IISxetyaeXPotgr1nYmjh60J0YioatYqgOq6AoTXE1lpNaoaey3EpxoSjoacjtVwNycmNhHvGLp5aLnZ4OWsBiE5MJTorafFxtcXNwYbY5HTjQNv7u6t8XO2Mg4ANdZkmLdLyIixVtdow8f7ESVGUEiVTO3fuLHZZrVaLVqstdnkhRPXWvYkna36LYO/ZW7QLMHQltfB1wd7G8GNWo1bRxNuZsCt3OHgh1rircgNPR+xtNNjbaLibruNI1liYWi62xpaW1Ay9McnxdLLF3UFrsitzQFY3UrbarnYmr71d7ICclhhPJy3XZWaRsEDVYsNEDw8PNBpNnlaVmJiYPK0vQghREdr6u+GotSI2OY3VBwwLaT5Uz3QcTNNahqRlW/gNAHxd7XDImtZc182eM9FJ/HkpK2lxtcXWWoOrvTV37mYYkxQvZy3ujjZwM6feejVNkxZXexscbDSkZK146+Nia3Le09nWmLS4OdjkmYUkRFVVLTZMtLGxISQkhF27dpkc37VrFw8//LCZohJCPEhsrNR0amBY1iF70bguDWualAn0MYxrOZzVmtLAM6dbxy9rXEt2AuHjYmgt8XbOm3B4OOa08mrUKuq62ZuUcbazwtnO2uQakzqccq6vmauuUvTyC1GpLCZpSU5OJiwsjLCwMAAiIiIICwszTmmeMmUKq1ev5pNPPuH06dNMnjyZqKgoXnjhhQqN68MPPyQwMLDAsS9CiAdHz8Ccll1fVzsequducj6wlunilY28cpIWf3fT1pJaWa0jXrkSDgcbDY5aK0NLS5Ya9tbYWmtMNk90srXG2dY612sr7Kxzzns650paciUwNexz6hWiKqqQ2UMV4ejRo3Tr1s34OnsQ7KhRo1i3bh1Dhw4lLi6OuXPncuPGDZo3b8727dvx8/Or0LgmTJjAhAkTSExMxMXFpULvJYSo2voH+XDkcjxhV+7wZr9maNSmTReNvZ1RqUDJGgPbOmsdFoC67qatJdnTnWvl6tqplTVWJXdLS3ai4WpvQ0q6YbCtk60VTrY5P94dtVYmsXjl2mnaNGmxNrb0ONtamewQLURVYDFJS9euXVGUwke7jx8/nvHjx1dSREIIYcpKo2bx4JYFnnfUWtHcx8W4Km72gF0wbWlx0loZu3Byt7RkJzDuDjktItkLy7naW3Mta68hZ1vT7iEHrRW506caua7PnbS4O2i5eCvFWEaSFlHVWEz3kBBCVAdz+zejibcTM/s0xT1Xi0kjr5yuIz8Pe+PMR+9cLS3Z41xyt7RkJy25u3Y8HLU452ppcc2VwAA4aHN1FTnlrev++oSoKiympUUIIaqD4Lo12DGpc57jNZ20PNbMmx3/RDOsXU63dhPvnGSmYdYYmNxjWnyyuoysNTltKR6OWpOWltzJCGCchg2mLTmOuRIddwdJWkTVI0lLGX344Yd8+OGH6HS6ogsLIUQh3n8miCvxd2ngmZOoNPd1oX5NB6Li79K1sWE2kl+urqTsLqPcY1YctFZYa3Ia0l3tTVtaHLU5P/pzt7TYWudc43Jf64wQVYF0D5XRhAkTOHXqFEeOHDF3KEIIC6e10pgkLADWGjXfjO/Ivle7Gc+5OdgwuHVt/N3tebxFLQAGt64NQOdGhsSmdo2cBeYctVYm05ntc800csmV0OSeYWSXq0zu40KYk7S0CCFEFediZ52n5ePdp1qZvH6suTdf/PshWmTtJj0w2Jef/o6mVzMvVCoVU3o2Yva2U/yrfV2TrqNaLjnJTe4Bug65WmOsNSqyNp4WwqwkaRFCiGpApVLxcH0P42tXexu+eqGD8fWwh/xoWceVoNquqFQwqUdDHLVWuNhZMyjYl0MR8QwJqc2mI1eIjLtLh/rufLz/EmDojsqe8SSEOUnSIoQQDwAbK7XJujCTejQyPl86NAi9XkGtVrFudDtuJqbSvp47U3o2wtbacN3ITw7z38ea8N7ucyTey6Cmk5abiWn53UqICiNJixBCCNRZA3kDPByMGzBOfLSh8fzfs3ujUavoEehFSlomrnbWrPk9gkHBtZn2zV90aeTJe7vPYaNRk67Tm+U9iOpPkpYyktlDQogHQfbsJN9cO0hPC20KwDfjOwIwooMf9jYajkXext5GwzfHr+Fka8W3J65xKzmNDF3hC4QKURRJWspIlvEXQgiD7PVgOmZtHBmc1R312mNN0OkVDl2KQ6NW8dPJaG4lpfHj3zfMFquwTJK0CCGEqHAatYqHs5KZ7I0kPwQuxCSTlJrBvrO3OHD+Fsej7pgvSFHlSdIihBDCbBp4Glb5Da5bg8k9G5Gp0xOdmMquUzf542IcP5+6aeYIRVUiSYsQQogqw0qjpnYNe0Z3DGB0xwAUReFGQio//xPNt2HXCbtyx9whCjOSpEUIIUSVpVKp8HG149mOATzbMYD0TD1/Xb3DpiNX2HzsqrnDE5VMkhYhhBAWw8ZKTRt/N9r4u7HkyVZcvJXMd2HX+WDPeXOHJiqB7D1URh9++CGBgYG0bdvW3KEIIcQDp35NR6b0bETEosfZO7Urz7SrY+6QRAWSpKWMZMNEIYQwP5VKRYCHA4sGteTSwsf5+sUONMwa5CuqD+keEkIIUa2o1SpC/NzYNaULiakZrP/9Mu/uOmfusEQ5kJYWIYQQ1ZazrTUvPdqQiEWPs35MO3OHI8pIkhYhhBDVnkqlokujmlxe3IfvJnTExc7a3CGJUpCkRQghxAOlVR1Xwt/sxf5Xu2Gjka9BSyJ/W0IIIR5Idd3tObcglB9e6mTuUEQxSdIihBDigdbc14XLi/uwdfzD5g5FFEGSljKSdVqEEKJ6CK5bg4hFj/PaY43NHYoogCQtZSTrtAghRPWhUqkY37UBp+b2xsNRa+5wxH0kaRFCCCHuY29jxdGZPfh2QkdzhyJykaRFCCGEKEBQHVfOzHuMejUdzB2KQJIWIYQQolC21hp+eaUrq0e2MXcoDzxJWoQQQohi6BHoxT9zeps7jAeaJC1CCCFEMTlorbi8uA+Pt/A2dygPJElahBBCiBJaMTyEtaNlqYvKJkmLEEIIUQrdGnvy++vdzR3GA0WSFiGEEKKUfF3t+Ht2L3OH8cCQpKWMZEVcIYR4sDnZWnNufqi5w3ggSNJSRrIirhBCCBsrNZcWPm7uMKo9SVqEEEKIcqBWq4hY9DhWapW5Q6m2JGkRQgghyolKpeLCwsdl36IKIkmLEEIIUc6OzuyBShpcyp0kLUIIIUQFiFjUx9whVDuStAghhBAVJGKRDM4tT5K0CCGEEBVEpVJxdv5j5g6j2pCkRQghhKhAWisNh6c/au4wqgVJWoQQQogK5ulsy9cvPmzuMCyeJC1CCCFEJQjxq8GoDn7mDsOiSdIihBBCVJI5/ZubOwSLJklLGcneQ0IIIUriwgLZp6i0JGkpI9l7SAghRElYadT8OLGTucOwSJK0CCGEEJWsmY8LHRu4mzsMiyNJixBCCGEGn49rb+4QLI4kLUIIIYSZ7J7SxdwhWBRJWoQQQggzaeDpSF03e3OHYTEkaRFCCCHMaO/UruYOwWJI0iKEEEKYkUat4t0nW5k7DIsgSYsQQghhZoNDaps7BIsgSYsQQghRBeyTbqIiSdIihBBCVAH+Hg7mDqHKk6RFCCGEqCJOzult7hCqNElahBBCiCrCUWtlfK5Rq8wYSdUkSYsQQghRhbz8aEMAnmlXx8yRVD2StAghhBDCIkjSIoQQQgiLIEmLEEIIISyCJC1CCCGEsAhWRRcRhfnwww/58MMPyczMBCAxMdHMEQkhyupeShL6tLuk3U2W/9Oi0qWmJD9w//6y36eiKIWWUylFlRDFcvXqVerUkZHeQgghRGlduXKF2rUL3tJAkpZyotfruX79Ok5OTqhUMrdeCCGEKC5FUUhKSsLHxwe1uuCRK5K0CCGEEMIiyEBcIYQQQlgESVqEEEIIYREkaRFCCCGERZCkRQghhBAWQZIWIYQQQlgESVqEEEIIYREkaRFCCCGERZCkRQghhBAWQZIWIYQQQlgESVqEEEIIYREkaRFCCCGERZCkRQghhBAW4f8BQ9ZTOrZkGnEAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "pt_v7 = v7.get_perturbations()['scalar'][0]\n", + "fig, ax = plt.subplots(2,1, figsize=[6, 4])\n", + "ax[0].set_title(f'NEDE perturbations at k={k_plot}/Mpc')\n", + "ax[0].set(xscale='log', yscale='log', xticks=[], ylabel=r'$|\\delta|$')\n", + "ax[0].plot(pt_v7['a'], np.abs(pt_v7['delta_NEDE']), '-', label=f\"NEDE v7.0\")\n", + "ax[1].plot(pt_v7['a'], np.abs(pt_v7['theta_NEDE']), '-', label=f\"NEDE v7.0\")\n", + "ax[0].plot(pt_v7['a'], np.abs(pt_v7['delta_trigger']), '-', label=f\"trigger v7.0\")\n", + "ax[0].legend(frameon=False, fontsize=16)\n", + "ax[1].set(xscale='log', yscale='log', xticks=[], ylabel=r'$|\\theta|$')\n", + "ax[1].legend(frameon=False, fontsize=16)\n", + "fig.subplots_adjust(hspace=0.)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 5168f73416e4603f34c0e89415d8fafbb1f96c3b Mon Sep 17 00:00:00 2001 From: EBHolm Date: Thu, 22 Aug 2024 09:30:59 +0200 Subject: [PATCH 59/59] Updated README --- README.md | 123 ++++++++++++------------------------------------------ 1 file changed, 27 insertions(+), 96 deletions(-) diff --git a/README.md b/README.md index c3efae43b..59f87911b 100644 --- a/README.md +++ b/README.md @@ -1,120 +1,51 @@ -CLASS: Cosmic Linear Anisotropy Solving System {#mainpage} +TriggerCLASS ============================================== +forked from CLASS by Julien Lesgourgues and Thomas Tram; see http://class-code.net and https://github.com/lesgourg/class_public -Authors: Julien Lesgourgues, Thomas Tram, Nils Schoeneberg +TriggerCLASS is a modification of CLASS that implements an instant phase transition in a new fluid component that goes from a cosmological constant phase to a decaying phase. The transition is triggered by a sub-dominant clock field that carries adiabatic fluctiations. As such, it describes the physics of the New Early Dark Energy (NEDE) and Hybrid Early Dark Energy model. The details of the implementation have been explained in the methodology part of https://arxiv.org/abs/2006.06686 and through many additional comments in the code tagged with "NEDE". -with several major inputs from other people, especially Benjamin -Audren, Simon Prunet, Jesus Torrado, Miguel Zumalacarregui, Francesco -Montanari, Deanna Hooper, Samuel Brieden, Daniel Meinert, Matteo Lucca, etc. +The version used for the publications ArXiv: 1910.10739, 2006.06686, 2009.00006 has been tagged with "NewEDEv3.0". +The version used for the publication ArXiv: 2209.02708 has been tagged with "NewEDEv4". -For download and information, see http://class-code.net +__New in version 7.0 [31 July 2024]__: Rebased TriggerCLASS on version 3.2.1 of class_public with the SHA 997d1ac0b64d11439948a0cc13f719ef427f87be (older versions of TriggerCLASS are based on the older version 2 of class_public). This comes with the following modifications: +* New precision parameters: In CLASS versions >3, the implicit ndf15 integrator is used for the background evolution. This automatically increases precision around the NEDE decay time, so the precision parameters "decay_res_enhancement" and "trigger_resolution" have been removed. +* Added a background approximation switching logic that splits up the background evolution into two phases (before and after the trigger fluid approximation). +Ultimately, version 7.0 is faster than v6.1 by a factor of about 10 in the background and between 5 and 8 in the perturbations. The two codes have been tested against each other, and produce similar results in Cls and matter power spectrum to within 5 permille, a difference coming from the LambdaCDM sector difference in the two CLASS codes. with the precision settings given in input/NewEDE.ini and the NEDE notebook in the notebooks directory. +__New in version 6.1 [7 May 2023]__: TriggerCLASS now allows for Omega0_NEDE_trigger_DM as input, controlling the trigger abundance today (which contributes to DM). -Compiling CLASS and getting started ------------------------------------ - -(the information below can also be found on the webpage, just below -the download button) - -Download the code from the webpage and unpack the archive (tar -zxvf -class_vx.y.z.tar.gz), or clone it from -https://github.com/lesgourg/class_public. Go to the class directory -(cd class/ or class_public/ or class_vx.y.z/) and compile (make clean; -make class). You can usually speed up compilation with the option -j: -make -j class. If the first compilation attempt fails, you may need to -open the Makefile and adapt the name of the compiler (default: gcc), -of the optimization flag (default: -O4 -ffast-math) and of the OpenMP -flag (default: -fopenmp; this flag is facultative, you are free to -compile without OpenMP if you don't want parallel execution; note that -you need the version 4.2 or higher of gcc to be able to compile with --fopenmp). Many more details on the CLASS compilation are given on the -wiki page - -https://github.com/lesgourg/class_public/wiki/Installation - -(in particular, for compiling on Mac >= 10.9 despite of the clang -incompatibility with OpenMP). +__New in version 5 [12 Oct 2022]__: TriggerCLASS now takes the decay redshift z_decay_NEDE (rather than the trigger mass) as input. The trigger mass is then determined via a shooting method. Output improvments and more detailed comments. -To check that the code runs, type: +__New in version 4 [20 Dec 2020]__: TriggerCLASS now accepts f_NEDE as input parameter (replaces Omega_NEDE). Introduced "tracking mode" for which the rest-frame sound speed equals the adiabatic sound speed (this feature has not been tested intensively yet). Output improvments and more detailed comments. - ./class explanatory.ini -The explanatory.ini file is THE reference input file, containing and -explaining the use of all possible input parameters. We recommend to -read it, to keep it unchanged (for future reference), and to create -for your own purposes some shorter input files, containing only the -input lines which are useful for you. Input files must have a *.ini -extension. We provide an example of an input file containing a -selection of the most used parameters, default.ini, that you may use as a -starting point. +Compiling TriggerCLASS and getting started +----------------------------------- -If you want to play with the precision/speed of the code, you can use -one of the provided precision files (e.g. cl_permille.pre) or modify -one of them, and run with two input files, for instance: +In order to install TriggerCLASS, clone the branch "NewEDEv4" in a new folder and follow the same steps as required for the installation of the base CLASS code detailed in https://github.com/lesgourg/class_public. Also see the Wiki page: - ./class test.ini cl_permille.pre +https://github.com/lesgourg/class_public/wiki/Installation -The files *.pre are suppposed to specify the precision parameters for -which you don't want to keep default values. If you find it more -convenient, you can pass these precision parameter values in your *.ini -file instead of an additional *.pre file. +For a successfull compilation adapt the compiler information in "Makefile" and "./python/setup.py". After compiling it, check that TriggerCLASS has been properly set up by running first + + ./class input/explanatory.ini -The automatically-generated documentation is located in +This corresponds to a standard LambdaCDM run. To check that the trigger component works correctly, type: - doc/manual/html/index.html - doc/manual/CLASS_manual.pdf + ./class input/NewEDE.ini -On top of that, if you wish to modify the code, you will find lots of -comments directly in the files. +This should result in a run with a non-vanishing fraction of NEDE. The output should provide a detailed account of the NEDE parameters. +The NewEDE.ini also explains the NEDE input parameters. -Python +MCMC analysis ------ -To use CLASS from python, or ipython notebooks, or from the Monte -Python parameter extraction code, you need to compile not only the -code, but also its python wrapper. This can be done by typing just -'make' instead of 'make class' (or for speeding up: 'make -j'). More -details on the wrapper and its compilation are found on the wiki page - -https://github.com/lesgourg/class_public/wiki - -Plotting utility ----------------- - -Since version 2.3, the package includes an improved plotting script -called CPU.py (Class Plotting Utility), written by Benjamin Audren and -Jesus Torrado. It can plot the Cl's, the P(k) or any other CLASS -output, for one or several models, as well as their ratio or percentage -difference. The syntax and list of available options is obtained by -typing 'pyhton CPU.py -h'. There is a similar script for MATLAB, -written by Thomas Tram. To use it, once in MATLAB, type 'help -plot_CLASS_output.m' - -Developing the code --------------------- - -If you want to develop the code, we suggest that you download it from -the github webpage - -https://github.com/lesgourg/class_public - -rather than from class-code.net. Then you will enjoy all the feature -of git repositories. You can even develop your own branch and get it -merged to the public distribution. For related instructions, check - -https://github.com/lesgourg/class_public/wiki/Public-Contributing - -Using the code --------------- - -You can use CLASS freely, provided that in your publications, you cite -at least the paper `CLASS II: Approximation schemes `. Feel free to cite more CLASS papers! +In order to perform a MCMC analysis, we recommend using MontePython, https://github.com/brinckmann/montepython_public, and follow their installation instructions. Our baseline MCMC run (as discussed in https://arxiv.org/abs/2006.06686) can be found under input/run_NEDE_canonical.param. To make it run, you first need to update MontePython with the files from the folder montepython_tree. In particular, this will update the data.py to translate the NEDE input parameters. The corresponding covariance matrix and bestfit file can be found in the respective subfolders covmat and bestfit. Support ------- -To get support, please open a new issue on the +To get support, please open a new issue on -https://github.com/lesgourg/class_public +https://github.com/NEDE-Cosmo/TriggerCLASS -webpage!