@@ -44,8 +44,9 @@ program test_colors
4444 how_many_colors_history_columns, data_for_colors_history_columns, &
4545 calculate_bolometric
4646 use colors_def, only: Colors_General_Info
47- use const_def, only: dp, rsun, mesa_dir
47+ use const_def, only: dp, rsun, boltz_sigma
4848 use utils_lib, only: mesa_error
49+ use colors_utils, only: resolve_path
4950
5051 implicit none
5152
@@ -97,6 +98,11 @@ program test_colors
9798 ! number of sampled SED points printed for the SED comparison
9899 integer , parameter :: n_sed_samples = 20
99100
101+ ! require the integrated SED flux to stay close to sigma*T^4 scaled to
102+ ! the test distance. large deficits usually mean the wavelength coverage
103+ ! is missing too much UV or IR flux.
104+ real (dp), parameter :: bol_flux_rel_tol = 5d-3
105+
100106 character (len= 32 ) :: my_mesa_dir
101107 integer :: handle, ierr, n_cols, i, j, k
102108 integer :: model_num
@@ -160,7 +166,7 @@ program test_colors
160166 ! group 1: representative stellar types
161167 ! -----------------------------------------------------------------------
162168
163- write ( * , ' (a) ' ) ' # group1 system=Vega grid=Kurucz2003 filters=Johnson'
169+ call write_section_header( ' # Group1 system=Vega grid=Kurucz2003 filters=Johnson' )
164170 do j = 1 , n_cases
165171 model_num = model_num + 1
166172 call data_for_colors_history_columns( &
@@ -180,7 +186,7 @@ program test_colors
180186 ! group 2a: vary [M/H]
181187 ! -----------------------------------------------------------------------
182188
183- write ( * , ' (a) ' ) ' # group2a vary_MH Teff=5778 logg=4.44'
189+ call write_section_header( ' # Group2a vary_MH Teff=5778 logg=4.44' )
184190 do j = 1 , n_meta
185191 model_num = model_num + 1
186192 call data_for_colors_history_columns( &
@@ -200,7 +206,7 @@ program test_colors
200206 ! group 2b: vary log g
201207 ! -----------------------------------------------------------------------
202208
203- write ( * , ' (a) ' ) ' # group2b vary_logg Teff=5778 MH=0.0'
209+ call write_section_header( ' # Group2b vary_logg Teff=5778 MH=0.0' )
204210 do j = 1 , n_logg
205211 model_num = model_num + 1
206212 call data_for_colors_history_columns( &
@@ -220,7 +226,7 @@ program test_colors
220226 ! group 2c: vary Teff
221227 ! -----------------------------------------------------------------------
222228
223- write ( * , ' (a) ' ) ' # group2c vary_Teff logg=4.0 MH=0.0'
229+ call write_section_header( ' # Group2c vary_Teff logg=4.0 MH=0.0' )
224230 do j = 1 , n_teff
225231 model_num = model_num + 1
226232 call data_for_colors_history_columns( &
@@ -236,23 +242,32 @@ program test_colors
236242 end do
237243 end do
238244
245+ sed_filepath = trim (resolve_path(cs% stellar_atm))
246+
239247 ! -----------------------------------------------------------------------
240- ! SED comparison : solar case, n_sed_samples evenly spaced wavelength/flux
248+ ! group 3 : solar SED sample plus wavelength-coverage sanity checks
241249 ! -----------------------------------------------------------------------
242250
243- sed_filepath = trim (mesa_dir)// trim (cs% stellar_atm)
251+ call write_section_header(' # Group3 SED sample + wavelength_coverage_sanity' )
252+ write (* ,' (a)' ) ' # SED sample case=solar Teff=5778 logg=4.44 FeH=0.0 columns=wavelength_AA flux_erg_s_cm2_AA'
244253 call calculate_bolometric( &
245254 cs, test_teff(1 ), test_logg(1 ), test_meta(1 ), test_R(1 ), d_10pc, &
246255 bol_mag, bol_flux, wavelengths, fluxes, sed_filepath, interp_rad)
247256
248257 n_wav = size (wavelengths)
249258 stride = max (1 , n_wav / n_sed_samples)
250259
251- write (* ,' (a)' ) ' # SED sample case=solar columns=wavelength_AA flux_erg_s_cm2_AA'
252260 do i = 1 , n_wav, stride
253261 write (* ,' (1pe23.13, 1x, 1pe23.13)' ) wavelengths(i), fluxes(i)
254262 end do
255263
264+ write (* ,' (a)' ) ' '
265+ write (* ,' (a, 1pe10.2)' ) ' # wavelength_coverage_sanity logg=4.0 FeH=0.0 rel_tol=' , bol_flux_rel_tol
266+ do j = 1 , n_teff
267+ call check_bolometric_coverage( &
268+ cs, sed_filepath, ' Teff' , sweep_teff(j), 4.0d0 , 0.0d0 , rsun, bol_flux_rel_tol)
269+ end do
270+
256271 ! -----------------------------------------------------------------------
257272 ! cleanup
258273 ! -----------------------------------------------------------------------
@@ -266,4 +281,46 @@ program test_colors
266281
267282 write (* ,* ) ' test_colors: passed'
268283
284+ contains
285+
286+ subroutine write_section_header (title )
287+ character (len=* ), intent (in ) :: title
288+
289+ write (* ,' (a)' ) ' '
290+ write (* ,' (a)' ) trim (title)
291+ write (* ,' (a)' ) ' '
292+ end subroutine write_section_header
293+
294+ subroutine check_bolometric_coverage (rq , sed_path , label , teff , log_g , metallicity , radius , rel_tol )
295+ type (Colors_General_Info), intent (inout ) :: rq
296+ character (len=* ), intent (in ) :: sed_path, label
297+ real (dp), intent (in ) :: teff, log_g, metallicity, radius, rel_tol
298+
299+ real (dp), allocatable :: local_wavelengths(:), local_fluxes(:)
300+ real (dp) :: local_mag, local_flux, local_interp_rad
301+ real (dp) :: expected_flux, abs_err, rel_err
302+
303+ call calculate_bolometric( &
304+ rq, teff, log_g, metallicity, radius, d_10pc, &
305+ local_mag, local_flux, local_wavelengths, local_fluxes, sed_path, local_interp_rad)
306+
307+ expected_flux = boltz_sigma* teff** 4 * (radius/ d_10pc)** 2
308+ abs_err = abs (local_flux - expected_flux)
309+ rel_err = abs (local_flux - expected_flux)/ expected_flux
310+
311+ write (* ,' (a, a, a, f10.1)' ) ' # case: ' , trim (label), ' =' , teff
312+ write (* ,' (a40, 1pe23.13)' ) ' Wav_min_AA' , minval (local_wavelengths)
313+ write (* ,' (a40, 1pe23.13)' ) ' Wav_max_AA' , maxval (local_wavelengths)
314+ write (* ,' (a40, 1pe23.13)' ) ' Flux_actual' , local_flux
315+ write (* ,' (a40, 1pe23.13)' ) ' Flux_expected' , expected_flux
316+ write (* ,' (a40, 1pe23.13)' ) ' Flux_abserr' , abs_err
317+ write (* ,' (a40, 1pe23.13)' ) ' Flux_relerr' , rel_err
318+
319+ if (rel_err > rel_tol) then
320+ write (* ,' (a, a, a, 1pe11.3, a, 1pe11.3)' ) &
321+ ' wavelength coverage sanity check failed for ' , trim (label), &
322+ ' : rel_err=' , rel_err, ' > rel_tol=' , rel_tol
323+ stop 1
324+ end if
325+ end subroutine check_bolometric_coverage
269326end program test_colors
0 commit comments