"""Independent positive mass quadrature and real-space thin-disk potential checks.""" import math from scipy.integrate import quad from spherical_halos import mass_kernel from thin_disk_reference import speed_squared_dimensionless,ring_force_speed_squared def verify(): mass_results=[];disk_results=[] for kind in ['nfw','core']: for x in [1e-6,.001,.02,.1,1,10,100,1000]: if kind=='nfw':reference=x*x*quad(lambda t:t/(1+x*t)**2,0,1,epsabs=1e-30,epsrel=2e-12)[0] else:reference=x**3*quad(lambda t:t*t/(1+(x*t)**2),0,1,epsabs=1e-30,epsrel=2e-12)[0] actual=float(mass_kernel(kind,x));error=abs(actual/reference-1) mass_results.append({'kind':kind,'x':x,'analyticMassKernel':actual,'independentDensityIntegral':reference,'relativeError':error,'gate':1e-10,'passed':error<=1e-10}) for x in [.02,.1,.3,1,2.2,5,10,20]: bessel=speed_squared_dimensionless(x) for step in [.001,.0005]: reference=ring_force_speed_squared(x,step);error=abs(bessel/reference-1) disk_results.append({'radiusOverScale':x,'derivativeRelativeStep':step,'besselSpeedSquared':bessel,'independentRingPotentialSpeedSquared':reference,'relativeError':error,'gate':2e-5,'passed':error<=2e-5}) limits=[] for name,actual,reference in [ ('NFW-inner',float(mass_kernel('nfw',1e-8))/1e-8,1e-8/2), ('NFW-outer',float(mass_kernel('nfw',1e6))/1e6,(math.log(1e6)-1)/1e6), ('core-inner',float(mass_kernel('core',1e-6))/1e-6,1e-12/3), ('core-outer',float(mass_kernel('core',1e6))/1e6,1-math.pi/(2e6)), ('thin-disk-inner-log',speed_squared_dimensionless(1e-6),.5e-12*(math.log(4e6)-.5772156649015329-.5)), ('thin-disk-point-mass-outer',speed_squared_dimensionless(1e3),.001), ]: error=abs(actual/reference-1);limits.append({'name':name,'actual':actual,'asymptoticReference':reference,'relativeError':error,'gate':1e-4,'passed':error<=1e-4}) bad_precision=[] for x in [1e-12,1e-16]: for kind,naive in [('nfw',math.log1p(x)-x/(1+x)),('core',x-math.atan(x))]: stable=float(mass_kernel(kind,x));bad_precision.append({'kind':kind,'x':x,'naiveDirectSubtraction':naive,'stableKernel':stable,'relativeError':abs(naive/stable-1),'status':'RETAINED_BAD_ALGORITHM_CONTROL'}) x=2.2;actual=speed_squared_dimensionless(x);spherical=(1-(1+x)*math.exp(-x))/x wrong_geometry={'radiusOverScale':x,'actualThinDiskSpeedSquared':actual,'wrongSphericalEnclosedMassSpeedSquared':spherical,'relativeError':abs(spherical/actual-1),'status':'RETAINED_WRONG_GEOMETRY_CONTROL'} return {'positiveMassQuadrature':mass_results,'thinDiskIndependentPotential':disk_results,'finiteAsymptotes':limits, 'directSubtractionFailures':bad_precision,'diskIsNotSphereFailure':wrong_geometry, 'allRequiredPassed':all(row['passed'] for row in mass_results+disk_results+limits), 'scope':'Finite mathematical/model tests; thin disk is not certification/reconstruction of the native finite-thickness stellar field'}