! *********************************************************************** ! ! Copyright (C) 2010 Bill Paxton ! ! this file is part of mesa. ! ! mesa is free software; you can redistribute it and/or modify ! it under the terms of the gnu general library public license as published ! by the free software foundation; either version 2 of the license, or ! (at your option) any later version. ! ! mesa is distributed in the hope that it will be useful, ! but without any warranty; without even the implied warranty of ! merchantability or fitness for a particular purpose. see the ! gnu library general public license for more details. ! ! you should have received a copy of the gnu library general public license ! along with this software; if not, write to the free software ! foundation, inc., 59 temple place, suite 330, boston, ma 02111-1307 usa ! ! *********************************************************************** module run_star_extras use star_lib use star_def use const_def implicit none double precision :: lhinterpulse = 0. !parameter save logical :: gotmaxlh = .false. double precision :: prev_h_boundary_mass = 0. !parameter save double precision :: h_boundary_mass_min logical :: mark_TP = .true. ! these routines are called by the standard run_star check_model contains !include 'standard_run_star_extras.dek' subroutine extras_controls(s, ierr) type (star_info), pointer :: s integer, intent(out) :: ierr ierr = 0 end subroutine extras_controls integer function extras_startup(s, id, restart, ierr) type (star_info), pointer :: s integer, intent(in) :: id logical, intent(in) :: restart integer, intent(out) :: ierr ierr = 0 extras_startup = 0 if (.not. restart) then call alloc_extra_info(s) else ! it is a restart call unpack_extra_info(s) end if end function extras_startup ! returns either keep_going, retry, backup, or terminate. integer function extras_check_model(s, id, id_extra) type (star_info), pointer :: s integer, intent(in) :: id, id_extra extras_check_model = keep_going if (.false. .and. s% star_mass_h1 < 0.35d0) then ! stop when star hydrogen mass drops to specified level extras_check_model = terminate write(*, *) 'have reached desired hydrogen mass' return end if write(*,*) 'TP_state:',s% TP_state,s% TP_count,s% & overshoot_below_burn_h_factor if ((s% h1_boundary_mass < s% he4_boundary_mass + 0.1d0) & .and. (s% he4_boundary_mass .gt. 0 )) then !get max power_h_burn during intepulse phase if ((s% TP_state .eq. 0) .and. & (lhinterpulse < s% power_h_burn) .and. & ( gotmaxlh .eq. .false.)) then write(*,*) 'ritter,increase gotmaxlh' lhinterpulse=s% power_h_burn end if !if h burning during interpulse phase ends, !(max power_h_burn found) if ((s% TP_state .eq. 1) .and. (s% have_done_TP .eq. .true.) & .and. (gotmaxlh .eq. .false.) ) then gotmaxlh = .true. write(*,*) 'ritter, max value gotmaxlh reached', & lhinterpulse end if !begin of TP_state 2 if ((s% have_done_TP .eq. .true.) .and. & (gotmaxlh .eq. .true.) .and. & ( .not.(s% overshoot_below_burn_h_factor .eq. 0.143)) & .and. (s% TP_state .eq. 2) .and. & (mark_TP .eq. .true.)) then h_boundary_mass_min = s% h1_boundary_mass mark_TP = .false. end if !Condition for start of HDUP, L_H is larger or equal to 10% !of max L_H, and DUP state !of latest interpulse, set overshoot f to small values if ((s% have_done_TP .eq. .true.) .and. & (gotmaxlh .eq. .true.) .and. & ( .not.(s% overshoot_below_burn_h_factor .eq. 0.143)) .and. & (s% TP_state .eq. 2).and. & (s% h1_boundary_mass s% h1_boundary_mass) then h_boundary_mass_min = s% h1_boundary_mass write(*,*) 'h_boundary_mass_min reduced'& ,h_boundary_mass_min end if if ((0.1*lhinterpulse .le. s% power_h_burn) .and. & (h_boundary_mass_min .eq. s% h1_boundary_mass)) then s% overshoot_below_burn_h_factor=0.143 !0.286 s% overshoot_below_noburn_factor=0.143 !0.286 write(*,*) 'HDUP occurs, new overshoot factor from now on' write(*,*) 0.1*lhinterpulse,"<=",s%power_h_burn write(*,*) s% h1_boundary_mass,"<", prev_h_boundary_mass end if end if !set values for new search for max power_h_burn if ((s% TP_state .eq. 0) .and. (s% have_done_TP .eq. .true.) .and. & (gotmaxlh .eq. .true. )) then write(*,*) 'ritter,interpulse phase starts' gotmaxlh = .false. lhinterpulse=0. mark_TP= .true. end if end if !for DUP indentification prev_h_boundary_mass=s% h1_boundary_mass end function extras_check_model integer function how_many_extra_log_columns(s, id, id_extra) type (star_info), pointer :: s integer, intent(in) :: id, id_extra how_many_extra_log_columns = 0 end function how_many_extra_log_columns subroutine data_for_extra_log_columns(s, id, id_extra, n, names, vals, ierr) type (star_info), pointer :: s integer, intent(in) :: id, id_extra, n character (len=maxlen_log_column_name) :: names(n) real*8 :: vals(n) integer, intent(out) :: ierr ierr = 0 end subroutine data_for_extra_log_columns integer function how_many_extra_profile_columns(s, id, id_extra) type (star_info), pointer :: s integer, intent(in) :: id, id_extra how_many_extra_profile_columns = 0 end function how_many_extra_profile_columns subroutine data_for_extra_profile_columns(s, id, id_extra, n, nz, names, vals, ierr) type (star_info), pointer :: s integer, intent(in) :: id, id_extra, n, nz character (len=maxlen_profile_column_name) :: names(n) real*8 :: vals(nz,n) integer, intent(out) :: ierr integer :: k ierr = 0 ! here is an example for adding a profile column !if (n /= 1) stop 'data_for_extra_profile_columns' !names(1) = 'beta' !do k = 1, nz ! vals(k,1) = s% Pgas(k)/s% P(k) !end do end subroutine data_for_extra_profile_columns ! returns either keep_going or terminate. ! note: cannot request retry or backup; extras_check_model can do that. integer function extras_finish_step(s, id, id_extra) type (star_info), pointer :: s integer, intent(in) :: id, id_extra integer :: ierr extras_finish_step = keep_going call store_extra_info(s) ! to save a profile, ! s% need_to_save_profiles_now = .true. ! to update the star log, ! s% need_to_update_logfile_now = .true. end function extras_finish_step subroutine extras_after_evolve(s, id, id_extra, ierr) type (star_info), pointer :: s integer, intent(in) :: id, id_extra integer, intent(out) :: ierr ierr = 0 end subroutine extras_after_evolve ! routines for saving and restoring extra data so can do restarts ! put these defs at the top and delete from the following routines !integer, parameter :: extra_info_alloc = 1 !integer, parameter :: extra_info_get = 2 !integer, parameter :: extra_info_put = 3 subroutine alloc_extra_info(s) integer, parameter :: extra_info_alloc = 1 type (star_info), pointer :: s call move_extra_info(s,extra_info_alloc) end subroutine alloc_extra_info subroutine unpack_extra_info(s) integer, parameter :: extra_info_get = 2 type (star_info), pointer :: s call move_extra_info(s,extra_info_get) end subroutine unpack_extra_info subroutine store_extra_info(s) integer, parameter :: extra_info_put = 3 type (star_info), pointer :: s call move_extra_info(s,extra_info_put) end subroutine store_extra_info subroutine move_extra_info(s,op) integer, parameter :: extra_info_alloc = 1 integer, parameter :: extra_info_get = 2 integer, parameter :: extra_info_put = 3 type (star_info), pointer :: s integer, intent(in) :: op integer :: i, j, num_ints, num_dbls, ierr i = 0 ! call move_int or move_flg num_ints = i i = 0 ! call move_dbl num_dbls = i if (op /= extra_info_alloc) return if (num_ints == 0 .and. num_dbls == 0) return ierr = 0 call star_alloc_extras(s% id, num_ints, num_dbls, ierr) if (ierr /= 0) then write(*,*) 'failed in star_alloc_extras' write(*,*) 'alloc_extras num_ints', num_ints write(*,*) 'alloc_extras num_dbls', num_dbls stop 1 end if contains subroutine move_dbl(dbl) real*8 :: dbl i = i+1 select case (op) case (extra_info_get) dbl = s% extra_work(i) case (extra_info_put) s% extra_work(i) = dbl end select end subroutine move_dbl subroutine move_int(int) integer :: int i = i+1 select case (op) case (extra_info_get) int = s% extra_iwork(i) case (extra_info_put) s% extra_iwork(i) = int end select end subroutine move_int subroutine move_flg(flg) logical :: flg i = i+1 select case (op) case (extra_info_get) flg = (s% extra_iwork(i) /= 0) case (extra_info_put) if (flg) then s% extra_iwork(i) = 1 else s% extra_iwork(i) = 0 end if end select end subroutine move_flg end subroutine move_extra_info end module run_star_extras