[Mesa-users] using an index I found in another array

aldanag at campus.technion.ac.il aldanag at campus.technion.ac.il
Fri Feb 23 10:18:53 EST 2018


Thank you very much for your answer,


Aldana.

________________________________
From: Rob Farmer <r.j.farmer at uva.nl>
Sent: Friday, February 23, 2018 4:42:41 PM
To: Aldana Grichener
Cc: mesa-users at lists.mesastar.org
Subject: Re: [Mesa-users] using an index I found in another array

You could just use:

m_50_new= s% m(loc)

to get the mass at the zone given by loc

if(avg_charge_H(j) .eq. 0.5d0) then
            loc=j
            exit
          end if

You can't guarantee that any zone will have exactly avg_charge_H=0.5, better to have something like

 do j=1, s% nz
         avg_charge_H(j)=star_get_profile_output(s,'avg_charge_H',j)
end do
loc =minloc(abs(avg_charge_H-0.5d0))

to find the nearest point to 0.5d0

Rob

On 23 February 2018 at 15:25, aldanag--- via Mesa-users <mesa-users at lists.mesastar.org<mailto:mesa-users at lists.mesastar.org>> wrote:

Hello,


I am trying to inject energy to a star using  the following subroutine I added to the run.star.extras:


subroutine energy_routine(id, ierr)

         use const_def, only: Rsun
         integer, intent(in) :: id
         integer, intent(out) :: ierr
         type (star_info), pointer :: s
         integer :: k
         integer :: j
         real(dp),allocatable,dimension(:) :: avg_charge_H
         real(dp), pointer :: m_old(:)
         real(dp) :: A
         integer :: loc
         real(dp) :: m_50_new
         real(dp) :: m_50_old
         real(dp) :: delta_m
         real(dp) :: E_recomb
         ierr=0
         call star_ptr(id, s, ierr)
    if (ierr /= 0) return
    if (s% star_age > 1.2275500000700004d9 .and. s% star_age < 1.2275500017700004d9) then
        allocate(avg_charge_H(1:s%nz))
         do j=1, s% nz
         avg_charge_H(j)=star_get_profile_output(s,'avg_charge_H',j)
         if(avg_charge_H(j) .eq. 0.5d0) then
            loc=j
            exit
          end if
      end do
      do k = 1, s% nz
      avg_charge_H(k)=star_get_profile_output(s,'avg_charge_H',k)
        if (avg_charge_H(k) > 0.1d0 .and. avg_charge_H(k) < 0.9d0) then
               allocate(m_old(1:s%nz))
               m_old(k) = s% M_center_old + s% q_old(k)*s% xmstar_old !gr
               m_50_new= s% m(k .eq. loc) !s% m(loc)
               !m_50_old= m_old(loc)
               delta_m= m_50_old - m_50_new
               A= 1.3d13 !13.6 ev/hydrogen mass where the energy in erg/gr
               E_recomb= s% X(loc)*delta_m*A !erg
               s% extra_heat(k) = E_recomb/ s% nz !erg/g/s
        end if
      end do
    end if
      end subroutine energy_routine

 yet the run won't compile.  The error displayed on the screen is:
                m_50_new= s% m(k .eq. loc) !s% m(loc)
                              1
Error: Array index at (1) must be of INTEGER type, found LOGICAL

I also tried adding the line in bold instead of what I wrote for m_50_new, in this case the run compiles yet I get the run time error:

Fortran runtime error: Index '-861944544' of dimension 1 of array 's%m' below lower bound of 1

So I suppose m_50_new is filled with junk instead of the value of m in the index of loc.

Is there any way to convert the logical type into integer, so I could use the mass in which avg_charge_H = 0.5 (the mass in the index loc)?

if not, is there an alternative way (maybe a built in function) in order to find the index where avg_charge_H = 0.5 and use the mass of that index in the subroutine?

Thank in advance,

Aldana.





-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.mesastar.org/pipermail/mesa-users/attachments/20180223/cb3f6f47/attachment.html>


More information about the Mesa-users mailing list