[Mesa-users] (no subject)

Warrick Ball wball at bison.ph.bham.ac.uk
Fri Dec 15 08:49:58 EST 2017


Hi everyone,

I'm collaborating on an application that will use MESA as a library to 
evaluate a *lot* of stellar models.  I'm not sure exactly how many but the 
only relevant point here is that I need to release star pointers.

We found that we couldn't make more than ten models and traced that back 
to a hardcoded maximum number of pointers on line 110 of 
`$MESA_DIR/star/public/star_def.f90` (r10108).

       integer, parameter :: max_star_handles = 10 ! this can be increased as necessary

Granted, one option is to increase this number to something more suitable 
but we are calling `free_star` from `star_lib` after each evolutionary 
run, which should be releasing star handles.  I also noticed that with 
each new model, MESA would consume another ~0.6% of my 16 GB of RAM, which 
is about 100MB (though our code uses r9793 so newer versions might behave 
better).

So I started following function calls and noticed this in `star_lib` 
(lines 65--75):

       subroutine free_star(id, ierr)
          use alloc, only: free_star_data
          ! frees the handle and all associated data
          integer, intent(in) :: id
          integer, intent(out) :: ierr

          ierr = 0
          return  ! skip this for now

          call free_star_data(id, ierr)
       end subroutine free_star

Note the line that says "skip this for now"!  The subroutine doesn't 
actually release the pointer.  Naturally, I tried commenting that line 
and running our code again but ran into an error that I haven't been able 
to debug.

I've written a small program (attached, with Makefile) that demonstrates 
the problem.  It allocates a new star pointer, creates a pre-MS model, 
then releases the pointer, twice.  If you comment out the early return 
above, the second iteration fails with the error


*** Error in `./test_free_star': double free or corruption (!prev): 0x000000000684f760 ***

Program received signal SIGABRT: Process abort signal.

Backtrace for this error:
#0  0x7f1d3786471f in ???
#1  0x7f1d3786469b in ???
#2  0x7f1d378663b0 in ???
#3  0x7f1d378aea86 in ???
#4  0x7f1d378b5e8d in ???
#5  0x7f1d378b7988 in ???
#6  0x7f1d378c02ed in ???
#7  0x7968b1 in __net_def_MOD_do_free_net
 	at ../public/net_def.f90:384
#8  0x49710b in __net_MOD_set_net
 	at ../private/net.f90:639
#9  0x560b9f in model_builder
 	at ../private/init.f90:1191
#10  0x561434 in __init_MOD_create_pre_ms_model
 	at ../private/init.f90:1014
#11  0x418448 in __star_lib_MOD_star_create_pre_ms_model
 	at ../public/star_lib.f90:378
#12  0x414971 in ???
#13  0x414a83 in ???
#14  0x7f1d3784e039 in ???
#15  0x414489 in ???
#16  0xffffffffffffffff in ???
Aborted (core dumped)


I've looked at the listed functions but can't see that there's a problem. 
The error crops up at the start of the pre-MS subroutine, where it sets 
the nuclear reaction network (`set_net`).  That checks if there's 
currently a net and, if not, releases the existing one (`do_free_net`). 
But that then crashes, apparently, as far as I can tell, because of g% 
net_iso.  From `$MESA_DIR/net/public/net_def.f90`, lines 383--386:

             if (associated(g% net_iso)) then
                deallocate(g% net_iso)
                   nullify(g% net_iso)
             end if

I think these are the guilty lines because I sprinkled `write` statements 
everywhere and then tried moving this up and down the sequence of 
`deallocate` statements.

The only guidance I can find online is that something appears to be 
corrupting the array structure, possibly by going out of bounds but I have 
no idea how to track this down in the code.  One option appears to be to 
call `deallocate` with an error integer, in which case the code won't 
crash and I can maybe just ignore the error.  But I'm a bit far beyond the 
limits of my knowledge/debugging skills and would appreciate any advice 
anyone can offer.

Thanks,
Warrick


------------
Warrick Ball
Postdoc, School of Physics and Astronomy
University of Birmingham, Edgbaston, Birmingham B15 2TT
wball at bison.ph.bham.ac.uk
+44 (0)121 414 4552
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: test_free_star.f90
URL: <https://lists.mesastar.org/pipermail/mesa-users/attachments/20171215/2963d8fd/attachment.ksh>
-------------- next part --------------
FC=gfortran

#MODPATH = ${MESA_DIR}/include ${MESASDK_ROOT}/include # ${GYRE_DIR}/src/build
INCLUDE = -I${MESA_DIR}/include -I${MESASDK_ROOT}/include # ${GYRE_DIR}/src/build
MESA_LIB_DIR = $(MESA_DIR)/lib
LOAD_PGPLOT = `mesasdk_pgplot_link`
LOAD_LAPACK = `mesasdk_lapack_link`
LOAD_BLAS = `mesasdk_blas_link`
LOAD_HDF5 = `mesasdk_hdf5_link`
LOAD_CRLIBM = -lcrlibm
LOAD_MATRIX = -lf2crlibm $(LOAD_CRLIBM) -lmtx -lconst -lutils $(LOAD_LAPACK) $(LOAD_BLAS) # -lmesaklu
LOAD_MESA_NUMERICS = -linterp_2d -linterp_1d -lnum $(LOAD_MATRIX) $(LOAD_HDF5)
LOAD_MESA_MICRO = -lnet -leos -lkap -lrates -lneu -lchem $(LOAD_MESA_NUMERICS)
LOAD_MESA_MACRO = -lionization -latm -lcolors -lmlt $(LOAD_MESA_MICRO)
LOAD_MESA_STAR_SUPPORT = $(LOAD_MESA_MACRO)
LOAD_STAR_MODS = -lstar $(LOAD_MESA_STAR_SUPPORT)
STAR_LOAD_LIST = $(LOAD_STAR_MODS) $(LOAD_PGPLOT) $(LOAD_SE)
LOAD_MESA_STAR = -L$(MESA_LIB_DIR) $(STAR_LOAD_LIST)
LDFLAGS = ${LOAD_MESA_STAR} -lz

vpath %.mod ${MODPATH}

test_free_star: test_free_star.f90
	$(FC) -o test_free_star test_free_star.f90 $(LDFLAGS) $(INCLUDE) -fopenmp

.PHONY: clean

clean:
	rm -f test_free_star


More information about the Mesa-users mailing list