337.1 / 777.4 nm photometer

Physicist verification companion · source release r4 · mathematical checks and unresolved limits

Review index · Download raw source

reference/legacy/run_grid.jl

1include("photometer_model.jl")2ENV["CLOUDSCAT_DEBUG_REDUCTION"]="1"3const OUT=joinpath(MCROOT,"results")4mkpath(OUT)56function validate()7    io=open(joinpath(OUT,"validation.txt"),"w")8    for θ in (0.,20.,40.)9        Z=534000.10        r,secs,_,_,_=makecase(N=5000,beta=0.,ray=false,xsrc=Z*tand(θ))11        measured=sum(r.photo)*DT12        expected=θ<=30 ? cosd(θ)^3/(4π*Z^2) : 0.13        @assert isapprox(measured,expected;rtol=1e-10,atol=1e-28)14        println(io,"Vacuum angle=",θ," expected=",expected," measured=",measured," PASS")15    end16    r,_,direct,_,_=makecase(N=5000,beta=3/2000,ray=false,albedo=0.)17    @assert isapprox(sum(r.photo)*DT,direct;rtol=1e-10)18    @assert all(==(0.),r.photo[2:end])19    println(io,"Zero-albedo cloud tau=3: direct-only test PASS")20    println(io,"Binning: 2 us excess delay; 12 ms record. Debug reduction=1.")21    println(io,"Mie g=",ICE.g," albedo=",ICE.ω0," Qext=",ICE.Qext)22    close(io)23    println("VALIDATION PASS"); flush(stdout)24end2526function rungrid()27    cases=NamedTuple[]28    for τ in (0.,.1,.3,1.,3.,10.,30.,100.)29        push!(cases,(id="tau_"*replace(string(τ),'.'=>'p'),group="tau_grid",30                     config=(beta=τ/2000,),N=τ>=100 ? 25000 : 50000))31    end32    for d in (200.,1000.,3000.)33        push!(cases,(id="depth_"*string(Int(d)),group="same_tau10",34                     config=(zsrc=18000-d,beta=10/d),N=50000))35    end36    push!(cases,(id="top",group="top_above",config=(zsrc=18000.,beta=.005),N=50000))37    push!(cases,(id="above_1km",group="top_above",config=(zsrc=18000.,ztop=17000.,zbottom=11000.,beta=.005),N=50000))38    for τ in (0.,3.,10.,30.)39        push!(cases,(id="noray_"*string(Int(τ)),group="ray_test",config=(beta=τ/2000,ray=false),N=50000))40    end41    for g in (.75,.95)42        push!(cases,(id="g_"*replace(string(g),'.'=>'p'),group="phase_test",config=(beta=.005,g=g),N=50000))43    end44    for τ in (0.,10.,30.)45        push!(cases,(id="domain_"*string(Int(τ)),group="domain_test",46              config=(beta=τ/2000,domainradius=200000.,domaintop=120000.),N=50000))47    end48    push!(cases,(id="radius40_tau30",group="radius_test",config=(beta=.015,cloudradius=40000.,domainradius=100000.),N=50000))49    push!(cases,(id="fov90_tau10",group="fov_test",config=(beta=.005,halfangle=45.),N=50000))50    # Fine near-top case tests that small overlying tau is not necessarily a pure direct pulse.51    push!(cases,(id="near_top50m",group="top_above",config=(zsrc=17950.,beta=.005),N=50000))52    open(joinpath(OUT,"batch_summary.csv"),"w") do io53        println(io,"case_id,group,batch,N,seed,zsrc_m,ztop_m,zbottom_m,beta_m-1,g,albedo,ray,cloudradius_m,domainradius_m,domaintop_m,full_fov_deg,tau_over,tau_cloud_total,tau_ray,direct_fluence_m-2,total_fluence_12ms_m-2,elapsed_s")54        for (i,c) in enumerate(cases)55            for batch in 1:456                seed=20261021+100*i+batch57                kw=merge((zsrc=16000.,ztop=18000.,zbottom=12000.,beta=.001,g=ICE.g,albedo=ICE.ω0,ray=true,cloudradius=20000.,domainradius=60000.,domaintop=80000.,halfangle=30.),c.config)58                r,secs,direct,τover,τray=makecase(;N=c.N,seed=seed,kw...)59                filename=c.id*"_batch"*string(batch)*".csv"60                writecurve(joinpath(OUT,filename),r)61                fields=(c.id,c.group,batch,c.N,seed,kw.zsrc,kw.ztop,kw.zbottom,kw.beta,kw.g,kw.albedo,kw.ray,kw.cloudradius,kw.domainradius,kw.domaintop,2kw.halfangle,τover,kw.beta*(kw.ztop-kw.zbottom),τray,direct,sum(r.photo)*DT,secs)62                println(io,join(string.(fields),',')); flush(io)63                println("DONE ",c.id," batch",batch," N=",c.N," seconds=",round(secs;digits=2)," total/vac=",sum(r.photo)*DT*4π*(550000-kw.zsrc)^2); flush(stdout)64            end65        end66    end67end6869validate()70rungrid()71