Skip to content

Commit d087069

Browse files
refactor inlist reading
This commit introduces utils_namelist, which abstracts some of the common aspects of reading inlists in MESA (error message, nested inlists, ...). Previously, various different namelist reading routines were copied and modified around the code base. These have accrued various differences over time, which has been fixed now. The following behaviour has been changed: - pgbinary and pgstar no longer make MESA error when they are missing from inlists - it no longer matters where in the chain of inlist a namelist section is missing. It used to be that for certain section, only the first inline in a chain was allowed to have a missing section. - checks and copying of options only happens once all inlists have been read - failures when reading inlists will no longer dump a stack trace on the user
1 parent 1ae1071 commit d087069

16 files changed

Lines changed: 403 additions & 698 deletions

File tree

astero/public/astero_def.f90

Lines changed: 34 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -839,73 +839,39 @@ end subroutine realloc_integer2_modes
839839

840840

841841
subroutine read_astero_search_controls(filename, ierr)
842+
use utils_namelist, only: read_namelist, missing_namelist_error
842843
character (len=*), intent(in) :: filename
843844
integer, intent(out) :: ierr
845+
844846
! initialize controls to default values
845847
include 'astero_search.defaults'
846-
ierr = 0
847-
call read1_astero_search_inlist(filename, 1, ierr)
848-
end subroutine read_astero_search_controls
849848

849+
call read_namelist(filename, read_astero_search_file, "astero_search_controls", ierr, missing_namelist_error)
850+
end subroutine read_astero_search_controls
850851

851-
recursive subroutine read1_astero_search_inlist(filename, level, ierr)
852-
character (len=*), intent(in) :: filename
853-
integer, intent(in) :: level
854-
integer, intent(out) :: ierr
852+
subroutine read_astero_search_file(unit, iostat, iomsg, extra_inlists, extra_inlists_mask)
853+
use const_def, only: strlen, max_extra_inlists
855854

856-
logical, dimension(max_extra_inlists) :: read_extra
857-
character (len=strlen) :: message
858-
character (len=strlen), dimension(max_extra_inlists) :: extra
859-
integer :: unit, i
855+
integer, intent(in) :: unit
856+
integer, intent(out) :: iostat
857+
character(len=strlen), intent(out) :: iomsg
858+
character(len=strlen), dimension(max_extra_inlists), intent(out) :: extra_inlists
859+
logical, dimension(max_extra_inlists), intent(out) :: extra_inlists_mask
860860

861-
if (level >= 10) then
862-
write(*,*) 'ERROR: too many levels of nested extra star_job inlist files'
863-
ierr = -1
864-
return
865-
end if
861+
integer :: i
866862

867-
ierr = 0
868-
unit=alloc_iounit(ierr)
869-
if (ierr /= 0) return
863+
read(unit, nml=astero_search_controls, iostat=iostat, iomsg=iomsg)
870864

871-
open(unit=unit, file=trim(filename), action='read', delim='quote', iostat=ierr)
872-
if (ierr /= 0) then
873-
write(*, *) 'Failed to open astero search inlist file ', trim(filename)
874-
else
875-
read(unit, nml=astero_search_controls, iostat=ierr)
876-
close(unit)
877-
if (ierr /= 0) then
878-
write(*, *) &
879-
'Failed while trying to read astero search inlist file ', trim(filename)
880-
write(*, '(a)') trim(message)
881-
write(*, '(a)') &
882-
'The following runtime error message might help you find the problem'
883-
write(*, *)
884-
open(unit=unit, file=trim(filename), &
885-
action='read', delim='quote', status='old', iostat=ierr)
886-
read(unit, nml=astero_search_controls)
887-
close(unit)
888-
end if
865+
if (iostat /= 0) then
866+
return
889867
end if
890-
call free_iounit(unit)
891-
if (ierr /= 0) return
892868

893-
! recursive calls to read other inlists
894869
do i=1, max_extra_inlists
895-
read_extra(i) = read_extra_astero_search_inlist(i)
896-
read_extra_astero_search_inlist(i) = .false.
897-
extra(i) = extra_astero_search_inlist_name(i)
898-
extra_astero_search_inlist_name(i) = 'undefined'
899-
900-
if (read_extra(i)) then
901-
call read1_astero_search_inlist(extra(i), level+1, ierr)
902-
if (ierr /= 0) return
903-
end if
870+
extra_inlists(i) = extra_astero_search_inlist_name(i)
871+
extra_inlists_mask(i) = read_extra_astero_search_inlist(i)
904872
end do
905873

906-
907-
end subroutine read1_astero_search_inlist
908-
874+
end subroutine read_astero_search_file
909875

910876
subroutine write_astero_search_controls(filename_in, ierr)
911877
use utils_lib
@@ -938,75 +904,40 @@ subroutine write_astero_search_controls(filename_in, ierr)
938904

939905
end subroutine write_astero_search_controls
940906

941-
942907
subroutine read_astero_pgstar_controls(filename, ierr)
908+
use utils_namelist, only: read_namelist, missing_namelist_error
943909
character (len=*), intent(in) :: filename
944910
integer, intent(out) :: ierr
945911

946912
! initialize controls to default values
947913
include 'astero_pgstar.defaults'
948914

949-
ierr = 0
950-
call read1_astero_pgstar_inlist(filename, 1, ierr)
951-
915+
call read_namelist(filename, read_astero_pgstar_file, "astero_pgstar_controls", ierr, missing_namelist_error)
952916
end subroutine read_astero_pgstar_controls
953917

918+
subroutine read_astero_pgstar_file(unit, iostat, iomsg, extra_inlists, extra_inlists_mask)
919+
use const_def, only: strlen, max_extra_inlists
954920

955-
recursive subroutine read1_astero_pgstar_inlist(filename, level, ierr)
956-
character (len=*), intent(in) :: filename
957-
integer, intent(in) :: level
958-
integer, intent(out) :: ierr
921+
integer, intent(in) :: unit
922+
integer, intent(out) :: iostat
923+
character(len=strlen), intent(out) :: iomsg
924+
character(len=strlen), dimension(max_extra_inlists), intent(out) :: extra_inlists
925+
logical, dimension(max_extra_inlists), intent(out) :: extra_inlists_mask
959926

960-
logical, dimension(max_extra_inlists) :: read_extra
961-
character (len=strlen), dimension(max_extra_inlists) :: extra
962-
integer :: unit, i
927+
integer :: i
963928

964-
if (level >= 10) then
965-
write(*,*) 'ERROR: too many levels of nested extra star_job inlist files'
966-
ierr = -1
967-
return
968-
end if
929+
read(unit, nml=astero_pgstar_controls, iostat=iostat, iomsg=iomsg)
969930

970-
ierr = 0
971-
unit=alloc_iounit(ierr)
972-
if (ierr /= 0) return
973-
974-
open(unit=unit, file=trim(filename), action='read', delim='quote', iostat=ierr)
975-
if (ierr /= 0) then
976-
write(*, *) 'Failed to open astero pgstar inlist file ', trim(filename)
977-
else
978-
read(unit, nml=astero_pgstar_controls, iostat=ierr)
979-
close(unit)
980-
if (ierr /= 0) then
981-
write(*, *) &
982-
'Failed while trying to read astero pgstar inlist file ', trim(filename)
983-
write(*, '(a)') &
984-
'The following runtime error message might help you find the problem'
985-
write(*, *)
986-
open(unit=unit, file=trim(filename), &
987-
action='read', delim='quote', status='old', iostat=ierr)
988-
read(unit, nml=astero_pgstar_controls)
989-
close(unit)
990-
end if
931+
if (iostat /= 0) then
932+
return
991933
end if
992-
call free_iounit(unit)
993-
if (ierr /= 0) return
994934

995-
! recursive calls to read other inlists
996935
do i=1, max_extra_inlists
997-
read_extra(i) = read_extra_astero_pgstar_inlist(i)
998-
read_extra_astero_pgstar_inlist(i) = .false.
999-
extra(i) = extra_astero_pgstar_inlist_name(i)
1000-
extra_astero_pgstar_inlist_name(i) = 'undefined'
1001-
1002-
if (read_extra(i)) then
1003-
call read1_astero_pgstar_inlist(extra(i), level+1, ierr)
1004-
if (ierr /= 0) return
1005-
end if
936+
extra_inlists(i) = extra_astero_pgstar_inlist_name(i)
937+
extra_inlists_mask(i) = read_extra_astero_pgstar_inlist(i)
1006938
end do
1007939

1008-
end subroutine read1_astero_pgstar_inlist
1009-
940+
end subroutine read_astero_pgstar_file
1010941

1011942
subroutine save_sample_results_to_file(i_total, results_fname, ierr)
1012943
use utils_lib

binary/private/binary_ctrls_io.f90

Lines changed: 21 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -259,88 +259,51 @@ end subroutine do_one_binary_setup
259259

260260

261261
subroutine read_binary_controls(b, filename, ierr)
262-
use utils_lib
262+
use utils_namelist, only: read_namelist, missing_namelist_error
263263
type (binary_info), pointer :: b
264264
character(*), intent(in) :: filename
265265
integer, intent(out) :: ierr
266266

267-
call read_binary_controls_file(b, filename, 1, ierr)
267+
call read_namelist(filename, read_binary_controls_file, "binary_controls", ierr, missing_namelist_error)
268+
269+
if (ierr /= 0) return
270+
271+
call store_binary_controls(b)
268272

269273
end subroutine read_binary_controls
270274

275+
subroutine read_binary_controls_file(unit, iostat, iomsg, extra_inlists, extra_inlists_mask)
276+
use const_def, only: strlen, max_extra_inlists
271277

272-
recursive subroutine read_binary_controls_file(b, filename, level, ierr)
273-
use utils_lib
274-
character(*), intent(in) :: filename
275-
type (binary_info), pointer :: b
276-
integer, intent(in) :: level
277-
integer, intent(out) :: ierr
278-
logical, dimension(max_extra_inlists) :: read_extra
279-
character (len=strlen), dimension(max_extra_inlists) :: extra
280-
integer :: unit, i
278+
integer, intent(in) :: unit
279+
integer, intent(out) :: iostat
280+
character(len=strlen), intent(out) :: iomsg
281+
character(len=strlen), dimension(max_extra_inlists), intent(out) :: extra_inlists
282+
logical, dimension(max_extra_inlists), intent(out) :: extra_inlists_mask
281283

282-
ierr = 0
284+
integer :: i
283285

284-
if (level >= 10) then
285-
write(*,*) 'ERROR: too many levels of nested extra binary controls inlist files'
286-
ierr = -1
287-
return
288-
end if
286+
read(unit, nml=binary_controls, iostat=iostat, iomsg=iomsg)
289287

290-
if (len_trim(filename) > 0) then
291-
open(newunit=unit, file=trim(filename), action='read', delim='quote', status='old', iostat=ierr)
292-
if (ierr /= 0) then
293-
write(*, *) 'Failed to open binary control namelist file ', trim(filename)
294-
return
295-
end if
296-
read(unit, nml=binary_controls, iostat=ierr)
297-
close(unit)
298-
if (ierr /= 0) then
299-
write(*, *)
300-
write(*, *)
301-
write(*, *)
302-
write(*, *)
303-
write(*, '(a)') &
304-
'Failed while trying to read binary control namelist file: ' // trim(filename)
305-
write(*, '(a)') &
306-
'Perhaps the following runtime error message will help you find the problem.'
307-
write(*, *)
308-
open(newunit=unit, file=trim(filename), action='read', delim='quote', status='old', iostat=ierr)
309-
read(unit, nml=binary_controls)
310-
close(unit)
311-
return
312-
end if
288+
if (iostat /= 0) then
289+
return
313290
end if
314291

315-
call store_binary_controls(b, ierr)
316-
317-
! recursive calls to read other inlists
318292
do i=1, max_extra_inlists
319-
read_extra(i) = read_extra_binary_controls_inlist(i)
320-
read_extra_binary_controls_inlist(i) = .false.
321-
extra(i) = extra_binary_controls_inlist_name(i)
322-
extra_binary_controls_inlist_name(i) = 'undefined'
323-
324-
if (read_extra(i)) then
325-
call read_binary_controls_file(b, extra(i), level+1, ierr)
326-
if (ierr /= 0) return
327-
end if
293+
extra_inlists(i) = extra_binary_controls_inlist_name(i)
294+
extra_inlists_mask(i) = read_extra_binary_controls_inlist(i)
328295
end do
329296

330297
end subroutine read_binary_controls_file
331298

332-
333299
subroutine set_default_binary_controls
334300
include 'binary_controls.defaults'
335301
end subroutine set_default_binary_controls
336302

337303

338-
subroutine store_binary_controls(b, ierr)
304+
subroutine store_binary_controls(b)
339305
use utils_lib, only: mkdir
340306
type (binary_info), pointer :: b
341-
integer, intent(out) :: ierr
342-
343-
ierr = 0
344307

345308
! specifications for starting model
346309
b% m1 = m1
@@ -812,7 +775,7 @@ subroutine set_binary_control(b, name, val, ierr)
812775
read(tmp, nml=binary_controls)
813776

814777
! Add to star
815-
call store_binary_controls(b, ierr)
778+
call store_binary_controls(b)
816779
if(ierr/=0) return
817780

818781
end subroutine set_binary_control

0 commit comments

Comments
 (0)